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

DVD

开发平台:

Unix_Linux

  1. /*
  2.    File: astream.cc
  3.    By: Alex Theo de Jong
  4.    Created: February 1996
  5. */
  6. #include <stdio.h>
  7. #include <fstream.h>
  8. #include <sys/time.h>
  9. #include <unistd.h>
  10. #include "athread.hh"
  11. #include "error.hh"
  12. #include "debug.hh"
  13. #include "util.hh"
  14. #include "sync.hh"
  15. #include "mpeg2const.hh"
  16. #include "mpeg2buff.hh"
  17. #include "astream.hh"
  18. /*
  19.  *
  20.  * AudioStream
  21.  *
  22.  */
  23. AudioStream::AudioStream(const char *filename) :
  24.   word(0),  frames(0), bitindex(0), file(True), bytes(0)
  25. {
  26.   inputstream=new Mpeg2Input(filename, 8196);
  27.   sync=0;
  28. }
  29. AudioStream::AudioStream(Mpeg2Buffer* input, Synchronization* s) :
  30.   word(0), frames(0), bitindex(0), file(False), bytes(0)
  31. {
  32.   if (!(inputstream=input)){
  33.     error("no audio input buffer");
  34.     athr_exit(0);
  35.   }
  36.   sync=s;
  37. }
  38. AudioStream::~AudioStream(void){
  39.   if (inputstream) inputstream->close();
  40.   if (file) delete inputstream;
  41. }
  42. #if DEBUG
  43. unsigned int AudioStream::get_bits(int n){ 
  44.   for (; bytes && bitindex <= 24; bitindex += 8, bytes--)
  45.     word|=(inputstream->getbyte() << (24 - bitindex));
  46.   value=0;
  47.   value=(word >> (32-n));
  48.   bitindex-=n;
  49.   word<<=n;
  50.   return value;
  51. }
  52. bool AudioStream::get_header(unsigned int& headerstring){
  53.   TRACER("bool AudioStream::get_header(unsigned int& headerstring)");
  54.   if (bytes) inputstream->skipbytes(bytes);
  55.   if (sync) sync->usedbytes(2, 4);  // 2 is audio ID, 4 is number of bytes
  56.   if (inputstream->waitforbytes(4)!=4){
  57.     TRACER("audio stream failed - exit");
  58.     athr_exit(0);
  59.     return False;
  60.   }
  61.   headerstring=inputstream->getbits32();
  62.   inputstream->signal_buffer();
  63.   while (((headerstring & 0xfff00000)!=0xfff00000) ){
  64.     // In search mode for next header
  65.     if (inputstream->waitforbytes(1)!=1){
  66.       TRACER("audio stream failed - exit");
  67.       athr_exit(0);
  68.       return False;
  69.     }
  70.     headerstring<<=8;
  71.     headerstring|=(inputstream->getbyte() & 0x000000ff);
  72.     inputstream->signal_buffer();
  73.   }
  74.   return (headerstring) ? True : False;
  75. }
  76. bool AudioStream::read_frame(int bytesize){
  77.   if ((bytes=inputstream->waitforbytes(bytesize))!=bytesize){
  78.     TRACER("audio stream failed - exit");
  79.     athr_exit(0);
  80.     return False;
  81.   }
  82.   if (sync) sync->usedbytes(2, bytesize);  // 2 is audio ID, bytesize is number of bytes
  83.   frames++;
  84.   bitindex=0;
  85.   return True;
  86. }
  87. #endif