blob: 564b8700de116d9de72e71b85f76abd8bd3cde3f [file] [log] [blame]
/*
* 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_