Index: edl.h =================================================================== --- edl.h (revision 32040) +++ edl.h (working copy) @@ -40,6 +40,7 @@ extern char *edl_filename; // file to extract EDL entries from (-edl) extern char *edl_output_filename; // file to put EDL entries in (-edlout) +extern int edl_start_pts; // Start pts to be added/subtracted to EDL pos void free_edl(edl_record_ptr next_edl_record); // free's entire EDL list. edl_record_ptr edl_parse_file(void); // fills EDL stack Index: DOCS/man/en/mplayer.1 =================================================================== --- DOCS/man/en/mplayer.1 (revision 32040) +++ DOCS/man/en/mplayer.1 (working copy) @@ -890,6 +890,22 @@ (default: 2 seconds). . .TP +.B \-edl-start-pts +Adjust positions in EDL records according to file's start time. +Some formats, especially MPEG TS usually start with non-zero PTS +values and when producing EDL file with \-edlout option, EDL records +contain absolute values that are correct only to this particular file. +If re-encoded into different format, this EDL file no longer applies. +Specifying \-edl-start-pts will automatically adjust EDL positions according +to start time: when producing EDL file, it will substract start time from every +EDL record, when playing with EDL file, it will add file's start time to every +EDL position. +. +.TP +.B \-noedl-start-pts +Disable adjusting EDL positions. +. +.TP .B \-enqueue (GUI only) Enqueue files given on the command line in the playlist instead of playing them immediately. Index: mplayer.c =================================================================== --- mplayer.c (revision 32040) +++ mplayer.c (working copy) @@ -142,7 +142,7 @@ int quiet=0; int enable_mouse_movements=0; float start_volume = -1; - +double start_pts = MP_NOPTS_VALUE; char *heartbeat_cmd; #define ROUND(x) ((int)((x)<0 ? (x)-0.5 : (x)+0.5)) @@ -339,6 +339,7 @@ // (next seek, pause,...), otherwise after the seek it will // enter the same scene again and skip forward immediately float edl_backward_delay = 2; +int edl_start_pts = 0; ///< Automatically add/sub this from EDL start/stop pos int use_filedir_conf; int use_filename_title; @@ -555,7 +556,6 @@ static void print_file_properties(const MPContext *mpctx, const char *filename) { - double start_pts = MP_NOPTS_VALUE; double video_start_pts = MP_NOPTS_VALUE; mp_msg(MSGT_IDENTIFY,MSGL_INFO,"ID_FILENAME=%s\n", filename_recode(filename)); @@ -3639,6 +3639,16 @@ } print_file_properties(mpctx, filename); + + // Adjust EDL positions with start_pts + if (edl_start_pts && start_pts) { + edl_record_ptr edl = edl_records; + while (edl) { + edl->start_sec += start_pts; + edl->stop_sec += start_pts; + edl = edl->next; + } + } if(!mpctx->sh_video) goto main; // audio-only Index: cfg-mplayer.h =================================================================== --- cfg-mplayer.h (revision 32040) +++ cfg-mplayer.h (working copy) @@ -103,6 +103,8 @@ CONF_TYPE_PRINT, 0, 0, 0, NULL}, {"edlout", &edl_output_filename, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"edl-backward-delay", &edl_backward_delay, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, + {"edl-start-pts", &edl_start_pts, CONF_TYPE_FLAG, 0, 0, 1, NULL}, + {"noedl-start-pts", &edl_start_pts, CONF_TYPE_FLAG, 0, 1, 0, NULL}, #ifdef CONFIG_X11 {"display", &mDisplayName, CONF_TYPE_STRING, 0, 0, 0, NULL}, Index: command.c =================================================================== --- command.c (revision 32040) +++ command.c (working copy) @@ -66,6 +66,7 @@ #include "mp_core.h" #include "mp_fifo.h" #include "libavutil/avstring.h" +#include "edl.h" #define ROUND(x) ((int)((x)<0 ? (x)-0.5 : (x)+0.5)) @@ -2614,7 +2615,8 @@ if (mpctx->begin_skip > v) mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdloutBadStop); else { - fprintf(edl_fd, "%f %f %d\n", mpctx->begin_skip, v, 0); + double pts = edl_start_pts ? start_pts : 0; + fprintf(edl_fd, "%f %f %d\n", mpctx->begin_skip - pts, v - pts, 0); mp_msg(MSGT_CPLAYER, MSGL_INFO, MSGTR_EdloutEndSkip); } mpctx->begin_skip = MP_NOPTS_VALUE;