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
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
set(PROJECT_IMPLEMENTATIONS
src/impl/FFmpeg.cpp
src/impl/Sources.cpp
src/impl/Hyperframe.cpp
src/impl/Hyperwall.cpp
)
set(CMAKE_CXX_FLAGS "-O3")
Expand Down
15 changes: 8 additions & 7 deletions include/FFmpeg.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

#include "Settings.hpp"

namespace Hyperwall {
namespace asck {

class FFmpeg {
FILE* buffer;
Expand All @@ -20,7 +20,7 @@ class FFmpeg {
const std::string bitrate;


constexpr FFmpeg(Settings settings, coordinate position) :
FFmpeg(const Settings& settings, const coordinate position) :
resolution(settings.resolution),
dimensions(settings.dimensions),
rtsp_server(settings.rtsp_server),
Expand All @@ -30,16 +30,17 @@ class FFmpeg {

}

constexpr FFmpeg(Settings settings) :
FFmpeg(const Settings& settings) :
resolution(settings.resolution),
dimensions(settings.dimensions),
rtsp_server(settings.rtsp_server),
framerate(settings.framerate),
bitrate(settings.bitrate),
position({0, 0}) {

}

constexpr FFmpeg(coordinate position) :
FFmpeg(const coordinate position) :
resolution(1920, 1080),
dimensions(2, 2),
rtsp_server("0.0.0.0:8554"),
Expand All @@ -48,17 +49,17 @@ class FFmpeg {
position(position) {
}

constexpr FFmpeg() :
FFmpeg() :
resolution(1920, 1080),
dimensions(0, 0),
rtsp_server("0.0.0.0:8554"),
framerate(60),
bitrate("1G"),
position(0, 0) {
}
constexpr ~FFmpeg() = default;
~FFmpeg() = default;

constexpr std::string uri() const {
std::string uri() {
const auto [x, y] = position;
return std::format("rtsp://0.0.0.0:8554/frame/{}/{}", x, y);
}
Expand Down
16 changes: 16 additions & 0 deletions include/Hyperframe.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#include "Settings.hpp"
#include "FFmpeg.hpp"

namespace asck {

class HyperFrame {
const coordinate position;
const Settings& settings;
FFmpeg ffmpeg;
public:
HyperFrame(const HyperFrame&);
HyperFrame(const coordinate&, const Settings&, FFmpeg&);
void run(const cv::Mat&);
};

}
30 changes: 9 additions & 21 deletions include/Hyperwall.hpp
Original file line number Diff line number Diff line change
@@ -1,29 +1,17 @@
#pragma once

#include "FFmpeg.hpp"
#include "Sources/VideoSource.hpp"
#include "Settings.hpp"
#include "Hyperframe.hpp"

namespace Hyperwall {
namespace asck {

class HyperFrame {
const coordinate position;
const coordinate dimensions;
const coordinate resolution;
FFmpeg ffmpeg;
public:
HyperFrame(const HyperFrame&);
HyperFrame(const coordinate&, Settings&, FFmpeg&);
void run(const cv::Mat&);
};

class Hyperwall {
std::unique_ptr<VideoSourceT> source;
std::vector<HyperFrame> frames;
const coordinate dimensions;
public:
Hyperwall(VideoSourceT&, Settings&);
void run();
};
class Hyperwall {
VideoSourceT& source;
std::vector<HyperFrame> frames;
public:
Hyperwall(VideoSourceT&, const Settings&);
void run();
};

} // Hyperwall
51 changes: 51 additions & 0 deletions include/HyperwallArguments.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// Uses argparse to generate a settings object
// This way the settings object is just a generic struct-like object while the settingsfactory can essentially do the same but using argparse
#pragma once

#include <argparse/argparse.hpp>
#include <spdlog/spdlog.h>

namespace asck {
class HyperwallArguments : public argparse::ArgumentParser {
public:
int loglevel = spdlog::level::info;

HyperwallArguments(const int argc, const char* argv[]) : ArgumentParser(argv[0]) {

add_argument("--resolution")
.default_value("1920x1080");
add_argument("--dimensions")
.default_value("2x2");
add_argument("--framerate")
.scan<'i', int>()
.default_value(60);
add_argument("--file")
.default_value("file.mp4");
add_argument("--bitrate")
.default_value("1G");
add_argument("--rtsp-server")
.default_value("0.0.0.0:8554");
add_argument("mode")
.default_value("file");
add_argument("-v")
.action([&](const auto &){loglevel--;})
.append()
.default_value(false)
.implicit_value(true)
.nargs(0);
add_argument("-q")
.action([&](const auto &){loglevel++;})
.append()
.default_value(false)
.implicit_value(true)
.nargs(0);

try {
parse_args(argc, argv);
} catch(std::exception& e) {
spdlog::error("Failed to parse arguments, exiting!");
exit(EXIT_FAILURE);
}
}
};
}
39 changes: 39 additions & 0 deletions include/Mode.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#pragma once

#include <string>
#include <unordered_map>

namespace asck {
enum Mode {
Webcam,
Screenshare,
File
};


inline Mode toMode(std::string modeString) {
std::unordered_map<std::string, Mode> modeMap{
{"webcam", Webcam},
{"screenshare", Screenshare},
{"file", File}
};
if (modeMap.contains(modeString)) {
return modeMap[modeString];
} else {
throw std::exception();
}
}

inline std::string fromMode(Mode mode) {
switch(mode) {
case Mode::Webcam:
return "webcam";
case Mode::Screenshare:
return "screenshare";
case Mode::File:
return "file";
default:
throw std::exception();
}
}
}
124 changes: 87 additions & 37 deletions include/Settings.hpp
Original file line number Diff line number Diff line change
@@ -1,75 +1,125 @@
#pragma once

#include <tuple>
#include <spdlog/common.h>
#include <spdlog/spdlog.h>
#include <string>

namespace Hyperwall {
#include "HyperwallArguments.hpp"
#include "Utils.hpp"
#include "Mode.hpp"

typedef std::tuple<int, int> coordinate;
namespace asck {

struct Settings {

class Settings {
public:
const coordinate resolution;
const coordinate dimensions;
const std::string rtsp_server;
const std::string bitrate;
const unsigned int framerate;
const std::string file;
const Mode mode;
const spdlog::level::level_enum loglevel;

constexpr Settings(const coordinate& resolution, const coordinate& dimensions, const std::string rtsp_server, const std::string bitrate, const unsigned int framerate) :
constexpr Settings(const coordinate resolution, const coordinate dimensions, const std::string rtsp_server, const std::string bitrate, const unsigned int framerate, const std::string file, Mode mode) :
resolution(resolution),
dimensions(dimensions),
rtsp_server(rtsp_server),
bitrate(bitrate),
framerate(framerate) {
framerate(framerate),
file(file),
mode(mode),
loglevel(spdlog::level::level_enum::info) {
}

constexpr Settings(const coordinate& resolution, const coordinate& dimensions, const std::string rtsp_server, const std::string bitrate) :
resolution(resolution),
dimensions(dimensions),
rtsp_server(rtsp_server),
bitrate(bitrate),
framerate(60) {
constexpr Settings(const coordinate resolution, const coordinate dimensions, const std::string rtsp_server, const std::string bitrate, const unsigned int framerate, const std::string file) :
Settings(
resolution,
dimensions,
rtsp_server,
bitrate,
framerate,
file,
Mode::File) {
}

constexpr Settings(const coordinate& resolution, const coordinate& dimensions, const std::string rtsp_server) :
resolution(resolution),
dimensions(dimensions),
rtsp_server(rtsp_server),
bitrate("1G"),
framerate(60) {
constexpr Settings(const coordinate resolution, const coordinate dimensions, const std::string rtsp_server, const std::string bitrate, const unsigned int framerate) :
Settings(
resolution,
dimensions,
rtsp_server,
bitrate,
framerate,
"file.mp4"
) {
}

constexpr Settings(const coordinate& resolution, const coordinate& dimensions) :
resolution(resolution),
dimensions(dimensions),
rtsp_server("0.0.0.0:8554"),
bitrate("1G"),
framerate(60) {

constexpr Settings(const coordinate resolution, const coordinate dimensions, const std::string rtsp_server, const std::string bitrate) :
Settings(
resolution,
dimensions,
rtsp_server,
bitrate,
60
) {
}

constexpr Settings(const coordinate& resolution) :
resolution(resolution),
dimensions({2, 2}),
rtsp_server("0.0.0.0:8554"),
bitrate("1G"),
framerate(60) {

constexpr Settings(const coordinate resolution, const coordinate dimensions, const std::string rtsp_server) :
Settings(
resolution,
dimensions,
rtsp_server,
"1G"
) {

}


constexpr Settings(const coordinate resolution, const coordinate dimensions) :
Settings(
resolution,
dimensions,
"0.0.0.0:8554"
) {
}

constexpr Settings(const coordinate resolution) :
Settings(
resolution,
{2, 2}
) {
}

constexpr Settings() :
resolution({1920, 1080}),
dimensions({2, 2}),
rtsp_server("0.0.0.0:8554"),
bitrate("1G"),
framerate(60) {
Settings(
{1920, 1080}
) {
}

constexpr Settings(const HyperwallArguments& arguments) :
resolution(splitResolution(arguments.get("--resolution"))),
dimensions(splitResolution(arguments.get("--dimensions"))),
rtsp_server(arguments.get("--rtsp-server")),
bitrate(arguments.get("--bitrate")),
framerate(arguments.get<int>("--framerate")),
loglevel(static_cast<spdlog::level::level_enum>(arguments.loglevel)),
file(arguments.get("--file")),
mode(toMode(arguments.get("mode"))) {
}

constexpr Settings(Settings& other) :
resolution(other.resolution),
dimensions(other.dimensions),
rtsp_server(other.rtsp_server),
bitrate(other.bitrate),
framerate(other.framerate) {
framerate(other.framerate),
loglevel(other.loglevel),
file(other.file),
mode(other.mode) {
}

};

}
5 changes: 2 additions & 3 deletions include/Sources/FileSource.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@

#include "Sources/VideoSource.hpp"

namespace Hyperwall {
namespace asck {

class FileSource : public VideoSourceT {
cv::VideoCapture capture;

public:
FileSource(std::string);
FileSource(const std::string);
virtual cv::Mat read() override;
virtual std::unique_ptr<VideoSourceT> clone() const override;
};

} // Hyperwall
Loading