Home | History | Annotate | Download | only in filters
      1 // Copyright 2013 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_FILTERS_FAKE_VIDEO_DECODER_H_
      6 #define MEDIA_FILTERS_FAKE_VIDEO_DECODER_H_
      7 
      8 #include <list>
      9 
     10 #include "base/bind.h"
     11 #include "base/callback.h"
     12 #include "base/callback_helpers.h"
     13 #include "base/memory/weak_ptr.h"
     14 #include "base/threading/thread_checker.h"
     15 #include "media/base/callback_holder.h"
     16 #include "media/base/decoder_buffer.h"
     17 #include "media/base/pipeline_status.h"
     18 #include "media/base/video_decoder.h"
     19 #include "media/base/video_decoder_config.h"
     20 #include "media/base/video_frame.h"
     21 #include "ui/gfx/size.h"
     22 
     23 using base::ResetAndReturn;
     24 
     25 namespace base {
     26 class SingleThreadTaskRunner;
     27 }
     28 
     29 namespace media {
     30 
     31 class FakeVideoDecoder : public VideoDecoder {
     32  public:
     33   // Constructs an object with a decoding delay of |decoding_delay| frames.
     34   FakeVideoDecoder(int decoding_delay,
     35                    int max_parallel_decoding_requests);
     36   virtual ~FakeVideoDecoder();
     37 
     38   // VideoDecoder implementation.
     39   virtual void Initialize(const VideoDecoderConfig& config,
     40                           bool low_delay,
     41                           const PipelineStatusCB& status_cb,
     42                           const OutputCB& output_cb) OVERRIDE;
     43   virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
     44                       const DecodeCB& decode_cb) OVERRIDE;
     45   virtual void Reset(const base::Closure& closure) OVERRIDE;
     46   virtual void Stop() OVERRIDE;
     47   virtual int GetMaxDecodeRequests() const OVERRIDE;
     48 
     49   // Holds the next init/decode/reset callback from firing.
     50   void HoldNextInit();
     51   void HoldDecode();
     52   void HoldNextReset();
     53 
     54   // Satisfies the pending init/decode/reset callback, which must be ready to
     55   // fire when these methods are called.
     56   void SatisfyInit();
     57   void SatisfyDecode();
     58   void SatisfyReset();
     59 
     60   // Satisfies single  decode request.
     61   void SatisfySingleDecode();
     62 
     63   void SimulateError();
     64 
     65   int total_bytes_decoded() const { return total_bytes_decoded_; }
     66 
     67  private:
     68   enum State {
     69     STATE_UNINITIALIZED,
     70     STATE_NORMAL,
     71     STATE_END_OF_STREAM,
     72     STATE_ERROR,
     73   };
     74 
     75   // Callback for updating |total_bytes_decoded_|.
     76   void OnFrameDecoded(int buffer_size,
     77                       const DecodeCB& decode_cb,
     78                       Status status);
     79 
     80   // Runs |decode_cb| or puts it to |held_decode_callbacks_| depending on
     81   // current value of |hold_decode_|.
     82   void RunOrHoldDecode(const DecodeCB& decode_cb);
     83 
     84   // Runs |decode_cb| with a frame from |decoded_frames_|.
     85   void RunDecodeCallback(const DecodeCB& decode_cb);
     86 
     87   void DoReset();
     88 
     89   base::ThreadChecker thread_checker_;
     90 
     91   const size_t decoding_delay_;
     92   const int max_parallel_decoding_requests_;
     93 
     94   State state_;
     95 
     96   CallbackHolder<PipelineStatusCB> init_cb_;
     97   CallbackHolder<base::Closure> reset_cb_;
     98 
     99   OutputCB output_cb_;
    100 
    101   bool hold_decode_;
    102   std::list<DecodeCB> held_decode_callbacks_;
    103 
    104   VideoDecoderConfig current_config_;
    105 
    106   std::list<scoped_refptr<VideoFrame> > decoded_frames_;
    107 
    108   int total_bytes_decoded_;
    109 
    110   // NOTE: Weak pointers must be invalidated before all other member variables.
    111   base::WeakPtrFactory<FakeVideoDecoder> weak_factory_;
    112 
    113   DISALLOW_COPY_AND_ASSIGN(FakeVideoDecoder);
    114 };
    115 
    116 }  // namespace media
    117 
    118 #endif  // MEDIA_FILTERS_FAKE_VIDEO_DECODER_H_
    119