summaryrefslogtreecommitdiffstats
path: root/libmpcodecs
diff options
context:
space:
mode:
authorcehoyos <cehoyos@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-06-23 18:44:06 +0000
committerUoti Urpala <uau@glyph.nonexistent.invalid>2010-11-02 04:11:42 +0200
commitf455b6e91bc1847e5fd3ffe73ee6081e934e4e87 (patch)
tree00e18bdf19496da9bb9048fadb37738956d63cf3 /libmpcodecs
parentc795508d5fb62bb7e4e7cf29d9422876344fd781 (diff)
downloadmpv-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
Diffstat (limited to 'libmpcodecs')
-rw-r--r--libmpcodecs/ad_faad.c26
1 files changed, 24 insertions, 2 deletions
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],