From 58de0e056ba432d9eeb5f58413151b1656ed3170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Mon, 1 Apr 2019 14:13:13 -0400 Subject: [PATCH] media encoder: fix with Android' hardware encoding * initialize when sending first packet * avoid out of bound access Change-Id: I8dc02a851cf89a5ad704e5bd0ea65245085c6ef7 --- src/media/media_encoder.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/media/media_encoder.cpp b/src/media/media_encoder.cpp index 7d3a9be176..22bce401d9 100644 --- a/src/media/media_encoder.cpp +++ b/src/media/media_encoder.cpp @@ -463,7 +463,7 @@ MediaEncoder::encode(AVFrame* frame, int streamIdx) // Initialize on first video frame, or first audio frame if no video stream bool isVideo = (frame->width > 0 && frame->height > 0); if (isVideo or not videoOpts_.isValid()) { - initStream(videoCodec_, frame->hw_frames_ctx); + streamIdx = initStream(videoCodec_, frame->hw_frames_ctx); startIO(); } else { return 0; @@ -502,16 +502,22 @@ MediaEncoder::encode(AVFrame* frame, int streamIdx) bool MediaEncoder::send(AVPacket& pkt, int streamIdx) { + if (!initialized_) { + streamIdx = initStream(videoCodec_, nullptr); + startIO(); + } if (streamIdx < 0) streamIdx = currentStreamIdx_; - auto encoderCtx = encoders_[streamIdx]; - pkt.stream_index = streamIdx; - if (pkt.pts != AV_NOPTS_VALUE) - pkt.pts = av_rescale_q(pkt.pts, encoderCtx->time_base, - outputCtx_->streams[streamIdx]->time_base); - if (pkt.dts != AV_NOPTS_VALUE) - pkt.dts = av_rescale_q(pkt.dts, encoderCtx->time_base, - outputCtx_->streams[streamIdx]->time_base); + if (streamIdx >= 0 and streamIdx < encoders_.size()) { + auto encoderCtx = encoders_[streamIdx]; + pkt.stream_index = streamIdx; + if (pkt.pts != AV_NOPTS_VALUE) + pkt.pts = av_rescale_q(pkt.pts, encoderCtx->time_base, + outputCtx_->streams[streamIdx]->time_base); + if (pkt.dts != AV_NOPTS_VALUE) + pkt.dts = av_rescale_q(pkt.dts, encoderCtx->time_base, + outputCtx_->streams[streamIdx]->time_base); + } // write the compressed frame auto ret = av_write_frame(outputCtx_, &pkt); if (ret < 0) { -- GitLab