MP4 speed optimize

This commit is contained in:
Thulinma 2017-01-31 14:48:49 +01:00
parent 7f7b35acce
commit 29669f24c4
5 changed files with 22 additions and 24 deletions

View file

@ -84,25 +84,21 @@ namespace MP4 {
return std::string(retVal + 4, 4);
}
///\todo make good working calcBoxSize with size and payloadoffset calculation
unsigned long int calcBoxSize(char readVal[16]) {
return (unsigned int)ntohl(((int *)readVal)[0]);
/// Checks box size, offset-aware
uint64_t calcBoxSize(const char * p){
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) {
char readVal[16];
long long unsigned int pos = ftell(newData);
if (fread(readVal, 4, 1, newData)) {
if (fread(readVal, 16, 1, newData)) {
uint64_t size = calcBoxSize(readVal);
if (size == 1) {
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) {
if (size == 0) {
fseek(newData, 0, SEEK_END);
return true;
}
@ -120,9 +116,9 @@ namespace MP4 {
bool Box::read(FILE * newData) {
char readVal[16];
long long unsigned int pos = ftell(newData);
if (fread(readVal, 4, 1, newData)) {
if (fread(readVal, 16, 1, newData)) {
payloadOffset = 8;
uint64_t size = calcBoxSize(readVal);
uint64_t size = ntohl(((int *)readVal)[0]);
if (size == 1) {
if (fread(readVal + 4, 12, 1, newData)) {
size = 0 + ntohl(((int *)readVal)[2]);
@ -182,7 +178,7 @@ namespace MP4 {
/// Returns the total boxed size of this box, including the header.
uint64_t Box::boxedSize() {
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]);
}
@ -621,7 +617,7 @@ namespace MP4 {
if ((index + payloadOffset + 8) > boxedSize()) {
return 0;
}
return getBox(index).boxedSize();
return calcBoxSize(data + index + payloadOffset);
}
/// Replaces the existing box at the given index by the new box newEntry.
@ -732,9 +728,9 @@ namespace MP4 {
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);
if (no > getContentCount()) {
if (!unsafe && no > getContentCount()) {
return ret;
}
unsigned int i = 0;

View file

@ -17,6 +17,7 @@
namespace MP4 {
std::string readBoxType(FILE * newData);
bool skipBox(FILE * newData);
uint64_t calcBoxSize(const char * p);
class Box {
@ -81,7 +82,7 @@ namespace MP4 {
containerBox();
uint32_t getContentCount();
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);
};

View file

@ -58,9 +58,10 @@ namespace MP4 {
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);
if (no > getContentCount()) {
if (!unsafe && no > getContentCount()) {
return ret;
}
unsigned int i = 0;

View file

@ -21,7 +21,7 @@ namespace MP4 {
TRAF();
uint32_t getContentCount();
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);
};
//TRAF Box

View file

@ -542,7 +542,7 @@ namespace Mist {
char * dataPointer = 0;
unsigned int len = 0;
thisPacket.getString("data", dataPointer, len);
if ((unsigned long)thisPacket.getTrackId() != sortSet.begin()->trackID || thisPacket.getTime() != sortSet.begin()->time){
if ((unsigned long)thisPacket.getTrackId() != sortSet.begin()->trackID || thisPacket.getTime() != sortSet.begin()->time || len != sortSet.begin()->size) {
if (thisPacket.getTime() > sortSet.begin()->time || (unsigned long)thisPacket.getTrackId() > sortSet.begin()->trackID) {
if (perfect){
DEBUG_MSG(DLVL_WARN, "Warning: input is inconsistent. Expected %lu:%llu but got %ld:%llu - cancelling playback", sortSet.begin()->trackID, sortSet.begin()->time, thisPacket.getTrackId(), thisPacket.getTime());