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() {
: PluginResource(connection, instance),
num_decodes_(0),
get_picture_(NULL),
+ get_picture_0_1_(NULL),
gles2_impl_(NULL),
initialized_(false),
testing_(false),
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) {
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;
}
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);
}
}
}
}
-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();
}