/*
- Copyright 2005-2007 Mark Calderbank
+ Copyright 2005-2008 Mark Calderbank
Copyright 2007 Marten Richter (AC3 support)
This file is part of VOMP.
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with VOMP; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ along with VOMP; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "demuxer.h"
// Statics
const int Demuxer::FrameRates[9] = { 0, 23, 24, 25, 29, 30, 50, 59, 60 };
-const ULLONG PESPacket::PTS_INVALID = (1LL << 33);
Demuxer* Demuxer::instance = NULL;
// PESPacket methods
PESPacket::PESPacket()
{
- data[0] = 0x00;
- data[1] = 0x00;
- data[2] = 0x01;
init(0);
+ data[2] = 0x01;
}
void PESPacket::init(UCHAR type, UCHAR sub)
{
+ data.resize(6);
length = 0;
size = 6;
data[3] = type;
- data[4] = data[5] = 0;
packetType = type;
substream = sub;
seq_header = 1; // Unknown seq_header status
init(packetType,substream);
}
-int PESPacket::write(UCHAR *buf, int len)
+int PESPacket::write(const UCHAR *buf, int len)
{
if (length + len > 0xFFFA) return 0;
- memcpy(data+length+6, buf, len);
+ data.insert(data.end(), buf, buf+len);
length += len;
size += len;
data[4] = (length >> 8);
return 1;
}
-ULLONG PESPacket::getPTS()
+ULLONG PESPacket::getPTS() const
{
if ( ( (packetType >= Demuxer::PESTYPE_AUD0 &&
packetType <= Demuxer::PESTYPE_AUDMAX)
||
(packetType >= Demuxer::PESTYPE_VID0 &&
packetType <= Demuxer::PESTYPE_VIDMAX)
- ) && size >= 14 && data[7] & 0x80)
+ ||
+ packetType == Demuxer::PESTYPE_PRIVATE_1
+ )
+ && size >= 14 && data[7] & 0x80)
{
return ( (ULLONG)(data[ 9] & 0x0E) << 29) |
( (ULLONG)(data[10]) << 22 ) |
else return PTS_INVALID;
}
-UCHAR PESPacket::operator[] (UINT index)
+UCHAR PESPacket::operator[] (UINT index) const
{
if (index >= size)
return 0;
return data[index];
}
-UINT PESPacket::findPictureHeader()
+UINT PESPacket::findPictureHeader() const
{
if (size < 12) return 0;
UINT pattern = ( ((UINT)data[ 8] << 24) |
return pos-3;
}
-UINT PESPacket::findSeqHeader()
+UINT PESPacket::findSeqHeader() const
{
if (seq_header != 1) return seq_header;
if (size < 12) return 0;
{
UINT sent = 0;
UCHAR packet_type = packet.getPacketType();
+ const std::vector<UCHAR>& packetdata = packet.getData();
if (packet_type >= PESTYPE_VID0 && packet_type <= PESTYPE_VIDMAX)
{
if (video_current == -1) video_current = packet_type;
if (video_current == packet_type && !vid_seeking)
- sent = videostream.put(packet.getData(), packet.getSize(), MPTYPE_VIDEO);
+ sent = videostream.put(&packetdata[0], packet.getSize(), MPTYPE_VIDEO);
else
sent = packet.getSize();
}
if (audio_current == -1) audio_current = packet_type;
avail_mpaudchan[packet_type - PESTYPE_AUD0] = true;
if (audio_current == packet_type && !aud_seeking)
- sent = audiostream.put(packet.getData(), packet.getSize(), MPTYPE_MPEG_AUDIO);
+ sent = audiostream.put(&packetdata[0], packet.getSize(), MPTYPE_MPEG_AUDIO);
else
sent = packet.getSize();
}
avail_ac3audchan[packet.getSubstream() - PESTYPE_SUBSTREAM_AC30] = true;
if (packet.getSubstream() == audio_current)
{
- sent = audiostream.put(packet.getData(), packet.getSize(), (ispre_1_3_19)? MPTYPE_AC3_PRE13 : MPTYPE_AC3);
+ sent = audiostream.put(&packetdata[0], packet.getSize(), (ispre_1_3_19)? MPTYPE_AC3_PRE13 : MPTYPE_AC3);
}
else
{
/*
- Copyright 2005-2007 Mark Calderbank
+ Copyright 2005-2008 Mark Calderbank
Copyright 2007 Marten Richter (AC3 support)
This file is part of VOMP.
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with VOMP; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ along with VOMP; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/*
#ifndef DEMUXER_H
#define DEMUXER_H
+#include <vector>
#include "stream.h"
#include "defines.h"
PESPacket();
void init(UCHAR type, UCHAR sub=0);
void truncate();
- int write(UCHAR* buf, int len);
+ int write(const UCHAR* buf, int len);
- UCHAR operator[] (UINT index); // return data[index] if in bounds, else 0
+ UCHAR operator[] (UINT index) const;
+ // return data[index] if in bounds, else 0
// so no proper error condition but never mind for now
- const UCHAR* getData() { return data; }
- UINT getLength() { return length; }
- UINT getSize() { return size; }
- UCHAR getPacketType() { return packetType; }
+ const std::vector<UCHAR>& getData() const { return data; }
+ UINT getLength() const { return length; }
+ UINT getSize() const { return size; }
+ UCHAR getPacketType() const { return packetType; }
void setSubstream(UCHAR s) { substream = s; }
- UCHAR getSubstream() { return substream; }
- ULLONG getPTS();
- bool hasPTS() { return (getPTS() != PTS_INVALID); }
+ UCHAR getSubstream() const { return substream; }
+ ULLONG getPTS() const;
+ bool hasPTS() const { return (getPTS() != PTS_INVALID); }
- UINT findPictureHeader();
- UINT findSeqHeader();
- static const ULLONG PTS_INVALID;
+ UINT findPictureHeader() const;
+ UINT findSeqHeader() const;
+ static const ULLONG PTS_INVALID = (1LL << 33);
protected:
- UCHAR data[0x10000];
+ std::vector<UCHAR> data;
UINT length, size;
UCHAR packetType;
UCHAR substream;
ULLONG pts;
- UINT seq_header; // 0 = no, 1 = unknown, else = header offset
+ UINT mutable seq_header; // 0 = no, 1 = unknown, else = header offset
};
class Demuxer