summaryrefslogtreecommitdiffstats
path: root/media/ffmpeg
diff options
context:
space:
mode:
authorannacc@chromium.org <annacc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-16 22:18:32 +0000
committerannacc@chromium.org <annacc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-16 22:18:32 +0000
commitb630cb97c620593f9c987fdad0b3271ddbf39a3e (patch)
tree21295811329d31b302e29be7e16198fdfd5bc463 /media/ffmpeg
parent99d22e8b1c2c0b6f6457147ab90ce2df98ef02d3 (diff)
downloadchromium_src-b630cb97c620593f9c987fdad0b3271ddbf39a3e.zip
chromium_src-b630cb97c620593f9c987fdad0b3271ddbf39a3e.tar.gz
chromium_src-b630cb97c620593f9c987fdad0b3271ddbf39a3e.tar.bz2
Description:
This patch gets the channel layout for surround sound channel order from ffmpeg and stores it so that chromium will be able to re-order the channels for various sound cards and OSes later. - AudioParameters gets a new field (channel_layout). - channel_layout.h stores an enum that we will use in chromium for channel values. - ffmpeg_common.h gets a new method for mapping the channel layout received from ffmpeg to an internal chromium enum value. BUG=None (though storing the channel order should help us solve some other bugs soon) TEST=media_unittests Review URL: http://codereview.chromium.org/6930039 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85541 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/ffmpeg')
-rw-r--r--media/ffmpeg/ffmpeg_common.cc45
-rw-r--r--media/ffmpeg/ffmpeg_common.h7
2 files changed, 52 insertions, 0 deletions
diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc
index 9f5eaeb..dedc40c 100644
--- a/media/ffmpeg/ffmpeg_common.cc
+++ b/media/ffmpeg/ffmpeg_common.cc
@@ -61,6 +61,51 @@ CodecID VideoCodecToCodecID(VideoCodec video_codec) {
return CODEC_ID_NONE;
}
+ChannelLayout ChannelLayoutToChromeChannelLayout(int64_t layout,
+ int channels) {
+ switch (layout) {
+ case CH_LAYOUT_MONO:
+ return CHANNEL_LAYOUT_MONO;
+ case CH_LAYOUT_STEREO:
+ return CHANNEL_LAYOUT_STEREO;
+ case CH_LAYOUT_2_1:
+ return CHANNEL_LAYOUT_2_1;
+ case CH_LAYOUT_SURROUND:
+ return CHANNEL_LAYOUT_SURROUND;
+ case CH_LAYOUT_4POINT0:
+ return CHANNEL_LAYOUT_4POINT0;
+ case CH_LAYOUT_2_2:
+ return CHANNEL_LAYOUT_2_2;
+ case CH_LAYOUT_QUAD:
+ return CHANNEL_LAYOUT_QUAD;
+ case CH_LAYOUT_5POINT0:
+ return CHANNEL_LAYOUT_5POINT0;
+ case CH_LAYOUT_5POINT1:
+ return CHANNEL_LAYOUT_5POINT1;
+ case CH_LAYOUT_5POINT0_BACK:
+ return CHANNEL_LAYOUT_5POINT0_BACK;
+ case CH_LAYOUT_5POINT1_BACK:
+ return CHANNEL_LAYOUT_5POINT1_BACK;
+ case CH_LAYOUT_7POINT0:
+ return CHANNEL_LAYOUT_7POINT0;
+ case CH_LAYOUT_7POINT1:
+ return CHANNEL_LAYOUT_7POINT1;
+ case CH_LAYOUT_7POINT1_WIDE:
+ return CHANNEL_LAYOUT_7POINT1_WIDE;
+ case CH_LAYOUT_STEREO_DOWNMIX:
+ return CHANNEL_LAYOUT_STEREO_DOWNMIX;
+ default:
+ // FFmpeg channel_layout is 0 for .wav and .mp3. We know mono and stereo
+ // from the number of channels, otherwise report errors.
+ if (channels == 1)
+ return CHANNEL_LAYOUT_MONO;
+ if (channels == 2)
+ return CHANNEL_LAYOUT_STEREO;
+ DLOG(WARNING) << "Unsupported/unencountered channel layout values";
+ return CHANNEL_LAYOUT_UNSUPPORTED;
+ }
+}
+
base::TimeDelta GetFrameDuration(AVStream* stream) {
AVRational time_base = { stream->r_frame_rate.den, stream->r_frame_rate.num };
return ConvertFromTimeBase(time_base, 1);
diff --git a/media/ffmpeg/ffmpeg_common.h b/media/ffmpeg/ffmpeg_common.h
index 196b57e..3d39d52 100644
--- a/media/ffmpeg/ffmpeg_common.h
+++ b/media/ffmpeg/ffmpeg_common.h
@@ -11,6 +11,7 @@
#include "base/compiler_specific.h"
#include "base/memory/singleton.h"
#include "base/time.h"
+#include "media/base/channel_layout.h"
#include "media/video/video_decode_engine.h"
// Include FFmpeg header files.
@@ -66,6 +67,12 @@ int64 ConvertToTimeBase(const AVRational& time_base,
VideoCodec CodecIDToVideoCodec(CodecID codec_id);
CodecID VideoCodecToCodecID(VideoCodec video_codec);
+// 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
+// good guess about the plausible channel layout based on number of channels.
+ChannelLayout ChannelLayoutToChromeChannelLayout(int64_t layout,
+ int channels);
+
// Calculates duration of one frame in the |stream| based on its frame rate.
base::TimeDelta GetFrameDuration(AVStream* stream);