Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ppapi / proxy / video_decoder_resource.cc
index 733e6f8..2dbe60e 100644 (file)
@@ -49,8 +49,10 @@ VideoDecoderResource::Texture::Texture(uint32_t texture_target,
 VideoDecoderResource::Texture::~Texture() {
 }
 
-VideoDecoderResource::Picture::Picture(int32_t decode_id, uint32_t texture_id)
-    : decode_id(decode_id), texture_id(texture_id) {
+VideoDecoderResource::Picture::Picture(int32_t decode_id,
+                                       uint32_t texture_id,
+                                       const PP_Rect& visible_rect)
+    : decode_id(decode_id), texture_id(texture_id), visible_rect(visible_rect) {
 }
 
 VideoDecoderResource::Picture::~Picture() {
@@ -61,6 +63,7 @@ VideoDecoderResource::VideoDecoderResource(Connection connection,
     : PluginResource(connection, instance),
       num_decodes_(0),
       get_picture_(NULL),
+      get_picture_0_1_(NULL),
       gles2_impl_(NULL),
       initialized_(false),
       testing_(false),
@@ -249,6 +252,13 @@ int32_t VideoDecoderResource::Decode(uint32_t decode_id,
   return PP_OK_COMPLETIONPENDING;
 }
 
+int32_t VideoDecoderResource::GetPicture0_1(
+    PP_VideoPicture_0_1* picture,
+    scoped_refptr<TrackedCallback> callback) {
+  get_picture_0_1_ = picture;
+  return GetPicture(NULL, callback);
+}
+
 int32_t VideoDecoderResource::GetPicture(
     PP_VideoPicture* picture,
     scoped_refptr<TrackedCallback> callback) {
@@ -259,14 +269,16 @@ int32_t VideoDecoderResource::GetPicture(
   if (get_picture_callback_.get())
     return PP_ERROR_INPROGRESS;
 
+  get_picture_ = picture;
+
   // If the next picture is ready, return it synchronously.
   if (!received_pictures_.empty()) {
-    WriteNextPicture(picture);
+    WriteNextPicture();
     return PP_OK;
   }
 
   get_picture_callback_ = callback;
-  get_picture_ = picture;
+
   return PP_OK_COMPLETIONPENDING;
 }
 
@@ -399,16 +411,15 @@ void VideoDecoderResource::OnPluginMsgRequestTextures(
 void VideoDecoderResource::OnPluginMsgPictureReady(
     const ResourceMessageReplyParams& params,
     int32_t decode_id,
-    uint32_t texture_id) {
-  received_pictures_.push(Picture(decode_id, texture_id));
+    uint32_t texture_id,
+    const PP_Rect& visible_rect) {
+  received_pictures_.push(Picture(decode_id, texture_id, visible_rect));
 
   if (TrackedCallback::IsPending(get_picture_callback_)) {
     // The plugin may call GetPicture in its callback.
     scoped_refptr<TrackedCallback> callback;
     callback.swap(get_picture_callback_);
-    PP_VideoPicture* picture = get_picture_;
-    get_picture_ = NULL;
-    WriteNextPicture(picture);
+    WriteNextPicture();
     callback->Run(PP_OK);
   }
 }
@@ -510,20 +521,41 @@ void VideoDecoderResource::DeleteGLTexture(uint32_t id) {
   }
 }
 
-void VideoDecoderResource::WriteNextPicture(PP_VideoPicture* pp_picture) {
+void VideoDecoderResource::WriteNextPicture() {
   DCHECK(!received_pictures_.empty());
   Picture& picture = received_pictures_.front();
+
   // Internally, we identify decodes by a unique id, which the host returns
   // to us in the picture. Use this to get the plugin's decode_id.
-  pp_picture->decode_id = decode_ids_[picture.decode_id % kMaximumPictureDelay];
-  pp_picture->texture_id = picture.texture_id;
+  uint32_t decode_id = decode_ids_[picture.decode_id % kMaximumPictureDelay];
+  uint32_t texture_id = picture.texture_id;
+  uint32_t texture_target = 0;
+  PP_Size texture_size = PP_MakeSize(0, 0);
   TextureMap::iterator it = textures_.find(picture.texture_id);
   if (it != textures_.end()) {
-    pp_picture->texture_target = it->second.texture_target;
-    pp_picture->texture_size = it->second.size;
+    texture_target = it->second.texture_target;
+    texture_size = it->second.size;
   } else {
     NOTREACHED();
   }
+
+  if (get_picture_) {
+    DCHECK(!get_picture_0_1_);
+    get_picture_->decode_id = decode_id;
+    get_picture_->texture_id = texture_id;
+    get_picture_->texture_target = texture_target;
+    get_picture_->texture_size = texture_size;
+    get_picture_->visible_rect = picture.visible_rect;
+    get_picture_ = NULL;
+  } else {
+    DCHECK(get_picture_0_1_);
+    get_picture_0_1_->decode_id = decode_id;
+    get_picture_0_1_->texture_id = texture_id;
+    get_picture_0_1_->texture_target = texture_target;
+    get_picture_0_1_->texture_size = texture_size;
+    get_picture_0_1_ = NULL;
+  }
+
   received_pictures_.pop();
 }