Compare commits
	
		
			368 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					e0a03d1f9c | ||
| 
						 | 
					d07be523f5 | ||
| 
						 | 
					e4cdde96b3 | ||
| 
						 | 
					252a0ccb80 | ||
| 
						 | 
					dad0c9d686 | ||
| 
						 | 
					e173834af8 | ||
| 
						 | 
					63e3a97815 | ||
| 
						 | 
					61796a8999 | ||
| 
						 | 
					7d9c059a35 | ||
| 
						 | 
					52572ca1b3 | ||
| 
						 | 
					220bbc44c2 | ||
| 
						 | 
					f378636d90 | ||
| 
						 | 
					98f33430a2 | ||
| 
						 | 
					6672f672d9 | ||
| 
						 | 
					3002e5976d | ||
| 
						 | 
					1e8ff7d21d | ||
| 
						 | 
					dae6c19995 | ||
| 
						 | 
					989adf5ee5 | ||
| 
						 | 
					09d406eec8 | ||
| 
						 | 
					d1b62a9a07 | ||
| 
						 | 
					29c8fac3f7 | ||
| 
						 | 
					8c33d40a7b | ||
| 
						 | 
					f406bf3fa9 | ||
| 
						 | 
					54bec22a6e | ||
| 
						 | 
					e1b2c93a23 | ||
| 
						 | 
					e529ff52a0 | ||
| 
						 | 
					fb7e76d1cf | ||
| 
						 | 
					96047b3150 | ||
| 
						 | 
					2545defeac | ||
| 
						 | 
					2d97ad38ed | ||
| 
						 | 
					f6c628f029 | ||
| 
						 | 
					3f743e3e4c | ||
| 
						 | 
					f2dbd64bde | ||
| 
						 | 
					7bce659e18 | ||
| 
						 | 
					cb9379065f | ||
| 
						 | 
					4261778dbd | ||
| 
						 | 
					ba88a6e4e4 | ||
| 
						 | 
					e0407a7bf7 | ||
| 
						 | 
					d575984dfc | ||
| 
						 | 
					9ea1e82d68 | ||
| 
						 | 
					5cd2cdf33f | ||
| 
						 | 
					a5a6f6fec3 | ||
| 
						 | 
					88544e8ceb | ||
| 
						 | 
					f183eaa3ad | ||
| 
						 | 
					d773d7775a | ||
| 
						 | 
					f15f4cefd7 | ||
| 
						 | 
					0ec75a04e5 | ||
| 
						 | 
					34fb994d93 | ||
| 
						 | 
					acafd1814e | ||
| 
						 | 
					bb01956d67 | ||
| 
						 | 
					bc0c49b83e | ||
| 
						 | 
					0008a87cb1 | ||
| 
						 | 
					2aa6592338 | ||
| 
						 | 
					2b14d98086 | ||
| 
						 | 
					a05f86ec10 | ||
| 
						 | 
					9bdb254b98 | ||
| 
						 | 
					358d1f6e01 | ||
| 
						 | 
					ea28034f5d | ||
| 
						 | 
					6452b31599 | ||
| 
						 | 
					a14969253a | ||
| 
						 | 
					fab9a7be76 | ||
| 
						 | 
					3a67865963 | ||
| 
						 | 
					3fb754712c | ||
| 
						 | 
					e5294f407a | ||
| 
						 | 
					ed1ad2f5eb | ||
| 
						 | 
					e780c3daaf | ||
| 
						 | 
					7f954ca502 | ||
| 
						 | 
					8e9e57ed0c | ||
| 
						 | 
					1bd6372cd3 | ||
| 
						 | 
					40ffa99dfa | ||
| 
						 | 
					ff79f6b35a | ||
| 
						 | 
					e2a83d72da | ||
| 
						 | 
					6c3985713b | ||
| 
						 | 
					7d97cc8d87 | ||
| 
						 | 
					a56a9e65c6 | ||
| 
						 | 
					428b629eb2 | ||
| 
						 | 
					194d12345d | ||
| 
						 | 
					b3d8276d2d | ||
| 
						 | 
					c2eb668617 | ||
| 
						 | 
					c9c223ba00 | ||
| 
						 | 
					9d0ff6436e | ||
| 
						 | 
					02b7b125b5 | ||
| 
						 | 
					5643668308 | ||
| 
						 | 
					2d18e7f3ef | ||
| 
						 | 
					f1b5830182 | ||
| 
						 | 
					c588316555 | ||
| 
						 | 
					afd1f61944 | ||
| 
						 | 
					16a9c5ea9e | ||
| 
						 | 
					83fb31a76d | ||
| 
						 | 
					fc5b32877a | ||
| 
						 | 
					10e023c4fa | ||
| 
						 | 
					27a3a59428 | ||
| 
						 | 
					8ab849cddc | ||
| 
						 | 
					5191b00155 | ||
| 
						 | 
					1131e7a1a4 | ||
| 
						 | 
					26becbcd2a | ||
| 
						 | 
					366cdd3548 | ||
| 
						 | 
					e3b08b3ad4 | ||
| 
						 | 
					fa16440659 | ||
| 
						 | 
					c36fd16aaa | ||
| 
						 | 
					8c5897632a | ||
| 
						 | 
					b34fce9c54 | ||
| 
						 | 
					742f9aa879 | ||
| 
						 | 
					79041d92ee | ||
| 
						 | 
					82cebc0e05 | ||
| 
						 | 
					09abca6802 | ||
| 
						 | 
					43d64829e6 | ||
| 
						 | 
					4a479fd3e6 | ||
| 
						 | 
					4f41717d01 | ||
| 
						 | 
					6896dcbf5f | ||
| 
						 | 
					14404170b9 | ||
| 
						 | 
					e9e42beed2 | ||
| 
						 | 
					abd6decd55 | ||
| 
						 | 
					0385c824f1 | ||
| 
						 | 
					c4e764aa69 | ||
| 
						 | 
					9d02e38d3f | ||
| 
						 | 
					30cf47c6f0 | ||
| 
						 | 
					b45cd17d29 | ||
| 
						 | 
					26b6d70c72 | ||
| 
						 | 
					32919db4fb | ||
| 
						 | 
					56f44c26f0 | ||
| 
						 | 
					fe87a40de6 | ||
| 
						 | 
					0f6e309b97 | ||
| 
						 | 
					96e13c9897 | ||
| 
						 | 
					e72c0a0466 | ||
| 
						 | 
					dfddefa13a | ||
| 
						 | 
					ce94955b3c | ||
| 
						 | 
					dde95268cc | ||
| 
						 | 
					d20ac551a8 | ||
| 
						 | 
					352b0969e2 | ||
| 
						 | 
					b479b42b26 | ||
| 
						 | 
					36cab9c408 | ||
| 
						 | 
					34592d04fb | ||
| 
						 | 
					544accc895 | ||
| 
						 | 
					f41622ecb4 | ||
| 
						 | 
					fc8eb4c1f9 | ||
| 
						 | 
					02bae9f013 | ||
| 
						 | 
					5cb2a1c3f0 | ||
| 
						 | 
					a221c9bd76 | ||
| 
						 | 
					b2583c2b62 | ||
| 
						 | 
					bd553941ae | ||
| 
						 | 
					e0aa76d38a | ||
| 
						 | 
					a014b9614e | ||
| 
						 | 
					31c21d2f69 | ||
| 
						 | 
					3cd1c8653b | ||
| 
						 | 
					194485cfba | ||
| 
						 | 
					81cfe39113 | ||
| 
						 | 
					ef0c503d37 | ||
| 
						 | 
					1103aec1df | ||
| 
						 | 
					b40ab81d1f | ||
| 
						 | 
					314f055c29 | ||
| 
						 | 
					2c566744c4 | ||
| 
						 | 
					adad1ba5d8 | ||
| 
						 | 
					a80a7131d1 | ||
| 
						 | 
					3ab63abbd4 | ||
| 
						 | 
					d2c76782e0 | ||
| 
						 | 
					4dc8b4d7d0 | ||
| 
						 | 
					9ff0467566 | ||
| 
						 | 
					4407b38b28 | ||
| 
						 | 
					8caaf260a6 | ||
| 
						 | 
					e1f51bbd1f | ||
| 
						 | 
					4b7c149306 | ||
| 
						 | 
					e8919d6522 | ||
| 
						 | 
					b017785fa5 | ||
| 
						 | 
					01507eb1f8 | ||
| 
						 | 
					938ff93710 | ||
| 
						 | 
					0c88d539f8 | ||
| 
						 | 
					e39a992bd1 | ||
| 
						 | 
					72a12f61ef | ||
| 
						 | 
					30ae080e9d | ||
| 
						 | 
					dca463b728 | ||
| 
						 | 
					25b462cab9 | ||
| 
						 | 
					7c6a8afa7e | ||
| 
						 | 
					b052525f9b | ||
| 
						 | 
					90c7bfb9be | ||
| 
						 | 
					7bdd348e58 | ||
| 
						 | 
					af3d003658 | ||
| 
						 | 
					c00beff5e0 | ||
| 
						 | 
					57a43142ba | ||
| 
						 | 
					99905118a8 | ||
| 
						 | 
					dcf560204c | ||
| 
						 | 
					5b0e2eb041 | ||
| 
						 | 
					d461e077a5 | ||
| 
						 | 
					9a884b7b97 | ||
| 
						 | 
					9abe0bfb7f | ||
| 
						 | 
					13682b48e9 | ||
| 
						 | 
					f25e6e0c25 | ||
| 
						 | 
					80239a8bb1 | ||
| 
						 | 
					26bbc1c242 | ||
| 
						 | 
					efe259a27e | ||
| 
						 | 
					49f11e12d5 | ||
| 
						 | 
					d130fae519 | ||
| 
						 | 
					dde996bf99 | ||
| 
						 | 
					cad2958fd7 | ||
| 
						 | 
					29d61d73b1 | ||
| 
						 | 
					9a6a710998 | ||
| 
						 | 
					daaef403d1 | ||
| 
						 | 
					207f5a138a | ||
| 
						 | 
					e9c8a9aaa6 | ||
| 
						 | 
					7b7d8b8794 | ||
| 
						 | 
					90d6b563fe | ||
| 
						 | 
					dce2f820e9 | ||
| 
						 | 
					4aab3f868f | ||
| 
						 | 
					48609236da | ||
| 
						 | 
					d8fe695779 | ||
| 
						 | 
					0f42e06651 | ||
| 
						 | 
					230c4c6ad9 | ||
| 
						 | 
					f4489c9558 | ||
| 
						 | 
					0e5d9fe2a7 | ||
| 
						 | 
					9ae2aaea50 | ||
| 
						 | 
					2513314912 | ||
| 
						 | 
					e727cbf0be | ||
| 
						 | 
					bcc25353cf | ||
| 
						 | 
					6a10263f16 | ||
| 
						 | 
					bcc6429c01 | ||
| 
						 | 
					bdb219435e | ||
| 
						 | 
					a7338ae8ac | ||
| 
						 | 
					6776c2c04f | ||
| 
						 | 
					facd3dbc6e | ||
| 
						 | 
					8796c3b7d3 | ||
| 
						 | 
					7430f3064f | ||
| 
						 | 
					eac281b06c | ||
| 
						 | 
					b5210f4eae | ||
| 
						 | 
					10379d50be | ||
| 
						 | 
					cd874cf8e6 | ||
| 
						 | 
					82a3e469c6 | ||
| 
						 | 
					f859fed03d | ||
| 
						 | 
					991e6fa35b | ||
| 
						 | 
					09dca51066 | ||
| 
						 | 
					40de74d0eb | ||
| 
						 | 
					e2811c2ede | ||
| 
						 | 
					25d14b716a | ||
| 
						 | 
					f1de93dec3 | ||
| 
						 | 
					738d68de85 | ||
| 
						 | 
					00ecce5c8b | ||
| 
						 | 
					6ba07e9948 | ||
| 
						 | 
					125bea15d1 | ||
| 
						 | 
					70e3cc282b | ||
| 
						 | 
					242df26b44 | ||
| 
						 | 
					46c2dba20e | ||
| 
						 | 
					3caa6a5a57 | ||
| 
						 | 
					bf08665e2e | ||
| 
						 | 
					c4f5f4dbd3 | ||
| 
						 | 
					29df24252a | ||
| 
						 | 
					b920c1d5ad | ||
| 
						 | 
					2b9ee7d5b9 | ||
| 
						 | 
					f800cacada | ||
| 
						 | 
					5227eac5b0 | ||
| 
						 | 
					bb40f8f5e2 | ||
| 
						 | 
					ad8bf22086 | ||
| 
						 | 
					7f8804296d | ||
| 
						 | 
					f67e75b5dc | ||
| 
						 | 
					35e63f35b0 | ||
| 
						 | 
					3bfb7a2537 | ||
| 
						 | 
					4a1e7a6fb7 | ||
| 
						 | 
					ff1e982205 | ||
| 
						 | 
					bb116e6ba3 | ||
| 
						 | 
					ebe356bf1c | ||
| 
						 | 
					30099413ec | ||
| 
						 | 
					186e0ff067 | ||
| 
						 | 
					2642ad9f55 | ||
| 
						 | 
					95ddd2227b | ||
| 
						 | 
					3faebed6fa | ||
| 
						 | 
					3aee1fa5b6 | ||
| 
						 | 
					89a9c84ebb | ||
| 
						 | 
					0adde39e04 | ||
| 
						 | 
					03ae616b19 | ||
| 
						 | 
					830c3058ff | ||
| 
						 | 
					b12c5cbbb2 | ||
| 
						 | 
					82c96b5ad8 | ||
| 
						 | 
					3e4b957847 | ||
| 
						 | 
					cbabbe8220 | ||
| 
						 | 
					80122a3af3 | ||
| 
						 | 
					a475755b3a | ||
| 
						 | 
					66030e8133 | ||
| 
						 | 
					46f8d838b3 | ||
| 
						 | 
					bc3648d4b4 | ||
| 
						 | 
					27e6b4a3ff | ||
| 
						 | 
					b82860caa7 | ||
| 
						 | 
					3d05625136 | ||
| 
						 | 
					ddd3301bad | ||
| 
						 | 
					123981930f | ||
| 
						 | 
					3171e2360a | ||
| 
						 | 
					3533a850e7 | ||
| 
						 | 
					6d56bc9a6d | ||
| 
						 | 
					2c5e1d0933 | ||
| 
						 | 
					b37b83214a | ||
| 
						 | 
					6d7ab09788 | ||
| 
						 | 
					227cfc1f10 | ||
| 
						 | 
					416847d195 | ||
| 
						 | 
					bd4ad1a1d5 | ||
| 
						 | 
					6230de03aa | ||
| 
						 | 
					45acc228a6 | ||
| 
						 | 
					d37fac6dbb | ||
| 
						 | 
					7940306a47 | ||
| 
						 | 
					eabefe83f4 | ||
| 
						 | 
					eaa79b79b2 | ||
| 
						 | 
					c761379825 | ||
| 
						 | 
					ea3309eba7 | ||
| 
						 | 
					1c1e252cd1 | ||
| 
						 | 
					ca2c9d6b9b | ||
| 
						 | 
					fa6b99d351 | ||
| 
						 | 
					d79cb6947e | ||
| 
						 | 
					5aa4b29bbe | ||
| 
						 | 
					e4cbd0d6e5 | ||
| 
						 | 
					0ede7b5344 | ||
| 
						 | 
					5b933be089 | ||
| 
						 | 
					f2693e98b4 | ||
| 
						 | 
					c3861e14ce | ||
| 
						 | 
					daa5a988e2 | ||
| 
						 | 
					db67b7c31b | ||
| 
						 | 
					a643a47d41 | ||
| 
						 | 
					23af29e882 | ||
| 
						 | 
					7d995cd1b8 | ||
| 
						 | 
					72a58c0772 | ||
| 
						 | 
					d525423006 | ||
| 
						 | 
					4b476e6aa4 | ||
| 
						 | 
					124c78fd44 | ||
| 
						 | 
					a1ab3300c8 | ||
| 
						 | 
					1af235f6b3 | ||
| 
						 | 
					82031e41f8 | ||
| 
						 | 
					222e7549a7 | ||
| 
						 | 
					eb2244ece9 | ||
| 
						 | 
					b967c10029 | ||
| 
						 | 
					7ff4cd2acc | ||
| 
						 | 
					c4149c4d54 | ||
| 
						 | 
					8ad2f45964 | ||
| 
						 | 
					5df52b0131 | ||
| 
						 | 
					596d3e20ae | ||
| 
						 | 
					00d5ff6431 | ||
| 
						 | 
					437179e9c8 | ||
| 
						 | 
					031d3b66c2 | ||
| 
						 | 
					b76871d870 | ||
| 
						 | 
					15ae305007 | ||
| 
						 | 
					3c72204ae0 | ||
| 
						 | 
					ba21499648 | ||
| 
						 | 
					7933039ade | ||
| 
						 | 
					4015829acc | ||
| 
						 | 
					39dc4a6bb3 | ||
| 
						 | 
					a6a2d8eb8f | ||
| 
						 | 
					58556826a8 | ||
| 
						 | 
					bc2c9a479a | ||
| 
						 | 
					9cc22be032 | ||
| 
						 | 
					33e1bca651 | ||
| 
						 | 
					9841617b7f | ||
| 
						 | 
					2897481f64 | ||
| 
						 | 
					646c564de5 | ||
| 
						 | 
					cd6281abef | ||
| 
						 | 
					697be8173b | ||
| 
						 | 
					1853d8bb7a | ||
| 
						 | 
					1779cd7695 | ||
| 
						 | 
					bb4820727f | ||
| 
						 | 
					affc7687d3 | ||
| 
						 | 
					3569470693 | ||
| 
						 | 
					1d1df82093 | ||
| 
						 | 
					de187e3e9e | ||
| 
						 | 
					7754d48381 | ||
| 
						 | 
					63169474b3 | ||
| 
						 | 
					b3f106cb1f | ||
| 
						 | 
					9b6ccf0f24 | ||
| 
						 | 
					298d66c8de | ||
| 
						 | 
					4be1b68d52 | ||
| 
						 | 
					92edc13d69 | ||
| 
						 | 
					c9f015f1c6 | ||
| 
						 | 
					db6b2ca0b3 | ||
| 
						 | 
					3503ec8461 | ||
| 
						 | 
					ecc5e42d92 | ||
| 
						 | 
					f87ce262f6 | 
							
								
								
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
*.pnm -diff -text
 | 
			
		||||
							
								
								
									
										8
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -15,7 +15,6 @@
 | 
			
		||||
*.pdb
 | 
			
		||||
*.so
 | 
			
		||||
*.so.*
 | 
			
		||||
*.swp
 | 
			
		||||
*.ver
 | 
			
		||||
*-example
 | 
			
		||||
*-test
 | 
			
		||||
@@ -37,9 +36,8 @@
 | 
			
		||||
/doc/avoptions_format.texi
 | 
			
		||||
/doc/doxy/html/
 | 
			
		||||
/doc/examples/avio_reading
 | 
			
		||||
/doc/examples/decoding_encoding
 | 
			
		||||
/doc/examples/avcodec
 | 
			
		||||
/doc/examples/demuxing_decoding
 | 
			
		||||
/doc/examples/extract_mvs
 | 
			
		||||
/doc/examples/filter_audio
 | 
			
		||||
/doc/examples/filtering_audio
 | 
			
		||||
/doc/examples/filtering_video
 | 
			
		||||
@@ -50,7 +48,6 @@
 | 
			
		||||
/doc/examples/resampling_audio
 | 
			
		||||
/doc/examples/scaling_video
 | 
			
		||||
/doc/examples/transcode_aac
 | 
			
		||||
/doc/examples/transcoding
 | 
			
		||||
/doc/fate.txt
 | 
			
		||||
/doc/print_options
 | 
			
		||||
/lcov/
 | 
			
		||||
@@ -62,9 +59,7 @@
 | 
			
		||||
/tests/audiogen
 | 
			
		||||
/tests/base64
 | 
			
		||||
/tests/data/
 | 
			
		||||
/tests/pixfmts.mak
 | 
			
		||||
/tests/rotozoom
 | 
			
		||||
/tests/test_copy.ffmeta
 | 
			
		||||
/tests/tiny_psnr
 | 
			
		||||
/tests/tiny_ssim
 | 
			
		||||
/tests/videogen
 | 
			
		||||
@@ -85,5 +80,4 @@
 | 
			
		||||
/tools/qt-faststart
 | 
			
		||||
/tools/trasher
 | 
			
		||||
/tools/seek_print
 | 
			
		||||
/tools/uncoded_frame
 | 
			
		||||
/tools/zmqsend
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										523
									
								
								Changelog
									
									
									
									
									
								
							
							
						
						
									
										523
									
								
								Changelog
									
									
									
									
									
								
							@@ -1,521 +1,6 @@
 | 
			
		||||
Entries are sorted chronologically from oldest to youngest within each release,
 | 
			
		||||
releases are sorted from youngest to oldest.
 | 
			
		||||
 | 
			
		||||
version 2.5.9
 | 
			
		||||
- avcodec/hevc: Check max ctb addresses for WPP
 | 
			
		||||
- avcodec/vp3: ensure header is parsed successfully before tables
 | 
			
		||||
- avcodec/jpeg2000dec: Check bpno in decode_cblk()
 | 
			
		||||
- avcodec/pgssubdec: Fix left shift of 255 by 24 places cannot be represented in type int
 | 
			
		||||
- swscale/utils: Fix for runtime error: left shift of negative value -1
 | 
			
		||||
- avcodec/hevc: Fix integer overflow of entry_point_offset
 | 
			
		||||
- avcodec/dirac_parser: Check that there is a previous PU before accessing it
 | 
			
		||||
- avcodec/dirac_parser: Add basic validity checks for next_pu_offset and prev_pu_offset
 | 
			
		||||
- avcodec/dirac_parser: Fix potential overflows in pointer checks
 | 
			
		||||
- avcodec/wmaprodec: Check bits per sample to be within the range not causing integer overflows
 | 
			
		||||
- avcodec/wmaprodec: Fix overflow of cutoff
 | 
			
		||||
- avformat/smacker: fix integer overflow with pts_inc
 | 
			
		||||
- avcodec/vp3: Fix "runtime error: left shift of negative value"
 | 
			
		||||
- mpegencts: Fix overflow in cbr mode period calculations
 | 
			
		||||
- avutil/timecode: Fix fps check
 | 
			
		||||
- avutil/mathematics: return INT64_MIN (=AV_NOPTS_VALUE) from av_rescale_rnd() for overflows
 | 
			
		||||
- avcodec/apedec: Check length in long_filter_high_3800()
 | 
			
		||||
- avcodec/vp3: always set pix_fmt in theora_decode_header()
 | 
			
		||||
- avcodec/mpeg4videodec: Check available data before reading custom matrix
 | 
			
		||||
- avutil/mathematics: Do not treat INT64_MIN as positive in av_rescale_rnd
 | 
			
		||||
- avutil/integer: Fix av_mod_i() with negative dividend
 | 
			
		||||
- avformat/dump: Fix integer overflow in av_dump_format()
 | 
			
		||||
- avcodec/utils: Clear dimensions in ff_get_buffer() on failure
 | 
			
		||||
- avcodec/utils: Use 64bit for aspect ratio calculation in avcodec_string()
 | 
			
		||||
- avcodec/vp3: Clear context on reinitialization failure
 | 
			
		||||
- avcodec/hevc: allocate entries unconditionally
 | 
			
		||||
- avcodec/hevc_cabac: Fix multiple integer overflows
 | 
			
		||||
- avcodec/jpeg2000dwt: Check ndeclevels before calling dwt_encode*()
 | 
			
		||||
- avcodec/jpeg2000dwt: Check ndeclevels before calling dwt_decode*()
 | 
			
		||||
- avcodec/hevc: Check entry_point_offsets
 | 
			
		||||
- avcodec/cabac: Check initial cabac decoder state
 | 
			
		||||
- avcodec/cabac_functions: Fix "left shift of negative value -31767"
 | 
			
		||||
- avcodec/ffv1dec: Clear quant_table_count if its invalid
 | 
			
		||||
- avcodec/ffv1dec: Print an error if the quant table count is invalid
 | 
			
		||||
- doc/filters/drawtext: fix centering example
 | 
			
		||||
- avcodec/h264_slice: Limit max_contexts when slice_context_count is initialized
 | 
			
		||||
- avcodec/vp8: Do not use num_coeff_partitions in thread/buffer setup
 | 
			
		||||
- rtmpcrypt: Do the xtea decryption in little endian mode
 | 
			
		||||
- avformat/matroskadec: Check subtitle stream before dereferencing
 | 
			
		||||
- avformat/utils: Do not init parser if probing is unfinished
 | 
			
		||||
- avcodec/jpeg2000dec: Fix potential integer overflow with tile dimensions
 | 
			
		||||
- avcodec/jpeg2000dec: Check SIZ dimensions to be within the supported range
 | 
			
		||||
- avcodec/jpeg2000: Check comp coords to be within the supported size
 | 
			
		||||
- avcodec/jpeg2000: Use av_image_check_size() in ff_jpeg2000_init_component()
 | 
			
		||||
- avcodec/wmaprodec: Check for overread in decode_packet()
 | 
			
		||||
- avcodec/smacker: Check that the data size is a multiple of a sample vector
 | 
			
		||||
- avcodec/takdec: Skip last p2 sample (which is unused)
 | 
			
		||||
- avcodec/dxtory: Fix input size check in dxtory_decode_v1_410()
 | 
			
		||||
- avcodec/dxtory: Fix input size check in dxtory_decode_v1_420()
 | 
			
		||||
- avcodec/error_resilience: avoid accessing previous or next frames tables beyond height
 | 
			
		||||
- avcodec/dpx: Move need_align to act per line
 | 
			
		||||
- avcodec/flashsv: Check size before updating it
 | 
			
		||||
- avcodec/ivi: Check image dimensions
 | 
			
		||||
- avcodec/utils: Better check for channels in av_get_audio_frame_duration()
 | 
			
		||||
- avcodec/jpeg2000dec: Check for duplicate SIZ marker
 | 
			
		||||
- avcodec/jpeg2000dec: Clip all tile coordinates
 | 
			
		||||
- avcodec/microdvddec: Check for string end in 'P' case
 | 
			
		||||
- avcodec/dirac_parser: Fix undefined memcpy() use
 | 
			
		||||
- avformat/xmv: Discard remainder of packet on error
 | 
			
		||||
- avformat/xmv: factor return check out of if/else
 | 
			
		||||
- libavutil/channel_layout: Check strtol*() for failure
 | 
			
		||||
- avcodec/ffv1dec: Check for 0 quant tables
 | 
			
		||||
- avcodec/mjpegdec: Reinitialize IDCT on BPP changes
 | 
			
		||||
- avcodec/mjpegdec: Check index in ljpeg_decode_yuv_scan() before using it
 | 
			
		||||
- avutil/file_open: avoid file handle inheritance on Windows
 | 
			
		||||
- opusdec: Don't run vector_fmul_scalar on zero length arrays
 | 
			
		||||
- avcodec/ffv1: Initialize vlc_state on allocation
 | 
			
		||||
- avcodec/ffv1dec: update progress in case of broken pointer chains
 | 
			
		||||
- avcodec/ffv1dec: Clear slice coordinates if they are invalid or slice header decoding fails for other reasons
 | 
			
		||||
- avformat/httpauth: Add space after commas in HTTP/RTSP auth header
 | 
			
		||||
- avcodec/x86/sbrdsp: Fix using uninitialized upper 32bit of noise
 | 
			
		||||
- avcodec/ffv1dec: Fix off by 1 error in quant_table_count check
 | 
			
		||||
- avcodec/ffv1dec: Explicitly check read_quant_table() return value
 | 
			
		||||
- avcodec/rangecoder: Check e
 | 
			
		||||
- lavf/webvttenc: Require webvtt file to contain exactly one WebVTT stream.
 | 
			
		||||
- avcodec/mjpegdec: Fix decoding RGBA RCT LJPEG
 | 
			
		||||
- avfilter/af_asyncts: use llabs for int64_t
 | 
			
		||||
- avcodec/g2meet: Also clear tile dimensions on header_fail
 | 
			
		||||
- avcodec/g2meet: Fix potential overflow in tile dimensions check
 | 
			
		||||
- avcodec/svq1dec: Check init_get_bits8() for failure
 | 
			
		||||
- avcodec/tta: Check init_get_bits8() for failure
 | 
			
		||||
- swresample/swresample: Fix integer overflow in seed calculation
 | 
			
		||||
- avformat/mov: Fix integer overflow in FFABS
 | 
			
		||||
- avutil/common: Add FFNABS()
 | 
			
		||||
- avutil/common: Document FFABS() corner case
 | 
			
		||||
- avformat/dump: Fix integer overflow in aspect ratio calculation
 | 
			
		||||
- avcodec/truemotion1: Check for even width
 | 
			
		||||
- avcodec/mpeg12dec: Set dimensions in mpeg1_decode_sequence() only in absence of errors
 | 
			
		||||
- avcodec/libopusenc: Fix infinite loop on flushing after 0 input
 | 
			
		||||
- avformat/hevc: Check num_long_term_ref_pics_sps to avoid potentially long loops
 | 
			
		||||
- avformat/hevc: Fix parsing errors
 | 
			
		||||
- ffmpeg: Use correct codec_id for av_parser_change() check
 | 
			
		||||
- ffmpeg: Check av_parser_change() for failure
 | 
			
		||||
- ffmpeg: Check for RAWVIDEO and do not relay only on AVFMT_RAWPICTURE
 | 
			
		||||
- ffmpeg: check avpicture_fill() return value
 | 
			
		||||
- avformat/mux: Update sidedata in ff_write_chained()
 | 
			
		||||
- avcodec/flashsvenc: Correct max dimension in error message
 | 
			
		||||
- avcodec/svq1enc: Check dimensions
 | 
			
		||||
- avcodec/dcaenc: clear bitstream end
 | 
			
		||||
- libavcodec/aacdec_template: Use init_get_bits8() in aac_decode_frame()
 | 
			
		||||
- mxfdec: check edit_rate also for physical_track
 | 
			
		||||
- mpegvideo: clear overread in clear_context
 | 
			
		||||
- dvdsubdec: validate offset2 similar to offset1
 | 
			
		||||
- avcodec/takdec: Use memove, avoid undefined memcpy() use
 | 
			
		||||
- jvdec: avoid unsigned overflow in comparison
 | 
			
		||||
- avcodec/mpeg12dec: Do not call show_bits() with invalid bits
 | 
			
		||||
- riffdec: prevent negative bit rate
 | 
			
		||||
- Merge commit 'd80811c94e068085aab797f9ba35790529126f85'
 | 
			
		||||
- imc: use correct position for flcoeffs2 calculation
 | 
			
		||||
- wavpack: limit extra_bits to 32 and use get_bits_long
 | 
			
		||||
- wavpack: use get_bits_long to read up to 32 bits
 | 
			
		||||
- nutdec: check maxpos in read_sm_data before returning success
 | 
			
		||||
- s302m: fix arithmetic exception
 | 
			
		||||
- avcodec/s302m: Only set the sample rate when some data is output
 | 
			
		||||
- vp9: add support for resolution changes in inter frames.
 | 
			
		||||
- alsdec: limit avctx->bits_per_raw_sample to 32
 | 
			
		||||
- vp9: avoid infinite loop with broken files
 | 
			
		||||
- videodsp: don't overread edges in vfix3 emu_edge.
 | 
			
		||||
- avcodec/h264_mp4toannexb_bsf: Reorder operations in nal_size check
 | 
			
		||||
- avformat/oggenc: Check segments_count for headers too
 | 
			
		||||
- avformat/avidec: Workaround broken initial frame
 | 
			
		||||
- hevc: properly handle no_rasl_output_flag when removing pictures from the DPB
 | 
			
		||||
- hevc: fix wpp threading deadlock.
 | 
			
		||||
- avcodec/ffv1: separate slice_count from max_slice_count
 | 
			
		||||
- lavf/img2dec: Fix memory leak
 | 
			
		||||
- avcodec/mp3: fix skipping zeros
 | 
			
		||||
- avformat/srtdec: make sure we probe a number
 | 
			
		||||
- avformat/srtdec: more lenient first line probing
 | 
			
		||||
- doc: mention libavcodec can decode Opus natively
 | 
			
		||||
- MAINTAINERS: Remove myself as leader
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 2.5.8
 | 
			
		||||
- snow: remove an obsolete av_assert2
 | 
			
		||||
- huffyuvdec: validate image size
 | 
			
		||||
- vc1dec: use get_bits_long and limit the read bits to 32
 | 
			
		||||
- mpegaudiodec: copy AVFloatDSPContext from first context to all contexts
 | 
			
		||||
- libshine: fix support for shine 3.0
 | 
			
		||||
- avidec: check for valid bit_rate range
 | 
			
		||||
- avformat/nut: support WavPack
 | 
			
		||||
- avcodec/diracdec: Check slices malloc and propagate error code
 | 
			
		||||
- avcodec/vp8: Check buffer size in vp8_decode_frame_header()
 | 
			
		||||
- avcodec/vp8: Fix null pointer dereference in ff_vp8_decode_free()
 | 
			
		||||
- avcodec/diracdec: Check for hpel_base allocation failure
 | 
			
		||||
- avcodec/rv34: Clear pointers in ff_rv34_decode_init_thread_copy()
 | 
			
		||||
- avfilter/af_aresample: Check ff_all_* for allocation failures
 | 
			
		||||
- avcodec/pthread_frame: clear priv_data, avoid stale pointer in error case
 | 
			
		||||
- swscale/utils: Clear pix buffers
 | 
			
		||||
- avutil/fifo: Fix the case where func() returns less bytes than requested in av_fifo_generic_write()
 | 
			
		||||
- avformat/mov: Fix deallocation when MOVStreamContext failed to allocate
 | 
			
		||||
- ffmpeg: Fix crash with ost->last_frame allocation failure
 | 
			
		||||
- ffmpeg: Fix cleanup with ost = NULL
 | 
			
		||||
- avcodec/pthread_frame: check avctx on deallocation
 | 
			
		||||
- avcodec/sanm: Reset sizes in destroy_buffers()
 | 
			
		||||
- avcodec/alac: Clear pointers in allocate_buffers()
 | 
			
		||||
- bytestream2: set the reader to the end when reading more than available
 | 
			
		||||
- avcodec/utils: use a minimum 32pixel width in  avcodec_align_dimensions2() for H.264
 | 
			
		||||
- avcodec/mpegvideo: Clear pointers in ff_mpv_common_init()
 | 
			
		||||
- oggparsedirac: check return value of init_get_bits
 | 
			
		||||
- wmalosslessdec: reset frame->nb_samples on packet loss
 | 
			
		||||
- wmalosslessdec: avoid reading 0 bits with get_bits
 | 
			
		||||
- avcodec/rawenc: Use ff_alloc_packet() instead of ff_alloc_packet2()
 | 
			
		||||
- avcodec/aacsbr: Assert that bs_num_env is positive
 | 
			
		||||
- avcodec/aacsbr: check that the element type matches before applying SBR
 | 
			
		||||
- avcodec/h264_slice: Use w/h from the AVFrame instead of mb_w/h
 | 
			
		||||
- vp9/update_prob: prevent out of bounds table read
 | 
			
		||||
- avfilter/vf_transpose: Fix rounding error
 | 
			
		||||
- avcodec/pngdec: Check values before updating context in decode_fctl_chunk()
 | 
			
		||||
- avcodec/pngdec: Require a IHDR chunk before fctl
 | 
			
		||||
- avcodec/pngdec: Only allow one IHDR chunk
 | 
			
		||||
- wmavoice: limit wmavoice_decode_packet return value to packet size
 | 
			
		||||
- swscale/swscale_unscaled: Fix rounding difference with RGBA output between little and big endian
 | 
			
		||||
- ffmpeg: Do not use the data/size of a bitstream filter after failure
 | 
			
		||||
- swscale/x86/rgb2rgb_template: fix signedness of v in shuffle_bytes_2103_{mmx,mmxext}
 | 
			
		||||
- swscale/x86/rgb2rgb_template: add missing xmm clobbers
 | 
			
		||||
- vda: unlock the pixel buffer base address.
 | 
			
		||||
- swscale/rgb2rgb_template: Fix signedness of v in shuffle_bytes_2103_c()
 | 
			
		||||
- swscale/rgb2rgb_template: Implement shuffle_bytes_0321_c and fix shuffle_bytes_2103_c on BE
 | 
			
		||||
- swscale/rgb2rgb_template: Disable shuffle_bytes_2103_c on big endian
 | 
			
		||||
- swr: Remember previously set int_sample_format from user
 | 
			
		||||
- matroskadec: check audio sample rate
 | 
			
		||||
- matroskadec: validate audio channels and bitdepth
 | 
			
		||||
- avcodec/dpxenc: implement write16/32 as functions
 | 
			
		||||
- postproc: fix unaligned access
 | 
			
		||||
- ffmpeg: Free last_frame instead of just unref
 | 
			
		||||
- avio: fix potential crashes when combining ffio_ensure_seekback + crc
 | 
			
		||||
- h264: er: Copy from the previous reference only if compatible
 | 
			
		||||
- sonic: set avctx->channels in sonic_decode_init
 | 
			
		||||
- vp8: change mv_{min,max}.{x,y} type to int
 | 
			
		||||
- vp9: change type of tile_size from unsigned to int64_t
 | 
			
		||||
- arm: only enable setend on ARMv6
 | 
			
		||||
- libopenjpegdec: check existence of image component data
 | 
			
		||||
- mov: abort on EOF in ff_mov_read_chan
 | 
			
		||||
- ffmpeg_opt: Check for localtime() failure
 | 
			
		||||
- avformat: Fix bug in parse_rps for HEVC.
 | 
			
		||||
- takdec: ensure chan2 is a valid channel index
 | 
			
		||||
- avcodec/h264_slice: Use AVFrame diemensions for grayscale handling
 | 
			
		||||
- avdevice/lavfi: do not rescale AV_NOPTS_VALUE in lavfi_read_packet()
 | 
			
		||||
- libavutil/channel_layout: Correctly return layout when channel specification ends with a trailing 'c'.
 | 
			
		||||
- avcodec/jpeg2000dec: Check that coords match before applying ICT
 | 
			
		||||
- avformat/ffmdec: Check ffio_set_buf_size() return value
 | 
			
		||||
- avcodec/adpcm: Check for overreads
 | 
			
		||||
- avcodec/alsdec: Check for overread
 | 
			
		||||
- avcodec/atrac3plusdec: consume only as many bytes as available
 | 
			
		||||
- libavutil/softfloat: Fix av_normalize1_sf bias.
 | 
			
		||||
- swresample/swresample: Cleanup on init failure.
 | 
			
		||||
- Revert "avformat/rtpenc: check av_packet_get_side_data() return, fix null ptr dereference"
 | 
			
		||||
- avformat/mxfenc: Accept MXF D-10 with 49.999840 Mbit/sec
 | 
			
		||||
- swresample/dither: check memory allocation
 | 
			
		||||
- libopenjpegenc: add NULL check for img before accessing it
 | 
			
		||||
- swresample: Check the return value of resampler->init()
 | 
			
		||||
- h264: Make sure reinit failures mark the context as not initialized
 | 
			
		||||
- ffmpeg_opt: Set the video VBV parameters only for the video stream from -target
 | 
			
		||||
- avcodec/bitstream: Assert that there is enough space left in avpriv_copy_bits()
 | 
			
		||||
- avcodec/put_bits: Assert that there is enough space left in skip_put_bytes()
 | 
			
		||||
- avcodec/mpegvideo_enc: Update the buffer size as more slices are merged
 | 
			
		||||
- avcodec/put_bits: Update size_in_bits in set_put_bits_buffer_size()
 | 
			
		||||
- avformat/wavdec: Increase dts packet threshold to fix more misdetections
 | 
			
		||||
- avformat/wavdec: Increase probe_packets limit
 | 
			
		||||
- avformat/swfdec: Do not error out on pixel format changes
 | 
			
		||||
- avfilter/x86/vf_hqdn3d: Fix register types
 | 
			
		||||
- avcodec/mjpegenc_common: Use ff_mpv_reallocate_putbitbuffer()
 | 
			
		||||
- avcodec/mpegvideo: Factor ff_mpv_reallocate_putbitbuffer() out
 | 
			
		||||
- avformat/mov: Mark avio context of decompressed atoms as seekable
 | 
			
		||||
- avcodec/hevc_ps: Only discard overread VPS if a previous is available
 | 
			
		||||
- avcodec/x86/h264_weight: handle weight1=128
 | 
			
		||||
- avcodec/exr: fix crash caused by merge
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 2.5.7
 | 
			
		||||
- avformat/nutdec: Fix recovery when immedeately after seeking a failure happens
 | 
			
		||||
- nutdec: fix memleaks on error in nut_read_header
 | 
			
		||||
- rtpenc_jpeg: handle case of picture dimensions not dividing by 8
 | 
			
		||||
- avformat/mov: Fix parsing short loci
 | 
			
		||||
- avcodec/shorten: Fix code depending on signed overflow behavior
 | 
			
		||||
- avcodec/proresdec2: Reset slice_count on deallocation
 | 
			
		||||
- ffmpeg_opt: Fix -timestamp parsing
 | 
			
		||||
- hevc: make avcodec_decode_video2() fail if get_format() fails
 | 
			
		||||
- avcodec/mpeg4audio: add some padding/alignment to MAX_PCE_SIZE
 | 
			
		||||
- swr: fix alignment issue caused by 8ch sse functions
 | 
			
		||||
- libswscale/x86/hscale_fast_bilinear_simd.c: Include BX in the clobber list on x86_64, because it isn't implicitly included when PIC is on.
 | 
			
		||||
- aacdec: don't return frames without data
 | 
			
		||||
- avformat/matroskadec: Cleanup error handling for bz2 & zlib
 | 
			
		||||
- avformat/nutdec: Fix use of uinitialized value
 | 
			
		||||
- tools/graph2dot: use larger data types than int for array/string sizes
 | 
			
		||||
- id3v2: catch avio_read errors in check_tag
 | 
			
		||||
- aacsbr: break infinite loop in sbr_hf_calc_npatches
 | 
			
		||||
- diracdec: avoid overflow of bytes*8 in decode_lowdelay
 | 
			
		||||
- diracdec: prevent overflow in data_unit_size check
 | 
			
		||||
- avidec: avoid infinite loop due to negative ast->sample_size
 | 
			
		||||
- pngdec: don't use AV_PIX_FMT_MONOBLACK for apng
 | 
			
		||||
- avcodec/wavpack: Check L/R values before use to avoid harmless integer overflow and undefined behavior in fate
 | 
			
		||||
- xcbgrab: Validate the capture area
 | 
			
		||||
- xcbgrab: Do not assume the non shm image data is always available
 | 
			
		||||
- avfilter/lavfutils: disable frame threads when decoding a single image
 | 
			
		||||
- nutdec: fix illegal count check in decode_main_header
 | 
			
		||||
- ffmpeg: remove incorrect network deinit
 | 
			
		||||
- OpenCL: Avoid potential buffer overflow in cmdutils_opencl.c
 | 
			
		||||
- apedec: set s->samples only when init_frame_decoder succeeded
 | 
			
		||||
- swscale/ppc/swscale_altivec.c: POWER LE support in yuv2planeX_8() delete macro GET_VF()
 | 
			
		||||
- libvpxenc: only set noise reduction w/vp8
 | 
			
		||||
- tests/fate-run: do not attempt to parse tiny_psnrs output if it failed
 | 
			
		||||
- alac: reject rice_limit 0 if compression is used
 | 
			
		||||
- alsdec: only adapt order for positive max_order
 | 
			
		||||
- alsdec: check sample pointer range in revert_channel_correlation
 | 
			
		||||
- tests: drop bc dependency
 | 
			
		||||
- fate: Include branch information in the payload header
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 2.5.6
 | 
			
		||||
- avcodec/atrac3plusdsp: fix on stack alignment
 | 
			
		||||
- ac3: validate end in ff_ac3_bit_alloc_calc_mask
 | 
			
		||||
- aacpsy: avoid psy_band->threshold becoming NaN
 | 
			
		||||
- aasc: return correct buffer size from aasc_decode_frame
 | 
			
		||||
- msrledec: use signed pixel_ptr in msrle_decode_pal4
 | 
			
		||||
- swresample: Allow reinitialization without ever setting channel layouts (cherry picked from commit 80a28c7509a11114e1aea5b208d56c6646d69c07)
 | 
			
		||||
- swresample: Allow reinitialization without ever setting channel counts
 | 
			
		||||
- avcodec/h264: Do not fail with randomly truncated VUIs
 | 
			
		||||
- avcodec/h264_ps: Move truncation check from VUI to SPS
 | 
			
		||||
- avcodec/h264: Be more tolerant to changing pps id between slices
 | 
			
		||||
- avcodec/aacdec: Fix storing state before PCE decode
 | 
			
		||||
- avcodec/h264: reset the counts in the correct context
 | 
			
		||||
- avcodec/h264_slice: Do not reset mb_aff_frame per slice
 | 
			
		||||
- avcodec/h264: finish previous slices before switching to single thread mode
 | 
			
		||||
- avcodec/h264: Fix race between slices where one overwrites data from the next
 | 
			
		||||
- avcodec/h264_refs: Do not set reference to things which do not exist
 | 
			
		||||
- avcodec/h264: Fail for invalid mixed IDR / non IDR frames in slice threading mode
 | 
			
		||||
- h264: avoid unnecessary calls to get_format
 | 
			
		||||
- avcodec/msrledec: restructure msrle_decode_pal4() based on the line number instead of the pixel pointer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 2.5.5:
 | 
			
		||||
- vp9: make above buffer pointer 32-byte aligned.
 | 
			
		||||
- avcodec/dnxhddec: Check that the frame is interlaced before using cur_field
 | 
			
		||||
- avformat/mov: Disallow ".." in dref unless use_absolute_path is set
 | 
			
		||||
- avformat/mov: Check for string truncation in mov_open_dref()
 | 
			
		||||
- avformat/mov: Use sizeof(filename) instead of a literal number
 | 
			
		||||
- eac3dec: fix scaling
 | 
			
		||||
- ac3_fixed: fix computation of spx_noise_blend
 | 
			
		||||
- ac3_fixed: fix out-of-bound read
 | 
			
		||||
- ac3dec_fixed: always use the USE_FIXED=1 variant of the AC3DecodeContext
 | 
			
		||||
- avcodec/012v: redesign main loop
 | 
			
		||||
- avcodec/012v: Check dimensions more completely
 | 
			
		||||
- asfenc: fix leaking asf->index_ptr on error
 | 
			
		||||
- avcodec/options_table: remove extradata_size from the AVOptions table
 | 
			
		||||
- ffmdec: limit the backward seek to the last resync position
 | 
			
		||||
- ffmdec: make sure the time base is valid
 | 
			
		||||
- ffmdec: fix infinite loop at EOF
 | 
			
		||||
- ffmdec: initialize f_cprv, f_stvi and f_stau
 | 
			
		||||
- avformat/rm: limit packet size
 | 
			
		||||
- avcodec/webp: validate the distance prefix code
 | 
			
		||||
- avcodec/rv10: check size of s->mb_width * s->mb_height
 | 
			
		||||
- eamad: check for out of bounds read
 | 
			
		||||
- mdec: check for out of bounds read
 | 
			
		||||
- arm: Suppress tags about used cpu arch and extensions
 | 
			
		||||
- aic: Fix decoding files with odd dimensions
 | 
			
		||||
- avcodec/tiff: move bpp check to after "end:"
 | 
			
		||||
- mxfdec: Fix the error handling for when strftime fails
 | 
			
		||||
- avcodec/opusdec: Fix delayed sample value
 | 
			
		||||
- avcodec/opusdec: Clear out pointers per packet
 | 
			
		||||
- avcodec/utils: Align YUV411 by as much as the other YUV variants
 | 
			
		||||
- vp9: fix segmentation map retention with threading enabled.
 | 
			
		||||
- webp: ensure that each transform is only used once
 | 
			
		||||
- doc/protocols/tcp: fix units of listen_timeout option value, from microseconds to milliseconds
 | 
			
		||||
- fix VP9 packet decoder returning 0 instead of the used data size
 | 
			
		||||
- avformat/flvenc: check that the codec_tag fits in the available bits
 | 
			
		||||
- avcodec/utils: use correct printf specifier in ff_set_sar
 | 
			
		||||
- avutil/imgutils: correctly check for negative SAR components
 | 
			
		||||
- swscale/utils: clear formatConvBuffer on allocation
 | 
			
		||||
- avformat/bit: only accept the g729 codec and 1 channel
 | 
			
		||||
- avformat/bit: check that pkt->size is 10 in write_packet
 | 
			
		||||
- avformat/adxdec: check avctx->channels for invalid values
 | 
			
		||||
- avformat/adxdec: set avctx->channels in adx_read_header
 | 
			
		||||
- Fix buffer_size argument to init_put_bits() in multiple encoders.
 | 
			
		||||
- mips/acelp_filters: fix incorrect register constraint
 | 
			
		||||
- avcodec/hevc_ps: Sanity checks for some log2_* values
 | 
			
		||||
- avcodec/zmbv: Check len before reading in decode_frame()
 | 
			
		||||
- avcodec/h264: Only reinit quant tables if a new PPS is allowed
 | 
			
		||||
- avcodec/snowdec: Fix ref value check
 | 
			
		||||
- swscale/utils: More carefully merge and clear coefficients outside the input
 | 
			
		||||
- avcodec/a64multienc: Assert that the Packet size does not grow
 | 
			
		||||
- avcodec/a64multienc: simplify frame handling code
 | 
			
		||||
- avcodec/a64multienc: fix use of uninitialized values in to_meta_with_crop
 | 
			
		||||
- avcodec/a64multienc: initialize mc_meta_charset to zero
 | 
			
		||||
- avcodec/a64multienc: don't set incorrect packet size
 | 
			
		||||
- avcodec/a64multienc: use av_frame_ref instead of copying the frame
 | 
			
		||||
- avcodec/x86/mlpdsp_init: Simplify mlp_filter_channel_x86()
 | 
			
		||||
- h264: initialize H264Context.avctx in init_thread_copy
 | 
			
		||||
- wtvdec: fix integer overflow resulting in errors with large files
 | 
			
		||||
- avcodec/gif: fix off by one in column offsetting finding
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 2.5.4:
 | 
			
		||||
- avcodec/arm/videodsp_armv5te: Fix linking failure with shared libs
 | 
			
		||||
- avcodec/mjpegdec: Skip blocks which are outside the visible area
 | 
			
		||||
- avcodec/h264_slice: ignore SAR changes in slices after the first
 | 
			
		||||
- avcodec/h264_slice: Check picture structure before setting the related fields
 | 
			
		||||
- avcodec/h264_slice: Do not change frame_num after the first slice
 | 
			
		||||
- avutil/opt: Fix type used to access AV_OPT_TYPE_SAMPLE_FMT
 | 
			
		||||
- avutil/opt: Fix types used to access AV_OPT_TYPE_PIXEL_FMT
 | 
			
		||||
- avcodec/h264: Be more strict on rejecting pps/sps changes
 | 
			
		||||
- avcodec/h264: Be more strict on rejecting pps_id changes
 | 
			
		||||
- avcodec/h264_ps: More completely check the bit depths
 | 
			
		||||
- avformat/thp: Check av_get_packet() for failure not only for partial output
 | 
			
		||||
- swscale/utils: Limit filter shifting so as not to read from prior the array
 | 
			
		||||
- avcodec/mpegvideo_motion: Fix gmc chroma dimensions
 | 
			
		||||
- avcodec/mjpegdec: Check number of components for JPEG-LS
 | 
			
		||||
- avcodec/mjpegdec: Check escape sequence validity
 | 
			
		||||
- avformat/mpc8: Use uint64_t in *_get_v() to avoid undefined behavior
 | 
			
		||||
- avformat/mpc8: fix broken pointer math
 | 
			
		||||
- avformat/mpc8: fix hang with fuzzed file
 | 
			
		||||
- avformat/tta: fix crash with corrupted files
 | 
			
		||||
- avcodec/ppc/idctdsp.c: POWER LE support in idct_add_altivec()
 | 
			
		||||
- swscale/input: fix rgba64 alpha non native
 | 
			
		||||
- swscale/input: Fix alpha of YA16 input
 | 
			
		||||
- libavcodec/ppc/mpegvideoencdsp.c: fix stack smashing in pix_norm1_altivec() and pix_sum_altivec()
 | 
			
		||||
- avformat/rmdec: Check for overflow in ff_rm_read_mdpr_codecdata()
 | 
			
		||||
- avformat/mpeg: do not count PES packets inside PES packets during probing
 | 
			
		||||
- hevc: always clip luma_log2_weight_denom
 | 
			
		||||
- rtpdec_h263_rfc2190: Clear the stored bits if discarding buffered data
 | 
			
		||||
- aacenc: correctly check returned value
 | 
			
		||||
- swscale: check memory allocations
 | 
			
		||||
- opt: check memory allocation
 | 
			
		||||
- avformat/utils: check for malloc failure
 | 
			
		||||
- avcodec/flac_parser: fix handling EOF if no headers are found
 | 
			
		||||
- avfilter/vf_framepack: Check and update frame_rate
 | 
			
		||||
- vp8: improve memory allocation checks
 | 
			
		||||
- configure: enable vsx together with altivec for ppc64el
 | 
			
		||||
- avcodec/hevc: Fix handling of skipped_bytes() reallocation failures
 | 
			
		||||
- qpeg: avoid pointless invalid memcpy()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 2.5.3:
 | 
			
		||||
- vp9: fix parser return values in error case
 | 
			
		||||
- ffmpeg: Clear error message array at init.
 | 
			
		||||
- avcodec/dvdsubdec: fix accessing dangling pointers
 | 
			
		||||
- avcodec/dvdsubdec: error on bitmaps with size 0
 | 
			
		||||
- cmdutils: Use 64bit for file size/offset related variable in cmdutils_read_file()
 | 
			
		||||
- mov: Fix negative size calculation in mov_read_default().
 | 
			
		||||
- avformat/mov: fix integer overflow in mov_read_udta_string()
 | 
			
		||||
- mov: Fix overflow and error handling in read_tfra().
 | 
			
		||||
- mov: Avoid overflow with mov_metadata_raw()
 | 
			
		||||
- avcodec/dvdsubdec: fix out of bounds accesses
 | 
			
		||||
- avfilter/vf_sab: fix filtering tiny images
 | 
			
		||||
- avformat/flvdec: Increase string array size
 | 
			
		||||
- avformat/flvdec: do not inject dts=0 metadata packets which failed to be parsed into a new data stream
 | 
			
		||||
- avformat/cdxl: Fix integer overflow of image_size
 | 
			
		||||
- libavformat: Build hevc.o when building the RTP muxer
 | 
			
		||||
 | 
			
		||||
version 2.5.2:
 | 
			
		||||
- avcodec/indeo3: ensure offsets are non negative
 | 
			
		||||
- avcodec/h264: Check *log2_weight_denom
 | 
			
		||||
- avcodec/hevc_ps: Check diff_cu_qp_delta_depth
 | 
			
		||||
- avcodec/h264: Clear delayed_pic on deallocation
 | 
			
		||||
- avcodec/hevc: clear filter_slice_edges() on allocation
 | 
			
		||||
- avcodec/dcadec: Check that the added xch channel isnt already there
 | 
			
		||||
- avcodec/indeo3: use signed variables to avoid underflow
 | 
			
		||||
- swscale: increase yuv2rgb table headroom
 | 
			
		||||
- avformat/mov: fix integer overflow of size
 | 
			
		||||
- avformat/mov: check atom nesting depth
 | 
			
		||||
- avcodec/utvideodec: Fix handling of slice_height=0
 | 
			
		||||
- avcodec/xface: correct the XFACE_MAX_* values
 | 
			
		||||
- avcodec/vmdvideo: Check len before using it in method 3
 | 
			
		||||
- configure: create the tests directory like the doc directory
 | 
			
		||||
- mmvideo: check frame dimensions
 | 
			
		||||
- jvdec: check frame dimensions
 | 
			
		||||
 | 
			
		||||
version 2.5.1:
 | 
			
		||||
- lavu/frame: fix malloc error path in av_frame_copy_props()
 | 
			
		||||
- avformat/aviobuf: Check that avio_seek() target is non negative
 | 
			
		||||
- swresample/soxr_resample: fix error handling
 | 
			
		||||
- avformat/flvdec: fix potential use of uninitialized variables
 | 
			
		||||
- avformat/crypto: fix key vs iv typo
 | 
			
		||||
- configure: use use_pkg_config() instead of check_pkg_config() for libsmbclient
 | 
			
		||||
- avcodec/ppc/vp3dsp_altivec: POWER LE support to vp3_idct_add_altivec()
 | 
			
		||||
- avformat/matroskadec: fix handling of recursive SeekHead elements
 | 
			
		||||
- doc/examples/filtering_video: fix frame rate
 | 
			
		||||
- avcodec/mpegaudiodec_template: only allocate fdsp when its used
 | 
			
		||||
- doc/examples/transcoding: check encoder before using it
 | 
			
		||||
- update MAINTAINERS file
 | 
			
		||||
- POWER LE support in put_vp8_epel_h_altivec_core() put_vp8_epel_v_altivec_core() put_vp8_pixels16_altivec()
 | 
			
		||||
- POWER LE support in vc1_inv_trans_8x4_altivec()
 | 
			
		||||
 | 
			
		||||
version 2.5:
 | 
			
		||||
- HEVC/H.265 RTP payload format (draft v6) packetizer
 | 
			
		||||
- SUP/PGS subtitle demuxer
 | 
			
		||||
- ffprobe -show_pixel_formats option
 | 
			
		||||
- CAST128 symmetric block cipher, ECB mode
 | 
			
		||||
- STL subtitle demuxer and decoder
 | 
			
		||||
- libutvideo YUV 4:2:2 10bit support
 | 
			
		||||
- XCB-based screen-grabber
 | 
			
		||||
- UDP-Lite support (RFC 3828)
 | 
			
		||||
- xBR scaling filter
 | 
			
		||||
- AVFoundation screen capturing support
 | 
			
		||||
- ffserver supports codec private options
 | 
			
		||||
- creating DASH compatible fragmented MP4, MPEG-DASH segmenting muxer
 | 
			
		||||
- WebP muxer with animated WebP support
 | 
			
		||||
- zygoaudio decoding support
 | 
			
		||||
- APNG decoder and demuxer
 | 
			
		||||
- postproc visualization support
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 2.4:
 | 
			
		||||
- Icecast protocol
 | 
			
		||||
- ported lenscorrection filter from frei0r filter
 | 
			
		||||
- large optimizations in dctdnoiz to make it usable
 | 
			
		||||
- ICY metadata are now requested by default with the HTTP protocol
 | 
			
		||||
- support for using metadata in stream specifiers in fftools
 | 
			
		||||
- LZMA compression support in TIFF decoder
 | 
			
		||||
- support for H.261 RTP payload format (RFC 4587)
 | 
			
		||||
- HEVC/H.265 RTP payload format (draft v6) depacketizer
 | 
			
		||||
- added codecview filter to visualize information exported by some codecs
 | 
			
		||||
- Matroska 3D support thorugh side data
 | 
			
		||||
- HTML generation using texi2html is deprecated in favor of makeinfo/texi2any
 | 
			
		||||
- silenceremove filter
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 2.3:
 | 
			
		||||
- AC3 fixed-point decoding
 | 
			
		||||
- shuffleplanes filter
 | 
			
		||||
- subfile protocol
 | 
			
		||||
- Phantom Cine demuxer
 | 
			
		||||
- replaygain data export
 | 
			
		||||
- VP7 video decoder
 | 
			
		||||
- Alias PIX image encoder and decoder
 | 
			
		||||
- Improvements to the BRender PIX image decoder
 | 
			
		||||
- Improvements to the XBM decoder
 | 
			
		||||
- QTKit input device
 | 
			
		||||
- improvements to OpenEXR image decoder
 | 
			
		||||
- support decoding 16-bit RLE SGI images
 | 
			
		||||
- GDI screen grabbing for Windows
 | 
			
		||||
- alternative rendition support for HTTP Live Streaming
 | 
			
		||||
- AVFoundation input device
 | 
			
		||||
- Direct Stream Digital (DSD) decoder
 | 
			
		||||
- Magic Lantern Video (MLV) demuxer
 | 
			
		||||
- On2 AVC (Audio for Video) decoder
 | 
			
		||||
- support for decoding through DXVA2 in ffmpeg
 | 
			
		||||
- libbs2b-based stereo-to-binaural audio filter
 | 
			
		||||
- libx264 reference frames count limiting depending on level
 | 
			
		||||
- native Opus decoder
 | 
			
		||||
- display matrix export and rotation API
 | 
			
		||||
- WebVTT encoder
 | 
			
		||||
- showcqt multimedia filter
 | 
			
		||||
- zoompan filter
 | 
			
		||||
- signalstats filter
 | 
			
		||||
- hqx filter (hq2x, hq3x, hq4x)
 | 
			
		||||
- flanger filter
 | 
			
		||||
- Image format auto-detection
 | 
			
		||||
- LRC demuxer and muxer
 | 
			
		||||
- Samba protocol (via libsmbclient)
 | 
			
		||||
- WebM DASH Manifest muxer
 | 
			
		||||
- libfribidi support in drawtext
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 2.2:
 | 
			
		||||
 | 
			
		||||
- HNM version 4 demuxer and video decoder
 | 
			
		||||
@@ -544,7 +29,6 @@ version 2.2:
 | 
			
		||||
- libx265 encoder
 | 
			
		||||
- dejudder filter
 | 
			
		||||
- Autodetect VDA like all other hardware accelerations
 | 
			
		||||
- aliases and defaults for Ogg subtypes (opus, spx)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 2.1:
 | 
			
		||||
@@ -732,7 +216,7 @@ version 1.1:
 | 
			
		||||
- JSON captions for TED talks decoding support
 | 
			
		||||
- SOX Resampler support in libswresample
 | 
			
		||||
- aselect filter
 | 
			
		||||
- SGI RLE 8-bit / Silicon Graphics RLE 8-bit video decoder
 | 
			
		||||
- SGI RLE 8-bit decoder
 | 
			
		||||
- Silicon Graphics Motion Video Compressor 1 & 2 decoder
 | 
			
		||||
- Silicon Graphics Movie demuxer
 | 
			
		||||
- apad filter
 | 
			
		||||
@@ -776,9 +260,7 @@ version 1.0:
 | 
			
		||||
- RTMPE protocol support
 | 
			
		||||
- RTMPTE protocol support
 | 
			
		||||
- showwaves and showspectrum filter
 | 
			
		||||
- LucasArts SMUSH SANM playback support
 | 
			
		||||
- LucasArts SMUSH VIMA audio decoder (ADPCM)
 | 
			
		||||
- LucasArts SMUSH demuxer
 | 
			
		||||
- LucasArts SMUSH playback support
 | 
			
		||||
- SAMI, RealText and SubViewer demuxers and decoders
 | 
			
		||||
- Heart Of Darkness PAF playback support
 | 
			
		||||
- iec61883 device
 | 
			
		||||
@@ -902,7 +384,6 @@ version 0.10:
 | 
			
		||||
- ffwavesynth decoder
 | 
			
		||||
- aviocat tool
 | 
			
		||||
- ffeval tool
 | 
			
		||||
- support encoding and decoding 4-channel SGI images
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 0.9:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								INSTALL
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								INSTALL
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
 | 
			
		||||
1) Type './configure' to create the configuration. A list of configure
 | 
			
		||||
options is printed by running 'configure --help'.
 | 
			
		||||
 | 
			
		||||
'configure' can be launched from a directory different from the FFmpeg
 | 
			
		||||
sources to build the objects out of tree. To do this, use an absolute
 | 
			
		||||
path when launching 'configure', e.g. '/ffmpegdir/ffmpeg/configure'.
 | 
			
		||||
 | 
			
		||||
2) Then type 'make' to build FFmpeg. GNU Make 3.81 or later is required.
 | 
			
		||||
 | 
			
		||||
3) Type 'make install' to install all binaries and libraries you built.
 | 
			
		||||
 | 
			
		||||
NOTICE
 | 
			
		||||
 | 
			
		||||
 - Non system dependencies (e.g. libx264, libvpx) are disabled by default.
 | 
			
		||||
							
								
								
									
										17
									
								
								INSTALL.md
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								INSTALL.md
									
									
									
									
									
								
							@@ -1,17 +0,0 @@
 | 
			
		||||
#Installing FFmpeg:
 | 
			
		||||
 | 
			
		||||
1. Type `./configure` to create the configuration. A list of configure
 | 
			
		||||
options is printed by running `configure --help`.
 | 
			
		||||
 | 
			
		||||
    `configure` can be launched from a directory different from the FFmpeg
 | 
			
		||||
sources to build the objects out of tree. To do this, use an absolute
 | 
			
		||||
path when launching `configure`, e.g. `/ffmpegdir/ffmpeg/configure`.
 | 
			
		||||
 | 
			
		||||
2. Then type `make` to build FFmpeg. GNU Make 3.81 or later is required.
 | 
			
		||||
 | 
			
		||||
3. Type `make install` to install all binaries and libraries you built.
 | 
			
		||||
 | 
			
		||||
NOTICE
 | 
			
		||||
------
 | 
			
		||||
 | 
			
		||||
 - Non system dependencies (e.g. libx264, libvpx) are disabled by default.
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#FFmpeg:
 | 
			
		||||
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
 | 
			
		||||
@@ -10,12 +10,11 @@ version 2 or later (GPL v2+). See the file COPYING.GPLv2 for details. None of
 | 
			
		||||
these parts are used by default, you have to explicitly pass --enable-gpl to
 | 
			
		||||
configure to activate them. In this case, FFmpeg's license changes to GPL v2+.
 | 
			
		||||
 | 
			
		||||
Specifically, the GPL parts of FFmpeg are:
 | 
			
		||||
Specifically, the GPL parts of FFmpeg are
 | 
			
		||||
 | 
			
		||||
- libpostproc
 | 
			
		||||
- libmpcodecs
 | 
			
		||||
- optional x86 optimizations in the files
 | 
			
		||||
  libavcodec/x86/flac_dsp_gpl.asm
 | 
			
		||||
  libavcodec/x86/idct_mmx.c
 | 
			
		||||
- libutvideo encoding/decoding wrappers in
 | 
			
		||||
  libavcodec/libutvideo*.cpp
 | 
			
		||||
@@ -34,7 +33,6 @@ Specifically, the GPL parts of FFmpeg are:
 | 
			
		||||
    - vf_geq.c
 | 
			
		||||
    - vf_histeq.c
 | 
			
		||||
    - vf_hqdn3d.c
 | 
			
		||||
    - vf_interlace.c
 | 
			
		||||
    - vf_kerndeint.c
 | 
			
		||||
    - vf_mcdeint.c
 | 
			
		||||
    - vf_mp.c
 | 
			
		||||
@@ -64,7 +62,6 @@ There are a handful of files under other licensing terms, namely:
 | 
			
		||||
  documentation accompanying your program if you only distribute executables.
 | 
			
		||||
  You must also indicate any changes including additions and deletions to
 | 
			
		||||
  those three files in the documentation.
 | 
			
		||||
  tests/reference.pnm is under the expat license
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
external libraries
 | 
			
		||||
							
								
								
									
										64
									
								
								MAINTAINERS
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								MAINTAINERS
									
									
									
									
									
								
							@@ -14,6 +14,7 @@ patches and related discussions.
 | 
			
		||||
Project Leader
 | 
			
		||||
==============
 | 
			
		||||
 | 
			
		||||
Michael Niedermayer
 | 
			
		||||
  final design decisions
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -43,8 +44,8 @@ Miscellaneous Areas
 | 
			
		||||
===================
 | 
			
		||||
 | 
			
		||||
documentation                           Stefano Sabatini, Mike Melanson, Timothy Gu
 | 
			
		||||
build system (configure, makefiles)     Diego Biurrun, Mans Rullgard
 | 
			
		||||
project server                          Árpád Gereöffy, Michael Niedermayer, Reimar Doeffinger, Alexander Strasser
 | 
			
		||||
build system (configure,Makefiles)      Diego Biurrun, Mans Rullgard
 | 
			
		||||
project server                          Árpád Gereöffy, Michael Niedermayer, Reimar Döffinger, Alexander Strasser
 | 
			
		||||
presets                                 Robert Swain
 | 
			
		||||
metadata subsystem                      Aurelien Jacobs
 | 
			
		||||
release management                      Michael Niedermayer
 | 
			
		||||
@@ -53,9 +54,7 @@ release management                      Michael Niedermayer
 | 
			
		||||
Communication
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
website                                 Deby Barbara Lepage
 | 
			
		||||
fate.ffmpeg.org                         Timothy Gu
 | 
			
		||||
Trac bug tracker                        Alexander Strasser, Michael Niedermayer, Carl Eugen Hoyos, Lou Logan
 | 
			
		||||
website                                 Robert Swain, Lou Logan
 | 
			
		||||
mailinglists                            Michael Niedermayer, Baptiste Coudurier, Lou Logan
 | 
			
		||||
Google+                                 Paul B Mahol, Michael Niedermayer, Alexander Strasser
 | 
			
		||||
Twitter                                 Lou Logan
 | 
			
		||||
@@ -74,7 +73,6 @@ Other:
 | 
			
		||||
  bprint                                Nicolas George
 | 
			
		||||
  bswap.h
 | 
			
		||||
  des                                   Reimar Doeffinger
 | 
			
		||||
  dynarray.h                            Nicolas George
 | 
			
		||||
  eval.c, eval.h                        Michael Niedermayer
 | 
			
		||||
  float_dsp                             Loren Merritt
 | 
			
		||||
  hash                                  Reimar Doeffinger
 | 
			
		||||
@@ -131,7 +129,6 @@ Generic Parts:
 | 
			
		||||
    tableprint.c, tableprint.h          Reimar Doeffinger
 | 
			
		||||
  fixed point FFT:
 | 
			
		||||
    fft*                                Zeljko Lukac
 | 
			
		||||
  Text Subtitles                        Clément Bœsch
 | 
			
		||||
 | 
			
		||||
Codecs:
 | 
			
		||||
  4xm.c                                 Michael Niedermayer
 | 
			
		||||
@@ -165,13 +162,11 @@ Codecs:
 | 
			
		||||
  dnxhd*                                Baptiste Coudurier
 | 
			
		||||
  dpcm.c                                Mike Melanson
 | 
			
		||||
  dv.c                                  Roman Shaposhnik
 | 
			
		||||
  dvbsubdec.c                           Anshul Maheshwari
 | 
			
		||||
  dxa.c                                 Kostya Shishkov
 | 
			
		||||
  eacmv*, eaidct*, eat*                 Peter Ross
 | 
			
		||||
  exif.c, exif.h                        Thilo Borgmann
 | 
			
		||||
  ffv1*                                 Michael Niedermayer
 | 
			
		||||
  ffv1.c                                Michael Niedermayer
 | 
			
		||||
  ffwavesynth.c                         Nicolas George
 | 
			
		||||
  fic.c                                 Derek Buitenhuis
 | 
			
		||||
  flac*                                 Justin Ruggles
 | 
			
		||||
  flashsv*                              Benjamin Larsson
 | 
			
		||||
  flicvideo.c                           Mike Melanson
 | 
			
		||||
@@ -181,7 +176,7 @@ Codecs:
 | 
			
		||||
  h261*                                 Michael Niedermayer
 | 
			
		||||
  h263*                                 Michael Niedermayer
 | 
			
		||||
  h264*                                 Loren Merritt, Michael Niedermayer
 | 
			
		||||
  huffyuv*                              Michael Niedermayer, Christophe Gisquet
 | 
			
		||||
  huffyuv.c                             Michael Niedermayer
 | 
			
		||||
  idcinvideo.c                          Mike Melanson
 | 
			
		||||
  imc*                                  Benjamin Larsson
 | 
			
		||||
  indeo2*                               Kostya Shishkov
 | 
			
		||||
@@ -241,12 +236,12 @@ Codecs:
 | 
			
		||||
  rtjpeg.c, rtjpeg.h                    Reimar Doeffinger
 | 
			
		||||
  rv10.c                                Michael Niedermayer
 | 
			
		||||
  rv3*                                  Kostya Shishkov
 | 
			
		||||
  rv4*                                  Kostya Shishkov, Christophe Gisquet
 | 
			
		||||
  rv4*                                  Kostya Shishkov
 | 
			
		||||
  s3tc*                                 Ivo van Poorten
 | 
			
		||||
  smacker.c                             Kostya Shishkov
 | 
			
		||||
  smc.c                                 Mike Melanson
 | 
			
		||||
  smvjpegdec.c                          Ash Hughes
 | 
			
		||||
  snow*                                 Michael Niedermayer, Loren Merritt
 | 
			
		||||
  snow.c                                Michael Niedermayer, Loren Merritt
 | 
			
		||||
  sonic.c                               Alex Beregszaszi
 | 
			
		||||
  srt*                                  Aurelien Jacobs
 | 
			
		||||
  sunrast.c                             Ivo van Poorten
 | 
			
		||||
@@ -265,13 +260,13 @@ Codecs:
 | 
			
		||||
  v410*.c                               Derek Buitenhuis
 | 
			
		||||
  vb.c                                  Kostya Shishkov
 | 
			
		||||
  vble.c                                Derek Buitenhuis
 | 
			
		||||
  vc1*                                  Kostya Shishkov, Christophe Gisquet
 | 
			
		||||
  vc1*                                  Kostya Shishkov
 | 
			
		||||
  vcr1.c                                Michael Niedermayer
 | 
			
		||||
  vda_h264_dec.c                        Xidorn Quan
 | 
			
		||||
  vima.c                                Paul B Mahol
 | 
			
		||||
  vmnc.c                                Kostya Shishkov
 | 
			
		||||
  vorbisdec.c                           Denes Balatoni, David Conrad
 | 
			
		||||
  vorbisenc.c                           Oded Shimon
 | 
			
		||||
  vorbis_dec.c                          Denes Balatoni, David Conrad
 | 
			
		||||
  vorbis_enc.c                          Oded Shimon
 | 
			
		||||
  vp3*                                  Mike Melanson
 | 
			
		||||
  vp5                                   Aurelien Jacobs
 | 
			
		||||
  vp6                                   Aurelien Jacobs
 | 
			
		||||
@@ -307,21 +302,16 @@ libavdevice
 | 
			
		||||
    libavdevice/avdevice.h
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  avfoundation.m                        Thilo Borgmann
 | 
			
		||||
  decklink*                             Deti Fliegl
 | 
			
		||||
  dshow.c                               Roger Pack (CC rogerdpack@gmail.com)
 | 
			
		||||
  dshow.c                               Roger Pack
 | 
			
		||||
  fbdev_enc.c                           Lukasz Marek
 | 
			
		||||
  gdigrab.c                             Roger Pack (CC rogerdpack@gmail.com)
 | 
			
		||||
  iec61883.c                            Georg Lippitsch
 | 
			
		||||
  lavfi                                 Stefano Sabatini
 | 
			
		||||
  libdc1394.c                           Roman Shaposhnik
 | 
			
		||||
  opengl_enc.c                          Lukasz Marek
 | 
			
		||||
  pulse_audio_enc.c                     Lukasz Marek
 | 
			
		||||
  qtkit.m                               Thilo Borgmann
 | 
			
		||||
  sdl                                   Stefano Sabatini
 | 
			
		||||
  v4l2.c                                Giorgio Vazzana
 | 
			
		||||
  v4l2.c                                Luca Abeni
 | 
			
		||||
  vfwcap.c                              Ramiro Polla
 | 
			
		||||
  xv.c                                  Lukasz Marek
 | 
			
		||||
 | 
			
		||||
libavfilter
 | 
			
		||||
===========
 | 
			
		||||
@@ -343,9 +333,7 @@ Filters:
 | 
			
		||||
  af_compand.c                          Paul B Mahol
 | 
			
		||||
  af_ladspa.c                           Paul B Mahol
 | 
			
		||||
  af_pan.c                              Nicolas George
 | 
			
		||||
  af_silenceremove.c                    Paul B Mahol
 | 
			
		||||
  avf_avectorscope.c                    Paul B Mahol
 | 
			
		||||
  avf_showcqt.c                         Muhammad Faiz
 | 
			
		||||
  vf_blend.c                            Paul B Mahol
 | 
			
		||||
  vf_colorbalance.c                     Paul B Mahol
 | 
			
		||||
  vf_dejudder.c                         Nicholas Robbins
 | 
			
		||||
@@ -353,10 +341,7 @@ Filters:
 | 
			
		||||
  vf_drawbox.c/drawgrid                 Andrey Utkin
 | 
			
		||||
  vf_extractplanes.c                    Paul B Mahol
 | 
			
		||||
  vf_histogram.c                        Paul B Mahol
 | 
			
		||||
  vf_hqx.c                              Clément Bœsch
 | 
			
		||||
  vf_idet.c                             Pascal Massimino
 | 
			
		||||
  vf_il.c                               Paul B Mahol
 | 
			
		||||
  vf_lenscorrection.c                   Daniel Oberhoff
 | 
			
		||||
  vf_mergeplanes.c                      Paul B Mahol
 | 
			
		||||
  vf_psnr.c                             Paul B Mahol
 | 
			
		||||
  vf_scale.c                            Michael Niedermayer
 | 
			
		||||
@@ -385,7 +370,6 @@ Muxers/Demuxers:
 | 
			
		||||
  aiffdec.c                             Baptiste Coudurier, Matthieu Bouron
 | 
			
		||||
  aiffenc.c                             Baptiste Coudurier, Matthieu Bouron
 | 
			
		||||
  ape.c                                 Kostya Shishkov
 | 
			
		||||
  apngdec.c                             Benoit Fouet
 | 
			
		||||
  ass*                                  Aurelien Jacobs
 | 
			
		||||
  astdec.c                              Paul B Mahol
 | 
			
		||||
  astenc.c                              James Almer
 | 
			
		||||
@@ -427,7 +411,6 @@ Muxers/Demuxers:
 | 
			
		||||
  matroska.c                            Aurelien Jacobs
 | 
			
		||||
  matroskadec.c                         Aurelien Jacobs
 | 
			
		||||
  matroskaenc.c                         David Conrad
 | 
			
		||||
  matroska subtitles (matroskaenc.c)    John Peebles
 | 
			
		||||
  metadata*                             Aurelien Jacobs
 | 
			
		||||
  mgsts.c                               Paul B Mahol
 | 
			
		||||
  microdvd*                             Aurelien Jacobs
 | 
			
		||||
@@ -437,15 +420,14 @@ Muxers/Demuxers:
 | 
			
		||||
  mpc.c                                 Kostya Shishkov
 | 
			
		||||
  mpeg.c                                Michael Niedermayer
 | 
			
		||||
  mpegenc.c                             Michael Niedermayer
 | 
			
		||||
  mpegts.c                              Marton Balint
 | 
			
		||||
  mpegtsenc.c                           Baptiste Coudurier
 | 
			
		||||
  mpegts*                               Baptiste Coudurier
 | 
			
		||||
  msnwc_tcp.c                           Ramiro Polla
 | 
			
		||||
  mtv.c                                 Reynaldo H. Verdejo Pinochet
 | 
			
		||||
  mxf*                                  Baptiste Coudurier
 | 
			
		||||
  mxfdec.c                              Tomas Härdin
 | 
			
		||||
  nistspheredec.c                       Paul B Mahol
 | 
			
		||||
  nsvdec.c                              Francois Revol
 | 
			
		||||
  nut*                                  Michael Niedermayer
 | 
			
		||||
  nut.c                                 Michael Niedermayer
 | 
			
		||||
  nuv.c                                 Reimar Doeffinger
 | 
			
		||||
  oggdec.c, oggdec.h                    David Conrad
 | 
			
		||||
  oggenc.c                              Baptiste Coudurier
 | 
			
		||||
@@ -462,15 +444,12 @@ Muxers/Demuxers:
 | 
			
		||||
  rmdec.c, rmenc.c                      Ronald S. Bultje, Kostya Shishkov
 | 
			
		||||
  rtmp*                                 Kostya Shishkov
 | 
			
		||||
  rtp.c, rtpenc.c                       Martin Storsjo
 | 
			
		||||
  rtpdec_h261.*, rtpenc_h261.*          Thomas Volkert
 | 
			
		||||
  rtpdec_hevc.*, rtpenc_hevc.*          Thomas Volkert
 | 
			
		||||
  rtpdec_asf.*                          Ronald S. Bultje
 | 
			
		||||
  rtpenc_mpv.*, rtpenc_aac.*            Martin Storsjo
 | 
			
		||||
  rtsp.c                                Luca Barbato
 | 
			
		||||
  sbgdec.c                              Nicolas George
 | 
			
		||||
  sdp.c                                 Martin Storsjo
 | 
			
		||||
  segafilm.c                            Mike Melanson
 | 
			
		||||
  segment.c                             Stefano Sabatini
 | 
			
		||||
  siff.c                                Kostya Shishkov
 | 
			
		||||
  smacker.c                             Kostya Shishkov
 | 
			
		||||
  smjpeg*                               Paul B Mahol
 | 
			
		||||
@@ -483,7 +462,6 @@ Muxers/Demuxers:
 | 
			
		||||
  voc.c                                 Aurelien Jacobs
 | 
			
		||||
  wav.c                                 Michael Niedermayer
 | 
			
		||||
  wc3movie.c                            Mike Melanson
 | 
			
		||||
  webm dash (matroskaenc.c)             Vignesh Venkatasubramanian
 | 
			
		||||
  webvtt*                               Matthew J Heaney
 | 
			
		||||
  westwood.c                            Mike Melanson
 | 
			
		||||
  wtv.c                                 Peter Ross
 | 
			
		||||
@@ -497,7 +475,6 @@ Protocols:
 | 
			
		||||
  libssh.c                              Lukasz Marek
 | 
			
		||||
  mms*.c                                Ronald S. Bultje
 | 
			
		||||
  udp.c                                 Luca Abeni
 | 
			
		||||
  icecast.c                             Marvin Scholz
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
libswresample
 | 
			
		||||
@@ -526,8 +503,6 @@ Amiga / PowerPC                         Colin Ward
 | 
			
		||||
Linux / PowerPC                         Luca Barbato
 | 
			
		||||
Windows MinGW                           Alex Beregszaszi, Ramiro Polla
 | 
			
		||||
Windows Cygwin                          Victor Paesa
 | 
			
		||||
Windows MSVC                            Matthew Oliver
 | 
			
		||||
Windows ICL                             Matthew Oliver
 | 
			
		||||
ADI/Blackfin DSP                        Marc Hoffman
 | 
			
		||||
Sparc                                   Roman Shaposhnik
 | 
			
		||||
x86                                     Michael Niedermayer
 | 
			
		||||
@@ -536,9 +511,8 @@ x86                                     Michael Niedermayer
 | 
			
		||||
Releases
 | 
			
		||||
========
 | 
			
		||||
 | 
			
		||||
2.5                                     Michael Niedermayer
 | 
			
		||||
2.4                                     Michael Niedermayer
 | 
			
		||||
2.2                                     Michael Niedermayer
 | 
			
		||||
2.1                                     Michael Niedermayer
 | 
			
		||||
1.2                                     Michael Niedermayer
 | 
			
		||||
 | 
			
		||||
If you want to maintain an older release, please contact us
 | 
			
		||||
@@ -555,7 +529,7 @@ 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
 | 
			
		||||
Clément Bœsch                 52D0 3A82 D445 F194 DB8B 2B16 87EE 2CB8 F4B8 FCF9
 | 
			
		||||
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
 | 
			
		||||
@@ -570,14 +544,12 @@ Michael Niedermayer           9FF2 128B 147E F673 0BAD F133 611E C787 040B 0FAB
 | 
			
		||||
Nicolas George                24CE 01CE 9ACC 5CEB 74D8 8D9D B063 D997 36E5 4C93
 | 
			
		||||
Panagiotis Issaris            6571 13A3 33D9 3726 F728 AA98 F643 B12E ECF3 E029
 | 
			
		||||
Peter Ross                    A907 E02F A6E5 0CD2 34CD 20D2 6760 79C5 AC40 DD6B
 | 
			
		||||
Reimar Doeffinger             C61D 16E5 9E2C D10C 8958 38A4 0899 A2B9 06D4 D9C7
 | 
			
		||||
Reimar Döffinger              C61D 16E5 9E2C D10C 8958 38A4 0899 A2B9 06D4 D9C7
 | 
			
		||||
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
 | 
			
		||||
Tiancheng "Timothy" Gu        9456 AFC0 814A 8139 E994 8351 7FE6 B095 B582 B0D4
 | 
			
		||||
Tim Nicholson                 38CF DB09 3ED0 F607 8B67 6CED 0C0B FC44 8B0B FC83
 | 
			
		||||
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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								Makefile
									
									
									
									
									
								
							@@ -4,7 +4,6 @@ include config.mak
 | 
			
		||||
vpath %.c    $(SRC_PATH)
 | 
			
		||||
vpath %.cpp  $(SRC_PATH)
 | 
			
		||||
vpath %.h    $(SRC_PATH)
 | 
			
		||||
vpath %.m    $(SRC_PATH)
 | 
			
		||||
vpath %.S    $(SRC_PATH)
 | 
			
		||||
vpath %.asm  $(SRC_PATH)
 | 
			
		||||
vpath %.rc   $(SRC_PATH)
 | 
			
		||||
@@ -30,21 +29,16 @@ $(foreach prog,$(AVBASENAMES),$(eval OBJS-$(prog)-$(CONFIG_OPENCL) += cmdutils_o
 | 
			
		||||
 | 
			
		||||
OBJS-ffmpeg                   += ffmpeg_opt.o ffmpeg_filter.o
 | 
			
		||||
OBJS-ffmpeg-$(HAVE_VDPAU_X11) += ffmpeg_vdpau.o
 | 
			
		||||
OBJS-ffmpeg-$(HAVE_DXVA2_LIB) += ffmpeg_dxva2.o
 | 
			
		||||
OBJS-ffmpeg-$(CONFIG_VDA)     += ffmpeg_vda.o
 | 
			
		||||
OBJS-ffserver                 += ffserver_config.o
 | 
			
		||||
 | 
			
		||||
TESTTOOLS   = audiogen videogen rotozoom tiny_psnr tiny_ssim base64
 | 
			
		||||
HOSTPROGS  := $(TESTTOOLS:%=tests/%) doc/print_options
 | 
			
		||||
TOOLS       = qt-faststart trasher uncoded_frame
 | 
			
		||||
TOOLS-$(CONFIG_ZLIB) += cws2fws
 | 
			
		||||
 | 
			
		||||
# $(FFLIBS-yes) needs to be in linking order
 | 
			
		||||
FFLIBS-$(CONFIG_AVDEVICE) += avdevice
 | 
			
		||||
FFLIBS-$(CONFIG_AVFILTER) += avfilter
 | 
			
		||||
FFLIBS-$(CONFIG_AVFORMAT) += avformat
 | 
			
		||||
FFLIBS-$(CONFIG_AVCODEC)    += avcodec
 | 
			
		||||
FFLIBS-$(CONFIG_AVRESAMPLE) += avresample
 | 
			
		||||
FFLIBS-$(CONFIG_AVCODEC)  += avcodec
 | 
			
		||||
FFLIBS-$(CONFIG_POSTPROC) += postproc
 | 
			
		||||
FFLIBS-$(CONFIG_SWRESAMPLE)+= swresample
 | 
			
		||||
FFLIBS-$(CONFIG_SWSCALE)  += swscale
 | 
			
		||||
@@ -64,7 +58,7 @@ FF_DEP_LIBS  := $(DEP_LIBS)
 | 
			
		||||
all: $(AVPROGS)
 | 
			
		||||
 | 
			
		||||
$(TOOLS): %$(EXESUF): %.o $(EXEOBJS)
 | 
			
		||||
	$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS)
 | 
			
		||||
	$(LD) $(LDFLAGS) $(LD_O) $^ $(ELIBS)
 | 
			
		||||
 | 
			
		||||
tools/cws2fws$(EXESUF): ELIBS = $(ZLIB)
 | 
			
		||||
tools/uncoded_frame$(EXESUF): $(FF_DEP_LIBS)
 | 
			
		||||
@@ -78,8 +72,9 @@ config.h: .config
 | 
			
		||||
 | 
			
		||||
SUBDIR_VARS := CLEANFILES EXAMPLES FFLIBS HOSTPROGS TESTPROGS TOOLS      \
 | 
			
		||||
               HEADERS ARCH_HEADERS BUILT_HEADERS SKIPHEADERS            \
 | 
			
		||||
               ARMV5TE-OBJS ARMV6-OBJS ARMV8-OBJS VFP-OBJS NEON-OBJS     \
 | 
			
		||||
               ALTIVEC-OBJS MMX-OBJS YASM-OBJS                           \
 | 
			
		||||
               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 SLIBOBJS HOSTOBJS TESTOBJS
 | 
			
		||||
 | 
			
		||||
@@ -93,7 +88,6 @@ $(foreach V,$(SUBDIR_VARS),$(eval $(call RESET,$(V))))
 | 
			
		||||
SUBDIR := $(1)/
 | 
			
		||||
include $(SRC_PATH)/$(1)/Makefile
 | 
			
		||||
-include $(SRC_PATH)/$(1)/$(ARCH)/Makefile
 | 
			
		||||
-include $(SRC_PATH)/$(1)/$(INTRINSICS)/Makefile
 | 
			
		||||
include $(SRC_PATH)/library.mak
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
@@ -112,14 +106,14 @@ endef
 | 
			
		||||
 | 
			
		||||
$(foreach P,$(PROGS),$(eval $(call DOPROG,$(P:$(PROGSSUF)$(EXESUF)=))))
 | 
			
		||||
 | 
			
		||||
ffprobe.o cmdutils.o libavcodec/utils.o libavformat/utils.o libavdevice/avdevice.o libavfilter/avfilter.o libavutil/utils.o libpostproc/postprocess.o libswresample/swresample.o libswscale/utils.o : libavutil/ffversion.h
 | 
			
		||||
ffprobe.o cmdutils.o : libavutil/ffversion.h
 | 
			
		||||
 | 
			
		||||
$(PROGS): %$(PROGSSUF)$(EXESUF): %$(PROGSSUF)_g$(EXESUF)
 | 
			
		||||
	$(CP) $< $@
 | 
			
		||||
	$(STRIP) $@
 | 
			
		||||
 | 
			
		||||
%$(PROGSSUF)_g$(EXESUF): %.o $(FF_DEP_LIBS)
 | 
			
		||||
	$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $(OBJS-$*) $(FF_EXTRALIBS)
 | 
			
		||||
	$(LD) $(LDFLAGS) $(LD_O) $(OBJS-$*) $(FF_EXTRALIBS)
 | 
			
		||||
 | 
			
		||||
OBJDIRS += tools
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								README
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
FFmpeg README
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
1) Documentation
 | 
			
		||||
----------------
 | 
			
		||||
 | 
			
		||||
* Read the documentation in the doc/ directory in git.
 | 
			
		||||
  You can also view it online at http://ffmpeg.org/documentation.html
 | 
			
		||||
 | 
			
		||||
2) Licensing
 | 
			
		||||
------------
 | 
			
		||||
 | 
			
		||||
* See the LICENSE file.
 | 
			
		||||
 | 
			
		||||
3) Build and Install
 | 
			
		||||
--------------------
 | 
			
		||||
 | 
			
		||||
* See the INSTALL file.
 | 
			
		||||
							
								
								
									
										40
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								README.md
									
									
									
									
									
								
							@@ -1,40 +0,0 @@
 | 
			
		||||
FFmpeg README
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
FFmpeg is a collection of libraries and tools to process multimedia content
 | 
			
		||||
such as audio, video, subtitles and related metadata.
 | 
			
		||||
 | 
			
		||||
## Libraries
 | 
			
		||||
 | 
			
		||||
* `libavcodec` provides implementation of a wider range of codecs.
 | 
			
		||||
* `libavformat` implements streaming protocols, container formats and basic I/O access.
 | 
			
		||||
* `libavutil` includes hashers, decompressors and miscellaneous utility functions.
 | 
			
		||||
* `libavfilter` provides a mean to alter decoded Audio and Video through chain of filters.
 | 
			
		||||
* `libavdevice` provides an abstraction to access capture and playback devices.
 | 
			
		||||
* `libswresample` implements audio mixing and resampling routines.
 | 
			
		||||
* `libswscale` implements color conversion and scaling routines.
 | 
			
		||||
 | 
			
		||||
## Tools
 | 
			
		||||
 | 
			
		||||
* [ffmpeg](http://ffmpeg.org/ffmpeg.html) is a command line toolbox to
 | 
			
		||||
  manipulate, convert and stream multimedia content.
 | 
			
		||||
* [ffplay](http://ffmpeg.org/ffplay.html) is a minimalistic multimedia player.
 | 
			
		||||
* [ffprobe](http://ffmpeg.org/ffprobe.html) is a simple analisys tool to inspect
 | 
			
		||||
  multimedia content.
 | 
			
		||||
* Additional small tools such as `aviocat`, `ismindex` and `qt-faststart`.
 | 
			
		||||
 | 
			
		||||
## Documentation
 | 
			
		||||
 | 
			
		||||
The offline documentation is available in the **doc/** directory.
 | 
			
		||||
 | 
			
		||||
The online documentation is available in the main [website](http://ffmpeg.org)
 | 
			
		||||
and in the [wiki](http://trac.ffmpeg.org).
 | 
			
		||||
 | 
			
		||||
### Examples
 | 
			
		||||
 | 
			
		||||
Coding examples are available in the **doc/examples** directory.
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
 | 
			
		||||
FFmpeg codebase is mainly LGPL-licensed with optional components licensed under
 | 
			
		||||
GPL. Please refer to the LICENSE file for detailed information.
 | 
			
		||||
							
								
								
									
										101
									
								
								RELEASE_NOTES
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								RELEASE_NOTES
									
									
									
									
									
								
							@@ -1,101 +0,0 @@
 | 
			
		||||
 ┌────────────────────────────────────────┐
 | 
			
		||||
 │ RELEASE NOTES for FFmpeg 2.5 "Bohr"    │
 | 
			
		||||
 └────────────────────────────────────────┘
 | 
			
		||||
 | 
			
		||||
   The FFmpeg Project proudly presents FFmpeg 2.5 "Bohr", 2.5 months after the
 | 
			
		||||
   release of 2.4.
 | 
			
		||||
 | 
			
		||||
   The most important new features are AVFoundation screen-grabbing support,
 | 
			
		||||
   animated WebP decoding support, and Animated PNG support. In addition, many
 | 
			
		||||
   exciting features for video streaming are also implemented, including MPEG-
 | 
			
		||||
   DASH fragmenting muxer, HEVC RTP payload muxer, and UDP Lite support.
 | 
			
		||||
 | 
			
		||||
   As usual, if you have any question on this release or any FFmpeg related
 | 
			
		||||
   topic, feel free to join us on the #ffmpeg IRC channel (on
 | 
			
		||||
   irc.freenode.net).
 | 
			
		||||
 | 
			
		||||
   ┌────────────────────────────┐
 | 
			
		||||
   │ 🔨  API Information         │
 | 
			
		||||
   └────────────────────────────┘
 | 
			
		||||
 | 
			
		||||
     FFmpeg 2.5 includes the following library versions:
 | 
			
		||||
 | 
			
		||||
       • libavutil      54.15.100
 | 
			
		||||
       • libavcodec     56.13.100
 | 
			
		||||
       • libavformat    56.15.102
 | 
			
		||||
       • libavdevice    56. 3.100
 | 
			
		||||
       • libavfilter     5. 2.103
 | 
			
		||||
       • libswscale      3. 1.101
 | 
			
		||||
       • libswresample   1. 1.100
 | 
			
		||||
       • libpostproc    53. 3.100
 | 
			
		||||
 | 
			
		||||
     Important API changes since 2.4:
 | 
			
		||||
 | 
			
		||||
       • avpriv_dv_frame_profile2() has been deprecated
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
     Please refer to the doc/APIchanges file for more information.
 | 
			
		||||
 | 
			
		||||
 ┌────────────────────────────┐
 | 
			
		||||
 │ ★  List of New Features    │
 | 
			
		||||
 └────────────────────────────┘
 | 
			
		||||
 | 
			
		||||
   ┌────────────────────────────┐
 | 
			
		||||
   │ ffprobe                    │
 | 
			
		||||
   └────────────────────────────┘
 | 
			
		||||
 | 
			
		||||
    • -show_pixel_formats option
 | 
			
		||||
 | 
			
		||||
   ┌────────────────────────────┐
 | 
			
		||||
   │ ffserver                   │
 | 
			
		||||
   └────────────────────────────┘
 | 
			
		||||
 | 
			
		||||
    • codec private options support
 | 
			
		||||
 | 
			
		||||
   ┌────────────────────────────┐
 | 
			
		||||
   │ libavcodec                 │
 | 
			
		||||
   └────────────────────────────┘
 | 
			
		||||
 | 
			
		||||
    • STL subtitle decoder
 | 
			
		||||
    • libutvideo YUV 4:2:2 10bit support
 | 
			
		||||
    • animated WebP decoding support
 | 
			
		||||
    • zygoaudio decoding support
 | 
			
		||||
    • APNG decoder
 | 
			
		||||
 | 
			
		||||
   ┌────────────────────────────┐
 | 
			
		||||
   │ libavdevice                │
 | 
			
		||||
   └────────────────────────────┘
 | 
			
		||||
 | 
			
		||||
    • XCB-based screen-grabber
 | 
			
		||||
    • AVFoundation screen capturing support
 | 
			
		||||
 | 
			
		||||
   ┌────────────────────────────┐
 | 
			
		||||
   │ libavformat                │
 | 
			
		||||
   └────────────────────────────┘
 | 
			
		||||
 | 
			
		||||
    • HEVC/H.265 RTP payload format (draft v6) packetizer
 | 
			
		||||
    • SUP/PGS subtitle demuxer
 | 
			
		||||
    • STL subtitle demuxer
 | 
			
		||||
    • UDP-Lite support (RFC 3828)
 | 
			
		||||
    • MPEG-DASH segmenting muxer, which allows creating DASH compatible
 | 
			
		||||
      fragmented MP4
 | 
			
		||||
    • WebP muxer
 | 
			
		||||
    • APNG demuxer
 | 
			
		||||
 | 
			
		||||
   ┌────────────────────────────┐
 | 
			
		||||
   │ libavfilter                │
 | 
			
		||||
   └────────────────────────────┘
 | 
			
		||||
 | 
			
		||||
    • xBR scaling filter
 | 
			
		||||
 | 
			
		||||
   ┌────────────────────────────┐
 | 
			
		||||
   │ libavutil                  │
 | 
			
		||||
   └────────────────────────────┘
 | 
			
		||||
 | 
			
		||||
    • CAST128 symmetric block cipher, ECB mode
 | 
			
		||||
 | 
			
		||||
   ┌────────────────────────────┐
 | 
			
		||||
   │ libpostproc                │
 | 
			
		||||
   └────────────────────────────┘
 | 
			
		||||
 | 
			
		||||
    • visualization support
 | 
			
		||||
							
								
								
									
										3
									
								
								arch.mak
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								arch.mak
									
									
									
									
									
								
							@@ -1,6 +1,5 @@
 | 
			
		||||
OBJS-$(HAVE_ARMV5TE) += $(ARMV5TE-OBJS) $(ARMV5TE-OBJS-yes)
 | 
			
		||||
OBJS-$(HAVE_ARMV6)   += $(ARMV6-OBJS)   $(ARMV6-OBJS-yes)
 | 
			
		||||
OBJS-$(HAVE_ARMV8)   += $(ARMV8-OBJS)   $(ARMV8-OBJS-yes)
 | 
			
		||||
OBJS-$(HAVE_VFP)     += $(VFP-OBJS)     $(VFP-OBJS-yes)
 | 
			
		||||
OBJS-$(HAVE_NEON)    += $(NEON-OBJS)    $(NEON-OBJS-yes)
 | 
			
		||||
 | 
			
		||||
@@ -11,5 +10,7 @@ OBJS-$(HAVE_MIPSDSPR2) += $(MIPSDSPR2-OBJS)  $(MIPSDSPR2-OBJS-yes)
 | 
			
		||||
 | 
			
		||||
OBJS-$(HAVE_ALTIVEC) += $(ALTIVEC-OBJS) $(ALTIVEC-OBJS-yes)
 | 
			
		||||
 | 
			
		||||
OBJS-$(HAVE_VIS)     += $(VIS-OBJS)     $(VIS-OBJS-yes)
 | 
			
		||||
 | 
			
		||||
OBJS-$(HAVE_MMX)     += $(MMX-OBJS)     $(MMX-OBJS-yes)
 | 
			
		||||
OBJS-$(HAVE_YASM)    += $(YASM-OBJS)    $(YASM-OBJS-yes)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										291
									
								
								cmdutils.c
									
									
									
									
									
								
							
							
						
						
									
										291
									
								
								cmdutils.c
									
									
									
									
									
								
							@@ -66,7 +66,6 @@ AVDictionary *swr_opts;
 | 
			
		||||
AVDictionary *format_opts, *codec_opts, *resample_opts;
 | 
			
		||||
 | 
			
		||||
static FILE *report_file;
 | 
			
		||||
static int report_file_level = AV_LOG_DEBUG;
 | 
			
		||||
int hide_banner = 0;
 | 
			
		||||
 | 
			
		||||
void init_opts(void)
 | 
			
		||||
@@ -105,11 +104,9 @@ static void log_callback_report(void *ptr, int level, const char *fmt, va_list v
 | 
			
		||||
    av_log_default_callback(ptr, level, fmt, vl);
 | 
			
		||||
    av_log_format_line(ptr, level, fmt, vl2, line, sizeof(line), &print_prefix);
 | 
			
		||||
    va_end(vl2);
 | 
			
		||||
    if (report_file_level >= level) {
 | 
			
		||||
    fputs(line, report_file);
 | 
			
		||||
    fflush(report_file);
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void (*program_exit)(int ret);
 | 
			
		||||
 | 
			
		||||
@@ -166,7 +163,7 @@ void show_help_options(const OptionDef *options, const char *msg, int req_flags,
 | 
			
		||||
    int first;
 | 
			
		||||
 | 
			
		||||
    first = 1;
 | 
			
		||||
    for (po = options; po->name; po++) {
 | 
			
		||||
    for (po = options; po->name != NULL; po++) {
 | 
			
		||||
        char buf[64];
 | 
			
		||||
 | 
			
		||||
        if (((po->flags & req_flags) != req_flags) ||
 | 
			
		||||
@@ -205,7 +202,7 @@ static const OptionDef *find_option(const OptionDef *po, const char *name)
 | 
			
		||||
    const char *p = strchr(name, ':');
 | 
			
		||||
    int len = p ? p - name : strlen(name);
 | 
			
		||||
 | 
			
		||||
    while (po->name) {
 | 
			
		||||
    while (po->name != NULL) {
 | 
			
		||||
        if (!strncmp(name, po->name, len) && strlen(po->name) == len)
 | 
			
		||||
            break;
 | 
			
		||||
        po++;
 | 
			
		||||
@@ -254,7 +251,7 @@ static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
 | 
			
		||||
 | 
			
		||||
    win32_argv_utf8 = av_mallocz(sizeof(char *) * (win32_argc + 1) + buffsize);
 | 
			
		||||
    argstr_flat     = (char *)win32_argv_utf8 + sizeof(char *) * (win32_argc + 1);
 | 
			
		||||
    if (!win32_argv_utf8) {
 | 
			
		||||
    if (win32_argv_utf8 == NULL) {
 | 
			
		||||
        LocalFree(argv_w);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
@@ -444,7 +441,7 @@ int locate_option(int argc, char **argv, const OptionDef *options,
 | 
			
		||||
             (po->name && !strcmp(optname, po->name)))
 | 
			
		||||
            return i;
 | 
			
		||||
 | 
			
		||||
        if (!po->name || po->flags & HAS_ARG)
 | 
			
		||||
        if (po->flags & HAS_ARG)
 | 
			
		||||
            i++;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
@@ -555,11 +552,6 @@ int opt_default(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
        }
 | 
			
		||||
        consumed = 1;
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
    if (!consumed && !strcmp(opt, "sws_flags")) {
 | 
			
		||||
        av_log(NULL, AV_LOG_WARNING, "Ignoring %s %s, due to disabled swscale\n", opt, arg);
 | 
			
		||||
        consumed = 1;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
#if CONFIG_SWRESAMPLE
 | 
			
		||||
    swr_class = swr_get_class();
 | 
			
		||||
@@ -670,7 +662,7 @@ static void init_parse_context(OptionParseContext *octx,
 | 
			
		||||
    memset(octx, 0, sizeof(*octx));
 | 
			
		||||
 | 
			
		||||
    octx->nb_groups = nb_groups;
 | 
			
		||||
    octx->groups    = av_mallocz_array(octx->nb_groups, sizeof(*octx->groups));
 | 
			
		||||
    octx->groups    = av_mallocz(sizeof(*octx->groups) * octx->nb_groups);
 | 
			
		||||
    if (!octx->groups)
 | 
			
		||||
        exit_program(1);
 | 
			
		||||
 | 
			
		||||
@@ -842,17 +834,10 @@ int opt_loglevel(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
    };
 | 
			
		||||
    char *tail;
 | 
			
		||||
    int level;
 | 
			
		||||
    int flags;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    flags = av_log_get_flags();
 | 
			
		||||
    tail = strstr(arg, "repeat");
 | 
			
		||||
    if (tail)
 | 
			
		||||
        flags &= ~AV_LOG_SKIP_REPEATED;
 | 
			
		||||
    else
 | 
			
		||||
        flags |= AV_LOG_SKIP_REPEATED;
 | 
			
		||||
 | 
			
		||||
    av_log_set_flags(flags);
 | 
			
		||||
    av_log_set_flags(tail ? 0 : AV_LOG_SKIP_REPEATED);
 | 
			
		||||
    if (tail == arg)
 | 
			
		||||
        arg += 6 + (arg[6]=='+');
 | 
			
		||||
    if(tail && !*arg)
 | 
			
		||||
@@ -934,13 +919,6 @@ static int init_report(const char *env)
 | 
			
		||||
            av_free(filename_template);
 | 
			
		||||
            filename_template = val;
 | 
			
		||||
            val = NULL;
 | 
			
		||||
        } else if (!strcmp(key, "level")) {
 | 
			
		||||
            char *tail;
 | 
			
		||||
            report_file_level = strtol(val, &tail, 10);
 | 
			
		||||
            if (*tail) {
 | 
			
		||||
                av_log(NULL, AV_LOG_FATAL, "Invalid report file level\n");
 | 
			
		||||
                exit_program(1);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Unknown key '%s' in FFREPORT\n", key);
 | 
			
		||||
        }
 | 
			
		||||
@@ -959,10 +937,9 @@ static int init_report(const char *env)
 | 
			
		||||
 | 
			
		||||
    report_file = fopen(filename.str, "w");
 | 
			
		||||
    if (!report_file) {
 | 
			
		||||
        int ret = AVERROR(errno);
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Failed to open report \"%s\": %s\n",
 | 
			
		||||
               filename.str, strerror(errno));
 | 
			
		||||
        return ret;
 | 
			
		||||
        return AVERROR(errno);
 | 
			
		||||
    }
 | 
			
		||||
    av_log_set_callback(log_callback_report);
 | 
			
		||||
    av_log(NULL, AV_LOG_INFO,
 | 
			
		||||
@@ -1121,7 +1098,7 @@ void show_banner(int argc, char **argv, const OptionDef *options)
 | 
			
		||||
int show_version(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
{
 | 
			
		||||
    av_log_set_callback(log_callback_help);
 | 
			
		||||
    print_program_info (SHOW_COPYRIGHT, AV_LOG_INFO);
 | 
			
		||||
    print_program_info (0           , AV_LOG_INFO);
 | 
			
		||||
    print_all_libs_info(SHOW_VERSION, AV_LOG_INFO);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
@@ -1209,29 +1186,16 @@ int show_license(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int is_device(const AVClass *avclass)
 | 
			
		||||
{
 | 
			
		||||
    if (!avclass)
 | 
			
		||||
        return 0;
 | 
			
		||||
    return avclass->category == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT ||
 | 
			
		||||
           avclass->category == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT ||
 | 
			
		||||
           avclass->category == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT ||
 | 
			
		||||
           avclass->category == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT ||
 | 
			
		||||
           avclass->category == AV_CLASS_CATEGORY_DEVICE_OUTPUT ||
 | 
			
		||||
           avclass->category == AV_CLASS_CATEGORY_DEVICE_INPUT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int show_formats_devices(void *optctx, const char *opt, const char *arg, int device_only)
 | 
			
		||||
int show_formats(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
{
 | 
			
		||||
    AVInputFormat *ifmt  = NULL;
 | 
			
		||||
    AVOutputFormat *ofmt = NULL;
 | 
			
		||||
    const char *last_name;
 | 
			
		||||
    int is_dev;
 | 
			
		||||
 | 
			
		||||
    printf("%s\n"
 | 
			
		||||
    printf("File formats:\n"
 | 
			
		||||
           " D. = Demuxing supported\n"
 | 
			
		||||
           " .E = Muxing supported\n"
 | 
			
		||||
           " --\n", device_only ? "Devices:" : "File formats:");
 | 
			
		||||
           " --\n");
 | 
			
		||||
    last_name = "000";
 | 
			
		||||
    for (;;) {
 | 
			
		||||
        int decode = 0;
 | 
			
		||||
@@ -1240,10 +1204,7 @@ static int show_formats_devices(void *optctx, const char *opt, const char *arg,
 | 
			
		||||
        const char *long_name = NULL;
 | 
			
		||||
 | 
			
		||||
        while ((ofmt = av_oformat_next(ofmt))) {
 | 
			
		||||
            is_dev = is_device(ofmt->priv_class);
 | 
			
		||||
            if (!is_dev && device_only)
 | 
			
		||||
                continue;
 | 
			
		||||
            if ((!name || strcmp(ofmt->name, name) < 0) &&
 | 
			
		||||
            if ((name == NULL || strcmp(ofmt->name, name) < 0) &&
 | 
			
		||||
                strcmp(ofmt->name, last_name) > 0) {
 | 
			
		||||
                name      = ofmt->name;
 | 
			
		||||
                long_name = ofmt->long_name;
 | 
			
		||||
@@ -1251,10 +1212,7 @@ static int show_formats_devices(void *optctx, const char *opt, const char *arg,
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        while ((ifmt = av_iformat_next(ifmt))) {
 | 
			
		||||
            is_dev = is_device(ifmt->priv_class);
 | 
			
		||||
            if (!is_dev && device_only)
 | 
			
		||||
                continue;
 | 
			
		||||
            if ((!name || strcmp(ifmt->name, name) < 0) &&
 | 
			
		||||
            if ((name == NULL || strcmp(ifmt->name, name) < 0) &&
 | 
			
		||||
                strcmp(ifmt->name, last_name) > 0) {
 | 
			
		||||
                name      = ifmt->name;
 | 
			
		||||
                long_name = ifmt->long_name;
 | 
			
		||||
@@ -1263,7 +1221,7 @@ static int show_formats_devices(void *optctx, const char *opt, const char *arg,
 | 
			
		||||
            if (name && strcmp(ifmt->name, name) == 0)
 | 
			
		||||
                decode = 1;
 | 
			
		||||
        }
 | 
			
		||||
        if (!name)
 | 
			
		||||
        if (name == NULL)
 | 
			
		||||
            break;
 | 
			
		||||
        last_name = name;
 | 
			
		||||
 | 
			
		||||
@@ -1276,16 +1234,6 @@ static int show_formats_devices(void *optctx, const char *opt, const char *arg,
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int show_formats(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
{
 | 
			
		||||
    return show_formats_devices(optctx, opt, arg, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int show_devices(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
{
 | 
			
		||||
    return show_formats_devices(optctx, opt, arg, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define PRINT_CODEC_SUPPORTED(codec, field, type, list_name, term, get_name) \
 | 
			
		||||
    if (codec->field) {                                                      \
 | 
			
		||||
        const type *p = codec->field;                                        \
 | 
			
		||||
@@ -1430,9 +1378,6 @@ int show_codecs(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
        const AVCodecDescriptor *desc = codecs[i];
 | 
			
		||||
        const AVCodec *codec = NULL;
 | 
			
		||||
 | 
			
		||||
        if (strstr(desc->name, "_deprecated"))
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
        printf(" ");
 | 
			
		||||
        printf(avcodec_find_decoder(desc->id) ? "D" : ".");
 | 
			
		||||
        printf(avcodec_find_encoder(desc->id) ? "E" : ".");
 | 
			
		||||
@@ -1544,8 +1489,7 @@ int show_protocols(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
 | 
			
		||||
int show_filters(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
{
 | 
			
		||||
#if CONFIG_AVFILTER
 | 
			
		||||
    const AVFilter *filter = NULL;
 | 
			
		||||
    const AVFilter av_unused(*filter) = NULL;
 | 
			
		||||
    char descr[64], *descr_cur;
 | 
			
		||||
    int i, j;
 | 
			
		||||
    const AVFilterPad *pad;
 | 
			
		||||
@@ -1558,6 +1502,7 @@ int show_filters(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
           "  V = Video input/output\n"
 | 
			
		||||
           "  N = Dynamic number and/or type of input/output\n"
 | 
			
		||||
           "  | = Source or sink filter\n");
 | 
			
		||||
#if CONFIG_AVFILTER
 | 
			
		||||
    while ((filter = avfilter_next(filter))) {
 | 
			
		||||
        descr_cur = descr;
 | 
			
		||||
        for (i = 0; i < 2; i++) {
 | 
			
		||||
@@ -1582,8 +1527,6 @@ int show_filters(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
               filter->process_command                        ? 'C' : '.',
 | 
			
		||||
               filter->name, descr, filter->description);
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
    printf("No filters available: libavfilter disabled\n");
 | 
			
		||||
#endif
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -1648,13 +1591,13 @@ int show_layouts(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
        if (!name)
 | 
			
		||||
            continue;
 | 
			
		||||
        descr = av_get_channel_description((uint64_t)1 << i);
 | 
			
		||||
        printf("%-14s %s\n", name, descr);
 | 
			
		||||
        printf("%-12s%s\n", name, descr);
 | 
			
		||||
    }
 | 
			
		||||
    printf("\nStandard channel layouts:\n"
 | 
			
		||||
           "NAME        DECOMPOSITION\n");
 | 
			
		||||
    for (i = 0; !av_get_standard_channel_layout(i, &layout, &name); i++) {
 | 
			
		||||
        if (name) {
 | 
			
		||||
            printf("%-14s ", name);
 | 
			
		||||
            printf("%-12s", name);
 | 
			
		||||
            for (j = 1; j; j <<= 1)
 | 
			
		||||
                if ((layout & j))
 | 
			
		||||
                    printf("%s%s", (layout & (j - 1)) ? "+" : "", av_get_channel_name(j));
 | 
			
		||||
@@ -1860,23 +1803,21 @@ int read_yesno(void)
 | 
			
		||||
 | 
			
		||||
int cmdutils_read_file(const char *filename, char **bufptr, size_t *size)
 | 
			
		||||
{
 | 
			
		||||
    int64_t ret;
 | 
			
		||||
    int ret;
 | 
			
		||||
    FILE *f = av_fopen_utf8(filename, "rb");
 | 
			
		||||
 | 
			
		||||
    if (!f) {
 | 
			
		||||
        ret = AVERROR(errno);
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Cannot read file '%s': %s\n", filename,
 | 
			
		||||
               strerror(errno));
 | 
			
		||||
        return ret;
 | 
			
		||||
        return AVERROR(errno);
 | 
			
		||||
    }
 | 
			
		||||
    fseek(f, 0, SEEK_END);
 | 
			
		||||
    *size = ftell(f);
 | 
			
		||||
    fseek(f, 0, SEEK_SET);
 | 
			
		||||
    if (*size == (size_t)-1) {
 | 
			
		||||
        ret = AVERROR(errno);
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "IO error: %s\n", strerror(errno));
 | 
			
		||||
        fclose(f);
 | 
			
		||||
        return ret;
 | 
			
		||||
        return AVERROR(errno);
 | 
			
		||||
    }
 | 
			
		||||
    *bufptr = av_malloc(*size + 1);
 | 
			
		||||
    if (!*bufptr) {
 | 
			
		||||
@@ -1888,9 +1829,9 @@ int cmdutils_read_file(const char *filename, char **bufptr, size_t *size)
 | 
			
		||||
    if (ret < *size) {
 | 
			
		||||
        av_free(*bufptr);
 | 
			
		||||
        if (ferror(f)) {
 | 
			
		||||
            ret = AVERROR(errno);
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Error while reading file '%s': %s\n",
 | 
			
		||||
                   filename, strerror(errno));
 | 
			
		||||
            ret = AVERROR(errno);
 | 
			
		||||
        } else
 | 
			
		||||
            ret = AVERROR_EOF;
 | 
			
		||||
    } else {
 | 
			
		||||
@@ -1997,12 +1938,11 @@ AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id,
 | 
			
		||||
            switch (check_stream_specifier(s, st, p + 1)) {
 | 
			
		||||
            case  1: *p = 0; break;
 | 
			
		||||
            case  0:         continue;
 | 
			
		||||
            default:         exit_program(1);
 | 
			
		||||
            default:         return NULL;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) ||
 | 
			
		||||
            !codec ||
 | 
			
		||||
            (codec->priv_class &&
 | 
			
		||||
            (codec && codec->priv_class &&
 | 
			
		||||
             av_opt_find(&codec->priv_class, t->key, NULL, flags,
 | 
			
		||||
                         AV_OPT_SEARCH_FAKE_OBJ)))
 | 
			
		||||
            av_dict_set(&ret, t->key, t->value, 0);
 | 
			
		||||
@@ -2025,7 +1965,7 @@ AVDictionary **setup_find_stream_info_opts(AVFormatContext *s,
 | 
			
		||||
 | 
			
		||||
    if (!s->nb_streams)
 | 
			
		||||
        return NULL;
 | 
			
		||||
    opts = av_mallocz_array(s->nb_streams, sizeof(*opts));
 | 
			
		||||
    opts = av_mallocz(s->nb_streams * sizeof(*opts));
 | 
			
		||||
    if (!opts) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR,
 | 
			
		||||
               "Could not alloc memory for stream options.\n");
 | 
			
		||||
@@ -2055,184 +1995,3 @@ void *grow_array(void *array, int elem_size, int *size, int new_size)
 | 
			
		||||
    }
 | 
			
		||||
    return array;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if CONFIG_AVDEVICE
 | 
			
		||||
static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts)
 | 
			
		||||
{
 | 
			
		||||
    int ret, i;
 | 
			
		||||
    AVFormatContext *dev = NULL;
 | 
			
		||||
    AVDeviceInfoList *device_list = NULL;
 | 
			
		||||
    AVDictionary *tmp_opts = NULL;
 | 
			
		||||
 | 
			
		||||
    if (!fmt || !fmt->priv_class  || !AV_IS_INPUT_DEVICE(fmt->priv_class->category))
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
 | 
			
		||||
    printf("Audo-detected sources for %s:\n", fmt->name);
 | 
			
		||||
    if (!fmt->get_device_list) {
 | 
			
		||||
        ret = AVERROR(ENOSYS);
 | 
			
		||||
        printf("Cannot list sources. Not implemented.\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* TODO: avformat_open_input calls read_header callback which is not necessary.
 | 
			
		||||
             Function like avformat_alloc_output_context2 for input could be helpful here. */
 | 
			
		||||
    av_dict_copy(&tmp_opts, opts, 0);
 | 
			
		||||
    if ((ret = avformat_open_input(&dev, NULL, fmt, &tmp_opts)) < 0) {
 | 
			
		||||
        printf("Cannot open device: %s.\n", fmt->name);
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((ret = avdevice_list_devices(dev, &device_list)) < 0) {
 | 
			
		||||
        printf("Cannot list sources.\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < device_list->nb_devices; i++) {
 | 
			
		||||
        printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ",
 | 
			
		||||
               device_list->devices[i]->device_name, device_list->devices[i]->device_description);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  fail:
 | 
			
		||||
    av_dict_free(&tmp_opts);
 | 
			
		||||
    avdevice_free_list_devices(&device_list);
 | 
			
		||||
    avformat_close_input(&dev);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int print_device_sinks(AVOutputFormat *fmt, AVDictionary *opts)
 | 
			
		||||
{
 | 
			
		||||
    int ret, i;
 | 
			
		||||
    AVFormatContext *dev = NULL;
 | 
			
		||||
    AVDeviceInfoList *device_list = NULL;
 | 
			
		||||
    AVDictionary *tmp_opts = NULL;
 | 
			
		||||
 | 
			
		||||
    if (!fmt || !fmt->priv_class  || !AV_IS_OUTPUT_DEVICE(fmt->priv_class->category))
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
 | 
			
		||||
    printf("Audo-detected sinks for %s:\n", fmt->name);
 | 
			
		||||
    if (!fmt->get_device_list) {
 | 
			
		||||
        ret = AVERROR(ENOSYS);
 | 
			
		||||
        printf("Cannot list sinks. Not implemented.\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((ret = avformat_alloc_output_context2(&dev, fmt, NULL, NULL)) < 0) {
 | 
			
		||||
        printf("Cannot open device: %s.\n", fmt->name);
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
    av_dict_copy(&tmp_opts, opts, 0);
 | 
			
		||||
    av_opt_set_dict2(dev, &tmp_opts, AV_OPT_SEARCH_CHILDREN);
 | 
			
		||||
 | 
			
		||||
    if ((ret = avdevice_list_devices(dev, &device_list)) < 0) {
 | 
			
		||||
        printf("Cannot list sinks.\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < device_list->nb_devices; i++) {
 | 
			
		||||
        printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ",
 | 
			
		||||
               device_list->devices[i]->device_name, device_list->devices[i]->device_description);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  fail:
 | 
			
		||||
    av_dict_free(&tmp_opts);
 | 
			
		||||
    avdevice_free_list_devices(&device_list);
 | 
			
		||||
    avformat_free_context(dev);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int show_sinks_sources_parse_arg(const char *arg, char **dev, AVDictionary **opts)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    if (arg) {
 | 
			
		||||
        char *opts_str = NULL;
 | 
			
		||||
        av_assert0(dev && opts);
 | 
			
		||||
        *dev = av_strdup(arg);
 | 
			
		||||
        if (!*dev)
 | 
			
		||||
            return AVERROR(ENOMEM);
 | 
			
		||||
        if ((opts_str = strchr(*dev, ','))) {
 | 
			
		||||
            *(opts_str++) = '\0';
 | 
			
		||||
            if (opts_str[0] && ((ret = av_dict_parse_string(opts, opts_str, "=", ":", 0)) < 0)) {
 | 
			
		||||
                av_freep(dev);
 | 
			
		||||
                return ret;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    } else
 | 
			
		||||
        printf("\nDevice name is not provided.\n"
 | 
			
		||||
                "You can pass devicename[,opt1=val1[,opt2=val2...]] as an argument.\n\n");
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int show_sources(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
{
 | 
			
		||||
    AVInputFormat *fmt = NULL;
 | 
			
		||||
    char *dev = NULL;
 | 
			
		||||
    AVDictionary *opts = NULL;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    int error_level = av_log_get_level();
 | 
			
		||||
 | 
			
		||||
    av_log_set_level(AV_LOG_ERROR);
 | 
			
		||||
 | 
			
		||||
    if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
 | 
			
		||||
        goto fail;
 | 
			
		||||
 | 
			
		||||
    do {
 | 
			
		||||
        fmt = av_input_audio_device_next(fmt);
 | 
			
		||||
        if (fmt) {
 | 
			
		||||
            if (!strcmp(fmt->name, "lavfi"))
 | 
			
		||||
                continue; //it's pointless to probe lavfi
 | 
			
		||||
            if (dev && strcmp(fmt->name, dev))
 | 
			
		||||
                continue;
 | 
			
		||||
            print_device_sources(fmt, opts);
 | 
			
		||||
        }
 | 
			
		||||
    } while (fmt);
 | 
			
		||||
    do {
 | 
			
		||||
        fmt = av_input_video_device_next(fmt);
 | 
			
		||||
        if (fmt) {
 | 
			
		||||
            if (dev && strcmp(fmt->name, dev))
 | 
			
		||||
                continue;
 | 
			
		||||
            print_device_sources(fmt, opts);
 | 
			
		||||
        }
 | 
			
		||||
    } while (fmt);
 | 
			
		||||
  fail:
 | 
			
		||||
    av_dict_free(&opts);
 | 
			
		||||
    av_free(dev);
 | 
			
		||||
    av_log_set_level(error_level);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int show_sinks(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
{
 | 
			
		||||
    AVOutputFormat *fmt = NULL;
 | 
			
		||||
    char *dev = NULL;
 | 
			
		||||
    AVDictionary *opts = NULL;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    int error_level = av_log_get_level();
 | 
			
		||||
 | 
			
		||||
    av_log_set_level(AV_LOG_ERROR);
 | 
			
		||||
 | 
			
		||||
    if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
 | 
			
		||||
        goto fail;
 | 
			
		||||
 | 
			
		||||
    do {
 | 
			
		||||
        fmt = av_output_audio_device_next(fmt);
 | 
			
		||||
        if (fmt) {
 | 
			
		||||
            if (dev && strcmp(fmt->name, dev))
 | 
			
		||||
                continue;
 | 
			
		||||
            print_device_sinks(fmt, opts);
 | 
			
		||||
        }
 | 
			
		||||
    } while (fmt);
 | 
			
		||||
    do {
 | 
			
		||||
        fmt = av_output_video_device_next(fmt);
 | 
			
		||||
        if (fmt) {
 | 
			
		||||
            if (dev && strcmp(fmt->name, dev))
 | 
			
		||||
                continue;
 | 
			
		||||
            print_device_sinks(fmt, opts);
 | 
			
		||||
        }
 | 
			
		||||
    } while (fmt);
 | 
			
		||||
  fail:
 | 
			
		||||
    av_dict_free(&opts);
 | 
			
		||||
    av_free(dev);
 | 
			
		||||
    av_log_set_level(error_level);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28
									
								
								cmdutils.h
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								cmdutils.h
									
									
									
									
									
								
							@@ -24,13 +24,12 @@
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#include "libavcodec/avcodec.h"
 | 
			
		||||
#include "libavfilter/avfilter.h"
 | 
			
		||||
#include "libavformat/avformat.h"
 | 
			
		||||
#include "libswscale/swscale.h"
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
#ifdef __MINGW32__
 | 
			
		||||
#undef main /* We don't want SDL to override our main() */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -59,7 +58,7 @@ void register_exit(void (*cb)(int ret));
 | 
			
		||||
/**
 | 
			
		||||
 * Wraps exit with a program-specific cleanup routine.
 | 
			
		||||
 */
 | 
			
		||||
void exit_program(int ret) av_noreturn;
 | 
			
		||||
void exit_program(int ret);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Initialize the cmdutils option system, in particular
 | 
			
		||||
@@ -431,31 +430,10 @@ int show_license(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing all the formats supported by the
 | 
			
		||||
 * program (including devices).
 | 
			
		||||
 * This option processing function does not utilize the arguments.
 | 
			
		||||
 */
 | 
			
		||||
int show_formats(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing all the devices supported by the
 | 
			
		||||
 * program.
 | 
			
		||||
 * This option processing function does not utilize the arguments.
 | 
			
		||||
 */
 | 
			
		||||
int show_devices(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
#if CONFIG_AVDEVICE
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing audodetected sinks of the output device.
 | 
			
		||||
 * Device name with options may be passed as an argument to limit results.
 | 
			
		||||
 */
 | 
			
		||||
int show_sinks(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing audodetected sources of the input device.
 | 
			
		||||
 * Device name with options may be passed as an argument to limit results.
 | 
			
		||||
 */
 | 
			
		||||
int show_sources(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
#endif
 | 
			
		||||
int show_formats(void *optctx, const char *opt, const char *arg);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Print a listing containing all the codecs supported by the
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,6 @@
 | 
			
		||||
    { "version"    , OPT_EXIT, {.func_arg = show_version},      "show version" },
 | 
			
		||||
    { "buildconf"  , OPT_EXIT, {.func_arg = show_buildconf},    "show build configuration" },
 | 
			
		||||
    { "formats"    , OPT_EXIT, {.func_arg = show_formats  },    "show available formats" },
 | 
			
		||||
    { "devices"    , OPT_EXIT, {.func_arg = show_devices  },    "show available devices" },
 | 
			
		||||
    { "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" },
 | 
			
		||||
@@ -27,9 +26,3 @@
 | 
			
		||||
    { "opencl_bench", OPT_EXIT, {.func_arg = opt_opencl_bench}, "run benchmark on all OpenCL devices and show results" },
 | 
			
		||||
    { "opencl_options", HAS_ARG, {.func_arg = opt_opencl},      "set OpenCL environment options" },
 | 
			
		||||
#endif
 | 
			
		||||
#if CONFIG_AVDEVICE
 | 
			
		||||
    { "sources"    , OPT_EXIT | HAS_ARG, { .func_arg = show_sources },
 | 
			
		||||
      "list sources of the input device", "device" },
 | 
			
		||||
    { "sinks"      , OPT_EXIT | HAS_ARG, { .func_arg = show_sinks },
 | 
			
		||||
      "list sinks of the output device", "device" },
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,6 @@
 | 
			
		||||
#include "libavutil/time.h"
 | 
			
		||||
#include "libavutil/log.h"
 | 
			
		||||
#include "libavutil/opencl.h"
 | 
			
		||||
#include "libavutil/avstring.h"
 | 
			
		||||
#include "cmdutils.h"
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
@@ -182,12 +181,12 @@ static int64_t run_opencl_bench(AVOpenCLExternalEnv *ext_opencl_env)
 | 
			
		||||
    OCLCHECK(clSetKernelArg, kernel, arg++, sizeof(cl_int), &width);
 | 
			
		||||
    OCLCHECK(clSetKernelArg, kernel, arg++, sizeof(cl_int), &height);
 | 
			
		||||
 | 
			
		||||
    start = av_gettime_relative();
 | 
			
		||||
    start = av_gettime();
 | 
			
		||||
    for (i = 0; i < OPENCL_NB_ITER; i++)
 | 
			
		||||
        OCLCHECK(clEnqueueNDRangeKernel, ext_opencl_env->command_queue, kernel, 2, NULL,
 | 
			
		||||
                 global_work_size_2d, local_work_size_2d, 0, NULL, NULL);
 | 
			
		||||
    clFinish(ext_opencl_env->command_queue);
 | 
			
		||||
    ret = (av_gettime_relative() - start)/OPENCL_NB_ITER;
 | 
			
		||||
    ret = (av_gettime() - start)/OPENCL_NB_ITER;
 | 
			
		||||
end:
 | 
			
		||||
    if (kernel)
 | 
			
		||||
        clReleaseKernel(kernel);
 | 
			
		||||
@@ -225,7 +224,7 @@ int opt_opencl_bench(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "No OpenCL device detected!\n");
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
    }
 | 
			
		||||
    if (!(devices = av_malloc_array(nb_devices, sizeof(OpenCLDeviceBenchmark)))) {
 | 
			
		||||
    if (!(devices = av_malloc(sizeof(OpenCLDeviceBenchmark) * nb_devices))) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Could not allocate buffer\n");
 | 
			
		||||
        return AVERROR(ENOMEM);
 | 
			
		||||
    }
 | 
			
		||||
@@ -239,8 +238,7 @@ int opt_opencl_bench(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
                devices[count].platform_idx = i;
 | 
			
		||||
                devices[count].device_idx = j;
 | 
			
		||||
                devices[count].runtime = score;
 | 
			
		||||
                av_strlcpy(devices[count].device_name, device_node->device_name,
 | 
			
		||||
                           sizeof(devices[count].device_name));
 | 
			
		||||
                strcpy(devices[count].device_name, device_node->device_name);
 | 
			
		||||
                count++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -51,9 +51,6 @@ COMPILE_HOSTC = $(call COMPILE,HOSTCC)
 | 
			
		||||
%.o: %.cpp
 | 
			
		||||
	$(COMPILE_CXX)
 | 
			
		||||
 | 
			
		||||
%.o: %.m
 | 
			
		||||
	$(COMPILE_C)
 | 
			
		||||
 | 
			
		||||
%.s: %.c
 | 
			
		||||
	$(CC) $(CPPFLAGS) $(CFLAGS) -S -o $@ $<
 | 
			
		||||
 | 
			
		||||
@@ -93,7 +90,7 @@ include $(SRC_PATH)/arch.mak
 | 
			
		||||
 | 
			
		||||
OBJS      += $(OBJS-yes)
 | 
			
		||||
SLIBOBJS  += $(SLIBOBJS-yes)
 | 
			
		||||
FFLIBS    := $($(NAME)_FFLIBS) $(FFLIBS-yes) $(FFLIBS)
 | 
			
		||||
FFLIBS    := $(FFLIBS-yes) $(FFLIBS)
 | 
			
		||||
TESTPROGS += $(TESTPROGS-yes)
 | 
			
		||||
 | 
			
		||||
LDLIBS       = $(FFLIBS:%=%$(BUILDSUF))
 | 
			
		||||
 
 | 
			
		||||
@@ -805,7 +805,7 @@ struct AVS_Library {
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE AVS_Library * avs_load_library() {
 | 
			
		||||
  AVS_Library *library = (AVS_Library *)malloc(sizeof(AVS_Library));
 | 
			
		||||
  if (!library)
 | 
			
		||||
  if (library == NULL)
 | 
			
		||||
    return NULL;
 | 
			
		||||
  library->handle = LoadLibrary("avisynth");
 | 
			
		||||
  if (library->handle == NULL)
 | 
			
		||||
@@ -870,7 +870,7 @@ fail:
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AVSC_INLINE void avs_free_library(AVS_Library *library) {
 | 
			
		||||
  if (!library)
 | 
			
		||||
  if (library == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
  FreeLibrary(library->handle);
 | 
			
		||||
  free(library);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Work around broken floating point limits on some systems.
 | 
			
		||||
 *
 | 
			
		||||
 * 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_next <float.h>
 | 
			
		||||
 | 
			
		||||
#ifdef FLT_MAX
 | 
			
		||||
#undef  FLT_MAX
 | 
			
		||||
#define FLT_MAX 3.40282346638528859812e+38F
 | 
			
		||||
 | 
			
		||||
#undef  FLT_MIN
 | 
			
		||||
#define FLT_MIN 1.17549435082228750797e-38F
 | 
			
		||||
 | 
			
		||||
#undef  DBL_MAX
 | 
			
		||||
#define DBL_MAX ((double)1.79769313486231570815e+308L)
 | 
			
		||||
 | 
			
		||||
#undef  DBL_MIN
 | 
			
		||||
#define DBL_MIN ((double)2.22507385850720138309e-308L)
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,22 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Work around broken floating point limits on some systems.
 | 
			
		||||
 *
 | 
			
		||||
 * 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_next <limits.h>
 | 
			
		||||
#include <float.h>
 | 
			
		||||
@@ -54,7 +54,7 @@ static int getopt(int argc, char *argv[], char *opts)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    optopt = c = argv[optind][sp];
 | 
			
		||||
    if (c == ':' || !(cp = strchr(opts, c))) {
 | 
			
		||||
    if (c == ':' || (cp = strchr(opts, c)) == NULL) {
 | 
			
		||||
        fprintf(stderr, ": illegal option -- %c\n", c);
 | 
			
		||||
        if (argv[optind][++sp] == '\0') {
 | 
			
		||||
            optind++;
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,6 @@
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
#include <process.h>
 | 
			
		||||
 | 
			
		||||
#include "libavutil/attributes.h"
 | 
			
		||||
#include "libavutil/common.h"
 | 
			
		||||
#include "libavutil/internal.h"
 | 
			
		||||
#include "libavutil/mem.h"
 | 
			
		||||
@@ -55,29 +54,35 @@ typedef struct pthread_t {
 | 
			
		||||
 * not mutexes */
 | 
			
		||||
typedef CRITICAL_SECTION pthread_mutex_t;
 | 
			
		||||
 | 
			
		||||
/* This is the CONDITION_VARIABLE typedef for using Windows' native
 | 
			
		||||
 * conditional variables on kernels 6.0+. */
 | 
			
		||||
#if HAVE_CONDITION_VARIABLE_PTR
 | 
			
		||||
typedef CONDITION_VARIABLE pthread_cond_t;
 | 
			
		||||
#else
 | 
			
		||||
/* This is the CONDITIONAL_VARIABLE typedef for using Window's native
 | 
			
		||||
 * conditional variables on kernels 6.0+.
 | 
			
		||||
 * MinGW does not currently have this typedef. */
 | 
			
		||||
typedef struct pthread_cond_t {
 | 
			
		||||
    void *Ptr;
 | 
			
		||||
    void *ptr;
 | 
			
		||||
} pthread_cond_t;
 | 
			
		||||
 | 
			
		||||
/* function pointers to conditional variable API on windows 6.0+ kernels */
 | 
			
		||||
#if _WIN32_WINNT < 0x0600
 | 
			
		||||
static void (WINAPI *cond_broadcast)(pthread_cond_t *cond);
 | 
			
		||||
static void (WINAPI *cond_init)(pthread_cond_t *cond);
 | 
			
		||||
static void (WINAPI *cond_signal)(pthread_cond_t *cond);
 | 
			
		||||
static BOOL (WINAPI *cond_wait)(pthread_cond_t *cond, pthread_mutex_t *mutex,
 | 
			
		||||
                                DWORD milliseconds);
 | 
			
		||||
#else
 | 
			
		||||
#define cond_init      InitializeConditionVariable
 | 
			
		||||
#define cond_broadcast WakeAllConditionVariable
 | 
			
		||||
#define cond_signal    WakeConditionVariable
 | 
			
		||||
#define cond_wait      SleepConditionVariableCS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if _WIN32_WINNT >= 0x0600
 | 
			
		||||
#define InitializeCriticalSection(x) InitializeCriticalSectionEx(x, 0, 0)
 | 
			
		||||
#define WaitForSingleObject(a, b) WaitForSingleObjectEx(a, b, FALSE)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static av_unused unsigned __stdcall attribute_align_arg win32thread_worker(void *arg)
 | 
			
		||||
static unsigned __stdcall attribute_align_arg win32thread_worker(void *arg)
 | 
			
		||||
{
 | 
			
		||||
    pthread_t *h = arg;
 | 
			
		||||
    h->ret = h->func(h->arg);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static av_unused int pthread_create(pthread_t *thread, const void *unused_attr,
 | 
			
		||||
static int pthread_create(pthread_t *thread, const void *unused_attr,
 | 
			
		||||
                          void *(*start_routine)(void*), void *arg)
 | 
			
		||||
{
 | 
			
		||||
    thread->func   = start_routine;
 | 
			
		||||
@@ -87,7 +92,7 @@ static av_unused int pthread_create(pthread_t *thread, const void *unused_attr,
 | 
			
		||||
    return !thread->handle;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static av_unused void pthread_join(pthread_t thread, void **value_ptr)
 | 
			
		||||
static void pthread_join(pthread_t thread, void **value_ptr)
 | 
			
		||||
{
 | 
			
		||||
    DWORD ret = WaitForSingleObject(thread.handle, INFINITE);
 | 
			
		||||
    if (ret != WAIT_OBJECT_0)
 | 
			
		||||
@@ -118,36 +123,6 @@ static inline int pthread_mutex_unlock(pthread_mutex_t *m)
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if _WIN32_WINNT >= 0x0600
 | 
			
		||||
static inline int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
 | 
			
		||||
{
 | 
			
		||||
    InitializeConditionVariable(cond);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* native condition variables do not destroy */
 | 
			
		||||
static inline void pthread_cond_destroy(pthread_cond_t *cond)
 | 
			
		||||
{
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void pthread_cond_broadcast(pthread_cond_t *cond)
 | 
			
		||||
{
 | 
			
		||||
    WakeAllConditionVariable(cond);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
 | 
			
		||||
{
 | 
			
		||||
    SleepConditionVariableCS(cond, mutex, INFINITE);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void pthread_cond_signal(pthread_cond_t *cond)
 | 
			
		||||
{
 | 
			
		||||
    WakeConditionVariable(cond);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else // _WIN32_WINNT < 0x0600
 | 
			
		||||
/* for pre-Windows 6.0 platforms we need to define and use our own condition
 | 
			
		||||
 * variable and api */
 | 
			
		||||
typedef struct  win32_cond_t {
 | 
			
		||||
@@ -159,41 +134,33 @@ typedef struct  win32_cond_t {
 | 
			
		||||
    volatile int is_broadcast;
 | 
			
		||||
} win32_cond_t;
 | 
			
		||||
 | 
			
		||||
/* function pointers to conditional variable API on windows 6.0+ kernels */
 | 
			
		||||
static void (WINAPI *cond_broadcast)(pthread_cond_t *cond);
 | 
			
		||||
static void (WINAPI *cond_init)(pthread_cond_t *cond);
 | 
			
		||||
static void (WINAPI *cond_signal)(pthread_cond_t *cond);
 | 
			
		||||
static BOOL (WINAPI *cond_wait)(pthread_cond_t *cond, pthread_mutex_t *mutex,
 | 
			
		||||
                                DWORD milliseconds);
 | 
			
		||||
 | 
			
		||||
static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
 | 
			
		||||
static void pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
 | 
			
		||||
{
 | 
			
		||||
    win32_cond_t *win32_cond = NULL;
 | 
			
		||||
    if (cond_init) {
 | 
			
		||||
        cond_init(cond);
 | 
			
		||||
        return 0;
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* non native condition variables */
 | 
			
		||||
    win32_cond = av_mallocz(sizeof(win32_cond_t));
 | 
			
		||||
    if (!win32_cond)
 | 
			
		||||
        return ENOMEM;
 | 
			
		||||
    cond->Ptr = win32_cond;
 | 
			
		||||
        return;
 | 
			
		||||
    cond->ptr = win32_cond;
 | 
			
		||||
    win32_cond->semaphore = CreateSemaphore(NULL, 0, 0x7fffffff, NULL);
 | 
			
		||||
    if (!win32_cond->semaphore)
 | 
			
		||||
        return ENOMEM;
 | 
			
		||||
        return;
 | 
			
		||||
    win32_cond->waiters_done = CreateEvent(NULL, TRUE, FALSE, NULL);
 | 
			
		||||
    if (!win32_cond->waiters_done)
 | 
			
		||||
        return ENOMEM;
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    pthread_mutex_init(&win32_cond->mtx_waiter_count, NULL);
 | 
			
		||||
    pthread_mutex_init(&win32_cond->mtx_broadcast, NULL);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static av_unused void pthread_cond_destroy(pthread_cond_t *cond)
 | 
			
		||||
static void pthread_cond_destroy(pthread_cond_t *cond)
 | 
			
		||||
{
 | 
			
		||||
    win32_cond_t *win32_cond = cond->Ptr;
 | 
			
		||||
    win32_cond_t *win32_cond = cond->ptr;
 | 
			
		||||
    /* native condition variables do not destroy */
 | 
			
		||||
    if (cond_init)
 | 
			
		||||
        return;
 | 
			
		||||
@@ -204,12 +171,12 @@ static av_unused void pthread_cond_destroy(pthread_cond_t *cond)
 | 
			
		||||
    pthread_mutex_destroy(&win32_cond->mtx_waiter_count);
 | 
			
		||||
    pthread_mutex_destroy(&win32_cond->mtx_broadcast);
 | 
			
		||||
    av_freep(&win32_cond);
 | 
			
		||||
    cond->Ptr = NULL;
 | 
			
		||||
    cond->ptr = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static av_unused void pthread_cond_broadcast(pthread_cond_t *cond)
 | 
			
		||||
static void pthread_cond_broadcast(pthread_cond_t *cond)
 | 
			
		||||
{
 | 
			
		||||
    win32_cond_t *win32_cond = cond->Ptr;
 | 
			
		||||
    win32_cond_t *win32_cond = cond->ptr;
 | 
			
		||||
    int have_waiter;
 | 
			
		||||
 | 
			
		||||
    if (cond_broadcast) {
 | 
			
		||||
@@ -238,9 +205,9 @@ static av_unused void pthread_cond_broadcast(pthread_cond_t *cond)
 | 
			
		||||
    pthread_mutex_unlock(&win32_cond->mtx_broadcast);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
 | 
			
		||||
static int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
 | 
			
		||||
{
 | 
			
		||||
    win32_cond_t *win32_cond = cond->Ptr;
 | 
			
		||||
    win32_cond_t *win32_cond = cond->ptr;
 | 
			
		||||
    int last_waiter;
 | 
			
		||||
    if (cond_wait) {
 | 
			
		||||
        cond_wait(cond, mutex, INFINITE);
 | 
			
		||||
@@ -270,9 +237,9 @@ static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mu
 | 
			
		||||
    return pthread_mutex_lock(mutex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static av_unused void pthread_cond_signal(pthread_cond_t *cond)
 | 
			
		||||
static void pthread_cond_signal(pthread_cond_t *cond)
 | 
			
		||||
{
 | 
			
		||||
    win32_cond_t *win32_cond = cond->Ptr;
 | 
			
		||||
    win32_cond_t *win32_cond = cond->ptr;
 | 
			
		||||
    int have_waiter;
 | 
			
		||||
    if (cond_signal) {
 | 
			
		||||
        cond_signal(cond);
 | 
			
		||||
@@ -294,9 +261,8 @@ static av_unused void pthread_cond_signal(pthread_cond_t *cond)
 | 
			
		||||
 | 
			
		||||
    pthread_mutex_unlock(&win32_cond->mtx_broadcast);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static av_unused void w32thread_init(void)
 | 
			
		||||
static void w32thread_init(void)
 | 
			
		||||
{
 | 
			
		||||
#if _WIN32_WINNT < 0x0600
 | 
			
		||||
    HANDLE kernel_dll = GetModuleHandle(TEXT("kernel32.dll"));
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										471
									
								
								doc/APIchanges
									
									
									
									
									
								
							
							
						
						
									
										471
									
								
								doc/APIchanges
									
									
									
									
									
								
							@@ -2,399 +2,46 @@ Never assume the API of libav* to be stable unless at least 1 month has passed
 | 
			
		||||
since the last major version increase or the API was added.
 | 
			
		||||
 | 
			
		||||
The last version increases were:
 | 
			
		||||
libavcodec:    2014-08-09
 | 
			
		||||
libavdevice:   2014-08-09
 | 
			
		||||
libavfilter:   2014-08-09
 | 
			
		||||
libavformat:   2014-08-09
 | 
			
		||||
libavresample: 2014-08-09
 | 
			
		||||
libpostproc:   2014-08-09
 | 
			
		||||
libswresample: 2014-08-09
 | 
			
		||||
libswscale:    2014-08-09
 | 
			
		||||
libavutil:     2014-08-09
 | 
			
		||||
libavcodec:    2013-03-xx
 | 
			
		||||
libavdevice:   2013-03-xx
 | 
			
		||||
libavfilter:   2013-12-xx
 | 
			
		||||
libavformat:   2013-03-xx
 | 
			
		||||
libavresample: 2012-10-05
 | 
			
		||||
libpostproc:   2011-04-18
 | 
			
		||||
libswresample: 2011-09-19
 | 
			
		||||
libswscale:    2011-06-20
 | 
			
		||||
libavutil:     2012-10-22
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
API changes, most recent first:
 | 
			
		||||
 | 
			
		||||
2014-11-21 - ab922f9 - lavu 54.15.100 - dict.h
 | 
			
		||||
   Add av_dict_get_string().
 | 
			
		||||
 | 
			
		||||
2014-11-18 - a54a51c - lavu 54.14.100 - float_dsp.h
 | 
			
		||||
  Add avpriv_float_dsp_alloc().
 | 
			
		||||
 | 
			
		||||
2014-11-16 - 6690d4c3 - lavf 56.13.100 - avformat.h
 | 
			
		||||
  Add AVStream.recommended_encoder_configuration with accessors.
 | 
			
		||||
 | 
			
		||||
2014-11-16 - bee5844d - lavu 54.13.100 - opt.h
 | 
			
		||||
  Add av_opt_serialize().
 | 
			
		||||
 | 
			
		||||
2014-11-16 - eec69332 - lavu 54.12.100 - opt.h
 | 
			
		||||
  Add av_opt_is_set_to_default().
 | 
			
		||||
 | 
			
		||||
2014-11-06 - 44fa267 / 5e80fb7 - lavc 56.11.100 / 56.6.0 - vorbis_parser.h
 | 
			
		||||
  Add a public API for parsing vorbis packets.
 | 
			
		||||
 | 
			
		||||
2014-10-15 - 17085a0 / 7ea1b34 - lavc 56.7.100 / 56.5.0 - avcodec.h
 | 
			
		||||
  Replace AVCodecContext.time_base used for decoding
 | 
			
		||||
  with AVCodecContext.framerate.
 | 
			
		||||
 | 
			
		||||
2014-10-15 - 51c810e / d565fef1 - lavc 56.6.100 / 56.4.0 - avcodec.h
 | 
			
		||||
  Add AV_HWACCEL_FLAG_IGNORE_LEVEL flag to av_vdpau_bind_context().
 | 
			
		||||
 | 
			
		||||
2014-10-13 - da21895 / 2df0c32e - lavc 56.5.100 / 56.3.0 - avcodec.h
 | 
			
		||||
  Add AVCodecContext.initial_padding. Deprecate the use of AVCodecContext.delay
 | 
			
		||||
  for audio encoding.
 | 
			
		||||
 | 
			
		||||
2014-10-08 - bb44f7d / 5a419b2 - lavu 54.10.100 / 54.4.0 - pixdesc.h
 | 
			
		||||
  Add API to return the name of frame and context color properties.
 | 
			
		||||
 | 
			
		||||
2014-10-06 - a61899a / e3e158e - lavc 56.3.100 / 56.2.0 - vdpau.h
 | 
			
		||||
  Add av_vdpau_bind_context(). This function should now be used for creating
 | 
			
		||||
  (or resetting) a AVVDPAUContext instead of av_vdpau_alloc_context().
 | 
			
		||||
 | 
			
		||||
2014-10-02 - cdd6f05 - lavc 56.2.100 - avcodec.h
 | 
			
		||||
2014-10-02 - cdd6f05 - lavu 54.9.100 - frame.h
 | 
			
		||||
  Add AV_FRAME_DATA_SKIP_SAMPLES. Add lavc CODEC_FLAG2_SKIP_MANUAL and
 | 
			
		||||
  AVOption "skip_manual", which makes lavc export skip information via
 | 
			
		||||
  AV_FRAME_DATA_SKIP_SAMPLES AVFrame side data, instead of skipping and
 | 
			
		||||
  discarding samples automatically.
 | 
			
		||||
 | 
			
		||||
2014-10-02 - 0d92b0d - lavu 54.8.100 - avstring.h
 | 
			
		||||
  Add av_match_list()
 | 
			
		||||
 | 
			
		||||
2014-09-24 - ac68295 - libpostproc 53.1.100
 | 
			
		||||
  Add visualization support
 | 
			
		||||
 | 
			
		||||
2014-09-19 - 6edd6a4 - lavc 56.1.101 - dv_profile.h
 | 
			
		||||
  deprecate avpriv_dv_frame_profile2(), which was made public by accident.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-------- 8< --------- FFmpeg 2.4 was cut here -------- 8< ---------
 | 
			
		||||
 | 
			
		||||
2014-08-28 - f30a815 / 9301486 - lavc 56.1.100 / 56.1.0 - avcodec.h
 | 
			
		||||
  Add AV_PKT_DATA_STEREO3D to export container-level stereo3d information.
 | 
			
		||||
 | 
			
		||||
2014-08-25 - 215db29 / b263f8f - lavf 56.3.100 / 56.3.0 - avformat.h
 | 
			
		||||
  Add AVFormatContext.max_ts_probe.
 | 
			
		||||
 | 
			
		||||
2014-08-23 - 8fc9bd0 - lavu 54.7.100 - dict.h
 | 
			
		||||
  AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL arguments are now
 | 
			
		||||
  freed even on error. This is consistent with the behaviour all users
 | 
			
		||||
  of it we could find expect.
 | 
			
		||||
 | 
			
		||||
2014-08-21 - 980a5b0 - lavu 54.6.100 - frame.h motion_vector.h
 | 
			
		||||
  Add AV_FRAME_DATA_MOTION_VECTORS side data and AVMotionVector structure
 | 
			
		||||
 | 
			
		||||
2014-08-16 - b7d5e01 - lswr 1.1.100 - swresample.h
 | 
			
		||||
  Add AVFrame based API
 | 
			
		||||
 | 
			
		||||
2014-08-16 - c2829dc - lavu 54.4.100 - dict.h
 | 
			
		||||
  Add av_dict_set_int helper function.
 | 
			
		||||
 | 
			
		||||
2014-08-13 - c8571c6 / 8ddc326 - lavu 54.3.100 / 54.3.0 - mem.h
 | 
			
		||||
  Add av_strndup().
 | 
			
		||||
 | 
			
		||||
2014-08-13 - 2ba4577 / a8c104a - lavu 54.2.100 / 54.2.0 - opt.h
 | 
			
		||||
  Add av_opt_get_dict_val/set_dict_val with AV_OPT_TYPE_DICT to support
 | 
			
		||||
  dictionary types being set as options.
 | 
			
		||||
 | 
			
		||||
2014-08-13 - afbd4b8 - lavf 56.01.0 - avformat.h
 | 
			
		||||
  Add AVFormatContext.event_flags and AVStream.event_flags for signaling to
 | 
			
		||||
  the user when events happen in the file/stream.
 | 
			
		||||
 | 
			
		||||
2014-08-10 - 78eaaa8 / fb1ddcd - lavr 2.1.0 - avresample.h
 | 
			
		||||
  Add avresample_convert_frame() and avresample_config().
 | 
			
		||||
 | 
			
		||||
2014-08-10 - 78eaaa8 / fb1ddcd - lavu 54.1.100 / 54.1.0 - error.h
 | 
			
		||||
  Add AVERROR_INPUT_CHANGED and AVERROR_OUTPUT_CHANGED.
 | 
			
		||||
 | 
			
		||||
2014-08-08 - 3841f2a / d35b94f - lavc 55.73.102 / 55.57.4 - avcodec.h
 | 
			
		||||
  Deprecate FF_IDCT_XVIDMMX define and xvidmmx idct option.
 | 
			
		||||
  Replaced by FF_IDCT_XVID and xvid respectively.
 | 
			
		||||
 | 
			
		||||
2014-08-08 - 5c3c671 - lavf 55.53.100 - avio.h
 | 
			
		||||
  Add avio_feof() and deprecate url_feof().
 | 
			
		||||
 | 
			
		||||
2014-08-07 - bb78903 - lsws 2.1.3 - swscale.h
 | 
			
		||||
  sws_getContext is not going to be removed in the future.
 | 
			
		||||
 | 
			
		||||
2014-08-07 - a561662 / ad1ee5f - lavc 55.73.101 / 55.57.3 - avcodec.h
 | 
			
		||||
  reordered_opaque is not going to be removed in the future.
 | 
			
		||||
 | 
			
		||||
2014-08-02 - 28a2107 - lavu 52.98.100 - pixelutils.h
 | 
			
		||||
  Add pixelutils API with SAD functions
 | 
			
		||||
 | 
			
		||||
2014-08-04 - 6017c98 / e9abafc - lavu 52.97.100 / 53.22.0 - pixfmt.h
 | 
			
		||||
  Add AV_PIX_FMT_YA16 pixel format for 16 bit packed gray with alpha.
 | 
			
		||||
 | 
			
		||||
2014-08-04 - 4c8bc6f / e96c3b8 - lavu 52.96.101 / 53.21.1 - avstring.h
 | 
			
		||||
  Rename AV_PIX_FMT_Y400A to AV_PIX_FMT_YA8 to better identify the format.
 | 
			
		||||
  An alias pixel format and color space name are provided for compatibility.
 | 
			
		||||
 | 
			
		||||
2014-08-04 - 073c074 / d2962e9 - lavu 52.96.100 / 53.21.0 - pixdesc.h
 | 
			
		||||
  Support name aliases for pixel formats.
 | 
			
		||||
 | 
			
		||||
2014-08-03 - 71d008e / 1ef9e83 - lavc 55.72.101 / 55.57.2 - avcodec.h
 | 
			
		||||
2014-08-03 - 71d008e / 1ef9e83 - lavu 52.95.100 / 53.20.0 - frame.h
 | 
			
		||||
  Deprecate AVCodecContext.dtg_active_format and use side-data instead.
 | 
			
		||||
 | 
			
		||||
2014-08-03 - e680c73 - lavc 55.72.100 - avcodec.h
 | 
			
		||||
  Add get_pixels() to AVDCT
 | 
			
		||||
 | 
			
		||||
2014-08-03 - 9400603 / 9f17685 - lavc 55.71.101 / 55.57.1 - avcodec.h
 | 
			
		||||
  Deprecate unused FF_IDCT_IPP define and ipp avcodec option.
 | 
			
		||||
  Deprecate unused FF_DEBUG_PTS define and pts avcodec option.
 | 
			
		||||
  Deprecate unused FF_CODER_TYPE_DEFLATE define and deflate avcodec option.
 | 
			
		||||
  Deprecate unused FF_DCT_INT define and int avcodec option.
 | 
			
		||||
  Deprecate unused avcodec option scenechange_factor.
 | 
			
		||||
 | 
			
		||||
2014-07-30 - ba3e331 - lavu 52.94.100 - frame.h
 | 
			
		||||
  Add av_frame_side_data_name()
 | 
			
		||||
 | 
			
		||||
2014-07-29 - 80a3a66 / 3a19405 - lavf 56.01.100 / 56.01.0 - avformat.h
 | 
			
		||||
  Add mime_type field to AVProbeData, which now MUST be initialized in
 | 
			
		||||
  order to avoid uninitialized reads of the mime_type pointer, likely
 | 
			
		||||
  leading to crashes.
 | 
			
		||||
  Typically, this means you will do 'AVProbeData pd = { 0 };' instead of
 | 
			
		||||
  'AVProbeData pd;'.
 | 
			
		||||
 | 
			
		||||
2014-07-29 - 31e0b5d / 69e7336 - lavu 52.92.100 / 53.19.0 - avstring.h
 | 
			
		||||
  Make name matching function from lavf public as av_match_name().
 | 
			
		||||
 | 
			
		||||
2014-07-28 - 2e5c8b0 / c5fca01 - lavc 55.71.100 / 55.57.0 - avcodec.h
 | 
			
		||||
  Add AV_CODEC_PROP_REORDER to mark codecs supporting frame reordering.
 | 
			
		||||
 | 
			
		||||
2014-07-27 - ff9a154 - lavf 55.50.100 - avformat.h
 | 
			
		||||
  New field int64_t probesize2 instead of deprecated
 | 
			
		||||
  field int probesize.
 | 
			
		||||
 | 
			
		||||
2014-07-27 - 932ff70 - lavc 55.70.100 - avdct.h
 | 
			
		||||
  Add AVDCT / avcodec_dct_alloc() / avcodec_dct_init().
 | 
			
		||||
 | 
			
		||||
2014-07-23 - 8a4c086 - lavf 55.49.100 - avio.h
 | 
			
		||||
  Add avio_read_to_bprint()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-------- 8< --------- FFmpeg 2.3 was cut here -------- 8< ---------
 | 
			
		||||
 | 
			
		||||
2014-07-14 - 62227a7 - lavf 55.47.100 - avformat.h
 | 
			
		||||
  Add av_stream_get_parser()
 | 
			
		||||
 | 
			
		||||
2014-07-09 - c67690f / a54f03b - lavu 52.92.100 / 53.18.0 - display.h
 | 
			
		||||
  Add av_display_matrix_flip() to flip the transformation matrix.
 | 
			
		||||
 | 
			
		||||
2014-07-09 - 1b58f13 / f6ee61f - lavc 55.69.100 / 55.56.0 - dv_profile.h
 | 
			
		||||
  Add a public API for DV profile handling.
 | 
			
		||||
 | 
			
		||||
2014-06-20 - 0dceefc / 9e500ef - lavu 52.90.100 / 53.17.0 - imgutils.h
 | 
			
		||||
  Add av_image_check_sar().
 | 
			
		||||
 | 
			
		||||
2014-06-20 - 4a99333 / 874390e - lavc 55.68.100 / 55.55.0 - avcodec.h
 | 
			
		||||
  Add av_packet_rescale_ts() to simplify timestamp conversion.
 | 
			
		||||
 | 
			
		||||
2014-06-18 - ac293b6 / 194be1f - lavf 55.44.100 / 55.20.0 - avformat.h
 | 
			
		||||
  The proper way for providing a hint about the desired timebase to the muxers
 | 
			
		||||
  is now setting AVStream.time_base, instead of AVStream.codec.time_base as was
 | 
			
		||||
  done previously. The old method is now deprecated.
 | 
			
		||||
 | 
			
		||||
2014-06-11 - 67d29da - lavc 55.66.101 - avcodec.h
 | 
			
		||||
  Increase FF_INPUT_BUFFER_PADDING_SIZE to 32 due to some corner cases needing
 | 
			
		||||
  it
 | 
			
		||||
 | 
			
		||||
2014-06-10 - 5482780 - lavf 55.43.100 - avformat.h
 | 
			
		||||
  New field int64_t max_analyze_duration2 instead of deprecated
 | 
			
		||||
  int max_analyze_duration.
 | 
			
		||||
 | 
			
		||||
2014-05-30 - 00759d7 - lavu 52.89.100 - opt.h
 | 
			
		||||
  Add av_opt_copy()
 | 
			
		||||
 | 
			
		||||
2014-06-01 - 03bb99a / 0957b27 - lavc 55.66.100 / 55.54.0 - avcodec.h
 | 
			
		||||
  Add AVCodecContext.side_data_only_packets to allow encoders to output packets
 | 
			
		||||
  with only side data. This option may become mandatory in the future, so all
 | 
			
		||||
  users are recommended to update their code and enable this option.
 | 
			
		||||
 | 
			
		||||
2014-06-01 - 6e8e9f1 / 8c02adc - lavu 52.88.100 / 53.16.0 - frame.h, pixfmt.h
 | 
			
		||||
  Move all color-related enums (AVColorPrimaries, AVColorSpace, AVColorRange,
 | 
			
		||||
  AVColorTransferCharacteristic, and AVChromaLocation) inside lavu.
 | 
			
		||||
  And add AVFrame fields for them.
 | 
			
		||||
 | 
			
		||||
2014-05-29 - bdb2e80 / b2d4565 - lavr 1.3.0 - avresample.h
 | 
			
		||||
  Add avresample_max_output_samples
 | 
			
		||||
 | 
			
		||||
2014-05-28 - d858ee7 / 6d21259 - lavf 55.42.100 / 55.19.0 - avformat.h
 | 
			
		||||
  Add strict_std_compliance and related AVOptions to support experimental
 | 
			
		||||
  muxing.
 | 
			
		||||
 | 
			
		||||
2014-05-26 - 55cc60c - lavu 52.87.100 - threadmessage.h
 | 
			
		||||
  Add thread message queue API.
 | 
			
		||||
 | 
			
		||||
2014-05-26 - c37d179 - lavf 55.41.100 - avformat.h
 | 
			
		||||
  Add format_probesize to AVFormatContext.
 | 
			
		||||
 | 
			
		||||
2014-05-20 - 7d25af1 / c23c96b - lavf 55.39.100 / 55.18.0 - avformat.h
 | 
			
		||||
  Add av_stream_get_side_data() to access stream-level side data
 | 
			
		||||
  in the same way as av_packet_get_side_data().
 | 
			
		||||
 | 
			
		||||
2014-05-20 - 7336e39 - lavu 52.86.100 - fifo.h
 | 
			
		||||
  Add av_fifo_alloc_array() function.
 | 
			
		||||
 | 
			
		||||
2014-05-19 - ef1d4ee / bddd8cb - lavu 52.85.100 / 53.15.0 - frame.h, display.h
 | 
			
		||||
  Add AV_FRAME_DATA_DISPLAYMATRIX for exporting frame-level
 | 
			
		||||
  spatial rendering on video frames for proper display.
 | 
			
		||||
 | 
			
		||||
2014-05-19 - ef1d4ee / bddd8cb - lavc 55.64.100 / 55.53.0 - avcodec.h
 | 
			
		||||
  Add AV_PKT_DATA_DISPLAYMATRIX for exporting packet-level
 | 
			
		||||
  spatial rendering on video frames for proper display.
 | 
			
		||||
 | 
			
		||||
2014-05-19 - 999a99c / a312f71 - lavf 55.38.101 / 55.17.1 - avformat.h
 | 
			
		||||
  Deprecate AVStream.pts and the AVFrac struct, which was its only use case.
 | 
			
		||||
  See use av_stream_get_end_pts()
 | 
			
		||||
 | 
			
		||||
2014-05-18 - 68c0518 / fd05602 - lavc 55.63.100 / 55.52.0 - avcodec.h
 | 
			
		||||
  Add avcodec_free_context(). From now on it should be used for freeing
 | 
			
		||||
  AVCodecContext.
 | 
			
		||||
 | 
			
		||||
2014-05-17 - 0eec06e - lavu 52.84.100 - time.h
 | 
			
		||||
  Add av_gettime_relative() av_gettime_relative_is_monotonic()
 | 
			
		||||
 | 
			
		||||
2014-05-15 - eacf7d6 / 0c1959b - lavf 55.38.100 / 55.17.0 - avformat.h
 | 
			
		||||
  Add AVFMT_FLAG_BITEXACT flag. Muxers now use it instead of checking
 | 
			
		||||
  CODEC_FLAG_BITEXACT on the first stream.
 | 
			
		||||
 | 
			
		||||
2014-05-15 - 96cb4c8 - lswr 0.19.100 - swresample.h
 | 
			
		||||
  Add swr_close()
 | 
			
		||||
 | 
			
		||||
2014-05-11 - 14aef38 / 66e6c8a - lavu 52.83.100 / 53.14.0 - pixfmt.h
 | 
			
		||||
  Add AV_PIX_FMT_VDA for new-style VDA acceleration.
 | 
			
		||||
 | 
			
		||||
2014-05-07 - 351f611 - lavu 52.82.100 - fifo.h
 | 
			
		||||
  Add av_fifo_freep() function.
 | 
			
		||||
 | 
			
		||||
2014-05-02 - ba52fb11 - lavu 52.81.100 - opt.h
 | 
			
		||||
  Add av_opt_set_dict2() function.
 | 
			
		||||
 | 
			
		||||
2014-05-01 - e77b985 / a2941c8 - lavc 55.60.103 / 55.50.3 - avcodec.h
 | 
			
		||||
  Deprecate CODEC_FLAG_MV0. It is replaced by the flag "mv0" in the
 | 
			
		||||
  "mpv_flags" private option of the mpegvideo encoders.
 | 
			
		||||
 | 
			
		||||
2014-05-01 - e40ae8c / 6484149 - lavc 55.60.102 / 55.50.2 - avcodec.h
 | 
			
		||||
  Deprecate CODEC_FLAG_GMC. It is replaced by the "gmc" private option of the
 | 
			
		||||
  libxvid encoder.
 | 
			
		||||
 | 
			
		||||
2014-05-01 - 1851643 / b2c3171 - lavc 55.60.101 / 55.50.1 - avcodec.h
 | 
			
		||||
  Deprecate CODEC_FLAG_NORMALIZE_AQP. It is replaced by the flag "naq" in the
 | 
			
		||||
  "mpv_flags" private option of the mpegvideo encoders.
 | 
			
		||||
 | 
			
		||||
2014-05-01 - cac07d0 / 5fcceda - avcodec.h
 | 
			
		||||
  Deprecate CODEC_FLAG_INPUT_PRESERVED. Its functionality is replaced by passing
 | 
			
		||||
  reference-counted frames to encoders.
 | 
			
		||||
 | 
			
		||||
2014-04-30 - 617e866 - lavu 52.81.100 - pixdesc.h
 | 
			
		||||
  Add av_find_best_pix_fmt_of_2(), av_get_pix_fmt_loss()
 | 
			
		||||
  Deprecate avcodec_get_pix_fmt_loss(), avcodec_find_best_pix_fmt_of_2()
 | 
			
		||||
 | 
			
		||||
2014-04-29 - 1bf6396 - lavc 55.60.100 - avcodec.h
 | 
			
		||||
  Add AVCodecDescriptor.mime_types field.
 | 
			
		||||
 | 
			
		||||
2014-04-29 - b804eb4 - lavu 52.80.100 - hash.h
 | 
			
		||||
  Add av_hash_final_bin(), av_hash_final_hex() and av_hash_final_b64().
 | 
			
		||||
 | 
			
		||||
2014-03-07 - 8b2a130 - lavc 55.50.0 / 55.53.100 - dxva2.h
 | 
			
		||||
  Add FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO for old Intel GPUs.
 | 
			
		||||
 | 
			
		||||
2014-04-22 - 502512e /dac7e8a - lavu 53.13.0 / 52.78.100 - avutil.h
 | 
			
		||||
  Add av_get_time_base_q().
 | 
			
		||||
 | 
			
		||||
2014-04-17 - a8d01a7 / 0983d48 - lavu 53.12.0 / 52.77.100 - crc.h
 | 
			
		||||
  Add AV_CRC_16_ANSI_LE crc variant.
 | 
			
		||||
 | 
			
		||||
2014-04-15 - ef818d8 - lavf 55.37.101 - avformat.h
 | 
			
		||||
  Add av_format_inject_global_side_data()
 | 
			
		||||
 | 
			
		||||
2014-04-12 - 4f698be - lavu 52.76.100 - log.h
 | 
			
		||||
  Add av_log_get_flags()
 | 
			
		||||
 | 
			
		||||
2014-04-11 - 6db42a2b - lavd 55.12.100 - avdevice.h
 | 
			
		||||
  Add avdevice_capabilities_create() function.
 | 
			
		||||
  Add avdevice_capabilities_free() function.
 | 
			
		||||
 | 
			
		||||
2014-04-07 - 0a1cc04 / 8b17243 - lavu 52.75.100 / 53.11.0 - pixfmt.h
 | 
			
		||||
  Add AV_PIX_FMT_YVYU422 pixel format.
 | 
			
		||||
 | 
			
		||||
2014-04-04 - c1d0536 / 8542f9c - lavu 52.74.100 / 53.10.0 - replaygain.h
 | 
			
		||||
  Full scale for peak values is now 100000 (instead of UINT32_MAX) and values
 | 
			
		||||
  may overflow.
 | 
			
		||||
 | 
			
		||||
2014-04-03 - c16e006 / 7763118 - lavu 52.73.100 / 53.9.0 - log.h
 | 
			
		||||
  Add AV_LOG(c) macro to have 256 color debug messages.
 | 
			
		||||
 | 
			
		||||
2014-04-03 - eaed4da9 - lavu 52.72.100 - opt.h
 | 
			
		||||
  Add AV_OPT_MULTI_COMPONENT_RANGE define to allow return
 | 
			
		||||
  multi-component option ranges.
 | 
			
		||||
 | 
			
		||||
2014-03-29 - cd50a44b - lavu 52.70.100 - mem.h
 | 
			
		||||
  Add av_dynarray_add_nofree() function.
 | 
			
		||||
 | 
			
		||||
2014-02-24 - 3e1f241 / d161ae0 - lavu 52.69.100 / 53.8.0 - frame.h
 | 
			
		||||
  Add av_frame_remove_side_data() for removing a single side data
 | 
			
		||||
  instance from a frame.
 | 
			
		||||
 | 
			
		||||
2014-03-24 - 83e8978 / 5a7e35d - lavu 52.68.100 / 53.7.0 - frame.h, replaygain.h
 | 
			
		||||
  Add AV_FRAME_DATA_REPLAYGAIN for exporting replaygain tags.
 | 
			
		||||
  Add a new header replaygain.h with the AVReplayGain struct.
 | 
			
		||||
 | 
			
		||||
2014-03-24 - 83e8978 / 5a7e35d - lavc 55.54.100 / 55.36.0 - avcodec.h
 | 
			
		||||
  Add AV_PKT_DATA_REPLAYGAIN for exporting replaygain tags.
 | 
			
		||||
 | 
			
		||||
2014-03-24 - 595ba3b / 25b3258 - lavf 55.35.100 / 55.13.0 - avformat.h
 | 
			
		||||
  Add AVStream.side_data and AVStream.nb_side_data for exporting stream-global
 | 
			
		||||
  side data (e.g. replaygain tags, video rotation)
 | 
			
		||||
 | 
			
		||||
2014-03-24 - bd34e26 / 0e2c3ee - lavc 55.53.100 / 55.35.0 - avcodec.h
 | 
			
		||||
  Give the name AVPacketSideData to the previously anonymous struct used for
 | 
			
		||||
  AVPacket.side_data.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-------- 8< --------- FFmpeg 2.2 was cut here -------- 8< ---------
 | 
			
		||||
 | 
			
		||||
2014-03-18 - 37c07d4 - lsws 2.5.102
 | 
			
		||||
2014-03-18 - e9c8a9a - lsws 2.5.102
 | 
			
		||||
  Make gray16 full-scale.
 | 
			
		||||
 | 
			
		||||
2014-03-16 - 6b1ca17 / 1481d24 - lavu 52.67.100 / 53.6.0 - pixfmt.h
 | 
			
		||||
  Add RGBA64_LIBAV pixel format and variants for compatibility
 | 
			
		||||
 | 
			
		||||
2014-03-11 - 3f3229c - lavf 55.34.101 - avformat.h
 | 
			
		||||
  Set AVFormatContext.start_time_realtime when demuxing.
 | 
			
		||||
 | 
			
		||||
2014-03-03 - 06fed440 - lavd 55.11.100 - avdevice.h
 | 
			
		||||
  Add av_input_audio_device_next().
 | 
			
		||||
  Add av_input_video_device_next().
 | 
			
		||||
  Add av_output_audio_device_next().
 | 
			
		||||
  Add av_output_video_device_next().
 | 
			
		||||
 | 
			
		||||
2014-02-24 - fff5262 / 1155fd0 - lavu 52.66.100 / 53.5.0 - frame.h
 | 
			
		||||
2014-xx-xx - xxxxxxx - lavu 53.05.0 - frame.h
 | 
			
		||||
  Add av_frame_copy() for copying the frame data.
 | 
			
		||||
 | 
			
		||||
2014-02-24 - a66be60 - lswr 0.18.100 - swresample.h
 | 
			
		||||
2014-02-xx - xxxxxxx - lswr 0.18.100 - swresample.h
 | 
			
		||||
  Add swr_is_initialized() for checking whether a resample context is initialized.
 | 
			
		||||
 | 
			
		||||
2014-02-22 - 5367c0b / 7e86c27 - lavr 1.2.0 - avresample.h
 | 
			
		||||
2014-02-xx - xxxxxxx - lavr 1.2.0 - avresample.h
 | 
			
		||||
  Add avresample_is_open() for checking whether a resample context is open.
 | 
			
		||||
 | 
			
		||||
2014-02-19 - 6a24d77 / c3ecd96 - lavu 52.65.100 / 53.4.0  - opt.h
 | 
			
		||||
2014-xx-xx - xxxxxxx - lavu 53.04.0  - opt.h
 | 
			
		||||
  Add AV_OPT_FLAG_EXPORT and AV_OPT_FLAG_READONLY to mark options meant (only)
 | 
			
		||||
  for reading.
 | 
			
		||||
 | 
			
		||||
2014-02-19 - f4c8d00 / 6bb8720 - lavu 52.64.101 / 53.3.1 - opt.h
 | 
			
		||||
2014-xx-xx - xxxxxxx - lavu 53.03.01 - opt.h
 | 
			
		||||
  Deprecate unused AV_OPT_FLAG_METADATA.
 | 
			
		||||
 | 
			
		||||
2014-02-16 - 81c3f81 - lavd 55.10.100 - avdevice.h
 | 
			
		||||
2014-02-xx - xxxxxxx - lavd 55.10.100 - avdevice.h
 | 
			
		||||
  Add avdevice_list_devices() and avdevice_free_list_devices()
 | 
			
		||||
 | 
			
		||||
2014-02-16 - db3c970 - lavf 55.33.100 - avio.h
 | 
			
		||||
  Add avio_find_protocol_name() to find out the name of the protocol that would
 | 
			
		||||
  be selected for a given URL.
 | 
			
		||||
 | 
			
		||||
2014-02-15 - a2bc6c1 / c98f316 - lavu 52.64.100 / 53.3.0 - frame.h
 | 
			
		||||
2014-02-xx - xxxxxxx - lavu 53.3.0 - frame.h
 | 
			
		||||
  Add AV_FRAME_DATA_DOWNMIX_INFO value to the AVFrameSideDataType enum and
 | 
			
		||||
  downmix_info.h API, which identify downmix-related metadata.
 | 
			
		||||
 | 
			
		||||
@@ -405,7 +52,7 @@ API changes, most recent first:
 | 
			
		||||
  Add AVFormatContext.max_interleave_delta for controlling amount of buffering
 | 
			
		||||
  when interleaving.
 | 
			
		||||
 | 
			
		||||
2014-02-02 - 5871ee5 - lavf 55.29.100 - avformat.h
 | 
			
		||||
2014-02-02 - xxxxxxx - lavf 55.29.100 - avformat.h
 | 
			
		||||
  Add output_ts_offset muxing option to AVFormatContext.
 | 
			
		||||
 | 
			
		||||
2014-01-27 - 102bd64 - lavd 55.7.100 - avdevice.h
 | 
			
		||||
@@ -425,10 +72,10 @@ API changes, most recent first:
 | 
			
		||||
  (i.e. as if the CODEC_FLAG_EMU_EDGE flag was always on). Deprecate
 | 
			
		||||
  CODEC_FLAG_EMU_EDGE and avcodec_get_edge_width().
 | 
			
		||||
 | 
			
		||||
2014-01-19 - 1a193c4 - lavf 55.25.100 - avformat.h
 | 
			
		||||
2014-01-19 - xxxxxxx - lavf 55.25.100 - avformat.h
 | 
			
		||||
  Add avformat_get_mov_video_tags() and avformat_get_mov_audio_tags().
 | 
			
		||||
 | 
			
		||||
2014-01-19 - 3532dd5 - lavu 52.63.100 - rational.h
 | 
			
		||||
2014-01-19 - xxxxxxx - lavu 52.63.100 - rational.h
 | 
			
		||||
  Add av_make_q() function.
 | 
			
		||||
 | 
			
		||||
2014-01-05 - 4cf4da9 / 5b4797a - lavu 52.62.100 / 53.2.0 - frame.h
 | 
			
		||||
@@ -438,16 +85,16 @@ API changes, most recent first:
 | 
			
		||||
2014-01-05 - 751385f / 5c437fb - lavu 52.61.100 / 53.1.0 - channel_layout.h
 | 
			
		||||
  Add values for various Dolby flags to the AVMatrixEncoding enum.
 | 
			
		||||
 | 
			
		||||
2014-01-04 - b317f94 - lavu 52.60.100 - mathematics.h
 | 
			
		||||
2014-01-04 - xxxxxxx - lavu 52.60.100 - mathematics.h
 | 
			
		||||
  Add av_add_stable() function.
 | 
			
		||||
 | 
			
		||||
2013-12-22 - 911676c - lavu 52.59.100 - avstring.h
 | 
			
		||||
2013-12-22 - xxxxxxx - lavu 52.59.100 - avstring.h
 | 
			
		||||
  Add av_strnlen() function.
 | 
			
		||||
 | 
			
		||||
2013-12-09 - 64f73ac - lavu 52.57.100 - opencl.h
 | 
			
		||||
2013-12-xx - xxxxxxx - lavu 52.57.100 - opencl.h
 | 
			
		||||
  Add av_opencl_benchmark() function.
 | 
			
		||||
 | 
			
		||||
2013-11-30 - 82b2e9c - lavu 52.56.100 - ffversion.h
 | 
			
		||||
2013-11-xx - xxxxxxx - lavu 52.56.100 - ffversion.h
 | 
			
		||||
  Moves version.h to libavutil/ffversion.h.
 | 
			
		||||
  Install ffversion.h and make it public.
 | 
			
		||||
 | 
			
		||||
@@ -464,13 +111,13 @@ API changes, most recent first:
 | 
			
		||||
  Add AV_FRAME_DATA_A53_CC value to the AVFrameSideDataType enum, which
 | 
			
		||||
  identifies ATSC A53 Part 4 Closed Captions data.
 | 
			
		||||
 | 
			
		||||
2013-11-22 - 6859065 - lavu 52.54.100 - avstring.h
 | 
			
		||||
2013-11-XX - xxxxxxx - lavu 52.54.100 - avstring.h
 | 
			
		||||
  Add av_utf8_decode() function.
 | 
			
		||||
 | 
			
		||||
2013-11-22 - fb7d70c - lavc 55.44.100 - avcodec.h
 | 
			
		||||
  Add HEVC profiles
 | 
			
		||||
 | 
			
		||||
2013-11-20 - c28b61c - lavc 55.44.100 - avcodec.h
 | 
			
		||||
2013-11-xx - xxxxxxx - lavc 55.44.100 - avcodec.h
 | 
			
		||||
  Add av_packet_{un,}pack_dictionary()
 | 
			
		||||
  Add AV_PKT_METADATA_UPDATE side data type, used to transmit key/value
 | 
			
		||||
  strings between a stream and the application.
 | 
			
		||||
@@ -482,7 +129,7 @@ API changes, most recent first:
 | 
			
		||||
  Deprecate AVCodecContext.error_rate, it is replaced by the 'error_rate'
 | 
			
		||||
  private option of the mpegvideo encoder family.
 | 
			
		||||
 | 
			
		||||
2013-11-14 - 31c09b7 / 728c465 - lavc 55.42.100 / 55.26.0 - vdpau.h
 | 
			
		||||
2013-11-14 - 31c09b7 / 728c465 - lavc 55.26.0 - vdpau.h
 | 
			
		||||
  Add av_vdpau_get_profile().
 | 
			
		||||
  Add av_vdpau_alloc_context(). This function must from now on be
 | 
			
		||||
  used for allocating AVVDPAUContext.
 | 
			
		||||
@@ -492,32 +139,29 @@ API changes, most recent first:
 | 
			
		||||
  Add ITU-R BT.2020 and other not yet included values to color primaries,
 | 
			
		||||
  transfer characteristics and colorspaces.
 | 
			
		||||
 | 
			
		||||
2013-11-04 - 85cabf1 - lavu 52.50.100 - avutil.h
 | 
			
		||||
2013-11-04 - xxxxxxx - lavu 52.50.100 - avutil.h
 | 
			
		||||
  Add av_fopen_utf8()
 | 
			
		||||
 | 
			
		||||
2013-10-31 - 78265fc / 28096e0 - lavu 52.49.100 / 52.17.0 - frame.h
 | 
			
		||||
  Add AVFrame.flags and AV_FRAME_FLAG_CORRUPT.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-------- 8< --------- FFmpeg 2.1 was cut here -------- 8< ---------
 | 
			
		||||
 | 
			
		||||
2013-10-27 - dbe6f9f - lavc 55.39.100 - avcodec.h
 | 
			
		||||
2013-10-27 - xxxxxxx - lavc 55.39.100 - avcodec.h
 | 
			
		||||
  Add CODEC_CAP_DELAY support to avcodec_decode_subtitle2.
 | 
			
		||||
 | 
			
		||||
2013-10-27 - d61617a - lavu 52.48.100 - parseutils.h
 | 
			
		||||
2013-10-27 - xxxxxxx - lavu 52.48.100 - parseutils.h
 | 
			
		||||
  Add av_get_known_color_name().
 | 
			
		||||
 | 
			
		||||
2013-10-17 - 8696e51 - lavu 52.47.100 - opt.h
 | 
			
		||||
2013-10-17 - xxxxxxx - lavu 52.47.100 - opt.h
 | 
			
		||||
  Add AV_OPT_TYPE_CHANNEL_LAYOUT and channel layout option handlers
 | 
			
		||||
  av_opt_get_channel_layout() and av_opt_set_channel_layout().
 | 
			
		||||
 | 
			
		||||
2013-10-06 - ccf96f8 -libswscale 2.5.101 - options.c
 | 
			
		||||
2013-10-xx - xxxxxxx -libswscale 2.5.101 - options.c
 | 
			
		||||
  Change default scaler to bicubic
 | 
			
		||||
 | 
			
		||||
2013-10-03 - e57dba0 - lavc 55.34.100 - avcodec.h
 | 
			
		||||
2013-10-03 - xxxxxxx - lavc 55.34.100 - avcodec.h
 | 
			
		||||
  Add av_codec_get_max_lowres()
 | 
			
		||||
 | 
			
		||||
2013-10-02 - 5082fcc - lavf 55.19.100 - avformat.h
 | 
			
		||||
2013-10-02 - xxxxxxx - lavf 55.19.100 - avformat.h
 | 
			
		||||
  Add audio/video/subtitle AVCodec fields to AVFormatContext to force specific
 | 
			
		||||
  decoders
 | 
			
		||||
 | 
			
		||||
@@ -535,7 +179,7 @@ API changes, most recent first:
 | 
			
		||||
2013-09-04 - 3e1f507 - lavc 55.31.101 - avcodec.h
 | 
			
		||||
  avcodec_close() argument can be NULL.
 | 
			
		||||
 | 
			
		||||
2013-09-04 - 36cd017a - lavf 55.16.101 - avformat.h
 | 
			
		||||
2013-09-04 - 36cd017 - lavf 55.16.101 - avformat.h
 | 
			
		||||
  avformat_close_input() argument can be NULL and point on NULL.
 | 
			
		||||
 | 
			
		||||
2013-08-29 - e31db62 - lavf 55.15.100 - avformat.h
 | 
			
		||||
@@ -544,10 +188,10 @@ API changes, most recent first:
 | 
			
		||||
2013-08-15 - 1e0e193 - lsws 2.5.100 -
 | 
			
		||||
  Add a sws_dither AVOption, allowing to set the dither algorithm used
 | 
			
		||||
 | 
			
		||||
2013-08-11 - d404fe35 - lavc 55.27.100 - vdpau.h
 | 
			
		||||
2013-08-xx - xxxxxxx - lavc 55.27.100 - vdpau.h
 | 
			
		||||
  Add a render2 alternative to the render callback function.
 | 
			
		||||
 | 
			
		||||
2013-08-11 - af05edc - lavc 55.26.100 - vdpau.h
 | 
			
		||||
2013-08-xx - xxxxxxx - lavc 55.26.100 - vdpau.h
 | 
			
		||||
  Add allocation function for AVVDPAUContext, allowing
 | 
			
		||||
  to extend it in the future without breaking ABI/API.
 | 
			
		||||
 | 
			
		||||
@@ -557,7 +201,7 @@ API changes, most recent first:
 | 
			
		||||
 | 
			
		||||
2013-08-05 - 9547e3e / f824535 - lavc 55.22.100 / 55.13.0 - avcodec.h
 | 
			
		||||
  Deprecate the bitstream-related members from struct AVVDPAUContext.
 | 
			
		||||
  The bitstream buffers no longer need to be explicitly freed.
 | 
			
		||||
  The bistream buffers no longer need to be explicitly freed.
 | 
			
		||||
 | 
			
		||||
2013-08-05 - 3b805dc / 549294f - lavc 55.21.100 / 55.12.0 - avcodec.h
 | 
			
		||||
  Deprecate the CODEC_CAP_HWACCEL_VDPAU codec capability. Use CODEC_CAP_HWACCEL
 | 
			
		||||
@@ -573,9 +217,6 @@ API changes, most recent first:
 | 
			
		||||
  Add avcodec_chroma_pos_to_enum()
 | 
			
		||||
  Add avcodec_enum_to_chroma_pos()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-------- 8< --------- FFmpeg 2.0 was cut here -------- 8< ---------
 | 
			
		||||
 | 
			
		||||
2013-07-03 - 838bd73 - lavfi 3.78.100 - avfilter.h
 | 
			
		||||
  Deprecate avfilter_graph_parse() in favor of the equivalent
 | 
			
		||||
  avfilter_graph_parse_ptr().
 | 
			
		||||
@@ -648,9 +289,6 @@ API changes, most recent first:
 | 
			
		||||
2013-03-17 - 7aa9af5 - lavu 52.20.100 - opt.h
 | 
			
		||||
  Add AV_OPT_TYPE_VIDEO_RATE value to AVOptionType enum.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-------- 8< --------- FFmpeg 1.2 was cut here -------- 8< ---------
 | 
			
		||||
 | 
			
		||||
2013-03-07 - 9767ec6 - lavu 52.18.100 - avstring.h,bprint.h
 | 
			
		||||
  Add av_escape() and av_bprint_escape() API.
 | 
			
		||||
 | 
			
		||||
@@ -663,9 +301,6 @@ API changes, most recent first:
 | 
			
		||||
2013-01-01 - 2eb2e17 - lavfi 3.34.100
 | 
			
		||||
  Add avfilter_get_audio_buffer_ref_from_arrays_channels.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-------- 8< --------- FFmpeg 1.1 was cut here -------- 8< ---------
 | 
			
		||||
 | 
			
		||||
2012-12-20 - 34de47aa - lavfi 3.29.100 - avfilter.h
 | 
			
		||||
  Add AVFilterLink.channels, avfilter_link_get_channels()
 | 
			
		||||
  and avfilter_ref_get_channels().
 | 
			
		||||
@@ -711,9 +346,6 @@ API changes, most recent first:
 | 
			
		||||
  Add LIBSWRESAMPLE_VERSION, LIBSWRESAMPLE_BUILD
 | 
			
		||||
  and LIBSWRESAMPLE_IDENT symbols.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-------- 8< --------- FFmpeg 1.0 was cut here -------- 8< ---------
 | 
			
		||||
 | 
			
		||||
2012-09-06 - 29e972f - lavu 51.72.100 - parseutils.h
 | 
			
		||||
  Add av_small_strptime() time parsing function.
 | 
			
		||||
 | 
			
		||||
@@ -918,9 +550,6 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
 | 
			
		||||
  avresample_read() are now uint8_t** instead of void**.
 | 
			
		||||
  Libavresample is now stable.
 | 
			
		||||
 | 
			
		||||
2012-09-26 - 3ba0dab7 / 1384df64 - lavf 54.29.101 / 56.06.3 - avformat.h
 | 
			
		||||
  Add AVFormatContext.avoid_negative_ts.
 | 
			
		||||
 | 
			
		||||
2012-09-24 - 46a3595 / a42aada - lavc 54.59.100 / 54.28.0 - avcodec.h
 | 
			
		||||
  Add avcodec_free_frame(). This function must now
 | 
			
		||||
  be used for freeing an AVFrame.
 | 
			
		||||
@@ -1135,9 +764,6 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
 | 
			
		||||
2012-01-12 - b18e17e / 3167dc9 - lavfi 2.59.100 / 2.15.0
 | 
			
		||||
  Add a new installed header -- libavfilter/version.h -- with version macros.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-------- 8< --------- FFmpeg 0.9 was cut here -------- 8< ---------
 | 
			
		||||
 | 
			
		||||
2011-12-08 - a502939 - lavfi 2.52.0
 | 
			
		||||
  Add av_buffersink_poll_frame() to buffersink.h.
 | 
			
		||||
 | 
			
		||||
@@ -1166,9 +792,6 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
 | 
			
		||||
  Add avformat_close_input().
 | 
			
		||||
  Deprecate av_close_input_file() and av_close_input_stream().
 | 
			
		||||
 | 
			
		||||
2011-12-09 - c59b80c / b2890f5 - lavu 51.32.0 / 51.20.0 - audioconvert.h
 | 
			
		||||
  Expand the channel layout list.
 | 
			
		||||
 | 
			
		||||
2011-12-02 - e4de716 / 0eea212 - lavc 53.40.0 / 53.25.0
 | 
			
		||||
  Add nb_samples and extended_data fields to AVFrame.
 | 
			
		||||
  Deprecate AVCODEC_MAX_AUDIO_FRAME_SIZE.
 | 
			
		||||
@@ -1182,10 +805,6 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
 | 
			
		||||
  Change AVCodecContext.error[4] to [8] at next major bump.
 | 
			
		||||
  Add AV_NUM_DATA_POINTERS to simplify the bump transition.
 | 
			
		||||
 | 
			
		||||
2011-11-24 - lavu 51.29.0 / 51.19.0
 | 
			
		||||
  92afb43 / bd97b2e - add planar RGB pixel formats
 | 
			
		||||
  92afb43 / 6b0768e - add PIX_FMT_PLANAR and PIX_FMT_RGB pixel descriptions
 | 
			
		||||
 | 
			
		||||
2011-11-23 - 8e576d5 / bbb46f3 - lavu 51.27.0 / 51.18.0
 | 
			
		||||
  Add av_samples_get_buffer_size(), av_samples_fill_arrays(), and
 | 
			
		||||
  av_samples_alloc(), to samplefmt.h.
 | 
			
		||||
@@ -1347,13 +966,6 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
 | 
			
		||||
2011-06-28 - 5129336 - lavu 51.11.0 - avutil.h
 | 
			
		||||
  Define the AV_PICTURE_TYPE_NONE value in AVPictureType enum.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-------- 8< --------- FFmpeg 0.7 was cut here -------- 8< ---------
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-------- 8< --------- FFmpeg 0.8 was cut here -------- 8< ---------
 | 
			
		||||
 | 
			
		||||
2011-06-19 - fd2c0a5 - lavfi 2.23.0 - avfilter.h
 | 
			
		||||
  Add layout negotiation fields and helper functions.
 | 
			
		||||
 | 
			
		||||
@@ -2031,9 +1643,6 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
 | 
			
		||||
2010-06-02 - 7e566bb - lavc 52.73.0 - av_get_codec_tag_string()
 | 
			
		||||
  Add av_get_codec_tag_string().
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-------- 8< --------- FFmpeg 0.6 was cut here -------- 8< ---------
 | 
			
		||||
 | 
			
		||||
2010-06-01 - 2b99142 - lsws 0.11.0 - convertPalette API
 | 
			
		||||
  Add sws_convertPalette8ToPacked32() and sws_convertPalette8ToPacked24().
 | 
			
		||||
 | 
			
		||||
@@ -2051,6 +1660,10 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
 | 
			
		||||
2010-05-09 - b6bc205 - lavfi 1.20.0 - AVFilterPicRef
 | 
			
		||||
  Add interlaced and top_field_first fields to AVFilterPicRef.
 | 
			
		||||
 | 
			
		||||
------------------------------8<-------------------------------------
 | 
			
		||||
                   0.6 branch was cut here
 | 
			
		||||
----------------------------->8--------------------------------------
 | 
			
		||||
 | 
			
		||||
2010-05-01 - 8e2ee18 - lavf 52.62.0 - probe function
 | 
			
		||||
  Add av_probe_input_format2 to API, it allows ignoring probe
 | 
			
		||||
  results below given score and returns the actual probe score.
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ PROJECT_NAME           = FFmpeg
 | 
			
		||||
# This could be handy for archiving the generated documentation or
 | 
			
		||||
# if some version control system is used.
 | 
			
		||||
 | 
			
		||||
PROJECT_NUMBER         = 2.5.9
 | 
			
		||||
PROJECT_NUMBER         = 2.2.4
 | 
			
		||||
 | 
			
		||||
# With the PROJECT_LOGO tag one can specify a logo or icon that is included
 | 
			
		||||
# in the documentation. The maximum height of the logo should not exceed 55
 | 
			
		||||
@@ -759,7 +759,7 @@ ALPHABETICAL_INDEX     = YES
 | 
			
		||||
# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
 | 
			
		||||
# in which this list will be split (can be a number in the range [1..20])
 | 
			
		||||
 | 
			
		||||
COLS_IN_ALPHA_INDEX    = 5
 | 
			
		||||
COLS_IN_ALPHA_INDEX    = 2
 | 
			
		||||
 | 
			
		||||
# In case all classes in a project start with a common prefix, all
 | 
			
		||||
# classes will be put under the same header in the alphabetical index.
 | 
			
		||||
@@ -1056,7 +1056,7 @@ FORMULA_TRANSPARENT    = YES
 | 
			
		||||
# typically be disabled. For large projects the javascript based search engine
 | 
			
		||||
# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
 | 
			
		||||
 | 
			
		||||
SEARCHENGINE           = YES
 | 
			
		||||
SEARCHENGINE           = NO
 | 
			
		||||
 | 
			
		||||
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
 | 
			
		||||
# implemented using a PHP enabled web server instead of at the web client
 | 
			
		||||
@@ -1359,8 +1359,6 @@ PREDEFINED             = "__attribute__(x)=" \
 | 
			
		||||
                         "DECLARE_ALIGNED(a,t,n)=t n" \
 | 
			
		||||
                         "offsetof(x,y)=0x42" \
 | 
			
		||||
                         av_alloc_size \
 | 
			
		||||
                         AV_GCC_VERSION_AT_LEAST(x,y)=1 \
 | 
			
		||||
                         __GNUC__=1 \
 | 
			
		||||
 | 
			
		||||
# 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.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								doc/Makefile
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								doc/Makefile
									
									
									
									
									
								
							@@ -38,9 +38,7 @@ DOCS = $(DOCS-yes)
 | 
			
		||||
 | 
			
		||||
DOC_EXAMPLES-$(CONFIG_AVIO_READING_EXAMPLE)      += avio_reading
 | 
			
		||||
DOC_EXAMPLES-$(CONFIG_AVCODEC_EXAMPLE)           += avcodec
 | 
			
		||||
DOC_EXAMPLES-$(CONFIG_DECODING_ENCODING_EXAMPLE) += decoding_encoding
 | 
			
		||||
DOC_EXAMPLES-$(CONFIG_DEMUXING_DECODING_EXAMPLE) += demuxing_decoding
 | 
			
		||||
DOC_EXAMPLES-$(CONFIG_EXTRACT_MVS_EXAMPLE)       += extract_mvs
 | 
			
		||||
DOC_EXAMPLES-$(CONFIG_FILTER_AUDIO_EXAMPLE)      += filter_audio
 | 
			
		||||
DOC_EXAMPLES-$(CONFIG_FILTERING_AUDIO_EXAMPLE)   += filtering_audio
 | 
			
		||||
DOC_EXAMPLES-$(CONFIG_FILTERING_VIDEO_EXAMPLE)   += filtering_video
 | 
			
		||||
@@ -50,7 +48,6 @@ DOC_EXAMPLES-$(CONFIG_REMUXING_EXAMPLE)          += remuxing
 | 
			
		||||
DOC_EXAMPLES-$(CONFIG_RESAMPLING_AUDIO_EXAMPLE)  += resampling_audio
 | 
			
		||||
DOC_EXAMPLES-$(CONFIG_SCALING_VIDEO_EXAMPLE)     += scaling_video
 | 
			
		||||
DOC_EXAMPLES-$(CONFIG_TRANSCODE_AAC_EXAMPLE)     += transcode_aac
 | 
			
		||||
DOC_EXAMPLES-$(CONFIG_TRANSCODING_EXAMPLE)       += transcoding
 | 
			
		||||
ALL_DOC_EXAMPLES_LIST = $(DOC_EXAMPLES-) $(DOC_EXAMPLES-yes)
 | 
			
		||||
 | 
			
		||||
DOC_EXAMPLES       := $(DOC_EXAMPLES-yes:%=doc/examples/%$(PROGSSUF)$(EXESUF))
 | 
			
		||||
@@ -82,25 +79,14 @@ $(GENTEXI): doc/avoptions_%.texi: doc/print_options$(HOSTEXESUF)
 | 
			
		||||
	$(M)doc/print_options $* > $@
 | 
			
		||||
 | 
			
		||||
doc/%.html: TAG = HTML
 | 
			
		||||
doc/%-all.html: TAG = HTML
 | 
			
		||||
 | 
			
		||||
ifdef HAVE_MAKEINFO_HTML
 | 
			
		||||
doc/%.html: doc/%.texi $(SRC_PATH)/doc/t2h.pm $(GENTEXI)
 | 
			
		||||
	$(Q)$(TEXIDEP)
 | 
			
		||||
	$(M)makeinfo --html -I doc --no-split -D config-not-all --init-file=$(SRC_PATH)/doc/t2h.pm --output $@ $<
 | 
			
		||||
 | 
			
		||||
doc/%-all.html: doc/%.texi $(SRC_PATH)/doc/t2h.pm $(GENTEXI)
 | 
			
		||||
	$(Q)$(TEXIDEP)
 | 
			
		||||
	$(M)makeinfo --html -I doc --no-split -D config-all --init-file=$(SRC_PATH)/doc/t2h.pm --output $@ $<
 | 
			
		||||
else
 | 
			
		||||
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 $@ $<
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
doc/%.pod: TAG = POD
 | 
			
		||||
doc/%.pod: doc/%.texi $(SRC_PATH)/doc/texi2pod.pl $(GENTEXI)
 | 
			
		||||
@@ -124,9 +110,8 @@ OBJDIRS += doc/examples
 | 
			
		||||
 | 
			
		||||
DOXY_INPUT      = $(addprefix $(SRC_PATH)/, $(INSTHEADERS) $(DOC_EXAMPLES:%$(EXESUF)=%.c) $(LIB_EXAMPLES:%$(EXESUF)=%.c))
 | 
			
		||||
 | 
			
		||||
doc/doxy/html: TAG = DOXY
 | 
			
		||||
doc/doxy/html: $(SRC_PATH)/doc/Doxyfile $(SRC_PATH)/doc/doxy-wrapper.sh $(DOXY_INPUT)
 | 
			
		||||
	$(M)$(SRC_PATH)/doc/doxy-wrapper.sh $(SRC_PATH) $< $(DOXYGEN) $(DOXY_INPUT)
 | 
			
		||||
doc/doxy/html: $(SRC_PATH)/doc/Doxyfile $(DOXY_INPUT)
 | 
			
		||||
	$(M)$(SRC_PATH)/doc/doxy-wrapper.sh $(SRC_PATH) $< $(DOXY_INPUT)
 | 
			
		||||
 | 
			
		||||
install-doc: install-html install-man
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										16
									
								
								doc/RELEASE_NOTES
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								doc/RELEASE_NOTES
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
Release Notes
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
* 2.2 "Muybridge"  March, 2014
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
General notes
 | 
			
		||||
-------------
 | 
			
		||||
See the Changelog file for a list of significant changes. Note, there
 | 
			
		||||
are many more new features and bugfixes than whats listed there.
 | 
			
		||||
 | 
			
		||||
Bugreports against FFmpeg git master or the most recent FFmpeg release are
 | 
			
		||||
accepted. If you are experiencing issues with any formally released version of
 | 
			
		||||
FFmpeg, please try git master to check if the issue still exists. If it does,
 | 
			
		||||
make your report against the development code following the usual bug reporting
 | 
			
		||||
guidelines.
 | 
			
		||||
@@ -13,16 +13,7 @@ bitstream filter using the option @code{--disable-bsf=BSF}.
 | 
			
		||||
The option @code{-bsfs} of the ff* tools will display the list of
 | 
			
		||||
all the supported bitstream filters included in your build.
 | 
			
		||||
 | 
			
		||||
The ff* tools have a -bsf option applied per stream, taking a
 | 
			
		||||
comma-separated list of filters, whose parameters follow the filter
 | 
			
		||||
name after a '='.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -c:v copy -bsf:v filter1[=opt1=str1/opt2=str2][,filter2] OUTPUT
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Below is a description of the currently available bitstream filters,
 | 
			
		||||
with their parameters, if any.
 | 
			
		||||
Below is a description of the currently available bitstream filters.
 | 
			
		||||
 | 
			
		||||
@section aac_adtstoasc
 | 
			
		||||
 | 
			
		||||
@@ -83,18 +74,7 @@ format with @command{ffmpeg}, you can use the command:
 | 
			
		||||
ffmpeg -i INPUT.mp4 -codec copy -bsf:v h264_mp4toannexb OUTPUT.ts
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section imxdump
 | 
			
		||||
 | 
			
		||||
Modifies the bitstream to fit in MOV and to be usable by the Final Cut
 | 
			
		||||
Pro decoder. This filter only applies to the mpeg2video codec, and is
 | 
			
		||||
likely not needed for Final Cut Pro 7 and newer with the appropriate
 | 
			
		||||
@option{-tag:v}.
 | 
			
		||||
 | 
			
		||||
For example, to remux 30 MB/sec NTSC IMX to MOV:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i input.mxf -c copy -bsf:v imxdump -tag:v mx3n output.mov
 | 
			
		||||
@end example
 | 
			
		||||
@section imx_dump_header
 | 
			
		||||
 | 
			
		||||
@section mjpeg2jpeg
 | 
			
		||||
 | 
			
		||||
@@ -141,20 +121,6 @@ ffmpeg -i frame_%d.jpg -c:v copy rotated.avi
 | 
			
		||||
 | 
			
		||||
@section noise
 | 
			
		||||
 | 
			
		||||
Damages the contents of packets without damaging the container. Can be
 | 
			
		||||
used for fuzzing or testing error resilience/concealment.
 | 
			
		||||
 | 
			
		||||
Parameters:
 | 
			
		||||
A numeral string, whose value is related to how often output bytes will
 | 
			
		||||
be modified. Therefore, values below or equal to 0 are forbidden, and
 | 
			
		||||
the lower the more frequent bytes will be modified, with 1 meaning
 | 
			
		||||
every byte is modified.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -c copy -bsf noise[=1] output.mkv
 | 
			
		||||
@end example
 | 
			
		||||
applies the modification to every byte.
 | 
			
		||||
 | 
			
		||||
@section remove_extra
 | 
			
		||||
 | 
			
		||||
@c man end BITSTREAM FILTERS
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								doc/bootstrap.min.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								doc/bootstrap.min.css
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -25,9 +25,6 @@ fate-list
 | 
			
		||||
install
 | 
			
		||||
    Install headers, libraries and programs.
 | 
			
		||||
 | 
			
		||||
examples
 | 
			
		||||
    Build all examples located in doc/examples.
 | 
			
		||||
 | 
			
		||||
libavformat/output-example
 | 
			
		||||
    Build the libavformat basic example.
 | 
			
		||||
 | 
			
		||||
@@ -37,9 +34,6 @@ libavcodec/api-example
 | 
			
		||||
libswscale/swscale-test
 | 
			
		||||
    Build the swscale self-test (useful also as example).
 | 
			
		||||
 | 
			
		||||
config
 | 
			
		||||
    Reconfigure the project with current configuration.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Useful standard make commands:
 | 
			
		||||
make -t <target>
 | 
			
		||||
 
 | 
			
		||||
@@ -71,9 +71,7 @@ Force low delay.
 | 
			
		||||
@item global_header
 | 
			
		||||
Place global headers in extradata instead of every keyframe.
 | 
			
		||||
@item bitexact
 | 
			
		||||
Only write platform-, build- and time-independent data. (except (I)DCT).
 | 
			
		||||
This ensures that file and data checksums are reproducible and match between
 | 
			
		||||
platforms. Its primary use is for regression testing.
 | 
			
		||||
Use only bitexact stuff (except (I)DCT).
 | 
			
		||||
@item aic
 | 
			
		||||
Apply H263 advanced intra coding / mpeg4 ac prediction.
 | 
			
		||||
@item cbp
 | 
			
		||||
@@ -287,11 +285,6 @@ detect bitstream specification deviations
 | 
			
		||||
detect improper bitstream length
 | 
			
		||||
@item explode
 | 
			
		||||
abort decoding on minor error detection
 | 
			
		||||
@item ignore_err
 | 
			
		||||
ignore decoding errors, and continue decoding.
 | 
			
		||||
This is useful if you want to analyze the content of a video and thus want
 | 
			
		||||
everything to be decoded no matter what. This option will not result in a video
 | 
			
		||||
that is pleasing to watch in case of errors.
 | 
			
		||||
@item careful
 | 
			
		||||
consider things that violate the spec and have not been seen in the wild as errors
 | 
			
		||||
@item compliant
 | 
			
		||||
@@ -396,9 +389,6 @@ Possible values:
 | 
			
		||||
 | 
			
		||||
@item simplemmx
 | 
			
		||||
 | 
			
		||||
@item simpleauto
 | 
			
		||||
Automatically pick a IDCT compatible with the simple one
 | 
			
		||||
 | 
			
		||||
@item arm
 | 
			
		||||
 | 
			
		||||
@item altivec
 | 
			
		||||
@@ -434,8 +424,6 @@ Possible values:
 | 
			
		||||
iterative motion vector (MV) search (slow)
 | 
			
		||||
@item deblock
 | 
			
		||||
use strong deblock filter for damaged MBs
 | 
			
		||||
@item favor_inter
 | 
			
		||||
favor predicting from the previous frame instead of the current
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item bits_per_coded_sample @var{integer}
 | 
			
		||||
@@ -500,8 +488,6 @@ threading operations
 | 
			
		||||
@item vismv @var{integer} (@emph{decoding,video})
 | 
			
		||||
Visualize motion vectors (MVs).
 | 
			
		||||
 | 
			
		||||
This option is deprecated, see the codecview filter instead.
 | 
			
		||||
 | 
			
		||||
Possible values:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item pf
 | 
			
		||||
@@ -801,9 +787,6 @@ Frame data might be split into multiple chunks.
 | 
			
		||||
Show all frames before the first keyframe.
 | 
			
		||||
@item skiprd
 | 
			
		||||
Deprecated, use mpegvideo private options instead.
 | 
			
		||||
@item export_mvs
 | 
			
		||||
Export motion vectors into frame side-data (see @code{AV_FRAME_DATA_MOTION_VECTORS})
 | 
			
		||||
for codecs that support it. See also @file{doc/examples/export_mvs.c}.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item error @var{integer} (@emph{encoding,video})
 | 
			
		||||
@@ -896,7 +879,7 @@ Set frame skip factor.
 | 
			
		||||
Set frame skip exponent.
 | 
			
		||||
Negative values behave identical to the corresponding positive ones, except
 | 
			
		||||
that the score is normalized.
 | 
			
		||||
Positive values exist primarily for compatibility reasons and are not so useful.
 | 
			
		||||
Positive values exist primarly for compatibility reasons and are not so useful.
 | 
			
		||||
 | 
			
		||||
@item skipcmp @var{integer} (@emph{encoding,video})
 | 
			
		||||
Set frame skip compare function.
 | 
			
		||||
@@ -1042,26 +1025,15 @@ Set the log level offset.
 | 
			
		||||
Number of slices, used in parallelized encoding.
 | 
			
		||||
 | 
			
		||||
@item thread_type @var{flags} (@emph{decoding/encoding,video})
 | 
			
		||||
Select which multithreading methods to use.
 | 
			
		||||
 | 
			
		||||
Use of @samp{frame} will increase decoding delay by one frame per
 | 
			
		||||
thread, so clients which cannot provide future frames should not use
 | 
			
		||||
it.
 | 
			
		||||
Select multithreading type.
 | 
			
		||||
 | 
			
		||||
Possible values:
 | 
			
		||||
@table @samp
 | 
			
		||||
@item slice
 | 
			
		||||
Decode more than one part of a single frame at once.
 | 
			
		||||
 | 
			
		||||
Multithreading using slices works only when the video was encoded with
 | 
			
		||||
slices.
 | 
			
		||||
 | 
			
		||||
@item frame
 | 
			
		||||
Decode more than one frame at once.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Default value is @samp{slice+frame}.
 | 
			
		||||
 | 
			
		||||
@item audio_service_type @var{integer} (@emph{encoding,audio})
 | 
			
		||||
Set audio service type.
 | 
			
		||||
 | 
			
		||||
@@ -1116,19 +1088,6 @@ Interlaced video, bottom coded first, top displayed first
 | 
			
		||||
Set to 1 to disable processing alpha (transparency). This works like the
 | 
			
		||||
@samp{gray} flag in the @option{flags} option which skips chroma information
 | 
			
		||||
instead of alpha. Default is 0.
 | 
			
		||||
 | 
			
		||||
@item codec_whitelist @var{list} (@emph{input})
 | 
			
		||||
"," separated List of allowed decoders. By default all are allowed.
 | 
			
		||||
 | 
			
		||||
@item dump_separator @var{string} (@emph{input})
 | 
			
		||||
Separator used to separate the fields printed on the command line about the
 | 
			
		||||
Stream parameters.
 | 
			
		||||
For example to separate the fields with newlines and indention:
 | 
			
		||||
@example
 | 
			
		||||
ffprobe -dump_separator "
 | 
			
		||||
                          "  -i ~/videos/matrixbench_mpeg2.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@c man end CODEC OPTIONS
 | 
			
		||||
 
 | 
			
		||||
@@ -163,9 +163,6 @@ Requires the presence of the libopus headers and library during
 | 
			
		||||
configuration. You need to explicitly configure the build with
 | 
			
		||||
@code{--enable-libopus}.
 | 
			
		||||
 | 
			
		||||
An FFmpeg native decoder for Opus exists, so users can decode Opus
 | 
			
		||||
without this library.
 | 
			
		||||
 | 
			
		||||
@c man end AUDIO DECODERS
 | 
			
		||||
 | 
			
		||||
@chapter Subtitles Decoders
 | 
			
		||||
@@ -190,15 +187,6 @@ 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}.
 | 
			
		||||
 | 
			
		||||
@item ifo_palette
 | 
			
		||||
Specify the IFO file from which the global palette is obtained.
 | 
			
		||||
(experimental)
 | 
			
		||||
 | 
			
		||||
@item forced_subs_only
 | 
			
		||||
Only decode subtitle entries marked as forced. Some titles have forced
 | 
			
		||||
and non-forced subtitles in the same track. Setting this flag to @code{1}
 | 
			
		||||
will only keep the forced subtitles. Default value is @code{0}.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section libzvbi-teletext
 | 
			
		||||
 
 | 
			
		||||
@@ -29,26 +29,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 apng
 | 
			
		||||
 | 
			
		||||
Animated Portable Network Graphics demuxer.
 | 
			
		||||
 | 
			
		||||
This demuxer is used to demux APNG files.
 | 
			
		||||
All headers, but the PNG signature, up to (but not including) the first
 | 
			
		||||
fcTL chunk are transmitted as extradata.
 | 
			
		||||
Frames are then split as being all the chunks between two fcTL ones, or
 | 
			
		||||
between the last fcTL and IEND chunks.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -ignore_loop @var{bool}
 | 
			
		||||
Ignore the loop variable in the file if set.
 | 
			
		||||
@item -max_fps @var{int}
 | 
			
		||||
Maximum framerate in frames per second (0 for no limit).
 | 
			
		||||
@item -default_fps @var{int}
 | 
			
		||||
Default framerate in frames per second when none is specified in the file
 | 
			
		||||
(0 meaning as fast as possible).
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section asf
 | 
			
		||||
 | 
			
		||||
Advanced Systems Format demuxer.
 | 
			
		||||
@@ -94,7 +74,7 @@ following directive is recognized:
 | 
			
		||||
Path to a file to read; special characters and spaces must be escaped with
 | 
			
		||||
backslash or single quotes.
 | 
			
		||||
 | 
			
		||||
All subsequent file-related directives apply to that file.
 | 
			
		||||
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
 | 
			
		||||
@@ -112,22 +92,6 @@ 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.
 | 
			
		||||
 | 
			
		||||
@item @code{stream}
 | 
			
		||||
Introduce a stream in the virtual file.
 | 
			
		||||
All subsequent stream-related directives apply to the last introduced
 | 
			
		||||
stream.
 | 
			
		||||
Some streams properties must be set in order to allow identifying the
 | 
			
		||||
matching streams in the subfiles.
 | 
			
		||||
If no streams are defined in the script, the streams from the first file are
 | 
			
		||||
copied.
 | 
			
		||||
 | 
			
		||||
@item @code{exact_stream_id @var{id}}
 | 
			
		||||
Set the id of the stream.
 | 
			
		||||
If this directive is given, the string with the corresponding id in the
 | 
			
		||||
subfiles will be used.
 | 
			
		||||
This is especially useful for MPEG-PS (VOB) files, where the order of the
 | 
			
		||||
streams is not reliable.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
@@ -148,14 +112,6 @@ 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.
 | 
			
		||||
 | 
			
		||||
@item auto_convert
 | 
			
		||||
If set to 1, try to perform automatic conversions on packet data to make the
 | 
			
		||||
streams concatenable.
 | 
			
		||||
 | 
			
		||||
Currently, the only conversion is adding the h264_mp4toannexb bitstream
 | 
			
		||||
filter to H.264 streams in MP4 format. This is necessary in particular if
 | 
			
		||||
there are resolution changes.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section flv
 | 
			
		||||
@@ -194,40 +150,6 @@ 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 gif
 | 
			
		||||
 | 
			
		||||
Animated GIF demuxer.
 | 
			
		||||
 | 
			
		||||
It accepts the following options:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item min_delay
 | 
			
		||||
Set the minimum valid delay between frames in hundredths of seconds.
 | 
			
		||||
Range is 0 to 6000. Default value is 2.
 | 
			
		||||
 | 
			
		||||
@item default_delay
 | 
			
		||||
Set the default delay between frames in hundredths of seconds.
 | 
			
		||||
Range is 0 to 6000. Default value is 10.
 | 
			
		||||
 | 
			
		||||
@item ignore_loop
 | 
			
		||||
GIF files can contain information to loop a certain number of times (or
 | 
			
		||||
infinitely). If @option{ignore_loop} is set to 1, then the loop setting
 | 
			
		||||
from the input will be ignored and looping will not occur. If set to 0,
 | 
			
		||||
then looping will occur and will cycle the number of times according to
 | 
			
		||||
the GIF. Default value is 1.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
For example, with the overlay filter, place an infinitely looping GIF
 | 
			
		||||
over another video:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i input.mp4 -ignore_loop 0 -i input.gif -filter_complex overlay=shortest=1 out.mkv
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Note that in the above example the shortest option for overlay filter is
 | 
			
		||||
used to end the output video at the length of the shortest input file,
 | 
			
		||||
which in this case is @file{input.mp4} as the GIF in this example loops
 | 
			
		||||
infinitely.
 | 
			
		||||
 | 
			
		||||
@section image2
 | 
			
		||||
 | 
			
		||||
Image file demuxer.
 | 
			
		||||
@@ -327,8 +249,6 @@ is 5.
 | 
			
		||||
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.
 | 
			
		||||
If set to 2, will set frame timestamp to the modification time of the image file in
 | 
			
		||||
nanosecond precision.
 | 
			
		||||
@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.
 | 
			
		||||
 
 | 
			
		||||
@@ -323,12 +323,9 @@ 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:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
area changed: Short 1 line description
 | 
			
		||||
 | 
			
		||||
details describing what and why and giving references.
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Make sure the author of the commit is set correctly. (see git commit --author)
 | 
			
		||||
 
 | 
			
		||||
@@ -2,11 +2,10 @@
 | 
			
		||||
 | 
			
		||||
SRC_PATH="${1}"
 | 
			
		||||
DOXYFILE="${2}"
 | 
			
		||||
DOXYGEN="${3}"
 | 
			
		||||
 | 
			
		||||
shift 3
 | 
			
		||||
shift 2
 | 
			
		||||
 | 
			
		||||
$DOXYGEN - <<EOF
 | 
			
		||||
doxygen - <<EOF
 | 
			
		||||
@INCLUDE        = ${DOXYFILE}
 | 
			
		||||
INPUT           = $@
 | 
			
		||||
EXAMPLE_PATH    = ${SRC_PATH}/doc/examples
 | 
			
		||||
 
 | 
			
		||||
@@ -80,7 +80,7 @@ thresholds with quantizer steps to find the appropriate quantization with
 | 
			
		||||
distortion below threshold band by band.
 | 
			
		||||
 | 
			
		||||
The quality of this method is comparable to the two loop searching method
 | 
			
		||||
described below, but somewhat a little better and slower.
 | 
			
		||||
descibed below, but somewhat a little better and slower.
 | 
			
		||||
 | 
			
		||||
@item anmr
 | 
			
		||||
Average noise to mask ratio (ANMR) trellis-based solution.
 | 
			
		||||
@@ -1032,7 +1032,7 @@ configuration. You need to explicitly configure the build with
 | 
			
		||||
 | 
			
		||||
@subsection Option Mapping
 | 
			
		||||
 | 
			
		||||
Most libopus options are modelled after the @command{opusenc} utility from
 | 
			
		||||
Most libopus options are modeled after the @command{opusenc} utility from
 | 
			
		||||
opus-tools. The following is an option mapping chart describing options
 | 
			
		||||
supported by the libopus wrapper, and their @command{opusenc}-equivalent
 | 
			
		||||
in parentheses.
 | 
			
		||||
@@ -1330,7 +1330,7 @@ ffmpeg -i INPUT -codec:v libtheora -b:v 1000k OUTPUT.ogg
 | 
			
		||||
 | 
			
		||||
@section libvpx
 | 
			
		||||
 | 
			
		||||
VP8/VP9 format supported through libvpx.
 | 
			
		||||
VP8 format supported through libvpx.
 | 
			
		||||
 | 
			
		||||
Requires the presence of the libvpx headers and library during configuration.
 | 
			
		||||
You need to explicitly configure the build with @code{--enable-libvpx}.
 | 
			
		||||
@@ -1442,9 +1442,6 @@ g_lag_in_frames
 | 
			
		||||
@item vp8flags error_resilient
 | 
			
		||||
g_error_resilient
 | 
			
		||||
 | 
			
		||||
@item aq_mode
 | 
			
		||||
@code{VP9E_SET_AQ_MODE}
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
For more information about libvpx see:
 | 
			
		||||
@@ -1569,34 +1566,25 @@ kilobits/s.
 | 
			
		||||
 | 
			
		||||
@item g (@emph{keyint})
 | 
			
		||||
 | 
			
		||||
@item qmin (@emph{qpmin})
 | 
			
		||||
Minimum quantizer scale.
 | 
			
		||||
 | 
			
		||||
@item qmax (@emph{qpmax})
 | 
			
		||||
Maximum quantizer scale.
 | 
			
		||||
 | 
			
		||||
@item qmin (@emph{qpmin})
 | 
			
		||||
 | 
			
		||||
@item qdiff (@emph{qpstep})
 | 
			
		||||
Maximum difference between quantizer scales.
 | 
			
		||||
 | 
			
		||||
@item qblur (@emph{qblur})
 | 
			
		||||
Quantizer curve blur
 | 
			
		||||
 | 
			
		||||
@item qcomp (@emph{qcomp})
 | 
			
		||||
Quantizer curve compression factor
 | 
			
		||||
 | 
			
		||||
@item refs (@emph{ref})
 | 
			
		||||
Number of reference frames each P-frame can use. The range is from @var{0-16}.
 | 
			
		||||
 | 
			
		||||
@item sc_threshold (@emph{scenecut})
 | 
			
		||||
Sets the threshold for the scene change detection.
 | 
			
		||||
 | 
			
		||||
@item trellis (@emph{trellis})
 | 
			
		||||
Performs Trellis quantization to increase efficiency. Enabled by default.
 | 
			
		||||
 | 
			
		||||
@item nr  (@emph{nr})
 | 
			
		||||
 | 
			
		||||
@item me_range (@emph{merange})
 | 
			
		||||
Maximum range of the motion search in pixels.
 | 
			
		||||
 | 
			
		||||
@item me_method (@emph{me})
 | 
			
		||||
Set motion estimation method. Possible values in the decreasing order
 | 
			
		||||
@@ -1618,13 +1606,10 @@ Hadamard exhaustive search (slowest).
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item subq (@emph{subme})
 | 
			
		||||
Sub-pixel motion estimation method.
 | 
			
		||||
 | 
			
		||||
@item b_strategy (@emph{b-adapt})
 | 
			
		||||
Adaptive B-frame placement decision algorithm. Use only on first-pass.
 | 
			
		||||
 | 
			
		||||
@item keyint_min (@emph{min-keyint})
 | 
			
		||||
Minimum GOP size.
 | 
			
		||||
 | 
			
		||||
@item coder
 | 
			
		||||
Set entropy encoder. Possible values:
 | 
			
		||||
@@ -1651,7 +1636,6 @@ Ignore chroma in motion estimation. It generates the same effect as
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item threads (@emph{threads})
 | 
			
		||||
Number of encoding threads.
 | 
			
		||||
 | 
			
		||||
@item thread_type
 | 
			
		||||
Set multithreading technique. Possible values:
 | 
			
		||||
@@ -1745,10 +1729,6 @@ Enable calculation and printing SSIM stats after the encoding.
 | 
			
		||||
Enable the use of Periodic Intra Refresh instead of IDR frames when set
 | 
			
		||||
to 1.
 | 
			
		||||
 | 
			
		||||
@item avcintra-class (@emph{class})
 | 
			
		||||
Configure the encoder to generate AVC-Intra.
 | 
			
		||||
Valid values are 50,100 and 200
 | 
			
		||||
 | 
			
		||||
@item bluray-compat (@emph{bluray-compat})
 | 
			
		||||
Configure the encoder to be compatible with the bluray standard.
 | 
			
		||||
It is a shorthand for setting "bluray-compat=1 force-cfr=1".
 | 
			
		||||
@@ -1886,34 +1866,6 @@ no-fast-pskip=1:subq=6:8x8dct=0:trellis=0 OUTPUT
 | 
			
		||||
Encoding ffpresets for common usages are provided so they can be used with the
 | 
			
		||||
general presets system (e.g. passing the @option{pre} option).
 | 
			
		||||
 | 
			
		||||
@section libx265
 | 
			
		||||
 | 
			
		||||
x265 H.265/HEVC encoder wrapper.
 | 
			
		||||
 | 
			
		||||
This encoder requires the presence of the libx265 headers and library
 | 
			
		||||
during configuration. You need to explicitly configure the build with
 | 
			
		||||
@option{--enable-libx265}.
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item preset
 | 
			
		||||
Set the x265 preset.
 | 
			
		||||
 | 
			
		||||
@item tune
 | 
			
		||||
Set the x265 tune parameter.
 | 
			
		||||
 | 
			
		||||
@item x265-params
 | 
			
		||||
Set x265 options using a list of @var{key}=@var{value} couples separated
 | 
			
		||||
by ":". See @command{x265 --help} for a list of options.
 | 
			
		||||
 | 
			
		||||
For example to specify libx265 encoding options with @option{-x265-params}:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i input -c:v libx265 -x265-params crf=26:psy-rd=1 output.mp4
 | 
			
		||||
@end example
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section libxvid
 | 
			
		||||
 | 
			
		||||
Xvid MPEG-4 Part 2 encoder wrapper.
 | 
			
		||||
@@ -2077,30 +2029,6 @@ fastest.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section mpeg2
 | 
			
		||||
 | 
			
		||||
MPEG-2 video encoder.
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item seq_disp_ext @var{integer}
 | 
			
		||||
Specifies if the encoder should write a sequence_display_extension to the
 | 
			
		||||
output.
 | 
			
		||||
@table @option
 | 
			
		||||
@item -1
 | 
			
		||||
@itemx auto
 | 
			
		||||
Decide automatically to write it or not (this is the default) by checking if
 | 
			
		||||
the data to be written is different from the default or unspecified values.
 | 
			
		||||
@item 0
 | 
			
		||||
@itemx never
 | 
			
		||||
Never write it.
 | 
			
		||||
@item 1
 | 
			
		||||
@itemx always
 | 
			
		||||
Always write it.
 | 
			
		||||
@end table
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section png
 | 
			
		||||
 | 
			
		||||
PNG image encoder.
 | 
			
		||||
@@ -2182,27 +2110,3 @@ For the fastest encoding speed set the @option{qscale} parameter (4 is the
 | 
			
		||||
recommended value) and do not set a size constraint.
 | 
			
		||||
 | 
			
		||||
@c man end VIDEO ENCODERS
 | 
			
		||||
 | 
			
		||||
@chapter Subtitles Encoders
 | 
			
		||||
@c man begin SUBTITLES ENCODERS
 | 
			
		||||
 | 
			
		||||
@section dvdsub
 | 
			
		||||
 | 
			
		||||
This codec encodes the bitmap subtitle format that is used in DVDs.
 | 
			
		||||
Typically they are stored in VOBSUB file pairs (*.idx + *.sub),
 | 
			
		||||
and they can also be used in Matroska files.
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item even_rows_fix
 | 
			
		||||
When set to 1, enable a work-around that makes the number of pixel rows
 | 
			
		||||
even in all subtitles.  This fixes a problem with some players that
 | 
			
		||||
cut off the bottom row if the number is odd.  The work-around just adds
 | 
			
		||||
a fully transparent row if needed.  The overhead is low, typically
 | 
			
		||||
one byte per subtitle on average.
 | 
			
		||||
 | 
			
		||||
By default, this work-around is disabled.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@c man end SUBTITLES ENCODERS
 | 
			
		||||
 
 | 
			
		||||
@@ -12,9 +12,8 @@ CFLAGS := $(shell pkg-config --cflags $(FFMPEG_LIBS)) $(CFLAGS)
 | 
			
		||||
LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS)) $(LDLIBS)
 | 
			
		||||
 | 
			
		||||
EXAMPLES=       avio_reading                       \
 | 
			
		||||
                decoding_encoding                  \
 | 
			
		||||
                avcodec                            \
 | 
			
		||||
                demuxing_decoding                  \
 | 
			
		||||
                extract_mvs                        \
 | 
			
		||||
                filtering_video                    \
 | 
			
		||||
                filtering_audio                    \
 | 
			
		||||
                metadata                           \
 | 
			
		||||
@@ -23,13 +22,11 @@ EXAMPLES=       avio_reading                       \
 | 
			
		||||
                resampling_audio                   \
 | 
			
		||||
                scaling_video                      \
 | 
			
		||||
                transcode_aac                      \
 | 
			
		||||
                transcoding                        \
 | 
			
		||||
 | 
			
		||||
OBJS=$(addsuffix .o,$(EXAMPLES))
 | 
			
		||||
 | 
			
		||||
# the following examples make explicit use of the math library
 | 
			
		||||
avcodec:           LDLIBS += -lm
 | 
			
		||||
decoding_encoding: LDLIBS += -lm
 | 
			
		||||
muxing:            LDLIBS += -lm
 | 
			
		||||
resampling_audio:  LDLIBS += -lm
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@
 | 
			
		||||
 * @file
 | 
			
		||||
 * libavcodec API use example.
 | 
			
		||||
 *
 | 
			
		||||
 * @example decoding_encoding.c
 | 
			
		||||
 * @example avcodec.c
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -288,7 +288,6 @@ static void audio_decode_example(const char *outfilename, const char *filename)
 | 
			
		||||
    avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);
 | 
			
		||||
 | 
			
		||||
    while (avpkt.size > 0) {
 | 
			
		||||
        int i, ch;
 | 
			
		||||
        int got_frame = 0;
 | 
			
		||||
 | 
			
		||||
        if (!decoded_frame) {
 | 
			
		||||
@@ -305,15 +304,15 @@ static void audio_decode_example(const char *outfilename, const char *filename)
 | 
			
		||||
        }
 | 
			
		||||
        if (got_frame) {
 | 
			
		||||
            /* if a frame has been decoded, output it */
 | 
			
		||||
            int data_size = av_get_bytes_per_sample(c->sample_fmt);
 | 
			
		||||
            int data_size = av_samples_get_buffer_size(NULL, c->channels,
 | 
			
		||||
                                                       decoded_frame->nb_samples,
 | 
			
		||||
                                                       c->sample_fmt, 1);
 | 
			
		||||
            if (data_size < 0) {
 | 
			
		||||
                /* This should not occur, checking just for paranoia */
 | 
			
		||||
                fprintf(stderr, "Failed to calculate data size\n");
 | 
			
		||||
                exit(1);
 | 
			
		||||
            }
 | 
			
		||||
            for (i=0; i<decoded_frame->nb_samples; i++)
 | 
			
		||||
                for (ch=0; ch<c->channels; ch++)
 | 
			
		||||
                    fwrite(decoded_frame->data[ch] + data_size*i, 1, data_size, outfile);
 | 
			
		||||
            fwrite(decoded_frame->data[0], 1, data_size, outfile);
 | 
			
		||||
        }
 | 
			
		||||
        avpkt.size -= len;
 | 
			
		||||
        avpkt.data += len;
 | 
			
		||||
@@ -376,13 +375,7 @@ static void video_encode_example(const char *filename, int codec_id)
 | 
			
		||||
    c->height = 288;
 | 
			
		||||
    /* frames per second */
 | 
			
		||||
    c->time_base = (AVRational){1,25};
 | 
			
		||||
    /* emit one intra frame every ten frames
 | 
			
		||||
     * check frame pict_type before passing frame
 | 
			
		||||
     * to encoder, if frame->pict_type is AV_PICTURE_TYPE_I
 | 
			
		||||
     * then gop_size is ignored and the output of encoder
 | 
			
		||||
     * will always be I frame irrespective to gop_size
 | 
			
		||||
     */
 | 
			
		||||
    c->gop_size = 10;
 | 
			
		||||
    c->gop_size = 10; /* emit one intra frame every ten frames */
 | 
			
		||||
    c->max_b_frames = 1;
 | 
			
		||||
    c->pix_fmt = AV_PIX_FMT_YUV420P;
 | 
			
		||||
 | 
			
		||||
@@ -641,7 +634,7 @@ int main(int argc, char **argv)
 | 
			
		||||
               "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 chosen between 'h264', 'mp2', 'mpg'.\n",
 | 
			
		||||
               "output_type must be choosen between 'h264', 'mp2', 'mpg'.\n",
 | 
			
		||||
               argv[0]);
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
@@ -651,7 +644,7 @@ int main(int argc, char **argv)
 | 
			
		||||
        video_encode_example("test.h264", AV_CODEC_ID_H264);
 | 
			
		||||
    } else if (!strcmp(output_type, "mp2")) {
 | 
			
		||||
        audio_encode_example("test.mp2");
 | 
			
		||||
        audio_decode_example("test.pcm", "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");
 | 
			
		||||
@@ -279,7 +279,7 @@ int main (int argc, char **argv)
 | 
			
		||||
        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", audio_dst_filename);
 | 
			
		||||
            fprintf(stderr, "Could not open destination file %s\n", video_dst_filename);
 | 
			
		||||
            ret = 1;
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,185 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2012 Stefano Sabatini
 | 
			
		||||
 * Copyright (c) 2014 Clément Bœsch
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <libavutil/motion_vector.h>
 | 
			
		||||
#include <libavformat/avformat.h>
 | 
			
		||||
 | 
			
		||||
static AVFormatContext *fmt_ctx = NULL;
 | 
			
		||||
static AVCodecContext *video_dec_ctx = NULL;
 | 
			
		||||
static AVStream *video_stream = NULL;
 | 
			
		||||
static const char *src_filename = NULL;
 | 
			
		||||
 | 
			
		||||
static int video_stream_idx = -1;
 | 
			
		||||
static AVFrame *frame = NULL;
 | 
			
		||||
static AVPacket pkt;
 | 
			
		||||
static int video_frame_count = 0;
 | 
			
		||||
 | 
			
		||||
static int decode_packet(int *got_frame, int cached)
 | 
			
		||||
{
 | 
			
		||||
    int decoded = pkt.size;
 | 
			
		||||
 | 
			
		||||
    *got_frame = 0;
 | 
			
		||||
 | 
			
		||||
    if (pkt.stream_index == video_stream_idx) {
 | 
			
		||||
        int ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "Error decoding video frame (%s)\n", av_err2str(ret));
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (*got_frame) {
 | 
			
		||||
            int i;
 | 
			
		||||
            AVFrameSideData *sd;
 | 
			
		||||
 | 
			
		||||
            video_frame_count++;
 | 
			
		||||
            sd = av_frame_get_side_data(frame, AV_FRAME_DATA_MOTION_VECTORS);
 | 
			
		||||
            if (sd) {
 | 
			
		||||
                const AVMotionVector *mvs = (const AVMotionVector *)sd->data;
 | 
			
		||||
                for (i = 0; i < sd->size / sizeof(*mvs); i++) {
 | 
			
		||||
                    const AVMotionVector *mv = &mvs[i];
 | 
			
		||||
                    printf("%d,%2d,%2d,%2d,%4d,%4d,%4d,%4d,0x%"PRIx64"\n",
 | 
			
		||||
                           video_frame_count, mv->source,
 | 
			
		||||
                           mv->w, mv->h, mv->src_x, mv->src_y,
 | 
			
		||||
                           mv->dst_x, mv->dst_y, mv->flags);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
    AVDictionary *opts = 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 AVERROR(EINVAL);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* Init the video decoder */
 | 
			
		||||
        av_dict_set(&opts, "flags2", "+export_mvs", 0);
 | 
			
		||||
        if ((ret = avcodec_open2(dec_ctx, dec, &opts)) < 0) {
 | 
			
		||||
            fprintf(stderr, "Failed to open %s codec\n",
 | 
			
		||||
                    av_get_media_type_string(type));
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    int ret = 0, got_frame;
 | 
			
		||||
 | 
			
		||||
    if (argc != 2) {
 | 
			
		||||
        fprintf(stderr, "Usage: %s <video>\n", argv[0]);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    src_filename = argv[1];
 | 
			
		||||
 | 
			
		||||
    av_register_all();
 | 
			
		||||
 | 
			
		||||
    if (avformat_open_input(&fmt_ctx, src_filename, NULL, NULL) < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not open source file %s\n", src_filename);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    av_dump_format(fmt_ctx, 0, src_filename, 0);
 | 
			
		||||
 | 
			
		||||
    if (!video_stream) {
 | 
			
		||||
        fprintf(stderr, "Could not find video stream in the input, aborting\n");
 | 
			
		||||
        ret = 1;
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    frame = av_frame_alloc();
 | 
			
		||||
    if (!frame) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate frame\n");
 | 
			
		||||
        ret = AVERROR(ENOMEM);
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf("framenum,source,blockw,blockh,srcx,srcy,dstx,dsty,flags\n");
 | 
			
		||||
 | 
			
		||||
    /* initialize packet, set data to NULL, let the demuxer fill it */
 | 
			
		||||
    av_init_packet(&pkt);
 | 
			
		||||
    pkt.data = NULL;
 | 
			
		||||
    pkt.size = 0;
 | 
			
		||||
 | 
			
		||||
    /* 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);
 | 
			
		||||
 | 
			
		||||
end:
 | 
			
		||||
    avcodec_close(video_dec_ctx);
 | 
			
		||||
    avformat_close_input(&fmt_ctx);
 | 
			
		||||
    av_frame_free(&frame);
 | 
			
		||||
    return ret < 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -45,7 +45,6 @@
 | 
			
		||||
 | 
			
		||||
#include "libavutil/channel_layout.h"
 | 
			
		||||
#include "libavutil/md5.h"
 | 
			
		||||
#include "libavutil/mem.h"
 | 
			
		||||
#include "libavutil/opt.h"
 | 
			
		||||
#include "libavutil/samplefmt.h"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -90,7 +90,6 @@ 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();
 | 
			
		||||
    AVRational time_base = fmt_ctx->streams[video_stream_index]->time_base;
 | 
			
		||||
    enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE };
 | 
			
		||||
 | 
			
		||||
    filter_graph = avfilter_graph_alloc();
 | 
			
		||||
@@ -103,7 +102,7 @@ static int init_filters(const char *filters_descr)
 | 
			
		||||
    snprintf(args, sizeof(args),
 | 
			
		||||
            "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
 | 
			
		||||
            dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
 | 
			
		||||
            time_base.num, time_base.den,
 | 
			
		||||
            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",
 | 
			
		||||
 
 | 
			
		||||
@@ -34,8 +34,6 @@
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
 | 
			
		||||
#include <libavutil/avassert.h>
 | 
			
		||||
#include <libavutil/channel_layout.h>
 | 
			
		||||
#include <libavutil/opt.h>
 | 
			
		||||
#include <libavutil/mathematics.h>
 | 
			
		||||
#include <libavutil/timestamp.h>
 | 
			
		||||
@@ -43,28 +41,13 @@
 | 
			
		||||
#include <libswscale/swscale.h>
 | 
			
		||||
#include <libswresample/swresample.h>
 | 
			
		||||
 | 
			
		||||
static int audio_is_eof, video_is_eof;
 | 
			
		||||
 | 
			
		||||
#define STREAM_DURATION   10.0
 | 
			
		||||
#define STREAM_FRAME_RATE 25 /* 25 images/s */
 | 
			
		||||
#define STREAM_PIX_FMT    AV_PIX_FMT_YUV420P /* default pix_fmt */
 | 
			
		||||
 | 
			
		||||
#define SCALE_FLAGS SWS_BICUBIC
 | 
			
		||||
 | 
			
		||||
// a wrapper around a single output AVStream
 | 
			
		||||
typedef struct OutputStream {
 | 
			
		||||
    AVStream *st;
 | 
			
		||||
 | 
			
		||||
    /* pts of the next frame that will be generated */
 | 
			
		||||
    int64_t next_pts;
 | 
			
		||||
    int samples_count;
 | 
			
		||||
 | 
			
		||||
    AVFrame *frame;
 | 
			
		||||
    AVFrame *tmp_frame;
 | 
			
		||||
 | 
			
		||||
    float t, tincr, tincr2;
 | 
			
		||||
 | 
			
		||||
    struct SwsContext *sws_ctx;
 | 
			
		||||
    struct SwrContext *swr_ctx;
 | 
			
		||||
} OutputStream;
 | 
			
		||||
static int sws_flags = SWS_BICUBIC;
 | 
			
		||||
 | 
			
		||||
static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt)
 | 
			
		||||
{
 | 
			
		||||
@@ -80,7 +63,9 @@ static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt)
 | 
			
		||||
static int write_frame(AVFormatContext *fmt_ctx, const AVRational *time_base, AVStream *st, AVPacket *pkt)
 | 
			
		||||
{
 | 
			
		||||
    /* rescale output packet timestamp values from codec to stream timebase */
 | 
			
		||||
    av_packet_rescale_ts(pkt, *time_base, st->time_base);
 | 
			
		||||
    pkt->pts = av_rescale_q_rnd(pkt->pts, *time_base, st->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
 | 
			
		||||
    pkt->dts = av_rescale_q_rnd(pkt->dts, *time_base, st->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
 | 
			
		||||
    pkt->duration = av_rescale_q(pkt->duration, *time_base, st->time_base);
 | 
			
		||||
    pkt->stream_index = st->index;
 | 
			
		||||
 | 
			
		||||
    /* Write the compressed frame to the media file. */
 | 
			
		||||
@@ -89,12 +74,11 @@ static int write_frame(AVFormatContext *fmt_ctx, const AVRational *time_base, AV
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Add an output stream. */
 | 
			
		||||
static void add_stream(OutputStream *ost, AVFormatContext *oc,
 | 
			
		||||
                       AVCodec **codec,
 | 
			
		||||
static AVStream *add_stream(AVFormatContext *oc, AVCodec **codec,
 | 
			
		||||
                            enum AVCodecID codec_id)
 | 
			
		||||
{
 | 
			
		||||
    AVCodecContext *c;
 | 
			
		||||
    int i;
 | 
			
		||||
    AVStream *st;
 | 
			
		||||
 | 
			
		||||
    /* find the encoder */
 | 
			
		||||
    *codec = avcodec_find_encoder(codec_id);
 | 
			
		||||
@@ -104,13 +88,13 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ost->st = avformat_new_stream(oc, *codec);
 | 
			
		||||
    if (!ost->st) {
 | 
			
		||||
    st = avformat_new_stream(oc, *codec);
 | 
			
		||||
    if (!st) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate stream\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    ost->st->id = oc->nb_streams-1;
 | 
			
		||||
    c = ost->st->codec;
 | 
			
		||||
    st->id = oc->nb_streams-1;
 | 
			
		||||
    c = st->codec;
 | 
			
		||||
 | 
			
		||||
    switch ((*codec)->type) {
 | 
			
		||||
    case AVMEDIA_TYPE_AUDIO:
 | 
			
		||||
@@ -118,24 +102,7 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
 | 
			
		||||
            (*codec)->sample_fmts[0] : AV_SAMPLE_FMT_FLTP;
 | 
			
		||||
        c->bit_rate    = 64000;
 | 
			
		||||
        c->sample_rate = 44100;
 | 
			
		||||
        if ((*codec)->supported_samplerates) {
 | 
			
		||||
            c->sample_rate = (*codec)->supported_samplerates[0];
 | 
			
		||||
            for (i = 0; (*codec)->supported_samplerates[i]; i++) {
 | 
			
		||||
                if ((*codec)->supported_samplerates[i] == 44100)
 | 
			
		||||
                    c->sample_rate = 44100;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        c->channels        = av_get_channel_layout_nb_channels(c->channel_layout);
 | 
			
		||||
        c->channel_layout = AV_CH_LAYOUT_STEREO;
 | 
			
		||||
        if ((*codec)->channel_layouts) {
 | 
			
		||||
            c->channel_layout = (*codec)->channel_layouts[0];
 | 
			
		||||
            for (i = 0; (*codec)->channel_layouts[i]; i++) {
 | 
			
		||||
                if ((*codec)->channel_layouts[i] == AV_CH_LAYOUT_STEREO)
 | 
			
		||||
                    c->channel_layout = AV_CH_LAYOUT_STEREO;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        c->channels        = av_get_channel_layout_nb_channels(c->channel_layout);
 | 
			
		||||
        ost->st->time_base = (AVRational){ 1, c->sample_rate };
 | 
			
		||||
        c->channels    = 2;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case AVMEDIA_TYPE_VIDEO:
 | 
			
		||||
@@ -149,9 +116,8 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
 | 
			
		||||
         * of which frame timestamps are represented. For fixed-fps content,
 | 
			
		||||
         * timebase should be 1/framerate and timestamp increments should be
 | 
			
		||||
         * identical to 1. */
 | 
			
		||||
        ost->st->time_base = (AVRational){ 1, STREAM_FRAME_RATE };
 | 
			
		||||
        c->time_base       = ost->st->time_base;
 | 
			
		||||
 | 
			
		||||
        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) {
 | 
			
		||||
@@ -173,177 +139,182 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
 | 
			
		||||
    /* 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 AVFrame *alloc_audio_frame(enum AVSampleFormat sample_fmt,
 | 
			
		||||
                                  uint64_t channel_layout,
 | 
			
		||||
                                  int sample_rate, int nb_samples)
 | 
			
		||||
{
 | 
			
		||||
    AVFrame *frame = av_frame_alloc();
 | 
			
		||||
    int ret;
 | 
			
		||||
static float t, tincr, tincr2;
 | 
			
		||||
 | 
			
		||||
    if (!frame) {
 | 
			
		||||
        fprintf(stderr, "Error allocating an audio frame\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
AVFrame *audio_frame;
 | 
			
		||||
static uint8_t **src_samples_data;
 | 
			
		||||
static int       src_samples_linesize;
 | 
			
		||||
static int       src_nb_samples;
 | 
			
		||||
 | 
			
		||||
    frame->format = sample_fmt;
 | 
			
		||||
    frame->channel_layout = channel_layout;
 | 
			
		||||
    frame->sample_rate = sample_rate;
 | 
			
		||||
    frame->nb_samples = nb_samples;
 | 
			
		||||
static int max_dst_nb_samples;
 | 
			
		||||
uint8_t **dst_samples_data;
 | 
			
		||||
int       dst_samples_linesize;
 | 
			
		||||
int       dst_samples_size;
 | 
			
		||||
int samples_count;
 | 
			
		||||
 | 
			
		||||
    if (nb_samples) {
 | 
			
		||||
        ret = av_frame_get_buffer(frame, 0);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "Error allocating an audio buffer\n");
 | 
			
		||||
            exit(1);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
struct SwrContext *swr_ctx = NULL;
 | 
			
		||||
 | 
			
		||||
    return frame;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void open_audio(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg)
 | 
			
		||||
static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st)
 | 
			
		||||
{
 | 
			
		||||
    AVCodecContext *c;
 | 
			
		||||
    int nb_samples;
 | 
			
		||||
    int ret;
 | 
			
		||||
    AVDictionary *opt = NULL;
 | 
			
		||||
 | 
			
		||||
    c = ost->st->codec;
 | 
			
		||||
    c = st->codec;
 | 
			
		||||
 | 
			
		||||
    /* allocate and init a re-usable frame */
 | 
			
		||||
    audio_frame = av_frame_alloc();
 | 
			
		||||
    if (!audio_frame) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate audio frame\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* open it */
 | 
			
		||||
    av_dict_copy(&opt, opt_arg, 0);
 | 
			
		||||
    ret = avcodec_open2(c, codec, &opt);
 | 
			
		||||
    av_dict_free(&opt);
 | 
			
		||||
    ret = avcodec_open2(c, codec, NULL);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not open audio codec: %s\n", av_err2str(ret));
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* init signal generator */
 | 
			
		||||
    ost->t     = 0;
 | 
			
		||||
    ost->tincr = 2 * M_PI * 110.0 / c->sample_rate;
 | 
			
		||||
    t     = 0;
 | 
			
		||||
    tincr = 2 * M_PI * 110.0 / c->sample_rate;
 | 
			
		||||
    /* increment frequency by 110 Hz per second */
 | 
			
		||||
    ost->tincr2 = 2 * M_PI * 110.0 / c->sample_rate / c->sample_rate;
 | 
			
		||||
    tincr2 = 2 * M_PI * 110.0 / c->sample_rate / c->sample_rate;
 | 
			
		||||
 | 
			
		||||
    if (c->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)
 | 
			
		||||
        nb_samples = 10000;
 | 
			
		||||
    else
 | 
			
		||||
        nb_samples = c->frame_size;
 | 
			
		||||
    src_nb_samples = c->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE ?
 | 
			
		||||
        10000 : c->frame_size;
 | 
			
		||||
 | 
			
		||||
    ost->frame     = alloc_audio_frame(c->sample_fmt, c->channel_layout,
 | 
			
		||||
                                       c->sample_rate, nb_samples);
 | 
			
		||||
    ost->tmp_frame = alloc_audio_frame(AV_SAMPLE_FMT_S16, c->channel_layout,
 | 
			
		||||
                                       c->sample_rate, nb_samples);
 | 
			
		||||
    ret = av_samples_alloc_array_and_samples(&src_samples_data, &src_samples_linesize, c->channels,
 | 
			
		||||
                                             src_nb_samples, AV_SAMPLE_FMT_S16, 0);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate source samples\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;
 | 
			
		||||
 | 
			
		||||
    /* create resampler context */
 | 
			
		||||
        ost->swr_ctx = swr_alloc();
 | 
			
		||||
        if (!ost->swr_ctx) {
 | 
			
		||||
    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       (ost->swr_ctx, "in_channel_count",   c->channels,       0);
 | 
			
		||||
        av_opt_set_int       (ost->swr_ctx, "in_sample_rate",     c->sample_rate,    0);
 | 
			
		||||
        av_opt_set_sample_fmt(ost->swr_ctx, "in_sample_fmt",      AV_SAMPLE_FMT_S16, 0);
 | 
			
		||||
        av_opt_set_int       (ost->swr_ctx, "out_channel_count",  c->channels,       0);
 | 
			
		||||
        av_opt_set_int       (ost->swr_ctx, "out_sample_rate",    c->sample_rate,    0);
 | 
			
		||||
        av_opt_set_sample_fmt(ost->swr_ctx, "out_sample_fmt",     c->sample_fmt,     0);
 | 
			
		||||
        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(ost->swr_ctx)) < 0) {
 | 
			
		||||
        if ((ret = swr_init(swr_ctx)) < 0) {
 | 
			
		||||
            fprintf(stderr, "Failed to initialize the resampling context\n");
 | 
			
		||||
            exit(1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        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);
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        dst_samples_data = src_samples_data;
 | 
			
		||||
    }
 | 
			
		||||
    dst_samples_size = av_samples_get_buffer_size(NULL, c->channels, max_dst_nb_samples,
 | 
			
		||||
                                                  c->sample_fmt, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Prepare a 16 bit dummy audio frame of 'frame_size' samples and
 | 
			
		||||
 * 'nb_channels' channels. */
 | 
			
		||||
static AVFrame *get_audio_frame(OutputStream *ost)
 | 
			
		||||
static void get_audio_frame(int16_t *samples, int frame_size, int nb_channels)
 | 
			
		||||
{
 | 
			
		||||
    AVFrame *frame = ost->tmp_frame;
 | 
			
		||||
    int j, i, v;
 | 
			
		||||
    int16_t *q = (int16_t*)frame->data[0];
 | 
			
		||||
    int16_t *q;
 | 
			
		||||
 | 
			
		||||
    /* check if we want to generate more frames */
 | 
			
		||||
    if (av_compare_ts(ost->next_pts, ost->st->codec->time_base,
 | 
			
		||||
                      STREAM_DURATION, (AVRational){ 1, 1 }) >= 0)
 | 
			
		||||
        return NULL;
 | 
			
		||||
 | 
			
		||||
    for (j = 0; j <frame->nb_samples; j++) {
 | 
			
		||||
        v = (int)(sin(ost->t) * 10000);
 | 
			
		||||
        for (i = 0; i < ost->st->codec->channels; i++)
 | 
			
		||||
    q = samples;
 | 
			
		||||
    for (j = 0; j < frame_size; j++) {
 | 
			
		||||
        v = (int)(sin(t) * 10000);
 | 
			
		||||
        for (i = 0; i < nb_channels; i++)
 | 
			
		||||
            *q++ = v;
 | 
			
		||||
        ost->t     += ost->tincr;
 | 
			
		||||
        ost->tincr += ost->tincr2;
 | 
			
		||||
        t     += tincr;
 | 
			
		||||
        tincr += tincr2;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    frame->pts = ost->next_pts;
 | 
			
		||||
    ost->next_pts  += frame->nb_samples;
 | 
			
		||||
 | 
			
		||||
    return frame;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * encode one audio frame and send it to the muxer
 | 
			
		||||
 * return 1 when encoding is finished, 0 otherwise
 | 
			
		||||
 */
 | 
			
		||||
static int write_audio_frame(AVFormatContext *oc, OutputStream *ost)
 | 
			
		||||
static void write_audio_frame(AVFormatContext *oc, AVStream *st, int flush)
 | 
			
		||||
{
 | 
			
		||||
    AVCodecContext *c;
 | 
			
		||||
    AVPacket pkt = { 0 }; // data and size must be 0;
 | 
			
		||||
    AVFrame *frame;
 | 
			
		||||
    int ret;
 | 
			
		||||
    int got_packet;
 | 
			
		||||
    int dst_nb_samples;
 | 
			
		||||
    int got_packet, ret, dst_nb_samples;
 | 
			
		||||
 | 
			
		||||
    av_init_packet(&pkt);
 | 
			
		||||
    c = ost->st->codec;
 | 
			
		||||
    c = st->codec;
 | 
			
		||||
 | 
			
		||||
    frame = get_audio_frame(ost);
 | 
			
		||||
    if (!flush) {
 | 
			
		||||
        get_audio_frame((int16_t *)src_samples_data[0], src_nb_samples, c->channels);
 | 
			
		||||
 | 
			
		||||
    if (frame) {
 | 
			
		||||
        /* 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(ost->swr_ctx, c->sample_rate) + frame->nb_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);
 | 
			
		||||
            av_assert0(dst_nb_samples == frame->nb_samples);
 | 
			
		||||
 | 
			
		||||
        /* when we pass a frame to the encoder, it may keep a reference to it
 | 
			
		||||
         * internally;
 | 
			
		||||
         * make sure we do not overwrite it here
 | 
			
		||||
         */
 | 
			
		||||
        ret = av_frame_make_writable(ost->frame);
 | 
			
		||||
            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(ost->swr_ctx,
 | 
			
		||||
                              ost->frame->data, dst_nb_samples,
 | 
			
		||||
                              (const uint8_t **)frame->data, frame->nb_samples);
 | 
			
		||||
            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);
 | 
			
		||||
            }
 | 
			
		||||
            frame = ost->frame;
 | 
			
		||||
 | 
			
		||||
        frame->pts = av_rescale_q(ost->samples_count, (AVRational){1, c->sample_rate}, c->time_base);
 | 
			
		||||
        ost->samples_count += dst_nb_samples;
 | 
			
		||||
        } else {
 | 
			
		||||
            dst_nb_samples = src_nb_samples;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    ret = avcodec_encode_audio2(c, &pkt, frame, &got_packet);
 | 
			
		||||
        audio_frame->nb_samples = dst_nb_samples;
 | 
			
		||||
        audio_frame->pts = av_rescale_q(samples_count, (AVRational){1, c->sample_rate}, c->time_base);
 | 
			
		||||
        avcodec_fill_audio_frame(audio_frame, c->channels, c->sample_fmt,
 | 
			
		||||
                                 dst_samples_data[0], dst_samples_size, 0);
 | 
			
		||||
        samples_count += dst_nb_samples;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = avcodec_encode_audio2(c, &pkt, flush ? NULL : audio_frame, &got_packet);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Error encoding audio frame: %s\n", av_err2str(ret));
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (got_packet) {
 | 
			
		||||
        ret = write_frame(oc, &c->time_base, ost->st, &pkt);
 | 
			
		||||
    if (!got_packet) {
 | 
			
		||||
        if (flush)
 | 
			
		||||
            audio_is_eof = 1;
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = write_frame(oc, &c->time_base, st, &pkt);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Error while writing audio frame: %s\n",
 | 
			
		||||
                av_err2str(ret));
 | 
			
		||||
@@ -351,84 +322,75 @@ static int write_audio_frame(AVFormatContext *oc, OutputStream *ost)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    return (frame || got_packet) ? 0 : 1;
 | 
			
		||||
static void close_audio(AVFormatContext *oc, AVStream *st)
 | 
			
		||||
{
 | 
			
		||||
    avcodec_close(st->codec);
 | 
			
		||||
    if (dst_samples_data != src_samples_data) {
 | 
			
		||||
        av_free(dst_samples_data[0]);
 | 
			
		||||
        av_free(dst_samples_data);
 | 
			
		||||
    }
 | 
			
		||||
    av_free(src_samples_data[0]);
 | 
			
		||||
    av_free(src_samples_data);
 | 
			
		||||
    av_frame_free(&audio_frame);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**************************************************************/
 | 
			
		||||
/* video output */
 | 
			
		||||
 | 
			
		||||
static AVFrame *alloc_picture(enum AVPixelFormat pix_fmt, int width, int height)
 | 
			
		||||
{
 | 
			
		||||
    AVFrame *picture;
 | 
			
		||||
    int ret;
 | 
			
		||||
static AVFrame *frame;
 | 
			
		||||
static AVPicture src_picture, dst_picture;
 | 
			
		||||
static int frame_count;
 | 
			
		||||
 | 
			
		||||
    picture = av_frame_alloc();
 | 
			
		||||
    if (!picture)
 | 
			
		||||
        return NULL;
 | 
			
		||||
 | 
			
		||||
    picture->format = pix_fmt;
 | 
			
		||||
    picture->width  = width;
 | 
			
		||||
    picture->height = height;
 | 
			
		||||
 | 
			
		||||
    /* allocate the buffers for the frame data */
 | 
			
		||||
    ret = av_frame_get_buffer(picture, 32);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not allocate frame data.\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return picture;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void open_video(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg)
 | 
			
		||||
static void open_video(AVFormatContext *oc, AVCodec *codec, AVStream *st)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    AVCodecContext *c = ost->st->codec;
 | 
			
		||||
    AVDictionary *opt = NULL;
 | 
			
		||||
 | 
			
		||||
    av_dict_copy(&opt, opt_arg, 0);
 | 
			
		||||
    AVCodecContext *c = st->codec;
 | 
			
		||||
 | 
			
		||||
    /* open the codec */
 | 
			
		||||
    ret = avcodec_open2(c, codec, &opt);
 | 
			
		||||
    av_dict_free(&opt);
 | 
			
		||||
    ret = avcodec_open2(c, codec, NULL);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Could not open video codec: %s\n", av_err2str(ret));
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* allocate and init a re-usable frame */
 | 
			
		||||
    ost->frame = alloc_picture(c->pix_fmt, c->width, c->height);
 | 
			
		||||
    if (!ost->frame) {
 | 
			
		||||
    frame = av_frame_alloc();
 | 
			
		||||
    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;
 | 
			
		||||
 | 
			
		||||
    /* 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));
 | 
			
		||||
        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. */
 | 
			
		||||
    ost->tmp_frame = NULL;
 | 
			
		||||
    if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
 | 
			
		||||
        ost->tmp_frame = alloc_picture(AV_PIX_FMT_YUV420P, c->width, c->height);
 | 
			
		||||
        if (!ost->tmp_frame) {
 | 
			
		||||
            fprintf(stderr, "Could not allocate temporary picture\n");
 | 
			
		||||
        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));
 | 
			
		||||
            exit(1);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* copy data and linesize picture pointers to frame */
 | 
			
		||||
    *((AVPicture *)frame) = dst_picture;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Prepare a dummy image. */
 | 
			
		||||
static void fill_yuv_image(AVFrame *pict, int frame_index,
 | 
			
		||||
static void fill_yuv_image(AVPicture *pict, int frame_index,
 | 
			
		||||
                           int width, int height)
 | 
			
		||||
{
 | 
			
		||||
    int x, y, i, ret;
 | 
			
		||||
 | 
			
		||||
    /* when we pass a frame to the encoder, it may keep a reference to it
 | 
			
		||||
     * internally;
 | 
			
		||||
     * make sure we do not overwrite it here
 | 
			
		||||
     */
 | 
			
		||||
    ret = av_frame_make_writable(pict);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        exit(1);
 | 
			
		||||
    int x, y, i;
 | 
			
		||||
 | 
			
		||||
    i = frame_index;
 | 
			
		||||
 | 
			
		||||
@@ -446,89 +408,65 @@ static void fill_yuv_image(AVFrame *pict, int frame_index,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static AVFrame *get_video_frame(OutputStream *ost)
 | 
			
		||||
static void write_video_frame(AVFormatContext *oc, AVStream *st, int flush)
 | 
			
		||||
{
 | 
			
		||||
    AVCodecContext *c = ost->st->codec;
 | 
			
		||||
 | 
			
		||||
    /* check if we want to generate more frames */
 | 
			
		||||
    if (av_compare_ts(ost->next_pts, ost->st->codec->time_base,
 | 
			
		||||
                      STREAM_DURATION, (AVRational){ 1, 1 }) >= 0)
 | 
			
		||||
        return NULL;
 | 
			
		||||
    int ret;
 | 
			
		||||
    static struct SwsContext *sws_ctx;
 | 
			
		||||
    AVCodecContext *c = st->codec;
 | 
			
		||||
 | 
			
		||||
    if (!flush) {
 | 
			
		||||
        if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
 | 
			
		||||
            /* as we only generate a YUV420P picture, we must convert it
 | 
			
		||||
             * to the codec pixel format if needed */
 | 
			
		||||
        if (!ost->sws_ctx) {
 | 
			
		||||
            ost->sws_ctx = sws_getContext(c->width, c->height,
 | 
			
		||||
                                          AV_PIX_FMT_YUV420P,
 | 
			
		||||
                                          c->width, c->height,
 | 
			
		||||
                                          c->pix_fmt,
 | 
			
		||||
                                          SCALE_FLAGS, NULL, NULL, NULL);
 | 
			
		||||
            if (!ost->sws_ctx) {
 | 
			
		||||
            if (!sws_ctx) {
 | 
			
		||||
                sws_ctx = sws_getContext(c->width, c->height, AV_PIX_FMT_YUV420P,
 | 
			
		||||
                                         c->width, c->height, c->pix_fmt,
 | 
			
		||||
                                         sws_flags, NULL, NULL, NULL);
 | 
			
		||||
                if (!sws_ctx) {
 | 
			
		||||
                    fprintf(stderr,
 | 
			
		||||
                            "Could not initialize the conversion context\n");
 | 
			
		||||
                    exit(1);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        fill_yuv_image(ost->tmp_frame, ost->next_pts, c->width, c->height);
 | 
			
		||||
        sws_scale(ost->sws_ctx,
 | 
			
		||||
                  (const uint8_t * const *)ost->tmp_frame->data, ost->tmp_frame->linesize,
 | 
			
		||||
                  0, c->height, ost->frame->data, ost->frame->linesize);
 | 
			
		||||
            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);
 | 
			
		||||
        } else {
 | 
			
		||||
        fill_yuv_image(ost->frame, ost->next_pts, c->width, c->height);
 | 
			
		||||
            fill_yuv_image(&dst_picture, frame_count, c->width, c->height);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ost->frame->pts = ost->next_pts++;
 | 
			
		||||
 | 
			
		||||
    return ost->frame;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * encode one video frame and send it to the muxer
 | 
			
		||||
 * return 1 when encoding is finished, 0 otherwise
 | 
			
		||||
 */
 | 
			
		||||
static int write_video_frame(AVFormatContext *oc, OutputStream *ost)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    AVCodecContext *c;
 | 
			
		||||
    AVFrame *frame;
 | 
			
		||||
    int got_packet = 0;
 | 
			
		||||
 | 
			
		||||
    c = ost->st->codec;
 | 
			
		||||
 | 
			
		||||
    frame = get_video_frame(ost);
 | 
			
		||||
 | 
			
		||||
    if (oc->oformat->flags & AVFMT_RAWPICTURE) {
 | 
			
		||||
        /* a hack to avoid data copy with some raw video muxers */
 | 
			
		||||
    if (oc->oformat->flags & AVFMT_RAWPICTURE && !flush) {
 | 
			
		||||
        /* Raw video case - directly store the picture in the packet */
 | 
			
		||||
        AVPacket pkt;
 | 
			
		||||
        av_init_packet(&pkt);
 | 
			
		||||
 | 
			
		||||
        if (!frame)
 | 
			
		||||
            return 1;
 | 
			
		||||
 | 
			
		||||
        pkt.flags        |= AV_PKT_FLAG_KEY;
 | 
			
		||||
        pkt.stream_index  = ost->st->index;
 | 
			
		||||
        pkt.data          = (uint8_t *)frame;
 | 
			
		||||
        pkt.stream_index  = st->index;
 | 
			
		||||
        pkt.data          = dst_picture.data[0];
 | 
			
		||||
        pkt.size          = sizeof(AVPicture);
 | 
			
		||||
 | 
			
		||||
        pkt.pts = pkt.dts = frame->pts;
 | 
			
		||||
        av_packet_rescale_ts(&pkt, c->time_base, ost->st->time_base);
 | 
			
		||||
 | 
			
		||||
        ret = av_interleaved_write_frame(oc, &pkt);
 | 
			
		||||
    } else {
 | 
			
		||||
        AVPacket pkt = { 0 };
 | 
			
		||||
        int got_packet;
 | 
			
		||||
        av_init_packet(&pkt);
 | 
			
		||||
 | 
			
		||||
        /* encode the image */
 | 
			
		||||
        ret = avcodec_encode_video2(c, &pkt, frame, &got_packet);
 | 
			
		||||
        frame->pts = frame_count;
 | 
			
		||||
        ret = avcodec_encode_video2(c, &pkt, flush ? NULL : 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 (got_packet) {
 | 
			
		||||
            ret = write_frame(oc, &c->time_base, ost->st, &pkt);
 | 
			
		||||
            ret = write_frame(oc, &c->time_base, st, &pkt);
 | 
			
		||||
        } else {
 | 
			
		||||
            if (flush)
 | 
			
		||||
                video_is_eof = 1;
 | 
			
		||||
            ret = 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -537,17 +475,15 @@ static int write_video_frame(AVFormatContext *oc, OutputStream *ost)
 | 
			
		||||
        fprintf(stderr, "Error while writing video frame: %s\n", av_err2str(ret));
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return (frame || got_packet) ? 0 : 1;
 | 
			
		||||
    frame_count++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void close_stream(AVFormatContext *oc, OutputStream *ost)
 | 
			
		||||
static void close_video(AVFormatContext *oc, AVStream *st)
 | 
			
		||||
{
 | 
			
		||||
    avcodec_close(ost->st->codec);
 | 
			
		||||
    av_frame_free(&ost->frame);
 | 
			
		||||
    av_frame_free(&ost->tmp_frame);
 | 
			
		||||
    sws_freeContext(ost->sws_ctx);
 | 
			
		||||
    swr_free(&ost->swr_ctx);
 | 
			
		||||
    avcodec_close(st->codec);
 | 
			
		||||
    av_free(src_picture.data[0]);
 | 
			
		||||
    av_free(dst_picture.data[0]);
 | 
			
		||||
    av_frame_free(&frame);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**************************************************************/
 | 
			
		||||
@@ -555,20 +491,18 @@ static void close_stream(AVFormatContext *oc, OutputStream *ost)
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    OutputStream video_st = { 0 }, audio_st = { 0 };
 | 
			
		||||
    const char *filename;
 | 
			
		||||
    AVOutputFormat *fmt;
 | 
			
		||||
    AVFormatContext *oc;
 | 
			
		||||
    AVStream *audio_st, *video_st;
 | 
			
		||||
    AVCodec *audio_codec, *video_codec;
 | 
			
		||||
    int ret;
 | 
			
		||||
    int have_video = 0, have_audio = 0;
 | 
			
		||||
    int encode_video = 0, encode_audio = 0;
 | 
			
		||||
    AVDictionary *opt = NULL;
 | 
			
		||||
    double audio_time, video_time;
 | 
			
		||||
    int flush, ret;
 | 
			
		||||
 | 
			
		||||
    /* Initialize libavcodec, and register all codecs and formats. */
 | 
			
		||||
    av_register_all();
 | 
			
		||||
 | 
			
		||||
    if (argc < 2) {
 | 
			
		||||
    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"
 | 
			
		||||
@@ -580,9 +514,6 @@ int main(int argc, char **argv)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    filename = argv[1];
 | 
			
		||||
    if (argc > 3 && !strcmp(argv[2], "-flags")) {
 | 
			
		||||
        av_dict_set(&opt, argv[2]+1, argv[3], 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* allocate the output media context */
 | 
			
		||||
    avformat_alloc_output_context2(&oc, NULL, NULL, filename);
 | 
			
		||||
@@ -597,24 +528,20 @@ int main(int argc, char **argv)
 | 
			
		||||
 | 
			
		||||
    /* Add the audio and video streams using the default format codecs
 | 
			
		||||
     * and initialize the codecs. */
 | 
			
		||||
    if (fmt->video_codec != AV_CODEC_ID_NONE) {
 | 
			
		||||
        add_stream(&video_st, oc, &video_codec, fmt->video_codec);
 | 
			
		||||
        have_video = 1;
 | 
			
		||||
        encode_video = 1;
 | 
			
		||||
    }
 | 
			
		||||
    if (fmt->audio_codec != AV_CODEC_ID_NONE) {
 | 
			
		||||
        add_stream(&audio_st, oc, &audio_codec, fmt->audio_codec);
 | 
			
		||||
        have_audio = 1;
 | 
			
		||||
        encode_audio = 1;
 | 
			
		||||
    }
 | 
			
		||||
    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->audio_codec != AV_CODEC_ID_NONE)
 | 
			
		||||
        audio_st = add_stream(oc, &audio_codec, 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 (have_video)
 | 
			
		||||
        open_video(oc, video_codec, &video_st, opt);
 | 
			
		||||
 | 
			
		||||
    if (have_audio)
 | 
			
		||||
        open_audio(oc, audio_codec, &audio_st, opt);
 | 
			
		||||
    if (video_st)
 | 
			
		||||
        open_video(oc, video_codec, video_st);
 | 
			
		||||
    if (audio_st)
 | 
			
		||||
        open_audio(oc, audio_codec, audio_st);
 | 
			
		||||
 | 
			
		||||
    av_dump_format(oc, 0, filename, 1);
 | 
			
		||||
 | 
			
		||||
@@ -629,21 +556,30 @@ int main(int argc, char **argv)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Write the stream header, if any. */
 | 
			
		||||
    ret = avformat_write_header(oc, &opt);
 | 
			
		||||
    ret = avformat_write_header(oc, NULL);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "Error occurred when opening output file: %s\n",
 | 
			
		||||
                av_err2str(ret));
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    while (encode_video || encode_audio) {
 | 
			
		||||
        /* select the stream to encode */
 | 
			
		||||
        if (encode_video &&
 | 
			
		||||
            (!encode_audio || av_compare_ts(video_st.next_pts, video_st.st->codec->time_base,
 | 
			
		||||
                                            audio_st.next_pts, audio_st.st->codec->time_base) <= 0)) {
 | 
			
		||||
            encode_video = !write_video_frame(oc, &video_st);
 | 
			
		||||
        } else {
 | 
			
		||||
            encode_audio = !write_audio_frame(oc, &audio_st);
 | 
			
		||||
    flush = 0;
 | 
			
		||||
    while ((video_st && !video_is_eof) || (audio_st && !audio_is_eof)) {
 | 
			
		||||
        /* Compute current audio and video time. */
 | 
			
		||||
        audio_time = (audio_st && !audio_is_eof) ? audio_st->pts.val * av_q2d(audio_st->time_base) : INFINITY;
 | 
			
		||||
        video_time = (video_st && !video_is_eof) ? video_st->pts.val * av_q2d(video_st->time_base) : INFINITY;
 | 
			
		||||
 | 
			
		||||
        if (!flush &&
 | 
			
		||||
            (!audio_st || audio_time >= STREAM_DURATION) &&
 | 
			
		||||
            (!video_st || video_time >= STREAM_DURATION)) {
 | 
			
		||||
            flush = 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* write interleaved audio and video frames */
 | 
			
		||||
        if (audio_st && !audio_is_eof && audio_time <= video_time) {
 | 
			
		||||
            write_audio_frame(oc, audio_st, flush);
 | 
			
		||||
        } else if (video_st && !video_is_eof && video_time < audio_time) {
 | 
			
		||||
            write_video_frame(oc, video_st, flush);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -654,10 +590,10 @@ int main(int argc, char **argv)
 | 
			
		||||
    av_write_trailer(oc);
 | 
			
		||||
 | 
			
		||||
    /* Close each codec. */
 | 
			
		||||
    if (have_video)
 | 
			
		||||
        close_stream(oc, &video_st);
 | 
			
		||||
    if (have_audio)
 | 
			
		||||
        close_stream(oc, &audio_st);
 | 
			
		||||
    if (video_st)
 | 
			
		||||
        close_video(oc, video_st);
 | 
			
		||||
    if (audio_st)
 | 
			
		||||
        close_audio(oc, audio_st);
 | 
			
		||||
 | 
			
		||||
    if (!(fmt->flags & AVFMT_NOFILE))
 | 
			
		||||
        /* Close the output file. */
 | 
			
		||||
 
 | 
			
		||||
@@ -99,7 +99,6 @@ int main(int argc, char **argv)
 | 
			
		||||
            fprintf(stderr, "Failed to copy context from input to output stream codec context\n");
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
        out_stream->codec->codec_tag = 0;
 | 
			
		||||
        if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
 | 
			
		||||
            out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -168,7 +168,7 @@ int main(int argc, char **argv)
 | 
			
		||||
        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_freep(&dst_data[0]);
 | 
			
		||||
            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)
 | 
			
		||||
@@ -199,6 +199,7 @@ int main(int argc, char **argv)
 | 
			
		||||
            fmt, dst_ch_layout, dst_nb_channels, dst_rate, dst_filename);
 | 
			
		||||
 | 
			
		||||
end:
 | 
			
		||||
    if (dst_file)
 | 
			
		||||
        fclose(dst_file);
 | 
			
		||||
 | 
			
		||||
    if (src_data)
 | 
			
		||||
 
 | 
			
		||||
@@ -132,6 +132,7 @@ int main(int argc, char **argv)
 | 
			
		||||
           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]);
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,7 @@
 | 
			
		||||
 * @param error Error code to be converted
 | 
			
		||||
 * @return Corresponding error text (not thread-safe)
 | 
			
		||||
 */
 | 
			
		||||
static const char *get_error_text(const int error)
 | 
			
		||||
static char *const get_error_text(const int error)
 | 
			
		||||
{
 | 
			
		||||
    static char error_buffer[255];
 | 
			
		||||
    av_strerror(error, error_buffer, sizeof(error_buffer));
 | 
			
		||||
@@ -306,7 +306,7 @@ static int decode_audio_frame(AVFrame *frame,
 | 
			
		||||
 | 
			
		||||
    /** Read one audio frame from the input file into a temporary packet. */
 | 
			
		||||
    if ((error = av_read_frame(input_format_context, &input_packet)) < 0) {
 | 
			
		||||
        /** If we are at the end of the file, flush the decoder below. */
 | 
			
		||||
        /** If we are the the end of the file, flush the decoder below. */
 | 
			
		||||
        if (error == AVERROR_EOF)
 | 
			
		||||
            *finished = 1;
 | 
			
		||||
        else {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,583 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2010 Nicolas George
 | 
			
		||||
 * Copyright (c) 2011 Stefano Sabatini
 | 
			
		||||
 * Copyright (c) 2014 Andrey Utkin
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 * API example for demuxing, decoding, filtering, encoding and muxing
 | 
			
		||||
 * @example transcoding.c
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <libavcodec/avcodec.h>
 | 
			
		||||
#include <libavformat/avformat.h>
 | 
			
		||||
#include <libavfilter/avfiltergraph.h>
 | 
			
		||||
#include <libavfilter/avcodec.h>
 | 
			
		||||
#include <libavfilter/buffersink.h>
 | 
			
		||||
#include <libavfilter/buffersrc.h>
 | 
			
		||||
#include <libavutil/opt.h>
 | 
			
		||||
#include <libavutil/pixdesc.h>
 | 
			
		||||
 | 
			
		||||
static AVFormatContext *ifmt_ctx;
 | 
			
		||||
static AVFormatContext *ofmt_ctx;
 | 
			
		||||
typedef struct FilteringContext {
 | 
			
		||||
    AVFilterContext *buffersink_ctx;
 | 
			
		||||
    AVFilterContext *buffersrc_ctx;
 | 
			
		||||
    AVFilterGraph *filter_graph;
 | 
			
		||||
} FilteringContext;
 | 
			
		||||
static FilteringContext *filter_ctx;
 | 
			
		||||
 | 
			
		||||
static int open_input_file(const char *filename)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    unsigned int i;
 | 
			
		||||
 | 
			
		||||
    ifmt_ctx = NULL;
 | 
			
		||||
    if ((ret = avformat_open_input(&ifmt_ctx, filename, NULL, NULL)) < 0) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((ret = avformat_find_stream_info(ifmt_ctx, NULL)) < 0) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Cannot find stream information\n");
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < ifmt_ctx->nb_streams; i++) {
 | 
			
		||||
        AVStream *stream;
 | 
			
		||||
        AVCodecContext *codec_ctx;
 | 
			
		||||
        stream = ifmt_ctx->streams[i];
 | 
			
		||||
        codec_ctx = stream->codec;
 | 
			
		||||
        /* Reencode video & audio and remux subtitles etc. */
 | 
			
		||||
        if (codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO
 | 
			
		||||
                || codec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
 | 
			
		||||
            /* Open decoder */
 | 
			
		||||
            ret = avcodec_open2(codec_ctx,
 | 
			
		||||
                    avcodec_find_decoder(codec_ctx->codec_id), NULL);
 | 
			
		||||
            if (ret < 0) {
 | 
			
		||||
                av_log(NULL, AV_LOG_ERROR, "Failed to open decoder for stream #%u\n", i);
 | 
			
		||||
                return ret;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    av_dump_format(ifmt_ctx, 0, filename, 0);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int open_output_file(const char *filename)
 | 
			
		||||
{
 | 
			
		||||
    AVStream *out_stream;
 | 
			
		||||
    AVStream *in_stream;
 | 
			
		||||
    AVCodecContext *dec_ctx, *enc_ctx;
 | 
			
		||||
    AVCodec *encoder;
 | 
			
		||||
    int ret;
 | 
			
		||||
    unsigned int i;
 | 
			
		||||
 | 
			
		||||
    ofmt_ctx = NULL;
 | 
			
		||||
    avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, filename);
 | 
			
		||||
    if (!ofmt_ctx) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Could not create output context\n");
 | 
			
		||||
        return AVERROR_UNKNOWN;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < ifmt_ctx->nb_streams; i++) {
 | 
			
		||||
        out_stream = avformat_new_stream(ofmt_ctx, NULL);
 | 
			
		||||
        if (!out_stream) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Failed allocating output stream\n");
 | 
			
		||||
            return AVERROR_UNKNOWN;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        in_stream = ifmt_ctx->streams[i];
 | 
			
		||||
        dec_ctx = in_stream->codec;
 | 
			
		||||
        enc_ctx = out_stream->codec;
 | 
			
		||||
 | 
			
		||||
        if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO
 | 
			
		||||
                || dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
 | 
			
		||||
            /* in this example, we choose transcoding to same codec */
 | 
			
		||||
            encoder = avcodec_find_encoder(dec_ctx->codec_id);
 | 
			
		||||
            if (!encoder) {
 | 
			
		||||
                av_log(NULL, AV_LOG_FATAL, "Neccessary encoder not found\n");
 | 
			
		||||
                return AVERROR_INVALIDDATA;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            /* In this example, we transcode to same properties (picture size,
 | 
			
		||||
             * sample rate etc.). These properties can be changed for output
 | 
			
		||||
             * streams easily using filters */
 | 
			
		||||
            if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
 | 
			
		||||
                enc_ctx->height = dec_ctx->height;
 | 
			
		||||
                enc_ctx->width = dec_ctx->width;
 | 
			
		||||
                enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio;
 | 
			
		||||
                /* take first format from list of supported formats */
 | 
			
		||||
                enc_ctx->pix_fmt = encoder->pix_fmts[0];
 | 
			
		||||
                /* video time_base can be set to whatever is handy and supported by encoder */
 | 
			
		||||
                enc_ctx->time_base = dec_ctx->time_base;
 | 
			
		||||
            } else {
 | 
			
		||||
                enc_ctx->sample_rate = dec_ctx->sample_rate;
 | 
			
		||||
                enc_ctx->channel_layout = dec_ctx->channel_layout;
 | 
			
		||||
                enc_ctx->channels = av_get_channel_layout_nb_channels(enc_ctx->channel_layout);
 | 
			
		||||
                /* take first format from list of supported formats */
 | 
			
		||||
                enc_ctx->sample_fmt = encoder->sample_fmts[0];
 | 
			
		||||
                enc_ctx->time_base = (AVRational){1, enc_ctx->sample_rate};
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            /* Third parameter can be used to pass settings to encoder */
 | 
			
		||||
            ret = avcodec_open2(enc_ctx, encoder, NULL);
 | 
			
		||||
            if (ret < 0) {
 | 
			
		||||
                av_log(NULL, AV_LOG_ERROR, "Cannot open video encoder for stream #%u\n", i);
 | 
			
		||||
                return ret;
 | 
			
		||||
            }
 | 
			
		||||
        } else if (dec_ctx->codec_type == AVMEDIA_TYPE_UNKNOWN) {
 | 
			
		||||
            av_log(NULL, AV_LOG_FATAL, "Elementary stream #%d is of unknown type, cannot proceed\n", i);
 | 
			
		||||
            return AVERROR_INVALIDDATA;
 | 
			
		||||
        } else {
 | 
			
		||||
            /* if this stream must be remuxed */
 | 
			
		||||
            ret = avcodec_copy_context(ofmt_ctx->streams[i]->codec,
 | 
			
		||||
                    ifmt_ctx->streams[i]->codec);
 | 
			
		||||
            if (ret < 0) {
 | 
			
		||||
                av_log(NULL, AV_LOG_ERROR, "Copying stream context failed\n");
 | 
			
		||||
                return ret;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
 | 
			
		||||
            enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    av_dump_format(ofmt_ctx, 0, filename, 1);
 | 
			
		||||
 | 
			
		||||
    if (!(ofmt_ctx->oformat->flags & AVFMT_NOFILE)) {
 | 
			
		||||
        ret = avio_open(&ofmt_ctx->pb, filename, AVIO_FLAG_WRITE);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Could not open output file '%s'", filename);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* init muxer, write output file header */
 | 
			
		||||
    ret = avformat_write_header(ofmt_ctx, NULL);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Error occurred when opening output file\n");
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int init_filter(FilteringContext* fctx, AVCodecContext *dec_ctx,
 | 
			
		||||
        AVCodecContext *enc_ctx, const char *filter_spec)
 | 
			
		||||
{
 | 
			
		||||
    char args[512];
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    AVFilter *buffersrc = NULL;
 | 
			
		||||
    AVFilter *buffersink = NULL;
 | 
			
		||||
    AVFilterContext *buffersrc_ctx = NULL;
 | 
			
		||||
    AVFilterContext *buffersink_ctx = NULL;
 | 
			
		||||
    AVFilterInOut *outputs = avfilter_inout_alloc();
 | 
			
		||||
    AVFilterInOut *inputs  = avfilter_inout_alloc();
 | 
			
		||||
    AVFilterGraph *filter_graph = avfilter_graph_alloc();
 | 
			
		||||
 | 
			
		||||
    if (!outputs || !inputs || !filter_graph) {
 | 
			
		||||
        ret = AVERROR(ENOMEM);
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
 | 
			
		||||
        buffersrc = avfilter_get_by_name("buffer");
 | 
			
		||||
        buffersink = avfilter_get_by_name("buffersink");
 | 
			
		||||
        if (!buffersrc || !buffersink) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "filtering source or sink element not found\n");
 | 
			
		||||
            ret = AVERROR_UNKNOWN;
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        snprintf(args, sizeof(args),
 | 
			
		||||
                "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%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) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Cannot create buffer source\n");
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",
 | 
			
		||||
                NULL, NULL, filter_graph);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Cannot create buffer sink\n");
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ret = av_opt_set_bin(buffersink_ctx, "pix_fmts",
 | 
			
		||||
                (uint8_t*)&enc_ctx->pix_fmt, sizeof(enc_ctx->pix_fmt),
 | 
			
		||||
                AV_OPT_SEARCH_CHILDREN);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Cannot set output pixel format\n");
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
    } else if (dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
 | 
			
		||||
        buffersrc = avfilter_get_by_name("abuffer");
 | 
			
		||||
        buffersink = avfilter_get_by_name("abuffersink");
 | 
			
		||||
        if (!buffersrc || !buffersink) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "filtering source or sink element not found\n");
 | 
			
		||||
            ret = AVERROR_UNKNOWN;
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        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,
 | 
			
		||||
                dec_ctx->time_base.num, dec_ctx->time_base.den, dec_ctx->sample_rate,
 | 
			
		||||
                av_get_sample_fmt_name(dec_ctx->sample_fmt),
 | 
			
		||||
                dec_ctx->channel_layout);
 | 
			
		||||
        ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
 | 
			
		||||
                args, NULL, filter_graph);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer source\n");
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",
 | 
			
		||||
                NULL, NULL, filter_graph);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer sink\n");
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ret = av_opt_set_bin(buffersink_ctx, "sample_fmts",
 | 
			
		||||
                (uint8_t*)&enc_ctx->sample_fmt, sizeof(enc_ctx->sample_fmt),
 | 
			
		||||
                AV_OPT_SEARCH_CHILDREN);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Cannot set output sample format\n");
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ret = av_opt_set_bin(buffersink_ctx, "channel_layouts",
 | 
			
		||||
                (uint8_t*)&enc_ctx->channel_layout,
 | 
			
		||||
                sizeof(enc_ctx->channel_layout), AV_OPT_SEARCH_CHILDREN);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Cannot set output channel layout\n");
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ret = av_opt_set_bin(buffersink_ctx, "sample_rates",
 | 
			
		||||
                (uint8_t*)&enc_ctx->sample_rate, sizeof(enc_ctx->sample_rate),
 | 
			
		||||
                AV_OPT_SEARCH_CHILDREN);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Cannot set output sample rate\n");
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        ret = AVERROR_UNKNOWN;
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Endpoints for the filter graph. */
 | 
			
		||||
    outputs->name       = av_strdup("in");
 | 
			
		||||
    outputs->filter_ctx = buffersrc_ctx;
 | 
			
		||||
    outputs->pad_idx    = 0;
 | 
			
		||||
    outputs->next       = NULL;
 | 
			
		||||
 | 
			
		||||
    inputs->name       = av_strdup("out");
 | 
			
		||||
    inputs->filter_ctx = buffersink_ctx;
 | 
			
		||||
    inputs->pad_idx    = 0;
 | 
			
		||||
    inputs->next       = NULL;
 | 
			
		||||
 | 
			
		||||
    if (!outputs->name || !inputs->name) {
 | 
			
		||||
        ret = AVERROR(ENOMEM);
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((ret = avfilter_graph_parse_ptr(filter_graph, filter_spec,
 | 
			
		||||
                    &inputs, &outputs, NULL)) < 0)
 | 
			
		||||
        goto end;
 | 
			
		||||
 | 
			
		||||
    if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0)
 | 
			
		||||
        goto end;
 | 
			
		||||
 | 
			
		||||
    /* Fill FilteringContext */
 | 
			
		||||
    fctx->buffersrc_ctx = buffersrc_ctx;
 | 
			
		||||
    fctx->buffersink_ctx = buffersink_ctx;
 | 
			
		||||
    fctx->filter_graph = filter_graph;
 | 
			
		||||
 | 
			
		||||
end:
 | 
			
		||||
    avfilter_inout_free(&inputs);
 | 
			
		||||
    avfilter_inout_free(&outputs);
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int init_filters(void)
 | 
			
		||||
{
 | 
			
		||||
    const char *filter_spec;
 | 
			
		||||
    unsigned int i;
 | 
			
		||||
    int ret;
 | 
			
		||||
    filter_ctx = av_malloc_array(ifmt_ctx->nb_streams, sizeof(*filter_ctx));
 | 
			
		||||
    if (!filter_ctx)
 | 
			
		||||
        return AVERROR(ENOMEM);
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < ifmt_ctx->nb_streams; i++) {
 | 
			
		||||
        filter_ctx[i].buffersrc_ctx  = NULL;
 | 
			
		||||
        filter_ctx[i].buffersink_ctx = NULL;
 | 
			
		||||
        filter_ctx[i].filter_graph   = NULL;
 | 
			
		||||
        if (!(ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO
 | 
			
		||||
                || ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO))
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        if (ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
 | 
			
		||||
            filter_spec = "null"; /* passthrough (dummy) filter for video */
 | 
			
		||||
        else
 | 
			
		||||
            filter_spec = "anull"; /* passthrough (dummy) filter for audio */
 | 
			
		||||
        ret = init_filter(&filter_ctx[i], ifmt_ctx->streams[i]->codec,
 | 
			
		||||
                ofmt_ctx->streams[i]->codec, filter_spec);
 | 
			
		||||
        if (ret)
 | 
			
		||||
            return ret;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int encode_write_frame(AVFrame *filt_frame, unsigned int stream_index, int *got_frame) {
 | 
			
		||||
    int ret;
 | 
			
		||||
    int got_frame_local;
 | 
			
		||||
    AVPacket enc_pkt;
 | 
			
		||||
    int (*enc_func)(AVCodecContext *, AVPacket *, const AVFrame *, int *) =
 | 
			
		||||
        (ifmt_ctx->streams[stream_index]->codec->codec_type ==
 | 
			
		||||
         AVMEDIA_TYPE_VIDEO) ? avcodec_encode_video2 : avcodec_encode_audio2;
 | 
			
		||||
 | 
			
		||||
    if (!got_frame)
 | 
			
		||||
        got_frame = &got_frame_local;
 | 
			
		||||
 | 
			
		||||
    av_log(NULL, AV_LOG_INFO, "Encoding frame\n");
 | 
			
		||||
    /* encode filtered frame */
 | 
			
		||||
    enc_pkt.data = NULL;
 | 
			
		||||
    enc_pkt.size = 0;
 | 
			
		||||
    av_init_packet(&enc_pkt);
 | 
			
		||||
    ret = enc_func(ofmt_ctx->streams[stream_index]->codec, &enc_pkt,
 | 
			
		||||
            filt_frame, got_frame);
 | 
			
		||||
    av_frame_free(&filt_frame);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
    if (!(*got_frame))
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
    /* prepare packet for muxing */
 | 
			
		||||
    enc_pkt.stream_index = stream_index;
 | 
			
		||||
    av_packet_rescale_ts(&enc_pkt,
 | 
			
		||||
                         ofmt_ctx->streams[stream_index]->codec->time_base,
 | 
			
		||||
                         ofmt_ctx->streams[stream_index]->time_base);
 | 
			
		||||
 | 
			
		||||
    av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n");
 | 
			
		||||
    /* mux encoded frame */
 | 
			
		||||
    ret = av_interleaved_write_frame(ofmt_ctx, &enc_pkt);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int filter_encode_write_frame(AVFrame *frame, unsigned int stream_index)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    AVFrame *filt_frame;
 | 
			
		||||
 | 
			
		||||
    av_log(NULL, AV_LOG_INFO, "Pushing decoded frame to filters\n");
 | 
			
		||||
    /* push the decoded frame into the filtergraph */
 | 
			
		||||
    ret = av_buffersrc_add_frame_flags(filter_ctx[stream_index].buffersrc_ctx,
 | 
			
		||||
            frame, 0);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n");
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* pull filtered frames from the filtergraph */
 | 
			
		||||
    while (1) {
 | 
			
		||||
        filt_frame = av_frame_alloc();
 | 
			
		||||
        if (!filt_frame) {
 | 
			
		||||
            ret = AVERROR(ENOMEM);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        av_log(NULL, AV_LOG_INFO, "Pulling filtered frame from filters\n");
 | 
			
		||||
        ret = av_buffersink_get_frame(filter_ctx[stream_index].buffersink_ctx,
 | 
			
		||||
                filt_frame);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            /* if no more frames for output - returns AVERROR(EAGAIN)
 | 
			
		||||
             * if flushed and no more frames for output - returns AVERROR_EOF
 | 
			
		||||
             * rewrite retcode to 0 to show it as normal procedure completion
 | 
			
		||||
             */
 | 
			
		||||
            if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
 | 
			
		||||
                ret = 0;
 | 
			
		||||
            av_frame_free(&filt_frame);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        filt_frame->pict_type = AV_PICTURE_TYPE_NONE;
 | 
			
		||||
        ret = encode_write_frame(filt_frame, stream_index, NULL);
 | 
			
		||||
        if (ret < 0)
 | 
			
		||||
            break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int flush_encoder(unsigned int stream_index)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    int got_frame;
 | 
			
		||||
 | 
			
		||||
    if (!(ofmt_ctx->streams[stream_index]->codec->codec->capabilities &
 | 
			
		||||
                CODEC_CAP_DELAY))
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
    while (1) {
 | 
			
		||||
        av_log(NULL, AV_LOG_INFO, "Flushing stream #%u encoder\n", stream_index);
 | 
			
		||||
        ret = encode_write_frame(NULL, stream_index, &got_frame);
 | 
			
		||||
        if (ret < 0)
 | 
			
		||||
            break;
 | 
			
		||||
        if (!got_frame)
 | 
			
		||||
            return 0;
 | 
			
		||||
    }
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    AVPacket packet = { .data = NULL, .size = 0 };
 | 
			
		||||
    AVFrame *frame = NULL;
 | 
			
		||||
    enum AVMediaType type;
 | 
			
		||||
    unsigned int stream_index;
 | 
			
		||||
    unsigned int i;
 | 
			
		||||
    int got_frame;
 | 
			
		||||
    int (*dec_func)(AVCodecContext *, AVFrame *, int *, const AVPacket *);
 | 
			
		||||
 | 
			
		||||
    if (argc != 3) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Usage: %s <input file> <output file>\n", argv[0]);
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    av_register_all();
 | 
			
		||||
    avfilter_register_all();
 | 
			
		||||
 | 
			
		||||
    if ((ret = open_input_file(argv[1])) < 0)
 | 
			
		||||
        goto end;
 | 
			
		||||
    if ((ret = open_output_file(argv[2])) < 0)
 | 
			
		||||
        goto end;
 | 
			
		||||
    if ((ret = init_filters()) < 0)
 | 
			
		||||
        goto end;
 | 
			
		||||
 | 
			
		||||
    /* read all packets */
 | 
			
		||||
    while (1) {
 | 
			
		||||
        if ((ret = av_read_frame(ifmt_ctx, &packet)) < 0)
 | 
			
		||||
            break;
 | 
			
		||||
        stream_index = packet.stream_index;
 | 
			
		||||
        type = ifmt_ctx->streams[packet.stream_index]->codec->codec_type;
 | 
			
		||||
        av_log(NULL, AV_LOG_DEBUG, "Demuxer gave frame of stream_index %u\n",
 | 
			
		||||
                stream_index);
 | 
			
		||||
 | 
			
		||||
        if (filter_ctx[stream_index].filter_graph) {
 | 
			
		||||
            av_log(NULL, AV_LOG_DEBUG, "Going to reencode&filter the frame\n");
 | 
			
		||||
            frame = av_frame_alloc();
 | 
			
		||||
            if (!frame) {
 | 
			
		||||
                ret = AVERROR(ENOMEM);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            av_packet_rescale_ts(&packet,
 | 
			
		||||
                                 ifmt_ctx->streams[stream_index]->time_base,
 | 
			
		||||
                                 ifmt_ctx->streams[stream_index]->codec->time_base);
 | 
			
		||||
            dec_func = (type == AVMEDIA_TYPE_VIDEO) ? avcodec_decode_video2 :
 | 
			
		||||
                avcodec_decode_audio4;
 | 
			
		||||
            ret = dec_func(ifmt_ctx->streams[stream_index]->codec, frame,
 | 
			
		||||
                    &got_frame, &packet);
 | 
			
		||||
            if (ret < 0) {
 | 
			
		||||
                av_frame_free(&frame);
 | 
			
		||||
                av_log(NULL, AV_LOG_ERROR, "Decoding failed\n");
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (got_frame) {
 | 
			
		||||
                frame->pts = av_frame_get_best_effort_timestamp(frame);
 | 
			
		||||
                ret = filter_encode_write_frame(frame, stream_index);
 | 
			
		||||
                av_frame_free(&frame);
 | 
			
		||||
                if (ret < 0)
 | 
			
		||||
                    goto end;
 | 
			
		||||
            } else {
 | 
			
		||||
                av_frame_free(&frame);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            /* remux this frame without reencoding */
 | 
			
		||||
            av_packet_rescale_ts(&packet,
 | 
			
		||||
                                 ifmt_ctx->streams[stream_index]->time_base,
 | 
			
		||||
                                 ofmt_ctx->streams[stream_index]->time_base);
 | 
			
		||||
 | 
			
		||||
            ret = av_interleaved_write_frame(ofmt_ctx, &packet);
 | 
			
		||||
            if (ret < 0)
 | 
			
		||||
                goto end;
 | 
			
		||||
        }
 | 
			
		||||
        av_free_packet(&packet);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* flush filters and encoders */
 | 
			
		||||
    for (i = 0; i < ifmt_ctx->nb_streams; i++) {
 | 
			
		||||
        /* flush filter */
 | 
			
		||||
        if (!filter_ctx[i].filter_graph)
 | 
			
		||||
            continue;
 | 
			
		||||
        ret = filter_encode_write_frame(NULL, i);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Flushing filter failed\n");
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* flush encoder */
 | 
			
		||||
        ret = flush_encoder(i);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Flushing encoder failed\n");
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    av_write_trailer(ofmt_ctx);
 | 
			
		||||
end:
 | 
			
		||||
    av_free_packet(&packet);
 | 
			
		||||
    av_frame_free(&frame);
 | 
			
		||||
    for (i = 0; i < ifmt_ctx->nb_streams; i++) {
 | 
			
		||||
        avcodec_close(ifmt_ctx->streams[i]->codec);
 | 
			
		||||
        if (ofmt_ctx && ofmt_ctx->nb_streams > i && ofmt_ctx->streams[i] && ofmt_ctx->streams[i]->codec)
 | 
			
		||||
            avcodec_close(ofmt_ctx->streams[i]->codec);
 | 
			
		||||
        if (filter_ctx && filter_ctx[i].filter_graph)
 | 
			
		||||
            avfilter_graph_free(&filter_ctx[i].filter_graph);
 | 
			
		||||
    }
 | 
			
		||||
    av_free(filter_ctx);
 | 
			
		||||
    avformat_close_input(&ifmt_ctx);
 | 
			
		||||
    if (ofmt_ctx && !(ofmt_ctx->oformat->flags & AVFMT_NOFILE))
 | 
			
		||||
        avio_close(ofmt_ctx->pb);
 | 
			
		||||
    avformat_free_context(ofmt_ctx);
 | 
			
		||||
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Error occurred: %s\n", av_err2str(ret));
 | 
			
		||||
 | 
			
		||||
    return ret ? 1 : 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -298,7 +298,7 @@ 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 one to concatenate
 | 
			
		||||
A few multimedia containers (MPEG-1, MPEG-2 PS, DV) allow to concatenate
 | 
			
		||||
video by merely concatenating the files containing them.
 | 
			
		||||
 | 
			
		||||
Hence you may concatenate your multimedia files by first transcoding them to
 | 
			
		||||
@@ -392,7 +392,7 @@ 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 initially detected.
 | 
			
		||||
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
 | 
			
		||||
 
 | 
			
		||||
@@ -90,8 +90,7 @@ the following diagram:
 | 
			
		||||
                                      |         |
 | 
			
		||||
                                      | decoded |
 | 
			
		||||
                                      | frames  |
 | 
			
		||||
                                      |_________|
 | 
			
		||||
 ________             ______________       |
 | 
			
		||||
 ________             ______________  |_________|
 | 
			
		||||
|        |           |              |      |
 | 
			
		||||
| output | <-------- | encoded data | <----+
 | 
			
		||||
| file   |   muxer   | packets      |   encoder
 | 
			
		||||
@@ -124,16 +123,11 @@ the same type. In the above diagram they can be represented by simply inserting
 | 
			
		||||
an additional step between decoding and encoding:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
 _________                        ______________
 | 
			
		||||
|         |                      |              |
 | 
			
		||||
| decoded |                      | encoded data |
 | 
			
		||||
| frames  |\                   _ | packets      |
 | 
			
		||||
|_________| \                  /||______________|
 | 
			
		||||
             \   __________   /
 | 
			
		||||
  simple     _\||          | /  encoder
 | 
			
		||||
  filtergraph   | filtered |/
 | 
			
		||||
                | frames   |
 | 
			
		||||
                |__________|
 | 
			
		||||
 _________               __________              ______________
 | 
			
		||||
|         |  simple     |          |            |              |
 | 
			
		||||
| decoded |  fltrgrph   | filtered |  encoder   | encoded data |
 | 
			
		||||
| frames  | ----------> | frames   | ---------> | packets      |
 | 
			
		||||
|_________|             |__________|            |______________|
 | 
			
		||||
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@@ -272,13 +266,8 @@ ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
 | 
			
		||||
will copy all the streams except the second video, which will be encoded with
 | 
			
		||||
libx264, and the 138th audio, which will be encoded with libvorbis.
 | 
			
		||||
 | 
			
		||||
@item -t @var{duration} (@emph{input/output})
 | 
			
		||||
When used as an input option (before @code{-i}), limit the @var{duration} of
 | 
			
		||||
data read from the input file.
 | 
			
		||||
 | 
			
		||||
When used as an output option (before an output filename), stop writing the
 | 
			
		||||
output after its duration reaches @var{duration}.
 | 
			
		||||
 | 
			
		||||
@item -t @var{duration} (@emph{output})
 | 
			
		||||
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.
 | 
			
		||||
@@ -339,7 +328,7 @@ ffmpeg -i in.avi -metadata title="my title" out.flv
 | 
			
		||||
 | 
			
		||||
To set the language of the first audio stream:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
 | 
			
		||||
ffmpeg -i INPUT -metadata:s:a:1 language=eng OUTPUT
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item -target @var{type} (@emph{output})
 | 
			
		||||
@@ -360,7 +349,7 @@ ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item -dframes @var{number} (@emph{output})
 | 
			
		||||
Set the number of data frames to output. This is an alias for @code{-frames:d}.
 | 
			
		||||
Set the number of data frames to record. This is an alias for @code{-frames:d}.
 | 
			
		||||
 | 
			
		||||
@item -frames[:@var{stream_specifier}] @var{framecount} (@emph{output,per-stream})
 | 
			
		||||
Stop writing to the stream after @var{framecount} frames.
 | 
			
		||||
@@ -467,15 +456,12 @@ attachments.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -vframes @var{number} (@emph{output})
 | 
			
		||||
Set the number of video frames to output. This is an alias for @code{-frames:v}.
 | 
			
		||||
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}.
 | 
			
		||||
This is not the same as the @option{-framerate} option used for some input formats
 | 
			
		||||
like image2 or v4l2 (it used to be the same in older versions of FFmpeg).
 | 
			
		||||
If in doubt use @option{-framerate} instead of the input option @option{-r}.
 | 
			
		||||
 | 
			
		||||
As an output option, duplicate or drop input frames to achieve constant output
 | 
			
		||||
frame rate @var{fps}.
 | 
			
		||||
@@ -537,7 +523,7 @@ filter the stream.
 | 
			
		||||
This is an alias for @code{-filter:v}, see the @ref{filter_option,,-filter option}.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section Advanced Video options
 | 
			
		||||
@section Advanced Video Options
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -pix_fmt[:@var{stream_specifier}] @var{format} (@emph{input/output,per-stream})
 | 
			
		||||
@@ -651,14 +637,8 @@ Do not use any hardware acceleration (the default).
 | 
			
		||||
@item auto
 | 
			
		||||
Automatically select the hardware acceleration method.
 | 
			
		||||
 | 
			
		||||
@item vda
 | 
			
		||||
Use Apple VDA hardware acceleration.
 | 
			
		||||
 | 
			
		||||
@item vdpau
 | 
			
		||||
Use VDPAU (Video Decode and Presentation API for Unix) hardware acceleration.
 | 
			
		||||
 | 
			
		||||
@item dxva2
 | 
			
		||||
Use DXVA2 (DirectX Video Acceleration) hardware acceleration.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
This option has no effect if the selected hwaccel is not available or not
 | 
			
		||||
@@ -681,10 +661,6 @@ method chosen.
 | 
			
		||||
@item vdpau
 | 
			
		||||
For VDPAU, this option specifies the X11 display/screen to use. If this option
 | 
			
		||||
is not specified, the value of the @var{DISPLAY} environment variable is used
 | 
			
		||||
 | 
			
		||||
@item dxva2
 | 
			
		||||
For DXVA2, this option should contain the number of the display adapter to use.
 | 
			
		||||
If this option is not specified, the default adapter is used.
 | 
			
		||||
@end table
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@@ -692,7 +668,7 @@ If this option is not specified, the default adapter is used.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -aframes @var{number} (@emph{output})
 | 
			
		||||
Set the number of audio frames to output. This is an alias for @code{-frames:a}.
 | 
			
		||||
Set the number of audio frames to record. This is an alias for @code{-frames:a}.
 | 
			
		||||
@item -ar[:@var{stream_specifier}] @var{freq} (@emph{input/output,per-stream})
 | 
			
		||||
Set the audio sampling frequency. For output streams it is set by
 | 
			
		||||
default to the frequency of the corresponding input stream. For input
 | 
			
		||||
@@ -720,7 +696,7 @@ filter the stream.
 | 
			
		||||
This is an alias for @code{-filter:a}, see the @ref{filter_option,,-filter option}.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section Advanced Audio options
 | 
			
		||||
@section Advanced Audio options:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -atag @var{fourcc/tag} (@emph{output})
 | 
			
		||||
@@ -735,7 +711,7 @@ 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
 | 
			
		||||
@section Subtitle options:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -scodec @var{codec} (@emph{input/output})
 | 
			
		||||
@@ -746,7 +722,7 @@ Disable subtitle recording.
 | 
			
		||||
Deprecated, see -bsf
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section Advanced Subtitle options
 | 
			
		||||
@section Advanced Subtitle options:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@@ -824,11 +800,6 @@ To map all the streams except the second audio, use negative mappings
 | 
			
		||||
ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
To pick the English audio stream:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -map 0:m:language:eng OUTPUT
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Note that using this option disables the default mappings for this output file.
 | 
			
		||||
 | 
			
		||||
@item -map_channel [@var{input_file_id}.@var{stream_specifier}.@var{channel_id}|-1][:@var{output_file_id}.@var{stream_specifier}]
 | 
			
		||||
@@ -1016,12 +987,6 @@ 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.
 | 
			
		||||
 | 
			
		||||
@item -start_at_zero
 | 
			
		||||
When used with @option{copyts}, shift input timestamps so they start at zero.
 | 
			
		||||
 | 
			
		||||
This means that using e.g. @code{-ss 50} will make output timestamps start at
 | 
			
		||||
50 seconds, regardless of what timestamp the input file started at.
 | 
			
		||||
 | 
			
		||||
@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:
 | 
			
		||||
@@ -1160,30 +1125,6 @@ requested by @command{ffserver}.
 | 
			
		||||
The option is intended for cases where features are needed that cannot be
 | 
			
		||||
specified to @command{ffserver} but can be to @command{ffmpeg}.
 | 
			
		||||
 | 
			
		||||
@item -discard (@emph{input})
 | 
			
		||||
Allows discarding specific streams or frames of streams at the demuxer.
 | 
			
		||||
Not all demuxers support this.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item none
 | 
			
		||||
Discard no frame.
 | 
			
		||||
 | 
			
		||||
@item default
 | 
			
		||||
Default, which discards no frames.
 | 
			
		||||
 | 
			
		||||
@item noref
 | 
			
		||||
Discard all non-reference frames.
 | 
			
		||||
 | 
			
		||||
@item bidir
 | 
			
		||||
Discard all bidirectional frames.
 | 
			
		||||
 | 
			
		||||
@item nokey
 | 
			
		||||
Discard all frames excepts keyframes.
 | 
			
		||||
 | 
			
		||||
@item all
 | 
			
		||||
Discard all frames.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
As a special exception, you can use a bitmap subtitle stream as input: it
 | 
			
		||||
@@ -1464,11 +1405,11 @@ ffmpeg -f image2 -pattern_type glob -i 'foo-*.jpeg' -r 12 -s WxH foo.avi
 | 
			
		||||
You can put many streams of the same type in the output:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y 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.nut} will contain the first four streams
 | 
			
		||||
from the input files in reverse order.
 | 
			
		||||
The resulting output file @file{test12.avi} will contain first four streams from
 | 
			
		||||
the input file in reverse order.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
To force CBR video output:
 | 
			
		||||
 
 | 
			
		||||
@@ -37,14 +37,10 @@ Force displayed height.
 | 
			
		||||
Set frame size (WxH or abbreviation), needed for videos which do
 | 
			
		||||
not contain a header with the frame size like raw YUV.  This option
 | 
			
		||||
has been deprecated in favor of private options, try -video_size.
 | 
			
		||||
@item -fs
 | 
			
		||||
Start in fullscreen mode.
 | 
			
		||||
@item -an
 | 
			
		||||
Disable audio.
 | 
			
		||||
@item -vn
 | 
			
		||||
Disable video.
 | 
			
		||||
@item -sn
 | 
			
		||||
Disable subtitles.
 | 
			
		||||
@item -ss @var{pos}
 | 
			
		||||
Seek to a given position in seconds.
 | 
			
		||||
@item -t @var{duration}
 | 
			
		||||
@@ -88,9 +84,6 @@ output. In the filtergraph, the input is associated to the label
 | 
			
		||||
ffmpeg-filters manual for more information about the filtergraph
 | 
			
		||||
syntax.
 | 
			
		||||
 | 
			
		||||
You can specify this parameter multiple times and cycle through the specified
 | 
			
		||||
filtergraphs along with the show modes by pressing the key @key{w}.
 | 
			
		||||
 | 
			
		||||
@item -af @var{filtergraph}
 | 
			
		||||
@var{filtergraph} is a description of the filtergraph to apply to
 | 
			
		||||
the input audio.
 | 
			
		||||
@@ -113,10 +106,15 @@ 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}.
 | 
			
		||||
 | 
			
		||||
@item -bug
 | 
			
		||||
Work around bugs.
 | 
			
		||||
@item -fast
 | 
			
		||||
Non-spec-compliant optimizations.
 | 
			
		||||
@item -genpts
 | 
			
		||||
Generate pts.
 | 
			
		||||
@item -rtp_tcp
 | 
			
		||||
Force RTP/TCP protocol usage instead of RTP/UDP. It is only meaningful
 | 
			
		||||
if you are streaming with the RTSP protocol.
 | 
			
		||||
@item -sync @var{type}
 | 
			
		||||
Set the master clock to audio (@code{type=audio}), video
 | 
			
		||||
(@code{type=video}) or external (@code{type=ext}). Default is audio. The
 | 
			
		||||
@@ -125,8 +123,7 @@ players use audio as master clock, but in some cases (streaming or high
 | 
			
		||||
quality broadcast) it is necessary to change that. This option is mainly
 | 
			
		||||
used for debugging purposes.
 | 
			
		||||
@item -threads @var{count}
 | 
			
		||||
Set the thread count. By default, @command{ffplay} automatically detects a
 | 
			
		||||
suitable number of threads to use.
 | 
			
		||||
Set the thread count.
 | 
			
		||||
@item -ast @var{audio_stream_number}
 | 
			
		||||
Select the desired audio stream number, counting from 0. The number
 | 
			
		||||
refers to the list of all the input audio streams. If it is greater
 | 
			
		||||
@@ -162,22 +159,6 @@ Force a specific video decoder.
 | 
			
		||||
 | 
			
		||||
@item -scodec @var{codec_name}
 | 
			
		||||
Force a specific subtitle decoder.
 | 
			
		||||
 | 
			
		||||
@item -autorotate
 | 
			
		||||
Automatically rotate the video according to presentation metadata. Enabled by
 | 
			
		||||
default, use @option{-noautorotate} to disable it.
 | 
			
		||||
 | 
			
		||||
@item -framedrop
 | 
			
		||||
Drop video frames if video is out of sync. Enabled by default if the master
 | 
			
		||||
clock is not set to video. Use this option to enable frame dropping for all
 | 
			
		||||
master clock sources, use @option{-noframedrop} to disable it.
 | 
			
		||||
 | 
			
		||||
@item -infbuf
 | 
			
		||||
Do not limit the input buffer size, read as much data as possible from the
 | 
			
		||||
input as soon as possible. Enabled by default for realtime streams, where data
 | 
			
		||||
may be dropped if not read in time. Use this option to enable infinite buffers
 | 
			
		||||
for all inputs, use @option{-noinfbuf} to disable it.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section While playing
 | 
			
		||||
@@ -193,7 +174,7 @@ Toggle full screen.
 | 
			
		||||
Pause.
 | 
			
		||||
 | 
			
		||||
@item a
 | 
			
		||||
Cycle audio channel in the current program.
 | 
			
		||||
Cycle audio channel in the curret program.
 | 
			
		||||
 | 
			
		||||
@item v
 | 
			
		||||
Cycle video channel.
 | 
			
		||||
@@ -205,7 +186,7 @@ Cycle subtitle channel in the current program.
 | 
			
		||||
Cycle program.
 | 
			
		||||
 | 
			
		||||
@item w
 | 
			
		||||
Cycle video filters or show modes.
 | 
			
		||||
Show audio waves.
 | 
			
		||||
 | 
			
		||||
@item s
 | 
			
		||||
Step to the next frame.
 | 
			
		||||
 
 | 
			
		||||
@@ -119,10 +119,6 @@ Show payload data, as a hexadecimal and ASCII dump. Coupled with
 | 
			
		||||
 | 
			
		||||
The dump is printed as the "data" field. It may contain newlines.
 | 
			
		||||
 | 
			
		||||
@item -show_data_hash @var{algorithm}
 | 
			
		||||
Show a hash of payload data, for packets with @option{-show_packets} and for
 | 
			
		||||
codec extradata with @option{-show_streams}.
 | 
			
		||||
 | 
			
		||||
@item -show_error
 | 
			
		||||
Show information about the error found when trying to probe the input.
 | 
			
		||||
 | 
			
		||||
@@ -184,7 +180,7 @@ format : stream=codec_type
 | 
			
		||||
 | 
			
		||||
To show all the tags in the stream and format sections:
 | 
			
		||||
@example
 | 
			
		||||
stream_tags : format_tags
 | 
			
		||||
format_tags : format_tags
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
To show only the @code{title} tag (if available) in the stream
 | 
			
		||||
@@ -321,12 +317,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 -show_pixel_formats
 | 
			
		||||
Show information about all pixel formats supported by FFmpeg.
 | 
			
		||||
 | 
			
		||||
Pixel format information for each format is printed within a section
 | 
			
		||||
with name "PIXEL_FORMAT".
 | 
			
		||||
 | 
			
		||||
@item -bitexact
 | 
			
		||||
Force bitexact output, useful to produce output which is not dependent
 | 
			
		||||
on the specific build.
 | 
			
		||||
 
 | 
			
		||||
@@ -8,17 +8,15 @@
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="ffprobeType">
 | 
			
		||||
        <xsd:sequence>
 | 
			
		||||
            <xsd:element name="program_version"  type="ffprobe:programVersionType"  minOccurs="0" maxOccurs="1" />
 | 
			
		||||
            <xsd:element name="library_versions" type="ffprobe:libraryVersionsType" minOccurs="0" maxOccurs="1" />
 | 
			
		||||
            <xsd:element name="pixel_formats"    type="ffprobe:pixelFormatsType"    minOccurs="0" maxOccurs="1" />
 | 
			
		||||
            <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="packets_and_frames" type="ffprobe:packetsAndFramesType" minOccurs="0" maxOccurs="1" />
 | 
			
		||||
            <xsd:element name="programs" type="ffprobe:programsType" 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" />
 | 
			
		||||
            <xsd:element name="library_versions" type="ffprobe:libraryVersionsType" minOccurs="0" maxOccurs="1" />
 | 
			
		||||
        </xsd:sequence>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
@@ -37,16 +35,6 @@
 | 
			
		||||
        </xsd:sequence>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="packetsAndFramesType">
 | 
			
		||||
        <xsd:sequence>
 | 
			
		||||
            <xsd:choice minOccurs="0" maxOccurs="unbounded">
 | 
			
		||||
                <xsd:element name="packet" type="ffprobe:packetType" minOccurs="0" maxOccurs="unbounded"/>
 | 
			
		||||
                <xsd:element name="frame" type="ffprobe:frameType" minOccurs="0" maxOccurs="unbounded"/>
 | 
			
		||||
                <xsd:element name="subtitle" type="ffprobe:subtitleType" minOccurs="0" maxOccurs="unbounded"/>
 | 
			
		||||
            </xsd:choice>
 | 
			
		||||
        </xsd:sequence>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="packetType">
 | 
			
		||||
      <xsd:attribute name="codec_type"    type="xsd:string" use="required" />
 | 
			
		||||
      <xsd:attribute name="stream_index"  type="xsd:int" use="required" />
 | 
			
		||||
@@ -62,15 +50,9 @@
 | 
			
		||||
      <xsd:attribute name="pos"           type="xsd:long"  />
 | 
			
		||||
      <xsd:attribute name="flags"         type="xsd:string" use="required" />
 | 
			
		||||
      <xsd:attribute name="data"          type="xsd:string" />
 | 
			
		||||
      <xsd:attribute name="data_hash"     type="xsd:string" />
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="frameType">
 | 
			
		||||
      <xsd:sequence>
 | 
			
		||||
            <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
 | 
			
		||||
            <xsd:element name="side_data_list" type="ffprobe:frameSideDataListType"   minOccurs="0" maxOccurs="1" />
 | 
			
		||||
      </xsd:sequence>
 | 
			
		||||
 | 
			
		||||
      <xsd:attribute name="media_type"    type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="key_frame"     type="xsd:int"    use="required"/>
 | 
			
		||||
      <xsd:attribute name="pts"           type="xsd:long" />
 | 
			
		||||
@@ -105,16 +87,6 @@
 | 
			
		||||
      <xsd:attribute name="repeat_pict"            type="xsd:int"   />
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="frameSideDataListType">
 | 
			
		||||
        <xsd:sequence>
 | 
			
		||||
            <xsd:element name="side_data" type="ffprobe:frameSideDataType" minOccurs="1" maxOccurs="unbounded"/>
 | 
			
		||||
        </xsd:sequence>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
    <xsd:complexType name="frameSideDataType">
 | 
			
		||||
        <xsd:attribute name="side_data_type"              type="xsd:string"/>
 | 
			
		||||
        <xsd:attribute name="side_data_size"              type="xsd:int"   />
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="subtitleType">
 | 
			
		||||
      <xsd:attribute name="media_type"         type="xsd:string" fixed="subtitle" use="required"/>
 | 
			
		||||
      <xsd:attribute name="pts"                type="xsd:long" />
 | 
			
		||||
@@ -166,7 +138,6 @@
 | 
			
		||||
      <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" />
 | 
			
		||||
      <xsd:attribute name="extradata_hash"   type="xsd:string" />
 | 
			
		||||
 | 
			
		||||
      <!-- video attributes -->
 | 
			
		||||
      <xsd:attribute name="width"                type="xsd:int"/>
 | 
			
		||||
@@ -176,11 +147,6 @@
 | 
			
		||||
      <xsd:attribute name="display_aspect_ratio" type="xsd:string"/>
 | 
			
		||||
      <xsd:attribute name="pix_fmt"              type="xsd:string"/>
 | 
			
		||||
      <xsd:attribute name="level"                type="xsd:int"/>
 | 
			
		||||
      <xsd:attribute name="color_range"          type="xsd:string"/>
 | 
			
		||||
      <xsd:attribute name="color_space"          type="xsd:string"/>
 | 
			
		||||
      <xsd:attribute name="color_transfer"       type="xsd:string"/>
 | 
			
		||||
      <xsd:attribute name="color_primaries"      type="xsd:string"/>
 | 
			
		||||
      <xsd:attribute name="chroma_location"      type="xsd:string"/>
 | 
			
		||||
      <xsd:attribute name="timecode"             type="xsd:string"/>
 | 
			
		||||
 | 
			
		||||
      <!-- audio attributes -->
 | 
			
		||||
@@ -199,8 +165,6 @@
 | 
			
		||||
      <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="max_bit_rate"     type="xsd:int"/>
 | 
			
		||||
      <xsd:attribute name="bits_per_raw_sample" type="xsd:int"/>
 | 
			
		||||
      <xsd:attribute name="nb_frames"        type="xsd:int"/>
 | 
			
		||||
      <xsd:attribute name="nb_read_frames"   type="xsd:int"/>
 | 
			
		||||
      <xsd:attribute name="nb_read_packets"  type="xsd:int"/>
 | 
			
		||||
@@ -255,7 +219,8 @@
 | 
			
		||||
      <xsd:attribute name="copyright"        type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="build_date"       type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="build_time"       type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="compiler_ident"   type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="compiler_type"    type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="compiler_version" type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="configuration"    type="xsd:string" use="required"/>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
@@ -292,45 +257,4 @@
 | 
			
		||||
          <xsd:element name="library_version" type="ffprobe:libraryVersionType" minOccurs="0" maxOccurs="unbounded"/>
 | 
			
		||||
        </xsd:sequence>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="pixelFormatFlagsType">
 | 
			
		||||
      <xsd:attribute name="big_endian" type="xsd:int" use="required"/>
 | 
			
		||||
      <xsd:attribute name="palette"    type="xsd:int" use="required"/>
 | 
			
		||||
      <xsd:attribute name="bitstream"  type="xsd:int" use="required"/>
 | 
			
		||||
      <xsd:attribute name="hwaccel"    type="xsd:int" use="required"/>
 | 
			
		||||
      <xsd:attribute name="planar"     type="xsd:int" use="required"/>
 | 
			
		||||
      <xsd:attribute name="rgb"        type="xsd:int" use="required"/>
 | 
			
		||||
      <xsd:attribute name="pseudopal"  type="xsd:int" use="required"/>
 | 
			
		||||
      <xsd:attribute name="alpha"      type="xsd:int" use="required"/>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="pixelFormatComponentType">
 | 
			
		||||
      <xsd:attribute name="index"      type="xsd:int" use="required"/>
 | 
			
		||||
      <xsd:attribute name="bit_depth"  type="xsd:int" use="required"/>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="pixelFormatComponentsType">
 | 
			
		||||
      <xsd:sequence>
 | 
			
		||||
        <xsd:element name="component" type="ffprobe:pixelFormatComponentType" minOccurs="0" maxOccurs="unbounded"/>
 | 
			
		||||
      </xsd:sequence>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="pixelFormatType">
 | 
			
		||||
      <xsd:sequence>
 | 
			
		||||
        <xsd:element name="flags" type="ffprobe:pixelFormatFlagsType" minOccurs="0" maxOccurs="1"/>
 | 
			
		||||
        <xsd:element name="components" type="ffprobe:pixelFormatComponentsType" minOccurs="0" maxOccurs="1"/>
 | 
			
		||||
      </xsd:sequence>
 | 
			
		||||
 | 
			
		||||
      <xsd:attribute name="name"                type="xsd:string" use="required"/>
 | 
			
		||||
      <xsd:attribute name="nb_components"       type="xsd:int"    use="required"/>
 | 
			
		||||
      <xsd:attribute name="log2_chroma_w"       type="xsd:int"/>
 | 
			
		||||
      <xsd:attribute name="log2_chroma_h"       type="xsd:int"/>
 | 
			
		||||
      <xsd:attribute name="bits_per_pixel"      type="xsd:int"/>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
 | 
			
		||||
    <xsd:complexType name="pixelFormatsType">
 | 
			
		||||
      <xsd:sequence>
 | 
			
		||||
        <xsd:element name="pixel_format" type="ffprobe:pixelFormatType" minOccurs="0" maxOccurs="unbounded"/>
 | 
			
		||||
      </xsd:sequence>
 | 
			
		||||
    </xsd:complexType>
 | 
			
		||||
</xsd:schema>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,11 @@
 | 
			
		||||
# Port on which the server is listening. You must select a different
 | 
			
		||||
# port from your standard HTTP web server if it is running on the same
 | 
			
		||||
# computer.
 | 
			
		||||
HTTPPort 8090
 | 
			
		||||
Port 8090
 | 
			
		||||
 | 
			
		||||
# Address on which the server is bound. Only useful if you have
 | 
			
		||||
# several network interfaces.
 | 
			
		||||
HTTPBindAddress 0.0.0.0
 | 
			
		||||
BindAddress 0.0.0.0
 | 
			
		||||
 | 
			
		||||
# Number of simultaneous HTTP connections that can be handled. It has
 | 
			
		||||
# to be defined *before* the MaxClients parameter, since it defines the
 | 
			
		||||
 
 | 
			
		||||
@@ -66,12 +66,12 @@ http://@var{ffserver_ip_address}:@var{http_port}/@var{feed_name}
 | 
			
		||||
 | 
			
		||||
where @var{ffserver_ip_address} is the IP address of the machine where
 | 
			
		||||
@command{ffserver} is installed, @var{http_port} is the port number of
 | 
			
		||||
the HTTP server (configured through the @option{HTTPPort} option), and
 | 
			
		||||
the HTTP server (configured through the @option{Port} option), and
 | 
			
		||||
@var{feed_name} is the name of the corresponding feed defined in the
 | 
			
		||||
configuration file.
 | 
			
		||||
 | 
			
		||||
Each feed is associated to a file which is stored on disk. This stored
 | 
			
		||||
file is used to send pre-recorded data to a player as fast as
 | 
			
		||||
file is used to allow to send pre-recorded data to a player as fast as
 | 
			
		||||
possible when new content is added in real-time to the stream.
 | 
			
		||||
 | 
			
		||||
A "live-stream" or "stream" is a resource published by
 | 
			
		||||
@@ -101,7 +101,7 @@ http://@var{ffserver_ip_address}:@var{rtsp_port}/@var{stream_name}[@var{options}
 | 
			
		||||
the configuration file. @var{options} is a list of options specified
 | 
			
		||||
after the URL which affects how the stream is served by
 | 
			
		||||
@command{ffserver}. @var{http_port} and @var{rtsp_port} are the HTTP
 | 
			
		||||
and RTSP ports configured with the options @var{HTTPPort} and
 | 
			
		||||
and RTSP ports configured with the options @var{Port} and
 | 
			
		||||
@var{RTSPPort} respectively.
 | 
			
		||||
 | 
			
		||||
In case the stream is associated to a feed, the encoding parameters
 | 
			
		||||
@@ -203,9 +203,11 @@ WARNING: trying to stream test1.mpg doesn't work with WMP as it tries to
 | 
			
		||||
transfer the entire file before starting to play.
 | 
			
		||||
The same is true of AVI files.
 | 
			
		||||
 | 
			
		||||
You should edit the @file{ffserver.conf} file to suit your needs (in
 | 
			
		||||
terms of frame rates etc). Then install @command{ffserver} and
 | 
			
		||||
@command{ffmpeg}, write a script to start them up, and off you go.
 | 
			
		||||
@section What happens next?
 | 
			
		||||
 | 
			
		||||
You should edit the ffserver.conf file to suit your needs (in terms of
 | 
			
		||||
frame rates etc). Then install ffserver and ffmpeg, write a script to start
 | 
			
		||||
them up, and off you go.
 | 
			
		||||
 | 
			
		||||
@section What else can it do?
 | 
			
		||||
 | 
			
		||||
@@ -352,29 +354,20 @@ allow everybody else.
 | 
			
		||||
 | 
			
		||||
@section Global options
 | 
			
		||||
@table @option
 | 
			
		||||
@item HTTPPort @var{port_number}
 | 
			
		||||
@item Port @var{port_number}
 | 
			
		||||
@item RTSPPort @var{port_number}
 | 
			
		||||
 | 
			
		||||
@var{HTTPPort} sets the HTTP server listening TCP port number,
 | 
			
		||||
@var{RTSPPort} sets the RTSP server listening TCP port number.
 | 
			
		||||
 | 
			
		||||
@var{Port} is the equivalent of @var{HTTPPort} and is deprecated.
 | 
			
		||||
 | 
			
		||||
You must select a different port from your standard HTTP web server if
 | 
			
		||||
it is running on the same computer.
 | 
			
		||||
Set TCP port number on which the HTTP/RTSP server is listening. You
 | 
			
		||||
must select a different port from your standard HTTP web server if it
 | 
			
		||||
is running on the same computer.
 | 
			
		||||
 | 
			
		||||
If not specified, no corresponding server will be created.
 | 
			
		||||
 | 
			
		||||
@item HTTPBindAddress @var{ip_address}
 | 
			
		||||
@item BindAddress @var{ip_address}
 | 
			
		||||
@item RTSPBindAddress @var{ip_address}
 | 
			
		||||
Set address on which the HTTP/RTSP server is bound. Only useful if you
 | 
			
		||||
have several network interfaces.
 | 
			
		||||
 | 
			
		||||
@var{BindAddress} is the equivalent of @var{HTTPBindAddress} and is
 | 
			
		||||
deprecated.
 | 
			
		||||
 | 
			
		||||
@item MaxHTTPConnections @var{n}
 | 
			
		||||
Set number of simultaneous HTTP connections that can be handled. It
 | 
			
		||||
has to be defined @emph{before} the @option{MaxClients} parameter,
 | 
			
		||||
@@ -408,12 +401,6 @@ ignored, and the log is written to standard output.
 | 
			
		||||
Set no-daemon mode. This option is currently ignored since now
 | 
			
		||||
@command{ffserver} will always work in no-daemon mode, and is
 | 
			
		||||
deprecated.
 | 
			
		||||
 | 
			
		||||
@item UseDefaults
 | 
			
		||||
@item NoDefaults
 | 
			
		||||
Control whether default codec options are used for the all streams or not.
 | 
			
		||||
Each stream may overwrite this setting for its own. Default is @var{UseDefaults}.
 | 
			
		||||
The lastest occurrence overrides previous if multiple definitions.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section Feed section
 | 
			
		||||
@@ -577,11 +564,6 @@ deprecated in favor of @option{Metadata}.
 | 
			
		||||
@item Metadata @var{key} @var{value}
 | 
			
		||||
Set metadata value on the output stream.
 | 
			
		||||
 | 
			
		||||
@item UseDefaults
 | 
			
		||||
@item NoDefaults
 | 
			
		||||
Control whether default codec options are used for the stream or not.
 | 
			
		||||
Default is @var{UseDefaults} unless disabled globally.
 | 
			
		||||
 | 
			
		||||
@item NoAudio
 | 
			
		||||
@item NoVideo
 | 
			
		||||
Suppress audio/video.
 | 
			
		||||
@@ -600,9 +582,8 @@ Set sampling frequency for audio. When using low bitrates, you should
 | 
			
		||||
lower this frequency to 22050 or 11025. The supported frequencies
 | 
			
		||||
depend on the selected audio codec.
 | 
			
		||||
 | 
			
		||||
@item AVOptionAudio [@var{codec}:]@var{option} @var{value} (@emph{encoding,audio})
 | 
			
		||||
Set generic or private option for audio stream.
 | 
			
		||||
Private option must be prefixed with codec name or codec must be defined before.
 | 
			
		||||
@item AVOptionAudio @var{option} @var{value} (@emph{encoding,audio})
 | 
			
		||||
Set generic option for audio stream.
 | 
			
		||||
 | 
			
		||||
@item AVPresetAudio @var{preset} (@emph{encoding,audio})
 | 
			
		||||
Set preset for audio stream.
 | 
			
		||||
@@ -679,9 +660,8 @@ Set video @option{qdiff} encoding option.
 | 
			
		||||
@item DarkMask @var{float} (@emph{encoding,video})
 | 
			
		||||
Set @option{lumi_mask}/@option{dark_mask} encoding options.
 | 
			
		||||
 | 
			
		||||
@item AVOptionVideo [@var{codec}:]@var{option} @var{value} (@emph{encoding,video})
 | 
			
		||||
Set generic or private option for video stream.
 | 
			
		||||
Private option must be prefixed with codec name or codec must be defined before.
 | 
			
		||||
@item AVOptionVideo @var{option} @var{value} (@emph{encoding,video})
 | 
			
		||||
Set generic option for video stream.
 | 
			
		||||
 | 
			
		||||
@item AVPresetVideo @var{preset} (@emph{encoding,video})
 | 
			
		||||
Set preset for video stream.
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ 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 multiples, which are based on
 | 
			
		||||
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.
 | 
			
		||||
@@ -44,15 +44,8 @@ streams of this type.
 | 
			
		||||
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} or i:@var{stream_id}
 | 
			
		||||
Match the stream by stream id (e.g. PID in MPEG-TS container).
 | 
			
		||||
@item m:@var{key}[:@var{value}]
 | 
			
		||||
Matches streams with the metadata tag @var{key} having the specified value. If
 | 
			
		||||
@var{value} is not given, matches streams that contain the given tag with any
 | 
			
		||||
value.
 | 
			
		||||
 | 
			
		||||
Note that in @command{ffmpeg}, matching by metadata will only work properly for
 | 
			
		||||
input files.
 | 
			
		||||
@item #@var{stream_id}
 | 
			
		||||
Matches the stream by a format-specific ID.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section Generic options
 | 
			
		||||
@@ -103,10 +96,7 @@ Print detailed information about the filter name @var{filter_name}. Use the
 | 
			
		||||
Show version.
 | 
			
		||||
 | 
			
		||||
@item -formats
 | 
			
		||||
Show available formats (including devices).
 | 
			
		||||
 | 
			
		||||
@item -devices
 | 
			
		||||
Show available devices.
 | 
			
		||||
Show available formats.
 | 
			
		||||
 | 
			
		||||
@item -codecs
 | 
			
		||||
Show all codecs known to libavcodec.
 | 
			
		||||
@@ -141,22 +131,6 @@ Show channel names and standard channel layouts.
 | 
			
		||||
@item -colors
 | 
			
		||||
Show recognized color names.
 | 
			
		||||
 | 
			
		||||
@item -sources @var{device}[,@var{opt1}=@var{val1}[,@var{opt2}=@var{val2}]...]
 | 
			
		||||
Show autodetected sources of the intput device.
 | 
			
		||||
Some devices may provide system-dependent source names that cannot be autodetected.
 | 
			
		||||
The returned list cannot be assumed to be always complete.
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -sources pulse,server=192.168.0.4
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item -sinks @var{device}[,@var{opt1}=@var{val1}[,@var{opt2}=@var{val2}]...]
 | 
			
		||||
Show autodetected sinks of the output device.
 | 
			
		||||
Some devices may provide system-dependent sink names that cannot be autodetected.
 | 
			
		||||
The returned list cannot be assumed to be always complete.
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -sinks pulse,server=192.168.0.4
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@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
 | 
			
		||||
@@ -215,8 +189,6 @@ following option is recognized:
 | 
			
		||||
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{%}
 | 
			
		||||
@item level
 | 
			
		||||
set the log level
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Errors in parsing the environment variable are not fatal, and will not
 | 
			
		||||
@@ -253,14 +225,10 @@ Possible flags for this option are:
 | 
			
		||||
@item sse4.1
 | 
			
		||||
@item sse4.2
 | 
			
		||||
@item avx
 | 
			
		||||
@item avx2
 | 
			
		||||
@item xop
 | 
			
		||||
@item fma3
 | 
			
		||||
@item fma4
 | 
			
		||||
@item 3dnow
 | 
			
		||||
@item 3dnowext
 | 
			
		||||
@item bmi1
 | 
			
		||||
@item bmi2
 | 
			
		||||
@item cmov
 | 
			
		||||
@end table
 | 
			
		||||
@item ARM
 | 
			
		||||
@@ -271,13 +239,6 @@ Possible flags for this option are:
 | 
			
		||||
@item vfp
 | 
			
		||||
@item vfpv3
 | 
			
		||||
@item neon
 | 
			
		||||
@item setend
 | 
			
		||||
@end table
 | 
			
		||||
@item AArch64
 | 
			
		||||
@table @samp
 | 
			
		||||
@item armv8
 | 
			
		||||
@item vfp
 | 
			
		||||
@item neon
 | 
			
		||||
@end table
 | 
			
		||||
@item PowerPC
 | 
			
		||||
@table @samp
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2099
									
								
								doc/filters.texi
									
									
									
									
									
								
							
							
						
						
									
										2099
									
								
								doc/filters.texi
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -23,7 +23,7 @@ Reduce buffering.
 | 
			
		||||
 | 
			
		||||
@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 enable detecting more
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
@@ -55,10 +55,6 @@ Do not merge side data.
 | 
			
		||||
Enable RTP MP4A-LATM payload.
 | 
			
		||||
@item nobuffer
 | 
			
		||||
Reduce the latency introduced by optional buffering
 | 
			
		||||
@item bitexact
 | 
			
		||||
Only write platform-, build- and time-independent data.
 | 
			
		||||
This ensures that file and data checksums are reproducible and match between
 | 
			
		||||
platforms. Its primary use is for regression testing.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item seek2any @var{integer} (@emph{input})
 | 
			
		||||
@@ -67,7 +63,7 @@ Default is 0.
 | 
			
		||||
 | 
			
		||||
@item analyzeduration @var{integer} (@emph{input})
 | 
			
		||||
Specify how many microseconds are analyzed to probe the input. A
 | 
			
		||||
higher value will enable detecting more accurate information, but will
 | 
			
		||||
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})
 | 
			
		||||
@@ -172,18 +168,6 @@ The offset is added by the muxer to the output timestamps.
 | 
			
		||||
Specifying a positive offset means that the corresponding streams are
 | 
			
		||||
delayed bt the time duration specified in @var{offset}. Default value
 | 
			
		||||
is @code{0} (meaning that no offset is applied).
 | 
			
		||||
 | 
			
		||||
@item format_whitelist @var{list} (@emph{input})
 | 
			
		||||
"," separated List of allowed demuxers. By default all are allowed.
 | 
			
		||||
 | 
			
		||||
@item dump_separator @var{string} (@emph{input})
 | 
			
		||||
Separator used to separate the fields printed on the command line about the
 | 
			
		||||
Stream parameters.
 | 
			
		||||
For example to separate the fields with newlines and indention:
 | 
			
		||||
@example
 | 
			
		||||
ffprobe -dump_separator "
 | 
			
		||||
                          "  -i ~/videos/matrixbench_mpeg2.mpg
 | 
			
		||||
@end example
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@c man end FORMAT OPTIONS
 | 
			
		||||
 
 | 
			
		||||
@@ -130,7 +130,7 @@ Go to @url{http://x265.org/developers.html} and follow the instructions
 | 
			
		||||
for installing the library. Then pass @code{--enable-libx265} to configure
 | 
			
		||||
to enable it.
 | 
			
		||||
 | 
			
		||||
@float NOTE
 | 
			
		||||
@float note
 | 
			
		||||
x265 is under the GNU 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.
 | 
			
		||||
@@ -245,7 +245,6 @@ library:
 | 
			
		||||
    @tab Multimedia format used by Delphine Software games.
 | 
			
		||||
@item CD+G                      @tab   @tab X
 | 
			
		||||
    @tab Video format used by CD+G karaoke disks
 | 
			
		||||
@item Phantom Cine              @tab   @tab X
 | 
			
		||||
@item Commodore CDXL            @tab   @tab X
 | 
			
		||||
    @tab Amiga CD video format
 | 
			
		||||
@item Core Audio Format         @tab X @tab X
 | 
			
		||||
@@ -259,7 +258,6 @@ library:
 | 
			
		||||
@item Deluxe Paint Animation    @tab   @tab X
 | 
			
		||||
@item DFA                       @tab   @tab X
 | 
			
		||||
    @tab This format is used in Chronomaster game
 | 
			
		||||
@item DSD Stream File (DSF)     @tab   @tab X
 | 
			
		||||
@item DV video                  @tab X @tab X
 | 
			
		||||
@item DXA                       @tab   @tab X
 | 
			
		||||
    @tab This format is used in the non-Windows version of the Feeble Files
 | 
			
		||||
@@ -310,11 +308,9 @@ library:
 | 
			
		||||
    @tab Used by Linux Media Labs MPEG-4 PCI boards
 | 
			
		||||
@item LOAS                      @tab   @tab X
 | 
			
		||||
    @tab contains LATM multiplexed AAC audio
 | 
			
		||||
@item LRC                       @tab X @tab X
 | 
			
		||||
@item LVF                       @tab   @tab X
 | 
			
		||||
@item LXF                       @tab   @tab X
 | 
			
		||||
    @tab VR native stream format, used by Leitch/Harris' video servers.
 | 
			
		||||
@item Magic Lantern Video (MLV) @tab   @tab X
 | 
			
		||||
@item Matroska                  @tab X @tab X
 | 
			
		||||
@item Matroska audio            @tab X @tab
 | 
			
		||||
@item FFmpeg metadata           @tab X @tab X
 | 
			
		||||
@@ -454,7 +450,6 @@ library:
 | 
			
		||||
@item Sony Wave64 (W64)         @tab X @tab X
 | 
			
		||||
@item SoX native format         @tab X @tab X
 | 
			
		||||
@item SUN AU format             @tab X @tab X
 | 
			
		||||
@item SUP raw PGS subtitles     @tab   @tab X
 | 
			
		||||
@item Text files                @tab   @tab X
 | 
			
		||||
@item THP                       @tab   @tab X
 | 
			
		||||
    @tab Used on the Nintendo GameCube.
 | 
			
		||||
@@ -493,13 +488,11 @@ following image formats are supported:
 | 
			
		||||
@item Name @tab Encoding @tab Decoding @tab Comments
 | 
			
		||||
@item .Y.U.V       @tab X @tab X
 | 
			
		||||
    @tab one raw file per component
 | 
			
		||||
@item Alias PIX    @tab X @tab X
 | 
			
		||||
    @tab Alias/Wavefront PIX image format
 | 
			
		||||
@item animated GIF @tab X @tab X
 | 
			
		||||
@item BMP          @tab X @tab X
 | 
			
		||||
    @tab Microsoft BMP image
 | 
			
		||||
@item BRender PIX  @tab   @tab X
 | 
			
		||||
    @tab Argonaut BRender 3D engine image format.
 | 
			
		||||
@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
 | 
			
		||||
@@ -687,8 +680,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 SANM/Smush   @tab     @tab  X
 | 
			
		||||
    @tab Used in LucasArts games / SMUSH animations.
 | 
			
		||||
@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.
 | 
			
		||||
@@ -723,8 +716,6 @@ following image formats are supported:
 | 
			
		||||
    @tab fourcc: VP50
 | 
			
		||||
@item On2 VP6                @tab     @tab  X
 | 
			
		||||
    @tab fourcc: VP60,VP61,VP62
 | 
			
		||||
@item On2 VP7                @tab     @tab  X
 | 
			
		||||
    @tab fourcc: VP70,VP71
 | 
			
		||||
@item VP8                    @tab  E  @tab  X
 | 
			
		||||
    @tab fourcc: VP80, encoding supported through external library libvpx
 | 
			
		||||
@item VP9                    @tab  E  @tab  X
 | 
			
		||||
@@ -754,11 +745,11 @@ 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 Silicon Graphics RLE 8-bit video  @tab     @tab  X
 | 
			
		||||
@item Smacker video          @tab     @tab  X
 | 
			
		||||
    @tab Video encoding used in Smacker.
 | 
			
		||||
@item SMPTE VC-1             @tab     @tab  X
 | 
			
		||||
@@ -824,7 +815,7 @@ following image formats are supported:
 | 
			
		||||
    @tab encoding supported through external library libaacplus
 | 
			
		||||
@item AAC                    @tab  E  @tab  X
 | 
			
		||||
    @tab encoding supported through external library libfaac and libvo-aacenc
 | 
			
		||||
@item AC-3                   @tab IX  @tab  IX
 | 
			
		||||
@item AC-3                   @tab IX  @tab  X
 | 
			
		||||
@item ADPCM 4X Movie         @tab     @tab  X
 | 
			
		||||
@item ADPCM CDROM XA         @tab     @tab  X
 | 
			
		||||
@item ADPCM Creative Technology @tab     @tab  X
 | 
			
		||||
@@ -868,8 +859,6 @@ following image formats are supported:
 | 
			
		||||
@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
 | 
			
		||||
@item ADPCM VIMA
 | 
			
		||||
    @tab Used in LucasArts SMUSH animations.
 | 
			
		||||
@item ADPCM Westwood Studios IMA @tab     @tab  X
 | 
			
		||||
    @tab Used in Westwood Studios games like Command and Conquer.
 | 
			
		||||
@item ADPCM Yamaha           @tab  X  @tab  X
 | 
			
		||||
@@ -902,10 +891,6 @@ following image formats are supported:
 | 
			
		||||
@item DPCM Sol               @tab     @tab  X
 | 
			
		||||
@item DPCM Xan               @tab     @tab  X
 | 
			
		||||
    @tab Used in Origin's Wing Commander IV AVI files.
 | 
			
		||||
@item DSD (Direct Stream Digitial), least significant bit first  @tab  @tab  X
 | 
			
		||||
@item DSD (Direct Stream Digitial), most significant bit first   @tab  @tab  X
 | 
			
		||||
@item DSD (Direct Stream Digitial), least significant bit first, planar  @tab  @tab  X
 | 
			
		||||
@item DSD (Direct Stream Digitial), most significant bit first, planar   @tab  @tab  X
 | 
			
		||||
@item DSP Group TrueSpeech   @tab     @tab  X
 | 
			
		||||
@item DV audio               @tab     @tab  X
 | 
			
		||||
@item Enhanced AC-3          @tab  X  @tab  X
 | 
			
		||||
@@ -928,16 +913,15 @@ following image formats are supported:
 | 
			
		||||
@item Monkey's Audio         @tab     @tab  X
 | 
			
		||||
@item MP1 (MPEG audio layer 1)  @tab     @tab IX
 | 
			
		||||
@item MP2 (MPEG audio layer 2)  @tab IX  @tab IX
 | 
			
		||||
    @tab encoding supported also through external library TwoLAME
 | 
			
		||||
    @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 On2 AVC (Audio for Video Codec) @tab     @tab  X
 | 
			
		||||
@item Opus                   @tab  E  @tab  X
 | 
			
		||||
    @tab encoding supported through external library libopus
 | 
			
		||||
@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
 | 
			
		||||
@@ -1031,7 +1015,6 @@ performance on systems without hardware floating point support).
 | 
			
		||||
@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 Spruce format (STL) @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
 | 
			
		||||
@@ -1039,7 +1022,7 @@ performance on systems without hardware floating point support).
 | 
			
		||||
@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 X @tab X
 | 
			
		||||
@item WebVTT           @tab X @tab X @tab   @tab X
 | 
			
		||||
@item XSUB             @tab   @tab   @tab X @tab X
 | 
			
		||||
@end multitable
 | 
			
		||||
 | 
			
		||||
@@ -1057,7 +1040,6 @@ performance on systems without hardware floating point support).
 | 
			
		||||
@item HLS          @tab X
 | 
			
		||||
@item HTTP         @tab X
 | 
			
		||||
@item HTTPS        @tab X
 | 
			
		||||
@item Icecast      @tab X
 | 
			
		||||
@item MMSH         @tab X
 | 
			
		||||
@item MMST         @tab X
 | 
			
		||||
@item pipe         @tab X
 | 
			
		||||
@@ -1068,7 +1050,6 @@ performance on systems without hardware floating point support).
 | 
			
		||||
@item RTMPTE       @tab X
 | 
			
		||||
@item RTMPTS       @tab X
 | 
			
		||||
@item RTP          @tab X
 | 
			
		||||
@item SAMBA        @tab E
 | 
			
		||||
@item SCTP         @tab X
 | 
			
		||||
@item SFTP         @tab E
 | 
			
		||||
@item TCP          @tab X
 | 
			
		||||
@@ -1102,7 +1083,6 @@ performance on systems without hardware floating point support).
 | 
			
		||||
@item Video4Linux2      @tab X      @tab X
 | 
			
		||||
@item VfW capture       @tab X      @tab
 | 
			
		||||
@item X11 grabbing      @tab X      @tab
 | 
			
		||||
@item Win32 grabbing    @tab X      @tab
 | 
			
		||||
@end multitable
 | 
			
		||||
 | 
			
		||||
@code{X} means that input/output is supported.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										282
									
								
								doc/indevs.texi
									
									
									
									
									
								
							
							
						
						
									
										282
									
								
								doc/indevs.texi
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
			
		||||
@chapter Input Devices
 | 
			
		||||
@c man begin INPUT DEVICES
 | 
			
		||||
 | 
			
		||||
Input devices are configured elements in FFmpeg which enable accessing
 | 
			
		||||
Input devices are configured elements in FFmpeg which allow to access
 | 
			
		||||
the data coming from a multimedia device attached to your system.
 | 
			
		||||
 | 
			
		||||
When you configure your FFmpeg build, all the supported input devices
 | 
			
		||||
@@ -13,8 +13,8 @@ You can disable all the input devices using the configure option
 | 
			
		||||
option "--enable-indev=@var{INDEV}", or you can disable a particular
 | 
			
		||||
input device using the option "--disable-indev=@var{INDEV}".
 | 
			
		||||
 | 
			
		||||
The option "-devices" of the ff* tools will display the list of
 | 
			
		||||
supported input devices.
 | 
			
		||||
The option "-formats" of the ff* tools will display the list of
 | 
			
		||||
supported input devices (amongst the demuxers).
 | 
			
		||||
 | 
			
		||||
A description of the currently available input devices follows.
 | 
			
		||||
 | 
			
		||||
@@ -51,101 +51,6 @@ ffmpeg -f alsa -i hw:0 alsaout.wav
 | 
			
		||||
For more information see:
 | 
			
		||||
@url{http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html}
 | 
			
		||||
 | 
			
		||||
@section avfoundation
 | 
			
		||||
 | 
			
		||||
AVFoundation input device.
 | 
			
		||||
 | 
			
		||||
AVFoundation is the currently recommended framework by Apple for streamgrabbing on OSX >= 10.7 as well as on iOS.
 | 
			
		||||
The older QTKit framework has been marked deprecated since OSX version 10.7.
 | 
			
		||||
 | 
			
		||||
The input filename has to be given in the following syntax:
 | 
			
		||||
@example
 | 
			
		||||
-i "[[VIDEO]:[AUDIO]]"
 | 
			
		||||
@end example
 | 
			
		||||
The first entry selects the video input while the latter selects the audio input.
 | 
			
		||||
The stream has to be specified by the device name or the device index as shown by the device list.
 | 
			
		||||
Alternatively, the video and/or audio input device can be chosen by index using the
 | 
			
		||||
@option{
 | 
			
		||||
    -video_device_index <INDEX>
 | 
			
		||||
}
 | 
			
		||||
and/or
 | 
			
		||||
@option{
 | 
			
		||||
    -audio_device_index <INDEX>
 | 
			
		||||
}
 | 
			
		||||
, overriding any
 | 
			
		||||
device name or index given in the input filename.
 | 
			
		||||
 | 
			
		||||
All available devices can be enumerated by using @option{-list_devices true}, listing
 | 
			
		||||
all device names and corresponding indices.
 | 
			
		||||
 | 
			
		||||
There are two device name aliases:
 | 
			
		||||
@table @code
 | 
			
		||||
 | 
			
		||||
@item default
 | 
			
		||||
Select the AVFoundation default device of the corresponding type.
 | 
			
		||||
 | 
			
		||||
@item none
 | 
			
		||||
Do not record the corresponding media type.
 | 
			
		||||
This is equivalent to specifying an empty device name or index.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
AVFoundation supports the following options:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item -list_devices <TRUE|FALSE>
 | 
			
		||||
If set to true, a list of all available input devices is given showing all
 | 
			
		||||
device names and indices.
 | 
			
		||||
 | 
			
		||||
@item -video_device_index <INDEX>
 | 
			
		||||
Specify the video device by its index. Overrides anything given in the input filename.
 | 
			
		||||
 | 
			
		||||
@item -audio_device_index <INDEX>
 | 
			
		||||
Specify the audio device by its index. Overrides anything given in the input filename.
 | 
			
		||||
 | 
			
		||||
@item -pixel_format <FORMAT>
 | 
			
		||||
Request the video device to use a specific pixel format.
 | 
			
		||||
If the specified format is not supported, a list of available formats is given
 | 
			
		||||
und the first one in this list is used instead. Available pixel formats are:
 | 
			
		||||
@code{monob, rgb555be, rgb555le, rgb565be, rgb565le, rgb24, bgr24, 0rgb, bgr0, 0bgr, rgb0,
 | 
			
		||||
 bgr48be, uyvy422, yuva444p, yuva444p16le, yuv444p, yuv422p16, yuv422p10, yuv444p10,
 | 
			
		||||
 yuv420p, nv12, yuyv422, gray}
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Examples
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Print the list of AVFoundation supported devices and exit:
 | 
			
		||||
@example
 | 
			
		||||
$ ffmpeg -f avfoundation -list_devices true -i ""
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Record video from video device 0 and audio from audio device 0 into out.avi:
 | 
			
		||||
@example
 | 
			
		||||
$ ffmpeg -f avfoundation -i "0:0" out.avi
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Record video from video device 2 and audio from audio device 1 into out.avi:
 | 
			
		||||
@example
 | 
			
		||||
$ ffmpeg -f avfoundation -video_device_index 2 -i ":1" out.avi
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Record video from the system default video device using the pixel format bgr0 and do not record any audio into out.avi:
 | 
			
		||||
@example
 | 
			
		||||
$ ffmpeg -f avfoundation -pixel_format bgr0 -i "default:none" out.avi
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
@section bktr
 | 
			
		||||
 | 
			
		||||
BSD video input device.
 | 
			
		||||
@@ -287,81 +192,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 gdigrab
 | 
			
		||||
 | 
			
		||||
Win32 GDI-based screen capture device.
 | 
			
		||||
 | 
			
		||||
This device allows you to capture a region of the display on Windows.
 | 
			
		||||
 | 
			
		||||
There are two options for the input filename:
 | 
			
		||||
@example
 | 
			
		||||
desktop
 | 
			
		||||
@end example
 | 
			
		||||
or
 | 
			
		||||
@example
 | 
			
		||||
title=@var{window_title}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
The first option will capture the entire desktop, or a fixed region of the
 | 
			
		||||
desktop. The second option will instead capture the contents of a single
 | 
			
		||||
window, regardless of its position on the screen.
 | 
			
		||||
 | 
			
		||||
For example, to grab the entire desktop using @command{ffmpeg}:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f gdigrab -framerate 6 -i desktop out.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Grab a 640x480 region at position @code{10,20}:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f gdigrab -framerate 6 -offset_x 10 -offset_y 20 -video_size vga -i desktop out.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Grab the contents of the window named "Calculator"
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f gdigrab -framerate 6 -i title=Calculator out.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item draw_mouse
 | 
			
		||||
Specify whether to draw the mouse pointer. Use the value @code{0} to
 | 
			
		||||
not draw the pointer. Default value is @code{1}.
 | 
			
		||||
 | 
			
		||||
@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.
 | 
			
		||||
 | 
			
		||||
Note that @var{show_region} is incompatible with grabbing the contents
 | 
			
		||||
of a single window.
 | 
			
		||||
 | 
			
		||||
For example:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f gdigrab -show_region 1 -framerate 6 -video_size cif -offset_x 10 -offset_y 20 -i desktop out.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item video_size
 | 
			
		||||
Set the video frame size. The default is to capture the full screen if @file{desktop} is selected, or the full window size if @file{title=@var{window_title}} is selected.
 | 
			
		||||
 | 
			
		||||
@item offset_x
 | 
			
		||||
When capturing a region with @var{video_size}, set the distance from the left edge of the screen or desktop.
 | 
			
		||||
 | 
			
		||||
Note that the offset calculation is from the top left corner of the primary monitor on Windows. If you have a monitor positioned to the left of your primary monitor, you will need to use a negative @var{offset_x} value to move the region to that monitor.
 | 
			
		||||
 | 
			
		||||
@item offset_y
 | 
			
		||||
When capturing a region with @var{video_size}, set the distance from the top edge of the screen or desktop.
 | 
			
		||||
 | 
			
		||||
Note that the offset calculation is from the top left corner of the primary monitor on Windows. If you have a monitor positioned above your primary monitor, you will need to use a negative @var{offset_y} value to move the region to that monitor.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section iec61883
 | 
			
		||||
 | 
			
		||||
FireWire DV/HDV input device using libiec61883.
 | 
			
		||||
@@ -543,28 +373,10 @@ ffplay -f lavfi "movie=test.avi[out0];amovie=test.wav[out1]"
 | 
			
		||||
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
@section libcdio
 | 
			
		||||
 | 
			
		||||
Audio-CD input device based on cdio.
 | 
			
		||||
 | 
			
		||||
To enable this input device during configuration you need libcdio
 | 
			
		||||
installed on your system. Requires the configure option
 | 
			
		||||
@code{--enable-libcdio}.
 | 
			
		||||
 | 
			
		||||
This device allows playing and grabbing from an Audio-CD.
 | 
			
		||||
 | 
			
		||||
For example to copy with @command{ffmpeg} the entire Audio-CD in /dev/sr0,
 | 
			
		||||
you may run the command:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f libcdio -i /dev/sr0 cd.wav
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section libdc1394
 | 
			
		||||
 | 
			
		||||
IIDC1394 input device, based on libdc1394 and libraw1394.
 | 
			
		||||
 | 
			
		||||
Requires the configure option @code{--enable-libdc1394}.
 | 
			
		||||
 | 
			
		||||
@section openal
 | 
			
		||||
 | 
			
		||||
The OpenAL input device provides audio capture on all systems with a
 | 
			
		||||
@@ -719,33 +531,6 @@ Record a stream from default device:
 | 
			
		||||
ffmpeg -f pulse -i default /tmp/pulse.wav
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section qtkit
 | 
			
		||||
 | 
			
		||||
QTKit input device.
 | 
			
		||||
 | 
			
		||||
The filename passed as input is parsed to contain either a device name or index.
 | 
			
		||||
The device index can also be given by using -video_device_index.
 | 
			
		||||
A given device index will override any given device name.
 | 
			
		||||
If the desired device consists of numbers only, use -video_device_index to identify it.
 | 
			
		||||
The default device will be chosen if an empty string  or the device name "default" is given.
 | 
			
		||||
The available devices can be enumerated by using -list_devices.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f qtkit -i "0" out.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f qtkit -video_device_index 0 -i "" out.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f qtkit -i "default" out.mpg
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f qtkit -list_devices true -i ""
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section sndio
 | 
			
		||||
 | 
			
		||||
sndio input device.
 | 
			
		||||
@@ -893,9 +678,6 @@ other filename will be interpreted as device number 0.
 | 
			
		||||
 | 
			
		||||
X11 video input device.
 | 
			
		||||
 | 
			
		||||
Depends on X11, Xext, and Xfixes. Requires the configure option
 | 
			
		||||
@code{--enable-x11grab}.
 | 
			
		||||
 | 
			
		||||
This device allows one to capture a region of an X11 display.
 | 
			
		||||
 | 
			
		||||
The filename passed as input has the syntax:
 | 
			
		||||
@@ -976,64 +758,6 @@ ffmpeg -f x11grab -follow_mouse centered -show_region 1 -framerate 25 -video_siz
 | 
			
		||||
 | 
			
		||||
@item video_size
 | 
			
		||||
Set the video frame size. Default value is @code{vga}.
 | 
			
		||||
 | 
			
		||||
@item use_shm
 | 
			
		||||
Use the MIT-SHM extension for shared memory. Default value is @code{1}.
 | 
			
		||||
It may be necessary to disable it for remote displays.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section decklink
 | 
			
		||||
 | 
			
		||||
The decklink input device provides capture capabilities for Blackmagic
 | 
			
		||||
DeckLink devices.
 | 
			
		||||
 | 
			
		||||
To enable this input device, you need the Blackmagic DeckLink SDK and you
 | 
			
		||||
need to configure with the appropriate @code{--extra-cflags}
 | 
			
		||||
and @code{--extra-ldflags}.
 | 
			
		||||
On Windows, you need to run the IDL files through @command{widl}.
 | 
			
		||||
 | 
			
		||||
DeckLink is very picky about the formats it supports. Pixel format is always
 | 
			
		||||
uyvy422, framerate and video size must be determined for your device with
 | 
			
		||||
@command{-list_formats 1}. Audio sample rate is always 48 kHz and the number
 | 
			
		||||
of channels currently is limited to 2 (stereo).
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
 | 
			
		||||
@item list_devices
 | 
			
		||||
If set to @option{true}, print a list of devices and exit.
 | 
			
		||||
Defaults to @option{false}.
 | 
			
		||||
 | 
			
		||||
@item list_formats
 | 
			
		||||
If set to @option{true}, print a list of supported formats and exit.
 | 
			
		||||
Defaults to @option{false}.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Examples
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
List input devices:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f decklink -list_devices 1 -i dummy
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
List supported formats:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f decklink -list_formats 1 -i 'Intensity Pro'
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Capture video clip at 1080i50 (format 11):
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f decklink -i 'Intensity Pro@@11' -acodec copy -vcodec copy output.avi
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@c man end INPUT DEVICES
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ a mail for every change to every issue.
 | 
			
		||||
(the above does all work already after light testing)
 | 
			
		||||
 | 
			
		||||
The subscription URL for the ffmpeg-trac list is:
 | 
			
		||||
http(s)://lists.ffmpeg.org/mailman/listinfo/ffmpeg-trac
 | 
			
		||||
http(s)://ffmpeg.org/mailman/listinfo/ffmpeg-trac
 | 
			
		||||
The URL of the webinterface of the tracker is:
 | 
			
		||||
http(s)://trac.ffmpeg.org
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										223
									
								
								doc/muxers.texi
									
									
									
									
									
								
							
							
						
						
									
										223
									
								
								doc/muxers.texi
									
									
									
									
									
								
							@@ -194,19 +194,15 @@ can not be smaller than one centi second.
 | 
			
		||||
Apple HTTP Live Streaming muxer that segments MPEG-TS according to
 | 
			
		||||
the HTTP Live Streaming (HLS) specification.
 | 
			
		||||
 | 
			
		||||
It creates a playlist file, and one or more segment files. The output filename
 | 
			
		||||
specifies the playlist filename.
 | 
			
		||||
 | 
			
		||||
By default, the muxer creates a file for each segment produced. These files
 | 
			
		||||
have the same name as the playlist, followed by a sequential number and a
 | 
			
		||||
.ts extension.
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
For example, to convert an input file with @command{ffmpeg}:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i in.nut out.m3u8
 | 
			
		||||
@end example
 | 
			
		||||
This example will produce the playlist, @file{out.m3u8}, and segment files:
 | 
			
		||||
@file{out0.ts}, @file{out1.ts}, @file{out2.ts}, etc.
 | 
			
		||||
 | 
			
		||||
See also the @ref{segment} muxer, which provides a more generic and
 | 
			
		||||
flexible implementation of a segmenter, and can be used to perform HLS
 | 
			
		||||
@@ -224,11 +220,6 @@ Set the segment length in seconds. Default value is 2.
 | 
			
		||||
Set the maximum number of playlist entries. If set to 0 the list file
 | 
			
		||||
will contain all the segments. Default value is 5.
 | 
			
		||||
 | 
			
		||||
@item hls_ts_options @var{options_list}
 | 
			
		||||
Set output format options using a :-separated list of key=value
 | 
			
		||||
parameters. Values containing @code{:} special characters must be
 | 
			
		||||
escaped.
 | 
			
		||||
 | 
			
		||||
@item hls_wrap @var{wrap}
 | 
			
		||||
Set the number after which the segment filename number (the number
 | 
			
		||||
specified in each segment file) wraps. If set to 0 the number will be
 | 
			
		||||
@@ -242,28 +233,10 @@ to @var{wrap}.
 | 
			
		||||
Start the playlist sequence number from @var{number}. Default value is
 | 
			
		||||
0.
 | 
			
		||||
 | 
			
		||||
@item hls_allow_cache @var{allowcache}
 | 
			
		||||
Explicitly set whether the client MAY (1) or MUST NOT (0) cache media segments.
 | 
			
		||||
 | 
			
		||||
@item hls_base_url @var{baseurl}
 | 
			
		||||
Append @var{baseurl} to every entry in the playlist.
 | 
			
		||||
Useful to generate playlists with absolute paths.
 | 
			
		||||
 | 
			
		||||
Note that the playlist sequence number must be unique for each segment
 | 
			
		||||
and it is not to be confused with the segment filename sequence number
 | 
			
		||||
which can be cyclic, for example if the @option{wrap} option is
 | 
			
		||||
specified.
 | 
			
		||||
 | 
			
		||||
@item hls_flags single_file
 | 
			
		||||
If this flag is set, the muxer will store all segments in a single MPEG-TS
 | 
			
		||||
file, and will use byte ranges in the playlist. HLS playlists generated with
 | 
			
		||||
this way will have the version number 4.
 | 
			
		||||
For example:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i in.nut -hls_flags single_file out.m3u8
 | 
			
		||||
@end example
 | 
			
		||||
Will produce the playlist, @file{out.m3u8}, and a single segment file,
 | 
			
		||||
@file{out.ts}.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@anchor{ico}
 | 
			
		||||
@@ -559,6 +532,7 @@ 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,
 | 
			
		||||
@@ -573,22 +547,6 @@ 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.
 | 
			
		||||
@item -movflags disable_chpl
 | 
			
		||||
Disable Nero chapter markers (chpl atom).  Normally, both Nero chapters
 | 
			
		||||
and a QuickTime chapter track are written to the file. With this option
 | 
			
		||||
set, only the QuickTime chapter track will be written. Nero chapters can
 | 
			
		||||
cause failures when the file is reprocessed with certain tagging programs, like
 | 
			
		||||
mp3Tag 2.61a and iTunes 11.3, most likely other versions are affected as well.
 | 
			
		||||
@item -movflags omit_tfhd_offset
 | 
			
		||||
Do not write any absolute base_data_offset in tfhd atoms. This avoids
 | 
			
		||||
tying fragments to absolute byte positions in the file/streams.
 | 
			
		||||
@item -movflags default_base_moof
 | 
			
		||||
Similarly to the omit_tfhd_offset, this flag avoids writing the
 | 
			
		||||
absolute base_data_offset field in tfhd atoms, but does so by using
 | 
			
		||||
the new default-base-is-moof flag instead. This flag is new from
 | 
			
		||||
14496-12:2012. This may make the fragments easier to parse in certain
 | 
			
		||||
circumstances (avoiding basing track fragment location calculations
 | 
			
		||||
on the implicit end of the previous track fragment).
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Example
 | 
			
		||||
@@ -601,38 +559,29 @@ ffmpeg -re @var{<normal input/transcoding options>} -movflags isml+frag_keyframe
 | 
			
		||||
 | 
			
		||||
@section mp3
 | 
			
		||||
 | 
			
		||||
The MP3 muxer writes a raw MP3 stream with the following optional features:
 | 
			
		||||
@itemize @bullet
 | 
			
		||||
@item
 | 
			
		||||
An ID3v2 metadata header at the beginning (enabled by default). Versions 2.3 and
 | 
			
		||||
2.4 are supported, the @code{id3v2_version} private option controls which one is
 | 
			
		||||
used (3 or 4). Setting @code{id3v2_version} to 0 disables the ID3v2 header
 | 
			
		||||
completely.
 | 
			
		||||
The MP3 muxer writes a raw MP3 stream with an ID3v2 header at the beginning and
 | 
			
		||||
optionally an ID3v1 tag at the end. ID3v2.3 and ID3v2.4 are supported, the
 | 
			
		||||
@code{id3v2_version} option controls which one is used. Setting
 | 
			
		||||
@code{id3v2_version} to 0 will disable the ID3v2 header completely. The legacy
 | 
			
		||||
ID3v1 tag is not written by default, but may be enabled with the
 | 
			
		||||
@code{write_id3v1} option.
 | 
			
		||||
 | 
			
		||||
The muxer supports writing attached pictures (APIC frames) to the ID3v2 header.
 | 
			
		||||
The pictures are supplied to the muxer in form of a video stream with a single
 | 
			
		||||
packet. There can be any number of those streams, each will correspond to a
 | 
			
		||||
single APIC frame.  The stream metadata tags @var{title} and @var{comment} map
 | 
			
		||||
to APIC @var{description} and @var{picture type} respectively. See
 | 
			
		||||
The muxer may also write a Xing frame at the beginning, which contains the
 | 
			
		||||
number of frames in the file. It is useful for computing duration of VBR files.
 | 
			
		||||
The Xing frame is written if the output stream is seekable and if the
 | 
			
		||||
@code{write_xing} option is set to 1 (the default).
 | 
			
		||||
 | 
			
		||||
The muxer supports writing ID3v2 attached pictures (APIC frames). The pictures
 | 
			
		||||
are supplied to the muxer in form of a video stream with a single packet. There
 | 
			
		||||
can be any number of those streams, each will correspond to a single APIC frame.
 | 
			
		||||
The stream metadata tags @var{title} and @var{comment} map to APIC
 | 
			
		||||
@var{description} and @var{picture type} respectively. See
 | 
			
		||||
@url{http://id3.org/id3v2.4.0-frames} for allowed picture types.
 | 
			
		||||
 | 
			
		||||
Note that the APIC frames must be written at the beginning, so the muxer will
 | 
			
		||||
buffer the audio frames until it gets all the pictures. It is therefore advised
 | 
			
		||||
to provide the pictures as soon as possible to avoid excessive buffering.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
A Xing/LAME frame right after the ID3v2 header (if present). It is enabled by
 | 
			
		||||
default, but will be written only if the output is seekable. The
 | 
			
		||||
@code{write_xing} private option can be used to disable it.  The frame contains
 | 
			
		||||
various information that may be useful to the decoder, like the audio duration
 | 
			
		||||
or encoder delay.
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
A legacy ID3v1 tag at the end of the file (disabled by default). It may be
 | 
			
		||||
enabled with the @code{write_id3v1} private option, but as its capabilities are
 | 
			
		||||
very limited, its usage is not recommended.
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
Examples:
 | 
			
		||||
 | 
			
		||||
Write an mp3 with an ID3v2.3 header and an ID3v1 footer:
 | 
			
		||||
@@ -684,10 +633,7 @@ 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 a constant muxrate (default VBR).
 | 
			
		||||
@item -pcr_period @var{numer}
 | 
			
		||||
Override the default PCR retransmission time (default 20ms), ignored
 | 
			
		||||
if variable muxrate is selected.
 | 
			
		||||
Set muxrate.
 | 
			
		||||
@item -pes_payload_size @var{number}
 | 
			
		||||
Set minimum PES packet payload in bytes.
 | 
			
		||||
@item -mpegts_flags @var{flags}
 | 
			
		||||
@@ -756,30 +702,6 @@ Alternatively you can write the command as:
 | 
			
		||||
ffmpeg -benchmark -i INPUT -f null -
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section nut
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item -syncpoints @var{flags}
 | 
			
		||||
Change the syncpoint usage in nut:
 | 
			
		||||
@table @option
 | 
			
		||||
@item @var{default} use the normal low-overhead seeking aids.
 | 
			
		||||
@item @var{none} do not use the syncpoints at all, reducing the overhead but making the stream non-seekable;
 | 
			
		||||
    Use of this option is not recommended, as the resulting files are very damage
 | 
			
		||||
    sensitive and seeking is not possible. Also in general the overhead from
 | 
			
		||||
    syncpoints is negligible. Note, -@code{write_index} 0 can be used to disable
 | 
			
		||||
    all growing data tables, allowing to mux endless streams with limited memory
 | 
			
		||||
    and wihout these disadvantages.
 | 
			
		||||
@item @var{timestamped} extend the syncpoint with a wallclock field.
 | 
			
		||||
@end table
 | 
			
		||||
The @var{none} and @var{timestamped} flags are experimental.
 | 
			
		||||
@item -write_index @var{bool}
 | 
			
		||||
Write index at the end, the default is to write an index.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i INPUT -f_strict experimental -syncpoints none - | processor
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section ogg
 | 
			
		||||
 | 
			
		||||
Ogg container muxer.
 | 
			
		||||
@@ -845,11 +767,6 @@ reference stream. The default value is @code{auto}.
 | 
			
		||||
Override the inner container format, by default it is guessed by the filename
 | 
			
		||||
extension.
 | 
			
		||||
 | 
			
		||||
@item segment_format_options @var{options_list}
 | 
			
		||||
Set output format options using a :-separated list of key=value
 | 
			
		||||
parameters. Values containing the @code{:} special character must be
 | 
			
		||||
escaped.
 | 
			
		||||
 | 
			
		||||
@item segment_list @var{name}
 | 
			
		||||
Generate also a listfile named @var{name}. If not specified no
 | 
			
		||||
listfile is generated.
 | 
			
		||||
@@ -866,21 +783,17 @@ Allow caching (only affects M3U8 list files).
 | 
			
		||||
Allow live-friendly file generation.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item segment_list_type @var{type}
 | 
			
		||||
Select the listing format.
 | 
			
		||||
@table @option
 | 
			
		||||
@item @var{flat} use a simple flat list of entries.
 | 
			
		||||
@item @var{hls} use a m3u8-like structure.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@item segment_list_size @var{size}
 | 
			
		||||
Update the list file so that it contains at most @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_entry_prefix @var{prefix}
 | 
			
		||||
Prepend @var{prefix} to each entry. Useful to generate absolute paths.
 | 
			
		||||
By default no prefix is applied.
 | 
			
		||||
Set @var{prefix} to prepend to the name of each entry filename. By
 | 
			
		||||
default no prefix is applied.
 | 
			
		||||
 | 
			
		||||
@item segment_list_type @var{type}
 | 
			
		||||
Specify the format for the segment list file.
 | 
			
		||||
 | 
			
		||||
The following values are recognized:
 | 
			
		||||
@table @samp
 | 
			
		||||
@@ -931,16 +844,6 @@ 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_atclocktime @var{1|0}
 | 
			
		||||
If set to "1" split at regular clock time intervals starting from 00:00
 | 
			
		||||
o'clock. The @var{time} value specified in @option{segment_time} is
 | 
			
		||||
used for setting the length of the splitting interval.
 | 
			
		||||
 | 
			
		||||
For example with @option{segment_time} set to "900" this makes it possible
 | 
			
		||||
to create files at 12:00 o'clock, 12:15, 12:30, etc.
 | 
			
		||||
 | 
			
		||||
Default value is "0".
 | 
			
		||||
 | 
			
		||||
@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".
 | 
			
		||||
@@ -997,7 +900,7 @@ argument must be a time duration specification, and defaults to 0.
 | 
			
		||||
 | 
			
		||||
@itemize
 | 
			
		||||
@item
 | 
			
		||||
Remux the content of file @file{in.mkv} to a list of segments
 | 
			
		||||
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
 | 
			
		||||
@@ -1005,20 +908,14 @@ ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.list out%03d.nu
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Segment input and set output format options for the output segments:
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -i in.mkv -f segment -segment_time 10 -segment_format_options movflags=+faststart out%03d.mp4
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Segment the input file according to the split points specified by the
 | 
			
		||||
@var{segment_times} option:
 | 
			
		||||
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
 | 
			
		||||
Use the @command{ffmpeg} @option{force_key_frames}
 | 
			
		||||
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.
 | 
			
		||||
@@ -1037,7 +934,7 @@ ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_fr
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item
 | 
			
		||||
Convert the @file{in.mkv} to TS segments using the @code{libx264}
 | 
			
		||||
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
 | 
			
		||||
@@ -1052,28 +949,6 @@ ffmpeg -re -i in.mkv -codec copy -map 0 -f segment -segment_list playlist.m3u8 \
 | 
			
		||||
@end example
 | 
			
		||||
@end itemize
 | 
			
		||||
 | 
			
		||||
@section smoothstreaming
 | 
			
		||||
 | 
			
		||||
Smooth Streaming muxer generates a set of files (Manifest, chunks) suitable for serving with conventional web server.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item window_size
 | 
			
		||||
Specify the number of fragments kept in the manifest. Default 0 (keep all).
 | 
			
		||||
 | 
			
		||||
@item extra_window_size
 | 
			
		||||
Specify the number of fragments kept outside of the manifest before removing from disk. Default 5.
 | 
			
		||||
 | 
			
		||||
@item lookahead_count
 | 
			
		||||
Specify the number of lookahead fragments. Default 2.
 | 
			
		||||
 | 
			
		||||
@item min_frag_duration
 | 
			
		||||
Specify the minimum fragment duration (in microseconds). Default 5000000.
 | 
			
		||||
 | 
			
		||||
@item remove_at_exit
 | 
			
		||||
Specify whether to remove all fragments when finished. Default 0 (do not remove).
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section tee
 | 
			
		||||
 | 
			
		||||
The tee muxer can be used to write the same data to several files or any
 | 
			
		||||
@@ -1111,7 +986,7 @@ It is possible to specify to which streams a given bitstream filter
 | 
			
		||||
applies, by appending a stream specifier to the option separated by
 | 
			
		||||
@code{/}. @var{spec} must be a stream specifier (see @ref{Format
 | 
			
		||||
stream specifiers}).  If the stream specifier is not specified, the
 | 
			
		||||
bitstream filters will be applied to all streams in the output.
 | 
			
		||||
bistream filters will be applied to all streams in the output.
 | 
			
		||||
 | 
			
		||||
Several bitstream filters can be specified, separated by ",".
 | 
			
		||||
 | 
			
		||||
@@ -1158,34 +1033,4 @@ 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.
 | 
			
		||||
 | 
			
		||||
@section webm_dash_manifest
 | 
			
		||||
 | 
			
		||||
WebM DASH Manifest muxer.
 | 
			
		||||
 | 
			
		||||
This muxer implements the WebM DASH Manifest specification to generate the DASH manifest XML.
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
 | 
			
		||||
This muxer supports the following options:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item adaptation_sets
 | 
			
		||||
This option has the following syntax: "id=x,streams=a,b,c id=y,streams=d,e" where x and y are the
 | 
			
		||||
unique identifiers of the adaptation sets and a,b,c,d and e are the indices of the corresponding
 | 
			
		||||
audio and video streams. Any number of adaptation sets can be added using this option.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Example
 | 
			
		||||
@example
 | 
			
		||||
ffmpeg -f webm_dash_manifest -i video1.webm \
 | 
			
		||||
       -f webm_dash_manifest -i video2.webm \
 | 
			
		||||
       -f webm_dash_manifest -i audio1.webm \
 | 
			
		||||
       -f webm_dash_manifest -i audio2.webm \
 | 
			
		||||
       -map 0 -map 1 -map 2 -map 3 \
 | 
			
		||||
       -c copy \
 | 
			
		||||
       -f webm_dash_manifest \
 | 
			
		||||
       -adaptation_sets "id=0,streams=0,1 id=1,streams=2,3" \
 | 
			
		||||
       manifest.xml
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@c man end MUXERS
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								doc/nut.texi
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								doc/nut.texi
									
									
									
									
									
								
							@@ -21,27 +21,6 @@ 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 Modes
 | 
			
		||||
NUT has some variants signaled by using the flags field in its main header.
 | 
			
		||||
 | 
			
		||||
@multitable @columnfractions .4 .4
 | 
			
		||||
@item BROADCAST   @tab Extend the syncpoint to report the sender wallclock
 | 
			
		||||
@item PIPE        @tab Omit completely the syncpoint
 | 
			
		||||
@end multitable
 | 
			
		||||
 | 
			
		||||
@section BROADCAST
 | 
			
		||||
 | 
			
		||||
The BROADCAST variant provides a secondary time reference to facilitate
 | 
			
		||||
detecting endpoint latency and network delays.
 | 
			
		||||
It assumes all the endpoint clocks are syncronized.
 | 
			
		||||
To be used in real-time scenarios.
 | 
			
		||||
 | 
			
		||||
@section PIPE
 | 
			
		||||
 | 
			
		||||
The PIPE variant assumes NUT is used as non-seekable intermediate container,
 | 
			
		||||
by not using syncpoint removes unneeded overhead and reduces the overall
 | 
			
		||||
memory usage.
 | 
			
		||||
 | 
			
		||||
@chapter Container-specific codec tags
 | 
			
		||||
 | 
			
		||||
@section Generic raw YUVA formats
 | 
			
		||||
 
 | 
			
		||||
@@ -79,6 +79,9 @@ qpel{8,16}_mc??_old_c / *pixels{8,16}_l4
 | 
			
		||||
    Just used to work around a bug in an old libavcodec encoder version.
 | 
			
		||||
    Don't optimize them.
 | 
			
		||||
 | 
			
		||||
tpel_mc_func {put,avg}_tpel_pixels_tab
 | 
			
		||||
    Used only for SVQ3, so only optimize them if you need fast SVQ3 decoding.
 | 
			
		||||
 | 
			
		||||
add_bytes/diff_bytes
 | 
			
		||||
    For huffyuv only, optimize if you want a faster ffhuffyuv codec.
 | 
			
		||||
 | 
			
		||||
@@ -136,6 +139,9 @@ dct_unquantize_mpeg2
 | 
			
		||||
dct_unquantize_h263
 | 
			
		||||
    Used in MPEG-4/H.263 en/decoding.
 | 
			
		||||
 | 
			
		||||
FIXME remaining functions?
 | 
			
		||||
BTW, most of these functions are in dsputil.c/.h, some are in mpegvideo.c/.h.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Alignment:
 | 
			
		||||
@@ -262,6 +268,17 @@ CELL/SPU:
 | 
			
		||||
http://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/30B3520C93F437AB87257060006FFE5E/$file/Language_Extensions_for_CBEA_2.4.pdf
 | 
			
		||||
http://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/9F820A5FFA3ECE8C8725716A0062585F/$file/CBE_Handbook_v1.1_24APR2007_pub.pdf
 | 
			
		||||
 | 
			
		||||
SPARC-specific:
 | 
			
		||||
---------------
 | 
			
		||||
SPARC Joint Programming Specification (JPS1): Commonality
 | 
			
		||||
http://www.fujitsu.com/downloads/PRMPWR/JPS1-R1.0.4-Common-pub.pdf
 | 
			
		||||
 | 
			
		||||
UltraSPARC III Processor User's Manual (contains instruction timings)
 | 
			
		||||
http://www.sun.com/processors/manuals/USIIIv2.pdf
 | 
			
		||||
 | 
			
		||||
VIS Whitepaper (contains optimization guidelines)
 | 
			
		||||
http://www.sun.com/processors/vis/download/vis/vis_whitepaper.pdf
 | 
			
		||||
 | 
			
		||||
GCC asm links:
 | 
			
		||||
--------------
 | 
			
		||||
official doc but quite ugly
 | 
			
		||||
 
 | 
			
		||||
@@ -13,8 +13,8 @@ You can disable all the output devices using the configure option
 | 
			
		||||
option "--enable-outdev=@var{OUTDEV}", or you can disable a particular
 | 
			
		||||
input device using the option "--disable-outdev=@var{OUTDEV}".
 | 
			
		||||
 | 
			
		||||
The option "-devices" of the ff* tools will display the list of
 | 
			
		||||
enabled output devices.
 | 
			
		||||
The option "-formats" of the ff* tools will display the list of
 | 
			
		||||
enabled output devices (amongst the muxers).
 | 
			
		||||
 | 
			
		||||
A description of the currently available output devices follows.
 | 
			
		||||
 | 
			
		||||
@@ -220,11 +220,11 @@ This output device allows one to render to OpenGL context.
 | 
			
		||||
Context may be provided by application or default SDL window is created.
 | 
			
		||||
 | 
			
		||||
When device renders to external context, application must implement handlers for following messages:
 | 
			
		||||
@code{AV_DEV_TO_APP_CREATE_WINDOW_BUFFER} - create OpenGL context on current thread.
 | 
			
		||||
@code{AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER} - make OpenGL context current.
 | 
			
		||||
@code{AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER} - swap buffers.
 | 
			
		||||
@code{AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER} - destroy OpenGL context.
 | 
			
		||||
Application is also required to inform a device about current resolution by sending @code{AV_APP_TO_DEV_WINDOW_SIZE} message.
 | 
			
		||||
@code{AV_CTL_MESSAGE_CREATE_WINDOW_BUFFER} - create OpenGL context on current thread.
 | 
			
		||||
@code{AV_CTL_MESSAGE_PREPARE_WINDOW_BUFFER} - make OpenGL context current.
 | 
			
		||||
@code{AV_CTL_MESSAGE_DISPLAY_WINDOW_BUFFER} - swap buffers.
 | 
			
		||||
@code{AV_CTL_MESSAGE_DESTROY_WINDOW_BUFFER} - destroy OpenGL context.
 | 
			
		||||
Application is also required to inform a device about current resolution by sending @code{AV_DEVICE_WINDOW_RESIZED} message.
 | 
			
		||||
 | 
			
		||||
@subsection Options
 | 
			
		||||
@table @option
 | 
			
		||||
@@ -237,10 +237,6 @@ Application must provide OpenGL context and both @code{window_size_cb} and @code
 | 
			
		||||
@item window_title
 | 
			
		||||
Set the SDL window title, if not specified default to the filename specified for the output device.
 | 
			
		||||
Ignored when @option{no_window} is set.
 | 
			
		||||
@item window_size
 | 
			
		||||
Set preferred window size, can be a string of the form widthxheight or a video size abbreviation.
 | 
			
		||||
If not specified it defaults to the size of the input video, downscaled according to the aspect ratio.
 | 
			
		||||
Mostly usable when @option{no_window} is not set.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@@ -294,20 +290,6 @@ When both options are provided then the highest value is used
 | 
			
		||||
are set to 0 (which is default), the device will use the default
 | 
			
		||||
PulseAudio duration value. By default PulseAudio set buffer duration
 | 
			
		||||
to around 2 seconds.
 | 
			
		||||
 | 
			
		||||
@item prebuf
 | 
			
		||||
Specify pre-buffering size in bytes. The server does not start with
 | 
			
		||||
playback before at least @option{prebuf} bytes are available in the
 | 
			
		||||
buffer. By default this option is initialized to the same value as
 | 
			
		||||
@option{buffer_size} or @option{buffer_duration} (whichever is bigger).
 | 
			
		||||
 | 
			
		||||
@item minreq
 | 
			
		||||
Specify minimum request size in bytes. The server does not request less
 | 
			
		||||
than @option{minreq} bytes from the client, instead waits until the buffer
 | 
			
		||||
is free enough to request more bytes at once. It is recommended to not set
 | 
			
		||||
this option, which will initialize this to a value that is deemed sensible
 | 
			
		||||
by the server.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Examples
 | 
			
		||||
@@ -406,26 +388,19 @@ For example, @code{dual-headed:0.1} would specify screen 1 of display
 | 
			
		||||
Check the X11 specification for more detailed information about the
 | 
			
		||||
display name format.
 | 
			
		||||
 | 
			
		||||
@item window_id
 | 
			
		||||
When set to non-zero value then device doesn't create new window,
 | 
			
		||||
but uses existing one with provided @var{window_id}. By default
 | 
			
		||||
this options is set to zero and device creates its own window.
 | 
			
		||||
 | 
			
		||||
@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.
 | 
			
		||||
Ignored when @var{window_id} is set.
 | 
			
		||||
 | 
			
		||||
@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.
 | 
			
		||||
Ignored when @var{window_id} is set.
 | 
			
		||||
 | 
			
		||||
@item window_title
 | 
			
		||||
Set the window title, if not specified default to the filename
 | 
			
		||||
specified for the output device. Ignored when @var{window_id} is set.
 | 
			
		||||
specified for the output device.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
For more information about XVideo see @url{http://www.x.org/}.
 | 
			
		||||
 
 | 
			
		||||
@@ -24,20 +24,6 @@ If not, then you should install a different compiler that has no
 | 
			
		||||
hard-coded path to gas. In the worst case pass @code{--disable-asm}
 | 
			
		||||
to configure.
 | 
			
		||||
 | 
			
		||||
@section Advanced linking configuration
 | 
			
		||||
 | 
			
		||||
If you compiled FFmpeg libraries statically and you want to use them to
 | 
			
		||||
build your own shared library, you may need to force PIC support (with
 | 
			
		||||
@code{--enable-pic} during FFmpeg configure) and add the following option
 | 
			
		||||
to your project LDFLAGS:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
-Wl,-Bsymbolic
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
If your target platform requires position independent binaries, you should
 | 
			
		||||
pass the correct linking flag (e.g. @code{-pie}) to @code{--extra-ldexeflags}.
 | 
			
		||||
 | 
			
		||||
@section BSD
 | 
			
		||||
 | 
			
		||||
BSD make will not build FFmpeg, you need to install and use GNU Make
 | 
			
		||||
@@ -66,14 +52,14 @@ unacelerated code.
 | 
			
		||||
 | 
			
		||||
Mac OS X on PowerPC or ARM (iPhone) requires a preprocessor from
 | 
			
		||||
@url{https://github.com/FFmpeg/gas-preprocessor} or
 | 
			
		||||
@url{https://github.com/yuvi/gas-preprocessor}(currently outdated) to build the optimized
 | 
			
		||||
assembly functions. Put the Perl script somewhere
 | 
			
		||||
@url{http://github.com/yuvi/gas-preprocessor} to build the optimized
 | 
			
		||||
assembler functions. Put the Perl script somewhere
 | 
			
		||||
in your PATH, FFmpeg's configure will pick it up automatically.
 | 
			
		||||
 | 
			
		||||
Mac OS X on amd64 and x86 requires @command{yasm} to build most of the
 | 
			
		||||
optimized assembly functions. @uref{http://www.finkproject.org/, Fink},
 | 
			
		||||
optimized assembler functions. @uref{http://www.finkproject.org/, Fink},
 | 
			
		||||
@uref{http://www.gentoo.org/proj/en/gentoo-alt/prefix/bootstrap-macos.xml, Gentoo Prefix},
 | 
			
		||||
@uref{https://mxcl.github.com/homebrew/, Homebrew}
 | 
			
		||||
@uref{http://mxcl.github.com/homebrew/, Homebrew}
 | 
			
		||||
or @uref{http://www.macports.org, MacPorts} can easily provide it.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -135,6 +121,8 @@ You will need the following prerequisites:
 | 
			
		||||
(if using MSVC 2012 or earlier)
 | 
			
		||||
@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
 | 
			
		||||
 | 
			
		||||
To set up a proper environment in MSYS, you need to run @code{msys.bat} from
 | 
			
		||||
@@ -276,12 +264,12 @@ llrint() in its C library.
 | 
			
		||||
Install your Cygwin with all the "Base" packages, plus the
 | 
			
		||||
following "Devel" ones:
 | 
			
		||||
@example
 | 
			
		||||
binutils, gcc4-core, make, git, mingw-runtime, texinfo
 | 
			
		||||
binutils, gcc4-core, make, git, mingw-runtime, texi2html
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
In order to run FATE you will also need the following "Utils" packages:
 | 
			
		||||
@example
 | 
			
		||||
diffutils
 | 
			
		||||
bc, diffutils
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
If you want to build FFmpeg with additional libraries, download Cygwin
 | 
			
		||||
 
 | 
			
		||||
@@ -26,10 +26,6 @@
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <float.h>
 | 
			
		||||
 | 
			
		||||
// print_options is build for the host, os_support.h isn't needed and is setup
 | 
			
		||||
// for the target. without this build breaks on mingw
 | 
			
		||||
#define AVFORMAT_OS_SUPPORT_H
 | 
			
		||||
 | 
			
		||||
#include "libavformat/avformat.h"
 | 
			
		||||
#include "libavformat/options_table.h"
 | 
			
		||||
#include "libavcodec/avcodec.h"
 | 
			
		||||
 
 | 
			
		||||
@@ -166,7 +166,7 @@ This protocol accepts the following options.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item timeout
 | 
			
		||||
Set timeout in microseconds of socket I/O operations used by the underlying low level
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
@@ -244,7 +244,7 @@ Override the User-Agent header. If not specified the protocol will use a
 | 
			
		||||
string describing the libavformat build. ("Lavf/<version>")
 | 
			
		||||
 | 
			
		||||
@item timeout
 | 
			
		||||
Set timeout in microseconds of socket I/O operations used by the underlying low level
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
@@ -255,7 +255,7 @@ Export the MIME type.
 | 
			
		||||
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 1.
 | 
			
		||||
The default is 0.
 | 
			
		||||
 | 
			
		||||
@item icy_metadata_headers
 | 
			
		||||
If the server supports ICY metadata, this contains the ICY-specific HTTP reply
 | 
			
		||||
@@ -293,50 +293,6 @@ The required syntax to play a stream specifying a cookie is:
 | 
			
		||||
ffplay -cookies "nlqptid=nltid=tsn; path=/; domain=somedomain.com;" http://somedomain.com/somestream.m3u8
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section Icecast
 | 
			
		||||
 | 
			
		||||
Icecast protocol (stream to Icecast servers)
 | 
			
		||||
 | 
			
		||||
This protocol accepts the following options:
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item ice_genre
 | 
			
		||||
Set the stream genre.
 | 
			
		||||
 | 
			
		||||
@item ice_name
 | 
			
		||||
Set the stream name.
 | 
			
		||||
 | 
			
		||||
@item ice_description
 | 
			
		||||
Set the stream description.
 | 
			
		||||
 | 
			
		||||
@item ice_url
 | 
			
		||||
Set the stream website URL.
 | 
			
		||||
 | 
			
		||||
@item ice_public
 | 
			
		||||
Set if the stream should be public.
 | 
			
		||||
The default is 0 (not public).
 | 
			
		||||
 | 
			
		||||
@item user_agent
 | 
			
		||||
Override the User-Agent header. If not specified a string of the form
 | 
			
		||||
"Lavf/<version>" will be used.
 | 
			
		||||
 | 
			
		||||
@item password
 | 
			
		||||
Set the Icecast mountpoint password.
 | 
			
		||||
 | 
			
		||||
@item content_type
 | 
			
		||||
Set the stream content type. This must be set if it is different from
 | 
			
		||||
audio/mpeg.
 | 
			
		||||
 | 
			
		||||
@item legacy_icecast
 | 
			
		||||
This enables support for Icecast versions < 2.4.0, that do not support the
 | 
			
		||||
HTTP PUT method but the SOURCE method.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
icecast://[@var{username}[:@var{password}]@@]@var{server}:@var{port}/@var{mountpoint}
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@section mmst
 | 
			
		||||
 | 
			
		||||
MMS (Microsoft Media Server) protocol over TCP.
 | 
			
		||||
@@ -581,35 +537,6 @@ The Real-Time Messaging Protocol tunneled through HTTPS (RTMPTS) is used
 | 
			
		||||
for streaming multimedia content within HTTPS requests to traverse
 | 
			
		||||
firewalls.
 | 
			
		||||
 | 
			
		||||
@section libsmbclient
 | 
			
		||||
 | 
			
		||||
libsmbclient permits one to manipulate CIFS/SMB network resources.
 | 
			
		||||
 | 
			
		||||
Following syntax is required.
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
smb://[[domain:]user[:password@@]]server[/share[/path[/file]]]
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
This protocol accepts the following options.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item timeout
 | 
			
		||||
Set timeout in miliseconds 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.
 | 
			
		||||
 | 
			
		||||
@item workgroup
 | 
			
		||||
Set the workgroup used for making connections. By default workgroup is not specified.
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
For more information see: @url{http://www.samba.org/}.
 | 
			
		||||
 | 
			
		||||
@section libssh
 | 
			
		||||
 | 
			
		||||
Secure File Transfer Protocol via libssh
 | 
			
		||||
@@ -750,7 +677,7 @@ 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 local RTP port value plus 1.
 | 
			
		||||
set to the the local RTP port value plus 1.
 | 
			
		||||
@end enumerate
 | 
			
		||||
 | 
			
		||||
@section rtsp
 | 
			
		||||
@@ -764,7 +691,7 @@ data transferred over RDT).
 | 
			
		||||
 | 
			
		||||
The muxer can be used to send a stream using RTSP ANNOUNCE to a server
 | 
			
		||||
supporting it (currently Darwin Streaming Server and Mischa Spiegelmock's
 | 
			
		||||
@uref{https://github.com/revmischa/rtsp-server, RTSP server}).
 | 
			
		||||
@uref{http://github.com/revmischa/rtsp-server, RTSP server}).
 | 
			
		||||
 | 
			
		||||
The required syntax for a RTSP url is:
 | 
			
		||||
@example
 | 
			
		||||
@@ -783,7 +710,7 @@ Do not start playing the stream immediately if set to 1. Default value
 | 
			
		||||
is 0.
 | 
			
		||||
 | 
			
		||||
@item rtsp_transport
 | 
			
		||||
Set RTSP transport protocols.
 | 
			
		||||
Set RTSP trasport protocols.
 | 
			
		||||
 | 
			
		||||
It accepts the following values:
 | 
			
		||||
@table @samp
 | 
			
		||||
@@ -815,8 +742,6 @@ The following values are accepted:
 | 
			
		||||
Accept packets only from negotiated peer address and port.
 | 
			
		||||
@item listen
 | 
			
		||||
Act as a server, listening for an incoming connection.
 | 
			
		||||
@item prefer_tcp
 | 
			
		||||
Try TCP for RTP transport first, if TCP is available as RTSP RTP transport.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Default value is @samp{none}.
 | 
			
		||||
@@ -842,7 +767,7 @@ Set maximum local UDP port. Default value is 65000.
 | 
			
		||||
@item timeout
 | 
			
		||||
Set maximum timeout (in seconds) to wait for incoming connections.
 | 
			
		||||
 | 
			
		||||
A value of -1 means infinite (default). This option implies the
 | 
			
		||||
A value of -1 mean infinite (default). This option implies the
 | 
			
		||||
@option{rtsp_flags} set to @samp{listen}.
 | 
			
		||||
 | 
			
		||||
@item reorder_queue_size
 | 
			
		||||
@@ -852,7 +777,7 @@ Set number of packets to buffer for handling of reordered packets.
 | 
			
		||||
Set socket TCP I/O timeout in micro seconds.
 | 
			
		||||
 | 
			
		||||
@item user-agent
 | 
			
		||||
Override User-Agent header. If not specified, it defaults to the
 | 
			
		||||
Override User-Agent header. If not specified, it default to the
 | 
			
		||||
libavformat identifier string.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@@ -1033,30 +958,6 @@ this binary block are used as master key, the following 14 bytes are
 | 
			
		||||
used as master salt.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@section subfile
 | 
			
		||||
 | 
			
		||||
Virtually extract a segment of a file or another stream.
 | 
			
		||||
The underlying stream must be seekable.
 | 
			
		||||
 | 
			
		||||
Accepted options:
 | 
			
		||||
@table @option
 | 
			
		||||
@item start
 | 
			
		||||
Start offset of the extracted segment, in bytes.
 | 
			
		||||
@item end
 | 
			
		||||
End offset of the extracted segment, in bytes.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
Examples:
 | 
			
		||||
 | 
			
		||||
Extract a chapter from a DVD VOB file (start and end sectors obtained
 | 
			
		||||
externally and multiplied by 2048):
 | 
			
		||||
@example
 | 
			
		||||
subfile,,start,153391104,end,268142592,,:/media/dvd/VIDEO_TS/VTS_08_1.VOB
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Play an AVI file directly from a TAR archive:
 | 
			
		||||
subfile,,start,183241728,end,366490624,,:archive.tar
 | 
			
		||||
 | 
			
		||||
@section tcp
 | 
			
		||||
 | 
			
		||||
Transmission Control Protocol.
 | 
			
		||||
@@ -1081,8 +982,8 @@ Set raise error timeout, expressed in microseconds.
 | 
			
		||||
This option is only relevant in read mode: if no data arrived in more
 | 
			
		||||
than this time interval, raise error.
 | 
			
		||||
 | 
			
		||||
@item listen_timeout=@var{milliseconds}
 | 
			
		||||
Set listen timeout, expressed in milliseconds.
 | 
			
		||||
@item listen_timeout=@var{microseconds}
 | 
			
		||||
Set listen timeout, expressed in microseconds.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
The following example shows how to setup a listening TCP connection
 | 
			
		||||
@@ -1173,9 +1074,8 @@ The list of supported options follows.
 | 
			
		||||
 | 
			
		||||
@table @option
 | 
			
		||||
@item buffer_size=@var{size}
 | 
			
		||||
Set the UDP maximum socket buffer size in bytes. This is used to set either
 | 
			
		||||
the receive or send buffer size, depending on what the socket is used for.
 | 
			
		||||
Default is 64KB.  See also @var{fifo_size}.
 | 
			
		||||
Set the UDP socket buffer size in bytes. This is used both for the
 | 
			
		||||
receiving and the sending buffer size.
 | 
			
		||||
 | 
			
		||||
@item localport=@var{port}
 | 
			
		||||
Override the local UDP port to bind with.
 | 
			
		||||
@@ -1226,12 +1126,6 @@ Set raise error timeout, expressed in microseconds.
 | 
			
		||||
 | 
			
		||||
This option is only relevant in read mode: if no data arrived in more
 | 
			
		||||
than this time interval, raise error.
 | 
			
		||||
 | 
			
		||||
@item broadcast=@var{1|0}
 | 
			
		||||
Explicitly allow or disallow UDP broadcasting.
 | 
			
		||||
 | 
			
		||||
Note that broadcasting may not work properly on networks having
 | 
			
		||||
a broadcast storm protection.
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@subsection Examples
 | 
			
		||||
 
 | 
			
		||||
@@ -112,14 +112,6 @@ bayer dither
 | 
			
		||||
 | 
			
		||||
@item ed
 | 
			
		||||
error diffusion dither
 | 
			
		||||
 | 
			
		||||
@item a_dither
 | 
			
		||||
arithmetic dither, based using addition
 | 
			
		||||
 | 
			
		||||
@item x_dither
 | 
			
		||||
arithmetic dither, based using xor (more random/less apparent patterning that
 | 
			
		||||
a_dither).
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@end table
 | 
			
		||||
 
 | 
			
		||||
@@ -618,6 +618,7 @@ flip wavelet?
 | 
			
		||||
try to use the wavelet transformed predicted image (motion compensated image) as context for coding the residual coefficients
 | 
			
		||||
try the MV length as context for coding the residual coefficients
 | 
			
		||||
use extradata for stuff which is in the keyframes now?
 | 
			
		||||
the MV median predictor is patented IIRC
 | 
			
		||||
implement per picture halfpel interpolation
 | 
			
		||||
try different range coder state transition tables for different contexts
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								doc/style.min.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								doc/style.min.css
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										55
									
								
								doc/t2h.init
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								doc/t2h.init
									
									
									
									
									
								
							@@ -1,35 +1,26 @@
 | 
			
		||||
# Init file for texi2html.
 | 
			
		||||
 | 
			
		||||
# This is deprecated, and the makeinfo/texi2any version is doc/t2h.pm
 | 
			
		||||
 | 
			
		||||
# no horiz rules between sections
 | 
			
		||||
$end_section = \&FFmpeg_end_section;
 | 
			
		||||
sub FFmpeg_end_section($$)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
my $TEMPLATE_HEADER1 = $ENV{"FFMPEG_HEADER1"} || <<EOT;
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
 | 
			
		||||
    <title>FFmpeg documentation</title>
 | 
			
		||||
    <link rel="stylesheet" href="bootstrap.min.css" />
 | 
			
		||||
    <link rel="stylesheet" href="style.min.css" />
 | 
			
		||||
$EXTRA_HEAD =
 | 
			
		||||
'<link rel="icon" href="favicon.png" type="image/png" />
 | 
			
		||||
';
 | 
			
		||||
 | 
			
		||||
$CSS_LINES = $ENV{"FFMPEG_CSS"} || <<EOT;
 | 
			
		||||
<link rel="stylesheet" type="text/css" href="default.css" />
 | 
			
		||||
EOT
 | 
			
		||||
 | 
			
		||||
my $TEMPLATE_HEADER2 = $ENV{"FFMPEG_HEADER2"} || <<EOT;
 | 
			
		||||
my $TEMPLATE_HEADER = $ENV{"FFMPEG_HEADER"} || <<EOT;
 | 
			
		||||
<link rel="icon" href="favicon.png" type="image/png" />
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
    <div style="width: 95%; margin: auto">
 | 
			
		||||
<div id="container">
 | 
			
		||||
<div id="body">
 | 
			
		||||
EOT
 | 
			
		||||
 | 
			
		||||
my $TEMPLATE_FOOTER = $ENV{"FFMPEG_FOOTER"} || <<EOT;
 | 
			
		||||
    </div>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
EOT
 | 
			
		||||
$PRE_BODY_CLOSE = '</div></div>';
 | 
			
		||||
 | 
			
		||||
$SMALL_RULE = '';
 | 
			
		||||
$BODYTEXT = '';
 | 
			
		||||
@@ -91,25 +82,21 @@ sub FFmpeg_print_page_head($$)
 | 
			
		||||
    $longtitle = "FFmpeg documentation : " . $longtitle;
 | 
			
		||||
 | 
			
		||||
    print $fh <<EOT;
 | 
			
		||||
$TEMPLATE_HEADER1
 | 
			
		||||
$description
 | 
			
		||||
<meta name="keywords" content="$longtitle">
 | 
			
		||||
<meta name="Generator" content="$Texi2HTML::THISDOC{program}">
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
$Texi2HTML::THISDOC{'copying'}<!-- Created on $Texi2HTML::THISDOC{today} by $Texi2HTML::THISDOC{program} -->
 | 
			
		||||
<!--
 | 
			
		||||
$Texi2HTML::THISDOC{program_authors}
 | 
			
		||||
-->
 | 
			
		||||
$encoding
 | 
			
		||||
$TEMPLATE_HEADER2
 | 
			
		||||
EOT
 | 
			
		||||
}
 | 
			
		||||
<head>
 | 
			
		||||
<title>$longtitle</title>
 | 
			
		||||
 | 
			
		||||
$print_page_foot = \&FFmpeg_print_page_foot;
 | 
			
		||||
sub FFmpeg_print_page_foot($$)
 | 
			
		||||
{
 | 
			
		||||
    my $fh = shift;
 | 
			
		||||
    print $fh <<EOT;
 | 
			
		||||
$TEMPLATE_FOOTER
 | 
			
		||||
$description
 | 
			
		||||
<meta name="keywords" content="$longtitle">
 | 
			
		||||
<meta name="Generator" content="$Texi2HTML::THISDOC{program}">
 | 
			
		||||
$encoding
 | 
			
		||||
$CSS_LINES
 | 
			
		||||
$TEMPLATE_HEADER
 | 
			
		||||
EOT
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										221
									
								
								doc/t2h.pm
									
									
									
									
									
								
							
							
						
						
									
										221
									
								
								doc/t2h.pm
									
									
									
									
									
								
							@@ -1,221 +0,0 @@
 | 
			
		||||
# makeinfo HTML output init file
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2011, 2012 Free Software Foundation, Inc.
 | 
			
		||||
# Copyright (c) 2014 Andreas Cadhalpun
 | 
			
		||||
# Copyright (c) 2014 Tiancheng "Timothy" Gu
 | 
			
		||||
#
 | 
			
		||||
# This file is part of FFmpeg.
 | 
			
		||||
#
 | 
			
		||||
# FFmpeg 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 3 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
 | 
			
		||||
# General Public License for more details.
 | 
			
		||||
#
 | 
			
		||||
# You should have received a copy of the GNU 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
 | 
			
		||||
 | 
			
		||||
# no navigation elements
 | 
			
		||||
set_from_init_file('HEADERS', 0);
 | 
			
		||||
 | 
			
		||||
# TOC and Chapter headings link
 | 
			
		||||
set_from_init_file('TOC_LINKS', 1);
 | 
			
		||||
 | 
			
		||||
# print the TOC where @contents is used
 | 
			
		||||
set_from_init_file('INLINE_CONTENTS', 1);
 | 
			
		||||
 | 
			
		||||
# make chapters <h2>
 | 
			
		||||
set_from_init_file('CHAPTER_HEADER_LEVEL', 2);
 | 
			
		||||
 | 
			
		||||
# Do not add <hr>
 | 
			
		||||
set_from_init_file('DEFAULT_RULE', '');
 | 
			
		||||
set_from_init_file('BIG_RULE', '');
 | 
			
		||||
 | 
			
		||||
# Customized file beginning
 | 
			
		||||
sub ffmpeg_begin_file($$$)
 | 
			
		||||
{
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    my $filename = shift;
 | 
			
		||||
    my $element = shift;
 | 
			
		||||
 | 
			
		||||
    my $command;
 | 
			
		||||
    if ($element and $self->get_conf('SPLIT')) {
 | 
			
		||||
        $command = $self->element_command($element);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my ($title, $description, $encoding, $date, $css_lines,
 | 
			
		||||
        $doctype, $bodytext, $copying_comment, $after_body_open,
 | 
			
		||||
        $extra_head, $program_and_version, $program_homepage,
 | 
			
		||||
        $program, $generator) = $self->_file_header_informations($command);
 | 
			
		||||
 | 
			
		||||
    my $links = $self->_get_links ($filename, $element);
 | 
			
		||||
 | 
			
		||||
    my $head1 = $ENV{"FFMPEG_HEADER1"} || <<EOT;
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 | 
			
		||||
<html>
 | 
			
		||||
<!-- Created by $program_and_version, $program_homepage -->
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <title>
 | 
			
		||||
EOT
 | 
			
		||||
    my $head_title = <<EOT;
 | 
			
		||||
      $title
 | 
			
		||||
EOT
 | 
			
		||||
 | 
			
		||||
    my $head2 = $ENV{"FFMPEG_HEADER2"} || <<EOT;
 | 
			
		||||
    </title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="bootstrap.min.css">
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="style.min.css">
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <div style="width: 95%; margin: auto">
 | 
			
		||||
      <h1>
 | 
			
		||||
EOT
 | 
			
		||||
 | 
			
		||||
    my $head3 = $ENV{"FFMPEG_HEADER3"} || <<EOT;
 | 
			
		||||
      </h1>
 | 
			
		||||
EOT
 | 
			
		||||
 | 
			
		||||
    return $head1 . $head_title . $head2 . $head_title . $head3;
 | 
			
		||||
}
 | 
			
		||||
texinfo_register_formatting_function('begin_file', \&ffmpeg_begin_file);
 | 
			
		||||
 | 
			
		||||
# Customized file ending
 | 
			
		||||
sub ffmpeg_end_file($)
 | 
			
		||||
{
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    my $program_string = &{$self->{'format_program_string'}}($self);
 | 
			
		||||
    my $program_text = <<EOT;
 | 
			
		||||
      <p style="font-size: small;">
 | 
			
		||||
        $program_string
 | 
			
		||||
      </p>
 | 
			
		||||
EOT
 | 
			
		||||
    my $footer = $ENV{FFMPEG_FOOTER} || <<EOT;
 | 
			
		||||
    </div>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
EOT
 | 
			
		||||
    return $program_text . $footer;
 | 
			
		||||
}
 | 
			
		||||
texinfo_register_formatting_function('end_file', \&ffmpeg_end_file);
 | 
			
		||||
 | 
			
		||||
# Dummy title command
 | 
			
		||||
# Ignore title. Title is handled through ffmpeg_begin_file().
 | 
			
		||||
set_from_init_file('USE_TITLEPAGE_FOR_TITLE', 1);
 | 
			
		||||
sub ffmpeg_title($$$$)
 | 
			
		||||
{
 | 
			
		||||
    return '';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
texinfo_register_command_formatting('titlefont',
 | 
			
		||||
                                    \&ffmpeg_title);
 | 
			
		||||
 | 
			
		||||
# Customized float command. Part of code borrowed from GNU Texinfo.
 | 
			
		||||
sub ffmpeg_float($$$$$)
 | 
			
		||||
{
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    my $cmdname = shift;
 | 
			
		||||
    my $command = shift;
 | 
			
		||||
    my $args = shift;
 | 
			
		||||
    my $content = shift;
 | 
			
		||||
 | 
			
		||||
    my ($caption, $prepended) = Texinfo::Common::float_name_caption($self,
 | 
			
		||||
                                                                $command);
 | 
			
		||||
    my $caption_text = '';
 | 
			
		||||
    my $prepended_text;
 | 
			
		||||
    my $prepended_save = '';
 | 
			
		||||
 | 
			
		||||
    if ($self->in_string()) {
 | 
			
		||||
        if ($prepended) {
 | 
			
		||||
            $prepended_text = $self->convert_tree_new_formatting_context(
 | 
			
		||||
                $prepended, 'float prepended');
 | 
			
		||||
        } else {
 | 
			
		||||
            $prepended_text = '';
 | 
			
		||||
        }
 | 
			
		||||
        if ($caption) {
 | 
			
		||||
            $caption_text = $self->convert_tree_new_formatting_context(
 | 
			
		||||
                {'contents' => $caption->{'args'}->[0]->{'contents'}},
 | 
			
		||||
                'float caption');
 | 
			
		||||
        }
 | 
			
		||||
        return $prepended.$content.$caption_text;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $id = $self->command_id($command);
 | 
			
		||||
    my $label;
 | 
			
		||||
    if (defined($id) and $id ne '') {
 | 
			
		||||
        $label = "<a name=\"$id\"></a>";
 | 
			
		||||
    } else {
 | 
			
		||||
        $label = '';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($prepended) {
 | 
			
		||||
        if ($caption) {
 | 
			
		||||
            # prepend the prepended tree to the first paragraph
 | 
			
		||||
            my @caption_original_contents = @{$caption->{'args'}->[0]->{'contents'}};
 | 
			
		||||
            my @caption_contents;
 | 
			
		||||
            my $new_paragraph;
 | 
			
		||||
            while (@caption_original_contents) {
 | 
			
		||||
                my $content = shift @caption_original_contents;
 | 
			
		||||
                if ($content->{'type'} and $content->{'type'} eq 'paragraph') {
 | 
			
		||||
                    %{$new_paragraph} = %{$content};
 | 
			
		||||
                    $new_paragraph->{'contents'} = [@{$content->{'contents'}}];
 | 
			
		||||
                    unshift (@{$new_paragraph->{'contents'}}, {'cmdname' => 'strong',
 | 
			
		||||
                             'args' => [{'type' => 'brace_command_arg',
 | 
			
		||||
                                                    'contents' => [$prepended]}]});
 | 
			
		||||
                    push @caption_contents, $new_paragraph;
 | 
			
		||||
                    last;
 | 
			
		||||
                } else {
 | 
			
		||||
                    push @caption_contents, $content;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            push @caption_contents, @caption_original_contents;
 | 
			
		||||
            if ($new_paragraph) {
 | 
			
		||||
                $caption_text = $self->convert_tree_new_formatting_context(
 | 
			
		||||
                 {'contents' => \@caption_contents}, 'float caption');
 | 
			
		||||
                $prepended_text = '';
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if ($caption_text eq '') {
 | 
			
		||||
            $prepended_text = $self->convert_tree_new_formatting_context(
 | 
			
		||||
                $prepended, 'float prepended');
 | 
			
		||||
            if ($prepended_text ne '') {
 | 
			
		||||
                $prepended_save = $prepended_text;
 | 
			
		||||
                $prepended_text = '<p><strong>'.$prepended_text.'</strong></p>';
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        $prepended_text = '';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($caption and $caption_text eq '') {
 | 
			
		||||
        $caption_text = $self->convert_tree_new_formatting_context(
 | 
			
		||||
            $caption->{'args'}->[0], 'float caption');
 | 
			
		||||
    }
 | 
			
		||||
    if ($prepended_text.$caption_text ne '') {
 | 
			
		||||
        $prepended_text = $self->_attribute_class('div','float-caption'). '>'
 | 
			
		||||
                . $prepended_text;
 | 
			
		||||
        $caption_text .= '</div>';
 | 
			
		||||
    }
 | 
			
		||||
    my $html_class = '';
 | 
			
		||||
    if ($prepended_save =~ /NOTE/) {
 | 
			
		||||
        $html_class = 'info';
 | 
			
		||||
        $prepended_text = '';
 | 
			
		||||
        $caption_text   = '';
 | 
			
		||||
    } elsif ($prepended_save =~ /IMPORTANT/) {
 | 
			
		||||
        $html_class = 'warning';
 | 
			
		||||
        $prepended_text = '';
 | 
			
		||||
        $caption_text   = '';
 | 
			
		||||
    }
 | 
			
		||||
    return $self->_attribute_class('div', $html_class). '>' . "\n" .
 | 
			
		||||
        $prepended_text . $caption_text . $content . '</div>';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
texinfo_register_command_formatting('float',
 | 
			
		||||
                                    \&ffmpeg_float);
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -282,14 +282,6 @@ INF: while(<$inf>) {
 | 
			
		||||
        $_ = "\n=over 4\n";
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /^\@(multitable)\s+{.*/ and do {
 | 
			
		||||
        push @endwstack, $endw;
 | 
			
		||||
        push @icstack, $ic;
 | 
			
		||||
        $endw = $1;
 | 
			
		||||
        $ic = "";
 | 
			
		||||
        $_ = "\n=over 4\n";
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /^\@((?:small)?example|display)/ and do {
 | 
			
		||||
        push @endwstack, $endw;
 | 
			
		||||
        $endw = $1;
 | 
			
		||||
@@ -306,10 +298,10 @@ INF: while(<$inf>) {
 | 
			
		||||
 | 
			
		||||
    /^\@tab\s+(.*\S)\s*$/ and $endw eq "multitable" and do {
 | 
			
		||||
        my $columns = $1;
 | 
			
		||||
        $columns =~ s/\@tab//;
 | 
			
		||||
        $columns =~ s/\@tab/ : /;
 | 
			
		||||
 | 
			
		||||
        $_ = $columns;
 | 
			
		||||
        $chapter =~ s/$//;
 | 
			
		||||
        $_ = " : ". $columns;
 | 
			
		||||
        $chapter =~ s/\n+\s+$//;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /^\@itemx?\s*(.+)?$/ and do {
 | 
			
		||||
@@ -332,12 +324,12 @@ $inf = pop @instack;
 | 
			
		||||
 | 
			
		||||
die "No filename or title\n" unless defined $fn && defined $tl;
 | 
			
		||||
 | 
			
		||||
# always use utf8
 | 
			
		||||
print "=encoding utf8\n\n";
 | 
			
		||||
 | 
			
		||||
$chapters{NAME} = "$fn \- $tl\n";
 | 
			
		||||
$chapters{FOOTNOTES} .= "=back\n" if exists $chapters{FOOTNOTES};
 | 
			
		||||
 | 
			
		||||
# always use utf8
 | 
			
		||||
print "=encoding utf8\n\n";
 | 
			
		||||
 | 
			
		||||
unshift @chapters_sequence, "NAME";
 | 
			
		||||
for $chapter (@chapters_sequence) {
 | 
			
		||||
    if (exists $chapters{$chapter}) {
 | 
			
		||||
 
 | 
			
		||||
@@ -782,9 +782,6 @@ large numbers (usually 2^53 and larger).
 | 
			
		||||
Round the value of expression @var{expr} upwards to the nearest
 | 
			
		||||
integer. For example, "ceil(1.5)" is "2.0".
 | 
			
		||||
 | 
			
		||||
@item clip(x, min, max)
 | 
			
		||||
Return the value of @var{x} clipped between @var{min} and @var{max}.
 | 
			
		||||
 | 
			
		||||
@item cos(x)
 | 
			
		||||
Compute cosine of @var{x}.
 | 
			
		||||
 | 
			
		||||
@@ -844,7 +841,7 @@ Return 1.0 if @var{x} is +/-INFINITY, 0.0 otherwise.
 | 
			
		||||
Return 1.0 if @var{x} is NAN, 0.0 otherwise.
 | 
			
		||||
 | 
			
		||||
@item ld(var)
 | 
			
		||||
Load the value of the internal variable with number
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
@@ -912,7 +909,7 @@ Compute the square root of @var{expr}. This is equivalent to
 | 
			
		||||
Compute expression @code{1/(1 + exp(4*x))}.
 | 
			
		||||
 | 
			
		||||
@item st(var, expr)
 | 
			
		||||
Store the value of the expression @var{expr} in an internal
 | 
			
		||||
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.
 | 
			
		||||
@@ -1034,7 +1031,7 @@ indication of the corresponding powers of 10 and of 2.
 | 
			
		||||
10^24 / 2^70
 | 
			
		||||
@end table
 | 
			
		||||
 | 
			
		||||
@c man end EXPRESSION EVALUATION
 | 
			
		||||
@c man end
 | 
			
		||||
 | 
			
		||||
@chapter OpenCL Options
 | 
			
		||||
@c man begin OPENCL OPTIONS
 | 
			
		||||
 
 | 
			
		||||
@@ -1,423 +0,0 @@
 | 
			
		||||
This document is a tutorial/initiation for writing simple filters in
 | 
			
		||||
libavfilter.
 | 
			
		||||
 | 
			
		||||
Foreword: just like everything else in FFmpeg, libavfilter is monolithic, which
 | 
			
		||||
means that it is highly recommended that you submit your filters to the FFmpeg
 | 
			
		||||
development mailing-list and make sure it is applied. Otherwise, your filter is
 | 
			
		||||
likely to have a very short lifetime due to more a less regular internal API
 | 
			
		||||
changes, and a limited distribution, review, and testing.
 | 
			
		||||
 | 
			
		||||
Bootstrap
 | 
			
		||||
=========
 | 
			
		||||
 | 
			
		||||
Let's say you want to write a new simple video filter called "foobar" which
 | 
			
		||||
takes one frame in input, changes the pixels in whatever fashion you fancy, and
 | 
			
		||||
outputs the modified frame. The most simple way of doing this is to take a
 | 
			
		||||
similar filter.  We'll pick edgedetect, but any other should do. You can look
 | 
			
		||||
for others using the `./ffmpeg -v 0 -filters|grep ' V->V '` command.
 | 
			
		||||
 | 
			
		||||
 - sed 's/edgedetect/foobar/g;s/EdgeDetect/Foobar/g' libavfilter/vf_edgedetect.c > libavfilter/vf_foobar.c
 | 
			
		||||
 - edit libavfilter/Makefile, and add an entry for "foobar" following the
 | 
			
		||||
   pattern of the other filters.
 | 
			
		||||
 - edit libavfilter/allfilters.c, and add an entry for "foobar" following the
 | 
			
		||||
   pattern of the other filters.
 | 
			
		||||
 - ./configure ...
 | 
			
		||||
 - make -j<whatever> ffmpeg
 | 
			
		||||
 - ./ffmpeg -i http://samples.ffmpeg.org/image-samples/lena.pnm -vf foobar foobar.png
 | 
			
		||||
   Note here: you can obviously use a random local image instead of a remote URL.
 | 
			
		||||
 | 
			
		||||
If everything went right, you should get a foobar.png with Lena edge-detected.
 | 
			
		||||
 | 
			
		||||
That's it, your new playground is ready.
 | 
			
		||||
 | 
			
		||||
Some little details about what's going on:
 | 
			
		||||
libavfilter/allfilters.c:avfilter_register_all() is called at runtime to create
 | 
			
		||||
a list of the available filters, but it's important to know that this file is
 | 
			
		||||
also parsed by the configure script, which in turn will define variables for
 | 
			
		||||
the build system and the C:
 | 
			
		||||
 | 
			
		||||
    --- after running configure ---
 | 
			
		||||
 | 
			
		||||
    $ grep FOOBAR config.mak
 | 
			
		||||
    CONFIG_FOOBAR_FILTER=yes
 | 
			
		||||
    $ grep FOOBAR config.h
 | 
			
		||||
    #define CONFIG_FOOBAR_FILTER 1
 | 
			
		||||
 | 
			
		||||
CONFIG_FOOBAR_FILTER=yes from the config.mak is later used to enable the filter in
 | 
			
		||||
libavfilter/Makefile and CONFIG_FOOBAR_FILTER=1 from the config.h will be used
 | 
			
		||||
for registering the filter in libavfilter/allfilters.c.
 | 
			
		||||
 | 
			
		||||
Filter code layout
 | 
			
		||||
==================
 | 
			
		||||
 | 
			
		||||
You now need some theory about the general code layout of a filter. Open your
 | 
			
		||||
libavfilter/vf_foobar.c. This section will detail the important parts of the
 | 
			
		||||
code you need to understand before messing with it.
 | 
			
		||||
 | 
			
		||||
Copyright
 | 
			
		||||
---------
 | 
			
		||||
 | 
			
		||||
First chunk is the copyright. Most filters are LGPL, and we are assuming
 | 
			
		||||
vf_foobar is as well. We are also assuming vf_foobar is not an edge detector
 | 
			
		||||
filter, so you can update the boilerplate with your credits.
 | 
			
		||||
 | 
			
		||||
Doxy
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
Next chunk is the Doxygen about the file. See http://ffmpeg.org/doxygen/trunk/.
 | 
			
		||||
Detail here what the filter is, does, and add some references if you feel like
 | 
			
		||||
it.
 | 
			
		||||
 | 
			
		||||
Context
 | 
			
		||||
-------
 | 
			
		||||
 | 
			
		||||
Skip the headers and scroll down to the definition of FoobarContext. This is
 | 
			
		||||
your local state context. It is already filled with 0 when you get it so do not
 | 
			
		||||
worry about uninitialized read into this context. This is where you put every
 | 
			
		||||
"global" information you need, typically the variable storing the user options.
 | 
			
		||||
You'll notice the first field "const AVClass *class"; it's the only field you
 | 
			
		||||
need to keep assuming you have a context. There are some magic you don't care
 | 
			
		||||
about around this field, just let it be (in first position) for now.
 | 
			
		||||
 | 
			
		||||
Options
 | 
			
		||||
-------
 | 
			
		||||
 | 
			
		||||
Then comes the options array. This is what will define the user accessible
 | 
			
		||||
options. For example, -vf foobar=mode=colormix:high=0.4:low=0.1. Most options
 | 
			
		||||
have the following pattern:
 | 
			
		||||
  name, description, offset, type, default value, minimum value, maximum value, flags
 | 
			
		||||
 | 
			
		||||
 - name is the option name, keep it simple, lowercase
 | 
			
		||||
 - description are short, in lowercase, without period, and describe what they
 | 
			
		||||
   do, for example "set the foo of the bar"
 | 
			
		||||
 - offset is the offset of the field in your local context, see the OFFSET()
 | 
			
		||||
   macro; the option parser will use that information to fill the fields
 | 
			
		||||
   according to the user input
 | 
			
		||||
 - type is any of AV_OPT_TYPE_* defined in libavutil/opt.h
 | 
			
		||||
 - default value is an union where you pick the appropriate type; "{.dbl=0.3}",
 | 
			
		||||
   "{.i64=0x234}", "{.str=NULL}", ...
 | 
			
		||||
 - min and max values define the range of available values, inclusive
 | 
			
		||||
 - flags are AVOption generic flags. See AV_OPT_FLAG_* definitions
 | 
			
		||||
 | 
			
		||||
In doubt, just look at the other AVOption definitions all around the codebase,
 | 
			
		||||
there are tons of examples.
 | 
			
		||||
 | 
			
		||||
Class
 | 
			
		||||
-----
 | 
			
		||||
 | 
			
		||||
AVFILTER_DEFINE_CLASS(foobar) will define a unique foobar_class with some kind
 | 
			
		||||
of signature referencing the options, etc. which will be referenced in the
 | 
			
		||||
definition of the AVFilter.
 | 
			
		||||
 | 
			
		||||
Filter definition
 | 
			
		||||
-----------------
 | 
			
		||||
 | 
			
		||||
At the end of the file, you will find foobar_inputs, foobar_outputs and
 | 
			
		||||
the AVFilter ff_vf_foobar. Don't forget to update the AVFilter.description with
 | 
			
		||||
a description of what the filter does, starting with a capitalized letter and
 | 
			
		||||
ending with a period. You'd better drop the AVFilter.flags entry for now, and
 | 
			
		||||
re-add them later depending on the capabilities of your filter.
 | 
			
		||||
 | 
			
		||||
Callbacks
 | 
			
		||||
---------
 | 
			
		||||
 | 
			
		||||
Let's now study the common callbacks. Before going into details, note that all
 | 
			
		||||
these callbacks are explained in details in libavfilter/avfilter.h, so in
 | 
			
		||||
doubt, refer to the doxy in that file.
 | 
			
		||||
 | 
			
		||||
init()
 | 
			
		||||
~~~~~~
 | 
			
		||||
 | 
			
		||||
First one to be called is init(). It's flagged as cold because not called
 | 
			
		||||
often. Look for "cold" on
 | 
			
		||||
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html for more
 | 
			
		||||
information.
 | 
			
		||||
 | 
			
		||||
As the name suggests, init() is where you eventually initialize and allocate
 | 
			
		||||
your buffers, pre-compute your data, etc. Note that at this point, your local
 | 
			
		||||
context already has the user options initialized, but you still haven't any
 | 
			
		||||
clue about the kind of data input you will get, so this function is often
 | 
			
		||||
mainly used to sanitize the user options.
 | 
			
		||||
 | 
			
		||||
Some init()s will also define the number of inputs or outputs dynamically
 | 
			
		||||
according to the user options. A good example of this is the split filter, but
 | 
			
		||||
we won't cover this here since vf_foobar is just a simple 1:1 filter.
 | 
			
		||||
 | 
			
		||||
uninit()
 | 
			
		||||
~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Similarly, there is the uninit() callback, doing what the name suggest. Free
 | 
			
		||||
everything you allocated here.
 | 
			
		||||
 | 
			
		||||
query_formats()
 | 
			
		||||
~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
This is following the init() and is used for the format negotiation, basically
 | 
			
		||||
where you say what pixel format(s) (gray, rgb 32, yuv 4:2:0, ...) you accept
 | 
			
		||||
for your inputs, and what you can output. All pixel formats are defined in
 | 
			
		||||
libavutil/pixfmt.h. If you don't change the pixel format between the input and
 | 
			
		||||
the output, you just have to define a pixel formats array and call
 | 
			
		||||
ff_set_common_formats(). For more complex negotiation, you can refer to other
 | 
			
		||||
filters such as vf_scale.
 | 
			
		||||
 | 
			
		||||
config_props()
 | 
			
		||||
~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
This callback is not necessary, but you will probably have one or more
 | 
			
		||||
config_props() anyway. It's not a callback for the filter itself but for its
 | 
			
		||||
inputs or outputs (they're called "pads" - AVFilterPad - in libavfilter's
 | 
			
		||||
lexicon).
 | 
			
		||||
 | 
			
		||||
Inside the input config_props(), you are at a point where you know which pixel
 | 
			
		||||
format has been picked after query_formats(), and more information such as the
 | 
			
		||||
video width and height (inlink->{w,h}). So if you need to update your internal
 | 
			
		||||
context state depending on your input you can do it here. In edgedetect you can
 | 
			
		||||
see that this callback is used to allocate buffers depending on these
 | 
			
		||||
information. They will be destroyed in uninit().
 | 
			
		||||
 | 
			
		||||
Inside the output config_props(), you can define what you want to change in the
 | 
			
		||||
output. Typically, if your filter is going to double the size of the video, you
 | 
			
		||||
will update outlink->w and outlink->h.
 | 
			
		||||
 | 
			
		||||
filter_frame()
 | 
			
		||||
~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
This is the callback you are waiting from the beginning: it is where you
 | 
			
		||||
process the received frames. Along with the frame, you get the input link from
 | 
			
		||||
where the frame comes from.
 | 
			
		||||
 | 
			
		||||
    static int filter_frame(AVFilterLink *inlink, AVFrame *in) { ... }
 | 
			
		||||
 | 
			
		||||
You can get the filter context through that input link:
 | 
			
		||||
 | 
			
		||||
    AVFilterContext *ctx = inlink->dst;
 | 
			
		||||
 | 
			
		||||
Then access your internal state context:
 | 
			
		||||
 | 
			
		||||
    FoobarContext *foobar = ctx->priv;
 | 
			
		||||
 | 
			
		||||
And also the output link where you will send your frame when you are done:
 | 
			
		||||
 | 
			
		||||
    AVFilterLink *outlink = ctx->outputs[0];
 | 
			
		||||
 | 
			
		||||
Here, we are picking the first output. You can have several, but in our case we
 | 
			
		||||
only have one since we are in a 1:1 input-output situation.
 | 
			
		||||
 | 
			
		||||
If you want to define a simple pass-through filter, you can just do:
 | 
			
		||||
 | 
			
		||||
    return ff_filter_frame(outlink, in);
 | 
			
		||||
 | 
			
		||||
But of course, you probably want to change the data of that frame.
 | 
			
		||||
 | 
			
		||||
This can be done by accessing frame->data[] and frame->linesize[].  Important
 | 
			
		||||
note here: the width does NOT match the linesize. The linesize is always
 | 
			
		||||
greater or equal to the width. The padding created should not be changed or
 | 
			
		||||
even read. Typically, keep in mind that a previous filter in your chain might
 | 
			
		||||
have altered the frame dimension but not the linesize. Imagine a crop filter
 | 
			
		||||
that halves the video size: the linesizes won't be changed, just the width.
 | 
			
		||||
 | 
			
		||||
    <-------------- linesize ------------------------>
 | 
			
		||||
    +-------------------------------+----------------+ ^
 | 
			
		||||
    |                               |                | |
 | 
			
		||||
    |                               |                | |
 | 
			
		||||
    |           picture             |    padding     | | height
 | 
			
		||||
    |                               |                | |
 | 
			
		||||
    |                               |                | |
 | 
			
		||||
    +-------------------------------+----------------+ v
 | 
			
		||||
    <----------- width ------------->
 | 
			
		||||
 | 
			
		||||
Before modifying the "in" frame, you have to make sure it is writable, or get a
 | 
			
		||||
new one. Multiple scenarios are possible here depending on the kind of
 | 
			
		||||
processing you are doing.
 | 
			
		||||
 | 
			
		||||
Let's say you want to change one pixel depending on multiple pixels (typically
 | 
			
		||||
the surrounding ones) of the input. In that case, you can't do an in-place
 | 
			
		||||
processing of the input so you will need to allocate a new frame, with the same
 | 
			
		||||
properties as the input one, and send that new frame to the next filter:
 | 
			
		||||
 | 
			
		||||
    AVFrame *out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
 | 
			
		||||
    if (!out) {
 | 
			
		||||
        av_frame_free(&in);
 | 
			
		||||
        return AVERROR(ENOMEM);
 | 
			
		||||
    }
 | 
			
		||||
    av_frame_copy_props(out, in);
 | 
			
		||||
 | 
			
		||||
    // out->data[...] = foobar(in->data[...])
 | 
			
		||||
 | 
			
		||||
    av_frame_free(&in);
 | 
			
		||||
    return ff_filter_frame(outlink, out);
 | 
			
		||||
 | 
			
		||||
In-place processing
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
If you can just alter the input frame, you probably just want to do that
 | 
			
		||||
instead:
 | 
			
		||||
 | 
			
		||||
    av_frame_make_writable(in);
 | 
			
		||||
    // in->data[...] = foobar(in->data[...])
 | 
			
		||||
    return ff_filter_frame(outlink, in);
 | 
			
		||||
 | 
			
		||||
You may wonder why a frame might not be writable. The answer is that for
 | 
			
		||||
example a previous filter might still own the frame data: imagine a filter
 | 
			
		||||
prior to yours in the filtergraph that needs to cache the frame. You must not
 | 
			
		||||
alter that frame, otherwise it will make that previous filter buggy. This is
 | 
			
		||||
where av_frame_make_writable() helps (it won't have any effect if the frame
 | 
			
		||||
already is writable).
 | 
			
		||||
 | 
			
		||||
The problem with using av_frame_make_writable() is that in the worst case it
 | 
			
		||||
will copy the whole input frame before you change it all over again with your
 | 
			
		||||
filter: if the frame is not writable, av_frame_make_writable() will allocate
 | 
			
		||||
new buffers, and copy the input frame data. You don't want that, and you can
 | 
			
		||||
avoid it by just allocating a new buffer if necessary, and process from in to
 | 
			
		||||
out in your filter, saving the memcpy. Generally, this is done following this
 | 
			
		||||
scheme:
 | 
			
		||||
 | 
			
		||||
    int direct = 0;
 | 
			
		||||
    AVFrame *out;
 | 
			
		||||
 | 
			
		||||
    if (av_frame_is_writable(in)) {
 | 
			
		||||
        direct = 1;
 | 
			
		||||
        out = in;
 | 
			
		||||
    } else {
 | 
			
		||||
        out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
 | 
			
		||||
        if (!out) {
 | 
			
		||||
            av_frame_free(&in);
 | 
			
		||||
            return AVERROR(ENOMEM);
 | 
			
		||||
        }
 | 
			
		||||
        av_frame_copy_props(out, in);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // out->data[...] = foobar(in->data[...])
 | 
			
		||||
 | 
			
		||||
    if (!direct)
 | 
			
		||||
        av_frame_free(&in);
 | 
			
		||||
    return ff_filter_frame(outlink, out);
 | 
			
		||||
 | 
			
		||||
Of course, this will only work if you can do in-place processing. To test if
 | 
			
		||||
your filter handles well the permissions, you can use the perms filter. For
 | 
			
		||||
example with:
 | 
			
		||||
 | 
			
		||||
    -vf perms=random,foobar
 | 
			
		||||
 | 
			
		||||
Make sure no automatic pixel conversion is inserted between perms and foobar,
 | 
			
		||||
otherwise the frames permissions might change again and the test will be
 | 
			
		||||
meaningless: add av_log(0,0,"direct=%d\n",direct) in your code to check that.
 | 
			
		||||
You can avoid the issue with something like:
 | 
			
		||||
 | 
			
		||||
    -vf format=rgb24,perms=random,foobar
 | 
			
		||||
 | 
			
		||||
...assuming your filter accepts rgb24 of course. This will make sure the
 | 
			
		||||
necessary conversion is inserted before the perms filter.
 | 
			
		||||
 | 
			
		||||
Timeline
 | 
			
		||||
~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Adding timeline support
 | 
			
		||||
(http://ffmpeg.org/ffmpeg-filters.html#Timeline-editing) is often an easy
 | 
			
		||||
feature to add. In the most simple case, you just have to add
 | 
			
		||||
AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC to the AVFilter.flags. You can typically
 | 
			
		||||
do this when your filter does not need to save the previous context frames, or
 | 
			
		||||
basically if your filter just alter whatever goes in and doesn't need
 | 
			
		||||
previous/future information. See for instance commit 86cb986ce that adds
 | 
			
		||||
timeline support to the fieldorder filter.
 | 
			
		||||
 | 
			
		||||
In some cases, you might need to reset your context somehow. This is handled by
 | 
			
		||||
the AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL flag which is used if the filter
 | 
			
		||||
must not process the frames but still wants to keep track of the frames going
 | 
			
		||||
through (to keep them in cache for when it's enabled again). See for example
 | 
			
		||||
commit 69d72140a that adds timeline support to the phase filter.
 | 
			
		||||
 | 
			
		||||
Threading
 | 
			
		||||
~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
libavfilter does not yet support frame threading, but you can add slice
 | 
			
		||||
threading to your filters.
 | 
			
		||||
 | 
			
		||||
Let's say the foobar filter has the following frame processing function:
 | 
			
		||||
 | 
			
		||||
    dst = out->data[0];
 | 
			
		||||
    src = in ->data[0];
 | 
			
		||||
 | 
			
		||||
    for (y = 0; y < inlink->h; y++) {
 | 
			
		||||
        for (x = 0; x < inlink->w; x++)
 | 
			
		||||
            dst[x] = foobar(src[x]);
 | 
			
		||||
        dst += out->linesize[0];
 | 
			
		||||
        src += in ->linesize[0];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
The first thing is to make this function work into slices. The new code will
 | 
			
		||||
look like this:
 | 
			
		||||
 | 
			
		||||
    for (y = slice_start; y < slice_end; y++) {
 | 
			
		||||
        for (x = 0; x < inlink->w; x++)
 | 
			
		||||
            dst[x] = foobar(src[x]);
 | 
			
		||||
        dst += out->linesize[0];
 | 
			
		||||
        src += in ->linesize[0];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
The source and destination pointers, and slice_start/slice_end will be defined
 | 
			
		||||
according to the number of jobs. Generally, it looks like this:
 | 
			
		||||
 | 
			
		||||
    const int slice_start = (in->height *  jobnr   ) / nb_jobs;
 | 
			
		||||
    const int slice_end   = (in->height * (jobnr+1)) / nb_jobs;
 | 
			
		||||
    uint8_t       *dst = out->data[0] + slice_start * out->linesize[0];
 | 
			
		||||
    const uint8_t *src =  in->data[0] + slice_start *  in->linesize[0];
 | 
			
		||||
 | 
			
		||||
This new code will be isolated in a new filter_slice():
 | 
			
		||||
 | 
			
		||||
    static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) { ... }
 | 
			
		||||
 | 
			
		||||
Note that we need our input and output frame to define slice_{start,end} and
 | 
			
		||||
dst/src, which are not available in that callback. They will be transmitted
 | 
			
		||||
through the opaque void *arg. You have to define a structure which contains
 | 
			
		||||
everything you need:
 | 
			
		||||
 | 
			
		||||
    typedef struct ThreadData {
 | 
			
		||||
        AVFrame *in, *out;
 | 
			
		||||
    } ThreadData;
 | 
			
		||||
 | 
			
		||||
If you need some more information from your local context, put them here.
 | 
			
		||||
 | 
			
		||||
In you filter_slice function, you access it like that:
 | 
			
		||||
 | 
			
		||||
    const ThreadData *td = arg;
 | 
			
		||||
 | 
			
		||||
Then in your filter_frame() callback, you need to call the threading
 | 
			
		||||
distributor with something like this:
 | 
			
		||||
 | 
			
		||||
    ThreadData td;
 | 
			
		||||
 | 
			
		||||
    // ...
 | 
			
		||||
 | 
			
		||||
    td.in  = in;
 | 
			
		||||
    td.out = out;
 | 
			
		||||
    ctx->internal->execute(ctx, filter_slice, &td, NULL, FFMIN(outlink->h, ctx->graph->nb_threads));
 | 
			
		||||
 | 
			
		||||
    // ...
 | 
			
		||||
 | 
			
		||||
    return ff_filter_frame(outlink, out);
 | 
			
		||||
 | 
			
		||||
Last step is to add AVFILTER_FLAG_SLICE_THREADS flag to AVFilter.flags.
 | 
			
		||||
 | 
			
		||||
For more example of slice threading additions, you can try to run git log -p
 | 
			
		||||
--grep 'slice threading' libavfilter/
 | 
			
		||||
 | 
			
		||||
Finalization
 | 
			
		||||
~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
When your awesome filter is finished, you have a few more steps before you're
 | 
			
		||||
done:
 | 
			
		||||
 | 
			
		||||
 - write its documentation in doc/filters.texi, and test the output with make
 | 
			
		||||
   doc/ffmpeg-filters.html.
 | 
			
		||||
 - add a FATE test, generally by adding an entry in
 | 
			
		||||
   tests/fate/filter-video.mak, add running make fate-filter-foobar GEN=1 to
 | 
			
		||||
   generate the data.
 | 
			
		||||
 - add an entry in the Changelog
 | 
			
		||||
 - edit libavfilter/version.h and increase LIBAVFILTER_VERSION_MINOR by one
 | 
			
		||||
   (and reset LIBAVFILTER_VERSION_MICRO to 100)
 | 
			
		||||
 - git add ... && git commit -m "avfilter: add foobar filter." && git format-patch -1
 | 
			
		||||
 | 
			
		||||
When all of this is done, you can submit your patch to the ffmpeg-devel
 | 
			
		||||
mailing-list for review.  If you need any help, feel free to come on our IRC
 | 
			
		||||
channel, #ffmpeg-devel on irc.freenode.net.
 | 
			
		||||
							
								
								
									
										52
									
								
								ffmpeg.h
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								ffmpeg.h
									
									
									
									
									
								
							@@ -44,7 +44,6 @@
 | 
			
		||||
#include "libavutil/fifo.h"
 | 
			
		||||
#include "libavutil/pixfmt.h"
 | 
			
		||||
#include "libavutil/rational.h"
 | 
			
		||||
#include "libavutil/threadmessage.h"
 | 
			
		||||
 | 
			
		||||
#include "libswresample/swresample.h"
 | 
			
		||||
 | 
			
		||||
@@ -61,8 +60,6 @@ enum HWAccelID {
 | 
			
		||||
    HWACCEL_NONE = 0,
 | 
			
		||||
    HWACCEL_AUTO,
 | 
			
		||||
    HWACCEL_VDPAU,
 | 
			
		||||
    HWACCEL_DXVA2,
 | 
			
		||||
    HWACCEL_VDA,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct HWAccel {
 | 
			
		||||
@@ -204,8 +201,6 @@ typedef struct OptionsContext {
 | 
			
		||||
    int        nb_guess_layout_max;
 | 
			
		||||
    SpecifierOpt *apad;
 | 
			
		||||
    int        nb_apad;
 | 
			
		||||
    SpecifierOpt *discard;
 | 
			
		||||
    int        nb_discard;
 | 
			
		||||
} OptionsContext;
 | 
			
		||||
 | 
			
		||||
typedef struct InputFilter {
 | 
			
		||||
@@ -242,12 +237,7 @@ typedef struct InputStream {
 | 
			
		||||
    int file_index;
 | 
			
		||||
    AVStream *st;
 | 
			
		||||
    int discard;             /* true if stream data should be discarded */
 | 
			
		||||
    int user_set_discard;
 | 
			
		||||
    int decoding_needed;     /* non zero if the packets must be decoded in 'raw_fifo', see DECODING_FOR_* */
 | 
			
		||||
#define DECODING_FOR_OST    1
 | 
			
		||||
#define DECODING_FOR_FILTER 2
 | 
			
		||||
 | 
			
		||||
    AVCodecContext *dec_ctx;
 | 
			
		||||
    int decoding_needed;     /* true if the packets must be decoded in 'raw_fifo' */
 | 
			
		||||
    AVCodec *dec;
 | 
			
		||||
    AVFrame *decoded_frame;
 | 
			
		||||
    AVFrame *filter_frame; /* a ref of decoded_frame, to be sent to filters */
 | 
			
		||||
@@ -267,7 +257,7 @@ typedef struct InputStream {
 | 
			
		||||
    double ts_scale;
 | 
			
		||||
    int saw_first_ts;
 | 
			
		||||
    int showed_multi_packet_warning;
 | 
			
		||||
    AVDictionary *decoder_opts;
 | 
			
		||||
    AVDictionary *opts;
 | 
			
		||||
    AVRational framerate;               /* framerate forced with -r */
 | 
			
		||||
    int top_field_first;
 | 
			
		||||
    int guess_layout_max;
 | 
			
		||||
@@ -316,15 +306,6 @@ typedef struct InputStream {
 | 
			
		||||
    int  (*hwaccel_retrieve_data)(AVCodecContext *s, AVFrame *frame);
 | 
			
		||||
    enum AVPixelFormat hwaccel_pix_fmt;
 | 
			
		||||
    enum AVPixelFormat hwaccel_retrieved_pix_fmt;
 | 
			
		||||
 | 
			
		||||
    /* stats */
 | 
			
		||||
    // combined size of all the packets read
 | 
			
		||||
    uint64_t data_size;
 | 
			
		||||
    /* number of packets successfully read for this stream */
 | 
			
		||||
    uint64_t nb_packets;
 | 
			
		||||
    // number of frames/samples retrieved from the decoder
 | 
			
		||||
    uint64_t frames_decoded;
 | 
			
		||||
    uint64_t samples_decoded;
 | 
			
		||||
} InputStream;
 | 
			
		||||
 | 
			
		||||
typedef struct InputFile {
 | 
			
		||||
@@ -344,10 +325,13 @@ typedef struct InputFile {
 | 
			
		||||
    int accurate_seek;
 | 
			
		||||
 | 
			
		||||
#if HAVE_PTHREADS
 | 
			
		||||
    AVThreadMessageQueue *in_thread_queue;
 | 
			
		||||
    pthread_t thread;           /* thread reading from this file */
 | 
			
		||||
    int non_blocking;           /* reading packets from the thread should not block */
 | 
			
		||||
    int finished;               /* the thread has exited */
 | 
			
		||||
    int joined;                 /* the thread has been joined */
 | 
			
		||||
    pthread_mutex_t fifo_lock;  /* lock for access to fifo */
 | 
			
		||||
    pthread_cond_t  fifo_cond;  /* the main thread will signal on this cond after reading from fifo */
 | 
			
		||||
    AVFifoBuffer *fifo;         /* demuxed packets are stored here; freed by the main thread */
 | 
			
		||||
#endif
 | 
			
		||||
} InputFile;
 | 
			
		||||
 | 
			
		||||
@@ -384,12 +368,9 @@ typedef struct OutputStream {
 | 
			
		||||
    /* dts of the last packet sent to the muxer */
 | 
			
		||||
    int64_t last_mux_dts;
 | 
			
		||||
    AVBitStreamFilterContext *bitstream_filters;
 | 
			
		||||
    AVCodecContext *enc_ctx;
 | 
			
		||||
    AVCodec *enc;
 | 
			
		||||
    int64_t max_frames;
 | 
			
		||||
    AVFrame *filtered_frame;
 | 
			
		||||
    AVFrame *last_frame;
 | 
			
		||||
    int last_droped;
 | 
			
		||||
 | 
			
		||||
    /* video only */
 | 
			
		||||
    AVRational frame_rate;
 | 
			
		||||
@@ -407,7 +388,7 @@ typedef struct OutputStream {
 | 
			
		||||
    double forced_keyframes_expr_const_values[FKF_NB];
 | 
			
		||||
 | 
			
		||||
    /* audio only */
 | 
			
		||||
    int *audio_channels_map;             /* list of the channels id to pick from the source stream */
 | 
			
		||||
    int audio_channels_map[SWR_CH_MAX];  /* list of the channels id to pick from the source stream */
 | 
			
		||||
    int audio_channels_mapped;           /* number of channels in audio_channels_map */
 | 
			
		||||
 | 
			
		||||
    char *logfile_prefix;
 | 
			
		||||
@@ -419,10 +400,9 @@ typedef struct OutputStream {
 | 
			
		||||
    char *filters_script;  ///< filtergraph script associated to the -filter_script option
 | 
			
		||||
 | 
			
		||||
    int64_t sws_flags;
 | 
			
		||||
    AVDictionary *encoder_opts;
 | 
			
		||||
    AVDictionary *opts;
 | 
			
		||||
    AVDictionary *swr_opts;
 | 
			
		||||
    AVDictionary *resample_opts;
 | 
			
		||||
    AVDictionary *bsf_args;
 | 
			
		||||
    char *apad;
 | 
			
		||||
    OSTFinished finished;        /* no more packets should be written for this stream */
 | 
			
		||||
    int unavailable;                     /* true if the steram is unavailable (possibly temporarily) */
 | 
			
		||||
@@ -434,15 +414,6 @@ typedef struct OutputStream {
 | 
			
		||||
    int keep_pix_fmt;
 | 
			
		||||
 | 
			
		||||
    AVCodecParserContext *parser;
 | 
			
		||||
 | 
			
		||||
    /* stats */
 | 
			
		||||
    // combined size of all the packets written
 | 
			
		||||
    uint64_t data_size;
 | 
			
		||||
    // number of packets send to the muxer
 | 
			
		||||
    uint64_t packets_written;
 | 
			
		||||
    // number of frames/samples sent to the encoder
 | 
			
		||||
    uint64_t frames_encoded;
 | 
			
		||||
    uint64_t samples_encoded;
 | 
			
		||||
} OutputStream;
 | 
			
		||||
 | 
			
		||||
typedef struct OutputFile {
 | 
			
		||||
@@ -484,7 +455,6 @@ extern int do_deinterlace;
 | 
			
		||||
extern int do_hex_dump;
 | 
			
		||||
extern int do_pkt_dump;
 | 
			
		||||
extern int copy_ts;
 | 
			
		||||
extern int start_at_zero;
 | 
			
		||||
extern int copy_tb;
 | 
			
		||||
extern int debug_ts;
 | 
			
		||||
extern int exit_on_error;
 | 
			
		||||
@@ -494,7 +464,6 @@ extern int stdin_interaction;
 | 
			
		||||
extern int frame_bits_per_raw_sample;
 | 
			
		||||
extern AVIOContext *progress_avio;
 | 
			
		||||
extern float max_error_rate;
 | 
			
		||||
extern int vdpau_api_ver;
 | 
			
		||||
 | 
			
		||||
extern const AVIOInterruptCB int_cb;
 | 
			
		||||
 | 
			
		||||
@@ -510,12 +479,11 @@ void show_usage(void);
 | 
			
		||||
 | 
			
		||||
void opt_output_file(void *optctx, const char *filename);
 | 
			
		||||
 | 
			
		||||
void remove_avoptions(AVDictionary **a, AVDictionary *b);
 | 
			
		||||
void assert_avoptions(AVDictionary *m);
 | 
			
		||||
 | 
			
		||||
int guess_input_channel_layout(InputStream *ist);
 | 
			
		||||
 | 
			
		||||
enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *avctx, AVCodec *codec, enum AVPixelFormat target);
 | 
			
		||||
enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodec *codec, enum AVPixelFormat target);
 | 
			
		||||
void choose_sample_fmt(AVStream *st, AVCodec *codec);
 | 
			
		||||
 | 
			
		||||
int configure_filtergraph(FilterGraph *fg);
 | 
			
		||||
@@ -526,7 +494,5 @@ FilterGraph *init_simple_filtergraph(InputStream *ist, OutputStream *ost);
 | 
			
		||||
int ffmpeg_parse_options(int argc, char **argv);
 | 
			
		||||
 | 
			
		||||
int vdpau_init(AVCodecContext *s);
 | 
			
		||||
int dxva2_init(AVCodecContext *s);
 | 
			
		||||
int vda_init(AVCodecContext *s);
 | 
			
		||||
 | 
			
		||||
#endif /* FFMPEG_H */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										620
									
								
								ffmpeg_dxva2.c
									
									
									
									
									
								
							
							
						
						
									
										620
									
								
								ffmpeg_dxva2.c
									
									
									
									
									
								
							@@ -1,620 +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
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32_WINNT
 | 
			
		||||
#undef _WIN32_WINNT
 | 
			
		||||
#endif
 | 
			
		||||
#define _WIN32_WINNT 0x0600
 | 
			
		||||
#define DXVA2API_USE_BITFIELDS
 | 
			
		||||
#define COBJMACROS
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include <d3d9.h>
 | 
			
		||||
#include <dxva2api.h>
 | 
			
		||||
 | 
			
		||||
#include "ffmpeg.h"
 | 
			
		||||
 | 
			
		||||
#include "libavcodec/dxva2.h"
 | 
			
		||||
 | 
			
		||||
#include "libavutil/avassert.h"
 | 
			
		||||
#include "libavutil/buffer.h"
 | 
			
		||||
#include "libavutil/frame.h"
 | 
			
		||||
#include "libavutil/imgutils.h"
 | 
			
		||||
#include "libavutil/pixfmt.h"
 | 
			
		||||
 | 
			
		||||
/* define all the GUIDs used directly here,
 | 
			
		||||
   to avoid problems with inconsistent dxva2api.h versions in mingw-w64 and different MSVC version */
 | 
			
		||||
#include <initguid.h>
 | 
			
		||||
DEFINE_GUID(IID_IDirectXVideoDecoderService, 0xfc51a551,0xd5e7,0x11d9,0xaf,0x55,0x00,0x05,0x4e,0x43,0xff,0x02);
 | 
			
		||||
 | 
			
		||||
DEFINE_GUID(DXVA2_ModeMPEG2_VLD,      0xee27417f, 0x5e28,0x4e65,0xbe,0xea,0x1d,0x26,0xb5,0x08,0xad,0xc9);
 | 
			
		||||
DEFINE_GUID(DXVA2_ModeMPEG2and1_VLD,  0x86695f12, 0x340e,0x4f04,0x9f,0xd3,0x92,0x53,0xdd,0x32,0x74,0x60);
 | 
			
		||||
DEFINE_GUID(DXVA2_ModeH264_E,         0x1b81be68, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
 | 
			
		||||
DEFINE_GUID(DXVA2_ModeH264_F,         0x1b81be69, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
 | 
			
		||||
DEFINE_GUID(DXVADDI_Intel_ModeH264_E, 0x604F8E68, 0x4951,0x4C54,0x88,0xFE,0xAB,0xD2,0x5C,0x15,0xB3,0xD6);
 | 
			
		||||
DEFINE_GUID(DXVA2_ModeVC1_D,          0x1b81beA3, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
 | 
			
		||||
DEFINE_GUID(DXVA2_ModeVC1_D2010,      0x1b81beA4, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
 | 
			
		||||
DEFINE_GUID(DXVA2_NoEncrypt,          0x1b81beD0, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
 | 
			
		||||
DEFINE_GUID(GUID_NULL,                0x00000000, 0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
 | 
			
		||||
 | 
			
		||||
typedef IDirect3D9* WINAPI pDirect3DCreate9(UINT);
 | 
			
		||||
typedef HRESULT WINAPI pCreateDeviceManager9(UINT *, IDirect3DDeviceManager9 **);
 | 
			
		||||
 | 
			
		||||
typedef struct dxva2_mode {
 | 
			
		||||
  const GUID     *guid;
 | 
			
		||||
  enum AVCodecID codec;
 | 
			
		||||
} dxva2_mode;
 | 
			
		||||
 | 
			
		||||
static const dxva2_mode dxva2_modes[] = {
 | 
			
		||||
    /* MPEG-2 */
 | 
			
		||||
    { &DXVA2_ModeMPEG2_VLD,      AV_CODEC_ID_MPEG2VIDEO },
 | 
			
		||||
    { &DXVA2_ModeMPEG2and1_VLD,  AV_CODEC_ID_MPEG2VIDEO },
 | 
			
		||||
 | 
			
		||||
    /* H.264 */
 | 
			
		||||
    { &DXVA2_ModeH264_F,         AV_CODEC_ID_H264 },
 | 
			
		||||
    { &DXVA2_ModeH264_E,         AV_CODEC_ID_H264 },
 | 
			
		||||
    /* Intel specific H.264 mode */
 | 
			
		||||
    { &DXVADDI_Intel_ModeH264_E, AV_CODEC_ID_H264 },
 | 
			
		||||
 | 
			
		||||
    /* VC-1 / WMV3 */
 | 
			
		||||
    { &DXVA2_ModeVC1_D2010,      AV_CODEC_ID_VC1  },
 | 
			
		||||
    { &DXVA2_ModeVC1_D2010,      AV_CODEC_ID_WMV3 },
 | 
			
		||||
    { &DXVA2_ModeVC1_D,          AV_CODEC_ID_VC1  },
 | 
			
		||||
    { &DXVA2_ModeVC1_D,          AV_CODEC_ID_WMV3 },
 | 
			
		||||
 | 
			
		||||
    { NULL,                      0 },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct surface_info {
 | 
			
		||||
    int used;
 | 
			
		||||
    uint64_t age;
 | 
			
		||||
} surface_info;
 | 
			
		||||
 | 
			
		||||
typedef struct DXVA2Context {
 | 
			
		||||
    HMODULE d3dlib;
 | 
			
		||||
    HMODULE dxva2lib;
 | 
			
		||||
 | 
			
		||||
    HANDLE  deviceHandle;
 | 
			
		||||
 | 
			
		||||
    IDirect3D9                  *d3d9;
 | 
			
		||||
    IDirect3DDevice9            *d3d9device;
 | 
			
		||||
    IDirect3DDeviceManager9     *d3d9devmgr;
 | 
			
		||||
    IDirectXVideoDecoderService *decoder_service;
 | 
			
		||||
    IDirectXVideoDecoder        *decoder;
 | 
			
		||||
 | 
			
		||||
    GUID                        decoder_guid;
 | 
			
		||||
    DXVA2_ConfigPictureDecode   decoder_config;
 | 
			
		||||
 | 
			
		||||
    LPDIRECT3DSURFACE9          *surfaces;
 | 
			
		||||
    surface_info                *surface_infos;
 | 
			
		||||
    uint32_t                    num_surfaces;
 | 
			
		||||
    uint64_t                    surface_age;
 | 
			
		||||
 | 
			
		||||
    AVFrame                     *tmp_frame;
 | 
			
		||||
} DXVA2Context;
 | 
			
		||||
 | 
			
		||||
typedef struct DXVA2SurfaceWrapper {
 | 
			
		||||
    DXVA2Context         *ctx;
 | 
			
		||||
    LPDIRECT3DSURFACE9   surface;
 | 
			
		||||
    IDirectXVideoDecoder *decoder;
 | 
			
		||||
} DXVA2SurfaceWrapper;
 | 
			
		||||
 | 
			
		||||
static void dxva2_destroy_decoder(AVCodecContext *s)
 | 
			
		||||
{
 | 
			
		||||
    InputStream  *ist = s->opaque;
 | 
			
		||||
    DXVA2Context *ctx = ist->hwaccel_ctx;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    if (ctx->surfaces) {
 | 
			
		||||
        for (i = 0; i < ctx->num_surfaces; i++) {
 | 
			
		||||
            if (ctx->surfaces[i])
 | 
			
		||||
                IDirect3DSurface9_Release(ctx->surfaces[i]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    av_freep(&ctx->surfaces);
 | 
			
		||||
    av_freep(&ctx->surface_infos);
 | 
			
		||||
    ctx->num_surfaces = 0;
 | 
			
		||||
    ctx->surface_age  = 0;
 | 
			
		||||
 | 
			
		||||
    if (ctx->decoder) {
 | 
			
		||||
        IDirectXVideoDecoder_Release(ctx->decoder);
 | 
			
		||||
        ctx->decoder = NULL;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void dxva2_uninit(AVCodecContext *s)
 | 
			
		||||
{
 | 
			
		||||
    InputStream  *ist = s->opaque;
 | 
			
		||||
    DXVA2Context *ctx = ist->hwaccel_ctx;
 | 
			
		||||
 | 
			
		||||
    ist->hwaccel_uninit        = NULL;
 | 
			
		||||
    ist->hwaccel_get_buffer    = NULL;
 | 
			
		||||
    ist->hwaccel_retrieve_data = NULL;
 | 
			
		||||
 | 
			
		||||
    if (ctx->decoder)
 | 
			
		||||
        dxva2_destroy_decoder(s);
 | 
			
		||||
 | 
			
		||||
    if (ctx->decoder_service)
 | 
			
		||||
        IDirectXVideoDecoderService_Release(ctx->decoder_service);
 | 
			
		||||
 | 
			
		||||
    if (ctx->d3d9devmgr && ctx->deviceHandle != INVALID_HANDLE_VALUE)
 | 
			
		||||
        IDirect3DDeviceManager9_CloseDeviceHandle(ctx->d3d9devmgr, ctx->deviceHandle);
 | 
			
		||||
 | 
			
		||||
    if (ctx->d3d9devmgr)
 | 
			
		||||
        IDirect3DDeviceManager9_Release(ctx->d3d9devmgr);
 | 
			
		||||
 | 
			
		||||
    if (ctx->d3d9device)
 | 
			
		||||
        IDirect3DDevice9_Release(ctx->d3d9device);
 | 
			
		||||
 | 
			
		||||
    if (ctx->d3d9)
 | 
			
		||||
        IDirect3D9_Release(ctx->d3d9);
 | 
			
		||||
 | 
			
		||||
    if (ctx->d3dlib)
 | 
			
		||||
        FreeLibrary(ctx->d3dlib);
 | 
			
		||||
 | 
			
		||||
    if (ctx->dxva2lib)
 | 
			
		||||
        FreeLibrary(ctx->dxva2lib);
 | 
			
		||||
 | 
			
		||||
    av_frame_free(&ctx->tmp_frame);
 | 
			
		||||
 | 
			
		||||
    av_freep(&ist->hwaccel_ctx);
 | 
			
		||||
    av_freep(&s->hwaccel_context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void dxva2_release_buffer(void *opaque, uint8_t *data)
 | 
			
		||||
{
 | 
			
		||||
    DXVA2SurfaceWrapper *w   = opaque;
 | 
			
		||||
    DXVA2Context        *ctx = w->ctx;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < ctx->num_surfaces; i++) {
 | 
			
		||||
        if (ctx->surfaces[i] == w->surface) {
 | 
			
		||||
            ctx->surface_infos[i].used = 0;
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    IDirect3DSurface9_Release(w->surface);
 | 
			
		||||
    IDirectXVideoDecoder_Release(w->decoder);
 | 
			
		||||
    av_free(w);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int dxva2_get_buffer(AVCodecContext *s, AVFrame *frame, int flags)
 | 
			
		||||
{
 | 
			
		||||
    InputStream  *ist = s->opaque;
 | 
			
		||||
    DXVA2Context *ctx = ist->hwaccel_ctx;
 | 
			
		||||
    int i, old_unused = -1;
 | 
			
		||||
    LPDIRECT3DSURFACE9 surface;
 | 
			
		||||
    DXVA2SurfaceWrapper *w = NULL;
 | 
			
		||||
 | 
			
		||||
    av_assert0(frame->format == AV_PIX_FMT_DXVA2_VLD);
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < ctx->num_surfaces; i++) {
 | 
			
		||||
        surface_info *info = &ctx->surface_infos[i];
 | 
			
		||||
        if (!info->used && (old_unused == -1 || info->age < ctx->surface_infos[old_unused].age))
 | 
			
		||||
            old_unused = i;
 | 
			
		||||
    }
 | 
			
		||||
    if (old_unused == -1) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "No free DXVA2 surface!\n");
 | 
			
		||||
        return AVERROR(ENOMEM);
 | 
			
		||||
    }
 | 
			
		||||
    i = old_unused;
 | 
			
		||||
 | 
			
		||||
    surface = ctx->surfaces[i];
 | 
			
		||||
 | 
			
		||||
    w = av_mallocz(sizeof(*w));
 | 
			
		||||
    if (!w)
 | 
			
		||||
        return AVERROR(ENOMEM);
 | 
			
		||||
 | 
			
		||||
    frame->buf[0] = av_buffer_create((uint8_t*)surface, 0,
 | 
			
		||||
                                     dxva2_release_buffer, w,
 | 
			
		||||
                                     AV_BUFFER_FLAG_READONLY);
 | 
			
		||||
    if (!frame->buf[0]) {
 | 
			
		||||
        av_free(w);
 | 
			
		||||
        return AVERROR(ENOMEM);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    w->ctx     = ctx;
 | 
			
		||||
    w->surface = surface;
 | 
			
		||||
    IDirect3DSurface9_AddRef(w->surface);
 | 
			
		||||
    w->decoder = ctx->decoder;
 | 
			
		||||
    IDirectXVideoDecoder_AddRef(w->decoder);
 | 
			
		||||
 | 
			
		||||
    ctx->surface_infos[i].used = 1;
 | 
			
		||||
    ctx->surface_infos[i].age  = ctx->surface_age++;
 | 
			
		||||
 | 
			
		||||
    frame->data[3] = (uint8_t *)surface;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int dxva2_retrieve_data(AVCodecContext *s, AVFrame *frame)
 | 
			
		||||
{
 | 
			
		||||
    LPDIRECT3DSURFACE9 surface =  (LPDIRECT3DSURFACE9)frame->data[3];
 | 
			
		||||
    InputStream        *ist = s->opaque;
 | 
			
		||||
    DXVA2Context       *ctx = ist->hwaccel_ctx;
 | 
			
		||||
    D3DSURFACE_DESC    surfaceDesc;
 | 
			
		||||
    D3DLOCKED_RECT     LockedRect;
 | 
			
		||||
    HRESULT            hr;
 | 
			
		||||
    int                ret;
 | 
			
		||||
 | 
			
		||||
    IDirect3DSurface9_GetDesc(surface, &surfaceDesc);
 | 
			
		||||
 | 
			
		||||
    ctx->tmp_frame->width  = frame->width;
 | 
			
		||||
    ctx->tmp_frame->height = frame->height;
 | 
			
		||||
    ctx->tmp_frame->format = AV_PIX_FMT_NV12;
 | 
			
		||||
 | 
			
		||||
    ret = av_frame_get_buffer(ctx->tmp_frame, 32);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
 | 
			
		||||
    hr = IDirect3DSurface9_LockRect(surface, &LockedRect, NULL, D3DLOCK_READONLY);
 | 
			
		||||
    if (FAILED(hr)) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Unable to lock DXVA2 surface\n");
 | 
			
		||||
        return AVERROR_UNKNOWN;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    av_image_copy_plane(ctx->tmp_frame->data[0], ctx->tmp_frame->linesize[0],
 | 
			
		||||
                        (uint8_t*)LockedRect.pBits,
 | 
			
		||||
                        LockedRect.Pitch, frame->width, frame->height);
 | 
			
		||||
 | 
			
		||||
    av_image_copy_plane(ctx->tmp_frame->data[1], ctx->tmp_frame->linesize[1],
 | 
			
		||||
                        (uint8_t*)LockedRect.pBits + LockedRect.Pitch * surfaceDesc.Height,
 | 
			
		||||
                        LockedRect.Pitch, frame->width, frame->height / 2);
 | 
			
		||||
 | 
			
		||||
    IDirect3DSurface9_UnlockRect(surface);
 | 
			
		||||
 | 
			
		||||
    ret = av_frame_copy_props(ctx->tmp_frame, frame);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        goto fail;
 | 
			
		||||
 | 
			
		||||
    av_frame_unref(frame);
 | 
			
		||||
    av_frame_move_ref(frame, ctx->tmp_frame);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
fail:
 | 
			
		||||
    av_frame_unref(ctx->tmp_frame);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int dxva2_alloc(AVCodecContext *s)
 | 
			
		||||
{
 | 
			
		||||
    InputStream  *ist = s->opaque;
 | 
			
		||||
    int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
 | 
			
		||||
    DXVA2Context *ctx;
 | 
			
		||||
    pDirect3DCreate9      *createD3D = NULL;
 | 
			
		||||
    pCreateDeviceManager9 *createDeviceManager = NULL;
 | 
			
		||||
    HRESULT hr;
 | 
			
		||||
    D3DPRESENT_PARAMETERS d3dpp = {0};
 | 
			
		||||
    D3DDISPLAYMODE        d3ddm;
 | 
			
		||||
    unsigned resetToken = 0;
 | 
			
		||||
    UINT adapter = D3DADAPTER_DEFAULT;
 | 
			
		||||
 | 
			
		||||
    ctx = av_mallocz(sizeof(*ctx));
 | 
			
		||||
    if (!ctx)
 | 
			
		||||
        return AVERROR(ENOMEM);
 | 
			
		||||
 | 
			
		||||
    ctx->deviceHandle = INVALID_HANDLE_VALUE;
 | 
			
		||||
 | 
			
		||||
    ist->hwaccel_ctx           = ctx;
 | 
			
		||||
    ist->hwaccel_uninit        = dxva2_uninit;
 | 
			
		||||
    ist->hwaccel_get_buffer    = dxva2_get_buffer;
 | 
			
		||||
    ist->hwaccel_retrieve_data = dxva2_retrieve_data;
 | 
			
		||||
 | 
			
		||||
    ctx->d3dlib = LoadLibrary("d3d9.dll");
 | 
			
		||||
    if (!ctx->d3dlib) {
 | 
			
		||||
        av_log(NULL, loglevel, "Failed to load D3D9 library\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
    ctx->dxva2lib = LoadLibrary("dxva2.dll");
 | 
			
		||||
    if (!ctx->dxva2lib) {
 | 
			
		||||
        av_log(NULL, loglevel, "Failed to load DXVA2 library\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    createD3D = (pDirect3DCreate9 *)GetProcAddress(ctx->d3dlib, "Direct3DCreate9");
 | 
			
		||||
    if (!createD3D) {
 | 
			
		||||
        av_log(NULL, loglevel, "Failed to locate Direct3DCreate9\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
    createDeviceManager = (pCreateDeviceManager9 *)GetProcAddress(ctx->dxva2lib, "DXVA2CreateDirect3DDeviceManager9");
 | 
			
		||||
    if (!createDeviceManager) {
 | 
			
		||||
        av_log(NULL, loglevel, "Failed to locate DXVA2CreateDirect3DDeviceManager9\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ctx->d3d9 = createD3D(D3D_SDK_VERSION);
 | 
			
		||||
    if (!ctx->d3d9) {
 | 
			
		||||
        av_log(NULL, loglevel, "Failed to create IDirect3D object\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (ist->hwaccel_device) {
 | 
			
		||||
        adapter = atoi(ist->hwaccel_device);
 | 
			
		||||
        av_log(NULL, AV_LOG_INFO, "Using HWAccel device %d\n", adapter);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    IDirect3D9_GetAdapterDisplayMode(ctx->d3d9, adapter, &d3ddm);
 | 
			
		||||
    d3dpp.Windowed         = TRUE;
 | 
			
		||||
    d3dpp.BackBufferWidth  = 640;
 | 
			
		||||
    d3dpp.BackBufferHeight = 480;
 | 
			
		||||
    d3dpp.BackBufferCount  = 0;
 | 
			
		||||
    d3dpp.BackBufferFormat = d3ddm.Format;
 | 
			
		||||
    d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
 | 
			
		||||
    d3dpp.Flags            = D3DPRESENTFLAG_VIDEO;
 | 
			
		||||
 | 
			
		||||
    hr = IDirect3D9_CreateDevice(ctx->d3d9, adapter, D3DDEVTYPE_HAL, GetShellWindow(),
 | 
			
		||||
                                 D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED | D3DCREATE_FPU_PRESERVE,
 | 
			
		||||
                                 &d3dpp, &ctx->d3d9device);
 | 
			
		||||
    if (FAILED(hr)) {
 | 
			
		||||
        av_log(NULL, loglevel, "Failed to create Direct3D device\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    hr = createDeviceManager(&resetToken, &ctx->d3d9devmgr);
 | 
			
		||||
    if (FAILED(hr)) {
 | 
			
		||||
        av_log(NULL, loglevel, "Failed to create Direct3D device manager\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    hr = IDirect3DDeviceManager9_ResetDevice(ctx->d3d9devmgr, ctx->d3d9device, resetToken);
 | 
			
		||||
    if (FAILED(hr)) {
 | 
			
		||||
        av_log(NULL, loglevel, "Failed to bind Direct3D device to device manager\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    hr = IDirect3DDeviceManager9_OpenDeviceHandle(ctx->d3d9devmgr, &ctx->deviceHandle);
 | 
			
		||||
    if (FAILED(hr)) {
 | 
			
		||||
        av_log(NULL, loglevel, "Failed to open device handle\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    hr = IDirect3DDeviceManager9_GetVideoService(ctx->d3d9devmgr, ctx->deviceHandle, &IID_IDirectXVideoDecoderService, (void **)&ctx->decoder_service);
 | 
			
		||||
    if (FAILED(hr)) {
 | 
			
		||||
        av_log(NULL, loglevel, "Failed to create IDirectXVideoDecoderService\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ctx->tmp_frame = av_frame_alloc();
 | 
			
		||||
    if (!ctx->tmp_frame)
 | 
			
		||||
        goto fail;
 | 
			
		||||
 | 
			
		||||
    s->hwaccel_context = av_mallocz(sizeof(struct dxva_context));
 | 
			
		||||
    if (!s->hwaccel_context)
 | 
			
		||||
        goto fail;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
fail:
 | 
			
		||||
    dxva2_uninit(s);
 | 
			
		||||
    return AVERROR(EINVAL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int dxva2_get_decoder_configuration(AVCodecContext *s, const GUID *device_guid,
 | 
			
		||||
                                           const DXVA2_VideoDesc *desc,
 | 
			
		||||
                                           DXVA2_ConfigPictureDecode *config)
 | 
			
		||||
{
 | 
			
		||||
    InputStream  *ist = s->opaque;
 | 
			
		||||
    int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
 | 
			
		||||
    DXVA2Context *ctx = ist->hwaccel_ctx;
 | 
			
		||||
    unsigned cfg_count = 0, best_score = 0;
 | 
			
		||||
    DXVA2_ConfigPictureDecode *cfg_list = NULL;
 | 
			
		||||
    DXVA2_ConfigPictureDecode best_cfg = {{0}};
 | 
			
		||||
    HRESULT hr;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    hr = IDirectXVideoDecoderService_GetDecoderConfigurations(ctx->decoder_service, device_guid, desc, NULL, &cfg_count, &cfg_list);
 | 
			
		||||
    if (FAILED(hr)) {
 | 
			
		||||
        av_log(NULL, loglevel, "Unable to retrieve decoder configurations\n");
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < cfg_count; i++) {
 | 
			
		||||
        DXVA2_ConfigPictureDecode *cfg = &cfg_list[i];
 | 
			
		||||
 | 
			
		||||
        unsigned score;
 | 
			
		||||
        if (cfg->ConfigBitstreamRaw == 1)
 | 
			
		||||
            score = 1;
 | 
			
		||||
        else if (s->codec_id == AV_CODEC_ID_H264 && cfg->ConfigBitstreamRaw == 2)
 | 
			
		||||
            score = 2;
 | 
			
		||||
        else
 | 
			
		||||
            continue;
 | 
			
		||||
        if (IsEqualGUID(&cfg->guidConfigBitstreamEncryption, &DXVA2_NoEncrypt))
 | 
			
		||||
            score += 16;
 | 
			
		||||
        if (score > best_score) {
 | 
			
		||||
            best_score = score;
 | 
			
		||||
            best_cfg   = *cfg;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    CoTaskMemFree(cfg_list);
 | 
			
		||||
 | 
			
		||||
    if (!best_score) {
 | 
			
		||||
        av_log(NULL, loglevel, "No valid decoder configuration available\n");
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    *config = best_cfg;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int dxva2_create_decoder(AVCodecContext *s)
 | 
			
		||||
{
 | 
			
		||||
    InputStream  *ist = s->opaque;
 | 
			
		||||
    int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
 | 
			
		||||
    DXVA2Context *ctx = ist->hwaccel_ctx;
 | 
			
		||||
    struct dxva_context *dxva_ctx = s->hwaccel_context;
 | 
			
		||||
    GUID *guid_list = NULL;
 | 
			
		||||
    unsigned guid_count = 0, i, j;
 | 
			
		||||
    GUID device_guid = GUID_NULL;
 | 
			
		||||
    D3DFORMAT target_format = 0;
 | 
			
		||||
    DXVA2_VideoDesc desc = { 0 };
 | 
			
		||||
    DXVA2_ConfigPictureDecode config;
 | 
			
		||||
    HRESULT hr;
 | 
			
		||||
    int surface_alignment;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    hr = IDirectXVideoDecoderService_GetDecoderDeviceGuids(ctx->decoder_service, &guid_count, &guid_list);
 | 
			
		||||
    if (FAILED(hr)) {
 | 
			
		||||
        av_log(NULL, loglevel, "Failed to retrieve decoder device GUIDs\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (i = 0; dxva2_modes[i].guid; i++) {
 | 
			
		||||
        D3DFORMAT *target_list = NULL;
 | 
			
		||||
        unsigned target_count = 0;
 | 
			
		||||
        const dxva2_mode *mode = &dxva2_modes[i];
 | 
			
		||||
        if (mode->codec != s->codec_id)
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
        for (j = 0; j < guid_count; j++) {
 | 
			
		||||
            if (IsEqualGUID(mode->guid, &guid_list[j]))
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
        if (j == guid_count)
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
        hr = IDirectXVideoDecoderService_GetDecoderRenderTargets(ctx->decoder_service, mode->guid, &target_count, &target_list);
 | 
			
		||||
        if (FAILED(hr)) {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        for (j = 0; j < target_count; j++) {
 | 
			
		||||
            const D3DFORMAT format = target_list[j];
 | 
			
		||||
            if (format == MKTAG('N','V','1','2')) {
 | 
			
		||||
                target_format = format;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        CoTaskMemFree(target_list);
 | 
			
		||||
        if (target_format) {
 | 
			
		||||
            device_guid = *mode->guid;
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    CoTaskMemFree(guid_list);
 | 
			
		||||
 | 
			
		||||
    if (IsEqualGUID(&device_guid, &GUID_NULL)) {
 | 
			
		||||
        av_log(NULL, loglevel, "No decoder device for codec found\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    desc.SampleWidth  = s->coded_width;
 | 
			
		||||
    desc.SampleHeight = s->coded_height;
 | 
			
		||||
    desc.Format       = target_format;
 | 
			
		||||
 | 
			
		||||
    ret = dxva2_get_decoder_configuration(s, &device_guid, &desc, &config);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* decoding MPEG-2 requires additional alignment on some Intel GPUs,
 | 
			
		||||
       but it causes issues for H.264 on certain AMD GPUs..... */
 | 
			
		||||
    if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO)
 | 
			
		||||
        surface_alignment = 32;
 | 
			
		||||
    else
 | 
			
		||||
        surface_alignment = 16;
 | 
			
		||||
 | 
			
		||||
    /* 4 base work surfaces */
 | 
			
		||||
    ctx->num_surfaces = 4;
 | 
			
		||||
 | 
			
		||||
    /* add surfaces based on number of possible refs */
 | 
			
		||||
    if (s->codec_id == AV_CODEC_ID_H264)
 | 
			
		||||
        ctx->num_surfaces += 16;
 | 
			
		||||
    else
 | 
			
		||||
        ctx->num_surfaces += 2;
 | 
			
		||||
 | 
			
		||||
    /* add extra surfaces for frame threading */
 | 
			
		||||
    if (s->active_thread_type & FF_THREAD_FRAME)
 | 
			
		||||
        ctx->num_surfaces += s->thread_count;
 | 
			
		||||
 | 
			
		||||
    ctx->surfaces      = av_mallocz(ctx->num_surfaces * sizeof(*ctx->surfaces));
 | 
			
		||||
    ctx->surface_infos = av_mallocz(ctx->num_surfaces * sizeof(*ctx->surface_infos));
 | 
			
		||||
 | 
			
		||||
    if (!ctx->surfaces || !ctx->surface_infos) {
 | 
			
		||||
        av_log(NULL, loglevel, "Unable to allocate surface arrays\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    hr = IDirectXVideoDecoderService_CreateSurface(ctx->decoder_service,
 | 
			
		||||
                                                   FFALIGN(s->coded_width, surface_alignment),
 | 
			
		||||
                                                   FFALIGN(s->coded_height, surface_alignment),
 | 
			
		||||
                                                   ctx->num_surfaces - 1,
 | 
			
		||||
                                                   target_format, D3DPOOL_DEFAULT, 0,
 | 
			
		||||
                                                   DXVA2_VideoDecoderRenderTarget,
 | 
			
		||||
                                                   ctx->surfaces, NULL);
 | 
			
		||||
    if (FAILED(hr)) {
 | 
			
		||||
        av_log(NULL, loglevel, "Failed to create %d video surfaces\n", ctx->num_surfaces);
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    hr = IDirectXVideoDecoderService_CreateVideoDecoder(ctx->decoder_service, &device_guid,
 | 
			
		||||
                                                        &desc, &config, ctx->surfaces,
 | 
			
		||||
                                                        ctx->num_surfaces, &ctx->decoder);
 | 
			
		||||
    if (FAILED(hr)) {
 | 
			
		||||
        av_log(NULL, loglevel, "Failed to create DXVA2 video decoder\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ctx->decoder_guid   = device_guid;
 | 
			
		||||
    ctx->decoder_config = config;
 | 
			
		||||
 | 
			
		||||
    dxva_ctx->cfg           = &ctx->decoder_config;
 | 
			
		||||
    dxva_ctx->decoder       = ctx->decoder;
 | 
			
		||||
    dxva_ctx->surface       = ctx->surfaces;
 | 
			
		||||
    dxva_ctx->surface_count = ctx->num_surfaces;
 | 
			
		||||
 | 
			
		||||
    if (IsEqualGUID(&ctx->decoder_guid, &DXVADDI_Intel_ModeH264_E))
 | 
			
		||||
        dxva_ctx->workaround |= FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
fail:
 | 
			
		||||
    dxva2_destroy_decoder(s);
 | 
			
		||||
    return AVERROR(EINVAL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int dxva2_init(AVCodecContext *s)
 | 
			
		||||
{
 | 
			
		||||
    InputStream *ist = s->opaque;
 | 
			
		||||
    int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
 | 
			
		||||
    DXVA2Context *ctx;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    if (!ist->hwaccel_ctx) {
 | 
			
		||||
        ret = dxva2_alloc(s);
 | 
			
		||||
        if (ret < 0)
 | 
			
		||||
            return ret;
 | 
			
		||||
    }
 | 
			
		||||
    ctx = ist->hwaccel_ctx;
 | 
			
		||||
 | 
			
		||||
    if (s->codec_id == AV_CODEC_ID_H264 &&
 | 
			
		||||
        (s->profile & ~FF_PROFILE_H264_CONSTRAINED) > FF_PROFILE_H264_HIGH) {
 | 
			
		||||
        av_log(NULL, loglevel, "Unsupported H.264 profile for DXVA2 HWAccel: %d\n", s->profile);
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (ctx->decoder)
 | 
			
		||||
        dxva2_destroy_decoder(s);
 | 
			
		||||
 | 
			
		||||
    ret = dxva2_create_decoder(s);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        av_log(NULL, loglevel, "Error creating the DXVA2 decoder\n");
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										121
									
								
								ffmpeg_filter.c
									
									
									
									
									
								
							
							
						
						
									
										121
									
								
								ffmpeg_filter.c
									
									
									
									
									
								
							@@ -37,23 +37,21 @@
 | 
			
		||||
#include "libavutil/imgutils.h"
 | 
			
		||||
#include "libavutil/samplefmt.h"
 | 
			
		||||
 | 
			
		||||
enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *enc_ctx, AVCodec *codec, enum AVPixelFormat target)
 | 
			
		||||
enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodec *codec, enum AVPixelFormat target)
 | 
			
		||||
{
 | 
			
		||||
    if (codec && codec->pix_fmts) {
 | 
			
		||||
        const enum AVPixelFormat *p = codec->pix_fmts;
 | 
			
		||||
        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(target);
 | 
			
		||||
        int has_alpha = desc ? desc->nb_components % 2 == 0 : 0;
 | 
			
		||||
        enum AVPixelFormat best= AV_PIX_FMT_NONE;
 | 
			
		||||
        static const enum AVPixelFormat mjpeg_formats[] =
 | 
			
		||||
            { AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_NONE };
 | 
			
		||||
        static const enum AVPixelFormat ljpeg_formats[] =
 | 
			
		||||
            { AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUV420P,
 | 
			
		||||
        const enum AVPixelFormat mjpeg_formats[] = { AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_NONE };
 | 
			
		||||
        const enum AVPixelFormat ljpeg_formats[] = { AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUV420P,
 | 
			
		||||
                                                     AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_BGRA, AV_PIX_FMT_NONE };
 | 
			
		||||
 | 
			
		||||
        if (enc_ctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
 | 
			
		||||
            if (enc_ctx->codec_id == AV_CODEC_ID_MJPEG) {
 | 
			
		||||
        if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
 | 
			
		||||
            if (st->codec->codec_id == AV_CODEC_ID_MJPEG) {
 | 
			
		||||
                p = mjpeg_formats;
 | 
			
		||||
            } else if (enc_ctx->codec_id == AV_CODEC_ID_LJPEG) {
 | 
			
		||||
            } else if (st->codec->codec_id == AV_CODEC_ID_LJPEG) {
 | 
			
		||||
                p =ljpeg_formats;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -99,21 +97,21 @@ void choose_sample_fmt(AVStream *st, AVCodec *codec)
 | 
			
		||||
 | 
			
		||||
static char *choose_pix_fmts(OutputStream *ost)
 | 
			
		||||
{
 | 
			
		||||
    AVDictionaryEntry *strict_dict = av_dict_get(ost->encoder_opts, "strict", NULL, 0);
 | 
			
		||||
    AVDictionaryEntry *strict_dict = av_dict_get(ost->opts, "strict", NULL, 0);
 | 
			
		||||
    if (strict_dict)
 | 
			
		||||
        // used by choose_pixel_fmt() and below
 | 
			
		||||
        av_opt_set(ost->enc_ctx, "strict", strict_dict->value, 0);
 | 
			
		||||
        av_opt_set(ost->st->codec, "strict", strict_dict->value, 0);
 | 
			
		||||
 | 
			
		||||
     if (ost->keep_pix_fmt) {
 | 
			
		||||
        if (ost->filter)
 | 
			
		||||
            avfilter_graph_set_auto_convert(ost->filter->graph->graph,
 | 
			
		||||
                                            AVFILTER_AUTO_CONVERT_NONE);
 | 
			
		||||
        if (ost->enc_ctx->pix_fmt == AV_PIX_FMT_NONE)
 | 
			
		||||
        if (ost->st->codec->pix_fmt == AV_PIX_FMT_NONE)
 | 
			
		||||
            return NULL;
 | 
			
		||||
        return av_strdup(av_get_pix_fmt_name(ost->enc_ctx->pix_fmt));
 | 
			
		||||
        return av_strdup(av_get_pix_fmt_name(ost->st->codec->pix_fmt));
 | 
			
		||||
    }
 | 
			
		||||
    if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
 | 
			
		||||
        return av_strdup(av_get_pix_fmt_name(choose_pixel_fmt(ost->st, ost->enc_ctx, ost->enc, ost->enc_ctx->pix_fmt)));
 | 
			
		||||
    if (ost->st->codec->pix_fmt != AV_PIX_FMT_NONE) {
 | 
			
		||||
        return av_strdup(av_get_pix_fmt_name(choose_pixel_fmt(ost->st, ost->enc, ost->st->codec->pix_fmt)));
 | 
			
		||||
    } else if (ost->enc && ost->enc->pix_fmts) {
 | 
			
		||||
        const enum AVPixelFormat *p;
 | 
			
		||||
        AVIOContext *s = NULL;
 | 
			
		||||
@@ -124,10 +122,10 @@ static char *choose_pix_fmts(OutputStream *ost)
 | 
			
		||||
            exit_program(1);
 | 
			
		||||
 | 
			
		||||
        p = ost->enc->pix_fmts;
 | 
			
		||||
        if (ost->enc_ctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
 | 
			
		||||
            if (ost->enc_ctx->codec_id == AV_CODEC_ID_MJPEG) {
 | 
			
		||||
        if (ost->st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
 | 
			
		||||
            if (ost->st->codec->codec_id == AV_CODEC_ID_MJPEG) {
 | 
			
		||||
                p = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_NONE };
 | 
			
		||||
            } else if (ost->enc_ctx->codec_id == AV_CODEC_ID_LJPEG) {
 | 
			
		||||
            } else if (ost->st->codec->codec_id == AV_CODEC_ID_LJPEG) {
 | 
			
		||||
                p = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUV420P,
 | 
			
		||||
                                                    AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_BGRA, AV_PIX_FMT_NONE };
 | 
			
		||||
            }
 | 
			
		||||
@@ -149,8 +147,8 @@ static char *choose_pix_fmts(OutputStream *ost)
 | 
			
		||||
#define DEF_CHOOSE_FORMAT(type, var, supported_list, none, get_name)           \
 | 
			
		||||
static char *choose_ ## var ## s(OutputStream *ost)                            \
 | 
			
		||||
{                                                                              \
 | 
			
		||||
    if (ost->enc_ctx->var != none) {                                           \
 | 
			
		||||
        get_name(ost->enc_ctx->var);                                           \
 | 
			
		||||
    if (ost->st->codec->var != none) {                                         \
 | 
			
		||||
        get_name(ost->st->codec->var);                                         \
 | 
			
		||||
        return av_strdup(name);                                                \
 | 
			
		||||
    } else if (ost->enc && ost->enc->supported_list) {                         \
 | 
			
		||||
        const type *p;                                                         \
 | 
			
		||||
@@ -262,7 +260,7 @@ static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
 | 
			
		||||
        /* find the first unused stream of corresponding type */
 | 
			
		||||
        for (i = 0; i < nb_input_streams; i++) {
 | 
			
		||||
            ist = input_streams[i];
 | 
			
		||||
            if (ist->dec_ctx->codec_type == type && ist->discard)
 | 
			
		||||
            if (ist->st->codec->codec_type == type && ist->discard)
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
        if (i == nb_input_streams) {
 | 
			
		||||
@@ -275,7 +273,7 @@ static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
 | 
			
		||||
    av_assert0(ist);
 | 
			
		||||
 | 
			
		||||
    ist->discard         = 0;
 | 
			
		||||
    ist->decoding_needed |= DECODING_FOR_FILTER;
 | 
			
		||||
    ist->decoding_needed++;
 | 
			
		||||
    ist->st->discard = AVDISCARD_NONE;
 | 
			
		||||
 | 
			
		||||
    GROW_ARRAY(fg->inputs, fg->nb_inputs);
 | 
			
		||||
@@ -344,7 +342,7 @@ static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter,
 | 
			
		||||
    char *pix_fmts;
 | 
			
		||||
    OutputStream *ost = ofilter->ost;
 | 
			
		||||
    OutputFile    *of = output_files[ost->file_index];
 | 
			
		||||
    AVCodecContext *codec = ost->enc_ctx;
 | 
			
		||||
    AVCodecContext *codec = ost->st->codec;
 | 
			
		||||
    AVFilterContext *last_filter = out->filter_ctx;
 | 
			
		||||
    int pad_idx = out->pad_idx;
 | 
			
		||||
    int ret;
 | 
			
		||||
@@ -384,7 +382,8 @@ static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter,
 | 
			
		||||
                 ost->file_index, ost->index);
 | 
			
		||||
        ret = avfilter_graph_create_filter(&filter,
 | 
			
		||||
                                                avfilter_get_by_name("format"),
 | 
			
		||||
                                           "format", pix_fmts, NULL, fg->graph);
 | 
			
		||||
                                                "format", pix_fmts, NULL,
 | 
			
		||||
                                                fg->graph);
 | 
			
		||||
        av_freep(&pix_fmts);
 | 
			
		||||
        if (ret < 0)
 | 
			
		||||
            return ret;
 | 
			
		||||
@@ -433,7 +432,7 @@ static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter,
 | 
			
		||||
{
 | 
			
		||||
    OutputStream *ost = ofilter->ost;
 | 
			
		||||
    OutputFile    *of = output_files[ost->file_index];
 | 
			
		||||
    AVCodecContext *codec  = ost->enc_ctx;
 | 
			
		||||
    AVCodecContext *codec  = ost->st->codec;
 | 
			
		||||
    AVFilterContext *last_filter = out->filter_ctx;
 | 
			
		||||
    int pad_idx = out->pad_idx;
 | 
			
		||||
    char *sample_fmts, *sample_rates, *channel_layouts;
 | 
			
		||||
@@ -594,8 +593,8 @@ static int sub2video_prepare(InputStream *ist)
 | 
			
		||||
    /* Compute the size of the canvas for the subtitles stream.
 | 
			
		||||
       If the subtitles codec has set a size, use it. Otherwise use the
 | 
			
		||||
       maximum dimensions of the video streams in the same file. */
 | 
			
		||||
    w = ist->dec_ctx->width;
 | 
			
		||||
    h = ist->dec_ctx->height;
 | 
			
		||||
    w = ist->st->codec->width;
 | 
			
		||||
    h = ist->st->codec->height;
 | 
			
		||||
    if (!(w && h)) {
 | 
			
		||||
        for (i = 0; i < avf->nb_streams; i++) {
 | 
			
		||||
            if (avf->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
 | 
			
		||||
@@ -609,17 +608,16 @@ static int sub2video_prepare(InputStream *ist)
 | 
			
		||||
        }
 | 
			
		||||
        av_log(avf, AV_LOG_INFO, "sub2video: using %dx%d canvas\n", w, h);
 | 
			
		||||
    }
 | 
			
		||||
    ist->sub2video.w = ist->dec_ctx->width  = ist->resample_width  = w;
 | 
			
		||||
    ist->sub2video.h = ist->dec_ctx->height = ist->resample_height = h;
 | 
			
		||||
    ist->sub2video.w = ist->st->codec->width  = ist->resample_width  = w;
 | 
			
		||||
    ist->sub2video.h = ist->st->codec->height = ist->resample_height = h;
 | 
			
		||||
 | 
			
		||||
    /* rectangles are AV_PIX_FMT_PAL8, but we have no guarantee that the
 | 
			
		||||
       palettes for all rectangles are identical or compatible */
 | 
			
		||||
    ist->resample_pix_fmt = ist->dec_ctx->pix_fmt = AV_PIX_FMT_RGB32;
 | 
			
		||||
    ist->resample_pix_fmt = ist->st->codec->pix_fmt = AV_PIX_FMT_RGB32;
 | 
			
		||||
 | 
			
		||||
    ist->sub2video.frame = av_frame_alloc();
 | 
			
		||||
    if (!ist->sub2video.frame)
 | 
			
		||||
        return AVERROR(ENOMEM);
 | 
			
		||||
    ist->sub2video.last_pts = INT64_MIN;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -637,9 +635,8 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
 | 
			
		||||
    AVBPrint args;
 | 
			
		||||
    char name[255];
 | 
			
		||||
    int ret, pad_idx = 0;
 | 
			
		||||
    int64_t tsoffset = 0;
 | 
			
		||||
 | 
			
		||||
    if (ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
 | 
			
		||||
    if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Cannot connect video filter to audio input\n");
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
    }
 | 
			
		||||
@@ -647,7 +644,7 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
 | 
			
		||||
    if (!fr.num)
 | 
			
		||||
        fr = av_guess_frame_rate(input_files[ist->file_index]->ctx, ist->st, NULL);
 | 
			
		||||
 | 
			
		||||
    if (ist->dec_ctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
 | 
			
		||||
    if (ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
 | 
			
		||||
        ret = sub2video_prepare(ist);
 | 
			
		||||
        if (ret < 0)
 | 
			
		||||
            return ret;
 | 
			
		||||
@@ -655,7 +652,7 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
 | 
			
		||||
 | 
			
		||||
    sar = ist->st->sample_aspect_ratio.num ?
 | 
			
		||||
          ist->st->sample_aspect_ratio :
 | 
			
		||||
          ist->dec_ctx->sample_aspect_ratio;
 | 
			
		||||
          ist->st->codec->sample_aspect_ratio;
 | 
			
		||||
    if(!sar.den)
 | 
			
		||||
        sar = (AVRational){0,1};
 | 
			
		||||
    av_bprint_init(&args, 0, 1);
 | 
			
		||||
@@ -665,7 +662,7 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
 | 
			
		||||
             ist->resample_height,
 | 
			
		||||
             ist->hwaccel_retrieve_data ? ist->hwaccel_retrieved_pix_fmt : ist->resample_pix_fmt,
 | 
			
		||||
             tb.num, tb.den, sar.num, sar.den,
 | 
			
		||||
             SWS_BILINEAR + ((ist->dec_ctx->flags&CODEC_FLAG_BITEXACT) ? SWS_BITEXACT:0));
 | 
			
		||||
             SWS_BILINEAR + ((ist->st->codec->flags&CODEC_FLAG_BITEXACT) ? SWS_BITEXACT:0));
 | 
			
		||||
    if (fr.num && fr.den)
 | 
			
		||||
        av_bprintf(&args, ":frame_rate=%d/%d", fr.num, fr.den);
 | 
			
		||||
    snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
 | 
			
		||||
@@ -712,14 +709,8 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
 | 
			
		||||
 | 
			
		||||
    snprintf(name, sizeof(name), "trim for input stream %d:%d",
 | 
			
		||||
             ist->file_index, ist->st->index);
 | 
			
		||||
    if (copy_ts) {
 | 
			
		||||
        tsoffset = f->start_time == AV_NOPTS_VALUE ? 0 : f->start_time;
 | 
			
		||||
        if (!start_at_zero && f->ctx->start_time != AV_NOPTS_VALUE)
 | 
			
		||||
            tsoffset += f->ctx->start_time;
 | 
			
		||||
    }
 | 
			
		||||
    ret = insert_trim(((f->start_time == AV_NOPTS_VALUE) || !f->accurate_seek) ?
 | 
			
		||||
                      AV_NOPTS_VALUE : tsoffset, f->recording_time,
 | 
			
		||||
                      &last_filter, &pad_idx, name);
 | 
			
		||||
                      AV_NOPTS_VALUE : 0, f->recording_time, &last_filter, &pad_idx, name);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
 | 
			
		||||
@@ -738,23 +729,22 @@ static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
 | 
			
		||||
    AVBPrint args;
 | 
			
		||||
    char name[255];
 | 
			
		||||
    int ret, pad_idx = 0;
 | 
			
		||||
    int64_t tsoffset = 0;
 | 
			
		||||
 | 
			
		||||
    if (ist->dec_ctx->codec_type != AVMEDIA_TYPE_AUDIO) {
 | 
			
		||||
    if (ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Cannot connect audio filter to non audio input\n");
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    av_bprint_init(&args, 0, AV_BPRINT_SIZE_AUTOMATIC);
 | 
			
		||||
    av_bprintf(&args, "time_base=%d/%d:sample_rate=%d:sample_fmt=%s",
 | 
			
		||||
             1, ist->dec_ctx->sample_rate,
 | 
			
		||||
             ist->dec_ctx->sample_rate,
 | 
			
		||||
             av_get_sample_fmt_name(ist->dec_ctx->sample_fmt));
 | 
			
		||||
    if (ist->dec_ctx->channel_layout)
 | 
			
		||||
             1, ist->st->codec->sample_rate,
 | 
			
		||||
             ist->st->codec->sample_rate,
 | 
			
		||||
             av_get_sample_fmt_name(ist->st->codec->sample_fmt));
 | 
			
		||||
    if (ist->st->codec->channel_layout)
 | 
			
		||||
        av_bprintf(&args, ":channel_layout=0x%"PRIx64,
 | 
			
		||||
                   ist->dec_ctx->channel_layout);
 | 
			
		||||
                   ist->st->codec->channel_layout);
 | 
			
		||||
    else
 | 
			
		||||
        av_bprintf(&args, ":channels=%d", ist->dec_ctx->channels);
 | 
			
		||||
        av_bprintf(&args, ":channels=%d", ist->st->codec->channels);
 | 
			
		||||
    snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
 | 
			
		||||
             ist->file_index, ist->st->index);
 | 
			
		||||
 | 
			
		||||
@@ -821,14 +811,8 @@ static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
 | 
			
		||||
 | 
			
		||||
    snprintf(name, sizeof(name), "trim for input stream %d:%d",
 | 
			
		||||
             ist->file_index, ist->st->index);
 | 
			
		||||
    if (copy_ts) {
 | 
			
		||||
        tsoffset = f->start_time == AV_NOPTS_VALUE ? 0 : f->start_time;
 | 
			
		||||
        if (!start_at_zero && f->ctx->start_time != AV_NOPTS_VALUE)
 | 
			
		||||
            tsoffset += f->ctx->start_time;
 | 
			
		||||
    }
 | 
			
		||||
    ret = insert_trim(((f->start_time == AV_NOPTS_VALUE) || !f->accurate_seek) ?
 | 
			
		||||
                      AV_NOPTS_VALUE : tsoffset, f->recording_time,
 | 
			
		||||
                      &last_filter, &pad_idx, name);
 | 
			
		||||
                      AV_NOPTS_VALUE : 0, f->recording_time, &last_filter, &pad_idx, name);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
 | 
			
		||||
@@ -844,12 +828,6 @@ static int configure_input_filter(FilterGraph *fg, InputFilter *ifilter,
 | 
			
		||||
    av_freep(&ifilter->name);
 | 
			
		||||
    DESCRIBE_FILTER_LINK(ifilter, in, 1);
 | 
			
		||||
 | 
			
		||||
    if (!ifilter->ist->dec) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR,
 | 
			
		||||
               "No decoder for stream #%d:%d, filtering impossible\n",
 | 
			
		||||
               ifilter->ist->file_index, ifilter->ist->st->index);
 | 
			
		||||
        return AVERROR_DECODER_NOT_FOUND;
 | 
			
		||||
    }
 | 
			
		||||
    switch (avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx)) {
 | 
			
		||||
    case AVMEDIA_TYPE_VIDEO: return configure_input_video_filter(fg, ifilter, in);
 | 
			
		||||
    case AVMEDIA_TYPE_AUDIO: return configure_input_audio_filter(fg, ifilter, in);
 | 
			
		||||
@@ -894,7 +872,7 @@ int configure_filtergraph(FilterGraph *fg)
 | 
			
		||||
            args[strlen(args) - 1] = '\0';
 | 
			
		||||
        fg->graph->resample_lavr_opts = av_strdup(args);
 | 
			
		||||
 | 
			
		||||
        e = av_dict_get(ost->encoder_opts, "threads", NULL, 0);
 | 
			
		||||
        e = av_dict_get(ost->opts, "threads", NULL, 0);
 | 
			
		||||
        if (e)
 | 
			
		||||
            av_opt_set(fg->graph, "threads", e->value, 0);
 | 
			
		||||
    }
 | 
			
		||||
@@ -912,11 +890,8 @@ int configure_filtergraph(FilterGraph *fg)
 | 
			
		||||
        init_input_filter(fg, cur);
 | 
			
		||||
 | 
			
		||||
    for (cur = inputs, i = 0; cur; cur = cur->next, i++)
 | 
			
		||||
        if ((ret = configure_input_filter(fg, fg->inputs[i], cur)) < 0) {
 | 
			
		||||
            avfilter_inout_free(&inputs);
 | 
			
		||||
            avfilter_inout_free(&outputs);
 | 
			
		||||
        if ((ret = configure_input_filter(fg, fg->inputs[i], cur)) < 0)
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
    avfilter_inout_free(&inputs);
 | 
			
		||||
 | 
			
		||||
    if (!init || simple) {
 | 
			
		||||
@@ -942,16 +917,6 @@ int configure_filtergraph(FilterGraph *fg)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fg->reconfiguration = 1;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < fg->nb_outputs; i++) {
 | 
			
		||||
        OutputStream *ost = fg->outputs[i]->ost;
 | 
			
		||||
        if (ost &&
 | 
			
		||||
            ost->enc->type == AVMEDIA_TYPE_AUDIO &&
 | 
			
		||||
            !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
 | 
			
		||||
            av_buffersink_set_frame_size(ost->filter->filter,
 | 
			
		||||
                                         ost->enc_ctx->frame_size);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										316
									
								
								ffmpeg_opt.c
									
									
									
									
									
								
							
							
						
						
									
										316
									
								
								ffmpeg_opt.c
									
									
									
									
									
								
							@@ -66,12 +66,6 @@
 | 
			
		||||
const HWAccel hwaccels[] = {
 | 
			
		||||
#if HAVE_VDPAU_X11
 | 
			
		||||
    { "vdpau", vdpau_init, HWACCEL_VDPAU, AV_PIX_FMT_VDPAU },
 | 
			
		||||
#endif
 | 
			
		||||
#if HAVE_DXVA2_LIB
 | 
			
		||||
    { "dxva2", dxva2_init, HWACCEL_DXVA2, AV_PIX_FMT_DXVA2_VLD },
 | 
			
		||||
#endif
 | 
			
		||||
#if CONFIG_VDA
 | 
			
		||||
    { "vda",   vda_init,   HWACCEL_VDA,   AV_PIX_FMT_VDA },
 | 
			
		||||
#endif
 | 
			
		||||
    { 0 },
 | 
			
		||||
};
 | 
			
		||||
@@ -91,7 +85,6 @@ int do_benchmark_all  = 0;
 | 
			
		||||
int do_hex_dump       = 0;
 | 
			
		||||
int do_pkt_dump       = 0;
 | 
			
		||||
int copy_ts           = 0;
 | 
			
		||||
int start_at_zero     = 0;
 | 
			
		||||
int copy_tb           = -1;
 | 
			
		||||
int debug_ts          = 0;
 | 
			
		||||
int exit_on_error     = 0;
 | 
			
		||||
@@ -105,6 +98,8 @@ float max_error_rate  = 2.0/3;
 | 
			
		||||
static int intra_only         = 0;
 | 
			
		||||
static int file_overwrite     = 0;
 | 
			
		||||
static int no_file_overwrite  = 0;
 | 
			
		||||
static int video_discard      = 0;
 | 
			
		||||
static int intra_dc_precision = 8;
 | 
			
		||||
static int do_psnr            = 0;
 | 
			
		||||
static int input_sync;
 | 
			
		||||
static int override_ffserver  = 0;
 | 
			
		||||
@@ -509,8 +504,7 @@ static int opt_recording_timestamp(void *optctx, const char *opt, const char *ar
 | 
			
		||||
    char buf[128];
 | 
			
		||||
    int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
 | 
			
		||||
    struct tm time = *gmtime((time_t*)&recording_timestamp);
 | 
			
		||||
    if (!strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time))
 | 
			
		||||
        return -1;
 | 
			
		||||
    strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
 | 
			
		||||
    parse_option(o, "metadata", buf, options);
 | 
			
		||||
 | 
			
		||||
    av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
 | 
			
		||||
@@ -564,7 +558,7 @@ static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *
 | 
			
		||||
 * list of input streams. */
 | 
			
		||||
static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
 | 
			
		||||
{
 | 
			
		||||
    int i, ret;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < ic->nb_streams; i++) {
 | 
			
		||||
        AVStream *st = ic->streams[i];
 | 
			
		||||
@@ -573,8 +567,6 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
 | 
			
		||||
        char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
 | 
			
		||||
        char *codec_tag = NULL;
 | 
			
		||||
        char *next;
 | 
			
		||||
        char *discard_str = NULL;
 | 
			
		||||
        const AVOption *discard_opt = av_opt_find(dec, "skip_frame", NULL, 0, 0);
 | 
			
		||||
 | 
			
		||||
        if (!ist)
 | 
			
		||||
            exit_program(1);
 | 
			
		||||
@@ -599,33 +591,13 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ist->dec = choose_decoder(o, ic, st);
 | 
			
		||||
        ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codec->codec_id, ic, st, ist->dec);
 | 
			
		||||
        ist->opts = filter_codec_opts(o->g->codec_opts, ist->st->codec->codec_id, ic, st, ist->dec);
 | 
			
		||||
 | 
			
		||||
        ist->reinit_filters = -1;
 | 
			
		||||
        MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
 | 
			
		||||
 | 
			
		||||
        MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
 | 
			
		||||
        ist->user_set_discard = AVDISCARD_NONE;
 | 
			
		||||
        if (discard_str && av_opt_eval_int(dec, discard_opt, discard_str, &ist->user_set_discard) < 0) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
 | 
			
		||||
                    discard_str);
 | 
			
		||||
            exit_program(1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
 | 
			
		||||
 | 
			
		||||
        ist->dec_ctx = avcodec_alloc_context3(ist->dec);
 | 
			
		||||
        if (!ist->dec_ctx) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
 | 
			
		||||
            exit_program(1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ret = avcodec_copy_context(ist->dec_ctx, dec);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
 | 
			
		||||
            exit_program(1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switch (dec->codec_type) {
 | 
			
		||||
        case AVMEDIA_TYPE_VIDEO:
 | 
			
		||||
            if(!ist->dec)
 | 
			
		||||
@@ -634,9 +606,9 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
 | 
			
		||||
                dec->flags |= CODEC_FLAG_EMU_EDGE;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ist->resample_height  = ist->dec_ctx->height;
 | 
			
		||||
            ist->resample_width   = ist->dec_ctx->width;
 | 
			
		||||
            ist->resample_pix_fmt = ist->dec_ctx->pix_fmt;
 | 
			
		||||
            ist->resample_height  = dec->height;
 | 
			
		||||
            ist->resample_width   = dec->width;
 | 
			
		||||
            ist->resample_pix_fmt = dec->pix_fmt;
 | 
			
		||||
 | 
			
		||||
            MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
 | 
			
		||||
            if (framerate && av_parse_video_rate(&ist->framerate,
 | 
			
		||||
@@ -690,10 +662,10 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
 | 
			
		||||
            MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st);
 | 
			
		||||
            guess_input_channel_layout(ist);
 | 
			
		||||
 | 
			
		||||
            ist->resample_sample_fmt     = ist->dec_ctx->sample_fmt;
 | 
			
		||||
            ist->resample_sample_rate    = ist->dec_ctx->sample_rate;
 | 
			
		||||
            ist->resample_channels       = ist->dec_ctx->channels;
 | 
			
		||||
            ist->resample_channel_layout = ist->dec_ctx->channel_layout;
 | 
			
		||||
            ist->resample_sample_fmt     = dec->sample_fmt;
 | 
			
		||||
            ist->resample_sample_rate    = dec->sample_rate;
 | 
			
		||||
            ist->resample_channels       = dec->channels;
 | 
			
		||||
            ist->resample_channel_layout = dec->channel_layout;
 | 
			
		||||
 | 
			
		||||
            break;
 | 
			
		||||
        case AVMEDIA_TYPE_DATA:
 | 
			
		||||
@@ -704,7 +676,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
 | 
			
		||||
            MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
 | 
			
		||||
            MATCH_PER_STREAM_OPT(canvas_sizes, str, canvas_size, ic, st);
 | 
			
		||||
            if (canvas_size &&
 | 
			
		||||
                av_parse_video_size(&ist->dec_ctx->width, &ist->dec_ctx->height, canvas_size) < 0) {
 | 
			
		||||
                av_parse_video_size(&dec->width, &dec->height, canvas_size) < 0) {
 | 
			
		||||
                av_log(NULL, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
 | 
			
		||||
                exit_program(1);
 | 
			
		||||
            }
 | 
			
		||||
@@ -787,6 +759,7 @@ static int open_input_file(OptionsContext *o, const char *filename)
 | 
			
		||||
    AVInputFormat *file_iformat = NULL;
 | 
			
		||||
    int err, i, ret;
 | 
			
		||||
    int64_t timestamp;
 | 
			
		||||
    uint8_t buf[128];
 | 
			
		||||
    AVDictionary **opts;
 | 
			
		||||
    AVDictionary *unused_opts = NULL;
 | 
			
		||||
    AVDictionaryEntry *e = NULL;
 | 
			
		||||
@@ -794,7 +767,6 @@ static int open_input_file(OptionsContext *o, const char *filename)
 | 
			
		||||
    char *   video_codec_name = NULL;
 | 
			
		||||
    char *   audio_codec_name = NULL;
 | 
			
		||||
    char *subtitle_codec_name = NULL;
 | 
			
		||||
    int scan_all_pmts_set = 0;
 | 
			
		||||
 | 
			
		||||
    if (o->format) {
 | 
			
		||||
        if (!(file_iformat = av_find_input_format(o->format))) {
 | 
			
		||||
@@ -816,7 +788,8 @@ static int open_input_file(OptionsContext *o, const char *filename)
 | 
			
		||||
        exit_program(1);
 | 
			
		||||
    }
 | 
			
		||||
    if (o->nb_audio_sample_rate) {
 | 
			
		||||
        av_dict_set_int(&o->g->format_opts, "sample_rate", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i, 0);
 | 
			
		||||
        snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
 | 
			
		||||
        av_dict_set(&o->g->format_opts, "sample_rate", buf, 0);
 | 
			
		||||
    }
 | 
			
		||||
    if (o->nb_audio_channels) {
 | 
			
		||||
        /* because we set audio_channels based on both the "ac" and
 | 
			
		||||
@@ -825,7 +798,9 @@ static int open_input_file(OptionsContext *o, const char *filename)
 | 
			
		||||
        if (file_iformat && file_iformat->priv_class &&
 | 
			
		||||
            av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
 | 
			
		||||
                        AV_OPT_SEARCH_FAKE_OBJ)) {
 | 
			
		||||
            av_dict_set_int(&o->g->format_opts, "channels", o->audio_channels[o->nb_audio_channels - 1].u.i, 0);
 | 
			
		||||
            snprintf(buf, sizeof(buf), "%d",
 | 
			
		||||
                     o->audio_channels[o->nb_audio_channels - 1].u.i);
 | 
			
		||||
            av_dict_set(&o->g->format_opts, "channels", buf, 0);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (o->nb_frame_rates) {
 | 
			
		||||
@@ -865,19 +840,12 @@ static int open_input_file(OptionsContext *o, const char *filename)
 | 
			
		||||
    ic->flags |= AVFMT_FLAG_NONBLOCK;
 | 
			
		||||
    ic->interrupt_callback = int_cb;
 | 
			
		||||
 | 
			
		||||
    if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
 | 
			
		||||
        av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
        scan_all_pmts_set = 1;
 | 
			
		||||
    }
 | 
			
		||||
    /* open the input file with generic avformat function */
 | 
			
		||||
    err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
 | 
			
		||||
    if (err < 0) {
 | 
			
		||||
        print_error(filename, err);
 | 
			
		||||
        exit_program(1);
 | 
			
		||||
    }
 | 
			
		||||
    if (scan_all_pmts_set)
 | 
			
		||||
        av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
 | 
			
		||||
    remove_avoptions(&o->g->format_opts, o->g->codec_opts);
 | 
			
		||||
    assert_avoptions(o->g->format_opts);
 | 
			
		||||
 | 
			
		||||
    /* apply forced codec ids */
 | 
			
		||||
@@ -893,11 +861,9 @@ static int open_input_file(OptionsContext *o, const char *filename)
 | 
			
		||||
    ret = avformat_find_stream_info(ic, opts);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
 | 
			
		||||
        if (ic->nb_streams == 0) {
 | 
			
		||||
        avformat_close_input(&ic);
 | 
			
		||||
        exit_program(1);
 | 
			
		||||
    }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
 | 
			
		||||
    /* add the stream start time */
 | 
			
		||||
@@ -930,7 +896,7 @@ static int open_input_file(OptionsContext *o, const char *filename)
 | 
			
		||||
    f->start_time = o->start_time;
 | 
			
		||||
    f->recording_time = o->recording_time;
 | 
			
		||||
    f->input_ts_offset = o->input_ts_offset;
 | 
			
		||||
    f->ts_offset  = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
 | 
			
		||||
    f->ts_offset  = o->input_ts_offset - (copy_ts ? 0 : timestamp);
 | 
			
		||||
    f->nb_streams = ic->nb_streams;
 | 
			
		||||
    f->rate_emu   = o->rate_emu;
 | 
			
		||||
    f->accurate_seek = o->accurate_seek;
 | 
			
		||||
@@ -939,7 +905,7 @@ static int open_input_file(OptionsContext *o, const char *filename)
 | 
			
		||||
    unused_opts = strip_specifiers(o->g->codec_opts);
 | 
			
		||||
    for (i = f->ist_index; i < nb_input_streams; i++) {
 | 
			
		||||
        e = NULL;
 | 
			
		||||
        while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
 | 
			
		||||
        while ((e = av_dict_get(input_streams[i]->opts, "", e,
 | 
			
		||||
                                AV_DICT_IGNORE_SUFFIX)))
 | 
			
		||||
            av_dict_set(&unused_opts, e->key, NULL, 0);
 | 
			
		||||
    }
 | 
			
		||||
@@ -1081,19 +1047,11 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
 | 
			
		||||
    ost->st         = st;
 | 
			
		||||
    st->codec->codec_type = type;
 | 
			
		||||
    choose_encoder(o, oc, ost);
 | 
			
		||||
 | 
			
		||||
    ost->enc_ctx = avcodec_alloc_context3(ost->enc);
 | 
			
		||||
    if (!ost->enc_ctx) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
 | 
			
		||||
        exit_program(1);
 | 
			
		||||
    }
 | 
			
		||||
    ost->enc_ctx->codec_type = type;
 | 
			
		||||
 | 
			
		||||
    if (ost->enc) {
 | 
			
		||||
        AVIOContext *s = NULL;
 | 
			
		||||
        char *buf = NULL, *arg = NULL, *preset = NULL;
 | 
			
		||||
 | 
			
		||||
        ost->encoder_opts  = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
 | 
			
		||||
        ost->opts  = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
 | 
			
		||||
 | 
			
		||||
        MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
 | 
			
		||||
        if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
 | 
			
		||||
@@ -1108,7 +1066,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
 | 
			
		||||
                    exit_program(1);
 | 
			
		||||
                }
 | 
			
		||||
                *arg++ = 0;
 | 
			
		||||
                av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
                av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
                av_free(buf);
 | 
			
		||||
            } while (!s->eof_reached);
 | 
			
		||||
            avio_close(s);
 | 
			
		||||
@@ -1120,9 +1078,12 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
 | 
			
		||||
            exit_program(1);
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
 | 
			
		||||
        ost->opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    avcodec_get_context_defaults3(st->codec, ost->enc);
 | 
			
		||||
    st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
 | 
			
		||||
 | 
			
		||||
    ost->max_frames = INT64_MAX;
 | 
			
		||||
    MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
 | 
			
		||||
    for (i = 0; i<o->nb_max_frames; i++) {
 | 
			
		||||
@@ -1138,11 +1099,8 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
 | 
			
		||||
 | 
			
		||||
    MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
 | 
			
		||||
    while (bsf) {
 | 
			
		||||
        char *arg = NULL;
 | 
			
		||||
        if (next = strchr(bsf, ','))
 | 
			
		||||
            *next++ = 0;
 | 
			
		||||
        if (arg = strchr(bsf, '='))
 | 
			
		||||
            *arg++ = 0;
 | 
			
		||||
        if (!(bsfc = av_bitstream_filter_init(bsf))) {
 | 
			
		||||
            av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
 | 
			
		||||
            exit_program(1);
 | 
			
		||||
@@ -1151,7 +1109,6 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
 | 
			
		||||
            bsfc_prev->next = bsfc;
 | 
			
		||||
        else
 | 
			
		||||
            ost->bitstream_filters = bsfc;
 | 
			
		||||
        av_dict_set(&ost->bsf_args, bsfc->filter->name, arg, 0);
 | 
			
		||||
 | 
			
		||||
        bsfc_prev = bsfc;
 | 
			
		||||
        bsf       = next;
 | 
			
		||||
@@ -1162,17 +1119,17 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
 | 
			
		||||
        uint32_t tag = strtol(codec_tag, &next, 0);
 | 
			
		||||
        if (*next)
 | 
			
		||||
            tag = AV_RL32(codec_tag);
 | 
			
		||||
        ost->enc_ctx->codec_tag = tag;
 | 
			
		||||
        st->codec->codec_tag = tag;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
 | 
			
		||||
    if (qscale >= 0) {
 | 
			
		||||
        ost->enc_ctx->flags |= CODEC_FLAG_QSCALE;
 | 
			
		||||
        ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
 | 
			
		||||
        st->codec->flags |= CODEC_FLAG_QSCALE;
 | 
			
		||||
        st->codec->global_quality = FF_QP2LAMBDA * qscale;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (oc->oformat->flags & AVFMT_GLOBALHEADER)
 | 
			
		||||
        ost->enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
 | 
			
		||||
        st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
 | 
			
		||||
 | 
			
		||||
    av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
 | 
			
		||||
 | 
			
		||||
@@ -1186,7 +1143,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
 | 
			
		||||
    if (source_index >= 0) {
 | 
			
		||||
        ost->sync_ist = input_streams[source_index];
 | 
			
		||||
        input_streams[source_index]->discard = 0;
 | 
			
		||||
        input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard;
 | 
			
		||||
        input_streams[source_index]->st->discard = AVDISCARD_NONE;
 | 
			
		||||
    }
 | 
			
		||||
    ost->last_mux_dts = AV_NOPTS_VALUE;
 | 
			
		||||
 | 
			
		||||
@@ -1282,15 +1239,13 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
 | 
			
		||||
 | 
			
		||||
    ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
 | 
			
		||||
    st  = ost->st;
 | 
			
		||||
    video_enc = ost->enc_ctx;
 | 
			
		||||
    video_enc = st->codec;
 | 
			
		||||
 | 
			
		||||
    MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
 | 
			
		||||
    if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
 | 
			
		||||
        av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
 | 
			
		||||
        exit_program(1);
 | 
			
		||||
    }
 | 
			
		||||
    if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n");
 | 
			
		||||
 | 
			
		||||
    MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
 | 
			
		||||
    if (frame_aspect_ratio) {
 | 
			
		||||
@@ -1389,6 +1344,7 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
 | 
			
		||||
            if (p) p++;
 | 
			
		||||
        }
 | 
			
		||||
        video_enc->rc_override_count = i;
 | 
			
		||||
        video_enc->intra_dc_precision = intra_dc_precision - 8;
 | 
			
		||||
 | 
			
		||||
        if (do_psnr)
 | 
			
		||||
            video_enc->flags|= CODEC_FLAG_PSNR;
 | 
			
		||||
@@ -1398,11 +1354,11 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
 | 
			
		||||
        if (do_pass) {
 | 
			
		||||
            if (do_pass & 1) {
 | 
			
		||||
                video_enc->flags |= CODEC_FLAG_PASS1;
 | 
			
		||||
                av_dict_set(&ost->encoder_opts, "flags", "+pass1", AV_DICT_APPEND);
 | 
			
		||||
                av_dict_set(&ost->opts, "flags", "+pass1", AV_DICT_APPEND);
 | 
			
		||||
            }
 | 
			
		||||
            if (do_pass & 2) {
 | 
			
		||||
                video_enc->flags |= CODEC_FLAG_PASS2;
 | 
			
		||||
                av_dict_set(&ost->encoder_opts, "flags", "+pass2", AV_DICT_APPEND);
 | 
			
		||||
                av_dict_set(&ost->opts, "flags", "+pass2", AV_DICT_APPEND);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1444,7 +1400,7 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, in
 | 
			
		||||
    ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
 | 
			
		||||
    st  = ost->st;
 | 
			
		||||
 | 
			
		||||
    audio_enc = ost->enc_ctx;
 | 
			
		||||
    audio_enc = st->codec;
 | 
			
		||||
    audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
 | 
			
		||||
 | 
			
		||||
    MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
 | 
			
		||||
@@ -1474,29 +1430,15 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, in
 | 
			
		||||
        /* check for channel mapping for this audio stream */
 | 
			
		||||
        for (n = 0; n < o->nb_audio_channel_maps; n++) {
 | 
			
		||||
            AudioChannelMap *map = &o->audio_channel_maps[n];
 | 
			
		||||
            if ((map->ofile_idx   == -1 || ost->file_index == map->ofile_idx) &&
 | 
			
		||||
            InputStream *ist = input_streams[ost->source_index];
 | 
			
		||||
            if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
 | 
			
		||||
                (map->ofile_idx   == -1 || ost->file_index == map->ofile_idx) &&
 | 
			
		||||
                (map->ostream_idx == -1 || ost->st->index  == map->ostream_idx)) {
 | 
			
		||||
                InputStream *ist;
 | 
			
		||||
 | 
			
		||||
                if (map->channel_idx == -1) {
 | 
			
		||||
                    ist = NULL;
 | 
			
		||||
                } else if (ost->source_index < 0) {
 | 
			
		||||
                    av_log(NULL, AV_LOG_FATAL, "Cannot determine input stream for channel mapping %d.%d\n",
 | 
			
		||||
                           ost->file_index, ost->st->index);
 | 
			
		||||
                    continue;
 | 
			
		||||
                } else {
 | 
			
		||||
                    ist = input_streams[ost->source_index];
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) {
 | 
			
		||||
                    if (av_reallocp_array(&ost->audio_channels_map,
 | 
			
		||||
                                          ost->audio_channels_mapped + 1,
 | 
			
		||||
                                          sizeof(*ost->audio_channels_map)
 | 
			
		||||
                                          ) < 0 )
 | 
			
		||||
                        exit_program(1);
 | 
			
		||||
 | 
			
		||||
                if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
 | 
			
		||||
                    ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                    av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
 | 
			
		||||
                           ost->file_index, ost->st->index);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -1536,7 +1478,7 @@ static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc,
 | 
			
		||||
 | 
			
		||||
    ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
 | 
			
		||||
    st  = ost->st;
 | 
			
		||||
    subtitle_enc = ost->enc_ctx;
 | 
			
		||||
    subtitle_enc = st->codec;
 | 
			
		||||
 | 
			
		||||
    subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
 | 
			
		||||
 | 
			
		||||
@@ -1635,36 +1577,26 @@ static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const ch
 | 
			
		||||
        AVStream *st;
 | 
			
		||||
        OutputStream *ost;
 | 
			
		||||
        AVCodec *codec;
 | 
			
		||||
        const char *enc_config;
 | 
			
		||||
        AVCodecContext *avctx;
 | 
			
		||||
 | 
			
		||||
        codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
 | 
			
		||||
        if (!codec) {
 | 
			
		||||
            av_log(s, AV_LOG_ERROR, "no encoder found for codec id %i\n", ic->streams[i]->codec->codec_id);
 | 
			
		||||
            return AVERROR(EINVAL);
 | 
			
		||||
        }
 | 
			
		||||
        if (codec->type == AVMEDIA_TYPE_AUDIO)
 | 
			
		||||
            opt_audio_codec(o, "c:a", codec->name);
 | 
			
		||||
        else if (codec->type == AVMEDIA_TYPE_VIDEO)
 | 
			
		||||
            opt_video_codec(o, "c:v", codec->name);
 | 
			
		||||
        ost   = new_output_stream(o, s, codec->type, -1);
 | 
			
		||||
        st    = ost->st;
 | 
			
		||||
        avctx = st->codec;
 | 
			
		||||
        ost->enc = codec;
 | 
			
		||||
 | 
			
		||||
        avcodec_get_context_defaults3(st->codec, codec);
 | 
			
		||||
        enc_config = av_stream_get_recommended_encoder_configuration(ic->streams[i]);
 | 
			
		||||
        if (enc_config) {
 | 
			
		||||
            AVDictionary *opts = NULL;
 | 
			
		||||
            av_dict_parse_string(&opts, enc_config, "=", ",", 0);
 | 
			
		||||
            av_opt_set_dict2(st->codec, &opts, AV_OPT_SEARCH_CHILDREN);
 | 
			
		||||
            av_dict_free(&opts);
 | 
			
		||||
        }
 | 
			
		||||
        // FIXME: a more elegant solution is needed
 | 
			
		||||
        memcpy(st, ic->streams[i], sizeof(AVStream));
 | 
			
		||||
        st->cur_dts = 0;
 | 
			
		||||
        st->info = av_malloc(sizeof(*st->info));
 | 
			
		||||
        memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
 | 
			
		||||
        st->codec= avctx;
 | 
			
		||||
        avcodec_copy_context(st->codec, ic->streams[i]->codec);
 | 
			
		||||
 | 
			
		||||
        if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
 | 
			
		||||
            choose_sample_fmt(st, codec);
 | 
			
		||||
        else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
 | 
			
		||||
            choose_pixel_fmt(st, st->codec, codec, st->codec->pix_fmt);
 | 
			
		||||
        avcodec_copy_context(ost->enc_ctx, st->codec);
 | 
			
		||||
        if (enc_config)
 | 
			
		||||
            av_dict_parse_string(&ost->encoder_opts, enc_config, "=", ",", 0);
 | 
			
		||||
            choose_pixel_fmt(st, codec, st->codec->pix_fmt);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    avformat_close_input(&ic);
 | 
			
		||||
@@ -1752,8 +1684,8 @@ static int open_output_file(OptionsContext *o, const char *filename)
 | 
			
		||||
    if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
 | 
			
		||||
        int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
 | 
			
		||||
        if (o->stop_time <= start_time) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
 | 
			
		||||
            exit_program(1);
 | 
			
		||||
            av_log(NULL, AV_LOG_WARNING, "-to value smaller than -ss; ignoring -to.\n");
 | 
			
		||||
            o->stop_time = INT64_MAX;
 | 
			
		||||
        } else {
 | 
			
		||||
            o->recording_time = o->stop_time - start_time;
 | 
			
		||||
        }
 | 
			
		||||
@@ -1837,7 +1769,7 @@ static int open_output_file(OptionsContext *o, const char *filename)
 | 
			
		||||
                    if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
 | 
			
		||||
                    if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
 | 
			
		||||
                    ist->discard = 0;
 | 
			
		||||
                    ist->st->discard = ist->user_set_discard;
 | 
			
		||||
                    ist->st->discard = AVDISCARD_NONE;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -1851,7 +1783,7 @@ static int open_output_file(OptionsContext *o, const char *filename)
 | 
			
		||||
        /* pick the "best" stream of each type */
 | 
			
		||||
 | 
			
		||||
        /* video: highest resolution */
 | 
			
		||||
        if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
 | 
			
		||||
        if (!o->video_disable && oc->oformat->video_codec != AV_CODEC_ID_NONE) {
 | 
			
		||||
            int area = 0, idx = -1;
 | 
			
		||||
            int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
 | 
			
		||||
            for (i = 0; i < nb_input_streams; i++) {
 | 
			
		||||
@@ -1873,7 +1805,7 @@ static int open_output_file(OptionsContext *o, const char *filename)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* audio: most channels */
 | 
			
		||||
        if (!o->audio_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
 | 
			
		||||
        if (!o->audio_disable && oc->oformat->audio_codec != AV_CODEC_ID_NONE) {
 | 
			
		||||
            int channels = 0, idx = -1;
 | 
			
		||||
            for (i = 0; i < nb_input_streams; i++) {
 | 
			
		||||
                ist = input_streams[i];
 | 
			
		||||
@@ -1892,29 +1824,10 @@ static int open_output_file(OptionsContext *o, const char *filename)
 | 
			
		||||
        if (!o->subtitle_disable && (avcodec_find_encoder(oc->oformat->subtitle_codec) || subtitle_codec_name)) {
 | 
			
		||||
            for (i = 0; i < nb_input_streams; i++)
 | 
			
		||||
                if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
 | 
			
		||||
                    AVCodecDescriptor const *input_descriptor =
 | 
			
		||||
                        avcodec_descriptor_get(input_streams[i]->st->codec->codec_id);
 | 
			
		||||
                    AVCodecDescriptor const *output_descriptor = NULL;
 | 
			
		||||
                    AVCodec const *output_codec =
 | 
			
		||||
                        avcodec_find_encoder(oc->oformat->subtitle_codec);
 | 
			
		||||
                    int input_props = 0, output_props = 0;
 | 
			
		||||
                    if (output_codec)
 | 
			
		||||
                        output_descriptor = avcodec_descriptor_get(output_codec->id);
 | 
			
		||||
                    if (input_descriptor)
 | 
			
		||||
                        input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
 | 
			
		||||
                    if (output_descriptor)
 | 
			
		||||
                        output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
 | 
			
		||||
                    if (subtitle_codec_name ||
 | 
			
		||||
                        input_props & output_props ||
 | 
			
		||||
                        // Map dvb teletext which has neither property to any output subtitle encoder
 | 
			
		||||
                        input_descriptor && output_descriptor &&
 | 
			
		||||
                        (!input_descriptor->props ||
 | 
			
		||||
                         !output_descriptor->props)) {
 | 
			
		||||
                    new_subtitle_stream(o, oc, i);
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
        }
 | 
			
		||||
        /* do something with data? */
 | 
			
		||||
    } else {
 | 
			
		||||
        for (i = 0; i < o->nb_stream_maps; i++) {
 | 
			
		||||
@@ -2001,8 +1914,8 @@ loop_end:
 | 
			
		||||
        ost->stream_copy               = 0;
 | 
			
		||||
        ost->attachment_filename       = o->attachments[i];
 | 
			
		||||
        ost->finished                  = 1;
 | 
			
		||||
        ost->enc_ctx->extradata      = attachment;
 | 
			
		||||
        ost->enc_ctx->extradata_size = len;
 | 
			
		||||
        ost->st->codec->extradata      = attachment;
 | 
			
		||||
        ost->st->codec->extradata_size = len;
 | 
			
		||||
 | 
			
		||||
        p = strrchr(o->attachments[i], '/');
 | 
			
		||||
        av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
@@ -2024,7 +1937,7 @@ loop_end:
 | 
			
		||||
    unused_opts = strip_specifiers(o->g->codec_opts);
 | 
			
		||||
    for (i = of->ost_index; i < nb_output_streams; i++) {
 | 
			
		||||
        e = NULL;
 | 
			
		||||
        while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
 | 
			
		||||
        while ((e = av_dict_get(output_streams[i]->opts, "", e,
 | 
			
		||||
                                AV_DICT_IGNORE_SUFFIX)))
 | 
			
		||||
            av_dict_set(&unused_opts, e->key, NULL, 0);
 | 
			
		||||
    }
 | 
			
		||||
@@ -2034,13 +1947,8 @@ loop_end:
 | 
			
		||||
        const AVClass *class = avcodec_get_class();
 | 
			
		||||
        const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
 | 
			
		||||
                                             AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
 | 
			
		||||
        const AVClass *fclass = avformat_get_class();
 | 
			
		||||
        const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
 | 
			
		||||
                                              AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
 | 
			
		||||
        if (!option || foption)
 | 
			
		||||
        if (!option)
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
 | 
			
		||||
                   "output file #%d (%s) is not an encoding option.\n", e->key,
 | 
			
		||||
@@ -2085,7 +1993,9 @@ loop_end:
 | 
			
		||||
        assert_file_overwrite(filename);
 | 
			
		||||
 | 
			
		||||
    if (o->mux_preload) {
 | 
			
		||||
        av_dict_set_int(&of->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
 | 
			
		||||
        uint8_t buf[64];
 | 
			
		||||
        snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
 | 
			
		||||
        av_dict_set(&of->opts, "preload", buf, 0);
 | 
			
		||||
    }
 | 
			
		||||
    oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
 | 
			
		||||
 | 
			
		||||
@@ -2138,8 +2048,6 @@ loop_end:
 | 
			
		||||
                continue;
 | 
			
		||||
            ist = input_streams[output_streams[i]->source_index];
 | 
			
		||||
            av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
            if (!output_streams[i]->stream_copy)
 | 
			
		||||
                av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    /* process manually set metadata */
 | 
			
		||||
@@ -2211,8 +2119,7 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
            for (j = 0; j < nb_input_files; j++) {
 | 
			
		||||
                for (i = 0; i < input_files[j]->nb_streams; i++) {
 | 
			
		||||
                    AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
 | 
			
		||||
                    if (c->codec_type != AVMEDIA_TYPE_VIDEO ||
 | 
			
		||||
                        !c->time_base.num)
 | 
			
		||||
                    if (c->codec_type != AVMEDIA_TYPE_VIDEO)
 | 
			
		||||
                        continue;
 | 
			
		||||
                    fr = c->time_base.den * 1000 / c->time_base.num;
 | 
			
		||||
                    if (fr == 25000) {
 | 
			
		||||
@@ -2245,19 +2152,19 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
 | 
			
		||||
        parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
 | 
			
		||||
        parse_option(o, "r", frame_rates[norm], options);
 | 
			
		||||
        opt_default(NULL, "g", norm == PAL ? "15" : "18");
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "g", norm == PAL ? "15" : "18", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
 | 
			
		||||
        opt_default(NULL, "b:v", "1150000");
 | 
			
		||||
        opt_default(NULL, "maxrate:v", "1150000");
 | 
			
		||||
        opt_default(NULL, "minrate:v", "1150000");
 | 
			
		||||
        opt_default(NULL, "bufsize:v", "327680"); // 40*1024*8;
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "b:v", "1150000", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "maxrate", "1150000", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "minrate", "1150000", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "bufsize", "327680", AV_DICT_DONT_OVERWRITE); // 40*1024*8;
 | 
			
		||||
 | 
			
		||||
        opt_default(NULL, "b:a", "224000");
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "b:a", "224000", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
        parse_option(o, "ar", "44100", options);
 | 
			
		||||
        parse_option(o, "ac", "2", options);
 | 
			
		||||
 | 
			
		||||
        opt_default(NULL, "packetsize", "2324");
 | 
			
		||||
        opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
 | 
			
		||||
        av_dict_set(&o->g->format_opts, "packetsize", "2324", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
        av_dict_set(&o->g->format_opts, "muxrate", "1411200", AV_DICT_DONT_OVERWRITE); // 2352 * 75 * 8;
 | 
			
		||||
 | 
			
		||||
        /* We have to offset the PTS, so that it is consistent with the SCR.
 | 
			
		||||
           SCR starts at 36000, but the first two packs contain only padding
 | 
			
		||||
@@ -2274,18 +2181,18 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
        parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
 | 
			
		||||
        parse_option(o, "r", frame_rates[norm], options);
 | 
			
		||||
        parse_option(o, "pix_fmt", "yuv420p", options);
 | 
			
		||||
        opt_default(NULL, "g", norm == PAL ? "15" : "18");
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "g", norm == PAL ? "15" : "18", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
 | 
			
		||||
        opt_default(NULL, "b:v", "2040000");
 | 
			
		||||
        opt_default(NULL, "maxrate:v", "2516000");
 | 
			
		||||
        opt_default(NULL, "minrate:v", "0"); // 1145000;
 | 
			
		||||
        opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
 | 
			
		||||
        opt_default(NULL, "scan_offset", "1");
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "b:v", "2040000", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "maxrate", "2516000", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "minrate", "0", AV_DICT_DONT_OVERWRITE); // 1145000;
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "bufsize", "1835008", AV_DICT_DONT_OVERWRITE); // 224*1024*8;
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "scan_offset", "1", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
 | 
			
		||||
        opt_default(NULL, "b:a", "224000");
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "b:a", "224000", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
        parse_option(o, "ar", "44100", options);
 | 
			
		||||
 | 
			
		||||
        opt_default(NULL, "packetsize", "2324");
 | 
			
		||||
        av_dict_set(&o->g->format_opts, "packetsize", "2324", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
 | 
			
		||||
    } else if (!strcmp(arg, "dvd")) {
 | 
			
		||||
 | 
			
		||||
@@ -2296,17 +2203,17 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
        parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
 | 
			
		||||
        parse_option(o, "r", frame_rates[norm], options);
 | 
			
		||||
        parse_option(o, "pix_fmt", "yuv420p", options);
 | 
			
		||||
        opt_default(NULL, "g", norm == PAL ? "15" : "18");
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "g", norm == PAL ? "15" : "18", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
 | 
			
		||||
        opt_default(NULL, "b:v", "6000000");
 | 
			
		||||
        opt_default(NULL, "maxrate:v", "9000000");
 | 
			
		||||
        opt_default(NULL, "minrate:v", "0"); // 1500000;
 | 
			
		||||
        opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "b:v", "6000000", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "maxrate", "9000000", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "minrate", "0", AV_DICT_DONT_OVERWRITE); // 1500000;
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "bufsize", "1835008", AV_DICT_DONT_OVERWRITE); // 224*1024*8;
 | 
			
		||||
 | 
			
		||||
        opt_default(NULL, "packetsize", "2048");  // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
 | 
			
		||||
        opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
 | 
			
		||||
        av_dict_set(&o->g->format_opts, "packetsize", "2048", AV_DICT_DONT_OVERWRITE);  // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
 | 
			
		||||
        av_dict_set(&o->g->format_opts, "muxrate", "10080000", AV_DICT_DONT_OVERWRITE); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
 | 
			
		||||
 | 
			
		||||
        opt_default(NULL, "b:a", "448000");
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "b:a", "448000", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
        parse_option(o, "ar", "48000", options);
 | 
			
		||||
 | 
			
		||||
    } else if (!strncmp(arg, "dv", 2)) {
 | 
			
		||||
@@ -2325,10 +2232,6 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    av_dict_copy(&o->g->codec_opts,  codec_opts, AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
    av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -2345,9 +2248,6 @@ static int opt_vstats(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
    time_t today2 = time(NULL);
 | 
			
		||||
    struct tm *today = localtime(&today2);
 | 
			
		||||
 | 
			
		||||
    if (!today)
 | 
			
		||||
        return AVERROR(errno);
 | 
			
		||||
 | 
			
		||||
    snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
 | 
			
		||||
             today->tm_sec);
 | 
			
		||||
    return opt_vstats_file(NULL, opt, filename);
 | 
			
		||||
@@ -2451,11 +2351,7 @@ static int opt_old2new(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
static int opt_bitrate(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
{
 | 
			
		||||
    OptionsContext *o = optctx;
 | 
			
		||||
 | 
			
		||||
    if(!strcmp(opt, "ab")){
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "b:a", arg, 0);
 | 
			
		||||
        return 0;
 | 
			
		||||
    } else if(!strcmp(opt, "b")){
 | 
			
		||||
    if(!strcmp(opt, "b")){
 | 
			
		||||
        av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
 | 
			
		||||
        av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
 | 
			
		||||
        return 0;
 | 
			
		||||
@@ -2828,13 +2724,13 @@ const OptionDef options[] = {
 | 
			
		||||
    { "itsscale",       HAS_ARG | OPT_DOUBLE | OPT_SPEC |
 | 
			
		||||
                        OPT_EXPERT | OPT_INPUT,                      { .off = OFFSET(ts_scale) },
 | 
			
		||||
        "set the input ts scale", "scale" },
 | 
			
		||||
    { "timestamp",      HAS_ARG | OPT_PERFILE | OPT_OUTPUT,          { .func_arg = opt_recording_timestamp },
 | 
			
		||||
    { "timestamp",      HAS_ARG | OPT_PERFILE,                       { .func_arg = opt_recording_timestamp },
 | 
			
		||||
        "set the recording timestamp ('now' to set the current time)", "time" },
 | 
			
		||||
    { "metadata",       HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
 | 
			
		||||
        "add metadata", "string=string" },
 | 
			
		||||
    { "dframes",        HAS_ARG | OPT_PERFILE | OPT_EXPERT |
 | 
			
		||||
                        OPT_OUTPUT,                                  { .func_arg = opt_data_frames },
 | 
			
		||||
        "set the number of data frames to output", "number" },
 | 
			
		||||
        "set the number of data frames to record", "number" },
 | 
			
		||||
    { "benchmark",      OPT_BOOL | OPT_EXPERT,                       { &do_benchmark },
 | 
			
		||||
        "add timings for benchmarking" },
 | 
			
		||||
    { "benchmark_all",  OPT_BOOL | OPT_EXPERT,                       { &do_benchmark_all },
 | 
			
		||||
@@ -2863,8 +2759,6 @@ const OptionDef options[] = {
 | 
			
		||||
        "audio drift threshold", "threshold" },
 | 
			
		||||
    { "copyts",         OPT_BOOL | OPT_EXPERT,                       { ©_ts },
 | 
			
		||||
        "copy timestamps" },
 | 
			
		||||
    { "start_at_zero",  OPT_BOOL | OPT_EXPERT,                       { &start_at_zero },
 | 
			
		||||
        "shift input timestamps to start at 0 when using copyts" },
 | 
			
		||||
    { "copytb",         HAS_ARG | OPT_INT | OPT_EXPERT,              { ©_tb },
 | 
			
		||||
        "copy input stream time base when stream copying", "mode" },
 | 
			
		||||
    { "shortest",       OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
 | 
			
		||||
@@ -2885,7 +2779,7 @@ const OptionDef options[] = {
 | 
			
		||||
    { "copypriorss",    OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT,   { .off = OFFSET(copy_prior_start) },
 | 
			
		||||
        "copy or discard frames before start time" },
 | 
			
		||||
    { "frames",         OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
 | 
			
		||||
        "set the number of frames to output", "number" },
 | 
			
		||||
        "set the number of frames to record", "number" },
 | 
			
		||||
    { "tag",            OPT_STRING | HAS_ARG | OPT_SPEC |
 | 
			
		||||
                        OPT_EXPERT | OPT_OUTPUT | OPT_INPUT,         { .off = OFFSET(codec_tags) },
 | 
			
		||||
        "force codec tag/fourcc", "fourcc/tag" },
 | 
			
		||||
@@ -2921,13 +2815,10 @@ const OptionDef options[] = {
 | 
			
		||||
        "print timestamp debugging info" },
 | 
			
		||||
    { "max_error_rate",  HAS_ARG | OPT_FLOAT,                        { &max_error_rate },
 | 
			
		||||
        "maximum error rate", "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success." },
 | 
			
		||||
    { "discard",        OPT_STRING | HAS_ARG | OPT_SPEC |
 | 
			
		||||
                        OPT_INPUT,                                   { .off = OFFSET(discard) },
 | 
			
		||||
        "discard", "" },
 | 
			
		||||
 | 
			
		||||
    /* video options */
 | 
			
		||||
    { "vframes",      OPT_VIDEO | HAS_ARG  | OPT_PERFILE | OPT_OUTPUT,           { .func_arg = opt_video_frames },
 | 
			
		||||
        "set the number of video frames to output", "number" },
 | 
			
		||||
        "set the number of video frames to record", "number" },
 | 
			
		||||
    { "r",            OPT_VIDEO | HAS_ARG  | OPT_STRING | OPT_SPEC |
 | 
			
		||||
                      OPT_INPUT | OPT_OUTPUT,                                    { .off = OFFSET(frame_rates) },
 | 
			
		||||
        "set frame rate (Hz value, fraction or abbreviation)", "rate" },
 | 
			
		||||
@@ -2946,6 +2837,8 @@ const OptionDef options[] = {
 | 
			
		||||
        "deprecated use -g 1" },
 | 
			
		||||
    { "vn",           OPT_VIDEO | OPT_BOOL  | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(video_disable) },
 | 
			
		||||
        "disable video" },
 | 
			
		||||
    { "vdt",          OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT ,               { &video_discard },
 | 
			
		||||
        "discard threshold", "n" },
 | 
			
		||||
    { "rc_override",  OPT_VIDEO | HAS_ARG | OPT_EXPERT  | OPT_STRING | OPT_SPEC |
 | 
			
		||||
                      OPT_OUTPUT,                                                { .off = OFFSET(rc_overrides) },
 | 
			
		||||
        "rate control override for specific intervals", "override" },
 | 
			
		||||
@@ -2985,6 +2878,8 @@ const OptionDef options[] = {
 | 
			
		||||
    { "top",          OPT_VIDEO | HAS_ARG | OPT_EXPERT  | OPT_INT| OPT_SPEC |
 | 
			
		||||
                      OPT_INPUT | OPT_OUTPUT,                                    { .off = OFFSET(top_field_first) },
 | 
			
		||||
        "top=1/bottom=0/auto=-1 field first", "" },
 | 
			
		||||
    { "dc",           OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT ,               { &intra_dc_precision },
 | 
			
		||||
        "intra_dc_precision", "precision" },
 | 
			
		||||
    { "vtag",         OPT_VIDEO | HAS_ARG | OPT_EXPERT  | OPT_PERFILE |
 | 
			
		||||
                      OPT_OUTPUT,                                                { .func_arg = opt_old2new },
 | 
			
		||||
        "force video tag/fourcc", "fourcc/tag" },
 | 
			
		||||
@@ -2999,8 +2894,6 @@ const OptionDef options[] = {
 | 
			
		||||
    { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
 | 
			
		||||
                          OPT_SPEC | OPT_OUTPUT,                                 { .off = OFFSET(forced_key_frames) },
 | 
			
		||||
        "force key frames at specified timestamps", "timestamps" },
 | 
			
		||||
    { "ab",           OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT,            { .func_arg = opt_bitrate },
 | 
			
		||||
        "audio bitrate (please use -b:a)", "bitrate" },
 | 
			
		||||
    { "b",            OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT,            { .func_arg = opt_bitrate },
 | 
			
		||||
        "video bitrate (please use -b:v)", "bitrate" },
 | 
			
		||||
    { "hwaccel",          OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
 | 
			
		||||
@@ -3009,13 +2902,10 @@ const OptionDef options[] = {
 | 
			
		||||
    { "hwaccel_device",   OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
 | 
			
		||||
                          OPT_SPEC | OPT_INPUT,                                  { .off = OFFSET(hwaccel_devices) },
 | 
			
		||||
        "select a device for HW acceleration" "devicename" },
 | 
			
		||||
#if HAVE_VDPAU_X11
 | 
			
		||||
    { "vdpau_api_ver", HAS_ARG | OPT_INT | OPT_EXPERT, { &vdpau_api_ver }, "" },
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    /* audio options */
 | 
			
		||||
    { "aframes",        OPT_AUDIO | HAS_ARG  | OPT_PERFILE | OPT_OUTPUT,           { .func_arg = opt_audio_frames },
 | 
			
		||||
        "set the number of audio frames to output", "number" },
 | 
			
		||||
        "set the number of audio frames to record", "number" },
 | 
			
		||||
    { "aq",             OPT_AUDIO | HAS_ARG  | OPT_PERFILE | OPT_OUTPUT,           { .func_arg = opt_audio_qscale },
 | 
			
		||||
        "set audio quality (codec-specific)", "quality", },
 | 
			
		||||
    { "ar",             OPT_AUDIO | HAS_ARG  | OPT_INT | OPT_SPEC |
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										136
									
								
								ffmpeg_vda.c
									
									
									
									
									
								
							
							
						
						
									
										136
									
								
								ffmpeg_vda.c
									
									
									
									
									
								
							@@ -1,136 +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
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "libavcodec/avcodec.h"
 | 
			
		||||
#include "libavcodec/vda.h"
 | 
			
		||||
#include "libavutil/imgutils.h"
 | 
			
		||||
 | 
			
		||||
#include "ffmpeg.h"
 | 
			
		||||
 | 
			
		||||
typedef struct VDAContext {
 | 
			
		||||
    AVFrame *tmp_frame;
 | 
			
		||||
} VDAContext;
 | 
			
		||||
 | 
			
		||||
static int vda_retrieve_data(AVCodecContext *s, AVFrame *frame)
 | 
			
		||||
{
 | 
			
		||||
    InputStream *ist = s->opaque;
 | 
			
		||||
    VDAContext  *vda = ist->hwaccel_ctx;
 | 
			
		||||
    CVPixelBufferRef pixbuf = (CVPixelBufferRef)frame->data[3];
 | 
			
		||||
    OSType pixel_format = CVPixelBufferGetPixelFormatType(pixbuf);
 | 
			
		||||
    CVReturn err;
 | 
			
		||||
    uint8_t *data[4] = { 0 };
 | 
			
		||||
    int linesize[4] = { 0 };
 | 
			
		||||
    int planes, ret, i;
 | 
			
		||||
 | 
			
		||||
    av_frame_unref(vda->tmp_frame);
 | 
			
		||||
 | 
			
		||||
    switch (pixel_format) {
 | 
			
		||||
    case kCVPixelFormatType_420YpCbCr8Planar: vda->tmp_frame->format = AV_PIX_FMT_YUV420P; break;
 | 
			
		||||
    case kCVPixelFormatType_422YpCbCr8:       vda->tmp_frame->format = AV_PIX_FMT_UYVY422; break;
 | 
			
		||||
    default:
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR,
 | 
			
		||||
               "Unsupported pixel format: %u\n", pixel_format);
 | 
			
		||||
        return AVERROR(ENOSYS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vda->tmp_frame->width  = frame->width;
 | 
			
		||||
    vda->tmp_frame->height = frame->height;
 | 
			
		||||
    ret = av_frame_get_buffer(vda->tmp_frame, 32);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
 | 
			
		||||
    err = CVPixelBufferLockBaseAddress(pixbuf, kCVPixelBufferLock_ReadOnly);
 | 
			
		||||
    if (err != kCVReturnSuccess) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Error locking the pixel buffer.\n");
 | 
			
		||||
        return AVERROR_UNKNOWN;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (CVPixelBufferIsPlanar(pixbuf)) {
 | 
			
		||||
 | 
			
		||||
        planes = CVPixelBufferGetPlaneCount(pixbuf);
 | 
			
		||||
        for (i = 0; i < planes; i++) {
 | 
			
		||||
            data[i]     = CVPixelBufferGetBaseAddressOfPlane(pixbuf, i);
 | 
			
		||||
            linesize[i] = CVPixelBufferGetBytesPerRowOfPlane(pixbuf, i);
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        data[0] = CVPixelBufferGetBaseAddress(pixbuf);
 | 
			
		||||
        linesize[0] = CVPixelBufferGetBytesPerRow(pixbuf);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    av_image_copy(vda->tmp_frame->data, vda->tmp_frame->linesize,
 | 
			
		||||
                  data, linesize, vda->tmp_frame->format,
 | 
			
		||||
                  frame->width, frame->height);
 | 
			
		||||
 | 
			
		||||
    ret = av_frame_copy_props(vda->tmp_frame, frame);
 | 
			
		||||
    CVPixelBufferUnlockBaseAddress(pixbuf, kCVPixelBufferLock_ReadOnly);
 | 
			
		||||
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
 | 
			
		||||
    av_frame_unref(frame);
 | 
			
		||||
    av_frame_move_ref(frame, vda->tmp_frame);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void vda_uninit(AVCodecContext *s)
 | 
			
		||||
{
 | 
			
		||||
    InputStream *ist = s->opaque;
 | 
			
		||||
    VDAContext  *vda = ist->hwaccel_ctx;
 | 
			
		||||
 | 
			
		||||
    ist->hwaccel_uninit        = NULL;
 | 
			
		||||
    ist->hwaccel_retrieve_data = NULL;
 | 
			
		||||
 | 
			
		||||
    av_frame_free(&vda->tmp_frame);
 | 
			
		||||
 | 
			
		||||
    av_vda_default_free(s);
 | 
			
		||||
    av_freep(&ist->hwaccel_ctx);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int vda_init(AVCodecContext *s)
 | 
			
		||||
{
 | 
			
		||||
    InputStream *ist = s->opaque;
 | 
			
		||||
    int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
 | 
			
		||||
    VDAContext *vda;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    vda = av_mallocz(sizeof(*vda));
 | 
			
		||||
    if (!vda)
 | 
			
		||||
        return AVERROR(ENOMEM);
 | 
			
		||||
 | 
			
		||||
    ist->hwaccel_ctx           = vda;
 | 
			
		||||
    ist->hwaccel_uninit        = vda_uninit;
 | 
			
		||||
    ist->hwaccel_retrieve_data = vda_retrieve_data;
 | 
			
		||||
 | 
			
		||||
    vda->tmp_frame = av_frame_alloc();
 | 
			
		||||
    if (!vda->tmp_frame) {
 | 
			
		||||
        ret = AVERROR(ENOMEM);
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = av_vda_default_init(s);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        av_log(NULL, loglevel, "Error creating VDA decoder.\n");
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
fail:
 | 
			
		||||
    vda_uninit(s);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
@@ -42,11 +42,9 @@ typedef struct VDPAUContext {
 | 
			
		||||
    VdpGetErrorString                               *get_error_string;
 | 
			
		||||
    VdpGetInformationString                         *get_information_string;
 | 
			
		||||
    VdpDeviceDestroy                                *device_destroy;
 | 
			
		||||
#if 1 // for ffmpegs older vdpau API, not the oldest though
 | 
			
		||||
    VdpDecoderCreate                                *decoder_create;
 | 
			
		||||
    VdpDecoderDestroy                               *decoder_destroy;
 | 
			
		||||
    VdpDecoderRender                                *decoder_render;
 | 
			
		||||
#endif
 | 
			
		||||
    VdpVideoSurfaceCreate                           *video_surface_create;
 | 
			
		||||
    VdpVideoSurfaceDestroy                          *video_surface_destroy;
 | 
			
		||||
    VdpVideoSurfaceGetBitsYCbCr                     *video_surface_get_bits;
 | 
			
		||||
@@ -59,8 +57,6 @@ typedef struct VDPAUContext {
 | 
			
		||||
    VdpYCbCrFormat vdpau_format;
 | 
			
		||||
} VDPAUContext;
 | 
			
		||||
 | 
			
		||||
int vdpau_api_ver = 2;
 | 
			
		||||
 | 
			
		||||
static void vdpau_uninit(AVCodecContext *s)
 | 
			
		||||
{
 | 
			
		||||
    InputStream  *ist = s->opaque;
 | 
			
		||||
@@ -243,11 +239,9 @@ do {
 | 
			
		||||
    GET_CALLBACK(VDP_FUNC_ID_GET_ERROR_STRING,               get_error_string);
 | 
			
		||||
    GET_CALLBACK(VDP_FUNC_ID_GET_INFORMATION_STRING,         get_information_string);
 | 
			
		||||
    GET_CALLBACK(VDP_FUNC_ID_DEVICE_DESTROY,                 device_destroy);
 | 
			
		||||
    if (vdpau_api_ver == 1) {
 | 
			
		||||
    GET_CALLBACK(VDP_FUNC_ID_DECODER_CREATE,                 decoder_create);
 | 
			
		||||
    GET_CALLBACK(VDP_FUNC_ID_DECODER_DESTROY,                decoder_destroy);
 | 
			
		||||
    GET_CALLBACK(VDP_FUNC_ID_DECODER_RENDER,                 decoder_render);
 | 
			
		||||
    }
 | 
			
		||||
    GET_CALLBACK(VDP_FUNC_ID_VIDEO_SURFACE_CREATE,           video_surface_create);
 | 
			
		||||
    GET_CALLBACK(VDP_FUNC_ID_VIDEO_SURFACE_DESTROY,          video_surface_destroy);
 | 
			
		||||
    GET_CALLBACK(VDP_FUNC_ID_VIDEO_SURFACE_GET_BITS_Y_CB_CR, video_surface_get_bits);
 | 
			
		||||
@@ -276,16 +270,12 @@ do {
 | 
			
		||||
    ctx->vdpau_format = vdpau_formats[i][0];
 | 
			
		||||
    ctx->pix_fmt      = vdpau_formats[i][1];
 | 
			
		||||
 | 
			
		||||
    if (vdpau_api_ver == 1) {
 | 
			
		||||
    vdpau_ctx = av_vdpau_alloc_context();
 | 
			
		||||
    if (!vdpau_ctx)
 | 
			
		||||
        goto fail;
 | 
			
		||||
    vdpau_ctx->render = ctx->decoder_render;
 | 
			
		||||
 | 
			
		||||
    s->hwaccel_context = vdpau_ctx;
 | 
			
		||||
    } else
 | 
			
		||||
    if (av_vdpau_bind_context(s, ctx->device, ctx->get_proc_address, 0))
 | 
			
		||||
        goto fail;
 | 
			
		||||
 | 
			
		||||
    ctx->get_information_string(&vendor);
 | 
			
		||||
    av_log(NULL, AV_LOG_VERBOSE, "Using VDPAU -- %s -- on X11 display %s, "
 | 
			
		||||
@@ -301,7 +291,7 @@ fail:
 | 
			
		||||
    return AVERROR(EINVAL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int vdpau_old_init(AVCodecContext *s)
 | 
			
		||||
int vdpau_init(AVCodecContext *s)
 | 
			
		||||
{
 | 
			
		||||
    InputStream *ist = s->opaque;
 | 
			
		||||
    int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
 | 
			
		||||
@@ -343,22 +333,3 @@ static int vdpau_old_init(AVCodecContext *s)
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int vdpau_init(AVCodecContext *s)
 | 
			
		||||
{
 | 
			
		||||
    InputStream *ist = s->opaque;
 | 
			
		||||
 | 
			
		||||
    if (vdpau_api_ver == 1)
 | 
			
		||||
        return vdpau_old_init(s);
 | 
			
		||||
 | 
			
		||||
    if (!ist->hwaccel_ctx) {
 | 
			
		||||
        int ret = vdpau_alloc(s);
 | 
			
		||||
        if (ret < 0)
 | 
			
		||||
            return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ist->hwaccel_get_buffer    = vdpau_get_buffer;
 | 
			
		||||
    ist->hwaccel_retrieve_data = vdpau_retrieve_data;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										180
									
								
								ffprobe.c
									
									
									
									
									
								
							
							
						
						
									
										180
									
								
								ffprobe.c
									
									
									
									
									
								
							@@ -33,7 +33,6 @@
 | 
			
		||||
#include "libavutil/avassert.h"
 | 
			
		||||
#include "libavutil/avstring.h"
 | 
			
		||||
#include "libavutil/bprint.h"
 | 
			
		||||
#include "libavutil/hash.h"
 | 
			
		||||
#include "libavutil/opt.h"
 | 
			
		||||
#include "libavutil/pixdesc.h"
 | 
			
		||||
#include "libavutil/dict.h"
 | 
			
		||||
@@ -66,9 +65,6 @@ static int do_show_stream_disposition = 0;
 | 
			
		||||
static int do_show_data    = 0;
 | 
			
		||||
static int do_show_program_version  = 0;
 | 
			
		||||
static int do_show_library_versions = 0;
 | 
			
		||||
static int do_show_pixel_formats = 0;
 | 
			
		||||
static int do_show_pixel_format_flags = 0;
 | 
			
		||||
static int do_show_pixel_format_components = 0;
 | 
			
		||||
 | 
			
		||||
static int do_show_chapter_tags = 0;
 | 
			
		||||
static int do_show_format_tags = 0;
 | 
			
		||||
@@ -84,7 +80,6 @@ static int show_private_data            = 1;
 | 
			
		||||
 | 
			
		||||
static char *print_format;
 | 
			
		||||
static char *stream_specifier;
 | 
			
		||||
static char *show_data_hash;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    int id;             ///< identifier
 | 
			
		||||
@@ -128,18 +123,11 @@ typedef enum {
 | 
			
		||||
    SECTION_ID_FRAME,
 | 
			
		||||
    SECTION_ID_FRAMES,
 | 
			
		||||
    SECTION_ID_FRAME_TAGS,
 | 
			
		||||
    SECTION_ID_FRAME_SIDE_DATA_LIST,
 | 
			
		||||
    SECTION_ID_FRAME_SIDE_DATA,
 | 
			
		||||
    SECTION_ID_LIBRARY_VERSION,
 | 
			
		||||
    SECTION_ID_LIBRARY_VERSIONS,
 | 
			
		||||
    SECTION_ID_PACKET,
 | 
			
		||||
    SECTION_ID_PACKETS,
 | 
			
		||||
    SECTION_ID_PACKETS_AND_FRAMES,
 | 
			
		||||
    SECTION_ID_PIXEL_FORMAT,
 | 
			
		||||
    SECTION_ID_PIXEL_FORMAT_FLAGS,
 | 
			
		||||
    SECTION_ID_PIXEL_FORMAT_COMPONENT,
 | 
			
		||||
    SECTION_ID_PIXEL_FORMAT_COMPONENTS,
 | 
			
		||||
    SECTION_ID_PIXEL_FORMATS,
 | 
			
		||||
    SECTION_ID_PROGRAM_STREAM_DISPOSITION,
 | 
			
		||||
    SECTION_ID_PROGRAM_STREAM_TAGS,
 | 
			
		||||
    SECTION_ID_PROGRAM,
 | 
			
		||||
@@ -164,20 +152,13 @@ static struct section sections[] = {
 | 
			
		||||
    [SECTION_ID_FORMAT] =             { SECTION_ID_FORMAT, "format", 0, { SECTION_ID_FORMAT_TAGS, -1 } },
 | 
			
		||||
    [SECTION_ID_FORMAT_TAGS] =        { SECTION_ID_FORMAT_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "format_tags" },
 | 
			
		||||
    [SECTION_ID_FRAMES] =             { SECTION_ID_FRAMES, "frames", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME, SECTION_ID_SUBTITLE, -1 } },
 | 
			
		||||
    [SECTION_ID_FRAME] =              { SECTION_ID_FRAME, "frame", 0, { SECTION_ID_FRAME_TAGS, SECTION_ID_FRAME_SIDE_DATA_LIST, -1 } },
 | 
			
		||||
    [SECTION_ID_FRAME] =              { SECTION_ID_FRAME, "frame", 0, { SECTION_ID_FRAME_TAGS, -1 } },
 | 
			
		||||
    [SECTION_ID_FRAME_TAGS] =         { SECTION_ID_FRAME_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "frame_tags" },
 | 
			
		||||
    [SECTION_ID_FRAME_SIDE_DATA_LIST] ={ SECTION_ID_FRAME_SIDE_DATA_LIST, "side_data_list", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME_SIDE_DATA, -1 } },
 | 
			
		||||
    [SECTION_ID_FRAME_SIDE_DATA] =     { SECTION_ID_FRAME_SIDE_DATA, "side_data", 0, { -1 } },
 | 
			
		||||
    [SECTION_ID_LIBRARY_VERSIONS] =   { SECTION_ID_LIBRARY_VERSIONS, "library_versions", SECTION_FLAG_IS_ARRAY, { SECTION_ID_LIBRARY_VERSION, -1 } },
 | 
			
		||||
    [SECTION_ID_LIBRARY_VERSION] =    { SECTION_ID_LIBRARY_VERSION, "library_version", 0, { -1 } },
 | 
			
		||||
    [SECTION_ID_PACKETS] =            { SECTION_ID_PACKETS, "packets", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PACKET, -1} },
 | 
			
		||||
    [SECTION_ID_PACKETS_AND_FRAMES] = { SECTION_ID_PACKETS_AND_FRAMES, "packets_and_frames", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PACKET, -1} },
 | 
			
		||||
    [SECTION_ID_PACKET] =             { SECTION_ID_PACKET, "packet", 0, { -1 } },
 | 
			
		||||
    [SECTION_ID_PIXEL_FORMATS] =      { SECTION_ID_PIXEL_FORMATS, "pixel_formats", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PIXEL_FORMAT, -1 } },
 | 
			
		||||
    [SECTION_ID_PIXEL_FORMAT] =       { SECTION_ID_PIXEL_FORMAT, "pixel_format", 0, { SECTION_ID_PIXEL_FORMAT_FLAGS, SECTION_ID_PIXEL_FORMAT_COMPONENTS, -1 } },
 | 
			
		||||
    [SECTION_ID_PIXEL_FORMAT_FLAGS] = { SECTION_ID_PIXEL_FORMAT_FLAGS, "flags", 0, { -1 }, .unique_name = "pixel_format_flags" },
 | 
			
		||||
    [SECTION_ID_PIXEL_FORMAT_COMPONENTS] = { SECTION_ID_PIXEL_FORMAT_COMPONENTS, "components", SECTION_FLAG_IS_ARRAY, {SECTION_ID_PIXEL_FORMAT_COMPONENT, -1 }, .unique_name = "pixel_format_components" },
 | 
			
		||||
    [SECTION_ID_PIXEL_FORMAT_COMPONENT]  = { SECTION_ID_PIXEL_FORMAT_COMPONENT, "component", 0, { -1 } },
 | 
			
		||||
    [SECTION_ID_PROGRAM_STREAM_DISPOSITION] = { SECTION_ID_PROGRAM_STREAM_DISPOSITION, "disposition", 0, { -1 }, .unique_name = "program_stream_disposition" },
 | 
			
		||||
    [SECTION_ID_PROGRAM_STREAM_TAGS] =        { SECTION_ID_PROGRAM_STREAM_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "program_stream_tags" },
 | 
			
		||||
    [SECTION_ID_PROGRAM] =                    { SECTION_ID_PROGRAM, "program", 0, { SECTION_ID_PROGRAM_TAGS, SECTION_ID_PROGRAM_STREAMS, -1 } },
 | 
			
		||||
@@ -188,8 +169,7 @@ static struct section sections[] = {
 | 
			
		||||
    [SECTION_ID_PROGRAMS] =                   { SECTION_ID_PROGRAMS, "programs", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PROGRAM, -1 } },
 | 
			
		||||
    [SECTION_ID_ROOT] =               { SECTION_ID_ROOT, "root", SECTION_FLAG_IS_WRAPPER,
 | 
			
		||||
                                        { SECTION_ID_CHAPTERS, SECTION_ID_FORMAT, SECTION_ID_FRAMES, SECTION_ID_PROGRAMS, SECTION_ID_STREAMS,
 | 
			
		||||
                                          SECTION_ID_PACKETS, SECTION_ID_ERROR, SECTION_ID_PROGRAM_VERSION, SECTION_ID_LIBRARY_VERSIONS,
 | 
			
		||||
                                          SECTION_ID_PIXEL_FORMATS, -1} },
 | 
			
		||||
                                          SECTION_ID_PACKETS, SECTION_ID_ERROR, SECTION_ID_PROGRAM_VERSION, SECTION_ID_LIBRARY_VERSIONS, -1} },
 | 
			
		||||
    [SECTION_ID_STREAMS] =            { SECTION_ID_STREAMS, "streams", SECTION_FLAG_IS_ARRAY, { SECTION_ID_STREAM, -1 } },
 | 
			
		||||
    [SECTION_ID_STREAM] =             { SECTION_ID_STREAM, "stream", 0, { SECTION_ID_STREAM_DISPOSITION, SECTION_ID_STREAM_TAGS, -1 } },
 | 
			
		||||
    [SECTION_ID_STREAM_DISPOSITION] = { SECTION_ID_STREAM_DISPOSITION, "disposition", 0, { -1 }, .unique_name = "stream_disposition" },
 | 
			
		||||
@@ -203,8 +183,6 @@ static const OptionDef *options;
 | 
			
		||||
static const char *input_filename;
 | 
			
		||||
static AVInputFormat *iformat = NULL;
 | 
			
		||||
 | 
			
		||||
static struct AVHashContext *hash;
 | 
			
		||||
 | 
			
		||||
static const char *const binary_unit_prefixes [] = { "", "Ki", "Mi", "Gi", "Ti", "Pi" };
 | 
			
		||||
static const char *const decimal_unit_prefixes[] = { "", "K" , "M" , "G" , "T" , "P"  };
 | 
			
		||||
 | 
			
		||||
@@ -703,21 +681,6 @@ static void writer_print_data(WriterContext *wctx, const char *name,
 | 
			
		||||
    av_bprint_finalize(&bp, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void writer_print_data_hash(WriterContext *wctx, const char *name,
 | 
			
		||||
                                   uint8_t *data, int size)
 | 
			
		||||
{
 | 
			
		||||
    char *p, buf[AV_HASH_MAX_SIZE * 2 + 64] = { 0 };
 | 
			
		||||
 | 
			
		||||
    if (!hash)
 | 
			
		||||
        return;
 | 
			
		||||
    av_hash_init(hash);
 | 
			
		||||
    av_hash_update(hash, data, size);
 | 
			
		||||
    snprintf(buf, sizeof(buf), "%s:", av_hash_get_name(hash));
 | 
			
		||||
    p = buf + strlen(buf);
 | 
			
		||||
    av_hash_final_hex(hash, p, buf + sizeof(buf) - p);
 | 
			
		||||
    writer_print_string(wctx, name, buf, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define MAX_REGISTERED_WRITERS_NB 64
 | 
			
		||||
 | 
			
		||||
static const Writer *registered_writers[MAX_REGISTERED_WRITERS_NB + 1];
 | 
			
		||||
@@ -1725,7 +1688,6 @@ static void show_packet(WriterContext *w, AVFormatContext *fmt_ctx, AVPacket *pk
 | 
			
		||||
    print_fmt("flags", "%c",      pkt->flags & AV_PKT_FLAG_KEY ? 'K' : '_');
 | 
			
		||||
    if (do_show_data)
 | 
			
		||||
        writer_print_data(w, "data", pkt->data, pkt->size);
 | 
			
		||||
    writer_print_data_hash(w, "data_hash", pkt->data, pkt->size);
 | 
			
		||||
    writer_print_section_footer(w);
 | 
			
		||||
 | 
			
		||||
    av_bprint_finalize(&pbuf, NULL);
 | 
			
		||||
@@ -1760,7 +1722,6 @@ static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream,
 | 
			
		||||
{
 | 
			
		||||
    AVBPrint pbuf;
 | 
			
		||||
    const char *s;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    av_bprint_init(&pbuf, 1, AV_BPRINT_SIZE_UNLIMITED);
 | 
			
		||||
 | 
			
		||||
@@ -1823,20 +1784,6 @@ static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream,
 | 
			
		||||
    }
 | 
			
		||||
    if (do_show_frame_tags)
 | 
			
		||||
        show_tags(w, av_frame_get_metadata(frame), SECTION_ID_FRAME_TAGS);
 | 
			
		||||
    if (frame->nb_side_data) {
 | 
			
		||||
        writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_LIST);
 | 
			
		||||
        for (i = 0; i < frame->nb_side_data; i++) {
 | 
			
		||||
            AVFrameSideData *sd = frame->side_data[i];
 | 
			
		||||
            const char *name;
 | 
			
		||||
 | 
			
		||||
            writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA);
 | 
			
		||||
            name = av_frame_side_data_name(sd->type);
 | 
			
		||||
            print_str("side_data_type", name ? name : "unknown");
 | 
			
		||||
            print_int("side_data_size", sd->size);
 | 
			
		||||
            writer_print_section_footer(w);
 | 
			
		||||
        }
 | 
			
		||||
        writer_print_section_footer(w);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    writer_print_section_footer(w);
 | 
			
		||||
 | 
			
		||||
@@ -2044,7 +1991,6 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
 | 
			
		||||
    const char *s;
 | 
			
		||||
    AVRational sar, dar;
 | 
			
		||||
    AVBPrint pbuf;
 | 
			
		||||
    const AVCodecDescriptor *cd;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
 | 
			
		||||
    av_bprint_init(&pbuf, 1, AV_BPRINT_SIZE_UNLIMITED);
 | 
			
		||||
@@ -2062,12 +2008,6 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
 | 
			
		||||
                if (dec->long_name) print_str    ("codec_long_name", dec->long_name);
 | 
			
		||||
                else                print_str_opt("codec_long_name", "unknown");
 | 
			
		||||
            }
 | 
			
		||||
        } else if ((cd = avcodec_descriptor_get(stream->codec->codec_id))) {
 | 
			
		||||
            print_str_opt("codec_name", cd->name);
 | 
			
		||||
            if (!do_bitexact) {
 | 
			
		||||
                print_str_opt("codec_long_name",
 | 
			
		||||
                              cd->long_name ? cd->long_name : "unknown");
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            print_str_opt("codec_name", "unknown");
 | 
			
		||||
            if (!do_bitexact) {
 | 
			
		||||
@@ -2111,29 +2051,6 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
 | 
			
		||||
            if (s) print_str    ("pix_fmt", s);
 | 
			
		||||
            else   print_str_opt("pix_fmt", "unknown");
 | 
			
		||||
            print_int("level",   dec_ctx->level);
 | 
			
		||||
            if (dec_ctx->color_range != AVCOL_RANGE_UNSPECIFIED)
 | 
			
		||||
                print_str    ("color_range", av_color_range_name(dec_ctx->color_range));
 | 
			
		||||
            else
 | 
			
		||||
                print_str_opt("color_range", "N/A");
 | 
			
		||||
            s = av_get_colorspace_name(dec_ctx->colorspace);
 | 
			
		||||
            if (s) print_str    ("color_space", s);
 | 
			
		||||
            else   print_str_opt("color_space", "unknown");
 | 
			
		||||
 | 
			
		||||
            if (dec_ctx->color_trc != AVCOL_TRC_UNSPECIFIED)
 | 
			
		||||
                print_str("color_transfer", av_color_transfer_name(dec_ctx->color_trc));
 | 
			
		||||
            else
 | 
			
		||||
                print_str_opt("color_transfer", av_color_transfer_name(dec_ctx->color_trc));
 | 
			
		||||
 | 
			
		||||
            if (dec_ctx->color_primaries != AVCOL_PRI_UNSPECIFIED)
 | 
			
		||||
                print_str("color_primaries", av_color_primaries_name(dec_ctx->color_primaries));
 | 
			
		||||
            else
 | 
			
		||||
                print_str_opt("color_primaries", av_color_primaries_name(dec_ctx->color_primaries));
 | 
			
		||||
 | 
			
		||||
            if (dec_ctx->chroma_sample_location != AVCHROMA_LOC_UNSPECIFIED)
 | 
			
		||||
                print_str("chroma_location", av_chroma_location_name(dec_ctx->chroma_sample_location));
 | 
			
		||||
            else
 | 
			
		||||
                print_str_opt("chroma_location", av_chroma_location_name(dec_ctx->chroma_sample_location));
 | 
			
		||||
 | 
			
		||||
            if (dec_ctx->timecode_frame_start >= 0) {
 | 
			
		||||
                char tcbuf[AV_TIMECODE_STR_SIZE];
 | 
			
		||||
                av_timecode_make_mpeg_tc_string(tcbuf, dec_ctx->timecode_frame_start);
 | 
			
		||||
@@ -2198,10 +2115,6 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
 | 
			
		||||
    print_time("duration",    stream->duration, &stream->time_base);
 | 
			
		||||
    if (dec_ctx->bit_rate > 0) print_val    ("bit_rate", dec_ctx->bit_rate, unit_bit_per_second_str);
 | 
			
		||||
    else                       print_str_opt("bit_rate", "N/A");
 | 
			
		||||
    if (dec_ctx->rc_max_rate > 0) print_val ("max_bit_rate", dec_ctx->rc_max_rate, unit_bit_per_second_str);
 | 
			
		||||
    else                       print_str_opt("max_bit_rate", "N/A");
 | 
			
		||||
    if (dec_ctx->bits_per_raw_sample > 0) print_fmt("bits_per_raw_sample", "%d", dec_ctx->bits_per_raw_sample);
 | 
			
		||||
    else                       print_str_opt("bits_per_raw_sample", "N/A");
 | 
			
		||||
    if (stream->nb_frames) print_fmt    ("nb_frames", "%"PRId64, stream->nb_frames);
 | 
			
		||||
    else                   print_str_opt("nb_frames", "N/A");
 | 
			
		||||
    if (nb_streams_frames[stream_idx])  print_fmt    ("nb_read_frames", "%"PRIu64, nb_streams_frames[stream_idx]);
 | 
			
		||||
@@ -2211,8 +2124,6 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
 | 
			
		||||
    if (do_show_data)
 | 
			
		||||
        writer_print_data(w, "extradata", dec_ctx->extradata,
 | 
			
		||||
                                          dec_ctx->extradata_size);
 | 
			
		||||
    writer_print_data_hash(w, "extradata_hash", dec_ctx->extradata,
 | 
			
		||||
                                                dec_ctx->extradata_size);
 | 
			
		||||
 | 
			
		||||
    /* Print disposition information */
 | 
			
		||||
#define PRINT_DISPOSITION(flagname, name) do {                                \
 | 
			
		||||
@@ -2386,19 +2297,12 @@ static int open_input_file(AVFormatContext **fmt_ctx_ptr, const char *filename)
 | 
			
		||||
    AVFormatContext *fmt_ctx = NULL;
 | 
			
		||||
    AVDictionaryEntry *t;
 | 
			
		||||
    AVDictionary **opts;
 | 
			
		||||
    int scan_all_pmts_set = 0;
 | 
			
		||||
 | 
			
		||||
    if (!av_dict_get(format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
 | 
			
		||||
        av_dict_set(&format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
 | 
			
		||||
        scan_all_pmts_set = 1;
 | 
			
		||||
    }
 | 
			
		||||
    if ((err = avformat_open_input(&fmt_ctx, filename,
 | 
			
		||||
                                   iformat, &format_opts)) < 0) {
 | 
			
		||||
        print_error(filename, err);
 | 
			
		||||
        return err;
 | 
			
		||||
    }
 | 
			
		||||
    if (scan_all_pmts_set)
 | 
			
		||||
        av_dict_set(&format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
 | 
			
		||||
    if ((t = av_dict_get(format_opts, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
 | 
			
		||||
        return AVERROR_OPTION_NOT_FOUND;
 | 
			
		||||
@@ -2594,58 +2498,6 @@ static void ffprobe_show_library_versions(WriterContext *w)
 | 
			
		||||
    writer_print_section_footer(w);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define PRINT_PIX_FMT_FLAG(flagname, name)                                \
 | 
			
		||||
    do {                                                                  \
 | 
			
		||||
        print_int(name, !!(pixdesc->flags & AV_PIX_FMT_FLAG_##flagname)); \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
static void ffprobe_show_pixel_formats(WriterContext *w)
 | 
			
		||||
{
 | 
			
		||||
    const AVPixFmtDescriptor *pixdesc = NULL;
 | 
			
		||||
    int i, n;
 | 
			
		||||
 | 
			
		||||
    writer_print_section_header(w, SECTION_ID_PIXEL_FORMATS);
 | 
			
		||||
    while (pixdesc = av_pix_fmt_desc_next(pixdesc)) {
 | 
			
		||||
        writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT);
 | 
			
		||||
        print_str("name", pixdesc->name);
 | 
			
		||||
        print_int("nb_components", pixdesc->nb_components);
 | 
			
		||||
        if ((pixdesc->nb_components >= 3) && !(pixdesc->flags & AV_PIX_FMT_FLAG_RGB)) {
 | 
			
		||||
            print_int    ("log2_chroma_w", pixdesc->log2_chroma_w);
 | 
			
		||||
            print_int    ("log2_chroma_h", pixdesc->log2_chroma_h);
 | 
			
		||||
        } else {
 | 
			
		||||
            print_str_opt("log2_chroma_w", "N/A");
 | 
			
		||||
            print_str_opt("log2_chroma_h", "N/A");
 | 
			
		||||
        }
 | 
			
		||||
        n = av_get_bits_per_pixel(pixdesc);
 | 
			
		||||
        if (n) print_int    ("bits_per_pixel", n);
 | 
			
		||||
        else   print_str_opt("bits_per_pixel", "N/A");
 | 
			
		||||
        if (do_show_pixel_format_flags) {
 | 
			
		||||
            writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT_FLAGS);
 | 
			
		||||
            PRINT_PIX_FMT_FLAG(BE,        "big_endian");
 | 
			
		||||
            PRINT_PIX_FMT_FLAG(PAL,       "palette");
 | 
			
		||||
            PRINT_PIX_FMT_FLAG(BITSTREAM, "bitstream");
 | 
			
		||||
            PRINT_PIX_FMT_FLAG(HWACCEL,   "hwaccel");
 | 
			
		||||
            PRINT_PIX_FMT_FLAG(PLANAR,    "planar");
 | 
			
		||||
            PRINT_PIX_FMT_FLAG(RGB,       "rgb");
 | 
			
		||||
            PRINT_PIX_FMT_FLAG(PSEUDOPAL, "pseudopal");
 | 
			
		||||
            PRINT_PIX_FMT_FLAG(ALPHA,     "alpha");
 | 
			
		||||
            writer_print_section_footer(w);
 | 
			
		||||
        }
 | 
			
		||||
        if (do_show_pixel_format_components && (pixdesc->nb_components > 0)) {
 | 
			
		||||
            writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT_COMPONENTS);
 | 
			
		||||
            for (i = 0; i < pixdesc->nb_components; i++) {
 | 
			
		||||
                writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT_COMPONENT);
 | 
			
		||||
                print_int("index", i + 1);
 | 
			
		||||
                print_int("bit_depth", pixdesc->comp[i].depth_minus1 + 1);
 | 
			
		||||
                writer_print_section_footer(w);
 | 
			
		||||
            }
 | 
			
		||||
            writer_print_section_footer(w);
 | 
			
		||||
        }
 | 
			
		||||
        writer_print_section_footer(w);
 | 
			
		||||
    }
 | 
			
		||||
    writer_print_section_footer(w);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int opt_format(void *optctx, const char *opt, const char *arg)
 | 
			
		||||
{
 | 
			
		||||
    iformat = av_find_input_format(arg);
 | 
			
		||||
@@ -2881,7 +2733,7 @@ static int parse_read_intervals(const char *intervals_spec)
 | 
			
		||||
            n++;
 | 
			
		||||
    n++;
 | 
			
		||||
 | 
			
		||||
    read_intervals = av_malloc_array(n, sizeof(*read_intervals));
 | 
			
		||||
    read_intervals = av_malloc(n * sizeof(*read_intervals));
 | 
			
		||||
    if (!read_intervals) {
 | 
			
		||||
        ret = AVERROR(ENOMEM);
 | 
			
		||||
        goto end;
 | 
			
		||||
@@ -2979,7 +2831,6 @@ DEFINE_OPT_SHOW_SECTION(format,           FORMAT);
 | 
			
		||||
DEFINE_OPT_SHOW_SECTION(frames,           FRAMES);
 | 
			
		||||
DEFINE_OPT_SHOW_SECTION(library_versions, LIBRARY_VERSIONS);
 | 
			
		||||
DEFINE_OPT_SHOW_SECTION(packets,          PACKETS);
 | 
			
		||||
DEFINE_OPT_SHOW_SECTION(pixel_formats,    PIXEL_FORMATS);
 | 
			
		||||
DEFINE_OPT_SHOW_SECTION(program_version,  PROGRAM_VERSION);
 | 
			
		||||
DEFINE_OPT_SHOW_SECTION(streams,          STREAMS);
 | 
			
		||||
DEFINE_OPT_SHOW_SECTION(programs,         PROGRAMS);
 | 
			
		||||
@@ -3001,7 +2852,6 @@ static const OptionDef real_options[] = {
 | 
			
		||||
    { "select_streams", OPT_STRING | HAS_ARG, {(void*)&stream_specifier}, "select the specified streams", "stream_specifier" },
 | 
			
		||||
    { "sections", OPT_EXIT, {.func_arg = opt_sections}, "print sections structure and section information, and exit" },
 | 
			
		||||
    { "show_data",    OPT_BOOL, {(void*)&do_show_data}, "show packets data" },
 | 
			
		||||
    { "show_data_hash", OPT_STRING | HAS_ARG, {(void*)&show_data_hash}, "show packets data hash" },
 | 
			
		||||
    { "show_error",   0, {(void*)&opt_show_error},  "show probing error" },
 | 
			
		||||
    { "show_format",  0, {(void*)&opt_show_format}, "show format/container info" },
 | 
			
		||||
    { "show_frames",  0, {(void*)&opt_show_frames}, "show frames info" },
 | 
			
		||||
@@ -3018,7 +2868,6 @@ static const OptionDef real_options[] = {
 | 
			
		||||
    { "show_program_version",  0, {(void*)&opt_show_program_version},  "show ffprobe version" },
 | 
			
		||||
    { "show_library_versions", 0, {(void*)&opt_show_library_versions}, "show library versions" },
 | 
			
		||||
    { "show_versions",         0, {(void*)&opt_show_versions}, "show program and library versions" },
 | 
			
		||||
    { "show_pixel_formats", 0, {(void*)&opt_show_pixel_formats}, "show pixel format descriptions" },
 | 
			
		||||
    { "show_private_data", OPT_BOOL, {(void*)&show_private_data}, "show private data" },
 | 
			
		||||
    { "private",           OPT_BOOL, {(void*)&show_private_data}, "same as show_private_data" },
 | 
			
		||||
    { "bitexact", OPT_BOOL, {&do_bitexact}, "force bitexact output" },
 | 
			
		||||
@@ -3075,9 +2924,6 @@ int main(int argc, char **argv)
 | 
			
		||||
    SET_DO_SHOW(FRAMES, frames);
 | 
			
		||||
    SET_DO_SHOW(LIBRARY_VERSIONS, library_versions);
 | 
			
		||||
    SET_DO_SHOW(PACKETS, packets);
 | 
			
		||||
    SET_DO_SHOW(PIXEL_FORMATS, pixel_formats);
 | 
			
		||||
    SET_DO_SHOW(PIXEL_FORMAT_FLAGS, pixel_format_flags);
 | 
			
		||||
    SET_DO_SHOW(PIXEL_FORMAT_COMPONENTS, pixel_format_components);
 | 
			
		||||
    SET_DO_SHOW(PROGRAM_VERSION, program_version);
 | 
			
		||||
    SET_DO_SHOW(PROGRAMS, programs);
 | 
			
		||||
    SET_DO_SHOW(STREAMS, streams);
 | 
			
		||||
@@ -3109,21 +2955,6 @@ int main(int argc, char **argv)
 | 
			
		||||
    w_name = av_strtok(print_format, "=", &buf);
 | 
			
		||||
    w_args = buf;
 | 
			
		||||
 | 
			
		||||
    if (show_data_hash) {
 | 
			
		||||
        if ((ret = av_hash_alloc(&hash, show_data_hash)) < 0) {
 | 
			
		||||
            if (ret == AVERROR(EINVAL)) {
 | 
			
		||||
                const char *n;
 | 
			
		||||
                av_log(NULL, AV_LOG_ERROR,
 | 
			
		||||
                       "Unknown hash algorithm '%s'\nKnown algorithms:",
 | 
			
		||||
                       show_data_hash);
 | 
			
		||||
                for (i = 0; (n = av_hash_names(i)); i++)
 | 
			
		||||
                    av_log(NULL, AV_LOG_ERROR, " %s", n);
 | 
			
		||||
                av_log(NULL, AV_LOG_ERROR, "\n");
 | 
			
		||||
            }
 | 
			
		||||
            goto end;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    w = writer_get_by_name(w_name);
 | 
			
		||||
    if (!w) {
 | 
			
		||||
        av_log(NULL, AV_LOG_ERROR, "Unknown output format with name '%s'\n", w_name);
 | 
			
		||||
@@ -3142,12 +2973,10 @@ int main(int argc, char **argv)
 | 
			
		||||
            ffprobe_show_program_version(wctx);
 | 
			
		||||
        if (do_show_library_versions)
 | 
			
		||||
            ffprobe_show_library_versions(wctx);
 | 
			
		||||
        if (do_show_pixel_formats)
 | 
			
		||||
            ffprobe_show_pixel_formats(wctx);
 | 
			
		||||
 | 
			
		||||
        if (!input_filename &&
 | 
			
		||||
            ((do_show_format || do_show_programs || do_show_streams || do_show_chapters || do_show_packets || do_show_error) ||
 | 
			
		||||
             (!do_show_program_version && !do_show_library_versions && !do_show_pixel_formats))) {
 | 
			
		||||
             (!do_show_program_version && !do_show_library_versions))) {
 | 
			
		||||
            show_usage();
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "You have to specify one input file.\n");
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Use -h to get full help or, even better, run 'man %s'.\n", program_name);
 | 
			
		||||
@@ -3165,7 +2994,6 @@ int main(int argc, char **argv)
 | 
			
		||||
end:
 | 
			
		||||
    av_freep(&print_format);
 | 
			
		||||
    av_freep(&read_intervals);
 | 
			
		||||
    av_hash_freep(&hash);
 | 
			
		||||
 | 
			
		||||
    uninit_opts();
 | 
			
		||||
    for (i = 0; i < FF_ARRAY_ELEMS(sections); i++)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1402
									
								
								ffserver.c
									
									
									
									
									
								
							
							
						
						
									
										1402
									
								
								ffserver.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1260
									
								
								ffserver_config.c
									
									
									
									
									
								
							
							
						
						
									
										1260
									
								
								ffserver_config.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,133 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * FFmpeg is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with FFmpeg; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef FFSERVER_CONFIG_H
 | 
			
		||||
#define FFSERVER_CONFIG_H
 | 
			
		||||
 | 
			
		||||
#include "libavutil/dict.h"
 | 
			
		||||
#include "libavformat/avformat.h"
 | 
			
		||||
#include "libavformat/network.h"
 | 
			
		||||
 | 
			
		||||
#define FFSERVER_MAX_STREAMS 20
 | 
			
		||||
 | 
			
		||||
/* each generated stream is described here */
 | 
			
		||||
enum FFServerStreamType {
 | 
			
		||||
    STREAM_TYPE_LIVE,
 | 
			
		||||
    STREAM_TYPE_STATUS,
 | 
			
		||||
    STREAM_TYPE_REDIRECT,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum FFServerIPAddressAction {
 | 
			
		||||
    IP_ALLOW = 1,
 | 
			
		||||
    IP_DENY,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct FFServerIPAddressACL {
 | 
			
		||||
    struct FFServerIPAddressACL *next;
 | 
			
		||||
    enum FFServerIPAddressAction action;
 | 
			
		||||
    /* These are in host order */
 | 
			
		||||
    struct in_addr first;
 | 
			
		||||
    struct in_addr last;
 | 
			
		||||
} FFServerIPAddressACL;
 | 
			
		||||
 | 
			
		||||
/* description of each stream of the ffserver.conf file */
 | 
			
		||||
typedef struct FFServerStream {
 | 
			
		||||
    enum FFServerStreamType stream_type;
 | 
			
		||||
    char filename[1024];          /* stream filename */
 | 
			
		||||
    struct FFServerStream *feed;  /* feed we are using (can be null if coming from file) */
 | 
			
		||||
    AVDictionary *in_opts;        /* input parameters */
 | 
			
		||||
    AVDictionary *metadata;       /* metadata to set on the stream */
 | 
			
		||||
    AVInputFormat *ifmt;          /* if non NULL, force input format */
 | 
			
		||||
    AVOutputFormat *fmt;
 | 
			
		||||
    FFServerIPAddressACL *acl;
 | 
			
		||||
    char dynamic_acl[1024];
 | 
			
		||||
    int nb_streams;
 | 
			
		||||
    int prebuffer;                /* Number of milliseconds early to start */
 | 
			
		||||
    int64_t max_time;             /* Number of milliseconds to run */
 | 
			
		||||
    int send_on_key;
 | 
			
		||||
    AVStream *streams[FFSERVER_MAX_STREAMS];
 | 
			
		||||
    int feed_streams[FFSERVER_MAX_STREAMS]; /* index of streams in the feed */
 | 
			
		||||
    char feed_filename[1024];     /* file name of the feed storage, or
 | 
			
		||||
                                     input file name for a stream */
 | 
			
		||||
    pid_t pid;                    /* Of ffmpeg process */
 | 
			
		||||
    time_t pid_start;             /* Of ffmpeg process */
 | 
			
		||||
    char **child_argv;
 | 
			
		||||
    struct FFServerStream *next;
 | 
			
		||||
    unsigned bandwidth;           /* bandwidth, in kbits/s */
 | 
			
		||||
    /* RTSP options */
 | 
			
		||||
    char *rtsp_option;
 | 
			
		||||
    /* multicast specific */
 | 
			
		||||
    int is_multicast;
 | 
			
		||||
    struct in_addr multicast_ip;
 | 
			
		||||
    int multicast_port;           /* first port used for multicast */
 | 
			
		||||
    int multicast_ttl;
 | 
			
		||||
    int loop;                     /* if true, send the stream in loops (only meaningful if file) */
 | 
			
		||||
 | 
			
		||||
    /* feed specific */
 | 
			
		||||
    int feed_opened;              /* true if someone is writing to the feed */
 | 
			
		||||
    int is_feed;                  /* true if it is a feed */
 | 
			
		||||
    int readonly;                 /* True if writing is prohibited to the file */
 | 
			
		||||
    int truncate;                 /* True if feeder connection truncate the feed file */
 | 
			
		||||
    int conns_served;
 | 
			
		||||
    int64_t bytes_served;
 | 
			
		||||
    int64_t feed_max_size;        /* maximum storage size, zero means unlimited */
 | 
			
		||||
    int64_t feed_write_index;     /* current write position in feed (it wraps around) */
 | 
			
		||||
    int64_t feed_size;            /* current size of feed */
 | 
			
		||||
    struct FFServerStream *next_feed;
 | 
			
		||||
} FFServerStream;
 | 
			
		||||
 | 
			
		||||
typedef struct FFServerConfig {
 | 
			
		||||
    char *filename;
 | 
			
		||||
    FFServerStream *first_feed;   /* contains only feeds */
 | 
			
		||||
    FFServerStream *first_stream; /* contains all streams, including feeds */
 | 
			
		||||
    unsigned int nb_max_http_connections;
 | 
			
		||||
    unsigned int nb_max_connections;
 | 
			
		||||
    uint64_t max_bandwidth;
 | 
			
		||||
    int debug;
 | 
			
		||||
    char logfilename[1024];
 | 
			
		||||
    struct sockaddr_in http_addr;
 | 
			
		||||
    struct sockaddr_in rtsp_addr;
 | 
			
		||||
    int errors;
 | 
			
		||||
    int warnings;
 | 
			
		||||
    int use_defaults;
 | 
			
		||||
    // Following variables MUST NOT be used outside configuration parsing code.
 | 
			
		||||
    enum AVCodecID guessed_audio_codec_id;
 | 
			
		||||
    enum AVCodecID guessed_video_codec_id;
 | 
			
		||||
    AVDictionary *video_opts;     /* AVOptions for video encoder */
 | 
			
		||||
    AVDictionary *audio_opts;     /* AVOptions for audio encoder */
 | 
			
		||||
    AVCodecContext *dummy_actx;   /* Used internally to test audio AVOptions. */
 | 
			
		||||
    AVCodecContext *dummy_vctx;   /* Used internally to test video AVOptions. */
 | 
			
		||||
    int no_audio;
 | 
			
		||||
    int no_video;
 | 
			
		||||
    int line_num;
 | 
			
		||||
    int stream_use_defaults;
 | 
			
		||||
} FFServerConfig;
 | 
			
		||||
 | 
			
		||||
void ffserver_get_arg(char *buf, int buf_size, const char **pp);
 | 
			
		||||
 | 
			
		||||
void ffserver_parse_acl_row(FFServerStream *stream, FFServerStream* feed,
 | 
			
		||||
                            FFServerIPAddressACL *ext_acl,
 | 
			
		||||
                            const char *p, const char *filename, int line_num);
 | 
			
		||||
 | 
			
		||||
int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config);
 | 
			
		||||
 | 
			
		||||
void ffserver_free_child_args(void *argsp);
 | 
			
		||||
 | 
			
		||||
#endif /* FFSERVER_CONFIG_H */
 | 
			
		||||
@@ -38,15 +38,15 @@ static av_cold int zero12v_decode_init(AVCodecContext *avctx)
 | 
			
		||||
static int zero12v_decode_frame(AVCodecContext *avctx, void *data,
 | 
			
		||||
                                int *got_frame, AVPacket *avpkt)
 | 
			
		||||
{
 | 
			
		||||
    int line, ret;
 | 
			
		||||
    int line = 0, ret;
 | 
			
		||||
    const int width = avctx->width;
 | 
			
		||||
    AVFrame *pic = data;
 | 
			
		||||
    uint16_t *y, *u, *v;
 | 
			
		||||
    const uint8_t *line_end, *src = avpkt->data;
 | 
			
		||||
    int stride = avctx->width * 8 / 3;
 | 
			
		||||
 | 
			
		||||
    if (width <= 1 || avctx->height <= 0) {
 | 
			
		||||
        av_log(avctx, AV_LOG_ERROR, "Dimensions %dx%d not supported.\n", width, avctx->height);
 | 
			
		||||
    if (width == 1) {
 | 
			
		||||
        av_log(avctx, AV_LOG_ERROR, "Width 1 not supported.\n");
 | 
			
		||||
        return AVERROR_INVALIDDATA;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -67,45 +67,45 @@ static int zero12v_decode_frame(AVCodecContext *avctx, void *data,
 | 
			
		||||
    pic->pict_type = AV_PICTURE_TYPE_I;
 | 
			
		||||
    pic->key_frame = 1;
 | 
			
		||||
 | 
			
		||||
    y = (uint16_t *)pic->data[0];
 | 
			
		||||
    u = (uint16_t *)pic->data[1];
 | 
			
		||||
    v = (uint16_t *)pic->data[2];
 | 
			
		||||
    line_end = avpkt->data + stride;
 | 
			
		||||
    for (line = 0; line < avctx->height; line++) {
 | 
			
		||||
        uint16_t y_temp[6] = {0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000};
 | 
			
		||||
        uint16_t u_temp[3] = {0x8000, 0x8000, 0x8000};
 | 
			
		||||
        uint16_t v_temp[3] = {0x8000, 0x8000, 0x8000};
 | 
			
		||||
        int x;
 | 
			
		||||
        y = (uint16_t *)(pic->data[0] + line * pic->linesize[0]);
 | 
			
		||||
        u = (uint16_t *)(pic->data[1] + line * pic->linesize[1]);
 | 
			
		||||
        v = (uint16_t *)(pic->data[2] + line * pic->linesize[2]);
 | 
			
		||||
 | 
			
		||||
        for (x = 0; x < width; x += 6) {
 | 
			
		||||
            uint32_t t;
 | 
			
		||||
 | 
			
		||||
            if (width - x < 6 || line_end - src < 16) {
 | 
			
		||||
                y = y_temp;
 | 
			
		||||
                u = u_temp;
 | 
			
		||||
                v = v_temp;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (line_end - src < 4)
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            t = AV_RL32(src);
 | 
			
		||||
    while (line++ < avctx->height) {
 | 
			
		||||
        while (1) {
 | 
			
		||||
            uint32_t t = AV_RL32(src);
 | 
			
		||||
            src += 4;
 | 
			
		||||
            *u++ = t <<  6 & 0xFFC0;
 | 
			
		||||
            *y++ = t >>  4 & 0xFFC0;
 | 
			
		||||
            *v++ = t >> 14 & 0xFFC0;
 | 
			
		||||
 | 
			
		||||
            if (line_end - src < 4)
 | 
			
		||||
            if (src >= line_end - 1) {
 | 
			
		||||
                *y = 0x80;
 | 
			
		||||
                src++;
 | 
			
		||||
                line_end += stride;
 | 
			
		||||
                y = (uint16_t *)(pic->data[0] + line * pic->linesize[0]);
 | 
			
		||||
                u = (uint16_t *)(pic->data[1] + line * pic->linesize[1]);
 | 
			
		||||
                v = (uint16_t *)(pic->data[2] + line * pic->linesize[2]);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            t = AV_RL32(src);
 | 
			
		||||
            src += 4;
 | 
			
		||||
            *y++ = t <<  6 & 0xFFC0;
 | 
			
		||||
            *u++ = t >>  4 & 0xFFC0;
 | 
			
		||||
            *y++ = t >> 14 & 0xFFC0;
 | 
			
		||||
 | 
			
		||||
            if (line_end - src < 4)
 | 
			
		||||
            if (src >= line_end - 2) {
 | 
			
		||||
                if (!(width & 1)) {
 | 
			
		||||
                    *y = 0x80;
 | 
			
		||||
                    src += 2;
 | 
			
		||||
                }
 | 
			
		||||
                line_end += stride;
 | 
			
		||||
                y = (uint16_t *)(pic->data[0] + line * pic->linesize[0]);
 | 
			
		||||
                u = (uint16_t *)(pic->data[1] + line * pic->linesize[1]);
 | 
			
		||||
                v = (uint16_t *)(pic->data[2] + line * pic->linesize[2]);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            t = AV_RL32(src);
 | 
			
		||||
            src += 4;
 | 
			
		||||
@@ -113,8 +113,15 @@ static int zero12v_decode_frame(AVCodecContext *avctx, void *data,
 | 
			
		||||
            *y++ = t >>  4 & 0xFFC0;
 | 
			
		||||
            *u++ = t >> 14 & 0xFFC0;
 | 
			
		||||
 | 
			
		||||
            if (line_end - src < 4)
 | 
			
		||||
            if (src >= line_end - 1) {
 | 
			
		||||
                *y = 0x80;
 | 
			
		||||
                src++;
 | 
			
		||||
                line_end += stride;
 | 
			
		||||
                y = (uint16_t *)(pic->data[0] + line * pic->linesize[0]);
 | 
			
		||||
                u = (uint16_t *)(pic->data[1] + line * pic->linesize[1]);
 | 
			
		||||
                v = (uint16_t *)(pic->data[2] + line * pic->linesize[2]);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            t = AV_RL32(src);
 | 
			
		||||
            src += 4;
 | 
			
		||||
@@ -122,21 +129,18 @@ static int zero12v_decode_frame(AVCodecContext *avctx, void *data,
 | 
			
		||||
            *v++ = t >>  4 & 0xFFC0;
 | 
			
		||||
            *y++ = t >> 14 & 0xFFC0;
 | 
			
		||||
 | 
			
		||||
            if (width - x < 6)
 | 
			
		||||
            if (src >= line_end - 2) {
 | 
			
		||||
                if (width & 1) {
 | 
			
		||||
                    *y = 0x80;
 | 
			
		||||
                    src += 2;
 | 
			
		||||
                }
 | 
			
		||||
                line_end += stride;
 | 
			
		||||
                y = (uint16_t *)(pic->data[0] + line * pic->linesize[0]);
 | 
			
		||||
                u = (uint16_t *)(pic->data[1] + line * pic->linesize[1]);
 | 
			
		||||
                v = (uint16_t *)(pic->data[2] + line * pic->linesize[2]);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        if (x < width) {
 | 
			
		||||
            y = x   + (uint16_t *)(pic->data[0] + line * pic->linesize[0]);
 | 
			
		||||
            u = x/2 + (uint16_t *)(pic->data[1] + line * pic->linesize[1]);
 | 
			
		||||
            v = x/2 + (uint16_t *)(pic->data[2] + line * pic->linesize[2]);
 | 
			
		||||
            memcpy(y, y_temp, sizeof(*y) * (width - x));
 | 
			
		||||
            memcpy(u, u_temp, sizeof(*u) * (width - x + 1) / 2);
 | 
			
		||||
            memcpy(v, v_temp, sizeof(*v) * (width - x + 1) / 2);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        line_end += stride;
 | 
			
		||||
        src = line_end - stride;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    *got_frame = 1;
 | 
			
		||||
 
 | 
			
		||||
@@ -24,16 +24,13 @@
 | 
			
		||||
 * 4XM codec.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <inttypes.h>
 | 
			
		||||
 | 
			
		||||
#include "libavutil/avassert.h"
 | 
			
		||||
#include "libavutil/frame.h"
 | 
			
		||||
#include "libavutil/imgutils.h"
 | 
			
		||||
#include "libavutil/intreadwrite.h"
 | 
			
		||||
#include "avcodec.h"
 | 
			
		||||
#include "blockdsp.h"
 | 
			
		||||
#include "bswapdsp.h"
 | 
			
		||||
#include "bytestream.h"
 | 
			
		||||
#include "dsputil.h"
 | 
			
		||||
#include "get_bits.h"
 | 
			
		||||
#include "internal.h"
 | 
			
		||||
 | 
			
		||||
@@ -134,8 +131,7 @@ typedef struct CFrameBuffer {
 | 
			
		||||
 | 
			
		||||
typedef struct FourXContext {
 | 
			
		||||
    AVCodecContext *avctx;
 | 
			
		||||
    BlockDSPContext bdsp;
 | 
			
		||||
    BswapDSPContext bbdsp;
 | 
			
		||||
    DSPContext dsp;
 | 
			
		||||
    uint16_t *frame_buffer;
 | 
			
		||||
    uint16_t *last_frame_buffer;
 | 
			
		||||
    GetBitContext pre_gb;          ///< ac/dc prefix
 | 
			
		||||
@@ -339,25 +335,21 @@ static inline void mcdc(uint16_t *dst, const uint16_t *src, int log2w,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int decode_p_block(FourXContext *f, uint16_t *dst, const uint16_t *src,
 | 
			
		||||
static int decode_p_block(FourXContext *f, uint16_t *dst, uint16_t *src,
 | 
			
		||||
                          int log2w, int log2h, int stride)
 | 
			
		||||
{
 | 
			
		||||
    int index, h, code, ret, scale = 1;
 | 
			
		||||
    uint16_t *start, *end;
 | 
			
		||||
    const int index = size2index[log2h][log2w];
 | 
			
		||||
    const int h     = 1 << log2h;
 | 
			
		||||
    int code        = get_vlc2(&f->gb,
 | 
			
		||||
                               block_type_vlc[1 - (f->version > 1)][index].table,
 | 
			
		||||
                               BLOCK_TYPE_VLC_BITS, 1);
 | 
			
		||||
    uint16_t *start = f->last_frame_buffer;
 | 
			
		||||
    uint16_t *end   = start + stride * (f->avctx->height - h + 1) - (1 << log2w);
 | 
			
		||||
    int ret;
 | 
			
		||||
    int scale   = 1;
 | 
			
		||||
    unsigned dc = 0;
 | 
			
		||||
 | 
			
		||||
    av_assert0(log2w >= 0 && log2h >= 0);
 | 
			
		||||
 | 
			
		||||
    index = size2index[log2h][log2w];
 | 
			
		||||
    av_assert0(index >= 0);
 | 
			
		||||
 | 
			
		||||
    h     = 1 << log2h;
 | 
			
		||||
    code  = get_vlc2(&f->gb, block_type_vlc[1 - (f->version > 1)][index].table,
 | 
			
		||||
                     BLOCK_TYPE_VLC_BITS, 1);
 | 
			
		||||
    av_assert0(code >= 0 && code <= 6);
 | 
			
		||||
 | 
			
		||||
    start = f->last_frame_buffer;
 | 
			
		||||
    end   = start + stride * (f->avctx->height - h + 1) - (1 << log2w);
 | 
			
		||||
    av_assert0(code >= 0 && code <= 6 && log2w >= 0);
 | 
			
		||||
 | 
			
		||||
    if (code == 1) {
 | 
			
		||||
        log2h--;
 | 
			
		||||
@@ -464,7 +456,7 @@ static int decode_p_frame(FourXContext *f, const uint8_t *buf, int length)
 | 
			
		||||
                          bitstream_size);
 | 
			
		||||
    if (!f->bitstream_buffer)
 | 
			
		||||
        return AVERROR(ENOMEM);
 | 
			
		||||
    f->bbdsp.bswap_buf(f->bitstream_buffer, (const uint32_t *) (buf + extra),
 | 
			
		||||
    f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)(buf + extra),
 | 
			
		||||
                     bitstream_size / 4);
 | 
			
		||||
    init_get_bits(&f->gb, f->bitstream_buffer, 8 * bitstream_size);
 | 
			
		||||
 | 
			
		||||
@@ -598,7 +590,7 @@ static int decode_i_mb(FourXContext *f)
 | 
			
		||||
    int ret;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    f->bdsp.clear_blocks(f->block[0]);
 | 
			
		||||
    f->dsp.clear_blocks(f->block[0]);
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < 6; i++)
 | 
			
		||||
        if ((ret = decode_i_block(f, f->block[i])) < 0)
 | 
			
		||||
@@ -803,7 +795,7 @@ static int decode_i_frame(FourXContext *f, const uint8_t *buf, int length)
 | 
			
		||||
                          prestream_size);
 | 
			
		||||
    if (!f->bitstream_buffer)
 | 
			
		||||
        return AVERROR(ENOMEM);
 | 
			
		||||
    f->bbdsp.bswap_buf(f->bitstream_buffer, (const uint32_t *) prestream,
 | 
			
		||||
    f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)prestream,
 | 
			
		||||
                     prestream_size / 4);
 | 
			
		||||
    init_get_bits(&f->pre_gb, f->bitstream_buffer, 8 * prestream_size);
 | 
			
		||||
 | 
			
		||||
@@ -839,7 +831,7 @@ static int decode_frame(AVCodecContext *avctx, void *data,
 | 
			
		||||
    av_assert0(avctx->width % 16 == 0 && avctx->height % 16 == 0);
 | 
			
		||||
 | 
			
		||||
    if (buf_size < AV_RL32(buf + 4) + 8) {
 | 
			
		||||
        av_log(f->avctx, AV_LOG_ERROR, "size mismatch %d %"PRIu32"\n",
 | 
			
		||||
        av_log(f->avctx, AV_LOG_ERROR, "size mismatch %d %d\n",
 | 
			
		||||
               buf_size, AV_RL32(buf + 4));
 | 
			
		||||
        return AVERROR_INVALIDDATA;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1004,8 +996,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    f->version = AV_RL32(avctx->extradata) >> 16;
 | 
			
		||||
    ff_blockdsp_init(&f->bdsp, avctx);
 | 
			
		||||
    ff_bswapdsp_init(&f->bbdsp);
 | 
			
		||||
    ff_dsputil_init(&f->dsp, avctx);
 | 
			
		||||
    f->avctx = avctx;
 | 
			
		||||
    init_vlcs(f);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -150,7 +150,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
 | 
			
		||||
        c->planemap[0] = 0; // 1st plane is palette indexes
 | 
			
		||||
        break;
 | 
			
		||||
    case 24:
 | 
			
		||||
        avctx->pix_fmt = ff_get_format(avctx, pixfmt_rgb24);
 | 
			
		||||
        avctx->pix_fmt = avctx->get_format(avctx, pixfmt_rgb24);
 | 
			
		||||
        c->planes      = 3;
 | 
			
		||||
        c->planemap[0] = 2; // 1st plane is red
 | 
			
		||||
        c->planemap[1] = 1; // 2nd plane is green
 | 
			
		||||
 
 | 
			
		||||
@@ -101,7 +101,7 @@ static int eightsvx_decode_frame(AVCodecContext *avctx, void *data,
 | 
			
		||||
        }
 | 
			
		||||
        if (avpkt->size < (hdr_size + 1) * avctx->channels) {
 | 
			
		||||
            av_log(avctx, AV_LOG_ERROR, "packet size is too small\n");
 | 
			
		||||
            return AVERROR_INVALIDDATA;
 | 
			
		||||
            return AVERROR(EINVAL);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        esc->fib_acc[0] = avpkt->data[1] + 128;
 | 
			
		||||
@@ -124,7 +124,7 @@ static int eightsvx_decode_frame(AVCodecContext *avctx, void *data,
 | 
			
		||||
    }
 | 
			
		||||
    if (!esc->data[0]) {
 | 
			
		||||
        av_log(avctx, AV_LOG_ERROR, "unexpected empty packet\n");
 | 
			
		||||
        return AVERROR_INVALIDDATA;
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* decode next piece of data from the buffer */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,28 +1,25 @@
 | 
			
		||||
include $(SUBDIR)../config.mak
 | 
			
		||||
 | 
			
		||||
NAME = avcodec
 | 
			
		||||
FFLIBS = avutil
 | 
			
		||||
 | 
			
		||||
HEADERS = avcodec.h                                                     \
 | 
			
		||||
          avfft.h                                                       \
 | 
			
		||||
          dv_profile.h                                                  \
 | 
			
		||||
          dxva2.h                                                       \
 | 
			
		||||
          old_codec_ids.h                                               \
 | 
			
		||||
          vaapi.h                                                       \
 | 
			
		||||
          vda.h                                                         \
 | 
			
		||||
          vdpau.h                                                       \
 | 
			
		||||
          version.h                                                     \
 | 
			
		||||
          vorbis_parser.h                                               \
 | 
			
		||||
          xvmc.h                                                        \
 | 
			
		||||
 | 
			
		||||
OBJS = allcodecs.o                                                      \
 | 
			
		||||
       audioconvert.o                                                   \
 | 
			
		||||
       avdct.o                                                          \
 | 
			
		||||
       avpacket.o                                                       \
 | 
			
		||||
       avpicture.o                                                      \
 | 
			
		||||
       bitstream.o                                                      \
 | 
			
		||||
       bitstream_filter.o                                               \
 | 
			
		||||
       codec_desc.o                                                     \
 | 
			
		||||
       dv_profile.o                                                     \
 | 
			
		||||
       fmtconvert.o                                                     \
 | 
			
		||||
       imgconvert.o                                                     \
 | 
			
		||||
       mathtables.o                                                     \
 | 
			
		||||
@@ -32,24 +29,19 @@ OBJS = allcodecs.o                                                      \
 | 
			
		||||
       resample.o                                                       \
 | 
			
		||||
       resample2.o                                                      \
 | 
			
		||||
       utils.o                                                          \
 | 
			
		||||
       vorbis_parser.o                                                  \
 | 
			
		||||
       xiph.o                                                           \
 | 
			
		||||
 | 
			
		||||
# subsystems
 | 
			
		||||
# parts needed for many different codecs
 | 
			
		||||
OBJS-$(CONFIG_AANDCTTABLES)            += aandcttab.o
 | 
			
		||||
OBJS-$(CONFIG_AC3DSP)                  += ac3dsp.o
 | 
			
		||||
OBJS-$(CONFIG_AUDIO_FRAME_QUEUE)       += audio_frame_queue.o
 | 
			
		||||
OBJS-$(CONFIG_AUDIODSP)                += audiodsp.o
 | 
			
		||||
OBJS-$(CONFIG_BLOCKDSP)                += blockdsp.o
 | 
			
		||||
OBJS-$(CONFIG_BSWAPDSP)                += bswapdsp.o
 | 
			
		||||
OBJS-$(CONFIG_CABAC)                   += cabac.o
 | 
			
		||||
OBJS-$(CONFIG_CRYSTALHD)               += crystalhd.o
 | 
			
		||||
OBJS-$(CONFIG_DCT)                     += dct.o dct32_fixed.o dct32_float.o
 | 
			
		||||
OBJS-$(CONFIG_DXVA2)                   += dxva2.o
 | 
			
		||||
OBJS-$(CONFIG_DSPUTIL)                 += dsputil.o faanidct.o          \
 | 
			
		||||
                                          simple_idct.o jrevdct.o
 | 
			
		||||
OBJS-$(CONFIG_ENCODERS)                += faandct.o jfdctfst.o jfdctint.o
 | 
			
		||||
OBJS-$(CONFIG_ERROR_RESILIENCE)        += error_resilience.o
 | 
			
		||||
OBJS-$(CONFIG_EXIF)                    += exif.o tiff_common.o
 | 
			
		||||
OBJS-$(CONFIG_FAANDCT)                 += faandct.o
 | 
			
		||||
OBJS-$(CONFIG_FAANIDCT)                += faanidct.o
 | 
			
		||||
OBJS-$(CONFIG_FDCTDSP)                 += fdctdsp.o jfdctfst.o jfdctint.o
 | 
			
		||||
FFT-OBJS-$(CONFIG_HARDCODED_TABLES)    += cos_tables.o cos_fixed_tables.o
 | 
			
		||||
OBJS-$(CONFIG_FFT)                     += avfft.o fft_fixed.o fft_float.o \
 | 
			
		||||
                                          fft_fixed_32.o fft_init_table.o \
 | 
			
		||||
@@ -62,42 +54,30 @@ OBJS-$(CONFIG_H264PRED)                += h264pred.o
 | 
			
		||||
OBJS-$(CONFIG_H264QPEL)                += h264qpel.o
 | 
			
		||||
OBJS-$(CONFIG_HPELDSP)                 += hpeldsp.o
 | 
			
		||||
OBJS-$(CONFIG_HUFFMAN)                 += huffman.o
 | 
			
		||||
OBJS-$(CONFIG_HUFFYUVDSP)              += huffyuvdsp.o
 | 
			
		||||
OBJS-$(CONFIG_HUFFYUVENCDSP)           += huffyuvencdsp.o
 | 
			
		||||
OBJS-$(CONFIG_IDCTDSP)                 += idctdsp.o simple_idct.o jrevdct.o
 | 
			
		||||
OBJS-$(CONFIG_IIRFILTER)               += iirfilter.o
 | 
			
		||||
OBJS-$(CONFIG_INTRAX8)                 += intrax8.o intrax8dsp.o
 | 
			
		||||
OBJS-$(CONFIG_LIBXVID)                 += libxvid_rc.o
 | 
			
		||||
OBJS-$(CONFIG_LLAUDDSP)                += lossless_audiodsp.o
 | 
			
		||||
OBJS-$(CONFIG_LLVIDDSP)                += lossless_videodsp.o
 | 
			
		||||
OBJS-$(CONFIG_LPC)                     += lpc.o
 | 
			
		||||
OBJS-$(CONFIG_LSP)                     += lsp.o
 | 
			
		||||
OBJS-$(CONFIG_MDCT)                    += mdct_fixed.o mdct_float.o mdct_fixed_32.o
 | 
			
		||||
OBJS-$(CONFIG_ME_CMP)                  += me_cmp.o
 | 
			
		||||
OBJS-$(CONFIG_MPEG_ER)                 += mpeg_er.o
 | 
			
		||||
OBJS-$(CONFIG_MPEGAUDIO)               += mpegaudio.o mpegaudiodata.o   \
 | 
			
		||||
                                          mpegaudiodecheader.o
 | 
			
		||||
OBJS-$(CONFIG_MPEGAUDIODSP)            += mpegaudiodsp.o                \
 | 
			
		||||
                                          mpegaudiodsp_data.o           \
 | 
			
		||||
                                          mpegaudiodsp_fixed.o          \
 | 
			
		||||
                                          mpegaudiodsp_float.o
 | 
			
		||||
OBJS-$(CONFIG_MPEGVIDEO)               += mpegvideo.o mpegvideodsp.o    \
 | 
			
		||||
                                          mpegvideo_motion.o mpegutils.o
 | 
			
		||||
OBJS-$(CONFIG_MPEGVIDEO)               += mpegvideo.o mpegvideo_motion.o
 | 
			
		||||
OBJS-$(CONFIG_MPEGVIDEOENC)            += mpegvideo_enc.o mpeg12data.o  \
 | 
			
		||||
                                          motion_est.o ratecontrol.o    \
 | 
			
		||||
                                          mpegvideoencdsp.o
 | 
			
		||||
OBJS-$(CONFIG_PIXBLOCKDSP)             += pixblockdsp.o
 | 
			
		||||
OBJS-$(CONFIG_QPELDSP)                 += qpeldsp.o
 | 
			
		||||
                                          motion_est.o ratecontrol.o
 | 
			
		||||
OBJS-$(CONFIG_RANGECODER)              += rangecoder.o
 | 
			
		||||
RDFT-OBJS-$(CONFIG_HARDCODED_TABLES)   += sin_tables.o
 | 
			
		||||
OBJS-$(CONFIG_RDFT)                    += rdft.o $(RDFT-OBJS-yes)
 | 
			
		||||
OBJS-$(CONFIG_SHARED)                  += log2_tab.o
 | 
			
		||||
OBJS-$(CONFIG_SINEWIN)                 += sinewin.o
 | 
			
		||||
OBJS-$(CONFIG_STARTCODE)               += startcode.o
 | 
			
		||||
OBJS-$(CONFIG_TPELDSP)                 += tpeldsp.o
 | 
			
		||||
OBJS-$(CONFIG_VAAPI)                   += vaapi.o
 | 
			
		||||
OBJS-$(CONFIG_VDPAU)                   += vdpau.o
 | 
			
		||||
OBJS-$(CONFIG_VIDEODSP)                += videodsp.o
 | 
			
		||||
OBJS-$(CONFIG_VP3DSP)                  += vp3dsp.o
 | 
			
		||||
OBJS-$(CONFIG_WMA_FREQS)               += wma_freqs.o
 | 
			
		||||
 | 
			
		||||
# decoders/encoders
 | 
			
		||||
OBJS-$(CONFIG_ZERO12V_DECODER)         += 012v.o
 | 
			
		||||
@@ -108,18 +88,16 @@ OBJS-$(CONFIG_AAC_DECODER)             += aacdec.o aactab.o aacsbr.o aacps.o \
 | 
			
		||||
                                          sbrdsp.o aacpsdsp.o
 | 
			
		||||
OBJS-$(CONFIG_AAC_ENCODER)             += aacenc.o aaccoder.o    \
 | 
			
		||||
                                          aacpsy.o aactab.o      \
 | 
			
		||||
                                          psymodel.o mpeg4audio.o kbdwin.o
 | 
			
		||||
                                          psymodel.o iirfilter.o \
 | 
			
		||||
                                          mpeg4audio.o kbdwin.o
 | 
			
		||||
OBJS-$(CONFIG_AASC_DECODER)            += aasc.o msrledec.o
 | 
			
		||||
OBJS-$(CONFIG_AC3_DECODER)             += ac3dec_float.o ac3dec_data.o ac3.o kbdwin.o
 | 
			
		||||
OBJS-$(CONFIG_AC3_FIXED_DECODER)       += ac3dec_fixed.o ac3dec_data.o ac3.o kbdwin.o
 | 
			
		||||
OBJS-$(CONFIG_AC3_DECODER)             += ac3dec.o ac3dec_data.o ac3.o kbdwin.o
 | 
			
		||||
OBJS-$(CONFIG_AC3_ENCODER)             += ac3enc_float.o ac3enc.o ac3tab.o \
 | 
			
		||||
                                          ac3.o kbdwin.o
 | 
			
		||||
OBJS-$(CONFIG_AC3_FIXED_ENCODER)       += ac3enc_fixed.o ac3enc.o ac3tab.o ac3.o
 | 
			
		||||
OBJS-$(CONFIG_AIC_DECODER)             += aic.o
 | 
			
		||||
OBJS-$(CONFIG_ALAC_DECODER)            += alac.o alac_data.o
 | 
			
		||||
OBJS-$(CONFIG_ALAC_ENCODER)            += alacenc.o alac_data.o
 | 
			
		||||
OBJS-$(CONFIG_ALIAS_PIX_DECODER)       += aliaspixdec.o
 | 
			
		||||
OBJS-$(CONFIG_ALIAS_PIX_ENCODER)       += aliaspixenc.o
 | 
			
		||||
OBJS-$(CONFIG_ALS_DECODER)             += alsdec.o bgmc.o mpeg4audio.o
 | 
			
		||||
OBJS-$(CONFIG_AMRNB_DECODER)           += amrnbdec.o celp_filters.o   \
 | 
			
		||||
                                          celp_math.o acelp_filters.o \
 | 
			
		||||
@@ -129,14 +107,14 @@ OBJS-$(CONFIG_AMRWB_DECODER)           += amrwbdec.o celp_filters.o   \
 | 
			
		||||
                                          celp_math.o acelp_filters.o \
 | 
			
		||||
                                          acelp_vectors.o             \
 | 
			
		||||
                                          acelp_pitch_delay.o
 | 
			
		||||
OBJS-$(CONFIG_AMV_ENCODER)             += mjpegenc.o mjpeg.o mjpegenc_common.o \
 | 
			
		||||
OBJS-$(CONFIG_AMV_DECODER)             += sp5xdec.o mjpegdec.o mjpeg.o
 | 
			
		||||
OBJS-$(CONFIG_AMV_ENCODER)             += mjpegenc.o mjpeg.o           \
 | 
			
		||||
                                          mpegvideo_enc.o motion_est.o \
 | 
			
		||||
                                          ratecontrol.o mpeg12data.o   \
 | 
			
		||||
                                          mpegvideo.o
 | 
			
		||||
OBJS-$(CONFIG_ANM_DECODER)             += anm.o
 | 
			
		||||
OBJS-$(CONFIG_ANSI_DECODER)            += ansi.o cga_data.o
 | 
			
		||||
OBJS-$(CONFIG_APE_DECODER)             += apedec.o
 | 
			
		||||
OBJS-$(CONFIG_APNG_DECODER)            += png.o pngdec.o pngdsp.o
 | 
			
		||||
OBJS-$(CONFIG_SSA_DECODER)             += assdec.o ass.o ass_split.o
 | 
			
		||||
OBJS-$(CONFIG_SSA_ENCODER)             += assenc.o ass.o
 | 
			
		||||
OBJS-$(CONFIG_ASS_DECODER)             += assdec.o ass.o ass_split.o
 | 
			
		||||
@@ -162,14 +140,14 @@ OBJS-$(CONFIG_AYUV_ENCODER)            += v408enc.o
 | 
			
		||||
OBJS-$(CONFIG_BETHSOFTVID_DECODER)     += bethsoftvideo.o
 | 
			
		||||
OBJS-$(CONFIG_BFI_DECODER)             += bfi.o
 | 
			
		||||
OBJS-$(CONFIG_BINK_DECODER)            += bink.o binkdsp.o
 | 
			
		||||
OBJS-$(CONFIG_BINKAUDIO_DCT_DECODER)   += binkaudio.o
 | 
			
		||||
OBJS-$(CONFIG_BINKAUDIO_RDFT_DECODER)  += binkaudio.o
 | 
			
		||||
OBJS-$(CONFIG_BINKAUDIO_DCT_DECODER)   += binkaudio.o wma.o wma_common.o
 | 
			
		||||
OBJS-$(CONFIG_BINKAUDIO_RDFT_DECODER)  += binkaudio.o wma.o wma_common.o
 | 
			
		||||
OBJS-$(CONFIG_BINTEXT_DECODER)         += bintext.o cga_data.o
 | 
			
		||||
OBJS-$(CONFIG_BMP_DECODER)             += bmp.o msrledec.o
 | 
			
		||||
OBJS-$(CONFIG_BMP_ENCODER)             += bmpenc.o
 | 
			
		||||
OBJS-$(CONFIG_BMV_AUDIO_DECODER)       += bmvaudio.o
 | 
			
		||||
OBJS-$(CONFIG_BMV_VIDEO_DECODER)       += bmvvideo.o
 | 
			
		||||
OBJS-$(CONFIG_BRENDER_PIX_DECODER)     += brenderpix.o
 | 
			
		||||
OBJS-$(CONFIG_BMV_VIDEO_DECODER)       += bmv.o
 | 
			
		||||
OBJS-$(CONFIG_BMV_AUDIO_DECODER)       += bmv.o
 | 
			
		||||
OBJS-$(CONFIG_BRENDER_PIX_DECODER)     += brender_pix.o
 | 
			
		||||
OBJS-$(CONFIG_C93_DECODER)             += c93.o
 | 
			
		||||
OBJS-$(CONFIG_CAVS_DECODER)            += cavs.o cavsdec.o cavsdsp.o \
 | 
			
		||||
                                          cavsdata.o mpeg12data.o
 | 
			
		||||
@@ -177,8 +155,8 @@ OBJS-$(CONFIG_CDGRAPHICS_DECODER)      += cdgraphics.o
 | 
			
		||||
OBJS-$(CONFIG_CDXL_DECODER)            += cdxl.o
 | 
			
		||||
OBJS-$(CONFIG_CINEPAK_DECODER)         += cinepak.o
 | 
			
		||||
OBJS-$(CONFIG_CINEPAK_ENCODER)         += cinepakenc.o elbg.o
 | 
			
		||||
OBJS-$(CONFIG_CLJR_DECODER)            += cljrdec.o
 | 
			
		||||
OBJS-$(CONFIG_CLJR_ENCODER)            += cljrenc.o
 | 
			
		||||
OBJS-$(CONFIG_CLJR_DECODER)            += cljr.o
 | 
			
		||||
OBJS-$(CONFIG_CLJR_ENCODER)            += cljr.o
 | 
			
		||||
OBJS-$(CONFIG_CLLC_DECODER)            += cllc.o
 | 
			
		||||
OBJS-$(CONFIG_COOK_DECODER)            += cook.o
 | 
			
		||||
OBJS-$(CONFIG_COMFORTNOISE_DECODER)    += cngdec.o celp_filters.o
 | 
			
		||||
@@ -196,28 +174,25 @@ OBJS-$(CONFIG_DNXHD_DECODER)           += dnxhddec.o dnxhddata.o
 | 
			
		||||
OBJS-$(CONFIG_DNXHD_ENCODER)           += dnxhdenc.o dnxhddata.o
 | 
			
		||||
OBJS-$(CONFIG_DPX_DECODER)             += dpx.o
 | 
			
		||||
OBJS-$(CONFIG_DPX_ENCODER)             += dpxenc.o
 | 
			
		||||
OBJS-$(CONFIG_DSD_LSBF_DECODER)        += dsddec.o
 | 
			
		||||
OBJS-$(CONFIG_DSD_MSBF_DECODER)        += dsddec.o
 | 
			
		||||
OBJS-$(CONFIG_DSD_LSBF_PLANAR_DECODER) += dsddec.o
 | 
			
		||||
OBJS-$(CONFIG_DSD_MSBF_PLANAR_DECODER) += dsddec.o
 | 
			
		||||
OBJS-$(CONFIG_DSICINAUDIO_DECODER)     += dsicinaudio.o
 | 
			
		||||
OBJS-$(CONFIG_DSICINVIDEO_DECODER)     += dsicinvideo.o
 | 
			
		||||
OBJS-$(CONFIG_DSICINAUDIO_DECODER)     += dsicinav.o
 | 
			
		||||
OBJS-$(CONFIG_DSICINVIDEO_DECODER)     += dsicinav.o
 | 
			
		||||
OBJS-$(CONFIG_DVBSUB_DECODER)          += dvbsubdec.o
 | 
			
		||||
OBJS-$(CONFIG_DVBSUB_ENCODER)          += dvbsub.o
 | 
			
		||||
OBJS-$(CONFIG_DVDSUB_DECODER)          += dvdsubdec.o
 | 
			
		||||
OBJS-$(CONFIG_DVDSUB_ENCODER)          += dvdsubenc.o
 | 
			
		||||
OBJS-$(CONFIG_DVVIDEO_DECODER)         += dvdec.o dv.o dvdata.o
 | 
			
		||||
OBJS-$(CONFIG_DVVIDEO_ENCODER)         += dvenc.o dv.o dvdata.o
 | 
			
		||||
OBJS-$(CONFIG_DVVIDEO_DECODER)         += dvdec.o dv.o dvdata.o dv_profile.o
 | 
			
		||||
OBJS-$(CONFIG_DVVIDEO_ENCODER)         += dvenc.o dv.o dvdata.o dv_profile.o
 | 
			
		||||
OBJS-$(CONFIG_DXA_DECODER)             += dxa.o
 | 
			
		||||
OBJS-$(CONFIG_DXTORY_DECODER)          += dxtory.o
 | 
			
		||||
OBJS-$(CONFIG_EAC3_DECODER)            += eac3_data.o
 | 
			
		||||
OBJS-$(CONFIG_EAC3_DECODER)            += eac3dec.o eac3_data.o
 | 
			
		||||
OBJS-$(CONFIG_EAC3_ENCODER)            += eac3enc.o eac3_data.o
 | 
			
		||||
OBJS-$(CONFIG_EACMV_DECODER)           += eacmv.o
 | 
			
		||||
OBJS-$(CONFIG_EAMAD_DECODER)           += eamad.o eaidct.o mpeg12.o \
 | 
			
		||||
                                          mpeg12data.o
 | 
			
		||||
OBJS-$(CONFIG_EATGQ_DECODER)           += eatgq.o eaidct.o
 | 
			
		||||
OBJS-$(CONFIG_EATGV_DECODER)           += eatgv.o
 | 
			
		||||
OBJS-$(CONFIG_EATQI_DECODER)           += eatqi.o eaidct.o
 | 
			
		||||
OBJS-$(CONFIG_EATQI_DECODER)           += eatqi.o eaidct.o mpeg12dec.o  \
 | 
			
		||||
                                          mpeg12.o mpeg12data.o
 | 
			
		||||
OBJS-$(CONFIG_EIGHTBPS_DECODER)        += 8bps.o
 | 
			
		||||
OBJS-$(CONFIG_EIGHTSVX_EXP_DECODER)    += 8svx.o
 | 
			
		||||
OBJS-$(CONFIG_EIGHTSVX_FIB_DECODER)    += 8svx.o
 | 
			
		||||
@@ -227,6 +202,8 @@ OBJS-$(CONFIG_EVRC_DECODER)            += evrcdec.o acelp_vectors.o lsp.o
 | 
			
		||||
OBJS-$(CONFIG_EXR_DECODER)             += exr.o
 | 
			
		||||
OBJS-$(CONFIG_FFV1_DECODER)            += ffv1dec.o ffv1.o
 | 
			
		||||
OBJS-$(CONFIG_FFV1_ENCODER)            += ffv1enc.o ffv1.o
 | 
			
		||||
OBJS-$(CONFIG_FFVHUFF_DECODER)         += huffyuv.o huffyuvdec.o
 | 
			
		||||
OBJS-$(CONFIG_FFVHUFF_ENCODER)         += huffyuv.o huffyuvenc.o
 | 
			
		||||
OBJS-$(CONFIG_FFWAVESYNTH_DECODER)     += ffwavesynth.o
 | 
			
		||||
OBJS-$(CONFIG_FIC_DECODER)             += fic.o
 | 
			
		||||
OBJS-$(CONFIG_FLAC_DECODER)            += flacdec.o flacdata.o flac.o flacdsp.o
 | 
			
		||||
@@ -255,17 +232,18 @@ OBJS-$(CONFIG_H263_DECODER)            += h263dec.o h263.o ituh263dec.o        \
 | 
			
		||||
                                          intelh263dec.o
 | 
			
		||||
OBJS-$(CONFIG_H263_ENCODER)            += mpeg4videoenc.o mpeg4video.o  \
 | 
			
		||||
                                          h263.o ituh263enc.o flvenc.o
 | 
			
		||||
OBJS-$(CONFIG_H264_DECODER)            += h264.o h264_cabac.o h264_cavlc.o \
 | 
			
		||||
                                          h264_direct.o h264_loopfilter.o  \
 | 
			
		||||
                                          h264_mb.o h264_picture.o h264_ps.o \
 | 
			
		||||
                                          h264_refs.o h264_sei.o h264_slice.o
 | 
			
		||||
OBJS-$(CONFIG_H264_DECODER)            += h264.o                               \
 | 
			
		||||
                                          h264_loopfilter.o h264_direct.o      \
 | 
			
		||||
                                          cabac.o h264_sei.o h264_ps.o         \
 | 
			
		||||
                                          h264_refs.o h264_cavlc.o h264_cabac.o
 | 
			
		||||
OBJS-$(CONFIG_H264_VDA_DECODER)        += vda_h264_dec.o
 | 
			
		||||
OBJS-$(CONFIG_HEVC_DECODER)            += hevc.o hevc_mvs.o hevc_ps.o hevc_sei.o \
 | 
			
		||||
                                          hevc_cabac.o hevc_refs.o hevcpred.o    \
 | 
			
		||||
                                          hevcdsp.o hevc_filter.o
 | 
			
		||||
                                          hevcdsp.o hevc_filter.o cabac.o
 | 
			
		||||
OBJS-$(CONFIG_HNM4_VIDEO_DECODER)      += hnm4video.o
 | 
			
		||||
OBJS-$(CONFIG_HUFFYUV_DECODER)         += huffyuv.o huffyuvdec.o
 | 
			
		||||
OBJS-$(CONFIG_HUFFYUV_ENCODER)         += huffyuv.o huffyuvenc.o
 | 
			
		||||
OBJS-$(CONFIG_IAC_DECODER)             += imc.o
 | 
			
		||||
OBJS-$(CONFIG_IDCIN_DECODER)           += idcinvideo.o
 | 
			
		||||
OBJS-$(CONFIG_IDF_DECODER)             += bintext.o cga_data.o
 | 
			
		||||
OBJS-$(CONFIG_IFF_BYTERUN1_DECODER)    += iff.o
 | 
			
		||||
@@ -280,15 +258,16 @@ OBJS-$(CONFIG_INTERPLAY_VIDEO_DECODER) += interplayvideo.o
 | 
			
		||||
OBJS-$(CONFIG_JACOSUB_DECODER)         += jacosubdec.o ass.o
 | 
			
		||||
OBJS-$(CONFIG_JPEG2000_ENCODER)        += j2kenc.o mqcenc.o mqc.o jpeg2000.o \
 | 
			
		||||
                                          jpeg2000dwt.o
 | 
			
		||||
OBJS-$(CONFIG_JPEG2000_DECODER)        += jpeg2000dec.o jpeg2000.o jpeg2000dsp.o \
 | 
			
		||||
OBJS-$(CONFIG_JPEG2000_DECODER)        += jpeg2000dec.o jpeg2000.o      \
 | 
			
		||||
                                          jpeg2000dwt.o mqcdec.o mqc.o
 | 
			
		||||
OBJS-$(CONFIG_JPEGLS_DECODER)          += jpeglsdec.o jpegls.o
 | 
			
		||||
OBJS-$(CONFIG_JPEGLS_DECODER)          += jpeglsdec.o jpegls.o \
 | 
			
		||||
                                          mjpegdec.o mjpeg.o
 | 
			
		||||
OBJS-$(CONFIG_JPEGLS_ENCODER)          += jpeglsenc.o jpegls.o
 | 
			
		||||
OBJS-$(CONFIG_JV_DECODER)              += jvdec.o
 | 
			
		||||
OBJS-$(CONFIG_KGV1_DECODER)            += kgv1dec.o
 | 
			
		||||
OBJS-$(CONFIG_KMVC_DECODER)            += kmvc.o
 | 
			
		||||
OBJS-$(CONFIG_LAGARITH_DECODER)        += lagarith.o lagarithrac.o
 | 
			
		||||
OBJS-$(CONFIG_LJPEG_ENCODER)           += ljpegenc.o mjpeg.o mjpegenc_common.o
 | 
			
		||||
OBJS-$(CONFIG_LJPEG_ENCODER)           += ljpegenc.o mjpegenc.o mjpeg.o
 | 
			
		||||
OBJS-$(CONFIG_LOCO_DECODER)            += loco.o
 | 
			
		||||
OBJS-$(CONFIG_MACE3_DECODER)           += mace.o
 | 
			
		||||
OBJS-$(CONFIG_MACE6_DECODER)           += mace.o
 | 
			
		||||
@@ -298,8 +277,8 @@ OBJS-$(CONFIG_METASOUND_DECODER)       += metasound.o metasound_data.o \
 | 
			
		||||
OBJS-$(CONFIG_MICRODVD_DECODER)        += microdvddec.o ass.o
 | 
			
		||||
OBJS-$(CONFIG_MIMIC_DECODER)           += mimic.o
 | 
			
		||||
OBJS-$(CONFIG_MJPEG_DECODER)           += mjpegdec.o mjpeg.o
 | 
			
		||||
OBJS-$(CONFIG_MJPEG_ENCODER)           += mjpegenc.o mjpeg.o mjpegenc_common.o
 | 
			
		||||
OBJS-$(CONFIG_MJPEGB_DECODER)          += mjpegbdec.o
 | 
			
		||||
OBJS-$(CONFIG_MJPEG_ENCODER)           += mjpegenc.o mjpeg.o
 | 
			
		||||
OBJS-$(CONFIG_MJPEGB_DECODER)          += mjpegbdec.o mjpegdec.o mjpeg.o
 | 
			
		||||
OBJS-$(CONFIG_MLP_DECODER)             += mlpdec.o mlpdsp.o
 | 
			
		||||
OBJS-$(CONFIG_MMVIDEO_DECODER)         += mmvideo.o
 | 
			
		||||
OBJS-$(CONFIG_MOTIONPIXELS_DECODER)    += motionpixels.o
 | 
			
		||||
@@ -321,12 +300,12 @@ OBJS-$(CONFIG_MP3ON4_DECODER)          += mpegaudiodec_fixed.o mpeg4audio.o
 | 
			
		||||
OBJS-$(CONFIG_MP3ON4FLOAT_DECODER)     += mpegaudiodec_float.o mpeg4audio.o
 | 
			
		||||
OBJS-$(CONFIG_MPC7_DECODER)            += mpc7.o mpc.o
 | 
			
		||||
OBJS-$(CONFIG_MPC8_DECODER)            += mpc8.o mpc.o
 | 
			
		||||
OBJS-$(CONFIG_MPEGVIDEO_DECODER)       += mpeg12dec.o mpeg12.o mpeg12data.o
 | 
			
		||||
OBJS-$(CONFIG_MPEGVIDEO_DECODER)       += mpeg12.o mpeg12data.o \
 | 
			
		||||
                                          mpegvideo.o error_resilience.o
 | 
			
		||||
OBJS-$(CONFIG_MPEG1VIDEO_DECODER)      += mpeg12dec.o mpeg12.o mpeg12data.o
 | 
			
		||||
OBJS-$(CONFIG_MPEG1VIDEO_ENCODER)      += mpeg12enc.o mpeg12.o
 | 
			
		||||
OBJS-$(CONFIG_MPEG2VIDEO_DECODER)      += mpeg12dec.o mpeg12.o mpeg12data.o
 | 
			
		||||
OBJS-$(CONFIG_MPEG2VIDEO_ENCODER)      += mpeg12enc.o mpeg12.o
 | 
			
		||||
OBJS-$(CONFIG_MPEG4_DECODER)           += xvididct.o
 | 
			
		||||
OBJS-$(CONFIG_MPL2_DECODER)            += mpl2dec.o ass.o
 | 
			
		||||
OBJS-$(CONFIG_MSMPEG4V1_DECODER)       += msmpeg4dec.o msmpeg4.o msmpeg4data.o
 | 
			
		||||
OBJS-$(CONFIG_MSMPEG4V2_DECODER)       += msmpeg4dec.o msmpeg4.o msmpeg4data.o
 | 
			
		||||
@@ -343,16 +322,12 @@ OBJS-$(CONFIG_MSZH_DECODER)            += lcldec.o
 | 
			
		||||
OBJS-$(CONFIG_MTS2_DECODER)            += mss4.o mss34dsp.o
 | 
			
		||||
OBJS-$(CONFIG_MVC1_DECODER)            += mvcdec.o
 | 
			
		||||
OBJS-$(CONFIG_MVC2_DECODER)            += mvcdec.o
 | 
			
		||||
OBJS-$(CONFIG_MXPEG_DECODER)           += mxpegdec.o
 | 
			
		||||
OBJS-$(CONFIG_MXPEG_DECODER)           += mxpegdec.o mjpegdec.o mjpeg.o
 | 
			
		||||
OBJS-$(CONFIG_NELLYMOSER_DECODER)      += nellymoserdec.o nellymoser.o
 | 
			
		||||
OBJS-$(CONFIG_NELLYMOSER_ENCODER)      += nellymoserenc.o nellymoser.o
 | 
			
		||||
OBJS-$(CONFIG_NUV_DECODER)             += nuv.o rtjpeg.o
 | 
			
		||||
OBJS-$(CONFIG_ON2AVC_DECODER)          += on2avc.o on2avcdata.o
 | 
			
		||||
OBJS-$(CONFIG_OPUS_DECODER)            += opusdec.o opus.o opus_celt.o \
 | 
			
		||||
                                          opus_imdct.o opus_silk.o     \
 | 
			
		||||
                                          vorbis_data.o
 | 
			
		||||
OBJS-$(CONFIG_PAF_AUDIO_DECODER)       += pafaudio.o
 | 
			
		||||
OBJS-$(CONFIG_PAF_VIDEO_DECODER)       += pafvideo.o
 | 
			
		||||
OBJS-$(CONFIG_PAF_VIDEO_DECODER)       += paf.o
 | 
			
		||||
OBJS-$(CONFIG_PAF_AUDIO_DECODER)       += paf.o
 | 
			
		||||
OBJS-$(CONFIG_PAM_DECODER)             += pnmdec.o pnm.o
 | 
			
		||||
OBJS-$(CONFIG_PAM_ENCODER)             += pamenc.o
 | 
			
		||||
OBJS-$(CONFIG_PBM_DECODER)             += pnmdec.o pnm.o
 | 
			
		||||
@@ -430,10 +405,9 @@ OBJS-$(CONFIG_SOL_DPCM_DECODER)        += dpcm.o
 | 
			
		||||
OBJS-$(CONFIG_SONIC_DECODER)           += sonic.o
 | 
			
		||||
OBJS-$(CONFIG_SONIC_ENCODER)           += sonic.o
 | 
			
		||||
OBJS-$(CONFIG_SONIC_LS_ENCODER)        += sonic.o
 | 
			
		||||
OBJS-$(CONFIG_SP5X_DECODER)            += sp5xdec.o
 | 
			
		||||
OBJS-$(CONFIG_SP5X_DECODER)            += sp5xdec.o mjpegdec.o mjpeg.o
 | 
			
		||||
OBJS-$(CONFIG_SRT_DECODER)             += srtdec.o ass.o
 | 
			
		||||
OBJS-$(CONFIG_SRT_ENCODER)             += srtenc.o ass_split.o
 | 
			
		||||
OBJS-$(CONFIG_STL_DECODER)             += textdec.o ass.o
 | 
			
		||||
OBJS-$(CONFIG_SUBRIP_DECODER)          += srtdec.o ass.o
 | 
			
		||||
OBJS-$(CONFIG_SUBRIP_ENCODER)          += srtenc.o ass_split.o
 | 
			
		||||
OBJS-$(CONFIG_SUBVIEWER1_DECODER)      += textdec.o ass.o
 | 
			
		||||
@@ -443,12 +417,17 @@ OBJS-$(CONFIG_SUNRAST_ENCODER)         += sunrastenc.o
 | 
			
		||||
OBJS-$(CONFIG_SVQ1_DECODER)            += svq1dec.o svq1.o svq13.o h263.o
 | 
			
		||||
OBJS-$(CONFIG_SVQ1_ENCODER)            += svq1enc.o svq1.o    \
 | 
			
		||||
                                          h263.o ituh263enc.o
 | 
			
		||||
OBJS-$(CONFIG_SVQ3_DECODER)            += svq3.o svq13.o mpegutils.o
 | 
			
		||||
OBJS-$(CONFIG_SVQ3_DECODER)            += svq3.o svq13.o h263.o h264.o        \
 | 
			
		||||
                                          h264_loopfilter.o h264_direct.o     \
 | 
			
		||||
                                          h264_sei.o h264_ps.o h264_refs.o    \
 | 
			
		||||
                                          h264_cavlc.o h264_cabac.o cabac.o
 | 
			
		||||
OBJS-$(CONFIG_TEXT_DECODER)            += textdec.o ass.o
 | 
			
		||||
OBJS-$(CONFIG_TAK_DECODER)             += takdec.o tak.o
 | 
			
		||||
OBJS-$(CONFIG_TARGA_DECODER)           += targa.o
 | 
			
		||||
OBJS-$(CONFIG_TARGA_ENCODER)           += targaenc.o rle.o
 | 
			
		||||
OBJS-$(CONFIG_TARGA_Y216_DECODER)      += targa_y216dec.o
 | 
			
		||||
OBJS-$(CONFIG_THEORA_DECODER)          += xiph.o
 | 
			
		||||
OBJS-$(CONFIG_THP_DECODER)             += mjpegdec.o mjpeg.o
 | 
			
		||||
OBJS-$(CONFIG_TIERTEXSEQVIDEO_DECODER) += tiertexseqv.o
 | 
			
		||||
OBJS-$(CONFIG_TIFF_DECODER)            += tiff.o lzw.o faxcompr.o tiff_data.o tiff_common.o
 | 
			
		||||
OBJS-$(CONFIG_TIFF_ENCODER)            += tiffenc.o rle.o lzwenc.o tiff_data.o
 | 
			
		||||
@@ -477,17 +456,15 @@ OBJS-$(CONFIG_V410_ENCODER)            += v410enc.o
 | 
			
		||||
OBJS-$(CONFIG_V210X_DECODER)           += v210x.o
 | 
			
		||||
OBJS-$(CONFIG_VB_DECODER)              += vb.o
 | 
			
		||||
OBJS-$(CONFIG_VBLE_DECODER)            += vble.o
 | 
			
		||||
OBJS-$(CONFIG_VC1_DECODER)             += vc1dec.o vc1_block.o vc1_loopfilter.o \
 | 
			
		||||
                                          vc1_mc.o vc1_pred.o vc1.o vc1data.o \
 | 
			
		||||
                                          vc1dsp.o \
 | 
			
		||||
OBJS-$(CONFIG_VC1_DECODER)             += vc1dec.o vc1.o vc1data.o vc1dsp.o \
 | 
			
		||||
                                          msmpeg4dec.o msmpeg4.o msmpeg4data.o \
 | 
			
		||||
                                          wmv2dsp.o
 | 
			
		||||
OBJS-$(CONFIG_VCR1_DECODER)            += vcr1.o
 | 
			
		||||
OBJS-$(CONFIG_VMDAUDIO_DECODER)        += vmdaudio.o
 | 
			
		||||
OBJS-$(CONFIG_VMDVIDEO_DECODER)        += vmdvideo.o
 | 
			
		||||
OBJS-$(CONFIG_VMDAUDIO_DECODER)        += vmdav.o
 | 
			
		||||
OBJS-$(CONFIG_VMDVIDEO_DECODER)        += vmdav.o
 | 
			
		||||
OBJS-$(CONFIG_VMNC_DECODER)            += vmnc.o
 | 
			
		||||
OBJS-$(CONFIG_VORBIS_DECODER)          += vorbisdec.o vorbisdsp.o vorbis.o \
 | 
			
		||||
                                          vorbis_data.o
 | 
			
		||||
                                          vorbis_data.o xiph.o
 | 
			
		||||
OBJS-$(CONFIG_VORBIS_ENCODER)          += vorbisenc.o vorbis.o \
 | 
			
		||||
                                          vorbis_data.o
 | 
			
		||||
OBJS-$(CONFIG_VP3_DECODER)             += vp3.o
 | 
			
		||||
@@ -495,7 +472,6 @@ OBJS-$(CONFIG_VP5_DECODER)             += vp5.o vp56.o vp56data.o vp56dsp.o \
 | 
			
		||||
                                          vp56rac.o
 | 
			
		||||
OBJS-$(CONFIG_VP6_DECODER)             += vp6.o vp56.o vp56data.o vp56dsp.o \
 | 
			
		||||
                                          vp6dsp.o vp56rac.o
 | 
			
		||||
OBJS-$(CONFIG_VP7_DECODER)             += vp8.o vp8dsp.o vp56rac.o
 | 
			
		||||
OBJS-$(CONFIG_VP8_DECODER)             += vp8.o vp8dsp.o vp56rac.o
 | 
			
		||||
OBJS-$(CONFIG_VP9_DECODER)             += vp9.o vp9dsp.o vp56rac.o
 | 
			
		||||
OBJS-$(CONFIG_VPLAYER_DECODER)         += textdec.o ass.o
 | 
			
		||||
@@ -504,8 +480,7 @@ OBJS-$(CONFIG_WAVPACK_DECODER)         += wavpack.o
 | 
			
		||||
OBJS-$(CONFIG_WAVPACK_ENCODER)         += wavpackenc.o
 | 
			
		||||
OBJS-$(CONFIG_WEBP_DECODER)            += vp8.o vp8dsp.o vp56rac.o
 | 
			
		||||
OBJS-$(CONFIG_WEBP_DECODER)            += webp.o exif.o tiff_common.o
 | 
			
		||||
OBJS-$(CONFIG_WEBVTT_DECODER)          += webvttdec.o ass.o
 | 
			
		||||
OBJS-$(CONFIG_WEBVTT_ENCODER)          += webvttenc.o ass_split.o
 | 
			
		||||
OBJS-$(CONFIG_WEBVTT_DECODER)          += webvttdec.o
 | 
			
		||||
OBJS-$(CONFIG_WMALOSSLESS_DECODER)     += wmalosslessdec.o wma_common.o
 | 
			
		||||
OBJS-$(CONFIG_WMAPRO_DECODER)          += wmaprodec.o wma.o wma_common.o
 | 
			
		||||
OBJS-$(CONFIG_WMAV1_DECODER)           += wmadec.o wma.o wma_common.o aactab.o
 | 
			
		||||
@@ -516,7 +491,6 @@ OBJS-$(CONFIG_WMAVOICE_DECODER)        += wmavoice.o \
 | 
			
		||||
                                          celp_filters.o \
 | 
			
		||||
                                          acelp_vectors.o acelp_filters.o
 | 
			
		||||
OBJS-$(CONFIG_WMV1_DECODER)            += msmpeg4dec.o msmpeg4.o msmpeg4data.o
 | 
			
		||||
OBJS-$(CONFIG_WMV1_ENCODER)            += msmpeg4enc.o
 | 
			
		||||
OBJS-$(CONFIG_WMV2_DECODER)            += wmv2dec.o wmv2.o wmv2dsp.o \
 | 
			
		||||
                                          msmpeg4dec.o msmpeg4.o msmpeg4data.o
 | 
			
		||||
OBJS-$(CONFIG_WMV2_ENCODER)            += wmv2enc.o wmv2.o wmv2dsp.o \
 | 
			
		||||
@@ -645,18 +619,12 @@ OBJS-$(CONFIG_ADPCM_SBPRO_4_DECODER)      += adpcm.o adpcm_data.o
 | 
			
		||||
OBJS-$(CONFIG_ADPCM_SWF_DECODER)          += adpcm.o adpcm_data.o
 | 
			
		||||
OBJS-$(CONFIG_ADPCM_SWF_ENCODER)          += adpcmenc.o adpcm_data.o
 | 
			
		||||
OBJS-$(CONFIG_ADPCM_THP_DECODER)          += adpcm.o adpcm_data.o
 | 
			
		||||
OBJS-$(CONFIG_ADPCM_VIMA_DECODER)         += vima.o adpcm_data.o
 | 
			
		||||
OBJS-$(CONFIG_ADPCM_XA_DECODER)           += adpcm.o adpcm_data.o
 | 
			
		||||
OBJS-$(CONFIG_ADPCM_YAMAHA_DECODER)       += adpcm.o adpcm_data.o
 | 
			
		||||
OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER)       += adpcmenc.o adpcm_data.o
 | 
			
		||||
OBJS-$(CONFIG_VIMA_DECODER)               += vima.o adpcm_data.o
 | 
			
		||||
 | 
			
		||||
# hardware accelerators
 | 
			
		||||
OBJS-$(CONFIG_DXVA2)                      += dxva2.o
 | 
			
		||||
OBJS-$(CONFIG_VAAPI)                      += vaapi.o
 | 
			
		||||
OBJS-$(CONFIG_VDA)                        += vda.o
 | 
			
		||||
OBJS-$(CONFIG_VDPAU)                      += vdpau.o
 | 
			
		||||
 | 
			
		||||
OBJS-$(CONFIG_H263_VAAPI_HWACCEL)         += vaapi_mpeg4.o vaapi_mpeg.o
 | 
			
		||||
OBJS-$(CONFIG_H263_VDPAU_HWACCEL)         += vdpau_mpeg4.o
 | 
			
		||||
OBJS-$(CONFIG_H264_DXVA2_HWACCEL)         += dxva2_h264.o
 | 
			
		||||
@@ -677,20 +645,24 @@ OBJS-$(CONFIG_VC1_VDPAU_HWACCEL)          += vdpau_vc1.o
 | 
			
		||||
 | 
			
		||||
# libavformat dependencies
 | 
			
		||||
OBJS-$(CONFIG_ADTS_MUXER)              += mpeg4audio.o
 | 
			
		||||
OBJS-$(CONFIG_ADX_DEMUXER)             += adx.o
 | 
			
		||||
OBJS-$(CONFIG_CAF_DEMUXER)             += mpeg4audio.o mpegaudiodata.o  \
 | 
			
		||||
                                          ac3tab.o
 | 
			
		||||
OBJS-$(CONFIG_FLAC_DEMUXER)            += flac.o flacdata.o vorbis_data.o
 | 
			
		||||
OBJS-$(CONFIG_DV_DEMUXER)              += dv_profile.o
 | 
			
		||||
OBJS-$(CONFIG_DV_MUXER)                += dv_profile.o
 | 
			
		||||
OBJS-$(CONFIG_FLAC_DEMUXER)            += flac.o flacdata.o vorbis_data.o \
 | 
			
		||||
                                          vorbis_parser.o xiph.o
 | 
			
		||||
OBJS-$(CONFIG_FLAC_MUXER)              += flac.o flacdata.o vorbis_data.o
 | 
			
		||||
OBJS-$(CONFIG_FLV_DEMUXER)             += mpeg4audio.o
 | 
			
		||||
OBJS-$(CONFIG_GXF_DEMUXER)             += mpeg12data.o
 | 
			
		||||
OBJS-$(CONFIG_IFF_DEMUXER)             += iff.o
 | 
			
		||||
OBJS-$(CONFIG_ISMV_MUXER)              += mpeg4audio.o mpegaudiodata.o
 | 
			
		||||
OBJS-$(CONFIG_LATM_MUXER)              += mpeg4audio.o
 | 
			
		||||
OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER)    += mpeg4audio.o vorbis_data.o    \
 | 
			
		||||
OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER)    += xiph.o mpeg4audio.o vorbis_data.o \
 | 
			
		||||
                                          flac.o flacdata.o
 | 
			
		||||
OBJS-$(CONFIG_MATROSKA_DEMUXER)        += mpeg4audio.o mpegaudiodata.o
 | 
			
		||||
OBJS-$(CONFIG_MATROSKA_MUXER)          += mpeg4audio.o mpegaudiodata.o  \
 | 
			
		||||
                                          flac.o flacdata.o vorbis_data.o
 | 
			
		||||
                                          flac.o flacdata.o vorbis_data.o xiph.o
 | 
			
		||||
OBJS-$(CONFIG_MP2_MUXER)               += mpegaudiodata.o mpegaudiodecheader.o
 | 
			
		||||
OBJS-$(CONFIG_MP3_MUXER)               += mpegaudiodata.o mpegaudiodecheader.o
 | 
			
		||||
OBJS-$(CONFIG_MOV_DEMUXER)             += mpeg4audio.o mpegaudiodata.o ac3tab.o
 | 
			
		||||
@@ -699,18 +671,18 @@ OBJS-$(CONFIG_MPEGTS_MUXER)            += mpeg4audio.o
 | 
			
		||||
OBJS-$(CONFIG_MPEGTS_DEMUXER)          += mpeg4audio.o mpegaudiodata.o
 | 
			
		||||
OBJS-$(CONFIG_MXF_MUXER)               += dnxhddata.o
 | 
			
		||||
OBJS-$(CONFIG_NUT_MUXER)               += mpegaudiodata.o
 | 
			
		||||
OBJS-$(CONFIG_OGA_MUXER)               += flac.o flacdata.o
 | 
			
		||||
OBJS-$(CONFIG_OGG_DEMUXER)             += mpeg12data.o \
 | 
			
		||||
OBJS-$(CONFIG_OGG_DEMUXER)             += xiph.o flac.o flacdata.o     \
 | 
			
		||||
                                          mpeg12data.o vorbis_parser.o \
 | 
			
		||||
                                          dirac.o vorbis_data.o
 | 
			
		||||
OBJS-$(CONFIG_OGG_MUXER)               += flac.o flacdata.o \
 | 
			
		||||
OBJS-$(CONFIG_OGG_MUXER)               += xiph.o flac.o flacdata.o \
 | 
			
		||||
                                          vorbis_data.o
 | 
			
		||||
OBJS-$(CONFIG_RTP_MUXER)               += mpeg4audio.o
 | 
			
		||||
OBJS-$(CONFIG_RTP_MUXER)               += mpeg4audio.o xiph.o
 | 
			
		||||
OBJS-$(CONFIG_RTPDEC)                  += mjpeg.o
 | 
			
		||||
OBJS-$(CONFIG_SPDIF_DEMUXER)           += aacadtsdec.o mpeg4audio.o
 | 
			
		||||
OBJS-$(CONFIG_SPDIF_MUXER)             += dca.o
 | 
			
		||||
OBJS-$(CONFIG_TAK_DEMUXER)             += tak.o
 | 
			
		||||
OBJS-$(CONFIG_WEBM_MUXER)              += mpeg4audio.o mpegaudiodata.o  \
 | 
			
		||||
                                          flac.o flacdata.o \
 | 
			
		||||
                                          xiph.o flac.o flacdata.o \
 | 
			
		||||
                                          vorbis_data.o
 | 
			
		||||
OBJS-$(CONFIG_WTV_DEMUXER)             += mpeg4audio.o mpegaudiodata.o
 | 
			
		||||
 | 
			
		||||
@@ -723,10 +695,10 @@ OBJS-$(CONFIG_LIBCELT_DECODER)            += libcelt_dec.o
 | 
			
		||||
OBJS-$(CONFIG_LIBFAAC_ENCODER)            += libfaac.o
 | 
			
		||||
OBJS-$(CONFIG_LIBFDK_AAC_DECODER)         += libfdk-aacdec.o
 | 
			
		||||
OBJS-$(CONFIG_LIBFDK_AAC_ENCODER)         += libfdk-aacenc.o
 | 
			
		||||
OBJS-$(CONFIG_LIBGSM_DECODER)             += libgsmdec.o
 | 
			
		||||
OBJS-$(CONFIG_LIBGSM_ENCODER)             += libgsmenc.o
 | 
			
		||||
OBJS-$(CONFIG_LIBGSM_MS_DECODER)          += libgsmdec.o
 | 
			
		||||
OBJS-$(CONFIG_LIBGSM_MS_ENCODER)          += libgsmenc.o
 | 
			
		||||
OBJS-$(CONFIG_LIBGSM_DECODER)             += libgsm.o
 | 
			
		||||
OBJS-$(CONFIG_LIBGSM_ENCODER)             += libgsm.o
 | 
			
		||||
OBJS-$(CONFIG_LIBGSM_MS_DECODER)          += libgsm.o
 | 
			
		||||
OBJS-$(CONFIG_LIBGSM_MS_ENCODER)          += libgsm.o
 | 
			
		||||
OBJS-$(CONFIG_LIBILBC_DECODER)            += libilbc.o
 | 
			
		||||
OBJS-$(CONFIG_LIBILBC_ENCODER)            += libilbc.o
 | 
			
		||||
OBJS-$(CONFIG_LIBMP3LAME_ENCODER)         += libmp3lame.o mpegaudiodecheader.o
 | 
			
		||||
@@ -755,7 +727,7 @@ OBJS-$(CONFIG_LIBVO_AACENC_ENCODER)       += libvo-aacenc.o mpeg4audio.o
 | 
			
		||||
OBJS-$(CONFIG_LIBVO_AMRWBENC_ENCODER)     += libvo-amrwbenc.o
 | 
			
		||||
OBJS-$(CONFIG_LIBVORBIS_DECODER)          += libvorbisdec.o
 | 
			
		||||
OBJS-$(CONFIG_LIBVORBIS_ENCODER)          += libvorbisenc.o \
 | 
			
		||||
                                             vorbis_data.o
 | 
			
		||||
                                             vorbis_data.o vorbis_parser.o xiph.o
 | 
			
		||||
OBJS-$(CONFIG_LIBVPX_VP8_DECODER)         += libvpxdec.o
 | 
			
		||||
OBJS-$(CONFIG_LIBVPX_VP8_ENCODER)         += libvpxenc.o
 | 
			
		||||
OBJS-$(CONFIG_LIBVPX_VP9_DECODER)         += libvpxdec.o libvpx.o
 | 
			
		||||
@@ -790,7 +762,11 @@ OBJS-$(CONFIG_FLAC_PARSER)             += flac_parser.o flacdata.o flac.o \
 | 
			
		||||
OBJS-$(CONFIG_GSM_PARSER)              += gsm_parser.o
 | 
			
		||||
OBJS-$(CONFIG_H261_PARSER)             += h261_parser.o
 | 
			
		||||
OBJS-$(CONFIG_H263_PARSER)             += h263_parser.o
 | 
			
		||||
OBJS-$(CONFIG_H264_PARSER)             += h264_parser.o
 | 
			
		||||
OBJS-$(CONFIG_H264_PARSER)             += h264_parser.o h264.o            \
 | 
			
		||||
                                          cabac.o                         \
 | 
			
		||||
                                          h264_refs.o h264_sei.o h264_direct.o \
 | 
			
		||||
                                          h264_loopfilter.o h264_cabac.o \
 | 
			
		||||
                                          h264_cavlc.o h264_ps.o
 | 
			
		||||
OBJS-$(CONFIG_HEVC_PARSER)             += hevc_parser.o
 | 
			
		||||
OBJS-$(CONFIG_MJPEG_PARSER)            += mjpeg_parser.o
 | 
			
		||||
OBJS-$(CONFIG_MLP_PARSER)              += mlp_parser.o mlp.o
 | 
			
		||||
@@ -802,15 +778,15 @@ OBJS-$(CONFIG_MPEGAUDIO_PARSER)        += mpegaudio_parser.o \
 | 
			
		||||
                                          mpegaudiodecheader.o mpegaudiodata.o
 | 
			
		||||
OBJS-$(CONFIG_MPEGVIDEO_PARSER)        += mpegvideo_parser.o    \
 | 
			
		||||
                                          mpeg12.o mpeg12data.o
 | 
			
		||||
OBJS-$(CONFIG_OPUS_PARSER)             += opus_parser.o opus.o vorbis_data.o
 | 
			
		||||
OBJS-$(CONFIG_PNG_PARSER)              += png_parser.o
 | 
			
		||||
OBJS-$(CONFIG_PNM_PARSER)              += pnm_parser.o pnm.o
 | 
			
		||||
OBJS-$(CONFIG_RV30_PARSER)             += rv34_parser.o
 | 
			
		||||
OBJS-$(CONFIG_RV40_PARSER)             += rv34_parser.o
 | 
			
		||||
OBJS-$(CONFIG_TAK_PARSER)              += tak_parser.o tak.o
 | 
			
		||||
OBJS-$(CONFIG_VC1_PARSER)              += vc1_parser.o vc1.o vc1data.o vc1dsp.o \
 | 
			
		||||
OBJS-$(CONFIG_VC1_PARSER)              += vc1_parser.o vc1.o vc1data.o \
 | 
			
		||||
                                          msmpeg4.o msmpeg4data.o mpeg4video.o \
 | 
			
		||||
                                          h263.o
 | 
			
		||||
OBJS-$(CONFIG_VORBIS_PARSER)           += vorbis_parser.o xiph.o
 | 
			
		||||
OBJS-$(CONFIG_VP3_PARSER)              += vp3_parser.o
 | 
			
		||||
OBJS-$(CONFIG_VP8_PARSER)              += vp8_parser.o
 | 
			
		||||
OBJS-$(CONFIG_VP9_PARSER)              += vp9_parser.o
 | 
			
		||||
@@ -844,7 +820,6 @@ SKIPHEADERS                            += %_tablegen.h                  \
 | 
			
		||||
                                          %_tables.h                    \
 | 
			
		||||
                                          aac_tablegen_decl.h           \
 | 
			
		||||
                                          fft-internal.h                \
 | 
			
		||||
                                          libutvideo.h                  \
 | 
			
		||||
                                          old_codec_ids.h               \
 | 
			
		||||
                                          tableprint.h                  \
 | 
			
		||||
                                          $(ARCH)/vp56_arith.h          \
 | 
			
		||||
@@ -854,31 +829,29 @@ SKIPHEADERS-$(CONFIG_LIBSCHROEDINGER)  += libschroedinger.h
 | 
			
		||||
SKIPHEADERS-$(CONFIG_LIBUTVIDEO)       += libutvideo.h
 | 
			
		||||
SKIPHEADERS-$(CONFIG_XVMC)             += xvmc.h
 | 
			
		||||
SKIPHEADERS-$(CONFIG_VAAPI)            += vaapi_internal.h
 | 
			
		||||
SKIPHEADERS-$(CONFIG_VDA)              += vda.h vda_internal.h
 | 
			
		||||
SKIPHEADERS-$(CONFIG_VDA)              += vda.h
 | 
			
		||||
SKIPHEADERS-$(CONFIG_VDPAU)            += vdpau.h vdpau_internal.h
 | 
			
		||||
 | 
			
		||||
TESTPROGS = imgconvert                                                  \
 | 
			
		||||
TESTPROGS = cabac                                                       \
 | 
			
		||||
            fft                                                         \
 | 
			
		||||
            fft-fixed                                                   \
 | 
			
		||||
            fft-fixed32                                                 \
 | 
			
		||||
            golomb                                                      \
 | 
			
		||||
            iirfilter                                                   \
 | 
			
		||||
            imgconvert                                                  \
 | 
			
		||||
            rangecoder                                                  \
 | 
			
		||||
            snowenc                                                     \
 | 
			
		||||
 | 
			
		||||
TESTPROGS-$(CONFIG_CABAC)                 += cabac
 | 
			
		||||
TESTPROGS-$(CONFIG_FFT)                   += fft fft-fixed fft-fixed32
 | 
			
		||||
TESTPROGS-$(CONFIG_IDCTDSP)               += dct
 | 
			
		||||
TESTPROGS-$(CONFIG_IIRFILTER)             += iirfilter
 | 
			
		||||
TESTPROGS-$(CONFIG_DCT) += dct
 | 
			
		||||
TESTPROGS-$(HAVE_MMX) += motion
 | 
			
		||||
TESTPROGS-$(CONFIG_GOLOMB)                += golomb
 | 
			
		||||
TESTPROGS-$(CONFIG_RANGECODER)            += rangecoder
 | 
			
		||||
TESTPROGS-$(CONFIG_SNOW_ENCODER)          += snowenc
 | 
			
		||||
 | 
			
		||||
TESTOBJS = dctref.o
 | 
			
		||||
 | 
			
		||||
TOOLS = fourcc2pixfmt
 | 
			
		||||
 | 
			
		||||
HOSTPROGS = aac_tablegen                                                \
 | 
			
		||||
            aacps_tablegen                                              \
 | 
			
		||||
            aacsbr_tablegen                                             \
 | 
			
		||||
            cabac_tablegen                                              \
 | 
			
		||||
            cbrt_tablegen                                               \
 | 
			
		||||
            cos_tablegen                                                \
 | 
			
		||||
            dsd_tablegen                                                \
 | 
			
		||||
            dv_tablegen                                                 \
 | 
			
		||||
            motionpixels_tablegen                                       \
 | 
			
		||||
            mpegaudio_tablegen                                          \
 | 
			
		||||
@@ -903,7 +876,7 @@ else
 | 
			
		||||
$(SUBDIR)%_tablegen$(HOSTEXESUF): HOSTCFLAGS += -DCONFIG_SMALL=0
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
GEN_HEADERS = cabac_tables.h cbrt_tables.h aacps_tables.h aacsbr_tables.h aac_tables.h dsd_tables.h dv_tables.h     \
 | 
			
		||||
GEN_HEADERS = cbrt_tables.h aacps_tables.h aac_tables.h dv_tables.h     \
 | 
			
		||||
              sinewin_tables.h mpegaudio_tables.h motionpixels_tables.h \
 | 
			
		||||
              pcm_tables.h qdm2_tables.h
 | 
			
		||||
GEN_HEADERS := $(addprefix $(SUBDIR), $(GEN_HEADERS))
 | 
			
		||||
@@ -914,10 +887,7 @@ $(GEN_HEADERS): $(SUBDIR)%_tables.h: $(SUBDIR)%_tablegen$(HOSTEXESUF)
 | 
			
		||||
ifdef CONFIG_HARDCODED_TABLES
 | 
			
		||||
$(SUBDIR)aacdec.o: $(SUBDIR)cbrt_tables.h
 | 
			
		||||
$(SUBDIR)aacps.o: $(SUBDIR)aacps_tables.h
 | 
			
		||||
$(SUBDIR)aacsbr.o: $(SUBDIR)aacsbr_tables.h
 | 
			
		||||
$(SUBDIR)aactab.o: $(SUBDIR)aac_tables.h
 | 
			
		||||
$(SUBDIR)cabac.o: $(SUBDIR)cabac_tables.h
 | 
			
		||||
$(SUBDIR)dsddec.o: $(SUBDIR)dsd_tables.h
 | 
			
		||||
$(SUBDIR)dvenc.o: $(SUBDIR)dv_tables.h
 | 
			
		||||
$(SUBDIR)sinewin.o: $(SUBDIR)sinewin_tables.h
 | 
			
		||||
$(SUBDIR)mpegaudiodec_fixed.o: $(SUBDIR)mpegaudio_tables.h
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,6 @@
 | 
			
		||||
#include "a64tables.h"
 | 
			
		||||
#include "elbg.h"
 | 
			
		||||
#include "internal.h"
 | 
			
		||||
#include "libavutil/avassert.h"
 | 
			
		||||
#include "libavutil/common.h"
 | 
			
		||||
#include "libavutil/intreadwrite.h"
 | 
			
		||||
 | 
			
		||||
@@ -66,7 +65,7 @@ static const int mc_colors[5]={0x0,0xb,0xc,0xf,0x1};
 | 
			
		||||
//static const int mc_colors[5]={0x0,0x8,0xa,0xf,0x7};
 | 
			
		||||
//static const int mc_colors[5]={0x0,0x9,0x8,0xa,0x3};
 | 
			
		||||
 | 
			
		||||
static void to_meta_with_crop(AVCodecContext *avctx, const AVFrame *p, int *dest)
 | 
			
		||||
static void to_meta_with_crop(AVCodecContext *avctx, AVFrame *p, int *dest)
 | 
			
		||||
{
 | 
			
		||||
    int blockx, blocky, x, y;
 | 
			
		||||
    int luma = 0;
 | 
			
		||||
@@ -79,13 +78,9 @@ static void to_meta_with_crop(AVCodecContext *avctx, const AVFrame *p, int *dest
 | 
			
		||||
            for (y = blocky; y < blocky + 8 && y < C64YRES; y++) {
 | 
			
		||||
                for (x = blockx; x < blockx + 8 && x < C64XRES; x += 2) {
 | 
			
		||||
                    if(x < width && y < height) {
 | 
			
		||||
                        if (x + 1 < width) {
 | 
			
		||||
                        /* build average over 2 pixels */
 | 
			
		||||
                        luma = (src[(x + 0 + y * p->linesize[0])] +
 | 
			
		||||
                                src[(x + 1 + y * p->linesize[0])]) / 2;
 | 
			
		||||
                        } else {
 | 
			
		||||
                            luma = src[(x + y * p->linesize[0])];
 | 
			
		||||
                        }
 | 
			
		||||
                        /* write blocks as linear data now so they are suitable for elbg */
 | 
			
		||||
                        dest[0] = luma;
 | 
			
		||||
                    }
 | 
			
		||||
@@ -191,11 +186,12 @@ static void render_charset(AVCodecContext *avctx, uint8_t *charset,
 | 
			
		||||
static av_cold int a64multi_close_encoder(AVCodecContext *avctx)
 | 
			
		||||
{
 | 
			
		||||
    A64Context *c = avctx->priv_data;
 | 
			
		||||
    av_freep(&c->mc_meta_charset);
 | 
			
		||||
    av_freep(&c->mc_best_cb);
 | 
			
		||||
    av_freep(&c->mc_charset);
 | 
			
		||||
    av_freep(&c->mc_charmap);
 | 
			
		||||
    av_freep(&c->mc_colram);
 | 
			
		||||
    av_frame_free(&avctx->coded_frame);
 | 
			
		||||
    av_free(c->mc_meta_charset);
 | 
			
		||||
    av_free(c->mc_best_cb);
 | 
			
		||||
    av_free(c->mc_charset);
 | 
			
		||||
    av_free(c->mc_charmap);
 | 
			
		||||
    av_free(c->mc_colram);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -224,9 +220,9 @@ static av_cold int a64multi_encode_init(AVCodecContext *avctx)
 | 
			
		||||
                           a64_palette[mc_colors[a]][2] * 0.11;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!(c->mc_meta_charset = av_mallocz_array(c->mc_lifetime, 32000 * sizeof(int))) ||
 | 
			
		||||
    if (!(c->mc_meta_charset = av_malloc(32000 * c->mc_lifetime * sizeof(int))) ||
 | 
			
		||||
       !(c->mc_best_cb       = av_malloc(CHARSET_CHARS * 32 * sizeof(int)))     ||
 | 
			
		||||
       !(c->mc_charmap       = av_mallocz_array(c->mc_lifetime, 1000 * sizeof(int))) ||
 | 
			
		||||
       !(c->mc_charmap       = av_mallocz(1000 * c->mc_lifetime * sizeof(int))) ||
 | 
			
		||||
       !(c->mc_colram        = av_mallocz(CHARSET_CHARS * sizeof(uint8_t)))     ||
 | 
			
		||||
       !(c->mc_charset       = av_malloc(0x800 * (INTERLACED+1) * sizeof(uint8_t)))) {
 | 
			
		||||
        av_log(avctx, AV_LOG_ERROR, "Failed to allocate buffer memory.\n");
 | 
			
		||||
@@ -242,6 +238,14 @@ static av_cold int a64multi_encode_init(AVCodecContext *avctx)
 | 
			
		||||
    AV_WB32(avctx->extradata, c->mc_lifetime);
 | 
			
		||||
    AV_WB32(avctx->extradata + 16, INTERLACED);
 | 
			
		||||
 | 
			
		||||
    avctx->coded_frame = av_frame_alloc();
 | 
			
		||||
    if (!avctx->coded_frame) {
 | 
			
		||||
        a64multi_close_encoder(avctx);
 | 
			
		||||
        return AVERROR(ENOMEM);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
 | 
			
		||||
    avctx->coded_frame->key_frame = 1;
 | 
			
		||||
    if (!avctx->codec_tag)
 | 
			
		||||
         avctx->codec_tag = AV_RL32("a64m");
 | 
			
		||||
 | 
			
		||||
@@ -266,9 +270,10 @@ static void a64_compress_colram(unsigned char *buf, int *charmap, uint8_t *colra
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int a64multi_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
 | 
			
		||||
                                 const AVFrame *p, int *got_packet)
 | 
			
		||||
                                 const AVFrame *pict, int *got_packet)
 | 
			
		||||
{
 | 
			
		||||
    A64Context *c = avctx->priv_data;
 | 
			
		||||
    AVFrame *const p = avctx->coded_frame;
 | 
			
		||||
 | 
			
		||||
    int frame;
 | 
			
		||||
    int x, y;
 | 
			
		||||
@@ -299,7 +304,7 @@ static int a64multi_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* no data, means end encoding asap */
 | 
			
		||||
    if (!p) {
 | 
			
		||||
    if (!pict) {
 | 
			
		||||
        /* all done, end encoding */
 | 
			
		||||
        if (!c->mc_lifetime) return 0;
 | 
			
		||||
        /* no more frames in queue, prepare to flush remaining frames */
 | 
			
		||||
@@ -312,10 +317,13 @@ static int a64multi_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
 | 
			
		||||
    } else {
 | 
			
		||||
        /* fill up mc_meta_charset with data until lifetime exceeds */
 | 
			
		||||
        if (c->mc_frame_counter < c->mc_lifetime) {
 | 
			
		||||
            *p = *pict;
 | 
			
		||||
            p->pict_type = AV_PICTURE_TYPE_I;
 | 
			
		||||
            p->key_frame = 1;
 | 
			
		||||
            to_meta_with_crop(avctx, p, meta + 32000 * c->mc_frame_counter);
 | 
			
		||||
            c->mc_frame_counter++;
 | 
			
		||||
            if (c->next_pts == AV_NOPTS_VALUE)
 | 
			
		||||
                c->next_pts = p->pts;
 | 
			
		||||
                c->next_pts = pict->pts;
 | 
			
		||||
            /* lifetime is not reached so wait for next frame first */
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
@@ -326,8 +334,8 @@ static int a64multi_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
 | 
			
		||||
        req_size = 0;
 | 
			
		||||
        /* any frames to encode? */
 | 
			
		||||
        if (c->mc_lifetime) {
 | 
			
		||||
            int alloc_size = charset_size + c->mc_lifetime*(screen_size + colram_size);
 | 
			
		||||
            if ((ret = ff_alloc_packet2(avctx, pkt, alloc_size)) < 0)
 | 
			
		||||
            req_size = charset_size + c->mc_lifetime*(screen_size + colram_size);
 | 
			
		||||
            if ((ret = ff_alloc_packet2(avctx, pkt, req_size)) < 0)
 | 
			
		||||
                return ret;
 | 
			
		||||
            buf = pkt->data;
 | 
			
		||||
 | 
			
		||||
@@ -343,7 +351,7 @@ static int a64multi_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
 | 
			
		||||
 | 
			
		||||
            /* advance pointers */
 | 
			
		||||
            buf      += charset_size;
 | 
			
		||||
            req_size += charset_size;
 | 
			
		||||
            charset  += charset_size;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* write x frames to buf */
 | 
			
		||||
@@ -380,7 +388,6 @@ static int a64multi_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
 | 
			
		||||
        pkt->pts = pkt->dts = c->next_pts;
 | 
			
		||||
        c->next_pts         = AV_NOPTS_VALUE;
 | 
			
		||||
 | 
			
		||||
        av_assert0(pkt->size >= req_size);
 | 
			
		||||
        pkt->size   = req_size;
 | 
			
		||||
        pkt->flags |= AV_PKT_FLAG_KEY;
 | 
			
		||||
        *got_packet = !!req_size;
 | 
			
		||||
 
 | 
			
		||||
@@ -245,7 +245,6 @@ typedef struct SingleChannelElement {
 | 
			
		||||
 * channel element - generic struct for SCE/CPE/CCE/LFE
 | 
			
		||||
 */
 | 
			
		||||
typedef struct ChannelElement {
 | 
			
		||||
    int present;
 | 
			
		||||
    // CPE specific
 | 
			
		||||
    int common_window;        ///< Set if channels share a common 'IndividualChannelStream' in bitstream.
 | 
			
		||||
    int     ms_mode;          ///< Signals mid/side stereo flags coding mode (used by encoder)
 | 
			
		||||
@@ -275,7 +274,6 @@ struct AACContext {
 | 
			
		||||
    ChannelElement          *che[4][MAX_ELEM_ID];
 | 
			
		||||
    ChannelElement  *tag_che_map[4][MAX_ELEM_ID];
 | 
			
		||||
    int tags_mapped;
 | 
			
		||||
    int warned_remapping_once;
 | 
			
		||||
    /** @} */
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -295,7 +293,7 @@ struct AACContext {
 | 
			
		||||
    FFTContext mdct_ld;
 | 
			
		||||
    FFTContext mdct_ltp;
 | 
			
		||||
    FmtConvertContext fmt_conv;
 | 
			
		||||
    AVFloatDSPContext *fdsp;
 | 
			
		||||
    AVFloatDSPContext fdsp;
 | 
			
		||||
    int random_state;
 | 
			
		||||
    /** @} */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@ static int aac_adtstoasc_filter(AVBitStreamFilterContext *bsfc,
 | 
			
		||||
 | 
			
		||||
    if (avpriv_aac_parse_header(&gb, &hdr) < 0) {
 | 
			
		||||
        av_log(avctx, AV_LOG_ERROR, "Error parsing ADTS frame header!\n");
 | 
			
		||||
        return AVERROR_INVALIDDATA;
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!hdr.crc_absent && hdr.num_aac_frames > 1) {
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,7 @@ static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info,
 | 
			
		||||
    int size;
 | 
			
		||||
    union {
 | 
			
		||||
        uint64_t u64;
 | 
			
		||||
        uint8_t  u8[8 + FF_INPUT_BUFFER_PADDING_SIZE];
 | 
			
		||||
        uint8_t  u8[8];
 | 
			
		||||
    } tmp;
 | 
			
		||||
 | 
			
		||||
    tmp.u64 = av_be2ne64(state);
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@
 | 
			
		||||
#include "libavutil/mathematics.h"
 | 
			
		||||
float ff_aac_pow2sf_tab[428];
 | 
			
		||||
 | 
			
		||||
av_cold void ff_aac_tableinit(void)
 | 
			
		||||
void ff_aac_tableinit(void)
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
    for (i = 0; i < 428; i++)
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user