1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * RTMP packet utilities 3cabdff1aSopenharmony_ci * Copyright (c) 2009 Konstantin Shishkov 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#ifndef AVFORMAT_RTMPPKT_H 23cabdff1aSopenharmony_ci#define AVFORMAT_RTMPPKT_H 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#include "libavcodec/bytestream.h" 26cabdff1aSopenharmony_ci#include "avformat.h" 27cabdff1aSopenharmony_ci#include "url.h" 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci/** maximum possible number of different RTMP channels */ 30cabdff1aSopenharmony_ci#define RTMP_CHANNELS 65599 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci/** 33cabdff1aSopenharmony_ci * channels used to for RTMP packets with different purposes (i.e. data, network 34cabdff1aSopenharmony_ci * control, remote procedure calls, etc.) 35cabdff1aSopenharmony_ci */ 36cabdff1aSopenharmony_cienum RTMPChannel { 37cabdff1aSopenharmony_ci RTMP_NETWORK_CHANNEL = 2, ///< channel for network-related messages (bandwidth report, ping, etc) 38cabdff1aSopenharmony_ci RTMP_SYSTEM_CHANNEL, ///< channel for sending server control messages 39cabdff1aSopenharmony_ci RTMP_AUDIO_CHANNEL, ///< channel for audio data 40cabdff1aSopenharmony_ci RTMP_VIDEO_CHANNEL = 6, ///< channel for video data 41cabdff1aSopenharmony_ci RTMP_SOURCE_CHANNEL = 8, ///< channel for a/v invokes 42cabdff1aSopenharmony_ci}; 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci/** 45cabdff1aSopenharmony_ci * known RTMP packet types 46cabdff1aSopenharmony_ci */ 47cabdff1aSopenharmony_citypedef enum RTMPPacketType { 48cabdff1aSopenharmony_ci RTMP_PT_CHUNK_SIZE = 1, ///< chunk size change 49cabdff1aSopenharmony_ci RTMP_PT_BYTES_READ = 3, ///< number of bytes read 50cabdff1aSopenharmony_ci RTMP_PT_USER_CONTROL, ///< user control 51cabdff1aSopenharmony_ci RTMP_PT_WINDOW_ACK_SIZE, ///< window acknowledgement size 52cabdff1aSopenharmony_ci RTMP_PT_SET_PEER_BW, ///< peer bandwidth 53cabdff1aSopenharmony_ci RTMP_PT_AUDIO = 8, ///< audio packet 54cabdff1aSopenharmony_ci RTMP_PT_VIDEO, ///< video packet 55cabdff1aSopenharmony_ci RTMP_PT_FLEX_STREAM = 15, ///< Flex shared stream 56cabdff1aSopenharmony_ci RTMP_PT_FLEX_OBJECT, ///< Flex shared object 57cabdff1aSopenharmony_ci RTMP_PT_FLEX_MESSAGE, ///< Flex shared message 58cabdff1aSopenharmony_ci RTMP_PT_NOTIFY, ///< some notification 59cabdff1aSopenharmony_ci RTMP_PT_SHARED_OBJ, ///< shared object 60cabdff1aSopenharmony_ci RTMP_PT_INVOKE, ///< invoke some stream action 61cabdff1aSopenharmony_ci RTMP_PT_METADATA = 22, ///< FLV metadata 62cabdff1aSopenharmony_ci} RTMPPacketType; 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci/** 65cabdff1aSopenharmony_ci * possible RTMP packet header sizes 66cabdff1aSopenharmony_ci */ 67cabdff1aSopenharmony_cienum RTMPPacketSize { 68cabdff1aSopenharmony_ci RTMP_PS_TWELVEBYTES = 0, ///< packet has 12-byte header 69cabdff1aSopenharmony_ci RTMP_PS_EIGHTBYTES, ///< packet has 8-byte header 70cabdff1aSopenharmony_ci RTMP_PS_FOURBYTES, ///< packet has 4-byte header 71cabdff1aSopenharmony_ci RTMP_PS_ONEBYTE ///< packet is really a next chunk of a packet 72cabdff1aSopenharmony_ci}; 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci/** 75cabdff1aSopenharmony_ci * structure for holding RTMP packets 76cabdff1aSopenharmony_ci */ 77cabdff1aSopenharmony_citypedef struct RTMPPacket { 78cabdff1aSopenharmony_ci int channel_id; ///< RTMP channel ID (nothing to do with audio/video channels though) 79cabdff1aSopenharmony_ci RTMPPacketType type; ///< packet payload type 80cabdff1aSopenharmony_ci uint32_t timestamp; ///< packet full timestamp 81cabdff1aSopenharmony_ci uint32_t ts_field; ///< 24-bit timestamp or increment to the previous one, in milliseconds (latter only for media packets). Clipped to a maximum of 0xFFFFFF, indicating an extended timestamp field. 82cabdff1aSopenharmony_ci uint32_t extra; ///< probably an additional channel ID used during streaming data 83cabdff1aSopenharmony_ci uint8_t *data; ///< packet payload 84cabdff1aSopenharmony_ci int size; ///< packet payload size 85cabdff1aSopenharmony_ci int offset; ///< amount of data read so far 86cabdff1aSopenharmony_ci int read; ///< amount read, including headers 87cabdff1aSopenharmony_ci} RTMPPacket; 88cabdff1aSopenharmony_ci 89cabdff1aSopenharmony_ci/** 90cabdff1aSopenharmony_ci * Create new RTMP packet with given attributes. 91cabdff1aSopenharmony_ci * 92cabdff1aSopenharmony_ci * @param pkt packet 93cabdff1aSopenharmony_ci * @param channel_id packet channel ID 94cabdff1aSopenharmony_ci * @param type packet type 95cabdff1aSopenharmony_ci * @param timestamp packet timestamp 96cabdff1aSopenharmony_ci * @param size packet size 97cabdff1aSopenharmony_ci * @return zero on success, negative value otherwise 98cabdff1aSopenharmony_ci */ 99cabdff1aSopenharmony_ciint ff_rtmp_packet_create(RTMPPacket *pkt, int channel_id, RTMPPacketType type, 100cabdff1aSopenharmony_ci int timestamp, int size); 101cabdff1aSopenharmony_ci 102cabdff1aSopenharmony_ci/** 103cabdff1aSopenharmony_ci * Free RTMP packet. 104cabdff1aSopenharmony_ci * 105cabdff1aSopenharmony_ci * @param pkt packet 106cabdff1aSopenharmony_ci */ 107cabdff1aSopenharmony_civoid ff_rtmp_packet_destroy(RTMPPacket *pkt); 108cabdff1aSopenharmony_ci 109cabdff1aSopenharmony_ci/** 110cabdff1aSopenharmony_ci * Read RTMP packet sent by the server. 111cabdff1aSopenharmony_ci * 112cabdff1aSopenharmony_ci * @param h reader context 113cabdff1aSopenharmony_ci * @param p packet 114cabdff1aSopenharmony_ci * @param chunk_size current chunk size 115cabdff1aSopenharmony_ci * @param prev_pkt previously read packet headers for all channels 116cabdff1aSopenharmony_ci * (may be needed for restoring incomplete packet header) 117cabdff1aSopenharmony_ci * @param nb_prev_pkt number of allocated elements in prev_pkt 118cabdff1aSopenharmony_ci * @return number of bytes read on success, negative value otherwise 119cabdff1aSopenharmony_ci */ 120cabdff1aSopenharmony_ciint ff_rtmp_packet_read(URLContext *h, RTMPPacket *p, 121cabdff1aSopenharmony_ci int chunk_size, RTMPPacket **prev_pkt, 122cabdff1aSopenharmony_ci int *nb_prev_pkt); 123cabdff1aSopenharmony_ci/** 124cabdff1aSopenharmony_ci * Read internal RTMP packet sent by the server. 125cabdff1aSopenharmony_ci * 126cabdff1aSopenharmony_ci * @param h reader context 127cabdff1aSopenharmony_ci * @param p packet 128cabdff1aSopenharmony_ci * @param chunk_size current chunk size 129cabdff1aSopenharmony_ci * @param prev_pkt previously read packet headers for all channels 130cabdff1aSopenharmony_ci * (may be needed for restoring incomplete packet header) 131cabdff1aSopenharmony_ci * @param nb_prev_pkt number of allocated elements in prev_pkt 132cabdff1aSopenharmony_ci * @param c the first byte already read 133cabdff1aSopenharmony_ci * @return number of bytes read on success, negative value otherwise 134cabdff1aSopenharmony_ci */ 135cabdff1aSopenharmony_ciint ff_rtmp_packet_read_internal(URLContext *h, RTMPPacket *p, int chunk_size, 136cabdff1aSopenharmony_ci RTMPPacket **prev_pkt, int *nb_prev_pkt, 137cabdff1aSopenharmony_ci uint8_t c); 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci/** 140cabdff1aSopenharmony_ci * Send RTMP packet to the server. 141cabdff1aSopenharmony_ci * 142cabdff1aSopenharmony_ci * @param h reader context 143cabdff1aSopenharmony_ci * @param p packet to send 144cabdff1aSopenharmony_ci * @param chunk_size current chunk size 145cabdff1aSopenharmony_ci * @param prev_pkt previously sent packet headers for all channels 146cabdff1aSopenharmony_ci * (may be used for packet header compressing) 147cabdff1aSopenharmony_ci * @param nb_prev_pkt number of allocated elements in prev_pkt 148cabdff1aSopenharmony_ci * @return number of bytes written on success, negative value otherwise 149cabdff1aSopenharmony_ci */ 150cabdff1aSopenharmony_ciint ff_rtmp_packet_write(URLContext *h, RTMPPacket *p, 151cabdff1aSopenharmony_ci int chunk_size, RTMPPacket **prev_pkt, 152cabdff1aSopenharmony_ci int *nb_prev_pkt); 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_ci/** 155cabdff1aSopenharmony_ci * Print information and contents of RTMP packet. 156cabdff1aSopenharmony_ci * 157cabdff1aSopenharmony_ci * @param ctx output context 158cabdff1aSopenharmony_ci * @param p packet to dump 159cabdff1aSopenharmony_ci */ 160cabdff1aSopenharmony_civoid ff_rtmp_packet_dump(void *ctx, RTMPPacket *p); 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_ci/** 163cabdff1aSopenharmony_ci * Enlarge the prev_pkt array to fit the given channel 164cabdff1aSopenharmony_ci * 165cabdff1aSopenharmony_ci * @param prev_pkt array with previously sent packet headers 166cabdff1aSopenharmony_ci * @param nb_prev_pkt number of allocated elements in prev_pkt 167cabdff1aSopenharmony_ci * @param channel the channel number that needs to be allocated 168cabdff1aSopenharmony_ci */ 169cabdff1aSopenharmony_ciint ff_rtmp_check_alloc_array(RTMPPacket **prev_pkt, int *nb_prev_pkt, 170cabdff1aSopenharmony_ci int channel); 171cabdff1aSopenharmony_ci 172cabdff1aSopenharmony_ci/** 173cabdff1aSopenharmony_ci * @name Functions used to work with the AMF format (which is also used in .flv) 174cabdff1aSopenharmony_ci * @see amf_* funcs in libavformat/flvdec.c 175cabdff1aSopenharmony_ci * @{ 176cabdff1aSopenharmony_ci */ 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ci/** 179cabdff1aSopenharmony_ci * Calculate number of bytes taken by first AMF entry in data. 180cabdff1aSopenharmony_ci * 181cabdff1aSopenharmony_ci * @param data input data 182cabdff1aSopenharmony_ci * @param data_end input buffer end 183cabdff1aSopenharmony_ci * @return number of bytes used by first AMF entry 184cabdff1aSopenharmony_ci */ 185cabdff1aSopenharmony_ciint ff_amf_tag_size(const uint8_t *data, const uint8_t *data_end); 186cabdff1aSopenharmony_ci 187cabdff1aSopenharmony_ci/** 188cabdff1aSopenharmony_ci * Retrieve value of given AMF object field in string form. 189cabdff1aSopenharmony_ci * 190cabdff1aSopenharmony_ci * @param data AMF object data 191cabdff1aSopenharmony_ci * @param data_end input buffer end 192cabdff1aSopenharmony_ci * @param name name of field to retrieve 193cabdff1aSopenharmony_ci * @param dst buffer for storing result 194cabdff1aSopenharmony_ci * @param dst_size output buffer size 195cabdff1aSopenharmony_ci * @return 0 if search and retrieval succeeded, negative value otherwise 196cabdff1aSopenharmony_ci */ 197cabdff1aSopenharmony_ciint ff_amf_get_field_value(const uint8_t *data, const uint8_t *data_end, 198cabdff1aSopenharmony_ci const uint8_t *name, uint8_t *dst, int dst_size); 199cabdff1aSopenharmony_ci 200cabdff1aSopenharmony_ci/** 201cabdff1aSopenharmony_ci * Write boolean value in AMF format to buffer. 202cabdff1aSopenharmony_ci * 203cabdff1aSopenharmony_ci * @param dst pointer to the input buffer (will be modified) 204cabdff1aSopenharmony_ci * @param val value to write 205cabdff1aSopenharmony_ci */ 206cabdff1aSopenharmony_civoid ff_amf_write_bool(uint8_t **dst, int val); 207cabdff1aSopenharmony_ci 208cabdff1aSopenharmony_ci/** 209cabdff1aSopenharmony_ci * Write number in AMF format to buffer. 210cabdff1aSopenharmony_ci * 211cabdff1aSopenharmony_ci * @param dst pointer to the input buffer (will be modified) 212cabdff1aSopenharmony_ci * @param num value to write 213cabdff1aSopenharmony_ci */ 214cabdff1aSopenharmony_civoid ff_amf_write_number(uint8_t **dst, double num); 215cabdff1aSopenharmony_ci 216cabdff1aSopenharmony_ci/** 217cabdff1aSopenharmony_ci * Write string in AMF format to buffer. 218cabdff1aSopenharmony_ci * 219cabdff1aSopenharmony_ci * @param dst pointer to the input buffer (will be modified) 220cabdff1aSopenharmony_ci * @param str string to write 221cabdff1aSopenharmony_ci */ 222cabdff1aSopenharmony_civoid ff_amf_write_string(uint8_t **dst, const char *str); 223cabdff1aSopenharmony_ci 224cabdff1aSopenharmony_ci/** 225cabdff1aSopenharmony_ci * Write a string consisting of two parts in AMF format to a buffer. 226cabdff1aSopenharmony_ci * 227cabdff1aSopenharmony_ci * @param dst pointer to the input buffer (will be modified) 228cabdff1aSopenharmony_ci * @param str1 first string to write, may be null 229cabdff1aSopenharmony_ci * @param str2 second string to write, may be null 230cabdff1aSopenharmony_ci */ 231cabdff1aSopenharmony_civoid ff_amf_write_string2(uint8_t **dst, const char *str1, const char *str2); 232cabdff1aSopenharmony_ci 233cabdff1aSopenharmony_ci/** 234cabdff1aSopenharmony_ci * Write AMF NULL value to buffer. 235cabdff1aSopenharmony_ci * 236cabdff1aSopenharmony_ci * @param dst pointer to the input buffer (will be modified) 237cabdff1aSopenharmony_ci */ 238cabdff1aSopenharmony_civoid ff_amf_write_null(uint8_t **dst); 239cabdff1aSopenharmony_ci 240cabdff1aSopenharmony_ci/** 241cabdff1aSopenharmony_ci * Write marker for AMF object to buffer. 242cabdff1aSopenharmony_ci * 243cabdff1aSopenharmony_ci * @param dst pointer to the input buffer (will be modified) 244cabdff1aSopenharmony_ci */ 245cabdff1aSopenharmony_civoid ff_amf_write_object_start(uint8_t **dst); 246cabdff1aSopenharmony_ci 247cabdff1aSopenharmony_ci/** 248cabdff1aSopenharmony_ci * Write string used as field name in AMF object to buffer. 249cabdff1aSopenharmony_ci * 250cabdff1aSopenharmony_ci * @param dst pointer to the input buffer (will be modified) 251cabdff1aSopenharmony_ci * @param str string to write 252cabdff1aSopenharmony_ci */ 253cabdff1aSopenharmony_civoid ff_amf_write_field_name(uint8_t **dst, const char *str); 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_ci/** 256cabdff1aSopenharmony_ci * Write marker for end of AMF object to buffer. 257cabdff1aSopenharmony_ci * 258cabdff1aSopenharmony_ci * @param dst pointer to the input buffer (will be modified) 259cabdff1aSopenharmony_ci */ 260cabdff1aSopenharmony_civoid ff_amf_write_object_end(uint8_t **dst); 261cabdff1aSopenharmony_ci 262cabdff1aSopenharmony_ci/** 263cabdff1aSopenharmony_ci * Read AMF number value. 264cabdff1aSopenharmony_ci * 265cabdff1aSopenharmony_ci *@param[in,out] gbc GetByteContext initialized with AMF-formatted data 266cabdff1aSopenharmony_ci *@param[out] val read value 267cabdff1aSopenharmony_ci *@return 0 on success or an AVERROR code on failure 268cabdff1aSopenharmony_ci*/ 269cabdff1aSopenharmony_ciint ff_amf_read_number(GetByteContext *gbc, double *val); 270cabdff1aSopenharmony_ci 271cabdff1aSopenharmony_ci/** 272cabdff1aSopenharmony_ci * Get AMF string value. 273cabdff1aSopenharmony_ci * 274cabdff1aSopenharmony_ci * This function behaves the same as ff_amf_read_string except that 275cabdff1aSopenharmony_ci * it does not expect the AMF type prepended to the actual data. 276cabdff1aSopenharmony_ci * Appends a trailing null byte to output string in order to 277cabdff1aSopenharmony_ci * ease later parsing. 278cabdff1aSopenharmony_ci * 279cabdff1aSopenharmony_ci *@param[in,out] gbc GetByteContext initialized with AMF-formatted data 280cabdff1aSopenharmony_ci *@param[out] str read string 281cabdff1aSopenharmony_ci *@param[in] strsize buffer size available to store the read string 282cabdff1aSopenharmony_ci *@param[out] length read string length 283cabdff1aSopenharmony_ci *@return 0 on success or an AVERROR code on failure 284cabdff1aSopenharmony_ci*/ 285cabdff1aSopenharmony_ciint ff_amf_get_string(GetByteContext *bc, uint8_t *str, 286cabdff1aSopenharmony_ci int strsize, int *length); 287cabdff1aSopenharmony_ci 288cabdff1aSopenharmony_ci/** 289cabdff1aSopenharmony_ci * Read AMF string value. 290cabdff1aSopenharmony_ci * 291cabdff1aSopenharmony_ci * Appends a trailing null byte to output string in order to 292cabdff1aSopenharmony_ci * ease later parsing. 293cabdff1aSopenharmony_ci * 294cabdff1aSopenharmony_ci *@param[in,out] gbc GetByteContext initialized with AMF-formatted data 295cabdff1aSopenharmony_ci *@param[out] str read string 296cabdff1aSopenharmony_ci *@param[in] strsize buffer size available to store the read string 297cabdff1aSopenharmony_ci *@param[out] length read string length 298cabdff1aSopenharmony_ci *@return 0 on success or an AVERROR code on failure 299cabdff1aSopenharmony_ci*/ 300cabdff1aSopenharmony_ciint ff_amf_read_string(GetByteContext *gbc, uint8_t *str, 301cabdff1aSopenharmony_ci int strsize, int *length); 302cabdff1aSopenharmony_ci 303cabdff1aSopenharmony_ci/** 304cabdff1aSopenharmony_ci * Read AMF NULL value. 305cabdff1aSopenharmony_ci * 306cabdff1aSopenharmony_ci *@param[in,out] gbc GetByteContext initialized with AMF-formatted data 307cabdff1aSopenharmony_ci *@return 0 on success or an AVERROR code on failure 308cabdff1aSopenharmony_ci*/ 309cabdff1aSopenharmony_ciint ff_amf_read_null(GetByteContext *gbc); 310cabdff1aSopenharmony_ci 311cabdff1aSopenharmony_ci/** 312cabdff1aSopenharmony_ci * Match AMF string with a NULL-terminated string. 313cabdff1aSopenharmony_ci * 314cabdff1aSopenharmony_ci * @return 0 if the strings do not match. 315cabdff1aSopenharmony_ci */ 316cabdff1aSopenharmony_ci 317cabdff1aSopenharmony_ciint ff_amf_match_string(const uint8_t *data, int size, const char *str); 318cabdff1aSopenharmony_ci 319cabdff1aSopenharmony_ci/** @} */ // AMF funcs 320cabdff1aSopenharmony_ci 321cabdff1aSopenharmony_ci#endif /* AVFORMAT_RTMPPKT_H */ 322