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.

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