diff options
author | cehoyos <cehoyos@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2010-06-23 18:44:06 +0000 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2010-11-02 04:11:42 +0200 |
commit | f455b6e91bc1847e5fd3ffe73ee6081e934e4e87 (patch) | |
tree | 00e18bdf19496da9bb9048fadb37738956d63cf3 | |
parent | c795508d5fb62bb7e4e7cf29d9422876344fd781 (diff) | |
download | mpv-f455b6e91bc1847e5fd3ffe73ee6081e934e4e87.tar.bz2 mpv-f455b6e91bc1847e5fd3ffe73ee6081e934e4e87.tar.xz |
ad_faad: Improve LATM recognition
Patch by Dan Oscarsson, Dan d Oscarsson a tieto d com
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@31543 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r-- | libfaad2/decoder.c | 5 | ||||
-rw-r--r-- | libfaad2/decoder.h | 3 | ||||
-rw-r--r-- | libfaad2/neaacdec.h | 3 | ||||
-rw-r--r-- | libmpcodecs/ad_faad.c | 26 |
4 files changed, 32 insertions, 5 deletions
diff --git a/libfaad2/decoder.c b/libfaad2/decoder.c index 3b33e11b32..710a3cf796 100644 --- a/libfaad2/decoder.c +++ b/libfaad2/decoder.c @@ -222,7 +222,7 @@ static int latmCheck(latm_header *latm, bitfile *ld) int32_t NEAACDECAPI NeAACDecInit(NeAACDecHandle hDecoder, uint8_t *buffer, uint32_t buffer_size, - uint32_t *samplerate, uint8_t *channels) + uint32_t *samplerate, uint8_t *channels, int latm_stream) { uint32_t bits = 0; bitfile ld; @@ -257,6 +257,9 @@ int32_t NEAACDECAPI NeAACDecInit(NeAACDecHandle hDecoder, uint8_t *buffer, hDecoder->latm_header_present = 0; return x; } + else if (latm_stream) { + return -1; + } else /* Check if an ADIF header is present */ if ((buffer[0] == 'A') && (buffer[1] == 'D') && diff --git a/libfaad2/decoder.h b/libfaad2/decoder.h index c06b396e2d..25846b404f 100644 --- a/libfaad2/decoder.h +++ b/libfaad2/decoder.h @@ -86,7 +86,8 @@ int32_t NEAACDECAPI NeAACDecInit(NeAACDecHandle hDecoder, uint8_t *buffer, uint32_t buffer_size, uint32_t *samplerate, - uint8_t *channels); + uint8_t *channels, + int latm_stream); /* Init the library using a DecoderSpecificInfo */ int8_t NEAACDECAPI NeAACDecInit2(NeAACDecHandle hDecoder, uint8_t *pBuffer, diff --git a/libfaad2/neaacdec.h b/libfaad2/neaacdec.h index e0c10b66c5..fb66f7ab1a 100644 --- a/libfaad2/neaacdec.h +++ b/libfaad2/neaacdec.h @@ -211,7 +211,8 @@ long NEAACDECAPI NeAACDecInit(NeAACDecHandle hDecoder, unsigned char *buffer, unsigned long buffer_size, unsigned long *samplerate, - unsigned char *channels); + unsigned char *channels, + int latm_stream); /* Init the library using a DecoderSpecificInfo */ char NEAACDECAPI NeAACDecInit2(NeAACDecHandle hDecoder, unsigned char *pBuffer, diff --git a/libmpcodecs/ad_faad.c b/libmpcodecs/ad_faad.c index 14fe9a6280..8a0a5e22f4 100644 --- a/libmpcodecs/ad_faad.c +++ b/libmpcodecs/ad_faad.c @@ -126,6 +126,26 @@ static int init(sh_audio_t *sh) faacDecSetConfiguration(faac_hdec, faac_conf); sh->a_in_buffer_len = demux_read_data(sh->ds, sh->a_in_buffer, sh->a_in_buffer_size); + /* init the codec, look for LATM */ + faac_init = faacDecInit(faac_hdec, sh->a_in_buffer, + sh->a_in_buffer_len, &faac_samplerate, &faac_channels,1); + if (faac_init < 0 && sh->a_in_buffer_len >= 3 && sh->format == mmioFOURCC('M', 'P', '4', 'L')) { + // working LATM not found at first try, look further on in stream + int i; + + for (i = 0; i < 5; i++) { + pos = sh->a_in_buffer_len-3; + memmove(sh->a_in_buffer, &(sh->a_in_buffer[pos]), 3); + sh->a_in_buffer_len = 3; + sh->a_in_buffer_len += demux_read_data(sh->ds,&sh->a_in_buffer[sh->a_in_buffer_len], + sh->a_in_buffer_size - sh->a_in_buffer_len); + faac_init = faacDecInit(faac_hdec, sh->a_in_buffer, + sh->a_in_buffer_len, &faac_samplerate, &faac_channels,1); + if (faac_init >= 0) break; + } + } + + if (faac_init < 0) { pos = aac_probe(sh->a_in_buffer, sh->a_in_buffer_len); if(pos) { sh->a_in_buffer_len -= pos; @@ -138,7 +158,8 @@ static int init(sh_audio_t *sh) /* init the codec */ faac_init = faacDecInit(faac_hdec, sh->a_in_buffer, - sh->a_in_buffer_len, &faac_samplerate, &faac_channels); + sh->a_in_buffer_len, &faac_samplerate, &faac_channels,0); + } sh->a_in_buffer_len -= (faac_init > 0)?faac_init:0; // how many bytes init consumed // XXX FIXME: shouldn't we memcpy() here in a_in_buffer ?? --A'rpi @@ -189,7 +210,8 @@ static void uninit(sh_audio_t *sh) static int aac_sync(sh_audio_t *sh) { int pos = 0; - if(!sh->codecdata_len) { + // do not probe LATM, faad does that + if(!sh->codecdata_len && sh->format != mmioFOURCC('M', 'P', '4', 'L')) { if(sh->a_in_buffer_len < sh->a_in_buffer_size){ sh->a_in_buffer_len += demux_read_data(sh->ds,&sh->a_in_buffer[sh->a_in_buffer_len], |