Improvements to ResizeablePointer

This commit is contained in:
Thulinma 2020-04-22 20:02:47 +02:00
parent 3ca1ea3b30
commit b5b09f21b4
2 changed files with 12 additions and 12 deletions

View file

@ -734,7 +734,7 @@ namespace RTP{
fuaBuffer[4] |= 0x80; // set error bit fuaBuffer[4] |= 0x80; // set error bit
handleHEVCSingle(msTime, fuaBuffer, fuaBuffer.size(), handleHEVCSingle(msTime, fuaBuffer, fuaBuffer.size(),
h265::isKeyframe(fuaBuffer + 4, fuaBuffer.size() - 4)); h265::isKeyframe(fuaBuffer + 4, fuaBuffer.size() - 4));
fuaBuffer.size() = 0; fuaBuffer.truncate(0);
return; return;
} }
@ -742,14 +742,14 @@ namespace RTP{
if (!fuaBuffer.size()){len += 6;}// six extra bytes for the first packet if (!fuaBuffer.size()){len += 6;}// six extra bytes for the first packet
if (!fuaBuffer.allocate(fuaBuffer.size() + len)){return;} if (!fuaBuffer.allocate(fuaBuffer.size() + len)){return;}
if (!fuaBuffer.size()){ if (!fuaBuffer.size()){
memcpy(fuaBuffer + 6, pl + 3, plSize - 3); fuaBuffer.append("\000\000\000\000\000\000", 6);
fuaBuffer.append(pl + 3, plSize - 3);
// reconstruct first byte // reconstruct first byte
fuaBuffer[4] = ((pl[2] & 0x3F) << 1) | (pl[0] & 0x81); fuaBuffer[4] = ((pl[2] & 0x3F) << 1) | (pl[0] & 0x81);
fuaBuffer[5] = pl[1]; fuaBuffer[5] = pl[1];
}else{ }else{
memcpy(fuaBuffer + fuaBuffer.size(), pl + 3, plSize - 3); fuaBuffer.append(pl+3, plSize-3);
} }
fuaBuffer.size() += len;
if (pl[2] & 0x40){// last packet if (pl[2] & 0x40){// last packet
VERYHIGH_MSG("H265 FU packet type %s (%u) completed: %lu", VERYHIGH_MSG("H265 FU packet type %s (%u) completed: %lu",
@ -758,7 +758,7 @@ namespace RTP{
Bit::htobl(fuaBuffer, fuaBuffer.size() - 4); // size-prepend Bit::htobl(fuaBuffer, fuaBuffer.size() - 4); // size-prepend
handleHEVCSingle(msTime, fuaBuffer, fuaBuffer.size(), handleHEVCSingle(msTime, fuaBuffer, fuaBuffer.size(),
h265::isKeyframe(fuaBuffer + 4, fuaBuffer.size() - 4)); h265::isKeyframe(fuaBuffer + 4, fuaBuffer.size() - 4));
fuaBuffer.size() = 0; fuaBuffer.truncate(0);
} }
}else if (nalType == 50){ }else if (nalType == 50){
ERROR_MSG("PACI/TSCI not supported yet"); ERROR_MSG("PACI/TSCI not supported yet");
@ -882,7 +882,7 @@ namespace RTP{
if (fuaBuffer.size() && ((pl[1] & 0x80) || missed)){ if (fuaBuffer.size() && ((pl[1] & 0x80) || missed)){
WARN_MSG("Ending unfinished FU-A"); WARN_MSG("Ending unfinished FU-A");
INSANE_MSG("H264 FU-A packet incompleted: %lu", fuaBuffer.size()); INSANE_MSG("H264 FU-A packet incompleted: %lu", fuaBuffer.size());
fuaBuffer.size() = 0; fuaBuffer.truncate(0);
return; return;
} }
@ -890,13 +890,13 @@ namespace RTP{
if (!fuaBuffer.size()){len += 5;}// five extra bytes for the first packet if (!fuaBuffer.size()){len += 5;}// five extra bytes for the first packet
if (!fuaBuffer.allocate(fuaBuffer.size() + len)){return;} if (!fuaBuffer.allocate(fuaBuffer.size() + len)){return;}
if (!fuaBuffer.size()){ if (!fuaBuffer.size()){
memcpy(fuaBuffer + 4, pl + 1, plSize - 1); fuaBuffer.append("\000\000\000\000", 4);
fuaBuffer.append(pl + 1, plSize - 1);
// reconstruct first byte // reconstruct first byte
fuaBuffer[4] = (fuaBuffer[4] & 0x1F) | (pl[0] & 0xE0); fuaBuffer[4] = (fuaBuffer[4] & 0x1F) | (pl[0] & 0xE0);
}else{ }else{
memcpy(fuaBuffer + fuaBuffer.size(), pl + 2, plSize - 2); fuaBuffer.append(pl+2, plSize-2);
} }
fuaBuffer.size() += len;
if (pl[1] & 0x40){// last packet if (pl[1] & 0x40){// last packet
INSANE_MSG("H264 FU-A packet type %u completed: %lu", (unsigned int)(fuaBuffer[4] & 0x1F), INSANE_MSG("H264 FU-A packet type %u completed: %lu", (unsigned int)(fuaBuffer[4] & 0x1F),
@ -910,7 +910,7 @@ namespace RTP{
handleH264Single(msTime, fuaBuffer, fuaBuffer.size(), handleH264Single(msTime, fuaBuffer, fuaBuffer.size(),
h264::isKeyframe(fuaBuffer + 4, fuaBuffer.size() - 4)); h264::isKeyframe(fuaBuffer + 4, fuaBuffer.size() - 4));
} }
fuaBuffer.size() = 0; fuaBuffer.truncate(0);
} }
return; return;
} }

View file

@ -108,7 +108,7 @@ namespace Mist{
} }
bool InputEBML::readElement(){ bool InputEBML::readElement(){
ptr.size() = 0; ptr.truncate(0);
readingMinimal = true; readingMinimal = true;
uint32_t needed = EBML::Element::needBytes(ptr, ptr.size(), readingMinimal); uint32_t needed = EBML::Element::needBytes(ptr, ptr.size(), readingMinimal);
while (ptr.size() < needed){ while (ptr.size() < needed){
@ -125,9 +125,9 @@ namespace Mist{
} }
return false; return false;
} }
ptr.append(0, toRead);
} }
totalBytes += toRead; totalBytes += toRead;
ptr.size() = needed;
needed = EBML::Element::needBytes(ptr, ptr.size(), readingMinimal); needed = EBML::Element::needBytes(ptr, ptr.size(), readingMinimal);
if (ptr.size() >= needed){ if (ptr.size() >= needed){
// Make sure TrackEntry types are read whole // Make sure TrackEntry types are read whole