Yet more debugging. Also, move pts adjustment to before audio encoding

This commit is contained in:
Isaac Connor 2019-08-26 16:17:45 -04:00
parent 5f5d5f691a
commit b26ed9bf62
2 changed files with 31 additions and 20 deletions

View File

@ -302,7 +302,7 @@ void zm_dump_codecpar(const AVCodecParameters *par);
#if LIBAVCODEC_VERSION_CHECK(56, 8, 0, 60, 100) #if LIBAVCODEC_VERSION_CHECK(56, 8, 0, 60, 100)
#define zm_dump_frame(frame, text) Debug(1, "%s: format %d %s sample_rate %" PRIu32 " nb_samples %d channels %d" \ #define zm_dump_frame(frame, text) Debug(1, "%s: format %d %s sample_rate %" PRIu32 " nb_samples %d channels %d" \
" duration %" PRId64 \ " duration %" PRId64 \
" layout %d pts %" PRId64,\ " layout %d pts %" PRId64 " pkt_pts %" PRId64 " pkt_dts %" PRId64, \
text, \ text, \
frame->format, \ frame->format, \
av_get_sample_fmt_name((AVSampleFormat)frame->format), \ av_get_sample_fmt_name((AVSampleFormat)frame->format), \
@ -311,7 +311,9 @@ void zm_dump_codecpar(const AVCodecParameters *par);
frame->channels, \ frame->channels, \
frame->pkt_duration, \ frame->pkt_duration, \
frame->channel_layout, \ frame->channel_layout, \
frame->pts \ frame->pts, \
frame->pkt_pts, \
frame->pkt_dts \
); );
#else #else
#define zm_dump_frame(frame, text) Debug(1, "%s: format %d %s sample_rate %" PRIu32 " nb_samples %d channels %d" \ #define zm_dump_frame(frame, text) Debug(1, "%s: format %d %s sample_rate %" PRIu32 " nb_samples %d channels %d" \

View File

