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.

399 lines
13KB

  1. /*
  2. * AV1 helper functions for muxers
  3. * Copyright (c) 2018 James Almer <jamrial@gmail.com>
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include "libavutil/mem.h"
  22. #include "libavcodec/av1.h"
  23. #include "libavcodec/av1_parse.h"
  24. #include "libavcodec/profiles.h"
  25. #include "libavcodec/put_bits.h"
  26. #include "av1.h"
  27. #include "avio.h"
  28. int ff_av1_filter_obus(AVIOContext *pb, const uint8_t *buf, int size)
  29. {
  30. const uint8_t *end = buf + size;
  31. int64_t obu_size;
  32. int start_pos, type, temporal_id, spatial_id;
  33. size = 0;
  34. while (buf < end) {
  35. int len = parse_obu_header(buf, end - buf, &obu_size, &start_pos,
  36. &type, &temporal_id, &spatial_id);
  37. if (len < 0)
  38. return len;
  39. switch (type) {
  40. case AV1_OBU_TEMPORAL_DELIMITER:
  41. case AV1_OBU_REDUNDANT_FRAME_HEADER:
  42. case AV1_OBU_TILE_LIST:
  43. case AV1_OBU_PADDING:
  44. break;
  45. default:
  46. avio_write(pb, buf, len);
  47. size += len;
  48. break;
  49. }
  50. buf += len;
  51. }
  52. return size;
  53. }
  54. int ff_av1_filter_obus_buf(const uint8_t *buf, uint8_t **out, int *size)
  55. {
  56. AVIOContext *pb;
  57. int ret;
  58. ret = avio_open_dyn_buf(&pb);
  59. if (ret < 0)
  60. return ret;
  61. ret = ff_av1_filter_obus(pb, buf, *size);
  62. if (ret < 0)
  63. return ret;
  64. av_freep(out);
  65. *size = avio_close_dyn_buf(pb, out);
  66. return ret;
  67. }
  68. typedef struct AV1SequenceParameters {
  69. uint8_t seq_profile;
  70. uint8_t seq_level_idx_0;
  71. uint8_t seq_tier_0;
  72. uint8_t high_bitdepth;
  73. uint8_t twelve_bit;
  74. uint8_t monochrome;
  75. uint8_t chroma_subsampling_x;
  76. uint8_t chroma_subsampling_y;
  77. uint8_t chroma_sample_position;
  78. uint8_t color_description_present_flag;
  79. uint8_t color_primaries;
  80. uint8_t transfer_characteristics;
  81. uint8_t matrix_coefficients;
  82. uint8_t color_range;
  83. } AV1SequenceParameters;
  84. static inline void uvlc(GetBitContext *gb)
  85. {
  86. int leading_zeros = 0;
  87. while (get_bits_left(gb)) {
  88. if (get_bits1(gb))
  89. break;
  90. leading_zeros++;
  91. }
  92. if (leading_zeros >= 32)
  93. return;
  94. skip_bits_long(gb, leading_zeros);
  95. }
  96. static int parse_color_config(AV1SequenceParameters *seq_params, GetBitContext *gb)
  97. {
  98. seq_params->high_bitdepth = get_bits1(gb);
  99. if (seq_params->seq_profile == FF_PROFILE_AV1_PROFESSIONAL && seq_params->high_bitdepth)
  100. seq_params->twelve_bit = get_bits1(gb);
  101. if (seq_params->seq_profile == FF_PROFILE_AV1_HIGH)
  102. seq_params->monochrome = 0;
  103. else
  104. seq_params->monochrome = get_bits1(gb);
  105. seq_params->color_description_present_flag = get_bits1(gb);
  106. if (seq_params->color_description_present_flag) {
  107. seq_params->color_primaries = get_bits(gb, 8);
  108. seq_params->transfer_characteristics = get_bits(gb, 8);
  109. seq_params->matrix_coefficients = get_bits(gb, 8);
  110. } else {
  111. seq_params->color_primaries = AVCOL_PRI_UNSPECIFIED;
  112. seq_params->transfer_characteristics = AVCOL_TRC_UNSPECIFIED;
  113. seq_params->matrix_coefficients = AVCOL_SPC_UNSPECIFIED;
  114. }
  115. if (seq_params->monochrome) {
  116. seq_params->color_range = get_bits1(gb);
  117. seq_params->chroma_subsampling_x = 1;
  118. seq_params->chroma_subsampling_y = 1;
  119. seq_params->chroma_sample_position = 0;
  120. return 0;
  121. } else if (seq_params->color_primaries == AVCOL_PRI_BT709 &&
  122. seq_params->transfer_characteristics == AVCOL_TRC_IEC61966_2_1 &&
  123. seq_params->matrix_coefficients == AVCOL_SPC_RGB) {
  124. seq_params->chroma_subsampling_x = 0;
  125. seq_params->chroma_subsampling_y = 0;
  126. } else {
  127. seq_params->color_range = get_bits1(gb);
  128. if (seq_params->seq_profile == FF_PROFILE_AV1_MAIN) {
  129. seq_params->chroma_subsampling_x = 1;
  130. seq_params->chroma_subsampling_y = 1;
  131. } else if (seq_params->seq_profile == FF_PROFILE_AV1_HIGH) {
  132. seq_params->chroma_subsampling_x = 0;
  133. seq_params->chroma_subsampling_y = 0;
  134. } else {
  135. if (seq_params->twelve_bit) {
  136. seq_params->chroma_subsampling_x = get_bits1(gb);
  137. if (seq_params->chroma_subsampling_x)
  138. seq_params->chroma_subsampling_y = get_bits1(gb);
  139. else
  140. seq_params->chroma_subsampling_y = 0;
  141. } else {
  142. seq_params->chroma_subsampling_x = 1;
  143. seq_params->chroma_subsampling_y = 0;
  144. }
  145. }
  146. if (seq_params->chroma_subsampling_x && seq_params->chroma_subsampling_y)
  147. seq_params->chroma_sample_position = get_bits(gb, 2);
  148. }
  149. skip_bits1(gb); // separate_uv_delta_q
  150. return 0;
  151. }
  152. static int parse_sequence_header(AV1SequenceParameters *seq_params, const uint8_t *buf, int size)
  153. {
  154. GetBitContext gb;
  155. int reduced_still_picture_header;
  156. int frame_width_bits_minus_1, frame_height_bits_minus_1;
  157. int size_bits, ret;
  158. size_bits = get_obu_bit_length(buf, size, AV1_OBU_SEQUENCE_HEADER);
  159. if (size_bits < 0)
  160. return size_bits;
  161. ret = init_get_bits(&gb, buf, size_bits);
  162. if (ret < 0)
  163. return ret;
  164. memset(seq_params, 0, sizeof(*seq_params));
  165. seq_params->seq_profile = get_bits(&gb, 3);
  166. skip_bits1(&gb); // still_picture
  167. reduced_still_picture_header = get_bits1(&gb);
  168. if (reduced_still_picture_header) {
  169. seq_params->seq_level_idx_0 = get_bits(&gb, 5);
  170. seq_params->seq_tier_0 = 0;
  171. } else {
  172. int initial_display_delay_present_flag, operating_points_cnt_minus_1;
  173. int decoder_model_info_present_flag, buffer_delay_length_minus_1;
  174. if (get_bits1(&gb)) { // timing_info_present_flag
  175. skip_bits_long(&gb, 32); // num_units_in_display_tick
  176. skip_bits_long(&gb, 32); // time_scale
  177. if (get_bits1(&gb)) // equal_picture_interval
  178. uvlc(&gb); // num_ticks_per_picture_minus_1
  179. decoder_model_info_present_flag = get_bits1(&gb);
  180. if (decoder_model_info_present_flag) {
  181. buffer_delay_length_minus_1 = get_bits(&gb, 5);
  182. skip_bits_long(&gb, 32); // num_units_in_decoding_tick
  183. skip_bits(&gb, 10); // buffer_removal_time_length_minus_1 (5)
  184. // frame_presentation_time_length_minus_1 (5)
  185. }
  186. } else
  187. decoder_model_info_present_flag = 0;
  188. initial_display_delay_present_flag = get_bits1(&gb);
  189. operating_points_cnt_minus_1 = get_bits(&gb, 5);
  190. for (int i = 0; i <= operating_points_cnt_minus_1; i++) {
  191. int seq_level_idx, seq_tier;
  192. skip_bits(&gb, 12); // operating_point_idc
  193. seq_level_idx = get_bits(&gb, 5);
  194. if (seq_level_idx > 7)
  195. seq_tier = get_bits1(&gb);
  196. else
  197. seq_tier = 0;
  198. if (decoder_model_info_present_flag) {
  199. if (get_bits1(&gb)) { // decoder_model_present_for_this_op
  200. skip_bits_long(&gb, buffer_delay_length_minus_1 + 1); // decoder_buffer_delay
  201. skip_bits_long(&gb, buffer_delay_length_minus_1 + 1); // encoder_buffer_delay
  202. skip_bits1(&gb); // low_delay_mode_flag
  203. }
  204. }
  205. if (initial_display_delay_present_flag) {
  206. if (get_bits1(&gb)) // initial_display_delay_present_for_this_op
  207. skip_bits(&gb, 4); // initial_display_delay_minus_1
  208. }
  209. if (i == 0) {
  210. seq_params->seq_level_idx_0 = seq_level_idx;
  211. seq_params->seq_tier_0 = seq_tier;
  212. }
  213. }
  214. }
  215. frame_width_bits_minus_1 = get_bits(&gb, 4);
  216. frame_height_bits_minus_1 = get_bits(&gb, 4);
  217. skip_bits(&gb, frame_width_bits_minus_1 + 1); // max_frame_width_minus_1
  218. skip_bits(&gb, frame_height_bits_minus_1 + 1); // max_frame_height_minus_1
  219. if (!reduced_still_picture_header) {
  220. if (get_bits1(&gb)) // frame_id_numbers_present_flag
  221. skip_bits(&gb, 7); // delta_frame_id_length_minus_2 (4), additional_frame_id_length_minus_1 (3)
  222. }
  223. skip_bits(&gb, 3); // use_128x128_superblock (1), enable_filter_intra (1), enable_intra_edge_filter (1)
  224. if (!reduced_still_picture_header) {
  225. int enable_order_hint, seq_force_screen_content_tools;
  226. skip_bits(&gb, 4); // enable_intraintra_compound (1), enable_masked_compound (1)
  227. // enable_warped_motion (1), enable_dual_filter (1)
  228. enable_order_hint = get_bits1(&gb);
  229. if (enable_order_hint)
  230. skip_bits(&gb, 2); // enable_jnt_comp (1), enable_ref_frame_mvs (1)
  231. if (get_bits1(&gb)) // seq_choose_screen_content_tools
  232. seq_force_screen_content_tools = 2;
  233. else
  234. seq_force_screen_content_tools = get_bits1(&gb);
  235. if (seq_force_screen_content_tools) {
  236. if (!get_bits1(&gb)) // seq_choose_integer_mv
  237. skip_bits1(&gb); // seq_force_integer_mv
  238. }
  239. if (enable_order_hint)
  240. skip_bits(&gb, 3); // order_hint_bits_minus_1
  241. }
  242. skip_bits(&gb, 3); // enable_superres (1), enable_cdef (1), enable_restoration (1)
  243. parse_color_config(seq_params, &gb);
  244. skip_bits1(&gb); // film_grain_params_present
  245. if (get_bits_left(&gb))
  246. return AVERROR_INVALIDDATA;
  247. return 0;
  248. }
  249. int ff_isom_write_av1c(AVIOContext *pb, const uint8_t *buf, int size)
  250. {
  251. AVIOContext *seq_pb = NULL, *meta_pb = NULL;
  252. AV1SequenceParameters seq_params;
  253. PutBitContext pbc;
  254. uint8_t header[4];
  255. uint8_t *seq = NULL, *meta = NULL;
  256. int64_t obu_size;
  257. int start_pos, type, temporal_id, spatial_id;
  258. int ret, nb_seq = 0, seq_size, meta_size;
  259. if (size <= 0)
  260. return AVERROR_INVALIDDATA;
  261. ret = avio_open_dyn_buf(&seq_pb);
  262. if (ret < 0)
  263. return ret;
  264. ret = avio_open_dyn_buf(&meta_pb);
  265. if (ret < 0)
  266. goto fail;
  267. while (size > 0) {
  268. int len = parse_obu_header(buf, size, &obu_size, &start_pos,
  269. &type, &temporal_id, &spatial_id);
  270. if (len < 0) {
  271. ret = len;
  272. goto fail;
  273. }
  274. switch (type) {
  275. case AV1_OBU_SEQUENCE_HEADER:
  276. nb_seq++;
  277. if (!obu_size || nb_seq > 1) {
  278. ret = AVERROR_INVALIDDATA;
  279. goto fail;
  280. }
  281. ret = parse_sequence_header(&seq_params, buf + start_pos, obu_size);
  282. if (ret < 0)
  283. goto fail;
  284. avio_write(seq_pb, buf, len);
  285. break;
  286. case AV1_OBU_METADATA:
  287. if (!obu_size) {
  288. ret = AVERROR_INVALIDDATA;
  289. goto fail;
  290. }
  291. avio_write(meta_pb, buf, len);
  292. break;
  293. default:
  294. break;
  295. }
  296. size -= len;
  297. buf += len;
  298. }
  299. seq_size = avio_close_dyn_buf(seq_pb, &seq);
  300. if (!seq_size) {
  301. ret = AVERROR_INVALIDDATA;
  302. goto fail;
  303. }
  304. init_put_bits(&pbc, header, sizeof(header));
  305. put_bits(&pbc, 1, 1); // marker
  306. put_bits(&pbc, 7, 1); // version
  307. put_bits(&pbc, 3, seq_params.seq_profile);
  308. put_bits(&pbc, 5, seq_params.seq_level_idx_0);
  309. put_bits(&pbc, 1, seq_params.seq_tier_0);
  310. put_bits(&pbc, 1, seq_params.high_bitdepth);
  311. put_bits(&pbc, 1, seq_params.twelve_bit);
  312. put_bits(&pbc, 1, seq_params.monochrome);
  313. put_bits(&pbc, 1, seq_params.chroma_subsampling_x);
  314. put_bits(&pbc, 1, seq_params.chroma_subsampling_y);
  315. put_bits(&pbc, 2, seq_params.chroma_sample_position);
  316. put_bits(&pbc, 8, 0); // padding
  317. flush_put_bits(&pbc);
  318. avio_write(pb, header, sizeof(header));
  319. avio_write(pb, seq, seq_size);
  320. meta_size = avio_close_dyn_buf(meta_pb, &meta);
  321. if (meta_size)
  322. avio_write(pb, meta, meta_size);
  323. fail:
  324. if (!seq)
  325. avio_close_dyn_buf(seq_pb, &seq);
  326. if (!meta)
  327. avio_close_dyn_buf(meta_pb, &meta);
  328. av_free(seq);
  329. av_free(meta);
  330. return ret;
  331. }