Index: media/filters/chunk_demuxer_unittest.cc |
=================================================================== |
--- media/filters/chunk_demuxer_unittest.cc (revision 96976) |
+++ media/filters/chunk_demuxer_unittest.cc (working copy) |
@@ -2,10 +2,14 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "base/base_paths.h" |
#include "base/bind.h" |
+#include "base/file_util.h" |
+#include "base/path_service.h" |
+#include "media/base/media.h" |
#include "media/base/mock_callback.h" |
+#include "media/base/mock_ffmpeg.h" |
#include "media/base/mock_filter_host.h" |
-#include "media/base/test_data_util.h" |
#include "media/filters/chunk_demuxer.h" |
#include "media/filters/chunk_demuxer_client.h" |
#include "media/webm/cluster_builder.h" |
@@ -54,12 +58,47 @@ |
ChunkDemuxerTest() |
: client_(new MockChunkDemuxerClient()), |
demuxer_(new ChunkDemuxer(client_.get())) { |
+ memset(&format_context_, 0, sizeof(format_context_)); |
+ memset(&streams_, 0, sizeof(streams_)); |
+ memset(&codecs_, 0, sizeof(codecs_)); |
+ |
+ codecs_[VIDEO].codec_type = AVMEDIA_TYPE_VIDEO; |
+ codecs_[VIDEO].codec_id = CODEC_ID_VP8; |
+ codecs_[VIDEO].width = 320; |
+ codecs_[VIDEO].height = 240; |
+ |
+ codecs_[AUDIO].codec_type = AVMEDIA_TYPE_AUDIO; |
+ codecs_[AUDIO].codec_id = CODEC_ID_VORBIS; |
+ codecs_[AUDIO].channels = 2; |
+ codecs_[AUDIO].sample_rate = 44100; |
} |
virtual ~ChunkDemuxerTest() { |
ShutdownDemuxer(); |
} |
+ void ReadFile(const std::string& name, scoped_array<uint8>* buffer, |
+ int* size) { |
+ FilePath file_path; |
+ EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &file_path)); |
+ file_path = file_path.Append(FILE_PATH_LITERAL("media")) |
+ .Append(FILE_PATH_LITERAL("test")) |
+ .Append(FILE_PATH_LITERAL("data")) |
+ .AppendASCII(name); |
+ |
+ int64 tmp = 0; |
+ EXPECT_TRUE(file_util::GetFileSize(file_path, &tmp)); |
+ EXPECT_LT(tmp, 32768); |
+ int file_size = static_cast<int>(tmp); |
+ |
+ buffer->reset(new uint8[file_size]); |
+ EXPECT_EQ(file_size, |
+ file_util::ReadFile(file_path, |
+ reinterpret_cast<char*>(buffer->get()), |
+ file_size)); |
+ *size = file_size; |
+ } |
+ |
void CreateInfoTracks(bool has_audio, bool has_video, |
scoped_array<uint8>* buffer, int* size) { |
scoped_array<uint8> info; |
@@ -69,11 +108,11 @@ |
scoped_array<uint8> video_track_entry; |
int video_track_entry_size = 0; |
- ReadTestDataFile("webm_info_element", &info, &info_size); |
- ReadTestDataFile("webm_vorbis_track_entry", &audio_track_entry, |
- &audio_track_entry_size); |
- ReadTestDataFile("webm_vp8_track_entry", &video_track_entry, |
- &video_track_entry_size); |
+ ReadFile("webm_info_element", &info, &info_size); |
+ ReadFile("webm_vorbis_track_entry", &audio_track_entry, |
+ &audio_track_entry_size); |
+ ReadFile("webm_vp8_track_entry", &video_track_entry, |
+ &video_track_entry_size); |
int tracks_element_size = 0; |
@@ -120,10 +159,24 @@ |
} |
void AppendInfoTracks(bool has_audio, bool has_video) { |
+ EXPECT_CALL(mock_ffmpeg_, AVOpenInputFile(_, _, NULL, 0, NULL)) |
+ .WillOnce(DoAll(SetArgumentPointee<0>(&format_context_), |
+ Return(0))); |
+ |
+ EXPECT_CALL(mock_ffmpeg_, AVFindStreamInfo(&format_context_)) |
+ .WillOnce(Return(0)); |
+ |
+ EXPECT_CALL(mock_ffmpeg_, AVCloseInputFile(&format_context_)); |
+ |
+ EXPECT_CALL(mock_ffmpeg_, AVRegisterLockManager(_)) |
+ .WillRepeatedly(Return(0)); |
+ |
scoped_array<uint8> info_tracks; |
int info_tracks_size = 0; |
CreateInfoTracks(has_audio, has_video, &info_tracks, &info_tracks_size); |
+ SetupAVFormatContext(has_audio, has_video); |
+ |
AppendData(info_tracks.get(), info_tracks_size); |
} |
@@ -158,6 +211,12 @@ |
EXPECT_CALL(*client_, DemuxerClosed()); |
demuxer_->Shutdown(); |
} |
+ |
+ if (format_context_.streams) { |
+ delete[] format_context_.streams; |
+ format_context_.streams = NULL; |
+ format_context_.nb_streams = 0; |
+ } |
} |
void AddSimpleBlock(ClusterBuilder* cb, int track_num, int64 timecode) { |
@@ -167,12 +226,41 @@ |
MOCK_METHOD1(Checkpoint, void(int id)); |
+ MockFFmpeg mock_ffmpeg_; |
MockFilterHost mock_filter_host_; |
+ AVFormatContext format_context_; |
+ AVCodecContext codecs_[MAX_CODECS_INDEX]; |
+ AVStream streams_[MAX_CODECS_INDEX]; |
+ |
scoped_ptr<MockChunkDemuxerClient> client_; |
scoped_refptr<ChunkDemuxer> demuxer_; |
private: |
+ void SetupAVFormatContext(bool has_audio, bool has_video) { |
+ int i = 0; |
+ format_context_.streams = new AVStream*[MAX_CODECS_INDEX]; |
+ if (has_audio) { |
+ format_context_.streams[i] = &streams_[i]; |
+ streams_[i].codec = &codecs_[AUDIO]; |
+ streams_[i].duration = 100; |
+ streams_[i].time_base.den = base::Time::kMicrosecondsPerSecond; |
+ streams_[i].time_base.num = 1; |
+ i++; |
+ } |
+ |
+ if (has_video) { |
+ format_context_.streams[i] = &streams_[i]; |
+ streams_[i].codec = &codecs_[VIDEO]; |
+ streams_[i].duration = 100; |
+ streams_[i].time_base.den = base::Time::kMicrosecondsPerSecond; |
+ streams_[i].time_base.num = 1; |
+ i++; |
+ } |
+ |
+ format_context_.nb_streams = i; |
+ } |
+ |
DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); |
}; |