diff options
Diffstat (limited to 'src/input/libreal/real.c')
-rw-r--r-- | src/input/libreal/real.c | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/src/input/libreal/real.c b/src/input/libreal/real.c index 5df0a8ec0..c3b70b6a5 100644 --- a/src/input/libreal/real.c +++ b/src/input/libreal/real.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: real.c,v 1.15 2004/04/22 15:23:55 hadess Exp $ + * $Id: real.c,v 1.16 2004/04/23 21:59:04 miguelfreitas Exp $ * * special functions for real streams. * adopted from joschkas real tools. @@ -379,7 +379,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; @@ -392,7 +392,7 @@ static int select_mlti_data(const char *mlti_chunk, int mlti_size, int selection ||(mlti_chunk[3] != 'I')) { lprintf("MLTI tag not detected, copying data\n"); - memcpy(out, mlti_chunk, mlti_size); + xine_buffer_copyin(*out, 0, mlti_chunk, mlti_size); return mlti_size; } @@ -433,7 +433,7 @@ static int select_mlti_data(const char *mlti_chunk, int mlti_size, int selection #ifdef LOG xine_hexdump(mlti_chunk+4, size); #endif - memcpy(out,mlti_chunk+4, size); + xine_buffer_copyin(*out, 0, mlti_chunk+4, size); return size; } @@ -445,7 +445,7 @@ 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; @@ -459,7 +459,8 @@ rmff_header_t *real_parse_sdp(char *data, char *stream_rules, uint32_t bandwidth desc=sdpplin_parse(data); if (!desc) return NULL; - + + buf=xine_buffer_init(2048); header = xine_xmalloc(sizeof(rmff_header_t)); header->fileheader=rmff_new_fileheader(4+desc->stream_count); @@ -485,12 +486,12 @@ rmff_header_t *real_parse_sdp(char *data, char *stream_rules, uint32_t bandwidth for (j=0; j<n; j++) { lprintf("asmrp rule match: %u for stream %u\n", rulematches[j], desc->stream[i]->stream_id); sprintf(b,"stream=%u;rule=%u,", desc->stream[i]->stream_id, rulematches[j]); - strcat(stream_rules, b); + xine_buffer_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, @@ -516,7 +517,7 @@ 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) + 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( @@ -533,11 +534,12 @@ rmff_header_t *real_parse_sdp(char *data, char *stream_rules, uint32_t bandwidth desc->flags); rmff_fix_header(header); + xine_buffer_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]; @@ -594,9 +596,10 @@ int real_get_rdt_chunk(rtsp_t *rtsp_session, char *buffer) { ph.timestamp=ts; ph.reserved=0; ph.flags=0; /* TODO: determine keyframe flag and insert here? */ - rmff_dump_pheader(&ph, buffer); + xine_buffer_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; } @@ -609,8 +612,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=xine_buffer_init(256); char *mrl=rtsp_get_mrl(rtsp_session); unsigned int size; int status; @@ -638,6 +641,7 @@ rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwid lprintf("real: got message from server:\n%s\n", alert); } rtsp_send_ok(rtsp_session); + xine_buffer_free(buf); return NULL; } @@ -661,9 +665,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=xine_buffer_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) { + xine_buffer_free(subscribe); + xine_buffer_free(buf); + return NULL; + } rmff_fix_header(h); lprintf("Title: %s\nCopyright: %s\nAuthor: %s\nStreams: %i\n", @@ -671,19 +680,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); + xine_buffer_ensure_size(buf, strlen(challenge2) + strlen(checksum) + 32); sprintf(buf, "RealChallenge2: %s, sd=%s", challenge2, checksum); rtsp_schedule_field(rtsp_session, buf); + xine_buffer_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"); + xine_buffer_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"); + xine_buffer_ensure_size(buf, strlen(session_id) + 32); sprintf(buf, "If-Match: %s", session_id); rtsp_schedule_field(rtsp_session, buf); + xine_buffer_ensure_size(buf, strlen(mrl) + 32); sprintf(buf, "%s/streamid=1", mrl); rtsp_request_setup(rtsp_session,buf); } @@ -695,6 +709,8 @@ rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwid rtsp_schedule_field(rtsp_session, "Range: npt=0-"); rtsp_request_play(rtsp_session,NULL); + xine_buffer_free(subscribe); + xine_buffer_free(buf); return h; } |