Originally committed as revision 6 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Fabrice Bellard 2001-07-22 14:37:44 +00:00
parent de6d9b6404
commit 85f07f223d
9 changed files with 4344 additions and 0 deletions

42
Makefile Normal file
View File

@ -0,0 +1,42 @@
# Main ffmpeg Makefile
# (c) 2000, 2001 Gerard Lantau
#
include config.mk
CFLAGS= -O2 -Wall -g -I./libavcodec -I./libav
LDFLAGS= -g
ifdef CONFIG_GPROF
CFLAGS+=-p
LDFLAGS+=-p
endif
PROG= ffmpeg ffserver
all: lib $(PROG)
lib:
make -C libavcodec all
make -C libav all
ffmpeg: ffmpeg.o libav/libav.a libavcodec/libavcodec.a
gcc $(LDFLAGS) -o $@ $^ -lm
ffserver: ffserver.o libav/libav.a libavcodec/libavcodec.a
gcc $(LDFLAGS) -o $@ $^ -lm
%.o: %.c
gcc $(CFLAGS) -c -o $@ $<
install: all
install -s -m 755 $(PROG) $(PREFIX)/bin
clean:
make -C libavcodec clean
make -C libav clean
rm -f *.o *~ gmon.out TAGS $(PROG)
distclean: clean
rm -f Rules.mk config.h
TAGS:
etags *.[ch] libav/*.[ch] libavcodec/*.[ch]

73
README Normal file
View File

@ -0,0 +1,73 @@
FFmpeg - (c) 2000,2001 Gerard Lantau.
1) Introduction
---------------
ffmpeg is a hyper fast realtime audio/video encoder, a streaming
server and a generic audio and video file converter.
It can grab from a standard Video4Linux video source and convert it
into several file formats based on DCT/motion compensation
encoding. Sound is compressed in MPEG audio layer 2 or using an AC3
compatible stream.
What makes ffmpeg interesting ?
- Innovative streaming technology : multiformat, real time encoding,
simple configuration.
- Simple and efficient video encoder: outputs MPEG1, H263, Real
Video(tm), MPEG4, DIVX and MJPEG compatible bitstreams using the
same encoder core.
- Real time encoding (25 fps in 352x288 on a K6 500) using the
video4linux API.
- Generates I and P frames, which means it is far better than a MJPEG
encoder.
- Hyper fast MPEG audio layer 2 compression (50 times faster than
realtime on a K6 500).
- Hyper fast AC3 compatible encoder.
- simple and very small portable C source code, easy to understand and
to modify. It be may the smallest decent MPEG encoder :-)
- optional non real time higher quality encoding (different motion
estimators available).
- Audio and Video decoders are in development.
ffmpeg is made of two programs:
* ffmpeg: soft VCR which encodes in real time to several formats. It
can also encode from any supported input file format to any input
supported format.
* ffserver: high performance live broadcast streaming server based on
the ffmpeg core encoders.
2) Documentation
----------------
* Read doc/ffmpeg.txt and doc/ffserver.txt to learn the basic features.
* Read doc/TODO to know what are the know bugs and missing features.
* Read doc/README.dev if you want to contribute or use the codec or
format libraries.
3) Licensing:
------------
* See the file COPYING. ffmpeg and the associated library are licensed
under the GNU General Public License. I may change the license of
libavcodec and libav to LGPL if many people ask it (and if they
submit good patches!).
* This code should be patent free since it is very simple. I took care
to use the same video encoder/decoder core for all formats to show
that they really ARE THE SAME except for the encoding huffman codes.
Gerard Lantau (glantau@yahoo.fr).

46
doc/README.tech Normal file
View File

@ -0,0 +1,46 @@
Technical notes:
---------------
Video:
-----
- The decision intra/predicted macroblock is the algorithm suggested
by the mpeg 1 specification.
- only Huffman based H263 is supported, mainly because of patent
issues.
- MPEG4 is supported, as an extension of the H263 encoder. MPEG4 DC
prediction is used, but not AC prediction. Specific VLC are used for
intra pictures. The output format is compatible with Open DIVX
version 47.
- MJPEG is supported, but in the current version the huffman tables
are not optimized. It could be interesting to add this feature for
the flash format.
- To increase speed, only motion vectors (0,0) are tested for real
time compression. NEW: now motion compensation is done with several
methods : none, full, log, and phods. The code is mmx/sse optimized.
- In high quality mode, full search is used for motion
vectors. Currently, only fcode = 1 is used for both H263/MPEG1. Half
pel vectors are used.
I also plan to improve the bitrate control which is too simplistic.
Audio:
-----
- I rewrote the mpeg audio layer 2 compatible encoder from scratch. It
is one of the simplest encoder you can imagine (800 lines of C code
!). It is also one of the fastest because of its simplicity. There
are still some problems of overflow. A minimal psycho acoustic model
could be added. Currently, stereo is supported, but not joint
stereo.
- I rewrote the AC3 audio encoder from scratch. It is fairly naive,
but the result are quiet interesting at 64 kbit/s. It includes
extensions for low sampling rates used in some Internet
formats. Differential and coupled stereo is not handled. Stereo
channels are simply handled as two mono channels.

63
doc/TODO Normal file
View File

@ -0,0 +1,63 @@
ffmpeg TODO list:
----------------
(in approximate decreasing priority order)
Planned in next release:
(DONE) - apply header fixes
(DONE) - mpeg audio decoder.
(DONE) - fix decode/encode codec string.
(DONE) - fix EINTR error if VIDIOCSYNC.
(DONE) - add CONFIG system.
(DONE) - merge mplayer mmx accel.
(DONE) - fix emms bug.
(DONE) - add I263 handling
(DONE) - add RV10 decoding.
(DONE) - add true pgm support.
(DONE) - msmpeg4 0x18 fix.
- add qscale out.
- add format autodetect with content (for example to distinguish
mpegvideo/mpegmux).
- add external alloc for libavcodec (avifile request).
- fix -sameq in grabbing
- find a solution to clear feed1.ffm if format change.
- new grab architecture : use avformat instead of audio: and video:
protocol.
- correct PTS handling to sync audio and video.
- fix 0 size picture in AVIs = skip picture
BUGS:
- fix audio/video synchro (including real player synchro bugs)
- Improve the bit rate control for video codecs.
- see ov511.o YUV problem (420 instead of 420P).
- fix file caching pb in windows (add correct headers)
- add low pass filter to suppress noise coming from cheap TV cards.
- test/debug audio in flash format
- sort out ASF streaming pbs.
- Improve psycho acoustic model for AC3 & mpeg audio.
FEATURES:
- add MPEG4 in mpegmux support.
- add RTP / multicast layer.
- demux streams for CCTV : N streams in one stream. Add option to
generate multiple streams.
- add disconnect user option in stat.html.
- deny & allow + password in ffserver.
- graphical user interface.
- animated gif as output format

181
doc/ffmpeg.txt Normal file
View File

@ -0,0 +1,181 @@
*************** FFMPEG soft VCR documentation *****************
0) Introduction
---------------
FFmpeg is a very fast video and audio encoder. It can grab from
files or from a live audio/video source.
The command line interface is designed to be intuitive, in the sense
that ffmpeg tries to figure out all the paramters, when
possible. You have usually to give only the target bitrate you want.
FFmpeg can also convert from any sample rate to any other, and
resize video on the fly with a high quality polyphase filter.
1) Video and Audio grabbing
---------------------------
* ffmpeg can use a video4linux compatible video source and any Open
Sound System audio source:
ffmpeg /tmp/out.mpg
Note that you must activate the right video source and channel
before launching ffmpeg. You can use any TV viewer such as xawtv by
Gerd Knorr which I find very good. You must also set correctly the
audio recording levels with a standard mixer.
2) Video and Audio file format convertion
-----------------------------------------
* ffmpeg can use any supported file format and protocol as input :
examples:
ffmpeg -i /tmp/test%d.Y /tmp/out.mpg
If will use the files:
/tmp/test0.Y, /tmp/test0.U, /tmp/test0.V,
/tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...
The Y files use twice the resolution of the U and V files. They are
raw files, without header. They can be generated by all decent video
decoders. You must specify the size of the image with the '-s' option
if ffmpeg cannot guess it.
* You can set several input files and output files:
ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
Convert the audio file a.wav and the raw yuv video file a.yuv to mpeg file a.mpg
* you can also do audio and video convertions at the same time:
ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2
Convert the sample rate of a.wav to 22050 Hz and encode it to MPEG audio.
* you can encode to several formats at the same time and define a
mapping from input stream to output streams:
ffmpeg -i /tmp/a.wav -ab 64 /tmp/a.mp2 -ab 128 /tmp/b.mp2 -map 0:0 -map 0:0
convert a.wav to a.mp2 at 64 kbits and b.mp2 at 128 kbits. '-map
file:index' specify which input stream is used for each output
stream, in the order of the definition of output streams.
NOTE: to see the supported input formats, use 'ffmpeg -formats'.
2) Invocation
-------------
* The generic syntax is :
ffmpeg [[options][-i input_file]]... {[options] output_file}...
If no input file is given, audio/video grabbing is done.
As a general rule, options are applied to the next specified
file. For example, if you give the '-b 64' option, it sets the video
bitrate of the next file. Format option may be needed for raw input
files.
By default, ffmpeg tries to convert as losslessly as possible: it
uses the same audio and video parameter fors the outputs as the one
specified for the inputs.
* Main options are:
-h show help
-formats show available formats, codecs and protocols
-L print the LICENSE
-i filename input file name
-y overwrite output files
-t duration set recording time in seconds
-f format set encoding format [guessed]
-title string set the title
-author string set the author
-copyright string set the copyright
-comment string set the comment
* Video Options are:
-s size set frame size [160x128]
-r fps set frame rate [25]
-b bitrate set the video bitrate in kbit/s [200]
-vn disable video recording [no]
* Audio Options are:
-ar freq set the audio sampling freq [44100]
-ab bitrate set the audio bitrate in kbit/s [64]
-ac channels set the number of audio channels [1]
-an disable audio recording [no]
Advanced options are:
-map file:stream set input stream mapping
-g gop_size set the group of picture size [12]
-intra use only intra frames [no]
-qscale q use fixed video quantiser scale (VBR)
-c comment set the comment string
-vd device set video4linux device name [/dev/video]
-vcodec codec force audio codec
-me method set motion estimation method
-ad device set audio device name [/dev/dsp]
-acodec codec force audio codec
The output file can be "-" to output to a pipe. This is only possible
with mpeg1 and h263 formats.
3) Protocols
ffmpeg handles also many protocols specified with the URL syntax.
Use 'ffmpeg -formats' to have a list of the supported protocols.
The protocol 'http:' is currently used only to communicate with
ffserver (see the ffserver documentation). When ffmpeg will be a
video player it will also be used for streaming :-)
4) File formats and codecs
--------------------------
Use 'ffmpeg -formats' to have a list of the supported output
formats. Only some formats are handled as input, but it will improve
in the next versions.
5) Tips
-------
- For streaming at very low bit rate application, use a low frame rate
and a small gop size. This is especially true for real video where
the Linux player does not seem to be very fast, so it can miss
frames. An example is:
ffmpeg -g 3 -r 3 -t 10 -b 50 -s qcif -f rv10 /tmp/b.rm
- The parameter 'q' which is displayed while encoding is the current
quantizer. The value of 1 indicates that a very good quality could
be achieved. The value of 31 indicates the worst quality. If q=31
too often, it means that the encoder cannot compress enough to meet
your bit rate. You must either increase the bit rate, decrease the
frame rate or decrease the frame size.
- If your computer is not fast enough, you can speed up the
compression at the expense of the compression ratio. You can use
'-me zero' to speed up motion estimation, and '-intra' to disable
completly motion estimation (you have only I frames, which means it
is about as good as JPEG compression).
- To have very low bitrates in audio, reduce the sampling frequency
(down to 22050 kHz for mpeg audio, 22050 or 11025 for ac3).
- To have a constant quality (but a variable bitrate), use the option
'-qscale n' when 'n' is between 1 (excellent quality) and 31 (worst
quality).
- When converting video files, you can use the '-sameq' option which
uses in the encoder the same quality factor than in the decoder. It
allows to be almost lossless in encoding.

261
doc/ffserver.conf Normal file
View File

@ -0,0 +1,261 @@
# Port on which the server is listening. You must select a different
# port from your standard http web server if it is running on the same
# computer.
Port 8090
# Address on which the server is bound. Only useful if you have
# several network interfaces.
BindAddress 0.0.0.0
# Number of simultaneous requests that can be handled. Since FFServer
# is very fast, this limit is determined mainly by your Internet
# connection speed.
MaxClients 1000
# Access Log file (uses standard Apache log file format)
# '-' is the standard output
CustomLog -
##################################################################
# Definition of the live feeds. Each live feed contains one video
# and/or audio sequence coming from an ffmpeg encoder or another
# ffserver. This sequence may be encoded simultaneously with several
# codecs at several resolutions.
<Feed feed1.ffm>
# You must use 'ffmpeg' to send a live feed to ffserver. In this
# example, you can type:
#
# ffmpeg http://localhost:8090/feed1.ffm
# ffserver can also do time shifting. It means that it can stream any
# previously recorded live stream. The request should contain:
# "http://xxxx?date=[YYYY-MM-DDT][[HH:]MM:]SS[.m...]".You must specify
# a path where the feed is stored on disk. You also specify the
# maximum size of the feed (100M bytes here). Default:
# File=/tmp/feed_name.ffm FileMaxSize=5M
File /tmp/feed1.ffm
FileMaxSize 50M
</Feed>
##################################################################
# Now you can define each stream which will be generated from the
# original audio and video stream. Each format has a filename (here
# 'test128.mpg'). FFServer will send this stream when answering a
# request containing this filename.
<Stream test1.mpg>
# coming from live feed 'feed1'
Feed feed1.ffm
# Format of the stream : you can choose among:
# mpeg : MPEG1 multiplexed video and audio
# mpegvideo : only MPEG1 video
# mp2 : MPEG audio layer 2
# mp3 : MPEG audio layer 3 (currently sent as layer 2)
# rm : Real Networks compatible stream. Multiplexed audio and video.
# ra : Real Networks compatible stream. Audio only.
# mpjpeg : Multipart JPEG (works with Netscape without any plugin)
# jpeg : Generate a single JPEG image.
# asf : ASF compatible stream (Windows Media Player format). Not finished yet.
# swf : Macromedia flash(tm) compatible stream
# avi : AVI format (open divx video, mpeg audio sound)
# master : special ffmpeg stream used to duplicate a server
Format mpeg
# Bitrate for the audio stream. Codecs usually support only a few different bitrates.
AudioBitRate 32
# Number of audio channels : 1 = mono, 2 = stereo
AudioChannels 1
# Sampling frequency for audio. When using low bitrates, you should
# lower this frequency to 22050 or 11025. The supported frequencies
# depend on the selected audio codec.
AudioSampleRate 44100
# Bitrate for the video stream.
VideoBitRate 64
# Number of frames per second
VideoFrameRate 3
# Size of the video frame : WxH (default: 160x128)
# W : width, H : height
# The following abbreviation are defined : sqcif, qcif, cif, 4cif
VideoSize 160x128
# transmit only intra frames (useful for low bitrates)
VideoIntraOnly
# If non intra only, an intra frame is transmitted every VideoGopSize
# frames Video synchronization can only begin at an I frames.
#VideoGopSize 12
# Suppress audio
#NoAudio
# Suppress video
#NoVideo
</Stream>
# second mpeg stream with high frame rate
<Stream test2.mpg>
Feed feed1.ffm
Format mpegvideo
VideoBitRate 128
VideoFrameRate 25
#VideoSize 352x240
VideoGopSize 25
</Stream>
##################################################################
# A stream coming from a file : you only need to set the input
# filename and optionnally a new format. Supported conversions:
# avi -> asf
#
<Stream file.asf>
#File "/tmp/file.avi"
File "tmp/file.avi"
# avi must be converted to asf to be streamed
Format asf
</Stream>
# another file streaming
<Stream file.mp3>
File "tmp/file.mp3"
</Stream>
##################################################################
# Another stream : Real with audio only at 32 kbits
<Stream test.ra>
Feed feed1.ffm
Format rm
AudioBitRate 32
NoVideo
</Stream>
##################################################################
# Another stream : Real with audio and video at 64 kbits
<Stream test.rm>
Feed feed1.ffm
Format rm
AudioBitRate 32
VideoBitRate 20
VideoFrameRate 2
VideoIntraOnly
</Stream>
##################################################################
# Another stream : Mpeg audio layer 2 at 64 kbits.
<Stream test.mp2>
Feed feed1.ffm
Format mp2
AudioBitRate 64
AudioSampleRate 44100
</Stream>
<Stream test1.mp2>
Feed feed1.ffm
Format mp2
AudioBitRate 32
AudioSampleRate 16000
</Stream>
##################################################################
# Another stream : Multipart JPEG
<Stream test.mjpg>
Feed feed1.ffm
Format mpjpeg
VideoFrameRate 2
VideoIntraOnly
</Stream>
##################################################################
# Another stream : Multipart JPEG
<Stream test.jpg>
Feed feed1.ffm
Format jpeg
# the parameters are choose here to take the same output as the
# Multipart JPEG one.
VideoFrameRate 2
VideoIntraOnly
#VideoSize 352x240
</Stream>
##################################################################
# Another stream : Flash
<Stream test.swf>
Feed feed1.ffm
Format swf
VideoFrameRate 2
VideoIntraOnly
</Stream>
##################################################################
# Another stream : ASF compatible
<Stream test.asf>
Feed feed1.ffm
Format asf
AudioBitRate 64
AudioSampleRate 44100
VideoFrameRate 2
VideoIntraOnly
</Stream>
##################################################################
# Special stream : server status
<Stream stat.html>
Format status
</Stream>

2079
ffmpeg.c Normal file

File diff suppressed because it is too large Load Diff

1577
ffserver.c Normal file

File diff suppressed because it is too large Load Diff

22
libav/Makefile Normal file
View File

@ -0,0 +1,22 @@
include ../config.mk
CFLAGS= -O2 -Wall -g -I../libavcodec
OBJS= rm.o mpeg.o asf.o avienc.o jpegenc.o swf.o wav.o raw.o \
avidec.o ffm.o \
avio.o aviobuf.o utils.o \
udp.o http.o file.o grab.o audio.o img.o
LIB= libav.a
all: $(LIB)
$(LIB): $(OBJS)
rm -f $@
$(AR) rcs $@ $(OBJS)
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
clean:
rm -f *.o *~ *.a