/*
 *  Copyright (c) 2010 The VP8 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 :     system_dependant.c
*
*   Description  :     Miscellaneous system dependant functions
*
****************************************************************************/

/****************************************************************************
*  Header Files
****************************************************************************/
#include "vpx_scale/vpxscale.h"
#include "cpuidlib.h"

/****************************************************************************
*  Imports
*****************************************************************************/
extern void register_generic_scalers(void);
extern void register_mmxscalers(void);

/****************************************************************************
 *
 *  ROUTINE       : post_proc_machine_specific_config
 *
 *  INPUTS        : UINT32 Version : Codec version number.
 *
 *  OUTPUTS       : None.
 *
 *  RETURNS       : void
 *
 *  FUNCTION      : Checks for machine specifc features such as MMX support
 *                  sets appropriate flags and function pointers.
 *
 *  SPECIAL NOTES : None.
 *
 ****************************************************************************/
void
vp8_scale_machine_specific_config(void)
{
    // If MMX supported then set to use MMX versions of functions else
    // use original 'C' versions.
    int mmx_enabled;
    int xmm_enabled;
    int wmt_enabled;

    vpx_get_processor_flags(&mmx_enabled, &xmm_enabled, &wmt_enabled);

    if (mmx_enabled || xmm_enabled || wmt_enabled)
    {
        register_mmxscalers();
    }
    else
    {
        vp8_horizontal_line_1_2_scale        = vp8cx_horizontal_line_1_2_scale_c;
        vp8_vertical_band_1_2_scale          = vp8cx_vertical_band_1_2_scale_c;
        vp8_last_vertical_band_1_2_scale      = vp8cx_last_vertical_band_1_2_scale_c;
        vp8_horizontal_line_3_5_scale        = vp8cx_horizontal_line_3_5_scale_c;
        vp8_vertical_band_3_5_scale          = vp8cx_vertical_band_3_5_scale_c;
        vp8_last_vertical_band_3_5_scale      = vp8cx_last_vertical_band_3_5_scale_c;
        vp8_horizontal_line_3_4_scale        = vp8cx_horizontal_line_3_4_scale_c;
        vp8_vertical_band_3_4_scale          = vp8cx_vertical_band_3_4_scale_c;
        vp8_last_vertical_band_3_4_scale      = vp8cx_last_vertical_band_3_4_scale_c;
        vp8_horizontal_line_2_3_scale        = vp8cx_horizontal_line_2_3_scale_c;
        vp8_vertical_band_2_3_scale          = vp8cx_vertical_band_2_3_scale_c;
        vp8_last_vertical_band_2_3_scale      = vp8cx_last_vertical_band_2_3_scale_c;
        vp8_horizontal_line_4_5_scale        = vp8cx_horizontal_line_4_5_scale_c;
        vp8_vertical_band_4_5_scale          = vp8cx_vertical_band_4_5_scale_c;
        vp8_last_vertical_band_4_5_scale      = vp8cx_last_vertical_band_4_5_scale_c;


        vp8_vertical_band_5_4_scale           = vp8cx_vertical_band_5_4_scale_c;
        vp8_vertical_band_5_3_scale           = vp8cx_vertical_band_5_3_scale_c;
        vp8_vertical_band_2_1_scale           = vp8cx_vertical_band_2_1_scale_c;
        vp8_vertical_band_2_1_scale_i         = vp8cx_vertical_band_2_1_scale_i_c;
        vp8_horizontal_line_2_1_scale         = vp8cx_horizontal_line_2_1_scale_c;
        vp8_horizontal_line_5_3_scale         = vp8cx_horizontal_line_5_3_scale_c;
        vp8_horizontal_line_5_4_scale         = vp8cx_horizontal_line_5_4_scale_c;

    }
}
