/*
 *  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.
 */


#ifndef __VPX_SCALE_ARBITRARY_H__
#define __VPX_SCALE_ARBITRARY_H__

#include "vpx_scale/yv12config.h"

typedef struct
{
    int in_width;
    int in_height;

    int out_width;
    int out_height;
    int max_usable_out_width;

    // numerator for the width and height
    int nw;
    int nh;
    int nh_uv;

    // output to input correspondance array
    short *l_w;
    short *l_h;
    short *l_h_uv;

    // polyphase coefficients
    short *c_w;
    short *c_h;
    short *c_h_uv;

    // buffer for horizontal filtering.
    unsigned char *hbuf;
    unsigned char *hbuf_uv;
} BICUBIC_SCALER_STRUCT;

int bicubic_coefficient_setup(int in_width, int in_height, int out_width, int out_height);
int bicubic_scale(int in_width, int in_height, int in_stride,
                  int out_width, int out_height, int out_stride,
                  unsigned char *input_image, unsigned char *output_image);
void bicubic_scale_frame_reset();
void bicubic_scale_frame(YV12_BUFFER_CONFIG *src, YV12_BUFFER_CONFIG *dst,
                         int new_width, int new_height);
void bicubic_coefficient_init();
void bicubic_coefficient_destroy();

#endif /* __VPX_SCALE_ARBITRARY_H__ */
