[Icecast-dev] [PATCH] icecast video preview 2

kysucix kysucix at dyne.org
Fri Nov 11 11:37:29 PST 2005


hem here it is the patch. ;)
bye
kysucix
-------------- next part --------------
Index: conf/icecast.xml.in
===================================================================
--- conf/icecast.xml.in	(revisione 10365)
+++ conf/icecast.xml.in	(copia locale)
@@ -62,6 +62,7 @@
         <port>8001</port>
     </listen-socket>
     -->
+    <video-preview>1</video-preview>
 
     <!--<master-server>127.0.0.1</master-server>-->
     <!--<master-server-port>8001</master-server-port>-->
Index: configure.in
===================================================================
--- configure.in	(revisione 10365)
+++ configure.in	(copia locale)
@@ -50,6 +50,33 @@
 
 dnl Checks for libraries.
 
+AC_ARG_WITH(png,
+	    [  --with-png[[=path]]       Use libpng to preview files (default=yes)],
+	    if test "$withval" = "yes"; then
+		    extrapath=default
+	    elif test "$withval" = "no"; then
+		    extrapath=
+	    else
+		    extrapath=$withval
+	    fi,
+	    extrapath=default)
+
+if test -n "$extrapath"; then
+  if test "$extrapath" != default; then
+dnl    CFLAGS="$CPPFLAGS -I$extrapath/include"
+    LIBS="$LIBS -L$extrapath/lib"
+  fi
+  AC_CHECK_HEADER(png.h,
+    [AC_CHECK_LIB(png, png_libpng_ver,
+        [AC_DEFINE(WITH_PNG,
+                   1,
+                   [Define as 1 if you want to enable generation of PNGs])]
+	ICECAST_OPTIONAL="$ICECAST_OPTIONAL video_preview.o"
+         LIBS="$LIBS -lpng -lz",
+        echo "png library not found or too old -- not including PNG support",
+        -lz)])
+fi
+
 dnl Checks for header files.
 AC_HEADER_STDC
 
Index: src/format_theora.c
===================================================================
--- src/format_theora.c	(revisione 10365)
+++ src/format_theora.c	(copia locale)
@@ -12,7 +12,6 @@
 
 
 /* Ogg codec handler for theora logical streams */
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
@@ -28,11 +27,13 @@
 #include "format_theora.h"
 #include "client.h"
 #include "stats.h"
+#include "video_preview.h"
 
 #define CATMODULE "format-theora"
+#define PREVIEW_KEYFRAME_INTERVAL 3
 #include "logging.h"
+#include <png.h>
 
-
 typedef struct _theora_codec_tag
 {
     theora_info     ti;
@@ -40,9 +41,14 @@
     int             granule_shift;
     ogg_int64_t     last_iframe;
     ogg_int64_t     prev_granulepos;
+#ifdef WITH_PNG
+    theora_state    td;
+    video_preview_t *video_preview;
+    yuv_buffer      yuv;
+    int 	    frame_count;
+#endif
 } theora_codec_t;
 
-
 static void theora_codec_free (ogg_state_t *ogg_info, ogg_codec_t *codec)
 {
     theora_codec_t *theora = codec->specific;
@@ -50,8 +56,17 @@
     DEBUG0 ("freeing theora codec");
     stats_event (ogg_info->mount, "video_bitrate", NULL);
     stats_event (ogg_info->mount, "video_quality", NULL);
+#ifdef WITH_PNG
+    stats_event (ogg_info->mount, "video_preview", NULL);
+#endif 
     stats_event (ogg_info->mount, "frame_rate", NULL);
     stats_event (ogg_info->mount, "frame_size", NULL);
+
+
+#ifdef WITH_PNG
+    free_video_preview (theora -> video_preview);
+    theora_clear(&theora -> td);
+#endif
     theora_info_clear (&theora->ti);
     theora_comment_clear (&theora->tc);
     ogg_stream_clear (&codec->os);
@@ -112,8 +127,32 @@
             ERROR0 ("Not enough header packets");
             return NULL;
         }
