Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(571)

Unified Diff: ppapi/examples/video_decoder/video_decoder_session.h

Issue 6961018: Pepper Video Decoder API tester plugin. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase & compilation fixes related to it. Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | ppapi/examples/video_decoder/video_decoder_session.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ppapi/examples/video_decoder/video_decoder_session.h
diff --git a/ppapi/examples/video_decoder/video_decoder_session.h b/ppapi/examples/video_decoder/video_decoder_session.h
new file mode 100644
index 0000000000000000000000000000000000000000..d4aef32ac63c6e0a99c25e9275d7d328fa4635f3
--- /dev/null
+++ b/ppapi/examples/video_decoder/video_decoder_session.h
@@ -0,0 +1,287 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// VideoDecoderSession implements decoding session on top of Pepper Video
+// Decoder API. It relies on VideoBitstreamInterface for getting the decodable
+// video bitstream units and DisplayInterface for providing picture buffers and
+// drawing them onto screen. Subsystem hidden by VideoDecoderSession can be
+// reused by applications as long as they provide valid implementations of
+// VideoBitstreamInterface and DisplayInterface to the VideoDecoderSession
+// class. Once session is complete it will inform the client about completion
+// through VideoDecoderSessionClient interface.
+//
+// O VideoDecoderSessionClient
+// ^
+// |
+// +---------------------+
+// +------ | VideoDecoderSession |----------------+
+// | +---------------------+ |
+// | | | |
+// | | O pp::VideoDecoder::Client
+// | | ^ |
+// | V | |
+// | +--------------------+ |
+// | | pp::VideoDecoder | |
+// | +--------------------+ |
+// V V
+// O VideoBitstreamInterface DisplayInterface O
+// | |
+// +---------------------------+ +--------------+
+// | LocalVideoBitstreamSource | | GLES2Display |
+// +---------------------------+ +--------------+
+
+#ifndef PPAPI_EXAMPLES_VIDEO_DECODER_VIDEO_DECODER_SESSION_H_
+#define PPAPI_EXAMPLES_VIDEO_DECODER_VIDEO_DECODER_SESSION_H_
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include "ppapi/c/pp_stdint.h"
+#include "ppapi/cpp/completion_callback.h"
+#include "ppapi/cpp/dev/graphics_3d_client_dev.h"
+#include "ppapi/cpp/dev/video_decoder_dev.h"
+#include "ppapi/tests/test_case.h"
+#include "ppapi/tests/testing_instance.h"
+
+class DisplayInterface;
+class TestVideoSource;
+class VideoDecoderSession;
+
+namespace pp {
+ class Context3D_Dev;
+ class Surface3D_Dev;
+} // namespace pp.
+
+// Interface for acquiring video bitstream units from a source.
+class VideoBitstreamInterface {
+ public:
+ virtual ~VideoBitstreamInterface();
+
+ // Writes decodable bitstream unit to |target_mem| which has size of
+ // |target_mem_size_in_bytes|. The actual size of the unit will be stored in
+ // |unit_size_in_bytes|. Returns true on success, otherwise false.
+ virtual bool GetBitstreamUnit(void* target_mem,
+ uint32_t target_mem_size_in_bytes,
+ int32_t* unit_size_in_bytes) = 0;
+};
+
+// Interface for display drawing and buffer management.
+class DisplayInterface {
+ public:
+ virtual ~DisplayInterface();
+
+ // Provides one GLES2-backed picture buffer pointer into |picture_buffer| that
+ // is sized as |dimensions|. Returns true if successful, otherwise false.
+ virtual bool ProvideGLESPictureBuffers(
+ uint32_t req_num_of_bufs,
+ PP_Size dimensions,
+ std::vector<PP_GLESBuffer_Dev>& gles_buffers) = 0;
+ // Dismisses the picture buffer whose id is |picture_buffer_id|.
+ virtual bool DismissPictureBuffer(int32_t picture_buffer_id) = 0;
+ // Draws the picture described in |picture| and once drawing is complete calls
+ // the |completion_callback|. Return true, if drawing successfully accepted.
+ // Otherwise returns false and |completion_callback| will NOT be called and
+ // needs to be freed by the user.
+ virtual bool DrawPicture(const PP_Picture_Dev& picture,
+ pp::CompletionCallback completion_callback) = 0;
+};
+
+// Video bitstream source for local files.
+class LocalVideoBitstreamSource : public VideoBitstreamInterface {
+ public:
+ // Constructs the object to read the data with the |filename|.
+ explicit LocalVideoBitstreamSource(std::string filename);
+ virtual ~LocalVideoBitstreamSource();
+
+ // VideoBitstreamInterface implementation.
+ virtual bool GetBitstreamUnit(void* target_mem,
+ uint32_t target_mem_size_in_bytes,
+ int32_t* unit_size_in_bytes);
+
+ private:
+ std::string file_;
+ TestVideoSource* video_source_;
+ bool video_source_open_;
+};
+
+// Interface for video session to inform abouot the completion of session.
+class VideoDecoderSessionClient {
+ public:
+ virtual ~VideoDecoderSessionClient();
+ // Called by the VideoDecoderSession to tell the session is over. |result|
+ // tells if something has gone wrong.
+ virtual void OnSessionCompleted(int32_t result) = 0;
+};
+
+
+// Video decoder client class that implements less domain-specific abstraction
+// on top of basic Pepper Video Decoder API.
+//
+// State machine:
+// States
+// +---------------+-------------+---------------+---------------+
+// Trigger | Created | Initialized | Running | Flushing |
+// -------------|---------------|-------------|---------------|---------------+
+// Initialize() |-> Initialized | N/A | N/A | N/A |
+// -------------|---------------|-------------|---------------|---------------+
+// Run() | N/A | -> Running | N/A | N/A |
+// -------------|---------------|-------------|---------------|---------------+
+// Stop() | N/A | N/A |-> Initialized | N/A |
+// -------------|---------------|-------------|---------------|---------------+
+// Flush() | N/A | N/A |-> Flushing | N/A |
+// -------------|---------------|-------------|---------------|---------------+
+// Teardown() | N/A | -> Created | N/A | N/A |
+// -------------|---------------|-------------|---------------|---------------+
+// NotifyEOS() | N/A | N/A |-> Initialized | N/A |
+// -------------|---------------|-------------|---------------|---------------+
+// NotifyError()| N/A | N/A |-> Initialized | N/A |
+// -------------+---------------+-------------+---------------+---------------+
+// OnFlushDone()| N/A | N/A | N/A |-> Running |
+// -------------+---------------+-------------+---------------+---------------+
+//
+// In Initialized, Running and Flushing states session has resources allocated.
+//
+// In Running state session keeps asking VideoBitstreamSource for more data and
+// will decode the data using the video decoder.
+//
+// In Flushing state the session will keep pushing output pictures out.
+class VideoDecoderSession : public pp::VideoDecoder::Client {
+ public:
+ // Enumeration for client states.
+ enum State {
+ kCreated,
+ kInitialized,
+ kRunning,
+ kFlushing
+ };
+
+ // Constructor expects the user of this class to provide concrete
+ // implementation of VideoBitstreamInterface and DisplayInterface.
+ VideoDecoderSession(pp::Instance* instance,
+ VideoDecoderSessionClient* client,
+ VideoBitstreamInterface* video_bitstream_if,
+ DisplayInterface* display_if);
+ ~VideoDecoderSession();
+
+ // Functions to control the execution. |completion_callback| is called when
+ // state transition is complete.
+ bool Initialize(const PP_VideoConfigElement* decoder_config,
+ pp::CompletionCallback completion_callback);
+ bool Run(pp::CompletionCallback completion_callback);
+ bool Stop(pp::CompletionCallback completion_callback);
+ bool Flush(pp::CompletionCallback completion_callback);
+ bool Teardown(pp::CompletionCallback completion_callback);
+
+ virtual void ProvidePictureBuffers(
+ uint32_t req_num_of_bufs,
+ PP_Size dimensions,
+ enum PP_PictureBufferType_Dev type);
+ virtual void DismissPictureBuffer(int32_t picture_buffer_id);
+ virtual void PictureReady(const PP_Picture_Dev& picture);
+ virtual void EndOfStream();
+ virtual void NotifyError(PP_VideoDecodeError_Dev error);
+
+ private:
+ // Callback implementations for decoder events.
+ void OnInitializeDone(int32_t result, pp::CompletionCallback callback);
+ void OnBitstreamBufferProcessed(int32_t result, int32_t bitstream_buffer_id);
+ void OnUserFlushDone(int32_t result, State target_state,
+ pp::CompletionCallback callback);
+ void OnInternalFlushDone(int32_t result);
+ void OnAbortDone(int32_t result);
+ // Callback from display subsystem.
+ void OnDrawPictureDone(int32_t result, int32_t picture_buffer_id);
+ // Input buffer allocation and freeing.
+ bool AllocateInputBuffers();
+ void FreeInputBuffers();
+ // Read an bitstream unit to bitstream buffer with |bitstream_buffer_id|.
+ // After successful read, dispatch the unit to video decoder.
+ bool ReadAndDispatchBitstreamUnit(int32_t bitstream_buffer_id);
+ // Change the state of the session.
+ void ChangeState(State to_state);
+ // Generate unique id.
+ int32_t GetUniqueId();
+ // Pepper buffer interface.
+ const struct PPB_Buffer_Dev* buffer_if_;
+ // Callback factory for generating completion callbacks.
+ pp::CompletionCallbackFactory<VideoDecoderSession> cb_factory_;
+ // Pointer to the Instance interface of this plugin module.
+ pp::Instance* instance_;
+ // Pointer to the client of this session.
+ VideoDecoderSessionClient* client_;
+ // Pepper video decoder instance.
+ pp::VideoDecoder* video_decoder_;
+ // Source for video bitstream.
+ VideoBitstreamInterface* video_source_;
+ // Pointer to the display.
+ DisplayInterface* display_;
+ // Map to hold |id| => |bitstream buffer| pairs.
+ std::map<int32_t, PP_VideoBitstreamBuffer_Dev> bitstream_buffers_;
+ // Indicator whether end of stream has been encountered.
+ bool end_of_stream_;
+ // Configuration used to initialize the decoder.
+ const std::vector<uint32_t> decoder_config_;
+ // Variable to hold the state of the client.
+ State state_;
+ // Variable to hold the next unique id.
+ int32_t next_id_;
+};
+
+// Class to render decoded video pictures using OpenGL ES 2.0.
+class GLES2Display : public pp::Graphics3DClient_Dev,
+ public DisplayInterface {
+ public:
+ // |instance| and |video_decoder| are NOT owned by this object and they must
+ // outlive this class.
+ GLES2Display(pp::Instance* instance, PP_Size size);
+ virtual ~GLES2Display();
+
+ // Initializes the GLES display.
+ bool Initialize();
+
+ // Graphics3DClient_Dev implementation.
+ virtual void Graphics3DContextLost();
+
+ // DisplayInterface implementation.
+ virtual bool ProvideGLESPictureBuffers(
+ uint32_t req_num_of_bufs,
+ PP_Size dimensions,
+ std::vector<PP_GLESBuffer_Dev>& gles_buffers);
+ virtual bool DismissPictureBuffer(int32_t picture_buffer_id);
+ virtual bool DrawPicture(const PP_Picture_Dev& picture,
+ pp::CompletionCallback completion_callback);
+
+ private:
+ void AssertNoGLError();
+ bool InitGL(int width, int height);
+ void CreateShader(GLuint program, GLenum type, const char* source, int size);
+ void LinkProgram(const PPB_OpenGLES2_Dev* gles2_if);
+ void ProgramShaders();
+ // Generate unique id.
+ int32_t GetUniqueId();
+
+ // Pointer to the Instance interface of this plugin module.
+ pp::Instance* instance_;
+ // Pepper GLES2 interface.
+ const struct PPB_OpenGLES2_Dev* gles2_if_;
+ // Pepper 3D context in which we are rendering.
+ pp::Context3D_Dev* context_;
+ // Pepper 3D surface that represents the frame buffer for our plugin.
+ pp::Surface3D_Dev* surface_;
+ // Size of the output surface we are using.
+ PP_Size surface_size_;
+ // Map for GLES buffers.
+ std::map<int32_t, PP_GLESBuffer_Dev> gles_buffers_;
+ // GLES name for vertex buffer.
+ GLuint vertex_buffer_;
+ // GLES name for fragment buffer used.
+ GLuint fragment_buffer_;
+ // GLES name for our shader programs.
+ GLuint program_;
+ // Next id.
+ int32_t next_id_;
+};
+
+#endif // PPAPI_EXAMPLES_VIDEO_DECODER_VIDEO_DECODER_SESSION_H_
« no previous file with comments | « no previous file | ppapi/examples/video_decoder/video_decoder_session.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698