diff options
author | Philip Gladstone <philipjsg@users.sourceforge.net> | 2002-07-28 04:19:46 +0000 |
---|---|---|
committer | Philip Gladstone <philipjsg@users.sourceforge.net> | 2002-07-28 04:19:46 +0000 |
commit | 59eb2ed1f31d2b23ba2e50242627c096b0990e62 (patch) | |
tree | f826e5ca3fab3ecd2fdee571e9df61adc090e8f6 | |
parent | f853bb1128d74946a928fa70fff1a42a377a329c (diff) | |
download | ffmpeg-59eb2ed1f31d2b23ba2e50242627c096b0990e62.tar.gz |
* Now we do not delete the feed file if it was created with the same
parameters as the currently desired codec settings. Thus it is
important not to fiddle with the streams if you want to keep the
old data.
* Fix it so that the ?buffer= paramter can be larger than 40 minutes or
so. Why is this good? So I can use ?buffer=43200 and get video from
12 hours ago (i.e. when it is daylight outside)
Originally committed as revision 829 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | ffserver.c | 73 |
1 files changed, 71 insertions, 2 deletions
diff --git a/ffserver.c b/ffserver.c index 4723ee0a15..8612765da6 100644 --- a/ffserver.c +++ b/ffserver.c @@ -1728,9 +1728,9 @@ static int open_input_stream(HTTPContext *c, const char *info) stream_pos = parse_date(buf, 0); } else if (find_info_tag(buf, sizeof(buf), "buffer", info)) { int prebuffer = strtol(buf, 0, 10); - stream_pos = av_gettime() - prebuffer * 1000000; + stream_pos = av_gettime() - prebuffer * (INT64)1000000; } else { - stream_pos = av_gettime() - c->stream->prebuffer * 1000; + stream_pos = av_gettime() - c->stream->prebuffer * (INT64)1000; } } else { strcpy(input_filename, c->stream->feed_filename); @@ -3104,6 +3104,73 @@ void build_feed_streams(void) for(feed = first_feed; feed != NULL; feed = feed->next_feed) { int fd; + if (url_exist(feed->feed_filename)) { + /* See if it matches */ + AVFormatContext *s; + int matches = 0; + + if (av_open_input_file(&s, feed->feed_filename, NULL, FFM_PACKET_SIZE, NULL) >= 0) { + /* Now see if it matches */ + if (s->nb_streams == feed->nb_streams) { + matches = 1; + for(i=0;i<s->nb_streams;i++) { + AVStream *sf, *ss; + sf = feed->streams[i]; + ss = s->streams[i]; + + if (sf->index != ss->index || + sf->id != ss->id) { + printf("Index & Id do not match for stream %d\n", i); + matches = 0; + } else { + AVCodecContext *ccf, *ccs; + + ccf = &sf->codec; + ccs = &ss->codec; +#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); + matches = 0; + } else if (CHECK_CODEC(bit_rate) || CHECK_CODEC(flags)) { + printf("Codec bitrates do not match for stream %d\n", i); + matches = 0; + } else if (ccf->codec_type == CODEC_TYPE_VIDEO) { + if (CHECK_CODEC(frame_rate) || + CHECK_CODEC(width) || + CHECK_CODEC(height)) { + printf("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); + matches = 0; + } + } else { + printf("Unknown codec type\n"); + matches = 0; + } + } + if (!matches) { + break; + } + } + } else { + printf("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", + feed->feed_filename); + } + if (!matches) + unlink(feed->feed_filename); + } if (!url_exist(feed->feed_filename)) { AVFormatContext s1, *s = &s1; @@ -3452,6 +3519,7 @@ int parse_ffconfig(const char *filename) fprintf(stderr, "%s:%d: No corresponding <Feed> for </Feed>\n", filename, line_num); errors++; +#if 0 } else { /* Make sure that we start out clean */ if (unlink(feed->feed_filename) < 0 @@ -3460,6 +3528,7 @@ int parse_ffconfig(const char *filename) filename, line_num, feed->feed_filename, strerror(errno)); errors++; } +#endif } feed = NULL; } else if (!strcasecmp(cmd, "<Stream")) { |