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)
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;
}
return NULL;
}
-void MkvPesFile::Seek(signed long pcr)
+void MkvPesFile::Seek(Int32 pcr)
{
return;
}
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;
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 {
TrackInfo(ushort pid, std::string codec, pByte data, EbmlElement& info);
ushort pid;
std::string codec;
- char data[];
+ pByte data;
EbmlElement info;
};
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);
};
}