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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * frame.c: MPEG2 video transrating module
  3.  *****************************************************************************
  4.  * Copyright (C) 2003-2004 VideoLAN
  5.  * Copyright (C) 2003 Antoine Missout <antoine.missout@metakine.com>
  6.  * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
  7.  * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
  8.  * $Id: frame.c 9038 2004-10-22 13:44:24Z massiot $
  9.  *
  10.  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  11.  *          Laurent Aimar <fenrir@via.ecp.fr>
  12.  *          Antoine Missout <antoine.missout@metakine.com>
  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. // useful constants
  46. enum
  47. {
  48.     I_TYPE = 1,
  49.     P_TYPE = 2,
  50.     B_TYPE = 3
  51. };
  52. /////---- begin ext mpeg code
  53. #include "putvlc.h"
  54. #include "getvlc.h"
  55. static const int non_linear_quantizer_scale [] =
  56. {
  57.      0,  1,  2,  3,  4,  5,   6,   7,
  58.      8, 10, 12, 14, 16, 18,  20,  22,
  59.     24, 28, 32, 36, 40, 44,  48,  52,
  60.     56, 64, 72, 80, 88, 96, 104, 112
  61. };
  62. static inline int get_macroblock_modes( transrate_t *tr )
  63. {
  64.     bs_transrate_t *bs = &tr->bs;
  65.     int macroblock_modes;
  66.     const MBtab * tab;
  67.     switch( tr->picture_coding_type )
  68.     {
  69.         case I_TYPE:
  70.             tab = MB_I + UBITS (bs->i_bit_in_cache, 1);
  71.             bs_flush( bs, tab->len );
  72.             macroblock_modes = tab->modes;
  73.             if ((!(tr->frame_pred_frame_dct)) && (tr->picture_structure == FRAME_PICTURE))
  74.             {
  75.                 macroblock_modes |= UBITS (bs->i_bit_in_cache, 1) * DCT_TYPE_INTERLACED;
  76.                 bs_flush( bs, 1 );
  77.             }
  78.             return macroblock_modes;
  79.         case P_TYPE:
  80.             tab = MB_P + UBITS (bs->i_bit_in_cache, 5);
  81.             bs_flush( bs, tab->len );
  82.             macroblock_modes = tab->modes;
  83.             if (tr->picture_structure != FRAME_PICTURE)
  84.             {
  85.                 if (macroblock_modes & MACROBLOCK_MOTION_FORWARD)
  86.                 {
  87.                     macroblock_modes |= UBITS (bs->i_bit_in_cache, 2) * MOTION_TYPE_BASE;
  88.                     bs_flush( bs, 2 );
  89.                 }
  90.                 return macroblock_modes;
  91.             }
  92.             else if (tr->frame_pred_frame_dct)
  93.             {
  94.                 if (macroblock_modes & MACROBLOCK_MOTION_FORWARD)
  95.                     macroblock_modes |= MC_FRAME;
  96.                 return macroblock_modes;
  97.             }
  98.             else
  99.             {
  100.                 if (macroblock_modes & MACROBLOCK_MOTION_FORWARD)
  101.                 {
  102.                     macroblock_modes |= UBITS (bs->i_bit_in_cache, 2) * MOTION_TYPE_BASE;
  103.                     bs_flush( bs, 2 );
  104.                 }
  105.                 if (macroblock_modes & (MACROBLOCK_INTRA | MACROBLOCK_PATTERN))
  106.                 {
  107.                     macroblock_modes |= UBITS (bs->i_bit_in_cache, 1) * DCT_TYPE_INTERLACED;
  108.                     bs_flush( bs, 1 );
  109.                 }
  110.                 return macroblock_modes;
  111.             }
  112.         case B_TYPE:
  113.             tab = MB_B + UBITS (bs->i_bit_in_cache, 6);
  114.             bs_flush( bs, tab->len );
  115.             macroblock_modes = tab->modes;
  116.             if( tr->picture_structure != FRAME_PICTURE)
  117.             {
  118.                 if (! (macroblock_modes & MACROBLOCK_INTRA))
  119.                 {
  120.                     macroblock_modes |= UBITS (bs->i_bit_in_cache, 2) * MOTION_TYPE_BASE;
  121.                     bs_flush( bs, 2 );
  122.                 }
  123.                 return macroblock_modes;
  124.             }
  125.             else if (tr->frame_pred_frame_dct)
  126.             {
  127.                 /* if (! (macroblock_modes & MACROBLOCK_INTRA)) */
  128.                 macroblock_modes |= MC_FRAME;
  129.                 return macroblock_modes;
  130.             }
  131.             else
  132.             {
  133.                 if (macroblock_modes & MACROBLOCK_INTRA) goto intra;
  134.                 macroblock_modes |= UBITS (bs->i_bit_in_cache, 2) * MOTION_TYPE_BASE;
  135.                 bs_flush( bs, 2 );
  136.                 if (macroblock_modes & (MACROBLOCK_INTRA | MACROBLOCK_PATTERN))
  137.                 {
  138.                     intra:
  139.                     macroblock_modes |= UBITS (bs->i_bit_in_cache, 1) * DCT_TYPE_INTERLACED;
  140.                     bs_flush( bs, 1 );
  141.                 }
  142.                 return macroblock_modes;
  143.             }
  144.         default:
  145.             return 0;
  146.     }
  147. }
  148. static inline int get_quantizer_scale( transrate_t *tr )
  149. {
  150.     bs_transrate_t *bs = &tr->bs;
  151.     int quantizer_scale_code;
  152.     quantizer_scale_code = UBITS (bs->i_bit_in_cache, 5);
  153.     bs_flush( bs, 5 );
  154.     if( tr->q_scale_type )
  155.         return non_linear_quantizer_scale[quantizer_scale_code];
  156.     else
  157.         return quantizer_scale_code << 1;
  158. }
  159. static inline int get_motion_delta( bs_transrate_t *bs, const int f_code )
  160. {
  161.     int delta;
  162.     int sign;
  163.     const MVtab * tab;
  164.     if (bs->i_bit_in_cache & 0x80000000)
  165.     {
  166.         bs_copy( bs, 1 );
  167.         return 0;
  168.     }
  169.     else if (bs->i_bit_in_cache >= 0x0c000000)
  170.     {
  171.         tab = MV_4 + UBITS (bs->i_bit_in_cache, 4);
  172.         delta = (tab->delta << f_code) + 1;
  173.         bs_copy( bs, tab->len);
  174.         sign = SBITS (bs->i_bit_in_cache, 1);
  175.         bs_copy( bs, 1 );
  176.         if (f_code)
  177.         {
  178.             delta += UBITS (bs->i_bit_in_cache, f_code);
  179.             bs_copy( bs, f_code);
  180.         }
  181.         return (delta ^ sign) - sign;
  182.     }
  183.     else
  184.     {
  185.         tab = MV_10 + UBITS (bs->i_bit_in_cache, 10);
  186.         delta = (tab->delta << f_code) + 1;
  187.         bs_copy( bs, tab->len);
  188.         sign = SBITS (bs->i_bit_in_cache, 1);
  189.         bs_copy( bs, 1);
  190.         if (f_code)
  191.         {
  192.             delta += UBITS (bs->i_bit_in_cache, f_code);
  193.             bs_copy( bs, f_code);
  194.         }
  195.         return (delta ^ sign) - sign;
  196.     }
  197. }
  198. static inline int get_dmv( bs_transrate_t *bs )
  199. {
  200.     const DMVtab * tab;
  201.     tab = DMV_2 + UBITS (bs->i_bit_in_cache, 2);
  202.     bs_copy( bs, tab->len);
  203.     return tab->dmv;
  204. }
  205. static inline int get_coded_block_pattern( bs_transrate_t *bs )
  206. {
  207.     const CBPtab * tab;
  208.     if (bs->i_bit_in_cache >= 0x20000000)
  209.     {
  210.         tab = CBP_7 + (UBITS (bs->i_bit_in_cache, 7) - 16);
  211.         bs_flush( bs, tab->len );
  212.         return tab->cbp;
  213.     }
  214.     else
  215.     {
  216.         tab = CBP_9 + UBITS (bs->i_bit_in_cache, 9);
  217.         bs_flush( bs, tab->len );
  218.         return tab->cbp;
  219.     }
  220. }
  221. static inline int get_luma_dc_dct_diff( bs_transrate_t *bs, uint32_t *bits, uint8_t *len )
  222. {
  223.     const DCtab * tab;
  224.     int size;
  225.     int dc_diff;
  226.     if (bs->i_bit_in_cache < 0xf8000000)
  227.     {
  228.         tab = DC_lum_5 + UBITS (bs->i_bit_in_cache, 5);
  229.         size = tab->size;
  230.         if (size)
  231.         {
  232.             *bits = bs_read( bs, tab->len );
  233.             *len = tab->len;
  234.             //dc_diff = UBITS (bs->i_bit_in_cache, size) - UBITS (SBITS (~bs->i_bit_in_cache, 1), size);
  235.             dc_diff = UBITS (bs->i_bit_in_cache, size);
  236.             if (!(dc_diff >> (size - 1))) dc_diff = (dc_diff + 1) - (1 << size);
  237.             *bits <<= size;
  238.             *bits |= bs_read( bs, size );
  239.             *len += size;
  240.             return dc_diff;
  241.         }
  242.         else
  243.         {
  244.             *bits = bs_read( bs, 3 );
  245.             *len = 3;
  246.             return 0;
  247.         }
  248.     }
  249.     else
  250.     {
  251.         tab = DC_long + (UBITS (bs->i_bit_in_cache, 9) - 0x1e0);
  252.         size = tab->size;
  253.         *bits = bs_read( bs, tab->len );
  254.         *len = tab->len;
  255.         //dc_diff = UBITS (bs->i_bit_in_cache, size) - UBITS (SBITS (~bs->i_bit_in_cache, 1), size);
  256.         dc_diff = UBITS (bs->i_bit_in_cache, size);
  257.         if (!(dc_diff >> (size - 1))) dc_diff = (dc_diff + 1) - (1 << size);
  258.         *bits <<= size;
  259.         *bits |= bs_read( bs, size );
  260.         *len += size;
  261.         return dc_diff;
  262.     }
  263. }
  264. static inline int get_chroma_dc_dct_diff( bs_transrate_t *bs, uint32_t *bits, uint8_t *len )
  265. {
  266.     const DCtab * tab;
  267.     int size;
  268.     int dc_diff;
  269.     if (bs->i_bit_in_cache < 0xf8000000)
  270.     {
  271.         tab = DC_chrom_5 + UBITS (bs->i_bit_in_cache, 5);
  272.         size = tab->size;
  273.         if (size)
  274.         {
  275.             *bits = bs_read( bs, tab->len );
  276.             *len = tab->len;
  277.             //dc_diff = UBITS (bs->i_bit_in_cache, size) - UBITS (SBITS (~bs->i_bit_in_cache, 1), size);
  278.             dc_diff = UBITS (bs->i_bit_in_cache, size);
  279.             if (!(dc_diff >> (size - 1))) dc_diff = (dc_diff + 1) - (1 << size);
  280.             *bits <<= size;
  281.             *bits |= bs_read( bs, size );
  282.             *len += size;
  283.             return dc_diff;
  284.         }
  285.         else
  286.         {
  287.             *bits = bs_read( bs, 2 );
  288.             *len = 2;
  289.             return 0;
  290.         }
  291.     }
  292.     else
  293.     {
  294.         tab = DC_long + (UBITS (bs->i_bit_in_cache, 10) - 0x3e0);
  295.         size = tab->size;
  296.         *bits = bs_read( bs, tab->len + 1 );
  297.         *len = tab->len + 1;
  298.         //dc_diff = UBITS (bs->i_bit_in_cache, size) - UBITS (SBITS (~bs->i_bit_in_cache, 1), size);
  299.         dc_diff = UBITS (bs->i_bit_in_cache, size);
  300.         if (!(dc_diff >> (size - 1))) dc_diff = (dc_diff + 1) - (1 << size);
  301.         *bits <<= size;
  302.         *bits |= bs_read( bs, size );
  303.         *len += size;
  304.         return dc_diff;
  305.     }
  306. }
  307. static void motion_fr_frame( bs_transrate_t *bs, unsigned int f_code[2] )
  308. {
  309.     get_motion_delta( bs, f_code[0] );
  310.     get_motion_delta( bs, f_code[1] );
  311. }
  312. static void motion_fr_field( bs_transrate_t *bs, unsigned int f_code[2] )
  313. {
  314.     bs_copy( bs, 1);
  315.     get_motion_delta( bs, f_code[0]);
  316.     get_motion_delta( bs, f_code[1]);
  317.     bs_copy( bs, 1);
  318.     get_motion_delta( bs, f_code[0]);
  319.     get_motion_delta( bs, f_code[1]);
  320. }
  321. static void motion_fr_dmv( bs_transrate_t *bs, unsigned int f_code[2] )
  322. {
  323.     get_motion_delta( bs, f_code[0]);
  324.     get_dmv( bs );
  325.     get_motion_delta( bs, f_code[1]);
  326.     get_dmv( bs );
  327. }
  328. static void motion_fi_field( bs_transrate_t *bs, unsigned int f_code[2] )
  329. {
  330.     bs_copy( bs, 1);
  331.     get_motion_delta( bs, f_code[0]);
  332.     get_motion_delta( bs, f_code[1]);
  333. }
  334. static void motion_fi_16x8( bs_transrate_t *bs, unsigned int f_code[2] )
  335. {
  336.     bs_copy( bs, 1);
  337.     get_motion_delta( bs, f_code[0]);
  338.     get_motion_delta( bs, f_code[1]);
  339.     bs_copy( bs, 1);
  340.     get_motion_delta( bs, f_code[0]);
  341.     get_motion_delta( bs, f_code[1]);
  342. }
  343. static void motion_fi_dmv( bs_transrate_t *bs, unsigned int f_code[2] )
  344. {
  345.     get_motion_delta( bs, f_code[0]);
  346.     get_dmv( bs );
  347.     get_motion_delta( bs, f_code[1]);
  348.     get_dmv( bs );
  349. }
  350. #define MOTION_CALL(routine,direction)                      
  351. do {                                                        
  352.     if ((direction) & MACROBLOCK_MOTION_FORWARD)            
  353.         routine( bs, tr->f_code[0]);                        
  354.     if ((direction) & MACROBLOCK_MOTION_BACKWARD)           
  355.         routine( bs, tr->f_code[1]);                        
  356. } while (0)
  357. #define NEXT_MACROBLOCK                                         
  358. do {                                                            
  359.     tr->h_offset += 16;                                         
  360.     if( tr->h_offset == tr->horizontal_size_value)              
  361.     {                                                           
  362.         tr->v_offset += 16;                                         
  363.         if (tr->v_offset > (tr->vertical_size_value - 16)) return;      
  364.         tr->h_offset = 0;                                       
  365.     }                                                           
  366. } while (0)
  367. static void putmbdata( transrate_t *tr, int macroblock_modes )
  368. {
  369.     bs_transrate_t *bs = &tr->bs;
  370.     bs_write( bs,
  371.               mbtypetab[tr->picture_coding_type-1][macroblock_modes&0x1F].code,
  372.               mbtypetab[tr->picture_coding_type-1][macroblock_modes&0x1F].len);
  373.     switch ( tr->picture_coding_type )
  374.     {
  375.         case I_TYPE:
  376.             if ((! (tr->frame_pred_frame_dct)) && (tr->picture_structure == FRAME_PICTURE))
  377.                 bs_write( bs, macroblock_modes & DCT_TYPE_INTERLACED ? 1 : 0, 1);
  378.             break;
  379.         case P_TYPE:
  380.             if (tr->picture_structure != FRAME_PICTURE)
  381.             {
  382.                 if (macroblock_modes & MACROBLOCK_MOTION_FORWARD)
  383.                     bs_write( bs, (macroblock_modes & MOTION_TYPE_MASK) / MOTION_TYPE_BASE, 2);
  384.                 break;
  385.             }
  386.             else if (tr->frame_pred_frame_dct) break;
  387.             else
  388.             {
  389.                 if (macroblock_modes & MACROBLOCK_MOTION_FORWARD)
  390.                     bs_write( bs, (macroblock_modes & MOTION_TYPE_MASK) / MOTION_TYPE_BASE, 2);
  391.                 if (macroblock_modes & (MACROBLOCK_INTRA | MACROBLOCK_PATTERN))
  392.                     bs_write( bs, macroblock_modes & DCT_TYPE_INTERLACED ? 1 : 0, 1);
  393.                 break;
  394.             }
  395.         case B_TYPE:
  396.             if (tr->picture_structure != FRAME_PICTURE)
  397.             {
  398.                 if (! (macroblock_modes & MACROBLOCK_INTRA))
  399.                     bs_write( bs, (macroblock_modes & MOTION_TYPE_MASK) / MOTION_TYPE_BASE, 2);
  400.                 break;
  401.             }
  402.             else if (tr->frame_pred_frame_dct) break;
  403.             else
  404.             {
  405.                 if (macroblock_modes & MACROBLOCK_INTRA) goto intra;
  406.                 bs_write( bs, (macroblock_modes & MOTION_TYPE_MASK) / MOTION_TYPE_BASE, 2);
  407.                 if (macroblock_modes & (MACROBLOCK_INTRA | MACROBLOCK_PATTERN))
  408.                 {
  409.                     intra:
  410.                     bs_write( bs, macroblock_modes & DCT_TYPE_INTERLACED ? 1 : 0, 1);
  411.                 }
  412.                 break;
  413.             }
  414.     }
  415. }
  416. static const uint8_t map_non_linear_mquant[113] =
  417. {
  418.     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,
  419.     16,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,22,22,
  420.     22,22,23,23,23,23,24,24,24,24,24,24,24,25,25,25,25,25,25,25,26,26,
  421.     26,26,26,26,26,26,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,29,
  422.     29,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,31,31,31,31,31
  423. };
  424. static inline void put_quantiser( transrate_t *tr )
  425. {
  426.     bs_transrate_t *bs = &tr->bs;
  427.     bs_write( bs, tr->q_scale_type ? map_non_linear_mquant[tr->new_quantizer_scale] : tr->new_quantizer_scale >> 1, 5 );
  428.     tr->last_coded_scale = tr->new_quantizer_scale;
  429. }
  430. /* generate variable length code for macroblock_address_increment (6.3.16) */
  431. static inline void putaddrinc( transrate_t *tr, int addrinc )
  432. {
  433.     bs_transrate_t *bs = &tr->bs;
  434.     while ( addrinc >= 33 )
  435.     {
  436.         bs_write( bs, 0x08, 11 ); /* macroblock_escape */
  437.         addrinc -= 33;
  438.     }
  439.     bs_write( bs, addrinctab[addrinc].code, addrinctab[addrinc].len );
  440. }
  441. static int slice_init( transrate_t *tr,  int code )
  442. {
  443.     bs_transrate_t *bs = &tr->bs;
  444.     int offset;
  445.     const MBAtab * mba;
  446.     tr->v_offset = (code - 1) * 16;
  447.     tr->quantizer_scale = get_quantizer_scale( tr );
  448.     if ( tr->new_quantizer_scale < tr->quantizer_scale )
  449.         tr->new_quantizer_scale = scale_quant( tr, tr->qrate );
  450.     /*LOGF("************************nstart of slice %i in %s picture. ori quant: %i new quant: %in", code,
  451.         (picture_coding_type == I_TYPE ? "I_TYPE" : (picture_coding_type == P_TYPE ? "P_TYPE" : "B_TYPE")),
  452.         quantizer_scale, new_quantizer_scale);*/
  453.     /* ignore intra_slice and all the extra data */
  454.     while (bs->i_bit_in_cache & 0x80000000)
  455.     {
  456.         bs_flush( bs, 9 );
  457.     }
  458.     /* decode initial macroblock address increment */
  459.     offset = 0;
  460.     for( ;; )
  461.     {
  462.         if (bs->i_bit_in_cache >= 0x08000000)
  463.         {
  464.             mba = MBA_5 + (UBITS (bs->i_bit_in_cache, 6) - 2);
  465.             break;
  466.         }
  467.         else if (bs->i_bit_in_cache >= 0x01800000)
  468.         {
  469.             mba = MBA_11 + (UBITS (bs->i_bit_in_cache, 12) - 24);
  470.             break;
  471.         }
  472.         else if( UBITS (bs->i_bit_in_cache, 12 ) == 8 )
  473.         {
  474.             /* macroblock_escape */
  475.             offset += 33;
  476.             bs_flush(bs, 11);
  477.         }
  478.         else
  479.         {
  480.             return -1;
  481.         }
  482.     }
  483.     bs_flush(bs, mba->len + 1);
  484.     tr->h_offset = (offset + mba->mba) << 4;
  485.     while( tr->h_offset - (int)tr->horizontal_size_value >= 0)
  486.     {
  487.         tr->h_offset -= tr->horizontal_size_value;
  488.         tr->v_offset += 16;
  489.     }
  490.     if( tr->v_offset > tr->vertical_size_value - 16 )
  491.     {
  492.         return -1;
  493.     }
  494.     return (offset + mba->mba);
  495. }
  496. static void mpeg2_slice( transrate_t *tr, const int code )
  497. {
  498.     bs_transrate_t *bs = &tr->bs;
  499.     int mba_inc;
  500.     int first_in_slice = 1;
  501.     if( (mba_inc = slice_init( tr, code )) < 0 )
  502.     {
  503.         return;
  504.     }
  505.     for( ;; )
  506.     {
  507.         const MBAtab * mba;
  508.         int macroblock_modes;
  509.         int mba_local;
  510.         int i;
  511.         while (unlikely(bs->i_bit_in < 24)) bs_refill( bs );
  512.         macroblock_modes = get_macroblock_modes( tr );
  513.         if (macroblock_modes & MACROBLOCK_QUANT)
  514.             tr->quantizer_scale = get_quantizer_scale( tr );
  515.         if (tr->new_quantizer_scale < tr->quantizer_scale)
  516.             tr->new_quantizer_scale = scale_quant( tr, tr->qrate );
  517.         //LOGF("blk %i : ", h_offset >> 4);
  518.         if (macroblock_modes & MACROBLOCK_INTRA)
  519.         {
  520.             RunLevel block[6][65]; // terminated by level = 0, so we need 64+1
  521.             RunLevel new_block[6][65]; // terminated by level = 0, so we need 64+1
  522.             uint32_t dc[6];
  523.             uint8_t  dc_len[6];
  524.             // begin saving data
  525.             int batb;
  526.             uint8_t   p_n_ow[32], *p_n_w,
  527.                     *p_o_ow = bs->p_ow, *p_o_w = bs->p_w;
  528.             uint32_t  i_n_bit_out, i_n_bit_out_cache,
  529.                     i_o_bit_out  = bs->i_bit_out, i_o_bit_out_cache = bs->i_bit_out_cache;
  530.             bs->i_bit_out_cache = 0; bs->i_bit_out = BITS_IN_BUF;
  531.             bs->p_ow = bs->p_w = p_n_ow;
  532.             //LOG("intra "); if (macroblock_modes & MACROBLOCK_QUANT) LOGF("got new quant: %i ", quantizer_scale);
  533.             if (tr->concealment_motion_vectors)
  534.             {
  535.                 if (tr->picture_structure != FRAME_PICTURE)
  536.                 {
  537.                     bs_copy(bs, 1); /* remove field_select */
  538.                 }
  539.                 /* like motion_frame, but parsing without actual motion compensation */
  540.                 get_motion_delta(bs, tr->f_code[0][0]);
  541.                 get_motion_delta(bs, tr->f_code[0][1]);
  542.                 bs_copy(bs, 1); /* remove marker_bit */
  543.             }
  544.             assert(bs->p_w - bs->p_ow < 32);
  545.             p_n_w = bs->p_w;
  546.             i_n_bit_out = bs->i_bit_out;
  547.             i_n_bit_out_cache = bs->i_bit_out_cache;
  548.             assert(bs->p_ow == p_n_ow);
  549.             bs->i_bit_out = i_o_bit_out ;
  550.             bs->i_bit_out_cache = i_o_bit_out_cache;
  551.             bs->p_ow = p_o_ow;
  552.             bs->p_w = p_o_w;
  553.             // end saving data
  554.             if( tr->intra_vlc_format )
  555.             {
  556.                 /* Luma */
  557.                 for ( i = 0; i < 4; i++ )
  558.                 {
  559.                     get_luma_dc_dct_diff( bs, dc + i, dc_len + i );
  560.                     get_intra_block_B15( tr, block[i] );
  561.                     if (tr->b_error) return;
  562.                 }
  563.                 /* Chroma */
  564.                 for ( ; i < 6; i++ )
  565.                 {
  566.                     get_chroma_dc_dct_diff( bs, dc + i, dc_len + i );
  567.                     get_intra_block_B15( tr, block[i] );
  568.                     if (tr->b_error) return;
  569.                 }
  570.             }
  571.             else
  572.             {
  573.                 /* Luma */
  574.                 for ( i = 0; i < 4; i++ )
  575.                 {
  576.                     get_luma_dc_dct_diff( bs, dc + i, dc_len + i );
  577.                     get_intra_block_B14( tr, block[i] );
  578.                     if (tr->b_error) return;
  579.                 }
  580.                 /* Chroma */
  581.                 for ( ; i < 6; i++ )
  582.                 {
  583.                     get_chroma_dc_dct_diff( bs, dc + i, dc_len + i );
  584.                     get_intra_block_B14( tr, block[i] );
  585.                     if (tr->b_error) return;
  586.                 }
  587.             }
  588.             transrate_mb( tr, block, new_block, 0x3f, 1 );
  589.             if (tr->last_coded_scale == tr->new_quantizer_scale)
  590.                 macroblock_modes &= ~MACROBLOCK_QUANT;
  591.             if ( first_in_slice )
  592.             {
  593.                 put_quantiser( tr );
  594.                 bs_write( bs, 0, 1 );
  595.                 macroblock_modes &= ~MACROBLOCK_QUANT;
  596.             }
  597.             putaddrinc( tr, mba_inc );
  598.             mba_inc = 0;
  599.             putmbdata( tr, macroblock_modes );
  600.             if( macroblock_modes & MACROBLOCK_QUANT )
  601.             {
  602.                 put_quantiser( tr );
  603.             }
  604.             // put saved motion data...
  605.             for (batb = 0; batb < (p_n_w - p_n_ow); batb++)
  606.             {
  607.                 bs_write( bs, p_n_ow[batb], 8 );
  608.             }
  609.             bs_write( bs, i_n_bit_out_cache, BITS_IN_BUF - i_n_bit_out );
  610.             // end saved motion data...
  611.             for ( i = 0; i < 6; i++ )
  612.             {
  613.                 bs_write( bs, *(dc + i), *(dc_len + i) );
  614.                 putintrablk( bs, new_block[i], tr->intra_vlc_format );
  615.             }
  616.     
  617.         }
  618.         else
  619.         {
  620.             RunLevel block[6][65]; // terminated by level = 0, so we need 64+1
  621.             RunLevel new_block[6][65]; // terminated by level = 0, so we need 64+1
  622.             int new_coded_block_pattern = 0;
  623.             int cbp = 0;
  624.             // begin saving data
  625.             int batb;
  626.             uint8_t   p_n_ow[32], *p_n_w,
  627.                     *p_o_ow = bs->p_ow, *p_o_w = bs->p_w;
  628.             uint32_t  i_n_bit_out, i_n_bit_out_cache,
  629.                     i_o_bit_out  = bs->i_bit_out, i_o_bit_out_cache = bs->i_bit_out_cache;
  630.             bs->i_bit_out_cache = 0; bs->i_bit_out = BITS_IN_BUF;
  631.             bs->p_ow = bs->p_w = p_n_ow;
  632.             if (tr->picture_structure == FRAME_PICTURE)
  633.                 switch (macroblock_modes & MOTION_TYPE_MASK)
  634.                 {
  635.                     case MC_FRAME: MOTION_CALL (motion_fr_frame, macroblock_modes); break;
  636.                     case MC_FIELD: MOTION_CALL (motion_fr_field, macroblock_modes); break;
  637.                     case MC_DMV: MOTION_CALL (motion_fr_dmv, MACROBLOCK_MOTION_FORWARD); break;
  638.                 }
  639.             else
  640.                 switch (macroblock_modes & MOTION_TYPE_MASK)
  641.                 {
  642.                     case MC_FIELD: MOTION_CALL (motion_fi_field, macroblock_modes); break;
  643.                     case MC_16X8: MOTION_CALL (motion_fi_16x8, macroblock_modes); break;
  644.                     case MC_DMV: MOTION_CALL (motion_fi_dmv, MACROBLOCK_MOTION_FORWARD); break;
  645.                 }
  646.             //LOG("non intra "); if (macroblock_modes & MACROBLOCK_QUANT) LOGF("got new quant: %i ", quantizer_scale);
  647.             if (macroblock_modes & MACROBLOCK_PATTERN)
  648.             {
  649.                 int last_in_slice;
  650.                 cbp = get_coded_block_pattern( bs );
  651.                 for ( i = 0; i < 6; i++ )
  652.                 {
  653.                     if ( cbp & (1 << (5 - i)) )
  654.                     {
  655.                         get_non_intra_block( tr, block[i] );
  656.                         if (tr->b_error) return;
  657.                     }
  658.                 }
  659.                 last_in_slice = !UBITS( bs->i_bit_in_cache, 11 );
  660.                 new_coded_block_pattern = transrate_mb( tr, block, new_block,
  661.                                                         cbp, 0 );
  662.                 if ( !new_coded_block_pattern &&
  663.                         !(macroblock_modes
  664.                             & (MACROBLOCK_MOTION_FORWARD
  665.                                 | MACROBLOCK_MOTION_BACKWARD))
  666.                         && (first_in_slice || last_in_slice) )
  667.                 {
  668.                     /* First mb in slice, just code a 0-mv mb.
  669.                      * This is wrong for last in slice, but it only shows
  670.                      * a few artefacts. */
  671.                     macroblock_modes |= MACROBLOCK_MOTION_FORWARD;
  672.                     if (tr->picture_structure == FRAME_PICTURE)
  673.                     {
  674.                         macroblock_modes |= MC_FRAME;
  675.                         bs_write( bs, 0x3, 2 ); /* motion vectors */
  676.                     }
  677.                     else
  678.                     {
  679.                         macroblock_modes |= MC_FIELD;
  680.                         bs_write( bs,
  681.                              (tr->picture_structure == BOTTOM_FIELD ? 1 : 0),
  682.                              1); /* motion field select */
  683.                         bs_write( bs, 0x3, 2 ); /* motion vectors */
  684.                     }
  685.                 }
  686.                 if ( !new_coded_block_pattern )
  687.                 {
  688.                     macroblock_modes &= ~MACROBLOCK_PATTERN;
  689.                     macroblock_modes &= ~MACROBLOCK_QUANT;
  690.                 }
  691.                 else
  692.                 {
  693.                     if ( tr->last_coded_scale == tr->new_quantizer_scale )
  694.                     {
  695.                         macroblock_modes &= ~MACROBLOCK_QUANT;
  696.                     }
  697.                     else
  698.                     {
  699.                         macroblock_modes |= MACROBLOCK_QUANT;
  700.                     }
  701.                 }
  702.             }
  703.             assert(bs->p_w - bs->p_ow < 32);
  704.             p_n_w = bs->p_w;
  705.             i_n_bit_out = bs->i_bit_out;
  706.             i_n_bit_out_cache = bs->i_bit_out_cache;
  707.             assert(bs->p_ow == p_n_ow);
  708.             bs->i_bit_out = i_o_bit_out ;
  709.             bs->i_bit_out_cache = i_o_bit_out_cache;
  710.             bs->p_ow = p_o_ow;
  711.             bs->p_w = p_o_w;
  712.             // end saving data
  713.             if ( macroblock_modes &
  714.                     (MACROBLOCK_MOTION_FORWARD | MACROBLOCK_MOTION_BACKWARD
  715.                       | MACROBLOCK_PATTERN) )
  716.             {
  717.                 if ( first_in_slice )
  718.                 {
  719.                     put_quantiser( tr );
  720.                     bs_write( bs, 0, 1 );
  721.                     macroblock_modes &= ~MACROBLOCK_QUANT;
  722.                 }
  723.                 putaddrinc( tr, mba_inc );
  724.                 mba_inc = 0;
  725.                 putmbdata( tr, macroblock_modes );
  726.                 if ( macroblock_modes & MACROBLOCK_QUANT )
  727.                 {
  728.                     put_quantiser( tr );
  729.                 }
  730.                 // put saved motion data...
  731.                 for (batb = 0; batb < (p_n_w - p_n_ow); batb++)
  732.                 {
  733.                     bs_write( bs, p_n_ow[batb], 8 );
  734.                 }
  735.                 bs_write( bs, i_n_bit_out_cache, BITS_IN_BUF - i_n_bit_out);
  736.                 // end saved motion data...
  737.                 if (macroblock_modes & MACROBLOCK_PATTERN)
  738.                 {
  739.                     /* Write CBP */
  740.                     bs_write( bs, cbptable[new_coded_block_pattern].code,
  741.                               cbptable[new_coded_block_pattern].len );
  742.                     for ( i = 0; i < 6; i++ )
  743.                     {
  744.                         if ( new_coded_block_pattern & (1 << (5 - i)) )
  745.                         {
  746.                             putnonintrablk( bs, new_block[i] );
  747.                         }
  748.                     }
  749.                 }
  750.             }
  751.             else
  752.             {
  753.                 /* skipped macroblock */
  754.                 mba_inc++;
  755.             }
  756.         }
  757.         if (bs->p_c > bs->p_r || bs->p_w > bs->p_rw)
  758.         {
  759.             tr->b_error = 1;
  760.             return;
  761.         }
  762.         //LOGF("nto: %i c: %i n: %in", quantizer_scale, last_coded_scale, new_quantizer_scale);
  763.         NEXT_MACROBLOCK;
  764.         first_in_slice = 0;
  765.         mba_local = 0;
  766.         for ( ; ; )
  767.         {
  768.             if ( bs->i_bit_in_cache >= 0x10000000 )
  769.             {
  770.                 mba = MBA_5 + (UBITS (bs->i_bit_in_cache, 5) - 2);
  771.                 break;
  772.             }
  773.             else if ( bs->i_bit_in_cache >= 0x03000000 )
  774.             {
  775.                 mba = MBA_11 + (UBITS (bs->i_bit_in_cache, 11) - 24);
  776.                 break;
  777.             }
  778.             else if ( UBITS( bs->i_bit_in_cache, 11 ) == 8 )
  779.             {
  780.                 /* macroblock_escape */
  781.                 mba_inc += 33;
  782.                 mba_local += 33;
  783.                 bs_flush(bs, 11);
  784.             }
  785.             else
  786.             {
  787.                 /* EOS or error */
  788.                 return;
  789.             }
  790.         }
  791.         bs_flush(bs, mba->len);
  792.         mba_inc += mba->mba;
  793.         mba_local += mba->mba;
  794.         while( mba_local-- )
  795.         {
  796.             NEXT_MACROBLOCK;
  797.         }
  798.     }
  799. }
  800. static const uint8_t mpeg2_scan_norm[64] ATTR_ALIGN(16) = {
  801.     /* Zig-Zag scan pattern */
  802.      0,  1,  8, 16,  9,  2,  3, 10, 17, 24, 32, 25, 18, 11,  4,  5,
  803.     12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13,  6,  7, 14, 21, 28,
  804.     35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
  805.     58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
  806. };
  807. static const uint8_t mpeg2_scan_alt[64] ATTR_ALIGN(16) = {
  808.     /* Alternate scan pattern */
  809.      0, 8,  16, 24,  1,  9,  2, 10, 17, 25, 32, 40, 48, 56, 57, 49,
  810.     41, 33, 26, 18,  3, 11,  4, 12, 19, 27, 34, 42, 50, 58, 35, 43,
  811.     51, 59, 20, 28,  5, 13,  6, 14, 21, 29, 36, 44, 52, 60, 37, 45,
  812.     53, 61, 22, 30,  7, 15, 23, 31, 38, 46, 54, 62, 39, 47, 55, 63
  813. };
  814. static const int16_t default_intra_matrix[64] = {
  815.         8, 16, 19, 22, 26, 27, 29, 34,
  816.         16, 16, 22, 24, 27, 29, 34, 37,
  817.         19, 22, 26, 27, 29, 34, 34, 38,
  818.         22, 22, 26, 27, 29, 34, 37, 40,
  819.         22, 26, 27, 29, 32, 35, 40, 48,
  820.         26, 27, 29, 32, 35, 40, 48, 58,
  821.         26, 27, 29, 34, 38, 46, 56, 69,
  822.         27, 29, 35, 38, 46, 56, 69, 83
  823. };
  824. static int mpeg2_header_sequence( transrate_t * tr )
  825. {
  826.     bs_transrate_t *bs = &tr->bs;
  827.     int has_intra = 0, has_non_intra = 0;
  828.     int i;
  829.     i = (bs->p_c[0] << 16) | (bs->p_c[1] << 8) | bs->p_c[2];
  830.     tr->horizontal_size_value = i >> 12;
  831.     tr->vertical_size_value = i & 0xfff;
  832.     tr->horizontal_size_value = (tr->horizontal_size_value + 15) & ~15;
  833.     tr->vertical_size_value = (tr->vertical_size_value + 15) & ~15;
  834.     if ( !tr->horizontal_size_value || !tr->vertical_size_value )
  835.     {
  836.         return -1;
  837.     }
  838.     if ( tr->mpeg4_matrix )
  839.     {
  840.         if (bs->p_c[7] & 2)
  841.         {
  842.             has_intra = 1;
  843.             for (i = 0; i < 64; i++)
  844.                 tr->intra_quantizer_matrix[mpeg2_scan_norm[i]] =
  845.                 (bs->p_c[i+7] << 7) | (bs->p_c[i+8] >> 1);
  846.         }
  847.         else
  848.         {
  849.             for (i = 0; i < 64; i++)
  850.                 tr->intra_quantizer_matrix[mpeg2_scan_norm[i]] =
  851.                 default_intra_matrix[i];
  852.         }
  853.         if (bs->p_c[7+64] & 1)
  854.         {
  855.             has_non_intra = 1;
  856.             for (i = 0; i < 64; i++)
  857.                 tr->non_intra_quantizer_matrix[mpeg2_scan_norm[i]] =
  858.                 bs->p_c[i+8+64];
  859.         }
  860.         else
  861.         {
  862.             for (i = 0; i < 64; i++)
  863.                 tr->non_intra_quantizer_matrix[i] = 16;
  864.         }
  865.     }
  866.     /* Write quantization matrices */
  867.     memcpy( bs->p_w, bs->p_c, 8 );
  868.     bs->p_c += 8;
  869.     if ( tr->mpeg4_matrix )
  870.     {
  871.         memset( &bs->p_w[8], 0, 128 );
  872.         bs->p_w[7] |= 2;
  873.         bs->p_w[7] &= ~1;
  874.         for (i = 0; i < 64; i++)
  875.         {
  876.             bs->p_w[i+7] |= mpeg4_default_intra_matrix[mpeg2_scan_norm[i]] >> 7;
  877.             bs->p_w[i+8] |= mpeg4_default_intra_matrix[mpeg2_scan_norm[i]] << 1;
  878.         }
  879.         bs->p_w[7+64] |= 1;
  880.         for (i = 0; i < 64; i++)
  881.         {
  882.             bs->p_w[i+8+64] |= mpeg4_default_intra_matrix[mpeg2_scan_norm[i]];
  883.         }
  884.         bs->p_w += 8 + 128;
  885.         bs->p_c += (has_intra + has_non_intra) * 64;
  886.     }
  887.     else
  888.     {
  889.         bs->p_w += 8;
  890.     }
  891.     tr->scan = mpeg2_scan_norm;
  892.     return 0;
  893. }
  894. /////---- end ext mpeg code
  895. static int do_next_start_code( transrate_t *tr )
  896. {
  897.     bs_transrate_t *bs = &tr->bs;
  898.     uint8_t ID;
  899.     // get start code
  900.     ID = bs->p_c[0];
  901.     /* Copy one byte */
  902.     *bs->p_w++ = *bs->p_c++;
  903.     if (ID == 0x00) // pic header
  904.     {
  905.         tr->picture_coding_type = (bs->p_c[1] >> 3) & 0x7;
  906.         bs->p_c[1] |= 0x7; bs->p_c[2] = 0xFF; bs->p_c[3] |= 0xF8; // vbv_delay is now 0xFFFF
  907.         memcpy(bs->p_w, bs->p_c, 4);
  908.         bs->p_c += 4;
  909.         bs->p_w += 4;
  910.     }
  911.     else if (ID == 0xB3) // seq header
  912.     {
  913.         mpeg2_header_sequence(tr);
  914.     }
  915.     else if (ID == 0xB5) // extension
  916.     {
  917.         if ((bs->p_c[0] >> 4) == 0x8) // pic coding ext
  918.         {
  919.             tr->f_code[0][0] = (bs->p_c[0] & 0xF) - 1;
  920.             tr->f_code[0][1] = (bs->p_c[1] >> 4) - 1;
  921.             tr->f_code[1][0] = (bs->p_c[1] & 0xF) - 1;
  922.             tr->f_code[1][1] = (bs->p_c[2] >> 4) - 1;
  923.             /* tr->intra_dc_precision = (bs->p_c[2] >> 2) & 0x3; */
  924.             tr->picture_structure = bs->p_c[2] & 0x3;
  925.             tr->frame_pred_frame_dct = (bs->p_c[3] >> 6) & 0x1;
  926.             tr->concealment_motion_vectors = (bs->p_c[3] >> 5) & 0x1;
  927.             tr->q_scale_type = (bs->p_c[3] >> 4) & 0x1;
  928.             tr->intra_vlc_format = (bs->p_c[3] >> 3) & 0x1;
  929.             if ( (bs->p_c[3] >> 2) & 0x1 )
  930.                 tr->scan = mpeg2_scan_alt;
  931.             memcpy(bs->p_w, bs->p_c, 5);
  932.             bs->p_c += 5;
  933.             bs->p_w += 5;
  934.         }
  935.         else
  936.         {
  937.             *bs->p_w++ = *bs->p_c++;
  938.         }
  939.     }
  940.     else if (ID == 0xB8) // gop header
  941.     {
  942.         memcpy(bs->p_w, bs->p_c, 4);
  943.         bs->p_c += 4;
  944.         bs->p_w += 4;
  945.     }
  946.     else if ((ID >= 0x01) && (ID <= 0xAF)) // slice
  947.     {
  948.         uint8_t *outTemp = bs->p_w, *inTemp = bs->p_c;
  949.         if( tr->qrate != 1.0 )
  950.         {
  951.             if( !tr->horizontal_size_value || !tr->vertical_size_value )
  952.             {
  953.                 return -1;
  954.             }
  955.             // init bit buffer
  956.             bs->i_bit_in_cache = 0; bs->i_bit_in = 0;
  957.             bs->i_bit_out_cache = 0; bs->i_bit_out = BITS_IN_BUF;
  958.             // get 32 bits
  959.             bs_refill( bs );
  960.             bs_refill( bs );
  961.             bs_refill( bs );
  962.             bs_refill( bs );
  963.             // begin bit level recoding
  964.             mpeg2_slice(tr, ID);
  965.             if (tr->b_error) return -1;
  966.             bs_flush_read( bs );
  967.             bs_flush_write( bs );
  968.             // end bit level recoding
  969.             /* Basic sanity checks --Meuuh */
  970.             if (bs->p_c > bs->p_r || bs->p_w > bs->p_rw)
  971.             {
  972.                 return -1;
  973.             }
  974.             /*LOGF("type: %s code: %02i in : %6i out : %6i diff : %6i fact: %2.2fn",
  975.             (picture_coding_type == I_TYPE ? "I_TYPE" : (picture_coding_type == P_TYPE ? "P_TYPE" : "B_TYPE")),
  976.             ID,  bs->p_c - inTemp, bs->p_w - outTemp, (bs->p_w - outTemp) - (bs->p_c - inTemp), (float)(bs->p_c - inTemp) / (float)(bs->p_w - outTemp));*/
  977.             if (bs->p_w - outTemp > bs->p_c - inTemp) // yes that might happen, rarely
  978.             {
  979.                 /*LOGF("*** slice bigger than before !! (type: %s code: %i in : %i out : %i diff : %i)n",
  980.                 (picture_coding_type == I_TYPE ? "I_TYPE" : (picture_coding_type == P_TYPE ? "P_TYPE" : "B_TYPE")),
  981.                 ID, bs->p_c - inTemp, bs->p_w - outTemp, (bs->p_w - outTemp) - (bs->p_c - inTemp));*/
  982.                 if ( !tr->mpeg4_matrix )
  983.                 {
  984.                     // in this case, we'll just use the original slice !
  985.                     memcpy(outTemp, inTemp, bs->p_c - inTemp);
  986.                     bs->p_w = outTemp + (bs->p_c - inTemp);
  987.                     // adjust bs->i_byte_out
  988.                     bs->i_byte_out -= (bs->p_w - outTemp) - (bs->p_c - inTemp);
  989.                 }
  990.                 else
  991.                 {
  992.                     fprintf(stderr, "bad choice for mpeg4-matrix...n");
  993.                 }
  994.             }
  995.         }
  996.     }
  997.     return 0;
  998. }
  999. int process_frame( sout_stream_t *p_stream, sout_stream_id_t *id,
  1000.                    block_t *in, block_t **out, int i_handicap )
  1001. {
  1002.     transrate_t *tr = &id->tr;
  1003.     bs_transrate_t *bs = &tr->bs;
  1004.     block_t       *p_out;
  1005.     double        f_drift, f_fact;
  1006.     int           i_drift;
  1007.     p_out = block_New( p_stream, in->i_buffer * 3 );
  1008.     p_out->i_length = in->i_length;
  1009.     p_out->i_dts    = in->i_dts;
  1010.     p_out->i_pts    = in->i_pts;
  1011.     p_out->i_flags  = in->i_flags;
  1012.     bs->p_rw = bs->p_ow = bs->p_w = p_out->p_buffer;
  1013.     bs->p_c = bs->p_r = in->p_buffer;
  1014.     bs->p_r += in->i_buffer + 4;
  1015.     bs->p_rw += in->i_buffer * 2;
  1016.     *(in->p_buffer + in->i_buffer) = 0;
  1017.     *(in->p_buffer + in->i_buffer + 1) = 0;
  1018.     *(in->p_buffer + in->i_buffer + 2) = 1;
  1019.     *(in->p_buffer + in->i_buffer + 3) = 0;
  1020.     /* Calculate how late we are */
  1021.     bs->i_byte_in = in->i_buffer;
  1022.     bs->i_byte_out  = 0;
  1023.     i_drift = tr->i_current_output + tr->i_remaining_input
  1024.                 - tr->i_wanted_output;
  1025.     f_drift = (double)i_drift / tr->i_wanted_output;
  1026.     f_fact = (double)(tr->i_wanted_output - tr->i_current_output)
  1027.                     / tr->i_remaining_input;
  1028.     if ( in->i_flags & BLOCK_FLAG_TYPE_I )
  1029.     {
  1030.         /* This is the last picture of the GOP ; only transrate if we're
  1031.          * very late. */
  1032.         if ( 0 && f_drift > 0.085 )
  1033.         {
  1034.             tr->i_minimum_error = (f_drift - 0.085) * 50.0 * 50.0;
  1035.             tr->i_admissible_error = (f_drift - 0.085) * 50.0 * 75.0;
  1036.             tr->qrate = 1.0 + (f_drift - 0.085) * 50.0;
  1037.             msg_Warn( p_stream, "transrating I %d/%d",
  1038.                       tr->i_minimum_error, tr->i_admissible_error );
  1039.         }
  1040.         else
  1041.         {
  1042.             tr->i_minimum_error = 0;
  1043.             tr->i_admissible_error = 0;
  1044.             tr->qrate = 1.0;
  1045.         }
  1046.     }
  1047.     else if ( in->i_flags & BLOCK_FLAG_TYPE_P )
  1048.     {
  1049.         if ( f_fact < 0.8 )
  1050.         {
  1051.             tr->i_minimum_error = (0.8 - f_fact) * 3000.0 + i_handicap;
  1052.             tr->i_admissible_error = (0.8 - f_fact) * 3500.0 + i_handicap;
  1053.             tr->qrate = 1.0 + (0.8 - f_fact) * 70.0;
  1054.         }
  1055.         else
  1056.         {
  1057.             tr->i_minimum_error = 0;
  1058.             tr->i_admissible_error = 0;
  1059.             tr->qrate = 1.0;
  1060.         }
  1061.     }
  1062.     else
  1063.     {
  1064.         if ( f_fact < 1.2 )
  1065.         {
  1066.             tr->i_minimum_error = (1.2 - f_fact) * 1750.0 + i_handicap;
  1067.             tr->i_admissible_error = (1.2 - f_fact) * 2250.0 + i_handicap;
  1068.             tr->qrate = 1.0 + (1.2 - f_fact) * 45.0;
  1069.         }
  1070.         else
  1071.         {
  1072.             tr->i_minimum_error = 0;
  1073.             tr->i_admissible_error = 0;
  1074.             tr->qrate = 1.0;
  1075.         }
  1076.     }
  1077.     tr->new_quantizer_scale = 0;
  1078.     tr->b_error = 0;
  1079.     for ( ; ; )
  1080.     {
  1081.         uint8_t *p_end = &in->p_buffer[in->i_buffer];
  1082.         /* Search next start code */
  1083.         for( ;; )
  1084.         {
  1085.             if( bs->p_c < p_end - 3 && bs->p_c[0] == 0 && bs->p_c[1] == 0 && bs->p_c[2] == 1 )
  1086.             {
  1087.                 /* Next start code */
  1088.                 break;
  1089.             }
  1090.             else if( bs->p_c < p_end - 6 &&
  1091.                      bs->p_c[0] == 0 && bs->p_c[1] == 0 && bs->p_c[2] == 0 &&
  1092.                      bs->p_c[3] == 0 && bs->p_c[4] == 0 && bs->p_c[5] == 0 )
  1093.             {
  1094.                 /* remove stuffing (looking for 6 0x00 bytes) */
  1095.                 bs->p_c++;
  1096.             }
  1097.             else
  1098.             {
  1099.                 /* Copy */
  1100.                 *bs->p_w++ = *bs->p_c++;
  1101.             }
  1102.             if( bs->p_c >= p_end )
  1103.             {
  1104.                 break;
  1105.             }
  1106.         }
  1107.         if( bs->p_c >= p_end )
  1108.         {
  1109.             break;
  1110.         }
  1111.         /* Copy the start code */
  1112.         memcpy( bs->p_w, bs->p_c, 3 );
  1113.         bs->p_c += 3;
  1114.         bs->p_w += 3;
  1115.         if ( do_next_start_code( tr ) )
  1116.         {
  1117.             /* Error */
  1118.             msg_Err( p_stream, "error in do_next_start_code()" );
  1119.             block_Release( p_out );
  1120.             tr->i_remaining_input -= in->i_buffer;
  1121.             tr->i_current_output += in->i_buffer;
  1122.             return -1;
  1123.         }
  1124.     }
  1125.     bs->i_byte_out += bs->p_w - bs->p_ow;
  1126.     p_out->i_buffer = bs->p_w - bs->p_ow;
  1127. #if 0
  1128.     if ( in->i_flags & BLOCK_FLAG_TYPE_P && f_fact < 0.8 )
  1129.     {
  1130.         double f_ratio = (in->i_buffer - p_out->i_buffer) / in->i_buffer;
  1131.         if ( f_ratio < (0.8 - f_fact) * 0.1 && i_handicap < 200 )
  1132.         {
  1133.             block_Release( p_out );
  1134.             return process_frame( p_stream, id, in, out, i_handicap + 50 );
  1135.         }
  1136.     }
  1137.     if ( in->i_flags & BLOCK_FLAG_TYPE_B && f_fact < 1.1 )
  1138.     {
  1139.         double f_ratio = (double)(in->i_buffer - p_out->i_buffer)
  1140.                             / in->i_buffer;
  1141.         if ( f_ratio < (1.1 - f_fact) * 0.1 && i_handicap < 400 )
  1142.         {
  1143. #ifdef DEBUG_TRANSRATER
  1144.             msg_Dbg( p_stream, "%d: %d -> %d big (f: %f d: %f)",
  1145.                      tr->picture_coding_type, in->i_buffer, p_out->i_buffer,
  1146.                      f_fact, f_drift);
  1147. #endif
  1148.             block_Release( p_out );
  1149.             return process_frame( p_stream, id, in, out, i_handicap + 100 );
  1150.         }
  1151.     }
  1152. #endif
  1153. #if 0
  1154.     {
  1155.         int toto;
  1156.         for ( toto = 0; toto < p_out->i_buffer; toto++ )
  1157.             if (in->p_buffer[toto] != p_out->p_buffer[toto])
  1158.                 msg_Dbg(p_stream, "toto %d %x %x", toto, in->p_buffer[toto], p_out->p_buffer[toto]);
  1159.     }
  1160. #endif
  1161.     block_ChainAppend( out, p_out );
  1162.     tr->i_remaining_input -= in->i_buffer;
  1163.     tr->i_current_output += p_out->i_buffer;
  1164. #ifdef DEBUG_TRANSRATER
  1165.     msg_Dbg( p_stream, "%d: %d -> %d (%d/%d)",
  1166.              tr->picture_coding_type, in->i_buffer, p_out->i_buffer,
  1167.              tr->i_minimum_error, tr->i_admissible_error );
  1168. #endif
  1169.     return 0;
  1170. }