putpic.c
上传用户:hkgotone
上传日期:2013-02-17
资源大小:293k
文件大小:11k
源码类别:

Windows Mobile

开发平台:

C/C++

  1. /* putpic.c, block and motion vector encoding routines                      */
  2. /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
  3. /*
  4.  * Disclaimer of Warranty
  5.  *
  6.  * These software programs are available to the user without any license fee or
  7.  * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
  8.  * any and all warranties, whether express, implied, or statuary, including any
  9.  * implied warranties or merchantability or of fitness for a particular
  10.  * purpose.  In no event shall the copyright-holder be liable for any
  11.  * incidental, punitive, or consequential damages of any kind whatsoever
  12.  * arising from the use of these programs.
  13.  *
  14.  * This disclaimer of warranty extends to the user of these programs and user's
  15.  * customers, employees, agents, transferees, successors, and assigns.
  16.  *
  17.  * The MPEG Software Simulation Group does not represent or warrant that the
  18.  * programs furnished hereunder are free of infringement of any third-party
  19.  * patents.
  20.  *
  21.  * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
  22.  * are subject to royalty fees to patent holders.  Many of these patents are
  23.  * general enough such that they are unavoidable regardless of implementation
  24.  * design.
  25.  *
  26.  */
  27. #include <stdio.h>
  28. #include "config.h"
  29. #include "global.h"
  30. /* private prototypes */
  31. static void putmvs _ANSI_ARGS_((int MV[2][2][2], int PMV[2][2][2],
  32.   int mv_field_sel[2][2], int dmvector[2], int s, int motion_type,
  33.   int hor_f_code, int vert_f_code));
  34. /* quantization / variable length encoding of a complete picture */
  35. void putpict(frame)
  36. unsigned char *frame;
  37. {
  38.   int i, j, k, comp, cc;
  39.   int mb_type;
  40.   int PMV[2][2][2];
  41.   int prev_mquant;
  42.   int cbp, MBAinc;
  43.   rc_init_pict(frame); /* set up rate control */
  44.   /* picture header and picture coding extension */
  45.   putpicthdr();
  46.   if (!mpeg1)
  47.     putpictcodext();
  48.   prev_mquant = rc_start_mb(); /* initialize quantization parameter */
  49.   k = 0;
  50.   for (j=0; j<mb_height2; j++)
  51.   {
  52.     /* macroblock row loop */
  53.     for (i=0; i<mb_width; i++)
  54.     {
  55.       /* macroblock loop */
  56.       if (i==0)
  57.       {
  58.         /* slice header (6.2.4) */
  59.         alignbits();
  60.         if (mpeg1 || vertical_size<=2800)
  61.           putbits(SLICE_MIN_START+j,32); /* slice_start_code */
  62.         else
  63.         {
  64.           putbits(SLICE_MIN_START+(j&127),32); /* slice_start_code */
  65.           putbits(j>>7,3); /* slice_vertical_position_extension */
  66.         }
  67.   
  68.         /* quantiser_scale_code */
  69.         putbits(q_scale_type ? map_non_linear_mquant[prev_mquant]
  70.                              : prev_mquant >> 1, 5);
  71.   
  72.         putbits(0,1); /* extra_bit_slice */
  73.   
  74.         /* reset predictors */
  75.         for (cc=0; cc<3; cc++)
  76.           dc_dct_pred[cc] = 0;
  77.         PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
  78.         PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
  79.   
  80.         MBAinc = i + 1; /* first MBAinc denotes absolute position */
  81.       }
  82.       mb_type = mbinfo[k].mb_type;
  83.       /* determine mquant (rate control) */
  84.       mbinfo[k].mquant = rc_calc_mquant(k);
  85.       /* quantize macroblock */
  86.       if (mb_type & MB_INTRA)
  87.       {
  88.         for (comp=0; comp<block_count; comp++)
  89.           quant_intra(blocks[k*block_count+comp],blocks[k*block_count+comp],
  90.                       dc_prec,intra_q,mbinfo[k].mquant);
  91.         mbinfo[k].cbp = cbp = (1<<block_count) - 1;
  92.       }
  93.       else
  94.       {
  95.         cbp = 0;
  96.         for (comp=0;comp<block_count;comp++)
  97.           cbp = (cbp<<1) | quant_non_intra(blocks[k*block_count+comp],
  98.                                            blocks[k*block_count+comp],
  99.                                            inter_q,mbinfo[k].mquant);
  100.         mbinfo[k].cbp = cbp;
  101.         if (cbp)
  102.           mb_type|= MB_PATTERN;
  103.       }
  104.       /* output mquant if it has changed */
  105.       if (cbp && prev_mquant!=mbinfo[k].mquant)
  106.         mb_type|= MB_QUANT;
  107.       /* check if macroblock can be skipped */
  108.       if (i!=0 && i!=mb_width-1 && !cbp)
  109.       {
  110.         /* no DCT coefficients and neither first nor last macroblock of slice */
  111.         if (pict_type==P_TYPE && !(mb_type&MB_FORWARD))
  112.         {
  113.           /* P picture, no motion vectors -> skip */
  114.           /* reset predictors */
  115.           for (cc=0; cc<3; cc++)
  116.             dc_dct_pred[cc] = 0;
  117.           PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
  118.           PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
  119.           mbinfo[k].mb_type = mb_type;
  120.           mbinfo[k].skipped = 1;
  121.           MBAinc++;
  122.           k++;
  123.           continue;
  124.         }
  125.         if (pict_type==B_TYPE && pict_struct==FRAME_PICTURE
  126.             && mbinfo[k].motion_type==MC_FRAME
  127.             && ((mbinfo[k-1].mb_type^mb_type)&(MB_FORWARD|MB_BACKWARD))==0
  128.             && (!(mb_type&MB_FORWARD) ||
  129.                 (PMV[0][0][0]==mbinfo[k].MV[0][0][0] &&
  130.                  PMV[0][0][1]==mbinfo[k].MV[0][0][1]))
  131.             && (!(mb_type&MB_BACKWARD) ||
  132.                 (PMV[0][1][0]==mbinfo[k].MV[0][1][0] &&
  133.                  PMV[0][1][1]==mbinfo[k].MV[0][1][1])))
  134.         {
  135.           /* conditions for skipping in B frame pictures:
  136.            * - must be frame predicted
  137.            * - must be the same prediction type (forward/backward/interp.)
  138.            *   as previous macroblock
  139.            * - relevant vectors (forward/backward/both) have to be the same
  140.            *   as in previous macroblock
  141.            */
  142.           mbinfo[k].mb_type = mb_type;
  143.           mbinfo[k].skipped = 1;
  144.           MBAinc++;
  145.           k++;
  146.           continue;
  147.         }
  148.         if (pict_type==B_TYPE && pict_struct!=FRAME_PICTURE
  149.             && mbinfo[k].motion_type==MC_FIELD
  150.             && ((mbinfo[k-1].mb_type^mb_type)&(MB_FORWARD|MB_BACKWARD))==0
  151.             && (!(mb_type&MB_FORWARD) ||
  152.                 (PMV[0][0][0]==mbinfo[k].MV[0][0][0] &&
  153.                  PMV[0][0][1]==mbinfo[k].MV[0][0][1] &&
  154.                  mbinfo[k].mv_field_sel[0][0]==(pict_struct==BOTTOM_FIELD)))
  155.             && (!(mb_type&MB_BACKWARD) ||
  156.                 (PMV[0][1][0]==mbinfo[k].MV[0][1][0] &&
  157.                  PMV[0][1][1]==mbinfo[k].MV[0][1][1] &&
  158.                  mbinfo[k].mv_field_sel[0][1]==(pict_struct==BOTTOM_FIELD))))
  159.         {
  160.           /* conditions for skipping in B field pictures:
  161.            * - must be field predicted
  162.            * - must be the same prediction type (forward/backward/interp.)
  163.            *   as previous macroblock
  164.            * - relevant vectors (forward/backward/both) have to be the same
  165.            *   as in previous macroblock
  166.            * - relevant motion_vertical_field_selects have to be of same
  167.            *   parity as current field
  168.            */
  169.           mbinfo[k].mb_type = mb_type;
  170.           mbinfo[k].skipped = 1;
  171.           MBAinc++;
  172.           k++;
  173.           continue;
  174.         }
  175.       }
  176.       /* macroblock cannot be skipped */
  177.       mbinfo[k].skipped = 0;
  178.       /* there's no VLC for 'No MC, Not Coded':
  179.        * we have to transmit (0,0) motion vectors
  180.        */
  181.       if (pict_type==P_TYPE && !cbp && !(mb_type&MB_FORWARD))
  182.         mb_type|= MB_FORWARD;
  183.       putaddrinc(MBAinc); /* macroblock_address_increment */
  184.       MBAinc = 1;
  185.       putmbtype(pict_type,mb_type); /* macroblock type */
  186.       if (mb_type & (MB_FORWARD|MB_BACKWARD) && !frame_pred_dct)
  187.         putbits(mbinfo[k].motion_type,2);
  188.       if (pict_struct==FRAME_PICTURE && cbp && !frame_pred_dct)
  189.         putbits(mbinfo[k].dct_type,1);
  190.       if (mb_type & MB_QUANT)
  191.       {
  192.         putbits(q_scale_type ? map_non_linear_mquant[mbinfo[k].mquant]
  193.                              : mbinfo[k].mquant>>1,5);
  194.         prev_mquant = mbinfo[k].mquant;
  195.       }
  196.       if (mb_type & MB_FORWARD)
  197.       {
  198.         /* forward motion vectors, update predictors */
  199.         putmvs(mbinfo[k].MV,PMV,mbinfo[k].mv_field_sel,mbinfo[k].dmvector,0,
  200.           mbinfo[k].motion_type,forw_hor_f_code,forw_vert_f_code);
  201.       }
  202.       if (mb_type & MB_BACKWARD)
  203.       {
  204.         /* backward motion vectors, update predictors */
  205.         putmvs(mbinfo[k].MV,PMV,mbinfo[k].mv_field_sel,mbinfo[k].dmvector,1,
  206.           mbinfo[k].motion_type,back_hor_f_code,back_vert_f_code);
  207.       }
  208.       if (mb_type & MB_PATTERN)
  209.       {
  210.         putcbp((cbp >> (block_count-6)) & 63);
  211.         if (chroma_format!=CHROMA420)
  212.           putbits(cbp,block_count-6);
  213.       }
  214.       for (comp=0; comp<block_count; comp++)
  215.       {
  216.         /* block loop */
  217.         if (cbp & (1<<(block_count-1-comp)))
  218.         {
  219.           if (mb_type & MB_INTRA)
  220.           {
  221.             cc = (comp<4) ? 0 : (comp&1)+1;
  222.             putintrablk(blocks[k*block_count+comp],cc);
  223.           }
  224.           else
  225.             putnonintrablk(blocks[k*block_count+comp]);
  226.         }
  227.       }
  228.       /* reset predictors */
  229.       if (!(mb_type & MB_INTRA))
  230.         for (cc=0; cc<3; cc++)
  231.           dc_dct_pred[cc] = 0;
  232.       if (mb_type & MB_INTRA || (pict_type==P_TYPE && !(mb_type & MB_FORWARD)))
  233.       {
  234.         PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
  235.         PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
  236.       }
  237.       mbinfo[k].mb_type = mb_type;
  238.       k++;
  239.     }
  240.   }
  241.   rc_update_pict();
  242.   vbv_end_of_picture();
  243. }
  244. /* output motion vectors (6.2.5.2, 6.3.16.2)
  245.  *
  246.  * this routine also updates the predictions for motion vectors (PMV)
  247.  */
  248.  
  249. static void putmvs(MV,PMV,mv_field_sel,dmvector,s,motion_type,
  250.   hor_f_code,vert_f_code)
  251. int MV[2][2][2],PMV[2][2][2];
  252. int mv_field_sel[2][2];
  253. int dmvector[2];
  254. int s,motion_type,hor_f_code,vert_f_code;
  255. {
  256.   if (pict_struct==FRAME_PICTURE)
  257.   {
  258.     if (motion_type==MC_FRAME)
  259.     {
  260.       /* frame prediction */
  261.       putmv(MV[0][s][0]-PMV[0][s][0],hor_f_code);
  262.       putmv(MV[0][s][1]-PMV[0][s][1],vert_f_code);
  263.       PMV[0][s][0]=PMV[1][s][0]=MV[0][s][0];
  264.       PMV[0][s][1]=PMV[1][s][1]=MV[0][s][1];
  265.     }
  266.     else if (motion_type==MC_FIELD)
  267.     {
  268.       /* field prediction */
  269.       putbits(mv_field_sel[0][s],1);
  270.       putmv(MV[0][s][0]-PMV[0][s][0],hor_f_code);
  271.       putmv((MV[0][s][1]>>1)-(PMV[0][s][1]>>1),vert_f_code);
  272.       putbits(mv_field_sel[1][s],1);
  273.       putmv(MV[1][s][0]-PMV[1][s][0],hor_f_code);
  274.       putmv((MV[1][s][1]>>1)-(PMV[1][s][1]>>1),vert_f_code);
  275.       PMV[0][s][0]=MV[0][s][0];
  276.       PMV[0][s][1]=MV[0][s][1];
  277.       PMV[1][s][0]=MV[1][s][0];
  278.       PMV[1][s][1]=MV[1][s][1];
  279.     }
  280.     else
  281.     {
  282.       /* dual prime prediction */
  283.       putmv(MV[0][s][0]-PMV[0][s][0],hor_f_code);
  284.       putdmv(dmvector[0]);
  285.       putmv((MV[0][s][1]>>1)-(PMV[0][s][1]>>1),vert_f_code);
  286.       putdmv(dmvector[1]);
  287.       PMV[0][s][0]=PMV[1][s][0]=MV[0][s][0];
  288.       PMV[0][s][1]=PMV[1][s][1]=MV[0][s][1];
  289.     }
  290.   }
  291.   else
  292.   {
  293.     /* field picture */
  294.     if (motion_type==MC_FIELD)
  295.     {
  296.       /* field prediction */
  297.       putbits(mv_field_sel[0][s],1);
  298.       putmv(MV[0][s][0]-PMV[0][s][0],hor_f_code);
  299.       putmv(MV[0][s][1]-PMV[0][s][1],vert_f_code);
  300.       PMV[0][s][0]=PMV[1][s][0]=MV[0][s][0];
  301.       PMV[0][s][1]=PMV[1][s][1]=MV[0][s][1];
  302.     }
  303.     else if (motion_type==MC_16X8)
  304.     {
  305.       /* 16x8 prediction */
  306.       putbits(mv_field_sel[0][s],1);
  307.       putmv(MV[0][s][0]-PMV[0][s][0],hor_f_code);
  308.       putmv(MV[0][s][1]-PMV[0][s][1],vert_f_code);
  309.       putbits(mv_field_sel[1][s],1);
  310.       putmv(MV[1][s][0]-PMV[1][s][0],hor_f_code);
  311.       putmv(MV[1][s][1]-PMV[1][s][1],vert_f_code);
  312.       PMV[0][s][0]=MV[0][s][0];
  313.       PMV[0][s][1]=MV[0][s][1];
  314.       PMV[1][s][0]=MV[1][s][0];
  315.       PMV[1][s][1]=MV[1][s][1];
  316.     }
  317.     else
  318.     {
  319.       /* dual prime prediction */
  320.       putmv(MV[0][s][0]-PMV[0][s][0],hor_f_code);
  321.       putdmv(dmvector[0]);
  322.       putmv(MV[0][s][1]-PMV[0][s][1],vert_f_code);
  323.       putdmv(dmvector[1]);
  324.       PMV[0][s][0]=PMV[1][s][0]=MV[0][s][0];
  325.       PMV[0][s][1]=PMV[1][s][1]=MV[0][s][1];
  326.     }
  327.   }
  328. }