vlc.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:7k
源码类别:

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * vlc.c: VLC lookup table generation.
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 Laurent Aimar
  5.  * $Id: vlc.c,v 1.1 2004/06/03 19:27:07 fenrir Exp $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25. #include <inttypes.h>
  26. #include "common/common.h"
  27. #include "common/vlc.h"
  28. #include "vlc.h"
  29. static int  vlc_table_realloc( x264_vlc_table_t *table, int i_size )
  30. {
  31.     int i_index;
  32.     i_index = table->i_lookup;
  33.     table->i_lookup += i_size;
  34.     table->lookup = x264_realloc( table->lookup, sizeof( vlc_lookup_t ) * table->i_lookup );
  35.     return( i_index );
  36. }
  37. static int vlc_table_create_part( x264_vlc_table_t *table, const vlc_t *vlc, int i_lookup_bits, int i_nb_vlc, int i_prefix_code, int i_prefix_length )
  38. {
  39.     int i;
  40.     int i_nb_lookup;
  41.     vlc_lookup_t *lookup;
  42.     int i_table_index;
  43.     i_nb_lookup = 1 << i_lookup_bits;
  44.     i_table_index = vlc_table_realloc( table, i_nb_lookup );
  45.     lookup = &table->lookup[i_table_index];
  46.     for( i = 0; i < i_nb_lookup; i++ )
  47.     {
  48.         lookup[i].i_value  = -1;
  49.         lookup[i].i_size = 0;
  50.     }
  51.     for( i = 0; i < i_nb_vlc; i++ )
  52.     {
  53.         int i_bits;
  54.         if( vlc[i].i_size <= 0 )
  55.         {
  56.             continue;
  57.         }
  58.         i_bits = vlc[i].i_size - i_prefix_length;
  59.         if( i_bits > 0 && ( vlc[i].i_bits >> i_bits ) == i_prefix_code )
  60.         {
  61.             if( i_bits <= i_lookup_bits )
  62.             {
  63.                 int i_lookup_index;
  64.                 int nb;
  65.                 i_lookup_index = ( vlc[i].i_bits << ( i_lookup_bits - i_bits ) )%i_nb_lookup;
  66.                 nb = 1 << ( i_lookup_bits - i_bits );
  67.                 for( nb = 0; nb < (1 << ( i_lookup_bits - i_bits)); nb++ )
  68.                 {
  69.                     lookup[i_lookup_index].i_value = i; /* vlc[i].i_value; */
  70.                     lookup[i_lookup_index].i_size = i_bits;
  71.                     i_lookup_index++;
  72.                 }
  73.             }
  74.             else
  75.             {
  76.                 int i_bits_max;
  77.                 int i_lookup_index;
  78.                 /* need another table */
  79.                 i_lookup_index = ( vlc[i].i_bits >> (i_bits - i_lookup_bits ) )%i_nb_lookup;
  80.                 i_bits_max =  -lookup[i_lookup_index].i_size;
  81.                 if( i_bits_max < i_bits - i_lookup_bits )
  82.                 {
  83.                     i_bits_max = i_bits - i_lookup_bits;
  84.                 }
  85.                 lookup[i_lookup_index].i_size = -i_bits_max;
  86.             }
  87.         }
  88.     }
  89.     /* create other level table */
  90.     for( i = 0; i < i_nb_lookup; i++ )
  91.     {
  92.         if( lookup[i].i_size < 0 )
  93.         {
  94.             int i_bits;
  95.             int i_index;
  96.             i_bits = -lookup[i].i_size;
  97.             if( i_bits > i_lookup_bits )
  98.             {
  99.                 lookup[i].i_size = -i_lookup_bits;
  100.                 i_bits = i_lookup_bits;
  101.             }
  102.             i_index = vlc_table_create_part( table, vlc, i_bits, i_nb_vlc,
  103.                                              (i_prefix_code << i_lookup_bits)|i,
  104.                                               i_lookup_bits+i_prefix_length );
  105.             lookup = &table->lookup[i_table_index]; // reallocated
  106.             lookup[i].i_value = i_index;
  107.         }
  108.     }
  109.     return( i_table_index );
  110. }
  111. x264_vlc_table_t *x264_vlc_table_lookup_new( const vlc_t *vlc, int i_vlc, int i_lookup_bits )
  112. {
  113.     x264_vlc_table_t *table = x264_malloc( sizeof( x264_vlc_table_t ) );
  114.     table->i_lookup_bits = i_lookup_bits;
  115.     table->i_lookup = 0;
  116.     table->lookup   = NULL;
  117.     vlc_table_create_part( table, vlc, i_lookup_bits, i_vlc, 0, 0 );
  118.     return table;
  119. }
  120. void x264_vlc_table_lookup_delete( x264_vlc_table_t *table )
  121. {
  122.     x264_free( table->lookup );
  123.     x264_free( table );
  124. }
  125. #if 0
  126. void x264_vlc_table_lookup_print( x264_vlc_table_t *table )
  127. {
  128.     int idx;
  129.     fprintf( stderr, "       " );
  130.     for( idx = 0; idx < table->i_lookup; idx++ )
  131.     {
  132.         if( table->lookup[idx].i_value == -1 )
  133.         {
  134.             fprintf( stderr, " MKVLCLU(    -1,  0 )," );
  135.         }
  136.         else
  137.         {
  138.             fprintf( stderr, " MKVLCLU( 0x%.3x, % 2d ),", table->lookup[idx].i_value, table->lookup[idx].i_size );
  139.         }
  140.         if( (idx+1)%4 == 0 && idx < table->i_lookup - 1)
  141.         {
  142.             fprintf( stderr, "n       " );
  143.         }
  144.     }
  145.     fprintf( stderr, "n" );
  146. }
  147. int main(void)
  148. {
  149.     int i;
  150.     x264_vlc_table_t *table;
  151.     printf( "typedef structn    int i_value;n    int i_size;n} vlc_lookup_t;nn#define MKVLCLU(a,b) { .i_value=a, .i_size=b}" );
  152.     /* create vlc  entry table and then vlc_lookup_t table */
  153.     /* x264_coeff_token */
  154.     fprintf( stderr, "static const vlc_lookup_t x264_coeff_token_lookup[5][]=n{n" );
  155.     for( i = 0; i < 5; i++ )
  156.     {
  157.         fprintf( stderr, "    {n" );
  158.         table = x264_vlc_table_lookup_new( x264_coeff_token[i], 17*4, 6 );
  159.         x264_vlc_table_lookup_print( table );
  160.         x264_vlc_table_lookup_delete( table );
  161.         fprintf( stderr, "    },n" );
  162.     }
  163.     fprintf( stderr, "};n" );
  164. #if 0
  165.     vlce = convert_vlc_to_vlce( x264_level_prefix, 16 );
  166.     do_vlc_table_create( vlce, 16, "x264_level_prefix_lookup", 8 );
  167.     free( vlce );
  168.     for( i_table = 0; i_table < 15; i_table++ )
  169.     {
  170.         char name[512];
  171.         vlce = convert_vlc_to_vlce( x264_total_zeros[i_table], 16 );
  172.         sprintf( name, "x264_total_zeros_%d", i_table );
  173.         do_vlc_table_create( vlce, 16, name, 6 );
  174.         free( vlce );
  175.     }
  176.     for( i_table = 0; i_table < 3; i_table++ )
  177.     {
  178.         char name[512];
  179.         vlce = convert_vlc_to_vlce( x264_total_zeros_dc[i_table], 4 );
  180.         sprintf( name, "x264_total_zeros_dc_%d", i_table );
  181.         do_vlc_table_create( vlce, 4, name, 3 );
  182.         free( vlce );
  183.     }
  184.     for( i_table = 0; i_table < 7; i_table++ )
  185.     {
  186.         char name[512];
  187.         vlce = convert_vlc_to_vlce( x264_run_before[i_table], 15 );
  188.         sprintf( name, "x264_run_before_%d", i_table );
  189.         do_vlc_table_create( vlce, 15, name, 6 );
  190.         free( vlce );
  191.     }
  192. #endif
  193.     return 0;
  194. }
  195. #endif