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.

412 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. static inline void uvlc(GetBitContext *gb)
  69. {
  70. int leading_zeros = 0;
  71. while (get_bits_left(gb)) {
  72. if (get_bits1(gb))
  73. break;
  74. leading_zeros++;
  75. }
  76. if (leading_zeros >= 32)
  77. return;
  78. skip_bits_long(gb, leading_zeros);
  79. }
  80. static int parse_color_config(AV1SequenceParameters *seq_params, GetBitContext *gb)
  81. {
  82. seq_params->high_bitdepth = get_bits1(gb);
  83. if (seq_params->seq_profile == FF_PROFILE_AV1_PROFESSIONAL && seq_params->high_bitdepth)
  84. seq_params->twelve_bit = get_bits1(gb);
  85. if (seq_params->seq_profile == FF_PROFILE_AV1_HIGH)
  86. seq_params->monochrome = 0;
  87. else
  88. seq_params->monochrome = get_bits1(gb);
  89. seq_params->color_description_present_flag = get_bits1(gb);
  90. if (seq_params->color_description_present_flag) {
  91. seq_params->color_primaries = get_bits(gb, 8);
  92. seq_params->transfer_characteristics = get_bits(gb, 8);
  93. seq_params->matrix_coefficients = get_bits(gb, 8);
  94. } else {
  95. seq_params->color_primaries = AVCOL_PRI_UNSPECIFIED;
  96. seq_params->transfer_characteristics = AVCOL_TRC_UNSPECIFIED;
  97. seq_params->matrix_coefficients = AVCOL_SPC_UNSPECIFIED;
  98. }
  99. if (seq_params->monochrome) {
  100. seq_params->color_range = get_bits1(gb);
  101. seq_params->chroma_subsampling_x = 1;
  102. seq_params->chroma_subsampling_y = 1;
  103. seq_params->chroma_sample_position = 0;
  104. return 0;
  105. } else if (seq_params->color_primaries == AVCOL_PRI_BT709 &&
  106. seq_params->transfer_characteristics == AVCOL_TRC_IEC61966_2_1 &&
  107. seq_params->matrix_coefficients == AVCOL_SPC_RGB) {
  108. seq_params->chroma_subsampling_x = 0;
  109. seq_params->chroma_subsampling_y = 0;
  110. } else {
  111. seq_params->color_range = get_bits1(gb);
  112. if (seq_params->seq_profile == FF_PROFILE_AV1_MAIN) {
  113. seq_params->chroma_subsampling_x = 1;
  114. seq_params->chroma_subsampling_y = 1;
  115. } else if (seq_params->seq_profile == FF_PROFILE_AV1_HIGH) {
  116. seq_params->chroma_subsampling_x = 0;
  117. seq_params->chroma_subsampling_y = 0;
  118. } else {
  119. if (seq_params->twelve_bit) {
  120. seq_params->chroma_subsampling_x = get_bits1(gb);
  121. if (seq_params->chroma_subsampling_x)
  122. seq_params->chroma_subsampling_y = get_bits1(gb);
  123. else
  124. seq_params->chroma_subsampling_y = 0;
  125. } else {
  126. seq_params->chroma_subsampling_x = 1;
  127. seq_params->chroma_subsampling_y = 0;
  128. }
  129. }
  130. if (seq_params->chroma_subsampling_x && seq_params->chroma_subsampling_y)
  131. seq_params->chroma_sample_position = get_bits(gb, 2);
  132. }
  133. skip_bits1(gb); // separate_uv_delta_q
  134. return 0;
  135. }
  136. static int parse_sequence_header(AV1SequenceParameters *seq_params, const uint8_t *buf, int size)
  137. {
  138. GetBitContext gb;
  139. int reduced_still_picture_header;
  140. int frame_width_bits_minus_1, frame_height_bits_minus_1;
  141. int size_bits, ret;
  142. size_bits = get_obu_bit_length(buf, size, AV1_OBU_SEQUENCE_HEADER);
  143. if (size_bits < 0)
  144. return size_bits;
  145. ret = init_get_bits(&gb, buf, size_bits);
  146. if (ret < 0)
  147. return ret;
  148. memset(seq_params, 0, sizeof(*seq_params));
  149. seq_params->seq_profile = get_bits(&gb, 3);
  150. skip_bits1(&gb); // still_picture
  151. reduced_still_picture_header = get_bits1(&gb);
  152. if (reduced_still_picture_header) {
  153. seq_params->seq_level_idx_0 = get_bits(&gb, 5);
  154. seq_params->seq_tier_0 = 0;
  155. } else {
  156. int initial_display_delay_present_flag, operating_points_cnt_minus_1;
  157. int decoder_model_info_present_flag, buffer_delay_length_minus_1;
  158. if (get_bits1(&gb)) { // timing_info_present_flag
  159. skip_bits_long(&gb, 32); // num_units_in_display_tick
  160. skip_bits_long(&gb, 32); // time_scale
  161. if (get_bits1(&gb)) // equal_picture_interval
  162. uvlc(&gb); // num_ticks_per_picture_minus_1
  163. decoder_model_info_present_flag = get_bits1(&gb);
  164. if (decoder_model_info_present_flag) {
  165. buffer_delay_length_minus_1 = get_bits(&gb, 5);
  166. skip_bits_long(&gb, 32); // num_units_in_decoding_tick
  167. skip_bits(&gb, 10); // buffer_removal_time_length_minus_1 (5)
  168. // frame_presentation_time_length_minus_1 (5)
  169. }
  170. } else
  171. decoder_model_info_present_flag = 0;
  172. initial_display_delay_present_flag = get_bits1(&gb);
  173. operating_points_cnt_minus_1 = get_bits(&gb, 5);
  174. for (int i = 0; i <= operating_points_cnt_minus_1; i++) {
  175. int seq_level_idx, seq_tier;
  176. skip_bits(&gb, 12); // operating_point_idc
  177. seq_level_idx = get_bits(&gb, 5);
  178. if (seq_level_idx > 7)
  179. seq_tier = get_bits1(&gb);
  180. else
  181. seq_tier = 0;
  182. if (decoder_model_info_present_flag) {
  183. if (get_bits1(&gb)) { // decoder_model_present_for_this_op
  184. skip_bits_long(&gb, buffer_delay_length_minus_1 + 1); // decoder_buffer_delay
  185. skip_bits_long(&gb, buffer_delay_length_minus_1 + 1); // encoder_buffer_delay
  186. skip_bits1(&gb); // low_delay_mode_flag
  187. }
  188. }
  189. if (initial_display_delay_present_flag) {
  190. if (get_bits1(&gb)) // initial_display_delay_present_for_this_op
  191. skip_bits(&gb, 4); // initial_display_delay_minus_1
  192. }
  193. if (i == 0) {
  194. seq_params->seq_level_idx_0 = seq_level_idx;
  195. seq_params->seq_tier_0 = seq_tier;
  196. }
  197. }
  198. }
  199. frame_width_bits_minus_1 = get_bits(&gb, 4);
  200. frame_height_bits_minus_1 = get_bits(&gb, 4);
  201. skip_bits(&gb, frame_width_bits_minus_1 + 1); // max_frame_width_minus_1
  202. skip_bits(&gb, frame_height_bits_minus_1 + 1); // max_frame_height_minus_1
  203. if (!reduced_still_picture_header) {
  204. if (get_bits1(&gb)) // frame_id_numbers_present_flag
  205. skip_bits(&gb, 7); // delta_frame_id_length_minus_2 (4), additional_frame_id_length_minus_1 (3)
  206. }
  207. skip_bits(&gb, 3); // use_128x128_superblock (1), enable_filter_intra (1), enable_intra_edge_filter (1)
  208. if (!reduced_still_picture_header) {
  209. int enable_order_hint, seq_force_screen_content_tools;
  210. skip_bits(&gb, 4); // enable_intraintra_compound (1), enable_masked_compound (1)
  211. // enable_warped_motion (1), enable_dual_filter (1)
  212. enable_order_hint = get_bits1(&gb);
  213. if (enable_order_hint)
  214. skip_bits(&gb, 2); // enable_jnt_comp (1), enable_ref_frame_mvs (1)
  215. if (get_bits1(&gb)) // seq_choose_screen_content_tools
  216. seq_force_screen_content_tools = 2;
  217. else
  218. seq_force_screen_content_tools = get_bits1(&gb);
  219. if (seq_force_screen_content_tools) {
  220. if (!get_bits1(&gb)) // seq_choose_integer_mv
  221. skip_bits1(&gb); // seq_force_integer_mv
  222. }
  223. if (enable_order_hint)
  224. skip_bits(&gb, 3); // order_hint_bits_minus_1
  225. }
  226. skip_bits(&gb, 3); // enable_superres (1), enable_cdef (1), enable_restoration (1)
  227. parse_color_config(seq_params, &gb);
  228. skip_bits1(&gb); // film_grain_params_present
  229. if (get_bits_left(&gb))
  230. return AVERROR_INVALIDDATA;
  231. return 0;
  232. }
  233. int ff_av1_parse_seq_header(AV1SequenceParameters *seq, const uint8_t *buf, int size)
  234. {
  235. int64_t obu_size;
  236. int start_pos, type, temporal_id, spatial_id;
  237. if (size <= 0)
  238. return AVERROR_INVALIDDATA;
  239. while (size > 0) {
  240. int len = parse_obu_header(buf, size, &obu_size, &start_pos,
  241. &type, &temporal_id, &spatial_id);
  242. if (len < 0)
  243. return len;
  244. switch (type) {
  245. case AV1_OBU_SEQUENCE_HEADER:
  246. if (!obu_size)
  247. return AVERROR_INVALIDDATA;
  248. return parse_sequence_header(seq, buf + start_pos, obu_size);
  249. default:
  250. break;
  251. }
  252. size -= len;
  253. buf += len;
  254. }
  255. return AVERROR_INVALIDDATA;
  256. }
  257. int ff_isom_write_av1c(AVIOContext *pb, const uint8_t *buf, int size)
  258. {
  259. AVIOContext *seq_pb = NULL, *meta_pb = NULL;
  260. AV1SequenceParameters seq_params;
  261. PutBitContext pbc;
  262. uint8_t header[4];
  263. uint8_t *seq = NULL, *meta = NULL;
  264. int64_t obu_size;
  265. int start_pos, type, temporal_id, spatial_id;
  266. int ret, nb_seq = 0, seq_size, meta_size;
  267. if (size <= 0)
  268. return AVERROR_INVALIDDATA;
  269. ret = avio_open_dyn_buf(&seq_pb);
  270. if (ret < 0)
  271. return ret;
  272. ret = avio_open_dyn_buf(&meta_pb);
  273. if (ret < 0)
  274. goto fail;
  275. while (size > 0) {
  276. int len = parse_obu_header(buf, size, &obu_size, &start_pos,
  277. &type, &temporal_id, &spatial_id);
  278. if (len < 0) {
  279. ret = len;
  280. goto fail;
  281. }
  282. switch (type) {
  283. case AV1_OBU_SEQUENCE_HEADER:
  284. nb_seq++;
  285. if (!obu_size || nb_seq > 1) {
  286. ret = AVERROR_INVALIDDATA;
  287. goto fail;
  288. }
  289. ret = parse_sequence_header(&seq_params, buf + start_pos, obu_size);
  290. if (ret < 0)
  291. goto fail;
  292. avio_write(seq_pb, buf, len);
  293. break;
  294. case AV1_OBU_METADATA:
  295. if (!obu_size) {
  296. ret = AVERROR_INVALIDDATA;
  297. goto fail;
  298. }
  299. avio_write(meta_pb, buf, len);
  300. break;
  301. default:
  302. break;
  303. }
  304. size -= len;
  305. buf += len;
  306. }
  307. seq_size = avio_close_dyn_buf(seq_pb, &seq);
  308. if (!seq_size) {
  309. ret = AVERROR_INVALIDDATA;
  310. goto fail;
  311. }
  312. init_put_bits(&pbc, header, sizeof(header));
  313. put_bits(&pbc, 1, 1); // marker
  314. put_bits(&pbc, 7, 1); // version
  315. put_bits(&pbc, 3, seq_params.seq_profile);
  316. put_bits(&pbc, 5, seq_params.seq_level_idx_0);
  317. put_bits(&pbc, 1, seq_params.seq_tier_0);
  318. put_bits(&pbc, 1, seq_params.high_bitdepth);
  319. put_bits(&pbc, 1, seq_params.twelve_bit);
  320. put_bits(&pbc, 1, seq_params.monochrome);
  321. put_bits(&pbc, 1, seq_params.chroma_subsampling_x);
  322. put_bits(&pbc, 1, seq_params.chroma_subsampling_y);
  323. put_bits(&pbc, 2, seq_params.chroma_sample_position);
  324. put_bits(&pbc, 8, 0); // padding
  325. flush_put_bits(&pbc);
  326. avio_write(pb, header, sizeof(header));
  327. avio_write(pb, seq, seq_size);
  328. meta_size = avio_close_dyn_buf(meta_pb, &meta);
  329. if (meta_size)
  330. avio_write(pb, meta, meta_size);
  331. fail:
  332. if (!seq)
  333. avio_close_dyn_buf(seq_pb, &seq);
  334. if (!meta)
  335. avio_close_dyn_buf(meta_pb, &meta);
  336. av_free(seq);
  337. av_free(meta);
  338. return ret;
  339. }