You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	lavc: remove mp3_header_(de)compress bitstream filters
They mangle the mp3 header in a non-standard way to save a few bytes. People who care about space so much should just use a more efficient codec.
This commit is contained in:
		| @@ -49,6 +49,7 @@ version 10: | ||||
| - dar variable in the scale filter now returns the actual DAR (i.e. a * sar) | ||||
| - VP9 decoder | ||||
| - support for decoding through VDPAU in avconv (the -hwaccel option) | ||||
| - remove mp3_header_(de)compress bitstream filters | ||||
|  | ||||
|  | ||||
| version 9: | ||||
|   | ||||
| @@ -672,9 +672,6 @@ OBJS-$(CONFIG_IMX_DUMP_HEADER_BSF)        += imx_dump_header_bsf.o | ||||
| OBJS-$(CONFIG_MJPEG2JPEG_BSF)             += mjpeg2jpeg_bsf.o mjpeg.o | ||||
| OBJS-$(CONFIG_MJPEGA_DUMP_HEADER_BSF)     += mjpega_dump_header_bsf.o | ||||
| OBJS-$(CONFIG_MOV2TEXTSUB_BSF)            += movsub_bsf.o | ||||
| OBJS-$(CONFIG_MP3_HEADER_COMPRESS_BSF)    += mp3_header_compress_bsf.o | ||||
| OBJS-$(CONFIG_MP3_HEADER_DECOMPRESS_BSF)  += mp3_header_decompress_bsf.o \ | ||||
|                                              mpegaudiodata.o | ||||
| OBJS-$(CONFIG_NOISE_BSF)                  += noise_bsf.o | ||||
| OBJS-$(CONFIG_REMOVE_EXTRADATA_BSF)       += remove_extradata_bsf.o | ||||
| OBJS-$(CONFIG_TEXT2MOVSUB_BSF)            += movsub_bsf.o | ||||
|   | ||||
| @@ -481,8 +481,6 @@ void avcodec_register_all(void) | ||||
|     REGISTER_BSF(IMX_DUMP_HEADER,       imx_dump_header); | ||||
|     REGISTER_BSF(MJPEG2JPEG,            mjpeg2jpeg); | ||||
|     REGISTER_BSF(MJPEGA_DUMP_HEADER,    mjpega_dump_header); | ||||
|     REGISTER_BSF(MP3_HEADER_COMPRESS,   mp3_header_compress); | ||||
|     REGISTER_BSF(MP3_HEADER_DECOMPRESS, mp3_header_decompress); | ||||
|     REGISTER_BSF(MOV2TEXTSUB,           mov2textsub); | ||||
|     REGISTER_BSF(NOISE,                 noise); | ||||
|     REGISTER_BSF(REMOVE_EXTRADATA,      remove_extradata); | ||||
|   | ||||
| @@ -1,88 +0,0 @@ | ||||
| /* | ||||
|  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | ||||
|  * | ||||
|  * This file is part of Libav. | ||||
|  * | ||||
|  * Libav 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. | ||||
|  * | ||||
|  * Libav 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 Libav; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| #include "libavutil/common.h" | ||||
| #include "libavutil/intreadwrite.h" | ||||
| #include "avcodec.h" | ||||
| #include "mpegaudiodecheader.h" | ||||
|  | ||||
|  | ||||
| static int mp3_header_compress(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, | ||||
|                      uint8_t **poutbuf, int *poutbuf_size, | ||||
|                      const uint8_t *buf, int buf_size, int keyframe){ | ||||
|     uint32_t header, extraheader; | ||||
|     int mode_extension, header_size; | ||||
|  | ||||
|     if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){ | ||||
|         av_log(avctx, AV_LOG_ERROR, "not standards compliant\n"); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     header = AV_RB32(buf); | ||||
|     mode_extension= (header>>4)&3; | ||||
|  | ||||
|     if(ff_mpa_check_header(header) < 0 || (header&0x60000) != 0x20000){ | ||||
| output_unchanged: | ||||
|         *poutbuf= (uint8_t *) buf; | ||||
|         *poutbuf_size= buf_size; | ||||
|  | ||||
|         av_log(avctx, AV_LOG_INFO, "cannot compress %08X\n", header); | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     if(avctx->extradata_size == 0){ | ||||
|         avctx->extradata_size=15; | ||||
|         avctx->extradata= av_malloc(avctx->extradata_size); | ||||
|         strcpy(avctx->extradata, "FFCMP3 0.0"); | ||||
|         memcpy(avctx->extradata+11, buf, 4); | ||||
|     } | ||||
|     if(avctx->extradata_size != 15){ | ||||
|         av_log(avctx, AV_LOG_ERROR, "Extradata invalid\n"); | ||||
|         return -1; | ||||
|     } | ||||
|     extraheader = AV_RB32(avctx->extradata+11); | ||||
|     if((extraheader&MP3_MASK) != (header&MP3_MASK)) | ||||
|         goto output_unchanged; | ||||
|  | ||||
|     header_size= (header&0x10000) ? 4 : 6; | ||||
|  | ||||
|     *poutbuf_size= buf_size - header_size; | ||||
|     *poutbuf= av_malloc(buf_size - header_size + FF_INPUT_BUFFER_PADDING_SIZE); | ||||
|     memcpy(*poutbuf, buf + header_size, buf_size - header_size + FF_INPUT_BUFFER_PADDING_SIZE); | ||||
|  | ||||
|     if(avctx->channels==2){ | ||||
|         if((header & (3<<19)) != 3<<19){ | ||||
|             (*poutbuf)[1] &= 0x3F; | ||||
|             (*poutbuf)[1] |= mode_extension<<6; | ||||
|             FFSWAP(int, (*poutbuf)[1], (*poutbuf)[2]); | ||||
|         }else{ | ||||
|             (*poutbuf)[1] &= 0x8F; | ||||
|             (*poutbuf)[1] |= mode_extension<<4; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
| AVBitStreamFilter ff_mp3_header_compress_bsf={ | ||||
|     "mp3comp", | ||||
|     0, | ||||
|     mp3_header_compress, | ||||
| }; | ||||
| @@ -1,98 +0,0 @@ | ||||
| /* | ||||
|  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | ||||
|  * | ||||
|  * This file is part of Libav. | ||||
|  * | ||||
|  * Libav 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. | ||||
|  * | ||||
|  * Libav 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 Libav; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| #include "libavutil/common.h" | ||||
| #include "libavutil/intreadwrite.h" | ||||
| #include "avcodec.h" | ||||
| #include "mpegaudiodecheader.h" | ||||
| #include "mpegaudiodata.h" | ||||
|  | ||||
|  | ||||
| static int mp3_header_decompress(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, | ||||
|                      uint8_t **poutbuf, int *poutbuf_size, | ||||
|                      const uint8_t *buf, int buf_size, int keyframe){ | ||||
|     uint32_t header; | ||||
|     int sample_rate= avctx->sample_rate; | ||||
|     int sample_rate_index=0; | ||||
|     int lsf, mpeg25, bitrate_index, frame_size; | ||||
|  | ||||
|     header = AV_RB32(buf); | ||||
|     if(ff_mpa_check_header(header) >= 0){ | ||||
|         *poutbuf= (uint8_t *) buf; | ||||
|         *poutbuf_size= buf_size; | ||||
|  | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     if(avctx->extradata_size != 15 || strcmp(avctx->extradata, "FFCMP3 0.0")){ | ||||
|         av_log(avctx, AV_LOG_ERROR, "Extradata invalid %d\n", avctx->extradata_size); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     header= AV_RB32(avctx->extradata+11) & MP3_MASK; | ||||
|  | ||||
|     lsf     = sample_rate < (24000+32000)/2; | ||||
|     mpeg25  = sample_rate < (12000+16000)/2; | ||||
|     sample_rate_index= (header>>10)&3; | ||||
|     sample_rate= avpriv_mpa_freq_tab[sample_rate_index] >> (lsf + mpeg25); //in case sample rate is a little off | ||||
|  | ||||
|     for(bitrate_index=2; bitrate_index<30; bitrate_index++){ | ||||
|         frame_size = avpriv_mpa_bitrate_tab[lsf][2][bitrate_index>>1]; | ||||
|         frame_size = (frame_size * 144000) / (sample_rate << lsf) + (bitrate_index&1); | ||||
|         if(frame_size == buf_size + 4) | ||||
|             break; | ||||
|         if(frame_size == buf_size + 6) | ||||
|             break; | ||||
|     } | ||||
|     if(bitrate_index == 30){ | ||||
|         av_log(avctx, AV_LOG_ERROR, "Could not find bitrate_index.\n"); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     header |= (bitrate_index&1)<<9; | ||||
|     header |= (bitrate_index>>1)<<12; | ||||
|     header |= (frame_size == buf_size + 4)<<16; //FIXME actually set a correct crc instead of 0 | ||||
|  | ||||
|     *poutbuf_size= frame_size; | ||||
|     *poutbuf= av_malloc(frame_size + FF_INPUT_BUFFER_PADDING_SIZE); | ||||
|     memcpy(*poutbuf + frame_size - buf_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE); | ||||
|  | ||||
|     if(avctx->channels==2){ | ||||
|         uint8_t *p= *poutbuf + frame_size - buf_size; | ||||
|         if(lsf){ | ||||
|             FFSWAP(int, p[1], p[2]); | ||||
|             header |= (p[1] & 0xC0)>>2; | ||||
|             p[1] &= 0x3F; | ||||
|         }else{ | ||||
|             header |= p[1] & 0x30; | ||||
|             p[1] &= 0xCF; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     AV_WB32(*poutbuf, header); | ||||
|  | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
| AVBitStreamFilter ff_mp3_header_decompress_bsf={ | ||||
|     "mp3decomp", | ||||
|     0, | ||||
|     mp3_header_decompress, | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user