65 s->streams = &ic->
streams[first_stream_of_set_idx];
68 }
while (first_stream_of_set_idx +
s->n_streams < ic->
nb_streams &&
69 s->streams[
s->n_streams]->id ==
s->streams[0]->id);
71 s->prev_stream_id = -1;
72 s->prev_timestamp = -1;
74 s->dynamic_protocol_context = priv_data;
97 const char *challenge)
99 int ch_len = strlen (challenge),
i;
100 unsigned char zres[16],
101 buf[64] = { 0xa1, 0xe9, 0x14, 0x9d, 0x0e, 0x6b, 0x3b, 0x59 };
102#define XOR_TABLE_SIZE 37
104 0x05, 0x18, 0x74, 0xd0, 0x0d, 0x09, 0x02, 0x53,
105 0xc0, 0x01, 0x05, 0x05, 0x67, 0x03, 0x19, 0x70,
106 0x08, 0x27, 0x66, 0x10, 0x10, 0x72, 0x08, 0x09,
107 0x63, 0x11, 0x03, 0x71, 0x08, 0x08, 0x70, 0x02,
108 0x10, 0x57, 0x05, 0x18, 0x54 };
113 else if (ch_len > 56)
115 memcpy(buf + 8, challenge, ch_len);
119 buf[8 +
i] ^= xor_table[
i];
125 strcpy (response + 32,
"01d0a8e3");
128 for (
i = 0;
i < 8;
i++)
129 chksum[
i] = response[
i * 4];
159 if (
tag ==
MKTAG(
'M',
'L',
'T',
'I')) {
164 if (rule_nr < 0 || rule_nr >= num)
193 int *pset_id,
int *pseq_no,
int *pstream_id,
194 int *pis_keyframe, uint32_t *ptimestamp)
197 int consumed = 0, set_id, seq_no, stream_id,
is_keyframe,
198 len_included, need_reliable;
202 while (
len >= 5 && buf[1] == 0xFF ) {
205 if (!(buf[0] & 0x80))
284 if (stream_id == 0x1f)
287 if (pset_id) *pset_id = set_id;
288 if (pseq_no) *pseq_no = seq_no;
289 if (pstream_id) *pstream_id = stream_id;
291 if (ptimestamp) *ptimestamp = timestamp;
300 const uint8_t *buf,
int len, uint16_t rtp_seq,
int flags)
311 len,
pkt, &seq, rmflags, *timestamp);
333 pkt->pts = *timestamp;
340 uint8_t **bufptr,
int len)
342 uint8_t *buf = bufptr ? *bufptr :
NULL;
347 if (!
s->parse_packet)
350 if (!buf &&
s->prev_stream_id != -1) {
353 rv=
s->parse_packet(
s->ic,
s->dynamic_protocol_context,
354 s->streams[
s->prev_stream_id],
365 (set_id !=
s->prev_set_id || timestamp !=
s->prev_timestamp ||
366 stream_id !=
s->prev_stream_id)) {
368 s->prev_set_id = set_id;
369 s->prev_timestamp = timestamp;
371 s->prev_stream_id = stream_id;
375 if (
s->prev_stream_id >=
s->n_streams) {
376 s->prev_stream_id = -1;
380 rv =
s->parse_packet(
s->ic,
s->dynamic_protocol_context,
381 s->streams[
s->prev_stream_id],
389 int stream_nr,
int rule_nr)
392 stream_nr, rule_nr * 2, stream_nr, rule_nr * 2 + 1);
395static unsigned char *
398 unsigned char *target;
404 *target_len =
len * 3 / 4;
417 const char *p =
line;
421 }
else if (
av_strstart(p,
"StartTime:integer;", &p))
423 else if (
av_strstart(p,
"ASMRuleBook:string;", &p)) {
426 for (n = 0; n <
s->nb_streams; n++)
427 if (
s->streams[n]->id == stream->
id) {
428 int count =
s->streams[n]->index + 1, err;
429 if (first == -1) first = n;
432 count *
sizeof(*rdt->
rmst))) < 0) {
441 if (!rdt->
rmst[
s->streams[n]->index])
455 if (sscanf(p,
" %*1[Aa]verage%*1[Bb]andwidth=%"SCNd64, &st->
codecpar->
bit_rate) == 1)
457 if (!(p = strchr(p,
',')) || p > end)
470 st->
id = orig_st->
id;
482 int n_rules = 0, odd = 0;
501 if (!(end = strchr(p,
';')))
503 if (!odd && end != p) {
522 const char *p =
line;
560#define RDT_HANDLER(n, s, t) \
561const RTPDynamicProtocolHandler ff_rdt_ ## n ## _handler = { \
564 .codec_id = AV_CODEC_ID_NONE, \
565 .priv_data_size = sizeof(PayloadContext), \
567 .parse_sdp_a_line = rdt_parse_sdp_line, \
568 .close = rdt_close_context, \
569 .parse_packet = rdt_parse_packet \
static AVFormatContext * ctx
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, const 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)
void ffio_init_read_context(FFIOContext *s, const uint8_t *buffer, int buffer_size)
Wrap a buffer in an AVIOContext for reading.
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
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.
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
int avformat_open_input(AVFormatContext **ps, const char *url, const AVInputFormat *fmt, AVDictionary **options)
Open an input stream and read the header.
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
int av_base64_decode(uint8_t *out, const char *in_str, int out_size)
Decode a base64-encoded string.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
void av_md5_sum(uint8_t *dst, const uint8_t *src, size_t len)
Hash an array of data.
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.
static int is_keyframe(NalUnitType naltype)
static void handler(vbi_event *ev, void *user_data)
#define MKTAG(a, b, c, d)
Public header for MD5 hash function implementation.
Memory handling functions.
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)
return 0 on packet, no more left, 1 on packet, 1 on partial packet...
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.
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)
static unsigned char * rdt_parse_b64buf(unsigned int *target_len, const char *p)
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.
void ff_rdt_subscribe_rule(char *cmd, int size, int stream_nr, int rule_nr)
Add subscription information to Subscribe parameter string.
void ff_real_parse_sdp_a_line(AVFormatContext *s, int stream_index, const char *line)
Parse a server-related SDP line.
static AVStream * add_dstream(AVFormatContext *s, AVStream *orig_st)
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)
const struct FFInputFormat ff_rdt_demuxer
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)
RMStream * ff_rm_alloc_rmstream(void)
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.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
int id
Format-specific stream ID.
int index
stream index in AVFormatContext
int64_t first_dts
Timestamp corresponding to the last dts sync point.
RTP/AV1 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