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