45 lines
1.3 KiB
C++
45 lines
1.3 KiB
C++
#include "analyser_mp4.h"
|
|
|
|
void AnalyserMP4::init(Util::Config &conf){
|
|
Analyser::init(conf);
|
|
}
|
|
|
|
AnalyserMP4::AnalyserMP4(Util::Config &conf) : Analyser(conf){
|
|
curPos = prePos = 0;
|
|
}
|
|
|
|
bool AnalyserMP4::parsePacket(){
|
|
prePos = curPos;
|
|
// Read in smart bursts until we have enough data
|
|
while (isOpen() && mp4Buffer.size() < neededBytes()){
|
|
uint64_t needed = neededBytes();
|
|
mp4Buffer.reserve(needed);
|
|
for (uint64_t i = mp4Buffer.size(); i < needed; ++i){
|
|
mp4Buffer += std::cin.get();
|
|
++curPos;
|
|
if (!std::cin.good()){mp4Buffer.erase(mp4Buffer.size() - 1, 1);}
|
|
}
|
|
}
|
|
|
|
if (mp4Data.read(mp4Buffer)){
|
|
INFO_MSG("Read a box at position %d", prePos);
|
|
if (detail >= 2){std::cout << mp4Data.toPrettyString(0) << std::endl;}
|
|
///\TODO update mediaTime with the current timestamp
|
|
return true;
|
|
}
|
|
FAIL_MSG("Could not read box at position %llu", prePos);
|
|
return false;
|
|
}
|
|
|
|
/// Calculates how many bytes we need to read a whole box.
|
|
uint64_t AnalyserMP4::neededBytes(){
|
|
if (mp4Buffer.size() < 4){return 4;}
|
|
uint64_t size = ntohl(((int *)mp4Buffer.data())[0]);
|
|
if (size != 1){return size;}
|
|
if (mp4Buffer.size() < 16){return 16;}
|
|
size = 0 + ntohl(((int *)mp4Buffer.data())[2]);
|
|
size <<= 32;
|
|
size += ntohl(((int *)mp4Buffer.data())[3]);
|
|
return size;
|
|
}
|
|
|