streamtools: Refactor options parsing and RGB->I420 conversion
[jpcrr.git] / streamtools / output-drv-rawi420.cpp
blob7c7b0fce881946e230cb00361b5572022d6fde06
1 #include <cstring>
2 #include "output-drv.hpp"
3 #include <iostream>
4 #include <fstream>
5 #include <stdexcept>
6 #include <vector>
7 #include <string>
8 #include <sstream>
9 #include "rgbtorgb.hh"
11 namespace
13 class output_driver_rawi420 : public output_driver
15 public:
16 output_driver_rawi420(const std::string& filename, bool _uvswap)
18 uvswap = _uvswap;
19 if(filename != "-")
20 out = new std::ofstream(filename.c_str(), std::ios_base::binary);
21 else
22 out = &std::cout;
23 if(!*out)
24 throw std::runtime_error("Unable to open output file");
25 set_video_callback<output_driver_rawi420>(*this, &output_driver_rawi420::video_callback);
28 ~output_driver_rawi420()
30 if(out != &std::cout)
31 delete out;
34 void ready()
36 const video_settings& v = get_video_settings();
37 framesize = 4 * v.get_width() * v.get_height();
38 width = v.get_width();
39 height = v.get_height();
42 void video_callback(uint64_t timestamp, const uint8_t* raw_rgbx_data)
44 I420_convert_common(raw_rgbx_data, width, height, *out, !uvswap);
46 private:
47 std::ostream* out;
48 size_t framesize;
49 uint32_t width;
50 uint32_t height;
51 bool uvswap;
54 class output_driver_rawi420_factory : output_driver_factory
56 public:
57 output_driver_rawi420_factory(const std::string& name, bool _uvswap)
58 : output_driver_factory(name)
60 uvswap = _uvswap;
63 output_driver& make(const std::string& type, const std::string& name, const std::string& parameters)
65 if(parameters != "")
66 throw std::runtime_error("rawi420 output does not take parameters");
67 return *new output_driver_rawi420(name, uvswap);
69 private:
70 bool uvswap;
72 output_driver_rawi420_factory fact1("rawi420", false);
73 output_driver_rawi420_factory fact2("rawi420-uvswap", true);