From 4eac890e07087e0727a14ad8d9671a43b87294cc Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 16 Nov 2009 10:41:06 +0000 Subject: Try to detect broken files with unaligned chunks. This patch hopefully makes them playable as long as they have and index without breaking any other files. Fixes http://samples.mplayerhq.hu/avi/invalid_unaligned.avi with native demuxer. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29913 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demux_avi.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'libmpdemux/demux_avi.c') diff --git a/libmpdemux/demux_avi.c b/libmpdemux/demux_avi.c index 21529fb588..0082f2a9fe 100644 --- a/libmpdemux/demux_avi.c +++ b/libmpdemux/demux_avi.c @@ -106,6 +106,12 @@ static int valid_fourcc(unsigned int id){ strchr(valid, fcc[2]) && strchr(valid, fcc[3]); } +static int valid_stream_id(unsigned int id) { + unsigned char* fcc=(unsigned char*)(&id); + return fcc[0] >= '0' && fcc[0] <= '9' && fcc[1] >= '0' && fcc[1] <= '9' && + ((fcc[2] == 'w' && fcc[3] == 'b') || (fcc[2] == 'd' && fcc[3] == 'c')); +} + static int choose_chunk_len(unsigned int len1,unsigned int len2){ // len1 has a bit more priority than len2. len1!=len2 // Note: this is a first-idea-logic, may be wrong. comments welcomed. @@ -218,8 +224,12 @@ do{ idx=&((AVIINDEXENTRY *)priv->idx)[priv->idx_pos++]; if(idx->dwFlags&AVIIF_LIST){ + if (!valid_stream_id(idx->ckid)) // LIST continue; + if (!priv->warned_unaligned) + mp_msg(MSGT_DEMUX, MSGL_WARN, "Looks like unaligned chunk in index, broken AVI file!\n"); + priv->warned_unaligned = 1; } if(!demux_avi_select_stream(demux,idx->ckid)){ mp_dbg(MSGT_DEMUX,MSGL_DBG3,"Skip chunk %.4s (0x%X) \n",(char *)&idx->ckid,(unsigned int)idx->ckid); @@ -317,8 +327,12 @@ do{ idx=&((AVIINDEXENTRY *)priv->idx)[idx_pos]; if(idx->dwFlags&AVIIF_LIST){ + if (!valid_stream_id(idx->ckid)) // LIST continue; + if (!priv->warned_unaligned) + mp_msg(MSGT_DEMUX, MSGL_WARN, "Looks like unaligned chunk in index, broken AVI file!\n"); + priv->warned_unaligned = 1; } if(ds && demux_avi_select_stream(demux,idx->ckid)!=ds){ mp_dbg(MSGT_DEMUX,MSGL_DBG3,"Skip chunk %.4s (0x%X) \n",(char *)&idx->ckid,(unsigned int)idx->ckid); @@ -437,6 +451,7 @@ static demuxer_t* demux_open_avi(demuxer_t* demuxer){ priv->isodml = 0; priv->suidx_size = 0; priv->suidx = NULL; + priv->warned_unaligned = 0; demuxer->priv=(void*)priv; -- cgit v1.2.3 From 9a2be82856e14a4f3899fb94606123e4b7302c19 Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 16 Nov 2009 10:44:00 +0000 Subject: Use calloc instead of initializing each struct member individually to 0. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29914 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demux_avi.c | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) (limited to 'libmpdemux/demux_avi.c') diff --git a/libmpdemux/demux_avi.c b/libmpdemux/demux_avi.c index 0082f2a9fe..97c3c387c2 100644 --- a/libmpdemux/demux_avi.c +++ b/libmpdemux/demux_avi.c @@ -437,21 +437,7 @@ static demuxer_t* demux_open_avi(demuxer_t* demuxer){ demux_stream_t *d_video=demuxer->video; sh_audio_t *sh_audio=NULL; sh_video_t *sh_video=NULL; - avi_priv_t* priv=malloc(sizeof(avi_priv_t)); - - // priv struct: - priv->avi_audio_pts=priv->avi_video_pts=0.0f; - priv->pts_correction=0.0f; - priv->skip_video_frames=0; - priv->pts_corr_bytes=0; - priv->pts_has_video=priv->pts_corrected=0; - priv->video_pack_no=0; - priv->audio_block_no=0; - priv->audio_block_size=0; - priv->isodml = 0; - priv->suidx_size = 0; - priv->suidx = NULL; - priv->warned_unaligned = 0; + avi_priv_t* priv=calloc(1, sizeof(avi_priv_t)); demuxer->priv=(void*)priv; @@ -469,22 +455,15 @@ static demuxer_t* demux_open_avi(demuxer_t* demuxer){ stream_reset(demuxer->stream); stream_seek(demuxer->stream,demuxer->movi_start); - priv->idx_pos=0; - priv->idx_pos_a=0; - priv->idx_pos_v=0; if(priv->idx_size>1){ // decide index format: #if 1 if((AVI_IDX_OFFSET(&((AVIINDEXENTRY *)priv->idx)[0])movi_start || AVI_IDX_OFFSET(&((AVIINDEXENTRY *)priv->idx)[1])movi_start )&& !priv->isodml) priv->idx_offset=demuxer->movi_start-4; - else - priv->idx_offset=0; #else if(AVI_IDX_OFFSET(&((AVIINDEXENTRY *)priv->idx)[0])movi_start) priv->idx_offset=demuxer->movi_start-4; - else - priv->idx_offset=0; #endif mp_msg(MSGT_DEMUX,MSGL_V,"AVI index offset: 0x%X (movi=0x%X idx0=0x%X idx1=0x%X)\n", (int)priv->idx_offset,(int)demuxer->movi_start, -- cgit v1.2.3 From af2988cbcef1b057772d44b9f9752be3f15960b0 Mon Sep 17 00:00:00 2001 From: reimar Date: Sun, 22 Nov 2009 15:18:21 +0000 Subject: Finally rename the STREAM_SEEK define to MP_STREAM_SEEK, there are just too many name clashes, in particular with Windows headers (which define STREAM_SEEK as an enum type). git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29962 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demux_avi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'libmpdemux/demux_avi.c') diff --git a/libmpdemux/demux_avi.c b/libmpdemux/demux_avi.c index 97c3c387c2..2024f8aa62 100644 --- a/libmpdemux/demux_avi.c +++ b/libmpdemux/demux_avi.c @@ -237,7 +237,7 @@ do{ } pos = (off_t)priv->idx_offset+AVI_IDX_OFFSET(idx); - if((posmovi_start || pos>=demux->movi_end) && (demux->movi_end>demux->movi_start) && (demux->stream->flags & STREAM_SEEK)){ + if((posmovi_start || pos>=demux->movi_end) && (demux->movi_end>demux->movi_start) && (demux->stream->flags & MP_STREAM_SEEK)){ mp_msg(MSGT_DEMUX,MSGL_V,"ChunkOffset out of range! idx=0x%"PRIX64" \n",(int64_t)pos); continue; } @@ -262,7 +262,7 @@ do{ if(!(idx->dwFlags&AVIIF_KEYFRAME)) flags=0; } else { demux->filepos=stream_tell(demux->stream); - if(demux->filepos>=demux->movi_end && demux->movi_end>demux->movi_start && (demux->stream->flags & STREAM_SEEK)){ + if(demux->filepos>=demux->movi_end && demux->movi_end>demux->movi_start && (demux->stream->flags & MP_STREAM_SEEK)){ demux->stream->eof=1; return 0; } @@ -442,7 +442,7 @@ static demuxer_t* demux_open_avi(demuxer_t* demuxer){ demuxer->priv=(void*)priv; //---- AVI header: - read_avi_header(demuxer,(demuxer->stream->flags & STREAM_SEEK_BW)?index_mode:-2); + read_avi_header(demuxer,(demuxer->stream->flags & MP_STREAM_SEEK_BW)?index_mode:-2); if(demuxer->audio->id>=0 && !demuxer->a_streams[demuxer->audio->id]){ mp_msg(MSGT_DEMUX,MSGL_WARN,MSGTR_InvalidAudioStreamNosound,demuxer->audio->id); -- cgit v1.2.3