diff options
Diffstat (limited to 'Swiften/ScreenSharing/VP8Encoder.cpp')
-rw-r--r-- | Swiften/ScreenSharing/VP8Encoder.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/Swiften/ScreenSharing/VP8Encoder.cpp b/Swiften/ScreenSharing/VP8Encoder.cpp index 7a88418..c25e153 100644 --- a/Swiften/ScreenSharing/VP8Encoder.cpp +++ b/Swiften/ScreenSharing/VP8Encoder.cpp @@ -14,7 +14,7 @@ namespace Swift { VP8Encoder::VP8Encoder(VP8RTPPacketizer* packetizer, unsigned int width, unsigned int height) : VideoEncoder(), - packetizer(packetizer), codecInterface(vpx_codec_vp8_cx()), imageBuffer(0), codecFlags(0), frameFlags(0), frameNumber(0) + packetizer(packetizer), codecInterface(vpx_codec_vp8_cx()), imageBuffer(0), codecFlags(0), frameFlags(0), frameNumber(0), pictureID(0), rpsiReceived(true) { SWIFT_LOG(debug) << "VP8 Encoder:" << vpx_codec_iface_name(codecInterface) << std::endl; @@ -60,6 +60,10 @@ void VP8Encoder::updateCodecConfig() SWIFT_LOG(error) << "VP8 Encoder: Failed to allocate image" << std::endl; // TODO: exception } + + frameNumber = 0; + pictureID = rand() % 128; + rpsiReceived = true; } void VP8Encoder::encodeImage(const Image& frame) @@ -70,7 +74,12 @@ void VP8Encoder::encodeImage(const Image& frame) return; } - vpx_codec_err_t err = vpx_codec_encode(&codecContext, imageBuffer, frameNumber, 1, frameFlags, VPX_DL_REALTIME); + vpx_enc_frame_flags_t localFrameFlags = frameFlags; + if (!rpsiReceived && frameNumber > 1) { + localFrameFlags |= VP8_EFLAG_NO_REF_LAST; // VP8_EFLAG_FORCE_GF; // TODO: VP8_EFLAG_NO_REF_LAST; + } + + vpx_codec_err_t err = vpx_codec_encode(&codecContext, imageBuffer, frameNumber, 1, localFrameFlags, VPX_DL_REALTIME); if (err) { SWIFT_LOG(error) << "VP8 Encoder: Failed to encode frame, " << vpx_codec_err_to_string(err) << std::endl; // TODO: exception ? @@ -82,7 +91,7 @@ void VP8Encoder::encodeImage(const Image& frame) while ((pkt = vpx_codec_get_cx_data(&codecContext, &iter))) { switch (pkt->kind) { case VPX_CODEC_CX_FRAME_PKT: - packetizer->packetizeFrame(pkt); + packetizer->packetizeFrame(pkt, pictureID); break; default: break; @@ -90,6 +99,13 @@ void VP8Encoder::encodeImage(const Image& frame) } ++frameNumber; + pictureID = (pictureID + 1) % 128; + rpsiReceived = false; +} + +void VP8Encoder::handleRPSIFeedback(int /*pictureID*/) +{ + rpsiReceived = true; } bool VP8Encoder::convertRGB24toYV12inBuffer(const Image& frame) |