if (url_exist(feed->feed_filename)) {  AVFormatContext *s; int matches = 0;  if (av_open_input_file(&s, feed->feed_filename, NULL, FFM_PACKET_SIZE, NULL) >= 0) {  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); }
void build_feed_streams(void){    FFStream *stream, *feed;    int i;    /* gather all streams */    for(stream = first_stream; stream != NULL; stream = stream->next) {        feed = stream->feed;        if (feed) {            if (!stream->is_feed) {                /* we handle a stream coming from a feed */                for(i=0;i<stream->nb_streams;i++) {                    stream->feed_streams[i] = add_av_stream(feed, stream->streams[i]);                }            }        }    }    /* gather all streams */    for(stream = first_stream; stream != NULL; stream = stream->next) {        feed = stream->feed;        if (feed) {            if (stream->is_feed) {                for(i=0;i<stream->nb_streams;i++) {                    stream->feed_streams[i] = i;                }            }        }    }    /* create feed files if needed */    for(feed = first_feed; feed != NULL; feed = feed->next_feed) {        int fd;        if (!url_exist(feed->feed_filename)) {            AVFormatContext s1, *s = &s1;            /* only write the header of the ffm file */            if (url_fopen(&s->pb, feed->feed_filename, URL_WRONLY) < 0) {                fprintf(stderr, "Could not open output feed file '%s'\n",                        feed->feed_filename);                exit(1);            }            s->oformat = feed->fmt;            s->nb_streams = feed->nb_streams;            for(i=0;i<s->nb_streams;i++) {                AVStream *st;                st = feed->streams[i];                s->streams[i] = st;            }            av_write_header(s);            /* XXX: need better api */            av_freep(&s->priv_data);            url_fclose(&s->pb);        }        /* get feed size and write index */        fd = open(feed->feed_filename, O_RDONLY);        if (fd < 0) {            fprintf(stderr, "Could not open output feed file '%s'\n",                    feed->feed_filename);            exit(1);        }        feed->feed_write_index = ffm_read_write_index(fd);        feed->feed_size = lseek(fd, 0, SEEK_END);        /* ensure that we do not wrap before the end of file */        if (feed->feed_max_size < feed->feed_size)            feed->feed_max_size = feed->feed_size;        close(fd);    }}