Index: content/renderer/media/rtc_video_encoder.cc |
diff --git a/content/renderer/media/rtc_video_encoder.cc b/content/renderer/media/rtc_video_encoder.cc |
index 1b33fc54c90abe6881a48565c6d9fbb4aa58b513..5fdad0708bb32dca88be5e091aada1d50fbb754f 100644 |
--- a/content/renderer/media/rtc_video_encoder.cc |
+++ b/content/renderer/media/rtc_video_encoder.cc |
@@ -648,6 +648,20 @@ void RTCVideoEncoder::ReturnEncodedImage(scoped_ptr<webrtc::EncodedImage> image, |
if (!encoded_image_callback_) |
return; |
+ std::vector<int> offsets; |
+ size_t i; |
+ uint32 acc = 0; |
+ for (i = 0; i < image->_length; ++i) { |
+ acc = (acc << 8) | image->_buffer[i]; |
+ if ((acc & 0xffffff00) == 0x100) |
+ offsets.push_back(i); |
+ } |
+ |
+ // Generate a header describing a single fragment. |
+ webrtc::RTPFragmentationHeader header; |
+ memset(&header, 0, sizeof(header)); |
+ header.VerifyAndAllocateFragmentationHeader(offsets.size()); |
+ |
webrtc::CodecSpecificInfo info; |
memset(&info, 0, sizeof(info)); |
info.codecType = video_codec_type_; |
@@ -657,14 +671,15 @@ void RTCVideoEncoder::ReturnEncodedImage(scoped_ptr<webrtc::EncodedImage> image, |
info.codecSpecific.VP8.keyIdx = -1; |
} |
- // Generate a header describing a single fragment. |
- webrtc::RTPFragmentationHeader header; |
- memset(&header, 0, sizeof(header)); |
- header.VerifyAndAllocateFragmentationHeader(1); |
- header.fragmentationOffset[0] = 0; |
- header.fragmentationLength[0] = image->_length; |
- header.fragmentationPlType[0] = 0; |
- header.fragmentationTimeDiff[0] = 0; |
+ for (i = 0; i < offsets.size(); ++i) { |
+ uint32_t length = (i == offsets.size() - 1) ? |
+ (image->_length - offsets[i]) : (offsets[i + 1] - 4 - offsets[i]); |
+ |
+ header.fragmentationOffset[i] = offsets[i]; |
+ header.fragmentationLength[i] = length; |
+ header.fragmentationPlType[i] = 0; |
+ header.fragmentationTimeDiff[i] = 0; |
+ } |
int32_t retval = encoded_image_callback_->Encoded(*image, &info, &header); |
if (retval < 0) { |