Gmane
From: Makayama Media <vincent <at> makayama.com>
Subject: [PATCH] ffmpeg as .dll
Newsgroups: gmane.comp.video.ffmpeg.devel
Date: 2005-03-08 06:11:50 GMT (3 years, 23 weeks, 4 days, 8 hours and 49 minutes ago)

This is my first submission, it's on behalf of my colleague, who wrote it.
It patches ffmpeg to operate as a win32-dll. This one was based on the one that was already patched for psp support.
If you have any questions, I probably need to check back with my colleague, so it may take some time before I can react. Enjoy, Vincent.
 
===================================================================

RCS file: /cvsroot/ffmpeg/ffmpeg/Makefile,v

retrieving revision 1.77

diff -u -r1.77 Makefile

--- Makefile 21 Jan 2005 22:16:04 -0000 1.77

+++ Makefile 1 Feb 2005 13:07:14 -0000

<at> <at> -56,7 +56,7 <at> <at>

endif

ifeq ($(CONFIG_FAAC),yes)

-EXTRALIBS+=-lfaac

+EXTRALIBS+=-lfaac -shared

endif

ifeq ($(CONFIG_XVID),yes)

Index: cmdutils.c

===================================================================

RCS file: /cvsroot/ffmpeg/ffmpeg/cmdutils.c,v

retrieving revision 1.7

diff -u -r1.7 cmdutils.c

--- cmdutils.c 20 Jan 2005 15:31:07 -0000 1.7

+++ cmdutils.c 1 Feb 2005 15:24:37 -0000

<at> <at> -16,12 +16,18 <at> <at>

* License along with this library; if not, write to the Free Software

* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

*/

+

#define HAVE_AV_CONFIG_H

#include "avformat.h"

#include "common.h"

#include "cmdutils.h"

+#include <setjmp.h>

+// extern static jmp_buf setjmp_mark;

+extern jmp_buf setjmp_mark;

+#define exit(X) longjmp( setjmp_mark, X|1 )

+

void show_help_options(const OptionDef *options, const char *msg, int mask, int value)

{

const OptionDef *po;

Index: ffmpeg.c

===================================================================

RCS file: /cvsroot/ffmpeg/ffmpeg/ffmpeg.c,v

retrieving revision 1.307

diff -u -r1.307 ffmpeg.c

--- ffmpeg.c 29 Jan 2005 02:27:33 -0000 1.307

+++ ffmpeg.c 1 Feb 2005 22:13:23 -0000

<at> <at> -16,6 +16,12 <at> <at>

* License along with this library; if not, write to the Free Software

* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

*/

+

+

+#include <setjmp.h>

+

+jmp_buf setjmp_mark;

+

#define HAVE_AV_CONFIG_H

#include <limits.h>

#include "avformat.h"

<at> <at> -39,10 +45,18 <at> <at>

#undef time //needed because HAVE_AV_CONFIG_H is defined on top

#include <time.h>

+#define exit(X) longjmp( setjmp_mark, X|1 )

#include "cmdutils.h"

#undef NDEBUG

#include <assert.h>

+#include <windows.h>

+#include <stdarg.h>

+typedef long (WINAPI *CallBack)(long pos, long total);

+

+

+#define getchar() 'y'

+// #define exit(X) return(X)

#if !defined(INFINITY) && defined(HUGE_VAL)

#define INFINITY HUGE_VAL

<at> <at> -60,6 +74,9 <at> <at>

int in_file;

} AVMetaDataMap;

+char g_errorbuffer[4096];

+static CallBack g_CallBack;

+

extern const OptionDef options[];

static void show_help(void);

<at> <at> -67,6 +84,8 <at> <at>

#define MAX_FILES 20

+static int g_registered = 0;

+

static AVFormatContext *input_files[MAX_FILES];

static int64_t input_files_ts_offset[MAX_FILES];

static int nb_input_files = 0;

<at> <at> -222,7 +241,7 <at> <at>

static int64_t start_time = 0;

