/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */


/****************************************************************************
 *
 *   Module Title :     scale.c
 *
 *   Description  :     Image scaling functions.
 *
 ***************************************************************************/

/****************************************************************************
*  Header Files
****************************************************************************/
#include "vpx_mem/vpx_mem.h"
#include "vpx_scale/yv12config.h"
#include "vpx_scale/scale_mode.h"

/****************************************************************************
*  Exports
****************************************************************************/
#ifndef VPX_NO_GLOBALS
void (*vp8_vertical_band_4_5_scale)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) = 0;
void (*vp8_last_vertical_band_4_5_scale)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) = 0;
void (*vp8_vertical_band_2_3_scale)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) = 0;
void (*vp8_last_vertical_band_2_3_scale)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) = 0;
void (*vp8_vertical_band_3_5_scale)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) = 0;
void (*vp8_last_vertical_band_3_5_scale)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) = 0;
void (*vp8_vertical_band_3_4_scale)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) = 0;
void (*vp8_last_vertical_band_3_4_scale)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) = 0;
void (*vp8_horizontal_line_1_2_scale)(const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width) = 0;
void (*vp8_horizontal_line_3_5_scale)(const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width) = 0;
void (*vp8_horizontal_line_3_4_scale)(const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width) = 0;
void (*vp8_horizontal_line_2_3_scale)(const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width) = 0;
void (*vp8_horizontal_line_4_5_scale)(const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width) = 0;
void (*vp8_vertical_band_1_2_scale)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) = 0;
void (*vp8_last_vertical_band_1_2_scale)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) = 0;

void (*vp8_vertical_band_5_4_scale)(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) = 0;
void (*vp8_vertical_band_5_3_scale)(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) = 0;
void (*vp8_vertical_band_2_1_scale)(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) = 0;
void (*vp8_vertical_band_2_1_scale_i)(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) = 0;
void (*vp8_horizontal_line_2_1_scale)(const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width) = 0;
void (*vp8_horizontal_line_5_3_scale)(const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width) = 0;
void (*vp8_horizontal_line_5_4_scale)(const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width) = 0;
#else
# include "vpxscale_nofp.h"
#endif

typedef struct
{
    int     expanded_frame_width;
    int     expanded_frame_height;

    int HScale;
    int HRatio;
    int VScale;
    int VRatio;

    YV12_BUFFER_CONFIG *src_yuv_config;
    YV12_BUFFER_CONFIG *dst_yuv_config;

} SCALE_VARS;

/****************************************************************************
 *
 *  ROUTINE       :     horizontal_line_copy
 *
 *  INPUTS        :     None
 *
 *
 *  OUTPUTS       :     None.
 *
 *  RETURNS       :     None
 *
 *  FUNCTION      :     1 to 1 scaling up for a horizontal line of pixles
 *
 *  SPECIAL NOTES :     None.
 *
 *  ERRORS        :     None.
 *
 ****************************************************************************/
static
void horizontal_line_copy(
    const unsigned char *source,
    unsigned int source_width,
    unsigned char *dest,
    unsigned int dest_width
)
{
    (void) dest_width;

    duck_memcpy(dest, source, source_width);
}
/****************************************************************************
 *
 *  ROUTINE       :     null_scale
 *
 *  INPUTS        :     None
 *
 *
 *  OUTPUTS       :     None.
 *
 *  RETURNS       :     None
 *
 *  FUNCTION      :     1 to 1 scaling up for a vertical band
 *
 *  SPECIAL NOTES :     None.
 *
 *  ERRORS        :     None.
 *
 ****************************************************************************/
static
void null_scale(
    unsigned char *dest,
    unsigned int dest_pitch,
    unsigned int dest_width
)
{
    (void) dest;
    (void) dest_pitch;
    (void) dest_width;

    return;
}

/****************************************************************************
 *
 *  ROUTINE       : scale1d_2t1_i
 *
 *  INPUTS        : const unsigned char *source : Pointer to data to be scaled.
 *                  int source_step              : Number of pixels to step on in source.
 *                  unsigned int source_scale    : Scale for source (UNUSED).
 *                  unsigned int source_length   : Length of source (UNUSED).
 *                  unsigned char *dest         : Pointer to output data array.
 *                  int dest_step                : Number of pixels to step on in destination.
 *                  unsigned int dest_scale      : Scale for destination (UNUSED).
 *                  unsigned int dest_length     : Length of destination.
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : void
 *
 *  FUNCTION      : Performs 2-to-1 interpolated scaling.
 *
 *  SPECIAL NOTES : None.
 *
 ****************************************************************************/
