OSDN Git Service

implement PesPacket in Utils
authorcocot <cocot@users.sourceforge.jp>
Thu, 26 Feb 2009 13:13:04 +0000 (22:13 +0900)
committercocot <cocot@users.sourceforge.jp>
Thu, 26 Feb 2009 13:13:04 +0000 (22:13 +0900)
src/Utils.cc
src/Utils.h

index 46bcc52..8a0b77b 100644 (file)
@@ -639,6 +639,148 @@ PcrPacket::PcrPacket(Int64 pcr, byte counter, ushort pid)
         mData[i] = 0xff;
 }
 
+PesPacket::PesPacket(byte* buff, int offset, int length, ushort pid)
+{
+    mData.assign(0,length);
+    SetPID(pid);
+    AddData(buff, offset, length);
+    SetPriority(false);
+}
+
+bool PesPacket::GetPriority(void)
+{
+    return mPriority;
+}
+
+void PesPacket::SetPriority(bool value)
+{
+    mPriority = value;
+}
+
+byte* PesPacket::GetData(void)
+{
+    byte* buff = new byte[mData.size()+1];
+    for(int i = 0; i < mData.size();i++)
+        buff[i] = mData.at(i);
+    buff[mData.size()] = '\0';
+    return buff;
+}
+
+byte* PesPacket::GetPayload(void)
+{
+    PesHeader* ph = GetHeader();
+    if(ph == NULL) return GetData();
+    byte* buff = new byte[mData.size()-(9 + ph->HeaderLength)+1];
+    for(int i=(9 + ph->HeaderLength); i < mData.size(); i++)
+        buff[i] = mData.at(i);
+    buff[mData.size()-(9 + ph->HeaderLength)] = '\0';
+    return buff;
+}
+
+byte PesPacket::GetByte(int i)
+{
+    return mData[i];
+}
+
+void PesPacket::SetByte(byte value)
+{
+//    mData[i] = value;
+}
+
+ushort PesPacket::GetPID(void)
+{
+    return mPID;
+}
+
+void PesPacket::SetPID(ushort id)
+{
+    mPID = id;
+}
+
+bool PesPacket::GetComplete(void)
+{
+    if(mData.size() < 6) return false;
+    ushort len = (ushort)((mData[4] << 8) + mData[5]);
+    if(len == 0) return false;
+    if(mData.size() != len + 6) return false;
+    return true;
+}
+
+void PesPacket::SetComplete(bool value)
+{
+    if(value)
+    {
+        ushort len = (ushort)(mData.size() - 6);
+        if (mData.size() > (0xffff - 6))
+            len = 0;
+        mData[4] = (byte)((len >> 8) & 0xff);
+        mData[5] = (byte)(len & 0xff);
+    }
+}
+
+/*
+        public PesHeader GetHeader()
+        {
+            try
+            {
+                PesHeader* ph = new PesHeader(data.ToArray());
+                return ph;
+            }
+            catch (FormatException)
+            {
+                // no valid header (yet)
+                return null;
+            }
+        }
+
+        public void AddData(List<byte> moredata)
+        {
+            data.AddRange(moredata);
+        }
+
+
+        public void AddData(byte[] buff, int offset, int length)
+        {
+            for (int i = offset; i < length + offset; i++)
+                data.Add(buff[i]);
+        }
+
+        public byte BaseId
+        {
+            get
+            {
+                if (data.Count > 3)
+                    return data[3];
+                return 0;
+            }
+        }
+
+        public byte ExtendedId
+        {
+            get
+            {
+                if ((data.Count > 8) && data.Count > (8 + data[8]))
+                    return data[9 + data[8]];
+                return 0;
+            }
+        }
+
+        public UInt32 ExtendedType
+        {
+            get
+            {
+                if ((data.Count > 8) && data.Count > (11 + data[8]))
+                {
+                    UInt32 format = (UInt32)data[9 + data[8]] << 24;
+                    format += (UInt32)data[10 + data[8]] << 16;
+                    format += (UInt32)data[11 + data[8]] << 8;
+                    format += (UInt32)data[12 + data[8]];
+                    return format;
+                }
+                return 0;
+            }
+        }
+*/
 
 } // namespace
 
index 9c039cb..9f276bc 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <string>
 #include <list>
+#include <vector>
 #include <stdexcept>
 // #include "BlueMux.h"
 #include "tsremuxcpp_define.h"
@@ -372,23 +373,26 @@ class PesHeader {
 class PesPacket {
  public:
   PesPacket(byte* buff, int offset, int length, ushort pid);
-  bool Priority;
+  bool GetPriority(void);
+  void SetPriority(bool priority);
   byte* GetData(void);
   byte* GetPayload(void);
   byte GetByte(int i);
   void SetByte(byte dat);
-  ushort PID;
-  bool Complete;
-  PesHeader GetHeader(void);
-  void AddData(std::list<byte> moredata);
+  ushort GetPID(void);
+  void SetPID(ushort id);
+  bool GetComplete(void);
+  void SetComplete(bool value);
+  PesHeader* GetHeader(void);
+  void AddData(std::vector<byte> moredata);
   void AddData(byte* buff, int offset, int length);
   byte BaseId;
   byte ExtendedId;
   UInt32 ExtendedType;
  private:
-  std::list<byte> data;
-  ushort pid;
-  bool priority;
+  std::vector<byte> mData;
+  bool mPriority;
+  ushort mPID;
 };
 
 class VC1SequenceInfo {