blob: 92a4de6d8fa56043be75536fc39763dde6ae25c1 [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:
int32_t SendH264(const FrameType frameType,
const int8_t payloadType,
const uint32_t captureTimeStamp,
const uint8_t* payloadData,
const uint32_t payloadSize,
H264Information& h264Information);
int32_t SendH264SVC(const FrameType frameType,
const int8_t payloadType,
const uint32_t captureTimeStamp,
const uint8_t* payloadData,
const uint32_t payloadSize,
H264Information& h264Information);
// H.264 AVC
int32_t SetH264PacketizationMode(const H264PacketizationMode mode);
int32_t SetH264SendModeNALU_PPS_SPS(const bool dontSend);
// H.264 SVC
int32_t SetHighestSendLayer(const uint8_t dependencyQualityLayer,
const uint8_t temporalLayer);
int32_t HighestSendLayer(uint8_t& dependencyQualityLayer,
uint8_t& temporalLayer);
protected:
RTPSenderH264(RTPSenderInterface* rtpSender);
virtual ~RTPSenderH264();
int32_t Init();
virtual uint16_t FECPacketOverhead() const = 0;
virtual RtpVideoCodecTypes VideoCodecType() const = 0;
virtual int32_t SendVideoPacket(const FrameType frameType,
const uint8_t* dataBuffer,
const uint16_t payloadLength,
const uint16_t rtpHeaderLength,
bool baseLayerVideoPacket=false) = 0;
bool SendH264SVCLayer(const FrameType frameType,
const uint8_t temporalID,
const uint8_t dependencyQualityID,
bool& higestLayer);
// H.264 SVC
int32_t AddH264PACSINALU(const bool firstPacketInNALU,
const bool lastPacketInNALU,
const H264_PACSI_NALU& paci,
const H264_SVC_NALUHeader& svc,
const uint16_t DONC,
uint8_t* databuffer,
int32_t& curByte) const;
int32_t SendH264FillerData(const WebRtcRTPHeader* rtpHeader,
const uint16_t bytesToSend,
const uint32_t ssrc);
int32_t SendH264FillerData(const uint32_t captureTimestamp,
const uint8_t payloadType,
const uint32_t bytesToSend);
int32_t SendH264SVCRelayPacket(const WebRtcRTPHeader* rtpHeader,
const uint8_t* incomingRTPPacket,
const uint16_t incomingRTPPacketSize,
const uint32_t ssrc,
const bool higestLayer);
int32_t SetH264RelaySequenceNumber(const uint16_t seqNum);
int32_t SetH264RelayCompleteLayer(const bool complete);
// H.264
H264PacketizationMode _h264Mode;
bool _h264SendPPS_SPS;
// H.264-SVC
int8_t _h264SVCPayloadType;
uint16_t _h264SVCRelaySequenceNumber;
uint32_t _h264SVCRelayTimeStamp;
bool _h264SVCRelayLayerComplete;
private:
// H.264
int32_t SendH264_SingleMode(const FrameType frameType,
const H264Info* ptrH264Info,
uint16_t &idxNALU,
const int8_t payloadType,
const uint32_t captureTimeStamp,
int32_t &payloadBytesToSend,
const uint8_t*& data,
const uint16_t rtpHeaderLength,
const bool sendSVCPACSI=false);
int32_t SendH264_FU_A(const FrameType frameType,
const H264Info* ptrH264Info,
uint16_t &idxNALU,
const int8_t payloadType,
const uint32_t captureTimeStamp,
int32_t &payloadBytesToSend,
const uint8_t*& data,
const uint16_t rtpHeaderLength,
const bool sendSVCPACSI = false);
int32_t SendH264_STAP_A(const FrameType frameType,
const H264Info* ptrH264Info,
uint16_t &idxNALU,
const int8_t payloadType,
const uint32_t captureTimeStamp,
bool& switchToFUA,
int32_t &payloadBytesToSend,
const uint8_t*& data,
const uint16_t rtpHeaderLength);
int32_t SendH264_STAP_A_PACSI(const FrameType frameType,
const H264Info* ptrH264Info,
uint16_t &idxNALU,
const int8_t payloadType,
const uint32_t captureTimeStamp,
bool& switchToFUA,
int32_t &payloadBytesToSend,
const uint8_t*& data,
const uint16_t rtpHeaderLengh)
int32_t SendH264_SinglePACSI(const FrameType frameType,
const H264Info* ptrH264Info,
const uint16_t idxNALU,
const int8_t payloadType,
const uint32_t captureTimeStamp,
const bool firstPacketInNALU,
const bool lastPacketInNALU);
bool AddH264SVCNALUHeader(const H264_SVC_NALUHeader& svc,
uint8_t* databuffer,
int32_t& curByte) const;
RTPSenderInterface& _rtpSender;
// relay
bool _useHighestSendLayer;
uint8_t _highestDependencyLayerOld;
uint8_t _highestDependencyQualityIDOld;
uint8_t _highestDependencyLayer;
uint8_t _highestDependencyQualityID;
uint8_t _highestTemporalLayer;
};
} // namespace webrtc
#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_H264_RTP_SENDER_H264_H_