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 @@ -13,9 +13,9 @@ 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; // Populate encoder configuration @@ -59,8 +59,12 @@ void VP8Encoder::updateCodecConfig() if (!imageBuffer) { 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) { @@ -69,9 +73,14 @@ void VP8Encoder::encodeImage(const Image& frame) // TODO: exception ? 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 ? return; @@ -81,16 +90,23 @@ void VP8Encoder::encodeImage(const Image& frame) vpx_codec_iter_t iter = NULL; 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; } } ++frameNumber; + pictureID = (pictureID + 1) % 128; + rpsiReceived = false; +} + +void VP8Encoder::handleRPSIFeedback(int /*pictureID*/) +{ + rpsiReceived = true; } bool VP8Encoder::convertRGB24toYV12inBuffer(const Image& frame) { |
Swift