Extracting PES Timestamps to DTSC::DTMI

This commit is contained in:
Erik Zandvliet 2012-07-03 12:36:04 +02:00 committed by Thulinma
parent 6bad0360a1
commit 663a504891
3 changed files with 44 additions and 10 deletions

View file

@ -19,3 +19,4 @@ libtinythread_la_SOURCES=tinythread.h tinythread.cpp
libtinythread_la_LIBADD=-lpthread libtinythread_la_LIBADD=-lpthread
libmp4_la_SOURCES=mp4.h mp4.cpp libmp4_la_SOURCES=mp4.h mp4.cpp
libts_packet_la_SOURCES=ts_packet.h ts_packet.cpp libts_packet_la_SOURCES=ts_packet.h ts_packet.cpp
libts_packet_la_LIBADD=./libdtsc.la

View file

@ -165,7 +165,7 @@ void TS::Packet::UnitStart( int NewVal ) {
/// Gets whether this TS::Packet can be accessed at random (indicates keyframe). /// Gets whether this TS::Packet can be accessed at random (indicates keyframe).
/// \return Whether or not this TS::Packet contains a keyframe. /// \return Whether or not this TS::Packet contains a keyframe.
int TS::Packet::RandomAccess( ) { int TS::Packet::RandomAccess( ) {
if( !AdaptationField() ) { if( AdaptationField() < 2 ) {
return -1; return -1;
} }
return ( Buffer[5] & 0x40) >> 6; return ( Buffer[5] & 0x40) >> 6;
@ -334,18 +334,45 @@ int TS::Packet::ProgramMapPID( ) {
} }
void TS::Packet::UpdateStreamPID( int & VideoPid, int & AudioPid ) { void TS::Packet::UpdateStreamPID( int & VideoPid, int & AudioPid ) {
int Offset = Buffer[4]; int Offset = Buffer[4] + 5;
int SectionLength = ( ( Buffer[6+Offset] & 0x0F) << 8 ) + Buffer[7+Offset]; int SectionLength = ( ( Buffer[1+Offset] & 0x0F) << 8 ) + Buffer[2+Offset];
int ProgramInfoLength = ( (Buffer[15+Offset] & 0x0F) << 8 ) + Buffer[16+Offset]; int ProgramInfoLength = ( (Buffer[10+Offset] & 0x0F) << 8 ) + Buffer[11+Offset];
int CurOffset = 17+ProgramInfoLength+Offset; int CurOffset = 12 + ProgramInfoLength;
while( CurOffset < SectionLength-4 ) { while( CurOffset < (SectionLength+3)-4 ) {
if( Buffer[CurOffset] == 0x01 || Buffer[CurOffset == 0x02] ) { if( Buffer[CurOffset] == 0x1B ) {
VideoPid = ((Buffer[CurOffset+1] & 0x1F) << 8 ) + Buffer[CurOffset+2]; VideoPid = ((Buffer[CurOffset+1] & 0x1F) << 8 ) + Buffer[CurOffset+2];
} fprintf( stderr, "Video stream recognized at PID %d\n", ((Buffer[CurOffset+1] & 0x1F) << 8 ) + Buffer[CurOffset+2] );
if( Buffer[CurOffset] == 0x03 || Buffer[CurOffset == 0x04] ) { } else if( Buffer[CurOffset] == 0x0F ) {
AudioPid = ((Buffer[CurOffset+1] & 0x1F) << 8 ) + Buffer[CurOffset+2]; AudioPid = ((Buffer[CurOffset+1] & 0x1F) << 8 ) + Buffer[CurOffset+2];
fprintf( stderr, "Audio stream recognized at PID %d\n", ((Buffer[CurOffset+1] & 0x1F) << 8 ) + Buffer[CurOffset+2] );
} else {
fprintf( stderr, "Unsupported stream type: %0.2X\n", Buffer[CurOffset] );
} }
int ESLen = (( Buffer[CurOffset+3] & 0xF0 ) << 8 ) + Buffer[CurOffset+4]; int ESLen = (( Buffer[CurOffset+3] & 0x0F ) << 8 ) + Buffer[CurOffset+4];
CurOffset += ( 5 + ESLen ); CurOffset += ( 5 + ESLen );
} }
} }
int TS::Packet::PESTimeStamp( ) {
if( !UnitStart( ) ) { return -1; }
int PesOffset = 4;
if( AdaptationField( ) >= 2 ) { PesOffset += 1 + AdaptationFieldLen( ); }
fprintf( stderr, "PES Offset: %d\n", PesOffset );
fprintf( stderr, "PES StartCode: %0.2X %0.2X %0.2X\n", Buffer[PesOffset], Buffer[PesOffset+1], Buffer[PesOffset+2] );
int MyTimestamp = (Buffer[PesOffset+9] & 0x0F) >> 1;
MyTimestamp = (MyTimestamp << 8) + Buffer[PesOffset+10];
MyTimestamp = (MyTimestamp << 7) + ((Buffer[PesOffset+11]) >> 1);
MyTimestamp = (MyTimestamp << 8) + Buffer[PesOffset+12];
MyTimestamp = (MyTimestamp << 7) + ((Buffer[PesOffset+13]) >> 1);
fprintf( stderr, "PES Timestamp: %d\n", MyTimestamp );
return 0;
}
DTSC::DTMI TS::Packet::toDTSC(DTSC::DTMI & metadata, std::string Type) {
DTSC::DTMI outPack = DTSC::DTMI(Type, DTSC::DTMI_ROOT);
outPack.addContent(DTSC::DTMI("datatype", Type));
if( UnitStart() ) {
outPack.addContent(DTSC::DTMI("time", PESTimeStamp( )));
}
return outPack;
}

View file

@ -10,6 +10,8 @@
#include <cstdlib> #include <cstdlib>
#include <algorithm> #include <algorithm>
#include "dtsc.h"
/// Holds all TS processing related code. /// Holds all TS processing related code.
namespace TS { namespace TS {
/// Class for reading and writing TS Streams /// Class for reading and writing TS Streams
@ -44,8 +46,12 @@ namespace TS {
void AddStuffing( int NumBytes ); void AddStuffing( int NumBytes );
void FFMpegHeader( ); void FFMpegHeader( );
int PESTimeStamp( );
//For output to DTSC
int ProgramMapPID( ); int ProgramMapPID( );
void UpdateStreamPID( int & VideoPid, int & AudioPid ); void UpdateStreamPID( int & VideoPid, int & AudioPid );
DTSC::DTMI toDTSC(DTSC::DTMI & metadata, std::string Type);
private: private:
int Free; int Free;
char Buffer[188];///< The actual data char Buffer[188];///< The actual data