RTMP bugfixorringz

This commit is contained in:
Thulinma 2011-04-16 23:39:22 +02:00
commit 7ef92f87b5
2 changed files with 13 additions and 6 deletions

View file

@ -53,6 +53,7 @@ int Connector_RTMP::Connector_RTMP(DDV::Socket conn){
while (RTMPStream::handshake_in.size() < 1537){
Socket.read(RTMPStream::handshake_in);
}
RTMPStream::rec_cnt += 1537;
if (RTMPStream::doHandshake()){
Socket.write(RTMPStream::handshake_out);
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 amfelem("empty", AMF::AMF0_DDV_CONTAINER);
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)){
//send ACK if we received a whole window
@ -172,6 +174,9 @@ void Connector_RTMP::parseChunk(){
switch (next.msg_type_id){
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
case 1://set chunk size
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 - videoaccess
// 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)
Connector_RTMP::ready4data = true;//start sending video data!
parsed = true;

View file

@ -249,15 +249,17 @@ std::string RTMPStream::SendUSR(unsigned char type, unsigned int data, unsigned
bool RTMPStream::Chunk::Parse(std::string & indata){
gettimeofday(&RTMPStream::lastrec, 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++];
//read the chunkstream ID properly
switch (chunktype & 0x3F){
case 0:
if (indata.size() < 2) return false;//need at least 2 bytes to continue
cs_id = indata[i++] + 64;
break;
case 1:
if (indata.size() < 3) return false;//need at least 3 bytes to continue
cs_id = indata[i++] + 64;
cs_id += indata[i++] * 256;
break;
@ -265,7 +267,7 @@ bool RTMPStream::Chunk::Parse(std::string & indata){
cs_id = chunktype & 0x3F;
break;
}
RTMPStream::Chunk prev = lastrecv[cs_id];
//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++];
}
//read data if length > 0, and allocate it
if (real_len > 0){
if (prev.len_left > 0){
@ -352,7 +354,7 @@ bool RTMPStream::Chunk::Parse(std::string & indata){
if (len_left == 0){
return true;
}else{
return false;
return Parse(indata);
}
}else{
data = "";