63 s->streams = &ic->
streams[first_stream_of_set_idx];
66 }
while (first_stream_of_set_idx +
s->n_streams < ic->
nb_streams &&
67 s->streams[
s->n_streams]->id ==
s->streams[0]->id);
69 s->prev_stream_id = -1;
70 s->prev_timestamp = -1;
72 s->dynamic_protocol_context = priv_data;
95 const char *challenge)
97 int ch_len = strlen (challenge),
i;
98 unsigned char zres[16],
99 buf[64] = { 0xa1, 0xe9, 0x14, 0x9d, 0x0e, 0x6b, 0x3b, 0x59 };
100 #define XOR_TABLE_SIZE 37
102 0x05, 0x18, 0x74, 0xd0, 0x0d, 0x09, 0x02, 0x53,
103 0xc0, 0x01, 0x05, 0x05, 0x67, 0x03, 0x19, 0x70,
104 0x08, 0x27, 0x66, 0x10, 0x10, 0x72, 0x08, 0x09,
105 0x63, 0x11, 0x03, 0x71, 0x08, 0x08, 0x70, 0x02,
106 0x10, 0x57, 0x05, 0x18, 0x54 };
111 else if (ch_len > 56)
113 memcpy(buf + 8, challenge, ch_len);
117 buf[8 +
i] ^= xor_table[
i];
123 strcpy (response + 32,
"01d0a8e3");
126 for (
i = 0;
i < 8;
i++)
127 chksum[
i] = response[
i * 4];
157 if (
tag ==
MKTAG(
'M',
'L',
'T',
'I')) {
162 if (rule_nr < 0 || rule_nr >= num)
191 int *pset_id,
int *pseq_no,
int *pstream_id,
192 int *pis_keyframe, uint32_t *ptimestamp)
195 int consumed = 0, set_id, seq_no, stream_id,
is_keyframe,
196 len_included, need_reliable;
200 while (
len >= 5 && buf[1] == 0xFF ) {
203 if (!(buf[0] & 0x80))
280 if (stream_id == 0x1f)
283 if (pset_id) *pset_id = set_id;
284 if (pseq_no) *pseq_no = seq_no;
285 if (pstream_id) *pstream_id = stream_id;
287 if (ptimestamp) *ptimestamp = timestamp;
307 &seq, rmflags, *timestamp);
343 if (!
s->parse_packet)
346 if (!buf &&
s->prev_stream_id != -1) {
349 rv=
s->parse_packet(
s->ic,
s->dynamic_protocol_context,
350 s->streams[
s->prev_stream_id],
361 (set_id !=
s->prev_set_id || timestamp !=
s->prev_timestamp ||
362 stream_id !=
s->prev_stream_id)) {
364 s->prev_set_id = set_id;
365 s->prev_timestamp = timestamp;
367 s->prev_stream_id = stream_id;
371 if (
s->prev_stream_id >=
s->n_streams) {
372 s->prev_stream_id = -1;
376 rv =
s->parse_packet(
s->ic,
s->dynamic_protocol_context,
377 s->streams[
s->prev_stream_id],
385 int stream_nr,
int rule_nr)
388 stream_nr, rule_nr * 2, stream_nr, rule_nr * 2 + 1);
391 static unsigned char *
394 unsigned char *target;
400 *target_len =
len * 3 / 4;
413 const char *p =
line;
417 }
else if (
av_strstart(p,
"StartTime:integer;", &p))
419 else if (
av_strstart(p,
"ASMRuleBook:string;", &p)) {
422 for (n = 0; n <
s->nb_streams; n++)
423 if (
s->streams[n]->id == stream->
id) {
424 int count =
s->streams[n]->index + 1, err;
425 if (first == -1) first = n;
428 count *
sizeof(*rdt->
rmst))) < 0) {
437 if (!rdt->
rmst[
s->streams[n]->index])
451 if (sscanf(p,
" %*1[Aa]verage%*1[Bb]andwidth=%"SCNd64, &st->
codecpar->
bit_rate) == 1)
453 if (!(p = strchr(p,
',')) || p > end)
466 st->
id = orig_st->
id;
478 int n_rules = 0, odd = 0;
497 if (!(end = strchr(p,
';')))
499 if (!odd && end != p) {
518 const char *p =
line;
556 #define RDT_HANDLER(n, s, t) \
557 const RTPDynamicProtocolHandler ff_rdt_ ## n ## _handler = { \
560 .codec_id = AV_CODEC_ID_NONE, \
561 .priv_data_size = sizeof(PayloadContext), \
563 .parse_sdp_a_line = rdt_parse_sdp_line, \
564 .close = rdt_close_context, \
565 .parse_packet = rdt_parse_packet \
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
unsigned int avio_rb16(AVIOContext *s)
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
AVIOContext * avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
Allocate and initialize an AVIOContext for buffered I/O.
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
unsigned int avio_rl32(AVIOContext *s)
void avio_context_free(AVIOContext **s)
Free the supplied IO context and everything associated with it.
unsigned int avio_rb32(AVIOContext *s)
int ffio_init_context(AVIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
#define flags(name, subs,...)
#define MKTAG(a, b, c, d)
bitstream reader API header.
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
static unsigned int get_bits1(GetBitContext *s)
static void skip_bits(GetBitContext *s, int n)
static int get_bits_count(const GetBitContext *s)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options)
Open an input stream and read the header.
int av_base64_decode(uint8_t *out, const char *in_str, int out_size)
Decode a base64-encoded string.
void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len)
Hash an array of data.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer.
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
common internal API header
static int is_keyframe(NalUnitType naltype)
static void handler(vbi_event *ev, void *user_data)
Public header for MD5 hash function implementation.
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).
void ff_rdt_parse_close(RDTDemuxContext *s)
#define RDT_HANDLER(n, s, t)
static void real_parse_asm_rulebook(AVFormatContext *s, AVStream *orig_st, const char *p)
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 RT...
static int rdt_parse_sdp_line(AVFormatContext *s, int st_index, PayloadContext *rdt, const char *line)
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.
static AVStream * add_dstream(AVFormatContext *s, AVStream *orig_st)
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.
void ff_rdt_subscribe_rule(char *cmd, int size, int stream_nr, int rule_nr)
Add subscription information to Subscribe parameter string.
static unsigned char * rdt_parse_b64buf(unsigned int *target_len, const char *p)
void ff_real_parse_sdp_a_line(AVFormatContext *s, int stream_index, const char *line)
Parse a server-related SDP line.
static void real_parse_asm_rule(AVStream *st, const char *p, const char *end)
static av_cold int rdt_init(AVFormatContext *s, int st_index, PayloadContext *rdt)
static void rdt_close_context(PayloadContext *rdt)
RMStream * ff_rm_alloc_rmstream(void)
int ff_rm_parse_packet(AVFormatContext *s, AVIOContext *pb, AVStream *st, RMStream *rst, int len, AVPacket *pkt, int *seq, int flags, int64_t ts)
Parse one rm-stream packet from the input bytestream.
void ff_rm_free_rmstream(RMStream *rms)
AVInputFormat ff_rdt_demuxer
int ff_rm_retrieve_cache(AVFormatContext *s, AVIOContext *pb, AVStream *st, RMStream *rst, AVPacket *pkt)
Retrieve one cached packet from the rm-context.
int ff_rm_read_mdpr_codecdata(AVFormatContext *s, AVIOContext *pb, AVStream *st, RMStream *rst, unsigned int codec_data_size, const uint8_t *mime)
Read the MDPR chunk, which contains stream-specific codec initialization parameters.
#define RTP_FLAG_KEY
RTP packet contains a keyframe.
#define RTP_MAX_PACKET_LENGTH
int(* DynamicPayloadPacketHandlerProc)(AVFormatContext *ctx, PayloadContext *s, AVStream *st, AVPacket *pkt, uint32_t *timestamp, const uint8_t *buf, int len, uint16_t seq, int flags)
Packet parsing for "private" payloads in the RTP specs.
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
enum AVMediaType codec_type
General type of the encoded data.
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
AVIOContext * pb
I/O context.
AVStream ** streams
A list of all streams in the file.
This structure stores compressed data.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
AVCodecParameters * codecpar
Codec parameters associated with this stream.
int64_t first_dts
Timestamp corresponding to the last dts sync point.
int id
Format-specific stream ID.
int index
stream index in AVFormatContext
RTP/JPEG specific private data.
char buffer[RTP_MAX_PACKET_LENGTH+AV_INPUT_BUFFER_PADDING_SIZE]
unsigned int mlti_data_size
int audio_pkt_cnt
remaining audio packets in rmdec
DynamicPayloadPacketHandlerProc parse_packet
void * dynamic_protocol_context
AVFormatContext * ic
the containing (RTSP) demux context
AVStream ** streams
Each RDT stream-set (represented by one RTSPStream) can contain multiple streams (of the same content...
int n_streams
streams with identical content in this set