Yet more debugging. Also, move pts adjustment to before audio encoding
This commit is contained in:
parent
5f5d5f691a
commit
b26ed9bf62
|
@ -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" \
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue