OLD | NEW |
| (Empty) |
1 // Copyright 2015 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 #include "base/threading/thread.h" | |
6 #include "chromecast/media/cma/test/demuxer_stream_for_test.h" | |
7 | |
8 namespace chromecast { | |
9 namespace media { | |
10 | |
11 DemuxerStreamForTest::DemuxerStreamForTest(int total_frames, | |
12 int cycle_count, | |
13 int delayed_frame_count, | |
14 const std::list<int>& config_idx) | |
15 : total_frame_count_(total_frames), | |
16 cycle_count_(cycle_count), | |
17 delayed_frame_count_(delayed_frame_count), | |
18 config_idx_(config_idx), | |
19 frame_count_(0), | |
20 has_pending_read_(false) { | |
21 DCHECK_LE(delayed_frame_count, cycle_count); | |
22 } | |
23 | |
24 DemuxerStreamForTest::~DemuxerStreamForTest() { | |
25 } | |
26 | |
27 void DemuxerStreamForTest::Read(const ReadCB& read_cb) { | |
28 has_pending_read_ = true; | |
29 if (!config_idx_.empty() && config_idx_.front() == frame_count_) { | |
30 config_idx_.pop_front(); | |
31 has_pending_read_ = false; | |
32 read_cb.Run(kConfigChanged, scoped_refptr<::media::DecoderBuffer>()); | |
33 return; | |
34 } | |
35 | |
36 if ((frame_count_ % cycle_count_) < delayed_frame_count_) { | |
37 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | |
38 FROM_HERE, base::Bind(&DemuxerStreamForTest::DoRead, | |
39 base::Unretained(this), read_cb), | |
40 base::TimeDelta::FromMilliseconds(20)); | |
41 return; | |
42 } | |
43 DoRead(read_cb); | |
44 } | |
45 | |
46 ::media::AudioDecoderConfig DemuxerStreamForTest::audio_decoder_config() { | |
47 NOTREACHED() << "DemuxerStreamForTest is a video DemuxerStream"; | |
48 return ::media::AudioDecoderConfig(); | |
49 } | |
50 | |
51 ::media::VideoDecoderConfig DemuxerStreamForTest::video_decoder_config() { | |
52 gfx::Size coded_size(640, 480); | |
53 gfx::Rect visible_rect(640, 480); | |
54 gfx::Size natural_size(640, 480); | |
55 return ::media::VideoDecoderConfig( | |
56 ::media::kCodecH264, ::media::VIDEO_CODEC_PROFILE_UNKNOWN, | |
57 ::media::PIXEL_FORMAT_YV12, ::media::COLOR_SPACE_UNSPECIFIED, coded_size, | |
58 visible_rect, natural_size, NULL, 0, false); | |
59 } | |
60 | |
61 ::media::DemuxerStream::Type DemuxerStreamForTest::type() const { | |
62 return VIDEO; | |
63 } | |
64 | |
65 bool DemuxerStreamForTest::SupportsConfigChanges() { | |
66 return true; | |
67 } | |
68 | |
69 ::media::VideoRotation DemuxerStreamForTest::video_rotation() { | |
70 return ::media::VIDEO_ROTATION_0; | |
71 } | |
72 | |
73 void DemuxerStreamForTest::DoRead(const ReadCB& read_cb) { | |
74 has_pending_read_ = false; | |
75 | |
76 if (total_frame_count_ != -1 && frame_count_ >= total_frame_count_) { | |
77 // End of stream | |
78 read_cb.Run(kOk, ::media::DecoderBuffer::CreateEOSBuffer()); | |
79 return; | |
80 } | |
81 | |
82 scoped_refptr<::media::DecoderBuffer> buffer(new ::media::DecoderBuffer(16)); | |
83 buffer->set_timestamp(frame_count_ * base::TimeDelta::FromMilliseconds( | |
84 kDemuxerStreamForTestFrameDuration)); | |
85 frame_count_++; | |
86 read_cb.Run(kOk, buffer); | |
87 } | |
88 | |
89 } // namespace media | |
90 } // namespace chromecast | |
OLD | NEW |