Skip to content
Snippets Groups Projects
Commit b9b7c803 authored by Silas Della Contrada's avatar Silas Della Contrada
Browse files

Just a backup (not working!!!)

parent 23bf8c1c
No related branches found
No related tags found
No related merge requests found
*.user
......@@ -39,6 +39,7 @@ add_library(
input/Demuxer.cpp
filter/IDecoder.h
filter/IEncoder.h
filter/DecoderVAAPI.h
filter/private/DecoderVAAPI_p.h
......
# Created by and for Qt Creator This file was created for editing the project sources only.
# You may attempt to use it for building too, by modifying this file here.
#TARGET = LibAVQt
TEMPLATE = lib
CONFIG += staticlib
QT = core gui widgets opengl concurrent
CONFIG += c++latest
HEADERS = \
$$PWD/filter/private/AudioDecoder_p.h \
$$PWD/filter/private/DecoderDXVA2_p.h \
$$PWD/filter/private/DecoderVAAPI_p.h \
$$PWD/filter/private/EncoderVAAPI_p.h \
$$PWD/filter/AudioDecoder.h \
$$PWD/filter/DecoderDXVA2.h \
$$PWD/filter/DecoderVAAPI.h \
$$PWD/filter/EncoderVAAPI.h \
$$PWD/filter/IDecoder.h \
$$PWD/input/private/Demuxer_p.h \
$$PWD/input/Demuxer.h \
$$PWD/input/IAudioSource.h \
$$PWD/input/IFrameSource.h \
$$PWD/input/IPacketSource.h \
$$PWD/output/private/OpenALAudioOutput_p.h \
$$PWD/output/private/OpenALErrorHandler.h \
$$PWD/output/private/OpenGLRenderer_p.h \
$$PWD/output/private/RenderClock_p.h \
$$PWD/output/IAudioSink.h \
$$PWD/output/IFrameSink.h \
$$PWD/output/IPacketSink.h \
$$PWD/output/OpenALAudioOutput.h \
$$PWD/output/OpenGLRenderer.h \
$$PWD/output/RenderClock.h \
$$PWD/AVQt
SOURCES = \
$$PWD/filter/AudioDecoder.cpp \
$$PWD/filter/DecoderDXVA2.cpp \
$$PWD/filter/DecoderVAAPI.cpp \
$$PWD/filter/EncoderVAAPI.cpp \
$$PWD/input/Demuxer.cpp \
$$PWD/output/OpenALAudioOutput.cpp \
$$PWD/output/OpenGLRenderer.cpp \
$$PWD/output/RenderClock.cpp
INCLUDEPATH = \
$$PWD/filter \
$$PWD/filter/private \
$$PWD/input \
$$PWD/input/private \
$$PWD/output \
$$PWD/output/private
RESOURCES += $$PWD/resources.qrc
LIBS += -lOpenAL32 -lopengl32 -lavformat -lavfilter -lavutil -lavcodec -lavdevice -lswscale -lswresample -lbluray -lxml2 -lharfbuzz -lcairo -lgobject-2.0 -lfontconfig -lfreetype -lusp10 -lmsimg32 -lpixman-1 -lffi -lexpat -lbz2 -lpng16 -lharfbuzz_too -lfreetype_too -lglib-2.0 -lwinmm -lshlwapi -lpcre -lintl -lgdi32 -lgnutls -lhogweed -lnettle -ltasn1 -lidn2 -latomic -lcrypt32 -lgmp -lunistring -lcharset -lws2_32 -ldl -lavcodec -lvpx -lpthread -liconv -llzma -lopencore-amrwb -lz -lmp3lame -lopencore-amrnb -lopus -lspeex -ltheoraenc -ltheoradec -lvo-amrwbenc -lvorbisenc -lvorbis -logg -lx264 /data/Silas/MXE/usr/x86_64-w64-mingw32.static/lib/xvidcore.a -lole32 -lswresample -lavutil -lm -luser32 -lbcrypt
#DEFINES =
......@@ -277,19 +277,19 @@ namespace AVQt {
// auto t3 = NOW();
QMutexLocker lock2(&d->m_cbListMutex);
QList<QFuture<void>> cbFutures;
// 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: %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: %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);
// }));
}
// bool cbBusy = true;
......@@ -303,7 +303,6 @@ namespace AVQt {
// }
// usleep(500);
// }
// TODO: Pass HWFrame to sinks to improve performance in renderers, because VAAPI supports direct mapping to OpenGL textures
// auto t2 = NOW();
// qDebug("Decoder frame transfer time: %ld us", TIME_US(t1, t3));
......
......@@ -15,7 +15,7 @@ namespace AVQt {
d->m_encoder = std::move(encoder);
}
EncoderVAAPI::EncoderVAAPI(EncoderVAAPIPrivate &p) : d_ptr(&p) {
[[maybe_unused]] EncoderVAAPI::EncoderVAAPI(EncoderVAAPIPrivate &p) : d_ptr(&p) {
}
......
......@@ -2,8 +2,7 @@
// Created by silas on 4/18/21.
//
#include "output/IFrameSink.h"
#include "input/IPacketSource.h"
#include "IEncoder.h"
#include <QThread>
......@@ -25,13 +24,12 @@ extern "C" {
namespace AVQt {
class EncoderVAAPIPrivate;
class EncoderVAAPI : public QThread, public IFrameSink, public IPacketSource {
class EncoderVAAPI : public QThread, public IEncoder {
Q_OBJECT
Q_DECLARE_PRIVATE(AVQt::EncoderVAAPI)
Q_INTERFACES(AVQt::IFrameSink)
Q_INTERFACES(AVQt::IPacketSource)
Q_INTERFACES(AVQt::IEncoder)
public:
explicit EncoderVAAPI(QString encoder, QObject *parent = nullptr);
......@@ -87,11 +85,11 @@ namespace AVQt {
void paused(bool pause) override;
protected:
explicit EncoderVAAPI(EncoderVAAPIPrivate &p);
[[maybe_unused]] explicit EncoderVAAPI(EncoderVAAPIPrivate &p);
EncoderVAAPIPrivate *d_ptr;
};
}
#endif //LIBAVQT_ENCODERVAAPI_H
#endif //LIBAVQT_ENCODERVAAPI_H
\ No newline at end of file
//
// Created by silas on 5/13/21.
//
#include "output/IFrameSink.h"
#include "input/IPacketSource.h"
#ifndef LIBAVQT_IENCODER_H
#define LIBAVQT_IENCODER_H
namespace AVQt {
class IEncoder : public IFrameSink, public IPacketSource {
Q_INTERFACES(AVQt::IFrameSink)
Q_INTERFACES(AVQt::IPacketSource)
public:
virtual ~IEncoder() = default;
virtual bool isPaused() = 0;
public slots:
Q_INVOKABLE virtual int init(IFrameSource *source, AVRational framerate, int64_t duration) = 0;
Q_INVOKABLE virtual int deinit(IFrameSource *source) = 0;
Q_INVOKABLE virtual int start(IFrameSource *source) = 0;
Q_INVOKABLE virtual int stop(IFrameSource *source) = 0;
Q_INVOKABLE virtual void pause(IFrameSource *source, bool pause) = 0;
Q_INVOKABLE virtual void onFrame(IFrameSource *source, AVFrame *frame, int64_t frameDuration) = 0;
// IPacketSource
Q_INVOKABLE virtual int init() = 0;
Q_INVOKABLE virtual int deinit() = 0;
Q_INVOKABLE virtual int start() = 0;
Q_INVOKABLE virtual int stop() = 0;
Q_INVOKABLE virtual void pause(bool pause) = 0;
Q_INVOKABLE virtual qsizetype registerCallback(IPacketSink *packetSink, uint8_t type) = 0;
Q_INVOKABLE virtual qsizetype unregisterCallback(IPacketSink *packetSink) = 0;
signals:
virtual void started() = 0;
virtual void stopped() = 0;
virtual void paused(bool pause) = 0;
};
}
Q_DECLARE_INTERFACE(AVQt::IEncoder, "AVQt::IEncoder")
#endif //LIBAVQT_IENCODER_H
\ No newline at end of file
......@@ -172,7 +172,7 @@ namespace AVQt {
break;
}
newFrame.first->pts = frame->pts;
newFrame.second = -1;
newFrame.second = duration;
// av_frame_unref(frame);
// char strBuf[64];
......
......@@ -86,7 +86,7 @@ namespace AVQt {
intervalChanged(interval);
} else if (interval <= 0) {
throw std::out_of_range("Only timer intervals above 0 allowed");
throw std::out_of_range("Only positive timer intervals are allowed");
}
}
......@@ -108,9 +108,17 @@ namespace AVQt {
d->m_elapsedTime = new QElapsedTimer;
d->m_elapsedTime->start();
timeout(0);
} else if (!d->m_elapsedTime->isValid()) {
d->m_elapsedTime->restart();
timeout(0);
} else {
qDebug("Timeout at: %lld", d->m_elapsedTime->nsecsElapsed() / 1000 - d->m_pausedTime);
if (d->m_elapsedTime->nsecsElapsed() / 1000 - d->m_pausedTime < 0) {
qFatal("Invalid time: %lld, Paused: %lld, Valid: %s", d->m_elapsedTime->nsecsElapsed() / 1000, d->m_pausedTime,
(d->m_elapsedTime->isValid() ? "true" : "false"));
}
timeout((d->m_elapsedTime->nsecsElapsed() / 1000) - d->m_pausedTime);
}
qDebug("Timeout at: %lld", d->m_elapsedTime->nsecsElapsed() / 1000 - d->m_pausedTime);
timeout((d->m_elapsedTime->nsecsElapsed() / 1000) - d->m_pausedTime);
}
}
......
This diff is collapsed.
This diff is collapsed.
......@@ -59,8 +59,8 @@ 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);
......@@ -73,12 +73,13 @@ int main(int argc, char *argv[]) {
#else
#error "Unsupported OS"
#endif
// AVQt::OpenGLRenderer renderer;
AVQt::OpenGLRenderer renderer;
AVQt::EncoderVAAPI *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);
videoDecoder->registerCallback(&renderer);
// renderer.setMinimumSize(QSize(360, 240));
......@@ -97,7 +98,7 @@ int main(int argc, char *argv[]) {
QObject::connect(app, &QApplication::aboutToQuit, [&] {
demuxer.deinit();
delete encoder;
// delete encoder;
delete videoDecoder;
});
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment