From 67496d18749a27d8ca0ec28ecb52ca23c54f4705 Mon Sep 17 00:00:00 2001 From: Marko Viitanen Date: Thu, 8 Aug 2024 14:49:33 +0300 Subject: [PATCH] [10bit] Fix reading 8bit data when using BIT_DEPTH 10+ and we need to fill the frame --- src/yuv_io.c | 53 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/src/yuv_io.c b/src/yuv_io.c index 1b72deb9..38da9ea6 100644 --- a/src/yuv_io.c +++ b/src/yuv_io.c @@ -53,28 +53,49 @@ static void fill_after_frame(unsigned height, unsigned array_width, } -static int read_and_fill_frame_data(FILE *file, - unsigned width, unsigned height, unsigned bytes_per_sample, - unsigned array_width, uvg_pixel *data) +static int read_and_fill_frame_data( + FILE* file, + unsigned width, + unsigned height, + unsigned bytes_per_sample, + unsigned array_width, + uvg_pixel* data) { - uvg_pixel* p = data; - uvg_pixel* end = data + array_width * height; - uvg_pixel fill_char; - unsigned i; - while (p < end) { - // Read the beginning of the line from input. - if (width != fread(p, bytes_per_sample, width, file)) - return 0; + unsigned i; + if (bytes_per_sample != sizeof(uvg_pixel)) { + uint8_t* p = (uint8_t*)data; + uint8_t* end = (uint8_t*)data + array_width * height; + uint8_t fill_char; + while (p < end) { + // Read the beginning of the line from input. + if (width != fread(p, bytes_per_sample, width, file)) return 0; + // Fill the rest with the last pixel value. + // Fill the rest with the last pixel value. + fill_char = p[width - 1]; - // Fill the rest with the last pixel value. - fill_char = p[width - 1]; + for (i = width; i < array_width; ++i) { + p[i] = fill_char; + } - for (i = width; i < array_width; ++i) { - p[i] = fill_char; + p += array_width; } + } else { + uvg_pixel* p = data; + uvg_pixel* end = data + array_width * height; + uvg_pixel fill_char; + while (p < end) { + // Read the beginning of the line from input. + if (width != fread(p, bytes_per_sample, width, file)) return 0; + // Fill the rest with the last pixel value. + fill_char = p[width - 1]; - p += array_width; + for (i = width; i < array_width; ++i) { + p[i] = fill_char; + } + + p += array_width; + } } return 1; }