| 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 047bb8c3faf39497dcb531c8cb8605b72dc9b318..c930a7cea7565f4854ef19b2e6b1e98b4084636c 100644
|
| --- a/content/renderer/media/rtc_video_encoder.cc
|
| +++ b/content/renderer/media/rtc_video_encoder.cc
|
| @@ -10,6 +10,7 @@
|
| #include "base/memory/scoped_vector.h"
|
| #include "base/message_loop/message_loop_proxy.h"
|
| #include "base/metrics/histogram.h"
|
| +#include "base/rand_util.h"
|
| #include "base/synchronization/waitable_event.h"
|
| #include "media/base/bitstream_buffer.h"
|
| #include "media/base/video_frame.h"
|
| @@ -152,6 +153,9 @@ class RTCVideoEncoder::Impl
|
| // encoder.
|
| int output_buffers_free_count_;
|
|
|
| + // 15 bits running index of the VP8 frames. See VP8 RTP spec for details.
|
| + uint16 picture_id_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(Impl);
|
| };
|
|
|
| @@ -167,6 +171,8 @@ RTCVideoEncoder::Impl::Impl(
|
| input_next_frame_keyframe_(false),
|
| output_buffers_free_count_(0) {
|
| thread_checker_.DetachFromThread();
|
| + // Picture ID should start on a random number.
|
| + picture_id_ = static_cast<uint16_t>(base::RandInt(0, 0x7FFF));
|
| }
|
|
|
| void RTCVideoEncoder::Impl::CreateAndInitializeVEA(
|
| @@ -378,7 +384,10 @@ void RTCVideoEncoder::Impl::BitstreamBufferReady(int32 bitstream_buffer_id,
|
| base::Bind(&RTCVideoEncoder::ReturnEncodedImage,
|
| weak_encoder_,
|
| base::Passed(&image),
|
| - bitstream_buffer_id));
|
| + bitstream_buffer_id,
|
| + picture_id_));
|
| + // Picture ID must wrap after reaching the maximum.
|
| + picture_id_ = (picture_id_ + 1) & 0x7FFF;
|
| }
|
|
|
| void RTCVideoEncoder::Impl::NotifyError(
|
| @@ -637,10 +646,12 @@ int32_t RTCVideoEncoder::SetRates(uint32_t new_bit_rate, uint32_t frame_rate) {
|
| }
|
|
|
| void RTCVideoEncoder::ReturnEncodedImage(scoped_ptr<webrtc::EncodedImage> image,
|
| - int32 bitstream_buffer_id) {
|
| + int32 bitstream_buffer_id,
|
| + uint16 picture_id) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DVLOG(3) << "ReturnEncodedImage(): "
|
| - "bitstream_buffer_id=" << bitstream_buffer_id;
|
| + << "bitstream_buffer_id=" << bitstream_buffer_id
|
| + << ", picture_id=" << picture_id;
|
|
|
| if (!encoded_image_callback_)
|
| return;
|
| @@ -649,7 +660,7 @@ void RTCVideoEncoder::ReturnEncodedImage(scoped_ptr<webrtc::EncodedImage> image,
|
| memset(&info, 0, sizeof(info));
|
| info.codecType = video_codec_type_;
|
| if (video_codec_type_ == webrtc::kVideoCodecVP8) {
|
| - info.codecSpecific.VP8.pictureId = -1;
|
| + info.codecSpecific.VP8.pictureId = picture_id;
|
| info.codecSpecific.VP8.tl0PicIdx = -1;
|
| info.codecSpecific.VP8.keyIdx = -1;
|
| }
|
|
|