static
void scale1d_2t1_i
(
    const unsigned char *source,
    int source_step,
    unsigned int source_scale,
    unsigned int source_length,
    unsigned char *dest,
    int dest_step,
    unsigned int dest_scale,
    unsigned int dest_length
)
{
    unsigned int i, j;
    unsigned int temp;
    int source_pitch = source_step;
    (void) source_length;
    (void) source_scale;
    (void) dest_scale;

    source_step *= 2;
    dest[0] = source[0];

    for (i = dest_step, j = source_step; i < dest_length * dest_step; i += dest_step, j += source_step)
    {
        temp = 8;
        temp += 3 * source[j-source_pitch];
        temp += 10 * source[j];
        temp += 3 * source[j+source_pitch];
        temp >>= 4;
        dest[i] = (char)(temp);
    }
}

/****************************************************************************
 *
 *  ROUTINE       : scale1d_2t1_ps
 *
 *  INPUTS        : const unsigned char *source : Pointer to data to be scaled.
 *                  int source_step              : Number of pixels to step on in source.
 *                  unsigned int source_scale    : Scale for source (UNUSED).
 *                  unsigned int source_length   : Length of source (UNUSED).
 *                  unsigned char *dest         : Pointer to output data array.
 *                  int dest_step                : Number of pixels to step on in destination.
 *                  unsigned int dest_scale      : Scale for destination (UNUSED).
 *                  unsigned int dest_length     : Length of destination.
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : void
 *
 *  FUNCTION      : Performs 2-to-1 point subsampled scaling.
 *
 *  SPECIAL NOTES : None.
 *
 ****************************************************************************/
static
void scale1d_2t1_ps
(
    const unsigned char *source,
    int source_step,
    unsigned int source_scale,
    unsigned int source_length,
    unsigned char *dest,
    int dest_step,
    unsigned int dest_scale,
    unsigned int dest_length
)
{
    unsigned int i, j;

    (void) source_length;
    (void) source_scale;
    (void) dest_scale;

    source_step *= 2;
    j = 0;

    for (i = 0; i < dest_length * dest_step; i += dest_step, j += source_step)
        dest[i] = source[j];
}
/****************************************************************************
 *
 *  ROUTINE       : scale1d_c
 *
 *  INPUTS        : const unsigned char *source : Pointer to data to be scaled.
 *                  int source_step              : Number of pixels to step on in source.
 *                  unsigned int source_scale    : Scale for source.
 *                  unsigned int source_length   : Length of source (UNUSED).
 *                  unsigned char *dest         : Pointer to output data array.
 *                  int dest_step                : Number of pixels to step on in destination.
 *                  unsigned int dest_scale      : Scale for destination.
 *                  unsigned int dest_length     : Length of destination.
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : void
 *
 *  FUNCTION      : Performs linear interpolation in one dimension.
 *
 *  SPECIAL NOTES : None.
 *
 ****************************************************************************/
static
void scale1d_c
(
    const unsigned char *source,
    int source_step,
    unsigned int source_scale,
    unsigned int source_length,
    unsigned char *dest,
    int dest_step,
    unsigned int dest_scale,
    unsigned int dest_length
)
{
    unsigned int i;
    unsigned int round_value = dest_scale / 2;
    unsigned int left_modifier = dest_scale;
    unsigned int right_modifier = 0;
    unsigned char left_pixel = *source;
    unsigned char right_pixel = *(source + source_step);

    (void) source_length;

    /* These asserts are needed if there are boundary issues... */
    /*assert ( dest_scale > source_scale );*/
    /*assert ( (source_length-1) * dest_scale >= (dest_length-1) * source_scale );*/

    for (i = 0; i < dest_length * dest_step; i += dest_step)
    {
        dest[i] = (char)((left_modifier * left_pixel + right_modifier * right_pixel + round_value) / dest_scale);

        right_modifier += source_scale;

        while (right_modifier > dest_scale)
        {
            right_modifier -= dest_scale;
            source += source_step;
            left_pixel = *source;
            right_pixel = *(source + source_step);
        }

        left_modifier = dest_scale - right_modifier;
    }
}

