#include "dvbsubtitles.h"
#include "log.h"
+#include <cstdlib>
+
#define DEMUXER_SEQ_HEAD 0x000001B3
#define DEMUXER_PIC_HEAD 0x00000101
#define SEEK_THRESHOLD 150000 // About 1.5 seconds
const int Demuxer::FrameRates[9] = { 0, 23, 24, 25, 29, 30, 50, 59, 60 };
Demuxer* Demuxer::instance = NULL;
+static const int PESPacket_initial_size = 2000;
+
// PESPacket methods
PESPacket::PESPacket()
{
- init(0);
+ data_size = PESPacket_initial_size;
+ data = (UCHAR*)malloc(data_size);
+ data[0] = 0x00;
+ data[1] = 0x00;
data[2] = 0x01;
+ init(0);
+}
+
+PESPacket::PESPacket(const PESPacket& packet)
+{
+ copyFrom(packet);
+}
+
+PESPacket& PESPacket::operator=(const PESPacket& packet)
+{
+ if (this != &packet)
+ {
+ if (data) free(data);
+ copyFrom(packet);
+ }
+ return *this;
+}
+
+PESPacket::~PESPacket()
+{
+ if (data) free(data);
+}
+
+void PESPacket::copyFrom(const PESPacket& packet)
+{
+ length = packet.length;
+ size = packet.size;
+ packetType = packet.packetType;
+ substream = packet.substream;
+ seq_header = packet.seq_header;
+ data_size = size;
+ data = (UCHAR*)malloc(data_size);
+ memcpy(data, packet.data, data_size);
}
void PESPacket::init(UCHAR type, UCHAR sub)
{
- data.resize(6);
length = 0;
size = 6;
+ data[4] = data[5] = 0;
data[3] = type;
packetType = type;
substream = sub;
int PESPacket::write(const UCHAR *buf, int len)
{
- if (length + len > 0xFFFA) return 0;
- data.insert(data.end(), buf, buf+len);
+ if (size + len > 0x10000) return 0;
+ if (size + len > data_size)
+ { // Reallocate
+ UINT new_data_size = max(data_size + data_size / 2, data_size + len);
+ if (new_data_size > 0x10000) new_data_size = 0x10000;
+ data_size = new_data_size;
+ data = (UCHAR*)realloc(data, data_size);
+ }
+ memcpy(data + size, buf, len);
length += len;
size += len;
data[4] = (length >> 8);
{
UINT sent = 0;
UCHAR packet_type = packet.getPacketType();
- const std::vector<UCHAR>& packetdata = packet.getData();
+ const UCHAR* packetdata = packet.getData();
if (packet_type >= PESTYPE_VID0 && packet_type <= PESTYPE_VIDMAX)
{
#ifndef DEMUXER_H
#define DEMUXER_H
-#include <vector>
#include "stream.h"
#include "defines.h"
{
public:
PESPacket();
+ PESPacket(const PESPacket& packet);
+ PESPacket& operator=(const PESPacket& packet);
+ ~PESPacket();
void init(UCHAR type, UCHAR sub=0);
void truncate();
int write(const UCHAR* buf, int len);
UCHAR operator[] (UINT index) const;
// return data[index] if in bounds, else 0
// so no proper error condition but never mind for now
- const std::vector<UCHAR>& getData() const { return data; }
+ const UCHAR* getData() const { return data; }
UINT getLength() const { return length; }
UINT getSize() const { return size; }
UCHAR getPacketType() const { return packetType; }
UINT findSeqHeader() const;
static const ULLONG PTS_INVALID = (1LL << 33);
protected:
- std::vector<UCHAR> data;
+ void copyFrom(const PESPacket& packet);
+ UCHAR * data;
UINT length, size;
+ UINT data_size;
UCHAR packetType;
UCHAR substream;
- ULLONG pts;
UINT mutable seq_header; // 0 = no, 1 = unknown, else = header offset
};
void DemuxerVDR::dealWithSubtitlePacket()
{
- const std::vector<UCHAR>& data = packet.getData();
+ const UCHAR* data = packet.getData();
UINT packetSize = packet.getSize();
if (packetSize < 9) return;
UINT payloadOffset = data[8] + 9;
subtitlePacket.write(&data[payloadOffset+4], packetSize-payloadOffset-4);
}
- const std::vector<UCHAR>& sub_data = subtitlePacket.getData();
+ const UCHAR* sub_data = subtitlePacket.getData();
UINT subSize = subtitlePacket.getSize();
while (subtitlePacketPosition < subSize)
{