mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	
							parent
							
								
									fe3502e6ad
								
							
						
					
					
						commit
						1c5788c638
					
				
					 29 changed files with 6001 additions and 0 deletions
				
			
		
							
								
								
									
										225
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/dct.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										225
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/dct.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,225 @@
 | 
			
		|||
/*
 | 
			
		||||
 * (I)DCT Transforms
 | 
			
		||||
 * Copyright (c) 2009 Peter Ross <pross@xvid.org>
 | 
			
		||||
 * Copyright (c) 2010 Alex Converse <alex.converse@gmail.com>
 | 
			
		||||
 * Copyright (c) 2010 Vitor Sessak
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * (Inverse) Discrete Cosine Transforms. These are also known as the
 | 
			
		||||
 * type II and type III DCTs respectively.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <math.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "libavutil/mathematics.h"
 | 
			
		||||
#include "dct.h"
 | 
			
		||||
#include "dct32.h"
 | 
			
		||||
 | 
			
		||||
/* sin((M_PI * x / (2 * n)) */
 | 
			
		||||
#define SIN(s, n, x) (s->costab[(n) - (x)])
 | 
			
		||||
 | 
			
		||||
/* cos((M_PI * x / (2 * n)) */
 | 
			
		||||
#define COS(s, n, x) (s->costab[x])
 | 
			
		||||
 | 
			
		||||
