diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-11 21:54:38 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-11 21:54:38 +0000 |
commit | e66385a4b5aea92cb535d29240b1e784b970513f (patch) | |
tree | ecdf709e60a811c27560188f2c7193756d4dc8d9 | |
parent | fd2f8afe2b87c2c119f953c69ee977b4c6b8f106 (diff) | |
download | chromium_src-e66385a4b5aea92cb535d29240b1e784b970513f.zip chromium_src-e66385a4b5aea92cb535d29240b1e784b970513f.tar.gz chromium_src-e66385a4b5aea92cb535d29240b1e784b970513f.tar.bz2 |
Split FFmpegDemuxerStream into a separate interface AVStreamProvider.
Pure refactor, functionality remains the same.
Review URL: http://codereview.chromium.org/122018
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18213 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | media/base/filters.h | 2 | ||||
-rw-r--r-- | media/filters/ffmpeg_audio_decoder.cc | 12 | ||||
-rw-r--r-- | media/filters/ffmpeg_common.cc | 7 | ||||
-rw-r--r-- | media/filters/ffmpeg_common.h | 7 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer.cc | 11 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer.h | 8 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer_unittest.cc | 16 | ||||
-rw-r--r-- | media/filters/ffmpeg_interfaces.cc | 18 | ||||
-rw-r--r-- | media/filters/ffmpeg_interfaces.h | 33 | ||||
-rw-r--r-- | media/filters/ffmpeg_video_decoder.cc | 10 | ||||
-rw-r--r-- | media/media.gyp | 2 |
11 files changed, 80 insertions, 46 deletions
diff --git a/media/base/filters.h b/media/base/filters.h index 3ade294..a98cd2d 100644 --- a/media/base/filters.h +++ b/media/base/filters.h @@ -167,7 +167,7 @@ class DemuxerStream : public base::RefCountedThreadSafe<DemuxerStream> { // the class returns an interface pointer and assigns the pointer to // |interface_out|. Otherwise this method returns false. template <class Interface> - bool QueryInterface(scoped_refptr<Interface>* interface_out) { + bool QueryInterface(Interface** interface_out) { void* i = QueryInterface(Interface::interface_id()); *interface_out = reinterpret_cast<Interface*>(i); return (NULL != i); diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc index 22cab1e..c9f4082 100644 --- a/media/filters/ffmpeg_audio_decoder.cc +++ b/media/filters/ffmpeg_audio_decoder.cc @@ -29,15 +29,15 @@ bool FFmpegAudioDecoder::IsMediaFormatSupported(const MediaFormat& format) { } bool FFmpegAudioDecoder::OnInitialize(DemuxerStream* demuxer_stream) { - scoped_refptr<FFmpegDemuxerStream> ffmpeg_demuxer_stream; - - // Try to obtain a reference to FFmpegDemuxer. - if (!demuxer_stream-> - QueryInterface<FFmpegDemuxerStream>(&ffmpeg_demuxer_stream)) + // Get the AVStream by querying for the provider interface. + AVStreamProvider* av_stream_provider; + if (!demuxer_stream->QueryInterface(&av_stream_provider)) { return false; + } + AVStream* av_stream = av_stream_provider->GetAVStream(); // Grab the AVStream's codec context and make sure we have sensible values. - codec_context_ = ffmpeg_demuxer_stream->av_stream()->codec; + codec_context_ = av_stream->codec; DCHECK_GT(codec_context_->channels, 0); DCHECK_GT(av_get_bits_per_sample_format(codec_context_->sample_fmt), 0); DCHECK_GT(codec_context_->sample_rate, 0); diff --git a/media/filters/ffmpeg_common.cc b/media/filters/ffmpeg_common.cc index 88dab9f..6b05d55 100644 --- a/media/filters/ffmpeg_common.cc +++ b/media/filters/ffmpeg_common.cc @@ -13,11 +13,4 @@ const char kFFmpegVideo[] = "video/x-ffmpeg"; } // namespace mime_type - -namespace interface_id { - -const char kFFmpegDemuxerStream[] = "FFmpegDemuxerStream"; - -} // namespace interface_id - } // namespace media diff --git a/media/filters/ffmpeg_common.h b/media/filters/ffmpeg_common.h index 8f1cc59..a11ab0f 100644 --- a/media/filters/ffmpeg_common.h +++ b/media/filters/ffmpeg_common.h @@ -39,13 +39,6 @@ extern const char kFFmpegVideo[]; } // namespace mime_type -namespace interface_id { - -extern const char kFFmpegDemuxerStream[]; - -} // namespace interface_id - - } // namespace media #endif // MEDIA_FILTERS_FFMPEG_COMMON_H_ diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc index 41b3314..cab3af7 100644 --- a/media/filters/ffmpeg_demuxer.cc +++ b/media/filters/ffmpeg_demuxer.cc @@ -101,15 +101,10 @@ FFmpegDemuxerStream::~FFmpegDemuxerStream() { } } -// static -const char* FFmpegDemuxerStream::interface_id() { - return interface_id::kFFmpegDemuxerStream; -} - void* FFmpegDemuxerStream::QueryInterface(const char* id) { DCHECK(id); - FFmpegDemuxerStream* interface_ptr = NULL; - if (0 == strcmp(id, interface_id())) { + AVStreamProvider* interface_ptr = NULL; + if (0 == strcmp(id, AVStreamProvider::interface_id())) { interface_ptr = this; } return interface_ptr; @@ -361,7 +356,7 @@ void FFmpegDemuxer::DemuxTask() { // additional packets. // // TODO(scherkus): fix the MP3 packet copying hack. - if (demuxer_stream->av_stream()->codec->codec_id == CODEC_ID_MP3) { + if (demuxer_stream->GetAVStream()->codec->codec_id == CODEC_ID_MP3) { scoped_ptr<AVPacket> clone(ClonePacket(packet.get())); if (!clone.get()) { NOTREACHED(); diff --git a/media/filters/ffmpeg_demuxer.h b/media/filters/ffmpeg_demuxer.h index dd9a4be..3f34b9c 100644 --- a/media/filters/ffmpeg_demuxer.h +++ b/media/filters/ffmpeg_demuxer.h @@ -28,6 +28,7 @@ #include "media/base/factory.h" #include "media/base/filters.h" #include "media/base/media_format.h" +#include "media/filters/ffmpeg_interfaces.h" // FFmpeg forward declarations. struct AVCodecContext; @@ -43,7 +44,7 @@ class FFmpegDemuxer; // Forward declaration for scoped_ptr_malloc. class ScopedPtrAVFree; -class FFmpegDemuxerStream : public DemuxerStream { +class FFmpegDemuxerStream : public DemuxerStream, public AVStreamProvider { public: // Maintains a reference to |demuxer| and initializes itself using information // inside |stream|. @@ -70,9 +71,8 @@ class FFmpegDemuxerStream : public DemuxerStream { virtual const MediaFormat& media_format(); virtual void Read(Callback1<Buffer*>::Type* read_callback); - AVStream* av_stream() const { return stream_; } - - static const char* interface_id(); + // AVStreamProvider implementation. + virtual AVStream* GetAVStream() { return stream_; } protected: virtual void* QueryInterface(const char* interface_id); diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc index 1d79bea..abe6479 100644 --- a/media/filters/ffmpeg_demuxer_unittest.cc +++ b/media/filters/ffmpeg_demuxer_unittest.cc @@ -404,26 +404,26 @@ TEST_F(FFmpegDemuxerTest, InitializeStreams) { // First stream should be video and support FFmpegDemuxerStream interface. scoped_refptr<DemuxerStream> stream = demuxer_->GetStream(0); - scoped_refptr<FFmpegDemuxerStream> ffmpeg_demuxer_stream; + AVStreamProvider* av_stream_provider = NULL; ASSERT_TRUE(stream); std::string mime_type; EXPECT_TRUE( stream->media_format().GetAsString(MediaFormat::kMimeType, &mime_type)); EXPECT_STREQ(mime_type::kFFmpegVideo, mime_type.c_str()); - EXPECT_TRUE(stream->QueryInterface(&ffmpeg_demuxer_stream)); - EXPECT_TRUE(ffmpeg_demuxer_stream); - EXPECT_EQ(&g_streams[1], ffmpeg_demuxer_stream->av_stream()); + EXPECT_TRUE(stream->QueryInterface(&av_stream_provider)); + EXPECT_TRUE(av_stream_provider); + EXPECT_EQ(&g_streams[1], av_stream_provider->GetAVStream()); // Second stream should be audio and support FFmpegDemuxerStream interface. stream = demuxer_->GetStream(1); - ffmpeg_demuxer_stream = NULL; + av_stream_provider = NULL; ASSERT_TRUE(stream); EXPECT_TRUE(stream->media_format().GetAsString(MediaFormat::kMimeType, &mime_type)); EXPECT_STREQ(mime_type::kFFmpegAudio, mime_type.c_str()); - EXPECT_TRUE(stream->QueryInterface(&ffmpeg_demuxer_stream)); - EXPECT_TRUE(ffmpeg_demuxer_stream); - EXPECT_EQ(&g_streams[2], ffmpeg_demuxer_stream->av_stream()); + EXPECT_TRUE(stream->QueryInterface(&av_stream_provider)); + EXPECT_TRUE(av_stream_provider); + EXPECT_EQ(&g_streams[2], av_stream_provider->GetAVStream()); } TEST_F(FFmpegDemuxerTest, ReadAndSeek) { diff --git a/media/filters/ffmpeg_interfaces.cc b/media/filters/ffmpeg_interfaces.cc new file mode 100644 index 0000000..a244b27 --- /dev/null +++ b/media/filters/ffmpeg_interfaces.cc @@ -0,0 +1,18 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/filters/ffmpeg_interfaces.h" + +namespace media { + +AVStreamProvider::AVStreamProvider() {} + +AVStreamProvider::~AVStreamProvider() {} + +// static +const char* AVStreamProvider::interface_id() { + return "AVStreamProvider"; +} + +} // namespace media diff --git a/media/filters/ffmpeg_interfaces.h b/media/filters/ffmpeg_interfaces.h new file mode 100644 index 0000000..c4cbe77 --- /dev/null +++ b/media/filters/ffmpeg_interfaces.h @@ -0,0 +1,33 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_FILTERS_FFMPEG_INTERFACES_H_ +#define MEDIA_FILTERS_FFMPEG_INTERFACES_H_ + +#include "base/basictypes.h" + +struct AVStream; + +namespace media { + +// Queryable interface that provides an initialized AVStream object suitable for +// decoding. +class AVStreamProvider { + public: + AVStreamProvider(); + virtual ~AVStreamProvider(); + + // AVStreamProvider interface. + virtual AVStream* GetAVStream() = 0; + + // Required by QueryInterface. + static const char* interface_id(); + + private: + DISALLOW_COPY_AND_ASSIGN(AVStreamProvider); +}; + +} // namespace media + +#endif // MEDIA_FILTERS_FFMPEG_INTERFACES_H_ diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc index d682caa..1f44091 100644 --- a/media/filters/ffmpeg_video_decoder.cc +++ b/media/filters/ffmpeg_video_decoder.cc @@ -40,12 +40,12 @@ bool FFmpegVideoDecoder::IsMediaFormatSupported(const MediaFormat& format) { } bool FFmpegVideoDecoder::OnInitialize(DemuxerStream* demuxer_stream) { - scoped_refptr<FFmpegDemuxerStream> ffmpeg_demuxer_stream; - if (!demuxer_stream->QueryInterface(&ffmpeg_demuxer_stream)) { + // Get the AVStream by querying for the provider interface. + AVStreamProvider* av_stream_provider; + if (!demuxer_stream->QueryInterface(&av_stream_provider)) { return false; } - - AVStream* av_stream = ffmpeg_demuxer_stream->av_stream(); + AVStream* av_stream = av_stream_provider->GetAVStream(); width_ = av_stream->codec->width; height_ = av_stream->codec->height; @@ -55,7 +55,7 @@ bool FFmpegVideoDecoder::OnInitialize(DemuxerStream* demuxer_stream) { media_format_.SetAsInteger(MediaFormat::kWidth, width_); media_format_.SetAsInteger(MediaFormat::kHeight, height_); - codec_context_ = ffmpeg_demuxer_stream->av_stream()->codec; + codec_context_ = av_stream->codec; codec_context_->flags2 |= CODEC_FLAG2_FAST; // Enable faster H264 decode. // Enable motion vector search (potentially slow), strong deblocking filter // for damaged macroblocks, and set our error detection sensitivity. diff --git a/media/media.gyp b/media/media.gyp index a62da2a..4091c45 100644 --- a/media/media.gyp +++ b/media/media.gyp @@ -88,6 +88,8 @@ 'filters/ffmpeg_demuxer.h', 'filters/ffmpeg_glue.cc', 'filters/ffmpeg_glue.h', + 'filters/ffmpeg_interfaces.cc', + 'filters/ffmpeg_interfaces.h', 'filters/ffmpeg_video_decoder.cc', 'filters/ffmpeg_video_decoder.h', 'filters/file_data_source.cc', |