ffserver.c File Reference

#include "config.h"
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include "libavformat/avformat.h"
#include "libavformat/network.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include "libavformat/os_support.h"
#include "libavcodec/avcodec.h"
#include "rtp.h"
#include "libavformat/rtsp.h"
#include "libavutil/avstring.h"
#include "avutil.h"
#include "common.h"
#include <stdint.h>
#include "bswap.h"
#include "libavcodec/opt.h"
#include <stdarg.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <sys/time.h>
#include <time.h>
#include <sys/wait.h>
#include <signal.h>
#include "cmdutils.h"

Go to the source code of this file.

Data Structures

struct  RTSPActionServerSetup
struct  DataRateData
struct  HTTPContext
struct  IPAddressACL
struct  FFStream
struct  FeedData

Defines

#define _XOPEN_SOURCE   600
#define closesocket   close
#define IOBUFFER_INIT_SIZE   8192
#define HTTP_REQUEST_TIMEOUT   (15 * 1000)
#define RTSP_REQUEST_TIMEOUT   (3600 * 24 * 1000)
#define SYNC_TIMEOUT   (10 * 1000)
#define CHECK_CODEC(x)   (ccf->x != ccs->x)

Typedefs

typedef struct
RTSPActionServerSetup 
RTSPActionServerSetup
typedef struct HTTPContext HTTPContext
typedef struct IPAddressACL IPAddressACL
typedef struct FFStream FFStream
typedef struct FeedData FeedData

Enumerations

enum  HTTPState {
  HTTPSTATE_WAIT_REQUEST, HTTPSTATE_SEND_HEADER, HTTPSTATE_SEND_DATA_HEADER, HTTPSTATE_SEND_DATA,
  HTTPSTATE_SEND_DATA_TRAILER, HTTPSTATE_RECEIVE_DATA, HTTPSTATE_WAIT_FEED, HTTPSTATE_READY,
  RTSPSTATE_WAIT_REQUEST, RTSPSTATE_SEND_REPLY, RTSPSTATE_SEND_PACKET
}
enum  StreamType { STREAM_TYPE_LIVE, STREAM_TYPE_STATUS, STREAM_TYPE_REDIRECT }
enum  IPAddressAction { IP_ALLOW = 1, IP_DENY }
enum  RedirType {
  REDIR_NONE, REDIR_ASX, REDIR_RAM, REDIR_ASF,
  REDIR_RTSP, REDIR_SDP
}

Functions

