summaryrefslogtreecommitdiffstats
path: root/libmpcodecs/ad_liba52.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmpcodecs/ad_liba52.c')
-rw-r--r--libmpcodecs/ad_liba52.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/libmpcodecs/ad_liba52.c b/libmpcodecs/ad_liba52.c
index 5f3e48ae2c..a78d4cc2dd 100644
--- a/libmpcodecs/ad_liba52.c
+++ b/libmpcodecs/ad_liba52.c
@@ -16,8 +16,14 @@
#include "libaf/af_format.h"
+#ifdef CONFIG_LIBA52_INTERNAL
#include "liba52/a52.h"
#include "liba52/mm_accel.h"
+#else
+#include <a52dec/a52.h>
+#include <a52dec/mm_accel.h>
+int (* a52_resample) (float * _f, int16_t * s16);
+#endif
static a52_state_t *a52_state;
static uint32_t a52_flags=0;
@@ -79,8 +85,10 @@ while(1){
if(sh_audio->format!=0x2000)
swab(sh_audio->a_in_buffer+8,sh_audio->a_in_buffer+8,length-8);
+#ifdef CONFIG_LIBA52_INTERNAL
if(crc16_block(sh_audio->a_in_buffer+2,length-2)!=0)
mp_msg(MSGT_DECAUDIO,MSGL_STATUS,"a52: CRC check failed! \n");
+#endif
return length;
}
@@ -121,7 +129,11 @@ static int preinit(sh_audio_t *sh)
{
/* Dolby AC3 audio: */
/* however many channels, 2 bytes in a word, 256 samples in a block, 6 blocks in a frame */
+#ifdef CONFIG_LIBA52_INTERNAL
if (sh->samplesize < 2) sh->samplesize = 2;
+#else
+ if (sh->samplesize < 4) sh->samplesize = 4;
+#endif
sh->audio_out_minsize=audio_output_channels*sh->samplesize*256*6;
sh->audio_in_minsize=3840;
a52_level = 1.0;
@@ -158,17 +170,26 @@ static int init(sh_audio_t *sh_audio)
sample_t level=a52_level, bias=384;
int flags=0;
/* Dolby AC3 audio:*/
+#ifdef MM_ACCEL_X86_SSE
if(gCpuCaps.hasSSE) a52_accel|=MM_ACCEL_X86_SSE;
+#endif
if(gCpuCaps.hasMMX) a52_accel|=MM_ACCEL_X86_MMX;
if(gCpuCaps.hasMMX2) a52_accel|=MM_ACCEL_X86_MMXEXT;
if(gCpuCaps.has3DNow) a52_accel|=MM_ACCEL_X86_3DNOW;
+#ifdef MM_ACCEL_X86_3DNOWEXT
if(gCpuCaps.has3DNowExt) a52_accel|=MM_ACCEL_X86_3DNOWEXT;
+#endif
+#ifdef MM_ACCEL_PPC_ALTIVEC
if(gCpuCaps.hasAltiVec) a52_accel|=MM_ACCEL_PPC_ALTIVEC;
+#endif
a52_state=a52_init (a52_accel);
if (a52_state == NULL) {
mp_msg(MSGT_DECAUDIO,MSGL_ERR,"A52 init failed\n");
return 0;
}
+#ifndef CONFIG_LIBA52_INTERNAL
+ sh_audio->sample_format = AF_FORMAT_FLOAT_NE;
+#endif
if(a52_fillbuff(sh_audio)<0){
mp_msg(MSGT_DECAUDIO,MSGL_ERR,"A52 sync failed\n");
return 0;
@@ -241,8 +262,12 @@ while(sh_audio->channels>0){
break;
}
} else
+#ifdef CONFIG_LIBA52_INTERNAL
if(a52_resample_init(a52_accel,flags,sh_audio->channels)) break;
--sh_audio->channels; /* try to decrease no. of channels*/
+#else
+ break;
+#endif
}
if(sh_audio->channels<=0){
mp_msg(MSGT_DECAUDIO,MSGL_ERR,"a52: no resampler. try different channel setup!\n");