[vlc-devel] [PATCH] AVI: support WAVEFORMATEXTENSIBLE for audio
Juha Jeronen
juha.jeronen at jyu.fi
Mon May 16 14:01:33 CEST 2011
Cool :)
But should the cosmetic empty lines in [@@ -336,16 +336,19 @@ static int
AVI_ChunkRead_strf( stream_t *s, avi_chunk_t *p_chk )] go in a separate
commit?
-J
On 05/12/11 02:53, Jean-Baptiste Kempf wrote:
> This is notably used by files produced by FFmpeg
> Closes #4742
> ---
> modules/demux/avi/avi.c | 12 ++++++++----
> modules/demux/avi/libavi.c | 13 +++++++++----
> modules/demux/avi/libavi.h | 1 +
> 3 files changed, 18 insertions(+), 8 deletions(-)
>
> diff --git a/modules/demux/avi/avi.c b/modules/demux/avi/avi.c
> index df525ad..f0a9999 100644
> --- a/modules/demux/avi/avi.c
> +++ b/modules/demux/avi/avi.c
> @@ -401,8 +401,12 @@ static int Open( vlc_object_t * p_this )
> {
> case( AVIFOURCC_auds ):
> tk->i_cat = AUDIO_ES;
> - tk->i_codec = AVI_FourccGetCodec( AUDIO_ES,
> - p_auds->p_wf->wFormatTag );
> + if( p_auds->p_wf->wFormatTag != WAVE_FORMAT_EXTENSIBLE )
> + tk->i_codec = AVI_FourccGetCodec( AUDIO_ES,
> + p_auds->p_wf->wFormatTag );
> + else
> + tk->i_codec = AVI_FourccGetCodec( AUDIO_ES,
> + p_auds->p_wfe->SubFormat.Data1 );
>
> tk->i_blocksize = p_auds->p_wf->nBlockAlign;
> if( tk->i_blocksize == 0 )
> @@ -435,8 +439,8 @@ static int Open( vlc_object_t * p_this )
> fmt.b_packetized = !tk->i_blocksize;
>
> msg_Dbg( p_demux,
> - "stream[%d] audio(0x%x) %d channels %dHz %dbits",
> - i, p_auds->p_wf->wFormatTag, p_auds->p_wf->nChannels,
> + "stream[%d] audio(%4.4s) %d channels %dHz %dbits",
> + i, (char*)&tk->i_codec, p_auds->p_wf->nChannels,
> p_auds->p_wf->nSamplesPerSec,
> p_auds->p_wf->wBitsPerSample );
>
> diff --git a/modules/demux/avi/libavi.c b/modules/demux/avi/libavi.c
> index 0031a16..a8edc2a 100644
> --- a/modules/demux/avi/libavi.c
> +++ b/modules/demux/avi/libavi.c
> @@ -336,16 +336,19 @@ static int AVI_ChunkRead_strf( stream_t *s, avi_chunk_t *p_chk )
> case( AVIFOURCC_auds ):
> p_chk->strf.auds.i_cat = AUDIO_ES;
> p_chk->strf.auds.p_wf = malloc( __MAX( p_chk->common.i_chunk_size, sizeof( WAVEFORMATEX ) ) );
> + p_chk->strf.auds.p_wfe = malloc( __MAX( p_chk->common.i_chunk_size, sizeof( WAVEFORMATEXTENSIBLE ) ) );
> AVI_READ2BYTES( p_chk->strf.auds.p_wf->wFormatTag );
> AVI_READ2BYTES( p_chk->strf.auds.p_wf->nChannels );
> AVI_READ4BYTES( p_chk->strf.auds.p_wf->nSamplesPerSec );
> AVI_READ4BYTES( p_chk->strf.auds.p_wf->nAvgBytesPerSec );
> AVI_READ2BYTES( p_chk->strf.auds.p_wf->nBlockAlign );
> AVI_READ2BYTES( p_chk->strf.auds.p_wf->wBitsPerSample );
> +
> if( p_chk->strf.auds.p_wf->wFormatTag != WAVE_FORMAT_PCM
> && p_chk->common.i_chunk_size> sizeof( WAVEFORMATEX ) )
> {
> AVI_READ2BYTES( p_chk->strf.auds.p_wf->cbSize );
> +
> /* prevent segfault */
> if( p_chk->strf.auds.p_wf->cbSize>
> p_chk->common.i_chunk_size - sizeof( WAVEFORMATEX ) )
> @@ -353,11 +356,12 @@ static int AVI_ChunkRead_strf( stream_t *s, avi_chunk_t *p_chk )
> p_chk->strf.auds.p_wf->cbSize =
> p_chk->common.i_chunk_size - sizeof( WAVEFORMATEX );
> }
> - if( p_chk->strf.auds.p_wf->wFormatTag == WAVE_FORMAT_EXTENSIBLE )
> +
> + if( p_chk->strf.auds.p_wf->wFormatTag == WAVE_FORMAT_EXTENSIBLE
> +&& p_chk->common.i_chunk_size> sizeof( WAVEFORMATEXTENSIBLE ) )
> {
> - /* Found an extensible header atm almost nothing uses that. */
> - msg_Warn( (vlc_object_t*)s, "WAVE_FORMAT_EXTENSIBLE or "
> - "vorbis audio dectected: not supported" );
> + msg_Dbg( s, "Extended header found" );
> + memcpy( p_chk->strf.auds.p_wfe, p_read - sizeof( WAVEFORMATEX ), sizeof( WAVEFORMATEXTENSIBLE ) );
> }
> }
> else
> @@ -428,6 +432,7 @@ static void AVI_ChunkFree_strf( avi_chunk_t *p_chk )
> if( p_strf->common.i_cat == AUDIO_ES )
> {
> FREENULL( p_strf->auds.p_wf );
> + FREENULL( p_strf->auds.p_wfe );
> }
> else if( p_strf->common.i_cat == VIDEO_ES )
> {
> diff --git a/modules/demux/avi/libavi.h b/modules/demux/avi/libavi.h
> index 3862cf9..a104373 100644
> --- a/modules/demux/avi/libavi.h
> +++ b/modules/demux/avi/libavi.h
> @@ -119,6 +119,7 @@ typedef struct avi_chunk_strf_auds_s
> AVI_CHUNK_COMMON
> int i_cat;
> WAVEFORMATEX *p_wf;
> + WAVEFORMATEXTENSIBLE *p_wfe;
> } avi_chunk_strf_auds_t;
>
> typedef struct avi_chunk_strf_vids_s
More information about the vlc-devel
mailing list