static void new_connection (int server_fd, int is_rtsp)
static void close_connection (HTTPContext *c)
static int handle_connection (HTTPContext *c)
static int http_parse_request (HTTPContext *c)
static int http_send_data (HTTPContext *c)
static void compute_status (HTTPContext *c)
static int open_input_stream (HTTPContext *c, const char *info)
static int http_start_receive_data (HTTPContext *c)
static int http_receive_data (HTTPContext *c)
static int rtsp_parse_request (HTTPContext *c)
static void rtsp_cmd_describe (HTTPContext *c, const char *url)
static void rtsp_cmd_options (HTTPContext *c, const char *url)
static void rtsp_cmd_setup (HTTPContext *c, const char *url, RTSPMessageHeader *h)
static void rtsp_cmd_play (HTTPContext *c, const char *url, RTSPMessageHeader *h)
static void rtsp_cmd_pause (HTTPContext *c, const char *url, RTSPMessageHeader *h)
static void rtsp_cmd_teardown (HTTPContext *c, const char *url, RTSPMessageHeader *h)
static int prepare_sdp_description (FFStream *stream, uint8_t **pbuffer, struct in_addr my_ip)
static HTTPContextrtp_new_connection (struct sockaddr_in *from_addr, FFStream *stream, const char *session_id, enum RTSPLowerTransport rtp_protocol)
static int rtp_new_av_stream (HTTPContext *c, int stream_index, struct sockaddr_in *dest_addr, HTTPContext *rtsp_c)
static char * ctime1 (char *buf2)
static void http_vlog (const char *fmt, va_list vargs)
void http_log (const char *fmt,...)
static void http_av_log (void *ptr, int level, const char *fmt, va_list vargs)
static void log_connection (HTTPContext *c)
static void update_datarate (DataRateData *drd, int64_t count)
static int compute_datarate (DataRateData *drd, int64_t count)
static void start_children (FFStream *feed)
static int socket_open_listen (struct sockaddr_in *my_addr)
static void start_multicast (void)
static int http_server (void)
static void start_wait_request (HTTPContext *c, int is_rtsp)
static int extract_rates (char *rates, int ratelen, const char *request)
static int find_stream_in_feed (FFStream *feed, AVCodecContext *codec, int bit_rate)
static int modify_current_stream (HTTPContext *c, char *rates)
static void do_switch_stream (HTTPContext *c, int i)
static void skip_spaces (const char **pp)
static void get_word (char *buf, int buf_size, const char **pp)
static int validate_acl (FFStream *stream, HTTPContext *c)
static void compute_real_filename (char *filename, int max_size)
static void fmt_bytecount (ByteIOContext *pb, int64_t count)
static void open_parser (AVFormatContext *s, int i)
static int64_t get_server_clock (HTTPContext *c)
static int64_t get_packet_send_clock (HTTPContext *c)
static int http_prepare_data (HTTPContext *c)
static void rtsp_reply_header (HTTPContext *c, enum RTSPStatusCode error_number)
static void rtsp_reply_error (HTTPContext *c, enum RTSPStatusCode error_number)
static HTTPContextfind_rtp_session (const char *session_id)
static RTSPTransportFieldfind_transport (RTSPMessageHeader *h, enum RTSPLowerTransport lower_transport)
static HTTPContextfind_rtp_session_with_url (const char *url, const char *session_id)
static AVStreamadd_av_stream1 (FFStream *stream, AVCodecContext *codec)
static int add_av_stream (FFStream *feed, AVStream *st)
static void remove_stream (FFStream *stream)
static void extract_mpeg4_header (AVFormatContext *infile)
static void build_file_streams (void)
static void build_feed_streams (void)
static void compute_bandwidth (void)
static void get_arg (char *buf, int buf_size, const char **pp)
static void add_codec (FFStream *stream, AVCodecContext *av)
static enum CodecID opt_audio_codec (const char *arg)
static enum CodecID opt_video_codec (const char *arg)
static int ffserver_opt_default (const char *opt, const char *arg, AVCodecContext *avctx, int type)
static int parse_ffconfig (const char *filename)
static void handle_child_exit (int sig)
static void opt_debug (void)
static void opt_show_help (void)
int main (int argc, char **argv)

Variables

const char program_name [] = "FFserver"
 program name, defined by the program for show_version().
const int program_birth_year = 2000
 program birth year, defined by the program for show_banner()
static const OptionDef options []
static const char * http_state []
static struct sockaddr_in my_http_addr
static struct sockaddr_in my_rtsp_addr
static char logfilename [1024]
static HTTPContextfirst_http_ctx
static FFStreamfirst_feed
static FFStreamfirst_stream
static const char * my_program_name
static const char * my_program_dir
static const char * config_filename
static int ffserver_debug
static int ffserver_daemon
static int no_launch
static int need_to_start_children
static unsigned int nb_max_http_connections = 2000
static unsigned int nb_max_connections = 5
static unsigned int nb_connections
static uint64_t max_bandwidth = 1000
static uint64_t current_bandwidth
static int64_t cur_time
static AVRandomState random_state
static FILE * logfile = NULL

Define Documentation

#define _XOPEN_SOURCE   600

Definition at line 22 of file ffserver.c.

#define CHECK_CODEC (  )     (ccf->x != ccs->x)

Referenced by build_feed_streams().

#define closesocket   close
#define HTTP_REQUEST_TIMEOUT   (15 * 1000)

Definition at line 101 of file ffserver.c.

Referenced by start_wait_request().

#define IOBUFFER_INIT_SIZE   8192

Definition at line 98 of file ffserver.c.

Referenced by new_connection(), and rtp_new_connection().

#define RTSP_REQUEST_TIMEOUT   (3600 * 24 * 1000)

