git-svn-id: http://webrtc.googlecode.com/svn/trunk@4 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
209
modules/rtp_rtcp/source/rtp_utility.h
Normal file
209
modules/rtp_rtcp/source/rtp_utility.h
Normal file
@@ -0,0 +1,209 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_UTILITY_H_
|
||||
#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_UTILITY_H_
|
||||
|
||||
#include <cstddef> // size_t, ptrdiff_t
|
||||
|
||||
#include "typedefs.h"
|
||||
#include "rtp_rtcp_config.h"
|
||||
#include "rtp_rtcp_defines.h"
|
||||
|
||||
namespace webrtc {
|
||||
enum RtpVideoCodecTypes
|
||||
{
|
||||
kRtpNoVideo = 0,
|
||||
kRtpH263Video = 1,
|
||||
kRtpH2631998Video = 2,
|
||||
kRtpMpeg4Video = 5,
|
||||
kRtpFecVideo = 10,
|
||||
kRtpVp8Video = 11
|
||||
};
|
||||
|
||||
const WebRtc_UWord8 kRtpMarkerBitMask = 0x80;
|
||||
|
||||
namespace ModuleRTPUtility
|
||||
{
|
||||
struct AudioPayload
|
||||
{
|
||||
WebRtc_UWord32 frequency;
|
||||
WebRtc_UWord8 channels;
|
||||
WebRtc_UWord8 bitsPerSample;
|
||||
WebRtc_UWord32 rate;
|
||||
};
|
||||
struct VideoPayload
|
||||
{
|
||||
RtpVideoCodecTypes videoCodecType;
|
||||
WebRtc_UWord32 maxRate;
|
||||
};
|
||||
union PayloadUnion
|
||||
{
|
||||
AudioPayload Audio;
|
||||
VideoPayload Video;
|
||||
};
|
||||
struct Payload
|
||||
{
|
||||
WebRtc_Word8 name[RTP_PAYLOAD_NAME_SIZE];
|
||||
bool audio;
|
||||
PayloadUnion typeSpecific;
|
||||
};
|
||||
|
||||
WebRtc_Word32 CurrentNTP(WebRtc_UWord32& secs, WebRtc_UWord32& frac) ;
|
||||
|
||||
WebRtc_UWord32 CurrentRTP(WebRtc_UWord32 freq);
|
||||
|
||||
WebRtc_UWord32 pow2(WebRtc_UWord8 exp);
|
||||
|
||||
WebRtc_UWord32 GetTimeInMS();
|
||||
|
||||
WebRtc_UWord32 ConvertNTPTimeToMS(WebRtc_UWord32 NTPsec, WebRtc_UWord32 NTPfrac);
|
||||
|
||||
bool StringCompare(const WebRtc_Word8* str1 , const WebRtc_Word8* str2, const WebRtc_UWord32 length);
|
||||
|
||||
void AssignUWord32ToBuffer(WebRtc_UWord8* dataBuffer, WebRtc_UWord32 value);
|
||||
void AssignUWord24ToBuffer(WebRtc_UWord8* dataBuffer, WebRtc_UWord32 value);
|
||||
void AssignUWord16ToBuffer(WebRtc_UWord8* dataBuffer, WebRtc_UWord16 value);
|
||||
|
||||
/**
|
||||
* Converts a network-ordered two-byte input buffer to a host-ordered value.
|
||||
* \param[in] dataBuffer Network-ordered two-byte buffer to convert.
|
||||
* \return Host-ordered value.
|
||||
*/
|
||||
WebRtc_UWord16 BufferToUWord16(const WebRtc_UWord8* dataBuffer);
|
||||
|
||||
/**
|
||||
* Converts a network-ordered three-byte input buffer to a host-ordered value.
|
||||
* \param[in] dataBuffer Network-ordered three-byte buffer to convert.
|
||||
* \return Host-ordered value.
|
||||
*/
|
||||
WebRtc_UWord32 BufferToUWord24(const WebRtc_UWord8* dataBuffer);
|
||||
|
||||
/**
|
||||
* Converts a network-ordered four-byte input buffer to a host-ordered value.
|
||||
* \param[in] dataBuffer Network-ordered four-byte buffer to convert.
|
||||
* \return Host-ordered value.
|
||||
*/
|
||||
WebRtc_UWord32 BufferToUWord32(const WebRtc_UWord8* dataBuffer);
|
||||
|
||||
class RTPHeaderParser
|
||||
{
|
||||
public:
|
||||
RTPHeaderParser(const WebRtc_UWord8* rtpData,
|
||||
const WebRtc_UWord32 rtpDataLength);
|
||||
~RTPHeaderParser();
|
||||
|
||||
bool RTCP( ) const;
|
||||
bool Parse( WebRtcRTPHeader& parsedPacket) const;
|
||||
|
||||
private:
|
||||
const WebRtc_UWord8* const _ptrRTPDataBegin;
|
||||
const WebRtc_UWord8* const _ptrRTPDataEnd;
|
||||
};
|
||||
|
||||
enum FrameTypes
|
||||
{
|
||||
kIFrame, // key frame
|
||||
kPFrame // Delta frame
|
||||
};
|
||||
|
||||
struct RTPPayloadH263
|
||||
{
|
||||
// H.263 and H.263+
|
||||
bool hasPictureStartCode;
|
||||
bool insert2byteStartCode;
|
||||
bool hasPbit;
|
||||
WebRtc_UWord16 frameWidth;
|
||||
WebRtc_UWord16 frameHeight;
|
||||
|
||||
WebRtc_UWord8 endBits; // ignore last end bits
|
||||
WebRtc_UWord8 startBits; // ignore first bits
|
||||
|
||||
const WebRtc_UWord8* data;
|
||||
WebRtc_UWord16 dataLength;
|
||||
};
|
||||
|
||||
struct RTPPayloadMPEG4
|
||||
{
|
||||
// MPEG4
|
||||
bool isFirstPacket;
|
||||
const WebRtc_UWord8* data;
|
||||
WebRtc_UWord16 dataLength;
|
||||
};
|
||||
struct RTPPayloadVP8
|
||||
{
|
||||
bool beginningOfFrame;
|
||||
bool nonReferenceFrame;
|
||||
bool hasPictureID;
|
||||
bool fragments;
|
||||
bool startFragment;
|
||||
bool stopFragment;
|
||||
|
||||
const WebRtc_UWord8* data;
|
||||
WebRtc_UWord16 dataLength;
|
||||
};
|
||||
|
||||
union RTPPayloadUnion
|
||||
{
|
||||
RTPPayloadH263 H263;
|
||||
RTPPayloadMPEG4 MPEG4;
|
||||
RTPPayloadVP8 VP8;
|
||||
};
|
||||
|
||||
struct RTPPayload
|
||||
{
|
||||
void SetType(RtpVideoCodecTypes videoType);
|
||||
|
||||
RtpVideoCodecTypes type;
|
||||
FrameTypes frameType;
|
||||
RTPPayloadUnion info;
|
||||
};
|
||||
|
||||
// RTP payload parser
|
||||
class RTPPayloadParser
|
||||
{
|
||||
public:
|
||||
RTPPayloadParser(const RtpVideoCodecTypes payloadType,
|
||||
const WebRtc_UWord8* payloadData,
|
||||
const WebRtc_UWord16 payloadDataLength); // Length w/o padding.
|
||||
|
||||
~RTPPayloadParser();
|
||||
|
||||
bool Parse(RTPPayload& parsedPacket) const;
|
||||
|
||||
private:
|
||||
bool ParseGeneric(RTPPayload& parsedPacket) const;
|
||||
|
||||
bool ParseH263(RTPPayload& parsedPacket) const;
|
||||
bool ParseH2631998(RTPPayload& parsedPacket) const;
|
||||
|
||||
bool ParseMPEG4(RTPPayload& parsedPacket) const;
|
||||
|
||||
bool ParseVP8(RTPPayload& parsedPacket) const;
|
||||
|
||||
// H.263
|
||||
bool H263PictureStartCode(const WebRtc_UWord8* data,
|
||||
const bool skipFirst2bytes = false) const;
|
||||
|
||||
void GetH263FrameSize(const WebRtc_UWord8* inputVideoBuffer,
|
||||
WebRtc_UWord16& width,
|
||||
WebRtc_UWord16& height) const;
|
||||
|
||||
FrameTypes GetH263FrameType(const WebRtc_UWord8* inputVideoBuffer) const;
|
||||
|
||||
private:
|
||||
const WebRtc_UWord8* _dataPtr;
|
||||
const WebRtc_UWord16 _dataLength;
|
||||
const RtpVideoCodecTypes _videoType;
|
||||
};
|
||||
}
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_UTILITY_H_
|
||||
Reference in New Issue
Block a user