FFmpeg
Classes | Macros | Functions
rdt.c File Reference

Realmedia RTSP protocol (RDT) support. More...

#include "avformat.h"
#include "libavutil/avstring.h"
#include "rtpdec.h"
#include "rdt.h"
#include "libavutil/base64.h"
#include "libavutil/md5.h"
#include "rm.h"
#include "internal.h"
#include "avio_internal.h"
#include "libavcodec/get_bits.h"

Classes

struct  RDTDemuxContext
 
struct  PayloadContext
 RTP/JPEG specific private data. More...
 

Macros

#define XOR_TABLE_SIZE   37
 
#define RDT_HANDLER(n, s, t)
 

Functions

RDTDemuxContextff_rdt_parse_open (AVFormatContext *ic, int first_stream_of_set_idx, void *priv_data, const RTPDynamicProtocolHandler *handler)
 Allocate and init the RDT parsing context. More...
 
void ff_rdt_parse_close (RDTDemuxContext *s)
 
void ff_rdt_calc_response_and_checksum (char response[41], char chksum[9], const char *challenge)
 Calculate the response (RealChallenge2 in the RTSP header) to the challenge (RealChallenge1 in the RTSP header from the Real/Helix server), which is used as some sort of client validation. More...
 
int ff_rdt_parse_header (const uint8_t *buf, int len, int *pset_id, int *pseq_no, int *pstream_id, int *pis_keyframe, uint32_t *ptimestamp)
 Actual data handling. More...
 
int ff_rdt_parse_packet (RDTDemuxContext *s, AVPacket *pkt, uint8_t **bufptr, int len)
 Parse RDT-style packet data (header + media data). More...
 
void ff_rdt_subscribe_rule (char *cmd, int size, int stream_nr, int rule_nr)
 Add subscription information to Subscribe parameter string. More...
 
void ff_real_parse_sdp_a_line (AVFormatContext *s, int stream_index, const char *line)
 Parse a server-related SDP line. More...
 
 RDT_HANDLER (live_video, "x-pn-multirate-realvideo-live", AVMEDIA_TYPE_VIDEO)
 
 RDT_HANDLER (live_audio, "x-pn-multirate-realaudio-live", AVMEDIA_TYPE_AUDIO)
 
 RDT_HANDLER (video, "x-pn-realvideo", AVMEDIA_TYPE_VIDEO)
 
 RDT_HANDLER (audio, "x-pn-realaudio", AVMEDIA_TYPE_AUDIO)
 

Detailed Description

Realmedia RTSP protocol (RDT) support.

Author
Ronald S. Bultje rbult.nosp@m.je@r.nosp@m.onald.nosp@m..bit.nosp@m.freak.nosp@m..net

Macro Definition Documentation

§ RDT_HANDLER

#define RDT_HANDLER (   n,
  s,
 
)
Value:
RTPDynamicProtocolHandler ff_rdt_ ## n ## _handler = { \
.enc_name = s, \
.codec_type = t, \
.codec_id = AV_CODEC_ID_NONE, \
.priv_data_size = sizeof(PayloadContext), \
.init = rdt_init, \
.parse_sdp_a_line = rdt_parse_sdp_line, \
.close = rdt_close_context, \
.parse_packet = rdt_parse_packet \
}
RTP/JPEG specific private data.
Definition: rdt.c:83
Definition: rtpdec.h:115

Function Documentation

§ ff_rdt_calc_response_and_checksum()

void ff_rdt_calc_response_and_checksum ( char  response[41],
char  chksum[9],
const char *  challenge 
)

Calculate the response (RealChallenge2 in the RTSP header) to the challenge (RealChallenge1 in the RTSP header from the Real/Helix server), which is used as some sort of client validation.

Parameters
responsepointer to response buffer, it should be at least 41 bytes (40 data + 1 zero) bytes long.
chksumpointer to buffer containing a checksum of the response, it should be at least 9 (8 data + 1 zero) bytes long.
challengepointer to the RealChallenge1 value provided by the server.

