os/ossrv/genericopenlibs/liboil/src/dct/idct8_f64.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*
sl@0
     2
 * LIBOIL - Library of Optimized Inner Loops
sl@0
     3
 * Copyright (c) 2003,2004 David A. Schleef <ds@schleef.org>
sl@0
     4
 * All rights reserved.
sl@0
     5
 *
sl@0
     6
 * Redistribution and use in source and binary forms, with or without
sl@0
     7
 * modification, are permitted provided that the following conditions
sl@0
     8
 * are met:
sl@0
     9
 * 1. Redistributions of source code must retain the above copyright
sl@0
    10
 *    notice, this list of conditions and the following disclaimer.
sl@0
    11
 * 2. Redistributions in binary form must reproduce the above copyright
sl@0
    12
 *    notice, this list of conditions and the following disclaimer in the
sl@0
    13
 *    documentation and/or other materials provided with the distribution.
sl@0
    14
 * 
sl@0
    15
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
sl@0
    16
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
sl@0
    17
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
sl@0
    18
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
sl@0
    19
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
sl@0
    20
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
sl@0
    21
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
sl@0
    22
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
sl@0
    23
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
sl@0
    24
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
sl@0
    25
 * POSSIBILITY OF SUCH DAMAGE.
sl@0
    26
 */
sl@0
    27
//Portions Copyright (c)  2008-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
sl@0
    28
sl@0
    29
#ifdef HAVE_CONFIG_H
sl@0
    30
#include "config.h"
sl@0
    31
#endif
sl@0
    32
sl@0
    33
#include <liboil/liboilfunction.h>
sl@0
    34
#include "liboil/dct/dct.h"
sl@0
    35
#include <math.h>
sl@0
    36
sl@0
    37
/**
sl@0
    38
 * oil_idct8_f64:
sl@0
    39
 * @d_8:
sl@0
    40
 * @dstr:
sl@0
    41
 * @s_8:
sl@0
    42
 * @sstr:
sl@0
    43
 *
sl@0
    44
 * Performs a Inverse Discrete Cosine Transform on @s_8 and places
sl@0
    45
 * the result in @d_8.
sl@0
    46
 */
sl@0
    47
OIL_DEFINE_CLASS (idct8_f64, "double *d_8, int dstr, double *s_8, int sstr");
sl@0
    48
sl@0
    49
#define C0_9808 0.980785280
sl@0
    50
#define C0_9239 0.923879532
sl@0
    51
#define C0_8315 0.831469612
sl@0
    52
#define C0_7071 0.707106781
sl@0
    53
#define C0_5556 0.555570233
sl@0
    54
#define C0_3827 0.382683432
sl@0
    55
#define C0_1951 0.195090322
sl@0
    56
sl@0
    57
static void idct8_f64_ref(double *dest, int dstr, const double *src, int sstr)
sl@0
    58
{
sl@0
    59
	static double idct_coeff[8][8];
sl@0
    60
	static int idct_coeff_init = 0;
sl@0
    61
	int i,j;
sl@0
    62
	double x;
sl@0
    63
sl@0
    64
	if(!idct_coeff_init){
sl@0
    65
		double scale;
sl@0
    66
sl@0
    67
		for(i=0;i<8;i++){
sl@0
    68
			scale = (i==0) ? sqrt(0.125) : 0.5;
sl@0
    69
			for(j=0;j<8;j++){
sl@0
    70
				idct_coeff[j][i] = scale *
sl@0
    71
					cos((M_PI/8)*i*(j+0.5));
sl@0
    72
			}
sl@0
    73
		}
sl@0
    74
		idct_coeff_init = 1;
sl@0
    75
	}
sl@0
    76
sl@0
    77
	for(i=0;i<8;i++){
sl@0
    78
		x = 0;
sl@0
    79
		for(j=0;j<8;j++){
sl@0
    80
			x += idct_coeff[i][j] * OIL_GET (src, sstr*j, double);
sl@0
    81
		}
sl@0
    82
		OIL_GET (dest, dstr*i, double) = x;
sl@0
    83
	}
sl@0
    84
}
sl@0
    85
sl@0
    86
OIL_DEFINE_IMPL_REF (idct8_f64_ref, idct8_f64);
sl@0
    87
sl@0
    88
sl@0
    89
