comparison mpegvideo.c @ 671:3f2e5a282f61 libavcodec

interlaced qpel mpeg4 fixed
author michaelni
date Sat, 14 Sep 2002 10:11:05 +0000
parents 00a882f626bd
children 242f0f7d8c15
comparison
equal deleted inserted replaced
670:340e3ba84119 671:3f2e5a282f61
1159 int field_based, op_pixels_func (*pix_op)[4], 1159 int field_based, op_pixels_func (*pix_op)[4],
1160 qpel_mc_func (*qpix_op)[16], 1160 qpel_mc_func (*qpix_op)[16],
1161 int motion_x, int motion_y, int h) 1161 int motion_x, int motion_y, int h)
1162 { 1162 {
1163 UINT8 *ptr; 1163 UINT8 *ptr;
1164 int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, linesize; 1164 int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, linesize, uvlinesize;
1165 int emu=0; 1165 int emu=0;
1166 1166
1167 dxy = ((motion_y & 3) << 2) | (motion_x & 3); 1167 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
1168 src_x = s->mb_x * 16 + (motion_x >> 2); 1168 src_x = s->mb_x * 16 + (motion_x >> 2);
1169 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2); 1169 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
1175 dxy &= ~3; 1175 dxy &= ~3;
1176 src_y = clip(src_y, -16, height); 1176 src_y = clip(src_y, -16, height);
1177 if (src_y == height) 1177 if (src_y == height)
1178 dxy &= ~12; 1178 dxy &= ~12;
1179 linesize = s->linesize << field_based; 1179 linesize = s->linesize << field_based;
1180 uvlinesize = s->uvlinesize << field_based;
1180 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset; 1181 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset;
1181 dest_y += dest_offset; 1182 dest_y += dest_offset;
1182 //printf("%d %d %d\n", src_x, src_y, dxy); 1183 //printf("%d %d %d\n", src_x, src_y, dxy);
1183 1184
1184 if(s->flags&CODEC_FLAG_EMU_EDGE){ 1185 if(s->flags&CODEC_FLAG_EMU_EDGE){
1187 emulated_edge_mc(s, ptr, linesize, 17, h+1, src_x, src_y, s->h_edge_pos, v_edge_pos); 1188 emulated_edge_mc(s, ptr, linesize, 17, h+1, src_x, src_y, s->h_edge_pos, v_edge_pos);
1188 ptr= s->edge_emu_buffer; 1189 ptr= s->edge_emu_buffer;
1189 emu=1; 1190 emu=1;
1190 } 1191 }
1191 } 1192 }
1192 qpix_op[0][dxy](dest_y, ptr, linesize); 1193 if(!field_based)
1194 qpix_op[0][dxy](dest_y, ptr, linesize);
1195 else{
1196 //damn interlaced mode
1197 //FIXME boundary mirroring is not exactly correct here
1198 qpix_op[1][dxy](dest_y , ptr , linesize);
1199 qpix_op[1][dxy](dest_y+8, ptr+8, linesize);
1200 }
1193 1201
1194 if(s->flags&CODEC_FLAG_GRAY) return; 1202 if(s->flags&CODEC_FLAG_GRAY) return;
1195 1203
1196 mx= (motion_x>>1) | (motion_x&1); 1204 if(field_based){
1197 my= (motion_y>>1) | (motion_y&1); 1205 mx= motion_x/2;
1198 1206 my= motion_y>>1;
1199 dxy = 0; 1207 }else if(s->divx_version){
1200 if ((mx & 3) != 0) 1208 mx= (motion_x>>1)|(motion_x&1);
1201 dxy |= 1; 1209 my= (motion_y>>1)|(motion_y&1);
1202 if ((my & 3) != 0) 1210 }else{
1203 dxy |= 2; 1211 mx= motion_x/2;
1204 mx = mx >> 2; 1212 my= motion_y/2;
1205 my = my >> 2; 1213 }
1206 1214 mx= (mx>>1)|(mx&1);
1215 my= (my>>1)|(my&1);
1216 dxy= (mx&1) | ((my&1)<<1);
1217 mx>>=1;
1218 my>>=1;
1219
1207 src_x = s->mb_x * 8 + mx; 1220 src_x = s->mb_x * 8 + mx;
1208 src_y = s->mb_y * (8 >> field_based) + my; 1221 src_y = s->mb_y * (8 >> field_based) + my;
1209 src_x = clip(src_x, -8, s->width >> 1); 1222 src_x = clip(src_x, -8, s->width >> 1);
1210 if (src_x == (s->width >> 1)) 1223 if (src_x == (s->width >> 1))
1211 dxy &= ~1; 1224 dxy &= ~1;
1212 src_y = clip(src_y, -8, height >> 1); 1225 src_y = clip(src_y, -8, height >> 1);
1213 if (src_y == (height >> 1)) 1226 if (src_y == (height >> 1))
1214 dxy &= ~2; 1227 dxy &= ~2;
1215 1228
1216 offset = (src_y * s->uvlinesize) + src_x + (src_offset >> 1); 1229 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);
1217 ptr = ref_picture[1] + offset; 1230 ptr = ref_picture[1] + offset;
1218 if(emu){ 1231 if(emu){
1219 emulated_edge_mc(s, ptr, s->uvlinesize, 9, (h>>1)+1, src_x, src_y, s->h_edge_pos>>1, v_edge_pos>>1); 1232 emulated_edge_mc(s, ptr, uvlinesize, 9, (h>>1)+1, src_x, src_y, s->h_edge_pos>>1, v_edge_pos>>1);
1220 ptr= s->edge_emu_buffer; 1233 ptr= s->edge_emu_buffer;
1221 } 1234 }
1222 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, s->uvlinesize, h >> 1); 1235 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1223 1236
1224 ptr = ref_picture[2] + offset; 1237 ptr = ref_picture[2] + offset;
1225 if(emu){ 1238 if(emu){
1226 emulated_edge_mc(s, ptr, s->uvlinesize, 9, (h>>1)+1, src_x, src_y, s->h_edge_pos>>1, v_edge_pos>>1); 1239 emulated_edge_mc(s, ptr, uvlinesize, 9, (h>>1)+1, src_x, src_y, s->h_edge_pos>>1, v_edge_pos>>1);
1227 ptr= s->edge_emu_buffer; 1240 ptr= s->edge_emu_buffer;
1228 } 1241 }
1229 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, s->uvlinesize, h >> 1); 1242 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1230 } 1243 }
1231 1244
1232 1245
1233 static inline void MPV_motion(MpegEncContext *s, 1246 static inline void MPV_motion(MpegEncContext *s,
1234 UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr, 1247 UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
1260 0, pix_op, 1273 0, pix_op,
1261 s->mv[dir][0][0], s->mv[dir][0][1], 16); 1274 s->mv[dir][0][0], s->mv[dir][0][1], 16);
1262 } 1275 }
1263 break; 1276 break;
1264 case MV_TYPE_8X8: 1277 case MV_TYPE_8X8:
1278 if(s->quarter_sample){ fprintf(stderr, "qpel4mv"); fflush(stderr);}
1265 for(i=0;i<4;i++) { 1279 for(i=0;i<4;i++) {
1266 motion_x = s->mv[dir][i][0]; 1280 motion_x = s->mv[dir][i][0];
1267 motion_y = s->mv[dir][i][1]; 1281 motion_y = s->mv[dir][i][1];
1268 1282
1269 dxy = ((motion_y & 1) << 1) | (motion_x & 1); 1283 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
1343 } 1357 }
1344 pix_op[1][dxy](dest_cr, ptr, s->uvlinesize, 8); 1358 pix_op[1][dxy](dest_cr, ptr, s->uvlinesize, 8);
1345 break; 1359 break;
1346 case MV_TYPE_FIELD: 1360 case MV_TYPE_FIELD:
1347 if (s->picture_structure == PICT_FRAME) { 1361 if (s->picture_structure == PICT_FRAME) {
1348 /* top field */ 1362 if(s->quarter_sample){
1349 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0, 1363 /* top field */
1350 ref_picture, s->field_select[dir][0] ? s->linesize : 0, 1364 qpel_motion(s, dest_y, dest_cb, dest_cr, 0,
1351 1, pix_op, 1365 ref_picture, s->field_select[dir][0] ? s->linesize : 0,
1352 s->mv[dir][0][0], s->mv[dir][0][1], 8); 1366 1, pix_op, qpix_op,
1353 /* bottom field */ 1367 s->mv[dir][0][0], s->mv[dir][0][1], 8);
1354 mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize, 1368 /* bottom field */
1355 ref_picture, s->field_select[dir][1] ? s->linesize : 0, 1369 qpel_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
1356 1, pix_op, 1370 ref_picture, s->field_select[dir][1] ? s->linesize : 0,
1357 s->mv[dir][1][0], s->mv[dir][1][1], 8); 1371 1, pix_op, qpix_op,
1372 s->mv[dir][1][0], s->mv[dir][1][1], 8);
1373 }else{
1374 /* top field */
1375 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
1376 ref_picture, s->field_select[dir][0] ? s->linesize : 0,
1377 1, pix_op,
1378 s->mv[dir][0][0], s->mv[dir][0][1], 8);
1379 /* bottom field */
1380 mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
1381 ref_picture, s->field_select[dir][1] ? s->linesize : 0,
1382 1, pix_op,
1383 s->mv[dir][1][0], s->mv[dir][1][1], 8);
1384 }
1358 } else { 1385 } else {
1359 1386
1360 1387
1361 } 1388 }
1362 break; 1389 break;