/****************************************************************************
 *
 *  ROUTINE       : Scale2D
 *
 *  INPUTS        : const unsigned char *source  : Pointer to data to be scaled.
 *                  int source_pitch              : Stride of source image.
 *                  unsigned int source_width     : Width of input image.
 *                  unsigned int source_height    : Height of input image.
 *                  unsigned char *dest          : Pointer to output data array.
 *                  int dest_pitch                : Stride of destination image.
 *                  unsigned int dest_width       : Width of destination image.
 *                  unsigned int dest_height      : Height of destination image.
 *                  unsigned char *temp_area      : Pointer to temp work area.
 *                  unsigned char temp_area_height : Height of temp work area.
 *                  unsigned int hscale          : Horizontal scale factor numerator.
 *                  unsigned int hratio          : Horizontal scale factor denominator.
 *                  unsigned int vscale          : Vertical scale factor numerator.
 *                  unsigned int vratio          : Vertical scale factor denominator.
 *                  unsigned int interlaced      : Interlace flag.
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : void
 *
 *  FUNCTION      : Performs 2-tap linear interpolation in two dimensions.
 *
 *  SPECIAL NOTES : Expansion is performed one band at a time to help with
 *                  caching.
 *
 ****************************************************************************/
static
void Scale2D
(
    /*const*/
    unsigned char *source,
    int source_pitch,
    unsigned int source_width,
    unsigned int source_height,
    unsigned char *dest,
    int dest_pitch,
    unsigned int dest_width,
    unsigned int dest_height,
    unsigned char *temp_area,
    unsigned char temp_area_height,
    unsigned int hscale,
    unsigned int hratio,
    unsigned int vscale,
    unsigned int vratio,
    unsigned int interlaced
)
{
    /*unsigned*/
    int i, j, k;
    int bands;
    int dest_band_height;
    int source_band_height;

    typedef void (*Scale1D)(const unsigned char * source, int source_step, unsigned int source_scale, unsigned int source_length,
                            unsigned char * dest, int dest_step, unsigned int dest_scale, unsigned int dest_length);

    Scale1D Scale1Dv = scale1d_c;
    Scale1D Scale1Dh = scale1d_c;

    void (*horiz_line_scale)(const unsigned char *, unsigned int, unsigned char *, unsigned int) = NULL;
    void (*vert_band_scale)(unsigned char *, unsigned int, unsigned char *, unsigned int, unsigned int) = NULL;

    int ratio_scalable = 1;
    int interpolation = 0;

    unsigned char *source_base; /* = (unsigned char *) ((source_pitch >= 0) ? source : (source + ((source_height-1) * source_pitch))); */
    unsigned char *line_src;


    source_base = (unsigned char *)source;

    if (source_pitch < 0)
    {
        int offset;

        offset = (source_height - 1);
        offset *= source_pitch;

        source_base += offset;
    }

    /* find out the ratio for each direction */
    switch (hratio * 10 / hscale)
    {
    case 8:
        /* 4-5 Scale in Width direction */
        horiz_line_scale = vp8_horizontal_line_5_4_scale;
        break;
    case 6:
        /* 3-5 Scale in Width direction */
        horiz_line_scale = vp8_horizontal_line_5_3_scale;
        break;
    case 5:
        /* 1-2 Scale in Width direction */
        horiz_line_scale = vp8_horizontal_line_2_1_scale;
        break;
    default:
        /* The ratio is not acceptable now */
        /* throw("The ratio is not acceptable for now!"); */
        ratio_scalable = 0;
        break;
    }

    switch (vratio * 10 / vscale)
    {
    case 8:
        /* 4-5 Scale in vertical direction */
        vert_band_scale     = vp8_vertical_band_5_4_scale;
        source_band_height  = 5;
        dest_band_height    = 4;
        break;
    case 6:
        /* 3-5 Scale in vertical direction */
        vert_band_scale     = vp8_vertical_band_5_3_scale;
        source_band_height  = 5;
        dest_band_height    = 3;
        break;
    case 5:
        /* 1-2 Scale in vertical direction */

        if (interlaced)
        {
            /* if the content is interlaced, point sampling is used */
            vert_band_scale     = vp8_vertical_band_2_1_scale;
        }
        else
        {

            interpolation = 1;
            /* if the content is progressive, interplo */
            vert_band_scale     = vp8_vertical_band_2_1_scale_i;

        }

        source_band_height  = 2;
        dest_band_height    = 1;
        break;
    default:
        /* The ratio is not acceptable now */
        /* throw("The ratio is not acceptable for now!"); */
        ratio_scalable = 0;
        break;
    }

    if (ratio_scalable)
    {
        if (source_height == dest_height)
        {
            /* for each band of the image */
            for (k = 0; k < (int)dest_height; k++)
            {
                horiz_line_scale(source, source_width, dest, dest_width);
                source += source_pitch;
                dest   += dest_pitch;
            }

            return;
        }

        if (interpolation)
        {
            if (source < source_base)
                source = source_base;

            horiz_line_scale(source, source_width, temp_area, dest_width);
        }

        for (k = 0; k < (int)(dest_height + dest_band_height - 1) / dest_band_height; k++)
        {
            /* scale one band horizontally */
            for (i = 0; i < source_band_height; i++)
            {
                /* Trap case where we could read off the base of the source buffer */

                line_src = (unsigned char *)source + i * source_pitch;

                if (line_src < source_base)
                    line_src = source_base;

                horiz_line_scale(line_src, source_width,
                                 temp_area + (i + 1)*dest_pitch, dest_width);
            }

            /* Vertical scaling is in place */
            vert_band_scale(temp_area + dest_pitch, dest_pitch, dest, dest_pitch, dest_width);

            if (interpolation)
                vpx_memcpy(temp_area, temp_area + source_band_height * dest_pitch, dest_width);

            /* Next band... */
            source += (unsigned long) source_band_height  * source_pitch;
            dest   += (unsigned long) dest_band_height * dest_pitch;
        }

        return;
    }

    if (hscale == 2 && hratio == 1)
        Scale1Dh = scale1d_2t1_ps;

    if (vscale == 2 && vratio == 1)
    {
        if (interlaced)
            Scale1Dv = scale1d_2t1_ps;
        else
            Scale1Dv = scale1d_2t1_i;
    }

    if (source_height == dest_height)
    {
        /* for each band of the image */
        for (k = 0; k < (int)dest_height; k++)
        {
            Scale1Dh(source, 1, hscale, source_width + 1, dest, 1, hratio, dest_width);
            source += source_pitch;
            dest   += dest_pitch;
        }

        return;
    }

    if (dest_height > source_height)
    {
        dest_band_height   = temp_area_height - 1;
        source_band_height = dest_band_height * source_height / dest_height;
    }
    else
    {
        source_band_height = temp_area_height - 1;
        dest_band_height   = source_band_height * vratio / vscale;
    }

    /* first row needs to be done so that we can stay one row ahead for vertical zoom */
    Scale1Dh(source, 1, hscale, source_width + 1, temp_area, 1, hratio, dest_width);

    /* for each band of the image */
    bands = (dest_height + dest_band_height - 1) / dest_band_height;

    for (k = 0; k < bands; k++)
    {
        /* scale one band horizontally */
        for (i = 1; i < source_band_height + 1; i++)
        {
            if (k * source_band_height + i < (int) source_height)
            {
                Scale1Dh(source + i * source_pitch, 1, hscale, source_width + 1,
                         temp_area + i * dest_pitch, 1, hratio, dest_width);
            }
            else  /*  Duplicate the last row */
            {
                /* copy temp_area row 0 over from last row in the past */
                duck_memcpy(temp_area + i * dest_pitch, temp_area + (i - 1)*dest_pitch, dest_pitch);
            }
        }

        /* scale one band vertically */
        for (j = 0; j < (int)dest_width; j++)
        {
            Scale1Dv(&temp_area[j], dest_pitch, vscale, source_band_height + 1,
                     &dest[j], dest_pitch, vratio, dest_band_height);
        }

        /* copy temp_area row 0 over from last row in the past */
        duck_memcpy(temp_area, temp_area + source_band_height * dest_pitch, dest_pitch);

        /* move to the next band */
        source += source_band_height * source_pitch;
        dest   += dest_band_height * dest_pitch;
    }
}

