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

DVD

开发平台:

Unix_Linux

  1. /*
  2.    File: mpeg2buff.hh
  3.    By: Alex Theo de Jong
  4.    Created: February 1996
  5.    Description:
  6.    "Multi-Threading Save" read/write buffer
  7. */
  8. #ifndef __mpeg2buff_hh
  9. #define __mpeg2buff_hh
  10. #ifdef __GNUG__
  11. #pragma interface
  12. #endif
  13. #include <unistd.h>
  14. #include <sys/time.h>
  15. class Memory {
  16.  private:
  17.   // Normal memory space
  18.   unsigned char *mem_min, *mem_max, *mem_begin, *mem_end;
  19.   short end_ahead;
  20.  protected:
  21.   int mem_size;
  22.  protected:
  23.   Memory(int size);
  24.   ~Memory();
  25.   int unused();
  26.   int put(unsigned char* data, int size);
  27.   int get(unsigned char* data, int size);
  28.   int reset();
  29.   unsigned char getchr() ;
  30.   int mem_skip(int bytes);
  31.  public:
  32.   int used();
  33.   // USE THESE IN COMBINATION WITH waitforbytes!!!!
  34.   unsigned int getbyte();
  35. #if defined(IRIX) && !defined(__GNUG__)
  36.   // Only with Native SGI C++ Compiler
  37.   unsigned int value; // used in getbits32
  38.   unsigned int getbits32(){ 
  39.     return (((((value=getchr()<<24)) |= (getchr()<<16)) |= (getchr()<<8)) |= getchr());
  40.   }
  41. #else
  42.   // unsigned int getword(){ return ((getchr() << 8) | getchr()); }
  43.   // unsigned int getbits24(){ return ((getchr() << 16) | (getchr() << 8) | getchar()); }
  44.   unsigned int getbits32();
  45. #endif
  46. };
  47. class Mpeg2Buffer : public Memory {
  48.  private:
  49.   int rsize;  // variable to be used in waitforbytes
  50.   Condition memory_in_cond, memory_out_cond;
  51.   MutexLock mem_lock;
  52.  protected:
  53.   void lock();
  54.   void unlock();
  55.   void wait_write();
  56.   void wait_read();
  57.   void signal_write();
  58.   void signal_read();
  59.   int completed;
  60.  public:
  61.   Mpeg2Buffer(int size);
  62.   ~Mpeg2Buffer();
  63.   int close();
  64.   int waitforbytes(int size);
  65.   int available();
  66.   int maximum() ;
  67.   void signal_buffer();
  68.   // Normal read/write operations
  69.   int read(unsigned char* data, int size);
  70.   int write(unsigned char* data, int size);
  71.   int skipbytes(int size);
  72. };
  73. class Mpeg2Input : public Mpeg2Buffer {
  74.   int fd;
  75.   int buffer_size, bitrate;
  76.   athr_t id;
  77.  public:
  78.   Mpeg2Input(const char* filename, int size, int bitrate=0);
  79.   ~Mpeg2Input(){ athr_join(id); ::close(fd); }
  80.   static void* filereader(Mpeg2Input*);
  81. };
  82. class Mpeg2Timer {
  83.   MutexLock timer_lock;
  84.   Condition timer_cond;
  85.   timespec time;
  86.   timeval time_new;
  87.   timeval time_out;
  88.  protected:
  89.   void lock();
  90.   void unlock();
  91.  public:
  92.   Mpeg2Timer();
  93.   ~Mpeg2Timer();
  94.   int wait(int interval_usec);     // use while and yield
  95.   int waitcond(int interval_usec); // use condition
  96. };
  97. #endif // __mpeg2buff_hh