18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/********************************************************************
28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009             *
98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * by the Xiph.Org Foundation http://www.xiph.org/                  *
108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************
128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels function: libvorbis backend and mapping structures; needed for
148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           static mode headers
158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels last mod: $Id: backends.h 16962 2010-03-11 07:30:34Z xiphmont $
168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************/
188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* this is exposed up here because we need it for static modes.
208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   Lookups for each backend aren't exposed because there's no reason
218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   to do so */
228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#ifndef _vorbis_backend_h_
248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define _vorbis_backend_h_
258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "codec_internal.h"
278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* this would all be simpler/shorter with templates, but.... */
298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* Floor backend generic *****************************************/
308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstypedef struct{
318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  void                   (*pack)  (vorbis_info_floor *,oggpack_buffer *);
328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_info_floor     *(*unpack)(vorbis_info *,oggpack_buffer *);
338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_look_floor     *(*look)  (vorbis_dsp_state *,vorbis_info_floor *);
348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  void (*free_info) (vorbis_info_floor *);
358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  void (*free_look) (vorbis_look_floor *);
368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  void *(*inverse1)  (struct vorbis_block *,vorbis_look_floor *);
378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   (*inverse2)  (struct vorbis_block *,vorbis_look_floor *,
388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                     void *buffer,float *);
398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} vorbis_func_floor;
408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstypedef struct{
428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   order;
438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long  rate;
448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long  barkmap;
458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   ampbits;
478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   ampdB;
488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   numbooks; /* <= 16 */
508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   books[16];
518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float lessthan;     /* encode-only config setting hacks for libvorbis */
538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float greaterthan;  /* encode-only config setting hacks for libvorbis */
548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} vorbis_info_floor0;
568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define VIF_POSIT 63
598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define VIF_CLASS 16
608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define VIF_PARTS 31
618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstypedef struct{
628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   partitions;                /* 0 to 31 */
638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   partitionclass[VIF_PARTS]; /* 0 to 15 */
648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   class_dim[VIF_CLASS];        /* 1 to 8 */
668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   class_subs[VIF_CLASS];       /* 0,1,2,3 (bits: 1<<n poss) */
678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   class_book[VIF_CLASS];       /* subs ^ dim entries */
688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   class_subbook[VIF_CLASS][8]; /* [VIF_CLASS][subs] */
698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   mult;                      /* 1 2 3 or 4 */
728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   postlist[VIF_POSIT+2];    /* first two implicit */
738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* encode side analysis parameters */
768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float maxover;
778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float maxunder;
788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float maxerr;
798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float twofitweight;
818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float twofitatten;
828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   n;
848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} vorbis_info_floor1;
868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* Residue backend generic *****************************************/
888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstypedef struct{
898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  void                 (*pack)  (vorbis_info_residue *,oggpack_buffer *);
908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_info_residue *(*unpack)(vorbis_info *,oggpack_buffer *);
918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_look_residue *(*look)  (vorbis_dsp_state *,
928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                 vorbis_info_residue *);
938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  void (*free_info)    (vorbis_info_residue *);
948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  void (*free_look)    (vorbis_look_residue *);
958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long **(*class)      (struct vorbis_block *,vorbis_look_residue *,
968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                        int **,int *,int);
978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int  (*forward)      (oggpack_buffer *,struct vorbis_block *,
988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                        vorbis_look_residue *,
998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                        int **,int *,int,long **,int);
1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int  (*inverse)      (struct vorbis_block *,vorbis_look_residue *,
1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                        float **,int *,int);
1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} vorbis_func_residue;
1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstypedef struct vorbis_info_residue0{
1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* block-partitioned VQ coded straight residue */
1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long  begin;
1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long  end;
1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* first stage (lossless partitioning) */
1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int    grouping;         /* group n vectors per partition */
1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int    partitions;       /* possible codebooks for a partition */
1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int    partvals;         /* partitions ^ groupbook dim */
1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int    groupbook;        /* huffbook for partitioning */
1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int    secondstages[64]; /* expanded out to pointers in lookup */
1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int    booklist[512];    /* list of second stage books */
1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  const int classmetric1[64];
1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  const int classmetric2[64];
1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} vorbis_info_residue0;
1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* Mapping backend generic *****************************************/
1228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstypedef struct{
1238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  void                 (*pack)  (vorbis_info *,vorbis_info_mapping *,
1248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                 oggpack_buffer *);
1258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_info_mapping *(*unpack)(vorbis_info *,oggpack_buffer *);
1268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  void (*free_info)    (vorbis_info_mapping *);
1278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int  (*forward)      (struct vorbis_block *vb);
1288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int  (*inverse)      (struct vorbis_block *vb,vorbis_info_mapping *);
1298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} vorbis_func_mapping;
1308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstypedef struct vorbis_info_mapping0{
1328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   submaps;  /* <= 16 */
1338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   chmuxlist[256];   /* up to 256 channels in a Vorbis stream */
1348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   floorsubmap[16];   /* [mux] submap to floors */
1368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   residuesubmap[16]; /* [mux] submap to residue */
1378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   coupling_steps;
1398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   coupling_mag[256];
1408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   coupling_ang[256];
1418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} vorbis_info_mapping0;
1438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
145