--- image.c 2002/09/04 03:45:45 1.20 +++ image.c 2002/10/05 21:31:14 1.20.2.4 @@ -3,6 +3,15 @@ * XVID MPEG-4 VIDEO CODEC * image stuff * + * This program is an implementation of a part of one or more MPEG-4 + * Video tools as specified in ISO/IEC 14496-2 standard. Those intending + * to use this software module in hardware or software products are + * advised that its use may infringe existing patents or copyrights, and + * any such use would be at such party's own risk. The original + * developer of this software module and his/her company, and subsequent + * editors and their companies, will have no liability for use of this + * software or modifications or derivatives thereof. + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -23,11 +32,12 @@ * * History: * + * 05.10.2002 support for interpolated images in qpel mode - Isibaar * 01.05.2002 BFRAME image-based u,v interpolation * 22.04.2002 added some B-frame support * 14.04.2002 added image_dump_yuvpgm(), added image_mad() * XVID_CSP_USER input support - * 09.04.2002 PSNR calculations + * 09.04.2002 PSNR calculations - Isibaar * 06.04.2002 removed interlaced edging from U,V blocks (as per spec) * 26.03.2002 interlacing support (field-based edging in set_edges) * 26.01.2002 rgb555, rgb565 @@ -151,8 +161,7 @@ uint32_t edged_width, uint32_t edged_height, uint32_t width, - uint32_t height, - uint32_t interlacing) + uint32_t height) { const uint32_t edged_width2 = edged_width / 2; const uint32_t width2 = width / 2; @@ -165,18 +174,10 @@ src = image->y; for (i = 0; i < EDGE_SIZE; i++) { -/* // if interlacing, edges contain top-most data from each field - if (interlacing && (i & 1)) { - memset(dst, *(src + edged_width), EDGE_SIZE); - memcpy(dst + EDGE_SIZE, src + edged_width, width); - memset(dst + edged_width - EDGE_SIZE, - *(src + edged_width + width - 1), EDGE_SIZE); - } else {*/ - memset(dst, *src, EDGE_SIZE); - memcpy(dst + EDGE_SIZE, src, width); - memset(dst + edged_width - EDGE_SIZE, *(src + width - 1), - EDGE_SIZE); - /*}*/ + memset(dst, *src, EDGE_SIZE); + memcpy(dst + EDGE_SIZE, src, width); + memset(dst + edged_width - EDGE_SIZE, *(src + width - 1), + EDGE_SIZE); dst += edged_width; } @@ -189,18 +190,10 @@ src -= edged_width; for (i = 0; i < EDGE_SIZE; i++) { -/* // if interlacing, edges contain bottom-most data from each field - if (interlacing && !(i & 1)) { - memset(dst, *(src - edged_width), EDGE_SIZE); - memcpy(dst + EDGE_SIZE, src - edged_width, width); - memset(dst + edged_width - EDGE_SIZE, - *(src - edged_width + width - 1), EDGE_SIZE); - } else {*/ - memset(dst, *src, EDGE_SIZE); - memcpy(dst + EDGE_SIZE, src, width); - memset(dst + edged_width - EDGE_SIZE, *(src + width - 1), + memset(dst, *src, EDGE_SIZE); + memcpy(dst + EDGE_SIZE, src, width); + memset(dst + edged_width - EDGE_SIZE, *(src + width - 1), EDGE_SIZE); - /*}*/ dst += edged_width; } @@ -269,6 +262,7 @@ IMAGE * refhv, uint32_t edged_width, uint32_t edged_height, + uint32_t quarterpel, uint32_t rounding) { const uint32_t offset = EDGE_SIZE * (edged_width + 1); @@ -295,23 +289,57 @@ v_ptr -= offset; hv_ptr -= offset; - for (y = 0; y < edged_height; y = y + 8) { - for (x = 0; x < edged_width; x = x + 8) { - interpolate8x8_halfpel_h(h_ptr, n_ptr, edged_width, rounding); - interpolate8x8_halfpel_v(v_ptr, n_ptr, edged_width, rounding); - interpolate8x8_halfpel_hv(hv_ptr, n_ptr, edged_width, rounding); + if(quarterpel) { + + for (y = 0; y < edged_height; y += 8) { + for (x = 0; x < edged_width; x += 8) { + interpolate8x8_6tap_lowpass_h(h_ptr, n_ptr, edged_width, rounding); + interpolate8x8_6tap_lowpass_v(v_ptr, n_ptr, edged_width, rounding); + + n_ptr += 8; + h_ptr += 8; + v_ptr += 8; + } + + h_ptr += stride_add; + v_ptr += stride_add; + n_ptr += stride_add; + } - n_ptr += 8; - h_ptr += 8; - v_ptr += 8; - hv_ptr += 8; + h_ptr = refh->y; + h_ptr -= offset; + + for (y = 0; y < edged_height; y = y + 8) { + for (x = 0; x < edged_width; x = x + 8) { + interpolate8x8_6tap_lowpass_v(hv_ptr, h_ptr, edged_width, rounding); + hv_ptr += 8; + h_ptr += 8; + } + hv_ptr += stride_add; + h_ptr += stride_add; } - h_ptr += stride_add; - v_ptr += stride_add; - hv_ptr += stride_add; - n_ptr += stride_add; } + else { + for (y = 0; y < edged_height; y += 8) { + for (x = 0; x < edged_width; x += 8) { + interpolate8x8_halfpel_h(h_ptr, n_ptr, edged_width, rounding); + interpolate8x8_halfpel_v(v_ptr, n_ptr, edged_width, rounding); + interpolate8x8_halfpel_hv(hv_ptr, n_ptr, edged_width, rounding); + + n_ptr += 8; + h_ptr += 8; + v_ptr += 8; + hv_ptr += 8; + } + + h_ptr += stride_add; + v_ptr += stride_add; + hv_ptr += stride_add; + n_ptr += stride_add; + } + } +/* #ifdef BFRAMES n_ptr = refn->u; h_ptr = refh->u; @@ -323,8 +351,8 @@ v_ptr -= offset2; hv_ptr -= offset2; - for (y = 0; y < edged_height2; y = y + 8) { - for (x = 0; x < edged_width2; x = x + 8) { + for (y = 0; y < edged_height2; y += 8) { + for (x = 0; x < edged_width2; x += 8) { interpolate8x8_halfpel_h(h_ptr, n_ptr, edged_width2, rounding); interpolate8x8_halfpel_v(v_ptr, n_ptr, edged_width2, rounding); interpolate8x8_halfpel_hv(hv_ptr, n_ptr, edged_width2, rounding); @@ -367,7 +395,7 @@ n_ptr += stride_add2; } #endif - +*/ /* interpolate_halfpel_h( refh->y - offset,