mirror of https://git.ffmpeg.org/ffmpeg.git
ffmpeg: honor -ss and -t parameters with muxed subtitles.
This patch fixes two things: - in case of subtitles, check_recording_time() is comparing the current PTS to the recording time (-t option, set to INT_MAX by default), so the -ss option needs to be taken into account. It is not required in do_{audio,video}_out() because this adjustment is set while polling the filtergraph (see poll_filters()). - It also adjusts the PTS sent to the encoder (and later transmitted to the muxer) so the TS in the output make sense and are not kept verbatim. Note: this only works for muxers honoring the PTS, such as lavf/matroskaenc. But for other such as the ASS muxer which just does a verbatim copy, or the SubRip muxer which doesn't write the TS in some cases, it will not work yet.
This commit is contained in:
parent
c99d3e2e6c
commit
53a3748ed2
7
ffmpeg.c
7
ffmpeg.c
|
@ -1683,12 +1683,15 @@ static void do_subtitle_out(AVFormatContext *s,
|
|||
else
|
||||
nb = 1;
|
||||
|
||||
/* shift timestamp to honor -ss and make check_recording_time() work with -t */
|
||||
pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q)
|
||||
- output_files[ost->file_index]->start_time;
|
||||
for (i = 0; i < nb; i++) {
|
||||
ost->sync_opts = av_rescale_q(pts, ist->st->time_base, enc->time_base);
|
||||
ost->sync_opts = av_rescale_q(pts, AV_TIME_BASE_Q, enc->time_base);
|
||||
if (!check_recording_time(ost))
|
||||
return;
|
||||
|
||||
sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
|
||||
sub->pts = pts;
|
||||
// start_display_time is required to be 0
|
||||
sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
|
||||
sub->end_display_time -= sub->start_display_time;
|
||||
|
|
Loading…
Reference in New Issue