Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: media/filters/decoder_stream_traits.cc

Issue 2643103002: [Video] Fix keyframe distance average calculations. (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/base/pipeline_status.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/filters/decoder_stream_traits.h" 5 #include "media/filters/decoder_stream_traits.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/metrics/histogram_macros.h" 10 #include "base/metrics/histogram_macros.h"
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 const scoped_refptr<MediaLog>& media_log) 100 const scoped_refptr<MediaLog>& media_log)
101 // Randomly selected number of samples to keep. 101 // Randomly selected number of samples to keep.
102 : keyframe_distance_average_(16) {} 102 : keyframe_distance_average_(16) {}
103 103
104 void DecoderStreamTraits<DemuxerStream::VIDEO>::ReportStatistics( 104 void DecoderStreamTraits<DemuxerStream::VIDEO>::ReportStatistics(
105 const StatisticsCB& statistics_cb, 105 const StatisticsCB& statistics_cb,
106 int bytes_decoded) { 106 int bytes_decoded) {
107 PipelineStatistics statistics; 107 PipelineStatistics statistics;
108 statistics.video_bytes_decoded = bytes_decoded; 108 statistics.video_bytes_decoded = bytes_decoded;
109 109
110 // Before we have enough keyframes to calculate the average distance, we will 110 if (keyframe_distance_average_.count()) {
111 // assume the average keyframe distance is infinitely large.
112 if (keyframe_distance_average_.count() < 3) {
113 statistics.video_keyframe_distance_average = base::TimeDelta::Max();
114 } else {
115 statistics.video_keyframe_distance_average = 111 statistics.video_keyframe_distance_average =
116 keyframe_distance_average_.Average(); 112 keyframe_distance_average_.Average();
113 } else {
114 // Before we have enough keyframes to calculate the average distance, we
115 // will assume the average keyframe distance is infinitely large.
116 statistics.video_keyframe_distance_average = base::TimeDelta::Max();
117 } 117 }
118 118
119 statistics_cb.Run(statistics); 119 statistics_cb.Run(statistics);
120 } 120 }
121 121
122 void DecoderStreamTraits<DemuxerStream::VIDEO>::InitializeDecoder( 122 void DecoderStreamTraits<DemuxerStream::VIDEO>::InitializeDecoder(
123 DecoderType* decoder, 123 DecoderType* decoder,
124 DemuxerStream* stream, 124 DemuxerStream* stream,
125 CdmContext* cdm_context, 125 CdmContext* cdm_context,
126 const InitCB& init_cb, 126 const InitCB& init_cb,
127 const OutputCB& output_cb) { 127 const OutputCB& output_cb) {
128 DCHECK(stream->video_decoder_config().IsValidConfig()); 128 DCHECK(stream->video_decoder_config().IsValidConfig());
129 decoder->Initialize(stream->video_decoder_config(), 129 decoder->Initialize(stream->video_decoder_config(),
130 stream->liveness() == DemuxerStream::LIVENESS_LIVE, 130 stream->liveness() == DemuxerStream::LIVENESS_LIVE,
131 cdm_context, init_cb, output_cb); 131 cdm_context, init_cb, output_cb);
132 } 132 }
133 133
134 void DecoderStreamTraits<DemuxerStream::VIDEO>::OnStreamReset( 134 void DecoderStreamTraits<DemuxerStream::VIDEO>::OnStreamReset(
135 DemuxerStream* stream) { 135 DemuxerStream* stream) {
136 DCHECK(stream); 136 DCHECK(stream);
137 last_keyframe_timestamp_ = base::TimeDelta(); 137 last_keyframe_timestamp_ = base::TimeDelta();
138 keyframe_distance_average_.Reset();
139 } 138 }
140 139
141 void DecoderStreamTraits<DemuxerStream::VIDEO>::OnDecode( 140 void DecoderStreamTraits<DemuxerStream::VIDEO>::OnDecode(
142 const scoped_refptr<DecoderBuffer>& buffer) { 141 const scoped_refptr<DecoderBuffer>& buffer) {
143 if (!buffer) 142 if (!buffer)
144 return; 143 return;
145 144
146 if (buffer->end_of_stream()) { 145 if (buffer->end_of_stream()) {
147 last_keyframe_timestamp_ = base::TimeDelta(); 146 last_keyframe_timestamp_ = base::TimeDelta();
148 return; 147 return;
149 } 148 }
150 149
151 if (!buffer->is_key_frame()) 150 if (!buffer->is_key_frame())
152 return; 151 return;
153 152
154 base::TimeDelta current_frame_timestamp = buffer->timestamp(); 153 base::TimeDelta current_frame_timestamp = buffer->timestamp();
155 if (last_keyframe_timestamp_.is_zero()) { 154 if (last_keyframe_timestamp_.is_zero()) {
156 last_keyframe_timestamp_ = current_frame_timestamp; 155 last_keyframe_timestamp_ = current_frame_timestamp;
157 return; 156 return;
158 } 157 }
159 158
160 base::TimeDelta frame_distance = 159 base::TimeDelta frame_distance =
161 current_frame_timestamp - last_keyframe_timestamp_; 160 current_frame_timestamp - last_keyframe_timestamp_;
162 UMA_HISTOGRAM_MEDIUM_TIMES("Media.Video.KeyFrameDistance", frame_distance); 161 UMA_HISTOGRAM_MEDIUM_TIMES("Media.Video.KeyFrameDistance", frame_distance);
163 last_keyframe_timestamp_ = current_frame_timestamp; 162 last_keyframe_timestamp_ = current_frame_timestamp;
164 keyframe_distance_average_.AddSample(frame_distance); 163 keyframe_distance_average_.AddSample(frame_distance);
165 } 164 }
166 165
167 } // namespace media 166 } // namespace media
OLDNEW
« no previous file with comments | « media/base/pipeline_status.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698