mirror of
https://github.com/lbgos/rift-s-linux.git
synced 2026-10-29 04:02:05 +01:00
a/util + xrt: Add BC4 image support
Part-of: <https://gitlab.freedesktop.org/monado/monado/-/merge_requests/2457>
This commit is contained in:
1 parent
a56078e743
commit
aadd2eb875
4 files changed
+51
-2
No files matched your search
@@ -117,6 +117,7 @@ target_link_libraries(
|
||||
aux_util
|
||||
PUBLIC
|
||||
xrt-external-nanopb
|
||||
xrt-external-bcdec
|
||||
aux-includes
|
||||
aux_generated_bindings
|
||||
aux_os
|
||||
|
||||
@@ -29,6 +29,7 @@ u_format_str(enum xrt_format f)
|
||||
case XRT_FORMAT_YUYV422: return "XRT_FORMAT_YUYV422";
|
||||
case XRT_FORMAT_UYVY422: return "XRT_FORMAT_UYVY422";
|
||||
case XRT_FORMAT_MJPEG: return "XRT_FORMAT_MJPEG";
|
||||
case XRT_FORMAT_BC4: return "XRT_FORMAT_BC4";
|
||||
default: assert(!"unsupported format"); return 0;
|
||||
}
|
||||
}
|
||||
@@ -49,6 +50,7 @@ u_format_is_blocks(enum xrt_format f)
|
||||
case XRT_FORMAT_YUV888:
|
||||
case XRT_FORMAT_YUYV422:
|
||||
case XRT_FORMAT_UYVY422:
|
||||
case XRT_FORMAT_BC4:
|
||||
// Yes
|
||||
return true;
|
||||
case XRT_FORMAT_MJPEG:
|
||||
@@ -80,6 +82,9 @@ u_format_block_width(enum xrt_format f)
|
||||
case XRT_FORMAT_BITMAP_8X1:
|
||||
// Eight pixels per block.
|
||||
return 8; // NOLINT
|
||||
case XRT_FORMAT_BC4:
|
||||
// four pixels wide
|
||||
return 4;
|
||||
default: assert(!"unsupported format"); return 0;
|
||||
}
|
||||
}
|
||||
@@ -104,6 +109,9 @@ u_format_block_height(enum xrt_format f)
|
||||
case XRT_FORMAT_BITMAP_8X8:
|
||||
// Eight pixels high.
|
||||
return 8;
|
||||
case XRT_FORMAT_BC4:
|
||||
// four pixels high
|
||||
return 4;
|
||||
default: assert(!"unsupported format"); return 0;
|
||||
}
|
||||
}
|
||||
@@ -131,8 +139,8 @@ u_format_block_size(enum xrt_format f)
|
||||
case XRT_FORMAT_UYVY422: // Four bytes per two pixels.
|
||||
// 32bit pixel formats.
|
||||
return 4;
|
||||
case XRT_FORMAT_BITMAP_8X8: // 64 bits.
|
||||
return 8;
|
||||
case XRT_FORMAT_BC4: // 64 bits.
|
||||
case XRT_FORMAT_BITMAP_8X8: return 8;
|
||||
default: assert(!"unsupported format"); return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,9 @@
|
||||
#include "jpeglib.h"
|
||||
#endif
|
||||
|
||||
#define BCDEC_IMPLEMENTATION
|
||||
#define BCDEC_BC4BC5_PRECISE
|
||||
#include "bcdec.h"
|
||||
|
||||
/*
|
||||
*
|
||||
@@ -390,6 +393,29 @@ from_MJPEG_to_YUV888(struct xrt_frame *dst_frame, size_t size, const uint8_t *da
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
*
|
||||
* BC4
|
||||
*
|
||||
*/
|
||||
|
||||
static void
|
||||
from_BC4_to_L8(struct xrt_frame *dst_frame, uint32_t w, uint32_t h, size_t stride, const uint8_t *data)
|
||||
{
|
||||
SINK_TRACE_MARKER();
|
||||
|
||||
assert(w % 4 == 0);
|
||||
assert(h % 4 == 0);
|
||||
|
||||
const uint8_t *src = data;
|
||||
for (uint32_t y = 0; y < h; y += 4) {
|
||||
for (uint32_t x = 0; x < w; x += 4) {
|
||||
bcdec_bc4(src, dst_frame->data + (y * dst_frame->stride) + x, dst_frame->stride, false);
|
||||
|
||||
src += BCDEC_BC4_BLOCK_SIZE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
@@ -485,6 +511,12 @@ convert_frame_l8(struct xrt_frame_sink *xs, struct xrt_frame *xf)
|
||||
struct xrt_frame *converted = NULL;
|
||||
|
||||
switch (xf->format) {
|
||||
case XRT_FORMAT_BC4:
|
||||
if (!create_frame_with_format(xf, XRT_FORMAT_L8, &converted)) {
|
||||
return;
|
||||
}
|
||||
from_BC4_to_L8(converted, xf->width, xf->height, xf->stride, xf->data);
|
||||
break;
|
||||
case XRT_FORMAT_L8: s->downstream->push_frame(s->downstream, xf); return;
|
||||
case XRT_FORMAT_YUYV422:
|
||||
if (!create_frame_with_format(xf, XRT_FORMAT_L8, &converted)) {
|
||||
@@ -521,6 +553,12 @@ convert_frame_r8g8b8_or_l8(struct xrt_frame_sink *xs, struct xrt_frame *xf)
|
||||
}
|
||||
from_BAYER_GR8_to_R8G8B8(converted, w, h, xf->stride, xf->data);
|
||||
break;
|
||||
case XRT_FORMAT_BC4:
|
||||
if (!create_frame_with_format(xf, XRT_FORMAT_L8, &converted)) {
|
||||
return;
|
||||
}
|
||||
from_BC4_to_L8(converted, xf->width, xf->height, xf->stride, xf->data);
|
||||
break;
|
||||
case XRT_FORMAT_YUYV422:
|
||||
if (!create_frame_with_format(xf, XRT_FORMAT_R8G8B8, &converted)) {
|
||||
return;
|
||||
|
||||
@@ -192,6 +192,8 @@ enum xrt_format
|
||||
XRT_FORMAT_UYVY422,
|
||||
|
||||
XRT_FORMAT_MJPEG,
|
||||
|
||||
XRT_FORMAT_BC4,
|
||||
};
|
||||
|
||||
/*!
|
||||
|
||||
Reference in new issue
Block a user