vstream.hh
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:2k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.    File: vstream.hh
  3.    By: Alex Theo de Jong
  4.    Created: Fabruary 1996
  5. */
  6. #ifdef HAVE_MMX
  7. #include <mmx.h>
  8. #endif
  9. #ifndef __vstream_hh
  10. #define __vstream_hh
  11. #ifdef __GNUG__
  12. #pragma interface
  13. #endif
  14. class VideoStream {
  15.   Mpeg2Buffer* inputstream;
  16.   Synchronization* sync;
  17.   unsigned int bfr, value;  // bfr = buffer for integer, value=temporary storage for getbits
  18.   int bytes, bytes_available, chunksize;  // chunk of data to be read from buffer
  19.   int incnt;
  20.   bool file;                // reading from file?
  21.  protected:
  22. #ifndef DEBUG
  23.   void fill(){ if (!incnt) bfr=0; for (; incnt<=24; incnt+=8) bfr|=(getbyte() << (24 - incnt)); }
  24. #else
  25.   void fill();
  26. #endif
  27. //  void refill(){ for (bfr=0, incnt=0; incnt<=24; incnt+=8) bfr|=(getbyte() << (24 - incnt));  }
  28.   void refill() {
  29.     if (bytes > 4) {
  30.        bfr = inputstream->getbits32(); incnt = 32; bytes -= 4;
  31.     } else {
  32.       for (bfr=0, incnt=0; incnt<=24; incnt+=8) bfr|=(getbyte() << (24 - incnt));
  33.     }
  34.   }
  35.   unsigned int getNewByte();
  36.   unsigned int getbyte(void){ return (--bytes<0) ? getNewByte() : inputstream->getbyte(); }
  37.  public:
  38.   VideoStream(const char* filename, int bitrate=0);
  39.   VideoStream(Mpeg2Buffer* input, Synchronization* s);
  40.   ~VideoStream();
  41.   void flushbits(int n){
  42.     if (incnt<n){ n-=incnt; refill(); }
  43.     incnt-=n; 
  44.     bfr<<=n;
  45.   }
  46.   unsigned int showbits(int n);
  47.   unsigned int startcode();
  48.   unsigned int getbits(int n);
  49.   int getposition() const { return (8*(bytes_available-bytes)); }
  50.   int set_read_block_size(int size){ return (size>0) ? (chunksize=size) : -1; }
  51. };
  52. #ifndef DEBUG
  53. inline unsigned int VideoStream::startcode(){
  54.   if (incnt&7){ bfr<<=(incnt&7); incnt-=(incnt&7); }     // Byte align & fill bfr
  55.   fill();
  56.   for (; ((bfr >> 8)!=Packet_start_code_prefix); ){ bfr<<=8; bfr|=getbyte(); }  // search
  57.   return bfr;
  58. }
  59. #endif
  60. inline unsigned int VideoStream::showbits(int n){
  61.   fill();
  62.   return (n==32) ? bfr : (bfr >> (32-n));
  63. }
  64. inline unsigned int VideoStream::getbits(int n){ 
  65.   value = 0;
  66.   if (incnt<n){
  67.     if (incnt){
  68.       n-=incnt;
  69.       value=((bfr >> (32 - incnt)) << n);
  70.     }
  71.     refill();
  72.   }
  73.   value|=(bfr >> (32-n));
  74.   incnt-=n;
  75.   bfr<<=n;
  76.   return value;
  77. }
  78. #endif  // __vstream_hh