Definition at line 102 of file ffserver.c.

Referenced by start_wait_request().

#define SYNC_TIMEOUT   (10 * 1000)

Definition at line 104 of file ffserver.c.


Typedef Documentation

typedef struct FeedData FeedData
typedef struct FFStream FFStream
typedef struct HTTPContext HTTPContext
typedef struct IPAddressACL IPAddressACL

Enumeration Type Documentation

enum HTTPState
Enumerator:
HTTPSTATE_WAIT_REQUEST 
HTTPSTATE_SEND_HEADER 
HTTPSTATE_SEND_DATA_HEADER 
HTTPSTATE_SEND_DATA 
HTTPSTATE_SEND_DATA_TRAILER 
HTTPSTATE_RECEIVE_DATA 
HTTPSTATE_WAIT_FEED 
HTTPSTATE_READY 
RTSPSTATE_WAIT_REQUEST 
RTSPSTATE_SEND_REPLY 
RTSPSTATE_SEND_PACKET 

Definition at line 67 of file ffserver.c.

Enumerator:
IP_ALLOW 
IP_DENY 

Definition at line 186 of file ffserver.c.

enum RedirType
Enumerator:
REDIR_NONE 
REDIR_ASX 
REDIR_RAM 
REDIR_ASF 
REDIR_RTSP 
REDIR_SDP 

Definition at line 1220 of file ffserver.c.

enum StreamType
Enumerator:
STREAM_TYPE_LIVE 
STREAM_TYPE_STATUS 
STREAM_TYPE_REDIRECT 

Definition at line 180 of file ffserver.c.


Function Documentation

static int add_av_stream ( FFStream feed,
AVStream st 
) [static]

Definition at line 3257 of file ffserver.c.

Referenced by build_feed_streams().

static AVStream* add_av_stream1 ( FFStream stream,
AVCodecContext codec 
) [static]

Definition at line 3240 of file ffserver.c.

Referenced by add_av_stream(), and build_file_streams().

static void add_codec ( FFStream stream,
AVCodecContext av 
) [static]

Definition at line 3621 of file ffserver.c.

Referenced by parse_ffconfig().

static void build_feed_streams ( void   )  [static]

Definition at line 3410 of file ffserver.c.

Referenced by main().

static void build_file_streams ( void   )  [static]

Definition at line 3361 of file ffserver.c.

Referenced by main().

static void close_connection ( HTTPContext c  )  [static]

Definition at line 751 of file ffserver.c.

Referenced by http_server(), and rtsp_cmd_teardown().

static void compute_bandwidth ( void   )  [static]

Definition at line 3565 of file ffserver.c.

Referenced by main().

static int compute_datarate ( DataRateData drd,
int64_t  count 
) [static]

Definition at line 389 of file ffserver.c.

Referenced by compute_status().

static void compute_real_filename ( char *  filename,
int  max_size 
) [static]

Definition at line 1196 of file ffserver.c.

Referenced by http_parse_request().

static void compute_status ( HTTPContext c  )  [static]

Definition at line 1649 of file ffserver.c.

Referenced by http_parse_request().

static char* ctime1 ( char *  buf2  )  [static]

Definition at line 316 of file ffserver.c.

Referenced by http_vlog().

static void do_switch_stream ( HTTPContext c,
int  i 
) [static]

Definition at line 1136 of file ffserver.c.

Referenced by http_parse_request(), and http_prepare_data().

static void extract_mpeg4_header ( AVFormatContext infile  )  [static]

Definition at line 3312 of file ffserver.c.

Referenced by build_file_streams().

static int extract_rates ( char *  rates,
int  ratelen,
const char *  request 
) [static]

Definition at line 1013 of file ffserver.c.

Referenced by http_parse_request().

static int ffserver_opt_default ( const char *  opt,
const char *  arg,
AVCodecContext avctx,
int  type 
) [static]

Definition at line 3741 of file ffserver.c.

Referenced by parse_ffconfig().

static HTTPContext* find_rtp_session ( const char *  session_id  )  [static]

