mirror of
https://github.com/librempeg/librempeg
synced 2024-11-23 03:28:27 +00:00
user specified start time offset
frame dup/drop info typos patch by (Wolfram Gloger <wmglo at dent dot med dot uni-muenchen dot de>) Originally committed as revision 3217 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
dbc56b3914
commit
a6a92a9aa6
29
ffmpeg.c
29
ffmpeg.c
@ -58,6 +58,7 @@ static void show_license(void);
|
||||
#define MAX_FILES 20
|
||||
|
||||
static AVFormatContext *input_files[MAX_FILES];
|
||||
static int64_t input_files_ts_offset[MAX_FILES];
|
||||
static int nb_input_files = 0;
|
||||
|
||||
static AVFormatContext *output_files[MAX_FILES];
|
||||
@ -184,6 +185,7 @@ static int audio_codec_id = CODEC_ID_NONE;
|
||||
static int64_t recording_time = 0;
|
||||
static int64_t start_time = 0;
|
||||
static int64_t rec_timestamp = 0;
|
||||
static int64_t input_ts_offset = 0;
|
||||
static int file_overwrite = 0;
|
||||
static char *str_title = NULL;
|
||||
static char *str_author = NULL;
|
||||
@ -220,6 +222,8 @@ static int me_range = 0;
|
||||
static int64_t video_size = 0;
|
||||
static int64_t audio_size = 0;
|
||||
static int64_t extra_size = 0;
|
||||
static int nb_frames_dup = 0;
|
||||
static int nb_frames_drop = 0;
|
||||
|
||||
#define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
|
||||
|
||||
@ -614,6 +618,12 @@ static void do_video_out(AVFormatContext *s,
|
||||
nb_frames = 2;
|
||||
//printf("vdelta:%f, ost->sync_opts:%lld, ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, ost->sync_ipts, nb_frames);
|
||||
}
|
||||
if (nb_frames == 0)
|
||||
++nb_frames_drop;
|
||||
else if (nb_frames == 2) {
|
||||
++nb_frames_dup;
|
||||
//printf("*** dup!\n");
|
||||
}
|
||||
ost->sync_opts+= nb_frames;
|
||||
|
||||
if (nb_frames <= 0)
|
||||
@ -964,6 +974,10 @@ static void print_report(AVFormatContext **output_files,
|
||||
sprintf(buf + strlen(buf),
|
||||
"size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
|
||||
(double)total_size / 1024, ti1, bitrate);
|
||||
|
||||
if (verbose > 1)
|
||||
sprintf(buf + strlen(buf), " dup=%d drop=%d",
|
||||
nb_frames_dup, nb_frames_drop);
|
||||
|
||||
if (verbose >= 0)
|
||||
fprintf(stderr, "%s \r", buf);
|
||||
@ -1116,7 +1130,7 @@ static int output_packet(AVInputStream *ist, int ist_index,
|
||||
((double)ost->st->pts.val * ost->time_base.num / ost->time_base.den));
|
||||
#endif
|
||||
/* set the input output pts pairs */
|
||||
ost->sync_ipts = (double)ist->pts / AV_TIME_BASE;
|
||||
ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index])/ AV_TIME_BASE;
|
||||
|
||||
if (ost->encoding_needed) {
|
||||
switch(ost->st->codec.codec_type) {
|
||||
@ -1167,8 +1181,8 @@ static int output_packet(AVInputStream *ist, int ist_index,
|
||||
opkt.stream_index= ost->index;
|
||||
opkt.data= data_buf;
|
||||
opkt.size= data_size;
|
||||
opkt.pts= pkt->pts; //FIXME ist->pts?
|
||||
opkt.dts= pkt->dts;
|
||||
opkt.pts= pkt->pts + input_files_ts_offset[ist->file_index];
|
||||
opkt.dts= pkt->dts + input_files_ts_offset[ist->file_index];
|
||||
opkt.flags= pkt->flags;
|
||||
|
||||
av_interleaved_write_frame(os, &opkt);
|
||||
@ -2522,6 +2536,11 @@ static void opt_rec_timestamp(const char *arg)
|
||||
rec_timestamp = parse_date(arg, 0) / 1000000;
|
||||
}
|
||||
|
||||
static void opt_input_ts_offset(const char *arg)
|
||||
{
|
||||
input_ts_offset = parse_date(arg, 1);
|
||||
}
|
||||
|
||||
static void opt_input_file(const char *filename)
|
||||
{
|
||||
AVFormatContext *ic;
|
||||
@ -2632,6 +2651,9 @@ static void opt_input_file(const char *filename)
|
||||
}
|
||||
|
||||
input_files[nb_input_files] = ic;
|
||||
input_files_ts_offset[nb_input_files] = input_ts_offset;
|
||||
if (ic->start_time != AV_NOPTS_VALUE && 0)
|
||||
input_files_ts_offset[nb_input_files] -= ic->start_time;
|
||||
/* dump the file content */
|
||||
if (verbose >= 0)
|
||||
dump_format(ic, nb_input_files, filename, 0);
|
||||
@ -3501,6 +3523,7 @@ const OptionDef options[] = {
|
||||
{ "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream" },
|
||||
{ "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
|
||||
{ "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
|
||||
{ "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
|
||||
{ "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
|
||||
{ "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
|
||||
{ "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
|
||||
|
@ -1009,7 +1009,7 @@ int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts
|
||||
pos_min= e->pos;
|
||||
ts_min= e->timestamp;
|
||||
#ifdef DEBUG_SEEK
|
||||
av_log(s, AV_LOG_DEBUG, "unsing cached pos_min=0x%llx dts_min=%lld\n",
|
||||
av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%llx dts_min=%lld\n",
|
||||
pos_min,ts_min);
|
||||
#endif
|
||||
}else{
|
||||
@ -1023,7 +1023,7 @@ int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts
|
||||
ts_max= e->timestamp;
|
||||
pos_limit= pos_max - e->min_distance;
|
||||
#ifdef DEBUG_SEEK
|
||||
av_log(s, AV_LOG_DEBUG, "unsing cached pos_max=0x%llx pos_limit=0x%llx dts_max=%lld\n",
|
||||
av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%llx pos_limit=0x%llx dts_max=%lld\n",
|
||||
pos_max,pos_limit, ts_max);
|
||||
#endif
|
||||
}
|
||||
@ -2229,6 +2229,7 @@ int64_t parse_date(const char *datestr, int duration)
|
||||
const char *q;
|
||||
int is_utc, len;
|
||||
char lastch;
|
||||
int negative = 0;
|
||||
|
||||
#undef time
|
||||
time_t now = time(0);
|
||||
@ -2273,6 +2274,10 @@ int64_t parse_date(const char *datestr, int duration)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (p[0] == '-') {
|
||||
negative = 1;
|
||||
++p;
|
||||
}
|
||||
q = small_strptime(p, time_fmt[0], &dt);
|
||||
if (!q) {
|
||||
dt.tm_sec = strtol(p, (char **)&q, 10);
|
||||
@ -2312,7 +2317,7 @@ int64_t parse_date(const char *datestr, int duration)
|
||||
}
|
||||
t += val;
|
||||
}
|
||||
return t;
|
||||
return negative ? -t : t;
|
||||
}
|
||||
|
||||
/* syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. Return
|
||||
|
Loading…
Reference in New Issue
Block a user