[Ffmpeg-devel] [PATCH] MingW RTSP support

Michael A. Kohn mike
Fri Mar 31 21:15:59 CEST 2006


This patch adds networking support for MingW allowing libavformat to
connect to RTSP sources.  The diff file was compared to CVS as of
March 31, 2006 at around 8am.


-------------- next part --------------
diff -Naur ffmpeg_orig/configure ffmpeg/configure
--- ffmpeg_orig/configure	2006-03-28 17:36:07.000000000 -0600
+++ ffmpeg/configure	2006-03-31 08:37:14.000000000 -0600
@@ -922,7 +922,8 @@
     dv1394="no"
     dc1394="no"
     ffserver="no"
-    network="no"
+    #network="no"
+    extralibs="$extralibs -lws2_32"
 if test "$mingwce" = "yes"; then
     protocols="no"
 fi
diff -Naur ffmpeg_orig/libavformat/http.c ffmpeg/libavformat/http.c
--- ffmpeg_orig/libavformat/http.c	2006-01-12 16:43:23.000000000 -0600
+++ ffmpeg/libavformat/http.c	2006-03-31 13:13:56.000000000 -0600
@@ -19,14 +19,16 @@
 #include "avformat.h"
 #include <unistd.h>
 #include <sys/types.h>
+#ifndef __MINGW32__
 #include <sys/socket.h>
 #include <netinet/in.h>
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
+#include <netdb.h>
+#endif
+#ifdef __BEOS__
 # include "barpainet.h"
+#elif !defined(__MINGW32__)
+# include <arpa/inet.h>
 #endif
-#include <netdb.h>
 
 
 /* XXX: POST protocol is not completly implemented because ffmpeg use
diff -Naur ffmpeg_orig/libavformat/os_support.c ffmpeg/libavformat/os_support.c
--- ffmpeg_orig/libavformat/os_support.c	2006-01-22 18:57:59.000000000 -0600
+++ ffmpeg/libavformat/os_support.c	2006-03-31 09:40:29.000000000 -0600
@@ -32,6 +32,9 @@
 #include <sys/time.h>
 #endif
 #include <time.h>
+#ifdef __MINGW32__
+#include <winsock.h>
+#endif
 
 /**
  * gets the current time in micro seconds.
@@ -65,3 +68,30 @@
 }
 #endif /* !defined(HAVE_LOCALTIME_R) */
 #endif /* !defined(CONFIG_WINCE) */
+
+#ifdef __MINGW32__
+int init_winsock()
+{
+WSADATA wsaData;
+WORD wVersionRequested=MAKEWORD(1,1);
+int Win32isStupid;
+
+  Win32isStupid=WSAStartup(wVersionRequested, &wsaData);
+  if (Win32isStupid) return -1;
+
+  return 0;
+}
+
+int inet_aton(const char *hostname, struct in_addr *sin_addr)
+{
+    sin_addr->s_addr=inet_addr(hostname);
+    if (sin_addr->s_addr == INADDR_NONE) {
+      return 0;
+    }
+
+    return -1;
+}
+#endif
+
+
+
diff -Naur ffmpeg_orig/libavformat/os_support.h ffmpeg/libavformat/os_support.h
--- ffmpeg_orig/libavformat/os_support.h	2004-04-24 06:51:38.000000000 -0500
+++ ffmpeg/libavformat/os_support.h	2006-03-31 13:10:17.000000000 -0600
@@ -13,7 +13,18 @@
 #ifdef __MINGW32__
 __declspec(dllimport) void __stdcall Sleep(unsigned long dwMilliseconds);
 // #  include <windows.h>
+#define GUID microsuck_GUID
+#include <winsock.h>
+#undef GUID
 #  define usleep(t)    Sleep((t) / 1000)
