streamtools: Refactor options parsing and RGB->I420 conversion
[jpcrr.git] / streamtools / output-drv-oggenc.cpp
blob0ab7d2576ec2746efd33542613180245b6866f03
1 #include "output-drv.hpp"
2 #include <cstdio>
3 #include <stdexcept>
4 #include <string>
5 #include <sstream>
7 namespace
9 class output_driver_oggenc : public output_driver
11 public:
12 output_driver_oggenc(const std::string& _filename, const std::string& _options)
14 filename = _filename;
15 options = _options;
16 set_audio_callback<output_driver_oggenc>(*this, &output_driver_oggenc::audio_callback);
19 ~output_driver_oggenc()
21 pclose(out);
24 void ready()
26 const audio_settings& a = get_audio_settings();
28 std::stringstream commandline;
29 commandline << "oggenc -r -R " << a.get_rate() << " ";
30 commandline << expand_arguments_common(options, "--", "=");
31 commandline << "-o " << filename << " -";
32 std::string s = commandline.str();
33 out = popen(s.c_str(), "w");
34 if(!out) {
35 std::stringstream str;
36 str << "Can't run oggenc (" << s << ")";
37 throw std::runtime_error(str.str());
41 void audio_callback(short left, short right)
43 uint8_t rawdata[4];
44 rawdata[1] = ((unsigned short)left >> 8) & 0xFF;
45 rawdata[0] = ((unsigned short)left) & 0xFF;
46 rawdata[3] = ((unsigned short)right >> 8) & 0xFF;
47 rawdata[2] = ((unsigned short)right) & 0xFF;
48 if(fwrite(rawdata, 1, 4, out) < 4)
49 throw std::runtime_error("Error writing sample to oggenc");
51 private:
52 FILE* out;
53 std::string filename;
54 std::string options;
57 class output_driver_oggenc_factory : output_driver_factory
59 public:
60 output_driver_oggenc_factory()
61 : output_driver_factory("oggenc")
65 output_driver& make(const std::string& type, const std::string& name, const std::string& parameters)
67 return *new output_driver_oggenc(name, parameters);
69 } factory;