1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "media/webm/webm_video_client.h"
7 #include "media/base/video_decoder_config.h"
8 #include "media/webm/webm_constants.h"
12 WebMVideoClient::WebMVideoClient(const LogCB
& log_cb
)
17 WebMVideoClient::~WebMVideoClient() {
20 void WebMVideoClient::Reset() {
33 bool WebMVideoClient::InitializeConfig(
34 const std::string
& codec_id
, const std::vector
<uint8
>& codec_private
,
35 bool is_encrypted
, VideoDecoderConfig
* config
) {
38 VideoCodec video_codec
= kUnknownVideoCodec
;
39 VideoCodecProfile profile
= VIDEO_CODEC_PROFILE_UNKNOWN
;
40 if (codec_id
== "V_VP8") {
41 video_codec
= kCodecVP8
;
42 profile
= VP8PROFILE_MAIN
;
43 } else if (codec_id
== "V_VP9") {
44 video_codec
= kCodecVP9
;
45 profile
= VP9PROFILE_MAIN
;
47 MEDIA_LOG(log_cb_
) << "Unsupported video codec_id " << codec_id
;
51 VideoFrame::Format format
=
52 (alpha_mode_
== 1) ? VideoFrame::YV12A
: VideoFrame::YV12
;
54 if (pixel_width_
<= 0 || pixel_height_
<= 0)
57 // Set crop and display unit defaults if these elements are not present.
58 if (crop_bottom_
== -1)
67 if (crop_right_
== -1)
70 if (display_unit_
== -1)
73 gfx::Size
coded_size(pixel_width_
, pixel_height_
);
74 gfx::Rect
visible_rect(crop_top_
, crop_left_
,
75 pixel_width_
- (crop_left_
+ crop_right_
),
76 pixel_height_
- (crop_top_
+ crop_bottom_
));
77 gfx::Size natural_size
= coded_size
;
78 if (display_unit_
== 0) {
79 if (display_width_
<= 0)
80 display_width_
= pixel_width_
;
81 if (display_height_
<= 0)
82 display_height_
= pixel_height_
;
83 natural_size
= gfx::Size(display_width_
, display_height_
);
84 } else if (display_unit_
== 3) {
85 if (display_width_
<= 0 || display_height_
<= 0)
87 natural_size
= gfx::Size(display_width_
, display_height_
);
89 MEDIA_LOG(log_cb_
) << "Unsupported display unit type " << display_unit_
;
92 const uint8
* extra_data
= NULL
;
93 size_t extra_data_size
= 0;
94 if (codec_private
.size() > 0) {
95 extra_data
= &codec_private
[0];
96 extra_data_size
= codec_private
.size();
100 video_codec
, profile
, format
, coded_size
, visible_rect
, natural_size
,
101 extra_data
, extra_data_size
, is_encrypted
, true);
102 return config
->IsValidConfig();
105 bool WebMVideoClient::OnUInt(int id
, int64 val
) {
109 case kWebMIdPixelWidth
:
112 case kWebMIdPixelHeight
:
113 dst
= &pixel_height_
;
115 case kWebMIdPixelCropTop
:
118 case kWebMIdPixelCropBottom
:
121 case kWebMIdPixelCropLeft
:
124 case kWebMIdPixelCropRight
:
127 case kWebMIdDisplayWidth
:
128 dst
= &display_width_
;
130 case kWebMIdDisplayHeight
:
131 dst
= &display_height_
;
133 case kWebMIdDisplayUnit
:
134 dst
= &display_unit_
;
136 case kWebMIdAlphaMode
:
144 MEDIA_LOG(log_cb_
) << "Multiple values for id " << std::hex
<< id
145 << " specified (" << *dst
<< " and " << val
<< ")";
153 bool WebMVideoClient::OnBinary(int id
, const uint8
* data
, int size
) {
154 // Accept binary fields we don't care about for now.
158 bool WebMVideoClient::OnFloat(int id
, double val
) {
159 // Accept float fields we don't care about for now.