CHECK_CODEC(frame_rate_base) ||
static 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)) {            /* 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;            /* 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_set_parameters(s, NULL);            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);    }}