split rtp stack, udp input layer and rtp input layer from rtp.c

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@19319 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
ben 2006-08-04 18:32:36 +00:00
parent 2410b87a64
commit 2d79655938
6 changed files with 229 additions and 84 deletions

View File

@ -87,6 +87,8 @@ SRCS += asf_streaming.c \
pnm.c \
rtp.c \
stream_rtsp.c \
stream_rtp.c \
stream_udp.c \
SRCS += realrtsp/asmrp.c \
realrtsp/real.c \

View File

@ -30,7 +30,6 @@
#define DEBUG 1
#include "rtp.h"
extern int network_bandwidth;
#define DEBUG 1
@ -205,7 +204,7 @@ int read_rtp_from_server(int fd, char *buffer, int length) {
}
// Start listening on a UDP port. If multicast, join the group.
static int rtp_open_socket( URL_t *url ) {
int rtp_open_socket( URL_t *url ) {
int socket_server_fd, rxsockbufsz;
int err, err_len;
fd_set set;
@ -315,36 +314,6 @@ err_out:
return -1;
}
static int rtp_streaming_read( int fd, char *buffer, int size, streaming_ctrl_t *streaming_ctrl ) {
return read_rtp_from_server( fd, buffer, size );
}
static int rtp_streaming_start( stream_t *stream, int raw_udp ) {
streaming_ctrl_t *streaming_ctrl;
int fd;
if( stream==NULL ) return -1;
streaming_ctrl = stream->streaming_ctrl;
fd = stream->fd;
if( fd<0 ) {
fd = rtp_open_socket( (streaming_ctrl->url) );
if( fd<0 ) return -1;
stream->fd = fd;
}
if(raw_udp)
streaming_ctrl->streaming_read = nop_streaming_read;
else
streaming_ctrl->streaming_read = rtp_streaming_read;
streaming_ctrl->streaming_seek = nop_streaming_seek;
streaming_ctrl->prebuffer_size = 64*1024; // 64 KBytes
streaming_ctrl->buffering = 0;
streaming_ctrl->status = streaming_playing_e;
return 0;
}
static int getrtp2(int fd, struct rtpheader *rh, char** data, int* lengthData) {
static char buf[1600];
unsigned int intP;
@ -382,53 +351,3 @@ static int getrtp2(int fd, struct rtpheader *rh, char** data, int* lengthData) {
return(0);
}
static int open_s(stream_t *stream,int mode, void* opts, int* file_format) {
URL_t *url;
int udp = 0;
mp_msg(MSGT_OPEN, MSGL_INFO, "STREAM_RTP, URL: %s\n", stream->url);
stream->streaming_ctrl = streaming_ctrl_new();
if( stream->streaming_ctrl==NULL ) {
return STREAM_ERROR;
}
stream->streaming_ctrl->bandwidth = network_bandwidth;
url = url_new(stream->url);
stream->streaming_ctrl->url = check4proxies(url);
if( url->port==0 ) {
mp_msg(MSGT_NETWORK,MSGL_ERR,"You must enter a port number for RTP and UDP streams!\n");
goto fail;
}
if(!strncmp(stream->url, "udp", 3))
udp = 1;
if(rtp_streaming_start(stream, udp) < 0) {
mp_msg(MSGT_NETWORK,MSGL_ERR,"rtp_streaming_start(rtp) failed\n");
goto fail;
}
stream->type = STREAMTYPE_STREAM;
fixup_network_stream_cache(stream);
return STREAM_OK;
fail:
streaming_ctrl_free( stream->streaming_ctrl );
stream->streaming_ctrl = NULL;
return STREAM_UNSUPORTED;
}
stream_info_t stream_info_rtp_udp = {
"mpeg rtp and upd streaming",
"rtp and udp",
"Dave Chapman",
"native rtp support",
open_s,
{"rtp", "udp", NULL},
NULL,
0 // Urls are an option string
};

View File

@ -34,5 +34,6 @@ struct rtpheader { /* in network byte order */
static int getrtp2(int fd, struct rtpheader *rh, char** data, int* lengthData);
int read_rtp_from_server(int fd, char *buffer, int length);
int rtp_open_socket (URL_t *url);
#endif

View File

@ -47,7 +47,8 @@ extern stream_info_t stream_info_netstream;
extern stream_info_t stream_info_pnm;
extern stream_info_t stream_info_asf;
extern stream_info_t stream_info_rtsp;
extern stream_info_t stream_info_rtp_udp;
extern stream_info_t stream_info_rtp;
extern stream_info_t stream_info_udp;
extern stream_info_t stream_info_http1;
extern stream_info_t stream_info_http2;
#endif
@ -102,7 +103,8 @@ stream_info_t* auto_open_streams[] = {
&stream_info_sdp,
&stream_info_rtsp_sip,
#endif
&stream_info_rtp_udp,
&stream_info_rtp,
&stream_info_udp,
&stream_info_http2,
#endif
#ifdef HAS_DVBIN_SUPPORT

114
stream/stream_rtp.c Normal file
View File

@ -0,0 +1,114 @@
/*
* Copyright (C) 2006 Benjamin Zores
* Stream layer for MPEG over RTP, based on previous work from Dave Chapman
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "config.h"
#include <stdlib.h>
#include <string.h>
#include "stream.h"
#include "url.h"
#include "rtp.h"
static int
rtp_streaming_read (int fd, char *buffer,
int size, streaming_ctrl_t *streaming_ctrl)
{
return read_rtp_from_server (fd, buffer, size);
}
static int
rtp_streaming_start (stream_t *stream)
{
streaming_ctrl_t *streaming_ctrl;
int fd;
if (!stream)
return -1;
streaming_ctrl = stream->streaming_ctrl;
fd = stream->fd;
if (fd < 0)
{
fd = rtp_open_socket (streaming_ctrl->url);
if (fd < 0)
return -1;
stream->fd = fd;
}
streaming_ctrl->streaming_read = rtp_streaming_read;
streaming_ctrl->streaming_seek = nop_streaming_seek;
streaming_ctrl->prebuffer_size = 64 * 1024; /* 64 KBytes */
streaming_ctrl->buffering = 0;
streaming_ctrl->status = streaming_playing_e;
return 0;
}
static int
rtp_stream_open (stream_t *stream, int mode, void *opts, int *file_format)
{
URL_t *url;
extern int network_bandwidth;
mp_msg (MSGT_OPEN, MSGL_INFO, "STREAM_RTP, URL: %s\n", stream->url);
stream->streaming_ctrl = streaming_ctrl_new ();
if (!stream->streaming_ctrl)
return STREAM_ERROR;
stream->streaming_ctrl->bandwidth = network_bandwidth;
url = url_new (stream->url);
stream->streaming_ctrl->url = check4proxies (url);
if (url->port == 0)
{
mp_msg (MSGT_NETWORK, MSGL_ERR,
"You must enter a port number for RTP streams!\n");
streaming_ctrl_free (stream->streaming_ctrl);
stream->streaming_ctrl = NULL;
return STREAM_UNSUPORTED;
}
if (rtp_streaming_start (stream) < 0)
{
mp_msg (MSGT_NETWORK, MSGL_ERR, "rtp_streaming_start failed\n");
streaming_ctrl_free (stream->streaming_ctrl);
stream->streaming_ctrl = NULL;
return STREAM_UNSUPORTED;
}
stream->type = STREAMTYPE_STREAM;
fixup_network_stream_cache (stream);
return STREAM_OK;
}
stream_info_t stream_info_rtp = {
"MPEG over RTP streaming",
"rtp",
"Dave Chapman, Benjamin Zores",
"native rtp support",
rtp_stream_open,
{ "rtp", NULL},
NULL,
0 // Urls are an option string
};

107
stream/stream_udp.c Normal file
View File

@ -0,0 +1,107 @@
/*
* Copyright (C) 2006 Benjamin Zores
* Stream layer for MPEG over UDP, based on previous work from Dave Chapman
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "config.h"
#include <stdlib.h>
#include <string.h>
#include "stream.h"
#include "url.h"
#include "rtp.h"
static int
udp_streaming_start (stream_t *stream)
{
streaming_ctrl_t *streaming_ctrl;
int fd;
if (!stream)
return -1;
streaming_ctrl = stream->streaming_ctrl;
fd = stream->fd;
if (fd < 0)
{
fd = rtp_open_socket (streaming_ctrl->url);
if (fd < 0)
return -1;
stream->fd = fd;
}
streaming_ctrl->streaming_read = nop_streaming_read;
streaming_ctrl->streaming_seek = nop_streaming_seek;
streaming_ctrl->prebuffer_size = 64 * 1024; /* 64 KBytes */
streaming_ctrl->buffering = 0;
streaming_ctrl->status = streaming_playing_e;
return 0;
}
static int
udp_stream_open (stream_t *stream, int mode, void *opts, int *file_format)
{
URL_t *url;
extern int network_bandwidth;
mp_msg (MSGT_OPEN, MSGL_INFO, "STREAM_UDP, URL: %s\n", stream->url);
stream->streaming_ctrl = streaming_ctrl_new ();
if (!stream->streaming_ctrl)
return STREAM_ERROR;
stream->streaming_ctrl->bandwidth = network_bandwidth;
url = url_new (stream->url);
stream->streaming_ctrl->url = check4proxies (url);
if (url->port == 0)
{
mp_msg (MSGT_NETWORK, MSGL_ERR,
"You must enter a port number for UDP streams!\n");
streaming_ctrl_free (stream->streaming_ctrl);
stream->streaming_ctrl = NULL;
return STREAM_UNSUPORTED;
}
if (udp_streaming_start (stream) < 0)
{
mp_msg (MSGT_NETWORK, MSGL_ERR, "udp_streaming_start failed\n");
streaming_ctrl_free (stream->streaming_ctrl);
stream->streaming_ctrl = NULL;
return STREAM_UNSUPORTED;
}
stream->type = STREAMTYPE_STREAM;
fixup_network_stream_cache (stream);
return STREAM_OK;
}
stream_info_t stream_info_udp = {
"MPEG over UDP streaming",
"udp",
"Dave Chapman, Benjamin Zores",
"native udp support",
udp_stream_open,
{ "udp", NULL},
NULL,
0 // Urls are an option string
};