Attempts at fixing timestamp issues, improved FLV/RTMP cooperatibility, fixed several bugs
This commit is contained in:
parent
693b9e47e5
commit
d526616cd3
4 changed files with 40 additions and 13 deletions
|
@ -2,6 +2,7 @@
|
|||
/// Holds all code for the FLV namespace.
|
||||
|
||||
#include "flv_tag.h"
|
||||
#include "rtmpchunks.h"
|
||||
#include <stdio.h> //for Tag::FileLoader
|
||||
#include <unistd.h> //for Tag::FileLoader
|
||||
#include <fcntl.h> //for Tag::FileLoader
|
||||
|
|
|
@ -4,7 +4,11 @@
|
|||
#pragma once
|
||||
#include "socket.h"
|
||||
#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.
|
||||
namespace FLV {
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
/// Holds all code for the RTMPStream namespace.
|
||||
|
||||
#include "rtmpchunks.h"
|
||||
#include "flv_tag.h"
|
||||
#include "crypto.h"
|
||||
|
||||
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];
|
||||
unsigned int tmpi;
|
||||
unsigned char chtype = 0x00;
|
||||
timestamp -= firsttime;
|
||||
if (timestamp < prev.timestamp){timestamp = prev.timestamp;}
|
||||
//timestamp -= firsttime;
|
||||
//if (timestamp < prev.timestamp){timestamp = prev.timestamp;}
|
||||
if ((prev.msg_type_id > 0) && (prev.cs_id == cs_id)){
|
||||
if (msg_stream_id == prev.msg_stream_id){
|
||||
chtype = 0x40;//do not send msg_stream_id
|
||||
|
@ -77,15 +78,15 @@ std::string RTMPStream::Chunk::Pack(){
|
|||
tmpi = timestamp - prev.timestamp;
|
||||
}
|
||||
if (tmpi >= 0x00ffffff){ntime = tmpi; tmpi = 0x00ffffff;}
|
||||
output += (unsigned char)(tmpi / (256*256));
|
||||
output += (unsigned char)(tmpi / 256);
|
||||
output += (unsigned char)(tmpi % 256);
|
||||
output += (unsigned char)((tmpi >> 16) & 0xff);
|
||||
output += (unsigned char)((tmpi >> 8) & 0xff);
|
||||
output += (unsigned char)(tmpi & 0xff);
|
||||
if (chtype != 0x80){
|
||||
//len
|
||||
tmpi = len;
|
||||
output += (unsigned char)(tmpi / (256*256));
|
||||
output += (unsigned char)(tmpi / 256);
|
||||
output += (unsigned char)(tmpi % 256);
|
||||
output += (unsigned char)((tmpi >> 16) & 0xff);
|
||||
output += (unsigned char)((tmpi >> 8) & 0xff);
|
||||
output += (unsigned char)(tmpi & 0xff);
|
||||
//msg type id
|
||||
output += (unsigned char)msg_type_id;
|
||||
if (chtype != 0x40){
|
||||
|
@ -99,10 +100,10 @@ std::string RTMPStream::Chunk::Pack(){
|
|||
}
|
||||
//support for 0x00ffffff timestamps
|
||||
if (ntime){
|
||||
output += (unsigned char)(ntime % 256);
|
||||
output += (unsigned char)(ntime / 256);
|
||||
output += (unsigned char)(ntime / (256*256));
|
||||
output += (unsigned char)(ntime / (256*256*256));
|
||||
output += (unsigned char)(ntime & 0xff);
|
||||
output += (unsigned char)((ntime >> 8) & 0xff);
|
||||
output += (unsigned char)((ntime >> 16) & 0xff);
|
||||
output += (unsigned char)((ntime >> 24) & 0xff);
|
||||
}
|
||||
len_left = 0;
|
||||
while (len_left < len){
|
||||
|
@ -174,6 +175,21 @@ std::string RTMPStream::SendMedia(unsigned char msg_type_id, unsigned char * dat
|
|||
return ch.Pack();
|
||||
}//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.
|
||||
std::string RTMPStream::SendCTL(unsigned char type, unsigned int data){
|
||||
RTMPStream::Chunk ch;
|
||||
|
|
|
@ -9,6 +9,11 @@
|
|||
#include <string>
|
||||
#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.
|
||||
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 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, unsigned char data2);
|
||||
std::string SendUSR(unsigned char type, unsigned int data);
|
||||
|
|
Loading…
Add table
Reference in a new issue