comparison mpegvideo.c @ 294:944632089814 libavcodec

4MV motion estimation (not finished yet) SAD functions rewritten (8x8 support & MMX2 optimizations) HQ inter/intra decission msmpeg4 encoding bugfix (MV where too long)
author michaelni
date Wed, 27 Mar 2002 21:25:22 +0000
parents 73a9ce3d9715
children 6622b0fd036c
comparison
equal deleted inserted replaced
293:6eaf5da091fa 294:944632089814
225 if (!s->encoding) { 225 if (!s->encoding) {
226 s->mbskip_table = av_mallocz(s->mb_num); 226 s->mbskip_table = av_mallocz(s->mb_num);
227 if (!s->mbskip_table) 227 if (!s->mbskip_table)
228 goto fail; 228 goto fail;
229 } 229 }
230
231 s->block= s->intra_block;
230 232
231 s->context_initialized = 1; 233 s->context_initialized = 1;
232 return 0; 234 return 0;
233 fail: 235 fail:
234 MPV_common_end(s); 236 MPV_common_end(s);
293 s->max_qdiff= avctx->max_qdiff; 295 s->max_qdiff= avctx->max_qdiff;
294 s->qcompress= avctx->qcompress; 296 s->qcompress= avctx->qcompress;
295 s->qblur= avctx->qblur; 297 s->qblur= avctx->qblur;
296 s->avctx = avctx; 298 s->avctx = avctx;
297 s->aspect_ratio_info= avctx->aspect_ratio_info; 299 s->aspect_ratio_info= avctx->aspect_ratio_info;
298 s->hq= (avctx->flags & CODEC_FLAG_HQ); 300 s->flags= avctx->flags;
299 301
300 if (s->gop_size <= 1) { 302 if (s->gop_size <= 1) {
301 s->intra_only = 1; 303 s->intra_only = 1;
302 s->gop_size = 12; 304 s->gop_size = 12;
303 } else { 305 } else {
1076 put_dct(s, block[4], 4, dest_cb, s->linesize >> 1); 1078 put_dct(s, block[4], 4, dest_cb, s->linesize >> 1);
1077 put_dct(s, block[5], 5, dest_cr, s->linesize >> 1); 1079 put_dct(s, block[5], 5, dest_cr, s->linesize >> 1);
1078 } 1080 }
1079 } 1081 }
1080 the_end: 1082 the_end:
1081 emms_c(); 1083 emms_c(); //FIXME remove
1084 }
1085
1086 static void encode_mb(MpegEncContext *s)
1087 {
1088 int wrap;
1089 const int mb_x= s->mb_x;
1090 const int mb_y= s->mb_y;
1091 UINT8 *ptr;
1092 const int motion_x= s->mv[0][0][0];
1093 const int motion_y= s->mv[0][0][1];
1094 int i;
1095
1096 /* get the pixels */
1097 wrap = s->linesize;
1098 ptr = s->new_picture[0] + (mb_y * 16 * wrap) + mb_x * 16;
1099 get_pixels(s->block[0], ptr, wrap);
1100 get_pixels(s->block[1], ptr + 8, wrap);
1101 get_pixels(s->block[2], ptr + 8 * wrap, wrap);
1102 get_pixels(s->block[3], ptr + 8 * wrap + 8, wrap);
1103 wrap = s->linesize >> 1;
1104 ptr = s->new_picture[1] + (mb_y * 8 * wrap) + mb_x * 8;
1105 get_pixels(s->block[4], ptr, wrap);
1106
1107 wrap = s->linesize >> 1;
1108 ptr = s->new_picture[2] + (mb_y * 8 * wrap) + mb_x * 8;
1109 get_pixels(s->block[5], ptr, wrap);
1110
1111 /* subtract previous frame if non intra */
1112 if (!s->mb_intra) {
1113 int dxy, offset, mx, my;
1114
1115 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
1116 ptr = s->last_picture[0] +
1117 ((mb_y * 16 + (motion_y >> 1)) * s->linesize) +
1118 (mb_x * 16 + (motion_x >> 1));
1119
1120 sub_pixels_2(s->block[0], ptr, s->linesize, dxy);
1121 sub_pixels_2(s->block[1], ptr + 8, s->linesize, dxy);
1122 sub_pixels_2(s->block[2], ptr + s->linesize * 8, s->linesize, dxy);
1123 sub_pixels_2(s->block[3], ptr + 8 + s->linesize * 8, s->linesize ,dxy);
1124
1125 if (s->out_format == FMT_H263) {
1126 /* special rounding for h263 */
1127 dxy = 0;
1128 if ((motion_x & 3) != 0)
1129 dxy |= 1;
1130 if ((motion_y & 3) != 0)
1131 dxy |= 2;
1132 mx = motion_x >> 2;
1133 my = motion_y >> 2;
1134 } else {
1135 mx = motion_x / 2;
1136 my = motion_y / 2;
1137 dxy = ((my & 1) << 1) | (mx & 1);
1138 mx >>= 1;
1139 my >>= 1;
1140 }
1141 offset = ((mb_y * 8 + my) * (s->linesize >> 1)) + (mb_x * 8 + mx);
1142 ptr = s->last_picture[1] + offset;
1143 sub_pixels_2(s->block[4], ptr, s->linesize >> 1, dxy);
1144 ptr = s->last_picture[2] + offset;
1145 sub_pixels_2(s->block[5], ptr, s->linesize >> 1, dxy);
1146 }
1147
1148 #if 0
1149 {
1150 float adap_parm;
1151
1152 adap_parm = ((s->avg_mb_var << 1) + s->mb_var[s->mb_width*mb_y+mb_x] + 1.0) /
1153 ((s->mb_var[s->mb_width*mb_y+mb_x] << 1) + s->avg_mb_var + 1.0);
1154
1155 printf("\ntype=%c qscale=%2d adap=%0.2f dquant=%4.2f var=%4d avgvar=%4d",
1156 (s->mb_type[s->mb_width*mb_y+mb_x] > 0) ? 'I' : 'P',
1157 s->qscale, adap_parm, s->qscale*adap_parm,
1158 s->mb_var[s->mb_width*mb_y+mb_x], s->avg_mb_var);
1159 }
1160 #endif
1161 /* DCT & quantize */
1162 if (s->h263_msmpeg4) {
1163 msmpeg4_dc_scale(s);
1164 } else if (s->h263_pred) {
1165 h263_dc_scale(s);
1166 } else {
1167 /* default quantization values */
1168 s->y_dc_scale = 8;
1169 s->c_dc_scale = 8;
1170 }
1171 for(i=0;i<6;i++) {
1172 s->block_last_index[i] = dct_quantize(s, s->block[i], i, s->qscale);
1173 }
1174
1175 /* huffman encode */
1176 switch(s->out_format) {
1177 case FMT_MPEG1:
1178 mpeg1_encode_mb(s, s->block, motion_x, motion_y);
1179 break;
1180 case FMT_H263:
1181 if (s->h263_msmpeg4)
1182 msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
1183 else if(s->h263_pred)
1184 mpeg4_encode_mb(s, s->block, motion_x, motion_y);
1185 else
1186 h263_encode_mb(s, s->block, motion_x, motion_y);
1187 break;
1188 case FMT_MJPEG:
1189 mjpeg_encode_mb(s, s->block);
1190 break;
1191 }
1192 }
1193
1194 static void copy_bits(PutBitContext *pb, UINT8 *src, int length)
1195 {
1196 int bytes= length>>3;
1197 int bits= length&7;
1198 int i;
1199
1200 for(i=0; i<bytes; i++) put_bits(pb, 8, src[i]);
1201 put_bits(pb, bits, src[i]>>(8-bits));
1082 } 1202 }
1083 1203
1084 static void encode_picture(MpegEncContext *s, int picture_number) 1204 static void encode_picture(MpegEncContext *s, int picture_number)
1085 { 1205 {
1086 int mb_x, mb_y, wrap, last_gob, pdif = 0; 1206 int mb_x, mb_y, last_gob, pdif = 0;
1087 UINT8 *ptr; 1207 int i;
1088 int i, motion_x, motion_y;
1089 int bits; 1208 int bits;
1209 MpegEncContext best_s;
1210 UINT8 bit_buf[4][3000]; //FIXME check that this is ALLWAYS large enogh for a MB
1090 1211
1091 s->picture_number = picture_number; 1212 s->picture_number = picture_number;
1092 1213
1214 s->block_wrap[0]=
1215 s->block_wrap[1]=
1216 s->block_wrap[2]=
1217 s->block_wrap[3]= s->mb_width*2 + 2;
1218 s->block_wrap[4]=
1219 s->block_wrap[5]= s->mb_width + 2;
1220
1093 s->last_mc_mb_var = s->mc_mb_var; 1221 s->last_mc_mb_var = s->mc_mb_var;
1094 /* Reset the average MB variance */ 1222 /* Reset the average MB variance */
1095 s->avg_mb_var = 0; 1223 s->avg_mb_var = 0;
1096 s->mc_mb_var = 0; 1224 s->mc_mb_var = 0;
1097 /* Estimate motion for every MB */ 1225 /* Estimate motion for every MB */
1098 for(mb_y=0; mb_y < s->mb_height; mb_y++) { 1226 if(s->pict_type == P_TYPE){
1099 for(mb_x=0; mb_x < s->mb_width; mb_x++) { 1227 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
1100 int xy= mb_y * s->mb_width + mb_x; 1228 s->block_index[0]= s->block_wrap[0]*(mb_y*2 + 1) - 1;
1101 const int mot_stride = s->mb_width*2 + 2; 1229 s->block_index[1]= s->block_wrap[0]*(mb_y*2 + 1);
1102 int mot_xy = (mb_y*2 + 1)*mot_stride + mb_x*2 + 1; 1230 s->block_index[2]= s->block_wrap[0]*(mb_y*2 + 2) - 1;
1103 s->mb_x = mb_x; 1231 s->block_index[3]= s->block_wrap[0]*(mb_y*2 + 2);
1104 s->mb_y = mb_y; 1232 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
1105 1233 s->mb_x = mb_x;
1106 /* compute motion vector and macro block type (intra or non intra) */ 1234 s->mb_y = mb_y;
1107 motion_x = 0; 1235 s->block_index[0]+=2;
1108 motion_y = 0; 1236 s->block_index[1]+=2;
1109 if (s->pict_type == P_TYPE) { 1237 s->block_index[2]+=2;
1110 s->mb_intra = estimate_motion(s, mb_x, mb_y, 1238 s->block_index[3]+=2;
1111 &motion_x, 1239
1112 &motion_y); 1240 /* compute motion vector & mb_type and store in context */
1113 } else { 1241 estimate_motion(s, mb_x, mb_y);
1114 s->mb_intra = 1; 1242 // s->mb_type[mb_y*s->mb_width + mb_x]=MB_TYPE_INTER;
1115 } 1243 }
1116 /* Store MB type and MV */ 1244 }
1117 s->mb_type[xy] = s->mb_intra; 1245 emms_c();
1118 s->mv_table[0][xy] = motion_x; 1246 }else{
1119 s->mv_table[1][xy] = motion_y; 1247 /* I-Frame */
1120 1248 //FIXME do we need to zero them?
1121 s->motion_val[mot_xy ][0]= motion_x; 1249 memset(s->motion_val[0], 0, sizeof(INT16)*(s->mb_width*2 + 2)*(s->mb_height*2 + 2)*2);
1122 s->motion_val[mot_xy ][1]= motion_y; 1250 memset(s->mv_table[0] , 0, sizeof(INT16)*s->mb_width*s->mb_height);
1123 s->motion_val[mot_xy+1][0]= motion_x; 1251 memset(s->mv_table[1] , 0, sizeof(INT16)*s->mb_width*s->mb_height);
1124 s->motion_val[mot_xy+1][1]= motion_y; 1252 memset(s->mb_type , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height);
1125 mot_xy += mot_stride; 1253 }
1126 s->motion_val[mot_xy ][0]= motion_x;
1127 s->motion_val[mot_xy ][1]= motion_y;
1128 s->motion_val[mot_xy+1][0]= motion_x;
1129 s->motion_val[mot_xy+1][1]= motion_y;
1130 }
1131 }
1132 emms_c();
1133 1254
1134 if(s->avg_mb_var < s->mc_mb_var && s->pict_type != B_TYPE){ //FIXME subtract MV bits 1255 if(s->avg_mb_var < s->mc_mb_var && s->pict_type != B_TYPE){ //FIXME subtract MV bits
1135 int i;
1136 s->pict_type= I_TYPE; 1256 s->pict_type= I_TYPE;
1137 s->picture_in_gop_number=0; 1257 s->picture_in_gop_number=0;
1138 for(i=0; i<s->mb_num; i++){ 1258 memset(s->mb_type , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height);
1139 s->mb_type[i] = 1; 1259 //printf("Scene change detected, encoding as I Frame\n");
1140 s->mv_table[0][i] = 0;
1141 s->mv_table[1][i] = 0;
1142 }
1143 } 1260 }
1144 1261
1145 /* find best f_code for ME which do unlimited searches */ 1262 /* find best f_code for ME which do unlimited searches */
1146 if(s->pict_type==P_TYPE && s->full_search>3){ 1263 if(s->pict_type==P_TYPE && s->full_search>3){
1147 int mv_num[8]; 1264 int mv_num[8];
1150 UINT8 * fcode_tab= s->fcode_tab; 1267 UINT8 * fcode_tab= s->fcode_tab;
1151 1268
1152 for(i=0; i<8; i++) mv_num[i]=0; 1269 for(i=0; i<8; i++) mv_num[i]=0;
1153 1270
1154 for(i=0; i<s->mb_num; i++){ 1271 for(i=0; i<s->mb_num; i++){
1155 if(s->mb_type[i] == 0){ 1272 if(s->mb_type[i] & (MB_TYPE_INTER|MB_TYPE_INTER4V)){
1156 mv_num[ fcode_tab[s->mv_table[0][i] + MAX_MV] ]++; 1273 mv_num[ fcode_tab[s->mv_table[0][i] + MAX_MV] ]++;
1157 mv_num[ fcode_tab[s->mv_table[1][i] + MAX_MV] ]++; 1274 mv_num[ fcode_tab[s->mv_table[1][i] + MAX_MV] ]++;
1158 //printf("%d %d %d\n", s->mv_table[0][i], fcode_tab[s->mv_table[0][i] + MAX_MV], i); 1275 //printf("%d %d %d\n", s->mv_table[0][i], fcode_tab[s->mv_table[0][i] + MAX_MV], i);
1159 } 1276 }
1160 //else printf("I"); 1277 //else printf("I");
1179 int i; 1296 int i;
1180 const int f_code= s->f_code; 1297 const int f_code= s->f_code;
1181 UINT8 * fcode_tab= s->fcode_tab; 1298 UINT8 * fcode_tab= s->fcode_tab;
1182 1299
1183 for(i=0; i<s->mb_num; i++){ 1300 for(i=0; i<s->mb_num; i++){
1184 if(s->mb_type[i] == 0){ 1301 if(s->mb_type[i]&MB_TYPE_INTER){
1185 if( fcode_tab[s->mv_table[0][i] + MAX_MV] > f_code 1302 if( fcode_tab[s->mv_table[0][i] + MAX_MV] > f_code
1186 || fcode_tab[s->mv_table[0][i] + MAX_MV] == 0 1303 || fcode_tab[s->mv_table[0][i] + MAX_MV] == 0
1187 || fcode_tab[s->mv_table[1][i] + MAX_MV] > f_code 1304 || fcode_tab[s->mv_table[1][i] + MAX_MV] > f_code
1188 || fcode_tab[s->mv_table[1][i] + MAX_MV] == 0 ){ 1305 || fcode_tab[s->mv_table[1][i] + MAX_MV] == 0 ){
1189 s->mb_type[i] = 1; 1306 s->mb_type[i] &= ~MB_TYPE_INTER;
1307 s->mb_type[i] |= MB_TYPE_INTRA;
1190 s->mv_table[0][i] = 0; 1308 s->mv_table[0][i] = 0;
1191 s->mv_table[1][i] = 0; 1309 s->mv_table[1][i] = 0;
1192 } 1310 }
1311 }
1312 if(s->mb_type[i]&MB_TYPE_INTER4V){
1313 //FIXME
1193 } 1314 }
1194 } 1315 }
1195 } 1316 }
1196 1317
1197 // printf("%d %d\n", s->avg_mb_var, s->mc_mb_var); 1318 // printf("%d %d\n", s->avg_mb_var, s->mc_mb_var);
1247 s->last_dc[1] = 128; 1368 s->last_dc[1] = 128;
1248 s->last_dc[2] = 128; 1369 s->last_dc[2] = 128;
1249 s->mb_incr = 1; 1370 s->mb_incr = 1;
1250 s->last_mv[0][0][0] = 0; 1371 s->last_mv[0][0][0] = 0;
1251 s->last_mv[0][0][1] = 0; 1372 s->last_mv[0][0][1] = 0;
1252 s->mv_type = MV_TYPE_16X16;
1253 s->mv_dir = MV_DIR_FORWARD;
1254 1373
1255 /* Get the GOB height based on picture height */ 1374 /* Get the GOB height based on picture height */
1256 if (s->out_format == FMT_H263 && !s->h263_pred && !s->h263_msmpeg4) { 1375 if (s->out_format == FMT_H263 && !s->h263_pred && !s->h263_msmpeg4) {
1257 if (s->height <= 400) 1376 if (s->height <= 400)
1258 s->gob_index = 1; 1377 s->gob_index = 1;
1262 s->gob_index = 4; 1381 s->gob_index = 4;
1263 } 1382 }
1264 1383
1265 s->avg_mb_var = s->avg_mb_var / s->mb_num; 1384 s->avg_mb_var = s->avg_mb_var / s->mb_num;
1266 1385
1267 s->block_wrap[0]=
1268 s->block_wrap[1]=
1269 s->block_wrap[2]=
1270 s->block_wrap[3]= s->mb_width*2 + 2;
1271 s->block_wrap[4]=
1272 s->block_wrap[5]= s->mb_width + 2;
1273 for(mb_y=0; mb_y < s->mb_height; mb_y++) { 1386 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
1274 /* Put GOB header based on RTP MTU */ 1387 /* Put GOB header based on RTP MTU */
1275 /* TODO: Put all this stuff in a separate generic function */ 1388 /* TODO: Put all this stuff in a separate generic function */
1276 if (s->rtp_mode) { 1389 if (s->rtp_mode) {
1277 if (!mb_y) { 1390 if (!mb_y) {
1290 s->block_index[2]= s->block_wrap[0]*(mb_y*2 + 2) - 1; 1403 s->block_index[2]= s->block_wrap[0]*(mb_y*2 + 2) - 1;
1291 s->block_index[3]= s->block_wrap[0]*(mb_y*2 + 2); 1404 s->block_index[3]= s->block_wrap[0]*(mb_y*2 + 2);
1292 s->block_index[4]= s->block_wrap[4]*(mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2); 1405 s->block_index[4]= s->block_wrap[4]*(mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2);
1293 s->block_index[5]= s->block_wrap[4]*(mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2); 1406 s->block_index[5]= s->block_wrap[4]*(mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2);
1294 for(mb_x=0; mb_x < s->mb_width; mb_x++) { 1407 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
1408 const int mb_type= s->mb_type[mb_y * s->mb_width + mb_x];
1409 PutBitContext pb;
1410 int d;
1411 int dmin=10000000;
1412 int best=0;
1295 1413
1296 s->mb_x = mb_x; 1414 s->mb_x = mb_x;
1297 s->mb_y = mb_y; 1415 s->mb_y = mb_y;
1298 s->block_index[0]+=2; 1416 s->block_index[0]+=2;
1299 s->block_index[1]+=2; 1417 s->block_index[1]+=2;
1300 s->block_index[2]+=2; 1418 s->block_index[2]+=2;
1301 s->block_index[3]+=2; 1419 s->block_index[3]+=2;
1302 s->block_index[4]++; 1420 s->block_index[4]++;
1303 s->block_index[5]++; 1421 s->block_index[5]++;
1304 #if 0 1422
1305 /* compute motion vector and macro block type (intra or non intra) */ 1423 s->mv_type = MV_TYPE_16X16;
1306 motion_x = 0; 1424 s->mv_dir = MV_DIR_FORWARD;
1307 motion_y = 0; 1425 if(mb_type & (mb_type-1)){ // more than 1 MB type possible
1308 if (s->pict_type == P_TYPE) { 1426 pb= s->pb;
1309 s->mb_intra = estimate_motion(s, mb_x, mb_y, 1427 if(mb_type&MB_TYPE_INTER){
1310 &motion_x, 1428 s->mb_intra= 0;
1311 &motion_y); 1429 s->mv[0][0][0] = s->mv_table[0][mb_y * s->mb_width + mb_x];
1430 s->mv[0][0][1] = s->mv_table[1][mb_y * s->mb_width + mb_x];
1431 init_put_bits(&s->pb, bit_buf[1], 3000, NULL, NULL);
1432 s->block= s->inter_block;
1433
1434 encode_mb(s);
1435 d= get_bit_count(&s->pb);
1436 if(d<dmin){
1437 flush_put_bits(&s->pb);
1438 dmin=d;
1439 best_s.mv[0][0][0]= s->mv[0][0][0];
1440 best_s.mv[0][0][1]= s->mv[0][0][1];
1441 best_s.mb_intra= 0;
1442 best_s.pb=s->pb;
1443 best_s.block= s->block;
1444 best=1;
1445 for(i=0; i<6; i++)
1446 best_s.block_last_index[i]= s->block_last_index[i];
1447 }
1448 }
1449 if(mb_type&MB_TYPE_INTRA){
1450 s->mb_intra= 1;
1451 s->mv[0][0][0] = 0;
1452 s->mv[0][0][1] = 0;
1453 init_put_bits(&s->pb, bit_buf[0], 3000, NULL, NULL);
1454 s->block= s->intra_block;
1455
1456 encode_mb(s);
1457 d= get_bit_count(&s->pb);
1458 if(d<dmin){
1459 flush_put_bits(&s->pb);
1460 dmin=d;
1461 best_s.mv[0][0][0]= 0;
1462 best_s.mv[0][0][1]= 0;
1463 best_s.mb_intra= 1;
1464 best_s.pb=s->pb;
1465 best_s.block= s->block;
1466 for(i=0; i<6; i++)
1467 best_s.block_last_index[i]= s->block_last_index[i];
1468 best=0;
1469 }
1470 /* force cleaning of ac/dc if needed ... */
1471 s->mbintra_table[mb_x + mb_y*s->mb_width]=1;
1472 }
1473 s->mv[0][0][0]= best_s.mv[0][0][0];
1474 s->mv[0][0][1]= best_s.mv[0][0][1];
1475 s->mb_intra= best_s.mb_intra;
1476 for(i=0; i<6; i++)
1477 s->block_last_index[i]= best_s.block_last_index[i];
1478 copy_bits(&pb, bit_buf[best], dmin);
1479 s->block= best_s.block;
1480 s->pb= pb;
1312 } else { 1481 } else {
1313 s->mb_intra = 1; 1482 // only one MB-Type possible
1483 if(mb_type&MB_TYPE_INTRA){
1484 s->mb_intra= 1;
1485 s->mv[0][0][0] = 0;
1486 s->mv[0][0][1] = 0;
1487 }else{
1488 s->mb_intra= 0;
1489 s->mv[0][0][0] = s->mv_table[0][mb_y * s->mb_width + mb_x];
1490 s->mv[0][0][1] = s->mv_table[1][mb_y * s->mb_width + mb_x];
1491 }
1492 encode_mb(s);
1314 } 1493 }
1315 #endif
1316
1317 s->mb_intra = s->mb_type[mb_y * s->mb_width + mb_x];
1318 motion_x = s->mv_table[0][mb_y * s->mb_width + mb_x];
1319 motion_y = s->mv_table[1][mb_y * s->mb_width + mb_x];
1320
1321 /* get the pixels */
1322 wrap = s->linesize;
1323 ptr = s->new_picture[0] + (mb_y * 16 * wrap) + mb_x * 16;
1324 get_pixels(s->block[0], ptr, wrap);
1325 get_pixels(s->block[1], ptr + 8, wrap);
1326 get_pixels(s->block[2], ptr + 8 * wrap, wrap);
1327 get_pixels(s->block[3], ptr + 8 * wrap + 8, wrap);
1328 wrap = s->linesize >> 1;
1329 ptr = s->new_picture[1] + (mb_y * 8 * wrap) + mb_x * 8;
1330 get_pixels(s->block[4], ptr, wrap);
1331
1332 wrap = s->linesize >> 1;
1333 ptr = s->new_picture[2] + (mb_y * 8 * wrap) + mb_x * 8;
1334 get_pixels(s->block[5], ptr, wrap);
1335
1336 /* subtract previous frame if non intra */
1337 if (!s->mb_intra) {
1338 int dxy, offset, mx, my;
1339
1340 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
1341 ptr = s->last_picture[0] +
1342 ((mb_y * 16 + (motion_y >> 1)) * s->linesize) +
1343 (mb_x * 16 + (motion_x >> 1));
1344
1345 sub_pixels_2(s->block[0], ptr, s->linesize, dxy);
1346 sub_pixels_2(s->block[1], ptr + 8, s->linesize, dxy);
1347 sub_pixels_2(s->block[2], ptr + s->linesize * 8, s->linesize, dxy);
1348 sub_pixels_2(s->block[3], ptr + 8 + s->linesize * 8, s->linesize ,dxy);
1349
1350 if (s->out_format == FMT_H263) {
1351 /* special rounding for h263 */
1352 dxy = 0;
1353 if ((motion_x & 3) != 0)
1354 dxy |= 1;
1355 if ((motion_y & 3) != 0)
1356 dxy |= 2;
1357 mx = motion_x >> 2;
1358 my = motion_y >> 2;
1359 } else {
1360 mx = motion_x / 2;
1361 my = motion_y / 2;
1362 dxy = ((my & 1) << 1) | (mx & 1);
1363 mx >>= 1;
1364 my >>= 1;
1365 }
1366 offset = ((mb_y * 8 + my) * (s->linesize >> 1)) + (mb_x * 8 + mx);
1367 ptr = s->last_picture[1] + offset;
1368 sub_pixels_2(s->block[4], ptr, s->linesize >> 1, dxy);
1369 ptr = s->last_picture[2] + offset;
1370 sub_pixels_2(s->block[5], ptr, s->linesize >> 1, dxy);
1371 }
1372 emms_c();
1373
1374 #if 0
1375 {
1376 float adap_parm;
1377
1378 adap_parm = ((s->avg_mb_var << 1) + s->mb_var[s->mb_width*mb_y+mb_x] + 1.0) /
1379 ((s->mb_var[s->mb_width*mb_y+mb_x] << 1) + s->avg_mb_var + 1.0);
1380
1381 printf("\ntype=%c qscale=%2d adap=%0.2f dquant=%4.2f var=%4d avgvar=%4d",
1382 (s->mb_type[s->mb_width*mb_y+mb_x] > 0) ? 'I' : 'P',
1383 s->qscale, adap_parm, s->qscale*adap_parm,
1384 s->mb_var[s->mb_width*mb_y+mb_x], s->avg_mb_var);
1385 }
1386 #endif
1387 /* DCT & quantize */
1388 if (s->h263_msmpeg4) {
1389 msmpeg4_dc_scale(s);
1390 } else if (s->h263_pred) {
1391 h263_dc_scale(s);
1392 } else {
1393 /* default quantization values */
1394 s->y_dc_scale = 8;
1395 s->c_dc_scale = 8;
1396 }
1397 for(i=0;i<6;i++) {
1398 s->block_last_index[i] = dct_quantize(s, s->block[i], i, s->qscale);
1399 }
1400
1401 /* huffman encode */
1402 switch(s->out_format) {
1403 case FMT_MPEG1:
1404 mpeg1_encode_mb(s, s->block, motion_x, motion_y);
1405 break;
1406 case FMT_H263:
1407 if (s->h263_msmpeg4)
1408 msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
1409 else if(s->h263_pred)
1410 mpeg4_encode_mb(s, s->block, motion_x, motion_y);
1411 else
1412 h263_encode_mb(s, s->block, motion_x, motion_y);
1413 break;
1414 case FMT_MJPEG:
1415 mjpeg_encode_mb(s, s->block);
1416 break;
1417 }
1418
1419 /* decompress blocks so that we keep the state of the decoder */
1420 s->mv[0][0][0] = motion_x;
1421 s->mv[0][0][1] = motion_y;
1422 1494
1423 MPV_decode_mb(s, s->block); 1495 MPV_decode_mb(s, s->block);
1424 } 1496 }
1425 1497
1426 1498
1435 //fprintf(stderr, "\nMB line: %d\tSize: %u\tAvg. Size: %u", s->mb_y, 1507 //fprintf(stderr, "\nMB line: %d\tSize: %u\tAvg. Size: %u", s->mb_y,
1436 // (s->pb.buf_ptr - s->ptr_last_mb_line), s->mb_line_avgsize); 1508 // (s->pb.buf_ptr - s->ptr_last_mb_line), s->mb_line_avgsize);
1437 s->first_gob_line = 0; 1509 s->first_gob_line = 0;
1438 } 1510 }
1439 } 1511 }
1512 emms_c();
1440 1513
1441 if (s->h263_msmpeg4 && s->pict_type == I_TYPE) 1514 if (s->h263_msmpeg4 && s->pict_type == I_TYPE)
1442 msmpeg4_encode_ext_header(s); 1515 msmpeg4_encode_ext_header(s);
1443 1516
1444 //if (s->gob_number) 1517 //if (s->gob_number)
1452 if (s->rtp_callback) 1525 if (s->rtp_callback)
1453 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number); 1526 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
1454 s->ptr_lastgob = pbBufPtr(&s->pb); 1527 s->ptr_lastgob = pbBufPtr(&s->pb);
1455 //fprintf(stderr,"\nGOB: %2d size: %d (last)", s->gob_number, pdif); 1528 //fprintf(stderr,"\nGOB: %2d size: %d (last)", s->gob_number, pdif);
1456 } 1529 }
1457
1458 } 1530 }
1459 1531
1460 static int dct_quantize_c(MpegEncContext *s, 1532 static int dct_quantize_c(MpegEncContext *s,
1461 DCTELEM *block, int n, 1533 DCTELEM *block, int n,
1462 int qscale) 1534 int qscale)