fix and simplify frame size check and reencoding in verbatim mode
[ffmpeg.git] / ffserver.c
index d17f997..08b89a8 100644 (file)
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#define _XOPEN_SOURCE 600
+
 #include "config.h"
 #ifndef HAVE_CLOSESOCKET
 #define closesocket close
 #endif
 #include <string.h>
+#include <strings.h>
 #include <stdlib.h>
 #include "libavutil/random.h"
 #include "libavutil/avstring.h"
@@ -348,7 +351,7 @@ static void http_av_log(void *ptr, int level, const char *fmt, va_list vargs)
     if (level > av_log_level)
         return;
     if (print_prefix && avc)
-        http_log("[%s @ %p]", avc->item_name(ptr), avc);
+        http_log("[%s @ %p]", avc->item_name(ptr), ptr);
     print_prefix = strstr(fmt, "\n") != NULL;
     http_vlog(fmt, vargs);
 }
@@ -407,6 +410,21 @@ static void start_children(FFStream *feed)
                 char *slash;
                 int i;
 
+                av_strlcpy(pathname, my_program_name, sizeof(pathname));
+
+                slash = strrchr(pathname, '/');
+                if (!slash)
+                    slash = pathname;
+                else
+                    slash++;
+                strcpy(slash, "ffmpeg");
+
+                http_log("Launch commandline: ");
+                http_log("%s ", pathname);
+                for (i = 1; feed->child_argv[i] && feed->child_argv[i][0]; i++)
+                    http_log("%s ", feed->child_argv[i]);
+                http_log("\n");
+
                 for (i = 3; i < 256; i++)
                     close(i);
 
@@ -420,15 +438,6 @@ static void start_children(FFStream *feed)
                     }
                 }
 
-                av_strlcpy(pathname, my_program_name, sizeof(pathname));
-
-                slash = strrchr(pathname, '/');
-                if (!slash)
-                    slash = pathname;
-                else
-                    slash++;
-                strcpy(slash, "ffmpeg");
-
                 /* This is needed to make relative pathnames work */
                 chdir(my_program_dir);
 
@@ -558,9 +567,6 @@ static int http_server(void)
 
     start_children(first_feed);
 
