Changeset 44cb59eadc7ddcfd23ec9621e9d374c093261ff2

Show
Ignore:
Timestamp:
14/04/07 01:50:47 (2 years ago)
Author:
Gildas Bazin <gbazin@videolan.org>
git-committer:
Gildas Bazin <gbazin@videolan.org> 1176508247 +0000
git-parent:

[7149e064c3172d1e0c5b45bfb36807003f1f00f7]

git-author:
Gildas Bazin <gbazin@videolan.org> 1176508247 +0000
Message:

* modules/demux/asf/* use index for seeking if available and if there's a video track.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • modules/demux/asf/asf.c

    r97773f1 r44cb59e  
    9292    int64_t             i_data_end; 
    9393 
     94    vlc_bool_t          b_index; 
    9495    vlc_meta_t          *meta; 
    9596}; 
     
    146147        int i_result; 
    147148 
    148         if( p_demux->b_die ) 
    149         { 
    150             break; 
    151         } 
     149        if( p_demux->b_die ) break; 
    152150 
    153151        /* Check if we have concatenated files */ 
     
    187185        { 
    188186            i_length = GetMoviePTS( p_sys ) - i_time_begin; 
    189             if( i_length < 0 || i_length >= 40 * 1000 ) 
    190             { 
    191                 break; 
    192             } 
     187            if( i_length < 0 || i_length >= 40 * 1000 ) break; 
    193188        } 
    194189    } 
     
    217212 
    218213/***************************************************************************** 
     214 * SeekIndex: goto to i_date or i_percent 
     215 *****************************************************************************/ 
     216static int SeekIndex( demux_t *p_demux, mtime_t i_date, float f_pos ) 
     217{ 
     218    demux_sys_t *p_sys = p_demux->p_sys; 
     219    asf_object_index_t *p_index; 
     220    int64_t i_pos; 
     221 
     222    msg_Dbg( p_demux, "seek with index: %i seconds, position %f", 
     223             (int)(i_date/1000000), f_pos ); 
     224 
     225    p_index = ASF_FindObject( p_sys->p_root, &asf_object_index_guid, 0 ); 
     226 
     227    if( i_date < 0 ) i_date = p_sys->i_length * f_pos; 
     228 
     229    i_pos = i_date * 10 / p_index->i_index_entry_time_interval; 
     230    i_pos = p_index->index_entry[i_pos].i_packet_number * 
     231        p_sys->p_fp->i_min_data_packet_size; 
     232 
     233    return stream_Seek( p_demux->s, p_sys->i_data_begin + i_pos ); 
     234} 
     235 
     236/***************************************************************************** 
    219237 * Control: 
    220238 *****************************************************************************/ 
     
    222240{ 
    223241    demux_sys_t *p_sys = p_demux->p_sys; 
    224     int64_t     *pi64; 
     242    vlc_meta_t  *p_meta; 
     243    int64_t     i64, *pi64; 
     244    double      f, *pf; 
    225245    int         i; 
    226     vlc_meta_t *p_meta; 
    227246 
    228247    switch( i_query ) 
    229248    { 
    230         case DEMUX_SET_TIME: 
    231             return VLC_EGENERIC; 
    232  
    233         case DEMUX_GET_LENGTH: 
    234             pi64 = (int64_t*)va_arg( args, int64_t * ); 
    235             *pi64 = p_sys->i_length; 
     249    case DEMUX_GET_LENGTH: 
     250        pi64 = (int64_t*)va_arg( args, int64_t * ); 
     251        *pi64 = p_sys->i_length; 
     252        return VLC_SUCCESS; 
     253 
     254    case DEMUX_GET_TIME: 
     255        pi64 = (int64_t*)va_arg( args, int64_t * ); 
     256        if( p_sys->i_time < 0 ) return VLC_EGENERIC; 
     257        *pi64 = p_sys->i_time; 
     258        return VLC_SUCCESS; 
     259 
     260    case DEMUX_SET_TIME: 
     261        p_sys->i_time = -1; 
     262        for( i = 0; i < 128 ; i++ ) 
     263            if( p_sys->track[i] ) p_sys->track[i]->i_time = -1; 
     264 
     265        if( p_sys->b_index && p_sys->i_length > 0 ) 
     266        { 
     267            i64 = (int64_t)va_arg( args, int64_t ); 
     268            return SeekIndex( p_demux, i64, -1 ); 
     269        } 
     270        else 
     271        { 
     272            return demux2_vaControlHelper( p_demux->s, p_sys->i_data_begin, 
     273                                           p_sys->i_data_end, p_sys->i_bitrate, 
     274                                           p_sys->p_fp->i_min_data_packet_size, 
     275                                           i_query, args ); 
     276        } 
     277 
     278    case DEMUX_GET_POSITION: 
     279        if( p_sys->i_time < 0 ) return VLC_EGENERIC; 
     280        if( p_sys->i_length > 0 ) 
     281        { 
     282            pf = (double*)va_arg( args, double * ); 
     283            *pf = p_sys->i_time / (double)p_sys->i_length; 
    236284            return VLC_SUCCESS; 
    237  
    238         case DEMUX_GET_META: 
    239             p_meta = (vlc_meta_t*)va_arg( args, vlc_meta_t* ); 
    240             vlc_meta_Merge( p_meta, p_sys->meta ); 
    241             return VLC_SUCCESS; 
    242  
    243         case DEMUX_SET_POSITION: 
    244             p_sys->i_time = -1; 
    245             for( i = 0; i < 128 ; i++ ) 
    246             { 
    247                 asf_track_t *tk = p_sys->track[i]; 
    248                 if( tk ) tk->i_time = -1; 
    249             } 
    250  
    251         default: 
    252             return demux2_vaControlHelper( p_demux->s, 
    253                                            p_sys->i_data_begin, p_sys->i_data_end, 
    254                                            p_sys->i_bitrate, p_sys->p_fp->i_min_data_packet_size, 
     285        } 
     286        return demux2_vaControlHelper( p_demux->s, p_sys->i_data_begin, 
     287                                       p_sys->i_data_end, p_sys->i_bitrate, 
     288                                       p_sys->p_fp->i_min_data_packet_size, 
     289                                       i_query, args ); 
     290 
     291    case DEMUX_SET_POSITION: 
     292        p_sys->i_time = -1; 
     293        for( i = 0; i < 128 ; i++ ) 
     294            if( p_sys->track[i] ) p_sys->track[i]->i_time = -1; 
     295 
     296        if( p_sys->b_index && p_sys->i_length > 0 ) 
     297        { 
     298            f = (double)va_arg( args, double ); 
     299            return SeekIndex( p_demux, -1, f ); 
     300        } 
     301        else 
     302        { 
     303            return demux2_vaControlHelper( p_demux->s, p_sys->i_data_begin, 
     304                                           p_sys->i_data_end, p_sys->i_bitrate, 
     305                                           p_sys->p_fp->i_min_data_packet_size, 
    255306                                           i_query, args ); 
     307        } 
     308 
     309    case DEMUX_GET_META: 
     310        p_meta = (vlc_meta_t*)va_arg( args, vlc_meta_t* ); 
     311        vlc_meta_Merge( p_meta, p_sys->meta ); 
     312        return VLC_SUCCESS; 
     313 
     314    default: 
     315        return demux2_vaControlHelper( p_demux->s, p_sys->i_data_begin, 
     316                                       p_sys->i_data_end, p_sys->i_bitrate, 
     317                                       p_sys->p_fp->i_min_data_packet_size, 
     318                                       i_query, args ); 
    256319    } 
    257320} 
     
    262325static mtime_t GetMoviePTS( demux_sys_t *p_sys ) 
    263326{ 
    264     mtime_t i_time
     327    mtime_t i_time = -1
    265328    int     i; 
    266329 
    267     i_time = -1; 
    268330    for( i = 0; i < 128 ; i++ ) 
    269331    { 
     
    272334        if( tk && tk->p_es && tk->i_time > 0) 
    273335        { 
    274             if( i_time < 0 ) 
    275             { 
    276                 i_time = tk->i_time; 
    277             } 
    278             else 
    279             { 
    280                 i_time = __MIN( i_time, tk->i_time ); 
    281             } 
     336            if( i_time < 0 ) i_time = tk->i_time; 
     337            else i_time = __MIN( i_time, tk->i_time ); 
    282338        } 
    283339    } 
     
    391447        asf_track_t   *tk; 
    392448 
     449        int i_packet_keyframe; 
    393450        int i_stream_number; 
    394451        int i_media_object_number; 
     
    409466        } 
    410467 
    411         i_stream_number = p_peek[i_skip] & 0x7f
    412         i_skip++
     468        i_packet_keyframe = p_peek[i_skip] >> 7
     469        i_stream_number = p_peek[i_skip++] & 0x7f
    413470 
    414471        GETVALUE2b( i_packet_property >> 4, i_media_object_number, 0 ); 
     
    585642{ 
    586643    demux_sys_t *p_sys = p_demux->p_sys; 
    587     vlc_bool_t  b_seekable; 
    588     int         i; 
    589  
    590     unsigned int    i_stream; 
     644    vlc_bool_t b_seekable; 
     645    unsigned int i_stream, i; 
    591646    asf_object_content_description_t *p_cd; 
     647    asf_object_index_t *p_index; 
     648    vlc_bool_t b_index; 
    592649 
    593650    /* init context */ 
     
    597654    p_sys->p_root   = NULL; 
    598655    p_sys->p_fp     = NULL; 
     656    p_sys->b_index  = 0; 
    599657    p_sys->i_track  = 0; 
    600658    for( i = 0; i < 128; i++ ) 
     
    608666    /* Now load all object ( except raw data ) */ 
    609667    stream_Control( p_demux->s, STREAM_CAN_FASTSEEK, &b_seekable ); 
    610     if( (p_sys->p_root = ASF_ReadObjectRoot( p_demux->s, b_seekable )) == NULL
     668    if( !(p_sys->p_root = ASF_ReadObjectRoot(p_demux->s, b_seekable))
    611669    { 
    612670        msg_Warn( p_demux, "ASF plugin discarded (not a valid file)" ); 
     
    628686        goto error; 
    629687    } 
     688 
     689    /* check if index is available */ 
     690    p_index = ASF_FindObject( p_sys->p_root, &asf_object_index_guid, 0 ); 
     691    b_index = p_index && p_index->i_index_entry_count; 
    630692 
    631693    msg_Dbg( p_demux, "found %d streams", p_sys->i_track ); 
     
    765827            es_format_Clean( &fmt ); 
    766828 
     829            /* If there is a video track then use the index for seeking */ 
     830            p_sys->b_index = b_index; 
     831 
    767832            msg_Dbg( p_demux, "added new video stream(ID:%d)", 
    768833                     p_sp->i_stream_number ); 
     
    834899    } 
    835900 
    836  
    837901    /* go to first packet */ 
    838902    stream_Seek( p_demux->s, p_sys->i_data_begin );