/****************************************************************************
 *
 *  ROUTINE       :
 *
 *  INPUTS        : YV12_BUFFER_CONFIG *src       : Pointer to frame to be scaled.
 *                  YV12_BUFFER_CONFIG *dst       : Pointer to buffer to hold scaled frame.
 *                  unsigned char *temp_area      : Pointer to temp work area.
 *                  unsigned char temp_area_height : Height of temp work area.
 *                  unsigned int hscale          : Horizontal scale factor numerator.
 *                  unsigned int hratio          : Horizontal scale factor denominator.
 *                  unsigned int vscale          : Vertical scale factor numerator.
 *                  unsigned int vratio          : Vertical scale factor denominator.
 *                  unsigned int interlaced      : Interlace flag.
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : void
 *
 *  FUNCTION      : Performs 2-tap linear interpolation in two dimensions.
 *
 *  SPECIAL NOTES : Expansion is performed one band at a time to help with
 *                  caching.
 *
 ****************************************************************************/
void vp8_scale_frame
(
    YV12_BUFFER_CONFIG *src,
    YV12_BUFFER_CONFIG *dst,
    unsigned char *temp_area,
    unsigned char temp_height,
    unsigned int hscale,
    unsigned int hratio,
    unsigned int vscale,
    unsigned int vratio,
    unsigned int interlaced
)
{
    int i;
    int dw = (hscale - 1 + src->y_width * hratio) / hscale;
    int dh = (vscale - 1 + src->y_height * vratio) / vscale;

    /* call our internal scaling routines!! */
    Scale2D((unsigned char *) src->y_buffer, src->y_stride, src->y_width, src->y_height,
            (unsigned char *) dst->y_buffer, dst->y_stride, dw, dh,
            temp_area, temp_height, hscale, hratio, vscale, vratio, interlaced);

    if (dw < (int)dst->y_width)
        for (i = 0; i < dh; i++)
            duck_memset(dst->y_buffer + i * dst->y_stride + dw - 1, dst->y_buffer[i*dst->y_stride+dw-2], dst->y_width - dw + 1);

    if (dh < (int)dst->y_height)
        for (i = dh - 1; i < (int)dst->y_height; i++)
            duck_memcpy(dst->y_buffer + i * dst->y_stride, dst->y_buffer + (dh - 2) * dst->y_stride, dst->y_width + 1);

    Scale2D((unsigned char *) src->u_buffer, src->uv_stride, src->uv_width, src->uv_height,
            (unsigned char *) dst->u_buffer, dst->uv_stride, dw / 2, dh / 2,
            temp_area, temp_height, hscale, hratio, vscale, vratio, interlaced);

    if (dw / 2 < (int)dst->uv_width)
        for (i = 0; i < dst->uv_height; i++)
            duck_memset(dst->u_buffer + i * dst->uv_stride + dw / 2 - 1, dst->u_buffer[i*dst->uv_stride+dw/2-2], dst->uv_width - dw / 2 + 1);

    if (dh / 2 < (int)dst->uv_height)
        for (i = dh / 2 - 1; i < (int)dst->y_height / 2; i++)
            duck_memcpy(dst->u_buffer + i * dst->uv_stride, dst->u_buffer + (dh / 2 - 2)*dst->uv_stride, dst->uv_width);

    Scale2D((unsigned char *) src->v_buffer, src->uv_stride, src->uv_width, src->uv_height,
            (unsigned char *) dst->v_buffer, dst->uv_stride, dw / 2, dh / 2,
            temp_area, temp_height, hscale, hratio, vscale, vratio, interlaced);

    if (dw / 2 < (int)dst->uv_width)
        for (i = 0; i < dst->uv_height; i++)
            duck_memset(dst->v_buffer + i * dst->uv_stride + dw / 2 - 1, dst->v_buffer[i*dst->uv_stride+dw/2-2], dst->uv_width - dw / 2 + 1);

    if (dh / 2 < (int) dst->uv_height)
        for (i = dh / 2 - 1; i < (int)dst->y_height / 2; i++)
            duck_memcpy(dst->v_buffer + i * dst->uv_stride, dst->v_buffer + (dh / 2 - 2)*dst->uv_stride, dst->uv_width);
}
/****************************************************************************
 *
 *  ROUTINE       : any_ratio_2d_scale
 *
 *  INPUTS        : SCALE_INSTANCE *si      : Pointer to post-processor instance (NOT USED).
 *                  const unsigned char *source : Pointer to source image.
 *                  unsigned int source_pitch    : Stride of source image.
 *                  unsigned int source_width    : Width of source image.
 *                  unsigned int source_height   : Height of source image (NOT USED).
 *                  unsigned char *dest         : Pointer to destination image.
 *                  unsigned int dest_pitch      : Stride of destination image.
 *                  unsigned int dest_width      : Width of destination image.
 *                  unsigned int dest_height     : Height of destination image.
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : int: 1 if image scaled, 0 if image could not be scaled.
 *
 *  FUNCTION      : Scale the image with changing apect ratio.
 *
 *  SPECIAL NOTES : This scaling is a bi-linear scaling. Need to re-work the
 *                  whole function for new scaling algorithm.
 *
 ****************************************************************************/
