- add sources.
[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   enum Status {
24     kOk,  // Everything went as planned.
25     kNotEnoughData,  // Not enough data to produce a video frame.
26     kDecodeError,  // Decoding error happened.
27     kDecryptError  // Decrypting error happened.
28   };
29
30   VideoDecoder();
31   virtual ~VideoDecoder();
32
33   // Initializes a VideoDecoder with the given |config|, executing the
34   // |status_cb| upon completion.
35   //
36   // Note:
37   // 1) The VideoDecoder will be reinitialized if it was initialized before.
38   //    Upon reinitialization, all internal buffered frames will be dropped.
39   // 2) This method should not be called during pending decode, reset or stop.
40   // 3) No VideoDecoder calls except for Stop() should be made before
41   //    |status_cb| is executed.
42   virtual void Initialize(const VideoDecoderConfig& config,
43                           const PipelineStatusCB& status_cb) = 0;
44
45   // Requests a |buffer| to be decoded. The status of the decoder and decoded
46   // frame are returned via the provided callback. Only one decode may be in
47   // flight at any given time.
48   //
49   // Implementations guarantee that the callback will not be called from within
50   // this method.
51   //
52   // If the returned status is kOk:
53   // - Non-EOS (end of stream) frame contains decoded video data.
54   // - EOS frame indicates the end of the stream.
55   // - NULL frame indicates an aborted decode. This can happen if Reset() or
56   //   Stop() is called during the decoding process.
57   // Otherwise the returned frame must be NULL.
58   typedef base::Callback<void(Status,
59                               const scoped_refptr<VideoFrame>&)> DecodeCB;
60   virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
61                       const DecodeCB& decode_cb) = 0;
62
63   // Resets decoder state, fulfilling all pending DecodeCB and dropping extra
64   // queued decoded data. After this call, the decoder is back to an initialized
65   // clean state.
66   // Note: No VideoDecoder calls should be made before |closure| is executed.
67   virtual void Reset(const base::Closure& closure) = 0;
68
69   // Stops decoder, fires any pending callbacks and sets the decoder to an
70   // uninitialized state. A VideoDecoder cannot be re-initialized after it has
71   // been stopped.
72   // Note that if Initialize() has been called, Stop() must be called and
73   // complete before deleting the decoder.
74   virtual void Stop(const base::Closure& closure) = 0;
75
76   // Returns true if the output format has an alpha channel. Most formats do not
77   // have alpha so the default is false. Override and return true for decoders
78   // that return formats with an alpha channel.
79   virtual bool HasAlpha() const;
80
81   // Returns true if the decoder needs bitstream conversion before decoding.
82   virtual bool NeedsBitstreamConversion() const;
83
84   // Returns true if the decoder currently has the ability to decode and return
85   // a VideoFrame. Most implementations can allocate a new VideoFrame and hence
86   // this will always return true. Override and return false for decoders that
87   // use a fixed set of VideoFrames for decoding.
88   virtual bool CanReadWithoutStalling() const;
89
90  private:
91   DISALLOW_COPY_AND_ASSIGN(VideoDecoder);
92 };
93
94 }  // namespace media
95
96 #endif  // MEDIA_BASE_VIDEO_DECODER_H_