]> git.vomp.tv Git - vompclient.git/commitdiff
Demuxer changes/fixes/improvements
authorMark Calderbank <mark@vomp.tv>
Tue, 30 Oct 2007 22:35:07 +0000 (22:35 +0000)
committerMark Calderbank <mark@vomp.tv>
Tue, 30 Oct 2007 22:35:07 +0000 (22:35 +0000)
demuxer.cc
demuxer.h
demuxeraudio.cc
demuxeraudio.h
demuxerts.cc
demuxerts.h
demuxervdr.cc

index 5054dfb72e34cc3954cbc1f92a7fcd3e66e09245..b9ec4ab51d01c0eff25b4ef7cb47a8f6556acceb 100644 (file)
 */
 
 #include "demuxer.h"
-#ifndef WIN32
-#include <endian.h>
-#else
-#define __LITTLE_ENDIAN 1234
-#define __BIG_ENDIAN  4321
-#define __BYTE_ORDER __LITTLE_ENDIAN
-#endif
+
+#include "callback.h"
+#include "log.h"
 
 #define DEMUXER_SEQ_HEAD 0x000001B3
 #define DEMUXER_PIC_HEAD 0x00000101
-
 #define SEEK_THRESHOLD 150000 // About 1.5 seconds
 
 // Statics
@@ -53,7 +48,6 @@ void PESPacket::init(UCHAR type)
   data[3] = type;
   data[4] = data[5] = 0;
   packetType = type;
-  pts = PTS_INVALID;
   seq_header = 1; // Unknown seq_header status
 }
 
@@ -72,23 +66,25 @@ int PESPacket::write(UCHAR *buf, int len)
   data[5] = (length & 0xFF);
   // We have added data - reset seq_header indicator if necessary
   if (seq_header == 0) seq_header = 1; // Reset to 'unknown'
-  // Extract PTS if this is the first write to reach 14 bytes
-  if (size - len < 14 && size >= 14 && data[7] & 0x80 &&
-       ( (packetType >= Demuxer::PESTYPE_AUD0 &&
+  return 1;
+}
+
+ULLONG PESPacket::getPTS()
+{
+  if ( ( (packetType >= Demuxer::PESTYPE_AUD0 &&
           packetType <= Demuxer::PESTYPE_AUDMAX)
-         ||
+        ||
          (packetType >= Demuxer::PESTYPE_VID0 &&
           packetType <= Demuxer::PESTYPE_VIDMAX)
-       ))
+       ) && size >= 14 && data[7] & 0x80)
   {
-    // 14 bytes are now in, and PTS_DTS_flags indicate PTS
-    pts = ( (ULLONG)(data[ 9] & 0x0E) << 29 ) |
-          ( (ULLONG)(data[10])        << 22 ) |
-          ( (ULLONG)(data[11] & 0xFE) << 14 ) |
-          ( (ULLONG)(data[12])        <<  7 ) |
-          ( (ULLONG)(data[13] & 0xFE) >>  1 );
+    return ( (ULLONG)(data[ 9] & 0x0E) << 29) |
+           ( (ULLONG)(data[10])        << 22 ) |
+           ( (ULLONG)(data[11] & 0xFE) << 14 ) |
+           ( (ULLONG)(data[12])        <<  7 ) |
+           ( (ULLONG)(data[13] & 0xFE) >>  1 );
   }
-  return 1;
+  else return PTS_INVALID;
 }
 
 UCHAR PESPacket::operator[] (UINT index)
index 10ffee4f4695c0dda899b898b56dc66b8150b85f..a2313dc2a9ce011296a8b52721d1e2238a69feb7 100644 (file)
--- a/demuxer.h
+++ b/demuxer.h
@@ -30,13 +30,11 @@ however, no code was copied verbatim.
 #ifndef DEMUXER_H
 #define DEMUXER_H
 
-#include <stdio.h>
-#include <memory.h>
 #include "stream.h"
-#include "log.h"
 #include "defines.h"
