aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/rdt.c
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2009-01-07 14:45:13 +0000
committerRonald S. Bultje <rsbultje@gmail.com>2009-01-07 14:45:13 +0000
commit7c68a17754ca1a42baccf8b90704a073f4514ece (patch)
treef6800b839e39027eca34136630a0efd8d500b439 /libavformat/rdt.c
parent530bca94390adb946f21c767f5eafda522c826b1 (diff)
downloadffmpeg-7c68a17754ca1a42baccf8b90704a073f4514ece.tar.gz
Parse the OpaqueData field for every AVStream represented by this "set of
streams" (a single RTSPStream / RDTDemuxContext can represent several AVStreams, that's just how Real/RDT was designed...). This will fill in most of the AVStream/AVCodecContext header fields, similar to reading a RM file header would. See "[PATCH] multi-stream MDPR parsing" thread on mailinglist. Originally committed as revision 16468 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/rdt.c')
-rw-r--r--libavformat/rdt.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/libavformat/rdt.c b/libavformat/rdt.c
index 9d6e193449..3680527d5e 100644
--- a/libavformat/rdt.c
+++ b/libavformat/rdt.c
@@ -180,7 +180,7 @@ rdt_load_mdpr (PayloadContext *rdt, AVStream *st, int rule_nr)
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;
@@ -307,7 +307,7 @@ rdt_parse_packet (PayloadContext *rdt, AVStream *st,
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)
@@ -322,7 +322,7 @@ rdt_parse_packet (PayloadContext *rdt, AVStream *st,
} 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);
@@ -389,15 +389,6 @@ ff_rdt_subscribe_rule (char *cmd, int size,
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)
{
@@ -424,6 +415,19 @@ rdt_parse_sdp_line (AVFormatContext *s, int st_index,
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;
}
@@ -510,7 +514,6 @@ rdt_new_extradata (void)
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;
}
@@ -518,8 +521,13 @@ rdt_new_extradata (void)
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);