Commit: c458725976b502db0703ba616df1d5392f052ed4
Author: Tianwei Shen
Date:   Wed Jun 8 14:14:13 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rBc458725976b502db0703ba616df1d5392f052ed4

complete new and free multiview reconstruction context, so far so good

===================================================================

M       source/blender/blenkernel/BKE_tracking.h
M       source/blender/blenkernel/intern/tracking_correspondence.c
M       source/blender/editors/space_clip/tracking_ops_correspondence.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_tracking.h 
b/source/blender/blenkernel/BKE_tracking.h
index 7432207..9c7ec2f 100644
--- a/source/blender/blenkernel/BKE_tracking.h
+++ b/source/blender/blenkernel/BKE_tracking.h
@@ -289,7 +289,7 @@ void BKE_tracking_stabilization_data_to_mat4(int width, int 
height, float aspect
 void BKE_tracking_dopesheet_tag_update(struct MovieTracking *tracking);
 void BKE_tracking_dopesheet_update(struct MovieTracking *tracking);
 
-/* Correspondence */
+/* Correspondence and multiview */
 void BKE_tracking_correspondence_unique_name(struct ListBase *tracksbase, 
struct MovieTrackingCorrespondence *corr);
 struct MovieTrackingCorrespondence *BKE_tracking_correspondence_add(struct 
ListBase *corr_base,
                                                                     struct 
MovieTrackingTrack *self_track,
@@ -303,8 +303,11 @@ struct MovieMultiviewReconstructContext 
*BKE_tracking_multiview_reconstruction_c
                                                                                
            struct MovieTrackingObject *object,
                                                                                
            int keyframe1, int keyframe2,
                                                                                
            int width, int height);
+void BKE_tracking_multiview_reconstruction_context_free(struct 
MovieMultiviewReconstructContext *context);
 bool BKE_tracking_multiview_reconstruction_check(struct MovieClip **clips, 
struct MovieTrackingObject *object,
                                                  int clip_num, char 
*error_msg, int error_size);
+bool BKE_tracking_multiview_reconstruction_finish(struct 
MovieMultiviewReconstructContext *context,
+                                                  struct MovieTracking 
*tracking);
 
 #define TRACK_SELECTED(track)               ((track)->flag & SELECT || 
(track)->pat_flag & SELECT || (track)->search_flag & SELECT)
 
