FFmpeg
|
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"
Go to the source code of this file.
Data Structures | |
struct | RDTDemuxContext |
struct | PayloadContext |
RTP/JPEG specific private data. More... | |
Macros | |
#define | XOR_TABLE_SIZE 37 |
#define | RDT_HANDLER(n, s, t) |
Functions | |
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. 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... | |
static int | rdt_load_mdpr (PayloadContext *rdt, AVStream *st, int rule_nr) |
static int | rdt_parse_packet (AVFormatContext *ctx, PayloadContext *rdt, AVStream *st, AVPacket *pkt, uint32_t *timestamp, const uint8_t *buf, int len, uint16_t rtp_seq, int flags) |
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... | |
static unsigned char * | rdt_parse_b64buf (unsigned int *target_len, const char *p) |
static int | rdt_parse_sdp_line (AVFormatContext *s, int st_index, PayloadContext *rdt, const char *line) |
static void | real_parse_asm_rule (AVStream *st, const char *p, const char *end) |
static AVStream * | add_dstream (AVFormatContext *s, AVStream *orig_st) |
static void | real_parse_asm_rulebook (AVFormatContext *s, AVStream *orig_st, const char *p) |
void | ff_real_parse_sdp_a_line (AVFormatContext *s, int stream_index, const char *line) |
Parse a server-related SDP line. More... | |
static av_cold int | rdt_init (AVFormatContext *s, int st_index, PayloadContext *rdt) |
static void | rdt_close_context (PayloadContext *rdt) |
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) | |
Realmedia RTSP protocol (RDT) support.
Definition in file rdt.c.
#define XOR_TABLE_SIZE 37 |
#define RDT_HANDLER | ( | n, | |
s, | |||
t | |||
) |
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.
ic | the containing RTSP demuxer context |
first_stream_of_set_idx | index 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_data | private data of the payload data handler context |
handler | pointer to the parse_packet() payload parsing function |
Definition at line 55 of file rdt.c.
Referenced by ff_rtsp_open_transport_ctx().
void ff_rdt_parse_close | ( | RDTDemuxContext * | s | ) |
Definition at line 78 of file rdt.c.
Referenced by ff_rtsp_undo_setup().
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.
response | pointer to response buffer, it should be at least 41 bytes (40 data + 1 zero) bytes long. |
chksum | pointer to buffer containing a checksum of the response, it should be at least 9 (8 data + 1 zero) bytes long. |
challenge | pointer to the RealChallenge1 value provided by the server. |
|
static |
Layout of the MLTI chunk: 4: MLTI 2: number of streams Then for each stream ([number_of_streams] times): 2: mdpr index 2: number of mdpr chunks Then for each mdpr chunk ([number_of_mdpr_chunks] times): 4: size
we skip MDPR chunks until we reach the one of the stream we're interested in, and forward that ([size]+[data]) to the RM demuxer to parse the stream-specific header data.
Definition at line 132 of file rdt.c.
Referenced by rdt_parse_sdp_line().
|
static |
int ff_rdt_parse_packet | ( | RDTDemuxContext * | s, |
AVPacket * | pkt, | ||
uint8_t ** | buf, | ||
int | len | ||
) |
Add subscription information to Subscribe parameter string.
cmd | string to write the subscription information into. |
size | size of cmd. |
stream_nr | stream number. |
rule_nr | rule number to conform to. |
Definition at line 384 of file rdt.c.
Referenced by rtsp_read_packet().
|
static |
Definition at line 392 of file rdt.c.
Referenced by rdt_parse_sdp_line().
|
static |
|
static |
Definition at line 447 of file rdt.c.
Referenced by real_parse_asm_rulebook().
|
static |
Definition at line 460 of file rdt.c.
Referenced by real_parse_asm_rulebook().
|
static |
The ASMRuleBook contains a list of comma-separated strings per rule, and each rule is separated by a ;. The last one also has a ; at the end so we can use it as delimiter. Every rule occurs twice, once for when the RTSP packet header marker is set and once for if it isn't. We only read the first because we don't care much (that's what the "odd" variable is for). Each rule contains a set of one or more statements, optionally preceded by a single condition. If there's a condition, the rule starts with a '#'. Multiple conditions are merged between brackets, so there are never multiple conditions spread out over separate statements. Generally, these conditions are bitrate limits (min/max) for multi-bitrate streams.
Definition at line 474 of file rdt.c.
Referenced by 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.
s | the RTSP AVFormatContext |
stream_index | the index of the first stream in the set represented by the SDP m= line (in s->streams) |
buf | the SDP line |
|
static |
|
static |
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 | |||
) |