summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-11 21:54:38 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-11 21:54:38 +0000
commite66385a4b5aea92cb535d29240b1e784b970513f (patch)
treeecdf709e60a811c27560188f2c7193756d4dc8d9
parentfd2f8afe2b87c2c119f953c69ee977b4c6b8f106 (diff)
downloadchromium_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.h2
-rw-r--r--media/filters/ffmpeg_audio_decoder.cc12
-rw-r--r--media/filters/ffmpeg_common.cc7
-rw-r--r--media/filters/ffmpeg_common.h7
-rw-r--r--media/filters/ffmpeg_demuxer.cc11
-rw-r--r--media/filters/ffmpeg_demuxer.h8
-rw-r--r--media/filters/ffmpeg_demuxer_unittest.cc16
-rw-r--r--media/filters/ffmpeg_interfaces.cc18
-rw-r--r--media/filters/ffmpeg_interfaces.h33
-rw-r--r--media/filters/ffmpeg_video_decoder.cc10
-rw-r--r--media/media.gyp2
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',