-    first_http_ctx = NULL;
-    nb_connections = 0;
-
     start_multicast();
 
     for(;;) {
@@ -1341,6 +1347,7 @@ static int http_parse_request(HTTPContext *c)
     /* If already streaming this feed, do not let start another feeder. */
     if (stream->feed_opened) {
         snprintf(msg, sizeof(msg), "This feed is already being received.");
+        http_log("feed %s already being received\n", stream->feed_filename);
         goto send_error;
     }
 
@@ -1493,9 +1500,8 @@ static int http_parse_request(HTTPContext *c)
     if (c->post) {
         /* if post, it means a feed is being sent */
         if (!stream->is_feed) {
-            /* However it might be a status report from WMP! Lets log the data
-             * as it might come in handy one day
-             */
+            /* However it might be a status report from WMP! Let us log the
+             * data as it might come in handy one day. */
             char *logline = 0;
             int client_id = 0;
 
@@ -3439,7 +3445,7 @@ static void build_feed_streams(void)
 
                         if (sf->index != ss->index ||
                             sf->id != ss->id) {
-                            printf("Index & Id do not match for stream %d (%s)\n",
+                            http_log("Index & Id do not match for stream %d (%s)\n",
                                    i, feed->feed_filename);
                             matches = 0;
                         } else {
@@ -3450,28 +3456,28 @@ static void build_feed_streams(void)
 #define CHECK_CODEC(x)  (ccf->x != ccs->x)
 
                             if (CHECK_CODEC(codec) || CHECK_CODEC(codec_type)) {
-                                printf("Codecs do not match for stream %d\n", i);
+                                http_log("Codecs do not match for stream %d\n", i);
                                 matches = 0;
                             } else if (CHECK_CODEC(bit_rate) || CHECK_CODEC(flags)) {
-                                printf("Codec bitrates do not match for stream %d\n", i);
+                                http_log("Codec bitrates do not match for stream %d\n", i);
                                 matches = 0;
                             } else if (ccf->codec_type == CODEC_TYPE_VIDEO) {
                                 if (CHECK_CODEC(time_base.den) ||
                                     CHECK_CODEC(time_base.num) ||
                                     CHECK_CODEC(width) ||
                                     CHECK_CODEC(height)) {
-                                    printf("Codec width, height and framerate do not match for stream %d\n", i);
+                                    http_log("Codec width, height and framerate do not match for stream %d\n", i);
                                     matches = 0;
                                 }
                             } else if (ccf->codec_type == CODEC_TYPE_AUDIO) {
                                 if (CHECK_CODEC(sample_rate) ||
                                     CHECK_CODEC(channels) ||
                                     CHECK_CODEC(frame_size)) {
-                                    printf("Codec sample_rate, channels, frame_size do not match for stream %d\n", i);
+                                    http_log("Codec sample_rate, channels, frame_size do not match for stream %d\n", i);
                                     matches = 0;
                                 }
                             } else {
-                                printf("Unknown codec type\n");
+                                http_log("Unknown codec type\n");
                                 matches = 0;
                             }
                         }
@@ -3479,17 +3485,17 @@ static void build_feed_streams(void)
                             break;
                     }
                 } else
-                    printf("Deleting feed file '%s' as stream counts differ (%d != %d)\n",
+                    http_log("Deleting feed file '%s' as stream counts differ (%d != %d)\n",
                         feed->feed_filename, s->nb_streams, feed->nb_streams);
 
                 av_close_input_file(s);
             } else
-                printf("Deleting feed file '%s' as it appears to be corrupt\n",
+                http_log("Deleting feed file '%s' as it appears to be corrupt\n",
                         feed->feed_filename);
 
             if (!matches) {
                 if (feed->readonly) {
-                    printf("Unable to delete feed file '%s' as it is marked readonly\n",
+                    http_log("Unable to delete feed file '%s' as it is marked readonly\n",
                         feed->feed_filename);
                     exit(1);
                 }
@@ -3500,7 +3506,7 @@ static void build_feed_streams(void)
             AVFormatContext s1, *s = &s1;
 
             if (feed->readonly) {
-                printf("Unable to create feed file '%s' as it is marked readonly\n",
+                http_log("Unable to create feed file '%s' as it is marked readonly\n",
                     feed->feed_filename);
                 exit(1);
             }
@@ -3728,7 +3734,7 @@ static int opt_default(const char *opt, const char *arg,
     const AVOption *o  = NULL;
     const AVOption *o2 = av_find_opt(avctx, opt, NULL, type, type);
     if(o2)
-        o = av_set_string(avctx, opt, arg);
+        o = av_set_string2(avctx, opt, arg, 1);
     if(!o)
         return -1;
     return 0;
@@ -3882,15 +3888,6 @@ static int parse_ffconfig(const char *filename)
                         (my_http_addr.sin_addr.s_addr == INADDR_ANY) ? "127.0.0.1" :
                     inet_ntoa(my_http_addr.sin_addr),
                     ntohs(my_http_addr.sin_port), feed->filename);
-
-                if (ffserver_debug)
-                {
-                    int j;
-                    fprintf(stdout, "Launch commandline: ");
-                    for (j = 0; j <= i; j++)
-                        fprintf(stdout, "%s ", feed->child_argv[j]);
-                    fprintf(stdout, "\n");
-                }
             }
         } else if (!strcasecmp(cmd, "ReadOnlyFile")) {
             if (feed) {
@@ -3986,25 +3983,25 @@ static int parse_ffconfig(const char *filename)
         } else if (!strcasecmp(cmd, "Format")) {
             get_arg(arg, sizeof(arg), &p);
             if (stream) {
-            if (!strcmp(arg, "status")) {
-                stream->stream_type = STREAM_TYPE_STATUS;
-                stream->fmt = NULL;
-            } else {
-                stream->stream_type = STREAM_TYPE_LIVE;
-                /* jpeg cannot be used here, so use single frame jpeg */
-                if (!strcmp(arg, "jpeg"))
-                    strcpy(arg, "mjpeg");
-                stream->fmt = guess_stream_format(arg, NULL, NULL);
-                if (!stream->fmt) {
-                    fprintf(stderr, "%s:%d: Unknown Format: %s\n",
-                            filename, line_num, arg);
-                    errors++;
+                if (!strcmp(arg, "status")) {
+                    stream->stream_type = STREAM_TYPE_STATUS;
+                    stream->fmt = NULL;
+                } else {
+                    stream->stream_type = STREAM_TYPE_LIVE;
+                    /* jpeg cannot be used here, so use single frame jpeg */
+                    if (!strcmp(arg, "jpeg"))
+                        strcpy(arg, "mjpeg");
+                    stream->fmt = guess_stream_format(arg, NULL, NULL);
+                    if (!stream->fmt) {
+                        fprintf(stderr, "%s:%d: Unknown Format: %s\n",
+                                filename, line_num, arg);
+                        errors++;
+                    }
+                }
+                if (stream->fmt) {
+                    audio_id = stream->fmt->audio_codec;
+                    video_id = stream->fmt->video_codec;
                 }
-            }
-            if (stream->fmt) {
-                audio_id = stream->fmt->audio_codec;
-                video_id = stream->fmt->video_codec;
-            }
             }
         } else if (!strcasecmp(cmd, "InputFormat")) {
             get_arg(arg, sizeof(arg), &p);
@@ -4485,6 +4482,15 @@ int main(int argc, char **argv)
         exit(1);
     }
 
+    /* open log file if needed */
+    if (logfilename[0] != '\0') {
+        if (!strcmp(logfilename, "-"))
+            logfile = stdout;
+        else
+            logfile = fopen(logfilename, "a");
+        av_log_set_callback(http_av_log);
+    }
+
     build_file_streams();
 
     build_feed_streams();
@@ -4519,15 +4525,6 @@ int main(int argc, char **argv)
     /* signal init */
     signal(SIGPIPE, SIG_IGN);
 
-    /* open log file if needed */
-    if (logfilename[0] != '\0') {
-        if (!strcmp(logfilename, "-"))
-            logfile = stderr;
-        else
-            logfile = fopen(logfilename, "a");
-        av_log_set_callback(http_av_log);
-    }
-
     if (ffserver_daemon)
         chdir("/");