180 lines
7.8 KiB
C++
180 lines
7.8 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_H264_RTP_SENDER_H264_H_
|
|
#define WEBRTC_MODULES_RTP_RTCP_SOURCE_H264_RTP_SENDER_H264_H_
|
|
|
|
#include "typedefs.h"
|
|
#include "ModuleRTPRTCPConfig.h"
|
|
#include "rtp_rtcp_defines.h"
|
|
#include "h264_information.h"
|
|
|
|
#include "RTPSender.h"
|
|
|
|
namespace webrtc {
|
|
class RTPSenderH264
|
|
{
|
|
public:
|
|
WebRtc_Word32 SendH264(const FrameType frameType,
|
|
const WebRtc_Word8 payloadType,
|
|
const WebRtc_UWord32 captureTimeStamp,
|
|
const WebRtc_UWord8* payloadData,
|
|
const WebRtc_UWord32 payloadSize,
|
|
H264Information& h264Information);
|
|
|
|
WebRtc_Word32 SendH264SVC(const FrameType frameType,
|
|
const WebRtc_Word8 payloadType,
|
|
const WebRtc_UWord32 captureTimeStamp,
|
|
const WebRtc_UWord8* payloadData,
|
|
const WebRtc_UWord32 payloadSize,
|
|
H264Information& h264Information);
|
|
|
|
// H.264 AVC
|
|
WebRtc_Word32 SetH264PacketizationMode(const H264PacketizationMode mode);
|
|
|
|
WebRtc_Word32 SetH264SendModeNALU_PPS_SPS(const bool dontSend);
|
|
|
|
// H.264 SVC
|
|
WebRtc_Word32 SetHighestSendLayer(const WebRtc_UWord8 dependencyQualityLayer,
|
|
const WebRtc_UWord8 temporalLayer);
|
|
|
|
WebRtc_Word32 HighestSendLayer(WebRtc_UWord8& dependencyQualityLayer,
|
|
WebRtc_UWord8& temporalLayer);
|
|
|
|
protected:
|
|
RTPSenderH264(RTPSenderInterface* rtpSender);
|
|
virtual ~RTPSenderH264();
|
|
|
|
WebRtc_Word32 Init();
|
|
|
|
virtual WebRtc_UWord16 FECPacketOverhead() const = 0;
|
|
virtual RtpVideoCodecTypes VideoCodecType() const = 0;
|
|
|
|
virtual WebRtc_Word32 SendVideoPacket(const FrameType frameType,
|
|
const WebRtc_UWord8* dataBuffer,
|
|
const WebRtc_UWord16 payloadLength,
|
|
const WebRtc_UWord16 rtpHeaderLength,
|
|
bool baseLayerVideoPacket=false) = 0;
|
|
|
|
|
|
bool SendH264SVCLayer(const FrameType frameType,
|
|
const WebRtc_UWord8 temporalID,
|
|
const WebRtc_UWord8 dependencyQualityID,
|
|
bool& higestLayer);
|
|
|
|
// H.264 SVC
|
|
WebRtc_Word32 AddH264PACSINALU(const bool firstPacketInNALU,
|
|
const bool lastPacketInNALU,
|
|
const H264_PACSI_NALU& paci,
|
|
const H264_SVC_NALUHeader& svc,
|
|
const WebRtc_UWord16 DONC,
|
|
WebRtc_UWord8* databuffer,
|
|
WebRtc_Word32& curByte) const;
|
|
|
|
WebRtc_Word32 SendH264FillerData(const WebRtcRTPHeader* rtpHeader,
|
|
const WebRtc_UWord16 bytesToSend,
|
|
const WebRtc_UWord32 ssrc);
|
|
|
|
WebRtc_Word32 SendH264FillerData(const WebRtc_UWord32 captureTimestamp,
|
|
const WebRtc_UWord8 payloadType,
|
|
const WebRtc_UWord32 bytesToSend);
|
|
|
|
WebRtc_Word32 SendH264SVCRelayPacket(const WebRtcRTPHeader* rtpHeader,
|
|
const WebRtc_UWord8* incomingRTPPacket,
|
|
const WebRtc_UWord16 incomingRTPPacketSize,
|
|
const WebRtc_UWord32 ssrc,
|
|
const bool higestLayer);
|
|
|
|
WebRtc_Word32 SetH264RelaySequenceNumber(const WebRtc_UWord16 seqNum);
|
|
|
|
WebRtc_Word32 SetH264RelayCompleteLayer(const bool complete);
|
|
|
|
// H.264
|
|
H264PacketizationMode _h264Mode;
|
|
bool _h264SendPPS_SPS;
|
|
|
|
// H.264-SVC
|
|
WebRtc_Word8 _h264SVCPayloadType;
|
|
WebRtc_UWord16 _h264SVCRelaySequenceNumber;
|
|
WebRtc_UWord32 _h264SVCRelayTimeStamp;
|
|
bool _h264SVCRelayLayerComplete;
|
|
|
|
|
|
private:
|
|
// H.264
|
|
WebRtc_Word32 SendH264_SingleMode(const FrameType frameType,
|
|
const H264Info* ptrH264Info,
|
|
WebRtc_UWord16 &idxNALU,
|
|
const WebRtc_Word8 payloadType,
|
|
const WebRtc_UWord32 captureTimeStamp,
|
|
WebRtc_Word32 &payloadBytesToSend,
|
|
const WebRtc_UWord8*& data,
|
|
const WebRtc_UWord16 rtpHeaderLength,
|
|
const bool sendSVCPACSI=false);
|
|
|
|
WebRtc_Word32 SendH264_FU_A(const FrameType frameType,
|
|
const H264Info* ptrH264Info,
|
|
WebRtc_UWord16 &idxNALU,
|
|
const WebRtc_Word8 payloadType,
|
|
const WebRtc_UWord32 captureTimeStamp,
|
|
WebRtc_Word32 &payloadBytesToSend,
|
|
const WebRtc_UWord8*& data,
|
|
const WebRtc_UWord16 rtpHeaderLength,
|
|
const bool sendSVCPACSI = false);
|
|
|
|
WebRtc_Word32 SendH264_STAP_A(const FrameType frameType,
|
|
const H264Info* ptrH264Info,
|
|
WebRtc_UWord16 &idxNALU,
|
|
const WebRtc_Word8 payloadType,
|
|
const WebRtc_UWord32 captureTimeStamp,
|
|
bool& switchToFUA,
|
|
WebRtc_Word32 &payloadBytesToSend,
|
|
const WebRtc_UWord8*& data,
|
|
const WebRtc_UWord16 rtpHeaderLength);
|
|
|
|
WebRtc_Word32 SendH264_STAP_A_PACSI(const FrameType frameType,
|
|
const H264Info* ptrH264Info,
|
|
WebRtc_UWord16 &idxNALU,
|
|
const WebRtc_Word8 payloadType,
|
|
const WebRtc_UWord32 captureTimeStamp,
|
|
bool& switchToFUA,
|
|
WebRtc_Word32 &payloadBytesToSend,
|
|
const WebRtc_UWord8*& data,
|
|
const WebRtc_UWord16 rtpHeaderLengh)
|
|
|
|
WebRtc_Word32 SendH264_SinglePACSI(const FrameType frameType,
|
|
const H264Info* ptrH264Info,
|
|
const WebRtc_UWord16 idxNALU,
|
|
const WebRtc_Word8 payloadType,
|
|
const WebRtc_UWord32 captureTimeStamp,
|
|
const bool firstPacketInNALU,
|
|
const bool lastPacketInNALU);
|
|
|
|
bool AddH264SVCNALUHeader(const H264_SVC_NALUHeader& svc,
|
|
WebRtc_UWord8* databuffer,
|
|
WebRtc_Word32& curByte) const;
|
|
|
|
RTPSenderInterface& _rtpSender;
|
|
|
|
// relay
|
|
bool _useHighestSendLayer;
|
|
WebRtc_UWord8 _highestDependencyLayerOld;
|
|
WebRtc_UWord8 _highestDependencyQualityIDOld;
|
|
WebRtc_UWord8 _highestDependencyLayer;
|
|
WebRtc_UWord8 _highestDependencyQualityID;
|
|
WebRtc_UWord8 _highestTemporalLayer;
|
|
|
|
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_H264_RTP_SENDER_H264_H_
|