static void dst_calc_I_c(DCTContext *ctx, FFTSample *data)
 | 
			
		||||
{
 | 
			
		||||
    int n = 1 << ctx->nbits;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    data[0] = 0;
 | 
			
		||||
    for (i = 1; i < n / 2; i++) {
 | 
			
		||||
        float tmp1   = data[i    ];
 | 
			
		||||
        float tmp2   = data[n - i];
 | 
			
		||||
        float s      = SIN(ctx, n, 2 * i);
 | 
			
		||||
 | 
			
		||||
        s           *= tmp1 + tmp2;
 | 
			
		||||
        tmp1         = (tmp1 - tmp2) * 0.5f;
 | 
			
		||||
        data[i]      = s + tmp1;
 | 
			
		||||
        data[n - i]  = s - tmp1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    data[n / 2] *= 2;
 | 
			
		||||
    ctx->rdft.rdft_calc(&ctx->rdft, data);
 | 
			
		||||
 | 
			
		||||
    data[0] *= 0.5f;
 | 
			
		||||
 | 
			
		||||
    for (i = 1; i < n - 2; i += 2) {
 | 
			
		||||
        data[i + 1] +=  data[i - 1];
 | 
			
		||||
        data[i]      = -data[i + 2];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    data[n - 1] = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void dct_calc_I_c(DCTContext *ctx, FFTSample *data)
 | 
			
		||||
{
 | 
			
		||||
    int n = 1 << ctx->nbits;
 | 
			
		||||
    int i;
 | 
			
		||||
    float next = -0.5f * (data[0] - data[n]);
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < n / 2; i++) {
 | 
			
		||||
        float tmp1 = data[i];
 | 
			
		||||
        float tmp2 = data[n - i];
 | 
			
		||||
        float s    = SIN(ctx, n, 2 * i);
 | 
			
		||||
        float c    = COS(ctx, n, 2 * i);
 | 
			
		||||
 | 
			
		||||
        c *= tmp1 - tmp2;
 | 
			
		||||
        s *= tmp1 - tmp2;
 | 
			
		||||
 | 
			
		||||
        next += c;
 | 
			
		||||
 | 
			
		||||
        tmp1        = (tmp1 + tmp2) * 0.5f;
 | 
			
		||||
        data[i]     = tmp1 - s;
 | 
			
		||||
        data[n - i] = tmp1 + s;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ctx->rdft.rdft_calc(&ctx->rdft, data);
 | 
			
		||||
    data[n] = data[1];
 | 
			
		||||
    data[1] = next;
 | 
			
		||||
 | 
			
		||||
    for (i = 3; i <= n; i += 2)
 | 
			
		||||
        data[i] = data[i - 2] - data[i];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void dct_calc_III_c(DCTContext *ctx, FFTSample *data)
 | 
			
		||||
{
 | 
			
		||||
    int n = 1 << ctx->nbits;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    float next  = data[n - 1];
 | 
			
		||||
    float inv_n = 1.0f / n;
 | 
			
		||||
 | 
			
		||||
    for (i = n - 2; i >= 2; i -= 2) {
 | 
			
		||||
        float val1 = data[i];
 | 
			
		||||
        float val2 = data[i - 1] - data[i + 1];
 | 
			
		||||
        float c    = COS(ctx, n, i);
 | 
			
		||||
        float s    = SIN(ctx, n, i);
 | 
			
		||||
 | 
			
		||||
        data[i]     = c * val1 + s * val2;
 | 
			
		||||
        data[i + 1] = s * val1 - c * val2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    data[1] = 2 * next;
 | 
			
		||||
 | 
			
		||||
    ctx->rdft.rdft_calc(&ctx->rdft, data);
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < n / 2; i++) {
 | 
			
		||||
        float tmp1 = data[i]         * inv_n;
 | 
			
		||||
        float tmp2 = data[n - i - 1] * inv_n;
 | 
			
		||||
        float csc  = ctx->csc2[i] * (tmp1 - tmp2);
 | 
			
		||||
 | 
			
		||||
        tmp1            += tmp2;
 | 
			
		||||
        data[i]          = tmp1 + csc;
 | 
			
		||||
        data[n - i - 1]  = tmp1 - csc;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void dct_calc_II_c(DCTContext *ctx, FFTSample *data)
 | 
			
		||||
{
 | 
			
		||||
    int n = 1 << ctx->nbits;
 | 
			
		||||
    int i;
 | 
			
		||||
    float next;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < n / 2; i++) {
 | 
			
		||||
        float tmp1 = data[i];
 | 
			
		||||
        float tmp2 = data[n - i - 1];
 | 
			
		||||
        float s    = SIN(ctx, n, 2 * i + 1);
 | 
			
		||||
 | 
			
		||||
        s    *= tmp1 - tmp2;
 | 
			
		||||
        tmp1  = (tmp1 + tmp2) * 0.5f;
 | 
			
		||||
 | 
			
		||||
        data[i]     = tmp1 + s;
 | 
			
		||||
        data[n-i-1] = tmp1 - s;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ctx->rdft.rdft_calc(&ctx->rdft, data);
 | 
			
		||||
 | 
			
		||||
    next     = data[1] * 0.5;
 | 
			
		||||
    data[1] *= -1;
 | 
			
		||||
 | 
			
		||||
    for (i = n - 2; i >= 0; i -= 2) {
 | 
			
		||||
        float inr = data[i    ];
 | 
			
		||||
        float ini = data[i + 1];
 | 
			
		||||
        float c   = COS(ctx, n, i);
 | 
			
		||||
        float s   = SIN(ctx, n, i);
 | 
			
		||||
 | 
			
		||||
        data[i]     = c * inr + s * ini;
 | 
			
		||||
        data[i + 1] = next;
 | 
			
		||||
 | 
			
		||||
        next += s * inr - c * ini;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void dct32_func(DCTContext *ctx, FFTSample *data)
 | 
			
		||||
{
 | 
			
		||||
    ctx->dct32(data, data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
av_cold int ff_dct_init(DCTContext *s, int nbits, enum DCTTransformType inverse)
 | 
			
		||||
{
 | 
			
		||||
    int n = 1 << nbits;
 | 
			
		||||
    int i;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    memset(s, 0, sizeof(*s));
 | 
			
		||||
 | 
			
		||||
    s->nbits   = nbits;
 | 
			
		||||
    s->inverse = inverse;
 | 
			
		||||
 | 
			
		||||
    if (inverse == DCT_II && nbits == 5) {
 | 
			
		||||
        s->dct_calc = dct32_func;
 | 
			
		||||
    } else {
 | 
			
		||||
        ff_init_ff_cos_tabs(nbits + 2);
 | 
			
		||||
 | 
			
		||||
        s->costab = ff_cos_tabs[nbits + 2];
 | 
			
		||||
        s->csc2   = av_malloc_array(n / 2, sizeof(FFTSample));
 | 
			
		||||
        if (!s->csc2)
 | 
			
		||||
            return AVERROR(ENOMEM);
 | 
			
		||||
 | 
			
		||||
        if ((ret = ff_rdft_init(&s->rdft, nbits, inverse == DCT_III)) < 0) {
 | 
			
		||||
            av_freep(&s->csc2);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (i = 0; i < n / 2; i++)
 | 
			
		||||
            s->csc2[i] = 0.5 / sin((M_PI / (2 * n) * (2 * i + 1)));
 | 
			
		||||
 | 
			
		||||
        switch (inverse) {
 | 
			
		||||
        case DCT_I  : s->dct_calc = dct_calc_I_c;   break;
 | 
			
		||||
        case DCT_II : s->dct_calc = dct_calc_II_c;  break;
 | 
			
		||||
        case DCT_III: s->dct_calc = dct_calc_III_c; break;
 | 
			
		||||
        case DST_I  : s->dct_calc = dst_calc_I_c;   break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    s->dct32 = ff_dct32_float;
 | 
			
		||||
    if (ARCH_X86)
 | 
			
		||||
        ff_dct_init_x86(s);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
av_cold void ff_dct_end(DCTContext *s)
 | 
			
		||||
{
 | 
			
		||||
    ff_rdft_end(&s->rdft);
 | 
			
		||||
    av_freep(&s->csc2);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										25
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/dct32.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/dct32.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,25 @@
 | 
			
		|||
/*
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef AVCODEC_DCT32_H
 | 
			
		||||
#define AVCODEC_DCT32_H
 | 
			
		||||
 | 
			
		||||
void ff_dct32_float(float *dst, const float *src);
 | 
			
		||||
void ff_dct32_fixed(int *dst, const int *src);
 | 
			
		||||
 | 
			
		||||
#endif /* AVCODEC_DCT32_H */
 | 
			
		||||
							
								
								
									
										20
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/dct32_fixed.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/dct32_fixed.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
/*
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define DCT32_FLOAT 0
 | 
			
		||||
#include "dct32_template.c"
 | 
			
		||||
							
								
								
									
										20
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/dct32_float.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/dct32_float.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
/*
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define DCT32_FLOAT 1
 | 
			
		||||
#include "dct32_template.c"
 | 
			
		||||
							
								
								
									
										288
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/dct32_template.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										288
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/dct32_template.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,288 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Template for the Discrete Cosine Transform for 32 samples
 | 
			
		||||
 * Copyright (c) 2001, 2002 Fabrice Bellard
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "dct32.h"
 | 
			
		||||
#include "mathops.h"
 | 
			
		||||
#include "libavutil/internal.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CHECKED
 | 
			
		||||
#define SUINT   int
 | 
			
		||||
#define SUINT32 int32_t
 | 
			
		||||
#else
 | 
			
		||||
#define SUINT   unsigned
 | 
			
		||||
#define SUINT32 uint32_t
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if DCT32_FLOAT
 | 
			
		||||
#   define dct32 ff_dct32_float
 | 
			
		||||
#   define FIXHR(x)       ((float)(x))
 | 
			
		||||
#   define MULH3(x, y, s) ((s)*(y)*(x))
 | 
			
		||||
#   define INTFLOAT float
 | 
			
		||||
#   define SUINTFLOAT float
 | 
			
		||||
#else
 | 
			
		||||
#   define dct32 ff_dct32_fixed
 | 
			
		||||
#   define FIXHR(a)       ((int)((a) * (1LL<<32) + 0.5))
 | 
			
		||||
#   define MULH3(x, y, s) MULH((s)*(x), y)
 | 
			
		||||
#   define INTFLOAT int
 | 
			
		||||
#   define SUINTFLOAT SUINT
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* tab[i][j] = 1.0 / (2.0 * cos(pi*(2*k+1) / 2^(6 - j))) */
 | 
			
		||||
 | 
			
		||||
/* cos(i*pi/64) */
 | 
			
		||||
 | 
			
		||||
#define COS0_0  FIXHR(0.50060299823519630134/2)
 | 
			
		||||
#define COS0_1  FIXHR(0.50547095989754365998/2)
 | 
			
		||||
#define COS0_2  FIXHR(0.51544730992262454697/2)
 | 
			
		||||
#define COS0_3  FIXHR(0.53104259108978417447/2)
 | 
			
		||||
#define COS0_4  FIXHR(0.55310389603444452782/2)
 | 
			
		||||
#define COS0_5  FIXHR(0.58293496820613387367/2)
 | 
			
		||||
#define COS0_6  FIXHR(0.62250412303566481615/2)
 | 
			
		||||
#define COS0_7  FIXHR(0.67480834145500574602/2)
 | 
			
		||||
#define COS0_8  FIXHR(0.74453627100229844977/2)
 | 
			
		||||
#define COS0_9  FIXHR(0.83934964541552703873/2)
 | 
			
		||||
#define COS0_10 FIXHR(0.97256823786196069369/2)
 | 
			
		||||
#define COS0_11 FIXHR(1.16943993343288495515/4)
 | 
			
		||||
#define COS0_12 FIXHR(1.48416461631416627724/4)
 | 
			
		||||
#define COS0_13 FIXHR(2.05778100995341155085/8)
 | 
			
		||||
#define COS0_14 FIXHR(3.40760841846871878570/8)
 | 
			
		||||
#define COS0_15 FIXHR(10.19000812354805681150/32)
 | 
			
		||||
 | 
			
		||||
#define COS1_0 FIXHR(0.50241928618815570551/2)
 | 
			
		||||
#define COS1_1 FIXHR(0.52249861493968888062/2)
 | 
			
		||||
#define COS1_2 FIXHR(0.56694403481635770368/2)
 | 
			
		||||
#define COS1_3 FIXHR(0.64682178335999012954/2)
 | 
			
		||||
#define COS1_4 FIXHR(0.78815462345125022473/2)
 | 
			
		||||
#define COS1_5 FIXHR(1.06067768599034747134/4)
 | 
			
		||||
#define COS1_6 FIXHR(1.72244709823833392782/4)
 | 
			
		||||
#define COS1_7 FIXHR(5.10114861868916385802/16)
 | 
			
		||||
 | 
			
		||||
#define COS2_0 FIXHR(0.50979557910415916894/2)
 | 
			
		||||
#define COS2_1 FIXHR(0.60134488693504528054/2)
 | 
			
		||||
#define COS2_2 FIXHR(0.89997622313641570463/2)
 | 
			
		||||
#define COS2_3 FIXHR(2.56291544774150617881/8)
 | 
			
		||||
 | 
			
		||||
#define COS3_0 FIXHR(0.54119610014619698439/2)
 | 
			
		||||
#define COS3_1 FIXHR(1.30656296487637652785/4)
 | 
			
		||||
 | 
			
		||||
#define COS4_0 FIXHR(M_SQRT1_2/2)
 | 
			
		||||
 | 
			
		||||
/* butterfly operator */
 | 
			
		||||
#define BF(a, b, c, s)\
 | 
			
		||||
{\
 | 
			
		||||
    tmp0 = val##a + val##b;\
 | 
			
		||||
    tmp1 = val##a - val##b;\
 | 
			
		||||
    val##a = tmp0;\
 | 
			
		||||
    val##b = MULH3(tmp1, c, 1<<(s));\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define BF0(a, b, c, s)\
 | 
			
		||||
{\
 | 
			
		||||
    tmp0 = tab[a] + tab[b];\
 | 
			
		||||
    tmp1 = tab[a] - tab[b];\
 | 
			
		||||
    val##a = tmp0;\
 | 
			
		||||
    val##b = MULH3(tmp1, c, 1<<(s));\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define BF1(a, b, c, d)\
 | 
			
		||||
{\
 | 
			
		||||
    BF(a, b, COS4_0, 1);\
 | 
			
		||||
    BF(c, d,-COS4_0, 1);\
 | 
			
		||||
    val##c += val##d;\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define BF2(a, b, c, d)\
 | 
			
		||||
{\
 | 
			
		||||
    BF(a, b, COS4_0, 1);\
 | 
			
		||||
    BF(c, d,-COS4_0, 1);\
 | 
			
		||||
    val##c += val##d;\
 | 
			
		||||
    val##a += val##c;\
 | 
			
		||||
    val##c += val##b;\
 | 
			
		||||
    val##b += val##d;\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define ADD(a, b) val##a += val##b
 | 
			
		||||
 | 
			
		||||
/* DCT32 without 1/sqrt(2) coef zero scaling. */
 | 
			
		||||
void dct32(INTFLOAT *out, const INTFLOAT *tab_arg)
 | 
			
		||||
{
 | 
			
		||||
    const SUINTFLOAT *tab = tab_arg;
 | 
			
		||||
    SUINTFLOAT tmp0, tmp1;
 | 
			
		||||
 | 
			
		||||
    SUINTFLOAT val0 , val1 , val2 , val3 , val4 , val5 , val6 , val7 ,
 | 
			
		||||
             val8 , val9 , val10, val11, val12, val13, val14, val15,
 | 
			
		||||
             val16, val17, val18, val19, val20, val21, val22, val23,
 | 
			
		||||
             val24, val25, val26, val27, val28, val29, val30, val31;
 | 
			
		||||
 | 
			
		||||
    /* pass 1 */
 | 
			
		||||
    BF0( 0, 31, COS0_0 , 1);
 | 
			
		||||
    BF0(15, 16, COS0_15, 5);
 | 
			
		||||
    /* pass 2 */
 | 
			
		||||
    BF( 0, 15, COS1_0 , 1);
 | 
			
		||||
    BF(16, 31,-COS1_0 , 1);
 | 
			
		||||
    /* pass 1 */
 | 
			
		||||
    BF0( 7, 24, COS0_7 , 1);
 | 
			
		||||
    BF0( 8, 23, COS0_8 , 1);
 | 
			
		||||
    /* pass 2 */
 | 
			
		||||
    BF( 7,  8, COS1_7 , 4);
 | 
			
		||||
    BF(23, 24,-COS1_7 , 4);
 | 
			
		||||
    /* pass 3 */
 | 
			
		||||
    BF( 0,  7, COS2_0 , 1);
 | 
			
		||||
    BF( 8, 15,-COS2_0 , 1);
 | 
			
		||||
    BF(16, 23, COS2_0 , 1);
 | 
			
		||||
    BF(24, 31,-COS2_0 , 1);
 | 
			
		||||
    /* pass 1 */
 | 
			
		||||
    BF0( 3, 28, COS0_3 , 1);
 | 
			
		||||
    BF0(12, 19, COS0_12, 2);
 | 
			
		||||
    /* pass 2 */
 | 
			
		||||
    BF( 3, 12, COS1_3 , 1);
 | 
			
		||||
    BF(19, 28,-COS1_3 , 1);
 | 
			
		||||
    /* pass 1 */
 | 
			
		||||
    BF0( 4, 27, COS0_4 , 1);
 | 
			
		||||
    BF0(11, 20, COS0_11, 2);
 | 
			
		||||
    /* pass 2 */
 | 
			
		||||
    BF( 4, 11, COS1_4 , 1);
 | 
			
		||||
    BF(20, 27,-COS1_4 , 1);
 | 
			
		||||
    /* pass 3 */
 | 
			
		||||
    BF( 3,  4, COS2_3 , 3);
 | 
			
		||||
    BF(11, 12,-COS2_3 , 3);
 | 
			
		||||
    BF(19, 20, COS2_3 , 3);
 | 
			
		||||
    BF(27, 28,-COS2_3 , 3);
 | 
			
		||||
    /* pass 4 */
 | 
			
		||||
    BF( 0,  3, COS3_0 , 1);
 | 
			
		||||
    BF( 4,  7,-COS3_0 , 1);
 | 
			
		||||
    BF( 8, 11, COS3_0 , 1);
 | 
			
		||||
    BF(12, 15,-COS3_0 , 1);
 | 
			
		||||
    BF(16, 19, COS3_0 , 1);
 | 
			
		||||
    BF(20, 23,-COS3_0 , 1);
 | 
			
		||||
    BF(24, 27, COS3_0 , 1);
 | 
			
		||||
    BF(28, 31,-COS3_0 , 1);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /* pass 1 */
 | 
			
		||||
    BF0( 1, 30, COS0_1 , 1);
 | 
			
		||||
    BF0(14, 17, COS0_14, 3);
 | 
			
		||||
    /* pass 2 */
 | 
			
		||||
    BF( 1, 14, COS1_1 , 1);
 | 
			
		||||
    BF(17, 30,-COS1_1 , 1);
 | 
			
		||||
    /* pass 1 */
 | 
			
		||||
    BF0( 6, 25, COS0_6 , 1);
 | 
			
		||||
    BF0( 9, 22, COS0_9 , 1);
 | 
			
		||||
    /* pass 2 */
 | 
			
		||||
    BF( 6,  9, COS1_6 , 2);
 | 
			
		||||
    BF(22, 25,-COS1_6 , 2);
 | 
			
		||||
    /* pass 3 */
 | 
			
		||||
    BF( 1,  6, COS2_1 , 1);
 | 
			
		||||
    BF( 9, 14,-COS2_1 , 1);
 | 
			
		||||
    BF(17, 22, COS2_1 , 1);
 | 
			
		||||
    BF(25, 30,-COS2_1 , 1);
 | 
			
		||||
 | 
			
		||||
    /* pass 1 */
 | 
			
		||||
    BF0( 2, 29, COS0_2 , 1);
 | 
			
		||||
    BF0(13, 18, COS0_13, 3);
 | 
			
		||||
    /* pass 2 */
 | 
			
		||||
    BF( 2, 13, COS1_2 , 1);
 | 
			
		||||
    BF(18, 29,-COS1_2 , 1);
 | 
			
		||||
    /* pass 1 */
 | 
			
		||||
    BF0( 5, 26, COS0_5 , 1);
 | 
			
		||||
    BF0(10, 21, COS0_10, 1);
 | 
			
		||||
    /* pass 2 */
 | 
			
		||||
    BF( 5, 10, COS1_5 , 2);
 | 
			
		||||
    BF(21, 26,-COS1_5 , 2);
 | 
			
		||||
    /* pass 3 */
 | 
			
		||||
    BF( 2,  5, COS2_2 , 1);
 | 
			
		||||
    BF(10, 13,-COS2_2 , 1);
 | 
			
		||||
    BF(18, 21, COS2_2 , 1);
 | 
			
		||||
    BF(26, 29,-COS2_2 , 1);
 | 
			
		||||
    /* pass 4 */
 | 
			
		||||
    BF( 1,  2, COS3_1 , 2);
 | 
			
		||||
    BF( 5,  6,-COS3_1 , 2);
 | 
			
		||||
    BF( 9, 10, COS3_1 , 2);
 | 
			
		||||
    BF(13, 14,-COS3_1 , 2);
 | 
			
		||||
    BF(17, 18, COS3_1 , 2);
 | 
			
		||||
    BF(21, 22,-COS3_1 , 2);
 | 
			
		||||
    BF(25, 26, COS3_1 , 2);
 | 
			
		||||
    BF(29, 30,-COS3_1 , 2);
 | 
			
		||||
 | 
			
		||||
    /* pass 5 */
 | 
			
		||||
    BF1( 0,  1,  2,  3);
 | 
			
		||||
    BF2( 4,  5,  6,  7);
 | 
			
		||||
    BF1( 8,  9, 10, 11);
 | 
			
		||||
    BF2(12, 13, 14, 15);
 | 
			
		||||
    BF1(16, 17, 18, 19);
 | 
			
		||||
    BF2(20, 21, 22, 23);
 | 
			
		||||
    BF1(24, 25, 26, 27);
 | 
			
		||||
    BF2(28, 29, 30, 31);
 | 
			
		||||
 | 
			
		||||
    /* pass 6 */
 | 
			
		||||
 | 
			
		||||
    ADD( 8, 12);
 | 
			
		||||
    ADD(12, 10);
 | 
			
		||||
    ADD(10, 14);
 | 
			
		||||
    ADD(14,  9);
 | 
			
		||||
    ADD( 9, 13);
 | 
			
		||||
    ADD(13, 11);
 | 
			
		||||
    ADD(11, 15);
 | 
			
		||||
 | 
			
		||||
    out[ 0] = val0;
 | 
			
		||||
    out[16] = val1;
 | 
			
		||||
    out[ 8] = val2;
 | 
			
		||||
    out[24] = val3;
 | 
			
		||||
    out[ 4] = val4;
 | 
			
		||||
    out[20] = val5;
 | 
			
		||||
    out[12] = val6;
 | 
			
		||||
    out[28] = val7;
 | 
			
		||||
    out[ 2] = val8;
 | 
			
		||||
    out[18] = val9;
 | 
			
		||||
    out[10] = val10;
 | 
			
		||||
    out[26] = val11;
 | 
			
		||||
    out[ 6] = val12;
 | 
			
		||||
    out[22] = val13;
 | 
			
		||||
    out[14] = val14;
 | 
			
		||||
    out[30] = val15;
 | 
			
		||||
 | 
			
		||||
    ADD(24, 28);
 | 
			
		||||
    ADD(28, 26);
 | 
			
		||||
    ADD(26, 30);
 | 
			
		||||
    ADD(30, 25);
 | 
			
		||||
    ADD(25, 29);
 | 
			
		||||
    ADD(29, 27);
 | 
			
		||||
    ADD(27, 31);
 | 
			
		||||
 | 
			
		||||
    out[ 1] = val16 + val24;
 | 
			
		||||
    out[17] = val17 + val25;
 | 
			
		||||
    out[ 9] = val18 + val26;
 | 
			
		||||
    out[25] = val19 + val27;
 | 
			
		||||
    out[ 5] = val20 + val28;
 | 
			
		||||
    out[21] = val21 + val29;
 | 
			
		||||
    out[13] = val22 + val30;
 | 
			
		||||
    out[29] = val23 + val31;
 | 
			
		||||
    out[ 3] = val24 + val20;
 | 
			
		||||
    out[19] = val25 + val21;
 | 
			
		||||
    out[11] = val26 + val22;
 | 
			
		||||
    out[27] = val27 + val23;
 | 
			
		||||
    out[ 7] = val28 + val18;
 | 
			
		||||
    out[23] = val29 + val19;
 | 
			
		||||
    out[15] = val30 + val17;
 | 
			
		||||
    out[31] = val31;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										50
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudio.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudio.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,50 @@
 | 
			
		|||
/*
 | 
			
		||||
 * MPEG Audio common code
 | 
			
		||||
 * Copyright (c) 2001, 2002 Fabrice Bellard
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * MPEG Audio common code.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "mpegaudio.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* bitrate is in kb/s */
 | 
			
		||||
int ff_mpa_l2_select_table(int bitrate, int nb_channels, int freq, int lsf)
 | 
			
		||||
{
 | 
			
		||||
    int ch_bitrate, table;
 | 
			
		||||
 | 
			
		||||
    ch_bitrate = bitrate / nb_channels;
 | 
			
		||||
    if (!lsf) {
 | 
			
		||||
        if ((freq == 48000 && ch_bitrate >= 56) ||
 | 
			
		||||
            (ch_bitrate >= 56 && ch_bitrate <= 80))
 | 
			
		||||
            table = 0;
 | 
			
		||||
        else if (freq != 48000 && ch_bitrate >= 96)
 | 
			
		||||
            table = 1;
 | 
			
		||||
        else if (freq != 32000 && ch_bitrate <= 48)
 | 
			
		||||
            table = 2;
 | 
			
		||||
        else
 | 
			
		||||
            table = 3;
 | 
			
		||||
    } else {
 | 
			
		||||
        table = 4;
 | 
			
		||||
    }
 | 
			
		||||
    return table;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										81
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudio.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudio.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,81 @@
 | 
			
		|||
/*
 | 
			
		||||
 * copyright (c) 2001 Fabrice Bellard
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * mpeg audio declarations for both encoder and decoder.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef AVCODEC_MPEGAUDIO_H
 | 
			
		||||
#define AVCODEC_MPEGAUDIO_H
 | 
			
		||||
 | 
			
		||||
#ifndef USE_FLOATS
 | 
			
		||||
#   define USE_FLOATS 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include "libavutil/internal.h"
 | 
			
		||||
 | 
			
		||||
/* max frame size, in samples */
 | 
			
		||||
#define MPA_FRAME_SIZE 1152
 | 
			
		||||
 | 
			
		||||
/* max compressed frame size */
 | 
			
		||||
#define MPA_MAX_CODED_FRAME_SIZE 1792
 | 
			
		||||
 | 
			
		||||
#define MPA_MAX_CHANNELS 2
 | 
			
		||||
 | 
			
		||||
#define SBLIMIT 32 /* number of subbands */
 | 
			
		||||
 | 
			
		||||
#define MPA_STEREO  0
 | 
			
		||||
#define MPA_JSTEREO 1
 | 
			
		||||
#define MPA_DUAL    2
 | 
			
		||||
#define MPA_MONO    3
 | 
			
		||||
 | 
			
		||||
#ifndef FRAC_BITS
 | 
			
		||||
#define FRAC_BITS   23   /* fractional bits for sb_samples and dct */
 | 
			
		||||
#define WFRAC_BITS  16   /* fractional bits for window */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define IMDCT_SCALAR 1.759
 | 
			
		||||
 | 
			
		||||
#define FRAC_ONE    (1 << FRAC_BITS)
 | 
			
		||||
 | 
			
		||||
#define FIX(a)   ((int)((a) * FRAC_ONE))
 | 
			
		||||
 | 
			
		||||
#if USE_FLOATS
 | 
			
		||||
#   define INTFLOAT float
 | 
			
		||||
#   define SUINTFLOAT float
 | 
			
		||||
typedef float MPA_INT;
 | 
			
		||||
typedef float OUT_INT;
 | 
			
		||||
#elif FRAC_BITS <= 15
 | 
			
		||||
#   define INTFLOAT int
 | 
			
		||||
#   define SUINTFLOAT SUINT
 | 
			
		||||
typedef int16_t MPA_INT;
 | 
			
		||||
typedef int16_t OUT_INT;
 | 
			
		||||
#else
 | 
			
		||||
#   define INTFLOAT int
 | 
			
		||||
#   define SUINTFLOAT SUINT
 | 
			
		||||
typedef int32_t MPA_INT;
 | 
			
		||||
typedef int16_t OUT_INT;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int ff_mpa_l2_select_table(int bitrate, int nb_channels, int freq, int lsf);
 | 
			
		||||
 | 
			
		||||
#endif /* AVCODEC_MPEGAUDIO_H */
 | 
			
		||||
							
								
								
									
										143
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudio_parser.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudio_parser.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,143 @@
 | 
			
		|||
/*
 | 
			
		||||
 * MPEG Audio parser
 | 
			
		||||
 * Copyright (c) 2003 Fabrice Bellard
 | 
			
		||||
 * Copyright (c) 2003 Michael Niedermayer
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "parser.h"
 | 
			
		||||
#include "mpegaudiodecheader.h"
 | 
			
		||||
#include "libavutil/common.h"
 | 
			
		||||
#include "libavformat/apetag.h" // for APE tag.
 | 
			
		||||
#include "libavformat/id3v1.h" // for ID3v1_TAG_SIZE
 | 
			
		||||
 | 
			
		||||
typedef struct MpegAudioParseContext {
 | 
			
		||||
    ParseContext pc;
 | 
			
		||||
    int frame_size;
 | 
			
		||||
    uint32_t header;
 | 
			
		||||
    int header_count;
 | 
			
		||||
    int no_bitrate;
 | 
			
		||||
} MpegAudioParseContext;
 | 
			
		||||
 | 
			
		||||
#define MPA_HEADER_SIZE 4
 | 
			
		||||
 | 
			
		||||
/* header + layer + freq + lsf/mpeg25 */
 | 
			
		||||
#define SAME_HEADER_MASK \
 | 
			
		||||
   (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
 | 
			
		||||
 | 
			
		||||
static int mpegaudio_parse(AVCodecParserContext *s1,
 | 
			
		||||
                           AVCodecContext *avctx,
 | 
			
		||||
                           const uint8_t **poutbuf, int *poutbuf_size,
 | 
			
		||||
                           const uint8_t *buf, int buf_size)
 | 
			
		||||
{
 | 
			
		||||
    MpegAudioParseContext *s = s1->priv_data;
 | 
			
		||||
    ParseContext *pc = &s->pc;
 | 
			
		||||
    uint32_t state= pc->state;
 | 
			
		||||
    int i;
 | 
			
		||||
    int next= END_NOT_FOUND;
 | 
			
		||||
    int flush = !buf_size;
 | 
			
		||||
 | 
			
		||||
    for(i=0; i<buf_size; ){
 | 
			
		||||
        if(s->frame_size){
 | 
			
		||||
            int inc= FFMIN(buf_size - i, s->frame_size);
 | 
			
		||||
            i += inc;
 | 
			
		||||
            s->frame_size -= inc;
 | 
			
		||||
            state = 0;
 | 
			
		||||
 | 
			
		||||
            if(!s->frame_size){
 | 
			
		||||
                next= i;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }else{
 | 
			
		||||
            while(i<buf_size){
 | 
			
		||||
                int ret, sr, channels, bit_rate, frame_size;
 | 
			
		||||
                enum AVCodecID codec_id = avctx->codec_id;
 | 
			
		||||
 | 
			
		||||
                state= (state<<8) + buf[i++];
 | 
			
		||||
 | 
			
		||||
                ret = ff_mpa_decode_header(state, &sr, &channels, &frame_size, &bit_rate, &codec_id);
 | 
			
		||||
                if (ret < 4) {
 | 
			
		||||
                    if (i > 4)
 | 
			
		||||
                        s->header_count = -2;
 | 
			
		||||
                } else {
 | 
			
		||||
                    int header_threshold = avctx->codec_id != AV_CODEC_ID_NONE && avctx->codec_id != codec_id;
 | 
			
		||||
                    if((state&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header)
 | 
			
		||||
                        s->header_count= -3;
 | 
			
		||||
                    s->header= state;
 | 
			
		||||
                    s->header_count++;
 | 
			
		||||
                    s->frame_size = ret-4;
 | 
			
		||||
 | 
			
		||||
                    if (s->header_count > header_threshold) {
 | 
			
		||||
                        avctx->sample_rate= sr;
 | 
			
		||||
                        avctx->channels   = channels;
 | 
			
		||||
                        s1->duration      = frame_size;
 | 
			
		||||
                        avctx->codec_id   = codec_id;
 | 
			
		||||
                        if (s->no_bitrate || !avctx->bit_rate) {
 | 
			
		||||
                            s->no_bitrate = 1;
 | 
			
		||||
                            avctx->bit_rate += (bit_rate - avctx->bit_rate) / (s->header_count - header_threshold);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (s1->flags & PARSER_FLAG_COMPLETE_FRAMES) {
 | 
			
		||||
                        s->frame_size = 0;
 | 
			
		||||
                        next = buf_size;
 | 
			
		||||
                    } else if (codec_id == AV_CODEC_ID_MP3ADU) {
 | 
			
		||||
                        avpriv_report_missing_feature(avctx,
 | 
			
		||||
                            "MP3ADU full parser");
 | 
			
		||||
                        *poutbuf = NULL;
 | 
			
		||||
                        *poutbuf_size = 0;
 | 
			
		||||
                        return buf_size; /* parsers must not return error codes */
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pc->state= state;
 | 
			
		||||
    if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) {
 | 
			
		||||
        *poutbuf = NULL;
 | 
			
		||||
        *poutbuf_size = 0;
 | 
			
		||||
        return buf_size;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (flush && buf_size >= ID3v1_TAG_SIZE && memcmp(buf, "TAG", 3) == 0) {
 | 
			
		||||
        *poutbuf = NULL;
 | 
			
		||||
        *poutbuf_size = 0;
 | 
			
		||||
        return next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (flush && buf_size >= APE_TAG_FOOTER_BYTES && memcmp(buf, APE_TAG_PREAMBLE, 8) == 0) {
 | 
			
		||||
        *poutbuf = NULL;
 | 
			
		||||
        *poutbuf_size = 0;
 | 
			
		||||
        return next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    *poutbuf = buf;
 | 
			
		||||
    *poutbuf_size = buf_size;
 | 
			
		||||
    return next;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
AVCodecParser ff_mpegaudio_parser = {
 | 
			
		||||
    .codec_ids      = { AV_CODEC_ID_MP1, AV_CODEC_ID_MP2, AV_CODEC_ID_MP3, AV_CODEC_ID_MP3ADU },
 | 
			
		||||
    .priv_data_size = sizeof(MpegAudioParseContext),
 | 
			
		||||
    .parser_parse   = mpegaudio_parse,
 | 
			
		||||
    .parser_close   = ff_parse_close,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										43
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudio_tablegen.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudio_tablegen.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,43 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Generate a header file for hardcoded mpegaudiodec tables
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2009 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#define CONFIG_HARDCODED_TABLES 0
 | 
			
		||||
#include "libavutil/tablegen.h"
 | 
			
		||||
#include "mpegaudio_tablegen.h"
 | 
			
		||||
#include "tableprint.h"
 | 
			
		||||
 | 
			
		||||
int main(void)
 | 
			
		||||
{
 | 
			
		||||
    mpegaudio_tableinit();
 | 
			
		||||
 | 
			
		||||
    write_fileheader();
 | 
			
		||||
 | 
			
		||||
    WRITE_ARRAY("static const", int8_t, table_4_3_exp);
 | 
			
		||||
    WRITE_ARRAY("static const", uint32_t, table_4_3_value);
 | 
			
		||||
    WRITE_ARRAY("static const", uint32_t, exp_table_fixed);
 | 
			
		||||
    WRITE_ARRAY("static const", float, exp_table_float);
 | 
			
		||||
    WRITE_2D_ARRAY("static const", uint32_t, expval_table_fixed);
 | 
			
		||||
    WRITE_2D_ARRAY("static const", float, expval_table_float);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										91
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudio_tablegen.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudio_tablegen.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,91 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Header file for hardcoded mpegaudiodec tables
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2009 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef AVCODEC_MPEGAUDIO_TABLEGEN_H
 | 
			
		||||
#define AVCODEC_MPEGAUDIO_TABLEGEN_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
#include "libavutil/attributes.h"
 | 
			
		||||
 | 
			
		||||
#define TABLE_4_3_SIZE (8191 + 16)*4
 | 
			
		||||
#if CONFIG_HARDCODED_TABLES
 | 
			
		||||
#define mpegaudio_tableinit()
 | 
			
		||||
#include "libavcodec/mpegaudio_tables.h"
 | 
			
		||||
#else
 | 
			
		||||
static int8_t   table_4_3_exp[TABLE_4_3_SIZE];
 | 
			
		||||
static uint32_t table_4_3_value[TABLE_4_3_SIZE];
 | 
			
		||||
static uint32_t exp_table_fixed[512];
 | 
			
		||||
static uint32_t expval_table_fixed[512][16];
 | 
			
		||||
static float exp_table_float[512];
 | 
			
		||||
static float expval_table_float[512][16];
 | 
			
		||||
 | 
			
		||||
#define FRAC_BITS 23
 | 
			
		||||
#define IMDCT_SCALAR 1.759
 | 
			
		||||
 | 
			
		||||
static av_cold void mpegaudio_tableinit(void)
 | 
			
		||||
{
 | 
			
		||||
    int i, value, exponent;
 | 
			
		||||
    static const double exp2_lut[4] = {
 | 
			
		||||
        1.00000000000000000000, /* 2 ^ (0 * 0.25) */
 | 
			
		||||
        1.18920711500272106672, /* 2 ^ (1 * 0.25) */
 | 
			
		||||
        M_SQRT2               , /* 2 ^ (2 * 0.25) */
 | 
			
		||||
        1.68179283050742908606, /* 2 ^ (3 * 0.25) */
 | 
			
		||||
    };
 | 
			
		||||
    static double pow43_lut[16];
 | 
			
		||||
    double exp2_base = 2.11758236813575084767080625169910490512847900390625e-22; // 2^(-72)
 | 
			
		||||
    double exp2_val;
 | 
			
		||||
    double pow43_val = 0;
 | 
			
		||||
    for (i = 0; i < 16; ++i)
 | 
			
		||||
        pow43_lut[i] = i * cbrt(i);
 | 
			
		||||
 | 
			
		||||
    for (i = 1; i < TABLE_4_3_SIZE; i++) {
 | 
			
		||||
        double f, fm;
 | 
			
		||||
        int e, m;
 | 
			
		||||
        double value = i / 4;
 | 
			
		||||
        if ((i & 3) == 0)
 | 
			
		||||
            pow43_val = value / IMDCT_SCALAR * cbrt(value);
 | 
			
		||||
        f  = pow43_val * exp2_lut[i & 3];
 | 
			
		||||
        fm = frexp(f, &e);
 | 
			
		||||
        m  = llrint(fm * (1LL << 31));
 | 
			
		||||
        e += FRAC_BITS - 31 + 5 - 100;
 | 
			
		||||
 | 
			
		||||
        /* normalized to FRAC_BITS */
 | 
			
		||||
        table_4_3_value[i] =  m;
 | 
			
		||||
        table_4_3_exp[i]   = -e;
 | 
			
		||||
    }
 | 
			
		||||
    for (exponent = 0; exponent < 512; exponent++) {
 | 
			
		||||
        if (exponent && (exponent & 3) == 0)
 | 
			
		||||
            exp2_base *= 2;
 | 
			
		||||
        exp2_val = exp2_base * exp2_lut[exponent & 3] / IMDCT_SCALAR;
 | 
			
		||||
        for (value = 0; value < 16; value++) {
 | 
			
		||||
            double f = pow43_lut[value] * exp2_val;
 | 
			
		||||
            expval_table_fixed[exponent][value] = (f < 0xFFFFFFFF ? llrint(f) : 0xFFFFFFFF);
 | 
			
		||||
            expval_table_float[exponent][value] = f;
 | 
			
		||||
        }
 | 
			
		||||
        exp_table_fixed[exponent] = expval_table_fixed[exponent][1];
 | 
			
		||||
        exp_table_float[exponent] = expval_table_float[exponent][1];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#endif /* CONFIG_HARDCODED_TABLES */
 | 
			
		||||
 | 
			
		||||
#endif /* AVCODEC_MPEGAUDIO_TABLEGEN_H */
 | 
			
		||||
							
								
								
									
										146
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodata.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodata.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,146 @@
 | 
			
		|||
/*
 | 
			
		||||
 * MPEG Audio common tables
 | 
			
		||||
 * copyright (c) 2002 Fabrice Bellard
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * mpeg audio layer common tables.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "mpegaudiodata.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const uint16_t avpriv_mpa_bitrate_tab[2][3][15] = {
 | 
			
		||||
    { {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448 },
 | 
			
		||||
      {0, 32, 48, 56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320, 384 },
 | 
			
		||||
      {0, 32, 40, 48,  56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320 } },
 | 
			
		||||
    { {0, 32, 48, 56,  64,  80,  96, 112, 128, 144, 160, 176, 192, 224, 256},
 | 
			
		||||
      {0,  8, 16, 24,  32,  40,  48,  56,  64,  80,  96, 112, 128, 144, 160},
 | 
			
		||||
      {0,  8, 16, 24,  32,  40,  48,  56,  64,  80,  96, 112, 128, 144, 160}
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const uint16_t avpriv_mpa_freq_tab[3] = { 44100, 48000, 32000 };
 | 
			
		||||
 | 
			
		||||
/*******************************************************/
 | 
			
		||||
/* layer 2 tables */
 | 
			
		||||
 | 
			
		||||
const int ff_mpa_sblimit_table[5] = { 27 , 30 , 8, 12 , 30 };
 | 
			
		||||
 | 
			
		||||
const int ff_mpa_quant_steps[17] = {
 | 
			
		||||
    3,     5,    7,    9,    15,
 | 
			
		||||
    31,    63,  127,  255,   511,
 | 
			
		||||
    1023,  2047, 4095, 8191, 16383,
 | 
			
		||||
    32767, 65535
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* we use a negative value if grouped */
 | 
			
		||||
const int ff_mpa_quant_bits[17] = {
 | 
			
		||||
    -5,  -7,  3, -10, 4,
 | 
			
		||||
     5,  6,  7,  8,  9,
 | 
			
		||||
    10, 11, 12, 13, 14,
 | 
			
		||||
    15, 16
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* encoding tables which give the quantization index. Note how it is
 | 
			
		||||
   possible to store them efficiently ! */
 | 
			
		||||
static const unsigned char alloc_table_1[] = {
 | 
			
		||||
 4,  0,  2,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
 | 
			
		||||
 4,  0,  2,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
 | 
			
		||||
 4,  0,  2,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
 | 
			
		||||
 4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,
 | 
			
		||||
 4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,
 | 
			
		||||
 4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,
 | 
			
		||||
 4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,
 | 
			
		||||
 4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,
 | 
			
		||||
 4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,
 | 
			
		||||
 4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,
 | 
			
		||||
 4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,
 | 
			
		||||
 3,  0,  1,  2,  3,  4,  5, 16,
 | 
			
		||||
 3,  0,  1,  2,  3,  4,  5, 16,
 | 
			
		||||
 3,  0,  1,  2,  3,  4,  5, 16,
 | 
			
		||||
 3,  0,  1,  2,  3,  4,  5, 16,
 | 
			
		||||
 3,  0,  1,  2,  3,  4,  5, 16,
 | 
			
		||||
 3,  0,  1,  2,  3,  4,  5, 16,
 | 
			
		||||
 3,  0,  1,  2,  3,  4,  5, 16,
 | 
			
		||||
 3,  0,  1,  2,  3,  4,  5, 16,
 | 
			
		||||
 3,  0,  1,  2,  3,  4,  5, 16,
 | 
			
		||||
 3,  0,  1,  2,  3,  4,  5, 16,
 | 
			
		||||
 3,  0,  1,  2,  3,  4,  5, 16,
 | 
			
		||||
 3,  0,  1,  2,  3,  4,  5, 16,
 | 
			
		||||
 2,  0,  1, 16,
 | 
			
		||||
 2,  0,  1, 16,
 | 
			
		||||
 2,  0,  1, 16,
 | 
			
		||||
 2,  0,  1, 16,
 | 
			
		||||
 2,  0,  1, 16,
 | 
			
		||||
 2,  0,  1, 16,
 | 
			
		||||
 2,  0,  1, 16,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const unsigned char alloc_table_3[] = {
 | 
			
		||||
 4,  0,  1,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
 | 
			
		||||
 4,  0,  1,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const unsigned char alloc_table_4[] = {
 | 
			
		||||
 4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
 | 
			
		||||
 4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
 | 
			
		||||
 4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
 | 
			
		||||
 4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 3,  0,  1,  3,  4,  5,  6,  7,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
 2,  0,  1,  3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const unsigned char * const ff_mpa_alloc_tables[5] =
 | 
			
		||||
{ alloc_table_1, alloc_table_1, alloc_table_3, alloc_table_3, alloc_table_4, };
 | 
			
		||||
							
								
								
									
										44
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodata.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodata.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,44 @@
 | 
			
		|||
/*
 | 
			
		||||
 * MPEG Audio common tables
 | 
			
		||||
 * copyright (c) 2002 Fabrice Bellard
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * mpeg audio layer common tables.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef AVCODEC_MPEGAUDIODATA_H
 | 
			
		||||
#define AVCODEC_MPEGAUDIODATA_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include "internal.h"
 | 
			
		||||
 | 
			
		||||
#define MODE_EXT_MS_STEREO 2
 | 
			
		||||
#define MODE_EXT_I_STEREO  1
 | 
			
		||||
 | 
			
		||||
extern av_export_avcodec const uint16_t avpriv_mpa_bitrate_tab[2][3][15];
 | 
			
		||||
extern av_export_avcodec const uint16_t avpriv_mpa_freq_tab[3];
 | 
			
		||||
extern const int ff_mpa_sblimit_table[5];
 | 
			
		||||
extern const int ff_mpa_quant_steps[17];
 | 
			
		||||
extern const int ff_mpa_quant_bits[17];
 | 
			
		||||
extern const unsigned char * const ff_mpa_alloc_tables[5];
 | 
			
		||||
 | 
			
		||||
#endif /* AVCODEC_MPEGAUDIODATA_H */
 | 
			
		||||
							
								
								
									
										120
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodec_fixed.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodec_fixed.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,120 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Fixed-point MPEG audio decoder
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#include "libavutil/samplefmt.h"
 | 
			
		||||
 | 
			
		||||
#define USE_FLOATS 0
 | 
			
		||||
 | 
			
		||||
#include "mpegaudio.h"
 | 
			
		||||
 | 
			
		||||
#define SHR(a,b)       (((int)(a))>>(b))
 | 
			
		||||
/* WARNING: only correct for positive numbers */
 | 
			
		||||
#define FIXR_OLD(a)    ((int)((a) * FRAC_ONE + 0.5))
 | 
			
		||||
#define FIXR(a)        ((int)((a) * FRAC_ONE + 0.5))
 | 
			
		||||
#define FIXHR(a)       ((int)((a) * (1LL<<32) + 0.5))
 | 
			
		||||
#define MULH3(x, y, s) MULH((s)*(x), y)
 | 
			
		||||
#define MULLx(x, y, s) MULL((int)(x),(y),s)
 | 
			
		||||
#define RENAME(a)      a ## _fixed
 | 
			
		||||
#define OUT_FMT   AV_SAMPLE_FMT_S16
 | 
			
		||||
#define OUT_FMT_P AV_SAMPLE_FMT_S16P
 | 
			
		||||
 | 
			
		||||
#include "mpegaudiodec_template.c"
 | 
			
		||||
 | 
			
		||||
#if CONFIG_MP1_DECODER
 | 
			
		||||
AVCodec ff_mp1_decoder = {
 | 
			
		||||
    .name           = "mp1",
 | 
			
		||||
    .long_name      = NULL_IF_CONFIG_SMALL("MP1 (MPEG audio layer 1)"),
 | 
			
		||||
    .type           = AVMEDIA_TYPE_AUDIO,
 | 
			
		||||
    .id             = AV_CODEC_ID_MP1,
 | 
			
		||||
    .priv_data_size = sizeof(MPADecodeContext),
 | 
			
		||||
    .init           = decode_init,
 | 
			
		||||
    .decode         = decode_frame,
 | 
			
		||||
    .capabilities   = AV_CODEC_CAP_DR1,
 | 
			
		||||
    .flush          = flush,
 | 
			
		||||
    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_S16,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_NONE },
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
#if CONFIG_MP2_DECODER
 | 
			
		||||
AVCodec ff_mp2_decoder = {
 | 
			
		||||
    .name           = "mp2",
 | 
			
		||||
    .long_name      = NULL_IF_CONFIG_SMALL("MP2 (MPEG audio layer 2)"),
 | 
			
		||||
    .type           = AVMEDIA_TYPE_AUDIO,
 | 
			
		||||
    .id             = AV_CODEC_ID_MP2,
 | 
			
		||||
    .priv_data_size = sizeof(MPADecodeContext),
 | 
			
		||||
    .init           = decode_init,
 | 
			
		||||
    .decode         = decode_frame,
 | 
			
		||||
    .capabilities   = AV_CODEC_CAP_DR1,
 | 
			
		||||
    .flush          = flush,
 | 
			
		||||
    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_S16,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_NONE },
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
#if CONFIG_MP3_DECODER
 | 
			
		||||
AVCodec ff_mp3_decoder = {
 | 
			
		||||
    .name           = "mp3",
 | 
			
		||||
    .long_name      = NULL_IF_CONFIG_SMALL("MP3 (MPEG audio layer 3)"),
 | 
			
		||||
    .type           = AVMEDIA_TYPE_AUDIO,
 | 
			
		||||
    .id             = AV_CODEC_ID_MP3,
 | 
			
		||||
    .priv_data_size = sizeof(MPADecodeContext),
 | 
			
		||||
    .init           = decode_init,
 | 
			
		||||
    .decode         = decode_frame,
 | 
			
		||||
    .capabilities   = AV_CODEC_CAP_DR1,
 | 
			
		||||
    .flush          = flush,
 | 
			
		||||
    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_S16,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_NONE },
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
#if CONFIG_MP3ADU_DECODER
 | 
			
		||||
AVCodec ff_mp3adu_decoder = {
 | 
			
		||||
    .name           = "mp3adu",
 | 
			
		||||
    .long_name      = NULL_IF_CONFIG_SMALL("ADU (Application Data Unit) MP3 (MPEG audio layer 3)"),
 | 
			
		||||
    .type           = AVMEDIA_TYPE_AUDIO,
 | 
			
		||||
    .id             = AV_CODEC_ID_MP3ADU,
 | 
			
		||||
    .priv_data_size = sizeof(MPADecodeContext),
 | 
			
		||||
    .init           = decode_init,
 | 
			
		||||
    .decode         = decode_frame_adu,
 | 
			
		||||
    .capabilities   = AV_CODEC_CAP_DR1,
 | 
			
		||||
    .flush          = flush,
 | 
			
		||||
    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_S16,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_NONE },
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
#if CONFIG_MP3ON4_DECODER
 | 
			
		||||
AVCodec ff_mp3on4_decoder = {
 | 
			
		||||
    .name           = "mp3on4",
 | 
			
		||||
    .long_name      = NULL_IF_CONFIG_SMALL("MP3onMP4"),
 | 
			
		||||
    .type           = AVMEDIA_TYPE_AUDIO,
 | 
			
		||||
    .id             = AV_CODEC_ID_MP3ON4,
 | 
			
		||||
    .priv_data_size = sizeof(MP3On4DecodeContext),
 | 
			
		||||
    .init           = decode_init_mp3on4,
 | 
			
		||||
    .close          = decode_close_mp3on4,
 | 
			
		||||
    .decode         = decode_frame_mp3on4,
 | 
			
		||||
    .capabilities   = AV_CODEC_CAP_DR1,
 | 
			
		||||
    .flush          = flush_mp3on4,
 | 
			
		||||
    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_NONE },
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										124
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodec_float.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodec_float.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,124 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Float MPEG Audio decoder
 | 
			
		||||
 * Copyright (c) 2010 Michael Niedermayer
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#include "libavutil/samplefmt.h"
 | 
			
		||||
 | 
			
		||||
#define USE_FLOATS 1
 | 
			
		||||
 | 
			
		||||
#include "mpegaudio.h"
 | 
			
		||||
 | 
			
		||||
#define SHR(a,b)       ((a)*(1.0f/(1<<(b))))
 | 
			
		||||
#define FIXR_OLD(a)    ((int)((a) * FRAC_ONE + 0.5))
 | 
			
		||||
#define FIXR(x)        ((float)(x))
 | 
			
		||||
#define FIXHR(x)       ((float)(x))
 | 
			
		||||
#define MULH3(x, y, s) ((s)*(y)*(x))
 | 
			
		||||
#define MULLx(x, y, s) ((y)*(x))
 | 
			
		||||
#define RENAME(a) a ## _float
 | 
			
		||||
#define OUT_FMT   AV_SAMPLE_FMT_FLT
 | 
			
		||||
#define OUT_FMT_P AV_SAMPLE_FMT_FLTP
 | 
			
		||||
 | 
			
		||||
#include "mpegaudiodec_template.c"
 | 
			
		||||
 | 
			
		||||
#if CONFIG_MP1FLOAT_DECODER
 | 
			
		||||
AVCodec ff_mp1float_decoder = {
 | 
			
		||||
    .name           = "mp1float",
 | 
			
		||||
    .long_name      = NULL_IF_CONFIG_SMALL("MP1 (MPEG audio layer 1)"),
 | 
			
		||||
    .type           = AVMEDIA_TYPE_AUDIO,
 | 
			
		||||
    .id             = AV_CODEC_ID_MP1,
 | 
			
		||||
    .priv_data_size = sizeof(MPADecodeContext),
 | 
			
		||||
    .init           = decode_init,
 | 
			
		||||
    .close          = decode_close,
 | 
			
		||||
    .decode         = decode_frame,
 | 
			
		||||
    .capabilities   = AV_CODEC_CAP_DR1,
 | 
			
		||||
    .flush          = flush,
 | 
			
		||||
    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_FLT,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_NONE },
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
#if CONFIG_MP2FLOAT_DECODER
 | 
			
		||||
AVCodec ff_mp2float_decoder = {
 | 
			
		||||
    .name           = "mp2float",
 | 
			
		||||
    .long_name      = NULL_IF_CONFIG_SMALL("MP2 (MPEG audio layer 2)"),
 | 
			
		||||
    .type           = AVMEDIA_TYPE_AUDIO,
 | 
			
		||||
    .id             = AV_CODEC_ID_MP2,
 | 
			
		||||
    .priv_data_size = sizeof(MPADecodeContext),
 | 
			
		||||
    .init           = decode_init,
 | 
			
		||||
    .decode         = decode_frame,
 | 
			
		||||
    .close          = decode_close,
 | 
			
		||||
    .capabilities   = AV_CODEC_CAP_DR1,
 | 
			
		||||
    .flush          = flush,
 | 
			
		||||
    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_FLT,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_NONE },
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
#if CONFIG_MP3FLOAT_DECODER
 | 
			
		||||
AVCodec ff_mp3float_decoder = {
 | 
			
		||||
    .name           = "mp3float",
 | 
			
		||||
    .long_name      = NULL_IF_CONFIG_SMALL("MP3 (MPEG audio layer 3)"),
 | 
			
		||||
    .type           = AVMEDIA_TYPE_AUDIO,
 | 
			
		||||
    .id             = AV_CODEC_ID_MP3,
 | 
			
		||||
    .priv_data_size = sizeof(MPADecodeContext),
 | 
			
		||||
    .init           = decode_init,
 | 
			
		||||
    .close          = decode_close,
 | 
			
		||||
    .decode         = decode_frame,
 | 
			
		||||
    .capabilities   = AV_CODEC_CAP_DR1,
 | 
			
		||||
    .flush          = flush,
 | 
			
		||||
    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_FLT,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_NONE },
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
#if CONFIG_MP3ADUFLOAT_DECODER
 | 
			
		||||
AVCodec ff_mp3adufloat_decoder = {
 | 
			
		||||
    .name           = "mp3adufloat",
 | 
			
		||||
    .long_name      = NULL_IF_CONFIG_SMALL("ADU (Application Data Unit) MP3 (MPEG audio layer 3)"),
 | 
			
		||||
    .type           = AVMEDIA_TYPE_AUDIO,
 | 
			
		||||
    .id             = AV_CODEC_ID_MP3ADU,
 | 
			
		||||
    .priv_data_size = sizeof(MPADecodeContext),
 | 
			
		||||
    .init           = decode_init,
 | 
			
		||||
    .close          = decode_close,
 | 
			
		||||
    .decode         = decode_frame_adu,
 | 
			
		||||
    .capabilities   = AV_CODEC_CAP_DR1,
 | 
			
		||||
    .flush          = flush,
 | 
			
		||||
    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_FLT,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_NONE },
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
#if CONFIG_MP3ON4FLOAT_DECODER
 | 
			
		||||
AVCodec ff_mp3on4float_decoder = {
 | 
			
		||||
    .name           = "mp3on4float",
 | 
			
		||||
    .long_name      = NULL_IF_CONFIG_SMALL("MP3onMP4"),
 | 
			
		||||
    .type           = AVMEDIA_TYPE_AUDIO,
 | 
			
		||||
    .id             = AV_CODEC_ID_MP3ON4,
 | 
			
		||||
    .priv_data_size = sizeof(MP3On4DecodeContext),
 | 
			
		||||
    .init           = decode_init_mp3on4,
 | 
			
		||||
    .close          = decode_close_mp3on4,
 | 
			
		||||
    .decode         = decode_frame_mp3on4,
 | 
			
		||||
    .capabilities   = AV_CODEC_CAP_DR1,
 | 
			
		||||
    .flush          = flush_mp3on4,
 | 
			
		||||
    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
 | 
			
		||||
                                                      AV_SAMPLE_FMT_NONE },
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										2000
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodec_template.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2000
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodec_template.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										154
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodecheader.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodecheader.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,154 @@
 | 
			
		|||
/*
 | 
			
		||||
 * MPEG Audio header decoder
 | 
			
		||||
 * Copyright (c) 2001, 2002 Fabrice Bellard
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * MPEG Audio header decoder.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "libavutil/common.h"
 | 
			
		||||
 | 
			
		||||
#include "avcodec.h"
 | 
			
		||||
#include "internal.h"
 | 
			
		||||
#include "mpegaudio.h"
 | 
			
		||||
#include "mpegaudiodata.h"
 | 
			
		||||
#include "mpegaudiodecheader.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int avpriv_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header)
 | 
			
		||||
{
 | 
			
		||||
    int sample_rate, frame_size, mpeg25, padding;
 | 
			
		||||
    int sample_rate_index, bitrate_index;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    ret = ff_mpa_check_header(header);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
 | 
			
		||||
    if (header & (1<<20)) {
 | 
			
		||||
        s->lsf = (header & (1<<19)) ? 0 : 1;
 | 
			
		||||
        mpeg25 = 0;
 | 
			
		||||
    } else {
 | 
			
		||||
        s->lsf = 1;
 | 
			
		||||
        mpeg25 = 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    s->layer = 4 - ((header >> 17) & 3);
 | 
			
		||||
    /* extract frequency */
 | 
			
		||||
    sample_rate_index = (header >> 10) & 3;
 | 
			
		||||
    if (sample_rate_index >= FF_ARRAY_ELEMS(avpriv_mpa_freq_tab))
 | 
			
		||||
        sample_rate_index = 0;
 | 
			
		||||
    sample_rate = avpriv_mpa_freq_tab[sample_rate_index] >> (s->lsf + mpeg25);
 | 
			
		||||
    sample_rate_index += 3 * (s->lsf + mpeg25);
 | 
			
		||||
    s->sample_rate_index = sample_rate_index;
 | 
			
		||||
    s->error_protection = ((header >> 16) & 1) ^ 1;
 | 
			
		||||
    s->sample_rate = sample_rate;
 | 
			
		||||
 | 
			
		||||
    bitrate_index = (header >> 12) & 0xf;
 | 
			
		||||
    padding = (header >> 9) & 1;
 | 
			
		||||
    //extension = (header >> 8) & 1;
 | 
			
		||||
    s->mode = (header >> 6) & 3;
 | 
			
		||||
    s->mode_ext = (header >> 4) & 3;
 | 
			
		||||
    //copyright = (header >> 3) & 1;
 | 
			
		||||
    //original = (header >> 2) & 1;
 | 
			
		||||
    //emphasis = header & 3;
 | 
			
		||||
 | 
			
		||||
    if (s->mode == MPA_MONO)
 | 
			
		||||
        s->nb_channels = 1;
 | 
			
		||||
    else
 | 
			
		||||
        s->nb_channels = 2;
 | 
			
		||||
 | 
			
		||||
    if (bitrate_index != 0) {
 | 
			
		||||
        frame_size = avpriv_mpa_bitrate_tab[s->lsf][s->layer - 1][bitrate_index];
 | 
			
		||||
        s->bit_rate = frame_size * 1000;
 | 
			
		||||
        switch(s->layer) {
 | 
			
		||||
        case 1:
 | 
			
		||||
            frame_size = (frame_size * 12000) / sample_rate;
 | 
			
		||||
            frame_size = (frame_size + padding) * 4;
 | 
			
		||||
            break;
 | 
			
		||||
        case 2:
 | 
			
		||||
            frame_size = (frame_size * 144000) / sample_rate;
 | 
			
		||||
            frame_size += padding;
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
        case 3:
 | 
			
		||||
            frame_size = (frame_size * 144000) / (sample_rate << s->lsf);
 | 
			
		||||
            frame_size += padding;
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        s->frame_size = frame_size;
 | 
			
		||||
    } else {
 | 
			
		||||
        /* if no frame size computed, signal it */
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if defined(DEBUG)
 | 
			
		||||
    ff_dlog(NULL, "layer%d, %d Hz, %d kbits/s, ",
 | 
			
		||||
           s->layer, s->sample_rate, s->bit_rate);
 | 
			
		||||
    if (s->nb_channels == 2) {
 | 
			
		||||
        if (s->layer == 3) {
 | 
			
		||||
            if (s->mode_ext & MODE_EXT_MS_STEREO)
 | 
			
		||||
                ff_dlog(NULL, "ms-");
 | 
			
		||||
            if (s->mode_ext & MODE_EXT_I_STEREO)
 | 
			
		||||
                ff_dlog(NULL, "i-");
 | 
			
		||||
        }
 | 
			
		||||
        ff_dlog(NULL, "stereo");
 | 
			
		||||
    } else {
 | 
			
		||||
        ff_dlog(NULL, "mono");
 | 
			
		||||
    }
 | 
			
		||||
    ff_dlog(NULL, "\n");
 | 
			
		||||
#endif
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ff_mpa_decode_header(uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bit_rate, enum AVCodecID *codec_id)
 | 
			
		||||
{
 | 
			
		||||
    MPADecodeHeader s1, *s = &s1;
 | 
			
		||||
 | 
			
		||||
    if (avpriv_mpegaudio_decode_header(s, head) != 0) {
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    switch(s->layer) {
 | 
			
		||||
    case 1:
 | 
			
		||||
        *codec_id = AV_CODEC_ID_MP1;
 | 
			
		||||
        *frame_size = 384;
 | 
			
		||||
        break;
 | 
			
		||||
    case 2:
 | 
			
		||||
        *codec_id = AV_CODEC_ID_MP2;
 | 
			
		||||
        *frame_size = 1152;
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
    case 3:
 | 
			
		||||
        if (*codec_id != AV_CODEC_ID_MP3ADU)
 | 
			
		||||
            *codec_id = AV_CODEC_ID_MP3;
 | 
			
		||||
        if (s->lsf)
 | 
			
		||||
            *frame_size = 576;
 | 
			
		||||
        else
 | 
			
		||||
            *frame_size = 1152;
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    *sample_rate = s->sample_rate;
 | 
			
		||||
    *channels = s->nb_channels;
 | 
			
		||||
    *bit_rate = s->bit_rate;
 | 
			
		||||
    return s->frame_size;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										80
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodecheader.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodecheader.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,80 @@
 | 
			
		|||
/*
 | 
			
		||||
 * MPEG Audio header decoder
 | 
			
		||||
 * Copyright (c) 2001, 2002 Fabrice Bellard
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * MPEG Audio header decoder.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef AVCODEC_MPEGAUDIODECHEADER_H
 | 
			
		||||
#define AVCODEC_MPEGAUDIODECHEADER_H
 | 
			
		||||
 | 
			
		||||
#include "avcodec.h"
 | 
			
		||||
 | 
			
		||||
#define MP3_MASK 0xFFFE0CCF
 | 
			
		||||
 | 
			
		||||
#define MPA_DECODE_HEADER \
 | 
			
		||||
    int frame_size; \
 | 
			
		||||
    int error_protection; \
 | 
			
		||||
    int layer; \
 | 
			
		||||
    int sample_rate; \
 | 
			
		||||
    int sample_rate_index; /* between 0 and 8 */ \
 | 
			
		||||
    int bit_rate; \
 | 
			
		||||
    int nb_channels; \
 | 
			
		||||
    int mode; \
 | 
			
		||||
    int mode_ext; \
 | 
			
		||||
    int lsf;
 | 
			
		||||
 | 
			
		||||
typedef struct MPADecodeHeader {
 | 
			
		||||
  MPA_DECODE_HEADER
 | 
			
		||||
} MPADecodeHeader;
 | 
			
		||||
 | 
			
		||||
/* header decoding. MUST check the header before because no
 | 
			
		||||
   consistency check is done there. Return 1 if free format found and
 | 
			
		||||
   that the frame size must be computed externally */
 | 
			
		||||
int avpriv_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header);
 | 
			
		||||
 | 
			
		||||
/* useful helper to get MPEG audio stream info. Return -1 if error in
 | 
			
		||||
   header, otherwise the coded frame size in bytes */
 | 
			
		||||
int ff_mpa_decode_header(uint32_t head, int *sample_rate,
 | 
			
		||||
                         int *channels, int *frame_size, int *bitrate, enum AVCodecID *codec_id);
 | 
			
		||||
 | 
			
		||||
/* fast header check for resync */
 | 
			
		||||
static inline int ff_mpa_check_header(uint32_t header){
 | 
			
		||||
    /* header */
 | 
			
		||||
    if ((header & 0xffe00000) != 0xffe00000)
 | 
			
		||||
        return -1;
 | 
			
		||||
    /* version check */
 | 
			
		||||
    if ((header & (3<<19)) == 1<<19)
 | 
			
		||||
        return -1;
 | 
			
		||||
    /* layer check */
 | 
			
		||||
    if ((header & (3<<17)) == 0)
 | 
			
		||||
        return -1;
 | 
			
		||||
    /* bit rate */
 | 
			
		||||
    if ((header & (0xf<<12)) == 0xf<<12)
 | 
			
		||||
        return -1;
 | 
			
		||||
    /* frequency */
 | 
			
		||||
    if ((header & (3<<10)) == 3<<10)
 | 
			
		||||
        return -1;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* AVCODEC_MPEGAUDIODECHEADER_H */
 | 
			
		||||
							
								
								
									
										615
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodectab.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										615
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodectab.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,615 @@
 | 
			
		|||
/*
 | 
			
		||||
 * MPEG Audio decoder
 | 
			
		||||
 * copyright (c) 2002 Fabrice Bellard
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * mpeg audio layer decoder tables.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef AVCODEC_MPEGAUDIODECTAB_H
 | 
			
		||||
#define AVCODEC_MPEGAUDIODECTAB_H
 | 
			
		||||
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include "mpegaudio.h"
 | 
			
		||||
 | 
			
		||||
/*******************************************************/
 | 
			
		||||
/* layer 3 tables */
 | 
			
		||||
 | 
			
		||||
/* layer 3 huffman tables */
 | 
			
		||||
typedef struct HuffTable {
 | 
			
		||||
    int xsize;
 | 
			
		||||
    const uint8_t *bits;
 | 
			
		||||
    const uint16_t *codes;
 | 
			
		||||
} HuffTable;
 | 
			
		||||
 | 
			
		||||
/* layer3 scale factor size */
 | 
			
		||||
static const uint8_t slen_table[2][16] = {
 | 
			
		||||
    { 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 },
 | 
			
		||||
    { 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* number of lsf scale factors for a given size */
 | 
			
		||||
static const uint8_t lsf_nsf_table[6][3][4] = {
 | 
			
		||||
    { {  6,  5,  5, 5 }, {  9,  9,  9, 9 }, {  6,  9,  9, 9 } },
 | 
			
		||||
    { {  6,  5,  7, 3 }, {  9,  9, 12, 6 }, {  6,  9, 12, 6 } },
 | 
			
		||||
    { { 11, 10,  0, 0 }, { 18, 18,  0, 0 }, { 15, 18,  0, 0 } },
 | 
			
		||||
    { {  7,  7,  7, 0 }, { 12, 12, 12, 0 }, {  6, 15, 12, 0 } },
 | 
			
		||||
    { {  6,  6,  6, 3 }, { 12,  9,  9, 6 }, {  6, 12,  9, 6 } },
 | 
			
		||||
    { {  8,  8,  5, 0 }, { 15, 12,  9, 0 }, {  6, 18,  9, 0 } },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* mpegaudio layer 3 huffman tables */
 | 
			
		||||
 | 
			
		||||
static const uint16_t mpa_huffcodes_1[4] = {
 | 
			
		||||
 0x0001, 0x0001, 0x0001, 0x0000,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huffbits_1[4] = {
 | 
			
		||||
  1,  3,  2,  3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint16_t mpa_huffcodes_2[9] = {
 | 
			
		||||
 0x0001, 0x0002, 0x0001, 0x0003, 0x0001, 0x0001, 0x0003, 0x0002,
 | 
			
		||||
 0x0000,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huffbits_2[9] = {
 | 
			
		||||
  1,  3,  6,  3,  3,  5,  5,  5,
 | 
			
		||||
  6,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint16_t mpa_huffcodes_3[9] = {
 | 
			
		||||
 0x0003, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0003, 0x0002,
 | 
			
		||||
 0x0000,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huffbits_3[9] = {
 | 
			
		||||
  2,  2,  6,  3,  2,  5,  5,  5,
 | 
			
		||||
  6,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint16_t mpa_huffcodes_5[16] = {
 | 
			
		||||
 0x0001, 0x0002, 0x0006, 0x0005, 0x0003, 0x0001, 0x0004, 0x0004,
 | 
			
		||||
 0x0007, 0x0005, 0x0007, 0x0001, 0x0006, 0x0001, 0x0001, 0x0000,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huffbits_5[16] = {
 | 
			
		||||
  1,  3,  6,  7,  3,  3,  6,  7,
 | 
			
		||||
  6,  6,  7,  8,  7,  6,  7,  8,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint16_t mpa_huffcodes_6[16] = {
 | 
			
		||||
 0x0007, 0x0003, 0x0005, 0x0001, 0x0006, 0x0002, 0x0003, 0x0002,
 | 
			
		||||
 0x0005, 0x0004, 0x0004, 0x0001, 0x0003, 0x0003, 0x0002, 0x0000,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huffbits_6[16] = {
 | 
			
		||||
  3,  3,  5,  7,  3,  2,  4,  5,
 | 
			
		||||
  4,  4,  5,  6,  6,  5,  6,  7,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint16_t mpa_huffcodes_7[36] = {
 | 
			
		||||
 0x0001, 0x0002, 0x000a, 0x0013, 0x0010, 0x000a, 0x0003, 0x0003,
 | 
			
		||||
 0x0007, 0x000a, 0x0005, 0x0003, 0x000b, 0x0004, 0x000d, 0x0011,
 | 
			
		||||
 0x0008, 0x0004, 0x000c, 0x000b, 0x0012, 0x000f, 0x000b, 0x0002,
 | 
			
		||||
 0x0007, 0x0006, 0x0009, 0x000e, 0x0003, 0x0001, 0x0006, 0x0004,
 | 
			
		||||
 0x0005, 0x0003, 0x0002, 0x0000,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huffbits_7[36] = {
 | 
			
		||||
  1,  3,  6,  8,  8,  9,  3,  4,
 | 
			
		||||
  6,  7,  7,  8,  6,  5,  7,  8,
 | 
			
		||||
  8,  9,  7,  7,  8,  9,  9,  9,
 | 
			
		||||
  7,  7,  8,  9,  9, 10,  8,  8,
 | 
			
		||||
  9, 10, 10, 10,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint16_t mpa_huffcodes_8[36] = {
 | 
			
		||||
 0x0003, 0x0004, 0x0006, 0x0012, 0x000c, 0x0005, 0x0005, 0x0001,
 | 
			
		||||
 0x0002, 0x0010, 0x0009, 0x0003, 0x0007, 0x0003, 0x0005, 0x000e,
 | 
			
		||||
 0x0007, 0x0003, 0x0013, 0x0011, 0x000f, 0x000d, 0x000a, 0x0004,
 | 
			
		||||
 0x000d, 0x0005, 0x0008, 0x000b, 0x0005, 0x0001, 0x000c, 0x0004,
 | 
			
		||||
 0x0004, 0x0001, 0x0001, 0x0000,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huffbits_8[36] = {
 | 
			
		||||
  2,  3,  6,  8,  8,  9,  3,  2,
 | 
			
		||||
  4,  8,  8,  8,  6,  4,  6,  8,
 | 
			
		||||
  8,  9,  8,  8,  8,  9,  9, 10,
 | 
			
		||||
  8,  7,  8,  9, 10, 10,  9,  8,
 | 
			
		||||
  9,  9, 11, 11,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint16_t mpa_huffcodes_9[36] = {
 | 
			
		||||
 0x0007, 0x0005, 0x0009, 0x000e, 0x000f, 0x0007, 0x0006, 0x0004,
 | 
			
		||||
 0x0005, 0x0005, 0x0006, 0x0007, 0x0007, 0x0006, 0x0008, 0x0008,
 | 
			
		||||
 0x0008, 0x0005, 0x000f, 0x0006, 0x0009, 0x000a, 0x0005, 0x0001,
 | 
			
		||||
 0x000b, 0x0007, 0x0009, 0x0006, 0x0004, 0x0001, 0x000e, 0x0004,
 | 
			
		||||
 0x0006, 0x0002, 0x0006, 0x0000,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huffbits_9[36] = {
 | 
			
		||||
  3,  3,  5,  6,  8,  9,  3,  3,
 | 
			
		||||
  4,  5,  6,  8,  4,  4,  5,  6,
 | 
			
		||||
  7,  8,  6,  5,  6,  7,  7,  8,
 | 
			
		||||
  7,  6,  7,  7,  8,  9,  8,  7,
 | 
			
		||||
  8,  8,  9,  9,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint16_t mpa_huffcodes_10[64] = {
 | 
			
		||||
 0x0001, 0x0002, 0x000a, 0x0017, 0x0023, 0x001e, 0x000c, 0x0011,
 | 
			
		||||
 0x0003, 0x0003, 0x0008, 0x000c, 0x0012, 0x0015, 0x000c, 0x0007,
 | 
			
		||||
 0x000b, 0x0009, 0x000f, 0x0015, 0x0020, 0x0028, 0x0013, 0x0006,
 | 
			
		||||
 0x000e, 0x000d, 0x0016, 0x0022, 0x002e, 0x0017, 0x0012, 0x0007,
 | 
			
		||||
 0x0014, 0x0013, 0x0021, 0x002f, 0x001b, 0x0016, 0x0009, 0x0003,
 | 
			
		||||
 0x001f, 0x0016, 0x0029, 0x001a, 0x0015, 0x0014, 0x0005, 0x0003,
 | 
			
		||||
 0x000e, 0x000d, 0x000a, 0x000b, 0x0010, 0x0006, 0x0005, 0x0001,
 | 
			
		||||
 0x0009, 0x0008, 0x0007, 0x0008, 0x0004, 0x0004, 0x0002, 0x0000,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huffbits_10[64] = {
 | 
			
		||||
  1,  3,  6,  8,  9,  9,  9, 10,
 | 
			
		||||
  3,  4,  6,  7,  8,  9,  8,  8,
 | 
			
		||||
  6,  6,  7,  8,  9, 10,  9,  9,
 | 
			
		||||
  7,  7,  8,  9, 10, 10,  9, 10,
 | 
			
		||||
  8,  8,  9, 10, 10, 10, 10, 10,
 | 
			
		||||
  9,  9, 10, 10, 11, 11, 10, 11,
 | 
			
		||||
  8,  8,  9, 10, 10, 10, 11, 11,
 | 
			
		||||
  9,  8,  9, 10, 10, 11, 11, 11,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint16_t mpa_huffcodes_11[64] = {
 | 
			
		||||
 0x0003, 0x0004, 0x000a, 0x0018, 0x0022, 0x0021, 0x0015, 0x000f,
 | 
			
		||||
 0x0005, 0x0003, 0x0004, 0x000a, 0x0020, 0x0011, 0x000b, 0x000a,
 | 
			
		||||
 0x000b, 0x0007, 0x000d, 0x0012, 0x001e, 0x001f, 0x0014, 0x0005,
 | 
			
		||||
 0x0019, 0x000b, 0x0013, 0x003b, 0x001b, 0x0012, 0x000c, 0x0005,
 | 
			
		||||
 0x0023, 0x0021, 0x001f, 0x003a, 0x001e, 0x0010, 0x0007, 0x0005,
 | 
			
		||||
 0x001c, 0x001a, 0x0020, 0x0013, 0x0011, 0x000f, 0x0008, 0x000e,
 | 
			
		||||
 0x000e, 0x000c, 0x0009, 0x000d, 0x000e, 0x0009, 0x0004, 0x0001,
 | 
			
		||||
 0x000b, 0x0004, 0x0006, 0x0006, 0x0006, 0x0003, 0x0002, 0x0000,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huffbits_11[64] = {
 | 
			
		||||
  2,  3,  5,  7,  8,  9,  8,  9,
 | 
			
		||||
  3,  3,  4,  6,  8,  8,  7,  8,
 | 
			
		||||
  5,  5,  6,  7,  8,  9,  8,  8,
 | 
			
		||||
  7,  6,  7,  9,  8, 10,  8,  9,
 | 
			
		||||
  8,  8,  8,  9,  9, 10,  9, 10,
 | 
			
		||||
  8,  8,  9, 10, 10, 11, 10, 11,
 | 
			
		||||
  8,  7,  7,  8,  9, 10, 10, 10,
 | 
			
		||||
  8,  7,  8,  9, 10, 10, 10, 10,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint16_t mpa_huffcodes_12[64] = {
 | 
			
		||||
 0x0009, 0x0006, 0x0010, 0x0021, 0x0029, 0x0027, 0x0026, 0x001a,
 | 
			
		||||
 0x0007, 0x0005, 0x0006, 0x0009, 0x0017, 0x0010, 0x001a, 0x000b,
 | 
			
		||||
 0x0011, 0x0007, 0x000b, 0x000e, 0x0015, 0x001e, 0x000a, 0x0007,
 | 
			
		||||
 0x0011, 0x000a, 0x000f, 0x000c, 0x0012, 0x001c, 0x000e, 0x0005,
 | 
			
		||||
 0x0020, 0x000d, 0x0016, 0x0013, 0x0012, 0x0010, 0x0009, 0x0005,
 | 
			
		||||
 0x0028, 0x0011, 0x001f, 0x001d, 0x0011, 0x000d, 0x0004, 0x0002,
 | 
			
		||||
 0x001b, 0x000c, 0x000b, 0x000f, 0x000a, 0x0007, 0x0004, 0x0001,
 | 
			
		||||
 0x001b, 0x000c, 0x0008, 0x000c, 0x0006, 0x0003, 0x0001, 0x0000,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huffbits_12[64] = {
 | 
			
		||||
  4,  3,  5,  7,  8,  9,  9,  9,
 | 
			
		||||
  3,  3,  4,  5,  7,  7,  8,  8,
 | 
			
		||||
  5,  4,  5,  6,  7,  8,  7,  8,
 | 
			
		||||
  6,  5,  6,  6,  7,  8,  8,  8,
 | 
			
		||||
  7,  6,  7,  7,  8,  8,  8,  9,
 | 
			
		||||
  8,  7,  8,  8,  8,  9,  8,  9,
 | 
			
		||||
  8,  7,  7,  8,  8,  9,  9, 10,
 | 
			
		||||
  9,  8,  8,  9,  9,  9,  9, 10,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint16_t mpa_huffcodes_13[256] = {
 | 
			
		||||
 0x0001, 0x0005, 0x000e, 0x0015, 0x0022, 0x0033, 0x002e, 0x0047,
 | 
			
		||||
 0x002a, 0x0034, 0x0044, 0x0034, 0x0043, 0x002c, 0x002b, 0x0013,
 | 
			
		||||
 0x0003, 0x0004, 0x000c, 0x0013, 0x001f, 0x001a, 0x002c, 0x0021,
 | 
			
		||||
 0x001f, 0x0018, 0x0020, 0x0018, 0x001f, 0x0023, 0x0016, 0x000e,
 | 
			
		||||
 0x000f, 0x000d, 0x0017, 0x0024, 0x003b, 0x0031, 0x004d, 0x0041,
 | 
			
		||||
 0x001d, 0x0028, 0x001e, 0x0028, 0x001b, 0x0021, 0x002a, 0x0010,
 | 
			
		||||
 0x0016, 0x0014, 0x0025, 0x003d, 0x0038, 0x004f, 0x0049, 0x0040,
 | 
			
		||||
 0x002b, 0x004c, 0x0038, 0x0025, 0x001a, 0x001f, 0x0019, 0x000e,
 | 
			
		||||
 0x0023, 0x0010, 0x003c, 0x0039, 0x0061, 0x004b, 0x0072, 0x005b,
 | 
			
		||||
 0x0036, 0x0049, 0x0037, 0x0029, 0x0030, 0x0035, 0x0017, 0x0018,
 | 
			
		||||
 0x003a, 0x001b, 0x0032, 0x0060, 0x004c, 0x0046, 0x005d, 0x0054,
 | 
			
		||||
 0x004d, 0x003a, 0x004f, 0x001d, 0x004a, 0x0031, 0x0029, 0x0011,
 | 
			
		||||
 0x002f, 0x002d, 0x004e, 0x004a, 0x0073, 0x005e, 0x005a, 0x004f,
 | 
			
		||||
 0x0045, 0x0053, 0x0047, 0x0032, 0x003b, 0x0026, 0x0024, 0x000f,
 | 
			
		||||
 0x0048, 0x0022, 0x0038, 0x005f, 0x005c, 0x0055, 0x005b, 0x005a,
 | 
			
		||||
 0x0056, 0x0049, 0x004d, 0x0041, 0x0033, 0x002c, 0x002b, 0x002a,
 | 
			
		||||
 0x002b, 0x0014, 0x001e, 0x002c, 0x0037, 0x004e, 0x0048, 0x0057,
 | 
			
		||||
 0x004e, 0x003d, 0x002e, 0x0036, 0x0025, 0x001e, 0x0014, 0x0010,
 | 
			
		||||
 0x0035, 0x0019, 0x0029, 0x0025, 0x002c, 0x003b, 0x0036, 0x0051,
 | 
			
		||||
 0x0042, 0x004c, 0x0039, 0x0036, 0x0025, 0x0012, 0x0027, 0x000b,
 | 
			
		||||
 0x0023, 0x0021, 0x001f, 0x0039, 0x002a, 0x0052, 0x0048, 0x0050,
 | 
			
		||||
 0x002f, 0x003a, 0x0037, 0x0015, 0x0016, 0x001a, 0x0026, 0x0016,
 | 
			
		||||
 0x0035, 0x0019, 0x0017, 0x0026, 0x0046, 0x003c, 0x0033, 0x0024,
 | 
			
		||||
 0x0037, 0x001a, 0x0022, 0x0017, 0x001b, 0x000e, 0x0009, 0x0007,
 | 
			
		||||
 0x0022, 0x0020, 0x001c, 0x0027, 0x0031, 0x004b, 0x001e, 0x0034,
 | 
			
		||||
 0x0030, 0x0028, 0x0034, 0x001c, 0x0012, 0x0011, 0x0009, 0x0005,
 | 
			
		||||
 0x002d, 0x0015, 0x0022, 0x0040, 0x0038, 0x0032, 0x0031, 0x002d,
 | 
			
		||||
 0x001f, 0x0013, 0x000c, 0x000f, 0x000a, 0x0007, 0x0006, 0x0003,
 | 
			
		||||
 0x0030, 0x0017, 0x0014, 0x0027, 0x0024, 0x0023, 0x0035, 0x0015,
 | 
			
		||||
 0x0010, 0x0017, 0x000d, 0x000a, 0x0006, 0x0001, 0x0004, 0x0002,
 | 
			
		||||
 0x0010, 0x000f, 0x0011, 0x001b, 0x0019, 0x0014, 0x001d, 0x000b,
 | 
			
		||||
 0x0011, 0x000c, 0x0010, 0x0008, 0x0001, 0x0001, 0x0000, 0x0001,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huffbits_13[256] = {
 | 
			
		||||
  1,  4,  6,  7,  8,  9,  9, 10,
 | 
			
		||||
  9, 10, 11, 11, 12, 12, 13, 13,
 | 
			
		||||
  3,  4,  6,  7,  8,  8,  9,  9,
 | 
			
		||||
  9,  9, 10, 10, 11, 12, 12, 12,
 | 
			
		||||
  6,  6,  7,  8,  9,  9, 10, 10,
 | 
			
		||||
  9, 10, 10, 11, 11, 12, 13, 13,
 | 
			
		||||
  7,  7,  8,  9,  9, 10, 10, 10,
 | 
			
		||||
 10, 11, 11, 11, 11, 12, 13, 13,
 | 
			
		||||
  8,  7,  9,  9, 10, 10, 11, 11,
 | 
			
		||||
 10, 11, 11, 12, 12, 13, 13, 14,
 | 
			
		||||
  9,  8,  9, 10, 10, 10, 11, 11,
 | 
			
		||||
 11, 11, 12, 11, 13, 13, 14, 14,
 | 
			
		||||
  9,  9, 10, 10, 11, 11, 11, 11,
 | 
			
		||||
 11, 12, 12, 12, 13, 13, 14, 14,
 | 
			
		||||
 10,  9, 10, 11, 11, 11, 12, 12,
 | 
			
		||||
 12, 12, 13, 13, 13, 14, 16, 16,
 | 
			
		||||
  9,  8,  9, 10, 10, 11, 11, 12,
 | 
			
		||||
 12, 12, 12, 13, 13, 14, 15, 15,
 | 
			
		||||
 10,  9, 10, 10, 11, 11, 11, 13,
 | 
			
		||||
 12, 13, 13, 14, 14, 14, 16, 15,
 | 
			
		||||
 10, 10, 10, 11, 11, 12, 12, 13,
 | 
			
		||||
 12, 13, 14, 13, 14, 15, 16, 17,
 | 
			
		||||
 11, 10, 10, 11, 12, 12, 12, 12,
 | 
			
		||||
 13, 13, 13, 14, 15, 15, 15, 16,
 | 
			
		||||
 11, 11, 11, 12, 12, 13, 12, 13,
 | 
			
		||||
 14, 14, 15, 15, 15, 16, 16, 16,
 | 
			
		||||
 12, 11, 12, 13, 13, 13, 14, 14,
 | 
			
		||||
 14, 14, 14, 15, 16, 15, 16, 16,
 | 
			
		||||
 13, 12, 12, 13, 13, 13, 15, 14,
 | 
			
		||||
 14, 17, 15, 15, 15, 17, 16, 16,
 | 
			
		||||
 12, 12, 13, 14, 14, 14, 15, 14,
 | 
			
		||||
 15, 15, 16, 16, 19, 18, 19, 16,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint16_t mpa_huffcodes_15[256] = {
 | 
			
		||||
 0x0007, 0x000c, 0x0012, 0x0035, 0x002f, 0x004c, 0x007c, 0x006c,
 | 
			
		||||
 0x0059, 0x007b, 0x006c, 0x0077, 0x006b, 0x0051, 0x007a, 0x003f,
 | 
			
		||||
 0x000d, 0x0005, 0x0010, 0x001b, 0x002e, 0x0024, 0x003d, 0x0033,
 | 
			
		||||
 0x002a, 0x0046, 0x0034, 0x0053, 0x0041, 0x0029, 0x003b, 0x0024,
 | 
			
		||||
 0x0013, 0x0011, 0x000f, 0x0018, 0x0029, 0x0022, 0x003b, 0x0030,
 | 
			
		||||
 0x0028, 0x0040, 0x0032, 0x004e, 0x003e, 0x0050, 0x0038, 0x0021,
 | 
			
		||||
 0x001d, 0x001c, 0x0019, 0x002b, 0x0027, 0x003f, 0x0037, 0x005d,
 | 
			
		||||
 0x004c, 0x003b, 0x005d, 0x0048, 0x0036, 0x004b, 0x0032, 0x001d,
 | 
			
		||||
 0x0034, 0x0016, 0x002a, 0x0028, 0x0043, 0x0039, 0x005f, 0x004f,
 | 
			
		||||
 0x0048, 0x0039, 0x0059, 0x0045, 0x0031, 0x0042, 0x002e, 0x001b,
 | 
			
		||||
 0x004d, 0x0025, 0x0023, 0x0042, 0x003a, 0x0034, 0x005b, 0x004a,
 | 
			
		||||
 0x003e, 0x0030, 0x004f, 0x003f, 0x005a, 0x003e, 0x0028, 0x0026,
 | 
			
		||||
 0x007d, 0x0020, 0x003c, 0x0038, 0x0032, 0x005c, 0x004e, 0x0041,
 | 
			
		||||
 0x0037, 0x0057, 0x0047, 0x0033, 0x0049, 0x0033, 0x0046, 0x001e,
 | 
			
		||||
 0x006d, 0x0035, 0x0031, 0x005e, 0x0058, 0x004b, 0x0042, 0x007a,
 | 
			
		||||
 0x005b, 0x0049, 0x0038, 0x002a, 0x0040, 0x002c, 0x0015, 0x0019,
 | 
			
		||||
 0x005a, 0x002b, 0x0029, 0x004d, 0x0049, 0x003f, 0x0038, 0x005c,
 | 
			
		||||
 0x004d, 0x0042, 0x002f, 0x0043, 0x0030, 0x0035, 0x0024, 0x0014,
 | 
			
		||||
 0x0047, 0x0022, 0x0043, 0x003c, 0x003a, 0x0031, 0x0058, 0x004c,
 | 
			
		||||
 0x0043, 0x006a, 0x0047, 0x0036, 0x0026, 0x0027, 0x0017, 0x000f,
 | 
			
		||||
 0x006d, 0x0035, 0x0033, 0x002f, 0x005a, 0x0052, 0x003a, 0x0039,
 | 
			
		||||
 0x0030, 0x0048, 0x0039, 0x0029, 0x0017, 0x001b, 0x003e, 0x0009,
 | 
			
		||||
 0x0056, 0x002a, 0x0028, 0x0025, 0x0046, 0x0040, 0x0034, 0x002b,
 | 
			
		||||
 0x0046, 0x0037, 0x002a, 0x0019, 0x001d, 0x0012, 0x000b, 0x000b,
 | 
			
		||||
 0x0076, 0x0044, 0x001e, 0x0037, 0x0032, 0x002e, 0x004a, 0x0041,
 | 
			
		||||
 0x0031, 0x0027, 0x0018, 0x0010, 0x0016, 0x000d, 0x000e, 0x0007,
 | 
			
		||||
 0x005b, 0x002c, 0x0027, 0x0026, 0x0022, 0x003f, 0x0034, 0x002d,
 | 
			
		||||
 0x001f, 0x0034, 0x001c, 0x0013, 0x000e, 0x0008, 0x0009, 0x0003,
 | 
			
		||||
 0x007b, 0x003c, 0x003a, 0x0035, 0x002f, 0x002b, 0x0020, 0x0016,
 | 
			
		||||
 0x0025, 0x0018, 0x0011, 0x000c, 0x000f, 0x000a, 0x0002, 0x0001,
 | 
			
		||||
 0x0047, 0x0025, 0x0022, 0x001e, 0x001c, 0x0014, 0x0011, 0x001a,
 | 
			
		||||
 0x0015, 0x0010, 0x000a, 0x0006, 0x0008, 0x0006, 0x0002, 0x0000,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huffbits_15[256] = {
 | 
			
		||||
  3,  4,  5,  7,  7,  8,  9,  9,
 | 
			
		||||
  9, 10, 10, 11, 11, 11, 12, 13,
 | 
			
		||||
  4,  3,  5,  6,  7,  7,  8,  8,
 | 
			
		||||
  8,  9,  9, 10, 10, 10, 11, 11,
 | 
			
		||||
  5,  5,  5,  6,  7,  7,  8,  8,
 | 
			
		||||
  8,  9,  9, 10, 10, 11, 11, 11,
 | 
			
		||||
  6,  6,  6,  7,  7,  8,  8,  9,
 | 
			
		||||
  9,  9, 10, 10, 10, 11, 11, 11,
 | 
			
		||||
  7,  6,  7,  7,  8,  8,  9,  9,
 | 
			
		||||
  9,  9, 10, 10, 10, 11, 11, 11,
 | 
			
		||||
  8,  7,  7,  8,  8,  8,  9,  9,
 | 
			
		||||
  9,  9, 10, 10, 11, 11, 11, 12,
 | 
			
		||||
  9,  7,  8,  8,  8,  9,  9,  9,
 | 
			
		||||
  9, 10, 10, 10, 11, 11, 12, 12,
 | 
			
		||||
  9,  8,  8,  9,  9,  9,  9, 10,
 | 
			
		||||
 10, 10, 10, 10, 11, 11, 11, 12,
 | 
			
		||||
  9,  8,  8,  9,  9,  9,  9, 10,
 | 
			
		||||
 10, 10, 10, 11, 11, 12, 12, 12,
 | 
			
		||||
  9,  8,  9,  9,  9,  9, 10, 10,
 | 
			
		||||
 10, 11, 11, 11, 11, 12, 12, 12,
 | 
			
		||||
 10,  9,  9,  9, 10, 10, 10, 10,
 | 
			
		||||
 10, 11, 11, 11, 11, 12, 13, 12,
 | 
			
		||||
 10,  9,  9,  9, 10, 10, 10, 10,
 | 
			
		||||
 11, 11, 11, 11, 12, 12, 12, 13,
 | 
			
		||||
 11, 10,  9, 10, 10, 10, 11, 11,
 | 
			
		||||
 11, 11, 11, 11, 12, 12, 13, 13,
 | 
			
		||||
 11, 10, 10, 10, 10, 11, 11, 11,
 | 
			
		||||
 11, 12, 12, 12, 12, 12, 13, 13,
 | 
			
		||||
 12, 11, 11, 11, 11, 11, 11, 11,
 | 
			
		||||
 12, 12, 12, 12, 13, 13, 12, 13,
 | 
			
		||||
 12, 11, 11, 11, 11, 11, 11, 12,
 | 
			
		||||
 12, 12, 12, 12, 13, 13, 13, 13,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint16_t mpa_huffcodes_16[256] = {
 | 
			
		||||
 0x0001, 0x0005, 0x000e, 0x002c, 0x004a, 0x003f, 0x006e, 0x005d,
 | 
			
		||||
 0x00ac, 0x0095, 0x008a, 0x00f2, 0x00e1, 0x00c3, 0x0178, 0x0011,
 | 
			
		||||
 0x0003, 0x0004, 0x000c, 0x0014, 0x0023, 0x003e, 0x0035, 0x002f,
 | 
			
		||||
 0x0053, 0x004b, 0x0044, 0x0077, 0x00c9, 0x006b, 0x00cf, 0x0009,
 | 
			
		||||
 0x000f, 0x000d, 0x0017, 0x0026, 0x0043, 0x003a, 0x0067, 0x005a,
 | 
			
		||||
 0x00a1, 0x0048, 0x007f, 0x0075, 0x006e, 0x00d1, 0x00ce, 0x0010,
 | 
			
		||||
 0x002d, 0x0015, 0x0027, 0x0045, 0x0040, 0x0072, 0x0063, 0x0057,
 | 
			
		||||
 0x009e, 0x008c, 0x00fc, 0x00d4, 0x00c7, 0x0183, 0x016d, 0x001a,
 | 
			
		||||
 0x004b, 0x0024, 0x0044, 0x0041, 0x0073, 0x0065, 0x00b3, 0x00a4,
 | 
			
		||||
 0x009b, 0x0108, 0x00f6, 0x00e2, 0x018b, 0x017e, 0x016a, 0x0009,
 | 
			
		||||
 0x0042, 0x001e, 0x003b, 0x0038, 0x0066, 0x00b9, 0x00ad, 0x0109,
 | 
			
		||||
 0x008e, 0x00fd, 0x00e8, 0x0190, 0x0184, 0x017a, 0x01bd, 0x0010,
 | 
			
		||||
 0x006f, 0x0036, 0x0034, 0x0064, 0x00b8, 0x00b2, 0x00a0, 0x0085,
 | 
			
		||||
 0x0101, 0x00f4, 0x00e4, 0x00d9, 0x0181, 0x016e, 0x02cb, 0x000a,
 | 
			
		||||
 0x0062, 0x0030, 0x005b, 0x0058, 0x00a5, 0x009d, 0x0094, 0x0105,
 | 
			
		||||
 0x00f8, 0x0197, 0x018d, 0x0174, 0x017c, 0x0379, 0x0374, 0x0008,
 | 
			
		||||
 0x0055, 0x0054, 0x0051, 0x009f, 0x009c, 0x008f, 0x0104, 0x00f9,
 | 
			
		||||
 0x01ab, 0x0191, 0x0188, 0x017f, 0x02d7, 0x02c9, 0x02c4, 0x0007,
 | 
			
		||||
 0x009a, 0x004c, 0x0049, 0x008d, 0x0083, 0x0100, 0x00f5, 0x01aa,
 | 
			
		||||
 0x0196, 0x018a, 0x0180, 0x02df, 0x0167, 0x02c6, 0x0160, 0x000b,
 | 
			
		||||
 0x008b, 0x0081, 0x0043, 0x007d, 0x00f7, 0x00e9, 0x00e5, 0x00db,
 | 
			
		||||
 0x0189, 0x02e7, 0x02e1, 0x02d0, 0x0375, 0x0372, 0x01b7, 0x0004,
 | 
			
		||||
 0x00f3, 0x0078, 0x0076, 0x0073, 0x00e3, 0x00df, 0x018c, 0x02ea,
 | 
			
		||||
 0x02e6, 0x02e0, 0x02d1, 0x02c8, 0x02c2, 0x00df, 0x01b4, 0x0006,
 | 
			
		||||
 0x00ca, 0x00e0, 0x00de, 0x00da, 0x00d8, 0x0185, 0x0182, 0x017d,
 | 
			
		||||
 0x016c, 0x0378, 0x01bb, 0x02c3, 0x01b8, 0x01b5, 0x06c0, 0x0004,
 | 
			
		||||
 0x02eb, 0x00d3, 0x00d2, 0x00d0, 0x0172, 0x017b, 0x02de, 0x02d3,
 | 
			
		||||
 0x02ca, 0x06c7, 0x0373, 0x036d, 0x036c, 0x0d83, 0x0361, 0x0002,
 | 
			
		||||
 0x0179, 0x0171, 0x0066, 0x00bb, 0x02d6, 0x02d2, 0x0166, 0x02c7,
 | 
			
		||||
 0x02c5, 0x0362, 0x06c6, 0x0367, 0x0d82, 0x0366, 0x01b2, 0x0000,
 | 
			
		||||
 0x000c, 0x000a, 0x0007, 0x000b, 0x000a, 0x0011, 0x000b, 0x0009,
 | 
			
		||||
 0x000d, 0x000c, 0x000a, 0x0007, 0x0005, 0x0003, 0x0001, 0x0003,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huffbits_16[256] = {
 | 
			
		||||
  1,  4,  6,  8,  9,  9, 10, 10,
 | 
			
		||||
 11, 11, 11, 12, 12, 12, 13,  9,
 | 
			
		||||
  3,  4,  6,  7,  8,  9,  9,  9,
 | 
			
		||||
 10, 10, 10, 11, 12, 11, 12,  8,
 | 
			
		||||
  6,  6,  7,  8,  9,  9, 10, 10,
 | 
			
		||||
 11, 10, 11, 11, 11, 12, 12,  9,
 | 
			
		||||
  8,  7,  8,  9,  9, 10, 10, 10,
 | 
			
		||||
 11, 11, 12, 12, 12, 13, 13, 10,
 | 
			
		||||
  9,  8,  9,  9, 10, 10, 11, 11,
 | 
			
		||||
 11, 12, 12, 12, 13, 13, 13,  9,
 | 
			
		||||
  9,  8,  9,  9, 10, 11, 11, 12,
 | 
			
		||||
 11, 12, 12, 13, 13, 13, 14, 10,
 | 
			
		||||
 10,  9,  9, 10, 11, 11, 11, 11,
 | 
			
		||||
 12, 12, 12, 12, 13, 13, 14, 10,
 | 
			
		||||
 10,  9, 10, 10, 11, 11, 11, 12,
 | 
			
		||||
 12, 13, 13, 13, 13, 15, 15, 10,
 | 
			
		||||
 10, 10, 10, 11, 11, 11, 12, 12,
 | 
			
		||||
 13, 13, 13, 13, 14, 14, 14, 10,
 | 
			
		||||
 11, 10, 10, 11, 11, 12, 12, 13,
 | 
			
		||||
 13, 13, 13, 14, 13, 14, 13, 11,
 | 
			
		||||
 11, 11, 10, 11, 12, 12, 12, 12,
 | 
			
		||||
 13, 14, 14, 14, 15, 15, 14, 10,
 | 
			
		||||
 12, 11, 11, 11, 12, 12, 13, 14,
 | 
			
		||||
 14, 14, 14, 14, 14, 13, 14, 11,
 | 
			
		||||
 12, 12, 12, 12, 12, 13, 13, 13,
 | 
			
		||||
 13, 15, 14, 14, 14, 14, 16, 11,
 | 
			
		||||
 14, 12, 12, 12, 13, 13, 14, 14,
 | 
			
		||||
 14, 16, 15, 15, 15, 17, 15, 11,
 | 
			
		||||
 13, 13, 11, 12, 14, 14, 13, 14,
 | 
			
		||||
 14, 15, 16, 15, 17, 15, 14, 11,
 | 
			
		||||
  9,  8,  8,  9,  9, 10, 10, 10,
 | 
			
		||||
 11, 11, 11, 11, 11, 11, 11,  8,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint16_t mpa_huffcodes_24[256] = {
 | 
			
		||||
 0x000f, 0x000d, 0x002e, 0x0050, 0x0092, 0x0106, 0x00f8, 0x01b2,
 | 
			
		||||
 0x01aa, 0x029d, 0x028d, 0x0289, 0x026d, 0x0205, 0x0408, 0x0058,
 | 
			
		||||
 0x000e, 0x000c, 0x0015, 0x0026, 0x0047, 0x0082, 0x007a, 0x00d8,
 | 
			
		||||
 0x00d1, 0x00c6, 0x0147, 0x0159, 0x013f, 0x0129, 0x0117, 0x002a,
 | 
			
		||||
 0x002f, 0x0016, 0x0029, 0x004a, 0x0044, 0x0080, 0x0078, 0x00dd,
 | 
			
		||||
 0x00cf, 0x00c2, 0x00b6, 0x0154, 0x013b, 0x0127, 0x021d, 0x0012,
 | 
			
		||||
 0x0051, 0x0027, 0x004b, 0x0046, 0x0086, 0x007d, 0x0074, 0x00dc,
 | 
			
		||||
 0x00cc, 0x00be, 0x00b2, 0x0145, 0x0137, 0x0125, 0x010f, 0x0010,
 | 
			
		||||
 0x0093, 0x0048, 0x0045, 0x0087, 0x007f, 0x0076, 0x0070, 0x00d2,
 | 
			
		||||
 0x00c8, 0x00bc, 0x0160, 0x0143, 0x0132, 0x011d, 0x021c, 0x000e,
 | 
			
		||||
 0x0107, 0x0042, 0x0081, 0x007e, 0x0077, 0x0072, 0x00d6, 0x00ca,
 | 
			
		||||
 0x00c0, 0x00b4, 0x0155, 0x013d, 0x012d, 0x0119, 0x0106, 0x000c,
 | 
			
		||||
 0x00f9, 0x007b, 0x0079, 0x0075, 0x0071, 0x00d7, 0x00ce, 0x00c3,
 | 
			
		||||
 0x00b9, 0x015b, 0x014a, 0x0134, 0x0123, 0x0110, 0x0208, 0x000a,
 | 
			
		||||
 0x01b3, 0x0073, 0x006f, 0x006d, 0x00d3, 0x00cb, 0x00c4, 0x00bb,
 | 
			
		||||
 0x0161, 0x014c, 0x0139, 0x012a, 0x011b, 0x0213, 0x017d, 0x0011,
 | 
			
		||||
 0x01ab, 0x00d4, 0x00d0, 0x00cd, 0x00c9, 0x00c1, 0x00ba, 0x00b1,
 | 
			
		||||
 0x00a9, 0x0140, 0x012f, 0x011e, 0x010c, 0x0202, 0x0179, 0x0010,
 | 
			
		||||
 0x014f, 0x00c7, 0x00c5, 0x00bf, 0x00bd, 0x00b5, 0x00ae, 0x014d,
 | 
			
		||||
 0x0141, 0x0131, 0x0121, 0x0113, 0x0209, 0x017b, 0x0173, 0x000b,
 | 
			
		||||
 0x029c, 0x00b8, 0x00b7, 0x00b3, 0x00af, 0x0158, 0x014b, 0x013a,
 | 
			
		||||
 0x0130, 0x0122, 0x0115, 0x0212, 0x017f, 0x0175, 0x016e, 0x000a,
 | 
			
		||||
 0x028c, 0x015a, 0x00ab, 0x00a8, 0x00a4, 0x013e, 0x0135, 0x012b,
 | 
			
		||||
 0x011f, 0x0114, 0x0107, 0x0201, 0x0177, 0x0170, 0x016a, 0x0006,
 | 
			
		||||
 0x0288, 0x0142, 0x013c, 0x0138, 0x0133, 0x012e, 0x0124, 0x011c,
 | 
			
		||||
 0x010d, 0x0105, 0x0200, 0x0178, 0x0172, 0x016c, 0x0167, 0x0004,
 | 
			
		||||
 0x026c, 0x012c, 0x0128, 0x0126, 0x0120, 0x011a, 0x0111, 0x010a,
 | 
			
		||||
 0x0203, 0x017c, 0x0176, 0x0171, 0x016d, 0x0169, 0x0165, 0x0002,
 | 
			
		||||
 0x0409, 0x0118, 0x0116, 0x0112, 0x010b, 0x0108, 0x0103, 0x017e,
 | 
			
		||||
 0x017a, 0x0174, 0x016f, 0x016b, 0x0168, 0x0166, 0x0164, 0x0000,
 | 
			
		||||
 0x002b, 0x0014, 0x0013, 0x0011, 0x000f, 0x000d, 0x000b, 0x0009,
 | 
			
		||||
 0x0007, 0x0006, 0x0004, 0x0007, 0x0005, 0x0003, 0x0001, 0x0003,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huffbits_24[256] = {
 | 
			
		||||
  4,  4,  6,  7,  8,  9,  9, 10,
 | 
			
		||||
 10, 11, 11, 11, 11, 11, 12,  9,
 | 
			
		||||
  4,  4,  5,  6,  7,  8,  8,  9,
 | 
			
		||||
  9,  9, 10, 10, 10, 10, 10,  8,
 | 
			
		||||
  6,  5,  6,  7,  7,  8,  8,  9,
 | 
			
		||||
  9,  9,  9, 10, 10, 10, 11,  7,
 | 
			
		||||
  7,  6,  7,  7,  8,  8,  8,  9,
 | 
			
		||||
  9,  9,  9, 10, 10, 10, 10,  7,
 | 
			
		||||
  8,  7,  7,  8,  8,  8,  8,  9,
 | 
			
		||||
  9,  9, 10, 10, 10, 10, 11,  7,
 | 
			
		||||
  9,  7,  8,  8,  8,  8,  9,  9,
 | 
			
		||||
  9,  9, 10, 10, 10, 10, 10,  7,
 | 
			
		||||
  9,  8,  8,  8,  8,  9,  9,  9,
 | 
			
		||||
  9, 10, 10, 10, 10, 10, 11,  7,
 | 
			
		||||
 10,  8,  8,  8,  9,  9,  9,  9,
 | 
			
		||||
 10, 10, 10, 10, 10, 11, 11,  8,
 | 
			
		||||
 10,  9,  9,  9,  9,  9,  9,  9,
 | 
			
		||||
  9, 10, 10, 10, 10, 11, 11,  8,
 | 
			
		||||
 10,  9,  9,  9,  9,  9,  9, 10,
 | 
			
		||||
 10, 10, 10, 10, 11, 11, 11,  8,
 | 
			
		||||
 11,  9,  9,  9,  9, 10, 10, 10,
 | 
			
		||||
 10, 10, 10, 11, 11, 11, 11,  8,
 | 
			
		||||
 11, 10,  9,  9,  9, 10, 10, 10,
 | 
			
		||||
 10, 10, 10, 11, 11, 11, 11,  8,
 | 
			
		||||
 11, 10, 10, 10, 10, 10, 10, 10,
 | 
			
		||||
 10, 10, 11, 11, 11, 11, 11,  8,
 | 
			
		||||
 11, 10, 10, 10, 10, 10, 10, 10,
 | 
			
		||||
 11, 11, 11, 11, 11, 11, 11,  8,
 | 
			
		||||
 12, 10, 10, 10, 10, 10, 10, 11,
 | 
			
		||||
 11, 11, 11, 11, 11, 11, 11,  8,
 | 
			
		||||
  8,  7,  7,  7,  7,  7,  7,  7,
 | 
			
		||||
  7,  7,  7,  8,  8,  8,  8,  4,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const HuffTable mpa_huff_tables[16] = {
 | 
			
		||||
{ 1, NULL, NULL },
 | 
			
		||||
{ 2, mpa_huffbits_1, mpa_huffcodes_1 },
 | 
			
		||||
{ 3, mpa_huffbits_2, mpa_huffcodes_2 },
 | 
			
		||||
{ 3, mpa_huffbits_3, mpa_huffcodes_3 },
 | 
			
		||||
{ 4, mpa_huffbits_5, mpa_huffcodes_5 },
 | 
			
		||||
{ 4, mpa_huffbits_6, mpa_huffcodes_6 },
 | 
			
		||||
{ 6, mpa_huffbits_7, mpa_huffcodes_7 },
 | 
			
		||||
{ 6, mpa_huffbits_8, mpa_huffcodes_8 },
 | 
			
		||||
{ 6, mpa_huffbits_9, mpa_huffcodes_9 },
 | 
			
		||||
{ 8, mpa_huffbits_10, mpa_huffcodes_10 },
 | 
			
		||||
{ 8, mpa_huffbits_11, mpa_huffcodes_11 },
 | 
			
		||||
{ 8, mpa_huffbits_12, mpa_huffcodes_12 },
 | 
			
		||||
{ 16, mpa_huffbits_13, mpa_huffcodes_13 },
 | 
			
		||||
{ 16, mpa_huffbits_15, mpa_huffcodes_15 },
 | 
			
		||||
{ 16, mpa_huffbits_16, mpa_huffcodes_16 },
 | 
			
		||||
{ 16, mpa_huffbits_24, mpa_huffcodes_24 },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_huff_data[32][2] = {
 | 
			
		||||
{ 0, 0 },
 | 
			
		||||
{ 1, 0 },
 | 
			
		||||
{ 2, 0 },
 | 
			
		||||
{ 3, 0 },
 | 
			
		||||
{ 0, 0 },
 | 
			
		||||
{ 4, 0 },
 | 
			
		||||
{ 5, 0 },
 | 
			
		||||
{ 6, 0 },
 | 
			
		||||
{ 7, 0 },
 | 
			
		||||
{ 8, 0 },
 | 
			
		||||
{ 9, 0 },
 | 
			
		||||
{ 10, 0 },
 | 
			
		||||
{ 11, 0 },
 | 
			
		||||
{ 12, 0 },
 | 
			
		||||
{ 0, 0 },
 | 
			
		||||
{ 13, 0 },
 | 
			
		||||
{ 14, 1 },
 | 
			
		||||
{ 14, 2 },
 | 
			
		||||
{ 14, 3 },
 | 
			
		||||
{ 14, 4 },
 | 
			
		||||
{ 14, 6 },
 | 
			
		||||
{ 14, 8 },
 | 
			
		||||
{ 14, 10 },
 | 
			
		||||
{ 14, 13 },
 | 
			
		||||
{ 15, 4 },
 | 
			
		||||
{ 15, 5 },
 | 
			
		||||
{ 15, 6 },
 | 
			
		||||
{ 15, 7 },
 | 
			
		||||
{ 15, 8 },
 | 
			
		||||
{ 15, 9 },
 | 
			
		||||
{ 15, 11 },
 | 
			
		||||
{ 15, 13 },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* huffman tables for quadrules */
 | 
			
		||||
static const uint8_t mpa_quad_codes[2][16] = {
 | 
			
		||||
    {  1,  5,  4,  5,  6,  5,  4,  4, 7,  3,  6,  0,  7,  2,  3,  1, },
 | 
			
		||||
    { 15, 14, 13, 12, 11, 10,  9,  8, 7,  6,  5,  4,  3,  2,  1,  0, },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_quad_bits[2][16] = {
 | 
			
		||||
    { 1, 4, 4, 5, 4, 6, 5, 6, 4, 5, 5, 6, 5, 6, 6, 6, },
 | 
			
		||||
    { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* band size tables */
 | 
			
		||||
static const uint8_t band_size_long[9][22] = {
 | 
			
		||||
{ 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10,
 | 
			
		||||
  12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158, }, /* 44100 */
 | 
			
		||||
{ 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10,
 | 
			
		||||
  12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192, }, /* 48000 */
 | 
			
		||||
{ 4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12,
 | 
			
		||||
  16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26, }, /* 32000 */
 | 
			
		||||
{ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
 | 
			
		||||
  20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, }, /* 22050 */
 | 
			
		||||
{ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
 | 
			
		||||
  18, 22, 26, 32, 38, 46, 52, 64, 70, 76, 36, }, /* 24000 */
 | 
			
		||||
{ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
 | 
			
		||||
  20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, }, /* 16000 */
 | 
			
		||||
{ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
 | 
			
		||||
  20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, }, /* 11025 */
 | 
			
		||||
{ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
 | 
			
		||||
  20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, }, /* 12000 */
 | 
			
		||||
{ 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32,
 | 
			
		||||
  40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2, }, /* 8000 */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t band_size_short[9][13] = {
 | 
			
		||||
{ 4, 4, 4, 4, 6, 8, 10, 12, 14, 18, 22, 30, 56, }, /* 44100 */
 | 
			
		||||
{ 4, 4, 4, 4, 6, 6, 10, 12, 14, 16, 20, 26, 66, }, /* 48000 */
 | 
			
		||||
{ 4, 4, 4, 4, 6, 8, 12, 16, 20, 26, 34, 42, 12, }, /* 32000 */
 | 
			
		||||
{ 4, 4, 4, 6, 6, 8, 10, 14, 18, 26, 32, 42, 18, }, /* 22050 */
 | 
			
		||||
{ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 32, 44, 12, }, /* 24000 */
 | 
			
		||||
{ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18, }, /* 16000 */
 | 
			
		||||
{ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18, }, /* 11025 */
 | 
			
		||||
{ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18, }, /* 12000 */
 | 
			
		||||
{ 8, 8, 8, 12, 16, 20, 24, 28, 36, 2, 2, 2, 26, }, /* 8000 */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const uint8_t mpa_pretab[2][22] = {
 | 
			
		||||
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 | 
			
		||||
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* table for alias reduction (XXX: store it as integer !) */
 | 
			
		||||
static const float ci_table[8] = {
 | 
			
		||||
    -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* AVCODEC_MPEGAUDIODECTAB_H */
 | 
			
		||||
							
								
								
									
										54
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodsp.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodsp.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,54 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2011 Mans Rullgard
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#include "libavutil/attributes.h"
 | 
			
		||||
#include "libavutil/thread.h"
 | 
			
		||||
#include "mpegaudiodsp.h"
 | 
			
		||||
#include "dct.h"
 | 
			
		||||
#include "dct32.h"
 | 
			
		||||
 | 
			
		||||
static AVOnce mpadsp_float_table_init = AV_ONCE_INIT;
 | 
			
		||||
static AVOnce mpadsp_fixed_table_init = AV_ONCE_INIT;
 | 
			
		||||
 | 
			
		||||
av_cold void ff_mpadsp_init(MPADSPContext *s)
 | 
			
		||||
{
 | 
			
		||||
    DCTContext dct;
 | 
			
		||||
 | 
			
		||||
    ff_dct_init(&dct, 5, DCT_II);
 | 
			
		||||
    ff_thread_once(&mpadsp_float_table_init, &ff_init_mpadsp_tabs_float);
 | 
			
		||||
    ff_thread_once(&mpadsp_fixed_table_init, &ff_init_mpadsp_tabs_fixed);
 | 
			
		||||
 | 
			
		||||
    s->apply_window_float = ff_mpadsp_apply_window_float;
 | 
			
		||||
    s->apply_window_fixed = ff_mpadsp_apply_window_fixed;
 | 
			
		||||
 | 
			
		||||
    s->dct32_float = dct.dct32;
 | 
			
		||||
    s->dct32_fixed = ff_dct32_fixed;
 | 
			
		||||
 | 
			
		||||
    s->imdct36_blocks_float = ff_imdct36_blocks_float;
 | 
			
		||||
    s->imdct36_blocks_fixed = ff_imdct36_blocks_fixed;
 | 
			
		||||
 | 
			
		||||
    if (ARCH_AARCH64) ff_mpadsp_init_aarch64(s);
 | 
			
		||||
    if (ARCH_ARM)     ff_mpadsp_init_arm(s);
 | 
			
		||||
    if (ARCH_PPC)     ff_mpadsp_init_ppc(s);
 | 
			
		||||
    if (ARCH_X86)     ff_mpadsp_init_x86(s);
 | 
			
		||||
    if (HAVE_MIPSFPU)   ff_mpadsp_init_mipsfpu(s);
 | 
			
		||||
    if (HAVE_MIPSDSP) ff_mpadsp_init_mipsdsp(s);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										94
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodsp.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodsp.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,94 @@
 | 
			
		|||
/*
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef AVCODEC_MPEGAUDIODSP_H
 | 
			
		||||
#define AVCODEC_MPEGAUDIODSP_H
 | 
			
		||||
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include "libavutil/common.h"
 | 
			
		||||
 | 
			
		||||
typedef struct MPADSPContext {
 | 
			
		||||
    void (*apply_window_float)(float *synth_buf, float *window,
 | 
			
		||||
                               int *dither_state, float *samples,
 | 
			
		||||
                               ptrdiff_t incr);
 | 
			
		||||
    void (*apply_window_fixed)(int32_t *synth_buf, int32_t *window,
 | 
			
		||||
                               int *dither_state, int16_t *samples,
 | 
			
		||||
                               ptrdiff_t incr);
 | 
			
		||||
    void (*dct32_float)(float *dst, const float *src);
 | 
			
		||||
    void (*dct32_fixed)(int *dst, const int *src);
 | 
			
		||||
 | 
			
		||||
    void (*imdct36_blocks_float)(float *out, float *buf, float *in,
 | 
			
		||||
                                 int count, int switch_point, int block_type);
 | 
			
		||||
    void (*imdct36_blocks_fixed)(int *out, int *buf, int *in,
 | 
			
		||||
                                 int count, int switch_point, int block_type);
 | 
			
		||||
} MPADSPContext;
 | 
			
		||||
 | 
			
		||||
void ff_mpadsp_init(MPADSPContext *s);
 | 
			
		||||
 | 
			
		||||
extern int32_t ff_mpa_synth_window_fixed[];
 | 
			
		||||
extern float   ff_mpa_synth_window_float[];
 | 
			
		||||
 | 
			
		||||
extern const int32_t ff_mpa_enwindow[257];
 | 
			
		||||
 | 
			
		||||
void ff_mpa_synth_filter_fixed(MPADSPContext *s,
 | 
			
		||||
                               int32_t *synth_buf_ptr, int *synth_buf_offset,
 | 
			
		||||
                               int32_t *window, int *dither_state,
 | 
			
		||||
                               int16_t *samples, ptrdiff_t incr,
 | 
			
		||||
                               int32_t *sb_samples);
 | 
			
		||||
 | 
			
		||||
void ff_mpa_synth_filter_float(MPADSPContext *s,
 | 
			
		||||
                               float *synth_buf_ptr, int *synth_buf_offset,
 | 
			
		||||
                               float *window, int *dither_state,
 | 
			
		||||
                               float *samples, ptrdiff_t incr,
 | 
			
		||||
                               float *sb_samples);
 | 
			
		||||
 | 
			
		||||
void ff_mpadsp_init_aarch64(MPADSPContext *s);
 | 
			
		||||
void ff_mpadsp_init_arm(MPADSPContext *s);
 | 
			
		||||
void ff_mpadsp_init_ppc(MPADSPContext *s);
 | 
			
		||||
void ff_mpadsp_init_x86(MPADSPContext *s);
 | 
			
		||||
void ff_mpadsp_init_mipsfpu(MPADSPContext *s);
 | 
			
		||||
void ff_mpadsp_init_mipsdsp(MPADSPContext *s);
 | 
			
		||||
 | 
			
		||||
void ff_mpa_synth_init_float(float *window);
 | 
			
		||||
void ff_mpa_synth_init_fixed(int32_t *window);
 | 
			
		||||
 | 
			
		||||
void ff_mpadsp_apply_window_float(float *synth_buf, float *window,
 | 
			
		||||
                                  int *dither_state, float *samples,
 | 
			
		||||
                                  ptrdiff_t incr);
 | 
			
		||||
void ff_mpadsp_apply_window_fixed(int32_t *synth_buf, int32_t *window,
 | 
			
		||||
                                  int *dither_state, int16_t *samples,
 | 
			
		||||
                                  ptrdiff_t incr);
 | 
			
		||||
 | 
			
		||||
void ff_imdct36_blocks_float(float *out, float *buf, float *in,
 | 
			
		||||
                             int count, int switch_point, int block_type);
 | 
			
		||||
 | 
			
		||||
void ff_imdct36_blocks_fixed(int *out, int *buf, int *in,
 | 
			
		||||
                             int count, int switch_point, int block_type);
 | 
			
		||||
 | 
			
		||||
void ff_init_mpadsp_tabs_float(void);
 | 
			
		||||
void ff_init_mpadsp_tabs_fixed(void);
 | 
			
		||||
 | 
			
		||||
/** For SSE implementation, MDCT_BUF_SIZE/2 should be 128-bit aligned */
 | 
			
		||||
#define MDCT_BUF_SIZE FFALIGN(36, 2*4)
 | 
			
		||||
 | 
			
		||||
extern int ff_mdct_win_fixed[8][MDCT_BUF_SIZE];
 | 
			
		||||
extern float ff_mdct_win_float[8][MDCT_BUF_SIZE];
 | 
			
		||||
 | 
			
		||||
#endif /* AVCODEC_MPEGAUDIODSP_H */
 | 
			
		||||
							
								
								
									
										56
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodsp_data.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodsp_data.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,56 @@
 | 
			
		|||
/*
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "mpegaudiodsp.h"
 | 
			
		||||
 | 
			
		||||
/* half mpeg encoding window (full precision) */
 | 
			
		||||
const int32_t ff_mpa_enwindow[257] = {
 | 
			
		||||
     0,    -1,    -1,    -1,    -1,    -1,    -1,    -2,
 | 
			
		||||
    -2,    -2,    -2,    -3,    -3,    -4,    -4,    -5,
 | 
			
		||||
    -5,    -6,    -7,    -7,    -8,    -9,   -10,   -11,
 | 
			
		||||
   -13,   -14,   -16,   -17,   -19,   -21,   -24,   -26,
 | 
			
		||||
   -29,   -31,   -35,   -38,   -41,   -45,   -49,   -53,
 | 
			
		||||
   -58,   -63,   -68,   -73,   -79,   -85,   -91,   -97,
 | 
			
		||||
  -104,  -111,  -117,  -125,  -132,  -139,  -147,  -154,
 | 
			
		||||
  -161,  -169,  -176,  -183,  -190,  -196,  -202,  -208,
 | 
			
		||||
   213,   218,   222,   225,   227,   228,   228,   227,
 | 
			
		||||
   224,   221,   215,   208,   200,   189,   177,   163,
 | 
			
		||||
   146,   127,   106,    83,    57,    29,    -2,   -36,
 | 
			
		||||
   -72,  -111,  -153,  -197,  -244,  -294,  -347,  -401,
 | 
			
		||||
  -459,  -519,  -581,  -645,  -711,  -779,  -848,  -919,
 | 
			
		||||
  -991, -1064, -1137, -1210, -1283, -1356, -1428, -1498,
 | 
			
		||||
 -1567, -1634, -1698, -1759, -1817, -1870, -1919, -1962,
 | 
			
		||||
 -2001, -2032, -2057, -2075, -2085, -2087, -2080, -2063,
 | 
			
		||||
  2037,  2000,  1952,  1893,  1822,  1739,  1644,  1535,
 | 
			
		||||
  1414,  1280,  1131,   970,   794,   605,   402,   185,
 | 
			
		||||
   -45,  -288,  -545,  -814, -1095, -1388, -1692, -2006,
 | 
			
		||||
 -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788,
 | 
			
		||||
 -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597,
 | 
			
		||||
 -7910, -8209, -8491, -8755, -8998, -9219, -9416, -9585,
 | 
			
		||||
 -9727, -9838, -9916, -9959, -9966, -9935, -9863, -9750,
 | 
			
		||||
 -9592, -9389, -9139, -8840, -8492, -8092, -7640, -7134,
 | 
			
		||||
  6574,  5959,  5288,  4561,  3776,  2935,  2037,  1082,
 | 
			
		||||
    70,  -998, -2122, -3300, -4533, -5818, -7154, -8540,
 | 
			
		||||
 -9975,-11455,-12980,-14548,-16155,-17799,-19478,-21189,
 | 
			
		||||
-22929,-24694,-26482,-28289,-30112,-31947,-33791,-35640,
 | 
			
		||||
-37489,-39336,-41176,-43006,-44821,-46617,-48390,-50137,
 | 
			
		||||
-51853,-53534,-55178,-56778,-58333,-59838,-61289,-62684,
 | 
			
		||||
-64019,-65290,-66494,-67629,-68692,-69679,-70590,-71420,
 | 
			
		||||
-72169,-72835,-73415,-73908,-74313,-74630,-74856,-74992,
 | 
			
		||||
 75038,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										20
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodsp_fixed.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodsp_fixed.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
/*
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define USE_FLOATS 0
 | 
			
		||||
#include "mpegaudiodsp_template.c"
 | 
			
		||||
							
								
								
									
										20
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodsp_float.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodsp_float.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
/*
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define USE_FLOATS 1
 | 
			
		||||
#include "mpegaudiodsp_template.c"
 | 
			
		||||
							
								
								
									
										401
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodsp_template.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										401
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiodsp_template.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,401 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2001, 2002 Fabrice Bellard
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include "libavutil/attributes.h"
 | 
			
		||||
#include "libavutil/mem.h"
 | 
			
		||||
#include "dct32.h"
 | 
			
		||||
#include "mathops.h"
 | 
			
		||||
#include "mpegaudiodsp.h"
 | 
			
		||||
#include "mpegaudio.h"
 | 
			
		||||
 | 
			
		||||
#if USE_FLOATS
 | 
			
		||||
#define RENAME(n) n##_float
 | 
			
		||||
 | 
			
		||||
static inline float round_sample(float *sum)
 | 
			
		||||
{
 | 
			
		||||
    float sum1=*sum;
 | 
			
		||||
    *sum = 0;
 | 
			
		||||
    return sum1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define MACS(rt, ra, rb) rt+=(ra)*(rb)
 | 
			
		||||
#define MULS(ra, rb) ((ra)*(rb))
 | 
			
		||||
#define MULH3(x, y, s) ((s)*(y)*(x))
 | 
			
		||||
#define MLSS(rt, ra, rb) rt-=(ra)*(rb)
 | 
			
		||||
#define MULLx(x, y, s) ((y)*(x))
 | 
			
		||||
#define FIXHR(x)        ((float)(x))
 | 
			
		||||
#define FIXR(x)        ((float)(x))
 | 
			
		||||
#define SHR(a,b)       ((a)*(1.0f/(1<<(b))))
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#define RENAME(n) n##_fixed
 | 
			
		||||
#define OUT_SHIFT (WFRAC_BITS + FRAC_BITS - 15)
 | 
			
		||||
 | 
			
		||||
static inline int round_sample(int64_t *sum)
 | 
			
		||||
{
 | 
			
		||||
    int sum1;
 | 
			
		||||
    sum1 = (int)((*sum) >> OUT_SHIFT);
 | 
			
		||||
    *sum &= (1<<OUT_SHIFT)-1;
 | 
			
		||||
    return av_clip_int16(sum1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#   define MULS(ra, rb) MUL64(ra, rb)
 | 
			
		||||
#   define MACS(rt, ra, rb) MAC64(rt, ra, rb)
 | 
			
		||||
#   define MLSS(rt, ra, rb) MLS64(rt, ra, rb)
 | 
			
		||||
#   define MULH3(x, y, s) MULH((s)*(x), y)
 | 
			
		||||
#   define MULLx(x, y, s) MULL((int)(x),(y),s)
 | 
			
		||||
#   define SHR(a,b)       (((int)(a))>>(b))
 | 
			
		||||
#   define FIXR(a)        ((int)((a) * FRAC_ONE + 0.5))
 | 
			
		||||
#   define FIXHR(a)       ((int)((a) * (1LL<<32) + 0.5))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** Window for MDCT. Actually only the elements in [0,17] and
 | 
			
		||||
    [MDCT_BUF_SIZE/2, MDCT_BUF_SIZE/2 + 17] are actually used. The rest
 | 
			
		||||
    is just to preserve alignment for SIMD implementations.
 | 
			
		||||
*/
 | 
			
		||||
DECLARE_ALIGNED(16, INTFLOAT, RENAME(ff_mdct_win))[8][MDCT_BUF_SIZE];
 | 
			
		||||
 | 
			
		||||
DECLARE_ALIGNED(16, MPA_INT, RENAME(ff_mpa_synth_window))[512+256];
 | 
			
		||||
 | 
			
		||||
#define SUM8(op, sum, w, p)               \
 | 
			
		||||
{                                         \
 | 
			
		||||
    op(sum, (w)[0 * 64], (p)[0 * 64]);    \
 | 
			
		||||
    op(sum, (w)[1 * 64], (p)[1 * 64]);    \
 | 
			
		||||
    op(sum, (w)[2 * 64], (p)[2 * 64]);    \
 | 
			
		||||
    op(sum, (w)[3 * 64], (p)[3 * 64]);    \
 | 
			
		||||
    op(sum, (w)[4 * 64], (p)[4 * 64]);    \
 | 
			
		||||
    op(sum, (w)[5 * 64], (p)[5 * 64]);    \
 | 
			
		||||
    op(sum, (w)[6 * 64], (p)[6 * 64]);    \
 | 
			
		||||
    op(sum, (w)[7 * 64], (p)[7 * 64]);    \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define SUM8P2(sum1, op1, sum2, op2, w1, w2, p) \
 | 
			
		||||
{                                               \
 | 
			
		||||
    INTFLOAT tmp;\
 | 
			
		||||
    tmp = p[0 * 64];\
 | 
			
		||||
    op1(sum1, (w1)[0 * 64], tmp);\
 | 
			
		||||
    op2(sum2, (w2)[0 * 64], tmp);\
 | 
			
		||||
    tmp = p[1 * 64];\
 | 
			
		||||
    op1(sum1, (w1)[1 * 64], tmp);\
 | 
			
		||||
    op2(sum2, (w2)[1 * 64], tmp);\
 | 
			
		||||
    tmp = p[2 * 64];\
 | 
			
		||||
    op1(sum1, (w1)[2 * 64], tmp);\
 | 
			
		||||
    op2(sum2, (w2)[2 * 64], tmp);\
 | 
			
		||||
    tmp = p[3 * 64];\
 | 
			
		||||
    op1(sum1, (w1)[3 * 64], tmp);\
 | 
			
		||||
    op2(sum2, (w2)[3 * 64], tmp);\
 | 
			
		||||
    tmp = p[4 * 64];\
 | 
			
		||||
    op1(sum1, (w1)[4 * 64], tmp);\
 | 
			
		||||
    op2(sum2, (w2)[4 * 64], tmp);\
 | 
			
		||||
    tmp = p[5 * 64];\
 | 
			
		||||
    op1(sum1, (w1)[5 * 64], tmp);\
 | 
			
		||||
    op2(sum2, (w2)[5 * 64], tmp);\
 | 
			
		||||
    tmp = p[6 * 64];\
 | 
			
		||||
    op1(sum1, (w1)[6 * 64], tmp);\
 | 
			
		||||
    op2(sum2, (w2)[6 * 64], tmp);\
 | 
			
		||||
    tmp = p[7 * 64];\
 | 
			
		||||
    op1(sum1, (w1)[7 * 64], tmp);\
 | 
			
		||||
    op2(sum2, (w2)[7 * 64], tmp);\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RENAME(ff_mpadsp_apply_window)(MPA_INT *synth_buf, MPA_INT *window,
 | 
			
		||||
                                  int *dither_state, OUT_INT *samples,
 | 
			
		||||
                                  ptrdiff_t incr)
 | 
			
		||||
{
 | 
			
		||||
    register const MPA_INT *w, *w2, *p;
 | 
			
		||||
    int j;
 | 
			
		||||
    OUT_INT *samples2;
 | 
			
		||||
#if USE_FLOATS
 | 
			
		||||
    float sum, sum2;
 | 
			
		||||
#else
 | 
			
		||||
    int64_t sum, sum2;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    /* copy to avoid wrap */
 | 
			
		||||
    memcpy(synth_buf + 512, synth_buf, 32 * sizeof(*synth_buf));
 | 
			
		||||
 | 
			
		||||
    samples2 = samples + 31 * incr;
 | 
			
		||||
    w = window;
 | 
			
		||||
    w2 = window + 31;
 | 
			
		||||
 | 
			
		||||
    sum = *dither_state;
 | 
			
		||||
    p = synth_buf + 16;
 | 
			
		||||
    SUM8(MACS, sum, w, p);
 | 
			
		||||
    p = synth_buf + 48;
 | 
			
		||||
    SUM8(MLSS, sum, w + 32, p);
 | 
			
		||||
    *samples = round_sample(&sum);
 | 
			
		||||
    samples += incr;
 | 
			
		||||
    w++;
 | 
			
		||||
 | 
			
		||||
    /* we calculate two samples at the same time to avoid one memory
 | 
			
		||||
       access per two sample */
 | 
			
		||||
    for(j=1;j<16;j++) {
 | 
			
		||||
        sum2 = 0;
 | 
			
		||||
        p = synth_buf + 16 + j;
 | 
			
		||||
        SUM8P2(sum, MACS, sum2, MLSS, w, w2, p);
 | 
			
		||||
        p = synth_buf + 48 - j;
 | 
			
		||||
        SUM8P2(sum, MLSS, sum2, MLSS, w + 32, w2 + 32, p);
 | 
			
		||||
 | 
			
		||||
        *samples = round_sample(&sum);
 | 
			
		||||
        samples += incr;
 | 
			
		||||
        sum += sum2;
 | 
			
		||||
        *samples2 = round_sample(&sum);
 | 
			
		||||
        samples2 -= incr;
 | 
			
		||||
        w++;
 | 
			
		||||
        w2--;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    p = synth_buf + 32;
 | 
			
		||||
    SUM8(MLSS, sum, w + 32, p);
 | 
			
		||||
    *samples = round_sample(&sum);
 | 
			
		||||
    *dither_state= sum;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 32 sub band synthesis filter. Input: 32 sub band samples, Output:
 | 
			
		||||
   32 samples. */
 | 
			
		||||
void RENAME(ff_mpa_synth_filter)(MPADSPContext *s, MPA_INT *synth_buf_ptr,
 | 
			
		||||
                                 int *synth_buf_offset,
 | 
			
		||||
                                 MPA_INT *window, int *dither_state,
 | 
			
		||||
                                 OUT_INT *samples, ptrdiff_t incr,
 | 
			
		||||
                                 MPA_INT *sb_samples)
 | 
			
		||||
{
 | 
			
		||||
    MPA_INT *synth_buf;
 | 
			
		||||
    int offset;
 | 
			
		||||
 | 
			
		||||
    offset = *synth_buf_offset;
 | 
			
		||||
    synth_buf = synth_buf_ptr + offset;
 | 
			
		||||
 | 
			
		||||
    s->RENAME(dct32)(synth_buf, sb_samples);
 | 
			
		||||
    s->RENAME(apply_window)(synth_buf, window, dither_state, samples, incr);
 | 
			
		||||
 | 
			
		||||
    offset = (offset - 32) & 511;
 | 
			
		||||
    *synth_buf_offset = offset;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
av_cold void RENAME(ff_mpa_synth_init)(MPA_INT *window)
 | 
			
		||||
{
 | 
			
		||||
    int i, j;
 | 
			
		||||
 | 
			
		||||
    /* max = 18760, max sum over all 16 coefs : 44736 */
 | 
			
		||||
    for(i=0;i<257;i++) {
 | 
			
		||||
        INTFLOAT v;
 | 
			
		||||
        v = ff_mpa_enwindow[i];
 | 
			
		||||
#if USE_FLOATS
 | 
			
		||||
        v *= 1.0 / (1LL<<(16 + FRAC_BITS));
 | 
			
		||||
#endif
 | 
			
		||||
        window[i] = v;
 | 
			
		||||
        if ((i & 63) != 0)
 | 
			
		||||
            v = -v;
 | 
			
		||||
        if (i != 0)
 | 
			
		||||
            window[512 - i] = v;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // Needed for avoiding shuffles in ASM implementations
 | 
			
		||||
    for(i=0; i < 8; i++)
 | 
			
		||||
        for(j=0; j < 16; j++)
 | 
			
		||||
            window[512+16*i+j] = window[64*i+32-j];
 | 
			
		||||
 | 
			
		||||
    for(i=0; i < 8; i++)
 | 
			
		||||
        for(j=0; j < 16; j++)
 | 
			
		||||
            window[512+128+16*i+j] = window[64*i+48-j];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
av_cold void RENAME(ff_init_mpadsp_tabs)(void)
 | 
			
		||||
{
 | 
			
		||||
    int i, j;
 | 
			
		||||
    /* compute mdct windows */
 | 
			
		||||
    for (i = 0; i < 36; i++) {
 | 
			
		||||
        for (j = 0; j < 4; j++) {
 | 
			
		||||
            double d;
 | 
			
		||||
 | 
			
		||||
            if (j == 2 && i % 3 != 1)
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            d = sin(M_PI * (i + 0.5) / 36.0);
 | 
			
		||||
            if (j == 1) {
 | 
			
		||||
                if      (i >= 30) d = 0;
 | 
			
		||||
                else if (i >= 24) d = sin(M_PI * (i - 18 + 0.5) / 12.0);
 | 
			
		||||
                else if (i >= 18) d = 1;
 | 
			
		||||
            } else if (j == 3) {
 | 
			
		||||
                if      (i <   6) d = 0;
 | 
			
		||||
                else if (i <  12) d = sin(M_PI * (i -  6 + 0.5) / 12.0);
 | 
			
		||||
                else if (i <  18) d = 1;
 | 
			
		||||
            }
 | 
			
		||||
            //merge last stage of imdct into the window coefficients
 | 
			
		||||
            d *= 0.5 * IMDCT_SCALAR / cos(M_PI * (2 * i + 19) / 72);
 | 
			
		||||
 | 
			
		||||
            if (j == 2)
 | 
			
		||||
                RENAME(ff_mdct_win)[j][i/3] = FIXHR((d / (1<<5)));
 | 
			
		||||
            else {
 | 
			
		||||
                int idx = i < 18 ? i : i + (MDCT_BUF_SIZE/2 - 18);
 | 
			
		||||
                RENAME(ff_mdct_win)[j][idx] = FIXHR((d / (1<<5)));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* NOTE: we do frequency inversion adter the MDCT by changing
 | 
			
		||||
        the sign of the right window coefs */
 | 
			
		||||
    for (j = 0; j < 4; j++) {
 | 
			
		||||
        for (i = 0; i < MDCT_BUF_SIZE; i += 2) {
 | 
			
		||||
            RENAME(ff_mdct_win)[j + 4][i    ] =  RENAME(ff_mdct_win)[j][i    ];
 | 
			
		||||
            RENAME(ff_mdct_win)[j + 4][i + 1] = -RENAME(ff_mdct_win)[j][i + 1];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
/* cos(pi*i/18) */
 | 
			
		||||
#define C1 FIXHR(0.98480775301220805936/2)
 | 
			
		||||
#define C2 FIXHR(0.93969262078590838405/2)
 | 
			
		||||
#define C3 FIXHR(0.86602540378443864676/2)
 | 
			
		||||
#define C4 FIXHR(0.76604444311897803520/2)
 | 
			
		||||
#define C5 FIXHR(0.64278760968653932632/2)
 | 
			
		||||
#define C6 FIXHR(0.5/2)
 | 
			
		||||
#define C7 FIXHR(0.34202014332566873304/2)
 | 
			
		||||
#define C8 FIXHR(0.17364817766693034885/2)
 | 
			
		||||
 | 
			
		||||
/* 0.5 / cos(pi*(2*i+1)/36) */
 | 
			
		||||
static const INTFLOAT icos36[9] = {
 | 
			
		||||
    FIXR(0.50190991877167369479),
 | 
			
		||||
    FIXR(0.51763809020504152469), //0
 | 
			
		||||
    FIXR(0.55168895948124587824),
 | 
			
		||||
    FIXR(0.61038729438072803416),
 | 
			
		||||
    FIXR(0.70710678118654752439), //1
 | 
			
		||||
    FIXR(0.87172339781054900991),
 | 
			
		||||
    FIXR(1.18310079157624925896),
 | 
			
		||||
    FIXR(1.93185165257813657349), //2
 | 
			
		||||
    FIXR(5.73685662283492756461),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* 0.5 / cos(pi*(2*i+1)/36) */
 | 
			
		||||
static const INTFLOAT icos36h[9] = {
 | 
			
		||||
    FIXHR(0.50190991877167369479/2),
 | 
			
		||||
    FIXHR(0.51763809020504152469/2), //0
 | 
			
		||||
    FIXHR(0.55168895948124587824/2),
 | 
			
		||||
    FIXHR(0.61038729438072803416/2),
 | 
			
		||||
    FIXHR(0.70710678118654752439/2), //1
 | 
			
		||||
    FIXHR(0.87172339781054900991/2),
 | 
			
		||||
    FIXHR(1.18310079157624925896/4),
 | 
			
		||||
    FIXHR(1.93185165257813657349/4), //2
 | 
			
		||||
//    FIXHR(5.73685662283492756461),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* using Lee like decomposition followed by hand coded 9 points DCT */
 | 
			
		||||
static void imdct36(INTFLOAT *out, INTFLOAT *buf, SUINTFLOAT *in, INTFLOAT *win)
 | 
			
		||||
{
 | 
			
		||||
    int i, j;
 | 
			
		||||
    SUINTFLOAT t0, t1, t2, t3, s0, s1, s2, s3;
 | 
			
		||||
    SUINTFLOAT tmp[18], *tmp1, *in1;
 | 
			
		||||
 | 
			
		||||
    for (i = 17; i >= 1; i--)
 | 
			
		||||
        in[i] += in[i-1];
 | 
			
		||||
    for (i = 17; i >= 3; i -= 2)
 | 
			
		||||
        in[i] += in[i-2];
 | 
			
		||||
 | 
			
		||||
    for (j = 0; j < 2; j++) {
 | 
			
		||||
        tmp1 = tmp + j;
 | 
			
		||||
        in1 = in + j;
 | 
			
		||||
 | 
			
		||||
        t2 = in1[2*4] + in1[2*8] - in1[2*2];
 | 
			
		||||
 | 
			
		||||
        t3 = in1[2*0] + SHR(in1[2*6],1);
 | 
			
		||||
        t1 = in1[2*0] - in1[2*6];
 | 
			
		||||
        tmp1[ 6] = t1 - SHR(t2,1);
 | 
			
		||||
        tmp1[16] = t1 + t2;
 | 
			
		||||
 | 
			
		||||
        t0 = MULH3(in1[2*2] + in1[2*4] ,    C2, 2);
 | 
			
		||||
        t1 = MULH3(in1[2*4] - in1[2*8] , -2*C8, 1);
 | 
			
		||||
        t2 = MULH3(in1[2*2] + in1[2*8] ,   -C4, 2);
 | 
			
		||||
 | 
			
		||||
        tmp1[10] = t3 - t0 - t2;
 | 
			
		||||
        tmp1[ 2] = t3 + t0 + t1;
 | 
			
		||||
        tmp1[14] = t3 + t2 - t1;
 | 
			
		||||
 | 
			
		||||
        tmp1[ 4] = MULH3(in1[2*5] + in1[2*7] - in1[2*1], -C3, 2);
 | 
			
		||||
        t2 = MULH3(in1[2*1] + in1[2*5],    C1, 2);
 | 
			
		||||
        t3 = MULH3(in1[2*5] - in1[2*7], -2*C7, 1);
 | 
			
		||||
        t0 = MULH3(in1[2*3], C3, 2);
 | 
			
		||||
 | 
			
		||||
        t1 = MULH3(in1[2*1] + in1[2*7],   -C5, 2);
 | 
			
		||||
 | 
			
		||||
        tmp1[ 0] = t2 + t3 + t0;
 | 
			
		||||
        tmp1[12] = t2 + t1 - t0;
 | 
			
		||||
        tmp1[ 8] = t3 - t1 - t0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    i = 0;
 | 
			
		||||
    for (j = 0; j < 4; j++) {
 | 
			
		||||
        t0 = tmp[i];
 | 
			
		||||
        t1 = tmp[i + 2];
 | 
			
		||||
        s0 = t1 + t0;
 | 
			
		||||
        s2 = t1 - t0;
 | 
			
		||||
 | 
			
		||||
        t2 = tmp[i + 1];
 | 
			
		||||
        t3 = tmp[i + 3];
 | 
			
		||||
        s1 = MULH3(t3 + t2, icos36h[    j], 2);
 | 
			
		||||
        s3 = MULLx(t3 - t2, icos36 [8 - j], FRAC_BITS);
 | 
			
		||||
 | 
			
		||||
        t0 = s0 + s1;
 | 
			
		||||
        t1 = s0 - s1;
 | 
			
		||||
        out[(9 + j) * SBLIMIT] = MULH3(t1, win[     9 + j], 1) + buf[4*(9 + j)];
 | 
			
		||||
        out[(8 - j) * SBLIMIT] = MULH3(t1, win[     8 - j], 1) + buf[4*(8 - j)];
 | 
			
		||||
        buf[4 * ( 9 + j     )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + 9 + j], 1);
 | 
			
		||||
        buf[4 * ( 8 - j     )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + 8 - j], 1);
 | 
			
		||||
 | 
			
		||||
        t0 = s2 + s3;
 | 
			
		||||
        t1 = s2 - s3;
 | 
			
		||||
        out[(9 + 8 - j) * SBLIMIT] = MULH3(t1, win[     9 + 8 - j], 1) + buf[4*(9 + 8 - j)];
 | 
			
		||||
        out[         j  * SBLIMIT] = MULH3(t1, win[             j], 1) + buf[4*(        j)];
 | 
			
		||||
        buf[4 * ( 9 + 8 - j     )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + 9 + 8 - j], 1);
 | 
			
		||||
        buf[4 * (         j     )] = MULH3(t0, win[MDCT_BUF_SIZE/2         + j], 1);
 | 
			
		||||
        i += 4;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    s0 = tmp[16];
 | 
			
		||||
    s1 = MULH3(tmp[17], icos36h[4], 2);
 | 
			
		||||
    t0 = s0 + s1;
 | 
			
		||||
    t1 = s0 - s1;
 | 
			
		||||
    out[(9 + 4) * SBLIMIT] = MULH3(t1, win[     9 + 4], 1) + buf[4*(9 + 4)];
 | 
			
		||||
    out[(8 - 4) * SBLIMIT] = MULH3(t1, win[     8 - 4], 1) + buf[4*(8 - 4)];
 | 
			
		||||
    buf[4 * ( 9 + 4     )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + 9 + 4], 1);
 | 
			
		||||
    buf[4 * ( 8 - 4     )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + 8 - 4], 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RENAME(ff_imdct36_blocks)(INTFLOAT *out, INTFLOAT *buf, INTFLOAT *in,
 | 
			
		||||
                               int count, int switch_point, int block_type)
 | 
			
		||||
{
 | 
			
		||||
    int j;
 | 
			
		||||
    for (j=0 ; j < count; j++) {
 | 
			
		||||
        /* apply window & overlap with previous buffer */
 | 
			
		||||
 | 
			
		||||
        /* select window */
 | 
			
		||||
        int win_idx = (switch_point && j < 2) ? 0 : block_type;
 | 
			
		||||
        INTFLOAT *win = RENAME(ff_mdct_win)[win_idx + (4 & -(j & 1))];
 | 
			
		||||
 | 
			
		||||
        imdct36(out, buf, in, win);
 | 
			
		||||
 | 
			
		||||
        in  += 18;
 | 
			
		||||
        buf += ((j&3) != 3 ? 1 : (72-3));
 | 
			
		||||
        out++;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										41
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudioenc_fixed.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudioenc_fixed.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
/*
 | 
			
		||||
 * The simplest mpeg audio layer 2 encoder
 | 
			
		||||
 * Copyright (c) 2000, 2001 Fabrice Bellard
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "mpegaudioenc_template.c"
 | 
			
		||||
 | 
			
		||||
AVCodec ff_mp2fixed_encoder = {
 | 
			
		||||
    .name                  = "mp2fixed",
 | 
			
		||||
    .long_name             = NULL_IF_CONFIG_SMALL("MP2 fixed point (MPEG audio layer 2)"),
 | 
			
		||||
    .type                  = AVMEDIA_TYPE_AUDIO,
 | 
			
		||||
    .id                    = AV_CODEC_ID_MP2,
 | 
			
		||||
    .priv_data_size        = sizeof(MpegAudioContext),
 | 
			
		||||
    .init                  = MPA_encode_init,
 | 
			
		||||
    .encode2               = MPA_encode_frame,
 | 
			
		||||
    .sample_fmts           = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
 | 
			
		||||
                                                            AV_SAMPLE_FMT_NONE },
 | 
			
		||||
    .supported_samplerates = (const int[]){
 | 
			
		||||
        44100, 48000,  32000, 22050, 24000, 16000, 0
 | 
			
		||||
    },
 | 
			
		||||
    .channel_layouts       = (const uint64_t[]){ AV_CH_LAYOUT_MONO,
 | 
			
		||||
                                                 AV_CH_LAYOUT_STEREO,
 | 
			
		||||
                                                 0 },
 | 
			
		||||
    .defaults              = mp2_defaults,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										42
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudioenc_float.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudioenc_float.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,42 @@
 | 
			
		|||
/*
 | 
			
		||||
 * The simplest mpeg audio layer 2 encoder
 | 
			
		||||
 * Copyright (c) 2000, 2001 Fabrice Bellard
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define USE_FLOATS 1
 | 
			
		||||
#include "mpegaudioenc_template.c"
 | 
			
		||||
 | 
			
		||||
AVCodec ff_mp2_encoder = {
 | 
			
		||||
    .name                  = "mp2",
 | 
			
		||||
    .long_name             = NULL_IF_CONFIG_SMALL("MP2 (MPEG audio layer 2)"),
 | 
			
		||||
    .type                  = AVMEDIA_TYPE_AUDIO,
 | 
			
		||||
    .id                    = AV_CODEC_ID_MP2,
 | 
			
		||||
    .priv_data_size        = sizeof(MpegAudioContext),
 | 
			
		||||
    .init                  = MPA_encode_init,
 | 
			
		||||
    .encode2               = MPA_encode_frame,
 | 
			
		||||
    .sample_fmts           = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
 | 
			
		||||
                                                            AV_SAMPLE_FMT_NONE },
 | 
			
		||||
    .supported_samplerates = (const int[]){
 | 
			
		||||
        44100, 48000,  32000, 22050, 24000, 16000, 0
 | 
			
		||||
    },
 | 
			
		||||
    .channel_layouts       = (const uint64_t[]){ AV_CH_LAYOUT_MONO,
 | 
			
		||||
                                                 AV_CH_LAYOUT_STEREO,
 | 
			
		||||
                                                 0 },
 | 
			
		||||
    .defaults              = mp2_defaults,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										785
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudioenc_template.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										785
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudioenc_template.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,785 @@
 | 
			
		|||
/*
 | 
			
		||||
 * The simplest mpeg audio layer 2 encoder
 | 
			
		||||
 * Copyright (c) 2000, 2001 Fabrice Bellard
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * The simplest mpeg audio layer 2 encoder.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "libavutil/channel_layout.h"
 | 
			
		||||
 | 
			
		||||
#include "avcodec.h"
 | 
			
		||||
#include "internal.h"
 | 
			
		||||
#include "put_bits.h"
 | 
			
		||||
 | 
			
		||||
#define FRAC_BITS   15   /* fractional bits for sb_samples and dct */
 | 
			
		||||
#define WFRAC_BITS  14   /* fractional bits for window */
 | 
			
		||||
 | 
			
		||||
#include "mpegaudio.h"
 | 
			
		||||
#include "mpegaudiodsp.h"
 | 
			
		||||
#include "mpegaudiodata.h"
 | 
			
		||||
#include "mpegaudiotab.h"
 | 
			
		||||
 | 
			
		||||
/* currently, cannot change these constants (need to modify
 | 
			
		||||
   quantization stage) */
 | 
			
		||||
#define MUL(a,b) (((int64_t)(a) * (int64_t)(b)) >> FRAC_BITS)
 | 
			
		||||
 | 
			
		||||
#define SAMPLES_BUF_SIZE 4096
 | 
			
		||||
 | 
			
		||||
typedef struct MpegAudioContext {
 | 
			
		||||
    PutBitContext pb;
 | 
			
		||||
    int nb_channels;
 | 
			
		||||
    int lsf;           /* 1 if mpeg2 low bitrate selected */
 | 
			
		||||
    int bitrate_index; /* bit rate */
 | 
			
		||||
    int freq_index;
 | 
			
		||||
    int frame_size; /* frame size, in bits, without padding */
 | 
			
		||||
    /* padding computation */
 | 
			
		||||
    int frame_frac, frame_frac_incr, do_padding;
 | 
			
		||||
    short samples_buf[MPA_MAX_CHANNELS][SAMPLES_BUF_SIZE]; /* buffer for filter */
 | 
			
		||||
    int samples_offset[MPA_MAX_CHANNELS];       /* offset in samples_buf */
 | 
			
		||||
    int sb_samples[MPA_MAX_CHANNELS][3][12][SBLIMIT];
 | 
			
		||||
    unsigned char scale_factors[MPA_MAX_CHANNELS][SBLIMIT][3]; /* scale factors */
 | 
			
		||||
    /* code to group 3 scale factors */
 | 
			
		||||
    unsigned char scale_code[MPA_MAX_CHANNELS][SBLIMIT];
 | 
			
		||||
    int sblimit; /* number of used subbands */
 | 
			
		||||
    const unsigned char *alloc_table;
 | 
			
		||||
    int16_t filter_bank[512];
 | 
			
		||||
    int scale_factor_table[64];
 | 
			
		||||
    unsigned char scale_diff_table[128];
 | 
			
		||||
#if USE_FLOATS
 | 
			
		||||
    float scale_factor_inv_table[64];
 | 
			
		||||
#else
 | 
			
		||||
    int8_t scale_factor_shift[64];
 | 
			
		||||
    unsigned short scale_factor_mult[64];
 | 
			
		||||
#endif
 | 
			
		||||
    unsigned short total_quant_bits[17]; /* total number of bits per allocation group */
 | 
			
		||||
} MpegAudioContext;
 | 
			
		||||
 | 
			
		||||
static av_cold int MPA_encode_init(AVCodecContext *avctx)
 | 
			
		||||
{
 | 
			
		||||
    MpegAudioContext *s = avctx->priv_data;
 | 
			
		||||
    int freq = avctx->sample_rate;
 | 
			
		||||
    int bitrate = avctx->bit_rate;
 | 
			
		||||
    int channels = avctx->channels;
 | 
			
		||||
    int i, v, table;
 | 
			
		||||
    float a;
 | 
			
		||||
 | 
			
		||||
    if (channels <= 0 || channels > 2){
 | 
			
		||||
        av_log(avctx, AV_LOG_ERROR, "encoding %d channel(s) is not allowed in mp2\n", channels);
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
    }
 | 
			
		||||
    bitrate = bitrate / 1000;
 | 
			
		||||
    s->nb_channels = channels;
 | 
			
		||||
    avctx->frame_size = MPA_FRAME_SIZE;
 | 
			
		||||
    avctx->initial_padding = 512 - 32 + 1;
 | 
			
		||||
 | 
			
		||||
    /* encoding freq */
 | 
			
		||||
    s->lsf = 0;
 | 
			
		||||
    for(i=0;i<3;i++) {
 | 
			
		||||
        if (avpriv_mpa_freq_tab[i] == freq)
 | 
			
		||||
            break;
 | 
			
		||||
        if ((avpriv_mpa_freq_tab[i] / 2) == freq) {
 | 
			
		||||
            s->lsf = 1;
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (i == 3){
 | 
			
		||||
        av_log(avctx, AV_LOG_ERROR, "Sampling rate %d is not allowed in mp2\n", freq);
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
    }
 | 
			
		||||
    s->freq_index = i;
 | 
			
		||||
 | 
			
		||||
    /* encoding bitrate & frequency */
 | 
			
		||||
    for(i=1;i<15;i++) {
 | 
			
		||||
        if (avpriv_mpa_bitrate_tab[s->lsf][1][i] == bitrate)
 | 
			
		||||
            break;
 | 
			
		||||
    }
 | 
			
		||||
    if (i == 15 && !avctx->bit_rate) {
 | 
			
		||||
        i = 14;
 | 
			
		||||
        bitrate = avpriv_mpa_bitrate_tab[s->lsf][1][i];
 | 
			
		||||
        avctx->bit_rate = bitrate * 1000;
 | 
			
		||||
    }
 | 
			
		||||
    if (i == 15){
 | 
			
		||||
        av_log(avctx, AV_LOG_ERROR, "bitrate %d is not allowed in mp2\n", bitrate);
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
    }
 | 
			
		||||
    s->bitrate_index = i;
 | 
			
		||||
 | 
			
		||||
    /* compute total header size & pad bit */
 | 
			
		||||
 | 
			
		||||
    a = (float)(bitrate * 1000 * MPA_FRAME_SIZE) / (freq * 8.0);
 | 
			
		||||
    s->frame_size = ((int)a) * 8;
 | 
			
		||||
 | 
			
		||||
    /* frame fractional size to compute padding */
 | 
			
		||||
    s->frame_frac = 0;
 | 
			
		||||
    s->frame_frac_incr = (int)((a - floor(a)) * 65536.0);
 | 
			
		||||
 | 
			
		||||
    /* select the right allocation table */
 | 
			
		||||
    table = ff_mpa_l2_select_table(bitrate, s->nb_channels, freq, s->lsf);
 | 
			
		||||
 | 
			
		||||
    /* number of used subbands */
 | 
			
		||||
    s->sblimit = ff_mpa_sblimit_table[table];
 | 
			
		||||
    s->alloc_table = ff_mpa_alloc_tables[table];
 | 
			
		||||
 | 
			
		||||
    ff_dlog(avctx, "%d kb/s, %d Hz, frame_size=%d bits, table=%d, padincr=%x\n",
 | 
			
		||||
            bitrate, freq, s->frame_size, table, s->frame_frac_incr);
 | 
			
		||||
 | 
			
		||||
    for(i=0;i<s->nb_channels;i++)
 | 
			
		||||
        s->samples_offset[i] = 0;
 | 
			
		||||
 | 
			
		||||
    for(i=0;i<257;i++) {
 | 
			
		||||
        int v;
 | 
			
		||||
        v = ff_mpa_enwindow[i];
 | 
			
		||||
#if WFRAC_BITS != 16
 | 
			
		||||
        v = (v + (1 << (16 - WFRAC_BITS - 1))) >> (16 - WFRAC_BITS);
 | 
			
		||||
#endif
 | 
			
		||||
        s->filter_bank[i] = v;
 | 
			
		||||
        if ((i & 63) != 0)
 | 
			
		||||
            v = -v;
 | 
			
		||||
        if (i != 0)
 | 
			
		||||
            s->filter_bank[512 - i] = v;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for(i=0;i<64;i++) {
 | 
			
		||||
        v = (int)(exp2((3 - i) / 3.0) * (1 << 20));
 | 
			
		||||
        if (v <= 0)
 | 
			
		||||
            v = 1;
 | 
			
		||||
        s->scale_factor_table[i] = v;
 | 
			
		||||
#if USE_FLOATS
 | 
			
		||||
        s->scale_factor_inv_table[i] = exp2(-(3 - i) / 3.0) / (float)(1 << 20);
 | 
			
		||||
#else
 | 
			
		||||
#define P 15
 | 
			
		||||
        s->scale_factor_shift[i] = 21 - P - (i / 3);
 | 
			
		||||
        s->scale_factor_mult[i] = (1 << P) * exp2((i % 3) / 3.0);
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
    for(i=0;i<128;i++) {
 | 
			
		||||
        v = i - 64;
 | 
			
		||||
        if (v <= -3)
 | 
			
		||||
            v = 0;
 | 
			
		||||
        else if (v < 0)
 | 
			
		||||
            v = 1;
 | 
			
		||||
        else if (v == 0)
 | 
			
		||||
            v = 2;
 | 
			
		||||
        else if (v < 3)
 | 
			
		||||
            v = 3;
 | 
			
		||||
        else
 | 
			
		||||
            v = 4;
 | 
			
		||||
        s->scale_diff_table[i] = v;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for(i=0;i<17;i++) {
 | 
			
		||||
        v = ff_mpa_quant_bits[i];
 | 
			
		||||
        if (v < 0)
 | 
			
		||||
            v = -v;
 | 
			
		||||
        else
 | 
			
		||||
            v = v * 3;
 | 
			
		||||
        s->total_quant_bits[i] = 12 * v;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 32 point floating point IDCT without 1/sqrt(2) coef zero scaling */
 | 
			
		||||
static void idct32(int *out, int *tab)
 | 
			
		||||
{
 | 
			
		||||
    int i, j;
 | 
			
		||||
    int *t, *t1, xr;
 | 
			
		||||
    const int *xp = costab32;
 | 
			
		||||
 | 
			
		||||
    for(j=31;j>=3;j-=2) tab[j] += tab[j - 2];
 | 
			
		||||
 | 
			
		||||
    t = tab + 30;
 | 
			
		||||
    t1 = tab + 2;
 | 
			
		||||
    do {
 | 
			
		||||
        t[0] += t[-4];
 | 
			
		||||
        t[1] += t[1 - 4];
 | 
			
		||||
        t -= 4;
 | 
			
		||||
    } while (t != t1);
 | 
			
		||||
 | 
			
		||||
    t = tab + 28;
 | 
			
		||||
    t1 = tab + 4;
 | 
			
		||||
    do {
 | 
			
		||||
        t[0] += t[-8];
 | 
			
		||||
        t[1] += t[1-8];
 | 
			
		||||
        t[2] += t[2-8];
 | 
			
		||||
        t[3] += t[3-8];
 | 
			
		||||
        t -= 8;
 | 
			
		||||
    } while (t != t1);
 | 
			
		||||
 | 
			
		||||
    t = tab;
 | 
			
		||||
    t1 = tab + 32;
 | 
			
		||||
    do {
 | 
			
		||||
        t[ 3] = -t[ 3];
 | 
			
		||||
        t[ 6] = -t[ 6];
 | 
			
		||||
 | 
			
		||||
        t[11] = -t[11];
 | 
			
		||||
        t[12] = -t[12];
 | 
			
		||||
        t[13] = -t[13];
 | 
			
		||||
        t[15] = -t[15];
 | 
			
		||||
        t += 16;
 | 
			
		||||
    } while (t != t1);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    t = tab;
 | 
			
		||||
    t1 = tab + 8;
 | 
			
		||||
    do {
 | 
			
		||||
        int x1, x2, x3, x4;
 | 
			
		||||
 | 
			
		||||
        x3 = MUL(t[16], FIX(M_SQRT2*0.5));
 | 
			
		||||
        x4 = t[0] - x3;
 | 
			
		||||
        x3 = t[0] + x3;
 | 
			
		||||
 | 
			
		||||
        x2 = MUL(-(t[24] + t[8]), FIX(M_SQRT2*0.5));
 | 
			
		||||
        x1 = MUL((t[8] - x2), xp[0]);
 | 
			
		||||
        x2 = MUL((t[8] + x2), xp[1]);
 | 
			
		||||
 | 
			
		||||
        t[ 0] = x3 + x1;
 | 
			
		||||
        t[ 8] = x4 - x2;
 | 
			
		||||
        t[16] = x4 + x2;
 | 
			
		||||
        t[24] = x3 - x1;
 | 
			
		||||
        t++;
 | 
			
		||||
    } while (t != t1);
 | 
			
		||||
 | 
			
		||||
    xp += 2;
 | 
			
		||||
    t = tab;
 | 
			
		||||
    t1 = tab + 4;
 | 
			
		||||
    do {
 | 
			
		||||
        xr = MUL(t[28],xp[0]);
 | 
			
		||||
        t[28] = (t[0] - xr);
 | 
			
		||||
        t[0] = (t[0] + xr);
 | 
			
		||||
 | 
			
		||||
        xr = MUL(t[4],xp[1]);
 | 
			
		||||
        t[ 4] = (t[24] - xr);
 | 
			
		||||
        t[24] = (t[24] + xr);
 | 
			
		||||
 | 
			
		||||
        xr = MUL(t[20],xp[2]);
 | 
			
		||||
        t[20] = (t[8] - xr);
 | 
			
		||||
        t[ 8] = (t[8] + xr);
 | 
			
		||||
 | 
			
		||||
        xr = MUL(t[12],xp[3]);
 | 
			
		||||
        t[12] = (t[16] - xr);
 | 
			
		||||
        t[16] = (t[16] + xr);
 | 
			
		||||
        t++;
 | 
			
		||||
    } while (t != t1);
 | 
			
		||||
    xp += 4;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < 4; i++) {
 | 
			
		||||
        xr = MUL(tab[30-i*4],xp[0]);
 | 
			
		||||
        tab[30-i*4] = (tab[i*4] - xr);
 | 
			
		||||
        tab[   i*4] = (tab[i*4] + xr);
 | 
			
		||||
 | 
			
		||||
        xr = MUL(tab[ 2+i*4],xp[1]);
 | 
			
		||||
        tab[ 2+i*4] = (tab[28-i*4] - xr);
 | 
			
		||||
        tab[28-i*4] = (tab[28-i*4] + xr);
 | 
			
		||||
 | 
			
		||||
        xr = MUL(tab[31-i*4],xp[0]);
 | 
			
		||||
        tab[31-i*4] = (tab[1+i*4] - xr);
 | 
			
		||||
        tab[ 1+i*4] = (tab[1+i*4] + xr);
 | 
			
		||||
 | 
			
		||||
        xr = MUL(tab[ 3+i*4],xp[1]);
 | 
			
		||||
        tab[ 3+i*4] = (tab[29-i*4] - xr);
 | 
			
		||||
        tab[29-i*4] = (tab[29-i*4] + xr);
 | 
			
		||||
 | 
			
		||||
        xp += 2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    t = tab + 30;
 | 
			
		||||
    t1 = tab + 1;
 | 
			
		||||
    do {
 | 
			
		||||
        xr = MUL(t1[0], *xp);
 | 
			
		||||
        t1[0] = (t[0] - xr);
 | 
			
		||||
        t[0] = (t[0] + xr);
 | 
			
		||||
        t -= 2;
 | 
			
		||||
        t1 += 2;
 | 
			
		||||
        xp++;
 | 
			
		||||
    } while (t >= tab);
 | 
			
		||||
 | 
			
		||||
    for(i=0;i<32;i++) {
 | 
			
		||||
        out[i] = tab[bitinv32[i]];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define WSHIFT (WFRAC_BITS + 15 - FRAC_BITS)
 | 
			
		||||
 | 
			
		||||
static void filter(MpegAudioContext *s, int ch, const short *samples, int incr)
 | 
			
		||||
{
 | 
			
		||||
    short *p, *q;
 | 
			
		||||
    int sum, offset, i, j;
 | 
			
		||||
    int tmp[64];
 | 
			
		||||
    int tmp1[32];
 | 
			
		||||
    int *out;
 | 
			
		||||
 | 
			
		||||
    offset = s->samples_offset[ch];
 | 
			
		||||
    out = &s->sb_samples[ch][0][0][0];
 | 
			
		||||
    for(j=0;j<36;j++) {
 | 
			
		||||
        /* 32 samples at once */
 | 
			
		||||
        for(i=0;i<32;i++) {
 | 
			
		||||
            s->samples_buf[ch][offset + (31 - i)] = samples[0];
 | 
			
		||||
            samples += incr;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* filter */
 | 
			
		||||
        p = s->samples_buf[ch] + offset;
 | 
			
		||||
        q = s->filter_bank;
 | 
			
		||||
        /* maxsum = 23169 */
 | 
			
		||||
        for(i=0;i<64;i++) {
 | 
			
		||||
            sum = p[0*64] * q[0*64];
 | 
			
		||||
            sum += p[1*64] * q[1*64];
 | 
			
		||||
            sum += p[2*64] * q[2*64];
 | 
			
		||||
            sum += p[3*64] * q[3*64];
 | 
			
		||||
            sum += p[4*64] * q[4*64];
 | 
			
		||||
            sum += p[5*64] * q[5*64];
 | 
			
		||||
            sum += p[6*64] * q[6*64];
 | 
			
		||||
            sum += p[7*64] * q[7*64];
 | 
			
		||||
            tmp[i] = sum;
 | 
			
		||||
            p++;
 | 
			
		||||
            q++;
 | 
			
		||||
        }
 | 
			
		||||
        tmp1[0] = tmp[16] >> WSHIFT;
 | 
			
		||||
        for( i=1; i<=16; i++ ) tmp1[i] = (tmp[i+16]+tmp[16-i]) >> WSHIFT;
 | 
			
		||||
        for( i=17; i<=31; i++ ) tmp1[i] = (tmp[i+16]-tmp[80-i]) >> WSHIFT;
 | 
			
		||||
 | 
			
		||||
        idct32(out, tmp1);
 | 
			
		||||
 | 
			
		||||
        /* advance of 32 samples */
 | 
			
		||||
        offset -= 32;
 | 
			
		||||
        out += 32;
 | 
			
		||||
        /* handle the wrap around */
 | 
			
		||||
        if (offset < 0) {
 | 
			
		||||
            memmove(s->samples_buf[ch] + SAMPLES_BUF_SIZE - (512 - 32),
 | 
			
		||||
                    s->samples_buf[ch], (512 - 32) * 2);
 | 
			
		||||
            offset = SAMPLES_BUF_SIZE - 512;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    s->samples_offset[ch] = offset;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void compute_scale_factors(MpegAudioContext *s,
 | 
			
		||||
                                  unsigned char scale_code[SBLIMIT],
 | 
			
		||||
                                  unsigned char scale_factors[SBLIMIT][3],
 | 
			
		||||
                                  int sb_samples[3][12][SBLIMIT],
 | 
			
		||||
                                  int sblimit)
 | 
			
		||||
{
 | 
			
		||||
    int *p, vmax, v, n, i, j, k, code;
 | 
			
		||||
    int index, d1, d2;
 | 
			
		||||
    unsigned char *sf = &scale_factors[0][0];
 | 
			
		||||
 | 
			
		||||
    for(j=0;j<sblimit;j++) {
 | 
			
		||||
        for(i=0;i<3;i++) {
 | 
			
		||||
            /* find the max absolute value */
 | 
			
		||||
            p = &sb_samples[i][0][j];
 | 
			
		||||
            vmax = abs(*p);
 | 
			
		||||
            for(k=1;k<12;k++) {
 | 
			
		||||
                p += SBLIMIT;
 | 
			
		||||
                v = abs(*p);
 | 
			
		||||
                if (v > vmax)
 | 
			
		||||
                    vmax = v;
 | 
			
		||||
            }
 | 
			
		||||
            /* compute the scale factor index using log 2 computations */
 | 
			
		||||
            if (vmax > 1) {
 | 
			
		||||
                n = av_log2(vmax);
 | 
			
		||||
                /* n is the position of the MSB of vmax. now
 | 
			
		||||
                   use at most 2 compares to find the index */
 | 
			
		||||
                index = (21 - n) * 3 - 3;
 | 
			
		||||
                if (index >= 0) {
 | 
			
		||||
                    while (vmax <= s->scale_factor_table[index+1])
 | 
			
		||||
                        index++;
 | 
			
		||||
                } else {
 | 
			
		||||
                    index = 0; /* very unlikely case of overflow */
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                index = 62; /* value 63 is not allowed */
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ff_dlog(NULL, "%2d:%d in=%x %x %d\n",
 | 
			
		||||
                    j, i, vmax, s->scale_factor_table[index], index);
 | 
			
		||||
            /* store the scale factor */
 | 
			
		||||
            av_assert2(index >=0 && index <= 63);
 | 
			
		||||
            sf[i] = index;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* compute the transmission factor : look if the scale factors
 | 
			
		||||
           are close enough to each other */
 | 
			
		||||
        d1 = s->scale_diff_table[sf[0] - sf[1] + 64];
 | 
			
		||||
        d2 = s->scale_diff_table[sf[1] - sf[2] + 64];
 | 
			
		||||
 | 
			
		||||
        /* handle the 25 cases */
 | 
			
		||||
        switch(d1 * 5 + d2) {
 | 
			
		||||
        case 0*5+0:
 | 
			
		||||
        case 0*5+4:
 | 
			
		||||
        case 3*5+4:
 | 
			
		||||
        case 4*5+0:
 | 
			
		||||
        case 4*5+4:
 | 
			
		||||
            code = 0;
 | 
			
		||||
            break;
 | 
			
		||||
        case 0*5+1:
 | 
			
		||||
        case 0*5+2:
 | 
			
		||||
        case 4*5+1:
 | 
			
		||||
        case 4*5+2:
 | 
			
		||||
            code = 3;
 | 
			
		||||
            sf[2] = sf[1];
 | 
			
		||||
            break;
 | 
			
		||||
        case 0*5+3:
 | 
			
		||||
        case 4*5+3:
 | 
			
		||||
            code = 3;
 | 
			
		||||
            sf[1] = sf[2];
 | 
			
		||||
            break;
 | 
			
		||||
        case 1*5+0:
 | 
			
		||||
        case 1*5+4:
 | 
			
		||||
        case 2*5+4:
 | 
			
		||||
            code = 1;
 | 
			
		||||
            sf[1] = sf[0];
 | 
			
		||||
            break;
 | 
			
		||||
        case 1*5+1:
 | 
			
		||||
        case 1*5+2:
 | 
			
		||||
        case 2*5+0:
 | 
			
		||||
        case 2*5+1:
 | 
			
		||||
        case 2*5+2:
 | 
			
		||||
            code = 2;
 | 
			
		||||
            sf[1] = sf[2] = sf[0];
 | 
			
		||||
            break;
 | 
			
		||||
        case 2*5+3:
 | 
			
		||||
        case 3*5+3:
 | 
			
		||||
            code = 2;
 | 
			
		||||
            sf[0] = sf[1] = sf[2];
 | 
			
		||||
            break;
 | 
			
		||||
        case 3*5+0:
 | 
			
		||||
        case 3*5+1:
 | 
			
		||||
        case 3*5+2:
 | 
			
		||||
            code = 2;
 | 
			
		||||
            sf[0] = sf[2] = sf[1];
 | 
			
		||||
            break;
 | 
			
		||||
        case 1*5+3:
 | 
			
		||||
            code = 2;
 | 
			
		||||
            if (sf[0] > sf[2])
 | 
			
		||||
              sf[0] = sf[2];
 | 
			
		||||
            sf[1] = sf[2] = sf[0];
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            av_assert2(0); //cannot happen
 | 
			
		||||
            code = 0;           /* kill warning */
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ff_dlog(NULL, "%d: %2d %2d %2d %d %d -> %d\n", j,
 | 
			
		||||
                sf[0], sf[1], sf[2], d1, d2, code);
 | 
			
		||||
        scale_code[j] = code;
 | 
			
		||||
        sf += 3;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* The most important function : psycho acoustic module. In this
 | 
			
		||||
   encoder there is basically none, so this is the worst you can do,
 | 
			
		||||
   but also this is the simpler. */
 | 
			
		||||
static void psycho_acoustic_model(MpegAudioContext *s, short smr[SBLIMIT])
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    for(i=0;i<s->sblimit;i++) {
 | 
			
		||||
        smr[i] = (int)(fixed_smr[i] * 10);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SB_NOTALLOCATED  0
 | 
			
		||||
#define SB_ALLOCATED     1
 | 
			
		||||
#define SB_NOMORE        2
 | 
			
		||||
 | 
			
		||||
/* Try to maximize the smr while using a number of bits inferior to
 | 
			
		||||
   the frame size. I tried to make the code simpler, faster and
 | 
			
		||||
   smaller than other encoders :-) */
 | 
			
		||||
static void compute_bit_allocation(MpegAudioContext *s,
 | 
			
		||||
                                   short smr1[MPA_MAX_CHANNELS][SBLIMIT],
 | 
			
		||||
                                   unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT],
 | 
			
		||||
                                   int *padding)
 | 
			
		||||
{
 | 
			
		||||
    int i, ch, b, max_smr, max_ch, max_sb, current_frame_size, max_frame_size;
 | 
			
		||||
    int incr;
 | 
			
		||||
    short smr[MPA_MAX_CHANNELS][SBLIMIT];
 | 
			
		||||
    unsigned char subband_status[MPA_MAX_CHANNELS][SBLIMIT];
 | 
			
		||||
    const unsigned char *alloc;
 | 
			
		||||
 | 
			
		||||
    memcpy(smr, smr1, s->nb_channels * sizeof(short) * SBLIMIT);
 | 
			
		||||
    memset(subband_status, SB_NOTALLOCATED, s->nb_channels * SBLIMIT);
 | 
			
		||||
    memset(bit_alloc, 0, s->nb_channels * SBLIMIT);
 | 
			
		||||
 | 
			
		||||
    /* compute frame size and padding */
 | 
			
		||||
    max_frame_size = s->frame_size;
 | 
			
		||||
    s->frame_frac += s->frame_frac_incr;
 | 
			
		||||
    if (s->frame_frac >= 65536) {
 | 
			
		||||
        s->frame_frac -= 65536;
 | 
			
		||||
        s->do_padding = 1;
 | 
			
		||||
        max_frame_size += 8;
 | 
			
		||||
    } else {
 | 
			
		||||
        s->do_padding = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* compute the header + bit alloc size */
 | 
			
		||||
    current_frame_size = 32;
 | 
			
		||||
    alloc = s->alloc_table;
 | 
			
		||||
    for(i=0;i<s->sblimit;i++) {
 | 
			
		||||
        incr = alloc[0];
 | 
			
		||||
        current_frame_size += incr * s->nb_channels;
 | 
			
		||||
        alloc += 1 << incr;
 | 
			
		||||
    }
 | 
			
		||||
    for(;;) {
 | 
			
		||||
        /* look for the subband with the largest signal to mask ratio */
 | 
			
		||||
        max_sb = -1;
 | 
			
		||||
        max_ch = -1;
 | 
			
		||||
        max_smr = INT_MIN;
 | 
			
		||||
        for(ch=0;ch<s->nb_channels;ch++) {
 | 
			
		||||
            for(i=0;i<s->sblimit;i++) {
 | 
			
		||||
                if (smr[ch][i] > max_smr && subband_status[ch][i] != SB_NOMORE) {
 | 
			
		||||
                    max_smr = smr[ch][i];
 | 
			
		||||
                    max_sb = i;
 | 
			
		||||
                    max_ch = ch;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (max_sb < 0)
 | 
			
		||||
            break;
 | 
			
		||||
        ff_dlog(NULL, "current=%d max=%d max_sb=%d max_ch=%d alloc=%d\n",
 | 
			
		||||
                current_frame_size, max_frame_size, max_sb, max_ch,
 | 
			
		||||
                bit_alloc[max_ch][max_sb]);
 | 
			
		||||
 | 
			
		||||
        /* find alloc table entry (XXX: not optimal, should use
 | 
			
		||||
           pointer table) */
 | 
			
		||||
        alloc = s->alloc_table;
 | 
			
		||||
        for(i=0;i<max_sb;i++) {
 | 
			
		||||
            alloc += 1 << alloc[0];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (subband_status[max_ch][max_sb] == SB_NOTALLOCATED) {
 | 
			
		||||
            /* nothing was coded for this band: add the necessary bits */
 | 
			
		||||
            incr = 2 + nb_scale_factors[s->scale_code[max_ch][max_sb]] * 6;
 | 
			
		||||
            incr += s->total_quant_bits[alloc[1]];
 | 
			
		||||
        } else {
 | 
			
		||||
            /* increments bit allocation */
 | 
			
		||||
            b = bit_alloc[max_ch][max_sb];
 | 
			
		||||
            incr = s->total_quant_bits[alloc[b + 1]] -
 | 
			
		||||
                s->total_quant_bits[alloc[b]];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (current_frame_size + incr <= max_frame_size) {
 | 
			
		||||
            /* can increase size */
 | 
			
		||||
            b = ++bit_alloc[max_ch][max_sb];
 | 
			
		||||
            current_frame_size += incr;
 | 
			
		||||
            /* decrease smr by the resolution we added */
 | 
			
		||||
            smr[max_ch][max_sb] = smr1[max_ch][max_sb] - quant_snr[alloc[b]];
 | 
			
		||||
            /* max allocation size reached ? */
 | 
			
		||||
            if (b == ((1 << alloc[0]) - 1))
 | 
			
		||||
                subband_status[max_ch][max_sb] = SB_NOMORE;
 | 
			
		||||
            else
 | 
			
		||||
                subband_status[max_ch][max_sb] = SB_ALLOCATED;
 | 
			
		||||
        } else {
 | 
			
		||||
            /* cannot increase the size of this subband */
 | 
			
		||||
            subband_status[max_ch][max_sb] = SB_NOMORE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    *padding = max_frame_size - current_frame_size;
 | 
			
		||||
    av_assert0(*padding >= 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Output the MPEG audio layer 2 frame. Note how the code is small
 | 
			
		||||
 * compared to other encoders :-)
 | 
			
		||||
 */
 | 
			
		||||
static void encode_frame(MpegAudioContext *s,
 | 
			
		||||
                         unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT],
 | 
			
		||||
                         int padding)
 | 
			
		||||
{
 | 
			
		||||
    int i, j, k, l, bit_alloc_bits, b, ch;
 | 
			
		||||
    unsigned char *sf;
 | 
			
		||||
    int q[3];
 | 
			
		||||
    PutBitContext *p = &s->pb;
 | 
			
		||||
 | 
			
		||||
    /* header */
 | 
			
		||||
 | 
			
		||||
    put_bits(p, 12, 0xfff);
 | 
			
		||||
    put_bits(p, 1, 1 - s->lsf); /* 1 = MPEG-1 ID, 0 = MPEG-2 lsf ID */
 | 
			
		||||
    put_bits(p, 2, 4-2);  /* layer 2 */
 | 
			
		||||
    put_bits(p, 1, 1); /* no error protection */
 | 
			
		||||
    put_bits(p, 4, s->bitrate_index);
 | 
			
		||||
    put_bits(p, 2, s->freq_index);
 | 
			
		||||
    put_bits(p, 1, s->do_padding); /* use padding */
 | 
			
		||||
    put_bits(p, 1, 0);             /* private_bit */
 | 
			
		||||
    put_bits(p, 2, s->nb_channels == 2 ? MPA_STEREO : MPA_MONO);
 | 
			
		||||
    put_bits(p, 2, 0); /* mode_ext */
 | 
			
		||||
    put_bits(p, 1, 0); /* no copyright */
 | 
			
		||||
    put_bits(p, 1, 1); /* original */
 | 
			
		||||
    put_bits(p, 2, 0); /* no emphasis */
 | 
			
		||||
 | 
			
		||||
    /* bit allocation */
 | 
			
		||||
    j = 0;
 | 
			
		||||
    for(i=0;i<s->sblimit;i++) {
 | 
			
		||||
        bit_alloc_bits = s->alloc_table[j];
 | 
			
		||||
        for(ch=0;ch<s->nb_channels;ch++) {
 | 
			
		||||
            put_bits(p, bit_alloc_bits, bit_alloc[ch][i]);
 | 
			
		||||
        }
 | 
			
		||||
        j += 1 << bit_alloc_bits;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* scale codes */
 | 
			
		||||
    for(i=0;i<s->sblimit;i++) {
 | 
			
		||||
        for(ch=0;ch<s->nb_channels;ch++) {
 | 
			
		||||
            if (bit_alloc[ch][i])
 | 
			
		||||
                put_bits(p, 2, s->scale_code[ch][i]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* scale factors */
 | 
			
		||||
    for(i=0;i<s->sblimit;i++) {
 | 
			
		||||
        for(ch=0;ch<s->nb_channels;ch++) {
 | 
			
		||||
            if (bit_alloc[ch][i]) {
 | 
			
		||||
                sf = &s->scale_factors[ch][i][0];
 | 
			
		||||
                switch(s->scale_code[ch][i]) {
 | 
			
		||||
                case 0:
 | 
			
		||||
                    put_bits(p, 6, sf[0]);
 | 
			
		||||
                    put_bits(p, 6, sf[1]);
 | 
			
		||||
                    put_bits(p, 6, sf[2]);
 | 
			
		||||
                    break;
 | 
			
		||||
                case 3:
 | 
			
		||||
                case 1:
 | 
			
		||||
                    put_bits(p, 6, sf[0]);
 | 
			
		||||
                    put_bits(p, 6, sf[2]);
 | 
			
		||||
                    break;
 | 
			
		||||
                case 2:
 | 
			
		||||
                    put_bits(p, 6, sf[0]);
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* quantization & write sub band samples */
 | 
			
		||||
 | 
			
		||||
    for(k=0;k<3;k++) {
 | 
			
		||||
        for(l=0;l<12;l+=3) {
 | 
			
		||||
            j = 0;
 | 
			
		||||
            for(i=0;i<s->sblimit;i++) {
 | 
			
		||||
                bit_alloc_bits = s->alloc_table[j];
 | 
			
		||||
                for(ch=0;ch<s->nb_channels;ch++) {
 | 
			
		||||
                    b = bit_alloc[ch][i];
 | 
			
		||||
                    if (b) {
 | 
			
		||||
                        int qindex, steps, m, sample, bits;
 | 
			
		||||
                        /* we encode 3 sub band samples of the same sub band at a time */
 | 
			
		||||
                        qindex = s->alloc_table[j+b];
 | 
			
		||||
                        steps = ff_mpa_quant_steps[qindex];
 | 
			
		||||
                        for(m=0;m<3;m++) {
 | 
			
		||||
                            sample = s->sb_samples[ch][k][l + m][i];
 | 
			
		||||
                            /* divide by scale factor */
 | 
			
		||||
#if USE_FLOATS
 | 
			
		||||
                            {
 | 
			
		||||
                                float a;
 | 
			
		||||
                                a = (float)sample * s->scale_factor_inv_table[s->scale_factors[ch][i][k]];
 | 
			
		||||
                                q[m] = (int)((a + 1.0) * steps * 0.5);
 | 
			
		||||
                            }
 | 
			
		||||
#else
 | 
			
		||||
                            {
 | 
			
		||||
                                int q1, e, shift, mult;
 | 
			
		||||
                                e = s->scale_factors[ch][i][k];
 | 
			
		||||
                                shift = s->scale_factor_shift[e];
 | 
			
		||||
                                mult = s->scale_factor_mult[e];
 | 
			
		||||
 | 
			
		||||
                                /* normalize to P bits */
 | 
			
		||||
                                if (shift < 0)
 | 
			
		||||
                                    q1 = sample << (-shift);
 | 
			
		||||
                                else
 | 
			
		||||
                                    q1 = sample >> shift;
 | 
			
		||||
                                q1 = (q1 * mult) >> P;
 | 
			
		||||
                                q1 += 1 << P;
 | 
			
		||||
                                if (q1 < 0)
 | 
			
		||||
                                    q1 = 0;
 | 
			
		||||
                                q[m] = (q1 * (unsigned)steps) >> (P + 1);
 | 
			
		||||
                            }
 | 
			
		||||
#endif
 | 
			
		||||
                            if (q[m] >= steps)
 | 
			
		||||
                                q[m] = steps - 1;
 | 
			
		||||
                            av_assert2(q[m] >= 0 && q[m] < steps);
 | 
			
		||||
                        }
 | 
			
		||||
                        bits = ff_mpa_quant_bits[qindex];
 | 
			
		||||
                        if (bits < 0) {
 | 
			
		||||
                            /* group the 3 values to save bits */
 | 
			
		||||
                            put_bits(p, -bits,
 | 
			
		||||
                                     q[0] + steps * (q[1] + steps * q[2]));
 | 
			
		||||
                        } else {
 | 
			
		||||
                            put_bits(p, bits, q[0]);
 | 
			
		||||
                            put_bits(p, bits, q[1]);
 | 
			
		||||
                            put_bits(p, bits, q[2]);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                /* next subband in alloc table */
 | 
			
		||||
                j += 1 << bit_alloc_bits;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* padding */
 | 
			
		||||
    for(i=0;i<padding;i++)
 | 
			
		||||
        put_bits(p, 1, 0);
 | 
			
		||||
 | 
			
		||||
    /* flush */
 | 
			
		||||
    flush_put_bits(p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int MPA_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
 | 
			
		||||
                            const AVFrame *frame, int *got_packet_ptr)
 | 
			
		||||
{
 | 
			
		||||
    MpegAudioContext *s = avctx->priv_data;
 | 
			
		||||
    const int16_t *samples = (const int16_t *)frame->data[0];
 | 
			
		||||
    short smr[MPA_MAX_CHANNELS][SBLIMIT];
 | 
			
		||||
    unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT];
 | 
			
		||||
    int padding, i, ret;
 | 
			
		||||
 | 
			
		||||
    for(i=0;i<s->nb_channels;i++) {
 | 
			
		||||
        filter(s, i, samples + i, s->nb_channels);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for(i=0;i<s->nb_channels;i++) {
 | 
			
		||||
        compute_scale_factors(s, s->scale_code[i], s->scale_factors[i],
 | 
			
		||||
                              s->sb_samples[i], s->sblimit);
 | 
			
		||||
    }
 | 
			
		||||
    for(i=0;i<s->nb_channels;i++) {
 | 
			
		||||
        psycho_acoustic_model(s, smr[i]);
 | 
			
		||||
    }
 | 
			
		||||
    compute_bit_allocation(s, smr, bit_alloc, &padding);
 | 
			
		||||
 | 
			
		||||
    if ((ret = ff_alloc_packet2(avctx, avpkt, MPA_MAX_CODED_FRAME_SIZE, 0)) < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
 | 
			
		||||
    init_put_bits(&s->pb, avpkt->data, avpkt->size);
 | 
			
		||||
 | 
			
		||||
    encode_frame(s, bit_alloc, padding);
 | 
			
		||||
 | 
			
		||||
    if (frame->pts != AV_NOPTS_VALUE)
 | 
			
		||||
        avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->initial_padding);
 | 
			
		||||
 | 
			
		||||
    avpkt->size = put_bits_count(&s->pb) / 8;
 | 
			
		||||
    *got_packet_ptr = 1;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const AVCodecDefault mp2_defaults[] = {
 | 
			
		||||
    { "b", "0" },
 | 
			
		||||
    { NULL },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										102
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiotab.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/mpegaudiotab.h
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,102 @@
 | 
			
		|||
/*
 | 
			
		||||
 * mpeg audio layer 2 tables. Most of them come from the mpeg audio
 | 
			
		||||
 * specification.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2000, 2001 Fabrice Bellard
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * mpeg audio layer 2 tables.
 | 
			
		||||
 * Most of them come from the mpeg audio specification.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef AVCODEC_MPEGAUDIOTAB_H
 | 
			
		||||
#define AVCODEC_MPEGAUDIOTAB_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include "mpegaudio.h"
 | 
			
		||||
 | 
			
		||||
static const int costab32[30] = {
 | 
			
		||||
    FIX(0.54119610014619701222),
 | 
			
		||||
    FIX(1.3065629648763763537),
 | 
			
		||||
 | 
			
		||||
    FIX(0.50979557910415917998),
 | 
			
		||||
    FIX(2.5629154477415054814),
 | 
			
		||||
    FIX(0.89997622313641556513),
 | 
			
		||||
    FIX(0.60134488693504528634),
 | 
			
		||||
 | 
			
		||||
    FIX(0.5024192861881556782),
 | 
			
		||||
    FIX(5.1011486186891552563),
 | 
			
		||||
    FIX(0.78815462345125020249),
 | 
			
		||||
    FIX(0.64682178335999007679),
 | 
			
		||||
    FIX(0.56694403481635768927),
 | 
			
		||||
    FIX(1.0606776859903470633),
 | 
			
		||||
    FIX(1.7224470982383341955),
 | 
			
		||||
    FIX(0.52249861493968885462),
 | 
			
		||||
 | 
			
		||||
    FIX(10.19000812354803287),
 | 
			
		||||
    FIX(0.674808341455005678),
 | 
			
		||||
    FIX(1.1694399334328846596),
 | 
			
		||||
    FIX(0.53104259108978413284),
 | 
			
		||||
    FIX(2.0577810099534108446),
 | 
			
		||||
    FIX(0.58293496820613388554),
 | 
			
		||||
    FIX(0.83934964541552681272),
 | 
			
		||||
    FIX(0.50547095989754364798),
 | 
			
		||||
    FIX(3.4076084184687189804),
 | 
			
		||||
    FIX(0.62250412303566482475),
 | 
			
		||||
    FIX(0.97256823786196078263),
 | 
			
		||||
    FIX(0.51544730992262455249),
 | 
			
		||||
    FIX(1.4841646163141661852),
 | 
			
		||||
    FIX(0.5531038960344445421),
 | 
			
		||||
    FIX(0.74453627100229857749),
 | 
			
		||||
    FIX(0.5006029982351962726),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const int bitinv32[32] = {
 | 
			
		||||
    0,  16,  8, 24,  4,  20,  12,  28,
 | 
			
		||||
    2,  18, 10, 26,  6,  22,  14,  30,
 | 
			
		||||
    1,  17,  9, 25,  5,  21,  13,  29,
 | 
			
		||||
    3,  19, 11, 27,  7,  23,  15,  31
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* signal to noise ratio of each quantification step (could be
 | 
			
		||||
   computed from quant_steps[]). The values are dB multiplied by 10
 | 
			
		||||
*/
 | 
			
		||||
static const unsigned short quant_snr[17] = {
 | 
			
		||||
     70, 110, 160, 208,
 | 
			
		||||
    253, 316, 378, 439,
 | 
			
		||||
    499, 559, 620, 680,
 | 
			
		||||
    740, 800, 861, 920,
 | 
			
		||||
    980
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* fixed psycho acoustic model. Values of SNR taken from the 'toolame'
 | 
			
		||||
   project */
 | 
			
		||||
static const float fixed_smr[SBLIMIT] =  {
 | 
			
		||||
    30, 17, 16, 10, 3, 12, 8, 2.5,
 | 
			
		||||
    5, 5, 6, 6, 5, 6, 10, 6,
 | 
			
		||||
    -4, -10, -21, -30, -42, -55, -68, -75,
 | 
			
		||||
    -75, -75, -75, -75, -91, -107, -110, -108
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const unsigned char nb_scale_factors[4] = { 3, 2, 1, 2 };
 | 
			
		||||
 | 
			
		||||
#endif /* AVCODEC_MPEGAUDIOTAB_H */
 | 
			
		||||
							
								
								
									
										117
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/rdft.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								trunk/3rdparty/ffmpeg-4-fit/libavcodec/rdft.c
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,117 @@
 | 
			
		|||
/*
 | 
			
		||||
 * (I)RDFT transforms
 | 
			
		||||
 * Copyright (c) 2009 Alex Converse <alex dot converse at gmail dot com>
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
#include "libavutil/mathematics.h"
 | 
			
		||||
#include "rdft.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * (Inverse) Real Discrete Fourier Transforms.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** Map one real FFT into two parallel real even and odd FFTs. Then interleave
 | 
			
		||||
 * the two real FFTs into one complex FFT. Unmangle the results.
 | 
			
		||||
 * ref: http://www.engineeringproductivitytools.com/stuff/T0001/PT10.HTM
 | 
			
		||||
 */
 | 
			
		||||
static void rdft_calc_c(RDFTContext *s, FFTSample *data)
 | 
			
		||||
{
 | 
			
		||||
    int i, i1, i2;
 | 
			
		||||
    FFTComplex ev, od, odsum;
 | 
			
		||||
    const int n = 1 << s->nbits;
 | 
			
		||||
    const float k1 = 0.5;
 | 
			
		||||
    const float k2 = 0.5 - s->inverse;
 | 
			
		||||
    const FFTSample *tcos = s->tcos;
 | 
			
		||||
    const FFTSample *tsin = s->tsin;
 | 
			
		||||
 | 
			
		||||
    if (!s->inverse) {
 | 
			
		||||
        s->fft.fft_permute(&s->fft, (FFTComplex*)data);
 | 
			
		||||
        s->fft.fft_calc(&s->fft, (FFTComplex*)data);
 | 
			
		||||
    }
 | 
			
		||||
    /* i=0 is a special case because of packing, the DC term is real, so we
 | 
			
		||||
       are going to throw the N/2 term (also real) in with it. */
 | 
			
		||||
    ev.re = data[0];
 | 
			
		||||
    data[0] = ev.re+data[1];
 | 
			
		||||
    data[1] = ev.re-data[1];
 | 
			
		||||
 | 
			
		||||
#define RDFT_UNMANGLE(sign0, sign1)                                         \
 | 
			
		||||
    for (i = 1; i < (n>>2); i++) {                                          \
 | 
			
		||||
        i1 = 2*i;                                                           \
 | 
			
		||||
        i2 = n-i1;                                                          \
 | 
			
		||||
        /* Separate even and odd FFTs */                                    \
 | 
			
		||||
        ev.re =  k1*(data[i1  ]+data[i2  ]);                                \
 | 
			
		||||
        od.im =  k2*(data[i2  ]-data[i1  ]);                                \
 | 
			
		||||
        ev.im =  k1*(data[i1+1]-data[i2+1]);                                \
 | 
			
		||||
        od.re =  k2*(data[i1+1]+data[i2+1]);                                \
 | 
			
		||||
        /* Apply twiddle factors to the odd FFT and add to the even FFT */  \
 | 
			
		||||
        odsum.re = od.re*tcos[i] sign0 od.im*tsin[i];                       \
 | 
			
		||||
        odsum.im = od.im*tcos[i] sign1 od.re*tsin[i];                       \
 | 
			
		||||
        data[i1  ] =  ev.re + odsum.re;                                     \
 | 
			
		||||
        data[i1+1] =  ev.im + odsum.im;                                     \
 | 
			
		||||
        data[i2  ] =  ev.re - odsum.re;                                     \
 | 
			
		||||
        data[i2+1] =  odsum.im - ev.im;                                     \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (s->negative_sin) {
 | 
			
		||||
        RDFT_UNMANGLE(+,-)
 | 
			
		||||
    } else {
 | 
			
		||||
        RDFT_UNMANGLE(-,+)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    data[2*i+1]=s->sign_convention*data[2*i+1];
 | 
			
		||||
    if (s->inverse) {
 | 
			
		||||
        data[0] *= k1;
 | 
			
		||||
        data[1] *= k1;
 | 
			
		||||
        s->fft.fft_permute(&s->fft, (FFTComplex*)data);
 | 
			
		||||
        s->fft.fft_calc(&s->fft, (FFTComplex*)data);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
av_cold int ff_rdft_init(RDFTContext *s, int nbits, enum RDFTransformType trans)
 | 
			
		||||
{
 | 
			
		||||
    int n = 1 << nbits;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    s->nbits           = nbits;
 | 
			
		||||
    s->inverse         = trans == IDFT_C2R || trans == DFT_C2R;
 | 
			
		||||
    s->sign_convention = trans == IDFT_R2C || trans == DFT_C2R ? 1 : -1;
 | 
			
		||||
    s->negative_sin    = trans == DFT_C2R || trans == DFT_R2C;
 | 
			
		||||
 | 
			
		||||
    if (nbits < 4 || nbits > 16)
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
 | 
			
		||||
    if ((ret = ff_fft_init(&s->fft, nbits-1, trans == IDFT_C2R || trans == IDFT_R2C)) < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
 | 
			
		||||
    ff_init_ff_cos_tabs(nbits);
 | 
			
		||||
    s->tcos = ff_cos_tabs[nbits];
 | 
			
		||||
    s->tsin = ff_cos_tabs[nbits] + (n >> 2);
 | 
			
		||||
    s->rdft_calc   = rdft_calc_c;
 | 
			
		||||
 | 
			
		||||
    if (ARCH_ARM) ff_rdft_init_arm(s);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
av_cold void ff_rdft_end(RDFTContext *s)
 | 
			
		||||
{
 | 
			
		||||
    ff_fft_end(&s->fft);
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue