X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Favi%2Flibavi.c;h=678e060277f6e734bbc49217cecdfa6d8579ce20;hb=6ee1e193fd896ab9a4729fde14f009d9ce629815;hp=4fde68f74fd5f3ef9bbc22d7a28695c70fa431f6;hpb=3d831e04ece115bb9ca379b9552370755453e46e;p=vlc diff --git a/modules/demux/avi/libavi.c b/modules/demux/avi/libavi.c index 4fde68f74f..678e060277 100644 --- a/modules/demux/avi/libavi.c +++ b/modules/demux/avi/libavi.c @@ -1,7 +1,7 @@ /***************************************************************************** * libavi.c : LibAVI ***************************************************************************** - * Copyright (C) 2001 VideoLAN + * Copyright (C) 2001 the VideoLAN team * $Id$ * Authors: Laurent Aimar * @@ -17,22 +17,18 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include /* malloc(), free() */ #include -#include -#include "codecs.h" /* BITMAPINFOHEADER */ +#include +#include /* BITMAPINFOHEADER */ #include "libavi.h" #define AVI_DEBUG 1 -#define FREE( p ) \ - if( p ) {free( p ); p = NULL; } - #define __EVEN( x ) ( (x)&0x01 ? (x)+1 : (x) ) static vlc_fourcc_t GetFOURCC( byte_t *p_buff ) @@ -176,7 +172,7 @@ static int AVI_ChunkRead_list( stream_t *s, avi_chunk_t *p_container ) break; } if( p_chk->common.p_father->common.i_chunk_size > 0 && - ( stream_Tell( s ) >= + ( stream_Tell( s ) > (off_t)p_chk->common.p_father->common.i_chunk_pos + (off_t)__EVEN( p_chk->common.p_father->common.i_chunk_size ) ) ) { @@ -207,43 +203,44 @@ static int AVI_ChunkRead_list( stream_t *s, avi_chunk_t *p_container ) i_read = stream_Read( s, p_read, i_read ); \ if( i_read < (int64_t)__EVEN(p_chk->common.i_chunk_size ) + 8 ) \ { \ + free( p_buff ); \ return VLC_EGENERIC; \ }\ p_read += 8; \ i_read -= 8 +#define AVI_READ( res, func, size ) \ + if( i_read < size ) { \ + free( p_buff); \ + return VLC_EGENERIC; \ + } \ + i_read -= size; \ + res = func( p_read ); \ + p_read += size \ + #define AVI_READCHUNK_EXIT( code ) \ free( p_buff ); \ - if( i_read < 0 ) \ - { \ - msg_Warn( (vlc_object_t*)s, "not enough data" ); \ - } \ return code +static inline uint8_t GetB( uint8_t *ptr ) +{ + return *ptr; +} + #define AVI_READ1BYTE( i_byte ) \ - i_byte = *p_read; \ - p_read++; \ - i_read-- + AVI_READ( i_byte, GetB, 1 ) #define AVI_READ2BYTES( i_word ) \ - i_word = GetWLE( p_read ); \ - p_read += 2; \ - i_read -= 2 + AVI_READ( i_word, GetWLE, 2 ) #define AVI_READ4BYTES( i_dword ) \ - i_dword = GetDWLE( p_read ); \ - p_read += 4; \ - i_read -= 4 + AVI_READ( i_dword, GetDWLE, 4 ) -#define AVI_READ8BYTES( i_dword ) \ - i_dword = GetQWLE( p_read ); \ - p_read += 8; \ - i_read -= 8 +#define AVI_READ8BYTES( i_qword ) \ + AVI_READ( i_qword, GetQWLE, 8 ) #define AVI_READFOURCC( i_dword ) \ - i_dword = GetFOURCC( p_read ); \ - p_read += 4; \ - i_read -= 4 + AVI_READ( i_dword, GetFOURCC, 4 ) static int AVI_ChunkRead_avih( stream_t *s, avi_chunk_t *p_chk ) { @@ -385,8 +382,7 @@ static int AVI_ChunkRead_strf( stream_t *s, avi_chunk_t *p_chk ) AVI_READ4BYTES( p_chk->strf.vids.p_bih->biYPelsPerMeter ); AVI_READ4BYTES( p_chk->strf.vids.p_bih->biClrUsed ); AVI_READ4BYTES( p_chk->strf.vids.p_bih->biClrImportant ); - if( p_chk->strf.vids.p_bih->biSize > - p_chk->common.i_chunk_size ) + if( p_chk->strf.vids.p_bih->biSize > p_chk->common.i_chunk_size ) { p_chk->strf.vids.p_bih->biSize = p_chk->common.i_chunk_size; } @@ -394,8 +390,7 @@ static int AVI_ChunkRead_strf( stream_t *s, avi_chunk_t *p_chk ) { memcpy( &p_chk->strf.vids.p_bih[1], p_buff + 8 + sizeof(BITMAPINFOHEADER), /* 8=fourrc+size */ - p_chk->strf.vids.p_bih->biSize - - sizeof(BITMAPINFOHEADER) ); + p_chk->common.i_chunk_size -sizeof(BITMAPINFOHEADER) ); } #ifdef AVI_DEBUG msg_Dbg( (vlc_object_t*)s, @@ -419,11 +414,11 @@ static void AVI_ChunkFree_strf( avi_chunk_t *p_chk ) avi_chunk_strf_t *p_strf = (avi_chunk_strf_t*)p_chk; if( p_strf->common.i_cat == AUDIO_ES ) { - FREE( p_strf->auds.p_wf ); + FREENULL( p_strf->auds.p_wf ); } else if( p_strf->common.i_cat == VIDEO_ES ) { - FREE( p_strf->vids.p_bih ); + FREENULL( p_strf->vids.p_bih ); } } @@ -431,12 +426,15 @@ static int AVI_ChunkRead_strd( stream_t *s, avi_chunk_t *p_chk ) { AVI_READCHUNK_ENTER; p_chk->strd.p_data = malloc( p_chk->common.i_chunk_size ); - memcpy( p_chk->strd.p_data, - p_buff + 8, - p_chk->common.i_chunk_size ); + memcpy( p_chk->strd.p_data, p_buff + 8, p_chk->common.i_chunk_size ); AVI_READCHUNK_EXIT( VLC_SUCCESS ); } +static void AVI_ChunkFree_strd( avi_chunk_t *p_chk ) +{ + if( p_chk->strd.p_data ) free( p_chk->strd.p_data ); +} + static int AVI_ChunkRead_idx1( stream_t *s, avi_chunk_t *p_chk ) { unsigned int i_count, i_index; @@ -473,7 +471,7 @@ static void AVI_ChunkFree_idx1( avi_chunk_t *p_chk ) { p_chk->idx1.i_entry_count = 0; p_chk->idx1.i_entry_max = 0; - FREE( p_chk->idx1.entry ) + FREENULL( p_chk->idx1.entry ) } @@ -558,9 +556,9 @@ static void AVI_ChunkFree_indx( avi_chunk_t *p_chk ) { avi_chunk_indx_t *p_indx = (avi_chunk_indx_t*)p_chk; - FREE( p_indx->idx.std ); - FREE( p_indx->idx.field ); - FREE( p_indx->idx.super ); + FREENULL( p_indx->idx.std ); + FREENULL( p_indx->idx.field ); + FREENULL( p_indx->idx.super ); } @@ -568,7 +566,7 @@ static void AVI_ChunkFree_indx( avi_chunk_t *p_chk ) static struct { vlc_fourcc_t i_fourcc; - char *psz_type; + const char *psz_type; } AVI_strz_type[] = { { AVIFOURCC_IARL, "archive location" }, @@ -631,8 +629,8 @@ static int AVI_ChunkRead_strz( stream_t *s, avi_chunk_t *p_chk ) static void AVI_ChunkFree_strz( avi_chunk_t *p_chk ) { avi_chunk_STRING_t *p_strz = (avi_chunk_STRING_t*)p_chk; - FREE( p_strz->p_type ); - FREE( p_strz->p_str ); + FREENULL( p_strz->p_type ); + FREENULL( p_strz->p_str ); } static int AVI_ChunkRead_nothing( stream_t *s, avi_chunk_t *p_chk ) @@ -656,7 +654,7 @@ static struct { AVIFOURCC_avih, AVI_ChunkRead_avih, AVI_ChunkFree_nothing }, { AVIFOURCC_strh, AVI_ChunkRead_strh, AVI_ChunkFree_nothing }, { AVIFOURCC_strf, AVI_ChunkRead_strf, AVI_ChunkFree_strf }, - { AVIFOURCC_strd, AVI_ChunkRead_strd, AVI_ChunkFree_nothing }, + { AVIFOURCC_strd, AVI_ChunkRead_strd, AVI_ChunkFree_strd }, { AVIFOURCC_idx1, AVI_ChunkRead_idx1, AVI_ChunkFree_idx1 }, { AVIFOURCC_indx, AVI_ChunkRead_indx, AVI_ChunkFree_indx }, { AVIFOURCC_JUNK, AVI_ChunkRead_nothing, AVI_ChunkFree_nothing }, @@ -730,8 +728,10 @@ int _AVI_ChunkRead( stream_t *s, avi_chunk_t *p_chk, avi_chunk_t *p_father ) { return AVI_Chunk_Function[i_index].AVI_ChunkRead_function( s, p_chk ); } - else if( ((char*)&p_chk->common.i_chunk_fourcc)[0] == 'i' && - ((char*)&p_chk->common.i_chunk_fourcc)[1] == 'x' ) + else if( ( ((char*)&p_chk->common.i_chunk_fourcc)[0] == 'i' && + ((char*)&p_chk->common.i_chunk_fourcc)[1] == 'x' ) || + ( ((char*)&p_chk->common.i_chunk_fourcc)[2] == 'i' && + ((char*)&p_chk->common.i_chunk_fourcc)[3] == 'x' ) ) { p_chk->common.i_chunk_fourcc = AVIFOURCC_indx; return AVI_ChunkRead_indx( s, p_chk );