h263enc.c
上传用户:jxp0626
上传日期:2007-01-08
资源大小:102k
文件大小:16k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Unix_Linux

  1. /*
  2.  * H263 backend for ffmpeg encoder
  3.  * Copyright (c) 2000 Gerard Lantau.
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19. #include <stdlib.h>
  20. #include <stdio.h>
  21. #include <netinet/in.h>
  22. #include "common.h"
  23. #include "dsputil.h"
  24. #include "mpegvideo.h"
  25. #include "h263data.h"
  26. #include "mpeg4data.h"
  27. #define NDEBUG
  28. #include <assert.h>
  29. static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
  30.       int n);
  31. static void h263_encode_motion(MpegEncContext * s, int val);
  32. static void h263_pred_motion(MpegEncContext * s, int block, int *px, int *py);
  33. static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
  34.        int n);
  35. void h263_picture_header(MpegEncContext * s, int picture_number)
  36. {
  37.     int format;
  38.     align_put_bits(&s->pb);
  39.     put_bits(&s->pb, 22, 0x20);
  40.     put_bits(&s->pb, 8, ((s->picture_number * 30) / s->frame_rate) & 0xff);
  41.     put_bits(&s->pb, 1, 1); /* marker */
  42.     put_bits(&s->pb, 1, 0); /* h263 id */
  43.     put_bits(&s->pb, 1, 0); /* split screen off */
  44.     put_bits(&s->pb, 1, 0); /* camera  off */
  45.     put_bits(&s->pb, 1, 0); /* freeze picture release off */
  46.     if (s->width == 128 && s->height == 96)
  47. format = 1;
  48.     else if (s->width == 176 && s->height == 144)
  49. format = 2;
  50.     else if (s->width == 352 && s->height == 288)
  51. format = 3;
  52.     else if (s->width == 704 && s->height == 576)
  53. format = 4;
  54.     else if (s->width == 1408 && s->height == 1152)
  55. format = 5;
  56.     else
  57. abort();
  58.     put_bits(&s->pb, 3, format);
  59.     put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
  60.     put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
  61.     put_bits(&s->pb, 1, 0); /* SAC: off */
  62.     put_bits(&s->pb, 1, 0); /* advanced prediction mode: off */
  63.     put_bits(&s->pb, 1, 0); /* not PB frame */
  64.     put_bits(&s->pb, 5, s->qscale);
  65.     put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
  66.     put_bits(&s->pb, 1, 0); /* no PEI */
  67. }
  68. void h263_encode_mb(MpegEncContext * s,
  69.     DCTELEM block[6][64],
  70.     int motion_x, int motion_y)
  71. {
  72.     int cbpc, cbpy, i, cbp, pred_x, pred_y;
  73.     if (!s->mb_intra) {
  74. /* compute cbp */
  75. cbp = 0;
  76. for (i = 0; i < 6; i++) {
  77.     if (s->block_last_index[i] >= 0)
  78. cbp |= 1 << (5 - i);
  79. }
  80. if ((cbp | motion_x | motion_y) == 0) {
  81.     /* skip macroblock */
  82.     put_bits(&s->pb, 1, 1);
  83.     return;
  84. }
  85. put_bits(&s->pb, 1, 0); /* mb coded */
  86. cbpc = cbp & 3;
  87. put_bits(&s->pb,
  88.  inter_MCBPC_bits[cbpc],
  89.  inter_MCBPC_code[cbpc]);
  90. cbpy = cbp >> 2;
  91. cbpy ^= 0xf;
  92. put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
  93. /* motion vectors: 16x16 mode only now */
  94.         h263_pred_motion(s, 0, &pred_x, &pred_y);
  95.         
  96.         h263_encode_motion(s, motion_x - pred_x);
  97.         h263_encode_motion(s, motion_y - pred_y);
  98.     } else {
  99. /* compute cbp */
  100. cbp = 0;
  101. for (i = 0; i < 6; i++) {
  102.     if (s->block_last_index[i] >= 1)
  103. cbp |= 1 << (5 - i);
  104. }
  105. cbpc = cbp & 3;
  106. if (s->pict_type == I_TYPE) {
  107.     put_bits(&s->pb,
  108.      intra_MCBPC_bits[cbpc],
  109.      intra_MCBPC_code[cbpc]);
  110. } else {
  111.     put_bits(&s->pb, 1, 0); /* mb coded */
  112.     put_bits(&s->pb,
  113.      inter_MCBPC_bits[cbpc + 4],
  114.      inter_MCBPC_code[cbpc + 4]);
  115. }
  116. if (s->h263_pred) {
  117.     /* XXX: currently, we do not try to use ac prediction */
  118.     put_bits(&s->pb, 1, 0); /* no ac prediction */
  119. }
  120. cbpy = cbp >> 2;
  121. put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
  122.     }
  123.     /* encode each block */
  124.     if (s->h263_pred) {
  125. for (i = 0; i < 6; i++) {
  126.     mpeg4_encode_block(s, block[i], i);
  127. }
  128.     } else {
  129. for (i = 0; i < 6; i++) {
  130.     h263_encode_block(s, block[i], i);
  131. }
  132.     }
  133. }
  134. static inline int mid_pred(int a, int b, int c)
  135. {
  136.     int vmin, vmax;
  137.     vmin = a;
  138.     if (b < vmin)
  139.         vmin = b;
  140.     if (c < vmin)
  141.         vmin = c;
  142.     vmax = a;
  143.     if (b > vmax)
  144.         vmax = b;
  145.     if (c > vmax)
  146.         vmax = c;
  147.     return a + b + c - vmin - vmax;
  148. }
  149. static void h263_pred_motion(MpegEncContext * s, int block, int *px, int *py)
  150. {
  151.     int x, y, wrap;
  152.     INT16 *A, *B, *C;
  153.     x = 2 * s->mb_x + 1 + (block & 1);
  154.     y = 2 * s->mb_y + 1 + ((block >> 1) & 1);
  155.     wrap = 2 * s->mb_width + 2;
  156.     /* special case for first line */
  157.     if (y == 1) {
  158.         A = s->motion_val[(x-1) + (y) * wrap];
  159.         *px = A[0];
  160.         *py = A[1];
  161.         return;
  162.     }
  163.     switch(block) {
  164.     default:
  165.     case 0:
  166.         A = s->motion_val[(x-1) + (y) * wrap];
  167.         B = s->motion_val[(x) + (y-1) * wrap];
  168.         C = s->motion_val[(x+2) + (y-1) * wrap];
  169.         break;
  170.     case 1:
  171.     case 2:
  172.         A = s->motion_val[(x-1) + (y) * wrap];
  173.         B = s->motion_val[(x) + (y-1) * wrap];
  174.         C = s->motion_val[(x+1) + (y-1) * wrap];
  175.         break;
  176.     case 3:
  177.         A = s->motion_val[(x-1) + (y) * wrap];
  178.         B = s->motion_val[(x-1) + (y-1) * wrap];
  179.         C = s->motion_val[(x) + (y-1) * wrap];
  180.         break;
  181.     }
  182.     *px = mid_pred(A[0], B[0], C[0]);
  183.     *py = mid_pred(A[1], B[1], C[1]);
  184. }
  185. static void h263_encode_motion(MpegEncContext * s, int val)
  186. {
  187.     int range, l, m, bit_size, sign, code, bits;
  188.     if (val == 0) {
  189.         /* zero vector */
  190.         code = 0;
  191.         put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
  192.     } else {
  193.         bit_size = s->f_code - 1;
  194.         range = 1 << bit_size;
  195.         /* modulo encoding */
  196.         l = range * 32;
  197.         m = 2 * l;
  198.         if (val < -l) {
  199.             val += m;
  200.         } else if (val >= l) {
  201.             val -= m;
  202.         }
  203.         if (val >= 0) {
  204.             val--;
  205.             code = (val >> bit_size) + 1;
  206.             bits = val & (range - 1);
  207.             sign = 0;
  208.         } else {
  209.             val = -val;
  210.             val--;
  211.             code = (val >> bit_size) + 1;
  212.             bits = val & (range - 1);
  213.             sign = 1;
  214.         }
  215.         put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign); 
  216.         if (bit_size > 0) {
  217.             put_bits(&s->pb, bit_size, bits);
  218.         }
  219.     }
  220. }
  221. #define CODE_INTRA(run, level, last)             
  222. {                                                       
  223.     if (last == 0) {                                    
  224.         if (run == 0 && level < 28) {                   
  225.             code = coeff_tab4[level - 1][0];            
  226.             len = coeff_tab4[level - 1][1];             
  227.         } else if (run == 1 && level < 11) {            
  228.             code = coeff_tab5[level - 1][0];            
  229.             len = coeff_tab5[level - 1][1];             
  230.         } else if (run > 1 && run < 10 && level < 6) {  
  231.             code = coeff_tab6[run - 2][level - 1][0];   
  232.             len = coeff_tab6[run - 2][level - 1][1];    
  233.         } else if (run > 9 && run < 15 && level == 1) { 
  234.             code = coeff_tab7[run - 10][0];             
  235.             len = coeff_tab7[run - 10][1];              
  236.         }                                               
  237.     } else {                                            
  238.         if (run == 0 && level < 9) {                    
  239.             code = coeff_tab8[level - 1][0];            
  240.             len = coeff_tab8[level - 1][1];             
  241.         } else if (run > 0 && run < 7 && level < 4) {   
  242.             code = coeff_tab9[run - 1][level - 1][0];   
  243.             len = coeff_tab9[run - 1][level - 1][1];    
  244.         } else if (run > 6 && run < 21 && level == 1) { 
  245.             code = coeff_tab10[run - 7][0];             
  246.             len = coeff_tab10[run - 7][1];              
  247.         }                                               
  248.     }                                                   
  249. }
  250. #define CODE_INTER(run, level, last)                     
  251. {                                                               
  252.     if (last == 0) {                                            
  253.         if (run < 2 && level < 13) {                            
  254.             len = coeff_tab0[run][level - 1][1];                
  255.             code = coeff_tab0[run][level - 1][0];               
  256.         } else if (run >= 2 && run < 27 && level < 5) {         
  257.             len = coeff_tab1[run - 2][level - 1][1];            
  258.             code = coeff_tab1[run - 2][level - 1][0];           
  259.         }                                                       
  260.     } else {                                                    
  261.         if (run < 2 && level < 4) {                             
  262.             len = coeff_tab2[run][level - 1][1];                
  263.             code = coeff_tab2[run][level - 1][0];               
  264.         } else if (run >= 2 && run < 42 && level == 1) {        
  265.             len = coeff_tab3[run - 2][1];                       
  266.             code = coeff_tab3[run - 2][0];                      
  267.         }                                                       
  268.     }                                                           
  269. }
  270. static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
  271. {
  272.     int level, run, last, i, j, last_index, last_non_zero, sign, slevel;
  273.     int code = 0, len;
  274.     if (s->mb_intra) {
  275. /* DC coef */
  276. level = block[0];
  277. if (level == 128)
  278.     put_bits(&s->pb, 8, 0xff);
  279. else
  280.     put_bits(&s->pb, 8, level & 0xff);
  281. i = 1;
  282.     } else {
  283. i = 0;
  284.     }
  285.     /* AC coefs */
  286.     last_index = s->block_last_index[n];
  287.     last_non_zero = i - 1;
  288.     for (; i <= last_index; i++) {
  289. j = zigzag_direct[i];
  290. level = block[j];
  291. if (level) {
  292.     run = i - last_non_zero - 1;
  293.     last = (i == last_index);
  294.     sign = 0;
  295.     slevel = level;
  296.     if (level < 0) {
  297. sign = 1;
  298. level = -level;
  299.     }
  300.             len = 0;
  301.             CODE_INTER(run, level, last);
  302.             if (len == 0) {
  303.                 put_bits(&s->pb, 7, 3);
  304.                 put_bits(&s->pb, 1, last);
  305.                 put_bits(&s->pb, 6, run);
  306.                 put_bits(&s->pb, 8, slevel & 0xff);
  307.             } else {
  308.                 code = (code << 1) | sign;
  309.                 put_bits(&s->pb, len + 1, code);
  310.             }
  311.     last_non_zero = i;
  312. }
  313.     }
  314. }
  315. /* write RV 1.0 compatible frame header */
  316. void rv10_encode_picture_header(MpegEncContext * s, int picture_number)
  317. {
  318.     align_put_bits(&s->pb);
  319.     put_bits(&s->pb, 1, 1); /* marker */
  320.     put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
  321.     put_bits(&s->pb, 1, 0); /* not PB frame */
  322.     put_bits(&s->pb, 5, s->qscale);
  323.     if (s->pict_type == I_TYPE) {
  324. /* specific MPEG like DC coding not used */
  325.     }
  326.     /* if multiple packets per frame are sent, the position at which
  327.        to display the macro blocks is coded here */
  328.     put_bits(&s->pb, 6, 0); /* mb_x */
  329.     put_bits(&s->pb, 6, 0); /* mb_y */
  330.     put_bits(&s->pb, 12, s->mb_width * s->mb_height);
  331.     put_bits(&s->pb, 3, 0); /* ignored */
  332. }
  333. /***************************************************/
  334. /* write mpeg4 VOP header */
  335. void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
  336. {
  337.     align_put_bits(&s->pb);
  338.     put_bits(&s->pb, 32, 0x1B6); /* vop header */
  339.     put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
  340.     /* XXX: time base + 1 not always correct */
  341.     put_bits(&s->pb, 1, 1);
  342.     put_bits(&s->pb, 1, 0);
  343.     put_bits(&s->pb, 1, 1); /* marker */
  344.     put_bits(&s->pb, 4, 1); /* XXX: correct time increment */
  345.     put_bits(&s->pb, 1, 1); /* marker */
  346.     put_bits(&s->pb, 1, 1); /* vop coded */
  347.     if (s->pict_type == P_TYPE)
  348. put_bits(&s->pb, 1, 0); /* rounding type */
  349.     put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
  350.     put_bits(&s->pb, 5, s->qscale);
  351.     if (s->pict_type != I_TYPE)
  352. put_bits(&s->pb, 3, s->f_code); /* fcode_for */
  353. }
  354. void h263_dc_scale(MpegEncContext * s)
  355. {
  356.     int quant;
  357.     quant = s->qscale;
  358.     /* luminance */
  359.     if (quant < 5)
  360. s->y_dc_scale = 8;
  361.     else if (quant > 4 && quant < 9)
  362. s->y_dc_scale = (2 * quant);
  363.     else if (quant > 8 && quant < 25)
  364. s->y_dc_scale = (quant + 8);
  365.     else
  366. s->y_dc_scale = (2 * quant - 16);
  367.     /* chrominance */
  368.     if (quant < 5)
  369. s->c_dc_scale = 8;
  370.     else if (quant > 4 && quant < 25)
  371. s->c_dc_scale = ((quant + 13) / 2);
  372.     else
  373. s->c_dc_scale = (quant - 6);
  374. }
  375. static inline void mpeg4_encode_dc(MpegEncContext * s, int level, int n)
  376. {
  377.     int size, v, a, b, c, x, y, wrap, pred, scale;
  378.     UINT16 *dc_val;
  379.     /* find prediction */
  380.     if (n < 4) {
  381. x = 2 * s->mb_x + 1 + (n & 1);
  382. y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
  383. wrap = s->mb_width * 2 + 2;
  384. dc_val = s->dc_val[0];
  385. scale = s->y_dc_scale;
  386.     } else {
  387. x = s->mb_x + 1;
  388. y = s->mb_y + 1;
  389. wrap = s->mb_width + 2;
  390. dc_val = s->dc_val[n - 4 + 1];
  391. scale = s->c_dc_scale;
  392.     }
  393.     /* B C
  394.      * A X 
  395.      */
  396.     a = dc_val[(x - 1) + (y) * wrap];
  397.     b = dc_val[(x - 1) + (y - 1) * wrap];
  398.     c = dc_val[(x) + (y - 1) * wrap];
  399.     if (abs(a - b) < abs(b - c)) {
  400. pred = c;
  401.     } else {
  402. pred = a;
  403.     }
  404.     /* we assume pred is positive */
  405.     pred = (pred + (scale >> 1)) / scale;
  406.     /* update predictor */
  407.     dc_val[(x) + (y) * wrap] = level * scale;
  408.     /* do the prediction */
  409.     level -= pred;
  410.     /* find number of bits */
  411.     size = 0;
  412.     v = abs(level);
  413.     while (v) {
  414. v >>= 1;
  415. size++;
  416.     }
  417.     if (n < 4) {
  418. /* luminance */
  419. put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
  420.     } else {
  421. /* chrominance */
  422. put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
  423.     }
  424.     /* encode remaining bits */
  425.     if (size > 0) {
  426. if (level < 0)
  427.     level = (-level) ^ ((1 << size) - 1);
  428. put_bits(&s->pb, size, level);
  429. if (size > 8)
  430.     put_bits(&s->pb, 1, 1);
  431.     }
  432. }
  433. static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
  434. {
  435.     int level, run, last, i, j, last_index, last_non_zero, sign, slevel, level1, run1;
  436.     int code = 0, len;
  437.     if (s->mb_intra) {
  438. /* mpeg4 based DC predictor */
  439. mpeg4_encode_dc(s, block[0], n);
  440. i = 1;
  441.     } else {
  442. i = 0;
  443.     }
  444.     /* AC coefs */
  445.     last_index = s->block_last_index[n];
  446.     last_non_zero = i - 1;
  447.     for (; i <= last_index; i++) {
  448. j = zigzag_direct[i];
  449. level = block[j];
  450. if (level) {
  451.     run = i - last_non_zero - 1;
  452.     last = (i == last_index);
  453.     sign = 0;
  454.     slevel = level;
  455.     if (level < 0) {
  456. sign = 1;
  457. level = -level;
  458.     }
  459.             len = 0;
  460.     if (s->mb_intra) {
  461. /* intra mb */
  462.                 CODE_INTRA(run, level, last);
  463.                 if (len)
  464.                     goto esc0;
  465.                 /* first escape */
  466.                 level1 = level - intra_max_level[last][run];
  467.                 assert(level1 >= 0);
  468.                 if (level1 < 28) {
  469.                     CODE_INTRA(run, level1, last);
  470.                     if (len)
  471.                         goto esc1;
  472.                 }
  473.                 /* second escape */
  474.                 run1 = run - (intra_max_run[last][level]+1);
  475.                 if (level < 28 && run1 >= 0) {
  476.                     CODE_INTRA(run1, level, last);
  477.                     if (len)
  478.                         goto esc2;
  479.                 }
  480.     } else {
  481. /* inter mb */
  482.                 CODE_INTER(run, level, last);
  483.                 if (len)
  484.                     goto esc0;
  485.                 /* first escape */
  486.                 level1 = level - inter_max_level[last][run];
  487.                 assert(level1 >= 0);
  488.                 if (level1 < 13) {
  489.                     CODE_INTER(run, level1, last);
  490.                     if (len)
  491.                         goto esc1;
  492.                 }
  493.                 /* second escape */
  494.                 run1 = run - (inter_max_run[last][level]+1);
  495.                 if (level < 13 && run1 >= 0) {
  496.                     CODE_INTER(run1, level, last);
  497.                     if (len)
  498.                         goto esc2;
  499.                 }
  500.             }
  501.             /* third escape */
  502.             put_bits(&s->pb, 7, 3);
  503.             put_bits(&s->pb, 2, 3);
  504.             put_bits(&s->pb, 1, last);
  505.             put_bits(&s->pb, 6, run);
  506.             put_bits(&s->pb, 1, 1); /* marker */
  507.             put_bits(&s->pb, 12, slevel & 0xfff);
  508.             put_bits(&s->pb, 1, 1); /* marker */
  509.             goto next;
  510.         esc2:
  511.             put_bits(&s->pb, 7, 3);
  512.             put_bits(&s->pb, 2, 2);
  513.             goto esc0;
  514.         esc1:
  515.             put_bits(&s->pb, 7, 3);
  516.             put_bits(&s->pb, 1, 0);
  517.         esc0:
  518.             code = (code << 1) | sign;
  519.             put_bits(&s->pb, len + 1, code);
  520.         next:
  521.     last_non_zero = i;
  522. }
  523.     }
  524. }