Mercurial > mplayer.hg
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, ¤t); | 1487 STREAM_CTRL_GET_CURRENT_CHAPTER, ¤t); |
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) |