summaryrefslogtreecommitdiffstats
path: root/libmpdemux/realrtsp/real.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmpdemux/realrtsp/real.c')
-rw-r--r--libmpdemux/realrtsp/real.c49
1 files changed, 33 insertions, 16 deletions
diff --git a/libmpdemux/realrtsp/real.c b/libmpdemux/realrtsp/real.c
index 8b77fde265..b175514479 100644
--- a/libmpdemux/realrtsp/real.c
+++ b/libmpdemux/realrtsp/real.c
@@ -35,6 +35,7 @@
#include "real.h"
#include "asmrp.h"
#include "sdpplin.h"
+#include "xbuffer.h"
/*
#define LOG
@@ -422,7 +423,7 @@ void real_calc_response_and_checksum (char *response, char *chksum, char *challe
* returns a pointer to selected data and number of bytes in that.
*/
-static int select_mlti_data(const char *mlti_chunk, int mlti_size, int selection, char *out) {
+static int select_mlti_data(const char *mlti_chunk, int mlti_size, int selection, char **out) {
int numrules, codec, size;
int i;
@@ -437,7 +438,7 @@ static int select_mlti_data(const char *mlti_chunk, int mlti_size, int selection
#ifdef LOG
printf("libreal: MLTI tag not detected, copying data\n");
#endif
- memcpy(out, mlti_chunk, mlti_size);
+ *out = xbuffer_copyin(*out, 0, mlti_chunk, mlti_size);
return mlti_size;
}
@@ -478,7 +479,7 @@ static int select_mlti_data(const char *mlti_chunk, int mlti_size, int selection
#ifdef LOG
hexdump(mlti_chunk+4, size);
#endif
- memcpy(out,mlti_chunk+4, size);
+ *out = xbuffer_copyin(*out, 0, mlti_chunk+4, size);
return size;
}
@@ -486,11 +487,11 @@ static int select_mlti_data(const char *mlti_chunk, int mlti_size, int selection
* looking at stream description.
*/
-rmff_header_t *real_parse_sdp(char *data, char *stream_rules, uint32_t bandwidth) {
+rmff_header_t *real_parse_sdp(char *data, char **stream_rules, uint32_t bandwidth) {
sdpplin_t *desc;
rmff_header_t *header;
- char buf[2048];
+ char *buf;
int len, i;
int max_bit_rate=0;
int avg_bit_rate=0;
@@ -505,6 +506,7 @@ rmff_header_t *real_parse_sdp(char *data, char *stream_rules, uint32_t bandwidth
if (!desc) return NULL;
+ buf = xbuffer_init(2048);
header=calloc(1,sizeof(rmff_header_t));
header->fileheader=rmff_new_fileheader(4+desc->stream_count);
@@ -535,12 +537,12 @@ rmff_header_t *real_parse_sdp(char *data, char *stream_rules, uint32_t bandwidth
printf("asmrp rule match: %u for stream %u\n", rulematches[j], desc->stream[i]->stream_id);
#endif
sprintf(b,"stream=%u;rule=%u,", desc->stream[i]->stream_id, rulematches[j]);
- strcat(stream_rules, b);
+ *stream_rules = xbuffer_strcat(*stream_rules, b);
}
if (!desc->stream[i]->mlti_data) return NULL;
- len=select_mlti_data(desc->stream[i]->mlti_data, desc->stream[i]->mlti_data_size, rulematches[0], buf);
+ len=select_mlti_data(desc->stream[i]->mlti_data, desc->stream[i]->mlti_data_size, rulematches[0], &buf);
header->streams[i]=rmff_new_mdpr(
desc->stream[i]->stream_id,
@@ -566,8 +568,8 @@ rmff_header_t *real_parse_sdp(char *data, char *stream_rules, uint32_t bandwidth
avg_packet_size=desc->stream[i]->avg_packet_size;
}
- if (stream_rules)
- stream_rules[strlen(stream_rules)-1]=0; /* delete last ',' in stream_rules */
+ if (*stream_rules && strlen(*stream_rules) && (*stream_rules)[strlen(*stream_rules)-1] == ',')
+ (*stream_rules)[strlen(*stream_rules)-1]=0; /* delete last ',' in stream_rules */
header->prop=rmff_new_prop(
max_bit_rate,
@@ -583,11 +585,12 @@ rmff_header_t *real_parse_sdp(char *data, char *stream_rules, uint32_t bandwidth
desc->flags);
rmff_fix_header(header);
+ buf = xbuffer_free(buf);
return header;
}
-int real_get_rdt_chunk(rtsp_t *rtsp_session, char *buffer) {
+int real_get_rdt_chunk(rtsp_t *rtsp_session, char **buffer) {
int n=1;
uint8_t header[8];
@@ -653,9 +656,10 @@ int real_get_rdt_chunk(rtsp_t *rtsp_session, char *buffer) {
}
else
ph.flags=0;
- rmff_dump_pheader(&ph, buffer);
+ *buffer = xbuffer_ensure_size(*buffer, 12+size);
+ rmff_dump_pheader(&ph, *buffer);
size-=12;
- n=rtsp_read_data(rtsp_session, buffer+12, size);
+ n=rtsp_read_data(rtsp_session, (*buffer)+12, size);
return n+12;
}
@@ -687,8 +691,8 @@ rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwid
char *challenge1;
char challenge2[64];
char checksum[34];
- char subscribe[256];
- char buf[256];
+ char *subscribe;
+ char *buf = xbuffer_init(256);
char *mrl=rtsp_get_mrl(rtsp_session);
unsigned int size;
int status;
@@ -718,6 +722,7 @@ rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwid
printf("real: got message from server:\n%s\n", alert);
}
rtsp_send_ok(rtsp_session);
+ buf = xbuffer_free(buf);
return NULL;
}
@@ -743,9 +748,14 @@ rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwid
description[size]=0;
/* parse sdp (sdpplin) and create a header and a subscribe string */
+ subscribe = xbuffer_init(256);
strcpy(subscribe, "Subscribe: ");
- h=real_parse_sdp(description, subscribe+11, bandwidth);
- if (!h) return NULL;
+ h=real_parse_sdp(description, &subscribe, bandwidth);
+ if (!h) {
+ subscribe = xbuffer_free(subscribe);
+ buf = xbuffer_free(buf);
+ return NULL;
+ }
rmff_fix_header(h);
#ifdef LOG
@@ -755,19 +765,24 @@ rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwid
/* setup our streams */
real_calc_response_and_checksum (challenge2, checksum, challenge1);
+ buf = xbuffer_ensure_size(buf, strlen(challenge2) + strlen(checksum) + 32);
sprintf(buf, "RealChallenge2: %s, sd=%s", challenge2, checksum);
rtsp_schedule_field(rtsp_session, buf);
+ buf = xbuffer_ensure_size(buf, strlen(session_id) + 32);
sprintf(buf, "If-Match: %s", session_id);
rtsp_schedule_field(rtsp_session, buf);
rtsp_schedule_field(rtsp_session, "Transport: x-pn-tng/tcp;mode=play,rtp/avp/tcp;unicast;mode=play");
+ buf = xbuffer_ensure_size(buf, strlen(mrl) + 32);
sprintf(buf, "%s/streamid=0", mrl);
rtsp_request_setup(rtsp_session,buf);
if (h->prop->num_streams > 1) {
rtsp_schedule_field(rtsp_session, "Transport: x-pn-tng/tcp;mode=play,rtp/avp/tcp;unicast;mode=play");
+ buf = xbuffer_ensure_size(buf, strlen(session_id) + 32);
sprintf(buf, "If-Match: %s", session_id);
rtsp_schedule_field(rtsp_session, buf);
+ buf = xbuffer_ensure_size(buf, strlen(mrl) + 32);
sprintf(buf, "%s/streamid=1", mrl);
rtsp_request_setup(rtsp_session,buf);
}
@@ -794,5 +809,7 @@ rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwid
/* and finally send a play request */
rtsp_request_play(rtsp_session,NULL);
+ subscribe = xbuffer_free(subscribe);
+ buf = xbuffer_free(buf);
return h;
}