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 scoped_refptr
<MediaLog
>& media_log
)
13 : media_log_(media_log
) {
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
, media_log_
) << "Unsupported video codec_id " << codec_id
;
51 VideoPixelFormat format
=
52 (alpha_mode_
== 1) ? PIXEL_FORMAT_YV12A
: PIXEL_FORMAT_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
, media_log_
) << "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
, COLOR_SPACE_HD_REC709
,
99 coded_size
, visible_rect
, natural_size
, extra_data
,
100 extra_data_size
, is_encrypted
, true);
101 return config
->IsValidConfig();
104 bool WebMVideoClient::OnUInt(int id
, int64 val
) {
108 case kWebMIdPixelWidth
:
111 case kWebMIdPixelHeight
:
112 dst
= &pixel_height_
;
114 case kWebMIdPixelCropTop
:
117 case kWebMIdPixelCropBottom
:
120 case kWebMIdPixelCropLeft
:
123 case kWebMIdPixelCropRight
:
126 case kWebMIdDisplayWidth
:
127 dst
= &display_width_
;
129 case kWebMIdDisplayHeight
:
130 dst
= &display_height_
;
132 case kWebMIdDisplayUnit
:
133 dst
= &display_unit_
;
135 case kWebMIdAlphaMode
:
143 MEDIA_LOG(ERROR
, media_log_
) << "Multiple values for id " << std::hex
<< id
144 << " 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.