| /* |
| * 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_ |