OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/base_paths.h" | 5 #include "base/base_paths.h" |
6 #include "base/bind.h" | 6 #include "base/bind.h" |
7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
8 #include "base/path_service.h" | 8 #include "base/path_service.h" |
9 #include "media/base/media.h" | 9 #include "media/base/media.h" |
10 #include "media/base/mock_callback.h" | 10 #include "media/base/mock_callback.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 codecs_[VIDEO].width = 320; | 50 codecs_[VIDEO].width = 320; |
51 codecs_[VIDEO].height = 240; | 51 codecs_[VIDEO].height = 240; |
52 | 52 |
53 codecs_[AUDIO].codec_type = AVMEDIA_TYPE_AUDIO; | 53 codecs_[AUDIO].codec_type = AVMEDIA_TYPE_AUDIO; |
54 codecs_[AUDIO].codec_id = CODEC_ID_VORBIS; | 54 codecs_[AUDIO].codec_id = CODEC_ID_VORBIS; |
55 codecs_[AUDIO].channels = 2; | 55 codecs_[AUDIO].channels = 2; |
56 codecs_[AUDIO].sample_rate = 44100; | 56 codecs_[AUDIO].sample_rate = 44100; |
57 } | 57 } |
58 | 58 |
59 virtual ~ChunkDemuxerTest() { | 59 virtual ~ChunkDemuxerTest() { |
60 if (demuxer_.get()) | 60 ShutdownDemuxer(); |
61 demuxer_->Shutdown(); | |
62 if (format_context_.streams) { | |
63 delete[] format_context_.streams; | |
64 format_context_.streams = NULL; | |
65 format_context_.nb_streams = 0; | |
66 } | |
67 } | 61 } |
68 | 62 |
69 void ReadFile(const std::string& name, scoped_array<uint8>* buffer, | 63 void ReadFile(const std::string& name, scoped_array<uint8>* buffer, |
70 int* size) { | 64 int* size) { |
71 FilePath file_path; | 65 FilePath file_path; |
72 EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &file_path)); | 66 EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &file_path)); |
73 file_path = file_path.Append(FILE_PATH_LITERAL("media")) | 67 file_path = file_path.Append(FILE_PATH_LITERAL("media")) |
74 .Append(FILE_PATH_LITERAL("test")) | 68 .Append(FILE_PATH_LITERAL("test")) |
75 .Append(FILE_PATH_LITERAL("data")) | 69 .Append(FILE_PATH_LITERAL("data")) |
76 .AppendASCII(name); | 70 .AppendASCII(name); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 memcpy(buf, audio_track_entry.get(), audio_track_entry_size); | 127 memcpy(buf, audio_track_entry.get(), audio_track_entry_size); |
134 buf += audio_track_entry_size; | 128 buf += audio_track_entry_size; |
135 } | 129 } |
136 | 130 |
137 if (has_video) { | 131 if (has_video) { |
138 memcpy(buf, video_track_entry.get(), video_track_entry_size); | 132 memcpy(buf, video_track_entry.get(), video_track_entry_size); |
139 buf += video_track_entry_size; | 133 buf += video_track_entry_size; |
140 } | 134 } |
141 } | 135 } |
142 | 136 |
143 void SetupAVFormatContext(bool has_audio, bool has_video) { | 137 void InitDemuxer(bool has_audio, bool has_video) { |
144 int i = 0; | |
145 format_context_.streams = new AVStream *[MAX_CODECS_INDEX]; | |
146 if (has_audio) { | |
147 format_context_.streams[i] = &streams_[i]; | |
148 streams_[i].codec = &codecs_[AUDIO]; | |
149 streams_[i].duration = 100; | |
150 streams_[i].time_base.den = base::Time::kMicrosecondsPerSecond; | |
151 streams_[i].time_base.num = 1; | |
152 i++; | |
153 } | |
154 | |
155 if (has_video) { | |
156 format_context_.streams[i] = &streams_[i]; | |
157 streams_[i].codec = &codecs_[VIDEO]; | |
158 streams_[i].duration = 100; | |
159 streams_[i].time_base.den = base::Time::kMicrosecondsPerSecond; | |
160 streams_[i].time_base.num = 1; | |
161 i++; | |
162 } | |
163 | |
164 format_context_.nb_streams = i; | |
165 } | |
166 | |
167 void InitDemuxer(bool has_audio, bool has_video) { | |
168 EXPECT_CALL(mock_ffmpeg_, AVOpenInputFile(_, _, NULL, 0, NULL)) | 138 EXPECT_CALL(mock_ffmpeg_, AVOpenInputFile(_, _, NULL, 0, NULL)) |
169 .WillOnce(DoAll(SetArgumentPointee<0>(&format_context_), | 139 .WillOnce(DoAll(SetArgumentPointee<0>(&format_context_), |
170 Return(0))); | 140 Return(0))); |
171 | 141 |
172 EXPECT_CALL(mock_ffmpeg_, AVFindStreamInfo(&format_context_)) | 142 EXPECT_CALL(mock_ffmpeg_, AVFindStreamInfo(&format_context_)) |
173 .WillOnce(Return(0)); | 143 .WillOnce(Return(0)); |
174 | 144 |
175 EXPECT_CALL(mock_ffmpeg_, AVCloseInputFile(&format_context_)); | 145 EXPECT_CALL(mock_ffmpeg_, AVCloseInputFile(&format_context_)); |
176 | 146 |
177 EXPECT_CALL(mock_ffmpeg_, AVRegisterLockManager(_)) | 147 EXPECT_CALL(mock_ffmpeg_, AVRegisterLockManager(_)) |
178 .WillRepeatedly(Return(0)); | 148 .WillRepeatedly(Return(0)); |
179 | 149 |
180 scoped_array<uint8> info_tracks; | 150 scoped_array<uint8> info_tracks; |
181 int info_tracks_size = 0; | 151 int info_tracks_size = 0; |
182 CreateInfoTracks(has_audio, has_video, &info_tracks, &info_tracks_size); | 152 CreateInfoTracks(has_audio, has_video, &info_tracks, &info_tracks_size); |
183 | 153 |
184 SetupAVFormatContext(has_audio, has_video); | 154 SetupAVFormatContext(has_audio, has_video); |
185 | 155 |
186 EXPECT_EQ(demuxer_->Init(info_tracks.get(), info_tracks_size), | 156 EXPECT_EQ(demuxer_->Init(info_tracks.get(), info_tracks_size), |
187 has_audio || has_video); | 157 has_audio || has_video); |
188 } | 158 } |
189 | 159 |
| 160 void ShutdownDemuxer() { |
| 161 if (demuxer_) { |
| 162 demuxer_->Shutdown(); |
| 163 } |
| 164 |
| 165 if (format_context_.streams) { |
| 166 delete[] format_context_.streams; |
| 167 format_context_.streams = NULL; |
| 168 format_context_.nb_streams = 0; |
| 169 } |
| 170 } |
| 171 |
190 void AddSimpleBlock(ClusterBuilder* cb, int track_num, int64 timecode) { | 172 void AddSimpleBlock(ClusterBuilder* cb, int track_num, int64 timecode) { |
191 uint8 data[] = { 0x00 }; | 173 uint8 data[] = { 0x00 }; |
192 cb->AddSimpleBlock(track_num, timecode, 0, data, sizeof(data)); | 174 cb->AddSimpleBlock(track_num, timecode, 0, data, sizeof(data)); |
193 } | 175 } |
194 | 176 |
195 MOCK_METHOD1(Checkpoint, void(int id)); | 177 MOCK_METHOD1(Checkpoint, void(int id)); |
196 | 178 |
197 MockFFmpeg mock_ffmpeg_; | 179 MockFFmpeg mock_ffmpeg_; |
198 | 180 |
199 AVFormatContext format_context_; | 181 AVFormatContext format_context_; |
200 AVCodecContext codecs_[MAX_CODECS_INDEX]; | 182 AVCodecContext codecs_[MAX_CODECS_INDEX]; |
201 AVStream streams_[MAX_CODECS_INDEX]; | 183 AVStream streams_[MAX_CODECS_INDEX]; |
202 | 184 |
203 scoped_refptr<ChunkDemuxer> demuxer_; | 185 scoped_refptr<ChunkDemuxer> demuxer_; |
204 | 186 |
205 private: | 187 private: |
| 188 void SetupAVFormatContext(bool has_audio, bool has_video) { |
| 189 int i = 0; |
| 190 format_context_.streams = new AVStream*[MAX_CODECS_INDEX]; |
| 191 if (has_audio) { |
| 192 format_context_.streams[i] = &streams_[i]; |
| 193 streams_[i].codec = &codecs_[AUDIO]; |
| 194 streams_[i].duration = 100; |
| 195 streams_[i].time_base.den = base::Time::kMicrosecondsPerSecond; |
| 196 streams_[i].time_base.num = 1; |
| 197 i++; |
| 198 } |
| 199 |
| 200 if (has_video) { |
| 201 format_context_.streams[i] = &streams_[i]; |
| 202 streams_[i].codec = &codecs_[VIDEO]; |
| 203 streams_[i].duration = 100; |
| 204 streams_[i].time_base.den = base::Time::kMicrosecondsPerSecond; |
| 205 streams_[i].time_base.num = 1; |
| 206 i++; |
| 207 } |
| 208 |
| 209 format_context_.nb_streams = i; |
| 210 } |
| 211 |
206 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); | 212 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); |
207 }; | 213 }; |
208 | 214 |
209 TEST_F(ChunkDemuxerTest, TestInit) { | 215 TEST_F(ChunkDemuxerTest, TestInit) { |
210 // Test no streams, audio-only, video-only, and audio & video scenarios. | 216 // Test no streams, audio-only, video-only, and audio & video scenarios. |
211 for (int i = 0; i < 4; i++) { | 217 for (int i = 0; i < 4; i++) { |
212 bool has_audio = (i & 0x1) != 0; | 218 bool has_audio = (i & 0x1) != 0; |
213 bool has_video = (i & 0x2) != 0; | 219 bool has_video = (i & 0x2) != 0; |
214 | 220 |
215 demuxer_ = new ChunkDemuxer(); | 221 demuxer_ = new ChunkDemuxer(); |
216 InitDemuxer(has_audio, has_video); | 222 InitDemuxer(has_audio, has_video); |
217 EXPECT_EQ(demuxer_->GetStream(DemuxerStream::AUDIO).get() != NULL, | 223 EXPECT_EQ(demuxer_->GetStream(DemuxerStream::AUDIO).get() != NULL, |
218 has_audio); | 224 has_audio); |
219 EXPECT_EQ(demuxer_->GetStream(DemuxerStream::VIDEO).get() != NULL, | 225 EXPECT_EQ(demuxer_->GetStream(DemuxerStream::VIDEO).get() != NULL, |
220 has_video); | 226 has_video); |
221 demuxer_->Shutdown(); | 227 ShutdownDemuxer(); |
222 demuxer_ = NULL; | 228 demuxer_ = NULL; |
223 } | 229 } |
224 } | 230 } |
225 | 231 |
226 // Makes sure that Seek() reports an error if Shutdown() | 232 // Makes sure that Seek() reports an error if Shutdown() |
227 // is called before the first cluster is passed to the demuxer. | 233 // is called before the first cluster is passed to the demuxer. |
228 TEST_F(ChunkDemuxerTest, TestShutdownBeforeFirstSeekCompletes) { | 234 TEST_F(ChunkDemuxerTest, TestShutdownBeforeFirstSeekCompletes) { |
229 InitDemuxer(true, true); | 235 InitDemuxer(true, true); |
230 | 236 |
231 demuxer_->Seek(base::TimeDelta::FromSeconds(0), | 237 demuxer_->Seek(base::TimeDelta::FromSeconds(0), |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
408 | 414 |
409 cb.SetClusterTimecode(5); | 415 cb.SetClusterTimecode(5); |
410 AddSimpleBlock(&cb, kAudioTrackNum, 5); | 416 AddSimpleBlock(&cb, kAudioTrackNum, 5); |
411 AddSimpleBlock(&cb, kVideoTrackNum, 7); | 417 AddSimpleBlock(&cb, kVideoTrackNum, 7); |
412 scoped_ptr<Cluster> clusterE(cb.Finish()); | 418 scoped_ptr<Cluster> clusterE(cb.Finish()); |
413 | 419 |
414 EXPECT_FALSE(demuxer_->AddData(clusterE->data(), clusterE->size())); | 420 EXPECT_FALSE(demuxer_->AddData(clusterE->data(), clusterE->size())); |
415 } | 421 } |
416 | 422 |
417 } // namespace media | 423 } // namespace media |
OLD | NEW |