| Index: media/filters/ffmpeg_demuxer.cc
|
| ===================================================================
|
| --- media/filters/ffmpeg_demuxer.cc (revision 12463)
|
| +++ media/filters/ffmpeg_demuxer.cc (working copy)
|
| @@ -49,39 +49,40 @@
|
| // FFmpegDemuxerStream
|
| //
|
| FFmpegDemuxerStream::FFmpegDemuxerStream(FFmpegDemuxer* demuxer,
|
| - const AVStream& stream)
|
| - : demuxer_(demuxer) {
|
| + AVStream* stream)
|
| + : demuxer_(demuxer),
|
| + av_stream_(stream) {
|
| DCHECK(demuxer_);
|
|
|
| // Determine our media format.
|
| - switch (stream.codec->codec_type) {
|
| + switch (stream->codec->codec_type) {
|
| case CODEC_TYPE_AUDIO:
|
| media_format_.SetAsString(MediaFormat::kMimeType,
|
| mime_type::kFFmpegAudio);
|
| media_format_.SetAsInteger(MediaFormat::kChannels,
|
| - stream.codec->channels);
|
| + stream->codec->channels);
|
| media_format_.SetAsInteger(MediaFormat::kSampleRate,
|
| - stream.codec->sample_rate);
|
| + stream->codec->sample_rate);
|
| break;
|
| case CODEC_TYPE_VIDEO:
|
| media_format_.SetAsString(MediaFormat::kMimeType,
|
| mime_type::kFFmpegVideo);
|
| media_format_.SetAsInteger(MediaFormat::kHeight,
|
| - stream.codec->height);
|
| + stream->codec->height);
|
| media_format_.SetAsInteger(MediaFormat::kWidth,
|
| - stream.codec->width);
|
| + stream->codec->width);
|
| break;
|
| default:
|
| NOTREACHED();
|
| break;
|
| }
|
| - int codec_id = static_cast<int>(stream.codec->codec_id);
|
| + int codec_id = static_cast<int>(stream->codec->codec_id);
|
| media_format_.SetAsInteger(kFFmpegCodecID, codec_id);
|
|
|
| // Calculate the time base and duration in microseconds.
|
| - int64 time_base_us = static_cast<int64>(av_q2d(stream.time_base) *
|
| + int64 time_base_us = static_cast<int64>(av_q2d(stream->time_base) *
|
| base::Time::kMicrosecondsPerSecond);
|
| - int64 duration_us = static_cast<int64>(time_base_us * stream.duration);
|
| + int64 duration_us = static_cast<int64>(time_base_us * stream->duration);
|
| time_base_ = base::TimeDelta::FromMicroseconds(time_base_us);
|
| duration_ = base::TimeDelta::FromMicroseconds(duration_us);
|
| }
|
| @@ -91,6 +92,20 @@
|
| // should get released.
|
| }
|
|
|
| +// 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())) {
|
| + interface_ptr = this;
|
| + }
|
| + return interface_ptr;
|
| +}
|
| +
|
| bool FFmpegDemuxerStream::HasPendingReads() {
|
| AutoLock auto_lock(lock_);
|
| return !output_queue_.empty();
|
| @@ -158,10 +173,6 @@
|
| if (format_context_) {
|
| av_free(format_context_);
|
| }
|
| - while (!streams_.empty()) {
|
| - delete streams_.back();
|
| - streams_.pop_back();
|
| - }
|
| }
|
|
|
| void FFmpegDemuxer::ScheduleDemux() {
|
| @@ -215,7 +226,7 @@
|
| if (codec_type == CODEC_TYPE_AUDIO || codec_type == CODEC_TYPE_VIDEO) {
|
| AVStream* stream = format_context_->streams[i];
|
| FFmpegDemuxerStream* demuxer_stream
|
| - = new FFmpegDemuxerStream(this, *stream);
|
| + = new FFmpegDemuxerStream(this, stream);
|
| DCHECK(demuxer_stream);
|
| streams_.push_back(demuxer_stream);
|
| max_duration = std::max(max_duration, demuxer_stream->duration());
|
| @@ -237,10 +248,10 @@
|
| return streams_.size();
|
| }
|
|
|
| -DemuxerStream* FFmpegDemuxer::GetStream(int stream) {
|
| +scoped_refptr<DemuxerStream> FFmpegDemuxer::GetStream(int stream) {
|
| DCHECK(stream >= 0);
|
| DCHECK(stream < static_cast<int>(streams_.size()));
|
| - return streams_[stream];
|
| + return streams_[stream].get();
|
| }
|
|
|
| void FFmpegDemuxer::Demux() {
|
|
|