1
mirror of https://code.videolan.org/videolan/vlc synced 2024-10-07 03:56:28 +02:00

* modules/packetizer/mpeg4audio.c: when packetizing adts streams, make sure we remove the adts headers before sending the data.

This commit is contained in:
Gildas Bazin 2003-10-24 17:55:14 +00:00
parent d5bbc63850
commit 170d7aa695

View File

@ -2,7 +2,7 @@
* mpeg4audio.c: parse and packetize an MPEG 4 audio stream
*****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN
* $Id: mpeg4audio.c,v 1.10 2003/10/23 20:51:20 gbazin Exp $
* $Id: mpeg4audio.c,v 1.11 2003/10/24 17:55:14 gbazin Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Gildas Bazin <gbazin@netcourrier.com>
@ -78,7 +78,7 @@ struct decoder_sys_t
int i_frame_size, i_raw_blocks;
unsigned int i_channels;
unsigned int i_rate, i_frame_length;
unsigned int i_rate, i_frame_length, i_header_size;
};
enum {
@ -96,7 +96,7 @@ static int i_sample_rates[] =
16000, 12000, 11025, 8000, 7350, 0, 0, 0
};
#define ADTS_HEADER_SIZE 6
#define ADTS_HEADER_SIZE 9
/****************************************************************************
* Local prototypes
@ -112,6 +112,7 @@ static int ADTSSyncInfo( decoder_t *, const byte_t * p_buf,
unsigned int * pi_channels,
unsigned int * pi_sample_rate,
unsigned int * pi_frame_length,
unsigned int * pi_header_size,
unsigned int * pi_raw_blocks );
/*****************************************************************************
@ -333,8 +334,9 @@ static int RunADTSPacketizer( decoder_t *p_dec, block_t *p_block )
&p_sys->i_channels,
&p_sys->i_rate,
&p_sys->i_frame_length,
&p_sys->i_header_size,
&p_sys->i_raw_blocks );
if( !p_sys->i_frame_size )
if( p_sys->i_frame_size <= 0 )
{
msg_Dbg( p_dec, "emulated sync word" );
block_SkipByte( &p_sys->bytestream );
@ -349,8 +351,8 @@ static int RunADTSPacketizer( decoder_t *p_dec, block_t *p_block )
* next sync word */
/* Check if next expected frame contains the sync word */
if( block_PeekOffsetBytes( &p_sys->bytestream,
p_sys->i_frame_size, p_header, 2 )
if( block_PeekOffsetBytes( &p_sys->bytestream, p_sys->i_frame_size
+ p_sys->i_header_size, p_header, 2 )
!= VLC_SUCCESS )
{
/* Need more data */
@ -372,6 +374,18 @@ static int RunADTSPacketizer( decoder_t *p_dec, block_t *p_block )
return VLC_EGENERIC;
}
/* Skip the ADTS header */
if( p_sys->i_header_size )
{
if( block_SkipBytes( &p_sys->bytestream,
p_sys->i_header_size ) != VLC_SUCCESS )
{
/* Need more data */
return VLC_SUCCESS;
}
p_sys->i_header_size = 0;
}
/* Copy the whole frame into the buffer */
if( block_GetBytes( &p_sys->bytestream,
p_sys->p_sout_buffer->p_buffer,
@ -482,13 +496,16 @@ static int ADTSSyncInfo( decoder_t * p_dec, const byte_t * p_buf,
unsigned int * pi_channels,
unsigned int * pi_sample_rate,
unsigned int * pi_frame_length,
unsigned int * pi_header_size,
unsigned int * pi_raw_blocks_in_frame )
{
decoder_sys_t *p_sys = p_dec->p_sys;
int i_id, i_profile, i_sample_rate_idx, i_frame_size;
vlc_bool_t b_crc;
/* Fixed header between frames */
i_id = ( (p_buf[1] >> 3) & 0x01 ) ? 2 : 4;
b_crc = !(p_buf[1] & 0x01);
i_profile = p_buf[2] >> 6;
i_sample_rate_idx = (p_buf[2] >> 2) & 0x0f;
*pi_sample_rate = i_sample_rates[i_sample_rate_idx];
@ -513,10 +530,13 @@ static int ADTSSyncInfo( decoder_t * p_dec, const byte_t * p_buf,
p_sys->sout_format.i_extra_data = 2;
p_sys->sout_format.p_extra_data = malloc( 2 );
p_sys->sout_format.p_extra_data[0] =
(i_profile + 1) << 3 | (i_sample_rate_idx > 1);
(i_profile + 1) << 3 | (i_sample_rate_idx >> 1);
p_sys->sout_format.p_extra_data[1] =
((i_sample_rate_idx & 0x01) << 7) | (*pi_channels <<3);
}
return i_frame_size;
/* ADTS header length */
*pi_header_size = b_crc ? 9 : 7;
return i_frame_size - *pi_header_size;
}