Some edits to FLV parsing and RTMP fixes... not quite working yet (in Flash player, that is...)
This commit is contained in:
parent
ba61ce2cef
commit
e2138e2167
3 changed files with 49 additions and 23 deletions
|
@ -34,11 +34,8 @@ namespace Connector_RTMP{
|
||||||
/// Main Connector_RTMP function
|
/// Main Connector_RTMP function
|
||||||
int Connector_RTMP::Connector_RTMP(Socket::Connection conn){
|
int Connector_RTMP::Connector_RTMP(Socket::Connection conn){
|
||||||
Socket = conn;
|
Socket = conn;
|
||||||
unsigned int ts;
|
|
||||||
unsigned int fts = 0;
|
|
||||||
unsigned int ftst;
|
|
||||||
Socket::Connection SS;
|
Socket::Connection SS;
|
||||||
FLV::Tag tag;
|
FLV::Tag tag, viddata, auddata;
|
||||||
|
|
||||||
//first timestamp set
|
//first timestamp set
|
||||||
RTMPStream::firsttime = RTMPStream::getNowMS();
|
RTMPStream::firsttime = RTMPStream::getNowMS();
|
||||||
|
@ -111,19 +108,26 @@ int Connector_RTMP::Connector_RTMP(Socket::Connection conn){
|
||||||
case 0: break;//not ready yet
|
case 0: break;//not ready yet
|
||||||
default:
|
default:
|
||||||
if (tag.SockLoader(SS)){//able to read a full packet?
|
if (tag.SockLoader(SS)){//able to read a full packet?
|
||||||
ts = tag.tagTime();
|
//init data? parse and resent in correct order if all is received
|
||||||
if (ts != 0){
|
if (((tag.data[0] == 0x09) && (viddata.len == 0)) || ((tag.data[0] == 0x08) && (auddata.len == 0))){
|
||||||
if (fts == 0){fts = ts;ftst = RTMPStream::getNowMS();}
|
if (tag.data[0] == 0x09){viddata = tag;}else{auddata = tag;}
|
||||||
ts -= fts;
|
if ((auddata.len != 0) && (viddata.len != 0)){
|
||||||
tag.tagTime(ts);
|
Socket.write(RTMPStream::SendMedia((unsigned char)viddata.data[0], (unsigned char *)viddata.data+11, viddata.len-15, 0));
|
||||||
ts += ftst;
|
Socket.write(RTMPStream::SendMedia((unsigned char)auddata.data[0], (unsigned char *)auddata.data+11, auddata.len-15, 0));
|
||||||
}else{
|
#if DEBUG >= 8
|
||||||
ftst = RTMPStream::getNowMS();
|
fprintf(stderr, "Sent tag to %i: [%u] %s\n", Socket.getSocket(), viddata.tagTime(), viddata.tagType().c_str());
|
||||||
tag.tagTime(ftst);
|
fprintf(stderr, "Sent tag to %i: [%u] %s\n", Socket.getSocket(), auddata.tagTime(), auddata.tagType().c_str());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
Socket.write(RTMPStream::SendMedia((unsigned char)tag.data[0], (unsigned char *)tag.data+11, tag.len-15, ts));
|
/// \TODO Check metadata for needed init or not - we now assume init needed, which only works for AAC / H264...
|
||||||
#if DEBUG >= 4
|
//not gotten init yet? cancel this tag
|
||||||
fprintf(stderr, "Sent a tag to %i\n", Socket.getSocket());
|
if (viddata.len == 0 || auddata.len == 0){break;}
|
||||||
|
//send tag normally
|
||||||
|
Socket.write(RTMPStream::SendMedia((unsigned char)tag.data[0], (unsigned char *)tag.data+11, tag.len-15, tag.tagTime()));
|
||||||
|
#if DEBUG >= 8
|
||||||
|
fprintf(stderr, "Sent tag to %i: [%u] %s\n", Socket.getSocket(), tag.tagTime(), tag.tagType().c_str());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -276,7 +280,7 @@ void Connector_RTMP::parseChunk(){
|
||||||
if (tmpint & 0x80){fprintf(stderr, "H264 video support detected\n");}
|
if (tmpint & 0x80){fprintf(stderr, "H264 video support detected\n");}
|
||||||
tmpint = (int)amfdata.getContentP(2)->getContentP("audioCodecs")->NumValue();
|
tmpint = (int)amfdata.getContentP(2)->getContentP("audioCodecs")->NumValue();
|
||||||
if (tmpint & 0x04){fprintf(stderr, "MP3 audio support detected\n");}
|
if (tmpint & 0x04){fprintf(stderr, "MP3 audio support detected\n");}
|
||||||
if (tmpint & 0x400){fprintf(stderr, "AAC video support detected\n");}
|
if (tmpint & 0x400){fprintf(stderr, "AAC audio support detected\n");}
|
||||||
#endif
|
#endif
|
||||||
Socket.write(RTMPStream::SendCTL(5, RTMPStream::snd_window_size));//send window acknowledgement size (msg 5)
|
Socket.write(RTMPStream::SendCTL(5, RTMPStream::snd_window_size));//send window acknowledgement size (msg 5)
|
||||||
Socket.write(RTMPStream::SendCTL(6, RTMPStream::rec_window_size));//send window acknowledgement size (msg 5)
|
Socket.write(RTMPStream::SendCTL(6, RTMPStream::rec_window_size));//send window acknowledgement size (msg 5)
|
||||||
|
|
|
@ -43,6 +43,27 @@ bool FLV::is_header(char * header){
|
||||||
return true;
|
return true;
|
||||||
}//FLV::is_header
|
}//FLV::is_header
|
||||||
|
|
||||||
|
/// True if current tag is init data for this media type.
|
||||||
|
bool FLV::Tag::isInitData(){
|
||||||
|
switch (data[0]){
|
||||||
|
case 0x09:
|
||||||
|
switch (data[11] & 0xF0){
|
||||||
|
case 0x50: return true; break;
|
||||||
|
}
|
||||||
|
if ((data[11] & 0x0F) == 7){
|
||||||
|
switch (data[12]){
|
||||||
|
case 0: return true; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x08:
|
||||||
|
if ((data[12] == 0) && ((data[11] & 0xF0) == 0xA0)){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns a std::string describing the tag in detail.
|
/// Returns a std::string describing the tag in detail.
|
||||||
/// The string includes information about whether the tag is
|
/// The string includes information about whether the tag is
|
||||||
|
|
|
@ -22,6 +22,7 @@ namespace FLV {
|
||||||
int len; ///< Actual length of tag.
|
int len; ///< Actual length of tag.
|
||||||
bool isKeyframe; ///< True if current tag is a video keyframe.
|
bool isKeyframe; ///< True if current tag is a video keyframe.
|
||||||
char * data; ///< Pointer to tag buffer.
|
char * data; ///< Pointer to tag buffer.
|
||||||
|
bool isInitData(); ///< True if current tag is init data for this media type.
|
||||||
std::string tagType(); ///< Returns a std::string describing the tag in detail.
|
std::string tagType(); ///< Returns a std::string describing the tag in detail.
|
||||||
unsigned int tagTime(); ///< Returns the 32-bit timestamp of this tag.
|
unsigned int tagTime(); ///< Returns the 32-bit timestamp of this tag.
|
||||||
void tagTime(unsigned int T); ///< Sets the 32-bit timestamp of this tag.
|
void tagTime(unsigned int T); ///< Sets the 32-bit timestamp of this tag.
|
||||||
|
|
Loading…
Add table
Reference in a new issue