190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/****************************************************************************
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *   Module Title :     yv12extend.c
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *   Description  :
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ***************************************************************************/
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/****************************************************************************
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber*  Header Files
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber****************************************************************************/
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber//#include <stdlib.h>
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_scale/yv12config.h"
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_mem/vpx_mem.h"
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/****************************************************************************
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber*  Exports
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber****************************************************************************/
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/****************************************************************************
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ****************************************************************************/
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervp8_yv12_extend_frame_borders(YV12_BUFFER_CONFIG *ybf)
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    char *src_ptr1, *src_ptr2;
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    char *dest_ptr1, *dest_ptr2;
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int Border;
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int plane_stride;
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int plane_height;
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int plane_width;
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /***********/
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* Y Plane */
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /***********/
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    Border = ybf->border;
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    plane_stride = ybf->y_stride;
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    plane_height = ybf->y_height;
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    plane_width = ybf->y_width;
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // copy the left and right most columns out
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    src_ptr1 = ybf->y_buffer;
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    src_ptr2 = src_ptr1 + plane_width - 1;
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest_ptr1 = src_ptr1 - Border;
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest_ptr2 = src_ptr2 + 1;
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < plane_height; i++)
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        memset(dest_ptr1, src_ptr1[0], Border);
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        memset(dest_ptr2, src_ptr2[0], Border);
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        src_ptr1  += plane_stride;
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        src_ptr2  += plane_stride;
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest_ptr1 += plane_stride;
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest_ptr2 += plane_stride;
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Now copy the top and bottom source lines into each line of the respective borders
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    src_ptr1 = ybf->y_buffer - Border;
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride;
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest_ptr1 = src_ptr1 - (Border * plane_stride);
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest_ptr2 = src_ptr2 + plane_stride;
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < (int)Border; i++)
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        memcpy(dest_ptr1, src_ptr1, plane_stride);
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        memcpy(dest_ptr2, src_ptr2, plane_stride);
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest_ptr1 += plane_stride;
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest_ptr2 += plane_stride;
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    plane_stride /= 2;
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    plane_height /= 2;
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    plane_width /= 2;
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    Border /= 2;
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /***********/
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* U Plane */
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /***********/
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // copy the left and right most columns out
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    src_ptr1 = ybf->u_buffer;
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    src_ptr2 = src_ptr1 + plane_width - 1;
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest_ptr1 = src_ptr1 - Border;
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest_ptr2 = src_ptr2 + 1;
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < plane_height; i++)
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        memset(dest_ptr1, src_ptr1[0], Border);
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        memset(dest_ptr2, src_ptr2[0], Border);
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        src_ptr1  += plane_stride;
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        src_ptr2  += plane_stride;
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest_ptr1 += plane_stride;
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest_ptr2 += plane_stride;
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Now copy the top and bottom source lines into each line of the respective borders
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    src_ptr1 = ybf->u_buffer - Border;
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride;
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest_ptr1 = src_ptr1 - (Border * plane_stride);
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest_ptr2 = src_ptr2 + plane_stride;
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < (int)(Border); i++)
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        memcpy(dest_ptr1, src_ptr1, plane_stride);
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        memcpy(dest_ptr2, src_ptr2, plane_stride);
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest_ptr1 += plane_stride;
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest_ptr2 += plane_stride;
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /***********/
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* V Plane */
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /***********/
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // copy the left and right most columns out
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    src_ptr1 = ybf->v_buffer;
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    src_ptr2 = src_ptr1 + plane_width - 1;
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest_ptr1 = src_ptr1 - Border;
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest_ptr2 = src_ptr2 + 1;
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < plane_height; i++)
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        memset(dest_ptr1, src_ptr1[0], Border);
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        memset(dest_ptr2, src_ptr2[0], Border);
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        src_ptr1  += plane_stride;
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        src_ptr2  += plane_stride;
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest_ptr1 += plane_stride;
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest_ptr2 += plane_stride;
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Now copy the top and bottom source lines into each line of the respective borders
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    src_ptr1 = ybf->v_buffer - Border;
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride;
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest_ptr1 = src_ptr1 - (Border * plane_stride);
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest_ptr2 = src_ptr2 + plane_stride;
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < (int)(Border); i++)
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        memcpy(dest_ptr1, src_ptr1, plane_stride);
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        memcpy(dest_ptr2, src_ptr2, plane_stride);
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest_ptr1 += plane_stride;
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest_ptr2 += plane_stride;
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/****************************************************************************
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  ROUTINE       : vp8_yv12_copy_frame
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  INPUTS        :
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  OUTPUTS       : None.
16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  RETURNS       : void
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  FUNCTION      : Copies the source image into the destination image and
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *                  updates the destination's UMV borders.
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  SPECIAL NOTES : The frames are assumed to be identical in size.
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ****************************************************************************/
17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid
17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervp8_yv12_copy_frame(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc)
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int row;
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int *source;
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    _Uncached unsigned int *dest;
18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int height;
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int width;
18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    height = src_ybc->y_height + (src_ybc->border * 2);
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    width =  src_ybc->y_width + (src_ybc->border * 2);
18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    width /= 4;
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    source = (unsigned int *)(src_ybc->y_buffer - (src_ybc->border * src_ybc->y_stride) - src_ybc->border);
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest = (_Uncached unsigned int *)(dst_ybc->y_buffer - (dst_ybc->border * dst_ybc->y_stride) - dst_ybc->border);
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (row = 0; row < height; row++)
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 0; i < width; i++)
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            dest[i] = source[i];
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source += width;
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest   += width;
19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    height = src_ybc->uv_height + (src_ybc->border);
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    width =  src_ybc->uv_width + (src_ybc->border);
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    width /= 4;
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    source = (unsigned int *)(src_ybc->u_buffer - (src_ybc->border / 2 * src_ybc->uv_stride) - src_ybc->border / 2);
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest = (_Uncached unsigned int *)(dst_ybc->u_buffer - (dst_ybc->border / 2 * dst_ybc->uv_stride) - dst_ybc->border / 2);
20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (row = 0; row < height; row++)
20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 0; i < width; i++)
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            dest[i] = source[i];
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source += width;
21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest   += width;
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    source = (unsigned int *)(src_ybc->v_buffer - (src_ybc->border / 2 * src_ybc->uv_stride) - src_ybc->border / 2);
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    dest = (_Uncached unsigned int *)(dst_ybc->v_buffer - (dst_ybc->border / 2 * dst_ybc->uv_stride) - dst_ybc->border / 2);
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (row = 0; row < height; row++)
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 0; i < width; i++)
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            dest[i] = source[i];
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        source += width;
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dest   += width;
23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
233