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

DVD

开发平台:

Unix_Linux

  1. /*
  2.    File: mpeg2demux.cc
  3.    Description:
  4.    The MPEG 2 demultiplexer class reads MPEG 2 TS, PS and PES data 
  5.    and demultiplexes a Transport Stream or Program Stream in its 
  6.    Packetized Elementary Streams. Elementary Streams are just passed 
  7.    through.
  8.    Created: February 1996, Alex Theo de Jong, NIST
  9. */
  10. #include "athread.hh"
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <String.h>
  14. #include <fstream.h>
  15. #include <sys/errno.h>
  16. #ifdef IRIX
  17. #include <dmedia/audio.h>
  18. #endif
  19. #ifdef SOLARIS
  20. #include <sys/audioio.h>
  21. #endif
  22. // network stuff 
  23. #include <sys/types.h>
  24. #include <sys/uio.h>
  25. #include <unistd.h>
  26. #include <errno.h>
  27. #include "error.hh"
  28. #include "debug.hh"
  29. #include "util.hh"
  30. #include "sync.hh"
  31. #include "mpeg2const.hh"
  32. #include "mpeg2buff.hh"
  33. #include "mpeg2audio.hh"
  34. #include "mpeg2video.hh"
  35. #include "mpeg2demux.hh"
  36. #include "network.hh"
  37. // Options for Audio and Video player
  38. extern int audio_argc;
  39. extern char** audio_argv;
  40. extern int video_argc;
  41. extern char** video_argv;
  42. extern int time_stamp_qsize;
  43. extern int frame_stamp_qsize;
  44. extern int audio_buffer_size;
  45. extern int video_buffer_size;
  46. // Input socket
  47. extern SocketMulti* sock;
  48. #ifdef TRACE
  49. Mpeg2Buffer* ab=0;
  50. Mpeg2Buffer* vb=0;
  51. Synchronization* ds=0;
  52. #endif
  53. #define DELIMITER   0x001B8
  54. /*
  55.  *
  56.  * De-multiplexor
  57.  *
  58.  */
  59. Mpeg2Demux::Mpeg2Demux(int pdu_size, int sel_vstream, int sel_astream, int a_on, int v_on, int s_on, int q) :
  60.   pes_audio_bytes(0),
  61.   pes_video_bytes(0),
  62.   pes_audio_time(0.0),
  63.   pes_video_time(0.0),
  64.   audio_on(a_on),
  65.   video_on(v_on),
  66.   sync_on(s_on),
  67.   quiet(q),
  68.   vstream(sel_vstream),
  69.   astream(sel_astream)
  70. {
  71.   audio_buffer=new Mpeg2Buffer(audio_buffer_size);
  72.   video_buffer=new Mpeg2Buffer(video_buffer_size);
  73. #ifdef TRACE
  74.   ::ab=audio_buffer;
  75.   ::vb=video_buffer;
  76. #endif
  77.   aalpdu_size=pdu_size;
  78.   aalpdu=new unsigned char[aalpdu_size+1];
  79.   aalpdu_max=aalpdu+aalpdu_size;
  80.   // input counters
  81.   bytecount=0;
  82.   byteptr=0;
  83.   pdu_mpeg_packet=aalpdu_max; // set to max for proper init
  84.   // MPEG packet counters 
  85.   counter=0;
  86.   transport_packets=0;
  87.   transport_packet_errors=0;
  88.   sync_byte_errors=0;
  89.   lost_packets=0;
  90.   adaptation_fields=0;
  91.   program_association_tables=0;
  92.   pes_packets=0;
  93.   psi_packets=0;
  94.   audio_packets=0;
  95.   video_packets=0;
  96.   // transport packet header information
  97.   transport_error_indicator=0;
  98.   payload_unit_start_indicator=0;
  99.   pid=0;
  100.   audio_pid=-1;
  101.   video_pid=-1;
  102.   adaptation_field_control=0;
  103.   audio=0;
  104.   video=0;
  105.   sync=0;
  106.   int err;
  107. #ifdef EOFEXIT
  108.   Mpeg2Demux::init(this);
  109. #else
  110.   if ((err=athr_create((void*(*)(void*))Mpeg2Demux::init, this, &thread_id))<0){
  111.     error("could not create thread");
  112.   }
  113.   sched_param param;
  114.   int policy;
  115.   if ((err=athr_getschedparam(thread_id, &policy, &param))<0){
  116.     warning("could not get thread prio - ignored");
  117.   }
  118.   else {
  119. #ifdef LINUX
  120.     param.sched_priority+=1;
  121. //    policy = SCHED_RR;
  122.     TRACER("TIMERPRIORITY=" << param.sched_priority << "(" << param.sched_priority-1 << ")");
  123. #else
  124.     param.prio+=1;
  125.     TRACER("TIMERPRIORITY=" << param.prio << "(" << param.prio-1 << ")");
  126. #endif
  127.     if ((err=athr_setschedparam(thread_id, policy, &param))<0){
  128.       warning("could not set thread prio - ignored");
  129.     }
  130.   }
  131. //  TRACER("DEMUXPRIORITY=" << param.prio);
  132. #endif
  133.   terminated=0;
  134. }
  135. Mpeg2Demux::~Mpeg2Demux(){
  136.   TRACER("Mpeg2Demux::~Mpeg2Demux()");
  137.   if (!terminated){ // check if thread is still alive
  138.     TRACER("waiting for demux thread to terminate ...");
  139.     athr_join(thread_id);
  140.   }
  141.   TRACER("delete video ...");
  142.   delete video;
  143.   TRACER("video deletedndelete audio ...");
  144.   delete audio;
  145.   TRACER("audio deletedndelete sync ...");
  146.   delete sync;
  147.   TRACER("sync deletedndemux deleted");
  148.   delete aalpdu;
  149.   delete audio_buffer;
  150.   delete video_buffer;
  151. }
  152. int Mpeg2Demux::stop(){
  153.   terminate=1;
  154.   if (!terminated){    // check to see if thread is available
  155.     athr_join(thread_id);
  156.     gettimeofday(&tstop,(struct timezone *)NULL); 
  157.     int runtime = 1000*(tstop.tv_sec-tstart.tv_sec) + (tstop.tv_usec-tstart.tv_usec)/1000;
  158.     msg("Bitrate: "); 
  159.     msg(dtoa(counter*MPEG2_TS_Packet_size*8/runtime));
  160.     message(" Kbps");
  161.   }
  162.   return terminated; 
  163. }
  164. void* Mpeg2Demux::init(Mpeg2Demux* base){
  165.   TRACER("void* Mpeg2Demux::init(Mpeg2Demux* base)");
  166.   base->terminate=0;
  167.   base->terminated=0;
  168.   if (base->sync_on){
  169.     if (base->video_on && base->audio_on)
  170.       base->sync=new Synchronization(0, time_stamp_qsize, frame_stamp_qsize); // sync video/audio
  171.     if (base->video_on && !base->audio_on)
  172.       base->sync=new Synchronization(1, time_stamp_qsize, frame_stamp_qsize); // just video
  173.     if (!base->video_on && base->audio_on)
  174.       base->sync=new Synchronization(2, time_stamp_qsize, frame_stamp_qsize); // just audio
  175.   }
  176.   else base->sync=0;
  177.   if (base->video_on)
  178.     base->video=new Mpeg2Video(base->video_buffer, base->sync, video_argc, video_argv);
  179.   else base->video=0;
  180.   if (base->audio_on)
  181.     base->audio=new Mpeg2Audio(base->audio_buffer, base->sync, base->audio_on, audio_argc, audio_argv);
  182.   else base->audio=0;
  183.   // wait for network connection or file to be ready!
  184.   sock->accept();
  185.   if (0){
  186.     error("could not receive connection!");
  187.     athr_exit(0);
  188.   }
  189.   if (base->nextpacket()<=0){  // init first pdu
  190.     error("could not read first packet");
  191.     athr_exit(0);
  192.   }
  193.   unsigned int bits=base->nextbits32();
  194.   gettimeofday(&base->tstart,(struct timezone *)NULL); 
  195.   if (((bits >> 24) & 0xff)==Sync_byte){
  196.     message("Playing MPEG 2 TS Audio/Video");
  197. #ifdef TRACE
  198.     ::ds=base->sync;
  199. #endif      
  200.     base->transport_stream();
  201.   }
  202.   else if (bits == Pack_start_code){
  203.     // Create players and start
  204.     message("Playing MPEG 2 PS Audio/Video");
  205.     base->program_stream();
  206.   }
  207.   else if (base->audio_on && (bits & 0xfff00000)==0xfff00000){  // just plain audio
  208.     message("Playing MPEG 2 PES Audio");
  209.     base->pes_stream_audio();
  210.   }
  211.   else if (base->video_on && bits==Sequence_start_code){ // just video
  212.     message("Playing MPEG 2 PES Video");
  213.     base->pes_stream_video();
  214.   }
  215.   else error("Stream is not valid MPEG 2 Stream (TS, PS, Audio ES, Video ES)");
  216.   base->stop();
  217.   base->terminated=1;
  218.   TRACER("demux thread done");
  219. #ifdef EOFEXIT
  220.   exit(0);  // stop everything right here (after EOF!)
  221. #else
  222.   athr_exit(0);
  223. #endif
  224.   return 0;
  225. }
  226. int Mpeg2Demux::copybytes(Mpeg2Buffer* output, int length){
  227.   if (bytecount+length>MPEG2_TS_Packet_size){
  228.     warning("copying bytes beyond transport packet length");
  229.     length=MPEG2_TS_Packet_size-bytecount;
  230.   }
  231.   if (output->write(byteptr, length)!=length){
  232.     error("failed to copy input to output");    // write to output
  233.   }
  234.   bytecount+=length;
  235.   byteptr+=length;
  236.   return length;
  237. }
  238. int Mpeg2Demux::skipbytes(int length){
  239.   int i = length;
  240.   while(i--)
  241.     getbits8();
  242.   return length;
  243.   if (bytecount+length>MPEG2_TS_Packet_size){
  244.     warning("skipping bytes beyond transport packet length");
  245.     length=MPEG2_TS_Packet_size - bytecount;
  246.   }
  247.   bytecount+=length;
  248.   byteptr+=length;
  249.   return length;
  250. }
  251. int Mpeg2Demux::copy_ps_bytes(Mpeg2Buffer* output, unsigned int *header,int len){
  252.   unsigned char c;
  253. //    if (video_on == 2) {
  254.       if (output->write(byteptr, len)!=len){
  255.         error("failed to copy input to output");    // write to output
  256.       }
  257.       if (!nextpacket()) {
  258.         *header = 0;
  259.         return 1;
  260.       }
  261.       *header = getbits32();
  262. #if 0
  263.     }
  264.     else {
  265.       *header = getbits32();
  266.       while ((*header <= DELIMITER) || (*header > 0x1ff)) {
  267.         c = *header >> 24;
  268.         *header = (*header << 8) | getbits8();
  269.         if (output->write(&c, 1)!=1){
  270.           error("failed to copy input to output");    // write to output
  271.         }
  272.       }
  273.     }
  274. #endif
  275.   return 0;
  276. }
  277. int Mpeg2Demux::skip_ps_bytes(unsigned int *header){
  278. //  if (video_on==2) {
  279.     if (!nextpacket()) {
  280.       *header = 0;
  281.       return 1;
  282.     }
  283.     *header = getbits32();
  284.     return 0;
  285. #if 0
  286.   }
  287.   else {
  288.     *header = getbits32();
  289.     while ((*header <= DELIMITER) || (*header >  0x1ff)){
  290.       *header = (*header << 8) |  getbits8();
  291.     }
  292.   }
  293. #endif
  294.   return 0;
  295. }
  296. int Mpeg2Demux::nextpacket(){  
  297.   DEBUGGER("int Mpeg2Demux::nextpacket()");
  298.   if (pdu_mpeg_packet>=aalpdu_max){
  299.     DEBUGGER("sock->recv()");
  300.     if ((lastpdu_size=sock->recv(aalpdu, aalpdu_size))!=aalpdu_size){
  301.       if (lastpdu_size==0){
  302.        
  303. // if (audio_buffer)
  304. //          while (audio_buffer->used() > 10000 )  sleep(1);
  305. // if (video_buffer) 
  306. //          while (video_buffer->used() > 30000 ) sleep(1);
  307. sleep(1);
  308.         terminate=1;
  309.         if (sync) sync->stop();
  310.         if (audio) audio->stop();
  311.         if (video) video->stop();
  312. sleep(1);
  313.         if (sync) sync->stop();
  314.         TRACER("EOF!");
  315.         return 0; // eof
  316.       }
  317.       error("invalid pdu size (" << itoa(lastpdu_size) << ")");
  318.       return -1;
  319.     }
  320.     byteptr=pdu_mpeg_packet=aalpdu;
  321.     pdu_mpeg_packet+=MPEG2_TS_Packet_size;
  322.     bytecount=0;
  323.   }
  324.   else {
  325.     byteptr=pdu_mpeg_packet;
  326.     pdu_mpeg_packet+=MPEG2_TS_Packet_size;
  327.     bytecount=0;
  328.   }
  329.   return 1;
  330. }
  331. /*
  332.  *
  333.  * Mpeg Transport Stream
  334.  *
  335.  */
  336. int Mpeg2Demux::transport_stream(){
  337.   do {
  338.     counter++;
  339.     if (!get_transport_packet()){
  340.       if (!quiet){
  341.         String err("incorrect packet ");
  342.         err+=itoa(counter);
  343.         error(err.chars());
  344.       }
  345.     }
  346.     if (!quiet){
  347.       if ((counter % 100)==0) msg(".");
  348.       if ((counter % 5000)==0){
  349.         message(itoa(counter));
  350.         athr_yield();
  351.       }
  352.     }
  353.     if (terminate){
  354.       if ((!sync || sync->stop()) && (!audio || audio->stop()) && (!video || video->stop()))
  355.         break;  // continue until all threads terminated
  356.     }
  357.   }
  358.   while (nextpacket());
  359.   TRACER("closing audio buffer ...");
  360.   audio_buffer->close();
  361.   TRACER("closed audio buffernclosing video buffer ...");
  362.   video_buffer->close();
  363.   TRACER("closed video buffer");
  364.   file.close();
  365.   return (counter==0) ? 0 : 1;
  366. }
  367. int Mpeg2Demux::get_transport_packet(){  
  368.   if (get_sync_byte()){              // align with sync
  369.     transport_packets++;
  370.     unsigned int bits=(getbits24() & 0x0000ffff);  // drop sync byte
  371.     // printf("First 2 bytes: %dn", bits);
  372.     // exit(0);
  373.     transport_error_indicator=bits >> 15;
  374.     payload_unit_start_indicator=(bits >> 14) & 1;
  375.     pid=bits & 0x00001fff;
  376.     transport_scrambling_control=(nextbits8() >> 6)&0x3;
  377.     adaptation_field_control=(nextbits8() >> 4)&0x3;
  378.     continuity_counter=(getbits8()&0xf);
  379.     if (transport_error_indicator){
  380.       transport_packet_errors++;
  381.       return 0;  // error set!
  382.     }
  383.     if (pid==0x1fff){
  384.       return 1;  // padding; just go to next
  385.     }
  386.     int i;
  387.     for (i=0; pidtable[i]!=0 && pid!=pidtable[i]; i++); // get pid
  388.     if (pidtable[i]==0){  // not in table yet
  389.       pidtable[i]=pid;
  390.       continuity_counters[i]=continuity_counter;  // init
  391.       pidtable[i+1]=0;
  392.     }
  393.     
  394.     if (pid!=(int)Program_Association_Table && pid!=(int)Conditional_Access_Table
  395.         && (adaptation_field_control==1 || adaptation_field_control==3)){
  396.       // Check counters
  397.       if (continuity_counters[i]!=continuity_counter){
  398.         if (!quiet){
  399.           String err("lost MPEG ");
  400.           err+=itoa(continuity_counter-continuity_counters[i]);
  401.           err+=" packet(s)";
  402.           error(err.chars());
  403.         }
  404.         continuity_counters[i]=continuity_counter; // reset
  405.         lost_packets++;
  406.       }
  407.       if (++continuity_counters[i]>15) continuity_counters[i]=0;
  408.     }
  409.     if (adaptation_field_control==2 || adaptation_field_control==3)
  410.       get_adaptation_field();
  411.     if (adaptation_field_control==1 || adaptation_field_control==3)
  412.       get_payload();
  413.   }
  414.   else {
  415.     sync_byte_errors++;
  416.     return 0;
  417.   }
  418.   return 1;
  419. }
  420. int Mpeg2Demux::get_adaptation_field(){
  421.   adaptation_fields++;
  422.   int length=getbits8();                        // get adaptation field length
  423. // int discontinuity_indicator=(nextbits8() >> 7);
  424. // int random_access_indicator=(nextbits8() >> 6) & 1;
  425. // int elem_prio_indicator=(nextbits8() >> 5) & 1; // not used at this point;
  426.   int pcr_flag=(getbits8() >> 4) & 1;           // get first byte
  427.   if (pcr_flag){
  428.     unsigned long clk_ref_base=getbits32();
  429.     unsigned int clk_ref_ext=getbits16();
  430.     if (clk_ref_base>0x7fffffff){   // correct for invalid numbers
  431.       clk_ref_base=0;               // ie. longer than 32 bits when multiplied by 2
  432.       clk_ref_ext=0;                // multiplied by 2 corresponds to shift left 1 (<<=1)
  433.     }
  434.     else {
  435.       clk_ref_base<<=1; // Create space for bit
  436.       clk_ref_base|=(clk_ref_ext >> 15);          // Take bit
  437.       clk_ref_ext&=0x01ff;                        // Only lower 9 bits
  438.     }
  439.     
  440.     double time=clk_ref_base + clk_ref_ext/300;
  441.     TRACER("Time: " << dtoa(time));
  442.     if (sync) sync->put(time);  // id=0, Timer
  443.     if (length) skipbytes(length - 7);
  444.   }
  445.   else skipbytes(length - 1);
  446.   return 1;
  447. }
  448. int Mpeg2Demux::get_payload(){
  449.   if (payload_unit_start_indicator){
  450.     if (pid==0) get_program_association_table();
  451.     else if (nextbits24()==Packet_start_code_prefix) get_pes_packet();
  452.     else skipbytes(MPEG2_TS_Packet_size - bytecount);  // get_psi_packet();
  453.   }
  454.   else {
  455.     if (pid==audio_pid) get_audio_data();
  456.     else if (pid==video_pid) get_video_data();
  457.     else skipbytes(MPEG2_TS_Packet_size - bytecount);
  458.   }
  459.   return 1;
  460. }
  461. int Mpeg2Demux::get_program_association_table(){
  462.   program_association_tables++;
  463.   table_id=getbits8();
  464.   section_length=getbits16() & 0xfff;   // last 12 bits
  465.   transport_stream_id=getbits16();
  466.   
  467.   skipbytes(MPEG2_TS_Packet_size-bytecount);
  468. /*  
  469.   for (int i=0; i<section_length-9; i+=4) getbits32();
  470.   i-=4;
  471.   if ((i+9)>(MPEG2_TS_Packet_size-4)) error("too many bytes in program association table");
  472. */
  473.   return 1;
  474. }
  475. int Mpeg2Demux::get_pes_packet_data(int stream_id){
  476.   unsigned long pts(0), dts(0);
  477.   if ((stream_id >> 4)==12 || (stream_id >> 4)==13){
  478.     // Just pick the first available stream if no ID is set
  479.     if (astream==-1)
  480.       astream=(stream_id & 0x0f);
  481.     if ((stream_id & 0x0f)==astream && audio_on){
  482.       if (sync && pes_audio_bytes){
  483.     TRACER("AudioTime: " << dtoa(pes_audio_time) << " " << itoa(pes_audio_bytes));
  484.         sync->put(2, pes_audio_time, pes_audio_bytes); // id=2, Audio
  485.         pes_audio_time=0;
  486.         pes_audio_bytes=0;
  487.       }
  488.       get_pes_packet_header(pts, dts);
  489.       pes_audio_time=pts;
  490.       audio_pid=pid;
  491.       return get_audio_data();
  492.     }
  493.   }
  494.   else if ((stream_id >> 4)==14){
  495.     // Just pick the first available stream if no ID is set
  496.     if (vstream==-1)
  497.       vstream=(stream_id & 0x0f);
  498.     if ((stream_id & 0x0f)==vstream && video_on){
  499.       if (sync && pes_video_bytes){
  500.     TRACER("VideoTime: " << dtoa(pes_video_time) << " " << itoa(pes_video_bytes));
  501.         sync->put(1, pes_video_time, pes_video_bytes); // id=1, Video
  502.         pes_video_time=0;
  503.         pes_video_bytes=0;
  504.       }
  505.       get_pes_packet_header(pts, dts);
  506.       pes_video_time=pts;
  507.       video_pid=pid;
  508.       return get_video_data();
  509.     }
  510.   }
  511.   else {
  512.     return get_unknown_data();
  513.   }
  514.   skipbytes(MPEG2_TS_Packet_size - bytecount);
  515.   return 1;
  516. }
  517. int Mpeg2Demux::get_pes_packet_header(unsigned long& pts, unsigned long& dts){
  518.   unsigned int pes_header_bytes(0);
  519.   getbits8();  // drop first 8 bits
  520.   short PTS_DTS_flags=(getbits8() >> 6) & 0x3;
  521.   int PES_header_data_length=getbits8();
  522.   // Get Presentation Time stamps and Decoding Time Stamps
  523.   if (PTS_DTS_flags==2){
  524.     pts=(getbits8() >> 1) & 7;  // Only low 4 bits (7==1111)
  525.     pts<<=15;
  526.     pts|=(getbits16() >> 1);
  527.     pts<<=15;
  528.     pts|=(getbits16() >> 1);
  529.     pes_header_bytes+=5;
  530.   }
  531.   else if (PTS_DTS_flags==3){      
  532.     pts=(getbits8() >> 1) & 7;  // Only low 4 bits (7==1111)
  533.     pts<<=15;
  534.     pts|=(getbits16() >> 1);
  535.     pts<<=15;
  536.     pts|=(getbits16() >> 1);
  537.     dts=(getbits8() >> 1) & 7;  // Only low 4 bits (7==1111)
  538.     dts<<=15;
  539.     dts|=(getbits16() >> 1);
  540.     dts<<=15;
  541.     dts|=(getbits16() >> 1);
  542.     pes_header_bytes+=10;
  543.   }
  544.   // extract other stuff here!
  545.   
  546.   skipbytes(PES_header_data_length - pes_header_bytes);
  547.   return 1;
  548. }
  549. int Mpeg2Demux::get_pes_packet(){
  550.   pes_packets++;
  551.   getbits24();     // skip startcode
  552.   unsigned int stream_id=getbits8();
  553. //  int pes_packet_length=   // Not used at this point; just drop
  554.   getbits16();
  555.   if (stream_id!=Private_stream_2 && stream_id!=Padding_stream){
  556.     return get_pes_packet_data(stream_id);
  557.   }
  558.   else if (stream_id==Private_stream_2){
  559.     // Dump private data!
  560.     error("private stream");
  561.     skipbytes(MPEG2_TS_Packet_size - bytecount);
  562.   }
  563.   else if (stream_id==Padding_stream){
  564.     skipbytes(MPEG2_TS_Packet_size - bytecount);
  565.     // Nothing; the next search for a sync byte will just skip the stuffing bytes
  566.   }
  567.   else {
  568.     error("unknown stream_id in pes packet");
  569.     skipbytes(MPEG2_TS_Packet_size - bytecount);
  570.   }
  571.   return 1;
  572. }
  573. int Mpeg2Demux::get_psi_packet(){
  574.   psi_packets++;
  575.   table_id=getbits8();
  576.   section_length=getbits16() & 0x0fff;
  577.   skipbytes(MPEG2_TS_Packet_size - bytecount);
  578.   return 1;
  579. }
  580. int Mpeg2Demux::get_audio_data(){
  581.   audio_packets++;
  582.   pes_audio_bytes+=copybytes(audio_buffer, MPEG2_TS_Packet_size - bytecount);
  583.   return 1;
  584. }
  585. int Mpeg2Demux::get_video_data(){
  586.   video_packets++;
  587.   pes_video_bytes+=copybytes(video_buffer, MPEG2_TS_Packet_size - bytecount);
  588.   return 1;
  589. }
  590. int Mpeg2Demux::get_unknown_data(){
  591.   warning("unknown data in PSI or PES packet");
  592.   return skipbytes(MPEG2_TS_Packet_size - bytecount);
  593. }
  594. /*
  595.  *
  596.  * MPEG Program Stream
  597.  *
  598.  */
  599. int Mpeg2Demux::program_stream(){
  600.   if (!get_program_pack()){
  601.     error("failure in programm pack");
  602.     return 0;
  603.   }
  604.   audio_buffer->close();
  605.   video_buffer->close();
  606.   return 1;
  607. }
  608. int Mpeg2Demux::get_program_pack(){
  609. static unsigned int header;
  610.   header = getbits32();
  611.   while (1) {
  612.     if (header == Pack_start_code) {
  613.   get_pack_header(&header);
  614.     }
  615.     else if ((header >> 8) == Packet_start_code_prefix) {
  616.        counter++;
  617.        get_ps_pes_packet(&header);
  618.     }
  619.     else { 
  620.       return 0;
  621.     }
  622.     if (!quiet){
  623.       if ((counter % 100)==0) msg(".");
  624.       if ((counter % 5000)==0){
  625.         message(itoa(counter));
  626.       }
  627.     }
  628.     
  629.     if (terminate){
  630. //      if ((!sync || sync->stop()) && (!audio && audio->stop()) && (!video && video->stop()))
  631.         break;
  632.     }
  633.   }
  634.   return 1;
  635. }
  636. int Mpeg2Demux::get_ps_pes_packet(unsigned int *header){
  637.   static unsigned long pts(0),dts(0);
  638.   int PES_header_data_length;
  639.   pes_packets++;
  640.   int stream_id=*header & 0xff;
  641.   unsigned int pes_packet_length=getbits16();
  642.   if (stream_id!=(int)Private_stream_2 && stream_id!=(int)Padding_stream){
  643. pts = 0;
  644.     if ((nextbits8() & 0xc0) == 0x40) {
  645.       pes_packet_length -= 12;
  646.         skipbytes(12);
  647.     } 
  648.     else {
  649.       int pes_header_bytes=0;
  650.       int scrambling = (getbits8() >> 4 ) & 3;
  651. //      if (scrambling) {
  652. //        message("scrambled data");
  653. //        skip_ps_bytes(header);            
  654. //        return 1;
  655. //      }
  656.       int PTS_DTS_flags=(getbits8() >> 6) & 0x3;
  657.       PES_header_data_length=getbits8();
  658.   // Get Presentation Time stamps and Decoding Time Stamps
  659.       if (PTS_DTS_flags==2){
  660.         pts=(getbits8() >> 1) & 7;  // Only low 4 bits (7==1111)
  661.         pts<<=15;
  662.         pts|=(getbits16() >> 1);
  663.         pts<<=15;
  664.         pts|=(getbits16() >> 1);
  665.         pes_header_bytes+=5;
  666.       }
  667.       else if (PTS_DTS_flags==3){
  668.         pts=(getbits8() >> 1) & 7;  // Only low 4 bits (7==1111)
  669.         pts<<=15;
  670.         pts|=(getbits16() >> 1);
  671.         pts<<=15;
  672.         pts|=(getbits16() >> 1);
  673.         dts=(getbits8() >> 1) & 7;  // Only low 4 bits (7==1111)
  674.         dts<<=15;
  675.         dts|=(getbits16() >> 1);
  676.         dts<<=15;
  677.         dts|=(getbits16() >> 1);
  678.         pes_header_bytes+=10;
  679.       }
  680.      // extract other stuff here!
  681.       pes_packet_length -=3;
  682.       if (PES_header_data_length) {
  683.         pes_packet_length -= PES_header_data_length; 
  684.         skipbytes (PES_header_data_length - pes_header_bytes);
  685.       }
  686.     }
  687.     if ((stream_id >> 4)==12 || (stream_id >> 4)==13){
  688.       if ((stream_id & 0x0f)== astream && audio_on==1){
  689.         if (sync && pes_audio_bytes && pts ){
  690.           TRACER("AudioTime: " << dtoa(pes_audio_time));
  691.           sync->put(2, pes_audio_time, pes_audio_bytes); // id=2, Audio
  692.           pes_audio_time=0;
  693.           pes_audio_bytes=0;
  694.   
  695.         }
  696. if (pts)
  697.           pes_audio_time=pts;
  698.         pes_audio_bytes+=pes_packet_length;
  699.         copy_ps_bytes(audio_buffer, header,pes_packet_length);            
  700.       }
  701.       else {
  702.         skip_ps_bytes(header);            
  703.       }
  704.     }
  705.     else if ((stream_id >> 4)==14){
  706.       if ((stream_id & 0x0f)== vstream && video_on){
  707.         if (sync &&  pes_video_bytes && pts){
  708.           TRACER("VideoTime: " << dtoa(pes_video_time) << " " << itoa(pes_video_bytes));
  709.           sync->put(1, pes_video_time,pes_video_bytes); // id=1, Video
  710.           pes_video_time=0;
  711.           pes_video_bytes=0;
  712.         }
  713.         if (pts)
  714.           pes_video_time=pts;
  715.         pes_video_bytes += pes_packet_length;
  716.         copy_ps_bytes(video_buffer, header,pes_packet_length);            
  717.       }
  718.       else {
  719.         skip_ps_bytes(header);            
  720.       }
  721.     }
  722.     else if (stream_id == 0xbd){
  723.       if ( (*byteptr == (0x80+astream) ) && audio_on==2){  /* AC-3 Data */
  724.         if (sync &&  pes_audio_bytes && pts){
  725.           TRACER("AudioTime: " << dtoa(pes_audio_time) << " " << itoa(pes_audio_bytes));
  726.           sync->put(2, pes_audio_time, pes_audio_bytes); // id=2, Audio
  727.           pes_audio_time=0;
  728.           pes_audio_bytes=0;
  729.         }
  730.         if (pts)
  731.           pes_audio_time=pts;
  732.         pes_audio_bytes+=pes_packet_length-4;
  733. skipbytes(4);
  734.         copy_ps_bytes(audio_buffer, header,pes_packet_length-4);
  735.       }
  736.       else {
  737.         skip_ps_bytes(header);
  738.       }
  739.     }
  740.     else if (stream_id == 0xbc){
  741.       skip_ps_bytes(header);            
  742.     }
  743.     else {
  744.       skip_ps_bytes(header);            
  745.     }
  746.   }
  747.   else if (stream_id==(int)Private_stream_2){
  748.     skip_ps_bytes(header);            
  749.   }
  750.   else if (stream_id == (int)Padding_stream){
  751.     skip_ps_bytes(header);            
  752.   }
  753.   else error("unknown stream_id in pes packet");
  754.   return 1;
  755. }
  756. int Mpeg2Demux::get_pack_header(unsigned int *header){
  757. static double old_time = 0.0;
  758. unsigned long i,j;
  759. unsigned long clock_ref,clock_ref_ext;
  760.   i = getbits32();
  761.   j = getbits16();
  762.   if (i & 0x40000000) {
  763.     clock_ref =  ((i & 0x31000000) << 3);
  764.     clock_ref |= ((i & 0x03fff800) << 4);
  765.     clock_ref |= ((i & 0x000003ff) << 5);
  766.     clock_ref |= ((j & 0xf800) >> 11);
  767.     clock_ref_ext = (j >> 1) & 0x1ff;
  768.     double time=clock_ref + clock_ref_ext/300;
  769.     TRACER("Time: " << dtoa(time));
  770.     if (sync && (old_time + 6000 < time)) {
  771.        sync->put(time);  // id=0, Timer
  772.        old_time = time;
  773.     }
  774.    
  775.     skipbytes(3);
  776.     i = getbits8() & 0x7;
  777.     while (i--) 
  778.       getbits8(); // stuffing 
  779.   }
  780.   else
  781.     skipbytes(2);
  782.   *header = getbits32();
  783.   
  784.   if (*header == System_start_code) {
  785.     get_system_header();
  786.     *header = getbits32();
  787.   }
  788.   return 1;
  789. }
  790. int Mpeg2Demux::get_system_header(){
  791. int i;
  792.   i = getbits16(); // get length
  793.   while (i--)
  794.     getbits8();
  795.   return 1;
  796. }
  797. /*
  798.  *  Packetized Elementary Stream (PES)
  799.  */
  800. int Mpeg2Demux::pes_stream_audio(){
  801.   do {
  802.     counter++;
  803.     get_audio_data();
  804.     if (!quiet){
  805.       if ((counter % 100)==0) msg(".");
  806.       if ((counter % 5000)==0){
  807.         message(itoa(counter));
  808.       }
  809.     } 
  810.   }
  811.   while (nextpacket());
  812.   audio_buffer->close();
  813.   return 1;
  814. }
  815.  
  816. int Mpeg2Demux::pes_stream_video(){
  817.   do {
  818.     counter++;
  819.     get_video_data();
  820.     if (!quiet){
  821.       if ((counter % 100)==0) msg(".");
  822.       if ((counter % 5000)==0){
  823.         message(itoa(counter));
  824.       }
  825.     }
  826.   }
  827.   while (nextpacket());
  828.   video_buffer->close();
  829.   return 1;
  830. }