OSDN Git Service

implement EbmlElement class in Mkv.cc
authorcocot <cocot@users.sourceforge.jp>
Thu, 2 Apr 2009 13:24:21 +0000 (22:24 +0900)
committercocot <cocot@users.sourceforge.jp>
Thu, 2 Apr 2009 13:24:21 +0000 (22:24 +0900)
src/Mkv.cc
src/Mkv.h

index 7a92e9d..d870d05 100644 (file)
@@ -2,29 +2,70 @@
 
 namespace TsRemux
 {
-  static const signed long long vsint_subtr[] = {
+  static const Int64 vsint_subtr[] = {
     0x3fLL, 0x1ffffLL, 0xfffffLL, 0x7ffffffLL, 0x3ffffffffLL,
     0x1ffffffffffLL, 0xffffffffffffffLL, 0x7fffffffffffffLL };
 
-EbmlElement::EbmlElement(signed long long id, signed long long size, signed long long pos, Stream& fs)
+EbmlElement::EbmlElement(Int64 id, Int64 size, Int64 pos, boost::shared_ptr<Stream> fs)
 {
-    return;
+       SetId(id);
+       SetSize(size);
+       SetPos(pos);
+       SetStream(fs);
 }
 
-EbmlElement* EbmlElement::ParseEbml(Stream& fs)
-{
-    
-    return NULL;
+boost::shared_ptr<EbmlElement> EbmlElement::ParseEbml(boost::shared_ptr<Stream> fs)
+{
+       Int64 pos = fs.get()->Position;
+       EbmlElement ebml = null;
+       if (!fs || fs.Length == 0)
+               return null;
+       int b = fs.ReadByte();
+       if (b == -1)
+               goto cleanup;
+       int len = VintLength((byte)b);
+       if ((fs.Length - fs.Position) < (Int64)len)
+               goto cleanup;
+       fs.Position -= 1;
+       Int64 id = 0;
+       for (int i = 0; i < len; i++)
+       {
+               id <<= 8;
+               id |= (byte)fs.ReadByte();
+       }
+       b = fs.ReadByte();
+       if (b == -1)
+               goto cleanup;
+       len = VintLength((byte)b);
+       if ((fs.Length - fs.Position) < (Int64)len)
+               goto cleanup;
+       fs.Position -= 1;
+       Int64 size = VintToInt64(fs);
+       if ((fs.Length - fs.Position) < size)
+               goto cleanup;
+       ebml = new EbmlElement(id, size, fs.Position, fs);
+       
+cleanup:
+       fs.Position = pos;
+       return ebml;
 }
 
-char EbmlElement::VintLength(char vint)
+byte EbmlElement::VintLength(byte vint)
 {
-    return 'A';
+       byte len = 1;
+       for (int i = 7; (((vint >> i) & 0x01) == 0) && i >= 0; i--)
+               len++;
+       return len;
 }
 
-signed long long EbmlElement::VintToInt64(Stream& fs)
+Int64 EbmlElement::VintToInt64(boost::shared_ptr<Stream> fs)
 {
-    return 1;
+       byte b = (byte)fs.ReadByte();
+       int len = VintLength(b);
+       Int64 ret = (((1 << (8 - len)) - 1) & b) << (8 * (len - 1));
+       for (int i = 1; i < len; i++)
+               ret += (((byte)fs.ReadByte()) << (8 * (len - 1 - i)));
+       return ret;
 }
 
 MkvPesFile::MkvPesFile(BackgroundWorker& bw)
@@ -32,7 +73,7 @@ MkvPesFile::MkvPesFile(BackgroundWorker& bw)
     return;
 }
 
-TrackInfo::TrackInfo(unsigned short pid, std::string codec, char* data, EbmlElement& info)
+TrackInfo::TrackInfo(ushort pid, std::string codec, pByte data, EbmlElement& info)
 {
     return;
 }
@@ -42,7 +83,7 @@ PesPacket* MkvPesFile::GetNextPesPackets(void)
     return NULL;
 }
 
-void MkvPesFile::Seek(signed long pcr)
+void MkvPesFile::Seek(Int32 pcr)
 {
     return;
 }
@@ -57,25 +98,25 @@ unsigned long long MkvPesFile::GetClusterClock(EbmlElement cluster)
     return 1;
 }
 
