Merge branch 'development' into LTS_development

# Conflicts:
#	src/output/output_progressive_mp4.cpp
This commit is contained in:
Thulinma 2017-01-31 14:51:49 +01:00
commit ba5cbcb05f
4 changed files with 21 additions and 23 deletions

View file

@ -86,25 +86,21 @@ namespace MP4 {
return std::string(retVal + 4, 4); return std::string(retVal + 4, 4);
} }
///\todo make good working calcBoxSize with size and payloadoffset calculation /// Checks box size, offset-aware
unsigned long int calcBoxSize(char readVal[16]) { uint64_t calcBoxSize(const char * p){
return (unsigned int)ntohl(((int *)readVal)[0]); uint64_t r = ntohl(((int *)p)[0]);
if (r == 1){
return (((uint64_t)ntohl(((int *)p)[2])) << 32) | ntohl(((int *)p)[3]);
}
return r;
} }
bool skipBox(FILE * newData) { bool skipBox(FILE * newData) {
char readVal[16]; char readVal[16];
long long unsigned int pos = ftell(newData); long long unsigned int pos = ftell(newData);
if (fread(readVal, 4, 1, newData)) { if (fread(readVal, 16, 1, newData)) {
uint64_t size = calcBoxSize(readVal); uint64_t size = calcBoxSize(readVal);
if (size == 1) { if (size == 0) {
if (fread(readVal + 4, 12, 1, newData)) {
size = 0 + ntohl(((int *)readVal)[2]);
size <<= 32;
size += ntohl(((int *)readVal)[3]);
} else {
return false;
}
} else if (size == 0) {
fseek(newData, 0, SEEK_END); fseek(newData, 0, SEEK_END);
return true; return true;
} }
@ -122,9 +118,9 @@ namespace MP4 {
bool Box::read(FILE * newData) { bool Box::read(FILE * newData) {
char readVal[16]; char readVal[16];
long long unsigned int pos = ftell(newData); long long unsigned int pos = ftell(newData);
if (fread(readVal, 4, 1, newData)) { if (fread(readVal, 16, 1, newData)) {
payloadOffset = 8; payloadOffset = 8;
uint64_t size = calcBoxSize(readVal); uint64_t size = ntohl(((int *)readVal)[0]);
if (size == 1) { if (size == 1) {
if (fread(readVal + 4, 12, 1, newData)) { if (fread(readVal + 4, 12, 1, newData)) {
size = 0 + ntohl(((int *)readVal)[2]); size = 0 + ntohl(((int *)readVal)[2]);
@ -184,7 +180,7 @@ namespace MP4 {
/// Returns the total boxed size of this box, including the header. /// Returns the total boxed size of this box, including the header.
uint64_t Box::boxedSize() { uint64_t Box::boxedSize() {
if (payloadOffset == 16) { if (payloadOffset == 16) {
return ((uint64_t)ntohl(((int *)data)[2]) << 32) + ntohl(((int *)data)[3]); return ((uint64_t)ntohl(((int *)data)[2]) << 32) | ntohl(((int *)data)[3]);
} }
return ntohl(((int *)data)[0]); return ntohl(((int *)data)[0]);
} }
@ -669,7 +665,7 @@ namespace MP4 {
if ((index + payloadOffset + 8) > boxedSize()) { if ((index + payloadOffset + 8) > boxedSize()) {
return 0; return 0;
} }
return getBox(index).boxedSize(); return calcBoxSize(data + index + payloadOffset);
} }
/// Replaces the existing box at the given index by the new box newEntry. /// Replaces the existing box at the given index by the new box newEntry.
@ -780,9 +776,9 @@ namespace MP4 {
setBox(newContent, tempLoc); setBox(newContent, tempLoc);
} }
Box & containerBox::getContent(uint32_t no) { Box & containerBox::getContent(uint32_t no, bool unsafe) {
static Box ret = Box((char *)"\000\000\000\010erro", false); static Box ret = Box((char *)"\000\000\000\010erro", false);
if (no > getContentCount()) { if (!unsafe && no > getContentCount()) {
return ret; return ret;
} }
unsigned int i = 0; unsigned int i = 0;

View file

@ -17,6 +17,7 @@
namespace MP4 { namespace MP4 {
std::string readBoxType(FILE * newData); std::string readBoxType(FILE * newData);
bool skipBox(FILE * newData); bool skipBox(FILE * newData);
uint64_t calcBoxSize(const char * p);
class Box { class Box {
@ -81,7 +82,7 @@ namespace MP4 {
containerBox(); containerBox();
uint32_t getContentCount(); uint32_t getContentCount();
void setContent(Box & newContent, uint32_t no); void setContent(Box & newContent, uint32_t no);
Box & getContent(uint32_t no); Box & getContent(uint32_t no, bool unsafe = false);
std::string toPrettyString(uint32_t indent = 0); std::string toPrettyString(uint32_t indent = 0);
}; };

View file

@ -58,9 +58,10 @@ namespace MP4 {
setBox(newContent, tempLoc); setBox(newContent, tempLoc);
} }
Box & TRAF::getContent(uint32_t no) { /// Gets a reference to the given box number. If unsafe, doesn't check boundaries (getContentCount check skipped).
Box & TRAF::getContent(uint32_t no, bool unsafe) {
static Box ret = Box((char *)"\000\000\000\010erro", false); static Box ret = Box((char *)"\000\000\000\010erro", false);
if (no > getContentCount()) { if (!unsafe && no > getContentCount()) {
return ret; return ret;
} }
unsigned int i = 0; unsigned int i = 0;

View file

@ -22,7 +22,7 @@ namespace MP4 {
TRAF(); TRAF();
uint32_t getContentCount(); uint32_t getContentCount();
void setContent(Box & newContent, uint32_t no); void setContent(Box & newContent, uint32_t no);
Box & getContent(uint32_t no); Box & getContent(uint32_t no, bool unsafe = false);
std::string toPrettyString(uint32_t indent = 0); std::string toPrettyString(uint32_t indent = 0);
}; };
//TRAF Box //TRAF Box