[Ffmpeg-devel] question on rtsp with libavformat

Michael A. Kohn mike
Fri Jun 23 19:11:23 CEST 2006


On Thu, 22 Jun 2006, sfjester at umd.edu wrote:

> Okay, I applied the patch, and it seems like everything
> compliled fine, but attempting to create libavformat.dll
> comes back with an "undefined reference to" error for every
> winsock function used anywhere in the project.
> Example:
> os_support.o(.text+0xdb): In function "init_winsock':
> c:/ffmpeg/libavformat/os_support.c:80 undefined reference
> to "WSAAtartup at 8'
> but for every winsock function in any file; htons at 4,
> getsockname at 12, etc.
>
> My program pretty much needs to be built in VC++ to be
> incorperated into the rest of the project, so without the DLL
> there isn't much I can do.
>
> Is there a patch for the makefile or something similar that
> would fix this?  Or any other suggestions?  I'd hate to have
> to start over on this project after all the work I've put
> into it :(

Apply this patch to the latest source from subversion... this will
add the work arounds for mingw and make it compile properly..

I think there is a bug in the configure script that is deleting the 
extralibs variable or maybe it only happens with MINGW.  The line is
in the function save_flags() and it says:

    flags_saved && return

The return isn't allowing the rest of the function to run and therefore 
the $extralibs variable is becoming blank.

The only problem left is, RTSP servers expect the client to send RR 
packets periodically and ffmpeg doesn't send these.  There was a patch 
about a  month ago to fix that, but I guess it was never applied so you 
might have to get that one too.

Hopefully some maintainer will eventually find value in this patch and add 
it to the source tree (along with the patch that fixes RTSP to send RR 
packets).

/mike

-------------- next part --------------
diff -Naur ffmpeg_orig/configure ffmpeg/configure
--- ffmpeg_orig/configure	2006-06-23 09:07:04.000000000 -0500
+++ ffmpeg/configure	2006-06-23 10:19:52.000000000 -0500
@@ -143,7 +143,7 @@
 }
 
 save_flags(){
-    flags_saved && return
+    #flags_saved && return
     SAVE_CFLAGS="$CFLAGS"
     SAVE_LDFLAGS="$LDFLAGS"
     SAVE_extralibs="$extralibs"
@@ -1124,7 +1124,7 @@
     dv1394="no"
     dc1394="no"
     ffserver="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-06-23 09:07:04.000000000 -0500
+++ ffmpeg/libavformat/http.c	2006-06-23 09:22:38.000000000 -0500
@@ -19,14 +19,12 @@
 #include "avformat.h"
 #include <unistd.h>
 #include <sys/types.h>
+#if !defined(__MINGW32__) && !defined(__BEOS__)
 #include <sys/socket.h>
 #include <netinet/in.h>
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
-# include "barpainet.h"
-#endif
 #include <netdb.h>
+#include <arpa/inet.h>
+#endif
 
 
 /* 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-06-23 09:07:04.000000000 -0500
+++ ffmpeg/libavformat/os_support.c	2006-06-23 09:20:15.000000000 -0500
@@ -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	2006-06-23 09:07:04.000000000 -0500
+++ ffmpeg/libavformat/os_support.h	2006-06-23 09:17:57.000000000 -0500
@@ -10,10 +10,30 @@
  * - strcasecmp() (OS/2)
  */
 
+#ifdef __BEOS__
+#include "barpainet.h"
+#endif
+
+#if defined(__BEOS__) || defined(__MINGW32__) || defined(__INNOTEK_LIBC__)
+typedef int socklen_t;
+#endif
+
+
 #ifdef __MINGW32__
 __declspec(dllimport) void __stdcall Sleep(unsigned long dwMilliseconds);
 // #  include <windows.h>
+#define GUID microsoft_issue_GUID
+#include <winsock.h>
+#undef GUID
 #  define usleep(t)    Sleep((t) / 1000)
+#  define sleep(t)     Sleep((t) * 1000)
+#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-06-23 09:07:04.000000000 -0500
+++ ffmpeg/libavformat/rtp.c	2006-06-23 09:24:05.000000000 -0500
@@ -22,14 +22,12 @@
 
 #include <unistd.h>
 #include <sys/types.h>
+#if !defined(__MINGW32__) && !defined(__BEOS__)
 #include <sys/socket.h>
 #include <netinet/in.h>
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
-# include "barpainet.h"
-#endif
 #include <netdb.h>
+#include <arpa/inet.h>
+#endif
 
 //#define DEBUG
 
diff -Naur ffmpeg_orig/libavformat/rtpproto.c ffmpeg/libavformat/rtpproto.c
--- ffmpeg_orig/libavformat/rtpproto.c	2006-06-23 09:07:04.000000000 -0500
+++ ffmpeg/libavformat/rtpproto.c	2006-06-23 09:25:11.000000000 -0500
@@ -21,15 +21,13 @@
 #include <unistd.h>
 #include <stdarg.h>
 #include <sys/types.h>
+#include <fcntl.h>
+#if !defined(__MINGW32__) && !defined(__BEOS__)
 #include <sys/socket.h>
 #include <netinet/in.h>
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
-# include "barpainet.h"
-#endif
 #include <netdb.h>
-#include <fcntl.h>
+#include <arpa/inet.h>
+#endif
 
 #define RTP_TX_BUF_SIZE  (64 * 1024)
 #define RTP_RX_BUF_SIZE  (128 * 1024)
diff -Naur ffmpeg_orig/libavformat/rtsp.c ffmpeg/libavformat/rtsp.c
--- ffmpeg_orig/libavformat/rtsp.c	2006-06-23 09:07:04.000000000 -0500
+++ ffmpeg/libavformat/rtsp.c	2006-06-23 09:26:08.000000000 -0500
@@ -20,12 +20,10 @@
 
 #include <unistd.h> /* for select() prototype */
 #include <sys/time.h>
+#if !defined(__MINGW32__) && !defined(__BEOS__)
 #include <netinet/in.h>
 #include <sys/socket.h>
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
-# include "barpainet.h"
+#include <arpa/inet.h>
 #endif
 
 //#define DEBUG
diff -Naur ffmpeg_orig/libavformat/tcp.c ffmpeg/libavformat/tcp.c
--- ffmpeg_orig/libavformat/tcp.c	2006-06-23 09:07:04.000000000 -0500
+++ ffmpeg/libavformat/tcp.c	2006-06-23 09:30:17.000000000 -0500
@@ -19,19 +19,14 @@
 #include "avformat.h"
 #include <unistd.h>
 #include <sys/types.h>
+#include <sys/time.h>
+#include <fcntl.h>
+#if !defined(__MINGW32__) && !defined(__BEOS__)
 #include <sys/socket.h>
 #include <netinet/in.h>
-#if defined(__BEOS__) || defined(__INNOTEK_LIBC__)
-typedef int socklen_t;
-#endif
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
-# include "barpainet.h"
-#endif
 #include <netdb.h>
-#include <sys/time.h>
-#include <fcntl.h>
+#include <arpa/inet.h>
+#endif
 
 typedef struct TCPContext {
     int fd;
@@ -77,6 +72,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 +146,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 +179,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 +202,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-06-23 09:07:04.000000000 -0500
+++ ffmpeg/libavformat/udp.c	2006-06-23 09:34:06.000000000 -0500
@@ -19,14 +19,12 @@
 #include "avformat.h"
 #include <unistd.h>
 #include <sys/types.h>
+#if !defined(__MINGW32__) && !defined(__BEOS__)
 #include <sys/socket.h>
+#include <netdb.h>
 #include <netinet/in.h>
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
-# include "barpainet.h"
+#include <arpa/inet.h>
 #endif
-#include <netdb.h>
 
 #ifndef IPV6_ADD_MEMBERSHIP
 #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
@@ -211,7 +209,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 +355,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 +414,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 +474,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,
diff -Naur ffmpeg_orig/version.h ffmpeg/version.h
--- ffmpeg_orig/version.h	1969-12-31 18:00:00.000000000 -0600
+++ ffmpeg/version.h	2006-06-23 09:35:16.000000000 -0500
@@ -0,0 +1 @@
+#define FFMPEG_VERSION "SVN-r"



More information about the ffmpeg-devel mailing list