-
Anton Khirnov authored
This will make the x86 asm simpler. ARM conversion by Martin Storsjö <martin@martin.st> and Janne Grunau <janne-libav@jannau.net>
Anton Khirnov authoredThis will make the x86 asm simpler. ARM conversion by Martin Storsjö <martin@martin.st> and Janne Grunau <janne-libav@jannau.net>
cook.c 43.16 KiB
/*
* COOK compatible decoder
* Copyright (c) 2003 Sascha Sommer
* Copyright (c) 2005 Benjamin Larsson
*
* 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
*/
/**
* @file
* Cook compatible decoder. Bastardization of the G.722.1 standard.
* This decoder handles RealNetworks, RealAudio G2 data.
* Cook is identified by the codec name cook in RM files.
*
* To use this decoder, a calling application must supply the extradata
* bytes provided from the RM container; 8+ bytes for mono streams and
* 16+ for stereo streams (maybe more).
*
* Codec technicalities (all this assume a buffer length of 1024):
* Cook works with several different techniques to achieve its compression.
* In the timedomain the buffer is divided into 8 pieces and quantized. If
* two neighboring pieces have different quantization index a smooth
* quantization curve is used to get a smooth overlap between the different
* pieces.
* To get to the transformdomain Cook uses a modulated lapped transform.
* The transform domain has 50 subbands with 20 elements each. This
* means only a maximum of 50*20=1000 coefficients are used out of the 1024
* available.
*/
#include "libavutil/channel_layout.h"
#include "libavutil/lfg.h"
#include "audiodsp.h"
#include "avcodec.h"
#include "get_bits.h"
#include "bytestream.h"
#include "fft.h"
#include "internal.h"
#include "sinewin.h"
#include "cookdata.h"
/* the different Cook versions */
#define MONO 0x1000001
#define STEREO 0x1000002
#define JOINT_STEREO 0x1000003
#define MC_COOK 0x2000000 // multichannel Cook, not supported
#define SUBBAND_SIZE 20
#define MAX_SUBPACKETS 5
typedef struct cook_gains {
int *now;
int *previous;
} cook_gains;