| Index: media/filters/chunk_demuxer.cc
|
| diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc
|
| index dc5e2f9642b80df8acdbf7643a391ea1c228cff7..afce1743d5aea87f3b7b0e21a5d57c276ef302a5 100644
|
| --- a/media/filters/chunk_demuxer.cc
|
| +++ b/media/filters/chunk_demuxer.cc
|
| @@ -10,196 +10,16 @@
|
| #include "base/bind.h"
|
| #include "base/callback_helpers.h"
|
| #include "base/location.h"
|
| -#include "base/logging.h"
|
| #include "base/message_loop_proxy.h"
|
| -#include "base/string_number_conversions.h"
|
| -#include "base/string_util.h"
|
| #include "media/base/audio_decoder_config.h"
|
| #include "media/base/stream_parser_buffer.h"
|
| #include "media/base/video_decoder_config.h"
|
| -#if defined(GOOGLE_CHROME_BUILD) || defined(USE_PROPRIETARY_CODECS)
|
| -#include "media/mp4/es_descriptor.h"
|
| -#include "media/mp4/mp4_stream_parser.h"
|
| -#endif
|
| -#include "media/webm/webm_stream_parser.h"
|
| +#include "media/filters/stream_parser_factory.h"
|
|
|
| using base::TimeDelta;
|
|
|
| namespace media {
|
|
|
| -struct CodecInfo {
|
| - const char* pattern;
|
| - DemuxerStream::Type type;
|
| -};
|
| -
|
| -typedef StreamParser* (*ParserFactoryFunction)(
|
| - const std::vector<std::string>& codecs, const LogCB& log_cb);
|
| -
|
| -struct SupportedTypeInfo {
|
| - const char* type;
|
| - const ParserFactoryFunction factory_function;
|
| - const CodecInfo** codecs;
|
| -};
|
| -
|
| -static const CodecInfo kVP8CodecInfo = { "vp8", DemuxerStream::VIDEO };
|
| -static const CodecInfo kVorbisCodecInfo = { "vorbis", DemuxerStream::AUDIO };
|
| -
|
| -static const CodecInfo* kVideoWebMCodecs[] = {
|
| - &kVP8CodecInfo,
|
| - &kVorbisCodecInfo,
|
| - NULL
|
| -};
|
| -
|
| -static const CodecInfo* kAudioWebMCodecs[] = {
|
| - &kVorbisCodecInfo,
|
| - NULL
|
| -};
|
| -
|
| -static StreamParser* BuildWebMParser(const std::vector<std::string>& codecs,
|
| - const LogCB& log_cb) {
|
| - return new WebMStreamParser();
|
| -}
|
| -
|
| -#if defined(GOOGLE_CHROME_BUILD) || defined(USE_PROPRIETARY_CODECS)
|
| -static const CodecInfo kH264CodecInfo = { "avc1.*", DemuxerStream::VIDEO };
|
| -static const CodecInfo kMPEG4AACCodecInfo = {
|
| - "mp4a.40.*", DemuxerStream::AUDIO
|
| -};
|
| -
|
| -static const CodecInfo kMPEG2AACLCCodecInfo = {
|
| - "mp4a.67", DemuxerStream::AUDIO
|
| -};
|
| -
|
| -static const CodecInfo* kVideoMP4Codecs[] = {
|
| - &kH264CodecInfo,
|
| - &kMPEG4AACCodecInfo,
|
| - &kMPEG2AACLCCodecInfo,
|
| - NULL
|
| -};
|
| -
|
| -static const CodecInfo* kAudioMP4Codecs[] = {
|
| - &kMPEG4AACCodecInfo,
|
| - &kMPEG2AACLCCodecInfo,
|
| - NULL
|
| -};
|
| -
|
| -// AAC Object Type IDs that Chrome supports.
|
| -static const int kAACLCObjectType = 2;
|
| -static const int kAACSBRObjectType = 5;
|
| -
|
| -static StreamParser* BuildMP4Parser(const std::vector<std::string>& codecs,
|
| - const LogCB& log_cb) {
|
| - std::set<int> audio_object_types;
|
| - bool has_sbr = false;
|
| - for (size_t i = 0; i < codecs.size(); ++i) {
|
| - if (MatchPattern(codecs[i], kMPEG2AACLCCodecInfo.pattern)) {
|
| - audio_object_types.insert(mp4::kISO_13818_7_AAC_LC);
|
| - } else if (MatchPattern(codecs[i], kMPEG4AACCodecInfo.pattern)) {
|
| - std::vector<std::string> tokens;
|
| - int audio_object_type;
|
| - if (Tokenize(codecs[i], ".", &tokens) != 3 ||
|
| - !base::HexStringToInt(tokens[2], &audio_object_type)) {
|
| - MEDIA_LOG(log_cb) << "Malformed mimetype codec '" << codecs[i] << "'";
|
| - return NULL;
|
| - }
|
| -
|
| - if (audio_object_type != kAACLCObjectType &&
|
| - audio_object_type != kAACSBRObjectType) {
|
| - MEDIA_LOG(log_cb) << "Unsupported audio object type "
|
| - << "0x" << std::hex << audio_object_type
|
| - << " in codec '" << codecs[i] << "'";
|
| - return NULL;
|
| - }
|
| -
|
| - audio_object_types.insert(mp4::kISO_14496_3);
|
| -
|
| - if (audio_object_type == kAACSBRObjectType) {
|
| - has_sbr = true;
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -
|
| - return new mp4::MP4StreamParser(audio_object_types, has_sbr);
|
| -}
|
| -#endif
|
| -
|
| -static const SupportedTypeInfo kSupportedTypeInfo[] = {
|
| - { "video/webm", &BuildWebMParser, kVideoWebMCodecs },
|
| - { "audio/webm", &BuildWebMParser, kAudioWebMCodecs },
|
| -#if defined(GOOGLE_CHROME_BUILD) || defined(USE_PROPRIETARY_CODECS)
|
| - { "video/mp4", &BuildMP4Parser, kVideoMP4Codecs },
|
| - { "audio/mp4", &BuildMP4Parser, kAudioMP4Codecs },
|
| -#endif
|
| -};
|
| -
|
| -// Checks to see if the specified |type| and |codecs| list are supported.
|
| -// Returns true if |type| and all codecs listed in |codecs| are supported.
|
| -// |factory_function| contains a function that can build a StreamParser
|
| -// for this type.
|
| -// |has_audio| is true if an audio codec was specified.
|
| -// |has_video| is true if a video codec was specified.
|
| -// Returns false otherwise. The values of |factory_function|, |has_audio|,
|
| -// and |has_video| are undefined.
|
| -static bool IsSupported(const std::string& type,
|
| - std::vector<std::string>& codecs,
|
| - const LogCB& log_cb,
|
| - ParserFactoryFunction* factory_function,
|
| - bool* has_audio,
|
| - bool* has_video) {
|
| - *factory_function = NULL;
|
| - *has_audio = false;
|
| - *has_video = false;
|
| -
|
| - // Search for the SupportedTypeInfo for |type|.
|
| - for (size_t i = 0; i < arraysize(kSupportedTypeInfo); ++i) {
|
| - const SupportedTypeInfo& type_info = kSupportedTypeInfo[i];
|
| - if (type == type_info.type) {
|
| - // Make sure all the codecs specified in |codecs| are
|
| - // in the supported type info.
|
| - for (size_t j = 0; j < codecs.size(); ++j) {
|
| - // Search the type info for a match.
|
| - bool found_codec = false;
|
| - DemuxerStream::Type codec_type = DemuxerStream::UNKNOWN;
|
| -
|
| - for (int k = 0; type_info.codecs[k]; ++k) {
|
| - if (MatchPattern(codecs[j], type_info.codecs[k]->pattern)) {
|
| - found_codec = true;
|
| - codec_type = type_info.codecs[k]->type;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - if (!found_codec) {
|
| - MEDIA_LOG(log_cb) << "Codec '" << codecs[j]
|
| - <<"' is not supported for '" << type << "'";
|
| - return false;
|
| - }
|
| -
|
| - switch (codec_type) {
|
| - case DemuxerStream::AUDIO:
|
| - *has_audio = true;
|
| - break;
|
| - case DemuxerStream::VIDEO:
|
| - *has_video = true;
|
| - break;
|
| - default:
|
| - MEDIA_LOG(log_cb) << "Unsupported codec type '"<< codec_type
|
| - << "' for " << codecs[j];
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - *factory_function = type_info.factory_function;
|
| -
|
| - // All codecs were supported by this |type|.
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - // |type| didn't match any of the supported types.
|
| - return false;
|
| -}
|
|
|
| class ChunkDemuxerStream : public DemuxerStream {
|
| public:
|
| @@ -717,12 +537,12 @@ ChunkDemuxer::Status ChunkDemuxer::AddId(const std::string& id,
|
|
|
| bool has_audio = false;
|
| bool has_video = false;
|
| - ParserFactoryFunction factory_function = NULL;
|
| - std::string error;
|
| - if (!IsSupported(type, codecs, log_cb_, &factory_function, &has_audio,
|
| - &has_video)) {
|
| - return kNotSupported;
|
| - }
|
| + scoped_ptr<media::StreamParser> stream_parser(
|
| + StreamParserFactory::Create(type, codecs, log_cb_,
|
| + &has_audio, &has_video));
|
| +
|
| + if (!stream_parser)
|
| + return ChunkDemuxer::kNotSupported;
|
|
|
| if ((has_audio && !source_id_audio_.empty()) ||
|
| (has_video && !source_id_video_.empty()))
|
| @@ -731,10 +551,6 @@ ChunkDemuxer::Status ChunkDemuxer::AddId(const std::string& id,
|
| StreamParser::NewBuffersCB audio_cb;
|
| StreamParser::NewBuffersCB video_cb;
|
|
|
| - scoped_ptr<StreamParser> stream_parser(factory_function(codecs, log_cb_));
|
| - if (!stream_parser)
|
| - return kNotSupported;
|
| -
|
| if (has_audio) {
|
| source_id_audio_ = id;
|
| audio_cb = base::Bind(&ChunkDemuxer::OnAudioBuffers,
|
|
|