diff --git a/daemon/src/video/video_base.cpp b/daemon/src/video/video_base.cpp index f1b311a0b65623fba298464e5dc895e70ee67c89..4d34aafcf3a1f6144b6cb1a9b573cb93f6aef6de 100644 --- a/daemon/src/video/video_base.cpp +++ b/daemon/src/video/video_base.cpp @@ -40,9 +40,10 @@ namespace sfl_video { VideoPacket::VideoPacket() : packet_(0) { packet_ = static_cast<AVPacket *>(av_malloc(sizeof(AVPacket))); + av_init_packet(packet_); } -VideoPacket::~VideoPacket() { av_free_packet(packet_); } +VideoPacket::~VideoPacket() { av_free_packet(packet_); av_free(packet_); } /*=== VideoIOHandle =========================================================*/ @@ -57,7 +58,7 @@ VideoIOHandle::VideoIOHandle(ssize_t buffer_size, buf_ = static_cast<unsigned char *>(av_malloc(buffer_size)); ctx_ = avio_alloc_context(buf_, buffer_size, writeable, opaque, read_cb, write_cb, seek_cb); - //ctx_->max_packet_size = buffer_size; + ctx_->max_packet_size = buffer_size; } VideoIOHandle::~VideoIOHandle() { av_free(ctx_); av_free(buf_); } diff --git a/daemon/src/video/video_rtp_session.cpp b/daemon/src/video/video_rtp_session.cpp index e53804a2fd95c58256202ee438b9e310305fa2c1..40be08e5114608a25bcd07914cff28fe38854c67 100644 --- a/daemon/src/video/video_rtp_session.cpp +++ b/daemon/src/video/video_rtp_session.cpp @@ -181,8 +181,6 @@ void VideoRtpSession::forceKeyFrame() { if (sendThread_.get()) sendThread_->forceKeyFrame(); - else - ERROR("Video sending thread is NULL"); } void diff --git a/daemon/src/video/video_send_thread.cpp b/daemon/src/video/video_send_thread.cpp index 85597349529c81a54f495c5406c4973f605c6a6c..9233e60e7d72b39ca0a53fcfce036eec1df7728b 100644 --- a/daemon/src/video/video_send_thread.cpp +++ b/daemon/src/video/video_send_thread.cpp @@ -54,8 +54,8 @@ VideoSendThread::VideoSendThread(const std::map<string, string> &args) : , forceKeyFrame_(0) , thread_(0) , frameNumber_(0) - , muxContext_(0) , fromMixer_(false) + , muxContext_(0) {} VideoSendThread::~VideoSendThread() @@ -120,7 +120,7 @@ void VideoSendThread::setup() } EXIT_IF_FAIL(!videoEncoder_->openOutput(enc_name, "rtp", - args_["destination"].c_str(), NULL), + args_["destination"].c_str(), NULL), "encoder openOutput() failed"); videoEncoder_->setIOContext(muxContext_); EXIT_IF_FAIL(!videoEncoder_->startIO(), "encoder start failed"); @@ -160,28 +160,27 @@ void VideoSendThread::run() setup(); while (threadRunning_) { - encodeAndSendVideo(); + VideoFrame *frame = videoSource_->waitNewFrame().get(); + if (frame) + encodeAndSendVideo(frame); } delete videoEncoder_; if (muxContext_) delete muxContext_; + muxContext_ = nullptr; } -void VideoSendThread::encodeAndSendVideo() +void VideoSendThread::encodeAndSendVideo(VideoFrame *input_frame) { bool is_keyframe = forceKeyFrame_ > 0; if (is_keyframe) atomic_decrement(&forceKeyFrame_); - // Select frame source to encode - VideoFrame *inputframe = videoSource_->waitNewFrame().get(); - if (inputframe) { - EXIT_IF_FAIL(videoEncoder_->encode(*inputframe, is_keyframe, frameNumber_++) >= 0, - "encoding failed"); - } + EXIT_IF_FAIL(videoEncoder_->encode(*input_frame, is_keyframe, frameNumber_++) >= 0, + "encoding failed"); } void VideoSendThread::forceKeyFrame() diff --git a/daemon/src/video/video_send_thread.h b/daemon/src/video/video_send_thread.h index 57295c52044a578797780b8a4f179a524504960f..5fa57fc5f41e29d511d624b968981805dfa2dcf7 100644 --- a/daemon/src/video/video_send_thread.h +++ b/daemon/src/video/video_send_thread.h @@ -51,7 +51,7 @@ private: static int interruptCb(void *ctx); static void *runCallback(void *); void run(); - void encodeAndSendVideo(); + void encodeAndSendVideo(VideoFrame *); std::map<std::string, std::string> args_; /*-------------------------------------------------------------*/