Add flag to estimate last frame's duration to stats.

BUG=https://bugs.chromium.org/p/webm/issues/detail?id=1204

Change-Id: Ie73e2981951f9eb6140bdfb0a6839320e009b7fe
This commit is contained in:
Frank Galligan 2016-04-29 11:51:16 -07:00
parent 196708a95f
commit bd3ab3abe6
4 changed files with 35 additions and 6 deletions

View File

@ -211,9 +211,18 @@ int64_t Vp9LevelStats::GetMaxLumaPictureSize() const {
} }
double Vp9LevelStats::GetAverageBitRate() const { double Vp9LevelStats::GetAverageBitRate() const {
const double duration_seconds = const int64_t frame_duration_ns = end_ns_ - start_ns_;
((duration_ns_ == -1) ? end_ns_ - start_ns_ : duration_ns_) / double duration_seconds =
((duration_ns_ == -1) ? frame_duration_ns : duration_ns_) /
libwebm::kNanosecondsPerSecond; libwebm::kNanosecondsPerSecond;
if (estimate_last_frame_duration_ &&
(duration_ns_ == -1 || duration_ns_ <= frame_duration_ns)) {
const double sec_per_frame = frame_duration_ns /
libwebm::kNanosecondsPerSecond /
(displayed_frames - 1);
duration_seconds += sec_per_frame;
}
return total_compressed_size_ / duration_seconds / 125.0; return total_compressed_size_ / duration_seconds / 125.0;
} }

View File

@ -87,7 +87,8 @@ class Vp9LevelStats {
total_uncompressed_bits_(0), total_uncompressed_bits_(0),
frames_refreshed_(0), frames_refreshed_(0),
max_frames_refreshed_(0), max_frames_refreshed_(0),
max_column_tiles_(0) {} max_column_tiles_(0),
estimate_last_frame_duration_(true) {}
~Vp9LevelStats() = default; ~Vp9LevelStats() = default;
Vp9LevelStats(Vp9LevelStats&& other) = delete; Vp9LevelStats(Vp9LevelStats&& other) = delete;
@ -135,6 +136,16 @@ class Vp9LevelStats {
// as the duration. // as the duration.
void set_duration(int64_t time_ns) { duration_ns_ = time_ns; } void set_duration(int64_t time_ns) { duration_ns_ = time_ns; }
bool estimate_last_frame_duration() const {
return estimate_last_frame_duration_;
}
// If true try to estimate the last frame's duration if the stream's duration
// is not set or the stream's duration equals the last frame's timestamp.
void set_estimate_last_frame_duration(bool flag) {
estimate_last_frame_duration_ = flag;
}
private: private:
int frames; int frames;
int displayed_frames; int displayed_frames;
@ -175,6 +186,8 @@ class Vp9LevelStats {
int max_frames_refreshed_; int max_frames_refreshed_;
int max_column_tiles_; int max_column_tiles_;
bool estimate_last_frame_duration_;
}; };
} // namespace vp9_parser } // namespace vp9_parser

View File

@ -129,12 +129,16 @@ TEST_F(Vp9LevelStatsTests, VideoOnlyFile) {
EXPECT_EQ(11, stats_.GetLevel()); EXPECT_EQ(11, stats_.GetLevel());
EXPECT_EQ(479232, stats_.GetMaxLumaSampleRate()); EXPECT_EQ(479232, stats_.GetMaxLumaSampleRate());
EXPECT_EQ(36864, stats_.GetMaxLumaPictureSize()); EXPECT_EQ(36864, stats_.GetMaxLumaPictureSize());
EXPECT_DOUBLE_EQ(275.512, stats_.GetAverageBitRate()); EXPECT_DOUBLE_EQ(264.03233333333333, stats_.GetAverageBitRate());
EXPECT_DOUBLE_EQ(147.136, stats_.GetMaxCpbSize()); EXPECT_DOUBLE_EQ(147.136, stats_.GetMaxCpbSize());
EXPECT_DOUBLE_EQ(20.873079938441883, stats_.GetCompressionRatio()); EXPECT_DOUBLE_EQ(20.873079938441883, stats_.GetCompressionRatio());
EXPECT_EQ(1, stats_.GetMaxColumnTiles()); EXPECT_EQ(1, stats_.GetMaxColumnTiles());
EXPECT_EQ(11, stats_.GetMinimumAltrefDistance()); EXPECT_EQ(11, stats_.GetMinimumAltrefDistance());
EXPECT_EQ(3, stats_.GetMaxReferenceFrames()); EXPECT_EQ(3, stats_.GetMaxReferenceFrames());
EXPECT_TRUE(stats_.estimate_last_frame_duration());
stats_.set_estimate_last_frame_duration(false);
EXPECT_DOUBLE_EQ(275.512, stats_.GetAverageBitRate());
} }
TEST_F(Vp9LevelStatsTests, Muxed) { TEST_F(Vp9LevelStatsTests, Muxed) {
@ -148,12 +152,15 @@ TEST_F(Vp9LevelStatsTests, Muxed) {
EXPECT_EQ(30, stats_.GetLevel()); EXPECT_EQ(30, stats_.GetLevel());
EXPECT_EQ(9838080, stats_.GetMaxLumaSampleRate()); EXPECT_EQ(9838080, stats_.GetMaxLumaSampleRate());
EXPECT_EQ(409920, stats_.GetMaxLumaPictureSize()); EXPECT_EQ(409920, stats_.GetMaxLumaPictureSize());
EXPECT_DOUBLE_EQ(468.38413361169108, stats_.GetAverageBitRate()); EXPECT_DOUBLE_EQ(447.09394572025053, stats_.GetAverageBitRate());
EXPECT_DOUBLE_EQ(118.464, stats_.GetMaxCpbSize()); EXPECT_DOUBLE_EQ(118.464, stats_.GetMaxCpbSize());
EXPECT_DOUBLE_EQ(263.10185597889068, stats_.GetCompressionRatio()); EXPECT_DOUBLE_EQ(263.10185597889068, stats_.GetCompressionRatio());
EXPECT_EQ(2, stats_.GetMaxColumnTiles()); EXPECT_EQ(2, stats_.GetMaxColumnTiles());
EXPECT_EQ(9, stats_.GetMinimumAltrefDistance()); EXPECT_EQ(9, stats_.GetMinimumAltrefDistance());
EXPECT_EQ(3, stats_.GetMaxReferenceFrames()); EXPECT_EQ(3, stats_.GetMaxReferenceFrames());
stats_.set_estimate_last_frame_duration(false);
EXPECT_DOUBLE_EQ(468.38413361169108, stats_.GetAverageBitRate());
} }
TEST_F(Vp9LevelStatsTests, SetDuration) { TEST_F(Vp9LevelStatsTests, SetDuration) {

View File

@ -35,7 +35,7 @@ using libwebm::Indent;
using libwebm::kNanosecondsPerSecond; using libwebm::kNanosecondsPerSecond;
using libwebm::kNanosecondsPerSecondi; using libwebm::kNanosecondsPerSecondi;
const char VERSION_STRING[] = "1.0.4.2"; const char VERSION_STRING[] = "1.0.4.3";
struct Options { struct Options {
Options(); Options();