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

DVD

开发平台:

Unix_Linux

  1. /*
  2.    File: vstream.cc
  3.    By: Alex Theo de Jong
  4.    Created: February 1996
  5.    
  6.    Description:
  7.    Video Stream buffer for MPEG player
  8. */
  9. #ifdef __GNUG__
  10. #pragma implementation
  11. #endif
  12. #include <stdio.h>
  13. #include <fstream.h>
  14. #include <sys/time.h>
  15. #include "athread.hh"
  16. #include "error.hh"
  17. #include "debug.hh"
  18. #include "util.hh"
  19. #include "sync.hh"
  20. #include "mpeg2const.hh"
  21. #include "mpeg2buff.hh"
  22. #include "vstream.hh"
  23. /*
  24.  *
  25.  * VideoStream
  26.  *
  27.  */
  28. VideoStream::VideoStream(const char* filename, int bitrate) :
  29.   bfr(0), value(0), bytes(0), bytes_available(0), chunksize(512), incnt(0), file(True) {
  30.   inputstream=new Mpeg2Input(filename, 8196, bitrate);
  31.   sync=0;
  32. }
  33. VideoStream::VideoStream(Mpeg2Buffer* input, Synchronization* s) :  
  34.   bfr(0), value(0), bytes(0), bytes_available(0), chunksize(512*10), incnt(0), file(False) {
  35.   inputstream=input;
  36.   sync=s;
  37. }
  38. VideoStream::~VideoStream(){
  39.   inputstream->close();
  40.   if (file) delete inputstream;
  41. }
  42. unsigned int VideoStream::getNewByte(){
  43. int i;
  44.   if (sync)  i = sync->usedbytes(1, chunksize);
  45.   if ((bytes=bytes_available=inputstream->waitforbytes(chunksize))<=0){
  46.     TRACER("Video done - exit on waitforbytes");
  47.     athr_exit(0);
  48.   }
  49. //  if (sync) sync->usedbytes(1, bytes);
  50. //  if (sync) sync->usedbytes(1, chunksize);
  51.   return inputstream->getbyte();
  52. }
  53. #ifdef DEBUG
  54. // This stuff is declared inline if not DEBUG
  55. void VideoStream::fill(){
  56.   if (!incnt) bfr=0; for (; incnt<=24; incnt+=8) bfr|=(getbyte() << (24 - incnt)); 
  57. }
  58. unsigned int VideoStream::startcode(){
  59.   if (incnt&7){ bfr<<=(incnt&7); incnt-=(incnt&7); }     // Byte align & fill bfr
  60.   fill();
  61.   for (; ((bfr >> 8)!=Packet_start_code_prefix); ){ bfr<<=8; bfr|=getbyte(); }  // search
  62.   return bfr;
  63. }
  64. #endif