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

C/C++

  1. /* systems.c, systems-specific 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 <stdlib.h>
  29. #include "config.h"
  30. #include "global.h"
  31. /* initialize buffer, call once before first getbits or showbits */
  32. /* parse system layer, ignore everything we don't need */
  33. void Next_Packet()
  34. {
  35.   unsigned int code;
  36.   int l;
  37.   for(;;)
  38.   {
  39.     code = Get_Long();
  40.     /* remove system layer byte stuffing */
  41.     while ((code & 0xffffff00) != 0x100)
  42.       code = (code<<8) | Get_Byte();
  43.     switch(code)
  44.     {
  45.     case PACK_START_CODE: /* pack header */
  46.       /* skip pack header (system_clock_reference and mux_rate) */
  47.       ld->Rdptr += 8;
  48.       break;
  49.     case VIDEO_ELEMENTARY_STREAM:   
  50.       code = Get_Word();             /* packet_length */
  51.       ld->Rdmax = ld->Rdptr + code;
  52.       code = Get_Byte();
  53.       if((code>>6)==0x02)
  54.       {
  55.         ld->Rdptr++;
  56.         code=Get_Byte();  /* parse PES_header_data_length */
  57.         ld->Rdptr+=code;    /* advance pointer by PES_header_data_length */
  58.         printf("MPEG-2 PES packetn");
  59.         return;
  60.       }
  61.       else if(code==0xff)
  62.       {
  63.         /* parse MPEG-1 packet header */
  64.         while((code=Get_Byte())== 0xFF);
  65.       }
  66.        
  67.       /* stuffing bytes */
  68.       if(code>=0x40)
  69.       {
  70.         if(code>=0x80)
  71.         {
  72.           fprintf(stderr,"Error in packet headern");
  73.           exit(1);
  74.         }
  75.         /* skip STD_buffer_scale */
  76.         ld->Rdptr++;
  77.         code = Get_Byte();
  78.       }
  79.       if(code>=0x30)
  80.       {
  81.         if(code>=0x40)
  82.         {
  83.           fprintf(stderr,"Error in packet headern");
  84.           exit(1);
  85.         }
  86.         /* skip presentation and decoding time stamps */
  87.         ld->Rdptr += 9;
  88.       }
  89.       else if(code>=0x20)
  90.       {
  91.         /* skip presentation time stamps */
  92.         ld->Rdptr += 4;
  93.       }
  94.       else if(code!=0x0f)
  95.       {
  96.         fprintf(stderr,"Error in packet headern");
  97.         exit(1);
  98.       }
  99.       return;
  100.     case ISO_END_CODE: /* end */
  101.       /* simulate a buffer full of sequence end codes */
  102.       l = 0;
  103.       while (l<2048)
  104.       {
  105.         ld->Rdbfr[l++] = SEQUENCE_END_CODE>>24;
  106.         ld->Rdbfr[l++] = SEQUENCE_END_CODE>>16;
  107.         ld->Rdbfr[l++] = SEQUENCE_END_CODE>>8;
  108.         ld->Rdbfr[l++] = SEQUENCE_END_CODE&0xff;
  109.       }
  110.       ld->Rdptr = ld->Rdbfr;
  111.       ld->Rdmax = ld->Rdbfr + 2048;
  112.       return;
  113.     default:
  114.       if(code>=SYSTEM_START_CODE)
  115.       {
  116.         /* skip system headers and non-video packets*/
  117.         code = Get_Word();
  118.         ld->Rdptr += code;
  119.       }
  120.       else
  121.       {
  122.         fprintf(stderr,"Unexpected startcode %08x in system layern",code);
  123.         exit(1);
  124.       }
  125.       break;
  126.     }
  127.   }
  128. }
  129. void Flush_Buffer32()
  130. {
  131.   int Incnt;
  132.   ld->Bfr = 0;
  133.   Incnt = ld->Incnt;
  134.   Incnt -= 32;
  135.   if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4))
  136.   {
  137.     while (Incnt <= 24)
  138.     {
  139.       if (ld->Rdptr >= ld->Rdmax)
  140.         Next_Packet();
  141.       ld->Bfr |= Get_Byte() << (24 - Incnt);
  142.       Incnt += 8;
  143.     }
  144.   }
  145.   else
  146.   {
  147.     while (Incnt <= 24)
  148.     {
  149.       if (ld->Rdptr >= ld->Rdbfr+2048)
  150.         Fill_Buffer();
  151.       ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
  152.       Incnt += 8;
  153.     }
  154.   }
  155.   ld->Incnt = Incnt;
  156. #ifdef VERIFY 
  157.   ld->Bitcnt += 32;
  158. #endif /* VERIFY */
  159. }
  160. unsigned int Get_Bits32()
  161. {
  162.   unsigned int l;
  163.   l = Show_Bits(32);
  164.   Flush_Buffer32();
  165.   return l;
  166. }
  167. int Get_Long()
  168. {
  169.   int i;
  170.   i = Get_Word();
  171.   return (i<<16) | Get_Word();
  172. }