Implemented ES_Rate in PES

This commit is contained in:
Thulinma 2016-12-27 23:56:43 +01:00
parent 1a4c62e763
commit 133a8f36da
3 changed files with 32 additions and 10 deletions

View file

@ -487,8 +487,13 @@ namespace TS {
/// Prepends the lead-in to variable toSend, assumes toSend's length is all other data.
/// \param len The length of this frame.
/// \param PTS The timestamp of the frame.
std::string & Packet::getPESVideoLeadIn(unsigned int len, unsigned long long PTS, unsigned long long offset, bool isAligned) {
std::string & Packet::getPESVideoLeadIn(unsigned int len, unsigned long long PTS, unsigned long long offset, bool isAligned, uint64_t bps) {
len += (offset ? 13 : 8);
if (bps >= 50){
len += 3;
}else{
bps = 0;
}
static std::string tmpStr;
tmpStr.clear();
tmpStr.reserve(25);
@ -500,12 +505,17 @@ namespace TS {
}else{
tmpStr.append("\200", 1);
}
tmpStr += (char)(offset ? 0xC0 : 0x80) ; //PTS/DTS + Flags
tmpStr += (char)(offset ? 0x0A : 0x05); //PESHeaderDataLength
tmpStr += (char)((offset ? 0xC0 : 0x80) | (bps?0x10:0)) ; //PTS/DTS + Flags
tmpStr += (char)((offset ? 10 : 5) + (bps?3:0)); //PESHeaderDataLength
encodePESTimestamp(tmpStr, (offset ? 0x30 : 0x20), PTS + offset);
if (offset){
encodePESTimestamp(tmpStr, 0x10, PTS);
}
if (bps){
char rate_buf[3];
Bit::htob24(rate_buf, (bps/50) | 0x800001);
tmpStr.append(rate_buf, 3);
}
return tmpStr;
}
@ -513,16 +523,28 @@ namespace TS {
/// Prepends the lead-in to variable toSend, assumes toSend's length is all other data.
/// \param len The length of this frame.
/// \param PTS The timestamp of the frame.
std::string & Packet::getPESAudioLeadIn(unsigned int len, unsigned long long PTS) {
std::string & Packet::getPESAudioLeadIn(unsigned int len, unsigned long long PTS, uint64_t bps) {
if (bps >= 50){
len += 3;
}else{
bps = 0;
}
static std::string tmpStr;
tmpStr.clear();
tmpStr.reserve(14);
tmpStr.reserve(20);
len += 8;
tmpStr.append("\000\000\001\300", 4);
tmpStr += (char)((len & 0xFF00) >> 8); //PES PacketLength
tmpStr += (char)(len & 0x00FF); //PES PacketLength (Cont)
tmpStr.append("\204\200\005", 3);
tmpStr += (char)0x84;//isAligned
tmpStr += (char)(0x80 | (bps?0x10:0)) ; //PTS/DTS + Flags
tmpStr += (char)(5 + (bps?3:0)); //PESHeaderDataLength
encodePESTimestamp(tmpStr, 0x20, PTS);
if (bps){
char rate_buf[3];
Bit::htob24(rate_buf, (bps/50) | 0x800001);
tmpStr.append(rate_buf, 3);
}
return tmpStr;
}
//END PES FUNCTIONS

View file

@ -70,8 +70,8 @@ namespace TS {
void updPos(unsigned int newPos);
//PES helpers
static std::string & getPESVideoLeadIn(unsigned int len, unsigned long long PTS, unsigned long long offset, bool isAligned);
static std::string & getPESAudioLeadIn(unsigned int len, unsigned long long PTS);
static std::string & getPESVideoLeadIn(unsigned int len, unsigned long long PTS, unsigned long long offset, bool isAligned, uint64_t bps=0);
static std::string & getPESAudioLeadIn(unsigned int len, unsigned long long PTS, uint64_t bps=0);
//Printers and writers
std::string toPrettyString(size_t indent = 0, int detailLevel = 3) const;

View file

@ -106,7 +106,7 @@ namespace Mist {
while (currPack <= splitCount){
unsigned int alreadySent = 0;
bs = TS::Packet::getPESVideoLeadIn((currPack != splitCount ? watKunnenWeIn1Ding : dataLen+extraSize - currPack*watKunnenWeIn1Ding), packTime, offset, !currPack);
bs = TS::Packet::getPESVideoLeadIn((currPack != splitCount ? watKunnenWeIn1Ding : dataLen+extraSize - currPack*watKunnenWeIn1Ding), packTime, offset, !currPack, Trk.bps);
fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
if (!currPack){
if (Trk.codec == "H264" && (dataPointer[4] & 0x1f) != 0x09){
@ -171,7 +171,7 @@ namespace Mist {
if (Trk.codec == "AAC"){
tempLen += 7;
}
bs = TS::Packet::getPESAudioLeadIn(tempLen, packTime);// myMeta.tracks[thisPacket.getTrackId()].rate / 1000 );
bs = TS::Packet::getPESAudioLeadIn(tempLen, packTime, Trk.bps);// myMeta.tracks[thisPacket.getTrackId()].rate / 1000 );
fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
if (Trk.codec == "AAC"){
bs = TS::getAudioHeader(dataLen, Trk.init);