Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / media / base / video_decoder.h
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 "base/callback.h"
9 #include "base/memory/ref_counted.h"
10 #include "media/base/media_export.h"
11 #include "media/base/pipeline_status.h"
12 #include "ui/gfx/size.h"
13
14 namespace media {
15
16 class DecoderBuffer;
17 class VideoDecoderConfig;
18 class VideoFrame;
19
20 class MEDIA_EXPORT VideoDecoder {
21  public:
22   // Status codes for decode operations on VideoDecoder.
23   // TODO(rileya): Now that both AudioDecoder and VideoDecoder Status enums
24   // match, break them into a decoder_status.h.
25   enum Status {
26     kOk,  // Everything went as planned.
27     kAborted,  // Decode was aborted as a result of Reset() being called.
28     kNotEnoughData,  // Not enough data to produce a video frame.
29     kDecodeError,  // Decoding error happened.
30     kDecryptError  // Decrypting error happened.
31   };
32
33   VideoDecoder();
34   virtual ~VideoDecoder();
35
36   // Initializes a VideoDecoder with the given |config|, executing the
37   // |status_cb| upon completion.
38   //
39   // Note:
40   // 1) The VideoDecoder will be reinitialized if it was initialized before.
41   //    Upon reinitialization, all internal buffered frames will be dropped.
42   // 2) This method should not be called during pending decode, reset or stop.
43   // 3) No VideoDecoder calls except for Stop() should be made before
44   //    |status_cb| is executed.
45   virtual void Initialize(const VideoDecoderConfig& config,
46                           bool low_delay,
47                           const PipelineStatusCB& status_cb) = 0;
48
49   // Requests a |buffer| to be decoded. The status of the decoder and decoded
50   // frame are returned via the provided callback. Some decoders may allow
51   // decoding multiple buffers in parallel. Callers should call
52   // GetMaxDecodeRequests() to get number of buffers that may be decoded in
53   // parallel. Decoder must call |decode_cb| in the same order in which Decode()
54   // is called.
55   //
56   // Implementations guarantee that the callback will not be called from within
57   // this method and that |decode_cb| will not be blocked on the following
58   // Decode() calls (i.e. |decode_cb| will be called even Decode() is never
59   // called again).
60   //
61   // If the returned status is kOk:
62   // - Non-EOS (end of stream) frame contains decoded video data.
63   // - EOS frame indicates the end of the stream.
64   // Otherwise the returned frame must be NULL.
65   typedef base::Callback<void(Status,
66                               const scoped_refptr<VideoFrame>&)> DecodeCB;
67   virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
68                       const DecodeCB& decode_cb) = 0;
69
70   // Some VideoDecoders may queue up multiple VideoFrames from a single
71   // DecoderBuffer, if we have any such queued frames this will return the next
72   // one. Otherwise we return a NULL VideoFrame.
73   //
74   // TODO(xhwang): Revisit this method.
75   virtual scoped_refptr<VideoFrame> GetDecodeOutput();
76
77   // Resets decoder state, fulfilling all pending DecodeCB and dropping extra
78   // queued decoded data. After this call, the decoder is back to an initialized
79   // clean state.
80   // Note: No VideoDecoder calls should be made before |closure| is executed.
81   virtual void Reset(const base::Closure& closure) = 0;
82
83   // Stops decoder, fires any pending callbacks and sets the decoder to an
84   // uninitialized state. A VideoDecoder cannot be re-initialized after it has
85   // been stopped.
86   // Note that if Initialize() is pending or has finished successfully, Stop()
87   // must be called before destructing the decoder.
88   virtual void Stop() = 0;
89
90   // Returns true if the decoder needs bitstream conversion before decoding.
91   virtual bool NeedsBitstreamConversion() const;
92
93   // Returns true if the decoder currently has the ability to decode and return
94   // a VideoFrame. Most implementations can allocate a new VideoFrame and hence
95   // this will always return true. Override and return false for decoders that
96   // use a fixed set of VideoFrames for decoding.
97   virtual bool CanReadWithoutStalling() const;
98
99   // Returns maximum number of parallel decode requests.
100   virtual int GetMaxDecodeRequests() const;
101
102  private:
103   DISALLOW_COPY_AND_ASSIGN(VideoDecoder);
104 };
105
106 }  // namespace media
107
108 #endif  // MEDIA_BASE_VIDEO_DECODER_H_