Calculate decode and display rate in decoder model BUG=aomedia:2332 Change-Id: Ia6d640fc1190eaa4839653452b25f79fcad09e6e
diff --git a/av1/encoder/level.c b/av1/encoder/level.c index 7ca465d..184c977 100644 --- a/av1/encoder/level.c +++ b/av1/encoder/level.c
@@ -473,6 +473,13 @@ decoder_model->last_bit_arrival_time = 0.0; decoder_model->coded_bits = 0; + decoder_model->removal_time = INVALID_TIME; + decoder_model->presentation_time = INVALID_TIME; + decoder_model->decode_samples = 0; + decoder_model->display_samples = 0; + decoder_model->max_decode_rate = 0.0; + decoder_model->max_display_rate = 0.0; + decoder_model->num_frame = -1; decoder_model->num_decoded_frame = -1; decoder_model->num_shown_frame = -1; @@ -510,6 +517,7 @@ aom_clear_system_state(); const AV1_COMMON *const cm = &cpi->common; + const int luma_pic_size = cm->superres_upscaled_width * cm->height; const int show_existing_frame = cm->show_existing_frame; const int show_frame = cm->show_frame || show_existing_frame; ++decoder_model->num_frame; @@ -534,6 +542,16 @@ return; } + const int previous_decode_samples = decoder_model->decode_samples; + const double previous_removal_time = decoder_model->removal_time; + assert(previous_removal_time < removal_time); + decoder_model->removal_time = removal_time; + decoder_model->decode_samples = luma_pic_size; + const double this_decode_rate = + previous_decode_samples / (removal_time - previous_removal_time); + decoder_model->max_decode_rate = + AOMMAX(decoder_model->max_decode_rate, this_decode_rate); + // A frame with show_existing_frame being false indicates the end of a DFG. // Update the bits arrival time of this DFG. const double buffer_delay = (decoder_model->encoder_buffer_delay + @@ -638,6 +656,19 @@ decoder_model->status = DISPLAY_FRAME_LATE; return; } + + const int previous_display_samples = decoder_model->display_samples; + const double previous_presentation_time = decoder_model->presentation_time; + decoder_model->display_samples = luma_pic_size; + decoder_model->presentation_time = presentation_time; + if (presentation_time >= 0.0 && previous_presentation_time >= 0.0) { + assert(previous_presentation_time < presentation_time); + const double this_display_rate = + previous_display_samples / + (presentation_time - previous_presentation_time); + decoder_model->max_display_rate = + AOMMAX(decoder_model->max_display_rate, this_display_rate); + } } }
diff --git a/av1/encoder/level.h b/av1/encoder/level.h index 1bdd357..d8964a4 100644 --- a/av1/encoder/level.h +++ b/av1/encoder/level.h
@@ -136,6 +136,15 @@ double first_bit_arrival_time; double last_bit_arrival_time; size_t coded_bits; + + // Information for the frame being processed. + double removal_time; + double presentation_time; + int decode_samples; + int display_samples; + + double max_display_rate; + double max_decode_rate; } DECODER_MODEL; typedef struct {