forked from len0rd/rockbox
Move av_log2 function and asociated table to the codec lib, remove 3 identical implementations, always have LUT in iram (gives a *tiny* speedup on coldfire), make the clz based function return the same value as the non clz based function for 0 input to be safe (slows down flac ~2% on the gigabeat S)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23858 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
0651fe572b
commit
b9d7f98f8c
7 changed files with 50 additions and 109 deletions
|
@ -138,6 +138,18 @@ void qsort(void *base, size_t nmemb, size_t size,
|
|||
ci->qsort(base,nmemb,size,compar);
|
||||
}
|
||||
|
||||
/* From ffmpeg - libavutil/common.h */
|
||||
const uint8_t ff_log2_tab[256] ICONST_ATTR = {
|
||||
0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
|
||||
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
|
||||
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
||||
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
|
||||
};
|
||||
|
||||
#ifdef RB_PROFILE
|
||||
void __cyg_profile_func_enter(void *this_fn, void *call_site) {
|
||||
#ifdef CPU_COLDFIRE
|
||||
|
|
|
@ -19,6 +19,9 @@
|
|||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __CODECLIB_H__
|
||||
#define __CODECLIB_H__
|
||||
|
||||
#include "config.h"
|
||||
#include "codecs.h"
|
||||
#include <sys/types.h>
|
||||
|
@ -71,6 +74,37 @@ unsigned udiv32_arm(unsigned a, unsigned b);
|
|||
#define UDIV32(a, b) (a / b)
|
||||
#endif
|
||||
|
||||
/* TODO figure out if we really need to care about calculating
|
||||
av_log2(0) */
|
||||
#if (defined(CPU_ARM) && (ARM_ARCH > 4))
|
||||
static inline unsigned int av_log2(uint32_t v)
|
||||
{
|
||||
unsigned int lz = __builtin_clz(v);
|
||||
return 31 - lz + (lz >> 5); /* make sure av_log2(0) returns 0 */
|
||||
}
|
||||
#else
|
||||
/* From libavutil/common.h */
|
||||
extern const uint8_t ff_log2_tab[256] ICONST_ATTR;
|
||||
|
||||
static inline unsigned int av_log2(unsigned int v)
|
||||
{
|
||||
int n;
|
||||
|
||||
n = 0;
|
||||
if (v & 0xffff0000) {
|
||||
v >>= 16;
|
||||
n += 16;
|
||||
}
|
||||
if (v & 0xff00) {
|
||||
v >>= 8;
|
||||
n += 8;
|
||||
}
|
||||
n += ff_log2_tab[v];
|
||||
|
||||
return n;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Various codec helper functions */
|
||||
|
||||
int codec_init(void);
|
||||
|
@ -82,3 +116,5 @@ void __cyg_profile_func_enter(void *this_fn, void *call_site)
|
|||
void __cyg_profile_func_exit(void *this_fn, void *call_site)
|
||||
NO_PROF_ATTR ICODE_ATTR;
|
||||
#endif
|
||||
|
||||
#endif /* __CODECLIB_H__ */
|
||||
|
|
|
@ -40,20 +40,9 @@
|
|||
#include "asm_arm.h"
|
||||
#include "asm_mcf5249.h"
|
||||
#include "codeclib_misc.h"
|
||||
#include "codeclib.h"
|
||||
#endif
|
||||
|
||||
/* The following table is taken from libavutil/mathematics.c */
|
||||
const uint8_t ff_log2_tab[256] ={
|
||||
0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
|
||||
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
|
||||
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
||||
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
|
||||
};
|
||||
|
||||
/* cplscales was moved from cookdata_fixpoint.h since only *
|
||||
* cook_fixpoint.h should see/use it. */
|
||||
static const FIXPU* cplscales[5] = {
|
||||
|
@ -114,24 +103,6 @@ static inline int32_t fixmul31(int32_t x, int32_t y)
|
|||
}
|
||||
#endif
|
||||
|
||||
/* math functions taken from libavutil/common.h */
|
||||
|
||||
static inline int av_log2(unsigned int v)
|
||||
{
|
||||
int n = 0;
|
||||
if (v & 0xffff0000) {
|
||||
v >>= 16;
|
||||
n += 16;
|
||||
}
|
||||
if (v & 0xff00) {
|
||||
v >>= 8;
|
||||
n += 8;
|
||||
}
|
||||
n += ff_log2_tab[v];
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clips a signed integer value into the amin-amax range.
|
||||
* @param a value to clip
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
bitstream.c
|
||||
decoder.c
|
||||
shndec.c
|
||||
#if !(defined(CPU_ARM) && (ARM_ARCH > 4))
|
||||
tables.c
|
||||
#endif
|
||||
#if defined(CPU_COLDFIRE)
|
||||
coldfire.S
|
||||
#elif defined(CPU_ARM)
|
||||
|
|
|
@ -20,35 +20,7 @@
|
|||
*/
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#if (defined(CPU_ARM) && (ARM_ARCH > 4))
|
||||
static inline int av_log2(uint32_t v)
|
||||
{
|
||||
return 31 - __builtin_clz(v);
|
||||
}
|
||||
#else
|
||||
|
||||
/* From libavutil/common.h */
|
||||
extern const uint8_t ff_log2_tab[256];
|
||||
|
||||
static inline int av_log2(unsigned int v)
|
||||
{
|
||||
int n;
|
||||
|
||||
n = 0;
|
||||
if (v & 0xffff0000) {
|
||||
v >>= 16;
|
||||
n += 16;
|
||||
}
|
||||
if (v & 0xff00) {
|
||||
v >>= 8;
|
||||
n += 8;
|
||||
}
|
||||
n += ff_log2_tab[v];
|
||||
|
||||
return n;
|
||||
}
|
||||
#endif
|
||||
#include "codeclib.h"
|
||||
|
||||
/**
|
||||
* @file golomb.h
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
#ifdef BUILD_STANDALONE
|
||||
#define ICONST_ATTR
|
||||
#else
|
||||
#include "codeclib.h"
|
||||
#endif
|
||||
#include <inttypes.h>
|
||||
|
||||
/* From ffmpeg - libavutil/common.h */
|
||||
const uint8_t ff_log2_tab[256] ICONST_ATTR = {
|
||||
0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
|
||||
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
|
||||
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
||||
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
|
||||
};
|
|
@ -29,35 +29,6 @@
|
|||
#include "wmafixed.h"
|
||||
#include "wmadata.h"
|
||||
|
||||
static const uint8_t ff_log2_tab[256]={
|
||||
0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
|
||||
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
|
||||
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
||||
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
|
||||
};
|
||||
|
||||
static inline int av_log2(unsigned int v)
|
||||
{
|
||||
int n;
|
||||
|
||||
n = 0;
|
||||
if (v & 0xffff0000) {
|
||||
v >>= 16;
|
||||
n += 16;
|
||||
}
|
||||
if (v & 0xff00) {
|
||||
v >>= 8;
|
||||
n += 8;
|
||||
}
|
||||
n += ff_log2_tab[v];
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static void wma_lsp_to_curve_init(WMADecodeContext *s, int frame_len);
|
||||
inline void vector_fmul_add_add(fixed32 *dst, const fixed32 *data,
|
||||
const fixed32 *window, int n);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue