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;
|
return 2 * res - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bitWriter::appendExpGolomb(uint64_t value){
|
void bitWriter::appendExpGolomb(int64_t value){
|
||||||
append(value + 1, UExpGolombEncodedSize(value));
|
if (value < 0){
|
||||||
|
value = value * -2;
|
||||||
|
}else if (value > 0){
|
||||||
|
value = (value * 2) - 1;
|
||||||
|
}
|
||||||
|
appendUExpGolomb(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void bitWriter::appendUExpGolomb(uint64_t value){
|
void bitWriter::appendUExpGolomb(uint64_t value){
|
||||||
|
|
|
@ -54,7 +54,7 @@ namespace Utils {
|
||||||
~bitWriter();
|
~bitWriter();
|
||||||
size_t size();
|
size_t size();
|
||||||
void append(uint64_t value, size_t bitLength);
|
void append(uint64_t value, size_t bitLength);
|
||||||
void appendExpGolomb(uint64_t value);
|
void appendExpGolomb(int64_t value);
|
||||||
void appendUExpGolomb(uint64_t value);
|
void appendUExpGolomb(uint64_t value);
|
||||||
static size_t UExpGolombEncodedSize(uint64_t value);
|
static size_t UExpGolombEncodedSize(uint64_t value);
|
||||||
std::string str() { return std::string(dataBuffer, (dataSize / 8) + (dataSize % 8 ? 1 : 0)); }
|
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){
|
void ppsUnit::setPPSNumber(size_t newNumber){
|
||||||
//for now, can only convert from 0 to 16
|
//for now, can only convert from 0 to 16
|
||||||
if (seqParameterSetId != 0 || picParameterSetId != 0){
|
picParameterSetId = newNumber;
|
||||||
return;
|
|
||||||
}
|
|
||||||
picParameterSetId = 16;
|
|
||||||
payload.insert(1, 1, 0x08);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ppsUnit::setSPSNumber(size_t newNumber){
|
void ppsUnit::setSPSNumber(size_t newNumber){
|
||||||
|
@ -697,6 +693,7 @@ namespace h264 {
|
||||||
|
|
||||||
std::string ppsUnit::generate() {
|
std::string ppsUnit::generate() {
|
||||||
Utils::bitWriter bw;
|
Utils::bitWriter bw;
|
||||||
|
bw.append(0x08, 8);
|
||||||
bw.appendUExpGolomb(picParameterSetId);
|
bw.appendUExpGolomb(picParameterSetId);
|
||||||
bw.appendUExpGolomb(seqParameterSetId);
|
bw.appendUExpGolomb(seqParameterSetId);
|
||||||
bw.append(entropyCodingModeFlag ? 1 : 0, 1);
|
bw.append(entropyCodingModeFlag ? 1 : 0, 1);
|
||||||
|
@ -726,6 +723,7 @@ namespace h264 {
|
||||||
}
|
}
|
||||||
bw.appendExpGolomb(secondChromaQpIndexOffset);
|
bw.appendExpGolomb(secondChromaQpIndexOffset);
|
||||||
}
|
}
|
||||||
|
bw.append(1,1);
|
||||||
|
|
||||||
std::string tmp = bw.str();
|
std::string tmp = bw.str();
|
||||||
std::string res;
|
std::string res;
|
||||||
|
@ -871,7 +869,7 @@ namespace h264 {
|
||||||
if (data[i] == 0 && data[i+1] == 0 && data[i+2] == 1){
|
if (data[i] == 0 && data[i+1] == 0 && data[i+2] == 1){
|
||||||
offset += i+3;
|
offset += i+3;
|
||||||
while (i && !data[i]){--i;}
|
while (i && !data[i]){--i;}
|
||||||
pktLen = i;
|
pktLen = i + 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "mp4_generic.h"
|
#include "mp4_generic.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
|
#include "h264.h"
|
||||||
#include "h265.h"
|
#include "h265.h"
|
||||||
|
|
||||||
namespace MP4 {
|
namespace MP4 {
|
||||||
|
@ -683,6 +684,28 @@ namespace MP4 {
|
||||||
return payload() + offset + 2;
|
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::string AVCC::toPrettyString(uint32_t indent) {
|
||||||
std::stringstream r;
|
std::stringstream r;
|
||||||
r << std::string(indent, ' ') << "[avcC] H.264 Init Data (" << boxedSize() << ")" << std::endl;
|
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);
|
void setPPS(std::string newPPS, size_t index = 0);
|
||||||
uint32_t getPPSLen(size_t index = 0);
|
uint32_t getPPSLen(size_t index = 0);
|
||||||
char * getPPS(size_t index = 0);
|
char * getPPS(size_t index = 0);
|
||||||
|
void multiplyPPS(size_t newAmount);
|
||||||
std::string hexPPS(size_t index = 0);
|
std::string hexPPS(size_t index = 0);
|
||||||
std::string asAnnexB();
|
std::string asAnnexB();
|
||||||
void setPayload(std::string newPayload);
|
void setPayload(std::string newPayload);
|
||||||
|
|
|
@ -589,9 +589,9 @@ namespace SDP{
|
||||||
avccBox.setProfile(RTrk.spsData[1]);
|
avccBox.setProfile(RTrk.spsData[1]);
|
||||||
avccBox.setCompatibleProfiles(RTrk.spsData[2]);
|
avccBox.setCompatibleProfiles(RTrk.spsData[2]);
|
||||||
avccBox.setLevel(RTrk.spsData[3]);
|
avccBox.setLevel(RTrk.spsData[3]);
|
||||||
avccBox.setSPSNumber(1);
|
avccBox.setSPSCount(1);
|
||||||
avccBox.setSPS(RTrk.spsData);
|
avccBox.setSPS(RTrk.spsData);
|
||||||
avccBox.setPPSNumber(1);
|
avccBox.setPPSCount(1);
|
||||||
avccBox.setPPS(RTrk.ppsData);
|
avccBox.setPPS(RTrk.ppsData);
|
||||||
RTrk.fpsMeta = hMeta.fps;
|
RTrk.fpsMeta = hMeta.fps;
|
||||||
Trk.width = hMeta.width;
|
Trk.width = hMeta.width;
|
||||||
|
|
|
@ -861,9 +861,9 @@ namespace TS{
|
||||||
avccBox.setProfile(spsInfo[it->first][1]);
|
avccBox.setProfile(spsInfo[it->first][1]);
|
||||||
avccBox.setCompatibleProfiles(spsInfo[it->first][2]);
|
avccBox.setCompatibleProfiles(spsInfo[it->first][2]);
|
||||||
avccBox.setLevel(spsInfo[it->first][3]);
|
avccBox.setLevel(spsInfo[it->first][3]);
|
||||||
avccBox.setSPSNumber(1);
|
avccBox.setSPSCount(1);
|
||||||
avccBox.setSPS(spsInfo[it->first]);
|
avccBox.setSPS(spsInfo[it->first]);
|
||||||
avccBox.setPPSNumber(1);
|
avccBox.setPPSCount(1);
|
||||||
avccBox.setPPS(ppsInfo[it->first]);
|
avccBox.setPPS(ppsInfo[it->first]);
|
||||||
meta.tracks[mId].init = std::string(avccBox.payload(), avccBox.payloadSize());
|
meta.tracks[mId].init = std::string(avccBox.payload(), avccBox.payloadSize());
|
||||||
}break;
|
}break;
|
||||||
|
|
Loading…
Add table
Reference in a new issue