Skip to content

Commit d855c1a

Browse files
Reverts r807 and fixes the real issue in the VCM.
This fixes an issue in the VCM where we don't wait for a packet to arrive if the jitter buffer is empty. This also fixes an issue where an old packet can trigger a packet event signal for a future frame. BUG= TEST= Review URL: http://webrtc-codereview.appspot.com/248001 git-svn-id: http://webrtc.googlecode.com/svn/trunk@814 4adac7df-926f-26a2-2b94-8c16560cd09d
1 parent bdb55c8 commit d855c1a

File tree

4 files changed

+22
-25
lines changed

4 files changed

+22
-25
lines changed

src/modules/video_coding/main/source/jitter_buffer.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@ VCMJitterBuffer::CompleteDecodableKeyFrameCriteria(VCMFrameBuffer* frame,
5454
const VCMFrameBufferStateEnum state = frame->GetState();
5555
// We can decode key frame or decodable/complete frames.
5656
return (frame->FrameType() == kVideoFrameKey) &&
57-
((state == kStateComplete)
58-
|| (state == kStateDecodable));
57+
(state == kStateComplete || state == kStateDecodable);
5958
}
6059

6160
// Constructor
@@ -889,7 +888,9 @@ VCMJitterBuffer::GetNextTimeStamp(WebRtc_UWord32 maxWaitTimeMS,
889888

890889
if (oldestFrame == NULL)
891890
{
891+
_packetEvent.Reset();
892892
_critSect.Leave();
893+
893894
if (_packetEvent.Wait(maxWaitTimeMS) == kEventSignaled)
894895
{
895896
// are we closing down the Jitter buffer
@@ -908,7 +909,6 @@ VCMJitterBuffer::GetNextTimeStamp(WebRtc_UWord32 maxWaitTimeMS,
908909
_critSect.Enter();
909910
}
910911
}
911-
_packetEvent.Reset();
912912

913913
if (oldestFrame == NULL)
914914
{

src/modules/video_coding/main/source/receiver.cc

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -241,38 +241,46 @@ VCMReceiver::FrameForDecoding(WebRtc_UWord16 maxWaitTimeMs,
241241
{
242242
// How long can we wait until we must decode the next frame
243243
WebRtc_UWord32 waitTimeMs = _timing.MaxWaitingTime(nextRenderTimeMs,
244-
VCMTickTime::MillisecondTimestamp());
244+
VCMTickTime::MillisecondTimestamp());
245245

246246
// Try to get a complete frame from the jitter buffer
247247
VCMEncodedFrame* frame = _jitterBuffer.GetCompleteFrameForDecoding(0);
248248

249249
if (frame == NULL && maxWaitTimeMs == 0 && waitTimeMs > 0)
250250
{
251-
// If we're not allowed to wait for frames to get complete we must calculate if
252-
// it's time to decode, and if it's not we will just return for now.
251+
// If we're not allowed to wait for frames to get complete we must
252+
// calculate if it's time to decode, and if it's not we will just return
253+
// for now.
253254
return NULL;
254255
}
255256

257+
if (frame == NULL && VCM_MIN(waitTimeMs, maxWaitTimeMs) == 0)
258+
{
259+
// No time to wait for a complete frame,
260+
// check if we have an incomplete
261+
frame = _jitterBuffer.GetFrameForDecoding();
262+
}
256263
if (frame == NULL)
257264
{
258265
// Wait for a complete frame
259-
waitTimeMs = VCM_MIN(waitTimeMs, maxWaitTimeMs);
260-
frame = _jitterBuffer.GetCompleteFrameForDecoding(waitTimeMs);
266+
frame = _jitterBuffer.GetCompleteFrameForDecoding(maxWaitTimeMs);
261267
}
262268
if (frame == NULL)
263269
{
264270
// Get an incomplete frame
265-
if (_timing.MaxWaitingTime(nextRenderTimeMs, VCMTickTime::MillisecondTimestamp()) > 0)
271+
if (_timing.MaxWaitingTime(nextRenderTimeMs,
272+
VCMTickTime::MillisecondTimestamp()) > 0)
266273
{
267274
// Still time to wait for a complete frame
268275
return NULL;
269276
}
270277

271278
// No time left to wait, we must decode this frame now.
272-
const bool dualReceiverEnabledAndPassive = dualReceiver != NULL &&
273-
dualReceiver->State() == kPassive &&
274-
dualReceiver->NackMode() == kNackInfinite;
275-
if (dualReceiverEnabledAndPassive && !_jitterBuffer.CompleteSequenceWithNextFrame())
279+
const bool dualReceiverEnabledAndPassive = (dualReceiver != NULL &&
280+
dualReceiver->State() == kPassive &&
281+
dualReceiver->NackMode() == kNackInfinite);
282+
if (dualReceiverEnabledAndPassive &&
283+
!_jitterBuffer.CompleteSequenceWithNextFrame())
276284
{
277285
// Jitter buffer state might get corrupt with this frame.
278286
dualReceiver->CopyJitterBufferStateFromReceiver(*this);

src/video_engine/main/source/vie_channel.cc

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
#include "vie_channel.h"
1616
#include "vie_defines.h"
1717
#include "critical_section_wrapper.h"
18-
#include "event_wrapper.h"
1918
#include "rtp_rtcp.h"
2019
#include "udp_transport.h"
2120
#include "video_coding.h"
@@ -37,7 +36,6 @@
3736

3837
namespace webrtc
3938
{
40-
static const int kDecoderThreadWaitPeriod = 3; // wait 3 ms
4139
// ----------------------------------------------------------------------------
4240
// Constructor
4341
// ----------------------------------------------------------------------------
@@ -77,7 +75,6 @@ ViEChannel::ViEChannel(WebRtc_Word32 channelId, WebRtc_Word32 engineId,
7775
_decoderReset(true),
7876
_waitForKeyFrame(false),
7977
_ptrDecodeThread(NULL),
80-
_vieDecodeEvent(*EventWrapper::Create()),
8178
_ptrSrtpModuleEncryption(NULL),
8279
_ptrSrtpModuleDecryption(NULL),
8380
_ptrExternalEncryption(NULL),
@@ -262,13 +259,11 @@ ViEChannel::~ViEChannel()
262259
RtpRtcp::DestroyRtpRtcp(rtpRtcp);
263260
_simulcastRtpRtcp.erase(it);
264261
}
265-
_vieDecodeEvent.Set();
266262
if (_ptrDecodeThread)
267263
{
268264
StopDecodeThread();
269265
}
270266

271-
delete &_vieDecodeEvent;
272267
delete &_vieReceiver;
273268
delete &_vieSender;
274269
delete &_vieSync;
@@ -3095,11 +3090,7 @@ bool ViEChannel::ChannelDecodeThreadFunction(void* obj)
30953090
bool ViEChannel::ChannelDecodeProcess()
30963091
{
30973092
// Decode is blocking, but sleep some time anyway to not get a spin
3098-
int ret = _vcm.Decode(50);
3099-
if (ret == VCM_FRAME_NOT_READY) {
3100-
// TODO (mikhal): Add trigger by incoming packet.
3101-
_vieDecodeEvent.Wait(kDecoderThreadWaitPeriod);
3102-
}
3093+
_vcm.Decode(50);
31033094

31043095
if ((TickTime::Now() - _vcmRTTReported).Milliseconds() > 1000)
31053096
{

src/video_engine/main/source/vie_channel.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ namespace webrtc
4242
{
4343
class CriticalSectionWrapper;
4444
class Encryption;
45-
class EventWrapper;
4645
class ProcessThread;
4746
class RtpRtcp;
4847
class ThreadWrapper;
@@ -472,7 +471,6 @@ class ViEChannel:
472471

473472
// Decoder
474473
ThreadWrapper* _ptrDecodeThread;
475-
EventWrapper& _vieDecodeEvent;
476474

477475
//SRTP - using seperate pointers for encryption and decryption to support
478476
// simultaneous operations.

0 commit comments

Comments
 (0)