+#  define sleep(t)     Sleep((t) * 1000)
+typedef int socklen_t;
+#define O_NONBLOCK FIONBIO
+#define fcntl(fd,b,c) { u_long arg=1L; \
+                        ioctlsocket(fd, c, &arg); }
+// #define EINPROGRESS WSAEINPROGRESS
+#define EINPROGRESS 0
+int init_winsock();
 #endif
 
 #ifdef __BEOS__
diff -Naur ffmpeg_orig/libavformat/rtp.c ffmpeg/libavformat/rtp.c
--- ffmpeg_orig/libavformat/rtp.c	2006-03-30 10:44:32.000000000 -0600
+++ ffmpeg/libavformat/rtp.c	2006-03-31 13:14:03.000000000 -0600
@@ -22,14 +22,16 @@
 
 #include <unistd.h>
 #include <sys/types.h>
+#ifndef __MINGW32__
 #include <sys/socket.h>
 #include <netinet/in.h>
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
+#include <netdb.h>
+#endif
+#ifdef __BEOS__
 # include "barpainet.h"
+#elif !defined(__MINGW32__)
+# include <arpa/inet.h>
 #endif
-#include <netdb.h>
 
 //#define DEBUG
 
diff -Naur ffmpeg_orig/libavformat/rtpproto.c ffmpeg/libavformat/rtpproto.c
--- ffmpeg_orig/libavformat/rtpproto.c	2006-01-12 16:43:25.000000000 -0600
+++ ffmpeg/libavformat/rtpproto.c	2006-03-31 13:14:08.000000000 -0600
@@ -21,14 +21,16 @@
 #include <unistd.h>
 #include <stdarg.h>
 #include <sys/types.h>
+#ifndef __MINGW32__
 #include <sys/socket.h>
 #include <netinet/in.h>
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
+#include <netdb.h>
+#endif
+#ifdef __BEOS__
 # include "barpainet.h"
+#elif !defined(__MINGW32__)
+# include <arpa/inet.h>
 #endif
-#include <netdb.h>
 #include <fcntl.h>
 
 #define RTP_TX_BUF_SIZE  (64 * 1024)
diff -Naur ffmpeg_orig/libavformat/rtsp.c ffmpeg/libavformat/rtsp.c
--- ffmpeg_orig/libavformat/rtsp.c	2006-03-10 18:22:21.000000000 -0600
+++ ffmpeg/libavformat/rtsp.c	2006-03-31 13:14:12.000000000 -0600
@@ -20,12 +20,14 @@
 
 #include <unistd.h> /* for select() prototype */
 #include <sys/time.h>
+#ifndef __MINGW32__
 #include <netinet/in.h>
 #include <sys/socket.h>
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
+#endif
+#ifdef __BEOS__
 # include "barpainet.h"
+#elif !defined(__MINGW32__)
+# include <arpa/inet.h>
 #endif
 
 //#define DEBUG
diff -Naur ffmpeg_orig/libavformat/tcp.c ffmpeg/libavformat/tcp.c
--- ffmpeg_orig/libavformat/tcp.c	2006-02-02 07:07:30.000000000 -0600
+++ ffmpeg/libavformat/tcp.c	2006-03-31 13:06:43.000000000 -0600
@@ -19,17 +19,19 @@
 #include "avformat.h"
 #include <unistd.h>
 #include <sys/types.h>
+#ifndef __MINGW32__
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <netdb.h>
+#endif
 #if defined(__BEOS__) || defined(__INNOTEK_LIBC__)
 typedef int socklen_t;
 #endif
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
+#ifdef __BEOS__
 # include "barpainet.h"
+#elif !defined (__MINGW32__)
+# include <arpa/inet.h>
 #endif
-#include <netdb.h>
 #include <sys/time.h>
 #include <fcntl.h>
 
@@ -77,6 +79,10 @@
     if (port <= 0 || port >= 65536)
         goto fail;
 
+#ifdef __MINGW32__
+    init_winsock();
+#endif
+
     dest_addr.sin_family = AF_INET;
     dest_addr.sin_port = htons(port);
     if (resolve_host(&dest_addr.sin_addr, hostname) < 0)
