block.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:23k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * block.c: MPEG2 video transrating module
  3.  *****************************************************************************
  4.  * Copyright (C) 2003-2004 VideoLAN
  5.  * Copyright (C) 2003 Antoine Missout
  6.  * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
  7.  * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
  8.  * $Id: block.c 7423 2004-04-22 09:26:15Z sam $
  9.  *
  10.  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  11.  *          Laurent Aimar <fenrir@via.ecp.fr>
  12.  *          Antoine Missout
  13.  *          Michel Lespinasse <walken@zoy.org>
  14.  *          Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
  15.  *
  16.  * This program is free software; you can redistribute it and/or modify
  17.  * it under the terms of the GNU General Public License as published by
  18.  * the Free Software Foundation; either version 2 of the License, or
  19.  * (at your option) any later version.
  20.  *
  21.  * This program is distributed in the hope that it will be useful,
  22.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  23.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  24.  * GNU General Public License for more details.
  25.  *
  26.  * You should have received a copy of the GNU General Public License
  27.  * along with this program; if not, write to the Free Software
  28.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  29.  *****************************************************************************/
  30. /*****************************************************************************
  31.  * Preamble
  32.  *****************************************************************************/
  33. #include <stdio.h>
  34. #include <stdlib.h>
  35. #define NDEBUG 1
  36. #include <assert.h>
  37. #include <math.h>
  38. #include <vlc/vlc.h>
  39. #include <vlc/sout.h>
  40. #include <vlc/input.h>
  41. #include "transrate.h"
  42. /****************************************************************************
  43.  * transrater, code from M2VRequantizer http://www.metakine.com/
  44.  ****************************************************************************/
  45. /////---- begin ext mpeg code
  46. #include "getvlc.h"
  47. #include "putvlc.h"
  48. static inline int saturate( int i_value )
  49. {
  50.     if ( i_value > 2047 )
  51.         return 2047;
  52.     if ( i_value < -2048 )
  53.         return -2048;
  54.     return i_value;
  55. }
  56. static int64_t get_score( const RunLevel *blk, RunLevel *new_blk, int i_qscale, int i_qscale_new )
  57. {
  58.     int64_t score = 0;
  59.     int i1 = -1, i2 = -1;
  60.     while ( new_blk->level )
  61.     {
  62.         int new_level = new_blk->level;
  63.         int level = blk->level;
  64. if ( i1 > 64 || i2 > 64 || !blk->run || !new_blk->run ) return score;
  65.         if ( i1 + blk->run == i2 + new_blk->run )
  66.         {
  67.             int64_t tmp = saturate(level * i_qscale) 
  68.                             - saturate(new_level * i_qscale_new);
  69.             i1 += blk->run;
  70.             i2 += new_blk->run;
  71.             score += tmp * tmp;
  72.             blk++;
  73.             new_blk++;
  74.         }
  75.         else
  76.         {
  77.             int64_t tmp = saturate(level * i_qscale);
  78.             i1 += blk->run;
  79.             score += tmp * tmp;
  80.             blk++;
  81.         }
  82.     }
  83.     while ( blk->level )
  84.     {
  85.         int level = blk->level;
  86.         int64_t tmp = saturate(level * i_qscale);
  87.         i1 += blk->run;
  88.         score += tmp * tmp;
  89.         blk++;
  90.     }
  91.     return score;
  92. }
  93. static void change_qscale( const RunLevel *blk, RunLevel *new_blk, int i_qscale, int i_qscale_new, int intra )
  94. {
  95.     int i = 0, li = 0;
  96.     int rounding;
  97.     if ( intra )
  98.         rounding = i_qscale_new / 3;
  99.     else
  100.         rounding = i_qscale_new / 6;
  101.     while ( blk->level )
  102.     {
  103.         int level = blk->level > 0 ? blk->level : -blk->level;
  104.         int new_level = saturate(level * i_qscale) / i_qscale_new;
  105.         i += blk->run;
  106.         if ( new_level )
  107.         {
  108.             new_blk->run = i - li;
  109.             new_blk->level = blk->level > 0 ? new_level : -new_level;
  110.             new_blk++;
  111.             li = i;
  112.         }
  113.         blk++;
  114.     }
  115.     new_blk->level = 0;
  116. }
  117. static const uint8_t non_linear_mquant_table[32] =
  118. {
  119.     0, 1, 2, 3, 4, 5, 6, 7,
  120.     8,10,12,14,16,18,20,22,
  121.     24,28,32,36,40,44,48,52,
  122.     56,64,72,80,88,96,104,112
  123. };
  124. static const uint8_t map_non_linear_mquant[113] =
  125. {
  126.     0,1,2,3,4,5,6,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,
  127.     16,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,22,22,
  128.     22,22,23,23,23,23,24,24,24,24,24,24,24,25,25,25,25,25,25,25,26,26,
  129.     26,26,26,26,26,26,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,29,
  130.     29,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,31,31,31,31,31
  131. };
  132. int scale_quant( transrate_t *tr, double qrate )
  133. {
  134.     int i_quant = (int)floor( tr->quantizer_scale * qrate + 0.5 );
  135.     if ( tr->q_scale_type )
  136.     {
  137.         if ( i_quant < 1 )
  138.             i_quant = 1;
  139.         if ( i_quant > 112 )
  140.             i_quant = 112;
  141.         i_quant = non_linear_mquant_table[map_non_linear_mquant[i_quant]];
  142.     }
  143.     else
  144.     {
  145.         if ( i_quant < 2 )
  146.             i_quant = 2;
  147.         if ( i_quant > 62 )
  148.             i_quant = 62;
  149.         i_quant = (i_quant / 2) * 2; // Must be *even*
  150.     }
  151.     return i_quant;
  152. }
  153. int increment_quant( transrate_t *tr, int i_quant )
  154. {
  155.     if ( tr->q_scale_type )
  156.     {
  157.         assert( i_quant >= 1 && i_quant <= 112 );
  158.         i_quant = map_non_linear_mquant[i_quant] + 1;
  159.         if ( i_quant > 31 )
  160.             i_quant = 31;
  161.         i_quant = non_linear_mquant_table[i_quant];
  162.     }
  163.     else
  164.     {
  165.         assert(!(i_quant & 1));
  166.         i_quant += 2;
  167.         if ( i_quant > 62 )
  168.             i_quant = 62;
  169.     }
  170.     return i_quant;
  171. }
  172. static int decrement_quant( transrate_t *tr, int i_quant )
  173. {
  174.     if ( tr->q_scale_type )
  175.     {
  176.         assert( i_quant >= 1 && i_quant <= 112 );
  177.         i_quant = map_non_linear_mquant[i_quant] - 1;
  178.         if ( i_quant < 1 )
  179.             i_quant = 1;
  180.         i_quant = non_linear_mquant_table[i_quant];
  181.     }
  182.     else
  183.     {
  184.         assert(!(i_quant & 1));
  185.         i_quant -= 2;
  186.         if ( i_quant < 2 )
  187.             i_quant = 2;
  188.     }
  189.     return i_quant;
  190. }
  191. static void quantize_block( transrate_t *tr, RunLevel *new_blk, int intra )
  192. {
  193.     RunLevel old_blk[65];
  194.     RunLevel *blk = old_blk;
  195.     const uint8_t *old_matrix, *new_matrix;
  196.     int i = 0, li = 0;
  197.     memcpy( blk, new_blk, 65 * sizeof(RunLevel) );
  198.     if ( intra )
  199.     {
  200.         old_matrix = tr->intra_quantizer_matrix;
  201.         new_matrix = mpeg4_default_intra_matrix;
  202.     }
  203.     else
  204.     {
  205.         old_matrix = tr->non_intra_quantizer_matrix;
  206.         new_matrix = mpeg4_default_non_intra_matrix;
  207.     }
  208.     while ( blk->level )
  209.     {
  210.         int level = blk->level > 0 ? blk->level : -blk->level;
  211.         int new_level = (level * old_matrix[i] + new_matrix[i]/2)
  212.                             / new_matrix[i];
  213.         i += blk->run;
  214.         if (new_level)
  215.         {
  216.             new_blk->run = i - li;
  217.             new_blk->level = blk->level > 0 ? new_level : -new_level;
  218.             new_blk++;
  219.             li = i;
  220.         }
  221.         blk++;
  222.     }
  223.     new_blk->level = 0;
  224. }
  225. int transrate_mb( transrate_t *tr, RunLevel blk[6][65], RunLevel new_blk[6][65],
  226.                   int i_cbp, int intra )
  227. {
  228.     int i_qscale = tr->quantizer_scale;
  229.     int i_guessed_qscale = tr->new_quantizer_scale;
  230.     int64_t i_last_error = 0;
  231.     int i_last_qscale;
  232.     int i_last_qscale_same_error = 0;
  233.     int i_direction = 0;
  234.     int i_new_cbp;
  235.     int i_nb_blocks = 0;
  236.     int i_nb_coeffs = 0;
  237.     int i;
  238.     for ( i = 0; i < 6; i++ )
  239.     {
  240.         if ( i_cbp & (1 << (5 - i)) )
  241.         {
  242.             RunLevel *cur_blk = blk[i];
  243.             i_nb_blocks++;
  244.             while ( cur_blk->level )
  245.             {
  246.                 cur_blk++;
  247.                 i_nb_coeffs++;
  248.             }
  249.         }
  250.     }
  251.     /* See if we can change quantizer scale */
  252.     for ( ; ; )
  253.     {
  254.         int64_t i_error = 0;
  255.         i_new_cbp = 0;
  256.         for ( i = 0; i < 6; i++ )
  257.         {
  258.             if ( i_cbp & (1 << (5 - i)) )
  259.             {
  260.                 int64_t i_block_error;
  261.                 change_qscale( blk[i], new_blk[i], i_qscale, i_guessed_qscale,
  262.                                intra );
  263.                 i_block_error = get_score( blk[i], new_blk[i],
  264.                                            i_qscale, i_guessed_qscale );
  265.                 if ( i > 3 ) i_block_error *= 4;
  266.                 if ( i_block_error > i_error )
  267.                     i_error = i_block_error;
  268.                 if ( new_blk[i]->level )
  269.                     i_new_cbp |= (1 << (5 - i));
  270.             }
  271.         }
  272.         if ( i_error >= (int64_t)tr->i_minimum_error
  273.                 && i_error <= (int64_t)tr->i_admissible_error )
  274.         {
  275.             break;
  276.         }
  277.         if ( i_nb_coeffs <= 15 && i_error <= (int64_t)tr->i_admissible_error )
  278.         {
  279.             /* There is no interest in changing the qscale (takes up 5 bits
  280.              * we won't regain) */
  281.             break;
  282.         }
  283.         if ( !i_direction )
  284.         {
  285.             if ( i_error > (int64_t)tr->i_admissible_error )
  286.             {
  287.                 i_direction = -1;
  288.                 i_last_qscale = i_guessed_qscale;
  289.                 i_guessed_qscale = decrement_quant( tr, i_guessed_qscale );
  290.             }
  291.             else
  292.             {
  293.                 i_direction = +1;
  294.                 i_last_qscale = i_guessed_qscale;
  295.                 i_guessed_qscale = increment_quant( tr, i_guessed_qscale );
  296.                 i_last_error = i_error;
  297.                 i_last_qscale_same_error = i_last_qscale;
  298.             }
  299.             if ( i_guessed_qscale == i_last_qscale )
  300.                 break;
  301.         }
  302.         else if ( i_direction < 0 )
  303.         {
  304.             if ( i_error > (int64_t)tr->i_admissible_error )
  305.             {
  306.                 i_last_qscale = i_guessed_qscale;
  307.                 i_guessed_qscale = decrement_quant( tr, i_guessed_qscale );
  308.                 if ( i_guessed_qscale == i_last_qscale )
  309.                     break;
  310.             }
  311.             else
  312.             {
  313.                 break;
  314.             }
  315.         }
  316.         else
  317.         {
  318.             if ( i_error < (int64_t)tr->i_minimum_error )
  319.             {
  320.                 i_last_qscale = i_guessed_qscale;
  321.                 i_guessed_qscale = increment_quant( tr, i_guessed_qscale );
  322.                 if ( i_error > i_last_error )
  323.                 {
  324.                     i_last_error = i_error;
  325.                     i_last_qscale_same_error = i_last_qscale;
  326.                 }
  327.                 if ( i_guessed_qscale == i_last_qscale )
  328.                 {
  329.                     if ( i_last_error == i_error )
  330.                     {
  331.                         i_guessed_qscale = i_last_qscale_same_error;
  332.                         if ( i_guessed_qscale == i_qscale )
  333.                         {
  334.                             memcpy( new_blk, blk, sizeof(RunLevel)*65*6 );
  335.                             i_new_cbp = i_cbp;
  336.                         }
  337.                         else
  338.                         {
  339.                             i_new_cbp = 0;
  340.                             for ( i = 0; i < 6; i++ )
  341.                             {
  342.                                 if ( i_cbp & (1 << (5 - i)) )
  343.                                 {
  344.                                     change_qscale( blk[i], new_blk[i],
  345.                                                    i_qscale, i_guessed_qscale,
  346.                                                    intra );
  347.                                     if ( new_blk[i]->level )
  348.                                         i_new_cbp |= (1 << (5 - i));
  349.                                 }
  350.                             }
  351.                         }
  352.                     }
  353.                     break;
  354.                 }
  355.             }
  356.             else
  357.             {
  358.                 if ( i_error > (int64_t)tr->i_admissible_error
  359.                         || i_last_error == i_error )
  360.                 {
  361.                     i_guessed_qscale = i_last_qscale_same_error;
  362.                     if ( i_guessed_qscale == i_qscale )
  363.                     {
  364.                         memcpy( new_blk, blk, sizeof(RunLevel)*65*6 );
  365.                         i_new_cbp = i_cbp;
  366.                     }
  367.                     else
  368.                     {
  369.                         i_new_cbp = 0;
  370.                         for ( i = 0; i < 6; i++ )
  371.                         {
  372.                             if ( i_cbp & (1 << (5 - i)) )
  373.                             {
  374.                                 change_qscale( blk[i], new_blk[i],
  375.                                                i_qscale, i_guessed_qscale,
  376.                                                intra );
  377.                                 if ( new_blk[i]->level )
  378.                                     i_new_cbp |= (1 << (5 - i));
  379.                             }
  380.                         }
  381.                     }
  382.                 }
  383.                 break;
  384.             }
  385.         }
  386.     }
  387.     tr->new_quantizer_scale = i_guessed_qscale;
  388. #if 0
  389.     /* Now see if we can drop coeffs */
  390.     for ( i = 0; i < 6; i++ )
  391.     {
  392.         if ( i_new_cbp & (1 << (5 - i)) )
  393.         {
  394.             for ( ; ; )
  395.             {
  396.                 RunLevel *last_blk = new_blk[i];
  397.                 uint8_t old_level;
  398.                 while ( last_blk[1].level )
  399.                     last_blk++;
  400.                 if ( last_blk == new_blk[i] )
  401.                     break;
  402.                 old_level = last_blk->level;
  403.                 last_blk->level = 0;
  404.                 i_error = get_score( blk[i], new_blk[i],
  405.                                      i_qscale, i_guessed_qscale );
  406.                 if ( i_error > tr->i_admissible_error )
  407.                 {
  408.                     last_blk->level = old_level;
  409.                     break;
  410.                 }
  411.             }
  412.         }
  413.     }
  414. #endif
  415.     return i_new_cbp;
  416. }
  417. void get_intra_block_B14( transrate_t *tr, RunLevel *blk )
  418. {
  419.     bs_transrate_t *bs = &tr->bs;
  420.     int i, li;
  421.     int val;
  422.     const DCTtab * tab;
  423.     li = i = 0;
  424.     for( ;; )
  425.     {
  426.         if (bs->i_bit_in_cache >= 0x28000000)
  427.         {
  428.             tab = DCT_B14AC_5 + (UBITS (bs->i_bit_in_cache, 5) - 5);
  429.             i += tab->run;
  430.             if (i >= 64) break; /* end of block */
  431.     normal_code:
  432.             bs_flush( bs, tab->len );
  433.             val = tab->level;
  434.             val = (val ^ SBITS (bs->i_bit_in_cache, 1)) - SBITS (bs->i_bit_in_cache, 1);
  435.             blk->level = val;
  436.             blk->run = i - li - 1;
  437.             li = i;
  438.             blk++;
  439.             bs_flush( bs, 1 );
  440.             continue;
  441.         }
  442.         else if (bs->i_bit_in_cache >= 0x04000000)
  443.         {
  444.             tab = DCT_B14_8 + (UBITS (bs->i_bit_in_cache, 8) - 4);
  445.             i += tab->run;
  446.             if (i < 64) goto normal_code;
  447.             /* escape code */
  448.             i += (UBITS (bs->i_bit_in_cache, 12) & 0x3F) - 64;
  449.             if (i >= 64) break; /* illegal, check needed to avoid buffer overflow */
  450.             bs_flush( bs, 12 );
  451.             val = SBITS (bs->i_bit_in_cache, 12);
  452.             blk->level = val;
  453.             blk->run = i - li - 1;
  454.             li = i;
  455.             blk++;
  456.             bs_flush( bs, 12 );
  457.             continue;
  458.         }
  459.         else if (bs->i_bit_in_cache >= 0x02000000)
  460.         {
  461.             tab = DCT_B14_10 + (UBITS (bs->i_bit_in_cache, 10) - 8);
  462.             i += tab->run;
  463.             if (i < 64 ) goto normal_code;
  464.         }
  465.         else if (bs->i_bit_in_cache >= 0x00800000)
  466.         {
  467.             tab = DCT_13 + (UBITS (bs->i_bit_in_cache, 13) - 16);
  468.             i += tab->run;
  469.             if (i < 64 ) goto normal_code;
  470.         }
  471.         else if (bs->i_bit_in_cache >= 0x00200000)
  472.         {
  473.             tab = DCT_15 + (UBITS (bs->i_bit_in_cache, 15) - 16);
  474.             i += tab->run;
  475.             if (i < 64 ) goto normal_code;
  476.         }
  477.         else
  478.         {
  479.             tab = DCT_16 + UBITS (bs->i_bit_in_cache, 16);
  480.             bs_flush( bs, 16 );
  481.             i += tab->run;
  482.             if (i < 64 ) goto normal_code;
  483.         }
  484.         fprintf(stderr, "Err in B14n");
  485. tr->b_error = 1;
  486.         break;  /* illegal, check needed to avoid buffer overflow */
  487.     }
  488.     bs_flush( bs, 2 );    /* dump end of block code */
  489.     blk->level = 0;
  490.     if ( tr->mpeg4_matrix )
  491.         quantize_block( tr, blk, 1 );
  492. }
  493. void get_intra_block_B15( transrate_t *tr, RunLevel *blk )
  494. {
  495.     bs_transrate_t *bs = &tr->bs;
  496.     int i, li;
  497.     int val;
  498.     const DCTtab * tab;
  499.     li = i = 0;
  500.     for( ;; )
  501.     {
  502.         if (bs->i_bit_in_cache >= 0x04000000)
  503.         {
  504.             tab = DCT_B15_8 + (UBITS (bs->i_bit_in_cache, 8) - 4);
  505.             i += tab->run;
  506.             if (i < 64)
  507.             {
  508.     normal_code:
  509.                 bs_flush( bs, tab->len );
  510.                 val = tab->level;
  511.                 val = (val ^ SBITS (bs->i_bit_in_cache, 1)) - SBITS (bs->i_bit_in_cache, 1);
  512.                 blk->level = val;
  513.                 blk->run = i - li - 1;
  514.                 li = i;
  515.                 blk++;
  516.                 bs_flush( bs, 1 );
  517.                 continue;
  518.             }
  519.             else
  520.             {
  521.                 i += (UBITS (bs->i_bit_in_cache, 12) & 0x3F) - 64;
  522.                 if (i >= 64) break; /* illegal, check against buffer overflow */
  523.                 bs_flush( bs, 12 );
  524.                 val = SBITS (bs->i_bit_in_cache, 12);
  525.                 blk->level = val;
  526.                 blk->run = i - li - 1;
  527.                 li = i;
  528.                 blk++;
  529.                 bs_flush( bs, 12 );
  530.                 continue;
  531.             }
  532.         }
  533.         else if (bs->i_bit_in_cache >= 0x02000000)
  534.         {
  535.             tab = DCT_B15_10 + (UBITS (bs->i_bit_in_cache, 10) - 8);
  536.             i += tab->run;
  537.             if (i < 64) goto normal_code;
  538.         }
  539.         else if (bs->i_bit_in_cache >= 0x00800000)
  540.         {
  541.             tab = DCT_13 + (UBITS (bs->i_bit_in_cache, 13) - 16);
  542.             i += tab->run;
  543.             if (i < 64) goto normal_code;
  544.         }
  545.         else if (bs->i_bit_in_cache >= 0x00200000)
  546.         {
  547.             tab = DCT_15 + (UBITS (bs->i_bit_in_cache, 15) - 16);
  548.             i += tab->run;
  549.             if (i < 64) goto normal_code;
  550.         }
  551.         else
  552.         {
  553.             tab = DCT_16 + UBITS (bs->i_bit_in_cache, 16);
  554.             bs_flush( bs, 16 );
  555.             i += tab->run;
  556.             if (i < 64) goto normal_code;
  557.         }
  558.         fprintf(stderr, "Err in B15n");
  559. tr->b_error = 1;
  560.         break;  /* illegal, check needed to avoid buffer overflow */
  561.     }
  562.     bs_flush( bs, 4 );    /* dump end of block code */
  563.     blk->level = 0;
  564.     if ( tr->mpeg4_matrix )
  565.         quantize_block( tr, blk, 1 );
  566. }
  567. int get_non_intra_block( transrate_t *tr, RunLevel *blk )
  568. {
  569.     bs_transrate_t *bs = &tr->bs;
  570.     int i, li;
  571.     int val;
  572.     const DCTtab * tab;
  573.     li = i = -1;
  574.     if (bs->i_bit_in_cache >= 0x28000000)
  575.     {
  576.         tab = DCT_B14DC_5 + (UBITS (bs->i_bit_in_cache, 5) - 5);
  577.         goto entry_1;
  578.     }
  579.     else goto entry_2;
  580.     for( ;; )
  581.     {
  582.         if (bs->i_bit_in_cache >= 0x28000000)
  583.         {
  584.             tab = DCT_B14AC_5 + (UBITS (bs->i_bit_in_cache, 5) - 5);
  585.     entry_1:
  586.             i += tab->run;
  587.             if (i >= 64)
  588.             break;  /* end of block */
  589.     normal_code:
  590.             bs_flush( bs, tab->len );
  591.             val = tab->level;
  592.             val = (val ^ SBITS (bs->i_bit_in_cache, 1)) - SBITS (bs->i_bit_in_cache, 1);
  593.             blk->level = val;
  594.             blk->run = i - li - 1;
  595.             li = i;
  596.             blk++;
  597.             //if ( ((val) && (tab->level < tst)) || ((!val) && (tab->level >= tst)) )
  598.             //  LOGF("level: %i val: %i tst : %i q: %i nq : %in", tab->level, val, tst, q, nq);
  599.             bs_flush( bs, 1 );
  600.             continue;
  601.         }
  602.     entry_2:
  603.         if (bs->i_bit_in_cache >= 0x04000000)
  604.         {
  605.             tab = DCT_B14_8 + (UBITS (bs->i_bit_in_cache, 8) - 4);
  606.             i += tab->run;
  607.             if (i < 64) goto normal_code;
  608.             /* escape code */
  609.             i += (UBITS (bs->i_bit_in_cache, 12) & 0x3F) - 64;
  610.             if (i >= 64) break; /* illegal, check needed to avoid buffer overflow */
  611.             bs_flush( bs, 12 );
  612.             val = SBITS (bs->i_bit_in_cache, 12);
  613.             blk->level = val;
  614.             blk->run = i - li - 1;
  615.             li = i;
  616.             blk++;
  617.             bs_flush( bs, 12 );
  618.             continue;
  619.         }
  620.         else if (bs->i_bit_in_cache >= 0x02000000)
  621.         {
  622.             tab = DCT_B14_10 + (UBITS (bs->i_bit_in_cache, 10) - 8);
  623.             i += tab->run;
  624.             if (i < 64) goto normal_code;
  625.         }
  626.         else if (bs->i_bit_in_cache >= 0x00800000)
  627.         {
  628.             tab = DCT_13 + (UBITS (bs->i_bit_in_cache, 13) - 16);
  629.             i += tab->run;
  630.             if (i < 64) goto normal_code;
  631.         }
  632.         else if (bs->i_bit_in_cache >= 0x00200000)
  633.         {
  634.             tab = DCT_15 + (UBITS (bs->i_bit_in_cache, 15) - 16);
  635.             i += tab->run;
  636.             if (i < 64) goto normal_code;
  637.         }
  638.         else
  639.         {
  640.             tab = DCT_16 + UBITS (bs->i_bit_in_cache, 16);
  641.             bs_flush( bs, 16 );
  642.             i += tab->run;
  643.             if (i < 64) goto normal_code;
  644.         }
  645.         fprintf(stderr, "Err in non-intran");
  646. tr->b_error = 1;
  647.         break;  /* illegal, check needed to avoid buffer overflow */
  648.     }
  649.     bs_flush( bs, 2 );    /* dump end of block code */
  650.     blk->level = 0;
  651.     if ( tr->mpeg4_matrix )
  652.         quantize_block( tr, blk, 0 );
  653.     return i;
  654. }
  655. static inline void putAC( bs_transrate_t *bs, int run, int signed_level, int vlcformat)
  656. {
  657.     int level, len;
  658.     const VLCtable *ptab = NULL;
  659.     level = (signed_level<0) ? -signed_level : signed_level; /* abs(signed_level) */
  660.     assert(!(run<0 || run>63 || level==0 || level>2047));
  661.     len = 0;
  662.     if (run<2 && level<41)
  663.     {
  664.         if (vlcformat)  ptab = &dct_code_tab1a[run][level-1];
  665.         else ptab = &dct_code_tab1[run][level-1];
  666.         len = ptab->len;
  667.     }
  668.     else if (run<32 && level<6)
  669.     {
  670.         if (vlcformat) ptab = &dct_code_tab2a[run-2][level-1];
  671.         else ptab = &dct_code_tab2[run-2][level-1];
  672.         len = ptab->len;
  673.     }
  674.     if (len) /* a VLC code exists */
  675.     {
  676.         bs_write( bs, ptab->code, len);
  677.         bs_write( bs, signed_level<0, 1); /* sign */
  678.     }
  679.     else
  680.     {
  681.         bs_write( bs, 1l, 6); /* Escape */
  682.         bs_write( bs, run, 6); /* 6 bit code for run */
  683.         bs_write( bs, ((unsigned int)signed_level) & 0xFFF, 12);
  684.     }
  685. }
  686. static inline void putACfirst( bs_transrate_t *bs, int run, int val)
  687. {
  688.     if (run==0 && (val==1 || val==-1)) bs_write( bs, 2|(val<0), 2 );
  689.     else putAC( bs, run, val, 0);
  690. }
  691. void putnonintrablk( bs_transrate_t *bs, RunLevel *blk)
  692. {
  693.     assert(blk->level);
  694.     putACfirst( bs, blk->run, blk->level );
  695.     blk++;
  696.     while (blk->level)
  697.     {
  698.         putAC( bs, blk->run, blk->level, 0 );
  699.         blk++;
  700.     }
  701.     bs_write( bs, 2, 2 );
  702. }
  703. void putintrablk( bs_transrate_t *bs, RunLevel *blk, int vlcformat)
  704. {
  705.     while (blk->level)
  706.     {
  707.         putAC( bs, blk->run, blk->level, vlcformat );
  708.         blk++;
  709.     }
  710.     if (vlcformat)
  711.         bs_write( bs, 6, 4 );
  712.     else
  713.         bs_write( bs, 2, 2 );
  714. }