Definition at line 2793 of file ffserver.c.

Referenced by find_rtp_session_with_url(), and rtsp_cmd_setup().

static HTTPContext* find_rtp_session_with_url ( const char *  url,
const char *  session_id 
) [static]

Definition at line 2962 of file ffserver.c.

Referenced by rtsp_cmd_pause(), rtsp_cmd_play(), and rtsp_cmd_teardown().

static int find_stream_in_feed ( FFStream feed,
AVCodecContext codec,
int  bit_rate 
) [static]

Definition at line 1060 of file ffserver.c.

Referenced by modify_current_stream().

static RTSPTransportField* find_transport ( RTSPMessageHeader h,
enum RTSPLowerTransport  lower_transport 
) [static]

Definition at line 2807 of file ffserver.c.

Referenced by rtsp_cmd_setup().

static void fmt_bytecount ( ByteIOContext pb,
int64_t  count 
) [static]

Definition at line 1639 of file ffserver.c.

Referenced by compute_status().

static void get_arg ( char *  buf,
int  buf_size,
const char **  pp 
) [static]

Definition at line 3588 of file ffserver.c.

Referenced by parse_ffconfig().

static int64_t get_packet_send_clock ( HTTPContext c  )  [static]

Definition at line 2022 of file ffserver.c.

Referenced by http_send_data().

static int64_t get_server_clock ( HTTPContext c  )  [static]

Definition at line 2014 of file ffserver.c.

Referenced by http_send_data().

static void get_word ( char *  buf,
int  buf_size,
const char **  pp 
) [static]

Definition at line 1159 of file ffserver.c.

Referenced by http_parse_request(), and rtsp_parse_request().

static void handle_child_exit ( int  sig  )  [static]

Definition at line 4422 of file ffserver.c.

Referenced by main().

static int handle_connection ( HTTPContext c  )  [static]

Definition at line 836 of file ffserver.c.

Referenced by http_server().

static void http_av_log ( void *  ptr,
int  level,
const char *  fmt,
va_list  vargs 
) [static]

Definition at line 353 of file ffserver.c.

Referenced by main().

void http_log ( const char *  fmt,
  ... 
)
static int http_parse_request ( HTTPContext c  )  [static]

Definition at line 1230 of file ffserver.c.

Referenced by handle_connection().

static int http_prepare_data ( HTTPContext c  )  [static]

Definition at line 2037 of file ffserver.c.

Referenced by http_send_data().

static int http_receive_data ( HTTPContext c  )  [static]

Definition at line 2426 of file ffserver.c.

Referenced by handle_connection().

static int http_send_data ( HTTPContext c  )  [static]

Definition at line 2274 of file ffserver.c.

Referenced by handle_connection().

static int http_server ( void   )  [static]

Definition at line 548 of file ffserver.c.

Referenced by main().

static int http_start_receive_data ( HTTPContext c  )  [static]

Definition at line 2393 of file ffserver.c.

Referenced by http_parse_request().

static void http_vlog ( const char *  fmt,
va_list  vargs 
) [static]

Definition at line 330 of file ffserver.c.

Referenced by http_av_log(), and http_log().

static void log_connection ( HTTPContext c  )  [static]

Definition at line 365 of file ffserver.c.

Referenced by http_server().

int main ( int  argc,
char **  argv 
)

Definition at line 4473 of file ffserver.c.

static int modify_current_stream ( HTTPContext c,
char *  rates 
) [static]

Definition at line 1097 of file ffserver.c.

Referenced by http_parse_request().

static void new_connection ( int  server_fd,
int  is_rtsp 
) [static]

Definition at line 702 of file ffserver.c.

Referenced by http_server().

static int open_input_stream ( HTTPContext c,
const char *  info 
) [static]
static void open_parser ( AVFormatContext s,
int  i 
) [static]

Definition at line 1922 of file ffserver.c.

Referenced by open_input_stream().

static enum CodecID opt_audio_codec ( const char *  arg  )  [static]

Definition at line 3695 of file ffserver.c.

Referenced by parse_ffconfig().

static void opt_debug ( void   )  [static]

