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.