*/
/**
- * @file rdt.c
+ * @file libavformat/rdt.c
* @brief Realmedia RTSP protocol (RDT) support
* @author Ronald S. Bultje <rbultje@ronald.bitfreak.net>
*/
#include "avformat.h"
#include "libavutil/avstring.h"
-#include "rtp_internal.h"
+#include "rtpdec.h"
#include "rdt.h"
#include "libavutil/base64.h"
#include "libavutil/md5.h"
#include "rm.h"
#include "internal.h"
-#include <libavcodec/bitstream.h>
+#include "libavcodec/bitstream.h"
struct RDTDemuxContext {
AVFormatContext *ic; /**< the containing (RTSP) demux context */
size = rdt->mlti_data_size;
url_fseek(&pb, 0, SEEK_SET);
}
- if (ff_rm_read_mdpr_codecdata(rdt->rmctx, &pb, st, rdt->rmst[0], size) < 0)
+ if (ff_rm_read_mdpr_codecdata(rdt->rmctx, &pb, st, rdt->rmst[st->index], size) < 0)
return -1;
return 0;
/**< return 0 on packet, no more left, 1 on packet, 1 on partial packet... */
static int
-rdt_parse_packet (PayloadContext *rdt, AVStream *st,
+rdt_parse_packet (AVFormatContext *ctx, PayloadContext *rdt, AVStream *st,
AVPacket *pkt, uint32_t *timestamp,
const uint8_t *buf, int len, int flags)
{
init_put_byte(&pb, buf, len, 0, NULL, NULL, NULL, NULL);
flags = (flags & PKT_FLAG_KEY) ? 2 : 0;
- res = ff_rm_parse_packet (rdt->rmctx, &pb, st, rdt->rmst[0], len, pkt,
+ res = ff_rm_parse_packet (rdt->rmctx, &pb, st, rdt->rmst[st->index], len, pkt,
&seq, &flags, timestamp);
pos = url_ftell(&pb);
if (res < 0)
} else {
rdt->audio_pkt_cnt =
ff_rm_retrieve_cache (rdt->rmctx, rdt->rmctx->pb,
- st, rdt->rmst[0], pkt);
+ st, rdt->rmst[st->index], pkt);
if (rdt->audio_pkt_cnt == 0 &&
st->codec->codec_id == CODEC_ID_AAC)
av_freep(&rdt->rmctx->pb);
if (!buf && s->prev_stream_id != -1) {
/* return the next packets, if any */
timestamp= 0; ///< Should not be used if buf is NULL, but should be set to the timestamp of the packet returned....
- rv= s->parse_packet(s->dynamic_protocol_context,
+ rv= s->parse_packet(s->ic, s->dynamic_protocol_context,
s->streams[s->prev_stream_id],
pkt, ×tamp, NULL, 0, flags);
return rv;
return -1;
}
- rv = s->parse_packet(s->dynamic_protocol_context,
+ rv = s->parse_packet(s->ic, s->dynamic_protocol_context,
s->streams[s->prev_stream_id],
pkt, ×tamp, buf, len, flags);
stream_nr, rule_nr * 2, stream_nr, rule_nr * 2 + 1);
}
-void
-ff_rdt_subscribe_rule2 (RDTDemuxContext *s, char *cmd, int size,
- int stream_nr, int rule_nr)
-{
- PayloadContext *rdt = s->dynamic_protocol_context;
-
- rdt_load_mdpr(rdt, s->streams[0], rule_nr * 2);
-}
-
static unsigned char *
rdt_parse_b64buf (unsigned int *target_len, const char *p)
{
rdt->mlti_data = rdt_parse_b64buf(&rdt->mlti_data_size, p);
} else if (av_strstart(p, "StartTime:integer;", &p))
stream->first_dts = atoi(p);
+ else if (av_strstart(p, "ASMRuleBook:string;", &p)) {
+ int n = st_index, first = -1;
+
+ for (n = 0; n < s->nb_streams; n++)
+ if (s->streams[n]->priv_data == stream->priv_data) {
+ if (first == -1) first = n;
+ rdt->rmst[s->streams[n]->index] = ff_rm_alloc_rmstream();
+ rdt_load_mdpr(rdt, s->streams[n], (n - first) * 2);
+
+ if (s->streams[n]->codec->codec_id == CODEC_ID_AAC)
+ s->streams[n]->codec->frame_size = 1; // FIXME
+ }
+ }
return 0;
}
+static void
+real_parse_asm_rule(AVStream *st, const char *p, const char *end)
+{
+ do {
+ /* can be either averagebandwidth= or AverageBandwidth= */
+ if (sscanf(p, " %*1[Aa]verage%*1[Bb]andwidth=%d", &st->codec->bit_rate) == 1)
+ break;
+ if (!(p = strchr(p, ',')) || p > end)
+ p = end;
+ p++;
+ } while (p < end);
+}
+
static AVStream *
add_dstream(AVFormatContext *s, AVStream *orig_st)
{
st = add_dstream(s, orig_st);
else
st = orig_st;
+ real_parse_asm_rule(st, p, end);
n_rules++;
}
p = end + 1;
PayloadContext *rdt = av_mallocz(sizeof(PayloadContext));
av_open_input_stream(&rdt->rmctx, NULL, "", &rdt_demuxer, NULL);
- rdt->rmst[0] = ff_rm_alloc_rmstream();
return rdt;
}
static void
rdt_free_extradata (PayloadContext *rdt)
{
- ff_rm_free_rmstream(rdt->rmst[0]);
- av_free(rdt->rmst[0]);
+ int i;
+
+ for (i = 0; i < MAX_STREAMS; i++)
+ if (rdt->rmst[i]) {
+ ff_rm_free_rmstream(rdt->rmst[i]);
+ av_freep(&rdt->rmst[i]);
+ }
if (rdt->rmctx)
av_close_input_stream(rdt->rmctx);
av_freep(&rdt->mlti_data);