1 |
/************************************************************************** |
/************************************************************************** |
2 |
* |
* |
3 |
* XVID MPEG-4 VIDEO CODEC |
* XVID MPEG-4 VIDEO CODEC |
4 |
* image stuff |
* - Image management functions - |
5 |
* |
* |
6 |
* This program is an implementation of a part of one or more MPEG-4 |
* Copyright(C) 2001-2003 Peter Ross <pross@xvid.org> |
|
* 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. |
|
7 |
* |
* |
8 |
* This program is free software; you can redistribute it and/or modify |
* This program is free software; you can redistribute it and/or modify |
9 |
* it under the terms of the GNU General Public License as published by |
* it under the terms of the GNU General Public License as published by |
17 |
* |
* |
18 |
* You should have received a copy of the GNU General Public License |
* You should have received a copy of the GNU General Public License |
19 |
* along with this program; if not, write to the Free Software |
* along with this program; if not, write to the Free Software |
20 |
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
21 |
* |
* |
22 |
*************************************************************************/ |
* $Id: image.c,v 1.26.2.10 2003-10-01 23:23:01 edgomez Exp $ |
|
|
|
|
/************************************************************************** |
|
|
* |
|
|
* History: |
|
23 |
* |
* |
24 |
* 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 - 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 |
|
|
* 07.01.2001 commented u,v interpolation (not required for uv-block-based) |
|
|
* 23.12.2001 removed #ifdefs, added function pointers + init_common() |
|
|
* 22.12.2001 cpu #ifdefs |
|
|
* 19.12.2001 image_dump(); useful for debugging |
|
|
* 6.12.2001 inital version; (c)2001 peter ross <pross@cs.rmit.edu.au> |
|
|
* |
|
|
*************************************************************************/ |
|
25 |
|
|
26 |
#include <stdlib.h> |
#include <stdlib.h> |
27 |
#include <string.h> /* memcpy, memset */ |
#include <string.h> /* memcpy, memset */ |
49 |
{ |
{ |
50 |
const uint32_t edged_width2 = edged_width / 2; |
const uint32_t edged_width2 = edged_width / 2; |
51 |
const uint32_t edged_height2 = edged_height / 2; |
const uint32_t edged_height2 = edged_height / 2; |
|
uint32_t i; |
|
52 |
|
|
53 |
image->y = |
image->y = |
54 |
xvid_malloc(edged_width * (edged_height + 1) + SAFETY, CACHE_LINE); |
xvid_malloc(edged_width * (edged_height + 1) + SAFETY, CACHE_LINE); |
55 |
if (image->y == NULL) { |
if (image->y == NULL) { |
56 |
return -1; |
return -1; |
57 |
} |
} |
58 |
|
memset(image->y, 0, edged_width * (edged_height + 1) + SAFETY); |
|
for (i = 0; i < edged_width * edged_height + SAFETY; i++) { |
|
|
image->y[i] = 0; |
|
|
} |
|
59 |
|
|
60 |
image->u = xvid_malloc(edged_width2 * edged_height2 + SAFETY, CACHE_LINE); |
image->u = xvid_malloc(edged_width2 * edged_height2 + SAFETY, CACHE_LINE); |
61 |
if (image->u == NULL) { |
if (image->u == NULL) { |
62 |
xvid_free(image->y); |
xvid_free(image->y); |
63 |
|
image->y = NULL; |
64 |
return -1; |
return -1; |
65 |
} |
} |
66 |
|
memset(image->u, 0, edged_width2 * edged_height2 + SAFETY); |
67 |
|
|
68 |
image->v = xvid_malloc(edged_width2 * edged_height2 + SAFETY, CACHE_LINE); |
image->v = xvid_malloc(edged_width2 * edged_height2 + SAFETY, CACHE_LINE); |
69 |
if (image->v == NULL) { |
if (image->v == NULL) { |
70 |
xvid_free(image->u); |
xvid_free(image->u); |
71 |
|
image->u = NULL; |
72 |
xvid_free(image->y); |
xvid_free(image->y); |
73 |
|
image->y = NULL; |
74 |
return -1; |
return -1; |
75 |
} |
} |
76 |
|
memset(image->v, 0, edged_width2 * edged_height2 + SAFETY); |
77 |
|
|
78 |
image->y += EDGE_SIZE * edged_width + EDGE_SIZE; |
image->y += EDGE_SIZE * edged_width + EDGE_SIZE; |
79 |
image->u += EDGE_SIZE2 * edged_width2 + EDGE_SIZE2; |
image->u += EDGE_SIZE2 * edged_width2 + EDGE_SIZE2; |
93 |
|
|
94 |
if (image->y) { |
if (image->y) { |
95 |
xvid_free(image->y - (EDGE_SIZE * edged_width + EDGE_SIZE)); |
xvid_free(image->y - (EDGE_SIZE * edged_width + EDGE_SIZE)); |
96 |
|
image->y = NULL; |
97 |
} |
} |
98 |
if (image->u) { |
if (image->u) { |
99 |
xvid_free(image->u - (EDGE_SIZE2 * edged_width2 + EDGE_SIZE2)); |
xvid_free(image->u - (EDGE_SIZE2 * edged_width2 + EDGE_SIZE2)); |
100 |
|
image->u = NULL; |
101 |
} |
} |
102 |
if (image->v) { |
if (image->v) { |
103 |
xvid_free(image->v - (EDGE_SIZE2 * edged_width2 + EDGE_SIZE2)); |
xvid_free(image->v - (EDGE_SIZE2 * edged_width2 + EDGE_SIZE2)); |
104 |
|
image->v = NULL; |
105 |
} |
} |
106 |
} |
} |
107 |
|
|
136 |
uint32_t height) |
uint32_t height) |
137 |
{ |
{ |
138 |
const uint32_t edged_width2 = edged_width / 2; |
const uint32_t edged_width2 = edged_width / 2; |
139 |
const uint32_t width2 = width / 2; |
uint32_t width2; |
140 |
uint32_t i; |
uint32_t i; |
141 |
uint8_t *dst; |
uint8_t *dst; |
142 |
uint8_t *src; |
uint8_t *src; |
145 |
dst = image->y - (EDGE_SIZE + EDGE_SIZE * edged_width); |
dst = image->y - (EDGE_SIZE + EDGE_SIZE * edged_width); |
146 |
src = image->y; |
src = image->y; |
147 |
|
|
148 |
|
/* According to the Standard Clause 7.6.4, padding is done starting at 16 |
149 |
|
* pixel width and height multiples */ |
150 |
|
width = (width+15)&~15; |
151 |
|
height = (height+15)&~15; |
152 |
|
width2 = width/2; |
153 |
|
|
154 |
for (i = 0; i < EDGE_SIZE; i++) { |
for (i = 0; i < EDGE_SIZE; i++) { |
155 |
memset(dst, *src, EDGE_SIZE); |
memset(dst, *src, EDGE_SIZE); |
156 |
memcpy(dst + EDGE_SIZE, src, width); |
memcpy(dst + EDGE_SIZE, src, width); |