| Index: content/common/gpu/media/vaapi_video_decode_accelerator.h
|
| diff --git a/content/common/gpu/media/vaapi_video_decode_accelerator.h b/content/common/gpu/media/vaapi_video_decode_accelerator.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..86b5c7fb4a859f0734fd5acc9ca0b62202545efa
|
| --- /dev/null
|
| +++ b/content/common/gpu/media/vaapi_video_decode_accelerator.h
|
| @@ -0,0 +1,155 @@
|
| +// Copyright (c) 2012 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.
|
| +//
|
| +// This file contains an implementation of VideoDecoderAccelerator
|
| +// that utilizes hardware video decoder present on Intel CPUs.
|
| +
|
| +#ifndef CONTENT_COMMON_GPU_MEDIA_VAAPI_VIDEO_DECODE_ACCELERATOR_H_
|
| +#define CONTENT_COMMON_GPU_MEDIA_VAAPI_VIDEO_DECODE_ACCELERATOR_H_
|
| +
|
| +#include "vaapi_h264_decoder.h"
|
| +
|
| +#include <map>
|
| +#include <queue>
|
| +#include <utility>
|
| +#include <vector>
|
| +
|
| +#include <GL/glx.h>
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/message_loop.h"
|
| +#include "base/shared_memory.h"
|
| +#include "base/synchronization/waitable_event.h"
|
| +#include "base/threading/non_thread_safe.h"
|
| +#include "base/threading/thread.h"
|
| +#include "media/base/bitstream_buffer.h"
|
| +#include "media/video/picture.h"
|
| +#include "media/video/video_decode_accelerator.h"
|
| +
|
| +// Class to provide video decode acceleration for Intel systems with hardware
|
| +// support for it, and on which libva is available.
|
| +// Decoding tasks are performed in a separate decoding thread.
|
| +class VaapiVideoDecodeAccelerator
|
| + : public media::VideoDecodeAccelerator,
|
| + NON_EXPORTED_BASE(public base::NonThreadSafe) {
|
| + public:
|
| +
|
| + VaapiVideoDecodeAccelerator(media::VideoDecodeAccelerator::Client* client);
|
| +
|
| + // media::VideoDecodeAccelerator implementation.
|
| + bool Initialize(Profile profile) OVERRIDE;
|
| + void Decode(const media::BitstreamBuffer& bitstream_buffer) OVERRIDE;
|
| + virtual void AssignPictureBuffers(
|
| + const std::vector<media::PictureBuffer>& buffers) OVERRIDE;
|
| + void ReusePictureBuffer(int32 picture_buffer_id) OVERRIDE;
|
| + void Flush() OVERRIDE;
|
| + void Reset() OVERRIDE;
|
| + void Destroy() OVERRIDE;
|
| +
|
| + // Used by user of this class to pass X/GLX state.
|
| + void SetGlxState(Display* x_display, GLXContext glx_context);
|
| +
|
| + private:
|
| + virtual ~VaapiVideoDecodeAccelerator();
|
| +
|
| + // Notify the client that initialization is finished (successful or not).
|
| + void NotifyInitializeDone();
|
| +
|
| + // Notify the client that the input buffer has been consumed.
|
| + void NotifyInputBufferRead(int input_buffer_id);
|
| +
|
| + // Ensure data has been synced with the output texture and notify
|
| + // the client it is ready for displaying.
|
| + void SyncAndNotifyPictureReady(int32 input_id, int32 output_id);
|
| +
|
| + // Notify the client that Reset or Flush have finished.
|
| + void NotifyResetDone();
|
| + void NotifyFlushDone();
|
| +
|
| + // Ask the client to provide |num_pics| textures of size |width| per |height|
|
| + void RequestPictureBuffers(int num_pics, int width, int height);
|
| +
|
| + // Notify the client that an error has occured and decoding cannot continue.
|
| + void StopOnError(media::VideoDecodeAccelerator::Error error);
|
| +
|
| + // Map the received input buffer into this process' address space and
|
| + // queue it for use.
|
| + void MapAndQueueNewInputBuffer(
|
| + const media::BitstreamBuffer& bitstream_buffer);
|
| +
|
| + // Request and sets up a new input stream buffer for decoder if available.
|
| + // Will release and give back the current input buffer, if present.
|
| + void TryGetNewInputBuffer();
|
| +
|
| + // Decoding task, executed in decoder's thread context.
|
| + void DecodeTask();
|
| +
|
| + // Give back an output buffer to the decoder after displaying it.
|
| + // Must be executed on the decoder thread.
|
| + void ReusePictureTask(int32 picture_buffer_id);
|
| +
|
| + // Force the decoder to flush all output pictures.
|
| + // Must be run on the decoder thread.
|
| + void FlushTask();
|
| +
|
| + // Put the decoder into reset state.
|
| + // Must be run on the decoder thread.
|
| + void ResetTask();
|
| +
|
| + // Used by the decoder thread to request more input stream.
|
| + // Must be run on the decoder thread and will sleep until new input
|
| + // becomes available.
|
| + void WaitForInput();
|
| +
|
| + // Client-provided X/GLX state.
|
| + Display* x_display_;
|
| + GLXContext glx_context_;
|
| +
|
| + // An input buffer awaiting consumption, provided by the client.
|
| + struct InputBuffer {
|
| + int32 id;
|
| + size_t size;
|
| + scoped_ptr<base::SharedMemory> shm;
|
| + };
|
| +
|
| + // Queue for incoming input buffers.
|
| + typedef std::queue<InputBuffer*> InputBuffers;
|
| + InputBuffers input_buffers_;
|
| + // Current input buffer set in decoder.
|
| + scoped_ptr<InputBuffer> curr_input_buffer_;
|
| +
|
| + // Signalled if a valid stream is set up in decoder. Used to synchronize
|
| + // between decoder and main thread to safely update current stream in decoder
|
| + // from the |input_buffers_| queue.
|
| + base::WaitableEvent input_ready_;
|
| +
|
| + // Main thread's message loop
|
| + MessageLoop* message_loop_;
|
| +
|
| + // To expose client callbacks from VideoDecodeAccelerator.
|
| + // NOTE: all calls to this object *MUST* be executed in message_loop_.
|
| + Client* client_;
|
| +
|
| + // True if output pictures have been requested from the client.
|
| + bool pictures_requested_;
|
| +
|
| + // True if we are after reset and need to resume.
|
| + bool after_reset_;
|
| +
|
| + // True if we are resetting.
|
| + bool resetting_;
|
| +
|
| + base::Thread decoder_thread_;
|
| + VaapiH264Decoder decoder_;
|
| +
|
| + // Callback passed to the decoder, which it will use to signal readiness
|
| + // of an output picture to be displayed.
|
| + static void OutputPicCallback(void* priv, int32 input_id, int32 output_id);
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(VaapiVideoDecodeAccelerator);
|
| +};
|
| +
|
| +#endif // CONTENT_COMMON_GPU_MEDIA_VAAPI_VIDEO_DECODE_ACCELERATOR_H_
|
| +
|
|
|