X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Favi%2Favi.c;h=99a2618319458d0d75150758cb27bd6b0fa7637d;hb=647ff1a243bee1f950dd157b193d14aa15eff644;hp=1f536c78f9f8ecaa89bcb0d21edad0aaa8a37ecb;hpb=4f028428053d0342c55deb6ba8b8da114c6a0caa;p=vlc diff --git a/modules/demux/avi/avi.c b/modules/demux/avi/avi.c index 1f536c78f9..99a2618319 100644 --- a/modules/demux/avi/avi.c +++ b/modules/demux/avi/avi.c @@ -24,7 +24,12 @@ * Preamble *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include #include #include @@ -50,26 +55,26 @@ static int Open ( vlc_object_t * ); static void Close( vlc_object_t * ); -static int pi_index[] = {0,1,2}; +static const int pi_index[] = {0,1,2}; -static const char *ppsz_indexes[] = { N_("Ask"), N_("Always fix"), +static const char *const ppsz_indexes[] = { N_("Ask"), N_("Always fix"), N_("Never fix") }; -vlc_module_begin(); - set_shortname( "AVI" ); - set_description( _("AVI demuxer") ); - set_capability( "demux2", 212 ); - set_category( CAT_INPUT ); - set_subcategory( SUBCAT_INPUT_DEMUX ); +vlc_module_begin () + set_shortname( "AVI" ) + set_description( N_("AVI demuxer") ) + set_capability( "demux", 212 ) + set_category( CAT_INPUT ) + set_subcategory( SUBCAT_INPUT_DEMUX ) add_bool( "avi-interleaved", 0, NULL, - INTERLEAVE_TEXT, INTERLEAVE_LONGTEXT, VLC_TRUE ); + INTERLEAVE_TEXT, INTERLEAVE_LONGTEXT, true ) add_integer( "avi-index", 0, NULL, - INDEX_TEXT, INDEX_LONGTEXT, VLC_FALSE ); - change_integer_list( pi_index, ppsz_indexes, 0 ); + INDEX_TEXT, INDEX_LONGTEXT, false ) + change_integer_list( pi_index, ppsz_indexes, NULL ) - set_callbacks( Open, Close ); -vlc_module_end(); + set_callbacks( Open, Close ) +vlc_module_end () /***************************************************************************** * Local prototypes @@ -107,7 +112,7 @@ typedef struct typedef struct { - vlc_bool_t b_activated; + bool b_activated; unsigned int i_cat; /* AUDIO_ES, VIDEO_ES */ vlc_fourcc_t i_codec; @@ -126,6 +131,9 @@ typedef struct unsigned int i_idxposc; /* numero of chunk */ unsigned int i_idxposb; /* byte in the current chunk */ + /* extra information given to the decoder */ + void *p_extra; + /* For VBR audio only */ unsigned int i_blockno; unsigned int i_blocksize; @@ -139,11 +147,11 @@ struct demux_sys_t mtime_t i_time; mtime_t i_length; - vlc_bool_t b_seekable; - vlc_bool_t b_muxed; + bool b_seekable; + bool b_muxed; avi_chunk_t ck_root; - vlc_bool_t b_odml; + bool b_odml; off_t i_movi_begin; off_t i_movi_lastchunk_pos; /* XXX position of last valid chunk */ @@ -154,10 +162,6 @@ struct demux_sys_t /* meta */ vlc_meta_t *meta; - - /* Progress box */ - mtime_t last_update; - int i_dialog_id; }; static inline off_t __EVEN( off_t i ) @@ -214,7 +218,7 @@ static int Open( vlc_object_t * p_this ) demux_t *p_demux = (demux_t *)p_this; demux_sys_t *p_sys; - vlc_bool_t b_index = VLC_FALSE; + bool b_index = false; int i_do_index; avi_chunk_t ck_riff; @@ -249,8 +253,8 @@ static int Open( vlc_object_t * p_this ) p_sys->i_time = 0; p_sys->i_length = 0; p_sys->i_movi_lastchunk_pos = 0; - p_sys->b_odml = VLC_FALSE; - p_sys->b_muxed = VLC_FALSE; + p_sys->b_odml = false; + p_sys->b_muxed = false; p_sys->i_track = 0; p_sys->track = NULL; p_sys->meta = NULL; @@ -291,7 +295,7 @@ static int Open( vlc_object_t * p_this ) if( p_sysx->i_type == AVIFOURCC_AVIX ) { msg_Warn( p_demux, "detected OpenDML file" ); - p_sys->b_odml = VLC_TRUE; + p_sys->b_odml = true; break; } } @@ -335,11 +339,11 @@ static int Open( vlc_object_t * p_this ) if( ( p_sys->meta = vlc_meta_New() ) ) { char buffer[200]; - sprintf( buffer, "%s%s%s%s", - p_avih->i_flags&AVIF_HASINDEX?" HAS_INDEX":"", - p_avih->i_flags&AVIF_MUSTUSEINDEX?" MUST_USE_INDEX":"", - p_avih->i_flags&AVIF_ISINTERLEAVED?" IS_INTERLEAVED":"", - p_avih->i_flags&AVIF_TRUSTCKTYPE?" TRUST_CKTYPE":"" ); + snprintf( buffer, sizeof(buffer), "%s%s%s%s", + p_avih->i_flags&AVIF_HASINDEX?" HAS_INDEX":"", + p_avih->i_flags&AVIF_MUSTUSEINDEX?" MUST_USE_INDEX":"", + p_avih->i_flags&AVIF_ISINTERLEAVED?" IS_INTERLEAVED":"", + p_avih->i_flags&AVIF_TRUSTCKTYPE?" TRUST_CKTYPE":"" ); vlc_meta_SetSetting( p_sys->meta, buffer ); } @@ -347,6 +351,9 @@ static int Open( vlc_object_t * p_this ) for( i = 0 ; i < i_track; i++ ) { avi_track_t *tk = malloc( sizeof( avi_track_t ) ); + if( !tk ) + goto error; + avi_chunk_list_t *p_strl = AVI_ChunkFind( p_hdrl, AVIFOURCC_strl, i ); avi_chunk_strh_t *p_strh = AVI_ChunkFind( p_strl, AVIFOURCC_strh, 0 ); avi_chunk_STRING_t *p_strn = AVI_ChunkFind( p_strl, AVIFOURCC_strn, 0 ); @@ -354,18 +361,7 @@ static int Open( vlc_object_t * p_this ) avi_chunk_strf_vids_t *p_vids = NULL; es_format_t fmt; - tk->b_activated = VLC_FALSE; - tk->p_index = 0; - tk->i_idxnb = 0; - tk->i_idxmax = 0; - tk->i_idxposc = 0; - tk->i_idxposb = 0; - - tk->i_blockno = 0; - tk->i_blocksize = 0; - - tk->p_es = NULL; - tk->p_out_muxed = NULL; + memset( tk, 0, sizeof( avi_track_t ) ); p_vids = (avi_chunk_strf_vids_t*)AVI_ChunkFind( p_strl, AVIFOURCC_strf, 0 ); p_auds = (avi_chunk_strf_auds_t*)AVI_ChunkFind( p_strl, AVIFOURCC_strf, 0 ); @@ -373,6 +369,7 @@ static int Open( vlc_object_t * p_this ) if( p_strl == NULL || p_strh == NULL || p_auds == NULL || p_vids == NULL ) { msg_Warn( p_demux, "stream[%d] incomplete", i ); + free( tk ); continue; } @@ -388,17 +385,28 @@ static int Open( vlc_object_t * p_this ) tk->i_cat = AUDIO_ES; tk->i_codec = AVI_FourccGetCodec( AUDIO_ES, p_auds->p_wf->wFormatTag ); - if( ( tk->i_blocksize = p_auds->p_wf->nBlockAlign ) == 0 ) + + tk->i_blocksize = p_auds->p_wf->nBlockAlign; + if( tk->i_blocksize == 0 ) { if( p_auds->p_wf->wFormatTag == 1 ) - { tk->i_blocksize = p_auds->p_wf->nChannels * (p_auds->p_wf->wBitsPerSample/8); - } else - { tk->i_blocksize = 1; - } } + else if( tk->i_samplesize != 0 && tk->i_samplesize != tk->i_blocksize ) + { + msg_Warn( p_demux, "track[%d] samplesize=%d and blocksize=%d are not equal." + "Using blocksize as a workaround.", + i, tk->i_samplesize, tk->i_blocksize ); + tk->i_samplesize = tk->i_blocksize; + } + + if( tk->i_codec == VLC_FOURCC( 'v', 'o', 'r', 'b' ) ) + { + tk->i_blocksize = 0; /* fix vorbis VBR decoding */ + } + es_format_Init( &fmt, AUDIO_ES, tk->i_codec ); fmt.audio.i_channels = p_auds->p_wf->nChannels; @@ -407,12 +415,85 @@ static int Open( vlc_object_t * p_this ) fmt.audio.i_blockalign = p_auds->p_wf->nBlockAlign; fmt.audio.i_bitspersample = p_auds->p_wf->wBitsPerSample; 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, + p_auds->p_wf->nSamplesPerSec, + p_auds->p_wf->wBitsPerSample ); + fmt.i_extra = __MIN( p_auds->p_wf->cbSize, p_auds->i_chunk_size - sizeof(WAVEFORMATEX) ); - fmt.p_extra = &p_auds->p_wf[1]; - msg_Dbg( p_demux, "stream[%d] audio(0x%x) %d channels %dHz %dbits", - i, p_auds->p_wf->wFormatTag, p_auds->p_wf->nChannels, - p_auds->p_wf->nSamplesPerSec, p_auds->p_wf->wBitsPerSample); + fmt.p_extra = tk->p_extra = malloc( fmt.i_extra ); + if( !fmt.p_extra ) goto error; + memcpy( fmt.p_extra, &p_auds->p_wf[1], fmt.i_extra ); + + /* Rewrite the vorbis headers from Xiph-like format + * to VLC internal format + * + * Xiph format: + * - 1st byte == N, is the number of packets - 1 + * - Following bytes are the size of the N first packets: + * while( *p == 0xFF ) { size += 0xFF; p++ } size += *p; + * (the size of the last packet is the size of remaining + * data in the buffer) + * - Finally, all the packets concatenated + * + * VLC format: + * - Size of the packet on 16 bits (big endian) FIXME: should be 32 bits to be safe + * - The packet itself + * - Size of the next packet, and so on ... + */ + + if( tk->i_codec == VLC_FOURCC( 'v', 'o', 'r', 'b' ) ) + { + uint8_t *p_extra = fmt.p_extra; + size_t i_extra = fmt.i_extra; + + if( i_extra <= 1 ) break; + if( *p_extra++ != 2 ) break; /* 3 packets - 1 = 2 */ + i_extra--; + + size_t i_identifier_len = 0; + while( *p_extra == 0xFF ) + { + i_identifier_len += 0xFF; + p_extra++; + if( --i_extra <= 1 ) break; + } + i_identifier_len += *p_extra++; + if( i_identifier_len > --i_extra ) break; + + size_t i_comment_len = 0; + while( *p_extra == 0xFF ) + { + i_comment_len += 0xFF; + p_extra++; + if( --i_extra <= 1 ) break; + } + i_comment_len += *p_extra++; + if( i_comment_len > --i_extra ) break; + size_t i_cookbook_len = i_extra; + + size_t i_headers_size = 3 * 2 + i_identifier_len + + i_comment_len + i_cookbook_len; + uint8_t *p_out = malloc( i_headers_size ); + if( !p_out ) goto error; + free( fmt.p_extra ); + fmt.p_extra = tk->p_extra = p_out; + fmt.i_extra = i_headers_size; + #define copy_packet( len ) \ + *p_out++ = len >> 8; \ + *p_out++ = len & 0xFF; \ + memcpy( p_out, p_extra, len ); \ + p_out += len; \ + p_extra += len; + copy_packet( i_identifier_len ); + copy_packet( i_comment_len ); + copy_packet( i_cookbook_len ); + #undef copy_packet + break; + } break; case( AVIFOURCC_vids ): @@ -429,27 +510,34 @@ static int Open( vlc_object_t * p_this ) case 24: tk->i_codec = VLC_FOURCC('R','V','2','4'); break; - case 16: - /* tk->i_codec = VLC_FOURCC('R','V','1','6');*/ - /* break;*/ + case 16: /* Yes it is RV15 */ case 15: tk->i_codec = VLC_FOURCC('R','V','1','5'); break; - case 9: - tk->i_codec = VLC_FOURCC( 'Y', 'V', 'U', '9' ); /* <- TODO check that */ + case 9: /* <- TODO check that */ + tk->i_codec = VLC_FOURCC( 'Y', 'V', 'U', '9' ); break; - case 8: + case 8: /* <- TODO check that */ tk->i_codec = VLC_FOURCC('Y','8','0','0'); break; } es_format_Init( &fmt, VIDEO_ES, tk->i_codec ); - if( p_vids->p_bih->biBitCount == 24 ) + switch( tk->i_codec ) { - /* This is in BGR format */ - fmt.video.i_bmask = 0x00ff0000; + case VLC_FOURCC('R','V','2','4'): + case VLC_FOURCC('R','V','3','2'): + fmt.video.i_rmask = 0x00ff0000; fmt.video.i_gmask = 0x0000ff00; - fmt.video.i_rmask = 0x000000ff; + fmt.video.i_bmask = 0x000000ff; + break; + case VLC_FOURCC('R','V','1','5'): + fmt.video.i_rmask = 0x7c00; + fmt.video.i_gmask = 0x03e0; + fmt.video.i_bmask = 0x001f; + break; + default: + break; } } else @@ -471,10 +559,10 @@ static int Open( vlc_object_t * p_this ) __MIN( p_vids->p_bih->biSize - sizeof( BITMAPINFOHEADER ), p_vids->i_chunk_size - sizeof(BITMAPINFOHEADER) ); fmt.p_extra = &p_vids->p_bih[1]; - msg_Dbg( p_demux, "stream[%d] video(%4.4s) %dx%d %dbpp %ffps", + msg_Dbg( p_demux, "stream[%d] video(%4.4s) %"PRIu32"x%"PRIu32" %dbpp %ffps", i, (char*)&p_vids->p_bih->biCompression, - p_vids->p_bih->biWidth, - p_vids->p_bih->biHeight, + (uint32_t)p_vids->p_bih->biWidth, + (uint32_t)p_vids->p_bih->biHeight, p_vids->p_bih->biBitCount, (float)tk->i_rate/(float)tk->i_scale ); @@ -488,21 +576,22 @@ static int Open( vlc_object_t * p_this ) /* Extract palette from extradata if bpp <= 8 * (assumes that extradata contains only palette but appears * to be true for all palettized codecs we support) */ - if( fmt.i_extra && fmt.video.i_bits_per_pixel <= 8 && - fmt.video.i_bits_per_pixel > 0 ) + if( fmt.video.i_bits_per_pixel > 0 && fmt.video.i_bits_per_pixel <= 8 ) { - int i; + /* The palette is not always included in biSize */ + fmt.i_extra = p_vids->i_chunk_size - sizeof(BITMAPINFOHEADER); + if( fmt.i_extra > 0 ) + { + const uint8_t *p_pal = fmt.p_extra; - fmt.video.p_palette = calloc( sizeof(video_palette_t), 1 ); - fmt.video.p_palette->i_entries = 1; + fmt.video.p_palette = calloc( 1, sizeof(video_palette_t) ); + fmt.video.p_palette->i_entries = __MIN(fmt.i_extra/4, 256); - /* Apparently this is necessary. But why ? */ - fmt.i_extra = - p_vids->i_chunk_size - sizeof(BITMAPINFOHEADER); - for( i = 0; i < __MIN(fmt.i_extra/4, 256); i++ ) - { - ((uint32_t *)&fmt.video.p_palette->palette[0][0])[i] = - GetDWLE((uint32_t*)fmt.p_extra + i); + for( int i = 0; i < fmt.video.p_palette->i_entries; i++ ) + { + for( int j = 0; j < 4; j++ ) + fmt.video.p_palette->palette[i][j] = p_pal[4*i+j]; + } } } break; @@ -516,11 +605,13 @@ static int Open( vlc_object_t * p_this ) case( AVIFOURCC_iavs): case( AVIFOURCC_ivas): - p_sys->b_muxed = VLC_TRUE; + p_sys->b_muxed = true; msg_Dbg( p_demux, "stream[%d] iavs with handler %4.4s", i, (char *)&p_strh->i_handler ); if( p_strh->i_handler == FOURCC_dvsd || p_strh->i_handler == FOURCC_dvhd || - p_strh->i_handler == FOURCC_dvsl ) + p_strh->i_handler == FOURCC_dvsl || + p_strh->i_handler == FOURCC_dv25 || + p_strh->i_handler == FOURCC_dv50 ) { tk->p_out_muxed = stream_DemuxNew( p_demux, (char *)"rawdv", p_demux->out ); if( !tk->p_out_muxed ) @@ -539,11 +630,7 @@ static int Open( vlc_object_t * p_this ) continue; } if( p_strn ) - { - /* The charset of p_strn is undefined */ - EnsureUTF8( p_strn->p_str ); - fmt.psz_description = strdup( p_strn->p_str ); - } + fmt.psz_description = FromLatin1( p_strn->p_str ); if( tk->p_out_muxed == NULL ) tk->p_es = es_out_Add( p_demux->out, &fmt ); TAB_APPEND( p_sys->i_track, p_sys->track, tk ); @@ -581,9 +668,13 @@ aviindex: (mtime_t)1000000 ) { msg_Warn( p_demux, "broken or missing index, 'seek' will be " - "axproximative or will have strange behaviour" ); + "approximative or will exhibit strange behavior" ); if( i_do_index == 0 && !b_index ) { + if( !p_sys->b_seekable ) { + b_index = true; + goto aviindex; + } int i_create; i_create = intf_UserYesNo( p_demux, _("AVI Index") , _( "This AVI file is broken. Seeking will not " @@ -592,7 +683,7 @@ aviindex: _( "Repair" ), _( "Don't repair" ), _( "Cancel") ); if( i_create == DIALOG_OK_YES ) { - b_index = VLC_TRUE; + b_index = true; msg_Dbg( p_demux, "Fixing AVI index" ); goto aviindex; } @@ -682,12 +773,13 @@ static void Close ( vlc_object_t * p_this ) if( p_sys->track[i] ) { if( p_sys->track[i]->p_out_muxed ) - stream_DemuxDelete( p_sys->track[i]->p_out_muxed ); - FREENULL( p_sys->track[i]->p_index ); + stream_Delete( p_sys->track[i]->p_out_muxed ); + free( p_sys->track[i]->p_index ); + free( p_sys->track[i]->p_extra ); free( p_sys->track[i] ); } } - FREENULL( p_sys->track ); + free( p_sys->track ); AVI_ChunkFreeRoot( p_demux->s, &p_sys->ck_root ); vlc_meta_Delete( p_sys->meta ); @@ -703,7 +795,7 @@ static void Close ( vlc_object_t * p_this ) *****************************************************************************/ typedef struct { - vlc_bool_t b_ok; + bool b_ok; int i_toread; @@ -718,7 +810,7 @@ static int Demux_Seekable( demux_t *p_demux ) unsigned int i_track_count = 0; unsigned int i_track; - vlc_bool_t b_stream; + bool b_stream; /* cannot be more than 100 stream (dcXX or wbXX) */ avi_track_toread_t toread[100]; @@ -727,12 +819,12 @@ static int Demux_Seekable( demux_t *p_demux ) for( i_track = 0; i_track < p_sys->i_track; i_track++ ) { avi_track_t *tk = p_sys->track[i_track]; - vlc_bool_t b; + bool b; if( p_sys->b_muxed && tk->p_out_muxed ) { i_track_count++; - tk->b_activated = VLC_TRUE; + tk->b_activated = true; continue; } @@ -743,11 +835,11 @@ static int Demux_Seekable( demux_t *p_demux ) { AVI_TrackSeek( p_demux, i_track, p_sys->i_time ); } - tk->b_activated = VLC_TRUE; + tk->b_activated = true; } else if( !b && tk->b_activated ) { - tk->b_activated = VLC_FALSE; + tk->b_activated = false; } if( b ) { @@ -811,19 +903,19 @@ static int Demux_Seekable( demux_t *p_demux ) } } - b_stream = VLC_FALSE; + b_stream = false; for( ;; ) { avi_track_t *tk; - vlc_bool_t b_done; + bool b_done; block_t *p_frame; off_t i_pos; unsigned int i; size_t i_size; /* search for first chunk to be read */ - for( i = 0, b_done = VLC_TRUE, i_pos = -1; i < p_sys->i_track; i++ ) + for( i = 0, b_done = true, i_pos = -1; i < p_sys->i_track; i++ ) { if( !toread[i].b_ok || AVI_GetDPTS( p_sys->track[i], @@ -834,7 +926,7 @@ static int Demux_Seekable( demux_t *p_demux ) if( toread[i].i_toread > 0 ) { - b_done = VLC_FALSE; /* not yet finished */ + b_done = false; /* not yet finished */ } if( toread[i].i_posf > 0 ) { @@ -848,7 +940,13 @@ static int Demux_Seekable( demux_t *p_demux ) if( b_done ) { - return( 1 ); + for( i = 0; i < p_sys->i_track; i++ ) + { + if( toread[i].b_ok ) + return 1; + } + msg_Warn( p_demux, "all tracks have failed, exiting..." ); + return 0; } if( i_pos == -1 ) @@ -895,7 +993,7 @@ static int Demux_Seekable( demux_t *p_demux ) * affect the reading speed too much. */ if( !(++i_loop_count % 1024) ) { - if( p_demux->b_die ) return -1; + if( !vlc_object_alive (p_demux) ) return -1; msleep( 10000 ); if( !(i_loop_count % (1024 * 10)) ) @@ -979,8 +1077,8 @@ static int Demux_Seekable( demux_t *p_demux ) if( ( p_frame = stream_Block( p_demux->s, __EVEN( i_size ) ) )==NULL ) { msg_Warn( p_demux, "failed reading data" ); - tk->b_activated = VLC_FALSE; - toread[i_track].b_ok = VLC_FALSE; + tk->b_activated = false; + toread[i_track].b_ok = false; continue; } if( i_size % 2 ) /* read was padded on word boundary */ @@ -1046,7 +1144,7 @@ static int Demux_Seekable( demux_t *p_demux ) toread[i_track].i_posf = -1; } - b_stream = VLC_TRUE; /* at least one read succeed */ + b_stream = true; /* at least one read succeed */ if( tk->i_cat != VIDEO_ES ) p_frame->i_dts = p_frame->i_pts; @@ -1090,7 +1188,7 @@ static int Demux_UnSeekable( demux_t *p_demux ) for( i_stream = 0; i_stream < p_sys->i_track; i_stream++ ) { avi_track_t *tk = p_sys->track[i_stream]; - vlc_bool_t b; + bool b; es_out_Control( p_demux->out, ES_OUT_GET_ES_STATE, tk->p_es, &b ); @@ -1214,7 +1312,7 @@ static int Seek( demux_t *p_demux, mtime_t i_date, int i_percent ) demux_sys_t *p_sys = p_demux->p_sys; unsigned int i_stream; - msg_Dbg( p_demux, "seek requested: "I64Fd" seconds %d%%", + msg_Dbg( p_demux, "seek requested: %"PRId64" seconds %d%%", i_date / 1000000, i_percent ); if( p_sys->b_seekable ) @@ -1274,7 +1372,7 @@ static int Seek( demux_t *p_demux, mtime_t i_date, int i_percent ) i_date = AVI_GetPTS( p_stream ); /* TODO better support for i_samplesize != 0 */ - msg_Dbg( p_demux, "estimate date "I64Fd, i_date ); + msg_Dbg( p_demux, "estimate date %"PRId64, i_date ); } /* */ @@ -1287,8 +1385,9 @@ static int Seek( demux_t *p_demux, mtime_t i_date, int i_percent ) AVI_TrackSeek( p_demux, i_stream, i_date ); } + es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME, i_date ); p_sys->i_time = i_date; - msg_Dbg( p_demux, "seek: "I64Fd" seconds", p_sys->i_time /1000000 ); + msg_Dbg( p_demux, "seek: %"PRId64" seconds", p_sys->i_time /1000000 ); return VLC_SUCCESS; } else @@ -1513,7 +1612,7 @@ static int AVI_StreamChunkFind( demux_t *p_demux, unsigned int i_stream ) for( ;; ) { - if( p_demux->b_die ) return VLC_EGENERIC; + if( !vlc_object_alive (p_demux) ) return VLC_EGENERIC; if( AVI_PacketGetHeader( p_demux, &avi_pk ) ) { @@ -1533,7 +1632,7 @@ static int AVI_StreamChunkFind( demux_t *p_demux, unsigned int i_stream ) * affect the reading speed too much. */ if( !(++i_loop_count % 1024) ) { - if( p_demux->b_die ) return VLC_EGENERIC; + if( !vlc_object_alive (p_demux) ) return VLC_EGENERIC; msleep( 10000 ); if( !(i_loop_count % (1024 * 10)) ) @@ -1696,7 +1795,7 @@ static int AVI_TrackSeek( demux_t *p_demux, } msg_Dbg( p_demux, - "old:"I64Fd" %s new "I64Fd, + "old:%"PRId64" %s new %"PRId64, i_oldpts, i_oldpts > i_date ? ">" : "<", i_date ); @@ -1717,8 +1816,6 @@ static int AVI_TrackSeek( demux_t *p_demux, return VLC_EGENERIC; } } - if( p_stream->p_es ) - es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME, p_stream->p_es, i_date ); } #if 0 else @@ -1752,7 +1849,7 @@ static int AVI_TrackSeek( demux_t *p_demux, } /**************************************************************************** - * Return VLC_TRUE if it's a key frame + * Return true if it's a key frame ****************************************************************************/ static int AVI_GetKeyFlag( vlc_fourcc_t i_fourcc, uint8_t *p_byte ) { @@ -1888,6 +1985,7 @@ static void AVI_ParseStreamHeader( vlc_fourcc_t i_id, break; case AVITWOCC_dc: case AVITWOCC_db: + case AVITWOCC_AC: SET_PTR( pi_type, VIDEO_ES ); break; default: @@ -2016,7 +2114,7 @@ static int AVI_PacketSearch( demux_t *p_demux ) * this code is called only on broken files). */ if( !(++i_count % 1024) ) { - if( p_demux->b_die ) return VLC_EGENERIC; + if( !vlc_object_alive (p_demux) ) return VLC_EGENERIC; msleep( 10000 ); if( !(i_count % (1024 * 10)) ) @@ -2079,7 +2177,7 @@ static int AVI_IndexLoad_idx1( demux_t *p_demux ) off_t i_offset; unsigned int i; - vlc_bool_t b_keyset[100]; + bool b_keyset[100]; p_riff = AVI_ChunkFind( &p_sys->ck_root, AVIFOURCC_RIFF, 0); p_idx1 = AVI_ChunkFind( p_riff, AVIFOURCC_idx1, 0); @@ -2106,7 +2204,7 @@ static int AVI_IndexLoad_idx1( demux_t *p_demux ) /* Reset b_keyset */ for( i_stream = 0; i_stream < p_sys->i_track; i_stream++ ) - b_keyset[i_stream] = VLC_FALSE; + b_keyset[i_stream] = false; for( i_index = 0; i_index < p_idx1->i_entry_count; i_index++ ) { @@ -2127,7 +2225,7 @@ static int AVI_IndexLoad_idx1( demux_t *p_demux ) AVI_IndexAddEntry( p_sys, i_stream, &index ); if( index.i_flags&AVIIF_KEYFRAME ) - b_keyset[i_stream] = VLC_TRUE; + b_keyset[i_stream] = true; } } @@ -2270,12 +2368,15 @@ static void AVI_IndexCreate( demux_t *p_demux ) { demux_sys_t *p_sys = p_demux->p_sys; - avi_chunk_list_t *p_riff; - avi_chunk_list_t *p_movi; + avi_chunk_list_t *p_riff; + avi_chunk_list_t *p_movi; unsigned int i_stream; off_t i_movi_end; + mtime_t i_dialog_update; + interaction_dialog_t *p_dialog = NULL; + p_riff = AVI_ChunkFind( &p_sys->ck_root, AVIFOURCC_RIFF, 0); p_movi = AVI_ChunkFind( p_riff, AVIFOURCC_movi, 0); @@ -2299,40 +2400,34 @@ static void AVI_IndexCreate( demux_t *p_demux ) /* Only show dialog if AVI is > 10MB */ - p_demux->p_sys->i_dialog_id = -1; + i_dialog_update = mdate(); if( stream_Size( p_demux->s ) > 10000000 ) - { - p_demux->p_sys->i_dialog_id = intf_IntfProgress( p_demux, - _( "Fixing AVI Index..." ), - 0.0 ); - p_demux->p_sys->last_update = mdate(); - } + p_dialog = intf_IntfProgress( p_demux, _("Fixing AVI Index..."), 0.0 ); for( ;; ) { avi_packet_t pk; - if( p_demux->b_die ) - { - return; - } + if( !vlc_object_alive (p_demux) ) + break; - /* Don't update dialog too often */ - if( p_demux->p_sys->i_dialog_id > 0 && - mdate() - p_demux->p_sys->last_update > 100000 ) + /* Don't update/check dialog too often */ + if( p_dialog && mdate() - i_dialog_update > 100000 ) { - int64_t i_pos = stream_Tell( p_demux->s )* 100 / - stream_Size( p_demux->s ); - float f_pos = (float)i_pos; - p_demux->p_sys->last_update = mdate(); - intf_ProgressUpdate( p_demux, p_demux->p_sys->i_dialog_id, + if( intf_ProgressIsCancelled( p_demux, p_dialog ) ) + break; + + double f_pos = 100.0 * stream_Tell( p_demux->s ) / + stream_Size( p_demux->s ); + intf_ProgressUpdate( p_demux, p_dialog, _( "Fixing AVI Index..." ), f_pos, -1 ); + + i_dialog_update = mdate(); } if( AVI_PacketGetHeader( p_demux, &pk ) ) - { break; - } + if( pk.i_stream < p_sys->i_track && pk.i_cat == p_sys->track[pk.i_stream]->i_cat ) { @@ -2348,33 +2443,35 @@ static void AVI_IndexCreate( demux_t *p_demux ) { switch( pk.i_fourcc ) { - case AVIFOURCC_idx1: - if( p_sys->b_odml ) - { - avi_chunk_list_t *p_sysx; - p_sysx = AVI_ChunkFind( &p_sys->ck_root, - AVIFOURCC_RIFF, 1 ); + case AVIFOURCC_idx1: + if( p_sys->b_odml ) + { + avi_chunk_list_t *p_sysx; + p_sysx = AVI_ChunkFind( &p_sys->ck_root, + AVIFOURCC_RIFF, 1 ); - msg_Dbg( p_demux, "looking for new RIFF chunk" ); - if( stream_Seek( p_demux->s, p_sysx->i_chunk_pos + 24)) - { - goto print_stat; - } - break; - } - goto print_stat; - case AVIFOURCC_RIFF: - msg_Dbg( p_demux, "new RIFF chunk found" ); - case AVIFOURCC_rec: - case AVIFOURCC_JUNK: - break; - default: - msg_Warn( p_demux, "need resync, probably broken avi" ); - if( AVI_PacketSearch( p_demux ) ) - { - msg_Warn( p_demux, "lost sync, abord index creation" ); + msg_Dbg( p_demux, "looking for new RIFF chunk" ); + if( stream_Seek( p_demux->s, p_sysx->i_chunk_pos + 24 ) ) goto print_stat; - } + break; + } + goto print_stat; + + case AVIFOURCC_RIFF: + msg_Dbg( p_demux, "new RIFF chunk found" ); + break; + + case AVIFOURCC_rec: + case AVIFOURCC_JUNK: + break; + + default: + msg_Warn( p_demux, "need resync, probably broken avi" ); + if( AVI_PacketSearch( p_demux ) ) + { + msg_Warn( p_demux, "lost sync, abord index creation" ); + goto print_stat; + } } } @@ -2386,17 +2483,13 @@ static void AVI_IndexCreate( demux_t *p_demux ) } print_stat: - if( p_demux->p_sys->i_dialog_id > 0 ) - { - intf_UserHide( p_demux, p_demux->p_sys->i_dialog_id ); - } + if( p_dialog != NULL ) + intf_UserHide( p_demux, p_dialog ); for( i_stream = 0; i_stream < p_sys->i_track; i_stream++ ) { - msg_Dbg( p_demux, - "stream[%d] creating %d index entries", - i_stream, - p_sys->track[i_stream]->i_idxnb ); + msg_Dbg( p_demux, "stream[%d] creating %d index entries", + i_stream, p_sys->track[i_stream]->i_idxnb ); } } @@ -2407,19 +2500,19 @@ static int AVI_TrackStopFinishedStreams( demux_t *p_demux ) { demux_sys_t *p_sys = p_demux->p_sys; unsigned int i; - int b_end = VLC_TRUE; + int b_end = true; for( i = 0; i < p_sys->i_track; i++ ) { avi_track_t *tk = p_sys->track[i]; if( tk->i_idxposc >= tk->i_idxnb ) { - tk->b_activated = VLC_FALSE; - if( tk->p_es ) es_out_Control( p_demux->out, ES_OUT_SET_ES_STATE, tk->p_es, VLC_FALSE ); + tk->b_activated = false; + if( tk->p_es ) es_out_Control( p_demux->out, ES_OUT_SET_ES_STATE, tk->p_es, false ); } else { - b_end = VLC_FALSE; + b_end = false; } } return( b_end ); @@ -2458,7 +2551,7 @@ static mtime_t AVI_MovieGetLength( demux_t *p_demux ) i_length /= (mtime_t)1000000; /* in seconds */ msg_Dbg( p_demux, - "stream[%d] length:"I64Fd" (based on index)", + "stream[%d] length:%"PRId64" (based on index)", i, i_length ); i_maxlength = __MAX( i_maxlength, i_length );