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