Correct pts on audio frame before sending it to the encoder so that when we flush the encoder the resulting packets have the right pts.
This commit is contained in:
parent
7d07cdf530
commit
ed5a448a1d
|
@ -435,11 +435,13 @@ VideoStore::~VideoStore() {
|
||||||
pkt.data = NULL;
|
pkt.data = NULL;
|
||||||
pkt.size = 0;
|
pkt.size = 0;
|
||||||
av_init_packet(&pkt);
|
av_init_packet(&pkt);
|
||||||
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
|
// Put encoder into flushing mode
|
||||||
|
avcodec_send_frame(audio_out_ctx, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
// Put encoder into flushing mode
|
|
||||||
avcodec_send_frame(audio_out_ctx, NULL);
|
|
||||||
ret = avcodec_receive_packet(audio_out_ctx, &pkt);
|
ret = avcodec_receive_packet(audio_out_ctx, &pkt);
|
||||||
if ( ret < 0 ) {
|
if ( ret < 0 ) {
|
||||||
if ( AVERROR_EOF != ret ) {
|
if ( AVERROR_EOF != ret ) {
|
||||||
|
@ -450,8 +452,7 @@ VideoStore::~VideoStore() {
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
int got_packet = 0;
|
int got_packet = 0;
|
||||||
ret =
|
ret = avcodec_encode_audio2(audio_out_ctx, &pkt, NULL, &got_packet);
|
||||||
avcodec_encode_audio2(audio_out_ctx, &pkt, NULL, &got_packet);
|
|
||||||
if ( ret < 0 ) {
|
if ( ret < 0 ) {
|
||||||
Error("Error encoding audio while flushing (%d) (%s)", ret,
|
Error("Error encoding audio while flushing (%d) (%s)", ret,
|
||||||
av_err2str(ret));
|
av_err2str(ret));
|
||||||
|
@ -1056,8 +1057,27 @@ int VideoStore::writeAudioFramePacket(AVPacket *ipkt) {
|
||||||
#endif
|
#endif
|
||||||
zm_dump_frame(out_frame, "Out frame after resample");
|
zm_dump_frame(out_frame, "Out frame after resample");
|
||||||
|
|
||||||
av_init_packet(&opkt);
|
// out_frame pts is in the input pkt pts... needs to be adjusted before sending to the encoder
|
||||||
|
if ( ipkt->pts != AV_NOPTS_VALUE ) {
|
||||||
|
if ( !audio_first_pts ) {
|
||||||
|
out_frame->pts = 0;
|
||||||
|
audio_first_pts = ipkt->pts;
|
||||||
|
Debug(1, "No audio_first_pts");
|
||||||
|
} else {
|
||||||
|
out_frame->pts = av_rescale_q(
|
||||||
|
out_frame->pts - audio_first_pts,
|
||||||
|
audio_in_stream->time_base,
|
||||||
|
audio_out_stream->time_base);
|
||||||
|
Debug(2, "audio out_frame.pts = %d from ipkt->pts(%d) - first_pts(%d)",
|
||||||
|
out_frame->pts, ipkt->pts, audio_first_pts);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Debug(2, "out_frame.pts = undef");
|
||||||
|
out_frame->pts = AV_NOPTS_VALUE;
|
||||||
|
}
|
||||||
|
zm_dump_frame(out_frame, "Out frame after resample and pts adjustment");
|
||||||
|
|
||||||
|
av_init_packet(&opkt);
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
if ( (ret = avcodec_send_frame(audio_out_ctx, out_frame)) < 0 ) {
|
if ( (ret = avcodec_send_frame(audio_out_ctx, out_frame)) < 0 ) {
|
||||||
Error("Could not send frame (error '%s')",
|
Error("Could not send frame (error '%s')",
|
||||||
|
@ -1098,7 +1118,6 @@ int VideoStore::writeAudioFramePacket(AVPacket *ipkt) {
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
av_init_packet(&opkt);
|
av_init_packet(&opkt);
|
||||||
Debug(5, "after init packet");
|
|
||||||
opkt.data = ipkt->data;
|
opkt.data = ipkt->data;
|
||||||
opkt.size = ipkt->size;
|
opkt.size = ipkt->size;
|
||||||
}
|
}
|
||||||
|
@ -1123,7 +1142,6 @@ int VideoStore::writeAudioFramePacket(AVPacket *ipkt) {
|
||||||
// out
|
// out
|
||||||
|
|
||||||
// Scale the PTS of the outgoing packet to be the correct time base
|
// Scale the PTS of the outgoing packet to be the correct time base
|
||||||
#if 1
|
|
||||||
if ( ipkt->pts != AV_NOPTS_VALUE ) {
|
if ( ipkt->pts != AV_NOPTS_VALUE ) {
|
||||||
if ( !audio_first_pts ) {
|
if ( !audio_first_pts ) {
|
||||||
opkt.pts = 0;
|
opkt.pts = 0;
|
||||||
|
@ -1142,12 +1160,7 @@ int VideoStore::writeAudioFramePacket(AVPacket *ipkt) {
|
||||||
Debug(2, "opkt.pts = undef");
|
Debug(2, "opkt.pts = undef");
|
||||||
opkt.pts = AV_NOPTS_VALUE;
|
opkt.pts = AV_NOPTS_VALUE;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
opkt.pts = audio_next_pts;
|
|
||||||
opkt.dts = audio_next_dts;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
if ( ipkt->dts != AV_NOPTS_VALUE ) {
|
if ( ipkt->dts != AV_NOPTS_VALUE ) {
|
||||||
// So if the in has no dts assigned... still need an out dts... so we use cur_dts?
|
// So if the in has no dts assigned... still need an out dts... so we use cur_dts?
|
||||||
|
|
||||||
|
@ -1174,8 +1187,6 @@ int VideoStore::writeAudioFramePacket(AVPacket *ipkt) {
|
||||||
} else {
|
} else {
|
||||||
opkt.dts = AV_NOPTS_VALUE;
|
opkt.dts = AV_NOPTS_VALUE;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
// audio_last_dts = ipkt->dts;
|
|
||||||
if ( opkt.dts > opkt.pts ) {
|
if ( opkt.dts > opkt.pts ) {
|
||||||
Debug(1,
|
Debug(1,
|
||||||
"opkt.dts(%" PRId64 ") must be <= opkt.pts(%" PRId64 ")."
|
"opkt.dts(%" PRId64 ") must be <= opkt.pts(%" PRId64 ")."
|
||||||
|
@ -1185,9 +1196,6 @@ int VideoStore::writeAudioFramePacket(AVPacket *ipkt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
dumpPacket(audio_out_stream, &opkt, "finished opkt");
|
dumpPacket(audio_out_stream, &opkt, "finished opkt");
|
||||||
// pkt.pos: byte position in stream, -1 if unknown
|
|
||||||
//audio_next_dts = opkt.dts + opkt.duration;
|
|
||||||
//audio_next_pts = opkt.pts + opkt.duration;
|
|
||||||
|
|
||||||
ret = av_interleaved_write_frame(oc, &opkt);
|
ret = av_interleaved_write_frame(oc, &opkt);
|
||||||
if ( ret != 0 ) {
|
if ( ret != 0 ) {
|
||||||
|
|
Loading…
Reference in New Issue