diff --git a/AVQt/filter/AudioDecoder.cpp b/AVQt/filter/AudioDecoder.cpp index c0f131eccee20c1ed7702593f4ba0677f64ff2ca..867c7d337c0aaf2f73b8fae4345fbd88ba322808 100644 --- a/AVQt/filter/AudioDecoder.cpp +++ b/AVQt/filter/AudioDecoder.cpp @@ -14,11 +14,9 @@ namespace AVQt { AudioDecoder::AudioDecoder(QObject *parent) : QThread(parent), d_ptr(new AudioDecoderPrivate(this)) { - Q_D(AVQt::AudioDecoder); } [[maybe_unused]] AudioDecoder::AudioDecoder(AVQt::AudioDecoderPrivate &p) : d_ptr(&p) { - Q_D(AVQt::AudioDecoder); } AudioDecoder::AudioDecoder(AudioDecoder &&other) noexcept: d_ptr(other.d_ptr) { @@ -185,21 +183,18 @@ namespace AVQt { } void AudioDecoder::deinit(IPacketSource *source) { - Q_D(AVQt::AudioDecoder); Q_UNUSED(source) deinit(); } void AudioDecoder::start(IPacketSource *source) { - Q_D(AVQt::AudioDecoder); Q_UNUSED(source) start(); } void AudioDecoder::stop(IPacketSource *source) { - Q_D(AVQt::AudioDecoder); Q_UNUSED(source) stop(); diff --git a/AVQt/filter/DecoderDXVA2.cpp b/AVQt/filter/DecoderDXVA2.cpp index cc609c7956d4daac1c9d3a65969cd64fbf59752e..41c5c294f37b2a6558dab609c3b126fea351c6d1 100644 --- a/AVQt/filter/DecoderDXVA2.cpp +++ b/AVQt/filter/DecoderDXVA2.cpp @@ -20,7 +20,6 @@ namespace AVQt { DecoderDXVA2::DecoderDXVA2(QObject *parent) : QThread(parent), d_ptr(new DecoderDXVA2Private(this)) { - Q_D(AVQt::DecoderDXVA2); } [[maybe_unused]] DecoderDXVA2::DecoderDXVA2(DecoderDXVA2Private &p) : d_ptr(&p) { @@ -60,8 +59,6 @@ namespace AVQt { } int DecoderDXVA2::init() { - Q_D(AVQt::DecoderDXVA2); - return 0; } diff --git a/AVQt/filter/DecoderMMAL.cpp b/AVQt/filter/DecoderMMAL.cpp index 7ed4a971f5a8d6cc649be1cdb436e1bb4737ec27..2ddf4d6df1a95f9e61e51386d57ae98897e5a936 100644 --- a/AVQt/filter/DecoderMMAL.cpp +++ b/AVQt/filter/DecoderMMAL.cpp @@ -20,7 +20,6 @@ namespace AVQt { DecoderMMAL::DecoderMMAL(QObject *parent) : QThread(parent), d_ptr(new DecoderMMALPrivate(this)) { - Q_D(AVQt::DecoderMMAL); } [[maybe_unused]] DecoderMMAL::DecoderMMAL(DecoderMMALPrivate &p) : d_ptr(&p) { @@ -60,8 +59,6 @@ namespace AVQt { } int DecoderMMAL::init() { - Q_D(AVQt::DecoderMMAL); - return 0; } diff --git a/AVQt/filter/DecoderMMAL.cpp.orig b/AVQt/filter/DecoderMMAL.cpp.orig deleted file mode 100644 index 7ed4a971f5a8d6cc649be1cdb436e1bb4737ec27..0000000000000000000000000000000000000000 --- a/AVQt/filter/DecoderMMAL.cpp.orig +++ /dev/null @@ -1,327 +0,0 @@ -// -// Created by silas on 3/1/21. -// - -#include "private/DecoderMMAL_p.h" -#include "DecoderMMAL.h" -#include "output/IFrameSink.h" -#include "output/IAudioSink.h" -#include "input/IPacketSource.h" - -#include <QApplication> -#include <QImage> -//#include <QtConcurrent> - -//#ifndef DOXYGEN_SHOULD_SKIP_THIS -//#define NOW() std::chrono::high_resolution_clock::now() -//#define TIME_US(t1, t2) std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count() -//#endif - - -namespace AVQt { - DecoderMMAL::DecoderMMAL(QObject *parent) : QThread(parent), d_ptr(new DecoderMMALPrivate(this)) { - Q_D(AVQt::DecoderMMAL); - } - - [[maybe_unused]] DecoderMMAL::DecoderMMAL(DecoderMMALPrivate &p) : d_ptr(&p) { - - } - - DecoderMMAL::DecoderMMAL(DecoderMMAL &&other) noexcept: d_ptr(other.d_ptr) { - other.d_ptr = nullptr; - d_ptr->q_ptr = this; - } - - DecoderMMAL::~DecoderMMAL() { - delete d_ptr; - } - - void DecoderMMAL::init(IPacketSource *source, AVRational framerate, AVRational timebase, int64_t duration, AVCodecParameters *vParams, - AVCodecParameters *aParams, AVCodecParameters *sParams) { - Q_UNUSED(aParams) - Q_UNUSED(sParams) - Q_D(AVQt::DecoderMMAL); - Q_UNUSED(source) - if (d->m_pCodecParams) { - avcodec_parameters_free(&d->m_pCodecParams); - } - d->m_pCodecParams = avcodec_parameters_alloc(); - avcodec_parameters_copy(d->m_pCodecParams, vParams); - d->m_duration = duration; - d->m_framerate = framerate; - d->m_timebase = timebase; - { - QMutexLocker lock(&d->m_cbListMutex); - for (const auto &cb: d->m_cbList) { - cb->init(this, framerate, duration); - } - } - init(); - } - - int DecoderMMAL::init() { - Q_D(AVQt::DecoderMMAL); - - return 0; - } - - void DecoderMMAL::deinit(IPacketSource *source) { - Q_UNUSED(source) - deinit(); - } - - int DecoderMMAL::deinit() { - Q_D(AVQt::DecoderMMAL); - - stop(); - - if (d->m_pCodecParams) { - avcodec_parameters_free(&d->m_pCodecParams); - d->m_pCodecParams = nullptr; - } - if (d->m_pCodecCtx) { - avcodec_close(d->m_pCodecCtx); - avcodec_free_context(&d->m_pCodecCtx); - d->m_pCodecCtx = nullptr; - d->m_pCodec = nullptr; - } - - return 0; - } - - void DecoderMMAL::start(IPacketSource *source) { - Q_UNUSED(source) - start(); - } - - int DecoderMMAL::start() { - Q_D(AVQt::DecoderMMAL); - - bool notRunning = false; - if (d->m_running.compare_exchange_strong(notRunning, true)) { - d->m_paused.store(false); - paused(false); - - QThread::start(); - return 0; - } - return -1; - } - - void DecoderMMAL::stop(IPacketSource *source) { - Q_UNUSED(source) - stop(); - } - - int DecoderMMAL::stop() { - Q_D(AVQt::DecoderMMAL); - - bool shouldBeCurrent = true; - if (d->m_running.compare_exchange_strong(shouldBeCurrent, false)) { - { -// QMutexLocker lock(&d->m_cbListMutex); - for (const auto &cb: d->m_cbList) { - cb->stop(this); - } - } - { - QMutexLocker lock(&d->m_inputQueueMutex); - for (auto &packet : d->m_inputQueue) { - av_packet_unref(packet); - av_packet_free(&packet); - } - d->m_inputQueue.clear(); - } - - wait(); - - return 0; - } - - return -1; - } - - void DecoderMMAL::pause(bool pause) { - Q_D(AVQt::DecoderMMAL); - if (d->m_running.load() != pause) { - d->m_paused.store(pause); - - for (const auto &cb: d->m_cbList) { - cb->pause(this, pause); - } - - paused(pause); - } - } - - bool DecoderMMAL::isPaused() { - Q_D(AVQt::DecoderMMAL); - return d->m_paused.load(); - } - - qint64 DecoderMMAL::registerCallback(IFrameSink *frameSink) { - Q_D(AVQt::DecoderMMAL); - - QMutexLocker lock(&d->m_cbListMutex); - if (!d->m_cbList.contains(frameSink)) { - d->m_cbList.append(frameSink); - if (d->m_running.load() && d->m_pCodecCtx) { - frameSink->init(this, d->m_framerate, d->m_duration); - frameSink->start(this); - } - return d->m_cbList.indexOf(frameSink); - } - return -1; - } - - qint64 DecoderMMAL::unregisterCallback(IFrameSink *frameSink) { - Q_D(AVQt::DecoderMMAL); - QMutexLocker lock(&d->m_cbListMutex); - if (d->m_cbList.contains(frameSink)) { - auto result = d->m_cbList.indexOf(frameSink); - d->m_cbList.removeOne(frameSink); - frameSink->stop(this); - frameSink->deinit(this); - return result; - } - return -1; - } - - void DecoderMMAL::onPacket(IPacketSource *source, AVPacket *packet, int8_t packetType) { - Q_UNUSED(source) - - Q_D(AVQt::DecoderMMAL); - - if (packetType == IPacketSource::CB_VIDEO) { - AVPacket *queuePacket = av_packet_clone(packet); - while (d->m_inputQueue.size() >= 50) { - QThread::msleep(4); - } - QMutexLocker lock(&d->m_inputQueueMutex); - d->m_inputQueue.append(queuePacket); - } - } - - void DecoderMMAL::run() { - Q_D(AVQt::DecoderMMAL); - - while (d->m_running) { - if (!d->m_paused.load() && !d->m_inputQueue.isEmpty()) { - int ret; - constexpr size_t strBufSize = 64; - char strBuf[strBufSize]; - // If m_pCodecParams is nullptr, it is not initialized by packet source, if video codec context is nullptr, this is the first packet - if (d->m_pCodecParams && !d->m_pCodecCtx) { - switch (d->m_pCodecParams->codec_id) { - case AV_CODEC_ID_H264: - d->m_pCodec = avcodec_find_decoder_by_name("h264_mmal"); - break; - case AV_CODEC_ID_MPEG2VIDEO: - d->m_pCodec = avcodec_find_decoder_by_name("mpeg2_mmal"); - break; - case AV_CODEC_ID_MPEG4: - d->m_pCodec = avcodec_find_decoder_by_name("mpeg4_mmal"); - break; - case AV_CODEC_ID_VC1: - d->m_pCodec = avcodec_find_decoder_by_name("vc1_mmal"); - break; - default: - qFatal("No MMAL decoder found for the specified codec: %s", avcodec_get_name(d->m_pCodecParams->codec_id)); - break; - } - - d->m_pCodecCtx = avcodec_alloc_context3(d->m_pCodec); - if (!d->m_pCodecCtx) { - qFatal("Could not allocate MMAL decoder context, probably out of memory"); - } - - avcodec_parameters_to_context(d->m_pCodecCtx, d->m_pCodecParams); - ret = avcodec_open2(d->m_pCodecCtx, d->m_pCodec, nullptr); - if (ret != 0) { - qFatal("%d: Could not open MMAL decoder: %s", ret, av_make_error_string(strBuf, strBufSize, ret)); - } - - for (const auto &cb: d->m_cbList) { - cb->start(this); - } - started(); - } - { - QMutexLocker lock(&d->m_inputQueueMutex); - while (!d->m_inputQueue.isEmpty()) { - AVPacket *packet = d->m_inputQueue.dequeue(); - lock.unlock(); - - qDebug("Video packet queue size: %d", d->m_inputQueue.size()); - - ret = avcodec_send_packet(d->m_pCodecCtx, packet); - if (ret == AVERROR_EOF || ret == AVERROR(EAGAIN)) { - lock.relock(); - d->m_inputQueue.prepend(packet); - break; - } else if (ret < 0) { - qFatal("%d: Error sending packet to MMAL decoder: %s", ret, av_make_error_string(strBuf, strBufSize, ret)); - } - av_packet_unref(packet); - av_packet_free(&packet); - lock.relock(); - } - } - AVFrame *frame = av_frame_alloc(); - while (true) { - ret = avcodec_receive_frame(d->m_pCodecCtx, frame); - if (ret == AVERROR_EOF || ret == AVERROR(EAGAIN)) { - break; - } else if (ret < 0) { - qFatal("%d: Error receiving frame from MMAL decoder: %s", ret, av_make_error_string(strBuf, strBufSize, ret)); - } - -// auto t1 = NOW(); -// AVFrame *swFrame = av_frame_alloc(); -// ret = av_hwframe_transfer_data(swFrame, frame, 0); -// if (ret != 0) { -// qFatal("%d: Could not get hw frame: %s", ret, av_make_error_string(strBuf, strBufSize, ret)); -// } -// auto t3 = NOW(); - - QMutexLocker lock2(&d->m_cbListMutex); -// QList<QFuture<void>> cbFutures; - 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: %lld, Timebase: %d/%d", static_cast<long long>(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); -// })); - } -// bool cbBusy = true; -// while (cbBusy) { -// cbBusy = false; -// for (const auto &future: cbFutures) { -// if (future.isRunning()) { -// cbBusy = true; -// break; -// } -// } -// usleep(500); -// } -// auto t2 = NOW(); -// qDebug("Decoder frame transfer time: %ld us", TIME_US(t1, t3)); - -// av_frame_free(&swFrame); - av_frame_unref(frame); - } - av_frame_free(&frame); - } else { - msleep(4); - } - } - } -} \ No newline at end of file diff --git a/AVQt/filter/DecoderQSV.cpp b/AVQt/filter/DecoderQSV.cpp index 091b03cf5f53e1a2a36b541a206434a037c6a686..464d43c5ed3d288e1e52208cddb857c708fc65bc 100644 --- a/AVQt/filter/DecoderQSV.cpp +++ b/AVQt/filter/DecoderQSV.cpp @@ -20,7 +20,6 @@ namespace AVQt { DecoderQSV::DecoderQSV(QObject *parent) : QThread(parent), d_ptr(new DecoderQSVPrivate(this)) { - Q_D(AVQt::DecoderQSV); } [[maybe_unused]] DecoderQSV::DecoderQSV(DecoderQSVPrivate &p) : d_ptr(&p) { @@ -60,8 +59,6 @@ namespace AVQt { } int DecoderQSV::init() { - Q_D(AVQt::DecoderQSV); - return 0; } diff --git a/AVQt/filter/DecoderVAAPI.cpp b/AVQt/filter/DecoderVAAPI.cpp index f4b404530786ec7e7dd47d2ad71a1f1d18ecc202..a68f3edf229d6faf9bf99d846ac56483e12743b3 100644 --- a/AVQt/filter/DecoderVAAPI.cpp +++ b/AVQt/filter/DecoderVAAPI.cpp @@ -20,7 +20,6 @@ namespace AVQt { DecoderVAAPI::DecoderVAAPI(QObject *parent) : QThread(parent), d_ptr(new DecoderVAAPIPrivate(this)) { - Q_D(AVQt::DecoderVAAPI); } [[maybe_unused]] DecoderVAAPI::DecoderVAAPI(DecoderVAAPIPrivate &p) : d_ptr(&p) { @@ -60,8 +59,6 @@ namespace AVQt { } int DecoderVAAPI::init() { - Q_D(AVQt::DecoderVAAPI); - return 0; } diff --git a/AVQt/filter/EncoderVAAPI.cpp b/AVQt/filter/EncoderVAAPI.cpp index c80e22f4db6bec40afc1d16d29c01dd7bad0d3ad..1c76568bd995933b4f4dcbc67934052ee35c141b 100644 --- a/AVQt/filter/EncoderVAAPI.cpp +++ b/AVQt/filter/EncoderVAAPI.cpp @@ -142,29 +142,25 @@ namespace AVQt { int EncoderVAAPI::deinit(IFrameSource *source) { Q_UNUSED(source) - Q_D(AVQt::EncoderVAAPI); deinit(); return 0; } int EncoderVAAPI::start(IFrameSource *source) { Q_UNUSED(source) - Q_D(AVQt::EncoderVAAPI); start(); return 0; } int EncoderVAAPI::stop(IFrameSource *source) { Q_UNUSED(source) - Q_D(AVQt::EncoderVAAPI); stop(); return 0; } void EncoderVAAPI::pause(IFrameSource *source, bool paused) { Q_UNUSED(source) - Q_D(AVQt::EncoderVAAPI); - this->pause(paused); + pause(paused); } qint64 EncoderVAAPI::registerCallback(IPacketSink *packetSink, int8_t type) { diff --git a/AVQt/input/Demuxer.cpp b/AVQt/input/Demuxer.cpp index df65c4ad4ee777168db4c397f9e8383f838013c9..d99e134901427e16e18385b13a8bdb749967497e 100644 --- a/AVQt/input/Demuxer.cpp +++ b/AVQt/input/Demuxer.cpp @@ -15,8 +15,6 @@ namespace AVQt { } Demuxer::Demuxer(DemuxerPrivate &p) : d_ptr(&p) { - Q_D(AVQt::Demuxer); - } void Demuxer::pause(bool pause) { diff --git a/AVQt/input/Demuxer.h b/AVQt/input/Demuxer.h index 295e167898f305d812d5cd7f9c0303b43ab0c4d2..313c9bed4e5e1c22748c00c5fec91687b457c30e 100644 --- a/AVQt/input/Demuxer.h +++ b/AVQt/input/Demuxer.h @@ -77,7 +77,7 @@ namespace AVQt { * \brief Stops packet source (e.g. Interrupt processing thread, free camera). * @return Status code (0 = Success) */ - Q_INVOKABLE int stop(); + Q_INVOKABLE int stop() Q_DECL_OVERRIDE; /*! * \brief Sets paused flag of packet source diff --git a/AVQt/output/OpenALAudioOutput.cpp b/AVQt/output/OpenALAudioOutput.cpp index e5352fb6f27e8da73423eabf215e3a9a5156595d..bd6d57881a48a09ec569c2a57ac03e5e6f73fc75 100644 --- a/AVQt/output/OpenALAudioOutput.cpp +++ b/AVQt/output/OpenALAudioOutput.cpp @@ -10,8 +10,6 @@ namespace AVQt { OpenALAudioOutput::OpenALAudioOutput(QObject *parent) : QThread(parent), d_ptr(new OpenALAudioOutputPrivate(this)) { - Q_D(AVQt::OpenALAudioOutput); - } [[maybe_unused]] OpenALAudioOutput::OpenALAudioOutput(OpenALAudioOutputPrivate &p) : d_ptr(&p) { diff --git a/AVQt/output/OpenGLRenderer.cpp b/AVQt/output/OpenGLRenderer.cpp index fa2f2ef6e736c5319937f7169696d9a9158d5ce0..8ce839be0e36325e412df022e94d4ed8f2a58982 100644 --- a/AVQt/output/OpenGLRenderer.cpp +++ b/AVQt/output/OpenGLRenderer.cpp @@ -32,8 +32,6 @@ namespace AVQt { } OpenGLRenderer::~OpenGLRenderer() noexcept { - Q_D(AVQt::OpenGLRenderer); - delete d_ptr; } @@ -429,7 +427,7 @@ namespace AVQt { UTexActive = true; break; default: - qWarning("[AVQt::OpenGLRenderer] Unsupported pixel format"); + qFatal("[AVQt::OpenGLRenderer] Unsupported pixel format"); break; } d->m_yTexture = new QOpenGLTexture(QOpenGLTexture::Target2D);