Mercurial > mplayer.hg
comparison libmpdemux/demuxer.c @ 26926:1e6241274552
added and reused demux_flush() instead of emptying the demux_stream buffers;
patch by Bryan Henderson - giraffedata gmail com
author | nicodvb |
---|---|
date | Mon, 02 Jun 2008 10:17:48 +0000 |
parents | d99d0f7c0e80 |
children | 66cda68db746 |
comparison
equal
deleted
inserted
replaced
26925:3f6d2ca29727 | 26926:1e6241274552 |
---|---|
941 correct_pts = demux_control(res, DEMUXER_CTRL_CORRECT_PTS, NULL) == DEMUXER_CTRL_OK; | 941 correct_pts = demux_control(res, DEMUXER_CTRL_CORRECT_PTS, NULL) == DEMUXER_CTRL_OK; |
942 return res; | 942 return res; |
943 } | 943 } |
944 | 944 |
945 | 945 |
946 void demux_flush(demuxer_t *demuxer) { | |
947 ds_free_packs(demuxer->video); | |
948 ds_free_packs(demuxer->audio); | |
949 ds_free_packs(demuxer->sub); | |
950 } | |
951 | |
946 int demux_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ | 952 int demux_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ |
947 demux_stream_t *d_audio=demuxer->audio; | 953 demux_stream_t *d_audio=demuxer->audio; |
948 demux_stream_t *d_video=demuxer->video; | 954 demux_stream_t *d_video=demuxer->video; |
949 sh_audio_t *sh_audio=d_audio->sh; | 955 sh_audio_t *sh_audio=d_audio->sh; |
950 sh_video_t *sh_video=d_video->sh; | 956 sh_video_t *sh_video=d_video->sh; |
961 else | 967 else |
962 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekFile); | 968 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekFile); |
963 return 0; | 969 return 0; |
964 } | 970 } |
965 | 971 |
972 demux_flush(demuxer); | |
966 // clear demux buffers: | 973 // clear demux buffers: |
967 if(sh_audio){ ds_free_packs(d_audio);sh_audio->a_buffer_len=0;} | 974 if(sh_audio) sh_audio->a_buffer_len=0; |
968 ds_free_packs(d_video); | |
969 ds_free_packs(demuxer->sub); | |
970 | |
971 demuxer->stream->eof=0; // clear eof flag | 975 demuxer->stream->eof=0; // clear eof flag |
972 demuxer->video->eof=0; | 976 demuxer->video->eof=0; |
973 demuxer->audio->eof=0; | 977 demuxer->audio->eof=0; |
974 | 978 |
975 #if 0 | 979 #if 0 |
1195 ris = stream_control(demuxer->stream, STREAM_CTRL_GET_CURRENT_CHAPTER, ¤t); | 1199 ris = stream_control(demuxer->stream, STREAM_CTRL_GET_CURRENT_CHAPTER, ¤t); |
1196 if(ris == STREAM_UNSUPPORTED) return -1; | 1200 if(ris == STREAM_UNSUPPORTED) return -1; |
1197 chapter += current; | 1201 chapter += current; |
1198 } | 1202 } |
1199 | 1203 |
1200 if(demuxer->video->sh) | 1204 demux_flush(demuxer); |
1201 ds_free_packs(demuxer->video); | |
1202 | |
1203 if(demuxer->audio->sh) | |
1204 ds_free_packs(demuxer->audio); | |
1205 | |
1206 if(demuxer->sub->id >= 0) | |
1207 ds_free_packs(demuxer->sub); | |
1208 | 1205 |
1209 ris = stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_CHAPTER, &chapter); | 1206 ris = stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_CHAPTER, &chapter); |
1210 if(ris != STREAM_UNSUPPORTED) | 1207 if(ris != STREAM_UNSUPPORTED) |
1211 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); | 1208 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); |
1212 if(sh_video) { | 1209 if(sh_video) { |
1367 sh_audio_t *sh_audio = demuxer->audio->sh; | 1364 sh_audio_t *sh_audio = demuxer->audio->sh; |
1368 | 1365 |
1369 angles = demuxer_angles_count(demuxer); | 1366 angles = demuxer_angles_count(demuxer); |
1370 if((angles < 1) || (angle > angles)) return -1; | 1367 if((angles < 1) || (angle > angles)) return -1; |
1371 | 1368 |
1372 if(demuxer->video->sh) | 1369 demux_flush(demuxer); |
1373 ds_free_packs(demuxer->video); | |
1374 | |
1375 if(demuxer->audio->sh) | |
1376 ds_free_packs(demuxer->audio); | |
1377 | |
1378 if(demuxer->sub->id >= 0) | |
1379 ds_free_packs(demuxer->sub); | |
1380 | 1370 |
1381 ris = stream_control(demuxer->stream, STREAM_CTRL_SET_ANGLE, &angle); | 1371 ris = stream_control(demuxer->stream, STREAM_CTRL_SET_ANGLE, &angle); |
1382 if(ris == STREAM_UNSUPPORTED) return -1; | 1372 if(ris == STREAM_UNSUPPORTED) return -1; |
1383 | 1373 |
1384 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); | 1374 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); |