struct x264_me_job_t { int i_me_thread_num; int i_me_handle_num; int i_seq_num; /* encoder parameters */ struct { struct { int i_me_range; } analyse; } param; /* MB table for current frame/mb */ struct { /* Search parameters */ int i_me_method; int i_subpel_refine; int b_chroma_me; /* Subpel MV range for motion search. * same mv_min/max but includes levels' i_mv_range. */ int mv_min_spel[2]; int mv_max_spel[2]; /* Fullpel MV range for motion search */ int mv_min_fpel[2]; int mv_max_fpel[2]; struct { /* space for p_fenc */ #define FENC_STRIDE 16 DECLARE_ALIGNED_16( uint8_t fenc_buf[24*FENC_STRIDE] ); } pic; } mb; /* output */ struct { struct { int cost_mv; /* lambda * nbits for the chosen mv */ int cost; /* satd + lambda * nbits */ int mv[2]; } m[2]; } out; /* x264_me_search_ref() parameters */ x264_me_t m[2]; int mvc[10][2]; int i_mvc; int *p_halfpel_thresh; }; if ( h->mb.i_me_method == X264_ME_DSP_H_4_1 ) void x264_me_search_ref_dsp( x264_t *h, x264_me_t *m, int16_t (*mvc)[2], int i_mvc, int *p_halfpel_thresh ) { /* Thread and macroblock identificaton */ x264_me_job->i_me_thread_num = h->thread; x264_me_job->i_me_handle_num = h->handle_number; x264_me_job->i_seq_num = h->mb.i_mb_xy; /* Encoder Analyser Parameters */ x264_me_job->param.analyse.i_me_range = h->param.anaylse.i_me_range; /* Macroblock table data */ x264_me_job->mb.i_me_method = h->mb.i_me_method; x264_me_job->mb.i_subpel_refine = h->mb.i_subpel_refine; x264_me_job->mb.b_chroma_me = h->mb.b_chroma_me; x264_me_job->mb.mv_min_spel = h->mb.mv_min_spel; x264_me_job->mb.mv_max_spel = h->mb.mv_max_spel; x264_me_job->mb.mv_min_fpel = h->mb.mv_min_fpel; /* ME cost in & out */ x264_me_job->m[0] = *m; /* Other parameters */ x264_me_job->mvc = *mvc; x264_me_job->i_mvc = i_mvc; x264_me_job->p_halfpel_thresh = *p_halfpel_thresh; // send x264_me_job to DSP for // 4x 2x 1x hierarchical search // subpel refinement // return costs & vectors // update host structures }