X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffserver.c;h=59a0b99b32fc2f6a9a50e70c47b61129c344241f;hb=f0754ad822317c63cf32ddf2d12740574d6b30ca;hp=f91e1934ed95e456cef2f289bc017df324e18445;hpb=8f56ccca92a6e3c758563aaedf9bba0344c6f1fb;p=ffmpeg diff --git a/ffserver.c b/ffserver.c index f91e1934ed9..59a0b99b32f 100644 --- a/ffserver.c +++ b/ffserver.c @@ -407,6 +407,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 +435,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 +564,6 @@ static int http_server(void) start_children(first_feed); - first_http_ctx = NULL; - nb_connections = 0; - start_multicast(); for(;;) { @@ -1341,6 +1344,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; } @@ -1692,8 +1696,7 @@ static void compute_status(HTTPContext *c) stream->conns_served); fmt_bytecount(pb, stream->bytes_served); switch(stream->stream_type) { - case STREAM_TYPE_LIVE: - { + case STREAM_TYPE_LIVE: { int audio_bit_rate = 0; int video_bit_rate = 0; const char *audio_codec_name = ""; @@ -1931,13 +1934,11 @@ static int open_input_stream(HTTPContext *c, const char *info) strcpy(input_filename, c->stream->feed->feed_filename); buf_size = FFM_PACKET_SIZE; /* compute position (absolute time) */ - if (find_info_tag(buf, sizeof(buf), "date", info)) - { + if (find_info_tag(buf, sizeof(buf), "date", info)) { stream_pos = parse_date(buf, 0); if (stream_pos == INT64_MIN) return -1; - } - else if (find_info_tag(buf, sizeof(buf), "buffer", info)) { + } else if (find_info_tag(buf, sizeof(buf), "buffer", info)) { int prebuffer = strtol(buf, 0, 10); stream_pos = av_gettime() - prebuffer * (int64_t)1000000; } else @@ -1946,13 +1947,11 @@ static int open_input_stream(HTTPContext *c, const char *info) strcpy(input_filename, c->stream->feed_filename); buf_size = 0; /* compute position (relative time) */ - if (find_info_tag(buf, sizeof(buf), "date", info)) - { + if (find_info_tag(buf, sizeof(buf), "date", info)) { stream_pos = parse_date(buf, 1); if (stream_pos == INT64_MIN) return -1; - } - else + } else stream_pos = 0; } if (input_filename[0] == '\0') @@ -2159,9 +2158,9 @@ static int http_prepare_data(HTTPContext *c) } } else { AVCodecContext *codec; - AVStream *ist = c->fmt_in->streams[source_index]; - AVStream *ost = ctx->streams[pkt.stream_index]; + AVStream *ist, *ost; send_it: + ist = c->fmt_in->streams[source_index]; /* specific handling for RTP: we use several output stream (one for each RTP connection). XXX: need more abstract handling */ @@ -2192,7 +2191,7 @@ static int http_prepare_data(HTTPContext *c) } else { ctx = &c->fmt_ctx; /* Fudge here */ - codec = ost->codec; + codec = ctx->streams[pkt.stream_index]->codec; } if (c->is_packetized) { @@ -2209,7 +2208,9 @@ static int http_prepare_data(HTTPContext *c) /* XXX: potential leak */ return -1; } - c->fmt_ctx.pb->is_streamed = 1; + ost = ctx->streams[pkt.stream_index]; + + ctx->pb->is_streamed = 1; if (pkt.dts != AV_NOPTS_VALUE) pkt.dts = av_rescale_q(pkt.dts, ist->time_base, ost->time_base); if (pkt.pts != AV_NOPTS_VALUE) @@ -2500,9 +2501,18 @@ static int http_receive_data(HTTPContext *c) goto fail; } - for (i = 0; i < s->nb_streams; i++) - memcpy(feed->streams[i]->codec, - s->streams[i]->codec, sizeof(AVCodecContext)); + for (i = 0; i < s->nb_streams; i++) { + AVStream *fst = feed->streams[i]; + AVStream *st = s->streams[i]; + memcpy(fst->codec, st->codec, sizeof(AVCodecContext)); + if (fst->codec->extradata_size) { + fst->codec->extradata = av_malloc(fst->codec->extradata_size); + if (!fst->codec->extradata) + goto fail; + memcpy(fst->codec->extradata, st->codec->extradata, + fst->codec->extradata_size); + } + } av_close_input_stream(s); av_free(pb); @@ -3876,15 +3886,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) { @@ -3980,25 +3981,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); @@ -4499,7 +4500,6 @@ int main(int argc, char **argv) } else { /* child */ setsid(); - chdir("/"); close(0); open("/dev/null", O_RDWR); if (strcmp(logfilename, "-") != 0) { @@ -4523,6 +4523,9 @@ int main(int argc, char **argv) av_log_set_callback(http_av_log); } + if (ffserver_daemon) + chdir("/"); + if (http_server() < 0) { http_log("Could not start server\n"); exit(1);