Blender  V2.93
frame_accessor.cc
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2014 Blender Foundation.
17  * All rights reserved.
18  */
19 
20 #include "intern/frame_accessor.h"
21 #include "intern/image.h"
22 #include "intern/utildefines.h"
24 #include "libmv/autotrack/region.h"
25 #include "libmv/image/image.h"
26 
27 namespace {
28 
29 using libmv::FloatImage;
30 using mv::FrameAccessor;
31 using mv::Region;
32 
33 struct LibmvFrameAccessor : public FrameAccessor {
34  LibmvFrameAccessor(libmv_FrameAccessorUserData* user_data,
35  libmv_GetImageCallback get_image_callback,
36  libmv_ReleaseImageCallback release_image_callback,
37  libmv_GetMaskForTrackCallback get_mask_for_track_callback,
38  libmv_ReleaseMaskCallback release_mask_callback)
39  : user_data_(user_data),
40  get_image_callback_(get_image_callback),
41  release_image_callback_(release_image_callback),
42  get_mask_for_track_callback_(get_mask_for_track_callback),
43  release_mask_callback_(release_mask_callback) {}
44 
45  virtual ~LibmvFrameAccessor() {}
46 
47  libmv_InputMode get_libmv_input_mode(InputMode input_mode) {
48  switch (input_mode) {
49 #define CHECK_INPUT_MODE(mode) \
50  case mode: return LIBMV_IMAGE_MODE_##mode;
51  CHECK_INPUT_MODE(MONO)
53 #undef CHECK_INPUT_MODE
54  }
55  assert(!"unknown input mode passed from Libmv.");
56  // TODO(sergey): Proper error handling here in the future.
57  return LIBMV_IMAGE_MODE_MONO;
58  }
59 
60  void get_libmv_region(const Region& region, libmv_Region* libmv_region) {
61  libmv_region->min[0] = region.min(0);
62  libmv_region->min[1] = region.min(1);
63  libmv_region->max[0] = region.max(0);
64  libmv_region->max[1] = region.max(1);
65  }
66 
67  Key GetImage(int clip,
68  int frame,
69  InputMode input_mode,
70  int downscale,
71  const Region* region,
72  const Transform* transform,
73  FloatImage* destination) {
74  float* float_buffer;
75  int width, height, channels;
76  libmv_Region libmv_region;
77  if (region) {
78  get_libmv_region(*region, &libmv_region);
79  }
80  Key cache_key = get_image_callback_(user_data_,
81  clip,
82  frame,
83  get_libmv_input_mode(input_mode),
84  downscale,
85  region != NULL ? &libmv_region : NULL,
87  &float_buffer,
88  &width,
89  &height,
90  &channels);
91 
92  // TODO(sergey): Dumb code for until we can set data directly.
93  FloatImage temp_image(float_buffer, height, width, channels);
94  destination->CopyFrom(temp_image);
95 
96  return cache_key;
97  }
98 
99  void ReleaseImage(Key cache_key) { release_image_callback_(cache_key); }
100 
101  Key GetMaskForTrack(int clip,
102  int frame,
103  int track,
104  const Region* region,
105  FloatImage* destination) {
106  float* float_buffer;
107  int width, height;
108  libmv_Region libmv_region;
109  if (region) {
110  get_libmv_region(*region, &libmv_region);
111  }
112  Key cache_key =
113  get_mask_for_track_callback_(user_data_,
114  clip,
115  frame,
116  track,
117  region != NULL ? &libmv_region : NULL,
118  &float_buffer,
119  &width,
120  &height);
121 
122  if (cache_key == NULL) {
123  // No mask for the given track.
124  return NULL;
125  }
126 
127  // TODO(sergey): Dumb code for until we can set data directly.
128  FloatImage temp_image(float_buffer, height, width, 1);
129  destination->CopyFrom(temp_image);
130 
131  return cache_key;
132  }
133 
134  void ReleaseMask(Key key) { release_mask_callback_(key); }
135 
136  bool GetClipDimensions(int /*clip*/, int* /*width*/, int* /*height*/) {
137  return false;
138  }
139 
140  int NumClips() { return 1; }
141 
142  int NumFrames(int /*clip*/) { return 0; }
143 
144  libmv_FrameAccessorUserData* user_data_;
145  libmv_GetImageCallback get_image_callback_;
146  libmv_ReleaseImageCallback release_image_callback_;
147  libmv_GetMaskForTrackCallback get_mask_for_track_callback_;
148  libmv_ReleaseMaskCallback release_mask_callback_;
149 };
150 
151 } // namespace
152 
155  libmv_GetImageCallback get_image_callback,
156  libmv_ReleaseImageCallback release_image_callback,
157  libmv_GetMaskForTrackCallback get_mask_for_track_callback,
158  libmv_ReleaseMaskCallback release_mask_callback) {
159  return (libmv_FrameAccessor*)LIBMV_OBJECT_NEW(LibmvFrameAccessor,
160  user_data,
161  get_image_callback,
162  release_image_callback,
163  get_mask_for_track_callback,
164  release_mask_callback);
165 }
166 
168  LIBMV_OBJECT_DELETE(frame_accessor, LibmvFrameAccessor);
169 }
170 
173  return ((FrameAccessor::Transform*)transform)->key();
174 }
175 
177  const libmv_FloatImage* input_image,
178  libmv_FloatImage* output_image) {
179  const FloatImage input(input_image->buffer,
180  input_image->height,
181  input_image->width,
182  input_image->channels);
183 
185  ((FrameAccessor::Transform*)transform)->run(input, &output);
186 
187  int num_pixels = output.Width() * output.Height() * output.Depth();
188  output_image->buffer = new float[num_pixels];
189  memcpy(output_image->buffer, output.Data(), num_pixels * sizeof(float));
190  output_image->width = output.Width();
191  output_image->height = output.Height();
192  output_image->channels = output.Depth();
193 }
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei width
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
Group RGB to Bright Vector Camera Vector Combine Material Light Line Style Layer Add Ambient Diffuse Glossy Refraction Transparent Toon Principled Hair Volume Principled Light Particle Volume Image Sky Noise Wave Voronoi Brick Texture Vector Combine Vertex Separate Vector White RGB Map Separate RGBA
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
#define output
void * user_data
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)
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)
int64_t libmv_frameAccessorgetTransformKey(const libmv_FrameTransform *transform)
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:92
float min[2]
Definition: intern/region.h:28
float max[2]
Definition: intern/region.h:29
CCL_NAMESPACE_BEGIN struct Transform Transform
#define LIBMV_OBJECT_NEW(type,...)
Definition: utildefines.h:42
#define LIBMV_OBJECT_DELETE(what, type)
Definition: utildefines.h:45