Changeset 44cb59eadc7ddcfd23ec9621e9d374c093261ff2
- Timestamp:
- 14/04/07 01:50:47 (2 years ago)
- git-parent:
- Files:
-
- modules/demux/asf/asf.c (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
modules/demux/asf/asf.c
r97773f1 r44cb59e 92 92 int64_t i_data_end; 93 93 94 vlc_bool_t b_index; 94 95 vlc_meta_t *meta; 95 96 }; … … 146 147 int i_result; 147 148 148 if( p_demux->b_die ) 149 { 150 break; 151 } 149 if( p_demux->b_die ) break; 152 150 153 151 /* Check if we have concatenated files */ … … 187 185 { 188 186 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; 193 188 } 194 189 } … … 217 212 218 213 /***************************************************************************** 214 * SeekIndex: goto to i_date or i_percent 215 *****************************************************************************/ 216 static 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 /***************************************************************************** 219 237 * Control: 220 238 *****************************************************************************/ … … 222 240 { 223 241 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; 225 245 int i; 226 vlc_meta_t *p_meta;227 246 228 247 switch( i_query ) 229 248 { 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; 236 284 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, 255 306 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 ); 256 319 } 257 320 } … … 262 325 static mtime_t GetMoviePTS( demux_sys_t *p_sys ) 263 326 { 264 mtime_t i_time ;327 mtime_t i_time = -1; 265 328 int i; 266 329 267 i_time = -1;268 330 for( i = 0; i < 128 ; i++ ) 269 331 { … … 272 334 if( tk && tk->p_es && tk->i_time > 0) 273 335 { 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 ); 282 338 } 283 339 } … … 391 447 asf_track_t *tk; 392 448 449 int i_packet_keyframe; 393 450 int i_stream_number; 394 451 int i_media_object_number; … … 409 466 } 410 467 411 i_ stream_number = p_peek[i_skip] & 0x7f;412 i_s kip++;468 i_packet_keyframe = p_peek[i_skip] >> 7; 469 i_stream_number = p_peek[i_skip++] & 0x7f; 413 470 414 471 GETVALUE2b( i_packet_property >> 4, i_media_object_number, 0 ); … … 585 642 { 586 643 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; 591 646 asf_object_content_description_t *p_cd; 647 asf_object_index_t *p_index; 648 vlc_bool_t b_index; 592 649 593 650 /* init context */ … … 597 654 p_sys->p_root = NULL; 598 655 p_sys->p_fp = NULL; 656 p_sys->b_index = 0; 599 657 p_sys->i_track = 0; 600 658 for( i = 0; i < 128; i++ ) … … 608 666 /* Now load all object ( except raw data ) */ 609 667 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)) ) 611 669 { 612 670 msg_Warn( p_demux, "ASF plugin discarded (not a valid file)" ); … … 628 686 goto error; 629 687 } 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; 630 692 631 693 msg_Dbg( p_demux, "found %d streams", p_sys->i_track ); … … 765 827 es_format_Clean( &fmt ); 766 828 829 /* If there is a video track then use the index for seeking */ 830 p_sys->b_index = b_index; 831 767 832 msg_Dbg( p_demux, "added new video stream(ID:%d)", 768 833 p_sp->i_stream_number ); … … 834 899 } 835 900 836 837 901 /* go to first packet */ 838 902 stream_Seek( p_demux->s, p_sys->i_data_begin );
