summaryrefslogtreecommitdiffstats
path: root/stream
diff options
context:
space:
mode:
authorUoti Urpala <uau@symbol.nonexistent.invalid>2008-07-01 16:18:21 +0300
committerUoti Urpala <uau@symbol.nonexistent.invalid>2008-07-01 16:18:21 +0300
commit7de350c673e1c0ae52d655e322a072f2f6b624b0 (patch)
tree346005084450b679f57c77daad2263fcdcf9e1de /stream
parent28fbfd2cdea5ffa860a251de274a74b0e85c88f0 (diff)
parent3ff9a6e7d82ff9a5231e561bd2686fab7df97f68 (diff)
downloadmpv-7de350c673e1c0ae52d655e322a072f2f6b624b0.tar.bz2
mpv-7de350c673e1c0ae52d655e322a072f2f6b624b0.tar.xz
Merge svn changes up to r27184
Diffstat (limited to 'stream')
-rw-r--r--stream/librtsp/rtsp.c104
-rw-r--r--stream/librtsp/rtsp.h54
-rw-r--r--stream/librtsp/rtsp_session.c26
-rw-r--r--stream/stream_dvdnav.h6
-rw-r--r--stream/tvi_v4l2.c38
5 files changed, 122 insertions, 106 deletions
diff --git a/stream/librtsp/rtsp.c b/stream/librtsp/rtsp.c
index 16a77f77d5..932114a762 100644
--- a/stream/librtsp/rtsp.c
+++ b/stream/librtsp/rtsp.c
@@ -33,14 +33,6 @@
#include <stdio.h>
#include <assert.h>
#include "config.h"
-#ifndef HAVE_WINSOCK2
-#define closesocket close
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#else
-#include <winsock2.h>
-#endif
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
@@ -50,7 +42,9 @@
#include <sys/time.h>
#include <sys/types.h>
#include <inttypes.h>
-
+#ifdef HAVE_WINSOCK2
+#include <winsock2.h>
+#endif
#include "mp_msg.h"
#include "rtsp.h"
#include "rtsp_session.h"
@@ -60,56 +54,6 @@
#define LOG
*/
-#define BUF_SIZE 4096
-#define HEADER_SIZE 1024
-#define MAX_FIELDS 256
-
-struct rtsp_s {
-
- int s;
-
- char *host;
- int port;
- char *path;
- char *param;
- char *mrl;
- char *user_agent;
-
- char *server;
- unsigned int server_state;
- uint32_t server_caps;
-
- unsigned int cseq;
- char *session;
-
- char *answers[MAX_FIELDS]; /* data of last message */
- char *scheduled[MAX_FIELDS]; /* will be sent with next message */
-};
-
-/*
- * constants
- */
-
-#define RTSP_PROTOCOL_VERSION "RTSP/1.0"
-
-/* server states */
-#define RTSP_CONNECTED 1
-#define RTSP_INIT 2
-#define RTSP_READY 4
-#define RTSP_PLAYING 8
-#define RTSP_RECORDING 16
-
-/* server capabilities */
-#define RTSP_OPTIONS 0x001
-#define RTSP_DESCRIBE 0x002
-#define RTSP_ANNOUNCE 0x004
-#define RTSP_SETUP 0x008
-#define RTSP_GET_PARAMETER 0x010
-#define RTSP_SET_PARAMETER 0x020
-#define RTSP_TEARDOWN 0x040
-#define RTSP_PLAY 0x080
-#define RTSP_RECORD 0x100
-
/*
* network utilities
*/
@@ -575,14 +519,22 @@ int rtsp_read_data(rtsp_t *s, char *buffer, unsigned int size) {
//rtsp_t *rtsp_connect(const char *mrl, const char *user_agent) {
rtsp_t *rtsp_connect(int fd, char* mrl, char *path, char *host, int port, char *user_agent) {
- rtsp_t *s=malloc(sizeof(rtsp_t));
+ rtsp_t *s;
int i;
-
+
+ if (fd < 0) {
+ mp_msg(MSGT_OPEN, MSGL_ERR, "rtsp: failed to connect to '%s'\n", host);
+ return NULL;
+ }
+
+ s = malloc(sizeof(rtsp_t));
+
for (i=0; i<MAX_FIELDS; i++) {
s->answers[i]=NULL;
s->scheduled[i]=NULL;
}
+ s->s = fd;
s->server=NULL;
s->server_state=0;
s->server_caps=0;
@@ -605,13 +557,6 @@ rtsp_t *rtsp_connect(int fd, char* mrl, char *path, char *host, int port, char *
s->param++;
//mp_msg(MSGT_OPEN, MSGL_INFO, "path=%s\n", s->path);
//mp_msg(MSGT_OPEN, MSGL_INFO, "param=%s\n", s->param ? s->param : "NULL");
- s->s = fd;
-
- if (s->s < 0) {
- mp_msg(MSGT_OPEN, MSGL_ERR, "rtsp: failed to connect to '%s'\n", s->host);
- rtsp_close(s);
- return NULL;
- }
s->server_state=RTSP_CONNECTED;
@@ -632,29 +577,6 @@ rtsp_t *rtsp_connect(int fd, char* mrl, char *path, char *host, int port, char *
/*
- * closes an rtsp connection
- */
-
-void rtsp_close(rtsp_t *s) {
-
- if (s->server_state)
- {
- if (s->server_state == RTSP_PLAYING)
- rtsp_request_teardown (s, NULL);
- closesocket (s->s);
- }
-
- if (s->path) free(s->path);
- if (s->host) free(s->host);
- if (s->mrl) free(s->mrl);
- if (s->session) free(s->session);
- if (s->user_agent) free(s->user_agent);
- rtsp_free_answers(s);
- rtsp_unschedule_all(s);
- free(s);
-}
-
-/*
* search in answers for tags. returns a pointer to the content
* after the first matched tag. returns NULL if no match found.
*/
diff --git a/stream/librtsp/rtsp.h b/stream/librtsp/rtsp.h
index 528dacaa42..efca1f7779 100644
--- a/stream/librtsp/rtsp.h
+++ b/stream/librtsp/rtsp.h
@@ -32,6 +32,7 @@
#ifndef MPLAYER_RTSP_H
#define MPLAYER_RTSP_H
+#include <inttypes.h>
/* some codes returned by rtsp_request_* functions */
@@ -45,6 +46,58 @@
#define RTSP_METHOD_TEARDOWN "TEARDOWN"
#define RTSP_METHOD_SET_PARAMETER "SET_PARAMETER"
+#define BUF_SIZE 4096
+#define HEADER_SIZE 1024
+#define MAX_FIELDS 256
+
+
+struct rtsp_s {
+
+ int s;
+
+ char *host;
+ int port;
+ char *path;
+ char *param;
+ char *mrl;
+ char *user_agent;
+
+ char *server;
+ unsigned int server_state;
+ uint32_t server_caps;
+
+ unsigned int cseq;
+ char *session;
+
+ char *answers[MAX_FIELDS]; /* data of last message */
+ char *scheduled[MAX_FIELDS]; /* will be sent with next message */
+};
+
+/*
+ * constants
+ */
+
+#define RTSP_PROTOCOL_VERSION "RTSP/1.0"
+
+/* server states */
+#define RTSP_CONNECTED 1
+#define RTSP_INIT 2
+#define RTSP_READY 4
+#define RTSP_PLAYING 8
+#define RTSP_RECORDING 16
+
+/* server capabilities */
+#define RTSP_OPTIONS 0x001
+#define RTSP_DESCRIBE 0x002
+#define RTSP_ANNOUNCE 0x004
+#define RTSP_SETUP 0x008
+#define RTSP_GET_PARAMETER 0x010
+#define RTSP_SET_PARAMETER 0x020
+#define RTSP_TEARDOWN 0x040
+#define RTSP_PLAY 0x080
+#define RTSP_RECORD 0x100
+
+
typedef struct rtsp_s rtsp_t;
rtsp_t* rtsp_connect (int fd, char *mrl, char *path, char *host, int port, char *user_agent);
@@ -66,7 +119,6 @@ void rtsp_add_to_payload(char **payload, const char *string);
void rtsp_free_answers(rtsp_t *this);
int rtsp_read (rtsp_t *this, char *data, int len);
-void rtsp_close (rtsp_t *this);
void rtsp_set_session(rtsp_t *s, const char *id);
char *rtsp_get_session(rtsp_t *s);
diff --git a/stream/librtsp/rtsp_session.c b/stream/librtsp/rtsp_session.c
index a3559212b2..d999323fcd 100644
--- a/stream/librtsp/rtsp_session.c
+++ b/stream/librtsp/rtsp_session.c
@@ -31,12 +31,15 @@
#include <sys/types.h>
#include "config.h"
#ifndef HAVE_WINSOCK2
+#define closesocket close
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#else
#include <winsock2.h>
#endif
+
+
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
@@ -73,6 +76,29 @@ struct rtsp_session_s {
struct rtp_rtsp_session_t* rtp_session;
};
+/*
+ * closes an rtsp connection
+ */
+
+static void rtsp_close(rtsp_t *s) {
+
+ if (s->server_state)
+ {
+ if (s->server_state == RTSP_PLAYING)
+ rtsp_request_teardown (s, NULL);
+ closesocket (s->s);
+ }
+
+ if (s->path) free(s->path);
+ if (s->host) free(s->host);
+ if (s->mrl) free(s->mrl);
+ if (s->session) free(s->session);
+ if (s->user_agent) free(s->user_agent);
+ rtsp_free_answers(s);
+ rtsp_unschedule_all(s);
+ free(s);
+}
+
//rtsp_session_t *rtsp_session_start(char *mrl) {
rtsp_session_t *rtsp_session_start(int fd, char **mrl, char *path, char *host,
int port, int *redir, uint32_t bandwidth, char *user, char *pass) {
diff --git a/stream/stream_dvdnav.h b/stream/stream_dvdnav.h
index a7e3c90bd6..0f0a93211e 100644
--- a/stream/stream_dvdnav.h
+++ b/stream/stream_dvdnav.h
@@ -5,12 +5,6 @@
#include "stream.h"
typedef struct {
- int event; /* event number fromd dvdnav_events.h */
- void * details; /* event details */
- int len; /* bytes in details */
-} dvdnav_event_t;
-
-typedef struct {
uint16_t sx, sy;
uint16_t ex, ey;
uint32_t palette;
diff --git a/stream/tvi_v4l2.c b/stream/tvi_v4l2.c
index a13d4c203a..97bce47754 100644
--- a/stream/tvi_v4l2.c
+++ b/stream/tvi_v4l2.c
@@ -336,13 +336,23 @@ static int amode2v4l(int amode)
}
+/*
+** Get current FPS.
+*/
+static double getfps(priv_t *priv)
+{
+ if (priv->tv_param->fps > 0)
+ return priv->tv_param->fps;
+ if (priv->standard.frameperiod.denominator && priv->standard.frameperiod.numerator)
+ return (double)priv->standard.frameperiod.denominator / priv->standard.frameperiod.numerator;
+ return 25.0;
+}
+
// sets and sanitizes audio buffer/block sizes
static void setup_audio_buffer_sizes(priv_t *priv)
{
int bytes_per_sample = priv->audio_in.bytes_per_sample;
- double fps = (double)priv->standard.frameperiod.denominator /
- priv->standard.frameperiod.numerator;
- int seconds = priv->video_buffer_size_max/fps;
+ int seconds = priv->video_buffer_size_max/getfps(priv);
if (seconds < 5) seconds = 5;
if (seconds > 500) seconds = 500;
@@ -438,6 +448,18 @@ static int getstd(priv_t *priv)
int i=0;
if (ioctl(priv->video_fd, VIDIOC_G_STD, &id) < 0) {
+ struct v4l2_streamparm parm;
+
+ parm.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ if(ioctl(priv->video_fd, VIDIOC_G_PARM, &parm) >= 0) {
+ mp_msg(MSGT_TV, MSGL_WARN, "%s: your device driver does not support VIDIOC_G_STD ioctl,"
+ " VIDIOC_G_PARM was used instead.\n", info.short_name);
+ priv->standard.index=0;
+ priv->standard.id=0;
+ priv->standard.frameperiod=parm.parm.capture.timeperframe;
+ return 0;
+ }
+
mp_msg(MSGT_TV, MSGL_ERR, "%s: ioctl get standard failed: %s\n",
info.short_name, strerror(errno));
return -1;
@@ -701,6 +723,10 @@ static int control(priv_t *priv, int cmd, void *arg)
priv->immediate_mode = 1;
return TVI_CONTROL_TRUE;
case TVI_CONTROL_VID_GET_FPS:
+ if (!priv->standard.frameperiod.denominator || !priv->standard.frameperiod.numerator) {
+ mp_msg(MSGT_TV, MSGL_ERR, "%s: Cannot get fps\n", info.short_name);
+ return TVI_CONTROL_FALSE;
+ }
*(float *)arg = (float)priv->standard.frameperiod.denominator /
priv->standard.frameperiod.numerator;
mp_msg(MSGT_TV, MSGL_V, "%s: get fps: %f\n", info.short_name,
@@ -1089,11 +1115,7 @@ static int uninit(priv_t *priv)
struct v4l2_buffer buf;
/* get performance */
- frames = 1 + (priv->curr_frame - priv->first_frame +
- priv->standard.frameperiod.numerator * 500000 /
- priv->standard.frameperiod.denominator) *
- priv->standard.frameperiod.denominator /
- priv->standard.frameperiod.numerator / 1000000;
+ frames = 1 + lrintf((double)(priv->curr_frame - priv->first_frame) / (1e6 * getfps(priv)));
dropped = frames - priv->frames;
/* turn off streaming */