You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
fftools/ffmpeg: stop using OutputStream.frame_number for streamcopy
This field is currently used by checks - skipping packets before the first keyframe - skipping packets before start time to test whether any packets have been output already. But since frame_number is incremented after the bitstream filters are applied (which may involve delay), this use is incorrect. The keyframe check works around this by adding an extra flag, the start-time check does not. Simplify both checks by replacing the seen_kf flag with a flag tracking whether any packets have been output by do_streamcopy().
This commit is contained in:
@@ -894,8 +894,6 @@ static void output_packet(OutputFile *of, AVPacket *pkt,
|
|||||||
|
|
||||||
/* apply the output bitstream filters */
|
/* apply the output bitstream filters */
|
||||||
if (ost->bsf_ctx) {
|
if (ost->bsf_ctx) {
|
||||||
if (pkt->flags & AV_PKT_FLAG_KEY)
|
|
||||||
ost->seen_kf = 1;
|
|
||||||
ret = av_bsf_send_packet(ost->bsf_ctx, eof ? NULL : pkt);
|
ret = av_bsf_send_packet(ost->bsf_ctx, eof ? NULL : pkt);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto finish;
|
goto finish;
|
||||||
@@ -2043,11 +2041,11 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
|
if (!ost->streamcopy_started && !(pkt->flags & AV_PKT_FLAG_KEY) &&
|
||||||
!ost->copy_initial_nonkeyframes && !ost->seen_kf)
|
!ost->copy_initial_nonkeyframes)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!ost->frame_number && !ost->copy_prior_start) {
|
if (!ost->streamcopy_started && !ost->copy_prior_start) {
|
||||||
int64_t comp_start = start_time;
|
int64_t comp_start = start_time;
|
||||||
if (copy_ts && f->start_time != AV_NOPTS_VALUE)
|
if (copy_ts && f->start_time != AV_NOPTS_VALUE)
|
||||||
comp_start = FFMAX(start_time, f->start_time + f->ts_offset);
|
comp_start = FFMAX(start_time, f->start_time + f->ts_offset);
|
||||||
@@ -2101,6 +2099,8 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
|
|||||||
ost->sync_opts += opkt->duration;
|
ost->sync_opts += opkt->duration;
|
||||||
|
|
||||||
output_packet(of, opkt, ost, 0);
|
output_packet(of, opkt, ost, 0);
|
||||||
|
|
||||||
|
ost->streamcopy_started = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int guess_input_channel_layout(InputStream *ist)
|
int guess_input_channel_layout(InputStream *ist)
|
||||||
|
@@ -536,7 +536,7 @@ typedef struct OutputStream {
|
|||||||
int inputs_done;
|
int inputs_done;
|
||||||
|
|
||||||
const char *attachment_filename;
|
const char *attachment_filename;
|
||||||
int seen_kf;
|
int streamcopy_started;
|
||||||
int copy_initial_nonkeyframes;
|
int copy_initial_nonkeyframes;
|
||||||
int copy_prior_start;
|
int copy_prior_start;
|
||||||
char *disposition;
|
char *disposition;
|
||||||
|
Reference in New Issue
Block a user