From 133a8f36da2fa2ee4fbd87a580fe0af6b42b0e95 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Tue, 27 Dec 2016 23:56:43 +0100 Subject: [PATCH] Implemented ES_Rate in PES --- lib/ts_packet.cpp | 34 ++++++++++++++++++++++++++++------ lib/ts_packet.h | 4 ++-- src/output/output_ts_base.cpp | 4 ++-- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/ts_packet.cpp b/lib/ts_packet.cpp index 5fdd460d..a009a2e9 100644 --- a/lib/ts_packet.cpp +++ b/lib/ts_packet.cpp @@ -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 diff --git a/lib/ts_packet.h b/lib/ts_packet.h index 4e411a1c..633afe92 100644 --- a/lib/ts_packet.h +++ b/lib/ts_packet.h @@ -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; diff --git a/src/output/output_ts_base.cpp b/src/output/output_ts_base.cpp index c05342e4..ff0c47bd 100644 --- a/src/output/output_ts_base.cpp +++ b/src/output/output_ts_base.cpp @@ -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);