Definition at line 4447 of file ffserver.c.

static void opt_show_help ( void   )  [static]

Definition at line 4454 of file ffserver.c.

static enum CodecID opt_video_codec ( const char *  arg  )  [static]

Definition at line 3705 of file ffserver.c.

Referenced by parse_ffconfig().

static int parse_ffconfig ( const char *  filename  )  [static]

Definition at line 3751 of file ffserver.c.

Referenced by main().

static int prepare_sdp_description ( FFStream stream,
uint8_t **  pbuffer,
struct in_addr  my_ip 
) [static]

Definition at line 2709 of file ffserver.c.

Referenced by http_parse_request(), and rtsp_cmd_describe().

static void remove_stream ( FFStream stream  )  [static]

Definition at line 3299 of file ffserver.c.

Referenced by build_file_streams().

static int rtp_new_av_stream ( HTTPContext c,
int  stream_index,
struct sockaddr_in *  dest_addr,
HTTPContext rtsp_c 
) [static]

Definition at line 3144 of file ffserver.c.

Referenced by rtsp_cmd_setup(), and start_multicast().

static HTTPContext * rtp_new_connection ( struct sockaddr_in *  from_addr,
FFStream stream,
const char *  session_id,
enum RTSPLowerTransport  rtp_protocol 
) [static]

Definition at line 3078 of file ffserver.c.

Referenced by rtsp_cmd_setup(), and start_multicast().

static void rtsp_cmd_describe ( HTTPContext c,
const char *  url 
) [static]

Definition at line 2749 of file ffserver.c.

Referenced by rtsp_parse_request().

static void rtsp_cmd_options ( HTTPContext c,
const char *  url 
) [static]

Definition at line 2740 of file ffserver.c.

Referenced by rtsp_parse_request().

static void rtsp_cmd_pause ( HTTPContext c,
const char *  url,
RTSPMessageHeader h 
) [static]

Definition at line 3026 of file ffserver.c.

Referenced by rtsp_parse_request().

static void rtsp_cmd_play ( HTTPContext c,
const char *  url,
RTSPMessageHeader h 
) [static]

Definition at line 2992 of file ffserver.c.

Referenced by rtsp_parse_request().

static void rtsp_cmd_setup ( HTTPContext c,
const char *  url,
RTSPMessageHeader h 
) [static]

Definition at line 2820 of file ffserver.c.

Referenced by rtsp_parse_request().

static void rtsp_cmd_teardown ( HTTPContext c,
const char *  url,
RTSPMessageHeader h 
) [static]

Definition at line 3051 of file ffserver.c.

Referenced by rtsp_parse_request().

static int rtsp_parse_request ( HTTPContext c  )  [static]

Definition at line 2619 of file ffserver.c.

Referenced by handle_connection().

static void rtsp_reply_error ( HTTPContext c,
enum RTSPStatusCode  error_number 
) [static]
static void rtsp_reply_header ( HTTPContext c,
enum RTSPStatusCode  error_number 
) [static]
static void skip_spaces ( const char **  pp  )  [static]

Definition at line 1150 of file ffserver.c.

Referenced by get_word().

static int socket_open_listen ( struct sockaddr_in *  my_addr  )  [static]

Definition at line 461 of file ffserver.c.

Referenced by http_server().

static void start_children ( FFStream feed  )  [static]

Definition at line 398 of file ffserver.c.

Referenced by http_server().

static void start_multicast ( void   )  [static]

Definition at line 493 of file ffserver.c.

Referenced by http_server().

static void start_wait_request ( HTTPContext c,
int  is_rtsp 
) [static]

Definition at line 688 of file ffserver.c.

Referenced by handle_connection(), and new_connection().

static void update_datarate ( DataRateData drd,
int64_t  count 
) [static]

Definition at line 375 of file ffserver.c.

Referenced by http_receive_data(), and http_send_data().

static int validate_acl ( FFStream stream,
HTTPContext c 
) [static]

Definition at line 1177 of file ffserver.c.

Referenced by http_parse_request().


Variable Documentation

const char* config_filename [static]

