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
3 // found in the LICENSE file.
5 #include "media/formats/webm/webm_video_client.h"
7 #include "media/base/video_decoder_config.h"
8 #include "media/formats/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_ANY
;
43 } else if (codec_id
== "V_VP9") {
44 video_codec
= kCodecVP9
;
45 profile
= VP9PROFILE_ANY
;
47 MEDIA_LOG(ERROR
, 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 if (display_unit_
== 0) {
78 if (display_width_
<= 0)
79 display_width_
= visible_rect
.width();
80 if (display_height_
<= 0)
81 display_height_
= visible_rect
.height();
82 } else if (display_unit_
== 3) {
83 if (display_width_
<= 0 || display_height_
<= 0)
86 MEDIA_LOG(ERROR
, log_cb_
) << "Unsupported display unit type "
90 gfx::Size natural_size
= gfx::Size(display_width_
, display_height_
);
91 const uint8
* extra_data
= NULL
;
92 size_t extra_data_size
= 0;
93 if (codec_private
.size() > 0) {
94 extra_data
= &codec_private
[0];
95 extra_data_size
= codec_private
.size();
98 config
->Initialize(video_codec
, profile
, format
,
99 VideoFrame::COLOR_SPACE_UNSPECIFIED
, coded_size
,
100 visible_rect
, natural_size
, extra_data
, extra_data_size
,
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(ERROR
, log_cb_
) << "Multiple values for id " << std::hex
<< id
145 << " specified (" << *dst
<< " and " << val
154 bool WebMVideoClient::OnBinary(int id
, const uint8
* data
, int size
) {
155 // Accept binary fields we don't care about for now.
159 bool WebMVideoClient::OnFloat(int id
, double val
) {
160 // Accept float fields we don't care about for now.