void schro_encoder_motion_predict (SchroEncoderFrame *frame) { SchroParams *params = &frame->params; SchroMotionEst *me; int n; int ref; SCHRO_ASSERT(params->x_num_blocks != 0); SCHRO_ASSERT(params->y_num_blocks != 0); SCHRO_ASSERT(params->num_refs > 0); me = schro_motionest_new (frame); frame->motion = schro_motion_new (params, NULL, NULL); me->motion = frame->motion; frame->motion_field_list = schro_list_new_full ((SchroListFreeFunc)schro_motion_field_free, NULL); n = 0; for(ref=0;ref<params->num_refs;ref++){ schro_motionest_rough_scan_nohint (me, 3, ref, 12); schro_motionest_rough_scan_hint (me, 2, ref, 2); schro_motionest_rough_scan_hint (me, 1, ref, 2); } schro_encoder_bigblock_estimation (me); #if 0 if (frame->encoder->enable_phasecorr_estimation) { schro_encoder_phasecorr_estimation (me); } if (params->have_global_motion) { schro_encoder_global_estimation (me); #endif schro_motion_calculate_stats (frame->motion, frame); frame->estimated_mc_bits = schro_motion_estimate_entropy (frame->motion); schro_list_free (frame->motion_field_list); frame->badblock_ratio = (double)me->badblocks/(params->x_num_blocks*params->y_num_blocks/16); schro_motionest_free (me); } void schro_motion_field_lshift (SchroMotionField *mf, int n) { int i,j; SchroMotionVector *mv; for(j=0;j<mf->y_num_blocks;j++){ for(i=0;i<mf->x_num_blocks;i++){ mv = motion_field_get(mf,i,j); if (mv->using_global || mv->pred_mode == 0) continue; if (mv->pred_mode & 3) { mv->dx[0] <<= n; mv->dy[0] <<= n; mv->dx[1] <<= n; mv->dy[1] <<= n; } } } }
int main (int argc, char *argv[]) { SchroFrame *dest; SchroFrame *ref; SchroFrame *addframe; SchroParams params; SchroVideoFormat video_format; SchroMotionVector *motion_vectors; int i; int j; OrcProfile prof; double ave, std; schro_init(); memset (&video_format, 0, sizeof(video_format)); memset (¶ms, 0, sizeof(params)); schro_video_format_set_std_video_format (&video_format, SCHRO_VIDEO_FORMAT_CUSTOM); video_format.width = 720; video_format.height = 480; video_format.chroma_format = SCHRO_CHROMA_420; schro_video_format_validate (&video_format); params.video_format = &video_format; params.xbsep_luma = 8; params.ybsep_luma = 8; params.xblen_luma = 12; params.yblen_luma = 12; schro_params_calculate_mc_sizes(¶ms); dest = schro_frame_new_and_alloc (NULL, SCHRO_FRAME_FORMAT_S16_420, video_format.width, video_format.height); schro_frame_clear(dest); ref = schro_frame_new_and_alloc_extended (NULL, SCHRO_FRAME_FORMAT_U8_420, video_format.width, video_format.height, 32); schro_frame_clear(ref); addframe = schro_frame_new_and_alloc (NULL, SCHRO_FRAME_FORMAT_S16_420, video_format.width, video_format.height); schro_frame_clear(addframe); schro_upsampled_frame_upsample (ref); motion_vectors = malloc(sizeof(SchroMotionVector) * params.x_num_blocks * params.y_num_blocks); memset (motion_vectors, 0, sizeof(SchroMotionVector) * params.x_num_blocks * params.y_num_blocks); printf("sizeof(SchroMotionVector) = %lu\n",(unsigned long) sizeof(SchroMotionVector)); printf("num blocks %d x %d\n", params.x_num_blocks, params.y_num_blocks); for(i=0;i<params.x_num_blocks*params.y_num_blocks;i++){ motion_vectors[i].u.vec.dx[0] = 0; motion_vectors[i].u.vec.dy[0] = 0; motion_vectors[i].pred_mode = 1; motion_vectors[i].split = 2; } for(i=0;i<10;i++){ orc_profile_init (&prof); for(j=0;j<10;j++){ SchroMotion *motion; void *mv_save; motion = schro_motion_new (¶ms, ref, NULL); mv_save = motion->motion_vectors; motion->motion_vectors = motion_vectors; orc_profile_start(&prof); schro_motion_render (motion, dest, addframe, FALSE, NULL); orc_profile_stop(&prof); motion->motion_vectors = mv_save; schro_motion_free (motion); } orc_profile_get_ave_std (&prof, &ave, &std); printf("cycles %g %g\n", ave, std); } schro_frame_unref (ref); schro_frame_unref (dest); free (motion_vectors); return 0; }