[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