-#include "callback.h"
-#include "draintarget.h"
+
+class Callback;
+class DrainTarget;
 
 class PESPacket
 {
@@ -54,8 +52,8 @@ class PESPacket
     UCHAR getPacketType() { return packetType; }
     void setSubstream(UCHAR s) { substream = s; }
     UCHAR getSubstream() { return substream; }
-    bool hasPTS() { return (pts != PTS_INVALID); }
-    ULLONG getPTS() { return pts; }
+    ULLONG getPTS();
+    bool hasPTS() { return (getPTS() != PTS_INVALID); }
 
     UINT findPictureHeader();
     UINT findSeqHeader();
index 72cf3fe27fca7b6162fdc5db5590761c6fa7c625..54319e6bc203dc8ba7533b6d7436fc671c13a313 100644 (file)
@@ -21,6 +21,7 @@
 #include "demuxeraudio.h"
 #include "audio.h"
 #include "i18n.h"
+#include "log.h"
 
 #define HDRBYTE1 0xff
 #define HDRBYTE2 0xe0
index 95dbd114b40d115888da280d4678175bce5a6d1c..b8035c6519e2fedc20860e563945b10c0ba895f3 100644 (file)
@@ -25,7 +25,9 @@
 #include "defines.h"
 #include "id3.h"
 
+class Log;
 class PacketBuffer;
+
 class DemuxerAudio : public Demuxer
 {
   public:
index f139d56123f7c7b0ba5c322e863bf22b8ecb650e..f06727b422f1b6569ba345ac3be1c6ae2e835d6b 100644 (file)
@@ -19,6 +19,7 @@
 */
 
 #include "demuxerts.h"
+#include "log.h"
 
 DemuxerTS::DemuxerTS(int p_vID, int p_aID)
 {
@@ -31,23 +32,29 @@ void DemuxerTS::flush()
   partPacket = 0;
   parsed = false;
   Demuxer::flush();
-  vPacket.init(0xE0);
-  aPacket.init(0xC0);
+  vPacket.init(PESTYPE_VID0);
+  aPacket.init(PESTYPE_AUD0);
+  vActive = false;
+  aActive = false;
 }
 
 int DemuxerTS::scan(UCHAR *buf, int len)
 {
-  return 0xc0;
+  return PESTYPE_AUD0;
 }
 
 void DemuxerTS::setVID(int p_vID)
 {
   vID = p_vID;
+  vPacket.init(PESTYPE_VID0);
+  vActive = false;
 }
 
 void DemuxerTS::setAID(int p_aID)
 {
   aID = p_aID;
+  aPacket.init(PESTYPE_AUD0);
+  aActive = false;
 }
 
 int DemuxerTS::findPTS(UCHAR* buf, int len, ULLONG* dest)
@@ -180,54 +187,66 @@ int DemuxerTS::processTS(UCHAR* buf)
 
     if (pid == vID)
     {
-      if (!parsed)
+      if (vActive)
       {
-        parsePacketDetails(vPacket);
-        parsed = true;
-      }
+        if (!parsed)
+        {
+          parsePacketDetails(vPacket);
+          parsed = true;
+        }
       rc = submitPacket(vPacket);
+      }
+      vActive = true;
     }
     if (pid == aID)
     {
-      if (!parsed)
+      if (aActive)
       {
-        parsePacketDetails(aPacket);
-        parsed = true;
-      }
+        if (!parsed)
+        {
+          parsePacketDetails(aPacket);
+          parsed = true;
+        }
       rc = submitPacket(aPacket);
+      }
+      aActive = true;
     }
     if (rc == 0) return 0;
 
     parsed = false;
     if (pid == vID)
     {
-      vPacket.init(0xE0);
+      vPacket.init(PESTYPE_VID0);
       buf += 6; datalen -= 6;
     }
     if (pid == aID)
     {
-      aPacket.init(0xC0);
+      aPacket.init(PESTYPE_AUD0);
       buf += 6; datalen -= 6;
     }
   }
 
-  PESPacket* packet = NULL;
-  if (pid == vID) packet = &vPacket;
-  if (pid == aID) packet = &aPacket;
-  if (packet != NULL)
+  if ( (pid == vID && vActive) ||
+       (pid == aID && aActive) )
   {
-    if (packet->write(buf, datalen) == 0)
-    { // Writing to packet failed. It has overflowed.
-      if (!parsed)
-      {
-        parsePacketDetails(*packet);
-        parsed = true;
+    PESPacket* packet = NULL;
+    if (pid == vID) packet = &vPacket;
+    if (pid == aID) packet = &aPacket;
+    if (packet != NULL)
+    {
+      if (packet->write(buf, datalen) == 0)
+      { // Writing to packet failed. It has overflowed.
+        if (!parsed)
+        {
+          parsePacketDetails(*packet);
+          parsed = true;
+        }
+        if (submitPacket(*packet) == 0) return 0;
+        parsed = false;
+        packet->truncate();
+        packet->write((UCHAR*)"\200\000\000", 3);
+        packet->write(buf, datalen);
       }
-      if (submitPacket(*packet) == 0) return 0;
-      parsed = false;
-      packet->truncate();
-      packet->write((UCHAR*)"\200\000\000", 3);
-      packet->write(buf, datalen);
     }
   }
 
index 9a6ede00bdb499910a7084fb866d20016dc245a7..383094f6ce9b900058e814f7abd2e99b47e8cef3 100644 (file)
@@ -47,6 +47,7 @@ class DemuxerTS : public Demuxer
     PESPacket vPacket; // Video PES packet under construction
     PESPacket aPacket; // Audio PES packet under construction
     int vID, aID;      // TS IDs for video/audio
+    bool vActive, aActive; // Whether video/audio is actively being captured
 };
 
 #endif
index 715433aa72fb359ab364ffd6341a0fb935041c6e..a41478859504da4be6839a10f57b42765d7b4530 100644 (file)
 */
 
 #include "demuxervdr.h"
+
 #include "video.h"
+#include "log.h"
+
 #ifndef WIN32
 #include <endian.h>
 #else