AVCCBox.multiplyPPS(), allow for multiple SPS/PPS in AVCC Box

This commit is contained in:
Erik Zandvliet 2018-08-30 18:36:14 +02:00 committed by Thulinma
parent b8c932ad1c
commit 493e5bebfa
7 changed files with 40 additions and 13 deletions

View file

@ -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){

View file

@ -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)); }

View file

@ -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;
}
}

View file

@ -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<std::string> 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<std::string>::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;

View file

@ -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);

View file

@ -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;

View file

@ -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;