FFmpeg  4.0
vaapi_encode_h265.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include <string.h>
20 
21 #include <va/va.h>
22 #include <va/va_enc_hevc.h>
23 
24 #include "libavutil/avassert.h"
25 #include "libavutil/common.h"
26 #include "libavutil/opt.h"
27 
28 #include "avcodec.h"
29 #include "cbs.h"
30 #include "cbs_h265.h"
31 #include "hevc.h"
32 #include "internal.h"
33 #include "put_bits.h"
34 #include "vaapi_encode.h"
35 
36 
37 typedef struct VAAPIEncodeH265Context {
38  unsigned int ctu_width;
39  unsigned int ctu_height;
40 
44 
50 
51  int64_t last_idr_frame;
53 
56  int pic_type;
57 
62 
63 typedef struct VAAPIEncodeH265Options {
64  int qp;
65  int aud;
66  int profile;
67  int level;
69 
70 
72  char *data, size_t *data_len,
74 {
76  VAAPIEncodeH265Context *priv = ctx->priv_data;
77  int err;
78 
79  err = ff_cbs_write_fragment_data(priv->cbc, au);
80  if (err < 0) {
81  av_log(avctx, AV_LOG_ERROR, "Failed to write packed header.\n");
82  return err;
83  }
84 
85  if (*data_len < 8 * au->data_size - au->data_bit_padding) {
86  av_log(avctx, AV_LOG_ERROR, "Access unit too large: "
87  "%zu < %zu.\n", *data_len,
88  8 * au->data_size - au->data_bit_padding);
89  return AVERROR(ENOSPC);
90  }
91 
92  memcpy(data, au->data, au->data_size);
93  *data_len = 8 * au->data_size - au->data_bit_padding;
94 
95  return 0;
96 }
97 
100  void *nal_unit)
101 {
102  VAAPIEncodeContext *ctx = avctx->priv_data;
103  VAAPIEncodeH265Context *priv = ctx->priv_data;
104  H265RawNALUnitHeader *header = nal_unit;
105  int err;
106 
107  err = ff_cbs_insert_unit_content(priv->cbc, au, -1,
108  header->nal_unit_type, nal_unit, NULL);
109  if (err < 0) {
110  av_log(avctx, AV_LOG_ERROR, "Failed to add NAL unit: "
111  "type = %d.\n", header->nal_unit_type);
112  return err;
113  }
114 
115  return 0;
116 }
117 
119  char *data, size_t *data_len)
120 {
121  VAAPIEncodeContext *ctx = avctx->priv_data;
122  VAAPIEncodeH265Context *priv = ctx->priv_data;
124  int err;
125 
126  if (priv->aud_needed) {
127  err = vaapi_encode_h265_add_nal(avctx, au, &priv->aud);
128  if (err < 0)
129  goto fail;
130  priv->aud_needed = 0;
131  }
132 
133  err = vaapi_encode_h265_add_nal(avctx, au, &priv->vps);
134  if (err < 0)
135  goto fail;
136 
137  err = vaapi_encode_h265_add_nal(avctx, au, &priv->sps);
138  if (err < 0)
139  goto fail;
140 
141  err = vaapi_encode_h265_add_nal(avctx, au, &priv->pps);
142  if (err < 0)
143  goto fail;
144 
145  err = vaapi_encode_h265_write_access_unit(avctx, data, data_len, au);
146 fail:
147  ff_cbs_fragment_uninit(priv->cbc, au);
148  return err;
149 }
150 
152  VAAPIEncodePicture *pic,
154  char *data, size_t *data_len)
155 {
156  VAAPIEncodeContext *ctx = avctx->priv_data;
157  VAAPIEncodeH265Context *priv = ctx->priv_data;
159  int err;
160 
161  if (priv->aud_needed) {
162  err = vaapi_encode_h265_add_nal(avctx, au, &priv->aud);
163  if (err < 0)
164  goto fail;
165  priv->aud_needed = 0;
166  }
167 
168  err = vaapi_encode_h265_add_nal(avctx, au, &priv->slice);
169  if (err < 0)
170  goto fail;
171 
172  err = vaapi_encode_h265_write_access_unit(avctx, data, data_len, au);
173 fail:
174  ff_cbs_fragment_uninit(priv->cbc, au);
175  return err;
176 }
177 
179 {
180  VAAPIEncodeContext *ctx = avctx->priv_data;
181  VAAPIEncodeH265Context *priv = ctx->priv_data;
182  H265RawVPS *vps = &priv->vps;
183  H265RawSPS *sps = &priv->sps;
184  H265RawPPS *pps = &priv->pps;
185  H265RawVUI *vui = &sps->vui;
186  VAEncSequenceParameterBufferHEVC *vseq = ctx->codec_sequence_params;
187  VAEncPictureParameterBufferHEVC *vpic = ctx->codec_picture_params;
188  int i;
189 
190  memset(&priv->current_access_unit, 0,
191  sizeof(priv->current_access_unit));
192 
193  memset(vps, 0, sizeof(*vps));
194  memset(sps, 0, sizeof(*sps));
195  memset(pps, 0, sizeof(*pps));
196 
197 
198  // VPS
199 
202  .nuh_layer_id = 0,
203  .nuh_temporal_id_plus1 = 1,
204  };
205 
207 
210  vps->vps_max_layers_minus1 = 0;
211  vps->vps_max_sub_layers_minus1 = 0;
213 
216  .general_profile_idc = avctx->profile,
217  .general_tier_flag = 0,
218 
219  .general_progressive_source_flag = 1,
220  .general_interlaced_source_flag = 0,
221  .general_non_packed_constraint_flag = 1,
222  .general_frame_only_constraint_flag = 1,
223 
224  .general_level_idc = avctx->level,
225  };
227 
229  vps->vps_max_dec_pic_buffering_minus1[0] = (ctx->b_per_p > 0) + 1;
230  vps->vps_max_num_reorder_pics[0] = (ctx->b_per_p > 0);
231  vps->vps_max_latency_increase_plus1[0] = 0;
232 
233  vps->vps_max_layer_id = 0;
234  vps->vps_num_layer_sets_minus1 = 0;
235  vps->layer_id_included_flag[0][0] = 1;
236 
238  if (avctx->framerate.num > 0 && avctx->framerate.den > 0) {
239  vps->vps_num_units_in_tick = avctx->framerate.den;
240  vps->vps_time_scale = avctx->framerate.num;
243  } else {
244  vps->vps_num_units_in_tick = avctx->time_base.num;
245  vps->vps_time_scale = avctx->time_base.den;
247  }
248  vps->vps_num_hrd_parameters = 0;
249 
250 
251  // SPS
252 
255  .nuh_layer_id = 0,
256  .nuh_temporal_id_plus1 = 1,
257  };
258 
260 
263 
265 
266  sps->sps_seq_parameter_set_id = 0;
267 
268  sps->chroma_format_idc = 1; // YUV 4:2:0.
270 
273 
274  if (avctx->width != ctx->surface_width ||
275  avctx->height != ctx->surface_height) {
276  sps->conformance_window_flag = 1;
277  sps->conf_win_left_offset = 0;
278  sps->conf_win_right_offset =
279  (ctx->surface_width - avctx->width) / 2;
280  sps->conf_win_top_offset = 0;
282  (ctx->surface_height - avctx->height) / 2;
283  } else {
284  sps->conformance_window_flag = 0;
285  }
286 
287  sps->bit_depth_luma_minus8 =
288  avctx->profile == FF_PROFILE_HEVC_MAIN_10 ? 2 : 0;
290 
292 
295  for (i = 0; i <= sps->sps_max_sub_layers_minus1; i++) {
298  sps->sps_max_num_reorder_pics[i] =
299  vps->vps_max_num_reorder_pics[i];
302  }
303 
304  // These have to come from the capabilities of the encoder. We have no
305  // way to query them, so just hardcode parameters which work on the Intel
306  // driver.
307  // CTB size from 8x8 to 32x32.
310  // Transform size from 4x4 to 32x32.
313  // Full transform hierarchy allowed (2-5).
316  // AMP works.
317  sps->amp_enabled_flag = 1;
318  // SAO and temporal MVP do not work.
321 
322  sps->pcm_enabled_flag = 0;
323 
324  // STRPSs should ideally be here rather than defined individually in
325  // each slice, but the structure isn't completely fixed so for now
326  // don't bother.
329 
331 
332  if (avctx->sample_aspect_ratio.num != 0 &&
333  avctx->sample_aspect_ratio.den != 0) {
334  static const AVRational sar_idc[] = {
335  { 0, 0 },
336  { 1, 1 }, { 12, 11 }, { 10, 11 }, { 16, 11 },
337  { 40, 33 }, { 24, 11 }, { 20, 11 }, { 32, 11 },
338  { 80, 33 }, { 18, 11 }, { 15, 11 }, { 64, 33 },
339  { 160, 99 }, { 4, 3 }, { 3, 2 }, { 2, 1 },
340  };
341  int i;
342  for (i = 0; i < FF_ARRAY_ELEMS(sar_idc); i++) {
343  if (avctx->sample_aspect_ratio.num == sar_idc[i].num &&
344  avctx->sample_aspect_ratio.den == sar_idc[i].den) {
345  vui->aspect_ratio_idc = i;
346  break;
347  }
348  }
349  if (i >= FF_ARRAY_ELEMS(sar_idc)) {
350  vui->aspect_ratio_idc = 255;
351  vui->sar_width = avctx->sample_aspect_ratio.num;
352  vui->sar_height = avctx->sample_aspect_ratio.den;
353  }
355  }
356 
357  if (avctx->color_range != AVCOL_RANGE_UNSPECIFIED ||
359  avctx->color_trc != AVCOL_TRC_UNSPECIFIED ||
360  avctx->colorspace != AVCOL_SPC_UNSPECIFIED) {
362  vui->video_format = 5; // Unspecified.
363  vui->video_full_range_flag =
364  avctx->color_range == AVCOL_RANGE_JPEG;
365 
366  if (avctx->color_primaries != AVCOL_PRI_UNSPECIFIED ||
367  avctx->color_trc != AVCOL_TRC_UNSPECIFIED ||
368  avctx->colorspace != AVCOL_SPC_UNSPECIFIED) {
370  vui->colour_primaries = avctx->color_primaries;
371  vui->transfer_characteristics = avctx->color_trc;
372  vui->matrix_coefficients = avctx->colorspace;
373  }
374  } else {
375  vui->video_format = 5;
376  vui->video_full_range_flag = 0;
377  vui->colour_primaries = avctx->color_primaries;
378  vui->transfer_characteristics = avctx->color_trc;
379  vui->matrix_coefficients = avctx->colorspace;
380  }
381 
386  avctx->chroma_sample_location - 1;
387  }
388 
391  vui->vui_time_scale = vps->vps_time_scale;
395 
399  vui->max_bytes_per_pic_denom = 0;
400  vui->max_bits_per_min_cu_denom = 0;
402  vui->log2_max_mv_length_vertical = 15;
403 
404 
405  // PPS
406 
409  .nuh_layer_id = 0,
410  .nuh_temporal_id_plus1 = 1,
411  };
412 
413  pps->pps_pic_parameter_set_id = 0;
415 
418 
419  pps->init_qp_minus26 = priv->fixed_qp_idr - 26;
420 
421  pps->cu_qp_delta_enabled_flag = (ctx->va_rc_mode != VA_RC_CQP);
422  pps->diff_cu_qp_delta_depth = 0;
423 
425 
426 
427  // Fill VAAPI parameter buffers.
428 
429  *vseq = (VAEncSequenceParameterBufferHEVC) {
430  .general_profile_idc = vps->profile_tier_level.general_profile_idc,
431  .general_level_idc = vps->profile_tier_level.general_level_idc,
432  .general_tier_flag = vps->profile_tier_level.general_tier_flag,
433 
434  .intra_period = avctx->gop_size,
435  .intra_idr_period = avctx->gop_size,
436  .ip_period = ctx->b_per_p + 1,
437  .bits_per_second = avctx->bit_rate,
438 
439  .pic_width_in_luma_samples = sps->pic_width_in_luma_samples,
440  .pic_height_in_luma_samples = sps->pic_height_in_luma_samples,
441 
442  .seq_fields.bits = {
443  .chroma_format_idc = sps->chroma_format_idc,
444  .separate_colour_plane_flag = sps->separate_colour_plane_flag,
445  .bit_depth_luma_minus8 = sps->bit_depth_luma_minus8,
446  .bit_depth_chroma_minus8 = sps->bit_depth_chroma_minus8,
447  .scaling_list_enabled_flag = sps->scaling_list_enabled_flag,
448  .strong_intra_smoothing_enabled_flag =
450  .amp_enabled_flag = sps->amp_enabled_flag,
451  .sample_adaptive_offset_enabled_flag =
453  .pcm_enabled_flag = sps->pcm_enabled_flag,
454  .pcm_loop_filter_disabled_flag = sps->pcm_loop_filter_disabled_flag,
455  .sps_temporal_mvp_enabled_flag = sps->sps_temporal_mvp_enabled_flag,
456  },
457 
458  .log2_min_luma_coding_block_size_minus3 =
460  .log2_diff_max_min_luma_coding_block_size =
462  .log2_min_transform_block_size_minus2 =
464  .log2_diff_max_min_transform_block_size =
466  .max_transform_hierarchy_depth_inter =
468  .max_transform_hierarchy_depth_intra =
470 
471  .pcm_sample_bit_depth_luma_minus1 =
473  .pcm_sample_bit_depth_chroma_minus1 =
475  .log2_min_pcm_luma_coding_block_size_minus3 =
477  .log2_max_pcm_luma_coding_block_size_minus3 =
480 
481  .vui_parameters_present_flag = 0,
482  };
483 
484  *vpic = (VAEncPictureParameterBufferHEVC) {
485  .decoded_curr_pic = {
486  .picture_id = VA_INVALID_ID,
487  .flags = VA_PICTURE_HEVC_INVALID,
488  },
489 
490  .coded_buf = VA_INVALID_ID,
491 
492  .collocated_ref_pic_index = 0xff,
493 
494  .last_picture = 0,
495 
496  .pic_init_qp = pps->init_qp_minus26 + 26,
497  .diff_cu_qp_delta_depth = pps->diff_cu_qp_delta_depth,
498  .pps_cb_qp_offset = pps->pps_cb_qp_offset,
499  .pps_cr_qp_offset = pps->pps_cr_qp_offset,
500 
501  .num_tile_columns_minus1 = pps->num_tile_columns_minus1,
502  .num_tile_rows_minus1 = pps->num_tile_rows_minus1,
503 
504  .log2_parallel_merge_level_minus2 = pps->log2_parallel_merge_level_minus2,
505  .ctu_max_bitsize_allowed = 0,
506 
507  .num_ref_idx_l0_default_active_minus1 =
509  .num_ref_idx_l1_default_active_minus1 =
511 
512  .slice_pic_parameter_set_id = pps->pps_pic_parameter_set_id,
513 
514  .pic_fields.bits = {
515  .sign_data_hiding_enabled_flag = pps->sign_data_hiding_enabled_flag,
516  .constrained_intra_pred_flag = pps->constrained_intra_pred_flag,
517  .transform_skip_enabled_flag = pps->transform_skip_enabled_flag,
518  .cu_qp_delta_enabled_flag = pps->cu_qp_delta_enabled_flag,
519  .weighted_pred_flag = pps->weighted_pred_flag,
520  .weighted_bipred_flag = pps->weighted_bipred_flag,
521  .transquant_bypass_enabled_flag = pps->transquant_bypass_enabled_flag,
522  .tiles_enabled_flag = pps->tiles_enabled_flag,
523  .entropy_coding_sync_enabled_flag = pps->entropy_coding_sync_enabled_flag,
524  .loop_filter_across_tiles_enabled_flag =
526  .scaling_list_data_present_flag = (sps->sps_scaling_list_data_present_flag |
528  .screen_content_flag = 0,
529  .enable_gpu_weighted_prediction = 0,
530  .no_output_of_prior_pics_flag = 0,
531  },
532  };
533 
534  return 0;
535 }
536 
538  VAAPIEncodePicture *pic)
539 {
540  VAAPIEncodeContext *ctx = avctx->priv_data;
541  VAAPIEncodeH265Context *priv = ctx->priv_data;
543  VAEncPictureParameterBufferHEVC *vpic = pic->codec_picture_params;
544  int i;
545 
546  if (pic->type == PICTURE_TYPE_IDR) {
547  av_assert0(pic->display_order == pic->encode_order);
548 
549  priv->last_idr_frame = pic->display_order;
550 
552  priv->slice_type = HEVC_SLICE_I;
553  priv->pic_type = 0;
554  } else {
555  av_assert0(pic->encode_order > priv->last_idr_frame);
556 
557  if (pic->type == PICTURE_TYPE_I) {
559  priv->slice_type = HEVC_SLICE_I;
560  priv->pic_type = 0;
561  } else if (pic->type == PICTURE_TYPE_P) {
562  av_assert0(pic->refs[0]);
564  priv->slice_type = HEVC_SLICE_P;
565  priv->pic_type = 1;
566  } else {
567  av_assert0(pic->refs[0] && pic->refs[1]);
568  if (pic->refs[1]->type == PICTURE_TYPE_I)
570  else
572  priv->slice_type = HEVC_SLICE_B;
573  priv->pic_type = 2;
574  }
575  }
576  priv->pic_order_cnt = pic->display_order - priv->last_idr_frame;
577 
578  if (opt->aud) {
579  priv->aud_needed = 1;
582  .nuh_layer_id = 0,
583  .nuh_temporal_id_plus1 = 1,
584  };
585  priv->aud.pic_type = priv->pic_type;
586  } else {
587  priv->aud_needed = 0;
588  }
589 
590  vpic->decoded_curr_pic = (VAPictureHEVC) {
591  .picture_id = pic->recon_surface,
592  .pic_order_cnt = priv->pic_order_cnt,
593  .flags = 0,
594  };
595 
596  for (i = 0; i < pic->nb_refs; i++) {
597  VAAPIEncodePicture *ref = pic->refs[i];
598  av_assert0(ref && ref->encode_order < pic->encode_order);
599 
600  vpic->reference_frames[i] = (VAPictureHEVC) {
601  .picture_id = ref->recon_surface,
602  .pic_order_cnt = ref->display_order - priv->last_idr_frame,
603  .flags = (ref->display_order < pic->display_order ?
604  VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE : 0) |
605  (ref->display_order > pic->display_order ?
606  VA_PICTURE_HEVC_RPS_ST_CURR_AFTER : 0),
607  };
608  }
609  for (; i < FF_ARRAY_ELEMS(vpic->reference_frames); i++) {
610  vpic->reference_frames[i] = (VAPictureHEVC) {
611  .picture_id = VA_INVALID_ID,
612  .flags = VA_PICTURE_HEVC_INVALID,
613  };
614  }
615 
616  vpic->coded_buf = pic->output_buffer;
617 
618  vpic->nal_unit_type = priv->slice_nal_unit;
619 
620  switch (pic->type) {
621  case PICTURE_TYPE_IDR:
622  vpic->pic_fields.bits.idr_pic_flag = 1;
623  vpic->pic_fields.bits.coding_type = 1;
624  vpic->pic_fields.bits.reference_pic_flag = 1;
625  break;
626  case PICTURE_TYPE_I:
627  vpic->pic_fields.bits.idr_pic_flag = 0;
628  vpic->pic_fields.bits.coding_type = 1;
629  vpic->pic_fields.bits.reference_pic_flag = 1;
630  break;
631  case PICTURE_TYPE_P:
632  vpic->pic_fields.bits.idr_pic_flag = 0;
633  vpic->pic_fields.bits.coding_type = 2;
634  vpic->pic_fields.bits.reference_pic_flag = 1;
635  break;
636  case PICTURE_TYPE_B:
637  vpic->pic_fields.bits.idr_pic_flag = 0;
638  vpic->pic_fields.bits.coding_type = 3;
639  vpic->pic_fields.bits.reference_pic_flag = 0;
640  break;
641  default:
642  av_assert0(0 && "invalid picture type");
643  }
644 
645  pic->nb_slices = 1;
646 
647  return 0;
648 }
649 
651  VAAPIEncodePicture *pic,
653 {
654  VAAPIEncodeContext *ctx = avctx->priv_data;
655  VAAPIEncodeH265Context *priv = ctx->priv_data;
656  const H265RawSPS *sps = &priv->sps;
657  const H265RawPPS *pps = &priv->pps;
658  H265RawSliceHeader *sh = &priv->slice.header;
659  VAEncPictureParameterBufferHEVC *vpic = pic->codec_picture_params;
660  VAEncSliceParameterBufferHEVC *vslice = slice->codec_slice_params;
661  int i;
662 
664  .nal_unit_type = priv->slice_nal_unit,
665  .nuh_layer_id = 0,
666  .nuh_temporal_id_plus1 = 1,
667  };
668 
670 
671  // Currently we only support one slice per frame.
673  sh->slice_segment_address = 0;
674 
675  sh->slice_type = priv->slice_type;
676 
678  (1 << (sps->log2_max_pic_order_cnt_lsb_minus4 + 4)) - 1;
679 
680  if (pic->type != PICTURE_TYPE_IDR) {
681  H265RawSTRefPicSet *rps;
682  VAAPIEncodePicture *st;
683  int used;
684 
686 
687  rps = &sh->short_term_ref_pic_set;
688  memset(rps, 0, sizeof(*rps));
689 
690  for (st = ctx->pic_start; st; st = st->next) {
691  if (st->encode_order >= pic->encode_order) {
692  // Not yet in DPB.
693  continue;
694  }
695  used = 0;
696  for (i = 0; i < pic->nb_refs; i++) {
697  if (pic->refs[i] == st)
698  used = 1;
699  }
700  if (!used) {
701  // Usually each picture always uses all of the others in the
702  // DPB as references. The one case we have to treat here is
703  // a non-IDR IRAP picture, which may need to hold unused
704  // references across itself to be used for the decoding of
705  // following RASL pictures. This looks for such an RASL
706  // picture, and keeps the reference if there is one.
707  VAAPIEncodePicture *rp;
708  for (rp = ctx->pic_start; rp; rp = rp->next) {
709  if (rp->encode_order < pic->encode_order)
710  continue;
711  if (rp->type != PICTURE_TYPE_B)
712  continue;
713  if (rp->refs[0] == st && rp->refs[1] == pic)
714  break;
715  }
716  if (!rp)
717  continue;
718  }
719  // This only works for one instance of each (delta_poc_sN_minus1
720  // is relative to the previous frame in the list, not relative to
721  // the current frame directly).
722  if (st->display_order < pic->display_order) {
724  pic->display_order - st->display_order - 1;
726  ++rps->num_negative_pics;
727  } else {
729  st->display_order - pic->display_order - 1;
731  ++rps->num_positive_pics;
732  }
733  }
734 
735  sh->num_long_term_sps = 0;
736  sh->num_long_term_pics = 0;
737 
742  sh->collocated_ref_idx = 0;
743  }
744 
748  }
749 
752 
753  if (pic->type == PICTURE_TYPE_B)
754  sh->slice_qp_delta = priv->fixed_qp_b - (pps->init_qp_minus26 + 26);
755  else if (pic->type == PICTURE_TYPE_P)
756  sh->slice_qp_delta = priv->fixed_qp_p - (pps->init_qp_minus26 + 26);
757  else
758  sh->slice_qp_delta = priv->fixed_qp_idr - (pps->init_qp_minus26 + 26);
759 
760 
761  *vslice = (VAEncSliceParameterBufferHEVC) {
762  .slice_segment_address = sh->slice_segment_address,
763  .num_ctu_in_slice = priv->ctu_width * priv->ctu_height,
764 
765  .slice_type = sh->slice_type,
766  .slice_pic_parameter_set_id = sh->slice_pic_parameter_set_id,
767 
768  .num_ref_idx_l0_active_minus1 = sh->num_ref_idx_l0_active_minus1,
769  .num_ref_idx_l1_active_minus1 = sh->num_ref_idx_l1_active_minus1,
770 
771  .luma_log2_weight_denom = sh->luma_log2_weight_denom,
772  .delta_chroma_log2_weight_denom = sh->delta_chroma_log2_weight_denom,
773 
774  .max_num_merge_cand = 5 - sh->five_minus_max_num_merge_cand,
775 
776  .slice_qp_delta = sh->slice_qp_delta,
777  .slice_cb_qp_offset = sh->slice_cb_qp_offset,
778  .slice_cr_qp_offset = sh->slice_cr_qp_offset,
779 
780  .slice_beta_offset_div2 = sh->slice_beta_offset_div2,
781  .slice_tc_offset_div2 = sh->slice_tc_offset_div2,
782 
783  .slice_fields.bits = {
784  .last_slice_of_pic_flag = 1,
785  .dependent_slice_segment_flag = sh->dependent_slice_segment_flag,
786  .colour_plane_id = sh->colour_plane_id,
787  .slice_temporal_mvp_enabled_flag =
789  .slice_sao_luma_flag = sh->slice_sao_luma_flag,
790  .slice_sao_chroma_flag = sh->slice_sao_chroma_flag,
791  .num_ref_idx_active_override_flag =
793  .mvd_l1_zero_flag = sh->mvd_l1_zero_flag,
794  .cabac_init_flag = sh->cabac_init_flag,
795  .slice_deblocking_filter_disabled_flag =
797  .slice_loop_filter_across_slices_enabled_flag =
799  .collocated_from_l0_flag = sh->collocated_from_l0_flag,
800  },
801  };
802 
803  for (i = 0; i < FF_ARRAY_ELEMS(vslice->ref_pic_list0); i++) {
804  vslice->ref_pic_list0[i].picture_id = VA_INVALID_ID;
805  vslice->ref_pic_list0[i].flags = VA_PICTURE_HEVC_INVALID;
806  vslice->ref_pic_list1[i].picture_id = VA_INVALID_ID;
807  vslice->ref_pic_list1[i].flags = VA_PICTURE_HEVC_INVALID;
808  }
809 
810  av_assert0(pic->nb_refs <= 2);
811  if (pic->nb_refs >= 1) {
812  // Backward reference for P- or B-frame.
813  av_assert0(pic->type == PICTURE_TYPE_P ||
814  pic->type == PICTURE_TYPE_B);
815  vslice->ref_pic_list0[0] = vpic->reference_frames[0];
816  }
817  if (pic->nb_refs >= 2) {
818  // Forward reference for B-frame.
819  av_assert0(pic->type == PICTURE_TYPE_B);
820  vslice->ref_pic_list1[0] = vpic->reference_frames[1];
821  }
822 
823  return 0;
824 }
825 
827 {
828  VAAPIEncodeContext *ctx = avctx->priv_data;
829  VAAPIEncodeH265Context *priv = ctx->priv_data;
831  int err;
832 
833  err = ff_cbs_init(&priv->cbc, AV_CODEC_ID_HEVC, avctx);
834  if (err < 0)
835  return err;
836 
837  priv->ctu_width = FFALIGN(ctx->surface_width, 32) / 32;
838  priv->ctu_height = FFALIGN(ctx->surface_height, 32) / 32;
839 
840  av_log(avctx, AV_LOG_VERBOSE, "Input %ux%u -> Surface %ux%u -> CTU %ux%u.\n",
841  avctx->width, avctx->height, ctx->surface_width,
842  ctx->surface_height, priv->ctu_width, priv->ctu_height);
843 
844  if (ctx->va_rc_mode == VA_RC_CQP) {
845  priv->fixed_qp_p = opt->qp;
846  if (avctx->i_quant_factor > 0.0)
847  priv->fixed_qp_idr = (int)((priv->fixed_qp_p * avctx->i_quant_factor +
848  avctx->i_quant_offset) + 0.5);
849  else
850  priv->fixed_qp_idr = priv->fixed_qp_p;
851  if (avctx->b_quant_factor > 0.0)
852  priv->fixed_qp_b = (int)((priv->fixed_qp_p * avctx->b_quant_factor +
853  avctx->b_quant_offset) + 0.5);
854  else
855  priv->fixed_qp_b = priv->fixed_qp_p;
856 
857  av_log(avctx, AV_LOG_DEBUG, "Using fixed QP = "
858  "%d / %d / %d for IDR- / P- / B-frames.\n",
859  priv->fixed_qp_idr, priv->fixed_qp_p, priv->fixed_qp_b);
860 
861  } else if (ctx->va_rc_mode == VA_RC_CBR ||
862  ctx->va_rc_mode == VA_RC_VBR) {
863  // These still need to be set for pic_init_qp/slice_qp_delta.
864  priv->fixed_qp_idr = 30;
865  priv->fixed_qp_p = 30;
866  priv->fixed_qp_b = 30;
867 
868  av_log(avctx, AV_LOG_DEBUG, "Using %s-bitrate = %"PRId64" bps.\n",
869  ctx->va_rc_mode == VA_RC_CBR ? "constant" : "variable",
870  avctx->bit_rate);
871 
872  } else {
873  av_assert0(0 && "Invalid RC mode.");
874  }
875 
876  return 0;
877 }
878 
881 
882  .configure = &vaapi_encode_h265_configure,
883 
884  .sequence_params_size = sizeof(VAEncSequenceParameterBufferHEVC),
885  .init_sequence_params = &vaapi_encode_h265_init_sequence_params,
886 
887  .picture_params_size = sizeof(VAEncPictureParameterBufferHEVC),
888  .init_picture_params = &vaapi_encode_h265_init_picture_params,
889 
890  .slice_params_size = sizeof(VAEncSliceParameterBufferHEVC),
891  .init_slice_params = &vaapi_encode_h265_init_slice_params,
892 
893  .sequence_header_type = VAEncPackedHeaderSequence,
894  .write_sequence_header = &vaapi_encode_h265_write_sequence_header,
895 
896  .slice_header_type = VAEncPackedHeaderHEVC_Slice,
897  .write_slice_header = &vaapi_encode_h265_write_slice_header,
898 };
899 
901 {
902  VAAPIEncodeContext *ctx = avctx->priv_data;
905 
906  ctx->codec = &vaapi_encode_type_h265;
907 
908  if (avctx->profile == FF_PROFILE_UNKNOWN)
909  avctx->profile = opt->profile;
910  if (avctx->level == FF_LEVEL_UNKNOWN)
911  avctx->level = opt->level;
912 
913  switch (avctx->profile) {
915  case FF_PROFILE_UNKNOWN:
916  ctx->va_profile = VAProfileHEVCMain;
917  ctx->va_rt_format = VA_RT_FORMAT_YUV420;
918  break;
920 #ifdef VA_RT_FORMAT_YUV420_10BPP
921  ctx->va_profile = VAProfileHEVCMain10;
922  ctx->va_rt_format = VA_RT_FORMAT_YUV420_10BPP;
923  break;
924 #else
925  av_log(avctx, AV_LOG_ERROR, "10-bit encoding is not "
926  "supported with this VAAPI version.\n");
927  return AVERROR(ENOSYS);
928 #endif
929  default:
930  av_log(avctx, AV_LOG_ERROR, "Unknown H.265 profile %d.\n",
931  avctx->profile);
932  return AVERROR(EINVAL);
933  }
934  ctx->va_entrypoint = VAEntrypointEncSlice;
935 
936  if (avctx->bit_rate > 0) {
937  if (avctx->rc_max_rate == avctx->bit_rate)
938  ctx->va_rc_mode = VA_RC_CBR;
939  else
940  ctx->va_rc_mode = VA_RC_VBR;
941  } else
942  ctx->va_rc_mode = VA_RC_CQP;
943 
944  ctx->va_packed_headers =
945  VA_ENC_PACKED_HEADER_SEQUENCE | // VPS, SPS and PPS.
946  VA_ENC_PACKED_HEADER_SLICE; // Slice headers.
947 
948  ctx->surface_width = FFALIGN(avctx->width, 16);
949  ctx->surface_height = FFALIGN(avctx->height, 16);
950 
951  return ff_vaapi_encode_init(avctx);
952 }
953 
955 {
956  VAAPIEncodeContext *ctx = avctx->priv_data;
957  VAAPIEncodeH265Context *priv = ctx->priv_data;
958 
959  if (priv)
960  ff_cbs_close(&priv->cbc);
961 
962  return ff_vaapi_encode_close(avctx);
963 }
964 
965 #define OFFSET(x) (offsetof(VAAPIEncodeContext, codec_options_data) + \
966  offsetof(VAAPIEncodeH265Options, x))
967 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
969  { "qp", "Constant QP (for P-frames; scaled by qfactor/qoffset for I/B)",
970  OFFSET(qp), AV_OPT_TYPE_INT, { .i64 = 25 }, 0, 52, FLAGS },
971 
972  { "aud", "Include AUD",
973  OFFSET(aud), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS },
974 
975  { "profile", "Set profile (general_profile_idc)",
977  { .i64 = FF_PROFILE_HEVC_MAIN }, 0x00, 0xff, FLAGS, "profile" },
978 
979 #define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
980  { .i64 = value }, 0, 0, FLAGS, "profile"
981  { PROFILE("main", FF_PROFILE_HEVC_MAIN) },
982  { PROFILE("main10", FF_PROFILE_HEVC_MAIN_10) },
983 #undef PROFILE
984 
985  { "level", "Set level (general_level_idc)",
987  { .i64 = 153 }, 0x00, 0xff, FLAGS, "level" },
988 
989 #define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
990  { .i64 = value }, 0, 0, FLAGS, "level"
991  { LEVEL("1", 30) },
992  { LEVEL("2", 60) },
993  { LEVEL("2.1", 63) },
994  { LEVEL("3", 90) },
995  { LEVEL("3.1", 93) },
996  { LEVEL("4", 120) },
997  { LEVEL("4.1", 123) },
998  { LEVEL("5", 150) },
999  { LEVEL("5.1", 153) },
1000  { LEVEL("5.2", 156) },
1001  { LEVEL("6", 180) },
1002  { LEVEL("6.1", 183) },
1003  { LEVEL("6.2", 186) },
1004 #undef LEVEL
1005 
1006  { NULL },
1007 };
1008 
1010  { "b", "0" },
1011  { "bf", "2" },
1012  { "g", "120" },
1013  { "i_qfactor", "1" },
1014  { "i_qoffset", "0" },
1015  { "b_qfactor", "6/5" },
1016  { "b_qoffset", "0" },
1017  { NULL },
1018 };
1019 
1021  .class_name = "h265_vaapi",
1022  .item_name = av_default_item_name,
1023  .option = vaapi_encode_h265_options,
1024  .version = LIBAVUTIL_VERSION_INT,
1025 };
1026 
1028  .name = "hevc_vaapi",
1029  .long_name = NULL_IF_CONFIG_SMALL("H.265/HEVC (VAAPI)"),
1030  .type = AVMEDIA_TYPE_VIDEO,
1031  .id = AV_CODEC_ID_HEVC,
1032  .priv_data_size = (sizeof(VAAPIEncodeContext) +
1033  sizeof(VAAPIEncodeH265Options)),
1035  .encode2 = &ff_vaapi_encode2,
1036  .close = &vaapi_encode_h265_close,
1037  .priv_class = &vaapi_encode_h265_class,
1038  .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
1039  .defaults = vaapi_encode_h265_defaults,
1040  .pix_fmts = (const enum AVPixelFormat[]) {
1043  },
1044  .wrapper_name = "vaapi",
1045 };
uint8_t sps_video_parameter_set_id
Definition: cbs_h265.h:224
uint8_t loop_filter_across_tiles_enabled_flag
Definition: cbs_h265.h:361
#define NULL
Definition: coverity.c:32
AVRational framerate
Definition: avcodec.h:3040
uint8_t transfer_characteristics
Definition: cbs_h265.h:118
uint8_t pps_pic_parameter_set_id
Definition: cbs_h265.h:326
VAProfile va_profile
Definition: vaapi_encode.h:96
uint8_t vps_poc_proportional_to_timing_flag
Definition: cbs_h265.h:185
uint8_t num_long_term_pics
Definition: cbs_h265.h:443
uint8_t num_ref_idx_l0_default_active_minus1
Definition: cbs_h265.h:335
VAEntrypoint va_entrypoint
Definition: vaapi_encode.h:98
uint8_t log2_max_mv_length_horizontal
Definition: cbs_h265.h:150
AVOption.
Definition: opt.h:246
uint8_t motion_vectors_over_pic_boundaries_flag
Definition: cbs_h265.h:145
uint8_t sps_sub_layer_ordering_info_present_flag
Definition: cbs_h265.h:250
uint8_t slice_temporal_mvp_enabled_flag
Definition: cbs_h265.h:450
char codec_options_data[0]
Definition: vaapi_encode.h:213
static int vaapi_encode_h265_add_nal(AVCodecContext *avctx, CodedBitstreamFragment *au, void *nal_unit)
int64_t bit_rate
the average bitrate
Definition: avcodec.h:1568
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
uint8_t bitstream_restriction_flag
Definition: cbs_h265.h:143
uint8_t bit_depth_luma_minus8
Definition: cbs_h265.h:245
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
#define AV_CODEC_CAP_HARDWARE
Codec is backed by a hardware implementation.
Definition: avcodec.h:1056
uint8_t vui_timing_info_present_flag
Definition: cbs_h265.h:135
int ff_cbs_init(CodedBitstreamContext **ctx_ptr, enum AVCodecID codec_id, void *log_ctx)
Create and initialise a new context for the given codec.
Definition: cbs.c:56
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:2148
uint8_t sps_max_sub_layers_minus1
Definition: cbs_h265.h:226
uint16_t slice_pic_order_cnt_lsb
Definition: cbs_h265.h:436
int num
Numerator.
Definition: rational.h:59
uint8_t sps_max_num_reorder_pics[HEVC_MAX_SUB_LAYERS]
Definition: cbs_h265.h:252
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:191
static const AVClass vaapi_encode_h265_class
size_t priv_data_size
Definition: vaapi_encode.h:218
uint8_t tiles_enabled_flag
Definition: cbs_h265.h:353
int ff_cbs_insert_unit_content(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, int position, CodedBitstreamUnitType type, void *content, AVBufferRef *content_buf)
Insert a new unit into a fragment with the given content.
Definition: cbs.c:518
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel...
Definition: avcodec.h:1896
int8_t slice_qp_delta
Definition: cbs_h265.h:487
uint8_t restricted_ref_pic_lists_flag
Definition: cbs_h265.h:146
H265RawProfileTierLevel profile_tier_level
Definition: cbs_h265.h:229
int8_t slice_beta_offset_div2
Definition: cbs_h265.h:497
static av_cold int vaapi_encode_h265_close(AVCodecContext *avctx)
uint8_t collocated_from_l0_flag
Definition: cbs_h265.h:466
CodedBitstreamContext * cbc
void * codec_sequence_params
Definition: vaapi_encode.h:168
uint8_t sample_adaptive_offset_enabled_flag
Definition: cbs_h265.h:267
uint8_t vui_parameters_present_flag
Definition: cbs_h265.h:287
uint8_t pcm_sample_bit_depth_luma_minus1
Definition: cbs_h265.h:270
static const AVCodecDefault vaapi_encode_h265_defaults[]
uint8_t bit_depth_chroma_minus8
Definition: cbs_h265.h:246
int profile
profile
Definition: avcodec.h:2843
AVCodec.
Definition: avcodec.h:3408
int8_t delta_chroma_log2_weight_denom
Definition: cbs_h265.h:470
float i_quant_offset
qscale offset between P and I-frames
Definition: avcodec.h:1829
uint8_t general_profile_idc
Definition: cbs_h265.h:39
uint8_t used_by_curr_pic_s0_flag[HEVC_MAX_REFS]
Definition: cbs_h265.h:209
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
Definition: avcodec.h:1640
uint16_t slice_segment_address
Definition: cbs_h265.h:428
unsigned int va_packed_headers
Definition: vaapi_encode.h:105
uint32_t vps_num_units_in_tick
Definition: cbs_h265.h:183
uint8_t sign_data_hiding_enabled_flag
Definition: cbs_h265.h:332
#define FF_LEVEL_UNKNOWN
Definition: avcodec.h:2954
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:72
uint16_t conf_win_right_offset
Definition: cbs_h265.h:241
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition: avcodec.h:984
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
uint8_t slice_deblocking_filter_disabled_flag
Definition: cbs_h265.h:496
uint16_t pic_height_in_luma_samples
Definition: cbs_h265.h:237
#define av_cold
Definition: attributes.h:82
int8_t slice_tc_offset_div2
Definition: cbs_h265.h:498
AVOptions.
int8_t slice_cb_qp_offset
Definition: cbs_h265.h:488
uint8_t colour_primaries
Definition: cbs_h265.h:117
uint8_t vps_sub_layer_ordering_info_present_flag
Definition: cbs_h265.h:173
float b_quant_factor
qscale factor between IP and B-frames If > 0 then the last P-frame quantizer will be used (q= lastp_q...
Definition: avcodec.h:1786
uint8_t five_minus_max_num_merge_cand
Definition: cbs_h265.h:484
#define FF_PROFILE_HEVC_MAIN
Definition: avcodec.h:2931
uint8_t video_format
Definition: cbs_h265.h:114
H265RawSTRefPicSet short_term_ref_pic_set
Definition: cbs_h265.h:439
uint8_t vps_timing_info_present_flag
Definition: cbs_h265.h:182
uint8_t log2_max_pic_order_cnt_lsb_minus4
Definition: cbs_h265.h:248
uint8_t constrained_intra_pred_flag
Definition: cbs_h265.h:340
uint32_t sps_max_latency_increase_plus1[HEVC_MAX_SUB_LAYERS]
Definition: cbs_h265.h:253
const char data[16]
Definition: mxf.c:90
uint8_t matrix_coefficients
Definition: cbs_h265.h:119
uint8_t aspect_ratio_info_present_flag
Definition: cbs_h265.h:105
uint8_t vps_max_sub_layers_minus1
Definition: cbs_h265.h:168
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:192
VASurfaceID recon_surface
Definition: vaapi_encode.h:71
uint8_t log2_min_luma_transform_block_size_minus2
Definition: cbs_h265.h:257
static const uint8_t header[24]
Definition: sdr2.c:67
uint8_t sps_scaling_list_data_present_flag
Definition: cbs_h265.h:263
uint8_t log2_min_pcm_luma_coding_block_size_minus3
Definition: cbs_h265.h:272
static int vaapi_encode_h265_write_access_unit(AVCodecContext *avctx, char *data, size_t *data_len, CodedBitstreamFragment *au)
#define FF_PROFILE_HEVC_MAIN_10
Definition: avcodec.h:2932
uint8_t video_full_range_flag
Definition: cbs_h265.h:115
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
Definition: avcodec.h:2155
#define FFALIGN(x, a)
Definition: macros.h:48
#define av_log(a,...)
uint8_t chroma_sample_loc_type_bottom_field
Definition: cbs_h265.h:123
uint16_t vps_num_layer_sets_minus1
Definition: cbs_h265.h:179
uint8_t video_signal_type_present_flag
Definition: cbs_h265.h:113
size_t data_size
The number of bytes in the bitstream.
Definition: cbs.h:127
H265RawVUI vui
Definition: cbs_h265.h:288
unsigned int va_rc_mode
Definition: vaapi_encode.h:102
uint32_t vui_num_ticks_poc_diff_one_minus1
Definition: cbs_h265.h:139
uint8_t vps_max_dec_pic_buffering_minus1[HEVC_MAX_SUB_LAYERS]
Definition: cbs_h265.h:174
uint8_t log2_max_mv_length_vertical
Definition: cbs_h265.h:151
uint8_t vps_video_parameter_set_id
Definition: cbs_h265.h:163
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
void ff_cbs_fragment_uninit(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag)
Free all allocated memory in a fragment.
Definition: cbs.c:121
uint8_t conformance_window_flag
Definition: cbs_h265.h:239
uint8_t max_bits_per_min_cu_denom
Definition: cbs_h265.h:149
#define AVERROR(e)
Definition: error.h:43
static av_cold int vaapi_encode_h265_init(AVCodecContext *avctx)
uint8_t dependent_slice_segment_flag
Definition: cbs_h265.h:427
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:186
uint8_t chroma_loc_info_present_flag
Definition: cbs_h265.h:121
#define PROFILE(name, value)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
static int vaapi_encode_h265_init_sequence_params(AVCodecContext *avctx)
uint8_t num_negative_pics
Definition: cbs_h265.h:206
simple assert() macros that are a bit more flexible than ISO C assert().
const char * name
Name of the codec implementation.
Definition: avcodec.h:3415
float i_quant_factor
qscale factor between P- and I-frames If > 0 then the last P-frame quantizer will be used (q = lastp_...
Definition: avcodec.h:1822
static const AVOption vaapi_encode_h265_options[]
static const AVCodecDefault defaults[]
Definition: amfenc_h264.c:361
uint8_t general_tier_flag
Definition: cbs_h265.h:38
uint8_t transform_skip_enabled_flag
Definition: cbs_h265.h:341
H265RawNALUnitHeader nal_unit_header
Definition: cbs_h265.h:161
uint8_t pcm_sample_bit_depth_chroma_minus1
Definition: cbs_h265.h:271
uint16_t sar_height
Definition: cbs_h265.h:108
void * codec_picture_params
Definition: vaapi_encode.h:80
size_t data_bit_padding
The number of bits which should be ignored in the final byte.
Definition: cbs.h:131
#define fail()
Definition: checkasm.h:116
uint8_t chroma_sample_loc_type_top_field
Definition: cbs_h265.h:122
uint8_t vps_max_layers_minus1
Definition: cbs_h265.h:167
uint32_t vui_time_scale
Definition: cbs_h265.h:137
static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx, VAAPIEncodePicture *pic, VAAPIEncodeSlice *slice)
uint16_t conf_win_bottom_offset
Definition: cbs_h265.h:243
H265RawNALUnitHeader nal_unit_header
Definition: cbs_h265.h:415
static const VAAPIEncodeType vaapi_encode_type_h265
uint8_t slice_type
Definition: cbs_h265.h:431
uint8_t scaling_list_enabled_flag
Definition: cbs_h265.h:262
H265RawProfileTierLevel profile_tier_level
Definition: cbs_h265.h:171
uint8_t pic_type
Definition: cbs_h265.h:417
uint16_t sar_width
Definition: cbs_h265.h:107
uint8_t transquant_bypass_enabled_flag
Definition: cbs_h265.h:352
int width
picture width / height.
Definition: avcodec.h:1690
uint32_t vps_max_latency_increase_plus1[HEVC_MAX_SUB_LAYERS]
Definition: cbs_h265.h:176
uint8_t vui_hrd_parameters_present_flag
Definition: cbs_h265.h:140
#define FLAGS
uint16_t delta_poc_s1_minus1[HEVC_MAX_REFS]
Definition: cbs_h265.h:210
uint8_t diff_cu_qp_delta_depth
Definition: cbs_h265.h:343
#define FF_PROFILE_UNKNOWN
Definition: avcodec.h:2844
av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
AVCodec ff_hevc_vaapi_encoder
AVFormatContext * ctx
Definition: movenc.c:48
uint8_t colour_plane_id
Definition: cbs_h265.h:434
uint8_t sps_seq_parameter_set_id
Definition: cbs_h265.h:231
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:2127
unsigned int va_rt_format
Definition: vaapi_encode.h:100
struct VAAPIEncodePicture * next
Definition: vaapi_encode.h:56
int level
level
Definition: avcodec.h:2953
uint16_t pic_width_in_luma_samples
Definition: cbs_h265.h:236
void * codec_picture_params
Definition: vaapi_encode.h:172
static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx, VAAPIEncodePicture *pic)
uint8_t vps_base_layer_available_flag
Definition: cbs_h265.h:166
uint8_t log2_min_luma_coding_block_size_minus3
Definition: cbs_h265.h:255
if(ret< 0)
Definition: vf_mcdeint.c:279
uint8_t * data
Pointer to the bitstream form of this fragment.
Definition: cbs.h:120
uint8_t pps_seq_parameter_set_id
Definition: cbs_h265.h:327
#define FF_ARRAY_ELEMS(a)
the normal 2^n-1 "JPEG" YUV ranges
Definition: pixfmt.h:499
int ff_cbs_write_fragment_data(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag)
Write the content of the fragment to its own internal buffer.
Definition: cbs.c:261
uint16_t vps_num_hrd_parameters
Definition: cbs_h265.h:187
uint8_t num_ref_idx_l1_active_minus1
Definition: cbs_h265.h:457
struct VAAPIEncodePicture * refs[MAX_PICTURE_REFERENCES]
Definition: vaapi_encode.h:83
uint8_t used_by_curr_pic_s1_flag[HEVC_MAX_REFS]
Definition: cbs_h265.h:211
#define OFFSET(x)
uint8_t max_bytes_per_pic_denom
Definition: cbs_h265.h:148
uint8_t num_ref_idx_l0_active_minus1
Definition: cbs_h265.h:456
H265RawNALUnitHeader nal_unit_header
Definition: cbs_h265.h:222
static int vaapi_encode_h265_write_slice_header(AVCodecContext *avctx, VAAPIEncodePicture *pic, VAAPIEncodeSlice *slice, char *data, size_t *data_len)
const struct VAAPIEncodeType * codec
Definition: vaapi_encode.h:93
uint8_t log2_diff_max_min_pcm_luma_coding_block_size
Definition: cbs_h265.h:273
Libavcodec external API header.
uint8_t entropy_coding_sync_enabled_flag
Definition: cbs_h265.h:354
uint8_t weighted_bipred_flag
Definition: cbs_h265.h:350
uint16_t conf_win_top_offset
Definition: cbs_h265.h:242
uint8_t sps_temporal_mvp_enabled_flag
Definition: cbs_h265.h:284
VAAPIEncodePicture * pic_start
Definition: vaapi_encode.h:175
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:114
uint8_t general_level_idc
Definition: cbs_h265.h:61
main external API structure.
Definition: avcodec.h:1518
int8_t slice_cr_qp_offset
Definition: cbs_h265.h:489
uint32_t vui_num_units_in_tick
Definition: cbs_h265.h:136
uint8_t short_term_ref_pic_set_sps_flag
Definition: cbs_h265.h:438
uint8_t slice_loop_filter_across_slices_enabled_flag
Definition: cbs_h265.h:499
uint8_t luma_log2_weight_denom
Definition: cbs_h265.h:469
uint8_t max_transform_hierarchy_depth_intra
Definition: cbs_h265.h:260
uint8_t mvd_l1_zero_flag
Definition: cbs_h265.h:464
uint8_t pps_loop_filter_across_slices_enabled_flag
Definition: cbs_h265.h:363
uint8_t weighted_pred_flag
Definition: cbs_h265.h:349
uint8_t sps_temporal_id_nesting_flag
Definition: cbs_h265.h:227
int8_t pps_cb_qp_offset
Definition: cbs_h265.h:345
uint8_t vps_max_layer_id
Definition: cbs_h265.h:178
uint16_t conf_win_left_offset
Definition: cbs_h265.h:240
Describe the class of an AVClass context structure.
Definition: log.h:67
uint8_t collocated_ref_idx
Definition: cbs_h265.h:467
uint8_t amp_enabled_flag
Definition: cbs_h265.h:266
Context structure for coded bitstream operations.
Definition: cbs.h:156
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:2141
Rational number (pair of numerator and denominator).
Definition: rational.h:58
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:2134
uint8_t chroma_format_idc
Definition: cbs_h265.h:233
void ff_cbs_close(CodedBitstreamContext **ctx_ptr)
Close a context and free all internal state.
Definition: cbs.c:95
float b_quant_offset
qscale offset between IP and B-frames
Definition: avcodec.h:1799
uint8_t general_profile_compatibility_flag[32]
Definition: cbs_h265.h:41
uint8_t vps_base_layer_internal_flag
Definition: cbs_h265.h:165
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:266
mfxU16 profile
Definition: qsvenc.c:44
uint8_t pcm_loop_filter_disabled_flag
Definition: cbs_h265.h:274
H265RawNALUnitHeader nal_unit_header
Definition: cbs_h265.h:324
static int vaapi_encode_h265_write_sequence_header(AVCodecContext *avctx, char *data, size_t *data_len)
uint8_t num_positive_pics
Definition: cbs_h265.h:207
uint8_t level
Definition: svq3.c:207
int8_t pps_cr_qp_offset
Definition: cbs_h265.h:346
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
Definition: avcodec.h:1712
uint8_t slice_pic_parameter_set_id
Definition: cbs_h265.h:425
uint8_t vui_poc_proportional_to_timing_flag
Definition: cbs_h265.h:138
int
uint8_t max_transform_hierarchy_depth_inter
Definition: cbs_h265.h:259
static av_cold int vaapi_encode_h265_configure(AVCodecContext *avctx)
common internal api header.
common internal and external API header
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:107
uint8_t pps_scaling_list_data_present_flag
Definition: cbs_h265.h:370
uint8_t cabac_init_flag
Definition: cbs_h265.h:465
uint8_t num_tile_rows_minus1
Definition: cbs_h265.h:357
uint8_t pcm_enabled_flag
Definition: cbs_h265.h:269
uint8_t slice_sao_luma_flag
Definition: cbs_h265.h:452
int ff_vaapi_encode2(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *input_image, int *got_packet)
Definition: vaapi_encode.c:853
uint8_t num_tile_columns_minus1
Definition: cbs_h265.h:356
int den
Denominator.
Definition: rational.h:60
uint16_t delta_poc_s0_minus1[HEVC_MAX_REFS]
Definition: cbs_h265.h:208
uint8_t log2_diff_max_min_luma_coding_block_size
Definition: cbs_h265.h:256
CodedBitstreamFragment current_access_unit
uint8_t slice_sao_chroma_flag
Definition: cbs_h265.h:453
void * priv_data
Definition: avcodec.h:1545
uint8_t vps_max_num_reorder_pics[HEVC_MAX_SUB_LAYERS]
Definition: cbs_h265.h:175
H265RawSliceHeader header
Definition: cbs_h265.h:511
uint32_t vps_time_scale
Definition: cbs_h265.h:184
uint8_t num_short_term_ref_pic_sets
Definition: cbs_h265.h:276
void * codec_slice_params
Definition: vaapi_encode.h:52
uint8_t log2_parallel_merge_level_minus2
Definition: cbs_h265.h:374
uint8_t vps_temporal_id_nesting_flag
Definition: cbs_h265.h:169
uint8_t aspect_ratio_idc
Definition: cbs_h265.h:106
#define LEVEL(name, value)
H265RawNALUnitHeader nal_unit_header
Definition: cbs_h265.h:421
uint8_t num_long_term_sps
Definition: cbs_h265.h:442
uint8_t general_profile_space
Definition: cbs_h265.h:37
uint8_t sps_max_dec_pic_buffering_minus1[HEVC_MAX_SUB_LAYERS]
Definition: cbs_h265.h:251
int8_t init_qp_minus26
Definition: cbs_h265.h:338
uint32_t vps_num_ticks_poc_diff_one_minus1
Definition: cbs_h265.h:186
uint8_t separate_colour_plane_flag
Definition: cbs_h265.h:234
VABufferID output_buffer
Definition: vaapi_encode.h:77
uint8_t strong_intra_smoothing_enabled_flag
Definition: cbs_h265.h:285
uint8_t colour_description_present_flag
Definition: cbs_h265.h:116
AVPixelFormat
Pixel format.
Definition: pixfmt.h:60
uint8_t log2_diff_max_min_luma_transform_block_size
Definition: cbs_h265.h:258
uint8_t long_term_ref_pics_present_flag
Definition: cbs_h265.h:279
uint8_t num_ref_idx_active_override_flag
Definition: cbs_h265.h:455
uint8_t layer_id_included_flag[HEVC_MAX_LAYER_SETS][HEVC_MAX_LAYERS]
Definition: cbs_h265.h:180
av_cold int ff_vaapi_encode_close(AVCodecContext *avctx)
uint8_t nal_unit_type
Definition: cbs_h265.h:31
int64_t rc_max_rate
maximum bitrate
Definition: avcodec.h:2391
uint8_t num_ref_idx_l1_default_active_minus1
Definition: cbs_h265.h:336
uint8_t first_slice_segment_in_pic_flag
Definition: cbs_h265.h:423
uint8_t cu_qp_delta_enabled_flag
Definition: cbs_h265.h:342
bitstream writer API