zoneminder/src/zm_rtsp_server_frame.h

79 lines
2.3 KiB
C++

#ifndef ZM_RTSP_SERVER_FRAME_H
#define ZM_RTSP_SERVER_FRAME_H
#include "zm_config.h"
#include "zm_logger.h"
#include <cstring>
#include <sys/time.h>
#if HAVE_RTSP_SERVER
// ---------------------------------
// Captured frame
// ---------------------------------
const char H264marker[] = {0,0,0,1};
const char H264shortmarker[] = {0,0,1};
class NAL_Frame {
public:
NAL_Frame(unsigned char * buffer, size_t size, int64 pts) :
m_buffer(nullptr),
m_size(size),
m_pts(pts),
m_ref_count(1) {
m_buffer = new unsigned char[m_size];
if (buffer) {
memcpy(m_buffer, buffer, m_size);
}
};
NAL_Frame& operator=(const NAL_Frame&);
~NAL_Frame() {
delete[] m_buffer;
m_buffer = nullptr;
};
unsigned char *buffer() const { return m_buffer; };
// The buffer has a 32bit nal size value at the front, so if we want the nal, it's
// the address of the buffer plus 4 bytes.
unsigned char *nal() const { return m_buffer+4; };
size_t size() const { return m_size; };
size_t size(size_t new_size) { m_size=new_size; return m_size; };
size_t nal_size() const { return m_size-4; };
int64_t pts() const { return m_pts; };
bool check() const {
// Look for marker at beginning
unsigned char *marker = (unsigned char*)memmem(m_buffer, sizeof(H264marker), H264marker, sizeof(H264marker));
if ( marker ) {
Debug(1, "marker found at beginning");
return true;
} else {
marker = (unsigned char*)memmem(m_buffer, m_size, H264marker, sizeof(H264marker));
if ( marker ) {
Debug(1, "marker not found at beginning");
return false;
}
}
return false;
}
void debug() {
if ( m_size <= 4 ) {
Debug(1, "NAL: %d: %.2x %.2x %.2x %.2x", m_size,
m_buffer[0], m_buffer[1], m_buffer[2], m_buffer[3]);
} else {
Debug(1, "NAL: %d: %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x ", m_size,
m_buffer[0], m_buffer[1], m_buffer[2], m_buffer[3],
m_buffer[4], m_buffer[5], m_buffer[6], m_buffer[7]
);
}
}
private:
unsigned char* m_buffer;
size_t m_size;
public:
int64 m_pts;
private:
int m_ref_count;
};
#endif // HAVE_RTSP_SERVER
#endif // ZM_RTSP_SERVER_FRAME_H