tornavis/source/blender/blenkernel/tracking_private.h

188 lines
7.0 KiB
C

/* SPDX-FileCopyrightText: 2011 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup bke
*
* This file contains declarations of function which are used
* by multiple tracking files but which should not be public.
*/
#pragma once
#include "BLI_threads.h"
#ifdef __cplusplus
extern "C" {
#endif
struct GHash;
struct MovieTracking;
struct MovieTrackingMarker;
struct libmv_CameraIntrinsicsOptions;
/*********************** Tracks map *************************/
typedef struct TracksMap {
char object_name[MAX_NAME];
int num_tracks;
MovieTrackingTrack *tracks;
struct GHash *hash;
int ptr;
/* Spin lock is used to sync context during tracking. */
SpinLock spin_lock;
} TracksMap;
struct TracksMap *tracks_map_new(const char *object_name, int num_tracks);
int tracks_map_get_size(struct TracksMap *map);
void tracks_map_insert(struct TracksMap *map, struct MovieTrackingTrack *track);
void tracks_map_free(struct TracksMap *map);
void tracks_map_merge(struct TracksMap *map, struct MovieTracking *tracking);
/*********************** Space transformation functions *************************/
void tracking_get_search_origin_frame_pixel(int frame_width,
int frame_height,
const struct MovieTrackingMarker *marker,
float frame_pixel[2]);
/**
* Each marker has 5 coordinates associated with it that get warped with
* tracking: the four corners ("pattern_corners"), and the center ("pos").
* This function puts those 5 points into the appropriate frame for tracking
* (the "search" coordinate frame).
*/
void tracking_get_marker_coords_for_tracking(int frame_width,
int frame_height,
const struct MovieTrackingMarker *marker,
double search_pixel_x[5],
double search_pixel_y[5]);
/**
* Inverse of #tracking_get_marker_coords_for_tracking.
*/
void tracking_set_marker_coords_from_tracking(int frame_width,
int frame_height,
struct MovieTrackingMarker *marker,
const double search_pixel_x[5],
const double search_pixel_y[5]);
/**
* Convert the lens principal point (optical center) between normalized and pixel spaces.
*
* The normalized space stores principal point relative to the frame center which has normalized
* principal coordinate of (0, 0). The right top corner of the frame corresponds to a normalized
* principal coordinate of (1, 1), and the left bottom corner corresponds to coordinate of
* (-1, -1).
*
* The pixel space is measured in pixels, with the reference being the left bottom corner of
* the frame.
*/
void tracking_principal_point_normalized_to_pixel(const float principal_point_normalized[2],
int frame_width,
int frame_height,
float r_principal_point_pixel[2]);
void tracking_principal_point_pixel_to_normalized(const float principal_point_pixel[2],
int frame_width,
int frame_height,
float r_principal_point_normalized[2]);
/*********************** General purpose utility functions *************************/
/**
* Place a disabled marker before or after specified ref_marker.
*
* If before is truth, disabled marker is placed before reference
* one, and it's placed after it otherwise.
*
* If there's already a marker at the frame where disabled one is expected to be placed,
* nothing will happen if overwrite is false.
*/
void tracking_marker_insert_disabled(struct MovieTrackingTrack *track,
const struct MovieTrackingMarker *ref_marker,
bool before,
bool overwrite);
/**
* Fill in Libmv C-API camera intrinsics options from tracking structure.
*/
void tracking_cameraIntrinscisOptionsFromTracking(
struct MovieTracking *tracking,
int calibration_width,
int calibration_height,
struct libmv_CameraIntrinsicsOptions *camera_intrinsics_options);
void tracking_trackingCameraFromIntrinscisOptions(
struct MovieTracking *tracking,
const struct libmv_CameraIntrinsicsOptions *camera_intrinsics_options);
struct libmv_TrackRegionOptions;
/**
* Fill in libmv tracker options structure with settings need to be used to perform track.
*/
void tracking_configure_tracker(const MovieTrackingTrack *track,
float *mask,
bool is_backwards,
struct libmv_TrackRegionOptions *options);
/**
* Get previous keyframed marker.
*/
struct MovieTrackingMarker *tracking_get_keyframed_marker(struct MovieTrackingTrack *track,
int current_frame,
bool backwards);
/*********************** Masking *************************/
/**
* Region is in pixel space, relative to marker's center.
*/
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);
/*********************** Frame Accessor *************************/
struct libmv_FrameAccessor;
#define MAX_ACCESSOR_CLIP 64
typedef struct TrackingImageAccessor {
struct MovieClip *clips[MAX_ACCESSOR_CLIP];
int num_clips;
/* Array of tracks which are being tracked.
* Points to actual track from the `MovieClip` (or multiple of them).
* This accessor owns the array, but not the tracks themselves. */
struct MovieTrackingTrack **tracks;
int num_tracks;
struct libmv_FrameAccessor *libmv_accessor;
SpinLock cache_lock;
} TrackingImageAccessor;
/**
* Clips are used to access images of an actual footage.
* Tracks are used to access masks associated with the tracks.
*
* \note Both clips and tracks arrays are copied into the image accessor. It means that the caller
* is allowed to pass temporary arrays which are only valid during initialization.
*/
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);
#ifdef __cplusplus
}
#endif