-PesPacket MkvPesFile::BuildAc3Pes(signed long long timestamp, char data[], unsigned short pid)
+PesPacket MkvPesFile::BuildAc3Pes(Int64 timestamp, pByte data, ushort pid)
 {
     PesPacket ret;
     return ret; 
 }
 
-PesPacket MkvPesFile::BuildMpeg2Pes(signed long long timestamp, char data[], unsigned short pid)
+PesPacket MkvPesFile::BuildMpeg2Pes(Int64 timestamp, pByte data, ushort pid)
 {
     PesPacket ret;
     return ret; 
 }
 
-PesPacket MkvPesFile::BuildAvcPes(signed long long timestamp, char data[], unsigned short pid)
+PesPacket MkvPesFile::BuildAvcPes(Int64 timestamp, pByte data, ushort pid)
 {
     PesPacket ret;
     return ret; 
 }
 
-PesPacket MkvPesFile::BuildVc1Pes(signed long long timestamp, char data[], unsigned short pid)
+PesPacket MkvPesFile::BuildVc1Pes(Int64 timestamp, pByte data, ushort pid)
 {
     PesPacket ret;
     return ret; 
index 295b3b1..efacc82 100644 (file)
--- a/src/Mkv.h
+++ b/src/Mkv.h
@@ -16,24 +16,25 @@ enum LacingType {
 
 class EbmlElement {
  public:
-  static EbmlElement* ParseEbml(Stream fs);
-  Int64 Id;
-  Int64 Size;
+  static boost::shared_ptr<EbmlElement> ParseEbml(Stream fs);
+  Int64 GetId(void);
+  void SetId(Int64 id);
+  Int64 GetSize(void);
+  void SetSize(Int64 size);
+  Int64 GetPos(void);
+  void SetPos(Int64 pos);
+  boost::shared_ptr<Stream> GetStream(void);
+  void SetStream(boost::shared_ptr<Stream> fs);
   Stream DataStream;
-  EbmlElement* Children;
-  static char VintLength(char vint);
+  boost::shared_ptr<EbmlElement> Children;
+  static byte VintLength(char vint);
   static Int64 VintToInt64(Stream fs);
  protected:
   Int64 id;
   Int64 size;
   Int64 pos;
-  Stream fs;
-  Int64 Position;
-  EbmlElement(Int64 id, Int64 size, Int64 pos, Stream& fs);
- private:
-/*  static const Int64 vsint_subtr[] = {
-    0x3fLL, 0x1ffffLL, 0xfffffLL, 0x7ffffffLL, 0x3ffffffffLL,
-    0x1ffffffffffLL, 0xffffffffffffffLL, 0x7fffffffffffffLL };*/
+  boost::shared_ptr<Stream> fs;
+  EbmlElement(Int64 id, Int64 size, Int64 pos, boost::shared_ptr<Stream> fs);
 };
 
 struct TrackInfo {
@@ -41,7 +42,7 @@ struct TrackInfo {
   TrackInfo(ushort pid, std::string codec, pByte data, EbmlElement& info);
   ushort pid;
   std::string codec;
-  char data[];
+  pByte data;
   EbmlElement info;
 };
 
@@ -55,13 +56,13 @@ class MkvPesFile {
   void GetInitialValues(void);
  private:
   SortedList<Int64, EbmlElement> Clusters;
-  signed int CuurentIndex;
+  Int32 CuurentIndex;
   Dictionary<ushort, TrackInfo> TrackList;
-  unsigned long long GetClusterClock(EbmlElement cluster);
-  PesPacket BuildAc3Pes(Int64 timestamp, char data[], ushort pid);
-  PesPacket BuildMpeg2Pes(Int64 timestamp, char data[], ushort pid);
-  PesPacket BuildAvcPes(Int64 timestamp, char data[], ushort pid);
-  PesPacket BuildVc1Pes(Int64 timestamp, char data[], ushort pid);
+  UInt64 GetClusterClock(EbmlElement cluster);
+  PesPacket BuildAc3Pes(Int64 timestamp, pByte data, ushort pid);
+  PesPacket BuildMpeg2Pes(Int64 timestamp, pByte data, ushort pid);
+  PesPacket BuildAvcPes(Int64 timestamp, pByte data, ushort pid);
+  PesPacket BuildVc1Pes(Int64 timestamp, pByte data, ushort pid);
   void GetTimeStamps(void);
 };
 }