23 #include "config_components.h"
35 DXVA_PicParams_H264
pp;
52 DXVA_PicParams_H264 *pp)
59 memset(pp, 0,
sizeof(*pp));
65 pp->UsedForReferenceFlags = 0;
66 pp->NonExistingFrameFlags = 0;
69 if (j < h->short_ref_count) {
70 r =
h->short_ref[j++];
73 while (!
r && j < h->short_ref_count + 16)
74 r =
h->long_ref[j++ -
h->short_ref_count];
82 pp->FieldOrderCntList[
i][0] =
r->field_poc[0];
84 pp->FieldOrderCntList[
i][1] =
r->field_poc[1];
86 pp->FrameNumList[
i] =
r->long_ref ?
r->pic_id :
r->frame_num;
88 pp->UsedForReferenceFlags |= 1 << (2*
i + 0);
90 pp->UsedForReferenceFlags |= 1 << (2*
i + 1);
92 pp->RefFrameList[
i].bPicEntry = 0xff;
93 pp->FieldOrderCntList[
i][0] = 0;
94 pp->FieldOrderCntList[
i][1] = 0;
95 pp->FrameNumList[
i] = 0;
99 pp->wFrameWidthInMbsMinus1 =
h->mb_width - 1;
100 pp->wFrameHeightInMbsMinus1 =
h->mb_height - 1;
101 pp->num_ref_frames =
sps->ref_frame_count;
103 pp->wBitFields = ((
h->picture_structure !=
PICT_FRAME) << 0) |
106 (
sps->residual_color_transform_flag << 2) |
109 (
sps->chroma_format_idc << 4) |
110 ((
h->nal_ref_idc != 0) << 6) |
111 (
pps->constrained_intra_pred << 7) |
112 (
pps->weighted_pred << 8) |
113 (
pps->weighted_bipred_idc << 9) |
116 (
sps->frame_mbs_only_flag << 12) |
117 (
pps->transform_8x8_mode << 13) |
118 ((
sps->level_idc >= 31) << 14) |
123 pp->bit_depth_luma_minus8 =
sps->bit_depth_luma - 8;
124 pp->bit_depth_chroma_minus8 =
sps->bit_depth_chroma - 8;
126 pp->Reserved16Bits = 0;
128 pp->Reserved16Bits = 0x34c;
130 pp->Reserved16Bits = 3;
131 pp->StatusReportFeedbackNumber = 1 + DXVA_CONTEXT_REPORT_ID(avctx,
ctx)++;
132 pp->CurrFieldOrderCnt[0] = 0;
134 current_picture->
field_poc[0] != INT_MAX)
135 pp->CurrFieldOrderCnt[0] = current_picture->
field_poc[0];
136 pp->CurrFieldOrderCnt[1] = 0;
138 current_picture->
field_poc[1] != INT_MAX)
139 pp->CurrFieldOrderCnt[1] = current_picture->
field_poc[1];
140 pp->pic_init_qs_minus26 =
pps->init_qs - 26;
141 pp->chroma_qp_index_offset =
pps->chroma_qp_index_offset[0];
142 pp->second_chroma_qp_index_offset =
pps->chroma_qp_index_offset[1];
143 pp->ContinuationFlag = 1;
144 pp->pic_init_qp_minus26 =
pps->init_qp - 26;
145 pp->num_ref_idx_l0_active_minus1 =
pps->ref_count[0] - 1;
146 pp->num_ref_idx_l1_active_minus1 =
pps->ref_count[1] - 1;
147 pp->Reserved8BitsA = 0;
148 pp->frame_num =
h->poc.frame_num;
149 pp->log2_max_frame_num_minus4 =
sps->log2_max_frame_num - 4;
150 pp->pic_order_cnt_type =
sps->poc_type;
151 if (
sps->poc_type == 0)
152 pp->log2_max_pic_order_cnt_lsb_minus4 =
sps->log2_max_poc_lsb - 4;
153 else if (
sps->poc_type == 1)
154 pp->delta_pic_order_always_zero_flag =
sps->delta_pic_order_always_zero_flag;
155 pp->direct_8x8_inference_flag =
sps->direct_8x8_inference_flag;
156 pp->entropy_coding_mode_flag =
pps->cabac;
157 pp->pic_order_present_flag =
pps->pic_order_present;
158 pp->num_slice_groups_minus1 =
pps->slice_group_count - 1;
159 pp->slice_group_map_type =
pps->mb_slice_group_map_type;
160 pp->deblocking_filter_control_present_flag =
pps->deblocking_filter_parameters_present;
161 pp->redundant_pic_cnt_present_flag=
pps->redundant_pic_cnt_present;
162 pp->Reserved8BitsB = 0;
163 pp->slice_group_change_rate_minus1= 0;
171 memset(qm, 0,
sizeof(*qm));
173 for (
i = 0;
i < 6;
i++)
174 for (j = 0; j < 16; j++)
175 qm->bScalingLists4x4[
i][j] =
pps->scaling_matrix4[
i][j];
177 for (
i = 0;
i < 64;
i++) {
178 qm->bScalingLists8x8[0][
i] =
pps->scaling_matrix8[0][
i];
179 qm->bScalingLists8x8[1][
i] =
pps->scaling_matrix8[3][
i];
182 for (
i = 0;
i < 6;
i++)
183 for (j = 0; j < 16; j++)
186 for (
i = 0;
i < 64;
i++) {
195 assert(DXVA_CONTEXT_CFG_BITSTREAM(avctx,
ctx) == 1 ||
196 DXVA_CONTEXT_CFG_BITSTREAM(avctx,
ctx) == 2);
197 return DXVA_CONTEXT_CFG_BITSTREAM(avctx,
ctx) == 2;
201 unsigned position,
unsigned size)
203 memset(slice, 0,
sizeof(*slice));
204 slice->BSNALunitDataLocation = position;
205 slice->SliceBytesInBuffer =
size;
206 slice->wBadSliceChopping = 0;
213 if ((pp->RefFrameList[
i].bPicEntry & 0x7f) == surface_index)
220 const DXVA_PicParams_H264 *pp,
unsigned position,
unsigned size)
227 memset(slice, 0,
sizeof(*slice));
228 slice->BSNALunitDataLocation = position;
229 slice->SliceBytesInBuffer =
size;
230 slice->wBadSliceChopping = 0;
233 slice->NumMbsForSlice = 0;
237 slice->slice_type += 5;
241 slice->num_ref_idx_l0_active_minus1 = sl->
ref_count[0] - 1;
243 slice->num_ref_idx_l1_active_minus1 = sl->
ref_count[1] - 1;
246 slice->Reserved8Bits = 0;
251 if (list < sl->list_count && i < sl->ref_count[
list]) {
261 for (plane = 0; plane < 3; plane++) {
274 slice->Weights[
list][
i][plane][0] =
w;
275 slice->Weights[
list][
i][plane][1] = o;
279 slice->RefPicList[
list][
i].bPicEntry = 0xff;
280 for (plane = 0; plane < 3; plane++) {
281 slice->Weights[
list][
i][plane][0] = 0;
282 slice->Weights[
list][
i][plane][1] = 0;
287 slice->slice_qs_delta = 0;
288 slice->slice_qp_delta = sl->
qscale -
h->ps.pps->init_qp;
297 slice->slice_id =
h->current_slice - 1;
305 const unsigned mb_count =
h->mb_width *
h->mb_height;
310 void *dxva_data_ptr =
NULL;
311 uint8_t *dxva_data, *current, *end;
312 unsigned dxva_size = 0;
322 type = D3D11_VIDEO_DECODER_BUFFER_BITSTREAM;
326 &dxva_size, &dxva_data_ptr)))
332 type = DXVA2_BitStreamDateBufferType;
335 &dxva_data_ptr, &dxva_size)))
340 dxva_data = dxva_data_ptr;
342 end = dxva_data + dxva_size;
345 static const uint8_t
start_code[] = { 0, 0, 1 };
346 static const unsigned start_code_size =
sizeof(
start_code);
347 unsigned position,
size;
349 assert(offsetof(DXVA_Slice_H264_Short, BSNALunitDataLocation) ==
350 offsetof(DXVA_Slice_H264_Long, BSNALunitDataLocation));
351 assert(offsetof(DXVA_Slice_H264_Short, SliceBytesInBuffer) ==
352 offsetof(DXVA_Slice_H264_Long, SliceBytesInBuffer));
359 position =
slice->BSNALunitDataLocation;
361 if (start_code_size +
size > end - current) {
366 slice->BSNALunitDataLocation = current - dxva_data;
367 slice->SliceBytesInBuffer = start_code_size +
size;
379 current += start_code_size;
384 padding =
FFMIN(128 - ((current - dxva_data) & 127), end - current);
385 if (
slice && padding > 0) {
386 memset(current, 0, padding);
389 slice->SliceBytesInBuffer += padding;
406 D3D11_VIDEO_DECODER_BUFFER_DESC *dsc11 = bs;
407 memset(dsc11, 0,
sizeof(*dsc11));
408 dsc11->BufferType =
type;
409 dsc11->DataSize = current - dxva_data;
410 dsc11->NumMBsInBuffer = mb_count;
412 type = D3D11_VIDEO_DECODER_BUFFER_SLICE_CONTROL;
419 DXVA2_DecodeBufferDesc *dsc2 = bs;
420 memset(dsc2, 0,
sizeof(*dsc2));
421 dsc2->CompressedBufferType =
type;
422 dsc2->DataSize = current - dxva_data;
423 dsc2->NumMBsInBuffer = mb_count;
425 type = DXVA2_SliceControlBufferType;
440 slice_data, slice_size, mb_count);
452 if (!DXVA_CONTEXT_VALID(avctx,
ctx))
492 &ctx_pic->
pp, position,
size);
496 ctx_pic->
pp.wBitFields &= ~(1 << 15);
505 h->cur_pic_ptr->hwaccel_picture_private;
511 &ctx_pic->
pp,
sizeof(ctx_pic->
pp),
512 &ctx_pic->
qm,
sizeof(ctx_pic->
qm),
519 #if CONFIG_H264_DXVA2_HWACCEL
521 .
p.
name =
"h264_dxva2",
536 #if CONFIG_H264_D3D11VA_HWACCEL
538 .
p.
name =
"h264_d3d11va",
553 #if CONFIG_H264_D3D11VA2_HWACCEL
555 .
p.
name =
"h264_d3d11va2",