X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Favi%2Favi.c;h=98f60d5f724ef4128628949d04535ca975264467;hb=658686029ee756fbf4beb8e0cdcc4b0bc5dd18ed;hp=caf98286287290ca3ccce48ee776e543cace21ab;hpb=6b40432a9d9acb294f38857f0b2a5584029c9edb;p=vlc diff --git a/modules/demux/avi/avi.c b/modules/demux/avi/avi.c index caf9828628..98f60d5f72 100644 --- a/modules/demux/avi/avi.c +++ b/modules/demux/avi/avi.c @@ -32,7 +32,7 @@ #include #include -#include +#include #include #include @@ -68,10 +68,10 @@ vlc_module_begin () set_subcategory( SUBCAT_INPUT_DEMUX ) add_bool( "avi-interleaved", 0, NULL, - INTERLEAVE_TEXT, INTERLEAVE_LONGTEXT, true ); + INTERLEAVE_TEXT, INTERLEAVE_LONGTEXT, true ) add_integer( "avi-index", 0, NULL, - INDEX_TEXT, INDEX_LONGTEXT, false ); - change_integer_list( pi_index, ppsz_indexes, NULL ); + INDEX_TEXT, INDEX_LONGTEXT, false ) + change_integer_list( pi_index, ppsz_indexes, NULL ) set_callbacks( Open, Close ) vlc_module_end () @@ -106,7 +106,7 @@ typedef struct uint32_t i_flags; off_t i_pos; uint32_t i_length; - uint32_t i_lengthtotal; + int64_t i_lengthtotal; } avi_entry_t; @@ -339,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 ); } @@ -402,7 +402,7 @@ static int Open( vlc_object_t * p_this ) tk->i_samplesize = tk->i_blocksize; } - if( tk->i_codec == VLC_FOURCC( 'v', 'o', 'r', 'b' ) ) + if( tk->i_codec == VLC_CODEC_VORBIS ) { tk->i_blocksize = 0; /* fix vorbis VBR decoding */ } @@ -445,7 +445,7 @@ static int Open( vlc_object_t * p_this ) * - Size of the next packet, and so on ... */ - if( tk->i_codec == VLC_FOURCC( 'v', 'o', 'r', 'b' ) ) + if( tk->i_codec == VLC_CODEC_VORBIS ) { uint8_t *p_extra = fmt.p_extra; size_t i_extra = fmt.i_extra; @@ -500,38 +500,44 @@ static int Open( vlc_object_t * p_this ) tk->i_cat = VIDEO_ES; tk->i_codec = AVI_FourccGetCodec( VIDEO_ES, p_vids->p_bih->biCompression ); - if( p_vids->p_bih->biCompression == 0x00 ) + if( p_vids->p_bih->biCompression == VLC_FOURCC( 'D', 'X', 'S', 'B' ) ) + { + msg_Dbg( p_demux, "stream[%d] subtitles", i ); + es_format_Init( &fmt, SPU_ES, p_vids->p_bih->biCompression ); + break; + } + else if( p_vids->p_bih->biCompression == 0x00 ) { switch( p_vids->p_bih->biBitCount ) { case 32: - tk->i_codec = VLC_FOURCC('R','V','3','2'); + tk->i_codec = VLC_CODEC_RGB32; break; case 24: - tk->i_codec = VLC_FOURCC('R','V','2','4'); + tk->i_codec = VLC_CODEC_RGB24; break; case 16: /* Yes it is RV15 */ case 15: - tk->i_codec = VLC_FOURCC('R','V','1','5'); + tk->i_codec = VLC_CODEC_RGB15; break; case 9: /* <- TODO check that */ - tk->i_codec = VLC_FOURCC( 'Y', 'V', 'U', '9' ); + tk->i_codec = VLC_CODEC_I410; break; case 8: /* <- TODO check that */ - tk->i_codec = VLC_FOURCC('Y','8','0','0'); + tk->i_codec = VLC_CODEC_GREY; break; } es_format_Init( &fmt, VIDEO_ES, tk->i_codec ); switch( tk->i_codec ) { - case VLC_FOURCC('R','V','2','4'): - case VLC_FOURCC('R','V','3','2'): + case VLC_CODEC_RGB24: + case VLC_CODEC_RGB32: fmt.video.i_rmask = 0x00ff0000; fmt.video.i_gmask = 0x0000ff00; fmt.video.i_bmask = 0x000000ff; break; - case VLC_FOURCC('R','V','1','5'): + case VLC_CODEC_RGB15: fmt.video.i_rmask = 0x7c00; fmt.video.i_gmask = 0x03e0; fmt.video.i_bmask = 0x001f; @@ -543,10 +549,11 @@ static int Open( vlc_object_t * p_this ) else { es_format_Init( &fmt, VIDEO_ES, p_vids->p_bih->biCompression ); - if( tk->i_codec == FOURCC_mp4v && + if( tk->i_codec == VLC_CODEC_MP4V && !strncasecmp( (char*)&p_strh->i_handler, "XVID", 4 ) ) { - fmt.i_codec = VLC_FOURCC( 'X', 'V', 'I', 'D' ); + fmt.i_codec = + fmt.i_original_fourcc = VLC_FOURCC( 'X', 'V', 'I', 'D' ); } } tk->i_samplesize = 0; @@ -584,7 +591,7 @@ static int Open( vlc_object_t * p_this ) { const uint8_t *p_pal = fmt.p_extra; - fmt.video.p_palette = calloc( sizeof(video_palette_t), 1 ); + fmt.video.p_palette = calloc( 1, sizeof(video_palette_t) ); fmt.video.p_palette->i_entries = __MIN(fmt.i_extra/4, 256); for( int i = 0; i < fmt.video.p_palette->i_entries; i++ ) @@ -598,7 +605,7 @@ static int Open( vlc_object_t * p_this ) case( AVIFOURCC_txts): tk->i_cat = SPU_ES; - tk->i_codec = VLC_FOURCC( 's', 'u', 'b', 't' ); + tk->i_codec = VLC_CODEC_SUBT; msg_Dbg( p_demux, "stream[%d] subtitles", i ); es_format_Init( &fmt, SPU_ES, tk->i_codec ); break; @@ -675,23 +682,20 @@ aviindex: b_index = true; goto aviindex; } - int i_create; - i_create = intf_UserYesNo( p_demux, _("AVI Index") , - _( "This AVI file is broken. Seeking will not " - "work correctly.\nDo you want to " - "try to repair it?\n\nThis might take a long time." ), - _( "Repair" ), _( "Don't repair" ), _( "Cancel") ); - if( i_create == DIALOG_OK_YES ) - { - b_index = true; - msg_Dbg( p_demux, "Fixing AVI index" ); - goto aviindex; - } - else if( i_create == DIALOG_CANCELLED ) + switch( dialog_Question( p_demux, _("AVI Index") , + _( "This AVI file is broken. Seeking will not work correctly.\n" + "Do you want to try to fix it?\n\n" + "This might take a long time." ), + _( "Repair" ), _( "Don't repair" ), _( "Cancel") ) ) { - /* Kill input */ - vlc_object_kill( p_demux->p_parent ); - goto error; + case 1: + b_index = true; + msg_Dbg( p_demux, "Fixing AVI index" ); + goto aviindex; + case 3: + /* Kill input */ + vlc_object_kill( p_demux->p_parent ); + goto error; } } } @@ -1855,7 +1859,7 @@ static int AVI_GetKeyFlag( vlc_fourcc_t i_fourcc, uint8_t *p_byte ) { switch( i_fourcc ) { - case FOURCC_DIV1: + case VLC_CODEC_DIV1: /* we have: * startcode: 0x00000100 32bits * framenumber ? 5bits @@ -1868,13 +1872,14 @@ static int AVI_GetKeyFlag( vlc_fourcc_t i_fourcc, uint8_t *p_byte ) } return p_byte[4] & 0x06 ? 0 : AVIIF_KEYFRAME; - case FOURCC_DIV2: - case FOURCC_DIV3: /* wmv1 also */ + case VLC_CODEC_DIV2: + case VLC_CODEC_DIV3: + case VLC_CODEC_WMV1: /* we have * picture type 0(I),1(P) 2bits */ return p_byte[0] & 0xC0 ? 0 : AVIIF_KEYFRAME; - case FOURCC_mp4v: + case VLC_CODEC_MP4V: /* we should find first occurrence of 0x000001b6 (32bits) * startcode: 0x000001b6 32bits * piture type 0(I),1(P) 2bits @@ -1899,60 +1904,8 @@ vlc_fourcc_t AVI_FourccGetCodec( unsigned int i_cat, vlc_fourcc_t i_codec ) case AUDIO_ES: wf_tag_to_fourcc( i_codec, &i_codec, NULL ); return i_codec; - case VIDEO_ES: - /* XXX DIV1 <- msmpeg4v1, DIV2 <- msmpeg4v2, DIV3 <- msmpeg4v3, mp4v for mpeg4 */ - switch( i_codec ) - { - case FOURCC_1: - return VLC_FOURCC('m','r','l','e'); - case FOURCC_DIV1: - case FOURCC_div1: - case FOURCC_MPG4: - case FOURCC_mpg4: - return FOURCC_DIV1; - case FOURCC_DIV2: - case FOURCC_div2: - case FOURCC_MP42: - case FOURCC_mp42: - case FOURCC_MPG3: - case FOURCC_mpg3: - return FOURCC_DIV2; - case FOURCC_div3: - case FOURCC_MP43: - case FOURCC_mp43: - case FOURCC_DIV3: - case FOURCC_DIV4: - case FOURCC_div4: - case FOURCC_DIV5: - case FOURCC_div5: - case FOURCC_DIV6: - case FOURCC_div6: - case FOURCC_AP41: - case FOURCC_3IV1: - case FOURCC_3iv1: - case FOURCC_3IVD: - case FOURCC_3ivd: - case FOURCC_3VID: - case FOURCC_3vid: - return FOURCC_DIV3; - case FOURCC_DIVX: - case FOURCC_divx: - case FOURCC_MP4S: - case FOURCC_mp4s: - case FOURCC_M4S2: - case FOURCC_m4s2: - case FOURCC_xvid: - case FOURCC_XVID: - case FOURCC_XviD: - case FOURCC_DX50: - case FOURCC_dx50: - case FOURCC_mp4v: - case FOURCC_4: - case FOURCC_3IV2: - case FOURCC_3iv2: - return FOURCC_mp4v; - } + return vlc_fourcc_GetCodec( i_cat, i_codec ); default: return VLC_FOURCC( 'u', 'n', 'd', 'f' ); } @@ -2375,7 +2328,7 @@ static void AVI_IndexCreate( demux_t *p_demux ) off_t i_movi_end; mtime_t i_dialog_update; - int i_dialog_id; + dialog_progress_bar_t *p_dialog = NULL; p_riff = AVI_ChunkFind( &p_sys->ck_root, AVIFOURCC_RIFF, 0); p_movi = AVI_ChunkFind( p_riff, AVIFOURCC_movi, 0); @@ -2400,10 +2353,10 @@ static void AVI_IndexCreate( demux_t *p_demux ) /* Only show dialog if AVI is > 10MB */ - i_dialog_id = -1; i_dialog_update = mdate(); if( stream_Size( p_demux->s ) > 10000000 ) - i_dialog_id = intf_IntfProgress( p_demux, _("Fixing AVI Index..."), 0.0 ); + p_dialog = dialog_ProgressCreate( p_demux, _("Fixing AVI Index..."), + NULL, _("Cancel") ); for( ;; ) { @@ -2413,15 +2366,14 @@ static void AVI_IndexCreate( demux_t *p_demux ) break; /* Don't update/check dialog too often */ - if( i_dialog_id > 0 && mdate() - i_dialog_update > 100000 ) + if( p_dialog && mdate() - i_dialog_update > 100000 ) { - if( intf_ProgressIsCancelled( p_demux, i_dialog_id ) ) + if( dialog_ProgressCancelled( p_dialog ) ) break; - double f_pos = 100.0 * stream_Tell( p_demux->s ) / - stream_Size( p_demux->s ); - intf_ProgressUpdate( p_demux, i_dialog_id, - _( "Fixing AVI Index..." ), f_pos, -1 ); + float f_pos = (float)stream_Tell( p_demux->s ) / + (float)stream_Size( p_demux->s ); + dialog_ProgressSet( p_dialog, NULL, f_pos ); i_dialog_update = mdate(); } @@ -2484,8 +2436,8 @@ static void AVI_IndexCreate( demux_t *p_demux ) } print_stat: - if( i_dialog_id > 0 ) - intf_UserHide( p_demux, i_dialog_id ); + if( p_dialog != NULL ) + dialog_ProgressDestroy( p_dialog ); for( i_stream = 0; i_stream < p_sys->i_track; i_stream++ ) {