@@ -147,11 +153,7 @@
         tv.tv_usec = 100 * 1000;
         ret = select(fd_max + 1, &rfds, NULL, NULL, &tv);
         if (ret > 0 && FD_ISSET(s->fd, &rfds)) {
-#ifdef __BEOS__
             len = recv(s->fd, buf, size, 0);
-#else
-            len = read(s->fd, buf, size);
-#endif
             if (len < 0) {
                 if (errno != EINTR && errno != EAGAIN)
 #ifdef __BEOS__
@@ -184,11 +186,7 @@
         tv.tv_usec = 100 * 1000;
         ret = select(fd_max + 1, NULL, &wfds, NULL, &tv);
         if (ret > 0 && FD_ISSET(s->fd, &wfds)) {
-#ifdef __BEOS__
             len = send(s->fd, buf, size, 0);
-#else
-            len = write(s->fd, buf, size);
-#endif
             if (len < 0) {
                 if (errno != EINTR && errno != EAGAIN) {
 #ifdef __BEOS__
@@ -211,7 +209,7 @@
 static int tcp_close(URLContext *h)
 {
     TCPContext *s = h->priv_data;
-#ifdef CONFIG_BEOS_NETSERVER
+#if defined(CONFIG_BEOS_NETSERVER) || defined(__MINGW32__)
     closesocket(s->fd);
 #else
     close(s->fd);
diff -Naur ffmpeg_orig/libavformat/udp.c ffmpeg/libavformat/udp.c
--- ffmpeg_orig/libavformat/udp.c	2006-01-12 16:43:25.000000000 -0600
+++ ffmpeg/libavformat/udp.c	2006-03-31 13:06:54.000000000 -0600
@@ -19,14 +19,16 @@
 #include "avformat.h"
 #include <unistd.h>
 #include <sys/types.h>
+#ifndef __MINGW32__
 #include <sys/socket.h>
+#include <netdb.h>
 #include <netinet/in.h>
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
+#endif
+#ifdef __BEOS__
 # include "barpainet.h"
+#elif !defined(__MINGW32__)
+# include <arpa/inet.h>
 #endif
-#include <netdb.h>
 
 #ifndef IPV6_ADD_MEMBERSHIP
 #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
@@ -211,7 +213,7 @@
 
  fail:
     if (udp_fd >= 0)
-#ifdef CONFIG_BEOS_NETSERVER
+#if defined(CONFIG_BEOS_NETSERVER) || defined(__MINGW32__)
         closesocket(udp_fd);
 #else
         close(udp_fd);
@@ -357,6 +359,11 @@
     getsockname(udp_fd, (struct sockaddr *)&my_addr1, &len);
     s->local_port = ntohs(my_addr1.sin_port);
 
+#ifdef __MINGW32__
+    tmp=65536;   /* 64k UDP buffer size.  Should this be bigger? */
+    setsockopt(udp_fd, SOL_SOCKET, SO_RCVBUF, &tmp, sizeof(tmp));
+#endif
+
 #ifndef CONFIG_BEOS_NETSERVER
     if (s->is_multicast) {
         if (h->flags & URL_WRONLY) {
@@ -411,7 +418,7 @@
     return 0;
  fail:
     if (udp_fd >= 0)
-#ifdef CONFIG_BEOS_NETSERVER
+#if defined(CONFIG_BEOS_NETSERVER) || defined(__MINGW32__)
         closesocket(udp_fd);
 #else
         close(udp_fd);
@@ -471,7 +478,7 @@
 {
     UDPContext *s = h->priv_data;
 
-#ifndef CONFIG_BEOS_NETSERVER
+#if !defined(CONFIG_BEOS_NETSERVER) && !defined(__MINGW32__)
 #ifndef CONFIG_IPV6
     if (s->is_multicast && !(h->flags & URL_WRONLY)) {
         if (setsockopt(s->udp_fd, IPPROTO_IP, IP_DROP_MEMBERSHIP,



More information about the ffmpeg-devel mailing list