qt6-bb10/qtmultimedia/tests/manual/mediaframeinputs/commandlineparser.h

165 lines
5.7 KiB
C++

// 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 <QCommandLineParser>
#include <unordered_map>
class CommandLineParser
{
public:
struct Result
{
AudioGeneratorSettingsOpt audioGeneratorSettings;
VideoGeneratorSettingsOpt videoGeneratorSettings;
PushModeSettingsOpt pushModeSettings;
RecorderSettings recorderSettings;
};
CommandLineParser();
Result process();
private:
template <typename ContextChecker, typename... ResultGetter>
auto parsedValue(const QString &option, ContextChecker &&contextChecker,
ResultGetter &&...resultGetter)
-> std::optional<decltype(std::invoke(resultGetter..., QString(),
std::declval<bool &>()))>;
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 <typename Enum>
using EnumMap = std::unordered_map<Enum, QStringView>;
const EnumMap<QAudioFormat::SampleFormat> m_sampleFormats = {
{ QAudioFormat::UInt8, u"uint8" },
{ QAudioFormat::Int16, u"int16" },
{ QAudioFormat::Int32, u"int32" },
{ QAudioFormat::Float, u"float" },
};
const EnumMap<QAudioFormat::ChannelConfig> 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<QMediaRecorder::Quality> m_recorderQualities = {
{ QMediaRecorder::VeryLowQuality, u"veryLow" }, { QMediaRecorder::LowQuality, u"low" },
{ QMediaRecorder::NormalQuality, u"normal" }, { QMediaRecorder::HighQuality, u"high" },
{ QMediaRecorder::VeryHighQuality, u"veryHigh" },
};
const EnumMap<QMediaFormat::AudioCodec> 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<QMediaFormat::VideoCodec> 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<QMediaFormat::FileFormat> 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