Definition at line 296 of file ffserver.c.

Referenced by main().

int64_t cur_time [static]
uint64_t current_bandwidth [static]
int ffserver_daemon [static]

Definition at line 298 of file ffserver.c.

Referenced by main(), opt_debug(), and parse_ffconfig().

int ffserver_debug [static]

Definition at line 297 of file ffserver.c.

Referenced by http_parse_request(), opt_debug(), parse_ffconfig(), and start_children().

FFStream* first_feed [static]

Definition at line 257 of file ffserver.c.

Definition at line 256 of file ffserver.c.

Definition at line 258 of file ffserver.c.

const char* http_state[] [static]
Initial value:
 {
    "HTTP_WAIT_REQUEST",
    "HTTP_SEND_HEADER",

    "SEND_DATA_HEADER",
    "SEND_DATA",
    "SEND_DATA_TRAILER",
    "RECEIVE_DATA",
    "WAIT_FEED",
    "READY",

    "RTSP_WAIT_REQUEST",
    "RTSP_SEND_REPLY",
    "RTSP_SEND_PACKET",
}

Definition at line 82 of file ffserver.c.

Referenced by compute_status().

FILE* logfile = NULL [static]

Definition at line 314 of file ffserver.c.

Referenced by http_vlog(), and main().

char logfilename[1024] [static]

Definition at line 255 of file ffserver.c.

Referenced by av_encode(), main(), opt_debug(), and parse_ffconfig().

uint64_t max_bandwidth = 1000 [static]

Definition at line 307 of file ffserver.c.

Referenced by compute_status(), http_parse_request(), and parse_ffconfig().

struct sockaddr_in my_http_addr [static]

Definition at line 252 of file ffserver.c.

Referenced by http_server(), and parse_ffconfig().

const char* my_program_dir [static]

Definition at line 294 of file ffserver.c.

Referenced by main(), and start_children().

const char* my_program_name [static]

Definition at line 293 of file ffserver.c.

Referenced by main(), and start_children().

struct sockaddr_in my_rtsp_addr [static]

Definition at line 253 of file ffserver.c.

Referenced by http_parse_request(), http_server(), and parse_ffconfig().

unsigned int nb_connections [static]

Definition at line 305 of file ffserver.c.

Referenced by close_connection(), compute_status(), new_connection(), and rtp_new_connection().

unsigned int nb_max_connections = 5 [static]

Definition at line 304 of file ffserver.c.

Referenced by compute_status(), new_connection(), parse_ffconfig(), and rtp_new_connection().

unsigned int nb_max_http_connections = 2000 [static]

Definition at line 303 of file ffserver.c.

Referenced by http_server(), and parse_ffconfig().

int need_to_start_children [static]

Definition at line 300 of file ffserver.c.

Referenced by handle_child_exit(), and http_server().

int no_launch [static]

Definition at line 299 of file ffserver.c.

Referenced by start_children().

static const OptionDef options [static]
Initial value:
 {
    { "h", OPT_EXIT, {(void*)opt_show_help}, "show help" },
    { "version", OPT_EXIT, {(void*)show_version}, "show version" },
    { "L", OPT_EXIT, {(void*)show_license}, "show license" },
    { "formats", OPT_EXIT, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
    { "n", OPT_BOOL, {(void *)&no_launch }, "enable no-launch mode" },
    { "d", 0, {(void*)opt_debug}, "enable debug mode" },
    { "f", HAS_ARG | OPT_STRING, {(void*)&config_filename }, "use configfile instead of /etc/ffserver.conf", "configfile" },
    { NULL },
}

Definition at line 65 of file ffserver.c.

const int program_birth_year = 2000

program birth year, defined by the program for show_banner()

Definition at line 63 of file ffserver.c.

Referenced by show_banner().

const char program_name[] = "FFserver"

program name, defined by the program for show_version().

Definition at line 62 of file ffserver.c.

Referenced by compute_status(), show_banner(), show_license(), and show_version().

Definition at line 312 of file ffserver.c.

Generated on Tue Jun 12 16:29:03 2012 for ffmpeg by  doxygen 1.6.3