comparison libmpdemux/demuxer.c @ 30378:8339bca8e4b4

Move the resync-related code into more consistent places instead of having it scattered all over the place with half of it forgotten in some places.
author reimar
date Sun, 24 Jan 2010 15:16:39 +0000
parents 4977e04f3a18
children 0140d505dd91
comparison
equal deleted inserted replaced
30377:2eea1f09e2c5 30378:8339bca8e4b4
1181 correct_pts = demux_control(res, DEMUXER_CTRL_CORRECT_PTS, NULL) 1181 correct_pts = demux_control(res, DEMUXER_CTRL_CORRECT_PTS, NULL)
1182 == DEMUXER_CTRL_OK; 1182 == DEMUXER_CTRL_OK;
1183 return res; 1183 return res;
1184 } 1184 }
1185 1185
1186 static void demux_resync(demuxer_t *demuxer)
1187 {
1188 sh_video_t *sh_video = demuxer->video->sh;
1189 sh_audio_t *sh_audio = demuxer->audio->sh;
1190 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL);
1191 if (sh_video) {
1192 ds_fill_buffer(demuxer->video);
1193 resync_video_stream(sh_video);
1194 }
1195 if (sh_audio) {
1196 ds_fill_buffer(demuxer->audio);
1197 resync_audio_stream(sh_audio);
1198 }
1199 }
1186 1200
1187 void demux_flush(demuxer_t *demuxer) 1201 void demux_flush(demuxer_t *demuxer)
1188 { 1202 {
1189 ds_free_packs(demuxer->video); 1203 ds_free_packs(demuxer->video);
1190 ds_free_packs(demuxer->audio); 1204 ds_free_packs(demuxer->audio);
1194 int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, 1208 int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay,
1195 int flags) 1209 int flags)
1196 { 1210 {
1197 demux_stream_t *d_audio = demuxer->audio; 1211 demux_stream_t *d_audio = demuxer->audio;
1198 demux_stream_t *d_video = demuxer->video; 1212 demux_stream_t *d_video = demuxer->video;
1199 sh_audio_t *sh_audio = d_audio->sh;
1200 sh_video_t *sh_video = d_video->sh;
1201 double tmp = 0; 1213 double tmp = 0;
1202 double pts; 1214 double pts;
1203 1215
1204 if (!demuxer->seekable) { 1216 if (!demuxer->seekable) {
1205 if (demuxer->file_format == DEMUXER_TYPE_AVI) 1217 if (demuxer->file_format == DEMUXER_TYPE_AVI)
1212 mp_msg(MSGT_SEEK, MSGL_WARN, MSGTR_CantSeekFile); 1224 mp_msg(MSGT_SEEK, MSGL_WARN, MSGTR_CantSeekFile);
1213 return 0; 1225 return 0;
1214 } 1226 }
1215 1227
1216 demux_flush(demuxer); 1228 demux_flush(demuxer);
1217 // clear demux buffers:
1218 if (sh_audio)
1219 sh_audio->a_buffer_len = 0;
1220 1229
1221 demuxer->stream->eof = 0; 1230 demuxer->stream->eof = 0;
1222 demuxer->video->eof = 0; 1231 demuxer->video->eof = 0;
1223 demuxer->audio->eof = 0; 1232 demuxer->audio->eof = 0;
1224
1225 if (sh_video)
1226 sh_video->timer = 0; // !!!!!!
1227 1233
1228 if (flags & SEEK_ABSOLUTE) 1234 if (flags & SEEK_ABSOLUTE)
1229 pts = 0.0f; 1235 pts = 0.0f;
1230 else { 1236 else {
1231 if (demuxer->stream_pts == MP_NOPTS_VALUE) 1237 if (demuxer->stream_pts == MP_NOPTS_VALUE)
1241 } else 1247 } else
1242 pts += rel_seek_secs; 1248 pts += rel_seek_secs;
1243 1249
1244 if (stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_TIME, &pts) != 1250 if (stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_TIME, &pts) !=
1245 STREAM_UNSUPPORTED) { 1251 STREAM_UNSUPPORTED) {
1246 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); 1252 demux_resync(demuxer);
1247 return 1; 1253 return 1;
1248 } 1254 }
1249 1255
1250 dmx_seek: 1256 dmx_seek:
1251 if (demuxer->desc->seek) 1257 if (demuxer->desc->seek)
1252 demuxer->desc->seek(demuxer, rel_seek_secs, audio_delay, flags); 1258 demuxer->desc->seek(demuxer, rel_seek_secs, audio_delay, flags);
1253 1259
1254 if (sh_audio) 1260 demux_resync(demuxer);
1255 resync_audio_stream(sh_audio);
1256 1261
1257 return 1; 1262 return 1;
1258 } 1263 }
1259 1264
1260 int demux_info_add(demuxer_t *demuxer, const char *opt, const char *param) 1265 int demux_info_add(demuxer_t *demuxer, const char *opt, const char *param)
1473 float *seek_pts, int *num_chapters, 1478 float *seek_pts, int *num_chapters,
1474 char **chapter_name) 1479 char **chapter_name)
1475 { 1480 {
1476 int ris; 1481 int ris;
1477 int current, total; 1482 int current, total;
1478 sh_video_t *sh_video = demuxer->video->sh;
1479 sh_audio_t *sh_audio = demuxer->audio->sh;
1480 1483
1481 if (!demuxer->num_chapters || !demuxer->chapters) { 1484 if (!demuxer->num_chapters || !demuxer->chapters) {
1482 if (!mode) { 1485 if (!mode) {
1483 ris = stream_control(demuxer->stream, 1486 ris = stream_control(demuxer->stream,
1484 STREAM_CTRL_GET_CURRENT_CHAPTER, &current); 1487 STREAM_CTRL_GET_CURRENT_CHAPTER, &current);
1489 1492
1490 demux_flush(demuxer); 1493 demux_flush(demuxer);
1491 1494
1492 ris = stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_CHAPTER, 1495 ris = stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_CHAPTER,
1493 &chapter); 1496 &chapter);
1494 if (ris != STREAM_UNSUPPORTED) 1497
1495 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); 1498 demux_resync(demuxer);
1496 if (sh_video) { 1499
1497 ds_fill_buffer(demuxer->video);
1498 resync_video_stream(sh_video);
1499 }
1500
1501 if (sh_audio) {
1502 ds_fill_buffer(demuxer->audio);
1503 resync_audio_stream(sh_audio);
1504 }
1505 // exit status may be ok, but main() doesn't have to seek itself 1500 // exit status may be ok, but main() doesn't have to seek itself
1506 // (because e.g. dvds depend on sectors, not on pts) 1501 // (because e.g. dvds depend on sectors, not on pts)
1507 *seek_pts = -1.0; 1502 *seek_pts = -1.0;
1508 1503
1509 if (num_chapters) { 1504 if (num_chapters) {
1523 } 1518 }
1524 } 1519 }
1525 1520
1526 return ris != STREAM_UNSUPPORTED ? chapter : -1; 1521 return ris != STREAM_UNSUPPORTED ? chapter : -1;
1527 } else { // chapters structure is set in the demuxer 1522 } else { // chapters structure is set in the demuxer
1523 sh_video_t *sh_video = demuxer->video->sh;
1524 sh_audio_t *sh_audio = demuxer->audio->sh;
1525
1528 total = demuxer->num_chapters; 1526 total = demuxer->num_chapters;
1529 1527
1530 if (mode == 1) //absolute seeking 1528 if (mode == 1) //absolute seeking
1531 current = chapter; 1529 current = chapter;
1532 else { //relative seeking 1530 else { //relative seeking
1657 1655
1658 1656
1659 int demuxer_set_angle(demuxer_t *demuxer, int angle) 1657 int demuxer_set_angle(demuxer_t *demuxer, int angle)
1660 { 1658 {
1661 int ris, angles = -1; 1659 int ris, angles = -1;
1662 sh_video_t *sh_video = demuxer->video->sh;
1663 sh_audio_t *sh_audio = demuxer->audio->sh;
1664 1660
1665 angles = demuxer_angles_count(demuxer); 1661 angles = demuxer_angles_count(demuxer);
1666 if ((angles < 1) || (angle > angles)) 1662 if ((angles < 1) || (angle > angles))
1667 return -1; 1663 return -1;
1668 1664
1670 1666
1671 ris = stream_control(demuxer->stream, STREAM_CTRL_SET_ANGLE, &angle); 1667 ris = stream_control(demuxer->stream, STREAM_CTRL_SET_ANGLE, &angle);
1672 if (ris == STREAM_UNSUPPORTED) 1668 if (ris == STREAM_UNSUPPORTED)
1673 return -1; 1669 return -1;
1674 1670
1675 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); 1671 demux_resync(demuxer);
1676 if (sh_video) {
1677 ds_fill_buffer(demuxer->video);
1678 resync_video_stream(sh_video);
1679 }
1680
1681 if (sh_audio) {
1682 ds_fill_buffer(demuxer->audio);
1683 resync_audio_stream(sh_audio);
1684 }
1685 1672
1686 return angle; 1673 return angle;
1687 } 1674 }
1688 1675
1689 int demuxer_audio_track_by_lang(demuxer_t *d, char *lang) 1676 int demuxer_audio_track_by_lang(demuxer_t *d, char *lang)