static
int any_ratio_2d_scale
(
    SCALE_VARS *si,
    const unsigned char *source,
    int source_pitch,
    unsigned int source_width,
    unsigned int source_height,
    unsigned char *dest,
    unsigned int dest_pitch,
    unsigned int dest_width,
    unsigned int dest_height
)
{
    unsigned int i, k;
    unsigned int src_band_height  = 0;
    unsigned int dest_band_height = 0;

    /* suggested scale factors */
    int hs = si->HScale;
    int hr = si->HRatio;
    int vs = si->VScale;
    int vr = si->VRatio;

    /* assume the ratios are scalable instead of should be centered */
    int ratio_scalable = 1;

    const unsigned char *source_base = ((source_pitch >= 0) ? source : (source + ((source_height - 1) * source_pitch)));
    const unsigned char *line_src;

    void (*horiz_line_scale)(const unsigned char *, unsigned int, unsigned char *, unsigned int) = NULL;
    void (*vert_band_scale)(unsigned char *, unsigned int, unsigned int) = NULL;
    void (*last_vert_band_scale)(unsigned char *, unsigned int, unsigned int) = NULL;

    (void) si;

    /* find out the ratio for each direction */
    switch (hr * 30 / hs)
    {
    case 24:
        /* 4-5 Scale in Width direction */
        horiz_line_scale = vp8_horizontal_line_4_5_scale;
        break;
    case 22:
        /* 3-4 Scale in Width direction */
        horiz_line_scale = vp8_horizontal_line_3_4_scale;
        break;

    case 20:
        /* 4-5 Scale in Width direction */
        horiz_line_scale = vp8_horizontal_line_2_3_scale;
        break;
    case 18:
        /* 3-5 Scale in Width direction */
        horiz_line_scale = vp8_horizontal_line_3_5_scale;
        break;
    case 15:
        /* 1-2 Scale in Width direction */
        horiz_line_scale = vp8_horizontal_line_1_2_scale;
        break;
    case 30:
        /* no scale in Width direction */
        horiz_line_scale = horizontal_line_copy;
        break;
    default:
        /* The ratio is not acceptable now */
        /* throw("The ratio is not acceptable for now!"); */
        ratio_scalable = 0;
        break;
    }

    switch (vr * 30 / vs)
    {
    case 24:
        /* 4-5 Scale in vertical direction */
        vert_band_scale     = vp8_vertical_band_4_5_scale;
        last_vert_band_scale = vp8_last_vertical_band_4_5_scale;
        src_band_height     = 4;
        dest_band_height    = 5;
        break;
    case 22:
        /* 3-4 Scale in vertical direction */
        vert_band_scale     = vp8_vertical_band_3_4_scale;
        last_vert_band_scale = vp8_last_vertical_band_3_4_scale;
        src_band_height     = 3;
        dest_band_height    = 4;
        break;
    case 20:
        /* 2-3 Scale in vertical direction */
        vert_band_scale     = vp8_vertical_band_2_3_scale;
        last_vert_band_scale = vp8_last_vertical_band_2_3_scale;
        src_band_height     = 2;
        dest_band_height    = 3;
        break;
    case 18:
        /* 3-5 Scale in vertical direction */
        vert_band_scale     = vp8_vertical_band_3_5_scale;
        last_vert_band_scale = vp8_last_vertical_band_3_5_scale;
        src_band_height     = 3;
        dest_band_height    = 5;
        break;
    case 15:
        /* 1-2 Scale in vertical direction */
        vert_band_scale     = vp8_vertical_band_1_2_scale;
        last_vert_band_scale = vp8_last_vertical_band_1_2_scale;
        src_band_height     = 1;
        dest_band_height    = 2;
        break;
    case 30:
        /* no scale in Width direction */
        vert_band_scale     = null_scale;
        last_vert_band_scale = null_scale;
        src_band_height     = 4;
        dest_band_height    = 4;
        break;
    default:
        /* The ratio is not acceptable now */
        /* throw("The ratio is not acceptable for now!"); */
        ratio_scalable = 0;
        break;
    }

    if (ratio_scalable == 0)
        return ratio_scalable;

    horiz_line_scale(source, source_width, dest, dest_width);

    /* except last band */
    for (k = 0; k < (dest_height + dest_band_height - 1) / dest_band_height - 1; k++)
    {
        /* scale one band horizontally */
        for (i = 1; i < src_band_height; i++)
        {
            /* Trap case where we could read off the base of the source buffer */
            line_src = source + i * source_pitch;

            if (line_src < source_base)
                line_src = source_base;

            horiz_line_scale(line_src, source_width,
                             dest + i * dest_pitch, dest_width);
        }

        /* first line of next band */
        /* Trap case where we could read off the base of the source buffer */
        line_src = source + src_band_height * source_pitch;

        if (line_src < source_base)
            line_src = source_base;

        horiz_line_scale(line_src, source_width,
                         dest + dest_band_height * dest_pitch,
                         dest_width);

        /* Vertical scaling is in place */
        vert_band_scale(dest, dest_pitch, dest_width);

        /* Next band... */
        source += src_band_height  * source_pitch;
        dest   += dest_band_height * dest_pitch;
    }

    /* scale one band horizontally */
    for (i = 1; i < src_band_height; i++)
    {
        /* Trap case where we could read off the base of the source buffer */
        line_src = source + i * source_pitch;

        if (line_src < source_base)
            line_src = source_base;

        horiz_line_scale(line_src, source_width,
                         dest + i * dest_pitch,
                         dest_width);
    }

    /* Vertical scaling is in place */
    last_vert_band_scale(dest, dest_pitch, dest_width);

    return ratio_scalable;
}

