summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-08 19:39:45 +0000
committersail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-08 19:39:45 +0000
commit08bab53f31485b4644a6a318fa5eb606c667ec1b (patch)
treed2e863aaa1a3e133885ae0c5d303a6ec92708c9a
parent5b31fe43ab3afe06483b34286f856c9ca07639fb (diff)
downloadchromium_src-08bab53f31485b4644a6a318fa5eb606c667ec1b.zip
chromium_src-08bab53f31485b4644a6a318fa5eb606c667ec1b.tar.gz
chromium_src-08bab53f31485b4644a6a318fa5eb606c667ec1b.tar.bz2
Plumb texture target to VideoDecodeAccelerator::Client
Currently all VideoDecodeAccelerator::Clients use GL_TEXTURE_2D as their texture target. Unfortunately the Mac decoder only supports GL_TEXTURE_RECTANGLE_ARB texture targets. This CL allows decoders to choose which texture target they want. BUG=127414 TEST= Review URL: https://chromiumcodereview.appspot.com/10392141 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@141258 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/common/gpu/client/gpu_video_decode_accelerator_host.cc9
-rw-r--r--content/common/gpu/client/gpu_video_decode_accelerator_host.h5
-rw-r--r--content/common/gpu/gpu_messages.h8
-rw-r--r--content/common/gpu/media/dxva_video_decode_accelerator.cc6
-rw-r--r--content/common/gpu/media/gpu_video_decode_accelerator.cc7
-rw-r--r--content/common/gpu/media/gpu_video_decode_accelerator.h5
-rw-r--r--content/common/gpu/media/mac_video_decode_accelerator.mm3
-rw-r--r--content/common/gpu/media/omx_video_decode_accelerator.cc3
-rw-r--r--content/common/gpu/media/rendering_helper.h1
-rw-r--r--content/common/gpu/media/rendering_helper_egl.cc5
-rw-r--r--content/common/gpu/media/rendering_helper_mac.mm3
-rw-r--r--content/common/gpu/media/video_decode_accelerator_unittest.cc12
-rw-r--r--content/renderer/media/pepper_platform_video_decoder_impl.cc6
-rw-r--r--content/renderer/media/pepper_platform_video_decoder_impl.h5
-rw-r--r--content/renderer/media/renderer_gpu_video_decoder_factories.cc18
-rw-r--r--content/renderer/media/renderer_gpu_video_decoder_factories.h4
-rw-r--r--media/filters/gpu_video_decoder.cc9
-rw-r--r--media/filters/gpu_video_decoder.h5
-rw-r--r--media/video/video_decode_accelerator.h5
-rw-r--r--ppapi/api/dev/ppp_video_decoder_dev.idl27
-rw-r--r--ppapi/c/dev/ppp_video_decoder_dev.h29
-rw-r--r--ppapi/cpp/dev/video_decoder_client_dev.cc5
-rw-r--r--ppapi/cpp/dev/video_decoder_client_dev.h3
-rw-r--r--ppapi/examples/video_decode/video_decode.cc28
-rw-r--r--ppapi/proxy/ppapi_messages.h5
-rw-r--r--ppapi/proxy/ppp_video_decoder_proxy.cc14
-rw-r--r--ppapi/proxy/ppp_video_decoder_proxy.h3
-rw-r--r--webkit/plugins/ppapi/ppb_video_decoder_impl.cc6
-rw-r--r--webkit/plugins/ppapi/ppb_video_decoder_impl.h5
29 files changed, 170 insertions, 74 deletions
diff --git a/content/common/gpu/client/gpu_video_decode_accelerator_host.cc b/content/common/gpu/client/gpu_video_decode_accelerator_host.cc
index 0ac5167a..a903ed0 100644
--- a/content/common/gpu/client/gpu_video_decode_accelerator_host.cc
+++ b/content/common/gpu/client/gpu_video_decode_accelerator_host.cc
@@ -145,10 +145,13 @@ void GpuVideoDecodeAcceleratorHost::OnBitstreamBufferProcessed(
void GpuVideoDecodeAcceleratorHost::OnProvidePictureBuffer(
uint32 num_requested_buffers,
- const gfx::Size& buffer_size) {
+ const gfx::Size& buffer_size,
+ uint32 texture_target) {
DCHECK(CalledOnValidThread());
- if (client_)
- client_->ProvidePictureBuffers(num_requested_buffers, buffer_size);
+ if (client_) {
+ client_->ProvidePictureBuffers(
+ num_requested_buffers, buffer_size, texture_target);
+ }
}
void GpuVideoDecodeAcceleratorHost::OnDismissPictureBuffer(
diff --git a/content/common/gpu/client/gpu_video_decode_accelerator_host.h b/content/common/gpu/client/gpu_video_decode_accelerator_host.h
index a2a6a24..5a0bd78 100644
--- a/content/common/gpu/client/gpu_video_decode_accelerator_host.h
+++ b/content/common/gpu/client/gpu_video_decode_accelerator_host.h
@@ -48,8 +48,9 @@ class GpuVideoDecodeAcceleratorHost
void Send(IPC::Message* message);
void OnBitstreamBufferProcessed(int32 bitstream_buffer_id);
- void OnProvidePictureBuffer(
- uint32 num_requested_buffers, const gfx::Size& buffer_size);
+ void OnProvidePictureBuffer(uint32 num_requested_buffers,
+ const gfx::Size& buffer_size,
+ uint32 texture_target);
void OnDismissPictureBuffer(int32 picture_buffer_id);
void OnPictureReady(int32 picture_buffer_id, int32 bitstream_buffer_id);
void OnFlushDone();
diff --git a/content/common/gpu/gpu_messages.h b/content/common/gpu/gpu_messages.h
index cd8a7b5..1b5746c 100644
--- a/content/common/gpu/gpu_messages.h
+++ b/content/common/gpu/gpu_messages.h
@@ -517,9 +517,11 @@ IPC_MESSAGE_ROUTED1(AcceleratedVideoDecoderHostMsg_BitstreamBufferProcessed,
int32) /* Processed buffer ID */
// Allocate video frames for output of the hardware video decoder.
-IPC_MESSAGE_ROUTED2(AcceleratedVideoDecoderHostMsg_ProvidePictureBuffers,
- int32, /* Number of video frames to generate */
- gfx::Size) /* Requested size of buffer */
+IPC_MESSAGE_ROUTED3(
+ AcceleratedVideoDecoderHostMsg_ProvidePictureBuffers,
+ int32, /* Number of video frames to generate */
+ gfx::Size, /* Requested size of buffer */
+ uint32 ) /* Texture target */
// Decoder reports that a picture is ready and buffer does not need to be passed
// back to the decoder.
diff --git a/content/common/gpu/media/dxva_video_decode_accelerator.cc b/content/common/gpu/media/dxva_video_decode_accelerator.cc
index 28f5f66..207702b 100644
--- a/content/common/gpu/media/dxva_video_decode_accelerator.cc
+++ b/content/common/gpu/media/dxva_video_decode_accelerator.cc
@@ -1014,8 +1014,10 @@ void DXVAVideoDecodeAccelerator::RequestPictureBuffers(int width, int height) {
// TODO(ananta)
// We need to support mid stream resize.
if (state_ != kUninitialized && client_) {
- client_->ProvidePictureBuffers(kNumPictureBuffers,
- gfx::Size(width, height));
+ client_->ProvidePictureBuffers(
+ kNumPictureBuffers,
+ gfx::Size(width, height),
+ GL_TEXTURE_2D);
}
}
diff --git a/content/common/gpu/media/gpu_video_decode_accelerator.cc b/content/common/gpu/media/gpu_video_decode_accelerator.cc
index 6ad1329..9c67bbf 100644
--- a/content/common/gpu/media/gpu_video_decode_accelerator.cc
+++ b/content/common/gpu/media/gpu_video_decode_accelerator.cc
@@ -69,9 +69,12 @@ bool GpuVideoDecodeAccelerator::OnMessageReceived(const IPC::Message& msg) {
}
void GpuVideoDecodeAccelerator::ProvidePictureBuffers(
- uint32 requested_num_of_buffers, const gfx::Size& dimensions) {
+ uint32 requested_num_of_buffers,
+ const gfx::Size& dimensions,
+ uint32 texture_target) {
if (!Send(new AcceleratedVideoDecoderHostMsg_ProvidePictureBuffers(
- host_route_id_, requested_num_of_buffers, dimensions))) {
+ host_route_id_, requested_num_of_buffers, dimensions,
+ texture_target))) {
DLOG(ERROR) << "Send(AcceleratedVideoDecoderHostMsg_ProvidePictureBuffers) "
<< "failed";
}
diff --git a/content/common/gpu/media/gpu_video_decode_accelerator.h b/content/common/gpu/media/gpu_video_decode_accelerator.h
index bf37e38..9abe74c 100644
--- a/content/common/gpu/media/gpu_video_decode_accelerator.h
+++ b/content/common/gpu/media/gpu_video_decode_accelerator.h
@@ -30,8 +30,9 @@ class GpuVideoDecodeAccelerator
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
// media::VideoDecodeAccelerator::Client implementation.
- virtual void ProvidePictureBuffers(
- uint32 requested_num_of_buffers, const gfx::Size& dimensions) OVERRIDE;
+ virtual void ProvidePictureBuffers(uint32 requested_num_of_buffers,
+ const gfx::Size& dimensions,
+ uint32 texture_target) OVERRIDE;
virtual void DismissPictureBuffer(int32 picture_buffer_id) OVERRIDE;
virtual void PictureReady(const media::Picture& picture) OVERRIDE;
virtual void NotifyInitializeDone() OVERRIDE;
diff --git a/content/common/gpu/media/mac_video_decode_accelerator.mm b/content/common/gpu/media/mac_video_decode_accelerator.mm
index c21a4f9..6008069 100644
--- a/content/common/gpu/media/mac_video_decode_accelerator.mm
+++ b/content/common/gpu/media/mac_video_decode_accelerator.mm
@@ -328,7 +328,8 @@ void MacVideoDecodeAccelerator::RequestPictures() {
client_->ProvidePictureBuffers(
kNumPictureBuffers,
gfx::Size(config_record_builder_.coded_width(),
- config_record_builder_.coded_height()));
+ config_record_builder_.coded_height()),
+ GL_TEXTURE_RECTANGLE_ARB);
}
}
diff --git a/content/common/gpu/media/omx_video_decode_accelerator.cc b/content/common/gpu/media/omx_video_decode_accelerator.cc
index 811997d..5e88010 100644
--- a/content/common/gpu/media/omx_video_decode_accelerator.cc
+++ b/content/common/gpu/media/omx_video_decode_accelerator.cc
@@ -748,7 +748,8 @@ void OmxVideoDecodeAccelerator::OnOutputPortDisabled() {
if (client_) {
client_->ProvidePictureBuffers(
kNumPictureBuffers,
- gfx::Size(vformat.nFrameWidth, vformat.nFrameHeight));
+ gfx::Size(vformat.nFrameWidth, vformat.nFrameHeight),
+ GL_TEXTURE_2D);
}
}
diff --git a/content/common/gpu/media/rendering_helper.h b/content/common/gpu/media/rendering_helper.h
index ff99f65..a62fb60 100644
--- a/content/common/gpu/media/rendering_helper.h
+++ b/content/common/gpu/media/rendering_helper.h
@@ -40,6 +40,7 @@ class RenderingHelper {
// Return a newly-created GLES2 texture id rendering to a specific window, and
// signal |*done|.
virtual void CreateTexture(int window_id,
+ uint32 texture_target,
uint32* texture_id,
base::WaitableEvent* done) = 0;
diff --git a/content/common/gpu/media/rendering_helper_egl.cc b/content/common/gpu/media/rendering_helper_egl.cc
index 17f2173..dc15309 100644
--- a/content/common/gpu/media/rendering_helper_egl.cc
+++ b/content/common/gpu/media/rendering_helper_egl.cc
@@ -57,6 +57,7 @@ class RenderingHelperEGL : public RenderingHelper {
base::WaitableEvent* done) OVERRIDE;
virtual void UnInitialize(base::WaitableEvent* done) OVERRIDE;
virtual void CreateTexture(int window_id,
+ uint32 texture_target,
uint32* texture_id,
base::WaitableEvent* done) OVERRIDE;
virtual void RenderTexture(uint32 texture_id) OVERRIDE;
@@ -245,15 +246,17 @@ void RenderingHelperEGL::UnInitialize(base::WaitableEvent* done) {
}
void RenderingHelperEGL::CreateTexture(int window_id,
+ uint32 texture_target,
uint32* texture_id,
base::WaitableEvent* done) {
if (MessageLoop::current() != message_loop_) {
message_loop_->PostTask(
FROM_HERE,
base::Bind(&RenderingHelper::CreateTexture, base::Unretained(this),
- window_id, texture_id, done));
+ window_id, texture_target, texture_id, done));
return;
}
+ CHECK_EQ(static_cast<uint32>(GL_TEXTURE_2D), texture_target);
CHECK(eglMakeCurrent(egl_display_, egl_surfaces_[window_id],
egl_surfaces_[window_id], egl_context_))
<< eglGetError();
diff --git a/content/common/gpu/media/rendering_helper_mac.mm b/content/common/gpu/media/rendering_helper_mac.mm
index 163fe53..0bd0076 100644
--- a/content/common/gpu/media/rendering_helper_mac.mm
+++ b/content/common/gpu/media/rendering_helper_mac.mm
@@ -90,6 +90,7 @@ class RenderingHelperMac : public RenderingHelper {
base::WaitableEvent* done) OVERRIDE;
virtual void UnInitialize(base::WaitableEvent* done) OVERRIDE;
virtual void CreateTexture(int window_id,
+ uint32 texture_target,
GLuint* texture_id,
base::WaitableEvent* done) OVERRIDE;
virtual void RenderTexture(GLuint texture_id) OVERRIDE;
@@ -185,9 +186,11 @@ void RenderingHelperMac::UnInitialize(base::WaitableEvent* done) {
}
void RenderingHelperMac::CreateTexture(int window_id,
+ uint32 texture_target,
GLuint* texture_id,
base::WaitableEvent* done) {
CHECK_EQ(MessageLoop::current(), message_loop_);
+ CHECK_EQ(static_cast<uint32>(GL_TEXTURE_RECTANGLE_ARB), texture_target);
CGLContextObj cgl_ctx = GetCGLContext(gl_view_);
glGenTextures(1, texture_id);
CHECK_EQ(GL_NO_ERROR, static_cast<int>(glGetError()));
diff --git a/content/common/gpu/media/video_decode_accelerator_unittest.cc b/content/common/gpu/media/video_decode_accelerator_unittest.cc
index 411c85e..2d8162a 100644
--- a/content/common/gpu/media/video_decode_accelerator_unittest.cc
+++ b/content/common/gpu/media/video_decode_accelerator_unittest.cc
@@ -204,9 +204,9 @@ class EglRenderingVDAClient : public VideoDecodeAccelerator::Client {
// VideoDecodeAccelerator::Client implementation.
// The heart of the Client.
- virtual void ProvidePictureBuffers(
- uint32 requested_num_of_buffers,
- const gfx::Size& dimensions);
+ virtual void ProvidePictureBuffers(uint32 requested_num_of_buffers,
+ const gfx::Size& dimensions,
+ uint32 texture_target);
virtual void DismissPictureBuffer(int32 picture_buffer_id);
virtual void PictureReady(const media::Picture& picture);
// Simple state changes.
@@ -333,7 +333,8 @@ void EglRenderingVDAClient::CreateDecoder() {
void EglRenderingVDAClient::ProvidePictureBuffers(
uint32 requested_num_of_buffers,
- const gfx::Size& dimensions) {
+ const gfx::Size& dimensions,
+ uint32 texture_target) {
if (decoder_deleted())
return;
std::vector<media::PictureBuffer> buffers;
@@ -342,7 +343,8 @@ void EglRenderingVDAClient::ProvidePictureBuffers(
uint32 id = picture_buffers_by_id_.size();
uint32 texture_id;
base::WaitableEvent done(false, false);
- rendering_helper_->CreateTexture(rendering_window_id_, &texture_id, &done);
+ rendering_helper_->CreateTexture(
+ rendering_window_id_, texture_target, &texture_id, &done);
done.Wait();
CHECK(outstanding_texture_ids_.insert(texture_id).second);
media::PictureBuffer* buffer =
diff --git a/content/renderer/media/pepper_platform_video_decoder_impl.cc b/content/renderer/media/pepper_platform_video_decoder_impl.cc
index 503cd43..62e5d23 100644
--- a/content/renderer/media/pepper_platform_video_decoder_impl.cc
+++ b/content/renderer/media/pepper_platform_video_decoder_impl.cc
@@ -90,9 +90,11 @@ void PlatformVideoDecoderImpl::NotifyError(
void PlatformVideoDecoderImpl::ProvidePictureBuffers(
uint32 requested_num_of_buffers,
- const gfx::Size& dimensions) {
+ const gfx::Size& dimensions,
+ uint32 texture_target) {
DCHECK(RenderThreadImpl::current());
- client_->ProvidePictureBuffers(requested_num_of_buffers, dimensions);
+ client_->ProvidePictureBuffers(requested_num_of_buffers, dimensions,
+ texture_target);
}
void PlatformVideoDecoderImpl::DismissPictureBuffer(int32 picture_buffer_id) {
diff --git a/content/renderer/media/pepper_platform_video_decoder_impl.h b/content/renderer/media/pepper_platform_video_decoder_impl.h
index a3c4341..d79ce01 100644
--- a/content/renderer/media/pepper_platform_video_decoder_impl.h
+++ b/content/renderer/media/pepper_platform_video_decoder_impl.h
@@ -33,8 +33,9 @@ class PlatformVideoDecoderImpl
virtual void Destroy() OVERRIDE;
// VideoDecodeAccelerator::Client implementation.
- virtual void ProvidePictureBuffers(
- uint32 requested_num_of_buffers, const gfx::Size& dimensions) OVERRIDE;
+ virtual void ProvidePictureBuffers(uint32 requested_num_of_buffers,
+ const gfx::Size& dimensions,
+ uint32 texture_target) OVERRIDE;
virtual void PictureReady(const media::Picture& picture) OVERRIDE;
virtual void DismissPictureBuffer(int32 picture_buffer_id) OVERRIDE;
virtual void NotifyInitializeDone() OVERRIDE;
diff --git a/content/renderer/media/renderer_gpu_video_decoder_factories.cc b/content/renderer/media/renderer_gpu_video_decoder_factories.cc
index 82d145b..305ef99 100644
--- a/content/renderer/media/renderer_gpu_video_decoder_factories.cc
+++ b/content/renderer/media/renderer_gpu_video_decoder_factories.cc
@@ -75,7 +75,7 @@ void RendererGpuVideoDecoderFactories::AsyncCreateVideoDecodeAccelerator(
bool RendererGpuVideoDecoderFactories::CreateTextures(
int32 count, const gfx::Size& size,
std::vector<uint32>* texture_ids,
- uint32* texture_target) {
+ uint32 texture_target) {
DCHECK_NE(MessageLoop::current(), message_loop_);
bool success = false;
base::WaitableEvent waiter(false, false);
@@ -88,8 +88,9 @@ bool RendererGpuVideoDecoderFactories::CreateTextures(
void RendererGpuVideoDecoderFactories::AsyncCreateTextures(
int32 count, const gfx::Size& size, std::vector<uint32>* texture_ids,
- uint32* texture_target, bool* success, base::WaitableEvent* waiter) {
+ uint32 texture_target, bool* success, base::WaitableEvent* waiter) {
DCHECK_EQ(MessageLoop::current(), message_loop_);
+ DCHECK(texture_target);
if (!context_) {
*success = false;
waiter->Signal();
@@ -98,16 +99,15 @@ void RendererGpuVideoDecoderFactories::AsyncCreateTextures(
gpu::gles2::GLES2Implementation* gles2 = context_->GetImplementation();
texture_ids->resize(count);
gles2->GenTextures(count, &texture_ids->at(0));
- *texture_target = GL_TEXTURE_2D;
for (int i = 0; i < count; ++i) {
gles2->ActiveTexture(GL_TEXTURE0);
uint32 texture_id = texture_ids->at(i);
- gles2->BindTexture(*texture_target, texture_id);
- gles2->TexParameteri(*texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- gles2->TexParameteri(*texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- gles2->TexParameterf(*texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gles2->TexParameterf(*texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- gles2->TexImage2D(*texture_target, 0, GL_RGBA, size.width(), size.height(),
+ gles2->BindTexture(texture_target, texture_id);
+ gles2->TexParameteri(texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ gles2->TexParameteri(texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gles2->TexParameterf(texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ gles2->TexParameterf(texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ gles2->TexImage2D(texture_target, 0, GL_RGBA, size.width(), size.height(),
0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
}
// We need a glFlush here to guarantee the decoder (in the GPU process) can
diff --git a/content/renderer/media/renderer_gpu_video_decoder_factories.h b/content/renderer/media/renderer_gpu_video_decoder_factories.h
index a4150ea..c4386f2 100644
--- a/content/renderer/media/renderer_gpu_video_decoder_factories.h
+++ b/content/renderer/media/renderer_gpu_video_decoder_factories.h
@@ -46,7 +46,7 @@ class CONTENT_EXPORT RendererGpuVideoDecoderFactories
virtual bool CreateTextures(int32 count, const gfx::Size& size,
std::vector<uint32>* texture_ids,
- uint32* texture_target) OVERRIDE;
+ uint32 texture_target) OVERRIDE;
virtual void DeleteTexture(uint32 texture_id) OVERRIDE;
@@ -74,7 +74,7 @@ class CONTENT_EXPORT RendererGpuVideoDecoderFactories
base::WaitableEvent* waiter);
void AsyncCreateTextures(
int32 count, const gfx::Size& size, std::vector<uint32>* texture_ids,
- uint32* texture_target, bool* success, base::WaitableEvent* waiter);
+ uint32 texture_target, bool* success, base::WaitableEvent* waiter);
void AsyncDeleteTexture(uint32 texture_id);
void AsyncCreateSharedMemory(
size_t size, base::SharedMemory** shm, base::WaitableEvent* waiter);
diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc
index 9352790..9899f8d 100644
--- a/media/filters/gpu_video_decoder.cc
+++ b/media/filters/gpu_video_decoder.cc
@@ -298,16 +298,19 @@ void GpuVideoDecoder::NotifyInitializeDone() {
}
void GpuVideoDecoder::ProvidePictureBuffers(uint32 count,
- const gfx::Size& size) {
+ const gfx::Size& size,
+ uint32 texture_target) {
if (!gvd_loop_proxy_->BelongsToCurrentThread()) {
gvd_loop_proxy_->PostTask(FROM_HERE, base::Bind(
- &GpuVideoDecoder::ProvidePictureBuffers, this, count, size));
+ &GpuVideoDecoder::ProvidePictureBuffers, this, count, size,
+ texture_target));
return;
}
std::vector<uint32> texture_ids;
+ decoder_texture_target_ = texture_target;
if (!factories_->CreateTextures(
- count, size, &texture_ids, &decoder_texture_target_)) {
+ count, size, &texture_ids, decoder_texture_target_)) {
NotifyError(VideoDecodeAccelerator::PLATFORM_FAILURE);
return;
}
diff --git a/media/filters/gpu_video_decoder.h b/media/filters/gpu_video_decoder.h
index 4274d15..f4c3c63 100644
--- a/media/filters/gpu_video_decoder.h
+++ b/media/filters/gpu_video_decoder.h
@@ -42,7 +42,7 @@ class MEDIA_EXPORT GpuVideoDecoder
// Allocate & delete native textures.
virtual bool CreateTextures(int32 count, const gfx::Size& size,
std::vector<uint32>* texture_ids,
- uint32* texture_target) = 0;
+ uint32 texture_target) = 0;
virtual void DeleteTexture(uint32 texture_id) = 0;
// Allocate & return a shared memory segment. Caller is responsible for
@@ -72,7 +72,8 @@ class MEDIA_EXPORT GpuVideoDecoder
// VideoDecodeAccelerator::Client implementation.
virtual void NotifyInitializeDone() OVERRIDE;
virtual void ProvidePictureBuffers(uint32 count,
- const gfx::Size& size) OVERRIDE;
+ const gfx::Size& size,
+ uint32 texture_target) OVERRIDE;
virtual void DismissPictureBuffer(int32 id) OVERRIDE;
virtual void PictureReady(const media::Picture& picture) OVERRIDE;
virtual void NotifyEndOfBitstreamBuffer(int32 id) OVERRIDE;
diff --git a/media/video/video_decode_accelerator.h b/media/video/video_decode_accelerator.h
index 5fa0d21..c04d8dc 100644
--- a/media/video/video_decode_accelerator.h
+++ b/media/video/video_decode_accelerator.h
@@ -52,8 +52,9 @@ class MEDIA_EXPORT VideoDecodeAccelerator
virtual void NotifyInitializeDone() = 0;
// Callback to tell client how many and what size of buffers to provide.
- virtual void ProvidePictureBuffers(
- uint32 requested_num_of_buffers, const gfx::Size& dimensions) = 0;
+ virtual void ProvidePictureBuffers(uint32 requested_num_of_buffers,
+ const gfx::Size& dimensions,
+ uint32 texture_target) = 0;
// Callback to dismiss picture buffer that was assigned earlier.
virtual void DismissPictureBuffer(int32 picture_buffer_id) = 0;
diff --git a/ppapi/api/dev/ppp_video_decoder_dev.idl b/ppapi/api/dev/ppp_video_decoder_dev.idl
index 2a6e419..1f6d8c6 100644
--- a/ppapi/api/dev/ppp_video_decoder_dev.idl
+++ b/ppapi/api/dev/ppp_video_decoder_dev.idl
@@ -8,7 +8,8 @@
*/
label Chrome {
M14 = 0.9,
- M18 = 0.10
+ M18 = 0.10,
+ M21 = 0.11
};
/**
@@ -33,6 +34,7 @@ interface PPP_VideoDecoder_Dev {
* |req_num_of_bufs| tells how many buffers are needed by the decoder.
* |dimensions| tells the dimensions of the buffer to allocate.
*/
+ [deprecate=0.11]
void ProvidePictureBuffers(
[in] PP_Instance instance,
[in] PP_Resource decoder,
@@ -40,6 +42,29 @@ interface PPP_VideoDecoder_Dev {
[in] PP_Size dimensions);
/**
+ * Callback function to provide buffers for the decoded output pictures. If
+ * succeeds plugin must provide buffers through AssignPictureBuffers function
+ * to the API. If |req_num_of_bufs| matching exactly the specification
+ * given in the parameters cannot be allocated decoder should be destroyed.
+ *
+ * Decoding will not proceed until buffers have been provided.
+ *
+ * Parameters:
+ * |instance| the plugin instance to which the callback is responding.
+ * |decoder| the PPB_VideoDecoder_Dev resource.
+ * |req_num_of_bufs| tells how many buffers are needed by the decoder.
+ * |dimensions| tells the dimensions of the buffer to allocate.
+ * |texture_target| the type of texture used.
+ */
+ [version=0.11]
+ void ProvidePictureBuffers(
+ [in] PP_Instance instance,
+ [in] PP_Resource decoder,
+ [in] uint32_t req_num_of_bufs,
+ [in] PP_Size dimensions,
+ [in] uint32_t texture_target);
+
+ /**
* Callback function for decoder to deliver unneeded picture buffers back to
* the plugin.
*
diff --git a/ppapi/c/dev/ppp_video_decoder_dev.h b/ppapi/c/dev/ppp_video_decoder_dev.h
index a06b582..20c4e8c 100644
--- a/ppapi/c/dev/ppp_video_decoder_dev.h
+++ b/ppapi/c/dev/ppp_video_decoder_dev.h
@@ -3,7 +3,7 @@
* found in the LICENSE file.
*/
-/* From dev/ppp_video_decoder_dev.idl modified Wed Jan 11 14:58:58 2012. */
+/* From dev/ppp_video_decoder_dev.idl modified Tue May 29 10:59:23 2012. */
#ifndef PPAPI_C_DEV_PPP_VIDEO_DECODER_DEV_H_
#define PPAPI_C_DEV_PPP_VIDEO_DECODER_DEV_H_
@@ -17,7 +17,8 @@
#define PPP_VIDEODECODER_DEV_INTERFACE_0_9 "PPP_VideoDecoder(Dev);0.9"
#define PPP_VIDEODECODER_DEV_INTERFACE_0_10 "PPP_VideoDecoder(Dev);0.10"
-#define PPP_VIDEODECODER_DEV_INTERFACE PPP_VIDEODECODER_DEV_INTERFACE_0_10
+#define PPP_VIDEODECODER_DEV_INTERFACE_0_11 "PPP_VideoDecoder(Dev);0.11"
+#define PPP_VIDEODECODER_DEV_INTERFACE PPP_VIDEODECODER_DEV_INTERFACE_0_11
/**
* @file
@@ -36,7 +37,7 @@
*
* See PPB_VideoDecoder_Dev for general usage tips.
*/
-struct PPP_VideoDecoder_Dev_0_10 {
+struct PPP_VideoDecoder_Dev_0_11 {
/**
* Callback function to provide buffers for the decoded output pictures. If
* succeeds plugin must provide buffers through AssignPictureBuffers function
@@ -50,11 +51,13 @@ struct PPP_VideoDecoder_Dev_0_10 {
* |decoder| the PPB_VideoDecoder_Dev resource.
* |req_num_of_bufs| tells how many buffers are needed by the decoder.
* |dimensions| tells the dimensions of the buffer to allocate.
+ * |texture_target| the type of texture used.
*/
void (*ProvidePictureBuffers)(PP_Instance instance,
PP_Resource decoder,
uint32_t req_num_of_bufs,
- const struct PP_Size* dimensions);
+ const struct PP_Size* dimensions,
+ uint32_t texture_target);
/**
* Callback function for decoder to deliver unneeded picture buffers back to
* the plugin.
@@ -94,7 +97,7 @@ struct PPP_VideoDecoder_Dev_0_10 {
PP_VideoDecodeError_Dev error);
};
-typedef struct PPP_VideoDecoder_Dev_0_10 PPP_VideoDecoder_Dev;
+typedef struct PPP_VideoDecoder_Dev_0_11 PPP_VideoDecoder_Dev;
struct PPP_VideoDecoder_Dev_0_9 {
void (*ProvidePictureBuffers)(PP_Instance instance,
@@ -112,6 +115,22 @@ struct PPP_VideoDecoder_Dev_0_9 {
PP_Resource decoder,
PP_VideoDecodeError_Dev error);
};
+
+struct PPP_VideoDecoder_Dev_0_10 {
+ void (*ProvidePictureBuffers)(PP_Instance instance,
+ PP_Resource decoder,
+ uint32_t req_num_of_bufs,
+ const struct PP_Size* dimensions);
+ void (*DismissPictureBuffer)(PP_Instance instance,
+ PP_Resource decoder,
+ int32_t picture_buffer_id);
+ void (*PictureReady)(PP_Instance instance,
+ PP_Resource decoder,
+ const struct PP_Picture_Dev* picture);
+ void (*NotifyError)(PP_Instance instance,
+ PP_Resource decoder,
+ PP_VideoDecodeError_Dev error);
+};
/**
* @}
*/
diff --git a/ppapi/cpp/dev/video_decoder_client_dev.cc b/ppapi/cpp/dev/video_decoder_client_dev.cc
index eaab575..10c2619 100644
--- a/ppapi/cpp/dev/video_decoder_client_dev.cc
+++ b/ppapi/cpp/dev/video_decoder_client_dev.cc
@@ -21,13 +21,14 @@ const char kPPPVideoDecoderInterface[] = PPP_VIDEODECODER_DEV_INTERFACE;
void ProvidePictureBuffers(PP_Instance instance,
PP_Resource decoder,
uint32_t req_num_of_bufs,
- const PP_Size* dimensions) {
+ const PP_Size* dimensions,
+ uint32_t texture_target) {
void* object = Instance::GetPerInstanceObject(instance,
kPPPVideoDecoderInterface);
if (!object)
return;
static_cast<VideoDecoderClient_Dev*>(object)->ProvidePictureBuffers(
- decoder, req_num_of_bufs, *dimensions);
+ decoder, req_num_of_bufs, *dimensions, texture_target);
}
void DismissPictureBuffer(PP_Instance instance,
diff --git a/ppapi/cpp/dev/video_decoder_client_dev.h b/ppapi/cpp/dev/video_decoder_client_dev.h
index d598b40..a6e2bb5 100644
--- a/ppapi/cpp/dev/video_decoder_client_dev.h
+++ b/ppapi/cpp/dev/video_decoder_client_dev.h
@@ -26,7 +26,8 @@ class VideoDecoderClient_Dev {
// Callback to provide buffers for the decoded output pictures.
virtual void ProvidePictureBuffers(PP_Resource decoder,
uint32_t req_num_of_bufs,
- const PP_Size& dimensions) = 0;
+ const PP_Size& dimensions,
+ uint32_t texture_target) = 0;
// Callback for decoder to deliver unneeded picture buffers back to the
// plugin.
diff --git a/ppapi/examples/video_decode/video_decode.cc b/ppapi/examples/video_decode/video_decode.cc
index dd0c08f..6e4f4e1 100644
--- a/ppapi/examples/video_decode/video_decode.cc
+++ b/ppapi/examples/video_decode/video_decode.cc
@@ -60,9 +60,11 @@ class VideoDecodeDemoInstance : public pp::Instance,
}
// pp::VideoDecoderClient_Dev implementation.
- virtual void ProvidePictureBuffers(PP_Resource decoder,
- uint32_t req_num_of_bufs,
- const PP_Size& dimensions);
+ virtual void ProvidePictureBuffers(
+ PP_Resource decoder,
+ uint32_t req_num_of_bufs,
+ const PP_Size& dimensions,
+ uint32_t texture_target);
virtual void DismissPictureBuffer(PP_Resource decoder,
int32_t picture_buffer_id);
virtual void PictureReady(PP_Resource decoder, const PP_Picture_Dev& picture);
@@ -82,8 +84,10 @@ class VideoDecodeDemoInstance : public pp::Instance,
void DecodeNextNALUs();
// Per-decoder implementation of part of pp::VideoDecoderClient_Dev.
- void ProvidePictureBuffers(uint32_t req_num_of_bufs,
- PP_Size dimensions);
+ void ProvidePictureBuffers(
+ uint32_t req_num_of_bufs,
+ PP_Size dimensions,
+ uint32_t texture_target);
void DismissPictureBuffer(int32_t picture_buffer_id);
const PP_PictureBuffer_Dev& GetPictureBufferById(int id);
@@ -320,15 +324,21 @@ void VideoDecodeDemoInstance::DecoderClient::DecodeNextNALU() {
decoder_->Decode(bitstream_buffer, cb);
}
-void VideoDecodeDemoInstance::ProvidePictureBuffers(
- PP_Resource decoder, uint32_t req_num_of_bufs, const PP_Size& dimensions) {
+void VideoDecodeDemoInstance::ProvidePictureBuffers(PP_Resource decoder,
+ uint32_t req_num_of_bufs,
+ const PP_Size& dimensions,
+ uint32_t texture_target) {
DecoderClient* client = video_decoders_[decoder];
assert(client);
- client->ProvidePictureBuffers(req_num_of_bufs, dimensions);
+ client->ProvidePictureBuffers(req_num_of_bufs, dimensions, texture_target);
}
void VideoDecodeDemoInstance::DecoderClient::ProvidePictureBuffers(
- uint32_t req_num_of_bufs, PP_Size dimensions) {
+ uint32_t req_num_of_bufs,
+ PP_Size dimensions,
+ uint32_t texture_target) {
+ // TODO(sail): Add support for GL_TEXTURE_RECTANGLE_ARB.
+ assert(texture_target == GL_TEXTURE_2D);
std::vector<PP_PictureBuffer_Dev> buffers;
for (uint32_t i = 0; i < req_num_of_bufs; ++i) {
PP_PictureBuffer_Dev buffer;
diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h
index b2787a9..16c57c1 100644
--- a/ppapi/proxy/ppapi_messages.h
+++ b/ppapi/proxy/ppapi_messages.h
@@ -626,10 +626,11 @@ IPC_MESSAGE_ROUTED2(PpapiMsg_PPBVideoDecoder_ResetACK,
int32_t /* PP_CompletionCallback result */)
// PPP_VideoDecoder_Dev.
-IPC_MESSAGE_ROUTED3(PpapiMsg_PPPVideoDecoder_ProvidePictureBuffers,
+IPC_MESSAGE_ROUTED4(PpapiMsg_PPPVideoDecoder_ProvidePictureBuffers,
ppapi::HostResource /* video_decoder */,
uint32_t /* requested number of buffers */,
- PP_Size /* dimensions of buffers */)
+ PP_Size /* dimensions of buffers */,
+ uint32_t /* texture_target */)
IPC_MESSAGE_ROUTED2(PpapiMsg_PPPVideoDecoder_DismissPictureBuffer,
ppapi::HostResource /* video_decoder */,
int32_t /* picture buffer id */)
diff --git a/ppapi/proxy/ppp_video_decoder_proxy.cc b/ppapi/proxy/ppp_video_decoder_proxy.cc
index 1ebf20a..7648b7f 100644
--- a/ppapi/proxy/ppp_video_decoder_proxy.cc
+++ b/ppapi/proxy/ppp_video_decoder_proxy.cc
@@ -22,14 +22,15 @@ namespace {
void ProvidePictureBuffers(PP_Instance instance, PP_Resource decoder,
uint32_t req_num_of_bufs,
- const PP_Size* dimensions) {
+ const PP_Size* dimensions,
+ uint32_t texture_target) {
HostResource decoder_resource;
decoder_resource.SetHostResource(instance, decoder);
HostDispatcher::GetForInstance(instance)->Send(
new PpapiMsg_PPPVideoDecoder_ProvidePictureBuffers(
API_ID_PPP_VIDEO_DECODER_DEV,
- decoder_resource, req_num_of_bufs, *dimensions));
+ decoder_resource, req_num_of_bufs, *dimensions, texture_target));
}
void DismissPictureBuffer(PP_Instance instance, PP_Resource decoder,
@@ -118,15 +119,18 @@ bool PPP_VideoDecoder_Proxy::OnMessageReceived(const IPC::Message& msg) {
}
void PPP_VideoDecoder_Proxy::OnMsgProvidePictureBuffers(
- const HostResource& decoder, uint32_t req_num_of_bufs,
- const PP_Size& dimensions) {
+ const HostResource& decoder,
+ uint32_t req_num_of_bufs,
+ const PP_Size& dimensions,
+ uint32_t texture_target) {
PP_Resource plugin_decoder = PluginGlobals::Get()->plugin_resource_tracker()->
PluginResourceForHostResource(decoder);
CallWhileUnlocked(ppp_video_decoder_impl_->ProvidePictureBuffers,
decoder.instance(),
plugin_decoder,
req_num_of_bufs,
- &dimensions);
+ &dimensions,
+ texture_target);
}
void PPP_VideoDecoder_Proxy::OnMsgDismissPictureBuffer(
diff --git a/ppapi/proxy/ppp_video_decoder_proxy.h b/ppapi/proxy/ppp_video_decoder_proxy.h
index c4ff4c3..84d83a5 100644
--- a/ppapi/proxy/ppp_video_decoder_proxy.h
+++ b/ppapi/proxy/ppp_video_decoder_proxy.h
@@ -30,7 +30,8 @@ class PPP_VideoDecoder_Proxy : public InterfaceProxy {
// Message handlers.
void OnMsgProvidePictureBuffers(const ppapi::HostResource& decoder,
uint32_t req_num_of_buffers,
- const PP_Size& dimensions);
+ const PP_Size& dimensions,
+ uint32_t texture_target);
void OnMsgDismissPictureBuffer(const ppapi::HostResource& decoder,
int32_t picture_id);
void OnMsgPictureReady(const ppapi::HostResource& decoder,
diff --git a/webkit/plugins/ppapi/ppb_video_decoder_impl.cc b/webkit/plugins/ppapi/ppb_video_decoder_impl.cc
index db8a8f6..ab0773c 100644
--- a/webkit/plugins/ppapi/ppb_video_decoder_impl.cc
+++ b/webkit/plugins/ppapi/ppb_video_decoder_impl.cc
@@ -220,13 +220,15 @@ void PPB_VideoDecoder_Impl::Destroy() {
}
void PPB_VideoDecoder_Impl::ProvidePictureBuffers(
- uint32 requested_num_of_buffers, const gfx::Size& dimensions) {
+ uint32 requested_num_of_buffers,
+ const gfx::Size& dimensions,
+ uint32 texture_target) {
if (!ppp_videodecoder_)
return;
PP_Size out_dim = PP_MakeSize(dimensions.width(), dimensions.height());
ppp_videodecoder_->ProvidePictureBuffers(pp_instance(), pp_resource(),
- requested_num_of_buffers, &out_dim);
+ requested_num_of_buffers, &out_dim, texture_target);
}
void PPB_VideoDecoder_Impl::PictureReady(const media::Picture& picture) {
diff --git a/webkit/plugins/ppapi/ppb_video_decoder_impl.h b/webkit/plugins/ppapi/ppb_video_decoder_impl.h
index 7bb8cc0..895874b3 100644
--- a/webkit/plugins/ppapi/ppb_video_decoder_impl.h
+++ b/webkit/plugins/ppapi/ppb_video_decoder_impl.h
@@ -49,8 +49,9 @@ class PPB_VideoDecoder_Impl : public ::ppapi::PPB_VideoDecoder_Shared,
virtual void Destroy() OVERRIDE;
// media::VideoDecodeAccelerator::Client implementation.
- virtual void ProvidePictureBuffers(
- uint32 requested_num_of_buffers, const gfx::Size& dimensions) OVERRIDE;
+ virtual void ProvidePictureBuffers(uint32 requested_num_of_buffers,
+ const gfx::Size& dimensions,
+ uint32 texture_target) OVERRIDE;
virtual void DismissPictureBuffer(int32 picture_buffer_id) OVERRIDE;
virtual void PictureReady(const media::Picture& picture) OVERRIDE;
virtual void NotifyInitializeDone() OVERRIDE;