
This change adds support for VP8 partitions in the video jitter buffer and the VP8 encoder and decoder wrappers. The feature is currently disabled by default since it requires a later version of libvpx. With this change the jitter buffer will also start keeping track of each packet header until decoding, and the VCMSessionInfo and VCMPacket objects will keep pointers into the encoded frame buffers. Review URL: http://webrtc-codereview.appspot.com/137021 git-svn-id: http://webrtc.googlecode.com/svn/trunk@558 4adac7df-926f-26a2-2b94-8c16560cd09d
124 lines
3.3 KiB
C++
124 lines
3.3 KiB
C++
/*
|
|
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "packet.h"
|
|
#include "module_common_types.h"
|
|
|
|
#include <assert.h>
|
|
|
|
namespace webrtc {
|
|
|
|
VCMPacket::VCMPacket()
|
|
:
|
|
payloadType(0),
|
|
timestamp(0),
|
|
seqNum(0),
|
|
dataPtr(NULL),
|
|
sizeBytes(0),
|
|
markerBit(false),
|
|
frameType(kFrameEmpty),
|
|
codec(kVideoCodecUnknown),
|
|
isFirstPacket(false),
|
|
completeNALU(kNaluUnset),
|
|
insertStartCode(false),
|
|
bits(false),
|
|
codecSpecificHeader() {
|
|
}
|
|
|
|
VCMPacket::VCMPacket(const WebRtc_UWord8* ptr,
|
|
const WebRtc_UWord32 size,
|
|
const WebRtcRTPHeader& rtpHeader) :
|
|
payloadType(rtpHeader.header.payloadType),
|
|
timestamp(rtpHeader.header.timestamp),
|
|
seqNum(rtpHeader.header.sequenceNumber),
|
|
dataPtr(ptr),
|
|
sizeBytes(size),
|
|
markerBit(rtpHeader.header.markerBit),
|
|
|
|
frameType(rtpHeader.frameType),
|
|
codec(kVideoCodecUnknown),
|
|
isFirstPacket(rtpHeader.type.Video.isFirstPacket),
|
|
completeNALU(kNaluComplete),
|
|
insertStartCode(false),
|
|
bits(false),
|
|
codecSpecificHeader(rtpHeader.type.Video)
|
|
{
|
|
CopyCodecSpecifics(rtpHeader.type.Video);
|
|
}
|
|
|
|
VCMPacket::VCMPacket(const WebRtc_UWord8* ptr, WebRtc_UWord32 size, WebRtc_UWord16 seq, WebRtc_UWord32 ts, bool mBit) :
|
|
payloadType(0),
|
|
timestamp(ts),
|
|
seqNum(seq),
|
|
dataPtr(ptr),
|
|
sizeBytes(size),
|
|
markerBit(mBit),
|
|
|
|
frameType(kVideoFrameDelta),
|
|
codec(kVideoCodecUnknown),
|
|
isFirstPacket(false),
|
|
completeNALU(kNaluComplete),
|
|
insertStartCode(false),
|
|
bits(false),
|
|
codecSpecificHeader()
|
|
{}
|
|
|
|
void VCMPacket::Reset() {
|
|
payloadType = 0;
|
|
timestamp = 0;
|
|
seqNum = 0;
|
|
dataPtr = NULL;
|
|
sizeBytes = 0;
|
|
markerBit = false;
|
|
frameType = kFrameEmpty;
|
|
codec = kVideoCodecUnknown;
|
|
isFirstPacket = false;
|
|
completeNALU = kNaluUnset;
|
|
insertStartCode = false;
|
|
bits = false;
|
|
memset(&codecSpecificHeader, 0, sizeof(RTPVideoHeader));
|
|
}
|
|
|
|
void VCMPacket::CopyCodecSpecifics(const RTPVideoHeader& videoHeader)
|
|
{
|
|
switch(videoHeader.codec)
|
|
{
|
|
case kRTPVideoVP8:
|
|
{
|
|
// Handle all packets within a frame as depending on the previous packet
|
|
// TODO(holmer): This should be changed to make fragments independent
|
|
// when the VP8 RTP receiver supports fragments.
|
|
if (isFirstPacket && markerBit)
|
|
completeNALU = kNaluComplete;
|
|
else if (isFirstPacket)
|
|
completeNALU = kNaluStart;
|
|
else if (markerBit)
|
|
completeNALU = kNaluEnd;
|
|
else
|
|
completeNALU = kNaluIncomplete;
|
|
|
|
codec = kVideoCodecVP8;
|
|
break;
|
|
}
|
|
case kRTPVideoI420:
|
|
{
|
|
codec = kVideoCodecI420;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
codec = kVideoCodecUnknown;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|