blob: cfd3de05020b38a9d03d4bc034093373072490f9 [file] [log] [blame]
John Koleszar0ea50ce2010-05-18 11:58:33 -04001/*
John Koleszarc2140b82010-09-09 08:16:39 -04002 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar0ea50ce2010-05-18 11:58:33 -04003 *
John Koleszar94c52e42010-06-18 12:39:21 -04004 * Use of this source code is governed by a BSD-style license
John Koleszar09202d82010-06-04 16:19:40 -04005 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
John Koleszar94c52e42010-06-18 12:39:21 -04007 * in the file PATENTS. All contributing project authors may
John Koleszar09202d82010-06-04 16:19:40 -04008 * be found in the AUTHORS file in the root of the source tree.
John Koleszar0ea50ce2010-05-18 11:58:33 -04009 */
10
11
12/****************************************************************************
13 *
14 * Module Title : yv12extend.c
15 *
16 * Description :
17 *
18 ***************************************************************************/
19
20/****************************************************************************
21* Header Files
22****************************************************************************/
23#include <cdef_bf533.h>
24
25#include "vpx_scale/yv12config.h"
26#include "vpx_mem/vpx_mem.h"
27
28/****************************************************************************
29*
30****************************************************************************/
31
32
33/****************************************************************************
34*
35****************************************************************************/
36void
37extend_memset(void *dst, unsigned char value, unsigned int size)
38{
39#if 0
40 unsigned int quad_value;
41
42 quad_value = (unsigned int) value;
43 quad_value |= (unsigned int) value << 8;
44 quad_value |= (unsigned int) value << 16;
45 quad_value |= (unsigned int) value << 24;
46#else
47 unsigned short quad_value;
48
49 quad_value = (unsigned int) value;
50 quad_value |= (unsigned int) value << 8;
51#endif
52
53
54 if (size / 2 >= 64 * 1024)
55 printf("_Extend_memset__________ dma memset is broken\n");
56
57 *p_mdma_s1_start_addr = &quad_value;
58 *p_mdma_s1_x_count = size / 2;
59 *p_mdma_s1_x_modify = 0x0;
60 *p_mdma_d1_start_addr = dst;
61 *p_mdma_d1_x_count = size / 2;
62 *p_mdma_d1_x_modify = 2;
63
64 *p_mdma_s1_config = DMAEN | WDSIZE_16;
65 asm("ssync;");
66
67 *p_mdma_d1_config = DI_EN | DMAEN | WNR | WDSIZE_16;
68 asm("ssync;");
69
70 while ((*p_mdma_d1_irq_status & DMA_DONE) == 0);
71
72 *p_mdma_d1_irq_status |= DMA_DONE;
73}
74
75/****************************************************************************
76*
77****************************************************************************/
78void
79extend_memcpy(void *dst, void *src, unsigned int size)
80{
81 if (size / 2 >= 64 * 1024)
82 printf("_Extend_memcpy__________ dma memcpy is broken\n");
83
84
85 if ((size & 0x3))
86 printf("_)__________ size not a multiple of 4\n");
87
88//32 bit dma here caused some data to be corrupted --- WHY ??????
89
90 *p_mdma_s1_start_addr = src;
91 *p_mdma_s1_x_count = size / 2;
92 *p_mdma_s1_x_modify = 2;
93 *p_mdma_d1_start_addr = dst;
94 *p_mdma_d1_x_count = size / 2;
95 *p_mdma_d1_x_modify = 2;
96
97 *p_mdma_s1_config = DMAEN | WDSIZE_16;
98 asm("ssync;");
99
100 *p_mdma_d1_config = DI_EN | DMAEN | WNR | WDSIZE_16;
101 asm("ssync;");
102
103 while ((*p_mdma_d1_irq_status & DMA_DONE) == 0);
104
105 *p_mdma_d1_irq_status |= DMA_DONE;
106}
107
108/****************************************************************************
109 *
110 ****************************************************************************/
111void
112vp8_yv12_extend_frame_borders(YV12_BUFFER_CONFIG *ybf)
113{
114#if 1
115 int i;
116 unsigned char *src_ptr1, *src_ptr2;
117 unsigned char *dest_ptr1, *dest_ptr2;
118
119 unsigned int Border;
120 int plane_stride;
121 int plane_height;
122 int plane_width;
123
124 unsigned int quad_sample;
125 unsigned int sample;
126
127 /***********/
128 /* Y Plane */
129 /***********/
130 Border = ybf->border;
131 plane_stride = ybf->y_stride;
132 plane_height = ybf->y_height;
133 plane_width = ybf->y_width;
134
135 // copy the left and right most columns out
136 src_ptr1 = ybf->y_buffer;
137 src_ptr2 = src_ptr1 + plane_width - 1;
138 dest_ptr1 = src_ptr1 - Border;
139 dest_ptr2 = src_ptr2 + 1;
140
141 for (i = 0; i < plane_height; i++)
142 {
143 extend_memset(dest_ptr1, src_ptr1[0], Border);
144 extend_memset(dest_ptr2, src_ptr2[0], Border);
145 src_ptr1 += plane_stride;
146 src_ptr2 += plane_stride;
147 dest_ptr1 += plane_stride;
148 dest_ptr2 += plane_stride;
149 }
150
151 // Now copy the top and bottom source lines into each line of the respective borders
152 src_ptr1 = ybf->y_buffer - Border;
153 src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride;
154 dest_ptr1 = src_ptr1 - (Border * plane_stride);
155 dest_ptr2 = src_ptr2 + plane_stride;
156
157 for (i = 0; i < (int)Border; i++)
158 {
159 extend_memcpy(dest_ptr1, src_ptr1, plane_stride);
160 dest_ptr1 += plane_stride;
161 }
162
163 for (i = 0; i < (int)Border; i++)
164 {
165 extend_memcpy(dest_ptr2, src_ptr2, plane_stride);
166 dest_ptr2 += plane_stride;
167 }
168
169 plane_stride /= 2;
170 plane_height /= 2;
171 plane_width /= 2;
172 Border /= 2;
173
174 /***********/
175 /* U Plane */
176 /***********/
177
178 // copy the left and right most columns out
179 src_ptr1 = ybf->u_buffer;
180 src_ptr2 = src_ptr1 + plane_width - 1;
181 dest_ptr1 = src_ptr1 - Border;
182 dest_ptr2 = src_ptr2 + 1;
183
184 for (i = 0; i < plane_height; i++)
185 {
186 extend_memset(dest_ptr1, src_ptr1[0], Border);
187 extend_memset(dest_ptr2, src_ptr2[0], Border);
188 src_ptr1 += plane_stride;
189 src_ptr2 += plane_stride;
190 dest_ptr1 += plane_stride;
191 dest_ptr2 += plane_stride;
192 }
193
194 // Now copy the top and bottom source lines into each line of the respective borders
195 src_ptr1 = ybf->u_buffer - Border;
196 src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride;
197 dest_ptr1 = src_ptr1 - (Border * plane_stride);
198 dest_ptr2 = src_ptr2 + plane_stride;
199
200 for (i = 0; i < (int)(Border); i++)
201 {
202 extend_memcpy(dest_ptr1, src_ptr1, plane_stride);
203 dest_ptr1 += plane_stride;
204 }
205
206 for (i = 0; i < (int)(Border); i++)
207 {
208 extend_memcpy(dest_ptr2, src_ptr2, plane_stride);
209 dest_ptr2 += plane_stride;
210 }
211
212 /***********/
213 /* V Plane */
214 /***********/
215
216 // copy the left and right most columns out
217 src_ptr1 = ybf->v_buffer;
218 src_ptr2 = src_ptr1 + plane_width - 1;
219 dest_ptr1 = src_ptr1 - Border;
220 dest_ptr2 = src_ptr2 + 1;
221
222 for (i = 0; i < plane_height; i++)
223 {
224 extend_memset(dest_ptr1, src_ptr1[0], Border);
225 extend_memset(dest_ptr2, src_ptr2[0], Border);
226 src_ptr1 += plane_stride;
227 src_ptr2 += plane_stride;
228 dest_ptr1 += plane_stride;
229 dest_ptr2 += plane_stride;
230 }
231
232 // Now copy the top and bottom source lines into each line of the respective borders
233 src_ptr1 = ybf->v_buffer - Border;
234 src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride;
235 dest_ptr1 = src_ptr1 - (Border * plane_stride);
236 dest_ptr2 = src_ptr2 + plane_stride;
237
238 for (i = 0; i < (int)(Border); i++)
239 {
240 extend_memcpy(dest_ptr1, src_ptr1, plane_stride);
241 dest_ptr1 += plane_stride;
242 }
243
244 for (i = 0; i < (int)(Border); i++)
245 {
246 extend_memcpy(dest_ptr2, src_ptr2, plane_stride);
247 dest_ptr2 += plane_stride;
248 }
249
250#endif
251}
252/****************************************************************************
253 *
254 * ROUTINE : vp8_yv12_copy_frame
255 *
256 * INPUTS :
257 *
258 * OUTPUTS : None.
259 *
260 * RETURNS : void
261 *
262 * FUNCTION : Copies the source image into the destination image and
263 * updates the destination's UMV borders.
264 *
265 * SPECIAL NOTES : The frames are assumed to be identical in size.
266 *
267 ****************************************************************************/
268void
269vp8_yv12_copy_frame(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc)
270{
271#if 1
272 int row;
273 unsigned char *source, *dest;
274
275 source = src_ybc->y_buffer;
276 dest = dst_ybc->y_buffer;
277
278 for (row = 0; row < src_ybc->y_height; row++)
279 {
280 extend_memcpy(dest, source, src_ybc->y_width);
281 source += src_ybc->y_stride;
282 dest += dst_ybc->y_stride;
283 }
284
285 source = src_ybc->u_buffer;
286 dest = dst_ybc->u_buffer;
287
288 for (row = 0; row < src_ybc->uv_height; row++)
289 {
290 extend_memcpy(dest, source, src_ybc->uv_width);
291 source += src_ybc->uv_stride;
292 dest += dst_ybc->uv_stride;
293 }
294
295 source = src_ybc->v_buffer;
296 dest = dst_ybc->v_buffer;
297
298 for (row = 0; row < src_ybc->uv_height; row++)
299 {
300 extend_memcpy(dest, source, src_ybc->uv_width);
301 source += src_ybc->uv_stride;
302 dest += dst_ybc->uv_stride;
303 }
304
305 vp8_yv12_extend_frame_borders(dst_ybc);
306
307#else
308 int row;
309 char *source, *dest;
310 int height;
311 int width;
312
313 height = src_ybc->y_height + (src_ybc->border * 2);
314 width = src_ybc->y_width + (src_ybc->border * 2);
315 source = src_ybc->y_buffer;
316 dest = dst_ybc->y_buffer;
317
318 for (row = 0; row < height; row++)
319 {
320 extend_memcpy(dest, source, width);
321 source += src_ybc->y_stride;
322 dest += dst_ybc->y_stride;
323 }
324
325 height = src_ybc->uv_height + (src_ybc->border);
326 width = src_ybc->uv_width + (src_ybc->border);
327
328 source = src_ybc->u_buffer;
329 dest = dst_ybc->u_buffer;
330
331 for (row = 0; row < height; row++)
332 {
333 extend_memcpy(dest, source, width);
334 source += src_ybc->uv_stride;
335 dest += dst_ybc->uv_stride;
336 }
337
338 source = src_ybc->v_buffer;
339 dest = dst_ybc->v_buffer;
340
341 for (row = 0; row < height; row++)
342 {
343 extend_memcpy(dest, source, width);
344 source += src_ybc->uv_stride;
345 dest += dst_ybc->uv_stride;
346 }
347
348#endif
349
350}