Move audio/video headers and SEI packet to BufferedDataPacket
This commit is contained in:
parent
af8df3d251
commit
bc0cc9cb54
@ -20,6 +20,8 @@
|
|||||||
#include "Main.h"
|
#include "Main.h"
|
||||||
#include "RTMPStuff.h"
|
#include "RTMPStuff.h"
|
||||||
|
|
||||||
|
#include "DataPacketHelpers.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class FLVFileStream : public VideoFileStream
|
class FLVFileStream : public VideoFileStream
|
||||||
@ -30,14 +32,15 @@ class FLVFileStream : public VideoFileStream
|
|||||||
UINT64 metaDataPos;
|
UINT64 metaDataPos;
|
||||||
DWORD lastTimeStamp, initialTimestamp;
|
DWORD lastTimeStamp, initialTimestamp;
|
||||||
|
|
||||||
|
decltype(GetBufferedSEIPacket()) sei = GetBufferedSEIPacket();
|
||||||
|
decltype(GetBufferedAudioHeadersPacket()) audioHeaders = GetBufferedAudioHeadersPacket();
|
||||||
|
decltype(GetBufferedVideoHeadersPacket()) videoHeaders = GetBufferedVideoHeadersPacket();
|
||||||
|
|
||||||
bool bSentFirstPacket, bSentSEI;
|
bool bSentFirstPacket, bSentSEI;
|
||||||
|
|
||||||
void AppendFLVPacket(const BYTE *lpData, UINT size, BYTE type, DWORD timestamp)
|
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
|
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 networkDataSize = fastHtonl(size+sei.size);
|
||||||
UINT networkTimestamp = fastHtonl(timestamp);
|
UINT networkTimestamp = fastHtonl(timestamp);
|
||||||
UINT streamID = 0;
|
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
|
virtual void AddPacket(const BYTE *data, UINT size, DWORD timestamp, DWORD /*pts*/, PacketType type) override
|
||||||
{
|
{
|
||||||
|
InitBufferedPackets();
|
||||||
|
|
||||||
if(!bSentFirstPacket)
|
if(!bSentFirstPacket)
|
||||||
{
|
{
|
||||||
bSentFirstPacket = true;
|
bSentFirstPacket = true;
|
||||||
|
|
||||||
DataPacket audioHeaders, videoHeaders;//, videoSEI;
|
|
||||||
App->GetAudioHeaders(audioHeaders);
|
|
||||||
App->GetVideoHeaders(videoHeaders);
|
|
||||||
|
|
||||||
AppendFLVPacket(audioHeaders.lpPacket, audioHeaders.size, 8, 0);
|
AppendFLVPacket(audioHeaders.lpPacket, audioHeaders.size, 8, 0);
|
||||||
AppendFLVPacket(videoHeaders.lpPacket, videoHeaders.size, 9, 0);
|
AppendFLVPacket(videoHeaders.lpPacket, videoHeaders.size, 9, 0);
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,8 @@
|
|||||||
#include "Main.h"
|
#include "Main.h"
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "DataPacketHelpers.h"
|
||||||
|
|
||||||
|
|
||||||
time_t GetMacTime()
|
time_t GetMacTime()
|
||||||
{
|
{
|
||||||
@ -287,28 +289,30 @@ public:
|
|||||||
UINT frameTime = 0;
|
UINT frameTime = 0;
|
||||||
UINT sampleRateHz = 0;
|
UINT sampleRateHz = 0;
|
||||||
UINT width = 0, height = 0;
|
UINT width = 0, height = 0;
|
||||||
DataPacket videoHeaders;
|
|
||||||
List<BYTE> AACHeader;
|
|
||||||
UINT maxBitRate = 0;
|
UINT maxBitRate = 0;
|
||||||
DataPacket sei;
|
|
||||||
void CopyMetadata()
|
void CopyMetadata()
|
||||||
{
|
{
|
||||||
frameTime = App->GetFrameTime();
|
frameTime = App->GetFrameTime();
|
||||||
sampleRateHz = App->GetSampleRateHz();
|
sampleRateHz = App->GetSampleRateHz();
|
||||||
App->GetOutputSize(width, height);
|
App->GetOutputSize(width, height);
|
||||||
App->GetVideoHeaders(videoHeaders);
|
|
||||||
|
|
||||||
//-------------------------------------------
|
//-------------------------------------------
|
||||||
// get AAC headers if using AAC
|
// 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);
|
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()
|
~MP4FileStream()
|
||||||
@ -382,8 +386,9 @@ public:
|
|||||||
/*esDecoderOut.OutputByte(0x80); //some stuff that no one should probably care about
|
/*esDecoderOut.OutputByte(0x80); //some stuff that no one should probably care about
|
||||||
esDecoderOut.OutputByte(0x80);
|
esDecoderOut.OutputByte(0x80);
|
||||||
esDecoderOut.OutputByte(0x80);*/
|
esDecoderOut.OutputByte(0x80);*/
|
||||||
esDecoderOut.OutputByte(AACHeader.Num());
|
assert(audioHeaders.size >= 2);
|
||||||
esDecoderOut.Serialize((LPVOID)AACHeader.Array(), AACHeader.Num());
|
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
|
virtual void AddPacket(const BYTE *data, UINT size, DWORD timestamp, DWORD /*pts*/, PacketType type) override
|
||||||
{
|
{
|
||||||
|
InitBufferedPackets();
|
||||||
|
|
||||||
UINT64 offset = fileOut.GetPos();
|
UINT64 offset = fileOut.GetPos();
|
||||||
|
|
||||||
if(initialTimeStamp == -1 && data[0] != 0x17)
|
if(initialTimeStamp == -1 && data[0] != 0x17)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user