diff --git a/Source/RTMPPublisher.cpp b/Source/RTMPPublisher.cpp index f90ff5271..8aafdcbca 100644 --- a/Source/RTMPPublisher.cpp +++ b/Source/RTMPPublisher.cpp @@ -185,10 +185,6 @@ bool RTMPPublisher::Init(UINT tcpBufferSize) hDataBufferMutex = OSCreateMutex(); - dataBufferSize = (App->GetVideoEncoder()->GetBitRate() + App->GetAudioEncoder()->GetBitRate()) / 8 * 1024; - if (dataBufferSize < 131072) - dataBufferSize = 131072; - dataBuffer = (BYTE *)Allocate(dataBufferSize); hSocketThread = OSCreateThread((XTHREAD)RTMPPublisher::SocketThread, this); @@ -202,6 +198,31 @@ bool RTMPPublisher::Init(UINT tcpBufferSize) return true; } +void RTMPPublisher::InitEncoderData() +{ + if (encoderDataInitialized) + return; + + encoderDataInitialized = true; + + dataBufferSize = (App->GetVideoEncoder()->GetBitRate() + App->GetAudioEncoder()->GetBitRate()) / 8 * 1024; + if (dataBufferSize < 131072) + dataBufferSize = 131072; + + metaDataPacketBuffer.resize(2048); + + char *enc = metaDataPacketBuffer.data() + RTMP_MAX_HEADER_SIZE; + char *pend = metaDataPacketBuffer.data() + metaDataPacketBuffer.size(); + enc = AMF_EncodeString(enc, pend, &av_setDataFrame); + enc = AMF_EncodeString(enc, pend, &av_onMetaData); + enc = App->EncMetaData(enc, pend); + metaDataPacketBuffer.resize(enc - metaDataPacketBuffer.data()); + + App->GetAudioHeaders(audioHeaders); + + App->GetVideoHeaders(videoHeaders); +} + RTMPPublisher::~RTMPPublisher() { //OSDebugOut (TEXT("*** ~RTMPPublisher (%d queued, %d buffered, %d data)\n"), queuedPackets.Num(), bufferedPackets.Num(), curDataBufferLen); @@ -522,6 +543,8 @@ void RTMPPublisher::ProcessPackets() void RTMPPublisher::SendPacket(BYTE *data, UINT size, DWORD timestamp, PacketType type) { + InitEncoderData(); + if(!bConnected && !bConnecting && !bStopping) { hConnectionThread = OSCreateThread((XTHREAD)CreateConnectionThread, this); @@ -703,22 +726,15 @@ void RTMPPublisher::BeginPublishingInternal() { RTMPPacket packet; - char pbuf[2048], *pend = pbuf+sizeof(pbuf); - packet.m_nChannel = 0x03; // control channel (invoke) packet.m_headerType = RTMP_PACKET_SIZE_LARGE; packet.m_packetType = RTMP_PACKET_TYPE_INFO; packet.m_nTimeStamp = 0; packet.m_nInfoField2 = rtmp->m_stream_id; packet.m_hasAbsTimestamp = TRUE; - packet.m_body = pbuf + RTMP_MAX_HEADER_SIZE; - - char *enc = packet.m_body; - enc = AMF_EncodeString(enc, pend, &av_setDataFrame); - enc = AMF_EncodeString(enc, pend, &av_onMetaData); - enc = App->EncMetaData(enc, pend); + packet.m_body = metaDataPacketBuffer.data() + RTMP_MAX_HEADER_SIZE; - packet.m_nBodySize = enc - packet.m_body; + packet.m_nBodySize = metaDataPacketBuffer.size() - RTMP_MAX_HEADER_SIZE; if(!RTMP_SendPacket(rtmp, &packet, FALSE)) { App->PostStopMessage(); @@ -728,20 +744,17 @@ void RTMPPublisher::BeginPublishingInternal() //---------------------------------------------- List packetPadding; - DataPacket mediaHeaders; //---------------------------------------------- packet.m_nChannel = 0x05; // source channel packet.m_packetType = RTMP_PACKET_TYPE_AUDIO; - App->GetAudioHeaders(mediaHeaders); - packetPadding.SetSize(RTMP_MAX_HEADER_SIZE); - packetPadding.AppendArray(mediaHeaders.lpPacket, mediaHeaders.size); + packetPadding.AppendArray(audioHeaders.lpPacket, audioHeaders.size); packet.m_body = (char*)packetPadding.Array()+RTMP_MAX_HEADER_SIZE; - packet.m_nBodySize = mediaHeaders.size; + packet.m_nBodySize = audioHeaders.size; if(!RTMP_SendPacket(rtmp, &packet, FALSE)) { App->PostStopMessage(); @@ -754,13 +767,12 @@ void RTMPPublisher::BeginPublishingInternal() packet.m_headerType = RTMP_PACKET_SIZE_LARGE; packet.m_packetType = RTMP_PACKET_TYPE_VIDEO; - App->GetVideoHeaders(mediaHeaders); packetPadding.SetSize(RTMP_MAX_HEADER_SIZE); - packetPadding.AppendArray(mediaHeaders.lpPacket, mediaHeaders.size); + packetPadding.AppendArray(videoHeaders.lpPacket, videoHeaders.size); packet.m_body = (char*)packetPadding.Array()+RTMP_MAX_HEADER_SIZE; - packet.m_nBodySize = mediaHeaders.size; + packet.m_nBodySize = videoHeaders.size; if(!RTMP_SendPacket(rtmp, &packet, FALSE)) { App->PostStopMessage(); diff --git a/Source/RTMPPublisher.h b/Source/RTMPPublisher.h index a82891cda..f17a7f88c 100644 --- a/Source/RTMPPublisher.h +++ b/Source/RTMPPublisher.h @@ -86,6 +86,11 @@ class RTMPPublisher : public NetworkStream void InitializeBuffer(); void SendPacketForReal(BYTE *data, UINT size, DWORD timestamp, PacketType type); + bool encoderDataInitialized = false; + std::vector metaDataPacketBuffer; + DataPacket audioHeaders, videoHeaders; + void InitEncoderData(); + //----------------------------------------------- // frame drop stuff