Add limited -endpos support when dumping.
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>
Wed, 3 Apr 2013 11:52:42 +0000 (11:52 +0000)
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>
Wed, 3 Apr 2013 11:52:42 +0000 (11:52 +0000)
In theory this should even make -endpos with a time work with -dumpstream of
DVDs but I could not test it - testers very welcome!

git-svn-id: svn://git.mplayerhq.hu/mplayer/trunk@36136 b3059339-0415-0410-9bf9-f77b7e298cf2

Changelog
DOCS/man/en/mplayer.1
mplayer.c

index 18bfd11..d972392 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -14,6 +14,7 @@ MPlayer
     * Fixes for DVB, teletext and closed-caption based subtitles.
     * Support teletext and CC subtitles in WTV.
     * Support binding keys corresponding to non-ASCII characters.
+    * Limited -endpos support for -dump*
 
     Ports:
     * Windows: support file names as UTF-8 in slave mode and passing
index a4af486..d424589 100644 (file)
@@ -1674,6 +1674,7 @@ Stop at given time or byte position.
 Byte position may not be accurate, as it can only stop at a frame boundary.
 When used in conjunction with \-ss option, \-endpos time will shift forward by
 seconds specified with \-ss if not a byte position.
+In addition it may not work well or not at all when used with any of the \-dump options.
 .sp 1
 .I EXAMPLE:
 .PD 0
index 581519a..dba0919 100644 (file)
--- a/mplayer.c
+++ b/mplayer.c
@@ -1750,7 +1750,7 @@ double playing_audio_pts(sh_audio_t *sh_audio, demux_stream_t *d_audio,
 static int is_at_end(MPContext *mpctx, m_time_size_t *end_at, double pts)
 {
     switch (end_at->type) {
-    case END_AT_TIME: return end_at->pos <= pts;
+    case END_AT_TIME: return pts != MP_NOPTS_VALUE && end_at->pos <= pts;
     case END_AT_SIZE: return end_at->pos <= stream_tell(mpctx->stream);
     }
     return 0;
@@ -3269,6 +3269,11 @@ play_next_file:
         }
         stream_dump_progress_start();
         while (!mpctx->stream->eof && !async_quit_request) {
+            double pts;
+            if (stream_control(mpctx->stream, STREAM_CTRL_GET_CURRENT_TIME, &pts) != STREAM_OK)
+                pts = MP_NOPTS_VALUE;
+            if (is_at_end(mpctx, &end_at, pts))
+                break;
             len = stream_read(mpctx->stream, buf, 4096);
             if (len > 0) {
                 if (fwrite(buf, len, 1, f) != 1) {
@@ -3473,7 +3478,10 @@ goto_enable_cache:
         stream_dump_progress_start();
         while (!ds->eof) {
             unsigned char *start;
-            int in_size = ds_get_packet(ds, &start);
+            double pts;
+            int in_size = ds_get_packet_pts(ds, &start, &pts);
+            if (is_at_end(mpctx, &end_at, pts))
+                break;
             if ((mpctx->demuxer->file_format == DEMUXER_TYPE_AVI || mpctx->demuxer->file_format == DEMUXER_TYPE_ASF || mpctx->demuxer->file_format == DEMUXER_TYPE_MOV)
                 && stream_dump_type == 2)
                 fwrite(&in_size, 1, 4, f);