putseq.c
上传用户:ma_junhua
上传日期:2008-04-11
资源大小:2752k
文件大小:10k
开发平台:

C/C++

  1. /* putseq.c, sequence level 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 <string.h>
  29. #include "config.h"
  30. #include "global.h"
  31. void putseq()
  32. {
  33.   /* this routine assumes (N % M) == 0 */
  34.   int i, j, k, f, f0, n, np, nb, sxf, syf, sxb, syb;
  35.   int ipflag;
  36.   FILE *fd;
  37.   char name[256];
  38.   unsigned char *neworg[3], *newref[3];
  39.   static char ipb[5] = {' ','I','P','B','D'};
  40.   rc_init_seq(); /* initialize rate control */
  41.   /* sequence header, sequence extension and sequence display extension */
  42.   putseqhdr();
  43.   if (!mpeg1)
  44.   {
  45.     putseqext();
  46.     putseqdispext();
  47.   }
  48.   /* optionally output some text data (description, copyright or whatever) */
  49.   if (strlen(id_string) > 1)
  50.     putuserdata(id_string);
  51.   /* loop through all frames in encoding/decoding order */
  52.   for (i=0; i<nframes; i++)
  53.   {
  54.     if (!quiet)
  55.     {
  56.       fprintf(stderr,"Encoding frame %d ",i);
  57.       fflush(stderr);
  58.     }
  59.     /* f0: lowest frame number in current GOP
  60.      *
  61.      * first GOP contains N-(M-1) frames,
  62.      * all other GOPs contain N frames
  63.      */
  64.     f0 = N*((i+(M-1))/N) - (M-1);
  65.     if (f0<0)
  66.       f0=0;
  67.     if (i==0 || (i-1)%M==0)
  68.     {
  69.       /* I or P frame */
  70.       for (j=0; j<3; j++)
  71.       {
  72.         /* shuffle reference frames */
  73.         neworg[j] = oldorgframe[j];
  74.         newref[j] = oldrefframe[j];
  75.         oldorgframe[j] = neworgframe[j];
  76.         oldrefframe[j] = newrefframe[j];
  77.         neworgframe[j] = neworg[j];
  78.         newrefframe[j] = newref[j];
  79.       }
  80.       /* f: frame number in display order */
  81.       f = (i==0) ? 0 : i+M-1;
  82.       if (f>=nframes)
  83.         f = nframes - 1;
  84.       if (i==f0) /* first displayed frame in GOP is I */
  85.       {
  86.         /* I frame */
  87.         pict_type = I_TYPE;
  88.         forw_hor_f_code = forw_vert_f_code = 15;
  89.         back_hor_f_code = back_vert_f_code = 15;
  90.         /* n: number of frames in current GOP
  91.          *
  92.          * first GOP contains (M-1) less (B) frames
  93.          */
  94.         n = (i==0) ? N-(M-1) : N;
  95.         /* last GOP may contain less frames */
  96.         if (n > nframes-f0)
  97.           n = nframes-f0;
  98.         /* number of P frames */
  99.         if (i==0)
  100.           np = (n + 2*(M-1))/M - 1; /* first GOP */
  101.         else
  102.           np = (n + (M-1))/M - 1;
  103.         /* number of B frames */
  104.         nb = n - np - 1;
  105.         rc_init_GOP(np,nb);
  106.         putgophdr(f0,i==0); /* set closed_GOP in first GOP only */
  107.       }
  108.       else
  109.       {
  110.         /* P frame */
  111.         pict_type = P_TYPE;
  112.         forw_hor_f_code = motion_data[0].forw_hor_f_code;
  113.         forw_vert_f_code = motion_data[0].forw_vert_f_code;
  114.         back_hor_f_code = back_vert_f_code = 15;
  115.         sxf = motion_data[0].sxf;
  116.         syf = motion_data[0].syf;
  117.       }
  118.     }
  119.     else
  120.     {
  121.       /* B frame */
  122.       for (j=0; j<3; j++)
  123.       {
  124.         neworg[j] = auxorgframe[j];
  125.         newref[j] = auxframe[j];
  126.       }
  127.       /* f: frame number in display order */
  128.       f = i - 1;
  129.       pict_type = B_TYPE;
  130.       n = (i-2)%M + 1; /* first B: n=1, second B: n=2, ... */
  131.       forw_hor_f_code = motion_data[n].forw_hor_f_code;
  132.       forw_vert_f_code = motion_data[n].forw_vert_f_code;
  133.       back_hor_f_code = motion_data[n].back_hor_f_code;
  134.       back_vert_f_code = motion_data[n].back_vert_f_code;
  135.       sxf = motion_data[n].sxf;
  136.       syf = motion_data[n].syf;
  137.       sxb = motion_data[n].sxb;
  138.       syb = motion_data[n].syb;
  139.     }
  140.     temp_ref = f - f0;
  141.     frame_pred_dct = frame_pred_dct_tab[pict_type-1];
  142.     q_scale_type = qscale_tab[pict_type-1];
  143.     intravlc = intravlc_tab[pict_type-1];
  144.     altscan = altscan_tab[pict_type-1];
  145.     fprintf(statfile,"nFrame %d (#%d in display order):n",i,f);
  146.     fprintf(statfile," picture_type=%cn",ipb[pict_type]);
  147.     fprintf(statfile," temporal_reference=%dn",temp_ref);
  148.     fprintf(statfile," frame_pred_frame_dct=%dn",frame_pred_dct);
  149.     fprintf(statfile," q_scale_type=%dn",q_scale_type);
  150.     fprintf(statfile," intra_vlc_format=%dn",intravlc);
  151.     fprintf(statfile," alternate_scan=%dn",altscan);
  152.     if (pict_type!=I_TYPE)
  153.     {
  154.       fprintf(statfile," forward search window: %d...%d / %d...%dn",
  155.         -sxf,sxf,-syf,syf);
  156.       fprintf(statfile," forward vector range: %d...%d.5 / %d...%d.5n",
  157.         -(4<<forw_hor_f_code),(4<<forw_hor_f_code)-1,
  158.         -(4<<forw_vert_f_code),(4<<forw_vert_f_code)-1);
  159.     }
  160.     if (pict_type==B_TYPE)
  161.     {
  162.       fprintf(statfile," backward search window: %d...%d / %d...%dn",
  163.         -sxb,sxb,-syb,syb);
  164.       fprintf(statfile," backward vector range: %d...%d.5 / %d...%d.5n",
  165.         -(4<<back_hor_f_code),(4<<back_hor_f_code)-1,
  166.         -(4<<back_vert_f_code),(4<<back_vert_f_code)-1);
  167.     }
  168.     sprintf(name,tplorg,f+frame0);
  169.     readframe(name,neworg);
  170.     if (fieldpic)
  171.     {
  172.       if (!quiet)
  173.       {
  174.         fprintf(stderr,"nfirst field  (%s) ",topfirst ? "top" : "bot");
  175.         fflush(stderr);
  176.       }
  177.       pict_struct = topfirst ? TOP_FIELD : BOTTOM_FIELD;
  178.       motion_estimation(oldorgframe[0],neworgframe[0],
  179.                         oldrefframe[0],newrefframe[0],
  180.                         neworg[0],newref[0],
  181.                         sxf,syf,sxb,syb,mbinfo,0,0);
  182.       predict(oldrefframe,newrefframe,predframe,0,mbinfo);
  183.       dct_type_estimation(predframe[0],neworg[0],mbinfo);
  184.       transform(predframe,neworg,mbinfo,blocks);
  185.       putpict(neworg[0]);
  186.       for (k=0; k<mb_height2*mb_width; k++)
  187.       {
  188.         if (mbinfo[k].mb_type & MB_INTRA)
  189.           for (j=0; j<block_count; j++)
  190.             iquant_intra(blocks[k*block_count+j],blocks[k*block_count+j],
  191.                          dc_prec,intra_q,mbinfo[k].mquant);
  192.         else
  193.           for (j=0;j<block_count;j++)
  194.             iquant_non_intra(blocks[k*block_count+j],blocks[k*block_count+j],
  195.                              inter_q,mbinfo[k].mquant);
  196.       }
  197.       itransform(predframe,newref,mbinfo,blocks);
  198.       calcSNR(neworg,newref);
  199.       stats();
  200.       if (!quiet)
  201.       {
  202.         fprintf(stderr,"second field (%s) ",topfirst ? "bot" : "top");
  203.         fflush(stderr);
  204.       }
  205.       pict_struct = topfirst ? BOTTOM_FIELD : TOP_FIELD;
  206.       ipflag = (pict_type==I_TYPE);
  207.       if (ipflag)
  208.       {
  209.         /* first field = I, second field = P */
  210.         pict_type = P_TYPE;
  211.         forw_hor_f_code = motion_data[0].forw_hor_f_code;
  212.         forw_vert_f_code = motion_data[0].forw_vert_f_code;
  213.         back_hor_f_code = back_vert_f_code = 15;
  214.         sxf = motion_data[0].sxf;
  215.         syf = motion_data[0].syf;
  216.       }
  217.       motion_estimation(oldorgframe[0],neworgframe[0],
  218.                         oldrefframe[0],newrefframe[0],
  219.                         neworg[0],newref[0],
  220.                         sxf,syf,sxb,syb,mbinfo,1,ipflag);
  221.       predict(oldrefframe,newrefframe,predframe,1,mbinfo);
  222.       dct_type_estimation(predframe[0],neworg[0],mbinfo);
  223.       transform(predframe,neworg,mbinfo,blocks);
  224.       putpict(neworg[0]);
  225.       for (k=0; k<mb_height2*mb_width; k++)
  226.       {
  227.         if (mbinfo[k].mb_type & MB_INTRA)
  228.           for (j=0; j<block_count; j++)
  229.             iquant_intra(blocks[k*block_count+j],blocks[k*block_count+j],
  230.                          dc_prec,intra_q,mbinfo[k].mquant);
  231.         else
  232.           for (j=0;j<block_count;j++)
  233.             iquant_non_intra(blocks[k*block_count+j],blocks[k*block_count+j],
  234.                              inter_q,mbinfo[k].mquant);
  235.       }
  236.       itransform(predframe,newref,mbinfo,blocks);
  237.       calcSNR(neworg,newref);
  238.       stats();
  239.     }
  240.     else
  241.     {
  242.       pict_struct = FRAME_PICTURE;
  243.       /* do motion_estimation
  244.        *
  245.        * uses source frames (...orgframe) for full pel search
  246.        * and reconstructed frames (...refframe) for half pel search
  247.        */
  248.       motion_estimation(oldorgframe[0],neworgframe[0],
  249.                         oldrefframe[0],newrefframe[0],
  250.                         neworg[0],newref[0],
  251.                         sxf,syf,sxb,syb,mbinfo,0,0);
  252.       predict(oldrefframe,newrefframe,predframe,0,mbinfo);
  253.       dct_type_estimation(predframe[0],neworg[0],mbinfo);
  254.       transform(predframe,neworg,mbinfo,blocks);
  255.       putpict(neworg[0]);
  256.       for (k=0; k<mb_height*mb_width; k++)
  257.       {
  258.         if (mbinfo[k].mb_type & MB_INTRA)
  259.           for (j=0; j<block_count; j++)
  260.             iquant_intra(blocks[k*block_count+j],blocks[k*block_count+j],
  261.                          dc_prec,intra_q,mbinfo[k].mquant);
  262.         else
  263.           for (j=0;j<block_count;j++)
  264.             iquant_non_intra(blocks[k*block_count+j],blocks[k*block_count+j],
  265.                              inter_q,mbinfo[k].mquant);
  266.       }
  267.       itransform(predframe,newref,mbinfo,blocks);
  268.       calcSNR(neworg,newref);
  269.       stats();
  270.     }
  271.     sprintf(name,tplref,f+frame0);
  272.     writeframe(name,newref);
  273.   }
  274.   putseqend();
  275. }