summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/ScreenSharing/VP8Encoder.cpp')
-rw-r--r--Swiften/ScreenSharing/VP8Encoder.cpp22
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)