AVCCBox.multiplyPPS(), allow for multiple SPS/PPS in AVCC Box
This commit is contained in:
parent
b8c932ad1c
commit
493e5bebfa
7 changed files with 40 additions and 13 deletions
|
@ -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){
|
||||
|
|
|
@ -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)); }
|
||||
|
|
10
lib/h264.cpp
10
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue