From db6c7596022d5bf249a7b803d03a09b2e3f07c8c Mon Sep 17 00:00:00 2001 From: silas <s.developer@4-dc.de> Date: Sat, 5 Jun 2021 17:23:08 +0200 Subject: [PATCH] Fixed another error --- .idea/misc.xml | 5 +++++ AVQt/filter/DecoderVAAPI.cpp | 16 +--------------- AVQt/filter/EncoderVAAPI.cpp | 9 ++++++--- Player/main.cpp | 25 +++++++++++++------------ 4 files changed, 25 insertions(+), 30 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index cc6c769..3068199 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" /> + <component name="CidrRootsConfiguration"> + <excludeRoots> + <file path="$PROJECT_DIR$/build-qt59" /> + </excludeRoots> + </component> <component name="ProjectPlainTextFileTypeManager"> <file url="file://$PROJECT_DIR$/AVQt/mainpage.dox" /> </component> diff --git a/AVQt/filter/DecoderVAAPI.cpp b/AVQt/filter/DecoderVAAPI.cpp index b1c6dca..ec51fe3 100644 --- a/AVQt/filter/DecoderVAAPI.cpp +++ b/AVQt/filter/DecoderVAAPI.cpp @@ -284,20 +284,6 @@ namespace AVQt { for (const auto &cb: d->m_cbList) { // cbFutures.append(QtConcurrent::run([=] { AVFrame *cbFrame = av_frame_clone(frame); - cbFrame->pts = av_rescale_q(frame->pts, d->m_timebase, - av_make_q(1, 1000000)); // Rescale pts to microseconds for easier processing - qDebug("Calling video frame callback for PTS: %ld, Timebase: %d/%d", cbFrame->pts, d->m_timebase.num, - AVFrame *cbFrame = av_frame_clone(frame); - cbFrame->pts = av_rescale_q(frame->pts, d->m_timebase, - av_make_q(1, 1000000)); // Rescale pts to microseconds for easier processing - qDebug("Calling video frame callback for PTS: %ld, Timebase: %d/%d", cbFrame->pts, d->m_timebase.num, - d->m_timebase.den); - QTime time = QTime::currentTime(); - cb->onFrame(this, cbFrame, static_cast<int64_t>(av_q2d(av_inv_q(d->m_framerate)) * 1000.0)); - qDebug() << "Video CB time:" << time.msecsTo(QTime::currentTime()); - av_frame_unref(cbFrame); - av_frame_free(&cbFrame); - AVFrame *cbFrame = av_frame_clone(frame); cbFrame->pts = av_rescale_q(frame->pts, d->m_timebase, av_make_q(1, 1000000)); // Rescale pts to microseconds for easier processing qDebug("Calling video frame callback for PTS: %lld, Timebase: %d/%d", cbFrame->pts, d->m_timebase.num, @@ -332,4 +318,4 @@ namespace AVQt { } } } -} +} \ No newline at end of file diff --git a/AVQt/filter/EncoderVAAPI.cpp b/AVQt/filter/EncoderVAAPI.cpp index 657a61b..20df183 100644 --- a/AVQt/filter/EncoderVAAPI.cpp +++ b/AVQt/filter/EncoderVAAPI.cpp @@ -318,7 +318,7 @@ namespace AVQt { cb->start(this); } } - while (!d->m_inputQueue.isEmpty()) { + if (!d->m_inputQueue.isEmpty()) { QPair<AVFrame *, int64_t> frame; { QMutexLocker lock(&d->m_inputQueueMutex); @@ -339,12 +339,14 @@ namespace AVQt { AVPacket *packet = av_packet_alloc(); while (true) { ret = avcodec_receive_packet(d->m_pCodecCtx, packet); + qDebug("[AVQt::EncoderVAAPI] Got packet from encoder with PTS: %lld, timebase: %d/%d", packet->pts, + d->m_pCodecCtx->time_base.num, d->m_pCodecCtx->time_base.den); if (ret == AVERROR_EOF || ret == AVERROR(EAGAIN)) { break; - } else if (ret < 0) { + } else if (ret != 0) { qFatal("%i: Could not receive packet from encoder: %s", ret, av_make_error_string(strBuf, strBufSize, ret)); } - { + if (packet->buf) { QMutexLocker lock(&d->m_cbListMutex); for (const auto &cb: d->m_cbList) { AVPacket *cbPacket = av_packet_clone(packet); @@ -352,6 +354,7 @@ namespace AVQt { av_packet_free(&cbPacket); } } + av_packet_unref(packet); } } else { msleep(1); diff --git a/Player/main.cpp b/Player/main.cpp index 6e102c7..d83c36f 100644 --- a/Player/main.cpp +++ b/Player/main.cpp @@ -4,6 +4,7 @@ #include <QFileDialog> #include <csignal> #include <iostream> +#include <qglobal.h> constexpr auto LOGFILE_LOCATION = "libAVQt.log"; @@ -59,11 +60,11 @@ int main(int argc, char *argv[]) { inputFile->open(QIODevice::ReadOnly); AVQt::Demuxer demuxer(inputFile); - AVQt::AudioDecoder decoder; - AVQt::OpenALAudioOutput output; +// AVQt::AudioDecoder decoder; +// AVQt::OpenALAudioOutput output; - demuxer.registerCallback(&decoder, AVQt::IPacketSource::CB_AUDIO); - decoder.registerCallback(&output); +// demuxer.registerCallback(&decoder, AVQt::IPacketSource::CB_AUDIO); +// decoder.registerCallback(&output); AVQt::IDecoder *videoDecoder; #ifdef Q_OS_LINUX @@ -73,21 +74,21 @@ int main(int argc, char *argv[]) { #else #error "Unsupported OS" #endif - AVQt::OpenGLRenderer renderer; +// AVQt::OpenGLRenderer renderer; -// AVQt::IEncoder *encoder = new AVQt::EncoderVAAPI("hevc_vaapi"); + AVQt::IEncoder *encoder = new AVQt::EncoderVAAPI("hevc_vaapi"); demuxer.registerCallback(videoDecoder, AVQt::IPacketSource::CB_VIDEO); -// videoDecoder->registerCallback(encoder); + videoDecoder->registerCallback(encoder); QFile outputFile("output.ts"); outputFile.open(QIODevice::ReadWrite | QIODevice::Truncate); AVQt::Muxer muxer(&outputFile); -// encoder->registerCallback(&muxer, AVQt::IPacketSource::CB_VIDEO); - videoDecoder->registerCallback(&renderer); + encoder->registerCallback(&muxer, AVQt::IPacketSource::CB_VIDEO); +// videoDecoder->registerCallback(&renderer); - renderer.setMinimumSize(QSize(360, 240)); +// renderer.setMinimumSize(QSize(360, 240)); // QObject::connect(&renderer, &AVQt::OpenGLRenderer::paused, [&](bool paused) { // output.pause(nullptr, paused); @@ -98,7 +99,7 @@ int main(int argc, char *argv[]) { demuxer.init(); - output.syncToOutput(&renderer); +// output.syncToOutput(&renderer); demuxer.start(); @@ -109,4 +110,4 @@ int main(int argc, char *argv[]) { }); return QApplication::exec(); -} +} \ No newline at end of file -- GitLab