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 42 AVCodec 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 .close = decode_close, 50 .decode = decode_frame, 51 .capabilities = AV_CODEC_CAP_DR1, 52 .flush = flush, 53 .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, 54 AV_SAMPLE_FMT_FLT, 55 AV_SAMPLE_FMT_NONE }, 56 }; 57 #endif 58 #if CONFIG_MP2FLOAT_DECODER 59 AVCodec ff_mp2float_decoder = { 60 .name = "mp2float", 61 .long_name = NULL_IF_CONFIG_SMALL("MP2 (MPEG audio layer 2)"), 62 .type = AVMEDIA_TYPE_AUDIO, 63 .id = AV_CODEC_ID_MP2, 64 .priv_data_size = sizeof(MPADecodeContext), 65 .init = decode_init, 66 .decode = decode_frame, 67 .close = decode_close, 68 .capabilities = AV_CODEC_CAP_DR1, 69 .flush = flush, 70 .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, 71 AV_SAMPLE_FMT_FLT, 72 AV_SAMPLE_FMT_NONE }, 73 }; 74 #endif 75 #if CONFIG_MP3FLOAT_DECODER 76 AVCodec ff_mp3float_decoder = { 77 .name = "mp3float", 78 .long_name = NULL_IF_CONFIG_SMALL("MP3 (MPEG audio layer 3)"), 79 .type = AVMEDIA_TYPE_AUDIO, 80 .id = AV_CODEC_ID_MP3, 81 .priv_data_size = sizeof(MPADecodeContext), 82 .init = decode_init, 83 .close = decode_close, 84 .decode = decode_frame, 85 .capabilities = AV_CODEC_CAP_DR1, 86 .flush = flush, 87 .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, 88 AV_SAMPLE_FMT_FLT, 89 AV_SAMPLE_FMT_NONE }, 90 }; 91 #endif 92 #if CONFIG_MP3ADUFLOAT_DECODER 93 AVCodec ff_mp3adufloat_decoder = { 94 .name = "mp3adufloat", 95 .long_name = NULL_IF_CONFIG_SMALL("ADU (Application Data Unit) MP3 (MPEG audio layer 3)"), 96 .type = AVMEDIA_TYPE_AUDIO, 97 .id = AV_CODEC_ID_MP3ADU, 98 .priv_data_size = sizeof(MPADecodeContext), 99 .init = decode_init, 100 .close = decode_close, 101 .decode = decode_frame_adu, 102 .capabilities = AV_CODEC_CAP_DR1, 103 .flush = flush, 104 .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, 105 AV_SAMPLE_FMT_FLT, 106 AV_SAMPLE_FMT_NONE }, 107 }; 108 #endif 109 #if CONFIG_MP3ON4FLOAT_DECODER 110 AVCodec ff_mp3on4float_decoder = { 111 .name = "mp3on4float", 112 .long_name = NULL_IF_CONFIG_SMALL("MP3onMP4"), 113 .type = AVMEDIA_TYPE_AUDIO, 114 .id = AV_CODEC_ID_MP3ON4, 115 .priv_data_size = sizeof(MP3On4DecodeContext), 116 .init = decode_init_mp3on4, 117 .close = decode_close_mp3on4, 118 .decode = decode_frame_mp3on4, 119 .capabilities = AV_CODEC_CAP_DR1, 120 .flush = flush_mp3on4, 121 .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, 122 AV_SAMPLE_FMT_NONE }, 123 }; 124 #endif 125