diff options
Diffstat (limited to 'third_party/libwebrtc/modules/rtp_rtcp/source/rtp_format_h264.h')
-rw-r--r-- | third_party/libwebrtc/modules/rtp_rtcp/source/rtp_format_h264.h | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_format_h264.h b/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_format_h264.h new file mode 100644 index 0000000000..f95c3b6c6b --- /dev/null +++ b/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_format_h264.h @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2014 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 MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_H264_H_ +#define MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_H264_H_ + +#include <stddef.h> +#include <stdint.h> + +#include <deque> +#include <memory> +#include <queue> + +#include "api/array_view.h" +#include "modules/rtp_rtcp/source/rtp_format.h" +#include "modules/rtp_rtcp/source/rtp_packet_to_send.h" +#include "modules/video_coding/codecs/h264/include/h264_globals.h" +#include "rtc_base/buffer.h" + +namespace webrtc { + +// Bit masks for NAL (F, NRI, Type) indicators. +constexpr uint8_t kH264FBit = 0x80; +constexpr uint8_t kH264NriMask = 0x60; +constexpr uint8_t kH264TypeMask = 0x1F; + +// Bit masks for FU (A and B) headers. +constexpr uint8_t kH264SBit = 0x80; +constexpr uint8_t kH264EBit = 0x40; +constexpr uint8_t kH264RBit = 0x20; + +class RtpPacketizerH264 : public RtpPacketizer { + public: + // Initialize with payload from encoder. + // The payload_data must be exactly one encoded H264 frame. + RtpPacketizerH264(rtc::ArrayView<const uint8_t> payload, + PayloadSizeLimits limits, + H264PacketizationMode packetization_mode); + + ~RtpPacketizerH264() override; + + RtpPacketizerH264(const RtpPacketizerH264&) = delete; + RtpPacketizerH264& operator=(const RtpPacketizerH264&) = delete; + + size_t NumPackets() const override; + + // Get the next payload with H264 payload header. + // Write payload and set marker bit of the `packet`. + // Returns true on success, false otherwise. + bool NextPacket(RtpPacketToSend* rtp_packet) override; + + private: + // A packet unit (H264 packet), to be put into an RTP packet: + // If a NAL unit is too large for an RTP packet, this packet unit will + // represent a FU-A packet of a single fragment of the NAL unit. + // If a NAL unit is small enough to fit within a single RTP packet, this + // packet unit may represent a single NAL unit or a STAP-A packet, of which + // there may be multiple in a single RTP packet (if so, aggregated = true). + struct PacketUnit { + PacketUnit(rtc::ArrayView<const uint8_t> source_fragment, + bool first_fragment, + bool last_fragment, + bool aggregated, + uint8_t header) + : source_fragment(source_fragment), + first_fragment(first_fragment), + last_fragment(last_fragment), + aggregated(aggregated), + header(header) {} + + rtc::ArrayView<const uint8_t> source_fragment; + bool first_fragment; + bool last_fragment; + bool aggregated; + uint8_t header; + }; + + bool GeneratePackets(H264PacketizationMode packetization_mode); + bool PacketizeFuA(size_t fragment_index); + size_t PacketizeStapA(size_t fragment_index); + bool PacketizeSingleNalu(size_t fragment_index); + + void NextAggregatePacket(RtpPacketToSend* rtp_packet); + void NextFragmentPacket(RtpPacketToSend* rtp_packet); + + const PayloadSizeLimits limits_; + size_t num_packets_left_; + std::deque<rtc::ArrayView<const uint8_t>> input_fragments_; + std::queue<PacketUnit> packets_; +}; +} // namespace webrtc +#endif // MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_H264_H_ |