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