The open source OpenXR runtime
at prediction-2 116 lines 2.0 kB view raw
1// Copyright 2021, Collabora, Ltd. 2// SPDX-License-Identifier: BSL-1.0 3/*! 4 * @file 5 * @brief Simple @ref xrt_frame wrapper around a cv::Mat. 6 * @author Jakob Bornecrantz <jakob@collabora.com> 7 * @ingroup aux_tracking 8 */ 9 10#include "util/u_format.h" 11 12#include "tracking/t_frame_cv_mat_wrapper.hpp" 13 14 15namespace xrt::auxiliary::tracking { 16 17 18/* 19 * 20 * C functions. 21 * 22 */ 23 24 25/* 26 * 27 * Member functions 28 * 29 */ 30 31void 32FrameMat::fillInFields(cv::Mat mat, xrt_format format, const Params &params) 33{ 34 uint32_t width = (uint32_t)mat.cols; 35 uint32_t height = (uint32_t)mat.rows; 36 size_t stride = mat.step[0]; 37 size_t size = stride * height; 38 39 this->matrix = mat; 40 41 // Main wrapping of cv::Mat by frame. 42 xrt_frame &frame = this->frame; 43 frame.reference.count = 1; 44 frame.destroy = destroyFrame; 45 frame.data = mat.ptr<uint8_t>(); 46 frame.format = format; 47 frame.width = width; 48 frame.height = height; 49 frame.stride = stride; 50 frame.size = size; 51 52 // Params 53 frame.timestamp = params.timestamp_ns; 54 frame.stereo_format = params.stereo_format; 55} 56 57FrameMat::~FrameMat() 58{ 59 // Noop 60} 61 62FrameMat::FrameMat() 63{ 64 // Noop 65} 66 67void 68FrameMat::destroyFrame(xrt_frame *xf) 69{ 70 FrameMat *fm = (FrameMat *)xf; 71 delete fm; 72} 73 74 75/* 76 * 77 * Static functions. 78 * 79 */ 80 81void 82FrameMat::wrapR8G8B8(const cv::Mat &mat, xrt_frame **fm_out, const Params /*&&?*/ params) 83{ 84 assert(mat.channels() == 3); 85 assert(mat.type() == CV_8UC3); 86 87 88 FrameMat *fm = new FrameMat(); 89 fm->fillInFields(mat, XRT_FORMAT_R8G8B8, params); 90 91 // Unreference any old frames. 92 xrt_frame_reference(fm_out, NULL); 93 94 // Already has a ref count of one. 95 *fm_out = &fm->frame; 96} 97 98void 99FrameMat::wrapL8(const cv::Mat &mat, xrt_frame **fm_out, const Params /*&&?*/ params) 100{ 101 assert(mat.channels() == 1); 102 assert(mat.type() == CV_8UC1); 103 104 105 FrameMat *fm = new FrameMat(); 106 fm->fillInFields(mat, XRT_FORMAT_L8, params); 107 108 // Unreference any old frames. 109 xrt_frame_reference(fm_out, NULL); 110 111 // Already has a ref count of one. 112 *fm_out = &fm->frame; 113} 114 115 116} // namespace xrt::auxiliary::tracking