The open source OpenXR runtime

a/util + xrt: Add BC4 image support

Part-of: <https://gitlab.freedesktop.org/monado/monado/-/merge_requests/2457>

authored by

Beyley Cardellio and committed by
Marge Bot
aadd2eb8 a56078e7

+51 -2
+1
src/xrt/auxiliary/util/CMakeLists.txt
··· 117 117 aux_util 118 118 PUBLIC 119 119 xrt-external-nanopb 120 + xrt-external-bcdec 120 121 aux-includes 121 122 aux_generated_bindings 122 123 aux_os
+10 -2
src/xrt/auxiliary/util/u_format.c
··· 29 29 case XRT_FORMAT_YUYV422: return "XRT_FORMAT_YUYV422"; 30 30 case XRT_FORMAT_UYVY422: return "XRT_FORMAT_UYVY422"; 31 31 case XRT_FORMAT_MJPEG: return "XRT_FORMAT_MJPEG"; 32 + case XRT_FORMAT_BC4: return "XRT_FORMAT_BC4"; 32 33 default: assert(!"unsupported format"); return 0; 33 34 } 34 35 } ··· 49 50 case XRT_FORMAT_YUV888: 50 51 case XRT_FORMAT_YUYV422: 51 52 case XRT_FORMAT_UYVY422: 53 + case XRT_FORMAT_BC4: 52 54 // Yes 53 55 return true; 54 56 case XRT_FORMAT_MJPEG: ··· 80 82 case XRT_FORMAT_BITMAP_8X1: 81 83 // Eight pixels per block. 82 84 return 8; // NOLINT 85 + case XRT_FORMAT_BC4: 86 + // four pixels wide 87 + return 4; 83 88 default: assert(!"unsupported format"); return 0; 84 89 } 85 90 } ··· 104 109 case XRT_FORMAT_BITMAP_8X8: 105 110 // Eight pixels high. 106 111 return 8; 112 + case XRT_FORMAT_BC4: 113 + // four pixels high 114 + return 4; 107 115 default: assert(!"unsupported format"); return 0; 108 116 } 109 117 } ··· 131 139 case XRT_FORMAT_UYVY422: // Four bytes per two pixels. 132 140 // 32bit pixel formats. 133 141 return 4; 134 - case XRT_FORMAT_BITMAP_8X8: // 64 bits. 135 - return 8; 142 + case XRT_FORMAT_BC4: // 64 bits. 143 + case XRT_FORMAT_BITMAP_8X8: return 8; 136 144 default: assert(!"unsupported format"); return 0; 137 145 } 138 146 }
+38
src/xrt/auxiliary/util/u_sink_converter.c
··· 22 22 #include "jpeglib.h" 23 23 #endif 24 24 25 + #define BCDEC_IMPLEMENTATION 26 + #define BCDEC_BC4BC5_PRECISE 27 + #include "bcdec.h" 25 28 26 29 /* 27 30 * ··· 390 393 } 391 394 #endif 392 395 396 + /* 397 + * 398 + * BC4 399 + * 400 + */ 401 + 402 + static void 403 + from_BC4_to_L8(struct xrt_frame *dst_frame, uint32_t w, uint32_t h, size_t stride, const uint8_t *data) 404 + { 405 + SINK_TRACE_MARKER(); 406 + 407 + assert(w % 4 == 0); 408 + assert(h % 4 == 0); 409 + 410 + const uint8_t *src = data; 411 + for (uint32_t y = 0; y < h; y += 4) { 412 + for (uint32_t x = 0; x < w; x += 4) { 413 + bcdec_bc4(src, dst_frame->data + (y * dst_frame->stride) + x, dst_frame->stride, false); 414 + 415 + src += BCDEC_BC4_BLOCK_SIZE; 416 + } 417 + } 418 + } 393 419 394 420 /* 395 421 * ··· 485 511 struct xrt_frame *converted = NULL; 486 512 487 513 switch (xf->format) { 514 + case XRT_FORMAT_BC4: 515 + if (!create_frame_with_format(xf, XRT_FORMAT_L8, &converted)) { 516 + return; 517 + } 518 + from_BC4_to_L8(converted, xf->width, xf->height, xf->stride, xf->data); 519 + break; 488 520 case XRT_FORMAT_L8: s->downstream->push_frame(s->downstream, xf); return; 489 521 case XRT_FORMAT_YUYV422: 490 522 if (!create_frame_with_format(xf, XRT_FORMAT_L8, &converted)) { ··· 520 552 return; 521 553 } 522 554 from_BAYER_GR8_to_R8G8B8(converted, w, h, xf->stride, xf->data); 555 + break; 556 + case XRT_FORMAT_BC4: 557 + if (!create_frame_with_format(xf, XRT_FORMAT_L8, &converted)) { 558 + return; 559 + } 560 + from_BC4_to_L8(converted, xf->width, xf->height, xf->stride, xf->data); 523 561 break; 524 562 case XRT_FORMAT_YUYV422: 525 563 if (!create_frame_with_format(xf, XRT_FORMAT_R8G8B8, &converted)) {
+2
src/xrt/include/xrt/xrt_defines.h
··· 192 192 XRT_FORMAT_UYVY422, 193 193 194 194 XRT_FORMAT_MJPEG, 195 + 196 + XRT_FORMAT_BC4, 195 197 }; 196 198 197 199 /*!