diff --git a/lib/bitstream.cpp b/lib/bitstream.cpp index 5ed9b757..f8835f2a 100644 --- a/lib/bitstream.cpp +++ b/lib/bitstream.cpp @@ -227,8 +227,13 @@ namespace Utils { return 2 * res - 1; } - void bitWriter::appendExpGolomb(uint64_t value){ - append(value + 1, UExpGolombEncodedSize(value)); + void bitWriter::appendExpGolomb(int64_t value){ + if (value < 0){ + value = value * -2; + }else if (value > 0){ + value = (value * 2) - 1; + } + appendUExpGolomb(value); } void bitWriter::appendUExpGolomb(uint64_t value){ diff --git a/lib/bitstream.h b/lib/bitstream.h index 0119dc8a..62136a07 100644 --- a/lib/bitstream.h +++ b/lib/bitstream.h @@ -54,7 +54,7 @@ namespace Utils { ~bitWriter(); size_t size(); void append(uint64_t value, size_t bitLength); - void appendExpGolomb(uint64_t value); + void appendExpGolomb(int64_t value); void appendUExpGolomb(uint64_t value); static size_t UExpGolombEncodedSize(uint64_t value); std::string str() { return std::string(dataBuffer, (dataSize / 8) + (dataSize % 8 ? 1 : 0)); } diff --git a/lib/h264.cpp b/lib/h264.cpp index 9003990b..04856bab 100644 --- a/lib/h264.cpp +++ b/lib/h264.cpp @@ -633,11 +633,7 @@ namespace h264 { void ppsUnit::setPPSNumber(size_t newNumber){ //for now, can only convert from 0 to 16 - if (seqParameterSetId != 0 || picParameterSetId != 0){ - return; - } - picParameterSetId = 16; - payload.insert(1, 1, 0x08); + picParameterSetId = newNumber; } void ppsUnit::setSPSNumber(size_t newNumber){ @@ -697,6 +693,7 @@ namespace h264 { std::string ppsUnit::generate() { Utils::bitWriter bw; + bw.append(0x08, 8); bw.appendUExpGolomb(picParameterSetId); bw.appendUExpGolomb(seqParameterSetId); bw.append(entropyCodingModeFlag ? 1 : 0, 1); @@ -726,6 +723,7 @@ namespace h264 { } bw.appendExpGolomb(secondChromaQpIndexOffset); } + bw.append(1,1); std::string tmp = bw.str(); std::string res; @@ -871,7 +869,7 @@ namespace h264 { if (data[i] == 0 && data[i+1] == 0 && data[i+2] == 1){ offset += i+3; while (i && !data[i]){--i;} - pktLen = i; + pktLen = i + 1; break; } } diff --git a/lib/mp4_generic.cpp b/lib/mp4_generic.cpp index ebd66d39..ccb60b92 100644 --- a/lib/mp4_generic.cpp +++ b/lib/mp4_generic.cpp @@ -1,5 +1,6 @@ #include "mp4_generic.h" #include "defines.h" +#include "h264.h" #include "h265.h" namespace MP4 { @@ -683,6 +684,28 @@ namespace MP4 { return payload() + offset + 2; } + void AVCC::multiplyPPS(size_t newAmount){ + if (getPPSCount() != 1){ + WARN_MSG("We do not have a single PPS, ignoring multiplication"); + return; + } + h264::ppsUnit PPS(getPPS(), getPPSLen()); + std::deque allPPS; + for (size_t i = 0; i < newAmount; i++){ + PPS.setPPSNumber(i); + allPPS.push_back(PPS.generate()); + } + setPPSCount(allPPS.size()); + size_t offset = 8 + getSPSLen() + 1; + for (std::deque::iterator it = allPPS.begin(); it != allPPS.end(); it++){ + setInt16(it->size(), offset); + for (unsigned int i = 0; i < it->size(); i++) { + setInt8(it->at(i), offset + 2 + i); + } //not null-terminated + offset += it->size() + 2; + } + } + std::string AVCC::toPrettyString(uint32_t indent) { std::stringstream r; r << std::string(indent, ' ') << "[avcC] H.264 Init Data (" << boxedSize() << ")" << std::endl; diff --git a/lib/mp4_generic.h b/lib/mp4_generic.h index 5ed52d7b..f68f4715 100644 --- a/lib/mp4_generic.h +++ b/lib/mp4_generic.h @@ -126,6 +126,7 @@ namespace MP4 { void setPPS(std::string newPPS, size_t index = 0); uint32_t getPPSLen(size_t index = 0); char * getPPS(size_t index = 0); + void multiplyPPS(size_t newAmount); std::string hexPPS(size_t index = 0); std::string asAnnexB(); void setPayload(std::string newPayload); diff --git a/lib/sdp.cpp b/lib/sdp.cpp index 5a74db9d..d06fa40c 100644 --- a/lib/sdp.cpp +++ b/lib/sdp.cpp @@ -589,9 +589,9 @@ namespace SDP{ avccBox.setProfile(RTrk.spsData[1]); avccBox.setCompatibleProfiles(RTrk.spsData[2]); avccBox.setLevel(RTrk.spsData[3]); - avccBox.setSPSNumber(1); + avccBox.setSPSCount(1); avccBox.setSPS(RTrk.spsData); - avccBox.setPPSNumber(1); + avccBox.setPPSCount(1); avccBox.setPPS(RTrk.ppsData); RTrk.fpsMeta = hMeta.fps; Trk.width = hMeta.width; diff --git a/lib/ts_stream.cpp b/lib/ts_stream.cpp index b7b22313..0647fd86 100644 --- a/lib/ts_stream.cpp +++ b/lib/ts_stream.cpp @@ -861,9 +861,9 @@ namespace TS{ avccBox.setProfile(spsInfo[it->first][1]); avccBox.setCompatibleProfiles(spsInfo[it->first][2]); avccBox.setLevel(spsInfo[it->first][3]); - avccBox.setSPSNumber(1); + avccBox.setSPSCount(1); avccBox.setSPS(spsInfo[it->first]); - avccBox.setPPSNumber(1); + avccBox.setPPSCount(1); avccBox.setPPS(ppsInfo[it->first]); meta.tracks[mId].init = std::string(avccBox.payload(), avccBox.payloadSize()); }break;