aboutsummaryrefslogtreecommitdiffstats
path: root/ffserver_config.h
blob: 48d38dc3250b313cbdbe1bd31640ec167b992f7b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*
 * 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

#define FFM_PACKET_SIZE 4096

#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;

/**
 * This holds the stream parameters for an AVStream, it cannot be a AVStream
 * because AVStreams cannot be instanciated without a AVFormatContext, especially
 * not outside libavformat.
 *
 * The fields of this struct have the same semantics as the fields of an AVStream.
 */
typedef struct LayeredAVStream {
    int index;
    int id;
    AVCodecParameters *codecpar;
    AVCodecContext *codec;
    AVRational time_base;
    int pts_wrap_bits;
    AVRational sample_aspect_ratio;
    char *recommended_encoder_configuration;
} LayeredAVStream;

/* 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;
    LayeredAVStream *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;
    int bitexact;
    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 */