You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	Remove support for nonfree libamr library for AMR-NB/WB decoding/encoding.
libopencore can now be used as a replacement except for AMR-WB encoding. Originally committed as revision 19365 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		
							
								
								
									
										6
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								LICENSE
									
									
									
									
									
								
							| @@ -44,6 +44,6 @@ is incompatible with the LGPL v2.1 and the GPL v2, but not with version 3 of | ||||
| those licenses. So to combine the OpenCORE libraries with FFmpeg, the license | ||||
| version needs to be upgraded by passing --enable-version3 to configure. | ||||
|  | ||||
| The nonfree external libraries libamrnb, libamrwb and libfaac can be hooked up | ||||
| in FFmpeg. You need to pass --enable-nonfree to configure to enable them. Employ | ||||
| this option with care as FFmpeg then becomes nonfree and unredistributable. | ||||
| The nonfree external library libfaac can be hooked up in FFmpeg. You need to | ||||
| pass --enable-nonfree to configure to enable it. Employ this option with care | ||||
| as FFmpeg then becomes nonfree and unredistributable. | ||||
|   | ||||
							
								
								
									
										14
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								configure
									
									
									
									
										vendored
									
									
								
							| @@ -154,8 +154,6 @@ show_help(){ | ||||
|   echo "External library support:" | ||||
|   echo "  --enable-avisynth        enable reading of AVISynth script files [no]" | ||||
|   echo "  --enable-bzlib           enable bzlib [autodetect]" | ||||
|   echo "  --enable-libamr-nb       enable libamr-nb floating point audio codec [no]" | ||||
|   echo "  --enable-libamr-wb       enable libamr-wb floating point audio codec [no]" | ||||
|   echo "  --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]" | ||||
|   echo "  --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]" | ||||
|   echo "  --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394" | ||||
| @@ -794,8 +792,6 @@ CONFIG_LIST=" | ||||
|     gray | ||||
|     hardcoded_tables | ||||
|     ipv6 | ||||
|     libamr_nb | ||||
|     libamr_wb | ||||
|     libdc1394 | ||||
|     libdirac | ||||
|     libfaac | ||||
| @@ -1115,10 +1111,6 @@ zmbv_encoder_select="zlib" | ||||
| h264_parser_select="golomb" | ||||
|  | ||||
| # external libraries | ||||
| libamr_nb_decoder_deps="libamr_nb" | ||||
| libamr_nb_encoder_deps="libamr_nb" | ||||
| libamr_wb_decoder_deps="libamr_wb" | ||||
| libamr_wb_encoder_deps="libamr_wb" | ||||
| libdirac_decoder_deps="libdirac !libschroedinger" | ||||
| libdirac_encoder_deps="libdirac" | ||||
| libfaac_encoder_deps="libfaac" | ||||
| @@ -1792,8 +1784,6 @@ die_license_disabled gpl libxvid | ||||
| die_license_disabled gpl postproc | ||||
| die_license_disabled gpl x11grab | ||||
|  | ||||
| die_license_disabled nonfree libamr_nb | ||||
| die_license_disabled nonfree libamr_wb | ||||
| die_license_disabled nonfree libfaac | ||||
|  | ||||
| die_license_disabled version3 libopencore_amrnb | ||||
| @@ -2097,8 +2087,6 @@ done | ||||
|  | ||||
| # these are off by default, so fail if requested and not available | ||||
| enabled avisynth   && require2 vfw32 "windows.h vfw.h" AVIFileInit -lvfw32 | ||||
| enabled libamr_nb  && require  libamrnb amrnb/interf_dec.h Decoder_Interface_init -lamrnb -lm | ||||
| enabled libamr_wb  && require  libamrwb amrwb/dec_if.h D_IF_init -lamrwb -lm | ||||
| enabled libdirac   && add_cflags $(pkg-config --cflags dirac) && | ||||
|                       require  libdirac libdirac_decoder/dirac_parser.h dirac_decoder_init -ldirac_decoder && | ||||
|                       require  libdirac libdirac_encoder/dirac_encoder.h dirac_encoder_init -ldirac_encoder | ||||
| @@ -2409,8 +2397,6 @@ if enabled sdl_too_old; then | ||||
| fi | ||||
| echo "Sun medialib support      ${mlib-no}" | ||||
| echo "AVISynth enabled          ${avisynth-no}" | ||||
| echo "libamr-nb support         ${libamr_nb-no}" | ||||
| echo "libamr-wb support         ${libamr_wb-no}" | ||||
| echo "libdc1394 support         ${libdc1394-no}" | ||||
| echo "libdirac enabled          ${libdirac-no}" | ||||
| echo "libfaac enabled           ${libfaac-no}" | ||||
|   | ||||
| @@ -17,9 +17,7 @@ explicitly requested by passing the appropriate flags to @file{./configure}. | ||||
| @section AMR | ||||
|  | ||||
| AMR comes in two different flavors, wideband and narrowband. FFmpeg can make | ||||
| use of the AMR wideband (floating-point mode) and the AMR narrowband | ||||
| (floating-point mode) reference decoders and encoders (libamr) as well as | ||||
| the OpenCORE libraries for AMR-NB decoding/encoding and AMR-WB decoding. | ||||
| use of the OpenCORE libraries for AMR-NB decoding/encoding and AMR-WB decoding. | ||||
|  | ||||
| @subsection OpenCORE | ||||
|  | ||||
| @@ -33,17 +31,6 @@ incompatible with the LGPL version 2.1 and GPL version 2. You have to | ||||
| upgrade FFmpeg's license to LGPL version 3 (or if you have enabled | ||||
| GPL components, GPL version 3) to use it. | ||||
|  | ||||
| @subsection libamr | ||||
|  | ||||
| Go to @url{http://www.penguin.cz/~utx/amr} and follow the instructions for | ||||
| installing the libraries. Then pass @code{--enable-libamr-nb} and/or | ||||
| @code{--enable-libamr-wb} to configure to enable the libraries. | ||||
|  | ||||
| Note that libamr is copyrighted without any sort of license grant. This means | ||||
| that you can use it if you legally obtained it but you are not allowed to | ||||
| redistribute it in any way. @strong{Any FFmpeg binaries with libamr support | ||||
| you create are non-free and unredistributable!} | ||||
|  | ||||
|  | ||||
| @chapter Supported File Formats and Codecs | ||||
|  | ||||
| @@ -537,10 +524,9 @@ following image formats are supported: | ||||
|     @tab Used in Westwood Studios games like Command and Conquer. | ||||
| @item ADPCM Yamaha           @tab  X  @tab  X | ||||
| @item AMR-NB                 @tab  E  @tab  E | ||||
|     @tab supported through external libraries libamrnb and libopencore-amrnb | ||||
| @item AMR-WB                 @tab  E  @tab  E | ||||
|     @tab decoding supported through external libraries libamrwb and libopencore-amrwb, | ||||
|          encoding supported through external library libamrwb | ||||
|     @tab supported through external library libopencore-amrnb | ||||
| @item AMR-WB                 @tab     @tab  E | ||||
|     @tab decoding supported through external library libopencore-amrwb | ||||
| @item Apple lossless audio   @tab  X  @tab  X | ||||
|     @tab QuickTime fourcc 'alac' | ||||
| @item Atrac 3                @tab     @tab  X | ||||
|   | ||||
| @@ -382,8 +382,6 @@ OBJS-$(CONFIG_OGG_MUXER)               += xiph.o flacdec.o flacdata.o flac.o | ||||
| OBJS-$(CONFIG_RTP_MUXER)               += mpegvideo.o | ||||
|  | ||||
| # external codec libraries | ||||
| OBJS-$(CONFIG_LIBAMR_NB)               += libamr.o | ||||
| OBJS-$(CONFIG_LIBAMR_WB)               += libamr.o | ||||
| OBJS-$(CONFIG_LIBDIRAC_DECODER)        += libdiracdec.o | ||||
| OBJS-$(CONFIG_LIBDIRAC_ENCODER)        += libdiracenc.o libdirac_libschro.o | ||||
| OBJS-$(CONFIG_LIBFAAC)                 += libfaac.o | ||||
|   | ||||
| @@ -303,8 +303,6 @@ void avcodec_register_all(void) | ||||
|     REGISTER_ENCDEC  (XSUB, xsub); | ||||
|  | ||||
|     /* external libraries */ | ||||
|     REGISTER_ENCDEC  (LIBAMR_NB, libamr_nb); | ||||
|     REGISTER_ENCDEC  (LIBAMR_WB, libamr_wb); | ||||
|     REGISTER_ENCDEC  (LIBDIRAC, libdirac); | ||||
|     REGISTER_ENCODER (LIBFAAC, libfaac); | ||||
|     REGISTER_DECODER (LIBFAAD, libfaad); | ||||
|   | ||||
| @@ -1,448 +0,0 @@ | ||||
| /* | ||||
|  * AMR Audio decoder stub | ||||
|  * Copyright (c) 2003 the ffmpeg project | ||||
|  * | ||||
|  * 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 | ||||
|  * Adaptive Multi-Rate (AMR) Audio decoder stub. | ||||
|  * | ||||
|  * This code implements both an AMR-NarrowBand (AMR-NB) and an AMR-WideBand | ||||
|  * (AMR-WB) audio encoder/decoder through external reference code from | ||||
|  * http://www.3gpp.org/. The license of the code from 3gpp is unclear so you | ||||
|  * have to download the code separately. | ||||
|  * | ||||
|  * \section AMR-NB | ||||
|  * | ||||
|  * The float version (default) can be downloaded from: | ||||
|  * http://www.3gpp.org/ftp/Specs/archive/26_series/26.104/26104-610.zip | ||||
|  * | ||||
|  * \subsection Specification | ||||
|  * The specification for AMR-NB can be found in TS 26.071 | ||||
|  * (http://www.3gpp.org/ftp/Specs/html-info/26071.htm) and some other | ||||
|  * info at http://www.3gpp.org/ftp/Specs/html-info/26-series.htm. | ||||
|  * | ||||
|  * \section AMR-WB | ||||
|  * | ||||
|  * The reference code can be downloaded from: | ||||
|  * http://www.3gpp.org/ftp/Specs/archive/26_series/26.204/26204-600.zip | ||||
|  * | ||||
|  * \subsection Specification | ||||
|  * The specification for AMR-WB can be found in TS 26.171 | ||||
|  * (http://www.3gpp.org/ftp/Specs/html-info/26171.htm) and some other | ||||
|  * info at http://www.3gpp.org/ftp/Specs/html-info/26-series.htm. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include "avcodec.h" | ||||
|  | ||||
| static void amr_decode_fix_avctx(AVCodecContext *avctx) | ||||
| { | ||||
|     const int is_amr_wb = 1 + (avctx->codec_id == CODEC_ID_AMR_WB); | ||||
|  | ||||
|     if (!avctx->sample_rate) | ||||
|         avctx->sample_rate = 8000 * is_amr_wb; | ||||
|  | ||||
|     if (!avctx->channels) | ||||
|         avctx->channels = 1; | ||||
|  | ||||
|     avctx->frame_size = 160 * is_amr_wb; | ||||
|     avctx->sample_fmt = SAMPLE_FMT_S16; | ||||
| } | ||||
|  | ||||
| #if CONFIG_LIBAMR_NB | ||||
|  | ||||
| #include <amrnb/interf_dec.h> | ||||
| #include <amrnb/interf_enc.h> | ||||
|  | ||||
| static const char nb_bitrate_unsupported[] = | ||||
|     "bitrate not supported: use one of 4.75k, 5.15k, 5.9k, 6.7k, 7.4k, 7.95k, 10.2k or 12.2k\n"; | ||||
|  | ||||
| typedef struct AMR_bitrates { | ||||
|     int       rate; | ||||
|     enum Mode mode; | ||||
| } AMR_bitrates; | ||||
|  | ||||
| /* Match desired bitrate */ | ||||
| static int getBitrateMode(int bitrate) | ||||
| { | ||||
|     /* make the correspondance between bitrate and mode */ | ||||
|     AMR_bitrates rates[] = { { 4750, MR475}, | ||||
|                              { 5150, MR515}, | ||||
|                              { 5900, MR59}, | ||||
|                              { 6700, MR67}, | ||||
|                              { 7400, MR74}, | ||||
|                              { 7950, MR795}, | ||||
|                              {10200, MR102}, | ||||
|                              {12200, MR122}, }; | ||||
|     int i; | ||||
|  | ||||
|     for (i = 0; i < 8; i++) | ||||
|         if (rates[i].rate == bitrate) | ||||
|             return rates[i].mode; | ||||
|     /* no bitrate matching, return an error */ | ||||
|     return -1; | ||||
| } | ||||
|  | ||||
| typedef struct AMRContext { | ||||
|     int   frameCount; | ||||
|     void *decState; | ||||
|     int  *enstate; | ||||
|     int   enc_bitrate; | ||||
| } AMRContext; | ||||
|  | ||||
| static av_cold int amr_nb_decode_init(AVCodecContext *avctx) | ||||
| { | ||||
|     AMRContext *s = avctx->priv_data; | ||||
|  | ||||
|     s->frameCount = 0; | ||||
|     s->decState   = Decoder_Interface_init(); | ||||
|     if (!s->decState) { | ||||
|         av_log(avctx, AV_LOG_ERROR, "Decoder_Interface_init error\r\n"); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     amr_decode_fix_avctx(avctx); | ||||
|  | ||||
|     if (avctx->channels > 1) { | ||||
|         av_log(avctx, AV_LOG_ERROR, "amr_nb: multichannel decoding not supported\n"); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static av_cold int amr_nb_decode_close(AVCodecContext *avctx) | ||||
| { | ||||
|     AMRContext *s = avctx->priv_data; | ||||
|  | ||||
|     Decoder_Interface_exit(s->decState); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int amr_nb_decode_frame(AVCodecContext *avctx, void *data, | ||||
|                                int *data_size, AVPacket *avpkt) | ||||
| { | ||||
|     const uint8_t *buf = avpkt->data; | ||||
|     int buf_size       = avpkt->size; | ||||
|     AMRContext *s = avctx->priv_data; | ||||
|     const uint8_t *amrData = buf; | ||||
|     static const uint8_t block_size[16] = { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 }; | ||||
|     enum Mode dec_mode; | ||||
|     int packet_size; | ||||
|  | ||||
|     /* av_log(NULL, AV_LOG_DEBUG, "amr_decode_frame buf=%p buf_size=%d frameCount=%d!!\n", | ||||
|               buf, buf_size, s->frameCount); */ | ||||
|  | ||||
|     dec_mode = (buf[0] >> 3) & 0x000F; | ||||
|     packet_size = block_size[dec_mode] + 1; | ||||
|  | ||||
|     if (packet_size > buf_size) { | ||||
|         av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n", | ||||
|                buf_size, packet_size); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     s->frameCount++; | ||||
|     /* av_log(NULL, AV_LOG_DEBUG, "packet_size=%d amrData= 0x%X %X %X %X\n", | ||||
|               packet_size, amrData[0], amrData[1], amrData[2], amrData[3]); */ | ||||
|     /* call decoder */ | ||||
|     Decoder_Interface_Decode(s->decState, amrData, data, 0); | ||||
|     *data_size = 160 * 2; | ||||
|  | ||||
|     return packet_size; | ||||
| } | ||||
|  | ||||
| AVCodec libamr_nb_decoder = { | ||||
|     "libamr_nb", | ||||
|     CODEC_TYPE_AUDIO, | ||||
|     CODEC_ID_AMR_NB, | ||||
|     sizeof(AMRContext), | ||||
|     amr_nb_decode_init, | ||||
|     NULL, | ||||
|     amr_nb_decode_close, | ||||
|     amr_nb_decode_frame, | ||||
|     .long_name = NULL_IF_CONFIG_SMALL("libamr-nb Adaptive Multi-Rate (AMR) Narrow-Band"), | ||||
| }; | ||||
|  | ||||
| static av_cold int amr_nb_encode_init(AVCodecContext *avctx) | ||||
| { | ||||
|     AMRContext *s = avctx->priv_data; | ||||
|  | ||||
|     s->frameCount = 0; | ||||
|  | ||||
|     if (avctx->sample_rate != 8000) { | ||||
|         av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n"); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     if (avctx->channels != 1) { | ||||
|         av_log(avctx, AV_LOG_ERROR, "Only mono supported\n"); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     avctx->frame_size  = 160; | ||||
|     avctx->coded_frame = avcodec_alloc_frame(); | ||||
|  | ||||
|     s->enstate=Encoder_Interface_init(0); | ||||
|     if (!s->enstate) { | ||||
|         av_log(avctx, AV_LOG_ERROR, "Encoder_Interface_init error\n"); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     if ((s->enc_bitrate = getBitrateMode(avctx->bit_rate)) < 0) { | ||||
|         av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static av_cold int amr_nb_encode_close(AVCodecContext *avctx) | ||||
| { | ||||
|     AMRContext *s = avctx->priv_data; | ||||
|  | ||||
|     Encoder_Interface_exit(s->enstate); | ||||
|     av_freep(&avctx->coded_frame); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int amr_nb_encode_frame(AVCodecContext *avctx, | ||||
|                                unsigned char *frame/*out*/, | ||||
|                                int buf_size, void *data/*in*/) | ||||
| { | ||||
|     AMRContext *s = avctx->priv_data; | ||||
|     int written; | ||||
|  | ||||
|     if ((s->enc_bitrate = getBitrateMode(avctx->bit_rate)) < 0) { | ||||
|         av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     written = Encoder_Interface_Encode(s->enstate, s->enc_bitrate, data, | ||||
|                                        frame, 0); | ||||
|     /* av_log(NULL, AV_LOG_DEBUG, "amr_nb_encode_frame encoded %u bytes, bitrate %u, first byte was %#02x\n", | ||||
|               written, s->enc_bitrate, frame[0] ); */ | ||||
|  | ||||
|     return written; | ||||
| } | ||||
|  | ||||
| AVCodec libamr_nb_encoder = { | ||||
|     "libamr_nb", | ||||
|     CODEC_TYPE_AUDIO, | ||||
|     CODEC_ID_AMR_NB, | ||||
|     sizeof(AMRContext), | ||||
|     amr_nb_encode_init, | ||||
|     amr_nb_encode_frame, | ||||
|     amr_nb_encode_close, | ||||
|     NULL, | ||||
|     .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, | ||||
|     .long_name = NULL_IF_CONFIG_SMALL("libamr-nb Adaptive Multi-Rate (AMR) Narrow-Band"), | ||||
| }; | ||||
|  | ||||
| #endif | ||||
|  | ||||
| /* -----------AMR wideband ------------*/ | ||||
| #if CONFIG_LIBAMR_WB | ||||
|  | ||||
| #ifdef _TYPEDEF_H | ||||
| //To avoid duplicate typedefs from typedef in amr-nb | ||||
| #define typedef_h | ||||
| #endif | ||||
|  | ||||
| #include <amrwb/dec_if.h> | ||||
| #include <amrwb/if_rom.h> | ||||
|  | ||||
| static const char wb_bitrate_unsupported[] = | ||||
|     "bitrate not supported: use one of 6.6k, 8.85k, 12.65k, 14.25k, 15.85k, 18.25k, 19.85k, 23.05k, or 23.85k\n"; | ||||
|  | ||||
| typedef struct AMRWB_bitrates { | ||||
|     int rate; | ||||
|     int mode; | ||||
| } AMRWB_bitrates; | ||||
|  | ||||
| typedef struct AMRWBContext { | ||||
|     int    frameCount; | ||||
|     void  *state; | ||||
|     int    mode; | ||||
|     Word16 allow_dtx; | ||||
| } AMRWBContext; | ||||
|  | ||||
| #if CONFIG_LIBAMR_WB_ENCODER | ||||
|  | ||||
| #include <amrwb/enc_if.h> | ||||
|  | ||||
| static int getWBBitrateMode(int bitrate) | ||||
| { | ||||
|     /* make the correspondance between bitrate and mode */ | ||||
|     AMRWB_bitrates rates[] = { { 6600, 0}, | ||||
|                                { 8850, 1}, | ||||
|                                {12650, 2}, | ||||
|                                {14250, 3}, | ||||
|                                {15850, 4}, | ||||
|                                {18250, 5}, | ||||
|                                {19850, 6}, | ||||
|                                {23050, 7}, | ||||
|                                {23850, 8}, }; | ||||
|     int i; | ||||
|  | ||||
|     for (i = 0; i < 9; i++) | ||||
|         if (rates[i].rate == bitrate) | ||||
|             return rates[i].mode; | ||||
|     /* no bitrate matching, return an error */ | ||||
|     return -1; | ||||
| } | ||||
|  | ||||
| static av_cold int amr_wb_encode_init(AVCodecContext *avctx) | ||||
| { | ||||
|     AMRWBContext *s = avctx->priv_data; | ||||
|  | ||||
|     s->frameCount = 0; | ||||
|  | ||||
|     if (avctx->sample_rate != 16000) { | ||||
|         av_log(avctx, AV_LOG_ERROR, "Only 16000Hz sample rate supported\n"); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     if (avctx->channels != 1) { | ||||
|         av_log(avctx, AV_LOG_ERROR, "Only mono supported\n"); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     if ((s->mode = getWBBitrateMode(avctx->bit_rate)) < 0) { | ||||
|         av_log(avctx, AV_LOG_ERROR, wb_bitrate_unsupported); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     avctx->frame_size  = 320; | ||||
|     avctx->coded_frame = avcodec_alloc_frame(); | ||||
|  | ||||
|     s->state     = E_IF_init(); | ||||
|     s->allow_dtx = 0; | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int amr_wb_encode_close(AVCodecContext *avctx) | ||||
| { | ||||
|     AMRWBContext *s = avctx->priv_data; | ||||
|  | ||||
|     E_IF_exit(s->state); | ||||
|     av_freep(&avctx->coded_frame); | ||||
|     s->frameCount++; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int amr_wb_encode_frame(AVCodecContext *avctx, | ||||
|                                unsigned char *frame/*out*/, | ||||
|                                int buf_size, void *data/*in*/) | ||||
| { | ||||
|     AMRWBContext *s = avctx->priv_data; | ||||
|     int size; | ||||
|  | ||||
|     if ((s->mode = getWBBitrateMode(avctx->bit_rate)) < 0) { | ||||
|         av_log(avctx, AV_LOG_ERROR, wb_bitrate_unsupported); | ||||
|         return -1; | ||||
|     } | ||||
|     size = E_IF_encode(s->state, s->mode, data, frame, s->allow_dtx); | ||||
|     return size; | ||||
| } | ||||
|  | ||||
| AVCodec libamr_wb_encoder = { | ||||
|     "libamr_wb", | ||||
|     CODEC_TYPE_AUDIO, | ||||
|     CODEC_ID_AMR_WB, | ||||
|     sizeof(AMRWBContext), | ||||
|     amr_wb_encode_init, | ||||
|     amr_wb_encode_frame, | ||||
|     amr_wb_encode_close, | ||||
|     NULL, | ||||
|     .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, | ||||
|     .long_name = NULL_IF_CONFIG_SMALL("libamr-wb Adaptive Multi-Rate (AMR) Wide-Band"), | ||||
| }; | ||||
|  | ||||
| #endif | ||||
|  | ||||
| static av_cold int amr_wb_decode_init(AVCodecContext *avctx) | ||||
| { | ||||
|     AMRWBContext *s = avctx->priv_data; | ||||
|  | ||||
|     s->frameCount = 0; | ||||
|     s->state      = D_IF_init(); | ||||
|  | ||||
|     amr_decode_fix_avctx(avctx); | ||||
|  | ||||
|     if (avctx->channels > 1) { | ||||
|         av_log(avctx, AV_LOG_ERROR, "amr_wb: multichannel decoding not supported\n"); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int amr_wb_decode_frame(AVCodecContext *avctx, void *data, | ||||
|                                int *data_size, AVPacket *avpkt) | ||||
| { | ||||
|     const uint8_t *buf = avpkt->data; | ||||
|     int buf_size       = avpkt->size; | ||||
|     AMRWBContext *s = avctx->priv_data; | ||||
|     const uint8_t *amrData = buf; | ||||
|     int mode; | ||||
|     int packet_size; | ||||
|     static const uint8_t block_size[16] = {18, 24, 33, 37, 41, 47, 51, 59, 61, 6, 6, 0, 0, 0, 1, 1}; | ||||
|  | ||||
|     if (!buf_size) | ||||
|         /* nothing to do */ | ||||
|         return 0; | ||||
|  | ||||
|     mode = (amrData[0] >> 3) & 0x000F; | ||||
|     packet_size = block_size[mode]; | ||||
|  | ||||
|     if (packet_size > buf_size) { | ||||
|         av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n", | ||||
|                buf_size, packet_size + 1); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     s->frameCount++; | ||||
|     D_IF_decode(s->state, amrData, data, _good_frame); | ||||
|     *data_size = 320 * 2; | ||||
|     return packet_size; | ||||
| } | ||||
|  | ||||
| static int amr_wb_decode_close(AVCodecContext *avctx) | ||||
| { | ||||
|     AMRWBContext *s = avctx->priv_data; | ||||
|  | ||||
|     D_IF_exit(s->state); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| AVCodec libamr_wb_decoder = { | ||||
|     "libamr_wb", | ||||
|     CODEC_TYPE_AUDIO, | ||||
|     CODEC_ID_AMR_WB, | ||||
|     sizeof(AMRWBContext), | ||||
|     amr_wb_decode_init, | ||||
|     NULL, | ||||
|     amr_wb_decode_close, | ||||
|     amr_wb_decode_frame, | ||||
|     .long_name = NULL_IF_CONFIG_SMALL("libamr-wb Adaptive Multi-Rate (AMR) Wide-Band"), | ||||
| }; | ||||
|  | ||||
| #endif //CONFIG_LIBAMR_WB | ||||
		Reference in New Issue
	
	Block a user