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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * transrate.h: MPEG2 video transrating module
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 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: transrate.h 7411 2004-04-21 15:54:09Z massiot $
  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.  * sout_stream_id_t:
  32.  *****************************************************************************/
  33. typedef struct
  34. {
  35.     uint8_t run;
  36.     short level;
  37. } RunLevel;
  38. typedef struct
  39. {
  40.     uint8_t *p_c;
  41.     uint8_t *p_r;
  42.     uint8_t *p_w;
  43.     uint8_t *p_ow;
  44.     uint8_t *p_rw;
  45.     int i_bit_in;
  46.     int i_bit_out;
  47.     uint32_t i_bit_in_cache;
  48.     uint32_t i_bit_out_cache;
  49.     uint32_t i_byte_in;
  50.     uint32_t i_byte_out;
  51. } bs_transrate_t;
  52. typedef struct
  53. {
  54.     bs_transrate_t bs;
  55.     /* MPEG2 state */
  56.     // seq header
  57.     unsigned int horizontal_size_value;
  58.     unsigned int vertical_size_value;
  59.     uint8_t intra_quantizer_matrix [64];
  60.     uint8_t non_intra_quantizer_matrix [64];
  61.     int mpeg4_matrix;
  62.     // pic header
  63.     unsigned int picture_coding_type;
  64.     // pic code ext
  65.     unsigned int f_code[2][2];
  66.     /* unsigned int intra_dc_precision; */
  67.     unsigned int picture_structure;
  68.     unsigned int frame_pred_frame_dct;
  69.     unsigned int concealment_motion_vectors;
  70.     unsigned int q_scale_type;
  71.     unsigned int intra_vlc_format;
  72.     const uint8_t * scan;
  73.     // slice or mb
  74.     // quantizer_scale_code
  75.     unsigned int quantizer_scale;
  76.     unsigned int new_quantizer_scale;
  77.     unsigned int last_coded_scale;
  78.     int   h_offset, v_offset;
  79.     vlc_bool_t b_error;
  80.     // mb
  81.     double qrate;
  82.     int i_admissible_error, i_minimum_error;
  83.     /* input buffers */
  84.     ssize_t i_total_input, i_remaining_input;
  85.     /* output buffers */
  86.     ssize_t i_current_output, i_wanted_output;
  87. } transrate_t;
  88. struct sout_stream_id_t
  89. {
  90.     void            *id;
  91.     vlc_bool_t      b_transrate;
  92.     block_t         *p_current_buffer;
  93.     block_t        *p_next_gop;
  94.     mtime_t         i_next_gop_duration;
  95.     size_t          i_next_gop_size;
  96.     transrate_t     tr;
  97. };
  98. #ifdef HAVE_BUILTIN_EXPECT
  99. #define likely(x) __builtin_expect ((x) != 0, 1)
  100. #define unlikely(x) __builtin_expect ((x) != 0, 0)
  101. #else
  102. #define likely(x) (x)
  103. #define unlikely(x) (x)
  104. #endif
  105. #define BITS_IN_BUF (8)
  106. #define LOG(msg) fprintf (stderr, msg)
  107. #define LOGF(format, args...) fprintf (stderr, format, args)
  108. static inline void bs_write( bs_transrate_t *s, unsigned int val, int n )
  109. {
  110.     assert(n < 32);
  111.     assert(!(val & (0xffffffffU << n)));
  112.     while (unlikely(n >= s->i_bit_out))
  113.     {
  114.         s->p_w[0] = (s->i_bit_out_cache << s->i_bit_out ) | (val >> (n - s->i_bit_out));
  115.         s->p_w++;
  116.         n -= s->i_bit_out;
  117.         s->i_bit_out_cache = 0;
  118.         val &= ~(0xffffffffU << n);
  119.         s->i_bit_out = BITS_IN_BUF;
  120.     }
  121.     if (likely(n))
  122.     {
  123.         s->i_bit_out_cache = (s->i_bit_out_cache << n) | val;
  124.         s->i_bit_out -= n;
  125.     }
  126.     assert(s->i_bit_out > 0);
  127.     assert(s->i_bit_out <= BITS_IN_BUF);
  128. }
  129. static inline void bs_refill( bs_transrate_t *s )
  130. {
  131.     assert((s->p_r - s->p_c) >= 1);
  132.     s->i_bit_in_cache |= s->p_c[0] << (24 - s->i_bit_in);
  133.     s->i_bit_in += 8;
  134.     s->p_c++;
  135. }
  136. static inline void bs_flush( bs_transrate_t *s, unsigned int n )
  137. {
  138.     assert(s->i_bit_in >= n);
  139.     s->i_bit_in_cache <<= n;
  140.     s->i_bit_in -= n;
  141.     assert( (!n) || ((n>0) && !(s->i_bit_in_cache & 0x1)) );
  142.     while (unlikely(s->i_bit_in < 24)) bs_refill( s );
  143. }
  144. static inline unsigned int bs_read( bs_transrate_t *s, unsigned int n )
  145. {
  146.     unsigned int Val = ((unsigned int)s->i_bit_in_cache) >> (32 - n);
  147.     bs_flush( s, n );
  148.     return Val;
  149. }
  150. static inline unsigned int bs_copy( bs_transrate_t *s, unsigned int n )
  151. {
  152.     unsigned int Val = bs_read( s, n);
  153.     bs_write(s, Val, n);
  154.     return Val;
  155. }
  156. static inline void bs_flush_read( bs_transrate_t *s )
  157. {
  158.     int i = s->i_bit_in & 0x7;
  159.     if( i )
  160.     {
  161.         assert(((unsigned int)s->i_bit_in_cache) >> (32 - i) == 0);
  162.         s->i_bit_in_cache <<= i;
  163.         s->i_bit_in -= i;
  164.     }
  165.     s->p_c += -1 * (s->i_bit_in >> 3);
  166.     s->i_bit_in = 0;
  167. }
  168. static inline void bs_flush_write( bs_transrate_t *s )
  169. {
  170.     if( s->i_bit_out != 8 ) bs_write(s, 0, s->i_bit_out);
  171. }
  172. int scale_quant( transrate_t *tr, double qrate );
  173. int transrate_mb( transrate_t *tr, RunLevel blk[6][65], RunLevel new_blk[6][65], int i_cbp, int intra );
  174. void get_intra_block_B14( transrate_t *tr, RunLevel *blk );
  175. void get_intra_block_B15( transrate_t *tr, RunLevel *blk );
  176. int get_non_intra_block( transrate_t *tr, RunLevel *blk );
  177. void putnonintrablk( bs_transrate_t *bs, RunLevel *blk);
  178. void putintrablk( bs_transrate_t *bs, RunLevel *blk, int vlcformat);
  179. int process_frame( sout_stream_t *p_stream, sout_stream_id_t *id,
  180.                    block_t *in, block_t **out, int i_handicap );