- add sources.
[platform/framework/web/crosswalk.git] / src / media / webm / webm_video_client.cc
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