// Copyright (c) 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_BASE_FAKE_DEMUXER_STREAM_H_ #define MEDIA_BASE_FAKE_DEMUXER_STREAM_H_ #include "base/memory/ref_counted.h" #include "base/time/time.h" #include "media/base/audio_decoder_config.h" #include "media/base/demuxer_stream.h" #include "media/base/media_resource.h" #include "media/base/video_decoder_config.h" namespace base { class SingleThreadTaskRunner; } // namespace base namespace media { class FakeDemuxerStream : public DemuxerStream { public: // Constructs an object that outputs |num_configs| different configs in // sequence with |num_frames_in_one_config| buffers for each config. The // output buffers are encrypted if |is_encrypted| is true. FakeDemuxerStream(int num_configs, int num_buffers_in_one_config, bool is_encrypted); // Constructs an object that outputs |num_configs| different configs in // sequence with |num_frames_in_one_config| buffers for each config. The // output buffers are encrypted if |is_encrypted| is true. // The starting config |coded_size| is specified by the // |start_coded_size| parameter, and each config change increases/decreases it // by the |coded_size_delta| parameter. // The returned config always has equal |coded_size| and |visible_rect| // properties. FakeDemuxerStream(int num_configs, int num_buffers_in_one_config, bool is_encrypted, gfx::Size start_coded_size, gfx::Vector2dF coded_size_delta); FakeDemuxerStream(const FakeDemuxerStream&) = delete; FakeDemuxerStream& operator=(const FakeDemuxerStream&) = delete; ~FakeDemuxerStream() override; // DemuxerStream implementation. void Read(ReadCB read_cb) override; AudioDecoderConfig audio_decoder_config() override; VideoDecoderConfig video_decoder_config() override; Type type() const override; bool SupportsConfigChanges() override; void Initialize(); int num_buffers_returned() const { return num_buffers_returned_; } // Upon the next read, holds the read callback until SatisfyRead() or Reset() // is called. void HoldNextRead(); // Upon the next config change read, holds the read callback until // SatisfyRead() or Reset() is called. If there is no config change any more, // no read will be held. void HoldNextConfigChangeRead(); // Satisfies the pending read with the next scheduled status and buffer. void SatisfyRead(); // Satisfies pending read request and then holds the following read. void SatisfyReadAndHoldNext(); // Satisfies the pending read (if any) with kAborted and NULL. This call // always clears |hold_next_read_|. void Reset(); // Satisfies the pending read (if any) with kError and NULL. This call // always clears |hold_next_read_|. void Error(); // Reset() this demuxer stream and set the reading position to the start of // the stream. void SeekToStart(); // Sets further read requests to return EOS buffers. void SeekToEndOfStream(); base::TimeDelta duration() const { return duration_; } private: void UpdateVideoDecoderConfig(); void DoRead(); scoped_refptr task_runner_; const int num_configs_; const int num_buffers_in_one_config_; const bool config_changes_; const bool is_encrypted_; const gfx::Size start_coded_size_; const gfx::Vector2dF coded_size_delta_; int num_configs_left_; // Number of frames left with the current decoder config. int num_buffers_left_in_current_config_; int num_buffers_returned_; base::TimeDelta current_timestamp_; base::TimeDelta duration_; gfx::Size next_size_; VideoDecoderConfig video_decoder_config_; ReadCB read_cb_; int next_read_num_; // Zero-based number indicating which read operation should be held. -1 means // no read shall be held. int read_to_hold_; }; class FakeMediaResource : public MediaResource { public: // Note: FakeDemuxerStream currently only supports a fake video DemuxerStream. FakeMediaResource(int num_video_configs, int num_video_buffers_in_one_config, bool is_video_encrypted); FakeMediaResource(const FakeMediaResource&) = delete; FakeMediaResource& operator=(const FakeMediaResource&) = delete; ~FakeMediaResource() override; // MediaResource implementation. std::vector GetAllStreams() override; private: FakeDemuxerStream fake_video_stream_; }; } // namespace media #endif // MEDIA_BASE_FAKE_DEMUXER_STREAM_H_