Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion conanfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def requirements(self):
self.requires("nlohmann_json/3.11.3")
# self.requires("json-schema-validator/2.3.0")
self.requires("libxvc/0.1.2")
self.requires("xdaqmetadata/0.1.1")
self.requires("xdaqmetadata/0.1.2")
self.requires("oatpp/1.3.0.latest")

def layout(self):
Expand Down
21 changes: 18 additions & 3 deletions thorvision/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ find_package(libxvc REQUIRED)
find_package(Qt6 REQUIRED COMPONENTS Qml Quick QuickControls2 Svg)
find_package(PkgConfig REQUIRED)
pkg_search_module(gstreamer REQUIRED IMPORTED_TARGET gstreamer-1.0>=1.4)
pkg_search_module(gstreamer-codecparsers REQUIRED IMPORTED_TARGET gstreamer-codecparsers-1.0>=1.4)
find_package(Python3 REQUIRED COMPONENTS Interpreter)
find_package(oatpp REQUIRED)

Expand Down Expand Up @@ -107,7 +108,7 @@ set_target_properties(ThorVision
AUTOMOC ON
AUTORCC ON
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
WIN32_EXECUTABLE FALSE
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
INSTALL_RPATH "$ORIGIN;@executable_path/../Frameworks"
MACOSX_BUNDLE_GUI_IDENTIFIER "com.KonteX.ThorVision"
Expand All @@ -134,8 +135,21 @@ target_compile_options(ThorVision
)

if(CMAKE_BUILD_TYPE MATCHES "Debug")
target_compile_options(ThorVision PRIVATE -fsanitize=address,undefined)
target_link_options(ThorVision PRIVATE -fsanitize=address,undefined)
if(MSVC)
target_compile_definitions(ThorVision PRIVATE
GSTREAMER_QML_DEBUG_PATH="../../gstreamer_qml"
)

# Copy the custom gstreamer_qml folder to the build directory
add_custom_command(TARGET ThorVision POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${CMAKE_SOURCE_DIR}/gstreamer_qml"
"$<TARGET_FILE_DIR:ThorVision>/../../gstreamer_qml"
)
elseif(APPLE)
target_compile_options(ThorVision PRIVATE -fsanitize=address,undefined)
target_link_options(ThorVision PRIVATE -fsanitize=address,undefined)
endif()
endif()

target_link_libraries(ThorVision
Expand Down Expand Up @@ -204,6 +218,7 @@ if(WIN32)
# "gstqsv.dll" # https://gstreamer.freedesktop.org/documentation/qsv/index.html?gi-language=c
"gstd3d11.dll" # https://gstreamer.freedesktop.org/documentation/d3d11/index.html?gi-language=c
"gstqt6d3d11.dll" # https://gstreamer.freedesktop.org/documentation/qt6d3d11/index.html?gi-language=c
"gstvideorate.dll" # https://gstreamer.freedesktop.org/documentation/videorate/index.html?gi-language=c
)

list(TRANSFORM gst_plugins PREPEND "${gst_plugin_dir}/")
Expand Down
41 changes: 31 additions & 10 deletions thorvision/src/CameraItem.cc
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,12 @@ CameraItem::CameraItem(Camera *camera, QObject *parent)
return fa > fb;
});

static const QMap<QString, int> codec_priority = {
{tr("M-JPEG"), 0},
{tr("H.265"), 1},
};
std::sort(_codecs.begin(), _codecs.end(), [&](const QString &a, const QString &b) {
return _codecs.indexOf(a) > _codecs.indexOf(b);
return codec_priority.value(a, 99) < codec_priority.value(b, 99);
});

_caps.insert(0, "");
Expand Down Expand Up @@ -122,8 +126,8 @@ void CameraItem::set_cap(const QString &cap)
);
const auto &gst_cap = _quality_format[{_cap, _codec}];

_stream->start(gst_cap.media_type);
_camera->start(gst_cap);
_stream->start(gst_cap.media_type);
}

void CameraItem::set_codec(const QString &codec)
Expand All @@ -148,6 +152,8 @@ void CameraItem::set_codec(const QString &codec)

void CameraItem::update_metadata(const XDAQFrameData &metadata)
{
// spdlog::info("XDAQ Timestamp: {}", metadata.fpga_timestamp);

_metadata = metadata;
emit metadata_changed();
}
Expand All @@ -172,18 +178,33 @@ void CameraItem::start_recording(RecorderSettings *settings)
auto filepath = fs::path(settings->save_paths().at(0).toStdString()) /
settings->dir_name().toStdString() / _camera->name();

xvc::start_jpeg_recording(
GST_PIPELINE(_stream->_pipeline),
filepath,
settings->split_on(),
settings->split_length(),
to_time_unit(settings->split_unit_index())
);
if (_codec == tr("H.265")) {
_stream->start_h265_recording(
filepath,
settings->split_on(),
settings->split_length(),
to_time_unit(settings->split_unit_index())
);
} else if (_codec == "M-JPEG") {
xvc::start_jpeg_recording(
GST_PIPELINE(_stream->_pipeline),
filepath,
settings->split_on(),
settings->split_length(),
to_time_unit(settings->split_unit_index())
);
} else {
spdlog::warn("Unsupported codec: {}", _codec.toStdString());
}
}

void CameraItem::stop_recording()
{
spdlog::info("Stopping recording for camera {}", _camera->id());

xvc::stop_jpeg_recording(GST_PIPELINE(_stream->_pipeline));
if (_codec == tr("H.265")) {
_stream->stop_h265_recording();
} else {
xvc::stop_jpeg_recording(GST_PIPELINE(_stream->_pipeline));
}
}
8 changes: 8 additions & 0 deletions thorvision/src/CameraItem.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <QHash>
#include <QString>
#include <QVector>
#include <chrono>

#include "RecorderSettings.h"
#include "Stream.h"
Expand Down Expand Up @@ -70,6 +71,13 @@ class CameraItem : public QObject

bool is_streaming() const { return _stream ? _stream->_streaming.load() : false; };

void cleanup_stream()
{
if (_stream) {
_stream->reset();
}
}

signals:
void name_changed();
void cap_changed();
Expand Down
13 changes: 13 additions & 0 deletions thorvision/src/CameraModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,18 @@ class CameraModel : public QAbstractListModel

bool all_cameras_streaming() const;

const QList<CameraItem *> &cameras() const { return _cameras; };

void cleanup_all_streams()
{
spdlog::info(
"CameraModel::cleanup_all_streams() - cleaning up {} cameras", _cameras.size()
);
for (auto cam : _cameras) {
cam->cleanup_stream();
}
}

public:
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
Q_INVOKABLE QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
Expand All @@ -63,6 +75,7 @@ class CameraModel : public QAbstractListModel

public slots:
void onItemAdded(int index, QQuickItem *item);
// void onLoaderLoaded();

private:
QList<CameraItem *> _cameras;
Expand Down
Loading