mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-23 23:36:57 +00:00
avformat/mpegtsenc: fix flushing of audio packets
7d097a0fc5
had the same purpose as3700f655c5
but the former is much simpler, so let's remove the latter. Unfortunately both checks were wrong, because in order to make sure DTS > PCR we have to give us some headroom, so instead of using a dts_difference < max_delay check let's use a dts_difference < max_delay/2 check. Fixes DTS < PCR errors with this command line: ./ffmpeg -loglevel verbose -y -f lavfi -i \ "testsrc=s=64x64:d=20,split=2[out0][tmp1];[tmp1]vflip[out1];sine=d=20,asetnsamples=1000[out2]" \ -flags +bitexact -fflags +bitexact -sws_flags +accurate_rnd+bitexact \ -codec:v libx264 -codec:a mp2 -b:a 32k -pix_fmt yuv420p \ -map '0✌️0' \ -map '0✌️1' \ -map '0🅰️0' \ -muxrate 800000 \ -program st=0:st=2 -program st=1:st=2 -program st=2 -program st=0 -f mpegts out1.ts Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
parent
73e0035812
commit
f4eb7d84a7
@ -1531,6 +1531,7 @@ static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
|
||||
MpegTSWrite *ts = s->priv_data;
|
||||
MpegTSWriteStream *ts_st = st->priv_data;
|
||||
const int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE) * 2;
|
||||
const int64_t max_audio_delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE) / 2;
|
||||
int64_t dts = pkt->dts, pts = pkt->pts;
|
||||
int opus_samples = 0;
|
||||
int side_data_size;
|
||||
@ -1729,25 +1730,9 @@ static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
|
||||
}
|
||||
}
|
||||
|
||||
if (pkt->dts != AV_NOPTS_VALUE) {
|
||||
int i;
|
||||
for(i=0; i<s->nb_streams; i++) {
|
||||
AVStream *st2 = s->streams[i];
|
||||
MpegTSWriteStream *ts_st2 = st2->priv_data;
|
||||
if ( ts_st2->payload_size
|
||||
&& (ts_st2->payload_dts == AV_NOPTS_VALUE || dts - ts_st2->payload_dts > delay/2)) {
|
||||
mpegts_write_pes(s, st2, ts_st2->payload, ts_st2->payload_size,
|
||||
ts_st2->payload_pts, ts_st2->payload_dts,
|
||||
ts_st2->payload_flags & AV_PKT_FLAG_KEY, stream_id);
|
||||
ts_st2->payload_size = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ts_st->payload_size && (ts_st->payload_size + size > ts->pes_payload_size ||
|
||||
(dts != AV_NOPTS_VALUE && ts_st->payload_dts != AV_NOPTS_VALUE &&
|
||||
av_compare_ts(dts - ts_st->payload_dts, st->time_base,
|
||||
s->max_delay, AV_TIME_BASE_Q) >= 0) ||
|
||||
dts - ts_st->payload_dts >= max_audio_delay) ||
|
||||
ts_st->opus_queued_samples + opus_samples >= 5760 /* 120ms */)) {
|
||||
mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
|
||||
ts_st->payload_pts, ts_st->payload_dts,
|
||||
|
Loading…
Reference in New Issue
Block a user