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> |
| 8 |
7 #include "base/logging.h" | 9 #include "base/logging.h" |
8 | 10 |
9 namespace media { | 11 namespace media { |
10 | 12 |
11 VideoDecoderConfig::VideoDecoderConfig() | 13 VideoDecoderConfig::VideoDecoderConfig() |
12 : codec_(kUnknownVideoCodec), | 14 : codec_(kUnknownVideoCodec), |
13 format_(VideoFrame::INVALID), | 15 format_(VideoFrame::INVALID), |
14 frame_rate_numerator_(0), | 16 frame_rate_numerator_(0), |
15 frame_rate_denominator_(0), | 17 frame_rate_denominator_(0), |
| 18 aspect_ratio_numerator_(0), |
| 19 aspect_ratio_denominator_(0), |
16 extra_data_size_(0) { | 20 extra_data_size_(0) { |
17 } | 21 } |
18 | 22 |
19 VideoDecoderConfig::VideoDecoderConfig(VideoCodec codec, | 23 VideoDecoderConfig::VideoDecoderConfig(VideoCodec codec, |
20 VideoFrame::Format format, | 24 VideoFrame::Format format, |
21 const gfx::Size& coded_size, | 25 const gfx::Size& coded_size, |
22 const gfx::Rect& visible_rect, | 26 const gfx::Rect& visible_rect, |
23 int frame_rate_numerator, | 27 int frame_rate_numerator, |
24 int frame_rate_denominator, | 28 int frame_rate_denominator, |
| 29 int aspect_ratio_numerator, |
| 30 int aspect_ratio_denominator, |
25 const uint8* extra_data, | 31 const uint8* extra_data, |
26 size_t extra_data_size) { | 32 size_t extra_data_size) { |
27 Initialize(codec, format, coded_size, visible_rect, | 33 Initialize(codec, format, coded_size, visible_rect, |
28 frame_rate_numerator, frame_rate_denominator, | 34 frame_rate_numerator, frame_rate_denominator, |
| 35 aspect_ratio_numerator, aspect_ratio_denominator, |
29 extra_data, extra_data_size); | 36 extra_data, extra_data_size); |
30 } | 37 } |
31 | 38 |
32 VideoDecoderConfig::~VideoDecoderConfig() {} | 39 VideoDecoderConfig::~VideoDecoderConfig() {} |
33 | 40 |
34 void VideoDecoderConfig::Initialize(VideoCodec codec, | 41 void VideoDecoderConfig::Initialize(VideoCodec codec, |
35 VideoFrame::Format format, | 42 VideoFrame::Format format, |
36 const gfx::Size& coded_size, | 43 const gfx::Size& coded_size, |
37 const gfx::Rect& visible_rect, | 44 const gfx::Rect& visible_rect, |
38 int frame_rate_numerator, | 45 int frame_rate_numerator, |
39 int frame_rate_denominator, | 46 int frame_rate_denominator, |
| 47 int aspect_ratio_numerator, |
| 48 int aspect_ratio_denominator, |
40 const uint8* extra_data, | 49 const uint8* extra_data, |
41 size_t extra_data_size) { | 50 size_t extra_data_size) { |
42 CHECK((extra_data_size != 0) == (extra_data != NULL)); | 51 CHECK((extra_data_size != 0) == (extra_data != NULL)); |
43 | 52 |
44 codec_ = codec; | 53 codec_ = codec; |
45 format_ = format; | 54 format_ = format; |
46 coded_size_ = coded_size; | 55 coded_size_ = coded_size; |
47 visible_rect_ = visible_rect; | 56 visible_rect_ = visible_rect; |
48 frame_rate_numerator_ = frame_rate_numerator; | 57 frame_rate_numerator_ = frame_rate_numerator; |
49 frame_rate_denominator_ = frame_rate_denominator; | 58 frame_rate_denominator_ = frame_rate_denominator; |
| 59 aspect_ratio_numerator_ = aspect_ratio_numerator; |
| 60 aspect_ratio_denominator_ = aspect_ratio_denominator; |
50 extra_data_size_ = extra_data_size; | 61 extra_data_size_ = extra_data_size; |
51 | 62 |
52 if (extra_data_size_ > 0) { | 63 if (extra_data_size_ > 0) { |
53 extra_data_.reset(new uint8[extra_data_size_]); | 64 extra_data_.reset(new uint8[extra_data_size_]); |
54 memcpy(extra_data_.get(), extra_data, extra_data_size_); | 65 memcpy(extra_data_.get(), extra_data, extra_data_size_); |
55 } else { | 66 } else { |
56 extra_data_.reset(); | 67 extra_data_.reset(); |
57 } | 68 } |
| 69 |
| 70 // Calculate the natural size given the aspect ratio and visible rect. |
| 71 if (aspect_ratio_denominator == 0) { |
| 72 natural_size_.SetSize(0, 0); |
| 73 return; |
| 74 } |
| 75 |
| 76 double aspect_ratio = aspect_ratio_numerator / |
| 77 static_cast<double>(aspect_ratio_denominator); |
| 78 |
| 79 int width = floor(visible_rect.width() * aspect_ratio + 0.5); |
| 80 int height = visible_rect.height(); |
| 81 |
| 82 // An even width makes things easier for YV12 and appears to be the behavior |
| 83 // expected by WebKit layout tests. |
| 84 natural_size_.SetSize(width & ~1, height); |
58 } | 85 } |
59 | 86 |
60 bool VideoDecoderConfig::IsValidConfig() const { | 87 bool VideoDecoderConfig::IsValidConfig() const { |
61 return codec_ != kUnknownVideoCodec && | 88 return codec_ != kUnknownVideoCodec && |
62 format_ != VideoFrame::INVALID && | 89 format_ != VideoFrame::INVALID && |
63 frame_rate_numerator_ > 0 && | 90 frame_rate_numerator_ > 0 && |
64 frame_rate_denominator_ > 0; | 91 frame_rate_denominator_ > 0 && |
| 92 aspect_ratio_numerator_ > 0 && |
| 93 aspect_ratio_denominator_ > 0; |
65 } | 94 } |
66 | 95 |
67 VideoCodec VideoDecoderConfig::codec() const { | 96 VideoCodec VideoDecoderConfig::codec() const { |
68 return codec_; | 97 return codec_; |
69 } | 98 } |
70 | 99 |
71 VideoFrame::Format VideoDecoderConfig::format() const { | 100 VideoFrame::Format VideoDecoderConfig::format() const { |
72 return format_; | 101 return format_; |
73 } | 102 } |
74 | 103 |
75 gfx::Size VideoDecoderConfig::coded_size() const { | 104 gfx::Size VideoDecoderConfig::coded_size() const { |
76 return coded_size_; | 105 return coded_size_; |
77 } | 106 } |
78 | 107 |
79 gfx::Rect VideoDecoderConfig::visible_rect() const { | 108 gfx::Rect VideoDecoderConfig::visible_rect() const { |
80 return visible_rect_; | 109 return visible_rect_; |
81 } | 110 } |
82 | 111 |
| 112 gfx::Size VideoDecoderConfig::natural_size() const { |
| 113 return natural_size_; |
| 114 } |
| 115 |
83 int VideoDecoderConfig::frame_rate_numerator() const { | 116 int VideoDecoderConfig::frame_rate_numerator() const { |
84 return frame_rate_numerator_; | 117 return frame_rate_numerator_; |
85 } | 118 } |
86 | 119 |
87 int VideoDecoderConfig::frame_rate_denominator() const { | 120 int VideoDecoderConfig::frame_rate_denominator() const { |
88 return frame_rate_denominator_; | 121 return frame_rate_denominator_; |
89 } | 122 } |
90 | 123 |
| 124 int VideoDecoderConfig::aspect_ratio_numerator() const { |
| 125 return aspect_ratio_numerator_; |
| 126 } |
| 127 |
| 128 int VideoDecoderConfig::aspect_ratio_denominator() const { |
| 129 return aspect_ratio_denominator_; |
| 130 } |
| 131 |
91 uint8* VideoDecoderConfig::extra_data() const { | 132 uint8* VideoDecoderConfig::extra_data() const { |
92 return extra_data_.get(); | 133 return extra_data_.get(); |
93 } | 134 } |
94 | 135 |
95 size_t VideoDecoderConfig::extra_data_size() const { | 136 size_t VideoDecoderConfig::extra_data_size() const { |
96 return extra_data_size_; | 137 return extra_data_size_; |
97 } | 138 } |
98 | 139 |
99 } // namespace media | 140 } // namespace media |
OLD | NEW |