210 lines
6.0 KiB
C
210 lines
6.0 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.
|
||
|
*/
|
||
|
|
||
|
#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_
|