Skip to content
Snippets Groups Projects
ffserver_config.h 5.09 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
     *
     * This file is part of FFmpeg.
     *
     * FFmpeg is free software; you can redistribute it and/or
     * modify it under the terms of the GNU Lesser General Public
     * License as published by the Free Software Foundation; either
     * version 2.1 of the License, or (at your option) any later version.
     *
     * FFmpeg is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     * Lesser General Public License for more details.
     *
     * You should have received a copy of the GNU Lesser General Public
     * License along with FFmpeg; if not, write to the Free Software
     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     */
    
    #ifndef FFSERVER_CONFIG_H
    #define FFSERVER_CONFIG_H
    
    #include "libavutil/dict.h"
    #include "libavformat/avformat.h"
    #include "libavformat/network.h"
    
    #define FFSERVER_MAX_STREAMS 20
    
    /* each generated stream is described here */
    enum FFServerStreamType {
        STREAM_TYPE_LIVE,
        STREAM_TYPE_STATUS,
        STREAM_TYPE_REDIRECT,
    };
    
    enum FFServerIPAddressAction {
        IP_ALLOW = 1,
        IP_DENY,
    };
    
    typedef struct FFServerIPAddressACL {
        struct FFServerIPAddressACL *next;
        enum FFServerIPAddressAction action;
        /* These are in host order */
        struct in_addr first;
        struct in_addr last;
    } FFServerIPAddressACL;
    
    /* description of each stream of the ffserver.conf file */
    typedef struct FFServerStream {
        enum FFServerStreamType stream_type;
        char filename[1024];          /* stream filename */
        struct FFServerStream *feed;  /* feed we are using (can be null if coming from file) */
        AVDictionary *in_opts;        /* input parameters */
        AVDictionary *metadata;       /* metadata to set on the stream */
        AVInputFormat *ifmt;          /* if non NULL, force input format */
        AVOutputFormat *fmt;
        FFServerIPAddressACL *acl;
        char dynamic_acl[1024];
        int nb_streams;
        int prebuffer;                /* Number of milliseconds early to start */
        int64_t max_time;             /* Number of milliseconds to run */
        int send_on_key;
        AVStream *streams[FFSERVER_MAX_STREAMS];
        int feed_streams[FFSERVER_MAX_STREAMS]; /* index of streams in the feed */
        char feed_filename[1024];     /* file name of the feed storage, or
                                         input file name for a stream */
        pid_t pid;                    /* Of ffmpeg process */
        time_t pid_start;             /* Of ffmpeg process */
        char **child_argv;
        struct FFServerStream *next;
        unsigned bandwidth;           /* bandwidth, in kbits/s */
        /* RTSP options */
        char *rtsp_option;
        /* multicast specific */
        int is_multicast;
        struct in_addr multicast_ip;
        int multicast_port;           /* first port used for multicast */
        int multicast_ttl;
        int loop;                     /* if true, send the stream in loops (only meaningful if file) */
    
        char single_frame;            /* only single frame */
    
    
        /* feed specific */
        int feed_opened;              /* true if someone is writing to the feed */
        int is_feed;                  /* true if it is a feed */
        int readonly;                 /* True if writing is prohibited to the file */
        int truncate;                 /* True if feeder connection truncate the feed file */
        int conns_served;
        int64_t bytes_served;
        int64_t feed_max_size;        /* maximum storage size, zero means unlimited */
        int64_t feed_write_index;     /* current write position in feed (it wraps around) */
        int64_t feed_size;            /* current size of feed */
        struct FFServerStream *next_feed;
    } FFServerStream;
    
    typedef struct FFServerConfig {
        char *filename;
        FFServerStream *first_feed;   /* contains only feeds */
        FFServerStream *first_stream; /* contains all streams, including feeds */
        unsigned int nb_max_http_connections;
        unsigned int nb_max_connections;
        uint64_t max_bandwidth;
        int debug;
        char logfilename[1024];
        struct sockaddr_in http_addr;
        struct sockaddr_in rtsp_addr;
    
        int use_defaults;
    
        // Following variables MUST NOT be used outside configuration parsing code.
    
        enum AVCodecID guessed_audio_codec_id;
        enum AVCodecID guessed_video_codec_id;
    
        AVDictionary *video_opts;     /* AVOptions for video encoder */
        AVDictionary *audio_opts;     /* AVOptions for audio encoder */
    
        AVCodecContext *dummy_actx;   /* Used internally to test audio AVOptions. */
        AVCodecContext *dummy_vctx;   /* Used internally to test video AVOptions. */
        int no_audio;
        int no_video;
    
        int stream_use_defaults;
    
    } FFServerConfig;
    
    void ffserver_get_arg(char *buf, int buf_size, const char **pp);
    
    void ffserver_parse_acl_row(FFServerStream *stream, FFServerStream* feed,
                                FFServerIPAddressACL *ext_acl,
                                const char *p, const char *filename, int line_num);
    
    int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config);
    
    
    void ffserver_free_child_args(void *argsp);
    
    
    #endif /* FFSERVER_CONFIG_H */