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. 4 5 #include "media/webm/webm_video_client.h" 6 7 #include "media/base/video_decoder_config.h" 8 #include "media/webm/webm_constants.h" 9 10 namespace media { 11 12 WebMVideoClient::WebMVideoClient(const LogCB& log_cb) 13 : log_cb_(log_cb) { 14 Reset(); 15 } 16 17 WebMVideoClient::~WebMVideoClient() { 18 } 19 20 void WebMVideoClient::Reset() { 21 pixel_width_ = -1; 22 pixel_height_ = -1; 23 crop_bottom_ = -1; 24 crop_top_ = -1; 25 crop_left_ = -1; 26 crop_right_ = -1; 27 display_width_ = -1; 28 display_height_ = -1; 29 display_unit_ = -1; 30 alpha_mode_ = -1; 31 } 32 33 bool WebMVideoClient::InitializeConfig( 34 const std::string& codec_id, const std::vector<uint8>& codec_private, 35 bool is_encrypted, VideoDecoderConfig* config) { 36 DCHECK(config); 37 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; 46 } else { 47 MEDIA_LOG(log_cb_) << "Unsupported video codec_id " << codec_id; 48 return false; 49 } 50 51 VideoFrame::Format format = 52 (alpha_mode_ == 1) ? VideoFrame::YV12A : VideoFrame::YV12; 53 54 if (pixel_width_ <= 0 || pixel_height_ <= 0) 55 return false; 56 57 // Set crop and display unit defaults if these elements are not present. 58 if (crop_bottom_ == -1) 59 crop_bottom_ = 0; 60 61 if (crop_top_ == -1) 62 crop_top_ = 0; 63 64 if (crop_left_ == -1) 65 crop_left_ = 0; 66 67 if (crop_right_ == -1) 68 crop_right_ = 0; 69 70 if (display_unit_ == -1) 71 display_unit_ = 0; 72 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) 86 return false; 87 natural_size = gfx::Size(display_width_, display_height_); 88 } else { 89 MEDIA_LOG(log_cb_) << "Unsupported display unit type " << display_unit_; 90 return false; 91 } 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(); 97 } 98 99 config->Initialize( 100 video_codec, profile, format, coded_size, visible_rect, natural_size, 101 extra_data, extra_data_size, is_encrypted, true); 102 return config->IsValidConfig(); 103 } 104 105 bool WebMVideoClient::OnUInt(int id, int64 val) { 106 int64* dst = NULL; 107 108 switch (id) { 109 case kWebMIdPixelWidth: 110 dst = &pixel_width_; 111 break; 112 case kWebMIdPixelHeight: 113 dst = &pixel_height_; 114 break; 115 case kWebMIdPixelCropTop: 116 dst = &crop_top_; 117 break; 118 case kWebMIdPixelCropBottom: 119 dst = &crop_bottom_; 120 break; 121 case kWebMIdPixelCropLeft: 122 dst = &crop_left_; 123 break; 124 case kWebMIdPixelCropRight: 125 dst = &crop_right_; 126 break; 127 case kWebMIdDisplayWidth: 128 dst = &display_width_; 129 break; 130 case kWebMIdDisplayHeight: 131 dst = &display_height_; 132 break; 133 case kWebMIdDisplayUnit: 134 dst = &display_unit_; 135 break; 136 case kWebMIdAlphaMode: 137 dst = &alpha_mode_; 138 break; 139 default: 140 return true; 141 } 142 143 if (*dst != -1) { 144 MEDIA_LOG(log_cb_) << "Multiple values for id " << std::hex << id 145 << " specified (" << *dst << " and " << val << ")"; 146 return false; 147 } 148 149 *dst = val; 150 return true; 151 } 152 153 bool WebMVideoClient::OnBinary(int id, const uint8* data, int size) { 154 // Accept binary fields we don't care about for now. 155 return true; 156 } 157 158 bool WebMVideoClient::OnFloat(int id, double val) { 159 // Accept float fields we don't care about for now. 160 return true; 161 } 162 163 } // namespace media 164