23#include "config_components.h"
35 DXVA_PicParams_H264
pp;
52 DXVA_PicParams_H264 *pp)
60 memset(pp, 0,
sizeof(*pp));
62 pp->UsedForReferenceFlags = 0;
63 pp->NonExistingFrameFlags = 0;
66 if (j < h->short_ref_count) {
67 r =
h->short_ref[j++];
70 while (!
r && j < h->short_ref_count + 16)
71 r =
h->long_ref[j++ -
h->short_ref_count];
79 pp->FieldOrderCntList[
i][0] =
r->field_poc[0];
81 pp->FieldOrderCntList[
i][1] =
r->field_poc[1];
83 pp->FrameNumList[
i] =
r->long_ref ?
r->pic_id :
r->frame_num;
85 pp->UsedForReferenceFlags |= 1 << (2*
i + 0);
87 pp->UsedForReferenceFlags |= 1 << (2*
i + 1);
89 pp->RefFrameList[
i].bPicEntry = 0xff;
90 pp->FieldOrderCntList[
i][0] = 0;
91 pp->FieldOrderCntList[
i][1] = 0;
92 pp->FrameNumList[
i] = 0;
100 pp->wFrameWidthInMbsMinus1 =
h->mb_width - 1;
101 pp->wFrameHeightInMbsMinus1 =
h->mb_height - 1;
102 pp->num_ref_frames =
sps->ref_frame_count;
104 pp->wBitFields = ((
h->picture_structure !=
PICT_FRAME) << 0) |
107 (
sps->residual_color_transform_flag << 2) |
110 (
sps->chroma_format_idc << 4) |
111 ((
h->nal_ref_idc != 0) << 6) |
112 (
pps->constrained_intra_pred << 7) |
113 (
pps->weighted_pred << 8) |
114 (
pps->weighted_bipred_idc << 9) |
117 (
sps->frame_mbs_only_flag << 12) |
118 (
pps->transform_8x8_mode << 13) |
119 ((
sps->level_idc >= 31) << 14) |
124 pp->bit_depth_luma_minus8 =
sps->bit_depth_luma - 8;
125 pp->bit_depth_chroma_minus8 =
sps->bit_depth_chroma - 8;
127 pp->Reserved16Bits = 0;
129 pp->Reserved16Bits = 0x34c;
131 pp->Reserved16Bits = 3;
133 pp->CurrFieldOrderCnt[0] = 0;
135 current_picture->
field_poc[0] != INT_MAX)
136 pp->CurrFieldOrderCnt[0] = current_picture->
field_poc[0];
137 pp->CurrFieldOrderCnt[1] = 0;
139 current_picture->
field_poc[1] != INT_MAX)
140 pp->CurrFieldOrderCnt[1] = current_picture->
field_poc[1];
141 pp->pic_init_qs_minus26 =
pps->init_qs - 26;
142 pp->chroma_qp_index_offset =
pps->chroma_qp_index_offset[0];
143 pp->second_chroma_qp_index_offset =
pps->chroma_qp_index_offset[1];
144 pp->ContinuationFlag = 1;
145 pp->pic_init_qp_minus26 =
pps->init_qp - 26;
146 pp->num_ref_idx_l0_active_minus1 =
pps->ref_count[0] - 1;
147 pp->num_ref_idx_l1_active_minus1 =
pps->ref_count[1] - 1;
148 pp->Reserved8BitsA = 0;
149 pp->frame_num =
h->poc.frame_num;
150 pp->log2_max_frame_num_minus4 =
sps->log2_max_frame_num - 4;
151 pp->pic_order_cnt_type =
sps->poc_type;
152 if (
sps->poc_type == 0)
153 pp->log2_max_pic_order_cnt_lsb_minus4 =
sps->log2_max_poc_lsb - 4;
154 else if (
sps->poc_type == 1)
155 pp->delta_pic_order_always_zero_flag =
sps->delta_pic_order_always_zero_flag;
156 pp->direct_8x8_inference_flag =
sps->direct_8x8_inference_flag;
157 pp->entropy_coding_mode_flag =
pps->cabac;
158 pp->pic_order_present_flag =
pps->pic_order_present;
159 pp->num_slice_groups_minus1 =
pps->slice_group_count - 1;
160 pp->slice_group_map_type =
pps->mb_slice_group_map_type;
161 pp->deblocking_filter_control_present_flag =
pps->deblocking_filter_parameters_present;
162 pp->redundant_pic_cnt_present_flag=
pps->redundant_pic_cnt_present;
163 pp->Reserved8BitsB = 0;
164 pp->slice_group_change_rate_minus1= 0;
173 memset(qm, 0,
sizeof(*qm));
175 for (
i = 0;
i < 6;
i++)
176 for (j = 0; j < 16; j++)
177 qm->bScalingLists4x4[
i][j] =
pps->scaling_matrix4[
i][j];
179 for (
i = 0;
i < 64;
i++) {
180 qm->bScalingLists8x8[0][
i] =
pps->scaling_matrix8[0][
i];
181 qm->bScalingLists8x8[1][
i] =
pps->scaling_matrix8[3][
i];
184 for (
i = 0;
i < 6;
i++)
185 for (j = 0; j < 16; j++)
188 for (
i = 0;
i < 64;
i++) {
203 unsigned position,
unsigned size)
205 memset(slice, 0,
sizeof(*slice));
206 slice->BSNALunitDataLocation = position;
207 slice->SliceBytesInBuffer =
size;
208 slice->wBadSliceChopping = 0;
215 if ((pp->RefFrameList[
i].bPicEntry & 0x7f) == surface_index)
222 const DXVA_PicParams_H264 *pp,
unsigned position,
unsigned size)
229 memset(slice, 0,
sizeof(*slice));
230 slice->BSNALunitDataLocation = position;
231 slice->SliceBytesInBuffer =
size;
232 slice->wBadSliceChopping = 0;
235 slice->NumMbsForSlice = 0;
239 slice->slice_type += 5;
243 slice->num_ref_idx_l0_active_minus1 = sl->
ref_count[0] - 1;
245 slice->num_ref_idx_l1_active_minus1 = sl->
ref_count[1] - 1;
248 slice->Reserved8Bits = 0;
250 for (list = 0; list < 2; list++) {
253 if (list < sl->list_count &&
i < sl->ref_count[list]) {
263 for (plane = 0; plane < 3; plane++) {
276 slice->Weights[list][
i][plane][0] =
w;
277 slice->Weights[list][
i][plane][1] = o;
281 slice->RefPicList[list][
i].bPicEntry = 0xff;
282 for (plane = 0; plane < 3; plane++) {
283 slice->Weights[list][
i][plane][0] = 0;
284 slice->Weights[list][
i][plane][1] = 0;
289 slice->slice_qs_delta = 0;
290 slice->slice_qp_delta = sl->
qscale -
h->ps.pps->init_qp;
299 slice->slice_id =
h->current_slice - 1;
307 const unsigned mb_count =
h->mb_width *
h->mb_height;
312 void *dxva_data_ptr =
NULL;
313 uint8_t *dxva_data, *
current, *end;
314 unsigned dxva_size = 0;
324 type = D3D11_VIDEO_DECODER_BUFFER_BITSTREAM;
328 &dxva_size, &dxva_data_ptr)))
334 type = DXVA2_BitStreamDateBufferType;
337 &dxva_data_ptr, &dxva_size)))
342 dxva_data = dxva_data_ptr;
344 end = dxva_data + dxva_size;
347 static const uint8_t
start_code[] = { 0, 0, 1 };
348 static const unsigned start_code_size =
sizeof(
start_code);
349 unsigned position,
size;
351 av_assert0(offsetof(DXVA_Slice_H264_Short, BSNALunitDataLocation) ==
352 offsetof(DXVA_Slice_H264_Long, BSNALunitDataLocation));
353 av_assert0(offsetof(DXVA_Slice_H264_Short, SliceBytesInBuffer) ==
354 offsetof(DXVA_Slice_H264_Long, SliceBytesInBuffer));
361 position =
slice->BSNALunitDataLocation;
369 slice->SliceBytesInBuffer = start_code_size +
size;
387 if (
slice && padding > 0) {
391 slice->SliceBytesInBuffer += padding;
408 D3D11_VIDEO_DECODER_BUFFER_DESC *dsc11 = bs;
409 memset(dsc11, 0,
sizeof(*dsc11));
410 dsc11->BufferType =
type;
411 dsc11->DataSize =
current - dxva_data;
412 dsc11->NumMBsInBuffer = mb_count;
414 type = D3D11_VIDEO_DECODER_BUFFER_SLICE_CONTROL;
421 DXVA2_DecodeBufferDesc *dsc2 = bs;
422 memset(dsc2, 0,
sizeof(*dsc2));
423 dsc2->CompressedBufferType =
type;
424 dsc2->DataSize =
current - dxva_data;
425 dsc2->NumMBsInBuffer = mb_count;
427 type = DXVA2_SliceControlBufferType;
442 slice_data, slice_size, mb_count);
495 &ctx_pic->
pp, position,
size);
499 ctx_pic->
pp.wBitFields &= ~(1 << 15);
508 h->cur_pic_ptr->hwaccel_picture_private;
514 &ctx_pic->
pp,
sizeof(ctx_pic->
pp),
515 &ctx_pic->
qm,
sizeof(ctx_pic->
qm),
522#if CONFIG_H264_DXVA2_HWACCEL
524 .p.name =
"h264_dxva2",
539#if CONFIG_H264_D3D11VA_HWACCEL
541 .p.name =
"h264_d3d11va",
556#if CONFIG_H264_D3D11VA2_HWACCEL
558 .p.name =
"h264_d3d11va2",
static AVFormatContext * ctx
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define i(width, name, range_min, range_max)
static int FUNC sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
int ff_dxva2_is_d3d11(const AVCodecContext *avctx)
unsigned ff_dxva2_get_surface_index(const AVCodecContext *avctx, AVDXVAContext *ctx, const AVFrame *frame, int curr)
int ff_dxva2_decode_init(AVCodecContext *avctx)
int ff_dxva2_commit_buffer(AVCodecContext *avctx, AVDXVAContext *ctx, DECODER_BUFFER_DESC *dsc, unsigned type, const void *data, unsigned size, unsigned mb_count)
int ff_dxva2_decode_uninit(AVCodecContext *avctx)
int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame, const void *pp, unsigned pp_size, const void *qm, unsigned qm_size, int(*commit_bs_si)(AVCodecContext *, DECODER_BUFFER_DESC *bs, DECODER_BUFFER_DESC *slice))
int ff_dxva2_common_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx, DECODER_BUFFER_DESC *bs, DECODER_BUFFER_DESC *sc)
void ff_dxva2_h264_fill_scaling_lists(const AVCodecContext *avctx, AVDXVAContext *ctx, DXVA_Qmatrix_H264 *qm)
static int is_slice_short(const AVCodecContext *avctx, AVDXVAContext *ctx)
static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx, DECODER_BUFFER_DESC *bs, DECODER_BUFFER_DESC *sc)
static void fill_slice_short(DXVA_Slice_H264_Short *slice, unsigned position, unsigned size)
static void fill_picture_entry(DXVA_PicEntry_H264 *pic, unsigned index, unsigned flag)
static int get_refpic_index(const DXVA_PicParams_H264 *pp, int surface_index)
static int dxva2_h264_start_frame(AVCodecContext *avctx, av_unused const AVBufferRef *buffer_ref, av_unused const uint8_t *buffer, av_unused uint32_t size)
void ff_dxva2_h264_fill_picture_parameters(const AVCodecContext *avctx, AVDXVAContext *ctx, DXVA_PicParams_H264 *pp)
static int dxva2_h264_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
static int dxva2_h264_end_frame(AVCodecContext *avctx)
static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice, const DXVA_PicParams_H264 *pp, unsigned position, unsigned size)
#define DXVA_CONTEXT(avctx)
#define DXVA_CONTEXT_CFG_BITSTREAM(avctx, ctx)
#define DXVA2_CONTEXT(ctx)
#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO
Work around for DXVA2/Direct3D11 and old Intel GPUs with ClearVideo interface.
#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG
Work around for DXVA2/Direct3D11 and old UVD/UVD+ ATI video cards.
#define D3D11VA_CONTEXT(ctx)
#define DXVA_CONTEXT_REPORT_ID(avctx, ctx)
#define DXVA_CONTEXT_WORKAROUND(avctx, ctx)
#define DXVA_CONTEXT_VALID(avctx, ctx)
static struct @111144215057303131116103221376075045141373005341 current
static int get_bits_count(const GetBitContext *s)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
@ AV_PICTURE_TYPE_I
Intra.
@ AV_PICTURE_TYPE_SI
Switching Intra.
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
H.264 parameter set handling.
int ff_h264_get_slice_type(const H264SliceContext *sl)
Reconstruct bitstream slice_type.
H.264 / AVC / MPEG-4 part10 codec.
#define FIELD_OR_MBAFF_PICTURE(h)
const struct FFHWAccel ff_h264_d3d11va2_hwaccel
const struct FFHWAccel ff_h264_d3d11va_hwaccel
const struct FFHWAccel ff_h264_dxva2_hwaccel
static const chunk_decoder decoder[8]
void ff_h264_draw_horiz_band(const H264Context *h, H264SliceContext *sl, int y, int height)
const uint8_t ff_zigzag_direct[64]
const uint8_t ff_zigzag_scan[16+1]
#define PICT_BOTTOM_FIELD
@ AV_PIX_FMT_DXVA2_VLD
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer.
@ AV_PIX_FMT_D3D11
Hardware surfaces for Direct3D11.
@ AV_PIX_FMT_D3D11VA_VLD
HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView p...
#define FF_ARRAY_ELEMS(a)
A reference to a data buffer.
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
void * hwaccel_picture_private
RefStruct reference for hardware accelerator private data.
int field_poc[2]
top/bottom POC
int chroma_log2_weight_denom
int luma_log2_weight_denom
int luma_weight[48][2][2]
int chroma_weight_flag[2]
7.4.3.2 chroma_weight_lX_flag
int luma_weight_flag[2]
7.4.3.2 luma_weight_lX_flag
int chroma_weight[48][2][2][2]
const H264Picture * parent
int deblocking_filter
disable_deblocking_filter_idc with 1 <-> 0
H264Ref ref_list[2][48]
0..15: frame refs, 16..47: mbaff field refs.
int direct_spatial_mv_pred
int slice_alpha_c0_offset
unsigned int ref_count[2]
num_ref_idx_l0/1_active_minus1 + 1
DXVA_SliceInfo slice[MAX_SLICES]
const uint8_t * bitstream
DXVA_Slice_H264_Long slice_long[MAX_SLICES]
DXVA_Slice_H264_Short slice_short[MAX_SLICES]