ffserver_config: improve AVOption handing
[ffmpeg.git] / ffserver_config.h
1 /*
2  * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20
21 #ifndef FFSERVER_CONFIG_H
22 #define FFSERVER_CONFIG_H
23
24 #include "libavutil/dict.h"
25 #include "libavformat/avformat.h"
26 #include "libavformat/network.h"
27
28 #define FFSERVER_MAX_STREAMS 20
29
30 /* each generated stream is described here */
31 enum FFServerStreamType {
32     STREAM_TYPE_LIVE,
33     STREAM_TYPE_STATUS,
34     STREAM_TYPE_REDIRECT,
35 };
36
37 enum FFServerIPAddressAction {
38     IP_ALLOW = 1,
39     IP_DENY,
40 };
41
42 typedef struct FFServerIPAddressACL {
43     struct FFServerIPAddressACL *next;
44     enum FFServerIPAddressAction action;
45     /* These are in host order */
46     struct in_addr first;
47     struct in_addr last;
48 } FFServerIPAddressACL;
49
50 /* description of each stream of the ffserver.conf file */
51 typedef struct FFServerStream {
52     enum FFServerStreamType stream_type;
53     char filename[1024];          /* stream filename */
54     struct FFServerStream *feed;  /* feed we are using (can be null if coming from file) */
55     AVDictionary *in_opts;        /* input parameters */
56     AVDictionary *metadata;       /* metadata to set on the stream */
57     AVInputFormat *ifmt;          /* if non NULL, force input format */
58     AVOutputFormat *fmt;
59     FFServerIPAddressACL *acl;
60     char dynamic_acl[1024];
61     int nb_streams;
62     int prebuffer;                /* Number of milliseconds early to start */
63     int64_t max_time;             /* Number of milliseconds to run */
64     int send_on_key;
65     AVStream *streams[FFSERVER_MAX_STREAMS];
66     int feed_streams[FFSERVER_MAX_STREAMS]; /* index of streams in the feed */
67     char feed_filename[1024];     /* file name of the feed storage, or
68                                      input file name for a stream */
69     pid_t pid;                    /* Of ffmpeg process */
70     time_t pid_start;             /* Of ffmpeg process */
71     char **child_argv;
72     struct FFServerStream *next;
73     unsigned bandwidth;           /* bandwidth, in kbits/s */
74     /* RTSP options */
75     char *rtsp_option;
76     /* multicast specific */
77     int is_multicast;
78     struct in_addr multicast_ip;
79     int multicast_port;           /* first port used for multicast */
80     int multicast_ttl;
81     int loop;                     /* if true, send the stream in loops (only meaningful if file) */
82
83     /* feed specific */
84     int feed_opened;              /* true if someone is writing to the feed */
85     int is_feed;                  /* true if it is a feed */
86     int readonly;                 /* True if writing is prohibited to the file */
87     int truncate;                 /* True if feeder connection truncate the feed file */
88     int conns_served;
89     int64_t bytes_served;
90     int64_t feed_max_size;        /* maximum storage size, zero means unlimited */
91     int64_t feed_write_index;     /* current write position in feed (it wraps around) */
92     int64_t feed_size;            /* current size of feed */
93     struct FFServerStream *next_feed;
94 } FFServerStream;
95
96 typedef struct FFServerConfig {
97     char *filename;
98     FFServerStream *first_feed;   /* contains only feeds */
99     FFServerStream *first_stream; /* contains all streams, including feeds */
100     unsigned int nb_max_http_connections;
101     unsigned int nb_max_connections;
102     uint64_t max_bandwidth;
103     int debug;
104     char logfilename[1024];
105     struct sockaddr_in http_addr;
106     struct sockaddr_in rtsp_addr;
107     int errors;
108     int warnings;
109     // Following variables MUST NOT be used outside configuration parsing code.
110     enum AVCodecID audio_id;
111     enum AVCodecID video_id;
112     AVDictionary *video_opts;     /* AVOptions for video encoder */
113     AVDictionary *video_conf;     /* Values stored in video AVCodecContext.fields */
114     AVDictionary *audio_opts;     /* AVOptions for audio encoder */
115     AVDictionary *audio_conf;     /* Values stored in audio AVCodecContext.fields */
116     char *video_preset;
117     char *audio_preset;
118     AVCodecContext *dummy_ctx;    /* Used internally to test AVOptions. Not to be used anywhere else */
119 } FFServerConfig;
120
121 void ffserver_get_arg(char *buf, int buf_size, const char **pp);
122
123 void ffserver_parse_acl_row(FFServerStream *stream, FFServerStream* feed,
124                             FFServerIPAddressACL *ext_acl,
125                             const char *p, const char *filename, int line_num);
126
127 int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config);
128
129 #endif /* FFSERVER_CONFIG_H */