• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2018, Alliance for Open Media. All rights reserved
3  *
4  * This source code is subject to the terms of the BSD 2 Clause License and
5  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6  * was not distributed with this source code in the LICENSE file, you can
7  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8  * Media Patent License 1.0 was not distributed with this source code in the
9  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10  */
11 #include <stdio.h>
12 #include <string.h>
13 
14 #include "aom/aom_image.h"
15 #include "aom/aom_integer.h"
16 #include "aom_dsp/bitreader_buffer.h"
17 #include "aom_dsp/bitwriter_buffer.h"
18 #include "av1/common/obu_util.h"
19 #include "common/av1_config.h"
20 #include "config/aom_config.h"
21 
22 // Helper macros to reduce verbosity required to check for read errors.
23 //
24 // Note that when using these macros, even single line if statements should use
25 // curly braces to avoid unexpected behavior because all but the
26 // AV1C_POP_ERROR_HANDLER_DATA() macro consist of multiple statements.
27 #define AV1C_READ_BIT_OR_RETURN_ERROR(field)                                   \
28   int field = 0;                                                               \
29   do {                                                                         \
30     field = aom_rb_read_bit(reader);                                           \
31     if (result == -1) {                                                        \
32       fprintf(stderr,                                                          \
33               "av1c: Error reading bit for " #field ", value=%d result=%d.\n", \
34               field, result);                                                  \
35       return -1;                                                               \
36     }                                                                          \
37   } while (0)
38 
39 #define AV1C_READ_BITS_OR_RETURN_ERROR(field, length) \
40   int field = 0;                                      \
41   do {                                                \
42     field = aom_rb_read_literal(reader, (length));    \
43     if (result == -1) {                               \
44       fprintf(stderr,                                 \
45               "av1c: Could not read bits for " #field \
46               ", value=%d result=%d.\n",              \
47               field, result);                         \
48       return -1;                                      \
49     }                                                 \
50   } while (0)
51 
52 // Helper macros for setting/restoring the error handler data in
53 // aom_read_bit_buffer.
54 #define AV1C_PUSH_ERROR_HANDLER_DATA(new_data)                \
55   void *original_error_handler_data = NULL;                   \
56   do {                                                        \
57     original_error_handler_data = reader->error_handler_data; \
58     reader->error_handler_data = &new_data;                   \
59   } while (0)
60 
61 #define AV1C_POP_ERROR_HANDLER_DATA()                         \
62   do {                                                        \
63     reader->error_handler_data = original_error_handler_data; \
64   } while (0)
65 
66 static const size_t kAv1cSize = 4;
67 
bitreader_error_handler(void * data)68 static void bitreader_error_handler(void *data) {
69   int *error_val = (int *)data;
70   *error_val = -1;
71 }
72 
73 // Parse the AV1 timing_info() structure:
74 // timing_info( ) {
75 //   num_units_in_display_tick       f(32)
76 //   time_scale                      f(32)
77 //   equal_picture_interval          f(1)
78 //   if (equal_picture_interval)
79 //     num_ticks_per_picture_minus_1 uvlc()
80 //   }
parse_timing_info(struct aom_read_bit_buffer * reader)81 static int parse_timing_info(struct aom_read_bit_buffer *reader) {
82   int result = 0;
83   AV1C_PUSH_ERROR_HANDLER_DATA(result);
84 
85   AV1C_READ_BITS_OR_RETURN_ERROR(num_units_in_display_tick, 32);
86   AV1C_READ_BITS_OR_RETURN_ERROR(time_scale, 32);
87 
88   AV1C_READ_BIT_OR_RETURN_ERROR(equal_picture_interval);
89   if (equal_picture_interval) {
90     uint32_t num_ticks_per_picture_minus_1 = aom_rb_read_uvlc(reader);
91     if (result == -1) {
92       fprintf(stderr,
93               "av1c: Could not read bits for "
94               "num_ticks_per_picture_minus_1, value=%u.\n",
95               num_ticks_per_picture_minus_1);
96       return result;
97     }
98   }
99 
100   AV1C_POP_ERROR_HANDLER_DATA();
101   return result;
102 }
103 
104 // Parse the AV1 decoder_model_info() structure:
105 // decoder_model_info( ) {
106 //   buffer_delay_length_minus_1            f(5)
107 //   num_units_in_decoding_tick             f(32)
108 //   buffer_removal_time_length_minus_1     f(5)
109 //   frame_presentation_time_length_minus_1 f(5)
110 // }
111 //
112 // Returns -1 upon failure, or the value of buffer_delay_length_minus_1 + 1.
parse_decoder_model_info(struct aom_read_bit_buffer * reader)113 static int parse_decoder_model_info(struct aom_read_bit_buffer *reader) {
114   int result = 0;
115   AV1C_PUSH_ERROR_HANDLER_DATA(result);
116 
117   AV1C_READ_BITS_OR_RETURN_ERROR(buffer_delay_length_minus_1, 5);
118   AV1C_READ_BITS_OR_RETURN_ERROR(num_units_in_decoding_tick, 32);
119   AV1C_READ_BITS_OR_RETURN_ERROR(buffer_removal_time_length_minus_1, 5);
120   AV1C_READ_BITS_OR_RETURN_ERROR(frame_presentation_time_length_minus_1, 5);
121 
122   AV1C_POP_ERROR_HANDLER_DATA();
123   return buffer_delay_length_minus_1 + 1;
124 }
125 
126 // Parse the AV1 operating_parameters_info() structure:
127 // operating_parameters_info( op ) {
128 //   n = buffer_delay_length_minus_1 + 1
129 //   decoder_buffer_delay[ op ] f(n)
130 //   encoder_buffer_delay[ op ] f(n)
131 //   low_delay_mode_flag[ op ] f(1)
132 // }
parse_operating_parameters_info(struct aom_read_bit_buffer * reader,int buffer_delay_length_minus_1)133 static int parse_operating_parameters_info(struct aom_read_bit_buffer *reader,
134                                            int buffer_delay_length_minus_1) {
135   int result = 0;
136   AV1C_PUSH_ERROR_HANDLER_DATA(result);
137 
138   const int buffer_delay_length = buffer_delay_length_minus_1 + 1;
139   AV1C_READ_BITS_OR_RETURN_ERROR(decoder_buffer_delay, buffer_delay_length);
140   AV1C_READ_BITS_OR_RETURN_ERROR(encoder_buffer_delay, buffer_delay_length);
141   AV1C_READ_BIT_OR_RETURN_ERROR(low_delay_mode_flag);
142 
143   AV1C_POP_ERROR_HANDLER_DATA();
144   return result;
145 }
146 
147 // Parse the AV1 color_config() structure..See:
148 // https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=44
parse_color_config(struct aom_read_bit_buffer * reader,Av1Config * config)149 static int parse_color_config(struct aom_read_bit_buffer *reader,
150                               Av1Config *config) {
151   int result = 0;
152   AV1C_PUSH_ERROR_HANDLER_DATA(result);
153 
154   AV1C_READ_BIT_OR_RETURN_ERROR(high_bitdepth);
155   config->high_bitdepth = high_bitdepth;
156 
157   int bit_depth = 0;
158   if (config->seq_profile == 2 && config->high_bitdepth) {
159     AV1C_READ_BIT_OR_RETURN_ERROR(twelve_bit);
160     config->twelve_bit = twelve_bit;
161     bit_depth = config->twelve_bit ? 12 : 10;
162   } else {
163     bit_depth = config->high_bitdepth ? 10 : 8;
164   }
165 
166   if (config->seq_profile != 1) {
167     AV1C_READ_BIT_OR_RETURN_ERROR(mono_chrome);
168     config->monochrome = mono_chrome;
169   }
170 
171   int color_primaries = AOM_CICP_CP_UNSPECIFIED;
172   int transfer_characteristics = AOM_CICP_TC_UNSPECIFIED;
173   int matrix_coefficients = AOM_CICP_MC_UNSPECIFIED;
174 
175   AV1C_READ_BIT_OR_RETURN_ERROR(color_description_present_flag);
176   if (color_description_present_flag) {
177     AV1C_READ_BITS_OR_RETURN_ERROR(color_primaries_val, 8);
178     color_primaries = color_primaries_val;
179     AV1C_READ_BITS_OR_RETURN_ERROR(transfer_characteristics_val, 8);
180     transfer_characteristics = transfer_characteristics_val;
181     AV1C_READ_BITS_OR_RETURN_ERROR(matrix_coefficients_val, 8);
182     matrix_coefficients = matrix_coefficients_val;
183   }
184 
185   if (config->monochrome) {
186     AV1C_READ_BIT_OR_RETURN_ERROR(color_range);
187     config->chroma_subsampling_x = 1;
188     config->chroma_subsampling_y = 1;
189   } else if (color_primaries == AOM_CICP_CP_BT_709 &&
190              transfer_characteristics == AOM_CICP_TC_SRGB &&
191              matrix_coefficients == AOM_CICP_MC_IDENTITY) {
192     config->chroma_subsampling_x = 0;
193     config->chroma_subsampling_y = 0;
194   } else {
195     AV1C_READ_BIT_OR_RETURN_ERROR(color_range);
196     if (config->seq_profile == 0) {
197       config->chroma_subsampling_x = 1;
198       config->chroma_subsampling_y = 1;
199     } else if (config->seq_profile == 1) {
200       config->chroma_subsampling_x = 0;
201       config->chroma_subsampling_y = 0;
202     } else {
203       if (bit_depth == 12) {
204         AV1C_READ_BIT_OR_RETURN_ERROR(subsampling_x);
205         config->chroma_subsampling_x = subsampling_x;
206         if (subsampling_x) {
207           AV1C_READ_BIT_OR_RETURN_ERROR(subsampling_y);
208           config->chroma_subsampling_y = subsampling_y;
209         } else {
210           config->chroma_subsampling_y = 0;
211         }
212       } else {
213         config->chroma_subsampling_x = 1;
214         config->chroma_subsampling_y = 0;
215       }
216     }
217 
218     if (config->chroma_subsampling_x && config->chroma_subsampling_y) {
219       AV1C_READ_BITS_OR_RETURN_ERROR(chroma_sample_position, 2);
220       config->chroma_sample_position = chroma_sample_position;
221     }
222   }
223 
224   if (!config->monochrome) {
225     AV1C_READ_BIT_OR_RETURN_ERROR(separate_uv_delta_q);
226   }
227 
228   AV1C_POP_ERROR_HANDLER_DATA();
229   return result;
230 }
231 
232 // Parse AV1 Sequence Header OBU. See:
233 // https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=41
parse_sequence_header(const uint8_t * const buffer,size_t length,Av1Config * config)234 static int parse_sequence_header(const uint8_t *const buffer, size_t length,
235                                  Av1Config *config) {
236   int result = 0;
237   // The reader instance is local to this function, but a pointer to the
238   // reader instance is used within this function and throughout this file to
239   // allow use of the helper macros that reduce parse error checking verbosity.
240   struct aom_read_bit_buffer reader_instance = { buffer, buffer + length, 0,
241                                                  &result,
242                                                  bitreader_error_handler };
243   struct aom_read_bit_buffer *reader = &reader_instance;
244 
245   AV1C_READ_BITS_OR_RETURN_ERROR(seq_profile, 3);
246   config->seq_profile = seq_profile;
247   AV1C_READ_BIT_OR_RETURN_ERROR(still_picture);
248   AV1C_READ_BIT_OR_RETURN_ERROR(reduced_still_picture_header);
249   if (reduced_still_picture_header) {
250     config->initial_presentation_delay_present = 0;
251     AV1C_READ_BITS_OR_RETURN_ERROR(seq_level_idx_0, 5);
252     config->seq_level_idx_0 = seq_level_idx_0;
253     config->seq_tier_0 = 0;
254   } else {
255     int has_decoder_model = 0;
256     int buffer_delay_length = 0;
257 
258     AV1C_READ_BIT_OR_RETURN_ERROR(timing_info_present_flag);
259     if (timing_info_present_flag) {
260       if (parse_timing_info(reader) != 0) return -1;
261 
262       AV1C_READ_BIT_OR_RETURN_ERROR(decoder_model_info_present_flag);
263       if (decoder_model_info_present_flag &&
264           (buffer_delay_length = parse_decoder_model_info(reader)) == -1) {
265         return -1;
266       }
267       has_decoder_model = 1;
268     }
269 
270     AV1C_READ_BIT_OR_RETURN_ERROR(initial_presentation_delay_present);
271     config->initial_presentation_delay_present =
272         initial_presentation_delay_present;
273 
274     AV1C_READ_BITS_OR_RETURN_ERROR(operating_points_cnt_minus_1, 5);
275     const int num_operating_points = operating_points_cnt_minus_1 + 1;
276 
277     for (int op_index = 0; op_index < num_operating_points; ++op_index) {
278       AV1C_READ_BITS_OR_RETURN_ERROR(operating_point_idc, 12);
279       AV1C_READ_BITS_OR_RETURN_ERROR(seq_level_idx, 5);
280 
281       int seq_tier = 0;
282       if (seq_level_idx > 7) {
283         AV1C_READ_BIT_OR_RETURN_ERROR(seq_tier_this_op);
284         seq_tier = seq_tier_this_op;
285       }
286 
287       if (has_decoder_model) {
288         AV1C_READ_BIT_OR_RETURN_ERROR(decoder_model_present_for_op);
289         if (decoder_model_present_for_op) {
290           if (parse_operating_parameters_info(reader, buffer_delay_length) ==
291               -1) {
292             return -1;
293           }
294         }
295       }
296 
297       if (config->initial_presentation_delay_present) {
298         // Skip the initial presentation delay bits if present since this
299         // function has no access to the data required to properly set the
300         // field.
301         AV1C_READ_BIT_OR_RETURN_ERROR(
302             initial_presentation_delay_present_for_this_op);
303         if (initial_presentation_delay_present_for_this_op) {
304           AV1C_READ_BITS_OR_RETURN_ERROR(initial_presentation_delay_minus_1, 4);
305         }
306       }
307 
308       if (op_index == 0) {
309         // Av1Config needs only the values from the first operating point.
310         config->seq_level_idx_0 = seq_level_idx;
311         config->seq_tier_0 = seq_tier;
312         config->initial_presentation_delay_present = 0;
313         config->initial_presentation_delay_minus_one = 0;
314       }
315     }
316   }
317 
318   AV1C_READ_BITS_OR_RETURN_ERROR(frame_width_bits_minus_1, 4);
319   AV1C_READ_BITS_OR_RETURN_ERROR(frame_height_bits_minus_1, 4);
320   AV1C_READ_BITS_OR_RETURN_ERROR(max_frame_width_minus_1,
321                                  frame_width_bits_minus_1 + 1);
322   AV1C_READ_BITS_OR_RETURN_ERROR(max_frame_height_minus_1,
323                                  frame_height_bits_minus_1 + 1);
324 
325   uint8_t frame_id_numbers_present = 0;
326   if (!reduced_still_picture_header) {
327     AV1C_READ_BIT_OR_RETURN_ERROR(frame_id_numbers_present_flag);
328     frame_id_numbers_present = frame_id_numbers_present_flag;
329   }
330 
331   if (frame_id_numbers_present) {
332     AV1C_READ_BITS_OR_RETURN_ERROR(delta_frame_id_length_minus_2, 4);
333     AV1C_READ_BITS_OR_RETURN_ERROR(additional_frame_id_length_minus_1, 3);
334   }
335 
336   AV1C_READ_BIT_OR_RETURN_ERROR(use_128x128_superblock);
337   AV1C_READ_BIT_OR_RETURN_ERROR(enable_filter_intra);
338   AV1C_READ_BIT_OR_RETURN_ERROR(enable_intra_edge_filter);
339 
340   if (!reduced_still_picture_header) {
341     AV1C_READ_BIT_OR_RETURN_ERROR(enable_interintra_compound);
342     AV1C_READ_BIT_OR_RETURN_ERROR(enable_masked_compound);
343     AV1C_READ_BIT_OR_RETURN_ERROR(enable_warped_motion);
344     AV1C_READ_BIT_OR_RETURN_ERROR(enable_dual_filter);
345 
346     AV1C_READ_BIT_OR_RETURN_ERROR(enable_order_hint);
347     if (enable_order_hint) {
348       AV1C_READ_BIT_OR_RETURN_ERROR(enable_dist_wtd_comp);
349       AV1C_READ_BIT_OR_RETURN_ERROR(enable_ref_frame_mvs);
350     }
351 
352     const int SELECT_SCREEN_CONTENT_TOOLS = 2;
353     int seq_force_screen_content_tools = SELECT_SCREEN_CONTENT_TOOLS;
354     AV1C_READ_BIT_OR_RETURN_ERROR(seq_choose_screen_content_tools);
355     if (!seq_choose_screen_content_tools) {
356       AV1C_READ_BIT_OR_RETURN_ERROR(seq_force_screen_content_tools_val);
357       seq_force_screen_content_tools = seq_force_screen_content_tools_val;
358     }
359 
360     if (seq_force_screen_content_tools > 0) {
361       AV1C_READ_BIT_OR_RETURN_ERROR(seq_choose_integer_mv);
362 
363       if (!seq_choose_integer_mv) {
364         AV1C_READ_BIT_OR_RETURN_ERROR(seq_force_integer_mv);
365       }
366     }
367 
368     if (enable_order_hint) {
369       AV1C_READ_BITS_OR_RETURN_ERROR(order_hint_bits_minus_1, 3);
370     }
371   }
372 
373   AV1C_READ_BIT_OR_RETURN_ERROR(enable_superres);
374   AV1C_READ_BIT_OR_RETURN_ERROR(enable_cdef);
375   AV1C_READ_BIT_OR_RETURN_ERROR(enable_restoration);
376 
377   if (parse_color_config(reader, config) != 0) {
378     fprintf(stderr, "av1c: color_config() parse failed.\n");
379     return -1;
380   }
381 
382   AV1C_READ_BIT_OR_RETURN_ERROR(film_grain_params_present);
383   return 0;
384 }
385 
get_av1config_from_obu(const uint8_t * buffer,size_t length,int is_annexb,Av1Config * config)386 int get_av1config_from_obu(const uint8_t *buffer, size_t length, int is_annexb,
387                            Av1Config *config) {
388   if (!buffer || length == 0 || !config) {
389     return -1;
390   }
391 
392   ObuHeader obu_header;
393   memset(&obu_header, 0, sizeof(obu_header));
394 
395   size_t sequence_header_length = 0;
396   size_t obu_header_length = 0;
397   if (aom_read_obu_header_and_size(buffer, length, is_annexb, &obu_header,
398                                    &sequence_header_length,
399                                    &obu_header_length) != AOM_CODEC_OK ||
400       obu_header.type != OBU_SEQUENCE_HEADER ||
401       sequence_header_length + obu_header_length > length) {
402     return -1;
403   }
404 
405   memset(config, 0, sizeof(*config));
406   config->marker = 1;
407   config->version = 1;
408   return parse_sequence_header(buffer + obu_header_length,
409                                sequence_header_length, config);
410 }
411 
read_av1config(const uint8_t * buffer,size_t buffer_length,size_t * bytes_read,Av1Config * config)412 int read_av1config(const uint8_t *buffer, size_t buffer_length,
413                    size_t *bytes_read, Av1Config *config) {
414   if (!buffer || buffer_length < kAv1cSize || !bytes_read || !config) return -1;
415 
416   *bytes_read = 0;
417 
418   int result = 0;
419   struct aom_read_bit_buffer reader_instance = { buffer, buffer + buffer_length,
420                                                  0, &result,
421                                                  bitreader_error_handler };
422   struct aom_read_bit_buffer *reader = &reader_instance;
423 
424   memset(config, 0, sizeof(*config));
425 
426   AV1C_READ_BIT_OR_RETURN_ERROR(marker);
427   config->marker = marker;
428 
429   AV1C_READ_BITS_OR_RETURN_ERROR(version, 7);
430   config->version = version;
431 
432   AV1C_READ_BITS_OR_RETURN_ERROR(seq_profile, 3);
433   config->seq_profile = seq_profile;
434 
435   AV1C_READ_BITS_OR_RETURN_ERROR(seq_level_idx_0, 5);
436   config->seq_level_idx_0 = seq_level_idx_0;
437 
438   AV1C_READ_BIT_OR_RETURN_ERROR(seq_tier_0);
439   config->seq_tier_0 = seq_tier_0;
440 
441   AV1C_READ_BIT_OR_RETURN_ERROR(high_bitdepth);
442   config->high_bitdepth = high_bitdepth;
443 
444   AV1C_READ_BIT_OR_RETURN_ERROR(twelve_bit);
445   config->twelve_bit = twelve_bit;
446 
447   AV1C_READ_BIT_OR_RETURN_ERROR(monochrome);
448   config->monochrome = monochrome;
449 
450   AV1C_READ_BIT_OR_RETURN_ERROR(chroma_subsampling_x);
451   config->chroma_subsampling_x = chroma_subsampling_x;
452 
453   AV1C_READ_BIT_OR_RETURN_ERROR(chroma_subsampling_y);
454   config->chroma_subsampling_y = chroma_subsampling_y;
455 
456   AV1C_READ_BITS_OR_RETURN_ERROR(chroma_sample_position, 2);
457   config->chroma_sample_position = chroma_sample_position;
458 
459   AV1C_READ_BITS_OR_RETURN_ERROR(reserved, 3);
460 
461   AV1C_READ_BIT_OR_RETURN_ERROR(initial_presentation_delay_present);
462   config->initial_presentation_delay_present =
463       initial_presentation_delay_present;
464 
465   AV1C_READ_BITS_OR_RETURN_ERROR(initial_presentation_delay_minus_one, 4);
466   config->initial_presentation_delay_minus_one =
467       initial_presentation_delay_minus_one;
468 
469   *bytes_read = aom_rb_bytes_read(reader);
470 
471   return 0;
472 }
473 
write_av1config(const Av1Config * config,size_t capacity,size_t * bytes_written,uint8_t * buffer)474 int write_av1config(const Av1Config *config, size_t capacity,
475                     size_t *bytes_written, uint8_t *buffer) {
476   if (!config || !buffer || capacity < kAv1cSize || !bytes_written) return -1;
477 
478   *bytes_written = 0;
479   memset(buffer, 0, kAv1cSize);
480 
481   struct aom_write_bit_buffer writer = { buffer, 0 };
482 
483   aom_wb_write_bit(&writer, config->marker);
484   aom_wb_write_literal(&writer, config->version, 7);
485   aom_wb_write_literal(&writer, config->seq_profile, 3);
486   aom_wb_write_literal(&writer, config->seq_level_idx_0, 5);
487   aom_wb_write_bit(&writer, config->seq_tier_0);
488   aom_wb_write_bit(&writer, config->high_bitdepth);
489   aom_wb_write_bit(&writer, config->twelve_bit);
490   aom_wb_write_bit(&writer, config->monochrome);
491   aom_wb_write_bit(&writer, config->chroma_subsampling_x);
492   aom_wb_write_bit(&writer, config->chroma_subsampling_y);
493   aom_wb_write_literal(&writer, config->chroma_sample_position, 2);
494   aom_wb_write_literal(&writer, 0, 3);  // reserved
495   aom_wb_write_bit(&writer, config->initial_presentation_delay_present);
496 
497   if (config->initial_presentation_delay_present) {
498     aom_wb_write_literal(&writer, config->initial_presentation_delay_minus_one,
499                          4);
500   } else {
501     aom_wb_write_literal(&writer, 0, 4);  // reserved
502   }
503 
504   *bytes_written = aom_wb_bytes_written(&writer);
505   return 0;
506 }
507 
508 #undef AV1C_READ_BIT_OR_RETURN_ERROR
509 #undef AV1C_READ_BITS_OR_RETURN_ERROR
510 #undef AV1C_PUSH_ERROR_HANDLER_DATA
511 #undef AV1C_POP_ERROR_HANDLER_DATA
512