// Copyright 2015 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. // Note: ported from Chromium commit head: 77118c9 #ifndef ACCELERATED_VIDEO_DECODER_H_ #define ACCELERATED_VIDEO_DECODER_H_ #include #include #include "base/macros.h" #include "size.h" namespace media { // An AcceleratedVideoDecoder is a video decoder that requires support from an // external accelerator (typically a hardware accelerator) to partially offload // the decode process after parsing stream headers, and performing reference // frame and state management. class AcceleratedVideoDecoder { public: AcceleratedVideoDecoder() {} virtual ~AcceleratedVideoDecoder() {} virtual void SetStream(const uint8_t* ptr, size_t size) = 0; // Have the decoder flush its state and trigger output of all previously // decoded surfaces. Return false on failure. virtual bool Flush() WARN_UNUSED_RESULT = 0; // Stop (pause) decoding, discarding all remaining inputs and outputs, // but do not flush decoder state, so that playback can be resumed later, // possibly from a different location. // To be called during decoding. virtual void Reset() = 0; enum DecodeResult { 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. kNeedContextUpdate, // Waiting for the client to update decoding context // with data acquired from the accelerator. }; // Try to decode more of the stream, returning decoded frames asynchronously. // 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. virtual DecodeResult Decode() WARN_UNUSED_RESULT = 0; // 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 kAllocateNewSurfaces. virtual Size GetPicSize() const = 0; virtual size_t GetRequiredNumOfPictures() const = 0; private: DISALLOW_COPY_AND_ASSIGN(AcceleratedVideoDecoder); }; } // namespace media #endif // ACCELERATED_VIDEO_DECODER_H_