Adding timing info to sequence headers
Change-Id: I0fdb09499196e02709e067f690dff71146ee5114
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 418c22e..a0b5268 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3289,6 +3289,25 @@
#endif
}
+#if CONFIG_TIMING_INFO_IN_SEQ_HEADERS
+static void write_timing_info_header(AV1_COMMON *const cm,
+ struct aom_write_bit_buffer *wb) {
+ aom_wb_write_bit(wb, cm->timing_info_present); // timing info present flag
+
+ if (cm->timing_info_present) {
+ aom_wb_write_unsigned_literal(wb, cm->num_units_in_tick,
+ 32); // Number of units in tick
+ aom_wb_write_unsigned_literal(wb, cm->time_scale, 32); // Time scale
+ aom_wb_write_bit(wb,
+ cm->equal_picture_interval); // Equal picture interval bit
+ if (cm->equal_picture_interval) {
+ aom_wb_write_uvlc(wb,
+ cm->num_ticks_per_picture - 1); // ticks per picture
+ }
+ }
+}
+#endif // CONFIG_TIMING_INFO_IN_SEQ_HEADERS
+
#if CONFIG_REFERENCE_BUFFER || CONFIG_OBU
void write_sequence_header(AV1_COMP *cpi, struct aom_write_bit_buffer *wb) {
AV1_COMMON *const cm = &cpi->common;
@@ -3547,6 +3566,10 @@
if (cm->frame_type == KEY_FRAME) {
write_bitdepth_colorspace_sampling(cm, wb);
+#if CONFIG_TIMING_INFO_IN_SEQ_HEADERS
+ // timing_info
+ write_timing_info_header(cm, wb);
+#endif
#if CONFIG_FRAME_SIZE
write_frame_size(cm, frame_size_override_flag, wb);
#else
@@ -3587,6 +3610,9 @@
if (cm->intra_only) {
write_bitdepth_colorspace_sampling(cm, wb);
+#if CONFIG_TIMING_INFO_IN_SEQ_HEADERS
+ write_timing_info_header(cm, wb);
+#endif
aom_wb_write_literal(wb, cpi->refresh_frame_mask, REF_FRAMES);
#if CONFIG_FRAME_SIZE
@@ -4352,6 +4378,11 @@
// color_config
write_bitdepth_colorspace_sampling(cm, &wb);
+#if CONFIG_TIMING_INFO_IN_SEQ_HEADERS
+ // timing_info
+ write_timing_info_header(cm, &wb);
+#endif
+
size = aom_wb_bytes_written(&wb);
return size;
}
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 298ec46..a276fdc 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -1067,6 +1067,13 @@
cm->chroma_sample_position = oxcf->chroma_sample_position;
#endif
cm->color_range = oxcf->color_range;
+#if CONFIG_TIMING_INFO_IN_SEQ_HEADERS
+ cm->timing_info_present = oxcf->timing_info_present;
+ cm->num_units_in_tick = oxcf->num_units_in_tick;
+ cm->time_scale = oxcf->time_scale;
+ cm->equal_picture_interval = oxcf->equal_picture_interval;
+ cm->num_ticks_per_picture = oxcf->num_ticks_per_picture;
+#endif
cm->width = oxcf->width;
cm->height = oxcf->height;
@@ -3102,6 +3109,14 @@
assert(IMPLIES(cm->profile <= PROFILE_1, cm->bit_depth <= AOM_BITS_10));
+#if CONFIG_TIMING_INFO_IN_SEQ_HEADERS
+ cm->timing_info_present = oxcf->timing_info_present;
+ cm->num_units_in_tick = oxcf->num_units_in_tick;
+ cm->time_scale = oxcf->time_scale;
+ cm->equal_picture_interval = oxcf->equal_picture_interval;
+ cm->num_ticks_per_picture = oxcf->num_ticks_per_picture;
+#endif
+
cpi->oxcf = *oxcf;
x->e_mbd.bd = (int)cm->bit_depth;
x->e_mbd.global_motion = cm->global_motion;
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 1e47e94..a47aff9 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -294,6 +294,14 @@
int color_range;
int render_width;
int render_height;
+#if CONFIG_TIMING_INFO_IN_SEQ_HEADERS
+ aom_timing_info_t timing_info;
+ int timing_info_present;
+ uint32_t num_units_in_tick;
+ uint32_t time_scale;
+ int equal_picture_interval;
+ uint32_t num_ticks_per_picture;
+#endif
#if CONFIG_EXT_PARTITION
aom_superblock_size_t superblock_size;