Chromium Code Reviews| Index: webrtc/modules/video_coding/video_receiver.cc |
| diff --git a/webrtc/modules/video_coding/video_receiver.cc b/webrtc/modules/video_coding/video_receiver.cc |
| index 02c0da8f486286353f7813f232fe55bac7fd8aa9..02d51a7b900f93dba9a11088a125d052a2f91ded 100644 |
| --- a/webrtc/modules/video_coding/video_receiver.cc |
| +++ b/webrtc/modules/video_coding/video_receiver.cc |
| @@ -43,9 +43,10 @@ VideoReceiver::VideoReceiver(Clock* clock, EventFactory* event_factory) |
| #endif |
| _frameFromFile(), |
| _scheduleKeyRequest(false), |
| + drop_frames_until_keyframe_(false), |
| max_nack_list_size_(0), |
| - pre_decode_image_callback_(NULL), |
| _codecDataBase(nullptr, nullptr), |
| + pre_decode_image_callback_(NULL), |
| _receiveStatsTimer(1000, clock_), |
| _retransmissionTimer(10, clock_), |
| _keyRequestTimer(500, clock_) { |
| @@ -282,6 +283,19 @@ int32_t VideoReceiver::Decode(uint16_t maxWaitTimeMs) { |
| if (!frame) |
| return VCM_FRAME_NOT_READY; |
| + { |
| + CriticalSectionScoped cs(process_crit_sect_.get()); |
| + if (drop_frames_until_keyframe_) { |
| + // Still getting delta frames, schedule another keyframe request as if |
| + // decode failed. |
| + if (frame->FrameType() != kVideoFrameKey) { |
| + _scheduleKeyRequest = true; |
| + _receiver.ReleaseFrame(frame); |
| + return VCM_FRAME_NOT_READY; |
| + } |
| + drop_frames_until_keyframe_ = false; |
| + } |
| + } |
|
stefan-webrtc
2016/02/01 16:23:08
Should we instead make sure the jitter buffer does
pbos-webrtc
2016/02/02 13:25:12
Not obvious to me how to make the jitter buffer co
|
| CriticalSectionScoped cs(_receiveCritSect); |
| // If this frame was too late, we should adjust the delay accordingly |
| @@ -380,25 +394,6 @@ int32_t VideoReceiver::Decode(const VCMEncodedFrame& frame) { |
| return ret; |
| } |
| -// Reset the decoder state |
| -int32_t VideoReceiver::ResetDecoder() { |
| - bool reset_key_request = false; |
| - { |
| - CriticalSectionScoped cs(_receiveCritSect); |
| - if (_decoder != NULL) { |
| - _receiver.Reset(); |
| - _timing.Reset(); |
| - reset_key_request = true; |
| - _decoder->Reset(); |
| - } |
| - } |
| - if (reset_key_request) { |
| - CriticalSectionScoped cs(process_crit_sect_.get()); |
| - _scheduleKeyRequest = false; |
| - } |
| - return VCM_OK; |
| -} |
| - |
| // Register possible receive codecs, can be called multiple times |
| int32_t VideoReceiver::RegisterReceiveCodec(const VideoCodec* receiveCodec, |
| int32_t numberOfCores, |
| @@ -449,8 +444,11 @@ int32_t VideoReceiver::IncomingPacket(const uint8_t* incomingPayload, |
| // TODO(holmer): Investigate if this somehow should use the key frame |
| // request scheduling to throttle the requests. |
| if (ret == VCM_FLUSH_INDICATOR) { |
| + { |
| + CriticalSectionScoped process_cs(process_crit_sect_.get()); |
| + drop_frames_until_keyframe_ = true; |
| + } |
| RequestKeyFrame(); |
| - ResetDecoder(); |
| } else if (ret < 0) { |
| return ret; |
| } |