The open source OpenXR runtime
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 ¶ms)
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