Move audio/video headers and SEI packet to BufferedDataPacket

master
palana 2014-10-10 18:30:58 +02:00
parent af8df3d251
commit bc0cc9cb54
2 changed files with 35 additions and 20 deletions

View File

@ -20,6 +20,8 @@
#include "Main.h"
#include "RTMPStuff.h"
#include "DataPacketHelpers.h"
class FLVFileStream : public VideoFileStream
@ -30,14 +32,15 @@ class FLVFileStream : public VideoFileStream
UINT64 metaDataPos;
DWORD lastTimeStamp, initialTimestamp;
decltype(GetBufferedSEIPacket()) sei = GetBufferedSEIPacket();
decltype(GetBufferedAudioHeadersPacket()) audioHeaders = GetBufferedAudioHeadersPacket();
decltype(GetBufferedVideoHeadersPacket()) videoHeaders = GetBufferedVideoHeadersPacket();
bool bSentFirstPacket, bSentSEI;
void AppendFLVPacket(const BYTE *lpData, UINT size, BYTE type, DWORD timestamp)
{
if (!bSentSEI && type == 9 && lpData[0] == 0x17 && lpData[1] == 0x1) { //send SEI with first keyframe packet
DataPacket sei;
App->GetVideoEncoder()->GetSEI(sei);
UINT networkDataSize = fastHtonl(size+sei.size);
UINT networkTimestamp = fastHtonl(timestamp);
UINT streamID = 0;
@ -124,16 +127,21 @@ public:
}
}
void InitBufferedPackets()
{
sei.InitBuffer();
audioHeaders.InitBuffer();
videoHeaders.InitBuffer();
}
virtual void AddPacket(const BYTE *data, UINT size, DWORD timestamp, DWORD /*pts*/, PacketType type) override
{
InitBufferedPackets();
if(!bSentFirstPacket)
{
bSentFirstPacket = true;
DataPacket audioHeaders, videoHeaders;//, videoSEI;
App->GetAudioHeaders(audioHeaders);
App->GetVideoHeaders(videoHeaders);
AppendFLVPacket(audioHeaders.lpPacket, audioHeaders.size, 8, 0);
AppendFLVPacket(videoHeaders.lpPacket, videoHeaders.size, 9, 0);
}

View File

@ -20,6 +20,8 @@
#include "Main.h"
#include <time.h>
#include "DataPacketHelpers.h"
time_t GetMacTime()
{
@ -287,28 +289,30 @@ public:
UINT frameTime = 0;
UINT sampleRateHz = 0;
UINT width = 0, height = 0;
DataPacket videoHeaders;
List<BYTE> AACHeader;
UINT maxBitRate = 0;
DataPacket sei;
void CopyMetadata()
{
frameTime = App->GetFrameTime();
sampleRateHz = App->GetSampleRateHz();
App->GetOutputSize(width, height);
App->GetVideoHeaders(videoHeaders);
//-------------------------------------------
// get AAC headers if using AAC
if (!bMP3)
{
DataPacket data;
App->GetAudioHeaders(data);
AACHeader.CopyArray(data.lpPacket + 2, data.size - 2);
}
maxBitRate = fastHtonl(App->GetAudioEncoder()->GetBitRate() * 1000);
App->GetVideoEncoder()->GetSEI(sei);
InitBufferedPackets();
}
decltype(GetBufferedSEIPacket()) sei = GetBufferedSEIPacket();
decltype(GetBufferedAudioHeadersPacket()) audioHeaders = GetBufferedAudioHeadersPacket();
decltype(GetBufferedVideoHeadersPacket()) videoHeaders = GetBufferedVideoHeadersPacket();
void InitBufferedPackets()
{
sei.InitBuffer();
if (!bMP3)
audioHeaders.InitBuffer();
videoHeaders.InitBuffer();
}
~MP4FileStream()
@ -382,8 +386,9 @@ public:
/*esDecoderOut.OutputByte(0x80); //some stuff that no one should probably care about
esDecoderOut.OutputByte(0x80);
esDecoderOut.OutputByte(0x80);*/
esDecoderOut.OutputByte(AACHeader.Num());
esDecoderOut.Serialize((LPVOID)AACHeader.Array(), AACHeader.Num());
assert(audioHeaders.size >= 2);
esDecoderOut.OutputByte(audioHeaders.size - 2);
esDecoderOut.Serialize(audioHeaders.lpPacket + 2, audioHeaders.size - 2);
}
@ -821,6 +826,8 @@ public:
virtual void AddPacket(const BYTE *data, UINT size, DWORD timestamp, DWORD /*pts*/, PacketType type) override
{
InitBufferedPackets();
UINT64 offset = fileOut.GetPos();
if(initialTimeStamp == -1 && data[0] != 0x17)