rtsp: fix no keyframe being sent at start of stream (memory corruption)

This commit is contained in:
Kamil Trzcinski 2023-03-08 19:26:08 +01:00
parent 538955ee30
commit 1c806508f4

View File

@ -41,16 +41,21 @@ class DynamicH264Stream : public FramedSource
{ {
public: public:
DynamicH264Stream(UsageEnvironment& env) DynamicH264Stream(UsageEnvironment& env)
: FramedSource(env), fHaveStartedReading(False), locked_buf(NULL), locked_buf_offset(0) : FramedSource(env)
{ {
had_key_frame = false;
running = false;
requested_key_frame = false;
locked_buf = NULL;
locked_buf_offset = 0;
} }
void doGetNextFrame() void doGetNextFrame()
{ {
if (!fHaveStartedReading) { if (!running) {
std::unique_lock lk(rtsp_streams_lock); std::unique_lock lk(rtsp_streams_lock);
rtsp_streams.insert(this); rtsp_streams.insert(this);
fHaveStartedReading = True; running = True;
} }
if (send_buffer()) { if (send_buffer()) {
@ -60,10 +65,10 @@ public:
void doStopGettingFrames() void doStopGettingFrames()
{ {
if (fHaveStartedReading) { if (running) {
std::unique_lock lk(rtsp_streams_lock); std::unique_lock lk(rtsp_streams_lock);
rtsp_streams.erase(this); rtsp_streams.erase(this);
fHaveStartedReading = false; running = false;
} }
set_buffer(NULL); set_buffer(NULL);
@ -73,7 +78,7 @@ public:
{ {
std::unique_lock lk(lock); std::unique_lock lk(lock);
if (!fHaveStartedReading) { if (!running) {
return; return;
} }
@ -84,14 +89,14 @@ public:
return; return;
} }
if (!fHadKeyFrame) { if (!had_key_frame) {
fHadKeyFrame = buf->flags.is_keyframe; had_key_frame = buf->flags.is_keyframe;
} }
if (!fHadKeyFrame) { if (!had_key_frame) {
if (!fRequestedKeyFrame) { if (!requested_key_frame) {
device_video_force_key(buf->buf_list->dev); device_video_force_key(buf->buf_list->dev);
fRequestedKeyFrame = true; requested_key_frame = true;
} }
if (rtsp_options) { if (rtsp_options) {
rtsp_options->dropped++; rtsp_options->dropped++;
@ -147,9 +152,9 @@ public:
return true; return true;
} }
Boolean fHaveStartedReading; Boolean running;
Boolean fHadKeyFrame; Boolean had_key_frame;
Boolean fRequestedKeyFrame; Boolean requested_key_frame;
std::recursive_mutex lock; std::recursive_mutex lock;
buffer_t *locked_buf; buffer_t *locked_buf;