diff options
22 files changed, 568 insertions, 626 deletions
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index c64d9c0..7b89fe7 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -3334,36 +3334,42 @@ }], ], }, - { + # { # Executable that contains tests that specifically test gpu video decoding # features. Excludes for example command buffer implementation. - 'target_name': 'gpu_video_tests', - 'type': 'executable', - 'dependencies': [ - 'test_support_common', - '../base/base.gyp:base', - '../base/base.gyp:base_i18n', - '../base/base.gyp:test_support_base', - '../ipc/ipc.gyp:test_support_ipc', - '../skia/skia.gyp:skia', - '../testing/gtest.gyp:gtest', - '../testing/gmock.gyp:gmock', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - '<(DEPTH)/content/gpu/gpu_video_decode_accelerator.cc', - '<(DEPTH)/content/gpu/gpu_video_decode_accelerator.h', - '<(DEPTH)/content/gpu/gpu_video_decode_accelerator_tester.cc', - '<(DEPTH)/media/video/picture.cc', - '<(DEPTH)/media/video/picture.h', - '<(DEPTH)/media/video/video_decode_accelerator.cc', - '<(DEPTH)/media/video/video_decode_accelerator.h', - '<(DEPTH)/ui/gfx/size.cc', - '<(DEPTH)/ui/gfx/size.h', - ], - }, + # + # TODO(vrk): These tests are temporarily disabled as the VideoDecode PPAPI + # is getting an overhaul. Tests will be reenabled when the API has been + # stabilized and gpu_video_decode_accelerator_tester.cc is updated to + # reflect the changes. + # + # 'target_name': 'gpu_video_tests', + # 'type': 'executable', + # 'dependencies': [ + # 'test_support_common', + # '../base/base.gyp:base', + # '../base/base.gyp:base_i18n', + # '../base/base.gyp:test_support_base', + # '../ipc/ipc.gyp:test_support_ipc', + # '../skia/skia.gyp:skia', + # '../testing/gtest.gyp:gtest', + # '../testing/gmock.gyp:gmock', + # ], + # 'include_dirs': [ + # '..', + # ], + # 'sources': [ + # '<(DEPTH)/content/gpu/gpu_video_decode_accelerator.cc', + # '<(DEPTH)/content/gpu/gpu_video_decode_accelerator.h', + # '<(DEPTH)/content/gpu/gpu_video_decode_accelerator_tester.cc', + # '<(DEPTH)/media/video/picture.cc', + # '<(DEPTH)/media/video/picture.h', + # '<(DEPTH)/media/video/video_decode_accelerator.cc', + # '<(DEPTH)/media/video/video_decode_accelerator.h', + # '<(DEPTH)/ui/gfx/size.cc', + # '<(DEPTH)/ui/gfx/size.h', + # ], + # }, { 'target_name': 'plugin_tests', 'type': 'executable', diff --git a/content/renderer/pepper_platform_video_decoder_impl.cc b/content/renderer/pepper_platform_video_decoder_impl.cc index d96dc92..89a75ce 100644 --- a/content/renderer/pepper_platform_video_decoder_impl.cc +++ b/content/renderer/pepper_platform_video_decoder_impl.cc @@ -8,11 +8,8 @@ #include "base/logging.h" #include "content/renderer/video_decode_accelerator_host.h" -#include "media/base/buffers.h" -#include "media/base/video_frame.h" using media::BitstreamBuffer; -using media::VideoDecodeAccelerator; using media::VideoDecodeAcceleratorCallback; PlatformVideoDecoderImpl::PlatformVideoDecoderImpl( @@ -23,10 +20,10 @@ PlatformVideoDecoderImpl::PlatformVideoDecoderImpl( PlatformVideoDecoderImpl::~PlatformVideoDecoderImpl() {} -const std::vector<uint32>& PlatformVideoDecoderImpl::GetConfig( - const std::vector<uint32>& prototype_config) { +void PlatformVideoDecoderImpl::GetConfigs( + const std::vector<uint32>& requested_configs, + std::vector<uint32>* matched_configs) { NOTIMPLEMENTED(); - return configs; } bool PlatformVideoDecoderImpl::Initialize(const std::vector<uint32>& config) { @@ -36,7 +33,7 @@ bool PlatformVideoDecoderImpl::Initialize(const std::vector<uint32>& config) { } bool PlatformVideoDecoderImpl::Decode( - BitstreamBuffer* bitstream_buffer, + const BitstreamBuffer& bitstream_buffer, VideoDecodeAcceleratorCallback* callback) { // TODO(vmr): Implement me! NOTIMPLEMENTED(); @@ -44,12 +41,21 @@ bool PlatformVideoDecoderImpl::Decode( return false; } -void PlatformVideoDecoderImpl::AssignPictureBuffer( - std::vector<VideoDecodeAccelerator::PictureBuffer*> picture_buffers) { +void PlatformVideoDecoderImpl::AssignGLESBuffers( + const std::vector<media::GLESBuffer>& buffers) { + // TODO(vmr): Implement me! + NOTIMPLEMENTED(); +} + +void PlatformVideoDecoderImpl::AssignSysmemBuffers( + const std::vector<media::SysmemBuffer>& buffers) { + // TODO(vmr): Implement me! + NOTIMPLEMENTED(); } -void PlatformVideoDecoderImpl::ReusePictureBuffer( - VideoDecodeAccelerator::PictureBuffer* picture_buffer) { +void PlatformVideoDecoderImpl::ReusePictureBuffer(uint32 picture_buffer_id) { + // TODO(vmr): Implement me! + NOTIMPLEMENTED(); } bool PlatformVideoDecoderImpl::Flush( @@ -83,13 +89,14 @@ void PlatformVideoDecoderImpl::NotifyError( void PlatformVideoDecoderImpl::ProvidePictureBuffers( uint32 requested_num_of_buffers, - const std::vector<uint32>& buffer_properties) { + gfx::Size dimensions, + media::VideoDecodeAccelerator::MemoryType type) { // TODO(vmr): Implement. NOTIMPLEMENTED(); } void PlatformVideoDecoderImpl::PictureReady( - VideoDecodeAccelerator::Picture* picture) { + const media::Picture& picture) { // TODO(vmr): Implement. NOTIMPLEMENTED(); } diff --git a/content/renderer/pepper_platform_video_decoder_impl.h b/content/renderer/pepper_platform_video_decoder_impl.h index 2acdbd1..d067cff 100644 --- a/content/renderer/pepper_platform_video_decoder_impl.h +++ b/content/renderer/pepper_platform_video_decoder_impl.h @@ -8,7 +8,6 @@ #include <vector> #include "base/scoped_ptr.h" -#include "media/base/data_buffer.h" #include "media/video/video_decode_accelerator.h" #include "webkit/plugins/ppapi/plugin_delegate.h" @@ -21,25 +20,28 @@ class PlatformVideoDecoderImpl virtual ~PlatformVideoDecoderImpl(); // PlatformVideoDecoder implementation. - virtual const std::vector<uint32>& GetConfig( - const std::vector<uint32>& prototype_config); - virtual bool Initialize(const std::vector<uint32>& config); - virtual bool Decode(media::BitstreamBuffer* bitstream_buffer, - media::VideoDecodeAcceleratorCallback* callback); - virtual void AssignPictureBuffer( - std::vector<media::VideoDecodeAccelerator::PictureBuffer*> - picture_buffers); - virtual void ReusePictureBuffer( - media::VideoDecodeAccelerator::PictureBuffer* picture_buffer); - virtual bool Flush(media::VideoDecodeAcceleratorCallback* callback); - virtual bool Abort(media::VideoDecodeAcceleratorCallback* callback); + virtual void GetConfigs( + const std::vector<uint32>& requested_configs, + std::vector<uint32>* matched_configs) OVERRIDE; + virtual bool Initialize(const std::vector<uint32>& config) OVERRIDE; + virtual bool Decode( + const media::BitstreamBuffer& bitstream_buffer, + media::VideoDecodeAcceleratorCallback* callback) OVERRIDE; + virtual void AssignGLESBuffers( + const std::vector<media::GLESBuffer>& buffers) OVERRIDE; + virtual void AssignSysmemBuffers( + const std::vector<media::SysmemBuffer>& buffers) OVERRIDE; + virtual void ReusePictureBuffer(uint32 picture_buffer_id) OVERRIDE; + virtual bool Flush(media::VideoDecodeAcceleratorCallback* callback) OVERRIDE; + virtual bool Abort(media::VideoDecodeAcceleratorCallback* callback) OVERRIDE; // VideoDecodeAccelerator::Client implementation. virtual void ProvidePictureBuffers( uint32 requested_num_of_buffers, - const std::vector<uint32>& buffer_properties) OVERRIDE; + gfx::Size dimensions, + media::VideoDecodeAccelerator::MemoryType type) OVERRIDE; virtual void PictureReady( - media::VideoDecodeAccelerator::Picture* picture) OVERRIDE; + const media::Picture& picture) OVERRIDE; virtual void NotifyEndOfStream() OVERRIDE; virtual void NotifyError( media::VideoDecodeAccelerator::Error error) OVERRIDE; diff --git a/content/renderer/pepper_plugin_delegate_impl.cc b/content/renderer/pepper_plugin_delegate_impl.cc index 34256cc..6c77825 100644 --- a/content/renderer/pepper_plugin_delegate_impl.cc +++ b/content/renderer/pepper_plugin_delegate_impl.cc @@ -814,7 +814,8 @@ webkit::ppapi::PluginDelegate::PlatformContext3D* webkit::ppapi::PluginDelegate::PlatformVideoDecoder* PepperPluginDelegateImpl::CreateVideoDecoder( - PP_VideoDecoderConfig_Dev* decoder_config) { + PP_VideoConfigElement* decoder_config, + media::VideoDecodeAccelerator::Client* client) { // TODO(vmr): Implement. NOTIMPLEMENTED(); return NULL; diff --git a/content/renderer/pepper_plugin_delegate_impl.h b/content/renderer/pepper_plugin_delegate_impl.h index 0a5a3a3..ab862f2 100644 --- a/content/renderer/pepper_plugin_delegate_impl.h +++ b/content/renderer/pepper_plugin_delegate_impl.h @@ -175,7 +175,8 @@ class PepperPluginDelegateImpl virtual PlatformImage2D* CreateImage2D(int width, int height); virtual PlatformContext3D* CreateContext3D(); virtual PlatformVideoDecoder* CreateVideoDecoder( - PP_VideoDecoderConfig_Dev* decoder_config); + PP_VideoConfigElement* decoder_config, + media::VideoDecodeAccelerator::Client* client); virtual PpapiBroker* ConnectToPpapiBroker( webkit::ppapi::PPB_Broker_Impl* client); virtual void NumberOfFindResultsChanged(int identifier, diff --git a/content/renderer/video_decode_accelerator_host.cc b/content/renderer/video_decode_accelerator_host.cc index 013277a..b95ebe7 100644 --- a/content/renderer/video_decode_accelerator_host.cc +++ b/content/renderer/video_decode_accelerator_host.cc @@ -36,11 +36,11 @@ bool VideoDecodeAcceleratorHost::OnMessageReceived(const IPC::Message& msg) { return handled; } -const std::vector<uint32>& VideoDecodeAcceleratorHost::GetConfig( - const std::vector<uint32>& prototype_config) { +void VideoDecodeAcceleratorHost::GetConfigs( + const std::vector<uint32>& requested_configs, + std::vector<uint32>* matched_configs) { // TODO(vmr): implement. NOTIMPLEMENTED(); - return configs_; } bool VideoDecodeAcceleratorHost::Initialize( @@ -51,21 +51,26 @@ bool VideoDecodeAcceleratorHost::Initialize( } bool VideoDecodeAcceleratorHost::Decode( - media::BitstreamBuffer* bitstream_buffer, + const media::BitstreamBuffer& bitstream_buffer, VideoDecodeAcceleratorCallback* callback) { // TODO(vmr): implement. NOTIMPLEMENTED(); return false; } -void VideoDecodeAcceleratorHost::AssignPictureBuffer( - std::vector<PictureBuffer*> picture_buffers) { +void VideoDecodeAcceleratorHost::AssignGLESBuffers( + const std::vector<media::GLESBuffer>& buffers) { // TODO(vmr): implement. NOTIMPLEMENTED(); } -void VideoDecodeAcceleratorHost::ReusePictureBuffer( - PictureBuffer* picture_buffer) { +void VideoDecodeAcceleratorHost::AssignSysmemBuffers( + const std::vector<media::SysmemBuffer>& buffers) { + // TODO(vmr): implement. + NOTIMPLEMENTED(); +} + +void VideoDecodeAcceleratorHost::ReusePictureBuffer(uint32 picture_buffer_id) { // TODO(vmr): implement. NOTIMPLEMENTED(); } diff --git a/content/renderer/video_decode_accelerator_host.h b/content/renderer/video_decode_accelerator_host.h index c19b0b5..7d7c3dc 100644 --- a/content/renderer/video_decode_accelerator_host.h +++ b/content/renderer/video_decode_accelerator_host.h @@ -28,21 +28,26 @@ class VideoDecodeAcceleratorHost : public IPC::Channel::Listener, virtual ~VideoDecodeAcceleratorHost(); // IPC::Channel::Listener implementation. - virtual void OnChannelConnected(int32 peer_pid); - virtual void OnChannelError(); - virtual bool OnMessageReceived(const IPC::Message& message); + virtual void OnChannelConnected(int32 peer_pid) OVERRIDE; + virtual void OnChannelError() OVERRIDE; + virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; // media::VideoDecodeAccelerator implementation. - virtual const std::vector<uint32>& GetConfig( - const std::vector<uint32>& prototype_config); - virtual bool Initialize(const std::vector<uint32>& config); - virtual bool Decode(media::BitstreamBuffer* bitstream_buffer, - media::VideoDecodeAcceleratorCallback* callback); - virtual void AssignPictureBuffer( - std::vector<PictureBuffer*> picture_buffers); - virtual void ReusePictureBuffer(PictureBuffer* picture_buffer); - virtual bool Flush(media::VideoDecodeAcceleratorCallback* callback); - virtual bool Abort(media::VideoDecodeAcceleratorCallback* callback); + virtual void GetConfigs( + const std::vector<uint32>& requested_configs, + std::vector<uint32>* matched_configs) OVERRIDE; + virtual bool Initialize( + const std::vector<uint32>& config) OVERRIDE; + virtual bool Decode( + const media::BitstreamBuffer& bitstream_buffer, + media::VideoDecodeAcceleratorCallback* callback) OVERRIDE; + virtual void AssignGLESBuffers( + const std::vector<media::GLESBuffer>& buffers) OVERRIDE; + virtual void AssignSysmemBuffers( + const std::vector<media::SysmemBuffer>& buffers) OVERRIDE; + virtual void ReusePictureBuffer(uint32 picture_buffer_id) OVERRIDE; + virtual bool Flush(media::VideoDecodeAcceleratorCallback* callback) OVERRIDE; + virtual bool Abort(media::VideoDecodeAcceleratorCallback* callback) OVERRIDE; private: // Message loop that this object runs on. @@ -67,8 +72,6 @@ class VideoDecodeAcceleratorHost : public IPC::Channel::Listener, // TODO(vmr): move into plugin provided IPC buffers. scoped_ptr<base::SharedMemory> input_transfer_buffer_; - std::vector<uint32> configs_; - DISALLOW_COPY_AND_ASSIGN(VideoDecodeAcceleratorHost); }; diff --git a/media/media.gyp b/media/media.gyp index 8021741..24b4c10 100644 --- a/media/media.gyp +++ b/media/media.gyp @@ -184,6 +184,8 @@ 'video/ffmpeg_video_allocator.h', 'video/ffmpeg_video_decode_engine.cc', 'video/ffmpeg_video_decode_engine.h', + 'video/picture.cc', + 'video/picture.h', 'video/video_decode_accelerator.cc', 'video/video_decode_accelerator.h', 'video/video_decode_engine.h', diff --git a/media/video/picture.cc b/media/video/picture.cc index dd57e4a..a312eea 100644 --- a/media/video/picture.cc +++ b/media/video/picture.cc @@ -6,67 +6,25 @@ namespace media { -// PictureBuffer implementation. -PictureBuffer::PictureBuffer(int32 id, - gfx::Size pixel_size, - std::vector<uint32> color_format, - MemoryType memory_type, - std::vector<DataPlaneHandle> data_plane_handles) +// Implementations for the other constructors are found in +// webkit/plugins/ppapi/ppb_video_decoder_impl.cc. +// They are not included in this file because it would require +// media/ to depend on files in ppapi/. +BufferInfo::BufferInfo(int32 id, gfx::Size size) : id_(id), - pixel_size_(pixel_size), - color_format_(color_format), - memory_type_(memory_type), - data_plane_handles_(data_plane_handles) { + size_(size) { } -PictureBuffer::~PictureBuffer() {} - -int32 PictureBuffer::GetId() { - return id_; -} - -gfx::Size PictureBuffer::GetSize() { - return pixel_size_; -} - -const std::vector<uint32>& PictureBuffer::GetColorFormat() { - return color_format_; +GLESBuffer::GLESBuffer( + int32 id, gfx::Size size, uint32 texture_id, uint32 context_id) + : texture_id_(texture_id), + context_id_(context_id), + info_(id, size) { } -PictureBuffer::MemoryType PictureBuffer::GetMemoryType() { - return memory_type_; -} - -std::vector<PictureBuffer::DataPlaneHandle>& PictureBuffer::GetPlaneHandles() { - return data_plane_handles_; -} - -// Picture implementation. -Picture::Picture(PictureBuffer* picture_buffer, gfx::Size decoded_pixel_size, - gfx::Size visible_pixel_size, void* user_handle) - : picture_buffer_(picture_buffer), - decoded_pixel_size_(decoded_pixel_size), - visible_pixel_size_(visible_pixel_size), - user_handle_(user_handle) { -} - -Picture::~Picture() {} - -PictureBuffer* Picture::picture_buffer() { - return picture_buffer_; -} - -gfx::Size Picture::GetDecodedSize() const { - return decoded_pixel_size_; -} - -gfx::Size Picture::GetVisibleSize() const { - return visible_pixel_size_; -} - -void* Picture::GetUserHandle() { - return user_handle_; +SysmemBuffer::SysmemBuffer(int32 id, gfx::Size size, void* data) + : data_(data), + info_(id, size) { } } // namespace media - diff --git a/media/video/picture.h b/media/video/picture.h index ec84453..465f3f5 100644 --- a/media/video/picture.h +++ b/media/video/picture.h @@ -5,59 +5,123 @@ #ifndef MEDIA_VIDEO_PICTURE_H_ #define MEDIA_VIDEO_PICTURE_H_ -#include <vector> +#include "base/basictypes.h" +#include "ui/gfx/size.h" -#include "base/compiler_specific.h" -#include "media/video/video_decode_accelerator.h" +struct PP_BufferInfo_Dev; +struct PP_GLESBuffer_Dev; +struct PP_Picture_Dev; +struct PP_SysmemBuffer_Dev; namespace media { -// TODO(vmr): Evaluate the generalization potential of these interfaces & -// classes and refactor as needed with the rest of media stack. -class PictureBuffer : public VideoDecodeAccelerator::PictureBuffer { +// Information about the picture buffer. +// This is the media-namespace equivalent of PP_BufferInfo_Dev. +class BufferInfo { public: - PictureBuffer(int32 id, gfx::Size pixel_size, - std::vector<uint32> color_format, MemoryType memory_type, - std::vector<DataPlaneHandle> data_plane_handles); - virtual ~PictureBuffer(); - - // VideoDecodeAccelerator::PictureBuffer implementation. - virtual int32 GetId() OVERRIDE; - virtual gfx::Size GetSize() OVERRIDE; - virtual const std::vector<uint32>& GetColorFormat() OVERRIDE; - virtual MemoryType GetMemoryType() OVERRIDE; - virtual std::vector<DataPlaneHandle>& GetPlaneHandles() OVERRIDE; + BufferInfo(int32 id, gfx::Size size); + BufferInfo(const PP_BufferInfo_Dev& info); + + // Returns the client-specified id of the buffer. + int32 id() const { + return id_; + } + + // Returns the size of the buffer. + gfx::Size size() const { + return size_; + } private: int32 id_; - gfx::Size pixel_size_; - std::vector<uint32> color_format_; - MemoryType memory_type_; - std::vector<DataPlaneHandle>& data_plane_handles_; + gfx::Size size_; +}; + +// A picture buffer that is composed of a GLES2 texture and context. +// This is the media-namespace equivalent of PP_GLESBuffer_Dev. +class GLESBuffer { + public: + GLESBuffer(int32 id, gfx::Size size, uint32 texture_id, uint32 context_id); + GLESBuffer(const PP_GLESBuffer_Dev& buffer); + + // Returns the id of the texture. + uint32 texture_id() const { + return texture_id_; + } + + // Returns the id of the context in which this texture lives. + // TODO(vrk): I'm not sure if "id" is what we want, or some reference to the + // PPB_Context3D_Dev. Not sure how this eventually gets used. + uint32 context_id() const { + return context_id_; + } + + // Returns information regarding the buffer. + const BufferInfo& buffer_info() const { + return info_; + } + + private: + uint32 texture_id_; + uint32 context_id_; + BufferInfo info_; +}; + +// A picture buffer that lives in system memory. +// This is the media-namespace equivalent of PP_SysmemBuffer_Dev. +class SysmemBuffer { + public: + SysmemBuffer(int32 id, gfx::Size size, void* data); + SysmemBuffer(const PP_SysmemBuffer_Dev&); + + // Returns a pointer to the buffer data. + void* data() const { + return data_; + } + + // Returns information regarding the buffer. + const BufferInfo& buffer_info() const { + return info_; + } - DISALLOW_IMPLICIT_CONSTRUCTORS(PictureBuffer); + private: + void* data_; + BufferInfo info_; }; -class Picture : public VideoDecodeAccelerator::Picture { +// A decoded picture frame. +// This is the media-namespace equivalent of PP_Picture_Dev. +class Picture { public: - Picture(PictureBuffer* picture_buffer, gfx::Size decoded_pixel_size, - gfx::Size visible_pixel_size, void* user_handle); - virtual ~Picture(); + Picture(const PP_Picture_Dev& picture); + + // Returns the id of the picture buffer where this picture is contained. + int32 picture_buffer_id() const { + return picture_buffer_id_; + } + + // Returns the handle associated with the bitstream buffer from which this + // picture was decoded. + // TODO(vrk): Handle the case where a picture can span multiple buffers. + void* user_handle() const { + return user_handle_; + } - // VideoDecodeAccelerator::Picture implementation. - virtual PictureBuffer* picture_buffer() OVERRIDE; - virtual gfx::Size GetDecodedSize() const OVERRIDE; - virtual gfx::Size GetVisibleSize() const OVERRIDE; - virtual void* GetUserHandle() OVERRIDE; + // Returns the visible size of the decoded picture in pixels. + gfx::Size visible_size() const { + return visible_size_; + } + + // Returns the decoded size of the decoded picture in pixels. + gfx::Size decoded_size() const { + return decoded_size_; + } private: - // Pointer to the picture buffer which contains this picture. - PictureBuffer* picture_buffer_; - gfx::Size decoded_pixel_size_; - gfx::Size visible_pixel_size_; + int32 picture_buffer_id_; void* user_handle_; - - DISALLOW_IMPLICIT_CONSTRUCTORS(Picture); + gfx::Size visible_size_; + gfx::Size decoded_size_; }; } // namespace media diff --git a/media/video/video_decode_accelerator.cc b/media/video/video_decode_accelerator.cc index c88d48a..9063d68 100644 --- a/media/video/video_decode_accelerator.cc +++ b/media/video/video_decode_accelerator.cc @@ -8,8 +8,4 @@ namespace media { VideoDecodeAccelerator::~VideoDecodeAccelerator() {} -VideoDecodeAccelerator::PictureBuffer::~PictureBuffer() {} - -VideoDecodeAccelerator::Picture::~Picture() {} - } diff --git a/media/video/video_decode_accelerator.h b/media/video/video_decode_accelerator.h index cece4d8..20ebdd9 100644 --- a/media/video/video_decode_accelerator.h +++ b/media/video/video_decode_accelerator.h @@ -10,6 +10,7 @@ #include "base/basictypes.h" #include "base/callback_old.h" #include "media/base/bitstream_buffer.h" +#include "media/video/picture.h" #include "ui/gfx/size.h" namespace media { @@ -72,89 +73,11 @@ enum VideoAttributeKey { // H264 tool called Weighted Prediction. VIDEOATTRIBUTEKEY_BITSTREAMFORMAT_H264_FEATURE_WEIGHTEDPREDICTION, - VIDEOATTRIBUTEKEY_COLORFORMAT_BASE = 0x1000, - // Keys for definining attributes of a color buffer. Using these attributes - // users can define color spaces in terms of red, green, blue and alpha - // components as well as with combination of luma and chroma values with - // different subsampling schemes. Also planar, semiplanar and interleaved - // formats can be described by using the provided keys as instructed. - // - // Rules for describing the color planes (1 or more) that constitute the whole - // picture are: - // 1. Each plane starts with VIDEOATTRIBUTEKEY_COLORFORMAT_PLANE_PIXEL_SIZE - // attribute telling how many bits per pixel the plane contains. - // 2. VIDEOATTRIBUTEKEY_COLORFORMAT_PLANE_PIXEL_SIZE attribute must be - // followed either by - // a. Red, green and blue components followed optionally by alpha size - // attribute. - // OR - // b. Luma, blue difference chroma and red difference chroma components as - // well as three sampling reference factors that tell how the chroma may - // have been subsampled with respect to luma. - // 3. Description must be terminated with VIDEOATTRIBUTEKEY_COLORFORMAT_NONE - // key with no value for attribute. - // - // For example, semiplanar YCbCr 4:2:2 (2 planes, one containing 8-bit luma, - // the other containing two interleaved chroma data components) may be - // described with the following attributes: - // { - // VIDEOATTRIBUTEKEY_COLORFORMAT_PLANE_PIXEL_SIZE, 8, - // VIDEOATTRIBUTEKEY_COLORFORMAT_LUMA_SIZE, 8, - // VIDEOATTRIBUTEKEY_COLORFORMAT_PLANE_PIXEL_SIZE, 16, - // VIDEOATTRIBUTEKEY_COLORFORMAT_CHROMA_BLUE_SIZE, 8, - // VIDEOATTRIBUTEKEY_COLORFORMAT_CHROMA_RED_SIZE, 8, - // VIDEOATTRIBUTEKEY_COLORFORMAT_HORIZONTAL_SAMPLING_FACTOR_REFERENCE, 4, - // VIDEOATTRIBUTEKEY_COLORFORMAT_CHROMA_HORIZONTAL_SUBSAMPLING_FACTOR, 2, - // VIDEOATTRIBUTEKEY_COLORFORMAT_CHROMA_VERTICAL_SUBSAMPLING_FACTOR, 2 - // VIDEOATTRIBUTEKEY_TERMINATOR - // } - // - // Another example, commonly known 16-bit RGB 565 color format may be - // specified as follows: - // { - // VIDEOATTRIBUTEKEY_COLORFORMAT_PLANE_PIXEL_SIZE, 16, - // VIDEOATTRIBUTEKEY_COLORFORMAT_RED_SIZE, 5, - // VIDEOATTRIBUTEKEY_COLORFORMAT_GREEN_SIZE, 6, - // VIDEOATTRIBUTEKEY_COLORFORMAT_BLUE_SIZE, 5, - // VIDEOATTRIBUTEKEY_TERMINATOR - // } - // Total color component bits per pixel in the picture buffer. - VIDEOATTRIBUTEKEY_COLORFORMAT_PLANE_PIXEL_SIZE, - // Bits of red per pixel in picture buffer. - VIDEOATTRIBUTEKEY_COLORFORMAT_RED_SIZE, - // Bits of green per pixel in picture buffer. - VIDEOATTRIBUTEKEY_COLORFORMAT_GREEN_SIZE, - // Bits of blue per pixel in picture buffer. - VIDEOATTRIBUTEKEY_COLORFORMAT_BLUE_SIZE, - // Bits of alpha in color buffer. - VIDEOATTRIBUTEKEY_COLORFORMAT_ALPHA_SIZE, - // Bits of luma per pixel in color buffer. - VIDEOATTRIBUTEKEY_COLORFORMAT_LUMA_SIZE, - // Bits of blue difference chroma (Cb) data in color buffer. - VIDEOATTRIBUTEKEY_COLORFORMAT_CHROMA_BLUE_SIZE, - // Bits of blue difference chroma (Cr) data in color buffer. - VIDEOATTRIBUTEKEY_COLORFORMAT_CHROMA_RED_SIZE, - // Three keys to describe the subsampling of YCbCr sampled digital video - // signal. For example, 4:2:2 sampling could be defined by setting: - // VIDEOATTRIBUTEKEY_COLORFORMAT_HORIZONTAL_SAMPLING_FACTOR_REFERENCE = 4 - // VIDEOATTRIBUTEKEY_COLORFORMAT_CHROMINANCE_HORIZONTAL_SUBSAMPLING_FACTOR = 2 - // VIDEOATTRIBUTEKEY_COLORFORMAT_CHROMINANCE_VERTICAL_SUBSAMPLING_FACTOR = 2 - VIDEOATTRIBUTEKEY_COLORFORMAT_HORIZONTAL_SAMPLING_FACTOR_REFERENCE, - VIDEOATTRIBUTEKEY_COLORFORMAT_CHROMA_HORIZONTAL_SUBSAMPLING_FACTOR, - VIDEOATTRIBUTEKEY_COLORFORMAT_CHROMA_VERTICAL_SUBSAMPLING_FACTOR, - // Base for telling implementation specific information about the optimal - // number of picture buffers to be provided to the implementation. - VIDEOATTRIBUTEKEY_PICTUREBUFFER_REQUIREMENTS_BASE = 0x10000, - // Following two keys are used to signal how many buffers are needed by the - // implementation as a function of the maximum number of reference frames set - // by the stream. Number of required buffers is - // MAX_REF_FRAMES * REFERENCE_PIC_MULTIPLIER + ADDITIONAL_BUFFERS - VIDEOATTRIBUTEKEY_PICTUREBUFFER_REQUIREMENTS_ADDITIONAL_BUFFERS, - VIDEOATTRIBUTEKEY_PICTUREBUFFER_REQUIREMENTS_REFERENCE_PIC_MULTIPLIER, - // If decoder does not support pixel accurate strides for picture buffer, this - // parameter tells the stride multiple that is needed by the decoder. Plugin - // must obey the given stride in its picture buffer allocations. - VIDEOATTRIBUTEKEY_PICTUREBUFFER_REQUIREMENTS_STRIDE_MULTIPLE, + VIDEOATTRIBUTEKEY_COLOR_FORMAT_BASE = 0x1000, + // This specifies the output color format for a decoded frame. + // When used in GetConfigs, this represents the color types the + // Decode is capable of decoding. + VIDEOATTRIBUTEKEY_COLORFORMAT_RGBA, }; enum VideoCodecFourcc { @@ -228,8 +151,8 @@ enum H264PayloadFormat { }; // Video decoder interface. -// TODO(vmr): Move much of the inner classes to media namespace to simplify code -// that's using it. +// This interface is extended by the various components that ultimately +// implement the backend of PPB_VideoDecode_Dev. class VideoDecodeAccelerator { public: virtual ~VideoDecodeAccelerator(); @@ -247,76 +170,18 @@ class VideoDecodeAccelerator { VIDEODECODERERROR_UNEXPECTED_FLUSH, }; - // Interface expected from PictureBuffers where pictures are stored. - class PictureBuffer { - public: - enum MemoryType { - PICTUREBUFFER_MEMORYTYPE_NONE = 0, - PICTUREBUFFER_MEMORYTYPE_SYSTEM, - PICTUREBUFFER_MEMORYTYPE_GL_TEXTURE, - }; - // Union to represent one data plane in picture buffer. - union DataPlaneHandle { - struct { - uint32 context_id; // GLES context id. - uint32 texture_id; // GLES texture id. - }; - void* sysmem; // Simply a pointer to system memory. - }; - - virtual ~PictureBuffer(); - virtual int32 GetId() = 0; - virtual gfx::Size GetSize() = 0; - virtual const std::vector<uint32>& GetColorFormat() = 0; - virtual MemoryType GetMemoryType() = 0; - virtual std::vector<DataPlaneHandle>& GetPlaneHandles() = 0; - }; - - class Picture { - public: - virtual ~Picture(); - - // Picture size related functions. - // There are three types of logical picture sizes that applications using - // video decoder should be aware of: - // - Visible picture size, - // - Decoded picture size, and - // - Picture buffer size. - // - // Visible picture size means the actual picture size that is intended to be - // displayed from the decoded output. - // - // Decoded picture size might vary from the visible size of the picture, - // because of the underlying properties of the codec. Vast majority of - // modern video compression algorithms are based on (macro)block-based - // transforms and therefore process the picture in small windows (usually - // of size 16x16 pixels) one by one. However, if the native picture size - // does not happen to match the block-size of the algorithm, there may be - // redundant data left on the sides of the output picture, which are not - // intended for display. For example, this happens to video of size 854x480 - // and H.264 codec. Since the width (854 pixels) is not multiple of the - // block size of the coding format (16 pixels), pixel columns 854-863 - // contain garbage data which is notintended for display. - // - // Plugin is providing the buffers for output decoding and it should know - // the picture buffer size it has provided to the decoder. Thus, there is - // no function to query the buffer size from this class. - - // Returns the picture buffer where this picture is contained. - virtual PictureBuffer* picture_buffer() = 0; - - // Returns the decoded size of the decoded picture in pixels. - virtual gfx::Size GetDecodedSize() const = 0; - - // Returns the visible size of the decoded picture in pixels. - virtual gfx::Size GetVisibleSize() const = 0; - - // Returns metadata associated with the picture. - virtual void* GetUserHandle() = 0; + // Represents the type of data buffer to be used by the decoder. + enum MemoryType { + PICTUREBUFFER_MEMORYTYPE_NONE = 0, + PICTUREBUFFER_MEMORYTYPE_SYSTEM, + PICTUREBUFFER_MEMORYTYPE_GL_TEXTURE, }; // Interface for collaborating with picture interface to provide memory for // output picture and blitting them. + // This interface is extended by the various layers that relay messages back + // to the plugin, through the PPP_VideoDecode_Dev interface the plugin + // implements. class Client { public: virtual ~Client() {} @@ -325,13 +190,14 @@ class VideoDecodeAccelerator { // buffer to the decoder. virtual void ProvidePictureBuffers( uint32 requested_num_of_buffers, - const std::vector<uint32>& buffer_properties) = 0; + gfx::Size dimensions, + MemoryType type) = 0; // Callback to dismiss picture buffer that was assigned earlier. - virtual void DismissPictureBuffer(PictureBuffer* picture_buffer) = 0; + virtual void DismissPictureBuffer(int32 picture_buffer_id) = 0; // Callback to deliver decoded pictures ready to be displayed. - virtual void PictureReady(Picture* picture) = 0; + virtual void PictureReady(const Picture& picture) = 0; // Callback to notify that decoder has decoded end of stream marker and has // outputted all displayable pictures. @@ -342,16 +208,16 @@ class VideoDecodeAccelerator { }; // Video decoder functions. - // GetConfig returns supported configurations that are subsets of given - // |prototype_config|. + // GetConfigs returns the supported configurations that is a subset of the + // given |requested_configs|. // Parameters: - // |instance| is the pointer to the plug-in instance. - // |prototype_config| is the prototypical configuration. - // - // Returns std::vector containing all the configurations that match the - // prototypical configuration. - virtual const std::vector<uint32>& GetConfig( - const std::vector<uint32>& prototype_config) = 0; + // |requested_configs| is the set of configurations the plugin is querying + // for support. + // |matched_configs| is the subset of |requested_configs| that the decoder + // supports. + virtual void GetConfigs( + const std::vector<uint32>& requested_configs, + std::vector<uint32>* matched_configs) = 0; // Initializes the video decoder with specific configuration. // Parameters: @@ -368,27 +234,30 @@ class VideoDecodeAccelerator { // finished processing for |bitstream_buffer|. // // Returns true when command successfully accepted. Otherwise false. - virtual bool Decode(BitstreamBuffer* bitstream_buffer, + virtual bool Decode(const BitstreamBuffer& bitstream_buffer, VideoDecodeAcceleratorCallback* callback) = 0; - // Assigns picture buffer to the video decoder. This function must be called - // at latest when decoder has made a ProvidePictureBuffers callback to the - // client. Ownership of the picture buffer remains with the client, but it is - // not allowed to deallocate picture buffer before DismissPictureBuffer + // Assigns a set of picture buffers to the video decoder. + // AssignGLESBuffers assigns texture-backed buffers. + // AssignSysmemBuffers assigns system memory-backed buffers. + // + // Ownership of each picture buffer remains with the client, but the client + // is not allowed to deallocate the buffer before the DismissPictureBuffer // callback has been initiated for a given buffer. // // Parameters: - // |picture_buffers| contains the allocated picture buffers for the output. - virtual void AssignPictureBuffer( - std::vector<PictureBuffer*> picture_buffers) = 0; + // |buffers| contains the allocated picture buffers for the output. + virtual void AssignGLESBuffers(const std::vector<GLESBuffer>& buffers) = 0; + virtual void AssignSysmemBuffers( + const std::vector<SysmemBuffer>& buffers) = 0; // Sends picture buffers to be reused by the decoder. This needs to be called // for each buffer that has been processed so that decoder may know onto which // picture buffers it can write the output to. // // Parameters: - // |picture_buffer| points to the picture buffer that is to be reused. - virtual void ReusePictureBuffer(PictureBuffer* picture_buffer) = 0; + // |picture_buffer_id| id of the picture buffer that is to be reused. + virtual void ReusePictureBuffer(uint32 picture_buffer_id) = 0; // Flushes the decoder. Flushing will result in output of the // pictures and buffers held inside the decoder and returning of bitstream diff --git a/ppapi/c/dev/pp_video_dev.h b/ppapi/c/dev/pp_video_dev.h index 95d078e..7c4c73b 100644 --- a/ppapi/c/dev/pp_video_dev.h +++ b/ppapi/c/dev/pp_video_dev.h @@ -69,92 +69,14 @@ enum PP_VideoAttributeDictionary { // H264 tool called Weighted Prediction. PP_VIDEOATTR_BITSTREAMFORMATKEY_H264_FEATURE_WEIGHTEDPREDICTION, - PP_VIDEOATTR_DICTIONARY_COLOR_CORMAT_BASE = 0x1000, - // Keys for definining attributes of a color buffer. Using these attributes - // users can define color spaces in terms of red, green, blue and alpha - // components as well as with combination of luma and chroma values with - // different subsampling schemes. Also planar, semiplanar and interleaved - // formats can be described by using the provided keys as instructed. + PP_VIDEOATTR_DICTIONARY_COLOR_FORMAT_BASE = 0x1000, + // This specifies the output color format for a decoded frame. // - // Rules for describing the color planes (1 or more) that constitute the whole - // picture are: - // 1. Each plane starts with PP_VIDEOATTR_COLORFORMATKEY_PLANE_PIXEL_SIZE - // attribute telling how many bits per pixel the plane contains. - // 2. PP_VIDEOATTR_COLORFORMATKEY_PLANE_PIXEL_SIZE attribute must be - // followed either by - // a. Red, green and blue components followed optionally by alpha size - // attribute. - // OR - // b. Luma, blue difference chroma and red difference chroma components as - // well as three sampling reference factors that tell how the chroma may - // have been subsampled with respect to luma. - // 3. Description must be terminated with PP_VIDEOATTR_COLORFORMATKEY_NONE - // key with no value for attribute. - // - // For example, semiplanar YCbCr 4:2:2 (2 planes, one containing 8-bit luma, - // the other containing two interleaved chroma data components) may be - // described with the following attributes: - // { - // PP_VIDEOATTR_COLORFORMATKEY_PLANE_PIXEL_SIZE, 8, - // PP_VIDEOATTR_COLORFORMATKEY_LUMA_SIZE, 8, - // PP_VIDEOATTR_COLORFORMATKEY_PLANE_PIXEL_SIZE, 16, - // PP_VIDEOATTR_COLORFORMATKEY_CHROMA_BLUE_SIZE, 8, - // PP_VIDEOATTR_COLORFORMATKEY_CHROMA_RED_SIZE, 8, - // PP_VIDEOATTR_COLORFORMATKEY_HORIZONTAL_SAMPLING_FACTOR_REFERENCE, 4, - // PP_VIDEOATTR_COLORFORMATKEY_CHROMA_HORIZONTAL_SUBSAMPLING_FACTOR, 2, - // PP_VIDEOATTR_COLORFORMATKEY_CHROMA_VERTICAL_SUBSAMPLING_FACTOR, 2 - // PP_VIDEOATTR_DICTIONARY_TERMINATOR - // } - // - // Another example, commonly known 16-bit RGB 565 color format may be - // specified as follows: - // { - // PP_VIDEOATTR_COLORFORMATKEY_PLANE_PIXEL_SIZE, 16, - // PP_VIDEOATTR_COLORFORMATKEY_RED_SIZE, 5, - // PP_VIDEOATTR_COLORFORMATKEY_GREEN_SIZE, 6, - // PP_VIDEOATTR_COLORFORMATKEY_BLUE_SIZE, 5, - // PP_VIDEOATTR_DICTIONARY_TERMINATOR - // } - // Total color component bits per pixel in the picture buffer. - PP_VIDEOATTR_COLORFORMATKEY_PLANE_PIXEL_SIZE, - // Bits of red per pixel in picture buffer. - PP_VIDEOATTR_COLORFORMATKEY_RED_SIZE, - // Bits of green per pixel in picture buffer. - PP_VIDEOATTR_COLORFORMATKEY_GREEN_SIZE, - // Bits of blue per pixel in picture buffer. - PP_VIDEOATTR_COLORFORMATKEY_BLUE_SIZE, - // Bits of alpha in color buffer. - PP_VIDEOATTR_COLORFORMATKEY_ALPHA_SIZE, - // Bits of luma per pixel in color buffer. - PP_VIDEOATTR_COLORFORMATKEY_LUMA_SIZE, - // Bits of blue difference chroma (Cb) data in color buffer. - PP_VIDEOATTR_COLORFORMATKEY_CHROMA_BLUE_SIZE, - // Bits of blue difference chroma (Cr) data in color buffer. - PP_VIDEOATTR_COLORFORMATKEY_CHROMA_RED_SIZE, - // Three keys to describe the subsampling of YCbCr sampled digital video - // signal. For example, 4:2:2 sampling could be defined by setting: - // PP_VIDEOATTR_COLORFORMATKEY_HORIZONTAL_SAMPLING_FACTOR_REFERENCE = 4 - // PP_VIDEOATTR_COLORFORMATKEY_CHROMINANCE_HORIZONTAL_SUBSAMPLING_FACTOR = 2 - // PP_VIDEOATTR_COLORFORMATKEY_CHROMINANCE_VERTICAL_SUBSAMPLING_FACTOR = 2 - PP_VIDEOATTR_COLORFORMATKEY_HORIZONTAL_SAMPLING_FACTOR_REFERENCE, - PP_VIDEOATTR_COLORFORMATKEY_CHROMA_HORIZONTAL_SUBSAMPLING_FACTOR, - PP_VIDEOATTR_COLORFORMATKEY_CHROMA_VERTICAL_SUBSAMPLING_FACTOR, - // Base for telling implementation specific information about the optimal - // number of picture buffers to be provided to the implementation. - PP_VIDEOATTR_DICTIONARY_PICTUREBUFFER_REQUIREMENTS_BASE = 0x10000, - // Following two keys are used to signal how many buffers are needed by the - // implementation as a function of the maximum number of reference frames set - // by the stream. Number of required buffers is - // MAX_REF_FRAMES * REFERENCE_PIC_MULTIPLIER + ADDITIONAL_BUFFERS - PP_VIDEOATTR_PICTUREBUFFER_REQUIREMENTS_ADDITIONAL_BUFFERS, - PP_VIDEOATTR_PICTUREBUFFER_REQUIREMENTS_REFERENCE_PIC_MULTIPLIER, - // If decoder does not support pixel accurate strides for picture buffer, this - // parameter tells the stride multiple that is needed by the decoder. Plugin - // must obey the given stride in its picture buffer allocations. - PP_VIDEOATTR_PICTUREBUFFER_REQUIREMENTS_STRIDE_MULTIPLE + // Value represents 32-bit RGBA format where each component is 8-bit. + PP_VIDEOATTR_COLORFORMAT_RGBA }; PP_COMPILE_ASSERT_ENUM_SIZE_IN_BYTES(PP_VideoAttributeDictionary, 4); -typedef int32_t* PP_VideoConfigElement; +typedef int32_t PP_VideoConfigElement; enum PP_VideoCodecFourcc { PP_VIDEOCODECFOURCC_NONE = 0, @@ -241,26 +163,6 @@ enum PP_PictureBufferType_Dev { }; PP_COMPILE_ASSERT_ENUM_SIZE_IN_BYTES(PP_PictureBufferType_Dev, 4); -// Structure to describe storage properties for a picture. -struct PP_PictureBufferProperties_Dev { - // Size of the storage (as per width & height in pixels). - struct PP_Size size; - - // Type of the picture buffer (GLES, system memory). - enum PP_PictureBufferType_Dev type; - - // Key-attribute pairs defining color format for the buffer. - PP_VideoConfigElement color_format; -}; - -// Requested decoder configuration and callback from plugin. -struct PP_VideoDecoderConfig_Dev { - // Input bitstream properties. - PP_VideoConfigElement bitstream_properties; - // Output picture properties. - struct PP_PictureBufferProperties_Dev picture_properties; -}; - // The data structure for video bitstream buffer. struct PP_VideoBitstreamBuffer_Dev { // Buffer to hold the bitstream data. Should be allocated using the PPB_Buffer @@ -270,49 +172,65 @@ struct PP_VideoBitstreamBuffer_Dev { // Size of the bitstream contained in buffer (in bytes). int32_t bitstream_size; - // Optional pointer for application to associate information with a sample. - // The pointer will be associated with the resulting decoded picture. - // Typically applications associate timestamps with buffers. + // Handle to identify the bitstream buffer. void* user_handle; - - // TODO(vmr): Add information about access unit boundaries. }; -// Union for specifying picture data. -union PP_PictureData_Dev { - // Resource representing system memory from shared memory address space. - // Use PPB_Buffer_Dev interface to handle this resource. - PP_Resource sysmem; - - // Structure to define explicitly a GLES2 context. - struct { - // Context allocated using PPB_Context3D_Dev. - PP_Resource context; - - // Texture ID in the given context where picture is stored. - GLuint texture_id; - } gles2_texture; - +// Struct for specifying data about buffer. +struct PP_BufferInfo_Dev { // Client-specified id for the picture buffer. By using this value client can // keep track of the buffers it has assigned to the video decoder and how they // are passed back to it. int32_t id; + + // Dimensions of the buffer. + struct PP_Size size; +}; + +// Struct for specifying texture-backed picture data. +struct PP_GLESBuffer_Dev { + // Context allocated using PPB_Context3D_Dev. + PP_Resource context; + + // Texture ID in the given context where picture is stored. + GLuint texture_id; + + // Information about the buffer. + struct PP_BufferInfo_Dev info; }; -// Structure to describe the decoded output picture for the plug-in along with -// optional metadata associated with the picture. +// Struct for specifying sysmem-backed picture data. +struct PP_SysmemBuffer_Dev { + // Resource representing system memory from shared memory address space. + // Use PPB_Buffer_Dev interface to handle this resource. + PP_Resource data; + + // Information about the buffer. + struct PP_BufferInfo_Dev info; +}; + +// Structure to describe a decoded output frame. +// The decoded pixels will always begin flush with the upper left-hand corner +// of the buffer (0, 0). struct PP_Picture_Dev { - // Resource that represents the buffer where the picture data is stored. - // Actual implementation style of the picture buffer may be OpenGL ES texture - // (allocated using PPB_OpenGLES2_Dev) or system memory (allocated using - // PPB_Buffer_Dev). - union PP_PictureData_Dev picture_data; + // ID of the picture buffer where the picture is stored. + int32_t picture_buffer_id; - // Optional pointer to associated metadata with the picture. Typical - // information carried over metadata includes timestamps. If there is - // multiple NAL units each with their own respective metadata, only the - // metadata from the latest call to Decode will be carried over. - void* user_handle; + // Visible size of the picture. + // This describes the dimensions of the picture that is intended to be + // displayed from the decoded output. + struct PP_Size visible_size; + + // Decoded size of the picture. + // This describes the dimensions of the decoded output. This may be slightly + // larger than the visible size because the stride is sometimes larger than + // the width of the output. The plugin should handle rendering the frame + // appropriately with respect to the sizes. + struct PP_Size decoded_size; + + // Handle to identify the bitstream buffer from which this picture was + // decoded. + void* bitstream_user_handle; }; // Enumeration for error events that may be reported through diff --git a/ppapi/c/dev/ppb_video_decoder_dev.h b/ppapi/c/dev/ppb_video_decoder_dev.h index 1aed02d..53869a0 100644 --- a/ppapi/c/dev/ppb_video_decoder_dev.h +++ b/ppapi/c/dev/ppb_video_decoder_dev.h @@ -9,8 +9,8 @@ #include "ppapi/c/pp_completion_callback.h" #include "ppapi/c/pp_var.h" -#define PPB_VIDEODECODER_DEV_INTERFACE_0_5 "PPB_VideoDecoder(Dev);0.5" -#define PPB_VIDEODECODER_DEV_INTERFACE PPB_VIDEODECODER_DEV_INTERFACE_0_5 +#define PPB_VIDEODECODER_DEV_INTERFACE_0_6 "PPB_VideoDecoder(Dev);0.6" +#define PPB_VIDEODECODER_DEV_INTERFACE PPB_VIDEODECODER_DEV_INTERFACE_0_6 // Video decoder interface. // @@ -70,10 +70,10 @@ struct PPB_VideoDecoder_Dev { // // Returns PP_TRUE on success, PP_FALSE otherwise. PP_Bool (*GetConfigs)(PP_Instance instance, - struct PP_VideoDecoderConfig_Dev* proto_config, - struct PP_VideoDecoderConfig_Dev* matching_configs, - int32_t matching_configs_size, - int32_t* num_of_matching_configs); + PP_VideoConfigElement* proto_config, + PP_VideoConfigElement* matching_configs, + uint32_t matching_configs_size, + uint32_t* num_of_matching_configs); // Creates a video decoder with requested |decoder_config|. // |input_format| in |decoder_config| specifies the format of input access @@ -88,7 +88,7 @@ struct PPB_VideoDecoder_Dev { // // The created decoder is returned as PP_Resource. NULL means failure. PP_Resource (*Create)(PP_Instance instance, - struct PP_VideoDecoderConfig_Dev* dec_config); + PP_VideoConfigElement* dec_config); // Tests whether |resource| is a video decoder created through Create // function of this interface. @@ -114,37 +114,39 @@ struct PPB_VideoDecoder_Dev { struct PP_VideoBitstreamBuffer_Dev* bitstream_buffer, struct PP_CompletionCallback callback); - // Provides the decoder with picture buffers for video decoding. This - // function should be called when decoder has issued ProvidePictureBuffers - // callback to the plugin with buffer requirements. + // Provides the decoder with picture buffers for video decoding. + // AssignGLESBuffers provides texture-backed buffers, whereas + // AssignSysmemBuffers provides system memory-backed buffers. // - // If the plugin is can determine how many and what kind of buffers are - // needed by the decoder it can provide them in advance. For this purpose - // the configuration map can provide how many extra buffers the decoder - // implementation requires for seamless operation. + // This function should be called when decoder has issued the + // ProvidePictureBuffers callback to the plugin with buffer requirements. // - // The decoder will pause if AssignPictureBuffer hasn't been called with - // sufficient buffers. + // It can also be called in advance or outside of ProvidePictureBuffers calls + // to provide the decoder with additional buffers. Additional buffers will be + // added to the decoder's buffer pool. // - // If the decoder rejects the buffers it will return the buffers and issue - // ProvidePictureBuffers again. + // The decoder will pause in decoding if it has not received enough buffers. // - // If AssignPictureBuffer is called multiple times the decoder will add them - // to its pool of output pictures. + // If the buffer is invalid, the decoder will return the buffer and will issue + // ProvidePictureBuffers again. // - // TODO(vmr): this API feels too flexible... should we make it more strict - // where the decoder errors on bad buffers/duplicate buffers? Perhaps - // AssignPictureBuffer should only get called in response to - // ProvidePictureBuffer? + // TODO(vmr/vrk): Decide if the API is too flexible, i.e. stricter rules on + // errors/duplicates or requiring Assign*Buffers to only be called in response + // to ProvidePictureBuffers... in which case the output buffers should be + // callback parameters to ProvidePictureBuffers instead of being part of the + // PPB API. // // Parameters: // |video_decoder| is the previously created handle to the decoder instance. // |no_of_buffers| how many buffers are behind picture buffer pointer. - // |picture_buffer| contains the reference to the picture buffer that was - // processed. - void (*AssignPictureBuffer)(PP_Resource video_decoder, + // |buffers| contains the reference to the picture buffer that was + // allocated. + void (*AssignGLESBuffers)(PP_Resource video_decoder, + uint32_t no_of_buffers, + struct PP_GLESBuffer_Dev* buffers); + void (*AssignSysmemBuffers)(PP_Resource video_decoder, uint32_t no_of_buffers, - union PP_PictureData_Dev* picture_buffer); + struct PP_SysmemBuffer_Dev* buffers); // Tells the decoder to reuse given picture buffer. Typical use of this // function is to call from PictureReady callback to recycle picture buffer @@ -164,7 +166,7 @@ struct PPB_VideoDecoder_Dev { // |picture_buffer| contains the reference to the picture buffer that was // processed. void (*ReusePictureBuffer)(PP_Resource video_decoder, - union PP_PictureData_Dev* picture_buffer); + int32_t picture_buffer_id); // Dispatches flushing request to the decoder to flush both input and output // buffers. Successful flushing will result in output of the pictures and diff --git a/ppapi/c/dev/ppp_video_decoder_dev.h b/ppapi/c/dev/ppp_video_decoder_dev.h index 3fb265c..7ae8c55 100644 --- a/ppapi/c/dev/ppp_video_decoder_dev.h +++ b/ppapi/c/dev/ppp_video_decoder_dev.h @@ -7,7 +7,7 @@ #include "ppapi/c/dev/pp_video_dev.h" -#define PPP_VIDEODECODER_DEV_INTERFACE "PPP_VideoDecoder(Dev);0.1" +#define PPP_VIDEODECODER_DEV_INTERFACE "PPP_VideoDecoder(Dev);0.2" // PPP_VideoDecoder_Dev structure contains the function pointers that the // plugin MUST implement to provide services needed by the video decoder @@ -16,18 +16,20 @@ struct PPP_VideoDecoder_Dev { // 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 |props| cannot be allocated decoder should be destroyed. + // given in the parameters cannot be allocated decoder should be destroyed. // // Decoding will not proceed until buffers have been provided. // // Parameters: // |decoder| is pointer to the Pepper Video Decoder instance. // |req_num_of_bufs| tells how many buffers are needed by the decoder. - // |props| tells the properties that are required from the textures. + // |dimensions| tells the dimensions of the buffer to allocate. + // |type| specifies whether the buffer lives in system memory or GL texture. void (*ProvidePictureBuffers)( PP_Resource decoder, uint32_t req_num_of_bufs, - const struct PP_PictureBufferProperties_Dev* props); + struct PP_Size dimensions, + enum PP_PictureBufferType_Dev type); // Callback function for decoder to deliver unneeded picture buffers back to // the plugin. @@ -36,7 +38,7 @@ struct PPP_VideoDecoder_Dev { // |decoder| is pointer to the Pepper Video Decoder instance. // |picture_buffer| points to the picture buffer that is no longer needed. void (*DismissPictureBuffer)(PP_Resource decoder, - union PP_PictureData_Dev* picture_buffer); + int32_t picture_buffer_id); // Callback function for decoder to deliver decoded pictures ready to be // displayed. Decoder expects the plugin to return the buffer back to the @@ -46,7 +48,7 @@ struct PPP_VideoDecoder_Dev { // |decoder| is pointer to the Pepper Video Decoder instance. // |picture| is the picture that is ready. void (*PictureReady)(PP_Resource decoder, - struct PP_Picture_Dev* picture); + struct PP_Picture_Dev picture); // Callback function to tell the plugin that decoder has decoded end of stream // marker and output all the pictures that should be displayed from the diff --git a/ppapi/tests/arch_dependent_sizes_32.h b/ppapi/tests/arch_dependent_sizes_32.h index 25252d8..b7661cb 100644 --- a/ppapi/tests/arch_dependent_sizes_32.h +++ b/ppapi/tests/arch_dependent_sizes_32.h @@ -17,11 +17,9 @@ PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_CompletionCallback_Func, 4); PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_URLLoaderTrusted_StatusCallback, 4); PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_CompletionCallback, 8); PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_FileChooserOptions_Dev, 8); -PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_Picture_Dev, 12); -PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_PictureBufferProperties_Dev, 16); +PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_Picture_Dev, 24); PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_VideoBitstreamBuffer_Dev, 12); -PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_VideoDecoderConfig_Dev, 20); -PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PPB_VideoDecoder_Dev, 32); +PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PPB_VideoDecoder_Dev, 36); PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PPP_VideoDecoder_Dev, 20); #endif /* PPAPI_TESTS_ARCH_DEPENDENT_SIZES_32_H_ */ diff --git a/ppapi/tests/arch_dependent_sizes_64.h b/ppapi/tests/arch_dependent_sizes_64.h index 79f87618..80cc7b2 100644 --- a/ppapi/tests/arch_dependent_sizes_64.h +++ b/ppapi/tests/arch_dependent_sizes_64.h @@ -17,11 +17,9 @@ PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_CompletionCallback_Func, 8); PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_URLLoaderTrusted_StatusCallback, 8); PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_CompletionCallback, 16); PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_FileChooserOptions_Dev, 16); -PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_Picture_Dev, 16); -PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_PictureBufferProperties_Dev, 24); +PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_Picture_Dev, 32); PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_VideoBitstreamBuffer_Dev, 16); -PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_VideoDecoderConfig_Dev, 32); -PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PPB_VideoDecoder_Dev, 64); +PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PPB_VideoDecoder_Dev, 72); PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PPP_VideoDecoder_Dev, 40); #endif /* PPAPI_TESTS_ARCH_DEPENDENT_SIZES_64_H_ */ diff --git a/webkit/plugins/ppapi/mock_plugin_delegate.cc b/webkit/plugins/ppapi/mock_plugin_delegate.cc index f6d5adb..d4e2296 100644 --- a/webkit/plugins/ppapi/mock_plugin_delegate.cc +++ b/webkit/plugins/ppapi/mock_plugin_delegate.cc @@ -41,7 +41,8 @@ MockPluginDelegate::PlatformContext3D* MockPluginDelegate::CreateContext3D() { MockPluginDelegate::PlatformVideoDecoder* MockPluginDelegate::CreateVideoDecoder( - PP_VideoDecoderConfig_Dev* decoder_config) { + PP_VideoConfigElement* decoder_config, + media::VideoDecodeAccelerator::Client* client) { return NULL; } diff --git a/webkit/plugins/ppapi/mock_plugin_delegate.h b/webkit/plugins/ppapi/mock_plugin_delegate.h index a5b8376..1259d36 100644 --- a/webkit/plugins/ppapi/mock_plugin_delegate.h +++ b/webkit/plugins/ppapi/mock_plugin_delegate.h @@ -22,7 +22,8 @@ class MockPluginDelegate : public PluginDelegate { virtual PlatformImage2D* CreateImage2D(int width, int height); virtual PlatformContext3D* CreateContext3D(); virtual PlatformVideoDecoder* CreateVideoDecoder( - PP_VideoDecoderConfig_Dev* decoder_config); + PP_VideoConfigElement* decoder_config, + media::VideoDecodeAccelerator::Client* client); virtual PlatformAudio* CreateAudio(uint32_t sample_rate, uint32_t sample_count, PlatformAudio::Client* client); diff --git a/webkit/plugins/ppapi/plugin_delegate.h b/webkit/plugins/ppapi/plugin_delegate.h index bbd7cfe..d05e8e9 100644 --- a/webkit/plugins/ppapi/plugin_delegate.h +++ b/webkit/plugins/ppapi/plugin_delegate.h @@ -16,6 +16,7 @@ #include "base/time.h" #include "googleurl/src/gurl.h" #include "media/video/video_decode_accelerator.h" +#include "ppapi/c/dev/pp_video_dev.h" #include "ppapi/c/pp_completion_callback.h" #include "ppapi/c/pp_errors.h" #include "ppapi/c/pp_instance.h" @@ -61,7 +62,6 @@ class P2PTransport; } // namespace webkit_glue struct PP_Flash_NetAddress; -struct PP_VideoDecoderConfig_Dev; class TransportDIB; @@ -251,7 +251,8 @@ class PluginDelegate { // The caller will own the pointer returned from this. virtual PlatformVideoDecoder* CreateVideoDecoder( - PP_VideoDecoderConfig_Dev* decoder_config) = 0; + PP_VideoConfigElement* decoder_config, + media::VideoDecodeAccelerator::Client* client) = 0; // The caller is responsible for calling Shutdown() on the returned pointer // to clean up the corresponding resources allocated during this call. diff --git a/webkit/plugins/ppapi/ppb_video_decoder_impl.cc b/webkit/plugins/ppapi/ppb_video_decoder_impl.cc index ec2d3f1..6f0c723 100644 --- a/webkit/plugins/ppapi/ppb_video_decoder_impl.cc +++ b/webkit/plugins/ppapi/ppb_video_decoder_impl.cc @@ -7,15 +7,18 @@ #include <string> #include "base/logging.h" +#include "media/video/picture.h" #include "ppapi/c/dev/pp_video_dev.h" #include "ppapi/c/dev/ppb_video_decoder_dev.h" +#include "ppapi/c/dev/ppp_video_decoder_dev.h" #include "ppapi/c/pp_completion_callback.h" #include "ppapi/c/pp_errors.h" #include "webkit/plugins/ppapi/common.h" -#include "webkit/plugins/ppapi/var.h" +#include "webkit/plugins/ppapi/plugin_module.h" #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" -#include "webkit/plugins/ppapi/ppb_file_ref_impl.h" +#include "webkit/plugins/ppapi/ppb_buffer_impl.h" #include "webkit/plugins/ppapi/resource_tracker.h" +#include "webkit/plugins/ppapi/var.h" namespace webkit { namespace ppapi { @@ -23,10 +26,10 @@ namespace ppapi { namespace { PP_Bool GetConfigs(PP_Instance instance_id, - PP_VideoDecoderConfig_Dev* proto_config, - PP_VideoDecoderConfig_Dev* matching_configs, - int32_t matching_configs_size, - int32_t* num_of_matching_configs) { + PP_VideoConfigElement* proto_config, + PP_VideoConfigElement* matching_configs, + uint32_t matching_configs_size, + uint32_t* num_of_matching_configs) { PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); if (!instance) return PP_FALSE; @@ -41,7 +44,7 @@ PP_Bool GetConfigs(PP_Instance instance_id, } PP_Resource Create(PP_Instance instance_id, - PP_VideoDecoderConfig_Dev* decoder_config) { + PP_VideoConfigElement* decoder_config) { PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); if (!instance) return 0; @@ -49,7 +52,7 @@ PP_Resource Create(PP_Instance instance_id, scoped_refptr<PPB_VideoDecoder_Impl> decoder( new PPB_VideoDecoder_Impl(instance)); - if (!decoder->Init(const_cast<PP_VideoDecoderConfig_Dev*>(decoder_config))) + if (!decoder->Init(const_cast<PP_VideoConfigElement*>(decoder_config))) return 0; return decoder->GetReference(); @@ -70,29 +73,38 @@ PP_Bool Decode(PP_Resource decoder_id, return BoolToPPBool(decoder->Decode(bitstream_buffer, callback)); } -void AssignPictureBuffer(PP_Resource video_decoder, +void AssignGLESBuffers(PP_Resource video_decoder, + uint32_t no_of_buffers, + PP_GLESBuffer_Dev* buffers) { + scoped_refptr<PPB_VideoDecoder_Impl> decoder( + Resource::GetAs<PPB_VideoDecoder_Impl>(video_decoder)); + if (!decoder) + return; + + decoder->AssignGLESBuffers(no_of_buffers, buffers); +} + +void AssignSysmemBuffers(PP_Resource video_decoder, uint32_t no_of_buffers, - union PP_PictureData_Dev* picture_buffer) { + PP_SysmemBuffer_Dev* buffers) { scoped_refptr<PPB_VideoDecoder_Impl> decoder( Resource::GetAs<PPB_VideoDecoder_Impl>(video_decoder)); if (!decoder) return; - decoder->AssignPictureBuffer(no_of_buffers, picture_buffer); + decoder->AssignSysmemBuffers(no_of_buffers, buffers); } -void ReusePictureBuffer(PP_Resource video_decoder, - union PP_PictureData_Dev* picture_buffer) { +void ReusePictureBuffer(PP_Resource video_decoder, int32_t picture_buffer_id) { scoped_refptr<PPB_VideoDecoder_Impl> decoder( Resource::GetAs<PPB_VideoDecoder_Impl>(video_decoder)); if (!decoder) return; - decoder->ReusePictureBuffer(picture_buffer); + decoder->ReusePictureBuffer(picture_buffer_id); } -PP_Bool Flush(PP_Resource video_decoder, - PP_CompletionCallback callback) { +PP_Bool Flush(PP_Resource video_decoder, PP_CompletionCallback callback) { scoped_refptr<PPB_VideoDecoder_Impl> decoder( Resource::GetAs<PPB_VideoDecoder_Impl>(video_decoder)); if (!decoder) @@ -111,18 +123,42 @@ PP_Bool Abort(PP_Resource video_decoder, return BoolToPPBool(decoder->Abort(callback)); } - const PPB_VideoDecoder_Dev ppb_videodecoder = { &GetConfigs, &Create, &IsVideoDecoder, &Decode, - &AssignPictureBuffer, + &AssignGLESBuffers, + &AssignSysmemBuffers, &ReusePictureBuffer, &Flush, &Abort, }; +// Utility methods to convert data to and from the ppapi C-types and their +// C++ media-namespace equivalents. +void CopyToPictureDev(const media::Picture& input, PP_Picture_Dev* output) { + output->picture_buffer_id = input.picture_buffer_id(); + output->bitstream_user_handle = input.user_handle(); + output->visible_size = + PP_MakeSize(input.visible_size().width(), input.visible_size().height()); + output->decoded_size = + PP_MakeSize(input.decoded_size().width(), input.decoded_size().height()); +} + +void CopyToConfigList( + const PP_VideoConfigElement* configs, std::vector<uint32>* output) { + // TODO(vrk): This is assuming PP_VideoAttributeDictionary and + // VideoAttributeKey have identical enum values. There is no compiler + // assert to guarantee this. We either need to add such asserts or + // merge PP_VideoAttributeDictionary and VideoAttributeKey. + const PP_VideoConfigElement* current = configs; + while (*current != PP_VIDEOATTR_DICTIONARY_TERMINATOR) { + output->push_back(static_cast<uint32>(*configs)); + current++; + } +} + } // namespace PPB_VideoDecoder_Impl::PPB_VideoDecoder_Impl(PluginInstance* instance) @@ -131,6 +167,9 @@ PPB_VideoDecoder_Impl::PPB_VideoDecoder_Impl(PluginInstance* instance) abort_callback_(PP_BlockUntilComplete()), flush_callback_(PP_BlockUntilComplete()), bitstream_buffer_callback_(PP_BlockUntilComplete()) { + ppp_videodecoder_ = + static_cast<const PPP_VideoDecoder_Dev*>(instance->module()-> + GetPluginInterface(PPP_VIDEODECODER_DEV_INTERFACE)); } PPB_VideoDecoder_Impl::~PPB_VideoDecoder_Impl() { @@ -146,27 +185,36 @@ PPB_VideoDecoder_Impl* PPB_VideoDecoder_Impl::AsPPB_VideoDecoder_Impl() { } bool PPB_VideoDecoder_Impl::GetConfigs( - PP_VideoDecoderConfig_Dev* proto_config, - PP_VideoDecoderConfig_Dev* matching_configs, - int32_t matching_configs_size, - int32_t* num_of_matching_configs) { + PP_VideoConfigElement* requested_configs, + PP_VideoConfigElement* matching_configs, + uint32_t matching_configs_size, + uint32_t* num_of_matching_configs) { if (!instance()) return false; if (!platform_video_decoder_.get()) return false; + if (!matching_configs) + return false; + + std::vector<uint32> requested; + CopyToConfigList(requested_configs, &requested); + std::vector<uint32> matched; + platform_video_decoder_->GetConfigs(requested, &matched); - // TODO(vmr): Implement. - NOTIMPLEMENTED(); + uint32 i; + for (i = 0; i < matched.size() && i < matching_configs_size; i++) + matching_configs[i] = matched[i]; + *num_of_matching_configs = i; - return false; + return true; } -bool PPB_VideoDecoder_Impl::Init(PP_VideoDecoderConfig_Dev* decoder_config) { +bool PPB_VideoDecoder_Impl::Init(PP_VideoConfigElement* decoder_config) { if (!instance()) return false; platform_video_decoder_.reset( - instance()->delegate()->CreateVideoDecoder(decoder_config)); + instance()->delegate()->CreateVideoDecoder(decoder_config, this)); return platform_video_decoder_.get()? true : false; } @@ -177,9 +225,12 @@ bool PPB_VideoDecoder_Impl::Decode( if (!platform_video_decoder_.get()) return false; - media::BitstreamBuffer* decode_buffer = NULL; - // TODO(vmr): Convert bitstream_buffer to BitstreamBuffer object. - NOTIMPLEMENTED(); + scoped_refptr<PPB_Buffer_Impl> pepper_buffer = + Resource::GetAs<PPB_Buffer_Impl>(bitstream_buffer->bitstream); + + media::BitstreamBuffer decode_buffer(pepper_buffer->mapped_buffer(), + bitstream_buffer->bitstream_size, + bitstream_buffer->user_handle); // Store the callback to inform when bitstream buffer has been processed. // TODO(vmr): handle simultaneous decodes + callbacks. @@ -191,29 +242,40 @@ bool PPB_VideoDecoder_Impl::Decode( &PPB_VideoDecoder_Impl::OnBitstreamBufferProcessed)); } -void PPB_VideoDecoder_Impl::AssignPictureBuffer( - uint32_t no_of_picture_buffers, - PP_PictureData_Dev* picture_buffers) { +void PPB_VideoDecoder_Impl::AssignGLESBuffers( + uint32_t no_of_buffers, + PP_GLESBuffer_Dev* buffers) { if (!platform_video_decoder_.get()) return; - // TODO(vmr): Map PP_PictureData_Dev into PictureBuffer object. - NOTIMPLEMENTED(); - - media::VideoDecodeAccelerator::PictureBuffer* buffer = NULL; - platform_video_decoder_->ReusePictureBuffer(buffer); + std::vector<media::GLESBuffer> wrapped_buffers; + for (uint32 i = 0; i < no_of_buffers; i++) { + PP_GLESBuffer_Dev in_buf = buffers[i]; + media::GLESBuffer buffer(in_buf); + wrapped_buffers.push_back(buffer); + } + platform_video_decoder_->AssignGLESBuffers(wrapped_buffers); } -void PPB_VideoDecoder_Impl::ReusePictureBuffer( - PP_PictureData_Dev* picture_buffer) { +void PPB_VideoDecoder_Impl::AssignSysmemBuffers( + uint32_t no_of_buffers, + PP_SysmemBuffer_Dev* buffers) { if (!platform_video_decoder_.get()) return; - // TODO(vmr): Map PP_PictureData_Dev into PictureBuffer object. - NOTIMPLEMENTED(); + std::vector<media::SysmemBuffer> wrapped_buffers; + for (uint32 i = 0; i < no_of_buffers; i++) { + PP_SysmemBuffer_Dev in_buf = buffers[i]; + media::SysmemBuffer buffer(in_buf); + wrapped_buffers.push_back(buffer); + } + platform_video_decoder_->AssignSysmemBuffers(wrapped_buffers); +} - media::VideoDecodeAccelerator::PictureBuffer* buffer = NULL; - platform_video_decoder_->ReusePictureBuffer(buffer); +void PPB_VideoDecoder_Impl::ReusePictureBuffer(int32_t picture_buffer_id) { + if (!platform_video_decoder_.get()) + return; + platform_video_decoder_->ReusePictureBuffer(picture_buffer_id); } bool PPB_VideoDecoder_Impl::Flush(PP_CompletionCallback callback) { @@ -243,54 +305,61 @@ bool PPB_VideoDecoder_Impl::Abort(PP_CompletionCallback callback) { } void PPB_VideoDecoder_Impl::ProvidePictureBuffers( - uint32_t requested_num_of_buffers, - const std::vector<uint32_t>& buffer_properties) { - // TODO(vmr): Implement. - NOTIMPLEMENTED(); + uint32 requested_num_of_buffers, + gfx::Size dimensions, + media::VideoDecodeAccelerator::MemoryType type) { + if (!ppp_videodecoder_) + return; + + // TODO(vrk): Compiler assert or use switch statement instead of making + // a blind cast. + PP_PictureBufferType_Dev out_type = + static_cast<PP_PictureBufferType_Dev>(type); + PP_Size out_dim = PP_MakeSize(dimensions.width(), dimensions.height()); + ScopedResourceId resource(this); + ppp_videodecoder_->ProvidePictureBuffers( + resource.id, requested_num_of_buffers, out_dim, out_type); } void PPB_VideoDecoder_Impl::PictureReady( - media::VideoDecodeAccelerator::Picture* picture) { - // TODO(vmr): Implement. - NOTIMPLEMENTED(); + const media::Picture& picture) { + if (!ppp_videodecoder_) + return; - // Convert the picture. - // Get plugin's PPP interface function pointers. - // PPP_VideoDecoder* ppp_videodecoder; - // Call ProvidePictureBuffers function pointer and return. - // ppp_videodecoder->PictureReady(resource_decoder, picture, - // pic_buffer_used_again); + ScopedResourceId resource(this); + PP_Picture_Dev out_pic; + CopyToPictureDev(picture, &out_pic); + ppp_videodecoder_->PictureReady(resource.id, out_pic); } -void PPB_VideoDecoder_Impl::DismissPictureBuffer( - media::VideoDecodeAccelerator::PictureBuffer* picture_buffer) { - // TODO(vmr): Implement. - NOTIMPLEMENTED(); +void PPB_VideoDecoder_Impl::DismissPictureBuffer(int32 picture_buffer_id) { + if (!ppp_videodecoder_) + return; + + ScopedResourceId resource(this); + ppp_videodecoder_->DismissPictureBuffer(resource.id, picture_buffer_id); } void PPB_VideoDecoder_Impl::NotifyEndOfStream() { - // TODO(vmr): Implement. - NOTIMPLEMENTED(); + if (!ppp_videodecoder_) + return; - // Get decoder's resource handle. - // PP_Resource resource_decoder; - // Get plugin's PPP interface function pointers. - // PPP_VideoDecoder* ppp_videodecoder; - // Call EndOfStream function pointer and return. - // ppp_videodecoder->EndOfStream(resource_decoder); + ScopedResourceId resource(this); + ppp_videodecoder_->EndOfStream(resource.id); } void PPB_VideoDecoder_Impl::NotifyError( media::VideoDecodeAccelerator::Error error) { - // TODO(vmr): Implement. - NOTIMPLEMENTED(); + if (!ppp_videodecoder_) + return; - // Get decoder's resource handle. - // PP_Resource resource_decoder; - // Get plugin's PPP interface function pointers. - // PPP_VideoDecoder* ppp_videodecoder; - // Call NotifyError function pointer. - // ppp_videodecoder->NotifyError(error, error_data, data_size); + ScopedResourceId resource(this); + // TODO(vrk): This is assuming VideoDecodeAccelerator::Error and + // PP_VideoDecodeError_Dev have identical enum values. There is no compiler + // assert to guarantee this. We either need to add such asserts or + // merge these two enums. + ppp_videodecoder_->NotifyError(resource.id, + static_cast<PP_VideoDecodeError_Dev>(error)); } void PPB_VideoDecoder_Impl::OnAbortComplete() { @@ -326,3 +395,37 @@ void PPB_VideoDecoder_Impl::OnFlushComplete() { } // namespace ppapi } // namespace webkit + +// These functions are declared in picture.h but are defined here because of +// dependencies (we can't depend on ppapi types from media). +namespace media { +BufferInfo::BufferInfo(const PP_BufferInfo_Dev& info) + : id_(info.id) { + size_ = gfx::Size(info.size.width, info.size.height); +} + +// TODO(vrk): This assigns the PP_Resource context to be +// the context_id. Not sure what it's actually supposed to be. +GLESBuffer::GLESBuffer(const PP_GLESBuffer_Dev& buffer) + : texture_id_(buffer.texture_id), + context_id_(buffer.context), + info_(buffer.info) { +} + +SysmemBuffer::SysmemBuffer(const PP_SysmemBuffer_Dev& buffer) + : info_(buffer.info) { + scoped_refptr<webkit::ppapi::PPB_Buffer_Impl> pepper_buffer = + webkit::ppapi::Resource::GetAs<webkit::ppapi::PPB_Buffer_Impl>( + buffer.data); + assert(pepper_buffer->is_mapped()); + data_ = pepper_buffer->mapped_buffer(); +} + +Picture::Picture(const PP_Picture_Dev& picture) + : picture_buffer_id_(picture.picture_buffer_id), + user_handle_(picture.bitstream_user_handle), + visible_size_(picture.visible_size.width, picture.visible_size.height), + decoded_size_(picture.decoded_size.width, picture.decoded_size.height) { +} + +} // namespace media diff --git a/webkit/plugins/ppapi/ppb_video_decoder_impl.h b/webkit/plugins/ppapi/ppb_video_decoder_impl.h index 1040923..8442c92 100644 --- a/webkit/plugins/ppapi/ppb_video_decoder_impl.h +++ b/webkit/plugins/ppapi/ppb_video_decoder_impl.h @@ -11,14 +11,13 @@ #include "base/compiler_specific.h" #include "base/memory/scoped_callback_factory.h" #include "base/memory/scoped_ptr.h" +#include "ppapi/c/dev/pp_video_dev.h" #include "ppapi/c/pp_var.h" #include "webkit/plugins/ppapi/plugin_delegate.h" #include "webkit/plugins/ppapi/resource.h" -union PP_PictureData_Dev; -struct PP_VideoDecoderConfig_Dev; -struct PP_VideoBitstreamBuffer_Dev; struct PPB_VideoDecoder_Dev; +struct PPP_VideoDecoder_Dev; namespace webkit { namespace ppapi { @@ -39,27 +38,29 @@ class PPB_VideoDecoder_Impl : public Resource, virtual PPB_VideoDecoder_Impl* AsPPB_VideoDecoder_Impl(); // PPB_VideoDecoder implementation. - bool GetConfigs(PP_VideoDecoderConfig_Dev* proto_config, - PP_VideoDecoderConfig_Dev* matching_configs, - int32_t matching_configs_size, - int32_t* num_of_matching_configs); - bool Init(PP_VideoDecoderConfig_Dev* dec_config); + bool GetConfigs(PP_VideoConfigElement* requested_configs, + PP_VideoConfigElement* matching_configs, + uint32_t matching_configs_size, + uint32_t* num_of_matching_configs); + bool Init(PP_VideoConfigElement* dec_config); bool Decode(PP_VideoBitstreamBuffer_Dev* bitstream_buffer, PP_CompletionCallback callback); - void AssignPictureBuffer(uint32_t no_of_picture_buffers, - PP_PictureData_Dev* picture_buffers); - void ReusePictureBuffer(PP_PictureData_Dev* picture_buffer); + void AssignGLESBuffers(uint32_t no_of_buffers, + PP_GLESBuffer_Dev* buffers); + void AssignSysmemBuffers(uint32_t no_of_buffers, + PP_SysmemBuffer_Dev* buffers); + void ReusePictureBuffer(int32_t picture_buffer_id); bool Flush(PP_CompletionCallback callback); bool Abort(PP_CompletionCallback callback); // media::VideoDecodeAccelerator::Client implementation. virtual void ProvidePictureBuffers( - uint32_t requested_num_of_buffers, - const std::vector<uint32_t>& buffer_properties) OVERRIDE; - virtual void DismissPictureBuffer( - media::VideoDecodeAccelerator::PictureBuffer* picture_buffer) OVERRIDE; + uint32 requested_num_of_buffers, + gfx::Size dimensions, + media::VideoDecodeAccelerator::MemoryType type) OVERRIDE; + virtual void DismissPictureBuffer(int32 picture_buffer_id) OVERRIDE; virtual void PictureReady( - media::VideoDecodeAccelerator::Picture* picture) OVERRIDE; + const media::Picture& picture) OVERRIDE; virtual void NotifyEndOfStream() OVERRIDE; virtual void NotifyError( media::VideoDecodeAccelerator::Error error) OVERRIDE; @@ -80,6 +81,9 @@ class PPB_VideoDecoder_Impl : public Resource, PP_CompletionCallback flush_callback_; PP_CompletionCallback bitstream_buffer_callback_; + // Reference to the plugin requesting this interface. + const PPP_VideoDecoder_Dev* ppp_videodecoder_; + DISALLOW_COPY_AND_ASSIGN(PPB_VideoDecoder_Impl); }; |