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

Unified Diff: trunk/src/content/common/gpu/media/vaapi_video_encode_accelerator.h

Issue 350413002: Revert 279650 "Add VaapiVideoEncodeAccelerator for HW-accelerate..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 6 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
Index: trunk/src/content/common/gpu/media/vaapi_video_encode_accelerator.h
===================================================================
--- trunk/src/content/common/gpu/media/vaapi_video_encode_accelerator.h (revision 279732)
+++ trunk/src/content/common/gpu/media/vaapi_video_encode_accelerator.h (working copy)
@@ -1,264 +0,0 @@
-// Copyright 2014 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.
-
-#ifndef CONTENT_COMMON_GPU_MEDIA_VAAPI_VIDEO_ENCODE_ACCELERATOR_H_
-#define CONTENT_COMMON_GPU_MEDIA_VAAPI_VIDEO_ENCODE_ACCELERATOR_H_
-
-#include <list>
-#include <queue>
-
-#include "base/memory/linked_ptr.h"
-#include "base/threading/thread.h"
-#include "content/common/content_export.h"
-#include "content/common/gpu/media/h264_dpb.h"
-#include "content/common/gpu/media/va_surface.h"
-#include "content/common/gpu/media/vaapi_wrapper.h"
-#include "media/filters/h264_bitstream_buffer.h"
-#include "media/video/video_encode_accelerator.h"
-
-namespace content {
-
-// A VideoEncodeAccelerator implementation that uses VA-API
-// (http://www.freedesktop.org/wiki/Software/vaapi) for HW-accelerated
-// video encode.
-class CONTENT_EXPORT VaapiVideoEncodeAccelerator
- : public media::VideoEncodeAccelerator {
- public:
- explicit VaapiVideoEncodeAccelerator(Display* x_display);
- virtual ~VaapiVideoEncodeAccelerator();
-
- // media::VideoEncodeAccelerator implementation.
- virtual bool Initialize(media::VideoFrame::Format format,
- const gfx::Size& input_visible_size,
- media::VideoCodecProfile output_profile,
- uint32 initial_bitrate,
- Client* client) OVERRIDE;
- virtual void Encode(const scoped_refptr<media::VideoFrame>& frame,
- bool force_keyframe) OVERRIDE;
- virtual void UseOutputBitstreamBuffer(
- const media::BitstreamBuffer& buffer) OVERRIDE;
- virtual void RequestEncodingParametersChange(uint32 bitrate,
- uint32 framerate) OVERRIDE;
- virtual void Destroy() OVERRIDE;
-
- static std::vector<media::VideoEncodeAccelerator::SupportedProfile>
- GetSupportedProfiles();
-
- private:
- // Reference picture list.
- typedef std::list<scoped_refptr<VASurface> > RefPicList;
-
- // Encode job for one frame. Created when an input frame is awaiting and
- // enough resources are available to proceed. Once the job is prepared and
- // submitted to the hardware, it awaits on the submitted_encode_jobs_ queue
- // for an output bitstream buffer to become available. Once one is ready,
- // the encoded bytes are downloaded to it and job resources are released
- // and become available for reuse.
- struct EncodeJob {
- // Input surface for video frame data.
- scoped_refptr<VASurface> input_surface;
- // Surface for a reconstructed picture, which is used for reference
- // for subsequent frames.
- scoped_refptr<VASurface> recon_surface;
- // Buffer that will contain output bitstream for this frame.
- VABufferID coded_buffer;
- // Reference surfaces required to encode this picture. We keep references
- // to them here, because we may discard some of them from ref_pic_list*
- // before the HW job is done.
- RefPicList reference_surfaces;
- // True if this job will produce a keyframe. Used to report
- // to BitstreamBufferReady().
- bool keyframe;
-
- EncodeJob();
- ~EncodeJob();
- };
-
- // Encoder state.
- enum State {
- kUninitialized,
- kEncoding,
- kError,
- };
-
- // Holds input frames coming from the client ready to be encoded.
- struct InputFrameRef;
- // Holds output buffers coming from the client ready to be filled.
- struct BitstreamBufferRef;
-
- // Tasks for each of the VEA interface calls to be executed on the
- // encoder thread.
- void InitializeTask();
- void EncodeTask(const scoped_refptr<media::VideoFrame>& frame,
- bool force_keyframe);
- void UseOutputBitstreamBufferTask(scoped_ptr<BitstreamBufferRef> buffer_ref);
- void RequestEncodingParametersChangeTask(uint32 bitrate, uint32 framerate);
- void DestroyTask();
-
- // Prepare and schedule an encode job if we have an input to encode
- // and enough resources to proceed.
- void EncodeFrameTask();
-
- // Fill current_sps_/current_pps_ with current values.
- void UpdateSPS();
- void UpdatePPS();
- void UpdateRates(uint32 bitrate, uint32 framerate);
-
- // Generate packed SPS and PPS in packed_sps_/packed_pps_, using
- // values in current_sps_/current_pps_.
- void GeneratePackedSPS();
- void GeneratePackedPPS();
-
- // Check if we have sufficient resources for a new encode job, claim them and
- // fill current_encode_job_ with them.
- // Return false if we cannot start a new job yet, true otherwise.
- bool PrepareNextJob();
-
- // Begin a new frame, making it a keyframe if |force_keyframe| is true,
- // updating current_pic_.
- void BeginFrame(bool force_keyframe);
-
- // End current frame, updating reference picture lists and storing current
- // job in the jobs awaiting completion on submitted_encode_jobs_.
- void EndFrame();
-
- // Submit parameters for the current frame to the hardware.
- bool SubmitFrameParameters();
- // Submit keyframe headers to the hardware if the current frame is a keyframe.
- bool SubmitHeadersIfNeeded();
-
- // Upload image data from |frame| to the input surface for current job.
- bool UploadFrame(const scoped_refptr<media::VideoFrame>& frame);
-
- // Execute encode in hardware. This does not block and will return before
- // the job is finished.
- bool ExecuteEncode();
-
- // Callback that returns a no longer used VASurfaceID to
- // available_va_surface_ids_ for reuse.
- void RecycleVASurfaceID(VASurfaceID va_surface_id);
-
- // Tries to return a bitstream buffer if both a submitted job awaits to
- // be completed and we have bitstream buffers from the client available
- // to download the encoded data to.
- void TryToReturnBitstreamBuffer();
-
- // Puts the encoder into en error state and notifies client about the error.
- void NotifyError(Error error);
-
- // Sets the encoder state on the correct thread.
- void SetState(State state);
-
- // VaapiWrapper is the owner of all HW resources (surfaces and buffers)
- // and will free them on destruction.
- scoped_ptr<VaapiWrapper> vaapi_wrapper_;
-
- // Input profile and sizes.
- media::VideoCodecProfile profile_;
- gfx::Size visible_size_;
- gfx::Size coded_size_; // Macroblock-aligned.
- // Width/height in macroblocks.
- unsigned int mb_width_;
- unsigned int mb_height_;
-
- // Maximum size of the reference list 0.
- unsigned int max_ref_idx_l0_size_;
-
- // Initial QP.
- unsigned int qp_;
-
- // IDR frame period.
- unsigned int idr_period_;
- // I frame period.
- unsigned int i_period_;
- // IP period, i.e. how often do we need to have either an I or a P frame in
- // the stream. Period of 1 means we can have no B frames.
- unsigned int ip_period_;
-
- // Size in bytes required for input bitstream buffers.
- size_t output_buffer_byte_size_;
-
- Display* x_display_;
-
- // All of the members below must be accessed on the encoder_thread_,
- // while it is running.
-
- // Encoder state. Encode tasks will only run in kEncoding state.
- State state_;
-
- // frame_num to be used for the next frame.
- unsigned int frame_num_;
- // frame_num of the previous IDR.
- unsigned int last_idr_frame_num_;
-
- // Current bitrate in bps.
- unsigned int bitrate_;
- // Current fps.
- unsigned int framerate_;
- // CPB size in bits, i.e. bitrate in kbps * window size in ms/1000.
- unsigned int cpb_size_;
- // True if the parameters have changed and we need to submit a keyframe
- // with updated parameters.
- bool encoding_parameters_changed_;
-
- // Job currently being prepared for encode.
- scoped_ptr<EncodeJob> current_encode_job_;
-
- // Current SPS, PPS and their packed versions. Packed versions are their NALUs
- // in AnnexB format *without* emulation prevention three-byte sequences
- // (those will be added by the driver).
- media::H264SPS current_sps_;
- media::H264BitstreamBuffer packed_sps_;
- media::H264PPS current_pps_;
- media::H264BitstreamBuffer packed_pps_;
-
- // Picture currently being prepared for encode.
- H264Picture current_pic_;
-
- // VA surfaces available for reuse.
- std::vector<VASurfaceID> available_va_surface_ids_;
-
- // VA buffers for coded frames.
- std::vector<VABufferID> available_va_buffer_ids_;
-
- // Currently active reference surfaces.
- RefPicList ref_pic_list0_;
-
- // Callback via which finished VA surfaces are returned to us.
- VASurface::ReleaseCB va_surface_release_cb_;
-
- // VideoFrames passed from the client, waiting to be encoded.
- std::queue<linked_ptr<InputFrameRef> > encoder_input_queue_;
-
- // BitstreamBuffers mapped, ready to be filled.
- std::queue<linked_ptr<BitstreamBufferRef> > available_bitstream_buffers_;
-
- // Jobs submitted for encode, awaiting bitstream buffers to become available.
- std::queue<linked_ptr<EncodeJob> > submitted_encode_jobs_;
-
- // Encoder thread. All tasks are executed on it.
- base::Thread encoder_thread_;
- scoped_refptr<base::MessageLoopProxy> encoder_thread_proxy_;
-
- const scoped_refptr<base::MessageLoopProxy> child_message_loop_proxy_;
-
- // To expose client callbacks from VideoEncodeAccelerator.
- // NOTE: all calls to these objects *MUST* be executed on
- // child_message_loop_proxy_.
- scoped_ptr<base::WeakPtrFactory<Client> > client_ptr_factory_;
- base::WeakPtr<Client> client_;
-
- // WeakPtr to post from the encoder thread back to the ChildThread, as it may
- // outlive this. Posting from the ChildThread using base::Unretained(this)
- // to the encoder thread is safe, because |this| always outlives the encoder
- // thread (it's a member of this class).
- base::WeakPtr<VaapiVideoEncodeAccelerator> weak_this_;
- base::WeakPtrFactory<VaapiVideoEncodeAccelerator> weak_this_ptr_factory_;
-
- DISALLOW_COPY_AND_ASSIGN(VaapiVideoEncodeAccelerator);
-};
-
-} // namespace content
-
-#endif // CONTENT_COMMON_GPU_MEDIA_VAAPI_VIDEO_ENCODE_ACCELERATOR_H_

Powered by Google App Engine
This is Rietveld 408576698