summaryrefslogtreecommitdiffstats
path: root/media/ffmpeg
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-27 00:43:19 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-27 00:43:19 +0000
commitfbf03889bb066ffa0b99c58b60680ff73acdebda (patch)
treefba6df9c448e2309e9828b5e9a1b5a3991cbd062 /media/ffmpeg
parent137e0863a23adcf500ecb9c7de67d83adbd6f747 (diff)
downloadchromium_src-fbf03889bb066ffa0b99c58b60680ff73acdebda.zip
chromium_src-fbf03889bb066ffa0b99c58b60680ff73acdebda.tar.gz
chromium_src-fbf03889bb066ffa0b99c58b60680ff73acdebda.tar.bz2
Remove DemuxerStream::GetAVStream() once and for all.
We now use AudioDecoderConfig and VideoDecoderConfig to pass decoder initialization information. Review URL: http://codereview.chromium.org/8341033 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@107494 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/ffmpeg')
-rw-r--r--media/ffmpeg/ffmpeg_common.cc146
-rw-r--r--media/ffmpeg/ffmpeg_common.h17
2 files changed, 100 insertions, 63 deletions
diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc
index c7089c0..1b8a81c 100644
--- a/media/ffmpeg/ffmpeg_common.cc
+++ b/media/ffmpeg/ffmpeg_common.cc
@@ -83,6 +83,48 @@ static CodecID AudioCodecToCodecID(AudioCodec audio_codec,
return CODEC_ID_NONE;
}
+static VideoCodec CodecIDToVideoCodec(CodecID codec_id) {
+ switch (codec_id) {
+ case CODEC_ID_VC1:
+ return kCodecVC1;
+ case CODEC_ID_H264:
+ return kCodecH264;
+ case CODEC_ID_THEORA:
+ return kCodecTheora;
+ case CODEC_ID_MPEG2VIDEO:
+ return kCodecMPEG2;
+ case CODEC_ID_MPEG4:
+ return kCodecMPEG4;
+ case CODEC_ID_VP8:
+ return kCodecVP8;
+ default:
+ NOTREACHED();
+ }
+ return kUnknownVideoCodec;
+}
+
+static CodecID VideoCodecToCodecID(VideoCodec video_codec) {
+ switch (video_codec) {
+ case kUnknownVideoCodec:
+ return CODEC_ID_NONE;
+ case kCodecVC1:
+ return CODEC_ID_VC1;
+ case kCodecH264:
+ return CODEC_ID_H264;
+ case kCodecTheora:
+ return CODEC_ID_THEORA;
+ case kCodecMPEG2:
+ return CODEC_ID_MPEG2VIDEO;
+ case kCodecMPEG4:
+ return CODEC_ID_MPEG4;
+ case kCodecVP8:
+ return CODEC_ID_VP8;
+ default:
+ NOTREACHED();
+ }
+ return CODEC_ID_NONE;
+}
+
void AVCodecContextToAudioDecoderConfig(
const AVCodecContext* codec_context,
AudioDecoderConfig* config) {
@@ -144,46 +186,53 @@ void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config,
}
}
-VideoCodec CodecIDToVideoCodec(CodecID codec_id) {
- switch (codec_id) {
- case CODEC_ID_VC1:
- return kCodecVC1;
- case CODEC_ID_H264:
- return kCodecH264;
- case CODEC_ID_THEORA:
- return kCodecTheora;
- case CODEC_ID_MPEG2VIDEO:
- return kCodecMPEG2;
- case CODEC_ID_MPEG4:
- return kCodecMPEG4;
- case CODEC_ID_VP8:
- return kCodecVP8;
- default:
- NOTREACHED();
- }
- return kUnknownVideoCodec;
+void AVStreamToVideoDecoderConfig(
+ const AVStream* stream,
+ VideoDecoderConfig* config) {
+ gfx::Size coded_size(stream->codec->coded_width, stream->codec->coded_height);
+
+ // TODO(vrk): This assumes decoded frame data starts at (0, 0), which is true
+ // for now, but may not always be true forever. Fix this in the future.
+ gfx::Rect visible_rect(stream->codec->width, stream->codec->height);
+
+ AVRational aspect_ratio = { 1, 1 };
+ if (stream->sample_aspect_ratio.num)
+ aspect_ratio = stream->sample_aspect_ratio;
+ else if (stream->codec->sample_aspect_ratio.num)
+ aspect_ratio = stream->codec->sample_aspect_ratio;
+
+ config->Initialize(CodecIDToVideoCodec(stream->codec->codec_id),
+ PixelFormatToVideoFormat(stream->codec->pix_fmt),
+ coded_size, visible_rect,
+ stream->r_frame_rate.num,
+ stream->r_frame_rate.den,
+ aspect_ratio.num,
+ aspect_ratio.den,
+ stream->codec->extradata,
+ stream->codec->extradata_size);
}
-CodecID VideoCodecToCodecID(VideoCodec video_codec) {
- switch (video_codec) {
- case kUnknownVideoCodec:
- return CODEC_ID_NONE;
- case kCodecVC1:
- return CODEC_ID_VC1;
- case kCodecH264:
- return CODEC_ID_H264;
- case kCodecTheora:
- return CODEC_ID_THEORA;
- case kCodecMPEG2:
- return CODEC_ID_MPEG2VIDEO;
- case kCodecMPEG4:
- return CODEC_ID_MPEG4;
- case kCodecVP8:
- return CODEC_ID_VP8;
- default:
- NOTREACHED();
+void VideoDecoderConfigToAVCodecContext(
+ const VideoDecoderConfig& config,
+ AVCodecContext* codec_context) {
+ codec_context->codec_type = AVMEDIA_TYPE_VIDEO;
+ codec_context->codec_id = VideoCodecToCodecID(config.codec());
+ codec_context->coded_width = config.coded_size().width();
+ codec_context->coded_height = config.coded_size().height();
+ codec_context->pix_fmt = VideoFormatToPixelFormat(config.format());
+
+ if (config.extra_data()) {
+ codec_context->extradata_size = config.extra_data_size();
+ codec_context->extradata = reinterpret_cast<uint8_t*>(
+ av_malloc(config.extra_data_size() + FF_INPUT_BUFFER_PADDING_SIZE));
+ memcpy(codec_context->extradata, config.extra_data(),
+ config.extra_data_size());
+ memset(codec_context->extradata + config.extra_data_size(), '\0',
+ FF_INPUT_BUFFER_PADDING_SIZE);
+ } else {
+ codec_context->extradata = NULL;
+ codec_context->extradata_size = 0;
}
- return CODEC_ID_NONE;
}
ChannelLayout ChannelLayoutToChromeChannelLayout(int64_t layout,
@@ -255,27 +304,14 @@ PixelFormat VideoFormatToPixelFormat(VideoFrame::Format video_format) {
return PIX_FMT_NONE;
}
-base::TimeDelta GetFrameDuration(AVStream* stream) {
- AVRational time_base = { stream->r_frame_rate.den, stream->r_frame_rate.num };
+base::TimeDelta GetFrameDuration(const VideoDecoderConfig& config) {
+ AVRational time_base = {
+ config.frame_rate_denominator(),
+ config.frame_rate_numerator()
+ };
return ConvertFromTimeBase(time_base, 1);
}
-gfx::Size GetNaturalSize(AVStream* stream) {
- double aspect_ratio = 1.0;
-
- if (stream->sample_aspect_ratio.num)
- aspect_ratio = av_q2d(stream->sample_aspect_ratio);
- else if (stream->codec->sample_aspect_ratio.num)
- aspect_ratio = av_q2d(stream->codec->sample_aspect_ratio);
-
- int height = stream->codec->height;
- int width = floor(stream->codec->width * aspect_ratio + 0.5);
-
- // An even width makes things easier for YV12 and appears to be the behavior
- // expected by WebKit layout tests.
- return gfx::Size(width & ~1, height);
-}
-
void DestroyAVFormatContext(AVFormatContext* format_context) {
DCHECK(format_context);
diff --git a/media/ffmpeg/ffmpeg_common.h b/media/ffmpeg/ffmpeg_common.h
index 8808f45..bb01f4f 100644
--- a/media/ffmpeg/ffmpeg_common.h
+++ b/media/ffmpeg/ffmpeg_common.h
@@ -74,8 +74,12 @@ void AudioDecoderConfigToAVCodecContext(
const AudioDecoderConfig& config,
AVCodecContext* codec_context);
-VideoCodec CodecIDToVideoCodec(CodecID codec_id);
-CodecID VideoCodecToCodecID(VideoCodec video_codec);
+void AVStreamToVideoDecoderConfig(
+ const AVStream* stream,
+ VideoDecoderConfig* config);
+void VideoDecoderConfigToAVCodecContext(
+ const VideoDecoderConfig& config,
+ AVCodecContext* codec_context);
// Converts FFmpeg's channel layout to chrome's ChannelLayout. |channels| can
// be used when FFmpeg's channel layout is not informative in order to make a
@@ -89,12 +93,9 @@ VideoFrame::Format PixelFormatToVideoFormat(PixelFormat pixel_format);
// Converts video formats to its corresponding FFmpeg's pixel formats.
PixelFormat VideoFormatToPixelFormat(VideoFrame::Format video_format);
-// Calculates duration of one frame in the |stream| based on its frame rate.
-base::TimeDelta GetFrameDuration(AVStream* stream);
-
-// Calculates the natural width and height of the video using the video's
-// encoded dimensions and sample_aspect_ratio.
-gfx::Size GetNaturalSize(AVStream* stream);
+// Calculates the duration of one frame based on the frame rate specified by
+// |config|.
+base::TimeDelta GetFrameDuration(const VideoDecoderConfig& config);
// Closes & destroys all AVStreams in the context and then closes &
// destroys the AVFormatContext.