-        if (theora_packet_iskeyframe (&packet))
-            has_keyframe = 1;
+        if (theora_packet_iskeyframe (&packet)) {
+#ifdef WITH_PNG
+		if(config_get_config()->video_preview == 1 ) {
+			config_release_config();
+
+			if (theora ->  frame_count == -1) {
+				fflush(stdout);
+				theora_decode_init (&theora->td, &theora-> ti);
+			}
+
+			if ((theora -> frame_count % PREVIEW_KEYFRAME_INTERVAL )== 0) {
+				fflush(stdout);
+				theora_decode_packetin (&theora->td, &packet);
+				theora_decode_YUVout   (&theora->td, &theora -> yuv);
+				write_video_preview (&theora -> yuv, theora -> video_preview);
+				theora -> frame_count = 0;
+			}
+
+				fflush(stdout);
+			theora -> frame_count++;
+
+		}
+#endif
+		has_keyframe = 1;
+	}
+
     }
     if (header_page)
     {
@@ -179,6 +218,12 @@
     codec->headers = 1;
     codec->name = "Theora";
 
+#ifdef WITH_PNG
+    theora_info *ti = &theora_codec->ti;
+    init_video_preview(ogg_info->mount, ti->width, ti->height, ti -> offset_x, ti -> offset_y , &theora_codec -> video_preview);
+    theora_codec -> frame_count = -1;
+#endif
+
     format_ogg_attach_header (ogg_info, page);
     ogg_info->codec_sync = codec;
     return codec;
Index: src/format_theora.h
===================================================================
--- src/format_theora.h	(revisione 10365)
+++ src/format_theora.h	(copia locale)
@@ -14,6 +14,7 @@
 #ifndef __FORMAT_THEORA_H
 #define __FORMAT_THEORA_H
 
+#include <theora/theora.h>
 #include "format_ogg.h"
 
 ogg_codec_t *initial_theora_page (format_plugin_t *plugin, ogg_page *page);
Index: src/cfgfile.c
===================================================================
--- src/cfgfile.c	(revisione 10365)
+++ src/cfgfile.c	(copia locale)
@@ -53,6 +53,7 @@
 #define CONFIG_DEFAULT_CHUID 0
 #define CONFIG_DEFAULT_USER NULL
 #define CONFIG_DEFAULT_GROUP NULL
+#define CONFIG_DEFAULT_VIDEO_PREVIEW 1
 #define CONFIG_MASTER_UPDATE_INTERVAL 120
 #define CONFIG_YP_URL_TIMEOUT 10
 
@@ -375,6 +376,7 @@
     configuration->relay_password = NULL;
     /* default to a typical prebuffer size used by clients */
     configuration->burst_size = CONFIG_DEFAULT_BURST_SIZE;
+    configuration->video_preview = CONFIG_DEFAULT_VIDEO_PREVIEW;
 }
 
 static void _parse_root(xmlDocPtr doc, xmlNodePtr node, 
@@ -422,6 +424,10 @@
             configuration->hostname = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
         } else if (strcmp(node->name, "listen-socket") == 0) {
             _parse_listen_socket(doc, node->xmlChildrenNode, configuration);
+        } else if (strcmp(node->name, "video-preview") == 0) {
+		tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
+		configuration->video_preview = atoi(tmp);
+            if (tmp) xmlFree(tmp);
         } else if (strcmp(node->name, "port") == 0) {
             tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
             configuration->port = atoi(tmp);
Index: src/cfgfile.h
===================================================================
--- src/cfgfile.h	(revisione 10365)
+++ src/cfgfile.h	(copia locale)
@@ -118,6 +118,7 @@
     int ice_login;
     int fileserve;
     int on_demand; /* global setting for all relays */
+    unsigned int video_preview;
 
     char *shoutcast_mount;
     char *source_password;
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revisione 10365)
+++ src/Makefile.am	(copia locale)
@@ -7,11 +7,12 @@
 bin_PROGRAMS = icecast
 
 noinst_HEADERS = admin.h cfgfile.h os.h logging.h sighandler.h connection.h \
-    global.h util.h slave.h source.h stats.h refbuf.h client.h \
+    global.h util.h slave.h source.h stats.h refbuf.h client.h format.h \
     compat.h fserve.h xslt.h yp.h event.h md5.h \
     auth.h auth_htpasswd.h auth_url.h \
     format.h format_ogg.h format_mp3.h \
-    format_vorbis.h format_theora.h format_flac.h format_speex.h format_midi.h
+    format_vorbis.h format_theora.h format_flac.h format_speex.h format_midi.h \
+    video_preview.h
 icecast_SOURCES = cfgfile.c main.c logging.c sighandler.c connection.c global.c \
     util.c slave.c source.c stats.c refbuf.c client.c \
     xslt.c fserve.c event.c admin.c md5.c \
@@ -19,7 +20,7 @@
     auth.c auth_htpasswd.c
 EXTRA_icecast_SOURCES = yp.c \
     auth_url.c \
-    format_vorbis.c format_theora.c format_speex.c
+    format_vorbis.c format_theora.c format_speex.c video_preview.c
     
 icecast_DEPENDENCIES = @ICECAST_OPTIONAL@ net/libicenet.la thread/libicethread.la \
     httpp/libicehttpp.la log/libicelog.la avl/libiceavl.la timing/libicetiming.la
Index: web/status.xsl
===================================================================
--- web/status.xsl	(revisione 10365)
+++ web/status.xsl	(copia locale)
@@ -94,6 +94,16 @@
 <xsl:if test="server_url">
 <tr><td>Stream URL:</td><td class="streamdata"> <a target="_blank" href="{server_url}"><xsl:value-of select="server_url" /></a></td></tr>
 </xsl:if>
+<xsl:if test="video_preview">
+<xsl:choose>
+<xsl:when test="authenticator">
+<tr><td>Preview:</td><td class="videopreview"> <a href="auth.xsl"><img src="{video_preview}" border="1" align="left" alt="frame preview" title="click to start watching the video!" /></a></td></tr>
+</xsl:when>
+<xsl:otherwise>
+<tr><td>Preview:</td><td class="videopreview"> <a href="{@mount}.m3u"><img src="{video_preview}" border="1" align="left" alt="frame preview" title="click to start watching the video!" /></a></td></tr>
+</xsl:otherwise>
+</xsl:choose>
+</xsl:if>
 <tr><td>Current Song:</td><td class="streamdata"> 
 <xsl:if test="artist"><xsl:value-of select="artist" /> - </xsl:if><xsl:value-of select="title" /></td></tr>
 </table>


More information about the Icecast-dev mailing list