OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/base/video_decoder_config.h" | 5 #include "media/base/video_decoder_config.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
11 #include "media/base/limits.h" | 11 #include "media/base/limits.h" |
12 | 12 |
13 namespace media { | 13 namespace media { |
14 | 14 |
15 VideoDecoderConfig::VideoDecoderConfig() | 15 VideoDecoderConfig::VideoDecoderConfig() |
16 : codec_(kUnknownVideoCodec), | 16 : codec_(kUnknownVideoCodec), |
17 profile_(VIDEO_CODEC_PROFILE_UNKNOWN), | |
18 format_(VideoFrame::INVALID), | 17 format_(VideoFrame::INVALID), |
19 frame_rate_numerator_(0), | 18 frame_rate_numerator_(0), |
20 frame_rate_denominator_(0), | 19 frame_rate_denominator_(0), |
21 aspect_ratio_numerator_(0), | 20 aspect_ratio_numerator_(0), |
22 aspect_ratio_denominator_(0), | 21 aspect_ratio_denominator_(0), |
23 extra_data_size_(0) { | 22 extra_data_size_(0) { |
24 } | 23 } |
25 | 24 |
26 VideoDecoderConfig::VideoDecoderConfig(VideoCodec codec, | 25 VideoDecoderConfig::VideoDecoderConfig(VideoCodec codec, |
27 VideoCodecProfile profile, | |
28 VideoFrame::Format format, | 26 VideoFrame::Format format, |
29 const gfx::Size& coded_size, | 27 const gfx::Size& coded_size, |
30 const gfx::Rect& visible_rect, | 28 const gfx::Rect& visible_rect, |
31 int frame_rate_numerator, | 29 int frame_rate_numerator, |
32 int frame_rate_denominator, | 30 int frame_rate_denominator, |
33 int aspect_ratio_numerator, | 31 int aspect_ratio_numerator, |
34 int aspect_ratio_denominator, | 32 int aspect_ratio_denominator, |
35 const uint8* extra_data, | 33 const uint8* extra_data, |
36 size_t extra_data_size) { | 34 size_t extra_data_size) { |
37 Initialize(codec, profile, format, coded_size, visible_rect, | 35 Initialize(codec, format, coded_size, visible_rect, |
38 frame_rate_numerator, frame_rate_denominator, | 36 frame_rate_numerator, frame_rate_denominator, |
39 aspect_ratio_numerator, aspect_ratio_denominator, | 37 aspect_ratio_numerator, aspect_ratio_denominator, |
40 extra_data, extra_data_size); | 38 extra_data, extra_data_size); |
41 } | 39 } |
42 | 40 |
43 VideoDecoderConfig::~VideoDecoderConfig() {} | 41 VideoDecoderConfig::~VideoDecoderConfig() {} |
44 | 42 |
45 // Some videos just want to watch the world burn, with a height of 0; cap the | 43 // Some videos just want to watch the world burn, with a height of 0; cap the |
46 // "infinite" aspect ratio resulting. | 44 // "infinite" aspect ratio resulting. |
47 static const int kInfiniteRatio = 99999; | 45 static const int kInfiniteRatio = 99999; |
48 | 46 |
49 // Common aspect ratios (multiplied by 100 and truncated) used for histogramming | 47 // Common aspect ratios (multiplied by 100 and truncated) used for histogramming |
50 // video sizes. These were taken on 20111103 from | 48 // video sizes. These were taken on 20111103 from |
51 // http://wikipedia.org/wiki/Aspect_ratio_(image)#Previous_and_currently_used_as
pect_ratios | 49 // http://wikipedia.org/wiki/Aspect_ratio_(image)#Previous_and_currently_used_as
pect_ratios |
52 static const int kCommonAspectRatios100[] = { | 50 static const int kCommonAspectRatios100[] = { |
53 100, 115, 133, 137, 143, 150, 155, 160, 166, 175, 177, 185, 200, 210, 220, | 51 100, 115, 133, 137, 143, 150, 155, 160, 166, 175, 177, 185, 200, 210, 220, |
54 221, 235, 237, 240, 255, 259, 266, 276, 293, 400, 1200, kInfiniteRatio, | 52 221, 235, 237, 240, 255, 259, 266, 276, 293, 400, 1200, kInfiniteRatio, |
55 }; | 53 }; |
56 | 54 |
57 template<class T> // T has int width() & height() methods. | 55 template<class T> // T has int width() & height() methods. |
58 static void UmaHistogramAspectRatio(const char* name, const T& size) { | 56 static void UmaHistogramAspectRatio(const char* name, const T& size) { |
59 UMA_HISTOGRAM_CUSTOM_ENUMERATION( | 57 UMA_HISTOGRAM_CUSTOM_ENUMERATION( |
60 name, | 58 name, |
61 // Intentionally use integer division to truncate the result. | 59 // Intentionally use integer division to truncate the result. |
62 size.height() ? (size.width() * 100) / size.height() : kInfiniteRatio, | 60 size.height() ? (size.width() * 100) / size.height() : kInfiniteRatio, |
63 base::CustomHistogram::ArrayToCustomRanges( | 61 base::CustomHistogram::ArrayToCustomRanges( |
64 kCommonAspectRatios100, arraysize(kCommonAspectRatios100))); | 62 kCommonAspectRatios100, arraysize(kCommonAspectRatios100))); |
65 } | 63 } |
66 | 64 |
67 void VideoDecoderConfig::Initialize(VideoCodec codec, | 65 void VideoDecoderConfig::Initialize(VideoCodec codec, VideoFrame::Format format, |
68 VideoCodecProfile profile, | |
69 VideoFrame::Format format, | |
70 const gfx::Size& coded_size, | 66 const gfx::Size& coded_size, |
71 const gfx::Rect& visible_rect, | 67 const gfx::Rect& visible_rect, |
72 int frame_rate_numerator, | 68 int frame_rate_numerator, |
73 int frame_rate_denominator, | 69 int frame_rate_denominator, |
74 int aspect_ratio_numerator, | 70 int aspect_ratio_numerator, |
75 int aspect_ratio_denominator, | 71 int aspect_ratio_denominator, |
76 const uint8* extra_data, | 72 const uint8* extra_data, |
77 size_t extra_data_size) { | 73 size_t extra_data_size) { |
78 CHECK((extra_data_size != 0) == (extra_data != NULL)); | 74 CHECK((extra_data_size != 0) == (extra_data != NULL)); |
79 | 75 |
80 UMA_HISTOGRAM_ENUMERATION("Media.VideoCodec", codec, kVideoCodecMax + 1); | 76 UMA_HISTOGRAM_ENUMERATION("Media.VideoCodec", codec, kVideoCodecMax + 1); |
81 UMA_HISTOGRAM_ENUMERATION("Media.VideoCodecProfile", profile, | |
82 VIDEO_CODEC_PROFILE_MAX + 1); | |
83 UMA_HISTOGRAM_COUNTS_10000("Media.VideoCodedWidth", coded_size.width()); | 77 UMA_HISTOGRAM_COUNTS_10000("Media.VideoCodedWidth", coded_size.width()); |
84 UmaHistogramAspectRatio("Media.VideoCodedAspectRatio", coded_size); | 78 UmaHistogramAspectRatio("Media.VideoCodedAspectRatio", coded_size); |
85 UMA_HISTOGRAM_COUNTS_10000("Media.VideoVisibleWidth", visible_rect.width()); | 79 UMA_HISTOGRAM_COUNTS_10000("Media.VideoVisibleWidth", visible_rect.width()); |
86 UmaHistogramAspectRatio("Media.VideoVisibleAspectRatio", visible_rect); | 80 UmaHistogramAspectRatio("Media.VideoVisibleAspectRatio", visible_rect); |
87 | 81 |
88 codec_ = codec; | 82 codec_ = codec; |
89 profile_ = profile; | |
90 format_ = format; | 83 format_ = format; |
91 coded_size_ = coded_size; | 84 coded_size_ = coded_size; |
92 visible_rect_ = visible_rect; | 85 visible_rect_ = visible_rect; |
93 frame_rate_numerator_ = frame_rate_numerator; | 86 frame_rate_numerator_ = frame_rate_numerator; |
94 frame_rate_denominator_ = frame_rate_denominator; | 87 frame_rate_denominator_ = frame_rate_denominator; |
95 aspect_ratio_numerator_ = aspect_ratio_numerator; | 88 aspect_ratio_numerator_ = aspect_ratio_numerator; |
96 aspect_ratio_denominator_ = aspect_ratio_denominator; | 89 aspect_ratio_denominator_ = aspect_ratio_denominator; |
97 extra_data_size_ = extra_data_size; | 90 extra_data_size_ = extra_data_size; |
98 | 91 |
99 if (extra_data_size_ > 0) { | 92 if (extra_data_size_ > 0) { |
(...skipping 25 matching lines...) Expand all Loading... |
125 format_ != VideoFrame::INVALID && | 118 format_ != VideoFrame::INVALID && |
126 frame_rate_numerator_ > 0 && | 119 frame_rate_numerator_ > 0 && |
127 frame_rate_denominator_ > 0 && | 120 frame_rate_denominator_ > 0 && |
128 aspect_ratio_numerator_ > 0 && | 121 aspect_ratio_numerator_ > 0 && |
129 aspect_ratio_denominator_ > 0 && | 122 aspect_ratio_denominator_ > 0 && |
130 natural_size_.width() <= limits::kMaxDimension && | 123 natural_size_.width() <= limits::kMaxDimension && |
131 natural_size_.height() <= limits::kMaxDimension && | 124 natural_size_.height() <= limits::kMaxDimension && |
132 natural_size_.GetArea() <= limits::kMaxCanvas; | 125 natural_size_.GetArea() <= limits::kMaxCanvas; |
133 } | 126 } |
134 | 127 |
135 std::string VideoDecoderConfig::AsHumanReadableString() const { | |
136 std::ostringstream s; | |
137 s << "codec: " << codec() | |
138 << " format: " << format() | |
139 << " coded size: [" << coded_size().width() | |
140 << "," << coded_size().height() << "]" | |
141 << " visible rect: [" << visible_rect().x() | |
142 << "," << visible_rect().y() | |
143 << "," << visible_rect().width() | |
144 << "," << visible_rect().height() << "]" | |
145 << " natural size: [" << natural_size().width() | |
146 << "," << natural_size().height() << "]" | |
147 << " frame rate: " << frame_rate_numerator() | |
148 << "/" << frame_rate_denominator() | |
149 << " aspect ratio: " << aspect_ratio_numerator() | |
150 << "/" << aspect_ratio_denominator(); | |
151 return s.str(); | |
152 } | |
153 | |
154 VideoCodec VideoDecoderConfig::codec() const { | 128 VideoCodec VideoDecoderConfig::codec() const { |
155 return codec_; | 129 return codec_; |
156 } | 130 } |
157 | 131 |
158 VideoCodecProfile VideoDecoderConfig::profile() const { | |
159 return profile_; | |
160 } | |
161 | |
162 VideoFrame::Format VideoDecoderConfig::format() const { | 132 VideoFrame::Format VideoDecoderConfig::format() const { |
163 return format_; | 133 return format_; |
164 } | 134 } |
165 | 135 |
166 gfx::Size VideoDecoderConfig::coded_size() const { | 136 gfx::Size VideoDecoderConfig::coded_size() const { |
167 return coded_size_; | 137 return coded_size_; |
168 } | 138 } |
169 | 139 |
170 gfx::Rect VideoDecoderConfig::visible_rect() const { | 140 gfx::Rect VideoDecoderConfig::visible_rect() const { |
171 return visible_rect_; | 141 return visible_rect_; |
(...skipping 21 matching lines...) Expand all Loading... |
193 | 163 |
194 uint8* VideoDecoderConfig::extra_data() const { | 164 uint8* VideoDecoderConfig::extra_data() const { |
195 return extra_data_.get(); | 165 return extra_data_.get(); |
196 } | 166 } |
197 | 167 |
198 size_t VideoDecoderConfig::extra_data_size() const { | 168 size_t VideoDecoderConfig::extra_data_size() const { |
199 return extra_data_size_; | 169 return extra_data_size_; |
200 } | 170 } |
201 | 171 |
202 } // namespace media | 172 } // namespace media |
OLD | NEW |