1/* 2 * Float MPEG Audio decoder 3 * Copyright (c) 2010 Michael Niedermayer 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22#include "config.h" 23#include "libavutil/samplefmt.h" 24 25#define USE_FLOATS 1 26 27#include "mpegaudio.h" 28 29#define SHR(a,b) ((a)*(1.0f/(1<<(b)))) 30#define FIXR_OLD(a) ((int)((a) * FRAC_ONE + 0.5)) 31#define FIXR(x) ((float)(x)) 32#define FIXHR(x) ((float)(x)) 33#define MULH3(x, y, s) ((s)*(y)*(x)) 34#define MULLx(x, y, s) ((y)*(x)) 35#define RENAME(a) a ## _float 36#define OUT_FMT AV_SAMPLE_FMT_FLT 37#define OUT_FMT_P AV_SAMPLE_FMT_FLTP 38 39#include "mpegaudiodec_template.c" 40 41#if CONFIG_MP1FLOAT_DECODER 42AVCodec ff_mp1float_decoder = { 43 .name = "mp1float", 44 .long_name = NULL_IF_CONFIG_SMALL("MP1 (MPEG audio layer 1)"), 45 .type = AVMEDIA_TYPE_AUDIO, 46 .id = AV_CODEC_ID_MP1, 47 .priv_data_size = sizeof(MPADecodeContext), 48 .init = decode_init, 49 .decode = decode_frame, 50 .capabilities = CODEC_CAP_DR1, 51 .flush = flush, 52 .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, 53 AV_SAMPLE_FMT_FLT, 54 AV_SAMPLE_FMT_NONE }, 55}; 56#endif 57#if CONFIG_MP2FLOAT_DECODER 58AVCodec ff_mp2float_decoder = { 59 .name = "mp2float", 60 .long_name = NULL_IF_CONFIG_SMALL("MP2 (MPEG audio layer 2)"), 61 .type = AVMEDIA_TYPE_AUDIO, 62 .id = AV_CODEC_ID_MP2, 63 .priv_data_size = sizeof(MPADecodeContext), 64 .init = decode_init, 65 .decode = decode_frame, 66 .capabilities = CODEC_CAP_DR1, 67 .flush = flush, 68 .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, 69 AV_SAMPLE_FMT_FLT, 70 AV_SAMPLE_FMT_NONE }, 71}; 72#endif 73#if CONFIG_MP3FLOAT_DECODER 74AVCodec ff_mp3float_decoder = { 75 .name = "mp3float", 76 .long_name = NULL_IF_CONFIG_SMALL("MP3 (MPEG audio layer 3)"), 77 .type = AVMEDIA_TYPE_AUDIO, 78 .id = AV_CODEC_ID_MP3, 79 .priv_data_size = sizeof(MPADecodeContext), 80 .init = decode_init, 81 .decode = decode_frame, 82 .capabilities = CODEC_CAP_DR1, 83 .flush = flush, 84 .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, 85 AV_SAMPLE_FMT_FLT, 86 AV_SAMPLE_FMT_NONE }, 87}; 88#endif 89#if CONFIG_MP3ADUFLOAT_DECODER 90AVCodec ff_mp3adufloat_decoder = { 91 .name = "mp3adufloat", 92 .long_name = NULL_IF_CONFIG_SMALL("ADU (Application Data Unit) MP3 (MPEG audio layer 3)"), 93 .type = AVMEDIA_TYPE_AUDIO, 94 .id = AV_CODEC_ID_MP3ADU, 95 .priv_data_size = sizeof(MPADecodeContext), 96 .init = decode_init, 97 .decode = decode_frame_adu, 98 .capabilities = CODEC_CAP_DR1, 99 .flush = flush, 100 .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, 101 AV_SAMPLE_FMT_FLT, 102 AV_SAMPLE_FMT_NONE }, 103}; 104#endif 105#if CONFIG_MP3ON4FLOAT_DECODER 106AVCodec ff_mp3on4float_decoder = { 107 .name = "mp3on4float", 108 .long_name = NULL_IF_CONFIG_SMALL("MP3onMP4"), 109 .type = AVMEDIA_TYPE_AUDIO, 110 .id = AV_CODEC_ID_MP3ON4, 111 .priv_data_size = sizeof(MP3On4DecodeContext), 112 .init = decode_init_mp3on4, 113 .close = decode_close_mp3on4, 114 .decode = decode_frame_mp3on4, 115 .capabilities = CODEC_CAP_DR1, 116 .flush = flush_mp3on4, 117 .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, 118 AV_SAMPLE_FMT_NONE }, 119}; 120#endif 121