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