$OpenBSD: patch-ffmpeg-php_c,v 1.3 2012/05/01 06:19:12 ajacoutot Exp $ --- ffmpeg-php.c.orig Mon Oct 13 15:00:08 2008 +++ ffmpeg-php.c Mon Apr 30 02:41:09 2012 @@ -51,8 +51,9 @@ #include "ext/standard/info.h" #include "php_ffmpeg.h" +#include "ffmpeg_errorhandler.h" -#define FFMPEG_PHP_VERSION "0.6.0-svn" +#define FFMPEG_PHP_VERSION "0.6.0+patches" zend_module_entry ffmpeg_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 @@ -76,9 +77,10 @@ zend_module_entry ffmpeg_module_entry = { ZEND_GET_MODULE(ffmpeg); #endif +#define FFMPEG_AVMEDIA_TYPE(flag) (flag == AVMEDIA_TYPE_VIDEO ? "v" : (flag == AVMEDIA_TYPE_AUDIO ? "a" : (flag == AVMEDIA_TYPE_SUBTITLE ? "s" : "u"))) + extern void register_ffmpeg_movie_class(int); extern void register_ffmpeg_frame_class(int); -extern void ffmpeg_errorhandler(void *ptr, int level, const char *msg, va_list args); PHP_INI_BEGIN() PHP_INI_ENTRY("ffmpeg.allow_persistent", "0", PHP_INI_ALL, NULL) @@ -90,9 +92,6 @@ PHP_INI_END() */ PHP_MINIT_FUNCTION(ffmpeg) { - /* must be called before using avcodec libraries. */ - avcodec_init(); - /* register all codecs */ av_register_all(); @@ -100,7 +99,9 @@ PHP_MINIT_FUNCTION(ffmpeg) if (INI_BOOL("ffmpeg.show_warnings")) { av_log_set_callback(ffmpeg_errorhandler); - } + } else { + av_log_set_callback(ffmpeg_hide_errors); + } register_ffmpeg_movie_class(module_number); register_ffmpeg_frame_class(module_number); @@ -119,6 +120,12 @@ PHP_MINIT_FUNCTION(ffmpeg) avcodec_build(), CONST_CS | CONST_PERSISTENT); #endif +#if HAVE_LIBGD20 + REGISTER_LONG_CONSTANT("FFMPEG_PHP_GD_ENABLED", 1, CONST_CS | CONST_PERSISTENT); +#else + REGISTER_LONG_CONSTANT("FFMPEG_PHP_GD_ENABLED", 0, CONST_CS | CONST_PERSISTENT); +#endif // HAVE_LIBGD20 + return SUCCESS; } /* }}} */ @@ -138,7 +145,7 @@ PHP_MSHUTDOWN_FUNCTION(ffmpeg) /* {{{ php info function - Add an entry for ffmpeg support in phpinfo() */ + Add an entry for ffmpeg-php support in phpinfo() */ PHP_MINFO_FUNCTION(ffmpeg) { php_info_print_table_start(); @@ -157,6 +164,37 @@ PHP_MINFO_FUNCTION(ffmpeg) #else php_info_print_table_row(2, "ffmpeg swscaler", "disabled"); #endif + + //phpinfo should show the codec list available to aid developers + AVCodec *next_codec = NULL; + char *m_codec_list = NULL; + long m_codec_list_len = 0; + long m_codec_len = 0; + while((next_codec = av_codec_next(next_codec))) { + //go through each codec and add to the list + m_codec_len = (strlen(next_codec->name) + 5); + m_codec_list_len += m_codec_len; + m_codec_list = realloc(m_codec_list, m_codec_list_len); + + //wtf? always gives buffer overflows... + //sprintf(m_codec_list+(m_codec_list_len-m_codec_len), "%s(%c), ", next_codec->name, FFMPEG_AVMEDIA_TYPE(next_codec->type)); + + //doing it the long way instead + memcpy(m_codec_list+(m_codec_list_len-m_codec_len), next_codec->name, m_codec_len); + memcpy(m_codec_list+(m_codec_list_len-5), "(", 1); + memcpy(m_codec_list+(m_codec_list_len-4), FFMPEG_AVMEDIA_TYPE(next_codec->type), 1); + memcpy(m_codec_list+(m_codec_list_len-3), ")", 1); + memcpy(m_codec_list+(m_codec_list_len-2), ", ", 2); + } + + m_codec_list = realloc(m_codec_list, m_codec_list_len+1); + m_codec_list[m_codec_list_len] = (char)NULL; + + //give the user a list of available codecs + //should really add (dec/enc) on the end of each to show each is capable of + //consider giving each codec its own row in in a codec table displaying if the codec is cable of a/v/s and enc/dec + php_info_print_table_row(2, "ffmpeg codec_list", m_codec_list); + php_info_print_table_end(); DISPLAY_INI_ENTRIES();