42# define CACHE_PRINTF(...) printf(__VA_ARGS__)
44# define CACHE_PRINTF(...)
89 ListBase tracks = {
nullptr,
nullptr}, new_tracks = {
nullptr,
nullptr};
93 if (!tracking_object) {
98 old_tracks = &tracking_object->
tracks;
106 bool mapped_to_old =
false;
132 mapped_to_old =
true;
136 if (mapped_to_old ==
false) {
161 track->
next = track->
prev =
nullptr;
169 sizeof(track->
name));
174 *old_tracks = new_tracks;
206 const float unified_coords[2],
207 float pixel_coords[2])
209 pixel_coords[0] = unified_coords[0] * frame_width;
210 pixel_coords[1] = unified_coords[1] * frame_height;
214 const float marker_unified_coords[2],
215 float frame_unified_coords[2])
217 frame_unified_coords[0] = marker_unified_coords[0] + marker->
pos[0];
218 frame_unified_coords[1] = marker_unified_coords[1] + marker->
pos[1];
224 const float marker_unified_coords[2],
225 float frame_pixel_coords[2])
228 unified_to_pixel(frame_width, frame_height, frame_pixel_coords, frame_pixel_coords);
234 float frame_pixel[2])
238 frame_width, frame_height, marker, marker->
search_min, frame_pixel);
239 frame_pixel[0] = int(frame_pixel[0]);
240 frame_pixel[1] = int(frame_pixel[1]);
245 const float pixel_coords[2],
246 float unified_coords[2])
248 unified_coords[0] = pixel_coords[0] / frame_width;
249 unified_coords[1] = pixel_coords[1] / frame_height;
255 const float marker_unified[2],
256 float search_pixel[2])
258 float frame_pixel[2];
259 float search_origin_frame_pixel[2];
262 frame_width, frame_height, marker, marker_unified, frame_pixel);
264 frame_width, frame_height, marker, search_origin_frame_pixel);
265 sub_v2_v2v2(search_pixel, frame_pixel, search_origin_frame_pixel);
271 const float search_pixel[2],
272 float marker_unified[2])
274 float frame_unified[2];
275 float search_origin_frame_pixel[2];
278 frame_width, frame_height, marker, search_origin_frame_pixel);
279 add_v2_v2v2(frame_unified, search_pixel, search_origin_frame_pixel);
289 double search_pixel_x[5],
290 double search_pixel_y[5])
292 float unified_coords[2];
293 float pixel_coords[2];
296 for (
int i = 0;
i < 4;
i++) {
298 frame_width, frame_height, marker, marker->
pattern_corners[
i], pixel_coords);
299 search_pixel_x[
i] = pixel_coords[0] - 0.5f;
300 search_pixel_y[
i] = pixel_coords[1] - 0.5f;
304 unified_coords[0] = 0.0f;
305 unified_coords[1] = 0.0f;
308 search_pixel_x[4] = pixel_coords[0] - 0.5f;
309 search_pixel_y[4] = pixel_coords[1] - 0.5f;
315 const double search_pixel_x[5],
316 const double search_pixel_y[5])
318 float marker_unified[2];
319 float search_pixel[2];
322 for (
int i = 0;
i < 4;
i++) {
323 search_pixel[0] = search_pixel_x[
i] + 0.5;
324 search_pixel[1] = search_pixel_y[
i] + 0.5;
326 frame_width, frame_height, marker, search_pixel, marker->
pattern_corners[
i]);
330 search_pixel[0] = search_pixel_x[4] + 0.5;
331 search_pixel[1] = search_pixel_y[4] + 0.5;
338 for (
int i = 0;
i < 4;
i++) {
343 marker->
pos[0] += marker_unified[0];
344 marker->
pos[1] += marker_unified[1];
348 const int frame_width,
349 const int frame_height,
350 float r_principal_point_pixel[2])
352 const float frame_center_x =
float(frame_width) / 2;
353 const float frame_center_y =
float(frame_height) / 2;
355 r_principal_point_pixel[0] = frame_center_x + principal_point_normalized[0] * frame_center_x;
356 r_principal_point_pixel[1] = frame_center_y + principal_point_normalized[1] * frame_center_y;
360 const int frame_width,
361 const int frame_height,
362 float r_principal_point_normalized[2])
364 const float frame_center_x =
float(frame_width) / 2;
365 const float frame_center_y =
float(frame_height) / 2;
367 r_principal_point_normalized[0] = (principal_point_pixel[0] - frame_center_x) / frame_center_x;
368 r_principal_point_normalized[1] = (principal_point_pixel[1] - frame_center_y) / frame_center_y;
384 marker_new = *ref_marker;
485 const int calibration_width,
486 const int calibration_height,
492 float principal_px[2];
494 camera->
principal_point, calibration_width, calibration_height, principal_px);
503 camera_intrinsics_options->
image_width = calibration_width;
504 camera_intrinsics_options->
image_height = int(calibration_height * aspy);
535 while (a >= 0 && a < track->markersnr) {
536 int next = backwards ? a + 1 : a - 1;
537 bool is_keyframed =
false;
549 if (next_marker ==
nullptr) {
555 if (marker_keyed_fallback ==
nullptr) {
556 marker_keyed_fallback = cur_marker;
560 if (marker_keyed_fallback ==
nullptr) {
561 marker_keyed_fallback = cur_marker;
569 marker_keyed = cur_marker;
577 if (marker_keyed ==
nullptr) {
578 marker_keyed = marker_keyed_fallback;
601 clip = accessor->
clips[clip_index];
622 const size_t num_pixels = size_t(grayscale->
x) * size_t(grayscale->
y);
625 if (rect_float !=
nullptr) {
628 for (
int i = 0;
i < grayscale->
x * grayscale->
y;
i++) {
631 rect_float[
i] = 0.2126f * pixel[0] + 0.7152f * pixel[1] + 0.0722f * pixel[2];
642 float_image->
width = ibuf->
x;
650 size_t num_total_channels = size_t(ibuf->
x) * size_t(ibuf->
y) * float_image->
channels;
653 if (rect_float !=
nullptr) {
656 memcpy(rect_float, float_image->
buffer, num_total_channels *
sizeof(
float));
670 CACHE_PRINTF(
"Calculate new buffer for frame %d\n", frame);
673 if (orig_ibuf ==
nullptr) {
678 if (region !=
nullptr) {
679 int width = region->
max[0] - region->
min[0], height = region->
max[1] - region->
min[1];
685 int clamped_origin_x =
max_ii(
int(region->
min[0]), 0),
686 clamped_origin_y =
max_ii(
int(region->
min[1]), 0);
687 int dst_offset_x = clamped_origin_x - int(region->
min[0]),
688 dst_offset_y = clamped_origin_y - int(region->
min[1]);
689 int clamped_width = width - dst_offset_x, clamped_height = height - dst_offset_y;
690 clamped_width =
min_ii(clamped_width, orig_ibuf->
x - clamped_origin_x);
691 clamped_height =
min_ii(clamped_height, orig_ibuf->
y - clamped_origin_y);
710 for (
int y = 0;
y < clamped_height;
y++) {
711 for (
int x = 0;
x < clamped_width;
x++) {
712 int src_x =
x + clamped_origin_x, src_y =
y + clamped_origin_y;
713 int dst_x =
x + dst_offset_x, dst_y =
y + dst_offset_y;
714 int dst_index = (dst_y * width + dst_x) * 4,
715 src_index = (src_y * orig_ibuf->
x + src_x) * 4;
732 final_ibuf = orig_ibuf;
736 if (final_ibuf == orig_ibuf) {
740 orig_ibuf->
x / (1 << downscale),
741 orig_ibuf->
y / (1 << downscale),
750 if (final_ibuf != orig_ibuf) {
765 if (final_ibuf != orig_ibuf) {
769 final_ibuf = grayscale_ibuf;
776 if (final_ibuf == orig_ibuf) {
798 BLI_assert(clip_index >= 0 && clip_index < accessor->num_clips);
809 *destination =
nullptr;
829 float **r_destination,
836 BLI_assert(track_index < accessor->num_tracks);
852 int frame_width, frame_height;
856 const float region_min[2] = {
857 region->
min[0] - marker->
pos[0] * frame_width,
858 region->
min[1] - marker->
pos[1] * frame_height,
860 const float region_max[2] = {
861 region->
max[0] - marker->
pos[0] * frame_width,
862 region->
max[1] - marker->
pos[1] * frame_height,
865 frame_width, frame_height, region_min, region_max, track);
866 *r_width = region->
max[0] - region->
min[0];
867 *r_height = region->
max[1] - region->
min[1];
868 return *r_destination;
873 if (cache_key !=
nullptr) {
874 float *
mask = (
float *)cache_key;
void BKE_movieclip_user_set_frame(struct MovieClipUser *user, int framenr)
void BKE_movieclip_get_size(struct MovieClip *clip, const struct MovieClipUser *user, int *r_width, int *r_height)
float BKE_movieclip_remap_clip_to_scene_frame(const struct MovieClip *clip, float framenr)
struct ImBuf * BKE_movieclip_get_ibuf(struct MovieClip *clip, const struct MovieClipUser *user)
struct MovieTrackingTrack * BKE_tracking_track_duplicate(struct MovieTrackingTrack *track)
struct MovieTrackingObject * BKE_tracking_object_get_named(struct MovieTracking *tracking, const char *name)
struct MovieTrackingMarker * BKE_tracking_marker_get(struct MovieTrackingTrack *track, int framenr)
struct MovieTrackingMarker * BKE_tracking_marker_get_exact(struct MovieTrackingTrack *track, int framenr)
void BKE_tracking_track_free(struct MovieTrackingTrack *track)
bool BKE_tracking_track_has_marker_at_frame(struct MovieTrackingTrack *track, int framenr)
struct MovieTrackingObject * BKE_tracking_object_add(struct MovieTracking *tracking, const char *name)
struct MovieTrackingMarker * BKE_tracking_marker_insert(struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker)
#define BLI_assert_msg(a, msg)
bool BLI_ghash_reinsert(GHash *gh, void *key, void *val, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
GHash * BLI_ghash_ptr_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
MINLINE void rgba_uchar_to_float(float r_col[4], const unsigned char col_ub[4])
MINLINE void add_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
char * STRNCPY(char(&dst)[N], const char *src)
void BLI_uniquename(const struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t name_maxncpy) ATTR_NONNULL(1
void BLI_thread_unlock(int type)
void BLI_thread_lock(int type)
void BLI_spin_init(SpinLock *spin)
void BLI_spin_unlock(SpinLock *spin)
void BLI_spin_lock(SpinLock *spin)
void BLI_spin_end(SpinLock *spin)
#define CTX_DATA_(context, msgid)
#define BLT_I18NCONTEXT_ID_MOVIECLIP
@ MCLIP_PROXY_RENDER_SIZE_FULL
@ TRACKING_DISTORTION_MODEL_DIVISION
@ TRACKING_DISTORTION_MODEL_POLYNOMIAL
@ TRACKING_DISTORTION_MODEL_NUKE
@ TRACKING_DISTORTION_MODEL_BROWN
@ TRACK_ALGORITHM_FLAG_USE_MASK
ImBuf * IMB_dupImBuf(const ImBuf *ibuf1)
void IMB_assign_float_buffer(ImBuf *ibuf, float *buffer_data, ImBufOwnership ownership)
void IMB_freeImBuf(ImBuf *ibuf)
ImBuf * IMB_allocImBuf(unsigned int x, unsigned int y, unsigned char planes, unsigned int flags)
void IMB_rectcpy(ImBuf *dbuf, const ImBuf *sbuf, int destx, int desty, int srcx, int srcy, int width, int height)
bool IMB_scale(ImBuf *ibuf, unsigned int newx, unsigned int newy, IMBScaleFilter filter, bool threaded=true)
void IMB_float_from_byte(ImBuf *ibuf)
Read Guarded memory(de)allocation.
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
void libmv_FrameAccessorDestroy(libmv_FrameAccessor *frame_accessor)
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)
@ LIBMV_DISTORTION_MODEL_POLYNOMIAL
@ LIBMV_DISTORTION_MODEL_NUKE
@ LIBMV_DISTORTION_MODEL_BROWN
@ LIBMV_DISTORTION_MODEL_DIVISION
struct libmv_FrameTransform libmv_FrameTransform
struct libmv_FrameAccessorUserData libmv_FrameAccessorUserData
void libmv_floatImageDestroy(libmv_FloatImage *image)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
ImBufFloatBuffer float_buffer
ImBufByteBuffer byte_buffer
float pattern_corners[4][2]
MovieTrackingMarker * markers
struct MovieTrackingTrack * next
struct MovieTrackingTrack * prev
MovieTrackingCamera camera
struct MovieTrackingTrack ** tracks
struct MovieClip * clips[MAX_ACCESSOR_CLIP]
struct libmv_FrameAccessor * libmv_accessor
char object_name[MAX_NAME]
MovieTrackingTrack * tracks
float * tracking_track_get_mask_for_region(const int frame_width, const int frame_height, const float region_min[2], const float region_max[2], const MovieTrackingTrack *track)
#define MAX_ACCESSOR_CLIP
static void accessor_release_image_callback(libmv_CacheKey cache_key)
static libmv_CacheKey accessor_get_image_callback(libmv_FrameAccessorUserData *user_data, int clip_index, int frame, libmv_InputMode input_mode, int downscale, const libmv_Region *region, const libmv_FrameTransform *transform, float **destination, int *width, int *height, int *channels)
static void pixel_to_unified(int frame_width, int frame_height, const float pixel_coords[2], float unified_coords[2])
static void unified_to_pixel(int frame_width, int frame_height, const float unified_coords[2], float pixel_coords[2])
static libmv_CacheKey accessor_get_mask_for_track_callback(libmv_FrameAccessorUserData *user_data, int clip_index, int frame, int track_index, const libmv_Region *region, float **r_destination, int *r_width, int *r_height)
void tracking_marker_insert_disabled(MovieTrackingTrack *track, const MovieTrackingMarker *ref_marker, bool before, bool overwrite)
static void search_pixel_to_marker_unified(int frame_width, int frame_height, const MovieTrackingMarker *marker, const float search_pixel[2], float marker_unified[2])
int tracks_map_get_size(TracksMap *map)
static ImBuf * accessor_get_preprocessed_ibuf(TrackingImageAccessor *accessor, int clip_index, int frame)
void tracking_principal_point_pixel_to_normalized(const float principal_point_pixel[2], const int frame_width, const int frame_height, float r_principal_point_normalized[2])
static void ibuf_to_float_image(const ImBuf *ibuf, libmv_FloatImage *float_image)
static void marker_unified_to_frame_pixel_coordinates(int frame_width, int frame_height, const MovieTrackingMarker *marker, const float marker_unified_coords[2], float frame_pixel_coords[2])
void tracks_map_free(TracksMap *map)
static void marker_unified_to_search_pixel(int frame_width, int frame_height, const MovieTrackingMarker *marker, const float marker_unified[2], float search_pixel[2])
void tracking_cameraIntrinscisOptionsFromTracking(MovieTracking *tracking, const int calibration_width, const int calibration_height, libmv_CameraIntrinsicsOptions *camera_intrinsics_options)
static ImBuf * make_grayscale_ibuf_copy(ImBuf *ibuf)
void tracking_get_marker_coords_for_tracking(int frame_width, int frame_height, const MovieTrackingMarker *marker, double search_pixel_x[5], double search_pixel_y[5])
TrackingImageAccessor * tracking_image_accessor_new(MovieClip *clips[MAX_ACCESSOR_CLIP], int num_clips, MovieTrackingTrack **tracks, int num_tracks)
static void distortion_model_parameters_from_options(const libmv_CameraIntrinsicsOptions *camera_intrinsics_options, MovieTrackingCamera *camera)
static void marker_to_frame_unified(const MovieTrackingMarker *marker, const float marker_unified_coords[2], float frame_unified_coords[2])
void tracks_map_insert(TracksMap *map, MovieTrackingTrack *track)
#define CACHE_PRINTF(...)
static ImBuf * float_image_to_ibuf(libmv_FloatImage *float_image)
void tracking_trackingCameraFromIntrinscisOptions(MovieTracking *tracking, const libmv_CameraIntrinsicsOptions *camera_intrinsics_options)
static void distortion_model_parameters_from_tracking(const MovieTrackingCamera *camera, libmv_CameraIntrinsicsOptions *camera_intrinsics_options)
void tracking_image_accessor_destroy(TrackingImageAccessor *accessor)
TracksMap * tracks_map_new(const char *object_name, int num_tracks)
static ImBuf * accessor_get_ibuf(TrackingImageAccessor *accessor, int clip_index, int frame, libmv_InputMode input_mode, int downscale, const libmv_Region *region, const libmv_FrameTransform *transform)
MovieTrackingMarker * tracking_get_keyframed_marker(MovieTrackingTrack *track, int current_frame, bool backwards)
static void accessor_release_mask_callback(libmv_CacheKey cache_key)
void tracking_set_marker_coords_from_tracking(int frame_width, int frame_height, MovieTrackingMarker *marker, const double search_pixel_x[5], const double search_pixel_y[5])
void tracking_get_search_origin_frame_pixel(int frame_width, int frame_height, const MovieTrackingMarker *marker, float frame_pixel[2])
void tracks_map_merge(TracksMap *map, MovieTracking *tracking)
void tracking_principal_point_normalized_to_pixel(const float principal_point_normalized[2], const int frame_width, const int frame_height, float r_principal_point_pixel[2])