1 // Copyright 2016 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "media/remoting/fake_media_resource.h"
9 #include "base/functional/callback_helpers.h"
10 #include "media/base/decoder_buffer.h"
11 #include "media/base/media_util.h"
12 #include "testing/gtest/include/gtest/gtest.h"
15 using testing::Invoke;
16 using testing::Return;
21 FakeDemuxerStream::FakeDemuxerStream(bool is_audio) {
22 type_ = is_audio ? DemuxerStream::AUDIO : DemuxerStream::VIDEO;
24 audio_config_.Initialize(
25 AudioCodec::kAAC, kSampleFormatS16, CHANNEL_LAYOUT_STEREO, 38400,
26 std::vector<uint8_t>(), EncryptionScheme::kUnencrypted,
27 base::TimeDelta(), 0);
29 gfx::Size size(640, 480);
30 gfx::Rect rect(0, 0, 640, 480);
31 video_config_.Initialize(VideoCodec::kH264, H264PROFILE_BASELINE,
32 VideoDecoderConfig::AlphaMode::kIsOpaque,
33 VideoColorSpace::REC601(), kNoTransformation, size,
34 rect, size, std::vector<uint8_t>(),
35 EncryptionScheme::kUnencrypted);
38 .WillByDefault(Invoke(this, &FakeDemuxerStream::FakeRead));
41 FakeDemuxerStream::~FakeDemuxerStream() = default;
43 // Only return one buffer at a time so we ignore the count.
44 void FakeDemuxerStream::FakeRead(uint32_t /*count*/, ReadCB read_cb) {
45 if (buffer_queue_.empty()) {
46 // Silent return to simulate waiting for buffer available.
47 pending_read_cb_ = std::move(read_cb);
50 scoped_refptr<DecoderBuffer> buffer = buffer_queue_.front();
51 buffer_queue_.pop_front();
52 std::move(read_cb).Run(kOk, {std::move(buffer)});
55 AudioDecoderConfig FakeDemuxerStream::audio_decoder_config() {
59 VideoDecoderConfig FakeDemuxerStream::video_decoder_config() {
63 DemuxerStream::Type FakeDemuxerStream::type() const {
67 StreamLiveness FakeDemuxerStream::liveness() const {
68 return StreamLiveness::kUnknown;
71 bool FakeDemuxerStream::SupportsConfigChanges() {
75 void FakeDemuxerStream::CreateFakeFrame(size_t size,
78 std::vector<uint8_t> buffer(size);
79 // Assign each byte in the buffer its index mod 256.
80 for (size_t i = 0; i < size; ++i) {
81 buffer[i] = static_cast<uint8_t>(i & 0xFF);
83 base::TimeDelta pts = base::Milliseconds(pts_ms);
86 scoped_refptr<DecoderBuffer> input_buffer =
87 DecoderBuffer::CopyFrom(buffer.data(), size);
88 input_buffer->set_timestamp(pts);
89 input_buffer->set_is_key_frame(key_frame);
91 // Sends frame out if there is pending read callback. Otherwise, stores it
92 // in the buffer queue.
93 if (!pending_read_cb_) {
94 buffer_queue_.push_back(input_buffer);
96 std::move(pending_read_cb_).Run(kOk, {std::move(input_buffer)});
100 FakeMediaResource::FakeMediaResource()
101 : audio_stream_(new FakeDemuxerStream(true)),
102 video_stream_(new FakeDemuxerStream(false)) {}
104 FakeMediaResource::~FakeMediaResource() = default;
106 std::vector<DemuxerStream*> FakeMediaResource::GetAllStreams() {
107 std::vector<DemuxerStream*> streams;
108 streams.push_back(audio_stream_.get());
109 streams.push_back(video_stream_.get());
113 } // namespace remoting