Assorted fixes, improvements etc
This commit is contained in:
parent
06b5596b2a
commit
87d027817c
5 changed files with 103 additions and 35 deletions
15
lib/dtsc.cpp
15
lib/dtsc.cpp
|
@ -224,6 +224,9 @@ void DTSC::Stream::addPacket(JSON::Value & newPack){
|
||||||
while (buffers.count(newPos) > 0){
|
while (buffers.count(newPos) > 0){
|
||||||
newPos.seekTime++;
|
newPos.seekTime++;
|
||||||
}
|
}
|
||||||
|
while (buffercount == 1 && buffers.size() > 0){
|
||||||
|
cutOneBuffer();
|
||||||
|
}
|
||||||
buffers[newPos] = newPack;
|
buffers[newPos] = newPack;
|
||||||
datapointertype = INVALID;
|
datapointertype = INVALID;
|
||||||
std::string tmp = "";
|
std::string tmp = "";
|
||||||
|
@ -262,9 +265,6 @@ void DTSC::Stream::addPacket(JSON::Value & newPack){
|
||||||
metadata.bufferWindow = buffertime;
|
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.
|
/// 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;
|
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){
|
void DTSC::File::writePacket(std::string & newPacket){
|
||||||
fseek(F, 0, SEEK_END);
|
fseek(F, 0, SEEK_END);
|
||||||
fwrite(newPacket.c_str(), newPacket.size(), 1, F); //write contents
|
fwrite(newPacket.c_str(), newPacket.size(), 1, F); //write contents
|
||||||
|
|
|
@ -209,11 +209,11 @@ namespace DTSC {
|
||||||
Track::Track(JSON::Value & trackRef){
|
Track::Track(JSON::Value & trackRef){
|
||||||
if (trackRef.isMember("fragments") && trackRef["fragments"].isString()){
|
if (trackRef.isMember("fragments") && trackRef["fragments"].isString()){
|
||||||
Fragment* tmp = (Fragment*)trackRef["fragments"].asString().data();
|
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()){
|
if (trackRef.isMember("keys") && trackRef["keys"].isString()){
|
||||||
Key* tmp = (Key*)trackRef["keys"].asString().data();
|
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()){
|
if (trackRef.isMember("parts") && trackRef["parts"].isString()){
|
||||||
Part* tmp = (Part*)trackRef["parts"].asString().data();
|
Part* tmp = (Part*)trackRef["parts"].asString().data();
|
||||||
|
@ -277,7 +277,7 @@ namespace DTSC {
|
||||||
}
|
}
|
||||||
keys.push_back(newKey);
|
keys.push_back(newKey);
|
||||||
firstms = keys[0].getTime();
|
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
|
//new fragment
|
||||||
Fragment newFrag;
|
Fragment newFrag;
|
||||||
newFrag.setDuration(0);
|
newFrag.setDuration(0);
|
||||||
|
@ -342,6 +342,7 @@ namespace DTSC {
|
||||||
readOnlyMeta::readOnlyMeta(){
|
readOnlyMeta::readOnlyMeta(){
|
||||||
vod = false;
|
vod = false;
|
||||||
live = false;
|
live = false;
|
||||||
|
merged = false;
|
||||||
moreheader = 0;
|
moreheader = 0;
|
||||||
merged = false;
|
merged = false;
|
||||||
bufferWindow = 0;
|
bufferWindow = 0;
|
||||||
|
|
34
lib/json.h
34
lib/json.h
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
76
lib/mp4.cpp
76
lib/mp4.cpp
|
@ -244,7 +244,8 @@ namespace MP4 {
|
||||||
case 0x73747364:
|
case 0x73747364:
|
||||||
return ((STSD*)this)->toPrettyString(indent);
|
return ((STSD*)this)->toPrettyString(indent);
|
||||||
break;
|
break;
|
||||||
case 0x6D703461:
|
case 0x6D703461://mp4a
|
||||||
|
case 0x656E6361://enca
|
||||||
return ((MP4A*)this)->toPrettyString(indent);
|
return ((MP4A*)this)->toPrettyString(indent);
|
||||||
break;
|
break;
|
||||||
case 0x61616320:
|
case 0x61616320:
|
||||||
|
@ -253,7 +254,8 @@ namespace MP4 {
|
||||||
case 0x61766331:
|
case 0x61766331:
|
||||||
return ((AVC1*)this)->toPrettyString(indent);
|
return ((AVC1*)this)->toPrettyString(indent);
|
||||||
break;
|
break;
|
||||||
case 0x68323634:
|
case 0x68323634://h264
|
||||||
|
case 0x656E6376://encv
|
||||||
return ((H264*)this)->toPrettyString(indent);
|
return ((H264*)this)->toPrettyString(indent);
|
||||||
break;
|
break;
|
||||||
case 0x65647473:
|
case 0x65647473:
|
||||||
|
@ -493,7 +495,7 @@ namespace MP4 {
|
||||||
/// Will attempt to resize if out of range.
|
/// Will attempt to resize if out of range.
|
||||||
/// Returns an 8-byte error box if resizing failed.
|
/// Returns an 8-byte error box if resizing failed.
|
||||||
Box & Box::getBox(size_t index){
|
Box & Box::getBox(size_t index){
|
||||||
static Box retbox;
|
static Box retbox = Box((char*)"\000\000\000\010erro", false);
|
||||||
index += payloadOffset;
|
index += payloadOffset;
|
||||||
if (index + 8 > boxedSize()){
|
if (index + 8 > boxedSize()){
|
||||||
if ( !reserve(index, 0, 8)){
|
if ( !reserve(index, 0, 8)){
|
||||||
|
@ -510,7 +512,7 @@ namespace MP4 {
|
||||||
/// Returns undefined values if there is no box at the given position.
|
/// Returns undefined values if there is no box at the given position.
|
||||||
/// Returns 0 if out of range.
|
/// Returns 0 if out of range.
|
||||||
size_t Box::getBoxLen(size_t index){
|
size_t Box::getBoxLen(size_t index){
|
||||||
if (index + payloadOffset + 8 > boxedSize()){
|
if ((index + payloadOffset + 8) > boxedSize()){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return getBox(index).boxedSize();
|
return getBox(index).boxedSize();
|
||||||
|
@ -600,7 +602,7 @@ namespace MP4 {
|
||||||
int tempLoc = 0;
|
int tempLoc = 0;
|
||||||
while (tempLoc < boxedSize() - 8){
|
while (tempLoc < boxedSize() - 8){
|
||||||
res++;
|
res++;
|
||||||
tempLoc += getBoxLen(tempLoc);
|
tempLoc += Box(getBox(tempLoc).asBox(), false).boxedSize();
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -640,13 +642,9 @@ namespace MP4 {
|
||||||
std::string containerBox::toPrettyContainerString(uint32_t indent, std::string boxName){
|
std::string containerBox::toPrettyContainerString(uint32_t indent, std::string boxName){
|
||||||
std::stringstream r;
|
std::stringstream r;
|
||||||
r << std::string(indent, ' ') << boxName <<" (" << boxedSize() << ")" << std::endl;
|
r << std::string(indent, ' ') << boxName <<" (" << boxedSize() << ")" << std::endl;
|
||||||
Box curBox;
|
for (int i = 0; i < getContentCount(); i++){
|
||||||
int tempLoc = 0;
|
Box curBox = MP4::Box(getContent(i).asBox(), false);
|
||||||
int contentCount = getContentCount();
|
|
||||||
for (int i = 0; i < contentCount; i++){
|
|
||||||
curBox = getContent(i);
|
|
||||||
r << curBox.toPrettyString(indent + 1);
|
r << curBox.toPrettyString(indent + 1);
|
||||||
tempLoc += getBoxLen(tempLoc);
|
|
||||||
}
|
}
|
||||||
return r.str();
|
return r.str();
|
||||||
}
|
}
|
||||||
|
@ -1508,13 +1506,10 @@ namespace MP4 {
|
||||||
std::string TRAF::toPrettyString(uint32_t indent){
|
std::string TRAF::toPrettyString(uint32_t indent){
|
||||||
std::stringstream r;
|
std::stringstream r;
|
||||||
r << std::string(indent, ' ') << "[traf] Track Fragment Box (" << boxedSize() << ")" << std::endl;
|
r << std::string(indent, ' ') << "[traf] Track Fragment Box (" << boxedSize() << ")" << std::endl;
|
||||||
Box curBox;
|
|
||||||
int tempLoc = 0;
|
|
||||||
int contentCount = getContentCount();
|
int contentCount = getContentCount();
|
||||||
for (int i = 0; i < contentCount; i++){
|
for (int i = 0; i < contentCount; i++){
|
||||||
curBox = getContent(i);
|
Box curBox = Box(getContent(i).asBox(),false);
|
||||||
r << curBox.toPrettyString(indent + 1);
|
r << curBox.toPrettyString(indent + 1);
|
||||||
tempLoc += curBox.boxedSize();
|
|
||||||
}
|
}
|
||||||
return r.str();
|
return r.str();
|
||||||
}
|
}
|
||||||
|
@ -2274,6 +2269,25 @@ namespace MP4 {
|
||||||
return r.str();
|
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){
|
void AVCC::setPayload(std::string newPayload){
|
||||||
if ( !reserve(0, payloadSize(), newPayload.size())){
|
if ( !reserve(0, payloadSize(), newPayload.size())){
|
||||||
std::cerr << "Cannot allocate enough memory for payload" << std::endl;
|
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, ' ') << "ConfigDescriptorTypeLength: 0x" << std::hex << (int)getConfigDescriptorTypeLength() << std::dec << std::endl;
|
||||||
r << std::string(indent + 1, ' ') << "ESHeaderStartCodes: 0x";
|
r << std::string(indent + 1, ' ') << "ESHeaderStartCodes: 0x";
|
||||||
for (unsigned int i = 0; i<getESHeaderStartCodes().size(); i++){
|
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, ' ') << "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, ' ') << "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;
|
r << std::string(indent + 1, ' ') << "SLDescriptorTypeLength: 0x" << std::hex << (int)getSLDescriptorTypeLength() << std::dec << std::endl;
|
||||||
|
@ -4259,22 +4274,25 @@ namespace MP4 {
|
||||||
Box & VisualSampleEntry::getCLAP(){
|
Box & VisualSampleEntry::getCLAP(){
|
||||||
static Box ret = Box((char*)"\000\000\000\010erro", false);
|
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
|
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 ret;
|
||||||
}
|
}
|
||||||
return getBox(78);
|
ret = Box(getBox(78).asBox(), false);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
Box & VisualSampleEntry::getPASP(){
|
Box & VisualSampleEntry::getPASP(){
|
||||||
static Box ret = Box((char*)"\000\000\000\010erro", false);
|
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
|
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 ret;
|
||||||
}
|
}
|
||||||
if (payloadSize() < 78 + getBoxLen(78) + 8){
|
if (payloadSize() < 78 + getBoxLen(78) + 8){
|
||||||
|
ret = Box((char*)"\000\000\000\010erro", false);
|
||||||
return ret;
|
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){
|
std::string VisualSampleEntry::toPrettyVisualString(uint32_t indent, std::string name){
|
||||||
|
@ -4339,6 +4357,14 @@ namespace MP4 {
|
||||||
uint32_t AudioSampleEntry::getSampleRate(){
|
uint32_t AudioSampleEntry::getSampleRate(){
|
||||||
return getInt32(24) >> 16;
|
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){
|
void AudioSampleEntry::setCodecBox(Box& newBox){
|
||||||
setBox(newBox, 28);
|
setBox(newBox, 28);
|
||||||
|
@ -4356,7 +4382,7 @@ namespace MP4 {
|
||||||
r << std::string(indent + 1, ' ') << "SampleSize: " << getSampleSize() << std::endl;
|
r << std::string(indent + 1, ' ') << "SampleSize: " << getSampleSize() << std::endl;
|
||||||
r << std::string(indent + 1, ' ') << "PreDefined: " << getPreDefined() << std::endl;
|
r << std::string(indent + 1, ' ') << "PreDefined: " << getPreDefined() << std::endl;
|
||||||
r << std::string(indent + 1, ' ') << "SampleRate: " << getSampleRate() << 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();
|
return r.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4447,13 +4473,9 @@ namespace MP4 {
|
||||||
r << std::string(indent, ' ') << "[stsd] Sample Description Box (" << boxedSize() << ")" << std::endl;
|
r << std::string(indent, ' ') << "[stsd] Sample Description Box (" << boxedSize() << ")" << std::endl;
|
||||||
r << fullBox::toPrettyString(indent);
|
r << fullBox::toPrettyString(indent);
|
||||||
r << std::string(indent + 1, ' ') << "EntrySize: " << getEntryCount() << std::endl;
|
r << std::string(indent + 1, ' ') << "EntrySize: " << getEntryCount() << std::endl;
|
||||||
Box curBox;
|
for (int i = 0; i < getEntryCount(); i++){
|
||||||
int tempLoc = 0;
|
Box curBox = Box(getEntry(i).asBox(), false);
|
||||||
int contentCount = getEntryCount();
|
|
||||||
for (int i = 0; i < contentCount; i++){
|
|
||||||
curBox = getEntry(i);
|
|
||||||
r << curBox.toPrettyString(indent + 1);
|
r << curBox.toPrettyString(indent + 1);
|
||||||
tempLoc += getBoxLen(tempLoc);
|
|
||||||
}
|
}
|
||||||
return r.str();
|
return r.str();
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <vector>
|
||||||
#include "json.h"
|
#include "json.h"
|
||||||
#include "dtsc.h"
|
#include "dtsc.h"
|
||||||
|
|
||||||
|
@ -256,7 +257,7 @@ namespace MP4 {
|
||||||
uint32_t sampleDuration;
|
uint32_t sampleDuration;
|
||||||
uint32_t sampleSize;
|
uint32_t sampleSize;
|
||||||
uint32_t sampleFlags;
|
uint32_t sampleFlags;
|
||||||
uint32_t sampleOffset;
|
int32_t sampleOffset;
|
||||||
};
|
};
|
||||||
enum trunflags{
|
enum trunflags{
|
||||||
trundataOffset = 0x00000001,
|
trundataOffset = 0x00000001,
|
||||||
|
@ -378,6 +379,7 @@ namespace MP4 {
|
||||||
uint32_t getPPSLen();
|
uint32_t getPPSLen();
|
||||||
char* getPPS();
|
char* getPPS();
|
||||||
std::string asAnnexB();
|
std::string asAnnexB();
|
||||||
|
void fromAnnexB(std::string annexBFormatted);
|
||||||
void setPayload(std::string newPayload);
|
void setPayload(std::string newPayload);
|
||||||
std::string toPrettyString(uint32_t indent = 0);
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
};
|
};
|
||||||
|
@ -869,6 +871,7 @@ namespace MP4 {
|
||||||
uint16_t getPreDefined();
|
uint16_t getPreDefined();
|
||||||
void setSampleRate(uint32_t newSampleRate);
|
void setSampleRate(uint32_t newSampleRate);
|
||||||
uint32_t getSampleRate();
|
uint32_t getSampleRate();
|
||||||
|
uint16_t toAACInit();
|
||||||
void setCodecBox(Box& newBox);
|
void setCodecBox(Box& newBox);
|
||||||
Box & getCodecBox();
|
Box & getCodecBox();
|
||||||
std::string toPrettyAudioString(uint32_t indent = 0, std::string name = "");
|
std::string toPrettyAudioString(uint32_t indent = 0, std::string name = "");
|
||||||
|
@ -976,4 +979,3 @@ namespace MP4 {
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue