// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef REMOTING_PROTOCOL_RTP_UTILS_H_ #define REMOTING_PROTOCOL_RTP_UTILS_H_ #include "base/basictypes.h" namespace remoting { namespace protocol { struct RtpHeader { RtpHeader(); // RTP version is always set to 2. // version = 2 bool padding; bool extension; uint8 sources; bool marker; uint8 payload_type; uint16 sequence_number; uint32 timestamp; uint32 sync_source_id; uint32 source_id[15]; }; struct RtcpReceiverReport { RtcpReceiverReport(); uint32 receiver_ssrc; uint32 sender_ssrc; uint8 loss_fraction; // 8bit fixed point value in the interval [0..1]. uint32 total_lost_packets; uint32 last_sequence_number; uint32 jitter; uint32 last_sender_report_timestamp; uint32 last_sender_report_delay; }; // Vp8Descriptor struct used to store values of the VP8 RTP descriptor // fields. Meaning of each field is documented in the RTP Payload // Format for VP8 spec: http://www.webmproject.org/code/specs/rtp/ . struct Vp8Descriptor { enum FragmentationInfo { NOT_FRAGMENTED = 0, FIRST_FRAGMENT = 1, MIDDLE_FRAGMENT = 2, LAST_FRAGMENT = 3, }; Vp8Descriptor() : non_reference_frame(false), fragmentation_info(NOT_FRAGMENTED), frame_beginning(false), picture_id(kuint32max) { } bool non_reference_frame; uint8 fragmentation_info; bool frame_beginning; // PictureID is considered to be absent if |picture_id| is set to kuint32max. uint32 picture_id; }; // Returns size of RTP header for the specified number of sources. int GetRtpHeaderSize(const RtpHeader& header); // Packs RTP header into the buffer. void PackRtpHeader(const RtpHeader& header, uint8* buffer, int buffer_size); // Unpacks RTP header and stores unpacked values in |header|. int UnpackRtpHeader(const uint8* buffer, int buffer_size, RtpHeader* header); // Three following functions below are used to pack and unpack RTCP // Receiver Report packets. They implement only subset of RTCP that is // useful for chromoting. Particularly there are following // limitations: // // 1. Only one report per packet. There is always only one sender and // only one receiver in chromotocol session, so we never need to // have more than one report per packet. // 2. No RTCP Sender Report. Sender Reports are useful for streams // synchronization (e.g. audio/video syncronization), but it is // not needed for screencasts. // Returns size of RTCP Receiver Report packet. int GetRtcpReceiverReportSize(const RtcpReceiverReport& report); // Packs RTCP Receiver Report into the |buffer|. void PackRtcpReceiverReport(const RtcpReceiverReport& report, uint8* buffer, int buffer_size); // Unpack RTCP Receiver Report packet. If the packet is invalid // returns -1, othewise returns size of the data that was read from // the packet. int UnpackRtcpReceiverReport(const uint8* buffer, int buffer_size, RtcpReceiverReport* report); // Returns size of VP8 Payload Descriptor. int GetVp8DescriptorSize(const Vp8Descriptor& descriptor); // Packs VP8 Payload Descriptor into the |buffer|. void PackVp8Descriptor(const Vp8Descriptor& descriptor, uint8* buffer, int buffer_size); // Unpacks VP8 Payload Descriptor. If the descriptor is not valid // returns -1, otherwise returns size of the descriptor. int UnpackVp8Descriptor(const uint8* buffer, int buffer_size, Vp8Descriptor* descriptor); } // namespace protocol } // namespace remoting #endif // REMOTING_PROTOCOL_RTP_UTILS_H_