From a4c8807ec2c5c2bc9027f4e74014366aac870d99 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Kempf Date: Mon, 19 Nov 2007 01:43:37 +0000 Subject: [PATCH] Real/Sipr, try to use a correct flavor detection, without using the MPlayer hacks... --- include/vlc_es.h | 1 + modules/codec/realaudio.c | 14 ++++---------- modules/demux/real.c | 29 ++++++++++++++++------------- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/include/vlc_es.h b/include/vlc_es.h index de43864f5a..7501eed3d1 100644 --- a/include/vlc_es.h +++ b/include/vlc_es.h @@ -95,6 +95,7 @@ struct audio_format_t unsigned i_bitspersample; unsigned i_blockalign; uint8_t i_channels; /* must be <=32 */ + uint8_t i_flavor; }; #ifdef WORDS_BIGENDIAN diff --git a/modules/codec/realaudio.c b/modules/codec/realaudio.c index e3084c35a3..c956fc2f55 100644 --- a/modules/codec/realaudio.c +++ b/modules/codec/realaudio.c @@ -186,6 +186,7 @@ static int Open( vlc_object_t *p_this ) return VLC_EGENERIC; } + /* Channel detection */ if( p_dec->fmt_in.audio.i_channels <= 0 || p_dec->fmt_in.audio.i_channels > 6 ) { @@ -197,19 +198,12 @@ static int Open( vlc_object_t *p_this ) p_dec->p_sys = p_sys = malloc( sizeof( decoder_sys_t ) ); memset( p_sys, 0, sizeof(decoder_sys_t) ); + /* Flavor for SIPR codecs */ p_sys->i_codec_flavor = -1; if( p_dec->fmt_in.i_codec == VLC_FOURCC('s','i','p','r') ) { - if( p_dec->fmt_in.audio.i_bitspersample > 1531 ) - p_sys->i_codec_flavor = 3; - else if( p_dec->fmt_in.audio.i_bitspersample > 937 ) - p_sys->i_codec_flavor = 1; - else if( p_dec->fmt_in.audio.i_bitspersample > 719 ) - p_sys->i_codec_flavor = 0; - else - p_sys->i_codec_flavor = 2; - msg_Dbg( p_dec, "Got sipr flavor %d from bitrate %d\n", - p_sys->i_codec_flavor, p_dec->fmt_in.audio.i_bitspersample ); + p_sys->i_codec_flavor = p_dec->fmt_in.audio.i_flavor; + msg_Dbg( p_dec, "Got sipr flavor %d", p_sys->i_codec_flavor ); } if( OpenDll( p_dec ) != VLC_SUCCESS ) diff --git a/modules/demux/real.c b/modules/demux/real.c index 7b634296ba..66a56cd759 100644 --- a/modules/demux/real.c +++ b/modules/demux/real.c @@ -124,9 +124,6 @@ static int Control( demux_t *p_demux, int i_query, va_list args ); static int HeaderRead( demux_t *p_demux ); static int ReadCodecSpecificData( demux_t *p_demux, int i_len, int i_num ); -// Map flavour to bytes per second -static int sipr_fl2bps[4] = {813, 1062, 625, 2000}; // 6.5, 8.5, 5, 16 kbit per second - /***************************************************************************** * Open *****************************************************************************/ @@ -138,6 +135,11 @@ static int Open( vlc_object_t *p_this ) const uint8_t *p_peek; if( stream_Peek( p_demux->s, &p_peek, 10 ) < 10 ) return VLC_EGENERIC; + if( !memcmp( p_peek, ".ra", 3 ) ) + { + msg_Warn( p_demux, ".ra files unsuported" ); + return VLC_EGENERIC; + } if( memcmp( p_peek, ".RMF", 4 ) ) return VLC_EGENERIC; /* Fill p_demux field */ @@ -1011,6 +1013,7 @@ static int ReadCodecSpecificData( demux_t *p_demux, int i_len, int i_num ) { int i_header_size, i_flavor, i_coded_frame_size, i_subpacket_h; int i_frame_size, i_subpacket_size; + char p_genr[4]; int i_version = GetWBE( &p_peek[4] ); /* [0..3] = '.','r','a',0xfd */ msg_Dbg( p_demux, " - audio version=%d", i_version ); @@ -1099,9 +1102,8 @@ static int ReadCodecSpecificData( demux_t *p_demux, int i_len, int i_num ) msg_Dbg( p_demux, " - audio codec=%4.4s channels=%d rate=%dHz", (char*)&fmt.i_codec, fmt.audio.i_channels, fmt.audio.i_rate ); } - else + else /* RMF version 4/5 */ { - p_peek += 2; /* 00 00 */ p_peek += 4; /* .ra4 or .ra5 */ p_peek += 4; /* data size */ @@ -1127,7 +1129,7 @@ static int ReadCodecSpecificData( demux_t *p_demux, int i_len, int i_num ) if( i_version == 5 ) { - p_peek += 4; /* genr */ + memcpy( (char *)p_genr, p_peek, 4 ); p_peek += 4; /* genr */ memcpy( (char *)&fmt.i_codec, p_peek, 4 ); p_peek += 4; } else @@ -1149,8 +1151,10 @@ static int ReadCodecSpecificData( demux_t *p_demux, int i_len, int i_num ) switch( fmt.i_codec ) { case VLC_FOURCC('1','4','_','4'): + /* fmt.audio.i_blockalign = 0x14 */ break; case VLC_FOURCC('l','p','c','J'): + /* fmt.audio.i_blockalign = 0x14 */ fmt.i_codec = VLC_FOURCC( '1','4','_','4' ); break; @@ -1175,20 +1179,19 @@ static int ReadCodecSpecificData( demux_t *p_demux, int i_len, int i_num ) fmt.i_codec = VLC_FOURCC( 'm','p','4','a' ); break; + case VLC_FOURCC('s','i','p','r'): + fmt.audio.i_flavor = i_flavor; case VLC_FOURCC('c','o','o','k'): case VLC_FOURCC('a','t','r','c'): - fmt.audio.i_blockalign = i_subpacket_size; + if( !memcmp( p_genr, "genr", 4 ) ) + fmt.audio.i_blockalign = i_subpacket_size; + else + fmt.audio.i_blockalign = i_coded_frame_size; if( !fmt.i_extra ) break; fmt.p_extra = malloc( fmt.i_extra ); memcpy( fmt.p_extra, p_peek, fmt.i_extra ); break; - case VLC_FOURCC('s','i','p','r'): - fmt.i_extra = 0; - fmt.audio.i_blockalign = i_coded_frame_size; - fmt.audio.i_bitspersample = sipr_fl2bps[ i_flavor ]; - break; - case VLC_FOURCC('r','a','l','f'): msg_Dbg( p_demux, " - audio codec not supported=%4.4s", (char*)&fmt.i_codec ); -- 2.39.5