§ ff_rdt_parse_header()

int ff_rdt_parse_header ( const uint8_t *  buf,
int  len,
int *  pset_id,
int *  pseq_no,
int *  pstream_id,
int *  pis_keyframe,
uint32_t *  ptimestamp 
)

Actual data handling.

Parse RDT-style packet header.

return 0 on packet, no more left, 1 on packet, 1 on partial packet...

Layout of the header (in bits): 1: len_included Flag indicating whether this header includes a length field; this can be used to concatenate multiple RDT packets in a single UDP/TCP data frame and is used to precede RDT data by stream status packets 1: need_reliable Flag indicating whether this header includes a "reliable sequence number"; these are apparently sequence numbers of data packets alone. For data packets, this flag is always set, according to the Real documentation [1] 5: set_id ID of a set of streams of identical content, possibly with different codecs or bitrates 1: is_reliable Flag set for certain streams deemed less tolerable for packet loss 16: seq_no Packet sequence number; if >=0xFF00, this is a non-data packet containing stream status info, the second byte indicates the type of status packet (see wireshark docs / source code [2]) if (len_included) { 16: packet_len } else { packet_len = remainder of UDP/TCP frame } 1: is_back_to_back Back-to-Back flag; used for timing, set for one in every 10 packets, according to the Real documentation [1] 1: is_slow_data Slow-data flag; currently unused, according to Real docs [1] 5: stream_id ID of the stream within this particular set of streams 1: is_no_keyframe Non-keyframe flag (unset if packet belongs to a keyframe) 32: timestamp (PTS) if (set_id == 0x1F) { 16: set_id (extended set-of-streams ID; see set_id) } if (need_reliable) { 16: reliable_seq_no Reliable sequence number (see need_reliable) } if (stream_id == 0x3F) { 16: stream_id (extended stream ID; see stream_id) } [1] https://protocol.helixcommunity.org/files/2005/devdocs/RDT_Feature_Level_20.txt [2] http://www.wireshark.org/docs/dfref/r/rdt.html and http://anonsvn.wireshark.org/viewvc/trunk/epan/dissectors/packet-rdt.c

§ ff_rdt_parse_open()

RDTDemuxContext* ff_rdt_parse_open ( AVFormatContext ic,
int  first_stream_of_set_idx,
void *  priv_data,
const RTPDynamicProtocolHandler handler 
)

Allocate and init the RDT parsing context.

Parameters
icthe containing RTSP demuxer context
first_stream_of_set_idxindex to the first AVStream in the RTSP demuxer context's ic->streams array that is part of this particular stream's set of streams (with identical content)
priv_dataprivate data of the payload data handler context
handlerpointer to the parse_packet() payload parsing function
Returns
a newly allocated RDTDemuxContext. Free with ff_rdt_parse_close().

§ ff_rdt_parse_packet()

int ff_rdt_parse_packet ( RDTDemuxContext s,
AVPacket pkt,
uint8_t **  buf,
int  len 
)

Parse RDT-style packet data (header + media data).

Usage similar to rtp_parse_packet().

< Should not be used if buf is NULL, but should be set to the timestamp of the packet returned....

§ ff_rdt_subscribe_rule()

void ff_rdt_subscribe_rule ( char *  cmd,
int  size,
int  stream_nr,
int  rule_nr 
)

Add subscription information to Subscribe parameter string.

Parameters
cmdstring to write the subscription information into.
sizesize of cmd.
stream_nrstream number.
rule_nrrule number to conform to.

§ ff_real_parse_sdp_a_line()

void ff_real_parse_sdp_a_line ( AVFormatContext s,
int  stream_index,
const char *  buf 
)

Parse a server-related SDP line.

Parameters
sthe RTSP AVFormatContext
stream_indexthe index of the first stream in the set represented by the SDP m= line (in s->streams)
bufthe SDP line