static int64_t rec_timestamp = 0;

static int64_t input_ts_offset = 0;

-static int file_overwrite = 0;

+static int file_overwrite = 1;

static char *str_title = NULL;

static char *str_author = NULL;

static char *str_copyright = NULL;

<at> <at> -254,7 +273,7 <at> <at>

static int using_stdin = 0;

static int using_vhook = 0;

-static int verbose = 1;

+static int verbose = -1;

static int thread_count= 1;

static int q_pressed = 0;

static int me_range = 0;

<at> <at> -427,6 +446,23 <at> <at>

#endif

+#undef fprintf

+

+int fprintf(FILE *output,char *lpszMsgFmtStr, ...)

+{

+ char buf[2048];

+ va_list ap;

+

+ if(output != stderr) return 1;

+

+ va_start(ap, lpszMsgFmtStr);

+ vsnprintf(buf,2048,lpszMsgFmtStr, ap);

+ va_end(ap);

+ pstrcat(g_errorbuffer,4096,buf);

+ return 1;

+}

+

+

static int read_ffserver_streams(AVFormatContext *s, const char *filename)

{

int i, err;

<at> <at> -1933,6 +1969,7 <at> <at>

av_free_packet(&pkt);

/* dump report by using the output first video and audio streams */

+ if(g_CallBack(url_ftell(&is->pb),is->file_size)==0) break;

print_report(output_files, ost_table, nb_ostreams, 0);

}

<at> <at> -4161,17 +4198,19 <at> <at>

opt_output_file(filename);

}

-int main(int argc, char **argv)

+

+int main2(int argc, char **argv)

{

- int i;

+ // int i;

int64_t ti;

-

- av_register_all();

-

+ if(!g_registered) {

+ av_register_all();

+ g_registered = 1;

+ }

if (argc <= 1)

show_help();

- else

- show_banner();

+// else

+// show_banner();

/* parse options */

parse_options(argc, argv, options);

<at> <at> -4195,21 +4234,27 <at> <at>

printf("bench: utime=%0.3fs\n", ti / 1000000.0);

}

- /* close files */

- for(i=0;i<nb_output_files;i++) {

- /* maybe av_close_output_file ??? */

+

+// exit(0); /* not all OS-es handle main() return value */

+ return 0;

+}

+

+void clear_converter(void) {

+ int i;

+ for(i=0;i<nb_output_files;i++) {

AVFormatContext *s = output_files[i];

- int j;

- if (!(s->oformat->flags & AVFMT_NOFILE))

- url_fclose(&s->pb);

- for(j=0;j<s->nb_streams;j++)

- av_free(s->streams[j]);

+ int j;

+ if (!(s->oformat->flags & AVFMT_NOFILE))

+ url_fclose(&s->pb);

+ for(j=0;j<s->nb_streams;j++)

+ av_free(s->streams[j]);

av_free(s);

}

for(i=0;i<nb_input_files;i++)

av_close_input_file(input_files[i]);

- av_free_static();

+// av_free_static();

+

if(intra_matrix)

av_free(intra_matrix);

<at> <at> -4229,6 +4274,97 <at> <at>

exit (255);

}

#endif

- exit(0); /* not all OS-es handle main() return value */

- return 0;

+

+

+

+ nb_input_files = 0;

+ nb_output_files = 0;

+ nb_stream_maps =0;

+ nb_meta_data_maps = 0;

+

+

+}

+

+

+

+_stdcall __declspec(dllexport) int convert(

+ CallBack callback,

+ char *arg0,

+ char *arg1,

+ char *arg2,

+ char *arg3,

+ char *arg4,

+ char *arg5,

+ char *arg6,

+ char *arg7,

+ char *arg8,

+ char *arg9,

+ char *arg10,

+ char *arg11,

+ char *arg12,

+ char *arg13,

+ char *arg14,

+ char *arg15,

+ char *arg16,

+ char *arg17,

+ char *arg18,

+ char *arg19,

+ char *arg20,

+ char *arg21,

+ char *arg22,

+ char *arg23,

+ char *arg24,

+ char *arg25 )

