/* * Copyright (c) 2015 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. */ #include "modules/rtp_rtcp/source/rtp_format_vp9.h" #include <string.h> #include "api/video/video_codec_constants.h" #include "modules/rtp_rtcp/source/rtp_packet_to_send.h" #include "modules/rtp_rtcp/source/video_rtp_depacketizer_vp9.h" #include "modules/video_coding/codecs/interface/common_constants.h" #include "rtc_base/bit_buffer.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" #define RETURN_FALSE_ON_ERROR(x) … namespace webrtc { namespace { // Length of VP9 payload descriptors' fixed part. const size_t kFixedPayloadDescriptorBytes = …; const uint32_t kReservedBitValue0 = …; uint8_t TemporalIdxField(const RTPVideoHeaderVP9& hdr, uint8_t def) { … } uint8_t SpatialIdxField(const RTPVideoHeaderVP9& hdr, uint8_t def) { … } int16_t Tl0PicIdxField(const RTPVideoHeaderVP9& hdr, uint8_t def) { … } // Picture ID: // // +-+-+-+-+-+-+-+-+ // I: |M| PICTURE ID | M:0 => picture id is 7 bits. // +-+-+-+-+-+-+-+-+ M:1 => picture id is 15 bits. // M: | EXTENDED PID | // +-+-+-+-+-+-+-+-+ // size_t PictureIdLength(const RTPVideoHeaderVP9& hdr) { … } bool PictureIdPresent(const RTPVideoHeaderVP9& hdr) { … } // Layer indices: // // Flexible mode (F=1): Non-flexible mode (F=0): // // +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ // L: | T |U| S |D| | T |U| S |D| // +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ // | TL0PICIDX | // +-+-+-+-+-+-+-+-+ // size_t LayerInfoLength(const RTPVideoHeaderVP9& hdr) { … } bool LayerInfoPresent(const RTPVideoHeaderVP9& hdr) { … } // Reference indices: // // +-+-+-+-+-+-+-+-+ P=1,F=1: At least one reference index // P,F: | P_DIFF |N| up to 3 times has to be specified. // +-+-+-+-+-+-+-+-+ N=1: An additional P_DIFF follows // current P_DIFF. // size_t RefIndicesLength(const RTPVideoHeaderVP9& hdr) { … } // Scalability structure (SS). // // +-+-+-+-+-+-+-+-+ // V: | N_S |Y|G|-|-|-| // +-+-+-+-+-+-+-+-+ -| // Y: | WIDTH | (OPTIONAL) . // + + . // | | (OPTIONAL) . // +-+-+-+-+-+-+-+-+ . N_S + 1 times // | HEIGHT | (OPTIONAL) . // + + . // | | (OPTIONAL) . // +-+-+-+-+-+-+-+-+ -| // G: | N_G | (OPTIONAL) // +-+-+-+-+-+-+-+-+ -| // N_G: | T |U| R |-|-| (OPTIONAL) . // +-+-+-+-+-+-+-+-+ -| . N_G times // | P_DIFF | (OPTIONAL) . R times . // +-+-+-+-+-+-+-+-+ -| -| // size_t SsDataLength(const RTPVideoHeaderVP9& hdr) { … } size_t PayloadDescriptorLengthMinusSsData(const RTPVideoHeaderVP9& hdr) { … } // Picture ID: // // +-+-+-+-+-+-+-+-+ // I: |M| PICTURE ID | M:0 => picture id is 7 bits. // +-+-+-+-+-+-+-+-+ M:1 => picture id is 15 bits. // M: | EXTENDED PID | // +-+-+-+-+-+-+-+-+ // bool WritePictureId(const RTPVideoHeaderVP9& vp9, rtc::BitBufferWriter* writer) { … } // Layer indices: // // Flexible mode (F=1): // // +-+-+-+-+-+-+-+-+ // L: | T |U| S |D| // +-+-+-+-+-+-+-+-+ // bool WriteLayerInfoCommon(const RTPVideoHeaderVP9& vp9, rtc::BitBufferWriter* writer) { … } // Non-flexible mode (F=0): // // +-+-+-+-+-+-+-+-+ // L: | T |U| S |D| // +-+-+-+-+-+-+-+-+ // | TL0PICIDX | // +-+-+-+-+-+-+-+-+ // bool WriteLayerInfoNonFlexibleMode(const RTPVideoHeaderVP9& vp9, rtc::BitBufferWriter* writer) { … } bool WriteLayerInfo(const RTPVideoHeaderVP9& vp9, rtc::BitBufferWriter* writer) { … } // Reference indices: // // +-+-+-+-+-+-+-+-+ P=1,F=1: At least one reference index // P,F: | P_DIFF |N| up to 3 times has to be specified. // +-+-+-+-+-+-+-+-+ N=1: An additional P_DIFF follows // current P_DIFF. // bool WriteRefIndices(const RTPVideoHeaderVP9& vp9, rtc::BitBufferWriter* writer) { … } // Scalability structure (SS). // // +-+-+-+-+-+-+-+-+ // V: | N_S |Y|G|-|-|-| // +-+-+-+-+-+-+-+-+ -| // Y: | WIDTH | (OPTIONAL) . // + + . // | | (OPTIONAL) . // +-+-+-+-+-+-+-+-+ . N_S + 1 times // | HEIGHT | (OPTIONAL) . // + + . // | | (OPTIONAL) . // +-+-+-+-+-+-+-+-+ -| // G: | N_G | (OPTIONAL) // +-+-+-+-+-+-+-+-+ -| // N_G: | T |U| R |-|-| (OPTIONAL) . // +-+-+-+-+-+-+-+-+ -| . N_G times // | P_DIFF | (OPTIONAL) . R times . // +-+-+-+-+-+-+-+-+ -| -| // bool WriteSsData(const RTPVideoHeaderVP9& vp9, rtc::BitBufferWriter* writer) { … } // TODO(https://bugs.webrtc.org/11319): // Workaround for switching off spatial layers on the fly. // Sent layers must start from SL0 on RTP layer, but can start from any // spatial layer because WebRTC-SVC api isn't implemented yet and // current API to invoke SVC is not flexible enough. RTPVideoHeaderVP9 RemoveInactiveSpatialLayers( const RTPVideoHeaderVP9& original_header) { … } } // namespace RtpPacketizerVp9::RtpPacketizerVp9(rtc::ArrayView<const uint8_t> payload, PayloadSizeLimits limits, const RTPVideoHeaderVP9& hdr) : … { … } RtpPacketizerVp9::~RtpPacketizerVp9() = default; size_t RtpPacketizerVp9::NumPackets() const { … } bool RtpPacketizerVp9::NextPacket(RtpPacketToSend* packet) { … } // VP9 format: // // Payload descriptor for F = 1 (flexible mode) // 0 1 2 3 4 5 6 7 // +-+-+-+-+-+-+-+-+ // |I|P|L|F|B|E|V|Z| (REQUIRED) // +-+-+-+-+-+-+-+-+ // I: |M| PICTURE ID | (RECOMMENDED) // +-+-+-+-+-+-+-+-+ // M: | EXTENDED PID | (RECOMMENDED) // +-+-+-+-+-+-+-+-+ // L: | T |U| S |D| (CONDITIONALLY RECOMMENDED) // +-+-+-+-+-+-+-+-+ -| // P,F: | P_DIFF |N| (CONDITIONALLY RECOMMENDED) . up to 3 times // +-+-+-+-+-+-+-+-+ -| // V: | SS | // | .. | // +-+-+-+-+-+-+-+-+ // // Payload descriptor for F = 0 (non-flexible mode) // 0 1 2 3 4 5 6 7 // +-+-+-+-+-+-+-+-+ // |I|P|L|F|B|E|V|Z| (REQUIRED) // +-+-+-+-+-+-+-+-+ // I: |M| PICTURE ID | (RECOMMENDED) // +-+-+-+-+-+-+-+-+ // M: | EXTENDED PID | (RECOMMENDED) // +-+-+-+-+-+-+-+-+ // L: | T |U| S |D| (CONDITIONALLY RECOMMENDED) // +-+-+-+-+-+-+-+-+ // | TL0PICIDX | (CONDITIONALLY REQUIRED) // +-+-+-+-+-+-+-+-+ // V: | SS | // | .. | // +-+-+-+-+-+-+-+-+ bool RtpPacketizerVp9::WriteHeader(bool layer_begin, bool layer_end, rtc::ArrayView<uint8_t> buffer) const { … } } // namespace webrtc