@ -193,19 +193,6 @@ VideoStore::VideoStore(
video_out_stream->r_frame_rate = video_in_stream->r_frame_rate; video_out_stream->r_frame_rate = video_in_stream->r_frame_rate;
} }
#if LIBAVCODEC_VERSION_CHECK(56, 35, 0, 64, 0) #if LIBAVCODEC_VERSION_CHECK(56, 35, 0, 64, 0)
#if 0
if ( video_out_ctx->codec_id == AV_CODEC_ID_H264 ) {
//video_out_ctx->level = 32;I//
video_out_ctx->bit_rate = 400*1024;
video_out_ctx->max_b_frames = 1;
if ( video_out_ctx->priv_data ) {
av_opt_set(video_out_ctx->priv_data, "crf", "1", AV_OPT_SEARCH_CHILDREN);
av_opt_set(video_out_ctx->priv_data, "preset", "ultrafast", 0);
} else {
Debug(2, "Not setting priv_data");
}
}
#endif
ret = avcodec_parameters_from_context(video_out_stream->codecpar, video_out_ctx); ret = avcodec_parameters_from_context(video_out_stream->codecpar, video_out_ctx);
if ( ret < 0 ) { if ( ret < 0 ) {
Error("Could not initialize video_out_ctx parameters"); Error("Could not initialize video_out_ctx parameters");
@ -790,9 +777,9 @@ bool VideoStore::setup_resampler() {
} }
#if defined(HAVE_LIBSWRESAMPLE) #if defined(HAVE_LIBSWRESAMPLE)
if (!(fifo = av_audio_fifo_alloc( if ( !(fifo = av_audio_fifo_alloc(
audio_out_ctx->sample_fmt, audio_out_ctx->sample_fmt,
audio_out_ctx->channels, 1))) { audio_out_ctx->channels, 1)) ) {
Error("Could not allocate FIFO"); Error("Could not allocate FIFO");
return false; return false;
} }
@ -1008,7 +995,6 @@ int VideoStore::writeVideoFramePacket(AVPacket *ipkt) {
opkt.dts = video_out_stream->cur_dts; opkt.dts = video_out_stream->cur_dts;
} }
# if 1
if ( opkt.dts < video_out_stream->cur_dts ) { if ( opkt.dts < video_out_stream->cur_dts ) {
Debug(1, "Fixing non-monotonic dts/pts dts %" PRId64 " pts %" PRId64 " stream %" PRId64, Debug(1, "Fixing non-monotonic dts/pts dts %" PRId64 " pts %" PRId64 " stream %" PRId64,
opkt.dts, opkt.pts, video_out_stream->cur_dts); opkt.dts, opkt.pts, video_out_stream->cur_dts);
@ -1017,7 +1003,6 @@ int VideoStore::writeVideoFramePacket(AVPacket *ipkt) {
opkt.pts = opkt.dts; opkt.pts = opkt.dts;
} }
} }
#endif
opkt.flags = ipkt->flags; opkt.flags = ipkt->flags;
opkt.pos = -1; opkt.pos = -1;
@ -1066,6 +1051,20 @@ int VideoStore::writeAudioFramePacket(AVPacket *ipkt) {
} }
zm_dump_frame(in_frame, "In frame from decode"); zm_dump_frame(in_frame, "In frame from decode");
if ( in_frame->pts != AV_NOPTS_VALUE ) {
if ( !audio_first_pts ) {
audio_first_pts = in_frame->pts;
Debug(1, "No audio_first_pts setting to %" PRId64, audio_first_pts);
in_frame->pts = 0;
} else {
// out_frame_pts is in codec->timebase, audio_first_pts is in packet timebase.
in_frame->pts = in_frame->pts - audio_first_pts;
zm_dump_frame(in_frame, "in frame after pts adjustment");
}
} else {
// sending AV_NOPTS_VALUE doesn't really work but we seem to get it in ffmpeg 2.8
in_frame->pts = audio_next_pts;
}
if ( !resample_audio() ) { if ( !resample_audio() ) {
//av_frame_unref(in_frame); //av_frame_unref(in_frame);
@ -1099,12 +1098,19 @@ int VideoStore::writeAudioFramePacket(AVPacket *ipkt) {
} }
dumpPacket(audio_out_stream, &opkt, "raw opkt"); dumpPacket(audio_out_stream, &opkt, "raw opkt");
Debug(1, "Duration before %d in %d/%d", opkt.duration,
audio_out_ctx->time_base.num,
audio_out_ctx->time_base.den);
opkt.duration = av_rescale_q( opkt.duration = av_rescale_q(
opkt.duration, opkt.duration,
audio_out_ctx->time_base, audio_out_ctx->time_base,
audio_out_stream->time_base); audio_out_stream->time_base);
Debug(1, "Duration after %d in %d/%d", opkt.duration,
audio_out_stream->time_base.num,
audio_out_stream->time_base.den);
// 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 0
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;
@ -1134,13 +1140,14 @@ int VideoStore::writeAudioFramePacket(AVPacket *ipkt) {
audio_out_ctx->time_base, audio_out_ctx->time_base,
audio_out_stream->time_base); audio_out_stream->time_base);
opkt.dts -= audio_first_dts; opkt.dts -= audio_first_dts;
Debug(2, "opkt.dts = %" PRId64 " from first_dts %" PRId64, Debug(2, "audio opkt.dts = %" PRId64 " from first_dts %" PRId64,
opkt.dts, audio_first_dts); opkt.dts, audio_first_dts);
} }
audio_last_dts = opkt.dts; audio_last_dts = opkt.dts;
} else { } else {
opkt.dts = AV_NOPTS_VALUE; opkt.dts = AV_NOPTS_VALUE;
} }
#endif
} else { } else {
Debug(2,"copying"); Debug(2,"copying");
@ -1261,6 +1268,8 @@ int VideoStore::resample_audio() {
// AAC requires 1024 samples per encode. Our input tends to be something else, so need to buffer them. // AAC requires 1024 samples per encode. Our input tends to be something else, so need to buffer them.
if ( frame_size > av_audio_fifo_size(fifo) ) { if ( frame_size > av_audio_fifo_size(fifo) ) {
Debug(1, "Not enough samples in fifo for AAC codec frame_size %d > fifo size %d",
frame_size, av_audio_fifo_size(fifo));
return 0; return 0;
} }