// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MEDIA_FILTERS_FAKE_VIDEO_DECODER_H_ #define MEDIA_FILTERS_FAKE_VIDEO_DECODER_H_ #include #include #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "media/base/callback_holder.h" #include "media/base/decoder_buffer.h" #include "media/base/pipeline_status.h" #include "media/base/video_decoder.h" #include "media/base/video_decoder_config.h" #include "media/base/video_frame.h" #include "ui/gfx/geometry/size.h" namespace media { using BytesDecodedCB = base::RepeatingCallback; class FakeVideoDecoder : public VideoDecoder { public: // Constructs an object with a decoding delay of |decoding_delay| frames. // |bytes_decoded_cb| is called after each decode. The sum of the byte // count over all calls will be equal to total_bytes_decoded(). // Allows setting a fake ID so that tests for wrapper decoders can check // that underlying decoders change successfully. FakeVideoDecoder(int decoder_id, int decoding_delay, int max_parallel_decoding_requests, const BytesDecodedCB& bytes_decoded_cb); FakeVideoDecoder(const FakeVideoDecoder&) = delete; FakeVideoDecoder& operator=(const FakeVideoDecoder&) = delete; ~FakeVideoDecoder() override; // Enables encrypted config supported. Must be called before Initialize(). void EnableEncryptedConfigSupport(); // Sets whether this decoder is a platform decoder. Must be called before // Initialize(). void SetIsPlatformDecoder(bool value); // Decoder implementation. bool SupportsDecryption() const override; bool IsPlatformDecoder() const override; VideoDecoderType GetDecoderType() const override; int GetDecoderId() { return decoder_id_; } // VideoDecoder implementation void Initialize(const VideoDecoderConfig& config, bool low_delay, CdmContext* cdm_context, InitCB init_cb, const OutputCB& output_cb, const WaitingCB& waiting_cb) override; void Decode(scoped_refptr buffer, DecodeCB decode_cb) override; void Reset(base::OnceClosure closure) override; int GetMaxDecodeRequests() const override; base::WeakPtr GetWeakPtr(); // Holds the next init/decode/reset callback from firing. void HoldNextInit(); void HoldDecode(); void HoldNextReset(); // Satisfies the pending init/decode/reset callback, which must be ready to // fire when these methods are called. void SatisfyInit(); void SatisfyDecode(); void SatisfyReset(); // Satisfies single decode request. void SatisfySingleDecode(); void SimulateError(); // Fail with status DECODER_ERROR_NOT_SUPPORTED when Initialize() is called. void SimulateFailureToInit(); int total_bytes_decoded() const { return total_bytes_decoded_; } protected: enum State { STATE_UNINITIALIZED, STATE_NORMAL, STATE_END_OF_STREAM, STATE_ERROR, }; // Derived classes may override to customize the VideoFrame. virtual scoped_refptr MakeVideoFrame(const DecoderBuffer& buffer); // Callback for updating |total_bytes_decoded_|. void OnFrameDecoded(int buffer_size, DecodeCB decode_cb, DecoderStatus status); // Runs |decode_cb| or puts it to |held_decode_callbacks_| depending on // current value of |hold_decode_|. void RunOrHoldDecode(DecodeCB decode_cb); // Runs |decode_cb| with a frame from |decoded_frames_|. void RunDecodeCallback(DecodeCB decode_cb); void DoReset(); SEQUENCE_CHECKER(sequence_checker_); const int decoder_id_; const size_t decoding_delay_; const int max_parallel_decoding_requests_; BytesDecodedCB bytes_decoded_cb_; bool is_platform_decoder_ = false; bool supports_encrypted_config_ = false; State state_; CallbackHolder init_cb_; CallbackHolder reset_cb_; OutputCB output_cb_; bool hold_decode_; std::list held_decode_callbacks_; VideoDecoderConfig current_config_; std::list > decoded_frames_; int total_bytes_decoded_; bool fail_to_initialize_; // NOTE: Weak pointers must be invalidated before all other member variables. base::WeakPtrFactory weak_factory_{this}; }; } // namespace media #endif // MEDIA_FILTERS_FAKE_VIDEO_DECODER_H_