Report errors from ChromiumEnv::GetChildren in Posix.
[chromium-blink-merge.git] / media / filters / vpx_video_decoder.h
blob680337ae532b0aca6c243587ee07e1ae492552af
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.
5 #ifndef MEDIA_FILTERS_VPX_VIDEO_DECODER_H_
6 #define MEDIA_FILTERS_VPX_VIDEO_DECODER_H_
8 #include "base/callback.h"
9 #include "base/memory/weak_ptr.h"
10 #include "media/base/demuxer_stream.h"
11 #include "media/base/video_decoder.h"
12 #include "media/base/video_decoder_config.h"
13 #include "media/base/video_frame.h"
15 struct vpx_codec_ctx;
16 struct vpx_image;
18 namespace base {
19 class MessageLoopProxy;
22 namespace media {
24 // Libvpx video decoder wrapper.
25 // Note: VpxVideoDecoder accepts only YV12A VP8 content or VP9 content. This is
26 // done to avoid usurping FFmpeg for all vp8 decoding, because the FFmpeg VP8
27 // decoder is faster than the libvpx VP8 decoder.
28 class MEDIA_EXPORT VpxVideoDecoder : public VideoDecoder {
29 public:
30 explicit VpxVideoDecoder(
31 const scoped_refptr<base::MessageLoopProxy>& message_loop);
32 virtual ~VpxVideoDecoder();
34 // VideoDecoder implementation.
35 virtual void Initialize(const VideoDecoderConfig& config,
36 const PipelineStatusCB& status_cb) OVERRIDE;
37 virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
38 const DecodeCB& decode_cb) OVERRIDE;
39 virtual void Reset(const base::Closure& closure) OVERRIDE;
40 virtual void Stop(const base::Closure& closure) OVERRIDE;
41 virtual bool HasAlpha() const OVERRIDE;
43 private:
44 enum DecoderState {
45 kUninitialized,
46 kNormal,
47 kFlushCodec,
48 kDecodeFinished,
49 kError
52 // Handles (re-)initializing the decoder with a (new) config.
53 // Returns true when initialization was successful.
54 bool ConfigureDecoder(const VideoDecoderConfig& config);
56 void CloseDecoder();
58 void DecodeBuffer(const scoped_refptr<DecoderBuffer>& buffer);
59 bool VpxDecode(const scoped_refptr<DecoderBuffer>& buffer,
60 scoped_refptr<VideoFrame>* video_frame);
62 // Reset decoder and call |reset_cb_|.
63 void DoReset();
65 void CopyVpxImageTo(const vpx_image* vpx_image,
66 const struct vpx_image* vpx_image_alpha,
67 scoped_refptr<VideoFrame>* video_frame);
69 scoped_refptr<base::MessageLoopProxy> message_loop_;
70 base::WeakPtrFactory<VpxVideoDecoder> weak_factory_;
71 base::WeakPtr<VpxVideoDecoder> weak_this_;
73 DecoderState state_;
75 DecodeCB decode_cb_;
76 base::Closure reset_cb_;
78 VideoDecoderConfig config_;
80 vpx_codec_ctx* vpx_codec_;
81 vpx_codec_ctx* vpx_codec_alpha_;
83 DISALLOW_COPY_AND_ASSIGN(VpxVideoDecoder);
86 } // namespace media
88 #endif // MEDIA_FILTERS_VPX_VIDEO_DECODER_H_