Compare commits
	
		
			96 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					39fe8033bb | ||
| 
						 | 
					964f8419dd | ||
| 
						 | 
					5c2ffa2ce7 | ||
| 
						 | 
					6be8e44c00 | ||
| 
						 | 
					565581b0a4 | ||
| 
						 | 
					dc85ca0945 | ||
| 
						 | 
					a53ca16ae9 | ||
| 
						 | 
					92e5e62156 | ||
| 
						 | 
					e1c9434424 | ||
| 
						 | 
					af3f7c88f2 | ||
| 
						 | 
					b4294e2319 | ||
| 
						 | 
					7d97936495 | ||
| 
						 | 
					f9fc08de65 | ||
| 
						 | 
					31d3b3b5d5 | ||
| 
						 | 
					706809adb2 | ||
| 
						 | 
					4e66ca5f37 | ||
| 
						 | 
					530ce76a05 | ||
| 
						 | 
					0e74b21427 | ||
| 
						 | 
					381a914024 | ||
| 
						 | 
					d0d9182d3e | ||
| 
						 | 
					320704f739 | ||
| 
						 | 
					be1d65031f | ||
| 
						 | 
					bbc4d287c9 | ||
| 
						 | 
					3bb942e6f0 | ||
| 
						 | 
					e863d3306f | ||
| 
						 | 
					433ec3afa3 | ||
| 
						 | 
					d0cb4dc471 | ||
| 
						 | 
					95b1cbc4cb | ||
| 
						 | 
					177fc2438a | ||
| 
						 | 
					46b99bb70c | ||
| 
						 | 
					03275ed219 | ||
| 
						 | 
					ae5f69a98f | ||
| 
						 | 
					dc72a59fe5 | ||
| 
						 | 
					70af4f209f | ||
| 
						 | 
					0964e189da | ||
| 
						 | 
					7883efbbb2 | ||
| 
						 | 
					af67af5938 | ||
| 
						 | 
					d3c564b784 | ||
| 
						 | 
					bb5314daba | ||
| 
						 | 
					33a3f1fe9d | ||
| 
						 | 
					ac3fc94eb0 | ||
| 
						 | 
					d838c40823 | ||
| 
						 | 
					eea82203ba | ||
| 
						 | 
					617d91b76a | ||
| 
						 | 
					f1150e0c7d | ||
| 
						 | 
					f46b57657b | ||
| 
						 | 
					662ab44c2d | ||
| 
						 | 
					cc0a684497 | ||
| 
						 | 
					7f0f6602cb | ||
| 
						 | 
					d5d5f96068 | ||
| 
						 | 
					91ac6d9902 | ||
| 
						 | 
					0a311df6d9 | ||
| 
						 | 
					48094cb23a | ||
| 
						 | 
					d3d6849d17 | ||
| 
						 | 
					ddb92c6df1 | ||
| 
						 | 
					55a97399bc | ||
| 
						 | 
					eecbd9a78f | ||
| 
						 | 
					a441a96eb2 | ||
| 
						 | 
					dff4dbdf60 | ||
| 
						 | 
					622e926e9c | ||
| 
						 | 
					8ad71e276c | ||
| 
						 | 
					cdcd99eecc | ||
| 
						 | 
					9dc14fd3f0 | ||
| 
						 | 
					ba2d20b449 | ||
| 
						 | 
					b395bac383 | ||
| 
						 | 
					3768afd5a5 | ||
| 
						 | 
					e0f0486c7f | ||
| 
						 | 
					56e987d2cd | ||
| 
						 | 
					c64bfd7c3d | ||
| 
						 | 
					0e2b69b4e6 | ||
| 
						 | 
					63040dcddd | ||
| 
						 | 
					1e78d75d6a | ||
| 
						 | 
					91fdba3d79 | ||
| 
						 | 
					68efb539e3 | ||
| 
						 | 
					ee50ec19c7 | ||
| 
						 | 
					3a68e989ec | ||
| 
						 | 
					61a72fd9c8 | ||
| 
						 | 
					c254214ea3 | ||
| 
						 | 
					59417897be | ||
| 
						 | 
					03f82b5668 | ||
| 
						 | 
					7f8059bdfe | ||
| 
						 | 
					0f9098cb18 | ||
| 
						 | 
					c4e3dd06e8 | ||
| 
						 | 
					88a145738b | ||
| 
						 | 
					1ed0a61ea8 | ||
| 
						 | 
					9f2905d299 | ||
| 
						 | 
					f6c3fe94da | ||
| 
						 | 
					727749d30f | ||
| 
						 | 
					c7c82acf96 | ||
| 
						 | 
					f8f5db3b70 | ||
| 
						 | 
					51157dab37 | ||
| 
						 | 
					982caeac3e | ||
| 
						 | 
					d108d0804a | ||
| 
						 | 
					072e7fad87 | ||
| 
						 | 
					484302d183 | ||
| 
						 | 
					734cfa8e8b | 
							
								
								
									
										115
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										115
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,79 +1,64 @@
 | 
			
		||||
.config
 | 
			
		||||
.version
 | 
			
		||||
*.a
 | 
			
		||||
*.o
 | 
			
		||||
*.d
 | 
			
		||||
*.def
 | 
			
		||||
*.dll
 | 
			
		||||
*.dylib
 | 
			
		||||
*.exe
 | 
			
		||||
*.exp
 | 
			
		||||
*.gcda
 | 
			
		||||
*.gcno
 | 
			
		||||
*.h.c
 | 
			
		||||
*.ilk
 | 
			
		||||
*.ho
 | 
			
		||||
*.lib
 | 
			
		||||
*.pc
 | 
			
		||||
*.pdb
 | 
			
		||||
*.so
 | 
			
		||||
*.so.*
 | 
			
		||||
*.ver
 | 
			
		||||
*-example
 | 
			
		||||
*-test
 | 
			
		||||
*_g
 | 
			
		||||
/.config
 | 
			
		||||
/.version
 | 
			
		||||
/ffmpeg
 | 
			
		||||
/ffplay
 | 
			
		||||
/ffprobe
 | 
			
		||||
/ffserver
 | 
			
		||||
/config.*
 | 
			
		||||
/coverage.info
 | 
			
		||||
/version.h
 | 
			
		||||
/doc/*.1
 | 
			
		||||
/doc/*.3
 | 
			
		||||
/doc/*.html
 | 
			
		||||
/doc/*.pod
 | 
			
		||||
/doc/config.texi
 | 
			
		||||
/doc/avoptions_codec.texi
 | 
			
		||||
/doc/avoptions_format.texi
 | 
			
		||||
/doc/examples/decoding_encoding
 | 
			
		||||
/doc/examples/demuxing
 | 
			
		||||
/doc/examples/filtering_audio
 | 
			
		||||
/doc/examples/filtering_video
 | 
			
		||||
/doc/examples/metadata
 | 
			
		||||
/doc/examples/muxing
 | 
			
		||||
/doc/examples/pc-uninstalled
 | 
			
		||||
/doc/examples/resampling_audio
 | 
			
		||||
/doc/examples/scaling_video
 | 
			
		||||
/doc/fate.txt
 | 
			
		||||
/doc/doxy/html/
 | 
			
		||||
/doc/print_options
 | 
			
		||||
/lcov/
 | 
			
		||||
/libavcodec/*_tablegen
 | 
			
		||||
/libavcodec/*_tables.c
 | 
			
		||||
/libavcodec/*_tables.h
 | 
			
		||||
/libavutil/avconfig.h
 | 
			
		||||
/tests/audiogen
 | 
			
		||||
/tests/base64
 | 
			
		||||
/tests/data/
 | 
			
		||||
/tests/rotozoom
 | 
			
		||||
/tests/tiny_psnr
 | 
			
		||||
/tests/tiny_ssim
 | 
			
		||||
/tests/videogen
 | 
			
		||||
/tests/vsynth1/
 | 
			
		||||
/tools/aviocat
 | 
			
		||||
/tools/ffbisect
 | 
			
		||||
/tools/bisect.need
 | 
			
		||||
/tools/crypto_bench
 | 
			
		||||
/tools/cws2fws
 | 
			
		||||
/tools/fourcc2pixfmt
 | 
			
		||||
/tools/ffescape
 | 
			
		||||
/tools/ffeval
 | 
			
		||||
/tools/ffhash
 | 
			
		||||
/tools/graph2dot
 | 
			
		||||
/tools/ismindex
 | 
			
		||||
/tools/pktdumper
 | 
			
		||||
/tools/probetest
 | 
			
		||||
/tools/qt-faststart
 | 
			
		||||
/tools/trasher
 | 
			
		||||
/tools/seek_print
 | 
			
		||||
/tools/zmqsend
 | 
			
		||||
*.def
 | 
			
		||||
*.dll
 | 
			
		||||
*.lib
 | 
			
		||||
*.exp
 | 
			
		||||
config.*
 | 
			
		||||
doc/*.1
 | 
			
		||||
doc/*.html
 | 
			
		||||
doc/*.pod
 | 
			
		||||
doc/fate.txt
 | 
			
		||||
doxy
 | 
			
		||||
ffmpeg
 | 
			
		||||
ffplay
 | 
			
		||||
ffprobe
 | 
			
		||||
ffserver
 | 
			
		||||
avconv
 | 
			
		||||
doc/avoptions_codec.texi
 | 
			
		||||
doc/avoptions_format.texi
 | 
			
		||||
doc/print_options
 | 
			
		||||
doc/examples/decoding_encoding
 | 
			
		||||
doc/examples/filtering_audio
 | 
			
		||||
doc/examples/filtering_video
 | 
			
		||||
doc/examples/metadata
 | 
			
		||||
doc/examples/muxing
 | 
			
		||||
libavcodec/*_tablegen
 | 
			
		||||
libavcodec/*_tables.c
 | 
			
		||||
libavcodec/*_tables.h
 | 
			
		||||
libavcodec/codec_names.h
 | 
			
		||||
libavutil/avconfig.h
 | 
			
		||||
tests/audiogen
 | 
			
		||||
tests/base64
 | 
			
		||||
tests/data
 | 
			
		||||
tests/rotozoom
 | 
			
		||||
tests/tiny_psnr
 | 
			
		||||
tests/videogen
 | 
			
		||||
tests/vsynth1
 | 
			
		||||
tests/vsynth2
 | 
			
		||||
tools/aviocat
 | 
			
		||||
tools/cws2fws
 | 
			
		||||
tools/ffeval
 | 
			
		||||
tools/graph2dot
 | 
			
		||||
tools/ismindex
 | 
			
		||||
tools/lavfi-showfiltfmts
 | 
			
		||||
tools/pktdumper
 | 
			
		||||
tools/probetest
 | 
			
		||||
tools/qt-faststart
 | 
			
		||||
tools/trasher
 | 
			
		||||
version.h
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										59
									
								
								CREDITS
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								CREDITS
									
									
									
									
									
								
							@@ -1,6 +1,55 @@
 | 
			
		||||
See the Git history of the project (git://source.ffmpeg.org/ffmpeg) to
 | 
			
		||||
get the names of people who have contributed to FFmpeg.
 | 
			
		||||
This file contains the names of some of the people who have contributed to
 | 
			
		||||
FFmpeg. The names are sorted alphabetically by last name.  As this file is
 | 
			
		||||
currently quite outdated and git serves as a much better tool for determining
 | 
			
		||||
authorship, it remains here for historical reasons only.
 | 
			
		||||
 | 
			
		||||
To check the log, you can type the command "git log" in the FFmpeg
 | 
			
		||||
source directory, or browse the online repository at
 | 
			
		||||
http://source.ffmpeg.org.
 | 
			
		||||
Dénes Balatoni
 | 
			
		||||
Michel Bardiaux
 | 
			
		||||
Fabrice Bellard
 | 
			
		||||
Patrice Bensoussan
 | 
			
		||||
Alex Beregszaszi
 | 
			
		||||
BERO
 | 
			
		||||
Thilo Borgmann
 | 
			
		||||
Mario Brito
 | 
			
		||||
Ronald Bultje
 | 
			
		||||
Alex Converse
 | 
			
		||||
Maarten Daniels
 | 
			
		||||
Reimar Doeffinger
 | 
			
		||||
Tim Ferguson
 | 
			
		||||
Brian Foley
 | 
			
		||||
Arpad Gereoffy
 | 
			
		||||
Philip Gladstone
 | 
			
		||||
Vladimir Gneushev
 | 
			
		||||
Roine Gustafsson
 | 
			
		||||
David Hammerton
 | 
			
		||||
Wolfgang Hesseler
 | 
			
		||||
Marc Hoffman
 | 
			
		||||
Falk Hueffner
 | 
			
		||||
Aurélien Jacobs
 | 
			
		||||
Steven Johnson
 | 
			
		||||
Zdenek Kabelac
 | 
			
		||||
Robin Kay
 | 
			
		||||
Todd Kirby
 | 
			
		||||
Nick Kurshev
 | 
			
		||||
Benjamin Larsson
 | 
			
		||||
Loïc Le Loarer
 | 
			
		||||
Daniel Maas
 | 
			
		||||
Mike Melanson
 | 
			
		||||
Loren Merritt
 | 
			
		||||
Jeff Muizelaar
 | 
			
		||||
Michael Niedermayer
 | 
			
		||||
François Revol
 | 
			
		||||
Peter Ross
 | 
			
		||||
Måns Rullgård
 | 
			
		||||
Stefano Sabatini
 | 
			
		||||
Roman Shaposhnik
 | 
			
		||||
Oded Shimon
 | 
			
		||||
Dieter Shirley
 | 
			
		||||
Konstantin Shishkov
 | 
			
		||||
Juan J. Sierralta
 | 
			
		||||
Ewald Snel
 | 
			
		||||
Sascha Sommer
 | 
			
		||||
Leon van Stuivenberg
 | 
			
		||||
Roberto Togni
 | 
			
		||||
Lionel Ulmer
 | 
			
		||||
Reynaldo Verdejo
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										286
									
								
								Changelog
									
									
									
									
									
								
							
							
						
						
									
										286
									
								
								Changelog
									
									
									
									
									
								
							@@ -1,283 +1,10 @@
 | 
			
		||||
Entries are sorted chronologically from oldest to youngest within each release,
 | 
			
		||||
releases are sorted from youngest to oldest.
 | 
			
		||||
 | 
			
		||||
version <next>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 2.1:
 | 
			
		||||
 | 
			
		||||
- aecho filter
 | 
			
		||||
- perspective filter ported from libmpcodecs
 | 
			
		||||
- ffprobe -show_programs option
 | 
			
		||||
- compand filter
 | 
			
		||||
- RTMP seek support
 | 
			
		||||
- when transcoding with ffmpeg (i.e. not streamcopying), -ss is now accurate
 | 
			
		||||
  even when used as an input option. Previous behavior can be restored with
 | 
			
		||||
  the -noaccurate_seek option.
 | 
			
		||||
- ffmpeg -t option can now be used for inputs, to limit the duration of
 | 
			
		||||
  data read from an input file
 | 
			
		||||
- incomplete Voxware MetaSound decoder
 | 
			
		||||
- read EXIF metadata from JPEG
 | 
			
		||||
- DVB teletext decoder
 | 
			
		||||
- phase filter ported from libmpcodecs
 | 
			
		||||
- w3fdif filter
 | 
			
		||||
- Opus support in Matroska
 | 
			
		||||
- FFV1 version 1.3 is stable and no longer experimental
 | 
			
		||||
- FFV1: YUVA(444,422,420) 9, 10 and 16 bit support
 | 
			
		||||
- changed DTS stream id in lavf mpeg ps muxer from 0x8a to 0x88, to be
 | 
			
		||||
  more consistent with other muxers.
 | 
			
		||||
- adelay filter
 | 
			
		||||
- pullup filter ported from libmpcodecs
 | 
			
		||||
- ffprobe -read_intervals option
 | 
			
		||||
- Lossless and alpha support for WebP decoder
 | 
			
		||||
- Error Resilient AAC syntax (ER AAC LC) decoding
 | 
			
		||||
- Low Delay AAC (ER AAC LD) decoding
 | 
			
		||||
- mux chapters in ASF files
 | 
			
		||||
- SFTP protocol (via libssh)
 | 
			
		||||
- libx264: add ability to encode in YUVJ422P and YUVJ444P
 | 
			
		||||
- Fraps: use BT.709 colorspace by default for yuv, as reference fraps decoder does
 | 
			
		||||
- make decoding alpha optional for prores, ffv1 and vp6 by setting
 | 
			
		||||
  the skip_alpha flag.
 | 
			
		||||
- ladspa wrapper filter
 | 
			
		||||
- native VP9 decoder
 | 
			
		||||
- dpx parser
 | 
			
		||||
- max_error_rate parameter in ffmpeg
 | 
			
		||||
- PulseAudio output device
 | 
			
		||||
- ReplayGain scanner
 | 
			
		||||
- Enhanced Low Delay AAC (ER AAC ELD) decoding (no LD SBR support)
 | 
			
		||||
- Linux framebuffer output device
 | 
			
		||||
- HEVC decoder, raw HEVC demuxer, HEVC demuxing in TS, Matroska and MP4
 | 
			
		||||
- mergeplanes filter
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 2.0:
 | 
			
		||||
 | 
			
		||||
- curves filter
 | 
			
		||||
- reference-counting for AVFrame and AVPacket data
 | 
			
		||||
- ffmpeg now fails when input options are used for output file
 | 
			
		||||
  or vice versa
 | 
			
		||||
- support for Monkey's Audio versions from 3.93
 | 
			
		||||
- perms and aperms filters
 | 
			
		||||
- audio filtering support in ffplay
 | 
			
		||||
- 10% faster aac encoding on x86 and MIPS
 | 
			
		||||
- sine audio filter source
 | 
			
		||||
- WebP demuxing and decoding support
 | 
			
		||||
- new ffmpeg options -filter_script and -filter_complex_script, which allow a
 | 
			
		||||
  filtergraph description to be read from a file
 | 
			
		||||
- OpenCL support
 | 
			
		||||
- audio phaser filter
 | 
			
		||||
- separatefields filter
 | 
			
		||||
- libquvi demuxer
 | 
			
		||||
- uniform options syntax across all filters
 | 
			
		||||
- telecine filter
 | 
			
		||||
- new interlace filter
 | 
			
		||||
- smptehdbars source
 | 
			
		||||
- inverse telecine filters (fieldmatch and decimate)
 | 
			
		||||
- colorbalance filter
 | 
			
		||||
- colorchannelmixer filter
 | 
			
		||||
- The matroska demuxer can now output proper verbatim ASS packets. It will
 | 
			
		||||
  become the default at the next libavformat major bump.
 | 
			
		||||
- decent native animated GIF encoding
 | 
			
		||||
- asetrate filter
 | 
			
		||||
- interleave filter
 | 
			
		||||
- timeline editing with filters
 | 
			
		||||
- vidstabdetect and vidstabtransform filters for video stabilization using
 | 
			
		||||
  the vid.stab library
 | 
			
		||||
- astats filter
 | 
			
		||||
- trim and atrim filters
 | 
			
		||||
- ffmpeg -t and -ss (output-only) options are now sample-accurate when
 | 
			
		||||
  transcoding audio
 | 
			
		||||
- Matroska muxer can now put the index at the beginning of the file.
 | 
			
		||||
- extractplanes filter
 | 
			
		||||
- avectorscope filter
 | 
			
		||||
- ADPCM DTK decoder
 | 
			
		||||
- ADP demuxer
 | 
			
		||||
- RSD demuxer
 | 
			
		||||
- RedSpark demuxer
 | 
			
		||||
- ADPCM IMA Radical decoder
 | 
			
		||||
- zmq filters
 | 
			
		||||
- DCT denoiser filter (dctdnoiz)
 | 
			
		||||
- Wavelet denoiser filter ported from libmpcodecs as owdenoise (formerly "ow")
 | 
			
		||||
- Apple Intermediate Codec decoder
 | 
			
		||||
- Escape 130 video decoder
 | 
			
		||||
- FTP protocol support
 | 
			
		||||
- V4L2 output device
 | 
			
		||||
- 3D LUT filter (lut3d)
 | 
			
		||||
- SMPTE 302M audio encoder
 | 
			
		||||
- support for slice multithreading in libavfilter
 | 
			
		||||
- Hald CLUT support (generation and filtering)
 | 
			
		||||
- VC-1 interlaced B-frame support
 | 
			
		||||
- support for WavPack muxing (raw and in Matroska)
 | 
			
		||||
- XVideo output device
 | 
			
		||||
- vignette filter
 | 
			
		||||
- True Audio (TTA) encoder
 | 
			
		||||
- Go2Webinar decoder
 | 
			
		||||
- mcdeint filter ported from libmpcodecs
 | 
			
		||||
- sab filter ported from libmpcodecs
 | 
			
		||||
- ffprobe -show_chapters option
 | 
			
		||||
- WavPack encoding through libwavpack
 | 
			
		||||
- rotate filter
 | 
			
		||||
- spp filter ported from libmpcodecs
 | 
			
		||||
- libgme support
 | 
			
		||||
- psnr filter
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 1.2:
 | 
			
		||||
 | 
			
		||||
- VDPAU hardware acceleration through normal hwaccel
 | 
			
		||||
- SRTP support
 | 
			
		||||
- Error diffusion dither in Swscale
 | 
			
		||||
- Chained Ogg support
 | 
			
		||||
- Theora Midstream reconfiguration support
 | 
			
		||||
- EVRC decoder
 | 
			
		||||
- audio fade filter
 | 
			
		||||
- filtering audio with unknown channel layout
 | 
			
		||||
- allpass, bass, bandpass, bandreject, biquad, equalizer, highpass, lowpass
 | 
			
		||||
  and treble audio filter
 | 
			
		||||
- improved showspectrum filter, with multichannel support and sox-like colors
 | 
			
		||||
- histogram filter
 | 
			
		||||
- tee muxer
 | 
			
		||||
- il filter ported from libmpcodecs
 | 
			
		||||
- support ID3v2 tags in ASF files
 | 
			
		||||
- encrypted TTA stream decoding support
 | 
			
		||||
- RF64 support in WAV muxer
 | 
			
		||||
- noise filter ported from libmpcodecs
 | 
			
		||||
- Subtitles character encoding conversion
 | 
			
		||||
- blend filter
 | 
			
		||||
- stereo3d filter ported from libmpcodecs
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 1.1:
 | 
			
		||||
 | 
			
		||||
- stream disposition information printing in ffprobe
 | 
			
		||||
- filter for loudness analysis following EBU R128
 | 
			
		||||
- Opus encoder using libopus
 | 
			
		||||
- ffprobe -select_streams option
 | 
			
		||||
- Pinnacle TARGA CineWave YUV16 decoder
 | 
			
		||||
- TAK demuxer, decoder and parser
 | 
			
		||||
- DTS-HD demuxer
 | 
			
		||||
- remove -same_quant, it hasn't worked for years
 | 
			
		||||
- FFM2 support
 | 
			
		||||
- X-Face image encoder and decoder
 | 
			
		||||
- 24-bit FLAC encoding
 | 
			
		||||
- multi-channel ALAC encoding up to 7.1
 | 
			
		||||
- metadata (INFO tag) support in WAV muxer
 | 
			
		||||
- subtitles raw text decoder
 | 
			
		||||
- support for building DLLs using MSVC
 | 
			
		||||
- LVF demuxer
 | 
			
		||||
- ffescape tool
 | 
			
		||||
- metadata (info chunk) support in CAF muxer
 | 
			
		||||
- field filter ported from libmpcodecs
 | 
			
		||||
- AVR demuxer
 | 
			
		||||
- geq filter ported from libmpcodecs
 | 
			
		||||
- remove ffserver daemon mode
 | 
			
		||||
- AST muxer/demuxer
 | 
			
		||||
- new expansion syntax for drawtext
 | 
			
		||||
- BRender PIX image decoder
 | 
			
		||||
- ffprobe -show_entries option
 | 
			
		||||
- ffprobe -sections option
 | 
			
		||||
- ADPCM IMA Dialogic decoder
 | 
			
		||||
- BRSTM demuxer
 | 
			
		||||
- animated GIF decoder and demuxer
 | 
			
		||||
- PVF demuxer
 | 
			
		||||
- subtitles filter
 | 
			
		||||
- IRCAM muxer/demuxer
 | 
			
		||||
- Paris Audio File demuxer
 | 
			
		||||
- Virtual concatenation demuxer
 | 
			
		||||
- VobSub demuxer
 | 
			
		||||
- JSON captions for TED talks decoding support
 | 
			
		||||
- SOX Resampler support in libswresample
 | 
			
		||||
- aselect filter
 | 
			
		||||
- SGI RLE 8-bit decoder
 | 
			
		||||
- Silicon Graphics Motion Video Compressor 1 & 2 decoder
 | 
			
		||||
- Silicon Graphics Movie demuxer
 | 
			
		||||
- apad filter
 | 
			
		||||
- Resolution & pixel format change support with multithreading for H.264
 | 
			
		||||
- documentation split into per-component manuals
 | 
			
		||||
- pp (postproc) filter ported from MPlayer
 | 
			
		||||
- NIST Sphere demuxer
 | 
			
		||||
- MPL2, VPlayer, MPlayer, AQTitle, PJS and SubViewer v1 subtitles demuxers and decoders
 | 
			
		||||
- Sony Wave64 muxer
 | 
			
		||||
- adobe and limelight publisher authentication in RTMP
 | 
			
		||||
- data: URI scheme
 | 
			
		||||
- support building on the Plan 9 operating system
 | 
			
		||||
- kerndeint filter ported from MPlayer
 | 
			
		||||
- histeq filter ported from VirtualDub
 | 
			
		||||
- Megalux Frame demuxer
 | 
			
		||||
- 012v decoder
 | 
			
		||||
- Improved AVC Intra decoding support
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 1.0:
 | 
			
		||||
 | 
			
		||||
- INI and flat output in ffprobe
 | 
			
		||||
- Scene detection in libavfilter
 | 
			
		||||
- Indeo Audio decoder
 | 
			
		||||
- channelsplit audio filter
 | 
			
		||||
- setnsamples audio filter
 | 
			
		||||
- atempo filter
 | 
			
		||||
- ffprobe -show_data option
 | 
			
		||||
- RTMPT protocol support
 | 
			
		||||
- iLBC encoding/decoding via libilbc
 | 
			
		||||
- Microsoft Screen 1 decoder
 | 
			
		||||
- join audio filter
 | 
			
		||||
- audio channel mapping filter
 | 
			
		||||
- Microsoft ATC Screen decoder
 | 
			
		||||
- RTSP listen mode
 | 
			
		||||
- TechSmith Screen Codec 2 decoder
 | 
			
		||||
- AAC encoding via libfdk-aac
 | 
			
		||||
- Microsoft Expression Encoder Screen decoder
 | 
			
		||||
- RTMPS protocol support
 | 
			
		||||
- RTMPTS protocol support
 | 
			
		||||
- RTMPE protocol support
 | 
			
		||||
- RTMPTE protocol support
 | 
			
		||||
- showwaves and showspectrum filter
 | 
			
		||||
- LucasArts SMUSH playback support
 | 
			
		||||
- SAMI, RealText and SubViewer demuxers and decoders
 | 
			
		||||
- Heart Of Darkness PAF playback support
 | 
			
		||||
- iec61883 device
 | 
			
		||||
- asettb filter
 | 
			
		||||
- new option: -progress
 | 
			
		||||
- 3GPP Timed Text encoder/decoder
 | 
			
		||||
- GeoTIFF decoder support
 | 
			
		||||
- ffmpeg -(no)stdin option
 | 
			
		||||
- Opus decoder using libopus
 | 
			
		||||
- caca output device using libcaca
 | 
			
		||||
- alphaextract and alphamerge filters
 | 
			
		||||
- concat filter
 | 
			
		||||
- flite filter
 | 
			
		||||
- Canopus Lossless Codec decoder
 | 
			
		||||
- bitmap subtitles in filters (experimental and temporary)
 | 
			
		||||
- MP2 encoding via TwoLAME
 | 
			
		||||
- bmp parser
 | 
			
		||||
- smptebars source
 | 
			
		||||
- asetpts filter
 | 
			
		||||
- hue filter
 | 
			
		||||
- ICO muxer
 | 
			
		||||
- SubRip encoder and decoder without embedded timing
 | 
			
		||||
- edge detection filter
 | 
			
		||||
- framestep filter
 | 
			
		||||
- ffmpeg -shortest option is now per-output file
 | 
			
		||||
  -pass and -passlogfile are now per-output stream
 | 
			
		||||
- volume measurement filter
 | 
			
		||||
- Ut Video encoder
 | 
			
		||||
- Microsoft Screen 2 decoder
 | 
			
		||||
- smartblur filter ported from MPlayer
 | 
			
		||||
- CPiA decoder
 | 
			
		||||
- decimate filter ported from MPlayer
 | 
			
		||||
- RTP depacketization of JPEG
 | 
			
		||||
- Smooth Streaming live segmenter muxer
 | 
			
		||||
- F4V muxer
 | 
			
		||||
- sendcmd and asendcmd filters
 | 
			
		||||
- WebVTT demuxer and decoder (simple tags supported)
 | 
			
		||||
- RTP packetization of JPEG
 | 
			
		||||
- faststart option in the MOV/MP4 muxer
 | 
			
		||||
- support for building with MSVC
 | 
			
		||||
 | 
			
		||||
version next:
 | 
			
		||||
 | 
			
		||||
version 0.11:
 | 
			
		||||
 | 
			
		||||
- Fixes: CVE-2012-2772, CVE-2012-2774, CVE-2012-2775, CVE-2012-2776, CVE-2012-2777,
 | 
			
		||||
Fixes:CVE-2012-2772, CVE-2012-2774, CVE-2012-2775, CVE-2012-2776, CVE-2012-2777,
 | 
			
		||||
      CVE-2012-2779, CVE-2012-2782, CVE-2012-2783, CVE-2012-2784, CVE-2012-2785,
 | 
			
		||||
      CVE-2012-2786, CVE-2012-2787, CVE-2012-2788, CVE-2012-2789, CVE-2012-2790,
 | 
			
		||||
      CVE-2012-2791, CVE-2012-2792, CVE-2012-2793, CVE-2012-2794, CVE-2012-2795,
 | 
			
		||||
@@ -313,14 +40,13 @@ version 0.11:
 | 
			
		||||
- accept + prefix to -pix_fmt option to disable automatic conversions.
 | 
			
		||||
- complete audio filtering in libavfilter and ffmpeg
 | 
			
		||||
- add fps filter
 | 
			
		||||
- audio split filter
 | 
			
		||||
- vorbis parser
 | 
			
		||||
- png parser
 | 
			
		||||
- audio mix filter
 | 
			
		||||
- ffv1: support (draft) version 1.3
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 0.10:
 | 
			
		||||
 | 
			
		||||
- Fixes: CVE-2011-3929, CVE-2011-3934, CVE-2011-3935, CVE-2011-3936,
 | 
			
		||||
         CVE-2011-3937, CVE-2011-3940, CVE-2011-3941, CVE-2011-3944,
 | 
			
		||||
         CVE-2011-3945, CVE-2011-3946, CVE-2011-3947, CVE-2011-3949,
 | 
			
		||||
@@ -656,7 +382,7 @@ version 0.6:
 | 
			
		||||
- LPCM support in MPEG-TS (HDMV RID as found on Blu-ray disks)
 | 
			
		||||
- WMA Pro decoder
 | 
			
		||||
- Core Audio Format demuxer
 | 
			
		||||
- ATRAC1 decoder
 | 
			
		||||
- Atrac1 decoder
 | 
			
		||||
- MD STUDIO audio demuxer
 | 
			
		||||
- RF64 support in WAV demuxer
 | 
			
		||||
- MPEG-4 Audio Lossless Coding (ALS) decoder
 | 
			
		||||
@@ -756,7 +482,7 @@ version 0.5:
 | 
			
		||||
- MXF demuxer
 | 
			
		||||
- VC-1/WMV3/WMV9 video decoder
 | 
			
		||||
- MacIntel support
 | 
			
		||||
- AviSynth support
 | 
			
		||||
- AVISynth support
 | 
			
		||||
- VMware video decoder
 | 
			
		||||
- VP5 video decoder
 | 
			
		||||
- VP6 video decoder
 | 
			
		||||
@@ -784,7 +510,7 @@ version 0.5:
 | 
			
		||||
- Interplay C93 demuxer and video decoder
 | 
			
		||||
- Bethsoft VID demuxer and video decoder
 | 
			
		||||
- CRYO APC demuxer
 | 
			
		||||
- ATRAC3 decoder
 | 
			
		||||
- Atrac3 decoder
 | 
			
		||||
- V.Flash PTX decoder
 | 
			
		||||
- RoQ muxer, RoQ audio encoder
 | 
			
		||||
- Renderware TXD demuxer and decoder
 | 
			
		||||
 
 | 
			
		||||
@@ -31,9 +31,9 @@ PROJECT_NAME           = FFmpeg
 | 
			
		||||
# This could be handy for archiving the generated documentation or
 | 
			
		||||
# if some version control system is used.
 | 
			
		||||
 | 
			
		||||
PROJECT_NUMBER         = 2.1.6
 | 
			
		||||
PROJECT_NUMBER         = 0.11.1
 | 
			
		||||
 | 
			
		||||
# With the PROJECT_LOGO tag one can specify a logo or icon that is included
 | 
			
		||||
# With the PROJECT_LOGO tag one can specify an logo or icon that is included
 | 
			
		||||
# in the documentation. The maximum height of the logo should not exceed 55
 | 
			
		||||
# pixels and the maximum width should not exceed 200 pixels. Doxygen will
 | 
			
		||||
# copy the logo to the output directory.
 | 
			
		||||
@@ -44,7 +44,7 @@ PROJECT_LOGO           =
 | 
			
		||||
# If a relative path is entered, it will be relative to the location
 | 
			
		||||
# where doxygen was started. If left blank the current directory will be used.
 | 
			
		||||
 | 
			
		||||
OUTPUT_DIRECTORY       = doc/doxy
 | 
			
		||||
OUTPUT_DIRECTORY       = doxy
 | 
			
		||||
 | 
			
		||||
# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
 | 
			
		||||
# 4096 sub-directories (in 2 levels) under the output directory of each output
 | 
			
		||||
@@ -277,7 +277,7 @@ SUBGROUPING            = YES
 | 
			
		||||
# be useful for C code in case the coding convention dictates that all compound
 | 
			
		||||
# types are typedef'ed and only the typedef is referenced, never the tag name.
 | 
			
		||||
 | 
			
		||||
TYPEDEF_HIDES_STRUCT   = YES
 | 
			
		||||
TYPEDEF_HIDES_STRUCT   = NO
 | 
			
		||||
 | 
			
		||||
# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
 | 
			
		||||
# determine which symbols to keep in memory and which to flush to disk.
 | 
			
		||||
@@ -288,7 +288,7 @@ TYPEDEF_HIDES_STRUCT   = YES
 | 
			
		||||
# causing a significant performance penality.
 | 
			
		||||
# If the system has enough physical memory increasing the cache will improve the
 | 
			
		||||
# performance by keeping more symbols in memory. Note that the value works on
 | 
			
		||||
# a logarithmic scale so increasing the size by one will roughly double the
 | 
			
		||||
# a logarithmic scale so increasing the size by one will rougly double the
 | 
			
		||||
# memory usage. The cache size is given by this formula:
 | 
			
		||||
# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
 | 
			
		||||
# corresponding to a cache size of 2^16 = 65536 symbols
 | 
			
		||||
@@ -409,7 +409,7 @@ INLINE_INFO            = YES
 | 
			
		||||
# alphabetically by member name. If set to NO the members will appear in
 | 
			
		||||
# declaration order.
 | 
			
		||||
 | 
			
		||||
SORT_MEMBER_DOCS       = NO
 | 
			
		||||
SORT_MEMBER_DOCS       = YES
 | 
			
		||||
 | 
			
		||||
# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
 | 
			
		||||
# brief documentation of file, namespace and class members alphabetically
 | 
			
		||||
@@ -489,6 +489,12 @@ MAX_INITIALIZER_LINES  = 30
 | 
			
		||||
 | 
			
		||||
SHOW_USED_FILES        = YES
 | 
			
		||||
 | 
			
		||||
# If the sources in your project are distributed over multiple directories
 | 
			
		||||
# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
 | 
			
		||||
# in the documentation. The default is NO.
 | 
			
		||||
 | 
			
		||||
SHOW_DIRECTORIES       = NO
 | 
			
		||||
 | 
			
		||||
# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
 | 
			
		||||
# This will remove the Files entry from the Quick Index and from the
 | 
			
		||||
# Folder Tree View (if specified). The default is YES.
 | 
			
		||||
@@ -639,14 +645,15 @@ EXCLUDE_SYMBOLS        =
 | 
			
		||||
# directories that contain example code fragments that are included (see
 | 
			
		||||
# the \include command).
 | 
			
		||||
 | 
			
		||||
EXAMPLE_PATH           = doc/examples/
 | 
			
		||||
EXAMPLE_PATH           = libavcodec/ \
 | 
			
		||||
                         libavformat/
 | 
			
		||||
 | 
			
		||||
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
 | 
			
		||||
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
 | 
			
		||||
# and *.h) to filter out the source-files in the directories. If left
 | 
			
		||||
# blank all files are included.
 | 
			
		||||
 | 
			
		||||
EXAMPLE_PATTERNS       = *.c
 | 
			
		||||
EXAMPLE_PATTERNS       = *-example.c
 | 
			
		||||
 | 
			
		||||
# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
 | 
			
		||||
# searched for input files to be used with the \include or \dontinclude
 | 
			
		||||
@@ -709,7 +716,7 @@ INLINE_SOURCES         = NO
 | 
			
		||||
# doxygen to hide any special comment blocks from generated source code
 | 
			
		||||
# fragments. Normal C and C++ comments will always remain visible.
 | 
			
		||||
 | 
			
		||||
STRIP_CODE_COMMENTS    = NO
 | 
			
		||||
STRIP_CODE_COMMENTS    = YES
 | 
			
		||||
 | 
			
		||||
# If the REFERENCED_BY_RELATION tag is set to YES
 | 
			
		||||
# then for each documented function all documented
 | 
			
		||||
@@ -793,13 +800,13 @@ HTML_FILE_EXTENSION    = .html
 | 
			
		||||
# each generated HTML page. If it is left blank doxygen will generate a
 | 
			
		||||
# standard header.
 | 
			
		||||
 | 
			
		||||
#HTML_HEADER            = doc/doxy/header.html
 | 
			
		||||
HTML_HEADER            = doc/doxy/header.html
 | 
			
		||||
 | 
			
		||||
# The HTML_FOOTER tag can be used to specify a personal HTML footer for
 | 
			
		||||
# each generated HTML page. If it is left blank doxygen will generate a
 | 
			
		||||
# standard footer.
 | 
			
		||||
 | 
			
		||||
#HTML_FOOTER            = doc/doxy/footer.html
 | 
			
		||||
HTML_FOOTER            = doc/doxy/footer.html
 | 
			
		||||
 | 
			
		||||
# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
 | 
			
		||||
# style sheet that is used by each HTML page. It can be used to
 | 
			
		||||
@@ -808,7 +815,7 @@ HTML_FILE_EXTENSION    = .html
 | 
			
		||||
# the style sheet file to the HTML output directory, so don't put your own
 | 
			
		||||
# stylesheet in the HTML output directory as well, or it will be erased!
 | 
			
		||||
 | 
			
		||||
#HTML_STYLESHEET        = doc/doxy/doxy_stylesheet.css
 | 
			
		||||
HTML_STYLESHEET        = doc/doxy/doxy_stylesheet.css
 | 
			
		||||
 | 
			
		||||
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
 | 
			
		||||
# Doxygen will adjust the colors in the stylesheet and background images
 | 
			
		||||
@@ -818,7 +825,7 @@ HTML_FILE_EXTENSION    = .html
 | 
			
		||||
# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
 | 
			
		||||
# The allowed range is 0 to 359.
 | 
			
		||||
 | 
			
		||||
#HTML_COLORSTYLE_HUE    = 120
 | 
			
		||||
HTML_COLORSTYLE_HUE    = 120
 | 
			
		||||
 | 
			
		||||
# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
 | 
			
		||||
# the colors in the HTML output. For a value of 0 the output will use
 | 
			
		||||
@@ -841,6 +848,12 @@ HTML_COLORSTYLE_GAMMA  = 80
 | 
			
		||||
 | 
			
		||||
HTML_TIMESTAMP         = YES
 | 
			
		||||
 | 
			
		||||
# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
 | 
			
		||||
# files or namespaces will be aligned in HTML using tables. If set to
 | 
			
		||||
# NO a bullet list will be used.
 | 
			
		||||
 | 
			
		||||
HTML_ALIGN_MEMBERS     = YES
 | 
			
		||||
 | 
			
		||||
# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
 | 
			
		||||
# documentation will contain sections that can be hidden and shown after the
 | 
			
		||||
# page has loaded. For this to work a browser that supports
 | 
			
		||||
@@ -1021,6 +1034,11 @@ ENUM_VALUES_PER_LINE   = 4
 | 
			
		||||
 | 
			
		||||
GENERATE_TREEVIEW      = NO
 | 
			
		||||
 | 
			
		||||
# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
 | 
			
		||||
# and Class Hierarchy pages using a tree view instead of an ordered list.
 | 
			
		||||
 | 
			
		||||
USE_INLINE_TREES       = NO
 | 
			
		||||
 | 
			
		||||
# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
 | 
			
		||||
# used to set the initial width (in pixels) of the frame in which the tree
 | 
			
		||||
# is shown.
 | 
			
		||||
@@ -1356,9 +1374,14 @@ INCLUDE_FILE_PATTERNS  =
 | 
			
		||||
# instead of the = operator.
 | 
			
		||||
 | 
			
		||||
PREDEFINED             = "__attribute__(x)=" \
 | 
			
		||||
                         "RENAME(x)=x ## _TMPL" \
 | 
			
		||||
                         "DEF(x)=x ## _TMPL" \
 | 
			
		||||
                         HAVE_AV_CONFIG_H \
 | 
			
		||||
                         HAVE_MMX \
 | 
			
		||||
                         HAVE_MMX2 \
 | 
			
		||||
                         HAVE_AMD3DNOW \
 | 
			
		||||
                         "DECLARE_ALIGNED(a,t,n)=t n" \
 | 
			
		||||
                         "offsetof(x,y)=0x42" \
 | 
			
		||||
                         av_alloc_size \
 | 
			
		||||
                         "offsetof(x,y)=0x42"
 | 
			
		||||
 | 
			
		||||
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
 | 
			
		||||
# this tag can be used to specify a list of macro names that should be expanded.
 | 
			
		||||
							
								
								
									
										87
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										87
									
								
								LICENSE
									
									
									
									
									
								
							@@ -1,4 +1,5 @@
 | 
			
		||||
FFmpeg:
 | 
			
		||||
-------
 | 
			
		||||
 | 
			
		||||
Most files in FFmpeg are under the GNU Lesser General Public License version 2.1
 | 
			
		||||
or later (LGPL v2.1+). Read the file COPYING.LGPLv2.1 for details. Some other
 | 
			
		||||
@@ -13,47 +14,9 @@ configure to activate them. In this case, FFmpeg's license changes to GPL v2+.
 | 
			
		||||
Specifically, the GPL parts of FFmpeg are
 | 
			
		||||
 | 
			
		||||
- libpostproc
 | 
			
		||||
- libmpcodecs
 | 
			
		||||
- optional x86 optimizations in the files
 | 
			
		||||
  libavcodec/x86/idct_mmx.c
 | 
			
		||||
- libutvideo encoding/decoding wrappers in
 | 
			
		||||
  libavcodec/libutvideo*.cpp
 | 
			
		||||
- the X11 grabber in libavdevice/x11grab.c
 | 
			
		||||
- the swresample test app in
 | 
			
		||||
  libswresample/swresample-test.c
 | 
			
		||||
- the texi2pod.pl tool
 | 
			
		||||
- the following filters in libavfilter:
 | 
			
		||||
    - f_ebur128.c
 | 
			
		||||
    - vf_blackframe.c
 | 
			
		||||
    - vf_boxblur.c
 | 
			
		||||
    - vf_colormatrix.c
 | 
			
		||||
    - vf_cropdetect.c
 | 
			
		||||
    - vf_decimate.c
 | 
			
		||||
    - vf_delogo.c
 | 
			
		||||
    - vf_geq.c
 | 
			
		||||
    - vf_histeq.c
 | 
			
		||||
    - vf_hqdn3d.c
 | 
			
		||||
    - vf_kerndeint.c
 | 
			
		||||
    - vf_mcdeint.c
 | 
			
		||||
    - vf_mp.c
 | 
			
		||||
    - vf_owdenoise.c
 | 
			
		||||
    - vf_perspective.c
 | 
			
		||||
    - vf_phase.c
 | 
			
		||||
    - vf_pp.c
 | 
			
		||||
    - vf_pullup.c
 | 
			
		||||
    - vf_sab.c
 | 
			
		||||
    - vf_smartblur.c
 | 
			
		||||
    - vf_spp.c
 | 
			
		||||
    - vf_stereo3d.c
 | 
			
		||||
    - vf_super2xsai.c
 | 
			
		||||
    - vf_tinterlace.c
 | 
			
		||||
    - vf_yadif.c
 | 
			
		||||
    - vsrc_mptestsrc.c
 | 
			
		||||
 | 
			
		||||
Should you, for whatever reason, prefer to use version 3 of the (L)GPL, then
 | 
			
		||||
the configure parameter --enable-version3 will activate this licensing option
 | 
			
		||||
for you. Read the file COPYING.LGPLv3 or, if you have enabled GPL parts,
 | 
			
		||||
COPYING.GPLv3 to learn the exact legal terms that apply in this case.
 | 
			
		||||
 | 
			
		||||
There are a handful of files under other licensing terms, namely:
 | 
			
		||||
 | 
			
		||||
@@ -64,40 +27,24 @@ There are a handful of files under other licensing terms, namely:
 | 
			
		||||
  You must also indicate any changes including additions and deletions to
 | 
			
		||||
  those three files in the documentation.
 | 
			
		||||
 | 
			
		||||
Should you, for whatever reason, prefer to use version 3 of the (L)GPL, then
 | 
			
		||||
the configure parameter --enable-version3 will activate this licensing option
 | 
			
		||||
for you. Read the file COPYING.LGPLv3 or, if you have enabled GPL parts,
 | 
			
		||||
COPYING.GPLv3 to learn the exact legal terms that apply in this case.
 | 
			
		||||
 | 
			
		||||
external libraries
 | 
			
		||||
==================
 | 
			
		||||
 | 
			
		||||
FFmpeg can be combined with a number of external libraries, which sometimes
 | 
			
		||||
affect the licensing of binaries resulting from the combination.
 | 
			
		||||
external libraries:
 | 
			
		||||
-------------------
 | 
			
		||||
 | 
			
		||||
compatible libraries
 | 
			
		||||
--------------------
 | 
			
		||||
Some external libraries, e.g. libx264, are under GPL and can be used in
 | 
			
		||||
conjunction with FFmpeg. They require --enable-gpl to be passed to configure
 | 
			
		||||
as well.
 | 
			
		||||
 | 
			
		||||
The following libraries are under GPL:
 | 
			
		||||
    - frei0r
 | 
			
		||||
    - libcdio
 | 
			
		||||
    - libutvideo
 | 
			
		||||
    - libvidstab
 | 
			
		||||
    - libx264
 | 
			
		||||
    - libxavs
 | 
			
		||||
    - libxvid
 | 
			
		||||
When combining them with FFmpeg, FFmpeg needs to be licensed as GPL as well by
 | 
			
		||||
passing --enable-gpl to configure.
 | 
			
		||||
The OpenCORE external libraries are under the Apache License 2.0. That license
 | 
			
		||||
is incompatible with the LGPL v2.1 and the GPL v2, but not with version 3 of
 | 
			
		||||
those licenses. So to combine the OpenCORE libraries with FFmpeg, the license
 | 
			
		||||
version needs to be upgraded by passing --enable-version3 to configure.
 | 
			
		||||
 | 
			
		||||
The OpenCORE and VisualOn libraries are under the Apache License 2.0. That
 | 
			
		||||
license is incompatible with the LGPL v2.1 and the GPL v2, but not with
 | 
			
		||||
version 3 of those licenses. So to combine these libraries with FFmpeg, the
 | 
			
		||||
license version needs to be upgraded by passing --enable-version3 to configure.
 | 
			
		||||
 | 
			
		||||
incompatible libraries
 | 
			
		||||
----------------------
 | 
			
		||||
 | 
			
		||||
The Fraunhofer AAC library, FAAC and aacplus are under licenses which
 | 
			
		||||
are incompatible with the GPLv2 and v3. We do not know for certain if their
 | 
			
		||||
licenses are compatible with the LGPL.
 | 
			
		||||
If you wish to enable these libraries, pass --enable-nonfree to configure.
 | 
			
		||||
But note that if you enable any of these libraries the resulting binary will
 | 
			
		||||
be under a complex license mix that is more restrictive than the LGPL and that
 | 
			
		||||
may result in additional obligations. It is possible that these
 | 
			
		||||
restrictions cause the resulting binary to be unredistributeable.
 | 
			
		||||
The nonfree external libraries libfaac and libaacplus can be hooked up in FFmpeg.
 | 
			
		||||
You need to pass --enable-nonfree to configure to enable it. Employ this option
 | 
			
		||||
with care as FFmpeg then becomes nonfree and unredistributable.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										169
									
								
								MAINTAINERS
									
									
									
									
									
								
							
							
						
						
									
										169
									
								
								MAINTAINERS
									
									
									
									
									
								
							@@ -7,8 +7,8 @@ FFmpeg code.
 | 
			
		||||
Please try to keep entries where you are the maintainer up to date!
 | 
			
		||||
 | 
			
		||||
Names in () mean that the maintainer currently has no time to maintain the code.
 | 
			
		||||
A (CC <address>) after the name means that the maintainer prefers to be CC-ed on
 | 
			
		||||
patches and related discussions.
 | 
			
		||||
A CC after the name means that the maintainer prefers to be CC-ed on patches
 | 
			
		||||
and related discussions.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Project Leader
 | 
			
		||||
@@ -43,24 +43,16 @@ QuickTime faststart:
 | 
			
		||||
Miscellaneous Areas
 | 
			
		||||
===================
 | 
			
		||||
 | 
			
		||||
documentation                           Stefano Sabatini, Mike Melanson, Timothy Gu
 | 
			
		||||
documentation                           Mike Melanson
 | 
			
		||||
website                                 Robert Swain, Lou Logan
 | 
			
		||||
build system (configure,Makefiles)      Diego Biurrun, Mans Rullgard
 | 
			
		||||
project server                          Árpád Gereöffy, Michael Niedermayer, Reimar Döffinger, Alexander Strasser
 | 
			
		||||
project server                          Árpád Gereöffy, Michael Niedermayer, Reimar Döffinger
 | 
			
		||||
mailinglists                            Michael Niedermayer, Baptiste Coudurier, Lou Logan
 | 
			
		||||
presets                                 Robert Swain
 | 
			
		||||
metadata subsystem                      Aurelien Jacobs
 | 
			
		||||
release management                      Michael Niedermayer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Communication
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
website                                 Robert Swain, Lou Logan
 | 
			
		||||
mailinglists                            Michael Niedermayer, Baptiste Coudurier, Lou Logan
 | 
			
		||||
Google+                                 Paul B Mahol, Michael Niedermayer, Alexander Strasser
 | 
			
		||||
Twitter                                 Lou Logan
 | 
			
		||||
Launchpad                               Timothy Gu
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
libavutil
 | 
			
		||||
=========
 | 
			
		||||
 | 
			
		||||
@@ -70,23 +62,11 @@ Internal Interfaces:
 | 
			
		||||
  libavutil/common.h                    Michael Niedermayer
 | 
			
		||||
 | 
			
		||||
Other:
 | 
			
		||||
  bprint                                Nicolas George
 | 
			
		||||
  bswap.h
 | 
			
		||||
  des                                   Reimar Doeffinger
 | 
			
		||||
  eval.c, eval.h                        Michael Niedermayer
 | 
			
		||||
  float_dsp                             Loren Merritt
 | 
			
		||||
  hash                                  Reimar Doeffinger
 | 
			
		||||
  intfloat*                             Michael Niedermayer
 | 
			
		||||
  integer.c, integer.h                  Michael Niedermayer
 | 
			
		||||
  lzo                                   Reimar Doeffinger
 | 
			
		||||
  mathematics.c, mathematics.h          Michael Niedermayer
 | 
			
		||||
  mem.c, mem.h                          Michael Niedermayer
 | 
			
		||||
  opencl.c, opencl.h                    Wei Gao
 | 
			
		||||
  opt.c, opt.h                          Michael Niedermayer
 | 
			
		||||
  rational.c, rational.h                Michael Niedermayer
 | 
			
		||||
  rc4                                   Reimar Doeffinger
 | 
			
		||||
  ripemd.c, ripemd.h                    James Almer
 | 
			
		||||
  timecode                              Clément Bœsch
 | 
			
		||||
  mathematics.c, mathematics.h          Michael Niedermayer
 | 
			
		||||
  integer.c, integer.h                  Michael Niedermayer
 | 
			
		||||
  bswap.h
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
libavcodec
 | 
			
		||||
@@ -97,6 +77,10 @@ Generic Parts:
 | 
			
		||||
    avcodec.h                           Michael Niedermayer
 | 
			
		||||
  utility code:
 | 
			
		||||
    utils.c                             Michael Niedermayer
 | 
			
		||||
    mem.c                               Michael Niedermayer
 | 
			
		||||
    opt.c, opt.h                        Michael Niedermayer
 | 
			
		||||
  arithmetic expression evaluator:
 | 
			
		||||
    eval.c                              Michael Niedermayer
 | 
			
		||||
  audio and video frame extraction:
 | 
			
		||||
    parser.c                            Michael Niedermayer
 | 
			
		||||
  bitstream reading:
 | 
			
		||||
@@ -127,8 +111,6 @@ Generic Parts:
 | 
			
		||||
    libpostproc/*                       Michael Niedermayer
 | 
			
		||||
  table generation:
 | 
			
		||||
    tableprint.c, tableprint.h          Reimar Doeffinger
 | 
			
		||||
  fixed point FFT:
 | 
			
		||||
    fft*                                Zeljko Lukac
 | 
			
		||||
 | 
			
		||||
Codecs:
 | 
			
		||||
  4xm.c                                 Michael Niedermayer
 | 
			
		||||
@@ -147,22 +129,18 @@ Codecs:
 | 
			
		||||
  binkaudio.c                           Peter Ross
 | 
			
		||||
  bmp.c                                 Mans Rullgard, Kostya Shishkov
 | 
			
		||||
  cavs*                                 Stefan Gehrer
 | 
			
		||||
  cdxl.c                                Paul B Mahol
 | 
			
		||||
  celp_filters.*                        Vitor Sessak
 | 
			
		||||
  cinepak.c                             Roberto Togni
 | 
			
		||||
  cljr                                  Alex Beregszaszi
 | 
			
		||||
  cllc.c                                Derek Buitenhuis
 | 
			
		||||
  cook.c, cookdata.h                    Benjamin Larsson
 | 
			
		||||
  cpia.c                                Stephan Hilb
 | 
			
		||||
  crystalhd.c                           Philip Langdale
 | 
			
		||||
  cscd.c                                Reimar Doeffinger
 | 
			
		||||
  dca.c                                 Kostya Shishkov, Benjamin Larsson
 | 
			
		||||
  dnxhd*                                Baptiste Coudurier
 | 
			
		||||
  dpcm.c                                Mike Melanson
 | 
			
		||||
  dv.c                                  Roman Shaposhnik
 | 
			
		||||
  dxa.c                                 Kostya Shishkov
 | 
			
		||||
  dv.c                                  Roman Shaposhnik
 | 
			
		||||
  eacmv*, eaidct*, eat*                 Peter Ross
 | 
			
		||||
  exif.c, exif.h                        Thilo Borgmann
 | 
			
		||||
  ffv1.c                                Michael Niedermayer
 | 
			
		||||
  ffwavesynth.c                         Nicolas George
 | 
			
		||||
  flac*                                 Justin Ruggles
 | 
			
		||||
@@ -171,9 +149,9 @@ Codecs:
 | 
			
		||||
  g722.c                                Martin Storsjo
 | 
			
		||||
  g726.c                                Roman Shaposhnik
 | 
			
		||||
  gifdec.c                              Baptiste Coudurier
 | 
			
		||||
  h264*                                 Loren Merritt, Michael Niedermayer
 | 
			
		||||
  h261*                                 Michael Niedermayer
 | 
			
		||||
  h263*                                 Michael Niedermayer
 | 
			
		||||
  h264*                                 Loren Merritt, Michael Niedermayer
 | 
			
		||||
  huffyuv.c                             Michael Niedermayer
 | 
			
		||||
  idcinvideo.c                          Mike Melanson
 | 
			
		||||
  imc*                                  Benjamin Larsson
 | 
			
		||||
@@ -182,14 +160,13 @@ Codecs:
 | 
			
		||||
  interplayvideo.c                      Mike Melanson
 | 
			
		||||
  ivi*                                  Kostya Shishkov
 | 
			
		||||
  jacosub*                              Clément Bœsch
 | 
			
		||||
  jpeg2000*                             Nicolas Bertrand
 | 
			
		||||
  jpeg_ls.c                             Kostya Shishkov
 | 
			
		||||
  jvdec.c                               Peter Ross
 | 
			
		||||
  kmvc.c                                Kostya Shishkov
 | 
			
		||||
  lcl*.c                                Roberto Togni, Reimar Doeffinger
 | 
			
		||||
  libcelt_dec.c                         Nicolas George
 | 
			
		||||
  libdirac*                             David Conrad
 | 
			
		||||
  libgsm.c                              Michel Bardiaux
 | 
			
		||||
  libdirac*                             David Conrad
 | 
			
		||||
  libopenjpeg.c                         Jaikrishnan Menon
 | 
			
		||||
  libopenjpegenc.c                      Michael Bradshaw
 | 
			
		||||
  libschroedinger*                      David Conrad
 | 
			
		||||
@@ -197,25 +174,23 @@ Codecs:
 | 
			
		||||
  libtheoraenc.c                        David Conrad
 | 
			
		||||
  libutvideo*                           Derek Buitenhuis
 | 
			
		||||
  libvorbis.c                           David Conrad
 | 
			
		||||
  libx264.c                             Mans Rullgard, Jason Garrett-Glaser
 | 
			
		||||
  libxavs.c                             Stefan Gehrer
 | 
			
		||||
  libx264.c                             Mans Rullgard, Jason Garrett-Glaser
 | 
			
		||||
  loco.c                                Kostya Shishkov
 | 
			
		||||
  lzo.h, lzo.c                          Reimar Doeffinger
 | 
			
		||||
  mdec.c                                Michael Niedermayer
 | 
			
		||||
  mimic.c                               Ramiro Polla
 | 
			
		||||
  mjpeg*.c                              Michael Niedermayer
 | 
			
		||||
  mjpeg.c                               Michael Niedermayer
 | 
			
		||||
  mlp*                                  Ramiro Polla
 | 
			
		||||
  mmvideo.c                             Peter Ross
 | 
			
		||||
  mpc*                                  Kostya Shishkov
 | 
			
		||||
  mpeg12.c, mpeg12data.h                Michael Niedermayer
 | 
			
		||||
  mpegvideo.c, mpegvideo.h              Michael Niedermayer
 | 
			
		||||
  mqc*                                  Nicolas Bertrand
 | 
			
		||||
  msmpeg4.c, msmpeg4data.h              Michael Niedermayer
 | 
			
		||||
  msrle.c                               Mike Melanson
 | 
			
		||||
  msvideo1.c                            Mike Melanson
 | 
			
		||||
  nellymoserdec.c                       Benjamin Larsson
 | 
			
		||||
  nuv.c                                 Reimar Doeffinger
 | 
			
		||||
  paf.*                                 Paul B Mahol
 | 
			
		||||
  pcx.c                                 Ivo van Poorten
 | 
			
		||||
  pgssubdec.c                           Reimar Doeffinger
 | 
			
		||||
  ptx.c                                 Ivo van Poorten
 | 
			
		||||
@@ -235,13 +210,11 @@ Codecs:
 | 
			
		||||
  s3tc*                                 Ivo van Poorten
 | 
			
		||||
  smacker.c                             Kostya Shishkov
 | 
			
		||||
  smc.c                                 Mike Melanson
 | 
			
		||||
  smvjpegdec.c                          Ash Hughes
 | 
			
		||||
  snow.c                                Michael Niedermayer, Loren Merritt
 | 
			
		||||
  sonic.c                               Alex Beregszaszi
 | 
			
		||||
  srt*                                  Aurelien Jacobs
 | 
			
		||||
  sunrast.c                             Ivo van Poorten
 | 
			
		||||
  svq3.c                                Michael Niedermayer
 | 
			
		||||
  tak*                                  Paul B Mahol
 | 
			
		||||
  targa.c                               Kostya Shishkov
 | 
			
		||||
  tiff.c                                Kostya Shishkov
 | 
			
		||||
  truemotion1*                          Mike Melanson
 | 
			
		||||
@@ -249,7 +222,6 @@ Codecs:
 | 
			
		||||
  truespeech.c                          Kostya Shishkov
 | 
			
		||||
  tscc.c                                Kostya Shishkov
 | 
			
		||||
  tta.c                                 Alex Beregszaszi, Jaikrishnan Menon
 | 
			
		||||
  ttaenc.c                              Paul B Mahol
 | 
			
		||||
  txd.c                                 Ivo van Poorten
 | 
			
		||||
  ulti*                                 Kostya Shishkov
 | 
			
		||||
  v410*.c                               Derek Buitenhuis
 | 
			
		||||
@@ -257,11 +229,9 @@ Codecs:
 | 
			
		||||
  vble.c                                Derek Buitenhuis
 | 
			
		||||
  vc1*                                  Kostya Shishkov
 | 
			
		||||
  vcr1.c                                Michael Niedermayer
 | 
			
		||||
  vda_h264_dec.c                        Xidorn Quan
 | 
			
		||||
  vima.c                                Paul B Mahol
 | 
			
		||||
  vmnc.c                                Kostya Shishkov
 | 
			
		||||
  vorbis_dec.c                          Denes Balatoni, David Conrad
 | 
			
		||||
  vorbis_enc.c                          Oded Shimon
 | 
			
		||||
  vorbis_dec.c                          Denes Balatoni, David Conrad
 | 
			
		||||
  vp3*                                  Mike Melanson
 | 
			
		||||
  vp5                                   Aurelien Jacobs
 | 
			
		||||
  vp6                                   Aurelien Jacobs
 | 
			
		||||
@@ -273,11 +243,8 @@ Codecs:
 | 
			
		||||
  wmv2.c                                Michael Niedermayer
 | 
			
		||||
  wnv1.c                                Kostya Shishkov
 | 
			
		||||
  xan.c                                 Mike Melanson
 | 
			
		||||
  xbm*                                  Paul B Mahol
 | 
			
		||||
  xface                                 Stefano Sabatini
 | 
			
		||||
  xl.c                                  Kostya Shishkov
 | 
			
		||||
  xvmc.c                                Ivan Kalvachev
 | 
			
		||||
  xwd*                                  Paul B Mahol
 | 
			
		||||
  zerocodec.c                           Derek Buitenhuis
 | 
			
		||||
  zmbv*                                 Kostya Shishkov
 | 
			
		||||
 | 
			
		||||
@@ -296,54 +263,22 @@ libavdevice
 | 
			
		||||
    libavdevice/avdevice.h
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  dshow.c                               Roger Pack
 | 
			
		||||
  fbdev_enc.c                           Lukasz Marek
 | 
			
		||||
  iec61883.c                            Georg Lippitsch
 | 
			
		||||
  lavfi                                 Stefano Sabatini
 | 
			
		||||
  libdc1394.c                           Roman Shaposhnik
 | 
			
		||||
  pulse_audio_enc.c                     Lukasz Marek
 | 
			
		||||
  sdl                                   Stefano Sabatini
 | 
			
		||||
  v4l2.c                                Luca Abeni
 | 
			
		||||
  vfwcap.c                              Ramiro Polla
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
libavfilter
 | 
			
		||||
===========
 | 
			
		||||
 | 
			
		||||
Generic parts:
 | 
			
		||||
Video filters:
 | 
			
		||||
  graphdump.c                           Nicolas George
 | 
			
		||||
 | 
			
		||||
Filters:
 | 
			
		||||
  af_adelay.c                           Paul B Mahol
 | 
			
		||||
  af_aecho.c                            Paul B Mahol
 | 
			
		||||
  af_afade.c                            Paul B Mahol
 | 
			
		||||
  af_amerge.c                           Nicolas George
 | 
			
		||||
  af_aphaser.c                          Paul B Mahol
 | 
			
		||||
  af_aresample.c                        Michael Niedermayer
 | 
			
		||||
  af_astats.c                           Paul B Mahol
 | 
			
		||||
  af_astreamsync.c                      Nicolas George
 | 
			
		||||
  af_atempo.c                           Pavel Koshevoy
 | 
			
		||||
  af_biquads.c                          Paul B Mahol
 | 
			
		||||
  af_compand.c                          Paul B Mahol
 | 
			
		||||
  af_ladspa.c                           Paul B Mahol
 | 
			
		||||
  af_pan.c                              Nicolas George
 | 
			
		||||
  avf_avectorscope.c                    Paul B Mahol
 | 
			
		||||
  vf_blend.c                            Paul B Mahol
 | 
			
		||||
  vf_colorbalance.c                     Paul B Mahol
 | 
			
		||||
  vf_delogo.c                           Jean Delvare (CC <khali@linux-fr.org>)
 | 
			
		||||
  vf_drawbox.c/drawgrid                 Andrey Utkin
 | 
			
		||||
  vf_extractplanes.c                    Paul B Mahol
 | 
			
		||||
  vf_histogram.c                        Paul B Mahol
 | 
			
		||||
  vf_il.c                               Paul B Mahol
 | 
			
		||||
  vf_mergeplanes.c                      Paul B Mahol
 | 
			
		||||
  vf_psnr.c                             Paul B Mahol
 | 
			
		||||
  vf_scale.c                            Michael Niedermayer
 | 
			
		||||
  vf_separatefields.c                   Paul B Mahol
 | 
			
		||||
  vf_stereo3d.c                         Paul B Mahol
 | 
			
		||||
  vf_telecine.c                         Paul B Mahol
 | 
			
		||||
  vsrc_mandelbrot.c                     Michael Niedermayer
 | 
			
		||||
  vf_yadif.c                            Michael Niedermayer
 | 
			
		||||
 | 
			
		||||
Sources:
 | 
			
		||||
  vsrc_mandelbrot.c                     Michael Niedermayer
 | 
			
		||||
 | 
			
		||||
libavformat
 | 
			
		||||
===========
 | 
			
		||||
@@ -358,27 +293,17 @@ Generic parts:
 | 
			
		||||
Muxers/Demuxers:
 | 
			
		||||
  4xm.c                                 Mike Melanson
 | 
			
		||||
  adtsenc.c                             Robert Swain
 | 
			
		||||
  afc.c                                 Paul B Mahol
 | 
			
		||||
  aiffdec.c                             Baptiste Coudurier, Matthieu Bouron
 | 
			
		||||
  aiffenc.c                             Baptiste Coudurier, Matthieu Bouron
 | 
			
		||||
  aiff.c                                Baptiste Coudurier
 | 
			
		||||
  ape.c                                 Kostya Shishkov
 | 
			
		||||
  ass*                                  Aurelien Jacobs
 | 
			
		||||
  astdec.c                              Paul B Mahol
 | 
			
		||||
  astenc.c                              James Almer
 | 
			
		||||
  avi*                                  Michael Niedermayer
 | 
			
		||||
  avisynth.c                            AvxSynth Team (avxsynth.testing at gmail dot com)
 | 
			
		||||
  avr.c                                 Paul B Mahol
 | 
			
		||||
  bink.c                                Peter Ross
 | 
			
		||||
  brstm.c                               Paul B Mahol
 | 
			
		||||
  caf*                                  Peter Ross
 | 
			
		||||
  cdxl.c                                Paul B Mahol
 | 
			
		||||
  crc.c                                 Michael Niedermayer
 | 
			
		||||
  daud.c                                Reimar Doeffinger
 | 
			
		||||
  dtshddec.c                            Paul B Mahol
 | 
			
		||||
  dv.c                                  Roman Shaposhnik
 | 
			
		||||
  dxa.c                                 Kostya Shishkov
 | 
			
		||||
  electronicarts.c                      Peter Ross
 | 
			
		||||
  epafdec.c                             Paul B Mahol
 | 
			
		||||
  ffm*                                  Baptiste Coudurier
 | 
			
		||||
  flac*                                 Justin Ruggles
 | 
			
		||||
  flic.c                                Mike Melanson
 | 
			
		||||
@@ -388,26 +313,23 @@ Muxers/Demuxers:
 | 
			
		||||
  idcin.c                               Mike Melanson
 | 
			
		||||
  idroqdec.c                            Mike Melanson
 | 
			
		||||
  iff.c                                 Jaikrishnan Menon
 | 
			
		||||
  img2*.c                               Michael Niedermayer
 | 
			
		||||
  ipmovie.c                             Mike Melanson
 | 
			
		||||
  ircam*                                Paul B Mahol
 | 
			
		||||
  img2.c                                Michael Niedermayer
 | 
			
		||||
  iss.c                                 Stefan Gehrer
 | 
			
		||||
  jacosub*                              Clément Bœsch
 | 
			
		||||
  jvdec.c                               Peter Ross
 | 
			
		||||
  libmodplug.c                          Clément Bœsch
 | 
			
		||||
  libnut.c                              Oded Shimon
 | 
			
		||||
  lmlm4.c                               Ivo van Poorten
 | 
			
		||||
  lvfdec.c                              Paul B Mahol
 | 
			
		||||
  lxfdec.c                              Tomas Härdin
 | 
			
		||||
  matroska.c                            Aurelien Jacobs
 | 
			
		||||
  matroskadec.c                         Aurelien Jacobs
 | 
			
		||||
  matroskaenc.c                         David Conrad
 | 
			
		||||
  metadata*                             Aurelien Jacobs
 | 
			
		||||
  mgsts.c                               Paul B Mahol
 | 
			
		||||
  microdvd*                             Aurelien Jacobs
 | 
			
		||||
  mm.c                                  Peter Ross
 | 
			
		||||
  mov.c                                 Michael Niedermayer, Baptiste Coudurier
 | 
			
		||||
  movenc.c                              Baptiste Coudurier, Matthieu Bouron
 | 
			
		||||
  movenc.c                              Michael Niedermayer, Baptiste Coudurier
 | 
			
		||||
  mpc.c                                 Kostya Shishkov
 | 
			
		||||
  mpeg.c                                Michael Niedermayer
 | 
			
		||||
  mpegenc.c                             Michael Niedermayer
 | 
			
		||||
@@ -416,7 +338,6 @@ Muxers/Demuxers:
 | 
			
		||||
  mtv.c                                 Reynaldo H. Verdejo Pinochet
 | 
			
		||||
  mxf*                                  Baptiste Coudurier
 | 
			
		||||
  mxfdec.c                              Tomas Härdin
 | 
			
		||||
  nistspheredec.c                       Paul B Mahol
 | 
			
		||||
  nsvdec.c                              Francois Revol
 | 
			
		||||
  nut.c                                 Michael Niedermayer
 | 
			
		||||
  nuv.c                                 Reimar Doeffinger
 | 
			
		||||
@@ -424,10 +345,8 @@ Muxers/Demuxers:
 | 
			
		||||
  oggenc.c                              Baptiste Coudurier
 | 
			
		||||
  oggparse*.c                           David Conrad
 | 
			
		||||
  oma.c                                 Maxim Poliakovski
 | 
			
		||||
  paf.c                                 Paul B Mahol
 | 
			
		||||
  psxstr.c                              Mike Melanson
 | 
			
		||||
  pva.c                                 Ivo van Poorten
 | 
			
		||||
  pvfdec.c                              Paul B Mahol
 | 
			
		||||
  r3d.c                                 Baptiste Coudurier
 | 
			
		||||
  raw.c                                 Michael Niedermayer
 | 
			
		||||
  rdt.c                                 Ronald S. Bultje
 | 
			
		||||
@@ -443,51 +362,31 @@ Muxers/Demuxers:
 | 
			
		||||
  segafilm.c                            Mike Melanson
 | 
			
		||||
  siff.c                                Kostya Shishkov
 | 
			
		||||
  smacker.c                             Kostya Shishkov
 | 
			
		||||
  smjpeg*                               Paul B Mahol
 | 
			
		||||
  srtdec.c                              Aurelien Jacobs
 | 
			
		||||
  swf.c                                 Baptiste Coudurier
 | 
			
		||||
  takdec.c                              Paul B Mahol
 | 
			
		||||
  tta.c                                 Alex Beregszaszi
 | 
			
		||||
  txd.c                                 Ivo van Poorten
 | 
			
		||||
  voc.c                                 Aurelien Jacobs
 | 
			
		||||
  wav.c                                 Michael Niedermayer
 | 
			
		||||
  wc3movie.c                            Mike Melanson
 | 
			
		||||
  webvtt*                               Matthew J Heaney
 | 
			
		||||
  westwood.c                            Mike Melanson
 | 
			
		||||
  wtv.c                                 Peter Ross
 | 
			
		||||
  wv.c                                  Kostya Shishkov
 | 
			
		||||
  wvenc.c                               Paul B Mahol
 | 
			
		||||
 | 
			
		||||
Protocols:
 | 
			
		||||
  bluray.c                              Petri Hintukainen
 | 
			
		||||
  ftp.c                                 Lukasz Marek
 | 
			
		||||
  http.c                                Ronald S. Bultje
 | 
			
		||||
  libssh.c                              Lukasz Marek
 | 
			
		||||
  mms*.c                                Ronald S. Bultje
 | 
			
		||||
  udp.c                                 Luca Abeni
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
libswresample
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
Generic parts:
 | 
			
		||||
  audioconvert.c                        Michael Niedermayer
 | 
			
		||||
  dither.c                              Michael Niedermayer
 | 
			
		||||
  rematrix*.c                           Michael Niedermayer
 | 
			
		||||
  swresample*.c                         Michael Niedermayer
 | 
			
		||||
 | 
			
		||||
Resamplers:
 | 
			
		||||
  resample*.c                           Michael Niedermayer
 | 
			
		||||
  soxr_resample.c                       Rob Sykes
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Operating systems / CPU architectures
 | 
			
		||||
=====================================
 | 
			
		||||
 | 
			
		||||
Alpha                                   Mans Rullgard, Falk Hueffner
 | 
			
		||||
ARM                                     Mans Rullgard
 | 
			
		||||
AVR32                                   Mans Rullgard
 | 
			
		||||
MIPS                                    Mans Rullgard, Nedeljko Babic
 | 
			
		||||
MIPS                                    Mans Rullgard
 | 
			
		||||
Mac OS X / PowerPC                      Romain Dolbeau, Guillaume Poirier
 | 
			
		||||
Amiga / PowerPC                         Colin Ward
 | 
			
		||||
Linux / PowerPC                         Luca Barbato
 | 
			
		||||
@@ -501,30 +400,24 @@ x86                                     Michael Niedermayer
 | 
			
		||||
Releases
 | 
			
		||||
========
 | 
			
		||||
 | 
			
		||||
2.1                                     Michael Niedermayer
 | 
			
		||||
2.0                                     Michael Niedermayer
 | 
			
		||||
0.11                                    Michael Niedermayer
 | 
			
		||||
0.10                                    Michael Niedermayer
 | 
			
		||||
 | 
			
		||||
If you want to maintain an older release, please contact us
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GnuPG Fingerprints of maintainers and contributors
 | 
			
		||||
==================================================
 | 
			
		||||
 | 
			
		||||
Alexander Strasser            1C96 78B7 83CB 8AA7 9AF5 D1EB A7D8 A57B A876 E58F
 | 
			
		||||
Anssi Hannula                 1A92 FF42 2DD9 8D2E 8AF7 65A9 4278 C520 513D F3CB
 | 
			
		||||
Anton Khirnov                 6D0C 6625 56F8 65D1 E5F5 814B B50A 1241 C067 07AB
 | 
			
		||||
Ash Hughes                    694D 43D2 D180 C7C7 6421 ABD3 A641 D0B7 623D 6029
 | 
			
		||||
Attila Kinali                 11F0 F9A6 A1D2 11F6 C745 D10C 6520 BCDD F2DF E765
 | 
			
		||||
Baptiste Coudurier            8D77 134D 20CC 9220 201F C5DB 0AC9 325C 5C1A BAAA
 | 
			
		||||
Ben Littler                   3EE3 3723 E560 3214 A8CD 4DEB 2CDB FCE7 768C 8D2C
 | 
			
		||||
Benoit Fouet                  B22A 4F4F 43EF 636B BB66 FCDC 0023 AE1E 2985 49C8
 | 
			
		||||
Bœsch Clément                 52D0 3A82 D445 F194 DB8B 2B16 87EE 2CB8 F4B8 FCF9
 | 
			
		||||
Daniel Verkamp                78A6 07ED 782C 653E C628 B8B9 F0EB 8DD8 2F0E 21C7
 | 
			
		||||
Diego Biurrun                 8227 1E31 B6D9 4994 7427 E220 9CAE D6CC 4757 FCC5
 | 
			
		||||
FFmpeg release signing key    FCF9 86EA 15E6 E293 A564 4F10 B432 2F04 D676 58D8
 | 
			
		||||
Gwenole Beauchesne            2E63 B3A6 3E44 37E2 017D 2704 53C7 6266 B153 99C4
 | 
			
		||||
Jaikrishnan Menon             61A1 F09F 01C9 2D45 78E1 C862 25DC 8831 AF70 D368
 | 
			
		||||
Jean Delvare                  7CA6 9F44 60F1 BDC4 1FD2 C858 A552 6B9B B3CD 4E6A
 | 
			
		||||
Justin Ruggles                3136 ECC0 C10D 6C04 5F43 CA29 FCBE CD2A 3787 1EBF
 | 
			
		||||
Loren Merritt                 ABD9 08F4 C920 3F65 D8BE 35D7 1540 DAA7 060F 56DE
 | 
			
		||||
Lou Logan                     7D68 DC73 CBEF EABB 671A B6CF 621C 2E28 82F8 DC3A
 | 
			
		||||
@@ -538,7 +431,5 @@ Reinhard Tartler              9300 5DC2 7E87 6C37 ED7B CA9A 9808 3544 9453 48A4
 | 
			
		||||
Reynaldo H. Verdejo Pinochet  6E27 CD34 170C C78E 4D4F 5F40 C18E 077F 3114 452A
 | 
			
		||||
Robert Swain                  EE7A 56EA 4A81 A7B5 2001 A521 67FA 362D A2FC 3E71
 | 
			
		||||
Sascha Sommer                 38A0 F88B 868E 9D3A 97D4 D6A0 E823 706F 1E07 0D3C
 | 
			
		||||
Stefano Sabatini              0D0B AD6B 5330 BBAD D3D6 6A0C 719C 2839 FC43 2D5F
 | 
			
		||||
Stephan Hilb                  4F38 0B3A 5F39 B99B F505 E562 8D5C 5554 4E17 8863
 | 
			
		||||
Tomas Härdin                  A79D 4E3D F38F 763F 91F5 8B33 A01E 8AE0 41BB 2551
 | 
			
		||||
Wei Gao                       4269 7741 857A 0E60 9EC5 08D2 4744 4EFA 62C1 87B9
 | 
			
		||||
Stefano Sabatini              9A43 10F8 D32C D33C 48E7 C52C 5DF2 8E4D B2EE 066B
 | 
			
		||||
Tomas Härdin                  D133 29CA 4EEC 9DB4 7076 F697 B04B 7403 3313 41FD
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										68
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								Makefile
									
									
									
									
									
								
							@@ -15,12 +15,10 @@ PROGS-$(CONFIG_FFPLAY)   += ffplay
 | 
			
		||||
PROGS-$(CONFIG_FFPROBE)  += ffprobe
 | 
			
		||||
PROGS-$(CONFIG_FFSERVER) += ffserver
 | 
			
		||||
 | 
			
		||||
PROGS      := $(PROGS-yes:%=%$(PROGSSUF)$(EXESUF))
 | 
			
		||||
PROGS      := $(PROGS-yes:%=%$(EXESUF))
 | 
			
		||||
INSTPROGS   = $(PROGS-yes:%=%$(PROGSSUF)$(EXESUF))
 | 
			
		||||
 | 
			
		||||
OBJS        = cmdutils.o $(EXEOBJS)
 | 
			
		||||
OBJS-ffmpeg = ffmpeg_opt.o ffmpeg_filter.o
 | 
			
		||||
TESTTOOLS   = audiogen videogen rotozoom tiny_psnr tiny_ssim base64
 | 
			
		||||
OBJS        = $(PROGS-yes:%=%.o) cmdutils.o
 | 
			
		||||
TESTTOOLS   = audiogen videogen rotozoom tiny_psnr base64
 | 
			
		||||
HOSTPROGS  := $(TESTTOOLS:%=tests/%) doc/print_options
 | 
			
		||||
TOOLS       = qt-faststart trasher
 | 
			
		||||
TOOLS-$(CONFIG_ZLIB) += cws2fws
 | 
			
		||||
@@ -28,6 +26,7 @@ TOOLS-$(CONFIG_ZLIB) += cws2fws
 | 
			
		||||
BASENAMES   = ffmpeg ffplay ffprobe ffserver
 | 
			
		||||
ALLPROGS    = $(BASENAMES:%=%$(PROGSSUF)$(EXESUF))
 | 
			
		||||
ALLPROGS_G  = $(BASENAMES:%=%$(PROGSSUF)_g$(EXESUF))
 | 
			
		||||
ALLMANPAGES = $(BASENAMES:%=%.1)
 | 
			
		||||
 | 
			
		||||
FFLIBS-$(CONFIG_AVDEVICE) += avdevice
 | 
			
		||||
FFLIBS-$(CONFIG_AVFILTER) += avfilter
 | 
			
		||||
@@ -41,9 +40,9 @@ FFLIBS-$(CONFIG_SWSCALE)  += swscale
 | 
			
		||||
FFLIBS := avutil
 | 
			
		||||
 | 
			
		||||
DATA_FILES := $(wildcard $(SRC_PATH)/presets/*.ffpreset) $(SRC_PATH)/doc/ffprobe.xsd
 | 
			
		||||
EXAMPLES_FILES := $(wildcard $(SRC_PATH)/doc/examples/*.c) $(SRC_PATH)/doc/examples/Makefile $(SRC_PATH)/doc/examples/README
 | 
			
		||||
EXAMPLES_FILES := $(wildcard $(SRC_PATH)/doc/examples/*.c) $(SRC_PATH)/doc/examples/Makefile
 | 
			
		||||
 | 
			
		||||
SKIPHEADERS = cmdutils_common_opts.h compat/w32pthreads.h
 | 
			
		||||
SKIPHEADERS = cmdutils_common_opts.h
 | 
			
		||||
 | 
			
		||||
include $(SRC_PATH)/common.mak
 | 
			
		||||
 | 
			
		||||
@@ -52,14 +51,14 @@ FF_DEP_LIBS  := $(DEP_LIBS)
 | 
			
		||||
 | 
			
		||||
all: $(PROGS)
 | 
			
		||||
 | 
			
		||||
$(PROGS): %$(EXESUF): %_g$(EXESUF)
 | 
			
		||||
	$(CP) $< $@
 | 
			
		||||
	$(STRIP) $@
 | 
			
		||||
$(PROGS): %$(EXESUF): %$(PROGSSUF)_g$(EXESUF)
 | 
			
		||||
	$(CP) $< $@$(PROGSSUF)
 | 
			
		||||
	$(STRIP) $@$(PROGSSUF)
 | 
			
		||||
 | 
			
		||||
$(TOOLS): %$(EXESUF): %.o $(EXEOBJS)
 | 
			
		||||
	$(LD) $(LDFLAGS) $(LD_O) $^ $(ELIBS)
 | 
			
		||||
$(TOOLS): %$(EXESUF): %.o
 | 
			
		||||
	$(LD) $(LDFLAGS) -o $@ $< $(ELIBS)
 | 
			
		||||
 | 
			
		||||
tools/cws2fws$(EXESUF): ELIBS = $(ZLIB)
 | 
			
		||||
tools/cws2fws$(EXESUF): ELIBS = -lz
 | 
			
		||||
 | 
			
		||||
config.h: .config
 | 
			
		||||
.config: $(wildcard $(FFLIBS:%=$(SRC_PATH)/lib%/all*.c))
 | 
			
		||||
@@ -68,12 +67,10 @@ config.h: .config
 | 
			
		||||
	@-tput sgr0 2>/dev/null
 | 
			
		||||
 | 
			
		||||
SUBDIR_VARS := CLEANFILES EXAMPLES FFLIBS HOSTPROGS TESTPROGS TOOLS      \
 | 
			
		||||
               HEADERS ARCH_HEADERS BUILT_HEADERS SKIPHEADERS            \
 | 
			
		||||
               ARMV5TE-OBJS ARMV6-OBJS VFP-OBJS NEON-OBJS                \
 | 
			
		||||
               ALTIVEC-OBJS VIS-OBJS                                     \
 | 
			
		||||
               MMX-OBJS YASM-OBJS                                        \
 | 
			
		||||
               MIPSFPU-OBJS MIPSDSPR2-OBJS MIPSDSPR1-OBJS MIPS32R2-OBJS  \
 | 
			
		||||
               OBJS HOSTOBJS TESTOBJS
 | 
			
		||||
               ARCH_HEADERS BUILT_HEADERS SKIPHEADERS                    \
 | 
			
		||||
               ALTIVEC-OBJS ARMV5TE-OBJS ARMV6-OBJS ARMVFP-OBJS MMI-OBJS \
 | 
			
		||||
               MMX-OBJS NEON-OBJS VIS-OBJS YASM-OBJS                     \
 | 
			
		||||
               OBJS TESTOBJS
 | 
			
		||||
 | 
			
		||||
define RESET
 | 
			
		||||
$(1) :=
 | 
			
		||||
@@ -90,19 +87,12 @@ endef
 | 
			
		||||
 | 
			
		||||
$(foreach D,$(FFLIBS),$(eval $(call DOSUBDIR,lib$(D))))
 | 
			
		||||
 | 
			
		||||
define DOPROG
 | 
			
		||||
OBJS-$(1) += $(1).o cmdutils.o $(EXEOBJS)
 | 
			
		||||
$(1)$(PROGSSUF)_g$(EXESUF): $$(OBJS-$(1))
 | 
			
		||||
$$(OBJS-$(1)): CFLAGS  += $(CFLAGS-$(1))
 | 
			
		||||
$(1)$(PROGSSUF)_g$(EXESUF): LDFLAGS += $(LDFLAGS-$(1))
 | 
			
		||||
$(1)$(PROGSSUF)_g$(EXESUF): FF_EXTRALIBS += $(LIBS-$(1))
 | 
			
		||||
-include $$(OBJS-$(1):.o=.d)
 | 
			
		||||
endef
 | 
			
		||||
ffplay.o: CFLAGS += $(SDL_CFLAGS)
 | 
			
		||||
ffplay_g$(EXESUF): FF_EXTRALIBS += $(SDL_LIBS)
 | 
			
		||||
ffserver_g$(EXESUF): LDFLAGS += $(FFSERVERLDFLAGS)
 | 
			
		||||
 | 
			
		||||
$(foreach P,$(PROGS-yes),$(eval $(call DOPROG,$(P))))
 | 
			
		||||
 | 
			
		||||
%$(PROGSSUF)_g$(EXESUF): %.o $(FF_DEP_LIBS)
 | 
			
		||||
	$(LD) $(LDFLAGS) $(LD_O) $(OBJS-$*) $(FF_EXTRALIBS)
 | 
			
		||||
%$(PROGSSUF)_g$(EXESUF): %.o cmdutils.o $(FF_DEP_LIBS)
 | 
			
		||||
	$(LD) $(LDFLAGS) -o $@ $< cmdutils.o $(FF_EXTRALIBS)
 | 
			
		||||
 | 
			
		||||
OBJDIRS += tools
 | 
			
		||||
 | 
			
		||||
@@ -152,18 +142,28 @@ uninstall-data:
 | 
			
		||||
clean::
 | 
			
		||||
	$(RM) $(ALLPROGS) $(ALLPROGS_G)
 | 
			
		||||
	$(RM) $(CLEANSUFFIXES)
 | 
			
		||||
	$(RM) $(TOOLS)
 | 
			
		||||
	$(RM) $(CLEANSUFFIXES:%=tools/%)
 | 
			
		||||
	$(RM) coverage.info
 | 
			
		||||
	$(RM) -r coverage-html
 | 
			
		||||
	$(RM) -rf coverage.info lcov
 | 
			
		||||
 | 
			
		||||
distclean::
 | 
			
		||||
	$(RM) $(DISTCLEANSUFFIXES)
 | 
			
		||||
	$(RM) config.* .config libavutil/avconfig.h .version version.h libavcodec/codec_names.h
 | 
			
		||||
	$(RM) config.* .version version.h libavutil/avconfig.h
 | 
			
		||||
 | 
			
		||||
config:
 | 
			
		||||
	$(SRC_PATH)/configure $(value FFMPEG_CONFIGURATION)
 | 
			
		||||
 | 
			
		||||
check: all alltools examples testprogs fate
 | 
			
		||||
# Without the sed genthml thinks "libavutil" and "./libavutil" are two different things
 | 
			
		||||
coverage.info: $(wildcard *.gcda *.gcno */*.gcda */*.gcno */*/*.gcda */*/*.gcno)
 | 
			
		||||
	$(Q)lcov -c -d . -b . | sed -e 's#/./#/#g' > $@
 | 
			
		||||
 | 
			
		||||
coverage-html: coverage.info
 | 
			
		||||
	$(Q)mkdir -p $@
 | 
			
		||||
	$(Q)genhtml -o $@ $<
 | 
			
		||||
	$(Q)touch $@
 | 
			
		||||
 | 
			
		||||
check: all alltools checkheaders examples testprogs fate
 | 
			
		||||
 | 
			
		||||
include $(SRC_PATH)/doc/Makefile
 | 
			
		||||
include $(SRC_PATH)/tests/Makefile
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								arch.mak
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								arch.mak
									
									
									
									
									
								
							@@ -1,12 +1,9 @@
 | 
			
		||||
OBJS-$(HAVE_ARMV5TE) += $(ARMV5TE-OBJS) $(ARMV5TE-OBJS-yes)
 | 
			
		||||
OBJS-$(HAVE_ARMV6)   += $(ARMV6-OBJS)   $(ARMV6-OBJS-yes)
 | 
			
		||||
OBJS-$(HAVE_VFP)     += $(VFP-OBJS)     $(VFP-OBJS-yes)
 | 
			
		||||
OBJS-$(HAVE_ARMVFP)  += $(ARMVFP-OBJS)  $(ARMVFP-OBJS-yes)
 | 
			
		||||
OBJS-$(HAVE_NEON)    += $(NEON-OBJS)    $(NEON-OBJS-yes)
 | 
			
		||||
 | 
			
		||||
OBJS-$(HAVE_MIPSFPU)   += $(MIPSFPU-OBJS)    $(MIPSFPU-OBJS-yes)
 | 
			
		||||
OBJS-$(HAVE_MIPS32R2)  += $(MIPS32R2-OBJS)   $(MIPS32R2-OBJS-yes)
 | 
			
		||||
OBJS-$(HAVE_MIPSDSPR1) += $(MIPSDSPR1-OBJS)  $(MIPSDSPR1-OBJS-yes)
 | 
			
		||||
OBJS-$(HAVE_MIPSDSPR2) += $(MIPSDSPR2-OBJS)  $(MIPSDSPR2-OBJS-yes)
 | 
			
		||||
OBJS-$(HAVE_MMI)     += $(MMI-OBJS)     $(MMI-OBJS-yes)
 | 
			
		||||
 | 
			
		||||
OBJS-$(HAVE_ALTIVEC) += $(ALTIVEC-OBJS) $(ALTIVEC-OBJS-yes)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1273
									
								
								cmdutils.c
									
									
									
									
									
								
							
							
						
						
									
										1273
									
								
								cmdutils.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										252
									
								
								cmdutils.h
									
									
									
									
									
								
							
							
						
						
									
										252
									
								
								cmdutils.h
									
									
									
									
									
								
							@@ -51,18 +51,8 @@ extern const int this_year;
 | 
			
		||||
extern AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB];
 | 
			
		||||
extern AVFormatContext *avformat_opts;
 | 
			
		||||
extern struct SwsContext *sws_opts;
 | 
			
		||||
extern AVDictionary *swr_opts;
 | 
			
		||||
extern AVDictionary *format_opts, *codec_opts, *resample_opts;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Register a program-specific cleanup routine.
 | 
			
		||||
 */
 | 
			
		||||
void register_exit(void (*cb)(int ret));
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Wraps exit with a program-specific cleanup routine.
 | 
			
		||||
 */
 | 
			
		||||
void exit_program(int ret);
 | 
			
		||||
extern struct SwrContext *swr_opts;
 | 
			
		||||
extern AVDictionary *format_opts, *codec_opts;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Initialize the cmdutils option system, in particular
 | 
			
		||||
@@ -81,34 +71,29 @@ void uninit_opts(void);
 | 
			
		||||
 */
 | 
			
		||||
void log_callback_help(void* ptr, int level, const char* fmt, va_list vl);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Override the cpuflags.
 | 
			
		||||
 */
 | 
			
		||||
int opt_cpuflags(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Fallback for options that are not explicitly handled, these will be
 | 
			
		||||
 * parsed through AVOptions.
 | 
			
		||||
 */
 | 
			
		||||
int opt_default(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
int opt_default(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Set the libav* libraries log level.
 | 
			
		||||
 */
 | 
			
		||||
int opt_loglevel(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
int opt_loglevel(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
int opt_report(const char *opt);
 | 
			
		||||
 | 
			
		||||
int opt_max_alloc(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
int opt_max_alloc(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
int opt_codec_debug(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
int opt_cpuflags(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
int opt_opencl(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
int opt_codec_debug(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Limit the execution time.
 | 
			
		||||
 */
 | 
			
		||||
int opt_timelimit(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
int opt_timelimit(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Parse a string and return its corresponding value as a double.
 | 
			
		||||
@@ -138,7 +123,7 @@ double parse_number_or_die(const char *context, const char *numstr, int type,
 | 
			
		||||
 * not zero timestr is interpreted as a duration, otherwise as a
 | 
			
		||||
 * date
 | 
			
		||||
 *
 | 
			
		||||
 * @see av_parse_time()
 | 
			
		||||
 * @see parse_date()
 | 
			
		||||
 */
 | 
			
		||||
int64_t parse_time_or_die(const char *context, const char *timestr,
 | 
			
		||||
                          int is_duration);
 | 
			
		||||
@@ -154,7 +139,7 @@ typedef struct SpecifierOpt {
 | 
			
		||||
    } u;
 | 
			
		||||
} SpecifierOpt;
 | 
			
		||||
 | 
			
		||||
typedef struct OptionDef {
 | 
			
		||||
typedef struct {
 | 
			
		||||
    const char *name;
 | 
			
		||||
    int flags;
 | 
			
		||||
#define HAS_ARG    0x0001
 | 
			
		||||
@@ -163,42 +148,32 @@ typedef struct OptionDef {
 | 
			
		||||
#define OPT_STRING 0x0008
 | 
			
		||||
#define OPT_VIDEO  0x0010
 | 
			
		||||
#define OPT_AUDIO  0x0020
 | 
			
		||||
#define OPT_GRAB   0x0040
 | 
			
		||||
#define OPT_INT    0x0080
 | 
			
		||||
#define OPT_FLOAT  0x0100
 | 
			
		||||
#define OPT_SUBTITLE 0x0200
 | 
			
		||||
#define OPT_INT64  0x0400
 | 
			
		||||
#define OPT_EXIT   0x0800
 | 
			
		||||
#define OPT_DATA   0x1000
 | 
			
		||||
#define OPT_PERFILE  0x2000     /* the option is per-file (currently ffmpeg-only).
 | 
			
		||||
                                   implied by OPT_OFFSET or OPT_SPEC */
 | 
			
		||||
#define OPT_FUNC2  0x2000
 | 
			
		||||
#define OPT_OFFSET 0x4000       /* option is specified as an offset in a passed optctx */
 | 
			
		||||
#define OPT_SPEC   0x8000       /* option is to be stored in an array of SpecifierOpt.
 | 
			
		||||
                                   Implies OPT_OFFSET. Next element after the offset is
 | 
			
		||||
                                   an int containing element count in the array. */
 | 
			
		||||
#define OPT_TIME  0x10000
 | 
			
		||||
#define OPT_DOUBLE 0x20000
 | 
			
		||||
#define OPT_INPUT  0x40000
 | 
			
		||||
#define OPT_OUTPUT 0x80000
 | 
			
		||||
     union {
 | 
			
		||||
        void *dst_ptr;
 | 
			
		||||
        int (*func_arg)(void *, const char *, const char *);
 | 
			
		||||
        int (*func_arg)(const char *, const char *);
 | 
			
		||||
        int (*func2_arg)(void *, const char *, const char *);
 | 
			
		||||
        size_t off;
 | 
			
		||||
    } u;
 | 
			
		||||
    const char *help;
 | 
			
		||||
    const char *argname;
 | 
			
		||||
} OptionDef;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print help for all options matching specified flags.
 | 
			
		||||
 *
 | 
			
		||||
 * @param options a list of options
 | 
			
		||||
 * @param msg title of this group. Only printed if at least one option matches.
 | 
			
		||||
 * @param req_flags print only options which have all those flags set.
 | 
			
		||||
 * @param rej_flags don't print options which have any of those flags set.
 | 
			
		||||
 * @param alt_flags print only options that have at least one of those flags set
 | 
			
		||||
 */
 | 
			
		||||
void show_help_options(const OptionDef *options, const char *msg, int req_flags,
 | 
			
		||||
                       int rej_flags, int alt_flags);
 | 
			
		||||
void show_help_options(const OptionDef *options, const char *msg, int mask,
 | 
			
		||||
                       int value);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Show help for all options with given flags in class and all its
 | 
			
		||||
@@ -206,23 +181,10 @@ void show_help_options(const OptionDef *options, const char *msg, int req_flags,
 | 
			
		||||
 */
 | 
			
		||||
void show_help_children(const AVClass *class, int flags);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Per-fftool specific help handler. Implemented in each
 | 
			
		||||
 * fftool, called by show_help().
 | 
			
		||||
 */
 | 
			
		||||
void show_help_default(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Generic -h handler common to all fftools.
 | 
			
		||||
 */
 | 
			
		||||
int show_help(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Parse the command line arguments.
 | 
			
		||||
 *
 | 
			
		||||
 * @param optctx an opaque options context
 | 
			
		||||
 * @param argc   number of command line arguments
 | 
			
		||||
 * @param argv   values of command line arguments
 | 
			
		||||
 * @param options Array with the definitions required to interpret every
 | 
			
		||||
 * option of the form: -option_name [argument]
 | 
			
		||||
 * @param parse_arg_function Name of the function called to process every
 | 
			
		||||
@@ -240,101 +202,6 @@ void parse_options(void *optctx, int argc, char **argv, const OptionDef *options
 | 
			
		||||
int parse_option(void *optctx, const char *opt, const char *arg,
 | 
			
		||||
                 const OptionDef *options);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An option extracted from the commandline.
 | 
			
		||||
 * Cannot use AVDictionary because of options like -map which can be
 | 
			
		||||
 * used multiple times.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct Option {
 | 
			
		||||
    const OptionDef  *opt;
 | 
			
		||||
    const char       *key;
 | 
			
		||||
    const char       *val;
 | 
			
		||||
} Option;
 | 
			
		||||
 | 
			
		||||
typedef struct OptionGroupDef {
 | 
			
		||||
    /**< group name */
 | 
			
		||||
    const char *name;
 | 
			
		||||
    /**
 | 
			
		||||
     * Option to be used as group separator. Can be NULL for groups which
 | 
			
		||||
     * are terminated by a non-option argument (e.g. ffmpeg output files)
 | 
			
		||||
     */
 | 
			
		||||
    const char *sep;
 | 
			
		||||
    /**
 | 
			
		||||
     * Option flags that must be set on each option that is
 | 
			
		||||
     * applied to this group
 | 
			
		||||
     */
 | 
			
		||||
    int flags;
 | 
			
		||||
} OptionGroupDef;
 | 
			
		||||
 | 
			
		||||
typedef struct OptionGroup {
 | 
			
		||||
    const OptionGroupDef *group_def;
 | 
			
		||||
    const char *arg;
 | 
			
		||||
 | 
			
		||||
    Option *opts;
 | 
			
		||||
    int  nb_opts;
 | 
			
		||||
 | 
			
		||||
    AVDictionary *codec_opts;
 | 
			
		||||
    AVDictionary *format_opts;
 | 
			
		||||
    AVDictionary *resample_opts;
 | 
			
		||||
    struct SwsContext *sws_opts;
 | 
			
		||||
    AVDictionary *swr_opts;
 | 
			
		||||
} OptionGroup;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A list of option groups that all have the same group type
 | 
			
		||||
 * (e.g. input files or output files)
 | 
			
		||||
 */
 | 
			
		||||
typedef struct OptionGroupList {
 | 
			
		||||
    const OptionGroupDef *group_def;
 | 
			
		||||
 | 
			
		||||
    OptionGroup *groups;
 | 
			
		||||
    int       nb_groups;
 | 
			
		||||
} OptionGroupList;
 | 
			
		||||
 | 
			
		||||
typedef struct OptionParseContext {
 | 
			
		||||
    OptionGroup global_opts;
 | 
			
		||||
 | 
			
		||||
    OptionGroupList *groups;
 | 
			
		||||
    int           nb_groups;
 | 
			
		||||
 | 
			
		||||
    /* parsing state */
 | 
			
		||||
    OptionGroup cur_group;
 | 
			
		||||
} OptionParseContext;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Parse an options group and write results into optctx.
 | 
			
		||||
 *
 | 
			
		||||
 * @param optctx an app-specific options context. NULL for global options group
 | 
			
		||||
 */
 | 
			
		||||
int parse_optgroup(void *optctx, OptionGroup *g);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Split the commandline into an intermediate form convenient for further
 | 
			
		||||
 * processing.
 | 
			
		||||
 *
 | 
			
		||||
 * The commandline is assumed to be composed of options which either belong to a
 | 
			
		||||
 * group (those with OPT_SPEC, OPT_OFFSET or OPT_PERFILE) or are global
 | 
			
		||||
 * (everything else).
 | 
			
		||||
 *
 | 
			
		||||
 * A group (defined by an OptionGroupDef struct) is a sequence of options
 | 
			
		||||
 * terminated by either a group separator option (e.g. -i) or a parameter that
 | 
			
		||||
 * is not an option (doesn't start with -). A group without a separator option
 | 
			
		||||
 * must always be first in the supplied groups list.
 | 
			
		||||
 *
 | 
			
		||||
 * All options within the same group are stored in one OptionGroup struct in an
 | 
			
		||||
 * OptionGroupList, all groups with the same group definition are stored in one
 | 
			
		||||
 * OptionGroupList in OptionParseContext.groups. The order of group lists is the
 | 
			
		||||
 * same as the order of group definitions.
 | 
			
		||||
 */
 | 
			
		||||
int split_commandline(OptionParseContext *octx, int argc, char *argv[],
 | 
			
		||||
                      const OptionDef *options,
 | 
			
		||||
                      const OptionGroupDef *groups, int nb_groups);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Free all allocated memory in an OptionParseContext.
 | 
			
		||||
 */
 | 
			
		||||
void uninit_parse_context(OptionParseContext *octx);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Find the '-loglevel' option in the command line args and apply it.
 | 
			
		||||
 */
 | 
			
		||||
@@ -363,16 +230,12 @@ int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec);
 | 
			
		||||
 * Create a new options dictionary containing only the options from
 | 
			
		||||
 * opts which apply to the codec with ID codec_id.
 | 
			
		||||
 *
 | 
			
		||||
 * @param opts     dictionary to place options in
 | 
			
		||||
 * @param codec_id ID of the codec that should be filtered for
 | 
			
		||||
 * @param s Corresponding format context.
 | 
			
		||||
 * @param st A stream from s for which the options should be filtered.
 | 
			
		||||
 * @param codec The particular codec for which the options should be filtered.
 | 
			
		||||
 *              If null, the default one is looked up according to the codec id.
 | 
			
		||||
 * @return a pointer to the created dictionary
 | 
			
		||||
 */
 | 
			
		||||
AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id,
 | 
			
		||||
                                AVFormatContext *s, AVStream *st, AVCodec *codec);
 | 
			
		||||
AVDictionary *filter_codec_opts(AVDictionary *opts, AVCodec *codec,
 | 
			
		||||
                                AVFormatContext *s, AVStream *st);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Setup AVCodecContext options for avformat_find_stream_info().
 | 
			
		||||
@@ -412,87 +275,62 @@ void show_banner(int argc, char **argv, const OptionDef *options);
 | 
			
		||||
 * libraries.
 | 
			
		||||
 * This option processing function does not utilize the arguments.
 | 
			
		||||
 */
 | 
			
		||||
int show_version(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
int opt_version(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print the license of the program to stdout. The license depends on
 | 
			
		||||
 * the license of the libraries compiled into the program.
 | 
			
		||||
 * This option processing function does not utilize the arguments.
 | 
			
		||||
 */
 | 
			
		||||
int show_license(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
int opt_license(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing all the formats supported by the
 | 
			
		||||
 * program.
 | 
			
		||||
 * This option processing function does not utilize the arguments.
 | 
			
		||||
 */
 | 
			
		||||
int show_formats(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
int opt_formats(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing all the codecs supported by the
 | 
			
		||||
 * program.
 | 
			
		||||
 * This option processing function does not utilize the arguments.
 | 
			
		||||
 */
 | 
			
		||||
int show_codecs(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing all the decoders supported by the
 | 
			
		||||
 * program.
 | 
			
		||||
 */
 | 
			
		||||
int show_decoders(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing all the encoders supported by the
 | 
			
		||||
 * program.
 | 
			
		||||
 */
 | 
			
		||||
int show_encoders(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
int opt_codecs(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing all the filters supported by the
 | 
			
		||||
 * program.
 | 
			
		||||
 * This option processing function does not utilize the arguments.
 | 
			
		||||
 */
 | 
			
		||||
int show_filters(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
int opt_filters(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing all the bit stream filters supported by the
 | 
			
		||||
 * program.
 | 
			
		||||
 * This option processing function does not utilize the arguments.
 | 
			
		||||
 */
 | 
			
		||||
int show_bsfs(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
int opt_bsfs(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing all the protocols supported by the
 | 
			
		||||
 * program.
 | 
			
		||||
 * This option processing function does not utilize the arguments.
 | 
			
		||||
 */
 | 
			
		||||
int show_protocols(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
int opt_protocols(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing all the pixel formats supported by the
 | 
			
		||||
 * program.
 | 
			
		||||
 * This option processing function does not utilize the arguments.
 | 
			
		||||
 */
 | 
			
		||||
int show_pix_fmts(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing all the standard channel layouts supported by
 | 
			
		||||
 * the program.
 | 
			
		||||
 * This option processing function does not utilize the arguments.
 | 
			
		||||
 */
 | 
			
		||||
int show_layouts(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
int opt_pix_fmts(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing all the sample formats supported by the
 | 
			
		||||
 * program.
 | 
			
		||||
 */
 | 
			
		||||
int show_sample_fmts(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing all the color names and values recognized
 | 
			
		||||
 * by the program.
 | 
			
		||||
 */
 | 
			
		||||
void show_colors(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
int show_sample_fmts(const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Return a positive value if a line read from standard input
 | 
			
		||||
@@ -504,10 +342,9 @@ int read_yesno(void);
 | 
			
		||||
 * Read the file with name filename, and put its content in a newly
 | 
			
		||||
 * allocated 0-terminated buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * @param filename file to read from
 | 
			
		||||
 * @param bufptr location where pointer to buffer is returned
 | 
			
		||||
 * @param size   location where size of buffer is returned
 | 
			
		||||
 * @return >= 0 in case of success, a negative value corresponding to an
 | 
			
		||||
 * @return 0 in case of success, a negative value corresponding to an
 | 
			
		||||
 * AVERROR error code in case of failure.
 | 
			
		||||
 */
 | 
			
		||||
int cmdutils_read_file(const char *filename, char **bufptr, size_t *size);
 | 
			
		||||
@@ -533,39 +370,20 @@ int cmdutils_read_file(const char *filename, char **bufptr, size_t *size);
 | 
			
		||||
FILE *get_preset_file(char *filename, size_t filename_size,
 | 
			
		||||
                      const char *preset_name, int is_path, const char *codec_name);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Do all the necessary cleanup and abort.
 | 
			
		||||
 * This function is implemented in the avtools, not cmdutils.
 | 
			
		||||
 */
 | 
			
		||||
void exit_program(int ret);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Realloc array to hold new_size elements of elem_size.
 | 
			
		||||
 * Calls exit() on failure.
 | 
			
		||||
 * Calls exit_program() on failure.
 | 
			
		||||
 *
 | 
			
		||||
 * @param array array to reallocate
 | 
			
		||||
 * @param elem_size size in bytes of each element
 | 
			
		||||
 * @param size new element count will be written here
 | 
			
		||||
 * @param new_size number of elements to place in reallocated array
 | 
			
		||||
 * @return reallocated array
 | 
			
		||||
 */
 | 
			
		||||
void *grow_array(void *array, int elem_size, int *size, int new_size);
 | 
			
		||||
 | 
			
		||||
#define media_type_string av_get_media_type_string
 | 
			
		||||
 | 
			
		||||
#define GROW_ARRAY(array, nb_elems)\
 | 
			
		||||
    array = grow_array(array, sizeof(*array), &nb_elems, nb_elems + 1)
 | 
			
		||||
 | 
			
		||||
#define GET_PIX_FMT_NAME(pix_fmt)\
 | 
			
		||||
    const char *name = av_get_pix_fmt_name(pix_fmt);
 | 
			
		||||
 | 
			
		||||
#define GET_SAMPLE_FMT_NAME(sample_fmt)\
 | 
			
		||||
    const char *name = av_get_sample_fmt_name(sample_fmt)
 | 
			
		||||
 | 
			
		||||
#define GET_SAMPLE_RATE_NAME(rate)\
 | 
			
		||||
    char name[16];\
 | 
			
		||||
    snprintf(name, sizeof(name), "%d", rate);
 | 
			
		||||
 | 
			
		||||
#define GET_CH_LAYOUT_NAME(ch_layout)\
 | 
			
		||||
    char name[16];\
 | 
			
		||||
    snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout);
 | 
			
		||||
 | 
			
		||||
#define GET_CH_LAYOUT_DESC(ch_layout)\
 | 
			
		||||
    char name[128];\
 | 
			
		||||
    av_get_channel_layout_string(name, sizeof(name), 0, ch_layout);
 | 
			
		||||
 | 
			
		||||
#endif /* CMDUTILS_H */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,25 +1,20 @@
 | 
			
		||||
    { "L"          , OPT_EXIT, {.func_arg = show_license},      "show license" },
 | 
			
		||||
    { "h"          , OPT_EXIT, {.func_arg = show_help},         "show help", "topic" },
 | 
			
		||||
    { "?"          , OPT_EXIT, {.func_arg = show_help},         "show help", "topic" },
 | 
			
		||||
    { "help"       , OPT_EXIT, {.func_arg = show_help},         "show help", "topic" },
 | 
			
		||||
    { "-help"      , OPT_EXIT, {.func_arg = show_help},         "show help", "topic" },
 | 
			
		||||
    { "version"    , OPT_EXIT, {.func_arg = show_version},      "show version" },
 | 
			
		||||
    { "formats"    , OPT_EXIT, {.func_arg = show_formats  },    "show available formats" },
 | 
			
		||||
    { "codecs"     , OPT_EXIT, {.func_arg = show_codecs   },    "show available codecs" },
 | 
			
		||||
    { "decoders"   , OPT_EXIT, {.func_arg = show_decoders },    "show available decoders" },
 | 
			
		||||
    { "encoders"   , OPT_EXIT, {.func_arg = show_encoders },    "show available encoders" },
 | 
			
		||||
    { "bsfs"       , OPT_EXIT, {.func_arg = show_bsfs     },    "show available bit stream filters" },
 | 
			
		||||
    { "protocols"  , OPT_EXIT, {.func_arg = show_protocols},    "show available protocols" },
 | 
			
		||||
    { "filters"    , OPT_EXIT, {.func_arg = show_filters  },    "show available filters" },
 | 
			
		||||
    { "pix_fmts"   , OPT_EXIT, {.func_arg = show_pix_fmts },    "show available pixel formats" },
 | 
			
		||||
    { "layouts"    , OPT_EXIT, {.func_arg = show_layouts  },    "show standard channel layouts" },
 | 
			
		||||
    { "L", OPT_EXIT, {(void*)opt_license}, "show license" },
 | 
			
		||||
    { "h", OPT_EXIT, {(void*)opt_help}, "show help" },
 | 
			
		||||
    { "?", OPT_EXIT, {(void*)opt_help}, "show help" },
 | 
			
		||||
    { "help", OPT_EXIT, {(void*)opt_help}, "show help" },
 | 
			
		||||
    { "-help", OPT_EXIT, {(void*)opt_help}, "show help" },
 | 
			
		||||
    { "version", OPT_EXIT, {(void*)opt_version}, "show version" },
 | 
			
		||||
    { "formats"  , OPT_EXIT, {(void*)opt_formats  }, "show available formats" },
 | 
			
		||||
    { "codecs"   , OPT_EXIT, {(void*)opt_codecs   }, "show available codecs" },
 | 
			
		||||
    { "bsfs"     , OPT_EXIT, {(void*)opt_bsfs     }, "show available bit stream filters" },
 | 
			
		||||
    { "protocols", OPT_EXIT, {(void*)opt_protocols}, "show available protocols" },
 | 
			
		||||
    { "filters",   OPT_EXIT, {(void*)opt_filters  }, "show available filters" },
 | 
			
		||||
    { "pix_fmts" , OPT_EXIT, {(void*)opt_pix_fmts }, "show available pixel formats" },
 | 
			
		||||
    { "sample_fmts", OPT_EXIT, {.func_arg = show_sample_fmts }, "show available audio sample formats" },
 | 
			
		||||
    { "colors"     , OPT_EXIT, {.func_arg = show_colors },      "show available color names" },
 | 
			
		||||
    { "loglevel"   , HAS_ARG,  {.func_arg = opt_loglevel},      "set logging level", "loglevel" },
 | 
			
		||||
    { "v",           HAS_ARG,  {.func_arg = opt_loglevel},      "set logging level", "loglevel" },
 | 
			
		||||
    { "report"     , 0,        {(void*)opt_report}, "generate a report" },
 | 
			
		||||
    { "max_alloc"  , HAS_ARG,  {.func_arg = opt_max_alloc},     "set maximum size of a single allocated block", "bytes" },
 | 
			
		||||
    { "cpuflags"   , HAS_ARG | OPT_EXPERT, { .func_arg = opt_cpuflags }, "force specific cpu flags", "flags" },
 | 
			
		||||
#if CONFIG_OPENCL
 | 
			
		||||
    { "opencl_options", HAS_ARG, {.func_arg = opt_opencl},      "set OpenCL environment options" },
 | 
			
		||||
#endif
 | 
			
		||||
    { "loglevel", HAS_ARG, {(void*)opt_loglevel}, "set libav* logging level", "loglevel" },
 | 
			
		||||
    { "v", HAS_ARG, {(void*)opt_loglevel}, "set libav* logging level", "loglevel" },
 | 
			
		||||
    { "debug", HAS_ARG, {(void*)opt_codec_debug}, "set debug flags", "flags" },
 | 
			
		||||
    { "fdebug", HAS_ARG, {(void*)opt_codec_debug}, "set debug flags", "flags" },
 | 
			
		||||
    { "report", 0, {(void*)opt_report}, "generate a report" },
 | 
			
		||||
    { "max_alloc", HAS_ARG, {(void*)opt_max_alloc}, "set maximum size of a single allocated block", "bytes" },
 | 
			
		||||
    { "cpuflags", HAS_ARG | OPT_EXPERT, {(void*)opt_cpuflags}, "force specific cpu flags", "flags" },
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										60
									
								
								common.mak
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								common.mak
									
									
									
									
									
								
							@@ -10,9 +10,8 @@ ifndef SUBDIR
 | 
			
		||||
ifndef V
 | 
			
		||||
Q      = @
 | 
			
		||||
ECHO   = printf "$(1)\t%s\n" $(2)
 | 
			
		||||
BRIEF  = CC CXX HOSTCC HOSTLD AS YASM AR LD STRIP CP
 | 
			
		||||
SILENT = DEPCC DEPHOSTCC DEPAS DEPYASM RANLIB RM
 | 
			
		||||
 | 
			
		||||
BRIEF  = CC CXX AS YASM AR LD HOSTCC STRIP CP
 | 
			
		||||
SILENT = DEPCC YASMDEP RM RANLIB
 | 
			
		||||
MSG    = $@
 | 
			
		||||
M      = @$(call ECHO,$(TAG),$@);
 | 
			
		||||
$(foreach VAR,$(BRIEF), \
 | 
			
		||||
@@ -27,17 +26,15 @@ ALLFFLIBS = avcodec avdevice avfilter avformat avresample avutil postproc swscal
 | 
			
		||||
IFLAGS     := -I. -I$(SRC_PATH)/
 | 
			
		||||
CPPFLAGS   := $(IFLAGS) $(CPPFLAGS)
 | 
			
		||||
CFLAGS     += $(ECFLAGS)
 | 
			
		||||
CCFLAGS     = $(CPPFLAGS) $(CFLAGS)
 | 
			
		||||
ASFLAGS    := $(CPPFLAGS) $(ASFLAGS)
 | 
			
		||||
CXXFLAGS   += $(CPPFLAGS) $(CFLAGS)
 | 
			
		||||
YASMFLAGS  += $(IFLAGS:%=%/) -Pconfig.asm
 | 
			
		||||
 | 
			
		||||
HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS)
 | 
			
		||||
LDFLAGS    := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS)
 | 
			
		||||
CCFLAGS     = $(CFLAGS)
 | 
			
		||||
CXXFLAGS   := $(CFLAGS) $(CXXFLAGS)
 | 
			
		||||
YASMFLAGS  += $(IFLAGS) -I$(SRC_PATH)/libavutil/x86/ -Pconfig.asm
 | 
			
		||||
HOSTCFLAGS += $(IFLAGS)
 | 
			
		||||
LDFLAGS    := $(ALLFFLIBS:%=-Llib%) $(LDFLAGS)
 | 
			
		||||
 | 
			
		||||
define COMPILE
 | 
			
		||||
       $(call $(1)DEP,$(1))
 | 
			
		||||
       $($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $<
 | 
			
		||||
       $($(1)DEP)
 | 
			
		||||
       $($(1)) $(CPPFLAGS) $($(1)FLAGS) $($(1)_DEPFLAGS) -c $($(1)_O) $<
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
COMPILE_C = $(call COMPILE,CC)
 | 
			
		||||
@@ -56,11 +53,8 @@ COMPILE_S = $(call COMPILE,AS)
 | 
			
		||||
%.o: %.S
 | 
			
		||||
	$(COMPILE_S)
 | 
			
		||||
 | 
			
		||||
%.i: %.c
 | 
			
		||||
	$(CC) $(CCFLAGS) $(CC_E) $<
 | 
			
		||||
 | 
			
		||||
%.h.c:
 | 
			
		||||
	$(Q)echo '#include "$*.h"' >$@
 | 
			
		||||
%.ho: %.h
 | 
			
		||||
	$(CC) $(CPPFLAGS) $(CFLAGS) -Wno-unused -c -o $@ -x c $<
 | 
			
		||||
 | 
			
		||||
%.ver: %.v
 | 
			
		||||
	$(Q)sed 's/$$MAJOR/$($(basename $(@F))_VERSION_MAJOR)/' $^ > $@
 | 
			
		||||
@@ -85,8 +79,7 @@ OBJS      += $(OBJS-yes)
 | 
			
		||||
FFLIBS    := $(FFLIBS-yes) $(FFLIBS)
 | 
			
		||||
TESTPROGS += $(TESTPROGS-yes)
 | 
			
		||||
 | 
			
		||||
LDLIBS       = $(FFLIBS:%=%$(BUILDSUF))
 | 
			
		||||
FFEXTRALIBS := $(LDLIBS:%=$(LD_LIB)) $(EXTRALIBS)
 | 
			
		||||
FFEXTRALIBS := $(FFLIBS:%=-l%$(BUILDSUF)) $(EXTRALIBS)
 | 
			
		||||
 | 
			
		||||
EXAMPLES  := $(EXAMPLES:%=$(SUBDIR)%-example$(EXESUF))
 | 
			
		||||
OBJS      := $(sort $(OBJS:%=$(SUBDIR)%))
 | 
			
		||||
@@ -97,46 +90,31 @@ HOSTPROGS := $(HOSTPROGS:%=$(SUBDIR)%$(HOSTEXESUF))
 | 
			
		||||
TOOLS     += $(TOOLS-yes)
 | 
			
		||||
TOOLOBJS  := $(TOOLS:%=tools/%.o)
 | 
			
		||||
TOOLS     := $(TOOLS:%=tools/%$(EXESUF))
 | 
			
		||||
HEADERS   += $(HEADERS-yes)
 | 
			
		||||
 | 
			
		||||
PATH_LIBNAME = $(foreach NAME,$(1),lib$(NAME)/$($(CONFIG_SHARED:yes=S)LIBNAME))
 | 
			
		||||
DEP_LIBS := $(foreach lib,$(FFLIBS),$(call PATH_LIBNAME,$(lib)))
 | 
			
		||||
DEP_LIBS := $(foreach NAME,$(FFLIBS),lib$(NAME)/$($(CONFIG_SHARED:yes=S)LIBNAME))
 | 
			
		||||
 | 
			
		||||
SRC_DIR    := $(SRC_PATH)/lib$(NAME)
 | 
			
		||||
ALLHEADERS := $(subst $(SRC_DIR)/,$(SUBDIR),$(wildcard $(SRC_DIR)/*.h $(SRC_DIR)/$(ARCH)/*.h))
 | 
			
		||||
SKIPHEADERS += $(ARCH_HEADERS:%=$(ARCH)/%) $(SKIPHEADERS-)
 | 
			
		||||
SKIPHEADERS := $(SKIPHEADERS:%=$(SUBDIR)%)
 | 
			
		||||
HOBJS        = $(filter-out $(SKIPHEADERS:.h=.h.o),$(ALLHEADERS:.h=.h.o))
 | 
			
		||||
checkheaders: $(HOBJS)
 | 
			
		||||
.SECONDARY:   $(HOBJS:.o=.c)
 | 
			
		||||
checkheaders: $(filter-out $(SKIPHEADERS:.h=.ho),$(ALLHEADERS:.h=.ho))
 | 
			
		||||
 | 
			
		||||
alltools: $(TOOLS)
 | 
			
		||||
 | 
			
		||||
$(HOSTOBJS): %.o: %.c
 | 
			
		||||
	$(call COMPILE,HOSTCC)
 | 
			
		||||
	$(HOSTCC) $(HOSTCFLAGS) -c -o $@ $<
 | 
			
		||||
 | 
			
		||||
$(HOSTPROGS): %$(HOSTEXESUF): %.o
 | 
			
		||||
	$(HOSTLD) $(HOSTLDFLAGS) $(HOSTLD_O) $< $(HOSTLIBS)
 | 
			
		||||
	$(HOSTCC) $(HOSTLDFLAGS) -o $@ $< $(HOSTLIBS)
 | 
			
		||||
 | 
			
		||||
$(OBJS):     | $(sort $(dir $(OBJS)))
 | 
			
		||||
$(HOBJS):    | $(sort $(dir $(HOBJS)))
 | 
			
		||||
$(HOSTOBJS): | $(sort $(dir $(HOSTOBJS)))
 | 
			
		||||
$(TESTOBJS): | $(sort $(dir $(TESTOBJS)))
 | 
			
		||||
$(TOOLOBJS): | tools
 | 
			
		||||
 | 
			
		||||
OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(TESTOBJS))
 | 
			
		||||
OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOSTOBJS) $(TESTOBJS))
 | 
			
		||||
 | 
			
		||||
CLEANSUFFIXES     = *.d *.o *~ *.h.c *.map *.ver *.ho *.gcno *.gcda
 | 
			
		||||
CLEANSUFFIXES     = *.d *.o *~ *.ho *.map *.ver *.gcno *.gcda
 | 
			
		||||
DISTCLEANSUFFIXES = *.pc
 | 
			
		||||
LIBSUFFIXES       = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a
 | 
			
		||||
 | 
			
		||||
define RULES
 | 
			
		||||
clean::
 | 
			
		||||
	$(RM) $(OBJS) $(OBJS:.o=.d)
 | 
			
		||||
	$(RM) $(HOSTPROGS)
 | 
			
		||||
	$(RM) $(TOOLS)
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
$(eval $(RULES))
 | 
			
		||||
 | 
			
		||||
-include $(wildcard $(OBJS:.o=.d) $(HOSTOBJS:.o=.d) $(TESTOBJS:.o=.d) $(HOBJS:.o=.d))
 | 
			
		||||
-include $(wildcard $(OBJS:.o=.d) $(TESTOBJS:.o=.d))
 | 
			
		||||
 
 | 
			
		||||
@@ -1,879 +0,0 @@
 | 
			
		||||
// Avisynth C Interface Version 0.20
 | 
			
		||||
// Copyright 2003 Kevin Atkinson
 | 
			
		||||
 | 
			
		||||
// This program is free software; you can redistribute it and/or modify
 | 
			
		||||
// it under the terms of the GNU General Public License as published by
 | 
			
		||||
// the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
// (at your option) any later version.
 | 
			
		||||
//
 | 
			
		||||
// This program 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 General Public License for more details.
 | 
			
		||||
//
 | 
			
		||||
// You should have received a copy of the GNU General Public License
 | 
			
		||||
// along with this program; if not, write to the Free Software
 | 
			
		||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit
 | 
			
		||||
// http://www.gnu.org/copyleft/gpl.html .
 | 
			
		||||
//
 | 
			
		||||
// As a special exception, I give you permission to link to the
 | 
			
		||||
// Avisynth C interface with independent modules that communicate with
 | 
			
		||||
// the Avisynth C interface solely through the interfaces defined in
 | 
			
		||||
// avisynth_c.h, regardless of the license terms of these independent
 | 
			
		||||
// modules, and to copy and distribute the resulting combined work
 | 
			
		||||
// under terms of your choice, provided that every copy of the
 | 
			
		||||
// combined work is accompanied by a complete copy of the source code
 | 
			
		||||
// of the Avisynth C interface and Avisynth itself (with the version
 | 
			
		||||
// used to produce the combined work), being distributed under the
 | 
			
		||||
// terms of the GNU General Public License plus this exception.  An
 | 
			
		||||
// independent module is a module which is not derived from or based
 | 
			
		||||
// on Avisynth C Interface, such as 3rd-party filters, import and
 | 
			
		||||
// export plugins, or graphical user interfaces.
 | 
			
		||||
 | 
			
		||||
// NOTE: this is a partial update of the Avisynth C interface to recognize
 | 
			
		||||
// new color spaces added in Avisynth 2.60. By no means is this document
 | 
			
		||||
// completely Avisynth 2.60 compliant.
 | 
			
		||||
 | 
			
		||||
#ifndef __AVISYNTH_C__
 | 
			
		||||
#define __AVISYNTH_C__
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
#  define EXTERN_C extern "C"
 | 
			
		||||
#else
 | 
			
		||||
#  define EXTERN_C
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AVSC_USE_STDCALL 1
 | 
			
		||||
 | 
			
		||||
#ifndef AVSC_USE_STDCALL
 | 
			
		||||
#  define AVSC_CC __cdecl
 | 
			
		||||
#else
 | 
			
		||||
#  define AVSC_CC __stdcall
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AVSC_INLINE static __inline
 | 
			
		||||
 | 
			
		||||
#ifdef AVISYNTH_C_EXPORTS
 | 
			
		||||
#  define AVSC_EXPORT EXTERN_C
 | 
			
		||||
#  define AVSC_API(ret, name) EXTERN_C __declspec(dllexport) ret AVSC_CC name
 | 
			
		||||
#else
 | 
			
		||||
#  define AVSC_EXPORT EXTERN_C __declspec(dllexport)
 | 
			
		||||
#  ifndef AVSC_NO_DECLSPEC
 | 
			
		||||
#    define AVSC_API(ret, name) EXTERN_C __declspec(dllimport) ret AVSC_CC name
 | 
			
		||||
#  else
 | 
			
		||||
#    define AVSC_API(ret, name) typedef ret (AVSC_CC *name##_func)
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
typedef unsigned char BYTE;
 | 
			
		||||
#ifdef __GNUC__
 | 
			
		||||
typedef long long int INT64;
 | 
			
		||||
#else
 | 
			
		||||
typedef __int64 INT64;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Constants
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#ifndef __AVISYNTH_H__
 | 
			
		||||
enum { AVISYNTH_INTERFACE_VERSION = 4 };
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
enum {AVS_SAMPLE_INT8  = 1<<0,
 | 
			
		||||
      AVS_SAMPLE_INT16 = 1<<1,
 | 
			
		||||
      AVS_SAMPLE_INT24 = 1<<2,
 | 
			
		||||
      AVS_SAMPLE_INT32 = 1<<3,
 | 
			
		||||
      AVS_SAMPLE_FLOAT = 1<<4};
 | 
			
		||||
 | 
			
		||||
enum {AVS_PLANAR_Y=1<<0,
 | 
			
		||||
      AVS_PLANAR_U=1<<1,
 | 
			
		||||
      AVS_PLANAR_V=1<<2,
 | 
			
		||||
      AVS_PLANAR_ALIGNED=1<<3,
 | 
			
		||||
      AVS_PLANAR_Y_ALIGNED=AVS_PLANAR_Y|AVS_PLANAR_ALIGNED,
 | 
			
		||||
      AVS_PLANAR_U_ALIGNED=AVS_PLANAR_U|AVS_PLANAR_ALIGNED,
 | 
			
		||||
      AVS_PLANAR_V_ALIGNED=AVS_PLANAR_V|AVS_PLANAR_ALIGNED,
 | 
			
		||||
      AVS_PLANAR_A=1<<4,
 | 
			
		||||
      AVS_PLANAR_R=1<<5,
 | 
			
		||||
      AVS_PLANAR_G=1<<6,
 | 
			
		||||
      AVS_PLANAR_B=1<<7,
 | 
			
		||||
      AVS_PLANAR_A_ALIGNED=AVS_PLANAR_A|AVS_PLANAR_ALIGNED,
 | 
			
		||||
      AVS_PLANAR_R_ALIGNED=AVS_PLANAR_R|AVS_PLANAR_ALIGNED,
 | 
			
		||||
      AVS_PLANAR_G_ALIGNED=AVS_PLANAR_G|AVS_PLANAR_ALIGNED,
 | 
			
		||||
      AVS_PLANAR_B_ALIGNED=AVS_PLANAR_B|AVS_PLANAR_ALIGNED};
 | 
			
		||||
 | 
			
		||||
  // Colorspace properties.
 | 
			
		||||
enum {AVS_CS_BGR = 1<<28,
 | 
			
		||||
      AVS_CS_YUV = 1<<29,
 | 
			
		||||
      AVS_CS_INTERLEAVED = 1<<30,
 | 
			
		||||
      AVS_CS_PLANAR = 1<<31,
 | 
			
		||||
 | 
			
		||||
      AVS_CS_SHIFT_SUB_WIDTH   = 0,
 | 
			
		||||
      AVS_CS_SHIFT_SUB_HEIGHT  = 1 << 3,
 | 
			
		||||
      AVS_CS_SHIFT_SAMPLE_BITS = 1 << 4,
 | 
			
		||||
 | 
			
		||||
      AVS_CS_SUB_WIDTH_MASK    = 7 << AVS_CS_SHIFT_SUB_WIDTH,
 | 
			
		||||
      AVS_CS_SUB_WIDTH_1       = 3 << AVS_CS_SHIFT_SUB_WIDTH, // YV24
 | 
			
		||||
      AVS_CS_SUB_WIDTH_2       = 0 << AVS_CS_SHIFT_SUB_WIDTH, // YV12, I420, YV16
 | 
			
		||||
      AVS_CS_SUB_WIDTH_4       = 1 << AVS_CS_SHIFT_SUB_WIDTH, // YUV9, YV411
 | 
			
		||||
 | 
			
		||||
      AVS_CS_VPLANEFIRST       = 1 << 3, // YV12, YV16, YV24, YV411, YUV9
 | 
			
		||||
      AVS_CS_UPLANEFIRST       = 1 << 4, // I420
 | 
			
		||||
 | 
			
		||||
      AVS_CS_SUB_HEIGHT_MASK   = 7 << AVS_CS_SHIFT_SUB_HEIGHT,
 | 
			
		||||
      AVS_CS_SUB_HEIGHT_1      = 3 << AVS_CS_SHIFT_SUB_HEIGHT, // YV16, YV24, YV411
 | 
			
		||||
      AVS_CS_SUB_HEIGHT_2      = 0 << AVS_CS_SHIFT_SUB_HEIGHT, // YV12, I420
 | 
			
		||||
      AVS_CS_SUB_HEIGHT_4      = 1 << AVS_CS_SHIFT_SUB_HEIGHT, // YUV9
 | 
			
		||||
 | 
			
		||||
      AVS_CS_SAMPLE_BITS_MASK  = 7 << AVS_CS_SHIFT_SAMPLE_BITS,
 | 
			
		||||
      AVS_CS_SAMPLE_BITS_8     = 0 << AVS_CS_SHIFT_SAMPLE_BITS,
 | 
			
		||||
      AVS_CS_SAMPLE_BITS_16    = 1 << AVS_CS_SHIFT_SAMPLE_BITS,
 | 
			
		||||
      AVS_CS_SAMPLE_BITS_32    = 2 << AVS_CS_SHIFT_SAMPLE_BITS,
 | 
			
		||||
 | 
			
		||||
      AVS_CS_PLANAR_MASK       = AVS_CS_PLANAR | AVS_CS_INTERLEAVED | AVS_CS_YUV | AVS_CS_BGR | AVS_CS_SAMPLE_BITS_MASK | AVS_CS_SUB_HEIGHT_MASK | AVS_CS_SUB_WIDTH_MASK,
 | 
			
		||||
      AVS_CS_PLANAR_FILTER     = ~( AVS_CS_VPLANEFIRST | AVS_CS_UPLANEFIRST )};
 | 
			
		||||
 | 
			
		||||
  // Specific colorformats
 | 
			
		||||
enum {
 | 
			
		||||
  AVS_CS_UNKNOWN = 0,
 | 
			
		||||
  AVS_CS_BGR24 = 1<<0 | AVS_CS_BGR | AVS_CS_INTERLEAVED,
 | 
			
		||||
  AVS_CS_BGR32 = 1<<1 | AVS_CS_BGR | AVS_CS_INTERLEAVED,
 | 
			
		||||
  AVS_CS_YUY2 = 1<<2 | AVS_CS_YUV | AVS_CS_INTERLEAVED,
 | 
			
		||||
  //  AVS_CS_YV12  = 1<<3  Reserved
 | 
			
		||||
  //  AVS_CS_I420  = 1<<4  Reserved
 | 
			
		||||
  AVS_CS_RAW32 = 1<<5 | AVS_CS_INTERLEAVED,
 | 
			
		||||
 | 
			
		||||
  AVS_CS_YV24  = AVS_CS_PLANAR | AVS_CS_YUV | AVS_CS_SAMPLE_BITS_8 | AVS_CS_VPLANEFIRST | AVS_CS_SUB_HEIGHT_1 | AVS_CS_SUB_WIDTH_1,  // YVU 4:4:4 planar
 | 
			
		||||
  AVS_CS_YV16  = AVS_CS_PLANAR | AVS_CS_YUV | AVS_CS_SAMPLE_BITS_8 | AVS_CS_VPLANEFIRST | AVS_CS_SUB_HEIGHT_1 | AVS_CS_SUB_WIDTH_2,  // YVU 4:2:2 planar
 | 
			
		||||
  AVS_CS_YV12  = AVS_CS_PLANAR | AVS_CS_YUV | AVS_CS_SAMPLE_BITS_8 | AVS_CS_VPLANEFIRST | AVS_CS_SUB_HEIGHT_2 | AVS_CS_SUB_WIDTH_2,  // YVU 4:2:0 planar
 | 
			
		||||
  AVS_CS_I420  = AVS_CS_PLANAR | AVS_CS_YUV | AVS_CS_SAMPLE_BITS_8 | AVS_CS_UPLANEFIRST | AVS_CS_SUB_HEIGHT_2 | AVS_CS_SUB_WIDTH_2,  // YUV 4:2:0 planar
 | 
			
		||||
  AVS_CS_IYUV  = AVS_CS_I420,
 | 
			
		||||
  AVS_CS_YV411 = AVS_CS_PLANAR | AVS_CS_YUV | AVS_CS_SAMPLE_BITS_8 | AVS_CS_VPLANEFIRST | AVS_CS_SUB_HEIGHT_1 | AVS_CS_SUB_WIDTH_4,  // YVU 4:1:1 planar
 | 
			
		||||
  AVS_CS_YUV9  = AVS_CS_PLANAR | AVS_CS_YUV | AVS_CS_SAMPLE_BITS_8 | AVS_CS_VPLANEFIRST | AVS_CS_SUB_HEIGHT_4 | AVS_CS_SUB_WIDTH_4,  // YVU 4:1:0 planar
 | 
			
		||||
  AVS_CS_Y8    = AVS_CS_PLANAR | AVS_CS_INTERLEAVED | AVS_CS_YUV | AVS_CS_SAMPLE_BITS_8                                              // Y   4:0:0 planar
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  AVS_IT_BFF = 1<<0,
 | 
			
		||||
  AVS_IT_TFF = 1<<1,
 | 
			
		||||
  AVS_IT_FIELDBASED = 1<<2};
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  AVS_FILTER_TYPE=1,
 | 
			
		||||
  AVS_FILTER_INPUT_COLORSPACE=2,
 | 
			
		||||
  AVS_FILTER_OUTPUT_TYPE=9,
 | 
			
		||||
  AVS_FILTER_NAME=4,
 | 
			
		||||
  AVS_FILTER_AUTHOR=5,
 | 
			
		||||
  AVS_FILTER_VERSION=6,
 | 
			
		||||
  AVS_FILTER_ARGS=7,
 | 
			
		||||
  AVS_FILTER_ARGS_INFO=8,
 | 
			
		||||
  AVS_FILTER_ARGS_DESCRIPTION=10,
 | 
			
		||||
  AVS_FILTER_DESCRIPTION=11};
 | 
			
		||||
 | 
			
		||||
enum {  //SUBTYPES
 | 
			
		||||
  AVS_FILTER_TYPE_AUDIO=1,
 | 
			
		||||
  AVS_FILTER_TYPE_VIDEO=2,
 | 
			
		||||
  AVS_FILTER_OUTPUT_TYPE_SAME=3,
 | 
			
		||||
  AVS_FILTER_OUTPUT_TYPE_DIFFERENT=4};
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  AVS_CACHE_NOTHING=0,
 | 
			
		||||
  AVS_CACHE_RANGE=1,
 | 
			
		||||
  AVS_CACHE_ALL=2,
 | 
			
		||||
  AVS_CACHE_AUDIO=3,
 | 
			
		||||
  AVS_CACHE_AUDIO_NONE=4,
 | 
			
		||||
  AVS_CACHE_AUDIO_AUTO=5
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
#define AVS_FRAME_ALIGN 16
 | 
			
		||||
 | 
			
		||||
typedef struct AVS_Clip AVS_Clip;
 | 
			
		||||
typedef struct AVS_ScriptEnvironment AVS_ScriptEnvironment;
 | 
			
		||||
 | 
			
		||||
/////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// AVS_VideoInfo
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
// AVS_VideoInfo is layed out identicly to VideoInfo
 | 
			
		||||
typedef struct AVS_VideoInfo {
 | 
			
		||||
  int width, height;    // width=0 means no video
 | 
			
		||||
  unsigned fps_numerator, fps_denominator;
 | 
			
		||||
  int num_frames;
 | 
			
		||||
 | 
			
		||||
  int pixel_type;
 | 
			
		||||
 | 
			
		||||
  int audio_samples_per_second;   // 0 means no audio
 | 
			
		||||
  int sample_type;
 | 
			
		||||
  INT64 num_audio_samples;
 | 
			
		||||
  int nchannels;
 | 
			
		||||
 | 
			
		||||
  // Imagetype properties
 | 
			
		||||
 | 
			
		||||
  int image_type;
 | 
			
		||||
} AVS_VideoInfo;
 | 
			
		||||
 | 
			
		||||
// useful functions of the above
 | 
			
		||||
AVSC_INLINE int avs_has_video(const AVS_VideoInfo * p)
 | 
			
		||||
        { return (p->width!=0); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_has_audio(const AVS_VideoInfo * p)
 | 
			
		||||
        { return (p->audio_samples_per_second!=0); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_rgb(const AVS_VideoInfo * p)
 | 
			
		||||
        { return !!(p->pixel_type&AVS_CS_BGR); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_rgb24(const AVS_VideoInfo * p)
 | 
			
		||||
        { return (p->pixel_type&AVS_CS_BGR24)==AVS_CS_BGR24; } // Clear out additional properties
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_rgb32(const AVS_VideoInfo * p)
 | 
			
		||||
        { return (p->pixel_type & AVS_CS_BGR32) == AVS_CS_BGR32 ; }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_yuv(const AVS_VideoInfo * p)
 | 
			
		||||
        { return !!(p->pixel_type&AVS_CS_YUV ); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_yuy2(const AVS_VideoInfo * p)
 | 
			
		||||
        { return (p->pixel_type & AVS_CS_YUY2) == AVS_CS_YUY2; }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_yv24(const AVS_VideoInfo * p)
 | 
			
		||||
        { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YV24  & AVS_CS_PLANAR_FILTER); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_yv16(const AVS_VideoInfo * p)
 | 
			
		||||
        { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YV16  & AVS_CS_PLANAR_FILTER); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_yv12(const AVS_VideoInfo * p)
 | 
			
		||||
        { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YV12  & AVS_CS_PLANAR_FILTER); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_yv411(const AVS_VideoInfo * p)
 | 
			
		||||
        { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YV411 & AVS_CS_PLANAR_FILTER); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_y8(const AVS_VideoInfo * p)
 | 
			
		||||
        { return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_Y8    & AVS_CS_PLANAR_FILTER); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_property(const AVS_VideoInfo * p, int property)
 | 
			
		||||
        { return ((p->pixel_type & property)==property ); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_planar(const AVS_VideoInfo * p)
 | 
			
		||||
        { return !!(p->pixel_type & AVS_CS_PLANAR); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_color_space(const AVS_VideoInfo * p, int c_space)
 | 
			
		||||
        { return avs_is_planar(p) ? ((p->pixel_type & AVS_CS_PLANAR_MASK) == (c_space & AVS_CS_PLANAR_FILTER)) : ((p->pixel_type & c_space) == c_space); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_field_based(const AVS_VideoInfo * p)
 | 
			
		||||
        { return !!(p->image_type & AVS_IT_FIELDBASED); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_parity_known(const AVS_VideoInfo * p)
 | 
			
		||||
        { return ((p->image_type & AVS_IT_FIELDBASED)&&(p->image_type & (AVS_IT_BFF | AVS_IT_TFF))); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_bff(const AVS_VideoInfo * p)
 | 
			
		||||
        { return !!(p->image_type & AVS_IT_BFF); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_tff(const AVS_VideoInfo * p)
 | 
			
		||||
        { return !!(p->image_type & AVS_IT_TFF); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_bits_per_pixel(const AVS_VideoInfo * p)
 | 
			
		||||
{
 | 
			
		||||
  switch (p->pixel_type) {
 | 
			
		||||
      case AVS_CS_BGR24: return 24;
 | 
			
		||||
      case AVS_CS_BGR32: return 32;
 | 
			
		||||
      case AVS_CS_YUY2:  return 16;
 | 
			
		||||
      case AVS_CS_YV12:
 | 
			
		||||
      case AVS_CS_I420:  return 12;
 | 
			
		||||
      default:           return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
AVSC_INLINE int avs_bytes_from_pixels(const AVS_VideoInfo * p, int pixels)
 | 
			
		||||
        { return pixels * (avs_bits_per_pixel(p)>>3); }   // Will work on planar images, but will return only luma planes
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_row_size(const AVS_VideoInfo * p)
 | 
			
		||||
        { return avs_bytes_from_pixels(p,p->width); }  // Also only returns first plane on planar images
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_bmp_size(const AVS_VideoInfo * vi)
 | 
			
		||||
        { if (avs_is_planar(vi)) {int p = vi->height * ((avs_row_size(vi)+3) & ~3); p+=p>>1; return p;  } return vi->height * ((avs_row_size(vi)+3) & ~3); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_samples_per_second(const AVS_VideoInfo * p)
 | 
			
		||||
        { return p->audio_samples_per_second; }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_bytes_per_channel_sample(const AVS_VideoInfo * p)
 | 
			
		||||
{
 | 
			
		||||
    switch (p->sample_type) {
 | 
			
		||||
      case AVS_SAMPLE_INT8:  return sizeof(signed char);
 | 
			
		||||
      case AVS_SAMPLE_INT16: return sizeof(signed short);
 | 
			
		||||
      case AVS_SAMPLE_INT24: return 3;
 | 
			
		||||
      case AVS_SAMPLE_INT32: return sizeof(signed int);
 | 
			
		||||
      case AVS_SAMPLE_FLOAT: return sizeof(float);
 | 
			
		||||
      default: return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
AVSC_INLINE int avs_bytes_per_audio_sample(const AVS_VideoInfo * p)
 | 
			
		||||
        { return p->nchannels*avs_bytes_per_channel_sample(p);}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE INT64 avs_audio_samples_from_frames(const AVS_VideoInfo * p, INT64 frames)
 | 
			
		||||
        { return ((INT64)(frames) * p->audio_samples_per_second * p->fps_denominator / p->fps_numerator); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_frames_from_audio_samples(const AVS_VideoInfo * p, INT64 samples)
 | 
			
		||||
        { return (int)(samples * (INT64)p->fps_numerator / (INT64)p->fps_denominator / (INT64)p->audio_samples_per_second); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE INT64 avs_audio_samples_from_bytes(const AVS_VideoInfo * p, INT64 bytes)
 | 
			
		||||
        { return bytes / avs_bytes_per_audio_sample(p); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE INT64 avs_bytes_from_audio_samples(const AVS_VideoInfo * p, INT64 samples)
 | 
			
		||||
        { return samples * avs_bytes_per_audio_sample(p); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_audio_channels(const AVS_VideoInfo * p)
 | 
			
		||||
        { return p->nchannels; }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_sample_type(const AVS_VideoInfo * p)
 | 
			
		||||
        { return p->sample_type;}
 | 
			
		||||
 | 
			
		||||
// useful mutator
 | 
			
		||||
AVSC_INLINE void avs_set_property(AVS_VideoInfo * p, int property)
 | 
			
		||||
        { p->image_type|=property; }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE void avs_clear_property(AVS_VideoInfo * p, int property)
 | 
			
		||||
        { p->image_type&=~property; }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE void avs_set_field_based(AVS_VideoInfo * p, int isfieldbased)
 | 
			
		||||
        { if (isfieldbased) p->image_type|=AVS_IT_FIELDBASED; else p->image_type&=~AVS_IT_FIELDBASED; }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE void avs_set_fps(AVS_VideoInfo * p, unsigned numerator, unsigned denominator)
 | 
			
		||||
{
 | 
			
		||||
    unsigned x=numerator, y=denominator;
 | 
			
		||||
    while (y) {   // find gcd
 | 
			
		||||
      unsigned t = x%y; x = y; y = t;
 | 
			
		||||
    }
 | 
			
		||||
    p->fps_numerator = numerator/x;
 | 
			
		||||
    p->fps_denominator = denominator/x;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_same_colorspace(AVS_VideoInfo * x, AVS_VideoInfo * y)
 | 
			
		||||
{
 | 
			
		||||
        return (x->pixel_type == y->pixel_type)
 | 
			
		||||
                || (avs_is_yv12(x) && avs_is_yv12(y));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// AVS_VideoFrame
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
// VideoFrameBuffer holds information about a memory block which is used
 | 
			
		||||
// for video data.  For efficiency, instances of this class are not deleted
 | 
			
		||||
// when the refcount reaches zero; instead they're stored in a linked list
 | 
			
		||||
// to be reused.  The instances are deleted when the corresponding AVS
 | 
			
		||||
// file is closed.
 | 
			
		||||
 | 
			
		||||
// AVS_VideoFrameBuffer is layed out identicly to VideoFrameBuffer
 | 
			
		||||
// DO NOT USE THIS STRUCTURE DIRECTLY
 | 
			
		||||
typedef struct AVS_VideoFrameBuffer {
 | 
			
		||||
  BYTE * data;
 | 
			
		||||
  int data_size;
 | 
			
		||||
  // sequence_number is incremented every time the buffer is changed, so
 | 
			
		||||
  // that stale views can tell they're no longer valid.
 | 
			
		||||
  volatile long sequence_number;
 | 
			
		||||
 | 
			
		||||
  volatile long refcount;
 | 
			
		||||
} AVS_VideoFrameBuffer;
 | 
			
		||||
 | 
			
		||||
// VideoFrame holds a "window" into a VideoFrameBuffer.
 | 
			
		||||
 | 
			
		||||
// AVS_VideoFrame is layed out identicly to IVideoFrame
 | 
			
		||||
// DO NOT USE THIS STRUCTURE DIRECTLY
 | 
			
		||||
typedef struct AVS_VideoFrame {
 | 
			
		||||
  volatile long refcount;
 | 
			
		||||
  AVS_VideoFrameBuffer * vfb;
 | 
			
		||||
  int offset, pitch, row_size, height, offsetU, offsetV, pitchUV;  // U&V offsets are from top of picture.
 | 
			
		||||
  int row_sizeUV, heightUV;
 | 
			
		||||
} AVS_VideoFrame;
 | 
			
		||||
 | 
			
		||||
// Access functions for AVS_VideoFrame
 | 
			
		||||
AVSC_INLINE int avs_get_pitch(const AVS_VideoFrame * p) {
 | 
			
		||||
        return p->pitch;}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_get_pitch_p(const AVS_VideoFrame * p, int plane) {
 | 
			
		||||
  switch (plane) {
 | 
			
		||||
  case AVS_PLANAR_U: case AVS_PLANAR_V: return p->pitchUV;}
 | 
			
		||||
  return p->pitch;}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_get_row_size(const AVS_VideoFrame * p) {
 | 
			
		||||
        return p->row_size; }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_get_row_size_p(const AVS_VideoFrame * p, int plane) {
 | 
			
		||||
        int r;
 | 
			
		||||
    switch (plane) {
 | 
			
		||||
    case AVS_PLANAR_U: case AVS_PLANAR_V:
 | 
			
		||||
                if (p->pitchUV) return p->row_sizeUV;
 | 
			
		||||
                else            return 0;
 | 
			
		||||
    case AVS_PLANAR_U_ALIGNED: case AVS_PLANAR_V_ALIGNED:
 | 
			
		||||
                if (p->pitchUV) {
 | 
			
		||||
                        r = (p->row_sizeUV+AVS_FRAME_ALIGN-1)&(~(AVS_FRAME_ALIGN-1)); // Aligned rowsize
 | 
			
		||||
                        if (r < p->pitchUV)
 | 
			
		||||
                                return r;
 | 
			
		||||
                        return p->row_sizeUV;
 | 
			
		||||
                } else return 0;
 | 
			
		||||
    case AVS_PLANAR_Y_ALIGNED:
 | 
			
		||||
                r = (p->row_size+AVS_FRAME_ALIGN-1)&(~(AVS_FRAME_ALIGN-1)); // Aligned rowsize
 | 
			
		||||
                if (r <= p->pitch)
 | 
			
		||||
                        return r;
 | 
			
		||||
                return p->row_size;
 | 
			
		||||
    }
 | 
			
		||||
    return p->row_size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_get_height(const AVS_VideoFrame * p) {
 | 
			
		||||
        return p->height;}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_get_height_p(const AVS_VideoFrame * p, int plane) {
 | 
			
		||||
        switch (plane) {
 | 
			
		||||
                case AVS_PLANAR_U: case AVS_PLANAR_V:
 | 
			
		||||
                        if (p->pitchUV) return p->heightUV;
 | 
			
		||||
                        return 0;
 | 
			
		||||
        }
 | 
			
		||||
        return p->height;}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE const BYTE* avs_get_read_ptr(const AVS_VideoFrame * p) {
 | 
			
		||||
        return p->vfb->data + p->offset;}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE const BYTE* avs_get_read_ptr_p(const AVS_VideoFrame * p, int plane)
 | 
			
		||||
{
 | 
			
		||||
        switch (plane) {
 | 
			
		||||
                case AVS_PLANAR_U: return p->vfb->data + p->offsetU;
 | 
			
		||||
                case AVS_PLANAR_V: return p->vfb->data + p->offsetV;
 | 
			
		||||
                default:           return p->vfb->data + p->offset;}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_writable(const AVS_VideoFrame * p) {
 | 
			
		||||
        return (p->refcount == 1 && p->vfb->refcount == 1);}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE BYTE* avs_get_write_ptr(const AVS_VideoFrame * p)
 | 
			
		||||
{
 | 
			
		||||
        if (avs_is_writable(p)) {
 | 
			
		||||
                ++p->vfb->sequence_number;
 | 
			
		||||
                return p->vfb->data + p->offset;
 | 
			
		||||
        } else
 | 
			
		||||
                return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE BYTE* avs_get_write_ptr_p(const AVS_VideoFrame * p, int plane)
 | 
			
		||||
{
 | 
			
		||||
        if (plane==AVS_PLANAR_Y && avs_is_writable(p)) {
 | 
			
		||||
                ++p->vfb->sequence_number;
 | 
			
		||||
                return p->vfb->data + p->offset;
 | 
			
		||||
        } else if (plane==AVS_PLANAR_Y) {
 | 
			
		||||
                return 0;
 | 
			
		||||
        } else {
 | 
			
		||||
                switch (plane) {
 | 
			
		||||
                        case AVS_PLANAR_U: return p->vfb->data + p->offsetU;
 | 
			
		||||
                        case AVS_PLANAR_V: return p->vfb->data + p->offsetV;
 | 
			
		||||
                        default:       return p->vfb->data + p->offset;
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
AVSC_API(void, avs_release_video_frame)(AVS_VideoFrame *);
 | 
			
		||||
// makes a shallow copy of a video frame
 | 
			
		||||
AVSC_API(AVS_VideoFrame *, avs_copy_video_frame)(AVS_VideoFrame *);
 | 
			
		||||
 | 
			
		||||
#ifndef AVSC_NO_DECLSPEC
 | 
			
		||||
AVSC_INLINE void avs_release_frame(AVS_VideoFrame * f)
 | 
			
		||||
  {avs_release_video_frame(f);}
 | 
			
		||||
AVSC_INLINE AVS_VideoFrame * avs_copy_frame(AVS_VideoFrame * f)
 | 
			
		||||
  {return avs_copy_video_frame(f);}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// AVS_Value
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
// Treat AVS_Value as a fat pointer.  That is use avs_copy_value
 | 
			
		||||
// and avs_release_value appropiaty as you would if AVS_Value was
 | 
			
		||||
// a pointer.
 | 
			
		||||
 | 
			
		||||
// To maintain source code compatibility with future versions of the
 | 
			
		||||
// avisynth_c API don't use the AVS_Value directly.  Use the helper
 | 
			
		||||
// functions below.
 | 
			
		||||
 | 
			
		||||
// AVS_Value is layed out identicly to AVSValue
 | 
			
		||||
typedef struct AVS_Value AVS_Value;
 | 
			
		||||
struct AVS_Value {
 | 
			
		||||
  short type;  // 'a'rray, 'c'lip, 'b'ool, 'i'nt, 'f'loat, 's'tring, 'v'oid, or 'l'ong
 | 
			
		||||
               // for some function e'rror
 | 
			
		||||
  short array_size;
 | 
			
		||||
  union {
 | 
			
		||||
    void * clip; // do not use directly, use avs_take_clip
 | 
			
		||||
    char boolean;
 | 
			
		||||
    int integer;
 | 
			
		||||
    float floating_pt;
 | 
			
		||||
    const char * string;
 | 
			
		||||
    const AVS_Value * array;
 | 
			
		||||
  } d;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// AVS_Value should be initilized with avs_void.
 | 
			
		||||
// Should also set to avs_void after the value is released
 | 
			
		||||
// with avs_copy_value.  Consider it the equalvent of setting
 | 
			
		||||
// a pointer to NULL
 | 
			
		||||
static const AVS_Value avs_void = {'v'};
 | 
			
		||||
 | 
			
		||||
AVSC_API(void, avs_copy_value)(AVS_Value * dest, AVS_Value src);
 | 
			
		||||
AVSC_API(void, avs_release_value)(AVS_Value);
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_defined(AVS_Value v) { return v.type != 'v'; }
 | 
			
		||||
AVSC_INLINE int avs_is_clip(AVS_Value v) { return v.type == 'c'; }
 | 
			
		||||
AVSC_INLINE int avs_is_bool(AVS_Value v) { return v.type == 'b'; }
 | 
			
		||||
AVSC_INLINE int avs_is_int(AVS_Value v) { return v.type == 'i'; }
 | 
			
		||||
AVSC_INLINE int avs_is_float(AVS_Value v) { return v.type == 'f' || v.type == 'i'; }
 | 
			
		||||
AVSC_INLINE int avs_is_string(AVS_Value v) { return v.type == 's'; }
 | 
			
		||||
AVSC_INLINE int avs_is_array(AVS_Value v) { return v.type == 'a'; }
 | 
			
		||||
AVSC_INLINE int avs_is_error(AVS_Value v) { return v.type == 'e'; }
 | 
			
		||||
 | 
			
		||||
AVSC_API(AVS_Clip *, avs_take_clip)(AVS_Value, AVS_ScriptEnvironment *);
 | 
			
		||||
AVSC_API(void, avs_set_to_clip)(AVS_Value *, AVS_Clip *);
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_as_bool(AVS_Value v)
 | 
			
		||||
        { return v.d.boolean; }
 | 
			
		||||
AVSC_INLINE int avs_as_int(AVS_Value v)
 | 
			
		||||
        { return v.d.integer; }
 | 
			
		||||
AVSC_INLINE const char * avs_as_string(AVS_Value v)
 | 
			
		||||
        { return avs_is_error(v) || avs_is_string(v) ? v.d.string : 0; }
 | 
			
		||||
AVSC_INLINE double avs_as_float(AVS_Value v)
 | 
			
		||||
        { return avs_is_int(v) ? v.d.integer : v.d.floating_pt; }
 | 
			
		||||
AVSC_INLINE const char * avs_as_error(AVS_Value v)
 | 
			
		||||
        { return avs_is_error(v) ? v.d.string : 0; }
 | 
			
		||||
AVSC_INLINE const AVS_Value * avs_as_array(AVS_Value v)
 | 
			
		||||
        { return v.d.array; }
 | 
			
		||||
AVSC_INLINE int avs_array_size(AVS_Value v)
 | 
			
		||||
        { return avs_is_array(v) ? v.array_size : 1; }
 | 
			
		||||
AVSC_INLINE AVS_Value avs_array_elt(AVS_Value v, int index)
 | 
			
		||||
        { return avs_is_array(v) ? v.d.array[index] : v; }
 | 
			
		||||
 | 
			
		||||
// only use these functions on an AVS_Value that does not already have
 | 
			
		||||
// an active value.  Remember, treat AVS_Value as a fat pointer.
 | 
			
		||||
AVSC_INLINE AVS_Value avs_new_value_bool(int v0)
 | 
			
		||||
        { AVS_Value v; v.type = 'b'; v.d.boolean = v0 == 0 ? 0 : 1; return v; }
 | 
			
		||||
AVSC_INLINE AVS_Value avs_new_value_int(int v0)
 | 
			
		||||
        { AVS_Value v; v.type = 'i'; v.d.integer = v0; return v; }
 | 
			
		||||
AVSC_INLINE AVS_Value avs_new_value_string(const char * v0)
 | 
			
		||||
        { AVS_Value v; v.type = 's'; v.d.string = v0; return v; }
 | 
			
		||||
AVSC_INLINE AVS_Value avs_new_value_float(float v0)
 | 
			
		||||
        { AVS_Value v; v.type = 'f'; v.d.floating_pt = v0; return v;}
 | 
			
		||||
AVSC_INLINE AVS_Value avs_new_value_error(const char * v0)
 | 
			
		||||
        { AVS_Value v; v.type = 'e'; v.d.string = v0; return v; }
 | 
			
		||||
#ifndef AVSC_NO_DECLSPEC
 | 
			
		||||
AVSC_INLINE AVS_Value avs_new_value_clip(AVS_Clip * v0)
 | 
			
		||||
        { AVS_Value v; avs_set_to_clip(&v, v0); return v; }
 | 
			
		||||
#endif
 | 
			
		||||
AVSC_INLINE AVS_Value avs_new_value_array(AVS_Value * v0, int size)
 | 
			
		||||
        { AVS_Value v; v.type = 'a'; v.d.array = v0; v.array_size = size; return v; }
 | 
			
		||||
 | 
			
		||||
/////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// AVS_Clip
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
AVSC_API(void, avs_release_clip)(AVS_Clip *);
 | 
			
		||||
AVSC_API(AVS_Clip *, avs_copy_clip)(AVS_Clip *);
 | 
			
		||||
 | 
			
		||||
AVSC_API(const char *, avs_clip_get_error)(AVS_Clip *); // return 0 if no error
 | 
			
		||||
 | 
			
		||||
AVSC_API(const AVS_VideoInfo *, avs_get_video_info)(AVS_Clip *);
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_get_version)(AVS_Clip *);
 | 
			
		||||
 | 
			
		||||
AVSC_API(AVS_VideoFrame *, avs_get_frame)(AVS_Clip *, int n);
 | 
			
		||||
// The returned video frame must be released with avs_release_video_frame
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_get_parity)(AVS_Clip *, int n);
 | 
			
		||||
// return field parity if field_based, else parity of first field in frame
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_get_audio)(AVS_Clip *, void * buf,
 | 
			
		||||
                             INT64 start, INT64 count);
 | 
			
		||||
// start and count are in samples
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_set_cache_hints)(AVS_Clip *,
 | 
			
		||||
                                   int cachehints, int frame_range);
 | 
			
		||||
 | 
			
		||||
// This is the callback type used by avs_add_function
 | 
			
		||||
typedef AVS_Value (AVSC_CC * AVS_ApplyFunc)
 | 
			
		||||
                        (AVS_ScriptEnvironment *, AVS_Value args, void * user_data);
 | 
			
		||||
 | 
			
		||||
typedef struct AVS_FilterInfo AVS_FilterInfo;
 | 
			
		||||
struct AVS_FilterInfo
 | 
			
		||||
{
 | 
			
		||||
  // these members should not be modified outside of the AVS_ApplyFunc callback
 | 
			
		||||
  AVS_Clip * child;
 | 
			
		||||
  AVS_VideoInfo vi;
 | 
			
		||||
  AVS_ScriptEnvironment * env;
 | 
			
		||||
  AVS_VideoFrame * (AVSC_CC * get_frame)(AVS_FilterInfo *, int n);
 | 
			
		||||
  int (AVSC_CC * get_parity)(AVS_FilterInfo *, int n);
 | 
			
		||||
  int (AVSC_CC * get_audio)(AVS_FilterInfo *, void * buf,
 | 
			
		||||
                                  INT64 start, INT64 count);
 | 
			
		||||
  int (AVSC_CC * set_cache_hints)(AVS_FilterInfo *, int cachehints,
 | 
			
		||||
                                        int frame_range);
 | 
			
		||||
  void (AVSC_CC * free_filter)(AVS_FilterInfo *);
 | 
			
		||||
 | 
			
		||||
  // Should be set when ever there is an error to report.
 | 
			
		||||
  // It is cleared before any of the above methods are called
 | 
			
		||||
  const char * error;
 | 
			
		||||
  // this is to store whatever and may be modified at will
 | 
			
		||||
  void * user_data;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Create a new filter
 | 
			
		||||
// fi is set to point to the AVS_FilterInfo so that you can
 | 
			
		||||
//   modify it once it is initilized.
 | 
			
		||||
// store_child should generally be set to true.  If it is not
 | 
			
		||||
//    set than ALL methods (the function pointers) must be defined
 | 
			
		||||
// If it is set than you do not need to worry about freeing the child
 | 
			
		||||
//    clip.
 | 
			
		||||
AVSC_API(AVS_Clip *, avs_new_c_filter)(AVS_ScriptEnvironment * e,
 | 
			
		||||
                                       AVS_FilterInfo * * fi,
 | 
			
		||||
                                       AVS_Value child, int store_child);
 | 
			
		||||
 | 
			
		||||
/////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// AVS_ScriptEnvironment
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
// For GetCPUFlags.  These are backwards-compatible with those in VirtualDub.
 | 
			
		||||
enum {
 | 
			
		||||
                                /* slowest CPU to support extension */
 | 
			
		||||
  AVS_CPU_FORCE        = 0x01,   // N/A
 | 
			
		||||
  AVS_CPU_FPU          = 0x02,   // 386/486DX
 | 
			
		||||
  AVS_CPU_MMX          = 0x04,   // P55C, K6, PII
 | 
			
		||||
  AVS_CPU_INTEGER_SSE  = 0x08,   // PIII, Athlon
 | 
			
		||||
  AVS_CPU_SSE          = 0x10,   // PIII, Athlon XP/MP
 | 
			
		||||
  AVS_CPU_SSE2         = 0x20,   // PIV, Hammer
 | 
			
		||||
  AVS_CPU_3DNOW        = 0x40,   // K6-2
 | 
			
		||||
  AVS_CPU_3DNOW_EXT    = 0x80,   // Athlon
 | 
			
		||||
  AVS_CPU_X86_64       = 0xA0,   // Hammer (note: equiv. to 3DNow + SSE2,
 | 
			
		||||
                                 // which only Hammer will have anyway)
 | 
			
		||||
  AVS_CPUF_SSE3       = 0x100,   //  PIV+, K8 Venice
 | 
			
		||||
  AVS_CPUF_SSSE3      = 0x200,   //  Core 2
 | 
			
		||||
  AVS_CPUF_SSE4       = 0x400,   //  Penryn, Wolfdale, Yorkfield
 | 
			
		||||
  AVS_CPUF_SSE4_1     = 0x400,
 | 
			
		||||
  AVS_CPUF_SSE4_2     = 0x800,   //  Nehalem
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
AVSC_API(const char *, avs_get_error)(AVS_ScriptEnvironment *); // return 0 if no error
 | 
			
		||||
 | 
			
		||||
AVSC_API(long, avs_get_cpu_flags)(AVS_ScriptEnvironment *);
 | 
			
		||||
AVSC_API(int, avs_check_version)(AVS_ScriptEnvironment *, int version);
 | 
			
		||||
 | 
			
		||||
AVSC_API(char *, avs_save_string)(AVS_ScriptEnvironment *, const char* s, int length);
 | 
			
		||||
AVSC_API(char *, avs_sprintf)(AVS_ScriptEnvironment *, const char * fmt, ...);
 | 
			
		||||
 | 
			
		||||
AVSC_API(char *, avs_vsprintf)(AVS_ScriptEnvironment *, const char * fmt, void* val);
 | 
			
		||||
 // note: val is really a va_list; I hope everyone typedefs va_list to a pointer
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_add_function)(AVS_ScriptEnvironment *,
 | 
			
		||||
                                const char * name, const char * params,
 | 
			
		||||
                                AVS_ApplyFunc apply, void * user_data);
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_function_exists)(AVS_ScriptEnvironment *, const char * name);
 | 
			
		||||
 | 
			
		||||
AVSC_API(AVS_Value, avs_invoke)(AVS_ScriptEnvironment *, const char * name,
 | 
			
		||||
                               AVS_Value args, const char** arg_names);
 | 
			
		||||
// The returned value must be be released with avs_release_value
 | 
			
		||||
 | 
			
		||||
AVSC_API(AVS_Value, avs_get_var)(AVS_ScriptEnvironment *, const char* name);
 | 
			
		||||
// The returned value must be be released with avs_release_value
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_set_var)(AVS_ScriptEnvironment *, const char* name, AVS_Value val);
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_set_global_var)(AVS_ScriptEnvironment *, const char* name, const AVS_Value val);
 | 
			
		||||
 | 
			
		||||
//void avs_push_context(AVS_ScriptEnvironment *, int level=0);
 | 
			
		||||
//void avs_pop_context(AVS_ScriptEnvironment *);
 | 
			
		||||
 | 
			
		||||
AVSC_API(AVS_VideoFrame *, avs_new_video_frame_a)(AVS_ScriptEnvironment *,
 | 
			
		||||
                                          const AVS_VideoInfo * vi, int align);
 | 
			
		||||
// align should be at least 16
 | 
			
		||||
 | 
			
		||||
#ifndef AVSC_NO_DECLSPEC
 | 
			
		||||
AVSC_INLINE
 | 
			
		||||
AVS_VideoFrame * avs_new_video_frame(AVS_ScriptEnvironment * env,
 | 
			
		||||
                                     const AVS_VideoInfo * vi)
 | 
			
		||||
  {return avs_new_video_frame_a(env,vi,AVS_FRAME_ALIGN);}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE
 | 
			
		||||
AVS_VideoFrame * avs_new_frame(AVS_ScriptEnvironment * env,
 | 
			
		||||
                               const AVS_VideoInfo * vi)
 | 
			
		||||
  {return avs_new_video_frame_a(env,vi,AVS_FRAME_ALIGN);}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_make_writable)(AVS_ScriptEnvironment *, AVS_VideoFrame * * pvf);
 | 
			
		||||
 | 
			
		||||
AVSC_API(void, avs_bit_blt)(AVS_ScriptEnvironment *, BYTE* dstp, int dst_pitch, const BYTE* srcp, int src_pitch, int row_size, int height);
 | 
			
		||||
 | 
			
		||||
typedef void (AVSC_CC *AVS_ShutdownFunc)(void* user_data, AVS_ScriptEnvironment * env);
 | 
			
		||||
AVSC_API(void, avs_at_exit)(AVS_ScriptEnvironment *, AVS_ShutdownFunc function, void * user_data);
 | 
			
		||||
 | 
			
		||||
AVSC_API(AVS_VideoFrame *, avs_subframe)(AVS_ScriptEnvironment *, AVS_VideoFrame * src, int rel_offset, int new_pitch, int new_row_size, int new_height);
 | 
			
		||||
// The returned video frame must be be released
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_set_memory_max)(AVS_ScriptEnvironment *, int mem);
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_set_working_dir)(AVS_ScriptEnvironment *, const char * newdir);
 | 
			
		||||
 | 
			
		||||
// avisynth.dll exports this; it's a way to use it as a library, without
 | 
			
		||||
// writing an AVS script or without going through AVIFile.
 | 
			
		||||
AVSC_API(AVS_ScriptEnvironment *, avs_create_script_environment)(int version);
 | 
			
		||||
 | 
			
		||||
// this symbol is the entry point for the plugin and must
 | 
			
		||||
// be defined
 | 
			
		||||
AVSC_EXPORT
 | 
			
		||||
const char * AVSC_CC avisynth_c_plugin_init(AVS_ScriptEnvironment* env);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
AVSC_API(void, avs_delete_script_environment)(AVS_ScriptEnvironment *);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
AVSC_API(AVS_VideoFrame *, avs_subframe_planar)(AVS_ScriptEnvironment *, AVS_VideoFrame * src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV);
 | 
			
		||||
// The returned video frame must be be released
 | 
			
		||||
 | 
			
		||||
#ifdef AVSC_NO_DECLSPEC
 | 
			
		||||
// use LoadLibrary and related functions to dynamically load Avisynth instead of declspec(dllimport)
 | 
			
		||||
/*
 | 
			
		||||
  The following functions needs to have been declared, probably from windows.h
 | 
			
		||||
 | 
			
		||||
  void* malloc(size_t)
 | 
			
		||||
  void free(void*);
 | 
			
		||||
 | 
			
		||||
  HMODULE LoadLibrary(const char*);
 | 
			
		||||
  void* GetProcAddress(HMODULE, const char*);
 | 
			
		||||
  FreeLibrary(HMODULE);
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct AVS_Library AVS_Library;
 | 
			
		||||
 | 
			
		||||
#define AVSC_DECLARE_FUNC(name) name##_func name
 | 
			
		||||
 | 
			
		||||
struct AVS_Library {
 | 
			
		||||
  HMODULE handle;
 | 
			
		||||
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_add_function);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_at_exit);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_bit_blt);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_check_version);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_clip_get_error);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_copy_clip);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_copy_value);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_copy_video_frame);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_create_script_environment);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_delete_script_environment);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_function_exists);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_get_audio);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_get_cpu_flags);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_get_error);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_get_frame);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_get_parity);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_get_var);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_get_version);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_get_video_info);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_invoke);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_make_writable);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_new_c_filter);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_new_video_frame_a);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_release_clip);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_release_value);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_release_video_frame);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_save_string);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_set_cache_hints);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_set_global_var);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_set_memory_max);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_set_to_clip);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_set_var);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_set_working_dir);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_sprintf);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_subframe);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_subframe_planar);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_take_clip);
 | 
			
		||||
  AVSC_DECLARE_FUNC(avs_vsprintf);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#undef AVSC_DECLARE_FUNC
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE AVS_Library * avs_load_library() {
 | 
			
		||||
  AVS_Library *library = (AVS_Library *)malloc(sizeof(AVS_Library));
 | 
			
		||||
  if (library == NULL)
 | 
			
		||||
    return NULL;
 | 
			
		||||
  library->handle = LoadLibrary("avisynth");
 | 
			
		||||
  if (library->handle == NULL)
 | 
			
		||||
    goto fail;
 | 
			
		||||
 | 
			
		||||
#define __AVSC_STRINGIFY(x) #x
 | 
			
		||||
#define AVSC_STRINGIFY(x) __AVSC_STRINGIFY(x)
 | 
			
		||||
#define AVSC_LOAD_FUNC(name) {\
 | 
			
		||||
  library->name = (name##_func) GetProcAddress(library->handle, AVSC_STRINGIFY(name));\
 | 
			
		||||
  if (library->name == NULL)\
 | 
			
		||||
    goto fail;\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_add_function);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_at_exit);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_bit_blt);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_check_version);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_clip_get_error);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_copy_clip);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_copy_value);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_copy_video_frame);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_create_script_environment);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_delete_script_environment);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_function_exists);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_get_audio);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_get_cpu_flags);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_get_error);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_get_frame);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_get_parity);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_get_var);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_get_version);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_get_video_info);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_invoke);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_make_writable);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_new_c_filter);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_new_video_frame_a);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_release_clip);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_release_value);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_release_video_frame);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_save_string);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_set_cache_hints);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_set_global_var);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_set_memory_max);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_set_to_clip);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_set_var);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_set_working_dir);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_sprintf);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_subframe);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_subframe_planar);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_take_clip);
 | 
			
		||||
  AVSC_LOAD_FUNC(avs_vsprintf);
 | 
			
		||||
 | 
			
		||||
#undef __AVSC_STRINGIFY
 | 
			
		||||
#undef AVSC_STRINGIFY
 | 
			
		||||
#undef AVSC_LOAD_FUNC
 | 
			
		||||
 | 
			
		||||
  return library;
 | 
			
		||||
 | 
			
		||||
fail:
 | 
			
		||||
  free(library);
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE void avs_free_library(AVS_Library *library) {
 | 
			
		||||
  if (library == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
  FreeLibrary(library->handle);
 | 
			
		||||
  free(library);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,68 +0,0 @@
 | 
			
		||||
//  Copyright (c) 2011 FFmpegSource Project
 | 
			
		||||
//
 | 
			
		||||
//  Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
//  of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
//  in the Software without restriction, including without limitation the rights
 | 
			
		||||
//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
//  copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
//  furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
//  The above copyright notice and this permission notice shall be included in
 | 
			
		||||
//  all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
//  THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
/* these are defines/functions that are used and were changed in the switch to 2.6
 | 
			
		||||
 * and are needed to maintain full compatility with 2.5 */
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  AVS_CS_YV12_25 = 1<<3 | AVS_CS_YUV | AVS_CS_PLANAR,  // y-v-u, planar
 | 
			
		||||
  AVS_CS_I420_25 = 1<<4 | AVS_CS_YUV | AVS_CS_PLANAR,  // y-u-v, planar
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_get_height_p_25(const AVS_VideoFrame * p, int plane) {
 | 
			
		||||
    switch (plane)
 | 
			
		||||
    {
 | 
			
		||||
        case AVS_PLANAR_U: case AVS_PLANAR_V:
 | 
			
		||||
            if (p->pitchUV)
 | 
			
		||||
                return p->height>>1;
 | 
			
		||||
            return 0;
 | 
			
		||||
    }
 | 
			
		||||
    return p->height;}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_get_row_size_p_25(const AVS_VideoFrame * p, int plane) {
 | 
			
		||||
    int r;
 | 
			
		||||
    switch (plane)
 | 
			
		||||
    {
 | 
			
		||||
    case AVS_PLANAR_U: case AVS_PLANAR_V:
 | 
			
		||||
        if (p->pitchUV)
 | 
			
		||||
            return p->row_size>>1;
 | 
			
		||||
        else
 | 
			
		||||
            return 0;
 | 
			
		||||
    case AVS_PLANAR_U_ALIGNED: case AVS_PLANAR_V_ALIGNED:
 | 
			
		||||
        if (p->pitchUV)
 | 
			
		||||
        {
 | 
			
		||||
            r = ((p->row_size+AVS_FRAME_ALIGN-1)&(~(AVS_FRAME_ALIGN-1)) )>>1; // Aligned rowsize
 | 
			
		||||
            if (r < p->pitchUV)
 | 
			
		||||
                return r;
 | 
			
		||||
            return p->row_size>>1;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
            return 0;
 | 
			
		||||
    case AVS_PLANAR_Y_ALIGNED:
 | 
			
		||||
        r = (p->row_size+AVS_FRAME_ALIGN-1)&(~(AVS_FRAME_ALIGN-1)); // Aligned rowsize
 | 
			
		||||
        if (r <= p->pitch)
 | 
			
		||||
            return r;
 | 
			
		||||
        return p->row_size;
 | 
			
		||||
    }
 | 
			
		||||
    return p->row_size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_yv12_25(const AVS_VideoInfo * p)
 | 
			
		||||
    { return ((p->pixel_type & AVS_CS_YV12_25) == AVS_CS_YV12_25)||((p->pixel_type & AVS_CS_I420_25) == AVS_CS_I420_25); }
 | 
			
		||||
@@ -1,727 +0,0 @@
 | 
			
		||||
// Avisynth C Interface Version 0.20
 | 
			
		||||
// Copyright 2003 Kevin Atkinson
 | 
			
		||||
 | 
			
		||||
// This program is free software; you can redistribute it and/or modify
 | 
			
		||||
// it under the terms of the GNU General Public License as published by
 | 
			
		||||
// the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
// (at your option) any later version.
 | 
			
		||||
//
 | 
			
		||||
// This program 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 General Public License for more details.
 | 
			
		||||
//
 | 
			
		||||
// You should have received a copy of the GNU General Public License
 | 
			
		||||
// along with this program; if not, write to the Free Software
 | 
			
		||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit
 | 
			
		||||
// http://www.gnu.org/copyleft/gpl.html .
 | 
			
		||||
//
 | 
			
		||||
// As a special exception, I give you permission to link to the
 | 
			
		||||
// Avisynth C interface with independent modules that communicate with
 | 
			
		||||
// the Avisynth C interface solely through the interfaces defined in
 | 
			
		||||
// avisynth_c.h, regardless of the license terms of these independent
 | 
			
		||||
// modules, and to copy and distribute the resulting combined work
 | 
			
		||||
// under terms of your choice, provided that every copy of the
 | 
			
		||||
// combined work is accompanied by a complete copy of the source code
 | 
			
		||||
// of the Avisynth C interface and Avisynth itself (with the version
 | 
			
		||||
// used to produce the combined work), being distributed under the
 | 
			
		||||
// terms of the GNU General Public License plus this exception.  An
 | 
			
		||||
// independent module is a module which is not derived from or based
 | 
			
		||||
// on Avisynth C Interface, such as 3rd-party filters, import and
 | 
			
		||||
// export plugins, or graphical user interfaces.
 | 
			
		||||
 | 
			
		||||
#ifndef __AVXSYNTH_C__
 | 
			
		||||
#define __AVXSYNTH_C__
 | 
			
		||||
 | 
			
		||||
#include "windowsPorts/windows2linux.h"
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
#  define EXTERN_C extern "C"
 | 
			
		||||
#else
 | 
			
		||||
#  define EXTERN_C
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AVSC_USE_STDCALL 1
 | 
			
		||||
 | 
			
		||||
#ifndef AVSC_USE_STDCALL
 | 
			
		||||
#  define AVSC_CC __cdecl
 | 
			
		||||
#else
 | 
			
		||||
#  define AVSC_CC __stdcall
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AVSC_INLINE static __inline
 | 
			
		||||
 | 
			
		||||
#ifdef AVISYNTH_C_EXPORTS
 | 
			
		||||
#  define AVSC_EXPORT EXTERN_C
 | 
			
		||||
#  define AVSC_API(ret, name) EXTERN_C __declspec(dllexport) ret AVSC_CC name
 | 
			
		||||
#else
 | 
			
		||||
#  define AVSC_EXPORT EXTERN_C __declspec(dllexport)
 | 
			
		||||
#  ifndef AVSC_NO_DECLSPEC
 | 
			
		||||
#    define AVSC_API(ret, name) EXTERN_C __declspec(dllimport) ret AVSC_CC name
 | 
			
		||||
#  else
 | 
			
		||||
#    define AVSC_API(ret, name) typedef ret (AVSC_CC *name##_func)
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __GNUC__
 | 
			
		||||
typedef long long int INT64;
 | 
			
		||||
#else
 | 
			
		||||
typedef __int64 INT64;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Constants
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#ifndef __AVXSYNTH_H__
 | 
			
		||||
enum { AVISYNTH_INTERFACE_VERSION = 3 };
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
enum {AVS_SAMPLE_INT8  = 1<<0,
 | 
			
		||||
      AVS_SAMPLE_INT16 = 1<<1,
 | 
			
		||||
      AVS_SAMPLE_INT24 = 1<<2,
 | 
			
		||||
      AVS_SAMPLE_INT32 = 1<<3,
 | 
			
		||||
      AVS_SAMPLE_FLOAT = 1<<4};
 | 
			
		||||
 | 
			
		||||
enum {AVS_PLANAR_Y=1<<0,
 | 
			
		||||
      AVS_PLANAR_U=1<<1,
 | 
			
		||||
      AVS_PLANAR_V=1<<2,
 | 
			
		||||
      AVS_PLANAR_ALIGNED=1<<3,
 | 
			
		||||
      AVS_PLANAR_Y_ALIGNED=AVS_PLANAR_Y|AVS_PLANAR_ALIGNED,
 | 
			
		||||
      AVS_PLANAR_U_ALIGNED=AVS_PLANAR_U|AVS_PLANAR_ALIGNED,
 | 
			
		||||
      AVS_PLANAR_V_ALIGNED=AVS_PLANAR_V|AVS_PLANAR_ALIGNED};
 | 
			
		||||
 | 
			
		||||
  // Colorspace properties.
 | 
			
		||||
enum {AVS_CS_BGR = 1<<28,
 | 
			
		||||
      AVS_CS_YUV = 1<<29,
 | 
			
		||||
      AVS_CS_INTERLEAVED = 1<<30,
 | 
			
		||||
      AVS_CS_PLANAR = 1<<31};
 | 
			
		||||
 | 
			
		||||
  // Specific colorformats
 | 
			
		||||
enum {
 | 
			
		||||
  AVS_CS_UNKNOWN = 0,
 | 
			
		||||
  AVS_CS_BGR24 = 1<<0 | AVS_CS_BGR | AVS_CS_INTERLEAVED,
 | 
			
		||||
  AVS_CS_BGR32 = 1<<1 | AVS_CS_BGR | AVS_CS_INTERLEAVED,
 | 
			
		||||
  AVS_CS_YUY2 = 1<<2 | AVS_CS_YUV | AVS_CS_INTERLEAVED,
 | 
			
		||||
  AVS_CS_YV12 = 1<<3 | AVS_CS_YUV | AVS_CS_PLANAR,  // y-v-u, planar
 | 
			
		||||
  AVS_CS_I420 = 1<<4 | AVS_CS_YUV | AVS_CS_PLANAR,  // y-u-v, planar
 | 
			
		||||
  AVS_CS_IYUV = 1<<4 | AVS_CS_YUV | AVS_CS_PLANAR  // same as above
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  AVS_IT_BFF = 1<<0,
 | 
			
		||||
  AVS_IT_TFF = 1<<1,
 | 
			
		||||
  AVS_IT_FIELDBASED = 1<<2};
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  AVS_FILTER_TYPE=1,
 | 
			
		||||
  AVS_FILTER_INPUT_COLORSPACE=2,
 | 
			
		||||
  AVS_FILTER_OUTPUT_TYPE=9,
 | 
			
		||||
  AVS_FILTER_NAME=4,
 | 
			
		||||
  AVS_FILTER_AUTHOR=5,
 | 
			
		||||
  AVS_FILTER_VERSION=6,
 | 
			
		||||
  AVS_FILTER_ARGS=7,
 | 
			
		||||
  AVS_FILTER_ARGS_INFO=8,
 | 
			
		||||
  AVS_FILTER_ARGS_DESCRIPTION=10,
 | 
			
		||||
  AVS_FILTER_DESCRIPTION=11};
 | 
			
		||||
 | 
			
		||||
enum {  //SUBTYPES
 | 
			
		||||
  AVS_FILTER_TYPE_AUDIO=1,
 | 
			
		||||
  AVS_FILTER_TYPE_VIDEO=2,
 | 
			
		||||
  AVS_FILTER_OUTPUT_TYPE_SAME=3,
 | 
			
		||||
  AVS_FILTER_OUTPUT_TYPE_DIFFERENT=4};
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  AVS_CACHE_NOTHING=0,
 | 
			
		||||
  AVS_CACHE_RANGE=1,
 | 
			
		||||
  AVS_CACHE_ALL=2,
 | 
			
		||||
  AVS_CACHE_AUDIO=3,
 | 
			
		||||
  AVS_CACHE_AUDIO_NONE=4,
 | 
			
		||||
  AVS_CACHE_AUDIO_AUTO=5
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define AVS_FRAME_ALIGN 16
 | 
			
		||||
 | 
			
		||||
typedef struct AVS_Clip AVS_Clip;
 | 
			
		||||
typedef struct AVS_ScriptEnvironment AVS_ScriptEnvironment;
 | 
			
		||||
 | 
			
		||||
/////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// AVS_VideoInfo
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
// AVS_VideoInfo is layed out identicly to VideoInfo
 | 
			
		||||
typedef struct AVS_VideoInfo {
 | 
			
		||||
  int width, height;    // width=0 means no video
 | 
			
		||||
  unsigned fps_numerator, fps_denominator;
 | 
			
		||||
  int num_frames;
 | 
			
		||||
 | 
			
		||||
  int pixel_type;
 | 
			
		||||
 | 
			
		||||
  int audio_samples_per_second;   // 0 means no audio
 | 
			
		||||
  int sample_type;
 | 
			
		||||
  INT64 num_audio_samples;
 | 
			
		||||
  int nchannels;
 | 
			
		||||
 | 
			
		||||
  // Imagetype properties
 | 
			
		||||
 | 
			
		||||
  int image_type;
 | 
			
		||||
} AVS_VideoInfo;
 | 
			
		||||
 | 
			
		||||
// useful functions of the above
 | 
			
		||||
AVSC_INLINE int avs_has_video(const AVS_VideoInfo * p)
 | 
			
		||||
        { return (p->width!=0); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_has_audio(const AVS_VideoInfo * p)
 | 
			
		||||
        { return (p->audio_samples_per_second!=0); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_rgb(const AVS_VideoInfo * p)
 | 
			
		||||
        { return !!(p->pixel_type&AVS_CS_BGR); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_rgb24(const AVS_VideoInfo * p)
 | 
			
		||||
        { return (p->pixel_type&AVS_CS_BGR24)==AVS_CS_BGR24; } // Clear out additional properties
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_rgb32(const AVS_VideoInfo * p)
 | 
			
		||||
        { return (p->pixel_type & AVS_CS_BGR32) == AVS_CS_BGR32 ; }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_yuv(const AVS_VideoInfo * p)
 | 
			
		||||
        { return !!(p->pixel_type&AVS_CS_YUV ); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_yuy2(const AVS_VideoInfo * p)
 | 
			
		||||
        { return (p->pixel_type & AVS_CS_YUY2) == AVS_CS_YUY2; }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_yv12(const AVS_VideoInfo * p)
 | 
			
		||||
        { return ((p->pixel_type & AVS_CS_YV12) == AVS_CS_YV12)||((p->pixel_type & AVS_CS_I420) == AVS_CS_I420); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_color_space(const AVS_VideoInfo * p, int c_space)
 | 
			
		||||
        { return ((p->pixel_type & c_space) == c_space); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_property(const AVS_VideoInfo * p, int property)
 | 
			
		||||
        { return ((p->pixel_type & property)==property ); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_planar(const AVS_VideoInfo * p)
 | 
			
		||||
        { return !!(p->pixel_type & AVS_CS_PLANAR); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_field_based(const AVS_VideoInfo * p)
 | 
			
		||||
        { return !!(p->image_type & AVS_IT_FIELDBASED); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_parity_known(const AVS_VideoInfo * p)
 | 
			
		||||
        { return ((p->image_type & AVS_IT_FIELDBASED)&&(p->image_type & (AVS_IT_BFF | AVS_IT_TFF))); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_bff(const AVS_VideoInfo * p)
 | 
			
		||||
        { return !!(p->image_type & AVS_IT_BFF); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_tff(const AVS_VideoInfo * p)
 | 
			
		||||
        { return !!(p->image_type & AVS_IT_TFF); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_bits_per_pixel(const AVS_VideoInfo * p)
 | 
			
		||||
{
 | 
			
		||||
  switch (p->pixel_type) {
 | 
			
		||||
      case AVS_CS_BGR24: return 24;
 | 
			
		||||
      case AVS_CS_BGR32: return 32;
 | 
			
		||||
      case AVS_CS_YUY2:  return 16;
 | 
			
		||||
      case AVS_CS_YV12:
 | 
			
		||||
      case AVS_CS_I420:  return 12;
 | 
			
		||||
      default:           return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
AVSC_INLINE int avs_bytes_from_pixels(const AVS_VideoInfo * p, int pixels)
 | 
			
		||||
        { return pixels * (avs_bits_per_pixel(p)>>3); }   // Will work on planar images, but will return only luma planes
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_row_size(const AVS_VideoInfo * p)
 | 
			
		||||
        { return avs_bytes_from_pixels(p,p->width); }  // Also only returns first plane on planar images
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_bmp_size(const AVS_VideoInfo * vi)
 | 
			
		||||
        { if (avs_is_planar(vi)) {int p = vi->height * ((avs_row_size(vi)+3) & ~3); p+=p>>1; return p;  } return vi->height * ((avs_row_size(vi)+3) & ~3); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_samples_per_second(const AVS_VideoInfo * p)
 | 
			
		||||
        { return p->audio_samples_per_second; }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_bytes_per_channel_sample(const AVS_VideoInfo * p)
 | 
			
		||||
{
 | 
			
		||||
    switch (p->sample_type) {
 | 
			
		||||
      case AVS_SAMPLE_INT8:  return sizeof(signed char);
 | 
			
		||||
      case AVS_SAMPLE_INT16: return sizeof(signed short);
 | 
			
		||||
      case AVS_SAMPLE_INT24: return 3;
 | 
			
		||||
      case AVS_SAMPLE_INT32: return sizeof(signed int);
 | 
			
		||||
      case AVS_SAMPLE_FLOAT: return sizeof(float);
 | 
			
		||||
      default: return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
AVSC_INLINE int avs_bytes_per_audio_sample(const AVS_VideoInfo * p)
 | 
			
		||||
        { return p->nchannels*avs_bytes_per_channel_sample(p);}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE INT64 avs_audio_samples_from_frames(const AVS_VideoInfo * p, INT64 frames)
 | 
			
		||||
        { return ((INT64)(frames) * p->audio_samples_per_second * p->fps_denominator / p->fps_numerator); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_frames_from_audio_samples(const AVS_VideoInfo * p, INT64 samples)
 | 
			
		||||
        { return (int)(samples * (INT64)p->fps_numerator / (INT64)p->fps_denominator / (INT64)p->audio_samples_per_second); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE INT64 avs_audio_samples_from_bytes(const AVS_VideoInfo * p, INT64 bytes)
 | 
			
		||||
        { return bytes / avs_bytes_per_audio_sample(p); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE INT64 avs_bytes_from_audio_samples(const AVS_VideoInfo * p, INT64 samples)
 | 
			
		||||
        { return samples * avs_bytes_per_audio_sample(p); }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_audio_channels(const AVS_VideoInfo * p)
 | 
			
		||||
        { return p->nchannels; }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_sample_type(const AVS_VideoInfo * p)
 | 
			
		||||
        { return p->sample_type;}
 | 
			
		||||
 | 
			
		||||
// useful mutator
 | 
			
		||||
AVSC_INLINE void avs_set_property(AVS_VideoInfo * p, int property)
 | 
			
		||||
        { p->image_type|=property; }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE void avs_clear_property(AVS_VideoInfo * p, int property)
 | 
			
		||||
        { p->image_type&=~property; }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE void avs_set_field_based(AVS_VideoInfo * p, int isfieldbased)
 | 
			
		||||
        { if (isfieldbased) p->image_type|=AVS_IT_FIELDBASED; else p->image_type&=~AVS_IT_FIELDBASED; }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE void avs_set_fps(AVS_VideoInfo * p, unsigned numerator, unsigned denominator)
 | 
			
		||||
{
 | 
			
		||||
    unsigned x=numerator, y=denominator;
 | 
			
		||||
    while (y) {   // find gcd
 | 
			
		||||
      unsigned t = x%y; x = y; y = t;
 | 
			
		||||
    }
 | 
			
		||||
    p->fps_numerator = numerator/x;
 | 
			
		||||
    p->fps_denominator = denominator/x;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_same_colorspace(AVS_VideoInfo * x, AVS_VideoInfo * y)
 | 
			
		||||
{
 | 
			
		||||
        return (x->pixel_type == y->pixel_type)
 | 
			
		||||
                || (avs_is_yv12(x) && avs_is_yv12(y));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// AVS_VideoFrame
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
// VideoFrameBuffer holds information about a memory block which is used
 | 
			
		||||
// for video data.  For efficiency, instances of this class are not deleted
 | 
			
		||||
// when the refcount reaches zero; instead they're stored in a linked list
 | 
			
		||||
// to be reused.  The instances are deleted when the corresponding AVS
 | 
			
		||||
// file is closed.
 | 
			
		||||
 | 
			
		||||
// AVS_VideoFrameBuffer is layed out identicly to VideoFrameBuffer
 | 
			
		||||
// DO NOT USE THIS STRUCTURE DIRECTLY
 | 
			
		||||
typedef struct AVS_VideoFrameBuffer {
 | 
			
		||||
  unsigned char * data;
 | 
			
		||||
  int data_size;
 | 
			
		||||
  // sequence_number is incremented every time the buffer is changed, so
 | 
			
		||||
  // that stale views can tell they're no longer valid.
 | 
			
		||||
  long sequence_number;
 | 
			
		||||
 | 
			
		||||
  long refcount;
 | 
			
		||||
} AVS_VideoFrameBuffer;
 | 
			
		||||
 | 
			
		||||
// VideoFrame holds a "window" into a VideoFrameBuffer.
 | 
			
		||||
 | 
			
		||||
// AVS_VideoFrame is layed out identicly to IVideoFrame
 | 
			
		||||
// DO NOT USE THIS STRUCTURE DIRECTLY
 | 
			
		||||
typedef struct AVS_VideoFrame {
 | 
			
		||||
  int refcount;
 | 
			
		||||
  AVS_VideoFrameBuffer * vfb;
 | 
			
		||||
  int offset, pitch, row_size, height, offsetU, offsetV, pitchUV;  // U&V offsets are from top of picture.
 | 
			
		||||
} AVS_VideoFrame;
 | 
			
		||||
 | 
			
		||||
// Access functions for AVS_VideoFrame
 | 
			
		||||
AVSC_INLINE int avs_get_pitch(const AVS_VideoFrame * p) {
 | 
			
		||||
        return p->pitch;}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_get_pitch_p(const AVS_VideoFrame * p, int plane) {
 | 
			
		||||
  switch (plane) {
 | 
			
		||||
  case AVS_PLANAR_U: case AVS_PLANAR_V: return p->pitchUV;}
 | 
			
		||||
  return p->pitch;}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_get_row_size(const AVS_VideoFrame * p) {
 | 
			
		||||
        return p->row_size; }
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_get_row_size_p(const AVS_VideoFrame * p, int plane) {
 | 
			
		||||
        int r;
 | 
			
		||||
    switch (plane) {
 | 
			
		||||
    case AVS_PLANAR_U: case AVS_PLANAR_V:
 | 
			
		||||
                if (p->pitchUV) return p->row_size>>1;
 | 
			
		||||
                else            return 0;
 | 
			
		||||
    case AVS_PLANAR_U_ALIGNED: case AVS_PLANAR_V_ALIGNED:
 | 
			
		||||
                if (p->pitchUV) {
 | 
			
		||||
                        r = ((p->row_size+AVS_FRAME_ALIGN-1)&(~(AVS_FRAME_ALIGN-1)) )>>1; // Aligned rowsize
 | 
			
		||||
                        if (r < p->pitchUV)
 | 
			
		||||
                                return r;
 | 
			
		||||
                        return p->row_size>>1;
 | 
			
		||||
                } else return 0;
 | 
			
		||||
    case AVS_PLANAR_Y_ALIGNED:
 | 
			
		||||
                r = (p->row_size+AVS_FRAME_ALIGN-1)&(~(AVS_FRAME_ALIGN-1)); // Aligned rowsize
 | 
			
		||||
                if (r <= p->pitch)
 | 
			
		||||
                        return r;
 | 
			
		||||
                return p->row_size;
 | 
			
		||||
    }
 | 
			
		||||
    return p->row_size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_get_height(const AVS_VideoFrame * p) {
 | 
			
		||||
        return p->height;}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_get_height_p(const AVS_VideoFrame * p, int plane) {
 | 
			
		||||
        switch (plane) {
 | 
			
		||||
                case AVS_PLANAR_U: case AVS_PLANAR_V:
 | 
			
		||||
                        if (p->pitchUV) return p->height>>1;
 | 
			
		||||
                        return 0;
 | 
			
		||||
        }
 | 
			
		||||
        return p->height;}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE const unsigned char* avs_get_read_ptr(const AVS_VideoFrame * p) {
 | 
			
		||||
        return p->vfb->data + p->offset;}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE const unsigned char* avs_get_read_ptr_p(const AVS_VideoFrame * p, int plane)
 | 
			
		||||
{
 | 
			
		||||
        switch (plane) {
 | 
			
		||||
                case AVS_PLANAR_U: return p->vfb->data + p->offsetU;
 | 
			
		||||
                case AVS_PLANAR_V: return p->vfb->data + p->offsetV;
 | 
			
		||||
                default:           return p->vfb->data + p->offset;}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_is_writable(const AVS_VideoFrame * p) {
 | 
			
		||||
        return (p->refcount == 1 && p->vfb->refcount == 1);}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE unsigned char* avs_get_write_ptr(const AVS_VideoFrame * p)
 | 
			
		||||
{
 | 
			
		||||
        if (avs_is_writable(p)) {
 | 
			
		||||
                ++p->vfb->sequence_number;
 | 
			
		||||
                return p->vfb->data + p->offset;
 | 
			
		||||
        } else
 | 
			
		||||
                return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE unsigned char* avs_get_write_ptr_p(const AVS_VideoFrame * p, int plane)
 | 
			
		||||
{
 | 
			
		||||
        if (plane==AVS_PLANAR_Y && avs_is_writable(p)) {
 | 
			
		||||
                ++p->vfb->sequence_number;
 | 
			
		||||
                return p->vfb->data + p->offset;
 | 
			
		||||
        } else if (plane==AVS_PLANAR_Y) {
 | 
			
		||||
                return 0;
 | 
			
		||||
        } else {
 | 
			
		||||
                switch (plane) {
 | 
			
		||||
                        case AVS_PLANAR_U: return p->vfb->data + p->offsetU;
 | 
			
		||||
                        case AVS_PLANAR_V: return p->vfb->data + p->offsetV;
 | 
			
		||||
                        default:       return p->vfb->data + p->offset;
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined __cplusplus
 | 
			
		||||
extern "C"
 | 
			
		||||
{
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
AVSC_API(void, avs_release_video_frame)(AVS_VideoFrame *);
 | 
			
		||||
// makes a shallow copy of a video frame
 | 
			
		||||
AVSC_API(AVS_VideoFrame *, avs_copy_video_frame)(AVS_VideoFrame *);
 | 
			
		||||
#if defined __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
 | 
			
		||||
#ifndef AVSC_NO_DECLSPEC
 | 
			
		||||
AVSC_INLINE void avs_release_frame(AVS_VideoFrame * f)
 | 
			
		||||
  {avs_release_video_frame(f);}
 | 
			
		||||
AVSC_INLINE AVS_VideoFrame * avs_copy_frame(AVS_VideoFrame * f)
 | 
			
		||||
  {return avs_copy_video_frame(f);}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// AVS_Value
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
// Treat AVS_Value as a fat pointer.  That is use avs_copy_value
 | 
			
		||||
// and avs_release_value appropiaty as you would if AVS_Value was
 | 
			
		||||
// a pointer.
 | 
			
		||||
 | 
			
		||||
// To maintain source code compatibility with future versions of the
 | 
			
		||||
// avisynth_c API don't use the AVS_Value directly.  Use the helper
 | 
			
		||||
// functions below.
 | 
			
		||||
 | 
			
		||||
// AVS_Value is layed out identicly to AVSValue
 | 
			
		||||
typedef struct AVS_Value AVS_Value;
 | 
			
		||||
struct AVS_Value {
 | 
			
		||||
  short type;  // 'a'rray, 'c'lip, 'b'ool, 'i'nt, 'f'loat, 's'tring, 'v'oid, or 'l'ong
 | 
			
		||||
               // for some function e'rror
 | 
			
		||||
  short array_size;
 | 
			
		||||
  union {
 | 
			
		||||
    void * clip; // do not use directly, use avs_take_clip
 | 
			
		||||
    char boolean;
 | 
			
		||||
    int integer;
 | 
			
		||||
    INT64 integer64; // match addition of __int64 to avxplugin.h
 | 
			
		||||
    float floating_pt;
 | 
			
		||||
    const char * string;
 | 
			
		||||
    const AVS_Value * array;
 | 
			
		||||
  } d;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// AVS_Value should be initilized with avs_void.
 | 
			
		||||
// Should also set to avs_void after the value is released
 | 
			
		||||
// with avs_copy_value.  Consider it the equalvent of setting
 | 
			
		||||
// a pointer to NULL
 | 
			
		||||
static const AVS_Value avs_void = {'v'};
 | 
			
		||||
 | 
			
		||||
AVSC_API(void, avs_copy_value)(AVS_Value * dest, AVS_Value src);
 | 
			
		||||
AVSC_API(void, avs_release_value)(AVS_Value);
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_defined(AVS_Value v) { return v.type != 'v'; }
 | 
			
		||||
AVSC_INLINE int avs_is_clip(AVS_Value v) { return v.type == 'c'; }
 | 
			
		||||
AVSC_INLINE int avs_is_bool(AVS_Value v) { return v.type == 'b'; }
 | 
			
		||||
AVSC_INLINE int avs_is_int(AVS_Value v) { return v.type == 'i'; }
 | 
			
		||||
AVSC_INLINE int avs_is_float(AVS_Value v) { return v.type == 'f' || v.type == 'i'; }
 | 
			
		||||
AVSC_INLINE int avs_is_string(AVS_Value v) { return v.type == 's'; }
 | 
			
		||||
AVSC_INLINE int avs_is_array(AVS_Value v) { return v.type == 'a'; }
 | 
			
		||||
AVSC_INLINE int avs_is_error(AVS_Value v) { return v.type == 'e'; }
 | 
			
		||||
 | 
			
		||||
#if defined __cplusplus
 | 
			
		||||
extern "C"
 | 
			
		||||
{
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
AVSC_API(AVS_Clip *, avs_take_clip)(AVS_Value, AVS_ScriptEnvironment *);
 | 
			
		||||
AVSC_API(void, avs_set_to_clip)(AVS_Value *, AVS_Clip *);
 | 
			
		||||
#if defined __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE int avs_as_bool(AVS_Value v)
 | 
			
		||||
        { return v.d.boolean; }
 | 
			
		||||
AVSC_INLINE int avs_as_int(AVS_Value v)
 | 
			
		||||
        { return v.d.integer; }
 | 
			
		||||
AVSC_INLINE const char * avs_as_string(AVS_Value v)
 | 
			
		||||
        { return avs_is_error(v) || avs_is_string(v) ? v.d.string : 0; }
 | 
			
		||||
AVSC_INLINE double avs_as_float(AVS_Value v)
 | 
			
		||||
        { return avs_is_int(v) ? v.d.integer : v.d.floating_pt; }
 | 
			
		||||
AVSC_INLINE const char * avs_as_error(AVS_Value v)
 | 
			
		||||
        { return avs_is_error(v) ? v.d.string : 0; }
 | 
			
		||||
AVSC_INLINE const AVS_Value * avs_as_array(AVS_Value v)
 | 
			
		||||
        { return v.d.array; }
 | 
			
		||||
AVSC_INLINE int avs_array_size(AVS_Value v)
 | 
			
		||||
        { return avs_is_array(v) ? v.array_size : 1; }
 | 
			
		||||
AVSC_INLINE AVS_Value avs_array_elt(AVS_Value v, int index)
 | 
			
		||||
        { return avs_is_array(v) ? v.d.array[index] : v; }
 | 
			
		||||
 | 
			
		||||
// only use these functions on am AVS_Value that does not already have
 | 
			
		||||
// an active value.  Remember, treat AVS_Value as a fat pointer.
 | 
			
		||||
AVSC_INLINE AVS_Value avs_new_value_bool(int v0)
 | 
			
		||||
        { AVS_Value v; v.type = 'b'; v.d.boolean = v0 == 0 ? 0 : 1; return v; }
 | 
			
		||||
AVSC_INLINE AVS_Value avs_new_value_int(int v0)
 | 
			
		||||
        { AVS_Value v; v.type = 'i'; v.d.integer = v0; return v; }
 | 
			
		||||
AVSC_INLINE AVS_Value avs_new_value_string(const char * v0)
 | 
			
		||||
        { AVS_Value v; v.type = 's'; v.d.string = v0; return v; }
 | 
			
		||||
AVSC_INLINE AVS_Value avs_new_value_float(float v0)
 | 
			
		||||
        { AVS_Value v; v.type = 'f'; v.d.floating_pt = v0; return v;}
 | 
			
		||||
AVSC_INLINE AVS_Value avs_new_value_error(const char * v0)
 | 
			
		||||
        { AVS_Value v; v.type = 'e'; v.d.string = v0; return v; }
 | 
			
		||||
#ifndef AVSC_NO_DECLSPEC
 | 
			
		||||
AVSC_INLINE AVS_Value avs_new_value_clip(AVS_Clip * v0)
 | 
			
		||||
        { AVS_Value v; avs_set_to_clip(&v, v0); return v; }
 | 
			
		||||
#endif
 | 
			
		||||
AVSC_INLINE AVS_Value avs_new_value_array(AVS_Value * v0, int size)
 | 
			
		||||
        { AVS_Value v; v.type = 'a'; v.d.array = v0; v.array_size = size; return v; }
 | 
			
		||||
 | 
			
		||||
/////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// AVS_Clip
 | 
			
		||||
//
 | 
			
		||||
#if defined __cplusplus
 | 
			
		||||
extern "C"
 | 
			
		||||
{
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
AVSC_API(void, avs_release_clip)(AVS_Clip *);
 | 
			
		||||
AVSC_API(AVS_Clip *, avs_copy_clip)(AVS_Clip *);
 | 
			
		||||
 | 
			
		||||
AVSC_API(const char *, avs_clip_get_error)(AVS_Clip *); // return 0 if no error
 | 
			
		||||
 | 
			
		||||
AVSC_API(const AVS_VideoInfo *, avs_get_video_info)(AVS_Clip *);
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_get_version)(AVS_Clip *);
 | 
			
		||||
 | 
			
		||||
AVSC_API(AVS_VideoFrame *, avs_get_frame)(AVS_Clip *, int n);
 | 
			
		||||
// The returned video frame must be released with avs_release_video_frame
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_get_parity)(AVS_Clip *, int n);
 | 
			
		||||
// return field parity if field_based, else parity of first field in frame
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_get_audio)(AVS_Clip *, void * buf,
 | 
			
		||||
                                  INT64 start, INT64 count);
 | 
			
		||||
// start and count are in samples
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_set_cache_hints)(AVS_Clip *,
 | 
			
		||||
                                        int cachehints, size_t frame_range);
 | 
			
		||||
#if defined __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
 | 
			
		||||
// This is the callback type used by avs_add_function
 | 
			
		||||
typedef AVS_Value (AVSC_CC * AVS_ApplyFunc)
 | 
			
		||||
                        (AVS_ScriptEnvironment *, AVS_Value args, void * user_data);
 | 
			
		||||
 | 
			
		||||
typedef struct AVS_FilterInfo AVS_FilterInfo;
 | 
			
		||||
struct AVS_FilterInfo
 | 
			
		||||
{
 | 
			
		||||
  // these members should not be modified outside of the AVS_ApplyFunc callback
 | 
			
		||||
  AVS_Clip * child;
 | 
			
		||||
  AVS_VideoInfo vi;
 | 
			
		||||
  AVS_ScriptEnvironment * env;
 | 
			
		||||
  AVS_VideoFrame * (AVSC_CC * get_frame)(AVS_FilterInfo *, int n);
 | 
			
		||||
  int (AVSC_CC * get_parity)(AVS_FilterInfo *, int n);
 | 
			
		||||
  int (AVSC_CC * get_audio)(AVS_FilterInfo *, void * buf,
 | 
			
		||||
                                  INT64 start, INT64 count);
 | 
			
		||||
  int (AVSC_CC * set_cache_hints)(AVS_FilterInfo *, int cachehints,
 | 
			
		||||
                                        int frame_range);
 | 
			
		||||
  void (AVSC_CC * free_filter)(AVS_FilterInfo *);
 | 
			
		||||
 | 
			
		||||
  // Should be set when ever there is an error to report.
 | 
			
		||||
  // It is cleared before any of the above methods are called
 | 
			
		||||
  const char * error;
 | 
			
		||||
  // this is to store whatever and may be modified at will
 | 
			
		||||
  void * user_data;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Create a new filter
 | 
			
		||||
// fi is set to point to the AVS_FilterInfo so that you can
 | 
			
		||||
//   modify it once it is initilized.
 | 
			
		||||
// store_child should generally be set to true.  If it is not
 | 
			
		||||
//    set than ALL methods (the function pointers) must be defined
 | 
			
		||||
// If it is set than you do not need to worry about freeing the child
 | 
			
		||||
//    clip.
 | 
			
		||||
#if defined __cplusplus
 | 
			
		||||
extern "C"
 | 
			
		||||
{
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
AVSC_API(AVS_Clip *, avs_new_c_filter)(AVS_ScriptEnvironment * e,
 | 
			
		||||
                                      AVS_FilterInfo * * fi,
 | 
			
		||||
                                      AVS_Value child, int store_child);
 | 
			
		||||
#if defined __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// AVS_ScriptEnvironment
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
// For GetCPUFlags.  These are backwards-compatible with those in VirtualDub.
 | 
			
		||||
enum {
 | 
			
		||||
                                /* slowest CPU to support extension */
 | 
			
		||||
  AVS_CPU_FORCE        = 0x01,   // N/A
 | 
			
		||||
  AVS_CPU_FPU          = 0x02,   // 386/486DX
 | 
			
		||||
  AVS_CPU_MMX          = 0x04,   // P55C, K6, PII
 | 
			
		||||
  AVS_CPU_INTEGER_SSE  = 0x08,   // PIII, Athlon
 | 
			
		||||
  AVS_CPU_SSE          = 0x10,   // PIII, Athlon XP/MP
 | 
			
		||||
  AVS_CPU_SSE2         = 0x20,   // PIV, Hammer
 | 
			
		||||
  AVS_CPU_3DNOW        = 0x40,   // K6-2
 | 
			
		||||
  AVS_CPU_3DNOW_EXT    = 0x80,   // Athlon
 | 
			
		||||
  AVS_CPU_X86_64       = 0xA0,   // Hammer (note: equiv. to 3DNow + SSE2,
 | 
			
		||||
                                 // which only Hammer will have anyway)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined __cplusplus
 | 
			
		||||
extern "C"
 | 
			
		||||
{
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
AVSC_API(const char *, avs_get_error)(AVS_ScriptEnvironment *); // return 0 if no error
 | 
			
		||||
 | 
			
		||||
AVSC_API(long, avs_get_cpu_flags)(AVS_ScriptEnvironment *);
 | 
			
		||||
AVSC_API(int, avs_check_version)(AVS_ScriptEnvironment *, int version);
 | 
			
		||||
 | 
			
		||||
AVSC_API(char *, avs_save_string)(AVS_ScriptEnvironment *, const char* s, int length);
 | 
			
		||||
AVSC_API(char *, avs_sprintf)(AVS_ScriptEnvironment *, const char * fmt, ...);
 | 
			
		||||
 | 
			
		||||
AVSC_API(char *, avs_vsprintf)(AVS_ScriptEnvironment *, const char * fmt, va_list val);
 | 
			
		||||
 // note: val is really a va_list; I hope everyone typedefs va_list to a pointer
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_add_function)(AVS_ScriptEnvironment *,
 | 
			
		||||
                                     const char * name, const char * params,
 | 
			
		||||
                                     AVS_ApplyFunc apply, void * user_data);
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_function_exists)(AVS_ScriptEnvironment *, const char * name);
 | 
			
		||||
 | 
			
		||||
AVSC_API(AVS_Value, avs_invoke)(AVS_ScriptEnvironment *, const char * name,
 | 
			
		||||
                               AVS_Value args, const char** arg_names);
 | 
			
		||||
// The returned value must be be released with avs_release_value
 | 
			
		||||
 | 
			
		||||
AVSC_API(AVS_Value, avs_get_var)(AVS_ScriptEnvironment *, const char* name);
 | 
			
		||||
// The returned value must be be released with avs_release_value
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_set_var)(AVS_ScriptEnvironment *, const char* name, AVS_Value val);
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_set_global_var)(AVS_ScriptEnvironment *, const char* name, const AVS_Value val);
 | 
			
		||||
 | 
			
		||||
//void avs_push_context(AVS_ScriptEnvironment *, int level=0);
 | 
			
		||||
//void avs_pop_context(AVS_ScriptEnvironment *);
 | 
			
		||||
 | 
			
		||||
AVSC_API(AVS_VideoFrame *, avs_new_video_frame_a)(AVS_ScriptEnvironment *,
 | 
			
		||||
                                          const AVS_VideoInfo * vi, int align);
 | 
			
		||||
// align should be at least 16
 | 
			
		||||
#if defined __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
 | 
			
		||||
#ifndef AVSC_NO_DECLSPEC
 | 
			
		||||
AVSC_INLINE
 | 
			
		||||
AVS_VideoFrame * avs_new_video_frame(AVS_ScriptEnvironment * env,
 | 
			
		||||
                                     const AVS_VideoInfo * vi)
 | 
			
		||||
  {return avs_new_video_frame_a(env,vi,AVS_FRAME_ALIGN);}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE
 | 
			
		||||
AVS_VideoFrame * avs_new_frame(AVS_ScriptEnvironment * env,
 | 
			
		||||
                               const AVS_VideoInfo * vi)
 | 
			
		||||
  {return avs_new_video_frame_a(env,vi,AVS_FRAME_ALIGN);}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined __cplusplus
 | 
			
		||||
extern "C"
 | 
			
		||||
{
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
AVSC_API(int, avs_make_writable)(AVS_ScriptEnvironment *, AVS_VideoFrame * * pvf);
 | 
			
		||||
 | 
			
		||||
AVSC_API(void, avs_bit_blt)(AVS_ScriptEnvironment *, unsigned char* dstp, int dst_pitch, const unsigned char* srcp, int src_pitch, int row_size, int height);
 | 
			
		||||
 | 
			
		||||
typedef void (AVSC_CC *AVS_ShutdownFunc)(void* user_data, AVS_ScriptEnvironment * env);
 | 
			
		||||
AVSC_API(void, avs_at_exit)(AVS_ScriptEnvironment *, AVS_ShutdownFunc function, void * user_data);
 | 
			
		||||
 | 
			
		||||
AVSC_API(AVS_VideoFrame *, avs_subframe)(AVS_ScriptEnvironment *, AVS_VideoFrame * src, int rel_offset, int new_pitch, int new_row_size, int new_height);
 | 
			
		||||
// The returned video frame must be be released
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_set_memory_max)(AVS_ScriptEnvironment *, int mem);
 | 
			
		||||
 | 
			
		||||
AVSC_API(int, avs_set_working_dir)(AVS_ScriptEnvironment *, const char * newdir);
 | 
			
		||||
 | 
			
		||||
// avisynth.dll exports this; it's a way to use it as a library, without
 | 
			
		||||
// writing an AVS script or without going through AVIFile.
 | 
			
		||||
AVSC_API(AVS_ScriptEnvironment *, avs_create_script_environment)(int version);
 | 
			
		||||
#if defined __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
 | 
			
		||||
// this symbol is the entry point for the plugin and must
 | 
			
		||||
// be defined
 | 
			
		||||
AVSC_EXPORT
 | 
			
		||||
const char * AVSC_CC avisynth_c_plugin_init(AVS_ScriptEnvironment* env);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if defined __cplusplus
 | 
			
		||||
extern "C"
 | 
			
		||||
{
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
AVSC_API(void, avs_delete_script_environment)(AVS_ScriptEnvironment *);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
AVSC_API(AVS_VideoFrame *, avs_subframe_planar)(AVS_ScriptEnvironment *, AVS_VideoFrame * src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV);
 | 
			
		||||
// The returned video frame must be be released
 | 
			
		||||
#if defined __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
 | 
			
		||||
#endif //__AVXSYNTH_C__
 | 
			
		||||
@@ -1,85 +0,0 @@
 | 
			
		||||
#ifndef __DATA_TYPE_CONVERSIONS_H__
 | 
			
		||||
#define __DATA_TYPE_CONVERSIONS_H__
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <wchar.h>
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
namespace avxsynth {
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
 | 
			
		||||
typedef int64_t __int64;
 | 
			
		||||
typedef int32_t __int32;
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
typedef bool BOOL;
 | 
			
		||||
#else
 | 
			
		||||
typedef uint32_t BOOL;
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
typedef void* HMODULE;
 | 
			
		||||
typedef void* LPVOID;
 | 
			
		||||
typedef void* PVOID;
 | 
			
		||||
typedef PVOID HANDLE;
 | 
			
		||||
typedef HANDLE HWND;
 | 
			
		||||
typedef HANDLE HINSTANCE;
 | 
			
		||||
typedef void* HDC;
 | 
			
		||||
typedef void* HBITMAP;
 | 
			
		||||
typedef void* HICON;
 | 
			
		||||
typedef void* HFONT;
 | 
			
		||||
typedef void* HGDIOBJ;
 | 
			
		||||
typedef void* HBRUSH;
 | 
			
		||||
typedef void* HMMIO;
 | 
			
		||||
typedef void* HACMSTREAM;
 | 
			
		||||
typedef void* HACMDRIVER;
 | 
			
		||||
typedef void* HIC;
 | 
			
		||||
typedef void* HACMOBJ;
 | 
			
		||||
typedef HACMSTREAM* LPHACMSTREAM;
 | 
			
		||||
typedef void* HACMDRIVERID;
 | 
			
		||||
typedef void* LPHACMDRIVER;
 | 
			
		||||
typedef unsigned char BYTE;
 | 
			
		||||
typedef BYTE* LPBYTE;
 | 
			
		||||
typedef char TCHAR;
 | 
			
		||||
typedef TCHAR* LPTSTR;
 | 
			
		||||
typedef const TCHAR* LPCTSTR;
 | 
			
		||||
typedef char* LPSTR;
 | 
			
		||||
typedef LPSTR LPOLESTR;
 | 
			
		||||
typedef const char* LPCSTR;
 | 
			
		||||
typedef LPCSTR LPCOLESTR;
 | 
			
		||||
typedef wchar_t WCHAR;
 | 
			
		||||
typedef unsigned short WORD;
 | 
			
		||||
typedef unsigned int UINT;
 | 
			
		||||
typedef UINT MMRESULT;
 | 
			
		||||
typedef uint32_t DWORD;
 | 
			
		||||
typedef DWORD COLORREF;
 | 
			
		||||
typedef DWORD FOURCC;
 | 
			
		||||
typedef DWORD HRESULT;
 | 
			
		||||
typedef DWORD* LPDWORD;
 | 
			
		||||
typedef DWORD* DWORD_PTR;
 | 
			
		||||
typedef int32_t LONG;
 | 
			
		||||
typedef int32_t* LONG_PTR;
 | 
			
		||||
typedef LONG_PTR LRESULT;
 | 
			
		||||
typedef uint32_t ULONG;
 | 
			
		||||
typedef uint32_t* ULONG_PTR;
 | 
			
		||||
//typedef __int64_t intptr_t;
 | 
			
		||||
typedef uint64_t _fsize_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Structures
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
typedef struct _GUID {
 | 
			
		||||
  DWORD Data1;
 | 
			
		||||
  WORD  Data2;
 | 
			
		||||
  WORD  Data3;
 | 
			
		||||
  BYTE  Data4[8];
 | 
			
		||||
} GUID;
 | 
			
		||||
 | 
			
		||||
typedef GUID REFIID;
 | 
			
		||||
typedef GUID CLSID;
 | 
			
		||||
typedef CLSID* LPCLSID;
 | 
			
		||||
typedef GUID IID;
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}; // namespace avxsynth
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
#endif //  __DATA_TYPE_CONVERSIONS_H__
 | 
			
		||||
@@ -1,77 +0,0 @@
 | 
			
		||||
#ifndef __WINDOWS2LINUX_H__
 | 
			
		||||
#define __WINDOWS2LINUX_H__
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * LINUX SPECIFIC DEFINITIONS
 | 
			
		||||
*/
 | 
			
		||||
//
 | 
			
		||||
// Data types conversions
 | 
			
		||||
//
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include "basicDataTypeConversions.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
namespace avxsynth {
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
//
 | 
			
		||||
// purposefully define the following MSFT definitions
 | 
			
		||||
// to mean nothing (as they do not mean anything on Linux)
 | 
			
		||||
//
 | 
			
		||||
#define __stdcall
 | 
			
		||||
#define __cdecl
 | 
			
		||||
#define noreturn
 | 
			
		||||
#define __declspec(x)
 | 
			
		||||
#define STDAPI       extern "C" HRESULT
 | 
			
		||||
#define STDMETHODIMP HRESULT __stdcall
 | 
			
		||||
#define STDMETHODIMP_(x) x __stdcall
 | 
			
		||||
 | 
			
		||||
#define STDMETHOD(x)    virtual HRESULT x
 | 
			
		||||
#define STDMETHOD_(a, x) virtual a x
 | 
			
		||||
 | 
			
		||||
#ifndef TRUE
 | 
			
		||||
#define TRUE  true
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef FALSE
 | 
			
		||||
#define FALSE false
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define S_OK                (0x00000000)
 | 
			
		||||
#define S_FALSE             (0x00000001)
 | 
			
		||||
#define E_NOINTERFACE       (0X80004002)
 | 
			
		||||
#define E_POINTER           (0x80004003)
 | 
			
		||||
#define E_FAIL              (0x80004005)
 | 
			
		||||
#define E_OUTOFMEMORY       (0x8007000E)
 | 
			
		||||
 | 
			
		||||
#define INVALID_HANDLE_VALUE    ((HANDLE)((LONG_PTR)-1))
 | 
			
		||||
#define FAILED(hr)              ((hr) & 0x80000000)
 | 
			
		||||
#define SUCCEEDED(hr)           (!FAILED(hr))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Functions
 | 
			
		||||
//
 | 
			
		||||
#define MAKEDWORD(a,b,c,d) ((a << 24) | (b << 16) | (c << 8) | (d))
 | 
			
		||||
#define MAKEWORD(a,b) ((a << 8) | (b))
 | 
			
		||||
 | 
			
		||||
#define lstrlen                             strlen
 | 
			
		||||
#define lstrcpy                             strcpy
 | 
			
		||||
#define lstrcmpi                            strcasecmp
 | 
			
		||||
#define _stricmp                            strcasecmp
 | 
			
		||||
#define InterlockedIncrement(x)             __sync_fetch_and_add((x), 1)
 | 
			
		||||
#define InterlockedDecrement(x)             __sync_fetch_and_sub((x), 1)
 | 
			
		||||
// Windows uses (new, old) ordering but GCC has (old, new)
 | 
			
		||||
#define InterlockedCompareExchange(x,y,z)   __sync_val_compare_and_swap(x,z,y)
 | 
			
		||||
 | 
			
		||||
#define UInt32x32To64(a, b)                 ( (uint64_t) ( ((uint64_t)((uint32_t)(a))) * ((uint32_t)(b))  ) )
 | 
			
		||||
#define Int64ShrlMod32(a, b)                ( (uint64_t) ( (uint64_t)(a) >> (b) ) )
 | 
			
		||||
#define Int32x32To64(a, b)                  ((__int64)(((__int64)((long)(a))) * ((long)(b))))
 | 
			
		||||
 | 
			
		||||
#define MulDiv(nNumber, nNumerator, nDenominator)   (int32_t) (((int64_t) (nNumber) * (int64_t) (nNumerator) + (int64_t) ((nDenominator)/2)) / (int64_t) (nDenominator))
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}; // namespace avxsynth
 | 
			
		||||
#endif // __cplusplus
 | 
			
		||||
 | 
			
		||||
#endif //  __WINDOWS2LINUX_H__
 | 
			
		||||
@@ -1,86 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This file was copied from the following newsgroup posting:
 | 
			
		||||
 *
 | 
			
		||||
 * Newsgroups: mod.std.unix
 | 
			
		||||
 * Subject: public domain AT&T getopt source
 | 
			
		||||
 * Date: 3 Nov 85 19:34:15 GMT
 | 
			
		||||
 *
 | 
			
		||||
 * Here's something you've all been waiting for:  the AT&T public domain
 | 
			
		||||
 * source for getopt(3).  It is the code which was given out at the 1985
 | 
			
		||||
 * UNIFORUM conference in Dallas.  I obtained it by electronic mail
 | 
			
		||||
 * directly from AT&T.  The people there assure me that it is indeed
 | 
			
		||||
 * in the public domain.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
static int opterr = 1;
 | 
			
		||||
static int optind = 1;
 | 
			
		||||
static int optopt;
 | 
			
		||||
static char *optarg;
 | 
			
		||||
 | 
			
		||||
#undef fprintf
 | 
			
		||||
 | 
			
		||||
static int getopt(int argc, char *argv[], char *opts)
 | 
			
		||||
{
 | 
			
		||||
    static int sp = 1;
 | 
			
		||||
    int c;
 | 
			
		||||
    char *cp;
 | 
			
		||||
 | 
			
		||||
    if (sp == 1) {
 | 
			
		||||
        if (optind >= argc ||
 | 
			
		||||
            argv[optind][0] != '-' || argv[optind][1] == '\0')
 | 
			
		||||
            return EOF;
 | 
			
		||||
        else if (!strcmp(argv[optind], "--")) {
 | 
			
		||||
            optind++;
 | 
			
		||||
            return EOF;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    optopt = c = argv[optind][sp];
 | 
			
		||||
    if (c == ':' || (cp = strchr(opts, c)) == NULL) {
 | 
			
		||||
        fprintf(stderr, ": illegal option -- %c\n", c);
 | 
			
		||||
        if (argv[optind][++sp] == '\0') {
 | 
			
		||||
            optind++;
 | 
			
		||||
            sp = 1;
 | 
			
		||||
        }
 | 
			
		||||
        return '?';
 | 
			
		||||
    }
 | 
			
		||||
    if (*++cp == ':') {
 | 
			
		||||
        if (argv[optind][sp+1] != '\0')
 | 
			
		||||
            optarg = &argv[optind++][sp+1];
 | 
			
		||||
        else if(++optind >= argc) {
 | 
			
		||||
            fprintf(stderr, ": option requires an argument -- %c\n", c);
 | 
			
		||||
            sp = 1;
 | 
			
		||||
            return '?';
 | 
			
		||||
        } else
 | 
			
		||||
            optarg = argv[optind++];
 | 
			
		||||
        sp = 1;
 | 
			
		||||
    } else {
 | 
			
		||||
        if (argv[optind][++sp] == '\0') {
 | 
			
		||||
            sp = 1;
 | 
			
		||||
            optind++;
 | 
			
		||||
        }
 | 
			
		||||
        optarg = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return c;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,71 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * C99-compatible snprintf() and vsnprintf() implementations
 | 
			
		||||
 * Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com>
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "compat/va_copy.h"
 | 
			
		||||
#include "libavutil/error.h"
 | 
			
		||||
 | 
			
		||||
#if defined(__MINGW32__)
 | 
			
		||||
#define EOVERFLOW EFBIG
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int avpriv_snprintf(char *s, size_t n, const char *fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
    va_list ap;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    va_start(ap, fmt);
 | 
			
		||||
    ret = avpriv_vsnprintf(s, n, fmt, ap);
 | 
			
		||||
    va_end(ap);
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int avpriv_vsnprintf(char *s, size_t n, const char *fmt,
 | 
			
		||||
                     va_list ap)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    va_list ap_copy;
 | 
			
		||||
 | 
			
		||||
    if (n == 0)
 | 
			
		||||
        return _vscprintf(fmt, ap);
 | 
			
		||||
    else if (n > INT_MAX)
 | 
			
		||||
        return AVERROR(EOVERFLOW);
 | 
			
		||||
 | 
			
		||||
    /* we use n - 1 here because if the buffer is not big enough, the MS
 | 
			
		||||
     * runtime libraries don't add a terminating zero at the end. MSDN
 | 
			
		||||
     * recommends to provide _snprintf/_vsnprintf() a buffer size that
 | 
			
		||||
     * is one less than the actual buffer, and zero it before calling
 | 
			
		||||
     * _snprintf/_vsnprintf() to workaround this problem.
 | 
			
		||||
     * See http://msdn.microsoft.com/en-us/library/1kt27hek(v=vs.80).aspx */
 | 
			
		||||
    memset(s, 0, n);
 | 
			
		||||
    va_copy(ap_copy, ap);
 | 
			
		||||
    ret = _vsnprintf(s, n - 1, fmt, ap_copy);
 | 
			
		||||
    va_end(ap_copy);
 | 
			
		||||
    if (ret == -1)
 | 
			
		||||
        ret = _vscprintf(fmt, ap);
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,38 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * C99-compatible snprintf() and vsnprintf() implementations
 | 
			
		||||
 * Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com>
 | 
			
		||||
 *
 | 
			
		||||
 * 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 COMPAT_SNPRINTF_H
 | 
			
		||||
#define COMPAT_SNPRINTF_H
 | 
			
		||||
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
int avpriv_snprintf(char *s, size_t n, const char *fmt, ...);
 | 
			
		||||
int avpriv_vsnprintf(char *s, size_t n, const char *fmt, va_list ap);
 | 
			
		||||
 | 
			
		||||
#undef snprintf
 | 
			
		||||
#undef _snprintf
 | 
			
		||||
#undef vsnprintf
 | 
			
		||||
#define snprintf avpriv_snprintf
 | 
			
		||||
#define _snprintf avpriv_snprintf
 | 
			
		||||
#define vsnprintf avpriv_vsnprintf
 | 
			
		||||
 | 
			
		||||
#endif /* COMPAT_SNPRINTF_H */
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
n=10
 | 
			
		||||
 | 
			
		||||
case "$1" in
 | 
			
		||||
    -n)  n=$2;      shift 2 ;;
 | 
			
		||||
    -n*) n=${1#-n}; shift   ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
exec sed ${n}q "$@"
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int plan9_main(int argc, char **argv);
 | 
			
		||||
 | 
			
		||||
#undef main
 | 
			
		||||
int main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    /* The setfcr() function in lib9 is broken, must use asm. */
 | 
			
		||||
#ifdef __i386
 | 
			
		||||
    short fcr;
 | 
			
		||||
    __asm__ volatile ("fstcw        %0 \n"
 | 
			
		||||
                      "or      $63, %0 \n"
 | 
			
		||||
                      "fldcw        %0 \n"
 | 
			
		||||
                      : "=m"(fcr));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    return plan9_main(argc, argv);
 | 
			
		||||
}
 | 
			
		||||
@@ -1,2 +0,0 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
exec awk "BEGIN { for (i = 2; i < ARGC; i++) printf \"$1\", ARGV[i] }" "$@"
 | 
			
		||||
@@ -1,93 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * C99-compatible strtod() implementation
 | 
			
		||||
 * Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com>
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#include "libavutil/avstring.h"
 | 
			
		||||
#include "libavutil/mathematics.h"
 | 
			
		||||
 | 
			
		||||
static char *check_nan_suffix(char *s)
 | 
			
		||||
{
 | 
			
		||||
    char *start = s;
 | 
			
		||||
 | 
			
		||||
    if (*s++ != '(')
 | 
			
		||||
        return start;
 | 
			
		||||
 | 
			
		||||
    while ((*s >= 'a' && *s <= 'z') || (*s >= 'A' && *s <= 'Z') ||
 | 
			
		||||
           (*s >= '0' && *s <= '9') ||  *s == '_')
 | 
			
		||||
        s++;
 | 
			
		||||
 | 
			
		||||
    return *s == ')' ? s + 1 : start;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef strtod
 | 
			
		||||
double strtod(const char *, char **);
 | 
			
		||||
 | 
			
		||||
double avpriv_strtod(const char *nptr, char **endptr)
 | 
			
		||||
{
 | 
			
		||||
    char *end;
 | 
			
		||||
    double res;
 | 
			
		||||
 | 
			
		||||
    /* Skip leading spaces */
 | 
			
		||||
    while (av_isspace(*nptr))
 | 
			
		||||
        nptr++;
 | 
			
		||||
 | 
			
		||||
    if (!av_strncasecmp(nptr, "infinity", 8)) {
 | 
			
		||||
        end = nptr + 8;
 | 
			
		||||
        res = INFINITY;
 | 
			
		||||
    } else if (!av_strncasecmp(nptr, "inf", 3)) {
 | 
			
		||||
        end = nptr + 3;
 | 
			
		||||
        res = INFINITY;
 | 
			
		||||
    } else if (!av_strncasecmp(nptr, "+infinity", 9)) {
 | 
			
		||||
        end = nptr + 9;
 | 
			
		||||
        res = INFINITY;
 | 
			
		||||
    } else if (!av_strncasecmp(nptr, "+inf", 4)) {
 | 
			
		||||
        end = nptr + 4;
 | 
			
		||||
        res = INFINITY;
 | 
			
		||||
    } else if (!av_strncasecmp(nptr, "-infinity", 9)) {
 | 
			
		||||
        end = nptr + 9;
 | 
			
		||||
        res = -INFINITY;
 | 
			
		||||
    } else if (!av_strncasecmp(nptr, "-inf", 4)) {
 | 
			
		||||
        end = nptr + 4;
 | 
			
		||||
        res = -INFINITY;
 | 
			
		||||
    } else if (!av_strncasecmp(nptr, "nan", 3)) {
 | 
			
		||||
        end = check_nan_suffix(nptr + 3);
 | 
			
		||||
        res = NAN;
 | 
			
		||||
    } else if (!av_strncasecmp(nptr, "+nan", 4) ||
 | 
			
		||||
               !av_strncasecmp(nptr, "-nan", 4)) {
 | 
			
		||||
        end = check_nan_suffix(nptr + 4);
 | 
			
		||||
        res = NAN;
 | 
			
		||||
    } else if (!av_strncasecmp(nptr, "0x", 2) ||
 | 
			
		||||
               !av_strncasecmp(nptr, "-0x", 3) ||
 | 
			
		||||
               !av_strncasecmp(nptr, "+0x", 3)) {
 | 
			
		||||
        /* FIXME this doesn't handle exponents, non-integers (float/double)
 | 
			
		||||
         * and numbers too large for long long */
 | 
			
		||||
        res = strtoll(nptr, &end, 16);
 | 
			
		||||
    } else {
 | 
			
		||||
        res = strtod(nptr, &end);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (endptr)
 | 
			
		||||
        *endptr = end;
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,30 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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 FFMPEG_COMPAT_TMS470_MATH_H
 | 
			
		||||
#define FFMPEG_COMPAT_TMS470_MATH_H
 | 
			
		||||
 | 
			
		||||
#include_next <math.h>
 | 
			
		||||
 | 
			
		||||
#undef INFINITY
 | 
			
		||||
#undef NAN
 | 
			
		||||
 | 
			
		||||
#define INFINITY (*(const float*)((const unsigned []){ 0x7f800000 }))
 | 
			
		||||
#define NAN      (*(const float*)((const unsigned []){ 0x7fc00000 }))
 | 
			
		||||
 | 
			
		||||
#endif /* FFMPEG_COMPAT_TMS470_MATH_H */
 | 
			
		||||
@@ -1,26 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * MSVC Compatible va_copy macro
 | 
			
		||||
 * Copyright (c) 2012 Derek Buitenhuis
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
 | 
			
		||||
#if !defined(va_copy) && defined(_MSC_VER)
 | 
			
		||||
#define va_copy(dst, src) ((dst) = (src))
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										761
									
								
								doc/APIchanges
									
									
									
									
									
								
							
							
						
						
									
										761
									
								
								doc/APIchanges
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										112
									
								
								doc/Makefile
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								doc/Makefile
									
									
									
									
									
								
							@@ -1,46 +1,25 @@
 | 
			
		||||
LIBRARIES-$(CONFIG_AVUTIL)     += libavutil
 | 
			
		||||
LIBRARIES-$(CONFIG_SWSCALE)    += libswscale
 | 
			
		||||
LIBRARIES-$(CONFIG_SWRESAMPLE) += libswresample
 | 
			
		||||
LIBRARIES-$(CONFIG_AVCODEC)    += libavcodec
 | 
			
		||||
LIBRARIES-$(CONFIG_AVFORMAT)   += libavformat
 | 
			
		||||
LIBRARIES-$(CONFIG_AVDEVICE)   += libavdevice
 | 
			
		||||
LIBRARIES-$(CONFIG_AVFILTER)   += libavfilter
 | 
			
		||||
 | 
			
		||||
COMPONENTS-$(CONFIG_AVUTIL)     += ffmpeg-utils
 | 
			
		||||
COMPONENTS-$(CONFIG_SWSCALE)    += ffmpeg-scaler
 | 
			
		||||
COMPONENTS-$(CONFIG_SWRESAMPLE) += ffmpeg-resampler
 | 
			
		||||
COMPONENTS-$(CONFIG_AVCODEC)    += ffmpeg-codecs ffmpeg-bitstream-filters
 | 
			
		||||
COMPONENTS-$(CONFIG_AVFORMAT)   += ffmpeg-formats ffmpeg-protocols
 | 
			
		||||
COMPONENTS-$(CONFIG_AVDEVICE)   += ffmpeg-devices
 | 
			
		||||
COMPONENTS-$(CONFIG_AVFILTER)   += ffmpeg-filters
 | 
			
		||||
 | 
			
		||||
MANPAGES1   = $(PROGS-yes:%=doc/%.1)    $(PROGS-yes:%=doc/%-all.1)    $(COMPONENTS-yes:%=doc/%.1)
 | 
			
		||||
MANPAGES3   = $(LIBRARIES-yes:%=doc/%.3)
 | 
			
		||||
MANPAGES    = $(MANPAGES1) $(MANPAGES3)
 | 
			
		||||
PODPAGES    = $(PROGS-yes:%=doc/%.pod)  $(PROGS-yes:%=doc/%-all.pod)  $(COMPONENTS-yes:%=doc/%.pod)  $(LIBRARIES-yes:%=doc/%.pod)
 | 
			
		||||
HTMLPAGES   = $(PROGS-yes:%=doc/%.html) $(PROGS-yes:%=doc/%-all.html) $(COMPONENTS-yes:%=doc/%.html) $(LIBRARIES-yes:%=doc/%.html) \
 | 
			
		||||
MANPAGES    = $(PROGS-yes:%=doc/%.1)
 | 
			
		||||
PODPAGES    = $(PROGS-yes:%=doc/%.pod)
 | 
			
		||||
HTMLPAGES   = $(PROGS-yes:%=doc/%.html)                                 \
 | 
			
		||||
              doc/developer.html                                        \
 | 
			
		||||
              doc/faq.html                                              \
 | 
			
		||||
              doc/fate.html                                             \
 | 
			
		||||
              doc/general.html                                          \
 | 
			
		||||
              doc/git-howto.html                                        \
 | 
			
		||||
              doc/nut.html                                              \
 | 
			
		||||
              doc/libavfilter.html                                      \
 | 
			
		||||
              doc/platform.html                                         \
 | 
			
		||||
              doc/syntax.html                                           \
 | 
			
		||||
 | 
			
		||||
TXTPAGES    = doc/fate.txt                                              \
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DOCS-$(CONFIG_HTMLPAGES) += $(HTMLPAGES)
 | 
			
		||||
DOCS-$(CONFIG_PODPAGES)  += $(PODPAGES)
 | 
			
		||||
DOCS-$(CONFIG_MANPAGES)  += $(MANPAGES)
 | 
			
		||||
DOCS-$(CONFIG_TXTPAGES)  += $(TXTPAGES)
 | 
			
		||||
DOCS = $(DOCS-yes)
 | 
			
		||||
DOCS = $(HTMLPAGES) $(MANPAGES) $(PODPAGES)
 | 
			
		||||
ifdef HAVE_MAKEINFO
 | 
			
		||||
DOCS += $(TXTPAGES)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
all-$(CONFIG_DOC): doc
 | 
			
		||||
all-$(CONFIG_DOC): documentation
 | 
			
		||||
 | 
			
		||||
doc: documentation
 | 
			
		||||
 | 
			
		||||
apidoc: doc/doxy/html
 | 
			
		||||
documentation: $(DOCS)
 | 
			
		||||
 | 
			
		||||
TEXIDEP = awk '/^@(verbatim)?include/ { printf "$@: $(@D)/%s\n", $$2 }' <$< >$(@:%=%.d)
 | 
			
		||||
@@ -50,88 +29,45 @@ doc/%.txt: doc/%.texi
 | 
			
		||||
	$(Q)$(TEXIDEP)
 | 
			
		||||
	$(M)makeinfo --force --no-headers -o $@ $< 2>/dev/null
 | 
			
		||||
 | 
			
		||||
doc/print_options.o: libavformat/options_table.h libavcodec/options_table.h
 | 
			
		||||
 | 
			
		||||
GENTEXI  = format codec
 | 
			
		||||
GENTEXI := $(GENTEXI:%=doc/avoptions_%.texi)
 | 
			
		||||
 | 
			
		||||
$(GENTEXI): TAG = GENTEXI
 | 
			
		||||
$(GENTEXI): doc/avoptions_%.texi: doc/print_options$(HOSTEXESUF)
 | 
			
		||||
$(GENTEXI): doc/avoptions_%.texi: doc/print_options
 | 
			
		||||
	$(M)doc/print_options $* > $@
 | 
			
		||||
 | 
			
		||||
doc/%.html: TAG = HTML
 | 
			
		||||
doc/%.html: doc/%.texi $(SRC_PATH)/doc/t2h.init $(GENTEXI)
 | 
			
		||||
	$(Q)$(TEXIDEP)
 | 
			
		||||
	$(M)texi2html -I doc -monolithic --D=config-not-all --init-file $(SRC_PATH)/doc/t2h.init --output $@ $<
 | 
			
		||||
 | 
			
		||||
doc/%-all.html: TAG = HTML
 | 
			
		||||
doc/%-all.html: doc/%.texi $(SRC_PATH)/doc/t2h.init $(GENTEXI)
 | 
			
		||||
	$(Q)$(TEXIDEP)
 | 
			
		||||
	$(M)texi2html -I doc -monolithic --D=config-all --init-file $(SRC_PATH)/doc/t2h.init --output $@ $<
 | 
			
		||||
	$(M)texi2html -I doc -monolithic --init-file $(SRC_PATH)/doc/t2h.init --output $@ $<
 | 
			
		||||
 | 
			
		||||
doc/%.pod: TAG = POD
 | 
			
		||||
doc/%.pod: doc/%.texi $(SRC_PATH)/doc/texi2pod.pl $(GENTEXI)
 | 
			
		||||
doc/%.pod: doc/%.texi $(GENTEXI)
 | 
			
		||||
	$(Q)$(TEXIDEP)
 | 
			
		||||
	$(M)perl $(SRC_PATH)/doc/texi2pod.pl -Dconfig-not-all=yes -Idoc $< $@
 | 
			
		||||
	$(M)$(SRC_PATH)/doc/texi2pod.pl -Idoc $< $@
 | 
			
		||||
 | 
			
		||||
doc/%-all.pod: TAG = POD
 | 
			
		||||
doc/%-all.pod: doc/%.texi $(SRC_PATH)/doc/texi2pod.pl $(GENTEXI)
 | 
			
		||||
	$(Q)$(TEXIDEP)
 | 
			
		||||
	$(M)perl $(SRC_PATH)/doc/texi2pod.pl -Dconfig-all=yes -Idoc $< $@
 | 
			
		||||
 | 
			
		||||
doc/%.1 doc/%.3: TAG = MAN
 | 
			
		||||
doc/%.1: TAG = MAN
 | 
			
		||||
doc/%.1: doc/%.pod $(GENTEXI)
 | 
			
		||||
	$(M)pod2man --section=1 --center=" " --release=" " $< > $@
 | 
			
		||||
doc/%.3: doc/%.pod $(GENTEXI)
 | 
			
		||||
	$(M)pod2man --section=3 --center=" " --release=" " $< > $@
 | 
			
		||||
 | 
			
		||||
$(DOCS) doc/doxy/html: | doc/
 | 
			
		||||
$(DOCS): | doc/
 | 
			
		||||
 | 
			
		||||
doc/doxy/html: $(SRC_PATH)/doc/Doxyfile $(INSTHEADERS)
 | 
			
		||||
	$(M)$(SRC_PATH)/doc/doxy-wrapper.sh $(SRC_PATH) $^
 | 
			
		||||
 | 
			
		||||
install-doc: install-html install-man
 | 
			
		||||
 | 
			
		||||
install-html:
 | 
			
		||||
 | 
			
		||||
install-man:
 | 
			
		||||
 | 
			
		||||
ifdef CONFIG_HTMLPAGES
 | 
			
		||||
install-progs-$(CONFIG_DOC): install-html
 | 
			
		||||
 | 
			
		||||
install-html: $(HTMLPAGES)
 | 
			
		||||
	$(Q)mkdir -p "$(DOCDIR)"
 | 
			
		||||
	$(INSTALL) -m 644 $(HTMLPAGES) "$(DOCDIR)"
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifdef CONFIG_MANPAGES
 | 
			
		||||
install-progs-$(CONFIG_DOC): install-man
 | 
			
		||||
 | 
			
		||||
install-man: $(MANPAGES)
 | 
			
		||||
	$(Q)mkdir -p "$(MANDIR)/man1"
 | 
			
		||||
	$(INSTALL) -m 644 $(MANPAGES1) "$(MANDIR)/man1"
 | 
			
		||||
	$(Q)mkdir -p "$(MANDIR)/man3"
 | 
			
		||||
	$(INSTALL) -m 644 $(MANPAGES3) "$(MANDIR)/man3"
 | 
			
		||||
endif
 | 
			
		||||
	$(INSTALL) -m 644 $(MANPAGES) "$(MANDIR)/man1"
 | 
			
		||||
 | 
			
		||||
uninstall: uninstall-doc
 | 
			
		||||
 | 
			
		||||
uninstall-doc: uninstall-html uninstall-man
 | 
			
		||||
 | 
			
		||||
uninstall-html:
 | 
			
		||||
	$(RM) -r "$(DOCDIR)"
 | 
			
		||||
uninstall: uninstall-man
 | 
			
		||||
 | 
			
		||||
uninstall-man:
 | 
			
		||||
	$(RM) $(addprefix "$(MANDIR)/man1/",$(PROGS-yes:%=%.1) $(PROGS-yes:%=%-all.1) $(COMPONENTS-yes:%=%.1))
 | 
			
		||||
	$(RM) $(addprefix "$(MANDIR)/man3/",$(LIBRARIES-yes:%=%.3))
 | 
			
		||||
	$(RM) $(addprefix "$(MANDIR)/man1/",$(ALLMANPAGES))
 | 
			
		||||
 | 
			
		||||
clean:: docclean
 | 
			
		||||
 | 
			
		||||
distclean:: docclean
 | 
			
		||||
	$(RM) doc/config.texi
 | 
			
		||||
 | 
			
		||||
docclean:
 | 
			
		||||
	$(RM) $(TXTPAGES) doc/*.html doc/*.pod doc/*.1 doc/*.3 $(CLEANSUFFIXES:%=doc/%) doc/avoptions_*.texi
 | 
			
		||||
	$(RM) -r doc/doxy/html
 | 
			
		||||
clean::
 | 
			
		||||
	$(RM) $(TXTPAGES) doc/*.html doc/*.pod doc/*.1 $(CLEANSUFFIXES:%=doc/%) doc/avoptions_*.texi
 | 
			
		||||
 | 
			
		||||
-include $(wildcard $(DOCS:%=%.d))
 | 
			
		||||
 | 
			
		||||
.PHONY: apidoc doc documentation
 | 
			
		||||
.PHONY: documentation
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
Release Notes
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
* 2.1 "Fourier"  October, 2013
 | 
			
		||||
* 0.11 "Happiness"  May, 2012
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
General notes
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +0,0 @@
 | 
			
		||||
@chapter Authors
 | 
			
		||||
 | 
			
		||||
The FFmpeg developers.
 | 
			
		||||
 | 
			
		||||
For details about the authorship, see the Git history of the project
 | 
			
		||||
(git://source.ffmpeg.org/ffmpeg), e.g. by typing the command
 | 
			
		||||
@command{git log} in the FFmpeg source directory, or browsing the
 | 
			
		||||
online repository at @url{http://source.ffmpeg.org}.
 | 
			
		||||
 | 
			
		||||
Maintainers for the specific components are listed in the file
 | 
			
		||||
@file{MAINTAINERS} in the source code tree.
 | 
			
		||||
							
								
								
									
										182
									
								
								doc/avtools-common-opts.texi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								doc/avtools-common-opts.texi
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,182 @@
 | 
			
		||||
All the numerical options, if not specified otherwise, accept in input
 | 
			
		||||
a string representing a number, which may contain one of the
 | 
			
		||||
International System number postfixes, for example 'K', 'M', 'G'.
 | 
			
		||||
If 'i' is appended after the postfix, powers of 2 are used instead of
 | 
			
		||||
powers of 10. The 'B' postfix multiplies the value for 8, and can be
 | 
			
		||||
appended after another postfix or used alone. This allows using for
 | 
			
		||||
example 'KB', 'MiB', 'G' and 'B' as postfix.
 | 
			
		||||
 | 
			
		||||
Options which do not take arguments are boolean options, and set the
 | 
			
		||||
corresponding value to true. They can be set to false by prefixing
 | 
			
		||||
with "no" the option name, for example using "-nofoo" in the
 | 
			
		||||
command line will set to false the boolean option with name "foo".
 | 
			
		||||
 | 
			
		||||
@anchor{Stream specifiers}
 | 
			
		||||
@section Stream specifiers
 | 
			
		||||
Some options are applied per-stream, e.g. bitrate or codec. Stream specifiers
 | 
			
		||||
are used to precisely specify which stream(s) does a given option belong to.
 | 
			
		||||
 | 
			
		||||
A stream specifier is a string generally appended to the option name and
 | 
			
		||||
separated from it by a colon. E.g. @code{-codec:a:1 ac3} option contains
 | 
			
		||||
@code{a:1} stream specifer, which matches the second audio stream. Therefore it
 | 
			
		||||
would select the ac3 codec for the second audio stream.
 | 
			
		||||
 | 
			
		||||
A stream specifier can match several stream, the option is then applied to all
 | 
			
		||||
of them. E.g. the stream specifier in @code{-b:a 128k} matches all audio
 | 
			
		||||
streams.
 | 
			
		||||
 | 
			
		||||
An empty stream specifier matches all streams, for example @code{-codec copy}
 | 
			
		||||
or @code{-codec: copy} would copy all the streams without reencoding.
 | 
			
		||||
 | 
			
		||||
Possible forms of stream specifiers are:
 | 
			
		||||
@table @option
 | 
			
		||||
@item @var{stream_index}
 | 
			
		||||
Matches the stream with this index. E.g. @code{-threads:1 4} would set the
 | 
			
		||||
thread count for the second stream to 4.
 | 
			
		||||
@item @var{stream_type}[:@var{stream_index}]
 | 
			
		||||
@var{stream_type} is one of: 'v' for video, 'a' for audio, 's' for subtitle,
 | 
			
		||||
'd' for data and 't' for attachments. If @var{stream_index} is given, then
 | 
			
		||||
matches stream number @var{stream_index} of this type. Otherwise matches all
 | 
			
		||||
streams of this type.
 | 
			
		||||
@item p:@var{program_id}[:@var{stream_index}]
 | 
			
		||||
If @var{stream_index} is given, then matches stream number @var{stream_index} in
 | 
			
		||||
program with id @var{program_id}. Otherwise matches all streams in this program.
 | 
			
		||||
@item #@var{stream_id}
 | 
			
		||||
Matches the stream by format-specific ID.
 | 
			
		||||
@end table
 | 
			
		||||
@section Generic options
 | 
			
		||||
 | 
			
		||||
These options are shared amongst the av* tools.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item -L
 | 
			
		||||
Show license.
 | 
			
		||||
 | 
			
		||||
@item -h, -?, -help, --help
 | 
			
		||||
Show help.
 | 
			
		||||
 | 
			
		||||
@item -version
 | 
			
		||||
Show version.
 | 
			
		||||
 | 
			
		||||
@item -formats
 | 
			
		||||
Show available formats.
 | 
			
		||||
 | 
			
		||||
The fields preceding the format names have the following meanings:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item D
 | 
			
		||||
Decoding available
 | 
			
		||||
@item E
 | 
			
		||||
Encoding available
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item -codecs
 | 
			
		||||
Show available codecs.
 | 
			
		||||
 | 
			
		||||
The fields preceding the codec names have the following meanings:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item D
 | 
			
		||||
Decoding available
 | 
			
		||||
@item E
 | 
			
		||||
Encoding available
 | 
			
		||||
@item V/A/S
 | 
			
		||||
Video/audio/subtitle codec
 | 
			
		||||
@item S
 | 
			
		||||
Codec supports slices
 | 
			
		||||
@item D
 | 
			
		||||
Codec supports direct rendering
 | 
			
		||||
@item T
 | 
			
		||||
Codec can handle input truncated at random locations instead of only at frame boundaries
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item -bsfs
 | 
			
		||||
Show available bitstream filters.
 | 
			
		||||
 | 
			
		||||
@item -protocols
 | 
			
		||||
Show available protocols.
 | 
			
		||||
 | 
			
		||||
@item -filters
 | 
			
		||||
Show available libavfilter filters.
 | 
			
		||||
 | 
			
		||||
@item -pix_fmts
 | 
			
		||||
Show available pixel formats.
 | 
			
		||||
 | 
			
		||||
@item -sample_fmts
 | 
			
		||||
Show available sample formats.
 | 
			
		||||
 | 
			
		||||
@item -loglevel @var{loglevel} | -v @var{loglevel}
 | 
			
		||||
Set the logging level used by the library.
 | 
			
		||||
@var{loglevel} is a number or a string containing one of the following values:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item quiet
 | 
			
		||||
@item panic
 | 
			
		||||
@item fatal
 | 
			
		||||
@item error
 | 
			
		||||
@item warning
 | 
			
		||||
@item info
 | 
			
		||||
@item verbose
 | 
			
		||||
@item debug
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
By default the program logs to stderr, if coloring is supported by the
 | 
			
		||||
terminal, colors are used to mark errors and warnings. Log coloring
 | 
			
		||||
can be disabled setting the environment variable
 | 
			
		||||
@env{AV_LOG_FORCE_NOCOLOR} or @env{NO_COLOR}, or can be forced setting
 | 
			
		||||
the environment variable @env{AV_LOG_FORCE_COLOR}.
 | 
			
		||||
The use of the environment variable @env{NO_COLOR} is deprecated and
 | 
			
		||||
will be dropped in a following FFmpeg version.
 | 
			
		||||
 | 
			
		||||
@item -report
 | 
			
		||||
Dump full command line and console output to a file named
 | 
			
		||||
@code{@var{program}-@var{YYYYMMDD}-@var{HHMMSS}.log} in the current
 | 
			
		||||
directory.
 | 
			
		||||
This file can be useful for bug reports.
 | 
			
		||||
It also implies @code{-loglevel verbose}.
 | 
			
		||||
 | 
			
		||||
Note: setting the environment variable @code{FFREPORT} to any value has the
 | 
			
		||||
same effect.
 | 
			
		||||
 | 
			
		||||
@item -cpuflags flags (@emph{global})
 | 
			
		||||
Allows setting and clearing cpu flags. This option is intended
 | 
			
		||||
for testing. Do not use it unless you know what you're doing.
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -cpuflags -sse+mmx ...
 | 
			
		||||
ffmpeg -cpuflags mmx ...
 | 
			
		||||
ffmpeg -cpuflags 0 ...
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section AVOptions
 | 
			
		||||
 | 
			
		||||
These options are provided directly by the libavformat, libavdevice and
 | 
			
		||||
libavcodec libraries. To see the list of available AVOptions, use the
 | 
			
		||||
@option{-help} option. They are separated into two categories:
 | 
			
		||||
@table @option
 | 
			
		||||
@item generic
 | 
			
		||||
These options can be set for any container, codec or device. Generic options
 | 
			
		||||
are listed under AVFormatContext options for containers/devices and under
 | 
			
		||||
AVCodecContext options for codecs.
 | 
			
		||||
@item private
 | 
			
		||||
These options are specific to the given container, device or codec. Private
 | 
			
		||||
options are listed under their corresponding containers/devices/codecs.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
For example to write an ID3v2.3 header instead of a default ID3v2.4 to
 | 
			
		||||
an MP3 file, use the @option{id3v2_version} private option of the MP3
 | 
			
		||||
muxer:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i input.flac -id3v2_version 3 out.mp3
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
All codec AVOptions are obviously per-stream, so the chapter on stream
 | 
			
		||||
specifiers applies to them
 | 
			
		||||
 | 
			
		||||
Note @option{-nooption} syntax cannot be used for boolean AVOptions,
 | 
			
		||||
use @option{-option 0}/@option{-option 1}.
 | 
			
		||||
 | 
			
		||||
Note2 old undocumented way of specifying per-stream AVOptions by prepending
 | 
			
		||||
v/a/s to the options name is now obsolete and will be removed soon.
 | 
			
		||||
 | 
			
		||||
@include avoptions_codec.texi
 | 
			
		||||
@include avoptions_format.texi
 | 
			
		||||
@@ -17,46 +17,9 @@ Below is a description of the currently available bitstream filters.
 | 
			
		||||
 | 
			
		||||
@section aac_adtstoasc
 | 
			
		||||
 | 
			
		||||
Convert MPEG-2/4 AAC ADTS to MPEG-4 Audio Specific Configuration
 | 
			
		||||
bitstream filter.
 | 
			
		||||
 | 
			
		||||
This filter creates an MPEG-4 AudioSpecificConfig from an MPEG-2/4
 | 
			
		||||
ADTS header and removes the ADTS header.
 | 
			
		||||
 | 
			
		||||
This is required for example when copying an AAC stream from a raw
 | 
			
		||||
ADTS AAC container to a FLV or a MOV/MP4 file.
 | 
			
		||||
 | 
			
		||||
@section chomp
 | 
			
		||||
 | 
			
		||||
Remove zero padding at the end of a packet.
 | 
			
		||||
 | 
			
		||||
@section dump_extra
 | 
			
		||||
 | 
			
		||||
Add extradata to the beginning of the filtered packets.
 | 
			
		||||
 | 
			
		||||
The additional argument specifies which packets should be filtered.
 | 
			
		||||
It accepts the values:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item a
 | 
			
		||||
add extradata to all key packets, but only if @var{local_header} is
 | 
			
		||||
set in the @option{flags2} codec context field
 | 
			
		||||
 | 
			
		||||
@item k
 | 
			
		||||
add extradata to all key packets
 | 
			
		||||
 | 
			
		||||
@item e
 | 
			
		||||
add extradata to all packets
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
If not specified it is assumed @samp{k}.
 | 
			
		||||
 | 
			
		||||
For example the following @command{ffmpeg} command forces a global
 | 
			
		||||
header (thus disabling individual packet headers) in the H.264 packets
 | 
			
		||||
generated by the @code{libx264} encoder, but corrects them by adding
 | 
			
		||||
the header stored in extradata to the key packets:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -map 0 -flags:v +global_header -c:v libx264 -bsf:v dump_extra out.ts
 | 
			
		||||
@end example
 | 
			
		||||
@section dump_extradata
 | 
			
		||||
 | 
			
		||||
@section h264_mp4toannexb
 | 
			
		||||
 | 
			
		||||
@@ -123,6 +86,6 @@ ffmpeg -i frame_%d.jpg -c:v copy rotated.avi
 | 
			
		||||
 | 
			
		||||
@section noise
 | 
			
		||||
 | 
			
		||||
@section remove_extra
 | 
			
		||||
@section remove_extradata
 | 
			
		||||
 | 
			
		||||
@c man end BITSTREAM FILTERS
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1087
									
								
								doc/codecs.texi
									
									
									
									
									
								
							
							
						
						
									
										1087
									
								
								doc/codecs.texi
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -60,143 +60,4 @@ This decoder generates wave patterns according to predefined sequences. Its
 | 
			
		||||
use is purely internal and the format of the data it accepts is not publicly
 | 
			
		||||
documented.
 | 
			
		||||
 | 
			
		||||
@section libcelt
 | 
			
		||||
 | 
			
		||||
libcelt decoder wrapper.
 | 
			
		||||
 | 
			
		||||
libcelt allows libavcodec to decode the Xiph CELT ultra-low delay audio codec.
 | 
			
		||||
Requires the presence of the libcelt headers and library during configuration.
 | 
			
		||||
You need to explicitly configure the build with @code{--enable-libcelt}.
 | 
			
		||||
 | 
			
		||||
@section libgsm
 | 
			
		||||
 | 
			
		||||
libgsm decoder wrapper.
 | 
			
		||||
 | 
			
		||||
libgsm allows libavcodec to decode the GSM full rate audio codec. Requires
 | 
			
		||||
the presence of the libgsm headers and library during configuration. You need
 | 
			
		||||
to explicitly configure the build with @code{--enable-libgsm}.
 | 
			
		||||
 | 
			
		||||
This decoder supports both the ordinary GSM and the Microsoft variant.
 | 
			
		||||
 | 
			
		||||
@section libilbc
 | 
			
		||||
 | 
			
		||||
libilbc decoder wrapper.
 | 
			
		||||
 | 
			
		||||
libilbc allows libavcodec to decode the Internet Low Bitrate Codec (iLBC)
 | 
			
		||||
audio codec. Requires the presence of the libilbc headers and library during
 | 
			
		||||
configuration. You need to explicitly configure the build with
 | 
			
		||||
@code{--enable-libilbc}.
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
The following option is supported by the libilbc wrapper.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item enhance
 | 
			
		||||
 | 
			
		||||
Enable the enhancement of the decoded audio when set to 1. The default
 | 
			
		||||
value is 0 (disabled).
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section libopencore-amrnb
 | 
			
		||||
 | 
			
		||||
libopencore-amrnb decoder wrapper.
 | 
			
		||||
 | 
			
		||||
libopencore-amrnb allows libavcodec to decode the Adaptive Multi-Rate
 | 
			
		||||
Narrowband audio codec. Using it requires the presence of the
 | 
			
		||||
libopencore-amrnb headers and library during configuration. You need to
 | 
			
		||||
explicitly configure the build with @code{--enable-libopencore-amrnb}.
 | 
			
		||||
 | 
			
		||||
An FFmpeg native decoder for AMR-NB exists, so users can decode AMR-NB
 | 
			
		||||
without this library.
 | 
			
		||||
 | 
			
		||||
@section libopencore-amrwb
 | 
			
		||||
 | 
			
		||||
libopencore-amrwb decoder wrapper.
 | 
			
		||||
 | 
			
		||||
libopencore-amrwb allows libavcodec to decode the Adaptive Multi-Rate
 | 
			
		||||
Wideband audio codec. Using it requires the presence of the
 | 
			
		||||
libopencore-amrwb headers and library during configuration. You need to
 | 
			
		||||
explicitly configure the build with @code{--enable-libopencore-amrwb}.
 | 
			
		||||
 | 
			
		||||
An FFmpeg native decoder for AMR-WB exists, so users can decode AMR-WB
 | 
			
		||||
without this library.
 | 
			
		||||
 | 
			
		||||
@section libopus
 | 
			
		||||
 | 
			
		||||
libopus decoder wrapper.
 | 
			
		||||
 | 
			
		||||
libopus allows libavcodec to decode the Opus Interactive Audio Codec.
 | 
			
		||||
Requires the presence of the libopus headers and library during
 | 
			
		||||
configuration. You need to explicitly configure the build with
 | 
			
		||||
@code{--enable-libopus}.
 | 
			
		||||
 | 
			
		||||
@c man end AUDIO DECODERS
 | 
			
		||||
 | 
			
		||||
@chapter Subtitles Decoders
 | 
			
		||||
@c man begin SUBTILES DECODERS
 | 
			
		||||
 | 
			
		||||
@section dvdsub
 | 
			
		||||
 | 
			
		||||
This codec decodes the bitmap subtitles used in DVDs; the same subtitles can
 | 
			
		||||
also be found in VobSub file pairs and in some Matroska files.
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item palette
 | 
			
		||||
Specify the global palette used by the bitmaps. When stored in VobSub, the
 | 
			
		||||
palette is normally specified in the index file; in Matroska, the palette is
 | 
			
		||||
stored in the codec extra-data in the same format as in VobSub. In DVDs, the
 | 
			
		||||
palette is stored in the IFO file, and therefore not available when reading
 | 
			
		||||
from dumped VOB files.
 | 
			
		||||
 | 
			
		||||
The format for this option is a string containing 16 24-bits hexadecimal
 | 
			
		||||
numbers (without 0x prefix) separated by comas, for example @code{0d00ee,
 | 
			
		||||
ee450d, 101010, eaeaea, 0ce60b, ec14ed, ebff0b, 0d617a, 7b7b7b, d1d1d1,
 | 
			
		||||
7b2a0e, 0d950c, 0f007b, cf0dec, cfa80c, 7c127b}.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section libzvbi-teletext
 | 
			
		||||
 | 
			
		||||
Libzvbi allows libavcodec to decode DVB teletext pages and DVB teletext
 | 
			
		||||
subtitles. Requires the presence of the libzvbi headers and library during
 | 
			
		||||
configuration. You need to explicitly configure the build with
 | 
			
		||||
@code{--enable-libzvbi}.
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item txt_page
 | 
			
		||||
List of teletext page numbers to decode. You may use the special * string to
 | 
			
		||||
match all pages. Pages that do not match the specified list are dropped.
 | 
			
		||||
Default value is *.
 | 
			
		||||
@item txt_chop_top
 | 
			
		||||
Discards the top teletext line. Default value is 1.
 | 
			
		||||
@item txt_format
 | 
			
		||||
Specifies the format of the decoded subtitles. The teletext decoder is capable
 | 
			
		||||
of decoding the teletext pages to bitmaps or to simple text, you should use
 | 
			
		||||
"bitmap" for teletext pages, because certain graphics and colors cannot be
 | 
			
		||||
expressed in simple text. You might use "text" for teletext based subtitles if
 | 
			
		||||
your application can handle simple text based subtitles. Default value is
 | 
			
		||||
bitmap.
 | 
			
		||||
@item txt_left
 | 
			
		||||
X offset of generated bitmaps, default is 0.
 | 
			
		||||
@item txt_top
 | 
			
		||||
Y offset of generated bitmaps, default is 0.
 | 
			
		||||
@item txt_chop_spaces
 | 
			
		||||
Chops leading and trailing spaces and removes empty lines from the generated
 | 
			
		||||
text. This option is useful for teletext based subtitles where empty spaces may
 | 
			
		||||
be present at the start or at the end of the lines or empty lines may be
 | 
			
		||||
present between the subtitle lines because of double-sized teletext charactes.
 | 
			
		||||
Default value is 1.
 | 
			
		||||
@item txt_duration
 | 
			
		||||
Sets the display duration of the decoded teletext pages or subtitles in
 | 
			
		||||
miliseconds. Default value is 30000 which is 30 seconds.
 | 
			
		||||
@item txt_transparent
 | 
			
		||||
Force transparent background of the generated teletext bitmaps. Default value
 | 
			
		||||
is 0 which means an opaque (black) background.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@c man end SUBTILES DECODERS
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										165
									
								
								doc/default.css
									
									
									
									
									
								
							
							
						
						
									
										165
									
								
								doc/default.css
									
									
									
									
									
								
							@@ -1,165 +0,0 @@
 | 
			
		||||
a.summary-letter {
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a {
 | 
			
		||||
    color: #2D6198;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a:visited {
 | 
			
		||||
    color: #884488;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#banner {
 | 
			
		||||
    background-color: white;
 | 
			
		||||
    position: relative;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#banner img {
 | 
			
		||||
    padding-bottom: 1px;
 | 
			
		||||
    padding-top: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#body {
 | 
			
		||||
    margin-left: 1em;
 | 
			
		||||
    margin-right: 1em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body {
 | 
			
		||||
    background-color: #313131;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    text-align: justify;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.center {
 | 
			
		||||
    margin-left: auto;
 | 
			
		||||
    margin-right: auto;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#container {
 | 
			
		||||
    background-color: white;
 | 
			
		||||
    color: #202020;
 | 
			
		||||
    margin-left: 1em;
 | 
			
		||||
    margin-right: 1em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#footer {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h1 a, h2 a, h3 a, h4 a {
 | 
			
		||||
    text-decoration: inherit;
 | 
			
		||||
    color: inherit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h1, h2, h3, h4 {
 | 
			
		||||
    padding-left: 0.4em;
 | 
			
		||||
    border-radius: 4px;
 | 
			
		||||
    padding-bottom: 0.25em;
 | 
			
		||||
    padding-top: 0.25em;
 | 
			
		||||
    border: 1px solid #6A996A;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h1 {
 | 
			
		||||
    background-color: #7BB37B;
 | 
			
		||||
    color: #151515;
 | 
			
		||||
    font-size: 1.2em;
 | 
			
		||||
    padding-bottom: 0.3em;
 | 
			
		||||
    padding-top: 0.3em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h2 {
 | 
			
		||||
    color: #313131;
 | 
			
		||||
    font-size: 1.0em;
 | 
			
		||||
    background-color: #ABE3AB;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h3 {
 | 
			
		||||
    color: #313131;
 | 
			
		||||
    font-size: 0.9em;
 | 
			
		||||
    margin-bottom: -6px;
 | 
			
		||||
    background-color: #BBF3BB;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h4 {
 | 
			
		||||
    color: #313131;
 | 
			
		||||
    font-size: 0.8em;
 | 
			
		||||
    margin-bottom: -8px;
 | 
			
		||||
    background-color: #D1FDD1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
img {
 | 
			
		||||
    border: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#navbar {
 | 
			
		||||
    background-color: #738073;
 | 
			
		||||
    border-bottom: 1px solid #5C665C;
 | 
			
		||||
    border-top: 1px solid #5C665C;
 | 
			
		||||
    margin-top: 12px;
 | 
			
		||||
    padding: 0.3em;
 | 
			
		||||
    position: relative;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#navbar a, #navbar_secondary a {
 | 
			
		||||
    color: white;
 | 
			
		||||
    padding: 0.3em;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#navbar a:hover, #navbar_secondary a:hover {
 | 
			
		||||
    background-color: #313131;
 | 
			
		||||
    color: white;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#navbar_secondary {
 | 
			
		||||
    background-color: #738073;
 | 
			
		||||
    border-bottom: 1px solid #5C665C;
 | 
			
		||||
    border-left: 1px solid #5C665C;
 | 
			
		||||
    border-right: 1px solid #5C665C;
 | 
			
		||||
    padding: 0.3em;
 | 
			
		||||
    position: relative;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
p {
 | 
			
		||||
    margin-left: 1em;
 | 
			
		||||
    margin-right: 1em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pre {
 | 
			
		||||
    margin-left: 3em;
 | 
			
		||||
    margin-right: 3em;
 | 
			
		||||
    padding: 0.3em;
 | 
			
		||||
    border: 1px solid #bbb;
 | 
			
		||||
    background-color: #f7f7f7;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dl dt {
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#proj_desc {
 | 
			
		||||
    font-size: 1.2em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#repos {
 | 
			
		||||
    margin-left: 1em;
 | 
			
		||||
    margin-right: 1em;
 | 
			
		||||
    border-collapse: collapse;
 | 
			
		||||
    border: solid 1px #6A996A;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#repos th {
 | 
			
		||||
    background-color: #7BB37B;
 | 
			
		||||
    border: solid 1px #6A996A;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#repos td {
 | 
			
		||||
    padding: 0.2em;
 | 
			
		||||
    border: solid 1px #6A996A;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,23 +1,69 @@
 | 
			
		||||
@chapter Demuxers
 | 
			
		||||
@c man begin DEMUXERS
 | 
			
		||||
 | 
			
		||||
Demuxers are configured elements in FFmpeg that can read the
 | 
			
		||||
Demuxers are configured elements in FFmpeg which allow to read the
 | 
			
		||||
multimedia streams from a particular type of file.
 | 
			
		||||
 | 
			
		||||
When you configure your FFmpeg build, all the supported demuxers
 | 
			
		||||
are enabled by default. You can list all available ones using the
 | 
			
		||||
configure option @code{--list-demuxers}.
 | 
			
		||||
configure option "--list-demuxers".
 | 
			
		||||
 | 
			
		||||
You can disable all the demuxers using the configure option
 | 
			
		||||
@code{--disable-demuxers}, and selectively enable a single demuxer with
 | 
			
		||||
the option @code{--enable-demuxer=@var{DEMUXER}}, or disable it
 | 
			
		||||
with the option @code{--disable-demuxer=@var{DEMUXER}}.
 | 
			
		||||
"--disable-demuxers", and selectively enable a single demuxer with
 | 
			
		||||
the option "--enable-demuxer=@var{DEMUXER}", or disable it
 | 
			
		||||
with the option "--disable-demuxer=@var{DEMUXER}".
 | 
			
		||||
 | 
			
		||||
The option @code{-formats} of the ff* tools will display the list of
 | 
			
		||||
The option "-formats" of the ff* tools will display the list of
 | 
			
		||||
enabled demuxers.
 | 
			
		||||
 | 
			
		||||
The description of some of the currently available demuxers follows.
 | 
			
		||||
 | 
			
		||||
@section image2
 | 
			
		||||
 | 
			
		||||
Image file demuxer.
 | 
			
		||||
 | 
			
		||||
This demuxer reads from a list of image files specified by a pattern.
 | 
			
		||||
 | 
			
		||||
The pattern may contain the string "%d" or "%0@var{N}d", which
 | 
			
		||||
specifies the position of the characters representing a sequential
 | 
			
		||||
number in each filename matched by the pattern. If the form
 | 
			
		||||
"%d0@var{N}d" is used, the string representing the number in each
 | 
			
		||||
filename is 0-padded and @var{N} is the total number of 0-padded
 | 
			
		||||
digits representing the number. The literal character '%' can be
 | 
			
		||||
specified in the pattern with the string "%%".
 | 
			
		||||
 | 
			
		||||
If the pattern contains "%d" or "%0@var{N}d", the first filename of
 | 
			
		||||
the file list specified by the pattern must contain a number
 | 
			
		||||
inclusively contained between 0 and 4, all the following numbers must
 | 
			
		||||
be sequential. This limitation may be hopefully fixed.
 | 
			
		||||
 | 
			
		||||
The pattern may contain a suffix which is used to automatically
 | 
			
		||||
determine the format of the images contained in the files.
 | 
			
		||||
 | 
			
		||||
For example the pattern "img-%03d.bmp" will match a sequence of
 | 
			
		||||
filenames of the form @file{img-001.bmp}, @file{img-002.bmp}, ...,
 | 
			
		||||
@file{img-010.bmp}, etc.; the pattern "i%%m%%g-%d.jpg" will match a
 | 
			
		||||
sequence of filenames of the form @file{i%m%g-1.jpg},
 | 
			
		||||
@file{i%m%g-2.jpg}, ..., @file{i%m%g-10.jpg}, etc.
 | 
			
		||||
 | 
			
		||||
The size, the pixel format, and the format of each image must be the
 | 
			
		||||
same for all the files in the sequence.
 | 
			
		||||
 | 
			
		||||
The following example shows how to use @command{ffmpeg} for creating a
 | 
			
		||||
video from the images in the file sequence @file{img-001.jpeg},
 | 
			
		||||
@file{img-002.jpeg}, ..., assuming an input frame rate of 10 frames per
 | 
			
		||||
second:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i 'img-%03d.jpeg' -r 10 out.mkv
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Note that the pattern must not necessarily contain "%d" or
 | 
			
		||||
"%0@var{N}d", for example to convert a single image file
 | 
			
		||||
@file{img.jpeg} you can employ the command:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i img.jpeg img.png
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section applehttp
 | 
			
		||||
 | 
			
		||||
Apple HTTP Live Streaming demuxer.
 | 
			
		||||
@@ -29,298 +75,6 @@ the caller can decide which variant streams to actually receive.
 | 
			
		||||
The total bitrate of the variant that the stream belongs to is
 | 
			
		||||
available in a metadata key named "variant_bitrate".
 | 
			
		||||
 | 
			
		||||
@section asf
 | 
			
		||||
 | 
			
		||||
Advanced Systems Format demuxer.
 | 
			
		||||
 | 
			
		||||
This demuxer is used to demux ASF files and MMS network streams.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -no_resync_search @var{bool}
 | 
			
		||||
Do not try to resynchronize by looking for a certain optional start code.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@anchor{concat}
 | 
			
		||||
@section concat
 | 
			
		||||
 | 
			
		||||
Virtual concatenation script demuxer.
 | 
			
		||||
 | 
			
		||||
This demuxer reads a list of files and other directives from a text file and
 | 
			
		||||
demuxes them one after the other, as if all their packet had been muxed
 | 
			
		||||
together.
 | 
			
		||||
 | 
			
		||||
The timestamps in the files are adjusted so that the first file starts at 0
 | 
			
		||||
and each next file starts where the previous one finishes. Note that it is
 | 
			
		||||
done globally and may cause gaps if all streams do not have exactly the same
 | 
			
		||||
length.
 | 
			
		||||
 | 
			
		||||
All files must have the same streams (same codecs, same time base, etc.).
 | 
			
		||||
 | 
			
		||||
The duration of each file is used to adjust the timestamps of the next file:
 | 
			
		||||
if the duration is incorrect (because it was computed using the bit-rate or
 | 
			
		||||
because the file is truncated, for example), it can cause artifacts. The
 | 
			
		||||
@code{duration} directive can be used to override the duration stored in
 | 
			
		||||
each file.
 | 
			
		||||
 | 
			
		||||
@subsection Syntax
 | 
			
		||||
 | 
			
		||||
The script is a text file in extended-ASCII, with one directive per line.
 | 
			
		||||
Empty lines, leading spaces and lines starting with '#' are ignored. The
 | 
			
		||||
following directive is recognized:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item @code{file @var{path}}
 | 
			
		||||
Path to a file to read; special characters and spaces must be escaped with
 | 
			
		||||
backslash or single quotes.
 | 
			
		||||
 | 
			
		||||
All subsequent directives apply to that file.
 | 
			
		||||
 | 
			
		||||
@item @code{ffconcat version 1.0}
 | 
			
		||||
Identify the script type and version. It also sets the @option{safe} option
 | 
			
		||||
to 1 if it was to its default -1.
 | 
			
		||||
 | 
			
		||||
To make FFmpeg recognize the format automatically, this directive must
 | 
			
		||||
appears exactly as is (no extra space or byte-order-mark) on the very first
 | 
			
		||||
line of the script.
 | 
			
		||||
 | 
			
		||||
@item @code{duration @var{dur}}
 | 
			
		||||
Duration of the file. This information can be specified from the file;
 | 
			
		||||
specifying it here may be more efficient or help if the information from the
 | 
			
		||||
file is not available or accurate.
 | 
			
		||||
 | 
			
		||||
If the duration is set for all files, then it is possible to seek in the
 | 
			
		||||
whole concatenated video.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
This demuxer accepts the following option:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item safe
 | 
			
		||||
If set to 1, reject unsafe file paths. A file path is considered safe if it
 | 
			
		||||
does not contain a protocol specification and is relative and all components
 | 
			
		||||
only contain characters from the portable character set (letters, digits,
 | 
			
		||||
period, underscore and hyphen) and have no period at the beginning of a
 | 
			
		||||
component.
 | 
			
		||||
 | 
			
		||||
If set to 0, any file name is accepted.
 | 
			
		||||
 | 
			
		||||
The default is -1, it is equivalent to 1 if the format was automatically
 | 
			
		||||
probed and 0 otherwise.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section flv
 | 
			
		||||
 | 
			
		||||
Adobe Flash Video Format demuxer.
 | 
			
		||||
 | 
			
		||||
This demuxer is used to demux FLV files and RTMP network streams.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -flv_metadata @var{bool}
 | 
			
		||||
Allocate the streams according to the onMetaData array content.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section libgme
 | 
			
		||||
 | 
			
		||||
The Game Music Emu library is a collection of video game music file emulators.
 | 
			
		||||
 | 
			
		||||
See @url{http://code.google.com/p/game-music-emu/} for more information.
 | 
			
		||||
 | 
			
		||||
Some files have multiple tracks. The demuxer will pick the first track by
 | 
			
		||||
default. The @option{track_index} option can be used to select a different
 | 
			
		||||
track. Track indexes start at 0. The demuxer exports the number of tracks as
 | 
			
		||||
@var{tracks} meta data entry.
 | 
			
		||||
 | 
			
		||||
For very large files, the @option{max_size} option may have to be adjusted.
 | 
			
		||||
 | 
			
		||||
@section libquvi
 | 
			
		||||
 | 
			
		||||
Play media from Internet services using the quvi project.
 | 
			
		||||
 | 
			
		||||
The demuxer accepts a @option{format} option to request a specific quality. It
 | 
			
		||||
is by default set to @var{best}.
 | 
			
		||||
 | 
			
		||||
See @url{http://quvi.sourceforge.net/} for more information.
 | 
			
		||||
 | 
			
		||||
FFmpeg needs to be built with @code{--enable-libquvi} for this demuxer to be
 | 
			
		||||
enabled.
 | 
			
		||||
 | 
			
		||||
@section image2
 | 
			
		||||
 | 
			
		||||
Image file demuxer.
 | 
			
		||||
 | 
			
		||||
This demuxer reads from a list of image files specified by a pattern.
 | 
			
		||||
The syntax and meaning of the pattern is specified by the
 | 
			
		||||
option @var{pattern_type}.
 | 
			
		||||
 | 
			
		||||
The pattern may contain a suffix which is used to automatically
 | 
			
		||||
determine the format of the images contained in the files.
 | 
			
		||||
 | 
			
		||||
The size, the pixel format, and the format of each image must be the
 | 
			
		||||
same for all the files in the sequence.
 | 
			
		||||
 | 
			
		||||
This demuxer accepts the following options:
 | 
			
		||||
@table @option
 | 
			
		||||
@item framerate
 | 
			
		||||
Set the frame rate for the video stream. It defaults to 25.
 | 
			
		||||
@item loop
 | 
			
		||||
If set to 1, loop over the input. Default value is 0.
 | 
			
		||||
@item pattern_type
 | 
			
		||||
Select the pattern type used to interpret the provided filename.
 | 
			
		||||
 | 
			
		||||
@var{pattern_type} accepts one of the following values.
 | 
			
		||||
@table @option
 | 
			
		||||
@item sequence
 | 
			
		||||
Select a sequence pattern type, used to specify a sequence of files
 | 
			
		||||
indexed by sequential numbers.
 | 
			
		||||
 | 
			
		||||
A sequence pattern may contain the string "%d" or "%0@var{N}d", which
 | 
			
		||||
specifies the position of the characters representing a sequential
 | 
			
		||||
number in each filename matched by the pattern. If the form
 | 
			
		||||
"%d0@var{N}d" is used, the string representing the number in each
 | 
			
		||||
filename is 0-padded and @var{N} is the total number of 0-padded
 | 
			
		||||
digits representing the number. The literal character '%' can be
 | 
			
		||||
specified in the pattern with the string "%%".
 | 
			
		||||
 | 
			
		||||
If the sequence pattern contains "%d" or "%0@var{N}d", the first filename of
 | 
			
		||||
the file list specified by the pattern must contain a number
 | 
			
		||||
inclusively contained between @var{start_number} and
 | 
			
		||||
@var{start_number}+@var{start_number_range}-1, and all the following
 | 
			
		||||
numbers must be sequential.
 | 
			
		||||
 | 
			
		||||
For example the pattern "img-%03d.bmp" will match a sequence of
 | 
			
		||||
filenames of the form @file{img-001.bmp}, @file{img-002.bmp}, ...,
 | 
			
		||||
@file{img-010.bmp}, etc.; the pattern "i%%m%%g-%d.jpg" will match a
 | 
			
		||||
sequence of filenames of the form @file{i%m%g-1.jpg},
 | 
			
		||||
@file{i%m%g-2.jpg}, ..., @file{i%m%g-10.jpg}, etc.
 | 
			
		||||
 | 
			
		||||
Note that the pattern must not necessarily contain "%d" or
 | 
			
		||||
"%0@var{N}d", for example to convert a single image file
 | 
			
		||||
@file{img.jpeg} you can employ the command:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i img.jpeg img.png
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item glob
 | 
			
		||||
Select a glob wildcard pattern type.
 | 
			
		||||
 | 
			
		||||
The pattern is interpreted like a @code{glob()} pattern. This is only
 | 
			
		||||
selectable if libavformat was compiled with globbing support.
 | 
			
		||||
 | 
			
		||||
@item glob_sequence @emph{(deprecated, will be removed)}
 | 
			
		||||
Select a mixed glob wildcard/sequence pattern.
 | 
			
		||||
 | 
			
		||||
If your version of libavformat was compiled with globbing support, and
 | 
			
		||||
the provided pattern contains at least one glob meta character among
 | 
			
		||||
@code{%*?[]@{@}} that is preceded by an unescaped "%", the pattern is
 | 
			
		||||
interpreted like a @code{glob()} pattern, otherwise it is interpreted
 | 
			
		||||
like a sequence pattern.
 | 
			
		||||
 | 
			
		||||
All glob special characters @code{%*?[]@{@}} must be prefixed
 | 
			
		||||
with "%". To escape a literal "%" you shall use "%%".
 | 
			
		||||
 | 
			
		||||
For example the pattern @code{foo-%*.jpeg} will match all the
 | 
			
		||||
filenames prefixed by "foo-" and terminating with ".jpeg", and
 | 
			
		||||
@code{foo-%?%?%?.jpeg} will match all the filenames prefixed with
 | 
			
		||||
"foo-", followed by a sequence of three characters, and terminating
 | 
			
		||||
with ".jpeg".
 | 
			
		||||
 | 
			
		||||
This pattern type is deprecated in favor of @var{glob} and
 | 
			
		||||
@var{sequence}.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Default value is @var{glob_sequence}.
 | 
			
		||||
@item pixel_format
 | 
			
		||||
Set the pixel format of the images to read. If not specified the pixel
 | 
			
		||||
format is guessed from the first image file in the sequence.
 | 
			
		||||
@item start_number
 | 
			
		||||
Set the index of the file matched by the image file pattern to start
 | 
			
		||||
to read from. Default value is 0.
 | 
			
		||||
@item start_number_range
 | 
			
		||||
Set the index interval range to check when looking for the first image
 | 
			
		||||
file in the sequence, starting from @var{start_number}. Default value
 | 
			
		||||
is 5.
 | 
			
		||||
@item ts_from_file
 | 
			
		||||
If set to 1, will set frame timestamp to modification time of image file. Note
 | 
			
		||||
that monotonity of timestamps is not provided: images go in the same order as
 | 
			
		||||
without this option. Default value is 0.
 | 
			
		||||
@item video_size
 | 
			
		||||
Set the video size of the images to read. If not specified the video
 | 
			
		||||
size is guessed from the first image file in the sequence.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Examples
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
@item
 | 
			
		||||
Use @command{ffmpeg} for creating a video from the images in the file
 | 
			
		||||
sequence @file{img-001.jpeg}, @file{img-002.jpeg}, ..., assuming an
 | 
			
		||||
input frame rate of 10 frames per second:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -framerate 10 -i 'img-%03d.jpeg' out.mkv
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
As above, but start by reading from a file with index 100 in the sequence:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -framerate 10 -start_number 100 -i 'img-%03d.jpeg' out.mkv
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Read images matching the "*.png" glob pattern , that is all the files
 | 
			
		||||
terminating with the ".png" suffix:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -framerate 10 -pattern_type glob -i "*.png" out.mkv
 | 
			
		||||
@end example
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
@section mpegts
 | 
			
		||||
 | 
			
		||||
MPEG-2 transport stream demuxer.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item fix_teletext_pts
 | 
			
		||||
Overrides teletext packet PTS and DTS values with the timestamps calculated
 | 
			
		||||
from the PCR of the first program which the teletext stream is part of and is
 | 
			
		||||
not discarded. Default value is 1, set this option to 0 if you want your
 | 
			
		||||
teletext packet PTS and DTS values untouched.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section rawvideo
 | 
			
		||||
 | 
			
		||||
Raw video demuxer.
 | 
			
		||||
 | 
			
		||||
This demuxer allows to read raw video data. Since there is no header
 | 
			
		||||
specifying the assumed video parameters, the user must specify them
 | 
			
		||||
in order to be able to decode the data correctly.
 | 
			
		||||
 | 
			
		||||
This demuxer accepts the following options:
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item framerate
 | 
			
		||||
Set input video frame rate. Default value is 25.
 | 
			
		||||
 | 
			
		||||
@item pixel_format
 | 
			
		||||
Set the input video pixel format. Default value is @code{yuv420p}.
 | 
			
		||||
 | 
			
		||||
@item video_size
 | 
			
		||||
Set the input video size. This value must be specified explicitly.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
For example to read a rawvideo file @file{input.raw} with
 | 
			
		||||
@command{ffplay}, assuming a pixel format of @code{rgb24}, a video
 | 
			
		||||
size of @code{320x240}, and a frame rate of 10 images per second, use
 | 
			
		||||
the command:
 | 
			
		||||
@example
 | 
			
		||||
ffplay -f rawvideo -pixel_format rgb24 -video_size 320x240 -framerate 10 input.raw
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section sbg
 | 
			
		||||
 | 
			
		||||
SBaGen script demuxer.
 | 
			
		||||
@@ -351,25 +105,4 @@ the script is directly played, the actual times will match the absolute
 | 
			
		||||
timestamps up to the sound controller's clock accuracy, but if the user
 | 
			
		||||
somehow pauses the playback or seeks, all times will be shifted accordingly.
 | 
			
		||||
 | 
			
		||||
@section tedcaptions
 | 
			
		||||
 | 
			
		||||
JSON captions used for @url{http://www.ted.com/, TED Talks}.
 | 
			
		||||
 | 
			
		||||
TED does not provide links to the captions, but they can be guessed from the
 | 
			
		||||
page. The file @file{tools/bookmarklets.html} from the FFmpeg source tree
 | 
			
		||||
contains a bookmarklet to expose them.
 | 
			
		||||
 | 
			
		||||
This demuxer accepts the following option:
 | 
			
		||||
@table @option
 | 
			
		||||
@item start_time
 | 
			
		||||
Set the start time of the TED talk, in milliseconds. The default is 15000
 | 
			
		||||
(15s). It is used to sync the captions with the downloadable videos, because
 | 
			
		||||
they include a 15s intro.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Example: convert the captions to a format most players understand:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i http://www.ted.com/talks/subtitles/id/1/lang/en talk1-en.srt
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@c man end DEMUXERS
 | 
			
		||||
@c man end INPUT DEVICES
 | 
			
		||||
 
 | 
			
		||||
@@ -11,23 +11,29 @@
 | 
			
		||||
 | 
			
		||||
@chapter Developers Guide
 | 
			
		||||
 | 
			
		||||
@section Notes for external developers
 | 
			
		||||
@section API
 | 
			
		||||
@itemize @bullet
 | 
			
		||||
@item libavcodec is the library containing the codecs (both encoding and
 | 
			
		||||
decoding). Look at @file{doc/examples/decoding_encoding.c} to see how to use
 | 
			
		||||
it.
 | 
			
		||||
 | 
			
		||||
This document is mostly useful for internal FFmpeg developers.
 | 
			
		||||
External developers who need to use the API in their application should
 | 
			
		||||
refer to the API doxygen documentation in the public headers, and
 | 
			
		||||
check the examples in @file{doc/examples} and in the source code to
 | 
			
		||||
see how the public API is employed.
 | 
			
		||||
@item libavformat is the library containing the file format handling (mux and
 | 
			
		||||
demux code for several formats). Look at @file{ffplay.c} to use it in a
 | 
			
		||||
player. See @file{doc/examples/muxing.c} to use it to generate audio or video
 | 
			
		||||
streams.
 | 
			
		||||
 | 
			
		||||
You can use the FFmpeg libraries in your commercial program, but you
 | 
			
		||||
are encouraged to @emph{publish any patch you make}. In this case the
 | 
			
		||||
best way to proceed is to send your patches to the ffmpeg-devel
 | 
			
		||||
mailing list following the guidelines illustrated in the remainder of
 | 
			
		||||
this document.
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
For more detailed legal information about the use of FFmpeg in
 | 
			
		||||
external programs read the @file{LICENSE} file in the source tree and
 | 
			
		||||
consult @url{http://ffmpeg.org/legal.html}.
 | 
			
		||||
@section Integrating libavcodec or libavformat in your program
 | 
			
		||||
 | 
			
		||||
You can integrate all the source code of the libraries to link them
 | 
			
		||||
statically to avoid any version problem. All you need is to provide a
 | 
			
		||||
'config.mak' and a 'config.h' in the parent directory. See the defines
 | 
			
		||||
generated by ./configure to understand what is needed.
 | 
			
		||||
 | 
			
		||||
You can use libavcodec or libavformat in your commercial program, but
 | 
			
		||||
@emph{any patch you make must be published}. The best way to proceed is
 | 
			
		||||
to send your patches to the FFmpeg mailing list.
 | 
			
		||||
 | 
			
		||||
@section Contributing
 | 
			
		||||
 | 
			
		||||
@@ -51,16 +57,13 @@ and should try to fix issues their commit causes.
 | 
			
		||||
@subsection Code formatting conventions
 | 
			
		||||
 | 
			
		||||
There are the following guidelines regarding the indentation in files:
 | 
			
		||||
 | 
			
		||||
@itemize @bullet
 | 
			
		||||
@item
 | 
			
		||||
Indent size is 4.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
The TAB character is forbidden outside of Makefiles as is any
 | 
			
		||||
form of trailing whitespace. Commits containing either will be
 | 
			
		||||
rejected by the git repository.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
You should try to limit your code lines to 80 characters; however, do so if
 | 
			
		||||
and only if this improves readability.
 | 
			
		||||
@@ -114,17 +117,13 @@ int myfunc(int my_parameter)
 | 
			
		||||
 | 
			
		||||
FFmpeg is programmed in the ISO C90 language with a few additional
 | 
			
		||||
features from ISO C99, namely:
 | 
			
		||||
 | 
			
		||||
@itemize @bullet
 | 
			
		||||
@item
 | 
			
		||||
the @samp{inline} keyword;
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
@samp{//} comments;
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
designated struct initializers (@samp{struct s x = @{ .i = 17 @};})
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
compound literals (@samp{x = (struct s) @{ 17, 23 @};})
 | 
			
		||||
@end itemize
 | 
			
		||||
@@ -136,72 +135,46 @@ clarity and performance.
 | 
			
		||||
All code must compile with recent versions of GCC and a number of other
 | 
			
		||||
currently supported compilers. To ensure compatibility, please do not use
 | 
			
		||||
additional C99 features or GCC extensions. Especially watch out for:
 | 
			
		||||
 | 
			
		||||
@itemize @bullet
 | 
			
		||||
@item
 | 
			
		||||
mixing statements and declarations;
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
@samp{long long} (use @samp{int64_t} instead);
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
@samp{__attribute__} not protected by @samp{#ifdef __GNUC__} or similar;
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
GCC statement expressions (@samp{(x = (@{ int y = 4; y; @})}).
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
@subsection Naming conventions
 | 
			
		||||
All names should be composed with underscores (_), not CamelCase. For example,
 | 
			
		||||
@samp{avfilter_get_video_buffer} is an acceptable function name and
 | 
			
		||||
@samp{AVFilterGetVideo} is not. The exception from this are type names, like
 | 
			
		||||
All names are using underscores (_), not CamelCase. For example, @samp{avfilter_get_video_buffer} is
 | 
			
		||||
a valid function name and @samp{AVFilterGetVideo} is not. The exception from this are type names, like
 | 
			
		||||
for example structs and enums; they should always be in the CamelCase
 | 
			
		||||
 | 
			
		||||
There are the following conventions for naming variables and functions:
 | 
			
		||||
 | 
			
		||||
There are following conventions for naming variables and functions:
 | 
			
		||||
@itemize @bullet
 | 
			
		||||
@item
 | 
			
		||||
For local variables no prefix is required.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
For file-scope variables and functions declared as @code{static}, no prefix
 | 
			
		||||
is required.
 | 
			
		||||
 | 
			
		||||
For variables and functions declared as @code{static} no prefixes are required.
 | 
			
		||||
@item
 | 
			
		||||
For variables and functions visible outside of file scope, but only used
 | 
			
		||||
internally by a library, an @code{ff_} prefix should be used,
 | 
			
		||||
e.g. @samp{ff_w64_demuxer}.
 | 
			
		||||
 | 
			
		||||
For variables and functions used internally by the library, @code{ff_} prefix
 | 
			
		||||
should be used.
 | 
			
		||||
For example, @samp{ff_w64_demuxer}.
 | 
			
		||||
@item
 | 
			
		||||
For variables and functions visible outside of file scope, used internally
 | 
			
		||||
across multiple libraries, use @code{avpriv_} as prefix, for example,
 | 
			
		||||
@samp{avpriv_aac_parse_header}.
 | 
			
		||||
 | 
			
		||||
For variables and functions used internally across multiple libraries, use
 | 
			
		||||
@code{avpriv_}. For example, @samp{avpriv_aac_parse_header}.
 | 
			
		||||
@item
 | 
			
		||||
Each library has its own prefix for public symbols, in addition to the
 | 
			
		||||
commonly used @code{av_} (@code{avformat_} for libavformat,
 | 
			
		||||
@code{avcodec_} for libavcodec, @code{swr_} for libswresample, etc).
 | 
			
		||||
Check the existing code and choose names accordingly.
 | 
			
		||||
Note that some symbols without these prefixes are also exported for
 | 
			
		||||
retro-compatibility reasons. These exceptions are declared in the
 | 
			
		||||
@code{lib<name>/lib<name>.v} files.
 | 
			
		||||
For exported names, each library has its own prefixes. Just check the existing
 | 
			
		||||
code and name accordingly.
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
Furthermore, name space reserved for the system should not be invaded.
 | 
			
		||||
Identifiers ending in @code{_t} are reserved by
 | 
			
		||||
@url{http://pubs.opengroup.org/onlinepubs/007904975/functions/xsh_chap02_02.html#tag_02_02_02, POSIX}.
 | 
			
		||||
Also avoid names starting with @code{__} or @code{_} followed by an uppercase
 | 
			
		||||
letter as they are reserved by the C standard. Names starting with @code{_}
 | 
			
		||||
are reserved at the file level and may not be used for externally visible
 | 
			
		||||
symbols. If in doubt, just avoid names starting with @code{_} altogether.
 | 
			
		||||
 | 
			
		||||
@subsection Miscellaneous conventions
 | 
			
		||||
 | 
			
		||||
@subsection Miscellanous conventions
 | 
			
		||||
@itemize @bullet
 | 
			
		||||
@item
 | 
			
		||||
fprintf and printf are forbidden in libavformat and libavcodec,
 | 
			
		||||
please use av_log() instead.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Casts should be used only when necessary. Unneeded parentheses
 | 
			
		||||
should also be avoided if they don't make the code easier to understand.
 | 
			
		||||
@@ -217,8 +190,8 @@ set shiftwidth=4
 | 
			
		||||
set softtabstop=4
 | 
			
		||||
set cindent
 | 
			
		||||
set cinoptions=(0
 | 
			
		||||
" Allow tabs in Makefiles.
 | 
			
		||||
autocmd FileType make,automake set noexpandtab shiftwidth=8 softtabstop=8
 | 
			
		||||
" allow tabs in Makefiles
 | 
			
		||||
autocmd FileType make set noexpandtab shiftwidth=8 softtabstop=8
 | 
			
		||||
" Trailing whitespace and tabs are forbidden, so highlight them.
 | 
			
		||||
highlight ForbiddenWhitespace ctermbg=red guibg=red
 | 
			
		||||
match ForbiddenWhitespace /\s\+$\|\t/
 | 
			
		||||
@@ -231,8 +204,8 @@ For Emacs, add these roughly equivalent lines to your @file{.emacs.d/init.el}:
 | 
			
		||||
(c-add-style "ffmpeg"
 | 
			
		||||
             '("k&r"
 | 
			
		||||
               (c-basic-offset . 4)
 | 
			
		||||
               (indent-tabs-mode . nil)
 | 
			
		||||
               (show-trailing-whitespace . t)
 | 
			
		||||
               (indent-tabs-mode nil)
 | 
			
		||||
               (show-trailing-whitespace t)
 | 
			
		||||
               (c-offsets-alist
 | 
			
		||||
                (statement-cont . (c-lineup-assignments +)))
 | 
			
		||||
               )
 | 
			
		||||
@@ -244,158 +217,124 @@ For Emacs, add these roughly equivalent lines to your @file{.emacs.d/init.el}:
 | 
			
		||||
 | 
			
		||||
@enumerate
 | 
			
		||||
@item
 | 
			
		||||
Contributions should be licensed under the
 | 
			
		||||
@uref{http://www.gnu.org/licenses/lgpl-2.1.html, LGPL 2.1},
 | 
			
		||||
including an "or any later version" clause, or, if you prefer
 | 
			
		||||
a gift-style license, the
 | 
			
		||||
@uref{http://www.isc.org/software/license/, ISC} or
 | 
			
		||||
@uref{http://mit-license.org/, MIT} license.
 | 
			
		||||
@uref{http://www.gnu.org/licenses/gpl-2.0.html, GPL 2} including
 | 
			
		||||
an "or any later version" clause is also acceptable, but LGPL is
 | 
			
		||||
preferred.
 | 
			
		||||
If you add a new file, give it a proper license header. Do not copy and
 | 
			
		||||
paste it from a random place, use an existing file as template.
 | 
			
		||||
 | 
			
		||||
   Contributions should be licensed under the LGPL 2.1, including an
 | 
			
		||||
   "or any later version" clause, or the MIT license.  GPL 2 including
 | 
			
		||||
   an "or any later version" clause is also acceptable, but LGPL is
 | 
			
		||||
   preferred.
 | 
			
		||||
@item
 | 
			
		||||
You must not commit code which breaks FFmpeg! (Meaning unfinished but
 | 
			
		||||
enabled code which breaks compilation or compiles but does not work or
 | 
			
		||||
breaks the regression tests)
 | 
			
		||||
You can commit unfinished stuff (for testing etc), but it must be disabled
 | 
			
		||||
(#ifdef etc) by default so it does not interfere with other developers'
 | 
			
		||||
work.
 | 
			
		||||
 | 
			
		||||
   You must not commit code which breaks FFmpeg! (Meaning unfinished but
 | 
			
		||||
   enabled code which breaks compilation or compiles but does not work or
 | 
			
		||||
   breaks the regression tests)
 | 
			
		||||
   You can commit unfinished stuff (for testing etc), but it must be disabled
 | 
			
		||||
   (#ifdef etc) by default so it does not interfere with other developers'
 | 
			
		||||
   work.
 | 
			
		||||
@item
 | 
			
		||||
The commit message should have a short first line in the form of
 | 
			
		||||
a @samp{topic: short description} as a header, separated by a newline
 | 
			
		||||
from the body consisting of an explanation of why the change is necessary.
 | 
			
		||||
If the commit fixes a known bug on the bug tracker, the commit message
 | 
			
		||||
should include its bug ID. Referring to the issue on the bug tracker does
 | 
			
		||||
not exempt you from writing an excerpt of the bug in the commit message.
 | 
			
		||||
 | 
			
		||||
   You do not have to over-test things. If it works for you, and you think it
 | 
			
		||||
   should work for others, then commit. If your code has problems
 | 
			
		||||
   (portability, triggers compiler bugs, unusual environment etc) they will be
 | 
			
		||||
   reported and eventually fixed.
 | 
			
		||||
@item
 | 
			
		||||
You do not have to over-test things. If it works for you, and you think it
 | 
			
		||||
should work for others, then commit. If your code has problems
 | 
			
		||||
(portability, triggers compiler bugs, unusual environment etc) they will be
 | 
			
		||||
reported and eventually fixed.
 | 
			
		||||
 | 
			
		||||
   Do not commit unrelated changes together, split them into self-contained
 | 
			
		||||
   pieces. Also do not forget that if part B depends on part A, but A does not
 | 
			
		||||
   depend on B, then A can and should be committed first and separate from B.
 | 
			
		||||
   Keeping changes well split into self-contained parts makes reviewing and
 | 
			
		||||
   understanding them on the commit log mailing list easier. This also helps
 | 
			
		||||
   in case of debugging later on.
 | 
			
		||||
   Also if you have doubts about splitting or not splitting, do not hesitate to
 | 
			
		||||
   ask/discuss it on the developer mailing list.
 | 
			
		||||
@item
 | 
			
		||||
Do not commit unrelated changes together, split them into self-contained
 | 
			
		||||
pieces. Also do not forget that if part B depends on part A, but A does not
 | 
			
		||||
depend on B, then A can and should be committed first and separate from B.
 | 
			
		||||
Keeping changes well split into self-contained parts makes reviewing and
 | 
			
		||||
understanding them on the commit log mailing list easier. This also helps
 | 
			
		||||
in case of debugging later on.
 | 
			
		||||
Also if you have doubts about splitting or not splitting, do not hesitate to
 | 
			
		||||
ask/discuss it on the developer mailing list.
 | 
			
		||||
   Do not change behavior of the programs (renaming options etc) or public
 | 
			
		||||
   API or ABI without first discussing it on the ffmpeg-devel mailing list.
 | 
			
		||||
   Do not remove functionality from the code. Just improve!
 | 
			
		||||
 | 
			
		||||
   Note: Redundant code can be removed.
 | 
			
		||||
@item
 | 
			
		||||
Do not change behavior of the programs (renaming options etc) or public
 | 
			
		||||
API or ABI without first discussing it on the ffmpeg-devel mailing list.
 | 
			
		||||
Do not remove functionality from the code. Just improve!
 | 
			
		||||
 | 
			
		||||
Note: Redundant code can be removed.
 | 
			
		||||
 | 
			
		||||
   Do not commit changes to the build system (Makefiles, configure script)
 | 
			
		||||
   which change behavior, defaults etc, without asking first. The same
 | 
			
		||||
   applies to compiler warning fixes, trivial looking fixes and to code
 | 
			
		||||
   maintained by other developers. We usually have a reason for doing things
 | 
			
		||||
   the way we do. Send your changes as patches to the ffmpeg-devel mailing
 | 
			
		||||
   list, and if the code maintainers say OK, you may commit. This does not
 | 
			
		||||
   apply to files you wrote and/or maintain.
 | 
			
		||||
@item
 | 
			
		||||
Do not commit changes to the build system (Makefiles, configure script)
 | 
			
		||||
which change behavior, defaults etc, without asking first. The same
 | 
			
		||||
applies to compiler warning fixes, trivial looking fixes and to code
 | 
			
		||||
maintained by other developers. We usually have a reason for doing things
 | 
			
		||||
the way we do. Send your changes as patches to the ffmpeg-devel mailing
 | 
			
		||||
list, and if the code maintainers say OK, you may commit. This does not
 | 
			
		||||
apply to files you wrote and/or maintain.
 | 
			
		||||
   We refuse source indentation and other cosmetic changes if they are mixed
 | 
			
		||||
   with functional changes, such commits will be rejected and removed. Every
 | 
			
		||||
   developer has his own indentation style, you should not change it. Of course
 | 
			
		||||
   if you (re)write something, you can use your own style, even though we would
 | 
			
		||||
   prefer if the indentation throughout FFmpeg was consistent (Many projects
 | 
			
		||||
   force a given indentation style - we do not.). If you really need to make
 | 
			
		||||
   indentation changes (try to avoid this), separate them strictly from real
 | 
			
		||||
   changes.
 | 
			
		||||
 | 
			
		||||
   NOTE: If you had to put if()@{ .. @} over a large (> 5 lines) chunk of code,
 | 
			
		||||
   then either do NOT change the indentation of the inner part within (do not
 | 
			
		||||
   move it to the right)! or do so in a separate commit
 | 
			
		||||
@item
 | 
			
		||||
We refuse source indentation and other cosmetic changes if they are mixed
 | 
			
		||||
with functional changes, such commits will be rejected and removed. Every
 | 
			
		||||
developer has his own indentation style, you should not change it. Of course
 | 
			
		||||
if you (re)write something, you can use your own style, even though we would
 | 
			
		||||
prefer if the indentation throughout FFmpeg was consistent (Many projects
 | 
			
		||||
force a given indentation style - we do not.). If you really need to make
 | 
			
		||||
indentation changes (try to avoid this), separate them strictly from real
 | 
			
		||||
changes.
 | 
			
		||||
 | 
			
		||||
NOTE: If you had to put if()@{ .. @} over a large (> 5 lines) chunk of code,
 | 
			
		||||
then either do NOT change the indentation of the inner part within (do not
 | 
			
		||||
move it to the right)! or do so in a separate commit
 | 
			
		||||
   Always fill out the commit log message. Describe in a few lines what you
 | 
			
		||||
   changed and why. You can refer to mailing list postings if you fix a
 | 
			
		||||
   particular bug. Comments such as "fixed!" or "Changed it." are unacceptable.
 | 
			
		||||
   Recommended format:
 | 
			
		||||
   area changed: Short 1 line description
 | 
			
		||||
 | 
			
		||||
   details describing what and why and giving references.
 | 
			
		||||
@item
 | 
			
		||||
Always fill out the commit log message. Describe in a few lines what you
 | 
			
		||||
changed and why. You can refer to mailing list postings if you fix a
 | 
			
		||||
particular bug. Comments such as "fixed!" or "Changed it." are unacceptable.
 | 
			
		||||
Recommended format:
 | 
			
		||||
area changed: Short 1 line description
 | 
			
		||||
 | 
			
		||||
details describing what and why and giving references.
 | 
			
		||||
 | 
			
		||||
   Make sure the author of the commit is set correctly. (see git commit --author)
 | 
			
		||||
   If you apply a patch, send an
 | 
			
		||||
   answer to ffmpeg-devel (or wherever you got the patch from) saying that
 | 
			
		||||
   you applied the patch.
 | 
			
		||||
@item
 | 
			
		||||
Make sure the author of the commit is set correctly. (see git commit --author)
 | 
			
		||||
If you apply a patch, send an
 | 
			
		||||
answer to ffmpeg-devel (or wherever you got the patch from) saying that
 | 
			
		||||
you applied the patch.
 | 
			
		||||
 | 
			
		||||
   When applying patches that have been discussed (at length) on the mailing
 | 
			
		||||
   list, reference the thread in the log message.
 | 
			
		||||
@item
 | 
			
		||||
When applying patches that have been discussed (at length) on the mailing
 | 
			
		||||
list, reference the thread in the log message.
 | 
			
		||||
 | 
			
		||||
    Do NOT commit to code actively maintained by others without permission.
 | 
			
		||||
    Send a patch to ffmpeg-devel instead. If no one answers within a reasonable
 | 
			
		||||
    timeframe (12h for build failures and security fixes, 3 days small changes,
 | 
			
		||||
    1 week for big patches) then commit your patch if you think it is OK.
 | 
			
		||||
    Also note, the maintainer can simply ask for more time to review!
 | 
			
		||||
@item
 | 
			
		||||
Do NOT commit to code actively maintained by others without permission.
 | 
			
		||||
Send a patch to ffmpeg-devel instead. If no one answers within a reasonable
 | 
			
		||||
timeframe (12h for build failures and security fixes, 3 days small changes,
 | 
			
		||||
1 week for big patches) then commit your patch if you think it is OK.
 | 
			
		||||
Also note, the maintainer can simply ask for more time to review!
 | 
			
		||||
 | 
			
		||||
    Subscribe to the ffmpeg-cvslog mailing list. The diffs of all commits
 | 
			
		||||
    are sent there and reviewed by all the other developers. Bugs and possible
 | 
			
		||||
    improvements or general questions regarding commits are discussed there. We
 | 
			
		||||
    expect you to react if problems with your code are uncovered.
 | 
			
		||||
@item
 | 
			
		||||
Subscribe to the ffmpeg-cvslog mailing list. The diffs of all commits
 | 
			
		||||
are sent there and reviewed by all the other developers. Bugs and possible
 | 
			
		||||
improvements or general questions regarding commits are discussed there. We
 | 
			
		||||
expect you to react if problems with your code are uncovered.
 | 
			
		||||
 | 
			
		||||
    Update the documentation if you change behavior or add features. If you are
 | 
			
		||||
    unsure how best to do this, send a patch to ffmpeg-devel, the documentation
 | 
			
		||||
    maintainer(s) will review and commit your stuff.
 | 
			
		||||
@item
 | 
			
		||||
Update the documentation if you change behavior or add features. If you are
 | 
			
		||||
unsure how best to do this, send a patch to ffmpeg-devel, the documentation
 | 
			
		||||
maintainer(s) will review and commit your stuff.
 | 
			
		||||
 | 
			
		||||
    Try to keep important discussions and requests (also) on the public
 | 
			
		||||
    developer mailing list, so that all developers can benefit from them.
 | 
			
		||||
@item
 | 
			
		||||
Try to keep important discussions and requests (also) on the public
 | 
			
		||||
developer mailing list, so that all developers can benefit from them.
 | 
			
		||||
 | 
			
		||||
    Never write to unallocated memory, never write over the end of arrays,
 | 
			
		||||
    always check values read from some untrusted source before using them
 | 
			
		||||
    as array index or other risky things.
 | 
			
		||||
@item
 | 
			
		||||
Never write to unallocated memory, never write over the end of arrays,
 | 
			
		||||
always check values read from some untrusted source before using them
 | 
			
		||||
as array index or other risky things.
 | 
			
		||||
 | 
			
		||||
    Remember to check if you need to bump versions for the specific libav*
 | 
			
		||||
    parts (libavutil, libavcodec, libavformat) you are changing. You need
 | 
			
		||||
    to change the version integer.
 | 
			
		||||
    Incrementing the first component means no backward compatibility to
 | 
			
		||||
    previous versions (e.g. removal of a function from the public API).
 | 
			
		||||
    Incrementing the second component means backward compatible change
 | 
			
		||||
    (e.g. addition of a function to the public API or extension of an
 | 
			
		||||
    existing data structure).
 | 
			
		||||
    Incrementing the third component means a noteworthy binary compatible
 | 
			
		||||
    change (e.g. encoder bug fix that matters for the decoder).
 | 
			
		||||
@item
 | 
			
		||||
Remember to check if you need to bump versions for the specific libav*
 | 
			
		||||
parts (libavutil, libavcodec, libavformat) you are changing. You need
 | 
			
		||||
to change the version integer.
 | 
			
		||||
Incrementing the first component means no backward compatibility to
 | 
			
		||||
previous versions (e.g. removal of a function from the public API).
 | 
			
		||||
Incrementing the second component means backward compatible change
 | 
			
		||||
(e.g. addition of a function to the public API or extension of an
 | 
			
		||||
existing data structure).
 | 
			
		||||
Incrementing the third component means a noteworthy binary compatible
 | 
			
		||||
change (e.g. encoder bug fix that matters for the decoder). The third
 | 
			
		||||
component always starts at 100 to distinguish FFmpeg from Libav.
 | 
			
		||||
 | 
			
		||||
    Compiler warnings indicate potential bugs or code with bad style. If a type of
 | 
			
		||||
    warning always points to correct and clean code, that warning should
 | 
			
		||||
    be disabled, not the code changed.
 | 
			
		||||
    Thus the remaining warnings can either be bugs or correct code.
 | 
			
		||||
    If it is a bug, the bug has to be fixed. If it is not, the code should
 | 
			
		||||
    be changed to not generate a warning unless that causes a slowdown
 | 
			
		||||
    or obfuscates the code.
 | 
			
		||||
@item
 | 
			
		||||
Compiler warnings indicate potential bugs or code with bad style. If a type of
 | 
			
		||||
warning always points to correct and clean code, that warning should
 | 
			
		||||
be disabled, not the code changed.
 | 
			
		||||
Thus the remaining warnings can either be bugs or correct code.
 | 
			
		||||
If it is a bug, the bug has to be fixed. If it is not, the code should
 | 
			
		||||
be changed to not generate a warning unless that causes a slowdown
 | 
			
		||||
or obfuscates the code.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Make sure that no parts of the codebase that you maintain are missing from the
 | 
			
		||||
@file{MAINTAINERS} file. If something that you want to maintain is missing add it with
 | 
			
		||||
your name after it.
 | 
			
		||||
If at some point you no longer want to maintain some code, then please help
 | 
			
		||||
finding a new maintainer and also don't forget updating the @file{MAINTAINERS} file.
 | 
			
		||||
    If you add a new file, give it a proper license header. Do not copy and
 | 
			
		||||
    paste it from a random place, use an existing file as template.
 | 
			
		||||
@end enumerate
 | 
			
		||||
 | 
			
		||||
We think our rules are not too hard. If you have comments, contact us.
 | 
			
		||||
 | 
			
		||||
Note, these rules are mostly borrowed from the MPlayer project.
 | 
			
		||||
 | 
			
		||||
@anchor{Submitting patches}
 | 
			
		||||
@section Submitting patches
 | 
			
		||||
 | 
			
		||||
@@ -418,6 +357,11 @@ The tool is located in the tools directory.
 | 
			
		||||
Run the @ref{Regression tests} before submitting a patch in order to verify
 | 
			
		||||
it does not cause unexpected problems.
 | 
			
		||||
 | 
			
		||||
Patches should be posted as base64 encoded attachments (or any other
 | 
			
		||||
encoding which ensures that the patch will not be trashed during
 | 
			
		||||
transmission) to the ffmpeg-devel mailing list, see
 | 
			
		||||
@url{http://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel}
 | 
			
		||||
 | 
			
		||||
It also helps quite a bit if you tell us what the patch does (for example
 | 
			
		||||
'replaces lrint by lrintf'), and why (for example '*BSD isn't C99 compliant
 | 
			
		||||
and has no lrint()')
 | 
			
		||||
@@ -425,13 +369,6 @@ and has no lrint()')
 | 
			
		||||
Also please if you send several patches, send each patch as a separate mail,
 | 
			
		||||
do not attach several unrelated patches to the same mail.
 | 
			
		||||
 | 
			
		||||
Patches should be posted to the
 | 
			
		||||
@uref{http://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel, ffmpeg-devel}
 | 
			
		||||
mailing list. Use @code{git send-email} when possible since it will properly
 | 
			
		||||
send patches without requiring extra care. If you cannot, then send patches
 | 
			
		||||
as base64-encoded attachments, so your patch is not trashed during
 | 
			
		||||
transmission.
 | 
			
		||||
 | 
			
		||||
Your patch will be reviewed on the mailing list. You will likely be asked
 | 
			
		||||
to make some changes and are expected to send in an improved version that
 | 
			
		||||
incorporates the requests from the review. This process may go through
 | 
			
		||||
@@ -446,51 +383,38 @@ send a reminder by email. Your patch should eventually be dealt with.
 | 
			
		||||
 | 
			
		||||
@enumerate
 | 
			
		||||
@item
 | 
			
		||||
Did you use av_cold for codec initialization and close functions?
 | 
			
		||||
 | 
			
		||||
    Did you use av_cold for codec initialization and close functions?
 | 
			
		||||
@item
 | 
			
		||||
Did you add a long_name under NULL_IF_CONFIG_SMALL to the AVCodec or
 | 
			
		||||
AVInputFormat/AVOutputFormat struct?
 | 
			
		||||
 | 
			
		||||
    Did you add a long_name under NULL_IF_CONFIG_SMALL to the AVCodec or
 | 
			
		||||
    AVInputFormat/AVOutputFormat struct?
 | 
			
		||||
@item
 | 
			
		||||
Did you bump the minor version number (and reset the micro version
 | 
			
		||||
number) in @file{libavcodec/version.h} or @file{libavformat/version.h}?
 | 
			
		||||
 | 
			
		||||
    Did you bump the minor version number (and reset the micro version
 | 
			
		||||
    number) in @file{libavcodec/version.h} or @file{libavformat/version.h}?
 | 
			
		||||
@item
 | 
			
		||||
Did you register it in @file{allcodecs.c} or @file{allformats.c}?
 | 
			
		||||
 | 
			
		||||
    Did you register it in @file{allcodecs.c} or @file{allformats.c}?
 | 
			
		||||
@item
 | 
			
		||||
Did you add the AVCodecID to @file{avcodec.h}?
 | 
			
		||||
When adding new codec IDs, also add an entry to the codec descriptor
 | 
			
		||||
list in @file{libavcodec/codec_desc.c}.
 | 
			
		||||
 | 
			
		||||
    Did you add the CodecID to @file{avcodec.h}?
 | 
			
		||||
@item
 | 
			
		||||
If it has a FourCC, did you add it to @file{libavformat/riff.c},
 | 
			
		||||
even if it is only a decoder?
 | 
			
		||||
 | 
			
		||||
    If it has a fourCC, did you add it to @file{libavformat/riff.c},
 | 
			
		||||
    even if it is only a decoder?
 | 
			
		||||
@item
 | 
			
		||||
Did you add a rule to compile the appropriate files in the Makefile?
 | 
			
		||||
Remember to do this even if you're just adding a format to a file that is
 | 
			
		||||
already being compiled by some other rule, like a raw demuxer.
 | 
			
		||||
 | 
			
		||||
    Did you add a rule to compile the appropriate files in the Makefile?
 | 
			
		||||
    Remember to do this even if you're just adding a format to a file that is
 | 
			
		||||
    already being compiled by some other rule, like a raw demuxer.
 | 
			
		||||
@item
 | 
			
		||||
Did you add an entry to the table of supported formats or codecs in
 | 
			
		||||
@file{doc/general.texi}?
 | 
			
		||||
 | 
			
		||||
    Did you add an entry to the table of supported formats or codecs in
 | 
			
		||||
    @file{doc/general.texi}?
 | 
			
		||||
@item
 | 
			
		||||
Did you add an entry in the Changelog?
 | 
			
		||||
 | 
			
		||||
    Did you add an entry in the Changelog?
 | 
			
		||||
@item
 | 
			
		||||
If it depends on a parser or a library, did you add that dependency in
 | 
			
		||||
configure?
 | 
			
		||||
 | 
			
		||||
    If it depends on a parser or a library, did you add that dependency in
 | 
			
		||||
    configure?
 | 
			
		||||
@item
 | 
			
		||||
Did you @code{git add} the appropriate files before committing?
 | 
			
		||||
 | 
			
		||||
    Did you @code{git add} the appropriate files before committing?
 | 
			
		||||
@item
 | 
			
		||||
Did you make sure it compiles standalone, i.e. with
 | 
			
		||||
@code{configure --disable-everything --enable-decoder=foo}
 | 
			
		||||
(or @code{--enable-demuxer} or whatever your component is)?
 | 
			
		||||
    Did you make sure it compiles standalone, i.e. with
 | 
			
		||||
    @code{configure --disable-everything --enable-decoder=foo}
 | 
			
		||||
    (or @code{--enable-demuxer} or whatever your component is)?
 | 
			
		||||
@end enumerate
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -498,109 +422,73 @@ Did you make sure it compiles standalone, i.e. with
 | 
			
		||||
 | 
			
		||||
@enumerate
 | 
			
		||||
@item
 | 
			
		||||
Does @code{make fate} pass with the patch applied?
 | 
			
		||||
 | 
			
		||||
    Does @code{make fate} pass with the patch applied?
 | 
			
		||||
@item
 | 
			
		||||
Was the patch generated with git format-patch or send-email?
 | 
			
		||||
 | 
			
		||||
    Was the patch generated with git format-patch or send-email?
 | 
			
		||||
@item
 | 
			
		||||
Did you sign off your patch? (git commit -s)
 | 
			
		||||
See @url{http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob_plain;f=Documentation/SubmittingPatches} for the meaning
 | 
			
		||||
of sign off.
 | 
			
		||||
 | 
			
		||||
    Did you sign off your patch? (git commit -s)
 | 
			
		||||
    See @url{http://kerneltrap.org/files/Jeremy/DCO.txt} for the meaning
 | 
			
		||||
    of sign off.
 | 
			
		||||
@item
 | 
			
		||||
Did you provide a clear git commit log message?
 | 
			
		||||
 | 
			
		||||
    Did you provide a clear git commit log message?
 | 
			
		||||
@item
 | 
			
		||||
Is the patch against latest FFmpeg git master branch?
 | 
			
		||||
 | 
			
		||||
    Is the patch against latest FFmpeg git master branch?
 | 
			
		||||
@item
 | 
			
		||||
Are you subscribed to ffmpeg-devel?
 | 
			
		||||
(the list is subscribers only due to spam)
 | 
			
		||||
 | 
			
		||||
    Are you subscribed to ffmpeg-devel?
 | 
			
		||||
    (the list is subscribers only due to spam)
 | 
			
		||||
@item
 | 
			
		||||
Have you checked that the changes are minimal, so that the same cannot be
 | 
			
		||||
achieved with a smaller patch and/or simpler final code?
 | 
			
		||||
 | 
			
		||||
    Have you checked that the changes are minimal, so that the same cannot be
 | 
			
		||||
    achieved with a smaller patch and/or simpler final code?
 | 
			
		||||
@item
 | 
			
		||||
If the change is to speed critical code, did you benchmark it?
 | 
			
		||||
 | 
			
		||||
    If the change is to speed critical code, did you benchmark it?
 | 
			
		||||
@item
 | 
			
		||||
If you did any benchmarks, did you provide them in the mail?
 | 
			
		||||
 | 
			
		||||
    If you did any benchmarks, did you provide them in the mail?
 | 
			
		||||
@item
 | 
			
		||||
Have you checked that the patch does not introduce buffer overflows or
 | 
			
		||||
other security issues?
 | 
			
		||||
 | 
			
		||||
    Have you checked that the patch does not introduce buffer overflows or
 | 
			
		||||
    other security issues?
 | 
			
		||||
@item
 | 
			
		||||
Did you test your decoder or demuxer against damaged data? If no, see
 | 
			
		||||
tools/trasher, the noise bitstream filter, and
 | 
			
		||||
@uref{http://caca.zoy.org/wiki/zzuf, zzuf}. Your decoder or demuxer
 | 
			
		||||
should not crash, end in a (near) infinite loop, or allocate ridiculous
 | 
			
		||||
amounts of memory when fed damaged data.
 | 
			
		||||
 | 
			
		||||
    Did you test your decoder or demuxer against damaged data? If no, see
 | 
			
		||||
    tools/trasher and the noise bitstream filter. Your decoder or demuxer
 | 
			
		||||
    should not crash or end in a (near) infinite loop when fed damaged data.
 | 
			
		||||
@item
 | 
			
		||||
Does the patch not mix functional and cosmetic changes?
 | 
			
		||||
 | 
			
		||||
    Does the patch not mix functional and cosmetic changes?
 | 
			
		||||
@item
 | 
			
		||||
Did you add tabs or trailing whitespace to the code? Both are forbidden.
 | 
			
		||||
 | 
			
		||||
    Did you add tabs or trailing whitespace to the code? Both are forbidden.
 | 
			
		||||
@item
 | 
			
		||||
Is the patch attached to the email you send?
 | 
			
		||||
 | 
			
		||||
    Is the patch attached to the email you send?
 | 
			
		||||
@item
 | 
			
		||||
Is the mime type of the patch correct? It should be text/x-diff or
 | 
			
		||||
text/x-patch or at least text/plain and not application/octet-stream.
 | 
			
		||||
 | 
			
		||||
    Is the mime type of the patch correct? It should be text/x-diff or
 | 
			
		||||
    text/x-patch or at least text/plain and not application/octet-stream.
 | 
			
		||||
@item
 | 
			
		||||
If the patch fixes a bug, did you provide a verbose analysis of the bug?
 | 
			
		||||
 | 
			
		||||
    If the patch fixes a bug, did you provide a verbose analysis of the bug?
 | 
			
		||||
@item
 | 
			
		||||
If the patch fixes a bug, did you provide enough information, including
 | 
			
		||||
a sample, so the bug can be reproduced and the fix can be verified?
 | 
			
		||||
Note please do not attach samples >100k to mails but rather provide a
 | 
			
		||||
URL, you can upload to ftp://upload.ffmpeg.org
 | 
			
		||||
 | 
			
		||||
    If the patch fixes a bug, did you provide enough information, including
 | 
			
		||||
    a sample, so the bug can be reproduced and the fix can be verified?
 | 
			
		||||
    Note please do not attach samples >100k to mails but rather provide a
 | 
			
		||||
    URL, you can upload to ftp://upload.ffmpeg.org
 | 
			
		||||
@item
 | 
			
		||||
Did you provide a verbose summary about what the patch does change?
 | 
			
		||||
 | 
			
		||||
    Did you provide a verbose summary about what the patch does change?
 | 
			
		||||
@item
 | 
			
		||||
Did you provide a verbose explanation why it changes things like it does?
 | 
			
		||||
 | 
			
		||||
    Did you provide a verbose explanation why it changes things like it does?
 | 
			
		||||
@item
 | 
			
		||||
Did you provide a verbose summary of the user visible advantages and
 | 
			
		||||
disadvantages if the patch is applied?
 | 
			
		||||
 | 
			
		||||
    Did you provide a verbose summary of the user visible advantages and
 | 
			
		||||
    disadvantages if the patch is applied?
 | 
			
		||||
@item
 | 
			
		||||
Did you provide an example so we can verify the new feature added by the
 | 
			
		||||
patch easily?
 | 
			
		||||
 | 
			
		||||
    Did you provide an example so we can verify the new feature added by the
 | 
			
		||||
    patch easily?
 | 
			
		||||
@item
 | 
			
		||||
If you added a new file, did you insert a license header? It should be
 | 
			
		||||
taken from FFmpeg, not randomly copied and pasted from somewhere else.
 | 
			
		||||
 | 
			
		||||
    If you added a new file, did you insert a license header? It should be
 | 
			
		||||
    taken from FFmpeg, not randomly copied and pasted from somewhere else.
 | 
			
		||||
@item
 | 
			
		||||
You should maintain alphabetical order in alphabetically ordered lists as
 | 
			
		||||
long as doing so does not break API/ABI compatibility.
 | 
			
		||||
 | 
			
		||||
    You should maintain alphabetical order in alphabetically ordered lists as
 | 
			
		||||
    long as doing so does not break API/ABI compatibility.
 | 
			
		||||
@item
 | 
			
		||||
Lines with similar content should be aligned vertically when doing so
 | 
			
		||||
improves readability.
 | 
			
		||||
 | 
			
		||||
    Lines with similar content should be aligned vertically when doing so
 | 
			
		||||
    improves readability.
 | 
			
		||||
@item
 | 
			
		||||
Consider to add a regression test for your code.
 | 
			
		||||
 | 
			
		||||
    Consider to add a regression test for your code.
 | 
			
		||||
@item
 | 
			
		||||
If you added YASM code please check that things still work with --disable-yasm
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Make sure you check the return values of function and return appropriate
 | 
			
		||||
error codes. Especially memory allocation functions like @code{av_malloc()}
 | 
			
		||||
are notoriously left unchecked, which is a serious problem.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Test your code with valgrind and or Address Sanitizer to ensure it's free
 | 
			
		||||
of leaks, out of array accesses, etc.
 | 
			
		||||
    If you added YASM code please check that things still work with --disable-yasm
 | 
			
		||||
@end enumerate
 | 
			
		||||
 | 
			
		||||
@section Patch review process
 | 
			
		||||
@@ -641,157 +529,4 @@ Running 'make fate' accomplishes this, please see @url{fate.html} for details.
 | 
			
		||||
this case, the reference results of the regression tests shall be modified
 | 
			
		||||
accordingly].
 | 
			
		||||
 | 
			
		||||
@subsection Adding files to the fate-suite dataset
 | 
			
		||||
 | 
			
		||||
When there is no muxer or encoder available to generate test media for a
 | 
			
		||||
specific test then the media has to be inlcuded in the fate-suite.
 | 
			
		||||
First please make sure that the sample file is as small as possible to test the
 | 
			
		||||
respective decoder or demuxer sufficiently. Large files increase network
 | 
			
		||||
bandwidth and disk space requirements.
 | 
			
		||||
Once you have a working fate test and fate sample, provide in the commit
 | 
			
		||||
message or introductionary message for the patch series that you post to
 | 
			
		||||
the ffmpeg-devel mailing list, a direct link to download the sample media.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@subsection Visualizing Test Coverage
 | 
			
		||||
 | 
			
		||||
The FFmpeg build system allows visualizing the test coverage in an easy
 | 
			
		||||
manner with the coverage tools @code{gcov}/@code{lcov}.  This involves
 | 
			
		||||
the following steps:
 | 
			
		||||
 | 
			
		||||
@enumerate
 | 
			
		||||
@item
 | 
			
		||||
    Configure to compile with instrumentation enabled:
 | 
			
		||||
    @code{configure --toolchain=gcov}.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
    Run your test case, either manually or via FATE. This can be either
 | 
			
		||||
    the full FATE regression suite, or any arbitrary invocation of any
 | 
			
		||||
    front-end tool provided by FFmpeg, in any combination.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
    Run @code{make lcov} to generate coverage data in HTML format.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
    View @code{lcov/index.html} in your preferred HTML viewer.
 | 
			
		||||
@end enumerate
 | 
			
		||||
 | 
			
		||||
You can use the command @code{make lcov-reset} to reset the coverage
 | 
			
		||||
measurements. You will need to rerun @code{make lcov} after running a
 | 
			
		||||
new test.
 | 
			
		||||
 | 
			
		||||
@subsection Using Valgrind
 | 
			
		||||
 | 
			
		||||
The configure script provides a shortcut for using valgrind to spot bugs
 | 
			
		||||
related to memory handling. Just add the option
 | 
			
		||||
@code{--toolchain=valgrind-memcheck} or @code{--toolchain=valgrind-massif}
 | 
			
		||||
to your configure line, and reasonable defaults will be set for running
 | 
			
		||||
FATE under the supervision of either the @strong{memcheck} or the
 | 
			
		||||
@strong{massif} tool of the valgrind suite.
 | 
			
		||||
 | 
			
		||||
In case you need finer control over how valgrind is invoked, use the
 | 
			
		||||
@code{--target-exec='valgrind <your_custom_valgrind_options>} option in
 | 
			
		||||
your configure line instead.
 | 
			
		||||
 | 
			
		||||
@anchor{Release process}
 | 
			
		||||
@section Release process
 | 
			
		||||
 | 
			
		||||
FFmpeg maintains a set of @strong{release branches}, which are the
 | 
			
		||||
recommended deliverable for system integrators and distributors (such as
 | 
			
		||||
Linux distributions, etc.). At regular times, a @strong{release
 | 
			
		||||
manager} prepares, tests and publishes tarballs on the
 | 
			
		||||
@url{http://ffmpeg.org} website.
 | 
			
		||||
 | 
			
		||||
There are two kinds of releases:
 | 
			
		||||
 | 
			
		||||
@enumerate
 | 
			
		||||
@item
 | 
			
		||||
@strong{Major releases} always include the latest and greatest
 | 
			
		||||
features and functionality.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
@strong{Point releases} are cut from @strong{release} branches,
 | 
			
		||||
which are named @code{release/X}, with @code{X} being the release
 | 
			
		||||
version number.
 | 
			
		||||
@end enumerate
 | 
			
		||||
 | 
			
		||||
Note that we promise to our users that shared libraries from any FFmpeg
 | 
			
		||||
release never break programs that have been @strong{compiled} against
 | 
			
		||||
previous versions of @strong{the same release series} in any case!
 | 
			
		||||
 | 
			
		||||
However, from time to time, we do make API changes that require adaptations
 | 
			
		||||
in applications. Such changes are only allowed in (new) major releases and
 | 
			
		||||
require further steps such as bumping library version numbers and/or
 | 
			
		||||
adjustments to the symbol versioning file. Please discuss such changes
 | 
			
		||||
on the @strong{ffmpeg-devel} mailing list in time to allow forward planning.
 | 
			
		||||
 | 
			
		||||
@anchor{Criteria for Point Releases}
 | 
			
		||||
@subsection Criteria for Point Releases
 | 
			
		||||
 | 
			
		||||
Changes that match the following criteria are valid candidates for
 | 
			
		||||
inclusion into a point release:
 | 
			
		||||
 | 
			
		||||
@enumerate
 | 
			
		||||
@item
 | 
			
		||||
Fixes a security issue, preferably identified by a @strong{CVE
 | 
			
		||||
number} issued by @url{http://cve.mitre.org/}.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Fixes a documented bug in @url{https://trac.ffmpeg.org}.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Improves the included documentation.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Retains both source code and binary compatibility with previous
 | 
			
		||||
point releases of the same release branch.
 | 
			
		||||
@end enumerate
 | 
			
		||||
 | 
			
		||||
The order for checking the rules is (1 OR 2 OR 3) AND 4.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@subsection Release Checklist
 | 
			
		||||
 | 
			
		||||
The release process involves the following steps:
 | 
			
		||||
 | 
			
		||||
@enumerate
 | 
			
		||||
@item
 | 
			
		||||
Ensure that the @file{RELEASE} file contains the version number for
 | 
			
		||||
the upcoming release.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Add the release at @url{https://trac.ffmpeg.org/admin/ticket/versions}.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Announce the intent to do a release to the mailing list.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Make sure all relevant security fixes have been backported. See
 | 
			
		||||
@url{https://ffmpeg.org/security.html}.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Ensure that the FATE regression suite still passes in the release
 | 
			
		||||
branch on at least @strong{i386} and @strong{amd64}
 | 
			
		||||
(cf. @ref{Regression tests}).
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Prepare the release tarballs in @code{bz2} and @code{gz} formats, and
 | 
			
		||||
supplementing files that contain @code{gpg} signatures
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Publish the tarballs at @url{http://ffmpeg.org/releases}. Create and
 | 
			
		||||
push an annotated tag in the form @code{nX}, with @code{X}
 | 
			
		||||
containing the version number.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Propose and send a patch to the @strong{ffmpeg-devel} mailing list
 | 
			
		||||
with a news entry for the website.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Publish the news entry.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Send announcement to the mailing list.
 | 
			
		||||
@end enumerate
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +0,0 @@
 | 
			
		||||
@chapter Device Options
 | 
			
		||||
@c man begin DEVICE OPTIONS
 | 
			
		||||
 | 
			
		||||
The libavdevice library provides the same interface as
 | 
			
		||||
libavformat. Namely, an input device is considered like a demuxer, and
 | 
			
		||||
an output device like a muxer, and the interface and generic device
 | 
			
		||||
options are the same provided by libavformat (see the ffmpeg-formats
 | 
			
		||||
manual).
 | 
			
		||||
 | 
			
		||||
In addition each input or output device may support so-called private
 | 
			
		||||
options, which are specific for that component.
 | 
			
		||||
 | 
			
		||||
Options may be set by specifying -@var{option} @var{value} in the
 | 
			
		||||
FFmpeg tools, or by setting the value explicitly in the device
 | 
			
		||||
@code{AVFormatContext} options or using the @file{libavutil/opt.h} API
 | 
			
		||||
for programmatic use.
 | 
			
		||||
 | 
			
		||||
@c man end DEVICE OPTIONS
 | 
			
		||||
 | 
			
		||||
@include indevs.texi
 | 
			
		||||
@include outdevs.texi
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
SRC_PATH="${1}"
 | 
			
		||||
DOXYFILE="${2}"
 | 
			
		||||
 | 
			
		||||
shift 2
 | 
			
		||||
 | 
			
		||||
doxygen - <<EOF
 | 
			
		||||
@INCLUDE        = ${DOXYFILE}
 | 
			
		||||
INPUT           = $@
 | 
			
		||||
HTML_HEADER     = ${SRC_PATH}/doc/doxy/header.html
 | 
			
		||||
HTML_FOOTER     = ${SRC_PATH}/doc/doxy/footer.html
 | 
			
		||||
HTML_STYLESHEET = ${SRC_PATH}/doc/doxy/doxy_stylesheet.css
 | 
			
		||||
EOF
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,9 +1,10 @@
 | 
			
		||||
 </div>
 | 
			
		||||
 | 
			
		||||
 <footer class="footer pagination-right">
 | 
			
		||||
   <span class="label label-info">
 | 
			
		||||
 <div id="footer">
 | 
			
		||||
   Generated on $datetime for $projectname by <a href="http://www.doxygen.org/index.html">doxygen</a> $doxygenversion
 | 
			
		||||
   </span>
 | 
			
		||||
 </footer>
 | 
			
		||||
 </div>
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,14 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 | 
			
		||||
<html xmlns="http://www.w3.org/1999/xhtml">
 | 
			
		||||
<head>
 | 
			
		||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
 | 
			
		||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 | 
			
		||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
 | 
			
		||||
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
 | 
			
		||||
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
 | 
			
		||||
<link href="$relpath$doxy_stylesheet.css" rel="stylesheet" type="text/css" />
 | 
			
		||||
<!--Header replace -->
 | 
			
		||||
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<div class="container">
 | 
			
		||||
<div id="container">
 | 
			
		||||
 | 
			
		||||
<!--Header replace -->
 | 
			
		||||
<div class="menu">
 | 
			
		||||
<div id="body">
 | 
			
		||||
 <div>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1116
									
								
								doc/encoders.texi
									
									
									
									
									
								
							
							
						
						
									
										1116
									
								
								doc/encoders.texi
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										204
									
								
								doc/eval.texi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								doc/eval.texi
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,204 @@
 | 
			
		||||
@chapter Expression Evaluation
 | 
			
		||||
@c man begin EXPRESSION EVALUATION
 | 
			
		||||
 | 
			
		||||
When evaluating an arithmetic expression, FFmpeg uses an internal
 | 
			
		||||
formula evaluator, implemented through the @file{libavutil/eval.h}
 | 
			
		||||
interface.
 | 
			
		||||
 | 
			
		||||
An expression may contain unary, binary operators, constants, and
 | 
			
		||||
functions.
 | 
			
		||||
 | 
			
		||||
Two expressions @var{expr1} and @var{expr2} can be combined to form
 | 
			
		||||
another expression "@var{expr1};@var{expr2}".
 | 
			
		||||
@var{expr1} and @var{expr2} are evaluated in turn, and the new
 | 
			
		||||
expression evaluates to the value of @var{expr2}.
 | 
			
		||||
 | 
			
		||||
The following binary operators are available: @code{+}, @code{-},
 | 
			
		||||
@code{*}, @code{/}, @code{^}.
 | 
			
		||||
 | 
			
		||||
The following unary operators are available: @code{+}, @code{-}.
 | 
			
		||||
 | 
			
		||||
The following functions are available:
 | 
			
		||||
@table @option
 | 
			
		||||
@item sinh(x)
 | 
			
		||||
@item cosh(x)
 | 
			
		||||
@item tanh(x)
 | 
			
		||||
@item sin(x)
 | 
			
		||||
@item cos(x)
 | 
			
		||||
@item tan(x)
 | 
			
		||||
@item atan(x)
 | 
			
		||||
@item asin(x)
 | 
			
		||||
@item acos(x)
 | 
			
		||||
@item exp(x)
 | 
			
		||||
@item log(x)
 | 
			
		||||
@item abs(x)
 | 
			
		||||
@item squish(x)
 | 
			
		||||
@item gauss(x)
 | 
			
		||||
@item isnan(x)
 | 
			
		||||
Return 1.0 if @var{x} is NAN, 0.0 otherwise.
 | 
			
		||||
 | 
			
		||||
@item mod(x, y)
 | 
			
		||||
@item max(x, y)
 | 
			
		||||
@item min(x, y)
 | 
			
		||||
@item eq(x, y)
 | 
			
		||||
@item gte(x, y)
 | 
			
		||||
@item gt(x, y)
 | 
			
		||||
@item lte(x, y)
 | 
			
		||||
@item lt(x, y)
 | 
			
		||||
@item st(var, expr)
 | 
			
		||||
Allow to store the value of the expression @var{expr} in an internal
 | 
			
		||||
variable. @var{var} specifies the number of the variable where to
 | 
			
		||||
store the value, and it is a value ranging from 0 to 9. The function
 | 
			
		||||
returns the value stored in the internal variable.
 | 
			
		||||
Note, Variables are currently not shared between expressions.
 | 
			
		||||
 | 
			
		||||
@item ld(var)
 | 
			
		||||
Allow to load the value of the internal variable with number
 | 
			
		||||
@var{var}, which was previously stored with st(@var{var}, @var{expr}).
 | 
			
		||||
The function returns the loaded value.
 | 
			
		||||
 | 
			
		||||
@item while(cond, expr)
 | 
			
		||||
Evaluate expression @var{expr} while the expression @var{cond} is
 | 
			
		||||
non-zero, and returns the value of the last @var{expr} evaluation, or
 | 
			
		||||
NAN if @var{cond} was always false.
 | 
			
		||||
 | 
			
		||||
@item ceil(expr)
 | 
			
		||||
Round the value of expression @var{expr} upwards to the nearest
 | 
			
		||||
integer. For example, "ceil(1.5)" is "2.0".
 | 
			
		||||
 | 
			
		||||
@item floor(expr)
 | 
			
		||||
Round the value of expression @var{expr} downwards to the nearest
 | 
			
		||||
integer. For example, "floor(-1.5)" is "-2.0".
 | 
			
		||||
 | 
			
		||||
@item trunc(expr)
 | 
			
		||||
Round the value of expression @var{expr} towards zero to the nearest
 | 
			
		||||
integer. For example, "trunc(-1.5)" is "-1.0".
 | 
			
		||||
 | 
			
		||||
@item sqrt(expr)
 | 
			
		||||
Compute the square root of @var{expr}. This is equivalent to
 | 
			
		||||
"(@var{expr})^.5".
 | 
			
		||||
 | 
			
		||||
@item not(expr)
 | 
			
		||||
Return 1.0 if @var{expr} is zero, 0.0 otherwise.
 | 
			
		||||
 | 
			
		||||
@item pow(x, y)
 | 
			
		||||
Compute the power of @var{x} elevated @var{y}, it is equivalent to
 | 
			
		||||
"(@var{x})^(@var{y})".
 | 
			
		||||
 | 
			
		||||
@item random(x)
 | 
			
		||||
Return a pseudo random value between 0.0 and 1.0. @var{x} is the index of the
 | 
			
		||||
internal variable which will be used to save the seed/state.
 | 
			
		||||
 | 
			
		||||
@item hypot(x, y)
 | 
			
		||||
This function is similar to the C function with the same name; it returns
 | 
			
		||||
"sqrt(@var{x}*@var{x} + @var{y}*@var{y})", the length of the hypotenuse of a
 | 
			
		||||
right triangle with sides of length @var{x} and @var{y}, or the distance of the
 | 
			
		||||
point (@var{x}, @var{y}) from the origin.
 | 
			
		||||
 | 
			
		||||
@item gcd(x, y)
 | 
			
		||||
Return the greatest common divisor of @var{x} and @var{y}. If both @var{x} and
 | 
			
		||||
@var{y} are 0 or either or both are less than zero then behavior is undefined.
 | 
			
		||||
 | 
			
		||||
@item if(x, y)
 | 
			
		||||
Evaluate @var{x}, and if the result is non-zero return the result of
 | 
			
		||||
the evaluation of @var{y}, return 0 otherwise.
 | 
			
		||||
 | 
			
		||||
@item ifnot(x, y)
 | 
			
		||||
Evaluate @var{x}, and if the result is zero return the result of the
 | 
			
		||||
evaluation of @var{y}, return 0 otherwise.
 | 
			
		||||
 | 
			
		||||
@item taylor(expr, x) taylor(expr, x, id)
 | 
			
		||||
Evaluate a taylor series at x.
 | 
			
		||||
expr represents the LD(id)-th derivates of f(x) at 0. If id is not specified
 | 
			
		||||
then 0 is assumed.
 | 
			
		||||
note, when you have the derivatives at y instead of 0
 | 
			
		||||
taylor(expr, x-y) can be used
 | 
			
		||||
When the series does not converge the results are undefined.
 | 
			
		||||
 | 
			
		||||
@item root(expr, max)
 | 
			
		||||
Finds x where f(x)=0 in the interval 0..max.
 | 
			
		||||
f() must be continuous or the result is undefined.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
The following constants are available:
 | 
			
		||||
@table @option
 | 
			
		||||
@item PI
 | 
			
		||||
area of the unit disc, approximately 3.14
 | 
			
		||||
@item E
 | 
			
		||||
exp(1) (Euler's number), approximately 2.718
 | 
			
		||||
@item PHI
 | 
			
		||||
golden ratio (1+sqrt(5))/2, approximately 1.618
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Assuming that an expression is considered "true" if it has a non-zero
 | 
			
		||||
value, note that:
 | 
			
		||||
 | 
			
		||||
@code{*} works like AND
 | 
			
		||||
 | 
			
		||||
@code{+} works like OR
 | 
			
		||||
 | 
			
		||||
and the construct:
 | 
			
		||||
@example
 | 
			
		||||
if A then B else C
 | 
			
		||||
@end example
 | 
			
		||||
is equivalent to
 | 
			
		||||
@example
 | 
			
		||||
if(A,B) + ifnot(A,C)
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
In your C code, you can extend the list of unary and binary functions,
 | 
			
		||||
and define recognized constants, so that they are available for your
 | 
			
		||||
expressions.
 | 
			
		||||
 | 
			
		||||
The evaluator also recognizes the International System number
 | 
			
		||||
postfixes. If 'i' is appended after the postfix, powers of 2 are used
 | 
			
		||||
instead of powers of 10. The 'B' postfix multiplies the value for 8,
 | 
			
		||||
and can be appended after another postfix or used alone. This allows
 | 
			
		||||
using for example 'KB', 'MiB', 'G' and 'B' as postfix.
 | 
			
		||||
 | 
			
		||||
Follows the list of available International System postfixes, with
 | 
			
		||||
indication of the corresponding powers of 10 and of 2.
 | 
			
		||||
@table @option
 | 
			
		||||
@item y
 | 
			
		||||
-24 / -80
 | 
			
		||||
@item z
 | 
			
		||||
-21 / -70
 | 
			
		||||
@item a
 | 
			
		||||
-18 / -60
 | 
			
		||||
@item f
 | 
			
		||||
-15 / -50
 | 
			
		||||
@item p
 | 
			
		||||
-12 / -40
 | 
			
		||||
@item n
 | 
			
		||||
-9 / -30
 | 
			
		||||
@item u
 | 
			
		||||
-6 / -20
 | 
			
		||||
@item m
 | 
			
		||||
-3 / -10
 | 
			
		||||
@item c
 | 
			
		||||
-2
 | 
			
		||||
@item d
 | 
			
		||||
-1
 | 
			
		||||
@item h
 | 
			
		||||
2
 | 
			
		||||
@item k
 | 
			
		||||
3 / 10
 | 
			
		||||
@item K
 | 
			
		||||
3 / 10
 | 
			
		||||
@item M
 | 
			
		||||
6 / 20
 | 
			
		||||
@item G
 | 
			
		||||
9 / 30
 | 
			
		||||
@item T
 | 
			
		||||
12 / 40
 | 
			
		||||
@item P
 | 
			
		||||
15 / 40
 | 
			
		||||
@item E
 | 
			
		||||
18 / 50
 | 
			
		||||
@item Z
 | 
			
		||||
21 / 60
 | 
			
		||||
@item Y
 | 
			
		||||
24 / 70
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@c man end
 | 
			
		||||
@@ -3,36 +3,30 @@ FFMPEG_LIBS=    libavdevice                        \
 | 
			
		||||
                libavformat                        \
 | 
			
		||||
                libavfilter                        \
 | 
			
		||||
                libavcodec                         \
 | 
			
		||||
                libavresample                      \
 | 
			
		||||
                libswresample                      \
 | 
			
		||||
                libswscale                         \
 | 
			
		||||
                libavutil                          \
 | 
			
		||||
 | 
			
		||||
CFLAGS += -Wall -g
 | 
			
		||||
CFLAGS := $(shell pkg-config --cflags $(FFMPEG_LIBS)) $(CFLAGS)
 | 
			
		||||
LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS)) $(LDLIBS)
 | 
			
		||||
CFLAGS += -Wall -O2 -g
 | 
			
		||||
CFLAGS += $(shell pkg-config --cflags $(FFMPEG_LIBS))
 | 
			
		||||
LDLIBS += $(shell pkg-config --libs $(FFMPEG_LIBS))
 | 
			
		||||
 | 
			
		||||
EXAMPLES=       decoding_encoding                  \
 | 
			
		||||
                demuxing                           \
 | 
			
		||||
                filtering_video                    \
 | 
			
		||||
                filtering_audio                    \
 | 
			
		||||
                metadata                           \
 | 
			
		||||
                muxing                             \
 | 
			
		||||
                resampling_audio                   \
 | 
			
		||||
                scaling_video                      \
 | 
			
		||||
 | 
			
		||||
OBJS=$(addsuffix .o,$(EXAMPLES))
 | 
			
		||||
 | 
			
		||||
# the following examples make explicit use of the math library
 | 
			
		||||
decoding_encoding: LDLIBS += -lm
 | 
			
		||||
muxing:            LDLIBS += -lm
 | 
			
		||||
resampling_audio:  LDLIBS += -lm
 | 
			
		||||
 | 
			
		||||
.phony: all clean-test clean
 | 
			
		||||
.phony: all clean
 | 
			
		||||
 | 
			
		||||
all: $(OBJS) $(EXAMPLES)
 | 
			
		||||
 | 
			
		||||
clean-test:
 | 
			
		||||
	$(RM) test*.pgm test.h264 test.mp2 test.sw test.mpg
 | 
			
		||||
 | 
			
		||||
clean: clean-test
 | 
			
		||||
	$(RM) $(EXAMPLES) $(OBJS)
 | 
			
		||||
clean:
 | 
			
		||||
	rm -rf $(EXAMPLES) $(OBJS)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +0,0 @@
 | 
			
		||||
FFmpeg examples README
 | 
			
		||||
----------------------
 | 
			
		||||
 | 
			
		||||
Both following use cases rely on pkg-config and make, thus make sure
 | 
			
		||||
that you have them installed and working on your system.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1) Build the installed examples in a generic read/write user directory
 | 
			
		||||
 | 
			
		||||
Copy to a read/write user directory and just use "make", it will link
 | 
			
		||||
to the libraries on your system, assuming the PKG_CONFIG_PATH is
 | 
			
		||||
correctly configured.
 | 
			
		||||
 | 
			
		||||
2) Build the examples in-tree
 | 
			
		||||
 | 
			
		||||
Assuming you are in the source FFmpeg checkout directory, you need to build
 | 
			
		||||
FFmpeg (no need to make install in any prefix). Then you can go into
 | 
			
		||||
doc/examples and run a command such as PKG_CONFIG_PATH=pc-uninstalled make.
 | 
			
		||||
@@ -27,16 +27,13 @@
 | 
			
		||||
 * Note that libavcodec only handles codecs (mpeg, mpeg4, etc...),
 | 
			
		||||
 * not file formats (avi, vob, mp4, mov, mkv, mxf, flv, mpegts, mpegps, etc...). See library 'libavformat' for the
 | 
			
		||||
 * format handling
 | 
			
		||||
 * @example doc/examples/decoding_encoding.c
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <math.h>
 | 
			
		||||
 | 
			
		||||
#include <libavutil/imgutils.h>
 | 
			
		||||
#include <libavutil/opt.h>
 | 
			
		||||
#include <libavcodec/avcodec.h>
 | 
			
		||||
#include <libavutil/channel_layout.h>
 | 
			
		||||
#include <libavutil/common.h>
 | 
			
		||||
#include <libavutil/imgutils.h>
 | 
			
		||||
#include <libavutil/mathematics.h>
 | 
			
		||||
#include <libavutil/samplefmt.h>
 | 
			
		||||
 | 
			
		||||
@@ -44,59 +41,6 @@
 | 
			
		||||
#define AUDIO_INBUF_SIZE 20480
 | 
			
		||||
#define AUDIO_REFILL_THRESH 4096
 | 
			
		||||
 | 
			
		||||
/* check that a given sample format is supported by the encoder */
 | 
			
		||||
static int check_sample_fmt(AVCodec *codec, enum AVSampleFormat sample_fmt)
 | 
			
		||||
{
 | 
			
		||||
    const enum AVSampleFormat *p = codec->sample_fmts;
 | 
			
		||||
 | 
			
		||||
    while (*p != AV_SAMPLE_FMT_NONE) {
 | 
			
		||||
        if (*p == sample_fmt)
 | 
			
		||||
            return 1;
 | 
			
		||||
        p++;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* just pick the highest supported samplerate */
 | 
			
		||||
static int select_sample_rate(AVCodec *codec)
 | 
			
		||||
{
 | 
			
		||||
    const int *p;
 | 
			
		||||
    int best_samplerate = 0;
 | 
			
		||||
 | 
			
		||||
    if (!codec->supported_samplerates)
 | 
			
		||||
        return 44100;
 | 
			
		||||
 | 
			
		||||
    p = codec->supported_samplerates;
 | 
			
		||||
    while (*p) {
 | 
			
		||||
        best_samplerate = FFMAX(*p, best_samplerate);
 | 
			
		||||
        p++;
 | 
			
		||||
    }
 | 
			
		||||
    return best_samplerate;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* select layout with the highest channel count */
 | 
			
		||||
static int select_channel_layout(AVCodec *codec)
 | 
			
		||||
{
 | 
			
		||||
    const uint64_t *p;
 | 
			
		||||
    uint64_t best_ch_layout = 0;
 | 
			
		||||
    int best_nb_channels   = 0;
 | 
			
		||||
 | 
			
		||||
    if (!codec->channel_layouts)
 | 
			
		||||
        return AV_CH_LAYOUT_STEREO;
 | 
			
		||||
 | 
			
		||||
    p = codec->channel_layouts;
 | 
			
		||||
    while (*p) {
 | 
			
		||||
        int nb_channels = av_get_channel_layout_nb_channels(*p);
 | 
			
		||||
 | 
			
		||||
        if (nb_channels > best_nb_channels) {
 | 
			
		||||
            best_ch_layout    = *p;
 | 
			
		||||
            best_nb_channels = nb_channels;
 | 
			
		||||
        }
 | 
			
		||||
        p++;
 | 
			
		||||
    }
 | 
			
		||||
    return best_ch_layout;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Audio encoding example
 | 
			
		||||
 */
 | 
			
		||||
@@ -104,83 +48,44 @@ static void audio_encode_example(const char *filename)
 | 
			
		||||
{
 | 
			
		||||
    AVCodec *codec;
 | 
			
		||||
    AVCodecContext *c= NULL;
 | 
			
		||||
    AVFrame *frame;
 | 
			
		||||
    AVPacket pkt;
 | 
			
		||||
    int i, j, k, ret, got_output;
 | 
			
		||||
    int buffer_size;
 | 
			
		||||
    int frame_size, i, j, out_size, outbuf_size;
 | 
			
		||||
    FILE *f;
 | 
			
		||||
    uint16_t *samples;
 | 
			
		||||
    short *samples;
 | 
			
		||||
    float t, tincr;
 | 
			
		||||
    uint8_t *outbuf;
 | 
			
		||||
 | 
			
		||||
    printf("Encode audio file %s\n", filename);
 | 
			
		||||
 | 
			
		||||
    /* find the MP2 encoder */
 | 
			
		||||
    codec = avcodec_find_encoder(AV_CODEC_ID_MP2);
 | 
			
		||||
    codec = avcodec_find_encoder(CODEC_ID_MP2);
 | 
			
		||||
    if (!codec) {
 | 
			
		||||
        fprintf(stderr, "Codec not found\n");
 | 
			
		||||
        fprintf(stderr, "codec not found\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    c = avcodec_alloc_context3(codec);
 | 
			
		||||
    if (!c) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate audio codec context\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* put sample parameters */
 | 
			
		||||
    c->bit_rate = 64000;
 | 
			
		||||
 | 
			
		||||
    /* check that the encoder supports s16 pcm input */
 | 
			
		||||
    c->sample_rate = 44100;
 | 
			
		||||
    c->channels = 2;
 | 
			
		||||
    c->sample_fmt = AV_SAMPLE_FMT_S16;
 | 
			
		||||
    if (!check_sample_fmt(codec, c->sample_fmt)) {
 | 
			
		||||
        fprintf(stderr, "Encoder does not support sample format %s",
 | 
			
		||||
                av_get_sample_fmt_name(c->sample_fmt));
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* select other audio parameters supported by the encoder */
 | 
			
		||||
    c->sample_rate    = select_sample_rate(codec);
 | 
			
		||||
    c->channel_layout = select_channel_layout(codec);
 | 
			
		||||
    c->channels       = av_get_channel_layout_nb_channels(c->channel_layout);
 | 
			
		||||
 | 
			
		||||
    /* open it */
 | 
			
		||||
    if (avcodec_open2(c, codec, NULL) < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not open codec\n");
 | 
			
		||||
        fprintf(stderr, "could not open codec\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* the codec gives us the frame size, in samples */
 | 
			
		||||
    frame_size = c->frame_size;
 | 
			
		||||
    samples = malloc(frame_size * 2 * c->channels);
 | 
			
		||||
    outbuf_size = 10000;
 | 
			
		||||
    outbuf = malloc(outbuf_size);
 | 
			
		||||
 | 
			
		||||
    f = fopen(filename, "wb");
 | 
			
		||||
    if (!f) {
 | 
			
		||||
        fprintf(stderr, "Could not open %s\n", filename);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* frame containing input raw audio */
 | 
			
		||||
    frame = avcodec_alloc_frame();
 | 
			
		||||
    if (!frame) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate audio frame\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    frame->nb_samples     = c->frame_size;
 | 
			
		||||
    frame->format         = c->sample_fmt;
 | 
			
		||||
    frame->channel_layout = c->channel_layout;
 | 
			
		||||
 | 
			
		||||
    /* the codec gives us the frame size, in samples,
 | 
			
		||||
     * we calculate the size of the samples buffer in bytes */
 | 
			
		||||
    buffer_size = av_samples_get_buffer_size(NULL, c->channels, c->frame_size,
 | 
			
		||||
                                             c->sample_fmt, 0);
 | 
			
		||||
    samples = av_malloc(buffer_size);
 | 
			
		||||
    if (!samples) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate %d bytes for samples buffer\n",
 | 
			
		||||
                buffer_size);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    /* setup the data pointers in the AVFrame */
 | 
			
		||||
    ret = avcodec_fill_audio_frame(frame, c->channels, c->sample_fmt,
 | 
			
		||||
                                   (const uint8_t*)samples, buffer_size, 0);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not setup audio frame\n");
 | 
			
		||||
        fprintf(stderr, "could not open %s\n", filename);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -188,46 +93,19 @@ static void audio_encode_example(const char *filename)
 | 
			
		||||
    t = 0;
 | 
			
		||||
    tincr = 2 * M_PI * 440.0 / c->sample_rate;
 | 
			
		||||
    for(i=0;i<200;i++) {
 | 
			
		||||
        av_init_packet(&pkt);
 | 
			
		||||
        pkt.data = NULL; // packet data will be allocated by the encoder
 | 
			
		||||
        pkt.size = 0;
 | 
			
		||||
 | 
			
		||||
        for (j = 0; j < c->frame_size; j++) {
 | 
			
		||||
        for(j=0;j<frame_size;j++) {
 | 
			
		||||
            samples[2*j] = (int)(sin(t) * 10000);
 | 
			
		||||
 | 
			
		||||
            for (k = 1; k < c->channels; k++)
 | 
			
		||||
                samples[2*j + k] = samples[2*j];
 | 
			
		||||
            samples[2*j+1] = samples[2*j];
 | 
			
		||||
            t += tincr;
 | 
			
		||||
        }
 | 
			
		||||
        /* encode the samples */
 | 
			
		||||
        ret = avcodec_encode_audio2(c, &pkt, frame, &got_output);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "Error encoding audio frame\n");
 | 
			
		||||
            exit(1);
 | 
			
		||||
        }
 | 
			
		||||
        if (got_output) {
 | 
			
		||||
            fwrite(pkt.data, 1, pkt.size, f);
 | 
			
		||||
            av_free_packet(&pkt);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* get the delayed frames */
 | 
			
		||||
    for (got_output = 1; got_output; i++) {
 | 
			
		||||
        ret = avcodec_encode_audio2(c, &pkt, NULL, &got_output);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "Error encoding frame\n");
 | 
			
		||||
            exit(1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (got_output) {
 | 
			
		||||
            fwrite(pkt.data, 1, pkt.size, f);
 | 
			
		||||
            av_free_packet(&pkt);
 | 
			
		||||
        }
 | 
			
		||||
        out_size = avcodec_encode_audio(c, outbuf, outbuf_size, samples);
 | 
			
		||||
        fwrite(outbuf, 1, out_size, f);
 | 
			
		||||
    }
 | 
			
		||||
    fclose(f);
 | 
			
		||||
    free(outbuf);
 | 
			
		||||
    free(samples);
 | 
			
		||||
 | 
			
		||||
    av_freep(&samples);
 | 
			
		||||
    avcodec_free_frame(&frame);
 | 
			
		||||
    avcodec_close(c);
 | 
			
		||||
    av_free(c);
 | 
			
		||||
}
 | 
			
		||||
@@ -247,30 +125,26 @@ static void audio_decode_example(const char *outfilename, const char *filename)
 | 
			
		||||
 | 
			
		||||
    av_init_packet(&avpkt);
 | 
			
		||||
 | 
			
		||||
    printf("Decode audio file %s to %s\n", filename, outfilename);
 | 
			
		||||
    printf("Decode audio file %s\n", filename);
 | 
			
		||||
 | 
			
		||||
    /* find the mpeg audio decoder */
 | 
			
		||||
    codec = avcodec_find_decoder(AV_CODEC_ID_MP2);
 | 
			
		||||
    codec = avcodec_find_decoder(CODEC_ID_MP2);
 | 
			
		||||
    if (!codec) {
 | 
			
		||||
        fprintf(stderr, "Codec not found\n");
 | 
			
		||||
        fprintf(stderr, "codec not found\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    c = avcodec_alloc_context3(codec);
 | 
			
		||||
    if (!c) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate audio codec context\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* open it */
 | 
			
		||||
    if (avcodec_open2(c, codec, NULL) < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not open codec\n");
 | 
			
		||||
        fprintf(stderr, "could not open codec\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    f = fopen(filename, "rb");
 | 
			
		||||
    if (!f) {
 | 
			
		||||
        fprintf(stderr, "Could not open %s\n", filename);
 | 
			
		||||
        fprintf(stderr, "could not open %s\n", filename);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    outfile = fopen(outfilename, "wb");
 | 
			
		||||
@@ -288,7 +162,7 @@ static void audio_decode_example(const char *outfilename, const char *filename)
 | 
			
		||||
 | 
			
		||||
        if (!decoded_frame) {
 | 
			
		||||
            if (!(decoded_frame = avcodec_alloc_frame())) {
 | 
			
		||||
                fprintf(stderr, "Could not allocate audio frame\n");
 | 
			
		||||
                fprintf(stderr, "out of memory\n");
 | 
			
		||||
                exit(1);
 | 
			
		||||
            }
 | 
			
		||||
        } else
 | 
			
		||||
@@ -329,7 +203,7 @@ static void audio_decode_example(const char *outfilename, const char *filename)
 | 
			
		||||
 | 
			
		||||
    avcodec_close(c);
 | 
			
		||||
    av_free(c);
 | 
			
		||||
    avcodec_free_frame(&decoded_frame);
 | 
			
		||||
    av_free(decoded_frame);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@@ -339,26 +213,23 @@ static void video_encode_example(const char *filename, int codec_id)
 | 
			
		||||
{
 | 
			
		||||
    AVCodec *codec;
 | 
			
		||||
    AVCodecContext *c= NULL;
 | 
			
		||||
    int i, ret, x, y, got_output;
 | 
			
		||||
    int i, out_size, x, y, outbuf_size;
 | 
			
		||||
    FILE *f;
 | 
			
		||||
    AVFrame *frame;
 | 
			
		||||
    AVPacket pkt;
 | 
			
		||||
    uint8_t endcode[] = { 0, 0, 1, 0xb7 };
 | 
			
		||||
    AVFrame *picture;
 | 
			
		||||
    uint8_t *outbuf;
 | 
			
		||||
    int had_output=0;
 | 
			
		||||
 | 
			
		||||
    printf("Encode video file %s\n", filename);
 | 
			
		||||
 | 
			
		||||
    /* find the mpeg1 video encoder */
 | 
			
		||||
    codec = avcodec_find_encoder(codec_id);
 | 
			
		||||
    if (!codec) {
 | 
			
		||||
        fprintf(stderr, "Codec not found\n");
 | 
			
		||||
        fprintf(stderr, "codec not found\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    c = avcodec_alloc_context3(codec);
 | 
			
		||||
    if (!c) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate video codec context\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    picture= avcodec_alloc_frame();
 | 
			
		||||
 | 
			
		||||
    /* put sample parameters */
 | 
			
		||||
    c->bit_rate = 400000;
 | 
			
		||||
@@ -369,105 +240,81 @@ static void video_encode_example(const char *filename, int codec_id)
 | 
			
		||||
    c->time_base= (AVRational){1,25};
 | 
			
		||||
    c->gop_size = 10; /* emit one intra frame every ten frames */
 | 
			
		||||
    c->max_b_frames=1;
 | 
			
		||||
    c->pix_fmt = AV_PIX_FMT_YUV420P;
 | 
			
		||||
    c->pix_fmt = PIX_FMT_YUV420P;
 | 
			
		||||
 | 
			
		||||
    if(codec_id == AV_CODEC_ID_H264)
 | 
			
		||||
    if(codec_id == CODEC_ID_H264)
 | 
			
		||||
        av_opt_set(c->priv_data, "preset", "slow", 0);
 | 
			
		||||
 | 
			
		||||
    /* open it */
 | 
			
		||||
    if (avcodec_open2(c, codec, NULL) < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not open codec\n");
 | 
			
		||||
        fprintf(stderr, "could not open codec\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    f = fopen(filename, "wb");
 | 
			
		||||
    if (!f) {
 | 
			
		||||
        fprintf(stderr, "Could not open %s\n", filename);
 | 
			
		||||
        fprintf(stderr, "could not open %s\n", filename);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    frame = avcodec_alloc_frame();
 | 
			
		||||
    if (!frame) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate video frame\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    frame->format = c->pix_fmt;
 | 
			
		||||
    frame->width  = c->width;
 | 
			
		||||
    frame->height = c->height;
 | 
			
		||||
    /* alloc image and output buffer */
 | 
			
		||||
    outbuf_size = 100000 + 12*c->width*c->height;
 | 
			
		||||
    outbuf = malloc(outbuf_size);
 | 
			
		||||
 | 
			
		||||
    /* the image can be allocated by any means and av_image_alloc() is
 | 
			
		||||
     * just the most convenient way if av_malloc() is to be used */
 | 
			
		||||
    ret = av_image_alloc(frame->data, frame->linesize, c->width, c->height,
 | 
			
		||||
                         c->pix_fmt, 32);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate raw picture buffer\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    av_image_alloc(picture->data, picture->linesize,
 | 
			
		||||
                   c->width, c->height, c->pix_fmt, 1);
 | 
			
		||||
 | 
			
		||||
    /* encode 1 second of video */
 | 
			
		||||
    for(i=0;i<25;i++) {
 | 
			
		||||
        av_init_packet(&pkt);
 | 
			
		||||
        pkt.data = NULL;    // packet data will be allocated by the encoder
 | 
			
		||||
        pkt.size = 0;
 | 
			
		||||
 | 
			
		||||
        fflush(stdout);
 | 
			
		||||
        /* prepare a dummy image */
 | 
			
		||||
        /* Y */
 | 
			
		||||
        for(y=0;y<c->height;y++) {
 | 
			
		||||
            for(x=0;x<c->width;x++) {
 | 
			
		||||
                frame->data[0][y * frame->linesize[0] + x] = x + y + i * 3;
 | 
			
		||||
                picture->data[0][y * picture->linesize[0] + x] = x + y + i * 3;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* Cb and Cr */
 | 
			
		||||
        for(y=0;y<c->height/2;y++) {
 | 
			
		||||
            for(x=0;x<c->width/2;x++) {
 | 
			
		||||
                frame->data[1][y * frame->linesize[1] + x] = 128 + y + i * 2;
 | 
			
		||||
                frame->data[2][y * frame->linesize[2] + x] = 64 + x + i * 5;
 | 
			
		||||
                picture->data[1][y * picture->linesize[1] + x] = 128 + y + i * 2;
 | 
			
		||||
                picture->data[2][y * picture->linesize[2] + x] = 64 + x + i * 5;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        frame->pts = i;
 | 
			
		||||
 | 
			
		||||
        /* encode the image */
 | 
			
		||||
        ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "Error encoding frame\n");
 | 
			
		||||
            exit(1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (got_output) {
 | 
			
		||||
            printf("Write frame %3d (size=%5d)\n", i, pkt.size);
 | 
			
		||||
            fwrite(pkt.data, 1, pkt.size, f);
 | 
			
		||||
            av_free_packet(&pkt);
 | 
			
		||||
        }
 | 
			
		||||
        out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture);
 | 
			
		||||
        had_output |= out_size;
 | 
			
		||||
        printf("encoding frame %3d (size=%5d)\n", i, out_size);
 | 
			
		||||
        fwrite(outbuf, 1, out_size, f);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* get the delayed frames */
 | 
			
		||||
    for (got_output = 1; got_output; i++) {
 | 
			
		||||
    for(; out_size || !had_output; i++) {
 | 
			
		||||
        fflush(stdout);
 | 
			
		||||
 | 
			
		||||
        ret = avcodec_encode_video2(c, &pkt, NULL, &got_output);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "Error encoding frame\n");
 | 
			
		||||
            exit(1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (got_output) {
 | 
			
		||||
            printf("Write frame %3d (size=%5d)\n", i, pkt.size);
 | 
			
		||||
            fwrite(pkt.data, 1, pkt.size, f);
 | 
			
		||||
            av_free_packet(&pkt);
 | 
			
		||||
        }
 | 
			
		||||
        out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
 | 
			
		||||
        had_output |= out_size;
 | 
			
		||||
        printf("write frame %3d (size=%5d)\n", i, out_size);
 | 
			
		||||
        fwrite(outbuf, 1, out_size, f);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* add sequence end code to have a real mpeg file */
 | 
			
		||||
    fwrite(endcode, 1, sizeof(endcode), f);
 | 
			
		||||
    outbuf[0] = 0x00;
 | 
			
		||||
    outbuf[1] = 0x00;
 | 
			
		||||
    outbuf[2] = 0x01;
 | 
			
		||||
    outbuf[3] = 0xb7;
 | 
			
		||||
    fwrite(outbuf, 1, 4, f);
 | 
			
		||||
    fclose(f);
 | 
			
		||||
    free(outbuf);
 | 
			
		||||
 | 
			
		||||
    avcodec_close(c);
 | 
			
		||||
    av_free(c);
 | 
			
		||||
    av_freep(&frame->data[0]);
 | 
			
		||||
    avcodec_free_frame(&frame);
 | 
			
		||||
    av_free(picture->data[0]);
 | 
			
		||||
    av_free(picture);
 | 
			
		||||
    printf("\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -488,42 +335,15 @@ static void pgm_save(unsigned char *buf, int wrap, int xsize, int ysize,
 | 
			
		||||
    fclose(f);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int decode_write_frame(const char *outfilename, AVCodecContext *avctx,
 | 
			
		||||
                              AVFrame *frame, int *frame_count, AVPacket *pkt, int last)
 | 
			
		||||
{
 | 
			
		||||
    int len, got_frame;
 | 
			
		||||
    char buf[1024];
 | 
			
		||||
 | 
			
		||||
    len = avcodec_decode_video2(avctx, frame, &got_frame, pkt);
 | 
			
		||||
    if (len < 0) {
 | 
			
		||||
        fprintf(stderr, "Error while decoding frame %d\n", *frame_count);
 | 
			
		||||
        return len;
 | 
			
		||||
    }
 | 
			
		||||
    if (got_frame) {
 | 
			
		||||
        printf("Saving %sframe %3d\n", last ? "last " : "", *frame_count);
 | 
			
		||||
        fflush(stdout);
 | 
			
		||||
 | 
			
		||||
        /* the picture is allocated by the decoder, no need to free it */
 | 
			
		||||
        snprintf(buf, sizeof(buf), outfilename, *frame_count);
 | 
			
		||||
        pgm_save(frame->data[0], frame->linesize[0],
 | 
			
		||||
                 avctx->width, avctx->height, buf);
 | 
			
		||||
        (*frame_count)++;
 | 
			
		||||
    }
 | 
			
		||||
    if (pkt->data) {
 | 
			
		||||
        pkt->size -= len;
 | 
			
		||||
        pkt->data += len;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void video_decode_example(const char *outfilename, const char *filename)
 | 
			
		||||
{
 | 
			
		||||
    AVCodec *codec;
 | 
			
		||||
    AVCodecContext *c= NULL;
 | 
			
		||||
    int frame_count;
 | 
			
		||||
    int frame, got_picture, len;
 | 
			
		||||
    FILE *f;
 | 
			
		||||
    AVFrame *frame;
 | 
			
		||||
    AVFrame *picture;
 | 
			
		||||
    uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
 | 
			
		||||
    char buf[1024];
 | 
			
		||||
    AVPacket avpkt;
 | 
			
		||||
 | 
			
		||||
    av_init_packet(&avpkt);
 | 
			
		||||
@@ -531,20 +351,17 @@ static void video_decode_example(const char *outfilename, const char *filename)
 | 
			
		||||
    /* set end of buffer to 0 (this ensures that no overreading happens for damaged mpeg streams) */
 | 
			
		||||
    memset(inbuf + INBUF_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);
 | 
			
		||||
 | 
			
		||||
    printf("Decode video file %s to %s\n", filename, outfilename);
 | 
			
		||||
    printf("Decode video file %s\n", filename);
 | 
			
		||||
 | 
			
		||||
    /* find the mpeg1 video decoder */
 | 
			
		||||
    codec = avcodec_find_decoder(AV_CODEC_ID_MPEG1VIDEO);
 | 
			
		||||
    codec = avcodec_find_decoder(CODEC_ID_MPEG1VIDEO);
 | 
			
		||||
    if (!codec) {
 | 
			
		||||
        fprintf(stderr, "Codec not found\n");
 | 
			
		||||
        fprintf(stderr, "codec not found\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    c = avcodec_alloc_context3(codec);
 | 
			
		||||
    if (!c) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate video codec context\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    picture= avcodec_alloc_frame();
 | 
			
		||||
 | 
			
		||||
    if(codec->capabilities&CODEC_CAP_TRUNCATED)
 | 
			
		||||
        c->flags|= CODEC_FLAG_TRUNCATED; /* we do not send complete frames */
 | 
			
		||||
@@ -555,23 +372,19 @@ static void video_decode_example(const char *outfilename, const char *filename)
 | 
			
		||||
 | 
			
		||||
    /* open it */
 | 
			
		||||
    if (avcodec_open2(c, codec, NULL) < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not open codec\n");
 | 
			
		||||
        fprintf(stderr, "could not open codec\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* the codec gives us the frame size, in samples */
 | 
			
		||||
 | 
			
		||||
    f = fopen(filename, "rb");
 | 
			
		||||
    if (!f) {
 | 
			
		||||
        fprintf(stderr, "Could not open %s\n", filename);
 | 
			
		||||
        fprintf(stderr, "could not open %s\n", filename);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    frame = avcodec_alloc_frame();
 | 
			
		||||
    if (!frame) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate video frame\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    frame_count = 0;
 | 
			
		||||
    frame = 0;
 | 
			
		||||
    for(;;) {
 | 
			
		||||
        avpkt.size = fread(inbuf, 1, INBUF_SIZE, f);
 | 
			
		||||
        if (avpkt.size == 0)
 | 
			
		||||
@@ -593,58 +406,74 @@ static void video_decode_example(const char *outfilename, const char *filename)
 | 
			
		||||
        /* here, we use a stream based decoder (mpeg1video), so we
 | 
			
		||||
           feed decoder and see if it could decode a frame */
 | 
			
		||||
        avpkt.data = inbuf;
 | 
			
		||||
        while (avpkt.size > 0)
 | 
			
		||||
            if (decode_write_frame(outfilename, c, frame, &frame_count, &avpkt, 0) < 0)
 | 
			
		||||
        while (avpkt.size > 0) {
 | 
			
		||||
            len = avcodec_decode_video2(c, picture, &got_picture, &avpkt);
 | 
			
		||||
            if (len < 0) {
 | 
			
		||||
                fprintf(stderr, "Error while decoding frame %d\n", frame);
 | 
			
		||||
                exit(1);
 | 
			
		||||
            }
 | 
			
		||||
            if (got_picture) {
 | 
			
		||||
                printf("saving frame %3d\n", frame);
 | 
			
		||||
                fflush(stdout);
 | 
			
		||||
 | 
			
		||||
                /* the picture is allocated by the decoder. no need to
 | 
			
		||||
                   free it */
 | 
			
		||||
                snprintf(buf, sizeof(buf), outfilename, frame);
 | 
			
		||||
                pgm_save(picture->data[0], picture->linesize[0],
 | 
			
		||||
                         c->width, c->height, buf);
 | 
			
		||||
                frame++;
 | 
			
		||||
            }
 | 
			
		||||
            avpkt.size -= len;
 | 
			
		||||
            avpkt.data += len;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* some codecs, such as MPEG, transmit the I and P frame with a
 | 
			
		||||
       latency of one frame. You must do the following to have a
 | 
			
		||||
       chance to get the last frame of the video */
 | 
			
		||||
    avpkt.data = NULL;
 | 
			
		||||
    avpkt.size = 0;
 | 
			
		||||
    decode_write_frame(outfilename, c, frame, &frame_count, &avpkt, 1);
 | 
			
		||||
    len = avcodec_decode_video2(c, picture, &got_picture, &avpkt);
 | 
			
		||||
    if (got_picture) {
 | 
			
		||||
        printf("saving last frame %3d\n", frame);
 | 
			
		||||
        fflush(stdout);
 | 
			
		||||
 | 
			
		||||
        /* the picture is allocated by the decoder. no need to
 | 
			
		||||
           free it */
 | 
			
		||||
        snprintf(buf, sizeof(buf), outfilename, frame);
 | 
			
		||||
        pgm_save(picture->data[0], picture->linesize[0],
 | 
			
		||||
                 c->width, c->height, buf);
 | 
			
		||||
        frame++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fclose(f);
 | 
			
		||||
 | 
			
		||||
    avcodec_close(c);
 | 
			
		||||
    av_free(c);
 | 
			
		||||
    avcodec_free_frame(&frame);
 | 
			
		||||
    av_free(picture);
 | 
			
		||||
    printf("\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    const char *output_type;
 | 
			
		||||
    const char *filename;
 | 
			
		||||
 | 
			
		||||
    /* register all the codecs */
 | 
			
		||||
    avcodec_register_all();
 | 
			
		||||
 | 
			
		||||
    if (argc < 2) {
 | 
			
		||||
        printf("usage: %s output_type\n"
 | 
			
		||||
               "API example program to decode/encode a media stream with libavcodec.\n"
 | 
			
		||||
               "This program generates a synthetic stream and encodes it to a file\n"
 | 
			
		||||
               "named test.h264, test.mp2 or test.mpg depending on output_type.\n"
 | 
			
		||||
               "The encoded stream is then decoded and written to a raw data output.\n"
 | 
			
		||||
               "output_type must be choosen between 'h264', 'mp2', 'mpg'.\n",
 | 
			
		||||
               argv[0]);
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
    output_type = argv[1];
 | 
			
		||||
    if (argc <= 1) {
 | 
			
		||||
        audio_encode_example("/tmp/test.mp2");
 | 
			
		||||
        audio_decode_example("/tmp/test.sw", "/tmp/test.mp2");
 | 
			
		||||
 | 
			
		||||
    if (!strcmp(output_type, "h264")) {
 | 
			
		||||
        video_encode_example("test.h264", AV_CODEC_ID_H264);
 | 
			
		||||
    } else if (!strcmp(output_type, "mp2")) {
 | 
			
		||||
        audio_encode_example("test.mp2");
 | 
			
		||||
        audio_decode_example("test.sw", "test.mp2");
 | 
			
		||||
    } else if (!strcmp(output_type, "mpg")) {
 | 
			
		||||
        video_encode_example("test.mpg", AV_CODEC_ID_MPEG1VIDEO);
 | 
			
		||||
        video_decode_example("test%02d.pgm", "test.mpg");
 | 
			
		||||
        video_encode_example("/tmp/test.h264", CODEC_ID_H264);
 | 
			
		||||
        video_encode_example("/tmp/test.mpg", CODEC_ID_MPEG1VIDEO);
 | 
			
		||||
        filename = "/tmp/test.mpg";
 | 
			
		||||
    } else {
 | 
			
		||||
        fprintf(stderr, "Invalid output type '%s', choose between 'h264', 'mp2', or 'mpg'\n",
 | 
			
		||||
                output_type);
 | 
			
		||||
        return 1;
 | 
			
		||||
        filename = argv[1];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //    audio_decode_example("/tmp/test.sw", filename);
 | 
			
		||||
    video_decode_example("/tmp/test%d.pgm", filename);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,341 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2012 Stefano Sabatini
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
 * of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
 * in the Software without restriction, including without limitation the rights
 | 
			
		||||
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
 * copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
 * furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
 * THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * libavformat demuxing API use example.
 | 
			
		||||
 *
 | 
			
		||||
 * Show how to use the libavformat and libavcodec API to demux and
 | 
			
		||||
 * decode audio and video data.
 | 
			
		||||
 * @example doc/examples/demuxing.c
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <libavutil/imgutils.h>
 | 
			
		||||
#include <libavutil/samplefmt.h>
 | 
			
		||||
#include <libavutil/timestamp.h>
 | 
			
		||||
#include <libavformat/avformat.h>
 | 
			
		||||
 | 
			
		||||
static AVFormatContext *fmt_ctx = NULL;
 | 
			
		||||
static AVCodecContext *video_dec_ctx = NULL, *audio_dec_ctx;
 | 
			
		||||
static AVStream *video_stream = NULL, *audio_stream = NULL;
 | 
			
		||||
static const char *src_filename = NULL;
 | 
			
		||||
static const char *video_dst_filename = NULL;
 | 
			
		||||
static const char *audio_dst_filename = NULL;
 | 
			
		||||
static FILE *video_dst_file = NULL;
 | 
			
		||||
static FILE *audio_dst_file = NULL;
 | 
			
		||||
 | 
			
		||||
static uint8_t *video_dst_data[4] = {NULL};
 | 
			
		||||
static int      video_dst_linesize[4];
 | 
			
		||||
static int video_dst_bufsize;
 | 
			
		||||
 | 
			
		||||
static int video_stream_idx = -1, audio_stream_idx = -1;
 | 
			
		||||
static AVFrame *frame = NULL;
 | 
			
		||||
static AVPacket pkt;
 | 
			
		||||
static int video_frame_count = 0;
 | 
			
		||||
static int audio_frame_count = 0;
 | 
			
		||||
 | 
			
		||||
static int decode_packet(int *got_frame, int cached)
 | 
			
		||||
{
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    int decoded = pkt.size;
 | 
			
		||||
 | 
			
		||||
    if (pkt.stream_index == video_stream_idx) {
 | 
			
		||||
        /* decode video frame */
 | 
			
		||||
        ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "Error decoding video frame\n");
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (*got_frame) {
 | 
			
		||||
            printf("video_frame%s n:%d coded_n:%d pts:%s\n",
 | 
			
		||||
                   cached ? "(cached)" : "",
 | 
			
		||||
                   video_frame_count++, frame->coded_picture_number,
 | 
			
		||||
                   av_ts2timestr(frame->pts, &video_dec_ctx->time_base));
 | 
			
		||||
 | 
			
		||||
            /* copy decoded frame to destination buffer:
 | 
			
		||||
             * this is required since rawvideo expects non aligned data */
 | 
			
		||||
            av_image_copy(video_dst_data, video_dst_linesize,
 | 
			
		||||
                          (const uint8_t **)(frame->data), frame->linesize,
 | 
			
		||||
                          video_dec_ctx->pix_fmt, video_dec_ctx->width, video_dec_ctx->height);
 | 
			
		||||
 | 
			
		||||
            /* write to rawvideo file */
 | 
			
		||||
            fwrite(video_dst_data[0], 1, video_dst_bufsize, video_dst_file);
 | 
			
		||||
        }
 | 
			
		||||
    } else if (pkt.stream_index == audio_stream_idx) {
 | 
			
		||||
        /* decode audio frame */
 | 
			
		||||
        ret = avcodec_decode_audio4(audio_dec_ctx, frame, got_frame, &pkt);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "Error decoding audio frame\n");
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
        /* Some audio decoders decode only part of the packet, and have to be
 | 
			
		||||
         * called again with the remainder of the packet data.
 | 
			
		||||
         * Sample: fate-suite/lossless-audio/luckynight-partial.shn
 | 
			
		||||
         * Also, some decoders might over-read the packet. */
 | 
			
		||||
        decoded = FFMIN(ret, pkt.size);
 | 
			
		||||
 | 
			
		||||
        if (*got_frame) {
 | 
			
		||||
            size_t unpadded_linesize = frame->nb_samples * av_get_bytes_per_sample(frame->format);
 | 
			
		||||
            printf("audio_frame%s n:%d nb_samples:%d pts:%s\n",
 | 
			
		||||
                   cached ? "(cached)" : "",
 | 
			
		||||
                   audio_frame_count++, frame->nb_samples,
 | 
			
		||||
                   av_ts2timestr(frame->pts, &audio_dec_ctx->time_base));
 | 
			
		||||
 | 
			
		||||
            /* Write the raw audio data samples of the first plane. This works
 | 
			
		||||
             * fine for packed formats (e.g. AV_SAMPLE_FMT_S16). However,
 | 
			
		||||
             * most audio decoders output planar audio, which uses a separate
 | 
			
		||||
             * plane of audio samples for each channel (e.g. AV_SAMPLE_FMT_S16P).
 | 
			
		||||
             * In other words, this code will write only the first audio channel
 | 
			
		||||
             * in these cases.
 | 
			
		||||
             * You should use libswresample or libavfilter to convert the frame
 | 
			
		||||
             * to packed data. */
 | 
			
		||||
            fwrite(frame->extended_data[0], 1, unpadded_linesize, audio_dst_file);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return decoded;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int open_codec_context(int *stream_idx,
 | 
			
		||||
                              AVFormatContext *fmt_ctx, enum AVMediaType type)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    AVStream *st;
 | 
			
		||||
    AVCodecContext *dec_ctx = NULL;
 | 
			
		||||
    AVCodec *dec = NULL;
 | 
			
		||||
 | 
			
		||||
    ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not find %s stream in input file '%s'\n",
 | 
			
		||||
                av_get_media_type_string(type), src_filename);
 | 
			
		||||
        return ret;
 | 
			
		||||
    } else {
 | 
			
		||||
        *stream_idx = ret;
 | 
			
		||||
        st = fmt_ctx->streams[*stream_idx];
 | 
			
		||||
 | 
			
		||||
        /* find decoder for the stream */
 | 
			
		||||
        dec_ctx = st->codec;
 | 
			
		||||
        dec = avcodec_find_decoder(dec_ctx->codec_id);
 | 
			
		||||
        if (!dec) {
 | 
			
		||||
            fprintf(stderr, "Failed to find %s codec\n",
 | 
			
		||||
                    av_get_media_type_string(type));
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) {
 | 
			
		||||
            fprintf(stderr, "Failed to open %s codec\n",
 | 
			
		||||
                    av_get_media_type_string(type));
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int get_format_from_sample_fmt(const char **fmt,
 | 
			
		||||
                                      enum AVSampleFormat sample_fmt)
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
    struct sample_fmt_entry {
 | 
			
		||||
        enum AVSampleFormat sample_fmt; const char *fmt_be, *fmt_le;
 | 
			
		||||
    } sample_fmt_entries[] = {
 | 
			
		||||
        { AV_SAMPLE_FMT_U8,  "u8",    "u8"    },
 | 
			
		||||
        { AV_SAMPLE_FMT_S16, "s16be", "s16le" },
 | 
			
		||||
        { AV_SAMPLE_FMT_S32, "s32be", "s32le" },
 | 
			
		||||
        { AV_SAMPLE_FMT_FLT, "f32be", "f32le" },
 | 
			
		||||
        { AV_SAMPLE_FMT_DBL, "f64be", "f64le" },
 | 
			
		||||
    };
 | 
			
		||||
    *fmt = NULL;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < FF_ARRAY_ELEMS(sample_fmt_entries); i++) {
 | 
			
		||||
        struct sample_fmt_entry *entry = &sample_fmt_entries[i];
 | 
			
		||||
        if (sample_fmt == entry->sample_fmt) {
 | 
			
		||||
            *fmt = AV_NE(entry->fmt_be, entry->fmt_le);
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fprintf(stderr,
 | 
			
		||||
            "sample format %s is not supported as output format\n",
 | 
			
		||||
            av_get_sample_fmt_name(sample_fmt));
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main (int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    int ret = 0, got_frame;
 | 
			
		||||
 | 
			
		||||
    if (argc != 4) {
 | 
			
		||||
        fprintf(stderr, "usage: %s input_file video_output_file audio_output_file\n"
 | 
			
		||||
                "API example program to show how to read frames from an input file.\n"
 | 
			
		||||
                "This program reads frames from a file, decodes them, and writes decoded\n"
 | 
			
		||||
                "video frames to a rawvideo file named video_output_file, and decoded\n"
 | 
			
		||||
                "audio frames to a rawaudio file named audio_output_file.\n"
 | 
			
		||||
                "\n", argv[0]);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    src_filename = argv[1];
 | 
			
		||||
    video_dst_filename = argv[2];
 | 
			
		||||
    audio_dst_filename = argv[3];
 | 
			
		||||
 | 
			
		||||
    /* register all formats and codecs */
 | 
			
		||||
    av_register_all();
 | 
			
		||||
 | 
			
		||||
    /* open input file, and allocate format context */
 | 
			
		||||
    if (avformat_open_input(&fmt_ctx, src_filename, NULL, NULL) < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not open source file %s\n", src_filename);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* retrieve stream information */
 | 
			
		||||
    if (avformat_find_stream_info(fmt_ctx, NULL) < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not find stream information\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (open_codec_context(&video_stream_idx, fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0) {
 | 
			
		||||
        video_stream = fmt_ctx->streams[video_stream_idx];
 | 
			
		||||
        video_dec_ctx = video_stream->codec;
 | 
			
		||||
 | 
			
		||||
        video_dst_file = fopen(video_dst_filename, "wb");
 | 
			
		||||
        if (!video_dst_file) {
 | 
			
		||||
            fprintf(stderr, "Could not open destination file %s\n", video_dst_filename);
 | 
			
		||||
            ret = 1;
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* allocate image where the decoded image will be put */
 | 
			
		||||
        ret = av_image_alloc(video_dst_data, video_dst_linesize,
 | 
			
		||||
                             video_dec_ctx->width, video_dec_ctx->height,
 | 
			
		||||
                             video_dec_ctx->pix_fmt, 1);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "Could not allocate raw video buffer\n");
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
        video_dst_bufsize = ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (open_codec_context(&audio_stream_idx, fmt_ctx, AVMEDIA_TYPE_AUDIO) >= 0) {
 | 
			
		||||
        audio_stream = fmt_ctx->streams[audio_stream_idx];
 | 
			
		||||
        audio_dec_ctx = audio_stream->codec;
 | 
			
		||||
        audio_dst_file = fopen(audio_dst_filename, "wb");
 | 
			
		||||
        if (!audio_dst_file) {
 | 
			
		||||
            fprintf(stderr, "Could not open destination file %s\n", video_dst_filename);
 | 
			
		||||
            ret = 1;
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* dump input information to stderr */
 | 
			
		||||
    av_dump_format(fmt_ctx, 0, src_filename, 0);
 | 
			
		||||
 | 
			
		||||
    if (!audio_stream && !video_stream) {
 | 
			
		||||
        fprintf(stderr, "Could not find audio or video stream in the input, aborting\n");
 | 
			
		||||
        ret = 1;
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    frame = avcodec_alloc_frame();
 | 
			
		||||
    if (!frame) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate frame\n");
 | 
			
		||||
        ret = AVERROR(ENOMEM);
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* initialize packet, set data to NULL, let the demuxer fill it */
 | 
			
		||||
    av_init_packet(&pkt);
 | 
			
		||||
    pkt.data = NULL;
 | 
			
		||||
    pkt.size = 0;
 | 
			
		||||
 | 
			
		||||
    if (video_stream)
 | 
			
		||||
        printf("Demuxing video from file '%s' into '%s'\n", src_filename, video_dst_filename);
 | 
			
		||||
    if (audio_stream)
 | 
			
		||||
        printf("Demuxing audio from file '%s' into '%s'\n", src_filename, audio_dst_filename);
 | 
			
		||||
 | 
			
		||||
    /* read frames from the file */
 | 
			
		||||
    while (av_read_frame(fmt_ctx, &pkt) >= 0) {
 | 
			
		||||
        AVPacket orig_pkt = pkt;
 | 
			
		||||
        do {
 | 
			
		||||
            ret = decode_packet(&got_frame, 0);
 | 
			
		||||
            if (ret < 0)
 | 
			
		||||
                break;
 | 
			
		||||
            pkt.data += ret;
 | 
			
		||||
            pkt.size -= ret;
 | 
			
		||||
        } while (pkt.size > 0);
 | 
			
		||||
        av_free_packet(&orig_pkt);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* flush cached frames */
 | 
			
		||||
    pkt.data = NULL;
 | 
			
		||||
    pkt.size = 0;
 | 
			
		||||
    do {
 | 
			
		||||
        decode_packet(&got_frame, 1);
 | 
			
		||||
    } while (got_frame);
 | 
			
		||||
 | 
			
		||||
    printf("Demuxing succeeded.\n");
 | 
			
		||||
 | 
			
		||||
    if (video_stream) {
 | 
			
		||||
        printf("Play the output video file with the command:\n"
 | 
			
		||||
               "ffplay -f rawvideo -pix_fmt %s -video_size %dx%d %s\n",
 | 
			
		||||
               av_get_pix_fmt_name(video_dec_ctx->pix_fmt), video_dec_ctx->width, video_dec_ctx->height,
 | 
			
		||||
               video_dst_filename);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (audio_stream) {
 | 
			
		||||
        enum AVSampleFormat sfmt = audio_dec_ctx->sample_fmt;
 | 
			
		||||
        int n_channels = audio_dec_ctx->channels;
 | 
			
		||||
        const char *fmt;
 | 
			
		||||
 | 
			
		||||
        if (av_sample_fmt_is_planar(sfmt)) {
 | 
			
		||||
            const char *packed = av_get_sample_fmt_name(sfmt);
 | 
			
		||||
            printf("Warning: the sample format the decoder produced is planar "
 | 
			
		||||
                   "(%s). This example will output the first channel only.\n",
 | 
			
		||||
                   packed ? packed : "?");
 | 
			
		||||
            sfmt = av_get_packed_sample_fmt(sfmt);
 | 
			
		||||
            n_channels = 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ((ret = get_format_from_sample_fmt(&fmt, sfmt)) < 0)
 | 
			
		||||
            goto end;
 | 
			
		||||
 | 
			
		||||
        printf("Play the output audio file with the command:\n"
 | 
			
		||||
               "ffplay -f %s -ac %d -ar %d %s\n",
 | 
			
		||||
               fmt, n_channels, audio_dec_ctx->sample_rate,
 | 
			
		||||
               audio_dst_filename);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
end:
 | 
			
		||||
    if (video_dec_ctx)
 | 
			
		||||
        avcodec_close(video_dec_ctx);
 | 
			
		||||
    if (audio_dec_ctx)
 | 
			
		||||
        avcodec_close(audio_dec_ctx);
 | 
			
		||||
    avformat_close_input(&fmt_ctx);
 | 
			
		||||
    if (video_dst_file)
 | 
			
		||||
        fclose(video_dst_file);
 | 
			
		||||
    if (audio_dst_file)
 | 
			
		||||
        fclose(audio_dst_file);
 | 
			
		||||
    av_free(frame);
 | 
			
		||||
    av_free(video_dst_data[0]);
 | 
			
		||||
 | 
			
		||||
    return ret < 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -25,7 +25,6 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * API example for audio decoding and filtering
 | 
			
		||||
 * @example doc/examples/filtering_audio.c
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
@@ -36,10 +35,9 @@
 | 
			
		||||
#include <libavfilter/avcodec.h>
 | 
			
		||||
#include <libavfilter/buffersink.h>
 | 
			
		||||
#include <libavfilter/buffersrc.h>
 | 
			
		||||
#include <libavutil/opt.h>
 | 
			
		||||
 | 
			
		||||
static const char *filter_descr = "aresample=8000,aformat=sample_fmts=s16:channel_layouts=mono";
 | 
			
		||||
static const char *player       = "ffplay -f s16le -ar 8000 -ac 1 -";
 | 
			
		||||
const char *filter_descr = "aresample=8000,aconvert=s16:mono";
 | 
			
		||||
const char *player       = "ffplay -f s16le -ar 8000 -ac 1 -";
 | 
			
		||||
 | 
			
		||||
static AVFormatContext *fmt_ctx;
 | 
			
		||||
static AVCodecContext *dec_ctx;
 | 
			
		||||
@@ -71,7 +69,6 @@ static int open_input_file(const char *filename)
 | 
			
		||||
    }
 | 
			
		||||
    audio_stream_index = ret;
 | 
			
		||||
    dec_ctx = fmt_ctx->streams[audio_stream_index]->codec;
 | 
			
		||||
    av_opt_set_int(dec_ctx, "refcounted_frames", 1, 0);
 | 
			
		||||
 | 
			
		||||
    /* init the audio decoder */
 | 
			
		||||
    if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) {
 | 
			
		||||
@@ -90,21 +87,18 @@ static int init_filters(const char *filters_descr)
 | 
			
		||||
    AVFilter *abuffersink = avfilter_get_by_name("abuffersink");
 | 
			
		||||
    AVFilterInOut *outputs = avfilter_inout_alloc();
 | 
			
		||||
    AVFilterInOut *inputs  = avfilter_inout_alloc();
 | 
			
		||||
    static const enum AVSampleFormat out_sample_fmts[] = { AV_SAMPLE_FMT_S16, -1 };
 | 
			
		||||
    static const int64_t out_channel_layouts[] = { AV_CH_LAYOUT_MONO, -1 };
 | 
			
		||||
    static const int out_sample_rates[] = { 8000, -1 };
 | 
			
		||||
    const enum AVSampleFormat sample_fmts[] = { AV_SAMPLE_FMT_S16, -1 };
 | 
			
		||||
    const int64_t *chlayouts                = avfilter_all_channel_layouts;
 | 
			
		||||
    AVABufferSinkParams *abuffersink_params;
 | 
			
		||||
    const AVFilterLink *outlink;
 | 
			
		||||
    AVRational time_base = fmt_ctx->streams[audio_stream_index]->time_base;
 | 
			
		||||
 | 
			
		||||
    filter_graph = avfilter_graph_alloc();
 | 
			
		||||
 | 
			
		||||
    /* buffer audio source: the decoded frames from the decoder will be inserted here. */
 | 
			
		||||
    if (!dec_ctx->channel_layout)
 | 
			
		||||
        dec_ctx->channel_layout = av_get_default_channel_layout(dec_ctx->channels);
 | 
			
		||||
    snprintf(args, sizeof(args),
 | 
			
		||||
            "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=0x%"PRIx64,
 | 
			
		||||
             time_base.num, time_base.den, dec_ctx->sample_rate,
 | 
			
		||||
             av_get_sample_fmt_name(dec_ctx->sample_fmt), dec_ctx->channel_layout);
 | 
			
		||||
    snprintf(args, sizeof(args), "%d:%d:0x%"PRIx64,
 | 
			
		||||
             dec_ctx->sample_rate, dec_ctx->sample_fmt, dec_ctx->channel_layout);
 | 
			
		||||
    ret = avfilter_graph_create_filter(&buffersrc_ctx, abuffersrc, "in",
 | 
			
		||||
                                       args, NULL, filter_graph);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
@@ -113,34 +107,17 @@ static int init_filters(const char *filters_descr)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* buffer audio sink: to terminate the filter chain. */
 | 
			
		||||
    abuffersink_params = av_abuffersink_params_alloc();
 | 
			
		||||
    abuffersink_params->sample_fmts     = sample_fmts;
 | 
			
		||||
    abuffersink_params->channel_layouts = chlayouts;
 | 
			
		||||
    ret = avfilter_graph_create_filter(&buffersink_ctx, abuffersink, "out",
 | 
			
		||||
                                       NULL, NULL, filter_graph);
 | 
			
		||||
                                       NULL, abuffersink_params, filter_graph);
 | 
			
		||||
    av_free(abuffersink_params);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer sink\n");
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = av_opt_set_int_list(buffersink_ctx, "sample_fmts", out_sample_fmts, -1,
 | 
			
		||||
                              AV_OPT_SEARCH_CHILDREN);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Cannot set output sample format\n");
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = av_opt_set_int_list(buffersink_ctx, "channel_layouts", out_channel_layouts, -1,
 | 
			
		||||
                              AV_OPT_SEARCH_CHILDREN);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Cannot set output channel layout\n");
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = av_opt_set_int_list(buffersink_ctx, "sample_rates", out_sample_rates, -1,
 | 
			
		||||
                              AV_OPT_SEARCH_CHILDREN);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Cannot set output sample rate\n");
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Endpoints for the filter graph. */
 | 
			
		||||
    outputs->name       = av_strdup("in");
 | 
			
		||||
    outputs->filter_ctx = buffersrc_ctx;
 | 
			
		||||
@@ -152,7 +129,7 @@ static int init_filters(const char *filters_descr)
 | 
			
		||||
    inputs->pad_idx    = 0;
 | 
			
		||||
    inputs->next       = NULL;
 | 
			
		||||
 | 
			
		||||
    if ((ret = avfilter_graph_parse_ptr(filter_graph, filters_descr,
 | 
			
		||||
    if ((ret = avfilter_graph_parse(filter_graph, filters_descr,
 | 
			
		||||
                                    &inputs, &outputs, NULL)) < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
 | 
			
		||||
@@ -171,10 +148,11 @@ static int init_filters(const char *filters_descr)
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void print_frame(const AVFrame *frame)
 | 
			
		||||
static void print_samplesref(AVFilterBufferRef *samplesref)
 | 
			
		||||
{
 | 
			
		||||
    const int n = frame->nb_samples * av_get_channel_layout_nb_channels(av_frame_get_channel_layout(frame));
 | 
			
		||||
    const uint16_t *p     = (uint16_t*)frame->data[0];
 | 
			
		||||
    const AVFilterBufferRefAudioProps *props = samplesref->audio;
 | 
			
		||||
    const int n = props->nb_samples * av_get_channel_layout_nb_channels(props->channel_layout);
 | 
			
		||||
    const uint16_t *p     = (uint16_t*)samplesref->data[0];
 | 
			
		||||
    const uint16_t *p_end = p + n;
 | 
			
		||||
 | 
			
		||||
    while (p < p_end) {
 | 
			
		||||
@@ -189,14 +167,9 @@ int main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    AVPacket packet;
 | 
			
		||||
    AVFrame *frame = av_frame_alloc();
 | 
			
		||||
    AVFrame *filt_frame = av_frame_alloc();
 | 
			
		||||
    AVFrame frame;
 | 
			
		||||
    int got_frame;
 | 
			
		||||
 | 
			
		||||
    if (!frame || !filt_frame) {
 | 
			
		||||
        perror("Could not allocate frame");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    if (argc != 2) {
 | 
			
		||||
        fprintf(stderr, "Usage: %s file | %s\n", argv[0], player);
 | 
			
		||||
        exit(1);
 | 
			
		||||
@@ -213,13 +186,15 @@ int main(int argc, char **argv)
 | 
			
		||||
 | 
			
		||||
    /* read all packets */
 | 
			
		||||
    while (1) {
 | 
			
		||||
        AVFilterBufferRef *samplesref;
 | 
			
		||||
        if ((ret = av_read_frame(fmt_ctx, &packet)) < 0)
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        if (packet.stream_index == audio_stream_index) {
 | 
			
		||||
            avcodec_get_frame_defaults(frame);
 | 
			
		||||
            avcodec_get_frame_defaults(&frame);
 | 
			
		||||
            got_frame = 0;
 | 
			
		||||
            ret = avcodec_decode_audio4(dec_ctx, frame, &got_frame, &packet);
 | 
			
		||||
            ret = avcodec_decode_audio4(dec_ctx, &frame, &got_frame, &packet);
 | 
			
		||||
            av_free_packet(&packet);
 | 
			
		||||
            if (ret < 0) {
 | 
			
		||||
                av_log(NULL, AV_LOG_ERROR, "Error decoding audio\n");
 | 
			
		||||
                continue;
 | 
			
		||||
@@ -227,32 +202,27 @@ int main(int argc, char **argv)
 | 
			
		||||
 | 
			
		||||
            if (got_frame) {
 | 
			
		||||
                /* push the audio data from decoded frame into the filtergraph */
 | 
			
		||||
                if (av_buffersrc_add_frame_flags(buffersrc_ctx, frame, 0) < 0) {
 | 
			
		||||
                if (av_buffersrc_add_frame(buffersrc_ctx, &frame, 0) < 0) {
 | 
			
		||||
                    av_log(NULL, AV_LOG_ERROR, "Error while feeding the audio filtergraph\n");
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                /* pull filtered audio from the filtergraph */
 | 
			
		||||
                while (1) {
 | 
			
		||||
                    ret = av_buffersink_get_frame(buffersink_ctx, filt_frame);
 | 
			
		||||
                    if(ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
 | 
			
		||||
                        break;
 | 
			
		||||
                    if(ret < 0)
 | 
			
		||||
                        goto end;
 | 
			
		||||
                    print_frame(filt_frame);
 | 
			
		||||
                    av_frame_unref(filt_frame);
 | 
			
		||||
                while (avfilter_poll_frame(buffersink_ctx->inputs[0])) {
 | 
			
		||||
                    av_buffersink_get_buffer_ref(buffersink_ctx, &samplesref, 0);
 | 
			
		||||
                    if (samplesref) {
 | 
			
		||||
                        print_samplesref(samplesref);
 | 
			
		||||
                        avfilter_unref_buffer(samplesref);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        av_free_packet(&packet);
 | 
			
		||||
    }
 | 
			
		||||
end:
 | 
			
		||||
    avfilter_graph_free(&filter_graph);
 | 
			
		||||
    if (dec_ctx)
 | 
			
		||||
        avcodec_close(dec_ctx);
 | 
			
		||||
    avformat_close_input(&fmt_ctx);
 | 
			
		||||
    av_frame_free(&frame);
 | 
			
		||||
    av_frame_free(&filt_frame);
 | 
			
		||||
 | 
			
		||||
    if (ret < 0 && ret != AVERROR_EOF) {
 | 
			
		||||
        char buf[1024];
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,6 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * API example for decoding and filtering
 | 
			
		||||
 * @example doc/examples/filtering_video.c
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define _XOPEN_SOURCE 600 /* for usleep */
 | 
			
		||||
@@ -35,7 +34,6 @@
 | 
			
		||||
#include <libavfilter/avfiltergraph.h>
 | 
			
		||||
#include <libavfilter/avcodec.h>
 | 
			
		||||
#include <libavfilter/buffersink.h>
 | 
			
		||||
#include <libavfilter/buffersrc.h>
 | 
			
		||||
 | 
			
		||||
const char *filter_descr = "scale=78:24";
 | 
			
		||||
 | 
			
		||||
@@ -88,18 +86,14 @@ static int init_filters(const char *filters_descr)
 | 
			
		||||
    AVFilter *buffersink = avfilter_get_by_name("buffersink");
 | 
			
		||||
    AVFilterInOut *outputs = avfilter_inout_alloc();
 | 
			
		||||
    AVFilterInOut *inputs  = avfilter_inout_alloc();
 | 
			
		||||
    enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE };
 | 
			
		||||
    AVBufferSinkParams *buffersink_params;
 | 
			
		||||
 | 
			
		||||
    enum PixelFormat pix_fmts[] = { PIX_FMT_GRAY8, PIX_FMT_NONE };
 | 
			
		||||
    filter_graph = avfilter_graph_alloc();
 | 
			
		||||
 | 
			
		||||
    /* buffer video source: the decoded frames from the decoder will be inserted here. */
 | 
			
		||||
    snprintf(args, sizeof(args),
 | 
			
		||||
            "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
 | 
			
		||||
    snprintf(args, sizeof(args), "%d:%d:%d:%d:%d:%d:%d",
 | 
			
		||||
             dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
 | 
			
		||||
             dec_ctx->time_base.num, dec_ctx->time_base.den,
 | 
			
		||||
             dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den);
 | 
			
		||||
 | 
			
		||||
    ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
 | 
			
		||||
                                       args, NULL, filter_graph);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
@@ -108,11 +102,8 @@ static int init_filters(const char *filters_descr)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* buffer video sink: to terminate the filter chain. */
 | 
			
		||||
    buffersink_params = av_buffersink_params_alloc();
 | 
			
		||||
    buffersink_params->pixel_fmts = pix_fmts;
 | 
			
		||||
    ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",
 | 
			
		||||
                                       NULL, buffersink_params, filter_graph);
 | 
			
		||||
    av_free(buffersink_params);
 | 
			
		||||
                                       NULL, pix_fmts, filter_graph);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Cannot create buffer sink\n");
 | 
			
		||||
        return ret;
 | 
			
		||||
@@ -129,7 +120,7 @@ static int init_filters(const char *filters_descr)
 | 
			
		||||
    inputs->pad_idx    = 0;
 | 
			
		||||
    inputs->next       = NULL;
 | 
			
		||||
 | 
			
		||||
    if ((ret = avfilter_graph_parse_ptr(filter_graph, filters_descr,
 | 
			
		||||
    if ((ret = avfilter_graph_parse(filter_graph, filters_descr,
 | 
			
		||||
                                    &inputs, &outputs, NULL)) < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
 | 
			
		||||
@@ -138,33 +129,33 @@ static int init_filters(const char *filters_descr)
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void display_frame(const AVFrame *frame, AVRational time_base)
 | 
			
		||||
static void display_picref(AVFilterBufferRef *picref, AVRational time_base)
 | 
			
		||||
{
 | 
			
		||||
    int x, y;
 | 
			
		||||
    uint8_t *p0, *p;
 | 
			
		||||
    int64_t delay;
 | 
			
		||||
 | 
			
		||||
    if (frame->pts != AV_NOPTS_VALUE) {
 | 
			
		||||
    if (picref->pts != AV_NOPTS_VALUE) {
 | 
			
		||||
        if (last_pts != AV_NOPTS_VALUE) {
 | 
			
		||||
            /* sleep roughly the right amount of time;
 | 
			
		||||
             * usleep is in microseconds, just like AV_TIME_BASE. */
 | 
			
		||||
            delay = av_rescale_q(frame->pts - last_pts,
 | 
			
		||||
            delay = av_rescale_q(picref->pts - last_pts,
 | 
			
		||||
                                 time_base, AV_TIME_BASE_Q);
 | 
			
		||||
            if (delay > 0 && delay < 1000000)
 | 
			
		||||
                usleep(delay);
 | 
			
		||||
        }
 | 
			
		||||
        last_pts = frame->pts;
 | 
			
		||||
        last_pts = picref->pts;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Trivial ASCII grayscale display. */
 | 
			
		||||
    p0 = frame->data[0];
 | 
			
		||||
    p0 = picref->data[0];
 | 
			
		||||
    puts("\033c");
 | 
			
		||||
    for (y = 0; y < frame->height; y++) {
 | 
			
		||||
    for (y = 0; y < picref->video->h; y++) {
 | 
			
		||||
        p = p0;
 | 
			
		||||
        for (x = 0; x < frame->width; x++)
 | 
			
		||||
        for (x = 0; x < picref->video->w; x++)
 | 
			
		||||
            putchar(" .-+#"[*(p++) / 52]);
 | 
			
		||||
        putchar('\n');
 | 
			
		||||
        p0 += frame->linesize[0];
 | 
			
		||||
        p0 += picref->linesize[0];
 | 
			
		||||
    }
 | 
			
		||||
    fflush(stdout);
 | 
			
		||||
}
 | 
			
		||||
@@ -173,14 +164,9 @@ int main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    AVPacket packet;
 | 
			
		||||
    AVFrame *frame = av_frame_alloc();
 | 
			
		||||
    AVFrame *filt_frame = av_frame_alloc();
 | 
			
		||||
    AVFrame frame;
 | 
			
		||||
    int got_frame;
 | 
			
		||||
 | 
			
		||||
    if (!frame || !filt_frame) {
 | 
			
		||||
        perror("Could not allocate frame");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    if (argc != 2) {
 | 
			
		||||
        fprintf(stderr, "Usage: %s file\n", argv[0]);
 | 
			
		||||
        exit(1);
 | 
			
		||||
@@ -197,48 +183,42 @@ int main(int argc, char **argv)
 | 
			
		||||
 | 
			
		||||
    /* read all packets */
 | 
			
		||||
    while (1) {
 | 
			
		||||
        AVFilterBufferRef *picref;
 | 
			
		||||
        if ((ret = av_read_frame(fmt_ctx, &packet)) < 0)
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        if (packet.stream_index == video_stream_index) {
 | 
			
		||||
            avcodec_get_frame_defaults(frame);
 | 
			
		||||
            avcodec_get_frame_defaults(&frame);
 | 
			
		||||
            got_frame = 0;
 | 
			
		||||
            ret = avcodec_decode_video2(dec_ctx, frame, &got_frame, &packet);
 | 
			
		||||
            ret = avcodec_decode_video2(dec_ctx, &frame, &got_frame, &packet);
 | 
			
		||||
            av_free_packet(&packet);
 | 
			
		||||
            if (ret < 0) {
 | 
			
		||||
                av_log(NULL, AV_LOG_ERROR, "Error decoding video\n");
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (got_frame) {
 | 
			
		||||
                frame->pts = av_frame_get_best_effort_timestamp(frame);
 | 
			
		||||
                frame.pts = av_frame_get_best_effort_timestamp(&frame);
 | 
			
		||||
 | 
			
		||||
                /* push the decoded frame into the filtergraph */
 | 
			
		||||
                if (av_buffersrc_add_frame_flags(buffersrc_ctx, frame, AV_BUFFERSRC_FLAG_KEEP_REF) < 0) {
 | 
			
		||||
                    av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n");
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                av_vsrc_buffer_add_frame(buffersrc_ctx, &frame, 0);
 | 
			
		||||
 | 
			
		||||
                /* pull filtered frames from the filtergraph */
 | 
			
		||||
                while (1) {
 | 
			
		||||
                    ret = av_buffersink_get_frame(buffersink_ctx, filt_frame);
 | 
			
		||||
                    if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
 | 
			
		||||
                        break;
 | 
			
		||||
                    if (ret < 0)
 | 
			
		||||
                        goto end;
 | 
			
		||||
                    display_frame(filt_frame, buffersink_ctx->inputs[0]->time_base);
 | 
			
		||||
                    av_frame_unref(filt_frame);
 | 
			
		||||
                /* pull filtered pictures from the filtergraph */
 | 
			
		||||
                while (avfilter_poll_frame(buffersink_ctx->inputs[0])) {
 | 
			
		||||
                    av_buffersink_get_buffer_ref(buffersink_ctx, &picref, 0);
 | 
			
		||||
                    if (picref) {
 | 
			
		||||
                        display_picref(picref, buffersink_ctx->inputs[0]->time_base);
 | 
			
		||||
                        avfilter_unref_buffer(picref);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        av_free_packet(&packet);
 | 
			
		||||
    }
 | 
			
		||||
end:
 | 
			
		||||
    avfilter_graph_free(&filter_graph);
 | 
			
		||||
    if (dec_ctx)
 | 
			
		||||
        avcodec_close(dec_ctx);
 | 
			
		||||
    avformat_close_input(&fmt_ctx);
 | 
			
		||||
    av_frame_free(&frame);
 | 
			
		||||
    av_frame_free(&filt_frame);
 | 
			
		||||
 | 
			
		||||
    if (ret < 0 && ret != AVERROR_EOF) {
 | 
			
		||||
        char buf[1024];
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,6 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * Shows how the metadata API can be used in application programs.
 | 
			
		||||
 * @example doc/examples/metadata.c
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,6 @@
 | 
			
		||||
 *
 | 
			
		||||
 * Output a media file in any supported libavformat format.
 | 
			
		||||
 * The default codecs are used.
 | 
			
		||||
 * @example doc/examples/muxing.c
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
@@ -34,116 +33,74 @@
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
 | 
			
		||||
#include <libavutil/opt.h>
 | 
			
		||||
#include <libavutil/mathematics.h>
 | 
			
		||||
#include <libavformat/avformat.h>
 | 
			
		||||
#include <libswscale/swscale.h>
 | 
			
		||||
#include <libswresample/swresample.h>
 | 
			
		||||
 | 
			
		||||
#undef exit
 | 
			
		||||
 | 
			
		||||
/* 5 seconds stream duration */
 | 
			
		||||
#define STREAM_DURATION   200.0
 | 
			
		||||
#define STREAM_FRAME_RATE 25 /* 25 images/s */
 | 
			
		||||
#define STREAM_NB_FRAMES  ((int)(STREAM_DURATION * STREAM_FRAME_RATE))
 | 
			
		||||
#define STREAM_PIX_FMT    AV_PIX_FMT_YUV420P /* default pix_fmt */
 | 
			
		||||
#define STREAM_PIX_FMT    PIX_FMT_YUV420P /* default pix_fmt */
 | 
			
		||||
 | 
			
		||||
static int sws_flags = SWS_BICUBIC;
 | 
			
		||||
 | 
			
		||||
/* Add an output stream. */
 | 
			
		||||
static AVStream *add_stream(AVFormatContext *oc, AVCodec **codec,
 | 
			
		||||
                            enum AVCodecID codec_id)
 | 
			
		||||
/**************************************************************/
 | 
			
		||||
/* audio output */
 | 
			
		||||
 | 
			
		||||
static float t, tincr, tincr2;
 | 
			
		||||
static int16_t *samples;
 | 
			
		||||
static int audio_input_frame_size;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * add an audio output stream
 | 
			
		||||
 */
 | 
			
		||||
static AVStream *add_audio_stream(AVFormatContext *oc, enum CodecID codec_id)
 | 
			
		||||
{
 | 
			
		||||
    AVCodecContext *c;
 | 
			
		||||
    AVStream *st;
 | 
			
		||||
    AVCodec *codec;
 | 
			
		||||
 | 
			
		||||
    /* find the encoder */
 | 
			
		||||
    *codec = avcodec_find_encoder(codec_id);
 | 
			
		||||
    if (!(*codec)) {
 | 
			
		||||
        fprintf(stderr, "Could not find encoder for '%s'\n",
 | 
			
		||||
                avcodec_get_name(codec_id));
 | 
			
		||||
    /* find the audio encoder */
 | 
			
		||||
    codec = avcodec_find_encoder(codec_id);
 | 
			
		||||
    if (!codec) {
 | 
			
		||||
        fprintf(stderr, "codec not found\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    st = avformat_new_stream(oc, *codec);
 | 
			
		||||
    st = avformat_new_stream(oc, codec);
 | 
			
		||||
    if (!st) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate stream\n");
 | 
			
		||||
        fprintf(stderr, "Could not alloc stream\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    st->id = oc->nb_streams-1;
 | 
			
		||||
    st->id = 1;
 | 
			
		||||
 | 
			
		||||
    c = st->codec;
 | 
			
		||||
 | 
			
		||||
    switch ((*codec)->type) {
 | 
			
		||||
    case AVMEDIA_TYPE_AUDIO:
 | 
			
		||||
        c->sample_fmt  = AV_SAMPLE_FMT_FLTP;
 | 
			
		||||
    /* put sample parameters */
 | 
			
		||||
    c->sample_fmt  = AV_SAMPLE_FMT_S16;
 | 
			
		||||
    c->bit_rate    = 64000;
 | 
			
		||||
    c->sample_rate = 44100;
 | 
			
		||||
    c->channels    = 2;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case AVMEDIA_TYPE_VIDEO:
 | 
			
		||||
        c->codec_id = codec_id;
 | 
			
		||||
 | 
			
		||||
        c->bit_rate = 400000;
 | 
			
		||||
        /* Resolution must be a multiple of two. */
 | 
			
		||||
        c->width    = 352;
 | 
			
		||||
        c->height   = 288;
 | 
			
		||||
        /* timebase: This is the fundamental unit of time (in seconds) in terms
 | 
			
		||||
         * of which frame timestamps are represented. For fixed-fps content,
 | 
			
		||||
         * timebase should be 1/framerate and timestamp increments should be
 | 
			
		||||
         * identical to 1. */
 | 
			
		||||
        c->time_base.den = STREAM_FRAME_RATE;
 | 
			
		||||
        c->time_base.num = 1;
 | 
			
		||||
        c->gop_size      = 12; /* emit one intra frame every twelve frames at most */
 | 
			
		||||
        c->pix_fmt       = STREAM_PIX_FMT;
 | 
			
		||||
        if (c->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
 | 
			
		||||
            /* just for testing, we also add B frames */
 | 
			
		||||
            c->max_b_frames = 2;
 | 
			
		||||
        }
 | 
			
		||||
        if (c->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
 | 
			
		||||
            /* Needed to avoid using macroblocks in which some coeffs overflow.
 | 
			
		||||
             * This does not happen with normal video, it just happens here as
 | 
			
		||||
             * the motion of the chroma plane does not match the luma plane. */
 | 
			
		||||
            c->mb_decision = 2;
 | 
			
		||||
        }
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Some formats want stream headers to be separate. */
 | 
			
		||||
    // some formats want stream headers to be separate
 | 
			
		||||
    if (oc->oformat->flags & AVFMT_GLOBALHEADER)
 | 
			
		||||
        c->flags |= CODEC_FLAG_GLOBAL_HEADER;
 | 
			
		||||
 | 
			
		||||
    return st;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**************************************************************/
 | 
			
		||||
/* audio output */
 | 
			
		||||
 | 
			
		||||
static float t, tincr, tincr2;
 | 
			
		||||
 | 
			
		||||
static uint8_t **src_samples_data;
 | 
			
		||||
static int       src_samples_linesize;
 | 
			
		||||
static int       src_nb_samples;
 | 
			
		||||
 | 
			
		||||
static int max_dst_nb_samples;
 | 
			
		||||
uint8_t **dst_samples_data;
 | 
			
		||||
int       dst_samples_linesize;
 | 
			
		||||
int       dst_samples_size;
 | 
			
		||||
 | 
			
		||||
struct SwrContext *swr_ctx = NULL;
 | 
			
		||||
 | 
			
		||||
static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st)
 | 
			
		||||
static void open_audio(AVFormatContext *oc, AVStream *st)
 | 
			
		||||
{
 | 
			
		||||
    AVCodecContext *c;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    c = st->codec;
 | 
			
		||||
 | 
			
		||||
    /* open it */
 | 
			
		||||
    ret = avcodec_open2(c, codec, NULL);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not open audio codec: %s\n", av_err2str(ret));
 | 
			
		||||
    if (avcodec_open2(c, NULL, NULL) < 0) {
 | 
			
		||||
        fprintf(stderr, "could not open codec\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -153,51 +110,13 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st)
 | 
			
		||||
    /* increment frequency by 110 Hz per second */
 | 
			
		||||
    tincr2 = 2 * M_PI * 110.0 / c->sample_rate / c->sample_rate;
 | 
			
		||||
 | 
			
		||||
    src_nb_samples = c->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE ?
 | 
			
		||||
        10000 : c->frame_size;
 | 
			
		||||
 | 
			
		||||
    ret = av_samples_alloc_array_and_samples(&src_samples_data, &src_samples_linesize, c->channels,
 | 
			
		||||
                                             src_nb_samples, c->sample_fmt, 0);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate source samples\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* create resampler context */
 | 
			
		||||
    if (c->sample_fmt != AV_SAMPLE_FMT_S16) {
 | 
			
		||||
        swr_ctx = swr_alloc();
 | 
			
		||||
        if (!swr_ctx) {
 | 
			
		||||
            fprintf(stderr, "Could not allocate resampler context\n");
 | 
			
		||||
            exit(1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* set options */
 | 
			
		||||
        av_opt_set_int       (swr_ctx, "in_channel_count",   c->channels,       0);
 | 
			
		||||
        av_opt_set_int       (swr_ctx, "in_sample_rate",     c->sample_rate,    0);
 | 
			
		||||
        av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt",      AV_SAMPLE_FMT_S16, 0);
 | 
			
		||||
        av_opt_set_int       (swr_ctx, "out_channel_count",  c->channels,       0);
 | 
			
		||||
        av_opt_set_int       (swr_ctx, "out_sample_rate",    c->sample_rate,    0);
 | 
			
		||||
        av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt",     c->sample_fmt,     0);
 | 
			
		||||
 | 
			
		||||
        /* initialize the resampling context */
 | 
			
		||||
        if ((ret = swr_init(swr_ctx)) < 0) {
 | 
			
		||||
            fprintf(stderr, "Failed to initialize the resampling context\n");
 | 
			
		||||
            exit(1);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* compute the number of converted samples: buffering is avoided
 | 
			
		||||
     * ensuring that the output buffer will contain at least all the
 | 
			
		||||
     * converted input samples */
 | 
			
		||||
    max_dst_nb_samples = src_nb_samples;
 | 
			
		||||
    ret = av_samples_alloc_array_and_samples(&dst_samples_data, &dst_samples_linesize, c->channels,
 | 
			
		||||
                                             max_dst_nb_samples, c->sample_fmt, 0);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate destination samples\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    dst_samples_size = av_samples_get_buffer_size(NULL, c->channels, max_dst_nb_samples,
 | 
			
		||||
                                                  c->sample_fmt, 0);
 | 
			
		||||
    if (c->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)
 | 
			
		||||
        audio_input_frame_size = 10000;
 | 
			
		||||
    else
 | 
			
		||||
        audio_input_frame_size = c->frame_size;
 | 
			
		||||
    samples = av_malloc(audio_input_frame_size *
 | 
			
		||||
                        av_get_bytes_per_sample(c->sample_fmt) *
 | 
			
		||||
                        c->channels);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Prepare a 16 bit dummy audio frame of 'frame_size' samples and
 | 
			
		||||
@@ -222,125 +141,174 @@ static void write_audio_frame(AVFormatContext *oc, AVStream *st)
 | 
			
		||||
    AVCodecContext *c;
 | 
			
		||||
    AVPacket pkt = { 0 }; // data and size must be 0;
 | 
			
		||||
    AVFrame *frame = avcodec_alloc_frame();
 | 
			
		||||
    int got_packet, ret, dst_nb_samples;
 | 
			
		||||
    int got_packet;
 | 
			
		||||
 | 
			
		||||
    av_init_packet(&pkt);
 | 
			
		||||
    c = st->codec;
 | 
			
		||||
 | 
			
		||||
    get_audio_frame((int16_t *)src_samples_data[0], src_nb_samples, c->channels);
 | 
			
		||||
 | 
			
		||||
    /* convert samples from native format to destination codec format, using the resampler */
 | 
			
		||||
    if (swr_ctx) {
 | 
			
		||||
        /* compute destination number of samples */
 | 
			
		||||
        dst_nb_samples = av_rescale_rnd(swr_get_delay(swr_ctx, c->sample_rate) + src_nb_samples,
 | 
			
		||||
                                        c->sample_rate, c->sample_rate, AV_ROUND_UP);
 | 
			
		||||
        if (dst_nb_samples > max_dst_nb_samples) {
 | 
			
		||||
            av_free(dst_samples_data[0]);
 | 
			
		||||
            ret = av_samples_alloc(dst_samples_data, &dst_samples_linesize, c->channels,
 | 
			
		||||
                                   dst_nb_samples, c->sample_fmt, 0);
 | 
			
		||||
            if (ret < 0)
 | 
			
		||||
                exit(1);
 | 
			
		||||
            max_dst_nb_samples = dst_nb_samples;
 | 
			
		||||
            dst_samples_size = av_samples_get_buffer_size(NULL, c->channels, dst_nb_samples,
 | 
			
		||||
                                                          c->sample_fmt, 0);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* convert to destination format */
 | 
			
		||||
        ret = swr_convert(swr_ctx,
 | 
			
		||||
                          dst_samples_data, dst_nb_samples,
 | 
			
		||||
                          (const uint8_t **)src_samples_data, src_nb_samples);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "Error while converting\n");
 | 
			
		||||
            exit(1);
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        dst_samples_data[0] = src_samples_data[0];
 | 
			
		||||
        dst_nb_samples = src_nb_samples;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    frame->nb_samples = dst_nb_samples;
 | 
			
		||||
    get_audio_frame(samples, audio_input_frame_size, c->channels);
 | 
			
		||||
    frame->nb_samples = audio_input_frame_size;
 | 
			
		||||
    avcodec_fill_audio_frame(frame, c->channels, c->sample_fmt,
 | 
			
		||||
                             dst_samples_data[0], dst_samples_size, 0);
 | 
			
		||||
 | 
			
		||||
    ret = avcodec_encode_audio2(c, &pkt, frame, &got_packet);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Error encoding audio frame: %s\n", av_err2str(ret));
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
                             (uint8_t *)samples,
 | 
			
		||||
                             audio_input_frame_size *
 | 
			
		||||
                             av_get_bytes_per_sample(c->sample_fmt) *
 | 
			
		||||
                             c->channels, 1);
 | 
			
		||||
 | 
			
		||||
    avcodec_encode_audio2(c, &pkt, frame, &got_packet);
 | 
			
		||||
    if (!got_packet)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    pkt.stream_index = st->index;
 | 
			
		||||
 | 
			
		||||
    /* Write the compressed frame to the media file. */
 | 
			
		||||
    ret = av_interleaved_write_frame(oc, &pkt);
 | 
			
		||||
    if (ret != 0) {
 | 
			
		||||
        fprintf(stderr, "Error while writing audio frame: %s\n",
 | 
			
		||||
                av_err2str(ret));
 | 
			
		||||
    if (av_interleaved_write_frame(oc, &pkt) != 0) {
 | 
			
		||||
        fprintf(stderr, "Error while writing audio frame\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    avcodec_free_frame(&frame);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void close_audio(AVFormatContext *oc, AVStream *st)
 | 
			
		||||
{
 | 
			
		||||
    avcodec_close(st->codec);
 | 
			
		||||
    av_free(src_samples_data[0]);
 | 
			
		||||
    av_free(dst_samples_data[0]);
 | 
			
		||||
 | 
			
		||||
    av_free(samples);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**************************************************************/
 | 
			
		||||
/* video output */
 | 
			
		||||
 | 
			
		||||
static AVFrame *frame;
 | 
			
		||||
static AVPicture src_picture, dst_picture;
 | 
			
		||||
static int frame_count;
 | 
			
		||||
static AVFrame *picture, *tmp_picture;
 | 
			
		||||
static uint8_t *video_outbuf;
 | 
			
		||||
static int frame_count, video_outbuf_size;
 | 
			
		||||
 | 
			
		||||
static void open_video(AVFormatContext *oc, AVCodec *codec, AVStream *st)
 | 
			
		||||
/* Add a video output stream. */
 | 
			
		||||
static AVStream *add_video_stream(AVFormatContext *oc, enum CodecID codec_id)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    AVCodecContext *c = st->codec;
 | 
			
		||||
    AVCodecContext *c;
 | 
			
		||||
    AVStream *st;
 | 
			
		||||
    AVCodec *codec;
 | 
			
		||||
 | 
			
		||||
    /* open the codec */
 | 
			
		||||
    ret = avcodec_open2(c, codec, NULL);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not open video codec: %s\n", av_err2str(ret));
 | 
			
		||||
    /* find the video encoder */
 | 
			
		||||
    codec = avcodec_find_encoder(codec_id);
 | 
			
		||||
    if (!codec) {
 | 
			
		||||
        fprintf(stderr, "codec not found\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* allocate and init a re-usable frame */
 | 
			
		||||
    frame = avcodec_alloc_frame();
 | 
			
		||||
    if (!frame) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate video frame\n");
 | 
			
		||||
    st = avformat_new_stream(oc, codec);
 | 
			
		||||
    if (!st) {
 | 
			
		||||
        fprintf(stderr, "Could not alloc stream\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    c = st->codec;
 | 
			
		||||
 | 
			
		||||
    /* find the video encoder */
 | 
			
		||||
    codec = avcodec_find_encoder(codec_id);
 | 
			
		||||
    if (!codec) {
 | 
			
		||||
        fprintf(stderr, "codec not found\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    avcodec_get_context_defaults3(c, codec);
 | 
			
		||||
 | 
			
		||||
    c->codec_id = codec_id;
 | 
			
		||||
 | 
			
		||||
    /* Put sample parameters. */
 | 
			
		||||
    c->bit_rate = 400000;
 | 
			
		||||
    /* Resolution must be a multiple of two. */
 | 
			
		||||
    c->width    = 352;
 | 
			
		||||
    c->height   = 288;
 | 
			
		||||
    /* timebase: This is the fundamental unit of time (in seconds) in terms
 | 
			
		||||
     * of which frame timestamps are represented. For fixed-fps content,
 | 
			
		||||
     * timebase should be 1/framerate and timestamp increments should be
 | 
			
		||||
     * identical to 1. */
 | 
			
		||||
    c->time_base.den = STREAM_FRAME_RATE;
 | 
			
		||||
    c->time_base.num = 1;
 | 
			
		||||
    c->gop_size      = 12; /* emit one intra frame every twelve frames at most */
 | 
			
		||||
    c->pix_fmt       = STREAM_PIX_FMT;
 | 
			
		||||
    if (c->codec_id == CODEC_ID_MPEG2VIDEO) {
 | 
			
		||||
        /* just for testing, we also add B frames */
 | 
			
		||||
        c->max_b_frames = 2;
 | 
			
		||||
    }
 | 
			
		||||
    if (c->codec_id == CODEC_ID_MPEG1VIDEO) {
 | 
			
		||||
        /* Needed to avoid using macroblocks in which some coeffs overflow.
 | 
			
		||||
         * This does not happen with normal video, it just happens here as
 | 
			
		||||
         * the motion of the chroma plane does not match the luma plane. */
 | 
			
		||||
        c->mb_decision = 2;
 | 
			
		||||
    }
 | 
			
		||||
    /* Some formats want stream headers to be separate. */
 | 
			
		||||
    if (oc->oformat->flags & AVFMT_GLOBALHEADER)
 | 
			
		||||
        c->flags |= CODEC_FLAG_GLOBAL_HEADER;
 | 
			
		||||
 | 
			
		||||
    return st;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static AVFrame *alloc_picture(enum PixelFormat pix_fmt, int width, int height)
 | 
			
		||||
{
 | 
			
		||||
    AVFrame *picture;
 | 
			
		||||
    uint8_t *picture_buf;
 | 
			
		||||
    int size;
 | 
			
		||||
 | 
			
		||||
    picture = avcodec_alloc_frame();
 | 
			
		||||
    if (!picture)
 | 
			
		||||
        return NULL;
 | 
			
		||||
    size        = avpicture_get_size(pix_fmt, width, height);
 | 
			
		||||
    picture_buf = av_malloc(size);
 | 
			
		||||
    if (!picture_buf) {
 | 
			
		||||
        av_free(picture);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    avpicture_fill((AVPicture *)picture, picture_buf,
 | 
			
		||||
                   pix_fmt, width, height);
 | 
			
		||||
    return picture;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void open_video(AVFormatContext *oc, AVStream *st)
 | 
			
		||||
{
 | 
			
		||||
    AVCodecContext *c;
 | 
			
		||||
 | 
			
		||||
    c = st->codec;
 | 
			
		||||
 | 
			
		||||
    /* open the codec */
 | 
			
		||||
    if (avcodec_open2(c, NULL, NULL) < 0) {
 | 
			
		||||
        fprintf(stderr, "could not open codec\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    video_outbuf = NULL;
 | 
			
		||||
    if (!(oc->oformat->flags & AVFMT_RAWPICTURE)) {
 | 
			
		||||
        /* Allocate output buffer. */
 | 
			
		||||
        /* XXX: API change will be done. */
 | 
			
		||||
        /* Buffers passed into lav* can be allocated any way you prefer,
 | 
			
		||||
         * as long as they're aligned enough for the architecture, and
 | 
			
		||||
         * they're freed appropriately (such as using av_free for buffers
 | 
			
		||||
         * allocated with av_malloc). */
 | 
			
		||||
        video_outbuf_size = 200000;
 | 
			
		||||
        video_outbuf      = av_malloc(video_outbuf_size);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Allocate the encoded raw picture. */
 | 
			
		||||
    ret = avpicture_alloc(&dst_picture, c->pix_fmt, c->width, c->height);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate picture: %s\n", av_err2str(ret));
 | 
			
		||||
    picture = alloc_picture(c->pix_fmt, c->width, c->height);
 | 
			
		||||
    if (!picture) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate picture\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* If the output format is not YUV420P, then a temporary YUV420P
 | 
			
		||||
     * picture is needed too. It is then converted to the required
 | 
			
		||||
     * output format. */
 | 
			
		||||
    if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
 | 
			
		||||
        ret = avpicture_alloc(&src_picture, AV_PIX_FMT_YUV420P, c->width, c->height);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "Could not allocate temporary picture: %s\n",
 | 
			
		||||
                    av_err2str(ret));
 | 
			
		||||
    tmp_picture = NULL;
 | 
			
		||||
    if (c->pix_fmt != PIX_FMT_YUV420P) {
 | 
			
		||||
        tmp_picture = alloc_picture(PIX_FMT_YUV420P, c->width, c->height);
 | 
			
		||||
        if (!tmp_picture) {
 | 
			
		||||
            fprintf(stderr, "Could not allocate temporary picture\n");
 | 
			
		||||
            exit(1);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* copy data and linesize picture pointers to frame */
 | 
			
		||||
    *((AVPicture *)frame) = dst_picture;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Prepare a dummy image. */
 | 
			
		||||
static void fill_yuv_image(AVPicture *pict, int frame_index,
 | 
			
		||||
static void fill_yuv_image(AVFrame *pict, int frame_index,
 | 
			
		||||
                           int width, int height)
 | 
			
		||||
{
 | 
			
		||||
    int x, y, i;
 | 
			
		||||
@@ -363,63 +331,70 @@ static void fill_yuv_image(AVPicture *pict, int frame_index,
 | 
			
		||||
 | 
			
		||||
static void write_video_frame(AVFormatContext *oc, AVStream *st)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    static struct SwsContext *sws_ctx;
 | 
			
		||||
    AVCodecContext *c = st->codec;
 | 
			
		||||
    int out_size, ret;
 | 
			
		||||
    AVCodecContext *c;
 | 
			
		||||
    static struct SwsContext *img_convert_ctx;
 | 
			
		||||
 | 
			
		||||
    c = st->codec;
 | 
			
		||||
 | 
			
		||||
    if (frame_count >= STREAM_NB_FRAMES) {
 | 
			
		||||
        /* No more frames to compress. The codec has a latency of a few
 | 
			
		||||
         * frames if using B-frames, so we get the last frames by
 | 
			
		||||
         * passing the same picture again. */
 | 
			
		||||
    } else {
 | 
			
		||||
        if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
 | 
			
		||||
        if (c->pix_fmt != PIX_FMT_YUV420P) {
 | 
			
		||||
            /* as we only generate a YUV420P picture, we must convert it
 | 
			
		||||
             * to the codec pixel format if needed */
 | 
			
		||||
            if (!sws_ctx) {
 | 
			
		||||
                sws_ctx = sws_getContext(c->width, c->height, AV_PIX_FMT_YUV420P,
 | 
			
		||||
                                         c->width, c->height, c->pix_fmt,
 | 
			
		||||
            if (img_convert_ctx == NULL) {
 | 
			
		||||
                img_convert_ctx = sws_getContext(c->width, c->height,
 | 
			
		||||
                                                 PIX_FMT_YUV420P,
 | 
			
		||||
                                                 c->width, c->height,
 | 
			
		||||
                                                 c->pix_fmt,
 | 
			
		||||
                                                 sws_flags, NULL, NULL, NULL);
 | 
			
		||||
                if (!sws_ctx) {
 | 
			
		||||
                if (img_convert_ctx == NULL) {
 | 
			
		||||
                    fprintf(stderr,
 | 
			
		||||
                            "Could not initialize the conversion context\n");
 | 
			
		||||
                            "Cannot initialize the conversion context\n");
 | 
			
		||||
                    exit(1);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            fill_yuv_image(&src_picture, frame_count, c->width, c->height);
 | 
			
		||||
            sws_scale(sws_ctx,
 | 
			
		||||
                      (const uint8_t * const *)src_picture.data, src_picture.linesize,
 | 
			
		||||
                      0, c->height, dst_picture.data, dst_picture.linesize);
 | 
			
		||||
            fill_yuv_image(tmp_picture, frame_count, c->width, c->height);
 | 
			
		||||
            sws_scale(img_convert_ctx, tmp_picture->data, tmp_picture->linesize,
 | 
			
		||||
                      0, c->height, picture->data, picture->linesize);
 | 
			
		||||
        } else {
 | 
			
		||||
            fill_yuv_image(&dst_picture, frame_count, c->width, c->height);
 | 
			
		||||
            fill_yuv_image(picture, frame_count, c->width, c->height);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (oc->oformat->flags & AVFMT_RAWPICTURE) {
 | 
			
		||||
        /* Raw video case - directly store the picture in the packet */
 | 
			
		||||
        /* Raw video case - the API will change slightly in the near
 | 
			
		||||
         * future for that. */
 | 
			
		||||
        AVPacket pkt;
 | 
			
		||||
        av_init_packet(&pkt);
 | 
			
		||||
 | 
			
		||||
        pkt.flags        |= AV_PKT_FLAG_KEY;
 | 
			
		||||
        pkt.stream_index  = st->index;
 | 
			
		||||
        pkt.data          = dst_picture.data[0];
 | 
			
		||||
        pkt.data          = (uint8_t *)picture;
 | 
			
		||||
        pkt.size          = sizeof(AVPicture);
 | 
			
		||||
 | 
			
		||||
        ret = av_interleaved_write_frame(oc, &pkt);
 | 
			
		||||
    } else {
 | 
			
		||||
        AVPacket pkt = { 0 };
 | 
			
		||||
        int got_packet;
 | 
			
		||||
        /* encode the image */
 | 
			
		||||
        out_size = avcodec_encode_video(c, video_outbuf,
 | 
			
		||||
                                        video_outbuf_size, picture);
 | 
			
		||||
        /* If size is zero, it means the image was buffered. */
 | 
			
		||||
        if (out_size > 0) {
 | 
			
		||||
            AVPacket pkt;
 | 
			
		||||
            av_init_packet(&pkt);
 | 
			
		||||
 | 
			
		||||
        /* encode the image */
 | 
			
		||||
        ret = avcodec_encode_video2(c, &pkt, frame, &got_packet);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "Error encoding video frame: %s\n", av_err2str(ret));
 | 
			
		||||
            exit(1);
 | 
			
		||||
        }
 | 
			
		||||
        /* If size is zero, it means the image was buffered. */
 | 
			
		||||
            if (c->coded_frame->pts != AV_NOPTS_VALUE)
 | 
			
		||||
                pkt.pts = av_rescale_q(c->coded_frame->pts,
 | 
			
		||||
                                       c->time_base, st->time_base);
 | 
			
		||||
            if (c->coded_frame->key_frame)
 | 
			
		||||
                pkt.flags |= AV_PKT_FLAG_KEY;
 | 
			
		||||
 | 
			
		||||
        if (!ret && got_packet && pkt.size) {
 | 
			
		||||
            pkt.stream_index = st->index;
 | 
			
		||||
            pkt.data         = video_outbuf;
 | 
			
		||||
            pkt.size         = out_size;
 | 
			
		||||
 | 
			
		||||
            /* Write the compressed frame to the media file. */
 | 
			
		||||
            ret = av_interleaved_write_frame(oc, &pkt);
 | 
			
		||||
@@ -428,7 +403,7 @@ static void write_video_frame(AVFormatContext *oc, AVStream *st)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (ret != 0) {
 | 
			
		||||
        fprintf(stderr, "Error while writing video frame: %s\n", av_err2str(ret));
 | 
			
		||||
        fprintf(stderr, "Error while writing video frame\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    frame_count++;
 | 
			
		||||
@@ -437,9 +412,13 @@ static void write_video_frame(AVFormatContext *oc, AVStream *st)
 | 
			
		||||
static void close_video(AVFormatContext *oc, AVStream *st)
 | 
			
		||||
{
 | 
			
		||||
    avcodec_close(st->codec);
 | 
			
		||||
    av_free(src_picture.data[0]);
 | 
			
		||||
    av_free(dst_picture.data[0]);
 | 
			
		||||
    av_free(frame);
 | 
			
		||||
    av_free(picture->data[0]);
 | 
			
		||||
    av_free(picture);
 | 
			
		||||
    if (tmp_picture) {
 | 
			
		||||
        av_free(tmp_picture->data[0]);
 | 
			
		||||
        av_free(tmp_picture);
 | 
			
		||||
    }
 | 
			
		||||
    av_free(video_outbuf);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**************************************************************/
 | 
			
		||||
@@ -451,9 +430,8 @@ int main(int argc, char **argv)
 | 
			
		||||
    AVOutputFormat *fmt;
 | 
			
		||||
    AVFormatContext *oc;
 | 
			
		||||
    AVStream *audio_st, *video_st;
 | 
			
		||||
    AVCodec *audio_codec, *video_codec;
 | 
			
		||||
    double audio_time, video_time;
 | 
			
		||||
    int ret;
 | 
			
		||||
    double audio_pts, video_pts;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    /* Initialize libavcodec, and register all codecs and formats. */
 | 
			
		||||
    av_register_all();
 | 
			
		||||
@@ -461,10 +439,8 @@ int main(int argc, char **argv)
 | 
			
		||||
    if (argc != 2) {
 | 
			
		||||
        printf("usage: %s output_file\n"
 | 
			
		||||
               "API example program to output a media file with libavformat.\n"
 | 
			
		||||
               "This program generates a synthetic audio and video stream, encodes and\n"
 | 
			
		||||
               "muxes them into a file named output_file.\n"
 | 
			
		||||
               "The output format is automatically guessed according to the file extension.\n"
 | 
			
		||||
               "Raw images can also be output by using '%%d' in the filename.\n"
 | 
			
		||||
               "Raw images can also be output by using '%%d' in the filename\n"
 | 
			
		||||
               "\n", argv[0]);
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
@@ -486,58 +462,57 @@ int main(int argc, char **argv)
 | 
			
		||||
     * and initialize the codecs. */
 | 
			
		||||
    video_st = NULL;
 | 
			
		||||
    audio_st = NULL;
 | 
			
		||||
 | 
			
		||||
    if (fmt->video_codec != AV_CODEC_ID_NONE) {
 | 
			
		||||
        video_st = add_stream(oc, &video_codec, fmt->video_codec);
 | 
			
		||||
    if (fmt->video_codec != CODEC_ID_NONE) {
 | 
			
		||||
        video_st = add_video_stream(oc, fmt->video_codec);
 | 
			
		||||
    }
 | 
			
		||||
    if (fmt->audio_codec != AV_CODEC_ID_NONE) {
 | 
			
		||||
        audio_st = add_stream(oc, &audio_codec, fmt->audio_codec);
 | 
			
		||||
    if (fmt->audio_codec != CODEC_ID_NONE) {
 | 
			
		||||
        audio_st = add_audio_stream(oc, fmt->audio_codec);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Now that all the parameters are set, we can open the audio and
 | 
			
		||||
     * video codecs and allocate the necessary encode buffers. */
 | 
			
		||||
    if (video_st)
 | 
			
		||||
        open_video(oc, video_codec, video_st);
 | 
			
		||||
        open_video(oc, video_st);
 | 
			
		||||
    if (audio_st)
 | 
			
		||||
        open_audio(oc, audio_codec, audio_st);
 | 
			
		||||
        open_audio(oc, audio_st);
 | 
			
		||||
 | 
			
		||||
    av_dump_format(oc, 0, filename, 1);
 | 
			
		||||
 | 
			
		||||
    /* open the output file, if needed */
 | 
			
		||||
    if (!(fmt->flags & AVFMT_NOFILE)) {
 | 
			
		||||
        ret = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "Could not open '%s': %s\n", filename,
 | 
			
		||||
                    av_err2str(ret));
 | 
			
		||||
        if (avio_open(&oc->pb, filename, AVIO_FLAG_WRITE) < 0) {
 | 
			
		||||
            fprintf(stderr, "Could not open '%s'\n", filename);
 | 
			
		||||
            return 1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Write the stream header, if any. */
 | 
			
		||||
    ret = avformat_write_header(oc, NULL);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Error occurred when opening output file: %s\n",
 | 
			
		||||
                av_err2str(ret));
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
    avformat_write_header(oc, NULL);
 | 
			
		||||
 | 
			
		||||
    if (frame)
 | 
			
		||||
        frame->pts = 0;
 | 
			
		||||
    picture->pts = 0;
 | 
			
		||||
    for (;;) {
 | 
			
		||||
        /* Compute current audio and video time. */
 | 
			
		||||
        audio_time = audio_st ? audio_st->pts.val * av_q2d(audio_st->time_base) : 0.0;
 | 
			
		||||
        video_time = video_st ? video_st->pts.val * av_q2d(video_st->time_base) : 0.0;
 | 
			
		||||
        if (audio_st)
 | 
			
		||||
            audio_pts = (double)audio_st->pts.val * audio_st->time_base.num / audio_st->time_base.den;
 | 
			
		||||
        else
 | 
			
		||||
            audio_pts = 0.0;
 | 
			
		||||
 | 
			
		||||
        if ((!audio_st || audio_time >= STREAM_DURATION) &&
 | 
			
		||||
            (!video_st || video_time >= STREAM_DURATION))
 | 
			
		||||
        if (video_st)
 | 
			
		||||
            video_pts = (double)video_st->pts.val * video_st->time_base.num /
 | 
			
		||||
                        video_st->time_base.den;
 | 
			
		||||
        else
 | 
			
		||||
            video_pts = 0.0;
 | 
			
		||||
 | 
			
		||||
        if ((!audio_st || audio_pts >= STREAM_DURATION) &&
 | 
			
		||||
            (!video_st || video_pts >= STREAM_DURATION))
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        /* write interleaved audio and video frames */
 | 
			
		||||
        if (!video_st || (video_st && audio_st && audio_time < video_time)) {
 | 
			
		||||
        if (!video_st || (video_st && audio_st && audio_pts < video_pts)) {
 | 
			
		||||
            write_audio_frame(oc, audio_st);
 | 
			
		||||
        } else {
 | 
			
		||||
            write_video_frame(oc, video_st);
 | 
			
		||||
            frame->pts += av_rescale_q(1, video_st->codec->time_base, video_st->time_base);
 | 
			
		||||
            picture->pts++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -553,12 +528,18 @@ int main(int argc, char **argv)
 | 
			
		||||
    if (audio_st)
 | 
			
		||||
        close_audio(oc, audio_st);
 | 
			
		||||
 | 
			
		||||
    /* Free the streams. */
 | 
			
		||||
    for (i = 0; i < oc->nb_streams; i++) {
 | 
			
		||||
        av_freep(&oc->streams[i]->codec);
 | 
			
		||||
        av_freep(&oc->streams[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!(fmt->flags & AVFMT_NOFILE))
 | 
			
		||||
        /* Close the output file. */
 | 
			
		||||
        avio_close(oc->pb);
 | 
			
		||||
 | 
			
		||||
    /* free the stream */
 | 
			
		||||
    avformat_free_context(oc);
 | 
			
		||||
    av_free(oc);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,211 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2012 Stefano Sabatini
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
 * of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
 * in the Software without restriction, including without limitation the rights
 | 
			
		||||
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
 * copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
 * furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
 * THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @example doc/examples/resampling_audio.c
 | 
			
		||||
 * libswresample API use example.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <libavutil/opt.h>
 | 
			
		||||
#include <libavutil/channel_layout.h>
 | 
			
		||||
#include <libavutil/samplefmt.h>
 | 
			
		||||
#include <libswresample/swresample.h>
 | 
			
		||||
 | 
			
		||||
static int get_format_from_sample_fmt(const char **fmt,
 | 
			
		||||
                                      enum AVSampleFormat sample_fmt)
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
    struct sample_fmt_entry {
 | 
			
		||||
        enum AVSampleFormat sample_fmt; const char *fmt_be, *fmt_le;
 | 
			
		||||
    } sample_fmt_entries[] = {
 | 
			
		||||
        { AV_SAMPLE_FMT_U8,  "u8",    "u8"    },
 | 
			
		||||
        { AV_SAMPLE_FMT_S16, "s16be", "s16le" },
 | 
			
		||||
        { AV_SAMPLE_FMT_S32, "s32be", "s32le" },
 | 
			
		||||
        { AV_SAMPLE_FMT_FLT, "f32be", "f32le" },
 | 
			
		||||
        { AV_SAMPLE_FMT_DBL, "f64be", "f64le" },
 | 
			
		||||
    };
 | 
			
		||||
    *fmt = NULL;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < FF_ARRAY_ELEMS(sample_fmt_entries); i++) {
 | 
			
		||||
        struct sample_fmt_entry *entry = &sample_fmt_entries[i];
 | 
			
		||||
        if (sample_fmt == entry->sample_fmt) {
 | 
			
		||||
            *fmt = AV_NE(entry->fmt_be, entry->fmt_le);
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fprintf(stderr,
 | 
			
		||||
            "Sample format %s not supported as output format\n",
 | 
			
		||||
            av_get_sample_fmt_name(sample_fmt));
 | 
			
		||||
    return AVERROR(EINVAL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Fill dst buffer with nb_samples, generated starting from t.
 | 
			
		||||
 */
 | 
			
		||||
void fill_samples(double *dst, int nb_samples, int nb_channels, int sample_rate, double *t)
 | 
			
		||||
{
 | 
			
		||||
    int i, j;
 | 
			
		||||
    double tincr = 1.0 / sample_rate, *dstp = dst;
 | 
			
		||||
    const double c = 2 * M_PI * 440.0;
 | 
			
		||||
 | 
			
		||||
    /* generate sin tone with 440Hz frequency and duplicated channels */
 | 
			
		||||
    for (i = 0; i < nb_samples; i++) {
 | 
			
		||||
        *dstp = sin(c * *t);
 | 
			
		||||
        for (j = 1; j < nb_channels; j++)
 | 
			
		||||
            dstp[j] = dstp[0];
 | 
			
		||||
        dstp += nb_channels;
 | 
			
		||||
        *t += tincr;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    int64_t src_ch_layout = AV_CH_LAYOUT_STEREO, dst_ch_layout = AV_CH_LAYOUT_SURROUND;
 | 
			
		||||
    int src_rate = 48000, dst_rate = 44100;
 | 
			
		||||
    uint8_t **src_data = NULL, **dst_data = NULL;
 | 
			
		||||
    int src_nb_channels = 0, dst_nb_channels = 0;
 | 
			
		||||
    int src_linesize, dst_linesize;
 | 
			
		||||
    int src_nb_samples = 1024, dst_nb_samples, max_dst_nb_samples;
 | 
			
		||||
    enum AVSampleFormat src_sample_fmt = AV_SAMPLE_FMT_DBL, dst_sample_fmt = AV_SAMPLE_FMT_S16;
 | 
			
		||||
    const char *dst_filename = NULL;
 | 
			
		||||
    FILE *dst_file;
 | 
			
		||||
    int dst_bufsize;
 | 
			
		||||
    const char *fmt;
 | 
			
		||||
    struct SwrContext *swr_ctx;
 | 
			
		||||
    double t;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    if (argc != 2) {
 | 
			
		||||
        fprintf(stderr, "Usage: %s output_file\n"
 | 
			
		||||
                "API example program to show how to resample an audio stream with libswresample.\n"
 | 
			
		||||
                "This program generates a series of audio frames, resamples them to a specified "
 | 
			
		||||
                "output format and rate and saves them to an output file named output_file.\n",
 | 
			
		||||
            argv[0]);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    dst_filename = argv[1];
 | 
			
		||||
 | 
			
		||||
    dst_file = fopen(dst_filename, "wb");
 | 
			
		||||
    if (!dst_file) {
 | 
			
		||||
        fprintf(stderr, "Could not open destination file %s\n", dst_filename);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* create resampler context */
 | 
			
		||||
    swr_ctx = swr_alloc();
 | 
			
		||||
    if (!swr_ctx) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate resampler context\n");
 | 
			
		||||
        ret = AVERROR(ENOMEM);
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* set options */
 | 
			
		||||
    av_opt_set_int(swr_ctx, "in_channel_layout",    src_ch_layout, 0);
 | 
			
		||||
    av_opt_set_int(swr_ctx, "in_sample_rate",       src_rate, 0);
 | 
			
		||||
    av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", src_sample_fmt, 0);
 | 
			
		||||
 | 
			
		||||
    av_opt_set_int(swr_ctx, "out_channel_layout",    dst_ch_layout, 0);
 | 
			
		||||
    av_opt_set_int(swr_ctx, "out_sample_rate",       dst_rate, 0);
 | 
			
		||||
    av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", dst_sample_fmt, 0);
 | 
			
		||||
 | 
			
		||||
    /* initialize the resampling context */
 | 
			
		||||
    if ((ret = swr_init(swr_ctx)) < 0) {
 | 
			
		||||
        fprintf(stderr, "Failed to initialize the resampling context\n");
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* allocate source and destination samples buffers */
 | 
			
		||||
 | 
			
		||||
    src_nb_channels = av_get_channel_layout_nb_channels(src_ch_layout);
 | 
			
		||||
    ret = av_samples_alloc_array_and_samples(&src_data, &src_linesize, src_nb_channels,
 | 
			
		||||
                                             src_nb_samples, src_sample_fmt, 0);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate source samples\n");
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* compute the number of converted samples: buffering is avoided
 | 
			
		||||
     * ensuring that the output buffer will contain at least all the
 | 
			
		||||
     * converted input samples */
 | 
			
		||||
    max_dst_nb_samples = dst_nb_samples =
 | 
			
		||||
        av_rescale_rnd(src_nb_samples, dst_rate, src_rate, AV_ROUND_UP);
 | 
			
		||||
 | 
			
		||||
    /* buffer is going to be directly written to a rawaudio file, no alignment */
 | 
			
		||||
    dst_nb_channels = av_get_channel_layout_nb_channels(dst_ch_layout);
 | 
			
		||||
    ret = av_samples_alloc_array_and_samples(&dst_data, &dst_linesize, dst_nb_channels,
 | 
			
		||||
                                             dst_nb_samples, dst_sample_fmt, 0);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate destination samples\n");
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    t = 0;
 | 
			
		||||
    do {
 | 
			
		||||
        /* generate synthetic audio */
 | 
			
		||||
        fill_samples((double *)src_data[0], src_nb_samples, src_nb_channels, src_rate, &t);
 | 
			
		||||
 | 
			
		||||
        /* compute destination number of samples */
 | 
			
		||||
        dst_nb_samples = av_rescale_rnd(swr_get_delay(swr_ctx, src_rate) +
 | 
			
		||||
                                        src_nb_samples, dst_rate, src_rate, AV_ROUND_UP);
 | 
			
		||||
        if (dst_nb_samples > max_dst_nb_samples) {
 | 
			
		||||
            av_free(dst_data[0]);
 | 
			
		||||
            ret = av_samples_alloc(dst_data, &dst_linesize, dst_nb_channels,
 | 
			
		||||
                                   dst_nb_samples, dst_sample_fmt, 1);
 | 
			
		||||
            if (ret < 0)
 | 
			
		||||
                break;
 | 
			
		||||
            max_dst_nb_samples = dst_nb_samples;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* convert to destination format */
 | 
			
		||||
        ret = swr_convert(swr_ctx, dst_data, dst_nb_samples, (const uint8_t **)src_data, src_nb_samples);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "Error while converting\n");
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
        dst_bufsize = av_samples_get_buffer_size(&dst_linesize, dst_nb_channels,
 | 
			
		||||
                                                 ret, dst_sample_fmt, 1);
 | 
			
		||||
        printf("t:%f in:%d out:%d\n", t, src_nb_samples, ret);
 | 
			
		||||
        fwrite(dst_data[0], 1, dst_bufsize, dst_file);
 | 
			
		||||
    } while (t < 10);
 | 
			
		||||
 | 
			
		||||
    if ((ret = get_format_from_sample_fmt(&fmt, dst_sample_fmt)) < 0)
 | 
			
		||||
        goto end;
 | 
			
		||||
    fprintf(stderr, "Resampling succeeded. Play the output file with the command:\n"
 | 
			
		||||
            "ffplay -f %s -channel_layout %"PRId64" -channels %d -ar %d %s\n",
 | 
			
		||||
            fmt, dst_ch_layout, dst_nb_channels, dst_rate, dst_filename);
 | 
			
		||||
 | 
			
		||||
end:
 | 
			
		||||
    if (dst_file)
 | 
			
		||||
        fclose(dst_file);
 | 
			
		||||
 | 
			
		||||
    if (src_data)
 | 
			
		||||
        av_freep(&src_data[0]);
 | 
			
		||||
    av_freep(&src_data);
 | 
			
		||||
 | 
			
		||||
    if (dst_data)
 | 
			
		||||
        av_freep(&dst_data[0]);
 | 
			
		||||
    av_freep(&dst_data);
 | 
			
		||||
 | 
			
		||||
    swr_free(&swr_ctx);
 | 
			
		||||
    return ret < 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,141 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2012 Stefano Sabatini
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
 * of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
 * in the Software without restriction, including without limitation the rights
 | 
			
		||||
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
 * copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
 * furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
 * THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * libswscale API use example.
 | 
			
		||||
 * @example doc/examples/scaling_video.c
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <libavutil/imgutils.h>
 | 
			
		||||
#include <libavutil/parseutils.h>
 | 
			
		||||
#include <libswscale/swscale.h>
 | 
			
		||||
 | 
			
		||||
static void fill_yuv_image(uint8_t *data[4], int linesize[4],
 | 
			
		||||
                           int width, int height, int frame_index)
 | 
			
		||||
{
 | 
			
		||||
    int x, y;
 | 
			
		||||
 | 
			
		||||
    /* Y */
 | 
			
		||||
    for (y = 0; y < height; y++)
 | 
			
		||||
        for (x = 0; x < width; x++)
 | 
			
		||||
            data[0][y * linesize[0] + x] = x + y + frame_index * 3;
 | 
			
		||||
 | 
			
		||||
    /* Cb and Cr */
 | 
			
		||||
    for (y = 0; y < height / 2; y++) {
 | 
			
		||||
        for (x = 0; x < width / 2; x++) {
 | 
			
		||||
            data[1][y * linesize[1] + x] = 128 + y + frame_index * 2;
 | 
			
		||||
            data[2][y * linesize[2] + x] = 64 + x + frame_index * 5;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t *src_data[4], *dst_data[4];
 | 
			
		||||
    int src_linesize[4], dst_linesize[4];
 | 
			
		||||
    int src_w = 320, src_h = 240, dst_w, dst_h;
 | 
			
		||||
    enum AVPixelFormat src_pix_fmt = AV_PIX_FMT_YUV420P, dst_pix_fmt = AV_PIX_FMT_RGB24;
 | 
			
		||||
    const char *dst_size = NULL;
 | 
			
		||||
    const char *dst_filename = NULL;
 | 
			
		||||
    FILE *dst_file;
 | 
			
		||||
    int dst_bufsize;
 | 
			
		||||
    struct SwsContext *sws_ctx;
 | 
			
		||||
    int i, ret;
 | 
			
		||||
 | 
			
		||||
    if (argc != 3) {
 | 
			
		||||
        fprintf(stderr, "Usage: %s output_file output_size\n"
 | 
			
		||||
                "API example program to show how to scale an image with libswscale.\n"
 | 
			
		||||
                "This program generates a series of pictures, rescales them to the given "
 | 
			
		||||
                "output_size and saves them to an output file named output_file\n."
 | 
			
		||||
                "\n", argv[0]);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    dst_filename = argv[1];
 | 
			
		||||
    dst_size     = argv[2];
 | 
			
		||||
 | 
			
		||||
    if (av_parse_video_size(&dst_w, &dst_h, dst_size) < 0) {
 | 
			
		||||
        fprintf(stderr,
 | 
			
		||||
                "Invalid size '%s', must be in the form WxH or a valid size abbreviation\n",
 | 
			
		||||
                dst_size);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    dst_file = fopen(dst_filename, "wb");
 | 
			
		||||
    if (!dst_file) {
 | 
			
		||||
        fprintf(stderr, "Could not open destination file %s\n", dst_filename);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* create scaling context */
 | 
			
		||||
    sws_ctx = sws_getContext(src_w, src_h, src_pix_fmt,
 | 
			
		||||
                             dst_w, dst_h, dst_pix_fmt,
 | 
			
		||||
                             SWS_BILINEAR, NULL, NULL, NULL);
 | 
			
		||||
    if (!sws_ctx) {
 | 
			
		||||
        fprintf(stderr,
 | 
			
		||||
                "Impossible to create scale context for the conversion "
 | 
			
		||||
                "fmt:%s s:%dx%d -> fmt:%s s:%dx%d\n",
 | 
			
		||||
                av_get_pix_fmt_name(src_pix_fmt), src_w, src_h,
 | 
			
		||||
                av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h);
 | 
			
		||||
        ret = AVERROR(EINVAL);
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* allocate source and destination image buffers */
 | 
			
		||||
    if ((ret = av_image_alloc(src_data, src_linesize,
 | 
			
		||||
                              src_w, src_h, src_pix_fmt, 16)) < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate source image\n");
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* buffer is going to be written to rawvideo file, no alignment */
 | 
			
		||||
    if ((ret = av_image_alloc(dst_data, dst_linesize,
 | 
			
		||||
                              dst_w, dst_h, dst_pix_fmt, 1)) < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate destination image\n");
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
    dst_bufsize = ret;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < 100; i++) {
 | 
			
		||||
        /* generate synthetic video */
 | 
			
		||||
        fill_yuv_image(src_data, src_linesize, src_w, src_h, i);
 | 
			
		||||
 | 
			
		||||
        /* convert to destination format */
 | 
			
		||||
        sws_scale(sws_ctx, (const uint8_t * const*)src_data,
 | 
			
		||||
                  src_linesize, 0, src_h, dst_data, dst_linesize);
 | 
			
		||||
 | 
			
		||||
        /* write scaled image to file */
 | 
			
		||||
        fwrite(dst_data[0], 1, dst_bufsize, dst_file);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fprintf(stderr, "Scaling succeeded. Play the output file with the command:\n"
 | 
			
		||||
           "ffplay -f rawvideo -pix_fmt %s -video_size %dx%d %s\n",
 | 
			
		||||
           av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h, dst_filename);
 | 
			
		||||
 | 
			
		||||
end:
 | 
			
		||||
    if (dst_file)
 | 
			
		||||
        fclose(dst_file);
 | 
			
		||||
    av_freep(&src_data[0]);
 | 
			
		||||
    av_freep(&dst_data[0]);
 | 
			
		||||
    sws_freeContext(sws_ctx);
 | 
			
		||||
    return ret < 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										258
									
								
								doc/faq.texi
									
									
									
									
									
								
							
							
						
						
									
										258
									
								
								doc/faq.texi
									
									
									
									
									
								
							@@ -79,17 +79,6 @@ not a bug they should fix:
 | 
			
		||||
Then again, some of them do not know the difference between an undecidable
 | 
			
		||||
problem and an NP-hard problem...
 | 
			
		||||
 | 
			
		||||
@section I have installed this library with my distro's package manager. Why does @command{configure} not see it?
 | 
			
		||||
 | 
			
		||||
Distributions usually split libraries in several packages. The main package
 | 
			
		||||
contains the files necessary to run programs using the library. The
 | 
			
		||||
development package contains the files necessary to build programs using the
 | 
			
		||||
library. Sometimes, docs and/or data are in a separate package too.
 | 
			
		||||
 | 
			
		||||
To build FFmpeg, you need to install the development package. It is usually
 | 
			
		||||
called @file{libfoo-dev} or @file{libfoo-devel}. You can remove it after the
 | 
			
		||||
build is finished, but be sure to keep the main package.
 | 
			
		||||
 | 
			
		||||
@chapter Usage
 | 
			
		||||
 | 
			
		||||
@section ffmpeg does not work; what is wrong?
 | 
			
		||||
@@ -105,21 +94,12 @@ For example, img1.jpg, img2.jpg, img3.jpg,...
 | 
			
		||||
Then you may run:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg
 | 
			
		||||
  ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Notice that @samp{%d} is replaced by the image number.
 | 
			
		||||
 | 
			
		||||
@file{img%03d.jpg} means the sequence @file{img001.jpg}, @file{img002.jpg}, etc.
 | 
			
		||||
 | 
			
		||||
Use the @option{-start_number} option to declare a starting number for
 | 
			
		||||
the sequence. This is useful if your sequence does not start with
 | 
			
		||||
@file{img001.jpg} but is still in a numerical order. The following
 | 
			
		||||
example will start with @file{img100.jpg}:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f image2 -start_number 100 -i img%d.jpg /tmp/a.mpg
 | 
			
		||||
@end example
 | 
			
		||||
@file{img%03d.jpg} means the sequence @file{img001.jpg}, @file{img002.jpg}, etc...
 | 
			
		||||
 | 
			
		||||
If you have large number of pictures to rename, you can use the
 | 
			
		||||
following command to ease the burden. The command, using the bourne
 | 
			
		||||
@@ -128,7 +108,7 @@ that match @code{*jpg} to the @file{/tmp} directory in the sequence of
 | 
			
		||||
@file{img001.jpg}, @file{img002.jpg} and so on.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done
 | 
			
		||||
  x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
If you want to sequence them by oldest modified first, substitute
 | 
			
		||||
@@ -137,23 +117,17 @@ If you want to sequence them by oldest modified first, substitute
 | 
			
		||||
Then run:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
 | 
			
		||||
  ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
The same logic is used for any image format that ffmpeg reads.
 | 
			
		||||
 | 
			
		||||
You can also use @command{cat} to pipe images to ffmpeg:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
cat *.jpg | ffmpeg -f image2pipe -c:v mjpeg -i - output.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section How do I encode movie to single pictures?
 | 
			
		||||
 | 
			
		||||
Use:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i movie.mpg movie%d.jpg
 | 
			
		||||
  ffmpeg -i movie.mpg movie%d.jpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
The @file{movie.mpg} used as input will be converted to
 | 
			
		||||
@@ -169,7 +143,7 @@ to force the encoding.
 | 
			
		||||
 | 
			
		||||
Applying that to the previous example:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg
 | 
			
		||||
  ffmpeg -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Beware that there is no "jpeg" codec. Use "mjpeg" instead.
 | 
			
		||||
@@ -227,79 +201,20 @@ then you may use any file that DirectShow can read as input.
 | 
			
		||||
 | 
			
		||||
Just create an "input.avs" text file with this single line ...
 | 
			
		||||
@example
 | 
			
		||||
DirectShowSource("C:\path to your file\yourfile.asf")
 | 
			
		||||
  DirectShowSource("C:\path to your file\yourfile.asf")
 | 
			
		||||
@end example
 | 
			
		||||
... and then feed that text file to ffmpeg:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i input.avs
 | 
			
		||||
  ffmpeg -i input.avs
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
For ANY other help on AviSynth, please visit the
 | 
			
		||||
@uref{http://www.avisynth.org/, AviSynth homepage}.
 | 
			
		||||
For ANY other help on Avisynth, please visit the
 | 
			
		||||
@uref{http://www.avisynth.org/, Avisynth homepage}.
 | 
			
		||||
 | 
			
		||||
@section How can I join video files?
 | 
			
		||||
 | 
			
		||||
To "join" video files is quite ambiguous. The following list explains the
 | 
			
		||||
different kinds of "joining" and points out how those are addressed in
 | 
			
		||||
FFmpeg. To join video files may mean:
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
To put them one after the other: this is called to @emph{concatenate} them
 | 
			
		||||
(in short: concat) and is addressed
 | 
			
		||||
@ref{How can I concatenate video files, in this very faq}.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
To put them together in the same file, to let the user choose between the
 | 
			
		||||
different versions (example: different audio languages): this is called to
 | 
			
		||||
@emph{multiplex} them together (in short: mux), and is done by simply
 | 
			
		||||
invoking ffmpeg with several @option{-i} options.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
For audio, to put all channels together in a single stream (example: two
 | 
			
		||||
mono streams into one stereo stream): this is sometimes called to
 | 
			
		||||
@emph{merge} them, and can be done using the
 | 
			
		||||
@url{http://ffmpeg.org/ffmpeg-filters.html#amerge, @code{amerge}} filter.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
For audio, to play one on top of the other: this is called to @emph{mix}
 | 
			
		||||
them, and can be done by first merging them into a single stream and then
 | 
			
		||||
using the @url{http://ffmpeg.org/ffmpeg-filters.html#pan, @code{pan}} filter to mix
 | 
			
		||||
the channels at will.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
For video, to display both together, side by side or one on top of a part of
 | 
			
		||||
the other; it can be done using the
 | 
			
		||||
@url{http://ffmpeg.org/ffmpeg-filters.html#overlay, @code{overlay}} video filter.
 | 
			
		||||
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
@anchor{How can I concatenate video files}
 | 
			
		||||
@section How can I concatenate video files?
 | 
			
		||||
 | 
			
		||||
There are several solutions, depending on the exact circumstances.
 | 
			
		||||
 | 
			
		||||
@subsection Concatenating using the concat @emph{filter}
 | 
			
		||||
 | 
			
		||||
FFmpeg has a @url{http://ffmpeg.org/ffmpeg-filters.html#concat,
 | 
			
		||||
@code{concat}} filter designed specifically for that, with examples in the
 | 
			
		||||
documentation. This operation is recommended if you need to re-encode.
 | 
			
		||||
 | 
			
		||||
@subsection Concatenating using the concat @emph{demuxer}
 | 
			
		||||
 | 
			
		||||
FFmpeg has a @url{http://www.ffmpeg.org/ffmpeg-formats.html#concat,
 | 
			
		||||
@code{concat}} demuxer which you can use when you want to avoid a re-encode and
 | 
			
		||||
your format doesn't support file level concatenation.
 | 
			
		||||
 | 
			
		||||
@subsection Concatenating using the concat @emph{protocol} (file level)
 | 
			
		||||
 | 
			
		||||
FFmpeg has a @url{http://ffmpeg.org/ffmpeg-protocols.html#concat,
 | 
			
		||||
@code{concat}} protocol designed specifically for that, with examples in the
 | 
			
		||||
documentation.
 | 
			
		||||
 | 
			
		||||
A few multimedia containers (MPEG-1, MPEG-2 PS, DV) allow to concatenate
 | 
			
		||||
video by merely concatenating the files containing them.
 | 
			
		||||
A few multimedia containers (MPEG-1, MPEG-2 PS, DV) allow to join video files by
 | 
			
		||||
merely concatenating them.
 | 
			
		||||
 | 
			
		||||
Hence you may concatenate your multimedia files by first transcoding them to
 | 
			
		||||
these privileged formats, then using the humble @code{cat} command (or the
 | 
			
		||||
@@ -307,38 +222,28 @@ equally humble @code{copy} under Windows), and finally transcoding back to your
 | 
			
		||||
format of choice.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
 | 
			
		||||
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
 | 
			
		||||
ffmpeg -i input1.avi -same_quant intermediate1.mpg
 | 
			
		||||
ffmpeg -i input2.avi -same_quant intermediate2.mpg
 | 
			
		||||
cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
 | 
			
		||||
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
 | 
			
		||||
ffmpeg -i intermediate_all.mpg -same_quant output.avi
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Additionally, you can use the @code{concat} protocol instead of @code{cat} or
 | 
			
		||||
@code{copy} which will avoid creation of a potentially huge intermediate file.
 | 
			
		||||
Notice that you should either use @code{-same_quant} or set a reasonably high
 | 
			
		||||
bitrate for your intermediate and output files, if you want to preserve
 | 
			
		||||
video quality.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
 | 
			
		||||
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
 | 
			
		||||
ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg
 | 
			
		||||
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Note that you may need to escape the character "|" which is special for many
 | 
			
		||||
shells.
 | 
			
		||||
 | 
			
		||||
Another option is usage of named pipes, should your platform support it:
 | 
			
		||||
Also notice that you may avoid the huge intermediate files by taking advantage
 | 
			
		||||
of named pipes, should your platform support it:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
mkfifo intermediate1.mpg
 | 
			
		||||
mkfifo intermediate2.mpg
 | 
			
		||||
ffmpeg -i input1.avi -qscale:v 1 -y intermediate1.mpg < /dev/null &
 | 
			
		||||
ffmpeg -i input2.avi -qscale:v 1 -y intermediate2.mpg < /dev/null &
 | 
			
		||||
ffmpeg -i input1.avi -same_quant -y intermediate1.mpg < /dev/null &
 | 
			
		||||
ffmpeg -i input2.avi -same_quant -y intermediate2.mpg < /dev/null &
 | 
			
		||||
cat intermediate1.mpg intermediate2.mpg |\
 | 
			
		||||
ffmpeg -f mpeg -i - -c:v mpeg4 -acodec libmp3lame output.avi
 | 
			
		||||
ffmpeg -f mpeg -i - -same_quant -c:v mpeg4 -acodec libmp3lame output.avi
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@subsection Concatenating using raw audio and video
 | 
			
		||||
 | 
			
		||||
Similarly, the yuv4mpegpipe format, and the raw video, raw audio codecs also
 | 
			
		||||
allow concatenation, and the transcoding step is almost lossless.
 | 
			
		||||
When using multiple yuv4mpegpipe(s), the first line needs to be discarded
 | 
			
		||||
@@ -346,8 +251,7 @@ from all but the first stream. This can be accomplished by piping through
 | 
			
		||||
@code{tail} as seen below. Note that when piping through @code{tail} you
 | 
			
		||||
must use command grouping, @code{@{  ;@}}, to background properly.
 | 
			
		||||
 | 
			
		||||
For example, let's say we want to concatenate two FLV files into an
 | 
			
		||||
output.flv file:
 | 
			
		||||
For example, let's say we want to join two FLV files into an output.flv file:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
mkfifo temp1.a
 | 
			
		||||
@@ -364,7 +268,7 @@ cat temp1.a temp2.a > all.a &
 | 
			
		||||
cat temp1.v temp2.v > all.v &
 | 
			
		||||
ffmpeg -f u16le -acodec pcm_s16le -ac 2 -ar 44100 -i all.a \
 | 
			
		||||
       -f yuv4mpegpipe -i all.v \
 | 
			
		||||
       -y output.flv
 | 
			
		||||
       -same_quant -y output.flv
 | 
			
		||||
rm temp[12].[av] all.[av]
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@@ -393,61 +297,24 @@ Appending @code{:v} to it will do exactly that.
 | 
			
		||||
Use @option{-dumpgraph -} to find out exactly where the channel layout is
 | 
			
		||||
lost.
 | 
			
		||||
 | 
			
		||||
Most likely, it is through @code{auto-inserted aresample}. Try to understand
 | 
			
		||||
Most likely, it is through @code{auto-inserted aconvert}. Try to understand
 | 
			
		||||
why the converting filter was needed at that place.
 | 
			
		||||
 | 
			
		||||
Just before the output is a likely place, as @option{-f lavfi} currently
 | 
			
		||||
only support packed S16.
 | 
			
		||||
 | 
			
		||||
Then insert the correct @code{aformat} explicitly in the filtergraph,
 | 
			
		||||
Then insert the correct @code{aconvert} explicitly in the filter graph,
 | 
			
		||||
specifying the exact format.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
aformat=sample_fmts=s16:channel_layouts=stereo
 | 
			
		||||
aconvert=s16:stereo:packed
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section Why does FFmpeg not see the subtitles in my VOB file?
 | 
			
		||||
 | 
			
		||||
VOB and a few other formats do not have a global header that describes
 | 
			
		||||
everything present in the file. Instead, applications are supposed to scan
 | 
			
		||||
the file to see what it contains. Since VOB files are frequently large, only
 | 
			
		||||
the beginning is scanned. If the subtitles happen only later in the file,
 | 
			
		||||
they will not be initally detected.
 | 
			
		||||
 | 
			
		||||
Some applications, including the @code{ffmpeg} command-line tool, can only
 | 
			
		||||
work with streams that were detected during the initial scan; streams that
 | 
			
		||||
are detected later are ignored.
 | 
			
		||||
 | 
			
		||||
The size of the initial scan is controlled by two options: @code{probesize}
 | 
			
		||||
(default ~5 Mo) and @code{analyzeduration} (default 5,000,000 µs = 5 s). For
 | 
			
		||||
the subtitle stream to be detected, both values must be large enough.
 | 
			
		||||
 | 
			
		||||
@section Why was the @command{ffmpeg} @option{-sameq} option removed? What to use instead?
 | 
			
		||||
 | 
			
		||||
The @option{-sameq} option meant "same quantizer", and made sense only in a
 | 
			
		||||
very limited set of cases. Unfortunately, a lot of people mistook it for
 | 
			
		||||
"same quality" and used it in places where it did not make sense: it had
 | 
			
		||||
roughly the expected visible effect, but achieved it in a very inefficient
 | 
			
		||||
way.
 | 
			
		||||
 | 
			
		||||
Each encoder has its own set of options to set the quality-vs-size balance,
 | 
			
		||||
use the options for the encoder you are using to set the quality level to a
 | 
			
		||||
point acceptable for your tastes. The most common options to do that are
 | 
			
		||||
@option{-qscale} and @option{-qmax}, but you should peruse the documentation
 | 
			
		||||
of the encoder you chose.
 | 
			
		||||
 | 
			
		||||
@chapter Development
 | 
			
		||||
 | 
			
		||||
@section Are there examples illustrating how to use the FFmpeg libraries, particularly libavcodec and libavformat?
 | 
			
		||||
 | 
			
		||||
Yes. Check the @file{doc/examples} directory in the source
 | 
			
		||||
repository, also available online at:
 | 
			
		||||
@url{https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples}.
 | 
			
		||||
 | 
			
		||||
Examples are also installed by default, usually in
 | 
			
		||||
@code{$PREFIX/share/ffmpeg/examples}.
 | 
			
		||||
 | 
			
		||||
Also you may read the Developers Guide of the FFmpeg documentation. Alternatively,
 | 
			
		||||
Yes. Read the Developers Guide of the FFmpeg documentation. Alternatively,
 | 
			
		||||
examine the source code for one of the many open source projects that
 | 
			
		||||
already incorporate FFmpeg at (@url{projects.html}).
 | 
			
		||||
 | 
			
		||||
@@ -459,8 +326,31 @@ with @code{#ifdef}s related to the compiler.
 | 
			
		||||
 | 
			
		||||
@section Is Microsoft Visual C++ supported?
 | 
			
		||||
 | 
			
		||||
Yes. Please see the @uref{platform.html, Microsoft Visual C++}
 | 
			
		||||
section in the FFmpeg documentation.
 | 
			
		||||
No. Microsoft Visual C++ is not compliant to the C99 standard and does
 | 
			
		||||
not - among other things - support the inline assembly used in FFmpeg.
 | 
			
		||||
If you wish to use MSVC++ for your
 | 
			
		||||
project then you can link the MSVC++ code with libav* as long as
 | 
			
		||||
you compile the latter with a working C compiler. For more information, see
 | 
			
		||||
the @emph{Microsoft Visual C++ compatibility} section in the FFmpeg
 | 
			
		||||
documentation.
 | 
			
		||||
 | 
			
		||||
There have been efforts to make FFmpeg compatible with MSVC++ in the
 | 
			
		||||
past. However, they have all been rejected as too intrusive, especially
 | 
			
		||||
since MinGW does the job adequately. None of the core developers
 | 
			
		||||
work with MSVC++ and thus this item is low priority. Should you find
 | 
			
		||||
the silver bullet that solves this problem, feel free to shoot it at us.
 | 
			
		||||
 | 
			
		||||
We strongly recommend you to move over from MSVC++ to MinGW tools.
 | 
			
		||||
 | 
			
		||||
@section Can I use FFmpeg or libavcodec under Windows?
 | 
			
		||||
 | 
			
		||||
Yes, but the Cygwin or MinGW tools @emph{must} be used to compile FFmpeg.
 | 
			
		||||
Read the @emph{Windows} section in the FFmpeg documentation to find more
 | 
			
		||||
information.
 | 
			
		||||
 | 
			
		||||
To get help and instructions for building FFmpeg under Windows, check out
 | 
			
		||||
the FFmpeg Windows Help Forum at
 | 
			
		||||
@url{http://ffmpeg.arrozcru.org/}.
 | 
			
		||||
 | 
			
		||||
@section Can you add automake, libtool or autoconf support?
 | 
			
		||||
 | 
			
		||||
@@ -475,10 +365,9 @@ read @uref{http://www.tux.org/lkml/#s15, "Programming Religion"}.
 | 
			
		||||
 | 
			
		||||
@section Why are the ffmpeg programs devoid of debugging symbols?
 | 
			
		||||
 | 
			
		||||
The build process creates @command{ffmpeg_g}, @command{ffplay_g}, etc. which
 | 
			
		||||
contain full debug information. Those binaries are stripped to create
 | 
			
		||||
@command{ffmpeg}, @command{ffplay}, etc. If you need the debug information, use
 | 
			
		||||
the *_g versions.
 | 
			
		||||
The build process creates ffmpeg_g, ffplay_g, etc. which contain full debug
 | 
			
		||||
information. Those binaries are stripped to create ffmpeg, ffplay, etc. If
 | 
			
		||||
you need the debug information, use the *_g versions.
 | 
			
		||||
 | 
			
		||||
@section I do not like the LGPL, can I contribute code under the GPL instead?
 | 
			
		||||
 | 
			
		||||
@@ -486,24 +375,6 @@ Yes, as long as the code is optional and can easily and cleanly be placed
 | 
			
		||||
under #if CONFIG_GPL without breaking anything. So, for example, a new codec
 | 
			
		||||
or filter would be OK under GPL while a bug fix to LGPL code would not.
 | 
			
		||||
 | 
			
		||||
@section I'm using FFmpeg from within my C application but the linker complains about missing symbols from the libraries themselves.
 | 
			
		||||
 | 
			
		||||
FFmpeg builds static libraries by default. In static libraries, dependencies
 | 
			
		||||
are not handled. That has two consequences. First, you must specify the
 | 
			
		||||
libraries in dependency order: @code{-lavdevice} must come before
 | 
			
		||||
@code{-lavformat}, @code{-lavutil} must come after everything else, etc.
 | 
			
		||||
Second, external libraries that are used in FFmpeg have to be specified too.
 | 
			
		||||
 | 
			
		||||
An easy way to get the full list of required libraries in dependency order
 | 
			
		||||
is to use @code{pkg-config}.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
c99 -o program program.c $(pkg-config --cflags --libs libavformat libavcodec)
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
See @file{doc/example/Makefile} and @file{doc/example/pc-uninstalled} for
 | 
			
		||||
more details.
 | 
			
		||||
 | 
			
		||||
@section I'm using FFmpeg from within my C++ application but the linker complains about missing symbols which seem to be available.
 | 
			
		||||
 | 
			
		||||
FFmpeg is a pure C project, so to use the libraries within your C++ application
 | 
			
		||||
@@ -519,8 +390,12 @@ to use them you have to append -D__STDC_CONSTANT_MACROS to your CXXFLAGS
 | 
			
		||||
 | 
			
		||||
@section I have a file in memory / a API different from *open/*read/ libc how do I use it with libavformat?
 | 
			
		||||
 | 
			
		||||
You have to create a custom AVIOContext using @code{avio_alloc_context},
 | 
			
		||||
see @file{libavformat/aviobuf.c} in FFmpeg and @file{libmpdemux/demux_lavf.c} in MPlayer or MPlayer2 sources.
 | 
			
		||||
You have to implement a URLProtocol, see @file{libavformat/file.c} in
 | 
			
		||||
FFmpeg and @file{libmpdemux/demux_lavf.c} in MPlayer sources.
 | 
			
		||||
 | 
			
		||||
@section Where can I find libav* headers for Pascal/Delphi?
 | 
			
		||||
 | 
			
		||||
see @url{http://www.iversenit.dk/dev/ffmpeg-headers/}
 | 
			
		||||
 | 
			
		||||
@section Where is the documentation about ffv1, msmpeg4, asv1, 4xm?
 | 
			
		||||
 | 
			
		||||
@@ -534,12 +409,11 @@ In this specific case please look at RFC 4629 to see how it should be done.
 | 
			
		||||
 | 
			
		||||
@section AVStream.r_frame_rate is wrong, it is much larger than the frame rate.
 | 
			
		||||
 | 
			
		||||
@code{r_frame_rate} is NOT the average frame rate, it is the smallest frame rate
 | 
			
		||||
r_frame_rate is NOT the average frame rate, it is the smallest frame rate
 | 
			
		||||
that can accurately represent all timestamps. So no, it is not
 | 
			
		||||
wrong if it is larger than the average!
 | 
			
		||||
For example, if you have mixed 25 and 30 fps content, then @code{r_frame_rate}
 | 
			
		||||
will be 150 (it is the least common multiple).
 | 
			
		||||
If you are looking for the average frame rate, see @code{AVStream.avg_frame_rate}.
 | 
			
		||||
For example, if you have mixed 25 and 30 fps content, then r_frame_rate
 | 
			
		||||
will be 150.
 | 
			
		||||
 | 
			
		||||
@section Why is @code{make fate} not running all tests?
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle FFmpeg Automated Testing Environment
 | 
			
		||||
@settitle FATE Automated Testing Environment
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{FFmpeg Automated Testing Environment}
 | 
			
		||||
@center @titlefont{FATE Automated Testing Environment}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@node Top
 | 
			
		||||
@@ -27,7 +27,7 @@ by visiting this website:
 | 
			
		||||
 | 
			
		||||
  This is especially recommended for all people contributing source
 | 
			
		||||
code to FFmpeg, as it can be seen if some test on some platform broke
 | 
			
		||||
with their recent contribution. This usually happens on the platforms
 | 
			
		||||
with there recent contribution. This usually happens on the platforms
 | 
			
		||||
the developers could not test on.
 | 
			
		||||
 | 
			
		||||
  The second part of this document describes how you can run FATE to
 | 
			
		||||
@@ -78,14 +78,11 @@ Do not put a '~' character in the samples path to indicate a home
 | 
			
		||||
directory. Because of shell nuances, this will cause FATE to fail.
 | 
			
		||||
@end float
 | 
			
		||||
 | 
			
		||||
To use a custom wrapper to run the test, pass @option{--target-exec} to
 | 
			
		||||
@command{configure} or set the @var{TARGET_EXEC} Make variable.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@chapter Submitting the results to the FFmpeg result aggregation server
 | 
			
		||||
 | 
			
		||||
  To submit your results to the server you should run fate through the
 | 
			
		||||
shell script @file{tests/fate.sh} from the FFmpeg sources. This script needs
 | 
			
		||||
shell script tests/fate.sh from the FFmpeg sources. This script needs
 | 
			
		||||
to be invoked with a configuration file as its first argument.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
@@ -93,11 +90,11 @@ tests/fate.sh /path/to/fate_config
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
  A configuration file template with comments describing the individual
 | 
			
		||||
configuration variables can be found at @file{doc/fate_config.sh.template}.
 | 
			
		||||
configuration variables can be found at @file{tests/fate_config.sh.template}.
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
  The mentioned configuration template is also available here:
 | 
			
		||||
@verbatiminclude fate_config.sh.template
 | 
			
		||||
@verbatiminclude ../tests/fate_config.sh.template
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
  Create a configuration that suits your needs, based on the configuration
 | 
			
		||||
@@ -121,9 +118,8 @@ present in $workdir as specified in the configuration file:
 | 
			
		||||
    @item version
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
  When you have everything working properly you can create an SSH key pair
 | 
			
		||||
and send the public key to the FATE server administrator who can be contacted
 | 
			
		||||
at the email address @email{fate-admin@@ffmpeg.org}.
 | 
			
		||||
  When you have everything working properly you can create an SSH key and
 | 
			
		||||
send its public part to the FATE server administrator.
 | 
			
		||||
 | 
			
		||||
  Configure your SSH client to use public key authentication with that key
 | 
			
		||||
when connecting to the FATE server. Also do not forget to check the identity
 | 
			
		||||
@@ -131,17 +127,7 @@ of the server and to accept its host key. This can usually be achieved by
 | 
			
		||||
running your SSH client manually and killing it after you accepted the key.
 | 
			
		||||
The FATE server's fingerprint is:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item RSA
 | 
			
		||||
   d3:f1:83:97:a4:75:2b:a6:fb:d6:e8:aa:81:93:97:51
 | 
			
		||||
@item ECDSA
 | 
			
		||||
   76:9f:68:32:04:1e:d5:d4:ec:47:3f:dc:fc:18:17:86
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
  If you have problems connecting to the FATE server, it may help to try out
 | 
			
		||||
the @command{ssh} command with one or more @option{-v} options. You should
 | 
			
		||||
get detailed output concerning your SSH configuration and the authentication
 | 
			
		||||
process.
 | 
			
		||||
  b1:31:c8:79:3f:04:1d:f8:f2:23:26:5a:fd:55:fa:92
 | 
			
		||||
 | 
			
		||||
  The only thing left is to automate the execution of the fate.sh script and
 | 
			
		||||
the synchronisation of the samples directory.
 | 
			
		||||
@@ -153,20 +139,20 @@ the synchronisation of the samples directory.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item fate-rsync
 | 
			
		||||
Download/synchronize sample files to the configured samples directory.
 | 
			
		||||
    Download/synchronize sample files to the configured samples directory.
 | 
			
		||||
 | 
			
		||||
@item fate-list
 | 
			
		||||
Will list all fate/regression test targets.
 | 
			
		||||
    Will list all fate/regression test targets.
 | 
			
		||||
 | 
			
		||||
@item fate
 | 
			
		||||
Run the FATE test suite (requires the fate-suite dataset).
 | 
			
		||||
    Run the FATE test suite (requires the fate-suite dataset).
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section Makefile variables
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item V
 | 
			
		||||
Verbosity level, can be set to 0, 1 or 2.
 | 
			
		||||
    Verbosity level, can be set to 0, 1 or 2.
 | 
			
		||||
    @itemize
 | 
			
		||||
        @item 0: show just the test arguments
 | 
			
		||||
        @item 1: show just the command used in the test
 | 
			
		||||
@@ -174,32 +160,17 @@ Verbosity level, can be set to 0, 1 or 2.
 | 
			
		||||
    @end itemize
 | 
			
		||||
 | 
			
		||||
@item SAMPLES
 | 
			
		||||
Specify or override the path to the FATE samples at make time, it has a
 | 
			
		||||
meaning only while running the regression tests.
 | 
			
		||||
    Specify or override the path to the FATE samples at make time, it has a
 | 
			
		||||
    meaning only while running the regression tests.
 | 
			
		||||
 | 
			
		||||
@item THREADS
 | 
			
		||||
Specify how many threads to use while running regression tests, it is
 | 
			
		||||
quite useful to detect thread-related regressions.
 | 
			
		||||
 | 
			
		||||
@item THREAD_TYPE
 | 
			
		||||
Specify which threading strategy test, either @var{slice} or @var{frame},
 | 
			
		||||
by default @var{slice+frame}
 | 
			
		||||
 | 
			
		||||
    Specify how many threads to use while running regression tests, it is
 | 
			
		||||
    quite useful to detect thread-related regressions.
 | 
			
		||||
@item CPUFLAGS
 | 
			
		||||
Specify CPU flags.
 | 
			
		||||
 | 
			
		||||
@item TARGET_EXEC
 | 
			
		||||
Specify or override the wrapper used to run the tests.
 | 
			
		||||
The @var{TARGET_EXEC} option provides a way to run FATE wrapped in
 | 
			
		||||
@command{valgrind}, @command{qemu-user} or @command{wine} or on remote targets
 | 
			
		||||
through @command{ssh}.
 | 
			
		||||
 | 
			
		||||
@item GEN
 | 
			
		||||
Set to @var{1} to generate the missing or mismatched references.
 | 
			
		||||
    Specify CPU flags.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section Examples
 | 
			
		||||
 | 
			
		||||
Example:
 | 
			
		||||
@example
 | 
			
		||||
make V=1 SAMPLES=/var/fate/samples THREADS=2 CPUFLAGS=mmx fate
 | 
			
		||||
@end example
 | 
			
		||||
 
 | 
			
		||||
@@ -1,45 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle FFmpeg Bitstream Filters Documentation
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{FFmpeg Bitstream Filters Documentation}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This document describes the bitstream filters provided by the
 | 
			
		||||
libavcodec library.
 | 
			
		||||
 | 
			
		||||
A bitstream filter operates on the encoded stream data, and performs
 | 
			
		||||
bitstream level modifications without performing decoding.
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@include bitstream_filters.texi
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{libavcodec.html,libavcodec}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavcodec(3)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename ffmpeg-bitstream-filters
 | 
			
		||||
@settitle FFmpeg bitstream filters
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
@@ -1,42 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle FFmpeg Codecs Documentation
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{FFmpeg Codecs Documentation}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This document describes the codecs (decoders and encoders) provided by
 | 
			
		||||
the libavcodec library.
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@include codecs.texi
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{libavcodec.html,libavcodec}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavcodec(3)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename ffmpeg-codecs
 | 
			
		||||
@settitle FFmpeg codecs
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
@@ -1,42 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle FFmpeg Devices Documentation
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{FFmpeg Devices Documentation}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This document describes the input and output devices provided by the
 | 
			
		||||
libavdevice library.
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@include devices.texi
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{libavdevice.html,libavdevice}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavdevice(3)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename ffmpeg-devices
 | 
			
		||||
@settitle FFmpeg devices
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
@@ -1,42 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle FFmpeg Filters Documentation
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{FFmpeg Filters Documentation}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This document describes filters, sources, and sinks provided by the
 | 
			
		||||
libavfilter library.
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@include filters.texi
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{libavfilter.html,libavfilter}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavfilter(3)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename ffmpeg-filters
 | 
			
		||||
@settitle FFmpeg filters
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
@@ -1,42 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle FFmpeg Formats Documentation
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{FFmpeg Formats Documentation}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This document describes the supported formats (muxers and demuxers)
 | 
			
		||||
provided by the libavformat library.
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@include formats.texi
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{libavformat.html,libavformat}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavformat(3)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename ffmpeg-formats
 | 
			
		||||
@settitle FFmpeg formats
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
@@ -1,42 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle FFmpeg Protocols Documentation
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{FFmpeg Protocols Documentation}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This document describes the input and output protocols provided by the
 | 
			
		||||
libavformat library.
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@include protocols.texi
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{libavformat.html,libavformat}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavformat(3)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename ffmpeg-protocols
 | 
			
		||||
@settitle FFmpeg protocols
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
@@ -1,44 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle FFmpeg Resampler Documentation
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{FFmpeg Resampler Documentation}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
The FFmpeg resampler provides a high-level interface to the
 | 
			
		||||
libswresample library audio resampling utilities. In particular it
 | 
			
		||||
allows to perform audio resampling, audio channel layout rematrixing,
 | 
			
		||||
and convert audio format and packing layout.
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@include resampler.texi
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{libswresample.html,libswresample}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libswresample(3)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename ffmpeg-resampler
 | 
			
		||||
@settitle FFmpeg Resampler
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
@@ -1,43 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle FFmpeg Scaler Documentation
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{FFmpeg Scaler Documentation}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
The FFmpeg rescaler provides a high-level interface to the libswscale
 | 
			
		||||
library image conversion utilities. In particular it allows to perform
 | 
			
		||||
image rescaling and pixel format conversion.
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@include scaler.texi
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{libswscale.html,libswscale}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libswscale(3)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename ffmpeg-scaler
 | 
			
		||||
@settitle FFmpeg video scaling and pixel format converter
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
@@ -1,42 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle FFmpeg Utilities Documentation
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{FFmpeg Utilities Documentation}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This document describes some generic features and utilities provided
 | 
			
		||||
by the libavutil library.
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@include utils.texi
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{libavutil.html,libavutil}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavutil(3)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename ffmpeg-utils
 | 
			
		||||
@settitle FFmpeg utilities
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
							
								
								
									
										631
									
								
								doc/ffmpeg.texi
									
									
									
									
									
								
							
							
						
						
									
										631
									
								
								doc/ffmpeg.texi
									
									
									
									
									
								
							@@ -11,31 +11,37 @@
 | 
			
		||||
 | 
			
		||||
@chapter Synopsis
 | 
			
		||||
 | 
			
		||||
ffmpeg [@var{global_options}] @{[@var{input_file_options}] -i @file{input_file}@} ... @{[@var{output_file_options}] @file{output_file}@} ...
 | 
			
		||||
The generic syntax is:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
@c man begin SYNOPSIS
 | 
			
		||||
ffmpeg [global options] [[infile options][@option{-i} @var{infile}]]... @{[outfile options] @var{outfile}@}...
 | 
			
		||||
@c man end
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@command{ffmpeg} is a very fast video and audio converter that can also grab from
 | 
			
		||||
ffmpeg is a very fast video and audio converter that can also grab from
 | 
			
		||||
a live audio/video source. It can also convert between arbitrary sample
 | 
			
		||||
rates and resize video on the fly with a high quality polyphase filter.
 | 
			
		||||
 | 
			
		||||
@command{ffmpeg} reads from an arbitrary number of input "files" (which can be regular
 | 
			
		||||
ffmpeg reads from an arbitrary number of input "files" (which can be regular
 | 
			
		||||
files, pipes, network streams, grabbing devices, etc.), specified by the
 | 
			
		||||
@code{-i} option, and writes to an arbitrary number of output "files", which are
 | 
			
		||||
specified by a plain output filename. Anything found on the command line which
 | 
			
		||||
cannot be interpreted as an option is considered to be an output filename.
 | 
			
		||||
 | 
			
		||||
Each input or output file can, in principle, contain any number of streams of
 | 
			
		||||
different types (video/audio/subtitle/attachment/data). The allowed number and/or
 | 
			
		||||
types of streams may be limited by the container format. Selecting which
 | 
			
		||||
streams from which inputs will go into which output is either done automatically
 | 
			
		||||
or with the @code{-map} option (see the Stream selection chapter).
 | 
			
		||||
Each input or output file can in principle contain any number of streams of
 | 
			
		||||
different types (video/audio/subtitle/attachment/data). Allowed number and/or
 | 
			
		||||
types of streams can be limited by the container format. Selecting, which
 | 
			
		||||
streams from which inputs go into output, is done either automatically or with
 | 
			
		||||
the @code{-map} option (see the Stream selection chapter).
 | 
			
		||||
 | 
			
		||||
To refer to input files in options, you must use their indices (0-based). E.g.
 | 
			
		||||
the first input file is @code{0}, the second is @code{1}, etc. Similarly, streams
 | 
			
		||||
the first input file is @code{0}, the second is @code{1} etc. Similarly, streams
 | 
			
		||||
within a file are referred to by their indices. E.g. @code{2:3} refers to the
 | 
			
		||||
fourth stream in the third input file. Also see the Stream specifiers chapter.
 | 
			
		||||
fourth stream in the third input file. See also the Stream specifiers chapter.
 | 
			
		||||
 | 
			
		||||
As a general rule, options are applied to the next specified
 | 
			
		||||
file. Therefore, order is important, and you can have the same
 | 
			
		||||
@@ -50,9 +56,9 @@ options apply ONLY to the next input or output file and are reset between files.
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
@item
 | 
			
		||||
To set the video bitrate of the output file to 64 kbit/s:
 | 
			
		||||
To set the video bitrate of the output file to 64kbit/s:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
 | 
			
		||||
ffmpeg -i input.avi -b:v 64k output.avi
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
@@ -73,139 +79,17 @@ The format option may be needed for raw input files.
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@chapter Detailed description
 | 
			
		||||
@c man begin DETAILED DESCRIPTION
 | 
			
		||||
 | 
			
		||||
The transcoding process in @command{ffmpeg} for each output can be described by
 | 
			
		||||
the following diagram:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
 _______              ______________               _________              ______________            ________
 | 
			
		||||
|       |            |              |             |         |            |              |          |        |
 | 
			
		||||
| input |  demuxer   | encoded data |   decoder   | decoded |  encoder   | encoded data |  muxer   | output |
 | 
			
		||||
| file  | ---------> | packets      |  ---------> | frames  | ---------> | packets      | -------> | file   |
 | 
			
		||||
|_______|            |______________|             |_________|            |______________|          |________|
 | 
			
		||||
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@command{ffmpeg} calls the libavformat library (containing demuxers) to read
 | 
			
		||||
input files and get packets containing encoded data from them. When there are
 | 
			
		||||
multiple input files, @command{ffmpeg} tries to keep them synchronized by
 | 
			
		||||
tracking lowest timestamp on any active input stream.
 | 
			
		||||
 | 
			
		||||
Encoded packets are then passed to the decoder (unless streamcopy is selected
 | 
			
		||||
for the stream, see further for a description). The decoder produces
 | 
			
		||||
uncompressed frames (raw video/PCM audio/...) which can be processed further by
 | 
			
		||||
filtering (see next section). After filtering, the frames are passed to the
 | 
			
		||||
encoder, which encodes them and outputs encoded packets. Finally those are
 | 
			
		||||
passed to the muxer, which writes the encoded packets to the output file.
 | 
			
		||||
 | 
			
		||||
@section Filtering
 | 
			
		||||
Before encoding, @command{ffmpeg} can process raw audio and video frames using
 | 
			
		||||
filters from the libavfilter library. Several chained filters form a filter
 | 
			
		||||
graph. @command{ffmpeg} distinguishes between two types of filtergraphs:
 | 
			
		||||
simple and complex.
 | 
			
		||||
 | 
			
		||||
@subsection Simple filtergraphs
 | 
			
		||||
Simple filtergraphs are those that have exactly one input and output, both of
 | 
			
		||||
the same type. In the above diagram they can be represented by simply inserting
 | 
			
		||||
an additional step between decoding and encoding:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
 _________                        __________              ______________
 | 
			
		||||
|         |                      |          |            |              |
 | 
			
		||||
| decoded |  simple filtergraph  | filtered |  encoder   | encoded data |
 | 
			
		||||
| frames  | -------------------> | frames   | ---------> | packets      |
 | 
			
		||||
|_________|                      |__________|            |______________|
 | 
			
		||||
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Simple filtergraphs are configured with the per-stream @option{-filter} option
 | 
			
		||||
(with @option{-vf} and @option{-af} aliases for video and audio respectively).
 | 
			
		||||
A simple filtergraph for video can look for example like this:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
 _______        _____________        _______        _____        ________
 | 
			
		||||
|       |      |             |      |       |      |     |      |        |
 | 
			
		||||
| input | ---> | deinterlace | ---> | scale | ---> | fps | ---> | output |
 | 
			
		||||
|_______|      |_____________|      |_______|      |_____|      |________|
 | 
			
		||||
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Note that some filters change frame properties but not frame contents. E.g. the
 | 
			
		||||
@code{fps} filter in the example above changes number of frames, but does not
 | 
			
		||||
touch the frame contents. Another example is the @code{setpts} filter, which
 | 
			
		||||
only sets timestamps and otherwise passes the frames unchanged.
 | 
			
		||||
 | 
			
		||||
@subsection Complex filtergraphs
 | 
			
		||||
Complex filtergraphs are those which cannot be described as simply a linear
 | 
			
		||||
processing chain applied to one stream. This is the case, for example, when the graph has
 | 
			
		||||
more than one input and/or output, or when output stream type is different from
 | 
			
		||||
input. They can be represented with the following diagram:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
 _________
 | 
			
		||||
|         |
 | 
			
		||||
| input 0 |\                    __________
 | 
			
		||||
|_________| \                  |          |
 | 
			
		||||
             \   _________    /| output 0 |
 | 
			
		||||
              \ |         |  / |__________|
 | 
			
		||||
 _________     \| complex | /
 | 
			
		||||
|         |     |         |/
 | 
			
		||||
| input 1 |---->| filter  |\
 | 
			
		||||
|_________|     |         | \   __________
 | 
			
		||||
               /| graph   |  \ |          |
 | 
			
		||||
              / |         |   \| output 1 |
 | 
			
		||||
 _________   /  |_________|    |__________|
 | 
			
		||||
|         | /
 | 
			
		||||
| input 2 |/
 | 
			
		||||
|_________|
 | 
			
		||||
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Complex filtergraphs are configured with the @option{-filter_complex} option.
 | 
			
		||||
Note that this option is global, since a complex filtergraph, by its nature,
 | 
			
		||||
cannot be unambiguously associated with a single stream or file.
 | 
			
		||||
 | 
			
		||||
The @option{-lavfi} option is equivalent to @option{-filter_complex}.
 | 
			
		||||
 | 
			
		||||
A trivial example of a complex filtergraph is the @code{overlay} filter, which
 | 
			
		||||
has two video inputs and one video output, containing one video overlaid on top
 | 
			
		||||
of the other. Its audio counterpart is the @code{amix} filter.
 | 
			
		||||
 | 
			
		||||
@section Stream copy
 | 
			
		||||
Stream copy is a mode selected by supplying the @code{copy} parameter to the
 | 
			
		||||
@option{-codec} option. It makes @command{ffmpeg} omit the decoding and encoding
 | 
			
		||||
step for the specified stream, so it does only demuxing and muxing. It is useful
 | 
			
		||||
for changing the container format or modifying container-level metadata. The
 | 
			
		||||
diagram above will, in this case, simplify to this:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
 _______              ______________            ________
 | 
			
		||||
|       |            |              |          |        |
 | 
			
		||||
| input |  demuxer   | encoded data |  muxer   | output |
 | 
			
		||||
| file  | ---------> | packets      | -------> | file   |
 | 
			
		||||
|_______|            |______________|          |________|
 | 
			
		||||
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Since there is no decoding or encoding, it is very fast and there is no quality
 | 
			
		||||
loss. However, it might not work in some cases because of many factors. Applying
 | 
			
		||||
filters is obviously also impossible, since filters work on uncompressed data.
 | 
			
		||||
 | 
			
		||||
@c man end DETAILED DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@chapter Stream selection
 | 
			
		||||
@c man begin STREAM SELECTION
 | 
			
		||||
 | 
			
		||||
By default, @command{ffmpeg} includes only one stream of each type (video, audio, subtitle)
 | 
			
		||||
By default ffmpeg includes only one stream of each type (video, audio, subtitle)
 | 
			
		||||
present in the input files and adds them to each output file.  It picks the
 | 
			
		||||
"best" of each based upon the following criteria: for video, it is the stream
 | 
			
		||||
with the highest resolution, for audio, it is the stream with the most channels, for
 | 
			
		||||
subtitles, it is the first subtitle stream. In the case where several streams of
 | 
			
		||||
the same type rate equally, the stream with the lowest index is chosen.
 | 
			
		||||
"best" of each based upon the following criteria; for video it is the stream
 | 
			
		||||
with the highest resolution, for audio the stream with the most channels, for
 | 
			
		||||
subtitle it's the first subtitle stream. In the case where several streams of
 | 
			
		||||
the same type rate equally, the lowest numbered stream is chosen.
 | 
			
		||||
 | 
			
		||||
You can disable some of those defaults by using the @code{-vn/-an/-sn} options. For
 | 
			
		||||
You can disable some of those defaults by using @code{-vn/-an/-sn} options. For
 | 
			
		||||
full manual control, use the @code{-map} option, which disables the defaults just
 | 
			
		||||
described.
 | 
			
		||||
 | 
			
		||||
@@ -214,7 +98,7 @@ described.
 | 
			
		||||
@chapter Options
 | 
			
		||||
@c man begin OPTIONS
 | 
			
		||||
 | 
			
		||||
@include fftools-common-opts.texi
 | 
			
		||||
@include avtools-common-opts.texi
 | 
			
		||||
 | 
			
		||||
@section Main options
 | 
			
		||||
 | 
			
		||||
@@ -222,7 +106,7 @@ described.
 | 
			
		||||
 | 
			
		||||
@item -f @var{fmt} (@emph{input/output})
 | 
			
		||||
Force input or output file format. The format is normally auto detected for input
 | 
			
		||||
files and guessed from the file extension for output files, so this option is not
 | 
			
		||||
files and guessed from file extension for output files, so this option is not
 | 
			
		||||
needed in most cases.
 | 
			
		||||
 | 
			
		||||
@item -i @var{filename} (@emph{input})
 | 
			
		||||
@@ -232,8 +116,7 @@ input file name
 | 
			
		||||
Overwrite output files without asking.
 | 
			
		||||
 | 
			
		||||
@item -n (@emph{global})
 | 
			
		||||
Do not overwrite output files, and exit immediately if a specified
 | 
			
		||||
output file already exists.
 | 
			
		||||
Do not overwrite output files but exit if file exists.
 | 
			
		||||
 | 
			
		||||
@item -c[:@var{stream_specifier}] @var{codec} (@emph{input/output,per-stream})
 | 
			
		||||
@itemx -codec[:@var{stream_specifier}] @var{codec} (@emph{input/output,per-stream})
 | 
			
		||||
@@ -259,28 +142,14 @@ libx264, and the 138th audio, which will be encoded with libvorbis.
 | 
			
		||||
Stop writing the output after its duration reaches @var{duration}.
 | 
			
		||||
@var{duration} may be a number in seconds, or in @code{hh:mm:ss[.xxx]} form.
 | 
			
		||||
 | 
			
		||||
-to and -t are mutually exclusive and -t has priority.
 | 
			
		||||
 | 
			
		||||
@item -to @var{position} (@emph{output})
 | 
			
		||||
Stop writing the output at @var{position}.
 | 
			
		||||
@var{position} may be a number in seconds, or in @code{hh:mm:ss[.xxx]} form.
 | 
			
		||||
 | 
			
		||||
-to and -t are mutually exclusive and -t has priority.
 | 
			
		||||
 | 
			
		||||
@item -fs @var{limit_size} (@emph{output})
 | 
			
		||||
Set the file size limit, expressed in bytes.
 | 
			
		||||
 | 
			
		||||
@item -ss @var{position} (@emph{input/output})
 | 
			
		||||
When used as an input option (before @code{-i}), seeks in this input file to
 | 
			
		||||
@var{position}. Note the in most formats it is not possible to seek exactly, so
 | 
			
		||||
@command{ffmpeg} will seek to the closest seek point before @var{position}.
 | 
			
		||||
When transcoding and @option{-accurate_seek} is enabled (the default), this
 | 
			
		||||
extra segment between the seek point and @var{position} will be decoded and
 | 
			
		||||
discarded. When doing stream copy or when @option{-noaccurate_seek} is used, it
 | 
			
		||||
will be preserved.
 | 
			
		||||
 | 
			
		||||
When used as an output option (before an output filename), decodes but discards
 | 
			
		||||
input until the timestamps reach @var{position}.
 | 
			
		||||
@var{position}. When used as an output option (before an output filename),
 | 
			
		||||
decodes but discards input until the timestamps reach @var{position}. This is
 | 
			
		||||
slower, but more accurate.
 | 
			
		||||
 | 
			
		||||
@var{position} may be either in seconds or in @code{hh:mm:ss[.xxx]} form.
 | 
			
		||||
 | 
			
		||||
@@ -351,50 +220,18 @@ Stop writing to the stream after @var{framecount} frames.
 | 
			
		||||
Use fixed quality scale (VBR). The meaning of @var{q} is
 | 
			
		||||
codec-dependent.
 | 
			
		||||
 | 
			
		||||
@anchor{filter_option}
 | 
			
		||||
@item -filter[:@var{stream_specifier}] @var{filtergraph} (@emph{output,per-stream})
 | 
			
		||||
Create the filtergraph specified by @var{filtergraph} and use it to
 | 
			
		||||
filter the stream.
 | 
			
		||||
 | 
			
		||||
@var{filtergraph} is a description of the filtergraph to apply to
 | 
			
		||||
the stream, and must have a single input and a single output of the
 | 
			
		||||
same type of the stream. In the filtergraph, the input is associated
 | 
			
		||||
to the label @code{in}, and the output to the label @code{out}. See
 | 
			
		||||
the ffmpeg-filters manual for more information about the filtergraph
 | 
			
		||||
syntax.
 | 
			
		||||
 | 
			
		||||
See the @ref{filter_complex_option,,-filter_complex option} if you
 | 
			
		||||
want to create filtergraphs with multiple inputs and/or outputs.
 | 
			
		||||
 | 
			
		||||
@item -filter_script[:@var{stream_specifier}] @var{filename} (@emph{output,per-stream})
 | 
			
		||||
This option is similar to @option{-filter}, the only difference is that its
 | 
			
		||||
argument is the name of the file from which a filtergraph description is to be
 | 
			
		||||
read.
 | 
			
		||||
@item -filter[:@var{stream_specifier}] @var{filter_graph} (@emph{output,per-stream})
 | 
			
		||||
@var{filter_graph} is a description of the filter graph to apply to
 | 
			
		||||
the stream. Use @code{-filters} to show all the available filters
 | 
			
		||||
(including also sources and sinks).
 | 
			
		||||
 | 
			
		||||
See also the @option{-filter_complex} option if you want to create filter graphs
 | 
			
		||||
with multiple inputs and/or outputs.
 | 
			
		||||
@item -pre[:@var{stream_specifier}] @var{preset_name} (@emph{output,per-stream})
 | 
			
		||||
Specify the preset for matching stream(s).
 | 
			
		||||
 | 
			
		||||
@item -stats (@emph{global})
 | 
			
		||||
Print encoding progress/statistics. It is on by default, to explicitly
 | 
			
		||||
disable it you need to specify @code{-nostats}.
 | 
			
		||||
 | 
			
		||||
@item -progress @var{url} (@emph{global})
 | 
			
		||||
Send program-friendly progress information to @var{url}.
 | 
			
		||||
 | 
			
		||||
Progress information is written approximately every second and at the end of
 | 
			
		||||
the encoding process. It is made of "@var{key}=@var{value}" lines. @var{key}
 | 
			
		||||
consists of only alphanumeric characters. The last key of a sequence of
 | 
			
		||||
progress information is always "progress".
 | 
			
		||||
 | 
			
		||||
@item -stdin
 | 
			
		||||
Enable interaction on standard input. On by default unless standard input is
 | 
			
		||||
used as an input. To explicitly disable interaction you need to specify
 | 
			
		||||
@code{-nostdin}.
 | 
			
		||||
 | 
			
		||||
Disabling interaction on standard input is useful, for example, if
 | 
			
		||||
ffmpeg is in the background process group. Roughly the same result can
 | 
			
		||||
be achieved with @code{ffmpeg ... < /dev/null} but it requires a
 | 
			
		||||
shell.
 | 
			
		||||
Print encoding progress/statistics. On by default.
 | 
			
		||||
 | 
			
		||||
@item -debug_ts (@emph{global})
 | 
			
		||||
Print timestamp information. It is off by default. This option is
 | 
			
		||||
@@ -426,11 +263,11 @@ will be used.
 | 
			
		||||
 | 
			
		||||
E.g. to extract the first attachment to a file named 'out.ttf':
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -dump_attachment:t:0 out.ttf -i INPUT
 | 
			
		||||
ffmpeg -dump_attachment:t:0 out.ttf INPUT
 | 
			
		||||
@end example
 | 
			
		||||
To extract all attachments to files determined by the @code{filename} tag:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -dump_attachment:t "" -i INPUT
 | 
			
		||||
ffmpeg -dump_attachment:t "" INPUT
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Technical note -- attachments are implemented as codec extradata, so this
 | 
			
		||||
@@ -445,26 +282,10 @@ attachments.
 | 
			
		||||
@item -vframes @var{number} (@emph{output})
 | 
			
		||||
Set the number of video frames to record. This is an alias for @code{-frames:v}.
 | 
			
		||||
@item -r[:@var{stream_specifier}] @var{fps} (@emph{input/output,per-stream})
 | 
			
		||||
Set frame rate (Hz value, fraction or abbreviation).
 | 
			
		||||
 | 
			
		||||
As an input option, ignore any timestamps stored in the file and instead
 | 
			
		||||
generate timestamps assuming constant frame rate @var{fps}.
 | 
			
		||||
 | 
			
		||||
As an output option, duplicate or drop input frames to achieve constant output
 | 
			
		||||
frame rate @var{fps}.
 | 
			
		||||
 | 
			
		||||
Set frame rate (Hz value, fraction or abbreviation), (default = 25). For output
 | 
			
		||||
streams implies @code{-vsync cfr}.
 | 
			
		||||
@item -s[:@var{stream_specifier}] @var{size} (@emph{input/output,per-stream})
 | 
			
		||||
Set frame size.
 | 
			
		||||
 | 
			
		||||
As an input option, this is a shortcut for the @option{video_size} private
 | 
			
		||||
option, recognized by some demuxers for which the frame size is either not
 | 
			
		||||
stored in the file or is configurable -- e.g. raw video or video grabbers.
 | 
			
		||||
 | 
			
		||||
As an output option, this inserts the @code{scale} video filter to the
 | 
			
		||||
@emph{end} of the corresponding filtergraph. Please use the @code{scale} filter
 | 
			
		||||
directly to insert it at the beginning or some other place.
 | 
			
		||||
 | 
			
		||||
The format is @samp{wxh} (default - same as source).
 | 
			
		||||
Set frame size. The format is @samp{wxh} (default - same as source).
 | 
			
		||||
 | 
			
		||||
@item -aspect[:@var{stream_specifier}] @var{aspect} (@emph{output,per-stream})
 | 
			
		||||
Set the video display aspect ratio specified by @var{aspect}.
 | 
			
		||||
@@ -474,17 +295,33 @@ form @var{num}:@var{den}, where @var{num} and @var{den} are the
 | 
			
		||||
numerator and denominator of the aspect ratio. For example "4:3",
 | 
			
		||||
"16:9", "1.3333", and "1.7777" are valid argument values.
 | 
			
		||||
 | 
			
		||||
If used together with @option{-vcodec copy}, it will affect the aspect ratio
 | 
			
		||||
stored at container level, but not the aspect ratio stored in encoded
 | 
			
		||||
frames, if it exists.
 | 
			
		||||
@item -croptop @var{size}
 | 
			
		||||
@item -cropbottom @var{size}
 | 
			
		||||
@item -cropleft @var{size}
 | 
			
		||||
@item -cropright @var{size}
 | 
			
		||||
All the crop options have been removed. Use -vf
 | 
			
		||||
crop=width:height:x:y instead.
 | 
			
		||||
 | 
			
		||||
@item -padtop @var{size}
 | 
			
		||||
@item -padbottom @var{size}
 | 
			
		||||
@item -padleft @var{size}
 | 
			
		||||
@item -padright @var{size}
 | 
			
		||||
@item -padcolor @var{hex_color}
 | 
			
		||||
All the pad options have been removed. Use -vf
 | 
			
		||||
pad=width:height:x:y:color instead.
 | 
			
		||||
 | 
			
		||||
@item -vn (@emph{output})
 | 
			
		||||
Disable video recording.
 | 
			
		||||
 | 
			
		||||
@item -vcodec @var{codec} (@emph{output})
 | 
			
		||||
Set the video codec. This is an alias for @code{-codec:v}.
 | 
			
		||||
@item -same_quant
 | 
			
		||||
Use same quantizer as source (implies VBR).
 | 
			
		||||
 | 
			
		||||
@item -pass[:@var{stream_specifier}] @var{n} (@emph{output,per-stream})
 | 
			
		||||
Note that this is NOT SAME QUALITY. Do not use this option unless you know you
 | 
			
		||||
need it.
 | 
			
		||||
 | 
			
		||||
@item -pass @var{n}
 | 
			
		||||
Select the pass number (1 or 2). It is used to do two-pass
 | 
			
		||||
video encoding. The statistics of the video are recorded in the first
 | 
			
		||||
pass into a log file (see also the option -passlogfile),
 | 
			
		||||
@@ -497,7 +334,7 @@ ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL
 | 
			
		||||
ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item -passlogfile[:@var{stream_specifier}] @var{prefix} (@emph{output,per-stream})
 | 
			
		||||
@item -passlogfile @var{prefix} (@emph{global})
 | 
			
		||||
Set two-pass log file name prefix to @var{prefix}, the default file name
 | 
			
		||||
prefix is ``ffmpeg2pass''. The complete file name will be
 | 
			
		||||
@file{PREFIX-N.log}, where N is a number specific to the output
 | 
			
		||||
@@ -506,11 +343,12 @@ stream
 | 
			
		||||
@item -vlang @var{code}
 | 
			
		||||
Set the ISO 639 language code (3 letters) of the current video stream.
 | 
			
		||||
 | 
			
		||||
@item -vf @var{filtergraph} (@emph{output})
 | 
			
		||||
Create the filtergraph specified by @var{filtergraph} and use it to
 | 
			
		||||
filter the stream.
 | 
			
		||||
@item -vf @var{filter_graph} (@emph{output})
 | 
			
		||||
@var{filter_graph} is a description of the filter graph to apply to
 | 
			
		||||
the input video.
 | 
			
		||||
Use the option "-filters" to show all the available filters (including
 | 
			
		||||
also sources and sinks).  This is an alias for @code{-filter:v}.
 | 
			
		||||
 | 
			
		||||
This is an alias for @code{-filter:v}, see the @ref{filter_option,,-filter option}.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section Advanced Video Options
 | 
			
		||||
@@ -523,7 +361,7 @@ If the selected pixel format can not be selected, ffmpeg will print a
 | 
			
		||||
warning and select the best pixel format supported by the encoder.
 | 
			
		||||
If @var{pix_fmt} is prefixed by a @code{+}, ffmpeg will exit with an error
 | 
			
		||||
if the requested pixel format can not be selected, and automatic conversions
 | 
			
		||||
inside filtergraphs are disabled.
 | 
			
		||||
inside filter graphs are disabled.
 | 
			
		||||
If @var{pix_fmt} is a single @code{+}, ffmpeg selects the same pixel format
 | 
			
		||||
as the input (or graph output) and automatic conversions are disabled.
 | 
			
		||||
 | 
			
		||||
@@ -538,6 +376,10 @@ list separated with slashes. Two first values are the beginning and
 | 
			
		||||
end frame numbers, last one is quantizer to use if positive, or quality
 | 
			
		||||
factor if negative.
 | 
			
		||||
 | 
			
		||||
@item -deinterlace
 | 
			
		||||
Deinterlace pictures.
 | 
			
		||||
This option is deprecated since the deinterlacing is very low quality.
 | 
			
		||||
Use the yadif filter with @code{-filter:v yadif}.
 | 
			
		||||
@item -ilme
 | 
			
		||||
Force interlacing support in encoder (MPEG-2 and MPEG-4 only).
 | 
			
		||||
Use this option if your input file is interlaced and you want
 | 
			
		||||
@@ -560,58 +402,12 @@ Force video tag/fourcc. This is an alias for @code{-tag:v}.
 | 
			
		||||
Show QP histogram
 | 
			
		||||
@item -vbsf @var{bitstream_filter}
 | 
			
		||||
Deprecated see -bsf
 | 
			
		||||
 | 
			
		||||
@item -force_key_frames[:@var{stream_specifier}] @var{time}[,@var{time}...] (@emph{output,per-stream})
 | 
			
		||||
@item -force_key_frames[:@var{stream_specifier}] expr:@var{expr} (@emph{output,per-stream})
 | 
			
		||||
Force key frames at the specified timestamps, more precisely at the first
 | 
			
		||||
frames after each specified time.
 | 
			
		||||
 | 
			
		||||
If the argument is prefixed with @code{expr:}, the string @var{expr}
 | 
			
		||||
is interpreted like an expression and is evaluated for each frame. A
 | 
			
		||||
key frame is forced in case the evaluation is non-zero.
 | 
			
		||||
 | 
			
		||||
If one of the times is "@code{chapters}[@var{delta}]", it is expanded into
 | 
			
		||||
the time of the beginning of all chapters in the file, shifted by
 | 
			
		||||
@var{delta}, expressed as a time in seconds.
 | 
			
		||||
This option can be useful to ensure that a seek point is present at a
 | 
			
		||||
chapter mark or any other designated place in the output file.
 | 
			
		||||
 | 
			
		||||
For example, to insert a key frame at 5 minutes, plus key frames 0.1 second
 | 
			
		||||
before the beginning of every chapter:
 | 
			
		||||
@example
 | 
			
		||||
-force_key_frames 0:05:00,chapters-0.1
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
The expression in @var{expr} can contain the following constants:
 | 
			
		||||
@table @option
 | 
			
		||||
@item n
 | 
			
		||||
the number of current processed frame, starting from 0
 | 
			
		||||
@item n_forced
 | 
			
		||||
the number of forced frames
 | 
			
		||||
@item prev_forced_n
 | 
			
		||||
the number of the previous forced frame, it is @code{NAN} when no
 | 
			
		||||
keyframe was forced yet
 | 
			
		||||
@item prev_forced_t
 | 
			
		||||
the time of the previous forced frame, it is @code{NAN} when no
 | 
			
		||||
keyframe was forced yet
 | 
			
		||||
@item t
 | 
			
		||||
the time of the current processed frame
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
For example to force a key frame every 5 seconds, you can specify:
 | 
			
		||||
@example
 | 
			
		||||
-force_key_frames expr:gte(t,n_forced*5)
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
To force a key frame 5 seconds after the time of the last forced one,
 | 
			
		||||
starting from second 13:
 | 
			
		||||
@example
 | 
			
		||||
-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Note that forcing too many keyframes is very harmful for the lookahead
 | 
			
		||||
algorithms of certain encoders: using fixed-GOP options or similar
 | 
			
		||||
would be more efficient.
 | 
			
		||||
The timestamps must be specified in ascending order.
 | 
			
		||||
 | 
			
		||||
@item -copyinkf[:@var{stream_specifier}] (@emph{output,per-stream})
 | 
			
		||||
When doing stream copy, copy also non-key frames found at the
 | 
			
		||||
@@ -642,12 +438,11 @@ Set the audio codec. This is an alias for @code{-codec:a}.
 | 
			
		||||
@item -sample_fmt[:@var{stream_specifier}] @var{sample_fmt} (@emph{output,per-stream})
 | 
			
		||||
Set the audio sample format. Use @code{-sample_fmts} to get a list
 | 
			
		||||
of supported sample formats.
 | 
			
		||||
 | 
			
		||||
@item -af @var{filtergraph} (@emph{output})
 | 
			
		||||
Create the filtergraph specified by @var{filtergraph} and use it to
 | 
			
		||||
filter the stream.
 | 
			
		||||
 | 
			
		||||
This is an alias for @code{-filter:a}, see the @ref{filter_option,,-filter option}.
 | 
			
		||||
@item -af @var{filter_graph} (@emph{output})
 | 
			
		||||
@var{filter_graph} is a description of the filter graph to apply to
 | 
			
		||||
the input audio.
 | 
			
		||||
Use the option "-filters" to show all the available filters (including
 | 
			
		||||
also sources and sinks).  This is an alias for @code{-filter:a}.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section Advanced Audio options:
 | 
			
		||||
@@ -657,12 +452,6 @@ This is an alias for @code{-filter:a}, see the @ref{filter_option,,-filter optio
 | 
			
		||||
Force audio tag/fourcc. This is an alias for @code{-tag:a}.
 | 
			
		||||
@item -absf @var{bitstream_filter}
 | 
			
		||||
Deprecated, see -bsf
 | 
			
		||||
@item -guess_layout_max @var{channels} (@emph{input,per-stream})
 | 
			
		||||
If some input channel layout is not known, try to guess only if it
 | 
			
		||||
corresponds to at most the specified number of channels. For example, 2
 | 
			
		||||
tells to @command{ffmpeg} to recognize 1 channel as mono and 2 channels as
 | 
			
		||||
stereo but not 6 channels as 5.1. The default is to always try to guess. Use
 | 
			
		||||
0 to disable all guessing.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section Subtitle options:
 | 
			
		||||
@@ -678,26 +467,11 @@ Disable subtitle recording.
 | 
			
		||||
Deprecated, see -bsf
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section Advanced Subtitle options:
 | 
			
		||||
@section Audio/Video grab options
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item -fix_sub_duration
 | 
			
		||||
Fix subtitles durations. For each subtitle, wait for the next packet in the
 | 
			
		||||
same stream and adjust the duration of the first to avoid overlap. This is
 | 
			
		||||
necessary with some subtitles codecs, especially DVB subtitles, because the
 | 
			
		||||
duration in the original packet is only a rough estimate and the end is
 | 
			
		||||
actually marked by an empty subtitle frame. Failing to use this option when
 | 
			
		||||
necessary can result in exaggerated durations or muxing failures due to
 | 
			
		||||
non-monotonic timestamps.
 | 
			
		||||
 | 
			
		||||
Note that this option will delay the output of all data until the next
 | 
			
		||||
subtitle packet is decoded: it may increase memory consumption and latency a
 | 
			
		||||
lot.
 | 
			
		||||
 | 
			
		||||
@item -canvas_size @var{size}
 | 
			
		||||
Set the size of the canvas used to render subtitles.
 | 
			
		||||
 | 
			
		||||
@item -isync (@emph{global})
 | 
			
		||||
Synchronize read on input.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section Advanced options
 | 
			
		||||
@@ -811,7 +585,10 @@ filter. For example, if you need to merge a media (here @file{input.mkv}) with 2
 | 
			
		||||
mono audio streams into one single stereo channel audio stream (and keep the
 | 
			
		||||
video stream), you can use the following command:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv
 | 
			
		||||
ffmpeg -i input.mkv -f lavfi -i "
 | 
			
		||||
amovie=input.mkv:si=1 [a1];
 | 
			
		||||
amovie=input.mkv:si=2 [a2];
 | 
			
		||||
[a1][a2] amerge" -c:a pcm_s16le -c:v copy output.mkv
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item -map_metadata[:@var{metadata_spec_out}] @var{infile}[:@var{metadata_spec_in}] (@emph{output,per-metadata})
 | 
			
		||||
@@ -860,7 +637,39 @@ Copy chapters from input file with index @var{input_file_index} to the next
 | 
			
		||||
output file. If no chapter mapping is specified, then chapters are copied from
 | 
			
		||||
the first input file with at least one chapter. Use a negative file index to
 | 
			
		||||
disable any chapter copying.
 | 
			
		||||
 | 
			
		||||
@item -debug @var{category}
 | 
			
		||||
Print specific debug info.
 | 
			
		||||
@var{category} is a number or a string containing one of the following values:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item bitstream
 | 
			
		||||
@item buffers
 | 
			
		||||
picture buffer allocations
 | 
			
		||||
@item bugs
 | 
			
		||||
@item dct_coeff
 | 
			
		||||
@item er
 | 
			
		||||
error recognition
 | 
			
		||||
@item mb_type
 | 
			
		||||
macroblock (MB) type
 | 
			
		||||
@item mmco
 | 
			
		||||
memory management control operations (H.264)
 | 
			
		||||
@item mv
 | 
			
		||||
motion vector
 | 
			
		||||
@item pict
 | 
			
		||||
picture info
 | 
			
		||||
@item pts
 | 
			
		||||
@item qp
 | 
			
		||||
per-block quantization parameter (QP)
 | 
			
		||||
@item rc
 | 
			
		||||
rate control
 | 
			
		||||
@item skip
 | 
			
		||||
@item startcode
 | 
			
		||||
@item thread_ops
 | 
			
		||||
threading operations
 | 
			
		||||
@item vis_mb_type
 | 
			
		||||
visualize block types
 | 
			
		||||
@item vis_qp
 | 
			
		||||
visualize quantization parameter (QP), lower QP are tinted greener
 | 
			
		||||
@end table
 | 
			
		||||
@item -benchmark (@emph{global})
 | 
			
		||||
Show benchmarking information at the end of an encode.
 | 
			
		||||
Shows CPU time used and maximum memory consumption.
 | 
			
		||||
@@ -877,12 +686,6 @@ Dump each input packet to stderr.
 | 
			
		||||
When dumping packets, also dump the payload.
 | 
			
		||||
@item -re (@emph{input})
 | 
			
		||||
Read input at native frame rate. Mainly used to simulate a grab device.
 | 
			
		||||
or live input stream (e.g. when reading from a file). Should not be used
 | 
			
		||||
with actual grab devices or live input streams (where it can cause packet
 | 
			
		||||
loss).
 | 
			
		||||
By default @command{ffmpeg} attempts to read the input(s) as fast as possible.
 | 
			
		||||
This option will slow down the reading of the input(s) to the native frame rate
 | 
			
		||||
of the input(s). It is useful for real-time output (e.g. live streaming).
 | 
			
		||||
@item -loop_input
 | 
			
		||||
Loop over the input stream. Currently it works only for image
 | 
			
		||||
streams. This option is used for automatic FFserver testing.
 | 
			
		||||
@@ -901,7 +704,7 @@ Newly added values will have to be specified as strings always.
 | 
			
		||||
Each frame is passed with its timestamp from the demuxer to the muxer.
 | 
			
		||||
@item 1, cfr
 | 
			
		||||
Frames will be duplicated and dropped to achieve exactly the requested
 | 
			
		||||
constant frame rate.
 | 
			
		||||
constant framerate.
 | 
			
		||||
@item 2, vfr
 | 
			
		||||
Frames are passed through with their timestamp or dropped so as to
 | 
			
		||||
prevent 2 frames from having the same timestamp.
 | 
			
		||||
@@ -913,10 +716,6 @@ Chooses between 1 and 2 depending on muxer capabilities. This is the
 | 
			
		||||
default method.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Note that the timestamps may be further modified by the muxer, after this.
 | 
			
		||||
For example, in the case that the format option @option{avoid_negative_ts}
 | 
			
		||||
is enabled.
 | 
			
		||||
 | 
			
		||||
With -map you can select from which stream the timestamps should be
 | 
			
		||||
taken. You can leave either video or audio unchanged and sync the
 | 
			
		||||
remaining stream(s) to the unchanged one.
 | 
			
		||||
@@ -926,23 +725,9 @@ Audio sync method. "Stretches/squeezes" the audio stream to match the timestamps
 | 
			
		||||
the parameter is the maximum samples per second by which the audio is changed.
 | 
			
		||||
-async 1 is a special case where only the start of the audio stream is corrected
 | 
			
		||||
without any later correction.
 | 
			
		||||
 | 
			
		||||
Note that the timestamps may be further modified by the muxer, after this.
 | 
			
		||||
For example, in the case that the format option @option{avoid_negative_ts}
 | 
			
		||||
is enabled.
 | 
			
		||||
 | 
			
		||||
This option has been deprecated. Use the @code{aresample} audio filter instead.
 | 
			
		||||
 | 
			
		||||
This option has been deprecated. Use the @code{asyncts} audio filter instead.
 | 
			
		||||
@item -copyts
 | 
			
		||||
Do not process input timestamps, but keep their values without trying
 | 
			
		||||
to sanitize them. In particular, do not remove the initial start time
 | 
			
		||||
offset value.
 | 
			
		||||
 | 
			
		||||
Note that, depending on the @option{vsync} option or on specific muxer
 | 
			
		||||
processing (e.g. in case the format option @option{avoid_negative_ts}
 | 
			
		||||
is enabled) the output timestamps may mismatch with the input
 | 
			
		||||
timestamps even when this option is selected.
 | 
			
		||||
 | 
			
		||||
Copy timestamps from input to output.
 | 
			
		||||
@item -copytb @var{mode}
 | 
			
		||||
Specify how to set the encoder timebase when stream copying.  @var{mode} is an
 | 
			
		||||
integer numeric value, and can assume one of the following values:
 | 
			
		||||
@@ -967,7 +752,7 @@ Try to make the choice automatically, in order to generate a sane output.
 | 
			
		||||
 | 
			
		||||
Default value is -1.
 | 
			
		||||
 | 
			
		||||
@item -shortest (@emph{output})
 | 
			
		||||
@item -shortest
 | 
			
		||||
Finish encoding when the shortest input stream ends.
 | 
			
		||||
@item -dts_delta_threshold
 | 
			
		||||
Timestamp discontinuity delta threshold.
 | 
			
		||||
@@ -988,7 +773,7 @@ ffmpeg -i infile -streamid 0:33 -streamid 1:36 out.ts
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item -bsf[:@var{stream_specifier}] @var{bitstream_filters} (@emph{output,per-stream})
 | 
			
		||||
Set bitstream filters for matching streams. @var{bitstream_filters} is
 | 
			
		||||
Set bitstream filters for matching streams. @var{bistream_filters} is
 | 
			
		||||
a comma-separated list of bitstream filters. Use the @code{-bsfs} option
 | 
			
		||||
to get the list of bitstream filters.
 | 
			
		||||
@example
 | 
			
		||||
@@ -1008,13 +793,11 @@ Specify Timecode for writing. @var{SEP} is ':' for non drop timecode and ';'
 | 
			
		||||
ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@anchor{filter_complex_option}
 | 
			
		||||
@item -filter_complex @var{filtergraph} (@emph{global})
 | 
			
		||||
Define a complex filtergraph, i.e. one with arbitrary number of inputs and/or
 | 
			
		||||
Define a complex filter graph, i.e. one with arbitrary number of inputs and/or
 | 
			
		||||
outputs. For simple graphs -- those with one input and one output of the same
 | 
			
		||||
type -- see the @option{-filter} options. @var{filtergraph} is a description of
 | 
			
		||||
the filtergraph, as described in the ``Filtergraph syntax'' section of the
 | 
			
		||||
ffmpeg-filters manual.
 | 
			
		||||
the filter graph, as described in @ref{Filtergraph syntax}.
 | 
			
		||||
 | 
			
		||||
Input link labels must refer to input streams using the
 | 
			
		||||
@code{[file_index:stream_specifier]} syntax (i.e. the same as @option{-map}
 | 
			
		||||
@@ -1025,9 +808,6 @@ the matching type.
 | 
			
		||||
Output link labels are referred to with @option{-map}. Unlabeled outputs are
 | 
			
		||||
added to the first output file.
 | 
			
		||||
 | 
			
		||||
Note that with this option it is possible to use only lavfi sources without
 | 
			
		||||
normal input files.
 | 
			
		||||
 | 
			
		||||
For example, to overlay an image over video
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map
 | 
			
		||||
@@ -1050,53 +830,8 @@ graph will be added to the output file automatically, so we can simply write
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
To generate 5 seconds of pure red video using lavfi @code{color} source:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item -lavfi @var{filtergraph} (@emph{global})
 | 
			
		||||
Define a complex filtergraph, i.e. one with arbitrary number of inputs and/or
 | 
			
		||||
outputs. Equivalent to @option{-filter_complex}.
 | 
			
		||||
 | 
			
		||||
@item -filter_complex_script @var{filename} (@emph{global})
 | 
			
		||||
This option is similar to @option{-filter_complex}, the only difference is that
 | 
			
		||||
its argument is the name of the file from which a complex filtergraph
 | 
			
		||||
description is to be read.
 | 
			
		||||
 | 
			
		||||
@item -accurate_seek (@emph{input})
 | 
			
		||||
This option enables or disables accurate seeking in input files with the
 | 
			
		||||
@option{-ss} option. It is enabled by default, so seeking is accurate when
 | 
			
		||||
transcoding. Use @option{-noaccurate_seek} to disable it, which may be useful
 | 
			
		||||
e.g. when copying some streams and transcoding the others.
 | 
			
		||||
 | 
			
		||||
@item -override_ffserver (@emph{global})
 | 
			
		||||
Overrides the input specifications from ffserver. Using this option you can
 | 
			
		||||
map any input stream to ffserver and control many aspects of the encoding from
 | 
			
		||||
ffmpeg. Without this option ffmpeg will transmit to ffserver what is requested by
 | 
			
		||||
ffserver.
 | 
			
		||||
The option is intended for cases where features are needed that cannot be
 | 
			
		||||
specified to ffserver but can be to ffmpeg.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
As a special exception, you can use a bitmap subtitle stream as input: it
 | 
			
		||||
will be converted into a video with the same size as the largest video in
 | 
			
		||||
the file, or 720x576 if no video is present. Note that this is an
 | 
			
		||||
experimental and temporary solution. It will be removed once libavfilter has
 | 
			
		||||
proper support for subtitles.
 | 
			
		||||
 | 
			
		||||
For example, to hardcode subtitles on top of a DVB-T recording stored in
 | 
			
		||||
MPEG-TS format, delaying the subtitles by 1 second:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i input.ts -filter_complex \
 | 
			
		||||
  '[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \
 | 
			
		||||
  -sn -map '#0x2dc' output.mkv
 | 
			
		||||
@end example
 | 
			
		||||
(0x2d0, 0x2dc and 0x2ef are the MPEG-TS PIDs of respectively the video,
 | 
			
		||||
audio and subtitles streams; 0:0, 0:3 and 0:7 would have worked too)
 | 
			
		||||
 | 
			
		||||
@section Preset files
 | 
			
		||||
A preset file contains a sequence of @var{option}=@var{value} pairs,
 | 
			
		||||
one for each line, specifying a sequence of options which would be
 | 
			
		||||
@@ -1120,15 +855,15 @@ First ffmpeg searches for a file named @var{arg}.ffpreset in the
 | 
			
		||||
directories @file{$FFMPEG_DATADIR} (if set), and @file{$HOME/.ffmpeg}, and in
 | 
			
		||||
the datadir defined at configuration time (usually @file{PREFIX/share/ffmpeg})
 | 
			
		||||
or in a @file{ffpresets} folder along the executable on win32,
 | 
			
		||||
in that order. For example, if the argument is @code{libvpx-1080p}, it will
 | 
			
		||||
search for the file @file{libvpx-1080p.ffpreset}.
 | 
			
		||||
in that order. For example, if the argument is @code{libx264-max}, it will
 | 
			
		||||
search for the file @file{libx264-max.ffpreset}.
 | 
			
		||||
 | 
			
		||||
If no such file is found, then ffmpeg will search for a file named
 | 
			
		||||
@var{codec_name}-@var{arg}.ffpreset in the above-mentioned
 | 
			
		||||
directories, where @var{codec_name} is the name of the codec to which
 | 
			
		||||
the preset file options will be applied. For example, if you select
 | 
			
		||||
the video codec with @code{-vcodec libvpx} and use @code{-vpre 1080p},
 | 
			
		||||
then it will search for the file @file{libvpx-1080p.ffpreset}.
 | 
			
		||||
the video codec with @code{-vcodec libx264} and use @code{-vpre max},
 | 
			
		||||
then it will search for the file @file{libx264-max.ffpreset}.
 | 
			
		||||
@c man end OPTIONS
 | 
			
		||||
 | 
			
		||||
@chapter Tips
 | 
			
		||||
@@ -1136,7 +871,7 @@ then it will search for the file @file{libvpx-1080p.ffpreset}.
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
@item
 | 
			
		||||
For streaming at very low bitrates, use a low frame rate
 | 
			
		||||
For streaming at very low bitrate application, use a low frame rate
 | 
			
		||||
and a small GOP size. This is especially true for RealVideo where
 | 
			
		||||
the Linux player does not seem to be very fast, so it can miss
 | 
			
		||||
frames. An example is:
 | 
			
		||||
@@ -1215,14 +950,14 @@ standard mixer.
 | 
			
		||||
Grab the X11 display with ffmpeg via
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg
 | 
			
		||||
ffmpeg -f x11grab -s cif -r 25 -i :0.0 /tmp/out.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
0.0 is display.screen number of your X11 server, same as
 | 
			
		||||
the DISPLAY environment variable.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg
 | 
			
		||||
ffmpeg -f x11grab -s cif -r 25 -i :0.0+10,20 /tmp/out.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
0.0 is display.screen number of your X11 server, same as the DISPLAY environment
 | 
			
		||||
@@ -1345,21 +1080,23 @@ composed of three digits padded with zeroes to express the sequence
 | 
			
		||||
number. It is the same syntax supported by the C printf function, but
 | 
			
		||||
only formats accepting a normal integer are suitable.
 | 
			
		||||
 | 
			
		||||
When importing an image sequence, -i also supports expanding
 | 
			
		||||
shell-like wildcard patterns (globbing) internally, by selecting the
 | 
			
		||||
image2-specific @code{-pattern_type glob} option.
 | 
			
		||||
 | 
			
		||||
For example, for creating a video from filenames matching the glob pattern
 | 
			
		||||
@code{foo-*.jpeg}:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f image2 -pattern_type glob -i 'foo-*.jpeg' -r 12 -s WxH foo.avi
 | 
			
		||||
@end example
 | 
			
		||||
When importing an image sequence, -i also supports expanding shell-like
 | 
			
		||||
wildcard patterns (globbing) internally. To lower the chance of interfering
 | 
			
		||||
with your actual file names and the shell's glob expansion, you are required
 | 
			
		||||
to activate glob meta characters by prefixing them with a single @code{%}
 | 
			
		||||
character, like in @code{foo-%*.jpeg}, @code{foo-%?%?%?.jpeg} or
 | 
			
		||||
@code{foo-00%[234%]%*.jpeg}.
 | 
			
		||||
If your filename actually contains a character sequence of a @code{%} character
 | 
			
		||||
followed by a glob character, you must double the @code{%} character to escape
 | 
			
		||||
it. Imagine your files begin with @code{%?-foo-}, then you could use a glob
 | 
			
		||||
pattern like @code{%%?-foo-%*.jpeg}. For input patterns that could be both a
 | 
			
		||||
printf or a glob pattern, ffmpeg will assume it is a glob pattern.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
You can put many streams of the same type in the output:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i test1.avi -i test2.avi -map 0:3 -map 0:2 -map 0:1 -map 0:0 -c copy test12.nut
 | 
			
		||||
ffmpeg -i test1.avi -i test2.avi -map 0.3 -map 0.2 -map 0.1 -map 0.0 -c copy test12.nut
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
The resulting output file @file{test12.avi} will contain first four streams from
 | 
			
		||||
@@ -1381,74 +1118,32 @@ ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext
 | 
			
		||||
@end itemize
 | 
			
		||||
@c man end EXAMPLES
 | 
			
		||||
 | 
			
		||||
@include config.texi
 | 
			
		||||
@ifset config-all
 | 
			
		||||
@ifset config-avutil
 | 
			
		||||
@include utils.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avcodec
 | 
			
		||||
@include codecs.texi
 | 
			
		||||
@include bitstream_filters.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avformat
 | 
			
		||||
@include formats.texi
 | 
			
		||||
@include syntax.texi
 | 
			
		||||
@include eval.texi
 | 
			
		||||
@include decoders.texi
 | 
			
		||||
@include encoders.texi
 | 
			
		||||
@include demuxers.texi
 | 
			
		||||
@include muxers.texi
 | 
			
		||||
@include indevs.texi
 | 
			
		||||
@include outdevs.texi
 | 
			
		||||
@include protocols.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avdevice
 | 
			
		||||
@include devices.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-swresample
 | 
			
		||||
@include resampler.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-swscale
 | 
			
		||||
@include scaler.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avfilter
 | 
			
		||||
@include bitstream_filters.texi
 | 
			
		||||
@include filters.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@end ifset
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@ifset config-all
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-not-all
 | 
			
		||||
@url{ffmpeg-all.html,ffmpeg-all},
 | 
			
		||||
@end ifset
 | 
			
		||||
@url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{ffmpeg-utils.html,ffmpeg-utils},
 | 
			
		||||
@url{ffmpeg-scaler.html,ffmpeg-scaler},
 | 
			
		||||
@url{ffmpeg-resampler.html,ffmpeg-resampler},
 | 
			
		||||
@url{ffmpeg-codecs.html,ffmpeg-codecs},
 | 
			
		||||
@url{ffmpeg-bitstream-filters.html,ffmpeg-bitstream-filters},
 | 
			
		||||
@url{ffmpeg-formats.html,ffmpeg-formats},
 | 
			
		||||
@url{ffmpeg-devices.html,ffmpeg-devices},
 | 
			
		||||
@url{ffmpeg-protocols.html,ffmpeg-protocols},
 | 
			
		||||
@url{ffmpeg-filters.html,ffmpeg-filters}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
@ifset config-all
 | 
			
		||||
ffmpeg(1),
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-not-all
 | 
			
		||||
ffmpeg-all(1),
 | 
			
		||||
@end ifset
 | 
			
		||||
ffplay(1), ffprobe(1), ffserver(1),
 | 
			
		||||
ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1),
 | 
			
		||||
ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1),
 | 
			
		||||
ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
@include metadata.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename ffmpeg
 | 
			
		||||
@settitle ffmpeg video converter
 | 
			
		||||
 | 
			
		||||
@c man begin SEEALSO
 | 
			
		||||
ffplay(1), ffprobe(1), ffserver(1) and the FFmpeg HTML documentation
 | 
			
		||||
@c man end
 | 
			
		||||
 | 
			
		||||
@c man begin AUTHORS
 | 
			
		||||
See git history
 | 
			
		||||
@c man end
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										133
									
								
								doc/ffplay.texi
									
									
									
									
									
								
							
							
						
						
									
										133
									
								
								doc/ffplay.texi
									
									
									
									
									
								
							@@ -11,7 +11,11 @@
 | 
			
		||||
 | 
			
		||||
@chapter Synopsis
 | 
			
		||||
 | 
			
		||||
ffplay [@var{options}] [@file{input_file}]
 | 
			
		||||
@example
 | 
			
		||||
@c man begin SYNOPSIS
 | 
			
		||||
ffplay [options] [@file{input_file}]
 | 
			
		||||
@c man end
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
@@ -24,7 +28,7 @@ various FFmpeg APIs.
 | 
			
		||||
@chapter Options
 | 
			
		||||
@c man begin OPTIONS
 | 
			
		||||
 | 
			
		||||
@include fftools-common-opts.texi
 | 
			
		||||
@include avtools-common-opts.texi
 | 
			
		||||
 | 
			
		||||
@section Main options
 | 
			
		||||
 | 
			
		||||
@@ -73,22 +77,11 @@ Default value is "video", if video is not present or cannot be played
 | 
			
		||||
You can interactively cycle through the available show modes by
 | 
			
		||||
pressing the key @key{w}.
 | 
			
		||||
 | 
			
		||||
@item -vf @var{filtergraph}
 | 
			
		||||
Create the filtergraph specified by @var{filtergraph} and use it to
 | 
			
		||||
filter the video stream.
 | 
			
		||||
 | 
			
		||||
@var{filtergraph} is a description of the filtergraph to apply to
 | 
			
		||||
the stream, and must have a single video input and a single video
 | 
			
		||||
output. In the filtergraph, the input is associated to the label
 | 
			
		||||
@code{in}, and the output to the label @code{out}. See the
 | 
			
		||||
ffmpeg-filters manual for more information about the filtergraph
 | 
			
		||||
syntax.
 | 
			
		||||
 | 
			
		||||
@item -af @var{filtergraph}
 | 
			
		||||
@var{filtergraph} is a description of the filtergraph to apply to
 | 
			
		||||
the input audio.
 | 
			
		||||
@item -vf @var{filter_graph}
 | 
			
		||||
@var{filter_graph} is a description of the filter graph to apply to
 | 
			
		||||
the input video.
 | 
			
		||||
Use the option "-filters" to show all the available filters (including
 | 
			
		||||
sources and sinks).
 | 
			
		||||
also sources and sinks).
 | 
			
		||||
 | 
			
		||||
@item -i @var{input_file}
 | 
			
		||||
Read @var{input_file}.
 | 
			
		||||
@@ -99,13 +92,9 @@ Read @var{input_file}.
 | 
			
		||||
@item -pix_fmt @var{format}
 | 
			
		||||
Set pixel format.
 | 
			
		||||
This option has been deprecated in favor of private options, try -pixel_format.
 | 
			
		||||
 | 
			
		||||
@item -stats
 | 
			
		||||
Print several playback statistics, in particular show the stream
 | 
			
		||||
duration, the codec parameters, the current position in the stream and
 | 
			
		||||
the audio/video synchronisation drift. It is on by default, to
 | 
			
		||||
explicitly disable it you need to specify @code{-nostats}.
 | 
			
		||||
 | 
			
		||||
Show the stream duration, the codec parameters, the current position in
 | 
			
		||||
the stream and the audio/video synchronisation drift.
 | 
			
		||||
@item -bug
 | 
			
		||||
Work around bugs.
 | 
			
		||||
@item -fast
 | 
			
		||||
@@ -145,20 +134,8 @@ Exit when video is done playing.
 | 
			
		||||
Exit if any key is pressed.
 | 
			
		||||
@item -exitonmousedown
 | 
			
		||||
Exit if any mouse button is pressed.
 | 
			
		||||
 | 
			
		||||
@item -codec:@var{media_specifier} @var{codec_name}
 | 
			
		||||
Force a specific decoder implementation for the stream identified by
 | 
			
		||||
@var{media_specifier}, which can assume the values @code{a} (audio),
 | 
			
		||||
@code{v} (video), and @code{s} subtitle.
 | 
			
		||||
 | 
			
		||||
@item -acodec @var{codec_name}
 | 
			
		||||
Force a specific audio decoder.
 | 
			
		||||
 | 
			
		||||
@item -vcodec @var{codec_name}
 | 
			
		||||
Force a specific video decoder.
 | 
			
		||||
 | 
			
		||||
@item -scodec @var{codec_name}
 | 
			
		||||
Force a specific subtitle decoder.
 | 
			
		||||
@item -codec:@var{stream_type}
 | 
			
		||||
Force a specific decoder implementation
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section While playing
 | 
			
		||||
@@ -174,16 +151,13 @@ Toggle full screen.
 | 
			
		||||
Pause.
 | 
			
		||||
 | 
			
		||||
@item a
 | 
			
		||||
Cycle audio channel in the curret program.
 | 
			
		||||
Cycle audio channel.
 | 
			
		||||
 | 
			
		||||
@item v
 | 
			
		||||
Cycle video channel.
 | 
			
		||||
 | 
			
		||||
@item t
 | 
			
		||||
Cycle subtitle channel in the current program.
 | 
			
		||||
 | 
			
		||||
@item c
 | 
			
		||||
Cycle program.
 | 
			
		||||
Cycle subtitle channel.
 | 
			
		||||
 | 
			
		||||
@item w
 | 
			
		||||
Show audio waves.
 | 
			
		||||
@@ -204,74 +178,29 @@ Seek to percentage in file corresponding to fraction of width.
 | 
			
		||||
 | 
			
		||||
@c man end
 | 
			
		||||
 | 
			
		||||
@include config.texi
 | 
			
		||||
@ifset config-all
 | 
			
		||||
@ifset config-avutil
 | 
			
		||||
@include utils.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avcodec
 | 
			
		||||
@include codecs.texi
 | 
			
		||||
@include bitstream_filters.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avformat
 | 
			
		||||
@include formats.texi
 | 
			
		||||
@include syntax.texi
 | 
			
		||||
@include eval.texi
 | 
			
		||||
@include decoders.texi
 | 
			
		||||
@include demuxers.texi
 | 
			
		||||
@include muxers.texi
 | 
			
		||||
@include indevs.texi
 | 
			
		||||
@include outdevs.texi
 | 
			
		||||
@include protocols.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avdevice
 | 
			
		||||
@include devices.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-swresample
 | 
			
		||||
@include resampler.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-swscale
 | 
			
		||||
@include scaler.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avfilter
 | 
			
		||||
@include filters.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@end ifset
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@ifset config-all
 | 
			
		||||
@url{ffplay.html,ffplay},
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-not-all
 | 
			
		||||
@url{ffplay-all.html,ffmpeg-all},
 | 
			
		||||
@end ifset
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{ffmpeg-utils.html,ffmpeg-utils},
 | 
			
		||||
@url{ffmpeg-scaler.html,ffmpeg-scaler},
 | 
			
		||||
@url{ffmpeg-resampler.html,ffmpeg-resampler},
 | 
			
		||||
@url{ffmpeg-codecs.html,ffmpeg-codecs},
 | 
			
		||||
@url{ffmpeg-bitstream-filters.html,ffmpeg-bitstream-filters},
 | 
			
		||||
@url{ffmpeg-formats.html,ffmpeg-formats},
 | 
			
		||||
@url{ffmpeg-devices.html,ffmpeg-devices},
 | 
			
		||||
@url{ffmpeg-protocols.html,ffmpeg-protocols},
 | 
			
		||||
@url{ffmpeg-filters.html,ffmpeg-filters}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
@ifset config-all
 | 
			
		||||
ffplay(1),
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-not-all
 | 
			
		||||
ffplay-all(1),
 | 
			
		||||
@end ifset
 | 
			
		||||
ffmpeg(1), ffprobe(1), ffserver(1),
 | 
			
		||||
ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1),
 | 
			
		||||
ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1),
 | 
			
		||||
ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename ffplay
 | 
			
		||||
@settitle FFplay media player
 | 
			
		||||
 | 
			
		||||
@c man begin SEEALSO
 | 
			
		||||
ffmpeg(1), ffprobe(1), ffserver(1) and the FFmpeg HTML documentation
 | 
			
		||||
@c man end
 | 
			
		||||
 | 
			
		||||
@c man begin AUTHORS
 | 
			
		||||
The FFmpeg developers
 | 
			
		||||
@c man end
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										367
									
								
								doc/ffprobe.texi
									
									
									
									
									
								
							
							
						
						
									
										367
									
								
								doc/ffprobe.texi
									
									
									
									
									
								
							@@ -11,7 +11,13 @@
 | 
			
		||||
 | 
			
		||||
@chapter Synopsis
 | 
			
		||||
 | 
			
		||||
ffprobe [@var{options}] [@file{input_file}]
 | 
			
		||||
The generic syntax is:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
@c man begin SYNOPSIS
 | 
			
		||||
ffprobe [options] [@file{input_file}]
 | 
			
		||||
@c man end
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
@@ -39,20 +45,15 @@ ffprobe output is designed to be easily parsable by a textual filter,
 | 
			
		||||
and consists of one or more sections of a form defined by the selected
 | 
			
		||||
writer, which is specified by the @option{print_format} option.
 | 
			
		||||
 | 
			
		||||
Sections may contain other nested sections, and are identified by a
 | 
			
		||||
name (which may be shared by other sections), and an unique
 | 
			
		||||
name. See the output of @option{sections}.
 | 
			
		||||
 | 
			
		||||
Metadata tags stored in the container or in the streams are recognized
 | 
			
		||||
and printed in the corresponding "FORMAT", "STREAM" or "PROGRAM_STREAM"
 | 
			
		||||
section.
 | 
			
		||||
and printed in the corresponding "FORMAT" or "STREAM" section.
 | 
			
		||||
 | 
			
		||||
@c man end
 | 
			
		||||
 | 
			
		||||
@chapter Options
 | 
			
		||||
@c man begin OPTIONS
 | 
			
		||||
 | 
			
		||||
@include fftools-common-opts.texi
 | 
			
		||||
@include avtools-common-opts.texi
 | 
			
		||||
 | 
			
		||||
@section Main options
 | 
			
		||||
 | 
			
		||||
@@ -79,7 +80,7 @@ Use sexagesimal format HH:MM:SS.MICROSECONDS for time values.
 | 
			
		||||
Prettify the format of the displayed values, it corresponds to the
 | 
			
		||||
options "-unit -prefix -byte_binary_prefix -sexagesimal".
 | 
			
		||||
 | 
			
		||||
@item -of, -print_format @var{writer_name}[=@var{writer_options}]
 | 
			
		||||
@item -print_format @var{writer_name}[=@var{writer_options}]
 | 
			
		||||
Set the output printing format.
 | 
			
		||||
 | 
			
		||||
@var{writer_name} specifies the name of the writer, and
 | 
			
		||||
@@ -93,32 +94,6 @@ For example for printing the output in JSON format, specify:
 | 
			
		||||
For more details on the available output printing formats, see the
 | 
			
		||||
Writers section below.
 | 
			
		||||
 | 
			
		||||
@item -sections
 | 
			
		||||
Print sections structure and section information, and exit. The output
 | 
			
		||||
is not meant to be parsed by a machine.
 | 
			
		||||
 | 
			
		||||
@item -select_streams @var{stream_specifier}
 | 
			
		||||
Select only the streams specified by @var{stream_specifier}. This
 | 
			
		||||
option affects only the options related to streams
 | 
			
		||||
(e.g. @code{show_streams}, @code{show_packets}, etc.).
 | 
			
		||||
 | 
			
		||||
For example to show only audio streams, you can use the command:
 | 
			
		||||
@example
 | 
			
		||||
ffprobe -show_streams -select_streams a INPUT
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
To show only video packets belonging to the video stream with index 1:
 | 
			
		||||
@example
 | 
			
		||||
ffprobe -show_packets -select_streams v:1 INPUT
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item -show_data
 | 
			
		||||
Show payload data, as a hexadecimal and ASCII dump. Coupled with
 | 
			
		||||
@option{-show_packets}, it will dump the packets' data. Coupled with
 | 
			
		||||
@option{-show_streams}, it will dump the codec extradata.
 | 
			
		||||
 | 
			
		||||
The dump is printed as the "data" field. It may contain newlines.
 | 
			
		||||
 | 
			
		||||
@item -show_error
 | 
			
		||||
Show information about the error found when trying to probe the input.
 | 
			
		||||
 | 
			
		||||
@@ -136,59 +111,6 @@ Like @option{-show_format}, but only prints the specified entry of the
 | 
			
		||||
container format information, rather than all. This option may be given more
 | 
			
		||||
than once, then all specified entries will be shown.
 | 
			
		||||
 | 
			
		||||
This option is deprecated, use @code{show_entries} instead.
 | 
			
		||||
 | 
			
		||||
@item -show_entries @var{section_entries}
 | 
			
		||||
Set list of entries to show.
 | 
			
		||||
 | 
			
		||||
Entries are specified according to the following
 | 
			
		||||
syntax. @var{section_entries} contains a list of section entries
 | 
			
		||||
separated by @code{:}. Each section entry is composed by a section
 | 
			
		||||
name (or unique name), optionally followed by a list of entries local
 | 
			
		||||
to that section, separated by @code{,}.
 | 
			
		||||
 | 
			
		||||
If section name is specified but is followed by no @code{=}, all
 | 
			
		||||
entries are printed to output, together with all the contained
 | 
			
		||||
sections. Otherwise only the entries specified in the local section
 | 
			
		||||
entries list are printed. In particular, if @code{=} is specified but
 | 
			
		||||
the list of local entries is empty, then no entries will be shown for
 | 
			
		||||
that section.
 | 
			
		||||
 | 
			
		||||
Note that the order of specification of the local section entries is
 | 
			
		||||
not honored in the output, and the usual display order will be
 | 
			
		||||
retained.
 | 
			
		||||
 | 
			
		||||
The formal syntax is given by:
 | 
			
		||||
@example
 | 
			
		||||
@var{LOCAL_SECTION_ENTRIES} ::= @var{SECTION_ENTRY_NAME}[,@var{LOCAL_SECTION_ENTRIES}]
 | 
			
		||||
@var{SECTION_ENTRY}         ::= @var{SECTION_NAME}[=[@var{LOCAL_SECTION_ENTRIES}]]
 | 
			
		||||
@var{SECTION_ENTRIES}       ::= @var{SECTION_ENTRY}[:@var{SECTION_ENTRIES}]
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
For example, to show only the index and type of each stream, and the PTS
 | 
			
		||||
time, duration time, and stream index of the packets, you can specify
 | 
			
		||||
the argument:
 | 
			
		||||
@example
 | 
			
		||||
packet=pts_time,duration_time,stream_index : stream=index,codec_type
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
To show all the entries in the section "format", but only the codec
 | 
			
		||||
type in the section "stream", specify the argument:
 | 
			
		||||
@example
 | 
			
		||||
format : stream=codec_type
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
To show all the tags in the stream and format sections:
 | 
			
		||||
@example
 | 
			
		||||
format_tags : format_tags
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
To show only the @code{title} tag (if available) in the stream
 | 
			
		||||
sections:
 | 
			
		||||
@example
 | 
			
		||||
stream_tags=title
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item -show_packets
 | 
			
		||||
Show information about each packet contained in the input multimedia
 | 
			
		||||
stream.
 | 
			
		||||
@@ -210,18 +132,6 @@ multimedia stream.
 | 
			
		||||
Each media stream information is printed within a dedicated section
 | 
			
		||||
with name "STREAM".
 | 
			
		||||
 | 
			
		||||
@item -show_programs
 | 
			
		||||
Show information about programs and their streams contained in the input
 | 
			
		||||
multimedia stream.
 | 
			
		||||
 | 
			
		||||
Each media stream information is printed within a dedicated section
 | 
			
		||||
with name "PROGRAM_STREAM".
 | 
			
		||||
 | 
			
		||||
@item -show_chapters
 | 
			
		||||
Show information about chapters stored in the format.
 | 
			
		||||
 | 
			
		||||
Each chapter is printed within a dedicated section with name "CHAPTER".
 | 
			
		||||
 | 
			
		||||
@item -count_frames
 | 
			
		||||
Count the number of frames per stream and report it in the
 | 
			
		||||
corresponding stream section.
 | 
			
		||||
@@ -230,70 +140,6 @@ corresponding stream section.
 | 
			
		||||
Count the number of packets per stream and report it in the
 | 
			
		||||
corresponding stream section.
 | 
			
		||||
 | 
			
		||||
@item -read_intervals @var{read_intervals}
 | 
			
		||||
 | 
			
		||||
Read only the specified intervals. @var{read_intervals} must be a
 | 
			
		||||
sequence of interval specifications separated by ",".
 | 
			
		||||
@command{ffprobe} will seek to the interval starting point, and will
 | 
			
		||||
continue reading from that.
 | 
			
		||||
 | 
			
		||||
Each interval is specified by two optional parts, separated by "%".
 | 
			
		||||
 | 
			
		||||
The first part specifies the interval start position. It is
 | 
			
		||||
interpreted as an abolute position, or as a relative offset from the
 | 
			
		||||
current position if it is preceded by the "+" character. If this first
 | 
			
		||||
part is not specified, no seeking will be performed when reading this
 | 
			
		||||
interval.
 | 
			
		||||
 | 
			
		||||
The second part specifies the interval end position. It is interpreted
 | 
			
		||||
as an absolute position, or as a relative offset from the current
 | 
			
		||||
position if it is preceded by the "+" character. If the offset
 | 
			
		||||
specification starts with "#", it is interpreted as the number of
 | 
			
		||||
packets to read (not including the flushing packets) from the interval
 | 
			
		||||
start. If no second part is specified, the program will read until the
 | 
			
		||||
end of the input.
 | 
			
		||||
 | 
			
		||||
Note that seeking is not accurate, thus the actual interval start
 | 
			
		||||
point may be different from the specified position. Also, when an
 | 
			
		||||
interval duration is specified, the absolute end time will be computed
 | 
			
		||||
by adding the duration to the interval start point found by seeking
 | 
			
		||||
the file, rather than to the specified start value.
 | 
			
		||||
 | 
			
		||||
The formal syntax is given by:
 | 
			
		||||
@example
 | 
			
		||||
@var{INTERVAL}  ::= [@var{START}|+@var{START_OFFSET}][%[@var{END}|+@var{END_OFFSET}]]
 | 
			
		||||
@var{INTERVALS} ::= @var{INTERVAL}[,@var{INTERVALS}]
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
A few examples follow.
 | 
			
		||||
@itemize
 | 
			
		||||
@item
 | 
			
		||||
Seek to time 10, read packets until 20 seconds after the found seek
 | 
			
		||||
point, then seek to position @code{01:30} (1 minute and thirty
 | 
			
		||||
seconds) and read packets until position @code{01:45}.
 | 
			
		||||
@example
 | 
			
		||||
10%+20,01:30%01:45
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Read only 42 packets after seeking to position @code{01:23}:
 | 
			
		||||
@example
 | 
			
		||||
01:23%+#42
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Read only the first 20 seconds from the start:
 | 
			
		||||
@example
 | 
			
		||||
%+20
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Read from the start until position @code{02:30}:
 | 
			
		||||
@example
 | 
			
		||||
%02:30
 | 
			
		||||
@end example
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
@item -show_private_data, -private
 | 
			
		||||
Show private data, that is data depending on the format of the
 | 
			
		||||
particular shown element.
 | 
			
		||||
@@ -317,10 +163,6 @@ Show information related to program and library versions. This is the
 | 
			
		||||
equivalent of setting both @option{-show_program_version} and
 | 
			
		||||
@option{-show_library_versions} options.
 | 
			
		||||
 | 
			
		||||
@item -bitexact
 | 
			
		||||
Force bitexact output, useful to produce output which is not dependent
 | 
			
		||||
on the specific build.
 | 
			
		||||
 | 
			
		||||
@item -i @var{input_file}
 | 
			
		||||
Read @var{input_file}.
 | 
			
		||||
 | 
			
		||||
@@ -333,9 +175,8 @@ Read @var{input_file}.
 | 
			
		||||
A writer defines the output format adopted by @command{ffprobe}, and will be
 | 
			
		||||
used for printing all the parts of the output.
 | 
			
		||||
 | 
			
		||||
A writer may accept one or more arguments, which specify the options
 | 
			
		||||
to adopt. The options are specified as a list of @var{key}=@var{value}
 | 
			
		||||
pairs, separated by ":".
 | 
			
		||||
A writer may accept one or more arguments, which specify the options to
 | 
			
		||||
adopt.
 | 
			
		||||
 | 
			
		||||
A description of the currently available writers follows.
 | 
			
		||||
 | 
			
		||||
@@ -351,8 +192,11 @@ keyN=valN
 | 
			
		||||
[/SECTION]
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Metadata tags are printed as a line in the corresponding FORMAT, STREAM or
 | 
			
		||||
PROGRAM_STREAM section, and are prefixed by the string "TAG:".
 | 
			
		||||
Metadata tags are printed as a line in the corresponding FORMAT or
 | 
			
		||||
STREAM section, and are prefixed by the string "TAG:".
 | 
			
		||||
 | 
			
		||||
This writer accepts options as a list of @var{key}=@var{value} pairs,
 | 
			
		||||
separated by ":".
 | 
			
		||||
 | 
			
		||||
A description of the accepted options follows.
 | 
			
		||||
 | 
			
		||||
@@ -367,11 +211,8 @@ If set to 1 specify not to print the section header and footer.
 | 
			
		||||
Default value is 0.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section compact, csv
 | 
			
		||||
Compact and CSV format.
 | 
			
		||||
 | 
			
		||||
The @code{csv} writer is equivalent to @code{compact}, but supports
 | 
			
		||||
different defaults.
 | 
			
		||||
@section compact
 | 
			
		||||
Compact format.
 | 
			
		||||
 | 
			
		||||
Each section is printed on a single line.
 | 
			
		||||
If no option is specifid, the output has the form:
 | 
			
		||||
@@ -383,29 +224,30 @@ Metadata tags are printed in the corresponding "format" or "stream"
 | 
			
		||||
section. A metadata tag key, if printed, is prefixed by the string
 | 
			
		||||
"tag:".
 | 
			
		||||
 | 
			
		||||
This writer accepts options as a list of @var{key}=@var{value} pairs,
 | 
			
		||||
separated by ":".
 | 
			
		||||
 | 
			
		||||
The description of the accepted options follows.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item item_sep, s
 | 
			
		||||
Specify the character to use for separating fields in the output line.
 | 
			
		||||
It must be a single printable character, it is "|" by default ("," for
 | 
			
		||||
the @code{csv} writer).
 | 
			
		||||
It must be a single printable character, it is "|" by default.
 | 
			
		||||
 | 
			
		||||
@item nokey, nk
 | 
			
		||||
If set to 1 specify not to print the key of each field. Its default
 | 
			
		||||
value is 0 (1 for the @code{csv} writer).
 | 
			
		||||
value is 0.
 | 
			
		||||
 | 
			
		||||
@item escape, e
 | 
			
		||||
Set the escape mode to use, default to "c" ("csv" for the @code{csv}
 | 
			
		||||
writer).
 | 
			
		||||
Set the escape mode to use, default to "c".
 | 
			
		||||
 | 
			
		||||
It can assume one of the following values:
 | 
			
		||||
@table @option
 | 
			
		||||
@item c
 | 
			
		||||
Perform C-like escaping. Strings containing a newline ('\n'), carriage
 | 
			
		||||
return ('\r'), a tab ('\t'), a form feed ('\f'), the escaping
 | 
			
		||||
character ('\') or the item separator character @var{SEP} are escaped using C-like fashioned
 | 
			
		||||
Perform C-like escaping. Strings containing a newline ('\n') or
 | 
			
		||||
carriage return ('\r'), the escaping character ('\') or the item
 | 
			
		||||
separator character @var{SEP} are escaped using C-like fashioned
 | 
			
		||||
escaping, so that a newline is converted to the sequence "\n", a
 | 
			
		||||
carriage return to "\r", '\' to "\\" and the separator @var{SEP} is
 | 
			
		||||
converted to "\@var{SEP}".
 | 
			
		||||
@@ -419,83 +261,22 @@ containing a newline ('\n'), a carriage return ('\r'), a double quote
 | 
			
		||||
Perform no escaping.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item print_section, p
 | 
			
		||||
Print the section name at the begin of each line if the value is
 | 
			
		||||
@code{1}, disable it with value set to @code{0}. Default value is
 | 
			
		||||
@code{1}.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section flat
 | 
			
		||||
Flat format.
 | 
			
		||||
@section csv
 | 
			
		||||
CSV format.
 | 
			
		||||
 | 
			
		||||
A free-form output where each line contains an explicit key=value, such as
 | 
			
		||||
"streams.stream.3.tags.foo=bar". The output is shell escaped, so it can be
 | 
			
		||||
directly embedded in sh scripts as long as the separator character is an
 | 
			
		||||
alphanumeric character or an underscore (see @var{sep_char} option).
 | 
			
		||||
 | 
			
		||||
The description of the accepted options follows.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item sep_char, s
 | 
			
		||||
Separator character used to separate the chapter, the section name, IDs and
 | 
			
		||||
potential tags in the printed field key.
 | 
			
		||||
 | 
			
		||||
Default value is '.'.
 | 
			
		||||
 | 
			
		||||
@item hierarchical, h
 | 
			
		||||
Specify if the section name specification should be hierarchical. If
 | 
			
		||||
set to 1, and if there is more than one section in the current
 | 
			
		||||
chapter, the section name will be prefixed by the name of the
 | 
			
		||||
chapter. A value of 0 will disable this behavior.
 | 
			
		||||
 | 
			
		||||
Default value is 1.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section ini
 | 
			
		||||
INI format output.
 | 
			
		||||
 | 
			
		||||
Print output in an INI based format.
 | 
			
		||||
 | 
			
		||||
The following conventions are adopted:
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
@item
 | 
			
		||||
all key and values are UTF-8
 | 
			
		||||
@item
 | 
			
		||||
'.' is the subgroup separator
 | 
			
		||||
@item
 | 
			
		||||
newline, '\t', '\f', '\b' and the following characters are escaped
 | 
			
		||||
@item
 | 
			
		||||
'\' is the escape character
 | 
			
		||||
@item
 | 
			
		||||
'#' is the comment indicator
 | 
			
		||||
@item
 | 
			
		||||
'=' is the key/value separator
 | 
			
		||||
@item
 | 
			
		||||
':' is not used but usually parsed as key/value separator
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
This writer accepts options as a list of @var{key}=@var{value} pairs,
 | 
			
		||||
separated by ":".
 | 
			
		||||
 | 
			
		||||
The description of the accepted options follows.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item hierarchical, h
 | 
			
		||||
Specify if the section name specification should be hierarchical. If
 | 
			
		||||
set to 1, and if there is more than one section in the current
 | 
			
		||||
chapter, the section name will be prefixed by the name of the
 | 
			
		||||
chapter. A value of 0 will disable this behavior.
 | 
			
		||||
 | 
			
		||||
Default value is 1.
 | 
			
		||||
@end table
 | 
			
		||||
This writer is equivalent to
 | 
			
		||||
@code{compact=item_sep=,:nokey=1:escape=csv}.
 | 
			
		||||
 | 
			
		||||
@section json
 | 
			
		||||
JSON based format.
 | 
			
		||||
 | 
			
		||||
Each section is printed using JSON notation.
 | 
			
		||||
 | 
			
		||||
This writer accepts options as a list of @var{key}=@var{value} pairs,
 | 
			
		||||
separated by ":".
 | 
			
		||||
 | 
			
		||||
The description of the accepted options follows.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@@ -522,6 +303,9 @@ Note that the output issued will be compliant to the
 | 
			
		||||
(@option{unit}, @option{prefix}, @option{byte_binary_prefix},
 | 
			
		||||
@option{sexagesimal} etc.) are specified.
 | 
			
		||||
 | 
			
		||||
This writer accepts options as a list of @var{key}=@var{value} pairs,
 | 
			
		||||
separated by ":".
 | 
			
		||||
 | 
			
		||||
The description of the accepted options follows.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@@ -558,80 +342,31 @@ MOV timecode is extracted from tmcd track, so is available in the tmcd
 | 
			
		||||
stream metadata (@option{-show_streams}, see @var{TAG:timecode}).
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
DV, GXF and AVI timecodes are available in format metadata
 | 
			
		||||
DV and GXF timecodes are available in format metadata
 | 
			
		||||
(@option{-show_format}, see @var{TAG:timecode}).
 | 
			
		||||
 | 
			
		||||
@end itemize
 | 
			
		||||
@c man end TIMECODE
 | 
			
		||||
 | 
			
		||||
@include config.texi
 | 
			
		||||
@ifset config-all
 | 
			
		||||
@ifset config-avutil
 | 
			
		||||
@include utils.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avcodec
 | 
			
		||||
@include codecs.texi
 | 
			
		||||
@include bitstream_filters.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avformat
 | 
			
		||||
@include formats.texi
 | 
			
		||||
@include syntax.texi
 | 
			
		||||
@include decoders.texi
 | 
			
		||||
@include demuxers.texi
 | 
			
		||||
@include protocols.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avdevice
 | 
			
		||||
@include devices.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-swresample
 | 
			
		||||
@include resampler.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-swscale
 | 
			
		||||
@include scaler.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avfilter
 | 
			
		||||
@include filters.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@end ifset
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@ifset config-all
 | 
			
		||||
@url{ffprobe.html,ffprobe},
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-not-all
 | 
			
		||||
@url{ffprobe-all.html,ffprobe-all},
 | 
			
		||||
@end ifset
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{ffmpeg-utils.html,ffmpeg-utils},
 | 
			
		||||
@url{ffmpeg-scaler.html,ffmpeg-scaler},
 | 
			
		||||
@url{ffmpeg-resampler.html,ffmpeg-resampler},
 | 
			
		||||
@url{ffmpeg-codecs.html,ffmpeg-codecs},
 | 
			
		||||
@url{ffmpeg-bitstream-filters.html,ffmpeg-bitstream-filters},
 | 
			
		||||
@url{ffmpeg-formats.html,ffmpeg-formats},
 | 
			
		||||
@url{ffmpeg-devices.html,ffmpeg-devices},
 | 
			
		||||
@url{ffmpeg-protocols.html,ffmpeg-protocols},
 | 
			
		||||
@url{ffmpeg-filters.html,ffmpeg-filters}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
@ifset config-all
 | 
			
		||||
ffprobe(1),
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-not-all
 | 
			
		||||
ffprobe-all(1),
 | 
			
		||||
@end ifset
 | 
			
		||||
ffmpeg(1), ffplay(1), ffserver(1),
 | 
			
		||||
ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1),
 | 
			
		||||
ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1),
 | 
			
		||||
ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
@include indevs.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename ffprobe
 | 
			
		||||
@settitle ffprobe media prober
 | 
			
		||||
 | 
			
		||||
@c man begin SEEALSO
 | 
			
		||||
ffmpeg(1), ffplay(1), ffserver(1) and the FFmpeg HTML documentation
 | 
			
		||||
@c man end
 | 
			
		||||
 | 
			
		||||
@c man begin AUTHORS
 | 
			
		||||
The FFmpeg developers
 | 
			
		||||
@c man end
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
 
 | 
			
		||||
@@ -11,8 +11,6 @@
 | 
			
		||||
            <xsd:element name="packets"  type="ffprobe:packetsType" minOccurs="0" maxOccurs="1" />
 | 
			
		||||
            <xsd:element name="frames"   type="ffprobe:framesType"  minOccurs="0" maxOccurs="1" />
 | 
			
		||||
            <xsd:element name="streams"  type="ffprobe:streamsType" minOccurs="0" maxOccurs="1" />
 | 
			
		||||
            <xsd:element name="programs" type="ffprobe:programsType" minOccurs="0" maxOccurs="1" />
 | 
			
		||||
            <xsd:element name="chapters" type="ffprobe:chaptersType" minOccurs="0" maxOccurs="1" />
 | 
			
		||||
            <xsd:element name="format"   type="ffprobe:formatType"  minOccurs="0" maxOccurs="1" />
 | 
			
		||||
            <xsd:element name="error"    type="ffprobe:errorType"   minOccurs="0" maxOccurs="1" />
 | 
			
		||||
            <xsd:element name="program_version"  type="ffprobe:programVersionType"  minOccurs="0" maxOccurs="1" />
 | 
			
		||||
@@ -41,12 +39,9 @@
 | 
			
		||||
      <xsd:attribute name="dts_time"      type="xsd:float" />
 | 
			
		||||
      <xsd:attribute name="duration"      type="xsd:long"  />
 | 
			
		||||
      <xsd:attribute name="duration_time" type="xsd:float" />
 | 
			
		||||
      <xsd:attribute name="convergence_duration"      type="xsd:long"  />
 | 
			
		||||
      <xsd:attribute name="convergence_duration_time" type="xsd:float" />
 | 
			
		||||
      <xsd:attribute name="size"          type="xsd:long" use="required" />
 | 
			
		||||
      <xsd:attribute name="pos"           type="xsd:long"  />
 | 
			
		||||
      <xsd:attribute name="flags"         type="xsd:string" use="required" />
 | 
			
		||||
      <xsd:attribute name="data"          type="xsd:string" />
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="frameType">
 | 
			
		||||
@@ -58,16 +53,11 @@
 | 
			
		||||
      <xsd:attribute name="pkt_pts_time"  type="xsd:float"/>
 | 
			
		||||
      <xsd:attribute name="pkt_dts"       type="xsd:long" />
 | 
			
		||||
      <xsd:attribute name="pkt_dts_time"  type="xsd:float"/>
 | 
			
		||||
      <xsd:attribute name="pkt_duration"  type="xsd:long" />
 | 
			
		||||
      <xsd:attribute name="pkt_duration_time" type="xsd:float"/>
 | 
			
		||||
      <xsd:attribute name="pkt_pos"       type="xsd:long" />
 | 
			
		||||
      <xsd:attribute name="pkt_size"      type="xsd:int" />
 | 
			
		||||
 | 
			
		||||
      <!-- audio attributes -->
 | 
			
		||||
      <xsd:attribute name="sample_fmt"             type="xsd:string"/>
 | 
			
		||||
      <xsd:attribute name="nb_samples"             type="xsd:long"  />
 | 
			
		||||
      <xsd:attribute name="channels"               type="xsd:int"   />
 | 
			
		||||
      <xsd:attribute name="channel_layout"         type="xsd:string"/>
 | 
			
		||||
 | 
			
		||||
      <!-- video attributes -->
 | 
			
		||||
      <xsd:attribute name="width"                  type="xsd:long"  />
 | 
			
		||||
@@ -80,6 +70,7 @@
 | 
			
		||||
      <xsd:attribute name="interlaced_frame"       type="xsd:int"   />
 | 
			
		||||
      <xsd:attribute name="top_field_first"        type="xsd:int"   />
 | 
			
		||||
      <xsd:attribute name="repeat_pict"            type="xsd:int"   />
 | 
			
		||||
      <xsd:attribute name="reference"              type="xsd:int"   />
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="streamsType">
 | 
			
		||||
@@ -88,41 +79,14 @@
 | 
			
		||||
        </xsd:sequence>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="programsType">
 | 
			
		||||
        <xsd:sequence>
 | 
			
		||||
            <xsd:element name="program" type="ffprobe:programType" minOccurs="0" maxOccurs="unbounded"/>
 | 
			
		||||
        </xsd:sequence>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="streamDispositionType">
 | 
			
		||||
      <xsd:attribute name="default"          type="xsd:int" use="required" />
 | 
			
		||||
      <xsd:attribute name="dub"              type="xsd:int" use="required" />
 | 
			
		||||
      <xsd:attribute name="original"         type="xsd:int" use="required" />
 | 
			
		||||
      <xsd:attribute name="comment"          type="xsd:int" use="required" />
 | 
			
		||||
      <xsd:attribute name="lyrics"           type="xsd:int" use="required" />
 | 
			
		||||
      <xsd:attribute name="karaoke"          type="xsd:int" use="required" />
 | 
			
		||||
      <xsd:attribute name="forced"           type="xsd:int" use="required" />
 | 
			
		||||
      <xsd:attribute name="hearing_impaired" type="xsd:int" use="required" />
 | 
			
		||||
      <xsd:attribute name="visual_impaired"  type="xsd:int" use="required" />
 | 
			
		||||
      <xsd:attribute name="clean_effects"    type="xsd:int" use="required" />
 | 
			
		||||
      <xsd:attribute name="attached_pic"     type="xsd:int" use="required" />
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="streamType">
 | 
			
		||||
      <xsd:sequence>
 | 
			
		||||
        <xsd:element name="disposition" type="ffprobe:streamDispositionType" minOccurs="0" maxOccurs="1"/>
 | 
			
		||||
        <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
 | 
			
		||||
      </xsd:sequence>
 | 
			
		||||
 | 
			
		||||
      <xsd:attribute name="index"            type="xsd:int" use="required"/>
 | 
			
		||||
      <xsd:attribute name="codec_name"       type="xsd:string" />
 | 
			
		||||
      <xsd:attribute name="codec_long_name"  type="xsd:string" />
 | 
			
		||||
      <xsd:attribute name="profile"          type="xsd:string" />
 | 
			
		||||
      <xsd:attribute name="codec_type"       type="xsd:string" />
 | 
			
		||||
      <xsd:attribute name="codec_time_base"  type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="codec_tag"        type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="codec_tag_string" type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="extradata"        type="xsd:string" />
 | 
			
		||||
 | 
			
		||||
      <!-- video attributes -->
 | 
			
		||||
      <xsd:attribute name="width"                type="xsd:int"/>
 | 
			
		||||
@@ -138,16 +102,13 @@
 | 
			
		||||
      <xsd:attribute name="sample_fmt"       type="xsd:string"/>
 | 
			
		||||
      <xsd:attribute name="sample_rate"      type="xsd:int"/>
 | 
			
		||||
      <xsd:attribute name="channels"         type="xsd:int"/>
 | 
			
		||||
      <xsd:attribute name="channel_layout"   type="xsd:string"/>
 | 
			
		||||
      <xsd:attribute name="bits_per_sample"  type="xsd:int"/>
 | 
			
		||||
 | 
			
		||||
      <xsd:attribute name="id"               type="xsd:string"/>
 | 
			
		||||
      <xsd:attribute name="r_frame_rate"     type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="avg_frame_rate"   type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="time_base"        type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="start_pts"        type="xsd:long"/>
 | 
			
		||||
      <xsd:attribute name="start_time"       type="xsd:float"/>
 | 
			
		||||
      <xsd:attribute name="duration_ts"      type="xsd:long"/>
 | 
			
		||||
      <xsd:attribute name="duration"         type="xsd:float"/>
 | 
			
		||||
      <xsd:attribute name="bit_rate"         type="xsd:int"/>
 | 
			
		||||
      <xsd:attribute name="nb_frames"        type="xsd:int"/>
 | 
			
		||||
@@ -155,23 +116,6 @@
 | 
			
		||||
      <xsd:attribute name="nb_read_packets"  type="xsd:int"/>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="programType">
 | 
			
		||||
      <xsd:sequence>
 | 
			
		||||
        <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
 | 
			
		||||
        <xsd:element name="streams" type="ffprobe:streamsType" minOccurs="0" maxOccurs="1"/>
 | 
			
		||||
      </xsd:sequence>
 | 
			
		||||
 | 
			
		||||
      <xsd:attribute name="program_id"           type="xsd:int"    use="required"/>
 | 
			
		||||
      <xsd:attribute name="program_num"          type="xsd:int"    use="required"/>
 | 
			
		||||
      <xsd:attribute name="nb_streams"           type="xsd:int"    use="required"/>
 | 
			
		||||
      <xsd:attribute name="start_time"           type="xsd:float"/>
 | 
			
		||||
      <xsd:attribute name="start_pts"            type="xsd:long"/>
 | 
			
		||||
      <xsd:attribute name="end_time"             type="xsd:float"/>
 | 
			
		||||
      <xsd:attribute name="end_pts"              type="xsd:long"/>
 | 
			
		||||
      <xsd:attribute name="pmt_pid"              type="xsd:int"    use="required"/>
 | 
			
		||||
      <xsd:attribute name="pcr_pid"              type="xsd:int"    use="required"/>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="formatType">
 | 
			
		||||
      <xsd:sequence>
 | 
			
		||||
        <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
 | 
			
		||||
@@ -179,14 +123,12 @@
 | 
			
		||||
 | 
			
		||||
      <xsd:attribute name="filename"         type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="nb_streams"       type="xsd:int"    use="required"/>
 | 
			
		||||
      <xsd:attribute name="nb_programs"      type="xsd:int"    use="required"/>
 | 
			
		||||
      <xsd:attribute name="format_name"      type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="format_long_name" type="xsd:string"/>
 | 
			
		||||
      <xsd:attribute name="format_long_name" type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="start_time"       type="xsd:float"/>
 | 
			
		||||
      <xsd:attribute name="duration"         type="xsd:float"/>
 | 
			
		||||
      <xsd:attribute name="size"             type="xsd:long"/>
 | 
			
		||||
      <xsd:attribute name="bit_rate"         type="xsd:long"/>
 | 
			
		||||
      <xsd:attribute name="probe_score"      type="xsd:int"/>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="tagType">
 | 
			
		||||
@@ -209,32 +151,12 @@
 | 
			
		||||
      <xsd:attribute name="configuration"    type="xsd:string" use="required"/>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="chaptersType">
 | 
			
		||||
      <xsd:sequence>
 | 
			
		||||
        <xsd:element name="chapter" type="ffprobe:chapterType" minOccurs="0" maxOccurs="unbounded"/>
 | 
			
		||||
      </xsd:sequence>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="chapterType">
 | 
			
		||||
      <xsd:sequence>
 | 
			
		||||
        <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
 | 
			
		||||
      </xsd:sequence>
 | 
			
		||||
 | 
			
		||||
      <xsd:attribute name="id"         type="xsd:int" use="required"/>
 | 
			
		||||
      <xsd:attribute name="time_base"  type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="start"      type="xsd:int" use="required"/>
 | 
			
		||||
      <xsd:attribute name="start_time" type="xsd:float"/>
 | 
			
		||||
      <xsd:attribute name="end"        type="xsd:int" use="required"/>
 | 
			
		||||
      <xsd:attribute name="end_time"   type="xsd:float" use="required"/>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="libraryVersionType">
 | 
			
		||||
      <xsd:attribute name="name"        type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="major"       type="xsd:int"    use="required"/>
 | 
			
		||||
      <xsd:attribute name="minor"       type="xsd:int"    use="required"/>
 | 
			
		||||
      <xsd:attribute name="micro"       type="xsd:int"    use="required"/>
 | 
			
		||||
      <xsd:attribute name="version"     type="xsd:int"    use="required"/>
 | 
			
		||||
      <xsd:attribute name="ident"       type="xsd:string" use="required"/>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="libraryVersionsType">
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,10 @@ MaxBandwidth 1000
 | 
			
		||||
# '-' is the standard output.
 | 
			
		||||
CustomLog -
 | 
			
		||||
 | 
			
		||||
# Suppress that if you want to launch ffserver as a daemon.
 | 
			
		||||
NoDaemon
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
##################################################################
 | 
			
		||||
# Definition of the live feeds. Each live feed contains one video
 | 
			
		||||
# and/or audio sequence coming from an ffmpeg encoder or another
 | 
			
		||||
 
 | 
			
		||||
@@ -9,35 +9,52 @@
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Synopsis
 | 
			
		||||
@chapter Synopsys
 | 
			
		||||
 | 
			
		||||
ffserver [@var{options}]
 | 
			
		||||
The generic syntax is:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
@c man begin SYNOPSIS
 | 
			
		||||
ffserver [options]
 | 
			
		||||
@c man end
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@command{ffserver} is a streaming server for both audio and video. It
 | 
			
		||||
supports several live feeds, streaming from files and time shifting on
 | 
			
		||||
live feeds (you can seek to positions in the past on each live feed,
 | 
			
		||||
provided you specify a big enough feed storage in
 | 
			
		||||
@file{ffserver.conf}).
 | 
			
		||||
ffserver is a streaming server for both audio and video. It supports
 | 
			
		||||
 | 
			
		||||
@command{ffserver} receives prerecorded files or FFM streams from some
 | 
			
		||||
@command{ffmpeg} instance as input, then streams them over
 | 
			
		||||
RTP/RTSP/HTTP.
 | 
			
		||||
several live feeds, streaming from files and time shifting on live feeds
 | 
			
		||||
(you can seek to positions in the past on each live feed, provided you
 | 
			
		||||
specify a big enough feed storage in ffserver.conf).
 | 
			
		||||
 | 
			
		||||
An @command{ffserver} instance will listen on some port as specified
 | 
			
		||||
in the configuration file. You can launch one or more instances of
 | 
			
		||||
@command{ffmpeg} and send one or more FFM streams to the port where
 | 
			
		||||
ffserver is expecting to receive them. Alternately, you can make
 | 
			
		||||
@command{ffserver} launch such @command{ffmpeg} instances at startup.
 | 
			
		||||
ffserver runs in daemon mode by default; that is, it puts itself in
 | 
			
		||||
the background and detaches from its TTY, unless it is launched in
 | 
			
		||||
debug mode or a NoDaemon option is specified in the configuration
 | 
			
		||||
file.
 | 
			
		||||
 | 
			
		||||
Input streams are called feeds, and each one is specified by a
 | 
			
		||||
@code{<Feed>} section in the configuration file.
 | 
			
		||||
This documentation covers only the streaming aspects of ffserver /
 | 
			
		||||
ffmpeg. All questions about parameters for ffmpeg, codec questions,
 | 
			
		||||
etc. are not covered here. Read @file{ffmpeg.html} for more
 | 
			
		||||
information.
 | 
			
		||||
 | 
			
		||||
@section How does it work?
 | 
			
		||||
 | 
			
		||||
ffserver receives prerecorded files or FFM streams from some ffmpeg
 | 
			
		||||
instance as input, then streams them over RTP/RTSP/HTTP.
 | 
			
		||||
 | 
			
		||||
An ffserver instance will listen on some port as specified in the
 | 
			
		||||
configuration file. You can launch one or more instances of ffmpeg and
 | 
			
		||||
send one or more FFM streams to the port where ffserver is expecting
 | 
			
		||||
to receive them. Alternately, you can make ffserver launch such ffmpeg
 | 
			
		||||
instances at startup.
 | 
			
		||||
 | 
			
		||||
Input streams are called feeds, and each one is specified by a <Feed>
 | 
			
		||||
section in the configuration file.
 | 
			
		||||
 | 
			
		||||
For each feed you can have different output streams in various
 | 
			
		||||
formats, each one specified by a @code{<Stream>} section in the
 | 
			
		||||
configuration file.
 | 
			
		||||
formats, each one specified by a <Stream> section in the configuration
 | 
			
		||||
file.
 | 
			
		||||
 | 
			
		||||
@section Status stream
 | 
			
		||||
 | 
			
		||||
@@ -73,6 +90,14 @@ web server can be used to serve up the files just as well.
 | 
			
		||||
It can stream prerecorded video from .ffm files, though it is somewhat tricky
 | 
			
		||||
to make it work correctly.
 | 
			
		||||
 | 
			
		||||
@section What do I need?
 | 
			
		||||
 | 
			
		||||
I use Linux on a 900 MHz Duron with a cheapo Bt848 based TV capture card. I'm
 | 
			
		||||
using stock Linux 2.4.17 with the stock drivers. [Actually that isn't true,
 | 
			
		||||
I needed some special drivers for my motherboard-based sound card.]
 | 
			
		||||
 | 
			
		||||
I understand that FreeBSD systems work just fine as well.
 | 
			
		||||
 | 
			
		||||
@section How do I make it work?
 | 
			
		||||
 | 
			
		||||
First, build the kit. It *really* helps to have installed LAME first. Then when
 | 
			
		||||
@@ -213,23 +238,10 @@ You use this by adding the ?date= to the end of the URL for the stream.
 | 
			
		||||
For example:   @samp{http://localhost:8080/test.asf?date=2002-07-26T23:05:00}.
 | 
			
		||||
@c man end
 | 
			
		||||
 | 
			
		||||
@section What is FFM, FFM2
 | 
			
		||||
 | 
			
		||||
FFM and FFM2 are formats used by ffserver. They allow storing a wide variety of
 | 
			
		||||
video and audio streams and encoding options, and can store a moving time segment
 | 
			
		||||
of an infinite movie or a whole movie.
 | 
			
		||||
 | 
			
		||||
FFM is version specific, and there is limited compatibility of FFM files
 | 
			
		||||
generated by one version of ffmpeg/ffserver and another version of
 | 
			
		||||
ffmpeg/ffserver. It may work but it is not guaranteed to work.
 | 
			
		||||
 | 
			
		||||
FFM2 is extensible while maintaining compatibility and should work between
 | 
			
		||||
differing versions of tools. FFM2 is the default.
 | 
			
		||||
 | 
			
		||||
@chapter Options
 | 
			
		||||
@c man begin OPTIONS
 | 
			
		||||
 | 
			
		||||
@include fftools-common-opts.texi
 | 
			
		||||
@include avtools-common-opts.texi
 | 
			
		||||
 | 
			
		||||
@section Main options
 | 
			
		||||
 | 
			
		||||
@@ -242,79 +254,26 @@ within the various <Stream> sections. Since ffserver will not launch
 | 
			
		||||
any ffmpeg instances, you will have to launch them manually.
 | 
			
		||||
@item -d
 | 
			
		||||
Enable debug mode. This option increases log verbosity, directs log
 | 
			
		||||
messages to stdout.
 | 
			
		||||
messages to stdout and causes ffserver to run in the foreground
 | 
			
		||||
rather than as a daemon.
 | 
			
		||||
@end table
 | 
			
		||||
@c man end
 | 
			
		||||
 | 
			
		||||
@include config.texi
 | 
			
		||||
@ifset config-all
 | 
			
		||||
@ifset config-avutil
 | 
			
		||||
@include utils.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avcodec
 | 
			
		||||
@include codecs.texi
 | 
			
		||||
@include bitstream_filters.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avformat
 | 
			
		||||
@include formats.texi
 | 
			
		||||
@include protocols.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avdevice
 | 
			
		||||
@include devices.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-swresample
 | 
			
		||||
@include resampler.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-swscale
 | 
			
		||||
@include scaler.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-avfilter
 | 
			
		||||
@include filters.texi
 | 
			
		||||
@end ifset
 | 
			
		||||
@end ifset
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@ifset config-all
 | 
			
		||||
@url{ffserver.html,ffserver},
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-not-all
 | 
			
		||||
@url{ffserver-all.html,ffserver-all},
 | 
			
		||||
@end ifset
 | 
			
		||||
the @file{doc/ffserver.conf} example,
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe},
 | 
			
		||||
@url{ffmpeg-utils.html,ffmpeg-utils},
 | 
			
		||||
@url{ffmpeg-scaler.html,ffmpeg-scaler},
 | 
			
		||||
@url{ffmpeg-resampler.html,ffmpeg-resampler},
 | 
			
		||||
@url{ffmpeg-codecs.html,ffmpeg-codecs},
 | 
			
		||||
@url{ffmpeg-bitstream-filters.html,ffmpeg-bitstream-filters},
 | 
			
		||||
@url{ffmpeg-formats.html,ffmpeg-formats},
 | 
			
		||||
@url{ffmpeg-devices.html,ffmpeg-devices},
 | 
			
		||||
@url{ffmpeg-protocols.html,ffmpeg-protocols},
 | 
			
		||||
@url{ffmpeg-filters.html,ffmpeg-filters}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
@ifset config-all
 | 
			
		||||
ffserver(1),
 | 
			
		||||
@end ifset
 | 
			
		||||
@ifset config-not-all
 | 
			
		||||
ffserver-all(1),
 | 
			
		||||
@end ifset
 | 
			
		||||
the @file{doc/ffserver.conf} example, ffmpeg(1), ffplay(1), ffprobe(1),
 | 
			
		||||
ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1),
 | 
			
		||||
ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1),
 | 
			
		||||
ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename ffserver
 | 
			
		||||
@settitle ffserver video server
 | 
			
		||||
 | 
			
		||||
@c man begin SEEALSO
 | 
			
		||||
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), the @file{ffserver.conf}
 | 
			
		||||
example and the FFmpeg HTML documentation
 | 
			
		||||
@c man end
 | 
			
		||||
 | 
			
		||||
@c man begin AUTHORS
 | 
			
		||||
The FFmpeg developers
 | 
			
		||||
@c man end
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
 
 | 
			
		||||
@@ -1,292 +0,0 @@
 | 
			
		||||
All the numerical options, if not specified otherwise, accept a string
 | 
			
		||||
representing a number as input, which may be followed by one of the SI
 | 
			
		||||
unit prefixes, for example: 'K', 'M', or 'G'.
 | 
			
		||||
 | 
			
		||||
If 'i' is appended to the SI unit prefix, the complete prefix will be
 | 
			
		||||
interpreted as a unit prefix for binary multiplies, which are based on
 | 
			
		||||
powers of 1024 instead of powers of 1000. Appending 'B' to the SI unit
 | 
			
		||||
prefix multiplies the value by 8. This allows using, for example:
 | 
			
		||||
'KB', 'MiB', 'G' and 'B' as number suffixes.
 | 
			
		||||
 | 
			
		||||
Options which do not take arguments are boolean options, and set the
 | 
			
		||||
corresponding value to true. They can be set to false by prefixing
 | 
			
		||||
the option name with "no". For example using "-nofoo"
 | 
			
		||||
will set the boolean option with name "foo" to false.
 | 
			
		||||
 | 
			
		||||
@anchor{Stream specifiers}
 | 
			
		||||
@section Stream specifiers
 | 
			
		||||
Some options are applied per-stream, e.g. bitrate or codec. Stream specifiers
 | 
			
		||||
are used to precisely specify which stream(s) a given option belongs to.
 | 
			
		||||
 | 
			
		||||
A stream specifier is a string generally appended to the option name and
 | 
			
		||||
separated from it by a colon. E.g. @code{-codec:a:1 ac3} contains the
 | 
			
		||||
@code{a:1} stream specifier, which matches the second audio stream. Therefore, it
 | 
			
		||||
would select the ac3 codec for the second audio stream.
 | 
			
		||||
 | 
			
		||||
A stream specifier can match several streams, so that the option is applied to all
 | 
			
		||||
of them. E.g. the stream specifier in @code{-b:a 128k} matches all audio
 | 
			
		||||
streams.
 | 
			
		||||
 | 
			
		||||
An empty stream specifier matches all streams. For example, @code{-codec copy}
 | 
			
		||||
or @code{-codec: copy} would copy all the streams without reencoding.
 | 
			
		||||
 | 
			
		||||
Possible forms of stream specifiers are:
 | 
			
		||||
@table @option
 | 
			
		||||
@item @var{stream_index}
 | 
			
		||||
Matches the stream with this index. E.g. @code{-threads:1 4} would set the
 | 
			
		||||
thread count for the second stream to 4.
 | 
			
		||||
@item @var{stream_type}[:@var{stream_index}]
 | 
			
		||||
@var{stream_type} is one of following: 'v' for video, 'a' for audio, 's' for subtitle,
 | 
			
		||||
'd' for data, and 't' for attachments. If @var{stream_index} is given, then it matches
 | 
			
		||||
stream number @var{stream_index} of this type. Otherwise, it matches all
 | 
			
		||||
streams of this type.
 | 
			
		||||
@item p:@var{program_id}[:@var{stream_index}]
 | 
			
		||||
If @var{stream_index} is given, then it matches the stream with number @var{stream_index}
 | 
			
		||||
in the program with the id @var{program_id}. Otherwise, it matches all streams in the
 | 
			
		||||
program.
 | 
			
		||||
@item #@var{stream_id}
 | 
			
		||||
Matches the stream by a format-specific ID.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section Generic options
 | 
			
		||||
 | 
			
		||||
These options are shared amongst the ff* tools.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item -L
 | 
			
		||||
Show license.
 | 
			
		||||
 | 
			
		||||
@item -h, -?, -help, --help [@var{arg}]
 | 
			
		||||
Show help. An optional parameter may be specified to print help about a specific
 | 
			
		||||
item. If no argument is specified, only basic (non advanced) tool
 | 
			
		||||
options are shown.
 | 
			
		||||
 | 
			
		||||
Possible values of @var{arg} are:
 | 
			
		||||
@table @option
 | 
			
		||||
@item long
 | 
			
		||||
Print advanced tool options in addition to the basic tool options.
 | 
			
		||||
 | 
			
		||||
@item full
 | 
			
		||||
Print complete list of options, including shared and private options
 | 
			
		||||
for encoders, decoders, demuxers, muxers, filters, etc.
 | 
			
		||||
 | 
			
		||||
@item decoder=@var{decoder_name}
 | 
			
		||||
Print detailed information about the decoder named @var{decoder_name}. Use the
 | 
			
		||||
@option{-decoders} option to get a list of all decoders.
 | 
			
		||||
 | 
			
		||||
@item encoder=@var{encoder_name}
 | 
			
		||||
Print detailed information about the encoder named @var{encoder_name}. Use the
 | 
			
		||||
@option{-encoders} option to get a list of all encoders.
 | 
			
		||||
 | 
			
		||||
@item demuxer=@var{demuxer_name}
 | 
			
		||||
Print detailed information about the demuxer named @var{demuxer_name}. Use the
 | 
			
		||||
@option{-formats} option to get a list of all demuxers and muxers.
 | 
			
		||||
 | 
			
		||||
@item muxer=@var{muxer_name}
 | 
			
		||||
Print detailed information about the muxer named @var{muxer_name}. Use the
 | 
			
		||||
@option{-formats} option to get a list of all muxers and demuxers.
 | 
			
		||||
 | 
			
		||||
@item filter=@var{filter_name}
 | 
			
		||||
Print detailed information about the filter name @var{filter_name}. Use the
 | 
			
		||||
@option{-filters} option to get a list of all filters.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item -version
 | 
			
		||||
Show version.
 | 
			
		||||
 | 
			
		||||
@item -formats
 | 
			
		||||
Show available formats.
 | 
			
		||||
 | 
			
		||||
@item -codecs
 | 
			
		||||
Show all codecs known to libavcodec.
 | 
			
		||||
 | 
			
		||||
Note that the term 'codec' is used throughout this documentation as a shortcut
 | 
			
		||||
for what is more correctly called a media bitstream format.
 | 
			
		||||
 | 
			
		||||
@item -decoders
 | 
			
		||||
Show available decoders.
 | 
			
		||||
 | 
			
		||||
@item -encoders
 | 
			
		||||
Show all available encoders.
 | 
			
		||||
 | 
			
		||||
@item -bsfs
 | 
			
		||||
Show available bitstream filters.
 | 
			
		||||
 | 
			
		||||
@item -protocols
 | 
			
		||||
Show available protocols.
 | 
			
		||||
 | 
			
		||||
@item -filters
 | 
			
		||||
Show available libavfilter filters.
 | 
			
		||||
 | 
			
		||||
@item -pix_fmts
 | 
			
		||||
Show available pixel formats.
 | 
			
		||||
 | 
			
		||||
@item -sample_fmts
 | 
			
		||||
Show available sample formats.
 | 
			
		||||
 | 
			
		||||
@item -layouts
 | 
			
		||||
Show channel names and standard channel layouts.
 | 
			
		||||
 | 
			
		||||
@item -colors
 | 
			
		||||
Show recognized color names.
 | 
			
		||||
 | 
			
		||||
@item -loglevel [repeat+]@var{loglevel} | -v [repeat+]@var{loglevel}
 | 
			
		||||
Set the logging level used by the library.
 | 
			
		||||
Adding "repeat+" indicates that repeated log output should not be compressed
 | 
			
		||||
to the first line and the "Last message repeated n times" line will be
 | 
			
		||||
omitted. "repeat" can also be used alone.
 | 
			
		||||
If "repeat" is used alone, and with no prior loglevel set, the default
 | 
			
		||||
loglevel will be used. If multiple loglevel parameters are given, using
 | 
			
		||||
'repeat' will not change the loglevel.
 | 
			
		||||
@var{loglevel} is a number or a string containing one of the following values:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item quiet
 | 
			
		||||
Show nothing at all; be silent.
 | 
			
		||||
@item panic
 | 
			
		||||
Only show fatal errors which could lead the process to crash, such as
 | 
			
		||||
and assert failure. This is not currently used for anything.
 | 
			
		||||
@item fatal
 | 
			
		||||
Only show fatal errors. These are errors after which the process absolutely
 | 
			
		||||
cannot continue after.
 | 
			
		||||
@item error
 | 
			
		||||
Show all errors, including ones which can be recovered from.
 | 
			
		||||
@item warning
 | 
			
		||||
Show all warnings and errors. Any message related to possibly
 | 
			
		||||
incorrect or unexpected events will be shown.
 | 
			
		||||
@item info
 | 
			
		||||
Show informative messages during processing. This is in addition to
 | 
			
		||||
warnings and errors. This is the default value.
 | 
			
		||||
@item verbose
 | 
			
		||||
Same as @code{info}, except more verbose.
 | 
			
		||||
@item debug
 | 
			
		||||
Show everything, including debugging information.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
By default the program logs to stderr, if coloring is supported by the
 | 
			
		||||
terminal, colors are used to mark errors and warnings. Log coloring
 | 
			
		||||
can be disabled setting the environment variable
 | 
			
		||||
@env{AV_LOG_FORCE_NOCOLOR} or @env{NO_COLOR}, or can be forced setting
 | 
			
		||||
the environment variable @env{AV_LOG_FORCE_COLOR}.
 | 
			
		||||
The use of the environment variable @env{NO_COLOR} is deprecated and
 | 
			
		||||
will be dropped in a following FFmpeg version.
 | 
			
		||||
 | 
			
		||||
@item -report
 | 
			
		||||
Dump full command line and console output to a file named
 | 
			
		||||
@code{@var{program}-@var{YYYYMMDD}-@var{HHMMSS}.log} in the current
 | 
			
		||||
directory.
 | 
			
		||||
This file can be useful for bug reports.
 | 
			
		||||
It also implies @code{-loglevel verbose}.
 | 
			
		||||
 | 
			
		||||
Setting the environment variable @code{FFREPORT} to any value has the
 | 
			
		||||
same effect. If the value is a ':'-separated key=value sequence, these
 | 
			
		||||
options will affect the report; options values must be escaped if they
 | 
			
		||||
contain special characters or the options delimiter ':' (see the
 | 
			
		||||
``Quoting and escaping'' section in the ffmpeg-utils manual). The
 | 
			
		||||
following option is recognized:
 | 
			
		||||
@table @option
 | 
			
		||||
@item file
 | 
			
		||||
set the file name to use for the report; @code{%p} is expanded to the name
 | 
			
		||||
of the program, @code{%t} is expanded to a timestamp, @code{%%} is expanded
 | 
			
		||||
to a plain @code{%}
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Errors in parsing the environment variable are not fatal, and will not
 | 
			
		||||
appear in the report.
 | 
			
		||||
 | 
			
		||||
@item -cpuflags flags (@emph{global})
 | 
			
		||||
Allows setting and clearing cpu flags. This option is intended
 | 
			
		||||
for testing. Do not use it unless you know what you're doing.
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -cpuflags -sse+mmx ...
 | 
			
		||||
ffmpeg -cpuflags mmx ...
 | 
			
		||||
ffmpeg -cpuflags 0 ...
 | 
			
		||||
@end example
 | 
			
		||||
Possible flags for this option are:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item x86
 | 
			
		||||
@table @samp
 | 
			
		||||
@item mmx
 | 
			
		||||
@item mmxext
 | 
			
		||||
@item sse
 | 
			
		||||
@item sse2
 | 
			
		||||
@item sse2slow
 | 
			
		||||
@item sse3
 | 
			
		||||
@item sse3slow
 | 
			
		||||
@item ssse3
 | 
			
		||||
@item atom
 | 
			
		||||
@item sse4.1
 | 
			
		||||
@item sse4.2
 | 
			
		||||
@item avx
 | 
			
		||||
@item xop
 | 
			
		||||
@item fma4
 | 
			
		||||
@item 3dnow
 | 
			
		||||
@item 3dnowext
 | 
			
		||||
@item cmov
 | 
			
		||||
@end table
 | 
			
		||||
@item ARM
 | 
			
		||||
@table @samp
 | 
			
		||||
@item armv5te
 | 
			
		||||
@item armv6
 | 
			
		||||
@item armv6t2
 | 
			
		||||
@item vfp
 | 
			
		||||
@item vfpv3
 | 
			
		||||
@item neon
 | 
			
		||||
@end table
 | 
			
		||||
@item PowerPC
 | 
			
		||||
@table @samp
 | 
			
		||||
@item altivec
 | 
			
		||||
@end table
 | 
			
		||||
@item Specific Processors
 | 
			
		||||
@table @samp
 | 
			
		||||
@item pentium2
 | 
			
		||||
@item pentium3
 | 
			
		||||
@item pentium4
 | 
			
		||||
@item k6
 | 
			
		||||
@item k62
 | 
			
		||||
@item athlon
 | 
			
		||||
@item athlonxp
 | 
			
		||||
@item k8
 | 
			
		||||
@end table
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item -opencl_options options (@emph{global})
 | 
			
		||||
Set OpenCL environment options. This option is only available when
 | 
			
		||||
FFmpeg has been compiled with @code{--enable-opencl}.
 | 
			
		||||
 | 
			
		||||
@var{options} must be a list of @var{key}=@var{value} option pairs
 | 
			
		||||
separated by ':'. See the ``OpenCL Options'' section in the
 | 
			
		||||
ffmpeg-utils manual for the list of supported options.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section AVOptions
 | 
			
		||||
 | 
			
		||||
These options are provided directly by the libavformat, libavdevice and
 | 
			
		||||
libavcodec libraries. To see the list of available AVOptions, use the
 | 
			
		||||
@option{-help} option. They are separated into two categories:
 | 
			
		||||
@table @option
 | 
			
		||||
@item generic
 | 
			
		||||
These options can be set for any container, codec or device. Generic options
 | 
			
		||||
are listed under AVFormatContext options for containers/devices and under
 | 
			
		||||
AVCodecContext options for codecs.
 | 
			
		||||
@item private
 | 
			
		||||
These options are specific to the given container, device or codec. Private
 | 
			
		||||
options are listed under their corresponding containers/devices/codecs.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
For example to write an ID3v2.3 header instead of a default ID3v2.4 to
 | 
			
		||||
an MP3 file, use the @option{id3v2_version} private option of the MP3
 | 
			
		||||
muxer:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i input.flac -id3v2_version 3 out.mp3
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
All codec AVOptions are per-stream, and thus a stream specifier
 | 
			
		||||
should be attached to them.
 | 
			
		||||
 | 
			
		||||
Note: the @option{-nooption} syntax cannot be used for boolean
 | 
			
		||||
AVOptions, use @option{-option 0}/@option{-option 1}.
 | 
			
		||||
 | 
			
		||||
Note: the old undocumented way of specifying per-stream AVOptions by
 | 
			
		||||
prepending v/a/s to the options name is now obsolete and will be
 | 
			
		||||
removed soon.
 | 
			
		||||
@@ -12,172 +12,28 @@ Format negotiation
 | 
			
		||||
==================
 | 
			
		||||
 | 
			
		||||
  The query_formats method should set, for each input and each output links,
 | 
			
		||||
  the list of supported formats.
 | 
			
		||||
  the list supported formats.
 | 
			
		||||
 | 
			
		||||
  For video links, that means pixel format. For audio links, that means
 | 
			
		||||
  channel layout, sample format (the sample packing is implied by the sample
 | 
			
		||||
  format) and sample rate.
 | 
			
		||||
  channel layout, and sample format (the sample packing is implied by the
 | 
			
		||||
  sample format).
 | 
			
		||||
 | 
			
		||||
  The lists are not just lists, they are references to shared objects. When
 | 
			
		||||
  the negotiation mechanism computes the intersection of the formats
 | 
			
		||||
  supported at each end of a link, all references to both lists are replaced
 | 
			
		||||
  with a reference to the intersection. And when a single format is
 | 
			
		||||
  supported at each ends of a link, all references to both lists are
 | 
			
		||||
  replaced with a reference to the intersection. And when a single format is
 | 
			
		||||
  eventually chosen for a link amongst the remaining list, again, all
 | 
			
		||||
  references to the list are updated.
 | 
			
		||||
 | 
			
		||||
  That means that if a filter requires that its input and output have the
 | 
			
		||||
  same format amongst a supported list, all it has to do is use a reference
 | 
			
		||||
  same format amongst a supported list, all it have to do is use a reference
 | 
			
		||||
  to the same list of formats.
 | 
			
		||||
 | 
			
		||||
  query_formats can leave some formats unset and return AVERROR(EAGAIN) to
 | 
			
		||||
  cause the negotiation mechanism to try again later. That can be used by
 | 
			
		||||
  filters with complex requirements to use the format negotiated on one link
 | 
			
		||||
  to set the formats supported on another.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Buffer references ownership and permissions
 | 
			
		||||
===========================================
 | 
			
		||||
 | 
			
		||||
  Principle
 | 
			
		||||
  ---------
 | 
			
		||||
 | 
			
		||||
    Audio and video data are voluminous; the buffer and buffer reference
 | 
			
		||||
    mechanism is intended to avoid, as much as possible, expensive copies of
 | 
			
		||||
    that data while still allowing the filters to produce correct results.
 | 
			
		||||
 | 
			
		||||
    The data is stored in buffers represented by AVFilterBuffer structures.
 | 
			
		||||
    They must not be accessed directly, but through references stored in
 | 
			
		||||
    AVFilterBufferRef structures. Several references can point to the
 | 
			
		||||
    same buffer; the buffer is automatically deallocated once all
 | 
			
		||||
    corresponding references have been destroyed.
 | 
			
		||||
 | 
			
		||||
    The characteristics of the data (resolution, sample rate, etc.) are
 | 
			
		||||
    stored in the reference; different references for the same buffer can
 | 
			
		||||
    show different characteristics. In particular, a video reference can
 | 
			
		||||
    point to only a part of a video buffer.
 | 
			
		||||
 | 
			
		||||
    A reference is usually obtained as input to the start_frame or
 | 
			
		||||
    filter_frame method or requested using the ff_get_video_buffer or
 | 
			
		||||
    ff_get_audio_buffer functions. A new reference on an existing buffer can
 | 
			
		||||
    be created with the avfilter_ref_buffer. A reference is destroyed using
 | 
			
		||||
    the avfilter_unref_bufferp function.
 | 
			
		||||
 | 
			
		||||
  Reference ownership
 | 
			
		||||
  -------------------
 | 
			
		||||
 | 
			
		||||
    At any time, a reference “belongs” to a particular piece of code,
 | 
			
		||||
    usually a filter. With a few caveats that will be explained below, only
 | 
			
		||||
    that piece of code is allowed to access it. It is also responsible for
 | 
			
		||||
    destroying it, although this is sometimes done automatically (see the
 | 
			
		||||
    section on link reference fields).
 | 
			
		||||
 | 
			
		||||
    Here are the (fairly obvious) rules for reference ownership:
 | 
			
		||||
 | 
			
		||||
    * A reference received by the filter_frame method (or its start_frame
 | 
			
		||||
      deprecated version) belongs to the corresponding filter.
 | 
			
		||||
 | 
			
		||||
      Special exception: for video references: the reference may be used
 | 
			
		||||
      internally for automatic copying and must not be destroyed before
 | 
			
		||||
      end_frame; it can be given away to ff_start_frame.
 | 
			
		||||
 | 
			
		||||
    * A reference passed to ff_filter_frame (or the deprecated
 | 
			
		||||
      ff_start_frame) is given away and must no longer be used.
 | 
			
		||||
 | 
			
		||||
    * A reference created with avfilter_ref_buffer belongs to the code that
 | 
			
		||||
      created it.
 | 
			
		||||
 | 
			
		||||
    * A reference obtained with ff_get_video_buffer or ff_get_audio_buffer
 | 
			
		||||
      belongs to the code that requested it.
 | 
			
		||||
 | 
			
		||||
    * A reference given as return value by the get_video_buffer or
 | 
			
		||||
      get_audio_buffer method is given away and must no longer be used.
 | 
			
		||||
 | 
			
		||||
  Link reference fields
 | 
			
		||||
  ---------------------
 | 
			
		||||
 | 
			
		||||
    The AVFilterLink structure has a few AVFilterBufferRef fields. The
 | 
			
		||||
    cur_buf and out_buf were used with the deprecated
 | 
			
		||||
    start_frame/draw_slice/end_frame API and should no longer be used.
 | 
			
		||||
    src_buf, cur_buf_copy and partial_buf are used by libavfilter internally
 | 
			
		||||
    and must not be accessed by filters.
 | 
			
		||||
 | 
			
		||||
  Reference permissions
 | 
			
		||||
  ---------------------
 | 
			
		||||
 | 
			
		||||
    The AVFilterBufferRef structure has a perms field that describes what
 | 
			
		||||
    the code that owns the reference is allowed to do to the buffer data.
 | 
			
		||||
    Different references for the same buffer can have different permissions.
 | 
			
		||||
 | 
			
		||||
    For video filters that implement the deprecated
 | 
			
		||||
    start_frame/draw_slice/end_frame API, the permissions only apply to the
 | 
			
		||||
    parts of the buffer that have already been covered by the draw_slice
 | 
			
		||||
    method.
 | 
			
		||||
 | 
			
		||||
    The value is a binary OR of the following constants:
 | 
			
		||||
 | 
			
		||||
    * AV_PERM_READ: the owner can read the buffer data; this is essentially
 | 
			
		||||
      always true and is there for self-documentation.
 | 
			
		||||
 | 
			
		||||
    * AV_PERM_WRITE: the owner can modify the buffer data.
 | 
			
		||||
 | 
			
		||||
    * AV_PERM_PRESERVE: the owner can rely on the fact that the buffer data
 | 
			
		||||
      will not be modified by previous filters.
 | 
			
		||||
 | 
			
		||||
    * AV_PERM_REUSE: the owner can output the buffer several times, without
 | 
			
		||||
      modifying the data in between.
 | 
			
		||||
 | 
			
		||||
    * AV_PERM_REUSE2: the owner can output the buffer several times and
 | 
			
		||||
      modify the data in between (useless without the WRITE permissions).
 | 
			
		||||
 | 
			
		||||
    * AV_PERM_ALIGN: the owner can access the data using fast operations
 | 
			
		||||
      that require data alignment.
 | 
			
		||||
 | 
			
		||||
    The READ, WRITE and PRESERVE permissions are about sharing the same
 | 
			
		||||
    buffer between several filters to avoid expensive copies without them
 | 
			
		||||
    doing conflicting changes on the data.
 | 
			
		||||
 | 
			
		||||
    The REUSE and REUSE2 permissions are about special memory for direct
 | 
			
		||||
    rendering. For example a buffer directly allocated in video memory must
 | 
			
		||||
    not modified once it is displayed on screen, or it will cause tearing;
 | 
			
		||||
    it will therefore not have the REUSE2 permission.
 | 
			
		||||
 | 
			
		||||
    The ALIGN permission is about extracting part of the buffer, for
 | 
			
		||||
    copy-less padding or cropping for example.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    References received on input pads are guaranteed to have all the
 | 
			
		||||
    permissions stated in the min_perms field and none of the permissions
 | 
			
		||||
    stated in the rej_perms.
 | 
			
		||||
 | 
			
		||||
    References obtained by ff_get_video_buffer and ff_get_audio_buffer are
 | 
			
		||||
    guaranteed to have at least all the permissions requested as argument.
 | 
			
		||||
 | 
			
		||||
    References created by avfilter_ref_buffer have the same permissions as
 | 
			
		||||
    the original reference minus the ones explicitly masked; the mask is
 | 
			
		||||
    usually ~0 to keep the same permissions.
 | 
			
		||||
 | 
			
		||||
    Filters should remove permissions on reference they give to output
 | 
			
		||||
    whenever necessary. It can be automatically done by setting the
 | 
			
		||||
    rej_perms field on the output pad.
 | 
			
		||||
 | 
			
		||||
    Here are a few guidelines corresponding to common situations:
 | 
			
		||||
 | 
			
		||||
    * Filters that modify and forward their frame (like drawtext) need the
 | 
			
		||||
      WRITE permission.
 | 
			
		||||
 | 
			
		||||
    * Filters that read their input to produce a new frame on output (like
 | 
			
		||||
      scale) need the READ permission on input and must request a buffer
 | 
			
		||||
      with the WRITE permission.
 | 
			
		||||
 | 
			
		||||
    * Filters that intend to keep a reference after the filtering process
 | 
			
		||||
      is finished (after filter_frame returns) must have the PRESERVE
 | 
			
		||||
      permission on it and remove the WRITE permission if they create a new
 | 
			
		||||
      reference to give it away.
 | 
			
		||||
 | 
			
		||||
    * Filters that intend to modify a reference they have kept after the end
 | 
			
		||||
      of the filtering process need the REUSE2 permission and must remove
 | 
			
		||||
      the PRESERVE permission if they create a new reference to give it
 | 
			
		||||
      away.
 | 
			
		||||
  TODO
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Frame scheduling
 | 
			
		||||
@@ -189,11 +45,11 @@ Frame scheduling
 | 
			
		||||
  Simple filters that output one frame for each input frame should not have
 | 
			
		||||
  to worry about it.
 | 
			
		||||
 | 
			
		||||
  filter_frame
 | 
			
		||||
  ------------
 | 
			
		||||
  start_frame / filter_samples
 | 
			
		||||
  ----------------------------
 | 
			
		||||
 | 
			
		||||
    This method is called when a frame is pushed to the filter's input. It
 | 
			
		||||
    can be called at any time except in a reentrant way.
 | 
			
		||||
    These methods are called when a frame is pushed to the filter's input.
 | 
			
		||||
    They can be called at any time except in a reentrant way.
 | 
			
		||||
 | 
			
		||||
    If the input frame is enough to produce output, then the filter should
 | 
			
		||||
    push the output frames on the output link immediately.
 | 
			
		||||
@@ -204,7 +60,7 @@ Frame scheduling
 | 
			
		||||
    filter; these buffered frames must be flushed immediately if a new input
 | 
			
		||||
    produces new output.
 | 
			
		||||
 | 
			
		||||
    (Example: frame rate-doubling filter: filter_frame must (1) flush the
 | 
			
		||||
    (Example: framerate-doubling filter: start_frame must (1) flush the
 | 
			
		||||
    second copy of the previous frame, if it is still there, (2) push the
 | 
			
		||||
    first copy of the incoming frame, (3) keep the second copy for later.)
 | 
			
		||||
 | 
			
		||||
@@ -214,7 +70,7 @@ Frame scheduling
 | 
			
		||||
    request_frame method or the application.
 | 
			
		||||
 | 
			
		||||
    If a filter has several inputs, the filter must be ready for frames
 | 
			
		||||
    arriving randomly on any input. Therefore, any filter with several inputs
 | 
			
		||||
    arriving randomly on any input. Therefore, any filter with several input
 | 
			
		||||
    will most likely require some kind of queuing mechanism. It is perfectly
 | 
			
		||||
    acceptable to have a limited queue and to drop frames when the inputs
 | 
			
		||||
    are too unbalanced.
 | 
			
		||||
@@ -224,12 +80,12 @@ Frame scheduling
 | 
			
		||||
 | 
			
		||||
    This method is called when a frame is wanted on an output.
 | 
			
		||||
 | 
			
		||||
    For an input, it should directly call filter_frame on the corresponding
 | 
			
		||||
    output.
 | 
			
		||||
    For an input, it should directly call start_frame or filter_samples on
 | 
			
		||||
    the corresponding output.
 | 
			
		||||
 | 
			
		||||
    For a filter, if there are queued frames already ready, one of these
 | 
			
		||||
    frames should be pushed. If not, the filter should request a frame on
 | 
			
		||||
    one of its inputs, repeatedly until at least one frame has been pushed.
 | 
			
		||||
    one of its input, repeatedly until at least one frame has been pushed.
 | 
			
		||||
 | 
			
		||||
    Return values:
 | 
			
		||||
    if request_frame could produce a frame, it should return 0;
 | 
			
		||||
@@ -246,7 +102,7 @@ Frame scheduling
 | 
			
		||||
        }
 | 
			
		||||
        while (!frame_pushed) {
 | 
			
		||||
            input = input_where_a_frame_is_most_needed();
 | 
			
		||||
            ret = ff_request_frame(input);
 | 
			
		||||
            ret = avfilter_request_frame(input);
 | 
			
		||||
            if (ret == AVERROR_EOF) {
 | 
			
		||||
                process_eof_on_input();
 | 
			
		||||
            } else if (ret < 0) {
 | 
			
		||||
@@ -257,14 +113,4 @@ Frame scheduling
 | 
			
		||||
 | 
			
		||||
    Note that, except for filters that can have queued frames, request_frame
 | 
			
		||||
    does not push frames: it requests them to its input, and as a reaction,
 | 
			
		||||
    the filter_frame method will be called and do the work.
 | 
			
		||||
 | 
			
		||||
Legacy API
 | 
			
		||||
==========
 | 
			
		||||
 | 
			
		||||
  Until libavfilter 3.23, the filter_frame method was split:
 | 
			
		||||
 | 
			
		||||
  - for video filters, it was made of start_frame, draw_slice (that could be
 | 
			
		||||
    called several times on distinct parts of the frame) and end_frame;
 | 
			
		||||
 | 
			
		||||
  - for audio filters, it was called filter_samples.
 | 
			
		||||
    the start_frame / filter_samples method will be called and do the work.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8667
									
								
								doc/filters.texi
									
									
									
									
									
								
							
							
						
						
									
										8667
									
								
								doc/filters.texi
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										188
									
								
								doc/formats.texi
									
									
									
									
									
								
							
							
						
						
									
										188
									
								
								doc/formats.texi
									
									
									
									
									
								
							@@ -1,188 +0,0 @@
 | 
			
		||||
@chapter Format Options
 | 
			
		||||
@c man begin FORMAT OPTIONS
 | 
			
		||||
 | 
			
		||||
The libavformat library provides some generic global options, which
 | 
			
		||||
can be set on all the muxers and demuxers. In addition each muxer or
 | 
			
		||||
demuxer may support so-called private options, which are specific for
 | 
			
		||||
that component.
 | 
			
		||||
 | 
			
		||||
Options may be set by specifying -@var{option} @var{value} in the
 | 
			
		||||
FFmpeg tools, or by setting the value explicitly in the
 | 
			
		||||
@code{AVFormatContext} options or using the @file{libavutil/opt.h} API
 | 
			
		||||
for programmatic use.
 | 
			
		||||
 | 
			
		||||
The list of supported options follows:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item avioflags @var{flags} (@emph{input/output})
 | 
			
		||||
Possible values:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item direct
 | 
			
		||||
Reduce buffering.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item probesize @var{integer} (@emph{input})
 | 
			
		||||
Set probing size in bytes, i.e. the size of the data to analyze to get
 | 
			
		||||
stream information. A higher value will allow to detect more
 | 
			
		||||
information in case it is dispersed into the stream, but will increase
 | 
			
		||||
latency. Must be an integer not lesser than 32. It is 5000000 by default.
 | 
			
		||||
 | 
			
		||||
@item packetsize @var{integer} (@emph{output})
 | 
			
		||||
Set packet size.
 | 
			
		||||
 | 
			
		||||
@item fflags @var{flags} (@emph{input/output})
 | 
			
		||||
Set format flags.
 | 
			
		||||
 | 
			
		||||
Possible values:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item ignidx
 | 
			
		||||
Ignore index.
 | 
			
		||||
@item genpts
 | 
			
		||||
Generate PTS.
 | 
			
		||||
@item nofillin
 | 
			
		||||
Do not fill in missing values that can be exactly calculated.
 | 
			
		||||
@item noparse
 | 
			
		||||
Disable AVParsers, this needs @code{+nofillin} too.
 | 
			
		||||
@item igndts
 | 
			
		||||
Ignore DTS.
 | 
			
		||||
@item discardcorrupt
 | 
			
		||||
Discard corrupted frames.
 | 
			
		||||
@item sortdts
 | 
			
		||||
Try to interleave output packets by DTS.
 | 
			
		||||
@item keepside
 | 
			
		||||
Do not merge side data.
 | 
			
		||||
@item latm
 | 
			
		||||
Enable RTP MP4A-LATM payload.
 | 
			
		||||
@item nobuffer
 | 
			
		||||
Reduce the latency introduced by optional buffering
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item seek2any @var{integer} (@emph{input})
 | 
			
		||||
Allow seeking to non-keyframes on demuxer level when supported if set to 1.
 | 
			
		||||
Default is 0.
 | 
			
		||||
 | 
			
		||||
@item analyzeduration @var{integer} (@emph{input})
 | 
			
		||||
Specify how many microseconds are analyzed to probe the input. A
 | 
			
		||||
higher value will allow to detect more accurate information, but will
 | 
			
		||||
increase latency. It defaults to 5,000,000 microseconds = 5 seconds.
 | 
			
		||||
 | 
			
		||||
@item cryptokey @var{hexadecimal string} (@emph{input})
 | 
			
		||||
Set decryption key.
 | 
			
		||||
 | 
			
		||||
@item indexmem @var{integer} (@emph{input})
 | 
			
		||||
Set max memory used for timestamp index (per stream).
 | 
			
		||||
 | 
			
		||||
@item rtbufsize @var{integer} (@emph{input})
 | 
			
		||||
Set max memory used for buffering real-time frames.
 | 
			
		||||
 | 
			
		||||
@item fdebug @var{flags} (@emph{input/output})
 | 
			
		||||
Print specific debug info.
 | 
			
		||||
 | 
			
		||||
Possible values:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item ts
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item max_delay @var{integer} (@emph{input/output})
 | 
			
		||||
Set maximum muxing or demuxing delay in microseconds.
 | 
			
		||||
 | 
			
		||||
@item fpsprobesize @var{integer} (@emph{input})
 | 
			
		||||
Set number of frames used to probe fps.
 | 
			
		||||
 | 
			
		||||
@item audio_preload @var{integer} (@emph{output})
 | 
			
		||||
Set microseconds by which audio packets should be interleaved earlier.
 | 
			
		||||
 | 
			
		||||
@item chunk_duration @var{integer} (@emph{output})
 | 
			
		||||
Set microseconds for each chunk.
 | 
			
		||||
 | 
			
		||||
@item chunk_size @var{integer} (@emph{output})
 | 
			
		||||
Set size in bytes for each chunk.
 | 
			
		||||
 | 
			
		||||
@item err_detect, f_err_detect @var{flags} (@emph{input})
 | 
			
		||||
Set error detection flags. @code{f_err_detect} is deprecated and
 | 
			
		||||
should be used only via the @command{ffmpeg} tool.
 | 
			
		||||
 | 
			
		||||
Possible values:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item crccheck
 | 
			
		||||
Verify embedded CRCs.
 | 
			
		||||
@item bitstream
 | 
			
		||||
Detect bitstream specification deviations.
 | 
			
		||||
@item buffer
 | 
			
		||||
Detect improper bitstream length.
 | 
			
		||||
@item explode
 | 
			
		||||
Abort decoding on minor error detection.
 | 
			
		||||
@item careful
 | 
			
		||||
Consider things that violate the spec and have not been seen in the
 | 
			
		||||
wild as errors.
 | 
			
		||||
@item compliant
 | 
			
		||||
Consider all spec non compliancies as errors.
 | 
			
		||||
@item aggressive
 | 
			
		||||
Consider things that a sane encoder should not do as an error.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item use_wallclock_as_timestamps @var{integer} (@emph{input})
 | 
			
		||||
Use wallclock as timestamps.
 | 
			
		||||
 | 
			
		||||
@item avoid_negative_ts @var{integer} (@emph{output})
 | 
			
		||||
Shift timestamps to make them non-negative. A value of 1 enables shifting,
 | 
			
		||||
a value of 0 disables it, the default value of -1 enables shifting
 | 
			
		||||
when required by the target format.
 | 
			
		||||
 | 
			
		||||
When shifting is enabled, all output timestamps are shifted by the
 | 
			
		||||
same amount. Audio, video, and subtitles desynching and relative
 | 
			
		||||
timestamp differences are preserved compared to how they would have
 | 
			
		||||
been without shifting.
 | 
			
		||||
 | 
			
		||||
Also note that this affects only leading negative timestamps, and not
 | 
			
		||||
non-monotonic negative timestamps.
 | 
			
		||||
 | 
			
		||||
@item skip_initial_bytes @var{integer} (@emph{input})
 | 
			
		||||
Set number of bytes to skip before reading header and frames if set to 1.
 | 
			
		||||
Default is 0.
 | 
			
		||||
 | 
			
		||||
@item correct_ts_overflow @var{integer} (@emph{input})
 | 
			
		||||
Correct single timestamp overflows if set to 1. Default is 1.
 | 
			
		||||
 | 
			
		||||
@item flush_packets @var{integer} (@emph{output})
 | 
			
		||||
Flush the underlying I/O stream after each packet. Default 1 enables it, and
 | 
			
		||||
has the effect of reducing the latency; 0 disables it and may slightly
 | 
			
		||||
increase performance in some cases.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@c man end FORMAT OPTIONS
 | 
			
		||||
 | 
			
		||||
@anchor{Format stream specifiers}
 | 
			
		||||
@section Format stream specifiers
 | 
			
		||||
 | 
			
		||||
Format stream specifiers allow selection of one or more streams that
 | 
			
		||||
match specific properties.
 | 
			
		||||
 | 
			
		||||
Possible forms of stream specifiers are:
 | 
			
		||||
@table @option
 | 
			
		||||
@item @var{stream_index}
 | 
			
		||||
Matches the stream with this index.
 | 
			
		||||
 | 
			
		||||
@item @var{stream_type}[:@var{stream_index}]
 | 
			
		||||
@var{stream_type} is one of following: 'v' for video, 'a' for audio,
 | 
			
		||||
's' for subtitle, 'd' for data, and 't' for attachments. If
 | 
			
		||||
@var{stream_index} is given, then it matches the stream number
 | 
			
		||||
@var{stream_index} of this type. Otherwise, it matches all streams of
 | 
			
		||||
this type.
 | 
			
		||||
 | 
			
		||||
@item p:@var{program_id}[:@var{stream_index}]
 | 
			
		||||
If @var{stream_index} is given, then it matches the stream with number
 | 
			
		||||
@var{stream_index} in the program with the id
 | 
			
		||||
@var{program_id}. Otherwise, it matches all streams in the program.
 | 
			
		||||
 | 
			
		||||
@item #@var{stream_id}
 | 
			
		||||
Matches the stream by a format-specific ID.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
The exact semantics of stream specifiers is defined by the
 | 
			
		||||
@code{avformat_match_stream_specifier()} function declared in the
 | 
			
		||||
@file{libavformat/avformat.h} header.
 | 
			
		||||
 | 
			
		||||
@include demuxers.texi
 | 
			
		||||
@include muxers.texi
 | 
			
		||||
@include metadata.texi
 | 
			
		||||
							
								
								
									
										230
									
								
								doc/general.texi
									
									
									
									
									
								
							
							
						
						
									
										230
									
								
								doc/general.texi
									
									
									
									
									
								
							@@ -24,22 +24,17 @@ instructions.  To enable using OpenJPEG in FFmpeg, pass @code{--enable-libopenjp
 | 
			
		||||
@file{./configure}.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@section OpenCORE, VisualOn, and Fraunhofer libraries
 | 
			
		||||
@section OpenCORE and VisualOn libraries
 | 
			
		||||
 | 
			
		||||
Spun off Google Android sources, OpenCore, VisualOn and Fraunhofer
 | 
			
		||||
libraries provide encoders for a number of audio codecs.
 | 
			
		||||
Spun off Google Android sources, OpenCore and VisualOn libraries provide
 | 
			
		||||
encoders for a number of audio codecs.
 | 
			
		||||
 | 
			
		||||
@float NOTE
 | 
			
		||||
OpenCORE and VisualOn libraries are under the Apache License 2.0
 | 
			
		||||
(see @url{http://www.apache.org/licenses/LICENSE-2.0} for details), which is
 | 
			
		||||
incompatible to the LGPL version 2.1 and GPL version 2. You have to
 | 
			
		||||
incompatible with the LGPL version 2.1 and GPL version 2. You have to
 | 
			
		||||
upgrade FFmpeg's license to LGPL version 3 (or if you have enabled
 | 
			
		||||
GPL components, GPL version 3) by passing @code{--enable-version3} to configure in
 | 
			
		||||
order to use it.
 | 
			
		||||
 | 
			
		||||
The Fraunhofer AAC library is licensed under a license incompatible to the GPL
 | 
			
		||||
and is not known to be compatible to the LGPL. Therefore, you have to pass
 | 
			
		||||
@code{--enable-nonfree} to configure to use it.
 | 
			
		||||
GPL components, GPL version 3) to use it.
 | 
			
		||||
@end float
 | 
			
		||||
 | 
			
		||||
@subsection OpenCORE AMR
 | 
			
		||||
@@ -68,14 +63,6 @@ Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the
 | 
			
		||||
instructions for installing the library.
 | 
			
		||||
Then pass @code{--enable-libvo-amrwbenc} to configure to enable it.
 | 
			
		||||
 | 
			
		||||
@subsection Fraunhofer AAC library
 | 
			
		||||
 | 
			
		||||
FFmpeg can make use of the Fraunhofer AAC library for AAC encoding.
 | 
			
		||||
 | 
			
		||||
Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the
 | 
			
		||||
instructions for installing the library.
 | 
			
		||||
Then pass @code{--enable-libfdk-aac} to configure to enable it.
 | 
			
		||||
 | 
			
		||||
@section LAME
 | 
			
		||||
 | 
			
		||||
FFmpeg can make use of the LAME library for MP3 encoding.
 | 
			
		||||
@@ -84,30 +71,14 @@ Go to @url{http://lame.sourceforge.net/} and follow the
 | 
			
		||||
instructions for installing the library.
 | 
			
		||||
Then pass @code{--enable-libmp3lame} to configure to enable it.
 | 
			
		||||
 | 
			
		||||
@section TwoLAME
 | 
			
		||||
 | 
			
		||||
FFmpeg can make use of the TwoLAME library for MP2 encoding.
 | 
			
		||||
 | 
			
		||||
Go to @url{http://www.twolame.org/} and follow the
 | 
			
		||||
instructions for installing the library.
 | 
			
		||||
Then pass @code{--enable-libtwolame} to configure to enable it.
 | 
			
		||||
 | 
			
		||||
@section libvpx
 | 
			
		||||
 | 
			
		||||
FFmpeg can make use of the libvpx library for VP8/VP9 encoding.
 | 
			
		||||
FFmpeg can make use of the libvpx library for VP8 encoding.
 | 
			
		||||
 | 
			
		||||
Go to @url{http://www.webmproject.org/} and follow the instructions for
 | 
			
		||||
installing the library. Then pass @code{--enable-libvpx} to configure to
 | 
			
		||||
enable it.
 | 
			
		||||
 | 
			
		||||
@section libwavpack
 | 
			
		||||
 | 
			
		||||
FFmpeg can make use of the libwavpack library for WavPack encoding.
 | 
			
		||||
 | 
			
		||||
Go to @url{http://www.wavpack.com/} and follow the instructions for
 | 
			
		||||
installing the library. Then pass @code{--enable-libwavpack} to configure to
 | 
			
		||||
enable it.
 | 
			
		||||
 | 
			
		||||
@section x264
 | 
			
		||||
 | 
			
		||||
FFmpeg can make use of the x264 library for H.264 encoding.
 | 
			
		||||
@@ -122,31 +93,6 @@ x264 is under the GNU Public License Version 2 or later
 | 
			
		||||
details), you must upgrade FFmpeg's license to GPL in order to use it.
 | 
			
		||||
@end float
 | 
			
		||||
 | 
			
		||||
@section libilbc
 | 
			
		||||
 | 
			
		||||
iLBC is a narrowband speech codec that has been made freely available
 | 
			
		||||
by Google as part of the WebRTC project. libilbc is a packaging friendly
 | 
			
		||||
copy of the iLBC codec. FFmpeg can make use of the libilbc library for
 | 
			
		||||
iLBC encoding and decoding.
 | 
			
		||||
 | 
			
		||||
Go to @url{https://github.com/dekkers/libilbc} and follow the instructions for
 | 
			
		||||
installing the library. Then pass @code{--enable-libilbc} to configure to
 | 
			
		||||
enable it.
 | 
			
		||||
 | 
			
		||||
@section libzvbi
 | 
			
		||||
 | 
			
		||||
libzvbi is a VBI decoding library which can be used by FFmpeg to decode DVB
 | 
			
		||||
teletext pages and DVB teletext subtitles.
 | 
			
		||||
 | 
			
		||||
Go to @url{http://sourceforge.net/projects/zapping/} and follow the instructions for
 | 
			
		||||
installing the library. Then pass @code{--enable-libzvbi} to configure to
 | 
			
		||||
enable it.
 | 
			
		||||
 | 
			
		||||
@float NOTE
 | 
			
		||||
libzvbi is licensed under the GNU General Public License Version 2 or later
 | 
			
		||||
(see @url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html} for details),
 | 
			
		||||
you must upgrade FFmpeg's license to GPL in order to use it.
 | 
			
		||||
@end float
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@chapter Supported File Formats, Codecs or Features
 | 
			
		||||
@@ -170,21 +116,11 @@ library:
 | 
			
		||||
@item American Laser Games MM   @tab   @tab X
 | 
			
		||||
    @tab Multimedia format used in games like Mad Dog McCree.
 | 
			
		||||
@item 3GPP AMR                  @tab X @tab X
 | 
			
		||||
@item Amazing Studio Packed Animation File        @tab   @tab X
 | 
			
		||||
    @tab Multimedia format used in game Heart Of Darkness.
 | 
			
		||||
@item Apple HTTP Live Streaming @tab   @tab X
 | 
			
		||||
@item Artworx Data Format       @tab   @tab X
 | 
			
		||||
@item ADP                       @tab   @tab X
 | 
			
		||||
    @tab Audio format used on the Nintendo Gamecube.
 | 
			
		||||
@item AFC                       @tab   @tab X
 | 
			
		||||
    @tab Audio format used on the Nintendo Gamecube.
 | 
			
		||||
@item ASF                       @tab X @tab X
 | 
			
		||||
@item AST                       @tab X @tab X
 | 
			
		||||
    @tab Audio format used on the Nintendo Wii.
 | 
			
		||||
@item AVI                       @tab X @tab X
 | 
			
		||||
@item AviSynth                  @tab   @tab X
 | 
			
		||||
@item AVR                       @tab   @tab X
 | 
			
		||||
    @tab Audio format used on Mac.
 | 
			
		||||
@item AVISynth                  @tab   @tab X
 | 
			
		||||
@item AVS                       @tab   @tab X
 | 
			
		||||
    @tab Multimedia format used by the Creature Shock game.
 | 
			
		||||
@item Beam Software SIFF        @tab   @tab X
 | 
			
		||||
@@ -198,8 +134,6 @@ library:
 | 
			
		||||
    @tab Used in Z and Z95 games.
 | 
			
		||||
@item Brute Force & Ignorance   @tab   @tab X
 | 
			
		||||
    @tab Used in the game Flash Traffic: City of Angels.
 | 
			
		||||
@item BRSTM                     @tab   @tab X
 | 
			
		||||
    @tab Audio format used on the Nintendo Wii.
 | 
			
		||||
@item BWF                       @tab X @tab X
 | 
			
		||||
@item CRI ADX                   @tab X @tab X
 | 
			
		||||
    @tab Audio-only format used in console video games.
 | 
			
		||||
@@ -230,7 +164,6 @@ library:
 | 
			
		||||
@item Electronic Arts cdata  @tab    @tab X
 | 
			
		||||
@item Electronic Arts Multimedia  @tab    @tab X
 | 
			
		||||
    @tab Used in various EA games; files have extensions like WVE and UV2.
 | 
			
		||||
@item Ensoniq Paris Audio File  @tab   @tab X
 | 
			
		||||
@item FFM (FFserver live feed)  @tab X @tab X
 | 
			
		||||
@item Flash (SWF)               @tab X @tab X
 | 
			
		||||
@item Flash 9 (AVM2)            @tab X @tab X
 | 
			
		||||
@@ -245,12 +178,12 @@ library:
 | 
			
		||||
@item G.723.1                   @tab X @tab X
 | 
			
		||||
@item G.729 BIT                 @tab X @tab X
 | 
			
		||||
@item G.729 raw                 @tab   @tab X
 | 
			
		||||
@item GIF Animation             @tab X @tab X
 | 
			
		||||
@item GIF Animation             @tab X @tab
 | 
			
		||||
@item GXF                       @tab X @tab X
 | 
			
		||||
    @tab General eXchange Format SMPTE 360M, used by Thomson Grass Valley
 | 
			
		||||
         playout servers.
 | 
			
		||||
@item iCEDraw File              @tab   @tab X
 | 
			
		||||
@item ICO                       @tab X @tab X
 | 
			
		||||
@item ICO                       @tab   @tab X
 | 
			
		||||
    @tab Microsoft Windows ICO
 | 
			
		||||
@item id Quake II CIN video     @tab   @tab X
 | 
			
		||||
@item id RoQ                    @tab X @tab X
 | 
			
		||||
@@ -258,20 +191,17 @@ library:
 | 
			
		||||
@item IEC61937 encapsulation @tab X @tab X
 | 
			
		||||
@item IFF                       @tab   @tab X
 | 
			
		||||
    @tab Interchange File Format
 | 
			
		||||
@item iLBC                      @tab X @tab X
 | 
			
		||||
@item Interplay MVE             @tab   @tab X
 | 
			
		||||
    @tab Format used in various Interplay computer games.
 | 
			
		||||
@item IV8                       @tab   @tab X
 | 
			
		||||
    @tab A format generated by IndigoVision 8000 video server.
 | 
			
		||||
@item IVF (On2)                 @tab X @tab X
 | 
			
		||||
    @tab A format used by libvpx
 | 
			
		||||
@item IRCAM                     @tab X @tab X
 | 
			
		||||
@item LATM                      @tab X @tab X
 | 
			
		||||
@item LMLM4                     @tab   @tab X
 | 
			
		||||
    @tab Used by Linux Media Labs MPEG-4 PCI boards
 | 
			
		||||
@item LOAS                      @tab   @tab X
 | 
			
		||||
    @tab contains LATM multiplexed AAC audio
 | 
			
		||||
@item LVF                       @tab   @tab X
 | 
			
		||||
@item LXF                       @tab   @tab X
 | 
			
		||||
    @tab VR native stream format, used by Leitch/Harris' video servers.
 | 
			
		||||
@item Matroska                  @tab X @tab X
 | 
			
		||||
@@ -282,8 +212,6 @@ library:
 | 
			
		||||
    @tab Used in Sim City 3000; file extension .xa.
 | 
			
		||||
@item MD Studio                 @tab   @tab X
 | 
			
		||||
@item Metal Gear Solid: The Twin Snakes @tab @tab X
 | 
			
		||||
@item Megalux Frame             @tab   @tab X
 | 
			
		||||
    @tab Used by Megalux Ultimate Paint
 | 
			
		||||
@item Mobotix .mxg              @tab   @tab X
 | 
			
		||||
@item Monkey's Audio            @tab   @tab X
 | 
			
		||||
@item Motion Pixels MVI         @tab   @tab X
 | 
			
		||||
@@ -311,7 +239,6 @@ library:
 | 
			
		||||
    @tab SMPTE 386M, D-10/IMX Mapping.
 | 
			
		||||
@item NC camera feed            @tab   @tab X
 | 
			
		||||
    @tab NC (AVIP NC4600) camera streams
 | 
			
		||||
@item NIST SPeech HEader REsources @tab   @tab X
 | 
			
		||||
@item NTT TwinVQ (VQF)          @tab   @tab X
 | 
			
		||||
    @tab Nippon Telegraph and Telephone Corporation TwinVQ.
 | 
			
		||||
@item Nullsoft Streaming Video  @tab   @tab X
 | 
			
		||||
@@ -320,7 +247,6 @@ library:
 | 
			
		||||
    @tab NUT Open Container Format
 | 
			
		||||
@item Ogg                       @tab X @tab X
 | 
			
		||||
@item Playstation Portable PMP  @tab   @tab X
 | 
			
		||||
@item Portable Voice Format     @tab   @tab X
 | 
			
		||||
@item TechnoTrend PVA           @tab   @tab X
 | 
			
		||||
    @tab Used by TechnoTrend DVB PCI boards.
 | 
			
		||||
@item QCP                       @tab   @tab X
 | 
			
		||||
@@ -331,7 +257,6 @@ library:
 | 
			
		||||
@item raw Dirac                 @tab X @tab X
 | 
			
		||||
@item raw DNxHD                 @tab X @tab X
 | 
			
		||||
@item raw DTS                   @tab X @tab X
 | 
			
		||||
@item raw DTS-HD                @tab   @tab X
 | 
			
		||||
@item raw E-AC-3                @tab X @tab X
 | 
			
		||||
@item raw FLAC                  @tab X @tab X
 | 
			
		||||
@item raw GSM                   @tab   @tab X
 | 
			
		||||
@@ -349,9 +274,8 @@ library:
 | 
			
		||||
@item raw video                 @tab X @tab X
 | 
			
		||||
@item raw id RoQ                @tab X @tab
 | 
			
		||||
@item raw Shorten               @tab   @tab X
 | 
			
		||||
@item raw TAK                   @tab   @tab X
 | 
			
		||||
@item raw TrueHD                @tab X @tab X
 | 
			
		||||
@item raw VC-1                  @tab X @tab X
 | 
			
		||||
@item raw VC-1                  @tab   @tab X
 | 
			
		||||
@item raw PCM A-law             @tab X @tab X
 | 
			
		||||
@item raw PCM mu-law            @tab X @tab X
 | 
			
		||||
@item raw PCM signed 8 bit      @tab X @tab X
 | 
			
		||||
@@ -377,13 +301,11 @@ library:
 | 
			
		||||
    @tab File format used by RED Digital cameras, contains JPEG 2000 frames and PCM audio.
 | 
			
		||||
@item RealMedia                 @tab X @tab X
 | 
			
		||||
@item Redirector                @tab   @tab X
 | 
			
		||||
@item RedSpark                  @tab   @tab X
 | 
			
		||||
@item Renderware TeXture Dictionary @tab   @tab X
 | 
			
		||||
@item RL2                       @tab   @tab X
 | 
			
		||||
    @tab Audio and video format used in some games by Entertainment Software Partners.
 | 
			
		||||
@item RPL/ARMovie               @tab   @tab X
 | 
			
		||||
@item Lego Mindstorms RSO       @tab X @tab X
 | 
			
		||||
@item RSD                       @tab   @tab X
 | 
			
		||||
@item RTMP                      @tab X @tab X
 | 
			
		||||
    @tab Output is performed by publishing stream to RTMP server
 | 
			
		||||
@item RTP                       @tab X @tab X
 | 
			
		||||
@@ -393,7 +315,6 @@ library:
 | 
			
		||||
@item SDP                       @tab   @tab X
 | 
			
		||||
@item Sega FILM/CPK             @tab   @tab X
 | 
			
		||||
    @tab Used in many Sega Saturn console games.
 | 
			
		||||
@item Silicon Graphics Movie    @tab   @tab X
 | 
			
		||||
@item Sierra SOL                @tab   @tab X
 | 
			
		||||
    @tab .sol files used in Sierra Online games.
 | 
			
		||||
@item Sierra VMD                @tab   @tab X
 | 
			
		||||
@@ -402,12 +323,10 @@ library:
 | 
			
		||||
    @tab Multimedia format used by many games.
 | 
			
		||||
@item SMJPEG                    @tab X @tab X
 | 
			
		||||
    @tab Used in certain Loki game ports.
 | 
			
		||||
@item Smush                     @tab   @tab X
 | 
			
		||||
    @tab Multimedia format used in some LucasArts games.
 | 
			
		||||
@item Sony OpenMG (OMA)         @tab X @tab X
 | 
			
		||||
    @tab Audio format used in Sony Sonic Stage and Sony Vegas.
 | 
			
		||||
@item Sony PlayStation STR      @tab   @tab X
 | 
			
		||||
@item Sony Wave64 (W64)         @tab X @tab X
 | 
			
		||||
@item Sony Wave64 (W64)         @tab   @tab X
 | 
			
		||||
@item SoX native format         @tab X @tab X
 | 
			
		||||
@item SUN AU format             @tab X @tab X
 | 
			
		||||
@item Text files                @tab   @tab X
 | 
			
		||||
@@ -417,9 +336,8 @@ library:
 | 
			
		||||
    @tab Tiertex .seq files used in the DOS CD-ROM version of the game Flashback.
 | 
			
		||||
@item True Audio                @tab   @tab X
 | 
			
		||||
@item VC-1 test bitstream       @tab X @tab X
 | 
			
		||||
@item Vivo                      @tab   @tab X
 | 
			
		||||
@item WAV                       @tab X @tab X
 | 
			
		||||
@item WavPack                   @tab X @tab X
 | 
			
		||||
@item WavPack                   @tab   @tab X
 | 
			
		||||
@item WebM                      @tab X @tab X
 | 
			
		||||
@item Windows Televison (WTV)   @tab X @tab X
 | 
			
		||||
@item Wing Commander III movie  @tab   @tab X
 | 
			
		||||
@@ -435,6 +353,7 @@ library:
 | 
			
		||||
@item eXtended BINary text (XBIN) @tab @tab X
 | 
			
		||||
@item YUV4MPEG pipe             @tab X @tab X
 | 
			
		||||
@item Psygnosis YOP             @tab   @tab X
 | 
			
		||||
@item ZeroCodec Lossless Video  @tab   @tab X
 | 
			
		||||
@end multitable
 | 
			
		||||
 | 
			
		||||
@code{X} means that encoding (resp. decoding) is supported.
 | 
			
		||||
@@ -449,10 +368,9 @@ following image formats are supported:
 | 
			
		||||
@item .Y.U.V       @tab X @tab X
 | 
			
		||||
    @tab one raw file per component
 | 
			
		||||
@item animated GIF @tab X @tab X
 | 
			
		||||
    @tab Only uncompressed GIFs are generated.
 | 
			
		||||
@item BMP          @tab X @tab X
 | 
			
		||||
    @tab Microsoft BMP image
 | 
			
		||||
@item PIX          @tab   @tab X
 | 
			
		||||
    @tab PIX is an image format used in the Argonaut BRender engine.
 | 
			
		||||
@item DPX          @tab X @tab X
 | 
			
		||||
    @tab Digital Picture Exchange
 | 
			
		||||
@item EXR          @tab   @tab X
 | 
			
		||||
@@ -488,12 +406,8 @@ following image formats are supported:
 | 
			
		||||
    @tab YUV, JPEG and some extension is not supported yet.
 | 
			
		||||
@item Truevision Targa  @tab X @tab X
 | 
			
		||||
    @tab Targa (.TGA) image format
 | 
			
		||||
@item WebP         @tab @tab X
 | 
			
		||||
    @tab WebP image format
 | 
			
		||||
@item XBM  @tab X @tab X
 | 
			
		||||
    @tab X BitMap image format
 | 
			
		||||
@item XFace @tab X @tab X
 | 
			
		||||
    @tab X-Face image format
 | 
			
		||||
@item XWD  @tab X @tab X
 | 
			
		||||
    @tab X Window Dump image format
 | 
			
		||||
@end multitable
 | 
			
		||||
@@ -509,15 +423,15 @@ following image formats are supported:
 | 
			
		||||
@item 4X Movie               @tab     @tab  X
 | 
			
		||||
    @tab Used in certain computer games.
 | 
			
		||||
@item 8088flex TMV           @tab     @tab  X
 | 
			
		||||
@item 8SVX exponential       @tab     @tab  X
 | 
			
		||||
@item 8SVX fibonacci         @tab     @tab  X
 | 
			
		||||
@item A64 multicolor         @tab  X  @tab
 | 
			
		||||
    @tab Creates video suitable to be played on a commodore 64 (multicolor mode).
 | 
			
		||||
@item Amazing Studio PAF Video @tab     @tab  X
 | 
			
		||||
@item American Laser Games MM  @tab    @tab X
 | 
			
		||||
    @tab Used in games like Mad Dog McCree.
 | 
			
		||||
@item AMV Video              @tab  X  @tab  X
 | 
			
		||||
    @tab Used in Chinese MP3 players.
 | 
			
		||||
@item ANSI/ASCII art         @tab     @tab  X
 | 
			
		||||
@item Apple Intermediate Codec @tab     @tab  X
 | 
			
		||||
@item Apple MJPEG-B          @tab     @tab  X
 | 
			
		||||
@item Apple ProRes           @tab  X  @tab  X
 | 
			
		||||
@item Apple QuickDraw        @tab     @tab  X
 | 
			
		||||
@@ -562,11 +476,9 @@ following image formats are supported:
 | 
			
		||||
@item Delphine Software International CIN video  @tab     @tab  X
 | 
			
		||||
    @tab Codec used in Delphine Software International games.
 | 
			
		||||
@item Discworld II BMV Video @tab     @tab  X
 | 
			
		||||
@item Canopus Lossless Codec @tab     @tab  X
 | 
			
		||||
@item Cinepak                @tab     @tab  X
 | 
			
		||||
@item Cirrus Logic AccuPak   @tab  X  @tab  X
 | 
			
		||||
    @tab fourcc: CLJR
 | 
			
		||||
@item CPiA Video Format      @tab     @tab  X
 | 
			
		||||
@item Creative YUV (CYUV)    @tab     @tab  X
 | 
			
		||||
@item DFA                    @tab     @tab  X
 | 
			
		||||
    @tab Codec used in Chronomaster game.
 | 
			
		||||
@@ -600,13 +512,12 @@ following image formats are supported:
 | 
			
		||||
    @tab Sorenson H.263 used in Flash
 | 
			
		||||
@item Forward Uncompressed   @tab     @tab  X
 | 
			
		||||
@item Fraps                  @tab     @tab  X
 | 
			
		||||
@item Go2Webinar             @tab     @tab  X
 | 
			
		||||
    @tab fourcc: G2M4
 | 
			
		||||
@item H.261                  @tab  X  @tab  X
 | 
			
		||||
@item H.263 / H.263-1996     @tab  X  @tab  X
 | 
			
		||||
@item H.263+ / H.263-1998 / H.263 version 2  @tab  X  @tab  X
 | 
			
		||||
@item H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10  @tab  E  @tab  X
 | 
			
		||||
    @tab encoding supported through external library libx264
 | 
			
		||||
@item H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (VDPAU acceleration)  @tab  E  @tab  X
 | 
			
		||||
@item HuffYUV                @tab  X  @tab  X
 | 
			
		||||
@item HuffYUV FFmpeg variant @tab  X  @tab  X
 | 
			
		||||
@item IBM Ultimotion         @tab     @tab  X
 | 
			
		||||
@@ -637,18 +548,8 @@ following image formats are supported:
 | 
			
		||||
@item LCL (LossLess Codec Library) MSZH  @tab     @tab  X
 | 
			
		||||
@item LCL (LossLess Codec Library) ZLIB  @tab  E  @tab  E
 | 
			
		||||
@item LOCO                   @tab     @tab  X
 | 
			
		||||
@item LucasArts Smush        @tab     @tab  X
 | 
			
		||||
    @tab Used in LucasArts games.
 | 
			
		||||
@item lossless MJPEG         @tab  X  @tab  X
 | 
			
		||||
@item Microsoft ATC Screen   @tab     @tab  X
 | 
			
		||||
    @tab Also known as Microsoft Screen 3.
 | 
			
		||||
@item Microsoft Expression Encoder Screen  @tab     @tab  X
 | 
			
		||||
    @tab Also known as Microsoft Titanium Screen 2.
 | 
			
		||||
@item Microsoft RLE          @tab     @tab  X
 | 
			
		||||
@item Microsoft Screen 1     @tab     @tab  X
 | 
			
		||||
    @tab Also known as Windows Media Video V7 Screen.
 | 
			
		||||
@item Microsoft Screen 2     @tab     @tab  X
 | 
			
		||||
    @tab Also known as Windows Media Video V9 Screen.
 | 
			
		||||
@item Microsoft Video 1      @tab     @tab  X
 | 
			
		||||
@item Mimic                  @tab     @tab  X
 | 
			
		||||
    @tab Used in MSN Messenger Webcam streams.
 | 
			
		||||
@@ -659,6 +560,7 @@ following image formats are supported:
 | 
			
		||||
@item Motion Pixels video    @tab     @tab  X
 | 
			
		||||
@item MPEG-1 video           @tab  X  @tab  X
 | 
			
		||||
@item MPEG-1/2 video XvMC (X-Video Motion Compensation)  @tab     @tab  X
 | 
			
		||||
@item MPEG-1/2 video (VDPAU acceleration)  @tab     @tab  X
 | 
			
		||||
@item MPEG-2 video           @tab  X  @tab  X
 | 
			
		||||
@item MPEG-4 part 2          @tab  X  @tab  X
 | 
			
		||||
    @tab libxvidcore can be used alternatively for encoding.
 | 
			
		||||
@@ -676,10 +578,8 @@ following image formats are supported:
 | 
			
		||||
    @tab fourcc: VP60,VP61,VP62
 | 
			
		||||
@item VP8                    @tab  E  @tab  X
 | 
			
		||||
    @tab fourcc: VP80, encoding supported through external library libvpx
 | 
			
		||||
@item VP9                    @tab  E  @tab  X
 | 
			
		||||
    @tab encoding supported through external library libvpx
 | 
			
		||||
@item Pinnacle TARGA CineWave YUV16 @tab     @tab  X
 | 
			
		||||
    @tab fourcc: Y216
 | 
			
		||||
@item planar RGB             @tab     @tab  X
 | 
			
		||||
    @tab fourcc: 8BPS
 | 
			
		||||
@item Prores                 @tab     @tab  X
 | 
			
		||||
    @tab fourcc: apch,apcn,apcs,apco
 | 
			
		||||
@item Q-team QPEG            @tab     @tab  X
 | 
			
		||||
@@ -703,11 +603,8 @@ following image formats are supported:
 | 
			
		||||
    @tab Texture dictionaries used by the Renderware Engine.
 | 
			
		||||
@item RL2 video              @tab     @tab  X
 | 
			
		||||
    @tab used in some games by Entertainment Software Partners
 | 
			
		||||
@item SGI RLE 8-bit          @tab     @tab  X
 | 
			
		||||
@item Sierra VMD video       @tab     @tab  X
 | 
			
		||||
    @tab Used in Sierra VMD files.
 | 
			
		||||
@item Silicon Graphics Motion Video Compressor 1 (MVC1)  @tab     @tab  X
 | 
			
		||||
@item Silicon Graphics Motion Video Compressor 2 (MVC2)  @tab     @tab  X
 | 
			
		||||
@item Smacker video          @tab     @tab  X
 | 
			
		||||
    @tab Video encoding used in Smacker.
 | 
			
		||||
@item SMPTE VC-1             @tab     @tab  X
 | 
			
		||||
@@ -722,13 +619,11 @@ following image formats are supported:
 | 
			
		||||
    @tab fourcc: SP5X
 | 
			
		||||
@item TechSmith Screen Capture Codec  @tab     @tab  X
 | 
			
		||||
    @tab fourcc: TSCC
 | 
			
		||||
@item TechSmith Screen Capture Codec 2  @tab     @tab  X
 | 
			
		||||
    @tab fourcc: TSC2
 | 
			
		||||
@item Theora                 @tab  E  @tab  X
 | 
			
		||||
    @tab encoding supported through external library libtheora
 | 
			
		||||
@item Tiertex Limited SEQ video  @tab     @tab  X
 | 
			
		||||
    @tab Codec used in DOS CD-ROM FlashBack game.
 | 
			
		||||
@item Ut Video               @tab  X  @tab  X
 | 
			
		||||
@item Ut Video               @tab     @tab  X
 | 
			
		||||
@item v210 QuickTime uncompressed 4:2:2 10-bit     @tab  X  @tab  X
 | 
			
		||||
@item v308 QuickTime uncompressed 4:4:4            @tab  X  @tab  X
 | 
			
		||||
@item v408 QuickTime uncompressed 4:4:4:4          @tab  X  @tab  X
 | 
			
		||||
@@ -752,7 +647,6 @@ following image formats are supported:
 | 
			
		||||
@item Psygnosis YOP Video    @tab     @tab  X
 | 
			
		||||
@item yuv4                   @tab  X  @tab  X
 | 
			
		||||
    @tab libquicktime uncompressed packed 4:2:0
 | 
			
		||||
@item ZeroCodec Lossless Video @tab     @tab  X
 | 
			
		||||
@item ZLIB                   @tab  X  @tab  X
 | 
			
		||||
    @tab part of LCL, encoder experimental
 | 
			
		||||
@item Zip Motion Blocks Video  @tab   X @tab  X
 | 
			
		||||
@@ -767,8 +661,7 @@ following image formats are supported:
 | 
			
		||||
 | 
			
		||||
@multitable @columnfractions .4 .1 .1 .4
 | 
			
		||||
@item Name @tab Encoding @tab Decoding @tab Comments
 | 
			
		||||
@item 8SVX exponential       @tab     @tab  X
 | 
			
		||||
@item 8SVX fibonacci         @tab     @tab  X
 | 
			
		||||
@item 8SVX audio             @tab     @tab  X
 | 
			
		||||
@item AAC+                   @tab  E  @tab  X
 | 
			
		||||
    @tab encoding supported through external library libaacplus
 | 
			
		||||
@item AAC                    @tab  E  @tab  X
 | 
			
		||||
@@ -799,21 +692,19 @@ following image formats are supported:
 | 
			
		||||
@item ADPCM IMA Westwood     @tab     @tab  X
 | 
			
		||||
@item ADPCM ISS IMA          @tab     @tab  X
 | 
			
		||||
    @tab Used in FunCom games.
 | 
			
		||||
@item ADPCM IMA Dialogic     @tab     @tab  X
 | 
			
		||||
@item ADPCM IMA Duck DK3     @tab     @tab  X
 | 
			
		||||
    @tab Used in some Sega Saturn console games.
 | 
			
		||||
@item ADPCM IMA Duck DK4     @tab     @tab  X
 | 
			
		||||
    @tab Used in some Sega Saturn console games.
 | 
			
		||||
@item ADPCM IMA Radical      @tab     @tab  X
 | 
			
		||||
@item ADPCM Microsoft        @tab  X  @tab  X
 | 
			
		||||
@item ADPCM MS IMA           @tab  X  @tab  X
 | 
			
		||||
@item ADPCM Nintendo Gamecube AFC  @tab     @tab  X
 | 
			
		||||
@item ADPCM Nintendo Gamecube DTK  @tab     @tab  X
 | 
			
		||||
@item ADPCM Nintendo Gamecube THP  @tab     @tab  X
 | 
			
		||||
@item ADPCM QT IMA           @tab  X  @tab  X
 | 
			
		||||
@item ADPCM SEGA CRI ADX     @tab  X  @tab  X
 | 
			
		||||
    @tab Used in Sega Dreamcast games.
 | 
			
		||||
@item ADPCM Shockwave Flash  @tab  X  @tab  X
 | 
			
		||||
@item ADPCM SMJPEG IMA       @tab     @tab  X
 | 
			
		||||
    @tab Used in certain Loki game ports.
 | 
			
		||||
@item ADPCM Sound Blaster Pro 2-bit  @tab     @tab  X
 | 
			
		||||
@item ADPCM Sound Blaster Pro 2.6-bit  @tab     @tab  X
 | 
			
		||||
@item ADPCM Sound Blaster Pro 4-bit  @tab     @tab  X
 | 
			
		||||
@@ -824,11 +715,10 @@ following image formats are supported:
 | 
			
		||||
    @tab encoding supported through external library libopencore-amrnb
 | 
			
		||||
@item AMR-WB                 @tab  E  @tab  X
 | 
			
		||||
    @tab encoding supported through external library libvo-amrwbenc
 | 
			
		||||
@item Amazing Studio PAF Audio @tab     @tab  X
 | 
			
		||||
@item Apple lossless audio   @tab  X  @tab  X
 | 
			
		||||
    @tab QuickTime fourcc 'alac'
 | 
			
		||||
@item ATRAC1                 @tab     @tab  X
 | 
			
		||||
@item ATRAC3                 @tab     @tab  X
 | 
			
		||||
@item Atrac 1                @tab     @tab  X
 | 
			
		||||
@item Atrac 3                @tab     @tab  X
 | 
			
		||||
@item Bink Audio             @tab     @tab  X
 | 
			
		||||
    @tab Used in Bink and Smacker files in many games.
 | 
			
		||||
@item CELT                   @tab     @tab  E
 | 
			
		||||
@@ -851,7 +741,6 @@ following image formats are supported:
 | 
			
		||||
@item DSP Group TrueSpeech   @tab     @tab  X
 | 
			
		||||
@item DV audio               @tab     @tab  X
 | 
			
		||||
@item Enhanced AC-3          @tab  X  @tab  X
 | 
			
		||||
@item EVRC (Enhanced Variable Rate Codec) @tab     @tab  X
 | 
			
		||||
@item FLAC (Free Lossless Audio Codec)  @tab  X  @tab  IX
 | 
			
		||||
@item G.723.1                @tab X @tab X
 | 
			
		||||
@item G.729                  @tab     @tab  X
 | 
			
		||||
@@ -859,33 +748,24 @@ following image formats are supported:
 | 
			
		||||
    @tab encoding supported through external library libgsm
 | 
			
		||||
@item GSM Microsoft variant  @tab  E  @tab  X
 | 
			
		||||
    @tab encoding supported through external library libgsm
 | 
			
		||||
@item IAC (Indeo Audio Coder)  @tab     @tab  X
 | 
			
		||||
@item iLBC (Internet Low Bitrate Codec) @tab  E  @tab  E
 | 
			
		||||
    @tab encoding and decoding supported through external library libilbc
 | 
			
		||||
@item IMC (Intel Music Coder)  @tab     @tab  X
 | 
			
		||||
@item MACE (Macintosh Audio Compression/Expansion) 3:1  @tab     @tab  X
 | 
			
		||||
@item MACE (Macintosh Audio Compression/Expansion) 6:1  @tab     @tab  X
 | 
			
		||||
@item MLP (Meridian Lossless Packing)  @tab     @tab  X
 | 
			
		||||
    @tab Used in DVD-Audio discs.
 | 
			
		||||
@item Monkey's Audio         @tab     @tab  X
 | 
			
		||||
    @tab Only versions 3.97-3.99 are supported.
 | 
			
		||||
@item MP1 (MPEG audio layer 1)  @tab     @tab IX
 | 
			
		||||
@item MP2 (MPEG audio layer 2)  @tab IX  @tab IX
 | 
			
		||||
    @tab libtwolame can be used alternatively for encoding.
 | 
			
		||||
@item MP3 (MPEG audio layer 3)  @tab  E  @tab IX
 | 
			
		||||
    @tab encoding supported through external library LAME, ADU MP3 and MP3onMP4 also supported
 | 
			
		||||
@item MPEG-4 Audio Lossless Coding (ALS)  @tab     @tab  X
 | 
			
		||||
@item Musepack SV7           @tab     @tab  X
 | 
			
		||||
@item Musepack SV8           @tab     @tab  X
 | 
			
		||||
@item Nellymoser Asao        @tab  X  @tab  X
 | 
			
		||||
@item Opus                   @tab  E  @tab  E
 | 
			
		||||
    @tab supported through external library libopus
 | 
			
		||||
@item PCM A-law              @tab  X  @tab  X
 | 
			
		||||
@item PCM mu-law             @tab  X  @tab  X
 | 
			
		||||
@item PCM signed 8-bit planar  @tab  X  @tab  X
 | 
			
		||||
@item PCM signed 16-bit big-endian planar  @tab  X  @tab  X
 | 
			
		||||
@item PCM signed 16-bit little-endian planar  @tab  X  @tab  X
 | 
			
		||||
@item PCM signed 24-bit little-endian planar  @tab  X  @tab  X
 | 
			
		||||
@item PCM signed 32-bit little-endian planar  @tab  X  @tab  X
 | 
			
		||||
@item PCM 16-bit little-endian planar  @tab     @tab  X
 | 
			
		||||
@item PCM 32-bit floating point big-endian  @tab  X  @tab  X
 | 
			
		||||
@item PCM 32-bit floating point little-endian  @tab  X  @tab  X
 | 
			
		||||
@item PCM 64-bit floating point big-endian  @tab  X  @tab  X
 | 
			
		||||
@@ -922,25 +802,20 @@ following image formats are supported:
 | 
			
		||||
@item Sierra VMD audio       @tab     @tab  X
 | 
			
		||||
    @tab Used in Sierra VMD files.
 | 
			
		||||
@item Smacker audio          @tab     @tab  X
 | 
			
		||||
@item SMPTE 302M AES3 audio  @tab  X  @tab  X
 | 
			
		||||
@item SMPTE 302M AES3 audio  @tab     @tab  X
 | 
			
		||||
@item Sonic                  @tab  X  @tab  X
 | 
			
		||||
    @tab experimental codec
 | 
			
		||||
@item Sonic lossless         @tab  X  @tab  X
 | 
			
		||||
    @tab experimental codec
 | 
			
		||||
@item Speex                  @tab  E  @tab  E
 | 
			
		||||
    @tab supported through external library libspeex
 | 
			
		||||
@item TAK (Tom's lossless Audio Kompressor)  @tab     @tab  X
 | 
			
		||||
@item True Audio (TTA)       @tab  X  @tab  X
 | 
			
		||||
@item True Audio (TTA)       @tab     @tab  X
 | 
			
		||||
@item TrueHD                 @tab     @tab  X
 | 
			
		||||
    @tab Used in HD-DVD and Blu-Ray discs.
 | 
			
		||||
@item TwinVQ (VQF flavor)    @tab     @tab  X
 | 
			
		||||
@item VIMA                   @tab     @tab  X
 | 
			
		||||
    @tab Used in LucasArts SMUSH animations.
 | 
			
		||||
@item Vorbis                 @tab  E  @tab  X
 | 
			
		||||
    @tab A native but very primitive encoder exists.
 | 
			
		||||
@item Voxware MetaSound      @tab     @tab  X
 | 
			
		||||
    @tab imperfect and incomplete support
 | 
			
		||||
@item WavPack                @tab  X  @tab  X
 | 
			
		||||
@item WavPack                @tab     @tab  X
 | 
			
		||||
@item Westwood Audio (SND1)  @tab     @tab  X
 | 
			
		||||
@item Windows Media Audio 1  @tab  X  @tab  X
 | 
			
		||||
@item Windows Media Audio 2  @tab  X  @tab  X
 | 
			
		||||
@@ -960,63 +835,35 @@ performance on systems without hardware floating point support).
 | 
			
		||||
 | 
			
		||||
@multitable @columnfractions .4 .1 .1 .1 .1
 | 
			
		||||
@item Name @tab Muxing @tab Demuxing @tab Encoding @tab Decoding
 | 
			
		||||
@item 3GPP Timed Text  @tab   @tab   @tab X @tab X
 | 
			
		||||
@item AQTitle          @tab   @tab X @tab   @tab X
 | 
			
		||||
@item SSA/ASS      @tab X @tab X @tab X @tab X
 | 
			
		||||
@item DVB          @tab X @tab X @tab X @tab X
 | 
			
		||||
@item DVB teletext     @tab   @tab X @tab   @tab E
 | 
			
		||||
@item DVD          @tab X @tab X @tab X @tab X
 | 
			
		||||
@item JACOsub      @tab X @tab X @tab   @tab X
 | 
			
		||||
@item MicroDVD     @tab X @tab X @tab   @tab X
 | 
			
		||||
@item MPL2             @tab   @tab X @tab   @tab X
 | 
			
		||||
@item MPsub (MPlayer)  @tab   @tab X @tab   @tab X
 | 
			
		||||
@item PGS          @tab   @tab   @tab   @tab X
 | 
			
		||||
@item PJS (Phoenix)    @tab   @tab X @tab   @tab X
 | 
			
		||||
@item RealText         @tab   @tab X @tab   @tab X
 | 
			
		||||
@item SAMI             @tab   @tab X @tab   @tab X
 | 
			
		||||
@item SSA/ASS          @tab X @tab X @tab X @tab X
 | 
			
		||||
@item SubRip (SRT) @tab X @tab X @tab X @tab X
 | 
			
		||||
@item SubViewer v1     @tab   @tab X @tab   @tab X
 | 
			
		||||
@item SubViewer        @tab   @tab X @tab   @tab X
 | 
			
		||||
@item TED Talks captions @tab @tab X @tab   @tab X
 | 
			
		||||
@item VobSub (IDX+SUB) @tab   @tab X @tab   @tab X
 | 
			
		||||
@item VPlayer          @tab   @tab X @tab   @tab X
 | 
			
		||||
@item WebVTT           @tab X @tab X @tab   @tab X
 | 
			
		||||
@item XSUB         @tab   @tab   @tab X @tab X
 | 
			
		||||
@end multitable
 | 
			
		||||
 | 
			
		||||
@code{X} means that the feature is supported.
 | 
			
		||||
 | 
			
		||||
@code{E} means that support is provided through an external library.
 | 
			
		||||
 | 
			
		||||
@section Network Protocols
 | 
			
		||||
 | 
			
		||||
@multitable @columnfractions .4 .1
 | 
			
		||||
@item Name         @tab Support
 | 
			
		||||
@item Apple HTTP Live Streaming @tab X
 | 
			
		||||
@item file         @tab X
 | 
			
		||||
@item Gopher       @tab X
 | 
			
		||||
@item HLS          @tab X
 | 
			
		||||
@item HTTP         @tab X
 | 
			
		||||
@item HTTPS        @tab X
 | 
			
		||||
@item MMSH         @tab X
 | 
			
		||||
@item MMST         @tab X
 | 
			
		||||
@item MMS          @tab X
 | 
			
		||||
@item pipe         @tab X
 | 
			
		||||
@item RTMP         @tab X
 | 
			
		||||
@item RTMPE        @tab X
 | 
			
		||||
@item RTMPS        @tab X
 | 
			
		||||
@item RTMPT        @tab X
 | 
			
		||||
@item RTMPTE       @tab X
 | 
			
		||||
@item RTMPTS       @tab X
 | 
			
		||||
@item RTP          @tab X
 | 
			
		||||
@item SCTP         @tab X
 | 
			
		||||
@item TCP          @tab X
 | 
			
		||||
@item TLS          @tab X
 | 
			
		||||
@item UDP          @tab X
 | 
			
		||||
@end multitable
 | 
			
		||||
 | 
			
		||||
@code{X} means that the protocol is supported.
 | 
			
		||||
 | 
			
		||||
@code{E} means that support is provided through an external library.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@section Input/Output Devices
 | 
			
		||||
 | 
			
		||||
@@ -1024,18 +871,14 @@ performance on systems without hardware floating point support).
 | 
			
		||||
@item Name              @tab Input  @tab Output
 | 
			
		||||
@item ALSA              @tab X      @tab X
 | 
			
		||||
@item BKTR              @tab X      @tab
 | 
			
		||||
@item caca              @tab        @tab X
 | 
			
		||||
@item DV1394            @tab X      @tab
 | 
			
		||||
@item Lavfi virtual device @tab X   @tab
 | 
			
		||||
@item Linux framebuffer @tab X      @tab
 | 
			
		||||
@item JACK              @tab X      @tab
 | 
			
		||||
@item LIBCDIO           @tab X
 | 
			
		||||
@item LIBDC1394         @tab X      @tab
 | 
			
		||||
@item OpenAL            @tab X
 | 
			
		||||
@item OSS               @tab X      @tab X
 | 
			
		||||
@item Pulseaudio        @tab X      @tab
 | 
			
		||||
@item SDL               @tab        @tab X
 | 
			
		||||
@item Video4Linux2      @tab X      @tab X
 | 
			
		||||
@item Video4Linux2      @tab X      @tab
 | 
			
		||||
@item VfW capture       @tab X      @tab
 | 
			
		||||
@item X11 grabbing      @tab X      @tab
 | 
			
		||||
@end multitable
 | 
			
		||||
@@ -1046,10 +889,9 @@ performance on systems without hardware floating point support).
 | 
			
		||||
 | 
			
		||||
@multitable @columnfractions .4 .1 .1
 | 
			
		||||
@item Codec/format      @tab Read   @tab Write
 | 
			
		||||
@item AVI               @tab X      @tab X
 | 
			
		||||
@item DV                @tab X      @tab X
 | 
			
		||||
@item GXF               @tab X      @tab X
 | 
			
		||||
@item MOV               @tab X      @tab X
 | 
			
		||||
@item MOV               @tab X      @tab
 | 
			
		||||
@item MPEG1/2           @tab X      @tab X
 | 
			
		||||
@item MXF               @tab X      @tab X
 | 
			
		||||
@end multitable
 | 
			
		||||
 
 | 
			
		||||
@@ -258,32 +258,6 @@ git commit
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@chapter Git configuration
 | 
			
		||||
 | 
			
		||||
In order to simplify a few workflows, it is advisable to configure both
 | 
			
		||||
your personal Git installation and your local FFmpeg repository.
 | 
			
		||||
 | 
			
		||||
@section Personal Git installation
 | 
			
		||||
 | 
			
		||||
Add the following to your @file{~/.gitconfig} to help @command{git send-email}
 | 
			
		||||
and @command{git format-patch} detect renames:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
[diff]
 | 
			
		||||
        renames = copy
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section Repository configuration
 | 
			
		||||
 | 
			
		||||
In order to have @command{git send-email} automatically send patches
 | 
			
		||||
to the ffmpeg-devel mailing list, add the following stanza
 | 
			
		||||
to @file{/path/to/ffmpeg/repository/.git/config}:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
[sendemail]
 | 
			
		||||
        to = ffmpeg-devel@@ffmpeg.org
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@chapter FFmpeg specific
 | 
			
		||||
 | 
			
		||||
@section Reverting broken commits
 | 
			
		||||
@@ -372,43 +346,6 @@ git checkout -b svn_23456 $SHA1
 | 
			
		||||
 | 
			
		||||
where @var{$SHA1} is the commit hash from the @command{git log} output.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@chapter pre-push checklist
 | 
			
		||||
 | 
			
		||||
Once you have a set of commits that you feel are ready for pushing,
 | 
			
		||||
work through the following checklist to doublecheck everything is in
 | 
			
		||||
proper order. This list tries to be exhaustive. In case you are just
 | 
			
		||||
pushing a typo in a comment, some of the steps may be unnecessary.
 | 
			
		||||
Apply your common sense, but if in doubt, err on the side of caution.
 | 
			
		||||
 | 
			
		||||
First, make sure that the commits and branches you are going to push
 | 
			
		||||
match what you want pushed and that nothing is missing, extraneous or
 | 
			
		||||
wrong. You can see what will be pushed by running the git push command
 | 
			
		||||
with --dry-run first. And then inspecting the commits listed with
 | 
			
		||||
@command{git log -p 1234567..987654}. The @command{git status} command
 | 
			
		||||
may help in finding local changes that have been forgotten to be added.
 | 
			
		||||
 | 
			
		||||
Next let the code pass through a full run of our testsuite.
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
@item @command{make distclean}
 | 
			
		||||
@item @command{/path/to/ffmpeg/configure}
 | 
			
		||||
@item @command{make check}
 | 
			
		||||
@item if fate fails due to missing samples run @command{make fate-rsync} and retry
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
Make sure all your changes have been checked before pushing them, the
 | 
			
		||||
testsuite only checks against regressions and that only to some extend. It does
 | 
			
		||||
obviously not check newly added features/code to be working unless you have
 | 
			
		||||
added a test for that (which is recommended).
 | 
			
		||||
 | 
			
		||||
Also note that every single commit should pass the test suite, not just
 | 
			
		||||
the result of a series of patches.
 | 
			
		||||
 | 
			
		||||
Once everything passed, push the changes to your public ffmpeg clone and post a
 | 
			
		||||
merge request to ffmpeg-devel. You can also push them directly but this is not
 | 
			
		||||
recommended.
 | 
			
		||||
 | 
			
		||||
@chapter Server Issues
 | 
			
		||||
 | 
			
		||||
Contact the project admins @email{root@@ffmpeg.org} if you have technical
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										351
									
								
								doc/indevs.texi
									
									
									
									
									
								
							
							
						
						
									
										351
									
								
								doc/indevs.texi
									
									
									
									
									
								
							@@ -86,7 +86,7 @@ fail to open.
 | 
			
		||||
Set the video size in the captured video.
 | 
			
		||||
 | 
			
		||||
@item framerate
 | 
			
		||||
Set the frame rate in the captured video.
 | 
			
		||||
Set the framerate in the captured video.
 | 
			
		||||
 | 
			
		||||
@item sample_rate
 | 
			
		||||
Set the sample rate (in Hz) of the captured audio.
 | 
			
		||||
@@ -112,19 +112,6 @@ defaults to 0).
 | 
			
		||||
Set audio device number for devices with same name (starts at 0,
 | 
			
		||||
defaults to 0).
 | 
			
		||||
 | 
			
		||||
@item pixel_format
 | 
			
		||||
Select pixel format to be used by DirectShow. This may only be set when
 | 
			
		||||
the video codec is not set or set to rawvideo.
 | 
			
		||||
 | 
			
		||||
@item audio_buffer_size
 | 
			
		||||
Set audio device buffer size in milliseconds (which can directly
 | 
			
		||||
impact latency, depending on the device).
 | 
			
		||||
Defaults to using the audio device's
 | 
			
		||||
default buffer size (typically some multiple of 500ms).
 | 
			
		||||
Setting this value too low can degrade performance.
 | 
			
		||||
See also
 | 
			
		||||
@url{http://msdn.microsoft.com/en-us/library/windows/desktop/dd377582(v=vs.85).aspx}
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Examples
 | 
			
		||||
@@ -192,66 +179,6 @@ ffmpeg -f fbdev -frames:v 1 -r 1 -i /dev/fb0 screenshot.jpeg
 | 
			
		||||
 | 
			
		||||
See also @url{http://linux-fbdev.sourceforge.net/}, and fbset(1).
 | 
			
		||||
 | 
			
		||||
@section iec61883
 | 
			
		||||
 | 
			
		||||
FireWire DV/HDV input device using libiec61883.
 | 
			
		||||
 | 
			
		||||
To enable this input device, you need libiec61883, libraw1394 and
 | 
			
		||||
libavc1394 installed on your system. Use the configure option
 | 
			
		||||
@code{--enable-libiec61883} to compile with the device enabled.
 | 
			
		||||
 | 
			
		||||
The iec61883 capture device supports capturing from a video device
 | 
			
		||||
connected via IEEE1394 (FireWire), using libiec61883 and the new Linux
 | 
			
		||||
FireWire stack (juju). This is the default DV/HDV input method in Linux
 | 
			
		||||
Kernel 2.6.37 and later, since the old FireWire stack was removed.
 | 
			
		||||
 | 
			
		||||
Specify the FireWire port to be used as input file, or "auto"
 | 
			
		||||
to choose the first port connected.
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item dvtype
 | 
			
		||||
Override autodetection of DV/HDV. This should only be used if auto
 | 
			
		||||
detection does not work, or if usage of a different device type
 | 
			
		||||
should be prohibited. Treating a DV device as HDV (or vice versa) will
 | 
			
		||||
not work and result in undefined behavior.
 | 
			
		||||
The values @option{auto}, @option{dv} and @option{hdv} are supported.
 | 
			
		||||
 | 
			
		||||
@item dvbuffer
 | 
			
		||||
Set maxiumum size of buffer for incoming data, in frames. For DV, this
 | 
			
		||||
is an exact value. For HDV, it is not frame exact, since HDV does
 | 
			
		||||
not have a fixed frame size.
 | 
			
		||||
 | 
			
		||||
@item dvguid
 | 
			
		||||
Select the capture device by specifying it's GUID. Capturing will only
 | 
			
		||||
be performed from the specified device and fails if no device with the
 | 
			
		||||
given GUID is found. This is useful to select the input if multiple
 | 
			
		||||
devices are connected at the same time.
 | 
			
		||||
Look at /sys/bus/firewire/devices to find out the GUIDs.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Examples
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Grab and show the input of a FireWire DV/HDV device.
 | 
			
		||||
@example
 | 
			
		||||
ffplay -f iec61883 -i auto
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Grab and record the input of a FireWire DV/HDV device,
 | 
			
		||||
using a packet buffer of 100000 packets if the source is HDV.
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f iec61883 -i auto -hdvbuffer 100000 out.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
@section jack
 | 
			
		||||
 | 
			
		||||
JACK input device.
 | 
			
		||||
@@ -327,12 +254,6 @@ label, but all the others need to be specified explicitly.
 | 
			
		||||
 | 
			
		||||
If not specified defaults to the filename specified for the input
 | 
			
		||||
device.
 | 
			
		||||
 | 
			
		||||
@item graph_file
 | 
			
		||||
Set the filename of the filtergraph to be read and sent to the other
 | 
			
		||||
filters. Syntax of the filtergraph is the same as the one specified by
 | 
			
		||||
the option @var{graph}.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Examples
 | 
			
		||||
@@ -341,14 +262,14 @@ the option @var{graph}.
 | 
			
		||||
@item
 | 
			
		||||
Create a color video stream and play it back with @command{ffplay}:
 | 
			
		||||
@example
 | 
			
		||||
ffplay -f lavfi -graph "color=c=pink [out0]" dummy
 | 
			
		||||
ffplay -f lavfi -graph "color=pink [out0]" dummy
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
As the previous example, but use filename for specifying the graph
 | 
			
		||||
description, and omit the "out0" label:
 | 
			
		||||
@example
 | 
			
		||||
ffplay -f lavfi color=c=pink
 | 
			
		||||
ffplay -f lavfi color=pink
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
@@ -485,52 +406,87 @@ For more information about OSS see:
 | 
			
		||||
 | 
			
		||||
@section pulse
 | 
			
		||||
 | 
			
		||||
PulseAudio input device.
 | 
			
		||||
pulseaudio input device.
 | 
			
		||||
 | 
			
		||||
To enable this output device you need to configure FFmpeg with @code{--enable-libpulse}.
 | 
			
		||||
To enable this input device during configuration you need libpulse-simple
 | 
			
		||||
installed in your system.
 | 
			
		||||
 | 
			
		||||
The filename to provide to the input device is a source device or the
 | 
			
		||||
string "default"
 | 
			
		||||
 | 
			
		||||
To list the PulseAudio source devices and their properties you can invoke
 | 
			
		||||
To list the pulse source devices and their properties you can invoke
 | 
			
		||||
the command @command{pactl list sources}.
 | 
			
		||||
 | 
			
		||||
More information about PulseAudio can be found on @url{http://www.pulseaudio.org}.
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
@table @option
 | 
			
		||||
@item server
 | 
			
		||||
Connect to a specific PulseAudio server, specified by an IP address.
 | 
			
		||||
Default server is used when not provided.
 | 
			
		||||
 | 
			
		||||
@item name
 | 
			
		||||
Specify the application name PulseAudio will use when showing active clients,
 | 
			
		||||
by default it is the @code{LIBAVFORMAT_IDENT} string.
 | 
			
		||||
 | 
			
		||||
@item stream_name
 | 
			
		||||
Specify the stream name PulseAudio will use when showing active streams,
 | 
			
		||||
by default it is "record".
 | 
			
		||||
 | 
			
		||||
@item sample_rate
 | 
			
		||||
Specify the samplerate in Hz, by default 48kHz is used.
 | 
			
		||||
 | 
			
		||||
@item channels
 | 
			
		||||
Specify the channels in use, by default 2 (stereo) is set.
 | 
			
		||||
 | 
			
		||||
@item frame_size
 | 
			
		||||
Specify the number of bytes per frame, by default it is set to 1024.
 | 
			
		||||
 | 
			
		||||
@item fragment_size
 | 
			
		||||
Specify the minimal buffering fragment in PulseAudio, it will affect the
 | 
			
		||||
audio latency. By default it is unset.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Examples
 | 
			
		||||
Record a stream from default device:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f pulse -i default /tmp/pulse.wav
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@subsection @var{server} AVOption
 | 
			
		||||
 | 
			
		||||
The syntax is:
 | 
			
		||||
@example
 | 
			
		||||
-server @var{server name}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Connects to a specific server.
 | 
			
		||||
 | 
			
		||||
@subsection @var{name} AVOption
 | 
			
		||||
 | 
			
		||||
The syntax is:
 | 
			
		||||
@example
 | 
			
		||||
-name @var{application name}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Specify the application name pulse will use when showing active clients,
 | 
			
		||||
by default it is the LIBAVFORMAT_IDENT string
 | 
			
		||||
 | 
			
		||||
@subsection @var{stream_name} AVOption
 | 
			
		||||
 | 
			
		||||
The syntax is:
 | 
			
		||||
@example
 | 
			
		||||
-stream_name @var{stream name}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Specify the stream name pulse will use when showing active streams,
 | 
			
		||||
by default it is "record"
 | 
			
		||||
 | 
			
		||||
@subsection @var{sample_rate} AVOption
 | 
			
		||||
 | 
			
		||||
The syntax is:
 | 
			
		||||
@example
 | 
			
		||||
-sample_rate @var{samplerate}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Specify the samplerate in Hz, by default 48kHz is used.
 | 
			
		||||
 | 
			
		||||
@subsection @var{channels} AVOption
 | 
			
		||||
 | 
			
		||||
The syntax is:
 | 
			
		||||
@example
 | 
			
		||||
-channels @var{N}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Specify the channels in use, by default 2 (stereo) is set.
 | 
			
		||||
 | 
			
		||||
@subsection @var{frame_size} AVOption
 | 
			
		||||
 | 
			
		||||
The syntax is:
 | 
			
		||||
@example
 | 
			
		||||
-frame_size @var{bytes}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Specify the number of byte per frame, by default it is set to 1024.
 | 
			
		||||
 | 
			
		||||
@subsection @var{fragment_size} AVOption
 | 
			
		||||
 | 
			
		||||
The syntax is:
 | 
			
		||||
@example
 | 
			
		||||
-fragment_size @var{bytes}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Specify the minimal buffering fragment in pulseaudio, it will affect the
 | 
			
		||||
audio latency. By default it is unset.
 | 
			
		||||
 | 
			
		||||
@section sndio
 | 
			
		||||
 | 
			
		||||
sndio input device.
 | 
			
		||||
@@ -548,16 +504,10 @@ command:
 | 
			
		||||
ffmpeg -f sndio -i /dev/audio0 /tmp/oss.wav
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section video4linux2, v4l2
 | 
			
		||||
@section video4linux2
 | 
			
		||||
 | 
			
		||||
Video4Linux2 input video device.
 | 
			
		||||
 | 
			
		||||
"v4l2" can be used as alias for "video4linux2".
 | 
			
		||||
 | 
			
		||||
If FFmpeg is built with v4l-utils support (by using the
 | 
			
		||||
@code{--enable-libv4l2} configure option), it is possible to use it with the
 | 
			
		||||
@code{-use_libv4l2} input device option.
 | 
			
		||||
 | 
			
		||||
The name of the device to grab is a file device node, usually Linux
 | 
			
		||||
systems tend to automatically create such nodes when the device
 | 
			
		||||
(e.g. an USB webcam) is plugged into the system, and has a name of the
 | 
			
		||||
@@ -565,10 +515,10 @@ kind @file{/dev/video@var{N}}, where @var{N} is a number associated to
 | 
			
		||||
the device.
 | 
			
		||||
 | 
			
		||||
Video4Linux2 devices usually support a limited set of
 | 
			
		||||
@var{width}x@var{height} sizes and frame rates. You can check which are
 | 
			
		||||
@var{width}x@var{height} sizes and framerates. You can check which are
 | 
			
		||||
supported using @command{-list_formats all} for Video4Linux2 devices.
 | 
			
		||||
Some devices, like TV cards, support one or more standards. It is possible
 | 
			
		||||
to list all the supported standards using @command{-list_standards all}.
 | 
			
		||||
 | 
			
		||||
Some usage examples of the video4linux2 devices with ffmpeg and ffplay:
 | 
			
		||||
 | 
			
		||||
The time base for the timestamps is 1 microsecond. Depending on the kernel
 | 
			
		||||
version and configuration, the timestamps may be derived from the real time
 | 
			
		||||
@@ -577,94 +527,19 @@ boot time, unaffected by NTP or manual changes to the clock). The
 | 
			
		||||
@option{-timestamps abs} or @option{-ts abs} option can be used to force
 | 
			
		||||
conversion into the real time clock.
 | 
			
		||||
 | 
			
		||||
Some usage examples of the video4linux2 device with @command{ffmpeg}
 | 
			
		||||
and @command{ffplay}:
 | 
			
		||||
@itemize
 | 
			
		||||
@item
 | 
			
		||||
Grab and show the input of a video4linux2 device:
 | 
			
		||||
Note that if FFmpeg is build with v4l-utils support ("--enable-libv4l2"
 | 
			
		||||
option), it will always be used.
 | 
			
		||||
@example
 | 
			
		||||
# Grab and show the input of a video4linux2 device.
 | 
			
		||||
ffplay -f video4linux2 -framerate 30 -video_size hd720 /dev/video0
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Grab and record the input of a video4linux2 device, leave the
 | 
			
		||||
frame rate and size as previously set:
 | 
			
		||||
@example
 | 
			
		||||
# Grab and record the input of a video4linux2 device, leave the
 | 
			
		||||
framerate and size as previously set.
 | 
			
		||||
ffmpeg -f video4linux2 -input_format mjpeg -i /dev/video0 out.mpeg
 | 
			
		||||
@end example
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
For more information about Video4Linux, check @url{http://linuxtv.org/}.
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item standard
 | 
			
		||||
Set the standard. Must be the name of a supported standard. To get a
 | 
			
		||||
list of the supported standards, use the @option{list_standards}
 | 
			
		||||
option.
 | 
			
		||||
 | 
			
		||||
@item channel
 | 
			
		||||
Set the input channel number. Default to -1, which means using the
 | 
			
		||||
previously selected channel.
 | 
			
		||||
 | 
			
		||||
@item video_size
 | 
			
		||||
Set the video frame size. The argument must be a string in the form
 | 
			
		||||
@var{WIDTH}x@var{HEIGHT} or a valid size abbreviation.
 | 
			
		||||
 | 
			
		||||
@item pixel_format
 | 
			
		||||
Select the pixel format (only valid for raw video input).
 | 
			
		||||
 | 
			
		||||
@item input_format
 | 
			
		||||
Set the preferred pixel format (for raw video) or a codec name.
 | 
			
		||||
This option allows to select the input format, when several are
 | 
			
		||||
available.
 | 
			
		||||
 | 
			
		||||
@item framerate
 | 
			
		||||
Set the preferred video frame rate.
 | 
			
		||||
 | 
			
		||||
@item list_formats
 | 
			
		||||
List available formats (supported pixel formats, codecs, and frame
 | 
			
		||||
sizes) and exit.
 | 
			
		||||
 | 
			
		||||
Available values are:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item all
 | 
			
		||||
Show all available (compressed and non-compressed) formats.
 | 
			
		||||
 | 
			
		||||
@item raw
 | 
			
		||||
Show only raw video (non-compressed) formats.
 | 
			
		||||
 | 
			
		||||
@item compressed
 | 
			
		||||
Show only compressed formats.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item list_standards
 | 
			
		||||
List supported standards and exit.
 | 
			
		||||
 | 
			
		||||
Available values are:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item all
 | 
			
		||||
Show all supported standards.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item timestamps, ts
 | 
			
		||||
Set type of timestamps for grabbed frames.
 | 
			
		||||
 | 
			
		||||
Available values are:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item default
 | 
			
		||||
Use timestamps from the kernel.
 | 
			
		||||
 | 
			
		||||
@item abs
 | 
			
		||||
Use absolute timestamps (wall clock).
 | 
			
		||||
 | 
			
		||||
@item mono2abs
 | 
			
		||||
Force conversion from monotonic to absolute timestamps.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Default value is @code{default}.
 | 
			
		||||
@end table
 | 
			
		||||
"v4l" and "v4l2" can be used as aliases for the respective "video4linux" and
 | 
			
		||||
"video4linux2".
 | 
			
		||||
 | 
			
		||||
@section vfwcap
 | 
			
		||||
 | 
			
		||||
@@ -701,25 +576,19 @@ properties of your X11 display (e.g. grep for "name" or "dimensions").
 | 
			
		||||
 | 
			
		||||
For example to grab from @file{:0.0} using @command{ffmpeg}:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f x11grab -framerate 25 -video_size cif -i :0.0 out.mpg
 | 
			
		||||
ffmpeg -f x11grab -r 25 -s cif -i :0.0 out.mpg
 | 
			
		||||
 | 
			
		||||
# Grab at position 10,20.
 | 
			
		||||
ffmpeg -f x11grab -r 25 -s cif -i :0.0+10,20 out.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Grab at position @code{10,20}:
 | 
			
		||||
@subsection @var{follow_mouse} AVOption
 | 
			
		||||
 | 
			
		||||
The syntax is:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f x11grab -framerate 25 -video_size cif -i :0.0+10,20 out.mpg
 | 
			
		||||
-follow_mouse centered|@var{PIXELS}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item draw_mouse
 | 
			
		||||
Specify whether to draw the mouse pointer. A value of @code{0} specify
 | 
			
		||||
not to draw the pointer. Default value is @code{1}.
 | 
			
		||||
 | 
			
		||||
@item follow_mouse
 | 
			
		||||
Make the grabbed area follow the mouse. The argument can be
 | 
			
		||||
@code{centered} or a number of pixels @var{PIXELS}.
 | 
			
		||||
 | 
			
		||||
When it is specified with "centered", the grabbing region follows the mouse
 | 
			
		||||
pointer and keeps the pointer at the center of region; otherwise, the region
 | 
			
		||||
follows only when the mouse pointer reaches within @var{PIXELS} (greater than
 | 
			
		||||
@@ -727,37 +596,29 @@ zero) to the edge of region.
 | 
			
		||||
 | 
			
		||||
For example:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f x11grab -follow_mouse centered -framerate 25 -video_size cif -i :0.0 out.mpg
 | 
			
		||||
ffmpeg -f x11grab -follow_mouse centered -r 25 -s cif -i :0.0 out.mpg
 | 
			
		||||
 | 
			
		||||
# Follows only when the mouse pointer reaches within 100 pixels to edge
 | 
			
		||||
ffmpeg -f x11grab -follow_mouse 100 -r 25 -s cif -i :0.0 out.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
To follow only when the mouse pointer reaches within 100 pixels to edge:
 | 
			
		||||
@subsection @var{show_region} AVOption
 | 
			
		||||
 | 
			
		||||
The syntax is:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f x11grab -follow_mouse 100 -framerate 25 -video_size cif -i :0.0 out.mpg
 | 
			
		||||
-show_region 1
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item framerate
 | 
			
		||||
Set the grabbing frame rate. Default value is @code{ntsc},
 | 
			
		||||
corresponding to a frame rate of @code{30000/1001}.
 | 
			
		||||
 | 
			
		||||
@item show_region
 | 
			
		||||
Show grabbed region on screen.
 | 
			
		||||
 | 
			
		||||
If @var{show_region} is specified with @code{1}, then the grabbing
 | 
			
		||||
region will be indicated on screen. With this option, it is easy to
 | 
			
		||||
know what is being grabbed if only a portion of the screen is grabbed.
 | 
			
		||||
If @var{show_region} AVOption is specified with @var{1}, then the grabbing
 | 
			
		||||
region will be indicated on screen. With this option, it's easy to know what is
 | 
			
		||||
being grabbed if only a portion of the screen is grabbed.
 | 
			
		||||
 | 
			
		||||
For example:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f x11grab -show_region 1 -framerate 25 -video_size cif -i :0.0+10,20 out.mpg
 | 
			
		||||
@end example
 | 
			
		||||
ffmpeg -f x11grab -show_region 1 -r 25 -s cif -i :0.0+10,20 out.mpg
 | 
			
		||||
 | 
			
		||||
With @var{follow_mouse}:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f x11grab -follow_mouse centered -show_region 1 -framerate 25 -video_size cif -i :0.0 out.mpg
 | 
			
		||||
# With follow_mouse
 | 
			
		||||
ffmpeg -f x11grab -follow_mouse centered -show_region 1  -r 25 -s cif -i :0.0 out.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item video_size
 | 
			
		||||
Set the video frame size. Default value is @code{vga}.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@c man end INPUT DEVICES
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
FFmpeg's bug/feature request tracker manual
 | 
			
		||||
FFmpeg's bug/patch/feature request tracker manual
 | 
			
		||||
=================================================
 | 
			
		||||
 | 
			
		||||
NOTE: This is a draft.
 | 
			
		||||
@@ -11,7 +11,7 @@ existing issues can be done through a web interface.
 | 
			
		||||
 | 
			
		||||
Issues can be different kinds of things we want to keep track of
 | 
			
		||||
but that do not belong into the source tree itself. This includes
 | 
			
		||||
bug reports, feature requests and license violations. We
 | 
			
		||||
bug reports, patches, feature requests and license violations. We
 | 
			
		||||
might add more items to this list in the future, so feel free to
 | 
			
		||||
propose a new `type of issue' on the ffmpeg-devel mailing list if
 | 
			
		||||
you feel it is worth tracking.
 | 
			
		||||
@@ -24,13 +24,10 @@ a mail for every change to every issue.
 | 
			
		||||
The subscription URL for the ffmpeg-trac list is:
 | 
			
		||||
http(s)://ffmpeg.org/mailman/listinfo/ffmpeg-trac
 | 
			
		||||
The URL of the webinterface of the tracker is:
 | 
			
		||||
http(s)://trac.ffmpeg.org
 | 
			
		||||
http(s)://ffmpeg.org/trac/ffmpeg
 | 
			
		||||
 | 
			
		||||
Type:
 | 
			
		||||
-----
 | 
			
		||||
art
 | 
			
		||||
    Artwork such as photos, music, banners, and logos.
 | 
			
		||||
 | 
			
		||||
bug / defect
 | 
			
		||||
    An error, flaw, mistake, failure, or fault in FFmpeg or libav* that
 | 
			
		||||
    prevents it from behaving as intended.
 | 
			
		||||
@@ -44,18 +41,20 @@ feature request / enhancement
 | 
			
		||||
license violation
 | 
			
		||||
    ticket to keep track of (L)GPL violations of ffmpeg by others
 | 
			
		||||
 | 
			
		||||
sponsoring request
 | 
			
		||||
    Developer requests for hardware, software, specifications, money,
 | 
			
		||||
    refunds, etc.
 | 
			
		||||
patch
 | 
			
		||||
    A patch as generated by diff which conforms to the patch submission and
 | 
			
		||||
    development policy.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Priority:
 | 
			
		||||
---------
 | 
			
		||||
critical
 | 
			
		||||
    Bugs about data loss and security issues.
 | 
			
		||||
    Bugs and patches which deal with data loss and security issues.
 | 
			
		||||
    No feature request can be critical.
 | 
			
		||||
 | 
			
		||||
important
 | 
			
		||||
    Bugs which make FFmpeg unusable for a significant number of users.
 | 
			
		||||
    Bugs which make FFmpeg unusable for a significant number of users, and
 | 
			
		||||
    patches fixing them.
 | 
			
		||||
    Examples here might be completely broken MPEG-4 decoding or a build issue
 | 
			
		||||
    on Linux.
 | 
			
		||||
    While broken 4xm decoding or a broken OS/2 build would not be important,
 | 
			
		||||
@@ -69,7 +68,7 @@ normal
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
minor
 | 
			
		||||
    Bugs about things like spelling errors, "mp2" instead of
 | 
			
		||||
    Bugs and patches about things like spelling errors, "mp2" instead of
 | 
			
		||||
    "mp3" being shown and such.
 | 
			
		||||
    Feature requests about things few people want or which do not make a big
 | 
			
		||||
    difference.
 | 
			
		||||
@@ -104,13 +103,13 @@ This state implicates that the bug either has been reproduced or that
 | 
			
		||||
reproduction is not needed as the bug is already understood.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Type/Status:
 | 
			
		||||
Type/Status/Substatus:
 | 
			
		||||
----------
 | 
			
		||||
*/new
 | 
			
		||||
    Initial state of new bugs and feature requests submitted by
 | 
			
		||||
*/new/new
 | 
			
		||||
    Initial state of new bugs, patches and feature requests submitted by
 | 
			
		||||
    users.
 | 
			
		||||
 | 
			
		||||
*/open
 | 
			
		||||
*/open/open
 | 
			
		||||
    Issues which have been briefly looked at and which did not look outright
 | 
			
		||||
    invalid.
 | 
			
		||||
    This implicates that no real more detailed state applies yet. Conversely,
 | 
			
		||||
@@ -118,7 +117,9 @@ Type/Status:
 | 
			
		||||
    looked at.
 | 
			
		||||
 | 
			
		||||
*/closed/duplicate
 | 
			
		||||
    Bugs or feature requests which are duplicates.
 | 
			
		||||
    Bugs, patches or feature requests which are duplicates.
 | 
			
		||||
    Note that patches dealing with the same thing in a different way are not
 | 
			
		||||
    duplicates.
 | 
			
		||||
    Note, if you mark something as duplicate, do not forget setting the
 | 
			
		||||
    superseder so bug reports are properly linked.
 | 
			
		||||
 | 
			
		||||
@@ -133,7 +134,7 @@ Type/Status:
 | 
			
		||||
bug/closed/fixed
 | 
			
		||||
    Bugs which have to the best of our knowledge been fixed.
 | 
			
		||||
 | 
			
		||||
bug/closed/wontfix
 | 
			
		||||
bug/closed/wont_fix
 | 
			
		||||
    Bugs which we will not fix. Possible reasons include legality, high
 | 
			
		||||
    complexity for the sake of supporting obscure corner cases, speed loss
 | 
			
		||||
    for similarly esoteric purposes, et cetera.
 | 
			
		||||
@@ -147,15 +148,33 @@ bug/closed/works_for_me
 | 
			
		||||
    reproduction failed - that is the code seems to work correctly to the
 | 
			
		||||
    best of our knowledge.
 | 
			
		||||
 | 
			
		||||
feature_request/closed/fixed
 | 
			
		||||
patch/open/approved
 | 
			
		||||
    Patches which have been reviewed and approved by a developer.
 | 
			
		||||
    Such patches can be applied anytime by any other developer after some
 | 
			
		||||
    reasonable testing (compile + regression tests + does the patch do
 | 
			
		||||
    what the author claimed).
 | 
			
		||||
 | 
			
		||||
patch/open/needs_changes
 | 
			
		||||
    Patches which have been reviewed and need changes to be accepted.
 | 
			
		||||
 | 
			
		||||
patch/closed/applied
 | 
			
		||||
    Patches which have been applied.
 | 
			
		||||
 | 
			
		||||
patch/closed/rejected
 | 
			
		||||
    Patches which have been rejected.
 | 
			
		||||
 | 
			
		||||
feature_request/closed/implemented
 | 
			
		||||
    Feature requests which have been implemented.
 | 
			
		||||
 | 
			
		||||
feature_request/closed/wontfix
 | 
			
		||||
feature_request/closed/wont_implement
 | 
			
		||||
    Feature requests which will not be implemented. The reasons here could
 | 
			
		||||
    be legal, philosophical or others.
 | 
			
		||||
 | 
			
		||||
Note, please do not use type-status-substatus combinations other than the
 | 
			
		||||
above without asking on ffmpeg-dev first!
 | 
			
		||||
 | 
			
		||||
Note2, if you provide the requested info do not forget to remove the
 | 
			
		||||
needs_more_info resolution.
 | 
			
		||||
needs_more_info substatus.
 | 
			
		||||
 | 
			
		||||
Component:
 | 
			
		||||
----------
 | 
			
		||||
 
 | 
			
		||||
@@ -1,48 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle Libavcodec Documentation
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{Libavcodec Documentation}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
The libavcodec library provides a generic encoding/decoding framework
 | 
			
		||||
and contains multiple decoders and encoders for audio, video and
 | 
			
		||||
subtitle streams, and several bitstream filters.
 | 
			
		||||
 | 
			
		||||
The shared architecture provides various services ranging from bit
 | 
			
		||||
stream I/O to DSP optimizations, and makes it suitable for
 | 
			
		||||
implementing robust and fast codecs as well as for experimentation.
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{ffmpeg-codecs.html,ffmpeg-codecs}, @url{ffmpeg-bitstream-filters.html,bitstream-filters},
 | 
			
		||||
@url{libavutil.html,libavutil}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1),
 | 
			
		||||
ffmpeg-codecs(1), ffmpeg-bitstream-filters(1),
 | 
			
		||||
libavutil(3)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename libavcodec
 | 
			
		||||
@settitle media streams decoding and encoding library
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
@@ -1,45 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle Libavdevice Documentation
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{Libavdevice Documentation}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
The libavdevice library provides a generic framework for grabbing from
 | 
			
		||||
and rendering to many common multimedia input/output devices, and
 | 
			
		||||
supports several input and output devices, including Video4Linux2,
 | 
			
		||||
VfW, DShow, and ALSA.
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{ffmpeg-devices.html,ffmpeg-devices},
 | 
			
		||||
@url{libavutil.html,libavutil}, @url{libavcodec.html,libavcodec}, @url{libavformat.html,libavformat}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1),
 | 
			
		||||
ffmpeg-devices(1),
 | 
			
		||||
libavutil(3), libavcodec(3), libavformat(3)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename libavdevice
 | 
			
		||||
@settitle multimedia device handling library
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
@@ -9,36 +9,84 @@
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
@chapter Introduction
 | 
			
		||||
 | 
			
		||||
The libavfilter library provides a generic audio/video filtering
 | 
			
		||||
framework containing several filters, sources and sinks.
 | 
			
		||||
Libavfilter is the filtering API of FFmpeg. It is the substitute of the
 | 
			
		||||
now deprecated 'vhooks' and started as a Google Summer of Code project.
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
Audio filtering integration into the main FFmpeg repository is a work in
 | 
			
		||||
progress, so audio API and ABI should not be considered stable yet.
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
@chapter Tutorial
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{ffmpeg-filters.html,ffmpeg-filters},
 | 
			
		||||
@url{libavutil.html,libavutil}, @url{libswscale.html,libswscale}, @url{libswresample.html,libswresample},
 | 
			
		||||
@url{libavcodec.html,libavcodec}, @url{libavformat.html,libavformat}, @url{libavdevice.html,libavdevice}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
In libavfilter, it is possible for filters to have multiple inputs and
 | 
			
		||||
multiple outputs.
 | 
			
		||||
To illustrate the sorts of things that are possible, we can
 | 
			
		||||
use a complex filter graph. For example, the following one:
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1),
 | 
			
		||||
ffmpeg-filters(1),
 | 
			
		||||
libavutil(3), libswscale(3), libswresample(3), libavcodec(3), libavformat(3), libavdevice(3)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
@example
 | 
			
		||||
input --> split --> fifo -----------------------> overlay --> output
 | 
			
		||||
            |                                        ^
 | 
			
		||||
            |                                        |
 | 
			
		||||
            +------> fifo --> crop --> vflip --------+
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
splits the stream in two streams, sends one stream through the crop filter
 | 
			
		||||
and the vflip filter before merging it back with the other stream by
 | 
			
		||||
overlaying it on top. You can use the following command to achieve this:
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i input -vf "[in] split [T1], fifo, [T2] overlay=0:H/2 [out]; [T1] fifo, crop=iw:ih/2:0:ih/2, vflip [T2]" output
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@setfilename libavfilter
 | 
			
		||||
@settitle multimedia filtering library
 | 
			
		||||
The result will be that in output the top half of the video is mirrored
 | 
			
		||||
onto the bottom half.
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
Video filters are loaded using the @var{-vf} option passed to
 | 
			
		||||
@command{ffmpeg} or to @command{ffplay}. Filters in the same linear
 | 
			
		||||
chain are separated by commas. In our example, @var{split, fifo,
 | 
			
		||||
overlay} are in one linear chain, and @var{fifo, crop, vflip} are in
 | 
			
		||||
another. The points where the linear chains join are labeled by names
 | 
			
		||||
enclosed in square brackets. In our example, that is @var{[T1]} and
 | 
			
		||||
@var{[T2]}. The magic labels @var{[in]} and @var{[out]} are the points
 | 
			
		||||
where video is input and output.
 | 
			
		||||
 | 
			
		||||
Some filters take in input a list of parameters: they are specified
 | 
			
		||||
after the filter name and an equal sign, and are separated each other
 | 
			
		||||
by a semicolon.
 | 
			
		||||
 | 
			
		||||
There exist so-called @var{source filters} that do not have a video
 | 
			
		||||
input, and we expect in the future some @var{sink filters} that will
 | 
			
		||||
not have video output.
 | 
			
		||||
 | 
			
		||||
@chapter graph2dot
 | 
			
		||||
 | 
			
		||||
The @file{graph2dot} program included in the FFmpeg @file{tools}
 | 
			
		||||
directory can be used to parse a filter graph description and issue a
 | 
			
		||||
corresponding textual representation in the dot language.
 | 
			
		||||
 | 
			
		||||
Invoke the command:
 | 
			
		||||
@example
 | 
			
		||||
graph2dot -h
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
to see how to use @file{graph2dot}.
 | 
			
		||||
 | 
			
		||||
You can then pass the dot description to the @file{dot} program (from
 | 
			
		||||
the graphviz suite of programs) and obtain a graphical representation
 | 
			
		||||
of the filter graph.
 | 
			
		||||
 | 
			
		||||
For example the sequence of commands:
 | 
			
		||||
@example
 | 
			
		||||
echo @var{GRAPH_DESCRIPTION} | \
 | 
			
		||||
tools/graph2dot -o graph.tmp && \
 | 
			
		||||
dot -Tpng graph.tmp -o graph.png && \
 | 
			
		||||
display graph.png
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
can be used to create and display an image representing the graph
 | 
			
		||||
described by the @var{GRAPH_DESCRIPTION} string.
 | 
			
		||||
 | 
			
		||||
@include filters.texi
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
 
 | 
			
		||||
@@ -1,48 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle Libavformat Documentation
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{Libavformat Documentation}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
The libavformat library provides a generic framework for multiplexing
 | 
			
		||||
and demultiplexing (muxing and demuxing) audio, video and subtitle
 | 
			
		||||
streams. It encompasses multiple muxers and demuxers for multimedia
 | 
			
		||||
container formats.
 | 
			
		||||
 | 
			
		||||
It also supports several input and output protocols to access a media
 | 
			
		||||
resource.
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{ffmpeg-formats.html,ffmpeg-formats}, @url{ffmpeg-protocols.html,ffmpeg-protocols},
 | 
			
		||||
@url{libavutil.html,libavutil}, @url{libavcodec.html,libavcodec}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1),
 | 
			
		||||
ffmpeg-formats(1), ffmpeg-protocols(1),
 | 
			
		||||
libavutil(3), libavcodec(3)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename libavformat
 | 
			
		||||
@settitle multimedia muxing and demuxing library
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
@@ -1,44 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle Libavutil Documentation
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{Libavutil Documentation}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
The libavutil library is a utility library to aid portable
 | 
			
		||||
multimedia programming. It contains safe portable string functions,
 | 
			
		||||
random number generators, data structures, additional mathematics
 | 
			
		||||
functions, cryptography and multimedia related functionality (like
 | 
			
		||||
enumerations for pixel and sample formats).
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{ffmpeg-utils.html,ffmpeg-utils}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1),
 | 
			
		||||
ffmpeg-utils(1)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename libavutil
 | 
			
		||||
@settitle multimedia-biased utility library
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
@@ -1,70 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle Libswresample Documentation
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{Libswresample Documentation}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
The libswresample library performs highly optimized audio resampling,
 | 
			
		||||
rematrixing and sample format conversion operations.
 | 
			
		||||
 | 
			
		||||
Specifically, this library performs the following conversions:
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
@item
 | 
			
		||||
@emph{Resampling}: is the process of changing the audio rate, for
 | 
			
		||||
example from a high sample rate of 44100Hz to 8000Hz. Audio
 | 
			
		||||
conversion from high to low sample rate is a lossy process. Several
 | 
			
		||||
resampling options and algorithms are available.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
@emph{Format conversion}: is the process of converting the type of
 | 
			
		||||
samples, for example from 16-bit signed samples to unsigned 8-bit or
 | 
			
		||||
float samples. It also handles packing conversion, when passing from
 | 
			
		||||
packed layout (all samples belonging to distinct channels interleaved
 | 
			
		||||
in the same buffer), to planar layout (all samples belonging to the
 | 
			
		||||
same channel stored in a dedicated buffer or "plane").
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
@emph{Rematrixing}: is the process of changing the channel layout, for
 | 
			
		||||
example from stereo to mono. When the input channels cannot be mapped
 | 
			
		||||
to the output streams, the process is lossy, since it involves
 | 
			
		||||
different gain factors and mixing.
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
Various other audio conversions (e.g. stretching and padding) are
 | 
			
		||||
enabled through dedicated options.
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{ffmpeg-resampler.html,ffmpeg-resampler},
 | 
			
		||||
@url{libavutil.html,libavutil}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1),
 | 
			
		||||
ffmpeg-resampler(1),
 | 
			
		||||
libavutil(3)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename libswresample
 | 
			
		||||
@settitle audio resampling library
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
@@ -1,63 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle Libswscale Documentation
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{Libswscale Documentation}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
@c man begin DESCRIPTION
 | 
			
		||||
 | 
			
		||||
The libswscale library performs highly optimized image scaling and
 | 
			
		||||
colorspace and pixel format conversion operations.
 | 
			
		||||
 | 
			
		||||
Specifically, this library performs the following conversions:
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
@item
 | 
			
		||||
@emph{Rescaling}: is the process of changing the video size. Several
 | 
			
		||||
rescaling options and algorithms are available. This is usually a
 | 
			
		||||
lossy process.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
@emph{Pixel format conversion}: is the process of converting the image
 | 
			
		||||
format and colorspace of the image, for example from planar YUV420P to
 | 
			
		||||
RGB24 packed. It also handles packing conversion, that is converts
 | 
			
		||||
from packed layout (all pixels belonging to distinct planes
 | 
			
		||||
interleaved in the same buffer), to planar layout (all samples
 | 
			
		||||
belonging to the same plane stored in a dedicated buffer or "plane").
 | 
			
		||||
 | 
			
		||||
This is usually a lossy process in case the source and destination
 | 
			
		||||
colorspaces differ.
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
@c man end DESCRIPTION
 | 
			
		||||
 | 
			
		||||
@chapter See Also
 | 
			
		||||
 | 
			
		||||
@ifhtml
 | 
			
		||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver},
 | 
			
		||||
@url{ffmpeg-scaler.html,ffmpeg-scaler},
 | 
			
		||||
@url{libavutil.html,libavutil}
 | 
			
		||||
@end ifhtml
 | 
			
		||||
 | 
			
		||||
@ifnothtml
 | 
			
		||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1),
 | 
			
		||||
ffmpeg-scaler(1),
 | 
			
		||||
libavutil(3)
 | 
			
		||||
@end ifnothtml
 | 
			
		||||
 | 
			
		||||
@include authors.texi
 | 
			
		||||
 | 
			
		||||
@ignore
 | 
			
		||||
 | 
			
		||||
@setfilename libswscale
 | 
			
		||||
@settitle video scaling and pixel format conversion library
 | 
			
		||||
 | 
			
		||||
@end ignore
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
@@ -65,20 +65,4 @@ title=chapter \#1
 | 
			
		||||
title=multi\
 | 
			
		||||
line
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
By using the ffmetadata muxer and demuxer it is possible to extract
 | 
			
		||||
metadata from an input file to an ffmetadata file, and then transcode
 | 
			
		||||
the file into an output file with the edited ffmetadata file.
 | 
			
		||||
 | 
			
		||||
Extracting an ffmetadata file with @file{ffmpeg} goes as follows:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -f ffmetadata FFMETADATAFILE
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Reinserting edited metadata information from the FFMETADATAFILE file can
 | 
			
		||||
be done as:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -i FFMETADATAFILE -map_metadata 1 -codec copy OUTPUT
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@c man end METADATA
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										75
									
								
								doc/mips.txt
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								doc/mips.txt
									
									
									
									
									
								
							@@ -1,75 +0,0 @@
 | 
			
		||||
MIPS optimizations info
 | 
			
		||||
===============================================
 | 
			
		||||
 | 
			
		||||
MIPS optimizations of codecs are targeting MIPS 74k family of
 | 
			
		||||
CPUs. Some of these optimizations are relying more on properties of
 | 
			
		||||
this architecture and some are relying less (and can be used on most
 | 
			
		||||
MIPS architectures without degradation in performance).
 | 
			
		||||
 | 
			
		||||
Along with FFMPEG copyright notice, there is MIPS copyright notice in
 | 
			
		||||
all the files that are created by people from MIPS Technologies.
 | 
			
		||||
 | 
			
		||||
Example of copyright notice:
 | 
			
		||||
===============================================
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2012
 | 
			
		||||
 *      MIPS Technologies, Inc., California.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 * modification, are permitted provided that the following conditions
 | 
			
		||||
 * are met:
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright
 | 
			
		||||
 *    notice, this list of conditions and the following disclaimer.
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
 *    notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
 *    documentation and/or other materials provided with the distribution.
 | 
			
		||||
 * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from
 | 
			
		||||
 *    this software without specific prior written permission.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND
 | 
			
		||||
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE
 | 
			
		||||
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
			
		||||
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
			
		||||
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
			
		||||
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
			
		||||
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
			
		||||
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
			
		||||
 * SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * Author:  Author Name (author_name@@mips.com)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
Files that have MIPS copyright notice in them:
 | 
			
		||||
===============================================
 | 
			
		||||
* libavutil/mips/
 | 
			
		||||
      float_dsp_mips.c
 | 
			
		||||
      libm_mips.h
 | 
			
		||||
* libavcodec/
 | 
			
		||||
      fft_fixed_32.c
 | 
			
		||||
      fft_init_table.c
 | 
			
		||||
      fft_table.h
 | 
			
		||||
      mdct_fixed_32.c
 | 
			
		||||
* libavcodec/mips/
 | 
			
		||||
      aaccoder_mips.c
 | 
			
		||||
      aacpsy_mips.h
 | 
			
		||||
      ac3dsp_mips.c
 | 
			
		||||
      acelp_filters_mips.c
 | 
			
		||||
      acelp_vectors_mips.c
 | 
			
		||||
      amrwbdec_mips.c
 | 
			
		||||
      amrwbdec_mips.h
 | 
			
		||||
      celp_filters_mips.c
 | 
			
		||||
      celp_math_mips.c
 | 
			
		||||
      compute_antialias_fixed.h
 | 
			
		||||
      compute_antialias_float.h
 | 
			
		||||
      lsp_mips.h
 | 
			
		||||
      dsputil_mips.c
 | 
			
		||||
      fft_mips.c
 | 
			
		||||
      fft_table.h
 | 
			
		||||
      fft_init_table.c
 | 
			
		||||
      fmtconvert_mips.c
 | 
			
		||||
      iirfilter_mips.c
 | 
			
		||||
      mpegaudiodsp_mips_fixed.c
 | 
			
		||||
      mpegaudiodsp_mips_float.c
 | 
			
		||||
@@ -57,11 +57,6 @@ which re-allocates them for other threads.
 | 
			
		||||
Add CODEC_CAP_FRAME_THREADS to the codec capabilities. There will be very little
 | 
			
		||||
speed gain at this point but it should work.
 | 
			
		||||
 | 
			
		||||
If there are inter-frame dependencies, so the codec calls
 | 
			
		||||
ff_thread_report/await_progress(), set AVCodecInternal.allocate_progress. The
 | 
			
		||||
frames must then be freed with ff_thread_release_buffer().
 | 
			
		||||
Otherwise leave it at zero and decode directly into the user-supplied frames.
 | 
			
		||||
 | 
			
		||||
Call ff_thread_report_progress() after some part of the current picture has decoded.
 | 
			
		||||
A good place to put this is where draw_horiz_band() is called - add this if it isn't
 | 
			
		||||
called anywhere, as it's useful too and the implementation is trivial when you're
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										805
									
								
								doc/muxers.texi
									
									
									
									
									
								
							
							
						
						
									
										805
									
								
								doc/muxers.texi
									
									
									
									
									
								
							@@ -18,23 +18,6 @@ enabled muxers.
 | 
			
		||||
 | 
			
		||||
A description of some of the currently available muxers follows.
 | 
			
		||||
 | 
			
		||||
@anchor{aiff}
 | 
			
		||||
@section aiff
 | 
			
		||||
 | 
			
		||||
Audio Interchange File Format muxer.
 | 
			
		||||
 | 
			
		||||
It accepts the following options:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item write_id3v2
 | 
			
		||||
Enable ID3v2 tags writing when set to 1. Default is 0 (disabled).
 | 
			
		||||
 | 
			
		||||
@item id3v2_version
 | 
			
		||||
Select ID3v2 version to write. Currently only version 3 and 4 (aka.
 | 
			
		||||
ID3v2.3 and ID3v2.4) are supported. The default is version 4.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@anchor{crc}
 | 
			
		||||
@section crc
 | 
			
		||||
 | 
			
		||||
@@ -146,65 +129,6 @@ ffmpeg -i INPUT -f framemd5 -
 | 
			
		||||
 | 
			
		||||
See also the @ref{md5} muxer.
 | 
			
		||||
 | 
			
		||||
@anchor{hls}
 | 
			
		||||
@section hls
 | 
			
		||||
 | 
			
		||||
Apple HTTP Live Streaming muxer that segments MPEG-TS according to
 | 
			
		||||
the HTTP Live Streaming specification.
 | 
			
		||||
 | 
			
		||||
It creates a playlist file and numbered segment files. The output
 | 
			
		||||
filename specifies the playlist filename; the segment filenames
 | 
			
		||||
receive the same basename as the playlist, a sequential number and
 | 
			
		||||
a .ts extension.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i in.nut out.m3u8
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -hls_time @var{seconds}
 | 
			
		||||
Set the segment length in seconds.
 | 
			
		||||
@item -hls_list_size @var{size}
 | 
			
		||||
Set the maximum number of playlist entries.
 | 
			
		||||
@item -hls_wrap @var{wrap}
 | 
			
		||||
Set the number after which index wraps.
 | 
			
		||||
@item -start_number @var{number}
 | 
			
		||||
Start the sequence from @var{number}.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@anchor{ico}
 | 
			
		||||
@section ico
 | 
			
		||||
 | 
			
		||||
ICO file muxer.
 | 
			
		||||
 | 
			
		||||
Microsoft's icon file format (ICO) has some strict limitations that should be noted:
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
@item
 | 
			
		||||
Size cannot exceed 256 pixels in any dimension
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Only BMP and PNG images can be stored
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
If a BMP image is used, it must be one of the following pixel formats:
 | 
			
		||||
@example
 | 
			
		||||
BMP Bit Depth      FFmpeg Pixel Format
 | 
			
		||||
1bit               pal8
 | 
			
		||||
4bit               pal8
 | 
			
		||||
8bit               pal8
 | 
			
		||||
16bit              rgb555le
 | 
			
		||||
24bit              bgr24
 | 
			
		||||
32bit              bgra
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
If a BMP image is used, it must use the BITMAPINFOHEADER DIB header
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
If a PNG image is used, it must use the rgba pixel format
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
@anchor{image2}
 | 
			
		||||
@section image2
 | 
			
		||||
 | 
			
		||||
@@ -257,24 +181,173 @@ Note also that the pattern must not necessarily contain "%d" or
 | 
			
		||||
ffmpeg -i in.avi -f image2 -frames:v 1 img.jpeg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item start_number @var{number}
 | 
			
		||||
Start the sequence from @var{number}. Default value is 1. Must be a
 | 
			
		||||
non-negative number.
 | 
			
		||||
 | 
			
		||||
@item -update @var{number}
 | 
			
		||||
If @var{number} is nonzero, the filename will always be interpreted as just a
 | 
			
		||||
filename, not a pattern, and this file will be continuously overwritten with new
 | 
			
		||||
images.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
The image muxer supports the .Y.U.V image file format. This format is
 | 
			
		||||
special in that that each image frame consists of three files, for
 | 
			
		||||
each of the YUV420P components. To read or write this image file format,
 | 
			
		||||
specify the name of the '.Y' file. The muxer will automatically open the
 | 
			
		||||
'.U' and '.V' files as required.
 | 
			
		||||
 | 
			
		||||
@anchor{md5}
 | 
			
		||||
@section md5
 | 
			
		||||
 | 
			
		||||
MD5 testing format.
 | 
			
		||||
 | 
			
		||||
This muxer computes and prints the MD5 hash of all the input audio
 | 
			
		||||
and video frames. By default audio frames are converted to signed
 | 
			
		||||
16-bit raw audio and video frames to raw video before computing the
 | 
			
		||||
hash.
 | 
			
		||||
 | 
			
		||||
The output of the muxer consists of a single line of the form:
 | 
			
		||||
MD5=@var{MD5}, where @var{MD5} is a hexadecimal number representing
 | 
			
		||||
the computed MD5 hash.
 | 
			
		||||
 | 
			
		||||
For example to compute the MD5 hash of the input converted to raw
 | 
			
		||||
audio and video, and store it in the file @file{out.md5}:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -f md5 out.md5
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
You can print the MD5 to stdout with the command:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -f md5 -
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
See also the @ref{framemd5} muxer.
 | 
			
		||||
 | 
			
		||||
@section MOV/MP4/ISMV
 | 
			
		||||
 | 
			
		||||
The mov/mp4/ismv muxer supports fragmentation. Normally, a MOV/MP4
 | 
			
		||||
file has all the metadata about all packets stored in one location
 | 
			
		||||
(written at the end of the file, it can be moved to the start for
 | 
			
		||||
better playback using the @command{qt-faststart} tool). A fragmented
 | 
			
		||||
file consists of a number of fragments, where packets and metadata
 | 
			
		||||
about these packets are stored together. Writing a fragmented
 | 
			
		||||
file has the advantage that the file is decodable even if the
 | 
			
		||||
writing is interrupted (while a normal MOV/MP4 is undecodable if
 | 
			
		||||
it is not properly finished), and it requires less memory when writing
 | 
			
		||||
very long files (since writing normal MOV/MP4 files stores info about
 | 
			
		||||
every single packet in memory until the file is closed). The downside
 | 
			
		||||
is that it is less compatible with other applications.
 | 
			
		||||
 | 
			
		||||
Fragmentation is enabled by setting one of the AVOptions that define
 | 
			
		||||
how to cut the file into fragments:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -moov_size @var{bytes}
 | 
			
		||||
Reserves space for the moov atom at the beginning of the file instead of placing the
 | 
			
		||||
moov atom at the end. If the space reserved is insufficient, muxing will fail.
 | 
			
		||||
@item -movflags frag_keyframe
 | 
			
		||||
Start a new fragment at each video keyframe.
 | 
			
		||||
@item -frag_duration @var{duration}
 | 
			
		||||
Create fragments that are @var{duration} microseconds long.
 | 
			
		||||
@item -frag_size @var{size}
 | 
			
		||||
Create fragments that contain up to @var{size} bytes of payload data.
 | 
			
		||||
@item -movflags frag_custom
 | 
			
		||||
Allow the caller to manually choose when to cut fragments, by
 | 
			
		||||
calling @code{av_write_frame(ctx, NULL)} to write a fragment with
 | 
			
		||||
the packets written so far. (This is only useful with other
 | 
			
		||||
applications integrating libavformat, not from @command{ffmpeg}.)
 | 
			
		||||
@item -min_frag_duration @var{duration}
 | 
			
		||||
Don't create fragments that are shorter than @var{duration} microseconds long.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
If more than one condition is specified, fragments are cut when
 | 
			
		||||
one of the specified conditions is fulfilled. The exception to this is
 | 
			
		||||
@code{-min_frag_duration}, which has to be fulfilled for any of the other
 | 
			
		||||
conditions to apply.
 | 
			
		||||
 | 
			
		||||
Additionally, the way the output file is written can be adjusted
 | 
			
		||||
through a few other options:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -movflags empty_moov
 | 
			
		||||
Write an initial moov atom directly at the start of the file, without
 | 
			
		||||
describing any samples in it. Generally, an mdat/moov pair is written
 | 
			
		||||
at the start of the file, as a normal MOV/MP4 file, containing only
 | 
			
		||||
a short portion of the file. With this option set, there is no initial
 | 
			
		||||
mdat atom, and the moov atom only describes the tracks but has
 | 
			
		||||
a zero duration.
 | 
			
		||||
 | 
			
		||||
Files written with this option set do not work in QuickTime.
 | 
			
		||||
This option is implicitly set when writing ismv (Smooth Streaming) files.
 | 
			
		||||
@item -movflags separate_moof
 | 
			
		||||
Write a separate moof (movie fragment) atom for each track. Normally,
 | 
			
		||||
packets for all tracks are written in a moof atom (which is slightly
 | 
			
		||||
more efficient), but with this option set, the muxer writes one moof/mdat
 | 
			
		||||
pair for each track, making it easier to separate tracks.
 | 
			
		||||
 | 
			
		||||
This option is implicitly set when writing ismv (Smooth Streaming) files.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Smooth Streaming content can be pushed in real time to a publishing
 | 
			
		||||
point on IIS with this muxer. Example:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -re @var{<normal input/transcoding options>} -movflags isml+frag_keyframe -f ismv http://server/publishingpoint.isml/Streams(Encoder1)
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section mpegts
 | 
			
		||||
 | 
			
		||||
MPEG transport stream muxer.
 | 
			
		||||
 | 
			
		||||
This muxer implements ISO 13818-1 and part of ETSI EN 300 468.
 | 
			
		||||
 | 
			
		||||
The muxer options are:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -mpegts_original_network_id @var{number}
 | 
			
		||||
Set the original_network_id (default 0x0001). This is unique identifier
 | 
			
		||||
of a network in DVB. Its main use is in the unique identification of a
 | 
			
		||||
service through the path Original_Network_ID, Transport_Stream_ID.
 | 
			
		||||
@item -mpegts_transport_stream_id @var{number}
 | 
			
		||||
Set the transport_stream_id (default 0x0001). This identifies a
 | 
			
		||||
transponder in DVB.
 | 
			
		||||
@item -mpegts_service_id @var{number}
 | 
			
		||||
Set the service_id (default 0x0001) also known as program in DVB.
 | 
			
		||||
@item -mpegts_pmt_start_pid @var{number}
 | 
			
		||||
Set the first PID for PMT (default 0x1000, max 0x1f00).
 | 
			
		||||
@item -mpegts_start_pid @var{number}
 | 
			
		||||
Set the first PID for data packets (default 0x0100, max 0x0f00).
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
The recognized metadata settings in mpegts muxer are @code{service_provider}
 | 
			
		||||
and @code{service_name}. If they are not set the default for
 | 
			
		||||
@code{service_provider} is "FFmpeg" and the default for
 | 
			
		||||
@code{service_name} is "Service01".
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i file.mpg -c copy \
 | 
			
		||||
     -mpegts_original_network_id 0x1122 \
 | 
			
		||||
     -mpegts_transport_stream_id 0x3344 \
 | 
			
		||||
     -mpegts_service_id 0x5566 \
 | 
			
		||||
     -mpegts_pmt_start_pid 0x1500 \
 | 
			
		||||
     -mpegts_start_pid 0x150 \
 | 
			
		||||
     -metadata service_provider="Some provider" \
 | 
			
		||||
     -metadata service_name="Some Channel" \
 | 
			
		||||
     -y out.ts
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section null
 | 
			
		||||
 | 
			
		||||
Null muxer.
 | 
			
		||||
 | 
			
		||||
This muxer does not generate any output file, it is mainly useful for
 | 
			
		||||
testing or benchmarking purposes.
 | 
			
		||||
 | 
			
		||||
For example to benchmark decoding with @command{ffmpeg} you can use the
 | 
			
		||||
command:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -benchmark -i INPUT -f null out.null
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Note that the above command does not read or write the @file{out.null}
 | 
			
		||||
file, but specifying the output file is required by the @command{ffmpeg}
 | 
			
		||||
syntax.
 | 
			
		||||
 | 
			
		||||
Alternatively you can write the command as:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -benchmark -i INPUT -f null -
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section matroska
 | 
			
		||||
 | 
			
		||||
Matroska container muxer.
 | 
			
		||||
@@ -338,130 +411,36 @@ For example a 3D WebM clip can be created using the following command line:
 | 
			
		||||
ffmpeg -i sample_left_right_clip.mpg -an -c:v libvpx -metadata stereo_mode=left_right -y stereo_clip.webm
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
This muxer supports the following options:
 | 
			
		||||
@section segment
 | 
			
		||||
 | 
			
		||||
Basic stream segmenter.
 | 
			
		||||
 | 
			
		||||
The segmenter muxer outputs streams to a number of separate files of nearly
 | 
			
		||||
fixed duration. Output filename pattern can be set in a fashion similar to
 | 
			
		||||
@ref{image2}.
 | 
			
		||||
 | 
			
		||||
Every segment starts with a video keyframe, if a video stream is present.
 | 
			
		||||
The segment muxer works best with a single constant frame rate video.
 | 
			
		||||
 | 
			
		||||
Optionally it can generate a flat list of the created segments, one segment
 | 
			
		||||
per line.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item reserve_index_space
 | 
			
		||||
By default, this muxer writes the index for seeking (called cues in Matroska
 | 
			
		||||
terms) at the end of the file, because it cannot know in advance how much space
 | 
			
		||||
to leave for the index at the beginning of the file. However for some use cases
 | 
			
		||||
-- e.g.  streaming where seeking is possible but slow -- it is useful to put the
 | 
			
		||||
index at the beginning of the file.
 | 
			
		||||
 | 
			
		||||
If this option is set to a non-zero value, the muxer will reserve a given amount
 | 
			
		||||
of space in the file header and then try to write the cues there when the muxing
 | 
			
		||||
finishes. If the available space does not suffice, muxing will fail. A safe size
 | 
			
		||||
for most use cases should be about 50kB per hour of video.
 | 
			
		||||
 | 
			
		||||
Note that cues are only written if the output is seekable and this option will
 | 
			
		||||
have no effect if it is not.
 | 
			
		||||
 | 
			
		||||
@item segment_format @var{format}
 | 
			
		||||
Override the inner container format, by default it is guessed by the filename
 | 
			
		||||
extension.
 | 
			
		||||
@item segment_time @var{t}
 | 
			
		||||
Set segment duration to @var{t} seconds.
 | 
			
		||||
@item segment_list @var{name}
 | 
			
		||||
Generate also a listfile named @var{name}.
 | 
			
		||||
@item segment_list_size @var{size}
 | 
			
		||||
Overwrite the listfile once it reaches @var{size} entries.
 | 
			
		||||
@item segment_wrap @var{limit}
 | 
			
		||||
Wrap around segment index once it reaches @var{limit}.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@anchor{md5}
 | 
			
		||||
@section md5
 | 
			
		||||
 | 
			
		||||
MD5 testing format.
 | 
			
		||||
 | 
			
		||||
This muxer computes and prints the MD5 hash of all the input audio
 | 
			
		||||
and video frames. By default audio frames are converted to signed
 | 
			
		||||
16-bit raw audio and video frames to raw video before computing the
 | 
			
		||||
hash.
 | 
			
		||||
 | 
			
		||||
The output of the muxer consists of a single line of the form:
 | 
			
		||||
MD5=@var{MD5}, where @var{MD5} is a hexadecimal number representing
 | 
			
		||||
the computed MD5 hash.
 | 
			
		||||
 | 
			
		||||
For example to compute the MD5 hash of the input converted to raw
 | 
			
		||||
audio and video, and store it in the file @file{out.md5}:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -f md5 out.md5
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
You can print the MD5 to stdout with the command:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -f md5 -
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
See also the @ref{framemd5} muxer.
 | 
			
		||||
 | 
			
		||||
@section MOV/MP4/ISMV
 | 
			
		||||
 | 
			
		||||
The mov/mp4/ismv muxer supports fragmentation. Normally, a MOV/MP4
 | 
			
		||||
file has all the metadata about all packets stored in one location
 | 
			
		||||
(written at the end of the file, it can be moved to the start for
 | 
			
		||||
better playback by adding @var{faststart} to the @var{movflags}, or
 | 
			
		||||
using the @command{qt-faststart} tool). A fragmented
 | 
			
		||||
file consists of a number of fragments, where packets and metadata
 | 
			
		||||
about these packets are stored together. Writing a fragmented
 | 
			
		||||
file has the advantage that the file is decodable even if the
 | 
			
		||||
writing is interrupted (while a normal MOV/MP4 is undecodable if
 | 
			
		||||
it is not properly finished), and it requires less memory when writing
 | 
			
		||||
very long files (since writing normal MOV/MP4 files stores info about
 | 
			
		||||
every single packet in memory until the file is closed). The downside
 | 
			
		||||
is that it is less compatible with other applications.
 | 
			
		||||
 | 
			
		||||
Fragmentation is enabled by setting one of the AVOptions that define
 | 
			
		||||
how to cut the file into fragments:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -moov_size @var{bytes}
 | 
			
		||||
Reserves space for the moov atom at the beginning of the file instead of placing the
 | 
			
		||||
moov atom at the end. If the space reserved is insufficient, muxing will fail.
 | 
			
		||||
@item -movflags frag_keyframe
 | 
			
		||||
Start a new fragment at each video keyframe.
 | 
			
		||||
@item -frag_duration @var{duration}
 | 
			
		||||
Create fragments that are @var{duration} microseconds long.
 | 
			
		||||
@item -frag_size @var{size}
 | 
			
		||||
Create fragments that contain up to @var{size} bytes of payload data.
 | 
			
		||||
@item -movflags frag_custom
 | 
			
		||||
Allow the caller to manually choose when to cut fragments, by
 | 
			
		||||
calling @code{av_write_frame(ctx, NULL)} to write a fragment with
 | 
			
		||||
the packets written so far. (This is only useful with other
 | 
			
		||||
applications integrating libavformat, not from @command{ffmpeg}.)
 | 
			
		||||
@item -min_frag_duration @var{duration}
 | 
			
		||||
Don't create fragments that are shorter than @var{duration} microseconds long.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
If more than one condition is specified, fragments are cut when
 | 
			
		||||
one of the specified conditions is fulfilled. The exception to this is
 | 
			
		||||
@code{-min_frag_duration}, which has to be fulfilled for any of the other
 | 
			
		||||
conditions to apply.
 | 
			
		||||
 | 
			
		||||
Additionally, the way the output file is written can be adjusted
 | 
			
		||||
through a few other options:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -movflags empty_moov
 | 
			
		||||
Write an initial moov atom directly at the start of the file, without
 | 
			
		||||
describing any samples in it. Generally, an mdat/moov pair is written
 | 
			
		||||
at the start of the file, as a normal MOV/MP4 file, containing only
 | 
			
		||||
a short portion of the file. With this option set, there is no initial
 | 
			
		||||
mdat atom, and the moov atom only describes the tracks but has
 | 
			
		||||
a zero duration.
 | 
			
		||||
 | 
			
		||||
Files written with this option set do not work in QuickTime.
 | 
			
		||||
This option is implicitly set when writing ismv (Smooth Streaming) files.
 | 
			
		||||
@item -movflags separate_moof
 | 
			
		||||
Write a separate moof (movie fragment) atom for each track. Normally,
 | 
			
		||||
packets for all tracks are written in a moof atom (which is slightly
 | 
			
		||||
more efficient), but with this option set, the muxer writes one moof/mdat
 | 
			
		||||
pair for each track, making it easier to separate tracks.
 | 
			
		||||
 | 
			
		||||
This option is implicitly set when writing ismv (Smooth Streaming) files.
 | 
			
		||||
@item -movflags faststart
 | 
			
		||||
Run a second pass moving the index (moov atom) to the beginning of the file.
 | 
			
		||||
This operation can take a while, and will not work in various situations such
 | 
			
		||||
as fragmented output, thus it is not enabled by default.
 | 
			
		||||
@item -movflags rtphint
 | 
			
		||||
Add RTP hinting tracks to the output file.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Smooth Streaming content can be pushed in real time to a publishing
 | 
			
		||||
point on IIS with this muxer. Example:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -re @var{<normal input/transcoding options>} -movflags isml+frag_keyframe -f ismv http://server/publishingpoint.isml/Streams(Encoder1)
 | 
			
		||||
ffmpeg -i in.mkv -c copy -map 0 -f segment -list out.list out%03d.nut
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section mp3
 | 
			
		||||
@@ -493,416 +472,10 @@ Write an mp3 with an ID3v2.3 header and an ID3v1 footer:
 | 
			
		||||
ffmpeg -i INPUT -id3v2_version 3 -write_id3v1 1 out.mp3
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
To attach a picture to an mp3 file select both the audio and the picture stream
 | 
			
		||||
with @code{map}:
 | 
			
		||||
Attach a picture to an mp3:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i input.mp3 -i cover.png -c copy -map 0 -map 1
 | 
			
		||||
-metadata:s:v title="Album cover" -metadata:s:v comment="Cover (Front)" out.mp3
 | 
			
		||||
ffmpeg -i input.mp3 -i cover.png -c copy -metadata:s:v title="Album cover"
 | 
			
		||||
-metadata:s:v comment="Cover (Front)" out.mp3
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section mpegts
 | 
			
		||||
 | 
			
		||||
MPEG transport stream muxer.
 | 
			
		||||
 | 
			
		||||
This muxer implements ISO 13818-1 and part of ETSI EN 300 468.
 | 
			
		||||
 | 
			
		||||
The muxer options are:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -mpegts_original_network_id @var{number}
 | 
			
		||||
Set the original_network_id (default 0x0001). This is unique identifier
 | 
			
		||||
of a network in DVB. Its main use is in the unique identification of a
 | 
			
		||||
service through the path Original_Network_ID, Transport_Stream_ID.
 | 
			
		||||
@item -mpegts_transport_stream_id @var{number}
 | 
			
		||||
Set the transport_stream_id (default 0x0001). This identifies a
 | 
			
		||||
transponder in DVB.
 | 
			
		||||
@item -mpegts_service_id @var{number}
 | 
			
		||||
Set the service_id (default 0x0001) also known as program in DVB.
 | 
			
		||||
@item -mpegts_pmt_start_pid @var{number}
 | 
			
		||||
Set the first PID for PMT (default 0x1000, max 0x1f00).
 | 
			
		||||
@item -mpegts_start_pid @var{number}
 | 
			
		||||
Set the first PID for data packets (default 0x0100, max 0x0f00).
 | 
			
		||||
@item -mpegts_m2ts_mode @var{number}
 | 
			
		||||
Enable m2ts mode if set to 1. Default value is -1 which disables m2ts mode.
 | 
			
		||||
@item -muxrate @var{number}
 | 
			
		||||
Set muxrate.
 | 
			
		||||
@item -pes_payload_size @var{number}
 | 
			
		||||
Set minimum PES packet payload in bytes.
 | 
			
		||||
@item -mpegts_flags @var{flags}
 | 
			
		||||
Set flags (see below).
 | 
			
		||||
@item -mpegts_copyts @var{number}
 | 
			
		||||
Preserve original timestamps, if value is set to 1. Default value is -1, which
 | 
			
		||||
results in shifting timestamps so that they start from 0.
 | 
			
		||||
@item -tables_version @var{number}
 | 
			
		||||
Set PAT, PMT and SDT version (default 0, valid values are from 0 to 31, inclusively).
 | 
			
		||||
This option allows updating stream structure so that standard consumer may
 | 
			
		||||
detect the change. To do so, reopen output AVFormatContext (in case of API
 | 
			
		||||
usage) or restart ffmpeg instance, cyclically changing tables_version value:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i source1.ts -codec copy -f mpegts -tables_version 0 udp://1.1.1.1:1111
 | 
			
		||||
ffmpeg -i source2.ts -codec copy -f mpegts -tables_version 1 udp://1.1.1.1:1111
 | 
			
		||||
...
 | 
			
		||||
ffmpeg -i source3.ts -codec copy -f mpegts -tables_version 31 udp://1.1.1.1:1111
 | 
			
		||||
ffmpeg -i source1.ts -codec copy -f mpegts -tables_version 0 udp://1.1.1.1:1111
 | 
			
		||||
ffmpeg -i source2.ts -codec copy -f mpegts -tables_version 1 udp://1.1.1.1:1111
 | 
			
		||||
...
 | 
			
		||||
@end example
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Option mpegts_flags may take a set of such flags:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item resend_headers
 | 
			
		||||
Reemit PAT/PMT before writing the next packet.
 | 
			
		||||
@item latm
 | 
			
		||||
Use LATM packetization for AAC.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
The recognized metadata settings in mpegts muxer are @code{service_provider}
 | 
			
		||||
and @code{service_name}. If they are not set the default for
 | 
			
		||||
@code{service_provider} is "FFmpeg" and the default for
 | 
			
		||||
@code{service_name} is "Service01".
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i file.mpg -c copy \
 | 
			
		||||
     -mpegts_original_network_id 0x1122 \
 | 
			
		||||
     -mpegts_transport_stream_id 0x3344 \
 | 
			
		||||
     -mpegts_service_id 0x5566 \
 | 
			
		||||
     -mpegts_pmt_start_pid 0x1500 \
 | 
			
		||||
     -mpegts_start_pid 0x150 \
 | 
			
		||||
     -metadata service_provider="Some provider" \
 | 
			
		||||
     -metadata service_name="Some Channel" \
 | 
			
		||||
     -y out.ts
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section null
 | 
			
		||||
 | 
			
		||||
Null muxer.
 | 
			
		||||
 | 
			
		||||
This muxer does not generate any output file, it is mainly useful for
 | 
			
		||||
testing or benchmarking purposes.
 | 
			
		||||
 | 
			
		||||
For example to benchmark decoding with @command{ffmpeg} you can use the
 | 
			
		||||
command:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -benchmark -i INPUT -f null out.null
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Note that the above command does not read or write the @file{out.null}
 | 
			
		||||
file, but specifying the output file is required by the @command{ffmpeg}
 | 
			
		||||
syntax.
 | 
			
		||||
 | 
			
		||||
Alternatively you can write the command as:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -benchmark -i INPUT -f null -
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section ogg
 | 
			
		||||
 | 
			
		||||
Ogg container muxer.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -page_duration @var{duration}
 | 
			
		||||
Preferred page duration, in microseconds. The muxer will attempt to create
 | 
			
		||||
pages that are approximately @var{duration} microseconds long. This allows the
 | 
			
		||||
user to compromise between seek granularity and container overhead. The default
 | 
			
		||||
is 1 second. A value of 0 will fill all segments, making pages as large as
 | 
			
		||||
possible. A value of 1 will effectively use 1 packet-per-page in most
 | 
			
		||||
situations, giving a small seek granularity at the cost of additional container
 | 
			
		||||
overhead.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section segment, stream_segment, ssegment
 | 
			
		||||
 | 
			
		||||
Basic stream segmenter.
 | 
			
		||||
 | 
			
		||||
The segmenter muxer outputs streams to a number of separate files of nearly
 | 
			
		||||
fixed duration. Output filename pattern can be set in a fashion similar to
 | 
			
		||||
@ref{image2}.
 | 
			
		||||
 | 
			
		||||
@code{stream_segment} is a variant of the muxer used to write to
 | 
			
		||||
streaming output formats, i.e. which do not require global headers,
 | 
			
		||||
and is recommended for outputting e.g. to MPEG transport stream segments.
 | 
			
		||||
@code{ssegment} is a shorter alias for @code{stream_segment}.
 | 
			
		||||
 | 
			
		||||
Every segment starts with a keyframe of the selected reference stream,
 | 
			
		||||
which is set through the @option{reference_stream} option.
 | 
			
		||||
 | 
			
		||||
Note that if you want accurate splitting for a video file, you need to
 | 
			
		||||
make the input key frames correspond to the exact splitting times
 | 
			
		||||
expected by the segmenter, or the segment muxer will start the new
 | 
			
		||||
segment with the key frame found next after the specified start
 | 
			
		||||
time.
 | 
			
		||||
 | 
			
		||||
The segment muxer works best with a single constant frame rate video.
 | 
			
		||||
 | 
			
		||||
Optionally it can generate a list of the created segments, by setting
 | 
			
		||||
the option @var{segment_list}. The list type is specified by the
 | 
			
		||||
@var{segment_list_type} option.
 | 
			
		||||
 | 
			
		||||
The segment muxer supports the following options:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item reference_stream @var{specifier}
 | 
			
		||||
Set the reference stream, as specified by the string @var{specifier}.
 | 
			
		||||
If @var{specifier} is set to @code{auto}, the reference is choosen
 | 
			
		||||
automatically. Otherwise it must be a stream specifier (see the ``Stream
 | 
			
		||||
specifiers'' chapter in the ffmpeg manual) which specifies the
 | 
			
		||||
reference stream. The default value is @code{auto}.
 | 
			
		||||
 | 
			
		||||
@item segment_format @var{format}
 | 
			
		||||
Override the inner container format, by default it is guessed by the filename
 | 
			
		||||
extension.
 | 
			
		||||
 | 
			
		||||
@item segment_list @var{name}
 | 
			
		||||
Generate also a listfile named @var{name}. If not specified no
 | 
			
		||||
listfile is generated.
 | 
			
		||||
 | 
			
		||||
@item segment_list_flags @var{flags}
 | 
			
		||||
Set flags affecting the segment list generation.
 | 
			
		||||
 | 
			
		||||
It currently supports the following flags:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item cache
 | 
			
		||||
Allow caching (only affects M3U8 list files).
 | 
			
		||||
 | 
			
		||||
@item live
 | 
			
		||||
Allow live-friendly file generation.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Default value is @code{samp}.
 | 
			
		||||
 | 
			
		||||
@item segment_list_size @var{size}
 | 
			
		||||
Update the list file so that it contains at most the last @var{size}
 | 
			
		||||
segments. If 0 the list file will contain all the segments. Default
 | 
			
		||||
value is 0.
 | 
			
		||||
 | 
			
		||||
@item segment_list_type @var{type}
 | 
			
		||||
Specify the format for the segment list file.
 | 
			
		||||
 | 
			
		||||
The following values are recognized:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item flat
 | 
			
		||||
Generate a flat list for the created segments, one segment per line.
 | 
			
		||||
 | 
			
		||||
@item csv, ext
 | 
			
		||||
Generate a list for the created segments, one segment per line,
 | 
			
		||||
each line matching the format (comma-separated values):
 | 
			
		||||
@example
 | 
			
		||||
@var{segment_filename},@var{segment_start_time},@var{segment_end_time}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@var{segment_filename} is the name of the output file generated by the
 | 
			
		||||
muxer according to the provided pattern. CSV escaping (according to
 | 
			
		||||
RFC4180) is applied if required.
 | 
			
		||||
 | 
			
		||||
@var{segment_start_time} and @var{segment_end_time} specify
 | 
			
		||||
the segment start and end time expressed in seconds.
 | 
			
		||||
 | 
			
		||||
A list file with the suffix @code{".csv"} or @code{".ext"} will
 | 
			
		||||
auto-select this format.
 | 
			
		||||
 | 
			
		||||
@samp{ext} is deprecated in favor or @samp{csv}.
 | 
			
		||||
 | 
			
		||||
@item ffconcat
 | 
			
		||||
Generate an ffconcat file for the created segments. The resulting file
 | 
			
		||||
can be read using the FFmpeg @ref{concat} demuxer.
 | 
			
		||||
 | 
			
		||||
A list file with the suffix @code{".ffcat"} or @code{".ffconcat"} will
 | 
			
		||||
auto-select this format.
 | 
			
		||||
 | 
			
		||||
@item m3u8
 | 
			
		||||
Generate an extended M3U8 file, version 3, compliant with
 | 
			
		||||
@url{http://tools.ietf.org/id/draft-pantos-http-live-streaming}.
 | 
			
		||||
 | 
			
		||||
A list file with the suffix @code{".m3u8"} will auto-select this format.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
If not specified the type is guessed from the list file name suffix.
 | 
			
		||||
 | 
			
		||||
@item segment_time @var{time}
 | 
			
		||||
Set segment duration to @var{time}, the value must be a duration
 | 
			
		||||
specification. Default value is "2". See also the
 | 
			
		||||
@option{segment_times} option.
 | 
			
		||||
 | 
			
		||||
Note that splitting may not be accurate, unless you force the
 | 
			
		||||
reference stream key-frames at the given time. See the introductory
 | 
			
		||||
notice and the examples below.
 | 
			
		||||
 | 
			
		||||
@item segment_time_delta @var{delta}
 | 
			
		||||
Specify the accuracy time when selecting the start time for a
 | 
			
		||||
segment, expressed as a duration specification. Default value is "0".
 | 
			
		||||
 | 
			
		||||
When delta is specified a key-frame will start a new segment if its
 | 
			
		||||
PTS satisfies the relation:
 | 
			
		||||
@example
 | 
			
		||||
PTS >= start_time - time_delta
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
This option is useful when splitting video content, which is always
 | 
			
		||||
split at GOP boundaries, in case a key frame is found just before the
 | 
			
		||||
specified split time.
 | 
			
		||||
 | 
			
		||||
In particular may be used in combination with the @file{ffmpeg} option
 | 
			
		||||
@var{force_key_frames}. The key frame times specified by
 | 
			
		||||
@var{force_key_frames} may not be set accurately because of rounding
 | 
			
		||||
issues, with the consequence that a key frame time may result set just
 | 
			
		||||
before the specified time. For constant frame rate videos a value of
 | 
			
		||||
1/2*@var{frame_rate} should address the worst case mismatch between
 | 
			
		||||
the specified time and the time set by @var{force_key_frames}.
 | 
			
		||||
 | 
			
		||||
@item segment_times @var{times}
 | 
			
		||||
Specify a list of split points. @var{times} contains a list of comma
 | 
			
		||||
separated duration specifications, in increasing order. See also
 | 
			
		||||
the @option{segment_time} option.
 | 
			
		||||
 | 
			
		||||
@item segment_frames @var{frames}
 | 
			
		||||
Specify a list of split video frame numbers. @var{frames} contains a
 | 
			
		||||
list of comma separated integer numbers, in increasing order.
 | 
			
		||||
 | 
			
		||||
This option specifies to start a new segment whenever a reference
 | 
			
		||||
stream key frame is found and the sequential number (starting from 0)
 | 
			
		||||
of the frame is greater or equal to the next value in the list.
 | 
			
		||||
 | 
			
		||||
@item segment_wrap @var{limit}
 | 
			
		||||
Wrap around segment index once it reaches @var{limit}.
 | 
			
		||||
 | 
			
		||||
@item segment_start_number @var{number}
 | 
			
		||||
Set the sequence number of the first segment. Defaults to @code{0}.
 | 
			
		||||
 | 
			
		||||
@item reset_timestamps @var{1|0}
 | 
			
		||||
Reset timestamps at the begin of each segment, so that each segment
 | 
			
		||||
will start with near-zero timestamps. It is meant to ease the playback
 | 
			
		||||
of the generated segments. May not work with some combinations of
 | 
			
		||||
muxers/codecs. It is set to @code{0} by default.
 | 
			
		||||
 | 
			
		||||
@item initial_offset @var{offset}
 | 
			
		||||
Specify timestamp offset to apply to the output packet timestamps. The
 | 
			
		||||
argument must be a time duration specification, and defaults to 0.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Examples
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
@item
 | 
			
		||||
To remux the content of file @file{in.mkv} to a list of segments
 | 
			
		||||
@file{out-000.nut}, @file{out-001.nut}, etc., and write the list of
 | 
			
		||||
generated segments to @file{out.list}:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.list out%03d.nut
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
As the example above, but segment the input file according to the split
 | 
			
		||||
points specified by the @var{segment_times} option:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_times 1,2,3,5,8,13,21 out%03d.nut
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
As the example above, but use the @command{ffmpeg} @option{force_key_frames}
 | 
			
		||||
option to force key frames in the input at the specified location, together
 | 
			
		||||
with the segment option @option{segment_time_delta} to account for
 | 
			
		||||
possible roundings operated when setting key frame times.
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i in.mkv -force_key_frames 1,2,3,5,8,13,21 -codec:v mpeg4 -codec:a pcm_s16le -map 0 \
 | 
			
		||||
-f segment -segment_list out.csv -segment_times 1,2,3,5,8,13,21 -segment_time_delta 0.05 out%03d.nut
 | 
			
		||||
@end example
 | 
			
		||||
In order to force key frames on the input file, transcoding is
 | 
			
		||||
required.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Segment the input file by splitting the input file according to the
 | 
			
		||||
frame numbers sequence specified with the @option{segment_frames} option:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_frames 100,200,300,500,800 out%03d.nut
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
To convert the @file{in.mkv} to TS segments using the @code{libx264}
 | 
			
		||||
and @code{libfaac} encoders:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i in.mkv -map 0 -codec:v libx264 -codec:a libfaac -f ssegment -segment_list out.list out%03d.ts
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Segment the input file, and create an M3U8 live playlist (can be used
 | 
			
		||||
as live HLS source):
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -re -i in.mkv -codec copy -map 0 -f segment -segment_list playlist.m3u8 \
 | 
			
		||||
-segment_list_flags +live -segment_time 10 out%03d.mkv
 | 
			
		||||
@end example
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
@section tee
 | 
			
		||||
 | 
			
		||||
The tee muxer can be used to write the same data to several files or any
 | 
			
		||||
other kind of muxer. It can be used, for example, to both stream a video to
 | 
			
		||||
the network and save it to disk at the same time.
 | 
			
		||||
 | 
			
		||||
It is different from specifying several outputs to the @command{ffmpeg}
 | 
			
		||||
command-line tool because the audio and video data will be encoded only once
 | 
			
		||||
with the tee muxer; encoding can be a very expensive process. It is not
 | 
			
		||||
useful when using the libavformat API directly because it is then possible
 | 
			
		||||
to feed the same packets to several muxers directly.
 | 
			
		||||
 | 
			
		||||
The slave outputs are specified in the file name given to the muxer,
 | 
			
		||||
separated by '|'. If any of the slave name contains the '|' separator,
 | 
			
		||||
leading or trailing spaces or any special character, it must be
 | 
			
		||||
escaped (see the ``Quoting and escaping'' section in the ffmpeg-utils
 | 
			
		||||
manual).
 | 
			
		||||
 | 
			
		||||
Muxer options can be specified for each slave by prepending them as a list of
 | 
			
		||||
@var{key}=@var{value} pairs separated by ':', between square brackets. If
 | 
			
		||||
the options values contain a special character or the ':' separator, they
 | 
			
		||||
must be escaped; note that this is a second level escaping.
 | 
			
		||||
 | 
			
		||||
The following special options are also recognized:
 | 
			
		||||
@table @option
 | 
			
		||||
@item f
 | 
			
		||||
Specify the format name. Useful if it cannot be guessed from the
 | 
			
		||||
output name suffix.
 | 
			
		||||
 | 
			
		||||
@item bsfs[/@var{spec}]
 | 
			
		||||
Specify a list of bitstream filters to apply to the specified
 | 
			
		||||
output. It is possible to specify to which streams a given bitstream
 | 
			
		||||
filter applies, by appending a stream specifier to the option
 | 
			
		||||
separated by @code{/}. If the stream specifier is not specified, the
 | 
			
		||||
bistream filters will be applied to all streams in the output.
 | 
			
		||||
 | 
			
		||||
Several bitstream filters can be specified, separated by ",".
 | 
			
		||||
 | 
			
		||||
@item select
 | 
			
		||||
Select the streams that should be mapped to the slave output,
 | 
			
		||||
specified by a stream specifier. If not specified, this defaults to
 | 
			
		||||
all the input streams.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Some examples follow.
 | 
			
		||||
@itemize
 | 
			
		||||
@item
 | 
			
		||||
Encode something and both archive it in a WebM file and stream it
 | 
			
		||||
as MPEG-TS over UDP (the streams need to be explicitly mapped):
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i ... -c:v libx264 -c:a mp2 -f tee -map 0:v -map 0:a
 | 
			
		||||
  "archive-20121107.mkv|[f=mpegts]udp://10.0.1.255:1234/"
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Use @command{ffmpeg} to encode the input, and send the output
 | 
			
		||||
to three different destinations. The @code{dump_extra} bitstream
 | 
			
		||||
filter is used to add extradata information to all the output video
 | 
			
		||||
keyframes packets, as requested by the MPEG-TS format. The select
 | 
			
		||||
option is applied to @file{out.aac} in order to make it contain only
 | 
			
		||||
audio packets.
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i ... -map 0 -flags +global_header -c:v libx264 -c:a aac -strict experimental
 | 
			
		||||
       -f tee "[bsfs/v=dump_extra]out.ts|[movflags=+faststart]out.mp4|[select=a]out.aac"
 | 
			
		||||
@end example
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
Note: some codecs may need different options depending on the output format;
 | 
			
		||||
the auto-detection of this can not work with the tee muxer. The main example
 | 
			
		||||
is the @option{global_header} flag.
 | 
			
		||||
 | 
			
		||||
@c man end MUXERS
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										138
									
								
								doc/nut.texi
									
									
									
									
									
								
							
							
						
						
									
										138
									
								
								doc/nut.texi
									
									
									
									
									
								
							@@ -1,138 +0,0 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle NUT
 | 
			
		||||
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{NUT}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
 | 
			
		||||
@contents
 | 
			
		||||
 | 
			
		||||
@chapter Description
 | 
			
		||||
NUT is a low overhead generic container format. It stores audio, video,
 | 
			
		||||
subtitle and user-defined streams in a simple, yet efficient, way.
 | 
			
		||||
 | 
			
		||||
It was created by a group of FFmpeg and MPlayer developers in 2003
 | 
			
		||||
and was finalized in 2008.
 | 
			
		||||
 | 
			
		||||
The official nut specification is at svn://svn.mplayerhq.hu/nut
 | 
			
		||||
In case of any differences between this text and the official specification,
 | 
			
		||||
the official specification shall prevail.
 | 
			
		||||
 | 
			
		||||
@chapter Container-specific codec tags
 | 
			
		||||
 | 
			
		||||
@section Generic raw YUVA formats
 | 
			
		||||
 | 
			
		||||
Since many exotic planar YUVA pixel formats are not considered by
 | 
			
		||||
the AVI/QuickTime FourCC lists, the following scheme is adopted for
 | 
			
		||||
representing them.
 | 
			
		||||
 | 
			
		||||
The first two bytes can contain the values:
 | 
			
		||||
Y1 = only Y
 | 
			
		||||
Y2 = Y+A
 | 
			
		||||
Y3 = YUV
 | 
			
		||||
Y4 = YUVA
 | 
			
		||||
 | 
			
		||||
The third byte represents the width and height chroma subsampling
 | 
			
		||||
values for the UV planes, that is the amount to shift the luma
 | 
			
		||||
width/height right to find the chroma width/height.
 | 
			
		||||
 | 
			
		||||
The fourth byte is the number of bits used (8, 16, ...).
 | 
			
		||||
 | 
			
		||||
If the order of bytes is inverted, that means that each component has
 | 
			
		||||
to be read big-endian.
 | 
			
		||||
 | 
			
		||||
@section Raw Audio
 | 
			
		||||
 | 
			
		||||
@multitable @columnfractions .4 .4
 | 
			
		||||
@item ALAW  @tab A-LAW
 | 
			
		||||
@item ULAW  @tab MU-LAW
 | 
			
		||||
@item P<type><interleaving><bits> @tab little-endian PCM
 | 
			
		||||
@item <bits><interleaving><type>P @tab big-endian PCM
 | 
			
		||||
@end multitable
 | 
			
		||||
 | 
			
		||||
<type> is S for signed integer, U for unsigned integer, F for IEEE float
 | 
			
		||||
<interleaving> is D for default, P is for planar.
 | 
			
		||||
<bits> is 8/16/24/32
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
PFD[32]   would for example be signed 32 bit little-endian IEEE float
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section Subtitles
 | 
			
		||||
 | 
			
		||||
@multitable @columnfractions .4 .4
 | 
			
		||||
@item UTF8   @tab Raw UTF-8
 | 
			
		||||
@item SSA[0] @tab SubStation Alpha
 | 
			
		||||
@item DVDS   @tab DVD subtitles
 | 
			
		||||
@item DVBS   @tab DVB subtitles
 | 
			
		||||
@end multitable
 | 
			
		||||
 | 
			
		||||
@section Raw Data
 | 
			
		||||
 | 
			
		||||
@multitable @columnfractions .4 .4
 | 
			
		||||
@item UTF8   @tab Raw UTF-8
 | 
			
		||||
@end multitable
 | 
			
		||||
 | 
			
		||||
@section Codecs
 | 
			
		||||
 | 
			
		||||
@multitable @columnfractions .4 .4
 | 
			
		||||
@item 3IV1 @tab non-compliant MPEG-4 generated by old 3ivx
 | 
			
		||||
@item ASV1 @tab Asus Video
 | 
			
		||||
@item ASV2 @tab Asus Video 2
 | 
			
		||||
@item CVID @tab Cinepak
 | 
			
		||||
@item CYUV @tab Creative YUV
 | 
			
		||||
@item DIVX @tab non-compliant MPEG-4 generated by old DivX
 | 
			
		||||
@item DUCK @tab Truemotion 1
 | 
			
		||||
@item FFV1 @tab FFmpeg video 1
 | 
			
		||||
@item FFVH @tab FFmpeg Huffyuv
 | 
			
		||||
@item H261 @tab ITU H.261
 | 
			
		||||
@item H262 @tab ITU H.262
 | 
			
		||||
@item H263 @tab ITU H.263
 | 
			
		||||
@item H264 @tab ITU H.264
 | 
			
		||||
@item HFYU @tab Huffyuv
 | 
			
		||||
@item I263 @tab Intel H.263
 | 
			
		||||
@item IV31 @tab Indeo 3.1
 | 
			
		||||
@item IV32 @tab Indeo 3.2
 | 
			
		||||
@item IV50 @tab Indeo 5.0
 | 
			
		||||
@item LJPG @tab ITU JPEG (lossless)
 | 
			
		||||
@item MJLS @tab ITU JPEG-LS
 | 
			
		||||
@item MJPG @tab ITU JPEG
 | 
			
		||||
@item MPG4 @tab MS MPEG-4v1 (not ISO MPEG-4)
 | 
			
		||||
@item MP42 @tab MS MPEG-4v2
 | 
			
		||||
@item MP43 @tab MS MPEG-4v3
 | 
			
		||||
@item MP4V @tab ISO MPEG-4 Part 2 Video (from old encoders)
 | 
			
		||||
@item mpg1 @tab ISO MPEG-1 Video
 | 
			
		||||
@item mpg2 @tab ISO MPEG-2 Video
 | 
			
		||||
@item MRLE @tab MS RLE
 | 
			
		||||
@item MSVC @tab MS Video 1
 | 
			
		||||
@item RT21 @tab Indeo 2.1
 | 
			
		||||
@item RV10 @tab RealVideo 1.0
 | 
			
		||||
@item RV20 @tab RealVideo 2.0
 | 
			
		||||
@item RV30 @tab RealVideo 3.0
 | 
			
		||||
@item RV40 @tab RealVideo 4.0
 | 
			
		||||
@item SNOW @tab FFmpeg Snow
 | 
			
		||||
@item SVQ1 @tab Sorenson Video 1
 | 
			
		||||
@item SVQ3 @tab Sorenson Video 3
 | 
			
		||||
@item theo @tab Xiph Theora
 | 
			
		||||
@item TM20 @tab Truemotion 2.0
 | 
			
		||||
@item UMP4 @tab non-compliant MPEG-4 generated by UB Video MPEG-4
 | 
			
		||||
@item VCR1 @tab ATI VCR1
 | 
			
		||||
@item VP30 @tab VP 3.0
 | 
			
		||||
@item VP31 @tab VP 3.1
 | 
			
		||||
@item VP50 @tab VP 5.0
 | 
			
		||||
@item VP60 @tab VP 6.0
 | 
			
		||||
@item VP61 @tab VP 6.1
 | 
			
		||||
@item VP62 @tab VP 6.2
 | 
			
		||||
@item VP70 @tab VP 7.0
 | 
			
		||||
@item WMV1 @tab MS WMV7
 | 
			
		||||
@item WMV2 @tab MS WMV8
 | 
			
		||||
@item WMV3 @tab MS WMV9
 | 
			
		||||
@item WV1F @tab non-compliant MPEG-4 generated by ?
 | 
			
		||||
@item WVC1 @tab VC-1
 | 
			
		||||
@item XVID @tab non-compliant MPEG-4 generated by old Xvid
 | 
			
		||||
@item XVIX @tab non-compliant MPEG-4 generated by old Xvid with interlacing bug
 | 
			
		||||
@end multitable
 | 
			
		||||
 | 
			
		||||
@@ -148,7 +148,7 @@ Alignment:
 | 
			
		||||
Some instructions on some architectures have strict alignment restrictions,
 | 
			
		||||
for example most SSE/SSE2 instructions on x86.
 | 
			
		||||
The minimum guaranteed alignment is written in the .h files, for example:
 | 
			
		||||
    void (*put_pixels_clamped)(const int16_t *block/*align 16*/, UINT8 *pixels/*align 8*/, int line_size);
 | 
			
		||||
    void (*put_pixels_clamped)(const DCTELEM *block/*align 16*/, UINT8 *pixels/*align 8*/, int line_size);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
General Tips:
 | 
			
		||||
@@ -253,7 +253,7 @@ Optimization guide for ARM11 (used in Nokia N800 Internet Tablet):
 | 
			
		||||
http://infocenter.arm.com/help/topic/com.arm.doc.ddi0211j/DDI0211J_arm1136_r1p5_trm.pdf
 | 
			
		||||
Optimization guide for Intel XScale (used in Sharp Zaurus PDA):
 | 
			
		||||
http://download.intel.com/design/intelxscale/27347302.pdf
 | 
			
		||||
Intel Wireless MMX 2 Coprocessor: Programmers Reference Manual
 | 
			
		||||
Intel Wireless MMX2 Coprocessor: Programmers Reference Manual
 | 
			
		||||
http://download.intel.com/design/intelxscale/31451001.pdf
 | 
			
		||||
 | 
			
		||||
PowerPC-specific:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										222
									
								
								doc/outdevs.texi
									
									
									
									
									
								
							
							
						
						
									
										222
									
								
								doc/outdevs.texi
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
			
		||||
@chapter Output Devices
 | 
			
		||||
@c man begin OUTPUT DEVICES
 | 
			
		||||
 | 
			
		||||
Output devices are configured elements in FFmpeg that can write
 | 
			
		||||
Output devices are configured elements in FFmpeg which allow to write
 | 
			
		||||
multimedia data to an output device attached to your system.
 | 
			
		||||
 | 
			
		||||
When you configure your FFmpeg build, all the supported output devices
 | 
			
		||||
@@ -22,161 +22,15 @@ A description of the currently available output devices follows.
 | 
			
		||||
 | 
			
		||||
ALSA (Advanced Linux Sound Architecture) output device.
 | 
			
		||||
 | 
			
		||||
@section caca
 | 
			
		||||
 | 
			
		||||
CACA output device.
 | 
			
		||||
 | 
			
		||||
This output device allows to show a video stream in CACA window.
 | 
			
		||||
Only one CACA window is allowed per application, so you can
 | 
			
		||||
have only one instance of this output device in an application.
 | 
			
		||||
 | 
			
		||||
To enable this output device you need to configure FFmpeg with
 | 
			
		||||
@code{--enable-libcaca}.
 | 
			
		||||
libcaca is a graphics library that outputs text instead of pixels.
 | 
			
		||||
 | 
			
		||||
For more information about libcaca, check:
 | 
			
		||||
@url{http://caca.zoy.org/wiki/libcaca}
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item window_title
 | 
			
		||||
Set the CACA window title, if not specified default to the filename
 | 
			
		||||
specified for the output device.
 | 
			
		||||
 | 
			
		||||
@item window_size
 | 
			
		||||
Set the CACA window size, can be a string of the form
 | 
			
		||||
@var{width}x@var{height} or a video size abbreviation.
 | 
			
		||||
If not specified it defaults to the size of the input video.
 | 
			
		||||
 | 
			
		||||
@item driver
 | 
			
		||||
Set display driver.
 | 
			
		||||
 | 
			
		||||
@item algorithm
 | 
			
		||||
Set dithering algorithm. Dithering is necessary
 | 
			
		||||
because the picture being rendered has usually far more colours than
 | 
			
		||||
the available palette.
 | 
			
		||||
The accepted values are listed with @code{-list_dither algorithms}.
 | 
			
		||||
 | 
			
		||||
@item antialias
 | 
			
		||||
Set antialias method. Antialiasing smoothens the rendered
 | 
			
		||||
image and avoids the commonly seen staircase effect.
 | 
			
		||||
The accepted values are listed with @code{-list_dither antialiases}.
 | 
			
		||||
 | 
			
		||||
@item charset
 | 
			
		||||
Set which characters are going to be used when rendering text.
 | 
			
		||||
The accepted values are listed with @code{-list_dither charsets}.
 | 
			
		||||
 | 
			
		||||
@item color
 | 
			
		||||
Set color to be used when rendering text.
 | 
			
		||||
The accepted values are listed with @code{-list_dither colors}.
 | 
			
		||||
 | 
			
		||||
@item list_drivers
 | 
			
		||||
If set to @option{true}, print a list of available drivers and exit.
 | 
			
		||||
 | 
			
		||||
@item list_dither
 | 
			
		||||
List available dither options related to the argument.
 | 
			
		||||
The argument must be one of @code{algorithms}, @code{antialiases},
 | 
			
		||||
@code{charsets}, @code{colors}.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Examples
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
@item
 | 
			
		||||
The following command shows the @command{ffmpeg} output is an
 | 
			
		||||
CACA window, forcing its size to 80x25:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -vcodec rawvideo -pix_fmt rgb24 -window_size 80x25 -f caca -
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Show the list of available drivers and exit:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -pix_fmt rgb24 -f caca -list_drivers true -
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Show the list of available dither colors and exit:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -pix_fmt rgb24 -f caca -list_dither colors -
 | 
			
		||||
@end example
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
@section fbdev
 | 
			
		||||
 | 
			
		||||
Linux framebuffer output device.
 | 
			
		||||
 | 
			
		||||
The Linux framebuffer is a graphic hardware-independent abstraction
 | 
			
		||||
layer to show graphics on a computer monitor, typically on the
 | 
			
		||||
console. It is accessed through a file device node, usually
 | 
			
		||||
@file{/dev/fb0}.
 | 
			
		||||
 | 
			
		||||
For more detailed information read the file
 | 
			
		||||
@file{Documentation/fb/framebuffer.txt} included in the Linux source tree.
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item xoffset
 | 
			
		||||
@item yoffset
 | 
			
		||||
Set x/y coordinate of top left corner. Default is 0.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Examples
 | 
			
		||||
Play a file on framebuffer device @file{/dev/fb0}.
 | 
			
		||||
Required pixel format depends on current framebuffer settings.
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -re -i INPUT -vcodec rawvideo -pix_fmt bgra -f fbdev /dev/fb0
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
See also @url{http://linux-fbdev.sourceforge.net/}, and fbset(1).
 | 
			
		||||
 | 
			
		||||
@section oss
 | 
			
		||||
 | 
			
		||||
OSS (Open Sound System) output device.
 | 
			
		||||
 | 
			
		||||
@section pulse
 | 
			
		||||
 | 
			
		||||
PulseAudio output device.
 | 
			
		||||
 | 
			
		||||
To enable this output device you need to configure FFmpeg with @code{--enable-libpulse}.
 | 
			
		||||
 | 
			
		||||
More information about PulseAudio can be found on @url{http://www.pulseaudio.org}
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item server
 | 
			
		||||
Connect to a specific PulseAudio server, specified by an IP address.
 | 
			
		||||
Default server is used when not provided.
 | 
			
		||||
 | 
			
		||||
@item name
 | 
			
		||||
Specify the application name PulseAudio will use when showing active clients,
 | 
			
		||||
by default it is the @code{LIBAVFORMAT_IDENT} string.
 | 
			
		||||
 | 
			
		||||
@item stream_name
 | 
			
		||||
Specify the stream name PulseAudio will use when showing active streams,
 | 
			
		||||
by default it is set to the specified output name.
 | 
			
		||||
 | 
			
		||||
@item device
 | 
			
		||||
Specify the device to use. Default device is used when not provided.
 | 
			
		||||
List of output devices can be obtained with command @command{pactl list sinks}.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Examples
 | 
			
		||||
Play a file on default device on default server:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg  -i INPUT -f pulse "stream name"
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section sdl
 | 
			
		||||
 | 
			
		||||
SDL (Simple DirectMedia Layer) output device.
 | 
			
		||||
 | 
			
		||||
This output device allows to show a video stream in an SDL
 | 
			
		||||
This output devices allows to show a video stream in an SDL
 | 
			
		||||
window. Only one SDL window is allowed per application, so you can
 | 
			
		||||
have only one instance of this output device in an application.
 | 
			
		||||
 | 
			
		||||
@@ -201,12 +55,7 @@ to the same value of @var{window_title}.
 | 
			
		||||
@item window_size
 | 
			
		||||
Set the SDL window size, can be a string of the form
 | 
			
		||||
@var{width}x@var{height} or a video size abbreviation.
 | 
			
		||||
If not specified it defaults to the size of the input video,
 | 
			
		||||
downscaled according to the aspect ratio.
 | 
			
		||||
 | 
			
		||||
@item window_fullscreen
 | 
			
		||||
Set fullscreen mode when non-zero value is provided.
 | 
			
		||||
Zero is a default.
 | 
			
		||||
If not specified it defaults to the size of the input video.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Examples
 | 
			
		||||
@@ -221,69 +70,4 @@ ffmpeg -i INPUT -vcodec rawvideo -pix_fmt yuv420p -window_size qcif -f sdl "SDL
 | 
			
		||||
 | 
			
		||||
sndio audio output device.
 | 
			
		||||
 | 
			
		||||
@section xv
 | 
			
		||||
 | 
			
		||||
XV (XVideo) output device.
 | 
			
		||||
 | 
			
		||||
This output device allows to show a video stream in a X Window System
 | 
			
		||||
window.
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item display_name
 | 
			
		||||
Specify the hardware display name, which determines the display and
 | 
			
		||||
communications domain to be used.
 | 
			
		||||
 | 
			
		||||
The display name or DISPLAY environment variable can be a string in
 | 
			
		||||
the format @var{hostname}[:@var{number}[.@var{screen_number}]].
 | 
			
		||||
 | 
			
		||||
@var{hostname} specifies the name of the host machine on which the
 | 
			
		||||
display is physically attached. @var{number} specifies the number of
 | 
			
		||||
the display server on that host machine. @var{screen_number} specifies
 | 
			
		||||
the screen to be used on that server.
 | 
			
		||||
 | 
			
		||||
If unspecified, it defaults to the value of the DISPLAY environment
 | 
			
		||||
variable.
 | 
			
		||||
 | 
			
		||||
For example, @code{dual-headed:0.1} would specify screen 1 of display
 | 
			
		||||
0 on the machine named ``dual-headed''.
 | 
			
		||||
 | 
			
		||||
Check the X11 specification for more detailed information about the
 | 
			
		||||
display name format.
 | 
			
		||||
 | 
			
		||||
@item window_size
 | 
			
		||||
Set the created window size, can be a string of the form
 | 
			
		||||
@var{width}x@var{height} or a video size abbreviation. If not
 | 
			
		||||
specified it defaults to the size of the input video.
 | 
			
		||||
 | 
			
		||||
@item window_x
 | 
			
		||||
@item window_y
 | 
			
		||||
Set the X and Y window offsets for the created window. They are both
 | 
			
		||||
set to 0 by default. The values may be ignored by the window manager.
 | 
			
		||||
 | 
			
		||||
@item window_title
 | 
			
		||||
Set the window title, if not specified default to the filename
 | 
			
		||||
specified for the output device.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
For more information about XVideo see @url{http://www.x.org/}.
 | 
			
		||||
 | 
			
		||||
@subsection Examples
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
@item
 | 
			
		||||
Decode, display and encode video input with @command{ffmpeg} at the
 | 
			
		||||
same time:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT OUTPUT -f xv display
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Decode and display the input video to multiple X11 windows:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -f xv normal -vf negate -f xv negated
 | 
			
		||||
@end example
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
@c man end OUTPUT DEVICES
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
\input texinfo @c -*- texinfo -*-
 | 
			
		||||
 | 
			
		||||
@settitle Platform Specific Information
 | 
			
		||||
@settitle Platform Specific information
 | 
			
		||||
@titlepage
 | 
			
		||||
@center @titlefont{Platform Specific Information}
 | 
			
		||||
@center @titlefont{Platform Specific information}
 | 
			
		||||
@end titlepage
 | 
			
		||||
 | 
			
		||||
@top
 | 
			
		||||
@@ -77,15 +77,30 @@ For information about compiling FFmpeg on OS/2 see
 | 
			
		||||
@chapter Windows
 | 
			
		||||
 | 
			
		||||
To get help and instructions for building FFmpeg under Windows, check out
 | 
			
		||||
the FFmpeg Windows Help Forum at @url{http://ffmpeg.zeranoe.com/forum/}.
 | 
			
		||||
the FFmpeg Windows Help Forum at
 | 
			
		||||
@url{http://ffmpeg.arrozcru.org/}.
 | 
			
		||||
 | 
			
		||||
@section Native Windows compilation using MinGW or MinGW-w64
 | 
			
		||||
@section Native Windows compilation
 | 
			
		||||
 | 
			
		||||
FFmpeg can be built to run natively on Windows using the MinGW or MinGW-w64
 | 
			
		||||
toolchains. Install the latest versions of MSYS and MinGW or MinGW-w64 from
 | 
			
		||||
@url{http://www.mingw.org/} or @url{http://mingw-w64.sourceforge.net/}.
 | 
			
		||||
You can find detailed installation instructions in the download section and
 | 
			
		||||
the FAQ.
 | 
			
		||||
FFmpeg can be built to run natively on Windows using the MinGW tools. Install
 | 
			
		||||
the latest versions of MSYS and MinGW from @url{http://www.mingw.org/}.
 | 
			
		||||
You can find detailed installation instructions in the download
 | 
			
		||||
section and the FAQ.
 | 
			
		||||
 | 
			
		||||
FFmpeg does not build out-of-the-box with the packages the automated MinGW
 | 
			
		||||
installer provides. It also requires coreutils to be installed and many other
 | 
			
		||||
packages updated to the latest version. The minimum versions for some packages
 | 
			
		||||
are listed below:
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
@item bash 3.1
 | 
			
		||||
@item msys-make 3.81-2 (note: not mingw32-make)
 | 
			
		||||
@item w32api 3.13
 | 
			
		||||
@item mingw-runtime 3.15
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
FFmpeg automatically passes @code{-fno-common} to the compiler to work around
 | 
			
		||||
a GCC bug (see @url{http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37216}).
 | 
			
		||||
 | 
			
		||||
Notes:
 | 
			
		||||
 | 
			
		||||
@@ -106,106 +121,149 @@ libavformat) as DLLs.
 | 
			
		||||
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
@section Microsoft Visual C++ or Intel C++ Compiler for Windows
 | 
			
		||||
@section Microsoft Visual C++ compatibility
 | 
			
		||||
 | 
			
		||||
FFmpeg can be built with MSVC or ICL using a C99-to-C89 conversion utility and
 | 
			
		||||
wrapper. For ICL, only the wrapper is used, since ICL supports C99.
 | 
			
		||||
As stated in the FAQ, FFmpeg will not compile under MSVC++. However, if you
 | 
			
		||||
want to use the libav* libraries in your own applications, you can still
 | 
			
		||||
compile those applications using MSVC++. But the libav* libraries you link
 | 
			
		||||
to @emph{must} be built with MinGW. However, you will not be able to debug
 | 
			
		||||
inside the libav* libraries, since MSVC++ does not recognize the debug
 | 
			
		||||
symbols generated by GCC.
 | 
			
		||||
We strongly recommend you to move over from MSVC++ to MinGW tools.
 | 
			
		||||
 | 
			
		||||
You will need the following prerequisites:
 | 
			
		||||
This description of how to use the FFmpeg libraries with MSVC++ is based on
 | 
			
		||||
Microsoft Visual C++ 2005 Express Edition. If you have a different version,
 | 
			
		||||
you might have to modify the procedures slightly.
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
@item @uref{http://download.videolan.org/pub/contrib/c99-to-c89/, C99-to-C89 Converter & Wrapper}
 | 
			
		||||
@item @uref{http://code.google.com/p/msinttypes/, msinttypes}
 | 
			
		||||
@item @uref{http://www.mingw.org/, MSYS}
 | 
			
		||||
@item @uref{http://yasm.tortall.net/, YASM}
 | 
			
		||||
@item @uref{http://gnuwin32.sourceforge.net/packages/bc.htm, bc for Windows} if
 | 
			
		||||
you want to run @uref{fate.html, FATE}.
 | 
			
		||||
@end itemize
 | 
			
		||||
@subsection Using static libraries
 | 
			
		||||
 | 
			
		||||
To set up a proper environment in MSYS, you need to run @code{msys.bat} from
 | 
			
		||||
the Visual Studio or Intel Compiler command prompt.
 | 
			
		||||
Assuming you have just built and installed FFmpeg in @file{/usr/local}:
 | 
			
		||||
 | 
			
		||||
Place @code{makedef}, @code{c99wrap.exe}, @code{c99conv.exe}, and @code{yasm.exe}
 | 
			
		||||
somewhere in your @code{PATH}.
 | 
			
		||||
@enumerate
 | 
			
		||||
 | 
			
		||||
Next, make sure @code{inttypes.h} and any other headers and libs you want to use
 | 
			
		||||
are located in a spot that the compiler can see. Do so by modifying the @code{LIB}
 | 
			
		||||
and @code{INCLUDE} environment variables to include the @strong{Windows} paths to
 | 
			
		||||
these directories. Alternatively, you can try and use the
 | 
			
		||||
@code{--extra-cflags}/@code{--extra-ldflags} configure options.
 | 
			
		||||
@item Create a new console application ("File / New / Project") and then
 | 
			
		||||
select "Win32 Console Application". On the appropriate page of the
 | 
			
		||||
Application Wizard, uncheck the "Precompiled headers" option.
 | 
			
		||||
 | 
			
		||||
Finally, run:
 | 
			
		||||
@item Write the source code for your application, or, for testing, just
 | 
			
		||||
copy the code from an existing sample application into the source file
 | 
			
		||||
that MSVC++ has already created for you. For example, you can copy
 | 
			
		||||
@file{libavformat/output-example.c} from the FFmpeg distribution.
 | 
			
		||||
 | 
			
		||||
@item Open the "Project / Properties" dialog box. In the "Configuration"
 | 
			
		||||
combo box, select "All Configurations" so that the changes you make will
 | 
			
		||||
affect both debug and release builds. In the tree view on the left hand
 | 
			
		||||
side, select "C/C++ / General", then edit the "Additional Include
 | 
			
		||||
Directories" setting to contain the path where the FFmpeg includes were
 | 
			
		||||
installed (i.e. @file{c:\msys\1.0\local\include}).
 | 
			
		||||
Do not add MinGW's include directory here, or the include files will
 | 
			
		||||
conflict with MSVC's.
 | 
			
		||||
 | 
			
		||||
@item Still in the "Project / Properties" dialog box, select
 | 
			
		||||
"Linker / General" from the tree view and edit the
 | 
			
		||||
"Additional Library Directories" setting to contain the @file{lib}
 | 
			
		||||
directory where FFmpeg was installed (i.e. @file{c:\msys\1.0\local\lib}),
 | 
			
		||||
the directory where MinGW libs are installed (i.e. @file{c:\mingw\lib}),
 | 
			
		||||
and the directory where MinGW's GCC libs are installed
 | 
			
		||||
(i.e. @file{C:\mingw\lib\gcc\mingw32\4.2.1-sjlj}). Then select
 | 
			
		||||
"Linker / Input" from the tree view, and add the files @file{libavformat.a},
 | 
			
		||||
@file{libavcodec.a}, @file{libavutil.a}, @file{libmingwex.a},
 | 
			
		||||
@file{libgcc.a}, and any other libraries you used (i.e. @file{libz.a})
 | 
			
		||||
to the end of "Additional Dependencies".
 | 
			
		||||
 | 
			
		||||
@item Now, select "C/C++ / Code Generation" from the tree view. Select
 | 
			
		||||
"Debug" in the "Configuration" combo box. Make sure that "Runtime
 | 
			
		||||
Library" is set to "Multi-threaded Debug DLL". Then, select "Release" in
 | 
			
		||||
the "Configuration" combo box and make sure that "Runtime Library" is
 | 
			
		||||
set to "Multi-threaded DLL".
 | 
			
		||||
 | 
			
		||||
@item Click "OK" to close the "Project / Properties" dialog box.
 | 
			
		||||
 | 
			
		||||
@item MSVC++ lacks some C99 header files that are fundamental for FFmpeg.
 | 
			
		||||
Get msinttypes from @url{http://code.google.com/p/msinttypes/downloads/list}
 | 
			
		||||
and install it in MSVC++'s include directory
 | 
			
		||||
(i.e. @file{C:\Program Files\Microsoft Visual Studio 8\VC\include}).
 | 
			
		||||
 | 
			
		||||
@item MSVC++ also does not understand the @code{inline} keyword used by
 | 
			
		||||
FFmpeg, so you must add this line before @code{#include}ing libav*:
 | 
			
		||||
@example
 | 
			
		||||
#define inline _inline
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item Build your application, everything should work.
 | 
			
		||||
 | 
			
		||||
@end enumerate
 | 
			
		||||
 | 
			
		||||
@subsection Using shared libraries
 | 
			
		||||
 | 
			
		||||
This is how to create DLL and LIB files that are compatible with MSVC++:
 | 
			
		||||
 | 
			
		||||
@enumerate
 | 
			
		||||
 | 
			
		||||
@item Add a call to @file{vcvars32.bat} (which sets up the environment
 | 
			
		||||
variables for the Visual C++ tools) as the first line of @file{msys.bat}.
 | 
			
		||||
The standard location for @file{vcvars32.bat} is
 | 
			
		||||
@file{C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat},
 | 
			
		||||
and the standard location for @file{msys.bat} is @file{C:\msys\1.0\msys.bat}.
 | 
			
		||||
If this corresponds to your setup, add the following line as the first line
 | 
			
		||||
of @file{msys.bat}:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
For MSVC:
 | 
			
		||||
./configure --toolchain=msvc
 | 
			
		||||
call "C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat"
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
For ICL:
 | 
			
		||||
./configure --toolchain=icl
 | 
			
		||||
Alternatively, you may start the @file{Visual Studio 2005 Command Prompt},
 | 
			
		||||
and run @file{c:\msys\1.0\msys.bat} from there.
 | 
			
		||||
 | 
			
		||||
@item Within the MSYS shell, run @code{lib.exe}. If you get a help message
 | 
			
		||||
from @file{Microsoft (R) Library Manager}, this means your environment
 | 
			
		||||
variables are set up correctly, the @file{Microsoft (R) Library Manager}
 | 
			
		||||
is on the path and will be used by FFmpeg to create
 | 
			
		||||
MSVC++-compatible import libraries.
 | 
			
		||||
 | 
			
		||||
@item Build FFmpeg with
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
./configure --enable-shared
 | 
			
		||||
make
 | 
			
		||||
make install
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
If you wish to compile shared libraries, add @code{--enable-shared} to your
 | 
			
		||||
configure options. Note that due to the way MSVC and ICL handle DLL imports and
 | 
			
		||||
exports, you cannot compile static and shared libraries at the same time, and
 | 
			
		||||
enabling shared libraries will automatically disable the static ones.
 | 
			
		||||
Your install path (@file{/usr/local/} by default) should now have the
 | 
			
		||||
necessary DLL and LIB files under the @file{bin} directory.
 | 
			
		||||
 | 
			
		||||
Notes:
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
 | 
			
		||||
@item It is possible that coreutils' @code{link.exe} conflicts with MSVC's linker.
 | 
			
		||||
You can find out by running @code{which link} to see which @code{link.exe} you
 | 
			
		||||
are using. If it is located at @code{/bin/link.exe}, then you have the wrong one
 | 
			
		||||
in your @code{PATH}. Either move or remove that copy, or make sure MSVC's
 | 
			
		||||
@code{link.exe} takes precedence in your @code{PATH} over coreutils'.
 | 
			
		||||
 | 
			
		||||
@item If you wish to build with zlib support, you will have to grab a compatible
 | 
			
		||||
zlib binary from somewhere, with an MSVC import lib, or if you wish to link
 | 
			
		||||
statically, you can follow the instructions below to build a compatible
 | 
			
		||||
@code{zlib.lib} with MSVC. Regardless of which method you use, you must still
 | 
			
		||||
follow step 3, or compilation will fail.
 | 
			
		||||
@enumerate
 | 
			
		||||
@item Grab the @uref{http://zlib.net/, zlib sources}.
 | 
			
		||||
@item Edit @code{win32/Makefile.msc} so that it uses -MT instead of -MD, since
 | 
			
		||||
this is how FFmpeg is built as well.
 | 
			
		||||
@item Edit @code{zconf.h} and remove its inclusion of @code{unistd.h}. This gets
 | 
			
		||||
erroneously included when building FFmpeg.
 | 
			
		||||
@item Run @code{nmake -f win32/Makefile.msc}.
 | 
			
		||||
@item Move @code{zlib.lib}, @code{zconf.h}, and @code{zlib.h} to somewhere MSVC
 | 
			
		||||
can see.
 | 
			
		||||
@end enumerate
 | 
			
		||||
 | 
			
		||||
@item FFmpeg has been tested with the following on i686 and x86_64:
 | 
			
		||||
@itemize
 | 
			
		||||
@item Visual Studio 2010 Pro and Express
 | 
			
		||||
@item Visual Studio 2012 Pro and Express
 | 
			
		||||
@item Intel Composer XE 2013
 | 
			
		||||
@end itemize
 | 
			
		||||
Anything else is not officially supported.
 | 
			
		||||
Alternatively, build the libraries with a cross compiler, according to
 | 
			
		||||
the instructions below in @ref{Cross compilation for Windows with Linux}.
 | 
			
		||||
 | 
			
		||||
@end itemize
 | 
			
		||||
To use those files with MSVC++, do the same as you would do with
 | 
			
		||||
the static libraries, as described above. But in Step 4,
 | 
			
		||||
you should only need to add the directory where the LIB files are installed
 | 
			
		||||
(i.e. @file{c:\msys\usr\local\bin}). This is not a typo, the LIB files are
 | 
			
		||||
installed in the @file{bin} directory. And instead of adding the static
 | 
			
		||||
libraries (@file{libxxx.a} files) you should add the MSVC import libraries
 | 
			
		||||
(@file{avcodec.lib}, @file{avformat.lib}, and
 | 
			
		||||
@file{avutil.lib}). Note that you should not use the GCC import
 | 
			
		||||
libraries (@file{libxxx.dll.a} files), as these will give you undefined
 | 
			
		||||
reference errors. There should be no need for @file{libmingwex.a},
 | 
			
		||||
@file{libgcc.a}, and @file{wsock32.lib}, nor any other external library
 | 
			
		||||
statically linked into the DLLs.
 | 
			
		||||
 | 
			
		||||
@subsection Linking to FFmpeg with Microsoft Visual C++
 | 
			
		||||
 | 
			
		||||
If you plan to link with MSVC-built static libraries, you will need
 | 
			
		||||
to make sure you have @code{Runtime Library} set to
 | 
			
		||||
@code{Multi-threaded (/MT)} in your project's settings.
 | 
			
		||||
 | 
			
		||||
You will need to define @code{inline} to something MSVC understands:
 | 
			
		||||
FFmpeg headers do not declare global data for Windows DLLs through the usual
 | 
			
		||||
dllexport/dllimport interface. Such data will be exported properly while
 | 
			
		||||
building, but to use them in your MSVC++ code you will have to edit the
 | 
			
		||||
appropriate headers and mark the data as dllimport. For example, in
 | 
			
		||||
libavutil/pixdesc.h you should have:
 | 
			
		||||
@example
 | 
			
		||||
#define inline __inline
 | 
			
		||||
extern __declspec(dllimport) const AVPixFmtDescriptor av_pix_fmt_descriptors[];
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Also note, that as stated in @strong{Microsoft Visual C++}, you will need
 | 
			
		||||
an MSVC-compatible @uref{http://code.google.com/p/msinttypes/, inttypes.h}.
 | 
			
		||||
 | 
			
		||||
If you plan on using import libraries created by dlltool, you must
 | 
			
		||||
set @code{References} to @code{No (/OPT:NOREF)} under the linker optimization
 | 
			
		||||
settings, otherwise the resulting binaries will fail during runtime.
 | 
			
		||||
This is not required when using import libraries generated by @code{lib.exe}.
 | 
			
		||||
Note that using import libraries created by dlltool requires
 | 
			
		||||
the linker optimization option to be set to
 | 
			
		||||
"References: Keep Unreferenced Data (@code{/OPT:NOREF})", otherwise
 | 
			
		||||
the resulting binaries will fail during runtime. This isn't
 | 
			
		||||
required when using import libraries generated by lib.exe.
 | 
			
		||||
This issue is reported upstream at
 | 
			
		||||
@url{http://sourceware.org/bugzilla/show_bug.cgi?id=12633}.
 | 
			
		||||
 | 
			
		||||
@@ -214,12 +272,12 @@ To create import libraries that work with the @code{/OPT:REF} option
 | 
			
		||||
 | 
			
		||||
@enumerate
 | 
			
		||||
 | 
			
		||||
@item Open the @emph{Visual Studio Command Prompt}.
 | 
			
		||||
@item Open @emph{Visual Studio 2005 Command Prompt}.
 | 
			
		||||
 | 
			
		||||
Alternatively, in a normal command line prompt, call @file{vcvars32.bat}
 | 
			
		||||
which sets up the environment variables for the Visual C++ tools
 | 
			
		||||
(the standard location for this file is something like
 | 
			
		||||
@file{C:\Program Files (x86_\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat}).
 | 
			
		||||
(the standard location for this file is
 | 
			
		||||
@file{C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat}).
 | 
			
		||||
 | 
			
		||||
@item Enter the @file{bin} directory where the created LIB and DLL files
 | 
			
		||||
are stored.
 | 
			
		||||
@@ -260,9 +318,24 @@ following "Devel" ones:
 | 
			
		||||
binutils, gcc4-core, make, git, mingw-runtime, texi2html
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
In order to run FATE you will also need the following "Utils" packages:
 | 
			
		||||
And the following "Utils" one:
 | 
			
		||||
@example
 | 
			
		||||
bc, diffutils
 | 
			
		||||
diffutils
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Then run
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
./configure
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
to make a static build.
 | 
			
		||||
 | 
			
		||||
To build shared libraries add a special compiler flag to work around current
 | 
			
		||||
@code{gcc4-core} package bugs in addition to the normal configure flags:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
./configure --enable-shared --disable-static --extra-cflags=-fno-reorder-functions
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
If you want to build FFmpeg with additional libraries, download Cygwin
 | 
			
		||||
@@ -304,67 +377,4 @@ and for a build with shared libraries
 | 
			
		||||
./configure --target-os=mingw32 --enable-shared --disable-static --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@chapter Plan 9
 | 
			
		||||
 | 
			
		||||
The native @uref{http://plan9.bell-labs.com/plan9/, Plan 9} compiler
 | 
			
		||||
does not implement all the C99 features needed by FFmpeg so the gcc
 | 
			
		||||
port must be used.  Furthermore, a few items missing from the C
 | 
			
		||||
library and shell environment need to be fixed.
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
 | 
			
		||||
@item GNU awk, grep, make, and sed
 | 
			
		||||
 | 
			
		||||
Working packages of these tools can be found at
 | 
			
		||||
@uref{http://code.google.com/p/ports2plan9/downloads/list, ports2plan9}.
 | 
			
		||||
They can be installed with @uref{http://9front.org/, 9front's} @code{pkg}
 | 
			
		||||
utility by setting @code{pkgpath} to
 | 
			
		||||
@code{http://ports2plan9.googlecode.com/files/}.
 | 
			
		||||
 | 
			
		||||
@item Missing/broken @code{head} and @code{printf} commands
 | 
			
		||||
 | 
			
		||||
Replacements adequate for building FFmpeg can be found in the
 | 
			
		||||
@code{compat/plan9} directory.  Place these somewhere they will be
 | 
			
		||||
found by the shell.  These are not full implementations of the
 | 
			
		||||
commands and are @emph{not} suitable for general use.
 | 
			
		||||
 | 
			
		||||
@item Missing C99 @code{stdint.h} and @code{inttypes.h}
 | 
			
		||||
 | 
			
		||||
Replacement headers are available from
 | 
			
		||||
@url{http://code.google.com/p/plan9front/issues/detail?id=152}.
 | 
			
		||||
 | 
			
		||||
@item Missing or non-standard library functions
 | 
			
		||||
 | 
			
		||||
Some functions in the C library are missing or incomplete.  The
 | 
			
		||||
@code{@uref{http://ports2plan9.googlecode.com/files/gcc-apelibs-1207.tbz,
 | 
			
		||||
gcc-apelibs-1207}} package from
 | 
			
		||||
@uref{http://code.google.com/p/ports2plan9/downloads/list, ports2plan9}
 | 
			
		||||
includes an updated C library, but installing the full package gives
 | 
			
		||||
unusable executables.  Instead, keep the files from @code{gccbin.tgz}
 | 
			
		||||
under @code{/386/lib/gnu}.  From the @code{libc.a} archive in the
 | 
			
		||||
@code{gcc-apelibs-1207} package, extract the following object files and
 | 
			
		||||
turn them into a library:
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
@item @code{strerror.o}
 | 
			
		||||
@item @code{strtoll.o}
 | 
			
		||||
@item @code{snprintf.o}
 | 
			
		||||
@item @code{vsnprintf.o}
 | 
			
		||||
@item @code{vfprintf.o}
 | 
			
		||||
@item @code{_IO_getc.o}
 | 
			
		||||
@item @code{_IO_putc.o}
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
Use the @code{--extra-libs} option of @code{configure} to inform the
 | 
			
		||||
build system of this library.
 | 
			
		||||
 | 
			
		||||
@item FPU exceptions enabled by default
 | 
			
		||||
 | 
			
		||||
Unlike most other systems, Plan 9 enables FPU exceptions by default.
 | 
			
		||||
These must be disabled before calling any FFmpeg functions.  While the
 | 
			
		||||
included tools will do this automatically, other users of the
 | 
			
		||||
libraries must do it themselves.
 | 
			
		||||
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
@bye
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,20 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2012 Anton Khirnov
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 * This file is part of Libav.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * Libav 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,
 | 
			
		||||
 * Libav 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
 | 
			
		||||
 * License along with Libav; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
@@ -27,9 +27,7 @@
 | 
			
		||||
#include <float.h>
 | 
			
		||||
 | 
			
		||||
#include "libavformat/avformat.h"
 | 
			
		||||
#include "libavformat/options_table.h"
 | 
			
		||||
#include "libavcodec/avcodec.h"
 | 
			
		||||
#include "libavcodec/options_table.h"
 | 
			
		||||
#include "libavutil/opt.h"
 | 
			
		||||
 | 
			
		||||
static void print_usage(void)
 | 
			
		||||
@@ -41,9 +39,6 @@ static void print_usage(void)
 | 
			
		||||
 | 
			
		||||
static void print_option(const AVOption *opts, const AVOption *o, int per_stream)
 | 
			
		||||
{
 | 
			
		||||
    if (!(o->flags & (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM)))
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    printf("@item -%s%s @var{", o->name, per_stream ? "[:stream_specifier]" : "");
 | 
			
		||||
    switch (o->type) {
 | 
			
		||||
    case AV_OPT_TYPE_BINARY:   printf("hexadecimal string"); break;
 | 
			
		||||
@@ -98,14 +93,18 @@ static void show_opts(const AVOption *opts, int per_stream)
 | 
			
		||||
 | 
			
		||||
static void show_format_opts(void)
 | 
			
		||||
{
 | 
			
		||||
#include "libavformat/options_table.h"
 | 
			
		||||
 | 
			
		||||
    printf("@section Format AVOptions\n");
 | 
			
		||||
    show_opts(avformat_options, 0);
 | 
			
		||||
    show_opts(options, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void show_codec_opts(void)
 | 
			
		||||
{
 | 
			
		||||
#include "libavcodec/options_table.h"
 | 
			
		||||
 | 
			
		||||
    printf("@section Codec AVOptions\n");
 | 
			
		||||
    show_opts(avcodec_options, 1);
 | 
			
		||||
    show_opts(options, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
@chapter Protocols
 | 
			
		||||
@c man begin PROTOCOLS
 | 
			
		||||
 | 
			
		||||
Protocols are configured elements in FFmpeg that enable access to
 | 
			
		||||
resources that require specific protocols.
 | 
			
		||||
Protocols are configured elements in FFmpeg which allow to access
 | 
			
		||||
resources which require the use of a particular protocol.
 | 
			
		||||
 | 
			
		||||
When you configure your FFmpeg build, all the supported protocols are
 | 
			
		||||
enabled by default. You can list all available ones using the
 | 
			
		||||
@@ -49,16 +49,6 @@ Read angle 2 of playlist 4 from BluRay mounted to /mnt/bluray, start from chapte
 | 
			
		||||
-playlist 4 -angle 2 -chapter 2 bluray:/mnt/bluray
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section cache
 | 
			
		||||
 | 
			
		||||
Caching wrapper for input stream.
 | 
			
		||||
 | 
			
		||||
Cache the input stream to temporary file. It brings seeking capability to live streams.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
cache:@var{URL}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section concat
 | 
			
		||||
 | 
			
		||||
Physical concatenation protocol.
 | 
			
		||||
@@ -85,34 +75,6 @@ ffplay concat:split1.mpeg\|split2.mpeg\|split3.mpeg
 | 
			
		||||
Note that you may need to escape the character "|" which is special for
 | 
			
		||||
many shells.
 | 
			
		||||
 | 
			
		||||
@section crypto
 | 
			
		||||
 | 
			
		||||
AES-encrypted stream reading protocol.
 | 
			
		||||
 | 
			
		||||
The accepted options are:
 | 
			
		||||
@table @option
 | 
			
		||||
@item key
 | 
			
		||||
Set the AES decryption key binary block from given hexadecimal representation.
 | 
			
		||||
 | 
			
		||||
@item iv
 | 
			
		||||
Set the AES decryption initialization vector binary block from given hexadecimal representation.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Accepted URL formats:
 | 
			
		||||
@example
 | 
			
		||||
crypto:@var{URL}
 | 
			
		||||
crypto+@var{URL}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section data
 | 
			
		||||
 | 
			
		||||
Data in-line in the URI. See @url{http://en.wikipedia.org/wiki/Data_URI_scheme}.
 | 
			
		||||
 | 
			
		||||
For example, to convert a GIF file given inline with @command{ffmpeg}:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i "data:image/gif;base64,R0lGODdhCAAIAMIEAAAAAAAA//8AAP//AP///////////////ywAAAAACAAIAAADF0gEDLojDgdGiJdJqUX02iB4E8Q9jUMkADs=" smiley.png
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section file
 | 
			
		||||
 | 
			
		||||
File access protocol.
 | 
			
		||||
@@ -129,54 +91,6 @@ The ff* tools default to the file protocol, that is a resource
 | 
			
		||||
specified with the name "FILE.mpeg" is interpreted as the URL
 | 
			
		||||
"file:FILE.mpeg".
 | 
			
		||||
 | 
			
		||||
This protocol accepts the following options:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item truncate
 | 
			
		||||
Truncate existing files on write, if set to 1. A value of 0 prevents
 | 
			
		||||
truncating. Default value is 1.
 | 
			
		||||
 | 
			
		||||
@item blocksize
 | 
			
		||||
Set I/O operation maximum block size, in bytes. Default value is
 | 
			
		||||
@code{INT_MAX}, which results in not limiting the requested block size.
 | 
			
		||||
Setting this value reasonably low improves user termination request reaction
 | 
			
		||||
time, which is valuable for files on slow medium.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section ftp
 | 
			
		||||
 | 
			
		||||
FTP (File Transfer Protocol).
 | 
			
		||||
 | 
			
		||||
Allow to read from or write to remote resources using FTP protocol.
 | 
			
		||||
 | 
			
		||||
Following syntax is required.
 | 
			
		||||
@example
 | 
			
		||||
ftp://[user[:password]@@]server[:port]/path/to/remote/resource.mpeg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
This protocol accepts the following options.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item timeout
 | 
			
		||||
Set timeout of socket I/O operations used by the underlying low level
 | 
			
		||||
operation. By default it is set to -1, which means that the timeout is
 | 
			
		||||
not specified.
 | 
			
		||||
 | 
			
		||||
@item ftp-anonymous-password
 | 
			
		||||
Password used when login as anonymous user. Typically an e-mail address
 | 
			
		||||
should be used.
 | 
			
		||||
 | 
			
		||||
@item ftp-write-seekable
 | 
			
		||||
Control seekability of connection during encoding. If set to 1 the
 | 
			
		||||
resource is supposed to be seekable, if set to 0 it is assumed not
 | 
			
		||||
to be seekable. Default value is 0.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
NOTE: Protocol can be used as output, but it is recommended to not do
 | 
			
		||||
it, unless special care is taken (tests, customized server configuration
 | 
			
		||||
etc.). Different FTP servers behave in different way during seek
 | 
			
		||||
operation. ff* tools may produce incomplete content due to server limitations.
 | 
			
		||||
 | 
			
		||||
@section gopher
 | 
			
		||||
 | 
			
		||||
Gopher protocol.
 | 
			
		||||
@@ -205,77 +119,6 @@ m3u8 files.
 | 
			
		||||
 | 
			
		||||
HTTP (Hyper Text Transfer Protocol).
 | 
			
		||||
 | 
			
		||||
This protocol accepts the following options.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item seekable
 | 
			
		||||
Control seekability of connection. If set to 1 the resource is
 | 
			
		||||
supposed to be seekable, if set to 0 it is assumed not to be seekable,
 | 
			
		||||
if set to -1 it will try to autodetect if it is seekable. Default
 | 
			
		||||
value is -1.
 | 
			
		||||
 | 
			
		||||
@item chunked_post
 | 
			
		||||
If set to 1 use chunked transfer-encoding for posts, default is 1.
 | 
			
		||||
 | 
			
		||||
@item headers
 | 
			
		||||
Set custom HTTP headers, can override built in default headers. The
 | 
			
		||||
value must be a string encoding the headers.
 | 
			
		||||
 | 
			
		||||
@item content_type
 | 
			
		||||
Force a content type.
 | 
			
		||||
 | 
			
		||||
@item user-agent
 | 
			
		||||
Override User-Agent header. If not specified the protocol will use a
 | 
			
		||||
string describing the libavformat build.
 | 
			
		||||
 | 
			
		||||
@item multiple_requests
 | 
			
		||||
Use persistent connections if set to 1. By default it is 0.
 | 
			
		||||
 | 
			
		||||
@item post_data
 | 
			
		||||
Set custom HTTP post data.
 | 
			
		||||
 | 
			
		||||
@item timeout
 | 
			
		||||
Set timeout of socket I/O operations used by the underlying low level
 | 
			
		||||
operation. By default it is set to -1, which means that the timeout is
 | 
			
		||||
not specified.
 | 
			
		||||
 | 
			
		||||
@item mime_type
 | 
			
		||||
Set MIME type.
 | 
			
		||||
 | 
			
		||||
@item icy
 | 
			
		||||
If set to 1 request ICY (SHOUTcast) metadata from the server. If the server
 | 
			
		||||
supports this, the metadata has to be retrieved by the application by reading
 | 
			
		||||
the @option{icy_metadata_headers} and @option{icy_metadata_packet} options.
 | 
			
		||||
The default is 0.
 | 
			
		||||
 | 
			
		||||
@item icy_metadata_headers
 | 
			
		||||
If the server supports ICY metadata, this contains the ICY specific HTTP reply
 | 
			
		||||
headers, separated with newline characters.
 | 
			
		||||
 | 
			
		||||
@item icy_metadata_packet
 | 
			
		||||
If the server supports ICY metadata, and @option{icy} was set to 1, this
 | 
			
		||||
contains the last non-empty metadata packet sent by the server.
 | 
			
		||||
 | 
			
		||||
@item cookies
 | 
			
		||||
Set the cookies to be sent in future requests. The format of each cookie is the
 | 
			
		||||
same as the value of a Set-Cookie HTTP response field. Multiple cookies can be
 | 
			
		||||
delimited by a newline character.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection HTTP Cookies
 | 
			
		||||
 | 
			
		||||
Some HTTP requests will be denied unless cookie values are passed in with the
 | 
			
		||||
request. The @option{cookies} option allows these cookies to be specified. At
 | 
			
		||||
the very least, each cookie must specify a value along with a path and domain.
 | 
			
		||||
HTTP requests that match both the domain and path will automatically include the
 | 
			
		||||
cookie value in the HTTP Cookie header field. Multiple cookies can be delimited
 | 
			
		||||
by a newline.
 | 
			
		||||
 | 
			
		||||
The required syntax to play a stream specifying a cookie is:
 | 
			
		||||
@example
 | 
			
		||||
ffplay -cookies "nlqptid=nltid=tsn; path=/; domain=somedomain.com;" http://somedomain.com/somestream.m3u8
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section mmst
 | 
			
		||||
 | 
			
		||||
MMS (Microsoft Media Server) protocol over TCP.
 | 
			
		||||
@@ -339,16 +182,6 @@ ffmpeg -i test.wav -f avi pipe:1 | cat > test.avi
 | 
			
		||||
ffmpeg -i test.wav -f avi pipe: | cat > test.avi
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
This protocol accepts the following options:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item blocksize
 | 
			
		||||
Set I/O operation maximum block size, in bytes. Default value is
 | 
			
		||||
@code{INT_MAX}, which results in not limiting the requested block size.
 | 
			
		||||
Setting this value reasonably low improves user termination request reaction
 | 
			
		||||
time, which is valuable if data transmission is slow.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Note that some formats (typically MOV), require the output protocol to
 | 
			
		||||
be seekable, so they will fail with the pipe output protocol.
 | 
			
		||||
 | 
			
		||||
@@ -361,18 +194,12 @@ content across a TCP/IP network.
 | 
			
		||||
 | 
			
		||||
The required syntax is:
 | 
			
		||||
@example
 | 
			
		||||
rtmp://[@var{username}:@var{password}@@]@var{server}[:@var{port}][/@var{app}][/@var{instance}][/@var{playpath}]
 | 
			
		||||
rtmp://@var{server}[:@var{port}][/@var{app}][/@var{playpath}]
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
The accepted parameters are:
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item username
 | 
			
		||||
An optional username (mostly for publishing).
 | 
			
		||||
 | 
			
		||||
@item password
 | 
			
		||||
An optional password (mostly for publishing).
 | 
			
		||||
 | 
			
		||||
@item server
 | 
			
		||||
The address of the RTMP server.
 | 
			
		||||
 | 
			
		||||
@@ -382,89 +209,11 @@ The number of the TCP port to use (by default is 1935).
 | 
			
		||||
@item app
 | 
			
		||||
It is the name of the application to access. It usually corresponds to
 | 
			
		||||
the path where the application is installed on the RTMP server
 | 
			
		||||
(e.g. @file{/ondemand/}, @file{/flash/live/}, etc.). You can override
 | 
			
		||||
the value parsed from the URI through the @code{rtmp_app} option, too.
 | 
			
		||||
(e.g. @file{/ondemand/}, @file{/flash/live/}, etc.).
 | 
			
		||||
 | 
			
		||||
@item playpath
 | 
			
		||||
It is the path or name of the resource to play with reference to the
 | 
			
		||||
application specified in @var{app}, may be prefixed by "mp4:". You
 | 
			
		||||
can override the value parsed from the URI through the @code{rtmp_playpath}
 | 
			
		||||
option, too.
 | 
			
		||||
 | 
			
		||||
@item listen
 | 
			
		||||
Act as a server, listening for an incoming connection.
 | 
			
		||||
 | 
			
		||||
@item timeout
 | 
			
		||||
Maximum time to wait for the incoming connection. Implies listen.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Additionally, the following parameters can be set via command line options
 | 
			
		||||
(or in code via @code{AVOption}s):
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item rtmp_app
 | 
			
		||||
Name of application to connect on the RTMP server. This option
 | 
			
		||||
overrides the parameter specified in the URI.
 | 
			
		||||
 | 
			
		||||
@item rtmp_buffer
 | 
			
		||||
Set the client buffer time in milliseconds. The default is 3000.
 | 
			
		||||
 | 
			
		||||
@item rtmp_conn
 | 
			
		||||
Extra arbitrary AMF connection parameters, parsed from a string,
 | 
			
		||||
e.g. like @code{B:1 S:authMe O:1 NN:code:1.23 NS:flag:ok O:0}.
 | 
			
		||||
Each value is prefixed by a single character denoting the type,
 | 
			
		||||
B for Boolean, N for number, S for string, O for object, or Z for null,
 | 
			
		||||
followed by a colon. For Booleans the data must be either 0 or 1 for
 | 
			
		||||
FALSE or TRUE, respectively.  Likewise for Objects the data must be 0 or
 | 
			
		||||
1 to end or begin an object, respectively. Data items in subobjects may
 | 
			
		||||
be named, by prefixing the type with 'N' and specifying the name before
 | 
			
		||||
the value (i.e. @code{NB:myFlag:1}). This option may be used multiple
 | 
			
		||||
times to construct arbitrary AMF sequences.
 | 
			
		||||
 | 
			
		||||
@item rtmp_flashver
 | 
			
		||||
Version of the Flash plugin used to run the SWF player. The default
 | 
			
		||||
is LNX 9,0,124,2. (When publishing, the default is FMLE/3.0 (compatible;
 | 
			
		||||
<libavformat version>).)
 | 
			
		||||
 | 
			
		||||
@item rtmp_flush_interval
 | 
			
		||||
Number of packets flushed in the same request (RTMPT only). The default
 | 
			
		||||
is 10.
 | 
			
		||||
 | 
			
		||||
@item rtmp_live
 | 
			
		||||
Specify that the media is a live stream. No resuming or seeking in
 | 
			
		||||
live streams is possible. The default value is @code{any}, which means the
 | 
			
		||||
subscriber first tries to play the live stream specified in the
 | 
			
		||||
playpath. If a live stream of that name is not found, it plays the
 | 
			
		||||
recorded stream. The other possible values are @code{live} and
 | 
			
		||||
@code{recorded}.
 | 
			
		||||
 | 
			
		||||
@item rtmp_pageurl
 | 
			
		||||
URL of the web page in which the media was embedded. By default no
 | 
			
		||||
value will be sent.
 | 
			
		||||
 | 
			
		||||
@item rtmp_playpath
 | 
			
		||||
Stream identifier to play or to publish. This option overrides the
 | 
			
		||||
parameter specified in the URI.
 | 
			
		||||
 | 
			
		||||
@item rtmp_subscribe
 | 
			
		||||
Name of live stream to subscribe to. By default no value will be sent.
 | 
			
		||||
It is only sent if the option is specified or if rtmp_live
 | 
			
		||||
is set to live.
 | 
			
		||||
 | 
			
		||||
@item rtmp_swfhash
 | 
			
		||||
SHA256 hash of the decompressed SWF file (32 bytes).
 | 
			
		||||
 | 
			
		||||
@item rtmp_swfsize
 | 
			
		||||
Size of the decompressed SWF file, required for SWFVerification.
 | 
			
		||||
 | 
			
		||||
@item rtmp_swfurl
 | 
			
		||||
URL of the SWF player for the media. By default no value will be sent.
 | 
			
		||||
 | 
			
		||||
@item rtmp_swfverify
 | 
			
		||||
URL to player swf file, compute hash/size automatically.
 | 
			
		||||
 | 
			
		||||
@item rtmp_tcurl
 | 
			
		||||
URL of the target stream. Defaults to proto://host[:port]/app.
 | 
			
		||||
application specified in @var{app}, may be prefixed by "mp4:".
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@@ -474,85 +223,7 @@ For example to read with @command{ffplay} a multimedia resource named
 | 
			
		||||
ffplay rtmp://myserver/vod/sample
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
To publish to a password protected server, passing the playpath and
 | 
			
		||||
app names separately:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -re -i <input> -f flv -rtmp_playpath some/long/path -rtmp_app long/app/name rtmp://username:password@@myserver/
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section rtmpe
 | 
			
		||||
 | 
			
		||||
Encrypted Real-Time Messaging Protocol.
 | 
			
		||||
 | 
			
		||||
The Encrypted Real-Time Messaging Protocol (RTMPE) is used for
 | 
			
		||||
streaming multimedia content within standard cryptographic primitives,
 | 
			
		||||
consisting of Diffie-Hellman key exchange and HMACSHA256, generating
 | 
			
		||||
a pair of RC4 keys.
 | 
			
		||||
 | 
			
		||||
@section rtmps
 | 
			
		||||
 | 
			
		||||
Real-Time Messaging Protocol over a secure SSL connection.
 | 
			
		||||
 | 
			
		||||
The Real-Time Messaging Protocol (RTMPS) is used for streaming
 | 
			
		||||
multimedia content across an encrypted connection.
 | 
			
		||||
 | 
			
		||||
@section rtmpt
 | 
			
		||||
 | 
			
		||||
Real-Time Messaging Protocol tunneled through HTTP.
 | 
			
		||||
 | 
			
		||||
The Real-Time Messaging Protocol tunneled through HTTP (RTMPT) is used
 | 
			
		||||
for streaming multimedia content within HTTP requests to traverse
 | 
			
		||||
firewalls.
 | 
			
		||||
 | 
			
		||||
@section rtmpte
 | 
			
		||||
 | 
			
		||||
Encrypted Real-Time Messaging Protocol tunneled through HTTP.
 | 
			
		||||
 | 
			
		||||
The Encrypted Real-Time Messaging Protocol tunneled through HTTP (RTMPTE)
 | 
			
		||||
is used for streaming multimedia content within HTTP requests to traverse
 | 
			
		||||
firewalls.
 | 
			
		||||
 | 
			
		||||
@section rtmpts
 | 
			
		||||
 | 
			
		||||
Real-Time Messaging Protocol tunneled through HTTPS.
 | 
			
		||||
 | 
			
		||||
The Real-Time Messaging Protocol tunneled through HTTPS (RTMPTS) is used
 | 
			
		||||
for streaming multimedia content within HTTPS requests to traverse
 | 
			
		||||
firewalls.
 | 
			
		||||
 | 
			
		||||
@section libssh
 | 
			
		||||
 | 
			
		||||
Secure File Transfer Protocol via libssh
 | 
			
		||||
 | 
			
		||||
Allow to read from or write to remote resources using SFTP protocol.
 | 
			
		||||
 | 
			
		||||
Following syntax is required.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
sftp://[user[:password]@@]server[:port]/path/to/remote/resource.mpeg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
This protocol accepts the following options.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item timeout
 | 
			
		||||
Set timeout of socket I/O operations used by the underlying low level
 | 
			
		||||
operation. By default it is set to -1, which means that the timeout
 | 
			
		||||
is not specified.
 | 
			
		||||
 | 
			
		||||
@item truncate
 | 
			
		||||
Truncate existing files on write, if set to 1. A value of 0 prevents
 | 
			
		||||
truncating. Default value is 1.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Example: Play a file stored on remote server.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffplay sftp://user:password@@server_address:22/home/user/resource.mpeg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section librtmp rtmp, rtmpe, rtmps, rtmpt, rtmpte
 | 
			
		||||
@section rtmp, rtmpe, rtmps, rtmpt, rtmpte
 | 
			
		||||
 | 
			
		||||
Real-Time Messaging Protocol and its variants supported through
 | 
			
		||||
librtmp.
 | 
			
		||||
@@ -594,70 +265,7 @@ ffplay "rtmp://myserver/live/mystream live=1"
 | 
			
		||||
 | 
			
		||||
@section rtp
 | 
			
		||||
 | 
			
		||||
Real-time Transport Protocol.
 | 
			
		||||
 | 
			
		||||
The required syntax for an RTP URL is:
 | 
			
		||||
rtp://@var{hostname}[:@var{port}][?@var{option}=@var{val}...]
 | 
			
		||||
 | 
			
		||||
@var{port} specifies the RTP port to use.
 | 
			
		||||
 | 
			
		||||
The following URL options are supported:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item ttl=@var{n}
 | 
			
		||||
Set the TTL (Time-To-Live) value (for multicast only).
 | 
			
		||||
 | 
			
		||||
@item rtcpport=@var{n}
 | 
			
		||||
Set the remote RTCP port to @var{n}.
 | 
			
		||||
 | 
			
		||||
@item localrtpport=@var{n}
 | 
			
		||||
Set the local RTP port to @var{n}.
 | 
			
		||||
 | 
			
		||||
@item localrtcpport=@var{n}'
 | 
			
		||||
Set the local RTCP port to @var{n}.
 | 
			
		||||
 | 
			
		||||
@item pkt_size=@var{n}
 | 
			
		||||
Set max packet size (in bytes) to @var{n}.
 | 
			
		||||
 | 
			
		||||
@item connect=0|1
 | 
			
		||||
Do a @code{connect()} on the UDP socket (if set to 1) or not (if set
 | 
			
		||||
to 0).
 | 
			
		||||
 | 
			
		||||
@item sources=@var{ip}[,@var{ip}]
 | 
			
		||||
List allowed source IP addresses.
 | 
			
		||||
 | 
			
		||||
@item block=@var{ip}[,@var{ip}]
 | 
			
		||||
List disallowed (blocked) source IP addresses.
 | 
			
		||||
 | 
			
		||||
@item write_to_source=0|1
 | 
			
		||||
Send packets to the source address of the latest received packet (if
 | 
			
		||||
set to 1) or to a default remote address (if set to 0).
 | 
			
		||||
 | 
			
		||||
@item localport=@var{n}
 | 
			
		||||
Set the local RTP port to @var{n}.
 | 
			
		||||
 | 
			
		||||
This is a deprecated option. Instead, @option{localrtpport} should be
 | 
			
		||||
used.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Important notes:
 | 
			
		||||
 | 
			
		||||
@enumerate
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
If @option{rtcpport} is not set the RTCP port will be set to the RTP
 | 
			
		||||
port value plus 1.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
If @option{localrtpport} (the local RTP port) is not set any available
 | 
			
		||||
port will be used for the local RTP and RTCP ports.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
If @option{localrtcpport} (the local RTCP port) is not set it will be
 | 
			
		||||
set to the the local RTP port value plus 1.
 | 
			
		||||
@end enumerate
 | 
			
		||||
Real-Time Protocol.
 | 
			
		||||
 | 
			
		||||
@section rtsp
 | 
			
		||||
 | 
			
		||||
@@ -707,8 +315,6 @@ Flags for @code{rtsp_flags}:
 | 
			
		||||
@table @option
 | 
			
		||||
@item filter_src
 | 
			
		||||
Accept packets only from negotiated peer address and port.
 | 
			
		||||
@item listen
 | 
			
		||||
Act as a server, listening for an incoming connection.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
When receiving data over UDP, the demuxer tries to reorder received packets
 | 
			
		||||
@@ -741,17 +347,6 @@ To send a stream in realtime to a RTSP server, for others to watch:
 | 
			
		||||
ffmpeg -re -i @var{input} -f rtsp -muxdelay 0.1 rtsp://server/live.sdp
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
To receive a stream in realtime:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -rtsp_flags listen -i rtsp://ownaddress/live.sdp @var{output}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item stimeout
 | 
			
		||||
Socket IO timeout in micro seconds.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section sap
 | 
			
		||||
 | 
			
		||||
Session Announcement Protocol (RFC 2974). This is not technically a
 | 
			
		||||
@@ -844,50 +439,6 @@ To play back the first stream announced on one the default IPv6 SAP multicast ad
 | 
			
		||||
ffplay sap://[ff0e::2:7ffe]
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section sctp
 | 
			
		||||
 | 
			
		||||
Stream Control Transmission Protocol.
 | 
			
		||||
 | 
			
		||||
The accepted URL syntax is:
 | 
			
		||||
@example
 | 
			
		||||
sctp://@var{host}:@var{port}[?@var{options}]
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
The protocol accepts the following options:
 | 
			
		||||
@table @option
 | 
			
		||||
@item listen
 | 
			
		||||
If set to any value, listen for an incoming connection. Outgoing connection is done by default.
 | 
			
		||||
 | 
			
		||||
@item max_streams
 | 
			
		||||
Set the maximum number of streams. By default no limit is set.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section srtp
 | 
			
		||||
 | 
			
		||||
Secure Real-time Transport Protocol.
 | 
			
		||||
 | 
			
		||||
The accepted options are:
 | 
			
		||||
@table @option
 | 
			
		||||
@item srtp_in_suite
 | 
			
		||||
@item srtp_out_suite
 | 
			
		||||
Select input and output encoding suites.
 | 
			
		||||
 | 
			
		||||
Supported values:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item AES_CM_128_HMAC_SHA1_80
 | 
			
		||||
@item SRTP_AES128_CM_HMAC_SHA1_80
 | 
			
		||||
@item AES_CM_128_HMAC_SHA1_32
 | 
			
		||||
@item SRTP_AES128_CM_HMAC_SHA1_32
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item srtp_in_params
 | 
			
		||||
@item srtp_out_params
 | 
			
		||||
Set input and output encoding parameters, which are expressed by a
 | 
			
		||||
base64-encoded representation of a binary block. The first 16 bytes of
 | 
			
		||||
this binary block are used as master key, the following 14 bytes are
 | 
			
		||||
used as master salt.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section tcp
 | 
			
		||||
 | 
			
		||||
Trasmission Control Protocol.
 | 
			
		||||
@@ -902,11 +453,6 @@ tcp://@var{hostname}:@var{port}[?@var{options}]
 | 
			
		||||
@item listen
 | 
			
		||||
Listen for an incoming connection
 | 
			
		||||
 | 
			
		||||
@item timeout=@var{microseconds}
 | 
			
		||||
In read mode: if no data arrived in more than this time interval, raise error.
 | 
			
		||||
In write mode: if socket cannot be written in more than this time interval, raise error.
 | 
			
		||||
This also sets timeout on TCP connection establishing.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i @var{input} -f @var{format} tcp://@var{hostname}:@var{port}?listen
 | 
			
		||||
ffplay tcp://@var{hostname}:@var{port}
 | 
			
		||||
@@ -914,67 +460,6 @@ ffplay tcp://@var{hostname}:@var{port}
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section tls
 | 
			
		||||
 | 
			
		||||
Transport Layer Security (TLS) / Secure Sockets Layer (SSL)
 | 
			
		||||
 | 
			
		||||
The required syntax for a TLS/SSL url is:
 | 
			
		||||
@example
 | 
			
		||||
tls://@var{hostname}:@var{port}[?@var{options}]
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
The following parameters can be set via command line options
 | 
			
		||||
(or in code via @code{AVOption}s):
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item ca_file, cafile=@var{filename}
 | 
			
		||||
A file containing certificate authority (CA) root certificates to treat
 | 
			
		||||
as trusted. If the linked TLS library contains a default this might not
 | 
			
		||||
need to be specified for verification to work, but not all libraries and
 | 
			
		||||
setups have defaults built in.
 | 
			
		||||
The file must be in OpenSSL PEM format.
 | 
			
		||||
 | 
			
		||||
@item tls_verify=@var{1|0}
 | 
			
		||||
If enabled, try to verify the peer that we are communicating with.
 | 
			
		||||
Note, if using OpenSSL, this currently only makes sure that the
 | 
			
		||||
peer certificate is signed by one of the root certificates in the CA
 | 
			
		||||
database, but it does not validate that the certificate actually
 | 
			
		||||
matches the host name we are trying to connect to. (With GnuTLS,
 | 
			
		||||
the host name is validated as well.)
 | 
			
		||||
 | 
			
		||||
This is disabled by default since it requires a CA database to be
 | 
			
		||||
provided by the caller in many cases.
 | 
			
		||||
 | 
			
		||||
@item cert_file, cert=@var{filename}
 | 
			
		||||
A file containing a certificate to use in the handshake with the peer.
 | 
			
		||||
(When operating as server, in listen mode, this is more often required
 | 
			
		||||
by the peer, while client certificates only are mandated in certain
 | 
			
		||||
setups.)
 | 
			
		||||
 | 
			
		||||
@item key_file, key=@var{filename}
 | 
			
		||||
A file containing the private key for the certificate.
 | 
			
		||||
 | 
			
		||||
@item listen=@var{1|0}
 | 
			
		||||
If enabled, listen for connections on the provided port, and assume
 | 
			
		||||
the server role in the handshake instead of the client role.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Example command lines:
 | 
			
		||||
 | 
			
		||||
To create a TLS/SSL server that serves an input stream.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i @var{input} -f @var{format} tls://@var{hostname}:@var{port}?listen&cert=@var{server.crt}&key=@var{server.key}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
To play back a stream from the TLS/SSL server using @command{ffplay}:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffplay tls://@var{hostname}:@var{port}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section udp
 | 
			
		||||
 | 
			
		||||
User Datagram Protocol.
 | 
			
		||||
@@ -984,23 +469,16 @@ The required syntax for a UDP url is:
 | 
			
		||||
udp://@var{hostname}:@var{port}[?@var{options}]
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@var{options} contains a list of &-separated options of the form @var{key}=@var{val}.
 | 
			
		||||
 | 
			
		||||
In case threading is enabled on the system, a circular buffer is used
 | 
			
		||||
to store the incoming data, which allows to reduce loss of data due to
 | 
			
		||||
UDP socket buffer overruns. The @var{fifo_size} and
 | 
			
		||||
@var{overrun_nonfatal} options are related to this buffer.
 | 
			
		||||
 | 
			
		||||
The list of supported options follows.
 | 
			
		||||
@var{options} contains a list of &-seperated options of the form @var{key}=@var{val}.
 | 
			
		||||
Follow the list of supported options.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item buffer_size=@var{size}
 | 
			
		||||
Set the UDP socket buffer size in bytes. This is used both for the
 | 
			
		||||
receiving and the sending buffer size.
 | 
			
		||||
set the UDP buffer size in bytes
 | 
			
		||||
 | 
			
		||||
@item localport=@var{port}
 | 
			
		||||
Override the local UDP port to bind with.
 | 
			
		||||
override the local UDP port to bind with
 | 
			
		||||
 | 
			
		||||
@item localaddr=@var{addr}
 | 
			
		||||
Choose the local IP address. This is useful e.g. if sending multicast
 | 
			
		||||
@@ -1008,13 +486,13 @@ and the host has multiple interfaces, where the user can choose
 | 
			
		||||
which interface to send on by specifying the IP address of that interface.
 | 
			
		||||
 | 
			
		||||
@item pkt_size=@var{size}
 | 
			
		||||
Set the size in bytes of UDP packets.
 | 
			
		||||
set the size in bytes of UDP packets
 | 
			
		||||
 | 
			
		||||
@item reuse=@var{1|0}
 | 
			
		||||
Explicitly allow or disallow reusing UDP sockets.
 | 
			
		||||
explicitly allow or disallow reusing UDP sockets
 | 
			
		||||
 | 
			
		||||
@item ttl=@var{ttl}
 | 
			
		||||
Set the time to live value (for multicast only).
 | 
			
		||||
set the time to live value (for multicast only)
 | 
			
		||||
 | 
			
		||||
@item connect=@var{1|0}
 | 
			
		||||
Initialize the UDP socket with @code{connect()}. In this case, the
 | 
			
		||||
@@ -1026,28 +504,9 @@ and makes writes return with AVERROR(ECONNREFUSED) if "destination
 | 
			
		||||
unreachable" is received.
 | 
			
		||||
For receiving, this gives the benefit of only receiving packets from
 | 
			
		||||
the specified peer address/port.
 | 
			
		||||
 | 
			
		||||
@item sources=@var{address}[,@var{address}]
 | 
			
		||||
Only receive packets sent to the multicast group from one of the
 | 
			
		||||
specified sender IP addresses.
 | 
			
		||||
 | 
			
		||||
@item block=@var{address}[,@var{address}]
 | 
			
		||||
Ignore packets sent to the multicast group from the specified
 | 
			
		||||
sender IP addresses.
 | 
			
		||||
 | 
			
		||||
@item fifo_size=@var{units}
 | 
			
		||||
Set the UDP receiving circular buffer size, expressed as a number of
 | 
			
		||||
packets with size of 188 bytes. If not specified defaults to 7*4096.
 | 
			
		||||
 | 
			
		||||
@item overrun_nonfatal=@var{1|0}
 | 
			
		||||
Survive in case of UDP receiving circular buffer overrun. Default
 | 
			
		||||
value is 0.
 | 
			
		||||
 | 
			
		||||
@item timeout=@var{microseconds}
 | 
			
		||||
In read mode: if no data arrived in more than this time interval, raise error.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Some usage examples of the UDP protocol with @command{ffmpeg} follow.
 | 
			
		||||
Some usage examples of the udp protocol with @command{ffmpeg} follow.
 | 
			
		||||
 | 
			
		||||
To stream over UDP to a remote endpoint:
 | 
			
		||||
@example
 | 
			
		||||
@@ -1064,24 +523,4 @@ To receive over UDP from a remote endpoint:
 | 
			
		||||
ffmpeg -i udp://[@var{multicast-address}]:@var{port}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section unix
 | 
			
		||||
 | 
			
		||||
Unix local socket
 | 
			
		||||
 | 
			
		||||
The required syntax for a Unix socket URL is:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
unix://@var{filepath}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
The following parameters can be set via command line options
 | 
			
		||||
(or in code via @code{AVOption}s):
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item timeout
 | 
			
		||||
Timeout in ms.
 | 
			
		||||
@item listen
 | 
			
		||||
Create the Unix socket in listening mode.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@c man end PROTOCOLS
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ Let's consider the problem of minimizing:
 | 
			
		||||
 | 
			
		||||
rate is the filesize
 | 
			
		||||
distortion is the quality
 | 
			
		||||
lambda is a fixed value chosen as a tradeoff between quality and filesize
 | 
			
		||||
lambda is a fixed value choosen as a tradeoff between quality and filesize
 | 
			
		||||
Is this equivalent to finding the best quality for a given max
 | 
			
		||||
filesize? The answer is yes. For each filesize limit there is some lambda
 | 
			
		||||
factor for which minimizing above will get you the best quality (using your
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user