Packetqueue tweaks, need to move this stuff up to monitor to maintain a packet buffer
This commit is contained in:
parent
966fbb1a10
commit
7fcd12fab9
|
@ -486,6 +486,7 @@ int FfmpegCamera::CaptureAndRecord(Image &image, bool recording, char* event_fil
|
|||
}
|
||||
|
||||
AVPacket packet;
|
||||
AVPacket* queuedpacket;
|
||||
uint8_t* directbuffer;
|
||||
zm_packetqueue packetqueue;
|
||||
|
||||
|
@ -546,6 +547,13 @@ int FfmpegCamera::CaptureAndRecord(Image &image, bool recording, char* event_fil
|
|||
videoStore = new VideoStore((const char *) event_file, "mp4", mFormatContext->streams[mVideoStreamId], mAudioStreamId == -1 ? NULL : mFormatContext->streams[mAudioStreamId], startTime);
|
||||
wasRecording = true;
|
||||
strcpy(oldDirectory, event_file);
|
||||
while(packetqueue.popVideoPacket(queuedpacket)){
|
||||
int ret = videoStore->writeVideoFramePacket(&packet, mFormatContext->streams[mVideoStreamId]); //, &lastKeyframePkt);
|
||||
if (ret < 0) {//Less than zero and we skipped a frame
|
||||
av_free_packet(&packet);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
} else if (!recording && wasRecording && videoStore) {
|
||||
Info("Deleting videoStore instance");
|
||||
|
|
|
@ -24,7 +24,9 @@
|
|||
|
||||
using namespace std;
|
||||
|
||||
zm_packetqueue::zm_packetqueue() {
|
||||
zm_packetqueue::zm_packetqueue()
|
||||
: MaxVideoQueueSize(VIDEO_QUEUESIZE)
|
||||
, MaxAudioQueueSize(AUDIO_QUEUESIZE){
|
||||
}
|
||||
|
||||
zm_packetqueue::zm_packetqueue(const zm_packetqueue& orig) {
|
||||
|
@ -34,59 +36,59 @@ zm_packetqueue::~zm_packetqueue() {
|
|||
}
|
||||
|
||||
bool zm_packetqueue::queueVideoPacket(AVPacket* packet){
|
||||
return queuePacket(m_VideoQueue, packet);
|
||||
return queuePacket(VideoQueue, packet);
|
||||
}
|
||||
|
||||
bool zm_packetqueue::queueAudioPacket(AVPacket* packet)
|
||||
{
|
||||
return queuePacket(m_AudioQueue, packet);
|
||||
return queuePacket(AudioQueue, packet);
|
||||
}
|
||||
|
||||
bool zm_packetqueue::queuePacket(queue<AVPacket>& packetQueue, AVPacket* packet){
|
||||
bool zm_packetqueue::queuePacket(queue<AVPacket>& pktQueue, AVPacket* packet){
|
||||
|
||||
AVPacket input_ref = { 0 };
|
||||
if (av_packet_ref(&input_ref, packet) < 0){
|
||||
return false;
|
||||
}
|
||||
packetQueue.push(*packet);
|
||||
pktQueue.push(*packet);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool zm_packetqueue::popPacket(queue<AVPacket>& packetQueue, AVPacket* packet)
|
||||
bool zm_packetqueue::popPacket(queue<AVPacket>& pktQueue, AVPacket* packet)
|
||||
{
|
||||
if (packetQueue.empty())
|
||||
if (pktQueue.empty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
*packet = packetQueue.front();
|
||||
packetQueue.pop();
|
||||
*packet = pktQueue.front();
|
||||
pktQueue.pop();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void zm_packetqueue::clearQueue(std::queue<AVPacket>& packetQueue)
|
||||
void zm_packetqueue::clearQueue(std::queue<AVPacket>& pktQueue)
|
||||
{
|
||||
while(!packetQueue.empty())
|
||||
while(!pktQueue.empty())
|
||||
{
|
||||
packetQueue.pop();
|
||||
pktQueue.pop();
|
||||
}
|
||||
}
|
||||
|
||||
void zm_packetqueue::clearQueues()
|
||||
{
|
||||
clearQueue(m_VideoQueue);
|
||||
clearQueue(m_AudioQueue);
|
||||
clearQueue(VideoQueue);
|
||||
clearQueue(AudioQueue);
|
||||
}
|
||||
|
||||
bool zm_packetqueue::popAudioPacket(AVPacket* packet)
|
||||
{
|
||||
return popPacket(m_AudioQueue, packet);
|
||||
return popPacket(AudioQueue, packet);
|
||||
}
|
||||
|
||||
bool zm_packetqueue::popVideoPacket(AVPacket* packet)
|
||||
{
|
||||
return popPacket(m_VideoQueue, packet);
|
||||
return popPacket(VideoQueue, packet);
|
||||
}
|
||||
|
||||
|
|
|
@ -31,19 +31,19 @@ public:
|
|||
zm_packetqueue();
|
||||
zm_packetqueue(const zm_packetqueue& orig);
|
||||
virtual ~zm_packetqueue();
|
||||
bool queuePacket(std::queue<AVPacket>& packetQueue, AVPacket* packet);
|
||||
bool queuePacket(std::queue<AVPacket>& pktQueue, AVPacket* packet);
|
||||
bool queueVideoPacket(AVPacket* packet);
|
||||
bool queueAudioPacket(AVPacket* packet);
|
||||
bool popPacket(std::queue<AVPacket>& packetQueue, AVPacket* packet);
|
||||
bool popPacket(std::queue<AVPacket>& pktQueue, AVPacket* packet);
|
||||
bool popVideoPacket(AVPacket* packet);
|
||||
bool popAudioPacket(AVPacket* packet);
|
||||
void clearQueues();
|
||||
void clearQueue(std::queue<AVPacket>& packetQueue);
|
||||
void clearQueue(std::queue<AVPacket>& pktQueue);
|
||||
private:
|
||||
int m_MaxVideoQueueSize;
|
||||
int m_MaxAudioQueueSize;
|
||||
std::queue<AVPacket> m_VideoQueue;
|
||||
std::queue<AVPacket> m_AudioQueue;
|
||||
int MaxVideoQueueSize;
|
||||
int MaxAudioQueueSize;
|
||||
std::queue<AVPacket> VideoQueue;
|
||||
std::queue<AVPacket> AudioQueue;
|
||||
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue