Attempts at fixing timestamp issues, improved FLV/RTMP cooperatibility, fixed several bugs

This commit is contained in:
Thulinma 2011-08-21 20:49:42 +02:00
parent 693b9e47e5
commit d526616cd3
4 changed files with 40 additions and 13 deletions

View file

@ -2,6 +2,7 @@
/// Holds all code for the FLV namespace. /// Holds all code for the FLV namespace.
#include "flv_tag.h" #include "flv_tag.h"
#include "rtmpchunks.h"
#include <stdio.h> //for Tag::FileLoader #include <stdio.h> //for Tag::FileLoader
#include <unistd.h> //for Tag::FileLoader #include <unistd.h> //for Tag::FileLoader
#include <fcntl.h> //for Tag::FileLoader #include <fcntl.h> //for Tag::FileLoader

View file

@ -4,7 +4,11 @@
#pragma once #pragma once
#include "socket.h" #include "socket.h"
#include <string> #include <string>
#include "rtmpchunks.h"
//forward declaration of RTMPStream::Chunk to avoid circular dependencies.
namespace RTMPStream{
class Chunk;
};
/// This namespace holds all FLV-parsing related functionality. /// This namespace holds all FLV-parsing related functionality.
namespace FLV { namespace FLV {

View file

@ -2,6 +2,7 @@
/// Holds all code for the RTMPStream namespace. /// Holds all code for the RTMPStream namespace.
#include "rtmpchunks.h" #include "rtmpchunks.h"
#include "flv_tag.h"
#include "crypto.h" #include "crypto.h"
char versionstring[] = "WWW.DDVTECH.COM "; ///< String that is repeated in the RTMP handshake char versionstring[] = "WWW.DDVTECH.COM "; ///< String that is repeated in the RTMP handshake
@ -41,8 +42,8 @@ std::string RTMPStream::Chunk::Pack(){
RTMPStream::Chunk prev = lastsend[cs_id]; RTMPStream::Chunk prev = lastsend[cs_id];
unsigned int tmpi; unsigned int tmpi;
unsigned char chtype = 0x00; unsigned char chtype = 0x00;
timestamp -= firsttime; //timestamp -= firsttime;
if (timestamp < prev.timestamp){timestamp = prev.timestamp;} //if (timestamp < prev.timestamp){timestamp = prev.timestamp;}
if ((prev.msg_type_id > 0) && (prev.cs_id == cs_id)){ if ((prev.msg_type_id > 0) && (prev.cs_id == cs_id)){
if (msg_stream_id == prev.msg_stream_id){ if (msg_stream_id == prev.msg_stream_id){
chtype = 0x40;//do not send msg_stream_id chtype = 0x40;//do not send msg_stream_id
@ -77,15 +78,15 @@ std::string RTMPStream::Chunk::Pack(){
tmpi = timestamp - prev.timestamp; tmpi = timestamp - prev.timestamp;
} }
if (tmpi >= 0x00ffffff){ntime = tmpi; tmpi = 0x00ffffff;} if (tmpi >= 0x00ffffff){ntime = tmpi; tmpi = 0x00ffffff;}
output += (unsigned char)(tmpi / (256*256)); output += (unsigned char)((tmpi >> 16) & 0xff);
output += (unsigned char)(tmpi / 256); output += (unsigned char)((tmpi >> 8) & 0xff);
output += (unsigned char)(tmpi % 256); output += (unsigned char)(tmpi & 0xff);
if (chtype != 0x80){ if (chtype != 0x80){
//len //len
tmpi = len; tmpi = len;
output += (unsigned char)(tmpi / (256*256)); output += (unsigned char)((tmpi >> 16) & 0xff);
output += (unsigned char)(tmpi / 256); output += (unsigned char)((tmpi >> 8) & 0xff);
output += (unsigned char)(tmpi % 256); output += (unsigned char)(tmpi & 0xff);
//msg type id //msg type id
output += (unsigned char)msg_type_id; output += (unsigned char)msg_type_id;
if (chtype != 0x40){ if (chtype != 0x40){
@ -99,10 +100,10 @@ std::string RTMPStream::Chunk::Pack(){
} }
//support for 0x00ffffff timestamps //support for 0x00ffffff timestamps
if (ntime){ if (ntime){
output += (unsigned char)(ntime % 256); output += (unsigned char)(ntime & 0xff);
output += (unsigned char)(ntime / 256); output += (unsigned char)((ntime >> 8) & 0xff);
output += (unsigned char)(ntime / (256*256)); output += (unsigned char)((ntime >> 16) & 0xff);
output += (unsigned char)(ntime / (256*256*256)); output += (unsigned char)((ntime >> 24) & 0xff);
} }
len_left = 0; len_left = 0;
while (len_left < len){ while (len_left < len){
@ -174,6 +175,21 @@ std::string RTMPStream::SendMedia(unsigned char msg_type_id, unsigned char * dat
return ch.Pack(); return ch.Pack();
}//SendMedia }//SendMedia
/// Packs up a chunk with media contents.
/// \param tag FLV::Tag with media to send.
std::string RTMPStream::SendMedia(FLV::Tag & tag){
RTMPStream::Chunk ch;
ch.cs_id = ((unsigned char)tag.data[0]);
ch.timestamp = tag.tagTime();
ch.len = tag.len-15;
ch.real_len = tag.len-15;
ch.len_left = 0;
ch.msg_type_id = (unsigned char)tag.data[0];
ch.msg_stream_id = 1;
ch.data.append(tag.data+11, (size_t)(tag.len-15));
return ch.Pack();
}//SendMedia
/// Packs up a chunk for a control message with 1 argument. /// Packs up a chunk for a control message with 1 argument.
std::string RTMPStream::SendCTL(unsigned char type, unsigned int data){ std::string RTMPStream::SendCTL(unsigned char type, unsigned int data){
RTMPStream::Chunk ch; RTMPStream::Chunk ch;

View file

@ -9,6 +9,11 @@
#include <string> #include <string>
#include <arpa/inet.h> #include <arpa/inet.h>
//forward declaration of FLV::Tag to avoid circular dependencies.
namespace FLV{
class Tag;
};
/// Contains all functions and classes needed for RTMP connections. /// Contains all functions and classes needed for RTMP connections.
namespace RTMPStream{ namespace RTMPStream{
@ -51,6 +56,7 @@ namespace RTMPStream{
std::string SendChunk(unsigned int cs_id, unsigned char msg_type_id, unsigned int msg_stream_id, std::string data); std::string SendChunk(unsigned int cs_id, unsigned char msg_type_id, unsigned int msg_stream_id, std::string data);
std::string SendMedia(unsigned char msg_type_id, unsigned char * data, int len, unsigned int ts); std::string SendMedia(unsigned char msg_type_id, unsigned char * data, int len, unsigned int ts);
std::string SendMedia(FLV::Tag & tag);
std::string SendCTL(unsigned char type, unsigned int data); std::string SendCTL(unsigned char type, unsigned int data);
std::string SendCTL(unsigned char type, unsigned int data, unsigned char data2); std::string SendCTL(unsigned char type, unsigned int data, unsigned char data2);
std::string SendUSR(unsigned char type, unsigned int data); std::string SendUSR(unsigned char type, unsigned int data);