X-Git-Url: https://git.sesse.net/?p=bmusb;a=blobdiff_plain;f=fake_capture.cpp;h=e06ac3a098b4bf3e11b3b4649beae807c9f2a3b0;hp=9740b645e4f67eb12e00063feeaf63f17d821671;hb=HEAD;hpb=838846a92ca196aa8d5c4169d4478d18b9486432 diff --git a/fake_capture.cpp b/fake_capture.cpp index 9740b64..e06ac3a 100644 --- a/fake_capture.cpp +++ b/fake_capture.cpp @@ -21,11 +21,11 @@ #define FRAME_SIZE (8 << 20) // 8 MB. -// Pure-color inputs: Red, green, blue, white. -#define NUM_COLORS 4 -constexpr uint8_t ys[NUM_COLORS] = { 63, 173, 32, 235 }; -constexpr uint8_t cbs[NUM_COLORS] = { 102, 42, 240, 128 }; -constexpr uint8_t crs[NUM_COLORS] = { 240, 26, 118, 128 }; +// Pure-color inputs: Red, green, blue, white, two shades of gray. +#define NUM_COLORS 6 +constexpr uint8_t ys[NUM_COLORS] = { 63, 173, 32, 235, 180, 128 }; +constexpr uint8_t cbs[NUM_COLORS] = { 102, 42, 240, 128, 128, 128 }; +constexpr uint8_t crs[NUM_COLORS] = { 240, 26, 118, 128, 128, 128 }; using namespace std; using namespace std::chrono; @@ -218,6 +218,23 @@ bool timespec_less_than(const timespec &a, const timespec &b) return make_pair(a.tv_sec, a.tv_nsec) < make_pair(b.tv_sec, b.tv_nsec); } +void fill_color_noninterleaved(uint8_t *dst, uint8_t y, uint8_t cb, uint8_t cr, const VideoFormat &video_format, bool ten_bit) +{ + if (ten_bit) { + // Just use the 8-bit-values shifted left by 2. + // It's not 100% correct, but it's close enough. + uint32_t pix[4]; + pix[0] = (cb << 2) | (y << 12) | (cr << 22); + pix[1] = (y << 2) | (cb << 12) | ( y << 22); + pix[2] = (cr << 2) | (y << 12) | (cb << 22); + pix[3] = (y << 2) | (cr << 12) | ( y << 22); + memset16(dst, pix, video_format.stride * video_format.height / sizeof(pix)); + } else { + uint8_t ycbcr[] = { cb, y, cr, y }; + memset4(dst, ycbcr, video_format.width * video_format.height / 2); + } +} + } // namespace void FakeCapture::producer_thread_func() @@ -285,19 +302,10 @@ void FakeCapture::producer_thread_func() memset2(video_frame.data, cbcr, width * height / 2); memset(video_frame.data2, y, width * height); } else { - if (current_pixel_format == PixelFormat_10BitYCbCr) { - // Just use the 8-bit-values shifted left by 2. - // It's not 100% correct, but it's close enough. - uint32_t pix[4]; - pix[0] = (cb << 2) | (y << 12) | (cr << 22); - pix[1] = (y << 2) | (cb << 12) | ( y << 22); - pix[2] = (cr << 2) | (y << 12) | (cb << 22); - pix[3] = (y << 2) | (cr << 12) | ( y << 22); - memset16(video_frame.data, pix, video_format.stride * height / sizeof(pix)); - } else { - uint8_t ycbcr[] = { y, cb, y, cr }; - memset4(video_frame.data, ycbcr, width * height / 2); - } + fill_color_noninterleaved(video_frame.data, y, cb, cr, video_format, current_pixel_format == PixelFormat_10BitYCbCr); + } + if (video_frame.data_copy != nullptr) { + fill_color_noninterleaved(video_frame.data_copy, y, cb, cr, video_format, current_pixel_format == PixelFormat_10BitYCbCr); } video_frame.len = video_format.stride * height; video_frame.received_timestamp = timestamp;