1/* 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * 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 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 12/**************************************************************************** 13* 14* Module Title : yv12extend.c 15* 16* Description : 17* 18***************************************************************************/ 19 20/**************************************************************************** 21* Header Files 22****************************************************************************/ 23#include "vpx_scale/yv12config.h" 24#include "vpx_mem/vpx_mem.h" 25#include <nitro.h> 26#include <nitro/mi.h> 27#include <nitro/itcm_begin.h> 28 29//---- DMA Number 30#define DMA_NO 3 31 32/**************************************************************************** 33* Exports 34****************************************************************************/ 35 36/**************************************************************************** 37* 38****************************************************************************/ 39void 40vp8_yv12_extend_frame_borders(YV12_BUFFER_CONFIG *ybf) 41{ 42 int i; 43 unsigned char *src_ptr1, *src_ptr2; 44 unsigned char *dest_ptr1, *dest_ptr2; 45 46 unsigned int Border; 47 int plane_stride; 48 int plane_height; 49 int plane_width; 50 51 /***********/ 52 /* Y Plane */ 53 /***********/ 54 Border = ybf->border; 55 plane_stride = ybf->y_stride; 56 plane_height = ybf->y_height; 57 plane_width = ybf->y_width; 58 59 // copy the left and right most columns out 60 src_ptr1 = ybf->y_buffer; 61 src_ptr2 = src_ptr1 + plane_width - 1; 62 dest_ptr1 = src_ptr1 - Border; 63 dest_ptr2 = src_ptr2 + 1; 64 65 for (i = 0; i < plane_height; i++) 66 { 67 mi_cpu_fill8(dest_ptr1, src_ptr1[0], Border); 68 mi_cpu_fill8(dest_ptr2, src_ptr2[0], Border); 69 src_ptr1 += plane_stride; 70 src_ptr2 += plane_stride; 71 dest_ptr1 += plane_stride; 72 dest_ptr2 += plane_stride; 73 } 74 75 // Now copy the top and bottom source lines into each line of the respective borders 76 src_ptr1 = ybf->y_buffer - Border; 77 src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; 78 dest_ptr1 = src_ptr1 - (Border * plane_stride); 79 dest_ptr2 = src_ptr2 + plane_stride; 80 81 for (i = 0; i < (int)Border; i++) 82 { 83 mi_cpu_copy_fast(src_ptr1, dest_ptr1, plane_stride); 84 mi_cpu_copy_fast(src_ptr2, dest_ptr2, plane_stride); 85 dest_ptr1 += plane_stride; 86 dest_ptr2 += plane_stride; 87 } 88 89 plane_stride /= 2; 90 plane_height /= 2; 91 plane_width /= 2; 92 Border /= 2; 93 94 /***********/ 95 /* U Plane */ 96 /***********/ 97 98 // copy the left and right most columns out 99 src_ptr1 = ybf->u_buffer; 100 src_ptr2 = src_ptr1 + plane_width - 1; 101 dest_ptr1 = src_ptr1 - Border; 102 dest_ptr2 = src_ptr2 + 1; 103 104 for (i = 0; i < plane_height; i++) 105 { 106 mi_cpu_fill8(dest_ptr1, src_ptr1[0], Border); 107 mi_cpu_fill8(dest_ptr2, src_ptr2[0], Border); 108 src_ptr1 += plane_stride; 109 src_ptr2 += plane_stride; 110 dest_ptr1 += plane_stride; 111 dest_ptr2 += plane_stride; 112 } 113 114 // Now copy the top and bottom source lines into each line of the respective borders 115 src_ptr1 = ybf->u_buffer - Border; 116 src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; 117 dest_ptr1 = src_ptr1 - (Border * plane_stride); 118 dest_ptr2 = src_ptr2 + plane_stride; 119 120 for (i = 0; i < (int)(Border); i++) 121 { 122 mi_cpu_copy_fast(src_ptr1, dest_ptr1, plane_stride); 123 mi_cpu_copy_fast(src_ptr2, dest_ptr2, plane_stride); 124 dest_ptr1 += plane_stride; 125 dest_ptr2 += plane_stride; 126 } 127 128 /***********/ 129 /* V Plane */ 130 /***********/ 131 132 // copy the left and right most columns out 133 src_ptr1 = ybf->v_buffer; 134 src_ptr2 = src_ptr1 + plane_width - 1; 135 dest_ptr1 = src_ptr1 - Border; 136 dest_ptr2 = src_ptr2 + 1; 137 138 for (i = 0; i < plane_height; i++) 139 { 140 mi_cpu_fill8(dest_ptr1, src_ptr1[0], Border); 141 mi_cpu_fill8(dest_ptr2, src_ptr2[0], Border); 142 src_ptr1 += plane_stride; 143 src_ptr2 += plane_stride; 144 dest_ptr1 += plane_stride; 145 dest_ptr2 += plane_stride; 146 } 147 148 // Now copy the top and bottom source lines into each line of the respective borders 149 src_ptr1 = ybf->v_buffer - Border; 150 src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; 151 dest_ptr1 = src_ptr1 - (Border * plane_stride); 152 dest_ptr2 = src_ptr2 + plane_stride; 153 154 for (i = 0; i < (int)(Border); i++) 155 { 156 mi_cpu_copy_fast(src_ptr1, dest_ptr1, plane_stride); 157 mi_cpu_copy_fast(src_ptr2, dest_ptr2, plane_stride); 158 dest_ptr1 += plane_stride; 159 dest_ptr2 += plane_stride; 160 } 161} 162 163 164 165/**************************************************************************** 166* 167* ROUTINE : vp8_yv12_copy_frame 168* 169* INPUTS : 170* 171* OUTPUTS : None. 172* 173* RETURNS : void 174* 175* FUNCTION : Copies the source image into the destination image and 176* updates the destination's UMV borders. 177* 178* SPECIAL NOTES : The frames are assumed to be identical in size. 179* 180****************************************************************************/ 181void 182vp8_yv12_copy_frame(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc) 183{ 184 int yplane_size = (src_ybc->y_height + 2 * src_ybc->border) * (src_ybc->y_stride); 185 int mem_size = (yplane_size * 3 / 2) + (src_ybc->y_stride * 2); 186 187 mi_cpu_copy_fast(src_ybc->buffer_alloc, dst_ybc->buffer_alloc, mem_size); 188 189 /* unsigned char *src_y, *dst_y; 190 unsigned char *src_u, *dst_u; 191 unsigned char *src_v, *dst_v; 192 193 int yheight, uv_height; 194 int ystride, uv_stride; 195 int border; 196 int yoffset, uvoffset; 197 198 border = src_ybc->border; 199 yheight = src_ybc->y_height; 200 uv_height = src_ybc->uv_height; 201 202 ystride = src_ybc->y_stride; 203 uv_stride = src_ybc->uv_stride; 204 205 yoffset = border * (ystride + 1); 206 uvoffset = border/2 * (uv_stride + 1); 207 208 src_y = src_ybc->y_buffer - yoffset; 209 dst_y = dst_ybc->y_buffer - yoffset; 210 src_u = src_ybc->u_buffer - uvoffset; 211 dst_u = dst_ybc->u_buffer - uvoffset; 212 src_v = src_ybc->v_buffer - uvoffset; 213 dst_v = dst_ybc->v_buffer - uvoffset; 214 215 mi_cpu_copy_fast (src_y, dst_y, ystride * (yheight + 2 * border)); 216 mi_cpu_copy_fast (src_u, dst_u, uv_stride * (uv_height + border)); 217 mi_cpu_copy_fast (src_v, dst_v, uv_stride * (uv_height + border)); 218 */ 219} 220 221#include <nitro/itcm_end.h> 222