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