/****************************************************************************
 *
 *  ROUTINE       : any_ratio_frame_scale
 *
 *  INPUTS        : SCALE_INSTANCE *si       : Pointer to post-processor instance (NOT USED).
 *                  unsigned char *frame_buffer           : Pointer to source image.
 *                  int YOffset                : Offset from start of buffer to Y samples.
 *                  int UVOffset               : Offset from start of buffer to UV samples.
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : int: 1 if image scaled, 0 if image could not be scaled.
 *
 *  FUNCTION      : Scale the image with changing apect ratio.
 *
 *  SPECIAL NOTES : None.
 *
 ****************************************************************************/
static
int any_ratio_frame_scale(SCALE_VARS *scale_vars, int YOffset, int UVOffset)
{
    int i;
    int ew;
    int eh;

    /* suggested scale factors */
    int hs = scale_vars->HScale;
    int hr = scale_vars->HRatio;
    int vs = scale_vars->VScale;
    int vr = scale_vars->VRatio;

    int ratio_scalable = 1;

    int sw = (scale_vars->expanded_frame_width * hr + hs - 1) / hs;
    int sh = (scale_vars->expanded_frame_height * vr + vs - 1) / vs;
    int dw = scale_vars->expanded_frame_width;
    int dh = scale_vars->expanded_frame_height;
    YV12_BUFFER_CONFIG *src_yuv_config = scale_vars->src_yuv_config;
    YV12_BUFFER_CONFIG *dst_yuv_config = scale_vars->dst_yuv_config;

    if (hr == 3)
        ew = (sw + 2) / 3 * 3 * hs / hr;
    else
        ew = (sw + 7) / 8 * 8 * hs / hr;

    if (vr == 3)
        eh = (sh + 2) / 3 * 3 * vs / vr;
    else
        eh = (sh + 7) / 8 * 8 * vs / vr;

    ratio_scalable = any_ratio_2d_scale(scale_vars,
                                        (const unsigned char *)src_yuv_config->y_buffer,
                                        src_yuv_config->y_stride, sw, sh,
                                        (unsigned char *) dst_yuv_config->y_buffer + YOffset,
                                        dst_yuv_config->y_stride, dw, dh);

    for (i = 0; i < eh; i++)
        duck_memset(dst_yuv_config->y_buffer + YOffset + i * dst_yuv_config->y_stride + dw, 0, ew - dw);

    for (i = dh; i < eh; i++)
        duck_memset(dst_yuv_config->y_buffer + YOffset + i * dst_yuv_config->y_stride, 0, ew);

    if (ratio_scalable == 0)
        return ratio_scalable;

    sw = (sw + 1) >> 1;
    sh = (sh + 1) >> 1;
    dw = (dw + 1) >> 1;
    dh = (dh + 1) >> 1;

    any_ratio_2d_scale(scale_vars,
                       (const unsigned char *)src_yuv_config->u_buffer,
                       src_yuv_config->y_stride / 2, sw, sh,
                       (unsigned char *)dst_yuv_config->u_buffer + UVOffset,
                       dst_yuv_config->uv_stride, dw, dh);

    any_ratio_2d_scale(scale_vars,
                       (const unsigned char *)src_yuv_config->v_buffer,
                       src_yuv_config->y_stride / 2, sw, sh,
                       (unsigned char *)dst_yuv_config->v_buffer + UVOffset,
                       dst_yuv_config->uv_stride, dw, dh);

    return ratio_scalable;
}

