streamtools: refactor output/scaler drivers to their own directories
[jpcrr.git] / streamtools / output-drv / rawi420.cpp
blobd99e59e5f4a9680f1369c3fb1d560295ad1c509a
1 #include <cstring>
2 #include "output-drv.hpp"
3 #include <iostream>
4 #include <fstream>
5 #include <stdexcept>
6 #include <vector>
7 #include <string>
9 namespace
11 class output_driver_rawi420 : public output_driver
13 public:
14 output_driver_rawi420(const std::string& filename, bool _uvswap)
16 uvswap = _uvswap;
17 if(filename != "-")
18 out = new std::ofstream(filename.c_str(), std::ios_base::binary);
19 else
20 out = &std::cout;
21 if(!*out)
22 throw std::runtime_error("Unable to open output file");
23 set_video_callback<output_driver_rawi420>(*this, &output_driver_rawi420::video_callback);
26 ~output_driver_rawi420()
28 if(out != &std::cout)
29 delete out;
32 void ready()
34 const video_settings& v = get_video_settings();
35 framesize = 4 * v.get_width() * v.get_height();
36 width = v.get_width();
37 height = v.get_height();
40 void video_callback(uint64_t timestamp, const uint8_t* raw_rgbx_data)
42 I420_convert_common(raw_rgbx_data, width, height, *out, !uvswap);
44 private:
45 std::ostream* out;
46 size_t framesize;
47 uint32_t width;
48 uint32_t height;
49 bool uvswap;
52 class output_driver_rawi420_factory : output_driver_factory
54 public:
55 output_driver_rawi420_factory(const std::string& name, bool _uvswap)
56 : output_driver_factory(name)
58 uvswap = _uvswap;
61 output_driver& make(const std::string& type, const std::string& name, const std::string& parameters)
63 if(parameters != "")
64 throw std::runtime_error("rawi420 output does not take parameters");
65 return *new output_driver_rawi420(name, uvswap);
67 private:
68 bool uvswap;
70 output_driver_rawi420_factory fact1("rawi420", false);
71 output_driver_rawi420_factory fact2("rawi420-uvswap", true);