dxva2_h264.c
Go to the documentation of this file.
1 /*
2  * DXVA2 H264 HW acceleration.
3  *
4  * copyright (c) 2009 Laurent Aimar
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include "dxva2_internal.h"
24 #include "h264.h"
25 #include "h264data.h"
26 
28  DXVA_PicParams_H264 pp;
29  DXVA_Qmatrix_H264 qm;
30  unsigned slice_count;
31  DXVA_Slice_H264_Short slice_short[MAX_SLICES];
32  DXVA_Slice_H264_Long slice_long[MAX_SLICES];
34  unsigned bitstream_size;
35 };
36 
37 static void fill_picture_entry(DXVA_PicEntry_H264 *pic,
38  unsigned index, unsigned flag)
39 {
40  assert((index&0x7f) == index && (flag&0x01) == flag);
41  pic->bPicEntry = index | (flag << 7);
42 }
43 
44 static void fill_picture_parameters(struct dxva_context *ctx, const H264Context *h,
45  DXVA_PicParams_H264 *pp)
46 {
47  const Picture *current_picture = h->cur_pic_ptr;
48  int i, j;
49 
50  memset(pp, 0, sizeof(*pp));
51  /* Configure current picture */
52  fill_picture_entry(&pp->CurrPic,
53  ff_dxva2_get_surface_index(ctx, current_picture),
55  /* Configure the set of references */
56  pp->UsedForReferenceFlags = 0;
57  pp->NonExistingFrameFlags = 0;
58  for (i = 0, j = 0; i < FF_ARRAY_ELEMS(pp->RefFrameList); i++) {
59  const Picture *r;
60  if (j < h->short_ref_count) {
61  r = h->short_ref[j++];
62  } else {
63  r = NULL;
64  while (!r && j < h->short_ref_count + 16)
65  r = h->long_ref[j++ - h->short_ref_count];
66  }
67  if (r) {
68  fill_picture_entry(&pp->RefFrameList[i],
70  r->long_ref != 0);
71 
72  if ((r->reference & PICT_TOP_FIELD) && r->field_poc[0] != INT_MAX)
73  pp->FieldOrderCntList[i][0] = r->field_poc[0];
74  if ((r->reference & PICT_BOTTOM_FIELD) && r->field_poc[1] != INT_MAX)
75  pp->FieldOrderCntList[i][1] = r->field_poc[1];
76 
77  pp->FrameNumList[i] = r->long_ref ? r->pic_id : r->frame_num;
78  if (r->reference & PICT_TOP_FIELD)
79  pp->UsedForReferenceFlags |= 1 << (2*i + 0);
81  pp->UsedForReferenceFlags |= 1 << (2*i + 1);
82  } else {
83  pp->RefFrameList[i].bPicEntry = 0xff;
84  pp->FieldOrderCntList[i][0] = 0;
85  pp->FieldOrderCntList[i][1] = 0;
86  pp->FrameNumList[i] = 0;
87  }
88  }
89 
90  pp->wFrameWidthInMbsMinus1 = h->mb_width - 1;
91  pp->wFrameHeightInMbsMinus1 = h->mb_height - 1;
92  pp->num_ref_frames = h->sps.ref_frame_count;
93 
94  pp->wBitFields = ((h->picture_structure != PICT_FRAME) << 0) |
95  ((h->sps.mb_aff &&
96  (h->picture_structure == PICT_FRAME)) << 1) |
98  /* sp_for_switch_flag (not implemented by FFmpeg) */
99  (0 << 3) |
100  (h->sps.chroma_format_idc << 4) |
101  ((h->nal_ref_idc != 0) << 6) |
102  (h->pps.constrained_intra_pred << 7) |
103  (h->pps.weighted_pred << 8) |
104  (h->pps.weighted_bipred_idc << 9) |
105  /* MbsConsecutiveFlag */
106  (1 << 11) |
107  (h->sps.frame_mbs_only_flag << 12) |
108  (h->pps.transform_8x8_mode << 13) |
109  ((h->sps.level_idc >= 31) << 14) |
110  /* IntraPicFlag (Modified if we detect a non
111  * intra slice in dxva2_h264_decode_slice) */
112  (1 << 15);
113 
114  pp->bit_depth_luma_minus8 = h->sps.bit_depth_luma - 8;
115  pp->bit_depth_chroma_minus8 = h->sps.bit_depth_chroma - 8;
117  pp->Reserved16Bits = 0;
118  else
119  pp->Reserved16Bits = 3; /* FIXME is there a way to detect the right mode ? */
120  pp->StatusReportFeedbackNumber = 1 + ctx->report_id++;
121  pp->CurrFieldOrderCnt[0] = 0;
122  if ((h->picture_structure & PICT_TOP_FIELD) &&
123  current_picture->field_poc[0] != INT_MAX)
124  pp->CurrFieldOrderCnt[0] = current_picture->field_poc[0];
125  pp->CurrFieldOrderCnt[1] = 0;
127  current_picture->field_poc[1] != INT_MAX)
128  pp->CurrFieldOrderCnt[1] = current_picture->field_poc[1];
129  pp->pic_init_qs_minus26 = h->pps.init_qs - 26;
130  pp->chroma_qp_index_offset = h->pps.chroma_qp_index_offset[0];
131  pp->second_chroma_qp_index_offset = h->pps.chroma_qp_index_offset[1];
132  pp->ContinuationFlag = 1;
133  pp->pic_init_qp_minus26 = h->pps.init_qp - 26;
134  pp->num_ref_idx_l0_active_minus1 = h->pps.ref_count[0] - 1;
135  pp->num_ref_idx_l1_active_minus1 = h->pps.ref_count[1] - 1;
136  pp->Reserved8BitsA = 0;
137  pp->frame_num = h->frame_num;
138  pp->log2_max_frame_num_minus4 = h->sps.log2_max_frame_num - 4;
139  pp->pic_order_cnt_type = h->sps.poc_type;
140  if (h->sps.poc_type == 0)
141  pp->log2_max_pic_order_cnt_lsb_minus4 = h->sps.log2_max_poc_lsb - 4;
142  else if (h->sps.poc_type == 1)
143  pp->delta_pic_order_always_zero_flag = h->sps.delta_pic_order_always_zero_flag;
144  pp->direct_8x8_inference_flag = h->sps.direct_8x8_inference_flag;
145  pp->entropy_coding_mode_flag = h->pps.cabac;
146  pp->pic_order_present_flag = h->pps.pic_order_present;
147  pp->num_slice_groups_minus1 = h->pps.slice_group_count - 1;
148  pp->slice_group_map_type = h->pps.mb_slice_group_map_type;
149  pp->deblocking_filter_control_present_flag = h->pps.deblocking_filter_parameters_present;
150  pp->redundant_pic_cnt_present_flag= h->pps.redundant_pic_cnt_present;
151  pp->Reserved8BitsB = 0;
152  pp->slice_group_change_rate_minus1= 0; /* XXX not implemented by FFmpeg */
153  //pp->SliceGroupMap[810]; /* XXX not implemented by FFmpeg */
154 }
155 
156 static void fill_scaling_lists(struct dxva_context *ctx, const H264Context *h, DXVA_Qmatrix_H264 *qm)
157 {
158  unsigned i, j;
159  memset(qm, 0, sizeof(*qm));
161  for (i = 0; i < 6; i++)
162  for (j = 0; j < 16; j++)
163  qm->bScalingLists4x4[i][j] = h->pps.scaling_matrix4[i][j];
164 
165  for (i = 0; i < 64; i++) {
166  qm->bScalingLists8x8[0][i] = h->pps.scaling_matrix8[0][i];
167  qm->bScalingLists8x8[1][i] = h->pps.scaling_matrix8[3][i];
168  }
169  } else {
170  for (i = 0; i < 6; i++)
171  for (j = 0; j < 16; j++)
172  qm->bScalingLists4x4[i][j] = h->pps.scaling_matrix4[i][zigzag_scan[j]];
173 
174  for (i = 0; i < 64; i++) {
175  qm->bScalingLists8x8[0][i] = h->pps.scaling_matrix8[0][ff_zigzag_direct[i]];
176  qm->bScalingLists8x8[1][i] = h->pps.scaling_matrix8[3][ff_zigzag_direct[i]];
177  }
178  }
179 }
180 
181 static int is_slice_short(struct dxva_context *ctx)
182 {
183  assert(ctx->cfg->ConfigBitstreamRaw == 1 ||
184  ctx->cfg->ConfigBitstreamRaw == 2);
185  return ctx->cfg->ConfigBitstreamRaw == 2;
186 }
187 
188 static void fill_slice_short(DXVA_Slice_H264_Short *slice,
189  unsigned position, unsigned size)
190 {
191  memset(slice, 0, sizeof(*slice));
192  slice->BSNALunitDataLocation = position;
193  slice->SliceBytesInBuffer = size;
194  slice->wBadSliceChopping = 0;
195 }
196 
197 static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice,
198  unsigned position, unsigned size)
199 {
200  const H264Context *h = avctx->priv_data;
201  struct dxva_context *ctx = avctx->hwaccel_context;
202  unsigned list;
203 
204  memset(slice, 0, sizeof(*slice));
205  slice->BSNALunitDataLocation = position;
206  slice->SliceBytesInBuffer = size;
207  slice->wBadSliceChopping = 0;
208 
209  slice->first_mb_in_slice = (h->mb_y >> FIELD_OR_MBAFF_PICTURE(h)) * h->mb_width + h->mb_x;
210  slice->NumMbsForSlice = 0; /* XXX it is set once we have all slices */
211  slice->BitOffsetToSliceData = get_bits_count(&h->gb);
212  slice->slice_type = ff_h264_get_slice_type(h);
213  if (h->slice_type_fixed)
214  slice->slice_type += 5;
215  slice->luma_log2_weight_denom = h->luma_log2_weight_denom;
216  slice->chroma_log2_weight_denom = h->chroma_log2_weight_denom;
217  if (h->list_count > 0)
218  slice->num_ref_idx_l0_active_minus1 = h->ref_count[0] - 1;
219  if (h->list_count > 1)
220  slice->num_ref_idx_l1_active_minus1 = h->ref_count[1] - 1;
221  slice->slice_alpha_c0_offset_div2 = h->slice_alpha_c0_offset / 2 - 26;
222  slice->slice_beta_offset_div2 = h->slice_beta_offset / 2 - 26;
223  slice->Reserved8Bits = 0;
224 
225  for (list = 0; list < 2; list++) {
226  unsigned i;
227  for (i = 0; i < FF_ARRAY_ELEMS(slice->RefPicList[list]); i++) {
228  if (list < h->list_count && i < h->ref_count[list]) {
229  const Picture *r = &h->ref_list[list][i];
230  unsigned plane;
231  fill_picture_entry(&slice->RefPicList[list][i],
234  for (plane = 0; plane < 3; plane++) {
235  int w, o;
236  if (plane == 0 && h->luma_weight_flag[list]) {
237  w = h->luma_weight[i][list][0];
238  o = h->luma_weight[i][list][1];
239  } else if (plane >= 1 && h->chroma_weight_flag[list]) {
240  w = h->chroma_weight[i][list][plane-1][0];
241  o = h->chroma_weight[i][list][plane-1][1];
242  } else {
243  w = 1 << (plane == 0 ? h->luma_log2_weight_denom :
245  o = 0;
246  }
247  slice->Weights[list][i][plane][0] = w;
248  slice->Weights[list][i][plane][1] = o;
249  }
250  } else {
251  unsigned plane;
252  slice->RefPicList[list][i].bPicEntry = 0xff;
253  for (plane = 0; plane < 3; plane++) {
254  slice->Weights[list][i][plane][0] = 0;
255  slice->Weights[list][i][plane][1] = 0;
256  }
257  }
258  }
259  }
260  slice->slice_qs_delta = 0; /* XXX not implemented by FFmpeg */
261  slice->slice_qp_delta = h->qscale - h->pps.init_qp;
262  slice->redundant_pic_cnt = h->redundant_pic_count;
263  if (h->slice_type == AV_PICTURE_TYPE_B)
264  slice->direct_spatial_mv_pred_flag = h->direct_spatial_mv_pred;
265  slice->cabac_init_idc = h->pps.cabac ? h->cabac_init_idc : 0;
266  if (h->deblocking_filter < 2)
267  slice->disable_deblocking_filter_idc = 1 - h->deblocking_filter;
268  else
269  slice->disable_deblocking_filter_idc = h->deblocking_filter;
270  slice->slice_id = h->current_slice - 1;
271 }
272 
274  DXVA2_DecodeBufferDesc *bs,
275  DXVA2_DecodeBufferDesc *sc)
276 {
277  const H264Context *h = avctx->priv_data;
278  const unsigned mb_count = h->mb_width * h->mb_height;
279  struct dxva_context *ctx = avctx->hwaccel_context;
280  const Picture *current_picture = h->cur_pic_ptr;
281  struct dxva2_picture_context *ctx_pic = current_picture->hwaccel_picture_private;
282  DXVA_Slice_H264_Short *slice = NULL;
283  uint8_t *dxva_data, *current, *end;
284  unsigned dxva_size;
285  void *slice_data;
286  unsigned slice_size;
287  unsigned padding;
288  unsigned i;
289 
290  /* Create an annex B bitstream buffer with only slice NAL and finalize slice */
291  if (FAILED(IDirectXVideoDecoder_GetBuffer(ctx->decoder,
292  DXVA2_BitStreamDateBufferType,
293  (void **)&dxva_data, &dxva_size)))
294  return -1;
295  current = dxva_data;
296  end = dxva_data + dxva_size;
297 
298  for (i = 0; i < ctx_pic->slice_count; i++) {
299  static const uint8_t start_code[] = { 0, 0, 1 };
300  static const unsigned start_code_size = sizeof(start_code);
301  unsigned position, size;
302 
303  assert(offsetof(DXVA_Slice_H264_Short, BSNALunitDataLocation) ==
304  offsetof(DXVA_Slice_H264_Long, BSNALunitDataLocation));
305  assert(offsetof(DXVA_Slice_H264_Short, SliceBytesInBuffer) ==
306  offsetof(DXVA_Slice_H264_Long, SliceBytesInBuffer));
307 
308  if (is_slice_short(ctx))
309  slice = &ctx_pic->slice_short[i];
310  else
311  slice = (DXVA_Slice_H264_Short*)&ctx_pic->slice_long[i];
312 
313  position = slice->BSNALunitDataLocation;
314  size = slice->SliceBytesInBuffer;
315  if (start_code_size + size > end - current) {
316  av_log(avctx, AV_LOG_ERROR, "Failed to build bitstream");
317  break;
318  }
319 
320  slice->BSNALunitDataLocation = current - dxva_data;
321  slice->SliceBytesInBuffer = start_code_size + size;
322 
323  if (!is_slice_short(ctx)) {
324  DXVA_Slice_H264_Long *slice_long = (DXVA_Slice_H264_Long*)slice;
325  if (i < ctx_pic->slice_count - 1)
326  slice_long->NumMbsForSlice =
327  slice_long[1].first_mb_in_slice - slice_long[0].first_mb_in_slice;
328  else
329  slice_long->NumMbsForSlice = mb_count - slice_long->first_mb_in_slice;
330  }
331 
332  memcpy(current, start_code, start_code_size);
333  current += start_code_size;
334 
335  memcpy(current, &ctx_pic->bitstream[position], size);
336  current += size;
337  }
338  padding = FFMIN(128 - ((current - dxva_data) & 127), end - current);
339  if (slice && padding > 0) {
340  memset(current, 0, padding);
341  current += padding;
342 
343  slice->SliceBytesInBuffer += padding;
344  }
345  if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder,
346  DXVA2_BitStreamDateBufferType)))
347  return -1;
348  if (i < ctx_pic->slice_count)
349  return -1;
350 
351  memset(bs, 0, sizeof(*bs));
352  bs->CompressedBufferType = DXVA2_BitStreamDateBufferType;
353  bs->DataSize = current - dxva_data;
354  bs->NumMBsInBuffer = mb_count;
355 
356  if (is_slice_short(ctx)) {
357  slice_data = ctx_pic->slice_short;
358  slice_size = ctx_pic->slice_count * sizeof(*ctx_pic->slice_short);
359  } else {
360  slice_data = ctx_pic->slice_long;
361  slice_size = ctx_pic->slice_count * sizeof(*ctx_pic->slice_long);
362  }
363  assert((bs->DataSize & 127) == 0);
364  return ff_dxva2_commit_buffer(avctx, ctx, sc,
365  DXVA2_SliceControlBufferType,
366  slice_data, slice_size, mb_count);
367 }
368 
369 
371  av_unused const uint8_t *buffer,
372  av_unused uint32_t size)
373 {
374  const H264Context *h = avctx->priv_data;
375  struct dxva_context *ctx = avctx->hwaccel_context;
377 
378  if (!ctx->decoder || !ctx->cfg || ctx->surface_count <= 0)
379  return -1;
380  assert(ctx_pic);
381 
382  /* Fill up DXVA_PicParams_H264 */
383  fill_picture_parameters(ctx, h, &ctx_pic->pp);
384 
385  /* Fill up DXVA_Qmatrix_H264 */
386  fill_scaling_lists(ctx, h, &ctx_pic->qm);
387 
388  ctx_pic->slice_count = 0;
389  ctx_pic->bitstream_size = 0;
390  ctx_pic->bitstream = NULL;
391  return 0;
392 }
393 
395  const uint8_t *buffer,
396  uint32_t size)
397 {
398  const H264Context *h = avctx->priv_data;
399  struct dxva_context *ctx = avctx->hwaccel_context;
400  const Picture *current_picture = h->cur_pic_ptr;
401  struct dxva2_picture_context *ctx_pic = current_picture->hwaccel_picture_private;
402  unsigned position;
403 
404  if (ctx_pic->slice_count >= MAX_SLICES)
405  return -1;
406 
407  if (!ctx_pic->bitstream)
408  ctx_pic->bitstream = buffer;
409  ctx_pic->bitstream_size += size;
410 
411  position = buffer - ctx_pic->bitstream;
412  if (is_slice_short(ctx))
413  fill_slice_short(&ctx_pic->slice_short[ctx_pic->slice_count],
414  position, size);
415  else
416  fill_slice_long(avctx, &ctx_pic->slice_long[ctx_pic->slice_count],
417  position, size);
418  ctx_pic->slice_count++;
419 
421  ctx_pic->pp.wBitFields &= ~(1 << 15); /* Set IntraPicFlag to 0 */
422  return 0;
423 }
424 
426 {
427  H264Context *h = avctx->priv_data;
428  struct dxva2_picture_context *ctx_pic =
430  int ret;
431 
432  if (ctx_pic->slice_count <= 0 || ctx_pic->bitstream_size <= 0)
433  return -1;
434  ret = ff_dxva2_common_end_frame(avctx, h->cur_pic_ptr,
435  &ctx_pic->pp, sizeof(ctx_pic->pp),
436  &ctx_pic->qm, sizeof(ctx_pic->qm),
438  if (!ret)
440  return ret;
441 }
442 
444  .name = "h264_dxva2",
445  .type = AVMEDIA_TYPE_VIDEO,
446  .id = AV_CODEC_ID_H264,
447  .pix_fmt = AV_PIX_FMT_DXVA2_VLD,
448  .start_frame = dxva2_h264_start_frame,
449  .decode_slice = dxva2_h264_decode_slice,
450  .end_frame = dxva2_h264_end_frame,
451  .priv_data_size = sizeof(struct dxva2_picture_context),
452 };
int chroma_format_idc
Definition: h264.h:154
#define PICT_BOTTOM_FIELD
Definition: mpegvideo.h:663
#define PICT_TOP_FIELD
Definition: mpegvideo.h:662
GetBitContext gb
Definition: h264.h:268
int weighted_bipred_idc
Definition: h264.h:221
int chroma_qp_index_offset[2]
Definition: h264.h:224
int luma_weight_flag[2]
7.4.3.2 luma_weight_lX_flag
Definition: h264.h:631
int mb_y
Definition: h264.h:461
unsigned int ref_count[2]
num_ref_idx_l0/1_active_minus1 + 1
Definition: h264.h:219
static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx, DXVA2_DecodeBufferDesc *bs, DXVA2_DecodeBufferDesc *sc)
Definition: dxva2_h264.c:273
int frame_mbs_only_flag
Definition: h264.h:167
int mb_height
Definition: h264.h:465
AVHWAccel ff_h264_dxva2_hwaccel
Definition: dxva2_h264.c:443
#define FF_ARRAY_ELEMS(a)
DXVA_PicParams_H264 pp
Definition: dxva2_h264.c:28
H264Context.
Definition: h264.h:260
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining list
int picture_structure
Definition: h264.h:382
const DXVA2_ConfigPictureDecode * cfg
DXVA2 configuration used to create the decoder.
Definition: dxva2.h:68
output residual component w
unsigned surface_count
The number of surface in the surface array.
Definition: dxva2.h:73
Switching Intra.
Definition: avutil.h:220
initialize output if(nPeaks >3)%at least 3 peaks in spectrum for trying to find f0 nf0peaks
DXVA_SliceInfo slice[MAX_SLICES]
Definition: dxva2_mpeg2.c:30
int long_ref
1->long term reference 0->short term reference
Definition: mpegvideo.h:165
uint8_t scaling_matrix4[6][16]
Definition: h264.h:229
int deblocking_filter_parameters_present
deblocking_filter_parameters_present_flag
Definition: h264.h:225
uint8_t
void * hwaccel_context
Hardware accelerator context.
#define PICT_FRAME
Definition: mpegvideo.h:664
int luma_weight[48][2][2]
Definition: h264.h:393
int bit_depth_chroma
bit_depth_chroma_minus8 + 8
Definition: h264.h:204
end end
Picture ref_list[2][48]
0..15: frame refs, 16..47: mbaff field refs.
Definition: h264.h:411
int cabac
entropy_coding_mode_flag
Definition: h264.h:215
unsigned int ref_count[2]
num_ref_idx_l0/1_active_minus1 + 1
Definition: h264.h:408
int mb_x
Definition: h264.h:461
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:193
int ff_h264_get_slice_type(const H264Context *h)
Reconstruct bitstream slice_type.
Definition: h264.c:3894
int redundant_pic_cnt_present
redundant_pic_cnt_present_flag
Definition: h264.h:227
int luma_log2_weight_denom
Definition: h264.h:390
int chroma_weight[48][2][2][2]
Definition: h264.h:394
H.264 / AVC / MPEG4 part10 codec.
int frame_num
Definition: h264.h:507
uint64_t workaround
A bit field configuring the workarounds needed for using the decoder.
Definition: dxva2.h:83
int mb_aff
mb_adaptive_frame_field_flag
Definition: h264.h:168
int poc_type
pic_order_cnt_type
Definition: h264.h:157
int constrained_intra_pred
constrained_intra_pred_flag
Definition: h264.h:226
int reference
Definition: mpegvideo.h:178
const char * r
Definition: vf_curves.c:94
PPS pps
current pps
Definition: h264.h:365
int direct_spatial_mv_pred
Definition: h264.h:397
int weighted_pred
weighted_pred_flag
Definition: h264.h:220
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
int residual_color_transform_flag
residual_colour_transform_flag
Definition: h264.h:205
int delta_pic_order_always_zero_flag
Definition: h264.h:159
#define FIELD_OR_MBAFF_PICTURE(h)
Definition: h264.h:84
int size
uint8_t scaling_matrix8[6][64]
Definition: h264.h:230
int ff_dxva2_common_end_frame(AVCodecContext *avctx, Picture *pic, const void *pp, unsigned pp_size, const void *qm, unsigned qm_size, int(*commit_bs_si)(AVCodecContext *, DXVA2_DecodeBufferDesc *bs, DXVA2_DecodeBufferDesc *slice))
Definition: dxva2.c:79
static void fill_scaling_lists(struct dxva_context *ctx, const H264Context *h, DXVA_Qmatrix_H264 *qm)
Definition: dxva2_h264.c:156
int ref_frame_count
num_ref_frames
Definition: h264.h:163
Picture * long_ref[32]
Definition: h264.h:528
const char * name
Name of the hardware accelerated codec.
#define FFMIN(a, b)
Definition: common.h:58
int redundant_pic_count
Definition: h264.h:524
ret
Definition: avfilter.c:821
Picture.
Definition: mpegvideo.h:97
int cabac_init_idc
Definition: h264.h:545
void * hwaccel_picture_private
hardware accelerator private data
Definition: mpegvideo.h:132
SPS sps
current sps
Definition: h264.h:360
int ff_dxva2_commit_buffer(AVCodecContext *avctx, struct dxva_context *ctx, DXVA2_DecodeBufferDesc *dsc, unsigned type, const void *data, unsigned size, unsigned mb_count)
Definition: dxva2.c:44
int init_qp
pic_init_qp_minus26 + 26
Definition: h264.h:222
int frame_num
h264 frame_num (raw frame_num from slice header)
Definition: mpegvideo.h:161
int direct_8x8_inference_flag
Definition: h264.h:169
unsigned bitstream_size
Definition: dxva2_h264.c:34
#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG
Work around for DXVA2 and old UVD/UVD+ ATI video cards.
Definition: dxva2.h:51
int slice_type
Definition: h264.h:374
static int is_slice_short(struct dxva_context *ctx)
Definition: dxva2_h264.c:181
static void fill_picture_parameters(struct dxva_context *ctx, const H264Context *h, DXVA_PicParams_H264 *pp)
Definition: dxva2_h264.c:44
unsigned int list_count
Definition: h264.h:409
DXVA_Slice_H264_Long slice_long[MAX_SLICES]
Definition: dxva2_h264.c:32
unsigned report_id
Private to the FFmpeg AVHWAccel implementation.
Definition: dxva2.h:88
int pic_order_present
pic_order_present_flag
Definition: h264.h:216
int chroma_log2_weight_denom
Definition: h264.h:391
NULL
Definition: eval.c:55
static void fill_slice_short(DXVA_Slice_H264_Short *slice, unsigned position, unsigned size)
Definition: dxva2_h264.c:188
unsigned ff_dxva2_get_surface_index(const struct dxva_context *ctx, const Picture *picture)
Definition: dxva2.c:30
AVCodecContext * avctx
Definition: h264.h:261
H264 / AVC / MPEG4 part10 codec data table
int slice_alpha_c0_offset
Definition: h264.h:474
AVHWAccel.
static const uint8_t zigzag_scan[16+1]
Definition: h264data.h:55
main external API structure.
static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice, unsigned position, unsigned size)
Definition: dxva2_h264.c:197
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
Picture * short_ref[32]
Definition: h264.h:527
int slice_beta_offset
Definition: h264.h:475
int index
Definition: gxfenc.c:89
synthesis window for stochastic i
int log2_max_poc_lsb
log2_max_pic_order_cnt_lsb_minus4
Definition: h264.h:158
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer. ...
Definition: pixfmt.h:135
static int dxva2_h264_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
Definition: dxva2_h264.c:394
void ff_h264_draw_horiz_band(H264Context *h, int y, int height)
Definition: h264.c:147
int field_poc[2]
h264 top/bottom POC
Definition: mpegvideo.h:159
int transform_8x8_mode
transform_8x8_mode_flag
Definition: h264.h:228
#define FAILED(hr)
Definition: windows2linux.h:48
const uint8_t * bitstream
Definition: dxva2_h264.c:33
int init_qs
pic_init_qs_minus26 + 26
Definition: h264.h:223
int qscale
Definition: h264.h:286
const uint8_t ff_zigzag_direct[64]
Definition: mathtables.c:115
#define MAX_SLICES
Definition: dxva2_mpeg2.c:25
int log2_max_frame_num
log2_max_frame_num_minus4 + 4
Definition: h264.h:156
Bi-dir predicted.
Definition: avutil.h:218
the buffer and buffer reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFilterBuffer structures They must not be accessed but through references stored in AVFilterBufferRef structures Several references can point to the same buffer
int bit_depth_luma
bit_depth_luma_minus8 + 8
Definition: h264.h:203
static int dxva2_h264_start_frame(AVCodecContext *avctx, av_unused const uint8_t *buffer, av_unused uint32_t size)
Definition: dxva2_h264.c:370
static int dxva2_h264_end_frame(AVCodecContext *avctx)
Definition: dxva2_h264.c:425
Picture * cur_pic_ptr
Definition: h264.h:273
int pic_id
h264 pic_num (short -> no wrap version of pic_num, pic_num & max_pic_num; long -> long_pic_num) ...
Definition: mpegvideo.h:163
int mb_width
Definition: h264.h:465
int current_slice
current slice number, used to initialize slice_num of each thread/context
Definition: h264.h:556
int slice_group_count
num_slice_groups_minus1 + 1
Definition: h264.h:217
int slice_type_fixed
Definition: h264.h:376
int chroma_weight_flag[2]
7.4.3.2 chroma_weight_lX_flag
Definition: h264.h:632
IDirectXVideoDecoder * decoder
DXVA2 decoder object.
Definition: dxva2.h:63
int deblocking_filter
disable_deblocking_filter_idc with 1 <-> 0
Definition: h264.h:473
int level_idc
Definition: h264.h:153
DXVA_Slice_H264_Short slice_short[MAX_SLICES]
Definition: dxva2_h264.c:31
int nal_ref_idc
Definition: h264.h:480
for(j=16;j >0;--j)
static void fill_picture_entry(DXVA_PicEntry_H264 *pic, unsigned index, unsigned flag)
Definition: dxva2_h264.c:37
#define av_unused
Definition: attributes.h:114
This structure is used to provides the necessary configurations and data to the DXVA2 FFmpeg HWAccel ...
Definition: dxva2.h:59
int short_ref_count
number of actual short term references
Definition: h264.h:543
int mb_slice_group_map_type
Definition: h264.h:218
DXVA_Qmatrix_H264 qm
Definition: dxva2_h264.c:29