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

DVD

开发平台:

Unix_Linux

  1. /*
  2.    File: mpeg2demux.hh
  3.    By: Alex Theo de Jong
  4.    Created: February 1996
  5.    Description:
  6.    MPEG 2 Transport Stream Demultiplexer. MPEG 2 Audio/Video players
  7.    are invoked automatically when detected in the stream. Arguments
  8.    are used to specify whether audio or video should be suppressed. 
  9. */
  10. #ifndef __mpeg2demux_hh
  11. #define __mpeg2demux_hh
  12. extern unsigned int MPEG2_TS_Packet_size;
  13. const int Pid_Max           = 20;        // Maximum number of PIDs in one stream
  14. class Mpeg2Audio;
  15. class Mpeg2Video;
  16. /*
  17.  *
  18.  * MPEG 2 Transport Stream De-Multiplexer
  19.  *
  20.  */
  21. class Mpeg2Demux {
  22.   // input stream
  23.   String filename;  // filename of file to be analyzed
  24.   ifstream file;
  25.   int bitrate;
  26.   unsigned int file_size;  // maximum size of file to be analyzed (in bytes)
  27.   int eof;
  28.   athr_t thread_id; // demux thread id
  29.   int terminate;    // action
  30.   int terminated;   // indication
  31.   struct timeval tstart, tstop;  // for runtime calculation
  32.   // 2 MPEG Transport Packets (conform ATM Forum (N*MPEG TS / AAL)
  33.   unsigned char* aalpdu, *aalpdu_max;
  34.   int aalpdu_size, lastpdu_size;
  35.   unsigned char* byteptr;
  36.   unsigned char* pdu_mpeg_packet;  // offset within pdu for current Mpeg packet
  37.   unsigned int bytecount;
  38.   // for next/getbits operations
  39.   unsigned char c;
  40.   // output streams
  41.   Mpeg2Buffer* audio_buffer;
  42.   Mpeg2Buffer* video_buffer;
  43.   // Synchronization for audio and video based on PCR
  44.   Synchronization* sync;
  45.   // counters for each pes packet
  46.   int pes_audio_bytes;
  47.   int pes_video_bytes;
  48.   double pes_audio_time;
  49.   double pes_video_time;
  50.   // Pid
  51.   int audio_pid, video_pid;
  52.   int audio_on, video_on; // booleans to turn audio/video on/off
  53.   int sync_on;
  54.   // Audio and video objects
  55.   Mpeg2Audio* audio;
  56.   Mpeg2Video* video;
  57.   int quiet;  // ie. no output messages
  58.   int vstream;  // e.g. 0 or 1  videostream
  59.   int astream;  // audiostream
  60.   // various counters
  61.   unsigned int counter;
  62.   int stream_type, transport_packets, transport_packet_errors, 
  63.       sync_byte_errors, lost_packets, continuity_counters[Pid_Max],
  64.       program_association_tables,
  65.       adaptation_fields, pes_packets, psi_packets, 
  66.       audio_packets, video_packets;      
  67.   // Transport Header Info
  68.   int transport_error_indicator, payload_unit_start_indicator, 
  69.       transport_priority, pid, adaptation_field_control,
  70.       transport_scrambling_control, continuity_counter,
  71.       pidtable[Pid_Max];
  72.   // program associated table
  73.   int table_id, transport_stream_id, section_length;
  74.   
  75.  protected:
  76.   int copybytes(Mpeg2Buffer* out, int length);
  77.   int skipbytes(int length);
  78.   int nextpacket();
  79.   int copy_ps_bytes(Mpeg2Buffer* out, unsigned int *header,int len);
  80.   int skip_ps_bytes(unsigned int *header);
  81.   unsigned int nextbits8(){
  82.     if (bytecount+1>MPEG2_TS_Packet_size) { nextpacket(); }
  83.     return byteptr[0];
  84.   }
  85.   unsigned int nextbits16(){
  86.     if ((bytecount+2)>MPEG2_TS_Packet_size) warning("nextbits16 beyond packet length");
  87.     return ((byteptr[0] << 8) | byteptr[1]); 
  88.   }
  89.   unsigned int nextbits24(){
  90.     if ((bytecount+3)>MPEG2_TS_Packet_size) warning("nextbits24 beyond packet length");
  91.     return ((byteptr[0] << 16) | (byteptr[1] << 8) | byteptr[2]);  
  92.   }
  93.   unsigned int nextbits32(){
  94.     if ((bytecount+4)>MPEG2_TS_Packet_size) warning("nextbits32 beyond packet length");
  95.     return ((byteptr[0] << 24) | (byteptr[1] << 16) | (byteptr[2] << 8) | byteptr[3]); 
  96.   }
  97.   unsigned int getbits8(){ c=nextbits8(); byteptr++; bytecount++; return c; }
  98. #if defined(IRIX) && !defined(__GNUG__)   
  99.   // Only with Native SGI C++ Compiler
  100.   unsigned int value;
  101.   unsigned int getbits16(){ return ((value=getbits8()<<8) |= getbits8()); }
  102.   unsigned int getbits24(){ 
  103.     return (((value=getbits8()<<16) |= getbits8()<<8) |= getbits8());
  104.   }
  105.   unsigned int getbits32(){ 
  106.     return ((((value=getbits8()<<24) |= getbits8()<<16) |= getbits8()<<8) |= getbits8());
  107.   }
  108. #else
  109.   unsigned int getbits16(){ return ((getbits8() << 8) | getbits8()); }
  110.   unsigned int getbits24(){
  111.     return ((getbits8() << 16) | (getbits8() << 8) | getbits8()); 
  112.   }
  113.   unsigned int getbits32(){
  114.     return ((getbits8() << 24) | (getbits8() << 16) | (getbits8() << 8) | getbits8()); 
  115.   }
  116. #endif
  117.   // MPEG 2 Transport Stream (TS)
  118.   int transport_stream();
  119.   int get_transport_packet();
  120.   int get_sync_byte(){ return (nextbits8()==Sync_byte) ? 1 : 0; }
  121.   int get_adaptation_field();
  122.   int get_payload();
  123.   int get_program_association_table();
  124.   int get_pes_packet();
  125.   int get_pes_packet_data(int stream_id);
  126.   int get_pes_packet_header(unsigned long& pts, unsigned long& dts);
  127.   int get_psi_packet();
  128.   int get_audio_data();
  129.   int get_video_data();
  130.   int get_unknown_data();
  131.   // MPEG 2 Program Stream (PS)
  132.   int program_stream();  // with or without "pack" layer
  133.   int get_program_pack();
  134.   int get_ps_pes_packet(unsigned int *header);
  135.   int get_pack_header(unsigned int *header);
  136.   int get_system_header();
  137.   // MPEG2 Packetized Elementary Streams (PES)
  138.   int pes_stream_video();
  139.   int pes_stream_audio();
  140.   static void* init(Mpeg2Demux*);
  141.  public:
  142.   Mpeg2Demux(int pdu_size, int vstream=0, int astream = 0, int a_on=1, int v_on=1, int s_on=0, int q=0);
  143.   ~Mpeg2Demux();
  144.   int select(unsigned int stream_id){ return vstream=stream_id; }
  145.   int pause(){ return (sync) ? sync->pause() : athr_suspend(thread_id); }
  146.   int resume(){ return (sync) ? sync->resume() : athr_continue(thread_id); }
  147.   int stop();
  148.   int done(){ return terminated; }
  149. };
  150. #endif