comparison motion_est.c @ 2015:3ab8f3e2ae6a libavcodec

moving motion estimation specific variables from MpegEncContext -> MotionEstContext
author michael
date Tue, 11 May 2004 01:38:46 +0000
parents 15c885db82a8
children c46e203dd698
comparison
equal deleted inserted replaced
2014:15c885db82a8 2015:3ab8f3e2ae6a
93 c->ref[ref_index][i]= ref2[i] + offset[i]; 93 c->ref[ref_index][i]= ref2[i] + offset[i];
94 } 94 }
95 } 95 }
96 } 96 }
97 97
98 static int get_flags(MpegEncContext *s, int direct, int chroma){ 98 static int get_flags(MotionEstContext *c, int direct, int chroma){
99 return ((s->flags&CODEC_FLAG_QPEL) ? FLAG_QPEL : 0) 99 return ((c->avctx->flags&CODEC_FLAG_QPEL) ? FLAG_QPEL : 0)
100 + (direct ? FLAG_DIRECT : 0) 100 + (direct ? FLAG_DIRECT : 0)
101 + (chroma ? FLAG_CHROMA : 0); 101 + (chroma ? FLAG_CHROMA : 0);
102 } 102 }
103 103
104 static always_inline int cmp(MpegEncContext *s, const int x, const int y, const int subx, const int suby, 104 static always_inline int cmp(MpegEncContext *s, const int x, const int y, const int subx, const int suby,
238 } 238 }
239 } 239 }
240 240
241 void ff_init_me(MpegEncContext *s){ 241 void ff_init_me(MpegEncContext *s){
242 MotionEstContext * const c= &s->me; 242 MotionEstContext * const c= &s->me;
243 243 c->avctx= s->avctx;
244 ff_set_cmp(&s->dsp, s->dsp.me_pre_cmp, s->avctx->me_pre_cmp); 244
245 ff_set_cmp(&s->dsp, s->dsp.me_cmp, s->avctx->me_cmp); 245 ff_set_cmp(&s->dsp, s->dsp.me_pre_cmp, c->avctx->me_pre_cmp);
246 ff_set_cmp(&s->dsp, s->dsp.me_sub_cmp, s->avctx->me_sub_cmp); 246 ff_set_cmp(&s->dsp, s->dsp.me_cmp, c->avctx->me_cmp);
247 ff_set_cmp(&s->dsp, s->dsp.mb_cmp, s->avctx->mb_cmp); 247 ff_set_cmp(&s->dsp, s->dsp.me_sub_cmp, c->avctx->me_sub_cmp);
248 248 ff_set_cmp(&s->dsp, s->dsp.mb_cmp, c->avctx->mb_cmp);
249 c->flags = get_flags(s, 0, s->avctx->me_cmp &FF_CMP_CHROMA); 249
250 c->sub_flags= get_flags(s, 0, s->avctx->me_sub_cmp&FF_CMP_CHROMA); 250 c->flags = get_flags(c, 0, c->avctx->me_cmp &FF_CMP_CHROMA);
251 c->mb_flags = get_flags(s, 0, s->avctx->mb_cmp &FF_CMP_CHROMA); 251 c->sub_flags= get_flags(c, 0, c->avctx->me_sub_cmp&FF_CMP_CHROMA);
252 c->mb_flags = get_flags(c, 0, c->avctx->mb_cmp &FF_CMP_CHROMA);
252 253
253 /*FIXME s->no_rounding b_type*/ 254 /*FIXME s->no_rounding b_type*/
254 if(s->flags&CODEC_FLAG_QPEL){ 255 if(s->flags&CODEC_FLAG_QPEL){
255 c->sub_motion_search= qpel_motion_search; 256 c->sub_motion_search= qpel_motion_search;
256 c->qpel_avg= s->dsp.avg_qpel_pixels_tab; 257 c->qpel_avg= s->dsp.avg_qpel_pixels_tab;
257 if(s->no_rounding) c->qpel_put= s->dsp.put_no_rnd_qpel_pixels_tab; 258 if(s->no_rounding) c->qpel_put= s->dsp.put_no_rnd_qpel_pixels_tab;
258 else c->qpel_put= s->dsp.put_qpel_pixels_tab; 259 else c->qpel_put= s->dsp.put_qpel_pixels_tab;
259 }else{ 260 }else{
260 if(s->avctx->me_sub_cmp&FF_CMP_CHROMA) 261 if(c->avctx->me_sub_cmp&FF_CMP_CHROMA)
261 c->sub_motion_search= hpel_motion_search; 262 c->sub_motion_search= hpel_motion_search;
262 else if( s->avctx->me_sub_cmp == FF_CMP_SAD 263 else if( c->avctx->me_sub_cmp == FF_CMP_SAD
263 && s->avctx-> me_cmp == FF_CMP_SAD 264 && c->avctx-> me_cmp == FF_CMP_SAD
264 && s->avctx-> mb_cmp == FF_CMP_SAD) 265 && c->avctx-> mb_cmp == FF_CMP_SAD)
265 c->sub_motion_search= sad_hpel_motion_search; // 2050 vs. 2450 cycles 266 c->sub_motion_search= sad_hpel_motion_search; // 2050 vs. 2450 cycles
266 else 267 else
267 c->sub_motion_search= hpel_motion_search; 268 c->sub_motion_search= hpel_motion_search;
268 c->hpel_avg= s->dsp.avg_pixels_tab; 269 c->hpel_avg= s->dsp.avg_pixels_tab;
269 if(s->no_rounding) c->hpel_put= s->dsp.put_no_rnd_pixels_tab; 270 if(s->no_rounding) c->hpel_put= s->dsp.put_no_rnd_pixels_tab;
679 */ 680 */
680 static inline void get_limits(MpegEncContext *s, int x, int y) 681 static inline void get_limits(MpegEncContext *s, int x, int y)
681 { 682 {
682 MotionEstContext * const c= &s->me; 683 MotionEstContext * const c= &s->me;
683 /* 684 /*
684 if(s->avctx->me_range) c->range= s->avctx->me_range >> 1; 685 if(c->avctx->me_range) c->range= c->avctx->me_range >> 1;
685 else c->range= 16; 686 else c->range= 16;
686 */ 687 */
687 if (s->unrestricted_mv) { 688 if (s->unrestricted_mv) {
688 c->xmin = - x - 16; 689 c->xmin = - x - 16;
689 c->ymin = - y - 16; 690 c->ymin = - y - 16;
695 c->xmax = - x + s->mb_width *16 - 16; 696 c->xmax = - x + s->mb_width *16 - 16;
696 c->ymax = - y + s->mb_height*16 - 16; 697 c->ymax = - y + s->mb_height*16 - 16;
697 } 698 }
698 } 699 }
699 700
700 static inline void init_mv4_ref(MpegEncContext *s){ 701 static inline void init_mv4_ref(MotionEstContext *c){
701 MotionEstContext * const c= &s->me; 702 const int stride= c->stride;
702 const int stride= s->linesize;
703 703
704 c->ref[1][0] = c->ref[0][0] + 8; 704 c->ref[1][0] = c->ref[0][0] + 8;
705 c->ref[2][0] = c->ref[0][0] + 8*stride; 705 c->ref[2][0] = c->ref[0][0] + 8*stride;
706 c->ref[3][0] = c->ref[2][0] + 8; 706 c->ref[3][0] = c->ref[2][0] + 8;
707 c->src[1][0] = c->src[0][0] + 8; 707 c->src[1][0] = c->src[0][0] + 8;
716 const int h=8; 716 const int h=8;
717 int block; 717 int block;
718 int P[10][2]; 718 int P[10][2];
719 int dmin_sum=0, mx4_sum=0, my4_sum=0; 719 int dmin_sum=0, mx4_sum=0, my4_sum=0;
720 int same=1; 720 int same=1;
721 const int stride= s->linesize; 721 const int stride= c->stride;
722 const int uvstride= s->uvlinesize; 722 const int uvstride= c->uvstride;
723 uint8_t *mv_penalty= c->current_mv_penalty; 723 uint8_t *mv_penalty= c->current_mv_penalty;
724 724
725 init_mv4_ref(s); 725 init_mv4_ref(c);
726 726
727 for(block=0; block<4; block++){ 727 for(block=0; block<4; block++){
728 int mx4, my4; 728 int mx4, my4;
729 int pred_x4, pred_y4; 729 int pred_x4, pred_y4;
730 int dmin4; 730 int dmin4;
808 808
809 if(s->dsp.me_sub_cmp[0] != s->dsp.mb_cmp[0]){ 809 if(s->dsp.me_sub_cmp[0] != s->dsp.mb_cmp[0]){
810 dmin_sum += s->dsp.mb_cmp[0](s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*16*stride, c->scratchpad, stride, 16); 810 dmin_sum += s->dsp.mb_cmp[0](s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*16*stride, c->scratchpad, stride, 16);
811 } 811 }
812 812
813 if(s->avctx->mb_cmp&FF_CMP_CHROMA){ 813 if(c->avctx->mb_cmp&FF_CMP_CHROMA){
814 int dxy; 814 int dxy;
815 int mx, my; 815 int mx, my;
816 int offset; 816 int offset;
817 817
818 mx= ff_h263_round_chroma(mx4_sum); 818 mx= ff_h263_round_chroma(mx4_sum);
834 } 834 }
835 835
836 c->pred_x= mx; 836 c->pred_x= mx;
837 c->pred_y= my; 837 c->pred_y= my;
838 838
839 switch(s->avctx->mb_cmp&0xFF){ 839 switch(c->avctx->mb_cmp&0xFF){
840 /*case FF_CMP_SSE: 840 /*case FF_CMP_SSE:
841 return dmin_sum+ 32*s->qscale*s->qscale;*/ 841 return dmin_sum+ 32*s->qscale*s->qscale;*/
842 case FF_CMP_RD: 842 case FF_CMP_RD:
843 return dmin_sum; 843 return dmin_sum;
844 default: 844 default:
968 c->uvstride>>=1; 968 c->uvstride>>=1;
969 969
970 if(same) 970 if(same)
971 return INT_MAX; 971 return INT_MAX;
972 972
973 switch(s->avctx->mb_cmp&0xFF){ 973 switch(c->avctx->mb_cmp&0xFF){
974 /*case FF_CMP_SSE: 974 /*case FF_CMP_SSE:
975 return dmin_sum+ 32*s->qscale*s->qscale;*/ 975 return dmin_sum+ 32*s->qscale*s->qscale;*/
976 case FF_CMP_RD: 976 case FF_CMP_RD:
977 return dmin_sum; 977 return dmin_sum;
978 default: 978 default:
1002 s->mb_type[mb_xy]=CANDIDATE_MB_TYPE_INTRA; 1002 s->mb_type[mb_xy]=CANDIDATE_MB_TYPE_INTRA;
1003 c->stride<<=1; 1003 c->stride<<=1;
1004 c->uvstride<<=1; 1004 c->uvstride<<=1;
1005 1005
1006 if(!(s->flags & CODEC_FLAG_INTERLACED_ME)){ 1006 if(!(s->flags & CODEC_FLAG_INTERLACED_ME)){
1007 av_log(s->avctx, AV_LOG_ERROR, "Interlaced macroblock selected but interlaced motion estimation disabled\n"); 1007 av_log(c->avctx, AV_LOG_ERROR, "Interlaced macroblock selected but interlaced motion estimation disabled\n");
1008 return -1; 1008 return -1;
1009 } 1009 }
1010 1010
1011 if(USES_LIST(mb_type, 0)){ 1011 if(USES_LIST(mb_type, 0)){
1012 int field_select0= p->ref_index[0][xy ]; 1012 int field_select0= p->ref_index[0][xy ];
1063 } 1063 }
1064 c->stride>>=1; 1064 c->stride>>=1;
1065 c->uvstride>>=1; 1065 c->uvstride>>=1;
1066 }else if(IS_8X8(mb_type)){ 1066 }else if(IS_8X8(mb_type)){
1067 if(!(s->flags & CODEC_FLAG_4MV)){ 1067 if(!(s->flags & CODEC_FLAG_4MV)){
1068 av_log(s->avctx, AV_LOG_ERROR, "4MV macroblock selected but 4MV encoding disabled\n"); 1068 av_log(c->avctx, AV_LOG_ERROR, "4MV macroblock selected but 4MV encoding disabled\n");
1069 return -1; 1069 return -1;
1070 } 1070 }
1071 cmpf= s->dsp.sse[1]; 1071 cmpf= s->dsp.sse[1];
1072 chroma_cmpf= s->dsp.sse[1]; 1072 chroma_cmpf= s->dsp.sse[1];
1073 init_mv4_ref(s); 1073 init_mv4_ref(c);
1074 for(i=0; i<4; i++){ 1074 for(i=0; i<4; i++){
1075 xy= s->block_index[i]; 1075 xy= s->block_index[i];
1076 x= p->motion_val[0][xy][0]; 1076 x= p->motion_val[0][xy][0];
1077 y= p->motion_val[0][xy][1]; 1077 y= p->motion_val[0][xy][1];
1078 d+= cmp(s, x>>shift, y>>shift, x&mask, y&mask, 1, 8, i, i, cmpf, chroma_cmpf, flags); 1078 d+= cmp(s, x>>shift, y>>shift, x&mask, y&mask, 1, 8, i, i, cmpf, chroma_cmpf, flags);
1122 1122
1123 assert(s->quarter_sample==0 || s->quarter_sample==1); 1123 assert(s->quarter_sample==0 || s->quarter_sample==1);
1124 assert(s->linesize == c->stride); 1124 assert(s->linesize == c->stride);
1125 assert(s->uvlinesize == c->uvstride); 1125 assert(s->uvlinesize == c->uvstride);
1126 1126
1127 c->penalty_factor = get_penalty_factor(s, s->avctx->me_cmp); 1127 c->penalty_factor = get_penalty_factor(s, c->avctx->me_cmp);
1128 c->sub_penalty_factor= get_penalty_factor(s, s->avctx->me_sub_cmp); 1128 c->sub_penalty_factor= get_penalty_factor(s, c->avctx->me_sub_cmp);
1129 c->mb_penalty_factor = get_penalty_factor(s, s->avctx->mb_cmp); 1129 c->mb_penalty_factor = get_penalty_factor(s, c->avctx->mb_cmp);
1130 c->current_mv_penalty= c->mv_penalty[s->f_code] + MAX_MV; 1130 c->current_mv_penalty= c->mv_penalty[s->f_code] + MAX_MV;
1131 1131
1132 get_limits(s, 16*mb_x, 16*mb_y); 1132 get_limits(s, 16*mb_x, 16*mb_y);
1133 c->skip=0; 1133 c->skip=0;
1134 1134
1137 sum = s->dsp.pix_sum(pix, s->linesize); 1137 sum = s->dsp.pix_sum(pix, s->linesize);
1138 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8; 1138 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
1139 1139
1140 pic->mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8; 1140 pic->mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
1141 pic->mb_var [s->mb_stride * mb_y + mb_x] = varc; 1141 pic->mb_var [s->mb_stride * mb_y + mb_x] = varc;
1142 s->mb_var_sum_temp += varc; 1142 c->mb_var_sum_temp += varc;
1143 1143
1144 if(s->avctx->me_threshold){ 1144 if(c->avctx->me_threshold){
1145 vard= (check_input_motion(s, mb_x, mb_y, 1)+128)>>8; 1145 vard= (check_input_motion(s, mb_x, mb_y, 1)+128)>>8;
1146 1146
1147 if(vard<s->avctx->me_threshold){ 1147 if(vard<c->avctx->me_threshold){
1148 pic->mc_mb_var[s->mb_stride * mb_y + mb_x] = vard; 1148 pic->mc_mb_var[s->mb_stride * mb_y + mb_x] = vard;
1149 s->mc_mb_var_sum_temp += vard; 1149 c->mc_mb_var_sum_temp += vard;
1150 if (vard <= 64 || vard < varc) { //FIXME 1150 if (vard <= 64 || vard < varc) { //FIXME
1151 s->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); 1151 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1152 }else{ 1152 }else{
1153 s->scene_change_score+= s->qscale; 1153 c->scene_change_score+= s->qscale;
1154 } 1154 }
1155 return; 1155 return;
1156 } 1156 }
1157 if(vard<s->avctx->mb_threshold) 1157 if(vard<c->avctx->mb_threshold)
1158 mb_type= s->mb_type[mb_x + mb_y*s->mb_stride]; 1158 mb_type= s->mb_type[mb_x + mb_y*s->mb_stride];
1159 } 1159 }
1160 1160
1161 switch(s->me_method) { 1161 switch(s->me_method) {
1162 case ME_ZERO: 1162 case ME_ZERO:
1229 1229
1230 vard = (s->dsp.sse[0](NULL, pix, ppix, s->linesize, 16)+128)>>8; 1230 vard = (s->dsp.sse[0](NULL, pix, ppix, s->linesize, 16)+128)>>8;
1231 1231
1232 pic->mc_mb_var[s->mb_stride * mb_y + mb_x] = vard; 1232 pic->mc_mb_var[s->mb_stride * mb_y + mb_x] = vard;
1233 // pic->mb_cmp_score[s->mb_stride * mb_y + mb_x] = dmin; 1233 // pic->mb_cmp_score[s->mb_stride * mb_y + mb_x] = dmin;
1234 s->mc_mb_var_sum_temp += vard; 1234 c->mc_mb_var_sum_temp += vard;
1235 1235
1236 #if 0 1236 #if 0
1237 printf("varc=%4d avg_var=%4d (sum=%4d) vard=%4d mx=%2d my=%2d\n", 1237 printf("varc=%4d avg_var=%4d (sum=%4d) vard=%4d mx=%2d my=%2d\n",
1238 varc, s->avg_mb_var, sum, vard, mx - xx, my - yy); 1238 varc, s->avg_mb_var, sum, vard, mx - xx, my - yy);
1239 #endif 1239 #endif
1240 if(mb_type){ 1240 if(mb_type){
1241 if (vard <= 64 || vard < varc) 1241 if (vard <= 64 || vard < varc)
1242 s->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); 1242 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1243 else 1243 else
1244 s->scene_change_score+= s->qscale; 1244 c->scene_change_score+= s->qscale;
1245 1245
1246 if(mb_type == CANDIDATE_MB_TYPE_INTER){ 1246 if(mb_type == CANDIDATE_MB_TYPE_INTER){
1247 c->sub_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16); 1247 c->sub_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16);
1248 set_p_mv_tables(s, mx, my, 1); 1248 set_p_mv_tables(s, mx, my, 1);
1249 }else{ 1249 }else{
1256 set_p_mv_tables(s, mx, my, 0); 1256 set_p_mv_tables(s, mx, my, 0);
1257 } 1257 }
1258 if(mb_type == CANDIDATE_MB_TYPE_INTER_I){ 1258 if(mb_type == CANDIDATE_MB_TYPE_INTER_I){
1259 interlaced_search(s, 0, s->p_field_mv_table, s->p_field_select_table, mx, my, 1); 1259 interlaced_search(s, 0, s->p_field_mv_table, s->p_field_select_table, mx, my, 1);
1260 } 1260 }
1261 }else if(s->avctx->mb_decision > FF_MB_DECISION_SIMPLE){ 1261 }else if(c->avctx->mb_decision > FF_MB_DECISION_SIMPLE){
1262 if (vard <= 64 || vard < varc) 1262 if (vard <= 64 || vard < varc)
1263 s->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); 1263 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1264 else 1264 else
1265 s->scene_change_score+= s->qscale; 1265 c->scene_change_score+= s->qscale;
1266 1266
1267 if (vard*2 + 200 > varc) 1267 if (vard*2 + 200 > varc)
1268 mb_type|= CANDIDATE_MB_TYPE_INTRA; 1268 mb_type|= CANDIDATE_MB_TYPE_INTRA;
1269 if (varc*2 + 200 > vard){ 1269 if (varc*2 + 200 > vard){
1270 mb_type|= CANDIDATE_MB_TYPE_INTER; 1270 mb_type|= CANDIDATE_MB_TYPE_INTER;
1292 }else{ 1292 }else{
1293 int intra_score, i; 1293 int intra_score, i;
1294 mb_type= CANDIDATE_MB_TYPE_INTER; 1294 mb_type= CANDIDATE_MB_TYPE_INTER;
1295 1295
1296 dmin= c->sub_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16); 1296 dmin= c->sub_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16);
1297 if(s->avctx->me_sub_cmp != s->avctx->mb_cmp && !c->skip) 1297 if(c->avctx->me_sub_cmp != c->avctx->mb_cmp && !c->skip)
1298 dmin= get_mb_score(s, mx, my, 0, 0); 1298 dmin= get_mb_score(s, mx, my, 0, 0);
1299 1299
1300 if((s->flags&CODEC_FLAG_4MV) 1300 if((s->flags&CODEC_FLAG_4MV)
1301 && !c->skip && varc>50 && vard>10){ 1301 && !c->skip && varc>50 && vard>10){
1302 int dmin4= h263_mv4_search(s, mx, my, shift); 1302 int dmin4= h263_mv4_search(s, mx, my, shift);
1316 1316
1317 // pic->mb_cmp_score[s->mb_stride * mb_y + mb_x] = dmin; 1317 // pic->mb_cmp_score[s->mb_stride * mb_y + mb_x] = dmin;
1318 set_p_mv_tables(s, mx, my, mb_type!=CANDIDATE_MB_TYPE_INTER4V); 1318 set_p_mv_tables(s, mx, my, mb_type!=CANDIDATE_MB_TYPE_INTER4V);
1319 1319
1320 /* get intra luma score */ 1320 /* get intra luma score */
1321 if((s->avctx->mb_cmp&0xFF)==FF_CMP_SSE){ 1321 if((c->avctx->mb_cmp&0xFF)==FF_CMP_SSE){
1322 intra_score= (varc<<8) - 500; //FIXME dont scale it down so we dont have to fix it 1322 intra_score= (varc<<8) - 500; //FIXME dont scale it down so we dont have to fix it
1323 }else{ 1323 }else{
1324 int mean= (sum+128)>>8; 1324 int mean= (sum+128)>>8;
1325 mean*= 0x01010101; 1325 mean*= 0x01010101;
1326 1326
1333 1333
1334 intra_score= s->dsp.mb_cmp[0](s, c->scratchpad, pix, s->linesize, 16); 1334 intra_score= s->dsp.mb_cmp[0](s, c->scratchpad, pix, s->linesize, 16);
1335 } 1335 }
1336 #if 0 //FIXME 1336 #if 0 //FIXME
1337 /* get chroma score */ 1337 /* get chroma score */
1338 if(s->avctx->mb_cmp&FF_CMP_CHROMA){ 1338 if(c->avctx->mb_cmp&FF_CMP_CHROMA){
1339 for(i=1; i<3; i++){ 1339 for(i=1; i<3; i++){
1340 uint8_t *dest_c; 1340 uint8_t *dest_c;
1341 int mean; 1341 int mean;
1342 1342
1343 if(s->out_format == FMT_H263){ 1343 if(s->out_format == FMT_H263){
1364 s->current_picture.mb_type[mb_y*s->mb_stride + mb_x]= CANDIDATE_MB_TYPE_INTRA; //FIXME cleanup 1364 s->current_picture.mb_type[mb_y*s->mb_stride + mb_x]= CANDIDATE_MB_TYPE_INTRA; //FIXME cleanup
1365 }else 1365 }else
1366 s->current_picture.mb_type[mb_y*s->mb_stride + mb_x]= 0; 1366 s->current_picture.mb_type[mb_y*s->mb_stride + mb_x]= 0;
1367 1367
1368 if (vard <= 64 || vard < varc) { //FIXME 1368 if (vard <= 64 || vard < varc) { //FIXME
1369 s->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); 1369 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1370 }else{ 1370 }else{
1371 s->scene_change_score+= s->qscale; 1371 c->scene_change_score+= s->qscale;
1372 } 1372 }
1373 } 1373 }
1374 1374
1375 s->mb_type[mb_y*s->mb_stride + mb_x]= mb_type; 1375 s->mb_type[mb_y*s->mb_stride + mb_x]= mb_type;
1376 } 1376 }
1385 const int xy= mb_x + mb_y*s->mb_stride; 1385 const int xy= mb_x + mb_y*s->mb_stride;
1386 init_ref(c, s->new_picture.data, s->last_picture.data, NULL, 16*mb_x, 16*mb_y, 0); 1386 init_ref(c, s->new_picture.data, s->last_picture.data, NULL, 16*mb_x, 16*mb_y, 0);
1387 1387
1388 assert(s->quarter_sample==0 || s->quarter_sample==1); 1388 assert(s->quarter_sample==0 || s->quarter_sample==1);
1389 1389
1390 c->pre_penalty_factor = get_penalty_factor(s, s->avctx->me_pre_cmp); 1390 c->pre_penalty_factor = get_penalty_factor(s, c->avctx->me_pre_cmp);
1391 c->current_mv_penalty= c->mv_penalty[s->f_code] + MAX_MV; 1391 c->current_mv_penalty= c->mv_penalty[s->f_code] + MAX_MV;
1392 1392
1393 get_limits(s, 16*mb_x, 16*mb_y); 1393 get_limits(s, 16*mb_x, 16*mb_y);
1394 c->skip=0; 1394 c->skip=0;
1395 1395
1438 const int mot_stride = s->mb_stride; 1438 const int mot_stride = s->mb_stride;
1439 const int mot_xy = mb_y*mot_stride + mb_x; 1439 const int mot_xy = mb_y*mot_stride + mb_x;
1440 uint8_t * const mv_penalty= c->mv_penalty[f_code] + MAX_MV; 1440 uint8_t * const mv_penalty= c->mv_penalty[f_code] + MAX_MV;
1441 int mv_scale; 1441 int mv_scale;
1442 1442
1443 c->penalty_factor = get_penalty_factor(s, s->avctx->me_cmp); 1443 c->penalty_factor = get_penalty_factor(s, c->avctx->me_cmp);
1444 c->sub_penalty_factor= get_penalty_factor(s, s->avctx->me_sub_cmp); 1444 c->sub_penalty_factor= get_penalty_factor(s, c->avctx->me_sub_cmp);
1445 c->mb_penalty_factor = get_penalty_factor(s, s->avctx->mb_cmp); 1445 c->mb_penalty_factor = get_penalty_factor(s, c->avctx->mb_cmp);
1446 c->current_mv_penalty= mv_penalty; 1446 c->current_mv_penalty= mv_penalty;
1447 1447
1448 get_limits(s, 16*mb_x, 16*mb_y); 1448 get_limits(s, 16*mb_x, 16*mb_y);
1449 1449
1450 switch(s->me_method) { 1450 switch(s->me_method) {
1508 break; 1508 break;
1509 } 1509 }
1510 1510
1511 dmin= c->sub_motion_search(s, &mx, &my, dmin, 0, ref_index, 0, 16); 1511 dmin= c->sub_motion_search(s, &mx, &my, dmin, 0, ref_index, 0, 16);
1512 1512
1513 if(s->avctx->me_sub_cmp != s->avctx->mb_cmp && !c->skip) 1513 if(c->avctx->me_sub_cmp != c->avctx->mb_cmp && !c->skip)
1514 dmin= get_mb_score(s, mx, my, 0, ref_index); 1514 dmin= get_mb_score(s, mx, my, 0, ref_index);
1515 1515
1516 //printf("%d %d %d %d//", s->mb_x, s->mb_y, mx, my); 1516 //printf("%d %d %d %d//", s->mb_x, s->mb_y, mx, my);
1517 // s->mb_type[mb_y*s->mb_width + mb_x]= mb_type; 1517 // s->mb_type[mb_y*s->mb_width + mb_x]= mb_type;
1518 mv_table[mot_xy][0]= mx; 1518 mv_table[mot_xy][0]= mx;
1576 1576
1577 fbmin = (mv_penalty[motion_fx-pred_fx] + mv_penalty[motion_fy-pred_fy])*c->mb_penalty_factor 1577 fbmin = (mv_penalty[motion_fx-pred_fx] + mv_penalty[motion_fy-pred_fy])*c->mb_penalty_factor
1578 +(mv_penalty[motion_bx-pred_bx] + mv_penalty[motion_by-pred_by])*c->mb_penalty_factor 1578 +(mv_penalty[motion_bx-pred_bx] + mv_penalty[motion_by-pred_by])*c->mb_penalty_factor
1579 + s->dsp.mb_cmp[size](s, src_data[0], dest_y, stride, h); //FIXME new_pic 1579 + s->dsp.mb_cmp[size](s, src_data[0], dest_y, stride, h); //FIXME new_pic
1580 1580
1581 if(s->avctx->mb_cmp&FF_CMP_CHROMA){ 1581 if(c->avctx->mb_cmp&FF_CMP_CHROMA){
1582 } 1582 }
1583 //FIXME CHROMA !!! 1583 //FIXME CHROMA !!!
1584 1584
1585 return fbmin; 1585 return fbmin;
1586 } 1586 }
1698 if(c->sub_flags&FLAG_QPEL) 1698 if(c->sub_flags&FLAG_QPEL)
1699 dmin = qpel_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16); 1699 dmin = qpel_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16);
1700 else 1700 else
1701 dmin = hpel_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16); 1701 dmin = hpel_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16);
1702 1702
1703 if(s->avctx->me_sub_cmp != s->avctx->mb_cmp && !c->skip) 1703 if(c->avctx->me_sub_cmp != c->avctx->mb_cmp && !c->skip)
1704 dmin= get_mb_score(s, mx, my, 0, 0); 1704 dmin= get_mb_score(s, mx, my, 0, 0);
1705 1705
1706 get_limits(s, 16*mb_x, 16*mb_y); //restore c->?min/max, maybe not needed 1706 get_limits(s, 16*mb_x, 16*mb_y); //restore c->?min/max, maybe not needed
1707 1707
1708 s->b_direct_mv_table[mot_xy][0]= mx; 1708 s->b_direct_mv_table[mot_xy][0]= mx;
1723 const int xy = mb_y*s->mb_stride + mb_x; 1723 const int xy = mb_y*s->mb_stride + mb_x;
1724 init_ref(c, s->new_picture.data, s->last_picture.data, s->next_picture.data, 16*mb_x, 16*mb_y, 2); 1724 init_ref(c, s->new_picture.data, s->last_picture.data, s->next_picture.data, 16*mb_x, 16*mb_y, 2);
1725 1725
1726 1726
1727 c->skip=0; 1727 c->skip=0;
1728 if(s->avctx->me_threshold){ 1728 if(c->avctx->me_threshold){
1729 int vard= (check_input_motion(s, mb_x, mb_y, 0)+128)>>8; 1729 int vard= (check_input_motion(s, mb_x, mb_y, 0)+128)>>8;
1730 1730
1731 if(vard<s->avctx->me_threshold){ 1731 if(vard<c->avctx->me_threshold){
1732 // pix = c->src[0][0]; 1732 // pix = c->src[0][0];
1733 // sum = s->dsp.pix_sum(pix, s->linesize); 1733 // sum = s->dsp.pix_sum(pix, s->linesize);
1734 // varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8; 1734 // varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
1735 1735
1736 // pic->mb_var [s->mb_stride * mb_y + mb_x] = varc; 1736 // pic->mb_var [s->mb_stride * mb_y + mb_x] = varc;
1737 s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] = vard; 1737 s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] = vard;
1738 /* pic->mb_mean [s->mb_stride * mb_y + mb_x] = (sum+128)>>8; 1738 /* pic->mb_mean [s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
1739 s->mb_var_sum_temp += varc;*/ 1739 c->mb_var_sum_temp += varc;*/
1740 s->mc_mb_var_sum_temp += vard; 1740 c->mc_mb_var_sum_temp += vard;
1741 /* if (vard <= 64 || vard < varc) { 1741 /* if (vard <= 64 || vard < varc) {
1742 s->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); 1742 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1743 }else{ 1743 }else{
1744 s->scene_change_score+= s->qscale; 1744 c->scene_change_score+= s->qscale;
1745 }*/ 1745 }*/
1746 return; 1746 return;
1747 } 1747 }
1748 if(vard<s->avctx->mb_threshold){ 1748 if(vard<c->avctx->mb_threshold){
1749 type= s->mb_type[mb_y*s->mb_stride + mb_x]; 1749 type= s->mb_type[mb_y*s->mb_stride + mb_x];
1750 if(type == CANDIDATE_MB_TYPE_DIRECT){ 1750 if(type == CANDIDATE_MB_TYPE_DIRECT){
1751 direct_search(s, mb_x, mb_y); 1751 direct_search(s, mb_x, mb_y);
1752 } 1752 }
1753 if(type == CANDIDATE_MB_TYPE_FORWARD || type == CANDIDATE_MB_TYPE_BIDIR){ 1753 if(type == CANDIDATE_MB_TYPE_FORWARD || type == CANDIDATE_MB_TYPE_BIDIR){
1830 score=bimin; 1830 score=bimin;
1831 type= CANDIDATE_MB_TYPE_BACKWARD_I; 1831 type= CANDIDATE_MB_TYPE_BACKWARD_I;
1832 } 1832 }
1833 1833
1834 score= ((unsigned)(score*score + 128*256))>>16; 1834 score= ((unsigned)(score*score + 128*256))>>16;
1835 s->mc_mb_var_sum_temp += score; 1835 c->mc_mb_var_sum_temp += score;
1836 s->current_picture.mc_mb_var[mb_y*s->mb_stride + mb_x] = score; //FIXME use SSE 1836 s->current_picture.mc_mb_var[mb_y*s->mb_stride + mb_x] = score; //FIXME use SSE
1837 } 1837 }
1838 1838
1839 if(s->avctx->mb_decision > FF_MB_DECISION_SIMPLE){ 1839 if(c->avctx->mb_decision > FF_MB_DECISION_SIMPLE){
1840 type= CANDIDATE_MB_TYPE_FORWARD | CANDIDATE_MB_TYPE_BACKWARD | CANDIDATE_MB_TYPE_BIDIR | CANDIDATE_MB_TYPE_DIRECT; 1840 type= CANDIDATE_MB_TYPE_FORWARD | CANDIDATE_MB_TYPE_BACKWARD | CANDIDATE_MB_TYPE_BIDIR | CANDIDATE_MB_TYPE_DIRECT;
1841 if(fimin < INT_MAX) 1841 if(fimin < INT_MAX)
1842 type |= CANDIDATE_MB_TYPE_FORWARD_I; 1842 type |= CANDIDATE_MB_TYPE_FORWARD_I;
1843 if(bimin < INT_MAX) 1843 if(bimin < INT_MAX)
1844 type |= CANDIDATE_MB_TYPE_BACKWARD_I; 1844 type |= CANDIDATE_MB_TYPE_BACKWARD_I;
1905 } 1905 }
1906 } 1906 }
1907 1907
1908 void ff_fix_long_p_mvs(MpegEncContext * s) 1908 void ff_fix_long_p_mvs(MpegEncContext * s)
1909 { 1909 {
1910 MotionEstContext * const c= &s->me;
1910 const int f_code= s->f_code; 1911 const int f_code= s->f_code;
1911 int y, range; 1912 int y, range;
1912 assert(s->pict_type==P_TYPE); 1913 assert(s->pict_type==P_TYPE);
1913 1914
1914 range = (((s->out_format == FMT_MPEG1) ? 8 : 16) << f_code); 1915 range = (((s->out_format == FMT_MPEG1) ? 8 : 16) << f_code);
1915 1916
1916 if(s->msmpeg4_version) range= 16; 1917 if(s->msmpeg4_version) range= 16;
1917 1918
1918 if(s->avctx->me_range && range > s->avctx->me_range) range= s->avctx->me_range; 1919 if(c->avctx->me_range && range > c->avctx->me_range) range= c->avctx->me_range;
1919 1920
1920 //printf("%d no:%d %d//\n", clip, noclip, f_code); 1921 //printf("%d no:%d %d//\n", clip, noclip, f_code);
1921 if(s->flags&CODEC_FLAG_4MV){ 1922 if(s->flags&CODEC_FLAG_4MV){
1922 const int wrap= s->b8_stride; 1923 const int wrap= s->b8_stride;
1923 1924
1955 * @param truncate 1 for truncation, 0 for using intra 1956 * @param truncate 1 for truncation, 0 for using intra
1956 */ 1957 */
1957 void ff_fix_long_mvs(MpegEncContext * s, uint8_t *field_select_table, int field_select, 1958 void ff_fix_long_mvs(MpegEncContext * s, uint8_t *field_select_table, int field_select,
1958 int16_t (*mv_table)[2], int f_code, int type, int truncate) 1959 int16_t (*mv_table)[2], int f_code, int type, int truncate)
1959 { 1960 {
1961 MotionEstContext * const c= &s->me;
1960 int y, h_range, v_range; 1962 int y, h_range, v_range;
1961 1963
1962 // RAL: 8 in MPEG-1, 16 in MPEG-4 1964 // RAL: 8 in MPEG-1, 16 in MPEG-4
1963 int range = (((s->out_format == FMT_MPEG1) ? 8 : 16) << f_code); 1965 int range = (((s->out_format == FMT_MPEG1) ? 8 : 16) << f_code);
1964 1966
1965 if(s->msmpeg4_version) range= 16; 1967 if(s->msmpeg4_version) range= 16;
1966 if(s->avctx->me_range && range > s->avctx->me_range) range= s->avctx->me_range; 1968 if(c->avctx->me_range && range > c->avctx->me_range) range= c->avctx->me_range;
1967 1969
1968 h_range= range; 1970 h_range= range;
1969 v_range= field_select_table ? range>>1 : range; 1971 v_range= field_select_table ? range>>1 : range;
1970 1972
1971 /* clip / convert to intra 16x16 type MVs */ 1973 /* clip / convert to intra 16x16 type MVs */