+{

+

+ char *arg[26];

+ int i;

+ int argc = 1;

+

+ g_CallBack = callback;

+ arg[0] = arg0;

+ arg[1] = arg1;

+ arg[2] = arg2;

+ arg[3] = arg3;

+ arg[4] = arg4;

+ arg[5] = arg5;

+ arg[6] = arg6;

+ arg[7] = arg7;

+ arg[8] = arg8;

+ arg[9] = arg9;

+ arg[10] = arg10;

+ arg[11] = arg11;

+ arg[12] = arg12;

+ arg[13] = arg13;

+ arg[14] = arg14;

+ arg[15] = arg15;

+ arg[16] = arg16;

+ arg[17] = arg17;

+ arg[18] = arg18;

+ arg[19] = arg19;

+ arg[20] = arg20;

+ arg[21] = arg21;

+ arg[22] = arg22;

+ arg[23] = arg23;

+ arg[24] = arg24;

+ arg[25] = arg25;

+

+ for(i=1;i<=25;i++)

+ {

+ if(*arg[i]) argc++;

+ else break;

+ }

+ strcpy(g_errorbuffer,"");

+ int retval;

+ if(setjmp( setjmp_mark ) == 0) {

+ retval = main2(argc,arg);

+ }else{

+ MessageBox(NULL,g_errorbuffer,"Error",0);

+ retval = -1;

+ }

+

+ clear_converter();

+

+ return retval;

}

+

Index: libavcodec/Makefile

===================================================================

RCS file: /cvsroot/ffmpeg/ffmpeg/libavcodec/Makefile,v

retrieving revision 1.167

diff -u -r1.167 Makefile

--- libavcodec/Makefile 22 Jan 2005 17:52:00 -0000 1.167

+++ libavcodec/Makefile 31 Jan 2005 12:42:10 -0000

<at> <at> -187,7 +187,7 <at> <at>

ifeq ($(TARGET_ARCH_SPARC),yes)

OBJS+=sparc/dsputil_vis.o

sparc/%.o: sparc/%.c

- $(CC) -mcpu=ultrasparc -mtune=ultrasparc $(CFLAGS) -c -o $ <at> $<

+ $(CC) -mcpu=ultrasparc -mtune=ultrasparc $(CFLAGS) -c $ <at> $<

endif

ifeq ($(TARGET_ARCH_SPARC64),yes)

CFLAGS+= -mcpu=ultrasparc -mtune=ultrasparc

<at> <at> -231,7 +231,7 <at> <at>

$(MAKE) -C libpostproc

%.o: %.c

- $(CC) $(CFLAGS) -c -o $ <at> $<

+ $(CC) $(CFLAGS) -c $<

%.o: %.S

$(CC) $(CFLAGS) -c -o $ <at> $<

Index: libavcodec/mem.c

===================================================================

RCS file: /cvsroot/ffmpeg/ffmpeg/libavcodec/mem.c,v

retrieving revision 1.11

diff -u -r1.11 mem.c

--- libavcodec/mem.c 12 Jan 2005 11:14:12 -0000 1.11

+++ libavcodec/mem.c 1 Feb 2005 22:10:45 -0000

<at> <at> -33,6 +33,7 <at> <at>

#include <malloc.h>

#endif

+

/* you can redefine av_malloc and av_free in your project to use your

memory allocator. You do not need to suppress this file because the

linker will do it automatically */

<at> <at> -87,7 +88,8 <at> <at>

#else

ptr = malloc(size);

#endif

- return ptr;

+

+ return ptr;

}

/**

<at> <at> -110,6 +112,7 <at> <at>

#else

return realloc(ptr, size);

#endif

+

}

/* NOTE: ptr = NULL is explicetly allowed */

<at> <at> -122,5 +125,7 <at> <at>

#else

free(ptr);

#endif

+

+ ptr = NULL;

}