Originally committed as revision 6 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
| @@ -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] | |||
| @@ -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). | |||
| @@ -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. | |||
| @@ -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 | |||
| @@ -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. | |||
| @@ -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> | |||
| @@ -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 | |||