summaryrefslogtreecommitdiffstats
path: root/libaf
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-01-11 20:27:52 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-01-11 20:27:52 +0000
commit33bc71f10d0218a99128b6a786357f8c60ba821e (patch)
treef981d7109a26bccd2b06a07e348a6c9dc8b1bc54 /libaf
parentd3ae3611ce366b7598c49094a94109c6ee504322 (diff)
downloadmpv-33bc71f10d0218a99128b6a786357f8c60ba821e.tar.bz2
mpv-33bc71f10d0218a99128b6a786357f8c60ba821e.tar.xz
Add support for distinguishing between little- and big-endian SPDIF AC3
and converting between both. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30283 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libaf')
-rw-r--r--libaf/af_format.c4
-rw-r--r--libaf/af_format.h5
-rw-r--r--libaf/af_lavcac3enc.c4
-rw-r--r--libaf/format.c6
4 files changed, 14 insertions, 5 deletions
diff --git a/libaf/af_format.c b/libaf/af_format.c
index 64acbbb9b6..3b9b907882 100644
--- a/libaf/af_format.c
+++ b/libaf/af_format.c
@@ -98,6 +98,8 @@ static int control(struct af_instance_s* af, int cmd, void* arg)
af->data->bps == data->bps)
return AF_DETACH;
+ // Allow trivial AC3-endianness conversion
+ if (!AF_FORMAT_IS_AC3(af->data->format) || !AF_FORMAT_IS_AC3(data->format))
// Check for errors in configuration
if((AF_OK != check_bps(data->bps)) ||
(AF_OK != check_format(data->format)) ||
@@ -152,7 +154,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg)
}
case AF_CONTROL_FORMAT_FMT | AF_CONTROL_SET:{
// Check for errors in configuration
- if(AF_OK != check_format(*(int*)arg))
+ if(!AF_FORMAT_IS_AC3(*(int*)arg) && AF_OK != check_format(*(int*)arg))
return AF_ERROR;
af->data->format = *(int*)arg;
diff --git a/libaf/af_format.h b/libaf/af_format.h
index 3f1250b430..5f194c1365 100644
--- a/libaf/af_format.h
+++ b/libaf/af_format.h
@@ -83,6 +83,9 @@
#define AF_FORMAT_FLOAT_LE (AF_FORMAT_F|AF_FORMAT_32BIT|AF_FORMAT_LE)
#define AF_FORMAT_FLOAT_BE (AF_FORMAT_F|AF_FORMAT_32BIT|AF_FORMAT_BE)
+#define AF_FORMAT_AC3_LE (AF_FORMAT_AC3|AF_FORMAT_16BIT|AF_FORMAT_LE)
+#define AF_FORMAT_AC3_BE (AF_FORMAT_AC3|AF_FORMAT_16BIT|AF_FORMAT_BE)
+
#if HAVE_BIGENDIAN
#define AF_FORMAT_U16_NE AF_FORMAT_U16_BE
#define AF_FORMAT_S16_NE AF_FORMAT_S16_BE
@@ -91,6 +94,7 @@
#define AF_FORMAT_U32_NE AF_FORMAT_U32_BE
#define AF_FORMAT_S32_NE AF_FORMAT_S32_BE
#define AF_FORMAT_FLOAT_NE AF_FORMAT_FLOAT_BE
+#define AF_FORMAT_AC3_NE AF_FORMAT_AC3_BE
#else
#define AF_FORMAT_U16_NE AF_FORMAT_U16_LE
#define AF_FORMAT_S16_NE AF_FORMAT_S16_LE
@@ -99,6 +103,7 @@
#define AF_FORMAT_U32_NE AF_FORMAT_U32_LE
#define AF_FORMAT_S32_NE AF_FORMAT_S32_LE
#define AF_FORMAT_FLOAT_NE AF_FORMAT_FLOAT_LE
+#define AF_FORMAT_AC3_NE AF_FORMAT_AC3_LE
#endif
#define AF_FORMAT_UNKNOWN (-1)
diff --git a/libaf/af_lavcac3enc.c b/libaf/af_lavcac3enc.c
index dd6863320f..1211453593 100644
--- a/libaf/af_lavcac3enc.c
+++ b/libaf/af_lavcac3enc.c
@@ -58,7 +58,7 @@ static int control(struct af_instance_s *af, int cmd, void *arg)
switch (cmd){
case AF_CONTROL_REINIT:
- if (data->format == AF_FORMAT_AC3 || data->nch < s->min_channel_num)
+ if (AF_FORMAT_IS_AC3(data->format) || data->nch < s->min_channel_num)
return AF_DETACH;
s->pending_len = 0;
@@ -102,7 +102,7 @@ static int control(struct af_instance_s *af, int cmd, void *arg)
return AF_ERROR;
}
}
- af->data->format = AF_FORMAT_AC3;
+ af->data->format = AF_FORMAT_AC3_NE;
af->data->nch = 2;
return test_output_res;
case AF_CONTROL_COMMAND_LINE:
diff --git a/libaf/format.c b/libaf/format.c
index cb795ee362..21494f43b4 100644
--- a/libaf/format.c
+++ b/libaf/format.c
@@ -47,7 +47,7 @@ int af_str2fmt(const char* str)
format |= AF_FORMAT_A_LAW; return format;
}
if(strstr(str,"ac3") || strstr(str,"AC3")){
- format |= AF_FORMAT_AC3; return format;
+ format |= AF_FORMAT_AC3 | AF_FORMAT_16BIT; return format;
}
if(strstr(str,"mpeg2") || strstr(str,"MPEG2")){
format |= AF_FORMAT_MPEG2; return format;
@@ -158,7 +158,9 @@ static struct {
{ "mulaw", AF_FORMAT_MU_LAW },
{ "alaw", AF_FORMAT_A_LAW },
{ "mpeg2", AF_FORMAT_MPEG2 },
- { "ac3", AF_FORMAT_AC3 },
+ { "ac3le", AF_FORMAT_AC3_LE },
+ { "ac3be", AF_FORMAT_AC3_BE },
+ { "ac3ne", AF_FORMAT_AC3_NE },
{ "imaadpcm", AF_FORMAT_IMA_ADPCM },
{ "u8", AF_FORMAT_U8 },