/****************************************************************************
 *
 *  ROUTINE       : center_image
 *
 *  INPUTS        : SCALE_INSTANCE *si       : Pointer to post-processor instance.
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : void
 *
 *  FUNCTION      : Centers the image without scaling in the output buffer.
 *
 *  SPECIAL NOTES : None.
 *
 ****************************************************************************/
static void
center_image(YV12_BUFFER_CONFIG *src_yuv_config, YV12_BUFFER_CONFIG *dst_yuv_config)
{
    int i;
    int row_offset, col_offset;
    unsigned char *src_data_pointer;
    unsigned char *dst_data_pointer;

    /* center values */
    row_offset = (dst_yuv_config->y_height - src_yuv_config->y_height) / 2;
    col_offset = (dst_yuv_config->y_width - src_yuv_config->y_width) / 2;

    /* Y's */
    src_data_pointer = src_yuv_config->y_buffer;
    dst_data_pointer = (unsigned char *)dst_yuv_config->y_buffer + (row_offset * dst_yuv_config->y_stride) + col_offset;

    for (i = 0; i < src_yuv_config->y_height; i++)
    {
        duck_memcpy(dst_data_pointer, src_data_pointer, src_yuv_config->y_width);
        dst_data_pointer += dst_yuv_config->y_stride;
        src_data_pointer += src_yuv_config->y_stride;
    }

    row_offset /= 2;
    col_offset /= 2;

    /* U's */
    src_data_pointer = src_yuv_config->u_buffer;
    dst_data_pointer = (unsigned char *)dst_yuv_config->u_buffer + (row_offset * dst_yuv_config->uv_stride) + col_offset;

    for (i = 0; i < src_yuv_config->uv_height; i++)
    {
        duck_memcpy(dst_data_pointer, src_data_pointer, src_yuv_config->uv_width);
        dst_data_pointer += dst_yuv_config->uv_stride;
        src_data_pointer += src_yuv_config->uv_stride;
    }

    /* V's */
    src_data_pointer = src_yuv_config->v_buffer;
    dst_data_pointer = (unsigned char *)dst_yuv_config->v_buffer + (row_offset * dst_yuv_config->uv_stride) + col_offset;

    for (i = 0; i < src_yuv_config->uv_height; i++)
    {
        duck_memcpy(dst_data_pointer, src_data_pointer, src_yuv_config->uv_width);
        dst_data_pointer += dst_yuv_config->uv_stride;
        src_data_pointer += src_yuv_config->uv_stride;
    }
}

