mirror of https://git.ffmpeg.org/ffmpeg.git
fftools/ffmpeg_mux: stop using filter_in_rescale_delta_last for streamcopy
That field was added to store timestamp conversion state for audio decoding code. Later it started being used by streamcopy as well, but that use is wrong because, for a given input stream, both decoding and an arbitrary number of streamcopies may be performed simultaneously. They would then all overwrite the same state variable. Store this state in MuxStream instead. This is the last use of InputStream in of_streamcopy(), so the ist parameter can now be removed.
This commit is contained in:
parent
150c992490
commit
3f11582ca3
|
@ -1768,7 +1768,7 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
of_streamcopy(ist, ost, pkt, ist->dts);
|
of_streamcopy(ost, pkt, ist->dts);
|
||||||
}
|
}
|
||||||
|
|
||||||
return !eof_reached;
|
return !eof_reached;
|
||||||
|
|
|
@ -876,8 +876,7 @@ void of_output_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int eof)
|
||||||
/**
|
/**
|
||||||
* @param dts predicted packet dts in AV_TIME_BASE_Q
|
* @param dts predicted packet dts in AV_TIME_BASE_Q
|
||||||
*/
|
*/
|
||||||
void of_streamcopy(InputStream *ist, OutputStream *ost,
|
void of_streamcopy(OutputStream *ost, const AVPacket *pkt, int64_t dts);
|
||||||
const AVPacket *pkt, int64_t dts);
|
|
||||||
|
|
||||||
int64_t of_filesize(OutputFile *of);
|
int64_t of_filesize(OutputFile *of);
|
||||||
|
|
||||||
|
|
|
@ -378,10 +378,10 @@ fail:
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void of_streamcopy(InputStream *ist, OutputStream *ost,
|
void of_streamcopy(OutputStream *ost, const AVPacket *pkt, int64_t dts)
|
||||||
const AVPacket *pkt, int64_t dts)
|
|
||||||
{
|
{
|
||||||
OutputFile *of = output_files[ost->file_index];
|
OutputFile *of = output_files[ost->file_index];
|
||||||
|
MuxStream *ms = ms_from_ost(ost);
|
||||||
int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time;
|
int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time;
|
||||||
int64_t ost_tb_start_time = av_rescale_q(start_time, AV_TIME_BASE_Q, ost->mux_timebase);
|
int64_t ost_tb_start_time = av_rescale_q(start_time, AV_TIME_BASE_Q, ost->mux_timebase);
|
||||||
AVPacket *opkt = ost->pkt;
|
AVPacket *opkt = ost->pkt;
|
||||||
|
@ -430,7 +430,7 @@ void of_streamcopy(InputStream *ist, OutputStream *ost,
|
||||||
duration = ost->par_in->frame_size;
|
duration = ost->par_in->frame_size;
|
||||||
opkt->dts = av_rescale_delta(pkt->time_base, pkt->dts,
|
opkt->dts = av_rescale_delta(pkt->time_base, pkt->dts,
|
||||||
(AVRational){1, ost->par_in->sample_rate}, duration,
|
(AVRational){1, ost->par_in->sample_rate}, duration,
|
||||||
&ist->filter_in_rescale_delta_last, opkt->time_base);
|
&ms->ts_rescale_delta_last, opkt->time_base);
|
||||||
/* dts will be set immediately afterwards to what pts is now */
|
/* dts will be set immediately afterwards to what pts is now */
|
||||||
opkt->pts = opkt->dts - ost_tb_start_time;
|
opkt->pts = opkt->dts - ost_tb_start_time;
|
||||||
} else
|
} else
|
||||||
|
|
|
@ -64,6 +64,9 @@ typedef struct MuxStream {
|
||||||
* used for making up missing dts values */
|
* used for making up missing dts values */
|
||||||
int64_t last_mux_dts;
|
int64_t last_mux_dts;
|
||||||
|
|
||||||
|
// audio streamcopy - state for av_rescale_delta()
|
||||||
|
int64_t ts_rescale_delta_last;
|
||||||
|
|
||||||
// combined size of all the packets sent to the muxer
|
// combined size of all the packets sent to the muxer
|
||||||
uint64_t data_size_mux;
|
uint64_t data_size_mux;
|
||||||
} MuxStream;
|
} MuxStream;
|
||||||
|
|
Loading…
Reference in New Issue