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

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

Issue 2611333003: [Video] Disable bg optimization if avg keyframe distance is >10s (Closed)
Patch Set: Changed the name and set a minimum number of samples 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
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>
8
7 #include "base/logging.h" 9 #include "base/logging.h"
8 #include "base/metrics/histogram_macros.h" 10 #include "base/metrics/histogram_macros.h"
9 #include "media/base/audio_buffer.h" 11 #include "media/base/audio_buffer.h"
10 #include "media/base/audio_decoder.h" 12 #include "media/base/audio_decoder.h"
11 #include "media/base/audio_decoder_config.h" 13 #include "media/base/audio_decoder_config.h"
12 #include "media/base/video_decoder.h" 14 #include "media/base/video_decoder.h"
13 #include "media/base/video_frame.h" 15 #include "media/base/video_frame.h"
14 16
15 namespace media { 17 namespace media {
16 18
17 // Audio decoder stream traits implementation. 19 // Audio decoder stream traits implementation.
18 20
19 // static 21 // static
20 std::string DecoderStreamTraits<DemuxerStream::AUDIO>::ToString() { 22 std::string DecoderStreamTraits<DemuxerStream::AUDIO>::ToString() {
21 return "audio"; 23 return "audio";
22 } 24 }
23 25
24 // static 26 // static
25 bool DecoderStreamTraits<DemuxerStream::AUDIO>::NeedsBitstreamConversion( 27 bool DecoderStreamTraits<DemuxerStream::AUDIO>::NeedsBitstreamConversion(
26 DecoderType* decoder) { 28 DecoderType* decoder) {
27 return decoder->NeedsBitstreamConversion(); 29 return decoder->NeedsBitstreamConversion();
28 } 30 }
29 31
30 // static 32 // static
31 void DecoderStreamTraits<DemuxerStream::AUDIO>::ReportStatistics(
32 const StatisticsCB& statistics_cb,
33 int bytes_decoded) {
34 PipelineStatistics statistics;
35 statistics.audio_bytes_decoded = bytes_decoded;
36 statistics_cb.Run(statistics);
37 }
38
39 // static
40 scoped_refptr<DecoderStreamTraits<DemuxerStream::AUDIO>::OutputType> 33 scoped_refptr<DecoderStreamTraits<DemuxerStream::AUDIO>::OutputType>
41 DecoderStreamTraits<DemuxerStream::AUDIO>::CreateEOSOutput() { 34 DecoderStreamTraits<DemuxerStream::AUDIO>::CreateEOSOutput() {
42 return OutputType::CreateEOSBuffer(); 35 return OutputType::CreateEOSBuffer();
43 } 36 }
44 37
45 DecoderStreamTraits<DemuxerStream::AUDIO>::DecoderStreamTraits( 38 DecoderStreamTraits<DemuxerStream::AUDIO>::DecoderStreamTraits(
46 const scoped_refptr<MediaLog>& media_log) 39 const scoped_refptr<MediaLog>& media_log)
47 : media_log_(media_log) {} 40 : media_log_(media_log) {}
48 41
42 void DecoderStreamTraits<DemuxerStream::AUDIO>::ReportStatistics(
43 const StatisticsCB& statistics_cb,
44 int bytes_decoded) {
45 PipelineStatistics statistics;
46 statistics.audio_bytes_decoded = bytes_decoded;
47 statistics_cb.Run(statistics);
48 }
49
49 void DecoderStreamTraits<DemuxerStream::AUDIO>::InitializeDecoder( 50 void DecoderStreamTraits<DemuxerStream::AUDIO>::InitializeDecoder(
50 DecoderType* decoder, 51 DecoderType* decoder,
51 DemuxerStream* stream, 52 DemuxerStream* stream,
52 CdmContext* cdm_context, 53 CdmContext* cdm_context,
53 const InitCB& init_cb, 54 const InitCB& init_cb,
54 const OutputCB& output_cb) { 55 const OutputCB& output_cb) {
55 DCHECK(stream->audio_decoder_config().IsValidConfig()); 56 DCHECK(stream->audio_decoder_config().IsValidConfig());
56 decoder->Initialize(stream->audio_decoder_config(), cdm_context, init_cb, 57 decoder->Initialize(stream->audio_decoder_config(), cdm_context, init_cb,
57 output_cb); 58 output_cb);
58 } 59 }
(...skipping 24 matching lines...) Expand all
83 return "video"; 84 return "video";
84 } 85 }
85 86
86 // static 87 // static
87 bool DecoderStreamTraits<DemuxerStream::VIDEO>::NeedsBitstreamConversion( 88 bool DecoderStreamTraits<DemuxerStream::VIDEO>::NeedsBitstreamConversion(
88 DecoderType* decoder) { 89 DecoderType* decoder) {
89 return decoder->NeedsBitstreamConversion(); 90 return decoder->NeedsBitstreamConversion();
90 } 91 }
91 92
92 // static 93 // static
94 scoped_refptr<DecoderStreamTraits<DemuxerStream::VIDEO>::OutputType>
95 DecoderStreamTraits<DemuxerStream::VIDEO>::CreateEOSOutput() {
96 return OutputType::CreateEOSFrame();
97 }
98
99 DecoderStreamTraits<DemuxerStream::VIDEO>::DecoderStreamTraits(
100 const scoped_refptr<MediaLog>& media_log)
101 // Randomly selected number of samples to keep.
102 : keyframe_distance_average_(16) {}
103
93 void DecoderStreamTraits<DemuxerStream::VIDEO>::ReportStatistics( 104 void DecoderStreamTraits<DemuxerStream::VIDEO>::ReportStatistics(
94 const StatisticsCB& statistics_cb, 105 const StatisticsCB& statistics_cb,
95 int bytes_decoded) { 106 int bytes_decoded) {
96 PipelineStatistics statistics; 107 PipelineStatistics statistics;
97 statistics.video_bytes_decoded = bytes_decoded; 108 statistics.video_bytes_decoded = bytes_decoded;
109
110 // Before we have enough keyframes to calculate the average distance, we will
111 // assume the average keyframe distance is infinitely large.
112 if (keyframe_distance_average_.count() < 3) {
113 statistics.video_keyframe_distance_average_ms =
114 std::numeric_limits<int64_t>::max();
115 } else {
116 statistics.video_keyframe_distance_average_ms =
117 keyframe_distance_average_.Average().InMilliseconds();
118 }
119
98 statistics_cb.Run(statistics); 120 statistics_cb.Run(statistics);
99 } 121 }
100 122
101 // static
102 scoped_refptr<DecoderStreamTraits<DemuxerStream::VIDEO>::OutputType>
103 DecoderStreamTraits<DemuxerStream::VIDEO>::CreateEOSOutput() {
104 return OutputType::CreateEOSFrame();
105 }
106
107 void DecoderStreamTraits<DemuxerStream::VIDEO>::InitializeDecoder( 123 void DecoderStreamTraits<DemuxerStream::VIDEO>::InitializeDecoder(
108 DecoderType* decoder, 124 DecoderType* decoder,
109 DemuxerStream* stream, 125 DemuxerStream* stream,
110 CdmContext* cdm_context, 126 CdmContext* cdm_context,
111 const InitCB& init_cb, 127 const InitCB& init_cb,
112 const OutputCB& output_cb) { 128 const OutputCB& output_cb) {
113 DCHECK(stream->video_decoder_config().IsValidConfig()); 129 DCHECK(stream->video_decoder_config().IsValidConfig());
114 decoder->Initialize(stream->video_decoder_config(), 130 decoder->Initialize(stream->video_decoder_config(),
115 stream->liveness() == DemuxerStream::LIVENESS_LIVE, 131 stream->liveness() == DemuxerStream::LIVENESS_LIVE,
116 cdm_context, init_cb, output_cb); 132 cdm_context, init_cb, output_cb);
117 } 133 }
118 134
119 void DecoderStreamTraits<DemuxerStream::VIDEO>::OnStreamReset( 135 void DecoderStreamTraits<DemuxerStream::VIDEO>::OnStreamReset(
120 DemuxerStream* stream) { 136 DemuxerStream* stream) {
121 DCHECK(stream); 137 DCHECK(stream);
122 last_keyframe_timestamp_ = base::TimeDelta(); 138 last_keyframe_timestamp_ = base::TimeDelta();
139 keyframe_distance_average_.Reset();
123 } 140 }
124 141
125 void DecoderStreamTraits<DemuxerStream::VIDEO>::OnDecode( 142 void DecoderStreamTraits<DemuxerStream::VIDEO>::OnDecode(
126 const scoped_refptr<DecoderBuffer>& buffer) { 143 const scoped_refptr<DecoderBuffer>& buffer) {
127 if (!buffer) 144 if (!buffer)
128 return; 145 return;
129 146
130 if (buffer->end_of_stream()) { 147 if (buffer->end_of_stream()) {
131 last_keyframe_timestamp_ = base::TimeDelta(); 148 last_keyframe_timestamp_ = base::TimeDelta();
132 return; 149 return;
133 } 150 }
134 151
135 if (!buffer->is_key_frame()) 152 if (!buffer->is_key_frame())
136 return; 153 return;
137 154
138 base::TimeDelta current_frame_timestamp = buffer->timestamp(); 155 base::TimeDelta current_frame_timestamp = buffer->timestamp();
139 if (last_keyframe_timestamp_.is_zero()) { 156 if (last_keyframe_timestamp_.is_zero()) {
140 last_keyframe_timestamp_ = current_frame_timestamp; 157 last_keyframe_timestamp_ = current_frame_timestamp;
141 return; 158 return;
142 } 159 }
143 160
144 UMA_HISTOGRAM_MEDIUM_TIMES( 161 base::TimeDelta frame_distance =
145 "Media.Video.KeyFrameDistance", 162 current_frame_timestamp - last_keyframe_timestamp_;
146 current_frame_timestamp - last_keyframe_timestamp_); 163 UMA_HISTOGRAM_MEDIUM_TIMES("Media.Video.KeyFrameDistance", frame_distance);
147 last_keyframe_timestamp_ = current_frame_timestamp; 164 last_keyframe_timestamp_ = current_frame_timestamp;
165 keyframe_distance_average_.AddSample(frame_distance);
148 } 166 }
149 167
150 } // namespace media 168 } // namespace media
OLDNEW
« media/blink/webmediaplayer_impl.cc ('K') | « media/filters/decoder_stream_traits.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698