summaryrefslogtreecommitdiffstats
path: root/audio/filter
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2012-11-29 17:03:04 +0000
committerwm4 <wm4@nowhere>2012-12-03 21:08:52 +0100
commita4177fd5814300be95a050413f18bfc89f5c93df (patch)
treec73291fe93954531738907082459368b28c39bee /audio/filter
parent1e9f37072b348aa396c063306eee813d001be602 (diff)
downloadmpv-a4177fd5814300be95a050413f18bfc89f5c93df.tar.bz2
mpv-a4177fd5814300be95a050413f18bfc89f5c93df.tar.xz
audio: make AC3 pass-through with ad_spdif work
Do not fall back to 0 for samplerate when parser is not initialized. Might fix some issues with using -ac spdifenc with audio in MKV or MP4. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@35517 b3059339-0415-0410-9bf9-f77b7e298cf2 Replace outdated list of unsupported formats by list of supported formats. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@35534 b3059339-0415-0410-9bf9-f77b7e298cf2 Do not call af_fmt2str on the same data over and over. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@35535 b3059339-0415-0410-9bf9-f77b7e298cf2 ad_spdif: use the more specific AF_FORMAT_AC3_LE when we handle AC3. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@35536 b3059339-0415-0410-9bf9-f77b7e298cf2 Make AF_FORMAT_IS_IEC61937 include AF_FORMAT_IS_AC3. Our AC3 "sample format" is also iec61937. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@35537 b3059339-0415-0410-9bf9-f77b7e298cf2 af_format: support endianness conversion also for iec61937 formats in general, not just AC3. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@35538 b3059339-0415-0410-9bf9-f77b7e298cf2 Conflicts: audio/filter/af_format.c af_format: Fix check_format, non-special formats are of course supported. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@35545 b3059339-0415-0410-9bf9-f77b7e298cf2 Note: see mplayer bug #2110
Diffstat (limited to 'audio/filter')
-rw-r--r--audio/filter/af_format.c36
1 files changed, 22 insertions, 14 deletions
diff --git a/audio/filter/af_format.c b/audio/filter/af_format.c
index 6192091f5a..0f19efd920 100644
--- a/audio/filter/af_format.c
+++ b/audio/filter/af_format.c
@@ -74,14 +74,14 @@ static int check_format(int format)
{
char buf[256];
switch(format & AF_FORMAT_SPECIAL_MASK){
- case(AF_FORMAT_IMA_ADPCM):
- case(AF_FORMAT_MPEG2):
- case(AF_FORMAT_AC3):
- mp_msg(MSGT_AFILTER, MSGL_ERR, "[format] Sample format %s not yet supported \n",
- af_fmt2str(format,buf,256));
- return AF_ERROR;
+ case 0: /* non-special formats */
+ case AF_FORMAT_MU_LAW:
+ case AF_FORMAT_A_LAW:
+ return AF_OK;
}
- return AF_OK;
+ mp_msg(MSGT_AFILTER, MSGL_ERR, "[format] Sample format %s not yet supported \n",
+ af_fmt2str(format,buf,256));
+ return AF_ERROR;
}
// Initialization and runtime control
@@ -92,14 +92,23 @@ static int control(struct af_instance* af, int cmd, void* arg)
char buf1[256];
char buf2[256];
struct mp_audio *data = arg;
+ int supported_ac3 = 0;
// Make sure this filter isn't redundant
if(af->data->format == data->format &&
af->data->bps == data->bps)
return AF_DETACH;
+ // A bit complex because we can convert AC3
+ // to generic iec61937 but not the other way
+ // round.
+ if (AF_FORMAT_IS_AC3(af->data->format))
+ supported_ac3 = AF_FORMAT_IS_AC3(data->format);
+ else if (AF_FORMAT_IS_IEC61937(af->data->format))
+ supported_ac3 = AF_FORMAT_IS_IEC61937(data->format);
+
// Allow trivial AC3-endianness conversion
- if (!AF_FORMAT_IS_AC3(af->data->format) || !AF_FORMAT_IS_AC3(data->format))
+ if (!supported_ac3)
// Check for errors in configuration
if((AF_OK != check_bps(data->bps)) ||
(AF_OK != check_format(data->format)) ||
@@ -107,9 +116,10 @@ static int control(struct af_instance* af, int cmd, void* arg)
(AF_OK != check_format(af->data->format)))
return AF_ERROR;
+ af_fmt2str(data->format,buf1,256);
+ af_fmt2str(af->data->format,buf2,256);
mp_msg(MSGT_AFILTER, MSGL_V, "[format] Changing sample format from %s to %s\n",
- af_fmt2str(data->format,buf1,256),
- af_fmt2str(af->data->format,buf2,256));
+ buf1, buf2);
af->data->rate = data->rate;
af->data->nch = data->nch;
@@ -128,16 +138,14 @@ static int control(struct af_instance* af, int cmd, void* arg)
(af->data->format == AF_FORMAT_S16_NE))
{
mp_msg(MSGT_AFILTER, MSGL_V, "[format] Accelerated %s to %s conversion\n",
- af_fmt2str(data->format,buf1,256),
- af_fmt2str(af->data->format,buf2,256));
+ buf1, buf2);
af->play = play_float_s16;
}
if ((data->format == AF_FORMAT_S16_NE) &&
(af->data->format == AF_FORMAT_FLOAT_NE))
{
mp_msg(MSGT_AFILTER, MSGL_V, "[format] Accelerated %s to %s conversion\n",
- af_fmt2str(data->format,buf1,256),
- af_fmt2str(af->data->format,buf2,256));
+ buf1, buf2);
af->play = play_s16_float;
}
return AF_OK;