From 61b5ba527efef75565336dfa87f0a2432dd5f50b Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Fri, 4 Mar 2016 21:02:15 +0100 Subject: Add -L option to give arbitrary options to VLC --- src/VLCInput.cpp | 14 ++++++++++++-- src/VLCInput.h | 15 +++++++++++---- src/dabplus-enc.cpp | 13 ++++++++++--- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/VLCInput.cpp b/src/VLCInput.cpp index f527f20..468ef70 100644 --- a/src/VLCInput.cpp +++ b/src/VLCInput.cpp @@ -159,8 +159,8 @@ int VLCInput::prepare() prepareRender_address, (long long int)(intptr_t)this); - - const char* vlc_args[6]; +#define VLC_ARGS_LEN 32 + const char* vlc_args[VLC_ARGS_LEN]; size_t arg_ix = 0; std::stringstream arg_verbose; arg_verbose << "--verbose=" << m_verbosity; @@ -185,6 +185,16 @@ int VLCInput::prepare() vlc_args[arg_ix++] = "--sout"; vlc_args[arg_ix++] = smem_options; // Stream to memory + for (const auto& opt : m_additional_opts) { + if (arg_ix < VLC_ARGS_LEN) { + vlc_args[arg_ix++] = opt.c_str(); + } + else { + fprintf(stderr, "Too many VLC options given"); + return 1; + } + } + if (m_verbosity) { fprintf(stderr, "Initialising VLC with options:\n"); for (size_t i = 0; i < arg_ix; i++) { diff --git a/src/VLCInput.h b/src/VLCInput.h index 27d6237..d583008 100644 --- a/src/VLCInput.h +++ b/src/VLCInput.h @@ -49,12 +49,14 @@ class VLCInput unsigned channels, unsigned verbosity, std::string& gain, - std::string& cache) : + std::string& cache, + std::vector& additional_opts) : m_uri(uri), m_verbosity(verbosity), m_channels(channels), m_rate(rate), m_cache(cache), + m_additional_opts(additional_opts), m_gain(gain), m_vlc(nullptr), m_mp(nullptr) { } @@ -106,6 +108,9 @@ class VLCInput // Whether to enable network caching in VLC or not std::string m_cache; + // Given as-is to libvlc + std::vector m_additional_opts; + // value for the VLC compressor filter std::string m_gain; @@ -130,8 +135,9 @@ class VLCInputDirect : public VLCInput unsigned channels, unsigned verbosity, std::string& gain, - std::string& cache) : - VLCInput(uri, rate, channels, verbosity, gain, cache) {} + std::string& cache, + std::vector& additional_opts) : + VLCInput(uri, rate, channels, verbosity, gain, cache, additional_opts) {} /* Read exactly length bytes into buf. * Blocks if not enough data is available, @@ -153,8 +159,9 @@ class VLCInputThreaded : public VLCInput unsigned verbosity, std::string& gain, std::string& cache, + std::vector& additional_opts, SampleQueue& queue) : - VLCInput(uri, rate, channels, verbosity, gain, cache), + VLCInput(uri, rate, channels, verbosity, gain, cache, additional_opts), m_fault(false), m_running(false), m_queue(queue) {} diff --git a/src/dabplus-enc.cpp b/src/dabplus-enc.cpp index d0130fd..0f34d65 100644 --- a/src/dabplus-enc.cpp +++ b/src/dabplus-enc.cpp @@ -103,6 +103,8 @@ void usage(const char* name) { " much too loud.\n" " -V Increase the VLC verbosity by one (can be given \n" " multiple times)\n" + " -L OPTION Give an additional options to VLC (can be given\n" + " multiple times)\n" " -w, --write-icy-text=filename Write the ICY Text into the file, so that mot-encoder can read it.\n" #else " The VLC input was disabled at compile-time\n" @@ -255,6 +257,7 @@ int main(int argc, char *argv[]) std::string vlc_icytext_file = ""; std::string vlc_gain = ""; std::string vlc_cache = ""; + std::vector vlc_additional_opts; unsigned verbosity = 0; // For the file output @@ -312,6 +315,7 @@ int main(int argc, char *argv[]) {"vlc-cache", required_argument, 0, 'C'}, {"vlc-gain", required_argument, 0, 'g'}, {"vlc-uri", required_argument, 0, 'v'}, + {"vlc-opt", required_argument, 0, 'L'}, {"write-icy-text", required_argument, 0, 'w'}, {"aaclc", no_argument, 0, 0 }, {"afterburner", no_argument, 0, 'a'}, @@ -346,7 +350,7 @@ int main(int argc, char *argv[]) int index; while(ch != -1) { - ch = getopt_long(argc, argv, "aAhDlVb:c:f:i:j:k:o:r:d:p:P:s:v:w:g:C:", longopts, &index); + ch = getopt_long(argc, argv, "aAhDlVb:c:f:i:j:k:L:o:r:d:p:P:s:v:w:g:C:", longopts, &index); switch (ch) { case 0: // AAC-LC aot = AOT_DABPLUS_AAC_LC; @@ -437,6 +441,9 @@ int main(int argc, char *argv[]) case 'C': vlc_cache = optarg; break; + case 'L': + vlc_additional_opts.push_back(optarg); + break; #else case 'v': case 'w': @@ -608,8 +615,8 @@ int main(int argc, char *argv[]) JackInput jack_in(jack_name, channels, sample_rate, queue); #endif #if HAVE_VLC - VLCInputDirect vlc_in_direct(vlc_uri, sample_rate, channels, verbosity, vlc_gain, vlc_cache); - VLCInputThreaded vlc_in_threaded(vlc_uri, sample_rate, channels, verbosity, vlc_gain, vlc_cache, queue); + VLCInputDirect vlc_in_direct(vlc_uri, sample_rate, channels, verbosity, vlc_gain, vlc_cache, vlc_additional_opts); + VLCInputThreaded vlc_in_threaded(vlc_uri, sample_rate, channels, verbosity, vlc_gain, vlc_cache, vlc_additional_opts, queue); #endif if (infile) { -- cgit v1.2.3