| Index: content/common/gpu/media/vaapi_h264_decoder.h
|
| diff --git a/content/common/gpu/media/vaapi_h264_decoder.h b/content/common/gpu/media/vaapi_h264_decoder.h
|
| deleted file mode 100644
|
| index c6e51949e742557c272bd9b7e8948caf9b29b84b..0000000000000000000000000000000000000000
|
| --- a/content/common/gpu/media/vaapi_h264_decoder.h
|
| +++ /dev/null
|
| @@ -1,295 +0,0 @@
|
| -// 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 a class that provides H264 decode
|
| -// support for use with VAAPI hardware video decode acceleration on Intel
|
| -// systems.
|
| -
|
| -#ifndef CONTENT_COMMON_GPU_MEDIA_VAAPI_H264_DECODER_H_
|
| -#define CONTENT_COMMON_GPU_MEDIA_VAAPI_H264_DECODER_H_
|
| -
|
| -#include <vector>
|
| -
|
| -#include "base/callback_forward.h"
|
| -#include "base/memory/linked_ptr.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "content/common/gpu/media/vaapi_h264_dpb.h"
|
| -#include "content/common/gpu/media/vaapi_wrapper.h"
|
| -#include "media/base/limits.h"
|
| -#include "media/filters/h264_parser.h"
|
| -
|
| -namespace content {
|
| -
|
| -// An H264 decoder that utilizes VA-API. Provides features not supported by
|
| -// the VA-API userspace library (libva), including stream parsing, reference
|
| -// picture management and other operations not supported by the HW codec.
|
| -//
|
| -// Provides functionality to allow plugging VAAPI HW acceleration into the
|
| -// VDA framework.
|
| -//
|
| -// Clients of this class are expected to pass H264 Annex-B byte stream and
|
| -// will receive decoded surfaces via client-provided |OutputPicCB|.
|
| -//
|
| -// This class must be created, called and destroyed on a single thread, and
|
| -// does nothing internally on any other thread.
|
| -class CONTENT_EXPORT VaapiH264Decoder {
|
| - public:
|
| - // Callback invoked on the client when a surface is to be displayed.
|
| - // Arguments: input buffer id provided at the time of Decode()
|
| - // and VASurface to output.
|
| - typedef base::Callback<
|
| - void(int32, const scoped_refptr<VASurface>&)> OutputPicCB;
|
| -
|
| - enum VAVDAH264DecoderFailure {
|
| - FRAME_MBS_ONLY_FLAG_NOT_ONE = 0,
|
| - GAPS_IN_FRAME_NUM = 1,
|
| - MID_STREAM_RESOLUTION_CHANGE = 2,
|
| - INTERLACED_STREAM = 3,
|
| - VAAPI_ERROR = 4,
|
| - VAVDA_H264_DECODER_FAILURES_MAX,
|
| - };
|
| -
|
| - // Callback to report errors for UMA purposes, not used to return errors
|
| - // to clients.
|
| - typedef base::Callback<void(VAVDAH264DecoderFailure error)>
|
| - ReportErrorToUmaCB;
|
| -
|
| - // Decode result codes.
|
| - enum DecResult {
|
| - kDecodeError, // Error while decoding.
|
| - // TODO posciak: unsupported streams are currently treated as error
|
| - // in decoding; in future it could perhaps be possible to fall back
|
| - // to software decoding instead.
|
| - // kStreamError, // Error in stream.
|
| - kAllocateNewSurfaces, // Need a new set of surfaces to be allocated.
|
| - kRanOutOfStreamData, // Need more stream data to proceed.
|
| - kRanOutOfSurfaces, // Waiting for the client to free up output surfaces.
|
| - };
|
| -
|
| - // |vaapi_wrapper| should be initialized.
|
| - // |output_pic_cb| notifies the client a surface is to be displayed.
|
| - // |report_error_to_uma_cb| called on errors for UMA purposes, not used
|
| - // to report errors to clients.
|
| - VaapiH264Decoder(VaapiWrapper* vaapi_wrapper,
|
| - const OutputPicCB& output_pic_cb,
|
| - const ReportErrorToUmaCB& report_error_to_uma_cb);
|
| -
|
| - ~VaapiH264Decoder();
|
| -
|
| - // Have the decoder flush its state and trigger output of all previously
|
| - // decoded surfaces via OutputPicCB. Return false on failure.
|
| - bool Flush() WARN_UNUSED_RESULT;
|
| -
|
| - // To be called during decoding.
|
| - // Stop (pause) decoding, discarding all remaining inputs and outputs,
|
| - // but do not flush decoder state, so that the playback can be resumed later,
|
| - // possibly from a different location.
|
| - void Reset();
|
| -
|
| - // Set current stream data pointer to |ptr| and |size|. Output surfaces
|
| - // that are decoded from data in this stream chunk are to be returned along
|
| - // with the given |input_id|.
|
| - void SetStream(const uint8* ptr, size_t size, int32 input_id);
|
| -
|
| - // Try to decode more of the stream, returning decoded frames asynchronously
|
| - // via output_pic_cb_. Return when more stream is needed, when we run out
|
| - // of free surfaces, when we need a new set of them, or when an error occurs.
|
| - DecResult Decode() WARN_UNUSED_RESULT;
|
| -
|
| - // Return dimensions/required number of output surfaces that client should
|
| - // be ready to provide for the decoder to function properly.
|
| - // To be used after Decode() returns kNeedNewSurfaces.
|
| - gfx::Size GetPicSize() { return pic_size_; }
|
| - size_t GetRequiredNumOfPictures();
|
| -
|
| - // To be used by the client to feed decoder with output surfaces.
|
| - void ReuseSurface(const scoped_refptr<VASurface>& va_surface);
|
| -
|
| - private:
|
| - // We need to keep at most kDPBMaxSize pictures in DPB for
|
| - // reference/to display later and an additional one for the one currently
|
| - // being decoded. We also ask for some additional ones since VDA needs
|
| - // to accumulate a few ready-to-output pictures before it actually starts
|
| - // displaying and giving them back. +2 instead of +1 because of subjective
|
| - // smoothness improvement during testing.
|
| - enum {
|
| - kPicsInPipeline = media::limits::kMaxVideoFrames + 2,
|
| - kMaxNumReqPictures = VaapiH264DPB::kDPBMaxSize + kPicsInPipeline,
|
| - };
|
| -
|
| - // Internal state of the decoder.
|
| - enum State {
|
| - kNeedStreamMetadata, // After initialization, need an SPS.
|
| - kDecoding, // Ready to decode from any point.
|
| - kAfterReset, // After Reset(), need a resume point.
|
| - kError, // Error in decode, can't continue.
|
| - };
|
| -
|
| - // Process H264 stream structures.
|
| - bool ProcessSPS(int sps_id, bool* need_new_buffers);
|
| - bool ProcessPPS(int pps_id);
|
| - bool ProcessSlice(media::H264SliceHeader* slice_hdr);
|
| -
|
| - // Initialize the current picture according to data in |slice_hdr|.
|
| - bool InitCurrPicture(media::H264SliceHeader* slice_hdr);
|
| -
|
| - // Calculate picture order counts for the new picture
|
| - // on initialization of a new frame (see spec).
|
| - bool CalculatePicOrderCounts(media::H264SliceHeader* slice_hdr);
|
| -
|
| - // Update PicNum values in pictures stored in DPB on creation of new
|
| - // frame (see spec).
|
| - void UpdatePicNums();
|
| -
|
| - bool UpdateMaxNumReorderFrames(const media::H264SPS* sps);
|
| -
|
| - // Prepare reference picture lists (ref_pic_list[01]_).
|
| - bool PrepareRefPicLists(media::H264SliceHeader* slice_hdr);
|
| -
|
| - // Construct initial reference picture lists for use in decoding of
|
| - // P and B pictures (see 8.2.4 in spec).
|
| - void ConstructReferencePicListsP(media::H264SliceHeader* slice_hdr);
|
| - void ConstructReferencePicListsB(media::H264SliceHeader* slice_hdr);
|
| -
|
| - // Helper functions for reference list construction, per spec.
|
| - int PicNumF(VaapiH264Picture *pic);
|
| - int LongTermPicNumF(VaapiH264Picture *pic);
|
| -
|
| - // Perform the reference picture lists' modification (reordering), as
|
| - // specified in spec (8.2.4).
|
| - //
|
| - // |list| indicates list number and should be either 0 or 1.
|
| - bool ModifyReferencePicList(media::H264SliceHeader* slice_hdr, int list);
|
| -
|
| - // Perform reference picture memory management operations (marking/unmarking
|
| - // of reference pictures, long term picture management, discarding, etc.).
|
| - // See 8.2.5 in spec.
|
| - bool HandleMemoryManagementOps();
|
| - void ReferencePictureMarking();
|
| -
|
| - // Start processing a new frame.
|
| - bool StartNewFrame(media::H264SliceHeader* slice_hdr);
|
| -
|
| - // All data for a frame received, process it and decode.
|
| - bool FinishPrevFrameIfPresent();
|
| -
|
| - // Called after decoding, performs all operations to be done after decoding,
|
| - // including DPB management, reference picture marking and memory management
|
| - // operations.
|
| - // This will also output a picture if one is ready for output.
|
| - bool FinishPicture();
|
| -
|
| - // Clear DPB contents and remove all surfaces in DPB from *in_use_ list.
|
| - // Cleared pictures will be made available for decode, unless they are
|
| - // at client waiting to be displayed.
|
| - void ClearDPB();
|
| -
|
| - // These queue up data for HW decoder to be committed on running HW decode.
|
| - bool SendPPS();
|
| - bool SendIQMatrix();
|
| - bool SendVASliceParam(media::H264SliceHeader* slice_hdr);
|
| - bool SendSliceData(const uint8* ptr, size_t size);
|
| - bool QueueSlice(media::H264SliceHeader* slice_hdr);
|
| -
|
| - // Helper methods for filling HW structures.
|
| - void FillVAPicture(VAPictureH264 *va_pic, VaapiH264Picture* pic);
|
| - int FillVARefFramesFromDPB(VAPictureH264 *va_pics, int num_pics);
|
| -
|
| - // Commits all pending data for HW decoder and starts HW decoder.
|
| - bool DecodePicture();
|
| -
|
| - // Notifies client that a picture is ready for output.
|
| - bool OutputPic(VaapiH264Picture* pic);
|
| -
|
| - // Output all pictures in DPB that have not been outputted yet.
|
| - bool OutputAllRemainingPics();
|
| -
|
| - // Represents a frame being decoded. Will always have a VASurface
|
| - // assigned to it, which will eventually contain decoded picture data.
|
| - class DecodeSurface;
|
| -
|
| - // Assign an available surface to the given PicOrderCnt |poc|,
|
| - // removing it from the available surfaces pool. Return true if a surface
|
| - // has been found, false otherwise.
|
| - bool AssignSurfaceToPoC(int32 input_id, int poc);
|
| -
|
| - // Indicate that a surface is no longer needed by decoder.
|
| - void UnassignSurfaceFromPoC(int poc);
|
| -
|
| - // Return DecodeSurface assigned to |poc|.
|
| - DecodeSurface* DecodeSurfaceByPoC(int poc);
|
| -
|
| - // Decoder state.
|
| - State state_;
|
| -
|
| - // Parser in use.
|
| - media::H264Parser parser_;
|
| -
|
| - // DPB in use.
|
| - VaapiH264DPB dpb_;
|
| -
|
| - // Picture currently being processed/decoded.
|
| - scoped_ptr<VaapiH264Picture> curr_pic_;
|
| -
|
| - // Reference picture lists, constructed for each picture before decoding.
|
| - // Those lists are not owners of the pointers (DPB is).
|
| - VaapiH264Picture::PtrVector ref_pic_list0_;
|
| - VaapiH264Picture::PtrVector ref_pic_list1_;
|
| -
|
| - // Global state values, needed in decoding. See spec.
|
| - int max_pic_order_cnt_lsb_;
|
| - int max_frame_num_;
|
| - int max_pic_num_;
|
| - int max_long_term_frame_idx_;
|
| - size_t max_num_reorder_frames_;
|
| -
|
| - int frame_num_;
|
| - int prev_frame_num_;
|
| - int prev_frame_num_offset_;
|
| - bool prev_has_memmgmnt5_;
|
| -
|
| - // Values related to previously decoded reference picture.
|
| - bool prev_ref_has_memmgmnt5_;
|
| - int prev_ref_top_field_order_cnt_;
|
| - int prev_ref_pic_order_cnt_msb_;
|
| - int prev_ref_pic_order_cnt_lsb_;
|
| - VaapiH264Picture::Field prev_ref_field_;
|
| -
|
| - // Currently active SPS and PPS.
|
| - int curr_sps_id_;
|
| - int curr_pps_id_;
|
| -
|
| - // Output picture size.
|
| - gfx::Size pic_size_;
|
| -
|
| - // Maps H.264 PicOrderCount to currently used DecodeSurfaces;
|
| - typedef std::map<int, linked_ptr<DecodeSurface> > DecSurfacesInUse;
|
| - DecSurfacesInUse decode_surfaces_in_use_;
|
| -
|
| - // Unused VA surfaces returned by client, ready to be reused.
|
| - std::vector<scoped_refptr<VASurface> > available_va_surfaces_;
|
| -
|
| - // The id of current input buffer, which will be associated with an
|
| - // output surface when a frame is successfully decoded.
|
| - int32 curr_input_id_;
|
| -
|
| - VaapiWrapper* vaapi_wrapper_;
|
| -
|
| - // Called by decoder when a surface should be outputted.
|
| - OutputPicCB output_pic_cb_;
|
| -
|
| - // Called to report decoding error to UMA, not used to indicate errors
|
| - // to clients.
|
| - ReportErrorToUmaCB report_error_to_uma_cb_;
|
| -
|
| - // PicOrderCount of the previously outputted frame.
|
| - int last_output_poc_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(VaapiH264Decoder);
|
| -};
|
| -
|
| -} // namespace content
|
| -
|
| -#endif // CONTENT_COMMON_GPU_MEDIA_VAAPI_H264_DECODER_H_
|
|
|