Chromium Code Reviews| 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..591c9cb9c04c10fe3ee52897b0918731ffa57d11 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 - 3); |
| + } |
| + |
| + // 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] - offsets[i]); |
| + |
| + header.fragmentationOffset[i] = offsets[i] + 3; |
| + header.fragmentationLength[0] = length - 3; |
|
Stefan
2014/08/07 19:17:27
Shouldn't this be header.fragmentationLength[i]
hshi1
2014/08/07 19:32:10
sorry for the typo, yes this should be [i] not [0]
|
| + header.fragmentationPlType[0] = 0; |
| + header.fragmentationTimeDiff[0] = 0; |
| + } |
| int32_t retval = encoded_image_callback_->Encoded(*image, &info, &header); |
| if (retval < 0) { |