15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_FILTERS_FFMPEG_VIDEO_DECODER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_FILTERS_FFMPEG_VIDEO_DECODER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_decoder.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "media/base/video_decoder_config.h"
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "media/base/video_frame_pool.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/ffmpeg/ffmpeg_deleters.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AVCodecContext;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AVFrame;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SingleThreadTaskRunner;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DecoderBuffer;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT FFmpegVideoDecoder : public VideoDecoder {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit FFmpegVideoDecoder(
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~FFmpegVideoDecoder();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Allow decoding of individual NALU. Entire frames are required by default.
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Disables low-latency mode. Must be called before Initialize().
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void set_decode_nalus(bool decode_nalus) { decode_nalus_ = decode_nalus; }
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // VideoDecoder implementation.
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual std::string GetDisplayName() const OVERRIDE;
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void Initialize(const VideoDecoderConfig& config,
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          bool low_delay,
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          const PipelineStatusCB& status_cb,
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          const OutputCB& output_cb) OVERRIDE;
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                      const DecodeCB& decode_cb) OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Reset(const base::Closure& closure) OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback called from within FFmpeg to allocate a buffer based on
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // the dimensions of |codec_context|. See AVCodecContext.get_buffer2
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // documentation inside FFmpeg.
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int GetVideoBuffer(struct AVCodecContext* codec_context,
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     AVFrame* frame,
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     int flags);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum DecoderState {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kUninitialized,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kNormal,
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    kDecodeFinished,
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    kError
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Handles decoding an unencrypted encoded buffer.
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool FFmpegDecode(const scoped_refptr<DecoderBuffer>& buffer,
656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                    bool* has_produced_frame);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles (re-)initializing the decoder with a (new) config.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if initialization was successful.
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool ConfigureDecoder(bool low_delay);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Releases resources associated with |codec_context_| and |av_frame_|
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and resets them to NULL.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReleaseFFmpegResources();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecoderState state_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  OutputCB output_cb_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FFmpeg structures owned by this object.
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<AVCodecContext, ScopedPtrAVFreeContext> codec_context_;
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<AVFrame, ScopedPtrAVFreeFrame> av_frame_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  VideoDecoderConfig config_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  VideoFramePool frame_pool_;
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool decode_nalus_;
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FFmpegVideoDecoder);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // MEDIA_FILTERS_FFMPEG_VIDEO_DECODER_H_
97