static void idct8_f64_fastx(double *dest, int dstr, const double *src, int sstr)
sl@0
    90
{
sl@0
    91
	double s07, s16, s25, s34;
sl@0
    92
	double d07, d16, d25, d34;
sl@0
    93
	double ss07s34, ss16s25;
sl@0
    94
	double ds07s34, ds16s25;
sl@0
    95
sl@0
    96
	ss07s34 = C0_7071*(OIL_GET(src,sstr*0, double) + OIL_GET(src,sstr*4, double));
sl@0
    97
	ss16s25 = C0_7071*(OIL_GET(src,sstr*0, double) - OIL_GET(src,sstr*4, double));
sl@0
    98
sl@0
    99
	ds07s34 = C0_9239* OIL_GET(src,sstr*2, double) + C0_3827* OIL_GET(src,sstr*6, double);
sl@0
   100
	ds16s25 = C0_3827* OIL_GET(src,sstr*2, double) - C0_9239* OIL_GET(src,sstr*6, double);
sl@0
   101
sl@0
   102
	s07 = ss07s34 + ds07s34;
sl@0
   103
	s34 = ss07s34 - ds07s34;
sl@0
   104
sl@0
   105
	s16 = ss16s25 + ds16s25;
sl@0
   106
	s25 = ss16s25 - ds16s25;
sl@0
   107
sl@0
   108
	d07 = C0_9808* OIL_GET(src,sstr*1, double) + C0_8315* OIL_GET(src,sstr*3, double)
sl@0
   109
		+ C0_5556* OIL_GET(src,sstr*5, double) + C0_1951* OIL_GET(src,sstr*7, double);
sl@0
   110
	d16 = C0_8315* OIL_GET(src,sstr*1, double) - C0_1951* OIL_GET(src,sstr*3, double)
sl@0
   111
		- C0_9808* OIL_GET(src,sstr*5, double) - C0_5556* OIL_GET(src,sstr*7, double);
sl@0
   112
	d25 = C0_5556* OIL_GET(src,sstr*1, double) - C0_9808* OIL_GET(src,sstr*3, double)
sl@0
   113
		+ C0_1951* OIL_GET(src,sstr*5, double) + C0_8315* OIL_GET(src,sstr*7, double);
sl@0
   114
	d34 = C0_1951* OIL_GET(src,sstr*1, double) - C0_5556* OIL_GET(src,sstr*3, double)
sl@0
   115
		+ C0_8315* OIL_GET(src,sstr*5, double) - C0_9808* OIL_GET(src,sstr*7, double);
sl@0
   116
sl@0
   117
	OIL_GET(dest,dstr*0, double) = 0.5 * (s07 + d07);
sl@0
   118
	OIL_GET(dest,dstr*1, double) = 0.5 * (s16 + d16);
sl@0
   119
	OIL_GET(dest,dstr*2, double) = 0.5 * (s25 + d25);
sl@0
   120
	OIL_GET(dest,dstr*3, double) = 0.5 * (s34 + d34);
sl@0
   121
	OIL_GET(dest,dstr*4, double) = 0.5 * (s34 - d34);
sl@0
   122
	OIL_GET(dest,dstr*5, double) = 0.5 * (s25 - d25);
sl@0
   123
	OIL_GET(dest,dstr*6, double) = 0.5 * (s16 - d16);
sl@0
   124
	OIL_GET(dest,dstr*7, double) = 0.5 * (s07 - d07);
sl@0
   125
sl@0
   126
}
sl@0
   127
sl@0
   128
OIL_DEFINE_IMPL (idct8_f64_fastx, idct8_f64);
sl@0
   129
sl@0
   130
sl@0
   131
sl@0
   132
sl@0
   133
#ifdef	__SYMBIAN32__
sl@0
   134
 
sl@0
   135
OilFunctionClass* __oil_function_class_idct8_f64() {
sl@0
   136
		return &_oil_function_class_idct8_f64;
sl@0
   137
}
sl@0
   138
#endif
sl@0
   139
sl@0
   140
sl@0
   141
sl@0
   142
#ifdef	__SYMBIAN32__
sl@0
   143
 
sl@0
   144
OilFunctionImpl* __oil_function_impl_idct8_f64_ref() {
sl@0
   145
		return &_oil_function_impl_idct8_f64_ref;
sl@0
   146
}
sl@0
   147
#endif
sl@0
   148
sl@0
   149
#ifdef	__SYMBIAN32__
sl@0
   150
 
sl@0
   151
OilFunctionImpl* __oil_function_impl_idct8_f64_fastx() {
sl@0
   152
		return &_oil_function_impl_idct8_f64_fastx;
sl@0
   153
}
sl@0
   154
#endif
sl@0
   155
sl@0
   156
sl@0
   157
sl@0
   158
#ifdef	__SYMBIAN32__
sl@0
   159
 
sl@0
   160
EXPORT_C void** _oil_function_class_ptr_idct8_f64 ()	{
sl@0
   161
	oil_function_class_ptr_idct8_f64 = __oil_function_class_idct8_f64();
sl@0
   162
	return &oil_function_class_ptr_idct8_f64->func;
sl@0
   163
	}
sl@0
   164
#endif
sl@0
   165