/****************************************************************************
 *
 *  ROUTINE       : scale_or_center
 *
 *  INPUTS        : SCALE_INSTANCE *si       : Pointer to post-processor instance.
 *
 *
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : void
 *
 *  FUNCTION      : Decides to scale or center image in scale buffer for blit
 *
 *  SPECIAL NOTES : None.
 *
 ****************************************************************************/
void
vp8_yv12_scale_or_center
(
    YV12_BUFFER_CONFIG *src_yuv_config,
    YV12_BUFFER_CONFIG *dst_yuv_config,
    int expanded_frame_width,
    int expanded_frame_height,
    int scaling_mode,
    int HScale,
    int HRatio,
    int VScale,
    int VRatio
)
{
    /*if ( ppi->post_processing_level )
          update_umvborder ( ppi, frame_buffer );*/


    switch (scaling_mode)
    {
    case SCALE_TO_FIT:
    case MAINTAIN_ASPECT_RATIO:
    {
        SCALE_VARS scale_vars;
        /* center values */
#if 1
        int row = (dst_yuv_config->y_height - expanded_frame_height) / 2;
        int col = (dst_yuv_config->y_width  - expanded_frame_width) / 2;
        /*int YOffset  = row * dst_yuv_config->y_width + col;
        int UVOffset = (row>>1) * dst_yuv_config->uv_width + (col>>1);*/
        int YOffset  = row * dst_yuv_config->y_stride + col;
        int UVOffset = (row >> 1) * dst_yuv_config->uv_stride + (col >> 1);
#else
        int row = (src_yuv_config->y_height - expanded_frame_height) / 2;
        int col = (src_yuv_config->y_width  - expanded_frame_width) / 2;
        int YOffset  = row * src_yuv_config->y_width + col;
        int UVOffset = (row >> 1) * src_yuv_config->uv_width + (col >> 1);
#endif

        scale_vars.dst_yuv_config = dst_yuv_config;
        scale_vars.src_yuv_config = src_yuv_config;
        scale_vars.HScale = HScale;
        scale_vars.HRatio = HRatio;
        scale_vars.VScale = VScale;
        scale_vars.VRatio = VRatio;
        scale_vars.expanded_frame_width = expanded_frame_width;
        scale_vars.expanded_frame_height = expanded_frame_height;

        /* perform center and scale */
        any_ratio_frame_scale(&scale_vars, YOffset, UVOffset);

        break;
    }
    case CENTER:
        center_image(src_yuv_config, dst_yuv_config);
        break;

    default:
        break;
    }
}
