X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=bmusb%2Fbmusb.h;fp=bmusb%2Fbmusb.h;h=83677afdbdeb69fb0f606db17f7811cc7ccacd09;hb=01ddb8f836114c07cff3ca040d9ed2c946b2fdbf;hp=ed106a688e842d99ac631c4539b676a3b19d27d5;hpb=f31dfa719b78c2f6d4710422f9ba6d66e7c70da3;p=bmusb diff --git a/bmusb/bmusb.h b/bmusb/bmusb.h index ed106a6..83677af 100644 --- a/bmusb/bmusb.h +++ b/bmusb/bmusb.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -39,6 +40,9 @@ class FrameAllocator { // If set to true, every other byte will go to data and to data2. // If so, and are still about the number of total bytes // so if size == 1024, there's 512 bytes in data and 512 in data2. + // + // This doesn't really make any sense if you asked for the + // 10BitYCbCr pixel format. bool interleaved = false; // At what point this frame was received. Note that this marks the @@ -124,6 +128,32 @@ struct AudioFormat { unsigned num_channels = 0; }; +enum PixelFormat { + // 8-bit 4:2:2 in the standard Cb Y Cr Y order (UYVY). + // This is the default. + PixelFormat_8BitYCbCr, + + // 10-bit 4:2:2 in v210 order. Six pixels (six Y', three Cb, + // three Cr) are packed into four 32-bit little-endian ints + // in the following pattern (see e.g. the DeckLink documentation + // for reference): + // + // A B G R + // ----------------- + // X Cr0 Y0 Cb0 + // X Y2 Cb2 Y1 + // X Cb4 Y3 Cr2 + // X Y5 Cr4 Y4 + // + // If you read in RGB order and ignore the unused top bits, + // this is essentially Cb Y Cr Y order, just like UYVY is. + // + // Note that unlike true v210, there is no guarantee about + // 128-byte line alignment (or lack thereof); you should check + // the stride member of VideoFormat. + PixelFormat_10BitYCbCr +}; + typedef std::function @@ -140,6 +170,11 @@ class CaptureInterface { virtual uint32_t get_current_video_mode() const = 0; virtual void set_video_mode(uint32_t video_mode_id) = 0; + // TODO: Add a way to query this based on mode? + virtual std::set get_available_pixel_formats() const = 0; + virtual void set_pixel_format(PixelFormat pixel_format) = 0; + virtual PixelFormat get_current_pixel_format() const = 0; + virtual std::map get_available_video_inputs() const = 0; virtual void set_video_input(uint32_t video_input_id) = 0; virtual uint32_t get_current_video_input() const = 0; @@ -191,6 +226,18 @@ class BMUSBCapture : public CaptureInterface { // actually opening the card (in configure_card()). static unsigned num_cards(); + std::set get_available_pixel_formats() const override + { + return std::set{ PixelFormat_8BitYCbCr, PixelFormat_10BitYCbCr }; + } + + void set_pixel_format(PixelFormat pixel_format) override; + + PixelFormat get_current_pixel_format() const + { + return current_pixel_format; + } + std::map get_available_video_modes() const override; uint32_t get_current_video_mode() const override; void set_video_mode(uint32_t video_mode_id) override; @@ -343,6 +390,7 @@ class BMUSBCapture : public CaptureInterface { libusb_device_handle *devh = nullptr; uint32_t current_video_input = 0x00000000; // HDMI/SDI. uint32_t current_audio_input = 0x00000000; // Embedded. + PixelFormat current_pixel_format = PixelFormat_8BitYCbCr; bool disconnected = false; };