Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Side by Side Diff: media/filters/decoder_base_unittest.cc

Issue 6901135: Rewriting FFmpegAudioDecoder and eliminating DecoderBase. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src
Patch Set: all good Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/filters/decoder_base.h ('k') | media/filters/ffmpeg_audio_decoder.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 <vector>
6
7 #include "base/bind.h"
8 #include "media/base/data_buffer.h"
9 #include "media/base/mock_callback.h"
10 #include "media/base/mock_filters.h"
11 #include "media/base/mock_task.h"
12 #include "media/base/pipeline.h"
13 #include "media/filters/decoder_base.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 using ::testing::_;
18 using ::testing::AnyNumber;
19 using ::testing::NotNull;
20 using ::testing::StrictMock;
21 using ::testing::WithArg;
22
23 namespace media {
24
25 class GTEST_TEST_CLASS_NAME_(DecoderBaseTest, FlowControl);
26
27 class MockDecoderCallback {
28 public:
29 MOCK_METHOD1(OnReadComplete, void(scoped_refptr<Buffer> output));
30 };
31
32 class MockDecoderImpl : public DecoderBase<MockAudioDecoder, Buffer> {
33 public:
34 explicit MockDecoderImpl(MessageLoop* message_loop)
35 : DecoderBase<MockAudioDecoder, Buffer>(message_loop) {
36 }
37
38 virtual ~MockDecoderImpl() {}
39
40 // DecoderBase implementation.
41 MOCK_METHOD3(DoInitialize,
42 void(DemuxerStream* demuxer_stream,
43 bool* success,
44 Task* done_cb));
45 MOCK_METHOD1(DoStop, void(Task* done_cb));
46 MOCK_METHOD2(DoSeek, void(base::TimeDelta time, Task* done_cb));
47 MOCK_METHOD1(DoDecode, void(Buffer* input));
48
49 private:
50 FRIEND_TEST(DecoderBaseTest, FlowControl);
51
52 DISALLOW_COPY_AND_ASSIGN(MockDecoderImpl);
53 };
54
55 ACTION(Initialize) {
56 base::ScopedTaskRunner done_runner(arg2);
57 *arg1 = true;
58 }
59
60 ACTION_P(SaveDecodeRequest, list) {
61 scoped_refptr<Buffer> buffer(arg0);
62 list->push_back(buffer);
63 }
64
65 ACTION(CompleteDemuxRequest) {
66 arg0.Run(new DataBuffer(0));
67 }
68
69 // Test the flow control of decoder base by the following sequence of actions:
70 // - Read() -> DecoderStream
71 // \ Read() -> DemuxerStream
72 // - Read() -> DecoderBase
73 // \ Read() -> DemixerStream
74 // - ReadCallback() -> DecoderBase
75 // \ DoDecode() -> Decoder
76 // - ReadCallback() -> DecoderBase
77 // \ DoDecode() -> Decoder
78 // - DecodeCallback() -> DecoderBase
79 // \ ReadCallback() -> client
80 // - DecodeCallback() -> DecoderBase
81 // \ ReadCallback() -> client
82 TEST(DecoderBaseTest, FlowControl) {
83 MessageLoop message_loop;
84 scoped_refptr<MockDecoderImpl> decoder(new MockDecoderImpl(&message_loop));
85
86 MockDecoderCallback read_callback;
87 decoder->set_consume_audio_samples_callback(
88 base::Bind(&MockDecoderCallback::OnReadComplete,
89 base::Unretained(&read_callback)));
90
91 scoped_refptr<MockDemuxerStream> demuxer_stream(new MockDemuxerStream());
92 MockStatisticsCallback stats_callback_object;
93 EXPECT_CALL(stats_callback_object, OnStatistics(_))
94 .Times(AnyNumber());
95
96 // Initialize.
97 EXPECT_CALL(*decoder, DoInitialize(NotNull(), NotNull(), NotNull()))
98 .WillOnce(Initialize());
99 decoder->Initialize(demuxer_stream.get(), NewExpectedCallback(),
100 NewCallback(&stats_callback_object,
101 &MockStatisticsCallback::OnStatistics));
102 message_loop.RunAllPending();
103
104 // Read.
105 std::vector<scoped_refptr<Buffer> > decode_requests;
106 EXPECT_CALL(*demuxer_stream, Read(_))
107 .Times(2)
108 .WillRepeatedly(CompleteDemuxRequest());
109 EXPECT_CALL(*decoder, DoDecode(NotNull()))
110 .Times(2)
111 .WillRepeatedly(SaveDecodeRequest(&decode_requests));
112 scoped_refptr<DataBuffer> output;
113 decoder->PostReadTaskHack(output);
114 decoder->PostReadTaskHack(output);
115 message_loop.RunAllPending();
116
117 // Fulfill the decode request.
118 EXPECT_CALL(read_callback, OnReadComplete(_)).Times(2);
119 PipelineStatistics statistics;
120 for (size_t i = 0; i < decode_requests.size(); ++i) {
121 decoder->EnqueueResult(new DataBuffer(0));
122 decoder->OnDecodeComplete(statistics);
123 }
124 decode_requests.clear();
125 message_loop.RunAllPending();
126
127 // Stop.
128 EXPECT_CALL(*decoder, DoStop(_))
129 .WillOnce(WithArg<0>(InvokeRunnable()));
130 decoder->Stop(NewExpectedCallback());
131 message_loop.RunAllPending();
132 }
133
134 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/decoder_base.h ('k') | media/filters/ffmpeg_audio_decoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698