mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-11-02 20:42:29 +01:00
The ffmpeg submodule held prebuilt libraries for every platform next to the sources (about 1.5 GB checked out), and nothing uses those any more. Only the needed sources are copied in, from the submodule's commit, along with every header and template they include. The path is new, so checking out commits on either side of this works. It's also cut down to what PPSSPP uses: the H.264, AAC, MP3, ATRAC3 and ATRAC3+ decoders, the H.264 parser, the demuxers as before, and the FFV1 encoder, AVI muxer and file protocol for AVI dumping. config.h takes its CONFIG_ values from FFmpeg 3.0.2's own configure run with just those enabled. The raw H.264 demuxer stays even though nothing opens raw H.264: probing PSMF data uses it to identify the video stream's codec, which otherwise comes out as none. On top of that: - The files nothing links (configure would build them, but they're never pulled out of the static library, going by the GCC link map) are left out: mostly libavutil's crypto and hashing and the alternative DCT/IDCT/FFT versions. - libswresample isn't built, now that nothing uses it. - The H.264 decoder only does 8-bit video, which is all the PSP has. The SPS parser rejects any other bit depth, and the DSP files no longer build their 9- to 16-bit variants, which the linker kept because the init functions pick one by bit depth at run time. That's 160 files to compile instead of 277, and 391 of FFmpeg's vendored, about 5.8 MB. The README in ext/ffmpeg has what was done, the PPSSPP patches in the copy, how to add a component, and the tradeoffs. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
181 lines
4.6 KiB
C
181 lines
4.6 KiB
C
/*
|
|
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
|
|
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
|
|
*
|
|
* 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_FFT_H
|
|
#define AVCODEC_FFT_H
|
|
|
|
#ifndef FFT_FLOAT
|
|
#define FFT_FLOAT 1
|
|
#endif
|
|
|
|
#ifndef FFT_FIXED_32
|
|
#define FFT_FIXED_32 0
|
|
#endif
|
|
|
|
#include <stdint.h>
|
|
#include "config.h"
|
|
#include "libavutil/mem.h"
|
|
|
|
#if FFT_FLOAT
|
|
|
|
#include "avfft.h"
|
|
|
|
#define FFT_NAME(x) x
|
|
|
|
typedef float FFTDouble;
|
|
|
|
#else
|
|
|
|
#if FFT_FIXED_32
|
|
|
|
#define Q31(x) (int)((x)*2147483648.0 + 0.5)
|
|
#define FFT_NAME(x) x ## _fixed_32
|
|
|
|
typedef int32_t FFTSample;
|
|
|
|
#else /* FFT_FIXED_32 */
|
|
|
|
#define FFT_NAME(x) x ## _fixed
|
|
|
|
typedef int16_t FFTSample;
|
|
|
|
#endif /* FFT_FIXED_32 */
|
|
|
|
typedef struct FFTComplex {
|
|
FFTSample re, im;
|
|
} FFTComplex;
|
|
|
|
typedef int FFTDouble;
|
|
typedef struct FFTContext FFTContext;
|
|
|
|
#endif /* FFT_FLOAT */
|
|
|
|
typedef struct FFTDComplex {
|
|
FFTDouble re, im;
|
|
} FFTDComplex;
|
|
|
|
/* FFT computation */
|
|
|
|
enum fft_permutation_type {
|
|
FF_FFT_PERM_DEFAULT,
|
|
FF_FFT_PERM_SWAP_LSBS,
|
|
FF_FFT_PERM_AVX,
|
|
};
|
|
|
|
enum mdct_permutation_type {
|
|
FF_MDCT_PERM_NONE,
|
|
FF_MDCT_PERM_INTERLEAVE,
|
|
};
|
|
|
|
struct FFTContext {
|
|
int nbits;
|
|
int inverse;
|
|
uint16_t *revtab;
|
|
FFTComplex *tmp_buf;
|
|
int mdct_size; /* size of MDCT (i.e. number of input data * 2) */
|
|
int mdct_bits; /* n = 2^nbits */
|
|
/* pre/post rotation tables */
|
|
FFTSample *tcos;
|
|
FFTSample *tsin;
|
|
/**
|
|
* Do the permutation needed BEFORE calling fft_calc().
|
|
*/
|
|
void (*fft_permute)(struct FFTContext *s, FFTComplex *z);
|
|
/**
|
|
* Do a complex FFT with the parameters defined in ff_fft_init(). The
|
|
* input data must be permuted before. No 1.0/sqrt(n) normalization is done.
|
|
*/
|
|
void (*fft_calc)(struct FFTContext *s, FFTComplex *z);
|
|
void (*imdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input);
|
|
void (*imdct_half)(struct FFTContext *s, FFTSample *output, const FFTSample *input);
|
|
void (*mdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input);
|
|
void (*mdct_calcw)(struct FFTContext *s, FFTDouble *output, const FFTSample *input);
|
|
enum fft_permutation_type fft_permutation;
|
|
enum mdct_permutation_type mdct_permutation;
|
|
};
|
|
|
|
#if CONFIG_HARDCODED_TABLES
|
|
#define COSTABLE_CONST const
|
|
#else
|
|
|
|
// PPSSPP HACK
|
|
#ifdef ANDROID
|
|
#define COSTABLE_CONST __attribute__((visibility("hidden")))
|
|
#else
|
|
#define COSTABLE_CONST
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#define COSTABLE(size) \
|
|
COSTABLE_CONST DECLARE_ALIGNED(32, FFTSample, FFT_NAME(ff_cos_##size))[size/2]
|
|
|
|
extern COSTABLE(16);
|
|
extern COSTABLE(32);
|
|
extern COSTABLE(64);
|
|
extern COSTABLE(128);
|
|
extern COSTABLE(256);
|
|
extern COSTABLE(512);
|
|
extern COSTABLE(1024);
|
|
extern COSTABLE(2048);
|
|
extern COSTABLE(4096);
|
|
extern COSTABLE(8192);
|
|
extern COSTABLE(16384);
|
|
extern COSTABLE(32768);
|
|
extern COSTABLE(65536);
|
|
extern COSTABLE_CONST FFTSample* const FFT_NAME(ff_cos_tabs)[17];
|
|
|
|
#define ff_init_ff_cos_tabs FFT_NAME(ff_init_ff_cos_tabs)
|
|
|
|
/**
|
|
* Initialize the cosine table in ff_cos_tabs[index]
|
|
* @param index index in ff_cos_tabs array of the table to initialize
|
|
*/
|
|
void ff_init_ff_cos_tabs(int index);
|
|
|
|
#define ff_fft_init FFT_NAME(ff_fft_init)
|
|
#define ff_fft_end FFT_NAME(ff_fft_end)
|
|
|
|
/**
|
|
* Set up a complex FFT.
|
|
* @param nbits log2 of the length of the input array
|
|
* @param inverse if 0 perform the forward transform, if 1 perform the inverse
|
|
*/
|
|
int ff_fft_init(FFTContext *s, int nbits, int inverse);
|
|
|
|
void ff_fft_init_aarch64(FFTContext *s);
|
|
void ff_fft_init_x86(FFTContext *s);
|
|
void ff_fft_init_arm(FFTContext *s);
|
|
void ff_fft_init_mips(FFTContext *s);
|
|
void ff_fft_init_ppc(FFTContext *s);
|
|
|
|
void ff_fft_fixed_init_arm(FFTContext *s);
|
|
|
|
void ff_fft_end(FFTContext *s);
|
|
|
|
#define ff_mdct_init FFT_NAME(ff_mdct_init)
|
|
#define ff_mdct_end FFT_NAME(ff_mdct_end)
|
|
|
|
int ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale);
|
|
void ff_mdct_end(FFTContext *s);
|
|
|
|
#endif /* AVCODEC_FFT_H */
|