Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
  3.  *
  4.  * This file is part of FFmpeg.
  5.  *
  6.  * FFmpeg is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2.1 of the License, or (at your option) any later version.
  10.  *
  11.  * FFmpeg is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Lesser General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Lesser General Public
  17.  * License along with FFmpeg; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19.  */
  20.  
  21. #include "libavutil/common.h"
  22. #include "libavutil/intreadwrite.h"
  23. #include "avcodec.h"
  24. #include "mpegaudiodecheader.h"
  25.  
  26.  
  27. static int mp3_header_compress(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args,
  28.                      uint8_t **poutbuf, int *poutbuf_size,
  29.                      const uint8_t *buf, int buf_size, int keyframe){
  30.     uint32_t header, extraheader;
  31.     int mode_extension, header_size;
  32.  
  33.     if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){
  34.         av_log(avctx, AV_LOG_ERROR, "not standards compliant\n");
  35.         return -1;
  36.     }
  37.  
  38.     header = AV_RB32(buf);
  39.     mode_extension= (header>>4)&3;
  40.  
  41.     if(ff_mpa_check_header(header) < 0 || (header&0x60000) != 0x20000){
  42. output_unchanged:
  43.         *poutbuf= (uint8_t *) buf;
  44.         *poutbuf_size= buf_size;
  45.  
  46.         av_log(avctx, AV_LOG_INFO, "cannot compress %08X\n", header);
  47.         return 0;
  48.     }
  49.  
  50.     if(avctx->extradata_size == 0){
  51.         avctx->extradata_size=15;
  52.         avctx->extradata= av_malloc(avctx->extradata_size);
  53.         strcpy(avctx->extradata, "FFCMP3 0.0");
  54.         memcpy(avctx->extradata+11, buf, 4);
  55.     }
  56.     if(avctx->extradata_size != 15){
  57.         av_log(avctx, AV_LOG_ERROR, "Extradata invalid\n");
  58.         return -1;
  59.     }
  60.     extraheader = AV_RB32(avctx->extradata+11);
  61.     if((extraheader&MP3_MASK) != (header&MP3_MASK))
  62.         goto output_unchanged;
  63.  
  64.     header_size= (header&0x10000) ? 4 : 6;
  65.  
  66.     *poutbuf_size= buf_size - header_size;
  67.     *poutbuf= av_malloc(buf_size - header_size + FF_INPUT_BUFFER_PADDING_SIZE);
  68.     memcpy(*poutbuf, buf + header_size, buf_size - header_size + FF_INPUT_BUFFER_PADDING_SIZE);
  69.  
  70.     if(avctx->channels==2){
  71.         if((header & (3<<19)) != 3<<19){
  72.             (*poutbuf)[1] &= 0x3F;
  73.             (*poutbuf)[1] |= mode_extension<<6;
  74.             FFSWAP(int, (*poutbuf)[1], (*poutbuf)[2]);
  75.         }else{
  76.             (*poutbuf)[1] &= 0x8F;
  77.             (*poutbuf)[1] |= mode_extension<<4;
  78.         }
  79.     }
  80.  
  81.     return 1;
  82. }
  83.  
  84. AVBitStreamFilter ff_mp3_header_compress_bsf={
  85.     .name   = "mp3comp",
  86.     .filter = mp3_header_compress,
  87. };
  88.