You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1258 lines
46KB

  1. /*
  2. * This file is part of Libav.
  3. *
  4. * Libav 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. * Libav 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 Libav; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17. */
  18. #include <va/va.h>
  19. #include <va/va_enc_hevc.h>
  20. #include "libavutil/avassert.h"
  21. #include "libavutil/internal.h"
  22. #include "libavutil/opt.h"
  23. #include "libavutil/pixfmt.h"
  24. #include "avcodec.h"
  25. #include "hevc.h"
  26. #include "internal.h"
  27. #include "put_bits.h"
  28. #include "vaapi_encode.h"
  29. #include "vaapi_encode_h26x.h"
  30. #define MAX_ST_REF_PIC_SETS 32
  31. #define MAX_DPB_PICS 16
  32. #define MAX_LAYERS 1
  33. typedef struct VAAPIEncodeH265STRPS {
  34. char inter_ref_pic_set_prediction_flag;
  35. unsigned int num_negative_pics;
  36. unsigned int num_positive_pics;
  37. unsigned int delta_poc_s0_minus1[MAX_DPB_PICS];
  38. char used_by_curr_pic_s0_flag[MAX_DPB_PICS];
  39. unsigned int delta_poc_s1_minus1[MAX_DPB_PICS];
  40. char used_by_curr_pic_s1_flag[MAX_DPB_PICS];
  41. } VAAPIEncodeH265STRPS;
  42. // This structure contains all possibly-useful per-sequence syntax elements
  43. // which are not already contained in the various VAAPI structures.
  44. typedef struct VAAPIEncodeH265MiscSequenceParams {
  45. // Parameter set IDs.
  46. unsigned int video_parameter_set_id;
  47. unsigned int seq_parameter_set_id;
  48. // Layering.
  49. unsigned int vps_max_layers_minus1;
  50. unsigned int vps_max_sub_layers_minus1;
  51. char vps_temporal_id_nesting_flag;
  52. unsigned int vps_max_layer_id;
  53. unsigned int vps_num_layer_sets_minus1;
  54. unsigned int sps_max_sub_layers_minus1;
  55. char sps_temporal_id_nesting_flag;
  56. char layer_id_included_flag[MAX_LAYERS][64];
  57. // Profile/tier/level parameters.
  58. char general_profile_compatibility_flag[32];
  59. char general_progressive_source_flag;
  60. char general_interlaced_source_flag;
  61. char general_non_packed_constraint_flag;
  62. char general_frame_only_constraint_flag;
  63. char general_inbld_flag;
  64. // Decode/display ordering parameters.
  65. unsigned int log2_max_pic_order_cnt_lsb_minus4;
  66. char vps_sub_layer_ordering_info_present_flag;
  67. unsigned int vps_max_dec_pic_buffering_minus1[MAX_LAYERS];
  68. unsigned int vps_max_num_reorder_pics[MAX_LAYERS];
  69. unsigned int vps_max_latency_increase_plus1[MAX_LAYERS];
  70. char sps_sub_layer_ordering_info_present_flag;
  71. unsigned int sps_max_dec_pic_buffering_minus1[MAX_LAYERS];
  72. unsigned int sps_max_num_reorder_pics[MAX_LAYERS];
  73. unsigned int sps_max_latency_increase_plus1[MAX_LAYERS];
  74. // Timing information.
  75. char vps_timing_info_present_flag;
  76. unsigned int vps_num_units_in_tick;
  77. unsigned int vps_time_scale;
  78. char vps_poc_proportional_to_timing_flag;
  79. unsigned int vps_num_ticks_poc_diff_minus1;
  80. // Cropping information.
  81. char conformance_window_flag;
  82. unsigned int conf_win_left_offset;
  83. unsigned int conf_win_right_offset;
  84. unsigned int conf_win_top_offset;
  85. unsigned int conf_win_bottom_offset;
  86. // Short-term reference picture sets.
  87. unsigned int num_short_term_ref_pic_sets;
  88. VAAPIEncodeH265STRPS st_ref_pic_set[MAX_ST_REF_PIC_SETS];
  89. // Long-term reference pictures.
  90. char long_term_ref_pics_present_flag;
  91. unsigned int num_long_term_ref_pics_sps;
  92. struct {
  93. unsigned int lt_ref_pic_poc_lsb_sps;
  94. char used_by_curr_pic_lt_sps_flag;
  95. } lt_ref_pic;
  96. // Deblocking filter control.
  97. char deblocking_filter_control_present_flag;
  98. char deblocking_filter_override_enabled_flag;
  99. char pps_deblocking_filter_disabled_flag;
  100. int pps_beta_offset_div2;
  101. int pps_tc_offset_div2;
  102. // Video Usability Information.
  103. char vui_parameters_present_flag;
  104. char aspect_ratio_info_present_flag;
  105. unsigned int aspect_ratio_idc;
  106. unsigned int sar_width;
  107. unsigned int sar_height;
  108. char video_signal_type_present_flag;
  109. unsigned int video_format;
  110. char video_full_range_flag;
  111. char colour_description_present_flag;
  112. unsigned int colour_primaries;
  113. unsigned int transfer_characteristics;
  114. unsigned int matrix_coeffs;
  115. // Oddments.
  116. char uniform_spacing_flag;
  117. char output_flag_present_flag;
  118. char cabac_init_present_flag;
  119. unsigned int num_extra_slice_header_bits;
  120. char lists_modification_present_flag;
  121. char pps_slice_chroma_qp_offsets_present_flag;
  122. char pps_slice_chroma_offset_list_enabled_flag;
  123. } VAAPIEncodeH265MiscSequenceParams;
  124. // This structure contains all possibly-useful per-slice syntax elements
  125. // which are not already contained in the various VAAPI structures.
  126. typedef struct VAAPIEncodeH265MiscSliceParams {
  127. // Slice segments.
  128. char first_slice_segment_in_pic_flag;
  129. unsigned int slice_segment_address;
  130. // Short-term reference picture sets.
  131. char short_term_ref_pic_set_sps_flag;
  132. unsigned int short_term_ref_pic_idx;
  133. VAAPIEncodeH265STRPS st_ref_pic_set;
  134. // Deblocking filter.
  135. char deblocking_filter_override_flag;
  136. // Oddments.
  137. char slice_reserved_flag[8];
  138. char no_output_of_prior_pics_flag;
  139. char pic_output_flag;
  140. } VAAPIEncodeH265MiscSliceParams;
  141. typedef struct VAAPIEncodeH265Slice {
  142. VAAPIEncodeH265MiscSliceParams misc_slice_params;
  143. int64_t pic_order_cnt;
  144. } VAAPIEncodeH265Slice;
  145. typedef struct VAAPIEncodeH265Context {
  146. VAAPIEncodeH265MiscSequenceParams misc_sequence_params;
  147. unsigned int ctu_width;
  148. unsigned int ctu_height;
  149. int fixed_qp_idr;
  150. int fixed_qp_p;
  151. int fixed_qp_b;
  152. int64_t last_idr_frame;
  153. } VAAPIEncodeH265Context;
  154. #define vseq_var(name) vseq->name, name
  155. #define vseq_field(name) vseq->seq_fields.bits.name, name
  156. #define vpic_var(name) vpic->name, name
  157. #define vpic_field(name) vpic->pic_fields.bits.name, name
  158. #define vslice_var(name) vslice->name, name
  159. #define vslice_field(name) vslice->slice_fields.bits.name, name
  160. #define mseq_var(name) mseq->name, name
  161. #define mslice_var(name) mslice->name, name
  162. #define mstrps_var(name) mstrps->name, name
  163. static void vaapi_encode_h265_write_nal_unit_header(PutBitContext *pbc,
  164. int nal_unit_type)
  165. {
  166. u(1, 0, forbidden_zero_bit);
  167. u(6, nal_unit_type, nal_unit_type);
  168. u(6, 0, nuh_layer_id);
  169. u(3, 1, nuh_temporal_id_plus1);
  170. }
  171. static void vaapi_encode_h265_write_rbsp_trailing_bits(PutBitContext *pbc)
  172. {
  173. u(1, 1, rbsp_stop_one_bit);
  174. while (put_bits_count(pbc) & 7)
  175. u(1, 0, rbsp_alignment_zero_bit);
  176. }
  177. static void vaapi_encode_h265_write_profile_tier_level(PutBitContext *pbc,
  178. VAAPIEncodeContext *ctx)
  179. {
  180. VAEncSequenceParameterBufferHEVC *vseq = ctx->codec_sequence_params;
  181. VAAPIEncodeH265Context *priv = ctx->priv_data;
  182. VAAPIEncodeH265MiscSequenceParams *mseq = &priv->misc_sequence_params;
  183. int j;
  184. if (1) {
  185. u(2, 0, general_profile_space);
  186. u(1, vseq_var(general_tier_flag));
  187. u(5, vseq_var(general_profile_idc));
  188. for (j = 0; j < 32; j++) {
  189. u(1, mseq_var(general_profile_compatibility_flag[j]));
  190. }
  191. u(1, mseq_var(general_progressive_source_flag));
  192. u(1, mseq_var(general_interlaced_source_flag));
  193. u(1, mseq_var(general_non_packed_constraint_flag));
  194. u(1, mseq_var(general_frame_only_constraint_flag));
  195. if (0) {
  196. // Not main profile.
  197. // Lots of extra constraint flags.
  198. } else {
  199. // put_bits only handles up to 31 bits.
  200. u(23, 0, general_reserved_zero_43bits);
  201. u(20, 0, general_reserved_zero_43bits);
  202. }
  203. if (vseq->general_profile_idc >= 1 && vseq->general_profile_idc <= 5) {
  204. u(1, mseq_var(general_inbld_flag));
  205. } else {
  206. u(1, 0, general_reserved_zero_bit);
  207. }
  208. }
  209. u(8, vseq_var(general_level_idc));
  210. // No sublayers.
  211. }
  212. static void vaapi_encode_h265_write_vps(PutBitContext *pbc,
  213. VAAPIEncodeContext *ctx)
  214. {
  215. VAAPIEncodeH265Context *priv = ctx->priv_data;
  216. VAAPIEncodeH265MiscSequenceParams *mseq = &priv->misc_sequence_params;
  217. int i, j;
  218. vaapi_encode_h265_write_nal_unit_header(pbc, NAL_VPS);
  219. u(4, mseq->video_parameter_set_id, vps_video_parameter_set_id);
  220. u(1, 1, vps_base_layer_internal_flag);
  221. u(1, 1, vps_base_layer_available_flag);
  222. u(6, mseq_var(vps_max_layers_minus1));
  223. u(3, mseq_var(vps_max_sub_layers_minus1));
  224. u(1, mseq_var(vps_temporal_id_nesting_flag));
  225. u(16, 0xffff, vps_reserved_0xffff_16bits);
  226. vaapi_encode_h265_write_profile_tier_level(pbc, ctx);
  227. u(1, mseq_var(vps_sub_layer_ordering_info_present_flag));
  228. for (i = (mseq->vps_sub_layer_ordering_info_present_flag ?
  229. 0 : mseq->vps_max_sub_layers_minus1);
  230. i <= mseq->vps_max_sub_layers_minus1; i++) {
  231. ue(mseq_var(vps_max_dec_pic_buffering_minus1[i]));
  232. ue(mseq_var(vps_max_num_reorder_pics[i]));
  233. ue(mseq_var(vps_max_latency_increase_plus1[i]));
  234. }
  235. u(6, mseq_var(vps_max_layer_id));
  236. ue(mseq_var(vps_num_layer_sets_minus1));
  237. for (i = 1; i <= mseq->vps_num_layer_sets_minus1; i++) {
  238. for (j = 0; j < mseq->vps_max_layer_id; j++)
  239. u(1, mseq_var(layer_id_included_flag[i][j]));
  240. }
  241. u(1, mseq_var(vps_timing_info_present_flag));
  242. if (mseq->vps_timing_info_present_flag) {
  243. u(1, 0, put_bits_hack_zero_bit);
  244. u(31, mseq_var(vps_num_units_in_tick));
  245. u(1, 0, put_bits_hack_zero_bit);
  246. u(31, mseq_var(vps_time_scale));
  247. u(1, mseq_var(vps_poc_proportional_to_timing_flag));
  248. if (mseq->vps_poc_proportional_to_timing_flag) {
  249. ue(mseq_var(vps_num_ticks_poc_diff_minus1));
  250. }
  251. ue(0, vps_num_hrd_parameters);
  252. }
  253. u(1, 0, vps_extension_flag);
  254. vaapi_encode_h265_write_rbsp_trailing_bits(pbc);
  255. }
  256. static void vaapi_encode_h265_write_st_ref_pic_set(PutBitContext *pbc,
  257. int st_rps_idx,
  258. VAAPIEncodeH265STRPS *mstrps)
  259. {
  260. int i;
  261. if (st_rps_idx != 0)
  262. u(1, mstrps_var(inter_ref_pic_set_prediction_flag));
  263. if (mstrps->inter_ref_pic_set_prediction_flag) {
  264. av_assert0(0 && "inter ref pic set prediction not supported");
  265. } else {
  266. ue(mstrps_var(num_negative_pics));
  267. ue(mstrps_var(num_positive_pics));
  268. for (i = 0; i < mstrps->num_negative_pics; i++) {
  269. ue(mstrps_var(delta_poc_s0_minus1[i]));
  270. u(1, mstrps_var(used_by_curr_pic_s0_flag[i]));
  271. }
  272. for (i = 0; i < mstrps->num_positive_pics; i++) {
  273. ue(mstrps_var(delta_poc_s1_minus1[i]));
  274. u(1, mstrps_var(used_by_curr_pic_s1_flag[i]));
  275. }
  276. }
  277. }
  278. static void vaapi_encode_h265_write_vui_parameters(PutBitContext *pbc,
  279. VAAPIEncodeContext *ctx)
  280. {
  281. VAAPIEncodeH265Context *priv = ctx->priv_data;
  282. VAAPIEncodeH265MiscSequenceParams *mseq = &priv->misc_sequence_params;
  283. u(1, mseq_var(aspect_ratio_info_present_flag));
  284. if (mseq->aspect_ratio_info_present_flag) {
  285. u(8, mseq_var(aspect_ratio_idc));
  286. if (mseq->aspect_ratio_idc == 255) {
  287. u(16, mseq_var(sar_width));
  288. u(16, mseq_var(sar_height));
  289. }
  290. }
  291. u(1, 0, overscan_info_present_flag);
  292. u(1, mseq_var(video_signal_type_present_flag));
  293. if (mseq->video_signal_type_present_flag) {
  294. u(3, mseq_var(video_format));
  295. u(1, mseq_var(video_full_range_flag));
  296. u(1, mseq_var(colour_description_present_flag));
  297. if (mseq->colour_description_present_flag) {
  298. u(8, mseq_var(colour_primaries));
  299. u(8, mseq_var(transfer_characteristics));
  300. u(8, mseq_var(matrix_coeffs));
  301. }
  302. }
  303. u(1, 0, chroma_loc_info_present_flag);
  304. u(1, 0, neutral_chroma_indication_flag);
  305. u(1, 0, field_seq_flag);
  306. u(1, 0, frame_field_info_present_flag);
  307. u(1, 0, default_display_window_flag);
  308. u(1, 0, vui_timing_info_present_flag);
  309. u(1, 0, bitstream_restriction_flag_flag);
  310. }
  311. static void vaapi_encode_h265_write_sps(PutBitContext *pbc,
  312. VAAPIEncodeContext *ctx)
  313. {
  314. VAEncSequenceParameterBufferHEVC *vseq = ctx->codec_sequence_params;
  315. VAAPIEncodeH265Context *priv = ctx->priv_data;
  316. VAAPIEncodeH265MiscSequenceParams *mseq = &priv->misc_sequence_params;
  317. int i;
  318. vaapi_encode_h265_write_nal_unit_header(pbc, NAL_SPS);
  319. u(4, mseq->video_parameter_set_id, sps_video_parameter_set_id);
  320. u(3, mseq_var(sps_max_sub_layers_minus1));
  321. u(1, mseq_var(sps_temporal_id_nesting_flag));
  322. vaapi_encode_h265_write_profile_tier_level(pbc, ctx);
  323. ue(mseq->seq_parameter_set_id, sps_seq_parameter_set_id);
  324. ue(vseq_field(chroma_format_idc));
  325. if (vseq->seq_fields.bits.chroma_format_idc == 3)
  326. u(1, 0, separate_colour_plane_flag);
  327. ue(vseq_var(pic_width_in_luma_samples));
  328. ue(vseq_var(pic_height_in_luma_samples));
  329. u(1, mseq_var(conformance_window_flag));
  330. if (mseq->conformance_window_flag) {
  331. ue(mseq_var(conf_win_left_offset));
  332. ue(mseq_var(conf_win_right_offset));
  333. ue(mseq_var(conf_win_top_offset));
  334. ue(mseq_var(conf_win_bottom_offset));
  335. }
  336. ue(vseq_field(bit_depth_luma_minus8));
  337. ue(vseq_field(bit_depth_chroma_minus8));
  338. ue(mseq_var(log2_max_pic_order_cnt_lsb_minus4));
  339. u(1, mseq_var(sps_sub_layer_ordering_info_present_flag));
  340. for (i = (mseq->sps_sub_layer_ordering_info_present_flag ?
  341. 0 : mseq->sps_max_sub_layers_minus1);
  342. i <= mseq->sps_max_sub_layers_minus1; i++) {
  343. ue(mseq_var(sps_max_dec_pic_buffering_minus1[i]));
  344. ue(mseq_var(sps_max_num_reorder_pics[i]));
  345. ue(mseq_var(sps_max_latency_increase_plus1[i]));
  346. }
  347. ue(vseq_var(log2_min_luma_coding_block_size_minus3));
  348. ue(vseq_var(log2_diff_max_min_luma_coding_block_size));
  349. ue(vseq_var(log2_min_transform_block_size_minus2));
  350. ue(vseq_var(log2_diff_max_min_transform_block_size));
  351. ue(vseq_var(max_transform_hierarchy_depth_inter));
  352. ue(vseq_var(max_transform_hierarchy_depth_intra));
  353. u(1, vseq_field(scaling_list_enabled_flag));
  354. if (vseq->seq_fields.bits.scaling_list_enabled_flag) {
  355. u(1, 0, sps_scaling_list_data_present_flag);
  356. }
  357. u(1, vseq_field(amp_enabled_flag));
  358. u(1, vseq_field(sample_adaptive_offset_enabled_flag));
  359. u(1, vseq_field(pcm_enabled_flag));
  360. if (vseq->seq_fields.bits.pcm_enabled_flag) {
  361. u(4, vseq_var(pcm_sample_bit_depth_luma_minus1));
  362. u(4, vseq_var(pcm_sample_bit_depth_chroma_minus1));
  363. ue(vseq_var(log2_min_pcm_luma_coding_block_size_minus3));
  364. ue(vseq->log2_max_pcm_luma_coding_block_size_minus3 -
  365. vseq->log2_min_pcm_luma_coding_block_size_minus3,
  366. log2_diff_max_min_pcm_luma_coding_block_size);
  367. u(1, vseq_field(pcm_loop_filter_disabled_flag));
  368. }
  369. ue(mseq_var(num_short_term_ref_pic_sets));
  370. for (i = 0; i < mseq->num_short_term_ref_pic_sets; i++)
  371. vaapi_encode_h265_write_st_ref_pic_set(pbc, i,
  372. &mseq->st_ref_pic_set[i]);
  373. u(1, mseq_var(long_term_ref_pics_present_flag));
  374. if (mseq->long_term_ref_pics_present_flag) {
  375. ue(0, num_long_term_ref_pics_sps);
  376. }
  377. u(1, vseq_field(sps_temporal_mvp_enabled_flag));
  378. u(1, vseq_field(strong_intra_smoothing_enabled_flag));
  379. u(1, mseq_var(vui_parameters_present_flag));
  380. if (mseq->vui_parameters_present_flag) {
  381. vaapi_encode_h265_write_vui_parameters(pbc, ctx);
  382. }
  383. u(1, 0, sps_extension_present_flag);
  384. vaapi_encode_h265_write_rbsp_trailing_bits(pbc);
  385. }
  386. static void vaapi_encode_h265_write_pps(PutBitContext *pbc,
  387. VAAPIEncodeContext *ctx)
  388. {
  389. VAEncPictureParameterBufferHEVC *vpic = ctx->codec_picture_params;
  390. VAAPIEncodeH265Context *priv = ctx->priv_data;
  391. VAAPIEncodeH265MiscSequenceParams *mseq = &priv->misc_sequence_params;
  392. int i;
  393. vaapi_encode_h265_write_nal_unit_header(pbc, NAL_PPS);
  394. ue(vpic->slice_pic_parameter_set_id, pps_pic_parameter_set_id);
  395. ue(mseq->seq_parameter_set_id, pps_seq_parameter_set_id);
  396. u(1, vpic_field(dependent_slice_segments_enabled_flag));
  397. u(1, mseq_var(output_flag_present_flag));
  398. u(3, mseq_var(num_extra_slice_header_bits));
  399. u(1, vpic_field(sign_data_hiding_enabled_flag));
  400. u(1, mseq_var(cabac_init_present_flag));
  401. ue(vpic_var(num_ref_idx_l0_default_active_minus1));
  402. ue(vpic_var(num_ref_idx_l1_default_active_minus1));
  403. se(vpic->pic_init_qp - 26, init_qp_minus26);
  404. u(1, vpic_field(constrained_intra_pred_flag));
  405. u(1, vpic_field(transform_skip_enabled_flag));
  406. u(1, vpic_field(cu_qp_delta_enabled_flag));
  407. if (vpic->pic_fields.bits.cu_qp_delta_enabled_flag)
  408. ue(vpic_var(diff_cu_qp_delta_depth));
  409. se(vpic_var(pps_cb_qp_offset));
  410. se(vpic_var(pps_cr_qp_offset));
  411. u(1, mseq_var(pps_slice_chroma_qp_offsets_present_flag));
  412. u(1, vpic_field(weighted_pred_flag));
  413. u(1, vpic_field(weighted_bipred_flag));
  414. u(1, vpic_field(transquant_bypass_enabled_flag));
  415. u(1, vpic_field(tiles_enabled_flag));
  416. u(1, vpic_field(entropy_coding_sync_enabled_flag));
  417. if (vpic->pic_fields.bits.tiles_enabled_flag) {
  418. ue(vpic_var(num_tile_columns_minus1));
  419. ue(vpic_var(num_tile_rows_minus1));
  420. u(1, mseq_var(uniform_spacing_flag));
  421. if (!mseq->uniform_spacing_flag) {
  422. for (i = 0; i < vpic->num_tile_columns_minus1; i++)
  423. ue(vpic_var(column_width_minus1[i]));
  424. for (i = 0; i < vpic->num_tile_rows_minus1; i++)
  425. ue(vpic_var(row_height_minus1[i]));
  426. }
  427. u(1, vpic_field(loop_filter_across_tiles_enabled_flag));
  428. }
  429. u(1, vpic_field(pps_loop_filter_across_slices_enabled_flag));
  430. u(1, mseq_var(deblocking_filter_control_present_flag));
  431. if (mseq->deblocking_filter_control_present_flag) {
  432. u(1, mseq_var(deblocking_filter_override_enabled_flag));
  433. u(1, mseq_var(pps_deblocking_filter_disabled_flag));
  434. if (!mseq->pps_deblocking_filter_disabled_flag) {
  435. se(mseq_var(pps_beta_offset_div2));
  436. se(mseq_var(pps_tc_offset_div2));
  437. }
  438. }
  439. u(1, 0, pps_scaling_list_data_present_flag);
  440. // No scaling list data.
  441. u(1, mseq_var(lists_modification_present_flag));
  442. ue(vpic_var(log2_parallel_merge_level_minus2));
  443. u(1, 0, slice_segment_header_extension_present_flag);
  444. u(1, 0, pps_extension_present_flag);
  445. vaapi_encode_h265_write_rbsp_trailing_bits(pbc);
  446. }
  447. static void vaapi_encode_h265_write_slice_header2(PutBitContext *pbc,
  448. VAAPIEncodeContext *ctx,
  449. VAAPIEncodePicture *pic,
  450. VAAPIEncodeSlice *slice)
  451. {
  452. VAEncSequenceParameterBufferHEVC *vseq = ctx->codec_sequence_params;
  453. VAEncPictureParameterBufferHEVC *vpic = pic->codec_picture_params;
  454. VAEncSliceParameterBufferHEVC *vslice = slice->codec_slice_params;
  455. VAAPIEncodeH265Context *priv = ctx->priv_data;
  456. VAAPIEncodeH265MiscSequenceParams *mseq = &priv->misc_sequence_params;
  457. VAAPIEncodeH265Slice *pslice = slice->priv_data;
  458. VAAPIEncodeH265MiscSliceParams *mslice = &pslice->misc_slice_params;
  459. int i;
  460. vaapi_encode_h265_write_nal_unit_header(pbc, vpic->nal_unit_type);
  461. u(1, mslice_var(first_slice_segment_in_pic_flag));
  462. if (vpic->nal_unit_type >= NAL_BLA_W_LP &&
  463. vpic->nal_unit_type <= 23)
  464. u(1, mslice_var(no_output_of_prior_pics_flag));
  465. ue(vslice_var(slice_pic_parameter_set_id));
  466. if (!mslice->first_slice_segment_in_pic_flag) {
  467. if (vpic->pic_fields.bits.dependent_slice_segments_enabled_flag)
  468. u(1, vslice_field(dependent_slice_segment_flag));
  469. u(av_log2((priv->ctu_width * priv->ctu_height) - 1) + 1,
  470. mslice_var(slice_segment_address));
  471. }
  472. if (!vslice->slice_fields.bits.dependent_slice_segment_flag) {
  473. for (i = 0; i < mseq->num_extra_slice_header_bits; i++)
  474. u(1, mslice_var(slice_reserved_flag[i]));
  475. ue(vslice_var(slice_type));
  476. if (mseq->output_flag_present_flag)
  477. u(1, 1, pic_output_flag);
  478. if (vseq->seq_fields.bits.separate_colour_plane_flag)
  479. u(2, vslice_field(colour_plane_id));
  480. if (vpic->nal_unit_type != NAL_IDR_W_RADL &&
  481. vpic->nal_unit_type != NAL_IDR_N_LP) {
  482. u(4 + mseq->log2_max_pic_order_cnt_lsb_minus4,
  483. (pslice->pic_order_cnt &
  484. ((1 << (mseq->log2_max_pic_order_cnt_lsb_minus4 + 4)) - 1)),
  485. slice_pic_order_cnt_lsb);
  486. u(1, mslice_var(short_term_ref_pic_set_sps_flag));
  487. if (!mslice->short_term_ref_pic_set_sps_flag) {
  488. vaapi_encode_h265_write_st_ref_pic_set(pbc, mseq->num_short_term_ref_pic_sets,
  489. &mslice->st_ref_pic_set);
  490. } else if (mseq->num_short_term_ref_pic_sets > 1) {
  491. u(av_log2(mseq->num_short_term_ref_pic_sets - 1) + 1,
  492. mslice_var(short_term_ref_pic_idx));
  493. }
  494. if (mseq->long_term_ref_pics_present_flag) {
  495. av_assert0(0);
  496. }
  497. if (vseq->seq_fields.bits.sps_temporal_mvp_enabled_flag) {
  498. u(1, vslice_field(slice_temporal_mvp_enabled_flag));
  499. }
  500. if (vseq->seq_fields.bits.sample_adaptive_offset_enabled_flag) {
  501. u(1, vslice_field(slice_sao_luma_flag));
  502. if (!vseq->seq_fields.bits.separate_colour_plane_flag &&
  503. vseq->seq_fields.bits.chroma_format_idc != 0) {
  504. u(1, vslice_field(slice_sao_chroma_flag));
  505. }
  506. }
  507. if (vslice->slice_type == P_SLICE || vslice->slice_type == B_SLICE) {
  508. u(1, vslice_field(num_ref_idx_active_override_flag));
  509. if (vslice->slice_fields.bits.num_ref_idx_active_override_flag) {
  510. ue(vslice_var(num_ref_idx_l0_active_minus1));
  511. if (vslice->slice_type == B_SLICE) {
  512. ue(vslice_var(num_ref_idx_l1_active_minus1));
  513. }
  514. }
  515. if (mseq->lists_modification_present_flag) {
  516. av_assert0(0);
  517. // ref_pic_lists_modification()
  518. }
  519. if (vslice->slice_type == B_SLICE) {
  520. u(1, vslice_field(mvd_l1_zero_flag));
  521. }
  522. if (mseq->cabac_init_present_flag) {
  523. u(1, vslice_field(cabac_init_flag));
  524. }
  525. if (vslice->slice_fields.bits.slice_temporal_mvp_enabled_flag) {
  526. if (vslice->slice_type == B_SLICE)
  527. u(1, vslice_field(collocated_from_l0_flag));
  528. ue(vpic->collocated_ref_pic_index, collocated_ref_idx);
  529. }
  530. if ((vpic->pic_fields.bits.weighted_pred_flag &&
  531. vslice->slice_type == P_SLICE) ||
  532. (vpic->pic_fields.bits.weighted_bipred_flag &&
  533. vslice->slice_type == B_SLICE)) {
  534. av_assert0(0);
  535. // pred_weight_table()
  536. }
  537. ue(5 - vslice->max_num_merge_cand, five_minus_max_num_merge_cand);
  538. }
  539. se(vslice_var(slice_qp_delta));
  540. if (mseq->pps_slice_chroma_qp_offsets_present_flag) {
  541. se(vslice_var(slice_cb_qp_offset));
  542. se(vslice_var(slice_cr_qp_offset));
  543. }
  544. if (mseq->pps_slice_chroma_offset_list_enabled_flag) {
  545. u(1, 0, cu_chroma_qp_offset_enabled_flag);
  546. }
  547. if (mseq->deblocking_filter_override_enabled_flag) {
  548. u(1, mslice_var(deblocking_filter_override_flag));
  549. }
  550. if (mslice->deblocking_filter_override_flag) {
  551. u(1, vslice_field(slice_deblocking_filter_disabled_flag));
  552. if (!vslice->slice_fields.bits.slice_deblocking_filter_disabled_flag) {
  553. se(vslice_var(slice_beta_offset_div2));
  554. se(vslice_var(slice_tc_offset_div2));
  555. }
  556. }
  557. if (vpic->pic_fields.bits.pps_loop_filter_across_slices_enabled_flag &&
  558. (vslice->slice_fields.bits.slice_sao_luma_flag ||
  559. vslice->slice_fields.bits.slice_sao_chroma_flag ||
  560. vslice->slice_fields.bits.slice_deblocking_filter_disabled_flag)) {
  561. u(1, vslice_field(slice_loop_filter_across_slices_enabled_flag));
  562. }
  563. }
  564. if (vpic->pic_fields.bits.tiles_enabled_flag ||
  565. vpic->pic_fields.bits.entropy_coding_sync_enabled_flag) {
  566. // num_entry_point_offsets
  567. }
  568. if (0) {
  569. // slice_segment_header_extension_length
  570. }
  571. }
  572. u(1, 1, alignment_bit_equal_to_one);
  573. while (put_bits_count(pbc) & 7)
  574. u(1, 0, alignment_bit_equal_to_zero);
  575. }
  576. static int vaapi_encode_h265_write_sequence_header(AVCodecContext *avctx,
  577. char *data, size_t *data_len)
  578. {
  579. VAAPIEncodeContext *ctx = avctx->priv_data;
  580. PutBitContext pbc;
  581. char tmp[256];
  582. int err;
  583. size_t nal_len, bit_len, bit_pos, next_len;
  584. bit_len = *data_len;
  585. bit_pos = 0;
  586. init_put_bits(&pbc, tmp, sizeof(tmp));
  587. vaapi_encode_h265_write_vps(&pbc, ctx);
  588. nal_len = put_bits_count(&pbc);
  589. flush_put_bits(&pbc);
  590. next_len = bit_len - bit_pos;
  591. err = ff_vaapi_encode_h26x_nal_unit_to_byte_stream(data + bit_pos / 8,
  592. &next_len,
  593. tmp, nal_len);
  594. if (err < 0)
  595. return err;
  596. bit_pos += next_len;
  597. init_put_bits(&pbc, tmp, sizeof(tmp));
  598. vaapi_encode_h265_write_sps(&pbc, ctx);
  599. nal_len = put_bits_count(&pbc);
  600. flush_put_bits(&pbc);
  601. next_len = bit_len - bit_pos;
  602. err = ff_vaapi_encode_h26x_nal_unit_to_byte_stream(data + bit_pos / 8,
  603. &next_len,
  604. tmp, nal_len);
  605. if (err < 0)
  606. return err;
  607. bit_pos += next_len;
  608. init_put_bits(&pbc, tmp, sizeof(tmp));
  609. vaapi_encode_h265_write_pps(&pbc, ctx);
  610. nal_len = put_bits_count(&pbc);
  611. flush_put_bits(&pbc);
  612. next_len = bit_len - bit_pos;
  613. err = ff_vaapi_encode_h26x_nal_unit_to_byte_stream(data + bit_pos / 8,
  614. &next_len,
  615. tmp, nal_len);
  616. if (err < 0)
  617. return err;
  618. bit_pos += next_len;
  619. *data_len = bit_pos;
  620. return 0;
  621. }
  622. static int vaapi_encode_h265_write_slice_header(AVCodecContext *avctx,
  623. VAAPIEncodePicture *pic,
  624. VAAPIEncodeSlice *slice,
  625. char *data, size_t *data_len)
  626. {
  627. VAAPIEncodeContext *ctx = avctx->priv_data;
  628. PutBitContext pbc;
  629. char tmp[256];
  630. size_t header_len;
  631. init_put_bits(&pbc, tmp, sizeof(tmp));
  632. vaapi_encode_h265_write_slice_header2(&pbc, ctx, pic, slice);
  633. header_len = put_bits_count(&pbc);
  634. flush_put_bits(&pbc);
  635. return ff_vaapi_encode_h26x_nal_unit_to_byte_stream(data, data_len,
  636. tmp, header_len);
  637. }
  638. static int vaapi_encode_h265_init_sequence_params(AVCodecContext *avctx)
  639. {
  640. VAAPIEncodeContext *ctx = avctx->priv_data;
  641. VAEncSequenceParameterBufferHEVC *vseq = ctx->codec_sequence_params;
  642. VAEncPictureParameterBufferHEVC *vpic = ctx->codec_picture_params;
  643. VAAPIEncodeH265Context *priv = ctx->priv_data;
  644. VAAPIEncodeH265MiscSequenceParams *mseq = &priv->misc_sequence_params;
  645. int i;
  646. {
  647. // general_profile_space == 0.
  648. vseq->general_profile_idc = 1; // Main profile (ctx->codec_profile?)
  649. vseq->general_tier_flag = 0;
  650. vseq->general_level_idc = avctx->level * 3;
  651. vseq->intra_period = 0;
  652. vseq->intra_idr_period = 0;
  653. vseq->ip_period = 0;
  654. vseq->pic_width_in_luma_samples = ctx->aligned_width;
  655. vseq->pic_height_in_luma_samples = ctx->aligned_height;
  656. vseq->seq_fields.bits.chroma_format_idc = 1; // 4:2:0.
  657. vseq->seq_fields.bits.separate_colour_plane_flag = 0;
  658. vseq->seq_fields.bits.bit_depth_luma_minus8 = 0; // 8-bit luma.
  659. vseq->seq_fields.bits.bit_depth_chroma_minus8 = 0; // 8-bit chroma.
  660. // Other misc flags all zero.
  661. // These have to come from the capabilities of the encoder. We have
  662. // no way to query it, so just hardcode ones which worked for me...
  663. // CTB size from 8x8 to 32x32.
  664. vseq->log2_min_luma_coding_block_size_minus3 = 0;
  665. vseq->log2_diff_max_min_luma_coding_block_size = 2;
  666. // Transform size from 4x4 to 32x32.
  667. vseq->log2_min_transform_block_size_minus2 = 0;
  668. vseq->log2_diff_max_min_transform_block_size = 3;
  669. // Full transform hierarchy allowed (2-5).
  670. vseq->max_transform_hierarchy_depth_inter = 3;
  671. vseq->max_transform_hierarchy_depth_intra = 3;
  672. vseq->vui_parameters_present_flag = 0;
  673. }
  674. {
  675. vpic->decoded_curr_pic.picture_id = VA_INVALID_ID;
  676. vpic->decoded_curr_pic.flags = VA_PICTURE_HEVC_INVALID;
  677. for (i = 0; i < FF_ARRAY_ELEMS(vpic->reference_frames); i++) {
  678. vpic->reference_frames[i].picture_id = VA_INVALID_ID;
  679. vpic->reference_frames[i].flags = VA_PICTURE_HEVC_INVALID;
  680. }
  681. vpic->collocated_ref_pic_index = 0xff;
  682. vpic->last_picture = 0;
  683. vpic->pic_init_qp = priv->fixed_qp_idr;
  684. vpic->diff_cu_qp_delta_depth = 0;
  685. vpic->pps_cb_qp_offset = 0;
  686. vpic->pps_cr_qp_offset = 0;
  687. // tiles_enabled_flag == 0, so ignore num_tile_(rows|columns)_minus1.
  688. vpic->log2_parallel_merge_level_minus2 = 0;
  689. // No limit on size.
  690. vpic->ctu_max_bitsize_allowed = 0;
  691. vpic->num_ref_idx_l0_default_active_minus1 = 0;
  692. vpic->num_ref_idx_l1_default_active_minus1 = 0;
  693. vpic->slice_pic_parameter_set_id = 0;
  694. vpic->pic_fields.bits.screen_content_flag = 0;
  695. vpic->pic_fields.bits.enable_gpu_weighted_prediction = 0;
  696. //vpic->pic_fields.bits.cu_qp_delta_enabled_flag = 1;
  697. }
  698. {
  699. mseq->video_parameter_set_id = 5;
  700. mseq->seq_parameter_set_id = 5;
  701. mseq->vps_max_layers_minus1 = 0;
  702. mseq->vps_max_sub_layers_minus1 = 0;
  703. mseq->vps_temporal_id_nesting_flag = 1;
  704. mseq->sps_max_sub_layers_minus1 = 0;
  705. mseq->sps_temporal_id_nesting_flag = 1;
  706. for (i = 0; i < 32; i++) {
  707. mseq->general_profile_compatibility_flag[i] =
  708. (i == vseq->general_profile_idc);
  709. }
  710. mseq->general_progressive_source_flag = 1;
  711. mseq->general_interlaced_source_flag = 0;
  712. mseq->general_non_packed_constraint_flag = 0;
  713. mseq->general_frame_only_constraint_flag = 1;
  714. mseq->general_inbld_flag = 0;
  715. mseq->log2_max_pic_order_cnt_lsb_minus4 = 8;
  716. mseq->vps_sub_layer_ordering_info_present_flag = 0;
  717. mseq->vps_max_dec_pic_buffering_minus1[0] = 1;
  718. mseq->vps_max_num_reorder_pics[0] = ctx->b_per_p;
  719. mseq->vps_max_latency_increase_plus1[0] = 0;
  720. mseq->sps_sub_layer_ordering_info_present_flag = 0;
  721. mseq->sps_max_dec_pic_buffering_minus1[0] = 1;
  722. mseq->sps_max_num_reorder_pics[0] = ctx->b_per_p;
  723. mseq->sps_max_latency_increase_plus1[0] = 0;
  724. mseq->vps_timing_info_present_flag = 1;
  725. mseq->vps_num_units_in_tick = avctx->time_base.num;
  726. mseq->vps_time_scale = avctx->time_base.den;
  727. mseq->vps_poc_proportional_to_timing_flag = 1;
  728. mseq->vps_num_ticks_poc_diff_minus1 = 0;
  729. if (ctx->input_width != ctx->aligned_width ||
  730. ctx->input_height != ctx->aligned_height) {
  731. mseq->conformance_window_flag = 1;
  732. mseq->conf_win_left_offset = 0;
  733. mseq->conf_win_right_offset =
  734. (ctx->aligned_width - ctx->input_width) / 2;
  735. mseq->conf_win_top_offset = 0;
  736. mseq->conf_win_bottom_offset =
  737. (ctx->aligned_height - ctx->input_height) / 2;
  738. } else {
  739. mseq->conformance_window_flag = 0;
  740. }
  741. mseq->num_short_term_ref_pic_sets = 0;
  742. // STRPSs should ideally be here rather than repeated in each slice.
  743. mseq->vui_parameters_present_flag = 1;
  744. if (avctx->sample_aspect_ratio.num != 0) {
  745. mseq->aspect_ratio_info_present_flag = 1;
  746. if (avctx->sample_aspect_ratio.num ==
  747. avctx->sample_aspect_ratio.den) {
  748. mseq->aspect_ratio_idc = 1;
  749. } else {
  750. mseq->aspect_ratio_idc = 255; // Extended SAR.
  751. mseq->sar_width = avctx->sample_aspect_ratio.num;
  752. mseq->sar_height = avctx->sample_aspect_ratio.den;
  753. }
  754. }
  755. if (1) {
  756. // Should this be conditional on some of these being set?
  757. mseq->video_signal_type_present_flag = 1;
  758. mseq->video_format = 5; // Unspecified.
  759. mseq->video_full_range_flag = 0;
  760. mseq->colour_description_present_flag = 1;
  761. mseq->colour_primaries = avctx->color_primaries;
  762. mseq->transfer_characteristics = avctx->color_trc;
  763. mseq->matrix_coeffs = avctx->colorspace;
  764. }
  765. }
  766. return 0;
  767. }
  768. static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx,
  769. VAAPIEncodePicture *pic)
  770. {
  771. VAAPIEncodeContext *ctx = avctx->priv_data;
  772. VAEncPictureParameterBufferHEVC *vpic = pic->codec_picture_params;
  773. VAAPIEncodeH265Context *priv = ctx->priv_data;
  774. int i;
  775. if (pic->type == PICTURE_TYPE_IDR) {
  776. av_assert0(pic->display_order == pic->encode_order);
  777. priv->last_idr_frame = pic->display_order;
  778. } else {
  779. av_assert0(pic->encode_order > priv->last_idr_frame);
  780. // Display order need not be if we have RA[SD]L pictures, though.
  781. }
  782. vpic->decoded_curr_pic.picture_id = pic->recon_surface;
  783. vpic->decoded_curr_pic.pic_order_cnt =
  784. pic->display_order - priv->last_idr_frame;
  785. vpic->decoded_curr_pic.flags = 0;
  786. for (i = 0; i < pic->nb_refs; i++) {
  787. VAAPIEncodePicture *ref = pic->refs[i];
  788. av_assert0(ref);
  789. vpic->reference_frames[i].picture_id = ref->recon_surface;
  790. vpic->reference_frames[i].pic_order_cnt =
  791. ref->display_order - priv->last_idr_frame;
  792. vpic->reference_frames[i].flags =
  793. (ref->display_order < pic->display_order ?
  794. VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE : 0) |
  795. (ref->display_order > pic->display_order ?
  796. VA_PICTURE_HEVC_RPS_ST_CURR_AFTER : 0);
  797. }
  798. for (; i < FF_ARRAY_ELEMS(vpic->reference_frames); i++) {
  799. vpic->reference_frames[i].picture_id = VA_INVALID_ID;
  800. vpic->reference_frames[i].flags = VA_PICTURE_HEVC_INVALID;
  801. }
  802. vpic->coded_buf = pic->output_buffer;
  803. switch (pic->type) {
  804. case PICTURE_TYPE_IDR:
  805. vpic->nal_unit_type = NAL_IDR_W_RADL;
  806. vpic->pic_fields.bits.idr_pic_flag = 1;
  807. vpic->pic_fields.bits.coding_type = 1;
  808. vpic->pic_fields.bits.reference_pic_flag = 1;
  809. break;
  810. case PICTURE_TYPE_I:
  811. vpic->nal_unit_type = NAL_TRAIL_R;
  812. vpic->pic_fields.bits.idr_pic_flag = 0;
  813. vpic->pic_fields.bits.coding_type = 1;
  814. vpic->pic_fields.bits.reference_pic_flag = 1;
  815. break;
  816. case PICTURE_TYPE_P:
  817. vpic->nal_unit_type = NAL_TRAIL_R;
  818. vpic->pic_fields.bits.idr_pic_flag = 0;
  819. vpic->pic_fields.bits.coding_type = 2;
  820. vpic->pic_fields.bits.reference_pic_flag = 1;
  821. break;
  822. case PICTURE_TYPE_B:
  823. vpic->nal_unit_type = NAL_TRAIL_R;
  824. vpic->pic_fields.bits.idr_pic_flag = 0;
  825. vpic->pic_fields.bits.coding_type = 3;
  826. vpic->pic_fields.bits.reference_pic_flag = 0;
  827. break;
  828. default:
  829. av_assert0(0 && "invalid picture type");
  830. }
  831. pic->nb_slices = 1;
  832. return 0;
  833. }
  834. static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx,
  835. VAAPIEncodePicture *pic,
  836. VAAPIEncodeSlice *slice)
  837. {
  838. VAAPIEncodeContext *ctx = avctx->priv_data;
  839. VAEncPictureParameterBufferHEVC *vpic = pic->codec_picture_params;
  840. VAEncSliceParameterBufferHEVC *vslice = slice->codec_slice_params;
  841. VAAPIEncodeH265Context *priv = ctx->priv_data;
  842. VAAPIEncodeH265Slice *pslice;
  843. VAAPIEncodeH265MiscSliceParams *mslice;
  844. int i;
  845. slice->priv_data = av_mallocz(sizeof(*pslice));
  846. if (!slice->priv_data)
  847. return AVERROR(ENOMEM);
  848. pslice = slice->priv_data;
  849. mslice = &pslice->misc_slice_params;
  850. // Currently we only support one slice per frame.
  851. vslice->slice_segment_address = 0;
  852. vslice->num_ctu_in_slice = priv->ctu_width * priv->ctu_height;
  853. switch (pic->type) {
  854. case PICTURE_TYPE_IDR:
  855. case PICTURE_TYPE_I:
  856. vslice->slice_type = I_SLICE;
  857. break;
  858. case PICTURE_TYPE_P:
  859. vslice->slice_type = P_SLICE;
  860. break;
  861. case PICTURE_TYPE_B:
  862. vslice->slice_type = B_SLICE;
  863. break;
  864. default:
  865. av_assert0(0 && "invalid picture type");
  866. }
  867. vslice->slice_pic_parameter_set_id = vpic->slice_pic_parameter_set_id;
  868. pslice->pic_order_cnt = pic->display_order - priv->last_idr_frame;
  869. for (i = 0; i < FF_ARRAY_ELEMS(vslice->ref_pic_list0); i++) {
  870. vslice->ref_pic_list0[i].picture_id = VA_INVALID_ID;
  871. vslice->ref_pic_list0[i].flags = VA_PICTURE_HEVC_INVALID;
  872. vslice->ref_pic_list1[i].picture_id = VA_INVALID_ID;
  873. vslice->ref_pic_list1[i].flags = VA_PICTURE_HEVC_INVALID;
  874. }
  875. av_assert0(pic->nb_refs <= 2);
  876. if (pic->nb_refs >= 1) {
  877. // Backward reference for P or B frame.
  878. av_assert0(pic->type == PICTURE_TYPE_P ||
  879. pic->type == PICTURE_TYPE_B);
  880. vslice->num_ref_idx_l0_active_minus1 = 0;
  881. vslice->ref_pic_list0[0] = vpic->reference_frames[0];
  882. }
  883. if (pic->nb_refs >= 2) {
  884. // Forward reference for B frame.
  885. av_assert0(pic->type == PICTURE_TYPE_B);
  886. vslice->num_ref_idx_l1_active_minus1 = 0;
  887. vslice->ref_pic_list1[0] = vpic->reference_frames[1];
  888. }
  889. vslice->max_num_merge_cand = 5;
  890. if (pic->type == PICTURE_TYPE_B)
  891. vslice->slice_qp_delta = priv->fixed_qp_b - vpic->pic_init_qp;
  892. else if (pic->type == PICTURE_TYPE_P)
  893. vslice->slice_qp_delta = priv->fixed_qp_p - vpic->pic_init_qp;
  894. else
  895. vslice->slice_qp_delta = priv->fixed_qp_idr - vpic->pic_init_qp;
  896. vslice->slice_fields.bits.last_slice_of_pic_flag = 1;
  897. mslice->first_slice_segment_in_pic_flag = 1;
  898. if (pic->type == PICTURE_TYPE_IDR) {
  899. // No reference pictures.
  900. } else if (0) {
  901. mslice->short_term_ref_pic_set_sps_flag = 1;
  902. mslice->short_term_ref_pic_idx = 0;
  903. } else {
  904. VAAPIEncodePicture *st;
  905. int used;
  906. mslice->short_term_ref_pic_set_sps_flag = 0;
  907. mslice->st_ref_pic_set.inter_ref_pic_set_prediction_flag = 0;
  908. for (st = ctx->pic_start; st; st = st->next) {
  909. if (st->encode_order >= pic->encode_order) {
  910. // Not yet in DPB.
  911. continue;
  912. }
  913. used = 0;
  914. for (i = 0; i < pic->nb_refs; i++) {
  915. if (pic->refs[i] == st)
  916. used = 1;
  917. }
  918. if (!used) {
  919. // Currently true, but need not be.
  920. continue;
  921. }
  922. // This only works for one instance of each (delta_poc_sN_minus1
  923. // is relative to the previous frame in the list, not relative to
  924. // the current frame directly).
  925. if (st->display_order < pic->display_order) {
  926. i = mslice->st_ref_pic_set.num_negative_pics;
  927. mslice->st_ref_pic_set.delta_poc_s0_minus1[i] =
  928. pic->display_order - st->display_order - 1;
  929. mslice->st_ref_pic_set.used_by_curr_pic_s0_flag[i] = used;
  930. ++mslice->st_ref_pic_set.num_negative_pics;
  931. } else {
  932. i = mslice->st_ref_pic_set.num_positive_pics;
  933. mslice->st_ref_pic_set.delta_poc_s1_minus1[i] =
  934. st->display_order - pic->display_order - 1;
  935. mslice->st_ref_pic_set.used_by_curr_pic_s1_flag[i] = used;
  936. ++mslice->st_ref_pic_set.num_positive_pics;
  937. }
  938. }
  939. }
  940. return 0;
  941. }
  942. static VAConfigAttrib vaapi_encode_h265_config_attributes[] = {
  943. { .type = VAConfigAttribRTFormat,
  944. .value = VA_RT_FORMAT_YUV420 },
  945. { .type = VAConfigAttribRateControl,
  946. .value = VA_RC_CQP },
  947. { .type = VAConfigAttribEncPackedHeaders,
  948. .value = (VA_ENC_PACKED_HEADER_SEQUENCE |
  949. VA_ENC_PACKED_HEADER_SLICE) },
  950. };
  951. static av_cold int vaapi_encode_h265_init_internal(AVCodecContext *avctx)
  952. {
  953. VAAPIEncodeContext *ctx = avctx->priv_data;
  954. VAAPIEncodeH265Context *priv = ctx->priv_data;
  955. switch (avctx->profile) {
  956. case FF_PROFILE_HEVC_MAIN:
  957. case FF_PROFILE_UNKNOWN:
  958. ctx->va_profile = VAProfileHEVCMain;
  959. break;
  960. case FF_PROFILE_HEVC_MAIN_10:
  961. av_log(avctx, AV_LOG_ERROR, "H.265 main 10-bit profile "
  962. "is not supported.\n");
  963. return AVERROR_PATCHWELCOME;
  964. default:
  965. av_log(avctx, AV_LOG_ERROR, "Unknown H.265 profile %d.\n",
  966. avctx->profile);
  967. return AVERROR(EINVAL);
  968. }
  969. ctx->va_entrypoint = VAEntrypointEncSlice;
  970. ctx->va_rc_mode = VA_RC_CQP;
  971. ctx->input_width = avctx->width;
  972. ctx->input_height = avctx->height;
  973. ctx->aligned_width = FFALIGN(ctx->input_width, 16);
  974. ctx->aligned_height = FFALIGN(ctx->input_height, 16);
  975. priv->ctu_width = FFALIGN(ctx->aligned_width, 32) / 32;
  976. priv->ctu_height = FFALIGN(ctx->aligned_height, 32) / 32;
  977. av_log(avctx, AV_LOG_VERBOSE, "Input %ux%u -> Aligned %ux%u -> CTU %ux%u.\n",
  978. ctx->input_width, ctx->input_height, ctx->aligned_width,
  979. ctx->aligned_height, priv->ctu_width, priv->ctu_height);
  980. priv->fixed_qp_p = avctx->global_quality;
  981. if (avctx->i_quant_factor > 0.0)
  982. priv->fixed_qp_idr = (int)((priv->fixed_qp_p * avctx->i_quant_factor +
  983. avctx->i_quant_offset) + 0.5);
  984. else
  985. priv->fixed_qp_idr = priv->fixed_qp_p;
  986. if (avctx->b_quant_factor > 0.0)
  987. priv->fixed_qp_b = (int)((priv->fixed_qp_p * avctx->b_quant_factor +
  988. avctx->b_quant_offset) + 0.5);
  989. else
  990. priv->fixed_qp_b = priv->fixed_qp_p;
  991. av_log(avctx, AV_LOG_DEBUG, "QP = %d / %d / %d for IDR / P / B frames.\n",
  992. priv->fixed_qp_idr, priv->fixed_qp_p, priv->fixed_qp_b);
  993. ctx->config_attributes = vaapi_encode_h265_config_attributes;
  994. ctx->nb_config_attributes =
  995. FF_ARRAY_ELEMS(vaapi_encode_h265_config_attributes);
  996. ctx->nb_recon_frames = 20;
  997. return 0;
  998. }
  999. static VAAPIEncodeType vaapi_encode_type_h265 = {
  1000. .priv_data_size = sizeof(VAAPIEncodeH265Context),
  1001. .init = &vaapi_encode_h265_init_internal,
  1002. .sequence_params_size = sizeof(VAEncSequenceParameterBufferHEVC),
  1003. .init_sequence_params = &vaapi_encode_h265_init_sequence_params,
  1004. .picture_params_size = sizeof(VAEncPictureParameterBufferHEVC),
  1005. .init_picture_params = &vaapi_encode_h265_init_picture_params,
  1006. .slice_params_size = sizeof(VAEncSliceParameterBufferHEVC),
  1007. .init_slice_params = &vaapi_encode_h265_init_slice_params,
  1008. .sequence_header_type = VAEncPackedHeaderSequence,
  1009. .write_sequence_header = &vaapi_encode_h265_write_sequence_header,
  1010. .slice_header_type = VAEncPackedHeaderHEVC_Slice,
  1011. .write_slice_header = &vaapi_encode_h265_write_slice_header,
  1012. };
  1013. static av_cold int vaapi_encode_h265_init(AVCodecContext *avctx)
  1014. {
  1015. return ff_vaapi_encode_init(avctx, &vaapi_encode_type_h265);
  1016. }
  1017. static const AVCodecDefault vaapi_encode_h265_defaults[] = {
  1018. { "profile", "1" },
  1019. { "level", "51" },
  1020. { "b", "0" },
  1021. { "bf", "2" },
  1022. { "g", "120" },
  1023. { "global_quality", "25" },
  1024. { "i_qfactor", "1.0" },
  1025. { "i_qoffset", "0.0" },
  1026. { "b_qfactor", "1.2" },
  1027. { "b_qoffset", "0.0" },
  1028. { NULL },
  1029. };
  1030. static const AVClass vaapi_encode_h265_class = {
  1031. .class_name = "h265_vaapi",
  1032. .item_name = av_default_item_name,
  1033. .version = LIBAVUTIL_VERSION_INT,
  1034. };
  1035. AVCodec ff_hevc_vaapi_encoder = {
  1036. .name = "hevc_vaapi",
  1037. .long_name = NULL_IF_CONFIG_SMALL("H.265/HEVC (VAAPI)"),
  1038. .type = AVMEDIA_TYPE_VIDEO,
  1039. .id = AV_CODEC_ID_HEVC,
  1040. .priv_data_size = sizeof(VAAPIEncodeContext),
  1041. .init = &vaapi_encode_h265_init,
  1042. .encode2 = &ff_vaapi_encode2,
  1043. .close = &ff_vaapi_encode_close,
  1044. .priv_class = &vaapi_encode_h265_class,
  1045. .capabilities = AV_CODEC_CAP_DELAY,
  1046. .defaults = vaapi_encode_h265_defaults,
  1047. .pix_fmts = (const enum AVPixelFormat[]) {
  1048. AV_PIX_FMT_VAAPI,
  1049. AV_PIX_FMT_NONE,
  1050. },
  1051. };