| @@ -107,7 +107,6 @@ static const OptionDef options[]; | |||||
| #define FFM_PACKET_SIZE 4096 //XXX a duplicate of the line in ffm.h | #define FFM_PACKET_SIZE 4096 //XXX a duplicate of the line in ffm.h | ||||
| static const char *last_asked_format = NULL; | static const char *last_asked_format = NULL; | ||||
| static int64_t input_files_ts_offset[MAX_FILES]; | |||||
| static double *input_files_ts_scale[MAX_FILES] = {NULL}; | static double *input_files_ts_scale[MAX_FILES] = {NULL}; | ||||
| static int nb_input_files_ts_scale[MAX_FILES] = {0}; | static int nb_input_files_ts_scale[MAX_FILES] = {0}; | ||||
| @@ -329,6 +328,7 @@ typedef struct InputFile { | |||||
| int eof_reached; /* true if eof reached */ | int eof_reached; /* true if eof reached */ | ||||
| int ist_index; /* index of first stream in ist_table */ | int ist_index; /* index of first stream in ist_table */ | ||||
| int buffer_size; /* current total buffer size */ | int buffer_size; /* current total buffer size */ | ||||
| int64_t ts_offset; | |||||
| } InputFile; | } InputFile; | ||||
| static InputStream *input_streams = NULL; | static InputStream *input_streams = NULL; | ||||
| @@ -1671,7 +1671,7 @@ static int output_packet(InputStream *ist, int ist_index, | |||||
| os = output_files[ost->file_index]; | os = output_files[ost->file_index]; | ||||
| /* set the input output pts pairs */ | /* set the input output pts pairs */ | ||||
| //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE; | |||||
| //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE; | |||||
| if (ost->encoding_needed) { | if (ost->encoding_needed) { | ||||
| av_assert0(ist->decoding_needed); | av_assert0(ist->decoding_needed); | ||||
| @@ -1882,7 +1882,7 @@ static int copy_chapters(int infile, int outfile) | |||||
| for (i = 0; i < is->nb_chapters; i++) { | for (i = 0; i < is->nb_chapters; i++) { | ||||
| AVChapter *in_ch = is->chapters[i], *out_ch; | AVChapter *in_ch = is->chapters[i], *out_ch; | ||||
| int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile], | |||||
| int64_t ts_off = av_rescale_q(start_time - input_files[infile].ts_offset, | |||||
| AV_TIME_BASE_Q, in_ch->time_base); | AV_TIME_BASE_Q, in_ch->time_base); | ||||
| int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX : | int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX : | ||||
| av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base); | av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base); | ||||
| @@ -2613,9 +2613,9 @@ static int transcode(AVFormatContext **output_files, | |||||
| goto discard_packet; | goto discard_packet; | ||||
| if (pkt.dts != AV_NOPTS_VALUE) | if (pkt.dts != AV_NOPTS_VALUE) | ||||
| pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base); | |||||
| pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base); | |||||
| if (pkt.pts != AV_NOPTS_VALUE) | if (pkt.pts != AV_NOPTS_VALUE) | ||||
| pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base); | |||||
| pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base); | |||||
| if (pkt.stream_index < nb_input_files_ts_scale[file_index] | if (pkt.stream_index < nb_input_files_ts_scale[file_index] | ||||
| && input_files_ts_scale[file_index][pkt.stream_index]){ | && input_files_ts_scale[file_index][pkt.stream_index]){ | ||||
| @@ -2625,15 +2625,16 @@ static int transcode(AVFormatContext **output_files, | |||||
| pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index]; | pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index]; | ||||
| } | } | ||||
| // fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files_ts_offset[ist->file_index], ist->st->codec->codec_type); | |||||
| // fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files[ist->file_index].ts_offset, ist->st->codec->codec_type); | |||||
| if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE | if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE | ||||
| && (is->iformat->flags & AVFMT_TS_DISCONT)) { | && (is->iformat->flags & AVFMT_TS_DISCONT)) { | ||||
| int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q); | int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q); | ||||
| int64_t delta= pkt_dts - ist->next_pts; | int64_t delta= pkt_dts - ist->next_pts; | ||||
| if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){ | if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){ | ||||
| input_files_ts_offset[ist->file_index]-= delta; | |||||
| input_files[ist->file_index].ts_offset -= delta; | |||||
| if (verbose > 2) | if (verbose > 2) | ||||
| fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]); | |||||
| fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", | |||||
| delta, input_files[ist->file_index].ts_offset); | |||||
| pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); | pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); | ||||
| if(pkt.pts != AV_NOPTS_VALUE) | if(pkt.pts != AV_NOPTS_VALUE) | ||||
| pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); | pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); | ||||
| @@ -3357,7 +3358,6 @@ static int opt_input_file(const char *opt, const char *filename) | |||||
| } | } | ||||
| } | } | ||||
| input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp); | |||||
| /* dump the file content */ | /* dump the file content */ | ||||
| if (verbose >= 0) | if (verbose >= 0) | ||||
| av_dump_format(ic, nb_input_files, filename, 0); | av_dump_format(ic, nb_input_files, filename, 0); | ||||
| @@ -3365,6 +3365,7 @@ static int opt_input_file(const char *opt, const char *filename) | |||||
| input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1); | input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1); | ||||
| input_files[nb_input_files - 1].ctx = ic; | input_files[nb_input_files - 1].ctx = ic; | ||||
| input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams; | input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams; | ||||
| input_files[nb_input_files - 1].ts_offset = input_ts_offset - (copy_ts ? 0 : timestamp); | |||||
| frame_rate = (AVRational){0, 0}; | frame_rate = (AVRational){0, 0}; | ||||
| frame_pix_fmt = PIX_FMT_NONE; | frame_pix_fmt = PIX_FMT_NONE; | ||||