// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef COMMANDLINEPARSER_H #define COMMANDLINEPARSER_H #include "settings.h" #include #include class CommandLineParser { public: struct Result { AudioGeneratorSettingsOpt audioGeneratorSettings; VideoGeneratorSettingsOpt videoGeneratorSettings; PushModeSettingsOpt pushModeSettings; RecorderSettings recorderSettings; }; CommandLineParser(); Result process(); private: template auto parsedValue(const QString &option, ContextChecker &&contextChecker, ResultGetter &&...resultGetter) -> std::optional()))>; QString addOption(QCommandLineOption option); void parseCommonSettings(); void parseAudioGeneratorSettings(); void parseVideoGeneratorSettings(); void parsePushModeSettings(); void parseRecorderSettings(); struct Options { // common QString streams; QString mode; // generator QString duration; QString channelFrequencies; QString audioBufferDuration; QString sampleFormat; QString channelConfig; QString frameRate; QString resolution; QString framePatternWidth; QString framePatternSpeed; QString pushModeProducingRate; QString pushModeMaxQueueSize; // recorder QString outputLocation; QString recorderFrameRate; QString recorderQuality; QString recorderResolution; QString recorderAudioCodec; QString recorderVideoCodec; QString recorderFileFormat; }; Options createOptions(); private: const QString m_videoStream = QStringLiteral("video"); const QString m_audioStream = QStringLiteral("audio"); const QString m_pullMode = QStringLiteral("pull"); const QString m_pushMode = QStringLiteral("push"); const QStringList m_streams{ m_audioStream, m_videoStream }; const QStringList m_modes{ m_pullMode, m_pushMode }; template using EnumMap = std::unordered_map; const EnumMap m_sampleFormats = { { QAudioFormat::UInt8, u"uint8" }, { QAudioFormat::Int16, u"int16" }, { QAudioFormat::Int32, u"int32" }, { QAudioFormat::Float, u"float" }, }; const EnumMap m_channelConfigs = { { QAudioFormat::ChannelConfigMono, u"mono" }, { QAudioFormat::ChannelConfigStereo, u"stereo" }, { QAudioFormat::ChannelConfig2Dot1, u"2Dot1" }, { QAudioFormat::ChannelConfig3Dot0, u"3Dot0" }, { QAudioFormat::ChannelConfig3Dot1, u"3Dot1" }, { QAudioFormat::ChannelConfigSurround5Dot0, u"surround5Dot0" }, { QAudioFormat::ChannelConfigSurround5Dot1, u"surround5Dot1" }, { QAudioFormat::ChannelConfigSurround7Dot1, u"surround7Dot1" } }; const EnumMap m_recorderQualities = { { QMediaRecorder::VeryLowQuality, u"veryLow" }, { QMediaRecorder::LowQuality, u"low" }, { QMediaRecorder::NormalQuality, u"normal" }, { QMediaRecorder::HighQuality, u"high" }, { QMediaRecorder::VeryHighQuality, u"veryHigh" }, }; const EnumMap m_audioCodecs = { { QMediaFormat::AudioCodec::MP3, u"mp3" }, { QMediaFormat::AudioCodec::AAC, u"aac" }, { QMediaFormat::AudioCodec::AC3, u"ac3" }, { QMediaFormat::AudioCodec::EAC3, u"eac3" }, { QMediaFormat::AudioCodec::FLAC, u"flac" }, { QMediaFormat::AudioCodec::DolbyTrueHD, u"dolbyTrueHD" }, { QMediaFormat::AudioCodec::Opus, u"opus" }, { QMediaFormat::AudioCodec::Vorbis, u"vorbis" }, { QMediaFormat::AudioCodec::Wave, u"wave" }, { QMediaFormat::AudioCodec::WMA, u"wma" }, { QMediaFormat::AudioCodec::ALAC, u"alac" }, }; const EnumMap m_videoCodecs = { { QMediaFormat::VideoCodec::MPEG1, u"mpeg1" }, { QMediaFormat::VideoCodec::MPEG2, u"mpeg2" }, { QMediaFormat::VideoCodec::MPEG4, u"mpeg4" }, { QMediaFormat::VideoCodec::H264, u"h264" }, { QMediaFormat::VideoCodec::H265, u"h265" }, { QMediaFormat::VideoCodec::VP8, u"vp8" }, { QMediaFormat::VideoCodec::VP9, u"vp9" }, { QMediaFormat::VideoCodec::AV1, u"av1" }, { QMediaFormat::VideoCodec::Theora, u"theora" }, { QMediaFormat::VideoCodec::WMV, u"wmv" }, { QMediaFormat::VideoCodec::MotionJPEG, u"motionJPEG" }, }; const EnumMap m_fileFormats = { { QMediaFormat::FileFormat::WMV, u"wmv" }, { QMediaFormat::FileFormat::AVI, u"avi" }, { QMediaFormat::FileFormat::Matroska, u"matroska" }, { QMediaFormat::FileFormat::MPEG4, u"mpeg4" }, { QMediaFormat::FileFormat::Ogg, u"ogg" }, { QMediaFormat::FileFormat::QuickTime, u"quickTime" }, { QMediaFormat::FileFormat::WebM, u"webm" }, { QMediaFormat::FileFormat::Mpeg4Audio, u"mpeg4Audio" }, { QMediaFormat::FileFormat::AAC, u"aac" }, { QMediaFormat::FileFormat::WMA, u"wma" }, { QMediaFormat::FileFormat::MP3, u"mp3" }, { QMediaFormat::FileFormat::FLAC, u"flac" }, }; QString m_mode = m_pullMode; Result m_result; QCommandLineParser m_parser; Options m_options = createOptions(); // should be the last member }; #endif // COMMANDLINEPARSER_H