FFmpeg
vaapi_av1.c
Go to the documentation of this file.
1 /*
2  * AV1 HW decode acceleration through VA API
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "libavutil/frame.h"
22 #include "libavutil/mem.h"
23 #include "hwaccel_internal.h"
24 #include "vaapi_decode.h"
25 #include "internal.h"
26 #include "av1dec.h"
27 #include "thread.h"
28 
29 typedef struct VAAPIAV1FrameRef {
31  int valid;
33 
34 typedef struct VAAPIAV1DecContext {
36 
37  /**
38  * For film grain case, VAAPI generate 2 output for each frame,
39  * current_frame will not apply film grain, and will be used for
40  * references for next frames. Maintain the reference list without
41  * applying film grain here. And current_display_picture will be
42  * used to apply film grain and push to downstream.
43  */
46 
48  VASliceParameterBufferAV1 *slice_params;
50 
51 static VASurfaceID vaapi_av1_surface_id(AV1Frame *vf)
52 {
53  if (vf->f)
54  return ff_vaapi_get_surface_id(vf->f);
55  else
56  return VA_INVALID_SURFACE;
57 }
58 
60 {
61  AV1DecContext *s = avctx->priv_data;
62  const AV1RawSequenceHeader *seq = s->raw_seq;
63  int8_t bit_depth = 8;
64 
65  if (seq->seq_profile == 2 && seq->color_config.high_bitdepth)
66  bit_depth = seq->color_config.twelve_bit ? 12 : 10;
67  else if (seq->seq_profile <= 2)
68  bit_depth = seq->color_config.high_bitdepth ? 10 : 8;
69  else {
70  av_log(avctx, AV_LOG_ERROR,
71  "Couldn't get bit depth from profile:%d.\n", seq->seq_profile);
72  return -1;
73  }
74  return bit_depth == 8 ? 0 : bit_depth == 10 ? 1 : 2;
75 }
76 
78 {
80 
81  av_frame_free(&ctx->tmp_frame);
82 
83  for (int i = 0; i < FF_ARRAY_ELEMS(ctx->ref_tab); i++)
84  av_frame_free(&ctx->ref_tab[i].frame);
85 
86  av_freep(&ctx->slice_params);
87 
88  return ff_vaapi_decode_uninit(avctx);
89 }
90 
92 {
94 
95  int ret = ff_vaapi_decode_init(avctx);
96  if (ret < 0)
97  return ret;
98 
99  ctx->tmp_frame = av_frame_alloc();
100  if (!ctx->tmp_frame) {
102  return AVERROR(ENOMEM);
103  }
104 
105  for (int i = 0; i < FF_ARRAY_ELEMS(ctx->ref_tab); i++) {
106  ctx->ref_tab[i].frame = av_frame_alloc();
107  if (!ctx->ref_tab[i].frame) {
109  return AVERROR(ENOMEM);
110  }
111  ctx->ref_tab[i].valid = 0;
112  }
113 
114  return ret;
115 }
116 
118  av_unused const AVBufferRef *buffer_ref,
119  av_unused const uint8_t *buffer,
120  av_unused uint32_t size)
121 {
122  AV1DecContext *s = avctx->priv_data;
123  const AV1RawSequenceHeader *seq = s->raw_seq;
124  const AV1RawFrameHeader *frame_header = s->raw_frame_header;
125  const AV1RawFilmGrainParams *film_grain = &s->cur_frame.film_grain;
126  VAAPIDecodePicture *pic = s->cur_frame.hwaccel_picture_private;
128  VADecPictureParameterBufferAV1 pic_param;
129  int8_t bit_depth_idx;
130  int err = 0;
131  int apply_grain = !(avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) && film_grain->apply_grain;
133  uint8_t segmentation_feature_signed[AV1_SEG_LVL_MAX] = {1, 1, 1, 1, 1, 0, 0, 0};
134  uint8_t segmentation_feature_max[AV1_SEG_LVL_MAX] = {255, AV1_MAX_LOOP_FILTER,
136 
137  bit_depth_idx = vaapi_av1_get_bit_depth_idx(avctx);
138  if (bit_depth_idx < 0)
139  goto fail;
140 
141  if (apply_grain) {
142  if (ctx->tmp_frame->buf[0])
143  av_frame_unref(ctx->tmp_frame);
144  err = ff_thread_get_buffer(avctx, ctx->tmp_frame, AV_GET_BUFFER_FLAG_REF);
145  if (err < 0)
146  goto fail;
147  pic->output_surface = ff_vaapi_get_surface_id(ctx->tmp_frame);
148  } else {
149  pic->output_surface = ff_vaapi_get_surface_id(s->cur_frame.f);
150  }
151 
152  memset(&pic_param, 0, sizeof(VADecPictureParameterBufferAV1));
153  pic_param = (VADecPictureParameterBufferAV1) {
154  .profile = seq->seq_profile,
155  .order_hint_bits_minus_1 = seq->order_hint_bits_minus_1,
156  .bit_depth_idx = bit_depth_idx,
157  .matrix_coefficients = seq->color_config.matrix_coefficients,
158  .current_frame = pic->output_surface,
159  .current_display_picture = ff_vaapi_get_surface_id(s->cur_frame.f),
160  .frame_width_minus1 = frame_header->frame_width_minus_1,
161  .frame_height_minus1 = frame_header->frame_height_minus_1,
162  .primary_ref_frame = frame_header->primary_ref_frame,
163  .order_hint = frame_header->order_hint,
164  .tile_cols = frame_header->tile_cols,
165  .tile_rows = frame_header->tile_rows,
166  .context_update_tile_id = frame_header->context_update_tile_id,
167  .superres_scale_denominator = frame_header->use_superres ?
168  frame_header->coded_denom + AV1_SUPERRES_DENOM_MIN :
170  .interp_filter = frame_header->interpolation_filter,
171  .filter_level[0] = frame_header->loop_filter_level[0],
172  .filter_level[1] = frame_header->loop_filter_level[1],
173  .filter_level_u = frame_header->loop_filter_level[2],
174  .filter_level_v = frame_header->loop_filter_level[3],
175  .base_qindex = frame_header->base_q_idx,
176  .y_dc_delta_q = frame_header->delta_q_y_dc,
177  .u_dc_delta_q = frame_header->delta_q_u_dc,
178  .u_ac_delta_q = frame_header->delta_q_u_ac,
179  .v_dc_delta_q = frame_header->delta_q_v_dc,
180  .v_ac_delta_q = frame_header->delta_q_v_ac,
181  .cdef_damping_minus_3 = frame_header->cdef_damping_minus_3,
182  .cdef_bits = frame_header->cdef_bits,
183  .seq_info_fields.fields = {
184  .still_picture = seq->still_picture,
185  .use_128x128_superblock = seq->use_128x128_superblock,
186  .enable_filter_intra = seq->enable_filter_intra,
187  .enable_intra_edge_filter = seq->enable_intra_edge_filter,
188  .enable_interintra_compound = seq->enable_interintra_compound,
189  .enable_masked_compound = seq->enable_masked_compound,
190  .enable_dual_filter = seq->enable_dual_filter,
191  .enable_order_hint = seq->enable_order_hint,
192  .enable_jnt_comp = seq->enable_jnt_comp,
193  .enable_cdef = seq->enable_cdef,
194  .mono_chrome = seq->color_config.mono_chrome,
195  .color_range = seq->color_config.color_range,
196  .subsampling_x = seq->color_config.subsampling_x,
197  .subsampling_y = seq->color_config.subsampling_y,
198  .chroma_sample_position = seq->color_config.chroma_sample_position,
199  .film_grain_params_present = seq->film_grain_params_present &&
200  !(avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN),
201  },
202  .seg_info.segment_info_fields.bits = {
203  .enabled = frame_header->segmentation_enabled,
204  .update_map = frame_header->segmentation_update_map,
205  .temporal_update = frame_header->segmentation_temporal_update,
206  .update_data = frame_header->segmentation_update_data,
207  },
208  .film_grain_info = {
209  .film_grain_info_fields.bits = {
210  .apply_grain = apply_grain,
211  .chroma_scaling_from_luma = film_grain->chroma_scaling_from_luma,
212  .grain_scaling_minus_8 = film_grain->grain_scaling_minus_8,
213  .ar_coeff_lag = film_grain->ar_coeff_lag,
214  .ar_coeff_shift_minus_6 = film_grain->ar_coeff_shift_minus_6,
215  .grain_scale_shift = film_grain->grain_scale_shift,
216  .overlap_flag = film_grain->overlap_flag,
217  .clip_to_restricted_range = film_grain->clip_to_restricted_range,
218  },
219  .grain_seed = film_grain->grain_seed,
220  .num_y_points = film_grain->num_y_points,
221  .num_cb_points = film_grain->num_cb_points,
222  .num_cr_points = film_grain->num_cr_points,
223  .cb_mult = film_grain->cb_mult,
224  .cb_luma_mult = film_grain->cb_luma_mult,
225  .cb_offset = film_grain->cb_offset,
226  .cr_mult = film_grain->cr_mult,
227  .cr_luma_mult = film_grain->cr_luma_mult,
228  .cr_offset = film_grain->cr_offset,
229  },
230  .pic_info_fields.bits = {
231  .frame_type = frame_header->frame_type,
232  .show_frame = frame_header->show_frame,
233  .showable_frame = frame_header->showable_frame,
234  .error_resilient_mode = frame_header->error_resilient_mode,
235  .disable_cdf_update = frame_header->disable_cdf_update,
236  .allow_screen_content_tools = frame_header->allow_screen_content_tools,
237  .force_integer_mv = s->cur_frame.force_integer_mv,
238  .allow_intrabc = frame_header->allow_intrabc,
239  .use_superres = frame_header->use_superres,
240  .allow_high_precision_mv = frame_header->allow_high_precision_mv,
241  .is_motion_mode_switchable = frame_header->is_motion_mode_switchable,
242  .use_ref_frame_mvs = frame_header->use_ref_frame_mvs,
243  .disable_frame_end_update_cdf = frame_header->disable_frame_end_update_cdf,
244  .uniform_tile_spacing_flag = frame_header->uniform_tile_spacing_flag,
245  .allow_warped_motion = frame_header->allow_warped_motion,
246  },
247  .loop_filter_info_fields.bits = {
248  .sharpness_level = frame_header->loop_filter_sharpness,
249  .mode_ref_delta_enabled = frame_header->loop_filter_delta_enabled,
250  .mode_ref_delta_update = frame_header->loop_filter_delta_update,
251  },
252  .mode_control_fields.bits = {
253  .delta_q_present_flag = frame_header->delta_q_present,
254  .log2_delta_q_res = frame_header->delta_q_res,
255  .delta_lf_present_flag = frame_header->delta_lf_present,
256  .log2_delta_lf_res = frame_header->delta_lf_res,
257  .delta_lf_multi = frame_header->delta_lf_multi,
258  .tx_mode = frame_header->tx_mode,
259  .reference_select = frame_header->reference_select,
260  .reduced_tx_set_used = frame_header->reduced_tx_set,
261  .skip_mode_present = frame_header->skip_mode_present,
262  },
263  .loop_restoration_fields.bits = {
264  .yframe_restoration_type = remap_lr_type[frame_header->lr_type[0]],
265  .cbframe_restoration_type = remap_lr_type[frame_header->lr_type[1]],
266  .crframe_restoration_type = remap_lr_type[frame_header->lr_type[2]],
267  .lr_unit_shift = frame_header->lr_unit_shift,
268  .lr_uv_shift = frame_header->lr_uv_shift,
269  },
270  .qmatrix_fields.bits = {
271  .using_qmatrix = frame_header->using_qmatrix,
272  .qm_y = frame_header->qm_y,
273  .qm_u = frame_header->qm_u,
274  .qm_v = frame_header->qm_v,
275  }
276  };
277 
278  for (int i = 0; i < AV1_NUM_REF_FRAMES; i++) {
279  if (pic_param.pic_info_fields.bits.frame_type == AV1_FRAME_KEY && frame_header->show_frame)
280  pic_param.ref_frame_map[i] = VA_INVALID_ID;
281  else
282  pic_param.ref_frame_map[i] = ctx->ref_tab[i].valid ?
283  ff_vaapi_get_surface_id(ctx->ref_tab[i].frame) :
285  }
286  for (int i = 0; i < AV1_REFS_PER_FRAME; i++) {
287  pic_param.ref_frame_idx[i] = frame_header->ref_frame_idx[i];
288  }
289  for (int i = 0; i < AV1_TOTAL_REFS_PER_FRAME; i++) {
290  pic_param.ref_deltas[i] = frame_header->loop_filter_ref_deltas[i];
291  }
292  for (int i = 0; i < 2; i++) {
293  pic_param.mode_deltas[i] = frame_header->loop_filter_mode_deltas[i];
294  }
295  for (int i = 0; i < (1 << frame_header->cdef_bits); i++) {
296  pic_param.cdef_y_strengths[i] =
297  (frame_header->cdef_y_pri_strength[i] << 2) +
298  frame_header->cdef_y_sec_strength[i];
299  pic_param.cdef_uv_strengths[i] =
300  (frame_header->cdef_uv_pri_strength[i] << 2) +
301  frame_header->cdef_uv_sec_strength[i];
302  }
303  for (int i = 0; i < frame_header->tile_cols; i++) {
304  pic_param.width_in_sbs_minus_1[i] =
305  frame_header->width_in_sbs_minus_1[i];
306  }
307  for (int i = 0; i < frame_header->tile_rows; i++) {
308  pic_param.height_in_sbs_minus_1[i] =
309  frame_header->height_in_sbs_minus_1[i];
310  }
311  for (int i = AV1_REF_FRAME_LAST; i <= AV1_REF_FRAME_ALTREF; i++) {
312  pic_param.wm[i - 1].invalid = s->cur_frame.gm_invalid[i];
313  pic_param.wm[i - 1].wmtype = s->cur_frame.gm_type[i];
314  for (int j = 0; j < 6; j++)
315  pic_param.wm[i - 1].wmmat[j] = s->cur_frame.gm_params[i][j];
316  }
317  for (int i = 0; i < AV1_MAX_SEGMENTS; i++) {
318  for (int j = 0; j < AV1_SEG_LVL_MAX; j++) {
319  pic_param.seg_info.feature_mask[i] |= (frame_header->feature_enabled[i][j] << j);
320  if (segmentation_feature_signed[j])
321  pic_param.seg_info.feature_data[i][j] = av_clip(frame_header->feature_value[i][j],
322  -segmentation_feature_max[j], segmentation_feature_max[j]);
323  else
324  pic_param.seg_info.feature_data[i][j] = av_clip(frame_header->feature_value[i][j],
325  0, segmentation_feature_max[j]);
326  }
327  }
328  if (apply_grain) {
329  for (int i = 0; i < film_grain->num_y_points; i++) {
330  pic_param.film_grain_info.point_y_value[i] =
331  film_grain->point_y_value[i];
332  pic_param.film_grain_info.point_y_scaling[i] =
333  film_grain->point_y_scaling[i];
334  }
335  for (int i = 0; i < film_grain->num_cb_points; i++) {
336  pic_param.film_grain_info.point_cb_value[i] =
337  film_grain->point_cb_value[i];
338  pic_param.film_grain_info.point_cb_scaling[i] =
339  film_grain->point_cb_scaling[i];
340  }
341  for (int i = 0; i < film_grain->num_cr_points; i++) {
342  pic_param.film_grain_info.point_cr_value[i] =
343  film_grain->point_cr_value[i];
344  pic_param.film_grain_info.point_cr_scaling[i] =
345  film_grain->point_cr_scaling[i];
346  }
347  for (int i = 0; i < 24; i++) {
348  pic_param.film_grain_info.ar_coeffs_y[i] =
349  film_grain->ar_coeffs_y_plus_128[i] - 128;
350  }
351  for (int i = 0; i < 25; i++) {
352  pic_param.film_grain_info.ar_coeffs_cb[i] =
353  film_grain->ar_coeffs_cb_plus_128[i] - 128;
354  pic_param.film_grain_info.ar_coeffs_cr[i] =
355  film_grain->ar_coeffs_cr_plus_128[i] - 128;
356  }
357  }
358  err = ff_vaapi_decode_make_param_buffer(avctx, pic,
359  VAPictureParameterBufferType,
360  &pic_param, sizeof(pic_param));
361  if (err < 0)
362  goto fail;
363 
364  return 0;
365 
366 fail:
367  ff_vaapi_decode_cancel(avctx, pic);
368  return err;
369 }
370 
372 {
373  const AV1DecContext *s = avctx->priv_data;
374  const AV1RawFrameHeader *header = s->raw_frame_header;
375  const AV1RawFilmGrainParams *film_grain = &s->cur_frame.film_grain;
376  VAAPIDecodePicture *pic = s->cur_frame.hwaccel_picture_private;
378 
379  int apply_grain = !(avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) && film_grain->apply_grain;
380  int ret;
381  ret = ff_vaapi_decode_issue(avctx, pic);
382  if (ret < 0)
383  return ret;
384 
385  for (int i = 0; i < AV1_NUM_REF_FRAMES; i++) {
386  if (header->refresh_frame_flags & (1 << i)) {
387  if (ctx->ref_tab[i].frame->buf[0])
388  av_frame_unref(ctx->ref_tab[i].frame);
389 
390  if (apply_grain) {
391  ret = av_frame_ref(ctx->ref_tab[i].frame, ctx->tmp_frame);
392  if (ret < 0)
393  return ret;
394  ctx->ref_tab[i].valid = 1;
395  } else {
396  ctx->ref_tab[i].valid = 0;
397  }
398  }
399  }
400 
401  return 0;
402 }
403 
405  const uint8_t *buffer,
406  uint32_t size)
407 {
408  const AV1DecContext *s = avctx->priv_data;
409  VAAPIDecodePicture *pic = s->cur_frame.hwaccel_picture_private;
411  int err, nb_params;
412 
413  nb_params = s->tg_end - s->tg_start + 1;
414  if (ctx->nb_slice_params < nb_params) {
415  VASliceParameterBufferAV1 *tmp = av_realloc_array(ctx->slice_params,
416  nb_params,
417  sizeof(*ctx->slice_params));
418  if (!tmp) {
419  ctx->nb_slice_params = 0;
420  err = AVERROR(ENOMEM);
421  goto fail;
422  }
423  ctx->slice_params = tmp;
424  ctx->nb_slice_params = nb_params;
425  }
426 
427  for (int i = s->tg_start; i <= s->tg_end; i++) {
428  ctx->slice_params[i - s->tg_start] = (VASliceParameterBufferAV1) {
429  .slice_data_size = s->tile_group_info[i].tile_size,
430  .slice_data_offset = s->tile_group_info[i].tile_offset,
431  .slice_data_flag = VA_SLICE_DATA_FLAG_ALL,
432  .tile_row = s->tile_group_info[i].tile_row,
433  .tile_column = s->tile_group_info[i].tile_column,
434  .tg_start = s->tg_start,
435  .tg_end = s->tg_end,
436  };
437  }
438 
439  err = ff_vaapi_decode_make_slice_buffer(avctx, pic, ctx->slice_params, nb_params,
440  sizeof(VASliceParameterBufferAV1),
441  buffer,
442  size);
443  if (err)
444  goto fail;
445 
446  return 0;
447 
448 fail:
449  ff_vaapi_decode_cancel(avctx, pic);
450  return err;
451 }
452 
454  .p.name = "av1_vaapi",
455  .p.type = AVMEDIA_TYPE_VIDEO,
456  .p.id = AV_CODEC_ID_AV1,
457  .p.pix_fmt = AV_PIX_FMT_VAAPI,
458  .start_frame = vaapi_av1_start_frame,
459  .end_frame = vaapi_av1_end_frame,
460  .decode_slice = vaapi_av1_decode_slice,
461  .frame_priv_data_size = sizeof(VAAPIDecodePicture),
464  .frame_params = ff_vaapi_common_frame_params,
465  .priv_data_size = sizeof(VAAPIAV1DecContext),
466  .caps_internal = HWACCEL_CAP_ASYNC_SAFE,
467 };
AV1_REF_FRAME_LAST
@ AV1_REF_FRAME_LAST
Definition: av1.h:63
vaapi_av1_decode_uninit
static av_cold int vaapi_av1_decode_uninit(AVCodecContext *avctx)
Definition: vaapi_av1.c:77
av_clip
#define av_clip
Definition: common.h:100
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
ff_vaapi_get_surface_id
static VASurfaceID ff_vaapi_get_surface_id(AVFrame *pic)
Definition: vaapi_decode.h:30
VAAPIAV1FrameRef::frame
AVFrame * frame
Definition: vaapi_av1.c:30
AV1RawSequenceHeader
Definition: cbs_av1.h:82
VAAPIDecodeContext
Definition: vaapi_decode.h:47
vaapi_decode.h
AV1RawFilmGrainParams::apply_grain
uint8_t apply_grain
Definition: cbs_av1.h:143
av_unused
#define av_unused
Definition: attributes.h:164
FFHWAccel::p
AVHWAccel p
The public AVHWAccel.
Definition: hwaccel_internal.h:38
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:64
VAAPIDecodePicture
Definition: vaapi_decode.h:35
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:435
vaapi_av1_start_frame
static int vaapi_av1_start_frame(AVCodecContext *avctx, av_unused const AVBufferRef *buffer_ref, av_unused const uint8_t *buffer, av_unused uint32_t size)
Definition: vaapi_av1.c:117
internal.h
vaapi_av1_end_frame
static int vaapi_av1_end_frame(AVCodecContext *avctx)
Definition: vaapi_av1.c:371
VAAPIAV1DecContext::ref_tab
VAAPIAV1FrameRef ref_tab[AV1_NUM_REF_FRAMES]
For film grain case, VAAPI generate 2 output for each frame, current_frame will not apply film grain,...
Definition: vaapi_av1.c:44
VAAPIAV1DecContext::base
VAAPIDecodeContext base
Definition: vaapi_av1.c:35
bit_depth
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition: af_astats.c:246
thread.h
AV1RawSequenceHeader::seq_profile
uint8_t seq_profile
Definition: cbs_av1.h:83
ff_vaapi_decode_make_param_buffer
int ff_vaapi_decode_make_param_buffer(AVCodecContext *avctx, VAAPIDecodePicture *pic, int type, const void *data, size_t size)
Definition: vaapi_decode.c:34
FFHWAccel
Definition: hwaccel_internal.h:34
AV1_SEG_LVL_MAX
@ AV1_SEG_LVL_MAX
Definition: av1.h:90
AV1_TOTAL_REFS_PER_FRAME
@ AV1_TOTAL_REFS_PER_FRAME
Definition: av1.h:86
fail
#define fail()
Definition: checkasm.h:224
AV1_REFS_PER_FRAME
@ AV1_REFS_PER_FRAME
Definition: av1.h:85
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:52
AV1Frame
Definition: av1dec.h:37
VAAPIAV1FrameRef::valid
int valid
Definition: vaapi_av1.c:31
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:119
vaapi_av1_decode_slice
static int vaapi_av1_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
Definition: vaapi_av1.c:404
s
#define s(width, name)
Definition: cbs_vp9.c:198
ff_vaapi_decode_init
int ff_vaapi_decode_init(AVCodecContext *avctx)
Definition: vaapi_decode.c:692
av_realloc_array
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:217
AV_GET_BUFFER_FLAG_REF
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
Definition: avcodec.h:411
ff_thread_get_buffer
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
Definition: pthread_frame.c:1044
ff_vaapi_common_frame_params
int ff_vaapi_common_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
Definition: vaapi_decode.c:668
AV1_RESTORE_WIENER
@ AV1_RESTORE_WIENER
Definition: av1.h:174
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
VAAPIAV1DecContext
Definition: vaapi_av1.c:34
ff_vaapi_decode_uninit
int ff_vaapi_decode_uninit(AVCodecContext *avctx)
Definition: vaapi_decode.c:738
av1dec.h
vaapi_av1_get_bit_depth_idx
static int8_t vaapi_av1_get_bit_depth_idx(AVCodecContext *avctx)
Definition: vaapi_av1.c:59
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
ff_vaapi_decode_issue
int ff_vaapi_decode_issue(AVCodecContext *avctx, VAAPIDecodePicture *pic)
Definition: vaapi_decode.c:166
HWACCEL_CAP_ASYNC_SAFE
#define HWACCEL_CAP_ASYNC_SAFE
Header providing the internals of AVHWAccel.
Definition: hwaccel_internal.h:31
AV_CODEC_ID_AV1
@ AV_CODEC_ID_AV1
Definition: codec_id.h:284
hwaccel_internal.h
AV1RawFrameHeader
Definition: cbs_av1.h:174
AVCodecContext::internal
struct AVCodecInternal * internal
Private context used for internal data.
Definition: avcodec.h:474
AV1_RESTORE_SWITCHABLE
@ AV1_RESTORE_SWITCHABLE
Definition: av1.h:176
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:551
av_frame_ref
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition: frame.c:278
AVCodecInternal::hwaccel_priv_data
void * hwaccel_priv_data
hwaccel-specific private data
Definition: internal.h:130
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
size
int size
Definition: twinvq_data.h:10344
AV1_NUM_REF_FRAMES
@ AV1_NUM_REF_FRAMES
Definition: av1.h:84
AV1DecContext
Definition: av1dec.h:85
ff_vaapi_decode_cancel
int ff_vaapi_decode_cancel(AVCodecContext *avctx, VAAPIDecodePicture *pic)
Definition: vaapi_decode.c:247
frame.h
header
static const uint8_t header[24]
Definition: sdr2.c:68
AV_PIX_FMT_VAAPI
@ AV_PIX_FMT_VAAPI
Hardware acceleration through VA-API, data[3] contains a VASurfaceID.
Definition: pixfmt.h:126
AVHWAccel::name
const char * name
Name of the hardware accelerated codec.
Definition: avcodec.h:1961
uninit
static void uninit(AVBSFContext *ctx)
Definition: pcm_rechunk.c:68
VAAPIAV1DecContext::nb_slice_params
int nb_slice_params
Definition: vaapi_av1.c:47
AV1_FRAME_KEY
@ AV1_FRAME_KEY
Definition: av1.h:53
AV1_MAX_LOOP_FILTER
@ AV1_MAX_LOOP_FILTER
Definition: av1.h:124
AV1_SUPERRES_DENOM_MIN
@ AV1_SUPERRES_DENOM_MIN
Definition: av1.h:102
vaapi_av1_surface_id
static VASurfaceID vaapi_av1_surface_id(AV1Frame *vf)
Definition: vaapi_av1.c:51
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:496
AV1RawSequenceHeader::color_config
AV1RawColorConfig color_config
Definition: cbs_av1.h:137
ret
ret
Definition: filter_design.txt:187
AV1RawColorConfig::high_bitdepth
uint8_t high_bitdepth
Definition: cbs_av1.h:51
AVCodecContext
main external API structure.
Definition: avcodec.h:439
frame_header
Definition: truemotion1.c:88
vaapi_av1_decode_init
static av_cold int vaapi_av1_decode_init(AVCodecContext *avctx)
Definition: vaapi_av1.c:91
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_vaapi_decode_make_slice_buffer
int ff_vaapi_decode_make_slice_buffer(AVCodecContext *avctx, VAAPIDecodePicture *pic, const void *params_data, int nb_params, size_t params_size, const void *slice_data, size_t slice_size)
Definition: vaapi_decode.c:75
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
AVCodecContext::export_side_data
int export_side_data
Bit set of AV_CODEC_EXPORT_DATA_* flags, which affects the kind of metadata exported in frame,...
Definition: avcodec.h:1786
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
AV1RawColorConfig::twelve_bit
uint8_t twelve_bit
Definition: cbs_av1.h:52
VAAPIAV1DecContext::tmp_frame
AVFrame * tmp_frame
Definition: vaapi_av1.c:45
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:466
AV1_REF_FRAME_ALTREF
@ AV1_REF_FRAME_ALTREF
Definition: av1.h:69
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
AV1RawFilmGrainParams
Definition: cbs_av1.h:142
VAAPIAV1DecContext::slice_params
VASliceParameterBufferAV1 * slice_params
Definition: vaapi_av1.c:48
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AV1_MAX_SEGMENTS
@ AV1_MAX_SEGMENTS
Definition: av1.h:89
AV1_SUPERRES_NUM
@ AV1_SUPERRES_NUM
Definition: av1.h:101
vf
uint8_t ptrdiff_t const uint8_t ptrdiff_t int const int8_t const int8_t * vf
Definition: dsp.h:262
AV1_RESTORE_SGRPROJ
@ AV1_RESTORE_SGRPROJ
Definition: av1.h:175
ff_av1_vaapi_hwaccel
const FFHWAccel ff_av1_vaapi_hwaccel
Definition: vaapi_av1.c:453
AV1_RESTORE_NONE
@ AV1_RESTORE_NONE
Definition: av1.h:173
AV_CODEC_EXPORT_DATA_FILM_GRAIN
#define AV_CODEC_EXPORT_DATA_FILM_GRAIN
Decoding only.
Definition: avcodec.h:400
VAAPIAV1FrameRef
Definition: vaapi_av1.c:29