15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains an implementation of a class that provides H264 decode
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// support for use with VAAPI hardware video decode acceleration on Intel
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// systems.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_COMMON_GPU_MEDIA_VAAPI_H264_DECODER_H_
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_COMMON_GPU_MEDIA_VAAPI_H264_DECODER_H_
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <vector>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/ref_counted.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/media/h264_dpb.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/common/gpu/media/vaapi_wrapper.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/limits.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/filters/h264_parser.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// An H264 decoder that utilizes VA-API. Provides features not supported by
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// the VA-API userspace library (libva), including stream parsing, reference
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// picture management and other operations not supported by the HW codec.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provides functionality to allow plugging VAAPI HW acceleration into the
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VDA framework.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clients of this class are expected to pass H264 Annex-B byte stream and
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// will receive decoded surfaces via client-provided |OutputPicCB|.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// This class must be created, called and destroyed on a single thread, and
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// does nothing internally on any other thread.
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CONTENT_EXPORT VaapiH264Decoder {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Callback invoked on the client when a surface is to be displayed.
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Arguments: input buffer id provided at the time of Decode()
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // and VASurface to output.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      void(int32, const scoped_refptr<VASurface>&)> OutputPicCB;
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  enum VAVDAH264DecoderFailure {
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    FRAME_MBS_ONLY_FLAG_NOT_ONE = 0,
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    GAPS_IN_FRAME_NUM = 1,
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    MID_STREAM_RESOLUTION_CHANGE = 2,
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    INTERLACED_STREAM = 3,
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    VAAPI_ERROR = 4,
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    VAVDA_H264_DECODER_FAILURES_MAX,
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Callback to report errors for UMA purposes, not used to return errors
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // to clients.
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  typedef base::Callback<void(VAVDAH264DecoderFailure error)>
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ReportErrorToUmaCB;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Decode result codes.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum DecResult {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kDecodeError,  // Error while decoding.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO posciak: unsupported streams are currently treated as error
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in decoding; in future it could perhaps be possible to fall back
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to software decoding instead.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // kStreamError,  // Error in stream.
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    kAllocateNewSurfaces,  // Need a new set of surfaces to be allocated.
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    kRanOutOfStreamData,  // Need more stream data to proceed.
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    kRanOutOfSurfaces,  // Waiting for the client to free up output surfaces.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // |vaapi_wrapper| should be initialized.
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // |output_pic_cb| notifies the client a surface is to be displayed.
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // |report_error_to_uma_cb| called on errors for UMA purposes, not used
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // to report errors to clients.
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VaapiH264Decoder(VaapiWrapper* vaapi_wrapper,
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   const OutputPicCB& output_pic_cb,
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   const ReportErrorToUmaCB& report_error_to_uma_cb);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ~VaapiH264Decoder();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Have the decoder flush its state and trigger output of all previously
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // decoded surfaces via OutputPicCB. Return false on failure.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Flush() WARN_UNUSED_RESULT;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // To be called during decoding.
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Stop (pause) decoding, discarding all remaining inputs and outputs,
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // but do not flush decoder state, so that the playback can be resumed later,
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // possibly from a different location.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set current stream data pointer to |ptr| and |size|. Output surfaces
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // that are decoded from data in this stream chunk are to be returned along
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // with the given |input_id|.
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetStream(const uint8* ptr, size_t size, int32 input_id);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Try to decode more of the stream, returning decoded frames asynchronously
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // via output_pic_cb_. Return when more stream is needed, when we run out
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // of free surfaces, when we need a new set of them, or when an error occurs.
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DecResult Decode() WARN_UNUSED_RESULT;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Return dimensions/required number of output surfaces that client should
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // be ready to provide for the decoder to function properly.
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // To be used after Decode() returns kNeedNewSurfaces.
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Size GetPicSize() { return pic_size_; }
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t GetRequiredNumOfPictures();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // To be used by the client to feed decoder with output surfaces.
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void ReuseSurface(const scoped_refptr<VASurface>& va_surface);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We need to keep at most kDPBMaxSize pictures in DPB for
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reference/to display later and an additional one for the one currently
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being decoded. We also ask for some additional ones since VDA needs
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to accumulate a few ready-to-output pictures before it actually starts
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // displaying and giving them back. +2 instead of +1 because of subjective
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // smoothness improvement during testing.
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum {
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kPicsInPipeline = media::limits::kMaxVideoFrames + 2,
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kMaxNumReqPictures = H264DPB::kDPBMaxSize + kPicsInPipeline,
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Internal state of the decoder.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum State {
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    kNeedStreamMetadata,  // After initialization, need an SPS.
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    kDecoding,  // Ready to decode from any point.
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    kAfterReset, // After Reset(), need a resume point.
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    kError,  // Error in decode, can't continue.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Process H264 stream structures.
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool ProcessSPS(int sps_id, bool* need_new_buffers);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ProcessPPS(int pps_id);
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool ProcessSlice(media::H264SliceHeader* slice_hdr);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the current picture according to data in |slice_hdr|.
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool InitCurrPicture(media::H264SliceHeader* slice_hdr);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calculate picture order counts for the new picture
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on initialization of a new frame (see spec).
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool CalculatePicOrderCounts(media::H264SliceHeader* slice_hdr);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update PicNum values in pictures stored in DPB on creation of new
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // frame (see spec).
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdatePicNums();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool UpdateMaxNumReorderFrames(const media::H264SPS* sps);
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Prepare reference picture lists (ref_pic_list[01]_).
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool PrepareRefPicLists(media::H264SliceHeader* slice_hdr);
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Construct initial reference picture lists for use in decoding of
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // P and B pictures (see 8.2.4 in spec).
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ConstructReferencePicListsP(media::H264SliceHeader* slice_hdr);
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ConstructReferencePicListsB(media::H264SliceHeader* slice_hdr);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper functions for reference list construction, per spec.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int PicNumF(H264Picture *pic);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int LongTermPicNumF(H264Picture *pic);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Perform the reference picture lists' modification (reordering), as
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specified in spec (8.2.4).
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |list| indicates list number and should be either 0 or 1.
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool ModifyReferencePicList(media::H264SliceHeader* slice_hdr, int list);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Perform reference picture memory management operations (marking/unmarking
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of reference pictures, long term picture management, discarding, etc.).
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See 8.2.5 in spec.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HandleMemoryManagementOps();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReferencePictureMarking();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start processing a new frame.
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool StartNewFrame(media::H264SliceHeader* slice_hdr);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All data for a frame received, process it and decode.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool FinishPrevFrameIfPresent();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called after decoding, performs all operations to be done after decoding,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // including DPB management, reference picture marking and memory management
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // operations.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This will also output a picture if one is ready for output.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool FinishPicture();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Clear DPB contents and remove all surfaces in DPB from *in_use_ list.
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Cleared pictures will be made available for decode, unless they are
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // at client waiting to be displayed.
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void ClearDPB();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These queue up data for HW decoder to be committed on running HW decode.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SendPPS();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SendIQMatrix();
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool SendVASliceParam(media::H264SliceHeader* slice_hdr);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SendSliceData(const uint8* ptr, size_t size);
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool QueueSlice(media::H264SliceHeader* slice_hdr);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper methods for filling HW structures.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FillVAPicture(VAPictureH264 *va_pic, H264Picture* pic);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int FillVARefFramesFromDPB(VAPictureH264 *va_pics, int num_pics);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Commits all pending data for HW decoder and starts HW decoder.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DecodePicture();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifies client that a picture is ready for output.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool OutputPic(H264Picture* pic);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Output all pictures in DPB that have not been outputted yet.
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool OutputAllRemainingPics();
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Represents a frame being decoded. Will always have a VASurface
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // assigned to it, which will eventually contain decoded picture data.
211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  class DecodeSurface;
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Assign an available surface to the given PicOrderCnt |poc|,
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // removing it from the available surfaces pool. Return true if a surface
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // has been found, false otherwise.
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool AssignSurfaceToPoC(int32 input_id, int poc);
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Indicate that a surface is no longer needed by decoder.
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void UnassignSurfaceFromPoC(int poc);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Return DecodeSurface assigned to |poc|.
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DecodeSurface* DecodeSurfaceByPoC(int poc);
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Decoder state.
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  State state_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parser in use.
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  media::H264Parser parser_;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DPB in use.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264DPB dpb_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Picture currently being processed/decoded.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<H264Picture> curr_pic_;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reference picture lists, constructed for each picture before decoding.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Those lists are not owners of the pointers (DPB is).
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264Picture::PtrVector ref_pic_list0_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264Picture::PtrVector ref_pic_list1_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Global state values, needed in decoding. See spec.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_pic_order_cnt_lsb_;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_frame_num_;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_pic_num_;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_long_term_frame_idx_;
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  size_t max_num_reorder_frames_;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int frame_num_;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int prev_frame_num_;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int prev_frame_num_offset_;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool prev_has_memmgmnt5_;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Values related to previously decoded reference picture.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool prev_ref_has_memmgmnt5_;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int prev_ref_top_field_order_cnt_;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int prev_ref_pic_order_cnt_msb_;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int prev_ref_pic_order_cnt_lsb_;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264Picture::Field prev_ref_field_;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently active SPS and PPS.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int curr_sps_id_;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int curr_pps_id_;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Output picture size.
265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Size pic_size_;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Maps H.264 PicOrderCount to currently used DecodeSurfaces;
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  typedef std::map<int, linked_ptr<DecodeSurface> > DecSurfacesInUse;
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DecSurfacesInUse decode_surfaces_in_use_;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Unused VA surfaces returned by client, ready to be reused.
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::vector<scoped_refptr<VASurface> > available_va_surfaces_;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The id of current input buffer, which will be associated with an
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // output surface when a frame is successfully decoded.
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 curr_input_id_;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VaapiWrapper* vaapi_wrapper_;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Called by decoder when a surface should be outputted.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OutputPicCB output_pic_cb_;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Called to report decoding error to UMA, not used to indicate errors
284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // to clients.
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ReportErrorToUmaCB report_error_to_uma_cb_;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PicOrderCount of the previously outputted frame.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int last_output_poc_;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VaapiH264Decoder);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_MEDIA_VAAPI_H264_DECODER_H_
296