rtsp: fix no keyframe being sent at start of stream (memory corruption)
This commit is contained in:
parent
538955ee30
commit
1c806508f4
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user