149 const int frame_dimensions[2],
157 const float origin[2],
158 const int frame_dimensions[2],
166 const int frame_dimensions[2],
169 result[0] = (frame_coord[0] + 0.5f) / frame_dimensions[0];
170 result[1] = (frame_coord[1] + 0.5f) / frame_dimensions[1];
174 const float origin[2],
175 const int frame_dimensions[2],
178 result[0] = (frame_coord[0] - origin[0]) / frame_dimensions[0];
179 result[1] = (frame_coord[1] - origin[1]) / frame_dimensions[1];
197 const int frame_dimensions[2] = {frame_width, frame_height};
198 libmv_marker->
clip = clip;
200 libmv_marker->
track = track_index;
203 for (
int i = 0; i < 4; i++) {
217 libmv_marker->
weight = 1.0f;
234 track, marker->
framenr, backwards);
252 const int frame_dimensions[2] = {frame_width, frame_height};
256 for (
int i = 0; i < 4; i++) {
293 float patch_min[2], patch_max[2];
294 float margin_left, margin_top, margin_right, margin_bottom;
302 margin_left =
max_ff(libmv_marker->
center[0] - patch_min[0], margin);
303 margin_top =
max_ff(patch_max[1] - libmv_marker->
center[1], margin);
304 margin_right =
max_ff(patch_max[0] - libmv_marker->
center[0], margin);
305 margin_bottom =
max_ff(libmv_marker->
center[1] - patch_min[1], margin);
307 if (libmv_marker->
center[0] < margin_left ||
308 libmv_marker->
center[0] > frame_width - margin_right ||
309 libmv_marker->
center[1] < margin_bottom ||
310 libmv_marker->
center[1] > frame_height - margin_top) {
339 clip,
context->start_scene_frame);
355 context->autotrack_clips[0].clip = clip;
357 clip, user, &
context->autotrack_clips[0].width, &
context->autotrack_clips[0].height);
375 if (num_clip_tracks == 0) {
380 (
context->num_all_tracks + num_clip_tracks) *
386 autotrack_track->
track = track;
401 for (
int clip_index = 0; clip_index <
context->num_clips; ++clip_index) {
417 for (
int i = 0; i <
context->num_clips; ++i) {
418 clips[i] =
context->autotrack_clips[i].clip;
423 for (
int i = 0; i <
context->num_all_tracks; ++i) {
435 size_t num_usable_markers = 0;
436 for (
int track_index = 0; track_index <
context->num_all_tracks; ++track_index) {
438 for (
int marker_index = 0; marker_index < track->
markersnr; ++marker_index) {
443 num_usable_markers++;
446 return num_usable_markers;
451 int num_trackable_markers = 0;
452 for (
int track_index = 0; track_index <
context->num_all_tracks; ++track_index) {
457 num_trackable_markers++;
459 return num_trackable_markers;
472 if (num_trackable_markers == 0) {
478 sizeof(
libmv_Marker), num_trackable_markers,
"libmv markers array");
481 int num_filled_libmv_markers = 0;
482 for (
int track_index = 0; track_index <
context->num_all_tracks; ++track_index) {
485 for (
int marker_index = 0; marker_index < track->
markersnr; ++marker_index) {
495 autotrack_clip->
width,
498 &libmv_markers[num_filled_libmv_markers++]);
513 if (
context->num_autotrack_markers == 0) {
522 int autotrack_marker_index = 0;
523 for (
int track_index = 0; track_index <
context->num_all_tracks; ++track_index) {
532 clip,
context->start_scene_frame);
542 autotrack_clip->
width,
551 const bool is_backwards)
556 context->is_backwards = is_backwards;
583 const int marker_index,
590 const libmv_Marker *libmv_current_marker = &autotrack_marker->libmv_marker;
592 const int frame_delta =
context->is_backwards ? -1 : 1;
593 const int clip_index = libmv_current_marker->clip;
594 const int track_index = libmv_current_marker->track;
602 libmv_current_marker, track->margin, autotrack_clip->width, autotrack_clip->height)) {
606 const int new_marker_frame = libmv_current_marker->frame + frame_delta;
621 &libmv_reference_marker);
626 libmv_reference_marker = *libmv_current_marker;
631 &autotrack_track->track_region_options,
638 if (!autotrack_result->
success) {
647 void *__restrict chunk_join,
648 void *__restrict chunk)
662 if (
context->num_autotrack_markers == 0) {
681 context->num_autotrack_markers = 0;
683 if (!autotrack_result->success) {
692 context->autotrack_markers[
context->num_autotrack_markers++].libmv_marker =
693 autotrack_result->libmv_marker;
715 const int frame_delta =
context->is_backwards ? -1 : 1;
723 const libmv_Marker *libmv_marker = &autotrack_result->libmv_marker;
724 const int clip_index = libmv_marker->
clip;
725 const int track_index = libmv_marker->
track;
732 clip,
context->start_scene_frame);
733 const int first_result_frame = start_clip_frame + frame_delta;
738 &autotrack_result->libmv_marker, autotrack_clip->
width, autotrack_clip->
height, &marker);
739 if (!autotrack_result->success) {
749 if (marker.
framenr == first_result_frame) {
751 track, marker.
framenr - frame_delta);
771 for (
int clip_index = 0; clip_index <
context->num_clips; clip_index++) {
792 for (
int clip_index = 0; clip_index <
context->num_clips; clip_index++) {
797 clip,
context->start_scene_frame);
803 for (
int track_index = 0; track_index <
context->num_all_tracks; track_index++) {
float BKE_movieclip_remap_scene_to_clip_frame(const struct MovieClip *clip, float framenr)
void BKE_movieclip_get_size(struct MovieClip *clip, struct MovieClipUser *user, int *width, int *height)
float BKE_movieclip_remap_clip_to_scene_frame(const struct MovieClip *clip, float framenr)
struct ListBase * BKE_tracking_get_active_tracks(struct MovieTracking *tracking)
struct MovieTrackingMarker * BKE_tracking_marker_insert(struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker)
#define TRACK_SELECTED(track)
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)
struct ListBase * BKE_tracking_get_active_plane_tracks(struct MovieTracking *tracking)
bool BKE_tracking_plane_track_has_point_track(struct MovieTrackingPlaneTrack *plane_track, struct MovieTrackingTrack *track)
struct MovieTrackingMarker * BKE_tracking_marker_get(struct MovieTrackingTrack *track, int framenr)
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(const int start, const 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)
Object is a sort of wrapper for general info.
@ TRACK_MATCH_PREVIOS_FRAME
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
Platform independent time functions.
Provides wrapper around system-specific atomic primitives, and some extensions (faked-atomic operatio...
SIMD_FORCE_INLINE btVector3 normalized() const
Return a normalized version of this vector.
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_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
struct SELECTID_Context context
int num_autotrack_markers
AutoTrackMarker * autotrack_markers
TrackingImageAccessor * image_accessor
AutoTrackTrack * all_autotrack_tracks
int synchronized_scene_frame
struct libmv_AutoTrack * autotrack
AutoTrackClip autotrack_clips[MAX_ACCESSOR_CLIP]
libmv_Marker libmv_marker
libmv_TrackRegionOptions track_region_options
MovieTrackingTrack * track
libmv_TrackRegionResult libmv_result
struct AutoTrackTrackingResult * next
struct AutoTrackTrackingResult * prev
libmv_Marker libmv_marker
struct MovieTracking tracking
float pattern_corners[4][2]
MovieTrackingMarker * markers
TaskParallelReduceFunc func_reduce
size_t userdata_chunk_size
float search_region_max[2]
float search_region_min[2]
libmv_MarkerModelType model_type
libmv_MarkerSource source
libmv_MarkerStatus status
bool BKE_autotrack_context_step(AutoTrackContext *context)
static void autotrack_context_reduce(const void *__restrict UNUSED(userdata), void *__restrict chunk_join, void *__restrict chunk)
static void dna_marker_to_libmv_marker(MovieTrackingTrack *track, const MovieTrackingMarker *marker, int clip, int track_index, int frame_width, int frame_height, bool backwards, libmv_Marker *libmv_marker)
struct AutoTrackTrack AutoTrackTrack
struct AutoTrackClip AutoTrackClip
static void libmv_marker_to_dna_marker(libmv_Marker *libmv_marker, int frame_width, int frame_height, MovieTrackingMarker *marker)
static void autotrack_context_step_cb(void *__restrict userdata, const int marker_index, const TaskParallelTLS *__restrict tls)
static bool autotrack_is_marker_usable(const MovieTrackingMarker *marker)
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])
AutoTrackContext * BKE_autotrack_context_new(MovieClip *clip, MovieClipUser *user, const bool is_backwards)
static void normalized_relative_to_libmv_frame(const float normalized[2], const float origin[2], const int frame_dimensions[2], float result[2])
static void normalized_to_libmv_frame(const float normalized[2], const int frame_dimensions[2], float result[2])
struct AutoTrackContext AutoTrackContext
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)
struct AutoTrackMarker AutoTrackMarker
void BKE_autotrack_context_finish(AutoTrackContext *context)
static size_t autotrack_count_all_usable_markers(AutoTrackContext *context)
static void autotrack_context_init_autotrack(AutoTrackContext *context)
void BKE_autotrack_context_sync_user(AutoTrackContext *context, MovieClipUser *user)
struct AutoTrackTrackingResult AutoTrackTrackingResult
static bool tracking_check_marker_margin(const libmv_Marker *libmv_marker, int margin, int frame_width, int frame_height)
static void autotrack_context_init_clips(AutoTrackContext *context, MovieClip *clip, MovieClipUser *user)
static void libmv_frame_to_normalized(const float frame_coord[2], const int frame_dimensions[2], float result[2])
struct AutoTrackTLS AutoTrackTLS
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)
MovieTrackingMarker * tracking_get_keyframed_marker(MovieTrackingTrack *track, int current_frame, bool backwards)
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)
@ LIBMV_MARKER_SOURCE_TRACKED
@ LIBMV_MARKER_SOURCE_MANUAL
@ LIBMV_MARKER_STATUS_UNKNOWN
@ LIBMV_MARKER_MODEL_TYPE_POINT