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(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(log_cb_
) << "Unsupported display unit type " << display_unit_
;
89 gfx::Size natural_size
= gfx::Size(display_width_
, display_height_
);
90 const uint8
* extra_data
= NULL
;
91 size_t extra_data_size
= 0;
92 if (codec_private
.size() > 0) {
93 extra_data
= &codec_private
[0];
94 extra_data_size
= codec_private
.size();
98 video_codec
, profile
, format
, coded_size
, visible_rect
, natural_size
,
99 extra_data
, extra_data_size
, is_encrypted
, true);
100 return config
->IsValidConfig();
103 bool WebMVideoClient::OnUInt(int id
, int64 val
) {
107 case kWebMIdPixelWidth
:
110 case kWebMIdPixelHeight
:
111 dst
= &pixel_height_
;
113 case kWebMIdPixelCropTop
:
116 case kWebMIdPixelCropBottom
:
119 case kWebMIdPixelCropLeft
:
122 case kWebMIdPixelCropRight
:
125 case kWebMIdDisplayWidth
:
126 dst
= &display_width_
;
128 case kWebMIdDisplayHeight
:
129 dst
= &display_height_
;
131 case kWebMIdDisplayUnit
:
132 dst
= &display_unit_
;
134 case kWebMIdAlphaMode
:
142 MEDIA_LOG(log_cb_
) << "Multiple values for id " << std::hex
<< id
143 << " specified (" << *dst
<< " and " << val
<< ")";
151 bool WebMVideoClient::OnBinary(int id
, const uint8
* data
, int size
) {
152 // Accept binary fields we don't care about for now.
156 bool WebMVideoClient::OnFloat(int id
, double val
) {
157 // Accept float fields we don't care about for now.