258 |
n_ptr = refn->y; |
n_ptr = refn->y; |
259 |
h_ptr = refh->y; |
h_ptr = refh->y; |
260 |
v_ptr = refv->y; |
v_ptr = refv->y; |
|
hv_ptr = refhv->y; |
|
261 |
|
|
262 |
n_ptr -= offset; |
n_ptr -= offset; |
263 |
h_ptr -= offset; |
h_ptr -= offset; |
264 |
v_ptr -= offset; |
v_ptr -= offset; |
|
hv_ptr -= offset; |
|
265 |
|
|
266 |
|
/* Note we initialize the hv pointer later, as we can optimize code a bit |
267 |
|
* doing it down to up in quarterpel and up to down in halfpel */ |
268 |
if(quarterpel) { |
if(quarterpel) { |
269 |
|
|
270 |
for (y = 0; y < (edged_height - EDGE_SIZE); y += 8) { |
for (y = 0; y < (edged_height - EDGE_SIZE); y += 8) { |
286 |
n_ptr += stride_add; |
n_ptr += stride_add; |
287 |
} |
} |
288 |
|
|
289 |
h_ptr = refh->y; |
h_ptr = refh->y + (edged_height - EDGE_SIZE - EDGE_SIZE2)*edged_width - EDGE_SIZE2; |
290 |
h_ptr -= offset; |
hv_ptr = refhv->y + (edged_height - EDGE_SIZE - EDGE_SIZE2)*edged_width - EDGE_SIZE2; |
291 |
|
|
292 |
for (y = 0; y < (edged_height - EDGE_SIZE); y = y + 8) { |
for (y = 0; y < (edged_height - EDGE_SIZE); y = y + 8) { |
293 |
|
hv_ptr -= stride_add; |
294 |
|
h_ptr -= stride_add; |
295 |
|
hv_ptr -= EDGE_SIZE; |
296 |
|
h_ptr -= EDGE_SIZE; |
297 |
|
|
298 |
for (x = 0; x < (edged_width - EDGE_SIZE); x = x + 8) { |
for (x = 0; x < (edged_width - EDGE_SIZE); x = x + 8) { |
299 |
|
hv_ptr -= 8; |
300 |
|
h_ptr -= 8; |
301 |
interpolate8x8_6tap_lowpass_v(hv_ptr, h_ptr, edged_width, rounding); |
interpolate8x8_6tap_lowpass_v(hv_ptr, h_ptr, edged_width, rounding); |
|
hv_ptr += 8; |
|
|
h_ptr += 8; |
|
|
} |
|
|
|
|
|
hv_ptr += EDGE_SIZE; |
|
|
h_ptr += EDGE_SIZE; |
|
|
|
|
|
hv_ptr += stride_add; |
|
|
h_ptr += stride_add; |
|
302 |
} |
} |
303 |
} |
} |
304 |
else { |
} else { |
305 |
|
|
306 |
|
hv_ptr = refhv->y; |
307 |
|
hv_ptr -= offset; |
308 |
|
|
309 |
for (y = 0; y < (edged_height - EDGE_SIZE); y += 8) { |
for (y = 0; y < (edged_height - EDGE_SIZE); y += 8) { |
310 |
for (x = 0; x < (edged_width - EDGE_SIZE); x += 8) { |
for (x = 0; x < (edged_width - EDGE_SIZE); x += 8) { |
599 |
interlacing?rgbai_to_yv12_c:rgba_to_yv12_c, 4); |
interlacing?rgbai_to_yv12_c:rgba_to_yv12_c, 4); |
600 |
break; |
break; |
601 |
|
|
602 |
|
case XVID_CSP_ARGB: |
603 |
|
safe_packed_conv( |
604 |
|
src[0], src_stride[0], image->y, image->u, image->v, |
605 |
|
edged_width, edged_width2, width, height, (csp & XVID_CSP_VFLIP), |
606 |
|
interlacing?argbi_to_yv12 : argb_to_yv12, |
607 |
|
interlacing?argbi_to_yv12_c: argb_to_yv12_c, 4); |
608 |
|
break; |
609 |
|
|
610 |
case XVID_CSP_YUY2: |
case XVID_CSP_YUY2: |
611 |
safe_packed_conv( |
safe_packed_conv( |
612 |
src[0], src_stride[0], image->y, image->u, image->v, |
src[0], src_stride[0], image->y, image->u, image->v, |
631 |
interlacing?uyvyi_to_yv12_c:uyvy_to_yv12_c, 2); |
interlacing?uyvyi_to_yv12_c:uyvy_to_yv12_c, 2); |
632 |
break; |
break; |
633 |
|
|
634 |
case XVID_CSP_I420: |
case XVID_CSP_YV12: /* YCrCb == internal colorspace for MPEG */ |
635 |
yv12_to_yv12(image->y, image->u, image->v, edged_width, edged_width2, |
yv12_to_yv12(image->y, image->u, image->v, edged_width, edged_width2, |
636 |
src[0], src[0] + src_stride[0]*height, src[0] + src_stride[0]*height + (src_stride[0]/2)*height2, |
src[0], src[0] + src_stride[0]*height, src[0] + src_stride[0]*height + (src_stride[0]/2)*height2, |
637 |
src_stride[0], src_stride[0]/2, width, height, (csp & XVID_CSP_VFLIP)); |
src_stride[0], src_stride[0]/2, width, height, (csp & XVID_CSP_VFLIP)); |
638 |
break |
break; |
639 |
; |
|
640 |
case XVID_CSP_YV12: /* u/v swapped */ |
case XVID_CSP_I420: /* YCbCr == U and V plane swapped */ |
641 |
yv12_to_yv12(image->y, image->v, image->u, edged_width, edged_width2, |
yv12_to_yv12(image->y, image->v, image->u, edged_width, edged_width2, |
642 |
src[0], src[0] + src_stride[0]*height, src[0] + src_stride[0]*height + (src_stride[0]/2)*height2, |
src[0], src[0] + src_stride[0]*height, src[0] + src_stride[0]*height + (src_stride[0]/2)*height2, |
643 |
src_stride[0], src_stride[0]/2, width, height, (csp & XVID_CSP_VFLIP)); |
src_stride[0], src_stride[0]/2, width, height, (csp & XVID_CSP_VFLIP)); |
644 |
break; |
break; |
645 |
|
|
646 |
case XVID_CSP_USER: |
case XVID_CSP_PLANAR: /* YCbCr with arbitrary pointers and different strides for Y and UV */ |
|
/*XXX: support for different u & v strides */ |
|
647 |
yv12_to_yv12(image->y, image->u, image->v, edged_width, edged_width2, |
yv12_to_yv12(image->y, image->u, image->v, edged_width, edged_width2, |
648 |
src[0], src[1], src[2], src_stride[0], src_stride[1], |
src[0], src[1], src[2], src_stride[0], src_stride[1], /* v: dst_stride[2] not yet supported */ |
649 |
width, height, (csp & XVID_CSP_VFLIP)); |
width, height, (csp & XVID_CSP_VFLIP)); |
650 |
break; |
break; |
651 |
|
|
775 |
interlacing?yv12_to_rgbai_c:yv12_to_rgba_c, 4); |
interlacing?yv12_to_rgbai_c:yv12_to_rgba_c, 4); |
776 |
return 0; |
return 0; |
777 |
|
|
778 |
|
case XVID_CSP_ARGB: |
779 |
|
safe_packed_conv( |
780 |
|
dst[0], dst_stride[0], image->y, image->u, image->v, |
781 |
|
edged_width, edged_width2, width, height, (csp & XVID_CSP_VFLIP), |
782 |
|
interlacing?yv12_to_argbi :yv12_to_argb, |
783 |
|
interlacing?yv12_to_argbi_c:yv12_to_argb_c, 4); |
784 |
|
return 0; |
785 |
|
|
786 |
case XVID_CSP_YUY2: |
case XVID_CSP_YUY2: |
787 |
safe_packed_conv( |
safe_packed_conv( |
788 |
dst[0], dst_stride[0], image->y, image->u, image->v, |
dst[0], dst_stride[0], image->y, image->u, image->v, |
807 |
interlacing?yv12_to_uyvyi_c:yv12_to_uyvy_c, 2); |
interlacing?yv12_to_uyvyi_c:yv12_to_uyvy_c, 2); |
808 |
return 0; |
return 0; |
809 |
|
|
810 |
case XVID_CSP_I420: |
case XVID_CSP_YV12: /* YCbCr == internal colorspace for MPEG */ |
811 |
yv12_to_yv12(dst[0], dst[0] + dst_stride[0]*height, dst[0] + dst_stride[0]*height + (dst_stride[0]/2)*height2, |
yv12_to_yv12(dst[0], dst[0] + dst_stride[0]*height, dst[0] + dst_stride[0]*height + (dst_stride[0]/2)*height2, |
812 |
dst_stride[0], dst_stride[0]/2, |
dst_stride[0], dst_stride[0]/2, |
813 |
image->y, image->u, image->v, edged_width, edged_width2, |
image->y, image->u, image->v, edged_width, edged_width2, |
814 |
width, height, (csp & XVID_CSP_VFLIP)); |
width, height, (csp & XVID_CSP_VFLIP)); |
815 |
return 0; |
return 0; |
816 |
|
|
817 |
case XVID_CSP_YV12: /* u,v swapped */ |
case XVID_CSP_I420: /* YCrCb == U and V plane swapped */ |
818 |
yv12_to_yv12(dst[0], dst[0] + dst_stride[0]*height, dst[0] + dst_stride[0]*height + (dst_stride[0]/2)*height2, |
yv12_to_yv12(dst[0], dst[0] + dst_stride[0]*height, dst[0] + dst_stride[0]*height + (dst_stride[0]/2)*height2, |
819 |
dst_stride[0], dst_stride[0]/2, |
dst_stride[0], dst_stride[0]/2, |
820 |
image->y, image->v, image->u, edged_width, edged_width2, |
image->y, image->v, image->u, edged_width, edged_width2, |
821 |
width, height, (csp & XVID_CSP_VFLIP)); |
width, height, (csp & XVID_CSP_VFLIP)); |
822 |
return 0; |
return 0; |
823 |
|
|
824 |
case XVID_CSP_USER : /* u,v swapped */ |
case XVID_CSP_PLANAR: /* YCbCr with arbitrary pointers and different strides for Y and UV */ |
825 |
yv12_to_yv12(dst[0], dst[1], dst[2], |
yv12_to_yv12(dst[0], dst[1], dst[2], |
826 |
dst_stride[0], dst_stride[1], /* v: dst_stride[2] */ |
dst_stride[0], dst_stride[1], /* v: dst_stride[2] not yet supported */ |
827 |
image->y, image->v, image->u, edged_width, edged_width2, |
image->y, image->u, image->v, edged_width, edged_width2, |
828 |
width, height, (csp & XVID_CSP_VFLIP)); |
width, height, (csp & XVID_CSP_VFLIP)); |
829 |
return 0; |
return 0; |
830 |
|
|