Share memory between ReplayBuffer and RecordingHelper
parent
0f668e132b
commit
b5f803084e
|
@ -32,7 +32,7 @@ class FLVFileStream : public VideoFileStream
|
|||
|
||||
bool bSentFirstPacket, bSentSEI;
|
||||
|
||||
void AppendFLVPacket(LPBYTE 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
|
||||
DataPacket sei;
|
||||
|
@ -124,7 +124,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
virtual void AddPacket(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
|
||||
{
|
||||
if(!bSentFirstPacket)
|
||||
{
|
||||
|
|
|
@ -819,7 +819,7 @@ public:
|
|||
//DestroyWindow(hwndProgressDialog);
|
||||
}
|
||||
|
||||
virtual void AddPacket(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
|
||||
{
|
||||
UINT64 offset = fileOut.GetPos();
|
||||
|
||||
|
@ -863,7 +863,7 @@ public:
|
|||
|
||||
if(data[0] == 0x17 && data[1] == 0) //if SPS/PPS
|
||||
{
|
||||
LPBYTE lpData = data+11;
|
||||
const BYTE *lpData = data+11;
|
||||
|
||||
UINT spsSize = fastHtons(*(WORD*)lpData);
|
||||
fileOut.OutputWord(0);
|
||||
|
|
|
@ -130,7 +130,11 @@ class VideoFileStream
|
|||
{
|
||||
public:
|
||||
virtual ~VideoFileStream() {}
|
||||
virtual void AddPacket(BYTE *data, UINT size, DWORD timestamp, DWORD pts, PacketType type)=0;
|
||||
virtual void AddPacket(const BYTE *data, UINT size, DWORD timestamp, DWORD pts, PacketType type)=0;
|
||||
virtual void AddPacket(std::shared_ptr<const std::vector<BYTE>> data, DWORD timestamp, DWORD pts, PacketType type)
|
||||
{
|
||||
AddPacket(data->data(), static_cast<UINT>(data->size()), timestamp, pts, type);
|
||||
}
|
||||
};
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
|
|
|
@ -173,10 +173,15 @@ void OBS::SendFrame(VideoSegment &curSegment, QWORD firstFrameTime)
|
|||
|
||||
if(network)
|
||||
network->SendPacket(audioData.Array(), audioData.Num(), audioTimestamp, PacketType_Audio);
|
||||
if(fileStream)
|
||||
fileStream->AddPacket(audioData.Array(), audioData.Num(), audioTimestamp, audioTimestamp, PacketType_Audio);
|
||||
if (replayBufferStream)
|
||||
replayBufferStream->AddPacket(audioData.Array(), audioData.Num(), audioTimestamp, audioTimestamp, PacketType_Audio);
|
||||
|
||||
if (fileStream || replayBufferStream)
|
||||
{
|
||||
auto shared_data = std::make_shared<const std::vector<BYTE>>(audioData.Array(), audioData.Array() + audioData.Num());
|
||||
if (fileStream)
|
||||
fileStream->AddPacket(shared_data, audioTimestamp, audioTimestamp, PacketType_Audio);
|
||||
if (replayBufferStream)
|
||||
replayBufferStream->AddPacket(shared_data, audioTimestamp, audioTimestamp, PacketType_Audio);
|
||||
}
|
||||
|
||||
audioData.Clear();
|
||||
|
||||
|
@ -205,10 +210,15 @@ void OBS::SendFrame(VideoSegment &curSegment, QWORD firstFrameTime)
|
|||
|
||||
if(network)
|
||||
network->SendPacket(packet.data.Array(), packet.data.Num(), curSegment.timestamp, packet.type);
|
||||
if(fileStream)
|
||||
fileStream->AddPacket(packet.data.Array(), packet.data.Num(), curSegment.timestamp, curSegment.pts, packet.type);
|
||||
if (replayBufferStream)
|
||||
replayBufferStream->AddPacket(packet.data.Array(), packet.data.Num(), curSegment.timestamp, curSegment.pts, packet.type);
|
||||
|
||||
if (fileStream || replayBufferStream)
|
||||
{
|
||||
auto shared_data = std::make_shared<const std::vector<BYTE>>(packet.data.Array(), packet.data.Array() + packet.data.Num());
|
||||
if (fileStream)
|
||||
fileStream->AddPacket(shared_data, curSegment.timestamp, curSegment.pts, packet.type);
|
||||
if (replayBufferStream)
|
||||
replayBufferStream->AddPacket(shared_data, curSegment.timestamp, curSegment.pts, packet.type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ along with this program; if not, write to the Free Software
|
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
********************************************************************************/
|
||||
|
||||
|
||||
#define NOMINMAX
|
||||
#include "Main.h"
|
||||
|
||||
#include <deque>
|
||||
|
@ -31,7 +31,7 @@ VideoFileStream *CreateFileStream(String strOutputFile);
|
|||
|
||||
namespace
|
||||
{
|
||||
using packet_t = tuple<PacketType, DWORD, DWORD, vector<BYTE>>;
|
||||
using packet_t = tuple<PacketType, DWORD, DWORD, shared_ptr<const vector<BYTE>>>;
|
||||
using packet_list_t = list<shared_ptr<const packet_t>>;
|
||||
using packet_vec_t = deque<shared_ptr<const packet_t>>;
|
||||
}
|
||||
|
@ -67,9 +67,14 @@ struct ReplayBuffer : VideoFileStream
|
|||
OSTerminateThread(thread.first.release(), 0);
|
||||
}
|
||||
|
||||
virtual void AddPacket(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
|
||||
{
|
||||
packets.emplace_back(make_shared<packet_t>(type, timestamp, pts, vector<BYTE>(data, data + size)));
|
||||
AddPacket(make_shared<const vector<BYTE>>(data, data + size), timestamp, pts, type);
|
||||
}
|
||||
|
||||
virtual void AddPacket(shared_ptr<const vector<BYTE>> data, DWORD timestamp, DWORD pts, PacketType type) override
|
||||
{
|
||||
packets.emplace_back(make_shared<const packet_t>(type, timestamp, pts, data));
|
||||
|
||||
if (start_recording)
|
||||
{
|
||||
|
@ -77,7 +82,7 @@ struct ReplayBuffer : VideoFileStream
|
|||
CreateRecordingHelper(App->fileStream, packets);
|
||||
}
|
||||
|
||||
if (data[0] != 0x17)
|
||||
if ((*data)[0] != 0x17)
|
||||
return;
|
||||
|
||||
HandleSaveTimes(pts);
|
||||
|
@ -193,9 +198,9 @@ static DWORD STDCALL SaveReplayBufferThread(void *arg)
|
|||
break;
|
||||
|
||||
auto &buf = get<3>(*packet);
|
||||
out->AddPacket(const_cast<BYTE*>(buf.data()), (UINT)buf.size(), get<1>(*packet), get<2>(*packet), get<0>(*packet));
|
||||
out->AddPacket(buf, get<1>(*packet), get<2>(*packet), get<0>(*packet));
|
||||
|
||||
if (buf.front() == 0x17)
|
||||
if (buf->front() == 0x17)
|
||||
signal();
|
||||
|
||||
packets.pop_front();
|
||||
|
@ -253,11 +258,16 @@ struct RecordingHelper : VideoFileStream
|
|||
}
|
||||
|
||||
auto &buf = get<3>(*packet);
|
||||
file_stream->AddPacket(const_cast<BYTE*>(buf.data()), (UINT)buf.size(), get<1>(*packet), get<2>(*packet), get<0>(*packet));
|
||||
file_stream->AddPacket(buf, get<1>(*packet), get<2>(*packet), get<0>(*packet));
|
||||
}
|
||||
}
|
||||
|
||||
void AddPacket(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
|
||||
{
|
||||
AddPacket(make_shared<const vector<BYTE>>(data, data + size), timestamp, pts, type);
|
||||
}
|
||||
|
||||
void AddPacket(shared_ptr<const vector<BYTE>> data, DWORD timestamp, DWORD pts, PacketType type) override
|
||||
{
|
||||
if (save_thread)
|
||||
{
|
||||
|
@ -269,7 +279,7 @@ struct RecordingHelper : VideoFileStream
|
|||
buffered_packets.clear();
|
||||
buffered_packets.shrink_to_fit();
|
||||
|
||||
file_stream->AddPacket(data, size, timestamp, pts, type);
|
||||
file_stream->AddPacket(data, timestamp, pts, type);
|
||||
|
||||
decltype(save_thread) null_thread;
|
||||
swap(null_thread, save_thread);
|
||||
|
@ -277,11 +287,11 @@ struct RecordingHelper : VideoFileStream
|
|||
}
|
||||
|
||||
ScopedLock l(packets_mutex);
|
||||
buffered_packets.emplace_back(make_shared<packet_t>(type, timestamp, pts, vector<BYTE>(data, data + size)));
|
||||
buffered_packets.emplace_back(make_shared<const packet_t>(type, timestamp, pts, data));
|
||||
return;
|
||||
}
|
||||
|
||||
file_stream->AddPacket(data, size, timestamp, pts, type);
|
||||
file_stream->AddPacket(data, timestamp, pts, type);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue