interface
This commit is contained in:
commit
6d97f6fa25
5 changed files with 356 additions and 8 deletions
223
util/MP4/box.cpp
223
util/MP4/box.cpp
|
@ -46,7 +46,6 @@ class Box {
|
||||||
uint8_t * Payload;
|
uint8_t * Payload;
|
||||||
BoxHeader header;
|
BoxHeader header;
|
||||||
uint32_t PayloadSize;
|
uint32_t PayloadSize;
|
||||||
private:
|
|
||||||
};//Box Class
|
};//Box Class
|
||||||
|
|
||||||
Box::Box() {
|
Box::Box() {
|
||||||
|
@ -176,3 +175,225 @@ void Box::ResetPayload( ) {
|
||||||
Payload = NULL;
|
Payload = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Box::Parse( std::string PrintOffset ) {
|
||||||
|
if( header.BoxType == 0x61627374 ) {
|
||||||
|
uint8_t Version = Payload[0];
|
||||||
|
uint32_t Flags = (Payload[1] << 16) + (Payload[2] << 8) + (Payload[3]); //uint24_t
|
||||||
|
uint32_t BootstrapInfoVersion = (Payload[4] << 24) + (Payload[5] << 16) +(Payload[6] << 8) + (Payload[7]);
|
||||||
|
uint8_t Profile = (Payload[8] >> 6); //uint2_t
|
||||||
|
uint8_t Live = (( Payload[8] >> 5 ) & 0x1); //uint1_t
|
||||||
|
uint8_t Update = (( Payload[8] >> 4 ) & 0x1); //uint1_t
|
||||||
|
uint8_t Reserved = ( Payload[8] & 0x4); //uint4_t
|
||||||
|
uint32_t Timescale = (Payload[9] << 24) + (Payload[10] << 16) +(Payload[11] << 8) + (Payload[12]);
|
||||||
|
uint32_t CurrentMediaTime_Upperhalf = (Payload[13] << 24) + (Payload[14] << 16) +(Payload[15] << 8) + (Payload[16]);
|
||||||
|
uint32_t CurrentMediaTime_Lowerhalf = (Payload[17] << 24) + (Payload[18] << 16) +(Payload[19] << 8) + (Payload[20]);
|
||||||
|
uint32_t SmpteTimeCodeOffset_Upperhalf = (Payload[21] << 24) + (Payload[22] << 16) +(Payload[23] << 8) + (Payload[24]);
|
||||||
|
uint32_t SmpteTimeCodeOffset_Lowerhalf = (Payload[25] << 24) + (Payload[26] << 16) +(Payload[27] << 8) + (Payload[28]);
|
||||||
|
|
||||||
|
std::string MovieIdentifier;
|
||||||
|
uint8_t ServerEntryCount = -1;
|
||||||
|
std::vector<std::string> ServerEntryTable;
|
||||||
|
uint8_t QualityEntryCount = -1;
|
||||||
|
std::vector<std::string> QualityEntryTable;
|
||||||
|
std::string DrmData;
|
||||||
|
std::string MetaData;
|
||||||
|
uint8_t SegmentRunTableCount = -1;
|
||||||
|
std::vector<Box*> SegmentRunTableEntries;
|
||||||
|
uint8_t FragmentRunTableCount = -1;
|
||||||
|
std::vector<Box*> FragmentRunTableEntries;
|
||||||
|
|
||||||
|
uint32_t CurrentOffset = 29;
|
||||||
|
uint32_t TempSize;
|
||||||
|
Box* TempBox;
|
||||||
|
std::string temp;
|
||||||
|
while( Payload[CurrentOffset] != '\0' ) { MovieIdentifier += Payload[CurrentOffset]; CurrentOffset ++; }
|
||||||
|
CurrentOffset ++;
|
||||||
|
ServerEntryCount = Payload[CurrentOffset];
|
||||||
|
CurrentOffset ++;
|
||||||
|
for( uint8_t i = 0; i < ServerEntryCount; i++ ) {
|
||||||
|
temp = "";
|
||||||
|
while( Payload[CurrentOffset] != '\0' ) { temp += Payload[CurrentOffset]; CurrentOffset ++; }
|
||||||
|
ServerEntryTable.push_back(temp);
|
||||||
|
CurrentOffset++;
|
||||||
|
}
|
||||||
|
QualityEntryCount = Payload[CurrentOffset];
|
||||||
|
CurrentOffset ++;
|
||||||
|
for( uint8_t i = 0; i < QualityEntryCount; i++ ) {
|
||||||
|
temp = "";
|
||||||
|
while( Payload[CurrentOffset] != '\0' ) { temp += Payload[CurrentOffset]; CurrentOffset ++; }
|
||||||
|
QualityEntryTable.push_back(temp);
|
||||||
|
CurrentOffset++;
|
||||||
|
}
|
||||||
|
while( Payload[CurrentOffset] != '\0' ) { DrmData += Payload[CurrentOffset]; CurrentOffset ++; }
|
||||||
|
CurrentOffset ++;
|
||||||
|
while( Payload[CurrentOffset] != '\0' ) { MetaData += Payload[CurrentOffset]; CurrentOffset ++; }
|
||||||
|
CurrentOffset ++;
|
||||||
|
SegmentRunTableCount = Payload[CurrentOffset];
|
||||||
|
CurrentOffset ++;
|
||||||
|
for( uint8_t i = 0; i < SegmentRunTableCount; i++ ) {
|
||||||
|
TempSize = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1]<< 16) + (Payload[CurrentOffset+2]<< 8) + (Payload[CurrentOffset+3]);
|
||||||
|
TempBox = new Box( &Payload[CurrentOffset], TempSize );
|
||||||
|
SegmentRunTableEntries.push_back(TempBox);
|
||||||
|
CurrentOffset += TempSize;
|
||||||
|
}
|
||||||
|
FragmentRunTableCount = Payload[CurrentOffset];
|
||||||
|
CurrentOffset ++;
|
||||||
|
for( uint8_t i = 0; i < FragmentRunTableCount; i++ ) {
|
||||||
|
TempSize = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1]<< 16) + (Payload[CurrentOffset+2]<< 8) + (Payload[CurrentOffset+3]);
|
||||||
|
TempBox = new Box( &Payload[CurrentOffset], TempSize );
|
||||||
|
FragmentRunTableEntries.push_back(TempBox);
|
||||||
|
CurrentOffset += TempSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cerr << "Box_ABST:\n";
|
||||||
|
std::cerr << PrintOffset << " Version: " << (int)Version << "\n";
|
||||||
|
std::cerr << PrintOffset << " Flags: " << (int)Flags << "\n";
|
||||||
|
std::cerr << PrintOffset << " BootstrapInfoVersion: " << (int)BootstrapInfoVersion << "\n";
|
||||||
|
std::cerr << PrintOffset << " Profile: " << (int)Profile << "\n";
|
||||||
|
std::cerr << PrintOffset << " Live: " << (int)Live << "\n";
|
||||||
|
std::cerr << PrintOffset << " Update: " << (int)Update << "\n";
|
||||||
|
std::cerr << PrintOffset << " Reserved: " << (int)Reserved << "\n";
|
||||||
|
std::cerr << PrintOffset << " Timescale: " << (int)Timescale << "\n";
|
||||||
|
std::cerr << PrintOffset << " CurrentMediaTime: " << (int)CurrentMediaTime_Upperhalf << " " << CurrentMediaTime_Lowerhalf << "\n";
|
||||||
|
std::cerr << PrintOffset << " SmpteTimeCodeOffset: " << (int)SmpteTimeCodeOffset_Upperhalf << " " << SmpteTimeCodeOffset_Lowerhalf << "\n";
|
||||||
|
std::cerr << PrintOffset << " MovieIdentifier: " << MovieIdentifier << "\n";
|
||||||
|
std::cerr << PrintOffset << " ServerEntryCount: " << (int)ServerEntryCount << "\n";
|
||||||
|
std::cerr << PrintOffset << " ServerEntryTable:\n";
|
||||||
|
for( uint32_t i = 0; i < ServerEntryTable.size( ); i++ ) {
|
||||||
|
std::cerr << PrintOffset << " " << i+1 << ": " << ServerEntryTable[i] << "\n";
|
||||||
|
}
|
||||||
|
std::cerr << PrintOffset << " QualityEntryCount: " << (int)QualityEntryCount << "\n";
|
||||||
|
std::cerr << PrintOffset << " QualityEntryTable:\n";
|
||||||
|
for( uint32_t i = 0; i < QualityEntryTable.size( ); i++ ) {
|
||||||
|
std::cerr << PrintOffset << " " << i+1 << ": " << QualityEntryTable[i] << "\n";
|
||||||
|
}
|
||||||
|
std::cerr << PrintOffset << " DrmData: " << DrmData << "\n";
|
||||||
|
std::cerr << PrintOffset << " MetaData: " << MetaData << "\n";
|
||||||
|
std::cerr << PrintOffset << " SegmentRunTableCount: " << (int)SegmentRunTableCount << "\n";
|
||||||
|
std::cerr << PrintOffset << " SegmentRunTableEntries:\n";
|
||||||
|
for( uint32_t i = 0; i < SegmentRunTableEntries.size( ); i++ ) {
|
||||||
|
std::cerr << PrintOffset << " " << i+1 << ": ";
|
||||||
|
SegmentRunTableEntries[i]->Parse( PrintOffset+" ");
|
||||||
|
}
|
||||||
|
std::cerr << PrintOffset << " FragmentRunTableCount: " << (int)FragmentRunTableCount << "\n";
|
||||||
|
std::cerr << PrintOffset << " FragmentRunTableEntries:\n";
|
||||||
|
for( uint32_t i = 0; i < FragmentRunTableEntries.size( ); i++ ) {
|
||||||
|
std::cerr << PrintOffset << " " << i+1 << ": ";
|
||||||
|
FragmentRunTableEntries[i]->Parse( PrintOffset+" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if ( header.BoxType == 0x61737274 ) {
|
||||||
|
uint8_t Version = Payload[0];
|
||||||
|
uint32_t Flags = (Payload[1] << 16) + (Payload[2] << 8) + (Payload[3]); //uint24_t
|
||||||
|
uint8_t QualityEntryCount;
|
||||||
|
std::vector<std::string> QualitySegmentUrlModifiers;
|
||||||
|
uint32_t SegmentRunEntryCount;
|
||||||
|
std::vector< std::pair<uint32_t,uint32_t> > SegmentRunEntryTable;
|
||||||
|
|
||||||
|
uint32_t CurrentOffset = 4;
|
||||||
|
std::string temp;
|
||||||
|
std::pair<uint32_t,uint32_t> TempPair;
|
||||||
|
QualityEntryCount = Payload[CurrentOffset];
|
||||||
|
CurrentOffset ++;
|
||||||
|
for( uint8_t i = 0; i < QualityEntryCount; i++ ) {
|
||||||
|
temp = "";
|
||||||
|
while( Payload[CurrentOffset] != '\0' ) { temp += Payload[CurrentOffset]; CurrentOffset ++; }
|
||||||
|
QualitySegmentUrlModifiers.push_back(temp);
|
||||||
|
CurrentOffset++;
|
||||||
|
}
|
||||||
|
SegmentRunEntryCount = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2]) + (Payload[CurrentOffset+3]);
|
||||||
|
CurrentOffset +=4;
|
||||||
|
for( uint8_t i = 0; i < SegmentRunEntryCount; i++ ) {
|
||||||
|
TempPair.first = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2] << 8) + (Payload[CurrentOffset+3]);
|
||||||
|
CurrentOffset+=4;
|
||||||
|
TempPair.second = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2] << 8) + (Payload[CurrentOffset+3]);
|
||||||
|
CurrentOffset+=4;
|
||||||
|
SegmentRunEntryTable.push_back(TempPair);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cerr << "Box_ASRT:\n";
|
||||||
|
std::cerr << PrintOffset << " Version: " << (int)Version << "\n";
|
||||||
|
std::cerr << PrintOffset << " Flags: " << (int)Flags << "\n";
|
||||||
|
std::cerr << PrintOffset << " QualityEntryCount: " << (int)QualityEntryCount << "\n";
|
||||||
|
std::cerr << PrintOffset << " QualitySegmentUrlModifiers:\n";
|
||||||
|
for( uint32_t i = 0; i < QualitySegmentUrlModifiers.size( ); i++ ) {
|
||||||
|
std::cerr << PrintOffset << " " << i+1 << ": " << QualitySegmentUrlModifiers[i] << "\n";
|
||||||
|
}
|
||||||
|
std::cerr << PrintOffset << " SegmentRunEntryCount: " << (int)SegmentRunEntryCount << "\n";
|
||||||
|
std::cerr << PrintOffset << " SegmentRunEntryTable:\n";
|
||||||
|
for( uint32_t i = 0; i < SegmentRunEntryTable.size( ); i++ ) {
|
||||||
|
std::cerr << PrintOffset << " " << i+1 << ":\n";
|
||||||
|
std::cerr << PrintOffset << " FirstSegment: " << SegmentRunEntryTable[i].first << "\n";
|
||||||
|
std::cerr << PrintOffset << " FragmentsPerSegment: " << SegmentRunEntryTable[i].second << "\n";
|
||||||
|
}
|
||||||
|
} else if ( header.BoxType == 0x61667274 ) {
|
||||||
|
uint8_t Version = Payload[0];
|
||||||
|
uint32_t Flags = (Payload[1] << 16) + (Payload[2] << 8) + (Payload[3]); //uint24_t
|
||||||
|
uint32_t TimeScale = (Payload[4] << 24) + (Payload[5] << 16) + (Payload[6] << 8) + (Payload[7]);
|
||||||
|
uint8_t QualityEntryCount;
|
||||||
|
std::vector<std::string> QualitySegmentUrlModifiers;
|
||||||
|
uint32_t FragmentRunEntryCount;
|
||||||
|
std::vector<afrt_fragmentrunentry> FragmentRunEntryTable;
|
||||||
|
|
||||||
|
uint32_t CurrentOffset = 8;
|
||||||
|
std::string temp;
|
||||||
|
afrt_fragmentrunentry TempEntry;
|
||||||
|
QualityEntryCount = Payload[CurrentOffset];
|
||||||
|
CurrentOffset ++;
|
||||||
|
for( uint8_t i = 0; i < QualityEntryCount; i++ ) {
|
||||||
|
temp = "";
|
||||||
|
while( Payload[CurrentOffset] != '\0' ) { temp += Payload[CurrentOffset]; CurrentOffset ++; }
|
||||||
|
QualitySegmentUrlModifiers.push_back(temp);
|
||||||
|
CurrentOffset++;
|
||||||
|
}
|
||||||
|
FragmentRunEntryCount = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2]) + (Payload[CurrentOffset+3]);
|
||||||
|
CurrentOffset +=4;
|
||||||
|
for( uint8_t i = 0; i < FragmentRunEntryCount; i ++ ) {
|
||||||
|
TempEntry.FirstFragment = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2]) + (Payload[CurrentOffset+3]);
|
||||||
|
CurrentOffset +=4;
|
||||||
|
TempEntry.FirstFragmentTimestamp_Upperhalf = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2]) + (Payload[CurrentOffset+3]);
|
||||||
|
CurrentOffset +=4;
|
||||||
|
TempEntry.FirstFragmentTimestamp = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2]) + (Payload[CurrentOffset+3]);
|
||||||
|
CurrentOffset +=4;
|
||||||
|
TempEntry.FragmentDuration = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2]) + (Payload[CurrentOffset+3]);
|
||||||
|
CurrentOffset +=4;
|
||||||
|
if( TempEntry.FragmentDuration == 0 ) {
|
||||||
|
TempEntry.DiscontinuityIndicator = Payload[CurrentOffset];
|
||||||
|
CurrentOffset++;
|
||||||
|
}
|
||||||
|
FragmentRunEntryTable.push_back(TempEntry);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cerr << "Box_AFRT:\n";
|
||||||
|
std::cerr << PrintOffset << " Version: " << (int)Version << "\n";
|
||||||
|
std::cerr << PrintOffset << " Flags: " << (int)Flags << "\n";
|
||||||
|
std::cerr << PrintOffset << " Timescale: " << (int)TimeScale << "\n";
|
||||||
|
std::cerr << PrintOffset << " QualityEntryCount: " << (int)QualityEntryCount << "\n";
|
||||||
|
std::cerr << PrintOffset << " QualitySegmentUrlModifiers:\n";
|
||||||
|
for( uint32_t i = 0; i < QualitySegmentUrlModifiers.size( ); i++ ) {
|
||||||
|
std::cerr << PrintOffset << " " << i+1 << ": " << QualitySegmentUrlModifiers[i] << "\n";
|
||||||
|
}
|
||||||
|
std::cerr << PrintOffset << " FragmentRunEntryCount: " << (int)FragmentRunEntryCount << "\n";
|
||||||
|
std::cerr << PrintOffset << " FragmentRunEntryTable:\n";
|
||||||
|
for( uint32_t i = 0; i < FragmentRunEntryTable.size( ); i++ ) {
|
||||||
|
std::cerr << PrintOffset << " " << i+1 << ":\n";
|
||||||
|
std::cerr << PrintOffset << " FirstFragment: " << FragmentRunEntryTable[i].FirstFragment << "\n";
|
||||||
|
std::cerr << PrintOffset << " FirstFragmentTimestamp: " << FragmentRunEntryTable[i].FirstFragmentTimestamp_Upperhalf << FragmentRunEntryTable[i].FirstFragmentTimestamp << "\n";
|
||||||
|
std::cerr << PrintOffset << " FragmentDuration: " << FragmentRunEntryTable[i].FragmentDuration << "\n";
|
||||||
|
if( FragmentRunEntryTable[i].FragmentDuration == 0 ) {
|
||||||
|
std::cerr << PrintOffset << " DiscontinuityIndicator: " << (int)FragmentRunEntryTable[i].DiscontinuityIndicator << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if ( header.BoxType == 0x6D646174 ) {
|
||||||
|
std::cerr << "mdat box containing " << PayloadSize << " bytes of payload" << std::endl;
|
||||||
|
} else {
|
||||||
|
std::cerr << "BoxType '"
|
||||||
|
<< (char)(header.BoxType >> 24)
|
||||||
|
<< (char)((header.BoxType << 8) >> 24)
|
||||||
|
<< (char)((header.BoxType << 16) >> 24)
|
||||||
|
<< (char)((header.BoxType << 24) >> 24)
|
||||||
|
<< "' not yet implemented!\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -547,13 +547,13 @@ std::string Interface::GenerateLiveBootstrap( uint32_t CurMediaTime ) {
|
||||||
afrt->SetUpdate(false);
|
afrt->SetUpdate(false);
|
||||||
afrt->SetTimeScale( 1000 );
|
afrt->SetTimeScale( 1000 );
|
||||||
afrt->AddQualityEntry( "" );
|
afrt->AddQualityEntry( "" );
|
||||||
afrt->AddFragmentRunEntry( 1, 1 , 4000 );
|
afrt->AddFragmentRunEntry( 1, 1 , 4000 ); //FirstFragment, FirstFragmentTimestamp,Fragment Duration in milliseconds
|
||||||
afrt->WriteContent( );
|
afrt->WriteContent( );
|
||||||
|
|
||||||
//SetUpASRT
|
//SetUpASRT
|
||||||
asrt->SetUpdate(false);
|
asrt->SetUpdate(false);
|
||||||
asrt->AddQualityEntry( "" );
|
asrt->AddQualityEntry( "" );
|
||||||
asrt->AddSegmentRunEntry( 1, 199 );
|
asrt->AddSegmentRunEntry( 1, 199 );//1 Segment, 199 Fragments
|
||||||
asrt->WriteContent( );
|
asrt->WriteContent( );
|
||||||
|
|
||||||
//SetUpABST
|
//SetUpABST
|
||||||
|
@ -562,9 +562,9 @@ std::string Interface::GenerateLiveBootstrap( uint32_t CurMediaTime ) {
|
||||||
abst->SetLive( true );
|
abst->SetLive( true );
|
||||||
abst->SetUpdate( false );
|
abst->SetUpdate( false );
|
||||||
abst->SetTimeScale( 1000 );
|
abst->SetTimeScale( 1000 );
|
||||||
abst->SetMediaTime( 596458 );
|
abst->SetMediaTime( CurMediaTime );
|
||||||
abst->SetSMPTE( 0 );
|
abst->SetSMPTE( 0 );
|
||||||
abst->SetMovieIdentifier( "" );
|
abst->SetMovieIdentifier( "fifa" );
|
||||||
abst->SetDRM( "" );
|
abst->SetDRM( "" );
|
||||||
abst->SetMetaData( "" );
|
abst->SetMetaData( "" );
|
||||||
abst->AddServerEntry( "" );
|
abst->AddServerEntry( "" );
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#pragma once
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
|
90
util/flv_data.cpp
Normal file
90
util/flv_data.cpp
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
#include <unistd.h> //for read()
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
struct FLV_Pack {
|
||||||
|
int len;
|
||||||
|
int buf;
|
||||||
|
bool isKeyframe;
|
||||||
|
char * data;
|
||||||
|
};//FLV_Pack
|
||||||
|
|
||||||
|
char FLVHeader[13];
|
||||||
|
bool All_Hell_Broke_Loose = false;
|
||||||
|
|
||||||
|
//checks FLV Header for correctness
|
||||||
|
//returns true if everything is alright, false otherwise
|
||||||
|
bool FLV_Checkheader(char * header){
|
||||||
|
if (header[0] != 'F') return false;
|
||||||
|
if (header[1] != 'L') return false;
|
||||||
|
if (header[2] != 'V') return false;
|
||||||
|
if (header[8] != 0x09) return false;
|
||||||
|
if (header[9] != 0) return false;
|
||||||
|
if (header[10] != 0) return false;
|
||||||
|
if (header[11] != 0) return false;
|
||||||
|
if (header[12] != 0) return false;
|
||||||
|
return true;
|
||||||
|
}//FLV_Checkheader
|
||||||
|
|
||||||
|
//returns true if header is an FLV header
|
||||||
|
bool FLV_Isheader(char * header){
|
||||||
|
if (header[0] != 'F') return false;
|
||||||
|
if (header[1] != 'L') return false;
|
||||||
|
if (header[2] != 'V') return false;
|
||||||
|
return true;
|
||||||
|
}//FLV_Isheader
|
||||||
|
|
||||||
|
bool ReadUntil(char * buffer, unsigned int count, unsigned int & sofar, char * D, unsigned int S, unsigned int & P){
|
||||||
|
if (sofar >= count){return true;}
|
||||||
|
int r = 0;
|
||||||
|
if (P+(count-sofar) > S){r = S-P;}else{r = count-sofar;}
|
||||||
|
memcpy(buffer+sofar, D+P, r);
|
||||||
|
P += r;
|
||||||
|
sofar += r;
|
||||||
|
if (sofar >= count){return true;}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//gets a packet, storing in given FLV_Pack pointer.
|
||||||
|
//will assign pointer if null
|
||||||
|
//resizes FLV_Pack data field bigger if data doesn't fit
|
||||||
|
// (does not auto-shrink for speed!)
|
||||||
|
bool FLV_GetPacket(FLV_Pack *& p, char * D, unsigned int S, unsigned int & P){
|
||||||
|
static bool done = true;
|
||||||
|
static unsigned int sofar = 0;
|
||||||
|
if (!p){p = (FLV_Pack*)calloc(1, sizeof(FLV_Pack));}
|
||||||
|
if (p->buf < 15){p->data = (char*)realloc(p->data, 15000000); p->buf = 15000000;}
|
||||||
|
|
||||||
|
if (done){
|
||||||
|
//read a header
|
||||||
|
if (ReadUntil(p->data, 11, sofar, D, S, P)){
|
||||||
|
//if its a correct FLV header, throw away and read tag header
|
||||||
|
if (FLV_Isheader(p->data)){
|
||||||
|
if (ReadUntil(p->data, 13, sofar, D, S, P)){
|
||||||
|
if (FLV_Checkheader(p->data)){
|
||||||
|
sofar = 0;
|
||||||
|
memcpy(FLVHeader, p->data, 13);
|
||||||
|
}else{All_Hell_Broke_Loose = true;}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
//if a tag header, calculate length and read tag body
|
||||||
|
p->len = p->data[3] + 15;
|
||||||
|
p->len += (p->data[2] << 8);
|
||||||
|
p->len += (p->data[1] << 16);
|
||||||
|
//if (p->buf < p->len){p->data = (char*)realloc(p->data, p->len);p->buf = p->len;}
|
||||||
|
done = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
//read tag body
|
||||||
|
if (ReadUntil(p->data, p->len, sofar, D, S, P)){
|
||||||
|
//calculate keyframeness, next time read header again, return true
|
||||||
|
p->isKeyframe = false;
|
||||||
|
if ((p->data[0] == 0x09) && (((p->data[11] & 0xf0) >> 4) == 1)){p->isKeyframe = true;}
|
||||||
|
done = true;
|
||||||
|
sofar = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}//FLV_GetPacket
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
|
#pragma once
|
||||||
|
#include "ddv_socket.cpp"
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
class HTTPReader{
|
class HTTPReader{
|
||||||
public:
|
public:
|
||||||
HTTPReader();
|
HTTPReader();
|
||||||
bool ReadSocket(int CONN_fd);
|
bool ReadSocket(int CONN_fd);
|
||||||
|
bool ReadSocket(FILE * F);
|
||||||
std::string GetHeader(std::string i);
|
std::string GetHeader(std::string i);
|
||||||
std::string GetVar(std::string i);
|
std::string GetVar(std::string i);
|
||||||
void SetHeader(std::string i, std::string v);
|
void SetHeader(std::string i, std::string v);
|
||||||
|
@ -18,6 +22,8 @@ class HTTPReader{
|
||||||
void SendBodyPart(int conn, char * buffer, int len);
|
void SendBodyPart(int conn, char * buffer, int len);
|
||||||
void SendBodyPart(int conn, std::string bodypart);
|
void SendBodyPart(int conn, std::string bodypart);
|
||||||
void Clean();
|
void Clean();
|
||||||
|
bool CleanForNext();
|
||||||
|
std::string body;
|
||||||
std::string method;
|
std::string method;
|
||||||
std::string url;
|
std::string url;
|
||||||
std::string protocol;
|
std::string protocol;
|
||||||
|
@ -39,12 +45,26 @@ void HTTPReader::Clean(){
|
||||||
method = "GET";
|
method = "GET";
|
||||||
url = "/";
|
url = "/";
|
||||||
protocol = "HTTP/1.1";
|
protocol = "HTTP/1.1";
|
||||||
|
body = "";
|
||||||
length = 0;
|
length = 0;
|
||||||
HTTPbuffer = "";
|
HTTPbuffer = "";
|
||||||
headers.erase(headers.begin(), headers.end());
|
headers.erase(headers.begin(), headers.end());
|
||||||
vars.erase(vars.begin(), vars.end());
|
vars.erase(vars.begin(), vars.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HTTPReader::CleanForNext(){
|
||||||
|
seenHeaders = false;
|
||||||
|
seenReq = false;
|
||||||
|
method = "GET";
|
||||||
|
url = "/";
|
||||||
|
protocol = "HTTP/1.1";
|
||||||
|
body = "";
|
||||||
|
length = 0;
|
||||||
|
headers.erase(headers.begin(), headers.end());
|
||||||
|
vars.erase(vars.begin(), vars.end());
|
||||||
|
return parse();
|
||||||
|
}
|
||||||
|
|
||||||
std::string HTTPReader::BuildRequest(){
|
std::string HTTPReader::BuildRequest(){
|
||||||
std::map<std::string, std::string>::iterator it;
|
std::map<std::string, std::string>::iterator it;
|
||||||
std::string tmp = method+" "+url+" "+protocol+"\n";
|
std::string tmp = method+" "+url+" "+protocol+"\n";
|
||||||
|
@ -129,6 +149,16 @@ bool HTTPReader::ReadSocket(int CONN_fd){
|
||||||
return false;
|
return false;
|
||||||
}//HTTPReader::ReadSocket
|
}//HTTPReader::ReadSocket
|
||||||
|
|
||||||
|
bool HTTPReader::ReadSocket(FILE * F){
|
||||||
|
//returned true als hele http packet gelezen is
|
||||||
|
int b = 1;
|
||||||
|
char buffer[500];
|
||||||
|
while (b > 0){
|
||||||
|
b = fread(buffer, 1, 500, F);
|
||||||
|
HTTPbuffer.append(buffer, b);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}//HTTPReader::ReadSocket
|
||||||
|
|
||||||
bool HTTPReader::parse(){
|
bool HTTPReader::parse(){
|
||||||
size_t f;
|
size_t f;
|
||||||
|
@ -148,7 +178,7 @@ bool HTTPReader::parse(){
|
||||||
if (f != std::string::npos){url = tmpA.substr(0, f); tmpA.erase(0, f+1);}
|
if (f != std::string::npos){url = tmpA.substr(0, f); tmpA.erase(0, f+1);}
|
||||||
f = tmpA.find(' ');
|
f = tmpA.find(' ');
|
||||||
if (f != std::string::npos){protocol = tmpA.substr(0, f); tmpA.erase(0, f+1);}
|
if (f != std::string::npos){protocol = tmpA.substr(0, f); tmpA.erase(0, f+1);}
|
||||||
//TODO: GET variable parsing
|
//TODO: GET variable parsing?
|
||||||
}else{
|
}else{
|
||||||
if (tmpA.size() == 0){
|
if (tmpA.size() == 0){
|
||||||
seenHeaders = true;
|
seenHeaders = true;
|
||||||
|
@ -164,8 +194,14 @@ bool HTTPReader::parse(){
|
||||||
}
|
}
|
||||||
if (seenHeaders){
|
if (seenHeaders){
|
||||||
if (length > 0){
|
if (length > 0){
|
||||||
//TODO: POST variable parsing
|
//TODO: POST variable parsing?
|
||||||
return (HTTPbuffer.length() >= length);
|
if (HTTPbuffer.length() >= length){
|
||||||
|
body = HTTPbuffer.substr(0, length);
|
||||||
|
HTTPbuffer.erase(0, length);
|
||||||
|
return true;
|
||||||
|
}else{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}else{
|
}else{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue