diff --git a/rendering/exportthread.cpp b/rendering/exportthread.cpp index 9ccf3c79f..fcbb77067 100644 --- a/rendering/exportthread.cpp +++ b/rendering/exportthread.cpp @@ -71,7 +71,7 @@ ExportThread::ExportThread(const ExportParams ¶ms, surface.create(); } -bool ExportThread::Encode(AVFormatContext* ofmt_ctx, AVCodecContext* codec_ctx, AVFrame* frame, AVPacket* packet, AVStream* stream, bool rescale) { +bool ExportThread::Encode(AVFormatContext* ofmt_ctx, AVCodecContext* codec_ctx, AVFrame* frame, AVPacket* packet, AVStream* stream) { ret = avcodec_send_frame(codec_ctx, frame); if (ret < 0) { qCritical() << "Failed to send frame to encoder." << ret; @@ -92,18 +92,9 @@ bool ExportThread::Encode(AVFormatContext* ofmt_ctx, AVCodecContext* codec_ctx, } packet->stream_index = stream->index; - if (rescale) { - if (packet->pts != AV_NOPTS_VALUE) { - packet->pts = qRound(packet->pts * av_q2d(codec_ctx->time_base) / av_q2d(stream->time_base)); - } - if (packet->dts != AV_NOPTS_VALUE) { - packet->dts = qRound(packet->dts * av_q2d(codec_ctx->time_base) / av_q2d(stream->time_base)); - } - if (packet->duration > 0) { - packet->duration = qRound(packet->duration * av_q2d(codec_ctx->time_base) / av_q2d(stream->time_base)); - } - //av_packet_rescale_ts(packet, codec_ctx->time_base, stream->time_base); - } + + av_packet_rescale_ts(packet, codec_ctx->time_base, stream->time_base); + av_interleaved_write_frame(ofmt_ctx, packet); av_packet_unref(packet); } @@ -483,7 +474,7 @@ void ExportThread::Export() sws_frame->pts = qRound(timecode_secs/av_q2d(vcodec_ctx->time_base)); // Send frame to encoder - if (!Encode(fmt_ctx, vcodec_ctx, sws_frame, &video_pkt, video_stream, true)) { + if (!Encode(fmt_ctx, vcodec_ctx, sws_frame, &video_pkt, video_stream)) { return; } @@ -521,7 +512,7 @@ void ExportThread::Export() swr_frame->pts = file_audio_samples; // Send frame to encoder - if (!Encode(fmt_ctx, acodec_ctx, swr_frame, &audio_pkt, audio_stream, true)) { + if (!Encode(fmt_ctx, acodec_ctx, swr_frame, &audio_pkt, audio_stream)) { return; } @@ -570,7 +561,7 @@ void ExportThread::Export() swr_convert_frame(swr_ctx, swr_frame, nullptr); if (swr_frame->nb_samples == 0) break; swr_frame->pts = file_audio_samples; - if (!Encode(fmt_ctx, acodec_ctx, swr_frame, &audio_pkt, audio_stream, true)) { + if (!Encode(fmt_ctx, acodec_ctx, swr_frame, &audio_pkt, audio_stream)) { return; } file_audio_samples += swr_frame->nb_samples; @@ -583,17 +574,12 @@ void ExportThread::Export() return; } - bool continueVideo = params_.video_enabled; - bool continueAudio = params_.audio_enabled; - // Flush remaining packets out of video and audio encoders - while (continueVideo && continueAudio) { - if (continueVideo) { - continueVideo = Encode(fmt_ctx, vcodec_ctx, nullptr, &video_pkt, video_stream, true); - } - if (continueAudio) { - continueAudio = Encode(fmt_ctx, acodec_ctx, nullptr, &audio_pkt, audio_stream, true); - } + if (params_.video_enabled) { + Encode(fmt_ctx, vcodec_ctx, nullptr, &video_pkt, video_stream); + } + if (params_.audio_enabled) { + Encode(fmt_ctx, acodec_ctx, nullptr, &audio_pkt, audio_stream); } // Write container trailer diff --git a/rendering/exportthread.h b/rendering/exportthread.h index e4bc03080..3db7288ed 100644 --- a/rendering/exportthread.h +++ b/rendering/exportthread.h @@ -83,7 +83,7 @@ signals: public slots: void Interrupt(); private: - bool Encode(AVFormatContext* ofmt_ctx, AVCodecContext* codec_ctx, AVFrame* frame, AVPacket* packet, AVStream* stream, bool rescale); + bool Encode(AVFormatContext* ofmt_ctx, AVCodecContext* codec_ctx, AVFrame* frame, AVPacket* packet, AVStream* stream); bool SetupVideo(); bool SetupAudio(); bool SetupContainer();