1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef MEDIA_BASE_VIDEO_DECODER_H_ 6 #define MEDIA_BASE_VIDEO_DECODER_H_ 7 8 #include <string> 9 10 #include "base/callback.h" 11 #include "base/memory/ref_counted.h" 12 #include "media/base/media_export.h" 13 #include "media/base/pipeline_status.h" 14 #include "ui/gfx/size.h" 15 16 namespace media { 17 18 class DecoderBuffer; 19 class VideoDecoderConfig; 20 class VideoFrame; 21 22 class MEDIA_EXPORT VideoDecoder { 23 public: 24 // Status codes for decode operations on VideoDecoder. 25 // TODO(rileya): Now that both AudioDecoder and VideoDecoder Status enums 26 // match, break them into a decoder_status.h. 27 enum Status { 28 kOk, // Everything went as planned. 29 kAborted, // Decode was aborted as a result of Reset() being called. 30 kDecodeError, // Decoding error happened. 31 kDecryptError // Decrypting error happened. 32 }; 33 34 // Callback for VideoDecoder to return a decoded frame whenever it becomes 35 // available. Only non-EOS frames should be returned via this callback. 36 typedef base::Callback<void(const scoped_refptr<VideoFrame>&)> OutputCB; 37 38 // Callback type for Decode(). Called after the decoder has completed decoding 39 // corresponding DecoderBuffer, indicating that it's ready to accept another 40 // buffer to decode. 41 typedef base::Callback<void(Status status)> DecodeCB; 42 43 VideoDecoder(); 44 45 // Fires any pending callbacks, stops and destroys the decoder. 46 // Note: Since this is a destructor, |this| will be destroyed after this call. 47 // Make sure the callbacks fired from this call doesn't post any task that 48 // depends on |this|. 49 virtual ~VideoDecoder(); 50 51 // Returns the name of the decoder for logging purpose. 52 virtual std::string GetDisplayName() const = 0; 53 54 // Initializes a VideoDecoder with the given |config|, executing the 55 // |status_cb| upon completion. |output_cb| is called for each output frame 56 // decoded by Decode(). 57 // 58 // Note: 59 // 1) The VideoDecoder will be reinitialized if it was initialized before. 60 // Upon reinitialization, all internal buffered frames will be dropped. 61 // 2) This method should not be called during pending decode or reset. 62 // 3) No VideoDecoder calls should be made before |status_cb| is executed. 63 virtual void Initialize(const VideoDecoderConfig& config, 64 bool low_delay, 65 const PipelineStatusCB& status_cb, 66 const OutputCB& output_cb) = 0; 67 68 // Requests a |buffer| to be decoded. The status of the decoder and decoded 69 // frame are returned via the provided callback. Some decoders may allow 70 // decoding multiple buffers in parallel. Callers should call 71 // GetMaxDecodeRequests() to get number of buffers that may be decoded in 72 // parallel. Decoder must call |decode_cb| in the same order in which Decode() 73 // is called. 74 // 75 // Implementations guarantee that the callback will not be called from within 76 // this method and that |decode_cb| will not be blocked on the following 77 // Decode() calls (i.e. |decode_cb| will be called even if Decode() is never 78 // called again). 79 // 80 // After decoding is finished the decoder calls |output_cb| specified in 81 // Initialize() for each decoded frame. |output_cb| may be called before or 82 // after |decode_cb|. 83 // 84 // If |buffer| is an EOS buffer then the decoder must be flushed, i.e. 85 // |output_cb| must be called for each frame pending in the queue and 86 // |decode_cb| must be called after that. Callers will not call Decode() 87 // again until after the flush completes. 88 virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer, 89 const DecodeCB& decode_cb) = 0; 90 91 // Resets decoder state. All pending Decode() requests will be finished or 92 // aborted before |closure| is called. 93 // Note: No VideoDecoder calls should be made before |closure| is executed. 94 virtual void Reset(const base::Closure& closure) = 0; 95 96 // Returns true if the decoder needs bitstream conversion before decoding. 97 virtual bool NeedsBitstreamConversion() const; 98 99 // Returns true if the decoder currently has the ability to decode and return 100 // a VideoFrame. Most implementations can allocate a new VideoFrame and hence 101 // this will always return true. Override and return false for decoders that 102 // use a fixed set of VideoFrames for decoding. 103 virtual bool CanReadWithoutStalling() const; 104 105 // Returns maximum number of parallel decode requests. 106 virtual int GetMaxDecodeRequests() const; 107 108 private: 109 DISALLOW_COPY_AND_ASSIGN(VideoDecoder); 110 }; 111 112 } // namespace media 113 114 #endif // MEDIA_BASE_VIDEO_DECODER_H_ 115