#define DEMUXER_SEQ_HEAD 0xB3010000
#endif
+#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 };
if (packetType >= PESTYPE_AUD0 && packetType <= PESTYPE_AUDMAX)
{
// Extract audio PTS if it exists
- if ( data[7] & 0x80 ) // PTS_DTS_flags indicate that PTS is present
+ if ( size >= 14 && (data[7] & 0x80) ) // PTS_DTS_flags indicate PTS
{
dx->audio_pts = pts = ( (ULLONG)(data[9] & 0x0E) << 29 ) |
( (ULLONG)(data[10]) << 22 ) |
else if (packetType >= PESTYPE_VID0 && packetType <= PESTYPE_VIDMAX)
{
// Extract video PTS if it exists
- if ( data[7] & 0x80 ) // PTS_DTS_flags indicate that PTS is present
+ if ( size >= 14 && (data[7] & 0x80) ) // PTS_DTS_flags indicate PTS
{
dx->video_pts = pts = ( (ULLONG)(data[9] & 0x0E) << 29 ) |
( (ULLONG)(data[10]) << 22 ) |
}
}
}
+
+UINT Demuxer::PESPacket::findPictureHeader()
+{
+ if (size < 12) return 0;
+ UINT pattern = *(UINT*)(data+8);
+ UINT pos = 11;
+ while (pattern != DEMUXER_PIC_HEAD)
+ {
+ if (++pos >= size) return 0;
+ pattern = (pattern << 8) | data[pos];
+ }
+ return pos-3;
+}
bool seq_header;
UINT submitted;
virtual void parseDetails();
+ UINT findPictureHeader();
static const ULLONG PTS_INVALID;
};
#define __BYTE_ORDER __LITTLE_ENDIAN
#endif
-#if __BYTE_ORDER == __BIG_ENDIAN
-#define DEMUXER_SEQ_HEAD 0x000001B3
-#else
-#define DEMUXER_SEQ_HEAD 0xB3010000
-#endif
-
#define PTS_JUMP_MARGIN 10000
-#define PTS_ERASE_MARGIN 900000 // Erase PTS record if we get within 10 seconds
#define PTS_ALLOWANCE 90000
-//#define PTS_UPDATE_FRAMES 2048
-//#define PTS_EXPIRE_FRAMES 2500
// TODO: PTS class to handle wrapping arithmetic & comparisons?
static ULLONG PTSDistance(ULLONG pts1, ULLONG pts2)
void DemuxerVDR::PESPacketVDR::parseDetails()
{
- // TODO: Currently, we naïvely assume that a packet contains a new frame
- // if and only if it contains a pts, and that no packet contains more
- // than one new frame
-
DemuxerVDR* dx = (DemuxerVDR*)(DemuxerVDR::getInstance());
PESPacket::parseDetails();
- if (dx->frameCounting && pts != PTS_INVALID &&
+
+ if (dx->frameCounting && findPictureHeader() &&
packetType >= PESTYPE_VID0 && packetType <= PESTYPE_VIDMAX)
{
ULONG frame_num = (dx->frameNumber)++;
- if (seq_header)
+ if (seq_header && pts != PTS_INVALID)
{
PTSMapEntry me;
pthread_mutex_lock(&(dx->pts_map_mutex));