Mercurial > libavcodec.hg
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 */ |