FFmpeg
dxva2_hevc.c
Go to the documentation of this file.
1 /*
2  * DXVA2 HEVC HW acceleration.
3  *
4  * copyright (c) 2014 - 2015 Hendrik Leppkes
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 "config_components.h"
24 
25 #include "libavutil/avassert.h"
26 
27 #include "dxva2_internal.h"
28 #include "hevc_data.h"
29 #include "hevcdec.h"
30 #include "hwaccel_internal.h"
31 
32 #define MAX_SLICES 256
33 
35  DXVA_PicParams_HEVC pp;
36  DXVA_Qmatrix_HEVC qm;
37  unsigned slice_count;
38  DXVA_Slice_HEVC_Short slice_short[MAX_SLICES];
39  const uint8_t *bitstream;
40  unsigned bitstream_size;
41 };
42 
43 static void fill_picture_entry(DXVA_PicEntry_HEVC *pic,
44  unsigned index, unsigned flag)
45 {
46  av_assert0((index & 0x7f) == index && (flag & 0x01) == flag);
47  pic->bPicEntry = index | (flag << 7);
48 }
49 
50 static int get_refpic_index(const DXVA_PicParams_HEVC *pp, int surface_index)
51 {
52  int i;
53  for (i = 0; i < FF_ARRAY_ELEMS(pp->RefPicList); i++) {
54  if ((pp->RefPicList[i].bPicEntry & 0x7f) == surface_index)
55  return i;
56  }
57  return 0xff;
58 }
59 
61  DXVA_PicParams_HEVC *pp)
62 {
63  const HEVCFrame *current_picture = h->ref;
64  const HEVCSPS *sps = h->ps.sps;
65  const HEVCPPS *pps = h->ps.pps;
66  int i, j;
67 
68  memset(pp, 0, sizeof(*pp));
69 
70  pp->PicWidthInMinCbsY = sps->min_cb_width;
71  pp->PicHeightInMinCbsY = sps->min_cb_height;
72 
73  pp->wFormatAndSequenceInfoFlags = (sps->chroma_format_idc << 0) |
74  (sps->separate_colour_plane_flag << 2) |
75  ((sps->bit_depth - 8) << 3) |
76  ((sps->bit_depth - 8) << 6) |
77  ((sps->log2_max_poc_lsb - 4) << 9) |
78  (0 << 13) |
79  (0 << 14) |
80  (0 << 15);
81 
82  fill_picture_entry(&pp->CurrPic, ff_dxva2_get_surface_index(avctx, ctx, current_picture->frame), 0);
83 
84  pp->sps_max_dec_pic_buffering_minus1 = sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering - 1;
85  pp->log2_min_luma_coding_block_size_minus3 = sps->log2_min_cb_size - 3;
86  pp->log2_diff_max_min_luma_coding_block_size = sps->log2_diff_max_min_coding_block_size;
87  pp->log2_min_transform_block_size_minus2 = sps->log2_min_tb_size - 2;
88  pp->log2_diff_max_min_transform_block_size = sps->log2_max_trafo_size - sps->log2_min_tb_size;
89  pp->max_transform_hierarchy_depth_inter = sps->max_transform_hierarchy_depth_inter;
90  pp->max_transform_hierarchy_depth_intra = sps->max_transform_hierarchy_depth_intra;
91  pp->num_short_term_ref_pic_sets = sps->nb_st_rps;
92  pp->num_long_term_ref_pics_sps = sps->num_long_term_ref_pics_sps;
93 
94  pp->num_ref_idx_l0_default_active_minus1 = pps->num_ref_idx_l0_default_active - 1;
95  pp->num_ref_idx_l1_default_active_minus1 = pps->num_ref_idx_l1_default_active - 1;
96  pp->init_qp_minus26 = pps->pic_init_qp_minus26;
97 
98  if (h->sh.short_term_ref_pic_set_sps_flag == 0 && h->sh.short_term_rps) {
99  pp->ucNumDeltaPocsOfRefRpsIdx = h->sh.short_term_rps->rps_idx_num_delta_pocs;
100  pp->wNumBitsForShortTermRPSInSlice = h->sh.short_term_ref_pic_set_size;
101  }
102 
103  pp->dwCodingParamToolFlags = (sps->scaling_list_enable_flag << 0) |
104  (sps->amp_enabled_flag << 1) |
105  (sps->sao_enabled << 2) |
106  (sps->pcm_enabled_flag << 3) |
107  ((sps->pcm_enabled_flag ? (sps->pcm.bit_depth - 1) : 0) << 4) |
108  ((sps->pcm_enabled_flag ? (sps->pcm.bit_depth_chroma - 1) : 0) << 8) |
109  ((sps->pcm_enabled_flag ? (sps->pcm.log2_min_pcm_cb_size - 3) : 0) << 12) |
110  ((sps->pcm_enabled_flag ? (sps->pcm.log2_max_pcm_cb_size - sps->pcm.log2_min_pcm_cb_size) : 0) << 14) |
111  (sps->pcm.loop_filter_disable_flag << 16) |
112  (sps->long_term_ref_pics_present_flag << 17) |
113  (sps->sps_temporal_mvp_enabled_flag << 18) |
114  (sps->sps_strong_intra_smoothing_enable_flag << 19) |
115  (pps->dependent_slice_segments_enabled_flag << 20) |
116  (pps->output_flag_present_flag << 21) |
117  (pps->num_extra_slice_header_bits << 22) |
118  (pps->sign_data_hiding_flag << 25) |
119  (pps->cabac_init_present_flag << 26) |
120  (0 << 27);
121 
122  pp->dwCodingSettingPicturePropertyFlags = (pps->constrained_intra_pred_flag << 0) |
123  (pps->transform_skip_enabled_flag << 1) |
124  (pps->cu_qp_delta_enabled_flag << 2) |
125  (pps->pic_slice_level_chroma_qp_offsets_present_flag << 3) |
126  (pps->weighted_pred_flag << 4) |
127  (pps->weighted_bipred_flag << 5) |
128  (pps->transquant_bypass_enable_flag << 6) |
129  (pps->tiles_enabled_flag << 7) |
130  (pps->entropy_coding_sync_enabled_flag << 8) |
131  (pps->uniform_spacing_flag << 9) |
132  ((pps->tiles_enabled_flag ? pps->loop_filter_across_tiles_enabled_flag : 0) << 10) |
133  (pps->seq_loop_filter_across_slices_enabled_flag << 11) |
134  (pps->deblocking_filter_override_enabled_flag << 12) |
135  (pps->disable_dbf << 13) |
136  (pps->lists_modification_present_flag << 14) |
137  (pps->slice_header_extension_present_flag << 15) |
138  (IS_IRAP(h) << 16) |
139  (IS_IDR(h) << 17) |
140  /* IntraPicFlag */
141  (IS_IRAP(h) << 18) |
142  (0 << 19);
143  pp->pps_cb_qp_offset = pps->cb_qp_offset;
144  pp->pps_cr_qp_offset = pps->cr_qp_offset;
145  if (pps->tiles_enabled_flag) {
146  pp->num_tile_columns_minus1 = pps->num_tile_columns - 1;
147  pp->num_tile_rows_minus1 = pps->num_tile_rows - 1;
148 
149  if (!pps->uniform_spacing_flag) {
150  for (i = 0; i < pps->num_tile_columns; i++)
151  pp->column_width_minus1[i] = pps->column_width[i] - 1;
152 
153  for (i = 0; i < pps->num_tile_rows; i++)
154  pp->row_height_minus1[i] = pps->row_height[i] - 1;
155  }
156  }
157 
158  pp->diff_cu_qp_delta_depth = pps->diff_cu_qp_delta_depth;
159  pp->pps_beta_offset_div2 = pps->beta_offset / 2;
160  pp->pps_tc_offset_div2 = pps->tc_offset / 2;
161  pp->log2_parallel_merge_level_minus2 = pps->log2_parallel_merge_level - 2;
162  pp->CurrPicOrderCntVal = h->poc;
163 
164  // fill RefPicList from the DPB
165  for (i = 0, j = 0; i < FF_ARRAY_ELEMS(pp->RefPicList); i++) {
166  const HEVCFrame *frame = NULL;
167  while (!frame && j < FF_ARRAY_ELEMS(h->DPB)) {
168  if (&h->DPB[j] != current_picture && (h->DPB[j].flags & (HEVC_FRAME_FLAG_LONG_REF | HEVC_FRAME_FLAG_SHORT_REF)))
169  frame = &h->DPB[j];
170  j++;
171  }
172 
173  if (frame) {
174  fill_picture_entry(&pp->RefPicList[i], ff_dxva2_get_surface_index(avctx, ctx, frame->frame), !!(frame->flags & HEVC_FRAME_FLAG_LONG_REF));
175  pp->PicOrderCntValList[i] = frame->poc;
176  } else {
177  pp->RefPicList[i].bPicEntry = 0xff;
178  pp->PicOrderCntValList[i] = 0;
179  }
180  }
181 
182  #define DO_REF_LIST(ref_idx, ref_list) { \
183  const RefPicList *rpl = &h->rps[ref_idx]; \
184  for (i = 0, j = 0; i < FF_ARRAY_ELEMS(pp->ref_list); i++) { \
185  const HEVCFrame *frame = NULL; \
186  while (!frame && j < rpl->nb_refs) \
187  frame = rpl->ref[j++]; \
188  if (frame && frame->flags & (HEVC_FRAME_FLAG_LONG_REF | HEVC_FRAME_FLAG_SHORT_REF)) \
189  pp->ref_list[i] = get_refpic_index(pp, ff_dxva2_get_surface_index(avctx, ctx, frame->frame)); \
190  else \
191  pp->ref_list[i] = 0xff; \
192  } \
193  }
194 
195  // Fill short term and long term lists
196  DO_REF_LIST(ST_CURR_BEF, RefPicSetStCurrBefore);
197  DO_REF_LIST(ST_CURR_AFT, RefPicSetStCurrAfter);
198  DO_REF_LIST(LT_CURR, RefPicSetLtCurr);
199 
200  pp->StatusReportFeedbackNumber = 1 + DXVA_CONTEXT_REPORT_ID(avctx, ctx)++;
201 }
202 
203 static void fill_scaling_lists(AVDXVAContext *ctx, const HEVCContext *h, DXVA_Qmatrix_HEVC *qm)
204 {
205  unsigned i, j, pos;
206  const ScalingList *sl = h->ps.pps->scaling_list_data_present_flag ?
207  &h->ps.pps->scaling_list : &h->ps.sps->scaling_list;
208 
209  memset(qm, 0, sizeof(*qm));
210  for (i = 0; i < 6; i++) {
211  for (j = 0; j < 16; j++) {
213  qm->ucScalingLists0[i][j] = sl->sl[0][i][pos];
214  }
215 
216  for (j = 0; j < 64; j++) {
218  qm->ucScalingLists1[i][j] = sl->sl[1][i][pos];
219  qm->ucScalingLists2[i][j] = sl->sl[2][i][pos];
220 
221  if (i < 2)
222  qm->ucScalingLists3[i][j] = sl->sl[3][i * 3][pos];
223  }
224 
225  qm->ucScalingListDCCoefSizeID2[i] = sl->sl_dc[0][i];
226  if (i < 2)
227  qm->ucScalingListDCCoefSizeID3[i] = sl->sl_dc[1][i * 3];
228  }
229 }
230 
231 static void fill_slice_short(DXVA_Slice_HEVC_Short *slice,
232  unsigned position, unsigned size)
233 {
234  memset(slice, 0, sizeof(*slice));
235  slice->BSNALunitDataLocation = position;
236  slice->SliceBytesInBuffer = size;
237  slice->wBadSliceChopping = 0;
238 }
239 
243 {
244  const HEVCContext *h = avctx->priv_data;
245  AVDXVAContext *ctx = DXVA_CONTEXT(avctx);
246  const HEVCFrame *current_picture = h->ref;
247  struct hevc_dxva2_picture_context *ctx_pic = current_picture->hwaccel_picture_private;
248  DXVA_Slice_HEVC_Short *slice = NULL;
249  void *dxva_data_ptr;
250  uint8_t *dxva_data, *current, *end;
251  unsigned dxva_size;
252  void *slice_data;
253  unsigned slice_size;
254  unsigned padding;
255  unsigned i;
256  unsigned type;
257 
258  /* Create an annex B bitstream buffer with only slice NAL and finalize slice */
259 #if CONFIG_D3D11VA
260  if (ff_dxva2_is_d3d11(avctx)) {
261  type = D3D11_VIDEO_DECODER_BUFFER_BITSTREAM;
262  if (FAILED(ID3D11VideoContext_GetDecoderBuffer(D3D11VA_CONTEXT(ctx)->video_context,
264  type,
265  &dxva_size, &dxva_data_ptr)))
266  return -1;
267  }
268 #endif
269 #if CONFIG_DXVA2
270  if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD) {
271  type = DXVA2_BitStreamDateBufferType;
272  if (FAILED(IDirectXVideoDecoder_GetBuffer(DXVA2_CONTEXT(ctx)->decoder,
273  type,
274  &dxva_data_ptr, &dxva_size)))
275  return -1;
276  }
277 #endif
278 
279  dxva_data = dxva_data_ptr;
280  current = dxva_data;
281  end = dxva_data + dxva_size;
282 
283  for (i = 0; i < ctx_pic->slice_count; i++) {
284  static const uint8_t start_code[] = { 0, 0, 1 };
285  static const unsigned start_code_size = sizeof(start_code);
286  unsigned position, size;
287 
288  slice = &ctx_pic->slice_short[i];
289 
290  position = slice->BSNALunitDataLocation;
291  size = slice->SliceBytesInBuffer;
292  if (start_code_size + size > end - current) {
293  av_log(avctx, AV_LOG_ERROR, "Failed to build bitstream");
294  break;
295  }
296 
297  slice->BSNALunitDataLocation = current - dxva_data;
298  slice->SliceBytesInBuffer = start_code_size + size;
299 
300  memcpy(current, start_code, start_code_size);
301  current += start_code_size;
302 
303  memcpy(current, &ctx_pic->bitstream[position], size);
304  current += size;
305  }
306  padding = FFMIN(128 - ((current - dxva_data) & 127), end - current);
307  if (slice && padding > 0) {
308  memset(current, 0, padding);
309  current += padding;
310 
311  slice->SliceBytesInBuffer += padding;
312  }
313 #if CONFIG_D3D11VA
314  if (ff_dxva2_is_d3d11(avctx))
315  if (FAILED(ID3D11VideoContext_ReleaseDecoderBuffer(D3D11VA_CONTEXT(ctx)->video_context, D3D11VA_CONTEXT(ctx)->decoder, type)))
316  return -1;
317 #endif
318 #if CONFIG_DXVA2
319  if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD)
320  if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(DXVA2_CONTEXT(ctx)->decoder, type)))
321  return -1;
322 #endif
323  if (i < ctx_pic->slice_count)
324  return -1;
325 
326 #if CONFIG_D3D11VA
327  if (ff_dxva2_is_d3d11(avctx)) {
328  D3D11_VIDEO_DECODER_BUFFER_DESC *dsc11 = bs;
329  memset(dsc11, 0, sizeof(*dsc11));
330  dsc11->BufferType = type;
331  dsc11->DataSize = current - dxva_data;
332  dsc11->NumMBsInBuffer = 0;
333 
334  type = D3D11_VIDEO_DECODER_BUFFER_SLICE_CONTROL;
335  }
336 #endif
337 #if CONFIG_DXVA2
338  if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD) {
339  DXVA2_DecodeBufferDesc *dsc2 = bs;
340  memset(dsc2, 0, sizeof(*dsc2));
341  dsc2->CompressedBufferType = type;
342  dsc2->DataSize = current - dxva_data;
343  dsc2->NumMBsInBuffer = 0;
344 
345  type = DXVA2_SliceControlBufferType;
346  }
347 #endif
348 
349  slice_data = ctx_pic->slice_short;
350  slice_size = ctx_pic->slice_count * sizeof(*ctx_pic->slice_short);
351 
352  av_assert0(((current - dxva_data) & 127) == 0);
353  return ff_dxva2_commit_buffer(avctx, ctx, sc,
354  type,
355  slice_data, slice_size, 0);
356 }
357 
358 
360  av_unused const uint8_t *buffer,
361  av_unused uint32_t size)
362 {
363  const HEVCContext *h = avctx->priv_data;
364  AVDXVAContext *ctx = DXVA_CONTEXT(avctx);
365  struct hevc_dxva2_picture_context *ctx_pic = h->ref->hwaccel_picture_private;
366 
367  if (!DXVA_CONTEXT_VALID(avctx, ctx))
368  return -1;
369  av_assert0(ctx_pic);
370 
371  /* Fill up DXVA_PicParams_HEVC */
372  fill_picture_parameters(avctx, ctx, h, &ctx_pic->pp);
373 
374  /* Fill up DXVA_Qmatrix_HEVC */
375  fill_scaling_lists(ctx, h, &ctx_pic->qm);
376 
377  ctx_pic->slice_count = 0;
378  ctx_pic->bitstream_size = 0;
379  ctx_pic->bitstream = NULL;
380  return 0;
381 }
382 
384  const uint8_t *buffer,
385  uint32_t size)
386 {
387  const HEVCContext *h = avctx->priv_data;
388  const HEVCFrame *current_picture = h->ref;
389  struct hevc_dxva2_picture_context *ctx_pic = current_picture->hwaccel_picture_private;
390  unsigned position;
391 
392  if (ctx_pic->slice_count >= MAX_SLICES)
393  return -1;
394 
395  if (!ctx_pic->bitstream)
396  ctx_pic->bitstream = buffer;
397  ctx_pic->bitstream_size += size;
398 
399  position = buffer - ctx_pic->bitstream;
400  fill_slice_short(&ctx_pic->slice_short[ctx_pic->slice_count], position, size);
401  ctx_pic->slice_count++;
402 
403  return 0;
404 }
405 
407 {
408  HEVCContext *h = avctx->priv_data;
409  struct hevc_dxva2_picture_context *ctx_pic = h->ref->hwaccel_picture_private;
410  int scale = ctx_pic->pp.dwCodingParamToolFlags & 1;
411  int ret;
412 
413  if (ctx_pic->slice_count <= 0 || ctx_pic->bitstream_size <= 0)
414  return -1;
415 
416  ret = ff_dxva2_common_end_frame(avctx, h->ref->frame,
417  &ctx_pic->pp, sizeof(ctx_pic->pp),
418  scale ? &ctx_pic->qm : NULL, scale ? sizeof(ctx_pic->qm) : 0,
420  return ret;
421 }
422 
423 #if CONFIG_HEVC_DXVA2_HWACCEL
425  .p.name = "hevc_dxva2",
426  .p.type = AVMEDIA_TYPE_VIDEO,
427  .p.id = AV_CODEC_ID_HEVC,
428  .p.pix_fmt = AV_PIX_FMT_DXVA2_VLD,
429  .init = ff_dxva2_decode_init,
430  .uninit = ff_dxva2_decode_uninit,
431  .start_frame = dxva2_hevc_start_frame,
432  .decode_slice = dxva2_hevc_decode_slice,
433  .end_frame = dxva2_hevc_end_frame,
434  .frame_params = ff_dxva2_common_frame_params,
435  .frame_priv_data_size = sizeof(struct hevc_dxva2_picture_context),
436  .priv_data_size = sizeof(FFDXVASharedContext),
437 };
438 #endif
439 
440 #if CONFIG_HEVC_D3D11VA_HWACCEL
442  .p.name = "hevc_d3d11va",
443  .p.type = AVMEDIA_TYPE_VIDEO,
444  .p.id = AV_CODEC_ID_HEVC,
445  .p.pix_fmt = AV_PIX_FMT_D3D11VA_VLD,
446  .init = ff_dxva2_decode_init,
447  .uninit = ff_dxva2_decode_uninit,
448  .start_frame = dxva2_hevc_start_frame,
449  .decode_slice = dxva2_hevc_decode_slice,
450  .end_frame = dxva2_hevc_end_frame,
451  .frame_params = ff_dxva2_common_frame_params,
452  .frame_priv_data_size = sizeof(struct hevc_dxva2_picture_context),
453  .priv_data_size = sizeof(FFDXVASharedContext),
454 };
455 #endif
456 
457 #if CONFIG_HEVC_D3D11VA2_HWACCEL
459  .p.name = "hevc_d3d11va2",
460  .p.type = AVMEDIA_TYPE_VIDEO,
461  .p.id = AV_CODEC_ID_HEVC,
462  .p.pix_fmt = AV_PIX_FMT_D3D11,
463  .init = ff_dxva2_decode_init,
464  .uninit = ff_dxva2_decode_uninit,
465  .start_frame = dxva2_hevc_start_frame,
466  .decode_slice = dxva2_hevc_decode_slice,
467  .end_frame = dxva2_hevc_end_frame,
468  .frame_params = ff_dxva2_common_frame_params,
469  .frame_priv_data_size = sizeof(struct hevc_dxva2_picture_context),
470  .priv_data_size = sizeof(FFDXVASharedContext),
471 };
472 #endif
fill_picture_entry
static void fill_picture_entry(DXVA_PicEntry_HEVC *pic, unsigned index, unsigned flag)
Definition: dxva2_hevc.c:43
ff_hevc_diag_scan8x8_y
const uint8_t ff_hevc_diag_scan8x8_y[64]
Definition: hevc_data.c:58
ff_hevc_d3d11va2_hwaccel
const struct FFHWAccel ff_hevc_d3d11va2_hwaccel
av_unused
#define av_unused
Definition: attributes.h:131
FFHWAccel::p
AVHWAccel p
The public AVHWAccel.
Definition: hwaccel_internal.h:38
start_code
static const uint8_t start_code[]
Definition: videotoolboxenc.c:218
HEVCFrame::hwaccel_picture_private
void * hwaccel_picture_private
RefStruct reference.
Definition: hevcdec.h:422
ff_dxva2_common_end_frame
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))
Definition: dxva2.c:886
ScalingList::sl
uint8_t sl[4][6][64]
Definition: hevc_ps.h:182
AV_PIX_FMT_D3D11VA_VLD
@ AV_PIX_FMT_D3D11VA_VLD
HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView p...
Definition: pixfmt.h:247
fill_slice_short
static void fill_slice_short(DXVA_Slice_HEVC_Short *slice, unsigned position, unsigned size)
Definition: dxva2_hevc.c:231
hevc_dxva2_picture_context::pp
DXVA_PicParams_HEVC pp
Definition: dxva2_hevc.c:35
AVFrame::flags
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
Definition: frame.h:649
decoder
static const chunk_decoder decoder[8]
Definition: dfa.c:331
HEVC_FRAME_FLAG_LONG_REF
#define HEVC_FRAME_FLAG_LONG_REF
Definition: hevcdec.h:400
FFHWAccel
Definition: hwaccel_internal.h:34
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
hevc_dxva2_picture_context::qm
DXVA_Qmatrix_HEVC qm
Definition: dxva2_hevc.c:36
scale
static av_always_inline float scale(float x, float s)
Definition: vf_v360.c:1389
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
DXVA2_CONTEXT
#define DXVA2_CONTEXT(ctx)
Definition: dxva2_internal.h:102
AV_PIX_FMT_DXVA2_VLD
@ AV_PIX_FMT_DXVA2_VLD
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer.
Definition: pixfmt.h:127
ff_hevc_diag_scan8x8_x
const uint8_t ff_hevc_diag_scan8x8_x[64]
Definition: hevc_data.c:39
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
DXVA_CONTEXT
#define DXVA_CONTEXT(avctx)
Definition: dxva2_internal.h:99
ctx
AVFormatContext * ctx
Definition: movenc.c:48
IS_IDR
#define IS_IDR(s)
Definition: hevcdec.h:75
HEVC_FRAME_FLAG_SHORT_REF
#define HEVC_FRAME_FLAG_SHORT_REF
Definition: hevcdec.h:399
ScalingList
Definition: hevc_ps.h:179
ff_hevc_d3d11va_hwaccel
const struct FFHWAccel ff_hevc_d3d11va_hwaccel
frame
static AVFrame * frame
Definition: demux_decode.c:54
dxva2_internal.h
commit_bitstream_and_slice_buffer
static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx, DECODER_BUFFER_DESC *bs, DECODER_BUFFER_DESC *sc)
Definition: dxva2_hevc.c:240
ff_hevc_diag_scan4x4_y
const uint8_t ff_hevc_diag_scan4x4_y[16]
Definition: hevc_data.c:32
NULL
#define NULL
Definition: coverity.c:32
ff_dxva2_decode_init
int ff_dxva2_decode_init(AVCodecContext *avctx)
Definition: dxva2.c:655
ScalingList::sl_dc
uint8_t sl_dc[2][6]
Definition: hevc_ps.h:183
hwaccel_internal.h
ff_hevc_dxva2_hwaccel
const struct FFHWAccel ff_hevc_dxva2_hwaccel
FFDXVASharedContext
Definition: dxva2_internal.h:67
index
int index
Definition: gxfenc.c:89
hevc_data.h
IS_IRAP
#define IS_IRAP(s)
Definition: hevcdec.h:78
pps
static int FUNC() pps(CodedBitstreamContext *ctx, RWContext *rw, H264RawPPS *current)
Definition: cbs_h264_syntax_template.c:404
hevcdec.h
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:425
size
int size
Definition: twinvq_data.h:10344
AVDXVAContext
Definition: dxva2_internal.h:58
dxva2_hevc_decode_slice
static int dxva2_hevc_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
Definition: dxva2_hevc.c:383
DECODER_BUFFER_DESC
void DECODER_BUFFER_DESC
Definition: dxva2_internal.h:56
AV_PIX_FMT_D3D11
@ AV_PIX_FMT_D3D11
Hardware surfaces for Direct3D11.
Definition: pixfmt.h:333
hevc_dxva2_picture_context::slice_short
DXVA_Slice_HEVC_Short slice_short[MAX_SLICES]
Definition: dxva2_hevc.c:38
AVHWAccel::name
const char * name
Name of the hardware accelerated codec.
Definition: avcodec.h:2135
flag
#define flag(name)
Definition: cbs_av1.c:466
HEVCFrame::frame
AVFrame * frame
Definition: hevcdec.h:407
D3D11VA_CONTEXT
#define D3D11VA_CONTEXT(ctx)
Definition: dxva2_internal.h:101
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
HEVCFrame
Definition: hevcdec.h:406
fill_picture_parameters
static void fill_picture_parameters(const AVCodecContext *avctx, AVDXVAContext *ctx, const HEVCContext *h, DXVA_PicParams_HEVC *pp)
Definition: dxva2_hevc.c:60
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:226
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
ff_dxva2_commit_buffer
int ff_dxva2_commit_buffer(AVCodecContext *avctx, AVDXVAContext *ctx, DECODER_BUFFER_DESC *dsc, unsigned type, const void *data, unsigned size, unsigned mb_count)
Definition: dxva2.c:797
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:658
ff_dxva2_get_surface_index
unsigned ff_dxva2_get_surface_index(const AVCodecContext *avctx, const AVDXVAContext *ctx, const AVFrame *frame)
Definition: dxva2.c:770
ff_dxva2_common_frame_params
int ff_dxva2_common_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
Definition: dxva2.c:592
ret
ret
Definition: filter_design.txt:187
ST_CURR_BEF
@ ST_CURR_BEF
Definition: hevcdec.h:81
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
pos
unsigned int pos
Definition: spdifenc.c:413
DO_REF_LIST
#define DO_REF_LIST(ref_idx, ref_list)
LT_CURR
@ LT_CURR
Definition: hevcdec.h:84
AVCodecContext
main external API structure.
Definition: avcodec.h:441
MAX_SLICES
#define MAX_SLICES
Definition: dxva2_hevc.c:32
dxva2_hevc_end_frame
static int dxva2_hevc_end_frame(AVCodecContext *avctx)
Definition: dxva2_hevc.c:406
buffer
the frame and frame 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 AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
ff_dxva2_is_d3d11
int ff_dxva2_is_d3d11(const AVCodecContext *avctx)
Definition: dxva2.c:1051
HEVCContext
Definition: hevcdec.h:494
ff_hevc_diag_scan4x4_x
const uint8_t ff_hevc_diag_scan4x4_x[16]
Definition: hevc_data.c:25
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
ff_dxva2_decode_uninit
int ff_dxva2_decode_uninit(AVCodecContext *avctx)
Definition: dxva2.c:730
HEVCSPS
Definition: hevc_ps.h:186
HEVCPPS
Definition: hevc_ps.h:303
ST_CURR_AFT
@ ST_CURR_AFT
Definition: hevcdec.h:82
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:468
fill_scaling_lists
static void fill_scaling_lists(AVDXVAContext *ctx, const HEVCContext *h, DXVA_Qmatrix_HEVC *qm)
Definition: dxva2_hevc.c:203
hevc_dxva2_picture_context::slice_count
unsigned slice_count
Definition: dxva2_hevc.c:37
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
hevc_dxva2_picture_context::bitstream_size
unsigned bitstream_size
Definition: dxva2_hevc.c:40
h
h
Definition: vp9dsp_template.c:2038
hevc_dxva2_picture_context::bitstream
const uint8_t * bitstream
Definition: dxva2_hevc.c:39
dxva2_hevc_start_frame
static int dxva2_hevc_start_frame(AVCodecContext *avctx, av_unused const uint8_t *buffer, av_unused uint32_t size)
Definition: dxva2_hevc.c:359
get_refpic_index
static int get_refpic_index(const DXVA_PicParams_HEVC *pp, int surface_index)
Definition: dxva2_hevc.c:50
hevc_dxva2_picture_context
Definition: dxva2_hevc.c:34