140 const int frame_dimensions[2],
143 result[0] =
normalized[0] * frame_dimensions[0] - 0.5f;
144 result[1] =
normalized[1] * frame_dimensions[1] - 0.5f;
148 const float origin[2],
149 const int frame_dimensions[2],
152 result[0] = (
normalized[0] + origin[0]) * frame_dimensions[0] - 0.5f;
153 result[1] = (
normalized[1] + origin[1]) * frame_dimensions[1] - 0.5f;
157 const int frame_dimensions[2],
160 result[0] = (frame_coord[0] + 0.5f) / frame_dimensions[0];
161 result[1] = (frame_coord[1] + 0.5f) / frame_dimensions[1];
165 const float origin[2],
166 const int frame_dimensions[2],
169 result[0] = (frame_coord[0] - origin[0]) / frame_dimensions[0];
170 result[1] = (frame_coord[1] - origin[1]) / frame_dimensions[1];
182 const int track_index,
183 const int frame_width,
184 const int frame_height,
185 const bool backwards)
189 const int frame_dimensions[2] = {frame_width, frame_height};
190 libmv_marker.
clip = clip;
191 libmv_marker.frame = marker.
framenr;
192 libmv_marker.track = track_index;
195 for (
int i = 0; i < 4; i++) {
201 marker.
search_min, marker.
pos, frame_dimensions, libmv_marker.search_region_min);
204 marker.
search_max, marker.
pos, frame_dimensions, libmv_marker.search_region_max);
209 libmv_marker.weight = 1.0f;
219 libmv_marker.model_id = 0;
222 libmv_marker.reference_clip = clip;
226 &track, marker.
framenr, backwards);
227 libmv_marker.reference_frame = keyframe_marker->
framenr;
230 libmv_marker.reference_frame = backwards ? marker.
framenr - 1 : marker.
framenr;
233 libmv_marker.disabled_channels =
242 const int frame_width,
243 const int frame_height)
247 const int frame_dimensions[2] = {frame_width, frame_height};
251 for (
int i = 0; i < 4; i++) {
253 libmv_marker.
patch[i], libmv_marker.
center, frame_dimensions, marker.pattern_corners[i]);
267 marker.flag &= ~MARKER_TRACKED;
284 const int frame_width,
285 const int frame_height)
287 float patch_min[2], patch_max[2];
288 float margin_left, margin_top, margin_right, margin_bottom;
296 margin_left =
max_ff(libmv_marker.
center[0] - patch_min[0], margin);
297 margin_top =
max_ff(patch_max[1] - libmv_marker.
center[1], margin);
298 margin_right =
max_ff(patch_max[0] - libmv_marker.
center[0], margin);
299 margin_bottom =
max_ff(libmv_marker.
center[1] - patch_min[1], margin);
301 if (libmv_marker.
center[0] < margin_left ||
302 libmv_marker.
center[0] > frame_width - margin_right ||
303 libmv_marker.
center[1] < margin_bottom || libmv_marker.
center[1] > frame_height - margin_top)
333 clip, context->start_scene_frame);
347 context->num_clips = 1;
349 context->autotrack_clips[0].clip = clip;
351 clip, user, &context->autotrack_clips[0].width, &context->autotrack_clips[0].height);
363 const AutoTrackClip *autotrack_clip = &context->autotrack_clips[clip_index];
368 if (num_clip_tracks == 0) {
374 (context->num_all_tracks + num_clip_tracks) *
sizeof(
AutoTrackTrack)));
377 AutoTrackTrack *autotrack_track = &context->all_autotrack_tracks[context->num_all_tracks++];
379 autotrack_track->
track = track;
394 for (
int clip_index = 0; clip_index < context->num_clips; ++clip_index) {
410 for (
int i = 0; i < context->num_clips; ++i) {
411 clips[i] = context->autotrack_clips[i].clip;
414 MovieTrackingTrack **tracks = MEM_cnew_array<MovieTrackingTrack *>(context->num_all_tracks,
415 "image accessor init tracks");
416 for (
int i = 0; i < context->num_all_tracks; ++i) {
417 tracks[i] = context->all_autotrack_tracks[i].track;
428 size_t num_usable_markers = 0;
429 for (
int track_index = 0; track_index < context->num_all_tracks; ++track_index) {
431 for (
int marker_index = 0; marker_index < track->
markersnr; ++marker_index) {
436 num_usable_markers++;
439 return num_usable_markers;
444 int num_trackable_markers = 0;
445 for (
int track_index = 0; track_index < context->num_all_tracks; ++track_index) {
446 const AutoTrackTrack *autotrack_track = &context->all_autotrack_tracks[track_index];
450 num_trackable_markers++;
452 return num_trackable_markers;
465 if (num_trackable_markers == 0) {
470 libmv_Marker *libmv_markers = MEM_cnew_array<libmv_Marker>(num_trackable_markers,
471 "libmv markers array");
474 int num_filled_libmv_markers = 0;
475 for (
int track_index = 0; track_index < context->num_all_tracks; ++track_index) {
476 const AutoTrackTrack *autotrack_track = &context->all_autotrack_tracks[track_index];
478 for (
int marker_index = 0; marker_index < track.
markersnr; ++marker_index) {
489 autotrack_clip->
width,
491 context->is_backwards);
506 if (context->num_autotrack_markers == 0) {
511 context->autotrack_markers = MEM_cnew_array<AutoTrackMarker>(context->num_autotrack_markers,
512 "auto track options");
515 int autotrack_marker_index = 0;
516 for (
int track_index = 0; track_index < context->num_all_tracks; ++track_index) {
517 const AutoTrackTrack *autotrack_track = &context->all_autotrack_tracks[track_index];
525 clip, context->start_scene_frame);
530 AutoTrackMarker *autotrack_marker = &context->autotrack_markers[autotrack_marker_index++];
535 autotrack_clip->
width,
537 context->is_backwards);
543 const bool is_backwards)
545 AutoTrackContext *context = MEM_cnew<AutoTrackContext>(
"autotrack context");
547 context->start_scene_frame = user->
framenr;
548 context->is_backwards = is_backwards;
549 context->synchronized_scene_frame = context->start_scene_frame;
575 context->referenced_image_buffers = MEM_cnew_array<ImBuf *>(context->num_autotrack_markers,
578 context->num_referenced_image_buffers = 0;
580 for (
int i = 0; i < context->num_autotrack_markers; ++i) {
581 const AutoTrackMarker *autotrack_marker = &context->autotrack_markers[i];
585 const AutoTrackClip *autotrack_clip = &context->autotrack_clips[clip_index];
586 const AutoTrackTrack *autotrack_track = &context->all_autotrack_tracks[track_index];
606 context->referenced_image_buffers[context->num_referenced_image_buffers++] = ibuf;
628 const int marker_index,
634 const AutoTrackMarker &autotrack_marker = context->autotrack_markers[marker_index];
637 const int frame_delta = context->is_backwards ? -1 : 1;
638 const int clip_index = libmv_current_marker.
clip;
639 const int track_index = libmv_current_marker.
track;
641 const AutoTrackClip &autotrack_clip = context->autotrack_clips[clip_index];
642 const AutoTrackTrack &autotrack_track = context->all_autotrack_tracks[track_index];
647 libmv_current_marker, track.
margin, autotrack_clip.
width, autotrack_clip.
height))
652 const int new_marker_frame = libmv_current_marker.
frame + frame_delta;
667 &libmv_reference_marker);
672 libmv_reference_marker = libmv_current_marker;
684 if (!autotrack_result->
success) {
693 void *__restrict chunk_join,
694 void *__restrict chunk)
708 if (context->num_autotrack_markers == 0) {
717 settings.use_threading = (context->num_autotrack_markers > 1);
718 settings.userdata_chunk = &tls;
727 context->num_autotrack_markers = 0;
729 if (!autotrack_result->success) {
738 context->autotrack_markers[context->num_autotrack_markers++].libmv_marker =
739 autotrack_result->libmv_marker;
761 const int frame_delta = context->is_backwards ? -1 : 1;
764 ListBase results_to_sync = context->results_to_sync;
769 const libmv_Marker &libmv_marker = autotrack_result->libmv_marker;
770 const int clip_index = libmv_marker.
clip;
771 const int track_index = libmv_marker.
track;
772 const AutoTrackClip &autotrack_clip = context->autotrack_clips[clip_index];
774 const AutoTrackTrack &autotrack_track = context->all_autotrack_tracks[track_index];
778 clip, context->start_scene_frame);
779 const int first_result_frame = start_clip_frame + frame_delta;
783 autotrack_result->libmv_marker, autotrack_clip.
width, autotrack_clip.
height);
784 if (!autotrack_result->success) {
794 if (marker.
framenr == first_result_frame) {
796 track, marker.
framenr - frame_delta);
804 if (context->is_backwards) {
805 context->synchronized_scene_frame =
min_ii(context->synchronized_scene_frame,
809 context->synchronized_scene_frame =
max_ii(context->synchronized_scene_frame,
816 for (
int clip_index = 0; clip_index < context->num_clips; clip_index++) {
817 MovieTracking *tracking = &context->autotrack_clips[clip_index].clip->tracking;
827 user->
framenr = context->synchronized_scene_frame;
838 for (
int clip_index = 0; clip_index < context->num_clips; clip_index++) {
839 const AutoTrackClip *autotrack_clip = &context->autotrack_clips[clip_index];
843 clip, context->start_scene_frame);
849 for (
int track_index = 0; track_index < context->num_all_tracks; track_index++) {
850 const AutoTrackTrack *autotrack_track = &context->all_autotrack_tracks[track_index];
866 for (
int i = 0; i < context->num_referenced_image_buffers; ++i) {
867 ImBuf *ibuf = context->referenced_image_buffers[i];
875 MEM_freeN(context->referenced_image_buffers);
880 if (context->autotrack !=
nullptr) {
884 if (context->image_accessor !=
nullptr) {
float BKE_movieclip_remap_scene_to_clip_frame(const struct MovieClip *clip, float framenr)
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)
#define TRACK_SELECTED(track)
struct MovieTrackingMarker * BKE_tracking_marker_get(struct MovieTrackingTrack *track, int framenr)
struct MovieTrackingObject * BKE_tracking_object_get_active(const struct MovieTracking *tracking)
void BKE_tracking_dopesheet_tag_update(struct MovieTracking *tracking)
struct MovieTrackingMarker * BKE_tracking_marker_get_exact(struct MovieTrackingTrack *track, int framenr)
void BKE_tracking_track_plane_from_existing_motion(struct MovieTrackingPlaneTrack *plane_track, int start_frame)
bool BKE_tracking_plane_track_has_point_track(struct MovieTrackingPlaneTrack *plane_track, struct MovieTrackingTrack *track)
struct MovieTrackingMarker * BKE_tracking_marker_insert(struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void void void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src) ATTR_NONNULL(1
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE float max_ff(float a, float b)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
void minmax_v2v2_v2(float min[2], float max[2], const float vec[2])
void BLI_task_parallel_range(int start, int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
pthread_spinlock_t SpinLock
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 INIT_MINMAX2(min, max)
@ MCLIP_PROXY_RENDER_SIZE_FULL
Object is a sort of wrapper for general info.
@ TRACK_MATCH_PREVIOUS_FRAME
Contains defines and structs used throughout the imbuf module.
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
SIMD_FORCE_INLINE btVector3 normalized() const
Return a normalized version of this vector.
void IMB_freeImBuf(ImBuf *)
void libmv_autoTrackSetMarkers(libmv_AutoTrack *libmv_autotrack, const libmv_Marker *libmv_marker, size_t num_markers)
libmv_AutoTrack * libmv_autoTrackNew(libmv_FrameAccessor *frame_accessor)
int libmv_autoTrackMarker(libmv_AutoTrack *libmv_autotrack, const libmv_TrackRegionOptions *libmv_options, libmv_Marker *libmv_tracked_marker, libmv_TrackRegionResult *libmv_result)
void libmv_autoTrackDestroy(libmv_AutoTrack *libmv_autotrack)
int libmv_autoTrackGetMarker(libmv_AutoTrack *libmv_autotrack, int clip, int frame, int track, libmv_Marker *libmv_marker)
void libmv_autoTrackAddMarker(libmv_AutoTrack *libmv_autotrack, const libmv_Marker *libmv_marker)
struct libmv_AutoTrack libmv_AutoTrack
void MEM_freeN(void *vmemh)
int num_autotrack_markers
AutoTrackMarker * autotrack_markers
TrackingImageAccessor * image_accessor
AutoTrackTrack * all_autotrack_tracks
int synchronized_scene_frame
libmv_AutoTrack * autotrack
ImBuf ** referenced_image_buffers
int num_referenced_image_buffers
AutoTrackClip autotrack_clips[MAX_ACCESSOR_CLIP]
libmv_Marker libmv_marker
libmv_TrackRegionOptions track_region_options
MovieTrackingTrack * track
libmv_TrackRegionResult libmv_result
AutoTrackTrackingResult * prev
AutoTrackTrackingResult * next
libmv_Marker libmv_marker
float pattern_corners[4][2]
MovieTrackingMarker * markers
float search_region_max[2]
float search_region_min[2]
libmv_MarkerSource source
bool BKE_autotrack_context_step(AutoTrackContext *context)
static void release_keyframed_image_buffers(AutoTrackContext *context)
void BKE_autotrack_context_start(AutoTrackContext *context)
static void autotrack_context_step_cb(void *__restrict userdata, const int marker_index, const TaskParallelTLS *__restrict tls)
static bool tracking_check_marker_margin(const libmv_Marker &libmv_marker, const int margin, const int frame_width, const int frame_height)
static int autotrack_count_trackable_markers(AutoTrackContext *context)
void BKE_autotrack_context_sync(AutoTrackContext *context)
static void libmv_frame_to_normalized_relative(const float frame_coord[2], const float origin[2], const int frame_dimensions[2], float result[2])
static MovieTrackingMarker libmv_marker_to_dna_marker(const libmv_Marker &libmv_marker, const int frame_width, const int frame_height)
static void normalized_relative_to_libmv_frame(const float normalized[2], const float origin[2], const int frame_dimensions[2], float result[2])
AutoTrackContext * BKE_autotrack_context_new(MovieClip *clip, MovieClipUser *user, const bool is_backwards)
static void normalized_to_libmv_frame(const float normalized[2], const int frame_dimensions[2], float result[2])
static void autotrack_context_init_image_accessor(AutoTrackContext *context)
static void autotrack_context_init_markers(AutoTrackContext *context)
void BKE_autotrack_context_free(AutoTrackContext *context)
static bool autotrack_is_track_trackable(const AutoTrackContext *context, const AutoTrackTrack *autotrack_track)
static void autotrack_context_init_tracks_for_clip(AutoTrackContext *context, int clip_index)
static bool autotrack_is_marker_usable(const MovieTrackingMarker &marker)
static libmv_Marker dna_marker_to_libmv_marker(MovieTrackingTrack &track, const MovieTrackingMarker &marker, const int clip, const int track_index, const int frame_width, const int frame_height, const bool backwards)
void BKE_autotrack_context_finish(AutoTrackContext *context)
static size_t autotrack_count_all_usable_markers(AutoTrackContext *context)
static void autotrack_context_reduce(const void *__restrict, void *__restrict chunk_join, void *__restrict chunk)
static void autotrack_context_init_autotrack(AutoTrackContext *context)
void BKE_autotrack_context_sync_user(AutoTrackContext *context, MovieClipUser *user)
static void autotrack_context_init_clips(AutoTrackContext *context, MovieClip *clip, MovieClipUser *user)
static void reference_keyframed_image_buffers(AutoTrackContext *context)
static void libmv_frame_to_normalized(const float frame_coord[2], const int frame_dimensions[2], float result[2])
static void autotrack_context_init_tracks(AutoTrackContext *context)
#define MAX_ACCESSOR_CLIP
void tracking_configure_tracker(const MovieTrackingTrack *track, float *mask, const bool is_backwards, libmv_TrackRegionOptions *options)
void tracking_marker_insert_disabled(MovieTrackingTrack *track, const MovieTrackingMarker *ref_marker, bool before, bool overwrite)
TrackingImageAccessor * tracking_image_accessor_new(MovieClip *clips[MAX_ACCESSOR_CLIP], int num_clips, MovieTrackingTrack **tracks, int num_tracks)
void tracking_image_accessor_destroy(TrackingImageAccessor *accessor)
MovieTrackingMarker * tracking_get_keyframed_marker(MovieTrackingTrack *track, int current_frame, bool backwards)
@ LIBMV_MARKER_SOURCE_TRACKED
@ LIBMV_MARKER_SOURCE_MANUAL
@ LIBMV_MARKER_STATUS_UNKNOWN
@ LIBMV_MARKER_MODEL_TYPE_POINT