|
|
|
/*
|
|
|
|
* 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) */
|
|
|
|
|
|
|
|
/* 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 errors;
|
|
|
|
int warnings;
|
|
|
|
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 line_num;
|
|
|
|
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 */
|