"Fossies" - the Fresh Open Source Software Archive

Member "quicktime4linux-2.3/thirdparty/ffmpeg.053108/libavcodec/8svx.c" (8 Aug 2008, 3318 Bytes) of package /linux/privat/old/quicktime4linux-2.3-src.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 /*
    2  * 8SVX audio decoder
    3  * Copyright (C) 2008 Jaikrishnan Menon
    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 /**
   23  * @file 8svx.c
   24  * 8svx audio decoder
   25  * @author Jaikrishnan Menon
   26  * supports: fibonacci delta encoding
   27  *         : exponential encoding
   28  */
   29 
   30 #include "avcodec.h"
   31 
   32 /** decoder context */
   33 typedef struct EightSvxContext {
   34     int16_t fib_acc;
   35     int16_t *table;
   36 } EightSvxContext;
   37 
   38 const static int16_t fibonacci[16]   = { -34<<8, -21<<8, -13<<8,  -8<<8, -5<<8, -3<<8, -2<<8, -1<<8,
   39                                           0, 1<<8, 2<<8, 3<<8, 5<<8, 8<<8, 13<<8, 21<<8 };
   40 const static int16_t exponential[16] = { -128<<8, -64<<8, -32<<8, -16<<8, -8<<8, -4<<8, -2<<8, -1<<8,
   41                                           0, 1<<8, 2<<8, 4<<8, 8<<8, 16<<8, 32<<8, 64<<8 };
   42 
   43 /** decode a frame */
   44 static int eightsvx_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
   45                                  const uint8_t *buf, int buf_size)
   46 {
   47     EightSvxContext *esc = avctx->priv_data;
   48     int16_t *out_data = data;
   49     int consumed = buf_size;
   50     const uint8_t *buf_end = buf + buf_size;
   51 
   52     if((*data_size >> 2) < buf_size)
   53         return -1;
   54 
   55     if(avctx->frame_number == 0) {
   56         esc->fib_acc = buf[1] << 8;
   57         buf_size -= 2;
   58         buf += 2;
   59     }
   60 
   61     *data_size = buf_size << 2;
   62 
   63     while(buf < buf_end) {
   64         uint8_t d = *buf++;
   65         esc->fib_acc += esc->table[d & 0x0f];
   66         *out_data++ = esc->fib_acc;
   67         esc->fib_acc += esc->table[d >> 4];
   68         *out_data++ = esc->fib_acc;
   69     }
   70 
   71     return consumed;
   72 }
   73 
   74 /** initialize 8svx decoder */
   75 static av_cold int eightsvx_decode_init(AVCodecContext *avctx)
   76 {
   77     EightSvxContext *esc = avctx->priv_data;
   78 
   79     switch(avctx->codec->id) {
   80         case CODEC_ID_8SVX_FIB:
   81           esc->table = fibonacci;
   82           break;
   83         case CODEC_ID_8SVX_EXP:
   84           esc->table = exponential;
   85           break;
   86         default:
   87           return -1;
   88     }
   89     return 0;
   90 }
   91 
   92 AVCodec eightsvx_fib_decoder = {
   93   .name           = "8svx_fib",
   94   .type           = CODEC_TYPE_AUDIO,
   95   .id             = CODEC_ID_8SVX_FIB,
   96   .priv_data_size = sizeof (EightSvxContext),
   97   .init           = eightsvx_decode_init,
   98   .decode         = eightsvx_decode_frame,
   99   .long_name      = "8SVX fibonacci",
  100 };
  101 
  102 AVCodec eightsvx_exp_decoder = {
  103   .name           = "8svx_exp",
  104   .type           = CODEC_TYPE_AUDIO,
  105   .id             = CODEC_ID_8SVX_EXP,
  106   .priv_data_size = sizeof (EightSvxContext),
  107   .init           = eightsvx_decode_init,
  108   .decode         = eightsvx_decode_frame,
  109   .long_name      = "8SVX exponential",
  110 };