Assorted fixes, improvements etc

This commit is contained in:
Thulinma 2013-12-19 13:36:48 +01:00
parent 06b5596b2a
commit 87d027817c
5 changed files with 103 additions and 35 deletions

View file

@ -224,6 +224,9 @@ void DTSC::Stream::addPacket(JSON::Value & newPack){
while (buffers.count(newPos) > 0){
newPos.seekTime++;
}
while (buffercount == 1 && buffers.size() > 0){
cutOneBuffer();
}
buffers[newPos] = newPack;
datapointertype = INVALID;
std::string tmp = "";
@ -262,9 +265,6 @@ void DTSC::Stream::addPacket(JSON::Value & newPack){
metadata.bufferWindow = buffertime;
}
while (buffercount == 1 && buffers.size() > 1){
cutOneBuffer();
}
}
/// Deletes a the first part of the buffer, updating the keyframes list and metadata as required.
@ -922,6 +922,15 @@ bool DTSC::File::seek_bpos(int bpos){
return false;
}
void DTSC::File::rewritePacket(std::string & newPacket, int bytePos){
fseek(F, bytePos, SEEK_SET);
fwrite(newPacket.c_str(), newPacket.size(), 1, F);
fseek(F, 0, SEEK_END);
if (ftell(F) > endPos){
endPos = ftell(F);
}
}
void DTSC::File::writePacket(std::string & newPacket){
fseek(F, 0, SEEK_END);
fwrite(newPacket.c_str(), newPacket.size(), 1, F); //write contents

View file

@ -209,11 +209,11 @@ namespace DTSC {
Track::Track(JSON::Value & trackRef){
if (trackRef.isMember("fragments") && trackRef["fragments"].isString()){
Fragment* tmp = (Fragment*)trackRef["fragments"].asString().data();
fragments = std::deque<Fragment>(tmp,tmp + (trackRef["fragments"].asString().size() / 11));
fragments = std::deque<Fragment>(tmp, tmp + (trackRef["fragments"].asString().size() / 11));
}
if (trackRef.isMember("keys") && trackRef["keys"].isString()){
Key* tmp = (Key*)trackRef["keys"].asString().data();
keys = std::deque<Key>(tmp,tmp + (trackRef["keys"].asString().size() / 16));
keys = std::deque<Key>(tmp, tmp + (trackRef["keys"].asString().size() / 16));
}
if (trackRef.isMember("parts") && trackRef["parts"].isString()){
Part* tmp = (Part*)trackRef["parts"].asString().data();
@ -277,7 +277,7 @@ namespace DTSC {
}
keys.push_back(newKey);
firstms = keys[0].getTime();
if (!fragments.size() || pack["time"].asInt() - 10000 >= getKey(fragments.rbegin()->getNumber()).getTime()){
if (!fragments.size() || pack["time"].asInt() - 5000 >= getKey(fragments.rbegin()->getNumber()).getTime()){
//new fragment
Fragment newFrag;
newFrag.setDuration(0);
@ -342,6 +342,7 @@ namespace DTSC {
readOnlyMeta::readOnlyMeta(){
vod = false;
live = false;
merged = false;
moreheader = 0;
merged = false;
bufferWindow = 0;

View file

@ -140,4 +140,38 @@ namespace JSON {
}
}
}
template <typename T>
std::string encodeVector4(T begin, T end){
std::string result;
for( T it = begin; it != end; it++){
long long int tmp = (*it);
while(tmp >= 0xFFFFFFFF){
result += (char)0xFF;
result += (char)0xFF;
result += (char)0xFF;
result += (char)0xFF;
tmp -= 0xFFFFFFFF;
}
result += (char)((tmp & 0xFF000000) >> 24);
result += (char)((tmp & 0x00FF0000) >> 16);
result += (char)((tmp & 0x0000FF00) >> 8);
result += (char)((tmp & 0x000000FF));
}
return result;
}
template <typename T>
void decodeVector4( std::string input, T & result ){
result.clear();
unsigned int tmp = 0;
for( int i = 0; i < input.size(); i += 4){
unsigned int curLen = (input[i] << 24) + (input[i+1] << 16) + (input[i+2] << 8) + (input[i+3]);
tmp += curLen;
if (curLen != 0xFFFFFFFF){
result.push_back(tmp);
tmp = 0;
}
}
}
}

View file

@ -244,7 +244,8 @@ namespace MP4 {
case 0x73747364:
return ((STSD*)this)->toPrettyString(indent);
break;
case 0x6D703461:
case 0x6D703461://mp4a
case 0x656E6361://enca
return ((MP4A*)this)->toPrettyString(indent);
break;
case 0x61616320:
@ -253,7 +254,8 @@ namespace MP4 {
case 0x61766331:
return ((AVC1*)this)->toPrettyString(indent);
break;
case 0x68323634:
case 0x68323634://h264
case 0x656E6376://encv
return ((H264*)this)->toPrettyString(indent);
break;
case 0x65647473:
@ -493,7 +495,7 @@ namespace MP4 {
/// Will attempt to resize if out of range.
/// Returns an 8-byte error box if resizing failed.
Box & Box::getBox(size_t index){
static Box retbox;
static Box retbox = Box((char*)"\000\000\000\010erro", false);
index += payloadOffset;
if (index + 8 > boxedSize()){
if ( !reserve(index, 0, 8)){
@ -510,7 +512,7 @@ namespace MP4 {
/// Returns undefined values if there is no box at the given position.
/// Returns 0 if out of range.
size_t Box::getBoxLen(size_t index){
if (index + payloadOffset + 8 > boxedSize()){
if ((index + payloadOffset + 8) > boxedSize()){
return 0;
}
return getBox(index).boxedSize();
@ -600,7 +602,7 @@ namespace MP4 {
int tempLoc = 0;
while (tempLoc < boxedSize() - 8){
res++;
tempLoc += getBoxLen(tempLoc);
tempLoc += Box(getBox(tempLoc).asBox(), false).boxedSize();
}
return res;
}
@ -640,13 +642,9 @@ namespace MP4 {
std::string containerBox::toPrettyContainerString(uint32_t indent, std::string boxName){
std::stringstream r;
r << std::string(indent, ' ') << boxName <<" (" << boxedSize() << ")" << std::endl;
Box curBox;
int tempLoc = 0;
int contentCount = getContentCount();
for (int i = 0; i < contentCount; i++){
curBox = getContent(i);
for (int i = 0; i < getContentCount(); i++){
Box curBox = MP4::Box(getContent(i).asBox(), false);
r << curBox.toPrettyString(indent + 1);
tempLoc += getBoxLen(tempLoc);
}
return r.str();
}
@ -1508,13 +1506,10 @@ namespace MP4 {
std::string TRAF::toPrettyString(uint32_t indent){
std::stringstream r;
r << std::string(indent, ' ') << "[traf] Track Fragment Box (" << boxedSize() << ")" << std::endl;
Box curBox;
int tempLoc = 0;
int contentCount = getContentCount();
for (int i = 0; i < contentCount; i++){
curBox = getContent(i);
Box curBox = Box(getContent(i).asBox(),false);
r << curBox.toPrettyString(indent + 1);
tempLoc += curBox.boxedSize();
}
return r.str();
}
@ -2274,6 +2269,25 @@ namespace MP4 {
return r.str();
}
void AVCC::fromAnnexB(std::string annexBFormatted){
///\todo fix correct data :p
setVersion(0x01);
setProfile(0x4D);
setCompatibleProfiles(0x40);
setLevel(0x1F);
setSPSNumber(0xE1);
static char annexBHeader[] = {0x00,0x00,0x00,0x01};
if (memcmp(annexBFormatted.c_str(), annexBHeader, 4)){
return;
}
annexBFormatted.erase(0,4);
int separator = annexBFormatted.find(annexBHeader, 0, 4);
setSPS(annexBFormatted.substr(0,separator));
setPPSNumber(0x01);
annexBFormatted.erase(0,separator+4);
setPPS(annexBFormatted);
}
void AVCC::setPayload(std::string newPayload){
if ( !reserve(0, payloadSize(), newPayload.size())){
std::cerr << "Cannot allocate enough memory for payload" << std::endl;
@ -2518,8 +2532,9 @@ namespace MP4 {
r << std::string(indent + 1, ' ') << "ConfigDescriptorTypeLength: 0x" << std::hex << (int)getConfigDescriptorTypeLength() << std::dec << std::endl;
r << std::string(indent + 1, ' ') << "ESHeaderStartCodes: 0x";
for (unsigned int i = 0; i<getESHeaderStartCodes().size(); i++){
r << std::hex << (int)getESHeaderStartCodes()[i] << std::dec << ", ";
r << std::hex << std::setw(2) << std::setfill('0') << (int)getESHeaderStartCodes()[i] << std::dec;
}
r << std::endl;
r << std::string(indent + 1, ' ') << "SLConfigDescriptorTypeTag: 0x" << std::hex << (int)getSLConfigDescriptorTypeTag() << std::dec << std::endl;
r << std::string(indent + 1, ' ') << "SLConfigExtendedDescriptorTypeTag: 0x" << std::hex << (int)getSLConfigExtendedDescriptorTypeTag() << std::dec << std::endl;
r << std::string(indent + 1, ' ') << "SLDescriptorTypeLength: 0x" << std::hex << (int)getSLDescriptorTypeLength() << std::dec << std::endl;
@ -4259,22 +4274,25 @@ namespace MP4 {
Box & VisualSampleEntry::getCLAP(){
static Box ret = Box((char*)"\000\000\000\010erro", false);
if(payloadSize() <84){//if the EntryBox is not big enough to hold a CLAP/PASP
ret = Box((char*)"\000\000\000\010erro", false);
return ret;
}
return getBox(78);
ret = Box(getBox(78).asBox(), false);
return ret;
}
Box & VisualSampleEntry::getPASP(){
static Box ret = Box((char*)"\000\000\000\010erro", false);
if(payloadSize() <84){//if the EntryBox is not big enough to hold a CLAP/PASP
ret = Box((char*)"\000\000\000\010erro", false);
return ret;
}
if (payloadSize() < 78 + getBoxLen(78) + 8){
ret = Box((char*)"\000\000\000\010erro", false);
return ret;
}else{
return getBox(78+getBoxLen(78));
}
ret = Box(getBox(78 + getBoxLen(78)).asBox(), false);
return ret;
}
std::string VisualSampleEntry::toPrettyVisualString(uint32_t indent, std::string name){
@ -4339,6 +4357,14 @@ namespace MP4 {
uint32_t AudioSampleEntry::getSampleRate(){
return getInt32(24) >> 16;
}
uint16_t AudioSampleEntry::toAACInit(){
uint16_t result = 0;
result |= (2 & 0x1F) << 11;
result |= (getSampleRate() & 0x0F) << 7;
result |= (getChannelCount() & 0x0F) << 3;
return result;
}
void AudioSampleEntry::setCodecBox(Box& newBox){
setBox(newBox, 28);
@ -4356,7 +4382,7 @@ namespace MP4 {
r << std::string(indent + 1, ' ') << "SampleSize: " << getSampleSize() << std::endl;
r << std::string(indent + 1, ' ') << "PreDefined: " << getPreDefined() << std::endl;
r << std::string(indent + 1, ' ') << "SampleRate: " << getSampleRate() << std::endl;
r << getCodecBox().toPrettyString(indent + 1) << std::endl;
r << getCodecBox().toPrettyString(indent + 1);
return r.str();
}
@ -4447,13 +4473,9 @@ namespace MP4 {
r << std::string(indent, ' ') << "[stsd] Sample Description Box (" << boxedSize() << ")" << std::endl;
r << fullBox::toPrettyString(indent);
r << std::string(indent + 1, ' ') << "EntrySize: " << getEntryCount() << std::endl;
Box curBox;
int tempLoc = 0;
int contentCount = getEntryCount();
for (int i = 0; i < contentCount; i++){
curBox = getEntry(i);
for (int i = 0; i < getEntryCount(); i++){
Box curBox = Box(getEntry(i).asBox(), false);
r << curBox.toPrettyString(indent + 1);
tempLoc += getBoxLen(tempLoc);
}
return r.str();
}

View file

@ -9,6 +9,7 @@
#include <sstream>
#include <deque>
#include <algorithm>
#include <vector>
#include "json.h"
#include "dtsc.h"
@ -256,7 +257,7 @@ namespace MP4 {
uint32_t sampleDuration;
uint32_t sampleSize;
uint32_t sampleFlags;
uint32_t sampleOffset;
int32_t sampleOffset;
};
enum trunflags{
trundataOffset = 0x00000001,
@ -378,6 +379,7 @@ namespace MP4 {
uint32_t getPPSLen();
char* getPPS();
std::string asAnnexB();
void fromAnnexB(std::string annexBFormatted);
void setPayload(std::string newPayload);
std::string toPrettyString(uint32_t indent = 0);
};
@ -869,6 +871,7 @@ namespace MP4 {
uint16_t getPreDefined();
void setSampleRate(uint32_t newSampleRate);
uint32_t getSampleRate();
uint16_t toAACInit();
void setCodecBox(Box& newBox);
Box & getCodecBox();
std::string toPrettyAudioString(uint32_t indent = 0, std::string name = "");
@ -976,4 +979,3 @@ namespace MP4 {
};
}