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

Unified Diff: content/common/gpu/media/vaapi_h264_decoder.h

Issue 1040513003: VAVDA: Use the new, generic video decoder and accelerator infrastructure. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 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: 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_

Powered by Google App Engine
This is Rietveld 408576698