Attempt to fix FLV

This commit is contained in:
Thulinma 2011-09-15 18:48:57 +02:00
parent 63bf65952b
commit 68e4697a29
2 changed files with 22 additions and 12 deletions

View file

@ -319,7 +319,7 @@ bool FLV::Tag::DTSCLoader(DTSC::Stream & S){
default: break;
}
}
((unsigned int *)(data+len-4))[0] = len-15;
setLen();
switch (S.lastType()){
case DTSC::VIDEO: data[0] = 0x09; break;
case DTSC::AUDIO: data[0] = 0x08; break;
@ -333,6 +333,19 @@ bool FLV::Tag::DTSCLoader(DTSC::Stream & S){
return true;
}
/// Helper function that properly sets the tag length from the internal len variable.
void FLV::Tag::setLen(){
int len4 = len - 4;
int i = data+len-1;
data[--i] = (len4) & 0xFF;
len4 >>= 8;
data[--i] = (len4) & 0xFF;
len4 >>= 8;
data[--i] = (len4) & 0xFF;
len4 >>= 8;
data[--i] = (len4) & 0xFF;
}
/// FLV Video init data loader function from DTSC.
/// Takes the DTSC Video init data and makes it into FLV.
/// Assumes init data is available - so check before calling!
@ -355,15 +368,10 @@ bool FLV::Tag::DTSCVideoInit(DTSC::Stream & S){
data[13] = 0;
data[14] = 0;
data[15] = 0;
data[11] = 0x57;//H264 init data (0x07 & 0x50)
}
((unsigned int *)(data+len-4))[0] = len-15;
switch (S.lastType()){
case DTSC::VIDEO: data[0] = 0x09; break;
case DTSC::AUDIO: data[0] = 0x08; break;
case DTSC::META: data[0] = 0x12; break;
default: break;
data[11] = 0x17;//H264 keyframe (0x07 & 0x10)
}
setLen();
data[0] = 0x09;
data[1] = ((len-15) >> 16) & 0xFF;
data[2] = ((len-15) >> 8) & 0xFF;
data[3] = (len-15) & 0xFF;
@ -400,13 +408,14 @@ bool FLV::Tag::DTSCAudioInit(DTSC::Stream & S){
if (S.metadata.getContentP("audio")->getContentP("size")->NumValue() == 16){data[11] += 0x02;}
if (S.metadata.getContentP("audio")->getContentP("channels")->NumValue() > 1){data[11] += 0x01;}
}
((unsigned int *)(data+len-4))[0] = len-15;
setLen();
switch (S.lastType()){
case DTSC::VIDEO: data[0] = 0x09; break;
case DTSC::AUDIO: data[0] = 0x08; break;
case DTSC::META: data[0] = 0x12; break;
default: break;
}
data[0] = 0x08;
data[1] = ((len-15) >> 16) & 0xFF;
data[2] = ((len-15) >> 8) & 0xFF;
data[3] = (len-15) & 0xFF;
@ -487,7 +496,7 @@ bool FLV::Tag::DTSCMetaInit(DTSC::Stream & S){
}
memcpy(data+11, tmp.c_str(), len-15);
}
((unsigned int *)(data+len-4))[0] = len-15;
setLen();
data[0] = 0x12;
data[1] = ((len-15) >> 16) & 0xFF;
data[2] = ((len-15) >> 8) & 0xFF;
@ -512,7 +521,7 @@ bool FLV::Tag::ChunkLoader(const RTMPStream::Chunk& O){
}
memcpy(data+11, &(O.data[0]), O.len);
}
((unsigned int *)(data+len-4))[0] = O.len;
setLen();
data[0] = O.msg_type_id;
data[3] = O.len & 0xFF;
data[2] = (O.len >> 8) & 0xFF;

View file

@ -51,6 +51,7 @@ namespace FLV {
int buf; ///< Maximum length of buffer space.
bool done; ///< Body reading done?
unsigned int sofar; ///< How many bytes are read sofar?
void setLen();
//loader helper functions
bool MemReadUntil(char * buffer, unsigned int count, unsigned int & sofar, char * D, unsigned int S, unsigned int & P);
bool SockReadUntil(char * buffer, unsigned int count, unsigned int & sofar, Socket::Connection & sock);