00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef AVFORMAT_RTPDEC_H
00024 #define AVFORMAT_RTPDEC_H
00025
00026 #include "libavcodec/avcodec.h"
00027 #include "avformat.h"
00028 #include "rtp.h"
00029 #include "url.h"
00030
00031 typedef struct PayloadContext PayloadContext;
00032 typedef struct RTPDynamicProtocolHandler RTPDynamicProtocolHandler;
00033
00034 #define RTP_MIN_PACKET_LENGTH 12
00035 #define RTP_MAX_PACKET_LENGTH 1500
00036
00037 #define RTP_REORDER_QUEUE_DEFAULT_SIZE 10
00038
00039 #define RTP_NOTS_VALUE ((uint32_t)-1)
00040
00041 typedef struct RTPDemuxContext RTPDemuxContext;
00042 RTPDemuxContext *ff_rtp_parse_open(AVFormatContext *s1, AVStream *st,
00043 URLContext *rtpc, int payload_type,
00044 int queue_size);
00045 void ff_rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx,
00046 RTPDynamicProtocolHandler *handler);
00047 int ff_rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
00048 uint8_t **buf, int len);
00049 void ff_rtp_parse_close(RTPDemuxContext *s);
00050 int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s);
00051 void ff_rtp_reset_packet_queue(RTPDemuxContext *s);
00052 int ff_rtp_get_local_rtp_port(URLContext *h);
00053 int ff_rtp_get_local_rtcp_port(URLContext *h);
00054
00055 int ff_rtp_set_remote_url(URLContext *h, const char *uri);
00056
00068 void ff_rtp_send_punch_packets(URLContext* rtp_handle);
00069
00075 int ff_rtp_check_and_send_back_rr(RTPDemuxContext *s, int count);
00076
00077
00078 typedef struct RTPStatistics {
00079 uint16_t max_seq;
00080 uint32_t cycles;
00081 uint32_t base_seq;
00082 uint32_t bad_seq;
00083 int probation;
00084 int received;
00085 int expected_prior;
00086 int received_prior;
00087 uint32_t transit;
00088 uint32_t jitter;
00089 } RTPStatistics;
00090
00091 #define RTP_FLAG_KEY 0x1
00092 #define RTP_FLAG_MARKER 0x2
00093
00106 typedef int (*DynamicPayloadPacketHandlerProc)(AVFormatContext *ctx,
00107 PayloadContext *s,
00108 AVStream *st, AVPacket *pkt,
00109 uint32_t *timestamp,
00110 const uint8_t * buf,
00111 int len, int flags);
00112
00113 struct RTPDynamicProtocolHandler {
00114 const char enc_name[50];
00115 enum AVMediaType codec_type;
00116 enum AVCodecID codec_id;
00117 int static_payload_id;
00118
00119
00120
00122 int (*init)(AVFormatContext *s, int st_index, PayloadContext *priv_data);
00124 int (*parse_sdp_a_line)(AVFormatContext *s, int st_index,
00125 PayloadContext *priv_data, const char *line);
00127 PayloadContext *(*alloc)(void);
00129 void (*free)(PayloadContext *protocol_data);
00131 DynamicPayloadPacketHandlerProc parse_packet;
00132
00133 struct RTPDynamicProtocolHandler *next;
00134 };
00135
00136 typedef struct RTPPacket {
00137 uint16_t seq;
00138 uint8_t *buf;
00139 int len;
00140 int64_t recvtime;
00141 struct RTPPacket *next;
00142 } RTPPacket;
00143
00144 struct RTPDemuxContext {
00145 AVFormatContext *ic;
00146 AVStream *st;
00147 int payload_type;
00148 uint32_t ssrc;
00149 uint16_t seq;
00150 uint32_t timestamp;
00151 uint32_t base_timestamp;
00152 uint32_t cur_timestamp;
00153 int64_t unwrapped_timestamp;
00154 int64_t range_start_offset;
00155 int max_payload_size;
00156 struct MpegTSContext *ts;
00157 int read_buf_index;
00158 int read_buf_size;
00159
00160 URLContext *rtp_ctx;
00161 char hostname[256];
00162
00164 RTPStatistics statistics;
00165
00167 int prev_ret;
00168 RTPPacket* queue;
00169 int queue_len;
00170 int queue_size;
00171
00173
00174 int64_t last_rtcp_ntp_time;
00175 int64_t first_rtcp_ntp_time;
00176 uint32_t last_rtcp_timestamp;
00177 int64_t rtcp_ts_offset;
00178
00179
00180 unsigned int packet_count;
00181 unsigned int octet_count;
00182 unsigned int last_octet_count;
00183
00184 uint8_t buf[RTP_MAX_PACKET_LENGTH];
00185
00186
00187 DynamicPayloadPacketHandlerProc parse_packet;
00188 PayloadContext *dynamic_protocol_context;
00189 };
00190
00191 void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler);
00192 RTPDynamicProtocolHandler *ff_rtp_handler_find_by_name(const char *name,
00193 enum AVMediaType codec_type);
00194 RTPDynamicProtocolHandler *ff_rtp_handler_find_by_id(int id,
00195 enum AVMediaType codec_type);
00196
00197
00198 int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size,
00199 char *value, int value_size);
00200
00201 int ff_parse_fmtp(AVStream *stream, PayloadContext *data, const char *p,
00202 int (*parse_fmtp)(AVStream *stream,
00203 PayloadContext *data,
00204 char *attr, char *value));
00205
00206 void av_register_rtp_dynamic_payload_handlers(void);
00207
00211 int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx);
00212
00213 #endif