RTMP bugfixorringz
This commit is contained in:
commit
7ef92f87b5
2 changed files with 13 additions and 6 deletions
|
@ -53,6 +53,7 @@ int Connector_RTMP::Connector_RTMP(DDV::Socket conn){
|
||||||
while (RTMPStream::handshake_in.size() < 1537){
|
while (RTMPStream::handshake_in.size() < 1537){
|
||||||
Socket.read(RTMPStream::handshake_in);
|
Socket.read(RTMPStream::handshake_in);
|
||||||
}
|
}
|
||||||
|
RTMPStream::rec_cnt += 1537;
|
||||||
if (RTMPStream::doHandshake()){
|
if (RTMPStream::doHandshake()){
|
||||||
Socket.write(RTMPStream::handshake_out);
|
Socket.write(RTMPStream::handshake_out);
|
||||||
Socket.read((char*)RTMPStream::handshake_in.c_str(), 1536);
|
Socket.read((char*)RTMPStream::handshake_in.c_str(), 1536);
|
||||||
|
@ -161,7 +162,8 @@ void Connector_RTMP::parseChunk(){
|
||||||
static AMF::Object amfdata("empty", AMF::AMF0_DDV_CONTAINER);
|
static AMF::Object amfdata("empty", AMF::AMF0_DDV_CONTAINER);
|
||||||
static AMF::Object amfelem("empty", AMF::AMF0_DDV_CONTAINER);
|
static AMF::Object amfelem("empty", AMF::AMF0_DDV_CONTAINER);
|
||||||
if (!Connector_RTMP::Socket.read(inbuffer)){return;} //try to get more data
|
if (!Connector_RTMP::Socket.read(inbuffer)){return;} //try to get more data
|
||||||
|
|
||||||
|
fprintf(stderr, "Current buffer is %i long.\n", inbuffer.size());
|
||||||
while (next.Parse(inbuffer)){
|
while (next.Parse(inbuffer)){
|
||||||
|
|
||||||
//send ACK if we received a whole window
|
//send ACK if we received a whole window
|
||||||
|
@ -172,6 +174,9 @@ void Connector_RTMP::parseChunk(){
|
||||||
|
|
||||||
switch (next.msg_type_id){
|
switch (next.msg_type_id){
|
||||||
case 0://does not exist
|
case 0://does not exist
|
||||||
|
#if DEBUG >= 2
|
||||||
|
fprintf(stderr, "UNKN: Received a zero-type message. This is an error.\n");
|
||||||
|
#endif
|
||||||
break;//happens when connection breaks unexpectedly
|
break;//happens when connection breaks unexpectedly
|
||||||
case 1://set chunk size
|
case 1://set chunk size
|
||||||
RTMPStream::chunk_rec_max = ntohl(*(int*)next.data.c_str());
|
RTMPStream::chunk_rec_max = ntohl(*(int*)next.data.c_str());
|
||||||
|
@ -387,7 +392,7 @@ void Connector_RTMP::parseChunk(){
|
||||||
// amfreply.addContent(AMFType("", (double)1, 0x01));//bool true - audioaccess
|
// amfreply.addContent(AMFType("", (double)1, 0x01));//bool true - audioaccess
|
||||||
// amfreply.addContent(AMFType("", (double)1, 0x01));//bool true - videoaccess
|
// amfreply.addContent(AMFType("", (double)1, 0x01));//bool true - videoaccess
|
||||||
// SendChunk(4, 20, next.msg_stream_id, amfreply.Pack());
|
// SendChunk(4, 20, next.msg_stream_id, amfreply.Pack());
|
||||||
RTMPStream::chunk_snd_max = 1024*1024;
|
RTMPStream::chunk_snd_max = 65536;//1024*1024;
|
||||||
Socket.write(RTMPStream::SendCTL(1, RTMPStream::chunk_snd_max));//send chunk size max (msg 1)
|
Socket.write(RTMPStream::SendCTL(1, RTMPStream::chunk_snd_max));//send chunk size max (msg 1)
|
||||||
Connector_RTMP::ready4data = true;//start sending video data!
|
Connector_RTMP::ready4data = true;//start sending video data!
|
||||||
parsed = true;
|
parsed = true;
|
||||||
|
|
|
@ -249,15 +249,17 @@ std::string RTMPStream::SendUSR(unsigned char type, unsigned int data, unsigned
|
||||||
bool RTMPStream::Chunk::Parse(std::string & indata){
|
bool RTMPStream::Chunk::Parse(std::string & indata){
|
||||||
gettimeofday(&RTMPStream::lastrec, 0);
|
gettimeofday(&RTMPStream::lastrec, 0);
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
if (indata.size() < 3) return false;//need at least 3 bytes to continue
|
if (indata.size() < 1) return false;//need at least a byte
|
||||||
|
|
||||||
unsigned char chunktype = indata[i++];
|
unsigned char chunktype = indata[i++];
|
||||||
//read the chunkstream ID properly
|
//read the chunkstream ID properly
|
||||||
switch (chunktype & 0x3F){
|
switch (chunktype & 0x3F){
|
||||||
case 0:
|
case 0:
|
||||||
|
if (indata.size() < 2) return false;//need at least 2 bytes to continue
|
||||||
cs_id = indata[i++] + 64;
|
cs_id = indata[i++] + 64;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
|
if (indata.size() < 3) return false;//need at least 3 bytes to continue
|
||||||
cs_id = indata[i++] + 64;
|
cs_id = indata[i++] + 64;
|
||||||
cs_id += indata[i++] * 256;
|
cs_id += indata[i++] * 256;
|
||||||
break;
|
break;
|
||||||
|
@ -265,7 +267,7 @@ bool RTMPStream::Chunk::Parse(std::string & indata){
|
||||||
cs_id = chunktype & 0x3F;
|
cs_id = chunktype & 0x3F;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
RTMPStream::Chunk prev = lastrecv[cs_id];
|
RTMPStream::Chunk prev = lastrecv[cs_id];
|
||||||
|
|
||||||
//process the rest of the header, for each chunk type
|
//process the rest of the header, for each chunk type
|
||||||
|
@ -336,7 +338,7 @@ bool RTMPStream::Chunk::Parse(std::string & indata){
|
||||||
timestamp += indata[i++]*256;
|
timestamp += indata[i++]*256;
|
||||||
timestamp += indata[i++];
|
timestamp += indata[i++];
|
||||||
}
|
}
|
||||||
|
|
||||||
//read data if length > 0, and allocate it
|
//read data if length > 0, and allocate it
|
||||||
if (real_len > 0){
|
if (real_len > 0){
|
||||||
if (prev.len_left > 0){
|
if (prev.len_left > 0){
|
||||||
|
@ -352,7 +354,7 @@ bool RTMPStream::Chunk::Parse(std::string & indata){
|
||||||
if (len_left == 0){
|
if (len_left == 0){
|
||||||
return true;
|
return true;
|
||||||
}else{
|
}else{
|
||||||
return false;
|
return Parse(indata);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
data = "";
|
data = "";
|
||||||
|
|
Loading…
Add table
Reference in a new issue