• codec_internal.h
  • /********************************************************************
     *                                                                  *
     * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
     * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
     * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
     * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
     *                                                                  *
     * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009             *
     * by the Xiph.Org Foundation https://xiph.org/                     *
     *                                                                  *
     ********************************************************************
    
     function: libvorbis codec headers
    
     ********************************************************************/
    
    #ifndef _V_CODECI_H_
    #define _V_CODECI_H_
    
    #include "envelope.h"
    #include "codebook.h"
    
    #define BLOCKTYPE_IMPULSE    0
    #define BLOCKTYPE_PADDING    1
    #define BLOCKTYPE_TRANSITION 0
    #define BLOCKTYPE_LONG       1
    
    #define PACKETBLOBS 15
    
    typedef struct vorbis_block_internal{
      float  **pcmdelay;  /* this is a pointer into local storage */
      float  ampmax;
      int    blocktype;
    
      oggpack_buffer *packetblob[PACKETBLOBS]; /* initialized, must be freed;
                                                  blob [PACKETBLOBS/2] points to
                                                  the oggpack_buffer in the
                                                  main vorbis_block */
    } vorbis_block_internal;
    
    typedef void vorbis_look_floor;
    typedef void vorbis_look_residue;
    typedef void vorbis_look_transform;
    
    /* mode ************************************************************/
    typedef struct {
      int blockflag;
      int windowtype;
      int transformtype;
      int mapping;
    } vorbis_info_mode;
    
    typedef void vorbis_info_floor;
    typedef void vorbis_info_residue;
    typedef void vorbis_info_mapping;
    
    #include "psy.h"
    #include "bitrate.h"
    
    typedef struct private_state {
      /* local lookup storage */
      envelope_lookup        *ve; /* envelope lookup */
      int                     window[2];
      vorbis_look_transform **transform[2];    /* block, type */
      drft_lookup             fft_look[2];
    
      int                     modebits;
      vorbis_look_floor     **flr;
      vorbis_look_residue   **residue;
      vorbis_look_psy        *psy;
      vorbis_look_psy_global *psy_g_look;
    
      /* local storage, only used on the encoding side.  This way the
         application does not need to worry about freeing some packets'
         memory and not others'; packet storage is always tracked.
         Cleared next call to a _dsp_ function */
      unsigned char *header;
      unsigned char *header1;
      unsigned char *header2;
    
      bitrate_manager_state bms;
    
      ogg_int64_t sample_count;
    } private_state;
    
    /* codec_setup_info contains all the setup information specific to the
       specific compression/decompression mode in progress (eg,
       psychoacoustic settings, channel setup, options, codebook
       etc).
    *********************************************************************/
    
    #include "highlevel.h"
    typedef struct codec_setup_info {
    
      /* Vorbis supports only short and long blocks, but allows the
         encoder to choose the sizes */
    
      long blocksizes[2];
    
      /* modes are the primary means of supporting on-the-fly different
         blocksizes, different channel mappings (LR or M/A),
         different residue backends, etc.  Each mode consists of a
         blocksize flag and a mapping (along with the mapping setup */
    
      int        modes;
      int        maps;
      int        floors;
      int        residues;
      int        books;
      int        psys;     /* encode only */
    
      vorbis_info_mode       *mode_param[64];
      int                     map_type[64];
      vorbis_info_mapping    *map_param[64];
      int                     floor_type[64];
      vorbis_info_floor      *floor_param[64];
      int                     residue_type[64];
      vorbis_info_residue    *residue_param[64];
      static_codebook        *book_param[256];
      codebook               *fullbooks;
    
      vorbis_info_psy        *psy_param[4]; /* encode only */
      vorbis_info_psy_global psy_g_param;
    
      bitrate_manager_info   bi;
      highlevel_encode_setup hi; /* used only by vorbisenc.c.  It's a
                                    highly redundant structure, but
                                    improves clarity of program flow. */
      int         halfrate_flag; /* painless downsample for decode */
    } codec_setup_info;
    
    extern vorbis_look_psy_global *_vp_global_look(vorbis_info *vi);
    extern void _vp_global_free(vorbis_look_psy_global *look);
    
    
    
    typedef struct {
      int sorted_index[VIF_POSIT+2];
      int forward_index[VIF_POSIT+2];
      int reverse_index[VIF_POSIT+2];
    
      int hineighbor[VIF_POSIT];
      int loneighbor[VIF_POSIT];
      int posts;
    
      int n;
      int quant_q;
      vorbis_info_floor1 *vi;
    
      long phrasebits;
      long postbits;
      long frames;
    } vorbis_look_floor1;
    
    
    
    extern int *floor1_fit(vorbis_block *vb,vorbis_look_floor1 *look,
                              const float *logmdct,   /* in */
                              const float *logmask);
    extern int *floor1_interpolate_fit(vorbis_block *vb,vorbis_look_floor1 *look,
                              int *A,int *B,
                              int del);
    extern int floor1_encode(oggpack_buffer *opb,vorbis_block *vb,
                      vorbis_look_floor1 *look,
                      int *post,int *ilogmask);
    #endif