Blender V5.0
frame_accessor.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2014 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
6#include "intern/image.h"
10#include "libmv/image/image.h"
11
12namespace {
13
16using mv::Region;
17
18struct LibmvFrameAccessor : public FrameAccessor {
19 LibmvFrameAccessor(libmv_FrameAccessorUserData* user_data,
20 libmv_GetImageCallback get_image_callback,
21 libmv_ReleaseImageCallback release_image_callback,
22 libmv_GetMaskForTrackCallback get_mask_for_track_callback,
23 libmv_ReleaseMaskCallback release_mask_callback)
24 : user_data_(user_data),
25 get_image_callback_(get_image_callback),
26 release_image_callback_(release_image_callback),
27 get_mask_for_track_callback_(get_mask_for_track_callback),
28 release_mask_callback_(release_mask_callback) {}
29
30 virtual ~LibmvFrameAccessor() {}
31
32 libmv_InputMode get_libmv_input_mode(InputMode input_mode) {
33 switch (input_mode) {
34#define CHECK_INPUT_MODE(mode) \
35 case mode: return LIBMV_IMAGE_MODE_##mode;
38#undef CHECK_INPUT_MODE
39 }
40 assert(!"unknown input mode passed from Libmv.");
41 // TODO(sergey): Proper error handling here in the future.
43 }
44
45 void get_libmv_region(const Region& region, libmv_Region* libmv_region) {
46 libmv_region->min[0] = region.min(0);
47 libmv_region->min[1] = region.min(1);
48 libmv_region->max[0] = region.max(0);
49 libmv_region->max[1] = region.max(1);
50 }
51
52 Key GetImage(int clip,
53 int frame,
54 InputMode input_mode,
55 int downscale,
56 const Region* region,
57 const Transform* transform,
58 FloatImage* destination) {
59 float* float_buffer;
60 int width, height, channels;
61 libmv_Region libmv_region;
62 if (region) {
63 get_libmv_region(*region, &libmv_region);
64 }
65 Key cache_key = get_image_callback_(user_data_,
66 clip,
67 frame,
68 get_libmv_input_mode(input_mode),
69 downscale,
70 region != NULL ? &libmv_region : NULL,
72 &float_buffer,
73 &width,
74 &height,
75 &channels);
76
77 // TODO(sergey): Dumb code for until we can set data directly.
78 FloatImage temp_image(float_buffer, height, width, channels);
79 destination->CopyFrom(temp_image);
80
81 return cache_key;
82 }
83
84 void ReleaseImage(Key cache_key) { release_image_callback_(cache_key); }
85
86 Key GetMaskForTrack(int clip,
87 int frame,
88 int track,
89 const Region* region,
90 FloatImage* destination) {
91 float* float_buffer;
92 int width, height;
93 libmv_Region libmv_region;
94 if (region) {
95 get_libmv_region(*region, &libmv_region);
96 }
97 Key cache_key =
98 get_mask_for_track_callback_(user_data_,
99 clip,
100 frame,
101 track,
102 region != NULL ? &libmv_region : NULL,
103 &float_buffer,
104 &width,
105 &height);
106
107 if (cache_key == NULL) {
108 // No mask for the given track.
109 return NULL;
110 }
111
112 // TODO(sergey): Dumb code for until we can set data directly.
113 FloatImage temp_image(float_buffer, height, width, 1);
114 destination->CopyFrom(temp_image);
115
116 return cache_key;
117 }
118
119 void ReleaseMask(Key key) { release_mask_callback_(key); }
120
121 bool GetClipDimensions(int /*clip*/, int* /*width*/, int* /*height*/) {
122 return false;
123 }
124
125 int NumClips() { return 1; }
126
127 int NumFrames(int /*clip*/) { return 0; }
128
129 libmv_FrameAccessorUserData* user_data_;
130 libmv_GetImageCallback get_image_callback_;
131 libmv_ReleaseImageCallback release_image_callback_;
132 libmv_GetMaskForTrackCallback get_mask_for_track_callback_;
133 libmv_ReleaseMaskCallback release_mask_callback_;
134};
135
136} // namespace
137
140 libmv_GetImageCallback get_image_callback,
141 libmv_ReleaseImageCallback release_image_callback,
142 libmv_GetMaskForTrackCallback get_mask_for_track_callback,
143 libmv_ReleaseMaskCallback release_mask_callback) {
144 return (libmv_FrameAccessor*)LIBMV_OBJECT_NEW(LibmvFrameAccessor,
145 user_data,
146 get_image_callback,
147 release_image_callback,
148 get_mask_for_track_callback,
149 release_mask_callback);
150}
151
153 LIBMV_OBJECT_DELETE(frame_accessor, LibmvFrameAccessor);
154}
155
160
162 const libmv_FloatImage* input_image,
163 libmv_FloatImage* output_image) {
164 const FloatImage input(input_image->buffer,
165 input_image->height,
166 input_image->width,
167 input_image->channels);
168
171
172 int num_pixels = output.Width() * output.Height() * output.Depth();
173 output_image->buffer = new float[num_pixels];
174 memcpy(output_image->buffer, output.Data(), num_pixels * sizeof(float));
175 output_image->width = output.Width();
176 output_image->height = output.Height();
177 output_image->channels = output.Depth();
178}
struct Key Key
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
long long int int64_t
void CopyFrom(const ArrayND< D, N > &other)
Definition array_nd.h:143
Array3Df FloatImage
void libmv_FrameAccessorDestroy(libmv_FrameAccessor *frame_accessor)
#define CHECK_INPUT_MODE(mode)
void libmv_frameAccessorgetTransformRun(const libmv_FrameTransform *transform, const libmv_FloatImage *input_image, libmv_FloatImage *output_image)
int64_t libmv_frameAccessorgetTransformKey(const libmv_FrameTransform *transform)
libmv_FrameAccessor * libmv_FrameAccessorNew(libmv_FrameAccessorUserData *user_data, libmv_GetImageCallback get_image_callback, libmv_ReleaseImageCallback release_image_callback, libmv_GetMaskForTrackCallback get_mask_for_track_callback, libmv_ReleaseMaskCallback release_mask_callback)
#define input
#define assert(assertion)
#define output
struct libmv_FrameTransform libmv_FrameTransform
libmv_CacheKey(* libmv_GetImageCallback)(libmv_FrameAccessorUserData *user_data, int clip, int frame, libmv_InputMode input_mode, int downscale, const libmv_Region *region, const libmv_FrameTransform *transform, float **destination, int *width, int *height, int *channels)
struct libmv_FrameAccessorUserData libmv_FrameAccessorUserData
libmv_CacheKey(* libmv_GetMaskForTrackCallback)(libmv_FrameAccessorUserData *user_data, int clip, int frame, int track, const libmv_Region *region, float **destination, int *width, int *height)
void(* libmv_ReleaseImageCallback)(libmv_CacheKey cache_key)
@ LIBMV_IMAGE_MODE_MONO
void(* libmv_ReleaseMaskCallback)(libmv_CacheKey cache_key)
struct libmv_FrameAccessor libmv_FrameAccessor
struct libmv_Region libmv_Region
Array3Df FloatImage
#define LIBMV_OBJECT_NEW(type,...)
Definition utildefines.h:40
#define LIBMV_OBJECT_DELETE(what, type)
Definition utildefines.h:43