int localmotions2TransformsSimple(TransformData* td, const ManyLocalMotions* motions, Transformations* trans ){ int i; int len = vs_vector_size(motions); assert(trans->len==0 && trans->ts == 0); trans->ts = vs_malloc(sizeof(Transform)*len ); for(i=0; i< vs_vector_size(motions); i++) { trans->ts[i]=simpleMotionsToTransform(td,MLMGet(motions,i)); // storeLocalmotions(stderr,MLMGet(motions,i)); // storeTransform(stderr,&trans->ts[i]); } trans->len=len; return VS_OK; }
static int deshake_filter_video(TCModuleInstance *self, vframe_list_t *frame) { DeshakeData *sd = NULL; TC_MODULE_SELF_CHECK(self, "filter_video"); TC_MODULE_SELF_CHECK(frame, "filter_video"); sd = self->userdata; MotionDetect* md = &(sd->md); TransformData* td = &(sd->td); LocalMotions localmotions; Transform motion; VSFrame vsFrame; fillFrameFromBuffer(&vsFrame,frame->video_buf, &td->fiSrc); if(motionDetection(md, &localmotions, &vsFrame)!= VS_OK){ tc_log_error(MOD_NAME, "motion detection failed"); return TC_ERROR; } if(writeToFile(md, sd->f, &localmotions) != VS_OK) motion = simpleMotionsToTransform(td, &localmotions); vs_vector_del(&localmotions); transformPrepare(td, &vsFrame, &vsFrame); Transform t = lowPassTransforms(td, &sd->avg, &motion); /* tc_log_error(MOD_NAME, "Trans: det: %f %f %f \n\t\t act: %f %f %f %f", */ /* motion.x, motion.y, motion.alpha, */ /* t.x, t.y, t.alpha, t.zoom); */ if (sd->vob->im_v_codec == CODEC_RGB) { transformRGB(td, t); } else if (sd->vob->im_v_codec == CODEC_YUV) { transformYUV(td, t); } else { tc_log_error(MOD_NAME, "unsupported Codec: %i\n", sd->vob->im_v_codec); return TC_ERROR; } transformFinish(td); return TC_OK; }