Blender V4.3
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,
71 (libmv_FrameTransform*)transform,
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
157 const libmv_FrameTransform* transform) {
158 return ((FrameAccessor::Transform*)transform)->key();
159}
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
169 FloatImage output;
170 ((FrameAccessor::Transform*)transform)->run(input, &output);
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}
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a producing a negative Combine Generate a color from its and blue channels(Deprecated)") DefNode(ShaderNode
#define output
3D array (row, column, channel).
Definition array_nd.h:332
int Width() const
Definition array_nd.h:346
#define NULL
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)
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
Array3Df FloatImage
__int64 int64_t
Definition stdint.h:89
#define LIBMV_OBJECT_NEW(type,...)
Definition utildefines.h:39
#define LIBMV_OBJECT_DELETE(what, type)
Definition utildefines.h:42