FFmpeg
nvdec_hevc.c
Go to the documentation of this file.
1 /*
2  * HEVC HW decode acceleration through NVDEC
3  *
4  * Copyright (c) 2017 Anton Khirnov
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 <stdint.h>
24 #include <string.h>
25 
26 #include "libavutil/mem.h"
27 #include "avcodec.h"
28 #include "nvdec.h"
29 #include "decode.h"
30 #include "internal.h"
31 #include "hevc/hevcdec.h"
32 #include "hevc/data.h"
33 #include "hwaccel_internal.h"
34 
35 static void dpb_add(CUVIDHEVCPICPARAMS *pp, int idx, const HEVCFrame *src)
36 {
37  FrameDecodeData *fdd = (FrameDecodeData*)src->f->private_ref->data;
38  const NVDECFrame *cf = fdd->hwaccel_priv;
39 
40  pp->RefPicIdx[idx] = cf ? cf->idx : -1;
41  pp->PicOrderCntVal[idx] = src->poc;
42  pp->IsLongTerm[idx] = !!(src->flags & HEVC_FRAME_FLAG_LONG_REF);
43 }
44 
45 static void fill_scaling_lists(CUVIDHEVCPICPARAMS *ppc, const HEVCContext *s)
46 {
47  const ScalingList *sl = s->pps->scaling_list_data_present_flag ?
48  &s->pps->scaling_list : &s->pps->sps->scaling_list;
49  int i, j, pos;
50 
51  for (i = 0; i < 6; i++) {
52  for (j = 0; j < 16; j++) {
54  ppc->ScalingList4x4[i][j] = sl->sl[0][i][pos];
55  }
56 
57  for (j = 0; j < 64; j++) {
59  ppc->ScalingList8x8[i][j] = sl->sl[1][i][pos];
60  ppc->ScalingList16x16[i][j] = sl->sl[2][i][pos];
61 
62  if (i < 2)
63  ppc->ScalingList32x32[i][j] = sl->sl[3][i * 3][pos];
64  }
65 
66  ppc->ScalingListDCCoeff16x16[i] = sl->sl_dc[0][i];
67  if (i < 2)
68  ppc->ScalingListDCCoeff32x32[i] = sl->sl_dc[1][i * 3];
69  }
70 }
71 
73  const uint8_t *buffer, uint32_t size)
74 {
75  const HEVCContext *s = avctx->priv_data;
76  const HEVCLayerContext *l = &s->layers[s->cur_layer];
77  const HEVCPPS *pps = s->pps;
78  const HEVCSPS *sps = pps->sps;
79 
81  CUVIDPICPARAMS *pp = &ctx->pic_params;
82  CUVIDHEVCPICPARAMS *ppc = &pp->CodecSpecific.hevc;
83  FrameDecodeData *fdd;
84  NVDECFrame *cf;
85 
86  int i, j, dpb_size, ret;
87 
88  ret = ff_nvdec_start_frame(avctx, s->cur_frame->f);
89  if (ret < 0)
90  return ret;
91 
92  fdd = (FrameDecodeData*)s->cur_frame->f->private_ref->data;
93  cf = (NVDECFrame*)fdd->hwaccel_priv;
94 
95  *pp = (CUVIDPICPARAMS) {
96  .PicWidthInMbs = sps->width / 16,
97  .FrameHeightInMbs = sps->height / 16,
98  .CurrPicIdx = cf->idx,
99  .ref_pic_flag = 1,
100  .intra_pic_flag = IS_IRAP(s),
101 
102  .CodecSpecific.hevc = {
103  .pic_width_in_luma_samples = sps->width,
104  .pic_height_in_luma_samples = sps->height,
105  .log2_min_luma_coding_block_size_minus3 = sps->log2_min_cb_size - 3,
106  .log2_diff_max_min_luma_coding_block_size = sps->log2_diff_max_min_coding_block_size,
107  .log2_min_transform_block_size_minus2 = sps->log2_min_tb_size - 2,
108  .log2_diff_max_min_transform_block_size = sps->log2_max_trafo_size - sps->log2_min_tb_size,
109  .pcm_enabled_flag = sps->pcm_enabled,
110  .log2_min_pcm_luma_coding_block_size_minus3 = sps->pcm_enabled ? sps->pcm.log2_min_pcm_cb_size - 3 : 0,
111  .log2_diff_max_min_pcm_luma_coding_block_size = sps->pcm.log2_max_pcm_cb_size - sps->pcm.log2_min_pcm_cb_size,
112  .pcm_sample_bit_depth_luma_minus1 = sps->pcm_enabled ? sps->pcm.bit_depth - 1 : 0,
113  .pcm_sample_bit_depth_chroma_minus1 = sps->pcm_enabled ? sps->pcm.bit_depth_chroma - 1 : 0,
114 #if NVDECAPI_CHECK_VERSION(8, 1)
115  .log2_max_transform_skip_block_size_minus2 = pps->log2_max_transform_skip_block_size - 2,
116  .log2_sao_offset_scale_luma = pps->log2_sao_offset_scale_luma,
117  .log2_sao_offset_scale_chroma = pps->log2_sao_offset_scale_chroma,
118  .high_precision_offsets_enabled_flag = sps->high_precision_offsets_enabled,
119 #endif
120  .pcm_loop_filter_disabled_flag = sps->pcm_loop_filter_disabled,
121  .strong_intra_smoothing_enabled_flag = sps->strong_intra_smoothing_enabled,
122  .max_transform_hierarchy_depth_intra = sps->max_transform_hierarchy_depth_intra,
123  .max_transform_hierarchy_depth_inter = sps->max_transform_hierarchy_depth_inter,
124  .amp_enabled_flag = sps->amp_enabled,
125  .separate_colour_plane_flag = sps->separate_colour_plane,
126  .log2_max_pic_order_cnt_lsb_minus4 = sps->log2_max_poc_lsb - 4,
127  .num_short_term_ref_pic_sets = sps->nb_st_rps,
128  .long_term_ref_pics_present_flag = sps->long_term_ref_pics_present,
129  .num_long_term_ref_pics_sps = sps->num_long_term_ref_pics_sps,
130  .sps_temporal_mvp_enabled_flag = sps->temporal_mvp_enabled,
131  .sample_adaptive_offset_enabled_flag = sps->sao_enabled,
132  .scaling_list_enable_flag = sps->scaling_list_enabled,
133  .IrapPicFlag = IS_IRAP(s),
134  .IdrPicFlag = IS_IDR(s),
135  .bit_depth_luma_minus8 = sps->bit_depth - 8,
136  .bit_depth_chroma_minus8 = sps->bit_depth - 8,
137 #if NVDECAPI_CHECK_VERSION(9, 0)
138  .sps_range_extension_flag = sps->range_extension,
139  .transform_skip_rotation_enabled_flag = sps->transform_skip_rotation_enabled,
140  .transform_skip_context_enabled_flag = sps->transform_skip_context_enabled,
141  .implicit_rdpcm_enabled_flag = sps->implicit_rdpcm_enabled,
142  .explicit_rdpcm_enabled_flag = sps->explicit_rdpcm_enabled,
143  .extended_precision_processing_flag = sps->extended_precision_processing,
144  .intra_smoothing_disabled_flag = sps->intra_smoothing_disabled,
145  .persistent_rice_adaptation_enabled_flag = sps->persistent_rice_adaptation_enabled,
146  .cabac_bypass_alignment_enabled_flag = sps->cabac_bypass_alignment_enabled,
147 #endif
148 
149  .dependent_slice_segments_enabled_flag = pps->dependent_slice_segments_enabled_flag,
150  .slice_segment_header_extension_present_flag = pps->slice_header_extension_present_flag,
151  .sign_data_hiding_enabled_flag = pps->sign_data_hiding_flag,
152  .cu_qp_delta_enabled_flag = pps->cu_qp_delta_enabled_flag,
153  .diff_cu_qp_delta_depth = pps->diff_cu_qp_delta_depth,
154  .init_qp_minus26 = pps->pic_init_qp_minus26,
155  .pps_cb_qp_offset = pps->cb_qp_offset,
156  .pps_cr_qp_offset = pps->cr_qp_offset,
157  .constrained_intra_pred_flag = pps->constrained_intra_pred_flag,
158  .weighted_pred_flag = pps->weighted_pred_flag,
159  .weighted_bipred_flag = pps->weighted_bipred_flag,
160  .transform_skip_enabled_flag = pps->transform_skip_enabled_flag,
161  .transquant_bypass_enabled_flag = pps->transquant_bypass_enable_flag,
162  .entropy_coding_sync_enabled_flag = pps->entropy_coding_sync_enabled_flag,
163  .log2_parallel_merge_level_minus2 = pps->log2_parallel_merge_level - 2,
164  .num_extra_slice_header_bits = pps->num_extra_slice_header_bits,
165  .loop_filter_across_tiles_enabled_flag = pps->loop_filter_across_tiles_enabled_flag,
166  .loop_filter_across_slices_enabled_flag = pps->seq_loop_filter_across_slices_enabled_flag,
167  .output_flag_present_flag = pps->output_flag_present_flag,
168  .num_ref_idx_l0_default_active_minus1 = pps->num_ref_idx_l0_default_active - 1,
169  .num_ref_idx_l1_default_active_minus1 = pps->num_ref_idx_l1_default_active - 1,
170  .lists_modification_present_flag = pps->lists_modification_present_flag,
171  .cabac_init_present_flag = pps->cabac_init_present_flag,
172  .pps_slice_chroma_qp_offsets_present_flag = pps->pic_slice_level_chroma_qp_offsets_present_flag,
173  .deblocking_filter_override_enabled_flag = pps->deblocking_filter_override_enabled_flag,
174  .pps_deblocking_filter_disabled_flag = pps->disable_dbf,
175  .pps_beta_offset_div2 = pps->beta_offset / 2,
176  .pps_tc_offset_div2 = pps->tc_offset / 2,
177  .tiles_enabled_flag = pps->tiles_enabled_flag,
178  .uniform_spacing_flag = pps->uniform_spacing_flag,
179  .num_tile_columns_minus1 = pps->num_tile_columns - 1,
180  .num_tile_rows_minus1 = pps->num_tile_rows - 1,
181 #if NVDECAPI_CHECK_VERSION(9, 0)
182  .pps_range_extension_flag = pps->pps_range_extensions_flag,
183  .cross_component_prediction_enabled_flag = pps->cross_component_prediction_enabled_flag,
184  .chroma_qp_offset_list_enabled_flag = pps->chroma_qp_offset_list_enabled_flag,
185  .diff_cu_chroma_qp_offset_depth = pps->diff_cu_chroma_qp_offset_depth,
186  .chroma_qp_offset_list_len_minus1 = pps->chroma_qp_offset_list_len_minus1,
187 #endif
188 
189  .NumBitsForShortTermRPSInSlice = s->sh.short_term_rps ? s->sh.short_term_ref_pic_set_size : 0,
190  .NumDeltaPocsOfRefRpsIdx = s->sh.short_term_rps ? s->sh.short_term_rps->rps_idx_num_delta_pocs : 0,
191  .NumPocTotalCurr = ff_hevc_frame_nb_refs(&s->sh, pps, s->cur_layer),
192  .NumPocStCurrBefore = s->rps[ST_CURR_BEF].nb_refs,
193  .NumPocStCurrAfter = s->rps[ST_CURR_AFT].nb_refs,
194  .NumPocLtCurr = s->rps[LT_CURR].nb_refs,
195  .CurrPicOrderCntVal = s->cur_frame->poc,
196  },
197  };
198 
199  if (pps->num_tile_columns > FF_ARRAY_ELEMS(ppc->column_width_minus1) ||
200  pps->num_tile_rows > FF_ARRAY_ELEMS(ppc->row_height_minus1)) {
201  av_log(avctx, AV_LOG_ERROR, "Too many tiles\n");
202  return AVERROR(ENOSYS);
203  }
204  for (i = 0; i < pps->num_tile_columns; i++)
205  ppc->column_width_minus1[i] = pps->column_width[i] - 1;
206  for (i = 0; i < pps->num_tile_rows; i++)
207  ppc->row_height_minus1[i] = pps->row_height[i] - 1;
208 
209 #if NVDECAPI_CHECK_VERSION(9, 0)
210  if (pps->chroma_qp_offset_list_len_minus1 >= FF_ARRAY_ELEMS(ppc->cb_qp_offset_list) ||
211  pps->chroma_qp_offset_list_len_minus1 >= FF_ARRAY_ELEMS(ppc->cr_qp_offset_list)) {
212  av_log(avctx, AV_LOG_ERROR, "Too many chroma_qp_offsets\n");
213  return AVERROR(ENOSYS);
214  }
215  for (i = 0; i <= pps->chroma_qp_offset_list_len_minus1; i++) {
216  ppc->cb_qp_offset_list[i] = pps->cb_qp_offset_list[i];
217  ppc->cr_qp_offset_list[i] = pps->cr_qp_offset_list[i];
218  }
219 #endif
220 
221  if (s->rps[LT_CURR].nb_refs > FF_ARRAY_ELEMS(ppc->RefPicSetLtCurr) ||
222  s->rps[ST_CURR_BEF].nb_refs > FF_ARRAY_ELEMS(ppc->RefPicSetStCurrBefore) ||
223  s->rps[ST_CURR_AFT].nb_refs > FF_ARRAY_ELEMS(ppc->RefPicSetStCurrAfter)) {
224  av_log(avctx, AV_LOG_ERROR, "Too many reference frames\n");
225  return AVERROR(ENOSYS);
226  }
227 
228  dpb_size = 0;
229  for (i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
230  const HEVCFrame *ref = &l->DPB[i];
232  continue;
233  if (dpb_size >= FF_ARRAY_ELEMS(ppc->RefPicIdx)) {
234  av_log(avctx, AV_LOG_ERROR, "Too many reference frames\n");
235  return AVERROR_INVALIDDATA;
236  }
237  dpb_add(ppc, dpb_size++, ref);
238 
239  }
240  for (i = dpb_size; i < FF_ARRAY_ELEMS(ppc->RefPicIdx); i++)
241  ppc->RefPicIdx[i] = -1;
242 
243  for (i = 0; i < s->rps[ST_CURR_BEF].nb_refs; i++) {
244  for (j = 0; j < dpb_size; j++) {
245  if (ppc->PicOrderCntVal[j] == s->rps[ST_CURR_BEF].list[i]) {
246  ppc->RefPicSetStCurrBefore[i] = j;
247  break;
248  }
249  }
250  }
251  for (i = 0; i < s->rps[ST_CURR_AFT].nb_refs; i++) {
252  for (j = 0; j < dpb_size; j++) {
253  if (ppc->PicOrderCntVal[j] == s->rps[ST_CURR_AFT].list[i]) {
254  ppc->RefPicSetStCurrAfter[i] = j;
255  break;
256  }
257  }
258  }
259  for (i = 0; i < s->rps[LT_CURR].nb_refs; i++) {
260  for (j = 0; j < dpb_size; j++) {
261  if (ppc->PicOrderCntVal[j] == s->rps[LT_CURR].list[i]) {
262  ppc->RefPicSetLtCurr[i] = j;
263  break;
264  }
265  }
266  }
267 
268  fill_scaling_lists(ppc, s);
269 
270  return 0;
271 }
272 
273 static int nvdec_hevc_decode_slice(AVCodecContext *avctx, const uint8_t *buffer,
274  uint32_t size)
275 {
277  void *tmp;
278 
279  tmp = av_fast_realloc(ctx->bitstream_internal, &ctx->bitstream_allocated,
280  ctx->bitstream_len + size + 3);
281  if (!tmp)
282  return AVERROR(ENOMEM);
283  ctx->bitstream = ctx->bitstream_internal = tmp;
284 
285  tmp = av_fast_realloc(ctx->slice_offsets, &ctx->slice_offsets_allocated,
286  (ctx->nb_slices + 1) * sizeof(*ctx->slice_offsets));
287  if (!tmp)
288  return AVERROR(ENOMEM);
289  ctx->slice_offsets = tmp;
290 
291  AV_WB24(ctx->bitstream_internal + ctx->bitstream_len, 1);
292  memcpy(ctx->bitstream_internal + ctx->bitstream_len + 3, buffer, size);
293  ctx->slice_offsets[ctx->nb_slices] = ctx->bitstream_len ;
294  ctx->bitstream_len += size + 3;
295  ctx->nb_slices++;
296 
297  return 0;
298 }
299 
301  AVBufferRef *hw_frames_ctx)
302 {
303  const HEVCContext *s = avctx->priv_data;
304  const HEVCSPS *sps = s->pps->sps;
305  return ff_nvdec_frame_params(avctx, hw_frames_ctx, sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering + 1, 1);
306 }
307 
310  ctx->supports_444 = 1;
311 
312  if (avctx->profile != AV_PROFILE_HEVC_MAIN &&
313  avctx->profile != AV_PROFILE_HEVC_MAIN_10 &&
315  avctx->profile != AV_PROFILE_HEVC_REXT) {
316  av_log(avctx, AV_LOG_ERROR, "Unsupported HEVC profile: %d\n", avctx->profile);
317  return AVERROR(ENOTSUP);
318  }
319 
320  return ff_nvdec_decode_init(avctx);
321 }
322 
324  .p.name = "hevc_nvdec",
325  .p.type = AVMEDIA_TYPE_VIDEO,
326  .p.id = AV_CODEC_ID_HEVC,
327  .p.pix_fmt = AV_PIX_FMT_CUDA,
328  .start_frame = nvdec_hevc_start_frame,
329  .end_frame = ff_nvdec_end_frame,
330  .decode_slice = nvdec_hevc_decode_slice,
331  .frame_params = nvdec_hevc_frame_params,
332  .init = nvdec_hevc_decode_init,
333  .uninit = ff_nvdec_decode_uninit,
334  .priv_data_size = sizeof(NVDECContext),
335 };
AV_PIX_FMT_CUDA
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
Definition: pixfmt.h:260
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame 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 all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
AV_PROFILE_HEVC_MAIN
#define AV_PROFILE_HEVC_MAIN
Definition: defs.h:159
FFHWAccel::p
AVHWAccel p
The public AVHWAccel.
Definition: hwaccel_internal.h:38
FrameDecodeData
This struct stores per-frame lavc-internal data and is attached to it via private_ref.
Definition: decode.h:33
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
internal.h
ScalingList::sl
uint8_t sl[4][6][64]
Definition: ps.h:248
HEVC_FRAME_FLAG_LONG_REF
#define HEVC_FRAME_FLAG_LONG_REF
Definition: hevcdec.h:354
FFHWAccel
Definition: hwaccel_internal.h:34
nvdec_hevc_frame_params
static int nvdec_hevc_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
Definition: nvdec_hevc.c:300
ff_nvdec_start_frame
int ff_nvdec_start_frame(AVCodecContext *avctx, AVFrame *frame)
Definition: nvdec.c:561
ff_hevc_diag_scan8x8_y
const uint8_t ff_hevc_diag_scan8x8_y[64]
Definition: data.c:58
NVDECAPI_CHECK_VERSION
#define NVDECAPI_CHECK_VERSION(major, minor)
Definition: nvdec.h:40
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
nvdec_hevc_decode_init
static int nvdec_hevc_decode_init(AVCodecContext *avctx)
Definition: nvdec_hevc.c:308
av_fast_realloc
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given buffer if it is not large enough, otherwise do nothing.
Definition: mem.c:497
s
#define s(width, name)
Definition: cbs_vp9.c:198
NVDECFrame
Definition: nvdec.h:44
ctx
AVFormatContext * ctx
Definition: movenc.c:49
decode.h
IS_IDR
#define IS_IDR(s)
Definition: hevcdec.h:76
HEVC_FRAME_FLAG_SHORT_REF
#define HEVC_FRAME_FLAG_SHORT_REF
Definition: hevcdec.h:353
nvdec_hevc_decode_slice
static int nvdec_hevc_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
Definition: nvdec_hevc.c:273
ScalingList
Definition: ps.h:245
dpb_size
int dpb_size
Definition: h264_levels.c:111
ff_hevc_diag_scan4x4_y
const uint8_t ff_hevc_diag_scan4x4_y[16]
Definition: data.c:32
ScalingList::sl_dc
uint8_t sl_dc[2][6]
Definition: ps.h:249
hwaccel_internal.h
ff_nvdec_decode_init
int ff_nvdec_decode_init(AVCodecContext *avctx)
Definition: nvdec.c:327
AVCodecContext::internal
struct AVCodecInternal * internal
Private context used for internal data.
Definition: avcodec.h:486
AV_PROFILE_HEVC_MAIN_STILL_PICTURE
#define AV_PROFILE_HEVC_MAIN_STILL_PICTURE
Definition: defs.h:161
fill_scaling_lists
static void fill_scaling_lists(CUVIDHEVCPICPARAMS *ppc, const HEVCContext *s)
Definition: nvdec_hevc.c:45
data.h
AV_PROFILE_HEVC_MAIN_10
#define AV_PROFILE_HEVC_MAIN_10
Definition: defs.h:160
AV_PROFILE_HEVC_REXT
#define AV_PROFILE_HEVC_REXT
Definition: defs.h:162
IS_IRAP
#define IS_IRAP(s)
Definition: hevcdec.h:79
hevcdec.h
AVCodecInternal::hwaccel_priv_data
void * hwaccel_priv_data
hwaccel-specific private data
Definition: internal.h:130
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:425
NVDECFrame::idx
unsigned int idx
Definition: nvdec.h:45
size
int size
Definition: twinvq_data.h:10344
AV_WB24
#define AV_WB24(p, d)
Definition: intreadwrite.h:446
dpb_add
static void dpb_add(CUVIDHEVCPICPARAMS *pp, int idx, const HEVCFrame *src)
Definition: nvdec_hevc.c:35
nvdec.h
ff_nvdec_decode_uninit
int ff_nvdec_decode_uninit(AVCodecContext *avctx)
Definition: nvdec.c:259
nvdec_hevc_start_frame
static int nvdec_hevc_start_frame(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
Definition: nvdec_hevc.c:72
AVHWAccel::name
const char * name
Name of the hardware accelerated codec.
Definition: avcodec.h:2121
ff_hevc_frame_nb_refs
int ff_hevc_frame_nb_refs(const SliceHeader *sh, const HEVCPPS *pps, unsigned layer_idx)
Get the number of candidate references for the current frame.
Definition: refs.c:559
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
HEVCFrame
Definition: hevcdec.h:357
HEVCLayerContext
Definition: hevcdec.h:449
ff_nvdec_end_frame
int ff_nvdec_end_frame(AVCodecContext *avctx)
Definition: nvdec.c:633
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:228
ff_hevc_diag_scan4x4_x
const uint8_t ff_hevc_diag_scan4x4_x[16]
Definition: data.c:25
ff_hevc_nvdec_hwaccel
const FFHWAccel ff_hevc_nvdec_hwaccel
Definition: nvdec_hevc.c:323
avcodec.h
ret
ret
Definition: filter_design.txt:187
ST_CURR_BEF
@ ST_CURR_BEF
Definition: hevcdec.h:82
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:414
LT_CURR
@ LT_CURR
Definition: hevcdec.h:85
AVCodecContext
main external API structure.
Definition: avcodec.h:451
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
HEVCContext
Definition: hevcdec.h:487
ff_nvdec_frame_params
int ff_nvdec_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx, int dpb_size, int supports_444)
Definition: nvdec.c:695
AVCodecContext::profile
int profile
profile
Definition: avcodec.h:1658
HEVCLayerContext::DPB
HEVCFrame DPB[32]
Definition: hevcdec.h:450
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
pps
uint64_t pps
Definition: dovi_rpuenc.c:35
ff_hevc_diag_scan8x8_x
const uint8_t ff_hevc_diag_scan8x8_x[64]
Definition: data.c:39
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
HEVCSPS
Definition: ps.h:252
HEVCPPS
Definition: ps.h:371
ST_CURR_AFT
@ ST_CURR_AFT
Definition: hevcdec.h:83
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:478
FrameDecodeData::hwaccel_priv
void * hwaccel_priv
Per-frame private data for hwaccels.
Definition: decode.h:51
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
NVDECContext
Definition: nvdec.h:52
src
#define src
Definition: vp8dsp.c:248