diff --git a/source/blender/blenkernel/intern/tracking_correspondence.c 
b/source/blender/blenkernel/intern/tracking_correspondence.c
index 068a93b..7f4a462 100644
--- a/source/blender/blenkernel/intern/tracking_correspondence.c
+++ b/source/blender/blenkernel/intern/tracking_correspondence.c
@@ -57,8 +57,8 @@
 struct ReconstructProgressData;
 
 typedef struct MovieMultiviewReconstructContext {
+       int clip_num;                                                   /* 
number of clips in this reconstruction */
        struct libmv_TracksN **all_tracks;              /* set of tracks from 
all clips (API in autotrack) */
-
        // TODO(tianwei): might be proper to make it 
libmv_multiview_Reconstruction
        struct libmv_ReconstructionN **all_reconstruction;      /* 
reconstruction for each clip (API in autotrack) */
        libmv_CameraIntrinsicsOptions *all_camera_intrinsics_options;   /* 
camera intrinsic of each camera */
@@ -174,6 +174,7 @@ BKE_tracking_multiview_reconstruction_context_new(MovieClip 
**clips,
        context->all_efra = MEM_callocN(num_clips * sizeof(int), "MRC end 
frames");
        context->keyframe1 = keyframe1;
        context->keyframe2 = keyframe2;
+       context->clip_num = num_clips;
 
        for(int i = 0; i < num_clips; i++)
        {
@@ -243,6 +244,27 @@ 
BKE_tracking_multiview_reconstruction_context_new(MovieClip **clips,
        return context;
 }
 
+/* Free memory used by a reconstruction process. */
+void 
BKE_tracking_multiview_reconstruction_context_free(MovieMultiviewReconstructContext
 *context)
+{
+       for(int i = 0; i < context->clip_num; i++)
+       {
+               libmv_tracksDestroy(context->all_tracks[i]);
+               if (context->all_reconstruction[i])
+                       
libmv_reconstructionDestroy(context->all_reconstruction[i]);
+               tracks_map_free(context->all_tracks_map[i], NULL);
+       }
+       MEM_freeN(context->all_tracks);
+       MEM_freeN(context->all_reconstruction);
+       MEM_freeN(context->all_camera_intrinsics_options);
+       MEM_freeN(context->all_tracks_map);
+       MEM_freeN(context->all_sfra);
+       MEM_freeN(context->all_efra);
+
+       MEM_freeN(context);
+}
+
+
 /* Fill in multiview reconstruction options structure from reconstruction 
context. */
 static void reconstructionOptionsFromContext(libmv_ReconstructionOptions 
*reconstruction_options,
                                              MovieMultiviewReconstructContext 
*context)
@@ -268,7 +290,7 @@ static void multiview_reconstruct_update_solve_cb(void 
*customdata, double progr
        BLI_snprintf(progressdata->stats_message, progressdata->message_size, 
"Solving cameras | %s", message);
 }
 
-/* Solve camera/object motion and reconstruct 3D markers position
+/* TODO(tianwei): Solve camera/object motion and reconstruct 3D markers 
position
  * from a prepared reconstruction context from multiple views.
  *
  * stop is not actually used at this moment, so reconstruction
@@ -318,3 +340,42 @@ void 
BKE_tracking_multiview_reconstruction_solve(MovieMultiviewReconstructContex
        //context->reprojection_error = error;
        context->reprojection_error = 0;
 }
+
+/* TODO(tianwei): Finish multiview reconstruction process by copying 
reconstructed data
+ * to the primary movie clip datablock.
+ */
+bool 
BKE_tracking_multiview_reconstruction_finish(MovieMultiviewReconstructContext 
*context, MovieTracking *tracking)
+{
+       MovieTrackingReconstruction *reconstruction;
+       MovieTrackingObject *object;
+
+       return false;
+       //if (!libmv_reconstructionIsValid(context->all_reconstruction)) {
+       //      printf("Failed solve the motion: most likely there are no good 
keyframes\n");
+       //      return false;
+       //}
+
+       //tracks_map_merge(context->all_tracks_map, tracking);
+       //BKE_tracking_dopesheet_tag_update(tracking);
+
+       //object = BKE_tracking_object_get_named(tracking, 
context->object_name);
+
+       //if (context->is_camera)
+       //      reconstruction = &tracking->reconstruction;
+       //else
+       //      reconstruction = &object->reconstruction;
+
+       ///* update keyframe in the interface */
+       //if (context->select_keyframes) {
+       //      object->keyframe1 = context->keyframe1;
+       //      object->keyframe2 = context->keyframe2;
+       //}
+
+       //reconstruction->error = context->reprojection_error;
+       //reconstruction->flag |= TRACKING_RECONSTRUCTED;
+
+       //if (!reconstruct_retrieve_libmv(context, tracking))
+       //      return false;
+
+       //return true;
+}
diff --git a/source/blender/editors/space_clip/tracking_ops_correspondence.c 
b/source/blender/editors/space_clip/tracking_ops_correspondence.c
index f700546..be9a293 100644
--- a/source/blender/editors/space_clip/tracking_ops_correspondence.c
+++ b/source/blender/editors/space_clip/tracking_ops_correspondence.c
@@ -311,6 +311,7 @@ static bool solve_multiview_initjob(bContext *C,
        smj->user = sc->user;
 
        // create multiview reconstruction context and pass the tracks and 
markers to libmv
+       printf("new multiview reconstruction context\n");
        smj->context = 
BKE_tracking_multiview_reconstruction_context_new(smj->clips,
                                                                         
smj->clip_num,
                                                                         object,
@@ -348,27 +349,26 @@ static void solve_multiview_startjob(void *scv, short 
*stop, short *do_update, f
 
 static void solve_multiview_freejob(void *scv)
 {
-       SolveMultiviewJob *scj = (SolveMultiviewJob *)scv;
-       MovieClip *clip = scj->clips[0];        // primary camera
+       SolveMultiviewJob *smj = (SolveMultiviewJob *)scv;
+       MovieClip *clip = smj->clips[0];        // primary camera
        MovieTracking *tracking = &clip->tracking;
-       Scene *scene = scj->scene;
-       //MovieClip *clip = scj->clip;
+       Scene *scene = smj->scene;
        int solved;
 
-       if (!scj->context) {
+       if (!smj->context) {
                /* job weren't fully initialized due to some error */
-               MEM_freeN(scj);
+               MEM_freeN(smj);
                return;
        }
 
-       solved = BKE_tracking_reconstruction_finish(scj->context, tracking);
+       solved = BKE_tracking_multiview_reconstruction_finish(smj->context, 
tracking);
        if (!solved) {
-               BKE_report(scj->reports,
+               BKE_report(smj->reports,
                           RPT_WARNING,
                           "Some data failed to reconstruct (see console for 
details)");
        }
        else {
-               BKE_reportf(scj->reports,
+               BKE_reportf(smj->reports,
                            RPT_INFO,
                            "Average re-projection error: %.3f",
                            tracking->reconstruction.error);
@@ -388,7 +388,7 @@ static void solve_multiview_freejob(void *scv)
        {
                Camera *camera = (Camera *)scene->camera->data;
                int width, height;
-               BKE_movieclip_get_size(clip, &scj->user, &width, &height);
+               BKE_movieclip_get_size(clip, &smj->user, &width, &height);
                BKE_tracking_camera_to_blender(tracking, scene, camera, width, 
height);
                WM_main_add_notifier(NC_OBJECT, camera);
        }
@@ -404,8 +404,9 @@ static void solve_multiview_freejob(void *scv)
        /* Update active clip displayed in scene buttons. */
        WM_main_add_notifier(NC_SCENE, scene);
 
-       BKE_tracking_reconstruction_context_free(scj->context);
-       MEM_freeN(scj);
+       printf("free multiview reconstruction context\n");
+       BKE_tracking_multiview_reconstruction_context_free(smj->context);
+       MEM_freeN(smj);
 }
 
 static int solve_multiview_exec(bContext *C, wmOperator *op)
@@ -449,13 +450,12 @@ static int solve_multiview_invoke(bContext *C,
                if (error_msg[0]) {
                        BKE_report(op->reports, RPT_ERROR, error_msg);
                }
-               //solve_multiview_freejob(scj);
+               solve_multiview_freejob(scj);
                return OPERATOR_CANCELLED;
        }
-       return OPERATOR_CANCELLED;
 
        BLI_strncpy(tracking->stats->message,
-                   "Solving multiview| Preparing solve",
+                   "Solving multiview | Preparing solve",
                    sizeof(tracking->stats->message));
 
        /* Hide reconstruction statistics from previous solve. */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to