mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-12-07 23:40:01 +01:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3dc88e1fd6 | ||
|
|
4e2cab5a79 | ||
|
|
1dab67b647 | ||
|
|
0d4549c2d6 | ||
|
|
c741eb7d88 |
67
.gitignore
vendored
67
.gitignore
vendored
@@ -1,6 +1,5 @@
|
|||||||
*.a
|
*.a
|
||||||
*.o
|
*.o
|
||||||
*.o.*
|
|
||||||
*.d
|
*.d
|
||||||
*.def
|
*.def
|
||||||
*.dll
|
*.dll
|
||||||
@@ -18,9 +17,9 @@
|
|||||||
*.so.*
|
*.so.*
|
||||||
*.swp
|
*.swp
|
||||||
*.ver
|
*.ver
|
||||||
|
*-example
|
||||||
|
*-test
|
||||||
*_g
|
*_g
|
||||||
\#*
|
|
||||||
.\#*
|
|
||||||
/.config
|
/.config
|
||||||
/.version
|
/.version
|
||||||
/ffmpeg
|
/ffmpeg
|
||||||
@@ -29,7 +28,63 @@
|
|||||||
/ffserver
|
/ffserver
|
||||||
/config.*
|
/config.*
|
||||||
/coverage.info
|
/coverage.info
|
||||||
/avversion.h
|
/doc/*.1
|
||||||
|
/doc/*.3
|
||||||
|
/doc/*.html
|
||||||
|
/doc/*.pod
|
||||||
|
/doc/config.texi
|
||||||
|
/doc/avoptions_codec.texi
|
||||||
|
/doc/avoptions_format.texi
|
||||||
|
/doc/doxy/html/
|
||||||
|
/doc/examples/avio_reading
|
||||||
|
/doc/examples/decoding_encoding
|
||||||
|
/doc/examples/demuxing_decoding
|
||||||
|
/doc/examples/extract_mvs
|
||||||
|
/doc/examples/filter_audio
|
||||||
|
/doc/examples/filtering_audio
|
||||||
|
/doc/examples/filtering_video
|
||||||
|
/doc/examples/metadata
|
||||||
|
/doc/examples/muxing
|
||||||
|
/doc/examples/pc-uninstalled
|
||||||
|
/doc/examples/remuxing
|
||||||
|
/doc/examples/resampling_audio
|
||||||
|
/doc/examples/scaling_video
|
||||||
|
/doc/examples/transcode_aac
|
||||||
|
/doc/examples/transcoding
|
||||||
|
/doc/fate.txt
|
||||||
|
/doc/print_options
|
||||||
/lcov/
|
/lcov/
|
||||||
/src
|
/libavcodec/*_tablegen
|
||||||
/mapfile
|
/libavcodec/*_tables.c
|
||||||
|
/libavcodec/*_tables.h
|
||||||
|
/libavutil/avconfig.h
|
||||||
|
/libavutil/ffversion.h
|
||||||
|
/tests/audiogen
|
||||||
|
/tests/base64
|
||||||
|
/tests/data/
|
||||||
|
/tests/pixfmts.mak
|
||||||
|
/tests/rotozoom
|
||||||
|
/tests/test_copy.ffmeta
|
||||||
|
/tests/tiny_psnr
|
||||||
|
/tests/tiny_ssim
|
||||||
|
/tests/videogen
|
||||||
|
/tests/vsynth1/
|
||||||
|
/tools/aviocat
|
||||||
|
/tools/ffbisect
|
||||||
|
/tools/bisect.need
|
||||||
|
/tools/crypto_bench
|
||||||
|
/tools/cws2fws
|
||||||
|
/tools/fourcc2pixfmt
|
||||||
|
/tools/ffescape
|
||||||
|
/tools/ffeval
|
||||||
|
/tools/ffhash
|
||||||
|
/tools/graph2dot
|
||||||
|
/tools/ismindex
|
||||||
|
/tools/pktdumper
|
||||||
|
/tools/probetest
|
||||||
|
/tools/qt-faststart
|
||||||
|
/tools/sidxindex
|
||||||
|
/tools/trasher
|
||||||
|
/tools/seek_print
|
||||||
|
/tools/uncoded_frame
|
||||||
|
/tools/zmqsend
|
||||||
|
|||||||
26
.travis.yml
26
.travis.yml
@@ -1,26 +0,0 @@
|
|||||||
language: c
|
|
||||||
sudo: false
|
|
||||||
os:
|
|
||||||
- linux
|
|
||||||
- osx
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- yasm
|
|
||||||
- diffutils
|
|
||||||
compiler:
|
|
||||||
- clang
|
|
||||||
- gcc
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- ffmpeg-samples
|
|
||||||
before_install:
|
|
||||||
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update --all; fi
|
|
||||||
install:
|
|
||||||
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install yasm; fi
|
|
||||||
script:
|
|
||||||
- mkdir -p ffmpeg-samples
|
|
||||||
- ./configure --samples=ffmpeg-samples --cc=$CC
|
|
||||||
- make -j 8
|
|
||||||
- make fate-rsync
|
|
||||||
- make check -j 8
|
|
||||||
196
Changelog
196
Changelog
@@ -1,193 +1,6 @@
|
|||||||
Entries are sorted chronologically from oldest to youngest within each release,
|
Entries are sorted chronologically from oldest to youngest within each release,
|
||||||
releases are sorted from youngest to oldest.
|
releases are sorted from youngest to oldest.
|
||||||
|
|
||||||
version <next>:
|
|
||||||
- YUY2 Lossless Codec decoder
|
|
||||||
|
|
||||||
|
|
||||||
version 3.1:
|
|
||||||
- DXVA2-accelerated HEVC Main10 decoding
|
|
||||||
- fieldhint filter
|
|
||||||
- loop video filter and aloop audio filter
|
|
||||||
- Bob Weaver deinterlacing filter
|
|
||||||
- firequalizer filter
|
|
||||||
- datascope filter
|
|
||||||
- bench and abench filters
|
|
||||||
- ciescope filter
|
|
||||||
- protocol blacklisting API
|
|
||||||
- MediaCodec H264 decoding
|
|
||||||
- VC-2 HQ RTP payload format (draft v1) depacketizer and packetizer
|
|
||||||
- VP9 RTP payload format (draft v2) packetizer
|
|
||||||
- AudioToolbox audio decoders
|
|
||||||
- AudioToolbox audio encoders
|
|
||||||
- coreimage filter (GPU based image filtering on OSX)
|
|
||||||
- libdcadec removed
|
|
||||||
- bitstream filter for extracting DTS core
|
|
||||||
- ADPCM IMA DAT4 decoder
|
|
||||||
- musx demuxer
|
|
||||||
- aix demuxer
|
|
||||||
- remap filter
|
|
||||||
- hash and framehash muxers
|
|
||||||
- colorspace filter
|
|
||||||
- hdcd filter
|
|
||||||
- readvitc filter
|
|
||||||
- VAAPI-accelerated format conversion and scaling
|
|
||||||
- libnpp/CUDA-accelerated format conversion and scaling
|
|
||||||
- Duck TrueMotion 2.0 Real Time decoder
|
|
||||||
- Wideband Single-bit Data (WSD) demuxer
|
|
||||||
- VAAPI-accelerated H.264/HEVC/MJPEG encoding
|
|
||||||
- DTS Express (LBR) decoder
|
|
||||||
- Generic OpenMAX IL encoder with support for Raspberry Pi
|
|
||||||
- IFF ANIM demuxer & decoder
|
|
||||||
- Direct Stream Transfer (DST) decoder
|
|
||||||
- loudnorm filter
|
|
||||||
- MTAF demuxer and decoder
|
|
||||||
- MagicYUV decoder
|
|
||||||
- OpenExr improvements (tile data and B44/B44A support)
|
|
||||||
- BitJazz SheerVideo decoder
|
|
||||||
- CUDA CUVID H264/HEVC decoder
|
|
||||||
- 10-bit depth support in native utvideo decoder
|
|
||||||
- libutvideo wrapper removed
|
|
||||||
|
|
||||||
|
|
||||||
version 3.0:
|
|
||||||
- Common Encryption (CENC) MP4 encoding and decoding support
|
|
||||||
- DXV decoding
|
|
||||||
- extrastereo filter
|
|
||||||
- ocr filter
|
|
||||||
- alimiter filter
|
|
||||||
- stereowiden filter
|
|
||||||
- stereotools filter
|
|
||||||
- rubberband filter
|
|
||||||
- tremolo filter
|
|
||||||
- agate filter
|
|
||||||
- chromakey filter
|
|
||||||
- maskedmerge filter
|
|
||||||
- Screenpresso SPV1 decoding
|
|
||||||
- chromaprint fingerprinting muxer
|
|
||||||
- ffplay dynamic volume control
|
|
||||||
- displace filter
|
|
||||||
- selectivecolor filter
|
|
||||||
- extensive native AAC encoder improvements and removal of experimental flag
|
|
||||||
- ADPCM PSX decoder
|
|
||||||
- 3dostr, dcstr, fsb, genh, vag, xvag, ads, msf, svag & vpk demuxer
|
|
||||||
- zscale filter
|
|
||||||
- wve demuxer
|
|
||||||
- zero-copy Intel QSV transcoding in ffmpeg
|
|
||||||
- shuffleframes filter
|
|
||||||
- SDX2 DPCM decoder
|
|
||||||
- vibrato filter
|
|
||||||
- innoHeim/Rsupport Screen Capture Codec decoder
|
|
||||||
- ADPCM AICA decoder
|
|
||||||
- Interplay ACM demuxer and audio decoder
|
|
||||||
- XMA1 & XMA2 decoder
|
|
||||||
- realtime filter
|
|
||||||
- anoisesrc audio filter source
|
|
||||||
- IVR demuxer
|
|
||||||
- compensationdelay filter
|
|
||||||
- acompressor filter
|
|
||||||
- support encoding 16-bit RLE SGI images
|
|
||||||
- apulsator filter
|
|
||||||
- sidechaingate audio filter
|
|
||||||
- mipsdspr1 option has been renamed to mipsdsp
|
|
||||||
- aemphasis filter
|
|
||||||
- mips32r5 option has been removed
|
|
||||||
- mips64r6 option has been removed
|
|
||||||
- DXVA2-accelerated VP9 decoding
|
|
||||||
- SOFAlizer: virtual binaural acoustics filter
|
|
||||||
- VAAPI VP9 hwaccel
|
|
||||||
- audio high-order multiband parametric equalizer
|
|
||||||
- automatic bitstream filtering
|
|
||||||
- showspectrumpic filter
|
|
||||||
- libstagefright support removed
|
|
||||||
- spectrumsynth filter
|
|
||||||
- ahistogram filter
|
|
||||||
- only seek with the right mouse button in ffplay
|
|
||||||
- toggle full screen when double-clicking with the left mouse button in ffplay
|
|
||||||
- afftfilt filter
|
|
||||||
- convolution filter
|
|
||||||
- libquvi support removed
|
|
||||||
- support for dvaudio in wav and avi
|
|
||||||
- libaacplus and libvo-aacenc support removed
|
|
||||||
- Cineform HD decoder
|
|
||||||
- new DCA decoder with full support for DTS-HD extensions
|
|
||||||
- significant performance improvements in Windows Television (WTV) demuxer
|
|
||||||
- nnedi deinterlacer
|
|
||||||
- streamselect video and astreamselect audio filter
|
|
||||||
- swaprect filter
|
|
||||||
- metadata video and ametadata audio filter
|
|
||||||
- SMPTE VC-2 HQ profile support for the Dirac decoder
|
|
||||||
- SMPTE VC-2 native encoder supporting the HQ profile
|
|
||||||
|
|
||||||
|
|
||||||
version 2.8:
|
|
||||||
- colorkey video filter
|
|
||||||
- BFSTM/BCSTM demuxer
|
|
||||||
- little-endian ADPCM_THP decoder
|
|
||||||
- Hap decoder and encoder
|
|
||||||
- DirectDraw Surface image/texture decoder
|
|
||||||
- ssim filter
|
|
||||||
- optional new ASF demuxer
|
|
||||||
- showvolume filter
|
|
||||||
- Many improvements to the JPEG 2000 decoder
|
|
||||||
- Go2Meeting decoding support
|
|
||||||
- adrawgraph audio and drawgraph video filter
|
|
||||||
- removegrain video filter
|
|
||||||
- Intel QSV-accelerated MPEG-2 video and HEVC encoding
|
|
||||||
- Intel QSV-accelerated MPEG-2 video and HEVC decoding
|
|
||||||
- Intel QSV-accelerated VC-1 video decoding
|
|
||||||
- libkvazaar HEVC encoder
|
|
||||||
- erosion, dilation, deflate and inflate video filters
|
|
||||||
- Dynamic Audio Normalizer as dynaudnorm filter
|
|
||||||
- Reverse video and areverse audio filter
|
|
||||||
- Random filter
|
|
||||||
- deband filter
|
|
||||||
- AAC fixed-point decoding
|
|
||||||
- sidechaincompress audio filter
|
|
||||||
- bitstream filter for converting HEVC from MP4 to Annex B
|
|
||||||
- acrossfade audio filter
|
|
||||||
- allyuv and allrgb video sources
|
|
||||||
- atadenoise video filter
|
|
||||||
- OS X VideoToolbox support
|
|
||||||
- aphasemeter filter
|
|
||||||
- showfreqs filter
|
|
||||||
- vectorscope filter
|
|
||||||
- waveform filter
|
|
||||||
- hstack and vstack filter
|
|
||||||
- Support DNx100 (1440x1080@8)
|
|
||||||
- VAAPI hevc hwaccel
|
|
||||||
- VDPAU hevc hwaccel
|
|
||||||
- framerate filter
|
|
||||||
- Switched default encoders for webm to VP9 and Opus
|
|
||||||
- Removed experimental flag from the JPEG 2000 encoder
|
|
||||||
|
|
||||||
|
|
||||||
version 2.7:
|
|
||||||
- FFT video filter
|
|
||||||
- TDSC decoder
|
|
||||||
- DTS lossless extension (XLL) decoding (not lossless, disabled by default)
|
|
||||||
- showwavespic filter
|
|
||||||
- DTS decoding through libdcadec
|
|
||||||
- Drop support for nvenc API before 5.0
|
|
||||||
- nvenc HEVC encoder
|
|
||||||
- Detelecine filter
|
|
||||||
- Intel QSV-accelerated H.264 encoding
|
|
||||||
- MMAL-accelerated H.264 decoding
|
|
||||||
- basic APNG encoder and muxer with default extension "apng"
|
|
||||||
- unpack DivX-style packed B-frames in MPEG-4 bitstream filter
|
|
||||||
- WebM Live Chunk Muxer
|
|
||||||
- nvenc level and tier options
|
|
||||||
- chorus filter
|
|
||||||
- Canopus HQ/HQA decoder
|
|
||||||
- Automatically rotate videos based on metadata in ffmpeg
|
|
||||||
- improved Quickdraw compatibility
|
|
||||||
- VP9 high bit-depth and extended colorspaces decoding support
|
|
||||||
- WebPAnimEncoder API when available for encoding and muxing WebP
|
|
||||||
- Direct3D11-accelerated decoding
|
|
||||||
- Support Secure Transport
|
|
||||||
- Multipart JPEG demuxer
|
|
||||||
|
|
||||||
|
|
||||||
version 2.6:
|
version 2.6:
|
||||||
- nvenc encoder
|
- nvenc encoder
|
||||||
- 10bit spp filter
|
- 10bit spp filter
|
||||||
@@ -222,6 +35,7 @@ version 2.6:
|
|||||||
- Fix stsd atom corruption in DNxHD QuickTimes
|
- Fix stsd atom corruption in DNxHD QuickTimes
|
||||||
- Canopus HQX decoder
|
- Canopus HQX decoder
|
||||||
- RTP depacketization of T.140 text (RFC 4103)
|
- RTP depacketization of T.140 text (RFC 4103)
|
||||||
|
- VP9 RTP payload format (draft 0) experimental depacketizer
|
||||||
- Port MIPS optimizations to 64-bit
|
- Port MIPS optimizations to 64-bit
|
||||||
|
|
||||||
|
|
||||||
@@ -731,7 +545,7 @@ easier to use. The changes are:
|
|||||||
all the stream in the first input file, except for the second audio
|
all the stream in the first input file, except for the second audio
|
||||||
stream'.
|
stream'.
|
||||||
* There is a new option -c (or -codec) for choosing the decoder/encoder to
|
* There is a new option -c (or -codec) for choosing the decoder/encoder to
|
||||||
use, which makes it possible to precisely specify target stream(s) consistently with
|
use, which allows to precisely specify target stream(s) consistently with
|
||||||
other options. E.g. -c:v lib264 sets the codec for all video streams, -c:a:0
|
other options. E.g. -c:v lib264 sets the codec for all video streams, -c:a:0
|
||||||
libvorbis sets the codec for the first audio stream and -c copy copies all
|
libvorbis sets the codec for the first audio stream and -c copy copies all
|
||||||
the streams without reencoding. Old -vcodec/-acodec/-scodec options are now
|
the streams without reencoding. Old -vcodec/-acodec/-scodec options are now
|
||||||
@@ -920,8 +734,8 @@ version 0.8:
|
|||||||
- showinfo filter added
|
- showinfo filter added
|
||||||
- SMPTE 302M AES3 audio decoder
|
- SMPTE 302M AES3 audio decoder
|
||||||
- Apple Core Audio Format muxer
|
- Apple Core Audio Format muxer
|
||||||
- 9 bits and 10 bits per sample support in the H.264 decoder
|
- 9bit and 10bit per sample support in the H.264 decoder
|
||||||
- 9 bits and 10 bits FFV1 encoding / decoding
|
- 9bit and 10bit FFV1 encoding / decoding
|
||||||
- split filter added
|
- split filter added
|
||||||
- select filter added
|
- select filter added
|
||||||
- sdl output device added
|
- sdl output device added
|
||||||
@@ -1214,7 +1028,7 @@ version 0.4.9-pre1:
|
|||||||
- rate distorted optimal lambda->qp support
|
- rate distorted optimal lambda->qp support
|
||||||
- AAC encoding with libfaac
|
- AAC encoding with libfaac
|
||||||
- Sunplus JPEG codec (SP5X) support
|
- Sunplus JPEG codec (SP5X) support
|
||||||
- use Lagrange multiplier instead of QP for ratecontrol
|
- use Lagrange multipler instead of QP for ratecontrol
|
||||||
- Theora/VP3 decoding support
|
- Theora/VP3 decoding support
|
||||||
- XA and ADX ADPCM codecs
|
- XA and ADX ADPCM codecs
|
||||||
- export MPEG-2 active display area / pan scan
|
- export MPEG-2 active display area / pan scan
|
||||||
|
|||||||
64
LICENSE.md
64
LICENSE.md
@@ -1,4 +1,4 @@
|
|||||||
# License
|
#FFmpeg:
|
||||||
|
|
||||||
Most files in FFmpeg are under the GNU Lesser General Public License version 2.1
|
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
|
or later (LGPL v2.1+). Read the file `COPYING.LGPLv2.1` for details. Some other
|
||||||
@@ -13,28 +13,23 @@ 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
|
- libpostproc
|
||||||
- optional x86 optimization in the files
|
- optional x86 optimizations in the files
|
||||||
- `libavcodec/x86/flac_dsp_gpl.asm`
|
- `libavcodec/x86/flac_dsp_gpl.asm`
|
||||||
- `libavcodec/x86/idct_mmx.c`
|
- `libavcodec/x86/idct_mmx.c`
|
||||||
- `libavfilter/x86/vf_removegrain.asm`
|
- libutvideo encoding/decoding wrappers in
|
||||||
|
`libavcodec/libutvideo*.cpp`
|
||||||
- the X11 grabber in `libavdevice/x11grab.c`
|
- the X11 grabber in `libavdevice/x11grab.c`
|
||||||
- the following building and testing tools
|
- the swresample test app in
|
||||||
- `compat/solaris/make_sunver.pl`
|
`libswresample/swresample-test.c`
|
||||||
- `doc/t2h.pm`
|
- the `texi2pod.pl` tool
|
||||||
- `doc/texi2pod.pl`
|
|
||||||
- `libswresample/swresample-test.c`
|
|
||||||
- `tests/checkasm/*`
|
|
||||||
- `tests/tiny_ssim.c`
|
|
||||||
- the following filters in libavfilter:
|
- the following filters in libavfilter:
|
||||||
- `f_ebur128.c`
|
- `f_ebur128.c`
|
||||||
- `vf_blackframe.c`
|
- `vf_blackframe.c`
|
||||||
- `vf_boxblur.c`
|
- `vf_boxblur.c`
|
||||||
- `vf_colormatrix.c`
|
- `vf_colormatrix.c`
|
||||||
- `vf_cover_rect.c`
|
|
||||||
- `vf_cropdetect.c`
|
- `vf_cropdetect.c`
|
||||||
- `vf_delogo.c`
|
- `vf_delogo.c`
|
||||||
- `vf_eq.c`
|
- `vf_eq.c`
|
||||||
- `vf_find_rect.c`
|
|
||||||
- `vf_fspp.c`
|
- `vf_fspp.c`
|
||||||
- `vf_geq.c`
|
- `vf_geq.c`
|
||||||
- `vf_histeq.c`
|
- `vf_histeq.c`
|
||||||
@@ -49,9 +44,9 @@ Specifically, the GPL parts of FFmpeg are:
|
|||||||
- `vf_pp.c`
|
- `vf_pp.c`
|
||||||
- `vf_pp7.c`
|
- `vf_pp7.c`
|
||||||
- `vf_pullup.c`
|
- `vf_pullup.c`
|
||||||
- `vf_repeatfields.c`
|
|
||||||
- `vf_sab.c`
|
- `vf_sab.c`
|
||||||
- `vf_smartblur.c`
|
- `vf_smartblur.c`
|
||||||
|
- `vf_repeatfields.c`
|
||||||
- `vf_spp.c`
|
- `vf_spp.c`
|
||||||
- `vf_stereo3d.c`
|
- `vf_stereo3d.c`
|
||||||
- `vf_super2xsai.c`
|
- `vf_super2xsai.c`
|
||||||
@@ -75,17 +70,19 @@ There are a handful of files under other licensing terms, namely:
|
|||||||
* `tests/reference.pnm` is under the expat license.
|
* `tests/reference.pnm` is under the expat license.
|
||||||
|
|
||||||
|
|
||||||
## External libraries
|
external libraries
|
||||||
|
==================
|
||||||
|
|
||||||
FFmpeg can be combined with a number of external libraries, which sometimes
|
FFmpeg can be combined with a number of external libraries, which sometimes
|
||||||
affect the licensing of binaries resulting from the combination.
|
affect the licensing of binaries resulting from the combination.
|
||||||
|
|
||||||
### Compatible libraries
|
compatible libraries
|
||||||
|
--------------------
|
||||||
|
|
||||||
The following libraries are under GPL:
|
The following libraries are under GPL:
|
||||||
- frei0r
|
- frei0r
|
||||||
- libcdio
|
- libcdio
|
||||||
- librubberband
|
- libutvideo
|
||||||
- libvidstab
|
- libvidstab
|
||||||
- libx264
|
- libx264
|
||||||
- libx265
|
- libx265
|
||||||
@@ -100,25 +97,14 @@ license is incompatible with the LGPL v2.1 and the GPL v2, but not with
|
|||||||
version 3 of those licenses. So to combine these libraries with FFmpeg, the
|
version 3 of those licenses. So to combine these libraries with FFmpeg, the
|
||||||
license version needs to be upgraded by passing `--enable-version3` to configure.
|
license version needs to be upgraded by passing `--enable-version3` to configure.
|
||||||
|
|
||||||
### Incompatible libraries
|
incompatible libraries
|
||||||
|
----------------------
|
||||||
|
|
||||||
There are certain libraries you can combine with FFmpeg whose licenses are not
|
The Fraunhofer AAC library, FAAC and aacplus are under licenses which
|
||||||
compatible with the GPL and/or the LGPL. If you wish to enable these
|
are incompatible with the GPLv2 and v3. We do not know for certain if their
|
||||||
libraries, even in circumstances that their license may be incompatible, pass
|
licenses are compatible with the LGPL.
|
||||||
`--enable-nonfree` to configure. But note that if you enable any of these
|
If you wish to enable these libraries, pass `--enable-nonfree` to configure.
|
||||||
libraries the resulting binary will be under a complex license mix that is
|
But note that if you enable any of these libraries the resulting binary will
|
||||||
more restrictive than the LGPL and that may result in additional obligations.
|
be under a complex license mix that is more restrictive than the LGPL and that
|
||||||
It is possible that these restrictions cause the resulting binary to be
|
may result in additional obligations. It is possible that these
|
||||||
unredistributable.
|
restrictions cause the resulting binary to be unredistributeable.
|
||||||
|
|
||||||
The Fraunhofer FDK AAC and OpenSSL libraries are under licenses which are
|
|
||||||
incompatible with the GPLv2 and v3. To the best of our knowledge, they are
|
|
||||||
compatible with the LGPL.
|
|
||||||
|
|
||||||
The FAAC library is incompatible with all versions of GPL and LGPL.
|
|
||||||
|
|
||||||
The NVENC library, while its header file is licensed under the compatible MIT
|
|
||||||
license, requires a proprietary binary blob at run time, and is deemed to be
|
|
||||||
incompatible with the GPL. We are not certain if it is compatible with the
|
|
||||||
LGPL, but we require `--enable-nonfree` even with LGPL configurations in case
|
|
||||||
it is not.
|
|
||||||
|
|||||||
154
MAINTAINERS
154
MAINTAINERS
@@ -14,6 +14,7 @@ patches and related discussions.
|
|||||||
Project Leader
|
Project Leader
|
||||||
==============
|
==============
|
||||||
|
|
||||||
|
Michael Niedermayer
|
||||||
final design decisions
|
final design decisions
|
||||||
|
|
||||||
|
|
||||||
@@ -42,7 +43,8 @@ QuickTime faststart:
|
|||||||
Miscellaneous Areas
|
Miscellaneous Areas
|
||||||
===================
|
===================
|
||||||
|
|
||||||
documentation Stefano Sabatini, Mike Melanson, Timothy Gu, Lou Logan
|
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
|
project server Árpád Gereöffy, Michael Niedermayer, Reimar Doeffinger, Alexander Strasser
|
||||||
presets Robert Swain
|
presets Robert Swain
|
||||||
metadata subsystem Aurelien Jacobs
|
metadata subsystem Aurelien Jacobs
|
||||||
@@ -55,9 +57,9 @@ Communication
|
|||||||
website Deby Barbara Lepage
|
website Deby Barbara Lepage
|
||||||
fate.ffmpeg.org Timothy Gu
|
fate.ffmpeg.org Timothy Gu
|
||||||
Trac bug tracker Alexander Strasser, Michael Niedermayer, Carl Eugen Hoyos, Lou Logan
|
Trac bug tracker Alexander Strasser, Michael Niedermayer, Carl Eugen Hoyos, Lou Logan
|
||||||
mailing lists Baptiste Coudurier, Lou Logan
|
mailing lists Michael Niedermayer, Baptiste Coudurier, Lou Logan
|
||||||
Google+ Paul B Mahol, Michael Niedermayer, Alexander Strasser
|
Google+ Paul B Mahol, Michael Niedermayer, Alexander Strasser
|
||||||
Twitter Lou Logan, Reynaldo H. Verdejo Pinochet
|
Twitter Lou Logan
|
||||||
Launchpad Timothy Gu
|
Launchpad Timothy Gu
|
||||||
|
|
||||||
|
|
||||||
@@ -70,7 +72,6 @@ Internal Interfaces:
|
|||||||
libavutil/common.h Michael Niedermayer
|
libavutil/common.h Michael Niedermayer
|
||||||
|
|
||||||
Other:
|
Other:
|
||||||
aes_ctr.c, aes_ctr.h Eran Kornblau
|
|
||||||
bprint Nicolas George
|
bprint Nicolas George
|
||||||
bswap.h
|
bswap.h
|
||||||
des Reimar Doeffinger
|
des Reimar Doeffinger
|
||||||
@@ -88,6 +89,7 @@ Other:
|
|||||||
rational.c, rational.h Michael Niedermayer
|
rational.c, rational.h Michael Niedermayer
|
||||||
rc4 Reimar Doeffinger
|
rc4 Reimar Doeffinger
|
||||||
ripemd.c, ripemd.h James Almer
|
ripemd.c, ripemd.h James Almer
|
||||||
|
timecode Clément Bœsch
|
||||||
|
|
||||||
|
|
||||||
libavcodec
|
libavcodec
|
||||||
@@ -115,6 +117,8 @@ Generic Parts:
|
|||||||
faandct.c, faandct.h Michael Niedermayer
|
faandct.c, faandct.h Michael Niedermayer
|
||||||
Golomb coding:
|
Golomb coding:
|
||||||
golomb.c, golomb.h Michael Niedermayer
|
golomb.c, golomb.h Michael Niedermayer
|
||||||
|
LPC:
|
||||||
|
lpc.c, lpc.h Justin Ruggles
|
||||||
motion estimation:
|
motion estimation:
|
||||||
motion* Michael Niedermayer
|
motion* Michael Niedermayer
|
||||||
rate control:
|
rate control:
|
||||||
@@ -134,14 +138,19 @@ Codecs:
|
|||||||
4xm.c Michael Niedermayer
|
4xm.c Michael Niedermayer
|
||||||
8bps.c Roberto Togni
|
8bps.c Roberto Togni
|
||||||
8svx.c Jaikrishnan Menon
|
8svx.c Jaikrishnan Menon
|
||||||
aacenc*, aaccoder.c Rostislav Pehlivanov
|
aasc.c Kostya Shishkov
|
||||||
|
ac3* Justin Ruggles
|
||||||
alacenc.c Jaikrishnan Menon
|
alacenc.c Jaikrishnan Menon
|
||||||
alsdec.c Thilo Borgmann
|
alsdec.c Thilo Borgmann
|
||||||
|
apedec.c Kostya Shishkov
|
||||||
ass* Aurelien Jacobs
|
ass* Aurelien Jacobs
|
||||||
asv* Michael Niedermayer
|
asv* Michael Niedermayer
|
||||||
|
atrac3* Benjamin Larsson
|
||||||
atrac3plus* Maxim Poliakovski
|
atrac3plus* Maxim Poliakovski
|
||||||
bgmc.c, bgmc.h Thilo Borgmann
|
bgmc.c, bgmc.h Thilo Borgmann
|
||||||
|
bink.c Kostya Shishkov
|
||||||
binkaudio.c Peter Ross
|
binkaudio.c Peter Ross
|
||||||
|
bmp.c Mans Rullgard, Kostya Shishkov
|
||||||
cavs* Stefan Gehrer
|
cavs* Stefan Gehrer
|
||||||
cdxl.c Paul B Mahol
|
cdxl.c Paul B Mahol
|
||||||
celp_filters.* Vitor Sessak
|
celp_filters.* Vitor Sessak
|
||||||
@@ -149,21 +158,25 @@ Codecs:
|
|||||||
cinepakenc.c Rl / Aetey G.T. AB
|
cinepakenc.c Rl / Aetey G.T. AB
|
||||||
ccaption_dec.c Anshul Maheshwari
|
ccaption_dec.c Anshul Maheshwari
|
||||||
cljr Alex Beregszaszi
|
cljr Alex Beregszaszi
|
||||||
|
cllc.c Derek Buitenhuis
|
||||||
|
cook.c, cookdata.h Benjamin Larsson
|
||||||
cpia.c Stephan Hilb
|
cpia.c Stephan Hilb
|
||||||
crystalhd.c Philip Langdale
|
crystalhd.c Philip Langdale
|
||||||
cscd.c Reimar Doeffinger
|
cscd.c Reimar Doeffinger
|
||||||
cuvid.c Timo Rothenpieler
|
dca.c Kostya Shishkov, Benjamin Larsson
|
||||||
dirac* Rostislav Pehlivanov
|
|
||||||
dnxhd* Baptiste Coudurier
|
dnxhd* Baptiste Coudurier
|
||||||
dpcm.c Mike Melanson
|
dpcm.c Mike Melanson
|
||||||
dss_sp.c Oleksij Rempel
|
dss_sp.c Oleksij Rempel, Michael Niedermayer
|
||||||
dv.c Roman Shaposhnik
|
dv.c Roman Shaposhnik
|
||||||
dvbsubdec.c Anshul Maheshwari
|
dvbsubdec.c Anshul Maheshwari
|
||||||
|
dxa.c Kostya Shishkov
|
||||||
eacmv*, eaidct*, eat* Peter Ross
|
eacmv*, eaidct*, eat* Peter Ross
|
||||||
evrc* Paul B Mahol
|
|
||||||
exif.c, exif.h Thilo Borgmann
|
exif.c, exif.h Thilo Borgmann
|
||||||
ffv1* Michael Niedermayer
|
ffv1* Michael Niedermayer
|
||||||
ffwavesynth.c Nicolas George
|
ffwavesynth.c Nicolas George
|
||||||
|
fic.c Derek Buitenhuis
|
||||||
|
flac* Justin Ruggles
|
||||||
|
flashsv* Benjamin Larsson
|
||||||
flicvideo.c Mike Melanson
|
flicvideo.c Mike Melanson
|
||||||
g722.c Martin Storsjo
|
g722.c Martin Storsjo
|
||||||
g726.c Roman Shaposhnik
|
g726.c Roman Shaposhnik
|
||||||
@@ -171,47 +184,59 @@ Codecs:
|
|||||||
h261* Michael Niedermayer
|
h261* Michael Niedermayer
|
||||||
h263* Michael Niedermayer
|
h263* Michael Niedermayer
|
||||||
h264* Loren Merritt, Michael Niedermayer
|
h264* Loren Merritt, Michael Niedermayer
|
||||||
hap* Tom Butterworth
|
|
||||||
huffyuv* Michael Niedermayer, Christophe Gisquet
|
huffyuv* Michael Niedermayer, Christophe Gisquet
|
||||||
idcinvideo.c Mike Melanson
|
idcinvideo.c Mike Melanson
|
||||||
|
imc* Benjamin Larsson
|
||||||
|
indeo2* Kostya Shishkov
|
||||||
|
indeo5* Kostya Shishkov
|
||||||
interplayvideo.c Mike Melanson
|
interplayvideo.c Mike Melanson
|
||||||
jni*, ffjni* Matthieu Bouron
|
ivi* Kostya Shishkov
|
||||||
|
jacosub* Clément Bœsch
|
||||||
jpeg2000* Nicolas Bertrand
|
jpeg2000* Nicolas Bertrand
|
||||||
|
jpeg_ls.c Kostya Shishkov
|
||||||
jvdec.c Peter Ross
|
jvdec.c Peter Ross
|
||||||
|
kmvc.c Kostya Shishkov
|
||||||
lcl*.c Roberto Togni, Reimar Doeffinger
|
lcl*.c Roberto Togni, Reimar Doeffinger
|
||||||
libcelt_dec.c Nicolas George
|
libcelt_dec.c Nicolas George
|
||||||
libdirac* David Conrad
|
libdirac* David Conrad
|
||||||
libgsm.c Michel Bardiaux
|
libgsm.c Michel Bardiaux
|
||||||
libkvazaar.c Arttu Ylä-Outinen
|
|
||||||
libopenjpeg.c Jaikrishnan Menon
|
libopenjpeg.c Jaikrishnan Menon
|
||||||
libopenjpegenc.c Michael Bradshaw
|
libopenjpegenc.c Michael Bradshaw
|
||||||
libschroedinger* David Conrad
|
libschroedinger* David Conrad
|
||||||
|
libspeexdec.c Justin Ruggles
|
||||||
libtheoraenc.c David Conrad
|
libtheoraenc.c David Conrad
|
||||||
|
libutvideo* Derek Buitenhuis
|
||||||
libvorbis.c David Conrad
|
libvorbis.c David Conrad
|
||||||
libvpx* James Zern
|
libvpx* James Zern
|
||||||
|
libx264.c Mans Rullgard, Jason Garrett-Glaser
|
||||||
|
libx265.c Derek Buitenhuis
|
||||||
libxavs.c Stefan Gehrer
|
libxavs.c Stefan Gehrer
|
||||||
libzvbi-teletextdec.c Marton Balint
|
libzvbi-teletextdec.c Marton Balint
|
||||||
|
loco.c Kostya Shishkov
|
||||||
lzo.h, lzo.c Reimar Doeffinger
|
lzo.h, lzo.c Reimar Doeffinger
|
||||||
mdec.c Michael Niedermayer
|
mdec.c Michael Niedermayer
|
||||||
mimic.c Ramiro Polla
|
mimic.c Ramiro Polla
|
||||||
mjpeg*.c Michael Niedermayer
|
mjpeg*.c Michael Niedermayer
|
||||||
mlp* Ramiro Polla
|
mlp* Ramiro Polla
|
||||||
mmvideo.c Peter Ross
|
mmvideo.c Peter Ross
|
||||||
|
mpc* Kostya Shishkov
|
||||||
mpeg12.c, mpeg12data.h Michael Niedermayer
|
mpeg12.c, mpeg12data.h Michael Niedermayer
|
||||||
mpegvideo.c, mpegvideo.h Michael Niedermayer
|
mpegvideo.c, mpegvideo.h Michael Niedermayer
|
||||||
mqc* Nicolas Bertrand
|
mqc* Nicolas Bertrand
|
||||||
msmpeg4.c, msmpeg4data.h Michael Niedermayer
|
msmpeg4.c, msmpeg4data.h Michael Niedermayer
|
||||||
msrle.c Mike Melanson
|
msrle.c Mike Melanson
|
||||||
msvideo1.c Mike Melanson
|
msvideo1.c Mike Melanson
|
||||||
|
nellymoserdec.c Benjamin Larsson
|
||||||
nuv.c Reimar Doeffinger
|
nuv.c Reimar Doeffinger
|
||||||
nvenc* Timo Rothenpieler
|
nvenc.c Timo Rothenpieler
|
||||||
paf.* Paul B Mahol
|
paf.* Paul B Mahol
|
||||||
pcx.c Ivo van Poorten
|
pcx.c Ivo van Poorten
|
||||||
pgssubdec.c Reimar Doeffinger
|
pgssubdec.c Reimar Doeffinger
|
||||||
ptx.c Ivo van Poorten
|
ptx.c Ivo van Poorten
|
||||||
qcelp* Reynaldo H. Verdejo Pinochet
|
qcelp* Reynaldo H. Verdejo Pinochet
|
||||||
qdm2.c, qdm2data.h Roberto Togni
|
qdm2.c, qdm2data.h Roberto Togni, Benjamin Larsson
|
||||||
qsv* Ivan Uskov
|
qdrw.c Kostya Shishkov
|
||||||
|
qpeg.c Kostya Shishkov
|
||||||
qtrle.c Mike Melanson
|
qtrle.c Mike Melanson
|
||||||
ra144.c, ra144.h, ra288.c, ra288.h Roberto Togni
|
ra144.c, ra144.h, ra288.c, ra288.h Roberto Togni
|
||||||
resample2.c Michael Niedermayer
|
resample2.c Michael Niedermayer
|
||||||
@@ -219,8 +244,10 @@ Codecs:
|
|||||||
rpza.c Roberto Togni
|
rpza.c Roberto Togni
|
||||||
rtjpeg.c, rtjpeg.h Reimar Doeffinger
|
rtjpeg.c, rtjpeg.h Reimar Doeffinger
|
||||||
rv10.c Michael Niedermayer
|
rv10.c Michael Niedermayer
|
||||||
rv4* Christophe Gisquet
|
rv3* Kostya Shishkov
|
||||||
|
rv4* Kostya Shishkov, Christophe Gisquet
|
||||||
s3tc* Ivo van Poorten
|
s3tc* Ivo van Poorten
|
||||||
|
smacker.c Kostya Shishkov
|
||||||
smc.c Mike Melanson
|
smc.c Mike Melanson
|
||||||
smvjpegdec.c Ash Hughes
|
smvjpegdec.c Ash Hughes
|
||||||
snow* Michael Niedermayer, Loren Merritt
|
snow* Michael Niedermayer, Loren Merritt
|
||||||
@@ -229,41 +256,53 @@ Codecs:
|
|||||||
sunrast.c Ivo van Poorten
|
sunrast.c Ivo van Poorten
|
||||||
svq3.c Michael Niedermayer
|
svq3.c Michael Niedermayer
|
||||||
tak* Paul B Mahol
|
tak* Paul B Mahol
|
||||||
|
targa.c Kostya Shishkov
|
||||||
|
tiff.c Kostya Shishkov
|
||||||
truemotion1* Mike Melanson
|
truemotion1* Mike Melanson
|
||||||
|
truemotion2* Kostya Shishkov
|
||||||
|
truespeech.c Kostya Shishkov
|
||||||
|
tscc.c Kostya Shishkov
|
||||||
tta.c Alex Beregszaszi, Jaikrishnan Menon
|
tta.c Alex Beregszaszi, Jaikrishnan Menon
|
||||||
ttaenc.c Paul B Mahol
|
ttaenc.c Paul B Mahol
|
||||||
txd.c Ivo van Poorten
|
txd.c Ivo van Poorten
|
||||||
vc1* Christophe Gisquet
|
ulti* Kostya Shishkov
|
||||||
vc2* Rostislav Pehlivanov
|
v410*.c Derek Buitenhuis
|
||||||
|
vb.c Kostya Shishkov
|
||||||
|
vble.c Derek Buitenhuis
|
||||||
|
vc1* Kostya Shishkov, Christophe Gisquet
|
||||||
vcr1.c Michael Niedermayer
|
vcr1.c Michael Niedermayer
|
||||||
vda_h264_dec.c Xidorn Quan
|
vda_h264_dec.c Xidorn Quan
|
||||||
videotoolboxenc.c Rick Kern
|
|
||||||
vima.c Paul B Mahol
|
vima.c Paul B Mahol
|
||||||
|
vmnc.c Kostya Shishkov
|
||||||
vorbisdec.c Denes Balatoni, David Conrad
|
vorbisdec.c Denes Balatoni, David Conrad
|
||||||
vorbisenc.c Oded Shimon
|
vorbisenc.c Oded Shimon
|
||||||
vp3* Mike Melanson
|
vp3* Mike Melanson
|
||||||
vp5 Aurelien Jacobs
|
vp5 Aurelien Jacobs
|
||||||
vp6 Aurelien Jacobs
|
vp6 Aurelien Jacobs
|
||||||
vp8 David Conrad, Ronald Bultje
|
vp8 David Conrad, Jason Garrett-Glaser, Ronald Bultje
|
||||||
vp9 Ronald Bultje
|
vp9 Ronald Bultje, Clément Bœsch
|
||||||
vqavideo.c Mike Melanson
|
vqavideo.c Mike Melanson
|
||||||
|
wavpack.c Kostya Shishkov
|
||||||
wmaprodec.c Sascha Sommer
|
wmaprodec.c Sascha Sommer
|
||||||
wmavoice.c Ronald S. Bultje
|
wmavoice.c Ronald S. Bultje
|
||||||
wmv2.c Michael Niedermayer
|
wmv2.c Michael Niedermayer
|
||||||
|
wnv1.c Kostya Shishkov
|
||||||
xan.c Mike Melanson
|
xan.c Mike Melanson
|
||||||
xbm* Paul B Mahol
|
xbm* Paul B Mahol
|
||||||
xface Stefano Sabatini
|
xface Stefano Sabatini
|
||||||
|
xl.c Kostya Shishkov
|
||||||
xvmc.c Ivan Kalvachev
|
xvmc.c Ivan Kalvachev
|
||||||
xwd* Paul B Mahol
|
xwd* Paul B Mahol
|
||||||
|
zerocodec.c Derek Buitenhuis
|
||||||
|
zmbv* Kostya Shishkov
|
||||||
|
|
||||||
Hardware acceleration:
|
Hardware acceleration:
|
||||||
crystalhd.c Philip Langdale
|
crystalhd.c Philip Langdale
|
||||||
dxva2* Hendrik Leppkes, Laurent Aimar
|
dxva2* Laurent Aimar
|
||||||
mediacodec* Matthieu Bouron
|
libstagefright.cpp Mohamed Naufal
|
||||||
vaapi* Gwenole Beauchesne
|
vaapi* Gwenole Beauchesne
|
||||||
vaapi_encode* Mark Thompson
|
vda* Sebastien Zwickert
|
||||||
vdpau* Philip Langdale, Carl Eugen Hoyos
|
vdpau* Carl Eugen Hoyos
|
||||||
videotoolbox* Rick Kern
|
|
||||||
|
|
||||||
|
|
||||||
libavdevice
|
libavdevice
|
||||||
@@ -295,7 +334,6 @@ Generic parts:
|
|||||||
graphdump.c Nicolas George
|
graphdump.c Nicolas George
|
||||||
|
|
||||||
Filters:
|
Filters:
|
||||||
f_drawgraph.c Paul B Mahol
|
|
||||||
af_adelay.c Paul B Mahol
|
af_adelay.c Paul B Mahol
|
||||||
af_aecho.c Paul B Mahol
|
af_aecho.c Paul B Mahol
|
||||||
af_afade.c Paul B Mahol
|
af_afade.c Paul B Mahol
|
||||||
@@ -303,29 +341,19 @@ Filters:
|
|||||||
af_aphaser.c Paul B Mahol
|
af_aphaser.c Paul B Mahol
|
||||||
af_aresample.c Michael Niedermayer
|
af_aresample.c Michael Niedermayer
|
||||||
af_astats.c Paul B Mahol
|
af_astats.c Paul B Mahol
|
||||||
|
af_astreamsync.c Nicolas George
|
||||||
af_atempo.c Pavel Koshevoy
|
af_atempo.c Pavel Koshevoy
|
||||||
af_biquads.c Paul B Mahol
|
af_biquads.c Paul B Mahol
|
||||||
af_chorus.c Paul B Mahol
|
|
||||||
af_compand.c Paul B Mahol
|
af_compand.c Paul B Mahol
|
||||||
af_firequalizer.c Muhammad Faiz
|
|
||||||
af_ladspa.c Paul B Mahol
|
af_ladspa.c Paul B Mahol
|
||||||
af_loudnorm.c Kyle Swanson
|
|
||||||
af_pan.c Nicolas George
|
af_pan.c Nicolas George
|
||||||
af_sidechaincompress.c Paul B Mahol
|
|
||||||
af_silenceremove.c Paul B Mahol
|
af_silenceremove.c Paul B Mahol
|
||||||
avf_aphasemeter.c Paul B Mahol
|
|
||||||
avf_avectorscope.c Paul B Mahol
|
avf_avectorscope.c Paul B Mahol
|
||||||
avf_showcqt.c Muhammad Faiz
|
avf_showcqt.c Muhammad Faiz
|
||||||
vf_blend.c Paul B Mahol
|
vf_blend.c Paul B Mahol
|
||||||
vf_chromakey.c Timo Rothenpieler
|
|
||||||
vf_colorchannelmixer.c Paul B Mahol
|
|
||||||
vf_colorbalance.c Paul B Mahol
|
vf_colorbalance.c Paul B Mahol
|
||||||
vf_colorkey.c Timo Rothenpieler
|
|
||||||
vf_colorlevels.c Paul B Mahol
|
|
||||||
vf_coreimage.m Thilo Borgmann
|
|
||||||
vf_deband.c Paul B Mahol
|
|
||||||
vf_dejudder.c Nicholas Robbins
|
vf_dejudder.c Nicholas Robbins
|
||||||
vf_delogo.c Jean Delvare (CC <jdelvare@suse.com>)
|
vf_delogo.c Jean Delvare (CC <khali@linux-fr.org>)
|
||||||
vf_drawbox.c/drawgrid Andrey Utkin
|
vf_drawbox.c/drawgrid Andrey Utkin
|
||||||
vf_extractplanes.c Paul B Mahol
|
vf_extractplanes.c Paul B Mahol
|
||||||
vf_histogram.c Paul B Mahol
|
vf_histogram.c Paul B Mahol
|
||||||
@@ -334,17 +362,12 @@ Filters:
|
|||||||
vf_il.c Paul B Mahol
|
vf_il.c Paul B Mahol
|
||||||
vf_lenscorrection.c Daniel Oberhoff
|
vf_lenscorrection.c Daniel Oberhoff
|
||||||
vf_mergeplanes.c Paul B Mahol
|
vf_mergeplanes.c Paul B Mahol
|
||||||
vf_neighbor.c Paul B Mahol
|
|
||||||
vf_psnr.c Paul B Mahol
|
vf_psnr.c Paul B Mahol
|
||||||
vf_random.c Paul B Mahol
|
|
||||||
vf_readvitc.c Tobias Rapp (CC t.rapp at noa-archive dot com)
|
|
||||||
vf_scale.c Michael Niedermayer
|
vf_scale.c Michael Niedermayer
|
||||||
vf_separatefields.c Paul B Mahol
|
vf_separatefields.c Paul B Mahol
|
||||||
vf_ssim.c Paul B Mahol
|
|
||||||
vf_stereo3d.c Paul B Mahol
|
vf_stereo3d.c Paul B Mahol
|
||||||
vf_telecine.c Paul B Mahol
|
vf_telecine.c Paul B Mahol
|
||||||
vf_yadif.c Michael Niedermayer
|
vf_yadif.c Michael Niedermayer
|
||||||
vf_zoompan.c Paul B Mahol
|
|
||||||
|
|
||||||
Sources:
|
Sources:
|
||||||
vsrc_mandelbrot.c Michael Niedermayer
|
vsrc_mandelbrot.c Michael Niedermayer
|
||||||
@@ -357,16 +380,15 @@ Generic parts:
|
|||||||
libavformat/avformat.h Michael Niedermayer
|
libavformat/avformat.h Michael Niedermayer
|
||||||
Utility Code:
|
Utility Code:
|
||||||
libavformat/utils.c Michael Niedermayer
|
libavformat/utils.c Michael Niedermayer
|
||||||
Text Subtitles Clément Bœsch
|
|
||||||
|
|
||||||
|
|
||||||
Muxers/Demuxers:
|
Muxers/Demuxers:
|
||||||
4xm.c Mike Melanson
|
4xm.c Mike Melanson
|
||||||
aadec.c Vesselin Bontchev (vesselin.bontchev at yandex dot com)
|
|
||||||
adtsenc.c Robert Swain
|
adtsenc.c Robert Swain
|
||||||
afc.c Paul B Mahol
|
afc.c Paul B Mahol
|
||||||
aiffdec.c Baptiste Coudurier, Matthieu Bouron
|
aiffdec.c Baptiste Coudurier, Matthieu Bouron
|
||||||
aiffenc.c Baptiste Coudurier, Matthieu Bouron
|
aiffenc.c Baptiste Coudurier, Matthieu Bouron
|
||||||
|
ape.c Kostya Shishkov
|
||||||
apngdec.c Benoit Fouet
|
apngdec.c Benoit Fouet
|
||||||
ass* Aurelien Jacobs
|
ass* Aurelien Jacobs
|
||||||
astdec.c Paul B Mahol
|
astdec.c Paul B Mahol
|
||||||
@@ -380,18 +402,19 @@ Muxers/Demuxers:
|
|||||||
cdxl.c Paul B Mahol
|
cdxl.c Paul B Mahol
|
||||||
crc.c Michael Niedermayer
|
crc.c Michael Niedermayer
|
||||||
daud.c Reimar Doeffinger
|
daud.c Reimar Doeffinger
|
||||||
dss.c Oleksij Rempel
|
dss.c Oleksij Rempel, Michael Niedermayer
|
||||||
dtshddec.c Paul B Mahol
|
dtshddec.c Paul B Mahol
|
||||||
dv.c Roman Shaposhnik
|
dv.c Roman Shaposhnik
|
||||||
|
dxa.c Kostya Shishkov
|
||||||
electronicarts.c Peter Ross
|
electronicarts.c Peter Ross
|
||||||
epafdec.c Paul B Mahol
|
epafdec.c Paul B Mahol
|
||||||
ffm* Baptiste Coudurier
|
ffm* Baptiste Coudurier
|
||||||
|
flac* Justin Ruggles
|
||||||
flic.c Mike Melanson
|
flic.c Mike Melanson
|
||||||
flvdec.c, flvenc.c Michael Niedermayer
|
flvdec.c, flvenc.c Michael Niedermayer
|
||||||
gxf.c Reimar Doeffinger
|
gxf.c Reimar Doeffinger
|
||||||
gxfenc.c Baptiste Coudurier
|
gxfenc.c Baptiste Coudurier
|
||||||
hls.c Anssi Hannula
|
hls.c Anssi Hannula
|
||||||
hls encryption (hlsenc.c) Christian Suloway
|
|
||||||
idcin.c Mike Melanson
|
idcin.c Mike Melanson
|
||||||
idroqdec.c Mike Melanson
|
idroqdec.c Mike Melanson
|
||||||
iff.c Jaikrishnan Menon
|
iff.c Jaikrishnan Menon
|
||||||
@@ -399,6 +422,7 @@ Muxers/Demuxers:
|
|||||||
ipmovie.c Mike Melanson
|
ipmovie.c Mike Melanson
|
||||||
ircam* Paul B Mahol
|
ircam* Paul B Mahol
|
||||||
iss.c Stefan Gehrer
|
iss.c Stefan Gehrer
|
||||||
|
jacosub* Clément Bœsch
|
||||||
jvdec.c Peter Ross
|
jvdec.c Peter Ross
|
||||||
libmodplug.c Clément Bœsch
|
libmodplug.c Clément Bœsch
|
||||||
libnut.c Oded Shimon
|
libnut.c Oded Shimon
|
||||||
@@ -413,9 +437,9 @@ Muxers/Demuxers:
|
|||||||
mgsts.c Paul B Mahol
|
mgsts.c Paul B Mahol
|
||||||
microdvd* Aurelien Jacobs
|
microdvd* Aurelien Jacobs
|
||||||
mm.c Peter Ross
|
mm.c Peter Ross
|
||||||
mov.c Baptiste Coudurier
|
mov.c Michael Niedermayer, Baptiste Coudurier
|
||||||
movenc.c Baptiste Coudurier, Matthieu Bouron
|
movenc.c Baptiste Coudurier, Matthieu Bouron
|
||||||
movenccenc.c Eran Kornblau
|
mpc.c Kostya Shishkov
|
||||||
mpeg.c Michael Niedermayer
|
mpeg.c Michael Niedermayer
|
||||||
mpegenc.c Michael Niedermayer
|
mpegenc.c Michael Niedermayer
|
||||||
mpegts.c Marton Balint
|
mpegts.c Marton Balint
|
||||||
@@ -431,7 +455,6 @@ Muxers/Demuxers:
|
|||||||
oggdec.c, oggdec.h David Conrad
|
oggdec.c, oggdec.h David Conrad
|
||||||
oggenc.c Baptiste Coudurier
|
oggenc.c Baptiste Coudurier
|
||||||
oggparse*.c David Conrad
|
oggparse*.c David Conrad
|
||||||
oggparsedaala* Rostislav Pehlivanov
|
|
||||||
oma.c Maxim Poliakovski
|
oma.c Maxim Poliakovski
|
||||||
paf.c Paul B Mahol
|
paf.c Paul B Mahol
|
||||||
psxstr.c Mike Melanson
|
psxstr.c Mike Melanson
|
||||||
@@ -441,7 +464,8 @@ Muxers/Demuxers:
|
|||||||
raw.c Michael Niedermayer
|
raw.c Michael Niedermayer
|
||||||
rdt.c Ronald S. Bultje
|
rdt.c Ronald S. Bultje
|
||||||
rl2.c Sascha Sommer
|
rl2.c Sascha Sommer
|
||||||
rmdec.c, rmenc.c Ronald S. Bultje
|
rmdec.c, rmenc.c Ronald S. Bultje, Kostya Shishkov
|
||||||
|
rtmp* Kostya Shishkov
|
||||||
rtp.c, rtpenc.c Martin Storsjo
|
rtp.c, rtpenc.c Martin Storsjo
|
||||||
rtpdec_ac3.* Gilles Chanteperdrix
|
rtpdec_ac3.* Gilles Chanteperdrix
|
||||||
rtpdec_dv.* Thomas Volkert
|
rtpdec_dv.* Thomas Volkert
|
||||||
@@ -449,13 +473,15 @@ Muxers/Demuxers:
|
|||||||
rtpdec_hevc.*, rtpenc_hevc.* Thomas Volkert
|
rtpdec_hevc.*, rtpenc_hevc.* Thomas Volkert
|
||||||
rtpdec_mpa_robust.* Gilles Chanteperdrix
|
rtpdec_mpa_robust.* Gilles Chanteperdrix
|
||||||
rtpdec_asf.* Ronald S. Bultje
|
rtpdec_asf.* Ronald S. Bultje
|
||||||
rtpdec_vc2hq.*, rtpenc_vc2hq.* Thomas Volkert
|
|
||||||
rtpdec_vp9.c Thomas Volkert
|
rtpdec_vp9.c Thomas Volkert
|
||||||
rtpenc_mpv.*, rtpenc_aac.* Martin Storsjo
|
rtpenc_mpv.*, rtpenc_aac.* Martin Storsjo
|
||||||
|
rtsp.c Luca Barbato
|
||||||
sbgdec.c Nicolas George
|
sbgdec.c Nicolas George
|
||||||
sdp.c Martin Storsjo
|
sdp.c Martin Storsjo
|
||||||
segafilm.c Mike Melanson
|
segafilm.c Mike Melanson
|
||||||
segment.c Stefano Sabatini
|
segment.c Stefano Sabatini
|
||||||
|
siff.c Kostya Shishkov
|
||||||
|
smacker.c Kostya Shishkov
|
||||||
smjpeg* Paul B Mahol
|
smjpeg* Paul B Mahol
|
||||||
spdif* Anssi Hannula
|
spdif* Anssi Hannula
|
||||||
srtdec.c Aurelien Jacobs
|
srtdec.c Aurelien Jacobs
|
||||||
@@ -470,10 +496,10 @@ Muxers/Demuxers:
|
|||||||
webvtt* Matthew J Heaney
|
webvtt* Matthew J Heaney
|
||||||
westwood.c Mike Melanson
|
westwood.c Mike Melanson
|
||||||
wtv.c Peter Ross
|
wtv.c Peter Ross
|
||||||
|
wv.c Kostya Shishkov
|
||||||
wvenc.c Paul B Mahol
|
wvenc.c Paul B Mahol
|
||||||
|
|
||||||
Protocols:
|
Protocols:
|
||||||
async.c Zhang Rui
|
|
||||||
bluray.c Petri Hintukainen
|
bluray.c Petri Hintukainen
|
||||||
ftp.c Lukasz Marek
|
ftp.c Lukasz Marek
|
||||||
http.c Ronald S. Bultje
|
http.c Ronald S. Bultje
|
||||||
@@ -500,27 +526,29 @@ Resamplers:
|
|||||||
Operating systems / CPU architectures
|
Operating systems / CPU architectures
|
||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
Alpha Falk Hueffner
|
Alpha Mans Rullgard, Falk Hueffner
|
||||||
MIPS Nedeljko Babic
|
ARM Mans Rullgard
|
||||||
|
AVR32 Mans Rullgard
|
||||||
|
MIPS Mans Rullgard, Nedeljko Babic
|
||||||
Mac OS X / PowerPC Romain Dolbeau, Guillaume Poirier
|
Mac OS X / PowerPC Romain Dolbeau, Guillaume Poirier
|
||||||
Amiga / PowerPC Colin Ward
|
Amiga / PowerPC Colin Ward
|
||||||
|
Linux / PowerPC Luca Barbato
|
||||||
Windows MinGW Alex Beregszaszi, Ramiro Polla
|
Windows MinGW Alex Beregszaszi, Ramiro Polla
|
||||||
Windows Cygwin Victor Paesa
|
Windows Cygwin Victor Paesa
|
||||||
Windows MSVC Matthew Oliver, Hendrik Leppkes
|
Windows MSVC Matthew Oliver
|
||||||
Windows ICL Matthew Oliver
|
Windows ICL Matthew Oliver
|
||||||
ADI/Blackfin DSP Marc Hoffman
|
ADI/Blackfin DSP Marc Hoffman
|
||||||
Sparc Roman Shaposhnik
|
Sparc Roman Shaposhnik
|
||||||
OS/2 KO Myung-Hun
|
x86 Michael Niedermayer
|
||||||
|
|
||||||
|
|
||||||
Releases
|
Releases
|
||||||
========
|
========
|
||||||
|
|
||||||
2.8 Michael Niedermayer
|
|
||||||
2.7 Michael Niedermayer
|
|
||||||
2.6 Michael Niedermayer
|
2.6 Michael Niedermayer
|
||||||
2.5 Michael Niedermayer
|
2.5 Michael Niedermayer
|
||||||
2.4 Michael Niedermayer
|
2.4 Michael Niedermayer
|
||||||
|
2.2 Michael Niedermayer
|
||||||
|
|
||||||
If you want to maintain an older release, please contact us
|
If you want to maintain an older release, please contact us
|
||||||
|
|
||||||
@@ -530,6 +558,7 @@ GnuPG Fingerprints of maintainers and contributors
|
|||||||
|
|
||||||
Alexander Strasser 1C96 78B7 83CB 8AA7 9AF5 D1EB A7D8 A57B A876 E58F
|
Alexander Strasser 1C96 78B7 83CB 8AA7 9AF5 D1EB A7D8 A57B A876 E58F
|
||||||
Anssi Hannula 1A92 FF42 2DD9 8D2E 8AF7 65A9 4278 C520 513D F3CB
|
Anssi Hannula 1A92 FF42 2DD9 8D2E 8AF7 65A9 4278 C520 513D F3CB
|
||||||
|
Anton Khirnov 6D0C 6625 56F8 65D1 E5F5 814B B50A 1241 C067 07AB
|
||||||
Ash Hughes 694D 43D2 D180 C7C7 6421 ABD3 A641 D0B7 623D 6029
|
Ash Hughes 694D 43D2 D180 C7C7 6421 ABD3 A641 D0B7 623D 6029
|
||||||
Attila Kinali 11F0 F9A6 A1D2 11F6 C745 D10C 6520 BCDD F2DF E765
|
Attila Kinali 11F0 F9A6 A1D2 11F6 C745 D10C 6520 BCDD F2DF E765
|
||||||
Baptiste Coudurier 8D77 134D 20CC 9220 201F C5DB 0AC9 325C 5C1A BAAA
|
Baptiste Coudurier 8D77 134D 20CC 9220 201F C5DB 0AC9 325C 5C1A BAAA
|
||||||
@@ -537,18 +566,19 @@ Ben Littler 3EE3 3723 E560 3214 A8CD 4DEB 2CDB FCE7 768C 8D2C
|
|||||||
Benoit Fouet B22A 4F4F 43EF 636B BB66 FCDC 0023 AE1E 2985 49C8
|
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
|
Clément Bœsch 52D0 3A82 D445 F194 DB8B 2B16 87EE 2CB8 F4B8 FCF9
|
||||||
Daniel Verkamp 78A6 07ED 782C 653E C628 B8B9 F0EB 8DD8 2F0E 21C7
|
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
|
FFmpeg release signing key FCF9 86EA 15E6 E293 A564 4F10 B432 2F04 D676 58D8
|
||||||
Ganesh Ajjanagadde C96A 848E 97C3 CEA2 AB72 5CE4 45F9 6A2D 3C36 FB1B
|
|
||||||
Gwenole Beauchesne 2E63 B3A6 3E44 37E2 017D 2704 53C7 6266 B153 99C4
|
Gwenole Beauchesne 2E63 B3A6 3E44 37E2 017D 2704 53C7 6266 B153 99C4
|
||||||
Jaikrishnan Menon 61A1 F09F 01C9 2D45 78E1 C862 25DC 8831 AF70 D368
|
Jaikrishnan Menon 61A1 F09F 01C9 2D45 78E1 C862 25DC 8831 AF70 D368
|
||||||
Jean Delvare 7CA6 9F44 60F1 BDC4 1FD2 C858 A552 6B9B B3CD 4E6A
|
Jean Delvare 7CA6 9F44 60F1 BDC4 1FD2 C858 A552 6B9B B3CD 4E6A
|
||||||
|
Justin Ruggles 3136 ECC0 C10D 6C04 5F43 CA29 FCBE CD2A 3787 1EBF
|
||||||
Loren Merritt ABD9 08F4 C920 3F65 D8BE 35D7 1540 DAA7 060F 56DE
|
Loren Merritt ABD9 08F4 C920 3F65 D8BE 35D7 1540 DAA7 060F 56DE
|
||||||
Lou Logan 7D68 DC73 CBEF EABB 671A B6CF 621C 2E28 82F8 DC3A
|
Lou Logan 7D68 DC73 CBEF EABB 671A B6CF 621C 2E28 82F8 DC3A
|
||||||
|
Luca Barbato 6677 4209 213C 8843 5B67 29E7 E84C 78C2 84E9 0E34
|
||||||
Michael Niedermayer 9FF2 128B 147E F673 0BAD F133 611E C787 040B 0FAB
|
Michael Niedermayer 9FF2 128B 147E F673 0BAD F133 611E C787 040B 0FAB
|
||||||
Nicolas George 24CE 01CE 9ACC 5CEB 74D8 8D9D B063 D997 36E5 4C93
|
Nicolas George 24CE 01CE 9ACC 5CEB 74D8 8D9D B063 D997 36E5 4C93
|
||||||
Panagiotis Issaris 6571 13A3 33D9 3726 F728 AA98 F643 B12E ECF3 E029
|
Panagiotis Issaris 6571 13A3 33D9 3726 F728 AA98 F643 B12E ECF3 E029
|
||||||
Peter Ross A907 E02F A6E5 0CD2 34CD 20D2 6760 79C5 AC40 DD6B
|
Peter Ross A907 E02F A6E5 0CD2 34CD 20D2 6760 79C5 AC40 DD6B
|
||||||
Philip Langdale 5DC5 8D66 5FBA 3A43 18EC 045E F8D6 B194 6A75 682E
|
|
||||||
Reimar Doeffinger C61D 16E5 9E2C D10C 8958 38A4 0899 A2B9 06D4 D9C7
|
Reimar Doeffinger C61D 16E5 9E2C D10C 8958 38A4 0899 A2B9 06D4 D9C7
|
||||||
Reinhard Tartler 9300 5DC2 7E87 6C37 ED7B CA9A 9808 3544 9453 48A4
|
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
|
Reynaldo H. Verdejo Pinochet 6E27 CD34 170C C78E 4D4F 5F40 C18E 077F 3114 452A
|
||||||
|
|||||||
29
Makefile
29
Makefile
@@ -4,7 +4,6 @@ include config.mak
|
|||||||
vpath %.c $(SRC_PATH)
|
vpath %.c $(SRC_PATH)
|
||||||
vpath %.cpp $(SRC_PATH)
|
vpath %.cpp $(SRC_PATH)
|
||||||
vpath %.h $(SRC_PATH)
|
vpath %.h $(SRC_PATH)
|
||||||
vpath %.inc $(SRC_PATH)
|
|
||||||
vpath %.m $(SRC_PATH)
|
vpath %.m $(SRC_PATH)
|
||||||
vpath %.S $(SRC_PATH)
|
vpath %.S $(SRC_PATH)
|
||||||
vpath %.asm $(SRC_PATH)
|
vpath %.asm $(SRC_PATH)
|
||||||
@@ -30,18 +29,12 @@ $(foreach prog,$(AVBASENAMES),$(eval OBJS-$(prog) += cmdutils.o))
|
|||||||
$(foreach prog,$(AVBASENAMES),$(eval OBJS-$(prog)-$(CONFIG_OPENCL) += cmdutils_opencl.o))
|
$(foreach prog,$(AVBASENAMES),$(eval OBJS-$(prog)-$(CONFIG_OPENCL) += cmdutils_opencl.o))
|
||||||
|
|
||||||
OBJS-ffmpeg += ffmpeg_opt.o ffmpeg_filter.o
|
OBJS-ffmpeg += ffmpeg_opt.o ffmpeg_filter.o
|
||||||
OBJS-ffmpeg-$(CONFIG_VIDEOTOOLBOX) += ffmpeg_videotoolbox.o
|
|
||||||
OBJS-ffmpeg-$(CONFIG_LIBMFX) += ffmpeg_qsv.o
|
|
||||||
OBJS-ffmpeg-$(CONFIG_VAAPI) += ffmpeg_vaapi.o
|
|
||||||
ifndef CONFIG_VIDEOTOOLBOX
|
|
||||||
OBJS-ffmpeg-$(CONFIG_VDA) += ffmpeg_videotoolbox.o
|
|
||||||
endif
|
|
||||||
OBJS-ffmpeg-$(CONFIG_CUVID) += ffmpeg_cuvid.o
|
|
||||||
OBJS-ffmpeg-$(HAVE_DXVA2_LIB) += ffmpeg_dxva2.o
|
|
||||||
OBJS-ffmpeg-$(HAVE_VDPAU_X11) += ffmpeg_vdpau.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
|
OBJS-ffserver += ffserver_config.o
|
||||||
|
|
||||||
TESTTOOLS = audiogen videogen rotozoom tiny_psnr tiny_ssim base64 audiomatch
|
TESTTOOLS = audiogen videogen rotozoom tiny_psnr tiny_ssim base64
|
||||||
HOSTPROGS := $(TESTTOOLS:%=tests/%) doc/print_options
|
HOSTPROGS := $(TESTTOOLS:%=tests/%) doc/print_options
|
||||||
TOOLS = qt-faststart trasher uncoded_frame
|
TOOLS = qt-faststart trasher uncoded_frame
|
||||||
TOOLS-$(CONFIG_ZLIB) += cws2fws
|
TOOLS-$(CONFIG_ZLIB) += cws2fws
|
||||||
@@ -61,14 +54,12 @@ FFLIBS := avutil
|
|||||||
DATA_FILES := $(wildcard $(SRC_PATH)/presets/*.ffpreset) $(SRC_PATH)/doc/ffprobe.xsd
|
DATA_FILES := $(wildcard $(SRC_PATH)/presets/*.ffpreset) $(SRC_PATH)/doc/ffprobe.xsd
|
||||||
EXAMPLES_FILES := $(wildcard $(SRC_PATH)/doc/examples/*.c) $(SRC_PATH)/doc/examples/Makefile $(SRC_PATH)/doc/examples/README
|
EXAMPLES_FILES := $(wildcard $(SRC_PATH)/doc/examples/*.c) $(SRC_PATH)/doc/examples/Makefile $(SRC_PATH)/doc/examples/README
|
||||||
|
|
||||||
SKIPHEADERS = cmdutils_common_opts.h \
|
SKIPHEADERS = cmdutils_common_opts.h compat/w32pthreads.h
|
||||||
compat/w32pthreads.h
|
|
||||||
|
|
||||||
include $(SRC_PATH)/common.mak
|
include $(SRC_PATH)/common.mak
|
||||||
|
|
||||||
FF_EXTRALIBS := $(FFEXTRALIBS)
|
FF_EXTRALIBS := $(FFEXTRALIBS)
|
||||||
FF_DEP_LIBS := $(DEP_LIBS)
|
FF_DEP_LIBS := $(DEP_LIBS)
|
||||||
FF_STATIC_DEP_LIBS := $(STATIC_DEP_LIBS)
|
|
||||||
|
|
||||||
all: $(AVPROGS)
|
all: $(AVPROGS)
|
||||||
|
|
||||||
@@ -89,8 +80,8 @@ SUBDIR_VARS := CLEANFILES EXAMPLES FFLIBS HOSTPROGS TESTPROGS TOOLS \
|
|||||||
HEADERS ARCH_HEADERS BUILT_HEADERS SKIPHEADERS \
|
HEADERS ARCH_HEADERS BUILT_HEADERS SKIPHEADERS \
|
||||||
ARMV5TE-OBJS ARMV6-OBJS ARMV8-OBJS VFP-OBJS NEON-OBJS \
|
ARMV5TE-OBJS ARMV6-OBJS ARMV8-OBJS VFP-OBJS NEON-OBJS \
|
||||||
ALTIVEC-OBJS MMX-OBJS YASM-OBJS \
|
ALTIVEC-OBJS MMX-OBJS YASM-OBJS \
|
||||||
MIPSFPU-OBJS MIPSDSPR2-OBJS MIPSDSP-OBJS MSA-OBJS \
|
MIPSFPU-OBJS MIPSDSPR2-OBJS MIPSDSPR1-OBJS \
|
||||||
MMI-OBJS OBJS SLIBOBJS HOSTOBJS TESTOBJS
|
OBJS SLIBOBJS HOSTOBJS TESTOBJS
|
||||||
|
|
||||||
define RESET
|
define RESET
|
||||||
$(1) :=
|
$(1) :=
|
||||||
@@ -180,15 +171,11 @@ clean::
|
|||||||
$(RM) $(CLEANSUFFIXES)
|
$(RM) $(CLEANSUFFIXES)
|
||||||
$(RM) $(CLEANSUFFIXES:%=tools/%)
|
$(RM) $(CLEANSUFFIXES:%=tools/%)
|
||||||
$(RM) -r coverage-html
|
$(RM) -r coverage-html
|
||||||
$(RM) -rf coverage.info coverage.info.in lcov
|
$(RM) -rf coverage.info lcov
|
||||||
|
|
||||||
distclean::
|
distclean::
|
||||||
$(RM) $(DISTCLEANSUFFIXES)
|
$(RM) $(DISTCLEANSUFFIXES)
|
||||||
$(RM) config.* .config libavutil/avconfig.h .version mapfile avversion.h version.h libavutil/ffversion.h libavcodec/codec_names.h libavcodec/bsf_list.c libavformat/protocol_list.c
|
$(RM) config.* .config libavutil/avconfig.h .version version.h libavutil/ffversion.h libavcodec/codec_names.h
|
||||||
ifeq ($(SRC_LINK),src)
|
|
||||||
$(RM) src
|
|
||||||
endif
|
|
||||||
$(RM) -rf doc/examples/pc-uninstalled
|
|
||||||
|
|
||||||
config:
|
config:
|
||||||
$(SRC_PATH)/configure $(value FFMPEG_CONFIGURATION)
|
$(SRC_PATH)/configure $(value FFMPEG_CONFIGURATION)
|
||||||
|
|||||||
19
README.md
19
README.md
@@ -16,12 +16,12 @@ such as audio, video, subtitles and related metadata.
|
|||||||
|
|
||||||
## Tools
|
## Tools
|
||||||
|
|
||||||
* [ffmpeg](https://ffmpeg.org/ffmpeg.html) is a command line toolbox to
|
* [ffmpeg](http://ffmpeg.org/ffmpeg.html) is a command line toolbox to
|
||||||
manipulate, convert and stream multimedia content.
|
manipulate, convert and stream multimedia content.
|
||||||
* [ffplay](https://ffmpeg.org/ffplay.html) is a minimalistic multimedia player.
|
* [ffplay](http://ffmpeg.org/ffplay.html) is a minimalistic multimedia player.
|
||||||
* [ffprobe](https://ffmpeg.org/ffprobe.html) is a simple analysis tool to inspect
|
* [ffprobe](http://ffmpeg.org/ffprobe.html) is a simple analysis tool to inspect
|
||||||
multimedia content.
|
multimedia content.
|
||||||
* [ffserver](https://ffmpeg.org/ffserver.html) is a multimedia streaming server
|
* [ffserver](http://ffmpeg.org/ffserver.html) is a multimedia streaming server
|
||||||
for live broadcasts.
|
for live broadcasts.
|
||||||
* Additional small tools such as `aviocat`, `ismindex` and `qt-faststart`.
|
* Additional small tools such as `aviocat`, `ismindex` and `qt-faststart`.
|
||||||
|
|
||||||
@@ -29,8 +29,8 @@ such as audio, video, subtitles and related metadata.
|
|||||||
|
|
||||||
The offline documentation is available in the **doc/** directory.
|
The offline documentation is available in the **doc/** directory.
|
||||||
|
|
||||||
The online documentation is available in the main [website](https://ffmpeg.org)
|
The online documentation is available in the main [website](http://ffmpeg.org)
|
||||||
and in the [wiki](https://trac.ffmpeg.org).
|
and in the [wiki](http://trac.ffmpeg.org).
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
|
|
||||||
@@ -40,10 +40,3 @@ Coding examples are available in the **doc/examples** directory.
|
|||||||
|
|
||||||
FFmpeg codebase is mainly LGPL-licensed with optional components licensed under
|
FFmpeg codebase is mainly LGPL-licensed with optional components licensed under
|
||||||
GPL. Please refer to the LICENSE file for detailed information.
|
GPL. Please refer to the LICENSE file for detailed information.
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
Patches should be submitted to the ffmpeg-devel mailing list using
|
|
||||||
`git format-patch` or `git send-email`. Github pull requests should be
|
|
||||||
avoided because they are not part of our review process. Few developers
|
|
||||||
follow pull requests so they will likely be ignored.
|
|
||||||
|
|||||||
66
RELEASE_NOTES
Normal file
66
RELEASE_NOTES
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
|
||||||
|
┌─────────────────────────────────────────────┐
|
||||||
|
│ RELEASE NOTES for FFmpeg 2.6 "Grothendieck" │
|
||||||
|
└─────────────────────────────────────────────┘
|
||||||
|
|
||||||
|
The FFmpeg Project proudly presents FFmpeg 2.6 "Grothendieck", about 3
|
||||||
|
months after the release of FFmpeg 2.5.
|
||||||
|
|
||||||
|
A lot of important work got in this time, so let's start talking about what
|
||||||
|
we like to brag the most about: features.
|
||||||
|
|
||||||
|
A lot of people will probably be happy to hear that we now have support for
|
||||||
|
NVENC — the Nvidia Video Encoder interface for H.264 encoding — thanks to
|
||||||
|
Timo Rothenpieler, with some little help from NVIDIA and Philip Langdale.
|
||||||
|
|
||||||
|
People in the broadcasting industry might also be interested in the first
|
||||||
|
steps of closed captions support with the introduction of a decoder by
|
||||||
|
Anshul Maheswhwari.
|
||||||
|
|
||||||
|
Regarding filters love, we improved and added many. We could talk about the
|
||||||
|
10-bit support in spp, but maybe it's more important to mention the addition
|
||||||
|
of colorlevels (yet another color handling filter), tblend (allowing you
|
||||||
|
to for example run a diff between successive frames of a video stream), or
|
||||||
|
eventually the dcshift audio filter.
|
||||||
|
|
||||||
|
There is also two other important filters landing in libavfilter: palettegen
|
||||||
|
and paletteuse, submitted by the Stupeflix company. These filters will be
|
||||||
|
very useful in case you are looking for creating high quality GIF, a format
|
||||||
|
that still bravely fights annihilation in 2015.
|
||||||
|
|
||||||
|
There are many other features, but let's follow-up on one big cleanup
|
||||||
|
achievement: the libmpcodecs (MPlayer filters) wrapper is finally dead. The
|
||||||
|
last remaining filters (softpulldown/repeatfields, eq*, and various
|
||||||
|
postprocessing filters) were ported by Arwa Arif (OPW student) and Paul B
|
||||||
|
Mahol.
|
||||||
|
|
||||||
|
Concerning API changes, not much things to mention. Though, the introduction
|
||||||
|
of devices inputs and outputs listing by Lukasz Marek is a notable addition
|
||||||
|
(try ffmpeg -sources or ffmpeg -sinks for an example of the usage). As
|
||||||
|
usual, see doc/APIchanges for more information.
|
||||||
|
|
||||||
|
Now let's talk about optimizations. Ronald S. Bultje made the VP9 decoder
|
||||||
|
usable on x86 32-bit systems and pre-ssse3 CPUs like Phenom (even dual core
|
||||||
|
Athlons can play 1080p 30fps VP9 content now), so we now secretly hope for
|
||||||
|
Google and Mozilla to use ffvp9 instead of libvpx.
|
||||||
|
|
||||||
|
But VP9 is not the center of attention anymore, and HEVC/H.265 is also
|
||||||
|
getting many improvements, which includes optimizations, both in C and x86
|
||||||
|
ASM, mainly from James Almer, Christophe Gisquet and Pierre-Edouard Lepere.
|
||||||
|
|
||||||
|
Even though we had many x86 contributions, it is not the only architecture
|
||||||
|
getting some love, with Seppo Tomperi adding ARM NEON optimizations to the
|
||||||
|
HEVC stack, and James Cowgill adding MIPS64 assembly for all kind of audio
|
||||||
|
processing code in libavcodec.
|
||||||
|
|
||||||
|
And finally, Michael Niedermayer is still fixing many bugs, dealing with
|
||||||
|
most of the boring work such as making releases, applying tons of
|
||||||
|
contributors patches, and daily merging the changes from the Libav project.
|
||||||
|
|
||||||
|
A more complete Changelog is available at the root of the project, and the
|
||||||
|
complete Git history on http://source.ffmpeg.org.
|
||||||
|
|
||||||
|
We hope you will like this release as much as we enjoyed working on it, and
|
||||||
|
as usual, if you have any question about it, or any FFmpeg related topic,
|
||||||
|
feel free to join us on the #ffmpeg IRC channel (on irc.freenode.net) or ask
|
||||||
|
on the mailing-lists.
|
||||||
5
arch.mak
5
arch.mak
@@ -5,13 +5,10 @@ OBJS-$(HAVE_VFP) += $(VFP-OBJS) $(VFP-OBJS-yes)
|
|||||||
OBJS-$(HAVE_NEON) += $(NEON-OBJS) $(NEON-OBJS-yes)
|
OBJS-$(HAVE_NEON) += $(NEON-OBJS) $(NEON-OBJS-yes)
|
||||||
|
|
||||||
OBJS-$(HAVE_MIPSFPU) += $(MIPSFPU-OBJS) $(MIPSFPU-OBJS-yes)
|
OBJS-$(HAVE_MIPSFPU) += $(MIPSFPU-OBJS) $(MIPSFPU-OBJS-yes)
|
||||||
OBJS-$(HAVE_MIPSDSP) += $(MIPSDSP-OBJS) $(MIPSDSP-OBJS-yes)
|
OBJS-$(HAVE_MIPSDSPR1) += $(MIPSDSPR1-OBJS) $(MIPSDSPR1-OBJS-yes)
|
||||||
OBJS-$(HAVE_MIPSDSPR2) += $(MIPSDSPR2-OBJS) $(MIPSDSPR2-OBJS-yes)
|
OBJS-$(HAVE_MIPSDSPR2) += $(MIPSDSPR2-OBJS) $(MIPSDSPR2-OBJS-yes)
|
||||||
OBJS-$(HAVE_MSA) += $(MSA-OBJS) $(MSA-OBJS-yes)
|
|
||||||
OBJS-$(HAVE_MMI) += $(MMI-OBJS) $(MMI-OBJS-yes)
|
|
||||||
|
|
||||||
OBJS-$(HAVE_ALTIVEC) += $(ALTIVEC-OBJS) $(ALTIVEC-OBJS-yes)
|
OBJS-$(HAVE_ALTIVEC) += $(ALTIVEC-OBJS) $(ALTIVEC-OBJS-yes)
|
||||||
OBJS-$(HAVE_VSX) += $(VSX-OBJS) $(VSX-OBJS-yes)
|
|
||||||
|
|
||||||
OBJS-$(HAVE_MMX) += $(MMX-OBJS) $(MMX-OBJS-yes)
|
OBJS-$(HAVE_MMX) += $(MMX-OBJS) $(MMX-OBJS-yes)
|
||||||
OBJS-$(HAVE_YASM) += $(YASM-OBJS) $(YASM-OBJS-yes)
|
OBJS-$(HAVE_YASM) += $(YASM-OBJS) $(YASM-OBJS-yes)
|
||||||
|
|||||||
245
cmdutils.c
245
cmdutils.c
@@ -41,10 +41,8 @@
|
|||||||
#include "libavutil/avassert.h"
|
#include "libavutil/avassert.h"
|
||||||
#include "libavutil/avstring.h"
|
#include "libavutil/avstring.h"
|
||||||
#include "libavutil/bprint.h"
|
#include "libavutil/bprint.h"
|
||||||
#include "libavutil/display.h"
|
|
||||||
#include "libavutil/mathematics.h"
|
#include "libavutil/mathematics.h"
|
||||||
#include "libavutil/imgutils.h"
|
#include "libavutil/imgutils.h"
|
||||||
#include "libavutil/libm.h"
|
|
||||||
#include "libavutil/parseutils.h"
|
#include "libavutil/parseutils.h"
|
||||||
#include "libavutil/pixdesc.h"
|
#include "libavutil/pixdesc.h"
|
||||||
#include "libavutil/eval.h"
|
#include "libavutil/eval.h"
|
||||||
@@ -52,7 +50,6 @@
|
|||||||
#include "libavutil/opt.h"
|
#include "libavutil/opt.h"
|
||||||
#include "libavutil/cpu.h"
|
#include "libavutil/cpu.h"
|
||||||
#include "libavutil/ffversion.h"
|
#include "libavutil/ffversion.h"
|
||||||
#include "libavutil/version.h"
|
|
||||||
#include "cmdutils.h"
|
#include "cmdutils.h"
|
||||||
#if CONFIG_NETWORK
|
#if CONFIG_NETWORK
|
||||||
#include "libavformat/network.h"
|
#include "libavformat/network.h"
|
||||||
@@ -64,7 +61,7 @@
|
|||||||
|
|
||||||
static int init_report(const char *env);
|
static int init_report(const char *env);
|
||||||
|
|
||||||
AVDictionary *sws_dict;
|
struct SwsContext *sws_opts;
|
||||||
AVDictionary *swr_opts;
|
AVDictionary *swr_opts;
|
||||||
AVDictionary *format_opts, *codec_opts, *resample_opts;
|
AVDictionary *format_opts, *codec_opts, *resample_opts;
|
||||||
|
|
||||||
@@ -74,13 +71,20 @@ int hide_banner = 0;
|
|||||||
|
|
||||||
void init_opts(void)
|
void init_opts(void)
|
||||||
{
|
{
|
||||||
av_dict_set(&sws_dict, "flags", "bicubic", 0);
|
|
||||||
|
if(CONFIG_SWSCALE)
|
||||||
|
sws_opts = sws_getContext(16, 16, 0, 16, 16, 0, SWS_BICUBIC,
|
||||||
|
NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uninit_opts(void)
|
void uninit_opts(void)
|
||||||
{
|
{
|
||||||
|
#if CONFIG_SWSCALE
|
||||||
|
sws_freeContext(sws_opts);
|
||||||
|
sws_opts = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
av_dict_free(&swr_opts);
|
av_dict_free(&swr_opts);
|
||||||
av_dict_free(&sws_dict);
|
|
||||||
av_dict_free(&format_opts);
|
av_dict_free(&format_opts);
|
||||||
av_dict_free(&codec_opts);
|
av_dict_free(&codec_opts);
|
||||||
av_dict_free(&resample_opts);
|
av_dict_free(&resample_opts);
|
||||||
@@ -476,22 +480,10 @@ static void dump_argument(const char *a)
|
|||||||
fputc('"', report_file);
|
fputc('"', report_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_options(const OptionDef *po)
|
|
||||||
{
|
|
||||||
while (po->name) {
|
|
||||||
if (po->flags & OPT_PERFILE)
|
|
||||||
av_assert0(po->flags & (OPT_INPUT | OPT_OUTPUT));
|
|
||||||
po++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void parse_loglevel(int argc, char **argv, const OptionDef *options)
|
void parse_loglevel(int argc, char **argv, const OptionDef *options)
|
||||||
{
|
{
|
||||||
int idx = locate_option(argc, argv, options, "loglevel");
|
int idx = locate_option(argc, argv, options, "loglevel");
|
||||||
const char *env;
|
const char *env;
|
||||||
|
|
||||||
check_options(options);
|
|
||||||
|
|
||||||
if (!idx)
|
if (!idx)
|
||||||
idx = locate_option(argc, argv, options, "v");
|
idx = locate_option(argc, argv, options, "v");
|
||||||
if (idx && argv[idx + 1])
|
if (idx && argv[idx + 1])
|
||||||
@@ -523,7 +515,7 @@ static const AVOption *opt_find(void *obj, const char *name, const char *unit,
|
|||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FLAGS (o->type == AV_OPT_TYPE_FLAGS && (arg[0]=='-' || arg[0]=='+')) ? AV_DICT_APPEND : 0
|
#define FLAGS (o->type == AV_OPT_TYPE_FLAGS) ? AV_DICT_APPEND : 0
|
||||||
int opt_default(void *optctx, const char *opt, const char *arg)
|
int opt_default(void *optctx, const char *opt, const char *arg)
|
||||||
{
|
{
|
||||||
const AVOption *o;
|
const AVOption *o;
|
||||||
@@ -534,12 +526,7 @@ int opt_default(void *optctx, const char *opt, const char *arg)
|
|||||||
#if CONFIG_AVRESAMPLE
|
#if CONFIG_AVRESAMPLE
|
||||||
const AVClass *rc = avresample_get_class();
|
const AVClass *rc = avresample_get_class();
|
||||||
#endif
|
#endif
|
||||||
#if CONFIG_SWSCALE
|
const AVClass *sc, *swr_class;
|
||||||
const AVClass *sc = sws_get_class();
|
|
||||||
#endif
|
|
||||||
#if CONFIG_SWRESAMPLE
|
|
||||||
const AVClass *swr_class = swr_get_class();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!strcmp(opt, "debug") || !strcmp(opt, "fdebug"))
|
if (!strcmp(opt, "debug") || !strcmp(opt, "fdebug"))
|
||||||
av_log_set_level(AV_LOG_DEBUG);
|
av_log_set_level(AV_LOG_DEBUG);
|
||||||
@@ -563,24 +550,15 @@ int opt_default(void *optctx, const char *opt, const char *arg)
|
|||||||
consumed = 1;
|
consumed = 1;
|
||||||
}
|
}
|
||||||
#if CONFIG_SWSCALE
|
#if CONFIG_SWSCALE
|
||||||
if (!consumed && (o = opt_find(&sc, opt, NULL, 0,
|
sc = sws_get_class();
|
||||||
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
|
if (!consumed && opt_find(&sc, opt, NULL, 0,
|
||||||
struct SwsContext *sws = sws_alloc_context();
|
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)) {
|
||||||
int ret = av_opt_set(sws, opt, arg, 0);
|
// XXX we only support sws_flags, not arbitrary sws options
|
||||||
sws_freeContext(sws);
|
int ret = av_opt_set(sws_opts, opt, arg, 0);
|
||||||
if (!strcmp(opt, "srcw") || !strcmp(opt, "srch") ||
|
|
||||||
!strcmp(opt, "dstw") || !strcmp(opt, "dsth") ||
|
|
||||||
!strcmp(opt, "src_format") || !strcmp(opt, "dst_format")) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Directly using swscale dimensions/format options is not supported, please use the -s or -pix_fmt options\n");
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
}
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
av_log(NULL, AV_LOG_ERROR, "Error setting option %s.\n", opt);
|
av_log(NULL, AV_LOG_ERROR, "Error setting option %s.\n", opt);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
av_dict_set(&sws_dict, opt, arg, FLAGS);
|
|
||||||
|
|
||||||
consumed = 1;
|
consumed = 1;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@@ -590,6 +568,7 @@ int opt_default(void *optctx, const char *opt, const char *arg)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if CONFIG_SWRESAMPLE
|
#if CONFIG_SWRESAMPLE
|
||||||
|
swr_class = swr_get_class();
|
||||||
if (!consumed && (o=opt_find(&swr_class, opt, NULL, 0,
|
if (!consumed && (o=opt_find(&swr_class, opt, NULL, 0,
|
||||||
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
|
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
|
||||||
struct SwrContext *swr = swr_alloc();
|
struct SwrContext *swr = swr_alloc();
|
||||||
@@ -653,7 +632,9 @@ static void finish_group(OptionParseContext *octx, int group_idx,
|
|||||||
*g = octx->cur_group;
|
*g = octx->cur_group;
|
||||||
g->arg = arg;
|
g->arg = arg;
|
||||||
g->group_def = l->group_def;
|
g->group_def = l->group_def;
|
||||||
g->sws_dict = sws_dict;
|
#if CONFIG_SWSCALE
|
||||||
|
g->sws_opts = sws_opts;
|
||||||
|
#endif
|
||||||
g->swr_opts = swr_opts;
|
g->swr_opts = swr_opts;
|
||||||
g->codec_opts = codec_opts;
|
g->codec_opts = codec_opts;
|
||||||
g->format_opts = format_opts;
|
g->format_opts = format_opts;
|
||||||
@@ -662,7 +643,9 @@ static void finish_group(OptionParseContext *octx, int group_idx,
|
|||||||
codec_opts = NULL;
|
codec_opts = NULL;
|
||||||
format_opts = NULL;
|
format_opts = NULL;
|
||||||
resample_opts = NULL;
|
resample_opts = NULL;
|
||||||
sws_dict = NULL;
|
#if CONFIG_SWSCALE
|
||||||
|
sws_opts = NULL;
|
||||||
|
#endif
|
||||||
swr_opts = NULL;
|
swr_opts = NULL;
|
||||||
init_opts();
|
init_opts();
|
||||||
|
|
||||||
@@ -718,8 +701,9 @@ void uninit_parse_context(OptionParseContext *octx)
|
|||||||
av_dict_free(&l->groups[j].codec_opts);
|
av_dict_free(&l->groups[j].codec_opts);
|
||||||
av_dict_free(&l->groups[j].format_opts);
|
av_dict_free(&l->groups[j].format_opts);
|
||||||
av_dict_free(&l->groups[j].resample_opts);
|
av_dict_free(&l->groups[j].resample_opts);
|
||||||
|
#if CONFIG_SWSCALE
|
||||||
av_dict_free(&l->groups[j].sws_dict);
|
sws_freeContext(l->groups[j].sws_opts);
|
||||||
|
#endif
|
||||||
av_dict_free(&l->groups[j].swr_opts);
|
av_dict_free(&l->groups[j].swr_opts);
|
||||||
}
|
}
|
||||||
av_freep(&l->groups);
|
av_freep(&l->groups);
|
||||||
@@ -861,7 +845,6 @@ int opt_loglevel(void *optctx, const char *opt, const char *arg)
|
|||||||
{ "info" , AV_LOG_INFO },
|
{ "info" , AV_LOG_INFO },
|
||||||
{ "verbose", AV_LOG_VERBOSE },
|
{ "verbose", AV_LOG_VERBOSE },
|
||||||
{ "debug" , AV_LOG_DEBUG },
|
{ "debug" , AV_LOG_DEBUG },
|
||||||
{ "trace" , AV_LOG_TRACE },
|
|
||||||
};
|
};
|
||||||
char *tail;
|
char *tail;
|
||||||
int level;
|
int level;
|
||||||
@@ -1059,8 +1042,7 @@ static int warned_cfg = 0;
|
|||||||
LIB##LIBNAME##_VERSION_MAJOR, \
|
LIB##LIBNAME##_VERSION_MAJOR, \
|
||||||
LIB##LIBNAME##_VERSION_MINOR, \
|
LIB##LIBNAME##_VERSION_MINOR, \
|
||||||
LIB##LIBNAME##_VERSION_MICRO, \
|
LIB##LIBNAME##_VERSION_MICRO, \
|
||||||
AV_VERSION_MAJOR(version), AV_VERSION_MINOR(version),\
|
version >> 16, version >> 8 & 0xff, version & 0xff); \
|
||||||
AV_VERSION_MICRO(version)); \
|
|
||||||
} \
|
} \
|
||||||
if (flags & SHOW_CONFIG) { \
|
if (flags & SHOW_CONFIG) { \
|
||||||
const char *cfg = libname##_configuration(); \
|
const char *cfg = libname##_configuration(); \
|
||||||
@@ -1079,15 +1061,15 @@ static int warned_cfg = 0;
|
|||||||
|
|
||||||
static void print_all_libs_info(int flags, int level)
|
static void print_all_libs_info(int flags, int level)
|
||||||
{
|
{
|
||||||
PRINT_LIB_INFO(avutil, AVUTIL, flags, level);
|
PRINT_LIB_INFO(avutil, AVUTIL, flags, level);
|
||||||
PRINT_LIB_INFO(avcodec, AVCODEC, flags, level);
|
PRINT_LIB_INFO(avcodec, AVCODEC, flags, level);
|
||||||
PRINT_LIB_INFO(avformat, AVFORMAT, flags, level);
|
PRINT_LIB_INFO(avformat, AVFORMAT, flags, level);
|
||||||
PRINT_LIB_INFO(avdevice, AVDEVICE, flags, level);
|
PRINT_LIB_INFO(avdevice, AVDEVICE, flags, level);
|
||||||
PRINT_LIB_INFO(avfilter, AVFILTER, flags, level);
|
PRINT_LIB_INFO(avfilter, AVFILTER, flags, level);
|
||||||
PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level);
|
PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level);
|
||||||
PRINT_LIB_INFO(swscale, SWSCALE, flags, level);
|
PRINT_LIB_INFO(swscale, SWSCALE, flags, level);
|
||||||
PRINT_LIB_INFO(swresample, SWRESAMPLE, flags, level);
|
PRINT_LIB_INFO(swresample,SWRESAMPLE, flags, level);
|
||||||
PRINT_LIB_INFO(postproc, POSTPROC, flags, level);
|
PRINT_LIB_INFO(postproc, POSTPROC, flags, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_program_info(int flags, int level)
|
static void print_program_info(int flags, int level)
|
||||||
@@ -1324,47 +1306,16 @@ static void print_codec(const AVCodec *c)
|
|||||||
printf("%s %s [%s]:\n", encoder ? "Encoder" : "Decoder", c->name,
|
printf("%s %s [%s]:\n", encoder ? "Encoder" : "Decoder", c->name,
|
||||||
c->long_name ? c->long_name : "");
|
c->long_name ? c->long_name : "");
|
||||||
|
|
||||||
printf(" General capabilities: ");
|
|
||||||
if (c->capabilities & AV_CODEC_CAP_DRAW_HORIZ_BAND)
|
|
||||||
printf("horizband ");
|
|
||||||
if (c->capabilities & AV_CODEC_CAP_DR1)
|
|
||||||
printf("dr1 ");
|
|
||||||
if (c->capabilities & AV_CODEC_CAP_TRUNCATED)
|
|
||||||
printf("trunc ");
|
|
||||||
if (c->capabilities & AV_CODEC_CAP_DELAY)
|
|
||||||
printf("delay ");
|
|
||||||
if (c->capabilities & AV_CODEC_CAP_SMALL_LAST_FRAME)
|
|
||||||
printf("small ");
|
|
||||||
if (c->capabilities & AV_CODEC_CAP_SUBFRAMES)
|
|
||||||
printf("subframes ");
|
|
||||||
if (c->capabilities & AV_CODEC_CAP_EXPERIMENTAL)
|
|
||||||
printf("exp ");
|
|
||||||
if (c->capabilities & AV_CODEC_CAP_CHANNEL_CONF)
|
|
||||||
printf("chconf ");
|
|
||||||
if (c->capabilities & AV_CODEC_CAP_PARAM_CHANGE)
|
|
||||||
printf("paramchange ");
|
|
||||||
if (c->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE)
|
|
||||||
printf("variable ");
|
|
||||||
if (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS |
|
|
||||||
AV_CODEC_CAP_SLICE_THREADS |
|
|
||||||
AV_CODEC_CAP_AUTO_THREADS))
|
|
||||||
printf("threads ");
|
|
||||||
if (!c->capabilities)
|
|
||||||
printf("none");
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
if (c->type == AVMEDIA_TYPE_VIDEO ||
|
if (c->type == AVMEDIA_TYPE_VIDEO ||
|
||||||
c->type == AVMEDIA_TYPE_AUDIO) {
|
c->type == AVMEDIA_TYPE_AUDIO) {
|
||||||
printf(" Threading capabilities: ");
|
printf(" Threading capabilities: ");
|
||||||
switch (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS |
|
switch (c->capabilities & (CODEC_CAP_FRAME_THREADS |
|
||||||
AV_CODEC_CAP_SLICE_THREADS |
|
CODEC_CAP_SLICE_THREADS)) {
|
||||||
AV_CODEC_CAP_AUTO_THREADS)) {
|
case CODEC_CAP_FRAME_THREADS |
|
||||||
case AV_CODEC_CAP_FRAME_THREADS |
|
CODEC_CAP_SLICE_THREADS: printf("frame and slice"); break;
|
||||||
AV_CODEC_CAP_SLICE_THREADS: printf("frame and slice"); break;
|
case CODEC_CAP_FRAME_THREADS: printf("frame"); break;
|
||||||
case AV_CODEC_CAP_FRAME_THREADS: printf("frame"); break;
|
case CODEC_CAP_SLICE_THREADS: printf("slice"); break;
|
||||||
case AV_CODEC_CAP_SLICE_THREADS: printf("slice"); break;
|
default: printf("no"); break;
|
||||||
case AV_CODEC_CAP_AUTO_THREADS : printf("auto"); break;
|
|
||||||
default: printf("none"); break;
|
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
@@ -1423,7 +1374,7 @@ static int compare_codec_desc(const void *a, const void *b)
|
|||||||
const AVCodecDescriptor * const *da = a;
|
const AVCodecDescriptor * const *da = a;
|
||||||
const AVCodecDescriptor * const *db = b;
|
const AVCodecDescriptor * const *db = b;
|
||||||
|
|
||||||
return (*da)->type != (*db)->type ? FFDIFFSIGN((*da)->type, (*db)->type) :
|
return (*da)->type != (*db)->type ? (*da)->type - (*db)->type :
|
||||||
strcmp((*da)->name, (*db)->name);
|
strcmp((*da)->name, (*db)->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1537,11 +1488,11 @@ static void print_codecs(int encoder)
|
|||||||
|
|
||||||
while ((codec = next_codec_for_id(desc->id, codec, encoder))) {
|
while ((codec = next_codec_for_id(desc->id, codec, encoder))) {
|
||||||
printf(" %c", get_media_type_char(desc->type));
|
printf(" %c", get_media_type_char(desc->type));
|
||||||
printf((codec->capabilities & AV_CODEC_CAP_FRAME_THREADS) ? "F" : ".");
|
printf((codec->capabilities & CODEC_CAP_FRAME_THREADS) ? "F" : ".");
|
||||||
printf((codec->capabilities & AV_CODEC_CAP_SLICE_THREADS) ? "S" : ".");
|
printf((codec->capabilities & CODEC_CAP_SLICE_THREADS) ? "S" : ".");
|
||||||
printf((codec->capabilities & AV_CODEC_CAP_EXPERIMENTAL) ? "X" : ".");
|
printf((codec->capabilities & CODEC_CAP_EXPERIMENTAL) ? "X" : ".");
|
||||||
printf((codec->capabilities & AV_CODEC_CAP_DRAW_HORIZ_BAND)?"B" : ".");
|
printf((codec->capabilities & CODEC_CAP_DRAW_HORIZ_BAND)?"B" : ".");
|
||||||
printf((codec->capabilities & AV_CODEC_CAP_DR1) ? "D" : ".");
|
printf((codec->capabilities & CODEC_CAP_DR1) ? "D" : ".");
|
||||||
|
|
||||||
printf(" %-20s %s", codec->name, codec->long_name ? codec->long_name : "");
|
printf(" %-20s %s", codec->name, codec->long_name ? codec->long_name : "");
|
||||||
if (strcmp(codec->name, desc->name))
|
if (strcmp(codec->name, desc->name))
|
||||||
@@ -1584,10 +1535,10 @@ int show_protocols(void *optctx, const char *opt, const char *arg)
|
|||||||
printf("Supported file protocols:\n"
|
printf("Supported file protocols:\n"
|
||||||
"Input:\n");
|
"Input:\n");
|
||||||
while ((name = avio_enum_protocols(&opaque, 0)))
|
while ((name = avio_enum_protocols(&opaque, 0)))
|
||||||
printf(" %s\n", name);
|
printf("%s\n", name);
|
||||||
printf("Output:\n");
|
printf("Output:\n");
|
||||||
while ((name = avio_enum_protocols(&opaque, 1)))
|
while ((name = avio_enum_protocols(&opaque, 1)))
|
||||||
printf(" %s\n", name);
|
printf("%s\n", name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1602,7 +1553,7 @@ int show_filters(void *optctx, const char *opt, const char *arg)
|
|||||||
printf("Filters:\n"
|
printf("Filters:\n"
|
||||||
" T.. = Timeline support\n"
|
" T.. = Timeline support\n"
|
||||||
" .S. = Slice threading\n"
|
" .S. = Slice threading\n"
|
||||||
" ..C = Command support\n"
|
" ..C = Commmand support\n"
|
||||||
" A = Audio input/output\n"
|
" A = Audio input/output\n"
|
||||||
" V = Video input/output\n"
|
" V = Video input/output\n"
|
||||||
" N = Dynamic number and/or type of input/output\n"
|
" N = Dynamic number and/or type of input/output\n"
|
||||||
@@ -1615,17 +1566,17 @@ int show_filters(void *optctx, const char *opt, const char *arg)
|
|||||||
*(descr_cur++) = '>';
|
*(descr_cur++) = '>';
|
||||||
}
|
}
|
||||||
pad = i ? filter->outputs : filter->inputs;
|
pad = i ? filter->outputs : filter->inputs;
|
||||||
for (j = 0; pad && avfilter_pad_get_name(pad, j); j++) {
|
for (j = 0; pad && pad[j].name; j++) {
|
||||||
if (descr_cur >= descr + sizeof(descr) - 4)
|
if (descr_cur >= descr + sizeof(descr) - 4)
|
||||||
break;
|
break;
|
||||||
*(descr_cur++) = get_media_type_char(avfilter_pad_get_type(pad, j));
|
*(descr_cur++) = get_media_type_char(pad[j].type);
|
||||||
}
|
}
|
||||||
if (!j)
|
if (!j)
|
||||||
*(descr_cur++) = ((!i && (filter->flags & AVFILTER_FLAG_DYNAMIC_INPUTS)) ||
|
*(descr_cur++) = ((!i && (filter->flags & AVFILTER_FLAG_DYNAMIC_INPUTS)) ||
|
||||||
( i && (filter->flags & AVFILTER_FLAG_DYNAMIC_OUTPUTS))) ? 'N' : '|';
|
( i && (filter->flags & AVFILTER_FLAG_DYNAMIC_OUTPUTS))) ? 'N' : '|';
|
||||||
}
|
}
|
||||||
*descr_cur = 0;
|
*descr_cur = 0;
|
||||||
printf(" %c%c%c %-17s %-10s %s\n",
|
printf(" %c%c%c %-16s %-10s %s\n",
|
||||||
filter->flags & AVFILTER_FLAG_SUPPORT_TIMELINE ? 'T' : '.',
|
filter->flags & AVFILTER_FLAG_SUPPORT_TIMELINE ? 'T' : '.',
|
||||||
filter->flags & AVFILTER_FLAG_SLICE_THREADS ? 'S' : '.',
|
filter->flags & AVFILTER_FLAG_SLICE_THREADS ? 'S' : '.',
|
||||||
filter->process_command ? 'C' : '.',
|
filter->process_command ? 'C' : '.',
|
||||||
@@ -1909,6 +1860,64 @@ int read_yesno(void)
|
|||||||
return yesno;
|
return yesno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cmdutils_read_file(const char *filename, char **bufptr, size_t *size)
|
||||||
|
{
|
||||||
|
int64_t 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = fseek(f, 0, SEEK_END);
|
||||||
|
if (ret == -1) {
|
||||||
|
ret = AVERROR(errno);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = ftell(f);
|
||||||
|
if (ret < 0) {
|
||||||
|
ret = AVERROR(errno);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
*size = ret;
|
||||||
|
|
||||||
|
ret = fseek(f, 0, SEEK_SET);
|
||||||
|
if (ret == -1) {
|
||||||
|
ret = AVERROR(errno);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
*bufptr = av_malloc(*size + 1);
|
||||||
|
if (!*bufptr) {
|
||||||
|
av_log(NULL, AV_LOG_ERROR, "Could not allocate file buffer\n");
|
||||||
|
ret = AVERROR(ENOMEM);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
ret = fread(*bufptr, 1, *size, f);
|
||||||
|
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));
|
||||||
|
} else
|
||||||
|
ret = AVERROR_EOF;
|
||||||
|
} else {
|
||||||
|
ret = 0;
|
||||||
|
(*bufptr)[(*size)++] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (ret < 0)
|
||||||
|
av_log(NULL, AV_LOG_ERROR, "IO error: %s\n", av_err2str(ret));
|
||||||
|
fclose(f);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
FILE *get_preset_file(char *filename, size_t filename_size,
|
FILE *get_preset_file(char *filename, size_t filename_size,
|
||||||
const char *preset_name, int is_path,
|
const char *preset_name, int is_path,
|
||||||
const char *codec_name)
|
const char *codec_name)
|
||||||
@@ -2063,33 +2072,6 @@ void *grow_array(void *array, int elem_size, int *size, int new_size)
|
|||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
double get_rotation(AVStream *st)
|
|
||||||
{
|
|
||||||
AVDictionaryEntry *rotate_tag = av_dict_get(st->metadata, "rotate", NULL, 0);
|
|
||||||
uint8_t* displaymatrix = av_stream_get_side_data(st,
|
|
||||||
AV_PKT_DATA_DISPLAYMATRIX, NULL);
|
|
||||||
double theta = 0;
|
|
||||||
|
|
||||||
if (rotate_tag && *rotate_tag->value && strcmp(rotate_tag->value, "0")) {
|
|
||||||
char *tail;
|
|
||||||
theta = av_strtod(rotate_tag->value, &tail);
|
|
||||||
if (*tail)
|
|
||||||
theta = 0;
|
|
||||||
}
|
|
||||||
if (displaymatrix && !theta)
|
|
||||||
theta = -av_display_rotation_get((int32_t*) displaymatrix);
|
|
||||||
|
|
||||||
theta -= 360*floor(theta/360 + 0.9/360);
|
|
||||||
|
|
||||||
if (fabs(theta - 90*round(theta/90)) > 2)
|
|
||||||
av_log(NULL, AV_LOG_WARNING, "Odd rotation angle.\n"
|
|
||||||
"If you want to help, upload a sample "
|
|
||||||
"of this file to ftp://upload.ffmpeg.org/incoming/ "
|
|
||||||
"and contact the ffmpeg-devel mailing list. (ffmpeg-devel@ffmpeg.org)");
|
|
||||||
|
|
||||||
return theta;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if CONFIG_AVDEVICE
|
#if CONFIG_AVDEVICE
|
||||||
static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts)
|
static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts)
|
||||||
{
|
{
|
||||||
@@ -2246,5 +2228,4 @@ int show_sinks(void *optctx, const char *opt, const char *arg)
|
|||||||
av_log_set_level(error_level);
|
av_log_set_level(error_level);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
22
cmdutils.h
22
cmdutils.h
@@ -19,8 +19,8 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CMDUTILS_H
|
#ifndef FFMPEG_CMDUTILS_H
|
||||||
#define CMDUTILS_H
|
#define FFMPEG_CMDUTILS_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ extern const int program_birth_year;
|
|||||||
|
|
||||||
extern AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB];
|
extern AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB];
|
||||||
extern AVFormatContext *avformat_opts;
|
extern AVFormatContext *avformat_opts;
|
||||||
extern AVDictionary *sws_dict;
|
extern struct SwsContext *sws_opts;
|
||||||
extern AVDictionary *swr_opts;
|
extern AVDictionary *swr_opts;
|
||||||
extern AVDictionary *format_opts, *codec_opts, *resample_opts;
|
extern AVDictionary *format_opts, *codec_opts, *resample_opts;
|
||||||
extern int hide_banner;
|
extern int hide_banner;
|
||||||
@@ -277,7 +277,7 @@ typedef struct OptionGroup {
|
|||||||
AVDictionary *codec_opts;
|
AVDictionary *codec_opts;
|
||||||
AVDictionary *format_opts;
|
AVDictionary *format_opts;
|
||||||
AVDictionary *resample_opts;
|
AVDictionary *resample_opts;
|
||||||
AVDictionary *sws_dict;
|
struct SwsContext *sws_opts;
|
||||||
AVDictionary *swr_opts;
|
AVDictionary *swr_opts;
|
||||||
} OptionGroup;
|
} OptionGroup;
|
||||||
|
|
||||||
@@ -529,6 +529,18 @@ int show_colors(void *optctx, const char *opt, const char *arg);
|
|||||||
*/
|
*/
|
||||||
int read_yesno(void);
|
int read_yesno(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the file with name filename, and put its content in a newly
|
||||||
|
* allocated 0-terminated buffer.
|
||||||
|
*
|
||||||
|
* @param filename file to read from
|
||||||
|
* @param bufptr location where pointer to buffer is returned
|
||||||
|
* @param size location where size of buffer is returned
|
||||||
|
* @return >= 0 in case of success, a negative value corresponding to an
|
||||||
|
* AVERROR error code in case of failure.
|
||||||
|
*/
|
||||||
|
int cmdutils_read_file(const char *filename, char **bufptr, size_t *size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a file corresponding to a preset file.
|
* Get a file corresponding to a preset file.
|
||||||
*
|
*
|
||||||
@@ -585,6 +597,4 @@ void *grow_array(void *array, int elem_size, int *size, int new_size);
|
|||||||
char name[128];\
|
char name[128];\
|
||||||
av_get_channel_layout_string(name, sizeof(name), 0, ch_layout);
|
av_get_channel_layout_string(name, sizeof(name), 0, ch_layout);
|
||||||
|
|
||||||
double get_rotation(AVStream *st);
|
|
||||||
|
|
||||||
#endif /* CMDUTILS_H */
|
#endif /* CMDUTILS_H */
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
#include "libavutil/time.h"
|
#include "libavutil/time.h"
|
||||||
#include "libavutil/log.h"
|
#include "libavutil/log.h"
|
||||||
#include "libavutil/opencl.h"
|
#include "libavutil/opencl.h"
|
||||||
#include "libavutil/avstring.h"
|
|
||||||
#include "cmdutils.h"
|
#include "cmdutils.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -206,9 +205,7 @@ end:
|
|||||||
|
|
||||||
static int compare_ocl_device_desc(const void *a, const void *b)
|
static int compare_ocl_device_desc(const void *a, const void *b)
|
||||||
{
|
{
|
||||||
const OpenCLDeviceBenchmark* va = (const OpenCLDeviceBenchmark*)a;
|
return ((OpenCLDeviceBenchmark*)a)->runtime - ((OpenCLDeviceBenchmark*)b)->runtime;
|
||||||
const OpenCLDeviceBenchmark* vb = (const OpenCLDeviceBenchmark*)b;
|
|
||||||
return FFDIFFSIGN(va->runtime , vb->runtime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int opt_opencl_bench(void *optctx, const char *opt, const char *arg)
|
int opt_opencl_bench(void *optctx, const char *opt, const char *arg)
|
||||||
@@ -241,8 +238,7 @@ int opt_opencl_bench(void *optctx, const char *opt, const char *arg)
|
|||||||
devices[count].platform_idx = i;
|
devices[count].platform_idx = i;
|
||||||
devices[count].device_idx = j;
|
devices[count].device_idx = j;
|
||||||
devices[count].runtime = score;
|
devices[count].runtime = score;
|
||||||
av_strlcpy(devices[count].device_name, device_node->device_name,
|
strcpy(devices[count].device_name, device_node->device_name);
|
||||||
sizeof(devices[count].device_name));
|
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
36
common.mak
36
common.mak
@@ -7,7 +7,7 @@ all: all-yes
|
|||||||
|
|
||||||
DEFAULT_YASMD=.dbg
|
DEFAULT_YASMD=.dbg
|
||||||
|
|
||||||
ifeq ($(DBG),1)
|
ifeq (1, DBG)
|
||||||
YASMD=$(DEFAULT_YASMD)
|
YASMD=$(DEFAULT_YASMD)
|
||||||
else
|
else
|
||||||
YASMD=
|
YASMD=
|
||||||
@@ -18,7 +18,7 @@ ifndef SUBDIR
|
|||||||
ifndef V
|
ifndef V
|
||||||
Q = @
|
Q = @
|
||||||
ECHO = printf "$(1)\t%s\n" $(2)
|
ECHO = printf "$(1)\t%s\n" $(2)
|
||||||
BRIEF = CC CXX OBJCC HOSTCC HOSTLD AS YASM AR LD STRIP CP WINDRES
|
BRIEF = CC CXX HOSTCC HOSTLD AS YASM AR LD STRIP CP WINDRES
|
||||||
SILENT = DEPCC DEPHOSTCC DEPAS DEPYASM RANLIB RM
|
SILENT = DEPCC DEPHOSTCC DEPAS DEPYASM RANLIB RM
|
||||||
|
|
||||||
MSG = $@
|
MSG = $@
|
||||||
@@ -32,14 +32,12 @@ endif
|
|||||||
ALLFFLIBS = avcodec avdevice avfilter avformat avresample avutil postproc swscale swresample
|
ALLFFLIBS = avcodec avdevice avfilter avformat avresample avutil postproc swscale swresample
|
||||||
|
|
||||||
# NASM requires -I path terminated with /
|
# NASM requires -I path terminated with /
|
||||||
IFLAGS := -I. -I$(SRC_LINK)/
|
IFLAGS := -I. -I$(SRC_PATH)/
|
||||||
CPPFLAGS := $(IFLAGS) $(CPPFLAGS)
|
CPPFLAGS := $(IFLAGS) $(CPPFLAGS)
|
||||||
CFLAGS += $(ECFLAGS)
|
CFLAGS += $(ECFLAGS)
|
||||||
CCFLAGS = $(CPPFLAGS) $(CFLAGS)
|
CCFLAGS = $(CPPFLAGS) $(CFLAGS)
|
||||||
OBJCFLAGS += $(EOBJCFLAGS)
|
|
||||||
OBJCCFLAGS = $(CPPFLAGS) $(CFLAGS) $(OBJCFLAGS)
|
|
||||||
ASFLAGS := $(CPPFLAGS) $(ASFLAGS)
|
ASFLAGS := $(CPPFLAGS) $(ASFLAGS)
|
||||||
CXXFLAGS := $(CPPFLAGS) $(CFLAGS) $(CXXFLAGS)
|
CXXFLAGS += $(CPPFLAGS) $(CFLAGS)
|
||||||
YASMFLAGS += $(IFLAGS:%=%/) -Pconfig.asm
|
YASMFLAGS += $(IFLAGS:%=%/) -Pconfig.asm
|
||||||
|
|
||||||
HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS)
|
HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS)
|
||||||
@@ -47,13 +45,12 @@ LDFLAGS := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS)
|
|||||||
|
|
||||||
define COMPILE
|
define COMPILE
|
||||||
$(call $(1)DEP,$(1))
|
$(call $(1)DEP,$(1))
|
||||||
$($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<)
|
$($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $<
|
||||||
endef
|
endef
|
||||||
|
|
||||||
COMPILE_C = $(call COMPILE,CC)
|
COMPILE_C = $(call COMPILE,CC)
|
||||||
COMPILE_CXX = $(call COMPILE,CXX)
|
COMPILE_CXX = $(call COMPILE,CXX)
|
||||||
COMPILE_S = $(call COMPILE,AS)
|
COMPILE_S = $(call COMPILE,AS)
|
||||||
COMPILE_M = $(call COMPILE,OBJCC)
|
|
||||||
COMPILE_HOSTC = $(call COMPILE,HOSTCC)
|
COMPILE_HOSTC = $(call COMPILE,HOSTCC)
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@@ -63,10 +60,10 @@ COMPILE_HOSTC = $(call COMPILE,HOSTCC)
|
|||||||
$(COMPILE_CXX)
|
$(COMPILE_CXX)
|
||||||
|
|
||||||
%.o: %.m
|
%.o: %.m
|
||||||
$(COMPILE_M)
|
$(COMPILE_C)
|
||||||
|
|
||||||
%.s: %.c
|
%.s: %.c
|
||||||
$(CC) $(CCFLAGS) -S -o $@ $<
|
$(CC) $(CPPFLAGS) $(CFLAGS) -S -o $@ $<
|
||||||
|
|
||||||
%.o: %.S
|
%.o: %.S
|
||||||
$(COMPILE_S)
|
$(COMPILE_S)
|
||||||
@@ -84,9 +81,7 @@ COMPILE_HOSTC = $(call COMPILE,HOSTCC)
|
|||||||
$(Q)echo '#include "$*.h"' >$@
|
$(Q)echo '#include "$*.h"' >$@
|
||||||
|
|
||||||
%.ver: %.v
|
%.ver: %.v
|
||||||
$(Q)sed 's/$$MAJOR/$($(basename $(@F))_VERSION_MAJOR)/' $^ | sed -e 's/:/:\
|
$(Q)sed 's/$$MAJOR/$($(basename $(@F))_VERSION_MAJOR)/' $^ > $@
|
||||||
/' -e 's/; /;\
|
|
||||||
/g' > $@
|
|
||||||
|
|
||||||
%.c %.h: TAG = GEN
|
%.c %.h: TAG = GEN
|
||||||
|
|
||||||
@@ -114,8 +109,8 @@ FFEXTRALIBS := $(LDLIBS:%=$(LD_LIB)) $(EXTRALIBS)
|
|||||||
|
|
||||||
OBJS := $(sort $(OBJS:%=$(SUBDIR)%))
|
OBJS := $(sort $(OBJS:%=$(SUBDIR)%))
|
||||||
SLIBOBJS := $(sort $(SLIBOBJS:%=$(SUBDIR)%))
|
SLIBOBJS := $(sort $(SLIBOBJS:%=$(SUBDIR)%))
|
||||||
TESTOBJS := $(TESTOBJS:%=$(SUBDIR)tests/%) $(TESTPROGS:%=$(SUBDIR)tests/%.o)
|
TESTOBJS := $(TESTOBJS:%=$(SUBDIR)%) $(TESTPROGS:%=$(SUBDIR)%-test.o)
|
||||||
TESTPROGS := $(TESTPROGS:%=$(SUBDIR)tests/%$(EXESUF))
|
TESTPROGS := $(TESTPROGS:%=$(SUBDIR)%-test$(EXESUF))
|
||||||
HOSTOBJS := $(HOSTPROGS:%=$(SUBDIR)%.o)
|
HOSTOBJS := $(HOSTPROGS:%=$(SUBDIR)%.o)
|
||||||
HOSTPROGS := $(HOSTPROGS:%=$(SUBDIR)%$(HOSTEXESUF))
|
HOSTPROGS := $(HOSTPROGS:%=$(SUBDIR)%$(HOSTEXESUF))
|
||||||
TOOLS += $(TOOLS-yes)
|
TOOLS += $(TOOLS-yes)
|
||||||
@@ -123,9 +118,8 @@ TOOLOBJS := $(TOOLS:%=tools/%.o)
|
|||||||
TOOLS := $(TOOLS:%=tools/%$(EXESUF))
|
TOOLS := $(TOOLS:%=tools/%$(EXESUF))
|
||||||
HEADERS += $(HEADERS-yes)
|
HEADERS += $(HEADERS-yes)
|
||||||
|
|
||||||
PATH_LIBNAME = $(foreach NAME,$(1),lib$(NAME)/$($(2)LIBNAME))
|
PATH_LIBNAME = $(foreach NAME,$(1),lib$(NAME)/$($(CONFIG_SHARED:yes=S)LIBNAME))
|
||||||
DEP_LIBS := $(foreach lib,$(FFLIBS),$(call PATH_LIBNAME,$(lib),$(CONFIG_SHARED:yes=S)))
|
DEP_LIBS := $(foreach lib,$(FFLIBS),$(call PATH_LIBNAME,$(lib)))
|
||||||
STATIC_DEP_LIBS := $(foreach lib,$(FFLIBS),$(call PATH_LIBNAME,$(lib)))
|
|
||||||
|
|
||||||
SRC_DIR := $(SRC_PATH)/lib$(NAME)
|
SRC_DIR := $(SRC_PATH)/lib$(NAME)
|
||||||
ALLHEADERS := $(subst $(SRC_DIR)/,$(SUBDIR),$(wildcard $(SRC_DIR)/*.h $(SRC_DIR)/$(ARCH)/*.h))
|
ALLHEADERS := $(subst $(SRC_DIR)/,$(SUBDIR),$(wildcard $(SRC_DIR)/*.h $(SRC_DIR)/$(ARCH)/*.h))
|
||||||
@@ -152,13 +146,15 @@ $(TOOLOBJS): | tools
|
|||||||
|
|
||||||
OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SLIBOBJS) $(TESTOBJS))
|
OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SLIBOBJS) $(TESTOBJS))
|
||||||
|
|
||||||
CLEANSUFFIXES = *.d *.o *~ *.h.c *.map *.ver *.ver-sol2 *.ho *.gcno *.gcda *$(DEFAULT_YASMD).asm
|
CLEANSUFFIXES = *.d *.o *~ *.h.c *.map *.ver *.ho *.gcno *.gcda *$(DEFAULT_YASMD).asm
|
||||||
DISTCLEANSUFFIXES = *.pc
|
DISTCLEANSUFFIXES = *.pc
|
||||||
LIBSUFFIXES = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a
|
LIBSUFFIXES = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a
|
||||||
|
|
||||||
define RULES
|
define RULES
|
||||||
clean::
|
clean::
|
||||||
$(RM) $(HOSTPROGS) $(TESTPROGS) $(TOOLS)
|
$(RM) $(OBJS) $(OBJS:.o=.d) $(OBJS:.o=$(DEFAULT_YASMD).d)
|
||||||
|
$(RM) $(HOSTPROGS)
|
||||||
|
$(RM) $(TOOLS)
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(RULES))
|
$(eval $(RULES))
|
||||||
|
|||||||
@@ -19,8 +19,8 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef COMPAT_AIX_MATH_H
|
#ifndef FFMPEG_COMPAT_AIX_MATH_H
|
||||||
#define COMPAT_AIX_MATH_H
|
#define FFMPEG_COMPAT_AIX_MATH_H
|
||||||
|
|
||||||
#define class class_in_math_h_causes_problems
|
#define class class_in_math_h_causes_problems
|
||||||
|
|
||||||
@@ -28,4 +28,4 @@
|
|||||||
|
|
||||||
#undef class
|
#undef class
|
||||||
|
|
||||||
#endif /* COMPAT_AIX_MATH_H */
|
#endif /* FFMPEG_COMPAT_AIX_MATH_H */
|
||||||
|
|||||||
@@ -38,9 +38,40 @@
|
|||||||
#ifndef __AVISYNTH_C__
|
#ifndef __AVISYNTH_C__
|
||||||
#define __AVISYNTH_C__
|
#define __AVISYNTH_C__
|
||||||
|
|
||||||
#include "avs/config.h"
|
#ifdef __cplusplus
|
||||||
#include "avs/capi.h"
|
# define EXTERN_C extern "C"
|
||||||
#include "avs/types.h"
|
#else
|
||||||
|
# define EXTERN_C
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define AVSC_USE_STDCALL 1
|
||||||
|
|
||||||
|
#ifndef AVSC_USE_STDCALL
|
||||||
|
# define AVSC_CC __cdecl
|
||||||
|
#else
|
||||||
|
# define AVSC_CC __stdcall
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define AVSC_INLINE static __inline
|
||||||
|
|
||||||
|
#ifdef AVISYNTH_C_EXPORTS
|
||||||
|
# define AVSC_EXPORT EXTERN_C
|
||||||
|
# define AVSC_API(ret, name) EXTERN_C __declspec(dllexport) ret AVSC_CC name
|
||||||
|
#else
|
||||||
|
# define AVSC_EXPORT EXTERN_C __declspec(dllexport)
|
||||||
|
# ifndef AVSC_NO_DECLSPEC
|
||||||
|
# define AVSC_API(ret, name) EXTERN_C __declspec(dllimport) ret AVSC_CC name
|
||||||
|
# else
|
||||||
|
# define AVSC_API(ret, name) typedef ret (AVSC_CC *name##_func)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef unsigned char BYTE;
|
||||||
|
#ifdef __GNUC__
|
||||||
|
typedef long long int INT64;
|
||||||
|
#else
|
||||||
|
typedef __int64 INT64;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
||||||
@@ -48,8 +79,8 @@
|
|||||||
// Constants
|
// Constants
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef __AVISYNTH_6_H__
|
#ifndef __AVISYNTH_H__
|
||||||
enum { AVISYNTH_INTERFACE_VERSION = 6 };
|
enum { AVISYNTH_INTERFACE_VERSION = 4 };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum {AVS_SAMPLE_INT8 = 1<<0,
|
enum {AVS_SAMPLE_INT8 = 1<<0,
|
||||||
@@ -81,8 +112,8 @@ enum {AVS_CS_BGR = 1<<28,
|
|||||||
AVS_CS_PLANAR = 1<<31,
|
AVS_CS_PLANAR = 1<<31,
|
||||||
|
|
||||||
AVS_CS_SHIFT_SUB_WIDTH = 0,
|
AVS_CS_SHIFT_SUB_WIDTH = 0,
|
||||||
AVS_CS_SHIFT_SUB_HEIGHT = 8,
|
AVS_CS_SHIFT_SUB_HEIGHT = 1 << 3,
|
||||||
AVS_CS_SHIFT_SAMPLE_BITS = 16,
|
AVS_CS_SHIFT_SAMPLE_BITS = 1 << 4,
|
||||||
|
|
||||||
AVS_CS_SUB_WIDTH_MASK = 7 << AVS_CS_SHIFT_SUB_WIDTH,
|
AVS_CS_SUB_WIDTH_MASK = 7 << AVS_CS_SHIFT_SUB_WIDTH,
|
||||||
AVS_CS_SUB_WIDTH_1 = 3 << AVS_CS_SHIFT_SUB_WIDTH, // YV24
|
AVS_CS_SUB_WIDTH_1 = 3 << AVS_CS_SHIFT_SUB_WIDTH, // YV24
|
||||||
@@ -149,66 +180,15 @@ enum { //SUBTYPES
|
|||||||
AVS_FILTER_OUTPUT_TYPE_DIFFERENT=4};
|
AVS_FILTER_OUTPUT_TYPE_DIFFERENT=4};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
// New 2.6 explicitly defined cache hints.
|
AVS_CACHE_NOTHING=0,
|
||||||
AVS_CACHE_NOTHING=10, // Do not cache video.
|
AVS_CACHE_RANGE=1,
|
||||||
AVS_CACHE_WINDOW=11, // Hard protect upto X frames within a range of X from the current frame N.
|
AVS_CACHE_ALL=2,
|
||||||
AVS_CACHE_GENERIC=12, // LRU cache upto X frames.
|
AVS_CACHE_AUDIO=3,
|
||||||
AVS_CACHE_FORCE_GENERIC=13, // LRU cache upto X frames, override any previous CACHE_WINDOW.
|
AVS_CACHE_AUDIO_NONE=4,
|
||||||
|
AVS_CACHE_AUDIO_AUTO=5
|
||||||
AVS_CACHE_GET_POLICY=30, // Get the current policy.
|
|
||||||
AVS_CACHE_GET_WINDOW=31, // Get the current window h_span.
|
|
||||||
AVS_CACHE_GET_RANGE=32, // Get the current generic frame range.
|
|
||||||
|
|
||||||
AVS_CACHE_AUDIO=50, // Explicitly do cache audio, X byte cache.
|
|
||||||
AVS_CACHE_AUDIO_NOTHING=51, // Explicitly do not cache audio.
|
|
||||||
AVS_CACHE_AUDIO_NONE=52, // Audio cache off (auto mode), X byte intial cache.
|
|
||||||
AVS_CACHE_AUDIO_AUTO=53, // Audio cache on (auto mode), X byte intial cache.
|
|
||||||
|
|
||||||
AVS_CACHE_GET_AUDIO_POLICY=70, // Get the current audio policy.
|
|
||||||
AVS_CACHE_GET_AUDIO_SIZE=71, // Get the current audio cache size.
|
|
||||||
|
|
||||||
AVS_CACHE_PREFETCH_FRAME=100, // Queue request to prefetch frame N.
|
|
||||||
AVS_CACHE_PREFETCH_GO=101, // Action video prefetches.
|
|
||||||
|
|
||||||
AVS_CACHE_PREFETCH_AUDIO_BEGIN=120, // Begin queue request transaction to prefetch audio (take critical section).
|
|
||||||
AVS_CACHE_PREFETCH_AUDIO_STARTLO=121, // Set low 32 bits of start.
|
|
||||||
AVS_CACHE_PREFETCH_AUDIO_STARTHI=122, // Set high 32 bits of start.
|
|
||||||
AVS_CACHE_PREFETCH_AUDIO_COUNT=123, // Set low 32 bits of length.
|
|
||||||
AVS_CACHE_PREFETCH_AUDIO_COMMIT=124, // Enqueue request transaction to prefetch audio (release critical section).
|
|
||||||
AVS_CACHE_PREFETCH_AUDIO_GO=125, // Action audio prefetches.
|
|
||||||
|
|
||||||
AVS_CACHE_GETCHILD_CACHE_MODE=200, // Cache ask Child for desired video cache mode.
|
|
||||||
AVS_CACHE_GETCHILD_CACHE_SIZE=201, // Cache ask Child for desired video cache size.
|
|
||||||
AVS_CACHE_GETCHILD_AUDIO_MODE=202, // Cache ask Child for desired audio cache mode.
|
|
||||||
AVS_CACHE_GETCHILD_AUDIO_SIZE=203, // Cache ask Child for desired audio cache size.
|
|
||||||
|
|
||||||
AVS_CACHE_GETCHILD_COST=220, // Cache ask Child for estimated processing cost.
|
|
||||||
AVS_CACHE_COST_ZERO=221, // Child response of zero cost (ptr arithmetic only).
|
|
||||||
AVS_CACHE_COST_UNIT=222, // Child response of unit cost (less than or equal 1 full frame blit).
|
|
||||||
AVS_CACHE_COST_LOW=223, // Child response of light cost. (Fast)
|
|
||||||
AVS_CACHE_COST_MED=224, // Child response of medium cost. (Real time)
|
|
||||||
AVS_CACHE_COST_HI=225, // Child response of heavy cost. (Slow)
|
|
||||||
|
|
||||||
AVS_CACHE_GETCHILD_THREAD_MODE=240, // Cache ask Child for thread safetyness.
|
|
||||||
AVS_CACHE_THREAD_UNSAFE=241, // Only 1 thread allowed for all instances. 2.5 filters default!
|
|
||||||
AVS_CACHE_THREAD_CLASS=242, // Only 1 thread allowed for each instance. 2.6 filters default!
|
|
||||||
AVS_CACHE_THREAD_SAFE=243, // Allow all threads in any instance.
|
|
||||||
AVS_CACHE_THREAD_OWN=244, // Safe but limit to 1 thread, internally threaded.
|
|
||||||
|
|
||||||
AVS_CACHE_GETCHILD_ACCESS_COST=260, // Cache ask Child for preferred access pattern.
|
|
||||||
AVS_CACHE_ACCESS_RAND=261, // Filter is access order agnostic.
|
|
||||||
AVS_CACHE_ACCESS_SEQ0=262, // Filter prefers sequential access (low cost)
|
|
||||||
AVS_CACHE_ACCESS_SEQ1=263, // Filter needs sequential access (high cost)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef BUILDING_AVSCORE
|
#define AVS_FRAME_ALIGN 16
|
||||||
struct AVS_ScriptEnvironment {
|
|
||||||
IScriptEnvironment * env;
|
|
||||||
const char * error;
|
|
||||||
AVS_ScriptEnvironment(IScriptEnvironment * e = 0)
|
|
||||||
: env(e), error(0) {}
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct AVS_Clip AVS_Clip;
|
typedef struct AVS_Clip AVS_Clip;
|
||||||
typedef struct AVS_ScriptEnvironment AVS_ScriptEnvironment;
|
typedef struct AVS_ScriptEnvironment AVS_ScriptEnvironment;
|
||||||
@@ -258,23 +238,29 @@ AVSC_INLINE int avs_is_yuv(const AVS_VideoInfo * p)
|
|||||||
AVSC_INLINE int avs_is_yuy2(const AVS_VideoInfo * p)
|
AVSC_INLINE int avs_is_yuy2(const AVS_VideoInfo * p)
|
||||||
{ return (p->pixel_type & AVS_CS_YUY2) == AVS_CS_YUY2; }
|
{ return (p->pixel_type & AVS_CS_YUY2) == AVS_CS_YUY2; }
|
||||||
|
|
||||||
AVSC_API(int, avs_is_yv24)(const AVS_VideoInfo * p);
|
AVSC_INLINE int avs_is_yv24(const AVS_VideoInfo * p)
|
||||||
|
{ return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YV24 & AVS_CS_PLANAR_FILTER); }
|
||||||
|
|
||||||
AVSC_API(int, avs_is_yv16)(const AVS_VideoInfo * p);
|
AVSC_INLINE int avs_is_yv16(const AVS_VideoInfo * p)
|
||||||
|
{ return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YV16 & AVS_CS_PLANAR_FILTER); }
|
||||||
|
|
||||||
AVSC_API(int, avs_is_yv12)(const AVS_VideoInfo * p) ;
|
AVSC_INLINE int avs_is_yv12(const AVS_VideoInfo * p)
|
||||||
|
{ return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YV12 & AVS_CS_PLANAR_FILTER); }
|
||||||
|
|
||||||
AVSC_API(int, avs_is_yv411)(const AVS_VideoInfo * p);
|
AVSC_INLINE int avs_is_yv411(const AVS_VideoInfo * p)
|
||||||
|
{ return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_YV411 & AVS_CS_PLANAR_FILTER); }
|
||||||
|
|
||||||
AVSC_API(int, avs_is_y8)(const AVS_VideoInfo * p);
|
AVSC_INLINE int avs_is_y8(const AVS_VideoInfo * p)
|
||||||
|
{ return (p->pixel_type & AVS_CS_PLANAR_MASK) == (AVS_CS_Y8 & AVS_CS_PLANAR_FILTER); }
|
||||||
|
|
||||||
AVSC_INLINE int avs_is_property(const AVS_VideoInfo * p, int property)
|
AVSC_INLINE int avs_is_property(const AVS_VideoInfo * p, int property)
|
||||||
{ return ((p->image_type & property)==property ); }
|
{ return ((p->pixel_type & property)==property ); }
|
||||||
|
|
||||||
AVSC_INLINE int avs_is_planar(const AVS_VideoInfo * p)
|
AVSC_INLINE int avs_is_planar(const AVS_VideoInfo * p)
|
||||||
{ return !!(p->pixel_type & AVS_CS_PLANAR); }
|
{ return !!(p->pixel_type & AVS_CS_PLANAR); }
|
||||||
|
|
||||||
AVSC_API(int, avs_is_color_space)(const AVS_VideoInfo * p, int c_space);
|
AVSC_INLINE int avs_is_color_space(const AVS_VideoInfo * p, int c_space)
|
||||||
|
{ return avs_is_planar(p) ? ((p->pixel_type & AVS_CS_PLANAR_MASK) == (c_space & AVS_CS_PLANAR_FILTER)) : ((p->pixel_type & c_space) == c_space); }
|
||||||
|
|
||||||
AVSC_INLINE int avs_is_field_based(const AVS_VideoInfo * p)
|
AVSC_INLINE int avs_is_field_based(const AVS_VideoInfo * p)
|
||||||
{ return !!(p->image_type & AVS_IT_FIELDBASED); }
|
{ return !!(p->image_type & AVS_IT_FIELDBASED); }
|
||||||
@@ -288,18 +274,25 @@ AVSC_INLINE int avs_is_bff(const AVS_VideoInfo * p)
|
|||||||
AVSC_INLINE int avs_is_tff(const AVS_VideoInfo * p)
|
AVSC_INLINE int avs_is_tff(const AVS_VideoInfo * p)
|
||||||
{ return !!(p->image_type & AVS_IT_TFF); }
|
{ return !!(p->image_type & AVS_IT_TFF); }
|
||||||
|
|
||||||
AVSC_API(int, avs_get_plane_width_subsampling)(const AVS_VideoInfo * p, int plane);
|
AVSC_INLINE int avs_bits_per_pixel(const AVS_VideoInfo * p)
|
||||||
|
{
|
||||||
|
switch (p->pixel_type) {
|
||||||
|
case AVS_CS_BGR24: return 24;
|
||||||
|
case AVS_CS_BGR32: return 32;
|
||||||
|
case AVS_CS_YUY2: return 16;
|
||||||
|
case AVS_CS_YV12:
|
||||||
|
case AVS_CS_I420: return 12;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AVSC_INLINE int avs_bytes_from_pixels(const AVS_VideoInfo * p, int pixels)
|
||||||
|
{ return pixels * (avs_bits_per_pixel(p)>>3); } // Will work on planar images, but will return only luma planes
|
||||||
|
|
||||||
AVSC_API(int, avs_get_plane_height_subsampling)(const AVS_VideoInfo * p, int plane);
|
AVSC_INLINE int avs_row_size(const AVS_VideoInfo * p)
|
||||||
|
{ return avs_bytes_from_pixels(p,p->width); } // Also only returns first plane on planar images
|
||||||
|
|
||||||
|
AVSC_INLINE int avs_bmp_size(const AVS_VideoInfo * vi)
|
||||||
AVSC_API(int, avs_bits_per_pixel)(const AVS_VideoInfo * p);
|
{ if (avs_is_planar(vi)) {int p = vi->height * ((avs_row_size(vi)+3) & ~3); p+=p>>1; return p; } return vi->height * ((avs_row_size(vi)+3) & ~3); }
|
||||||
|
|
||||||
AVSC_API(int, avs_bytes_from_pixels)(const AVS_VideoInfo * p, int pixels);
|
|
||||||
|
|
||||||
AVSC_API(int, avs_row_size)(const AVS_VideoInfo * p, int plane);
|
|
||||||
|
|
||||||
AVSC_API(int, avs_bmp_size)(const AVS_VideoInfo * vi);
|
|
||||||
|
|
||||||
AVSC_INLINE int avs_samples_per_second(const AVS_VideoInfo * p)
|
AVSC_INLINE int avs_samples_per_second(const AVS_VideoInfo * p)
|
||||||
{ return p->audio_samples_per_second; }
|
{ return p->audio_samples_per_second; }
|
||||||
@@ -357,13 +350,11 @@ AVSC_INLINE void avs_set_fps(AVS_VideoInfo * p, unsigned numerator, unsigned den
|
|||||||
p->fps_denominator = denominator/x;
|
p->fps_denominator = denominator/x;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef AVS_IMPLICIT_FUNCTION_DECLARATION_ERROR
|
|
||||||
AVSC_INLINE int avs_is_same_colorspace(AVS_VideoInfo * x, AVS_VideoInfo * y)
|
AVSC_INLINE int avs_is_same_colorspace(AVS_VideoInfo * x, AVS_VideoInfo * y)
|
||||||
{
|
{
|
||||||
return (x->pixel_type == y->pixel_type)
|
return (x->pixel_type == y->pixel_type)
|
||||||
|| (avs_is_yv12(x) && avs_is_yv12(y));
|
|| (avs_is_yv12(x) && avs_is_yv12(y));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
@@ -400,38 +391,89 @@ typedef struct AVS_VideoFrame {
|
|||||||
} AVS_VideoFrame;
|
} AVS_VideoFrame;
|
||||||
|
|
||||||
// Access functions for AVS_VideoFrame
|
// Access functions for AVS_VideoFrame
|
||||||
AVSC_API(int, avs_get_pitch_p)(const AVS_VideoFrame * p, int plane);
|
|
||||||
|
|
||||||
#ifdef AVS_IMPLICIT_FUNCTION_DECLARATION_ERROR
|
|
||||||
AVSC_INLINE int avs_get_pitch(const AVS_VideoFrame * p) {
|
AVSC_INLINE int avs_get_pitch(const AVS_VideoFrame * p) {
|
||||||
return avs_get_pitch_p(p, 0);}
|
return p->pitch;}
|
||||||
#endif
|
|
||||||
|
|
||||||
AVSC_API(int, avs_get_row_size_p)(const AVS_VideoFrame * p, int plane);
|
AVSC_INLINE int avs_get_pitch_p(const AVS_VideoFrame * p, int plane) {
|
||||||
|
switch (plane) {
|
||||||
|
case AVS_PLANAR_U: case AVS_PLANAR_V: return p->pitchUV;}
|
||||||
|
return p->pitch;}
|
||||||
|
|
||||||
AVSC_INLINE int avs_get_row_size(const AVS_VideoFrame * p) {
|
AVSC_INLINE int avs_get_row_size(const AVS_VideoFrame * p) {
|
||||||
return p->row_size; }
|
return p->row_size; }
|
||||||
|
|
||||||
AVSC_API(int, avs_get_height_p)(const AVS_VideoFrame * p, int plane);
|
AVSC_INLINE int avs_get_row_size_p(const AVS_VideoFrame * p, int plane) {
|
||||||
|
int r;
|
||||||
|
switch (plane) {
|
||||||
|
case AVS_PLANAR_U: case AVS_PLANAR_V:
|
||||||
|
if (p->pitchUV) return p->row_sizeUV;
|
||||||
|
else return 0;
|
||||||
|
case AVS_PLANAR_U_ALIGNED: case AVS_PLANAR_V_ALIGNED:
|
||||||
|
if (p->pitchUV) {
|
||||||
|
r = (p->row_sizeUV+AVS_FRAME_ALIGN-1)&(~(AVS_FRAME_ALIGN-1)); // Aligned rowsize
|
||||||
|
if (r < p->pitchUV)
|
||||||
|
return r;
|
||||||
|
return p->row_sizeUV;
|
||||||
|
} else return 0;
|
||||||
|
case AVS_PLANAR_Y_ALIGNED:
|
||||||
|
r = (p->row_size+AVS_FRAME_ALIGN-1)&(~(AVS_FRAME_ALIGN-1)); // Aligned rowsize
|
||||||
|
if (r <= p->pitch)
|
||||||
|
return r;
|
||||||
|
return p->row_size;
|
||||||
|
}
|
||||||
|
return p->row_size;
|
||||||
|
}
|
||||||
|
|
||||||
AVSC_INLINE int avs_get_height(const AVS_VideoFrame * p) {
|
AVSC_INLINE int avs_get_height(const AVS_VideoFrame * p) {
|
||||||
return p->height;}
|
return p->height;}
|
||||||
|
|
||||||
AVSC_API(const BYTE *, avs_get_read_ptr_p)(const AVS_VideoFrame * p, int plane);
|
AVSC_INLINE int avs_get_height_p(const AVS_VideoFrame * p, int plane) {
|
||||||
|
switch (plane) {
|
||||||
|
case AVS_PLANAR_U: case AVS_PLANAR_V:
|
||||||
|
if (p->pitchUV) return p->heightUV;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return p->height;}
|
||||||
|
|
||||||
#ifdef AVS_IMPLICIT_FUNCTION_DECLARATION_ERROR
|
|
||||||
AVSC_INLINE const BYTE* avs_get_read_ptr(const AVS_VideoFrame * p) {
|
AVSC_INLINE const BYTE* avs_get_read_ptr(const AVS_VideoFrame * p) {
|
||||||
return avs_get_read_ptr_p(p, 0);}
|
return p->vfb->data + p->offset;}
|
||||||
#endif
|
|
||||||
|
|
||||||
AVSC_API(int, avs_is_writable)(const AVS_VideoFrame * p);
|
AVSC_INLINE const BYTE* avs_get_read_ptr_p(const AVS_VideoFrame * p, int plane)
|
||||||
|
{
|
||||||
|
switch (plane) {
|
||||||
|
case AVS_PLANAR_U: return p->vfb->data + p->offsetU;
|
||||||
|
case AVS_PLANAR_V: return p->vfb->data + p->offsetV;
|
||||||
|
default: return p->vfb->data + p->offset;}
|
||||||
|
}
|
||||||
|
|
||||||
AVSC_API(BYTE *, avs_get_write_ptr_p)(const AVS_VideoFrame * p, int plane);
|
AVSC_INLINE int avs_is_writable(const AVS_VideoFrame * p) {
|
||||||
|
return (p->refcount == 1 && p->vfb->refcount == 1);}
|
||||||
|
|
||||||
|
AVSC_INLINE BYTE* avs_get_write_ptr(const AVS_VideoFrame * p)
|
||||||
|
{
|
||||||
|
if (avs_is_writable(p)) {
|
||||||
|
++p->vfb->sequence_number;
|
||||||
|
return p->vfb->data + p->offset;
|
||||||
|
} else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
AVSC_INLINE BYTE* avs_get_write_ptr_p(const AVS_VideoFrame * p, int plane)
|
||||||
|
{
|
||||||
|
if (plane==AVS_PLANAR_Y && avs_is_writable(p)) {
|
||||||
|
++p->vfb->sequence_number;
|
||||||
|
return p->vfb->data + p->offset;
|
||||||
|
} else if (plane==AVS_PLANAR_Y) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
switch (plane) {
|
||||||
|
case AVS_PLANAR_U: return p->vfb->data + p->offsetU;
|
||||||
|
case AVS_PLANAR_V: return p->vfb->data + p->offsetV;
|
||||||
|
default: return p->vfb->data + p->offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef AVS_IMPLICIT_FUNCTION_DECLARATION_ERROR
|
|
||||||
AVSC_INLINE BYTE* avs_get_write_ptr(const AVS_VideoFrame * p) {
|
|
||||||
return avs_get_write_ptr_p(p, 0);}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
AVSC_API(void, avs_release_video_frame)(AVS_VideoFrame *);
|
AVSC_API(void, avs_release_video_frame)(AVS_VideoFrame *);
|
||||||
// makes a shallow copy of a video frame
|
// makes a shallow copy of a video frame
|
||||||
@@ -616,16 +658,12 @@ enum {
|
|||||||
AVS_CPUF_SSSE3 = 0x200, // Core 2
|
AVS_CPUF_SSSE3 = 0x200, // Core 2
|
||||||
AVS_CPUF_SSE4 = 0x400, // Penryn, Wolfdale, Yorkfield
|
AVS_CPUF_SSE4 = 0x400, // Penryn, Wolfdale, Yorkfield
|
||||||
AVS_CPUF_SSE4_1 = 0x400,
|
AVS_CPUF_SSE4_1 = 0x400,
|
||||||
//AVS_CPUF_AVX = 0x800, // Sandy Bridge, Bulldozer
|
AVS_CPUF_SSE4_2 = 0x800, // Nehalem
|
||||||
AVS_CPUF_SSE4_2 = 0x1000, // Nehalem
|
|
||||||
//AVS_CPUF_AVX2 = 0x2000, // Haswell
|
|
||||||
//AVS_CPUF_AVX512 = 0x4000, // Knights Landing
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
AVSC_API(const char *, avs_get_error)(AVS_ScriptEnvironment *); // return 0 if no error
|
AVSC_API(const char *, avs_get_error)(AVS_ScriptEnvironment *); // return 0 if no error
|
||||||
|
|
||||||
AVSC_API(int, avs_get_cpu_flags)(AVS_ScriptEnvironment *);
|
AVSC_API(long, avs_get_cpu_flags)(AVS_ScriptEnvironment *);
|
||||||
AVSC_API(int, avs_check_version)(AVS_ScriptEnvironment *, int version);
|
AVSC_API(int, avs_check_version)(AVS_ScriptEnvironment *, int version);
|
||||||
|
|
||||||
AVSC_API(char *, avs_save_string)(AVS_ScriptEnvironment *, const char* s, int length);
|
AVSC_API(char *, avs_save_string)(AVS_ScriptEnvironment *, const char* s, int length);
|
||||||
@@ -662,12 +700,12 @@ AVSC_API(AVS_VideoFrame *, avs_new_video_frame_a)(AVS_ScriptEnvironment *,
|
|||||||
AVSC_INLINE
|
AVSC_INLINE
|
||||||
AVS_VideoFrame * avs_new_video_frame(AVS_ScriptEnvironment * env,
|
AVS_VideoFrame * avs_new_video_frame(AVS_ScriptEnvironment * env,
|
||||||
const AVS_VideoInfo * vi)
|
const AVS_VideoInfo * vi)
|
||||||
{return avs_new_video_frame_a(env,vi,FRAME_ALIGN);}
|
{return avs_new_video_frame_a(env,vi,AVS_FRAME_ALIGN);}
|
||||||
|
|
||||||
AVSC_INLINE
|
AVSC_INLINE
|
||||||
AVS_VideoFrame * avs_new_frame(AVS_ScriptEnvironment * env,
|
AVS_VideoFrame * avs_new_frame(AVS_ScriptEnvironment * env,
|
||||||
const AVS_VideoInfo * vi)
|
const AVS_VideoInfo * vi)
|
||||||
{return avs_new_video_frame_a(env,vi,FRAME_ALIGN);}
|
{return avs_new_video_frame_a(env,vi,AVS_FRAME_ALIGN);}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -735,6 +773,7 @@ struct AVS_Library {
|
|||||||
AVSC_DECLARE_FUNC(avs_function_exists);
|
AVSC_DECLARE_FUNC(avs_function_exists);
|
||||||
AVSC_DECLARE_FUNC(avs_get_audio);
|
AVSC_DECLARE_FUNC(avs_get_audio);
|
||||||
AVSC_DECLARE_FUNC(avs_get_cpu_flags);
|
AVSC_DECLARE_FUNC(avs_get_cpu_flags);
|
||||||
|
AVSC_DECLARE_FUNC(avs_get_error);
|
||||||
AVSC_DECLARE_FUNC(avs_get_frame);
|
AVSC_DECLARE_FUNC(avs_get_frame);
|
||||||
AVSC_DECLARE_FUNC(avs_get_parity);
|
AVSC_DECLARE_FUNC(avs_get_parity);
|
||||||
AVSC_DECLARE_FUNC(avs_get_var);
|
AVSC_DECLARE_FUNC(avs_get_var);
|
||||||
@@ -759,27 +798,6 @@ struct AVS_Library {
|
|||||||
AVSC_DECLARE_FUNC(avs_subframe_planar);
|
AVSC_DECLARE_FUNC(avs_subframe_planar);
|
||||||
AVSC_DECLARE_FUNC(avs_take_clip);
|
AVSC_DECLARE_FUNC(avs_take_clip);
|
||||||
AVSC_DECLARE_FUNC(avs_vsprintf);
|
AVSC_DECLARE_FUNC(avs_vsprintf);
|
||||||
|
|
||||||
AVSC_DECLARE_FUNC(avs_get_error);
|
|
||||||
AVSC_DECLARE_FUNC(avs_is_yv24);
|
|
||||||
AVSC_DECLARE_FUNC(avs_is_yv16);
|
|
||||||
AVSC_DECLARE_FUNC(avs_is_yv12);
|
|
||||||
AVSC_DECLARE_FUNC(avs_is_yv411);
|
|
||||||
AVSC_DECLARE_FUNC(avs_is_y8);
|
|
||||||
AVSC_DECLARE_FUNC(avs_is_color_space);
|
|
||||||
|
|
||||||
AVSC_DECLARE_FUNC(avs_get_plane_width_subsampling);
|
|
||||||
AVSC_DECLARE_FUNC(avs_get_plane_height_subsampling);
|
|
||||||
AVSC_DECLARE_FUNC(avs_bits_per_pixel);
|
|
||||||
AVSC_DECLARE_FUNC(avs_bytes_from_pixels);
|
|
||||||
AVSC_DECLARE_FUNC(avs_row_size);
|
|
||||||
AVSC_DECLARE_FUNC(avs_bmp_size);
|
|
||||||
AVSC_DECLARE_FUNC(avs_get_pitch_p);
|
|
||||||
AVSC_DECLARE_FUNC(avs_get_row_size_p);
|
|
||||||
AVSC_DECLARE_FUNC(avs_get_height_p);
|
|
||||||
AVSC_DECLARE_FUNC(avs_get_read_ptr_p);
|
|
||||||
AVSC_DECLARE_FUNC(avs_is_writable);
|
|
||||||
AVSC_DECLARE_FUNC(avs_get_write_ptr_p);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#undef AVSC_DECLARE_FUNC
|
#undef AVSC_DECLARE_FUNC
|
||||||
@@ -787,7 +805,7 @@ struct AVS_Library {
|
|||||||
|
|
||||||
AVSC_INLINE AVS_Library * avs_load_library() {
|
AVSC_INLINE AVS_Library * avs_load_library() {
|
||||||
AVS_Library *library = (AVS_Library *)malloc(sizeof(AVS_Library));
|
AVS_Library *library = (AVS_Library *)malloc(sizeof(AVS_Library));
|
||||||
if (library == NULL)
|
if (!library)
|
||||||
return NULL;
|
return NULL;
|
||||||
library->handle = LoadLibrary("avisynth");
|
library->handle = LoadLibrary("avisynth");
|
||||||
if (library->handle == NULL)
|
if (library->handle == NULL)
|
||||||
@@ -814,6 +832,7 @@ AVSC_INLINE AVS_Library * avs_load_library() {
|
|||||||
AVSC_LOAD_FUNC(avs_function_exists);
|
AVSC_LOAD_FUNC(avs_function_exists);
|
||||||
AVSC_LOAD_FUNC(avs_get_audio);
|
AVSC_LOAD_FUNC(avs_get_audio);
|
||||||
AVSC_LOAD_FUNC(avs_get_cpu_flags);
|
AVSC_LOAD_FUNC(avs_get_cpu_flags);
|
||||||
|
AVSC_LOAD_FUNC(avs_get_error);
|
||||||
AVSC_LOAD_FUNC(avs_get_frame);
|
AVSC_LOAD_FUNC(avs_get_frame);
|
||||||
AVSC_LOAD_FUNC(avs_get_parity);
|
AVSC_LOAD_FUNC(avs_get_parity);
|
||||||
AVSC_LOAD_FUNC(avs_get_var);
|
AVSC_LOAD_FUNC(avs_get_var);
|
||||||
@@ -839,27 +858,6 @@ AVSC_INLINE AVS_Library * avs_load_library() {
|
|||||||
AVSC_LOAD_FUNC(avs_take_clip);
|
AVSC_LOAD_FUNC(avs_take_clip);
|
||||||
AVSC_LOAD_FUNC(avs_vsprintf);
|
AVSC_LOAD_FUNC(avs_vsprintf);
|
||||||
|
|
||||||
AVSC_LOAD_FUNC(avs_get_error);
|
|
||||||
AVSC_LOAD_FUNC(avs_is_yv24);
|
|
||||||
AVSC_LOAD_FUNC(avs_is_yv16);
|
|
||||||
AVSC_LOAD_FUNC(avs_is_yv12);
|
|
||||||
AVSC_LOAD_FUNC(avs_is_yv411);
|
|
||||||
AVSC_LOAD_FUNC(avs_is_y8);
|
|
||||||
AVSC_LOAD_FUNC(avs_is_color_space);
|
|
||||||
|
|
||||||
AVSC_LOAD_FUNC(avs_get_plane_width_subsampling);
|
|
||||||
AVSC_LOAD_FUNC(avs_get_plane_height_subsampling);
|
|
||||||
AVSC_LOAD_FUNC(avs_bits_per_pixel);
|
|
||||||
AVSC_LOAD_FUNC(avs_bytes_from_pixels);
|
|
||||||
AVSC_LOAD_FUNC(avs_row_size);
|
|
||||||
AVSC_LOAD_FUNC(avs_bmp_size);
|
|
||||||
AVSC_LOAD_FUNC(avs_get_pitch_p);
|
|
||||||
AVSC_LOAD_FUNC(avs_get_row_size_p);
|
|
||||||
AVSC_LOAD_FUNC(avs_get_height_p);
|
|
||||||
AVSC_LOAD_FUNC(avs_get_read_ptr_p);
|
|
||||||
AVSC_LOAD_FUNC(avs_is_writable);
|
|
||||||
AVSC_LOAD_FUNC(avs_get_write_ptr_p);
|
|
||||||
|
|
||||||
#undef __AVSC_STRINGIFY
|
#undef __AVSC_STRINGIFY
|
||||||
#undef AVSC_STRINGIFY
|
#undef AVSC_STRINGIFY
|
||||||
#undef AVSC_LOAD_FUNC
|
#undef AVSC_LOAD_FUNC
|
||||||
@@ -872,7 +870,7 @@ fail:
|
|||||||
}
|
}
|
||||||
|
|
||||||
AVSC_INLINE void avs_free_library(AVS_Library *library) {
|
AVSC_INLINE void avs_free_library(AVS_Library *library) {
|
||||||
if (library == NULL)
|
if (!library)
|
||||||
return;
|
return;
|
||||||
FreeLibrary(library->handle);
|
FreeLibrary(library->handle);
|
||||||
free(library);
|
free(library);
|
||||||
|
|||||||
68
compat/avisynth/avisynth_c_25.h
Normal file
68
compat/avisynth/avisynth_c_25.h
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
// Copyright (c) 2011 FFmpegSource Project
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
/* these are defines/functions that are used and were changed in the switch to 2.6
|
||||||
|
* and are needed to maintain full compatility with 2.5 */
|
||||||
|
|
||||||
|
enum {
|
||||||
|
AVS_CS_YV12_25 = 1<<3 | AVS_CS_YUV | AVS_CS_PLANAR, // y-v-u, planar
|
||||||
|
AVS_CS_I420_25 = 1<<4 | AVS_CS_YUV | AVS_CS_PLANAR, // y-u-v, planar
|
||||||
|
};
|
||||||
|
|
||||||
|
AVSC_INLINE int avs_get_height_p_25(const AVS_VideoFrame * p, int plane) {
|
||||||
|
switch (plane)
|
||||||
|
{
|
||||||
|
case AVS_PLANAR_U: case AVS_PLANAR_V:
|
||||||
|
if (p->pitchUV)
|
||||||
|
return p->height>>1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return p->height;}
|
||||||
|
|
||||||
|
AVSC_INLINE int avs_get_row_size_p_25(const AVS_VideoFrame * p, int plane) {
|
||||||
|
int r;
|
||||||
|
switch (plane)
|
||||||
|
{
|
||||||
|
case AVS_PLANAR_U: case AVS_PLANAR_V:
|
||||||
|
if (p->pitchUV)
|
||||||
|
return p->row_size>>1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
case AVS_PLANAR_U_ALIGNED: case AVS_PLANAR_V_ALIGNED:
|
||||||
|
if (p->pitchUV)
|
||||||
|
{
|
||||||
|
r = ((p->row_size+AVS_FRAME_ALIGN-1)&(~(AVS_FRAME_ALIGN-1)) )>>1; // Aligned rowsize
|
||||||
|
if (r < p->pitchUV)
|
||||||
|
return r;
|
||||||
|
return p->row_size>>1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
case AVS_PLANAR_Y_ALIGNED:
|
||||||
|
r = (p->row_size+AVS_FRAME_ALIGN-1)&(~(AVS_FRAME_ALIGN-1)); // Aligned rowsize
|
||||||
|
if (r <= p->pitch)
|
||||||
|
return r;
|
||||||
|
return p->row_size;
|
||||||
|
}
|
||||||
|
return p->row_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
AVSC_INLINE int avs_is_yv12_25(const AVS_VideoInfo * p)
|
||||||
|
{ return ((p->pixel_type & AVS_CS_YV12_25) == AVS_CS_YV12_25)||((p->pixel_type & AVS_CS_I420_25) == AVS_CS_I420_25); }
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
// Avisynth C Interface Version 0.20
|
|
||||||
// Copyright 2003 Kevin Atkinson
|
|
||||||
|
|
||||||
// This program is free software; you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation; either version 2 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit
|
|
||||||
// http://www.gnu.org/copyleft/gpl.html .
|
|
||||||
//
|
|
||||||
// As a special exception, I give you permission to link to the
|
|
||||||
// Avisynth C interface with independent modules that communicate with
|
|
||||||
// the Avisynth C interface solely through the interfaces defined in
|
|
||||||
// avisynth_c.h, regardless of the license terms of these independent
|
|
||||||
// modules, and to copy and distribute the resulting combined work
|
|
||||||
// under terms of your choice, provided that every copy of the
|
|
||||||
// combined work is accompanied by a complete copy of the source code
|
|
||||||
// of the Avisynth C interface and Avisynth itself (with the version
|
|
||||||
// used to produce the combined work), being distributed under the
|
|
||||||
// terms of the GNU General Public License plus this exception. An
|
|
||||||
// independent module is a module which is not derived from or based
|
|
||||||
// on Avisynth C Interface, such as 3rd-party filters, import and
|
|
||||||
// export plugins, or graphical user interfaces.
|
|
||||||
|
|
||||||
#ifndef AVS_CAPI_H
|
|
||||||
#define AVS_CAPI_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
# define EXTERN_C extern "C"
|
|
||||||
#else
|
|
||||||
# define EXTERN_C
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AVSC_USE_STDCALL
|
|
||||||
# define AVSC_CC __cdecl
|
|
||||||
#else
|
|
||||||
# define AVSC_CC __stdcall
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define AVSC_INLINE static __inline
|
|
||||||
|
|
||||||
#ifdef BUILDING_AVSCORE
|
|
||||||
# define AVSC_EXPORT EXTERN_C
|
|
||||||
# define AVSC_API(ret, name) EXTERN_C __declspec(dllexport) ret AVSC_CC name
|
|
||||||
#else
|
|
||||||
# define AVSC_EXPORT EXTERN_C __declspec(dllexport)
|
|
||||||
# ifndef AVSC_NO_DECLSPEC
|
|
||||||
# define AVSC_API(ret, name) EXTERN_C __declspec(dllimport) ret AVSC_CC name
|
|
||||||
# else
|
|
||||||
# define AVSC_API(ret, name) typedef ret (AVSC_CC *name##_func)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif //AVS_CAPI_H
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
// Avisynth C Interface Version 0.20
|
|
||||||
// Copyright 2003 Kevin Atkinson
|
|
||||||
|
|
||||||
// This program is free software; you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation; either version 2 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit
|
|
||||||
// http://www.gnu.org/copyleft/gpl.html .
|
|
||||||
//
|
|
||||||
// As a special exception, I give you permission to link to the
|
|
||||||
// Avisynth C interface with independent modules that communicate with
|
|
||||||
// the Avisynth C interface solely through the interfaces defined in
|
|
||||||
// avisynth_c.h, regardless of the license terms of these independent
|
|
||||||
// modules, and to copy and distribute the resulting combined work
|
|
||||||
// under terms of your choice, provided that every copy of the
|
|
||||||
// combined work is accompanied by a complete copy of the source code
|
|
||||||
// of the Avisynth C interface and Avisynth itself (with the version
|
|
||||||
// used to produce the combined work), being distributed under the
|
|
||||||
// terms of the GNU General Public License plus this exception. An
|
|
||||||
// independent module is a module which is not derived from or based
|
|
||||||
// on Avisynth C Interface, such as 3rd-party filters, import and
|
|
||||||
// export plugins, or graphical user interfaces.
|
|
||||||
|
|
||||||
#ifndef AVS_CONFIG_H
|
|
||||||
#define AVS_CONFIG_H
|
|
||||||
|
|
||||||
// Undefine this to get cdecl calling convention
|
|
||||||
#define AVSC_USE_STDCALL 1
|
|
||||||
|
|
||||||
// NOTE TO PLUGIN AUTHORS:
|
|
||||||
// Because FRAME_ALIGN can be substantially higher than the alignment
|
|
||||||
// a plugin actually needs, plugins should not use FRAME_ALIGN to check for
|
|
||||||
// alignment. They should always request the exact alignment value they need.
|
|
||||||
// This is to make sure that plugins work over the widest range of AviSynth
|
|
||||||
// builds possible.
|
|
||||||
#define FRAME_ALIGN 32
|
|
||||||
|
|
||||||
#if defined(_M_AMD64) || defined(__x86_64)
|
|
||||||
# define X86_64
|
|
||||||
#elif defined(_M_IX86) || defined(__i386__)
|
|
||||||
# define X86_32
|
|
||||||
#else
|
|
||||||
# error Unsupported CPU architecture.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif //AVS_CONFIG_H
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
// Avisynth C Interface Version 0.20
|
|
||||||
// Copyright 2003 Kevin Atkinson
|
|
||||||
|
|
||||||
// This program is free software; you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation; either version 2 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit
|
|
||||||
// http://www.gnu.org/copyleft/gpl.html .
|
|
||||||
//
|
|
||||||
// As a special exception, I give you permission to link to the
|
|
||||||
// Avisynth C interface with independent modules that communicate with
|
|
||||||
// the Avisynth C interface solely through the interfaces defined in
|
|
||||||
// avisynth_c.h, regardless of the license terms of these independent
|
|
||||||
// modules, and to copy and distribute the resulting combined work
|
|
||||||
// under terms of your choice, provided that every copy of the
|
|
||||||
// combined work is accompanied by a complete copy of the source code
|
|
||||||
// of the Avisynth C interface and Avisynth itself (with the version
|
|
||||||
// used to produce the combined work), being distributed under the
|
|
||||||
// terms of the GNU General Public License plus this exception. An
|
|
||||||
// independent module is a module which is not derived from or based
|
|
||||||
// on Avisynth C Interface, such as 3rd-party filters, import and
|
|
||||||
// export plugins, or graphical user interfaces.
|
|
||||||
|
|
||||||
#ifndef AVS_TYPES_H
|
|
||||||
#define AVS_TYPES_H
|
|
||||||
|
|
||||||
// Define all types necessary for interfacing with avisynth.dll
|
|
||||||
|
|
||||||
// Raster types used by VirtualDub & Avisynth
|
|
||||||
typedef unsigned int Pixel32;
|
|
||||||
typedef unsigned char BYTE;
|
|
||||||
|
|
||||||
// Audio Sample information
|
|
||||||
typedef float SFLOAT;
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
typedef long long int INT64;
|
|
||||||
#else
|
|
||||||
typedef __int64 INT64;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif //AVS_TYPES_H
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of FFmpeg.
|
|
||||||
*
|
|
||||||
* FFmpeg is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* FFmpeg is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with FFmpeg; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef COMPAT_DISPATCH_SEMAPHORE_SEMAPHORE_H
|
|
||||||
#define COMPAT_DISPATCH_SEMAPHORE_SEMAPHORE_H
|
|
||||||
|
|
||||||
#include <dispatch/dispatch.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#define sem_t dispatch_semaphore_t
|
|
||||||
#define sem_post(psem) dispatch_semaphore_signal(*psem)
|
|
||||||
#define sem_wait(psem) dispatch_semaphore_wait(*psem, DISPATCH_TIME_FOREVER)
|
|
||||||
#define sem_timedwait(psem, val) dispatch_semaphore_wait(*psem, dispatch_walltime(val, 0))
|
|
||||||
#define sem_destroy(psem) dispatch_release(*psem)
|
|
||||||
|
|
||||||
static inline int compat_sem_init(dispatch_semaphore_t *psem,
|
|
||||||
int unused, int val)
|
|
||||||
{
|
|
||||||
int ret = !!(*psem = dispatch_semaphore_create(val)) - 1;
|
|
||||||
if (ret < 0)
|
|
||||||
errno = ENOMEM;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define sem_init compat_sem_init
|
|
||||||
|
|
||||||
#endif /* COMPAT_DISPATCH_SEMAPHORE_SEMAPHORE_H */
|
|
||||||
@@ -19,8 +19,8 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef COMPAT_MSVCRT_SNPRINTF_H
|
#ifndef COMPAT_SNPRINTF_H
|
||||||
#define COMPAT_MSVCRT_SNPRINTF_H
|
#define COMPAT_SNPRINTF_H
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -35,4 +35,4 @@ int avpriv_vsnprintf(char *s, size_t n, const char *fmt, va_list ap);
|
|||||||
#define _snprintf avpriv_snprintf
|
#define _snprintf avpriv_snprintf
|
||||||
#define vsnprintf avpriv_vsnprintf
|
#define vsnprintf avpriv_vsnprintf
|
||||||
|
|
||||||
#endif /* COMPAT_MSVCRT_SNPRINTF_H */
|
#endif /* COMPAT_SNPRINTF_H */
|
||||||
|
|||||||
@@ -23,8 +23,8 @@
|
|||||||
* os2threads to pthreads wrapper
|
* os2threads to pthreads wrapper
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef COMPAT_OS2THREADS_H
|
#ifndef AVCODEC_OS2PTHREADS_H
|
||||||
#define COMPAT_OS2THREADS_H
|
#define AVCODEC_OS2PTHREADS_H
|
||||||
|
|
||||||
#define INCL_DOS
|
#define INCL_DOS
|
||||||
#include <os2.h>
|
#include <os2.h>
|
||||||
@@ -32,71 +32,57 @@
|
|||||||
#undef __STRICT_ANSI__ /* for _beginthread() */
|
#undef __STRICT_ANSI__ /* for _beginthread() */
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <sys/builtin.h>
|
#include "libavutil/mem.h"
|
||||||
#include <sys/fmutex.h>
|
|
||||||
|
|
||||||
#include "libavutil/attributes.h"
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
TID tid;
|
|
||||||
void *(*start_routine)(void *);
|
|
||||||
void *arg;
|
|
||||||
void *result;
|
|
||||||
} pthread_t;
|
|
||||||
|
|
||||||
|
typedef TID pthread_t;
|
||||||
typedef void pthread_attr_t;
|
typedef void pthread_attr_t;
|
||||||
|
|
||||||
typedef HMTX pthread_mutex_t;
|
typedef HMTX pthread_mutex_t;
|
||||||
typedef void pthread_mutexattr_t;
|
typedef void pthread_mutexattr_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
HEV event_sem;
|
HEV event_sem;
|
||||||
HEV ack_sem;
|
int wait_count;
|
||||||
volatile unsigned wait_count;
|
|
||||||
} pthread_cond_t;
|
} pthread_cond_t;
|
||||||
|
|
||||||
typedef void pthread_condattr_t;
|
typedef void pthread_condattr_t;
|
||||||
|
|
||||||
typedef struct {
|
struct thread_arg {
|
||||||
volatile int done;
|
void *(*start_routine)(void *);
|
||||||
_fmutex mtx;
|
void *arg;
|
||||||
} pthread_once_t;
|
};
|
||||||
|
|
||||||
#define PTHREAD_ONCE_INIT {0, _FMUTEX_INITIALIZER}
|
|
||||||
|
|
||||||
static void thread_entry(void *arg)
|
static void thread_entry(void *arg)
|
||||||
{
|
{
|
||||||
pthread_t *thread = arg;
|
struct thread_arg *thread_arg = arg;
|
||||||
|
|
||||||
thread->result = thread->start_routine(thread->arg);
|
thread_arg->start_routine(thread_arg->arg);
|
||||||
|
|
||||||
|
av_free(thread_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_always_inline int pthread_create(pthread_t *thread,
|
static av_always_inline int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg)
|
||||||
const pthread_attr_t *attr,
|
|
||||||
void *(*start_routine)(void*),
|
|
||||||
void *arg)
|
|
||||||
{
|
{
|
||||||
thread->start_routine = start_routine;
|
struct thread_arg *thread_arg;
|
||||||
thread->arg = arg;
|
|
||||||
thread->result = NULL;
|
|
||||||
|
|
||||||
thread->tid = _beginthread(thread_entry, NULL, 1024 * 1024, thread);
|
thread_arg = av_mallocz(sizeof(struct thread_arg));
|
||||||
|
|
||||||
|
thread_arg->start_routine = start_routine;
|
||||||
|
thread_arg->arg = arg;
|
||||||
|
|
||||||
|
*thread = _beginthread(thread_entry, NULL, 256 * 1024, thread_arg);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_always_inline int pthread_join(pthread_t thread, void **value_ptr)
|
static av_always_inline int pthread_join(pthread_t thread, void **value_ptr)
|
||||||
{
|
{
|
||||||
DosWaitThread(&thread.tid, DCWW_WAIT);
|
DosWaitThread((PTID)&thread, DCWW_WAIT);
|
||||||
|
|
||||||
if (value_ptr)
|
|
||||||
*value_ptr = thread.result;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_always_inline int pthread_mutex_init(pthread_mutex_t *mutex,
|
static av_always_inline int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
|
||||||
const pthread_mutexattr_t *attr)
|
|
||||||
{
|
{
|
||||||
DosCreateMutexSem(NULL, (PHMTX)mutex, 0, FALSE);
|
DosCreateMutexSem(NULL, (PHMTX)mutex, 0, FALSE);
|
||||||
|
|
||||||
@@ -124,11 +110,9 @@ static av_always_inline int pthread_mutex_unlock(pthread_mutex_t *mutex)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_always_inline int pthread_cond_init(pthread_cond_t *cond,
|
static av_always_inline int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
|
||||||
const pthread_condattr_t *attr)
|
|
||||||
{
|
{
|
||||||
DosCreateEventSem(NULL, &cond->event_sem, DCE_POSTONE, FALSE);
|
DosCreateEventSem(NULL, &cond->event_sem, DCE_POSTONE, FALSE);
|
||||||
DosCreateEventSem(NULL, &cond->ack_sem, DCE_POSTONE, FALSE);
|
|
||||||
|
|
||||||
cond->wait_count = 0;
|
cond->wait_count = 0;
|
||||||
|
|
||||||
@@ -138,16 +122,16 @@ static av_always_inline int pthread_cond_init(pthread_cond_t *cond,
|
|||||||
static av_always_inline int pthread_cond_destroy(pthread_cond_t *cond)
|
static av_always_inline int pthread_cond_destroy(pthread_cond_t *cond)
|
||||||
{
|
{
|
||||||
DosCloseEventSem(cond->event_sem);
|
DosCloseEventSem(cond->event_sem);
|
||||||
DosCloseEventSem(cond->ack_sem);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_always_inline int pthread_cond_signal(pthread_cond_t *cond)
|
static av_always_inline int pthread_cond_signal(pthread_cond_t *cond)
|
||||||
{
|
{
|
||||||
if (!__atomic_cmpxchg32(&cond->wait_count, 0, 0)) {
|
if (cond->wait_count > 0) {
|
||||||
DosPostEventSem(cond->event_sem);
|
DosPostEventSem(cond->event_sem);
|
||||||
DosWaitEventSem(cond->ack_sem, SEM_INDEFINITE_WAIT);
|
|
||||||
|
cond->wait_count--;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -155,47 +139,26 @@ static av_always_inline int pthread_cond_signal(pthread_cond_t *cond)
|
|||||||
|
|
||||||
static av_always_inline int pthread_cond_broadcast(pthread_cond_t *cond)
|
static av_always_inline int pthread_cond_broadcast(pthread_cond_t *cond)
|
||||||
{
|
{
|
||||||
while (!__atomic_cmpxchg32(&cond->wait_count, 0, 0))
|
while (cond->wait_count > 0) {
|
||||||
pthread_cond_signal(cond);
|
DosPostEventSem(cond->event_sem);
|
||||||
|
|
||||||
|
cond->wait_count--;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_always_inline int pthread_cond_wait(pthread_cond_t *cond,
|
static av_always_inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
||||||
pthread_mutex_t *mutex)
|
|
||||||
{
|
{
|
||||||
__atomic_increment(&cond->wait_count);
|
cond->wait_count++;
|
||||||
|
|
||||||
pthread_mutex_unlock(mutex);
|
pthread_mutex_unlock(mutex);
|
||||||
|
|
||||||
DosWaitEventSem(cond->event_sem, SEM_INDEFINITE_WAIT);
|
DosWaitEventSem(cond->event_sem, SEM_INDEFINITE_WAIT);
|
||||||
|
|
||||||
__atomic_decrement(&cond->wait_count);
|
|
||||||
|
|
||||||
DosPostEventSem(cond->ack_sem);
|
|
||||||
|
|
||||||
pthread_mutex_lock(mutex);
|
pthread_mutex_lock(mutex);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_always_inline int pthread_once(pthread_once_t *once_control,
|
#endif /* AVCODEC_OS2PTHREADS_H */
|
||||||
void (*init_routine)(void))
|
|
||||||
{
|
|
||||||
if (!once_control->done)
|
|
||||||
{
|
|
||||||
_fmutex_request(&once_control->mtx, 0);
|
|
||||||
|
|
||||||
if (!once_control->done)
|
|
||||||
{
|
|
||||||
init_routine();
|
|
||||||
|
|
||||||
once_control->done = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
_fmutex_release(&once_control->mtx);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* COMPAT_OS2THREADS_H */
|
|
||||||
|
|||||||
@@ -1,352 +0,0 @@
|
|||||||
#!/usr/bin/env perl
|
|
||||||
|
|
||||||
# make_sunver.pl
|
|
||||||
#
|
|
||||||
# Copyright (C) 2010, 2011, 2012, 2013
|
|
||||||
# Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file 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.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful, but
|
|
||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
# General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; see the file COPYING.GPLv3. If not see
|
|
||||||
# <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# This script takes at least two arguments, a GNU style version script and
|
|
||||||
# a list of object and archive files, and generates a corresponding Sun
|
|
||||||
# style version script as follows:
|
|
||||||
#
|
|
||||||
# Each glob pattern, C++ mangled pattern or literal in the input script is
|
|
||||||
# matched against all global symbols in the input objects, emitting those
|
|
||||||
# that matched (or nothing if no match was found).
|
|
||||||
# A comment with the original pattern and its type is left in the output
|
|
||||||
# file to make it easy to understand the matches.
|
|
||||||
#
|
|
||||||
# It uses elfdump when present (native), GNU readelf otherwise.
|
|
||||||
# It depends on the GNU version of c++filt, since it must understand the
|
|
||||||
# GNU mangling style.
|
|
||||||
|
|
||||||
use FileHandle;
|
|
||||||
use IPC::Open2;
|
|
||||||
|
|
||||||
# Enforce C locale.
|
|
||||||
$ENV{'LC_ALL'} = "C";
|
|
||||||
$ENV{'LANG'} = "C";
|
|
||||||
|
|
||||||
# Input version script, GNU style.
|
|
||||||
my $symvers = shift;
|
|
||||||
|
|
||||||
##########
|
|
||||||
# Get all the symbols from the library, match them, and add them to a hash.
|
|
||||||
|
|
||||||
my %sym_hash = ();
|
|
||||||
|
|
||||||
# List of objects and archives to process.
|
|
||||||
my @OBJECTS = ();
|
|
||||||
|
|
||||||
# List of shared objects to omit from processing.
|
|
||||||
my @SHAREDOBJS = ();
|
|
||||||
|
|
||||||
# Filter out those input archives that have corresponding shared objects to
|
|
||||||
# avoid adding all symbols matched in the archive to the output map.
|
|
||||||
foreach $file (@ARGV) {
|
|
||||||
if (($so = $file) =~ s/\.a$/.so/ && -e $so) {
|
|
||||||
printf STDERR "omitted $file -> $so\n";
|
|
||||||
push (@SHAREDOBJS, $so);
|
|
||||||
} else {
|
|
||||||
push (@OBJECTS, $file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# We need to detect and ignore hidden symbols. Solaris nm can only detect
|
|
||||||
# this in the harder to parse default output format, and GNU nm not at all,
|
|
||||||
# so use elfdump -s in the native case and GNU readelf -s otherwise.
|
|
||||||
# GNU objdump -t cannot be used since it produces a variable number of
|
|
||||||
# columns.
|
|
||||||
|
|
||||||
# The path to elfdump.
|
|
||||||
my $elfdump = "/usr/ccs/bin/elfdump";
|
|
||||||
|
|
||||||
if (-f $elfdump) {
|
|
||||||
open ELFDUMP,$elfdump.' -s '.(join ' ',@OBJECTS).'|' or die $!;
|
|
||||||
my $skip_arsym = 0;
|
|
||||||
|
|
||||||
while (<ELFDUMP>) {
|
|
||||||
chomp;
|
|
||||||
|
|
||||||
# Ignore empty lines.
|
|
||||||
if (/^$/) {
|
|
||||||
# End of archive symbol table, stop skipping.
|
|
||||||
$skip_arsym = 0 if $skip_arsym;
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Keep skipping until end of archive symbol table.
|
|
||||||
next if ($skip_arsym);
|
|
||||||
|
|
||||||
# Ignore object name header for individual objects and archives.
|
|
||||||
next if (/:$/);
|
|
||||||
|
|
||||||
# Ignore table header lines.
|
|
||||||
next if (/^Symbol Table Section:/);
|
|
||||||
next if (/index.*value.*size/);
|
|
||||||
|
|
||||||
# Start of archive symbol table: start skipping.
|
|
||||||
if (/^Symbol Table: \(archive/) {
|
|
||||||
$skip_arsym = 1;
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Split table.
|
|
||||||
(undef, undef, undef, undef, $bind, $oth, undef, $shndx, $name) = split;
|
|
||||||
|
|
||||||
# Error out for unknown input.
|
|
||||||
die "unknown input line:\n$_" unless defined($bind);
|
|
||||||
|
|
||||||
# Ignore local symbols.
|
|
||||||
next if ($bind eq "LOCL");
|
|
||||||
# Ignore hidden symbols.
|
|
||||||
next if ($oth eq "H");
|
|
||||||
# Ignore undefined symbols.
|
|
||||||
next if ($shndx eq "UNDEF");
|
|
||||||
# Error out for unhandled cases.
|
|
||||||
if ($bind !~ /^(GLOB|WEAK)/ or $oth ne "D") {
|
|
||||||
die "unhandled symbol:\n$_";
|
|
||||||
}
|
|
||||||
|
|
||||||
# Remember symbol.
|
|
||||||
$sym_hash{$name}++;
|
|
||||||
}
|
|
||||||
close ELFDUMP or die "$elfdump error";
|
|
||||||
} else {
|
|
||||||
open READELF, 'readelf -s -W '.(join ' ',@OBJECTS).'|' or die $!;
|
|
||||||
# Process each symbol.
|
|
||||||
while (<READELF>) {
|
|
||||||
chomp;
|
|
||||||
|
|
||||||
# Ignore empty lines.
|
|
||||||
next if (/^$/);
|
|
||||||
|
|
||||||
# Ignore object name header.
|
|
||||||
next if (/^File: .*$/);
|
|
||||||
|
|
||||||
# Ignore table header lines.
|
|
||||||
next if (/^Symbol table.*contains.*:/);
|
|
||||||
next if (/Num:.*Value.*Size/);
|
|
||||||
|
|
||||||
# Split table.
|
|
||||||
(undef, undef, undef, undef, $bind, $vis, $ndx, $name) = split;
|
|
||||||
|
|
||||||
# Error out for unknown input.
|
|
||||||
die "unknown input line:\n$_" unless defined($bind);
|
|
||||||
|
|
||||||
# Ignore local symbols.
|
|
||||||
next if ($bind eq "LOCAL");
|
|
||||||
# Ignore hidden symbols.
|
|
||||||
next if ($vis eq "HIDDEN");
|
|
||||||
# Ignore undefined symbols.
|
|
||||||
next if ($ndx eq "UND");
|
|
||||||
# Error out for unhandled cases.
|
|
||||||
if ($bind !~ /^(GLOBAL|WEAK)/ or $vis ne "DEFAULT") {
|
|
||||||
die "unhandled symbol:\n$_";
|
|
||||||
}
|
|
||||||
|
|
||||||
# Remember symbol.
|
|
||||||
$sym_hash{$name}++;
|
|
||||||
}
|
|
||||||
close READELF or die "readelf error";
|
|
||||||
}
|
|
||||||
|
|
||||||
##########
|
|
||||||
# The various types of glob patterns.
|
|
||||||
#
|
|
||||||
# A glob pattern that is to be applied to the demangled name: 'cxx'.
|
|
||||||
# A glob patterns that applies directly to the name in the .o files: 'glob'.
|
|
||||||
# This pattern is ignored; used for local variables (usually just '*'): 'ign'.
|
|
||||||
|
|
||||||
# The type of the current pattern.
|
|
||||||
my $glob = 'glob';
|
|
||||||
|
|
||||||
# We're currently inside `extern "C++"', which Sun ld doesn't understand.
|
|
||||||
my $in_extern = 0;
|
|
||||||
|
|
||||||
# The c++filt command to use. This *must* be GNU c++filt; the Sun Studio
|
|
||||||
# c++filt doesn't handle the GNU mangling style.
|
|
||||||
my $cxxfilt = $ENV{'CXXFILT'} || "c++filt";
|
|
||||||
|
|
||||||
# The current version name.
|
|
||||||
my $current_version = "";
|
|
||||||
|
|
||||||
# Was there any attempt to match a symbol to this version?
|
|
||||||
my $matches_attempted;
|
|
||||||
|
|
||||||
# The number of versions which matched this symbol.
|
|
||||||
my $matched_symbols;
|
|
||||||
|
|
||||||
open F,$symvers or die $!;
|
|
||||||
|
|
||||||
# Print information about generating this file
|
|
||||||
print "# This file was generated by make_sunver.pl. DO NOT EDIT!\n";
|
|
||||||
print "# It was generated by:\n";
|
|
||||||
printf "# %s %s %s\n", $0, $symvers, (join ' ',@ARGV);
|
|
||||||
printf "# Omitted archives with corresponding shared libraries: %s\n",
|
|
||||||
(join ' ', @SHAREDOBJS) if $#SHAREDOBJS >= 0;
|
|
||||||
print "#\n\n";
|
|
||||||
|
|
||||||
print "\$mapfile_version 2\n";
|
|
||||||
|
|
||||||
while (<F>) {
|
|
||||||
# Lines of the form '};'
|
|
||||||
if (/^([ \t]*)(\}[ \t]*;[ \t]*)$/) {
|
|
||||||
$glob = 'glob';
|
|
||||||
if ($in_extern) {
|
|
||||||
$in_extern--;
|
|
||||||
print "$1##$2\n";
|
|
||||||
} else {
|
|
||||||
print;
|
|
||||||
}
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Lines of the form '} SOME_VERSION_NAME_1.0;'
|
|
||||||
if (/^[ \t]*\}[ \tA-Z0-9_.a-z]+;[ \t]*$/) {
|
|
||||||
$glob = 'glob';
|
|
||||||
# We tried to match symbols agains this version, but none matched.
|
|
||||||
# Emit dummy hidden symbol to avoid marking this version WEAK.
|
|
||||||
if ($matches_attempted && $matched_symbols == 0) {
|
|
||||||
print " hidden:\n";
|
|
||||||
print " .force_WEAK_off_$current_version = DATA S0x0 V0x0;\n";
|
|
||||||
}
|
|
||||||
print; next;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Comment and blank lines
|
|
||||||
if (/^[ \t]*\#/) { print; next; }
|
|
||||||
if (/^[ \t]*$/) { print; next; }
|
|
||||||
|
|
||||||
# Lines of the form '{'
|
|
||||||
if (/^([ \t]*){$/) {
|
|
||||||
if ($in_extern) {
|
|
||||||
print "$1##{\n";
|
|
||||||
} else {
|
|
||||||
print;
|
|
||||||
}
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Lines of the form 'SOME_VERSION_NAME_1.1 {'
|
|
||||||
if (/^([A-Z0-9_.]+)[ \t]+{$/) {
|
|
||||||
# Record version name.
|
|
||||||
$current_version = $1;
|
|
||||||
# Reset match attempts, #matched symbols for this version.
|
|
||||||
$matches_attempted = 0;
|
|
||||||
$matched_symbols = 0;
|
|
||||||
print "SYMBOL_VERSION $1 {\n";
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Ignore 'global:'
|
|
||||||
if (/^[ \t]*global:$/) { print; next; }
|
|
||||||
|
|
||||||
# After 'local:', globs should be ignored, they won't be exported.
|
|
||||||
if (/^[ \t]*local:$/) {
|
|
||||||
$glob = 'ign';
|
|
||||||
print;
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
# After 'extern "C++"', globs are C++ patterns
|
|
||||||
if (/^([ \t]*)(extern \"C\+\+\"[ \t]*)$/) {
|
|
||||||
$in_extern++;
|
|
||||||
$glob = 'cxx';
|
|
||||||
# Need to comment, Sun ld cannot handle this.
|
|
||||||
print "$1##$2\n"; next;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Chomp newline now we're done with passing through the input file.
|
|
||||||
chomp;
|
|
||||||
|
|
||||||
# Catch globs. Note that '{}' is not allowed in globs by this script,
|
|
||||||
# so only '*' and '[]' are available.
|
|
||||||
if (/^([ \t]*)([^ \t;{}#]+);?[ \t]*$/) {
|
|
||||||
my $ws = $1;
|
|
||||||
my $ptn = $2;
|
|
||||||
# Turn the glob into a regex by replacing '*' with '.*', '?' with '.'.
|
|
||||||
# Keep $ptn so we can still print the original form.
|
|
||||||
($pattern = $ptn) =~ s/\*/\.\*/g;
|
|
||||||
$pattern =~ s/\?/\./g;
|
|
||||||
|
|
||||||
if ($glob eq 'ign') {
|
|
||||||
# We're in a local: * section; just continue.
|
|
||||||
print "$_\n";
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Print the glob commented for human readers.
|
|
||||||
print "$ws##$ptn ($glob)\n";
|
|
||||||
# We tried to match a symbol to this version.
|
|
||||||
$matches_attempted++;
|
|
||||||
|
|
||||||
if ($glob eq 'glob') {
|
|
||||||
my %ptn_syms = ();
|
|
||||||
|
|
||||||
# Match ptn against symbols in %sym_hash.
|
|
||||||
foreach my $sym (keys %sym_hash) {
|
|
||||||
# Maybe it matches one of the patterns based on the symbol in
|
|
||||||
# the .o file.
|
|
||||||
$ptn_syms{$sym}++ if ($sym =~ /^$pattern$/);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach my $sym (sort keys(%ptn_syms)) {
|
|
||||||
$matched_symbols++;
|
|
||||||
print "$ws$sym;\n";
|
|
||||||
}
|
|
||||||
} elsif ($glob eq 'cxx') {
|
|
||||||
my %dem_syms = ();
|
|
||||||
|
|
||||||
# Verify that we're actually using GNU c++filt. Other versions
|
|
||||||
# most likely cannot handle GNU style symbol mangling.
|
|
||||||
my $cxxout = `$cxxfilt --version 2>&1`;
|
|
||||||
$cxxout =~ m/GNU/ or die "$0 requires GNU c++filt to function";
|
|
||||||
|
|
||||||
# Talk to c++filt through a pair of file descriptors.
|
|
||||||
# Need to start a fresh instance per pattern, otherwise the
|
|
||||||
# process grows to 500+ MB.
|
|
||||||
my $pid = open2(*FILTIN, *FILTOUT, $cxxfilt) or die $!;
|
|
||||||
|
|
||||||
# Match ptn against symbols in %sym_hash.
|
|
||||||
foreach my $sym (keys %sym_hash) {
|
|
||||||
# No? Well, maybe its demangled form matches one of those
|
|
||||||
# patterns.
|
|
||||||
printf FILTOUT "%s\n",$sym;
|
|
||||||
my $dem = <FILTIN>;
|
|
||||||
chomp $dem;
|
|
||||||
$dem_syms{$sym}++ if ($dem =~ /^$pattern$/);
|
|
||||||
}
|
|
||||||
|
|
||||||
close FILTOUT or die "c++filt error";
|
|
||||||
close FILTIN or die "c++filt error";
|
|
||||||
# Need to wait for the c++filt process to avoid lots of zombies.
|
|
||||||
waitpid $pid, 0;
|
|
||||||
|
|
||||||
foreach my $sym (sort keys(%dem_syms)) {
|
|
||||||
$matched_symbols++;
|
|
||||||
print "$ws$sym;\n";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
# No? Well, then ignore it.
|
|
||||||
}
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
# Important sanity check. This script can't handle lots of formats
|
|
||||||
# that GNU ld can, so be sure to error out if one is seen!
|
|
||||||
die "strange line `$_'";
|
|
||||||
}
|
|
||||||
close F;
|
|
||||||
@@ -16,8 +16,8 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef COMPAT_TMS470_MATH_H
|
#ifndef FFMPEG_COMPAT_TMS470_MATH_H
|
||||||
#define COMPAT_TMS470_MATH_H
|
#define FFMPEG_COMPAT_TMS470_MATH_H
|
||||||
|
|
||||||
#include_next <math.h>
|
#include_next <math.h>
|
||||||
|
|
||||||
@@ -27,4 +27,4 @@
|
|||||||
#define INFINITY (*(const float*)((const unsigned []){ 0x7f800000 }))
|
#define INFINITY (*(const float*)((const unsigned []){ 0x7f800000 }))
|
||||||
#define NAN (*(const float*)((const unsigned []){ 0x7fc00000 }))
|
#define NAN (*(const float*)((const unsigned []){ 0x7fc00000 }))
|
||||||
|
|
||||||
#endif /* COMPAT_TMS470_MATH_H */
|
#endif /* FFMPEG_COMPAT_TMS470_MATH_H */
|
||||||
|
|||||||
@@ -19,9 +19,6 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef COMPAT_VA_COPY_H
|
|
||||||
#define COMPAT_VA_COPY_H
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
#if !defined(va_copy) && defined(_MSC_VER)
|
#if !defined(va_copy) && defined(_MSC_VER)
|
||||||
@@ -30,5 +27,3 @@
|
|||||||
#if !defined(va_copy) && defined(__GNUC__) && __GNUC__ < 3
|
#if !defined(va_copy) && defined(__GNUC__) && __GNUC__ < 3
|
||||||
#define va_copy(dst, src) __va_copy(dst, src)
|
#define va_copy(dst, src) __va_copy(dst, src)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* COMPAT_VA_COPY_H */
|
|
||||||
|
|||||||
@@ -26,8 +26,8 @@
|
|||||||
* w32threads to pthreads wrapper
|
* w32threads to pthreads wrapper
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef COMPAT_W32PTHREADS_H
|
#ifndef FFMPEG_COMPAT_W32PTHREADS_H
|
||||||
#define COMPAT_W32PTHREADS_H
|
#define FFMPEG_COMPAT_W32PTHREADS_H
|
||||||
|
|
||||||
/* Build up a pthread-like API using underlying Windows API. Have only static
|
/* Build up a pthread-like API using underlying Windows API. Have only static
|
||||||
* methods so as to not conflict with a potentially linked in pthread-win32
|
* methods so as to not conflict with a potentially linked in pthread-win32
|
||||||
@@ -39,11 +39,6 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
|
|
||||||
#if _WIN32_WINNT < 0x0600 && defined(__MINGW32__)
|
|
||||||
#undef MemoryBarrier
|
|
||||||
#define MemoryBarrier __sync_synchronize
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "libavutil/attributes.h"
|
#include "libavutil/attributes.h"
|
||||||
#include "libavutil/common.h"
|
#include "libavutil/common.h"
|
||||||
#include "libavutil/internal.h"
|
#include "libavutil/internal.h"
|
||||||
@@ -87,29 +82,19 @@ static av_unused int pthread_create(pthread_t *thread, const void *unused_attr,
|
|||||||
{
|
{
|
||||||
thread->func = start_routine;
|
thread->func = start_routine;
|
||||||
thread->arg = arg;
|
thread->arg = arg;
|
||||||
#if HAVE_WINRT
|
|
||||||
thread->handle = (void*)CreateThread(NULL, 0, win32thread_worker, thread,
|
|
||||||
0, NULL);
|
|
||||||
#else
|
|
||||||
thread->handle = (void*)_beginthreadex(NULL, 0, win32thread_worker, thread,
|
thread->handle = (void*)_beginthreadex(NULL, 0, win32thread_worker, thread,
|
||||||
0, NULL);
|
0, NULL);
|
||||||
#endif
|
|
||||||
return !thread->handle;
|
return !thread->handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_unused int pthread_join(pthread_t thread, void **value_ptr)
|
static av_unused void pthread_join(pthread_t thread, void **value_ptr)
|
||||||
{
|
{
|
||||||
DWORD ret = WaitForSingleObject(thread.handle, INFINITE);
|
DWORD ret = WaitForSingleObject(thread.handle, INFINITE);
|
||||||
if (ret != WAIT_OBJECT_0) {
|
if (ret != WAIT_OBJECT_0)
|
||||||
if (ret == WAIT_ABANDONED)
|
return;
|
||||||
return EINVAL;
|
|
||||||
else
|
|
||||||
return EDEADLK;
|
|
||||||
}
|
|
||||||
if (value_ptr)
|
if (value_ptr)
|
||||||
*value_ptr = thread.ret;
|
*value_ptr = thread.ret;
|
||||||
CloseHandle(thread.handle);
|
CloseHandle(thread.handle);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int pthread_mutex_init(pthread_mutex_t *m, void* attr)
|
static inline int pthread_mutex_init(pthread_mutex_t *m, void* attr)
|
||||||
@@ -134,19 +119,6 @@ static inline int pthread_mutex_unlock(pthread_mutex_t *m)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if _WIN32_WINNT >= 0x0600
|
#if _WIN32_WINNT >= 0x0600
|
||||||
typedef INIT_ONCE pthread_once_t;
|
|
||||||
#define PTHREAD_ONCE_INIT INIT_ONCE_STATIC_INIT
|
|
||||||
|
|
||||||
static av_unused int pthread_once(pthread_once_t *once_control, void (*init_routine)(void))
|
|
||||||
{
|
|
||||||
BOOL pending = FALSE;
|
|
||||||
InitOnceBeginInitialize(once_control, 0, &pending, NULL);
|
|
||||||
if (pending)
|
|
||||||
init_routine();
|
|
||||||
InitOnceComplete(once_control, 0, NULL);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
|
static inline int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
|
||||||
{
|
{
|
||||||
InitializeConditionVariable(cond);
|
InitializeConditionVariable(cond);
|
||||||
@@ -154,15 +126,14 @@ static inline int pthread_cond_init(pthread_cond_t *cond, const void *unused_att
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* native condition variables do not destroy */
|
/* native condition variables do not destroy */
|
||||||
static inline int pthread_cond_destroy(pthread_cond_t *cond)
|
static inline void pthread_cond_destroy(pthread_cond_t *cond)
|
||||||
{
|
{
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int pthread_cond_broadcast(pthread_cond_t *cond)
|
static inline void pthread_cond_broadcast(pthread_cond_t *cond)
|
||||||
{
|
{
|
||||||
WakeAllConditionVariable(cond);
|
WakeAllConditionVariable(cond);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
||||||
@@ -171,77 +142,14 @@ static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int pthread_cond_signal(pthread_cond_t *cond)
|
static inline void pthread_cond_signal(pthread_cond_t *cond)
|
||||||
{
|
{
|
||||||
WakeConditionVariable(cond);
|
WakeConditionVariable(cond);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else // _WIN32_WINNT < 0x0600
|
#else // _WIN32_WINNT < 0x0600
|
||||||
|
|
||||||
/* atomic init state of dynamically loaded functions */
|
|
||||||
static LONG w32thread_init_state = 0;
|
|
||||||
static av_unused void w32thread_init(void);
|
|
||||||
|
|
||||||
/* for pre-Windows 6.0 platforms, define INIT_ONCE struct,
|
|
||||||
* compatible to the one used in the native API */
|
|
||||||
|
|
||||||
typedef union pthread_once_t {
|
|
||||||
void * Ptr; ///< For the Windows 6.0+ native functions
|
|
||||||
LONG state; ///< For the pre-Windows 6.0 compat code
|
|
||||||
} pthread_once_t;
|
|
||||||
|
|
||||||
#define PTHREAD_ONCE_INIT {0}
|
|
||||||
|
|
||||||
/* function pointers to init once API on windows 6.0+ kernels */
|
|
||||||
static BOOL (WINAPI *initonce_begin)(pthread_once_t *lpInitOnce, DWORD dwFlags, BOOL *fPending, void **lpContext);
|
|
||||||
static BOOL (WINAPI *initonce_complete)(pthread_once_t *lpInitOnce, DWORD dwFlags, void *lpContext);
|
|
||||||
|
|
||||||
/* pre-Windows 6.0 compat using a spin-lock */
|
|
||||||
static inline void w32thread_once_fallback(LONG volatile *state, void (*init_routine)(void))
|
|
||||||
{
|
|
||||||
switch (InterlockedCompareExchange(state, 1, 0)) {
|
|
||||||
/* Initial run */
|
|
||||||
case 0:
|
|
||||||
init_routine();
|
|
||||||
InterlockedExchange(state, 2);
|
|
||||||
break;
|
|
||||||
/* Another thread is running init */
|
|
||||||
case 1:
|
|
||||||
while (1) {
|
|
||||||
MemoryBarrier();
|
|
||||||
if (*state == 2)
|
|
||||||
break;
|
|
||||||
Sleep(0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
/* Initialization complete */
|
|
||||||
case 2:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static av_unused int pthread_once(pthread_once_t *once_control, void (*init_routine)(void))
|
|
||||||
{
|
|
||||||
w32thread_once_fallback(&w32thread_init_state, w32thread_init);
|
|
||||||
|
|
||||||
/* Use native functions on Windows 6.0+ */
|
|
||||||
if (initonce_begin && initonce_complete) {
|
|
||||||
BOOL pending = FALSE;
|
|
||||||
initonce_begin(once_control, 0, &pending, NULL);
|
|
||||||
if (pending)
|
|
||||||
init_routine();
|
|
||||||
initonce_complete(once_control, 0, NULL);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
w32thread_once_fallback(&once_control->state, init_routine);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* for pre-Windows 6.0 platforms we need to define and use our own condition
|
/* for pre-Windows 6.0 platforms we need to define and use our own condition
|
||||||
* variable and api */
|
* variable and api */
|
||||||
|
|
||||||
typedef struct win32_cond_t {
|
typedef struct win32_cond_t {
|
||||||
pthread_mutex_t mtx_broadcast;
|
pthread_mutex_t mtx_broadcast;
|
||||||
pthread_mutex_t mtx_waiter_count;
|
pthread_mutex_t mtx_waiter_count;
|
||||||
@@ -261,9 +169,6 @@ static BOOL (WINAPI *cond_wait)(pthread_cond_t *cond, pthread_mutex_t *mutex,
|
|||||||
static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
|
static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
|
||||||
{
|
{
|
||||||
win32_cond_t *win32_cond = NULL;
|
win32_cond_t *win32_cond = NULL;
|
||||||
|
|
||||||
w32thread_once_fallback(&w32thread_init_state, w32thread_init);
|
|
||||||
|
|
||||||
if (cond_init) {
|
if (cond_init) {
|
||||||
cond_init(cond);
|
cond_init(cond);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -286,12 +191,12 @@ static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_unused int pthread_cond_destroy(pthread_cond_t *cond)
|
static av_unused 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 */
|
/* native condition variables do not destroy */
|
||||||
if (cond_init)
|
if (cond_init)
|
||||||
return 0;
|
return;
|
||||||
|
|
||||||
/* non native condition variables */
|
/* non native condition variables */
|
||||||
CloseHandle(win32_cond->semaphore);
|
CloseHandle(win32_cond->semaphore);
|
||||||
@@ -300,17 +205,16 @@ static av_unused int pthread_cond_destroy(pthread_cond_t *cond)
|
|||||||
pthread_mutex_destroy(&win32_cond->mtx_broadcast);
|
pthread_mutex_destroy(&win32_cond->mtx_broadcast);
|
||||||
av_freep(&win32_cond);
|
av_freep(&win32_cond);
|
||||||
cond->Ptr = NULL;
|
cond->Ptr = NULL;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_unused int pthread_cond_broadcast(pthread_cond_t *cond)
|
static av_unused 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;
|
int have_waiter;
|
||||||
|
|
||||||
if (cond_broadcast) {
|
if (cond_broadcast) {
|
||||||
cond_broadcast(cond);
|
cond_broadcast(cond);
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* non native condition variables */
|
/* non native condition variables */
|
||||||
@@ -332,7 +236,6 @@ static av_unused int pthread_cond_broadcast(pthread_cond_t *cond)
|
|||||||
} else
|
} else
|
||||||
pthread_mutex_unlock(&win32_cond->mtx_waiter_count);
|
pthread_mutex_unlock(&win32_cond->mtx_waiter_count);
|
||||||
pthread_mutex_unlock(&win32_cond->mtx_broadcast);
|
pthread_mutex_unlock(&win32_cond->mtx_broadcast);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
||||||
@@ -367,13 +270,13 @@ static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mu
|
|||||||
return pthread_mutex_lock(mutex);
|
return pthread_mutex_lock(mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_unused int pthread_cond_signal(pthread_cond_t *cond)
|
static av_unused 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;
|
int have_waiter;
|
||||||
if (cond_signal) {
|
if (cond_signal) {
|
||||||
cond_signal(cond);
|
cond_signal(cond);
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&win32_cond->mtx_broadcast);
|
pthread_mutex_lock(&win32_cond->mtx_broadcast);
|
||||||
@@ -390,7 +293,6 @@ static av_unused int pthread_cond_signal(pthread_cond_t *cond)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock(&win32_cond->mtx_broadcast);
|
pthread_mutex_unlock(&win32_cond->mtx_broadcast);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -407,12 +309,8 @@ static av_unused void w32thread_init(void)
|
|||||||
(void*)GetProcAddress(kernel_dll, "WakeConditionVariable");
|
(void*)GetProcAddress(kernel_dll, "WakeConditionVariable");
|
||||||
cond_wait =
|
cond_wait =
|
||||||
(void*)GetProcAddress(kernel_dll, "SleepConditionVariableCS");
|
(void*)GetProcAddress(kernel_dll, "SleepConditionVariableCS");
|
||||||
initonce_begin =
|
|
||||||
(void*)GetProcAddress(kernel_dll, "InitOnceBeginInitialize");
|
|
||||||
initonce_complete =
|
|
||||||
(void*)GetProcAddress(kernel_dll, "InitOnceComplete");
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* COMPAT_W32PTHREADS_H */
|
#endif /* FFMPEG_COMPAT_W32PTHREADS_H */
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
LINK_EXE_PATH=$(dirname "$(command -v cl)")/link
|
|
||||||
if [ -x "$LINK_EXE_PATH" ]; then
|
|
||||||
"$LINK_EXE_PATH" $@
|
|
||||||
else
|
|
||||||
link $@
|
|
||||||
fi
|
|
||||||
exit $?
|
|
||||||
9
doc/.gitignore
vendored
9
doc/.gitignore
vendored
@@ -1,9 +0,0 @@
|
|||||||
/*.1
|
|
||||||
/*.3
|
|
||||||
/*.html
|
|
||||||
/*.pod
|
|
||||||
/config.texi
|
|
||||||
/avoptions_codec.texi
|
|
||||||
/avoptions_format.texi
|
|
||||||
/fate.txt
|
|
||||||
/print_options
|
|
||||||
334
doc/APIchanges
334
doc/APIchanges
@@ -2,321 +2,19 @@ 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.
|
since the last major version increase or the API was added.
|
||||||
|
|
||||||
The last version increases were:
|
The last version increases were:
|
||||||
libavcodec: 2015-08-28
|
libavcodec: 2014-08-09
|
||||||
libavdevice: 2015-08-28
|
libavdevice: 2014-08-09
|
||||||
libavfilter: 2015-08-28
|
libavfilter: 2014-08-09
|
||||||
libavformat: 2015-08-28
|
libavformat: 2014-08-09
|
||||||
libavresample: 2015-08-28
|
libavresample: 2014-08-09
|
||||||
libpostproc: 2015-08-28
|
libpostproc: 2014-08-09
|
||||||
libswresample: 2015-08-28
|
libswresample: 2014-08-09
|
||||||
libswscale: 2015-08-28
|
libswscale: 2014-08-09
|
||||||
libavutil: 2015-08-28
|
libavutil: 2014-08-09
|
||||||
|
|
||||||
|
|
||||||
API changes, most recent first:
|
API changes, most recent first:
|
||||||
|
|
||||||
2016-06-26 - xxxxxxx / 1c9e861 - lavu 55.27.100 / 55.13.0 - hwcontext.h
|
|
||||||
Add av_hwdevice_ctx_create().
|
|
||||||
|
|
||||||
2016-06-26 - xxxxxxx / e47b8bb - lavc 57.48.101 / 57.19.1 - avcodec.h
|
|
||||||
Adjust values for JPEG 2000 profiles.
|
|
||||||
|
|
||||||
-------- 8< --------- FFmpeg 3.1 was cut here -------- 8< ---------
|
|
||||||
|
|
||||||
2016-06-23 - 5d75e46 / db7968b - lavf 57.40.100 / 57.7.0 - avio.h
|
|
||||||
Add AVIODataMarkerType, write_data_type, ignore_boundary_point and
|
|
||||||
avio_write_marker.
|
|
||||||
|
|
||||||
2016-06-23 - abb3cc4 / 0c4468d - lavu 55.26.100 / 55.12.0 - opt.h
|
|
||||||
Add av_stereo3d_type_name() and av_stereo3d_from_name().
|
|
||||||
|
|
||||||
2016-06-22 - 3689efe / c46db38 - lavu 55.25.100 / 55.11.0 - hwcontext_dxva2.h
|
|
||||||
Add new installed header with DXVA2-specific hwcontext definitions.
|
|
||||||
|
|
||||||
2016-04-27 - fb91871 - lavu 55.23.100 - log.h
|
|
||||||
Add a new function av_log_format_line2() which returns number of bytes
|
|
||||||
written to the target buffer.
|
|
||||||
|
|
||||||
2016-04-21 - 7fc329e - lavc 57.37.100 - avcodec.h
|
|
||||||
Add a new audio/video encoding and decoding API with decoupled input
|
|
||||||
and output -- avcodec_send_packet(), avcodec_receive_frame(),
|
|
||||||
avcodec_send_frame() and avcodec_receive_packet().
|
|
||||||
|
|
||||||
2016-04-17 - af9cac1 / 33d1898 - lavc 57.35.100 / 57.15.0 - avcodec.h
|
|
||||||
Add a new bitstream filtering API working with AVPackets.
|
|
||||||
Deprecate the old bitstream filtering API.
|
|
||||||
|
|
||||||
2016-04-14 - 8688d3a / 07a844f - lavfi 6.42.100 / 6.3.0 - avfilter.h
|
|
||||||
Add AVFilterContext.hw_device_ctx.
|
|
||||||
|
|
||||||
2016-04-14 - 28abb21 / 551c677 - lavu 55.22.100 / 55.9.0 - hwcontext_vaapi.h
|
|
||||||
Add new installed header with VAAPI-specific hwcontext definitions.
|
|
||||||
|
|
||||||
2016-04-14 - afccfaf / b1f01e8 - lavu 55.21.100 / 55.7.0 - hwcontext.h
|
|
||||||
Add AVHWFramesConstraints and associated API.
|
|
||||||
|
|
||||||
2016-04-11 - 6f69f7a / 9200514 - lavf 57.33.100 / 57.5.0 - avformat.h
|
|
||||||
Add AVStream.codecpar, deprecate AVStream.codec.
|
|
||||||
|
|
||||||
2016-04-02 - e8a9b64 - lavu 55.20.100 - base64.h
|
|
||||||
Add AV_BASE64_DECODE_SIZE(x) macro.
|
|
||||||
|
|
||||||
2016-xx-xx - lavc 57.33.100 / 57.14.0 - avcodec.h
|
|
||||||
f9b1cf1 / 998e1b8 - Add AVCodecParameters and its related API.
|
|
||||||
e6053b3 / a806834 - Add av_get_audio_frame_duration2().
|
|
||||||
|
|
||||||
2016-03-11 - 6d8ab35 - lavf/lavc 57.28.101
|
|
||||||
Add requirement to bitstream filtering API that returned packets with
|
|
||||||
size == 0 and side_data_elems == 0 are to be skipped by the caller.
|
|
||||||
|
|
||||||
2016-03-04 - 9362973 - lavf 57.28.100
|
|
||||||
Add protocol blacklisting API
|
|
||||||
|
|
||||||
2016-02-28 - 4dd4d53 - lavc 57.27.101
|
|
||||||
Validate AVFrame returned by get_buffer2 to have required
|
|
||||||
planes not NULL and unused planes set to NULL as crashes
|
|
||||||
and buffer overflow are possible with certain streams if
|
|
||||||
that is not the case.
|
|
||||||
|
|
||||||
2016-02-26 - 30e7685 - lavc 57.27.100 - avcodec.h
|
|
||||||
"flags2" decoding option now allows the flag "ass_ro_flush_noop" preventing
|
|
||||||
the reset of the ASS ReadOrder field on flush. This affects the content of
|
|
||||||
AVSubtitles.rects[N]->ass when "sub_text_format" is set to "ass" (see
|
|
||||||
previous entry).
|
|
||||||
|
|
||||||
2016-02-26 - 2941282 - lavc 57.26.100 - avcodec.h
|
|
||||||
Add a "sub_text_format" subtitles decoding option allowing the values "ass"
|
|
||||||
(recommended) and "ass_with_timings" (not recommended, deprecated, default).
|
|
||||||
The default value for this option will change to "ass" at the next major
|
|
||||||
libavcodec version bump.
|
|
||||||
|
|
||||||
The current default is "ass_with_timings" for compatibility. This means that
|
|
||||||
all subtitles text decoders currently still output ASS with timings printed
|
|
||||||
as strings in the AVSubtitles.rects[N]->ass fields.
|
|
||||||
|
|
||||||
Setting "sub_text_format" to "ass" allows a better timing accuracy (ASS
|
|
||||||
timing is limited to a 1/100 time base, so this is relevant for any subtitles
|
|
||||||
format needing a bigger one), ease timing adjustments, and prevents the need
|
|
||||||
of removing the timing from the decoded string yourself. This form is also
|
|
||||||
known as "the Matroska form". The timing information (start time, duration)
|
|
||||||
can be found in the AVSubtitles fields.
|
|
||||||
|
|
||||||
2016-02-24 - 7e49cdd / 7b3214d0 - lavc 57.25.100 / 57.13.0 - avcodec.h
|
|
||||||
Add AVCodecContext.hw_frames_ctx.
|
|
||||||
|
|
||||||
2016-02-24 - 1042402 / b3dd30d - lavfi 6.36.100 / 6.2.0 - avfilter.h
|
|
||||||
avfilter.h - Add AVFilterLink.hw_frames_ctx.
|
|
||||||
buffersrc.h - Add AVBufferSrcParameters and functions for handling it.
|
|
||||||
|
|
||||||
2016-02-23 - 14f7a3d - lavc 57.25.100
|
|
||||||
Add AV_PKT_DATA_MPEGTS_STREAM_ID for exporting the MPEGTS stream ID.
|
|
||||||
|
|
||||||
2016-02-18 - 08acab8 - lavu 55.18.100 - audio_fifo.h
|
|
||||||
Add av_audio_fifo_peek_at().
|
|
||||||
|
|
||||||
2016-xx-xx - lavu 55.18.100 / 55.6.0
|
|
||||||
26abd51 / 721a4ef buffer.h - Add av_buffer_pool_init2().
|
|
||||||
1a70878 / 89923e4 hwcontext.h - Add a new installed header hwcontext.h with a new API
|
|
||||||
for handling hwaccel frames.
|
|
||||||
6992276 / ad884d1 hwcontext_cuda.h - Add a new installed header hwcontext_cuda.h with
|
|
||||||
CUDA-specific hwcontext definitions.
|
|
||||||
d779d8d / a001ce3 hwcontext_vdpau.h - Add a new installed header hwcontext_vdpau.h with
|
|
||||||
VDPAU-specific hwcontext definitions.
|
|
||||||
63c3e35 / 7bc780c pixfmt.h - Add AV_PIX_FMT_CUDA.
|
|
||||||
|
|
||||||
-------- 8< --------- FFmpeg 3.0 was cut here -------- 8< ---------
|
|
||||||
|
|
||||||
2016-02-10 - bc9a596 / 9f61abc - lavf 57.25.100 / 57.3.0 - avformat.h
|
|
||||||
Add AVFormatContext.opaque, io_open and io_close, allowing custom IO
|
|
||||||
|
|
||||||
2016-02-01 - 1dba837 - lavf 57.24.100 - avformat.h, avio.h
|
|
||||||
Add protocol_whitelist to AVFormatContext, AVIOContext
|
|
||||||
|
|
||||||
2016-01-31 - 66e9d2f - lavu 55.17.100 - frame.h
|
|
||||||
Add AV_FRAME_DATA_GOP_TIMECODE for exporting MPEG1/2 GOP timecodes.
|
|
||||||
|
|
||||||
2016-01-01 - 5e8b053 / 2c68113 - lavc 57.21.100 / 57.12.0 - avcodec.h
|
|
||||||
Add AVCodecDescriptor.profiles and avcodec_profile_name().
|
|
||||||
|
|
||||||
2015-12-28 - 1f9139b - lavf 57.21.100 - avformat.h
|
|
||||||
Add automatic bitstream filtering; add av_apply_bitstream_filters()
|
|
||||||
|
|
||||||
2015-12-22 - 39a09e9 - lavfi 6.21.101 - avfilter.h
|
|
||||||
Deprecate avfilter_link_set_closed().
|
|
||||||
Applications are not supposed to mess with links,
|
|
||||||
they should close the sinks.
|
|
||||||
|
|
||||||
2015-12-17 - lavc 57.18.100 / 57.11.0 - avcodec.h dirac.h
|
|
||||||
xxxxxxx - Add av_packet_add_side_data().
|
|
||||||
xxxxxxx - Add AVCodecContext.coded_side_data.
|
|
||||||
xxxxxxx - Add AVCPBProperties API.
|
|
||||||
xxxxxxx - Add a new public header dirac.h containing
|
|
||||||
av_dirac_parse_sequence_header()
|
|
||||||
|
|
||||||
2015-12-11 - 676a93f - lavf 57.20.100 - avformat.h
|
|
||||||
Add av_program_add_stream_index()
|
|
||||||
|
|
||||||
2015-11-29 - 93fb4a4 - lavc 57.16.101 - avcodec.h
|
|
||||||
Deprecate rtp_callback without replacement, i.e. it won't be possible to
|
|
||||||
get image slices before the full frame is encoded any more. The libavformat
|
|
||||||
rtpenc muxer can still be used for RFC-2190 packetization.
|
|
||||||
|
|
||||||
2015-11-22 - fe20e34 - lavc 57.16.100 - avcodec.h
|
|
||||||
Add AV_PKT_DATA_FALLBACK_TRACK for making fallback associations between
|
|
||||||
streams.
|
|
||||||
|
|
||||||
2015-11-22 - ad317c9 - lavf 57.19.100 - avformat.h
|
|
||||||
Add av_stream_new_side_data().
|
|
||||||
|
|
||||||
2015-11-22 - e12f403 - lavu 55.8.100 - xtea.h
|
|
||||||
Add av_xtea_le_init and av_xtea_le_crypt
|
|
||||||
|
|
||||||
2015-11-18 - lavu 55.7.100 - mem.h
|
|
||||||
Add av_fast_mallocz()
|
|
||||||
|
|
||||||
2015-10-29 - lavc 57.12.100 / 57.8.0 - avcodec.h
|
|
||||||
xxxxxx - Deprecate av_free_packet(). Use av_packet_unref() as replacement,
|
|
||||||
it resets the packet in a more consistent way.
|
|
||||||
xxxxxx - Deprecate av_dup_packet(), it is a no-op for most cases.
|
|
||||||
Use av_packet_ref() to make a non-refcounted AVPacket refcounted.
|
|
||||||
xxxxxx - Add av_packet_alloc(), av_packet_clone(), av_packet_free().
|
|
||||||
They match the AVFrame functions with the same name.
|
|
||||||
|
|
||||||
2015-10-27 - 1e477a9 - lavu 55.5.100 - cpu.h
|
|
||||||
Add AV_CPU_FLAG_AESNI.
|
|
||||||
|
|
||||||
2015-10-22 - ee573b4 / a17a766 - lavc 57.9.100 / 57.5.0 - avcodec.h
|
|
||||||
Add data and linesize array to AVSubtitleRect, to be used instead of
|
|
||||||
the ones from the embedded AVPicture.
|
|
||||||
|
|
||||||
2015-10-22 - 866a417 / dc923bc - lavc 57.8.100 / 57.0.0 - qsv.h
|
|
||||||
Add an API for allocating opaque surfaces.
|
|
||||||
|
|
||||||
2015-10-15 - 2c2d162 - lavf 57.4.100
|
|
||||||
Remove the latm demuxer that was a duplicate of the loas demuxer.
|
|
||||||
|
|
||||||
2015-10-14 - b994788 / 11c5f43 - lavu 55.4.100 / 55.2.0 - dict.h
|
|
||||||
Change return type of av_dict_copy() from void to int, so that a proper
|
|
||||||
error code can be reported.
|
|
||||||
|
|
||||||
2015-09-29 - b01891a / 948f3c1 - lavc 57.3.100 / 57.2.0 - avcodec.h
|
|
||||||
Change type of AVPacket.duration from int to int64_t.
|
|
||||||
|
|
||||||
2015-09-17 - 7c46f24 / e3d4784 - lavc 57.3.100 / 57.2.0 - d3d11va.h
|
|
||||||
Add av_d3d11va_alloc_context(). This function must from now on be used for
|
|
||||||
allocating AVD3D11VAContext.
|
|
||||||
|
|
||||||
2015-09-15 - lavf 57.2.100 - avformat.h
|
|
||||||
probesize and max_analyze_duration switched to 64bit, both
|
|
||||||
are only accessible through AVOptions
|
|
||||||
|
|
||||||
2015-09-15 - lavf 57.1.100 - avformat.h
|
|
||||||
bit_rate was changed to 64bit, make sure you update any
|
|
||||||
printf() or other type sensitive code
|
|
||||||
|
|
||||||
2015-09-15 - lavc 57.2.100 - avcodec.h
|
|
||||||
bit_rate/rc_max_rate/rc_min_rate were changed to 64bit, make sure you update
|
|
||||||
any printf() or other type sensitive code
|
|
||||||
|
|
||||||
2015-09-07 - lavu 55.0.100 / 55.0.0
|
|
||||||
c734b34 / b8b5d82 - Change type of AVPixFmtDescriptor.flags from uint8_t to uint64_t.
|
|
||||||
f53569a / 6b3ef7f - Change type of AVComponentDescriptor fields from uint16_t to int
|
|
||||||
and drop bit packing.
|
|
||||||
151aa2e / 2268db2 - Add step, offset, and depth to AVComponentDescriptor to replace
|
|
||||||
the deprecated step_minus1, offset_plus1, and depth_minus1.
|
|
||||||
|
|
||||||
-------- 8< --------- FFmpeg 2.8 was cut here -------- 8< ---------
|
|
||||||
|
|
||||||
2015-08-27 - 1dd854e1 - lavc 56.58.100 - vaapi.h
|
|
||||||
Deprecate old VA-API context (vaapi_context) fields that were only
|
|
||||||
set and used by libavcodec. They are all managed internally now.
|
|
||||||
|
|
||||||
2015-08-19 - 9f8e57ef - lavu 54.31.100 - pixfmt.h
|
|
||||||
Add a unique pixel format for VA-API (AV_PIX_FMT_VAAPI) that
|
|
||||||
indicates the nature of the underlying storage: a VA surface. This
|
|
||||||
yields the same value as AV_PIX_FMT_VAAPI_VLD.
|
|
||||||
Deprecate old VA-API related pixel formats: AV_PIX_FMT_VAAPI_MOCO,
|
|
||||||
AV_PIX_FMT_VAAPI_IDCT, AV_PIX_FMT_VAAPI_VLD.
|
|
||||||
|
|
||||||
2015-08-02 - lavu 54.30.100 / 54.17.0
|
|
||||||
9ed59f1 / 7a7df34c - Add av_blowfish_alloc().
|
|
||||||
a130ec9 / ae365453 - Add av_rc4_alloc().
|
|
||||||
9ca1997 / 5d8bea3b - Add av_xtea_alloc().
|
|
||||||
3cf08e9 / d9e8b47e - Add av_des_alloc().
|
|
||||||
|
|
||||||
2015-07-27 - lavc 56.56.100 / 56.35.0 - avcodec.h
|
|
||||||
94d68a4 / 7c6eb0a1 - Rename CODEC_FLAG* defines to AV_CODEC_FLAG*.
|
|
||||||
444e987 / def97856 - Rename CODEC_CAP_* defines to AV_CODEC_CAP_*.
|
|
||||||
29d147c / 059a9348 - Rename FF_INPUT_BUFFER_PADDING_SIZE and FF_MIN_BUFFER_SIZE
|
|
||||||
to AV_INPUT_BUFFER_PADDING_SIZE and AV_INPUT_BUFFER_MIN_SIZE.
|
|
||||||
|
|
||||||
2015-07-22 - c40ecff - lavc 56.51.100 - avcodec.h
|
|
||||||
Add AV_PKT_DATA_QUALITY_STATS to export the quality value, PSNR, and pict_type
|
|
||||||
of an AVPacket.
|
|
||||||
|
|
||||||
2015-07-16 - 8dad213 - lavc 56.49.100
|
|
||||||
Add av_codec_get_codec_properties(), FF_CODEC_PROPERTY_LOSSLESS
|
|
||||||
and FF_CODEC_PROPERTY_CLOSED_CAPTIONS
|
|
||||||
|
|
||||||
2015-07-03 - d563e13 / 83212943 - lavu 54.28.100 / 56.15.0
|
|
||||||
Add av_version_info().
|
|
||||||
|
|
||||||
-------- 8< --------- FFmpeg 2.7 was cut here -------- 8< ---------
|
|
||||||
|
|
||||||
2015-06-04 - cc17b43 - lswr 1.2.100
|
|
||||||
Add swr_get_out_samples()
|
|
||||||
|
|
||||||
2015-05-27 - c312bfa - lavu 54.26.100 - cpu.h
|
|
||||||
Add AV_CPU_FLAG_AVXSLOW.
|
|
||||||
|
|
||||||
2015-05-26 - 1fb9b2a - lavu 54.25.100 - rational.h
|
|
||||||
Add av_q2intfloat().
|
|
||||||
|
|
||||||
2015-05-13 - cc48409 / e7c5e17 - lavc 56.39.100 / 56.23.0
|
|
||||||
Add av_vda_default_init2.
|
|
||||||
|
|
||||||
2015-05-11 - 541d75f - lavf 56.33.100 - avformat.h
|
|
||||||
Add AVOpenCallback AVFormatContext.open_cb
|
|
||||||
|
|
||||||
2015-05-07 - a7dd933 - 56.38.100 - avcodec.h
|
|
||||||
Add av_packet_side_data_name().
|
|
||||||
|
|
||||||
2015-05-07 - 01e59d4 - 56.37.102 - avcodec.h
|
|
||||||
Add FF_PROFILE_VP9_2 and FF_PROFILE_VP9_3.
|
|
||||||
|
|
||||||
2015-05-04 - 079b7f6 - 56.37.100 - avcodec.h
|
|
||||||
Add FF_PROFILE_VP9_0 and FF_PROFILE_VP9_1.
|
|
||||||
|
|
||||||
2015-04-22 - 748d481 - lavf 56.31.100 - avformat.h
|
|
||||||
Add AVFMT_FLAG_FAST_SEEK flag. Some formats (initially mp3) use it to enable
|
|
||||||
fast, but inaccurate seeking.
|
|
||||||
|
|
||||||
2015-04-20 - 8e8219e / c253340 - lavu 54.23.100 / 54.12.0 - log.h
|
|
||||||
Add AV_LOG_TRACE for extremely verbose debugging.
|
|
||||||
|
|
||||||
2015-04-02 - 26e0e393 - lavf 56.29.100 - avio.h
|
|
||||||
Add AVIODirEntryType.AVIO_ENTRY_SERVER.
|
|
||||||
Add AVIODirEntryType.AVIO_ENTRY_SHARE.
|
|
||||||
Add AVIODirEntryType.AVIO_ENTRY_WORKGROUP.
|
|
||||||
|
|
||||||
2015-03-31 - 3188696 - lavu 54.22.100 - avstring.h
|
|
||||||
Add av_append_path_component()
|
|
||||||
|
|
||||||
2015-03-27 - 184084c - lavf 56.27.100 - avio.h url.h
|
|
||||||
New directory listing API.
|
|
||||||
|
|
||||||
Add AVIODirEntryType enum.
|
|
||||||
Add AVIODirEntry, AVIODirContext structures.
|
|
||||||
Add avio_open_dir(), avio_read_dir(), avio_close_dir(), avio_free_directory_entry().
|
|
||||||
Add ff_alloc_dir_entry().
|
|
||||||
Extend URLProtocol with url_open_dir(), url_read_dir(), url_close_dir().
|
|
||||||
|
|
||||||
2015-03-29 - 268ff17 / c484561 - lavu 54.21.100 / 54.10.0 - pixfmt.h
|
|
||||||
Add AV_PIX_FMT_MMAL for MMAL hardware acceleration.
|
|
||||||
|
|
||||||
2015-03-19 - 11fe56c - 56.29.100 / lavc 56.22.0
|
|
||||||
Add FF_PROFILE_DTS_EXPRESS.
|
|
||||||
|
|
||||||
-------- 8< --------- FFmpeg 2.6 was cut here -------- 8< ---------
|
-------- 8< --------- FFmpeg 2.6 was cut here -------- 8< ---------
|
||||||
|
|
||||||
2015-03-04 - cca4476 - lavf 56.25.100
|
2015-03-04 - cca4476 - lavf 56.25.100
|
||||||
@@ -938,9 +636,6 @@ API changes, most recent first:
|
|||||||
av_ripemd_update()
|
av_ripemd_update()
|
||||||
av_ripemd_final()
|
av_ripemd_final()
|
||||||
|
|
||||||
2013-06-10 - 82ef670 - lavu 52.35.101 - hmac.h
|
|
||||||
Add AV_HMAC_SHA224, AV_HMAC_SHA256, AV_HMAC_SHA384, AV_HMAC_SHA512
|
|
||||||
|
|
||||||
2013-06-04 - 30b491f / fc962d4 - lavu 52.35.100 / 52.13.0 - mem.h
|
2013-06-04 - 30b491f / fc962d4 - lavu 52.35.100 / 52.13.0 - mem.h
|
||||||
Add av_realloc_array and av_reallocp_array
|
Add av_realloc_array and av_reallocp_array
|
||||||
|
|
||||||
@@ -1193,7 +888,7 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
|
|||||||
* base -- is now stored in AVBufferRef
|
* base -- is now stored in AVBufferRef
|
||||||
* reference, type, buffer_hints -- are unnecessary in the new API
|
* reference, type, buffer_hints -- are unnecessary in the new API
|
||||||
* hwaccel_picture_private, owner, thread_opaque -- should not
|
* hwaccel_picture_private, owner, thread_opaque -- should not
|
||||||
have been accessed from outside of lavc
|
have been acessed from outside of lavc
|
||||||
* qscale_table, qstride, qscale_type, mbskip_table, motion_val,
|
* qscale_table, qstride, qscale_type, mbskip_table, motion_val,
|
||||||
mb_type, dct_coeff, ref_index -- mpegvideo-specific tables,
|
mb_type, dct_coeff, ref_index -- mpegvideo-specific tables,
|
||||||
which are not exported anymore.
|
which are not exported anymore.
|
||||||
@@ -1230,14 +925,15 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
|
|||||||
Add avresample_set_channel_mapping() for input channel reordering,
|
Add avresample_set_channel_mapping() for input channel reordering,
|
||||||
duplication, and silencing.
|
duplication, and silencing.
|
||||||
|
|
||||||
2012-12-29 - lavu 52.13.100 / 52.3.0 - avstring.h
|
2012-12-29 - 2ce43b3 / d8fd06c - lavu 52.13.100 / 52.3.0 - avstring.h
|
||||||
2ce43b3 / d8fd06c - Add av_basename() and av_dirname().
|
Add av_basename() and av_dirname().
|
||||||
e13d5e9 / c1a02e8 - Add av_pix_fmt_get_chroma_sub_sample and deprecate
|
|
||||||
avcodec_get_chroma_sub_sample.
|
|
||||||
|
|
||||||
2012-11-11 - 03b0787 / 5980f5d - lavu 52.6.100 / 52.2.0 - audioconvert.h
|
2012-11-11 - 03b0787 / 5980f5d - lavu 52.6.100 / 52.2.0 - audioconvert.h
|
||||||
Rename audioconvert.h to channel_layout.h. audioconvert.h is now deprecated.
|
Rename audioconvert.h to channel_layout.h. audioconvert.h is now deprecated.
|
||||||
|
|
||||||
|
2012-11-05 - 7d26be6 / dfde8a3 - lavu 52.5.100 / 52.1.0 - intmath.h
|
||||||
|
Add av_ctz() for trailing zero bit count
|
||||||
|
|
||||||
2012-10-21 - e3a91c5 / a893655 - lavu 51.77.100 / 51.45.0 - error.h
|
2012-10-21 - e3a91c5 / a893655 - lavu 51.77.100 / 51.45.0 - error.h
|
||||||
Add AVERROR_EXPERIMENTAL
|
Add AVERROR_EXPERIMENTAL
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ PROJECT_NAME = FFmpeg
|
|||||||
# This could be handy for archiving the generated documentation or
|
# This could be handy for archiving the generated documentation or
|
||||||
# if some version control system is used.
|
# if some version control system is used.
|
||||||
|
|
||||||
PROJECT_NUMBER =
|
PROJECT_NUMBER = 2.6
|
||||||
|
|
||||||
# With the PROJECT_LOGO tag one can specify a logo or icon that is included
|
# 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
|
# in the documentation. The maximum height of the logo should not exceed 55
|
||||||
@@ -1360,7 +1360,6 @@ PREDEFINED = "__attribute__(x)=" \
|
|||||||
"offsetof(x,y)=0x42" \
|
"offsetof(x,y)=0x42" \
|
||||||
av_alloc_size \
|
av_alloc_size \
|
||||||
AV_GCC_VERSION_AT_LEAST(x,y)=1 \
|
AV_GCC_VERSION_AT_LEAST(x,y)=1 \
|
||||||
AV_GCC_VERSION_AT_MOST(x,y)=0 \
|
|
||||||
__GNUC__=1 \
|
__GNUC__=1 \
|
||||||
|
|
||||||
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
|
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
|
||||||
@@ -1429,7 +1428,7 @@ PERL_PATH = /usr/bin/perl
|
|||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
|
|
||||||
# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
|
# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
|
||||||
# generate an inheritance diagram (in HTML, RTF and LaTeX) for classes with base
|
# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
|
||||||
# or super classes. Setting the tag to NO turns the diagrams off. Note that
|
# or super classes. Setting the tag to NO turns the diagrams off. Note that
|
||||||
# this option is superseded by the HAVE_DOT option below. This is only a
|
# this option is superseded by the HAVE_DOT option below. This is only a
|
||||||
# fallback. It is recommended to install and use dot, since it yields more
|
# fallback. It is recommended to install and use dot, since it yields more
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ DOCS-$(CONFIG_MANPAGES) += $(MANPAGES)
|
|||||||
DOCS-$(CONFIG_TXTPAGES) += $(TXTPAGES)
|
DOCS-$(CONFIG_TXTPAGES) += $(TXTPAGES)
|
||||||
DOCS = $(DOCS-yes)
|
DOCS = $(DOCS-yes)
|
||||||
|
|
||||||
DOC_EXAMPLES-$(CONFIG_AVIO_DIR_CMD_EXAMPLE) += avio_dir_cmd
|
|
||||||
DOC_EXAMPLES-$(CONFIG_AVIO_READING_EXAMPLE) += avio_reading
|
DOC_EXAMPLES-$(CONFIG_AVIO_READING_EXAMPLE) += avio_reading
|
||||||
DOC_EXAMPLES-$(CONFIG_AVCODEC_EXAMPLE) += avcodec
|
DOC_EXAMPLES-$(CONFIG_AVCODEC_EXAMPLE) += avcodec
|
||||||
DOC_EXAMPLES-$(CONFIG_DECODING_ENCODING_EXAMPLE) += decoding_encoding
|
DOC_EXAMPLES-$(CONFIG_DECODING_ENCODING_EXAMPLE) += decoding_encoding
|
||||||
@@ -124,12 +123,11 @@ $(DOCS) doc/doxy/html: | doc/
|
|||||||
$(DOC_EXAMPLES:%$(EXESUF)=%.o): | doc/examples
|
$(DOC_EXAMPLES:%$(EXESUF)=%.o): | doc/examples
|
||||||
OBJDIRS += doc/examples
|
OBJDIRS += doc/examples
|
||||||
|
|
||||||
DOXY_INPUT = $(INSTHEADERS) $(DOC_EXAMPLES:%$(EXESUF)=%.c) $(LIB_EXAMPLES:%$(EXESUF)=%.c)
|
DOXY_INPUT = $(addprefix $(SRC_PATH)/, $(INSTHEADERS) $(DOC_EXAMPLES:%$(EXESUF)=%.c) $(LIB_EXAMPLES:%$(EXESUF)=%.c))
|
||||||
DOXY_INPUT_DEPS = $(addprefix $(SRC_PATH)/, $(DOXY_INPUT))
|
|
||||||
|
|
||||||
doc/doxy/html: TAG = DOXY
|
doc/doxy/html: TAG = DOXY
|
||||||
doc/doxy/html: $(SRC_PATH)/doc/Doxyfile $(SRC_PATH)/doc/doxy-wrapper.sh $(DOXY_INPUT_DEPS)
|
doc/doxy/html: $(SRC_PATH)/doc/Doxyfile $(SRC_PATH)/doc/doxy-wrapper.sh $(DOXY_INPUT)
|
||||||
$(M)OUT_DIR=$$PWD/doc/doxy; cd $(SRC_PATH); ./doc/doxy-wrapper.sh $$OUT_DIR $< $(DOXYGEN) $(DOXY_INPUT);
|
$(M)$(SRC_PATH)/doc/doxy-wrapper.sh $(SRC_PATH) $< $(DOXYGEN) $(DOXY_INPUT)
|
||||||
|
|
||||||
install-doc: install-html install-man
|
install-doc: install-html install-man
|
||||||
|
|
||||||
|
|||||||
@@ -67,10 +67,6 @@ the header stored in extradata to the key packets:
|
|||||||
ffmpeg -i INPUT -map 0 -flags:v +global_header -c:v libx264 -bsf:v dump_extra out.ts
|
ffmpeg -i INPUT -map 0 -flags:v +global_header -c:v libx264 -bsf:v dump_extra out.ts
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@section dca_core
|
|
||||||
|
|
||||||
Extract DCA core from DTS-HD streams.
|
|
||||||
|
|
||||||
@section h264_mp4toannexb
|
@section h264_mp4toannexb
|
||||||
|
|
||||||
Convert an H.264 bitstream from length prefixed mode to start code
|
Convert an H.264 bitstream from length prefixed mode to start code
|
||||||
@@ -143,26 +139,6 @@ ffmpeg -i frame_%d.jpg -c:v copy rotated.avi
|
|||||||
|
|
||||||
@section mp3_header_decompress
|
@section mp3_header_decompress
|
||||||
|
|
||||||
@section mpeg4_unpack_bframes
|
|
||||||
|
|
||||||
Unpack DivX-style packed B-frames.
|
|
||||||
|
|
||||||
DivX-style packed B-frames are not valid MPEG-4 and were only a
|
|
||||||
workaround for the broken Video for Windows subsystem.
|
|
||||||
They use more space, can cause minor AV sync issues, require more
|
|
||||||
CPU power to decode (unless the player has some decoded picture queue
|
|
||||||
to compensate the 2,0,2,0 frame per packet style) and cause
|
|
||||||
trouble if copied into a standard container like mp4 or mpeg-ps/ts,
|
|
||||||
because MPEG-4 decoders may not be able to decode them, since they are
|
|
||||||
not valid MPEG-4.
|
|
||||||
|
|
||||||
For example to fix an AVI file containing an MPEG-4 stream with
|
|
||||||
DivX-style packed B-frames using @command{ffmpeg}, you can use the command:
|
|
||||||
|
|
||||||
@example
|
|
||||||
ffmpeg -i INPUT.avi -codec copy -bsf:v mpeg4_unpack_bframes OUTPUT.avi
|
|
||||||
@end example
|
|
||||||
|
|
||||||
@section noise
|
@section noise
|
||||||
|
|
||||||
Damages the contents of packets without damaging the container. Can be
|
Damages the contents of packets without damaging the container. Can be
|
||||||
|
|||||||
@@ -9,26 +9,23 @@ V
|
|||||||
|
|
||||||
DBG
|
DBG
|
||||||
Preprocess x86 external assembler files to a .dbg.asm file in the object
|
Preprocess x86 external assembler files to a .dbg.asm file in the object
|
||||||
directory, which then gets compiled. Helps in developing those assembler
|
directory, which then gets compiled. Helps developping those assembler
|
||||||
files.
|
files.
|
||||||
|
|
||||||
DESTDIR
|
DESTDIR
|
||||||
Destination directory for the install targets, useful to prepare packages
|
Destination directory for the install targets, useful to prepare packages
|
||||||
or install FFmpeg in cross-environments.
|
or install FFmpeg in cross-environments.
|
||||||
|
|
||||||
GEN
|
|
||||||
Set to ‘1’ to generate the missing or mismatched references.
|
|
||||||
|
|
||||||
Makefile targets:
|
Makefile targets:
|
||||||
|
|
||||||
all
|
all
|
||||||
Default target, builds all the libraries and the executables.
|
Default target, builds all the libraries and the executables.
|
||||||
|
|
||||||
fate
|
fate
|
||||||
Run the fate test suite, note that you must have installed it.
|
Run the fate test suite, note you must have installed it
|
||||||
|
|
||||||
fate-list
|
fate-list
|
||||||
List all fate/regression test targets.
|
Will list all fate/regression test targets
|
||||||
|
|
||||||
install
|
install
|
||||||
Install headers, libraries and programs.
|
Install headers, libraries and programs.
|
||||||
@@ -39,23 +36,26 @@ examples
|
|||||||
libavformat/output-example
|
libavformat/output-example
|
||||||
Build the libavformat basic example.
|
Build the libavformat basic example.
|
||||||
|
|
||||||
|
libavcodec/api-example
|
||||||
|
Build the libavcodec basic example.
|
||||||
|
|
||||||
libswscale/swscale-test
|
libswscale/swscale-test
|
||||||
Build the swscale self-test (useful also as an example).
|
Build the swscale self-test (useful also as example).
|
||||||
|
|
||||||
config
|
config
|
||||||
Reconfigure the project with the current configuration.
|
Reconfigure the project with current configuration.
|
||||||
|
|
||||||
|
|
||||||
Useful standard make commands:
|
Useful standard make commands:
|
||||||
make -t <target>
|
make -t <target>
|
||||||
Touch all files that otherwise would be built, this is useful to reduce
|
Touch all files that otherwise would be build, this is useful to reduce
|
||||||
unneeded rebuilding when changing headers, but note that you must force rebuilds
|
unneeded rebuilding when changing headers, but note you must force rebuilds
|
||||||
of files that actually need it by hand then.
|
of files that actually need it by hand then.
|
||||||
|
|
||||||
make -j<num>
|
make -j<num>
|
||||||
Rebuild with multiple jobs at the same time. Faster on multi processor systems.
|
rebuild with multiple jobs at the same time. Faster on multi processor systems
|
||||||
|
|
||||||
make -k
|
make -k
|
||||||
Continue build in case of errors, this is useful for the regression tests
|
continue build in case of errors, this is useful for the regression tests
|
||||||
sometimes but note that it will still not run all reg tests.
|
sometimes but note it will still not run all reg tests.
|
||||||
|
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ should be @code{1 / frame_rate} and timestamp increments should be
|
|||||||
identically 1.
|
identically 1.
|
||||||
|
|
||||||
@item g @var{integer} (@emph{encoding,video})
|
@item g @var{integer} (@emph{encoding,video})
|
||||||
Set the group of picture (GOP) size. Default value is 12.
|
Set the group of picture size. Default value is 12.
|
||||||
|
|
||||||
@item ar @var{integer} (@emph{decoding/encoding,audio})
|
@item ar @var{integer} (@emph{decoding/encoding,audio})
|
||||||
Set audio sampling rate (in Hz).
|
Set audio sampling rate (in Hz).
|
||||||
@@ -257,7 +257,7 @@ Specify how strictly to follow the standards.
|
|||||||
Possible values:
|
Possible values:
|
||||||
@table @samp
|
@table @samp
|
||||||
@item very
|
@item very
|
||||||
strictly conform to an older more strict version of the spec or reference software
|
strictly conform to a older more strict version of the spec or reference software
|
||||||
@item strict
|
@item strict
|
||||||
strictly conform to all the things in the spec no matter what consequences
|
strictly conform to all the things in the spec no matter what consequences
|
||||||
@item normal
|
@item normal
|
||||||
@@ -456,9 +456,6 @@ Possible values:
|
|||||||
@item aspect @var{rational number} (@emph{encoding,video})
|
@item aspect @var{rational number} (@emph{encoding,video})
|
||||||
Set sample aspect ratio.
|
Set sample aspect ratio.
|
||||||
|
|
||||||
@item sar @var{rational number} (@emph{encoding,video})
|
|
||||||
Set sample aspect ratio. Alias to @var{aspect}.
|
|
||||||
|
|
||||||
@item debug @var{flags} (@emph{decoding/encoding,audio,video,subtitles})
|
@item debug @var{flags} (@emph{decoding/encoding,audio,video,subtitles})
|
||||||
Print specific debug info.
|
Print specific debug info.
|
||||||
|
|
||||||
@@ -478,9 +475,6 @@ per-block quantization parameter (QP)
|
|||||||
motion vector
|
motion vector
|
||||||
@item dct_coeff
|
@item dct_coeff
|
||||||
|
|
||||||
@item green_metadata
|
|
||||||
display complexity metadata for the upcoming frame, GoP or for a given duration.
|
|
||||||
|
|
||||||
@item skip
|
@item skip
|
||||||
|
|
||||||
@item startcode
|
@item startcode
|
||||||
@@ -820,17 +814,13 @@ for codecs that support it. See also @file{doc/examples/export_mvs.c}.
|
|||||||
Deprecated, use mpegvideo private options instead.
|
Deprecated, use mpegvideo private options instead.
|
||||||
|
|
||||||
@item threads @var{integer} (@emph{decoding/encoding,video})
|
@item threads @var{integer} (@emph{decoding/encoding,video})
|
||||||
Set the number of threads to be used, in case the selected codec
|
|
||||||
implementation supports multi-threading.
|
|
||||||
|
|
||||||
Possible values:
|
Possible values:
|
||||||
@table @samp
|
@table @samp
|
||||||
@item auto, 0
|
@item auto
|
||||||
automatically select the number of threads to set
|
detect a good number of threads
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
Default value is @samp{auto}.
|
|
||||||
|
|
||||||
@item me_threshold @var{integer} (@emph{encoding,video})
|
@item me_threshold @var{integer} (@emph{encoding,video})
|
||||||
Set motion estimation threshold.
|
Set motion estimation threshold.
|
||||||
|
|
||||||
@@ -1050,44 +1040,9 @@ Possible values:
|
|||||||
@item rc_min_vbv_use @var{float} (@emph{encoding,video})
|
@item rc_min_vbv_use @var{float} (@emph{encoding,video})
|
||||||
@item ticks_per_frame @var{integer} (@emph{decoding/encoding,audio,video})
|
@item ticks_per_frame @var{integer} (@emph{decoding/encoding,audio,video})
|
||||||
@item color_primaries @var{integer} (@emph{decoding/encoding,video})
|
@item color_primaries @var{integer} (@emph{decoding/encoding,video})
|
||||||
|
|
||||||
@item color_trc @var{integer} (@emph{decoding/encoding,video})
|
@item color_trc @var{integer} (@emph{decoding/encoding,video})
|
||||||
Possible values:
|
|
||||||
@table @samp
|
|
||||||
@item bt709
|
|
||||||
BT.709
|
|
||||||
@item gamma22
|
|
||||||
BT.470 M
|
|
||||||
@item gamma28
|
|
||||||
BT.470 BG
|
|
||||||
@item linear
|
|
||||||
SMPTE 170 M
|
|
||||||
@item log
|
|
||||||
SMPTE 240 M
|
|
||||||
@item log_sqrt
|
|
||||||
Linear
|
|
||||||
@item iec61966_2_4
|
|
||||||
Log
|
|
||||||
@item bt1361
|
|
||||||
Log square root
|
|
||||||
@item iec61966_2_1
|
|
||||||
IEC 61966-2-4
|
|
||||||
@item bt2020_10bit
|
|
||||||
BT.1361
|
|
||||||
@item bt2020_12bit
|
|
||||||
IEC 61966-2-1
|
|
||||||
@item smpte2084
|
|
||||||
BT.2020 - 10 bit
|
|
||||||
@item smpte428_1
|
|
||||||
BT.2020 - 12 bit
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@item colorspace @var{integer} (@emph{decoding/encoding,video})
|
@item colorspace @var{integer} (@emph{decoding/encoding,video})
|
||||||
|
|
||||||
@item color_range @var{integer} (@emph{decoding/encoding,video})
|
@item color_range @var{integer} (@emph{decoding/encoding,video})
|
||||||
If used as input parameter, it serves as a hint to the decoder, which
|
|
||||||
color_range the input has.
|
|
||||||
|
|
||||||
@item chroma_sample_location @var{integer} (@emph{decoding/encoding,video})
|
@item chroma_sample_location @var{integer} (@emph{decoding/encoding,video})
|
||||||
|
|
||||||
@item log_level_offset @var{integer}
|
@item log_level_offset @var{integer}
|
||||||
|
|||||||
@@ -25,13 +25,6 @@ enabled decoders.
|
|||||||
A description of some of the currently available video decoders
|
A description of some of the currently available video decoders
|
||||||
follows.
|
follows.
|
||||||
|
|
||||||
@section hevc
|
|
||||||
|
|
||||||
HEVC / H.265 decoder.
|
|
||||||
|
|
||||||
Note: the @option{skip_loop_filter} option has effect only at level
|
|
||||||
@code{all}.
|
|
||||||
|
|
||||||
@section rawvideo
|
@section rawvideo
|
||||||
|
|
||||||
Raw video decoder.
|
Raw video decoder.
|
||||||
@@ -90,23 +83,6 @@ Loud sounds are fully compressed. Soft sounds are enhanced.
|
|||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@section flac
|
|
||||||
|
|
||||||
FLAC audio decoder.
|
|
||||||
|
|
||||||
This decoder aims to implement the complete FLAC specification from Xiph.
|
|
||||||
|
|
||||||
@subsection FLAC Decoder options
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
|
|
||||||
@item -use_buggy_lpc
|
|
||||||
The lavc FLAC encoder used to produce buggy streams with high lpc values
|
|
||||||
(like the default value). This option makes it possible to decode such streams
|
|
||||||
correctly by using lavc's old buggy lpc logic for decoding.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section ffwavesynth
|
@section ffwavesynth
|
||||||
|
|
||||||
Internal wave synthetizer.
|
Internal wave synthetizer.
|
||||||
@@ -195,25 +171,6 @@ without this library.
|
|||||||
@chapter Subtitles Decoders
|
@chapter Subtitles Decoders
|
||||||
@c man begin SUBTILES DECODERS
|
@c man begin SUBTILES DECODERS
|
||||||
|
|
||||||
@section dvbsub
|
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item compute_clut
|
|
||||||
@table @option
|
|
||||||
@item -1
|
|
||||||
Compute clut if no matching CLUT is in the stream.
|
|
||||||
@item 0
|
|
||||||
Never compute CLUT
|
|
||||||
@item 1
|
|
||||||
Always compute CLUT and override the one provided in the stream.
|
|
||||||
@end table
|
|
||||||
@item dvb_substream
|
|
||||||
Selects the dvb substream, or all substreams if -1 which is default.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section dvdsub
|
@section dvdsub
|
||||||
|
|
||||||
This codec decodes the bitmap subtitles used in DVDs; the same subtitles can
|
This codec decodes the bitmap subtitles used in DVDs; the same subtitles can
|
||||||
@@ -282,13 +239,7 @@ Sets the display duration of the decoded teletext pages or subtitles in
|
|||||||
miliseconds. Default value is 30000 which is 30 seconds.
|
miliseconds. Default value is 30000 which is 30 seconds.
|
||||||
@item txt_transparent
|
@item txt_transparent
|
||||||
Force transparent background of the generated teletext bitmaps. Default value
|
Force transparent background of the generated teletext bitmaps. Default value
|
||||||
is 0 which means an opaque background.
|
is 0 which means an opaque (black) background.
|
||||||
@item txt_opacity
|
|
||||||
Sets the opacity (0-255) of the teletext background. If
|
|
||||||
@option{txt_transparent} is not set, it only affects characters between a start
|
|
||||||
box and an end box, typically subtitles. Default value is 0 if
|
|
||||||
@option{txt_transparent} is set, 255 otherwise.
|
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@c man end SUBTILES DECODERS
|
@c man end SUBTILES DECODERS
|
||||||
|
|||||||
@@ -18,12 +18,6 @@ enabled demuxers.
|
|||||||
|
|
||||||
The description of some of the currently available demuxers follows.
|
The description of some of the currently available demuxers follows.
|
||||||
|
|
||||||
@section aa
|
|
||||||
|
|
||||||
Audible Format 2, 3, and 4 demuxer.
|
|
||||||
|
|
||||||
This demuxer is used to demux Audible Format 2, 3, and 4 (.aa) files.
|
|
||||||
|
|
||||||
@section applehttp
|
@section applehttp
|
||||||
|
|
||||||
Apple HTTP Live Streaming demuxer.
|
Apple HTTP Live Streaming demuxer.
|
||||||
@@ -104,7 +98,7 @@ All subsequent file-related directives apply to that file.
|
|||||||
|
|
||||||
@item @code{ffconcat version 1.0}
|
@item @code{ffconcat version 1.0}
|
||||||
Identify the script type and version. It also sets the @option{safe} option
|
Identify the script type and version. It also sets the @option{safe} option
|
||||||
to 1 if it was -1.
|
to 1 if it was to its default -1.
|
||||||
|
|
||||||
To make FFmpeg recognize the format automatically, this directive must
|
To make FFmpeg recognize the format automatically, this directive must
|
||||||
appears exactly as is (no extra space or byte-order-mark) on the very first
|
appears exactly as is (no extra space or byte-order-mark) on the very first
|
||||||
@@ -118,47 +112,6 @@ file is not available or accurate.
|
|||||||
If the duration is set for all files, then it is possible to seek in the
|
If the duration is set for all files, then it is possible to seek in the
|
||||||
whole concatenated video.
|
whole concatenated video.
|
||||||
|
|
||||||
@item @code{inpoint @var{timestamp}}
|
|
||||||
In point of the file. When the demuxer opens the file it instantly seeks to the
|
|
||||||
specified timestamp. Seeking is done so that all streams can be presented
|
|
||||||
successfully at In point.
|
|
||||||
|
|
||||||
This directive works best with intra frame codecs, because for non-intra frame
|
|
||||||
ones you will usually get extra packets before the actual In point and the
|
|
||||||
decoded content will most likely contain frames before In point too.
|
|
||||||
|
|
||||||
For each file, packets before the file In point will have timestamps less than
|
|
||||||
the calculated start timestamp of the file (negative in case of the first
|
|
||||||
file), and the duration of the files (if not specified by the @code{duration}
|
|
||||||
directive) will be reduced based on their specified In point.
|
|
||||||
|
|
||||||
Because of potential packets before the specified In point, packet timestamps
|
|
||||||
may overlap between two concatenated files.
|
|
||||||
|
|
||||||
@item @code{outpoint @var{timestamp}}
|
|
||||||
Out point of the file. When the demuxer reaches the specified decoding
|
|
||||||
timestamp in any of the streams, it handles it as an end of file condition and
|
|
||||||
skips the current and all the remaining packets from all streams.
|
|
||||||
|
|
||||||
Out point is exclusive, which means that the demuxer will not output packets
|
|
||||||
with a decoding timestamp greater or equal to Out point.
|
|
||||||
|
|
||||||
This directive works best with intra frame codecs and formats where all streams
|
|
||||||
are tightly interleaved. For non-intra frame codecs you will usually get
|
|
||||||
additional packets with presentation timestamp after Out point therefore the
|
|
||||||
decoded content will most likely contain frames after Out point too. If your
|
|
||||||
streams are not tightly interleaved you may not get all the packets from all
|
|
||||||
streams before Out point and you may only will be able to decode the earliest
|
|
||||||
stream until Out point.
|
|
||||||
|
|
||||||
The duration of the files (if not specified by the @code{duration}
|
|
||||||
directive) will be reduced based on their specified Out point.
|
|
||||||
|
|
||||||
@item @code{file_packet_metadata @var{key=value}}
|
|
||||||
Metadata of the packets of the file. The specified metadata will be set for
|
|
||||||
each file packet. You can specify this directive multiple times to add multiple
|
|
||||||
metadata entries.
|
|
||||||
|
|
||||||
@item @code{stream}
|
@item @code{stream}
|
||||||
Introduce a stream in the virtual file.
|
Introduce a stream in the virtual file.
|
||||||
All subsequent stream-related directives apply to the last introduced
|
All subsequent stream-related directives apply to the last introduced
|
||||||
@@ -192,57 +145,19 @@ component.
|
|||||||
|
|
||||||
If set to 0, any file name is accepted.
|
If set to 0, any file name is accepted.
|
||||||
|
|
||||||
The default is 1.
|
The default is -1, it is equivalent to 1 if the format was automatically
|
||||||
|
|
||||||
-1 is equivalent to 1 if the format was automatically
|
|
||||||
probed and 0 otherwise.
|
probed and 0 otherwise.
|
||||||
|
|
||||||
@item auto_convert
|
@item auto_convert
|
||||||
If set to 1, try to perform automatic conversions on packet data to make the
|
If set to 1, try to perform automatic conversions on packet data to make the
|
||||||
streams concatenable.
|
streams concatenable.
|
||||||
The default is 1.
|
|
||||||
|
|
||||||
Currently, the only conversion is adding the h264_mp4toannexb bitstream
|
Currently, the only conversion is adding the h264_mp4toannexb bitstream
|
||||||
filter to H.264 streams in MP4 format. This is necessary in particular if
|
filter to H.264 streams in MP4 format. This is necessary in particular if
|
||||||
there are resolution changes.
|
there are resolution changes.
|
||||||
|
|
||||||
@item segment_time_metadata
|
|
||||||
If set to 1, every packet will contain the @var{lavf.concat.start_time} and the
|
|
||||||
@var{lavf.concat.duration} packet metadata values which are the start_time and
|
|
||||||
the duration of the respective file segments in the concatenated output
|
|
||||||
expressed in microseconds. The duration metadata is only set if it is known
|
|
||||||
based on the concat file.
|
|
||||||
The default is 0.
|
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@subsection Examples
|
|
||||||
|
|
||||||
@itemize
|
|
||||||
@item
|
|
||||||
Use absolute filenames and include some comments:
|
|
||||||
@example
|
|
||||||
# my first filename
|
|
||||||
file /mnt/share/file-1.wav
|
|
||||||
# my second filename including whitespace
|
|
||||||
file '/mnt/share/file 2.wav'
|
|
||||||
# my third filename including whitespace plus single quote
|
|
||||||
file '/mnt/share/file 3'\''.wav'
|
|
||||||
@end example
|
|
||||||
|
|
||||||
@item
|
|
||||||
Allow for input format auto-probing, use safe filenames and set the duration of
|
|
||||||
the first file:
|
|
||||||
@example
|
|
||||||
ffconcat version 1.0
|
|
||||||
|
|
||||||
file file-1.wav
|
|
||||||
duration 20.0
|
|
||||||
|
|
||||||
file subdir/file-2.wav
|
|
||||||
@end example
|
|
||||||
@end itemize
|
|
||||||
|
|
||||||
@section flv
|
@section flv
|
||||||
|
|
||||||
Adobe Flash Video Format demuxer.
|
Adobe Flash Video Format demuxer.
|
||||||
@@ -267,6 +182,18 @@ track. Track indexes start at 0. The demuxer exports the number of tracks as
|
|||||||
|
|
||||||
For very large files, the @option{max_size} option may have to be adjusted.
|
For very large files, the @option{max_size} option may have to be adjusted.
|
||||||
|
|
||||||
|
@section libquvi
|
||||||
|
|
||||||
|
Play media from Internet services using the quvi project.
|
||||||
|
|
||||||
|
The demuxer accepts a @option{format} option to request a specific quality. It
|
||||||
|
is by default set to @var{best}.
|
||||||
|
|
||||||
|
See @url{http://quvi.sourceforge.net/} for more information.
|
||||||
|
|
||||||
|
FFmpeg needs to be built with @code{--enable-libquvi} for this demuxer to be
|
||||||
|
enabled.
|
||||||
|
|
||||||
@section gif
|
@section gif
|
||||||
|
|
||||||
Animated GIF demuxer.
|
Animated GIF demuxer.
|
||||||
@@ -278,11 +205,6 @@ It accepts the following options:
|
|||||||
Set the minimum valid delay between frames in hundredths of seconds.
|
Set the minimum valid delay between frames in hundredths of seconds.
|
||||||
Range is 0 to 6000. Default value is 2.
|
Range is 0 to 6000. Default value is 2.
|
||||||
|
|
||||||
@item max_gif_delay
|
|
||||||
Set the maximum valid delay between frames in hundredth of seconds.
|
|
||||||
Range is 0 to 65535. Default value is 65535 (nearly eleven minutes),
|
|
||||||
the maximum value allowed by the specification.
|
|
||||||
|
|
||||||
@item default_delay
|
@item default_delay
|
||||||
Set the default delay between frames in hundredths of seconds.
|
Set the default delay between frames in hundredths of seconds.
|
||||||
Range is 0 to 6000. Default value is 10.
|
Range is 0 to 6000. Default value is 10.
|
||||||
@@ -331,10 +253,6 @@ Select the pattern type used to interpret the provided filename.
|
|||||||
|
|
||||||
@var{pattern_type} accepts one of the following values.
|
@var{pattern_type} accepts one of the following values.
|
||||||
@table @option
|
@table @option
|
||||||
@item none
|
|
||||||
Disable pattern matching, therefore the video will only contain the specified
|
|
||||||
image. You should use this option if you do not want to create sequences from
|
|
||||||
multiple images and your filenames may contain special pattern characters.
|
|
||||||
@item sequence
|
@item sequence
|
||||||
Select a sequence pattern type, used to specify a sequence of files
|
Select a sequence pattern type, used to specify a sequence of files
|
||||||
indexed by sequential numbers.
|
indexed by sequential numbers.
|
||||||
@@ -441,62 +359,17 @@ ffmpeg -framerate 10 -pattern_type glob -i "*.png" out.mkv
|
|||||||
@end example
|
@end example
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
@section mov/mp4/3gp/QuickTime
|
|
||||||
|
|
||||||
QuickTime / MP4 demuxer.
|
|
||||||
|
|
||||||
This demuxer accepts the following options:
|
|
||||||
@table @option
|
|
||||||
@item enable_drefs
|
|
||||||
Enable loading of external tracks, disabled by default.
|
|
||||||
Enabling this can theoretically leak information in some use cases.
|
|
||||||
|
|
||||||
@item use_absolute_path
|
|
||||||
Allows loading of external tracks via absolute paths, disabled by default.
|
|
||||||
Enabling this poses a security risk. It should only be enabled if the source
|
|
||||||
is known to be non malicious.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section mpegts
|
@section mpegts
|
||||||
|
|
||||||
MPEG-2 transport stream demuxer.
|
MPEG-2 transport stream demuxer.
|
||||||
|
|
||||||
This demuxer accepts the following options:
|
|
||||||
@table @option
|
@table @option
|
||||||
@item resync_size
|
|
||||||
Set size limit for looking up a new synchronization. Default value is
|
|
||||||
65536.
|
|
||||||
|
|
||||||
@item fix_teletext_pts
|
@item fix_teletext_pts
|
||||||
Override teletext packet PTS and DTS values with the timestamps calculated
|
Overrides teletext packet PTS and DTS values with the timestamps calculated
|
||||||
from the PCR of the first program which the teletext stream is part of and is
|
from the PCR of the first program which the teletext stream is part of and is
|
||||||
not discarded. Default value is 1, set this option to 0 if you want your
|
not discarded. Default value is 1, set this option to 0 if you want your
|
||||||
teletext packet PTS and DTS values untouched.
|
teletext packet PTS and DTS values untouched.
|
||||||
|
|
||||||
@item ts_packetsize
|
|
||||||
Output option carrying the raw packet size in bytes.
|
|
||||||
Show the detected raw packet size, cannot be set by the user.
|
|
||||||
|
|
||||||
@item scan_all_pmts
|
|
||||||
Scan and combine all PMTs. The value is an integer with value from -1
|
|
||||||
to 1 (-1 means automatic setting, 1 means enabled, 0 means
|
|
||||||
disabled). Default value is -1.
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section mpjpeg
|
|
||||||
|
|
||||||
MJPEG encapsulated in multi-part MIME demuxer.
|
|
||||||
|
|
||||||
This demuxer allows reading of MJPEG, where each frame is represented as a part of
|
|
||||||
multipart/x-mixed-replace stream.
|
|
||||||
@table @option
|
|
||||||
|
|
||||||
@item strict_mime_boundary
|
|
||||||
Default implementation applies a relaxed standard to multi-part MIME boundary detection,
|
|
||||||
to prevent regression with numerous existing endpoints not generating a proper MIME
|
|
||||||
MJPEG stream. Turning this option on by setting it to 1 will result in a stricter check
|
|
||||||
of the boundary value.
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@section rawvideo
|
@section rawvideo
|
||||||
|
|||||||
@@ -28,14 +28,14 @@ this document.
|
|||||||
|
|
||||||
For more detailed legal information about the use of FFmpeg in
|
For more detailed legal information about the use of FFmpeg in
|
||||||
external programs read the @file{LICENSE} file in the source tree and
|
external programs read the @file{LICENSE} file in the source tree and
|
||||||
consult @url{https://ffmpeg.org/legal.html}.
|
consult @url{http://ffmpeg.org/legal.html}.
|
||||||
|
|
||||||
@section Contributing
|
@section Contributing
|
||||||
|
|
||||||
There are 3 ways by which code gets into FFmpeg.
|
There are 3 ways by which code gets into ffmpeg.
|
||||||
@itemize @bullet
|
@itemize @bullet
|
||||||
@item Submitting patches to the main developer mailing list.
|
@item Submitting Patches to the main developer mailing list
|
||||||
See @ref{Submitting patches} for details.
|
see @ref{Submitting patches} for details.
|
||||||
@item Directly committing changes to the main tree.
|
@item Directly committing changes to the main tree.
|
||||||
@item Committing changes to a git clone, for example on github.com or
|
@item Committing changes to a git clone, for example on github.com or
|
||||||
gitorious.org. And asking us to merge these changes.
|
gitorious.org. And asking us to merge these changes.
|
||||||
@@ -65,9 +65,6 @@ rejected by the git repository.
|
|||||||
@item
|
@item
|
||||||
You should try to limit your code lines to 80 characters; however, do so if
|
You should try to limit your code lines to 80 characters; however, do so if
|
||||||
and only if this improves readability.
|
and only if this improves readability.
|
||||||
|
|
||||||
@item
|
|
||||||
K&R coding style is used.
|
|
||||||
@end itemize
|
@end itemize
|
||||||
The presentation is one inspired by 'indent -i4 -kr -nut'.
|
The presentation is one inspired by 'indent -i4 -kr -nut'.
|
||||||
|
|
||||||
@@ -127,10 +124,10 @@ the @samp{inline} keyword;
|
|||||||
@samp{//} comments;
|
@samp{//} comments;
|
||||||
|
|
||||||
@item
|
@item
|
||||||
designated struct initializers (@samp{struct s x = @{ .i = 17 @};});
|
designated struct initializers (@samp{struct s x = @{ .i = 17 @};})
|
||||||
|
|
||||||
@item
|
@item
|
||||||
compound literals (@samp{x = (struct s) @{ 17, 23 @};}).
|
compound literals (@samp{x = (struct s) @{ 17, 23 @};})
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
These features are supported by all compilers we care about, so we will not
|
These features are supported by all compilers we care about, so we will not
|
||||||
@@ -159,7 +156,7 @@ GCC statement expressions (@samp{(x = (@{ int y = 4; y; @})}).
|
|||||||
All names should be composed with underscores (_), not CamelCase. For example,
|
All names should be composed with underscores (_), not CamelCase. For example,
|
||||||
@samp{avfilter_get_video_buffer} is an acceptable function name and
|
@samp{avfilter_get_video_buffer} is an acceptable function name and
|
||||||
@samp{AVFilterGetVideo} is not. The exception from this are type names, like
|
@samp{AVFilterGetVideo} is not. The exception from this are type names, like
|
||||||
for example structs and enums; they should always be in CamelCase.
|
for example structs and enums; they should always be in the CamelCase
|
||||||
|
|
||||||
There are the following conventions for naming variables and functions:
|
There are the following conventions for naming variables and functions:
|
||||||
|
|
||||||
@@ -231,7 +228,7 @@ autocmd InsertEnter * match ForbiddenWhitespace /\t\|\s\+\%#\@@<!$/
|
|||||||
@end example
|
@end example
|
||||||
|
|
||||||
For Emacs, add these roughly equivalent lines to your @file{.emacs.d/init.el}:
|
For Emacs, add these roughly equivalent lines to your @file{.emacs.d/init.el}:
|
||||||
@lisp
|
@example
|
||||||
(c-add-style "ffmpeg"
|
(c-add-style "ffmpeg"
|
||||||
'("k&r"
|
'("k&r"
|
||||||
(c-basic-offset . 4)
|
(c-basic-offset . 4)
|
||||||
@@ -242,7 +239,7 @@ For Emacs, add these roughly equivalent lines to your @file{.emacs.d/init.el}:
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
(setq c-default-style "ffmpeg")
|
(setq c-default-style "ffmpeg")
|
||||||
@end lisp
|
@end example
|
||||||
|
|
||||||
@section Development Policy
|
@section Development Policy
|
||||||
|
|
||||||
@@ -397,41 +394,12 @@ or obfuscates the code.
|
|||||||
Make sure that no parts of the codebase that you maintain are missing from the
|
Make sure that no parts of the codebase that you maintain are missing from the
|
||||||
@file{MAINTAINERS} file. If something that you want to maintain is missing add it with
|
@file{MAINTAINERS} file. If something that you want to maintain is missing add it with
|
||||||
your name after it.
|
your name after it.
|
||||||
If at some point you no longer want to maintain some code, then please help in
|
If at some point you no longer want to maintain some code, then please help
|
||||||
finding a new maintainer and also don't forget to update the @file{MAINTAINERS} file.
|
finding a new maintainer and also don't forget updating the @file{MAINTAINERS} file.
|
||||||
@end enumerate
|
@end enumerate
|
||||||
|
|
||||||
We think our rules are not too hard. If you have comments, contact us.
|
We think our rules are not too hard. If you have comments, contact us.
|
||||||
|
|
||||||
@section Code of conduct
|
|
||||||
|
|
||||||
Be friendly and respectful towards others and third parties.
|
|
||||||
Treat others the way you yourself want to be treated.
|
|
||||||
|
|
||||||
Be considerate. Not everyone shares the same viewpoint and priorities as you do.
|
|
||||||
Different opinions and interpretations help the project.
|
|
||||||
Looking at issues from a different perspective assists development.
|
|
||||||
|
|
||||||
Do not assume malice for things that can be attributed to incompetence. Even if
|
|
||||||
it is malice, it's rarely good to start with that as initial assumption.
|
|
||||||
|
|
||||||
Stay friendly even if someone acts contrarily. Everyone has a bad day
|
|
||||||
once in a while.
|
|
||||||
If you yourself have a bad day or are angry then try to take a break and reply
|
|
||||||
once you are calm and without anger if you have to.
|
|
||||||
|
|
||||||
Try to help other team members and cooperate if you can.
|
|
||||||
|
|
||||||
The goal of software development is to create technical excellence, not for any
|
|
||||||
individual to be better and "win" against the others. Large software projects
|
|
||||||
are only possible and successful through teamwork.
|
|
||||||
|
|
||||||
If someone struggles do not put them down. Give them a helping hand
|
|
||||||
instead and point them in the right direction.
|
|
||||||
|
|
||||||
Finally, keep in mind the immortal words of Bill and Ted,
|
|
||||||
"Be excellent to each other."
|
|
||||||
|
|
||||||
@anchor{Submitting patches}
|
@anchor{Submitting patches}
|
||||||
@section Submitting patches
|
@section Submitting patches
|
||||||
|
|
||||||
@@ -439,7 +407,7 @@ First, read the @ref{Coding Rules} above if you did not yet, in particular
|
|||||||
the rules regarding patch submission.
|
the rules regarding patch submission.
|
||||||
|
|
||||||
When you submit your patch, please use @code{git format-patch} or
|
When you submit your patch, please use @code{git format-patch} or
|
||||||
@code{git send-email}. We cannot read other diffs :-).
|
@code{git send-email}. We cannot read other diffs :-)
|
||||||
|
|
||||||
Also please do not submit a patch which contains several unrelated changes.
|
Also please do not submit a patch which contains several unrelated changes.
|
||||||
Split it into separate, self-contained pieces. This does not mean splitting
|
Split it into separate, self-contained pieces. This does not mean splitting
|
||||||
@@ -462,7 +430,7 @@ Also please if you send several patches, send each patch as a separate mail,
|
|||||||
do not attach several unrelated patches to the same mail.
|
do not attach several unrelated patches to the same mail.
|
||||||
|
|
||||||
Patches should be posted to the
|
Patches should be posted to the
|
||||||
@uref{https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel, ffmpeg-devel}
|
@uref{http://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel, ffmpeg-devel}
|
||||||
mailing list. Use @code{git send-email} when possible since it will properly
|
mailing list. Use @code{git send-email} when possible since it will properly
|
||||||
send patches without requiring extra care. If you cannot, then send patches
|
send patches without requiring extra care. If you cannot, then send patches
|
||||||
as base64-encoded attachments, so your patch is not trashed during
|
as base64-encoded attachments, so your patch is not trashed during
|
||||||
@@ -575,10 +543,6 @@ tools/trasher, the noise bitstream filter, and
|
|||||||
should not crash, end in a (near) infinite loop, or allocate ridiculous
|
should not crash, end in a (near) infinite loop, or allocate ridiculous
|
||||||
amounts of memory when fed damaged data.
|
amounts of memory when fed damaged data.
|
||||||
|
|
||||||
@item
|
|
||||||
Did you test your decoder or demuxer against sample files?
|
|
||||||
Samples may be obtained at @url{https://samples.ffmpeg.org}.
|
|
||||||
|
|
||||||
@item
|
@item
|
||||||
Does the patch not mix functional and cosmetic changes?
|
Does the patch not mix functional and cosmetic changes?
|
||||||
|
|
||||||
@@ -599,7 +563,7 @@ If the patch fixes a bug, did you provide a verbose analysis of the bug?
|
|||||||
If the patch fixes a bug, did you provide enough information, including
|
If the patch fixes a bug, did you provide enough information, including
|
||||||
a sample, so the bug can be reproduced and the fix can be verified?
|
a sample, so the bug can be reproduced and the fix can be verified?
|
||||||
Note please do not attach samples >100k to mails but rather provide a
|
Note please do not attach samples >100k to mails but rather provide a
|
||||||
URL, you can upload to ftp://upload.ffmpeg.org.
|
URL, you can upload to ftp://upload.ffmpeg.org
|
||||||
|
|
||||||
@item
|
@item
|
||||||
Did you provide a verbose summary about what the patch does change?
|
Did you provide a verbose summary about what the patch does change?
|
||||||
@@ -628,10 +592,10 @@ Lines with similar content should be aligned vertically when doing so
|
|||||||
improves readability.
|
improves readability.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
Consider adding a regression test for your code.
|
Consider to add a regression test for your code.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
If you added YASM code please check that things still work with --disable-yasm.
|
If you added YASM code please check that things still work with --disable-yasm
|
||||||
|
|
||||||
@item
|
@item
|
||||||
Make sure you check the return values of function and return appropriate
|
Make sure you check the return values of function and return appropriate
|
||||||
@@ -669,10 +633,6 @@ not related to the comments received during review. Such patches will
|
|||||||
be rejected. Instead, submit significant changes or new features as
|
be rejected. Instead, submit significant changes or new features as
|
||||||
separate patches.
|
separate patches.
|
||||||
|
|
||||||
Everyone is welcome to review patches. Also if you are waiting for your patch
|
|
||||||
to be reviewed, please consider helping to review other patches, that is a great
|
|
||||||
way to get everyone's patches reviewed sooner.
|
|
||||||
|
|
||||||
@anchor{Regression tests}
|
@anchor{Regression tests}
|
||||||
@section Regression tests
|
@section Regression tests
|
||||||
|
|
||||||
@@ -696,6 +656,7 @@ Once you have a working fate test and fate sample, provide in the commit
|
|||||||
message or introductory message for the patch series that you post to
|
message or introductory message for the patch series that you post to
|
||||||
the ffmpeg-devel mailing list, a direct link to download the sample media.
|
the ffmpeg-devel mailing list, a direct link to download the sample media.
|
||||||
|
|
||||||
|
|
||||||
@subsection Visualizing Test Coverage
|
@subsection Visualizing Test Coverage
|
||||||
|
|
||||||
The FFmpeg build system allows visualizing the test coverage in an easy
|
The FFmpeg build system allows visualizing the test coverage in an easy
|
||||||
@@ -743,7 +704,7 @@ FFmpeg maintains a set of @strong{release branches}, which are the
|
|||||||
recommended deliverable for system integrators and distributors (such as
|
recommended deliverable for system integrators and distributors (such as
|
||||||
Linux distributions, etc.). At regular times, a @strong{release
|
Linux distributions, etc.). At regular times, a @strong{release
|
||||||
manager} prepares, tests and publishes tarballs on the
|
manager} prepares, tests and publishes tarballs on the
|
||||||
@url{https://ffmpeg.org} website.
|
@url{http://ffmpeg.org} website.
|
||||||
|
|
||||||
There are two kinds of releases:
|
There are two kinds of releases:
|
||||||
|
|
||||||
@@ -822,7 +783,7 @@ Prepare the release tarballs in @code{bz2} and @code{gz} formats, and
|
|||||||
supplementing files that contain @code{gpg} signatures
|
supplementing files that contain @code{gpg} signatures
|
||||||
|
|
||||||
@item
|
@item
|
||||||
Publish the tarballs at @url{https://ffmpeg.org/releases}. Create and
|
Publish the tarballs at @url{http://ffmpeg.org/releases}. Create and
|
||||||
push an annotated tag in the form @code{nX}, with @code{X}
|
push an annotated tag in the form @code{nX}, with @code{X}
|
||||||
containing the version number.
|
containing the version number.
|
||||||
|
|
||||||
@@ -834,7 +795,7 @@ with a news entry for the website.
|
|||||||
Publish the news entry.
|
Publish the news entry.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
Send an announcement to the mailing list.
|
Send announcement to the mailing list.
|
||||||
@end enumerate
|
@end enumerate
|
||||||
|
|
||||||
@bye
|
@bye
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
OUT_DIR="${1}"
|
SRC_PATH="${1}"
|
||||||
DOXYFILE="${2}"
|
DOXYFILE="${2}"
|
||||||
DOXYGEN="${3}"
|
DOXYGEN="${3}"
|
||||||
|
|
||||||
shift 3
|
shift 3
|
||||||
|
|
||||||
if [ -e "VERSION" ]; then
|
if [ -e "$SRC_PATH/VERSION" ]; then
|
||||||
VERSION=`cat "VERSION"`
|
VERSION=`cat "$SRC_PATH/VERSION"`
|
||||||
else
|
else
|
||||||
VERSION=`git describe`
|
VERSION=`cd "$SRC_PATH"; git describe`
|
||||||
fi
|
fi
|
||||||
|
|
||||||
$DOXYGEN - <<EOF
|
$DOXYGEN - <<EOF
|
||||||
@INCLUDE = ${DOXYFILE}
|
@INCLUDE = ${DOXYFILE}
|
||||||
INPUT = $@
|
INPUT = $@
|
||||||
|
EXAMPLE_PATH = ${SRC_PATH}/doc/examples
|
||||||
HTML_TIMESTAMP = NO
|
HTML_TIMESTAMP = NO
|
||||||
PROJECT_NUMBER = $VERSION
|
PROJECT_NUMBER = $VERSION
|
||||||
OUTPUT_DIRECTORY = $OUT_DIR
|
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
1
doc/doxy/.gitignore
vendored
1
doc/doxy/.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
/html/
|
|
||||||
@@ -30,119 +30,81 @@ follows.
|
|||||||
|
|
||||||
Advanced Audio Coding (AAC) encoder.
|
Advanced Audio Coding (AAC) encoder.
|
||||||
|
|
||||||
This encoder is the default AAC encoder, natively implemented into FFmpeg. Its
|
This encoder is an experimental FFmpeg-native AAC encoder. Currently only the
|
||||||
quality is on par or better than libfdk_aac at the default bitrate of 128kbps.
|
low complexity (AAC-LC) profile is supported. To use this encoder, you must set
|
||||||
This encoder also implements more options, profiles and samplerates than
|
@option{strict} option to @samp{experimental} or lower.
|
||||||
other encoders (with only the AAC-HE profile pending to be implemented) so this
|
|
||||||
encoder has become the default and is the recommended choice.
|
As this encoder is experimental, unexpected behavior may exist from time to
|
||||||
|
time. For a more stable AAC encoder, see @ref{libvo-aacenc}. However, be warned
|
||||||
|
that it has a worse quality reported by some users.
|
||||||
|
|
||||||
|
@c todo @ref{libaacplus}
|
||||||
|
See also @ref{libfdk-aac-enc,,libfdk_aac} and @ref{libfaac}.
|
||||||
|
|
||||||
@subsection Options
|
@subsection Options
|
||||||
|
|
||||||
@table @option
|
@table @option
|
||||||
@item b
|
@item b
|
||||||
Set bit rate in bits/s. Setting this automatically activates constant bit rate
|
Set bit rate in bits/s. Setting this automatically activates constant bit rate
|
||||||
(CBR) mode. If this option is unspecified it is set to 128kbps.
|
(CBR) mode.
|
||||||
|
|
||||||
@item q
|
@item q
|
||||||
Set quality for variable bit rate (VBR) mode. This option is valid only using
|
Set quality for variable bit rate (VBR) mode. This option is valid only using
|
||||||
the @command{ffmpeg} command-line tool. For library interface users, use
|
the @command{ffmpeg} command-line tool. For library interface users, use
|
||||||
@option{global_quality}.
|
@option{global_quality}.
|
||||||
|
|
||||||
@item cutoff
|
@item stereo_mode
|
||||||
Set cutoff frequency. If unspecified will allow the encoder to dynamically
|
Set stereo encoding mode. Possible values:
|
||||||
adjust the cutoff to improve clarity on low bitrates.
|
|
||||||
|
@table @samp
|
||||||
|
@item auto
|
||||||
|
Automatically selected by the encoder.
|
||||||
|
|
||||||
|
@item ms_off
|
||||||
|
Disable middle/side encoding. This is the default.
|
||||||
|
|
||||||
|
@item ms_force
|
||||||
|
Force middle/side encoding.
|
||||||
|
@end table
|
||||||
|
|
||||||
@item aac_coder
|
@item aac_coder
|
||||||
Set AAC encoder coding method. Possible values:
|
Set AAC encoder coding method. Possible values:
|
||||||
|
|
||||||
@table @samp
|
@table @samp
|
||||||
|
@item faac
|
||||||
|
FAAC-inspired method.
|
||||||
|
|
||||||
|
This method is a simplified reimplementation of the method used in FAAC, which
|
||||||
|
sets thresholds proportional to the band energies, and then decreases all the
|
||||||
|
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.
|
||||||
|
|
||||||
|
@item anmr
|
||||||
|
Average noise to mask ratio (ANMR) trellis-based solution.
|
||||||
|
|
||||||
|
This has a theoretic best quality out of all the coding methods, but at the
|
||||||
|
cost of the slowest speed.
|
||||||
|
|
||||||
@item twoloop
|
@item twoloop
|
||||||
Two loop searching (TLS) method.
|
Two loop searching (TLS) method.
|
||||||
|
|
||||||
This method first sets quantizers depending on band thresholds and then tries
|
This method first sets quantizers depending on band thresholds and then tries
|
||||||
to find an optimal combination by adding or subtracting a specific value from
|
to find an optimal combination by adding or subtracting a specific value from
|
||||||
all quantizers and adjusting some individual quantizer a little.
|
all quantizers and adjusting some individual quantizer a little.
|
||||||
Will tune itself based on whether aac_is/aac_ms/aac_pns are enabled.
|
|
||||||
This is the default choice for a coder.
|
|
||||||
|
|
||||||
@item anmr
|
This method produces similar quality with the FAAC method and is the default.
|
||||||
Average noise to mask ratio (ANMR) trellis-based solution.
|
|
||||||
|
|
||||||
This is an experimental coder which currently produces a lower quality, is more
|
|
||||||
unstable and is slower than the default twoloop coder but has potential.
|
|
||||||
Currently has no support for the @option{aac_is} or @option{aac_pns} options.
|
|
||||||
Not currently recommended.
|
|
||||||
|
|
||||||
@item fast
|
@item fast
|
||||||
Constant quantizer method.
|
Constant quantizer method.
|
||||||
|
|
||||||
This method sets a constant quantizer for all bands. This is the fastest of all
|
This method sets a constant quantizer for all bands. This is the fastest of all
|
||||||
the methods and has no rate control or support for @option{aac_is} or
|
the methods, yet produces the worst quality.
|
||||||
@option{aac_pns}.
|
|
||||||
Not recommended.
|
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item aac_ms
|
|
||||||
Sets mid/side coding mode. The default value of auto will automatically use
|
|
||||||
M/S with bands which will benefit from such coding. Can be forced for all bands
|
|
||||||
using the value "enable", which is mainly useful for debugging or disabled using
|
|
||||||
"disable".
|
|
||||||
|
|
||||||
@item aac_is
|
|
||||||
Sets intensity stereo coding tool usage. By default, it's enabled and will
|
|
||||||
automatically toggle IS for similar pairs of stereo bands if it's benefitial.
|
|
||||||
Can be disabled for debugging by setting the value to "disable".
|
|
||||||
|
|
||||||
@item aac_pns
|
|
||||||
Uses perceptual noise substitution to replace low entropy high frequency bands
|
|
||||||
with imperceivable white noise during the decoding process. By default, it's
|
|
||||||
enabled, but can be disabled for debugging purposes by using "disable".
|
|
||||||
|
|
||||||
@item aac_tns
|
|
||||||
Enables the use of a multitap FIR filter which spans through the high frequency
|
|
||||||
bands to hide quantization noise during the encoding process and is reverted
|
|
||||||
by the decoder. As well as decreasing unpleasant artifacts in the high range
|
|
||||||
this also reduces the entropy in the high bands and allows for more bits to
|
|
||||||
be used by the mid-low bands. By default it's enabled but can be disabled for
|
|
||||||
debugging by setting the option to "disable".
|
|
||||||
|
|
||||||
@item aac_ltp
|
|
||||||
Enables the use of the long term prediction extension which increases coding
|
|
||||||
efficiency in very low bandwidth situations such as encoding of voice or
|
|
||||||
solo piano music by extending constant harmonic peaks in bands throughout
|
|
||||||
frames. This option is implied by profile:a aac_low and is incompatible with
|
|
||||||
aac_pred. Use in conjunction with @option{-ar} to decrease the samplerate.
|
|
||||||
|
|
||||||
@item aac_pred
|
|
||||||
Enables the use of a more traditional style of prediction where the spectral
|
|
||||||
coefficients transmitted are replaced by the difference of the current
|
|
||||||
coefficients minus the previous "predicted" coefficients. In theory and sometimes
|
|
||||||
in practice this can improve quality for low to mid bitrate audio.
|
|
||||||
This option implies the aac_main profile and is incompatible with aac_ltp.
|
|
||||||
|
|
||||||
@item profile
|
|
||||||
Sets the encoding profile, possible values:
|
|
||||||
|
|
||||||
@table @samp
|
|
||||||
@item aac_low
|
|
||||||
The default, AAC "Low-complexity" profile. Is the most compatible and produces
|
|
||||||
decent quality.
|
|
||||||
|
|
||||||
@item mpeg2_aac_low
|
|
||||||
Equivalent to -profile:a aac_low -aac_pns 0. PNS was introduced with the MPEG4
|
|
||||||
specifications.
|
|
||||||
|
|
||||||
@item aac_ltp
|
|
||||||
Long term prediction profile, is enabled by and will enable the aac_ltp option.
|
|
||||||
Introduced in MPEG4.
|
|
||||||
|
|
||||||
@item aac_main
|
|
||||||
Main-type prediction profile, is enabled by and will enable the aac_pred option.
|
|
||||||
Introduced in MPEG2.
|
|
||||||
|
|
||||||
If this option is unspecified it is set to @samp{aac_low}.
|
|
||||||
@end table
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@section ac3 and ac3_fixed
|
@section ac3 and ac3_fixed
|
||||||
@@ -532,98 +494,21 @@ Selected by Encoder (default)
|
|||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@anchor{flac}
|
|
||||||
@section flac
|
|
||||||
|
|
||||||
FLAC (Free Lossless Audio Codec) Encoder
|
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
The following options are supported by FFmpeg's flac encoder.
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item compression_level
|
|
||||||
Sets the compression level, which chooses defaults for many other options
|
|
||||||
if they are not set explicitly.
|
|
||||||
|
|
||||||
@item frame_size
|
|
||||||
Sets the size of the frames in samples per channel.
|
|
||||||
|
|
||||||
@item lpc_coeff_precision
|
|
||||||
Sets the LPC coefficient precision, valid values are from 1 to 15, 15 is the
|
|
||||||
default.
|
|
||||||
|
|
||||||
@item lpc_type
|
|
||||||
Sets the first stage LPC algorithm
|
|
||||||
@table @samp
|
|
||||||
@item none
|
|
||||||
LPC is not used
|
|
||||||
|
|
||||||
@item fixed
|
|
||||||
fixed LPC coefficients
|
|
||||||
|
|
||||||
@item levinson
|
|
||||||
|
|
||||||
@item cholesky
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@item lpc_passes
|
|
||||||
Number of passes to use for Cholesky factorization during LPC analysis
|
|
||||||
|
|
||||||
@item min_partition_order
|
|
||||||
The minimum partition order
|
|
||||||
|
|
||||||
@item max_partition_order
|
|
||||||
The maximum partition order
|
|
||||||
|
|
||||||
@item prediction_order_method
|
|
||||||
@table @samp
|
|
||||||
@item estimation
|
|
||||||
@item 2level
|
|
||||||
@item 4level
|
|
||||||
@item 8level
|
|
||||||
@item search
|
|
||||||
Bruteforce search
|
|
||||||
@item log
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@item ch_mode
|
|
||||||
Channel mode
|
|
||||||
@table @samp
|
|
||||||
@item auto
|
|
||||||
The mode is chosen automatically for each frame
|
|
||||||
@item indep
|
|
||||||
Chanels are independently coded
|
|
||||||
@item left_side
|
|
||||||
@item right_side
|
|
||||||
@item mid_side
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@item exact_rice_parameters
|
|
||||||
Chooses if rice parameters are calculated exactly or approximately.
|
|
||||||
if set to 1 then they are chosen exactly, which slows the code down slightly and
|
|
||||||
improves compression slightly.
|
|
||||||
|
|
||||||
@item multi_dim_quant
|
|
||||||
Multi Dimensional Quantization. If set to 1 then a 2nd stage LPC algorithm is
|
|
||||||
applied after the first stage to finetune the coefficients. This is quite slow
|
|
||||||
and slightly improves compression.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@anchor{libfaac}
|
@anchor{libfaac}
|
||||||
@section libfaac
|
@section libfaac
|
||||||
|
|
||||||
libfaac AAC (Advanced Audio Coding) encoder wrapper.
|
libfaac AAC (Advanced Audio Coding) encoder wrapper.
|
||||||
|
|
||||||
This encoder is of much lower quality and is more unstable than any other AAC
|
Requires the presence of the libfaac headers and library during
|
||||||
encoders, so it's highly recommended to instead use other encoders, like
|
configuration. You need to explicitly configure the build with
|
||||||
@ref{aacenc,,the native FFmpeg AAC encoder}.
|
|
||||||
|
|
||||||
This encoder also requires the presence of the libfaac headers and library
|
|
||||||
during configuration. You need to explicitly configure the build with
|
|
||||||
@code{--enable-libfaac --enable-nonfree}.
|
@code{--enable-libfaac --enable-nonfree}.
|
||||||
|
|
||||||
|
This encoder is considered to be of higher quality with respect to the
|
||||||
|
@ref{aacenc,,the native experimental FFmpeg AAC encoder}.
|
||||||
|
|
||||||
|
For more information see the libfaac project at
|
||||||
|
@url{http://www.audiocoding.com/faac.html/}.
|
||||||
|
|
||||||
@subsection Options
|
@subsection Options
|
||||||
|
|
||||||
The following shared FFmpeg codec options are recognized.
|
The following shared FFmpeg codec options are recognized.
|
||||||
@@ -730,10 +615,9 @@ configuration. You need to explicitly configure the build with
|
|||||||
so if you allow the use of GPL, you should configure with
|
so if you allow the use of GPL, you should configure with
|
||||||
@code{--enable-gpl --enable-nonfree --enable-libfdk-aac}.
|
@code{--enable-gpl --enable-nonfree --enable-libfdk-aac}.
|
||||||
|
|
||||||
This encoder is considered to produce output on par or worse at 128kbps to the
|
This encoder is considered to be of higher quality with respect to
|
||||||
@ref{aacenc,,the native FFmpeg AAC encoder} but can often produce better
|
both @ref{aacenc,,the native experimental FFmpeg AAC encoder} and
|
||||||
sounding audio at identical or lower bitrates and has support for the
|
@ref{libfaac}.
|
||||||
AAC-HE profiles.
|
|
||||||
|
|
||||||
VBR encoding, enabled through the @option{vbr} or @option{flags
|
VBR encoding, enabled through the @option{vbr} or @option{flags
|
||||||
+qscale} options, is experimental and only works with some
|
+qscale} options, is experimental and only works with some
|
||||||
@@ -1075,6 +959,31 @@ Set MPEG audio original flag when set to 1. The default value is 0
|
|||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
@anchor{libvo-aacenc}
|
||||||
|
@section libvo-aacenc
|
||||||
|
|
||||||
|
VisualOn AAC encoder.
|
||||||
|
|
||||||
|
Requires the presence of the libvo-aacenc headers and library during
|
||||||
|
configuration. You need to explicitly configure the build with
|
||||||
|
@code{--enable-libvo-aacenc --enable-version3}.
|
||||||
|
|
||||||
|
This encoder is considered to be worse than the
|
||||||
|
@ref{aacenc,,native experimental FFmpeg AAC encoder}, according to
|
||||||
|
multiple sources.
|
||||||
|
|
||||||
|
@subsection Options
|
||||||
|
|
||||||
|
The VisualOn AAC encoder only support encoding AAC-LC and up to 2
|
||||||
|
channels. It is also CBR-only.
|
||||||
|
|
||||||
|
@table @option
|
||||||
|
|
||||||
|
@item b
|
||||||
|
Set bit rate in bits/s.
|
||||||
|
|
||||||
|
@end table
|
||||||
|
|
||||||
@section libvo-amrwbenc
|
@section libvo-amrwbenc
|
||||||
|
|
||||||
VisualOn Adaptive Multi-Rate Wideband encoder.
|
VisualOn Adaptive Multi-Rate Wideband encoder.
|
||||||
@@ -1137,7 +1046,7 @@ kilobits/s.
|
|||||||
|
|
||||||
@item vbr (@emph{vbr}, @emph{hard-cbr}, and @emph{cvbr})
|
@item vbr (@emph{vbr}, @emph{hard-cbr}, and @emph{cvbr})
|
||||||
Set VBR mode. The FFmpeg @option{vbr} option has the following
|
Set VBR mode. The FFmpeg @option{vbr} option has the following
|
||||||
valid arguments, with the @command{opusenc} equivalent options
|
valid arguments, with the their @command{opusenc} equivalent options
|
||||||
in parentheses:
|
in parentheses:
|
||||||
|
|
||||||
@table @samp
|
@table @samp
|
||||||
@@ -1354,96 +1263,6 @@ disabled
|
|||||||
A description of some of the currently available video encoders
|
A description of some of the currently available video encoders
|
||||||
follows.
|
follows.
|
||||||
|
|
||||||
@section libopenh264
|
|
||||||
|
|
||||||
Cisco libopenh264 H.264/MPEG-4 AVC encoder wrapper.
|
|
||||||
|
|
||||||
This encoder requires the presence of the libopenh264 headers and
|
|
||||||
library during configuration. You need to explicitly configure the
|
|
||||||
build with @code{--enable-libopenh264}. The library is detected using
|
|
||||||
@command{pkg-config}.
|
|
||||||
|
|
||||||
For more information about the library see
|
|
||||||
@url{http://www.openh264.org}.
|
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
The following FFmpeg global options affect the configurations of the
|
|
||||||
libopenh264 encoder.
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item b
|
|
||||||
Set the bitrate (as a number of bits per second).
|
|
||||||
|
|
||||||
@item g
|
|
||||||
Set the GOP size.
|
|
||||||
|
|
||||||
@item maxrate
|
|
||||||
Set the max bitrate (as a number of bits per second).
|
|
||||||
|
|
||||||
@item flags +global_header
|
|
||||||
Set global header in the bitstream.
|
|
||||||
|
|
||||||
@item slices
|
|
||||||
Set the number of slices, used in parallelized encoding. Default value
|
|
||||||
is 0. This is only used when @option{slice_mode} is set to
|
|
||||||
@samp{fixed}.
|
|
||||||
|
|
||||||
@item slice_mode
|
|
||||||
Set slice mode. Can assume one of the follwing possible values:
|
|
||||||
|
|
||||||
@table @samp
|
|
||||||
@item fixed
|
|
||||||
a fixed number of slices
|
|
||||||
@item rowmb
|
|
||||||
one slice per row of macroblocks
|
|
||||||
@item auto
|
|
||||||
automatic number of slices according to number of threads
|
|
||||||
@item dyn
|
|
||||||
dynamic slicing
|
|
||||||
@end table
|
|
||||||
|
|
||||||
Default value is @samp{auto}.
|
|
||||||
|
|
||||||
@item loopfilter
|
|
||||||
Enable loop filter, if set to 1 (automatically enabled). To disable
|
|
||||||
set a value of 0.
|
|
||||||
|
|
||||||
@item profile
|
|
||||||
Set profile restrictions. If set to the value of @samp{main} enable
|
|
||||||
CABAC (set the @code{SEncParamExt.iEntropyCodingModeFlag} flag to 1).
|
|
||||||
|
|
||||||
@item max_nal_size
|
|
||||||
Set maximum NAL size in bytes.
|
|
||||||
|
|
||||||
@item allow_skip_frames
|
|
||||||
Allow skipping frames to hit the target bitrate if set to 1.
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section jpeg2000
|
|
||||||
|
|
||||||
The native jpeg 2000 encoder is lossy by default, the @code{-q:v}
|
|
||||||
option can be used to set the encoding quality. Lossless encoding
|
|
||||||
can be selected with @code{-pred 1}.
|
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item format
|
|
||||||
Can be set to either @code{j2k} or @code{jp2} (the default) that
|
|
||||||
makes it possible to store non-rgb pix_fmts.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section snow
|
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item iterative_dia_size
|
|
||||||
dia size for the iterative motion estimation
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section libtheora
|
@section libtheora
|
||||||
|
|
||||||
libtheora Theora encoder wrapper.
|
libtheora Theora encoder wrapper.
|
||||||
@@ -1518,159 +1337,113 @@ You need to explicitly configure the build with @code{--enable-libvpx}.
|
|||||||
|
|
||||||
@subsection Options
|
@subsection Options
|
||||||
|
|
||||||
The following options are supported by the libvpx wrapper. The
|
Mapping from FFmpeg to libvpx options with conversion notes in parentheses.
|
||||||
@command{vpxenc}-equivalent options or values are listed in parentheses
|
|
||||||
for easy migration.
|
|
||||||
|
|
||||||
To reduce the duplication of documentation, only the private options
|
|
||||||
and some others requiring special attention are documented here. For
|
|
||||||
the documentation of the undocumented generic options, see
|
|
||||||
@ref{codec-options,,the Codec Options chapter}.
|
|
||||||
|
|
||||||
To get more documentation of the libvpx options, invoke the command
|
|
||||||
@command{ffmpeg -h encoder=libvpx}, @command{ffmpeg -h encoder=libvpx-vp9} or
|
|
||||||
@command{vpxenc --help}. Further information is available in the libvpx API
|
|
||||||
documentation.
|
|
||||||
|
|
||||||
@table @option
|
@table @option
|
||||||
|
|
||||||
@item b (@emph{target-bitrate})
|
@item threads
|
||||||
Set bitrate in bits/s. Note that FFmpeg's @option{b} option is
|
g_threads
|
||||||
expressed in bits/s, while @command{vpxenc}'s @option{target-bitrate} is in
|
|
||||||
kilobits/s.
|
|
||||||
|
|
||||||
@item g (@emph{kf-max-dist})
|
@item profile
|
||||||
|
g_profile
|
||||||
|
|
||||||
@item keyint_min (@emph{kf-min-dist})
|
@item vb
|
||||||
|
rc_target_bitrate
|
||||||
|
|
||||||
@item qmin (@emph{min-q})
|
@item g
|
||||||
|
kf_max_dist
|
||||||
|
|
||||||
@item qmax (@emph{max-q})
|
@item keyint_min
|
||||||
|
kf_min_dist
|
||||||
|
|
||||||
@item bufsize (@emph{buf-sz}, @emph{buf-optimal-sz})
|
@item qmin
|
||||||
Set ratecontrol buffer size (in bits). Note @command{vpxenc}'s options are
|
rc_min_quantizer
|
||||||
specified in milliseconds, the libvpx wrapper converts this value as follows:
|
|
||||||
@code{buf-sz = bufsize * 1000 / bitrate},
|
|
||||||
@code{buf-optimal-sz = bufsize * 1000 / bitrate * 5 / 6}.
|
|
||||||
|
|
||||||
@item rc_init_occupancy (@emph{buf-initial-sz})
|
@item qmax
|
||||||
Set number of bits which should be loaded into the rc buffer before decoding
|
rc_max_quantizer
|
||||||
starts. Note @command{vpxenc}'s option is specified in milliseconds, the libvpx
|
|
||||||
wrapper converts this value as follows:
|
|
||||||
@code{rc_init_occupancy * 1000 / bitrate}.
|
|
||||||
|
|
||||||
@item undershoot-pct
|
@item bufsize, vb
|
||||||
Set datarate undershoot (min) percentage of the target bitrate.
|
rc_buf_sz
|
||||||
|
@code{(bufsize * 1000 / vb)}
|
||||||
|
|
||||||
@item overshoot-pct
|
rc_buf_optimal_sz
|
||||||
Set datarate overshoot (max) percentage of the target bitrate.
|
@code{(bufsize * 1000 / vb * 5 / 6)}
|
||||||
|
|
||||||
@item skip_threshold (@emph{drop-frame})
|
@item rc_init_occupancy, vb
|
||||||
|
rc_buf_initial_sz
|
||||||
|
@code{(rc_init_occupancy * 1000 / vb)}
|
||||||
|
|
||||||
@item qcomp (@emph{bias-pct})
|
@item rc_buffer_aggressivity
|
||||||
|
rc_undershoot_pct
|
||||||
|
|
||||||
@item maxrate (@emph{maxsection-pct})
|
@item skip_threshold
|
||||||
Set GOP max bitrate in bits/s. Note @command{vpxenc}'s option is specified as a
|
rc_dropframe_thresh
|
||||||
percentage of the target bitrate, the libvpx wrapper converts this value as
|
|
||||||
follows: @code{(maxrate * 100 / bitrate)}.
|
|
||||||
|
|
||||||
@item minrate (@emph{minsection-pct})
|
@item qcomp
|
||||||
Set GOP min bitrate in bits/s. Note @command{vpxenc}'s option is specified as a
|
rc_2pass_vbr_bias_pct
|
||||||
percentage of the target bitrate, the libvpx wrapper converts this value as
|
|
||||||
follows: @code{(minrate * 100 / bitrate)}.
|
|
||||||
|
|
||||||
@item minrate, maxrate, b @emph{end-usage=cbr}
|
@item maxrate, vb
|
||||||
@code{(minrate == maxrate == bitrate)}.
|
rc_2pass_vbr_maxsection_pct
|
||||||
|
@code{(maxrate * 100 / vb)}
|
||||||
|
|
||||||
@item crf (@emph{end-usage=cq}, @emph{cq-level})
|
@item minrate, vb
|
||||||
|
rc_2pass_vbr_minsection_pct
|
||||||
|
@code{(minrate * 100 / vb)}
|
||||||
|
|
||||||
@item tune (@emph{tune})
|
@item minrate, maxrate, vb
|
||||||
@table @samp
|
@code{VPX_CBR}
|
||||||
@item psnr (@emph{psnr})
|
@code{(minrate == maxrate == vb)}
|
||||||
@item ssim (@emph{ssim})
|
|
||||||
|
@item crf
|
||||||
|
@code{VPX_CQ}, @code{VP8E_SET_CQ_LEVEL}
|
||||||
|
|
||||||
|
@item quality
|
||||||
|
@table @option
|
||||||
|
@item @var{best}
|
||||||
|
@code{VPX_DL_BEST_QUALITY}
|
||||||
|
@item @var{good}
|
||||||
|
@code{VPX_DL_GOOD_QUALITY}
|
||||||
|
@item @var{realtime}
|
||||||
|
@code{VPX_DL_REALTIME}
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item quality, deadline (@emph{deadline})
|
@item speed
|
||||||
@table @samp
|
@code{VP8E_SET_CPUUSED}
|
||||||
@item best
|
|
||||||
Use best quality deadline. Poorly named and quite slow, this option should be
|
|
||||||
avoided as it may give worse quality output than good.
|
|
||||||
@item good
|
|
||||||
Use good quality deadline. This is a good trade-off between speed and quality
|
|
||||||
when used with the @option{cpu-used} option.
|
|
||||||
@item realtime
|
|
||||||
Use realtime quality deadline.
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@item speed, cpu-used (@emph{cpu-used})
|
@item nr
|
||||||
Set quality/speed ratio modifier. Higher values speed up the encode at the cost
|
@code{VP8E_SET_NOISE_SENSITIVITY}
|
||||||
of quality.
|
|
||||||
|
|
||||||
@item nr (@emph{noise-sensitivity})
|
@item mb_threshold
|
||||||
|
@code{VP8E_SET_STATIC_THRESHOLD}
|
||||||
|
|
||||||
@item static-thresh
|
@item slices
|
||||||
Set a change threshold on blocks below which they will be skipped by the
|
@code{VP8E_SET_TOKEN_PARTITIONS}
|
||||||
encoder.
|
|
||||||
|
|
||||||
@item slices (@emph{token-parts})
|
|
||||||
Note that FFmpeg's @option{slices} option gives the total number of partitions,
|
|
||||||
while @command{vpxenc}'s @option{token-parts} is given as
|
|
||||||
@code{log2(partitions)}.
|
|
||||||
|
|
||||||
@item max-intra-rate
|
@item max-intra-rate
|
||||||
Set maximum I-frame bitrate as a percentage of the target bitrate. A value of 0
|
@code{VP8E_SET_MAX_INTRA_BITRATE_PCT}
|
||||||
means unlimited.
|
|
||||||
|
|
||||||
@item force_key_frames
|
@item force_key_frames
|
||||||
@code{VPX_EFLAG_FORCE_KF}
|
@code{VPX_EFLAG_FORCE_KF}
|
||||||
|
|
||||||
@item Alternate reference frame related
|
@item Alternate reference frame related
|
||||||
@table @option
|
@table @option
|
||||||
@item auto-alt-ref
|
@item vp8flags altref
|
||||||
Enable use of alternate reference frames (2-pass only).
|
@code{VP8E_SET_ENABLEAUTOALTREF}
|
||||||
@item arnr-max-frames
|
@item @var{arnr_max_frames}
|
||||||
Set altref noise reduction max frame count.
|
@code{VP8E_SET_ARNR_MAXFRAMES}
|
||||||
@item arnr-type
|
@item @var{arnr_type}
|
||||||
Set altref noise reduction filter type: backward, forward, centered.
|
@code{VP8E_SET_ARNR_TYPE}
|
||||||
@item arnr-strength
|
@item @var{arnr_strength}
|
||||||
Set altref noise reduction filter strength.
|
@code{VP8E_SET_ARNR_STRENGTH}
|
||||||
@item rc-lookahead, lag-in-frames (@emph{lag-in-frames})
|
@item @var{rc_lookahead}
|
||||||
Set number of frames to look ahead for frametype and ratecontrol.
|
g_lag_in_frames
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item error-resilient
|
@item vp8flags error_resilient
|
||||||
Enable error resiliency features.
|
g_error_resilient
|
||||||
|
|
||||||
@item VP9-specific options
|
@item aq_mode
|
||||||
@table @option
|
@code{VP9E_SET_AQ_MODE}
|
||||||
@item lossless
|
|
||||||
Enable lossless mode.
|
|
||||||
@item tile-columns
|
|
||||||
Set number of tile columns to use. Note this is given as
|
|
||||||
@code{log2(tile_columns)}. For example, 8 tile columns would be requested by
|
|
||||||
setting the @option{tile-columns} option to 3.
|
|
||||||
@item tile-rows
|
|
||||||
Set number of tile rows to use. Note this is given as @code{log2(tile_rows)}.
|
|
||||||
For example, 4 tile rows would be requested by setting the @option{tile-rows}
|
|
||||||
option to 2.
|
|
||||||
@item frame-parallel
|
|
||||||
Enable frame parallel decodability features.
|
|
||||||
@item aq-mode
|
|
||||||
Set adaptive quantization mode (0: off (default), 1: variance 2: complexity, 3:
|
|
||||||
cyclic refresh).
|
|
||||||
@item colorspace @emph{color-space}
|
|
||||||
Set input color space. The VP9 bitstream supports signaling the following
|
|
||||||
colorspaces:
|
|
||||||
@table @option
|
|
||||||
@item @samp{rgb} @emph{sRGB}
|
|
||||||
@item @samp{bt709} @emph{bt709}
|
|
||||||
@item @samp{unspecified} @emph{unknown}
|
|
||||||
@item @samp{bt470bg} @emph{bt601}
|
|
||||||
@item @samp{smpte170m} @emph{smpte170}
|
|
||||||
@item @samp{smpte240m} @emph{smpte240}
|
|
||||||
@item @samp{bt2020_ncl} @emph{bt2020}
|
|
||||||
@end table
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@@ -2095,10 +1868,6 @@ For example to specify libx264 encoding options with @command{ffmpeg}:
|
|||||||
ffmpeg -i foo.mpg -vcodec libx264 -x264opts keyint=123:min-keyint=20 -an out.mkv
|
ffmpeg -i foo.mpg -vcodec libx264 -x264opts keyint=123:min-keyint=20 -an out.mkv
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@item a53cc @var{boolean}
|
|
||||||
Import closed captions (which must be ATSC compatible format) into output.
|
|
||||||
Only the mpeg2 and h264 decoders provide these. Default is 0 (off).
|
|
||||||
|
|
||||||
@item x264-params (N.A.)
|
@item x264-params (N.A.)
|
||||||
Override the x264 configuration using a :-separated list of key=value
|
Override the x264 configuration using a :-separated list of key=value
|
||||||
parameters.
|
parameters.
|
||||||
@@ -2412,180 +2181,6 @@ Setting a higher @option{bits_per_mb} limit will improve the speed.
|
|||||||
For the fastest encoding speed set the @option{qscale} parameter (4 is the
|
For the fastest encoding speed set the @option{qscale} parameter (4 is the
|
||||||
recommended value) and do not set a size constraint.
|
recommended value) and do not set a size constraint.
|
||||||
|
|
||||||
@section libkvazaar
|
|
||||||
|
|
||||||
Kvazaar H.265/HEVC encoder.
|
|
||||||
|
|
||||||
Requires the presence of the libkvazaar headers and library during
|
|
||||||
configuration. You need to explicitly configure the build with
|
|
||||||
@option{--enable-libkvazaar}.
|
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
|
|
||||||
@item b
|
|
||||||
Set target video bitrate in bit/s and enable rate control.
|
|
||||||
|
|
||||||
@item kvazaar-params
|
|
||||||
Set kvazaar parameters as a list of @var{name}=@var{value} pairs separated
|
|
||||||
by commas (,). See kvazaar documentation for a list of options.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section QSV encoders
|
|
||||||
|
|
||||||
The family of Intel QuickSync Video encoders (MPEG-2, H.264 and HEVC)
|
|
||||||
|
|
||||||
The ratecontrol method is selected as follows:
|
|
||||||
|
|
||||||
@itemize @bullet
|
|
||||||
@item
|
|
||||||
When @option{global_quality} is specified, a quality-based mode is used.
|
|
||||||
Specifically this means either
|
|
||||||
@itemize @minus
|
|
||||||
@item
|
|
||||||
@var{CQP} - constant quantizer scale, when the @option{qscale} codec flag is
|
|
||||||
also set (the @option{-qscale} ffmpeg option).
|
|
||||||
|
|
||||||
@item
|
|
||||||
@var{LA_ICQ} - intelligent constant quality with lookahead, when the
|
|
||||||
@option{look_ahead} option is also set.
|
|
||||||
|
|
||||||
@item
|
|
||||||
@var{ICQ} -- intelligent constant quality otherwise.
|
|
||||||
@end itemize
|
|
||||||
|
|
||||||
@item
|
|
||||||
Otherwise, a bitrate-based mode is used. For all of those, you should specify at
|
|
||||||
least the desired average bitrate with the @option{b} option.
|
|
||||||
@itemize @minus
|
|
||||||
@item
|
|
||||||
@var{LA} - VBR with lookahead, when the @option{look_ahead} option is specified.
|
|
||||||
|
|
||||||
@item
|
|
||||||
@var{VCM} - video conferencing mode, when the @option{vcm} option is set.
|
|
||||||
|
|
||||||
@item
|
|
||||||
@var{CBR} - constant bitrate, when @option{maxrate} is specified and equal to
|
|
||||||
the average bitrate.
|
|
||||||
|
|
||||||
@item
|
|
||||||
@var{VBR} - variable bitrate, when @option{maxrate} is specified, but is higher
|
|
||||||
than the average bitrate.
|
|
||||||
|
|
||||||
@item
|
|
||||||
@var{AVBR} - average VBR mode, when @option{maxrate} is not specified. This mode
|
|
||||||
is further configured by the @option{avbr_accuracy} and
|
|
||||||
@option{avbr_convergence} options.
|
|
||||||
@end itemize
|
|
||||||
@end itemize
|
|
||||||
|
|
||||||
Note that depending on your system, a different mode than the one you specified
|
|
||||||
may be selected by the encoder. Set the verbosity level to @var{verbose} or
|
|
||||||
higher to see the actual settings used by the QSV runtime.
|
|
||||||
|
|
||||||
Additional libavcodec global options are mapped to MSDK options as follows:
|
|
||||||
|
|
||||||
@itemize
|
|
||||||
@item
|
|
||||||
@option{g/gop_size} -> @option{GopPicSize}
|
|
||||||
|
|
||||||
@item
|
|
||||||
@option{bf/max_b_frames}+1 -> @option{GopRefDist}
|
|
||||||
|
|
||||||
@item
|
|
||||||
@option{rc_init_occupancy/rc_initial_buffer_occupancy} ->
|
|
||||||
@option{InitialDelayInKB}
|
|
||||||
|
|
||||||
@item
|
|
||||||
@option{slices} -> @option{NumSlice}
|
|
||||||
|
|
||||||
@item
|
|
||||||
@option{refs} -> @option{NumRefFrame}
|
|
||||||
|
|
||||||
@item
|
|
||||||
@option{b_strategy/b_frame_strategy} -> @option{BRefType}
|
|
||||||
|
|
||||||
@item
|
|
||||||
@option{cgop/CLOSED_GOP} codec flag -> @option{GopOptFlag}
|
|
||||||
|
|
||||||
@item
|
|
||||||
For the @var{CQP} mode, the @option{i_qfactor/i_qoffset} and
|
|
||||||
@option{b_qfactor/b_qoffset} set the difference between @var{QPP} and @var{QPI},
|
|
||||||
and @var{QPP} and @var{QPB} respectively.
|
|
||||||
|
|
||||||
@item
|
|
||||||
Setting the @option{coder} option to the value @var{vlc} will make the H.264
|
|
||||||
encoder use CAVLC instead of CABAC.
|
|
||||||
|
|
||||||
@end itemize
|
|
||||||
|
|
||||||
@section vc2
|
|
||||||
|
|
||||||
SMPTE VC-2 (previously BBC Dirac Pro). This codec was primarily aimed at
|
|
||||||
professional broadcasting but since it supports yuv420, yuv422 and yuv444 at
|
|
||||||
8 (limited range or full range), 10 or 12 bits, this makes it suitable for
|
|
||||||
other tasks which require low overhead and low compression (like screen
|
|
||||||
recording).
|
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
|
|
||||||
@item b
|
|
||||||
Sets target video bitrate. Usually that's around 1:6 of the uncompressed
|
|
||||||
video bitrate (e.g. for 1920x1080 50fps yuv422p10 that's around 400Mbps). Higher
|
|
||||||
values (close to the uncompressed bitrate) turn on lossless compression mode.
|
|
||||||
|
|
||||||
@item field_order
|
|
||||||
Enables field coding when set (e.g. to tt - top field first) for interlaced
|
|
||||||
inputs. Should increase compression with interlaced content as it splits the
|
|
||||||
fields and encodes each separately.
|
|
||||||
|
|
||||||
@item wavelet_depth
|
|
||||||
Sets the total amount of wavelet transforms to apply, between 1 and 5 (default).
|
|
||||||
Lower values reduce compression and quality. Less capable decoders may not be
|
|
||||||
able to handle values of @option{wavelet_depth} over 3.
|
|
||||||
|
|
||||||
@item wavelet_type
|
|
||||||
Sets the transform type. Currently only @var{5_3} (LeGall) and @var{9_7}
|
|
||||||
(Deslauriers-Dubuc)
|
|
||||||
are implemented, with 9_7 being the one with better compression and thus
|
|
||||||
is the default.
|
|
||||||
|
|
||||||
@item slice_width
|
|
||||||
@item slice_height
|
|
||||||
Sets the slice size for each slice. Larger values result in better compression.
|
|
||||||
For compatibility with other more limited decoders use @option{slice_width} of
|
|
||||||
32 and @option{slice_height} of 8.
|
|
||||||
|
|
||||||
@item tolerance
|
|
||||||
Sets the undershoot tolerance of the rate control system in percent. This is
|
|
||||||
to prevent an expensive search from being run.
|
|
||||||
|
|
||||||
@item qm
|
|
||||||
Sets the quantization matrix preset to use by default or when @option{wavelet_depth}
|
|
||||||
is set to 5
|
|
||||||
@itemize @minus
|
|
||||||
@item
|
|
||||||
@var{default}
|
|
||||||
Uses the default quantization matrix from the specifications, extended with
|
|
||||||
values for the fifth level. This provides a good balance between keeping detail
|
|
||||||
and omitting artifacts.
|
|
||||||
|
|
||||||
@item
|
|
||||||
@var{flat}
|
|
||||||
Use a completely zeroed out quantization matrix. This increases PSNR but might
|
|
||||||
reduce perception. Use in bogus benchmarks.
|
|
||||||
|
|
||||||
@item
|
|
||||||
@var{color}
|
|
||||||
Reduces detail but attempts to preserve color at extremely low bitrates.
|
|
||||||
@end itemize
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@c man end VIDEO ENCODERS
|
@c man end VIDEO ENCODERS
|
||||||
|
|
||||||
@chapter Subtitles Encoders
|
@chapter Subtitles Encoders
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ EMFILE POSIX ++++++ Too many open files
|
|||||||
EMLINK POSIX ++++++ Too many links
|
EMLINK POSIX ++++++ Too many links
|
||||||
EMSGSIZE POSIX +++..+ Message too long
|
EMSGSIZE POSIX +++..+ Message too long
|
||||||
EMULTIHOP POSIX ++4... Multihop attempted
|
EMULTIHOP POSIX ++4... Multihop attempted
|
||||||
ENAMETOOLONG POSIX - ++++++ File name too long
|
ENAMETOOLONG POSIX - ++++++ Filen ame too long
|
||||||
ENAVAIL +..... No XENIX semaphores available
|
ENAVAIL +..... No XENIX semaphores available
|
||||||
ENEEDAUTH .++... Need authenticator
|
ENEEDAUTH .++... Need authenticator
|
||||||
ENETDOWN POSIX +++..+ Network is down
|
ENETDOWN POSIX +++..+ Network is down
|
||||||
|
|||||||
16
doc/examples/.gitignore
vendored
16
doc/examples/.gitignore
vendored
@@ -1,16 +0,0 @@
|
|||||||
/avio_dir_cmd
|
|
||||||
/avio_reading
|
|
||||||
/decoding_encoding
|
|
||||||
/demuxing_decoding
|
|
||||||
/extract_mvs
|
|
||||||
/filter_audio
|
|
||||||
/filtering_audio
|
|
||||||
/filtering_video
|
|
||||||
/metadata
|
|
||||||
/muxing
|
|
||||||
/pc-uninstalled
|
|
||||||
/remuxing
|
|
||||||
/resampling_audio
|
|
||||||
/scaling_video
|
|
||||||
/transcode_aac
|
|
||||||
/transcoding
|
|
||||||
@@ -11,14 +11,12 @@ CFLAGS += -Wall -g
|
|||||||
CFLAGS := $(shell pkg-config --cflags $(FFMPEG_LIBS)) $(CFLAGS)
|
CFLAGS := $(shell pkg-config --cflags $(FFMPEG_LIBS)) $(CFLAGS)
|
||||||
LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS)) $(LDLIBS)
|
LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS)) $(LDLIBS)
|
||||||
|
|
||||||
EXAMPLES= avio_dir_cmd \
|
EXAMPLES= avio_reading \
|
||||||
avio_reading \
|
|
||||||
decoding_encoding \
|
decoding_encoding \
|
||||||
demuxing_decoding \
|
demuxing_decoding \
|
||||||
extract_mvs \
|
extract_mvs \
|
||||||
filtering_video \
|
filtering_video \
|
||||||
filtering_audio \
|
filtering_audio \
|
||||||
http_multiclient \
|
|
||||||
metadata \
|
metadata \
|
||||||
muxing \
|
muxing \
|
||||||
remuxing \
|
remuxing \
|
||||||
|
|||||||
@@ -1,180 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2014 Lukasz Marek
|
|
||||||
*
|
|
||||||
* 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 <libavcodec/avcodec.h>
|
|
||||||
#include <libavformat/avformat.h>
|
|
||||||
#include <libavformat/avio.h>
|
|
||||||
|
|
||||||
static const char *type_string(int type)
|
|
||||||
{
|
|
||||||
switch (type) {
|
|
||||||
case AVIO_ENTRY_DIRECTORY:
|
|
||||||
return "<DIR>";
|
|
||||||
case AVIO_ENTRY_FILE:
|
|
||||||
return "<FILE>";
|
|
||||||
case AVIO_ENTRY_BLOCK_DEVICE:
|
|
||||||
return "<BLOCK DEVICE>";
|
|
||||||
case AVIO_ENTRY_CHARACTER_DEVICE:
|
|
||||||
return "<CHARACTER DEVICE>";
|
|
||||||
case AVIO_ENTRY_NAMED_PIPE:
|
|
||||||
return "<PIPE>";
|
|
||||||
case AVIO_ENTRY_SYMBOLIC_LINK:
|
|
||||||
return "<LINK>";
|
|
||||||
case AVIO_ENTRY_SOCKET:
|
|
||||||
return "<SOCKET>";
|
|
||||||
case AVIO_ENTRY_SERVER:
|
|
||||||
return "<SERVER>";
|
|
||||||
case AVIO_ENTRY_SHARE:
|
|
||||||
return "<SHARE>";
|
|
||||||
case AVIO_ENTRY_WORKGROUP:
|
|
||||||
return "<WORKGROUP>";
|
|
||||||
case AVIO_ENTRY_UNKNOWN:
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return "<UNKNOWN>";
|
|
||||||
}
|
|
||||||
|
|
||||||
static int list_op(const char *input_dir)
|
|
||||||
{
|
|
||||||
AVIODirEntry *entry = NULL;
|
|
||||||
AVIODirContext *ctx = NULL;
|
|
||||||
int cnt, ret;
|
|
||||||
char filemode[4], uid_and_gid[20];
|
|
||||||
|
|
||||||
if ((ret = avio_open_dir(&ctx, input_dir, NULL)) < 0) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Cannot open directory: %s.\n", av_err2str(ret));
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
cnt = 0;
|
|
||||||
for (;;) {
|
|
||||||
if ((ret = avio_read_dir(ctx, &entry)) < 0) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Cannot list directory: %s.\n", av_err2str(ret));
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
if (!entry)
|
|
||||||
break;
|
|
||||||
if (entry->filemode == -1) {
|
|
||||||
snprintf(filemode, 4, "???");
|
|
||||||
} else {
|
|
||||||
snprintf(filemode, 4, "%3"PRIo64, entry->filemode);
|
|
||||||
}
|
|
||||||
snprintf(uid_and_gid, 20, "%"PRId64"(%"PRId64")", entry->user_id, entry->group_id);
|
|
||||||
if (cnt == 0)
|
|
||||||
av_log(NULL, AV_LOG_INFO, "%-9s %12s %30s %10s %s %16s %16s %16s\n",
|
|
||||||
"TYPE", "SIZE", "NAME", "UID(GID)", "UGO", "MODIFIED",
|
|
||||||
"ACCESSED", "STATUS_CHANGED");
|
|
||||||
av_log(NULL, AV_LOG_INFO, "%-9s %12"PRId64" %30s %10s %s %16"PRId64" %16"PRId64" %16"PRId64"\n",
|
|
||||||
type_string(entry->type),
|
|
||||||
entry->size,
|
|
||||||
entry->name,
|
|
||||||
uid_and_gid,
|
|
||||||
filemode,
|
|
||||||
entry->modification_timestamp,
|
|
||||||
entry->access_timestamp,
|
|
||||||
entry->status_change_timestamp);
|
|
||||||
avio_free_directory_entry(&entry);
|
|
||||||
cnt++;
|
|
||||||
};
|
|
||||||
|
|
||||||
fail:
|
|
||||||
avio_close_dir(&ctx);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int del_op(const char *url)
|
|
||||||
{
|
|
||||||
int ret = avpriv_io_delete(url);
|
|
||||||
if (ret < 0)
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Cannot delete '%s': %s.\n", url, av_err2str(ret));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int move_op(const char *src, const char *dst)
|
|
||||||
{
|
|
||||||
int ret = avpriv_io_move(src, dst);
|
|
||||||
if (ret < 0)
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Cannot move '%s' into '%s': %s.\n", src, dst, av_err2str(ret));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void usage(const char *program_name)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "usage: %s OPERATION entry1 [entry2]\n"
|
|
||||||
"API example program to show how to manipulate resources "
|
|
||||||
"accessed through AVIOContext.\n"
|
|
||||||
"OPERATIONS:\n"
|
|
||||||
"list list content of the directory\n"
|
|
||||||
"move rename content in directory\n"
|
|
||||||
"del delete content in directory\n",
|
|
||||||
program_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
const char *op = NULL;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
av_log_set_level(AV_LOG_DEBUG);
|
|
||||||
|
|
||||||
if (argc < 2) {
|
|
||||||
usage(argv[0]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* register codecs and formats and other lavf/lavc components*/
|
|
||||||
av_register_all();
|
|
||||||
avformat_network_init();
|
|
||||||
|
|
||||||
op = argv[1];
|
|
||||||
if (strcmp(op, "list") == 0) {
|
|
||||||
if (argc < 3) {
|
|
||||||
av_log(NULL, AV_LOG_INFO, "Missing argument for list operation.\n");
|
|
||||||
ret = AVERROR(EINVAL);
|
|
||||||
} else {
|
|
||||||
ret = list_op(argv[2]);
|
|
||||||
}
|
|
||||||
} else if (strcmp(op, "del") == 0) {
|
|
||||||
if (argc < 3) {
|
|
||||||
av_log(NULL, AV_LOG_INFO, "Missing argument for del operation.\n");
|
|
||||||
ret = AVERROR(EINVAL);
|
|
||||||
} else {
|
|
||||||
ret = del_op(argv[2]);
|
|
||||||
}
|
|
||||||
} else if (strcmp(op, "move") == 0) {
|
|
||||||
if (argc < 4) {
|
|
||||||
av_log(NULL, AV_LOG_INFO, "Missing argument for move operation.\n");
|
|
||||||
ret = AVERROR(EINVAL);
|
|
||||||
} else {
|
|
||||||
ret = move_op(argv[2], argv[3]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
av_log(NULL, AV_LOG_INFO, "Invalid operation %s\n", op);
|
|
||||||
ret = AVERROR(EINVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
avformat_network_deinit();
|
|
||||||
|
|
||||||
return ret < 0 ? 1 : 0;
|
|
||||||
}
|
|
||||||
@@ -25,9 +25,9 @@
|
|||||||
* libavcodec API use example.
|
* libavcodec API use example.
|
||||||
*
|
*
|
||||||
* @example decoding_encoding.c
|
* @example decoding_encoding.c
|
||||||
* Note that libavcodec only handles codecs (MPEG, MPEG-4, etc...),
|
* Note that libavcodec only handles codecs (mpeg, mpeg4, etc...),
|
||||||
* not file formats (AVI, VOB, MP4, MOV, MKV, MXF, FLV, MPEG-TS, MPEG-PS, etc...).
|
* not file formats (avi, vob, mp4, mov, mkv, mxf, flv, mpegts, mpegps, etc...). See library 'libavformat' for the
|
||||||
* See library 'libavformat' for the format handling
|
* format handling
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
@@ -211,7 +211,7 @@ static void audio_encode_example(const char *filename)
|
|||||||
}
|
}
|
||||||
if (got_output) {
|
if (got_output) {
|
||||||
fwrite(pkt.data, 1, pkt.size, f);
|
fwrite(pkt.data, 1, pkt.size, f);
|
||||||
av_packet_unref(&pkt);
|
av_free_packet(&pkt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,7 +225,7 @@ static void audio_encode_example(const char *filename)
|
|||||||
|
|
||||||
if (got_output) {
|
if (got_output) {
|
||||||
fwrite(pkt.data, 1, pkt.size, f);
|
fwrite(pkt.data, 1, pkt.size, f);
|
||||||
av_packet_unref(&pkt);
|
av_free_packet(&pkt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(f);
|
fclose(f);
|
||||||
@@ -245,7 +245,7 @@ static void audio_decode_example(const char *outfilename, const char *filename)
|
|||||||
AVCodecContext *c= NULL;
|
AVCodecContext *c= NULL;
|
||||||
int len;
|
int len;
|
||||||
FILE *f, *outfile;
|
FILE *f, *outfile;
|
||||||
uint8_t inbuf[AUDIO_INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
|
uint8_t inbuf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
|
||||||
AVPacket avpkt;
|
AVPacket avpkt;
|
||||||
AVFrame *decoded_frame = NULL;
|
AVFrame *decoded_frame = NULL;
|
||||||
|
|
||||||
@@ -253,7 +253,7 @@ static void audio_decode_example(const char *outfilename, const char *filename)
|
|||||||
|
|
||||||
printf("Decode audio file %s to %s\n", filename, outfilename);
|
printf("Decode audio file %s to %s\n", filename, outfilename);
|
||||||
|
|
||||||
/* find the MPEG audio decoder */
|
/* find the mpeg audio decoder */
|
||||||
codec = avcodec_find_decoder(AV_CODEC_ID_MP2);
|
codec = avcodec_find_decoder(AV_CODEC_ID_MP2);
|
||||||
if (!codec) {
|
if (!codec) {
|
||||||
fprintf(stderr, "Codec not found\n");
|
fprintf(stderr, "Codec not found\n");
|
||||||
@@ -356,7 +356,7 @@ static void video_encode_example(const char *filename, int codec_id)
|
|||||||
|
|
||||||
printf("Encode video file %s\n", filename);
|
printf("Encode video file %s\n", filename);
|
||||||
|
|
||||||
/* find the video encoder */
|
/* find the mpeg1 video encoder */
|
||||||
codec = avcodec_find_encoder(codec_id);
|
codec = avcodec_find_encoder(codec_id);
|
||||||
if (!codec) {
|
if (!codec) {
|
||||||
fprintf(stderr, "Codec not found\n");
|
fprintf(stderr, "Codec not found\n");
|
||||||
@@ -454,7 +454,7 @@ static void video_encode_example(const char *filename, int codec_id)
|
|||||||
if (got_output) {
|
if (got_output) {
|
||||||
printf("Write frame %3d (size=%5d)\n", i, pkt.size);
|
printf("Write frame %3d (size=%5d)\n", i, pkt.size);
|
||||||
fwrite(pkt.data, 1, pkt.size, f);
|
fwrite(pkt.data, 1, pkt.size, f);
|
||||||
av_packet_unref(&pkt);
|
av_free_packet(&pkt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -471,11 +471,11 @@ static void video_encode_example(const char *filename, int codec_id)
|
|||||||
if (got_output) {
|
if (got_output) {
|
||||||
printf("Write frame %3d (size=%5d)\n", i, pkt.size);
|
printf("Write frame %3d (size=%5d)\n", i, pkt.size);
|
||||||
fwrite(pkt.data, 1, pkt.size, f);
|
fwrite(pkt.data, 1, pkt.size, f);
|
||||||
av_packet_unref(&pkt);
|
av_free_packet(&pkt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add sequence end code to have a real MPEG file */
|
/* add sequence end code to have a real mpeg file */
|
||||||
fwrite(endcode, 1, sizeof(endcode), f);
|
fwrite(endcode, 1, sizeof(endcode), f);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
|
||||||
@@ -521,7 +521,7 @@ static int decode_write_frame(const char *outfilename, AVCodecContext *avctx,
|
|||||||
/* the picture is allocated by the decoder, no need to free it */
|
/* the picture is allocated by the decoder, no need to free it */
|
||||||
snprintf(buf, sizeof(buf), outfilename, *frame_count);
|
snprintf(buf, sizeof(buf), outfilename, *frame_count);
|
||||||
pgm_save(frame->data[0], frame->linesize[0],
|
pgm_save(frame->data[0], frame->linesize[0],
|
||||||
frame->width, frame->height, buf);
|
avctx->width, avctx->height, buf);
|
||||||
(*frame_count)++;
|
(*frame_count)++;
|
||||||
}
|
}
|
||||||
if (pkt->data) {
|
if (pkt->data) {
|
||||||
@@ -538,17 +538,17 @@ static void video_decode_example(const char *outfilename, const char *filename)
|
|||||||
int frame_count;
|
int frame_count;
|
||||||
FILE *f;
|
FILE *f;
|
||||||
AVFrame *frame;
|
AVFrame *frame;
|
||||||
uint8_t inbuf[INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
|
uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
|
||||||
AVPacket avpkt;
|
AVPacket avpkt;
|
||||||
|
|
||||||
av_init_packet(&avpkt);
|
av_init_packet(&avpkt);
|
||||||
|
|
||||||
/* set end of buffer to 0 (this ensures that no overreading happens for damaged MPEG streams) */
|
/* set end of buffer to 0 (this ensures that no overreading happens for damaged mpeg streams) */
|
||||||
memset(inbuf + INBUF_SIZE, 0, AV_INPUT_BUFFER_PADDING_SIZE);
|
memset(inbuf + INBUF_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);
|
||||||
|
|
||||||
printf("Decode video file %s to %s\n", filename, outfilename);
|
printf("Decode video file %s to %s\n", filename, outfilename);
|
||||||
|
|
||||||
/* find the MPEG-1 video decoder */
|
/* find the mpeg1 video decoder */
|
||||||
codec = avcodec_find_decoder(AV_CODEC_ID_MPEG1VIDEO);
|
codec = avcodec_find_decoder(AV_CODEC_ID_MPEG1VIDEO);
|
||||||
if (!codec) {
|
if (!codec) {
|
||||||
fprintf(stderr, "Codec not found\n");
|
fprintf(stderr, "Codec not found\n");
|
||||||
@@ -561,8 +561,8 @@ static void video_decode_example(const char *outfilename, const char *filename)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (codec->capabilities & AV_CODEC_CAP_TRUNCATED)
|
if(codec->capabilities&CODEC_CAP_TRUNCATED)
|
||||||
c->flags |= AV_CODEC_FLAG_TRUNCATED; // we do not send complete frames
|
c->flags|= CODEC_FLAG_TRUNCATED; /* we do not send complete frames */
|
||||||
|
|
||||||
/* For some codecs, such as msmpeg4 and mpeg4, width and height
|
/* For some codecs, such as msmpeg4 and mpeg4, width and height
|
||||||
MUST be initialized there because this information is not
|
MUST be initialized there because this information is not
|
||||||
@@ -613,9 +613,9 @@ static void video_decode_example(const char *outfilename, const char *filename)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Some codecs, such as MPEG, transmit the I- and P-frame with a
|
/* some codecs, such as MPEG, transmit the I and P frame with a
|
||||||
latency of one frame. You must do the following to have a
|
latency of one frame. You must do the following to have a
|
||||||
chance to get the last frame of the video. */
|
chance to get the last frame of the video */
|
||||||
avpkt.data = NULL;
|
avpkt.data = NULL;
|
||||||
avpkt.size = 0;
|
avpkt.size = 0;
|
||||||
decode_write_frame(outfilename, c, frame, &frame_count, &avpkt, 1);
|
decode_write_frame(outfilename, c, frame, &frame_count, &avpkt, 1);
|
||||||
|
|||||||
@@ -55,11 +55,17 @@ static AVPacket pkt;
|
|||||||
static int video_frame_count = 0;
|
static int video_frame_count = 0;
|
||||||
static int audio_frame_count = 0;
|
static int audio_frame_count = 0;
|
||||||
|
|
||||||
/* Enable or disable frame reference counting. You are not supposed to support
|
/* The different ways of decoding and managing data memory. You are not
|
||||||
* both paths in your application but pick the one most appropriate to your
|
* supposed to support all the modes in your application but pick the one most
|
||||||
* needs. Look for the use of refcount in this example to see what are the
|
* appropriate to your needs. Look for the use of api_mode in this example to
|
||||||
* differences of API usage between them. */
|
* see what are the differences of API usage between them */
|
||||||
static int refcount = 0;
|
enum {
|
||||||
|
API_MODE_OLD = 0, /* old method, deprecated */
|
||||||
|
API_MODE_NEW_API_REF_COUNT = 1, /* new method, using the frame reference counting */
|
||||||
|
API_MODE_NEW_API_NO_REF_COUNT = 2, /* new method, without reference counting */
|
||||||
|
};
|
||||||
|
|
||||||
|
static int api_mode = API_MODE_OLD;
|
||||||
|
|
||||||
static int decode_packet(int *got_frame, int cached)
|
static int decode_packet(int *got_frame, int cached)
|
||||||
{
|
{
|
||||||
@@ -75,24 +81,22 @@ static int decode_packet(int *got_frame, int cached)
|
|||||||
fprintf(stderr, "Error decoding video frame (%s)\n", av_err2str(ret));
|
fprintf(stderr, "Error decoding video frame (%s)\n", av_err2str(ret));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
if (video_dec_ctx->width != width || video_dec_ctx->height != height ||
|
||||||
|
video_dec_ctx->pix_fmt != pix_fmt) {
|
||||||
|
/* To handle this change, one could call av_image_alloc again and
|
||||||
|
* decode the following frames into another rawvideo file. */
|
||||||
|
fprintf(stderr, "Error: Width, height and pixel format have to be "
|
||||||
|
"constant in a rawvideo file, but the width, height or "
|
||||||
|
"pixel format of the input video changed:\n"
|
||||||
|
"old: width = %d, height = %d, format = %s\n"
|
||||||
|
"new: width = %d, height = %d, format = %s\n",
|
||||||
|
width, height, av_get_pix_fmt_name(pix_fmt),
|
||||||
|
video_dec_ctx->width, video_dec_ctx->height,
|
||||||
|
av_get_pix_fmt_name(video_dec_ctx->pix_fmt));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (*got_frame) {
|
if (*got_frame) {
|
||||||
|
|
||||||
if (frame->width != width || frame->height != height ||
|
|
||||||
frame->format != pix_fmt) {
|
|
||||||
/* To handle this change, one could call av_image_alloc again and
|
|
||||||
* decode the following frames into another rawvideo file. */
|
|
||||||
fprintf(stderr, "Error: Width, height and pixel format have to be "
|
|
||||||
"constant in a rawvideo file, but the width, height or "
|
|
||||||
"pixel format of the input video changed:\n"
|
|
||||||
"old: width = %d, height = %d, format = %s\n"
|
|
||||||
"new: width = %d, height = %d, format = %s\n",
|
|
||||||
width, height, av_get_pix_fmt_name(pix_fmt),
|
|
||||||
frame->width, frame->height,
|
|
||||||
av_get_pix_fmt_name(frame->format));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("video_frame%s n:%d coded_n:%d pts:%s\n",
|
printf("video_frame%s n:%d coded_n:%d pts:%s\n",
|
||||||
cached ? "(cached)" : "",
|
cached ? "(cached)" : "",
|
||||||
video_frame_count++, frame->coded_picture_number,
|
video_frame_count++, frame->coded_picture_number,
|
||||||
@@ -139,9 +143,9 @@ static int decode_packet(int *got_frame, int cached)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we use frame reference counting, we own the data and need
|
/* If we use the new API with reference counting, we own the data and need
|
||||||
* to de-reference it when we don't use it anymore */
|
* to de-reference it when we don't use it anymore */
|
||||||
if (*got_frame && refcount)
|
if (*got_frame && api_mode == API_MODE_NEW_API_REF_COUNT)
|
||||||
av_frame_unref(frame);
|
av_frame_unref(frame);
|
||||||
|
|
||||||
return decoded;
|
return decoded;
|
||||||
@@ -175,7 +179,8 @@ static int open_codec_context(int *stream_idx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Init the decoders, with or without reference counting */
|
/* Init the decoders, with or without reference counting */
|
||||||
av_dict_set(&opts, "refcounted_frames", refcount ? "1" : "0", 0);
|
if (api_mode == API_MODE_NEW_API_REF_COUNT)
|
||||||
|
av_dict_set(&opts, "refcounted_frames", "1", 0);
|
||||||
if ((ret = avcodec_open2(dec_ctx, dec, &opts)) < 0) {
|
if ((ret = avcodec_open2(dec_ctx, dec, &opts)) < 0) {
|
||||||
fprintf(stderr, "Failed to open %s codec\n",
|
fprintf(stderr, "Failed to open %s codec\n",
|
||||||
av_get_media_type_string(type));
|
av_get_media_type_string(type));
|
||||||
@@ -221,19 +226,28 @@ int main (int argc, char **argv)
|
|||||||
int ret = 0, got_frame;
|
int ret = 0, got_frame;
|
||||||
|
|
||||||
if (argc != 4 && argc != 5) {
|
if (argc != 4 && argc != 5) {
|
||||||
fprintf(stderr, "usage: %s [-refcount] input_file video_output_file audio_output_file\n"
|
fprintf(stderr, "usage: %s [-refcount=<old|new_norefcount|new_refcount>] "
|
||||||
|
"input_file video_output_file audio_output_file\n"
|
||||||
"API example program to show how to read frames from an input file.\n"
|
"API example program to show how to read frames from an input file.\n"
|
||||||
"This program reads frames from a file, decodes them, and writes decoded\n"
|
"This program reads frames from a file, decodes them, and writes decoded\n"
|
||||||
"video frames to a rawvideo file named video_output_file, and decoded\n"
|
"video frames to a rawvideo file named video_output_file, and decoded\n"
|
||||||
"audio frames to a rawaudio file named audio_output_file.\n\n"
|
"audio frames to a rawaudio file named audio_output_file.\n\n"
|
||||||
"If the -refcount option is specified, the program use the\n"
|
"If the -refcount option is specified, the program use the\n"
|
||||||
"reference counting frame system which allows keeping a copy of\n"
|
"reference counting frame system which allows keeping a copy of\n"
|
||||||
"the data for longer than one decode call.\n"
|
"the data for longer than one decode call. If unset, it's using\n"
|
||||||
|
"the classic old method.\n"
|
||||||
"\n", argv[0]);
|
"\n", argv[0]);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (argc == 5 && !strcmp(argv[1], "-refcount")) {
|
if (argc == 5) {
|
||||||
refcount = 1;
|
const char *mode = argv[1] + strlen("-refcount=");
|
||||||
|
if (!strcmp(mode, "old")) api_mode = API_MODE_OLD;
|
||||||
|
else if (!strcmp(mode, "new_norefcount")) api_mode = API_MODE_NEW_API_NO_REF_COUNT;
|
||||||
|
else if (!strcmp(mode, "new_refcount")) api_mode = API_MODE_NEW_API_REF_COUNT;
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "unknow mode '%s'\n", mode);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
argv++;
|
argv++;
|
||||||
}
|
}
|
||||||
src_filename = argv[1];
|
src_filename = argv[1];
|
||||||
@@ -299,7 +313,12 @@ int main (int argc, char **argv)
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
frame = av_frame_alloc();
|
/* When using the new API, you need to use the libavutil/frame.h API, while
|
||||||
|
* the classic frame management is available in libavcodec */
|
||||||
|
if (api_mode == API_MODE_OLD)
|
||||||
|
frame = avcodec_alloc_frame();
|
||||||
|
else
|
||||||
|
frame = av_frame_alloc();
|
||||||
if (!frame) {
|
if (!frame) {
|
||||||
fprintf(stderr, "Could not allocate frame\n");
|
fprintf(stderr, "Could not allocate frame\n");
|
||||||
ret = AVERROR(ENOMEM);
|
ret = AVERROR(ENOMEM);
|
||||||
@@ -326,7 +345,7 @@ int main (int argc, char **argv)
|
|||||||
pkt.data += ret;
|
pkt.data += ret;
|
||||||
pkt.size -= ret;
|
pkt.size -= ret;
|
||||||
} while (pkt.size > 0);
|
} while (pkt.size > 0);
|
||||||
av_packet_unref(&orig_pkt);
|
av_free_packet(&orig_pkt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* flush cached frames */
|
/* flush cached frames */
|
||||||
@@ -376,7 +395,10 @@ end:
|
|||||||
fclose(video_dst_file);
|
fclose(video_dst_file);
|
||||||
if (audio_dst_file)
|
if (audio_dst_file)
|
||||||
fclose(audio_dst_file);
|
fclose(audio_dst_file);
|
||||||
av_frame_free(&frame);
|
if (api_mode == API_MODE_OLD)
|
||||||
|
avcodec_free_frame(&frame);
|
||||||
|
else
|
||||||
|
av_frame_free(&frame);
|
||||||
av_free(video_dst_data[0]);
|
av_free(video_dst_data[0]);
|
||||||
|
|
||||||
return ret < 0;
|
return ret < 0;
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ int main(int argc, char **argv)
|
|||||||
pkt.data += ret;
|
pkt.data += ret;
|
||||||
pkt.size -= ret;
|
pkt.size -= ret;
|
||||||
} while (pkt.size > 0);
|
} while (pkt.size > 0);
|
||||||
av_packet_unref(&orig_pkt);
|
av_free_packet(&orig_pkt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* flush cached frames */
|
/* flush cached frames */
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
#include <libavcodec/avcodec.h>
|
#include <libavcodec/avcodec.h>
|
||||||
#include <libavformat/avformat.h>
|
#include <libavformat/avformat.h>
|
||||||
#include <libavfilter/avfiltergraph.h>
|
#include <libavfilter/avfiltergraph.h>
|
||||||
|
#include <libavfilter/avcodec.h>
|
||||||
#include <libavfilter/buffersink.h>
|
#include <libavfilter/buffersink.h>
|
||||||
#include <libavfilter/buffersrc.h>
|
#include <libavfilter/buffersrc.h>
|
||||||
#include <libavutil/opt.h>
|
#include <libavutil/opt.h>
|
||||||
@@ -65,7 +66,7 @@ static int open_input_file(const char *filename)
|
|||||||
/* select the audio stream */
|
/* select the audio stream */
|
||||||
ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, &dec, 0);
|
ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, &dec, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
av_log(NULL, AV_LOG_ERROR, "Cannot find an audio stream in the input file\n");
|
av_log(NULL, AV_LOG_ERROR, "Cannot find a audio stream in the input file\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
audio_stream_index = ret;
|
audio_stream_index = ret;
|
||||||
@@ -273,10 +274,10 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (packet.size <= 0)
|
if (packet.size <= 0)
|
||||||
av_packet_unref(&packet0);
|
av_free_packet(&packet0);
|
||||||
} else {
|
} else {
|
||||||
/* discard non-wanted packets */
|
/* discard non-wanted packets */
|
||||||
av_packet_unref(&packet0);
|
av_free_packet(&packet0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end:
|
end:
|
||||||
|
|||||||
@@ -33,14 +33,12 @@
|
|||||||
#include <libavcodec/avcodec.h>
|
#include <libavcodec/avcodec.h>
|
||||||
#include <libavformat/avformat.h>
|
#include <libavformat/avformat.h>
|
||||||
#include <libavfilter/avfiltergraph.h>
|
#include <libavfilter/avfiltergraph.h>
|
||||||
|
#include <libavfilter/avcodec.h>
|
||||||
#include <libavfilter/buffersink.h>
|
#include <libavfilter/buffersink.h>
|
||||||
#include <libavfilter/buffersrc.h>
|
#include <libavfilter/buffersrc.h>
|
||||||
#include <libavutil/opt.h>
|
#include <libavutil/opt.h>
|
||||||
|
|
||||||
const char *filter_descr = "scale=78:24,transpose=cclock";
|
const char *filter_descr = "scale=78:24";
|
||||||
/* other way:
|
|
||||||
scale=78:24 [scl]; [scl] transpose=cclock // assumes "[in]" and "[out]" to be input output pads respectively
|
|
||||||
*/
|
|
||||||
|
|
||||||
static AVFormatContext *fmt_ctx;
|
static AVFormatContext *fmt_ctx;
|
||||||
static AVCodecContext *dec_ctx;
|
static AVCodecContext *dec_ctx;
|
||||||
@@ -262,7 +260,7 @@ int main(int argc, char **argv)
|
|||||||
av_frame_unref(frame);
|
av_frame_unref(frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
av_packet_unref(&packet);
|
av_free_packet(&packet);
|
||||||
}
|
}
|
||||||
end:
|
end:
|
||||||
avfilter_graph_free(&filter_graph);
|
avfilter_graph_free(&filter_graph);
|
||||||
|
|||||||
@@ -1,155 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 Stephan Holljes
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* libavformat multi-client network API usage example.
|
|
||||||
*
|
|
||||||
* @example http_multiclient.c
|
|
||||||
* This example will serve a file without decoding or demuxing it over http.
|
|
||||||
* Multiple clients can connect and will receive the same file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <libavformat/avformat.h>
|
|
||||||
#include <libavutil/opt.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
void process_client(AVIOContext *client, const char *in_uri)
|
|
||||||
{
|
|
||||||
AVIOContext *input = NULL;
|
|
||||||
uint8_t buf[1024];
|
|
||||||
int ret, n, reply_code;
|
|
||||||
char *resource = NULL;
|
|
||||||
while ((ret = avio_handshake(client)) > 0) {
|
|
||||||
av_opt_get(client, "resource", AV_OPT_SEARCH_CHILDREN, &resource);
|
|
||||||
// check for strlen(resource) is necessary, because av_opt_get()
|
|
||||||
// may return empty string.
|
|
||||||
if (resource && strlen(resource))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (ret < 0)
|
|
||||||
goto end;
|
|
||||||
av_log(client, AV_LOG_TRACE, "resource=%p\n", resource);
|
|
||||||
if (resource && resource[0] == '/' && !strcmp((resource + 1), in_uri)) {
|
|
||||||
reply_code = 200;
|
|
||||||
} else {
|
|
||||||
reply_code = AVERROR_HTTP_NOT_FOUND;
|
|
||||||
}
|
|
||||||
if ((ret = av_opt_set_int(client, "reply_code", reply_code, AV_OPT_SEARCH_CHILDREN)) < 0) {
|
|
||||||
av_log(client, AV_LOG_ERROR, "Failed to set reply_code: %s.\n", av_err2str(ret));
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
av_log(client, AV_LOG_TRACE, "Set reply code to %d\n", reply_code);
|
|
||||||
|
|
||||||
while ((ret = avio_handshake(client)) > 0);
|
|
||||||
|
|
||||||
if (ret < 0)
|
|
||||||
goto end;
|
|
||||||
|
|
||||||
fprintf(stderr, "Handshake performed.\n");
|
|
||||||
if (reply_code != 200)
|
|
||||||
goto end;
|
|
||||||
fprintf(stderr, "Opening input file.\n");
|
|
||||||
if ((ret = avio_open2(&input, in_uri, AVIO_FLAG_READ, NULL, NULL)) < 0) {
|
|
||||||
av_log(input, AV_LOG_ERROR, "Failed to open input: %s: %s.\n", in_uri,
|
|
||||||
av_err2str(ret));
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
for(;;) {
|
|
||||||
n = avio_read(input, buf, sizeof(buf));
|
|
||||||
if (n < 0) {
|
|
||||||
if (n == AVERROR_EOF)
|
|
||||||
break;
|
|
||||||
av_log(input, AV_LOG_ERROR, "Error reading from input: %s.\n",
|
|
||||||
av_err2str(n));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
avio_write(client, buf, n);
|
|
||||||
avio_flush(client);
|
|
||||||
}
|
|
||||||
end:
|
|
||||||
fprintf(stderr, "Flushing client\n");
|
|
||||||
avio_flush(client);
|
|
||||||
fprintf(stderr, "Closing client\n");
|
|
||||||
avio_close(client);
|
|
||||||
fprintf(stderr, "Closing input\n");
|
|
||||||
avio_close(input);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
av_log_set_level(AV_LOG_TRACE);
|
|
||||||
AVDictionary *options = NULL;
|
|
||||||
AVIOContext *client = NULL, *server = NULL;
|
|
||||||
const char *in_uri, *out_uri;
|
|
||||||
int ret, pid;
|
|
||||||
if (argc < 3) {
|
|
||||||
printf("usage: %s input http://hostname[:port]\n"
|
|
||||||
"API example program to serve http to multiple clients.\n"
|
|
||||||
"\n", argv[0]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
in_uri = argv[1];
|
|
||||||
out_uri = argv[2];
|
|
||||||
|
|
||||||
av_register_all();
|
|
||||||
avformat_network_init();
|
|
||||||
|
|
||||||
if ((ret = av_dict_set(&options, "listen", "2", 0)) < 0) {
|
|
||||||
fprintf(stderr, "Failed to set listen mode for server: %s\n", av_err2str(ret));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
if ((ret = avio_open2(&server, out_uri, AVIO_FLAG_WRITE, NULL, &options)) < 0) {
|
|
||||||
fprintf(stderr, "Failed to open server: %s\n", av_err2str(ret));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
fprintf(stderr, "Entering main loop.\n");
|
|
||||||
for(;;) {
|
|
||||||
if ((ret = avio_accept(server, &client)) < 0)
|
|
||||||
goto end;
|
|
||||||
fprintf(stderr, "Accepted client, forking process.\n");
|
|
||||||
// XXX: Since we don't reap our children and don't ignore signals
|
|
||||||
// this produces zombie processes.
|
|
||||||
pid = fork();
|
|
||||||
if (pid < 0) {
|
|
||||||
perror("Fork failed");
|
|
||||||
ret = AVERROR(errno);
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
if (pid == 0) {
|
|
||||||
fprintf(stderr, "In child.\n");
|
|
||||||
process_client(client, in_uri);
|
|
||||||
avio_close(server);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
if (pid > 0)
|
|
||||||
avio_close(client);
|
|
||||||
}
|
|
||||||
end:
|
|
||||||
avio_close(server);
|
|
||||||
if (ret < 0 && ret != AVERROR_EOF) {
|
|
||||||
fprintf(stderr, "Some errors occurred: %s\n", av_err2str(ret));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -52,7 +52,6 @@
|
|||||||
// a wrapper around a single output AVStream
|
// a wrapper around a single output AVStream
|
||||||
typedef struct OutputStream {
|
typedef struct OutputStream {
|
||||||
AVStream *st;
|
AVStream *st;
|
||||||
AVCodecContext *enc;
|
|
||||||
|
|
||||||
/* pts of the next frame that will be generated */
|
/* pts of the next frame that will be generated */
|
||||||
int64_t next_pts;
|
int64_t next_pts;
|
||||||
@@ -105,18 +104,13 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ost->st = avformat_new_stream(oc, NULL);
|
ost->st = avformat_new_stream(oc, *codec);
|
||||||
if (!ost->st) {
|
if (!ost->st) {
|
||||||
fprintf(stderr, "Could not allocate stream\n");
|
fprintf(stderr, "Could not allocate stream\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
ost->st->id = oc->nb_streams-1;
|
ost->st->id = oc->nb_streams-1;
|
||||||
c = avcodec_alloc_context3(*codec);
|
c = ost->st->codec;
|
||||||
if (!c) {
|
|
||||||
fprintf(stderr, "Could not alloc an encoding context\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
ost->enc = c;
|
|
||||||
|
|
||||||
switch ((*codec)->type) {
|
switch ((*codec)->type) {
|
||||||
case AVMEDIA_TYPE_AUDIO:
|
case AVMEDIA_TYPE_AUDIO:
|
||||||
@@ -161,7 +155,7 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
|
|||||||
c->gop_size = 12; /* emit one intra frame every twelve frames at most */
|
c->gop_size = 12; /* emit one intra frame every twelve frames at most */
|
||||||
c->pix_fmt = STREAM_PIX_FMT;
|
c->pix_fmt = STREAM_PIX_FMT;
|
||||||
if (c->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
|
if (c->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
|
||||||
/* just for testing, we also add B-frames */
|
/* just for testing, we also add B frames */
|
||||||
c->max_b_frames = 2;
|
c->max_b_frames = 2;
|
||||||
}
|
}
|
||||||
if (c->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
|
if (c->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
|
||||||
@@ -178,7 +172,7 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
|
|||||||
|
|
||||||
/* Some formats want stream headers to be separate. */
|
/* Some formats want stream headers to be separate. */
|
||||||
if (oc->oformat->flags & AVFMT_GLOBALHEADER)
|
if (oc->oformat->flags & AVFMT_GLOBALHEADER)
|
||||||
c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
|
c->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************/
|
/**************************************************************/
|
||||||
@@ -219,7 +213,7 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, A
|
|||||||
int ret;
|
int ret;
|
||||||
AVDictionary *opt = NULL;
|
AVDictionary *opt = NULL;
|
||||||
|
|
||||||
c = ost->enc;
|
c = ost->st->codec;
|
||||||
|
|
||||||
/* open it */
|
/* open it */
|
||||||
av_dict_copy(&opt, opt_arg, 0);
|
av_dict_copy(&opt, opt_arg, 0);
|
||||||
@@ -236,7 +230,7 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, A
|
|||||||
/* increment frequency by 110 Hz per second */
|
/* increment frequency by 110 Hz per second */
|
||||||
ost->tincr2 = 2 * M_PI * 110.0 / c->sample_rate / c->sample_rate;
|
ost->tincr2 = 2 * M_PI * 110.0 / c->sample_rate / c->sample_rate;
|
||||||
|
|
||||||
if (c->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE)
|
if (c->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)
|
||||||
nb_samples = 10000;
|
nb_samples = 10000;
|
||||||
else
|
else
|
||||||
nb_samples = c->frame_size;
|
nb_samples = c->frame_size;
|
||||||
@@ -246,13 +240,6 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, A
|
|||||||
ost->tmp_frame = alloc_audio_frame(AV_SAMPLE_FMT_S16, c->channel_layout,
|
ost->tmp_frame = alloc_audio_frame(AV_SAMPLE_FMT_S16, c->channel_layout,
|
||||||
c->sample_rate, nb_samples);
|
c->sample_rate, nb_samples);
|
||||||
|
|
||||||
/* copy the stream parameters to the muxer */
|
|
||||||
ret = avcodec_parameters_from_context(ost->st->codecpar, c);
|
|
||||||
if (ret < 0) {
|
|
||||||
fprintf(stderr, "Could not copy the stream parameters\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create resampler context */
|
/* create resampler context */
|
||||||
ost->swr_ctx = swr_alloc();
|
ost->swr_ctx = swr_alloc();
|
||||||
if (!ost->swr_ctx) {
|
if (!ost->swr_ctx) {
|
||||||
@@ -284,13 +271,13 @@ static AVFrame *get_audio_frame(OutputStream *ost)
|
|||||||
int16_t *q = (int16_t*)frame->data[0];
|
int16_t *q = (int16_t*)frame->data[0];
|
||||||
|
|
||||||
/* check if we want to generate more frames */
|
/* check if we want to generate more frames */
|
||||||
if (av_compare_ts(ost->next_pts, ost->enc->time_base,
|
if (av_compare_ts(ost->next_pts, ost->st->codec->time_base,
|
||||||
STREAM_DURATION, (AVRational){ 1, 1 }) >= 0)
|
STREAM_DURATION, (AVRational){ 1, 1 }) >= 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for (j = 0; j <frame->nb_samples; j++) {
|
for (j = 0; j <frame->nb_samples; j++) {
|
||||||
v = (int)(sin(ost->t) * 10000);
|
v = (int)(sin(ost->t) * 10000);
|
||||||
for (i = 0; i < ost->enc->channels; i++)
|
for (i = 0; i < ost->st->codec->channels; i++)
|
||||||
*q++ = v;
|
*q++ = v;
|
||||||
ost->t += ost->tincr;
|
ost->t += ost->tincr;
|
||||||
ost->tincr += ost->tincr2;
|
ost->tincr += ost->tincr2;
|
||||||
@@ -316,7 +303,7 @@ static int write_audio_frame(AVFormatContext *oc, OutputStream *ost)
|
|||||||
int dst_nb_samples;
|
int dst_nb_samples;
|
||||||
|
|
||||||
av_init_packet(&pkt);
|
av_init_packet(&pkt);
|
||||||
c = ost->enc;
|
c = ost->st->codec;
|
||||||
|
|
||||||
frame = get_audio_frame(ost);
|
frame = get_audio_frame(ost);
|
||||||
|
|
||||||
@@ -396,7 +383,7 @@ static AVFrame *alloc_picture(enum AVPixelFormat pix_fmt, int width, int height)
|
|||||||
static void open_video(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg)
|
static void open_video(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
AVCodecContext *c = ost->enc;
|
AVCodecContext *c = ost->st->codec;
|
||||||
AVDictionary *opt = NULL;
|
AVDictionary *opt = NULL;
|
||||||
|
|
||||||
av_dict_copy(&opt, opt_arg, 0);
|
av_dict_copy(&opt, opt_arg, 0);
|
||||||
@@ -427,13 +414,6 @@ static void open_video(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, A
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy the stream parameters to the muxer */
|
|
||||||
ret = avcodec_parameters_from_context(ost->st->codecpar, c);
|
|
||||||
if (ret < 0) {
|
|
||||||
fprintf(stderr, "Could not copy the stream parameters\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prepare a dummy image. */
|
/* Prepare a dummy image. */
|
||||||
@@ -468,10 +448,10 @@ static void fill_yuv_image(AVFrame *pict, int frame_index,
|
|||||||
|
|
||||||
static AVFrame *get_video_frame(OutputStream *ost)
|
static AVFrame *get_video_frame(OutputStream *ost)
|
||||||
{
|
{
|
||||||
AVCodecContext *c = ost->enc;
|
AVCodecContext *c = ost->st->codec;
|
||||||
|
|
||||||
/* check if we want to generate more frames */
|
/* check if we want to generate more frames */
|
||||||
if (av_compare_ts(ost->next_pts, c->time_base,
|
if (av_compare_ts(ost->next_pts, ost->st->codec->time_base,
|
||||||
STREAM_DURATION, (AVRational){ 1, 1 }) >= 0)
|
STREAM_DURATION, (AVRational){ 1, 1 }) >= 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -513,25 +493,44 @@ static int write_video_frame(AVFormatContext *oc, OutputStream *ost)
|
|||||||
AVCodecContext *c;
|
AVCodecContext *c;
|
||||||
AVFrame *frame;
|
AVFrame *frame;
|
||||||
int got_packet = 0;
|
int got_packet = 0;
|
||||||
AVPacket pkt = { 0 };
|
|
||||||
|
|
||||||
c = ost->enc;
|
c = ost->st->codec;
|
||||||
|
|
||||||
frame = get_video_frame(ost);
|
frame = get_video_frame(ost);
|
||||||
|
|
||||||
av_init_packet(&pkt);
|
if (oc->oformat->flags & AVFMT_RAWPICTURE) {
|
||||||
|
/* a hack to avoid data copy with some raw video muxers */
|
||||||
|
AVPacket pkt;
|
||||||
|
av_init_packet(&pkt);
|
||||||
|
|
||||||
/* encode the image */
|
if (!frame)
|
||||||
ret = avcodec_encode_video2(c, &pkt, frame, &got_packet);
|
return 1;
|
||||||
if (ret < 0) {
|
|
||||||
fprintf(stderr, "Error encoding video frame: %s\n", av_err2str(ret));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (got_packet) {
|
pkt.flags |= AV_PKT_FLAG_KEY;
|
||||||
ret = write_frame(oc, &c->time_base, ost->st, &pkt);
|
pkt.stream_index = ost->st->index;
|
||||||
|
pkt.data = (uint8_t *)frame;
|
||||||
|
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 {
|
} else {
|
||||||
ret = 0;
|
AVPacket pkt = { 0 };
|
||||||
|
av_init_packet(&pkt);
|
||||||
|
|
||||||
|
/* encode the image */
|
||||||
|
ret = avcodec_encode_video2(c, &pkt, frame, &got_packet);
|
||||||
|
if (ret < 0) {
|
||||||
|
fprintf(stderr, "Error encoding video frame: %s\n", av_err2str(ret));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (got_packet) {
|
||||||
|
ret = write_frame(oc, &c->time_base, ost->st, &pkt);
|
||||||
|
} else {
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
@@ -544,7 +543,7 @@ static int write_video_frame(AVFormatContext *oc, OutputStream *ost)
|
|||||||
|
|
||||||
static void close_stream(AVFormatContext *oc, OutputStream *ost)
|
static void close_stream(AVFormatContext *oc, OutputStream *ost)
|
||||||
{
|
{
|
||||||
avcodec_free_context(&ost->enc);
|
avcodec_close(ost->st->codec);
|
||||||
av_frame_free(&ost->frame);
|
av_frame_free(&ost->frame);
|
||||||
av_frame_free(&ost->tmp_frame);
|
av_frame_free(&ost->tmp_frame);
|
||||||
sws_freeContext(ost->sws_ctx);
|
sws_freeContext(ost->sws_ctx);
|
||||||
@@ -565,7 +564,6 @@ int main(int argc, char **argv)
|
|||||||
int have_video = 0, have_audio = 0;
|
int have_video = 0, have_audio = 0;
|
||||||
int encode_video = 0, encode_audio = 0;
|
int encode_video = 0, encode_audio = 0;
|
||||||
AVDictionary *opt = NULL;
|
AVDictionary *opt = NULL;
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Initialize libavcodec, and register all codecs and formats. */
|
/* Initialize libavcodec, and register all codecs and formats. */
|
||||||
av_register_all();
|
av_register_all();
|
||||||
@@ -582,9 +580,8 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
filename = argv[1];
|
filename = argv[1];
|
||||||
for (i = 2; i+1 < argc; i+=2) {
|
if (argc > 3 && !strcmp(argv[2], "-flags")) {
|
||||||
if (!strcmp(argv[i], "-flags") || !strcmp(argv[i], "-fflags"))
|
av_dict_set(&opt, argv[2]+1, argv[3], 0);
|
||||||
av_dict_set(&opt, argv[i]+1, argv[i+1], 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allocate the output media context */
|
/* allocate the output media context */
|
||||||
@@ -642,8 +639,8 @@ int main(int argc, char **argv)
|
|||||||
while (encode_video || encode_audio) {
|
while (encode_video || encode_audio) {
|
||||||
/* select the stream to encode */
|
/* select the stream to encode */
|
||||||
if (encode_video &&
|
if (encode_video &&
|
||||||
(!encode_audio || av_compare_ts(video_st.next_pts, video_st.enc->time_base,
|
(!encode_audio || av_compare_ts(video_st.next_pts, video_st.st->codec->time_base,
|
||||||
audio_st.next_pts, audio_st.enc->time_base) <= 0)) {
|
audio_st.next_pts, audio_st.st->codec->time_base) <= 0)) {
|
||||||
encode_video = !write_video_frame(oc, &video_st);
|
encode_video = !write_video_frame(oc, &video_st);
|
||||||
} else {
|
} else {
|
||||||
encode_audio = !write_audio_frame(oc, &audio_st);
|
encode_audio = !write_audio_frame(oc, &audio_st);
|
||||||
|
|||||||
@@ -116,6 +116,15 @@ fail:
|
|||||||
|
|
||||||
static mfxStatus frame_free(mfxHDL pthis, mfxFrameAllocResponse *resp)
|
static mfxStatus frame_free(mfxHDL pthis, mfxFrameAllocResponse *resp)
|
||||||
{
|
{
|
||||||
|
DecodeContext *decode = pthis;
|
||||||
|
|
||||||
|
if (decode->surfaces)
|
||||||
|
vaDestroySurfaces(decode->va_dpy, decode->surfaces, decode->nb_surfaces);
|
||||||
|
av_freep(&decode->surfaces);
|
||||||
|
av_freep(&decode->surface_ids);
|
||||||
|
av_freep(&decode->surface_used);
|
||||||
|
decode->nb_surfaces = 0;
|
||||||
|
|
||||||
return MFX_ERR_NONE;
|
return MFX_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,16 +144,6 @@ static mfxStatus frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl)
|
|||||||
return MFX_ERR_NONE;
|
return MFX_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_surfaces(DecodeContext *decode)
|
|
||||||
{
|
|
||||||
if (decode->surfaces)
|
|
||||||
vaDestroySurfaces(decode->va_dpy, decode->surfaces, decode->nb_surfaces);
|
|
||||||
av_freep(&decode->surfaces);
|
|
||||||
av_freep(&decode->surface_ids);
|
|
||||||
av_freep(&decode->surface_used);
|
|
||||||
decode->nb_surfaces = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void free_buffer(void *opaque, uint8_t *data)
|
static void free_buffer(void *opaque, uint8_t *data)
|
||||||
{
|
{
|
||||||
int *used = opaque;
|
int *used = opaque;
|
||||||
@@ -352,7 +351,7 @@ int main(int argc, char **argv)
|
|||||||
for (i = 0; i < input_ctx->nb_streams; i++) {
|
for (i = 0; i < input_ctx->nb_streams; i++) {
|
||||||
AVStream *st = input_ctx->streams[i];
|
AVStream *st = input_ctx->streams[i];
|
||||||
|
|
||||||
if (st->codecpar->codec_id == AV_CODEC_ID_H264 && !video_st)
|
if (st->codec->codec_id == AV_CODEC_ID_H264 && !video_st)
|
||||||
video_st = st;
|
video_st = st;
|
||||||
else
|
else
|
||||||
st->discard = AVDISCARD_ALL;
|
st->discard = AVDISCARD_ALL;
|
||||||
@@ -404,16 +403,16 @@ int main(int argc, char **argv)
|
|||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
decoder_ctx->codec_id = AV_CODEC_ID_H264;
|
decoder_ctx->codec_id = AV_CODEC_ID_H264;
|
||||||
if (video_st->codecpar->extradata_size) {
|
if (video_st->codec->extradata_size) {
|
||||||
decoder_ctx->extradata = av_mallocz(video_st->codecpar->extradata_size +
|
decoder_ctx->extradata = av_mallocz(video_st->codec->extradata_size +
|
||||||
AV_INPUT_BUFFER_PADDING_SIZE);
|
FF_INPUT_BUFFER_PADDING_SIZE);
|
||||||
if (!decoder_ctx->extradata) {
|
if (!decoder_ctx->extradata) {
|
||||||
ret = AVERROR(ENOMEM);
|
ret = AVERROR(ENOMEM);
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
memcpy(decoder_ctx->extradata, video_st->codecpar->extradata,
|
memcpy(decoder_ctx->extradata, video_st->codec->extradata,
|
||||||
video_st->codecpar->extradata_size);
|
video_st->codec->extradata_size);
|
||||||
decoder_ctx->extradata_size = video_st->codecpar->extradata_size;
|
decoder_ctx->extradata_size = video_st->codec->extradata_size;
|
||||||
}
|
}
|
||||||
decoder_ctx->refcounted_frames = 1;
|
decoder_ctx->refcounted_frames = 1;
|
||||||
|
|
||||||
@@ -468,12 +467,6 @@ finish:
|
|||||||
|
|
||||||
av_frame_free(&frame);
|
av_frame_free(&frame);
|
||||||
|
|
||||||
if (decoder_ctx)
|
|
||||||
av_freep(&decoder_ctx->hwaccel_context);
|
|
||||||
avcodec_free_context(&decoder_ctx);
|
|
||||||
|
|
||||||
free_surfaces(&decode);
|
|
||||||
|
|
||||||
if (decode.mfx_session)
|
if (decode.mfx_session)
|
||||||
MFXClose(decode.mfx_session);
|
MFXClose(decode.mfx_session);
|
||||||
if (decode.va_dpy)
|
if (decode.va_dpy)
|
||||||
@@ -481,6 +474,10 @@ finish:
|
|||||||
if (dpy)
|
if (dpy)
|
||||||
XCloseDisplay(dpy);
|
XCloseDisplay(dpy);
|
||||||
|
|
||||||
|
if (decoder_ctx)
|
||||||
|
av_freep(&decoder_ctx->hwaccel_context);
|
||||||
|
avcodec_free_context(&decoder_ctx);
|
||||||
|
|
||||||
avio_close(output_ctx);
|
avio_close(output_ctx);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
out_stream->codec->codec_tag = 0;
|
out_stream->codec->codec_tag = 0;
|
||||||
if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
|
if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
|
||||||
out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
|
out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
||||||
}
|
}
|
||||||
av_dump_format(ofmt_ctx, 0, out_filename, 1);
|
av_dump_format(ofmt_ctx, 0, out_filename, 1);
|
||||||
|
|
||||||
@@ -143,7 +143,7 @@ int main(int argc, char **argv)
|
|||||||
fprintf(stderr, "Error muxing packet\n");
|
fprintf(stderr, "Error muxing packet\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
av_packet_unref(&pkt);
|
av_free_packet(&pkt);
|
||||||
}
|
}
|
||||||
|
|
||||||
av_write_trailer(ofmt_ctx);
|
av_write_trailer(ofmt_ctx);
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ static int open_input_file(const char *filename,
|
|||||||
AVFormatContext **input_format_context,
|
AVFormatContext **input_format_context,
|
||||||
AVCodecContext **input_codec_context)
|
AVCodecContext **input_codec_context)
|
||||||
{
|
{
|
||||||
AVCodecContext *avctx;
|
|
||||||
AVCodec *input_codec;
|
AVCodec *input_codec;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
@@ -92,39 +91,23 @@ static int open_input_file(const char *filename,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Find a decoder for the audio stream. */
|
/** Find a decoder for the audio stream. */
|
||||||
if (!(input_codec = avcodec_find_decoder((*input_format_context)->streams[0]->codecpar->codec_id))) {
|
if (!(input_codec = avcodec_find_decoder((*input_format_context)->streams[0]->codec->codec_id))) {
|
||||||
fprintf(stderr, "Could not find input codec\n");
|
fprintf(stderr, "Could not find input codec\n");
|
||||||
avformat_close_input(input_format_context);
|
avformat_close_input(input_format_context);
|
||||||
return AVERROR_EXIT;
|
return AVERROR_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** allocate a new decoding context */
|
|
||||||
avctx = avcodec_alloc_context3(input_codec);
|
|
||||||
if (!avctx) {
|
|
||||||
fprintf(stderr, "Could not allocate a decoding context\n");
|
|
||||||
avformat_close_input(input_format_context);
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** initialize the stream parameters with demuxer information */
|
|
||||||
error = avcodec_parameters_to_context(avctx, (*input_format_context)->streams[0]->codecpar);
|
|
||||||
if (error < 0) {
|
|
||||||
avformat_close_input(input_format_context);
|
|
||||||
avcodec_free_context(&avctx);
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Open the decoder for the audio stream to use it later. */
|
/** Open the decoder for the audio stream to use it later. */
|
||||||
if ((error = avcodec_open2(avctx, input_codec, NULL)) < 0) {
|
if ((error = avcodec_open2((*input_format_context)->streams[0]->codec,
|
||||||
|
input_codec, NULL)) < 0) {
|
||||||
fprintf(stderr, "Could not open input codec (error '%s')\n",
|
fprintf(stderr, "Could not open input codec (error '%s')\n",
|
||||||
get_error_text(error));
|
get_error_text(error));
|
||||||
avcodec_free_context(&avctx);
|
|
||||||
avformat_close_input(input_format_context);
|
avformat_close_input(input_format_context);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Save the decoder context for easier access later. */
|
/** Save the decoder context for easier access later. */
|
||||||
*input_codec_context = avctx;
|
*input_codec_context = (*input_format_context)->streams[0]->codec;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -139,7 +122,6 @@ static int open_output_file(const char *filename,
|
|||||||
AVFormatContext **output_format_context,
|
AVFormatContext **output_format_context,
|
||||||
AVCodecContext **output_codec_context)
|
AVCodecContext **output_codec_context)
|
||||||
{
|
{
|
||||||
AVCodecContext *avctx = NULL;
|
|
||||||
AVIOContext *output_io_context = NULL;
|
AVIOContext *output_io_context = NULL;
|
||||||
AVStream *stream = NULL;
|
AVStream *stream = NULL;
|
||||||
AVCodec *output_codec = NULL;
|
AVCodec *output_codec = NULL;
|
||||||
@@ -179,31 +161,27 @@ static int open_output_file(const char *filename,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Create a new audio stream in the output file container. */
|
/** Create a new audio stream in the output file container. */
|
||||||
if (!(stream = avformat_new_stream(*output_format_context, NULL))) {
|
if (!(stream = avformat_new_stream(*output_format_context, output_codec))) {
|
||||||
fprintf(stderr, "Could not create new stream\n");
|
fprintf(stderr, "Could not create new stream\n");
|
||||||
error = AVERROR(ENOMEM);
|
error = AVERROR(ENOMEM);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
avctx = avcodec_alloc_context3(output_codec);
|
/** Save the encoder context for easier access later. */
|
||||||
if (!avctx) {
|
*output_codec_context = stream->codec;
|
||||||
fprintf(stderr, "Could not allocate an encoding context\n");
|
|
||||||
error = AVERROR(ENOMEM);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the basic encoder parameters.
|
* Set the basic encoder parameters.
|
||||||
* The input file's sample rate is used to avoid a sample rate conversion.
|
* The input file's sample rate is used to avoid a sample rate conversion.
|
||||||
*/
|
*/
|
||||||
avctx->channels = OUTPUT_CHANNELS;
|
(*output_codec_context)->channels = OUTPUT_CHANNELS;
|
||||||
avctx->channel_layout = av_get_default_channel_layout(OUTPUT_CHANNELS);
|
(*output_codec_context)->channel_layout = av_get_default_channel_layout(OUTPUT_CHANNELS);
|
||||||
avctx->sample_rate = input_codec_context->sample_rate;
|
(*output_codec_context)->sample_rate = input_codec_context->sample_rate;
|
||||||
avctx->sample_fmt = output_codec->sample_fmts[0];
|
(*output_codec_context)->sample_fmt = output_codec->sample_fmts[0];
|
||||||
avctx->bit_rate = OUTPUT_BIT_RATE;
|
(*output_codec_context)->bit_rate = OUTPUT_BIT_RATE;
|
||||||
|
|
||||||
/** Allow the use of the experimental AAC encoder */
|
/** Allow the use of the experimental AAC encoder */
|
||||||
avctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
|
(*output_codec_context)->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
|
||||||
|
|
||||||
/** Set the sample rate for the container. */
|
/** Set the sample rate for the container. */
|
||||||
stream->time_base.den = input_codec_context->sample_rate;
|
stream->time_base.den = input_codec_context->sample_rate;
|
||||||
@@ -214,28 +192,18 @@ static int open_output_file(const char *filename,
|
|||||||
* Mark the encoder so that it behaves accordingly.
|
* Mark the encoder so that it behaves accordingly.
|
||||||
*/
|
*/
|
||||||
if ((*output_format_context)->oformat->flags & AVFMT_GLOBALHEADER)
|
if ((*output_format_context)->oformat->flags & AVFMT_GLOBALHEADER)
|
||||||
avctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
|
(*output_codec_context)->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
||||||
|
|
||||||
/** Open the encoder for the audio stream to use it later. */
|
/** Open the encoder for the audio stream to use it later. */
|
||||||
if ((error = avcodec_open2(avctx, output_codec, NULL)) < 0) {
|
if ((error = avcodec_open2(*output_codec_context, output_codec, NULL)) < 0) {
|
||||||
fprintf(stderr, "Could not open output codec (error '%s')\n",
|
fprintf(stderr, "Could not open output codec (error '%s')\n",
|
||||||
get_error_text(error));
|
get_error_text(error));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
error = avcodec_parameters_from_context(stream->codecpar, avctx);
|
|
||||||
if (error < 0) {
|
|
||||||
fprintf(stderr, "Could not initialize stream parameters\n");
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Save the encoder context for easier access later. */
|
|
||||||
*output_codec_context = avctx;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
avcodec_free_context(&avctx);
|
|
||||||
avio_closep(&(*output_format_context)->pb);
|
avio_closep(&(*output_format_context)->pb);
|
||||||
avformat_free_context(*output_format_context);
|
avformat_free_context(*output_format_context);
|
||||||
*output_format_context = NULL;
|
*output_format_context = NULL;
|
||||||
@@ -364,7 +332,7 @@ static int decode_audio_frame(AVFrame *frame,
|
|||||||
data_present, &input_packet)) < 0) {
|
data_present, &input_packet)) < 0) {
|
||||||
fprintf(stderr, "Could not decode frame (error '%s')\n",
|
fprintf(stderr, "Could not decode frame (error '%s')\n",
|
||||||
get_error_text(error));
|
get_error_text(error));
|
||||||
av_packet_unref(&input_packet);
|
av_free_packet(&input_packet);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -374,7 +342,7 @@ static int decode_audio_frame(AVFrame *frame,
|
|||||||
*/
|
*/
|
||||||
if (*finished && *data_present)
|
if (*finished && *data_present)
|
||||||
*finished = 0;
|
*finished = 0;
|
||||||
av_packet_unref(&input_packet);
|
av_free_packet(&input_packet);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -603,7 +571,7 @@ static int encode_audio_frame(AVFrame *frame,
|
|||||||
frame, data_present)) < 0) {
|
frame, data_present)) < 0) {
|
||||||
fprintf(stderr, "Could not encode frame (error '%s')\n",
|
fprintf(stderr, "Could not encode frame (error '%s')\n",
|
||||||
get_error_text(error));
|
get_error_text(error));
|
||||||
av_packet_unref(&output_packet);
|
av_free_packet(&output_packet);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -612,11 +580,11 @@ static int encode_audio_frame(AVFrame *frame,
|
|||||||
if ((error = av_write_frame(output_format_context, &output_packet)) < 0) {
|
if ((error = av_write_frame(output_format_context, &output_packet)) < 0) {
|
||||||
fprintf(stderr, "Could not write frame (error '%s')\n",
|
fprintf(stderr, "Could not write frame (error '%s')\n",
|
||||||
get_error_text(error));
|
get_error_text(error));
|
||||||
av_packet_unref(&output_packet);
|
av_free_packet(&output_packet);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
av_packet_unref(&output_packet);
|
av_free_packet(&output_packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -788,13 +756,13 @@ cleanup:
|
|||||||
av_audio_fifo_free(fifo);
|
av_audio_fifo_free(fifo);
|
||||||
swr_free(&resample_context);
|
swr_free(&resample_context);
|
||||||
if (output_codec_context)
|
if (output_codec_context)
|
||||||
avcodec_free_context(&output_codec_context);
|
avcodec_close(output_codec_context);
|
||||||
if (output_format_context) {
|
if (output_format_context) {
|
||||||
avio_closep(&output_format_context->pb);
|
avio_closep(&output_format_context->pb);
|
||||||
avformat_free_context(output_format_context);
|
avformat_free_context(output_format_context);
|
||||||
}
|
}
|
||||||
if (input_codec_context)
|
if (input_codec_context)
|
||||||
avcodec_free_context(&input_codec_context);
|
avcodec_close(input_codec_context);
|
||||||
if (input_format_context)
|
if (input_format_context)
|
||||||
avformat_close_input(&input_format_context);
|
avformat_close_input(&input_format_context);
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
#include <libavcodec/avcodec.h>
|
#include <libavcodec/avcodec.h>
|
||||||
#include <libavformat/avformat.h>
|
#include <libavformat/avformat.h>
|
||||||
#include <libavfilter/avfiltergraph.h>
|
#include <libavfilter/avfiltergraph.h>
|
||||||
|
#include <libavfilter/avcodec.h>
|
||||||
#include <libavfilter/buffersink.h>
|
#include <libavfilter/buffersink.h>
|
||||||
#include <libavfilter/buffersrc.h>
|
#include <libavfilter/buffersrc.h>
|
||||||
#include <libavutil/opt.h>
|
#include <libavutil/opt.h>
|
||||||
@@ -116,7 +117,7 @@ static int open_output_file(const char *filename)
|
|||||||
/* in this example, we choose transcoding to same codec */
|
/* in this example, we choose transcoding to same codec */
|
||||||
encoder = avcodec_find_encoder(dec_ctx->codec_id);
|
encoder = avcodec_find_encoder(dec_ctx->codec_id);
|
||||||
if (!encoder) {
|
if (!encoder) {
|
||||||
av_log(NULL, AV_LOG_FATAL, "Necessary encoder not found\n");
|
av_log(NULL, AV_LOG_FATAL, "Neccessary encoder not found\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,10 +129,7 @@ static int open_output_file(const char *filename)
|
|||||||
enc_ctx->width = dec_ctx->width;
|
enc_ctx->width = dec_ctx->width;
|
||||||
enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio;
|
enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio;
|
||||||
/* take first format from list of supported formats */
|
/* take first format from list of supported formats */
|
||||||
if (encoder->pix_fmts)
|
enc_ctx->pix_fmt = encoder->pix_fmts[0];
|
||||||
enc_ctx->pix_fmt = encoder->pix_fmts[0];
|
|
||||||
else
|
|
||||||
enc_ctx->pix_fmt = dec_ctx->pix_fmt;
|
|
||||||
/* video time_base can be set to whatever is handy and supported by encoder */
|
/* video time_base can be set to whatever is handy and supported by encoder */
|
||||||
enc_ctx->time_base = dec_ctx->time_base;
|
enc_ctx->time_base = dec_ctx->time_base;
|
||||||
} else {
|
} else {
|
||||||
@@ -163,7 +161,7 @@ static int open_output_file(const char *filename)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
|
if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
|
||||||
enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
|
enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
||||||
|
|
||||||
}
|
}
|
||||||
av_dump_format(ofmt_ctx, 0, filename, 1);
|
av_dump_format(ofmt_ctx, 0, filename, 1);
|
||||||
@@ -451,7 +449,7 @@ static int flush_encoder(unsigned int stream_index)
|
|||||||
int got_frame;
|
int got_frame;
|
||||||
|
|
||||||
if (!(ofmt_ctx->streams[stream_index]->codec->codec->capabilities &
|
if (!(ofmt_ctx->streams[stream_index]->codec->codec->capabilities &
|
||||||
AV_CODEC_CAP_DELAY))
|
CODEC_CAP_DELAY))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
@@ -539,7 +537,7 @@ int main(int argc, char **argv)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
av_packet_unref(&packet);
|
av_free_packet(&packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* flush filters and encoders */
|
/* flush filters and encoders */
|
||||||
@@ -563,7 +561,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
av_write_trailer(ofmt_ctx);
|
av_write_trailer(ofmt_ctx);
|
||||||
end:
|
end:
|
||||||
av_packet_unref(&packet);
|
av_free_packet(&packet);
|
||||||
av_frame_free(&frame);
|
av_frame_free(&frame);
|
||||||
for (i = 0; i < ifmt_ctx->nb_streams; i++) {
|
for (i = 0; i < ifmt_ctx->nb_streams; i++) {
|
||||||
avcodec_close(ifmt_ctx->streams[i]->codec);
|
avcodec_close(ifmt_ctx->streams[i]->codec);
|
||||||
|
|||||||
20
doc/faq.texi
20
doc/faq.texi
@@ -147,7 +147,7 @@ exec /usr/bin/pkg-config "$@@"
|
|||||||
|
|
||||||
Try a @code{make distclean} in the ffmpeg source directory before the build.
|
Try a @code{make distclean} in the ffmpeg source directory before the build.
|
||||||
If this does not help see
|
If this does not help see
|
||||||
(@url{https://ffmpeg.org/bugreports.html}).
|
(@url{http://ffmpeg.org/bugreports.html}).
|
||||||
|
|
||||||
@section How do I encode single pictures into movies?
|
@section How do I encode single pictures into movies?
|
||||||
|
|
||||||
@@ -311,18 +311,18 @@ invoking ffmpeg with several @option{-i} options.
|
|||||||
For audio, to put all channels together in a single stream (example: two
|
For audio, to put all channels together in a single stream (example: two
|
||||||
mono streams into one stereo stream): this is sometimes called to
|
mono streams into one stereo stream): this is sometimes called to
|
||||||
@emph{merge} them, and can be done using the
|
@emph{merge} them, and can be done using the
|
||||||
@url{https://ffmpeg.org/ffmpeg-filters.html#amerge, @code{amerge}} filter.
|
@url{http://ffmpeg.org/ffmpeg-filters.html#amerge, @code{amerge}} filter.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
For audio, to play one on top of the other: this is called to @emph{mix}
|
For audio, to play one on top of the other: this is called to @emph{mix}
|
||||||
them, and can be done by first merging them into a single stream and then
|
them, and can be done by first merging them into a single stream and then
|
||||||
using the @url{https://ffmpeg.org/ffmpeg-filters.html#pan, @code{pan}} filter to mix
|
using the @url{http://ffmpeg.org/ffmpeg-filters.html#pan, @code{pan}} filter to mix
|
||||||
the channels at will.
|
the channels at will.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
For video, to display both together, side by side or one on top of a part of
|
For video, to display both together, side by side or one on top of a part of
|
||||||
the other; it can be done using the
|
the other; it can be done using the
|
||||||
@url{https://ffmpeg.org/ffmpeg-filters.html#overlay, @code{overlay}} video filter.
|
@url{http://ffmpeg.org/ffmpeg-filters.html#overlay, @code{overlay}} video filter.
|
||||||
|
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
@@ -333,23 +333,23 @@ There are several solutions, depending on the exact circumstances.
|
|||||||
|
|
||||||
@subsection Concatenating using the concat @emph{filter}
|
@subsection Concatenating using the concat @emph{filter}
|
||||||
|
|
||||||
FFmpeg has a @url{https://ffmpeg.org/ffmpeg-filters.html#concat,
|
FFmpeg has a @url{http://ffmpeg.org/ffmpeg-filters.html#concat,
|
||||||
@code{concat}} filter designed specifically for that, with examples in the
|
@code{concat}} filter designed specifically for that, with examples in the
|
||||||
documentation. This operation is recommended if you need to re-encode.
|
documentation. This operation is recommended if you need to re-encode.
|
||||||
|
|
||||||
@subsection Concatenating using the concat @emph{demuxer}
|
@subsection Concatenating using the concat @emph{demuxer}
|
||||||
|
|
||||||
FFmpeg has a @url{https://www.ffmpeg.org/ffmpeg-formats.html#concat,
|
FFmpeg has a @url{http://www.ffmpeg.org/ffmpeg-formats.html#concat,
|
||||||
@code{concat}} demuxer which you can use when you want to avoid a re-encode and
|
@code{concat}} demuxer which you can use when you want to avoid a re-encode and
|
||||||
your format doesn't support file level concatenation.
|
your format doesn't support file level concatenation.
|
||||||
|
|
||||||
@subsection Concatenating using the concat @emph{protocol} (file level)
|
@subsection Concatenating using the concat @emph{protocol} (file level)
|
||||||
|
|
||||||
FFmpeg has a @url{https://ffmpeg.org/ffmpeg-protocols.html#concat,
|
FFmpeg has a @url{http://ffmpeg.org/ffmpeg-protocols.html#concat,
|
||||||
@code{concat}} protocol designed specifically for that, with examples in the
|
@code{concat}} protocol designed specifically for that, with examples in the
|
||||||
documentation.
|
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.
|
video by merely concatenating the files containing them.
|
||||||
|
|
||||||
Hence you may concatenate your multimedia files by first transcoding them to
|
Hence you may concatenate your multimedia files by first transcoding them to
|
||||||
@@ -485,7 +485,7 @@ scaling adjusts the SAR to keep the DAR constant.
|
|||||||
|
|
||||||
If you want to stretch, or “unstretch”, the image, you need to override the
|
If you want to stretch, or “unstretch”, the image, you need to override the
|
||||||
information with the
|
information with the
|
||||||
@url{https://ffmpeg.org/ffmpeg-filters.html#setdar_002c-setsar, @code{setdar or setsar filters}}.
|
@url{http://ffmpeg.org/ffmpeg-filters.html#setdar_002c-setsar, @code{setdar or setsar filters}}.
|
||||||
|
|
||||||
Do not forget to examine carefully the original video to check whether the
|
Do not forget to examine carefully the original video to check whether the
|
||||||
stretching comes from the image or from the aspect ratio information.
|
stretching comes from the image or from the aspect ratio information.
|
||||||
@@ -589,7 +589,7 @@ see @file{libavformat/aviobuf.c} in FFmpeg and @file{libmpdemux/demux_lavf.c} in
|
|||||||
|
|
||||||
@section Where is the documentation about ffv1, msmpeg4, asv1, 4xm?
|
@section Where is the documentation about ffv1, msmpeg4, asv1, 4xm?
|
||||||
|
|
||||||
see @url{https://www.ffmpeg.org/~michael/}
|
see @url{http://www.ffmpeg.org/~michael/}
|
||||||
|
|
||||||
@section How do I feed H.263-RTP (and other codecs in RTP) to libavcodec?
|
@section How do I feed H.263-RTP (and other codecs in RTP) to libavcodec?
|
||||||
|
|
||||||
|
|||||||
@@ -13,36 +13,36 @@
|
|||||||
|
|
||||||
@chapter Introduction
|
@chapter Introduction
|
||||||
|
|
||||||
FATE is an extended regression suite on the client-side and a means
|
FATE is an extended regression suite on the client-side and a means
|
||||||
for results aggregation and presentation on the server-side.
|
for results aggregation and presentation on the server-side.
|
||||||
|
|
||||||
The first part of this document explains how you can use FATE from
|
The first part of this document explains how you can use FATE from
|
||||||
your FFmpeg source directory to test your ffmpeg binary. The second
|
your FFmpeg source directory to test your ffmpeg binary. The second
|
||||||
part describes how you can run FATE to submit the results to FFmpeg's
|
part describes how you can run FATE to submit the results to FFmpeg's
|
||||||
FATE server.
|
FATE server.
|
||||||
|
|
||||||
In any way you can have a look at the publicly viewable FATE results
|
In any way you can have a look at the publicly viewable FATE results
|
||||||
by visiting this website:
|
by visiting this website:
|
||||||
|
|
||||||
@url{http://fate.ffmpeg.org/}
|
@url{http://fate.ffmpeg.org/}
|
||||||
|
|
||||||
This is especially recommended for all people contributing source
|
This is especially recommended for all people contributing source
|
||||||
code to FFmpeg, as it can be seen if some test on some platform broke
|
code to FFmpeg, as it can be seen if some test on some platform broke
|
||||||
with their recent contribution. This usually happens on the platforms
|
with their recent contribution. This usually happens on the platforms
|
||||||
the developers could not test on.
|
the developers could not test on.
|
||||||
|
|
||||||
The second part of this document describes how you can run FATE to
|
The second part of this document describes how you can run FATE to
|
||||||
submit your results to FFmpeg's FATE server. If you want to submit your
|
submit your results to FFmpeg's FATE server. If you want to submit your
|
||||||
results be sure to check that your combination of CPU, OS and compiler
|
results be sure to check that your combination of CPU, OS and compiler
|
||||||
is not already listed on the above mentioned website.
|
is not already listed on the above mentioned website.
|
||||||
|
|
||||||
In the third part you can find a comprehensive listing of FATE makefile
|
In the third part you can find a comprehensive listing of FATE makefile
|
||||||
targets and variables.
|
targets and variables.
|
||||||
|
|
||||||
|
|
||||||
@chapter Using FATE from your FFmpeg source directory
|
@chapter Using FATE from your FFmpeg source directory
|
||||||
|
|
||||||
If you want to run FATE on your machine you need to have the samples
|
If you want to run FATE on your machine you need to have the samples
|
||||||
in place. You can get the samples via the build target fate-rsync.
|
in place. You can get the samples via the build target fate-rsync.
|
||||||
Use this command from the top-level source directory:
|
Use this command from the top-level source directory:
|
||||||
|
|
||||||
@@ -51,11 +51,11 @@ make fate-rsync SAMPLES=fate-suite/
|
|||||||
make fate SAMPLES=fate-suite/
|
make fate SAMPLES=fate-suite/
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
The above commands set the samples location by passing a makefile
|
The above commands set the samples location by passing a makefile
|
||||||
variable via command line. It is also possible to set the samples
|
variable via command line. It is also possible to set the samples
|
||||||
location at source configuration time by invoking configure with
|
location at source configuration time by invoking configure with
|
||||||
@option{--samples=<path to the samples directory>}. Afterwards you can
|
`--samples=<path to the samples directory>'. Afterwards you can
|
||||||
invoke the makefile targets without setting the @var{SAMPLES} makefile
|
invoke the makefile targets without setting the SAMPLES makefile
|
||||||
variable. This is illustrated by the following commands:
|
variable. This is illustrated by the following commands:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
@@ -64,7 +64,7 @@ make fate-rsync
|
|||||||
make fate
|
make fate
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Yet another way to tell FATE about the location of the sample
|
Yet another way to tell FATE about the location of the sample
|
||||||
directory is by making sure the environment variable FATE_SAMPLES
|
directory is by making sure the environment variable FATE_SAMPLES
|
||||||
contains the path to your samples directory. This can be achieved
|
contains the path to your samples directory. This can be achieved
|
||||||
by e.g. putting that variable in your shell profile or by setting
|
by e.g. putting that variable in your shell profile or by setting
|
||||||
@@ -85,7 +85,7 @@ To use a custom wrapper to run the test, pass @option{--target-exec} to
|
|||||||
|
|
||||||
@chapter Submitting the results to the FFmpeg result aggregation server
|
@chapter Submitting the results to the FFmpeg result aggregation server
|
||||||
|
|
||||||
To submit your results to the server you should run fate through the
|
To submit your results to the server you should run fate through the
|
||||||
shell script @file{tests/fate.sh} from the FFmpeg sources. This script needs
|
shell script @file{tests/fate.sh} from the FFmpeg sources. This script needs
|
||||||
to be invoked with a configuration file as its first argument.
|
to be invoked with a configuration file as its first argument.
|
||||||
|
|
||||||
@@ -93,23 +93,23 @@ to be invoked with a configuration file as its first argument.
|
|||||||
tests/fate.sh /path/to/fate_config
|
tests/fate.sh /path/to/fate_config
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
A configuration file template with comments describing the individual
|
A configuration file template with comments describing the individual
|
||||||
configuration variables can be found at @file{doc/fate_config.sh.template}.
|
configuration variables can be found at @file{doc/fate_config.sh.template}.
|
||||||
|
|
||||||
@ifhtml
|
@ifhtml
|
||||||
The mentioned configuration template is also available here:
|
The mentioned configuration template is also available here:
|
||||||
@verbatiminclude fate_config.sh.template
|
@verbatiminclude fate_config.sh.template
|
||||||
@end ifhtml
|
@end ifhtml
|
||||||
|
|
||||||
Create a configuration that suits your needs, based on the configuration
|
Create a configuration that suits your needs, based on the configuration
|
||||||
template. The @env{slot} configuration variable can be any string that is not
|
template. The `slot' configuration variable can be any string that is not
|
||||||
yet used, but it is suggested that you name it adhering to the following
|
yet used, but it is suggested that you name it adhering to the following
|
||||||
pattern @samp{@var{arch}-@var{os}-@var{compiler}-@var{compiler version}}. The
|
pattern <arch>-<os>-<compiler>-<compiler version>. The configuration file
|
||||||
configuration file itself will be sourced in a shell script, therefore all
|
itself will be sourced in a shell script, therefore all shell features may
|
||||||
shell features may be used. This enables you to setup the environment as you
|
be used. This enables you to setup the environment as you need it for your
|
||||||
need it for your build.
|
build.
|
||||||
|
|
||||||
For your first test runs the @env{fate_recv} variable should be empty or
|
For your first test runs the `fate_recv' variable should be empty or
|
||||||
commented out. This will run everything as normal except that it will omit
|
commented out. This will run everything as normal except that it will omit
|
||||||
the submission of the results to the server. The following files should be
|
the submission of the results to the server. The following files should be
|
||||||
present in $workdir as specified in the configuration file:
|
present in $workdir as specified in the configuration file:
|
||||||
@@ -122,29 +122,29 @@ present in $workdir as specified in the configuration file:
|
|||||||
@item version
|
@item version
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
When you have everything working properly you can create an SSH key pair
|
When you have everything working properly you can create an SSH key pair
|
||||||
and send the public key to the FATE server administrator who can be contacted
|
and send the public key to the FATE server administrator who can be contacted
|
||||||
at the email address @email{fate-admin@@ffmpeg.org}.
|
at the email address @email{fate-admin@@ffmpeg.org}.
|
||||||
|
|
||||||
Configure your SSH client to use public key authentication with that key
|
Configure your SSH client to use public key authentication with that key
|
||||||
when connecting to the FATE server. Also do not forget to check the identity
|
when connecting to the FATE server. Also do not forget to check the identity
|
||||||
of the server and to accept its host key. This can usually be achieved by
|
of the server and to accept its host key. This can usually be achieved by
|
||||||
running your SSH client manually and killing it after you accepted the key.
|
running your SSH client manually and killing it after you accepted the key.
|
||||||
The FATE server's fingerprint is:
|
The FATE server's fingerprint is:
|
||||||
|
|
||||||
@table @samp
|
@table @option
|
||||||
@item RSA
|
@item RSA
|
||||||
d3:f1:83:97:a4:75:2b:a6:fb:d6:e8:aa:81:93:97:51
|
d3:f1:83:97:a4:75:2b:a6:fb:d6:e8:aa:81:93:97:51
|
||||||
@item ECDSA
|
@item ECDSA
|
||||||
76:9f:68:32:04:1e:d5:d4:ec:47:3f:dc:fc:18:17:86
|
76:9f:68:32:04:1e:d5:d4:ec:47:3f:dc:fc:18:17:86
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
If you have problems connecting to the FATE server, it may help to try out
|
If you have problems connecting to the FATE server, it may help to try out
|
||||||
the @command{ssh} command with one or more @option{-v} options. You should
|
the @command{ssh} command with one or more @option{-v} options. You should
|
||||||
get detailed output concerning your SSH configuration and the authentication
|
get detailed output concerning your SSH configuration and the authentication
|
||||||
process.
|
process.
|
||||||
|
|
||||||
The only thing left is to automate the execution of the fate.sh script and
|
The only thing left is to automate the execution of the fate.sh script and
|
||||||
the synchronisation of the samples directory.
|
the synchronisation of the samples directory.
|
||||||
|
|
||||||
|
|
||||||
@@ -165,7 +165,7 @@ Run the FATE test suite (requires the fate-suite dataset).
|
|||||||
|
|
||||||
@section Makefile variables
|
@section Makefile variables
|
||||||
|
|
||||||
@table @env
|
@table @option
|
||||||
@item V
|
@item V
|
||||||
Verbosity level, can be set to 0, 1 or 2.
|
Verbosity level, can be set to 0, 1 or 2.
|
||||||
@itemize
|
@itemize
|
||||||
@@ -183,20 +183,20 @@ Specify how many threads to use while running regression tests, it is
|
|||||||
quite useful to detect thread-related regressions.
|
quite useful to detect thread-related regressions.
|
||||||
|
|
||||||
@item THREAD_TYPE
|
@item THREAD_TYPE
|
||||||
Specify which threading strategy test, either @samp{slice} or @samp{frame},
|
Specify which threading strategy test, either @var{slice} or @var{frame},
|
||||||
by default @samp{slice+frame}
|
by default @var{slice+frame}
|
||||||
|
|
||||||
@item CPUFLAGS
|
@item CPUFLAGS
|
||||||
Specify CPU flags.
|
Specify CPU flags.
|
||||||
|
|
||||||
@item TARGET_EXEC
|
@item TARGET_EXEC
|
||||||
Specify or override the wrapper used to run the tests.
|
Specify or override the wrapper used to run the tests.
|
||||||
The @env{TARGET_EXEC} option provides a way to run FATE wrapped in
|
The @var{TARGET_EXEC} option provides a way to run FATE wrapped in
|
||||||
@command{valgrind}, @command{qemu-user} or @command{wine} or on remote targets
|
@command{valgrind}, @command{qemu-user} or @command{wine} or on remote targets
|
||||||
through @command{ssh}.
|
through @command{ssh}.
|
||||||
|
|
||||||
@item GEN
|
@item GEN
|
||||||
Set to @samp{1} to generate the missing or mismatched references.
|
Set to @var{1} to generate the missing or mismatched references.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@section Examples
|
@section Examples
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
slot= # some unique identifier
|
slot= # some unique identifier
|
||||||
repo=git://source.ffmpeg.org/ffmpeg.git # the source repository
|
repo=git://source.ffmpeg.org/ffmpeg.git # the source repository
|
||||||
#branch=release/2.6 # the branch to test
|
|
||||||
samples= # path to samples directory
|
samples= # path to samples directory
|
||||||
workdir= # directory in which to do all the work
|
workdir= # directory in which to do all the work
|
||||||
#fate_recv="ssh -T fate@fate.ffmpeg.org" # command to submit report
|
#fate_recv="ssh -T fate@fate.ffmpeg.org" # command to submit report
|
||||||
|
|||||||
165
doc/ffmpeg.texi
165
doc/ffmpeg.texi
@@ -80,7 +80,7 @@ The format option may be needed for raw input files.
|
|||||||
The transcoding process in @command{ffmpeg} for each output can be described by
|
The transcoding process in @command{ffmpeg} for each output can be described by
|
||||||
the following diagram:
|
the following diagram:
|
||||||
|
|
||||||
@verbatim
|
@example
|
||||||
_______ ______________
|
_______ ______________
|
||||||
| | | |
|
| | | |
|
||||||
| input | demuxer | encoded data | decoder
|
| input | demuxer | encoded data | decoder
|
||||||
@@ -99,7 +99,7 @@ the following diagram:
|
|||||||
|________| |______________|
|
|________| |______________|
|
||||||
|
|
||||||
|
|
||||||
@end verbatim
|
@end example
|
||||||
|
|
||||||
@command{ffmpeg} calls the libavformat library (containing demuxers) to read
|
@command{ffmpeg} calls the libavformat library (containing demuxers) to read
|
||||||
input files and get packets containing encoded data from them. When there are
|
input files and get packets containing encoded data from them. When there are
|
||||||
@@ -124,7 +124,7 @@ Simple filtergraphs are those that have exactly one input and output, both of
|
|||||||
the same type. In the above diagram they can be represented by simply inserting
|
the same type. In the above diagram they can be represented by simply inserting
|
||||||
an additional step between decoding and encoding:
|
an additional step between decoding and encoding:
|
||||||
|
|
||||||
@verbatim
|
@example
|
||||||
_________ ______________
|
_________ ______________
|
||||||
| | | |
|
| | | |
|
||||||
| decoded | | encoded data |
|
| decoded | | encoded data |
|
||||||
@@ -136,19 +136,19 @@ an additional step between decoding and encoding:
|
|||||||
| frames |
|
| frames |
|
||||||
|__________|
|
|__________|
|
||||||
|
|
||||||
@end verbatim
|
@end example
|
||||||
|
|
||||||
Simple filtergraphs are configured with the per-stream @option{-filter} option
|
Simple filtergraphs are configured with the per-stream @option{-filter} option
|
||||||
(with @option{-vf} and @option{-af} aliases for video and audio respectively).
|
(with @option{-vf} and @option{-af} aliases for video and audio respectively).
|
||||||
A simple filtergraph for video can look for example like this:
|
A simple filtergraph for video can look for example like this:
|
||||||
|
|
||||||
@verbatim
|
@example
|
||||||
_______ _____________ _______ ________
|
_______ _____________ _______ ________
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
| input | ---> | deinterlace | ---> | scale | ---> | output |
|
| input | ---> | deinterlace | ---> | scale | ---> | output |
|
||||||
|_______| |_____________| |_______| |________|
|
|_______| |_____________| |_______| |________|
|
||||||
|
|
||||||
@end verbatim
|
@end example
|
||||||
|
|
||||||
Note that some filters change frame properties but not frame contents. E.g. the
|
Note that some filters change frame properties but not frame contents. E.g. the
|
||||||
@code{fps} filter in the example above changes number of frames, but does not
|
@code{fps} filter in the example above changes number of frames, but does not
|
||||||
@@ -161,7 +161,7 @@ processing chain applied to one stream. This is the case, for example, when the
|
|||||||
more than one input and/or output, or when output stream type is different from
|
more than one input and/or output, or when output stream type is different from
|
||||||
input. They can be represented with the following diagram:
|
input. They can be represented with the following diagram:
|
||||||
|
|
||||||
@verbatim
|
@example
|
||||||
_________
|
_________
|
||||||
| |
|
| |
|
||||||
| input 0 |\ __________
|
| input 0 |\ __________
|
||||||
@@ -179,7 +179,7 @@ input. They can be represented with the following diagram:
|
|||||||
| input 2 |/
|
| input 2 |/
|
||||||
|_________|
|
|_________|
|
||||||
|
|
||||||
@end verbatim
|
@end example
|
||||||
|
|
||||||
Complex filtergraphs are configured with the @option{-filter_complex} option.
|
Complex filtergraphs are configured with the @option{-filter_complex} option.
|
||||||
Note that this option is global, since a complex filtergraph, by its nature,
|
Note that this option is global, since a complex filtergraph, by its nature,
|
||||||
@@ -198,14 +198,14 @@ step for the specified stream, so it does only demuxing and muxing. It is useful
|
|||||||
for changing the container format or modifying container-level metadata. The
|
for changing the container format or modifying container-level metadata. The
|
||||||
diagram above will, in this case, simplify to this:
|
diagram above will, in this case, simplify to this:
|
||||||
|
|
||||||
@verbatim
|
@example
|
||||||
_______ ______________ ________
|
_______ ______________ ________
|
||||||
| | | | | |
|
| | | | | |
|
||||||
| input | demuxer | encoded data | muxer | output |
|
| input | demuxer | encoded data | muxer | output |
|
||||||
| file | ---------> | packets | -------> | file |
|
| file | ---------> | packets | -------> | file |
|
||||||
|_______| |______________| |________|
|
|_______| |______________| |________|
|
||||||
|
|
||||||
@end verbatim
|
@end example
|
||||||
|
|
||||||
Since there is no decoding or encoding, it is very fast and there is no quality
|
Since there is no decoding or encoding, it is very fast and there is no quality
|
||||||
loss. However, it might not work in some cases because of many factors. Applying
|
loss. However, it might not work in some cases because of many factors. Applying
|
||||||
@@ -253,10 +253,6 @@ Overwrite output files without asking.
|
|||||||
Do not overwrite output files, and exit immediately if a specified
|
Do not overwrite output files, and exit immediately if a specified
|
||||||
output file already exists.
|
output file already exists.
|
||||||
|
|
||||||
@item -stream_loop @var{number} (@emph{input})
|
|
||||||
Set number of times input stream shall be looped. Loop 0 means no loop,
|
|
||||||
loop -1 means infinite loop.
|
|
||||||
|
|
||||||
@item -c[:@var{stream_specifier}] @var{codec} (@emph{input/output,per-stream})
|
@item -c[:@var{stream_specifier}] @var{codec} (@emph{input/output,per-stream})
|
||||||
@itemx -codec[:@var{stream_specifier}] @var{codec} (@emph{input/output,per-stream})
|
@itemx -codec[:@var{stream_specifier}] @var{codec} (@emph{input/output,per-stream})
|
||||||
Select an encoder (when used before an output file) or a decoder (when used
|
Select an encoder (when used before an output file) or a decoder (when used
|
||||||
@@ -284,27 +280,23 @@ data read from the input file.
|
|||||||
When used as an output option (before an output filename), stop writing the
|
When used as an output option (before an output filename), stop writing the
|
||||||
output after its duration reaches @var{duration}.
|
output after its duration reaches @var{duration}.
|
||||||
|
|
||||||
@var{duration} must be a time duration specification,
|
@var{duration} may be a number in seconds, or in @code{hh:mm:ss[.xxx]} form.
|
||||||
see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}.
|
|
||||||
|
|
||||||
-to and -t are mutually exclusive and -t has priority.
|
-to and -t are mutually exclusive and -t has priority.
|
||||||
|
|
||||||
@item -to @var{position} (@emph{output})
|
@item -to @var{position} (@emph{output})
|
||||||
Stop writing the output at @var{position}.
|
Stop writing the output at @var{position}.
|
||||||
@var{position} must be a time duration specification,
|
@var{position} may be a number in seconds, or in @code{hh:mm:ss[.xxx]} form.
|
||||||
see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}.
|
|
||||||
|
|
||||||
-to and -t are mutually exclusive and -t has priority.
|
-to and -t are mutually exclusive and -t has priority.
|
||||||
|
|
||||||
@item -fs @var{limit_size} (@emph{output})
|
@item -fs @var{limit_size} (@emph{output})
|
||||||
Set the file size limit, expressed in bytes. No further chunk of bytes is written
|
Set the file size limit, expressed in bytes.
|
||||||
after the limit is exceeded. The size of the output file is slightly more than the
|
|
||||||
requested file size.
|
|
||||||
|
|
||||||
@item -ss @var{position} (@emph{input/output})
|
@item -ss @var{position} (@emph{input/output})
|
||||||
When used as an input option (before @code{-i}), seeks in this input file to
|
When used as an input option (before @code{-i}), seeks in this input file to
|
||||||
@var{position}. Note that in most formats it is not possible to seek exactly,
|
@var{position}. Note the in most formats it is not possible to seek exactly, so
|
||||||
so @command{ffmpeg} will seek to the closest seek point before @var{position}.
|
@command{ffmpeg} will seek to the closest seek point before @var{position}.
|
||||||
When transcoding and @option{-accurate_seek} is enabled (the default), this
|
When transcoding and @option{-accurate_seek} is enabled (the default), this
|
||||||
extra segment between the seek point and @var{position} will be decoded and
|
extra segment between the seek point and @var{position} will be decoded and
|
||||||
discarded. When doing stream copy or when @option{-noaccurate_seek} is used, it
|
discarded. When doing stream copy or when @option{-noaccurate_seek} is used, it
|
||||||
@@ -313,13 +305,7 @@ will be preserved.
|
|||||||
When used as an output option (before an output filename), decodes but discards
|
When used as an output option (before an output filename), decodes but discards
|
||||||
input until the timestamps reach @var{position}.
|
input until the timestamps reach @var{position}.
|
||||||
|
|
||||||
@var{position} must be a time duration specification,
|
@var{position} may be either in seconds or in @code{hh:mm:ss[.xxx]} form.
|
||||||
see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}.
|
|
||||||
|
|
||||||
@item -sseof @var{position} (@emph{input/output})
|
|
||||||
|
|
||||||
Like the @code{-ss} option but relative to the "end of file". That is negative
|
|
||||||
values are earlier in the file, 0 is at EOF.
|
|
||||||
|
|
||||||
@item -itsoffset @var{offset} (@emph{input})
|
@item -itsoffset @var{offset} (@emph{input})
|
||||||
Set the input time offset.
|
Set the input time offset.
|
||||||
@@ -334,15 +320,15 @@ the time duration specified in @var{offset}.
|
|||||||
@item -timestamp @var{date} (@emph{output})
|
@item -timestamp @var{date} (@emph{output})
|
||||||
Set the recording timestamp in the container.
|
Set the recording timestamp in the container.
|
||||||
|
|
||||||
@var{date} must be a date specification,
|
@var{date} must be a time duration specification,
|
||||||
see @ref{date syntax,,the Date section in the ffmpeg-utils(1) manual,ffmpeg-utils}.
|
see @ref{date syntax,,the Date section in the ffmpeg-utils(1) manual,ffmpeg-utils}.
|
||||||
|
|
||||||
@item -metadata[:metadata_specifier] @var{key}=@var{value} (@emph{output,per-metadata})
|
@item -metadata[:metadata_specifier] @var{key}=@var{value} (@emph{output,per-metadata})
|
||||||
Set a metadata key/value pair.
|
Set a metadata key/value pair.
|
||||||
|
|
||||||
An optional @var{metadata_specifier} may be given to set metadata
|
An optional @var{metadata_specifier} may be given to set metadata
|
||||||
on streams, chapters or programs. See @code{-map_metadata}
|
on streams or chapters. See @code{-map_metadata} documentation for
|
||||||
documentation for details.
|
details.
|
||||||
|
|
||||||
This option overrides metadata set with @code{-map_metadata}. It is
|
This option overrides metadata set with @code{-map_metadata}. It is
|
||||||
also possible to delete metadata by using an empty value.
|
also possible to delete metadata by using an empty value.
|
||||||
@@ -357,11 +343,6 @@ To set the language of the first audio stream:
|
|||||||
ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
|
ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@item -program [title=@var{title}:][program_num=@var{program_num}:]st=@var{stream}[:st=@var{stream}...] (@emph{output})
|
|
||||||
|
|
||||||
Creates a program with the specified @var{title}, @var{program_num} and adds the specified
|
|
||||||
@var{stream}(s) to it.
|
|
||||||
|
|
||||||
@item -target @var{type} (@emph{output})
|
@item -target @var{type} (@emph{output})
|
||||||
Specify target file type (@code{vcd}, @code{svcd}, @code{dvd}, @code{dv},
|
Specify target file type (@code{vcd}, @code{svcd}, @code{dvd}, @code{dv},
|
||||||
@code{dv50}). @var{type} may be prefixed with @code{pal-}, @code{ntsc-} or
|
@code{dv50}). @var{type} may be prefixed with @code{pal-}, @code{ntsc-} or
|
||||||
@@ -481,9 +462,6 @@ Technical note -- attachments are implemented as codec extradata, so this
|
|||||||
option can actually be used to extract extradata from any stream, not just
|
option can actually be used to extract extradata from any stream, not just
|
||||||
attachments.
|
attachments.
|
||||||
|
|
||||||
@item -noautorotate
|
|
||||||
Disable automatically rotating video based on file metadata.
|
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@section Video Options
|
@section Video Options
|
||||||
@@ -682,16 +660,6 @@ Use VDPAU (Video Decode and Presentation API for Unix) hardware acceleration.
|
|||||||
|
|
||||||
@item dxva2
|
@item dxva2
|
||||||
Use DXVA2 (DirectX Video Acceleration) hardware acceleration.
|
Use DXVA2 (DirectX Video Acceleration) hardware acceleration.
|
||||||
|
|
||||||
@item qsv
|
|
||||||
Use the Intel QuickSync Video acceleration for video transcoding.
|
|
||||||
|
|
||||||
Unlike most other values, this option does not enable accelerated decoding (that
|
|
||||||
is used automatically whenever a qsv decoder is selected), but accelerated
|
|
||||||
transcoding, without copying the frames into the system memory.
|
|
||||||
|
|
||||||
For it to work, both the decoder and the encoder must support QSV acceleration
|
|
||||||
and no filters must be used.
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
This option has no effect if the selected hwaccel is not available or not
|
This option has no effect if the selected hwaccel is not available or not
|
||||||
@@ -718,27 +686,9 @@ is not specified, the value of the @var{DISPLAY} environment variable is used
|
|||||||
@item dxva2
|
@item dxva2
|
||||||
For DXVA2, this option should contain the number of the display adapter to use.
|
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.
|
If this option is not specified, the default adapter is used.
|
||||||
|
|
||||||
@item qsv
|
|
||||||
For QSV, this option corresponds to the values of MFX_IMPL_* . Allowed values
|
|
||||||
are:
|
|
||||||
@table @option
|
|
||||||
@item auto
|
|
||||||
@item sw
|
|
||||||
@item hw
|
|
||||||
@item auto_any
|
|
||||||
@item hw_any
|
|
||||||
@item hw2
|
|
||||||
@item hw3
|
|
||||||
@item hw4
|
|
||||||
@end table
|
@end table
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item -hwaccels
|
|
||||||
List all hardware acceleration methods supported in this build of ffmpeg.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section Audio Options
|
@section Audio Options
|
||||||
|
|
||||||
@table @option
|
@table @option
|
||||||
@@ -882,14 +832,6 @@ ffmpeg -i INPUT -map 0:m:language:eng OUTPUT
|
|||||||
|
|
||||||
Note that using this option disables the default mappings for this output file.
|
Note that using this option disables the default mappings for this output file.
|
||||||
|
|
||||||
@item -ignore_unknown
|
|
||||||
Ignore input streams with unknown type instead of failing if copying
|
|
||||||
such streams is attempted.
|
|
||||||
|
|
||||||
@item -copy_unknown
|
|
||||||
Allow input streams with unknown type to be copied instead of failing if copying
|
|
||||||
such streams is attempted.
|
|
||||||
|
|
||||||
@item -map_channel [@var{input_file_id}.@var{stream_specifier}.@var{channel_id}|-1][:@var{output_file_id}.@var{stream_specifier}]
|
@item -map_channel [@var{input_file_id}.@var{stream_specifier}.@var{channel_id}|-1][:@var{output_file_id}.@var{stream_specifier}]
|
||||||
Map an audio channel from a given input to an output. If
|
Map an audio channel from a given input to an output. If
|
||||||
@var{output_file_id}.@var{stream_specifier} is not set, the audio channel will
|
@var{output_file_id}.@var{stream_specifier} is not set, the audio channel will
|
||||||
@@ -1216,14 +1158,7 @@ This option enables or disables accurate seeking in input files with the
|
|||||||
transcoding. Use @option{-noaccurate_seek} to disable it, which may be useful
|
transcoding. Use @option{-noaccurate_seek} to disable it, which may be useful
|
||||||
e.g. when copying some streams and transcoding the others.
|
e.g. when copying some streams and transcoding the others.
|
||||||
|
|
||||||
@item -seek_timestamp (@emph{input})
|
@item -thread_message_queue @var{size} (@emph{input})
|
||||||
This option enables or disables seeking by timestamp in input files with the
|
|
||||||
@option{-ss} option. It is disabled by default. If enabled, the argument
|
|
||||||
to the @option{-ss} option is considered an actual timestamp, and is not
|
|
||||||
offset by the start time of the file. This matters only for files which do
|
|
||||||
not start from timestamp 0, such as transport streams.
|
|
||||||
|
|
||||||
@item -thread_queue_size @var{size} (@emph{input})
|
|
||||||
This option sets the maximum number of queued packets when reading from the
|
This option sets the maximum number of queued packets when reading from the
|
||||||
file or device. With low latency / high rate live streams, packets may be
|
file or device. With low latency / high rate live streams, packets may be
|
||||||
discarded if they are not read in a timely manner; raising this value can
|
discarded if they are not read in a timely manner; raising this value can
|
||||||
@@ -1240,9 +1175,9 @@ The option is intended for cases where features are needed that cannot be
|
|||||||
specified to @command{ffserver} but can be to @command{ffmpeg}.
|
specified to @command{ffserver} but can be to @command{ffmpeg}.
|
||||||
|
|
||||||
@item -sdp_file @var{file} (@emph{global})
|
@item -sdp_file @var{file} (@emph{global})
|
||||||
Print sdp information for an output stream to @var{file}.
|
Print sdp information to @var{file}.
|
||||||
This allows dumping sdp information when at least one output isn't an
|
This allows dumping sdp information when at least one output isn't an
|
||||||
rtp stream. (Requires at least one of the output formats to be rtp).
|
rtp stream.
|
||||||
|
|
||||||
@item -discard (@emph{input})
|
@item -discard (@emph{input})
|
||||||
Allows discarding specific streams or frames of streams at the demuxer.
|
Allows discarding specific streams or frames of streams at the demuxer.
|
||||||
@@ -1268,17 +1203,6 @@ Discard all frames excepts keyframes.
|
|||||||
Discard all frames.
|
Discard all frames.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item -abort_on @var{flags} (@emph{global})
|
|
||||||
Stop and abort on various conditions. The following flags are available:
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item empty_output
|
|
||||||
No packets were passed to the muxer, the output is empty.
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@item -xerror (@emph{global})
|
|
||||||
Stop and exit on error
|
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
As a special exception, you can use a bitmap subtitle stream as input: it
|
As a special exception, you can use a bitmap subtitle stream as input: it
|
||||||
@@ -1354,6 +1278,47 @@ If no such file is found, then ffmpeg will search for a file named
|
|||||||
|
|
||||||
@c man end OPTIONS
|
@c man end OPTIONS
|
||||||
|
|
||||||
|
@chapter Tips
|
||||||
|
@c man begin TIPS
|
||||||
|
|
||||||
|
@itemize
|
||||||
|
@item
|
||||||
|
For streaming at very low bitrates, use a low frame rate
|
||||||
|
and a small GOP size. This is especially true for RealVideo where
|
||||||
|
the Linux player does not seem to be very fast, so it can miss
|
||||||
|
frames. An example is:
|
||||||
|
|
||||||
|
@example
|
||||||
|
ffmpeg -g 3 -r 3 -t 10 -b:v 50k -s qcif -f rv10 /tmp/b.rm
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@item
|
||||||
|
The parameter 'q' which is displayed while encoding is the current
|
||||||
|
quantizer. The value 1 indicates that a very good quality could
|
||||||
|
be achieved. The value 31 indicates the worst quality. If q=31 appears
|
||||||
|
too often, it means that the encoder cannot compress enough to meet
|
||||||
|
your bitrate. You must either increase the bitrate, decrease the
|
||||||
|
frame rate or decrease the frame size.
|
||||||
|
|
||||||
|
@item
|
||||||
|
If your computer is not fast enough, you can speed up the
|
||||||
|
compression at the expense of the compression ratio. You can use
|
||||||
|
'-me zero' to speed up motion estimation, and '-g 0' to disable
|
||||||
|
motion estimation completely (you have only I-frames, which means it
|
||||||
|
is about as good as JPEG compression).
|
||||||
|
|
||||||
|
@item
|
||||||
|
To have very low audio bitrates, reduce the sampling frequency
|
||||||
|
(down to 22050 Hz for MPEG audio, 22050 or 11025 for AC-3).
|
||||||
|
|
||||||
|
@item
|
||||||
|
To have a constant quality (but a variable bitrate), use the option
|
||||||
|
'-qscale n' when 'n' is between 1 (excellent quality) and 31 (worst
|
||||||
|
quality).
|
||||||
|
|
||||||
|
@end itemize
|
||||||
|
@c man end TIPS
|
||||||
|
|
||||||
@chapter Examples
|
@chapter Examples
|
||||||
@c man begin EXAMPLES
|
@c man begin EXAMPLES
|
||||||
|
|
||||||
@@ -1504,7 +1469,7 @@ combination with -ss to start extracting from a certain point in time.
|
|||||||
|
|
||||||
For creating a video from many images:
|
For creating a video from many images:
|
||||||
@example
|
@example
|
||||||
ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi
|
ffmpeg -f image2 -i foo-%03d.jpeg -r 12 -s WxH foo.avi
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
The syntax @code{foo-%03d.jpeg} specifies to use a decimal number
|
The syntax @code{foo-%03d.jpeg} specifies to use a decimal number
|
||||||
@@ -1519,7 +1484,7 @@ image2-specific @code{-pattern_type glob} option.
|
|||||||
For example, for creating a video from filenames matching the glob pattern
|
For example, for creating a video from filenames matching the glob pattern
|
||||||
@code{foo-*.jpeg}:
|
@code{foo-*.jpeg}:
|
||||||
@example
|
@example
|
||||||
ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi
|
ffmpeg -f image2 -pattern_type glob -i 'foo-*.jpeg' -r 12 -s WxH foo.avi
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@item
|
@item
|
||||||
|
|||||||
@@ -47,17 +47,9 @@ Disable video.
|
|||||||
@item -sn
|
@item -sn
|
||||||
Disable subtitles.
|
Disable subtitles.
|
||||||
@item -ss @var{pos}
|
@item -ss @var{pos}
|
||||||
Seek to @var{pos}. Note that in most formats it is not possible to seek
|
Seek to a given position in seconds.
|
||||||
exactly, so @command{ffplay} will seek to the nearest seek point to
|
|
||||||
@var{pos}.
|
|
||||||
|
|
||||||
@var{pos} must be a time duration specification,
|
|
||||||
see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}.
|
|
||||||
@item -t @var{duration}
|
@item -t @var{duration}
|
||||||
Play @var{duration} seconds of audio/video.
|
play <duration> seconds of audio/video
|
||||||
|
|
||||||
@var{duration} must be a time duration specification,
|
|
||||||
see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}.
|
|
||||||
@item -bytes
|
@item -bytes
|
||||||
Seek by bytes.
|
Seek by bytes.
|
||||||
@item -nodisp
|
@item -nodisp
|
||||||
@@ -169,7 +161,7 @@ Force a specific video decoder.
|
|||||||
Force a specific subtitle decoder.
|
Force a specific subtitle decoder.
|
||||||
|
|
||||||
@item -autorotate
|
@item -autorotate
|
||||||
Automatically rotate the video according to file metadata. Enabled by
|
Automatically rotate the video according to presentation metadata. Enabled by
|
||||||
default, use @option{-noautorotate} to disable it.
|
default, use @option{-noautorotate} to disable it.
|
||||||
|
|
||||||
@item -framedrop
|
@item -framedrop
|
||||||
@@ -197,15 +189,6 @@ Toggle full screen.
|
|||||||
@item p, SPC
|
@item p, SPC
|
||||||
Pause.
|
Pause.
|
||||||
|
|
||||||
@item m
|
|
||||||
Toggle mute.
|
|
||||||
|
|
||||||
@item 9, 0
|
|
||||||
Decrease and increase volume respectively.
|
|
||||||
|
|
||||||
@item /, *
|
|
||||||
Decrease and increase volume respectively.
|
|
||||||
|
|
||||||
@item a
|
@item a
|
||||||
Cycle audio channel in the current program.
|
Cycle audio channel in the current program.
|
||||||
|
|
||||||
@@ -238,12 +221,9 @@ Seek to the previous/next chapter.
|
|||||||
or if there are no chapters
|
or if there are no chapters
|
||||||
Seek backward/forward 10 minutes.
|
Seek backward/forward 10 minutes.
|
||||||
|
|
||||||
@item right mouse click
|
@item mouse click
|
||||||
Seek to percentage in file corresponding to fraction of width.
|
Seek to percentage in file corresponding to fraction of width.
|
||||||
|
|
||||||
@item left mouse double-click
|
|
||||||
Toggle full screen.
|
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@c man end
|
@c man end
|
||||||
|
|||||||
@@ -447,17 +447,17 @@ writer).
|
|||||||
It can assume one of the following values:
|
It can assume one of the following values:
|
||||||
@table @option
|
@table @option
|
||||||
@item c
|
@item c
|
||||||
Perform C-like escaping. Strings containing a newline (@samp{\n}), carriage
|
Perform C-like escaping. Strings containing a newline ('\n'), carriage
|
||||||
return (@samp{\r}), a tab (@samp{\t}), a form feed (@samp{\f}), the escaping
|
return ('\r'), a tab ('\t'), a form feed ('\f'), the escaping
|
||||||
character (@samp{\}) or the item separator character @var{SEP} are escaped
|
character ('\') or the item separator character @var{SEP} are escaped using C-like fashioned
|
||||||
using C-like fashioned escaping, so that a newline is converted to the
|
escaping, so that a newline is converted to the sequence "\n", a
|
||||||
sequence @samp{\n}, a carriage return to @samp{\r}, @samp{\} to @samp{\\} and
|
carriage return to "\r", '\' to "\\" and the separator @var{SEP} is
|
||||||
the separator @var{SEP} is converted to @samp{\@var{SEP}}.
|
converted to "\@var{SEP}".
|
||||||
|
|
||||||
@item csv
|
@item csv
|
||||||
Perform CSV-like escaping, as described in RFC4180. Strings
|
Perform CSV-like escaping, as described in RFC4180. Strings
|
||||||
containing a newline (@samp{\n}), a carriage return (@samp{\r}), a double quote
|
containing a newline ('\n'), a carriage return ('\r'), a double quote
|
||||||
(@samp{"}), or @var{SEP} are enclosed in double-quotes.
|
('"'), or @var{SEP} are enclosed in double-quotes.
|
||||||
|
|
||||||
@item none
|
@item none
|
||||||
Perform no escaping.
|
Perform no escaping.
|
||||||
@@ -485,7 +485,7 @@ The description of the accepted options follows.
|
|||||||
Separator character used to separate the chapter, the section name, IDs and
|
Separator character used to separate the chapter, the section name, IDs and
|
||||||
potential tags in the printed field key.
|
potential tags in the printed field key.
|
||||||
|
|
||||||
Default value is @samp{.}.
|
Default value is '.'.
|
||||||
|
|
||||||
@item hierarchical, h
|
@item hierarchical, h
|
||||||
Specify if the section name specification should be hierarchical. If
|
Specify if the section name specification should be hierarchical. If
|
||||||
@@ -507,22 +507,21 @@ The following conventions are adopted:
|
|||||||
@item
|
@item
|
||||||
all key and values are UTF-8
|
all key and values are UTF-8
|
||||||
@item
|
@item
|
||||||
@samp{.} is the subgroup separator
|
'.' is the subgroup separator
|
||||||
@item
|
@item
|
||||||
newline, @samp{\t}, @samp{\f}, @samp{\b} and the following characters are
|
newline, '\t', '\f', '\b' and the following characters are escaped
|
||||||
escaped
|
|
||||||
@item
|
@item
|
||||||
@samp{\} is the escape character
|
'\' is the escape character
|
||||||
@item
|
@item
|
||||||
@samp{#} is the comment indicator
|
'#' is the comment indicator
|
||||||
@item
|
@item
|
||||||
@samp{=} is the key/value separator
|
'=' is the key/value separator
|
||||||
@item
|
@item
|
||||||
@samp{:} is not used but usually parsed as key/value separator
|
':' is not used but usually parsed as key/value separator
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
This writer accepts options as a list of @var{key}=@var{value} pairs,
|
This writer accepts options as a list of @var{key}=@var{value} pairs,
|
||||||
separated by @samp{:}.
|
separated by ":".
|
||||||
|
|
||||||
The description of the accepted options follows.
|
The description of the accepted options follows.
|
||||||
|
|
||||||
|
|||||||
@@ -48,11 +48,6 @@
|
|||||||
</xsd:complexType>
|
</xsd:complexType>
|
||||||
|
|
||||||
<xsd:complexType name="packetType">
|
<xsd:complexType name="packetType">
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
|
|
||||||
<xsd:element name="side_data_list" type="ffprobe:packetSideDataListType" minOccurs="0" maxOccurs="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
|
|
||||||
<xsd:attribute name="codec_type" type="xsd:string" use="required" />
|
<xsd:attribute name="codec_type" type="xsd:string" use="required" />
|
||||||
<xsd:attribute name="stream_index" type="xsd:int" use="required" />
|
<xsd:attribute name="stream_index" type="xsd:int" use="required" />
|
||||||
<xsd:attribute name="pts" type="xsd:long" />
|
<xsd:attribute name="pts" type="xsd:long" />
|
||||||
@@ -70,16 +65,6 @@
|
|||||||
<xsd:attribute name="data_hash" type="xsd:string" />
|
<xsd:attribute name="data_hash" type="xsd:string" />
|
||||||
</xsd:complexType>
|
</xsd:complexType>
|
||||||
|
|
||||||
<xsd:complexType name="packetSideDataListType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="side_data" type="ffprobe:packetSideDataType" minOccurs="1" maxOccurs="unbounded"/>
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
<xsd:complexType name="packetSideDataType">
|
|
||||||
<xsd:attribute name="side_data_type" type="xsd:string"/>
|
|
||||||
<xsd:attribute name="side_data_size" type="xsd:int" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="frameType">
|
<xsd:complexType name="frameType">
|
||||||
<xsd:sequence>
|
<xsd:sequence>
|
||||||
<xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
|
<xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
@@ -87,7 +72,6 @@
|
|||||||
</xsd:sequence>
|
</xsd:sequence>
|
||||||
|
|
||||||
<xsd:attribute name="media_type" type="xsd:string" use="required"/>
|
<xsd:attribute name="media_type" type="xsd:string" use="required"/>
|
||||||
<xsd:attribute name="stream_index" type="xsd:int" />
|
|
||||||
<xsd:attribute name="key_frame" type="xsd:int" use="required"/>
|
<xsd:attribute name="key_frame" type="xsd:int" use="required"/>
|
||||||
<xsd:attribute name="pts" type="xsd:long" />
|
<xsd:attribute name="pts" type="xsd:long" />
|
||||||
<xsd:attribute name="pts_time" type="xsd:float"/>
|
<xsd:attribute name="pts_time" type="xsd:float"/>
|
||||||
@@ -171,7 +155,6 @@
|
|||||||
<xsd:sequence>
|
<xsd:sequence>
|
||||||
<xsd:element name="disposition" type="ffprobe:streamDispositionType" minOccurs="0" maxOccurs="1"/>
|
<xsd:element name="disposition" type="ffprobe:streamDispositionType" minOccurs="0" maxOccurs="1"/>
|
||||||
<xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
|
<xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
<xsd:element name="side_data_list" type="ffprobe:packetSideDataListType" minOccurs="0" maxOccurs="1" />
|
|
||||||
</xsd:sequence>
|
</xsd:sequence>
|
||||||
|
|
||||||
<xsd:attribute name="index" type="xsd:int" use="required"/>
|
<xsd:attribute name="index" type="xsd:int" use="required"/>
|
||||||
@@ -188,8 +171,6 @@
|
|||||||
<!-- video attributes -->
|
<!-- video attributes -->
|
||||||
<xsd:attribute name="width" type="xsd:int"/>
|
<xsd:attribute name="width" type="xsd:int"/>
|
||||||
<xsd:attribute name="height" type="xsd:int"/>
|
<xsd:attribute name="height" type="xsd:int"/>
|
||||||
<xsd:attribute name="coded_width" type="xsd:int"/>
|
|
||||||
<xsd:attribute name="coded_height" type="xsd:int"/>
|
|
||||||
<xsd:attribute name="has_b_frames" type="xsd:int"/>
|
<xsd:attribute name="has_b_frames" type="xsd:int"/>
|
||||||
<xsd:attribute name="sample_aspect_ratio" type="xsd:string"/>
|
<xsd:attribute name="sample_aspect_ratio" type="xsd:string"/>
|
||||||
<xsd:attribute name="display_aspect_ratio" type="xsd:string"/>
|
<xsd:attribute name="display_aspect_ratio" type="xsd:string"/>
|
||||||
@@ -273,8 +254,6 @@
|
|||||||
<xsd:complexType name="programVersionType">
|
<xsd:complexType name="programVersionType">
|
||||||
<xsd:attribute name="version" type="xsd:string" use="required"/>
|
<xsd:attribute name="version" type="xsd:string" use="required"/>
|
||||||
<xsd:attribute name="copyright" type="xsd:string" use="required"/>
|
<xsd:attribute name="copyright" type="xsd:string" use="required"/>
|
||||||
<xsd:attribute name="build_date" type="xsd:string"/>
|
|
||||||
<xsd:attribute name="build_time" type="xsd:string"/>
|
|
||||||
<xsd:attribute name="compiler_ident" type="xsd:string" use="required"/>
|
<xsd:attribute name="compiler_ident" type="xsd:string" use="required"/>
|
||||||
<xsd:attribute name="configuration" type="xsd:string" use="required"/>
|
<xsd:attribute name="configuration" type="xsd:string" use="required"/>
|
||||||
</xsd:complexType>
|
</xsd:complexType>
|
||||||
|
|||||||
@@ -82,7 +82,6 @@ Feed feed1.ffm
|
|||||||
# ra : RealNetworks-compatible stream. Audio only.
|
# ra : RealNetworks-compatible stream. Audio only.
|
||||||
# mpjpeg : Multipart JPEG (works with Netscape without any plugin)
|
# mpjpeg : Multipart JPEG (works with Netscape without any plugin)
|
||||||
# jpeg : Generate a single JPEG image.
|
# jpeg : Generate a single JPEG image.
|
||||||
# mjpeg : Generate a M-JPEG stream.
|
|
||||||
# asf : ASF compatible streaming (Windows Media Player format).
|
# asf : ASF compatible streaming (Windows Media Player format).
|
||||||
# swf : Macromedia Flash compatible stream
|
# swf : Macromedia Flash compatible stream
|
||||||
# avi : AVI format (MPEG-4 video, MPEG audio sound)
|
# avi : AVI format (MPEG-4 video, MPEG audio sound)
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ the HTTP server (configured through the @option{HTTPPort} option), and
|
|||||||
configuration file.
|
configuration file.
|
||||||
|
|
||||||
Each feed is associated to a file which is stored on disk. This stored
|
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.
|
possible when new content is added in real-time to the stream.
|
||||||
|
|
||||||
A "live-stream" or "stream" is a resource published by
|
A "live-stream" or "stream" is a resource published by
|
||||||
@@ -118,8 +118,7 @@ Multiple streams can be connected to the same feed.
|
|||||||
|
|
||||||
For example, you can have a situation described by the following
|
For example, you can have a situation described by the following
|
||||||
graph:
|
graph:
|
||||||
|
@example
|
||||||
@verbatim
|
|
||||||
_________ __________
|
_________ __________
|
||||||
| | | |
|
| | | |
|
||||||
ffmpeg 1 -----| feed 1 |-----| stream 1 |
|
ffmpeg 1 -----| feed 1 |-----| stream 1 |
|
||||||
@@ -144,8 +143,7 @@ ffmpeg 2 -----| feed 3 |-----| stream 4 |
|
|||||||
| | | |
|
| | | |
|
||||||
| file 1 |-----| stream 5 |
|
| file 1 |-----| stream 5 |
|
||||||
|_________| |__________|
|
|_________| |__________|
|
||||||
|
@end example
|
||||||
@end verbatim
|
|
||||||
|
|
||||||
@anchor{FFM}
|
@anchor{FFM}
|
||||||
@section FFM, FFM2 formats
|
@section FFM, FFM2 formats
|
||||||
|
|||||||
@@ -36,10 +36,8 @@ Possible forms of stream specifiers are:
|
|||||||
Matches the stream with this index. E.g. @code{-threads:1 4} would set the
|
Matches the stream with this index. E.g. @code{-threads:1 4} would set the
|
||||||
thread count for the second stream to 4.
|
thread count for the second stream to 4.
|
||||||
@item @var{stream_type}[:@var{stream_index}]
|
@item @var{stream_type}[:@var{stream_index}]
|
||||||
@var{stream_type} is one of following: 'v' or 'V' for video, 'a' for audio, 's'
|
@var{stream_type} is one of following: 'v' for video, 'a' for audio, 's' for subtitle,
|
||||||
for subtitle, 'd' for data, and 't' for attachments. 'v' matches all video
|
'd' for data, and 't' for attachments. If @var{stream_index} is given, then it matches
|
||||||
streams, 'V' only matches video streams which are not attached pictures, video
|
|
||||||
thumbnails or cover arts. If @var{stream_index} is given, then it matches
|
|
||||||
stream number @var{stream_index} of this type. Otherwise, it matches all
|
stream number @var{stream_index} of this type. Otherwise, it matches all
|
||||||
streams of this type.
|
streams of this type.
|
||||||
@item p:@var{program_id}[:@var{stream_index}]
|
@item p:@var{program_id}[:@var{stream_index}]
|
||||||
@@ -52,9 +50,6 @@ Match the stream by stream id (e.g. PID in MPEG-TS container).
|
|||||||
Matches streams with the metadata tag @var{key} having the specified value. If
|
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
|
@var{value} is not given, matches streams that contain the given tag with any
|
||||||
value.
|
value.
|
||||||
@item u
|
|
||||||
Matches streams with usable configuration, the codec must be defined and the
|
|
||||||
essential information such as video dimension or audio sample rate must be present.
|
|
||||||
|
|
||||||
Note that in @command{ffmpeg}, matching by metadata will only work properly for
|
Note that in @command{ffmpeg}, matching by metadata will only work properly for
|
||||||
input files.
|
input files.
|
||||||
@@ -192,7 +187,6 @@ warnings and errors. This is the default value.
|
|||||||
Same as @code{info}, except more verbose.
|
Same as @code{info}, except more verbose.
|
||||||
@item debug, 48
|
@item debug, 48
|
||||||
Show everything, including debugging information.
|
Show everything, including debugging information.
|
||||||
@item trace, 56
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
By default the program logs to stderr, if coloring is supported by the
|
By default the program logs to stderr, if coloring is supported by the
|
||||||
@@ -267,14 +261,10 @@ Possible flags for this option are:
|
|||||||
@item sse4.1
|
@item sse4.1
|
||||||
@item sse4.2
|
@item sse4.2
|
||||||
@item avx
|
@item avx
|
||||||
@item avx2
|
|
||||||
@item xop
|
@item xop
|
||||||
@item fma3
|
|
||||||
@item fma4
|
@item fma4
|
||||||
@item 3dnow
|
@item 3dnow
|
||||||
@item 3dnowext
|
@item 3dnowext
|
||||||
@item bmi1
|
|
||||||
@item bmi2
|
|
||||||
@item cmov
|
@item cmov
|
||||||
@end table
|
@end table
|
||||||
@item ARM
|
@item ARM
|
||||||
@@ -285,13 +275,6 @@ Possible flags for this option are:
|
|||||||
@item vfp
|
@item vfp
|
||||||
@item vfpv3
|
@item vfpv3
|
||||||
@item neon
|
@item neon
|
||||||
@item setend
|
|
||||||
@end table
|
|
||||||
@item AArch64
|
|
||||||
@table @samp
|
|
||||||
@item armv8
|
|
||||||
@item vfp
|
|
||||||
@item neon
|
|
||||||
@end table
|
@end table
|
||||||
@item PowerPC
|
@item PowerPC
|
||||||
@table @samp
|
@table @samp
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ Buffer references ownership and permissions
|
|||||||
The AVFilterLink structure has a few AVFilterBufferRef fields. The
|
The AVFilterLink structure has a few AVFilterBufferRef fields. The
|
||||||
cur_buf and out_buf were used with the deprecated
|
cur_buf and out_buf were used with the deprecated
|
||||||
start_frame/draw_slice/end_frame API and should no longer be used.
|
start_frame/draw_slice/end_frame API and should no longer be used.
|
||||||
src_buf and partial_buf are used by libavfilter internally
|
src_buf, cur_buf_copy and partial_buf are used by libavfilter internally
|
||||||
and must not be accessed by filters.
|
and must not be accessed by filters.
|
||||||
|
|
||||||
Reference permissions
|
Reference permissions
|
||||||
@@ -232,8 +232,7 @@ Frame scheduling
|
|||||||
one of its inputs, repeatedly until at least one frame has been pushed.
|
one of its inputs, repeatedly until at least one frame has been pushed.
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
if request_frame could produce a frame, or at least make progress
|
if request_frame could produce a frame, it should return 0;
|
||||||
towards producing a frame, it should return 0;
|
|
||||||
if it could not for temporary reasons, it should return AVERROR(EAGAIN);
|
if it could not for temporary reasons, it should return AVERROR(EAGAIN);
|
||||||
if it could not because there are no more frames, it should return
|
if it could not because there are no more frames, it should return
|
||||||
AVERROR_EOF.
|
AVERROR_EOF.
|
||||||
@@ -245,18 +244,20 @@ Frame scheduling
|
|||||||
push_one_frame();
|
push_one_frame();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
input = input_where_a_frame_is_most_needed();
|
while (!frame_pushed) {
|
||||||
ret = ff_request_frame(input);
|
input = input_where_a_frame_is_most_needed();
|
||||||
if (ret == AVERROR_EOF) {
|
ret = ff_request_frame(input);
|
||||||
process_eof_on_input();
|
if (ret == AVERROR_EOF) {
|
||||||
} else if (ret < 0) {
|
process_eof_on_input();
|
||||||
return ret;
|
} else if (ret < 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
Note that, except for filters that can have queued frames, request_frame
|
Note that, except for filters that can have queued frames, request_frame
|
||||||
does not push frames: it requests them to its input, and as a reaction,
|
does not push frames: it requests them to its input, and as a reaction,
|
||||||
the filter_frame method possibly will be called and do the work.
|
the filter_frame method will be called and do the work.
|
||||||
|
|
||||||
Legacy API
|
Legacy API
|
||||||
==========
|
==========
|
||||||
|
|||||||
5766
doc/filters.texi
5766
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})
|
@item probesize @var{integer} (@emph{input})
|
||||||
Set probing size in bytes, i.e. the size of the data to analyze to get
|
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
|
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.
|
latency. Must be an integer not lesser than 32. It is 5000000 by default.
|
||||||
|
|
||||||
@@ -37,8 +37,6 @@ Possible values:
|
|||||||
@table @samp
|
@table @samp
|
||||||
@item ignidx
|
@item ignidx
|
||||||
Ignore index.
|
Ignore index.
|
||||||
@item fastseek
|
|
||||||
Enable fast, but inaccurate seeks for some formats.
|
|
||||||
@item genpts
|
@item genpts
|
||||||
Generate PTS.
|
Generate PTS.
|
||||||
@item nofillin
|
@item nofillin
|
||||||
@@ -69,7 +67,7 @@ Default is 0.
|
|||||||
|
|
||||||
@item analyzeduration @var{integer} (@emph{input})
|
@item analyzeduration @var{integer} (@emph{input})
|
||||||
Specify how many microseconds are analyzed to probe the input. A
|
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.
|
increase latency. It defaults to 5,000,000 microseconds = 5 seconds.
|
||||||
|
|
||||||
@item cryptokey @var{hexadecimal string} (@emph{input})
|
@item cryptokey @var{hexadecimal string} (@emph{input})
|
||||||
@@ -127,27 +125,8 @@ Consider all spec non compliancies as errors.
|
|||||||
Consider things that a sane encoder should not do as an error.
|
Consider things that a sane encoder should not do as an error.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item max_interleave_delta @var{integer} (@emph{output})
|
|
||||||
Set maximum buffering duration for interleaving. The duration is
|
|
||||||
expressed in microseconds, and defaults to 1000000 (1 second).
|
|
||||||
|
|
||||||
To ensure all the streams are interleaved correctly, libavformat will
|
|
||||||
wait until it has at least one packet for each stream before actually
|
|
||||||
writing any packets to the output file. When some streams are
|
|
||||||
"sparse" (i.e. there are large gaps between successive packets), this
|
|
||||||
can result in excessive buffering.
|
|
||||||
|
|
||||||
This field specifies the maximum difference between the timestamps of the
|
|
||||||
first and the last packet in the muxing queue, above which libavformat
|
|
||||||
will output a packet regardless of whether it has queued a packet for all
|
|
||||||
the streams.
|
|
||||||
|
|
||||||
If set to 0, libavformat will continue buffering packets until it has
|
|
||||||
a packet for each stream, regardless of the maximum timestamp
|
|
||||||
difference between the buffered packets.
|
|
||||||
|
|
||||||
@item use_wallclock_as_timestamps @var{integer} (@emph{input})
|
@item use_wallclock_as_timestamps @var{integer} (@emph{input})
|
||||||
Use wallclock as timestamps if set to 1. Default is 0.
|
Use wallclock as timestamps.
|
||||||
|
|
||||||
@item avoid_negative_ts @var{integer} (@emph{output})
|
@item avoid_negative_ts @var{integer} (@emph{output})
|
||||||
|
|
||||||
|
|||||||
107
doc/general.texi
107
doc/general.texi
@@ -53,6 +53,14 @@ instructions for installing the libraries.
|
|||||||
Then pass @code{--enable-libopencore-amrnb} and/or
|
Then pass @code{--enable-libopencore-amrnb} and/or
|
||||||
@code{--enable-libopencore-amrwb} to configure to enable them.
|
@code{--enable-libopencore-amrwb} to configure to enable them.
|
||||||
|
|
||||||
|
@subsection VisualOn AAC encoder library
|
||||||
|
|
||||||
|
FFmpeg can make use of the VisualOn AACenc library for AAC encoding.
|
||||||
|
|
||||||
|
Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the
|
||||||
|
instructions for installing the library.
|
||||||
|
Then pass @code{--enable-libvo-aacenc} to configure to enable it.
|
||||||
|
|
||||||
@subsection VisualOn AMR-WB encoder library
|
@subsection VisualOn AMR-WB encoder library
|
||||||
|
|
||||||
FFmpeg can make use of the VisualOn AMR-WBenc library for AMR-WB encoding.
|
FFmpeg can make use of the VisualOn AMR-WBenc library for AMR-WB encoding.
|
||||||
@@ -137,14 +145,6 @@ x265 is under the GNU Public License Version 2 or later
|
|||||||
details), you must upgrade FFmpeg's license to GPL in order to use it.
|
details), you must upgrade FFmpeg's license to GPL in order to use it.
|
||||||
@end float
|
@end float
|
||||||
|
|
||||||
@section kvazaar
|
|
||||||
|
|
||||||
FFmpeg can make use of the kvazaar library for HEVC encoding.
|
|
||||||
|
|
||||||
Go to @url{https://github.com/ultravideo/kvazaar} and follow the
|
|
||||||
instructions for installing the library. Then pass
|
|
||||||
@code{--enable-libkvazaar} to configure to enable it.
|
|
||||||
|
|
||||||
@section libilbc
|
@section libilbc
|
||||||
|
|
||||||
iLBC is a narrowband speech codec that has been made freely available
|
iLBC is a narrowband speech codec that has been made freely available
|
||||||
@@ -165,6 +165,12 @@ Go to @url{http://sourceforge.net/projects/zapping/} and follow the instructions
|
|||||||
installing the library. Then pass @code{--enable-libzvbi} to configure to
|
installing the library. Then pass @code{--enable-libzvbi} to configure to
|
||||||
enable it.
|
enable it.
|
||||||
|
|
||||||
|
@float NOTE
|
||||||
|
libzvbi is licensed under the GNU General Public License Version 2 or later
|
||||||
|
(see @url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html} for details),
|
||||||
|
you must upgrade FFmpeg's license to GPL in order to use it.
|
||||||
|
@end float
|
||||||
|
|
||||||
@section AviSynth
|
@section AviSynth
|
||||||
|
|
||||||
FFmpeg can read AviSynth scripts as input. To enable support, pass
|
FFmpeg can read AviSynth scripts as input. To enable support, pass
|
||||||
@@ -173,8 +179,8 @@ included in compat/avisynth/, which allows the user to enable support
|
|||||||
without needing to search for these headers themselves.
|
without needing to search for these headers themselves.
|
||||||
|
|
||||||
For Windows, supported AviSynth variants are
|
For Windows, supported AviSynth variants are
|
||||||
@url{http://avisynth.nl, AviSynth 2.6 RC1 or higher} for 32-bit builds and
|
@url{http://avisynth.nl, AviSynth 2.5 or 2.6} for 32-bit builds and
|
||||||
@url{http://avs-plus.net, AviSynth+ r1718 or higher} for 32-bit and 64-bit builds.
|
@url{http://avs-plus.net, AviSynth+ 0.1} for 32-bit and 64-bit builds.
|
||||||
|
|
||||||
For Linux and OS X, the supported AviSynth variant is
|
For Linux and OS X, the supported AviSynth variant is
|
||||||
@url{https://github.com/avxsynth/avxsynth, AvxSynth}.
|
@url{https://github.com/avxsynth/avxsynth, AvxSynth}.
|
||||||
@@ -186,17 +192,6 @@ end user having AviSynth or AvxSynth installed - they'll only need to be
|
|||||||
installed to use AviSynth scripts (obviously).
|
installed to use AviSynth scripts (obviously).
|
||||||
@end float
|
@end float
|
||||||
|
|
||||||
@section Intel QuickSync Video
|
|
||||||
|
|
||||||
FFmpeg can use Intel QuickSync Video (QSV) for accelerated encoding and decoding
|
|
||||||
of multiple codecs. To use QSV, FFmpeg must be linked against the @code{libmfx}
|
|
||||||
dispatcher, which loads the actual decoding libraries.
|
|
||||||
|
|
||||||
The dispatcher is open source and can be downloaded from
|
|
||||||
@url{https://github.com/lu-zero/mfx_dispatch.git}. FFmpeg needs to be configured
|
|
||||||
with the @code{--enable-libmfx} option and @code{pkg-config} needs to be able to
|
|
||||||
locate the dispatcher's @code{.pc} files.
|
|
||||||
|
|
||||||
|
|
||||||
@chapter Supported File Formats, Codecs or Features
|
@chapter Supported File Formats, Codecs or Features
|
||||||
|
|
||||||
@@ -209,14 +204,9 @@ library:
|
|||||||
|
|
||||||
@multitable @columnfractions .4 .1 .1 .4
|
@multitable @columnfractions .4 .1 .1 .4
|
||||||
@item Name @tab Encoding @tab Decoding @tab Comments
|
@item Name @tab Encoding @tab Decoding @tab Comments
|
||||||
@item 3dostr @tab @tab X
|
|
||||||
@item 4xm @tab @tab X
|
@item 4xm @tab @tab X
|
||||||
@tab 4X Technologies format, used in some games.
|
@tab 4X Technologies format, used in some games.
|
||||||
@item 8088flex TMV @tab @tab X
|
@item 8088flex TMV @tab @tab X
|
||||||
@item AAX @tab @tab X
|
|
||||||
@tab Audible Enhanced Audio format, used in audiobooks.
|
|
||||||
@item AA @tab @tab X
|
|
||||||
@tab Audible Format 2, 3, and 4, used in audiobooks.
|
|
||||||
@item ACT Voice @tab @tab X
|
@item ACT Voice @tab @tab X
|
||||||
@tab contains G.729 audio
|
@tab contains G.729 audio
|
||||||
@item Adobe Filmstrip @tab X @tab X
|
@item Adobe Filmstrip @tab X @tab X
|
||||||
@@ -228,15 +218,10 @@ library:
|
|||||||
@tab Multimedia format used in game Heart Of Darkness.
|
@tab Multimedia format used in game Heart Of Darkness.
|
||||||
@item Apple HTTP Live Streaming @tab @tab X
|
@item Apple HTTP Live Streaming @tab @tab X
|
||||||
@item Artworx Data Format @tab @tab X
|
@item Artworx Data Format @tab @tab X
|
||||||
@item Interplay ACM @tab @tab X
|
|
||||||
@tab Audio only format used in some Interplay games.
|
|
||||||
@item ADP @tab @tab X
|
@item ADP @tab @tab X
|
||||||
@tab Audio format used on the Nintendo Gamecube.
|
@tab Audio format used on the Nintendo Gamecube.
|
||||||
@item AFC @tab @tab X
|
@item AFC @tab @tab X
|
||||||
@tab Audio format used on the Nintendo Gamecube.
|
@tab Audio format used on the Nintendo Gamecube.
|
||||||
@item ADS/SS2 @tab @tab X
|
|
||||||
@tab Audio format used on the PS2.
|
|
||||||
@item APNG @tab X @tab X
|
|
||||||
@item ASF @tab X @tab X
|
@item ASF @tab X @tab X
|
||||||
@item AST @tab X @tab X
|
@item AST @tab X @tab X
|
||||||
@tab Audio format used on the Nintendo Wii.
|
@tab Audio format used on the Nintendo Wii.
|
||||||
@@ -257,8 +242,6 @@ library:
|
|||||||
@tab Used in Z and Z95 games.
|
@tab Used in Z and Z95 games.
|
||||||
@item Brute Force & Ignorance @tab @tab X
|
@item Brute Force & Ignorance @tab @tab X
|
||||||
@tab Used in the game Flash Traffic: City of Angels.
|
@tab Used in the game Flash Traffic: City of Angels.
|
||||||
@item BFSTM @tab @tab X
|
|
||||||
@tab Audio format used on the Nintendo WiiU (based on BRSTM).
|
|
||||||
@item BRSTM @tab @tab X
|
@item BRSTM @tab @tab X
|
||||||
@tab Audio format used on the Nintendo Wii.
|
@tab Audio format used on the Nintendo Wii.
|
||||||
@item BWF @tab X @tab X
|
@item BWF @tab X @tab X
|
||||||
@@ -270,13 +253,10 @@ library:
|
|||||||
@item Delphine Software International CIN @tab @tab X
|
@item Delphine Software International CIN @tab @tab X
|
||||||
@tab Multimedia format used by Delphine Software games.
|
@tab Multimedia format used by Delphine Software games.
|
||||||
@item Digital Speech Standard (DSS) @tab @tab X
|
@item Digital Speech Standard (DSS) @tab @tab X
|
||||||
@item Canopus HQ @tab @tab X
|
|
||||||
@item Canopus HQA @tab @tab X
|
|
||||||
@item Canopus HQX @tab @tab X
|
@item Canopus HQX @tab @tab X
|
||||||
@item CD+G @tab @tab X
|
@item CD+G @tab @tab X
|
||||||
@tab Video format used by CD+G karaoke disks
|
@tab Video format used by CD+G karaoke disks
|
||||||
@item Phantom Cine @tab @tab X
|
@item Phantom Cine @tab @tab X
|
||||||
@item Cineform HD @tab @tab X
|
|
||||||
@item Commodore CDXL @tab @tab X
|
@item Commodore CDXL @tab @tab X
|
||||||
@tab Amiga CD video format
|
@tab Amiga CD video format
|
||||||
@item Core Audio Format @tab X @tab X
|
@item Core Audio Format @tab X @tab X
|
||||||
@@ -288,10 +268,8 @@ library:
|
|||||||
@tab Audio format used in some games by CRYO Interactive Entertainment.
|
@tab Audio format used in some games by CRYO Interactive Entertainment.
|
||||||
@item D-Cinema audio @tab X @tab X
|
@item D-Cinema audio @tab X @tab X
|
||||||
@item Deluxe Paint Animation @tab @tab X
|
@item Deluxe Paint Animation @tab @tab X
|
||||||
@item DCSTR @tab @tab X
|
|
||||||
@item DFA @tab @tab X
|
@item DFA @tab @tab X
|
||||||
@tab This format is used in Chronomaster game
|
@tab This format is used in Chronomaster game
|
||||||
@item DirectDraw Surface @tab @tab X
|
|
||||||
@item DSD Stream File (DSF) @tab @tab X
|
@item DSD Stream File (DSF) @tab @tab X
|
||||||
@item DV video @tab X @tab X
|
@item DV video @tab X @tab X
|
||||||
@item DXA @tab @tab X
|
@item DXA @tab @tab X
|
||||||
@@ -315,8 +293,6 @@ library:
|
|||||||
@item G.723.1 @tab X @tab X
|
@item G.723.1 @tab X @tab X
|
||||||
@item G.729 BIT @tab X @tab X
|
@item G.729 BIT @tab X @tab X
|
||||||
@item G.729 raw @tab @tab X
|
@item G.729 raw @tab @tab X
|
||||||
@item GENH @tab @tab X
|
|
||||||
@tab Audio format for various games.
|
|
||||||
@item GIF Animation @tab X @tab X
|
@item GIF Animation @tab X @tab X
|
||||||
@item GXF @tab X @tab X
|
@item GXF @tab X @tab X
|
||||||
@tab General eXchange Format SMPTE 360M, used by Thomson Grass Valley
|
@tab General eXchange Format SMPTE 360M, used by Thomson Grass Valley
|
||||||
@@ -339,7 +315,6 @@ library:
|
|||||||
@tab A format generated by IndigoVision 8000 video server.
|
@tab A format generated by IndigoVision 8000 video server.
|
||||||
@item IVF (On2) @tab X @tab X
|
@item IVF (On2) @tab X @tab X
|
||||||
@tab A format used by libvpx
|
@tab A format used by libvpx
|
||||||
@item Internet Video Recording @tab @tab X
|
|
||||||
@item IRCAM @tab X @tab X
|
@item IRCAM @tab X @tab X
|
||||||
@item LATM @tab X @tab X
|
@item LATM @tab X @tab X
|
||||||
@item LMLM4 @tab @tab X
|
@item LMLM4 @tab @tab X
|
||||||
@@ -376,8 +351,6 @@ library:
|
|||||||
@tab also known as DVB Transport Stream
|
@tab also known as DVB Transport Stream
|
||||||
@item MPEG-4 @tab X @tab X
|
@item MPEG-4 @tab X @tab X
|
||||||
@tab MPEG-4 is a variant of QuickTime.
|
@tab MPEG-4 is a variant of QuickTime.
|
||||||
@item MSF @tab @tab X
|
|
||||||
@tab Audio format used on the PS3.
|
|
||||||
@item Mirillis FIC video @tab @tab X
|
@item Mirillis FIC video @tab @tab X
|
||||||
@tab No cursor rendering.
|
@tab No cursor rendering.
|
||||||
@item MIME multipart JPEG @tab X @tab
|
@item MIME multipart JPEG @tab X @tab
|
||||||
@@ -461,7 +434,6 @@ library:
|
|||||||
@item Redirector @tab @tab X
|
@item Redirector @tab @tab X
|
||||||
@item RedSpark @tab @tab X
|
@item RedSpark @tab @tab X
|
||||||
@item Renderware TeXture Dictionary @tab @tab X
|
@item Renderware TeXture Dictionary @tab @tab X
|
||||||
@item Resolume DXV @tab @tab X
|
|
||||||
@item RL2 @tab @tab X
|
@item RL2 @tab @tab X
|
||||||
@tab Audio and video format used in some games by Entertainment Software Partners.
|
@tab Audio and video format used in some games by Entertainment Software Partners.
|
||||||
@item RPL/ARMovie @tab @tab X
|
@item RPL/ARMovie @tab @tab X
|
||||||
@@ -494,22 +466,14 @@ library:
|
|||||||
@item SoX native format @tab X @tab X
|
@item SoX native format @tab X @tab X
|
||||||
@item SUN AU format @tab X @tab X
|
@item SUN AU format @tab X @tab X
|
||||||
@item SUP raw PGS subtitles @tab @tab X
|
@item SUP raw PGS subtitles @tab @tab X
|
||||||
@item SVAG @tab @tab X
|
|
||||||
@tab Audio format used in Konami PS2 games.
|
|
||||||
@item TDSC @tab @tab X
|
|
||||||
@item Text files @tab @tab X
|
@item Text files @tab @tab X
|
||||||
@item THP @tab @tab X
|
@item THP @tab @tab X
|
||||||
@tab Used on the Nintendo GameCube.
|
@tab Used on the Nintendo GameCube.
|
||||||
@item Tiertex Limited SEQ @tab @tab X
|
@item Tiertex Limited SEQ @tab @tab X
|
||||||
@tab Tiertex .seq files used in the DOS CD-ROM version of the game Flashback.
|
@tab Tiertex .seq files used in the DOS CD-ROM version of the game Flashback.
|
||||||
@item True Audio @tab @tab X
|
@item True Audio @tab @tab X
|
||||||
@item VAG @tab @tab X
|
|
||||||
@tab Audio format used in many Sony PS2 games.
|
|
||||||
@item VC-1 test bitstream @tab X @tab X
|
@item VC-1 test bitstream @tab X @tab X
|
||||||
@item Vidvox Hap @tab X @tab X
|
|
||||||
@item Vivo @tab @tab X
|
@item Vivo @tab @tab X
|
||||||
@item VPK @tab @tab X
|
|
||||||
@tab Audio format used in Sony PS games.
|
|
||||||
@item WAV @tab X @tab X
|
@item WAV @tab X @tab X
|
||||||
@item WavPack @tab X @tab X
|
@item WavPack @tab X @tab X
|
||||||
@item WebM @tab X @tab X
|
@item WebM @tab X @tab X
|
||||||
@@ -520,12 +484,8 @@ library:
|
|||||||
@tab Multimedia format used in Westwood Studios games.
|
@tab Multimedia format used in Westwood Studios games.
|
||||||
@item Westwood Studios VQA @tab @tab X
|
@item Westwood Studios VQA @tab @tab X
|
||||||
@tab Multimedia format used in Westwood Studios games.
|
@tab Multimedia format used in Westwood Studios games.
|
||||||
@item Wideband Single-bit Data (WSD) @tab @tab X
|
|
||||||
@item WVE @tab @tab X
|
|
||||||
@item XMV @tab @tab X
|
@item XMV @tab @tab X
|
||||||
@tab Microsoft video container used in Xbox games.
|
@tab Microsoft video container used in Xbox games.
|
||||||
@item XVAG @tab @tab X
|
|
||||||
@tab Audio format used on the PS3.
|
|
||||||
@item xWMA @tab @tab X
|
@item xWMA @tab @tab X
|
||||||
@tab Microsoft audio container used by XAudio 2.
|
@tab Microsoft audio container used by XAudio 2.
|
||||||
@item eXtended BINary text (XBIN) @tab @tab X
|
@item eXtended BINary text (XBIN) @tab @tab X
|
||||||
@@ -547,7 +507,6 @@ following image formats are supported:
|
|||||||
@item Alias PIX @tab X @tab X
|
@item Alias PIX @tab X @tab X
|
||||||
@tab Alias/Wavefront PIX image format
|
@tab Alias/Wavefront PIX image format
|
||||||
@item animated GIF @tab X @tab X
|
@item animated GIF @tab X @tab X
|
||||||
@item APNG @tab X @tab X
|
|
||||||
@item BMP @tab X @tab X
|
@item BMP @tab X @tab X
|
||||||
@tab Microsoft BMP image
|
@tab Microsoft BMP image
|
||||||
@item BRender PIX @tab @tab X
|
@item BRender PIX @tab @tab X
|
||||||
@@ -644,7 +603,6 @@ following image formats are supported:
|
|||||||
@item Bethesda VID video @tab @tab X
|
@item Bethesda VID video @tab @tab X
|
||||||
@tab Used in some games from Bethesda Softworks.
|
@tab Used in some games from Bethesda Softworks.
|
||||||
@item Bink Video @tab @tab X
|
@item Bink Video @tab @tab X
|
||||||
@item BitJazz SheerVideo @tab @tab X
|
|
||||||
@item Bitmap Brothers JV video @tab @tab X
|
@item Bitmap Brothers JV video @tab @tab X
|
||||||
@item y41p Brooktree uncompressed 4:1:1 12-bit @tab X @tab X
|
@item y41p Brooktree uncompressed 4:1:1 12-bit @tab X @tab X
|
||||||
@item Brute Force & Ignorance @tab @tab X
|
@item Brute Force & Ignorance @tab @tab X
|
||||||
@@ -700,8 +658,6 @@ following image formats are supported:
|
|||||||
@tab Sorenson H.263 used in Flash
|
@tab Sorenson H.263 used in Flash
|
||||||
@item Forward Uncompressed @tab @tab X
|
@item Forward Uncompressed @tab @tab X
|
||||||
@item Fraps @tab @tab X
|
@item Fraps @tab @tab X
|
||||||
@item Go2Meeting @tab @tab X
|
|
||||||
@tab fourcc: G2M2, G2M3
|
|
||||||
@item Go2Webinar @tab @tab X
|
@item Go2Webinar @tab @tab X
|
||||||
@tab fourcc: G2M4
|
@tab fourcc: G2M4
|
||||||
@item H.261 @tab X @tab X
|
@item H.261 @tab X @tab X
|
||||||
@@ -710,7 +666,7 @@ following image formats are supported:
|
|||||||
@item H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 @tab E @tab X
|
@item H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 @tab E @tab X
|
||||||
@tab encoding supported through external library libx264 and OpenH264
|
@tab encoding supported through external library libx264 and OpenH264
|
||||||
@item HEVC @tab X @tab X
|
@item HEVC @tab X @tab X
|
||||||
@tab encoding supported through external library libx265 and libkvazaar
|
@tab encoding supported through the external library libx265
|
||||||
@item HNM version 4 @tab @tab X
|
@item HNM version 4 @tab @tab X
|
||||||
@item HuffYUV @tab X @tab X
|
@item HuffYUV @tab X @tab X
|
||||||
@item HuffYUV FFmpeg variant @tab X @tab X
|
@item HuffYUV FFmpeg variant @tab X @tab X
|
||||||
@@ -745,7 +701,6 @@ following image formats are supported:
|
|||||||
@item LucasArts SANM/Smush @tab @tab X
|
@item LucasArts SANM/Smush @tab @tab X
|
||||||
@tab Used in LucasArts games / SMUSH animations.
|
@tab Used in LucasArts games / SMUSH animations.
|
||||||
@item lossless MJPEG @tab X @tab X
|
@item lossless MJPEG @tab X @tab X
|
||||||
@item MagicYUV Lossless Video @tab @tab X
|
|
||||||
@item Microsoft ATC Screen @tab @tab X
|
@item Microsoft ATC Screen @tab @tab X
|
||||||
@tab Also known as Microsoft Screen 3.
|
@tab Also known as Microsoft Screen 3.
|
||||||
@item Microsoft Expression Encoder Screen @tab @tab X
|
@item Microsoft Expression Encoder Screen @tab @tab X
|
||||||
@@ -810,7 +765,6 @@ following image formats are supported:
|
|||||||
@tab Texture dictionaries used by the Renderware Engine.
|
@tab Texture dictionaries used by the Renderware Engine.
|
||||||
@item RL2 video @tab @tab X
|
@item RL2 video @tab @tab X
|
||||||
@tab used in some games by Entertainment Software Partners
|
@tab used in some games by Entertainment Software Partners
|
||||||
@item Screenpresso @tab @tab X
|
|
||||||
@item Sierra VMD video @tab @tab X
|
@item Sierra VMD video @tab @tab X
|
||||||
@tab Used in Sierra VMD files.
|
@tab Used in Sierra VMD files.
|
||||||
@item Silicon Graphics Motion Video Compressor 1 (MVC1) @tab @tab X
|
@item Silicon Graphics Motion Video Compressor 1 (MVC1) @tab @tab X
|
||||||
@@ -877,13 +831,12 @@ following image formats are supported:
|
|||||||
@item Name @tab Encoding @tab Decoding @tab Comments
|
@item Name @tab Encoding @tab Decoding @tab Comments
|
||||||
@item 8SVX exponential @tab @tab X
|
@item 8SVX exponential @tab @tab X
|
||||||
@item 8SVX fibonacci @tab @tab X
|
@item 8SVX fibonacci @tab @tab X
|
||||||
@item AAC @tab EX @tab X
|
@item AAC+ @tab E @tab X
|
||||||
@tab encoding supported through internal encoder and external libraries libfaac and libfdk-aac
|
@tab encoding supported through external library libaacplus
|
||||||
@item AAC+ @tab E @tab IX
|
@item AAC @tab E @tab X
|
||||||
@tab encoding supported through external library libfdk-aac
|
@tab encoding supported through external library libfaac and libvo-aacenc
|
||||||
@item AC-3 @tab IX @tab IX
|
@item AC-3 @tab IX @tab IX
|
||||||
@item ADPCM 4X Movie @tab @tab X
|
@item ADPCM 4X Movie @tab @tab X
|
||||||
@item APDCM Yamaha AICA @tab @tab X
|
|
||||||
@item ADPCM CDROM XA @tab @tab X
|
@item ADPCM CDROM XA @tab @tab X
|
||||||
@item ADPCM Creative Technology @tab @tab X
|
@item ADPCM Creative Technology @tab @tab X
|
||||||
@tab 16 -> 4, 8 -> 4, 8 -> 3, 8 -> 2
|
@tab 16 -> 4, 8 -> 4, 8 -> 3, 8 -> 2
|
||||||
@@ -918,8 +871,7 @@ following image formats are supported:
|
|||||||
@item ADPCM MS IMA @tab X @tab X
|
@item ADPCM MS IMA @tab X @tab X
|
||||||
@item ADPCM Nintendo Gamecube AFC @tab @tab X
|
@item ADPCM Nintendo Gamecube AFC @tab @tab X
|
||||||
@item ADPCM Nintendo Gamecube DTK @tab @tab X
|
@item ADPCM Nintendo Gamecube DTK @tab @tab X
|
||||||
@item ADPCM Nintendo THP @tab @tab X
|
@item ADPCM Nintendo Gamecube THP @tab @tab X
|
||||||
@item APDCM Playstation @tab @tab X
|
|
||||||
@item ADPCM QT IMA @tab X @tab X
|
@item ADPCM QT IMA @tab X @tab X
|
||||||
@item ADPCM SEGA CRI ADX @tab X @tab X
|
@item ADPCM SEGA CRI ADX @tab X @tab X
|
||||||
@tab Used in Sega Dreamcast games.
|
@tab Used in Sega Dreamcast games.
|
||||||
@@ -927,7 +879,7 @@ following image formats are supported:
|
|||||||
@item ADPCM Sound Blaster Pro 2-bit @tab @tab X
|
@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 2.6-bit @tab @tab X
|
||||||
@item ADPCM Sound Blaster Pro 4-bit @tab @tab X
|
@item ADPCM Sound Blaster Pro 4-bit @tab @tab X
|
||||||
@item ADPCM VIMA @tab @tab X
|
@item ADPCM VIMA
|
||||||
@tab Used in LucasArts SMUSH animations.
|
@tab Used in LucasArts SMUSH animations.
|
||||||
@item ADPCM Westwood Studios IMA @tab @tab X
|
@item ADPCM Westwood Studios IMA @tab @tab X
|
||||||
@tab Used in Westwood Studios games like Command and Conquer.
|
@tab Used in Westwood Studios games like Command and Conquer.
|
||||||
@@ -953,13 +905,10 @@ following image formats are supported:
|
|||||||
@item COOK @tab @tab X
|
@item COOK @tab @tab X
|
||||||
@tab All versions except 5.1 are supported.
|
@tab All versions except 5.1 are supported.
|
||||||
@item DCA (DTS Coherent Acoustics) @tab X @tab X
|
@item DCA (DTS Coherent Acoustics) @tab X @tab X
|
||||||
@tab supported extensions: XCh, XXCH, X96, XBR, XLL, LBR (partially)
|
|
||||||
@item DPCM id RoQ @tab X @tab X
|
@item DPCM id RoQ @tab X @tab X
|
||||||
@tab Used in Quake III, Jedi Knight 2 and other computer games.
|
@tab Used in Quake III, Jedi Knight 2 and other computer games.
|
||||||
@item DPCM Interplay @tab @tab X
|
@item DPCM Interplay @tab @tab X
|
||||||
@tab Used in various Interplay computer games.
|
@tab Used in various Interplay computer games.
|
||||||
@item DPCM Squareroot-Delta-Exact @tab @tab X
|
|
||||||
@tab Used in various games.
|
|
||||||
@item DPCM Sierra Online @tab @tab X
|
@item DPCM Sierra Online @tab @tab X
|
||||||
@tab Used in Sierra Online game audio files.
|
@tab Used in Sierra Online game audio files.
|
||||||
@item DPCM Sol @tab @tab X
|
@item DPCM Sol @tab @tab X
|
||||||
@@ -970,12 +919,11 @@ following image formats are supported:
|
|||||||
@item DSD (Direct Stream Digitial), least significant bit first, planar @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 DSD (Direct Stream Digitial), most significant bit first, planar @tab @tab X
|
||||||
@item DSP Group TrueSpeech @tab @tab X
|
@item DSP Group TrueSpeech @tab @tab X
|
||||||
@item DST (Direct Stream Transfer) @tab @tab X
|
|
||||||
@item DV audio @tab @tab X
|
@item DV audio @tab @tab X
|
||||||
@item Enhanced AC-3 @tab X @tab X
|
@item Enhanced AC-3 @tab X @tab X
|
||||||
@item EVRC (Enhanced Variable Rate Codec) @tab @tab X
|
@item EVRC (Enhanced Variable Rate Codec) @tab @tab X
|
||||||
@item FLAC (Free Lossless Audio Codec) @tab X @tab IX
|
@item FLAC (Free Lossless Audio Codec) @tab X @tab IX
|
||||||
@item G.723.1 @tab X @tab X
|
@item G.723.1 @tab X @tab X
|
||||||
@item G.729 @tab @tab X
|
@item G.729 @tab @tab X
|
||||||
@item GSM @tab E @tab X
|
@item GSM @tab E @tab X
|
||||||
@tab encoding supported through external library libgsm
|
@tab encoding supported through external library libgsm
|
||||||
@@ -985,7 +933,6 @@ following image formats are supported:
|
|||||||
@item iLBC (Internet Low Bitrate Codec) @tab E @tab E
|
@item iLBC (Internet Low Bitrate Codec) @tab E @tab E
|
||||||
@tab encoding and decoding supported through external library libilbc
|
@tab encoding and decoding supported through external library libilbc
|
||||||
@item IMC (Intel Music Coder) @tab @tab X
|
@item IMC (Intel Music Coder) @tab @tab X
|
||||||
@item Interplay ACM @tab @tab X
|
|
||||||
@item MACE (Macintosh Audio Compression/Expansion) 3:1 @tab @tab X
|
@item MACE (Macintosh Audio Compression/Expansion) 3:1 @tab @tab X
|
||||||
@item MACE (Macintosh Audio Compression/Expansion) 6:1 @tab @tab X
|
@item MACE (Macintosh Audio Compression/Expansion) 6:1 @tab @tab X
|
||||||
@item MLP (Meridian Lossless Packing) @tab @tab X
|
@item MLP (Meridian Lossless Packing) @tab @tab X
|
||||||
@@ -1001,8 +948,8 @@ following image formats are supported:
|
|||||||
@item Musepack SV8 @tab @tab X
|
@item Musepack SV8 @tab @tab X
|
||||||
@item Nellymoser Asao @tab X @tab X
|
@item Nellymoser Asao @tab X @tab X
|
||||||
@item On2 AVC (Audio for Video Codec) @tab @tab X
|
@item On2 AVC (Audio for Video Codec) @tab @tab X
|
||||||
@item Opus @tab E @tab X
|
@item Opus @tab E @tab E
|
||||||
@tab encoding supported through external library libopus
|
@tab supported through external library libopus
|
||||||
@item PCM A-law @tab X @tab X
|
@item PCM A-law @tab X @tab X
|
||||||
@item PCM mu-law @tab X @tab X
|
@item PCM mu-law @tab X @tab X
|
||||||
@item PCM signed 8-bit planar @tab X @tab X
|
@item PCM signed 8-bit planar @tab X @tab X
|
||||||
@@ -1070,8 +1017,6 @@ following image formats are supported:
|
|||||||
@item Windows Media Audio Lossless @tab @tab X
|
@item Windows Media Audio Lossless @tab @tab X
|
||||||
@item Windows Media Audio Pro @tab @tab X
|
@item Windows Media Audio Pro @tab @tab X
|
||||||
@item Windows Media Audio Voice @tab @tab X
|
@item Windows Media Audio Voice @tab @tab X
|
||||||
@item Xbox Media Audio 1 @tab @tab X
|
|
||||||
@item Xbox Media Audio 2 @tab @tab X
|
|
||||||
@end multitable
|
@end multitable
|
||||||
|
|
||||||
@code{X} means that encoding (resp. decoding) is supported.
|
@code{X} means that encoding (resp. decoding) is supported.
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
\input texinfo @c -*- texinfo -*-
|
\input texinfo @c -*- texinfo -*-
|
||||||
@documentencoding UTF-8
|
@documentencoding UTF-8
|
||||||
|
|
||||||
@settitle Using Git to develop FFmpeg
|
@settitle Using git to develop FFmpeg
|
||||||
|
|
||||||
@titlepage
|
@titlepage
|
||||||
@center @titlefont{Using Git to develop FFmpeg}
|
@center @titlefont{Using git to develop FFmpeg}
|
||||||
@end titlepage
|
@end titlepage
|
||||||
|
|
||||||
@top
|
@top
|
||||||
@@ -13,9 +13,9 @@
|
|||||||
|
|
||||||
@chapter Introduction
|
@chapter Introduction
|
||||||
|
|
||||||
This document aims in giving some quick references on a set of useful Git
|
This document aims in giving some quick references on a set of useful git
|
||||||
commands. You should always use the extensive and detailed documentation
|
commands. You should always use the extensive and detailed documentation
|
||||||
provided directly by Git:
|
provided directly by git:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
git --help
|
git --help
|
||||||
@@ -32,21 +32,22 @@ man git-<command>
|
|||||||
shows information about the subcommand <command>.
|
shows information about the subcommand <command>.
|
||||||
|
|
||||||
Additional information could be found on the
|
Additional information could be found on the
|
||||||
@url{http://gitref.org, Git Reference} website.
|
@url{http://gitref.org, Git Reference} website
|
||||||
|
|
||||||
For more information about the Git project, visit the
|
For more information about the Git project, visit the
|
||||||
@url{http://git-scm.com/, Git website}.
|
|
||||||
|
@url{http://git-scm.com/, Git website}
|
||||||
|
|
||||||
Consult these resources whenever you have problems, they are quite exhaustive.
|
Consult these resources whenever you have problems, they are quite exhaustive.
|
||||||
|
|
||||||
What follows now is a basic introduction to Git and some FFmpeg-specific
|
What follows now is a basic introduction to Git and some FFmpeg-specific
|
||||||
guidelines to ease the contribution to the project.
|
guidelines to ease the contribution to the project
|
||||||
|
|
||||||
@chapter Basics Usage
|
@chapter Basics Usage
|
||||||
|
|
||||||
@section Get Git
|
@section Get GIT
|
||||||
|
|
||||||
You can get Git from @url{http://git-scm.com/}
|
You can get git from @url{http://git-scm.com/}
|
||||||
Most distribution and operating system provide a package for it.
|
Most distribution and operating system provide a package for it.
|
||||||
|
|
||||||
|
|
||||||
@@ -65,21 +66,6 @@ git clone git@@source.ffmpeg.org:ffmpeg <target>
|
|||||||
This will put the FFmpeg sources into the directory @var{<target>} and let
|
This will put the FFmpeg sources into the directory @var{<target>} and let
|
||||||
you push back your changes to the remote repository.
|
you push back your changes to the remote repository.
|
||||||
|
|
||||||
@example
|
|
||||||
git clone gil@@ffmpeg.org:ffmpeg-web <target>
|
|
||||||
@end example
|
|
||||||
|
|
||||||
This will put the source of the FFmpeg website into the directory
|
|
||||||
@var{<target>} and let you push back your changes to the remote repository.
|
|
||||||
(Note that @var{gil} stands for GItoLite and is not a typo of @var{git}.)
|
|
||||||
|
|
||||||
If you don't have write-access to the ffmpeg-web repository, you can
|
|
||||||
create patches after making a read-only ffmpeg-web clone:
|
|
||||||
|
|
||||||
@example
|
|
||||||
git clone git://ffmpeg.org/ffmpeg-web <target>
|
|
||||||
@end example
|
|
||||||
|
|
||||||
Make sure that you do not have Windows line endings in your checkouts,
|
Make sure that you do not have Windows line endings in your checkouts,
|
||||||
otherwise you may experience spurious compilation failures. One way to
|
otherwise you may experience spurious compilation failures. One way to
|
||||||
achieve this is to run
|
achieve this is to run
|
||||||
@@ -89,7 +75,6 @@ git config --global core.autocrlf false
|
|||||||
@end example
|
@end example
|
||||||
|
|
||||||
|
|
||||||
@anchor{Updating the source tree to the latest revision}
|
|
||||||
@section Updating the source tree to the latest revision
|
@section Updating the source tree to the latest revision
|
||||||
|
|
||||||
@example
|
@example
|
||||||
@@ -122,7 +107,7 @@ git add [-A] <filename/dirname>
|
|||||||
git rm [-r] <filename/dirname>
|
git rm [-r] <filename/dirname>
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Git needs to get notified of all changes you make to your working
|
GIT needs to get notified of all changes you make to your working
|
||||||
directory that makes files appear or disappear.
|
directory that makes files appear or disappear.
|
||||||
Line moves across files are automatically tracked.
|
Line moves across files are automatically tracked.
|
||||||
|
|
||||||
@@ -142,8 +127,8 @@ will show all local modifications in your working directory as unified diff.
|
|||||||
git log <filename(s)>
|
git log <filename(s)>
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
You may also use the graphical tools like @command{gitview} or @command{gitk}
|
You may also use the graphical tools like gitview or gitk or the web
|
||||||
or the web interface available at @url{http://source.ffmpeg.org/}.
|
interface available at http://source.ffmpeg.org/
|
||||||
|
|
||||||
@section Checking source tree status
|
@section Checking source tree status
|
||||||
|
|
||||||
@@ -164,7 +149,6 @@ git diff --check
|
|||||||
to double check your changes before committing them to avoid trouble later
|
to double check your changes before committing them to avoid trouble later
|
||||||
on. All experienced developers do this on each and every commit, no matter
|
on. All experienced developers do this on each and every commit, no matter
|
||||||
how small.
|
how small.
|
||||||
|
|
||||||
Every one of them has been saved from looking like a fool by this many times.
|
Every one of them has been saved from looking like a fool by this many times.
|
||||||
It's very easy for stray debug output or cosmetic modifications to slip in,
|
It's very easy for stray debug output or cosmetic modifications to slip in,
|
||||||
please avoid problems through this extra level of scrutiny.
|
please avoid problems through this extra level of scrutiny.
|
||||||
@@ -187,14 +171,14 @@ to make sure you don't have untracked files or deletions.
|
|||||||
git add [-i|-p|-A] <filenames/dirnames>
|
git add [-i|-p|-A] <filenames/dirnames>
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Make sure you have told Git your name and email address
|
Make sure you have told git your name and email address
|
||||||
|
|
||||||
@example
|
@example
|
||||||
git config --global user.name "My Name"
|
git config --global user.name "My Name"
|
||||||
git config --global user.email my@@email.invalid
|
git config --global user.email my@@email.invalid
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Use @option{--global} to set the global configuration for all your Git checkouts.
|
Use @var{--global} to set the global configuration for all your git checkouts.
|
||||||
|
|
||||||
Git will select the changes to the files for commit. Optionally you can use
|
Git will select the changes to the files for commit. Optionally you can use
|
||||||
the interactive or the patch mode to select hunk by hunk what should be
|
the interactive or the patch mode to select hunk by hunk what should be
|
||||||
@@ -225,7 +209,7 @@ include filenames in log messages, Git provides that information.
|
|||||||
|
|
||||||
Possibly make the commit message have a terse, descriptive first line, an
|
Possibly make the commit message have a terse, descriptive first line, an
|
||||||
empty line and then a full description. The first line will be used to name
|
empty line and then a full description. The first line will be used to name
|
||||||
the patch by @command{git format-patch}.
|
the patch by git format-patch.
|
||||||
|
|
||||||
@section Preparing a patchset
|
@section Preparing a patchset
|
||||||
|
|
||||||
@@ -341,14 +325,12 @@ faulty commit disappear from the history.
|
|||||||
@section Pushing changes to remote trees
|
@section Pushing changes to remote trees
|
||||||
|
|
||||||
@example
|
@example
|
||||||
git push origin master --dry-run
|
git push
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Will simulate a push of the local master branch to the default remote
|
Will push the changes to the default remote (@var{origin}).
|
||||||
(@var{origin}). And list which branches and ranges or commits would have been
|
|
||||||
pushed.
|
|
||||||
Git will prevent you from pushing changes if the local and remote trees are
|
Git will prevent you from pushing changes if the local and remote trees are
|
||||||
out of sync. Refer to @ref{Updating the source tree to the latest revision}.
|
out of sync. Refer to and to sync the local tree.
|
||||||
|
|
||||||
@example
|
@example
|
||||||
git remote add <name> <url>
|
git remote add <name> <url>
|
||||||
@@ -367,24 +349,23 @@ branches matching the local ones.
|
|||||||
|
|
||||||
@section Finding a specific svn revision
|
@section Finding a specific svn revision
|
||||||
|
|
||||||
Since version 1.7.1 Git supports @samp{:/foo} syntax for specifying commits
|
Since version 1.7.1 git supports @var{:/foo} syntax for specifying commits
|
||||||
based on a regular expression. see man gitrevisions
|
based on a regular expression. see man gitrevisions
|
||||||
|
|
||||||
@example
|
@example
|
||||||
git show :/'as revision 23456'
|
git show :/'as revision 23456'
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
will show the svn changeset @samp{r23456}. With older Git versions searching in
|
will show the svn changeset @var{r23456}. With older git versions searching in
|
||||||
the @command{git log} output is the easiest option (especially if a pager with
|
the @command{git log} output is the easiest option (especially if a pager with
|
||||||
search capabilities is used).
|
search capabilities is used).
|
||||||
|
|
||||||
This commit can be checked out with
|
This commit can be checked out with
|
||||||
|
|
||||||
@example
|
@example
|
||||||
git checkout -b svn_23456 :/'as revision 23456'
|
git checkout -b svn_23456 :/'as revision 23456'
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
or for Git < 1.7.1 with
|
or for git < 1.7.1 with
|
||||||
|
|
||||||
@example
|
@example
|
||||||
git checkout -b svn_23456 $SHA1
|
git checkout -b svn_23456 $SHA1
|
||||||
@@ -393,7 +374,7 @@ git checkout -b svn_23456 $SHA1
|
|||||||
where @var{$SHA1} is the commit hash from the @command{git log} output.
|
where @var{$SHA1} is the commit hash from the @command{git log} output.
|
||||||
|
|
||||||
|
|
||||||
@chapter Pre-push checklist
|
@chapter pre-push checklist
|
||||||
|
|
||||||
Once you have a set of commits that you feel are ready for pushing,
|
Once you have a set of commits that you feel are ready for pushing,
|
||||||
work through the following checklist to doublecheck everything is in
|
work through the following checklist to doublecheck everything is in
|
||||||
@@ -404,21 +385,21 @@ Apply your common sense, but if in doubt, err on the side of caution.
|
|||||||
First, make sure that the commits and branches you are going to push
|
First, make sure that the commits and branches you are going to push
|
||||||
match what you want pushed and that nothing is missing, extraneous or
|
match what you want pushed and that nothing is missing, extraneous or
|
||||||
wrong. You can see what will be pushed by running the git push command
|
wrong. You can see what will be pushed by running the git push command
|
||||||
with @option{--dry-run} first. And then inspecting the commits listed with
|
with --dry-run first. And then inspecting the commits listed with
|
||||||
@command{git log -p 1234567..987654}. The @command{git status} command
|
@command{git log -p 1234567..987654}. The @command{git status} command
|
||||||
may help in finding local changes that have been forgotten to be added.
|
may help in finding local changes that have been forgotten to be added.
|
||||||
|
|
||||||
Next let the code pass through a full run of our test suite.
|
Next let the code pass through a full run of our testsuite.
|
||||||
|
|
||||||
@itemize
|
@itemize
|
||||||
@item @command{make distclean}
|
@item @command{make distclean}
|
||||||
@item @command{/path/to/ffmpeg/configure}
|
@item @command{/path/to/ffmpeg/configure}
|
||||||
@item @command{make fate}
|
@item @command{make check}
|
||||||
@item if fate fails due to missing samples run @command{make fate-rsync} and retry
|
@item if fate fails due to missing samples run @command{make fate-rsync} and retry
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
Make sure all your changes have been checked before pushing them, the
|
Make sure all your changes have been checked before pushing them, the
|
||||||
test suite only checks against regressions and that only to some extend. It does
|
testsuite only checks against regressions and that only to some extend. It does
|
||||||
obviously not check newly added features/code to be working unless you have
|
obviously not check newly added features/code to be working unless you have
|
||||||
added a test for that (which is recommended).
|
added a test for that (which is recommended).
|
||||||
|
|
||||||
@@ -431,5 +412,5 @@ recommended.
|
|||||||
|
|
||||||
@chapter Server Issues
|
@chapter Server Issues
|
||||||
|
|
||||||
Contact the project admins at @email{root@@ffmpeg.org} if you have technical
|
Contact the project admins @email{root@@ffmpeg.org} if you have technical
|
||||||
problems with the Git server.
|
problems with the GIT server.
|
||||||
|
|||||||
386
doc/indevs.texi
386
doc/indevs.texi
@@ -1,7 +1,7 @@
|
|||||||
@chapter Input Devices
|
@chapter Input Devices
|
||||||
@c man begin 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.
|
the data coming from a multimedia device attached to your system.
|
||||||
|
|
||||||
When you configure your FFmpeg build, all the supported input devices
|
When you configure your FFmpeg build, all the supported input devices
|
||||||
@@ -51,18 +51,6 @@ ffmpeg -f alsa -i hw:0 alsaout.wav
|
|||||||
For more information see:
|
For more information see:
|
||||||
@url{http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html}
|
@url{http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html}
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
|
|
||||||
@item sample_rate
|
|
||||||
Set the sample rate in Hz. Default is 48000.
|
|
||||||
|
|
||||||
@item channels
|
|
||||||
Set the number of channels. Default is 2.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section avfoundation
|
@section avfoundation
|
||||||
|
|
||||||
AVFoundation input device.
|
AVFoundation input device.
|
||||||
@@ -121,24 +109,11 @@ Specify the audio device by its index. Overrides anything given in the input fil
|
|||||||
@item -pixel_format <FORMAT>
|
@item -pixel_format <FORMAT>
|
||||||
Request the video device to use a specific pixel 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
|
If the specified format is not supported, a list of available formats is given
|
||||||
and the first one in this list is used instead. Available pixel formats are:
|
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,
|
@code{monob, rgb555be, rgb555le, rgb565be, rgb565le, rgb24, bgr24, 0rgb, bgr0, 0bgr, rgb0,
|
||||||
bgr48be, uyvy422, yuva444p, yuva444p16le, yuv444p, yuv422p16, yuv422p10, yuv444p10,
|
bgr48be, uyvy422, yuva444p, yuva444p16le, yuv444p, yuv422p16, yuv422p10, yuv444p10,
|
||||||
yuv420p, nv12, yuyv422, gray}
|
yuv420p, nv12, yuyv422, gray}
|
||||||
|
|
||||||
@item -framerate
|
|
||||||
Set the grabbing frame rate. Default is @code{ntsc}, corresponding to a
|
|
||||||
frame rate of @code{30000/1001}.
|
|
||||||
|
|
||||||
@item -video_size
|
|
||||||
Set the video frame size.
|
|
||||||
|
|
||||||
@item -capture_cursor
|
|
||||||
Capture the mouse pointer. Default is 0.
|
|
||||||
|
|
||||||
@item -capture_mouse_clicks
|
|
||||||
Capture the screen mouse clicks. Default is 0.
|
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@subsection Examples
|
@subsection Examples
|
||||||
@@ -175,120 +150,6 @@ $ ffmpeg -f avfoundation -pixel_format bgr0 -i "default:none" out.avi
|
|||||||
|
|
||||||
BSD video input device.
|
BSD video input device.
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
|
|
||||||
@item framerate
|
|
||||||
Set the frame rate.
|
|
||||||
|
|
||||||
@item video_size
|
|
||||||
Set the video frame size. Default is @code{vga}.
|
|
||||||
|
|
||||||
@item standard
|
|
||||||
|
|
||||||
Available values are:
|
|
||||||
@table @samp
|
|
||||||
@item pal
|
|
||||||
|
|
||||||
@item ntsc
|
|
||||||
|
|
||||||
@item secam
|
|
||||||
|
|
||||||
@item paln
|
|
||||||
|
|
||||||
@item palm
|
|
||||||
|
|
||||||
@item ntscj
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@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
|
|
||||||
uyvy422 or v210, 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 can be 2, 8 or 16. Note that all audio channels are bundled in one single
|
|
||||||
audio track.
|
|
||||||
|
|
||||||
@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}.
|
|
||||||
|
|
||||||
@item bm_v210
|
|
||||||
If set to @samp{1}, video is captured in 10 bit v210 instead
|
|
||||||
of uyvy422. Not all Blackmagic devices support this option.
|
|
||||||
|
|
||||||
@item teletext_lines
|
|
||||||
If set to nonzero, an additional teletext stream will be captured from the
|
|
||||||
vertical ancillary data. This option is a bitmask of the VBI lines checked,
|
|
||||||
specifically lines 6 to 22, and lines 318 to 335. Line 6 is the LSB in the mask.
|
|
||||||
Selected lines which do not contain teletext information will be ignored. You
|
|
||||||
can use the special @option{all} constant to select all possible lines, or
|
|
||||||
@option{standard} to skip lines 6, 318 and 319, which are not compatible with all
|
|
||||||
receivers. Capturing teletext only works for SD PAL sources in 8 bit mode.
|
|
||||||
To use this option, ffmpeg needs to be compiled with @code{--enable-libzvbi}.
|
|
||||||
|
|
||||||
@item channels
|
|
||||||
Defines number of audio channels to capture. Must be @samp{2}, @samp{8} or @samp{16}.
|
|
||||||
Defaults to @samp{2}.
|
|
||||||
|
|
||||||
@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
|
|
||||||
|
|
||||||
@item
|
|
||||||
Capture video clip at 1080i50 10 bit:
|
|
||||||
@example
|
|
||||||
ffmpeg -bm_v210 1 -f decklink -i 'UltraStudio Mini Recorder@@11' -acodec copy -vcodec copy output.avi
|
|
||||||
@end example
|
|
||||||
|
|
||||||
@item
|
|
||||||
Capture video clip at 1080i50 with 16 audio channels:
|
|
||||||
@example
|
|
||||||
ffmpeg -channels 16 -f decklink -i 'UltraStudio Mini Recorder@@11' -acodec copy -vcodec copy output.avi
|
|
||||||
@end example
|
|
||||||
|
|
||||||
@end itemize
|
|
||||||
|
|
||||||
@section dshow
|
@section dshow
|
||||||
|
|
||||||
Windows DirectShow input device.
|
Windows DirectShow input device.
|
||||||
@@ -339,11 +200,11 @@ If set to @option{true}, print a list of selected device's options
|
|||||||
and exit.
|
and exit.
|
||||||
|
|
||||||
@item video_device_number
|
@item video_device_number
|
||||||
Set video device number for devices with the same name (starts at 0,
|
Set video device number for devices with same name (starts at 0,
|
||||||
defaults to 0).
|
defaults to 0).
|
||||||
|
|
||||||
@item audio_device_number
|
@item audio_device_number
|
||||||
Set audio device number for devices with the same name (starts at 0,
|
Set audio device number for devices with same name (starts at 0,
|
||||||
defaults to 0).
|
defaults to 0).
|
||||||
|
|
||||||
@item pixel_format
|
@item pixel_format
|
||||||
@@ -414,30 +275,6 @@ If set to @option{true}, before capture starts, popup a display
|
|||||||
dialog to the end user, allowing them to manually
|
dialog to the end user, allowing them to manually
|
||||||
modify TV audio (like mono vs. stereo, Language A,B or C).
|
modify TV audio (like mono vs. stereo, Language A,B or C).
|
||||||
|
|
||||||
@item audio_device_load
|
|
||||||
Load an audio capture filter device from file instead of searching
|
|
||||||
it by name. It may load additional parameters too, if the filter
|
|
||||||
supports the serialization of its properties to.
|
|
||||||
To use this an audio capture source has to be specified, but it can
|
|
||||||
be anything even fake one.
|
|
||||||
|
|
||||||
@item audio_device_save
|
|
||||||
Save the currently used audio capture filter device and its
|
|
||||||
parameters (if the filter supports it) to a file.
|
|
||||||
If a file with the same name exists it will be overwritten.
|
|
||||||
|
|
||||||
@item video_device_load
|
|
||||||
Load a video capture filter device from file instead of searching
|
|
||||||
it by name. It may load additional parameters too, if the filter
|
|
||||||
supports the serialization of its properties to.
|
|
||||||
To use this a video capture source has to be specified, but it can
|
|
||||||
be anything even fake one.
|
|
||||||
|
|
||||||
@item video_device_save
|
|
||||||
Save the currently used video capture filter device and its
|
|
||||||
parameters (if the filter supports it) to a file.
|
|
||||||
If a file with the same name exists it will be overwritten.
|
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@subsection Examples
|
@subsection Examples
|
||||||
@@ -493,27 +330,6 @@ $ ffmpeg -f dshow -show_video_device_dialog true -crossbar_video_input_pin_numbe
|
|||||||
|
|
||||||
Linux DV 1394 input device.
|
Linux DV 1394 input device.
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
|
|
||||||
@item framerate
|
|
||||||
Set the frame rate. Default is 25.
|
|
||||||
|
|
||||||
@item standard
|
|
||||||
|
|
||||||
Available values are:
|
|
||||||
@table @samp
|
|
||||||
@item pal
|
|
||||||
|
|
||||||
@item ntsc
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
Default value is @code{ntsc}.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section fbdev
|
@section fbdev
|
||||||
|
|
||||||
Linux framebuffer input device.
|
Linux framebuffer input device.
|
||||||
@@ -526,27 +342,18 @@ console. It is accessed through a file device node, usually
|
|||||||
For more detailed information read the file
|
For more detailed information read the file
|
||||||
Documentation/fb/framebuffer.txt included in the Linux source tree.
|
Documentation/fb/framebuffer.txt included in the Linux source tree.
|
||||||
|
|
||||||
See also @url{http://linux-fbdev.sourceforge.net/}, and fbset(1).
|
|
||||||
|
|
||||||
To record from the framebuffer device @file{/dev/fb0} with
|
To record from the framebuffer device @file{/dev/fb0} with
|
||||||
@command{ffmpeg}:
|
@command{ffmpeg}:
|
||||||
@example
|
@example
|
||||||
ffmpeg -f fbdev -framerate 10 -i /dev/fb0 out.avi
|
ffmpeg -f fbdev -r 10 -i /dev/fb0 out.avi
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
You can take a single screenshot image with the command:
|
You can take a single screenshot image with the command:
|
||||||
@example
|
@example
|
||||||
ffmpeg -f fbdev -framerate 1 -i /dev/fb0 -frames:v 1 screenshot.jpeg
|
ffmpeg -f fbdev -frames:v 1 -r 1 -i /dev/fb0 screenshot.jpeg
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@subsection Options
|
See also @url{http://linux-fbdev.sourceforge.net/}, and fbset(1).
|
||||||
|
|
||||||
@table @option
|
|
||||||
|
|
||||||
@item framerate
|
|
||||||
Set the frame rate. Default is 25.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section gdigrab
|
@section gdigrab
|
||||||
|
|
||||||
@@ -732,15 +539,6 @@ $ jack_connect metro:120_bpm ffmpeg:input_1
|
|||||||
For more information read:
|
For more information read:
|
||||||
@url{http://jackaudio.org/}
|
@url{http://jackaudio.org/}
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
|
|
||||||
@item channels
|
|
||||||
Set the number of channels. Default is 2.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section lavfi
|
@section lavfi
|
||||||
|
|
||||||
Libavfilter input virtual device.
|
Libavfilter input virtual device.
|
||||||
@@ -781,9 +579,6 @@ Set the filename of the filtergraph to be read and sent to the other
|
|||||||
filters. Syntax of the filtergraph is the same as the one specified by
|
filters. Syntax of the filtergraph is the same as the one specified by
|
||||||
the option @var{graph}.
|
the option @var{graph}.
|
||||||
|
|
||||||
@item dumpgraph
|
|
||||||
Dump graph to stderr.
|
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@subsection Examples
|
@subsection Examples
|
||||||
@@ -985,19 +780,6 @@ ffmpeg -f oss -i /dev/dsp /tmp/oss.wav
|
|||||||
For more information about OSS see:
|
For more information about OSS see:
|
||||||
@url{http://manuals.opensound.com/usersguide/dsp.html}
|
@url{http://manuals.opensound.com/usersguide/dsp.html}
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
|
|
||||||
@item sample_rate
|
|
||||||
Set the sample rate in Hz. Default is 48000.
|
|
||||||
|
|
||||||
@item channels
|
|
||||||
Set the number of channels. Default is 2.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
|
|
||||||
@section pulse
|
@section pulse
|
||||||
|
|
||||||
PulseAudio input device.
|
PulseAudio input device.
|
||||||
@@ -1038,10 +820,6 @@ Specify the number of bytes per frame, by default it is set to 1024.
|
|||||||
@item fragment_size
|
@item fragment_size
|
||||||
Specify the minimal buffering fragment in PulseAudio, it will affect the
|
Specify the minimal buffering fragment in PulseAudio, it will affect the
|
||||||
audio latency. By default it is unset.
|
audio latency. By default it is unset.
|
||||||
|
|
||||||
@item wallclock
|
|
||||||
Set the initial PTS using the current time. Default is 1.
|
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@subsection Examples
|
@subsection Examples
|
||||||
@@ -1077,22 +855,6 @@ ffmpeg -f qtkit -i "default" out.mpg
|
|||||||
ffmpeg -f qtkit -list_devices true -i ""
|
ffmpeg -f qtkit -list_devices true -i ""
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
|
|
||||||
@item frame_rate
|
|
||||||
Set frame rate. Default is 30.
|
|
||||||
|
|
||||||
@item list_devices
|
|
||||||
If set to @code{true}, print a list of devices and exit. Default is
|
|
||||||
@code{false}.
|
|
||||||
|
|
||||||
@item video_device_index
|
|
||||||
Select the video device by index for devices with the same name (starts at 0).
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section sndio
|
@section sndio
|
||||||
|
|
||||||
sndio input device.
|
sndio input device.
|
||||||
@@ -1110,18 +872,6 @@ command:
|
|||||||
ffmpeg -f sndio -i /dev/audio0 /tmp/oss.wav
|
ffmpeg -f sndio -i /dev/audio0 /tmp/oss.wav
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
|
|
||||||
@item sample_rate
|
|
||||||
Set the sample rate in Hz. Default is 48000.
|
|
||||||
|
|
||||||
@item channels
|
|
||||||
Set the number of channels. Default is 2.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section video4linux2, v4l2
|
@section video4linux2, v4l2
|
||||||
|
|
||||||
Video4Linux2 input video device.
|
Video4Linux2 input video device.
|
||||||
@@ -1154,12 +904,6 @@ conversion into the real time clock.
|
|||||||
Some usage examples of the video4linux2 device with @command{ffmpeg}
|
Some usage examples of the video4linux2 device with @command{ffmpeg}
|
||||||
and @command{ffplay}:
|
and @command{ffplay}:
|
||||||
@itemize
|
@itemize
|
||||||
@item
|
|
||||||
List supported formats for a video4linux2 device:
|
|
||||||
@example
|
|
||||||
ffplay -f video4linux2 -list_formats all /dev/video0
|
|
||||||
@end example
|
|
||||||
|
|
||||||
@item
|
@item
|
||||||
Grab and show the input of a video4linux2 device:
|
Grab and show the input of a video4linux2 device:
|
||||||
@example
|
@example
|
||||||
@@ -1244,10 +988,6 @@ Force conversion from monotonic to absolute timestamps.
|
|||||||
@end table
|
@end table
|
||||||
|
|
||||||
Default value is @code{default}.
|
Default value is @code{default}.
|
||||||
|
|
||||||
@item use_libv4l2
|
|
||||||
Use libv4l2 (v4l-utils) conversion functions. Default is 0.
|
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@section vfwcap
|
@section vfwcap
|
||||||
@@ -1258,19 +998,6 @@ The filename passed as input is the capture driver number, ranging from
|
|||||||
0 to 9. You may use "list" as filename to print a list of drivers. Any
|
0 to 9. You may use "list" as filename to print a list of drivers. Any
|
||||||
other filename will be interpreted as device number 0.
|
other filename will be interpreted as device number 0.
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
|
|
||||||
@item video_size
|
|
||||||
Set the video frame size.
|
|
||||||
|
|
||||||
@item framerate
|
|
||||||
Set the grabbing frame rate. Default value is @code{ntsc},
|
|
||||||
corresponding to a frame rate of @code{30000/1001}.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section x11grab
|
@section x11grab
|
||||||
|
|
||||||
X11 video input device.
|
X11 video input device.
|
||||||
@@ -1373,13 +1100,98 @@ Set the video frame size. Default value is @code{vga}.
|
|||||||
Use the MIT-SHM extension for shared memory. Default value is @code{1}.
|
Use the MIT-SHM extension for shared memory. Default value is @code{1}.
|
||||||
It may be necessary to disable it for remote displays (legacy x11grab
|
It may be necessary to disable it for remote displays (legacy x11grab
|
||||||
only).
|
only).
|
||||||
|
|
||||||
@item grab_x
|
|
||||||
@item grab_y
|
|
||||||
Set the grabbing region coordinates. They are expressed as offset from
|
|
||||||
the top left corner of the X11 window and correspond to the
|
|
||||||
@var{x_offset} and @var{y_offset} parameters in the device name. The
|
|
||||||
default value for both options is 0.
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
@subsection @var{grab_x} @var{grab_y} AVOption
|
||||||
|
|
||||||
|
The syntax is:
|
||||||
|
@example
|
||||||
|
-grab_x @var{x_offset} -grab_y @var{y_offset}
|
||||||
|
@end example
|
||||||
|
|
||||||
|
Set the grabbing region coordinates. They are expressed as offset from the top left
|
||||||
|
corner of the X11 window. The default value is 0.
|
||||||
|
|
||||||
|
@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
|
||||||
|
uyvy422 or v210, 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 can be 2, 8 or 16.
|
||||||
|
|
||||||
|
@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}.
|
||||||
|
|
||||||
|
@item bm_v210
|
||||||
|
If set to @samp{1}, video is captured in 10 bit v210 instead
|
||||||
|
of uyvy422. Not all Blackmagic devices support this option.
|
||||||
|
|
||||||
|
@item bm_channels <CHANNELS>
|
||||||
|
Number of audio channels, can be 2, 8 or 16
|
||||||
|
|
||||||
|
@item bm_audiodepth <BITDEPTH>
|
||||||
|
Audio bit depth, can be 16 or 32.
|
||||||
|
|
||||||
|
@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
|
||||||
|
|
||||||
|
@item
|
||||||
|
Capture video clip at 1080i50 10 bit:
|
||||||
|
@example
|
||||||
|
ffmpeg -bm_v210 1 -f decklink -i 'UltraStudio Mini Recorder@@11' -acodec copy -vcodec copy output.avi
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@item
|
||||||
|
Capture video clip at 720p50 with 32bit audio:
|
||||||
|
@example
|
||||||
|
ffmpeg -bm_audiodepth 32 -f decklink -i 'UltraStudio Mini Recorder@@14' -acodec copy -vcodec copy output.avi
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@item
|
||||||
|
Capture video clip at 576i50 with 8 audio channels:
|
||||||
|
@example
|
||||||
|
ffmpeg -bm_channels 8 -f decklink -i 'UltraStudio Mini Recorder@@3' -acodec copy -vcodec copy output.avi
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
|
||||||
@c man end INPUT DEVICES
|
@c man end INPUT DEVICES
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
FFmpeg's bug/feature request tracker manual
|
FFmpeg's bug/feature request tracker manual
|
||||||
=================================================
|
=================================================
|
||||||
|
|
||||||
|
NOTE: This is a draft.
|
||||||
|
|
||||||
Overview:
|
Overview:
|
||||||
---------
|
---------
|
||||||
|
|
||||||
@@ -20,9 +22,9 @@ a mail for every change to every issue.
|
|||||||
(the above does all work already after light testing)
|
(the above does all work already after light testing)
|
||||||
|
|
||||||
The subscription URL for the ffmpeg-trac list is:
|
The subscription URL for the ffmpeg-trac list is:
|
||||||
https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-trac
|
http(s)://lists.ffmpeg.org/mailman/listinfo/ffmpeg-trac
|
||||||
The URL of the webinterface of the tracker is:
|
The URL of the webinterface of the tracker is:
|
||||||
https://trac.ffmpeg.org
|
http(s)://trac.ffmpeg.org
|
||||||
|
|
||||||
Type:
|
Type:
|
||||||
-----
|
-----
|
||||||
@@ -40,16 +42,12 @@ feature request / enhancement
|
|||||||
where the current implementation cannot be considered wrong.
|
where the current implementation cannot be considered wrong.
|
||||||
|
|
||||||
license violation
|
license violation
|
||||||
Ticket to keep track of (L)GPL violations of ffmpeg by others.
|
ticket to keep track of (L)GPL violations of ffmpeg by others
|
||||||
|
|
||||||
sponsoring request
|
sponsoring request
|
||||||
Developer requests for hardware, software, specifications, money,
|
Developer requests for hardware, software, specifications, money,
|
||||||
refunds, etc.
|
refunds, etc.
|
||||||
|
|
||||||
task
|
|
||||||
A task/reminder such as setting up a FATE client, adding filters to
|
|
||||||
Trac, etc.
|
|
||||||
|
|
||||||
Priority:
|
Priority:
|
||||||
---------
|
---------
|
||||||
critical
|
critical
|
||||||
@@ -68,8 +66,7 @@ important
|
|||||||
don't exist in a past revision or another branch.
|
don't exist in a past revision or another branch.
|
||||||
|
|
||||||
normal
|
normal
|
||||||
Default setting. Use this if the bug does not match the other
|
|
||||||
priorities or if you are unsure of what priority to choose.
|
|
||||||
|
|
||||||
minor
|
minor
|
||||||
Bugs about things like spelling errors, "mp2" instead of
|
Bugs about things like spelling errors, "mp2" instead of
|
||||||
@@ -166,23 +163,14 @@ Component:
|
|||||||
avcodec
|
avcodec
|
||||||
issues in libavcodec/*
|
issues in libavcodec/*
|
||||||
|
|
||||||
avdevice
|
|
||||||
issues in libavdevice/*
|
|
||||||
|
|
||||||
avfilter
|
|
||||||
issues in libavfilter/*
|
|
||||||
|
|
||||||
avformat
|
avformat
|
||||||
issues in libavformat/*
|
issues in libavformat/*
|
||||||
|
|
||||||
avutil
|
avutil
|
||||||
issues in libavutil/*
|
issues in libavutil/*
|
||||||
|
|
||||||
build system
|
regression test
|
||||||
issues in or related to configure/Makefile
|
issues in tests/*
|
||||||
|
|
||||||
documentation
|
|
||||||
issues in or related to doc/*
|
|
||||||
|
|
||||||
ffmpeg
|
ffmpeg
|
||||||
issues in or related to ffmpeg.c
|
issues in or related to ffmpeg.c
|
||||||
@@ -196,23 +184,11 @@ ffprobe
|
|||||||
ffserver
|
ffserver
|
||||||
issues in or related to ffserver.c
|
issues in or related to ffserver.c
|
||||||
|
|
||||||
postproc
|
build system
|
||||||
issues in libpostproc/*
|
issues in or related to configure/Makefile
|
||||||
|
|
||||||
swresample
|
regression
|
||||||
issues in libswresample/*
|
bugs which were not present in a past revision
|
||||||
|
|
||||||
swscale
|
|
||||||
issues in libswscale/*
|
|
||||||
|
|
||||||
trac
|
trac
|
||||||
issues related to our issue tracker
|
issues related to our issue tracker
|
||||||
|
|
||||||
undetermined
|
|
||||||
default component; choose this if unsure
|
|
||||||
|
|
||||||
website
|
|
||||||
issues related to the website
|
|
||||||
|
|
||||||
wiki
|
|
||||||
issues related to the wiki
|
|
||||||
|
|||||||
@@ -12,10 +12,10 @@ A file consists of a header and a number of metadata tags divided into sections,
|
|||||||
each on its own line.
|
each on its own line.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
The header is a @samp{;FFMETADATA} string, followed by a version number (now 1).
|
The header is a ';FFMETADATA' string, followed by a version number (now 1).
|
||||||
|
|
||||||
@item
|
@item
|
||||||
Metadata tags are of the form @samp{key=value}
|
Metadata tags are of the form 'key=value'
|
||||||
|
|
||||||
@item
|
@item
|
||||||
Immediately after header follows global metadata
|
Immediately after header follows global metadata
|
||||||
@@ -26,30 +26,26 @@ metadata.
|
|||||||
|
|
||||||
@item
|
@item
|
||||||
A section starts with the section name in uppercase (i.e. STREAM or CHAPTER) in
|
A section starts with the section name in uppercase (i.e. STREAM or CHAPTER) in
|
||||||
brackets (@samp{[}, @samp{]}) and ends with next section or end of file.
|
brackets ('[', ']') and ends with next section or end of file.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
At the beginning of a chapter section there may be an optional timebase to be
|
At the beginning of a chapter section there may be an optional timebase to be
|
||||||
used for start/end values. It must be in form
|
used for start/end values. It must be in form 'TIMEBASE=num/den', where num and
|
||||||
@samp{TIMEBASE=@var{num}/@var{den}}, where @var{num} and @var{den} are
|
den are integers. If the timebase is missing then start/end times are assumed to
|
||||||
integers. If the timebase is missing then start/end times are assumed to
|
|
||||||
be in milliseconds.
|
be in milliseconds.
|
||||||
|
|
||||||
Next a chapter section must contain chapter start and end times in form
|
Next a chapter section must contain chapter start and end times in form
|
||||||
@samp{START=@var{num}}, @samp{END=@var{num}}, where @var{num} is a positive
|
'START=num', 'END=num', where num is a positive integer.
|
||||||
integer.
|
|
||||||
|
|
||||||
@item
|
@item
|
||||||
Empty lines and lines starting with @samp{;} or @samp{#} are ignored.
|
Empty lines and lines starting with ';' or '#' are ignored.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
Metadata keys or values containing special characters (@samp{=}, @samp{;},
|
Metadata keys or values containing special characters ('=', ';', '#', '\' and a
|
||||||
@samp{#}, @samp{\} and a newline) must be escaped with a backslash @samp{\}.
|
newline) must be escaped with a backslash '\'.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
Note that whitespace in metadata (e.g. @samp{foo = bar}) is considered to be
|
Note that whitespace in metadata (e.g. foo = bar) is considered to be a part of
|
||||||
a part of the tag (in the example above key is @samp{foo }, value is
|
the tag (in the example above key is 'foo ', value is ' bar').
|
||||||
@samp{ bar}).
|
|
||||||
@end enumerate
|
@end enumerate
|
||||||
|
|
||||||
A ffmetadata file might look like this:
|
A ffmetadata file might look like this:
|
||||||
|
|||||||
@@ -47,16 +47,12 @@ Files that have MIPS copyright notice in them:
|
|||||||
* libavutil/mips/
|
* libavutil/mips/
|
||||||
float_dsp_mips.c
|
float_dsp_mips.c
|
||||||
libm_mips.h
|
libm_mips.h
|
||||||
softfloat_tables.h
|
|
||||||
* libavcodec/
|
* libavcodec/
|
||||||
fft_fixed_32.c
|
fft_fixed_32.c
|
||||||
fft_init_table.c
|
fft_init_table.c
|
||||||
fft_table.h
|
fft_table.h
|
||||||
mdct_fixed_32.c
|
mdct_fixed_32.c
|
||||||
* libavcodec/mips/
|
* libavcodec/mips/
|
||||||
aacdec_fixed.c
|
|
||||||
aacsbr_fixed.c
|
|
||||||
aacsbr_template.c
|
|
||||||
aaccoder_mips.c
|
aaccoder_mips.c
|
||||||
aacpsy_mips.h
|
aacpsy_mips.h
|
||||||
ac3dsp_mips.c
|
ac3dsp_mips.c
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ thread.
|
|||||||
If the codec allocates writable tables in its init(), add an init_thread_copy()
|
If the codec allocates writable tables in its init(), add an init_thread_copy()
|
||||||
which re-allocates them for other threads.
|
which re-allocates them for other threads.
|
||||||
|
|
||||||
Add AV_CODEC_CAP_FRAME_THREADS to the codec capabilities. There will be very little
|
Add CODEC_CAP_FRAME_THREADS to the codec capabilities. There will be very little
|
||||||
speed gain at this point but it should work.
|
speed gain at this point but it should work.
|
||||||
|
|
||||||
If there are inter-frame dependencies, so the codec calls
|
If there are inter-frame dependencies, so the codec calls
|
||||||
|
|||||||
482
doc/muxers.texi
482
doc/muxers.texi
@@ -37,61 +37,6 @@ ID3v2.3 and ID3v2.4) are supported. The default is version 4.
|
|||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@anchor{asf}
|
|
||||||
@section asf
|
|
||||||
|
|
||||||
Advanced Systems Format muxer.
|
|
||||||
|
|
||||||
Note that Windows Media Audio (wma) and Windows Media Video (wmv) use this
|
|
||||||
muxer too.
|
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
It accepts the following options:
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item packet_size
|
|
||||||
Set the muxer packet size. By tuning this setting you may reduce data
|
|
||||||
fragmentation or muxer overhead depending on your source. Default value is
|
|
||||||
3200, minimum is 100, maximum is 64k.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@anchor{chromaprint}
|
|
||||||
@section chromaprint
|
|
||||||
|
|
||||||
Chromaprint fingerprinter
|
|
||||||
|
|
||||||
This muxer feeds audio data to the Chromaprint library, which generates
|
|
||||||
a fingerprint for the provided audio data. It takes a single signed
|
|
||||||
native-endian 16-bit raw audio stream.
|
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item silence_threshold
|
|
||||||
Threshold for detecting silence, ranges from 0 to 32767. -1 for default
|
|
||||||
(required for use with the AcoustID service).
|
|
||||||
|
|
||||||
@item algorithm
|
|
||||||
Algorithm index to fingerprint with.
|
|
||||||
|
|
||||||
@item fp_format
|
|
||||||
Format to output the fingerprint as. Accepts the following options:
|
|
||||||
@table @samp
|
|
||||||
@item raw
|
|
||||||
Binary raw fingerprint
|
|
||||||
|
|
||||||
@item compressed
|
|
||||||
Binary compressed fingerprint
|
|
||||||
|
|
||||||
@item base64
|
|
||||||
Base64 compressed fingerprint
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@anchor{crc}
|
@anchor{crc}
|
||||||
@section crc
|
@section crc
|
||||||
|
|
||||||
@@ -174,70 +119,30 @@ ffmpeg -i INPUT -c:a pcm_u8 -c:v mpeg2video -f framecrc -
|
|||||||
|
|
||||||
See also the @ref{crc} muxer.
|
See also the @ref{crc} muxer.
|
||||||
|
|
||||||
@anchor{framehash}
|
|
||||||
@section framehash
|
|
||||||
|
|
||||||
Per-packet hash testing format.
|
|
||||||
|
|
||||||
This muxer computes and prints a cryptographic hash for each audio
|
|
||||||
and video packet. This can be used for packet-by-packet equality
|
|
||||||
checks without having to individually do a binary comparison on each.
|
|
||||||
|
|
||||||
By default audio frames are converted to signed 16-bit raw audio and
|
|
||||||
video frames to raw video before computing the hash, but the output
|
|
||||||
of explicit conversions to other codecs can also be used. It uses the
|
|
||||||
SHA-256 cryptographic hash function by default, but supports several
|
|
||||||
other algorithms.
|
|
||||||
|
|
||||||
The output of the muxer consists of a line for each audio and video
|
|
||||||
packet of the form:
|
|
||||||
@example
|
|
||||||
@var{stream_index}, @var{packet_dts}, @var{packet_pts}, @var{packet_duration}, @var{packet_size}, @var{hash}
|
|
||||||
@end example
|
|
||||||
|
|
||||||
@var{hash} is a hexadecimal number representing the computed hash
|
|
||||||
for the packet.
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item hash @var{algorithm}
|
|
||||||
Use the cryptographic hash function specified by the string @var{algorithm}.
|
|
||||||
Supported values include @code{MD5}, @code{murmur3}, @code{RIPEMD128},
|
|
||||||
@code{RIPEMD160}, @code{RIPEMD256}, @code{RIPEMD320}, @code{SHA160},
|
|
||||||
@code{SHA224}, @code{SHA256} (default), @code{SHA512/224}, @code{SHA512/256},
|
|
||||||
@code{SHA384}, @code{SHA512}, @code{CRC32} and @code{adler32}.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@subsection Examples
|
|
||||||
|
|
||||||
To compute the SHA-256 hash of the audio and video frames in @file{INPUT},
|
|
||||||
converted to raw audio and video packets, and store it in the file
|
|
||||||
@file{out.sha256}:
|
|
||||||
@example
|
|
||||||
ffmpeg -i INPUT -f framehash out.sha256
|
|
||||||
@end example
|
|
||||||
|
|
||||||
To print the information to stdout, using the MD5 hash function, use
|
|
||||||
the command:
|
|
||||||
@example
|
|
||||||
ffmpeg -i INPUT -f framehash -hash md5 -
|
|
||||||
@end example
|
|
||||||
|
|
||||||
See also the @ref{hash} muxer.
|
|
||||||
|
|
||||||
@anchor{framemd5}
|
@anchor{framemd5}
|
||||||
@section framemd5
|
@section framemd5
|
||||||
|
|
||||||
Per-packet MD5 testing format.
|
Per-packet MD5 testing format.
|
||||||
|
|
||||||
This is a variant of the @ref{framehash} muxer. Unlike that muxer,
|
This muxer computes and prints the MD5 hash for each audio
|
||||||
it defaults to using the MD5 hash function.
|
and video packet. By default audio frames are converted to signed
|
||||||
|
16-bit raw audio and video frames to raw video before computing the
|
||||||
|
hash.
|
||||||
|
|
||||||
|
The output of the muxer consists of a line for each audio and video
|
||||||
|
packet of the form:
|
||||||
|
@example
|
||||||
|
@var{stream_index}, @var{packet_dts}, @var{packet_pts}, @var{packet_duration}, @var{packet_size}, @var{MD5}
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@var{MD5} is a hexadecimal number representing the computed MD5 hash
|
||||||
|
for the packet.
|
||||||
|
|
||||||
@subsection Examples
|
@subsection Examples
|
||||||
|
|
||||||
To compute the MD5 hash of the audio and video frames in @file{INPUT},
|
For example to compute the MD5 of the audio and video frames in
|
||||||
converted to raw audio and video packets, and store it in the file
|
@file{INPUT}, converted to raw audio and video packets, and store it
|
||||||
@file{out.md5}:
|
in the file @file{out.md5}:
|
||||||
@example
|
@example
|
||||||
ffmpeg -i INPUT -f framemd5 out.md5
|
ffmpeg -i INPUT -f framemd5 out.md5
|
||||||
@end example
|
@end example
|
||||||
@@ -247,7 +152,7 @@ To print the information to stdout, use the command:
|
|||||||
ffmpeg -i INPUT -f framemd5 -
|
ffmpeg -i INPUT -f framemd5 -
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
See also the @ref{framehash} and @ref{md5} muxers.
|
See also the @ref{md5} muxer.
|
||||||
|
|
||||||
@anchor{gif}
|
@anchor{gif}
|
||||||
@section gif
|
@section gif
|
||||||
@@ -283,51 +188,6 @@ ffmpeg -i INPUT -c:v gif -f image2 "out%d.gif"
|
|||||||
Note 2: the GIF format has a very small time base: the delay between two frames
|
Note 2: the GIF format has a very small time base: the delay between two frames
|
||||||
can not be smaller than one centi second.
|
can not be smaller than one centi second.
|
||||||
|
|
||||||
@anchor{hash}
|
|
||||||
@section hash
|
|
||||||
|
|
||||||
Hash testing format.
|
|
||||||
|
|
||||||
This muxer computes and prints a cryptographic hash of all the input
|
|
||||||
audio and video frames. This can be used for equality checks without
|
|
||||||
having to do a complete binary comparison.
|
|
||||||
|
|
||||||
By default audio frames are converted to signed 16-bit raw audio and
|
|
||||||
video frames to raw video before computing the hash, but the output
|
|
||||||
of explicit conversions to other codecs can also be used. Timestamps
|
|
||||||
are ignored. It uses the SHA-256 cryptographic hash function by default,
|
|
||||||
but supports several other algorithms.
|
|
||||||
|
|
||||||
The output of the muxer consists of a single line of the form:
|
|
||||||
@var{algo}=@var{hash}, where @var{algo} is a short string representing
|
|
||||||
the hash function used, and @var{hash} is a hexadecimal number
|
|
||||||
representing the computed hash.
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item hash @var{algorithm}
|
|
||||||
Use the cryptographic hash function specified by the string @var{algorithm}.
|
|
||||||
Supported values include @code{MD5}, @code{murmur3}, @code{RIPEMD128},
|
|
||||||
@code{RIPEMD160}, @code{RIPEMD256}, @code{RIPEMD320}, @code{SHA160},
|
|
||||||
@code{SHA224}, @code{SHA256} (default), @code{SHA512/224}, @code{SHA512/256},
|
|
||||||
@code{SHA384}, @code{SHA512}, @code{CRC32} and @code{adler32}.
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@subsection Examples
|
|
||||||
|
|
||||||
To compute the SHA-256 hash of the input converted to raw audio and
|
|
||||||
video, and store it in the file @file{out.sha256}:
|
|
||||||
@example
|
|
||||||
ffmpeg -i INPUT -f hash out.sha256
|
|
||||||
@end example
|
|
||||||
|
|
||||||
To print an MD5 hash to stdout use the command:
|
|
||||||
@example
|
|
||||||
ffmpeg -i INPUT -f hash -hash md5 -
|
|
||||||
@end example
|
|
||||||
|
|
||||||
See also the @ref{framehash} muxer.
|
|
||||||
|
|
||||||
@anchor{hls}
|
@anchor{hls}
|
||||||
@section hls
|
@section hls
|
||||||
|
|
||||||
@@ -358,8 +218,7 @@ This muxer supports the following options:
|
|||||||
|
|
||||||
@table @option
|
@table @option
|
||||||
@item hls_time @var{seconds}
|
@item hls_time @var{seconds}
|
||||||
Set the target segment length in seconds. Default value is 2.
|
Set the segment length in seconds. Default value is 2.
|
||||||
Segment will be cut on the next key frame after this time has passed.
|
|
||||||
|
|
||||||
@item hls_list_size @var{size}
|
@item hls_list_size @var{size}
|
||||||
Set the maximum number of playlist entries. If set to 0 the list file
|
Set the maximum number of playlist entries. If set to 0 the list file
|
||||||
@@ -404,82 +263,6 @@ ffmpeg in.nut -hls_segment_filename 'file%03d.ts' out.m3u8
|
|||||||
This example will produce the playlist, @file{out.m3u8}, and segment files:
|
This example will produce the playlist, @file{out.m3u8}, and segment files:
|
||||||
@file{file000.ts}, @file{file001.ts}, @file{file002.ts}, etc.
|
@file{file000.ts}, @file{file001.ts}, @file{file002.ts}, etc.
|
||||||
|
|
||||||
@item use_localtime
|
|
||||||
Use strftime on @var{filename} to expand the segment filename with localtime.
|
|
||||||
The segment number (%d) is not available in this mode.
|
|
||||||
@example
|
|
||||||
ffmpeg in.nut -use_localtime 1 -hls_segment_filename 'file-%Y%m%d-%s.ts' out.m3u8
|
|
||||||
@end example
|
|
||||||
This example will produce the playlist, @file{out.m3u8}, and segment files:
|
|
||||||
@file{file-20160215-1455569023.ts}, @file{file-20160215-1455569024.ts}, etc.
|
|
||||||
|
|
||||||
@item use_localtime_mkdir
|
|
||||||
Used together with -use_localtime, it will create up to one subdirectory which
|
|
||||||
is expanded in @var{filename}.
|
|
||||||
@example
|
|
||||||
ffmpeg in.nut -use_localtime 1 -use_localtime_mkdir 1 -hls_segment_filename '%Y%m%d/file-%Y%m%d-%s.ts' out.m3u8
|
|
||||||
@end example
|
|
||||||
This example will create a directory 201560215 (if it does not exist), and then
|
|
||||||
produce the playlist, @file{out.m3u8}, and segment files:
|
|
||||||
@file{201560215/file-20160215-1455569023.ts}, @file{201560215/file-20160215-1455569024.ts}, etc.
|
|
||||||
|
|
||||||
|
|
||||||
@item hls_key_info_file @var{key_info_file}
|
|
||||||
Use the information in @var{key_info_file} for segment encryption. The first
|
|
||||||
line of @var{key_info_file} specifies the key URI written to the playlist. The
|
|
||||||
key URL is used to access the encryption key during playback. The second line
|
|
||||||
specifies the path to the key file used to obtain the key during the encryption
|
|
||||||
process. The key file is read as a single packed array of 16 octets in binary
|
|
||||||
format. The optional third line specifies the initialization vector (IV) as a
|
|
||||||
hexadecimal string to be used instead of the segment sequence number (default)
|
|
||||||
for encryption. Changes to @var{key_info_file} will result in segment
|
|
||||||
encryption with the new key/IV and an entry in the playlist for the new key
|
|
||||||
URI/IV.
|
|
||||||
|
|
||||||
Key info file format:
|
|
||||||
@example
|
|
||||||
@var{key URI}
|
|
||||||
@var{key file path}
|
|
||||||
@var{IV} (optional)
|
|
||||||
@end example
|
|
||||||
|
|
||||||
Example key URIs:
|
|
||||||
@example
|
|
||||||
http://server/file.key
|
|
||||||
/path/to/file.key
|
|
||||||
file.key
|
|
||||||
@end example
|
|
||||||
|
|
||||||
Example key file paths:
|
|
||||||
@example
|
|
||||||
file.key
|
|
||||||
/path/to/file.key
|
|
||||||
@end example
|
|
||||||
|
|
||||||
Example IV:
|
|
||||||
@example
|
|
||||||
0123456789ABCDEF0123456789ABCDEF
|
|
||||||
@end example
|
|
||||||
|
|
||||||
Key info file example:
|
|
||||||
@example
|
|
||||||
http://server/file.key
|
|
||||||
/path/to/file.key
|
|
||||||
0123456789ABCDEF0123456789ABCDEF
|
|
||||||
@end example
|
|
||||||
|
|
||||||
Example shell script:
|
|
||||||
@example
|
|
||||||
#!/bin/sh
|
|
||||||
BASE_URL=$@{1:-'.'@}
|
|
||||||
openssl rand 16 > file.key
|
|
||||||
echo $BASE_URL/file.key > file.keyinfo
|
|
||||||
echo file.key >> file.keyinfo
|
|
||||||
echo $(openssl rand -hex 16) >> file.keyinfo
|
|
||||||
ffmpeg -f lavfi -re -i testsrc -c:v h264 -hls_flags delete_segments \
|
|
||||||
-hls_key_info_file file.keyinfo out.m3u8
|
|
||||||
@end example
|
|
||||||
|
|
||||||
@item hls_flags single_file
|
@item hls_flags single_file
|
||||||
If this flag is set, the muxer will store all segments in a single MPEG-TS
|
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
|
file, and will use byte ranges in the playlist. HLS playlists generated with
|
||||||
@@ -494,14 +277,6 @@ Will produce the playlist, @file{out.m3u8}, and a single segment file,
|
|||||||
@item hls_flags delete_segments
|
@item hls_flags delete_segments
|
||||||
Segment files removed from the playlist are deleted after a period of time
|
Segment files removed from the playlist are deleted after a period of time
|
||||||
equal to the duration of the segment plus the duration of the playlist.
|
equal to the duration of the segment plus the duration of the playlist.
|
||||||
|
|
||||||
@item hls_playlist_type event
|
|
||||||
Emit @code{#EXT-X-PLAYLIST-TYPE:EVENT} in the m3u8 header. Forces
|
|
||||||
@option{hls_list_size} to 0; the playlist can only be appended to.
|
|
||||||
|
|
||||||
@item hls_playlist_type vod
|
|
||||||
Emit @code{#EXT-X-PLAYLIST-TYPE:VOD} in the m3u8 header. Forces
|
|
||||||
@option{hls_list_size} to 0; the playlist must not change.
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@anchor{ico}
|
@anchor{ico}
|
||||||
@@ -715,12 +490,16 @@ have no effect if it is not.
|
|||||||
|
|
||||||
MD5 testing format.
|
MD5 testing format.
|
||||||
|
|
||||||
This is a variant of the @ref{hash} muxer. Unlike that muxer, it
|
This muxer computes and prints the MD5 hash of all the input audio
|
||||||
defaults to using the MD5 hash function.
|
and video frames. By default audio frames are converted to signed
|
||||||
|
16-bit raw audio and video frames to raw video before computing the
|
||||||
|
hash.
|
||||||
|
|
||||||
@subsection Examples
|
The output of the muxer consists of a single line of the form:
|
||||||
|
MD5=@var{MD5}, where @var{MD5} is a hexadecimal number representing
|
||||||
|
the computed MD5 hash.
|
||||||
|
|
||||||
To compute the MD5 hash of the input converted to raw
|
For example to compute the MD5 hash of the input converted to raw
|
||||||
audio and video, and store it in the file @file{out.md5}:
|
audio and video, and store it in the file @file{out.md5}:
|
||||||
@example
|
@example
|
||||||
ffmpeg -i INPUT -f md5 out.md5
|
ffmpeg -i INPUT -f md5 out.md5
|
||||||
@@ -731,7 +510,7 @@ You can print the MD5 to stdout with the command:
|
|||||||
ffmpeg -i INPUT -f md5 -
|
ffmpeg -i INPUT -f md5 -
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
See also the @ref{hash} and @ref{framemd5} muxers.
|
See also the @ref{framemd5} muxer.
|
||||||
|
|
||||||
@section mov, mp4, ismv
|
@section mov, mp4, ismv
|
||||||
|
|
||||||
@@ -832,13 +611,6 @@ point on IIS with this muxer. Example:
|
|||||||
ffmpeg -re @var{<normal input/transcoding options>} -movflags isml+frag_keyframe -f ismv http://server/publishingpoint.isml/Streams(Encoder1)
|
ffmpeg -re @var{<normal input/transcoding options>} -movflags isml+frag_keyframe -f ismv http://server/publishingpoint.isml/Streams(Encoder1)
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@subsection Audible AAX
|
|
||||||
|
|
||||||
Audible AAX files are encrypted M4B files, and they can be decrypted by specifying a 4 byte activation secret.
|
|
||||||
@example
|
|
||||||
ffmpeg -activation_bytes 1CEB00DA -i test.aax -vn -c:a copy output.mp4
|
|
||||||
@end example
|
|
||||||
|
|
||||||
@section mp3
|
@section mp3
|
||||||
|
|
||||||
The MP3 muxer writes a raw MP3 stream with the following optional features:
|
The MP3 muxer writes a raw MP3 stream with the following optional features:
|
||||||
@@ -908,41 +680,37 @@ and @code{service_name}. If they are not set the default for
|
|||||||
The muxer options are:
|
The muxer options are:
|
||||||
|
|
||||||
@table @option
|
@table @option
|
||||||
@item mpegts_original_network_id @var{number}
|
@item -mpegts_original_network_id @var{number}
|
||||||
Set the original_network_id (default 0x0001). This is unique identifier
|
Set the original_network_id (default 0x0001). This is unique identifier
|
||||||
of a network in DVB. Its main use is in the unique identification of a
|
of a network in DVB. Its main use is in the unique identification of a
|
||||||
service through the path Original_Network_ID, Transport_Stream_ID.
|
service through the path Original_Network_ID, Transport_Stream_ID.
|
||||||
@item mpegts_transport_stream_id @var{number}
|
@item -mpegts_transport_stream_id @var{number}
|
||||||
Set the transport_stream_id (default 0x0001). This identifies a
|
Set the transport_stream_id (default 0x0001). This identifies a
|
||||||
transponder in DVB.
|
transponder in DVB.
|
||||||
@item mpegts_service_id @var{number}
|
@item -mpegts_service_id @var{number}
|
||||||
Set the service_id (default 0x0001) also known as program in DVB.
|
Set the service_id (default 0x0001) also known as program in DVB.
|
||||||
@item mpegts_service_type @var{number}
|
@item -mpegts_service_type @var{number}
|
||||||
Set the program service_type (default @var{digital_tv}), see below
|
Set the program service_type (default @var{digital_tv}), see below
|
||||||
a list of pre defined values.
|
a list of pre defined values.
|
||||||
@item mpegts_pmt_start_pid @var{number}
|
@item -mpegts_pmt_start_pid @var{number}
|
||||||
Set the first PID for PMT (default 0x1000, max 0x1f00).
|
Set the first PID for PMT (default 0x1000, max 0x1f00).
|
||||||
@item mpegts_start_pid @var{number}
|
@item -mpegts_start_pid @var{number}
|
||||||
Set the first PID for data packets (default 0x0100, max 0x0f00).
|
Set the first PID for data packets (default 0x0100, max 0x0f00).
|
||||||
@item mpegts_m2ts_mode @var{number}
|
@item -mpegts_m2ts_mode @var{number}
|
||||||
Enable m2ts mode if set to 1. Default value is -1 which disables m2ts mode.
|
Enable m2ts mode if set to 1. Default value is -1 which disables m2ts mode.
|
||||||
@item muxrate @var{number}
|
@item -muxrate @var{number}
|
||||||
Set a constant muxrate (default VBR).
|
Set a constant muxrate (default VBR).
|
||||||
@item pcr_period @var{numer}
|
@item -pcr_period @var{numer}
|
||||||
Override the default PCR retransmission time (default 20ms), ignored
|
Override the default PCR retransmission time (default 20ms), ignored
|
||||||
if variable muxrate is selected.
|
if variable muxrate is selected.
|
||||||
@item pat_period @var{number}
|
@item -pes_payload_size @var{number}
|
||||||
Maximal time in seconds between PAT/PMT tables.
|
|
||||||
@item sdt_period @var{number}
|
|
||||||
Maximal time in seconds between SDT tables.
|
|
||||||
@item pes_payload_size @var{number}
|
|
||||||
Set minimum PES packet payload in bytes.
|
Set minimum PES packet payload in bytes.
|
||||||
@item mpegts_flags @var{flags}
|
@item -mpegts_flags @var{flags}
|
||||||
Set flags (see below).
|
Set flags (see below).
|
||||||
@item mpegts_copyts @var{number}
|
@item -mpegts_copyts @var{number}
|
||||||
Preserve original timestamps, if value is set to 1. Default value is -1, which
|
Preserve original timestamps, if value is set to 1. Default value is -1, which
|
||||||
results in shifting timestamps so that they start from 0.
|
results in shifting timestamps so that they start from 0.
|
||||||
@item tables_version @var{number}
|
@item -tables_version @var{number}
|
||||||
Set PAT, PMT and SDT version (default 0, valid values are from 0 to 31, inclusively).
|
Set PAT, PMT and SDT version (default 0, valid values are from 0 to 31, inclusively).
|
||||||
This option allows updating stream structure so that standard consumer may
|
This option allows updating stream structure so that standard consumer may
|
||||||
detect the change. To do so, reopen output AVFormatContext (in case of API
|
detect the change. To do so, reopen output AVFormatContext (in case of API
|
||||||
@@ -958,7 +726,7 @@ ffmpeg -i source2.ts -codec copy -f mpegts -tables_version 1 udp://1.1.1.1:1111
|
|||||||
@end example
|
@end example
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
Option @option{mpegts_service_type} accepts the following values:
|
Option mpegts_service_type accepts the following values:
|
||||||
|
|
||||||
@table @option
|
@table @option
|
||||||
@item hex_value
|
@item hex_value
|
||||||
@@ -979,17 +747,13 @@ Advanced Codec Digital SDTV service.
|
|||||||
Advanced Codec Digital HDTV service.
|
Advanced Codec Digital HDTV service.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
Option @option{mpegts_flags} may take a set of such flags:
|
Option mpegts_flags may take a set of such flags:
|
||||||
|
|
||||||
@table @option
|
@table @option
|
||||||
@item resend_headers
|
@item resend_headers
|
||||||
Reemit PAT/PMT before writing the next packet.
|
Reemit PAT/PMT before writing the next packet.
|
||||||
@item latm
|
@item latm
|
||||||
Use LATM packetization for AAC.
|
Use LATM packetization for AAC.
|
||||||
@item pat_pmt_at_frames
|
|
||||||
Reemit PAT and PMT at each video frame.
|
|
||||||
@item system_b
|
|
||||||
Conform to System B (DVB) instead of System A (ATSC).
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@subsection Example
|
@subsection Example
|
||||||
@@ -1006,21 +770,6 @@ ffmpeg -i file.mpg -c copy \
|
|||||||
-y out.ts
|
-y out.ts
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@section mxf, mxf_d10
|
|
||||||
|
|
||||||
MXF muxer.
|
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
The muxer options are:
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item store_user_comments @var{bool}
|
|
||||||
Set if user comments should be stored if available or never.
|
|
||||||
IRT D-10 does not allow user comments. The default is thus to write them for
|
|
||||||
mxf but not for mxf_d10
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section null
|
@section null
|
||||||
|
|
||||||
Null muxer.
|
Null muxer.
|
||||||
@@ -1127,12 +876,6 @@ implementation for HLS segmentation.
|
|||||||
The segment muxer supports the following options:
|
The segment muxer supports the following options:
|
||||||
|
|
||||||
@table @option
|
@table @option
|
||||||
@item increment_tc @var{1|0}
|
|
||||||
if set to @code{1}, increment timecode between each segment
|
|
||||||
If this is selected, the input need to have
|
|
||||||
a timecode in the first video stream. Default value is
|
|
||||||
@code{0}.
|
|
||||||
|
|
||||||
@item reference_stream @var{specifier}
|
@item reference_stream @var{specifier}
|
||||||
Set the reference stream, as specified by the string @var{specifier}.
|
Set the reference stream, as specified by the string @var{specifier}.
|
||||||
If @var{specifier} is set to @code{auto}, the reference is chosen
|
If @var{specifier} is set to @code{auto}, the reference is chosen
|
||||||
@@ -1165,6 +908,13 @@ Allow caching (only affects M3U8 list files).
|
|||||||
Allow live-friendly file generation.
|
Allow live-friendly file generation.
|
||||||
@end table
|
@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}
|
@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 @var{size}
|
||||||
segments. If 0 the list file will contain all the segments. Default
|
segments. If 0 the list file will contain all the segments. Default
|
||||||
@@ -1174,9 +924,6 @@ value is 0.
|
|||||||
Prepend @var{prefix} to each entry. Useful to generate absolute paths.
|
Prepend @var{prefix} to each entry. Useful to generate absolute paths.
|
||||||
By default no prefix is applied.
|
By default no prefix is applied.
|
||||||
|
|
||||||
@item segment_list_type @var{type}
|
|
||||||
Select the listing format.
|
|
||||||
|
|
||||||
The following values are recognized:
|
The following values are recognized:
|
||||||
@table @samp
|
@table @samp
|
||||||
@item flat
|
@item flat
|
||||||
@@ -1236,28 +983,6 @@ to create files at 12:00 o'clock, 12:15, 12:30, etc.
|
|||||||
|
|
||||||
Default value is "0".
|
Default value is "0".
|
||||||
|
|
||||||
@item segment_clocktime_offset @var{duration}
|
|
||||||
Delay the segment splitting times with the specified duration when using
|
|
||||||
@option{segment_atclocktime}.
|
|
||||||
|
|
||||||
For example with @option{segment_time} set to "900" and
|
|
||||||
@option{segment_clocktime_offset} set to "300" this makes it possible to
|
|
||||||
create files at 12:05, 12:20, 12:35, etc.
|
|
||||||
|
|
||||||
Default value is "0".
|
|
||||||
|
|
||||||
@item segment_clocktime_wrap_duration @var{duration}
|
|
||||||
Force the segmenter to only start a new segment if a packet reaches the muxer
|
|
||||||
within the specified duration after the segmenting clock time. This way you
|
|
||||||
can make the segmenter more resilient to backward local time jumps, such as
|
|
||||||
leap seconds or transition to standard time from daylight savings time.
|
|
||||||
|
|
||||||
Assuming that the delay between the packets of your source is less than 0.5
|
|
||||||
second you can detect a leap second by specifying 0.5 as the duration.
|
|
||||||
|
|
||||||
Default is the maximum possible duration which means starting a new segment
|
|
||||||
regardless of the elapsed time since the last clock time.
|
|
||||||
|
|
||||||
@item segment_time_delta @var{delta}
|
@item segment_time_delta @var{delta}
|
||||||
Specify the accuracy time when selecting the start time for a
|
Specify the accuracy time when selecting the start time for a
|
||||||
segment, expressed as a duration specification. Default value is "0".
|
segment, expressed as a duration specification. Default value is "0".
|
||||||
@@ -1305,12 +1030,6 @@ segments to write. If this is selected, the output segment name must
|
|||||||
contain a @code{strftime} function template. Default value is
|
contain a @code{strftime} function template. Default value is
|
||||||
@code{0}.
|
@code{0}.
|
||||||
|
|
||||||
@item break_non_keyframes @var{1|0}
|
|
||||||
If enabled, allow segments to start on frames other than keyframes. This
|
|
||||||
improves behavior on some players when the time between keyframes is
|
|
||||||
inconsistent, but may make things worse on others, and can cause some oddities
|
|
||||||
during seeking. Defaults to @code{0}.
|
|
||||||
|
|
||||||
@item reset_timestamps @var{1|0}
|
@item reset_timestamps @var{1|0}
|
||||||
Reset timestamps at the begin of each segment, so that each segment
|
Reset timestamps at the begin of each segment, so that each segment
|
||||||
will start with near-zero timestamps. It is meant to ease the playback
|
will start with near-zero timestamps. It is meant to ease the playback
|
||||||
@@ -1320,11 +1039,6 @@ muxers/codecs. It is set to @code{0} by default.
|
|||||||
@item initial_offset @var{offset}
|
@item initial_offset @var{offset}
|
||||||
Specify timestamp offset to apply to the output packet timestamps. The
|
Specify timestamp offset to apply to the output packet timestamps. The
|
||||||
argument must be a time duration specification, and defaults to 0.
|
argument must be a time duration specification, and defaults to 0.
|
||||||
|
|
||||||
@item write_empty_segments @var{1|0}
|
|
||||||
If enabled, write an empty segment if there are no packets during the period a
|
|
||||||
segment would usually span. Otherwise, the segment will be filled with the next
|
|
||||||
packet written. Defaults to @code{0}.
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@subsection Examples
|
@subsection Examples
|
||||||
@@ -1452,14 +1166,7 @@ Several bitstream filters can be specified, separated by ",".
|
|||||||
@item select
|
@item select
|
||||||
Select the streams that should be mapped to the slave output,
|
Select the streams that should be mapped to the slave output,
|
||||||
specified by a stream specifier. If not specified, this defaults to
|
specified by a stream specifier. If not specified, this defaults to
|
||||||
all the input streams. You may use multiple stream specifiers
|
all the input streams.
|
||||||
separated by commas (@code{,}) e.g.: @code{a:0,v}
|
|
||||||
|
|
||||||
@item onfail
|
|
||||||
Specify behaviour on output failure. This can be set to either @code{abort} (which is
|
|
||||||
default) or @code{ignore}. @code{abort} will cause whole process to fail in case of failure
|
|
||||||
on this slave output. @code{ignore} will ignore failure on this output, so other outputs
|
|
||||||
will continue without being affected.
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@subsection Examples
|
@subsection Examples
|
||||||
@@ -1473,14 +1180,6 @@ ffmpeg -i ... -c:v libx264 -c:a mp2 -f tee -map 0:v -map 0:a
|
|||||||
"archive-20121107.mkv|[f=mpegts]udp://10.0.1.255:1234/"
|
"archive-20121107.mkv|[f=mpegts]udp://10.0.1.255:1234/"
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@item
|
|
||||||
As above, but continue streaming even if output to local file fails
|
|
||||||
(for example local drive fills up):
|
|
||||||
@example
|
|
||||||
ffmpeg -i ... -c:v libx264 -c:a mp2 -f tee -map 0:v -map 0:a
|
|
||||||
"[onfail=ignore]archive-20121107.mkv|[f=mpegts]udp://10.0.1.255:1234/"
|
|
||||||
@end example
|
|
||||||
|
|
||||||
@item
|
@item
|
||||||
Use @command{ffmpeg} to encode the input, and send the output
|
Use @command{ffmpeg} to encode the input, and send the output
|
||||||
to three different destinations. The @code{dump_extra} bitstream
|
to three different destinations. The @code{dump_extra} bitstream
|
||||||
@@ -1511,17 +1210,7 @@ is the @option{global_header} flag.
|
|||||||
|
|
||||||
WebM DASH Manifest muxer.
|
WebM DASH Manifest muxer.
|
||||||
|
|
||||||
This muxer implements the WebM DASH Manifest specification to generate the DASH
|
This muxer implements the WebM DASH Manifest specification to generate the DASH manifest XML.
|
||||||
manifest XML. It also supports manifest generation for DASH live streams.
|
|
||||||
|
|
||||||
For more information see:
|
|
||||||
|
|
||||||
@itemize @bullet
|
|
||||||
@item
|
|
||||||
WebM DASH Specification: @url{https://sites.google.com/a/webmproject.org/wiki/adaptive-streaming/webm-dash-specification}
|
|
||||||
@item
|
|
||||||
ISO DASH Specification: @url{http://standards.iso.org/ittf/PubliclyAvailableStandards/c065274_ISO_IEC_23009-1_2014.zip}
|
|
||||||
@end itemize
|
|
||||||
|
|
||||||
@subsection Options
|
@subsection Options
|
||||||
|
|
||||||
@@ -1532,32 +1221,6 @@ This muxer supports the following options:
|
|||||||
This option has the following syntax: "id=x,streams=a,b,c id=y,streams=d,e" where x and y are the
|
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
|
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.
|
audio and video streams. Any number of adaptation sets can be added using this option.
|
||||||
|
|
||||||
@item live
|
|
||||||
Set this to 1 to create a live stream DASH Manifest. Default: 0.
|
|
||||||
|
|
||||||
@item chunk_start_index
|
|
||||||
Start index of the first chunk. This will go in the @samp{startNumber} attribute
|
|
||||||
of the @samp{SegmentTemplate} element in the manifest. Default: 0.
|
|
||||||
|
|
||||||
@item chunk_duration_ms
|
|
||||||
Duration of each chunk in milliseconds. This will go in the @samp{duration}
|
|
||||||
attribute of the @samp{SegmentTemplate} element in the manifest. Default: 1000.
|
|
||||||
|
|
||||||
@item utc_timing_url
|
|
||||||
URL of the page that will return the UTC timestamp in ISO format. This will go
|
|
||||||
in the @samp{value} attribute of the @samp{UTCTiming} element in the manifest.
|
|
||||||
Default: None.
|
|
||||||
|
|
||||||
@item time_shift_buffer_depth
|
|
||||||
Smallest time (in seconds) shifting buffer for which any Representation is
|
|
||||||
guaranteed to be available. This will go in the @samp{timeShiftBufferDepth}
|
|
||||||
attribute of the @samp{MPD} element. Default: 60.
|
|
||||||
|
|
||||||
@item minimum_update_period
|
|
||||||
Minimum update period (in seconds) of the manifest. This will go in the
|
|
||||||
@samp{minimumUpdatePeriod} attribute of the @samp{MPD} element. Default: 0.
|
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@subsection Example
|
@subsection Example
|
||||||
@@ -1573,47 +1236,4 @@ ffmpeg -f webm_dash_manifest -i video1.webm \
|
|||||||
manifest.xml
|
manifest.xml
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@section webm_chunk
|
|
||||||
|
|
||||||
WebM Live Chunk Muxer.
|
|
||||||
|
|
||||||
This muxer writes out WebM headers and chunks as separate files which can be
|
|
||||||
consumed by clients that support WebM Live streams via DASH.
|
|
||||||
|
|
||||||
@subsection Options
|
|
||||||
|
|
||||||
This muxer supports the following options:
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item chunk_start_index
|
|
||||||
Index of the first chunk (defaults to 0).
|
|
||||||
|
|
||||||
@item header
|
|
||||||
Filename of the header where the initialization data will be written.
|
|
||||||
|
|
||||||
@item audio_chunk_duration
|
|
||||||
Duration of each audio chunk in milliseconds (defaults to 5000).
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@subsection Example
|
|
||||||
@example
|
|
||||||
ffmpeg -f v4l2 -i /dev/video0 \
|
|
||||||
-f alsa -i hw:0 \
|
|
||||||
-map 0:0 \
|
|
||||||
-c:v libvpx-vp9 \
|
|
||||||
-s 640x360 -keyint_min 30 -g 30 \
|
|
||||||
-f webm_chunk \
|
|
||||||
-header webm_live_video_360.hdr \
|
|
||||||
-chunk_start_index 1 \
|
|
||||||
webm_live_video_360_%d.chk \
|
|
||||||
-map 1:0 \
|
|
||||||
-c:a libvorbis \
|
|
||||||
-b:a 128k \
|
|
||||||
-f webm_chunk \
|
|
||||||
-header webm_live_audio_128.hdr \
|
|
||||||
-chunk_start_index 1 \
|
|
||||||
-audio_chunk_duration 1000 \
|
|
||||||
webm_live_audio_128_%d.chk
|
|
||||||
@end example
|
|
||||||
|
|
||||||
@c man end MUXERS
|
@c man end MUXERS
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ NUT has some variants signaled by using the flags field in its main header.
|
|||||||
|
|
||||||
The BROADCAST variant provides a secondary time reference to facilitate
|
The BROADCAST variant provides a secondary time reference to facilitate
|
||||||
detecting endpoint latency and network delays.
|
detecting endpoint latency and network delays.
|
||||||
It assumes all the endpoint clocks are synchronized.
|
It assumes all the endpoint clocks are syncronized.
|
||||||
To be used in real-time scenarios.
|
To be used in real-time scenarios.
|
||||||
|
|
||||||
@section PIPE
|
@section PIPE
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ If you plan to do non-x86 architecture specific optimizations (SIMD normally),
|
|||||||
then take a look in the x86/ directory, as most important functions are
|
then take a look in the x86/ directory, as most important functions are
|
||||||
already optimized for MMX.
|
already optimized for MMX.
|
||||||
|
|
||||||
If you want to do x86 optimizations then you can either try to fine-tune the
|
If you want to do x86 optimizations then you can either try to finetune the
|
||||||
stuff in the x86 directory or find some other functions in the C source to
|
stuff in the x86 directory or find some other functions in the C source to
|
||||||
optimize, but there aren't many left.
|
optimize, but there aren't many left.
|
||||||
|
|
||||||
@@ -163,7 +163,7 @@ general x86 registers (e.g. eax) as well as XMM registers. This last one is
|
|||||||
particularly important on Win64, where xmm6-15 are callee-save, and not
|
particularly important on Win64, where xmm6-15 are callee-save, and not
|
||||||
restoring their contents leads to undefined results. In external asm (e.g.
|
restoring their contents leads to undefined results. In external asm (e.g.
|
||||||
yasm), you do this by using:
|
yasm), you do this by using:
|
||||||
cglobal function_name, num_args, num_regs, num_xmm_regs
|
cglobal functon_name, num_args, num_regs, num_xmm_regs
|
||||||
In inline asm, you specify clobbered registers at the end of your asm:
|
In inline asm, you specify clobbered registers at the end of your asm:
|
||||||
__asm__(".." ::: "%eax").
|
__asm__(".." ::: "%eax").
|
||||||
If gcc is not set to support sse (-msse) it will not accept xmm registers
|
If gcc is not set to support sse (-msse) it will not accept xmm registers
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ bash ./configure
|
|||||||
@section Darwin (Mac OS X, iPhone)
|
@section Darwin (Mac OS X, iPhone)
|
||||||
|
|
||||||
The toolchain provided with Xcode is sufficient to build the basic
|
The toolchain provided with Xcode is sufficient to build the basic
|
||||||
unaccelerated code.
|
unacelerated code.
|
||||||
|
|
||||||
Mac OS X on PowerPC or ARM (iPhone) requires a preprocessor from
|
Mac OS X on PowerPC or ARM (iPhone) requires a preprocessor from
|
||||||
@url{https://github.com/FFmpeg/gas-preprocessor} or
|
@url{https://github.com/FFmpeg/gas-preprocessor} or
|
||||||
@@ -107,13 +107,8 @@ Notes:
|
|||||||
|
|
||||||
@itemize
|
@itemize
|
||||||
|
|
||||||
@item Building for the MSYS environment is discouraged, MSYS2 provides a full
|
@item Building natively using MSYS2 can be sped up by disabling implicit rules
|
||||||
MinGW-w64 environment through @file{mingw64_shell.bat} or
|
in the Makefile by calling @code{make -r} instead of plain @code{make}. This
|
||||||
@file{mingw32_shell.bat} that should be used instead of the environment
|
|
||||||
provided by @file{msys2_shell.bat}.
|
|
||||||
|
|
||||||
@item Building using MSYS2 can be sped up by disabling implicit rules in the
|
|
||||||
Makefile by calling @code{make -r} instead of plain @code{make}. This
|
|
||||||
speed up is close to non-existent for normal one-off builds and is only
|
speed up is close to non-existent for normal one-off builds and is only
|
||||||
noticeable when running make for a second time (for example during
|
noticeable when running make for a second time (for example during
|
||||||
@code{make install}).
|
@code{make install}).
|
||||||
@@ -127,25 +122,6 @@ libavformat) as DLLs.
|
|||||||
|
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
@subsection Native Windows compilation using MSYS2
|
|
||||||
|
|
||||||
The MSYS2 MinGW-w64 environment provides ready to use toolchains and dependencies
|
|
||||||
through @command{pacman}.
|
|
||||||
|
|
||||||
Make sure to use @file{mingw64_shell.bat} or @file{mingw32_shell.bat} to have
|
|
||||||
the correct MinGW-w64 environment. The default install provides shortcuts to
|
|
||||||
them under @command{MinGW-w64 Win64 Shell} and @command{MinGW-w64 Win32 Shell}.
|
|
||||||
|
|
||||||
@example
|
|
||||||
# normal msys2 packages
|
|
||||||
pacman -S make pkgconf diffutils
|
|
||||||
|
|
||||||
# mingw-w64 packages and toolchains
|
|
||||||
pacman -S mingw-w64-x86_64-yasm mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL
|
|
||||||
@end example
|
|
||||||
|
|
||||||
To target 32 bits replace @code{x86_64} with @code{i686} in the command above.
|
|
||||||
|
|
||||||
@section Microsoft Visual C++ or Intel C++ Compiler for Windows
|
@section Microsoft Visual C++ or Intel C++ Compiler for Windows
|
||||||
|
|
||||||
FFmpeg can be built with MSVC 2012 or earlier using a C99-to-C89 conversion utility
|
FFmpeg can be built with MSVC 2012 or earlier using a C99-to-C89 conversion utility
|
||||||
@@ -199,6 +175,12 @@ Notes:
|
|||||||
|
|
||||||
@itemize
|
@itemize
|
||||||
|
|
||||||
|
@item It is possible that coreutils' @code{link.exe} conflicts with MSVC's linker.
|
||||||
|
You can find out by running @code{which link} to see which @code{link.exe} you
|
||||||
|
are using. If it is located at @code{/bin/link.exe}, then you have the wrong one
|
||||||
|
in your @code{PATH}. Either move or remove that copy, or make sure MSVC's
|
||||||
|
@code{link.exe} takes precedence in your @code{PATH} over coreutils'.
|
||||||
|
|
||||||
@item If you wish to build with zlib support, you will have to grab a compatible
|
@item If you wish to build with zlib support, you will have to grab a compatible
|
||||||
zlib binary from somewhere, with an MSVC import lib, or if you wish to link
|
zlib binary from somewhere, with an MSVC import lib, or if you wish to link
|
||||||
statically, you can follow the instructions below to build a compatible
|
statically, you can follow the instructions below to build a compatible
|
||||||
@@ -314,7 +296,7 @@ These library packages are only available from
|
|||||||
@uref{http://sourceware.org/cygwinports/, Cygwin Ports}:
|
@uref{http://sourceware.org/cygwinports/, Cygwin Ports}:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
yasm, libSDL-devel, libfaac-devel, libgsm-devel, libmp3lame-devel,
|
yasm, libSDL-devel, libfaac-devel, libaacplus-devel, libgsm-devel, libmp3lame-devel,
|
||||||
libschroedinger1.0-devel, speex-devel, libtheora-devel, libxvidcore-devel
|
libschroedinger1.0-devel, speex-devel, libtheora-devel, libxvidcore-devel
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +1,3 @@
|
|||||||
@chapter Protocol Options
|
|
||||||
@c man begin PROTOCOL OPTIONS
|
|
||||||
|
|
||||||
The libavformat library provides some generic global options, which
|
|
||||||
can be set on all the protocols. In addition each protocol may support
|
|
||||||
so-called private options, which are specific for that component.
|
|
||||||
|
|
||||||
The list of supported options follows:
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item protocol_whitelist @var{list} (@emph{input})
|
|
||||||
Set a ","-separated list of allowed protocols. "ALL" matches all protocols. Protocols
|
|
||||||
prefixed by "-" are disabled.
|
|
||||||
All protocols are allowed by default but protocols used by an another
|
|
||||||
protocol (nested protocols) are restricted to a per protocol subset.
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@c man end PROTOCOL OPTIONS
|
|
||||||
|
|
||||||
@chapter Protocols
|
@chapter Protocols
|
||||||
@c man begin PROTOCOLS
|
@c man begin PROTOCOLS
|
||||||
|
|
||||||
@@ -36,28 +17,8 @@ particular protocol using the option
|
|||||||
The option "-protocols" of the ff* tools will display the list of
|
The option "-protocols" of the ff* tools will display the list of
|
||||||
supported protocols.
|
supported protocols.
|
||||||
|
|
||||||
All protocols accept the following options:
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item rw_timeout
|
|
||||||
Maximum time to wait for (network) read/write operations to complete,
|
|
||||||
in microseconds.
|
|
||||||
@end table
|
|
||||||
|
|
||||||
A description of the currently available protocols follows.
|
A description of the currently available protocols follows.
|
||||||
|
|
||||||
@section async
|
|
||||||
|
|
||||||
Asynchronous data filling wrapper for input stream.
|
|
||||||
|
|
||||||
Fill data in a background thread, to decouple I/O operation from demux thread.
|
|
||||||
|
|
||||||
@example
|
|
||||||
async:@var{URL}
|
|
||||||
async:http://host/resource
|
|
||||||
async:cache:http://host/resource
|
|
||||||
@end example
|
|
||||||
|
|
||||||
@section bluray
|
@section bluray
|
||||||
|
|
||||||
Read BluRay playlist.
|
Read BluRay playlist.
|
||||||
@@ -224,17 +185,6 @@ it, unless special care is taken (tests, customized server configuration
|
|||||||
etc.). Different FTP servers behave in different way during seek
|
etc.). Different FTP servers behave in different way during seek
|
||||||
operation. ff* tools may produce incomplete content due to server limitations.
|
operation. ff* tools may produce incomplete content due to server limitations.
|
||||||
|
|
||||||
This protocol accepts the following options:
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item follow
|
|
||||||
If set to 1, the protocol will retry reading at the end of the file, allowing
|
|
||||||
reading files that still are being written. In order for this to terminate,
|
|
||||||
you either need to use the rw_timeout option, or use the interrupt callback
|
|
||||||
(for API users).
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section gopher
|
@section gopher
|
||||||
|
|
||||||
Gopher protocol.
|
Gopher protocol.
|
||||||
@@ -278,9 +228,6 @@ If set to 1 use chunked Transfer-Encoding for posts, default is 1.
|
|||||||
@item content_type
|
@item content_type
|
||||||
Set a specific content type for the POST messages.
|
Set a specific content type for the POST messages.
|
||||||
|
|
||||||
@item http_proxy
|
|
||||||
set HTTP proxy to tunnel through e.g. http://example.com:1234
|
|
||||||
|
|
||||||
@item headers
|
@item headers
|
||||||
Set custom HTTP headers, can override built in default headers. The
|
Set custom HTTP headers, can override built in default headers. The
|
||||||
value must be a string encoding the headers.
|
value must be a string encoding the headers.
|
||||||
@@ -301,16 +248,6 @@ Set timeout in microseconds of socket I/O operations used by the underlying low
|
|||||||
operation. By default it is set to -1, which means that the timeout is
|
operation. By default it is set to -1, which means that the timeout is
|
||||||
not specified.
|
not specified.
|
||||||
|
|
||||||
@item reconnect_at_eof
|
|
||||||
If set then eof is treated like an error and causes reconnection, this is useful
|
|
||||||
for live / endless streams.
|
|
||||||
|
|
||||||
@item reconnect_streamed
|
|
||||||
If set then even streamed/non seekable streams will be reconnected on errors.
|
|
||||||
|
|
||||||
@item reconnect_delay_max
|
|
||||||
Sets the maximum delay in seconds after which to give up reconnecting
|
|
||||||
|
|
||||||
@item mime_type
|
@item mime_type
|
||||||
Export the MIME type.
|
Export the MIME type.
|
||||||
|
|
||||||
@@ -340,43 +277,6 @@ Set initial byte offset.
|
|||||||
|
|
||||||
@item end_offset
|
@item end_offset
|
||||||
Try to limit the request to bytes preceding this offset.
|
Try to limit the request to bytes preceding this offset.
|
||||||
|
|
||||||
@item method
|
|
||||||
When used as a client option it sets the HTTP method for the request.
|
|
||||||
|
|
||||||
When used as a server option it sets the HTTP method that is going to be
|
|
||||||
expected from the client(s).
|
|
||||||
If the expected and the received HTTP method do not match the client will
|
|
||||||
be given a Bad Request response.
|
|
||||||
When unset the HTTP method is not checked for now. This will be replaced by
|
|
||||||
autodetection in the future.
|
|
||||||
|
|
||||||
@item listen
|
|
||||||
If set to 1 enables experimental HTTP server. This can be used to send data when
|
|
||||||
used as an output option, or read data from a client with HTTP POST when used as
|
|
||||||
an input option.
|
|
||||||
If set to 2 enables experimental mutli-client HTTP server. This is not yet implemented
|
|
||||||
in ffmpeg.c or ffserver.c and thus must not be used as a command line option.
|
|
||||||
@example
|
|
||||||
# Server side (sending):
|
|
||||||
ffmpeg -i somefile.ogg -c copy -listen 1 -f ogg http://@var{server}:@var{port}
|
|
||||||
|
|
||||||
# Client side (receiving):
|
|
||||||
ffmpeg -i http://@var{server}:@var{port} -c copy somefile.ogg
|
|
||||||
|
|
||||||
# Client can also be done with wget:
|
|
||||||
wget http://@var{server}:@var{port} -O somefile.ogg
|
|
||||||
|
|
||||||
# Server side (receiving):
|
|
||||||
ffmpeg -listen 1 -i http://@var{server}:@var{port} -c copy somefile.ogg
|
|
||||||
|
|
||||||
# Client side (sending):
|
|
||||||
ffmpeg -i somefile.ogg -chunked_post 0 -c copy -f ogg http://@var{server}:@var{port}
|
|
||||||
|
|
||||||
# Client can also be done with wget:
|
|
||||||
wget --post-file=somefile.ogg http://@var{server}:@var{port}
|
|
||||||
@end example
|
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@subsection HTTP Cookies
|
@subsection HTTP Cookies
|
||||||
@@ -1155,9 +1055,7 @@ subfile,,start,153391104,end,268142592,,:/media/dvd/VIDEO_TS/VTS_08_1.VOB
|
|||||||
@end example
|
@end example
|
||||||
|
|
||||||
Play an AVI file directly from a TAR archive:
|
Play an AVI file directly from a TAR archive:
|
||||||
@example
|
|
||||||
subfile,,start,183241728,end,366490624,,:archive.tar
|
subfile,,start,183241728,end,366490624,,:archive.tar
|
||||||
@end example
|
|
||||||
|
|
||||||
@section tcp
|
@section tcp
|
||||||
|
|
||||||
@@ -1185,12 +1083,6 @@ than this time interval, raise error.
|
|||||||
|
|
||||||
@item listen_timeout=@var{milliseconds}
|
@item listen_timeout=@var{milliseconds}
|
||||||
Set listen timeout, expressed in milliseconds.
|
Set listen timeout, expressed in milliseconds.
|
||||||
|
|
||||||
@item recv_buffer_size=@var{bytes}
|
|
||||||
Set receive buffer size, expressed bytes.
|
|
||||||
|
|
||||||
@item send_buffer_size=@var{bytes}
|
|
||||||
Set send buffer size, expressed bytes.
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
The following example shows how to setup a listening TCP connection
|
The following example shows how to setup a listening TCP connection
|
||||||
@@ -1285,14 +1177,6 @@ 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.
|
the receive or send buffer size, depending on what the socket is used for.
|
||||||
Default is 64KB. See also @var{fifo_size}.
|
Default is 64KB. See also @var{fifo_size}.
|
||||||
|
|
||||||
@item bitrate=@var{bitrate}
|
|
||||||
If set to nonzero, the output will have the specified constant bitrate if the
|
|
||||||
input has enough packets to sustain it.
|
|
||||||
|
|
||||||
@item burst_bits=@var{bits}
|
|
||||||
When using @var{bitrate} this specifies the maximum number of bits in
|
|
||||||
packet bursts.
|
|
||||||
|
|
||||||
@item localport=@var{port}
|
@item localport=@var{port}
|
||||||
Override the local UDP port to bind with.
|
Override the local UDP port to bind with.
|
||||||
|
|
||||||
|
|||||||
@@ -66,8 +66,8 @@ Set rematrix volume. Default value is 1.0.
|
|||||||
|
|
||||||
@item rematrix_maxval
|
@item rematrix_maxval
|
||||||
Set maximum output value for rematrixing.
|
Set maximum output value for rematrixing.
|
||||||
This can be used to prevent clipping vs. preventing volume reduction.
|
This can be used to prevent clipping vs. preventing volumn reduction
|
||||||
A value of 1.0 prevents clipping.
|
A value of 1.0 prevents cliping.
|
||||||
|
|
||||||
@item flags, swr_flags
|
@item flags, swr_flags
|
||||||
Set flags used by the converter. Default value is 0.
|
Set flags used by the converter. Default value is 0.
|
||||||
@@ -94,13 +94,13 @@ select triangular dither
|
|||||||
@item triangular_hp
|
@item triangular_hp
|
||||||
select triangular dither with high pass
|
select triangular dither with high pass
|
||||||
@item lipshitz
|
@item lipshitz
|
||||||
select Lipshitz noise shaping dither.
|
select lipshitz noise shaping dither
|
||||||
@item shibata
|
@item shibata
|
||||||
select Shibata noise shaping dither.
|
select shibata noise shaping dither
|
||||||
@item low_shibata
|
@item low_shibata
|
||||||
select low Shibata noise shaping dither.
|
select low shibata noise shaping dither
|
||||||
@item high_shibata
|
@item high_shibata
|
||||||
select high Shibata noise shaping dither.
|
select high shibata noise shaping dither
|
||||||
@item f_weighted
|
@item f_weighted
|
||||||
select f-weighted noise shaping dither
|
select f-weighted noise shaping dither
|
||||||
@item modified_e_weighted
|
@item modified_e_weighted
|
||||||
@@ -120,8 +120,8 @@ select the native SW Resampler; filter options precision and cheby are not
|
|||||||
applicable in this case.
|
applicable in this case.
|
||||||
@item soxr
|
@item soxr
|
||||||
select the SoX Resampler (where available); compensation, and filter options
|
select the SoX Resampler (where available); compensation, and filter options
|
||||||
filter_size, phase_shift, exact_rational, filter_type & kaiser_beta, are not
|
filter_size, phase_shift, filter_type & kaiser_beta, are not applicable in this
|
||||||
applicable in this case.
|
case.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item filter_size
|
@item filter_size
|
||||||
@@ -132,12 +132,7 @@ For swr only, set resampling phase shift, default value is 10, and must be in
|
|||||||
the interval [0,30].
|
the interval [0,30].
|
||||||
|
|
||||||
@item linear_interp
|
@item linear_interp
|
||||||
Use linear interpolation if set to 1, default value is 0.
|
Use Linear Interpolation if set to 1, default value is 0.
|
||||||
|
|
||||||
@item exact_rational
|
|
||||||
For swr only, when enabled, try to use exact phase_count based on input and
|
|
||||||
output sample rate. However, if it is larger than @code{1 << phase_shift},
|
|
||||||
the phase_count will be @code{1 << phase_shift} as fallback. Default is disabled.
|
|
||||||
|
|
||||||
@item cutoff
|
@item cutoff
|
||||||
Set cutoff frequency (swr: 6dB point; soxr: 0dB point) ratio; must be a float
|
Set cutoff frequency (swr: 6dB point; soxr: 0dB point) ratio; must be a float
|
||||||
@@ -219,13 +214,13 @@ It accepts the following values:
|
|||||||
@item cubic
|
@item cubic
|
||||||
select cubic
|
select cubic
|
||||||
@item blackman_nuttall
|
@item blackman_nuttall
|
||||||
select Blackman Nuttall windowed sinc
|
select Blackman Nuttall Windowed Sinc
|
||||||
@item kaiser
|
@item kaiser
|
||||||
select Kaiser windowed sinc
|
select Kaiser Windowed Sinc
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item kaiser_beta
|
@item kaiser_beta
|
||||||
For swr only, set Kaiser window beta value. Must be a double float value in the
|
For swr only, set Kaiser Window Beta value. Must be an integer in the
|
||||||
interval [2,16], default value is 9.
|
interval [2,16], default value is 9.
|
||||||
|
|
||||||
@item output_sample_bits
|
@item output_sample_bits
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ Select Gaussian rescaling algorithm.
|
|||||||
Select sinc rescaling algorithm.
|
Select sinc rescaling algorithm.
|
||||||
|
|
||||||
@item lanczos
|
@item lanczos
|
||||||
Select Lanczos rescaling algorithm.
|
Select lanczos rescaling algorithm.
|
||||||
|
|
||||||
@item spline
|
@item spline
|
||||||
Select natural bicubic spline rescaling algorithm.
|
Select natural bicubic spline rescaling algorithm.
|
||||||
@@ -91,7 +91,6 @@ Select source range.
|
|||||||
@item dst_range
|
@item dst_range
|
||||||
Select destination range.
|
Select destination range.
|
||||||
|
|
||||||
@anchor{sws_params}
|
|
||||||
@item param0, param1
|
@item param0, param1
|
||||||
Set scaling algorithm parameters. The specified values are specific of
|
Set scaling algorithm parameters. The specified values are specific of
|
||||||
some scaling algorithms and ignored by others. The specified values
|
some scaling algorithms and ignored by others. The specified values
|
||||||
@@ -123,22 +122,6 @@ a_dither).
|
|||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item alphablend
|
|
||||||
Set the alpha blending to use when the input has alpha but the output does not.
|
|
||||||
Default value is @samp{none}.
|
|
||||||
|
|
||||||
@table @samp
|
|
||||||
@item uniform_color
|
|
||||||
Blend onto a uniform background color
|
|
||||||
|
|
||||||
@item checkerboard
|
|
||||||
Blend onto a checkerboard
|
|
||||||
|
|
||||||
@item none
|
|
||||||
No blending
|
|
||||||
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@c man end SCALER OPTIONS
|
@c man end SCALER OPTIONS
|
||||||
|
|||||||
@@ -527,7 +527,7 @@ Wavelet Transform:
|
|||||||
==================
|
==================
|
||||||
|
|
||||||
Snow supports 2 wavelet transforms, the symmetric biorthogonal 5/3 integer
|
Snow supports 2 wavelet transforms, the symmetric biorthogonal 5/3 integer
|
||||||
transform and an integer approximation of the symmetric biorthogonal 9/7
|
transform and a integer approximation of the symmetric biorthogonal 9/7
|
||||||
daubechies wavelet.
|
daubechies wavelet.
|
||||||
|
|
||||||
2D IDWT (inverse discrete wavelet transform)
|
2D IDWT (inverse discrete wavelet transform)
|
||||||
|
|||||||
@@ -10,12 +10,12 @@ Current (simplified) Architecture:
|
|||||||
/ \
|
/ \
|
||||||
special converter [Input to YUV converter]
|
special converter [Input to YUV converter]
|
||||||
| |
|
| |
|
||||||
| (8-bit YUV 4:4:4 / 4:2:2 / 4:2:0 / 4:0:0 )
|
| (8bit YUV 4:4:4 / 4:2:2 / 4:2:0 / 4:0:0 )
|
||||||
| |
|
| |
|
||||||
| v
|
| v
|
||||||
| Horizontal scaler
|
| Horizontal scaler
|
||||||
| |
|
| |
|
||||||
| (15-bit YUV 4:4:4 / 4:2:2 / 4:2:0 / 4:1:1 / 4:0:0 )
|
| (15bit YUV 4:4:4 / 4:2:2 / 4:2:0 / 4:1:1 / 4:0:0 )
|
||||||
| |
|
| |
|
||||||
| v
|
| v
|
||||||
| Vertical scaler and output converter
|
| Vertical scaler and output converter
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ INF: while(<$inf>) {
|
|||||||
if ($ended =~ /^(?:ifset|ifclear|ignore|menu|iftex|ifhtml|ifnothtml)$/) {
|
if ($ended =~ /^(?:ifset|ifclear|ignore|menu|iftex|ifhtml|ifnothtml)$/) {
|
||||||
$skipping = pop @skstack;
|
$skipping = pop @skstack;
|
||||||
next;
|
next;
|
||||||
} elsif ($ended =~ /^(?:example|smallexample|verbatim|display)$/) {
|
} elsif ($ended =~ /^(?:example|smallexample|display)$/) {
|
||||||
$shift = "";
|
$shift = "";
|
||||||
$_ = ""; # need a paragraph break
|
$_ = ""; # need a paragraph break
|
||||||
} elsif ($ended =~ /^(?:itemize|enumerate|(?:multi|[fv])?table)$/) {
|
} elsif ($ended =~ /^(?:itemize|enumerate|(?:multi|[fv])?table)$/) {
|
||||||
@@ -290,7 +290,7 @@ INF: while(<$inf>) {
|
|||||||
$_ = "\n=over 4\n";
|
$_ = "\n=over 4\n";
|
||||||
};
|
};
|
||||||
|
|
||||||
/^\@((?:small)?example|verbatim|display)/ and do {
|
/^\@((?:small)?example|display)/ and do {
|
||||||
push @endwstack, $endw;
|
push @endwstack, $endw;
|
||||||
$endw = $1;
|
$endw = $1;
|
||||||
$shift = "\t";
|
$shift = "\t";
|
||||||
@@ -384,7 +384,7 @@ sub postprocess
|
|||||||
# @* is also impossible in .pod; we discard it and any newline that
|
# @* is also impossible in .pod; we discard it and any newline that
|
||||||
# follows it. Similarly, our macro @gol must be discarded.
|
# follows it. Similarly, our macro @gol must be discarded.
|
||||||
|
|
||||||
s/\@anchor\{(?:[^\}]*)\}//g;
|
s/\@anchor{(?:[^\}]*)\}//g;
|
||||||
s/\(?\@xref\{(?:[^\}]*)\}(?:[^.<]|(?:<[^<>]*>))*\.\)?//g;
|
s/\(?\@xref\{(?:[^\}]*)\}(?:[^.<]|(?:<[^<>]*>))*\.\)?//g;
|
||||||
s/\s+\(\@pxref\{(?:[^\}]*)\}\)//g;
|
s/\s+\(\@pxref\{(?:[^\}]*)\}\)//g;
|
||||||
s/;\s+\@pxref\{(?:[^\}]*)\}//g;
|
s/;\s+\@pxref\{(?:[^\}]*)\}//g;
|
||||||
|
|||||||
@@ -12,17 +12,17 @@ explicitly specified. The following rules are applied:
|
|||||||
|
|
||||||
@itemize
|
@itemize
|
||||||
@item
|
@item
|
||||||
@samp{'} and @samp{\} are special characters (respectively used for
|
@code{'} and @code{\} are special characters (respectively used for
|
||||||
quoting and escaping). In addition to them, there might be other
|
quoting and escaping). In addition to them, there might be other
|
||||||
special characters depending on the specific syntax where the escaping
|
special characters depending on the specific syntax where the escaping
|
||||||
and quoting are employed.
|
and quoting are employed.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
A special character is escaped by prefixing it with a @samp{\}.
|
A special character is escaped by prefixing it with a '\'.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
All characters enclosed between @samp{''} are included literally in the
|
All characters enclosed between '' are included literally in the
|
||||||
parsed string. The quote character @samp{'} itself cannot be quoted,
|
parsed string. The quote character @code{'} itself cannot be quoted,
|
||||||
so you may need to close the quote and escape it.
|
so you may need to close the quote and escape it.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
@@ -71,7 +71,7 @@ Escaping and quoting can be mixed together:
|
|||||||
@end example
|
@end example
|
||||||
|
|
||||||
@item
|
@item
|
||||||
To include a literal @samp{\} you can use either escaping or quoting:
|
To include a literal @code{\} you can use either escaping or quoting:
|
||||||
@example
|
@example
|
||||||
'c:\foo' can be written as c:\\foo
|
'c:\foo' can be written as c:\\foo
|
||||||
@end example
|
@end example
|
||||||
@@ -238,14 +238,6 @@ The following abbreviations are recognized:
|
|||||||
480x320
|
480x320
|
||||||
@item qhd
|
@item qhd
|
||||||
960x540
|
960x540
|
||||||
@item 2kdci
|
|
||||||
2048x1080
|
|
||||||
@item 4kdci
|
|
||||||
4096x2160
|
|
||||||
@item uhd2160
|
|
||||||
3840x2160
|
|
||||||
@item uhd4320
|
|
||||||
7680x4320
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@anchor{video rate syntax}
|
@anchor{video rate syntax}
|
||||||
@@ -852,7 +844,7 @@ Return 1.0 if @var{x} is +/-INFINITY, 0.0 otherwise.
|
|||||||
Return 1.0 if @var{x} is NAN, 0.0 otherwise.
|
Return 1.0 if @var{x} is NAN, 0.0 otherwise.
|
||||||
|
|
||||||
@item ld(var)
|
@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}).
|
@var{var}, which was previously stored with st(@var{var}, @var{expr}).
|
||||||
The function returns the loaded value.
|
The function returns the loaded value.
|
||||||
|
|
||||||
@@ -869,7 +861,7 @@ Return 1 if @var{x} is lesser than or equal to @var{y}, 0 otherwise.
|
|||||||
Return the maximum between @var{x} and @var{y}.
|
Return the maximum between @var{x} and @var{y}.
|
||||||
|
|
||||||
@item min(x, y)
|
@item min(x, y)
|
||||||
Return the minimum between @var{x} and @var{y}.
|
Return the maximum between @var{x} and @var{y}.
|
||||||
|
|
||||||
@item mod(x, y)
|
@item mod(x, y)
|
||||||
Compute the remainder of division of @var{x} by @var{y}.
|
Compute the remainder of division of @var{x} by @var{y}.
|
||||||
@@ -920,7 +912,7 @@ Compute the square root of @var{expr}. This is equivalent to
|
|||||||
Compute expression @code{1/(1 + exp(4*x))}.
|
Compute expression @code{1/(1 + exp(4*x))}.
|
||||||
|
|
||||||
@item st(var, expr)
|
@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
|
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
|
store the value, and it is a value ranging from 0 to 9. The function
|
||||||
returns the value stored in the internal variable.
|
returns the value stored in the internal variable.
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ libavfilter.
|
|||||||
|
|
||||||
Foreword: just like everything else in FFmpeg, libavfilter is monolithic, which
|
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
|
means that it is highly recommended that you submit your filters to the FFmpeg
|
||||||
development mailing-list and make sure that they are applied. Otherwise, your filters
|
development mailing-list and make sure it is applied. Otherwise, your filter is
|
||||||
are likely to have a very short lifetime due to more or less regular internal API
|
likely to have a very short lifetime due to more a less regular internal API
|
||||||
changes, and a limited distribution, review, and testing.
|
changes, and a limited distribution, review, and testing.
|
||||||
|
|
||||||
Bootstrap
|
Bootstrap
|
||||||
@@ -64,7 +64,7 @@ filter, so you can update the boilerplate with your credits.
|
|||||||
Doxy
|
Doxy
|
||||||
----
|
----
|
||||||
|
|
||||||
Next chunk is the Doxygen about the file. See https://ffmpeg.org/doxygen/trunk/.
|
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
|
Detail here what the filter is, does, and add some references if you feel like
|
||||||
it.
|
it.
|
||||||
|
|
||||||
@@ -73,11 +73,11 @@ Context
|
|||||||
|
|
||||||
Skip the headers and scroll down to the definition of FoobarContext. This is
|
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
|
your local state context. It is already filled with 0 when you get it so do not
|
||||||
worry about uninitialized reads into this context. This is where you put all
|
worry about uninitialized read into this context. This is where you put every
|
||||||
"global" information that you need; typically the variables storing the user options.
|
"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
|
You'll notice the first field "const AVClass *class"; it's the only field you
|
||||||
need to keep assuming you have a context. There is some magic you don't need to
|
need to keep assuming you have a context. There are some magic you don't care
|
||||||
care about around this field, just let it be (in the first position) for now.
|
about around this field, just let it be (in first position) for now.
|
||||||
|
|
||||||
Options
|
Options
|
||||||
-------
|
-------
|
||||||
@@ -87,7 +87,7 @@ options. For example, -vf foobar=mode=colormix:high=0.4:low=0.1. Most options
|
|||||||
have the following pattern:
|
have the following pattern:
|
||||||
name, description, offset, type, default value, minimum value, maximum value, flags
|
name, description, offset, type, default value, minimum value, maximum value, flags
|
||||||
|
|
||||||
- name is the option name, keep it simple and lowercase
|
- name is the option name, keep it simple, lowercase
|
||||||
- description are short, in lowercase, without period, and describe what they
|
- description are short, in lowercase, without period, and describe what they
|
||||||
do, for example "set the foo of the bar"
|
do, for example "set the foo of the bar"
|
||||||
- offset is the offset of the field in your local context, see the OFFSET()
|
- offset is the offset of the field in your local context, see the OFFSET()
|
||||||
@@ -99,7 +99,7 @@ have the following pattern:
|
|||||||
- min and max values define the range of available values, inclusive
|
- min and max values define the range of available values, inclusive
|
||||||
- flags are AVOption generic flags. See AV_OPT_FLAG_* definitions
|
- flags are AVOption generic flags. See AV_OPT_FLAG_* definitions
|
||||||
|
|
||||||
When in doubt, just look at the other AVOption definitions all around the codebase,
|
In doubt, just look at the other AVOption definitions all around the codebase,
|
||||||
there are tons of examples.
|
there are tons of examples.
|
||||||
|
|
||||||
Class
|
Class
|
||||||
@@ -146,14 +146,14 @@ we won't cover this here since vf_foobar is just a simple 1:1 filter.
|
|||||||
uninit()
|
uninit()
|
||||||
~~~~~~~~
|
~~~~~~~~
|
||||||
|
|
||||||
Similarly, there is the uninit() callback, doing what the name suggests. Free
|
Similarly, there is the uninit() callback, doing what the name suggest. Free
|
||||||
everything you allocated here.
|
everything you allocated here.
|
||||||
|
|
||||||
query_formats()
|
query_formats()
|
||||||
~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
This follows the init() and is used for the format negotiation. Basically
|
This is following the init() and is used for the format negotiation, basically
|
||||||
you specify here what pixel format(s) (gray, rgb 32, yuv 4:2:0, ...) you accept
|
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
|
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
|
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
|
the output, you just have to define a pixel formats array and call
|
||||||
@@ -182,7 +182,7 @@ will update outlink->w and outlink->h.
|
|||||||
filter_frame()
|
filter_frame()
|
||||||
~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
This is the callback you are waiting for from the beginning: it is where you
|
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
|
process the received frames. Along with the frame, you get the input link from
|
||||||
where the frame comes from.
|
where the frame comes from.
|
||||||
|
|
||||||
@@ -317,7 +317,7 @@ Adding timeline support
|
|||||||
feature to add. In the most simple case, you just have to add
|
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
|
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
|
do this when your filter does not need to save the previous context frames, or
|
||||||
basically if your filter just alters whatever goes in and doesn't need
|
basically if your filter just alter whatever goes in and doesn't need
|
||||||
previous/future information. See for instance commit 86cb986ce that adds
|
previous/future information. See for instance commit 86cb986ce that adds
|
||||||
timeline support to the fieldorder filter.
|
timeline support to the fieldorder filter.
|
||||||
|
|
||||||
|
|||||||
61
ffmpeg.h
61
ffmpeg.h
@@ -63,10 +63,6 @@ enum HWAccelID {
|
|||||||
HWACCEL_VDPAU,
|
HWACCEL_VDPAU,
|
||||||
HWACCEL_DXVA2,
|
HWACCEL_DXVA2,
|
||||||
HWACCEL_VDA,
|
HWACCEL_VDA,
|
||||||
HWACCEL_VIDEOTOOLBOX,
|
|
||||||
HWACCEL_QSV,
|
|
||||||
HWACCEL_VAAPI,
|
|
||||||
HWACCEL_CUVID,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct HWAccel {
|
typedef struct HWAccel {
|
||||||
@@ -96,8 +92,6 @@ typedef struct OptionsContext {
|
|||||||
|
|
||||||
/* input/output options */
|
/* input/output options */
|
||||||
int64_t start_time;
|
int64_t start_time;
|
||||||
int64_t start_time_eof;
|
|
||||||
int seek_timestamp;
|
|
||||||
const char *format;
|
const char *format;
|
||||||
|
|
||||||
SpecifierOpt *codec_names;
|
SpecifierOpt *codec_names;
|
||||||
@@ -115,7 +109,6 @@ typedef struct OptionsContext {
|
|||||||
|
|
||||||
/* input options */
|
/* input options */
|
||||||
int64_t input_ts_offset;
|
int64_t input_ts_offset;
|
||||||
int loop;
|
|
||||||
int rate_emu;
|
int rate_emu;
|
||||||
int accurate_seek;
|
int accurate_seek;
|
||||||
int thread_queue_size;
|
int thread_queue_size;
|
||||||
@@ -128,10 +121,6 @@ typedef struct OptionsContext {
|
|||||||
int nb_hwaccels;
|
int nb_hwaccels;
|
||||||
SpecifierOpt *hwaccel_devices;
|
SpecifierOpt *hwaccel_devices;
|
||||||
int nb_hwaccel_devices;
|
int nb_hwaccel_devices;
|
||||||
SpecifierOpt *hwaccel_output_formats;
|
|
||||||
int nb_hwaccel_output_formats;
|
|
||||||
SpecifierOpt *autorotate;
|
|
||||||
int nb_autorotate;
|
|
||||||
|
|
||||||
/* output options */
|
/* output options */
|
||||||
StreamMap *stream_maps;
|
StreamMap *stream_maps;
|
||||||
@@ -220,8 +209,6 @@ typedef struct OptionsContext {
|
|||||||
int nb_discard;
|
int nb_discard;
|
||||||
SpecifierOpt *disposition;
|
SpecifierOpt *disposition;
|
||||||
int nb_disposition;
|
int nb_disposition;
|
||||||
SpecifierOpt *program;
|
|
||||||
int nb_program;
|
|
||||||
} OptionsContext;
|
} OptionsContext;
|
||||||
|
|
||||||
typedef struct InputFilter {
|
typedef struct InputFilter {
|
||||||
@@ -239,7 +226,6 @@ typedef struct OutputFilter {
|
|||||||
|
|
||||||
/* temporary storage until stream maps are processed */
|
/* temporary storage until stream maps are processed */
|
||||||
AVFilterInOut *out_tmp;
|
AVFilterInOut *out_tmp;
|
||||||
enum AVMediaType type;
|
|
||||||
} OutputFilter;
|
} OutputFilter;
|
||||||
|
|
||||||
typedef struct FilterGraph {
|
typedef struct FilterGraph {
|
||||||
@@ -281,10 +267,6 @@ typedef struct InputStream {
|
|||||||
|
|
||||||
int64_t filter_in_rescale_delta_last;
|
int64_t filter_in_rescale_delta_last;
|
||||||
|
|
||||||
int64_t min_pts; /* pts with the smallest value in a current stream */
|
|
||||||
int64_t max_pts; /* pts with the higher value in a current stream */
|
|
||||||
int64_t nb_samples; /* number of samples in the last decoded audio frame before looping */
|
|
||||||
|
|
||||||
double ts_scale;
|
double ts_scale;
|
||||||
int saw_first_ts;
|
int saw_first_ts;
|
||||||
int showed_multi_packet_warning;
|
int showed_multi_packet_warning;
|
||||||
@@ -293,7 +275,6 @@ typedef struct InputStream {
|
|||||||
int top_field_first;
|
int top_field_first;
|
||||||
int guess_layout_max;
|
int guess_layout_max;
|
||||||
|
|
||||||
int autorotate;
|
|
||||||
int resample_height;
|
int resample_height;
|
||||||
int resample_width;
|
int resample_width;
|
||||||
int resample_pix_fmt;
|
int resample_pix_fmt;
|
||||||
@@ -329,7 +310,6 @@ typedef struct InputStream {
|
|||||||
/* hwaccel options */
|
/* hwaccel options */
|
||||||
enum HWAccelID hwaccel_id;
|
enum HWAccelID hwaccel_id;
|
||||||
char *hwaccel_device;
|
char *hwaccel_device;
|
||||||
enum AVPixelFormat hwaccel_output_format;
|
|
||||||
|
|
||||||
/* hwaccel context */
|
/* hwaccel context */
|
||||||
enum HWAccelID active_hwaccel_id;
|
enum HWAccelID active_hwaccel_id;
|
||||||
@@ -339,7 +319,6 @@ typedef struct InputStream {
|
|||||||
int (*hwaccel_retrieve_data)(AVCodecContext *s, AVFrame *frame);
|
int (*hwaccel_retrieve_data)(AVCodecContext *s, AVFrame *frame);
|
||||||
enum AVPixelFormat hwaccel_pix_fmt;
|
enum AVPixelFormat hwaccel_pix_fmt;
|
||||||
enum AVPixelFormat hwaccel_retrieved_pix_fmt;
|
enum AVPixelFormat hwaccel_retrieved_pix_fmt;
|
||||||
AVBufferRef *hw_frames_ctx;
|
|
||||||
|
|
||||||
/* stats */
|
/* stats */
|
||||||
// combined size of all the packets read
|
// combined size of all the packets read
|
||||||
@@ -356,16 +335,10 @@ typedef struct InputFile {
|
|||||||
int eof_reached; /* true if eof reached */
|
int eof_reached; /* true if eof reached */
|
||||||
int eagain; /* true if last read attempt returned EAGAIN */
|
int eagain; /* true if last read attempt returned EAGAIN */
|
||||||
int ist_index; /* index of first stream in input_streams */
|
int ist_index; /* index of first stream in input_streams */
|
||||||
int loop; /* set number of times input stream should be looped */
|
|
||||||
int64_t duration; /* actual duration of the longest stream in a file
|
|
||||||
at the moment when looping happens */
|
|
||||||
AVRational time_base; /* time base of the duration */
|
|
||||||
int64_t input_ts_offset;
|
int64_t input_ts_offset;
|
||||||
|
|
||||||
int64_t ts_offset;
|
int64_t ts_offset;
|
||||||
int64_t last_ts;
|
int64_t last_ts;
|
||||||
int64_t start_time; /* user-specified start time in AV_TIME_BASE or AV_NOPTS_VALUE */
|
int64_t start_time; /* user-specified start time in AV_TIME_BASE or AV_NOPTS_VALUE */
|
||||||
int seek_timestamp;
|
|
||||||
int64_t recording_time;
|
int64_t recording_time;
|
||||||
int nb_streams; /* number of stream that ffmpeg is aware of; may be different
|
int nb_streams; /* number of stream that ffmpeg is aware of; may be different
|
||||||
from ctx.nb_streams if new streams appear during av_read_frame() */
|
from ctx.nb_streams if new streams appear during av_read_frame() */
|
||||||
@@ -391,8 +364,6 @@ enum forced_keyframes_const {
|
|||||||
FKF_NB
|
FKF_NB
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ABORT_ON_FLAG_EMPTY_OUTPUT (1 << 0)
|
|
||||||
|
|
||||||
extern const char *const forced_keyframes_const_names[];
|
extern const char *const forced_keyframes_const_names[];
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -422,17 +393,12 @@ typedef struct OutputStream {
|
|||||||
int64_t max_frames;
|
int64_t max_frames;
|
||||||
AVFrame *filtered_frame;
|
AVFrame *filtered_frame;
|
||||||
AVFrame *last_frame;
|
AVFrame *last_frame;
|
||||||
int last_dropped;
|
int last_droped;
|
||||||
int last_nb0_frames[3];
|
|
||||||
|
|
||||||
void *hwaccel_ctx;
|
|
||||||
|
|
||||||
/* video only */
|
/* video only */
|
||||||
AVRational frame_rate;
|
AVRational frame_rate;
|
||||||
int is_cfr;
|
|
||||||
int force_fps;
|
int force_fps;
|
||||||
int top_field_first;
|
int top_field_first;
|
||||||
int rotate_overridden;
|
|
||||||
|
|
||||||
AVRational frame_aspect_ratio;
|
AVRational frame_aspect_ratio;
|
||||||
|
|
||||||
@@ -456,10 +422,11 @@ typedef struct OutputStream {
|
|||||||
char *filters; ///< filtergraph associated to the -filter option
|
char *filters; ///< filtergraph associated to the -filter option
|
||||||
char *filters_script; ///< filtergraph script associated to the -filter_script option
|
char *filters_script; ///< filtergraph script associated to the -filter_script option
|
||||||
|
|
||||||
|
int64_t sws_flags;
|
||||||
AVDictionary *encoder_opts;
|
AVDictionary *encoder_opts;
|
||||||
AVDictionary *sws_dict;
|
|
||||||
AVDictionary *swr_opts;
|
AVDictionary *swr_opts;
|
||||||
AVDictionary *resample_opts;
|
AVDictionary *resample_opts;
|
||||||
|
AVDictionary *bsf_args;
|
||||||
char *apad;
|
char *apad;
|
||||||
OSTFinished finished; /* no more packets should be written for this stream */
|
OSTFinished finished; /* no more packets should be written for this stream */
|
||||||
int unavailable; /* true if the steram is unavailable (possibly temporarily) */
|
int unavailable; /* true if the steram is unavailable (possibly temporarily) */
|
||||||
@@ -481,15 +448,6 @@ typedef struct OutputStream {
|
|||||||
// number of frames/samples sent to the encoder
|
// number of frames/samples sent to the encoder
|
||||||
uint64_t frames_encoded;
|
uint64_t frames_encoded;
|
||||||
uint64_t samples_encoded;
|
uint64_t samples_encoded;
|
||||||
|
|
||||||
/* packet quality factor */
|
|
||||||
int quality;
|
|
||||||
|
|
||||||
/* packet picture type */
|
|
||||||
int pict_type;
|
|
||||||
|
|
||||||
/* frame encode sum of squared error values */
|
|
||||||
int64_t error[4];
|
|
||||||
} OutputStream;
|
} OutputStream;
|
||||||
|
|
||||||
typedef struct OutputFile {
|
typedef struct OutputFile {
|
||||||
@@ -537,21 +495,18 @@ extern int start_at_zero;
|
|||||||
extern int copy_tb;
|
extern int copy_tb;
|
||||||
extern int debug_ts;
|
extern int debug_ts;
|
||||||
extern int exit_on_error;
|
extern int exit_on_error;
|
||||||
extern int abort_on_flags;
|
|
||||||
extern int print_stats;
|
extern int print_stats;
|
||||||
extern int qp_hist;
|
extern int qp_hist;
|
||||||
extern int stdin_interaction;
|
extern int stdin_interaction;
|
||||||
extern int frame_bits_per_raw_sample;
|
extern int frame_bits_per_raw_sample;
|
||||||
extern AVIOContext *progress_avio;
|
extern AVIOContext *progress_avio;
|
||||||
extern float max_error_rate;
|
extern float max_error_rate;
|
||||||
extern char *videotoolbox_pixfmt;
|
extern int vdpau_api_ver;
|
||||||
|
|
||||||
extern const AVIOInterruptCB int_cb;
|
extern const AVIOInterruptCB int_cb;
|
||||||
|
|
||||||
extern const OptionDef options[];
|
extern const OptionDef options[];
|
||||||
extern const HWAccel hwaccels[];
|
extern const HWAccel hwaccels[];
|
||||||
extern int hwaccel_lax_profile_check;
|
|
||||||
extern AVBufferRef *hw_device_ctx;
|
|
||||||
|
|
||||||
|
|
||||||
void term_init(void);
|
void term_init(void);
|
||||||
@@ -574,19 +529,11 @@ int configure_filtergraph(FilterGraph *fg);
|
|||||||
int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out);
|
int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out);
|
||||||
int ist_in_filtergraph(FilterGraph *fg, InputStream *ist);
|
int ist_in_filtergraph(FilterGraph *fg, InputStream *ist);
|
||||||
FilterGraph *init_simple_filtergraph(InputStream *ist, OutputStream *ost);
|
FilterGraph *init_simple_filtergraph(InputStream *ist, OutputStream *ost);
|
||||||
int init_complex_filtergraph(FilterGraph *fg);
|
|
||||||
|
|
||||||
int ffmpeg_parse_options(int argc, char **argv);
|
int ffmpeg_parse_options(int argc, char **argv);
|
||||||
|
|
||||||
int vdpau_init(AVCodecContext *s);
|
int vdpau_init(AVCodecContext *s);
|
||||||
int dxva2_init(AVCodecContext *s);
|
int dxva2_init(AVCodecContext *s);
|
||||||
int vda_init(AVCodecContext *s);
|
int vda_init(AVCodecContext *s);
|
||||||
int videotoolbox_init(AVCodecContext *s);
|
|
||||||
int qsv_init(AVCodecContext *s);
|
|
||||||
int qsv_transcode_init(OutputStream *ost);
|
|
||||||
int vaapi_decode_init(AVCodecContext *avctx);
|
|
||||||
int vaapi_device_init(const char *device);
|
|
||||||
int cuvid_init(AVCodecContext *s);
|
|
||||||
int cuvid_transcode_init(OutputStream *ost);
|
|
||||||
|
|
||||||
#endif /* FFMPEG_H */
|
#endif /* FFMPEG_H */
|
||||||
|
|||||||
237
ffmpeg_cuvid.c
237
ffmpeg_cuvid.c
@@ -1,237 +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 "libavutil/hwcontext.h"
|
|
||||||
#include "libavutil/hwcontext_cuda.h"
|
|
||||||
|
|
||||||
#include "ffmpeg.h"
|
|
||||||
|
|
||||||
#include <cuda.h>
|
|
||||||
#include <nvcuvid.h>
|
|
||||||
|
|
||||||
typedef struct CUVIDContext {
|
|
||||||
AVBufferRef *hw_frames_ctx;
|
|
||||||
} CUVIDContext;
|
|
||||||
|
|
||||||
static void cuvid_uninit(AVCodecContext *avctx)
|
|
||||||
{
|
|
||||||
InputStream *ist = avctx->opaque;
|
|
||||||
CUVIDContext *ctx = ist->hwaccel_ctx;
|
|
||||||
|
|
||||||
if (ctx) {
|
|
||||||
av_buffer_unref(&ctx->hw_frames_ctx);
|
|
||||||
av_freep(&ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
av_buffer_unref(&ist->hw_frames_ctx);
|
|
||||||
|
|
||||||
ist->hwaccel_ctx = 0;
|
|
||||||
ist->hwaccel_uninit = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cuvid_init(AVCodecContext *avctx)
|
|
||||||
{
|
|
||||||
InputStream *ist = avctx->opaque;
|
|
||||||
CUVIDContext *ctx = ist->hwaccel_ctx;
|
|
||||||
|
|
||||||
av_log(NULL, AV_LOG_TRACE, "Initializing cuvid hwaccel\n");
|
|
||||||
|
|
||||||
if (!ctx) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "CUVID transcoding is not initialized. "
|
|
||||||
"-hwaccel cuvid should only be used for one-to-one CUVID transcoding "
|
|
||||||
"with no (software) filters.\n");
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cuvid_ctx_free(AVHWDeviceContext *ctx)
|
|
||||||
{
|
|
||||||
AVCUDADeviceContext *hwctx = ctx->hwctx;
|
|
||||||
cuCtxDestroy(hwctx->cuda_ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cuvid_transcode_init(OutputStream *ost)
|
|
||||||
{
|
|
||||||
InputStream *ist;
|
|
||||||
const enum AVPixelFormat *pix_fmt;
|
|
||||||
AVCUDADeviceContext *device_hwctx;
|
|
||||||
AVHWDeviceContext *device_ctx;
|
|
||||||
AVHWFramesContext *hwframe_ctx;
|
|
||||||
CUVIDContext *ctx = NULL;
|
|
||||||
CUdevice device;
|
|
||||||
CUcontext cuda_ctx = NULL;
|
|
||||||
CUcontext dummy;
|
|
||||||
CUresult err;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
av_log(NULL, AV_LOG_TRACE, "Initializing cuvid transcoding\n");
|
|
||||||
|
|
||||||
if (ost->source_index < 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
ist = input_streams[ost->source_index];
|
|
||||||
|
|
||||||
/* check if the encoder supports CUVID */
|
|
||||||
if (!ost->enc->pix_fmts)
|
|
||||||
goto cancel;
|
|
||||||
for (pix_fmt = ost->enc->pix_fmts; *pix_fmt != AV_PIX_FMT_NONE; pix_fmt++)
|
|
||||||
if (*pix_fmt == AV_PIX_FMT_CUDA)
|
|
||||||
break;
|
|
||||||
if (*pix_fmt == AV_PIX_FMT_NONE)
|
|
||||||
goto cancel;
|
|
||||||
|
|
||||||
/* check if the decoder supports CUVID */
|
|
||||||
if (ist->hwaccel_id != HWACCEL_CUVID || !ist->dec || !ist->dec->pix_fmts)
|
|
||||||
goto cancel;
|
|
||||||
for (pix_fmt = ist->dec->pix_fmts; *pix_fmt != AV_PIX_FMT_NONE; pix_fmt++)
|
|
||||||
if (*pix_fmt == AV_PIX_FMT_CUDA)
|
|
||||||
break;
|
|
||||||
if (*pix_fmt == AV_PIX_FMT_NONE)
|
|
||||||
goto cancel;
|
|
||||||
|
|
||||||
av_log(NULL, AV_LOG_VERBOSE, "Setting up CUVID transcoding\n");
|
|
||||||
|
|
||||||
if (ist->hwaccel_ctx) {
|
|
||||||
ctx = ist->hwaccel_ctx;
|
|
||||||
} else {
|
|
||||||
ctx = av_mallocz(sizeof(*ctx));
|
|
||||||
if (!ctx) {
|
|
||||||
ret = AVERROR(ENOMEM);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hw_device_ctx) {
|
|
||||||
hw_device_ctx = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_CUDA);
|
|
||||||
if (!hw_device_ctx) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_CUDA) failed\n");
|
|
||||||
ret = AVERROR(ENOMEM);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = cuInit(0);
|
|
||||||
if (err != CUDA_SUCCESS) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Could not initialize the CUDA driver API\n");
|
|
||||||
ret = AVERROR_UNKNOWN;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = cuDeviceGet(&device, 0); ///TODO: Make device index configurable
|
|
||||||
if (err != CUDA_SUCCESS) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Could not get the device number %d\n", 0);
|
|
||||||
ret = AVERROR_UNKNOWN;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = cuCtxCreate(&cuda_ctx, CU_CTX_SCHED_BLOCKING_SYNC, device);
|
|
||||||
if (err != CUDA_SUCCESS) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Error creating a CUDA context\n");
|
|
||||||
ret = AVERROR_UNKNOWN;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
device_ctx = (AVHWDeviceContext*)hw_device_ctx->data;
|
|
||||||
device_ctx->free = cuvid_ctx_free;
|
|
||||||
|
|
||||||
device_hwctx = device_ctx->hwctx;
|
|
||||||
device_hwctx->cuda_ctx = cuda_ctx;
|
|
||||||
|
|
||||||
err = cuCtxPopCurrent(&dummy);
|
|
||||||
if (err != CUDA_SUCCESS) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "cuCtxPopCurrent failed\n");
|
|
||||||
ret = AVERROR_UNKNOWN;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = av_hwdevice_ctx_init(hw_device_ctx);
|
|
||||||
if (ret < 0) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "av_hwdevice_ctx_init failed\n");
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
device_ctx = (AVHWDeviceContext*)hw_device_ctx->data;
|
|
||||||
device_hwctx = device_ctx->hwctx;
|
|
||||||
cuda_ctx = device_hwctx->cuda_ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (device_ctx->type != AV_HWDEVICE_TYPE_CUDA) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Hardware device context is already initialized for a diffrent hwaccel.\n");
|
|
||||||
ret = AVERROR(EINVAL);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ctx->hw_frames_ctx) {
|
|
||||||
ctx->hw_frames_ctx = av_hwframe_ctx_alloc(hw_device_ctx);
|
|
||||||
if (!ctx->hw_frames_ctx) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "av_hwframe_ctx_alloc failed\n");
|
|
||||||
ret = AVERROR(ENOMEM);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This is a bit hacky, av_hwframe_ctx_init is called by the cuvid decoder
|
|
||||||
* once it has probed the neccesary format information. But as filters/nvenc
|
|
||||||
* need to know the format/sw_format, set them here so they are happy.
|
|
||||||
* This is fine as long as CUVID doesn't add another supported pix_fmt.
|
|
||||||
*/
|
|
||||||
hwframe_ctx = (AVHWFramesContext*)ctx->hw_frames_ctx->data;
|
|
||||||
hwframe_ctx->format = AV_PIX_FMT_CUDA;
|
|
||||||
hwframe_ctx->sw_format = AV_PIX_FMT_NV12;
|
|
||||||
|
|
||||||
ost->hwaccel_ctx = ctx;
|
|
||||||
ost->enc_ctx->hw_frames_ctx = av_buffer_ref(ctx->hw_frames_ctx);
|
|
||||||
ost->enc_ctx->pix_fmt = AV_PIX_FMT_CUDA;
|
|
||||||
|
|
||||||
if (!ost->enc_ctx->hw_frames_ctx) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "av_buffer_ref failed\n");
|
|
||||||
ret = AVERROR(ENOMEM);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ist->hwaccel_ctx) {
|
|
||||||
ist->hwaccel_ctx = ctx;
|
|
||||||
ist->hw_frames_ctx = av_buffer_ref(ctx->hw_frames_ctx);
|
|
||||||
ist->dec_ctx->hw_frames_ctx = av_buffer_ref(ctx->hw_frames_ctx);
|
|
||||||
ist->dec_ctx->pix_fmt = AV_PIX_FMT_CUDA;
|
|
||||||
ist->resample_pix_fmt = AV_PIX_FMT_CUDA;
|
|
||||||
|
|
||||||
ist->hwaccel_uninit = cuvid_uninit;
|
|
||||||
|
|
||||||
if (!ist->hw_frames_ctx || !ist->dec_ctx->hw_frames_ctx) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "av_buffer_ref failed\n");
|
|
||||||
ret = AVERROR(ENOMEM);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
error:
|
|
||||||
av_freep(&ctx);
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
cancel:
|
|
||||||
if (ist->hwaccel_id == HWACCEL_CUVID) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "CUVID hwaccel requested, but impossible to achive.\n");
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
344
ffmpeg_dxva2.c
344
ffmpeg_dxva2.c
@@ -40,9 +40,6 @@
|
|||||||
#include "libavutil/imgutils.h"
|
#include "libavutil/imgutils.h"
|
||||||
#include "libavutil/pixfmt.h"
|
#include "libavutil/pixfmt.h"
|
||||||
|
|
||||||
#include "libavutil/hwcontext.h"
|
|
||||||
#include "libavutil/hwcontext_dxva2.h"
|
|
||||||
|
|
||||||
/* define all the GUIDs used directly here,
|
/* define all the GUIDs used directly here,
|
||||||
to avoid problems with inconsistent dxva2api.h versions in mingw-w64 and different MSVC version */
|
to avoid problems with inconsistent dxva2api.h versions in mingw-w64 and different MSVC version */
|
||||||
#include <initguid.h>
|
#include <initguid.h>
|
||||||
@@ -56,11 +53,12 @@ DEFINE_GUID(DXVADDI_Intel_ModeH264_E, 0x604F8E68, 0x4951,0x4C54,0x88,0xFE,0xAB,0
|
|||||||
DEFINE_GUID(DXVA2_ModeVC1_D, 0x1b81beA3, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
|
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_ModeVC1_D2010, 0x1b81beA4, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
|
||||||
DEFINE_GUID(DXVA2_ModeHEVC_VLD_Main, 0x5b11d51b, 0x2f4c,0x4452,0xbc,0xc3,0x09,0xf2,0xa1,0x16,0x0c,0xc0);
|
DEFINE_GUID(DXVA2_ModeHEVC_VLD_Main, 0x5b11d51b, 0x2f4c,0x4452,0xbc,0xc3,0x09,0xf2,0xa1,0x16,0x0c,0xc0);
|
||||||
DEFINE_GUID(DXVA2_ModeHEVC_VLD_Main10,0x107af0e0, 0xef1a,0x4d19,0xab,0xa8,0x67,0xa1,0x63,0x07,0x3d,0x13);
|
|
||||||
DEFINE_GUID(DXVA2_ModeVP9_VLD_Profile0, 0x463707f8, 0xa1d0,0x4585,0x87,0x6d,0x83,0xaa,0x6d,0x60,0xb8,0x9e);
|
|
||||||
DEFINE_GUID(DXVA2_NoEncrypt, 0x1b81beD0, 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);
|
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 {
|
typedef struct dxva2_mode {
|
||||||
const GUID *guid;
|
const GUID *guid;
|
||||||
enum AVCodecID codec;
|
enum AVCodecID codec;
|
||||||
@@ -85,27 +83,67 @@ static const dxva2_mode dxva2_modes[] = {
|
|||||||
|
|
||||||
/* HEVC/H.265 */
|
/* HEVC/H.265 */
|
||||||
{ &DXVA2_ModeHEVC_VLD_Main, AV_CODEC_ID_HEVC },
|
{ &DXVA2_ModeHEVC_VLD_Main, AV_CODEC_ID_HEVC },
|
||||||
{ &DXVA2_ModeHEVC_VLD_Main10,AV_CODEC_ID_HEVC },
|
|
||||||
|
|
||||||
/* VP8/9 */
|
|
||||||
{ &DXVA2_ModeVP9_VLD_Profile0, AV_CODEC_ID_VP9 },
|
|
||||||
|
|
||||||
{ NULL, 0 },
|
{ NULL, 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct surface_info {
|
||||||
|
int used;
|
||||||
|
uint64_t age;
|
||||||
|
} surface_info;
|
||||||
|
|
||||||
typedef struct DXVA2Context {
|
typedef struct DXVA2Context {
|
||||||
|
HMODULE d3dlib;
|
||||||
|
HMODULE dxva2lib;
|
||||||
|
|
||||||
|
HANDLE deviceHandle;
|
||||||
|
|
||||||
|
IDirect3D9 *d3d9;
|
||||||
|
IDirect3DDevice9 *d3d9device;
|
||||||
|
IDirect3DDeviceManager9 *d3d9devmgr;
|
||||||
|
IDirectXVideoDecoderService *decoder_service;
|
||||||
IDirectXVideoDecoder *decoder;
|
IDirectXVideoDecoder *decoder;
|
||||||
|
|
||||||
GUID decoder_guid;
|
GUID decoder_guid;
|
||||||
DXVA2_ConfigPictureDecode decoder_config;
|
DXVA2_ConfigPictureDecode decoder_config;
|
||||||
IDirectXVideoDecoderService *decoder_service;
|
|
||||||
|
LPDIRECT3DSURFACE9 *surfaces;
|
||||||
|
surface_info *surface_infos;
|
||||||
|
uint32_t num_surfaces;
|
||||||
|
uint64_t surface_age;
|
||||||
|
|
||||||
AVFrame *tmp_frame;
|
AVFrame *tmp_frame;
|
||||||
|
|
||||||
AVBufferRef *hw_device_ctx;
|
|
||||||
AVBufferRef *hw_frames_ctx;
|
|
||||||
} DXVA2Context;
|
} 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)
|
static void dxva2_uninit(AVCodecContext *s)
|
||||||
{
|
{
|
||||||
InputStream *ist = s->opaque;
|
InputStream *ist = s->opaque;
|
||||||
@@ -115,11 +153,29 @@ static void dxva2_uninit(AVCodecContext *s)
|
|||||||
ist->hwaccel_get_buffer = NULL;
|
ist->hwaccel_get_buffer = NULL;
|
||||||
ist->hwaccel_retrieve_data = NULL;
|
ist->hwaccel_retrieve_data = NULL;
|
||||||
|
|
||||||
|
if (ctx->decoder)
|
||||||
|
dxva2_destroy_decoder(s);
|
||||||
|
|
||||||
if (ctx->decoder_service)
|
if (ctx->decoder_service)
|
||||||
IDirectXVideoDecoderService_Release(ctx->decoder_service);
|
IDirectXVideoDecoderService_Release(ctx->decoder_service);
|
||||||
|
|
||||||
av_buffer_unref(&ctx->hw_frames_ctx);
|
if (ctx->d3d9devmgr && ctx->deviceHandle != INVALID_HANDLE_VALUE)
|
||||||
av_buffer_unref(&ctx->hw_device_ctx);
|
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_frame_free(&ctx->tmp_frame);
|
||||||
|
|
||||||
@@ -127,34 +183,119 @@ static void dxva2_uninit(AVCodecContext *s)
|
|||||||
av_freep(&s->hwaccel_context);
|
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)
|
static int dxva2_get_buffer(AVCodecContext *s, AVFrame *frame, int flags)
|
||||||
{
|
{
|
||||||
InputStream *ist = s->opaque;
|
InputStream *ist = s->opaque;
|
||||||
DXVA2Context *ctx = ist->hwaccel_ctx;
|
DXVA2Context *ctx = ist->hwaccel_ctx;
|
||||||
|
int i, old_unused = -1;
|
||||||
|
LPDIRECT3DSURFACE9 surface;
|
||||||
|
DXVA2SurfaceWrapper *w = NULL;
|
||||||
|
|
||||||
return av_hwframe_get_buffer(ctx->hw_frames_ctx, frame, 0);
|
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)
|
static int dxva2_retrieve_data(AVCodecContext *s, AVFrame *frame)
|
||||||
{
|
{
|
||||||
|
LPDIRECT3DSURFACE9 surface = (LPDIRECT3DSURFACE9)frame->data[3];
|
||||||
InputStream *ist = s->opaque;
|
InputStream *ist = s->opaque;
|
||||||
DXVA2Context *ctx = ist->hwaccel_ctx;
|
DXVA2Context *ctx = ist->hwaccel_ctx;
|
||||||
|
D3DSURFACE_DESC surfaceDesc;
|
||||||
|
D3DLOCKED_RECT LockedRect;
|
||||||
|
HRESULT hr;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = av_hwframe_transfer_data(ctx->tmp_frame, frame, 0);
|
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)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = av_frame_copy_props(ctx->tmp_frame, frame);
|
hr = IDirect3DSurface9_LockRect(surface, &LockedRect, NULL, D3DLOCK_READONLY);
|
||||||
if (ret < 0) {
|
if (FAILED(hr)) {
|
||||||
av_frame_unref(ctx->tmp_frame);
|
av_log(NULL, AV_LOG_ERROR, "Unable to lock DXVA2 surface\n");
|
||||||
return ret;
|
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_unref(frame);
|
||||||
av_frame_move_ref(frame, ctx->tmp_frame);
|
av_frame_move_ref(frame, ctx->tmp_frame);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
fail:
|
||||||
|
av_frame_unref(ctx->tmp_frame);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dxva2_alloc(AVCodecContext *s)
|
static int dxva2_alloc(AVCodecContext *s)
|
||||||
@@ -162,40 +303,94 @@ static int dxva2_alloc(AVCodecContext *s)
|
|||||||
InputStream *ist = s->opaque;
|
InputStream *ist = s->opaque;
|
||||||
int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
|
int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
|
||||||
DXVA2Context *ctx;
|
DXVA2Context *ctx;
|
||||||
HANDLE device_handle;
|
pDirect3DCreate9 *createD3D = NULL;
|
||||||
|
pCreateDeviceManager9 *createDeviceManager = NULL;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
D3DPRESENT_PARAMETERS d3dpp = {0};
|
||||||
AVHWDeviceContext *device_ctx;
|
D3DDISPLAYMODE d3ddm;
|
||||||
AVDXVA2DeviceContext *device_hwctx;
|
unsigned resetToken = 0;
|
||||||
int ret;
|
UINT adapter = D3DADAPTER_DEFAULT;
|
||||||
|
|
||||||
ctx = av_mallocz(sizeof(*ctx));
|
ctx = av_mallocz(sizeof(*ctx));
|
||||||
if (!ctx)
|
if (!ctx)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
|
ctx->deviceHandle = INVALID_HANDLE_VALUE;
|
||||||
|
|
||||||
ist->hwaccel_ctx = ctx;
|
ist->hwaccel_ctx = ctx;
|
||||||
ist->hwaccel_uninit = dxva2_uninit;
|
ist->hwaccel_uninit = dxva2_uninit;
|
||||||
ist->hwaccel_get_buffer = dxva2_get_buffer;
|
ist->hwaccel_get_buffer = dxva2_get_buffer;
|
||||||
ist->hwaccel_retrieve_data = dxva2_retrieve_data;
|
ist->hwaccel_retrieve_data = dxva2_retrieve_data;
|
||||||
|
|
||||||
ret = av_hwdevice_ctx_create(&ctx->hw_device_ctx, AV_HWDEVICE_TYPE_DXVA2,
|
ctx->d3dlib = LoadLibrary("d3d9.dll");
|
||||||
ist->hwaccel_device, NULL, 0);
|
if (!ctx->d3dlib) {
|
||||||
if (ret < 0)
|
av_log(NULL, loglevel, "Failed to load D3D9 library\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
device_ctx = (AVHWDeviceContext*)ctx->hw_device_ctx->data;
|
}
|
||||||
device_hwctx = device_ctx->hwctx;
|
ctx->dxva2lib = LoadLibrary("dxva2.dll");
|
||||||
|
if (!ctx->dxva2lib) {
|
||||||
hr = IDirect3DDeviceManager9_OpenDeviceHandle(device_hwctx->devmgr,
|
av_log(NULL, loglevel, "Failed to load DXVA2 library\n");
|
||||||
&device_handle);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
av_log(NULL, loglevel, "Failed to open a device handle\n");
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = IDirect3DDeviceManager9_GetVideoService(device_hwctx->devmgr, device_handle,
|
createD3D = (pDirect3DCreate9 *)GetProcAddress(ctx->d3dlib, "Direct3DCreate9");
|
||||||
&IID_IDirectXVideoDecoderService,
|
if (!createD3D) {
|
||||||
(void **)&ctx->decoder_service);
|
av_log(NULL, loglevel, "Failed to locate Direct3DCreate9\n");
|
||||||
IDirect3DDeviceManager9_CloseDeviceHandle(device_hwctx->devmgr, device_handle);
|
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)) {
|
if (FAILED(hr)) {
|
||||||
av_log(NULL, loglevel, "Failed to create IDirectXVideoDecoderService\n");
|
av_log(NULL, loglevel, "Failed to create IDirectXVideoDecoderService\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
@@ -271,17 +466,13 @@ static int dxva2_create_decoder(AVCodecContext *s)
|
|||||||
GUID *guid_list = NULL;
|
GUID *guid_list = NULL;
|
||||||
unsigned guid_count = 0, i, j;
|
unsigned guid_count = 0, i, j;
|
||||||
GUID device_guid = GUID_NULL;
|
GUID device_guid = GUID_NULL;
|
||||||
const D3DFORMAT surface_format = (s->sw_pix_fmt == AV_PIX_FMT_YUV420P10) ? MKTAG('P','0','1','0') : MKTAG('N','V','1','2');
|
|
||||||
D3DFORMAT target_format = 0;
|
D3DFORMAT target_format = 0;
|
||||||
DXVA2_VideoDesc desc = { 0 };
|
DXVA2_VideoDesc desc = { 0 };
|
||||||
DXVA2_ConfigPictureDecode config;
|
DXVA2_ConfigPictureDecode config;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
int surface_alignment, num_surfaces;
|
int surface_alignment;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
AVDXVA2FramesContext *frames_hwctx;
|
|
||||||
AVHWFramesContext *frames_ctx;
|
|
||||||
|
|
||||||
hr = IDirectXVideoDecoderService_GetDecoderDeviceGuids(ctx->decoder_service, &guid_count, &guid_list);
|
hr = IDirectXVideoDecoderService_GetDecoderDeviceGuids(ctx->decoder_service, &guid_count, &guid_list);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
av_log(NULL, loglevel, "Failed to retrieve decoder device GUIDs\n");
|
av_log(NULL, loglevel, "Failed to retrieve decoder device GUIDs\n");
|
||||||
@@ -308,7 +499,7 @@ static int dxva2_create_decoder(AVCodecContext *s)
|
|||||||
}
|
}
|
||||||
for (j = 0; j < target_count; j++) {
|
for (j = 0; j < target_count; j++) {
|
||||||
const D3DFORMAT format = target_list[j];
|
const D3DFORMAT format = target_list[j];
|
||||||
if (format == surface_format) {
|
if (format == MKTAG('N','V','1','2')) {
|
||||||
target_format = format;
|
target_format = format;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -347,43 +538,41 @@ static int dxva2_create_decoder(AVCodecContext *s)
|
|||||||
surface_alignment = 16;
|
surface_alignment = 16;
|
||||||
|
|
||||||
/* 4 base work surfaces */
|
/* 4 base work surfaces */
|
||||||
num_surfaces = 4;
|
ctx->num_surfaces = 4;
|
||||||
|
|
||||||
/* add surfaces based on number of possible refs */
|
/* add surfaces based on number of possible refs */
|
||||||
if (s->codec_id == AV_CODEC_ID_H264 || s->codec_id == AV_CODEC_ID_HEVC)
|
if (s->codec_id == AV_CODEC_ID_H264 || s->codec_id == AV_CODEC_ID_HEVC)
|
||||||
num_surfaces += 16;
|
ctx->num_surfaces += 16;
|
||||||
else if (s->codec_id == AV_CODEC_ID_VP9)
|
|
||||||
num_surfaces += 8;
|
|
||||||
else
|
else
|
||||||
num_surfaces += 2;
|
ctx->num_surfaces += 2;
|
||||||
|
|
||||||
/* add extra surfaces for frame threading */
|
/* add extra surfaces for frame threading */
|
||||||
if (s->active_thread_type & FF_THREAD_FRAME)
|
if (s->active_thread_type & FF_THREAD_FRAME)
|
||||||
num_surfaces += s->thread_count;
|
ctx->num_surfaces += s->thread_count;
|
||||||
|
|
||||||
ctx->hw_frames_ctx = av_hwframe_ctx_alloc(ctx->hw_device_ctx);
|
ctx->surfaces = av_mallocz(ctx->num_surfaces * sizeof(*ctx->surfaces));
|
||||||
if (!ctx->hw_frames_ctx)
|
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;
|
goto fail;
|
||||||
frames_ctx = (AVHWFramesContext*)ctx->hw_frames_ctx->data;
|
}
|
||||||
frames_hwctx = frames_ctx->hwctx;
|
|
||||||
|
|
||||||
frames_ctx->format = AV_PIX_FMT_DXVA2_VLD;
|
hr = IDirectXVideoDecoderService_CreateSurface(ctx->decoder_service,
|
||||||
frames_ctx->sw_format = (target_format == MKTAG('P','0','1','0') ? AV_PIX_FMT_P010 : AV_PIX_FMT_NV12);
|
FFALIGN(s->coded_width, surface_alignment),
|
||||||
frames_ctx->width = FFALIGN(s->coded_width, surface_alignment);
|
FFALIGN(s->coded_height, surface_alignment),
|
||||||
frames_ctx->height = FFALIGN(s->coded_height, surface_alignment);
|
ctx->num_surfaces - 1,
|
||||||
frames_ctx->initial_pool_size = num_surfaces;
|
target_format, D3DPOOL_DEFAULT, 0,
|
||||||
|
DXVA2_VideoDecoderRenderTarget,
|
||||||
frames_hwctx->surface_type = DXVA2_VideoDecoderRenderTarget;
|
ctx->surfaces, NULL);
|
||||||
|
if (FAILED(hr)) {
|
||||||
ret = av_hwframe_ctx_init(ctx->hw_frames_ctx);
|
av_log(NULL, loglevel, "Failed to create %d video surfaces\n", ctx->num_surfaces);
|
||||||
if (ret < 0) {
|
|
||||||
av_log(NULL, loglevel, "Failed to initialize the HW frames context\n");
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = IDirectXVideoDecoderService_CreateVideoDecoder(ctx->decoder_service, &device_guid,
|
hr = IDirectXVideoDecoderService_CreateVideoDecoder(ctx->decoder_service, &device_guid,
|
||||||
&desc, &config, frames_hwctx->surfaces,
|
&desc, &config, ctx->surfaces,
|
||||||
frames_hwctx->nb_surfaces, &frames_hwctx->decoder_to_release);
|
ctx->num_surfaces, &ctx->decoder);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
av_log(NULL, loglevel, "Failed to create DXVA2 video decoder\n");
|
av_log(NULL, loglevel, "Failed to create DXVA2 video decoder\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
@@ -393,16 +582,16 @@ static int dxva2_create_decoder(AVCodecContext *s)
|
|||||||
ctx->decoder_config = config;
|
ctx->decoder_config = config;
|
||||||
|
|
||||||
dxva_ctx->cfg = &ctx->decoder_config;
|
dxva_ctx->cfg = &ctx->decoder_config;
|
||||||
dxva_ctx->decoder = frames_hwctx->decoder_to_release;
|
dxva_ctx->decoder = ctx->decoder;
|
||||||
dxva_ctx->surface = frames_hwctx->surfaces;
|
dxva_ctx->surface = ctx->surfaces;
|
||||||
dxva_ctx->surface_count = frames_hwctx->nb_surfaces;
|
dxva_ctx->surface_count = ctx->num_surfaces;
|
||||||
|
|
||||||
if (IsEqualGUID(&ctx->decoder_guid, &DXVADDI_Intel_ModeH264_E))
|
if (IsEqualGUID(&ctx->decoder_guid, &DXVADDI_Intel_ModeH264_E))
|
||||||
dxva_ctx->workaround |= FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO;
|
dxva_ctx->workaround |= FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
fail:
|
fail:
|
||||||
av_buffer_unref(&ctx->hw_frames_ctx);
|
dxva2_destroy_decoder(s);
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -426,13 +615,8 @@ int dxva2_init(AVCodecContext *s)
|
|||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->codec_id == AV_CODEC_ID_HEVC &&
|
if (ctx->decoder)
|
||||||
s->profile != FF_PROFILE_HEVC_MAIN && s->profile != FF_PROFILE_HEVC_MAIN_10) {
|
dxva2_destroy_decoder(s);
|
||||||
av_log(NULL, loglevel, "Unsupported HEVC profile for DXVA2 HWAccel: %d\n", s->profile);
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
av_buffer_unref(&ctx->hw_frames_ctx);
|
|
||||||
|
|
||||||
ret = dxva2_create_decoder(s);
|
ret = dxva2_create_decoder(s);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|||||||
254
ffmpeg_filter.c
254
ffmpeg_filter.c
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
#include "libavfilter/avfilter.h"
|
#include "libavfilter/avfilter.h"
|
||||||
#include "libavfilter/buffersink.h"
|
#include "libavfilter/buffersink.h"
|
||||||
#include "libavfilter/buffersrc.h"
|
|
||||||
|
|
||||||
#include "libavresample/avresample.h"
|
#include "libavresample/avresample.h"
|
||||||
|
|
||||||
@@ -32,34 +31,12 @@
|
|||||||
#include "libavutil/avstring.h"
|
#include "libavutil/avstring.h"
|
||||||
#include "libavutil/bprint.h"
|
#include "libavutil/bprint.h"
|
||||||
#include "libavutil/channel_layout.h"
|
#include "libavutil/channel_layout.h"
|
||||||
#include "libavutil/display.h"
|
|
||||||
#include "libavutil/opt.h"
|
#include "libavutil/opt.h"
|
||||||
#include "libavutil/pixdesc.h"
|
#include "libavutil/pixdesc.h"
|
||||||
#include "libavutil/pixfmt.h"
|
#include "libavutil/pixfmt.h"
|
||||||
#include "libavutil/imgutils.h"
|
#include "libavutil/imgutils.h"
|
||||||
#include "libavutil/samplefmt.h"
|
#include "libavutil/samplefmt.h"
|
||||||
|
|
||||||
static const enum AVPixelFormat *get_compliance_unofficial_pix_fmts(enum AVCodecID codec_id, const enum AVPixelFormat default_formats[])
|
|
||||||
{
|
|
||||||
static const enum AVPixelFormat mjpeg_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_NONE };
|
|
||||||
static const enum AVPixelFormat ljpeg_formats[] =
|
|
||||||
{ AV_PIX_FMT_BGR24 , AV_PIX_FMT_BGRA , AV_PIX_FMT_BGR0,
|
|
||||||
AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ422P,
|
|
||||||
AV_PIX_FMT_YUV420P , AV_PIX_FMT_YUV444P , AV_PIX_FMT_YUV422P,
|
|
||||||
AV_PIX_FMT_NONE};
|
|
||||||
|
|
||||||
if (codec_id == AV_CODEC_ID_MJPEG) {
|
|
||||||
return mjpeg_formats;
|
|
||||||
} else if (codec_id == AV_CODEC_ID_LJPEG) {
|
|
||||||
return ljpeg_formats;
|
|
||||||
} else {
|
|
||||||
return default_formats;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *enc_ctx, AVCodec *codec, enum AVPixelFormat target)
|
enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *enc_ctx, AVCodec *codec, enum AVPixelFormat target)
|
||||||
{
|
{
|
||||||
if (codec && codec->pix_fmts) {
|
if (codec && codec->pix_fmts) {
|
||||||
@@ -67,9 +44,18 @@ enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *enc_ctx, AVCod
|
|||||||
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(target);
|
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(target);
|
||||||
int has_alpha = desc ? desc->nb_components % 2 == 0 : 0;
|
int has_alpha = desc ? desc->nb_components % 2 == 0 : 0;
|
||||||
enum AVPixelFormat best= AV_PIX_FMT_NONE;
|
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,
|
||||||
|
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->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
|
||||||
p = get_compliance_unofficial_pix_fmts(enc_ctx->codec_id, p);
|
if (enc_ctx->codec_id == AV_CODEC_ID_MJPEG) {
|
||||||
|
p = mjpeg_formats;
|
||||||
|
} else if (enc_ctx->codec_id == AV_CODEC_ID_LJPEG) {
|
||||||
|
p =ljpeg_formats;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (; *p != AV_PIX_FMT_NONE; p++) {
|
for (; *p != AV_PIX_FMT_NONE; p++) {
|
||||||
best= avcodec_find_best_pix_fmt_of_2(best, *p, target, has_alpha, NULL);
|
best= avcodec_find_best_pix_fmt_of_2(best, *p, target, has_alpha, NULL);
|
||||||
@@ -98,7 +84,7 @@ void choose_sample_fmt(AVStream *st, AVCodec *codec)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (*p == -1) {
|
if (*p == -1) {
|
||||||
if((codec->capabilities & AV_CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
|
if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
|
||||||
av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
|
av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
|
||||||
if(av_get_sample_fmt_name(st->codec->sample_fmt))
|
if(av_get_sample_fmt_name(st->codec->sample_fmt))
|
||||||
av_log(NULL, AV_LOG_WARNING,
|
av_log(NULL, AV_LOG_WARNING,
|
||||||
@@ -139,7 +125,12 @@ static char *choose_pix_fmts(OutputStream *ost)
|
|||||||
|
|
||||||
p = ost->enc->pix_fmts;
|
p = ost->enc->pix_fmts;
|
||||||
if (ost->enc_ctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
|
if (ost->enc_ctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
|
||||||
p = get_compliance_unofficial_pix_fmts(ost->enc_ctx->codec_id, p);
|
if (ost->enc_ctx->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) {
|
||||||
|
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 };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; *p != AV_PIX_FMT_NONE; p++) {
|
for (; *p != AV_PIX_FMT_NONE; p++) {
|
||||||
@@ -297,45 +288,6 @@ static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
|
|||||||
ist->filters[ist->nb_filters - 1] = fg->inputs[fg->nb_inputs - 1];
|
ist->filters[ist->nb_filters - 1] = fg->inputs[fg->nb_inputs - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
int init_complex_filtergraph(FilterGraph *fg)
|
|
||||||
{
|
|
||||||
AVFilterInOut *inputs, *outputs, *cur;
|
|
||||||
AVFilterGraph *graph;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
/* this graph is only used for determining the kinds of inputs
|
|
||||||
* and outputs we have, and is discarded on exit from this function */
|
|
||||||
graph = avfilter_graph_alloc();
|
|
||||||
if (!graph)
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
|
|
||||||
ret = avfilter_graph_parse2(graph, fg->graph_desc, &inputs, &outputs);
|
|
||||||
if (ret < 0)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
for (cur = inputs; cur; cur = cur->next)
|
|
||||||
init_input_filter(fg, cur);
|
|
||||||
|
|
||||||
for (cur = outputs; cur;) {
|
|
||||||
GROW_ARRAY(fg->outputs, fg->nb_outputs);
|
|
||||||
fg->outputs[fg->nb_outputs - 1] = av_mallocz(sizeof(*fg->outputs[0]));
|
|
||||||
if (!fg->outputs[fg->nb_outputs - 1])
|
|
||||||
exit_program(1);
|
|
||||||
|
|
||||||
fg->outputs[fg->nb_outputs - 1]->graph = fg;
|
|
||||||
fg->outputs[fg->nb_outputs - 1]->out_tmp = cur;
|
|
||||||
fg->outputs[fg->nb_outputs - 1]->type = avfilter_pad_get_type(cur->filter_ctx->output_pads,
|
|
||||||
cur->pad_idx);
|
|
||||||
cur = cur->next;
|
|
||||||
fg->outputs[fg->nb_outputs - 1]->out_tmp->next = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
fail:
|
|
||||||
avfilter_inout_free(&inputs);
|
|
||||||
avfilter_graph_free(&graph);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int insert_trim(int64_t start_time, int64_t duration,
|
static int insert_trim(int64_t start_time, int64_t duration,
|
||||||
AVFilterContext **last_filter, int *pad_idx,
|
AVFilterContext **last_filter, int *pad_idx,
|
||||||
const char *filter_name)
|
const char *filter_name)
|
||||||
@@ -387,28 +339,6 @@ static int insert_trim(int64_t start_time, int64_t duration,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int insert_filter(AVFilterContext **last_filter, int *pad_idx,
|
|
||||||
const char *filter_name, const char *args)
|
|
||||||
{
|
|
||||||
AVFilterGraph *graph = (*last_filter)->graph;
|
|
||||||
AVFilterContext *ctx;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = avfilter_graph_create_filter(&ctx,
|
|
||||||
avfilter_get_by_name(filter_name),
|
|
||||||
filter_name, args, NULL, graph);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = avfilter_link(*last_filter, *pad_idx, ctx, 0);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
*last_filter = ctx;
|
|
||||||
*pad_idx = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
|
static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
|
||||||
{
|
{
|
||||||
char *pix_fmts;
|
char *pix_fmts;
|
||||||
@@ -428,20 +358,14 @@ static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (!hw_device_ctx && (codec->width || codec->height)) {
|
if (codec->width || codec->height) {
|
||||||
char args[255];
|
char args[255];
|
||||||
AVFilterContext *filter;
|
AVFilterContext *filter;
|
||||||
AVDictionaryEntry *e = NULL;
|
|
||||||
|
|
||||||
snprintf(args, sizeof(args), "%d:%d",
|
snprintf(args, sizeof(args), "%d:%d:0x%X",
|
||||||
codec->width,
|
codec->width,
|
||||||
codec->height);
|
codec->height,
|
||||||
|
(unsigned)ost->sws_flags);
|
||||||
while ((e = av_dict_get(ost->sws_dict, "", e,
|
|
||||||
AV_DICT_IGNORE_SUFFIX))) {
|
|
||||||
av_strlcatf(args, sizeof(args), ":%s=%s", e->key, e->value);
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(name, sizeof(name), "scaler for output stream %d:%d",
|
snprintf(name, sizeof(name), "scaler for output stream %d:%d",
|
||||||
ost->file_index, ost->index);
|
ost->file_index, ost->index);
|
||||||
if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
|
if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
|
||||||
@@ -552,7 +476,7 @@ static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter,
|
|||||||
av_get_default_channel_layout(ost->audio_channels_mapped));
|
av_get_default_channel_layout(ost->audio_channels_mapped));
|
||||||
for (i = 0; i < ost->audio_channels_mapped; i++)
|
for (i = 0; i < ost->audio_channels_mapped; i++)
|
||||||
if (ost->audio_channels_map[i] != -1)
|
if (ost->audio_channels_map[i] != -1)
|
||||||
av_bprintf(&pan_buf, "|c%d=c%d", i, ost->audio_channels_map[i]);
|
av_bprintf(&pan_buf, ":c%d=c%d", i, ost->audio_channels_map[i]);
|
||||||
|
|
||||||
AUTO_INSERT_FILTER("-map_channel", "pan", pan_buf.str);
|
AUTO_INSERT_FILTER("-map_channel", "pan", pan_buf.str);
|
||||||
av_bprint_finalize(&pan_buf, NULL);
|
av_bprint_finalize(&pan_buf, NULL);
|
||||||
@@ -655,11 +579,6 @@ int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOu
|
|||||||
av_freep(&ofilter->name);
|
av_freep(&ofilter->name);
|
||||||
DESCRIBE_FILTER_LINK(ofilter, out, 0);
|
DESCRIBE_FILTER_LINK(ofilter, out, 0);
|
||||||
|
|
||||||
if (!ofilter->ost) {
|
|
||||||
av_log(NULL, AV_LOG_FATAL, "Filter %s has an unconnected output\n", ofilter->name);
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (avfilter_pad_get_type(out->filter_ctx->output_pads, out->pad_idx)) {
|
switch (avfilter_pad_get_type(out->filter_ctx->output_pads, out->pad_idx)) {
|
||||||
case AVMEDIA_TYPE_VIDEO: return configure_output_video_filter(fg, ofilter, out);
|
case AVMEDIA_TYPE_VIDEO: return configure_output_video_filter(fg, ofilter, out);
|
||||||
case AVMEDIA_TYPE_AUDIO: return configure_output_audio_filter(fg, ofilter, out);
|
case AVMEDIA_TYPE_AUDIO: return configure_output_audio_filter(fg, ofilter, out);
|
||||||
@@ -690,8 +609,8 @@ static int sub2video_prepare(InputStream *ist)
|
|||||||
}
|
}
|
||||||
av_log(avf, AV_LOG_INFO, "sub2video: using %dx%d canvas\n", w, h);
|
av_log(avf, AV_LOG_INFO, "sub2video: using %dx%d canvas\n", w, h);
|
||||||
}
|
}
|
||||||
ist->sub2video.w = ist->resample_width = w;
|
ist->sub2video.w = ist->dec_ctx->width = ist->resample_width = w;
|
||||||
ist->sub2video.h = ist->resample_height = h;
|
ist->sub2video.h = ist->dec_ctx->height = ist->resample_height = h;
|
||||||
|
|
||||||
/* rectangles are AV_PIX_FMT_PAL8, but we have no guarantee that the
|
/* rectangles are AV_PIX_FMT_PAL8, but we have no guarantee that the
|
||||||
palettes for all rectangles are identical or compatible */
|
palettes for all rectangles are identical or compatible */
|
||||||
@@ -719,17 +638,10 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
|
|||||||
char name[255];
|
char name[255];
|
||||||
int ret, pad_idx = 0;
|
int ret, pad_idx = 0;
|
||||||
int64_t tsoffset = 0;
|
int64_t tsoffset = 0;
|
||||||
AVBufferSrcParameters *par = av_buffersrc_parameters_alloc();
|
|
||||||
|
|
||||||
if (!par)
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
memset(par, 0, sizeof(*par));
|
|
||||||
par->format = AV_PIX_FMT_NONE;
|
|
||||||
|
|
||||||
if (ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
|
if (ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||||
av_log(NULL, AV_LOG_ERROR, "Cannot connect video filter to audio input\n");
|
av_log(NULL, AV_LOG_ERROR, "Cannot connect video filter to audio input\n");
|
||||||
ret = AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fr.num)
|
if (!fr.num)
|
||||||
@@ -738,7 +650,7 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
|
|||||||
if (ist->dec_ctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
|
if (ist->dec_ctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
|
||||||
ret = sub2video_prepare(ist);
|
ret = sub2video_prepare(ist);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto fail;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
sar = ist->st->sample_aspect_ratio.num ?
|
sar = ist->st->sample_aspect_ratio.num ?
|
||||||
@@ -753,44 +665,17 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
|
|||||||
ist->resample_height,
|
ist->resample_height,
|
||||||
ist->hwaccel_retrieve_data ? ist->hwaccel_retrieved_pix_fmt : ist->resample_pix_fmt,
|
ist->hwaccel_retrieve_data ? ist->hwaccel_retrieved_pix_fmt : ist->resample_pix_fmt,
|
||||||
tb.num, tb.den, sar.num, sar.den,
|
tb.num, tb.den, sar.num, sar.den,
|
||||||
SWS_BILINEAR + ((ist->dec_ctx->flags&AV_CODEC_FLAG_BITEXACT) ? SWS_BITEXACT:0));
|
SWS_BILINEAR + ((ist->dec_ctx->flags&CODEC_FLAG_BITEXACT) ? SWS_BITEXACT:0));
|
||||||
if (fr.num && fr.den)
|
if (fr.num && fr.den)
|
||||||
av_bprintf(&args, ":frame_rate=%d/%d", 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,
|
snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
|
||||||
ist->file_index, ist->st->index);
|
ist->file_index, ist->st->index);
|
||||||
|
|
||||||
|
|
||||||
if ((ret = avfilter_graph_create_filter(&ifilter->filter, buffer_filt, name,
|
if ((ret = avfilter_graph_create_filter(&ifilter->filter, buffer_filt, name,
|
||||||
args.str, NULL, fg->graph)) < 0)
|
args.str, NULL, fg->graph)) < 0)
|
||||||
goto fail;
|
return ret;
|
||||||
par->hw_frames_ctx = ist->hw_frames_ctx;
|
|
||||||
ret = av_buffersrc_parameters_set(ifilter->filter, par);
|
|
||||||
if (ret < 0)
|
|
||||||
goto fail;
|
|
||||||
av_freep(&par);
|
|
||||||
last_filter = ifilter->filter;
|
last_filter = ifilter->filter;
|
||||||
|
|
||||||
if (ist->autorotate) {
|
|
||||||
double theta = get_rotation(ist->st);
|
|
||||||
|
|
||||||
if (fabs(theta - 90) < 1.0) {
|
|
||||||
ret = insert_filter(&last_filter, &pad_idx, "transpose", "clock");
|
|
||||||
} else if (fabs(theta - 180) < 1.0) {
|
|
||||||
ret = insert_filter(&last_filter, &pad_idx, "hflip", NULL);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
ret = insert_filter(&last_filter, &pad_idx, "vflip", NULL);
|
|
||||||
} else if (fabs(theta - 270) < 1.0) {
|
|
||||||
ret = insert_filter(&last_filter, &pad_idx, "transpose", "cclock");
|
|
||||||
} else if (fabs(theta) > 1.0) {
|
|
||||||
char rotate_buf[64];
|
|
||||||
snprintf(rotate_buf, sizeof(rotate_buf), "%f*PI/180", theta);
|
|
||||||
ret = insert_filter(&last_filter, &pad_idx, "rotate", rotate_buf);
|
|
||||||
}
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ist->framerate.num) {
|
if (ist->framerate.num) {
|
||||||
AVFilterContext *setpts;
|
AVFilterContext *setpts;
|
||||||
|
|
||||||
@@ -841,10 +726,6 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
|
|||||||
if ((ret = avfilter_link(last_filter, 0, in->filter_ctx, in->pad_idx)) < 0)
|
if ((ret = avfilter_link(last_filter, 0, in->filter_ctx, in->pad_idx)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
return 0;
|
return 0;
|
||||||
fail:
|
|
||||||
av_freep(&par);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
|
static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
|
||||||
@@ -979,7 +860,7 @@ static int configure_input_filter(FilterGraph *fg, InputFilter *ifilter,
|
|||||||
int configure_filtergraph(FilterGraph *fg)
|
int configure_filtergraph(FilterGraph *fg)
|
||||||
{
|
{
|
||||||
AVFilterInOut *inputs, *outputs, *cur;
|
AVFilterInOut *inputs, *outputs, *cur;
|
||||||
int ret, i, simple = !fg->graph_desc;
|
int ret, i, init = !fg->graph, simple = !fg->graph_desc;
|
||||||
const char *graph_desc = simple ? fg->outputs[0]->ost->avfilter :
|
const char *graph_desc = simple ? fg->outputs[0]->ost->avfilter :
|
||||||
fg->graph_desc;
|
fg->graph_desc;
|
||||||
|
|
||||||
@@ -992,13 +873,7 @@ int configure_filtergraph(FilterGraph *fg)
|
|||||||
char args[512];
|
char args[512];
|
||||||
AVDictionaryEntry *e = NULL;
|
AVDictionaryEntry *e = NULL;
|
||||||
|
|
||||||
args[0] = 0;
|
snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
|
||||||
while ((e = av_dict_get(ost->sws_dict, "", e,
|
|
||||||
AV_DICT_IGNORE_SUFFIX))) {
|
|
||||||
av_strlcatf(args, sizeof(args), "%s=%s:", e->key, e->value);
|
|
||||||
}
|
|
||||||
if (strlen(args))
|
|
||||||
args[strlen(args)-1] = 0;
|
|
||||||
fg->graph->scale_sws_opts = av_strdup(args);
|
fg->graph->scale_sws_opts = av_strdup(args);
|
||||||
|
|
||||||
args[0] = 0;
|
args[0] = 0;
|
||||||
@@ -1027,37 +902,15 @@ int configure_filtergraph(FilterGraph *fg)
|
|||||||
if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0)
|
if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (hw_device_ctx) {
|
|
||||||
for (i = 0; i < fg->graph->nb_filters; i++) {
|
|
||||||
fg->graph->filters[i]->hw_device_ctx = av_buffer_ref(hw_device_ctx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (simple && (!inputs || inputs->next || !outputs || outputs->next)) {
|
if (simple && (!inputs || inputs->next || !outputs || outputs->next)) {
|
||||||
const char *num_inputs;
|
av_log(NULL, AV_LOG_ERROR, "Simple filtergraph '%s' does not have "
|
||||||
const char *num_outputs;
|
"exactly one input and output.\n", graph_desc);
|
||||||
if (!outputs) {
|
|
||||||
num_outputs = "0";
|
|
||||||
} else if (outputs->next) {
|
|
||||||
num_outputs = ">1";
|
|
||||||
} else {
|
|
||||||
num_outputs = "1";
|
|
||||||
}
|
|
||||||
if (!inputs) {
|
|
||||||
num_inputs = "0";
|
|
||||||
} else if (inputs->next) {
|
|
||||||
num_inputs = ">1";
|
|
||||||
} else {
|
|
||||||
num_inputs = "1";
|
|
||||||
}
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Simple filtergraph '%s' was expected "
|
|
||||||
"to have exactly 1 input and 1 output."
|
|
||||||
" However, it had %s input(s) and %s output(s)."
|
|
||||||
" Please adjust, or use a complex filtergraph (-filter_complex) instead.\n",
|
|
||||||
graph_desc, num_inputs, num_outputs);
|
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (cur = inputs; !simple && init && cur; cur = cur->next)
|
||||||
|
init_input_filter(fg, cur);
|
||||||
|
|
||||||
for (cur = inputs, i = 0; cur; cur = cur->next, i++)
|
for (cur = inputs, i = 0; cur; cur = cur->next, i++)
|
||||||
if ((ret = configure_input_filter(fg, fg->inputs[i], cur)) < 0) {
|
if ((ret = configure_input_filter(fg, fg->inputs[i], cur)) < 0) {
|
||||||
avfilter_inout_free(&inputs);
|
avfilter_inout_free(&inputs);
|
||||||
@@ -1066,26 +919,35 @@ int configure_filtergraph(FilterGraph *fg)
|
|||||||
}
|
}
|
||||||
avfilter_inout_free(&inputs);
|
avfilter_inout_free(&inputs);
|
||||||
|
|
||||||
for (cur = outputs, i = 0; cur; cur = cur->next, i++)
|
if (!init || simple) {
|
||||||
configure_output_filter(fg, fg->outputs[i], cur);
|
/* we already know the mappings between lavfi outputs and output streams,
|
||||||
avfilter_inout_free(&outputs);
|
* so we can finish the setup */
|
||||||
|
for (cur = outputs, i = 0; cur; cur = cur->next, i++)
|
||||||
|
configure_output_filter(fg, fg->outputs[i], cur);
|
||||||
|
avfilter_inout_free(&outputs);
|
||||||
|
|
||||||
if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
|
if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
} else {
|
||||||
|
/* wait until output mappings are processed */
|
||||||
|
for (cur = outputs; cur;) {
|
||||||
|
GROW_ARRAY(fg->outputs, fg->nb_outputs);
|
||||||
|
if (!(fg->outputs[fg->nb_outputs - 1] = av_mallocz(sizeof(*fg->outputs[0]))))
|
||||||
|
exit_program(1);
|
||||||
|
fg->outputs[fg->nb_outputs - 1]->graph = fg;
|
||||||
|
fg->outputs[fg->nb_outputs - 1]->out_tmp = cur;
|
||||||
|
cur = cur->next;
|
||||||
|
fg->outputs[fg->nb_outputs - 1]->out_tmp->next = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fg->reconfiguration = 1;
|
fg->reconfiguration = 1;
|
||||||
|
|
||||||
for (i = 0; i < fg->nb_outputs; i++) {
|
for (i = 0; i < fg->nb_outputs; i++) {
|
||||||
OutputStream *ost = fg->outputs[i]->ost;
|
OutputStream *ost = fg->outputs[i]->ost;
|
||||||
if (!ost->enc) {
|
if (ost &&
|
||||||
/* identical to the same check in ffmpeg.c, needed because
|
ost->enc->type == AVMEDIA_TYPE_AUDIO &&
|
||||||
complex filter graphs are initialized earlier */
|
!(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
|
||||||
av_log(NULL, AV_LOG_ERROR, "Encoder (codec %s) not found for output stream #%d:%d\n",
|
|
||||||
avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
}
|
|
||||||
if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
|
|
||||||
!(ost->enc->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE))
|
|
||||||
av_buffersink_set_frame_size(ost->filter->filter,
|
av_buffersink_set_frame_size(ost->filter->filter,
|
||||||
ost->enc_ctx->frame_size);
|
ost->enc_ctx->frame_size);
|
||||||
}
|
}
|
||||||
|
|||||||
459
ffmpeg_opt.c
459
ffmpeg_opt.c
@@ -41,8 +41,6 @@
|
|||||||
#include "libavutil/pixdesc.h"
|
#include "libavutil/pixdesc.h"
|
||||||
#include "libavutil/pixfmt.h"
|
#include "libavutil/pixfmt.h"
|
||||||
|
|
||||||
#define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
|
|
||||||
|
|
||||||
#define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
|
#define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
|
||||||
{\
|
{\
|
||||||
int i, ret;\
|
int i, ret;\
|
||||||
@@ -73,24 +71,10 @@ const HWAccel hwaccels[] = {
|
|||||||
{ "dxva2", dxva2_init, HWACCEL_DXVA2, AV_PIX_FMT_DXVA2_VLD },
|
{ "dxva2", dxva2_init, HWACCEL_DXVA2, AV_PIX_FMT_DXVA2_VLD },
|
||||||
#endif
|
#endif
|
||||||
#if CONFIG_VDA
|
#if CONFIG_VDA
|
||||||
{ "vda", videotoolbox_init, HWACCEL_VDA, AV_PIX_FMT_VDA },
|
{ "vda", vda_init, HWACCEL_VDA, AV_PIX_FMT_VDA },
|
||||||
#endif
|
|
||||||
#if CONFIG_VIDEOTOOLBOX
|
|
||||||
{ "videotoolbox", videotoolbox_init, HWACCEL_VIDEOTOOLBOX, AV_PIX_FMT_VIDEOTOOLBOX },
|
|
||||||
#endif
|
|
||||||
#if CONFIG_LIBMFX
|
|
||||||
{ "qsv", qsv_init, HWACCEL_QSV, AV_PIX_FMT_QSV },
|
|
||||||
#endif
|
|
||||||
#if CONFIG_VAAPI
|
|
||||||
{ "vaapi", vaapi_decode_init, HWACCEL_VAAPI, AV_PIX_FMT_VAAPI },
|
|
||||||
#endif
|
|
||||||
#if CONFIG_CUVID
|
|
||||||
{ "cuvid", cuvid_init, HWACCEL_CUVID, AV_PIX_FMT_CUDA },
|
|
||||||
#endif
|
#endif
|
||||||
{ 0 },
|
{ 0 },
|
||||||
};
|
};
|
||||||
int hwaccel_lax_profile_check = 0;
|
|
||||||
AVBufferRef *hw_device_ctx;
|
|
||||||
|
|
||||||
char *vstats_filename;
|
char *vstats_filename;
|
||||||
char *sdp_filename;
|
char *sdp_filename;
|
||||||
@@ -113,7 +97,6 @@ int start_at_zero = 0;
|
|||||||
int copy_tb = -1;
|
int copy_tb = -1;
|
||||||
int debug_ts = 0;
|
int debug_ts = 0;
|
||||||
int exit_on_error = 0;
|
int exit_on_error = 0;
|
||||||
int abort_on_flags = 0;
|
|
||||||
int print_stats = -1;
|
int print_stats = -1;
|
||||||
int qp_hist = 0;
|
int qp_hist = 0;
|
||||||
int stdin_interaction = 1;
|
int stdin_interaction = 1;
|
||||||
@@ -127,9 +110,6 @@ static int no_file_overwrite = 0;
|
|||||||
static int do_psnr = 0;
|
static int do_psnr = 0;
|
||||||
static int input_sync;
|
static int input_sync;
|
||||||
static int override_ffserver = 0;
|
static int override_ffserver = 0;
|
||||||
static int input_stream_potentially_available = 0;
|
|
||||||
static int ignore_unknown_streams = 0;
|
|
||||||
static int copy_unknown_streams = 0;
|
|
||||||
|
|
||||||
static void uninit_options(OptionsContext *o)
|
static void uninit_options(OptionsContext *o)
|
||||||
{
|
{
|
||||||
@@ -170,25 +150,12 @@ static void init_options(OptionsContext *o)
|
|||||||
o->stop_time = INT64_MAX;
|
o->stop_time = INT64_MAX;
|
||||||
o->mux_max_delay = 0.7;
|
o->mux_max_delay = 0.7;
|
||||||
o->start_time = AV_NOPTS_VALUE;
|
o->start_time = AV_NOPTS_VALUE;
|
||||||
o->start_time_eof = AV_NOPTS_VALUE;
|
|
||||||
o->recording_time = INT64_MAX;
|
o->recording_time = INT64_MAX;
|
||||||
o->limit_filesize = UINT64_MAX;
|
o->limit_filesize = UINT64_MAX;
|
||||||
o->chapters_input_file = INT_MAX;
|
o->chapters_input_file = INT_MAX;
|
||||||
o->accurate_seek = 1;
|
o->accurate_seek = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int show_hwaccels(void *optctx, const char *opt, const char *arg)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
printf("Hardware acceleration methods:\n");
|
|
||||||
for (i = 0; i < FF_ARRAY_ELEMS(hwaccels) - 1; i++) {
|
|
||||||
printf("%s\n", hwaccels[i].name);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* return a copy of the input with the stream specifiers removed from the keys */
|
/* return a copy of the input with the stream specifiers removed from the keys */
|
||||||
static AVDictionary *strip_specifiers(AVDictionary *dict)
|
static AVDictionary *strip_specifiers(AVDictionary *dict)
|
||||||
{
|
{
|
||||||
@@ -207,24 +174,6 @@ static AVDictionary *strip_specifiers(AVDictionary *dict)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int opt_abort_on(void *optctx, const char *opt, const char *arg)
|
|
||||||
{
|
|
||||||
static const AVOption opts[] = {
|
|
||||||
{ "abort_on" , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
|
|
||||||
{ "empty_output" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT }, .unit = "flags" },
|
|
||||||
{ NULL },
|
|
||||||
};
|
|
||||||
static const AVClass class = {
|
|
||||||
.class_name = "",
|
|
||||||
.item_name = av_default_item_name,
|
|
||||||
.option = opts,
|
|
||||||
.version = LIBAVUTIL_VERSION_INT,
|
|
||||||
};
|
|
||||||
const AVClass *pclass = &class;
|
|
||||||
|
|
||||||
return av_opt_eval_flags(&pclass, &opts[0], arg, &abort_on_flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int opt_sameq(void *optctx, const char *opt, const char *arg)
|
static int opt_sameq(void *optctx, const char *opt, const char *arg)
|
||||||
{
|
{
|
||||||
av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
|
av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
|
||||||
@@ -278,7 +227,6 @@ static int opt_map(void *optctx, const char *opt, const char *arg)
|
|||||||
int sync_file_idx = -1, sync_stream_idx = 0;
|
int sync_file_idx = -1, sync_stream_idx = 0;
|
||||||
char *p, *sync;
|
char *p, *sync;
|
||||||
char *map;
|
char *map;
|
||||||
char *allow_unused;
|
|
||||||
|
|
||||||
if (*arg == '-') {
|
if (*arg == '-') {
|
||||||
negative = 1;
|
negative = 1;
|
||||||
@@ -323,8 +271,6 @@ static int opt_map(void *optctx, const char *opt, const char *arg)
|
|||||||
exit_program(1);
|
exit_program(1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (allow_unused = strchr(map, '?'))
|
|
||||||
*allow_unused = 0;
|
|
||||||
file_idx = strtol(map, &p, 0);
|
file_idx = strtol(map, &p, 0);
|
||||||
if (file_idx >= nb_input_files || file_idx < 0) {
|
if (file_idx >= nb_input_files || file_idx < 0) {
|
||||||
av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
|
av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
|
||||||
@@ -362,13 +308,8 @@ static int opt_map(void *optctx, const char *opt, const char *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!m) {
|
if (!m) {
|
||||||
if (allow_unused) {
|
av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
|
||||||
av_log(NULL, AV_LOG_VERBOSE, "Stream map '%s' matches no streams; ignoring.\n", arg);
|
exit_program(1);
|
||||||
} else {
|
|
||||||
av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n"
|
|
||||||
"To ignore this, add a trailing '?' to the map.\n", arg);
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
av_freep(&map);
|
av_freep(&map);
|
||||||
@@ -449,17 +390,6 @@ static int opt_sdp_file(void *optctx, const char *opt, const char *arg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_VAAPI
|
|
||||||
static int opt_vaapi_device(void *optctx, const char *opt, const char *arg)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
err = vaapi_device_init(arg);
|
|
||||||
if (err < 0)
|
|
||||||
exit_program(1);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse a metadata specifier passed as 'arg' parameter.
|
* Parse a metadata specifier passed as 'arg' parameter.
|
||||||
* @param arg metadata string to parse
|
* @param arg metadata string to parse
|
||||||
@@ -652,7 +582,6 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
|
|||||||
AVCodecContext *dec = st->codec;
|
AVCodecContext *dec = st->codec;
|
||||||
InputStream *ist = av_mallocz(sizeof(*ist));
|
InputStream *ist = av_mallocz(sizeof(*ist));
|
||||||
char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
|
char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
|
||||||
char *hwaccel_output_format = NULL;
|
|
||||||
char *codec_tag = NULL;
|
char *codec_tag = NULL;
|
||||||
char *next;
|
char *next;
|
||||||
char *discard_str = NULL;
|
char *discard_str = NULL;
|
||||||
@@ -668,16 +597,10 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
|
|||||||
ist->file_index = nb_input_files;
|
ist->file_index = nb_input_files;
|
||||||
ist->discard = 1;
|
ist->discard = 1;
|
||||||
st->discard = AVDISCARD_ALL;
|
st->discard = AVDISCARD_ALL;
|
||||||
ist->nb_samples = 0;
|
|
||||||
ist->min_pts = INT64_MAX;
|
|
||||||
ist->max_pts = INT64_MIN;
|
|
||||||
|
|
||||||
ist->ts_scale = 1.0;
|
ist->ts_scale = 1.0;
|
||||||
MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
|
MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
|
||||||
|
|
||||||
ist->autorotate = 1;
|
|
||||||
MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
|
|
||||||
|
|
||||||
MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
|
MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
|
||||||
if (codec_tag) {
|
if (codec_tag) {
|
||||||
uint32_t tag = strtol(codec_tag, &next, 0);
|
uint32_t tag = strtol(codec_tag, &next, 0);
|
||||||
@@ -718,11 +641,9 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
|
|||||||
case AVMEDIA_TYPE_VIDEO:
|
case AVMEDIA_TYPE_VIDEO:
|
||||||
if(!ist->dec)
|
if(!ist->dec)
|
||||||
ist->dec = avcodec_find_decoder(dec->codec_id);
|
ist->dec = avcodec_find_decoder(dec->codec_id);
|
||||||
#if FF_API_EMU_EDGE
|
|
||||||
if (av_codec_get_lowres(dec)) {
|
if (av_codec_get_lowres(dec)) {
|
||||||
dec->flags |= CODEC_FLAG_EMU_EDGE;
|
dec->flags |= CODEC_FLAG_EMU_EDGE;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
ist->resample_height = ist->dec_ctx->height;
|
ist->resample_height = ist->dec_ctx->height;
|
||||||
ist->resample_width = ist->dec_ctx->width;
|
ist->resample_width = ist->dec_ctx->width;
|
||||||
@@ -772,19 +693,6 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
|
|||||||
if (!ist->hwaccel_device)
|
if (!ist->hwaccel_device)
|
||||||
exit_program(1);
|
exit_program(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
|
|
||||||
hwaccel_output_format, ic, st);
|
|
||||||
if (hwaccel_output_format) {
|
|
||||||
ist->hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
|
|
||||||
if (ist->hwaccel_output_format == AV_PIX_FMT_NONE) {
|
|
||||||
av_log(NULL, AV_LOG_FATAL, "Unrecognised hwaccel output "
|
|
||||||
"format: %s", hwaccel_output_format);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ist->hwaccel_output_format = AV_PIX_FMT_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
|
ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -1008,33 +916,14 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (o->start_time_eof != AV_NOPTS_VALUE) {
|
|
||||||
if (ic->duration>0) {
|
|
||||||
o->start_time = o->start_time_eof + ic->duration;
|
|
||||||
} else
|
|
||||||
av_log(NULL, AV_LOG_WARNING, "Cannot use -sseof, duration of %s not known\n", filename);
|
|
||||||
}
|
|
||||||
timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
|
timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
|
||||||
/* add the stream start time */
|
/* add the stream start time */
|
||||||
if (!o->seek_timestamp && ic->start_time != AV_NOPTS_VALUE)
|
if (ic->start_time != AV_NOPTS_VALUE)
|
||||||
timestamp += ic->start_time;
|
timestamp += ic->start_time;
|
||||||
|
|
||||||
/* if seeking requested, we execute it */
|
/* if seeking requested, we execute it */
|
||||||
if (o->start_time != AV_NOPTS_VALUE) {
|
if (o->start_time != AV_NOPTS_VALUE) {
|
||||||
int64_t seek_timestamp = timestamp;
|
ret = avformat_seek_file(ic, -1, INT64_MIN, timestamp, timestamp, 0);
|
||||||
|
|
||||||
if (!(ic->iformat->flags & AVFMT_SEEK_TO_PTS)) {
|
|
||||||
int dts_heuristic = 0;
|
|
||||||
for (i=0; i<ic->nb_streams; i++) {
|
|
||||||
AVCodecContext *avctx = ic->streams[i]->codec;
|
|
||||||
if (avctx->has_b_frames)
|
|
||||||
dts_heuristic = 1;
|
|
||||||
}
|
|
||||||
if (dts_heuristic) {
|
|
||||||
seek_timestamp -= 3*AV_TIME_BASE / 23;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ret = avformat_seek_file(ic, -1, INT64_MIN, seek_timestamp, seek_timestamp, 0);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
|
av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
|
||||||
filename, (double)timestamp / AV_TIME_BASE);
|
filename, (double)timestamp / AV_TIME_BASE);
|
||||||
@@ -1062,9 +951,6 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
|||||||
f->nb_streams = ic->nb_streams;
|
f->nb_streams = ic->nb_streams;
|
||||||
f->rate_emu = o->rate_emu;
|
f->rate_emu = o->rate_emu;
|
||||||
f->accurate_seek = o->accurate_seek;
|
f->accurate_seek = o->accurate_seek;
|
||||||
f->loop = o->loop;
|
|
||||||
f->duration = 0;
|
|
||||||
f->time_base = (AVRational){ 1, 1 };
|
|
||||||
#if HAVE_PTHREADS
|
#if HAVE_PTHREADS
|
||||||
f->thread_queue_size = o->thread_queue_size > 0 ? o->thread_queue_size : 8;
|
f->thread_queue_size = o->thread_queue_size > 0 ? o->thread_queue_size : 8;
|
||||||
#endif
|
#endif
|
||||||
@@ -1122,8 +1008,6 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
|||||||
av_dict_free(&opts[i]);
|
av_dict_free(&opts[i]);
|
||||||
av_freep(&opts);
|
av_freep(&opts);
|
||||||
|
|
||||||
input_stream_potentially_available = 1;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1287,11 +1171,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
|
|||||||
bsfc_prev->next = bsfc;
|
bsfc_prev->next = bsfc;
|
||||||
else
|
else
|
||||||
ost->bitstream_filters = bsfc;
|
ost->bitstream_filters = bsfc;
|
||||||
if (arg)
|
av_dict_set(&ost->bsf_args, bsfc->filter->name, arg, 0);
|
||||||
if (!(bsfc->args = av_strdup(arg))) {
|
|
||||||
av_log(NULL, AV_LOG_FATAL, "Bitstream filter memory allocation failed\n");
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
bsfc_prev = bsfc;
|
bsfc_prev = bsfc;
|
||||||
bsf = next;
|
bsf = next;
|
||||||
@@ -1302,13 +1182,12 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
|
|||||||
uint32_t tag = strtol(codec_tag, &next, 0);
|
uint32_t tag = strtol(codec_tag, &next, 0);
|
||||||
if (*next)
|
if (*next)
|
||||||
tag = AV_RL32(codec_tag);
|
tag = AV_RL32(codec_tag);
|
||||||
ost->st->codec->codec_tag =
|
|
||||||
ost->enc_ctx->codec_tag = tag;
|
ost->enc_ctx->codec_tag = tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
|
MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
|
||||||
if (qscale >= 0) {
|
if (qscale >= 0) {
|
||||||
ost->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
|
ost->enc_ctx->flags |= CODEC_FLAG_QSCALE;
|
||||||
ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
|
ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1316,9 +1195,9 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
|
|||||||
ost->disposition = av_strdup(ost->disposition);
|
ost->disposition = av_strdup(ost->disposition);
|
||||||
|
|
||||||
if (oc->oformat->flags & AVFMT_GLOBALHEADER)
|
if (oc->oformat->flags & AVFMT_GLOBALHEADER)
|
||||||
ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
|
ost->enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
||||||
|
|
||||||
av_dict_copy(&ost->sws_dict, o->g->sws_dict, 0);
|
av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
|
||||||
|
|
||||||
av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
|
av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
|
||||||
if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
|
if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
|
||||||
@@ -1538,17 +1417,17 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
|
|||||||
video_enc->rc_override_count = i;
|
video_enc->rc_override_count = i;
|
||||||
|
|
||||||
if (do_psnr)
|
if (do_psnr)
|
||||||
video_enc->flags|= AV_CODEC_FLAG_PSNR;
|
video_enc->flags|= CODEC_FLAG_PSNR;
|
||||||
|
|
||||||
/* two pass mode */
|
/* two pass mode */
|
||||||
MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
|
MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
|
||||||
if (do_pass) {
|
if (do_pass) {
|
||||||
if (do_pass & 1) {
|
if (do_pass & 1) {
|
||||||
video_enc->flags |= AV_CODEC_FLAG_PASS1;
|
video_enc->flags |= CODEC_FLAG_PASS1;
|
||||||
av_dict_set(&ost->encoder_opts, "flags", "+pass1", AV_DICT_APPEND);
|
av_dict_set(&ost->encoder_opts, "flags", "+pass1", AV_DICT_APPEND);
|
||||||
}
|
}
|
||||||
if (do_pass & 2) {
|
if (do_pass & 2) {
|
||||||
video_enc->flags |= AV_CODEC_FLAG_PASS2;
|
video_enc->flags |= CODEC_FLAG_PASS2;
|
||||||
av_dict_set(&ost->encoder_opts, "flags", "+pass2", AV_DICT_APPEND);
|
av_dict_set(&ost->encoder_opts, "flags", "+pass2", AV_DICT_APPEND);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1558,40 +1437,6 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
|
|||||||
!(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
|
!(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
|
||||||
exit_program(1);
|
exit_program(1);
|
||||||
|
|
||||||
if (do_pass) {
|
|
||||||
char logfilename[1024];
|
|
||||||
FILE *f;
|
|
||||||
|
|
||||||
snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
|
|
||||||
ost->logfile_prefix ? ost->logfile_prefix :
|
|
||||||
DEFAULT_PASS_LOGFILENAME_PREFIX,
|
|
||||||
i);
|
|
||||||
if (!strcmp(ost->enc->name, "libx264")) {
|
|
||||||
av_dict_set(&ost->encoder_opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
|
|
||||||
} else {
|
|
||||||
if (video_enc->flags & AV_CODEC_FLAG_PASS2) {
|
|
||||||
char *logbuffer = read_file(logfilename);
|
|
||||||
|
|
||||||
if (!logbuffer) {
|
|
||||||
av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
|
|
||||||
logfilename);
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
video_enc->stats_in = logbuffer;
|
|
||||||
}
|
|
||||||
if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
|
|
||||||
f = av_fopen_utf8(logfilename, "wb");
|
|
||||||
if (!f) {
|
|
||||||
av_log(NULL, AV_LOG_FATAL,
|
|
||||||
"Cannot write log file '%s' for pass-1 encoding: %s\n",
|
|
||||||
logfilename, strerror(errno));
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
ost->logfile = f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
|
MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
|
||||||
if (ost->forced_keyframes)
|
if (ost->forced_keyframes)
|
||||||
ost->forced_keyframes = av_strdup(ost->forced_keyframes);
|
ost->forced_keyframes = av_strdup(ost->forced_keyframes);
|
||||||
@@ -1701,19 +1546,6 @@ static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int
|
|||||||
return ost;
|
return ost;
|
||||||
}
|
}
|
||||||
|
|
||||||
static OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
|
|
||||||
{
|
|
||||||
OutputStream *ost;
|
|
||||||
|
|
||||||
ost = new_output_stream(o, oc, AVMEDIA_TYPE_UNKNOWN, source_index);
|
|
||||||
if (!ost->stream_copy) {
|
|
||||||
av_log(NULL, AV_LOG_FATAL, "Unknown stream encoding not supported yet (only streamcopy)\n");
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ost;
|
|
||||||
}
|
|
||||||
|
|
||||||
static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
|
static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
|
||||||
{
|
{
|
||||||
OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
|
OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
|
||||||
@@ -1870,7 +1702,8 @@ static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
|
|||||||
{
|
{
|
||||||
OutputStream *ost;
|
OutputStream *ost;
|
||||||
|
|
||||||
switch (ofilter->type) {
|
switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
|
||||||
|
ofilter->out_tmp->pad_idx)) {
|
||||||
case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
|
case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
|
||||||
case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
|
case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
|
||||||
default:
|
default:
|
||||||
@@ -1903,19 +1736,11 @@ static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
|
|||||||
exit_program(1);
|
exit_program(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
avfilter_inout_free(&ofilter->out_tmp);
|
if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
|
||||||
}
|
av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
|
||||||
|
exit_program(1);
|
||||||
static int init_complex_filters(void)
|
|
||||||
{
|
|
||||||
int i, ret = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < nb_filtergraphs; i++) {
|
|
||||||
ret = init_complex_filtergraph(filtergraphs[i]);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
return 0;
|
avfilter_inout_free(&ofilter->out_tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int configure_complex_filters(void)
|
static int configure_complex_filters(void)
|
||||||
@@ -1940,6 +1765,10 @@ static int open_output_file(OptionsContext *o, const char *filename)
|
|||||||
AVDictionary *unused_opts = NULL;
|
AVDictionary *unused_opts = NULL;
|
||||||
AVDictionaryEntry *e = NULL;
|
AVDictionaryEntry *e = NULL;
|
||||||
|
|
||||||
|
if (configure_complex_filters() < 0) {
|
||||||
|
av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
|
||||||
|
exit_program(1);
|
||||||
|
}
|
||||||
|
|
||||||
if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
|
if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
|
||||||
o->stop_time = INT64_MAX;
|
o->stop_time = INT64_MAX;
|
||||||
@@ -1994,7 +1823,8 @@ static int open_output_file(OptionsContext *o, const char *filename)
|
|||||||
if (!ofilter->out_tmp || ofilter->out_tmp->name)
|
if (!ofilter->out_tmp || ofilter->out_tmp->name)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
switch (ofilter->type) {
|
switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
|
||||||
|
ofilter->out_tmp->pad_idx)) {
|
||||||
case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
|
case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
|
||||||
case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
|
case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
|
||||||
case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
|
case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
|
||||||
@@ -2053,7 +1883,7 @@ static int open_output_file(OptionsContext *o, const char *filename)
|
|||||||
for (i = 0; i < nb_input_streams; i++) {
|
for (i = 0; i < nb_input_streams; i++) {
|
||||||
int new_area;
|
int new_area;
|
||||||
ist = input_streams[i];
|
ist = input_streams[i];
|
||||||
new_area = ist->st->codec->width * ist->st->codec->height + 100000000*!!ist->st->codec_info_nb_frames;
|
new_area = ist->st->codec->width * ist->st->codec->height;
|
||||||
if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
|
if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
|
||||||
new_area = 1;
|
new_area = 1;
|
||||||
if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
|
if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
|
||||||
@@ -2070,14 +1900,12 @@ static int open_output_file(OptionsContext *o, const char *filename)
|
|||||||
|
|
||||||
/* audio: most channels */
|
/* 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 && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
|
||||||
int best_score = 0, idx = -1;
|
int channels = 0, idx = -1;
|
||||||
for (i = 0; i < nb_input_streams; i++) {
|
for (i = 0; i < nb_input_streams; i++) {
|
||||||
int score;
|
|
||||||
ist = input_streams[i];
|
ist = input_streams[i];
|
||||||
score = ist->st->codec->channels + 100000000*!!ist->st->codec_info_nb_frames;
|
|
||||||
if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
|
if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
|
||||||
score > best_score) {
|
ist->st->codec->channels > channels) {
|
||||||
best_score = score;
|
channels = ist->st->codec->channels;
|
||||||
idx = i;
|
idx = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2164,33 +1992,17 @@ loop_end:
|
|||||||
if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
|
if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ost = NULL;
|
|
||||||
switch (ist->st->codec->codec_type) {
|
switch (ist->st->codec->codec_type) {
|
||||||
case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
|
case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
|
||||||
case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
|
case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
|
||||||
case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
|
case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
|
||||||
case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
|
case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
|
||||||
case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
|
case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
|
||||||
case AVMEDIA_TYPE_UNKNOWN:
|
|
||||||
if (copy_unknown_streams) {
|
|
||||||
ost = new_unknown_stream (o, oc, src_idx);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
av_log(NULL, ignore_unknown_streams ? AV_LOG_WARNING : AV_LOG_FATAL,
|
av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
|
||||||
"Cannot map stream #%d:%d - unsupported type.\n",
|
|
||||||
map->file_index, map->stream_index);
|
map->file_index, map->stream_index);
|
||||||
if (!ignore_unknown_streams) {
|
exit_program(1);
|
||||||
av_log(NULL, AV_LOG_FATAL,
|
|
||||||
"If you want unsupported types ignored instead "
|
|
||||||
"of failing, please use the -ignore_unknown option\n"
|
|
||||||
"If you want them copied, please use -copy_unknown\n");
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (ost)
|
|
||||||
ost->sync_ist = input_streams[ input_files[map->sync_file_index]->ist_index
|
|
||||||
+ map->sync_stream_index];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2220,11 +2032,11 @@ loop_end:
|
|||||||
avio_read(pb, attachment, len);
|
avio_read(pb, attachment, len);
|
||||||
|
|
||||||
ost = new_attachment_stream(o, oc, -1);
|
ost = new_attachment_stream(o, oc, -1);
|
||||||
ost->stream_copy = 1;
|
ost->stream_copy = 0;
|
||||||
ost->attachment_filename = o->attachments[i];
|
ost->attachment_filename = o->attachments[i];
|
||||||
ost->finished = 1;
|
ost->finished = 1;
|
||||||
ost->st->codec->extradata = attachment;
|
ost->enc_ctx->extradata = attachment;
|
||||||
ost->st->codec->extradata_size = len;
|
ost->enc_ctx->extradata_size = len;
|
||||||
|
|
||||||
p = strrchr(o->attachments[i], '/');
|
p = strrchr(o->attachments[i], '/');
|
||||||
av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
|
av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
|
||||||
@@ -2242,12 +2054,6 @@ loop_end:
|
|||||||
exit_program(1);
|
exit_program(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
|
|
||||||
av_dump_format(oc, nb_output_files - 1, oc->filename, 1);
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check if all codec options have been used */
|
/* check if all codec options have been used */
|
||||||
unused_opts = strip_specifiers(o->g->codec_opts);
|
unused_opts = strip_specifiers(o->g->codec_opts);
|
||||||
for (i = of->ost_index; i < nb_output_streams; i++) {
|
for (i = of->ost_index; i < nb_output_streams; i++) {
|
||||||
@@ -2290,17 +2096,6 @@ loop_end:
|
|||||||
}
|
}
|
||||||
av_dict_free(&unused_opts);
|
av_dict_free(&unused_opts);
|
||||||
|
|
||||||
/* set the encoding/decoding_needed flags */
|
|
||||||
for (i = of->ost_index; i < nb_output_streams; i++) {
|
|
||||||
OutputStream *ost = output_streams[i];
|
|
||||||
|
|
||||||
ost->encoding_needed = !ost->stream_copy;
|
|
||||||
if (ost->encoding_needed && ost->source_index >= 0) {
|
|
||||||
InputStream *ist = input_streams[ost->source_index];
|
|
||||||
ist->decoding_needed |= DECODING_FOR_OST;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check filename in case of an image number is expected */
|
/* check filename in case of an image number is expected */
|
||||||
if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
|
if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
|
||||||
if (!av_filename_number_test(oc->filename)) {
|
if (!av_filename_number_test(oc->filename)) {
|
||||||
@@ -2309,12 +2104,6 @@ loop_end:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(oc->oformat->flags & AVFMT_NOSTREAMS) && !input_stream_potentially_available) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR,
|
|
||||||
"No input streams but output needs an input stream\n");
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(oc->oformat->flags & AVFMT_NOFILE)) {
|
if (!(oc->oformat->flags & AVFMT_NOFILE)) {
|
||||||
/* test if it already exists to avoid losing precious files */
|
/* test if it already exists to avoid losing precious files */
|
||||||
assert_file_overwrite(filename);
|
assert_file_overwrite(filename);
|
||||||
@@ -2383,79 +2172,10 @@ loop_end:
|
|||||||
continue;
|
continue;
|
||||||
ist = input_streams[output_streams[i]->source_index];
|
ist = input_streams[output_streams[i]->source_index];
|
||||||
av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
|
av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
|
||||||
if (!output_streams[i]->stream_copy) {
|
if (!output_streams[i]->stream_copy)
|
||||||
av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
|
av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
|
||||||
if (ist->autorotate)
|
|
||||||
av_dict_set(&output_streams[i]->st->metadata, "rotate", NULL, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* process manually set programs */
|
|
||||||
for (i = 0; i < o->nb_program; i++) {
|
|
||||||
const char *p = o->program[i].u.str;
|
|
||||||
int progid = i+1;
|
|
||||||
AVProgram *program;
|
|
||||||
|
|
||||||
while(*p) {
|
|
||||||
const char *p2 = av_get_token(&p, ":");
|
|
||||||
const char *to_dealloc = p2;
|
|
||||||
char *key;
|
|
||||||
if (!p2)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if(*p) p++;
|
|
||||||
|
|
||||||
key = av_get_token(&p2, "=");
|
|
||||||
if (!key || !*p2) {
|
|
||||||
av_freep(&to_dealloc);
|
|
||||||
av_freep(&key);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
p2++;
|
|
||||||
|
|
||||||
if (!strcmp(key, "program_num"))
|
|
||||||
progid = strtol(p2, NULL, 0);
|
|
||||||
av_freep(&to_dealloc);
|
|
||||||
av_freep(&key);
|
|
||||||
}
|
|
||||||
|
|
||||||
program = av_new_program(oc, progid);
|
|
||||||
|
|
||||||
p = o->program[i].u.str;
|
|
||||||
while(*p) {
|
|
||||||
const char *p2 = av_get_token(&p, ":");
|
|
||||||
const char *to_dealloc = p2;
|
|
||||||
char *key;
|
|
||||||
if (!p2)
|
|
||||||
break;
|
|
||||||
if(*p) p++;
|
|
||||||
|
|
||||||
key = av_get_token(&p2, "=");
|
|
||||||
if (!key) {
|
|
||||||
av_log(NULL, AV_LOG_FATAL,
|
|
||||||
"No '=' character in program string %s.\n",
|
|
||||||
p2);
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
if (!*p2)
|
|
||||||
exit_program(1);
|
|
||||||
p2++;
|
|
||||||
|
|
||||||
if (!strcmp(key, "title")) {
|
|
||||||
av_dict_set(&program->metadata, "title", p2, 0);
|
|
||||||
} else if (!strcmp(key, "program_num")) {
|
|
||||||
} else if (!strcmp(key, "st")) {
|
|
||||||
int st_num = strtol(p2, NULL, 0);
|
|
||||||
av_program_add_stream_index(oc, progid, st_num);
|
|
||||||
} else {
|
|
||||||
av_log(NULL, AV_LOG_FATAL, "Unknown program key %s.\n", key);
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
av_freep(&to_dealloc);
|
|
||||||
av_freep(&key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* process manually set metadata */
|
/* process manually set metadata */
|
||||||
for (i = 0; i < o->nb_metadata; i++) {
|
for (i = 0; i < o->nb_metadata; i++) {
|
||||||
AVDictionary **m;
|
AVDictionary **m;
|
||||||
@@ -2474,12 +2194,8 @@ loop_end:
|
|||||||
parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
|
parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
|
||||||
if (type == 's') {
|
if (type == 's') {
|
||||||
for (j = 0; j < oc->nb_streams; j++) {
|
for (j = 0; j < oc->nb_streams; j++) {
|
||||||
ost = output_streams[nb_output_streams - oc->nb_streams + j];
|
|
||||||
if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
|
if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
|
||||||
av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
|
av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
|
||||||
if (!strcmp(o->metadata[i].u.str, "rotate")) {
|
|
||||||
ost->rotate_overridden = 1;
|
|
||||||
}
|
|
||||||
} else if (ret < 0)
|
} else if (ret < 0)
|
||||||
exit_program(1);
|
exit_program(1);
|
||||||
}
|
}
|
||||||
@@ -2496,13 +2212,6 @@ loop_end:
|
|||||||
}
|
}
|
||||||
m = &oc->chapters[index]->metadata;
|
m = &oc->chapters[index]->metadata;
|
||||||
break;
|
break;
|
||||||
case 'p':
|
|
||||||
if (index < 0 || index >= oc->nb_programs) {
|
|
||||||
av_log(NULL, AV_LOG_FATAL, "Invalid program index %d in metadata specifier.\n", index);
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
m = &oc->programs[index]->metadata;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
|
av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
|
||||||
exit_program(1);
|
exit_program(1);
|
||||||
@@ -2573,9 +2282,9 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
|
|||||||
opt_default(NULL, "g", norm == PAL ? "15" : "18");
|
opt_default(NULL, "g", norm == PAL ? "15" : "18");
|
||||||
|
|
||||||
opt_default(NULL, "b:v", "1150000");
|
opt_default(NULL, "b:v", "1150000");
|
||||||
opt_default(NULL, "maxrate:v", "1150000");
|
opt_default(NULL, "maxrate", "1150000");
|
||||||
opt_default(NULL, "minrate:v", "1150000");
|
opt_default(NULL, "minrate", "1150000");
|
||||||
opt_default(NULL, "bufsize:v", "327680"); // 40*1024*8;
|
opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
|
||||||
|
|
||||||
opt_default(NULL, "b:a", "224000");
|
opt_default(NULL, "b:a", "224000");
|
||||||
parse_option(o, "ar", "44100", options);
|
parse_option(o, "ar", "44100", options);
|
||||||
@@ -2602,9 +2311,9 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
|
|||||||
opt_default(NULL, "g", norm == PAL ? "15" : "18");
|
opt_default(NULL, "g", norm == PAL ? "15" : "18");
|
||||||
|
|
||||||
opt_default(NULL, "b:v", "2040000");
|
opt_default(NULL, "b:v", "2040000");
|
||||||
opt_default(NULL, "maxrate:v", "2516000");
|
opt_default(NULL, "maxrate", "2516000");
|
||||||
opt_default(NULL, "minrate:v", "0"); // 1145000;
|
opt_default(NULL, "minrate", "0"); // 1145000;
|
||||||
opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
|
opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
|
||||||
opt_default(NULL, "scan_offset", "1");
|
opt_default(NULL, "scan_offset", "1");
|
||||||
|
|
||||||
opt_default(NULL, "b:a", "224000");
|
opt_default(NULL, "b:a", "224000");
|
||||||
@@ -2624,9 +2333,9 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
|
|||||||
opt_default(NULL, "g", norm == PAL ? "15" : "18");
|
opt_default(NULL, "g", norm == PAL ? "15" : "18");
|
||||||
|
|
||||||
opt_default(NULL, "b:v", "6000000");
|
opt_default(NULL, "b:v", "6000000");
|
||||||
opt_default(NULL, "maxrate:v", "9000000");
|
opt_default(NULL, "maxrate", "9000000");
|
||||||
opt_default(NULL, "minrate:v", "0"); // 1500000;
|
opt_default(NULL, "minrate", "0"); // 1500000;
|
||||||
opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
|
opt_default(NULL, "bufsize", "1835008"); // 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, "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
|
opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
|
||||||
@@ -2670,11 +2379,6 @@ static int opt_vstats(void *optctx, const char *opt, const char *arg)
|
|||||||
time_t today2 = time(NULL);
|
time_t today2 = time(NULL);
|
||||||
struct tm *today = localtime(&today2);
|
struct tm *today = localtime(&today2);
|
||||||
|
|
||||||
if (!today) { // maybe tomorrow
|
|
||||||
av_log(NULL, AV_LOG_FATAL, "Unable to get current time: %s\n", strerror(errno));
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
|
snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
|
||||||
today->tm_sec);
|
today->tm_sec);
|
||||||
return opt_vstats_file(NULL, opt, filename);
|
return opt_vstats_file(NULL, opt, filename);
|
||||||
@@ -2904,9 +2608,6 @@ static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
|
|||||||
filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
|
filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
|
||||||
if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
|
if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
input_stream_potentially_available = 1;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2921,9 +2622,6 @@ static int opt_filter_complex_script(void *optctx, const char *opt, const char *
|
|||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
|
filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
|
||||||
filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
|
filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
|
||||||
|
|
||||||
input_stream_potentially_available = 1;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2948,7 +2646,6 @@ void show_help_default(const char *opt, const char *arg)
|
|||||||
" -h -- print basic options\n"
|
" -h -- print basic options\n"
|
||||||
" -h long -- print more options\n"
|
" -h long -- print more options\n"
|
||||||
" -h full -- print all options (including all format and codec specific options, very long)\n"
|
" -h full -- print all options (including all format and codec specific options, very long)\n"
|
||||||
" -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter\n"
|
|
||||||
" See man %s for detailed description of the options.\n"
|
" See man %s for detailed description of the options.\n"
|
||||||
"\n", program_name);
|
"\n", program_name);
|
||||||
|
|
||||||
@@ -3076,13 +2773,6 @@ int ffmpeg_parse_options(int argc, char **argv)
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* create the complex filtergraphs */
|
|
||||||
ret = init_complex_filters();
|
|
||||||
if (ret < 0) {
|
|
||||||
av_log(NULL, AV_LOG_FATAL, "Error initializing complex filters.\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* open output files */
|
/* open output files */
|
||||||
ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
|
ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
@@ -3090,13 +2780,6 @@ int ffmpeg_parse_options(int argc, char **argv)
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* configure the complex filtergraphs */
|
|
||||||
ret = configure_complex_filters();
|
|
||||||
if (ret < 0) {
|
|
||||||
av_log(NULL, AV_LOG_FATAL, "Error configuring complex filters.\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
uninit_parse_context(&octx);
|
uninit_parse_context(&octx);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
@@ -3134,10 +2817,6 @@ const OptionDef options[] = {
|
|||||||
"overwrite output files" },
|
"overwrite output files" },
|
||||||
{ "n", OPT_BOOL, { &no_file_overwrite },
|
{ "n", OPT_BOOL, { &no_file_overwrite },
|
||||||
"never overwrite output files" },
|
"never overwrite output files" },
|
||||||
{ "ignore_unknown", OPT_BOOL, { &ignore_unknown_streams },
|
|
||||||
"Ignore unknown stream types" },
|
|
||||||
{ "copy_unknown", OPT_BOOL | OPT_EXPERT, { ©_unknown_streams },
|
|
||||||
"Copy unknown stream types" },
|
|
||||||
{ "c", HAS_ARG | OPT_STRING | OPT_SPEC |
|
{ "c", HAS_ARG | OPT_STRING | OPT_SPEC |
|
||||||
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
|
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
|
||||||
"codec name", "codec" },
|
"codec name", "codec" },
|
||||||
@@ -3171,12 +2850,6 @@ const OptionDef options[] = {
|
|||||||
{ "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
|
{ "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
|
||||||
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
|
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
|
||||||
"set the start time offset", "time_off" },
|
"set the start time offset", "time_off" },
|
||||||
{ "sseof", HAS_ARG | OPT_TIME | OPT_OFFSET |
|
|
||||||
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time_eof) },
|
|
||||||
"set the start time offset relative to EOF", "time_off" },
|
|
||||||
{ "seek_timestamp", HAS_ARG | OPT_INT | OPT_OFFSET |
|
|
||||||
OPT_INPUT, { .off = OFFSET(seek_timestamp) },
|
|
||||||
"enable/disable seeking by timestamp with -ss" },
|
|
||||||
{ "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
|
{ "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
|
||||||
OPT_INPUT, { .off = OFFSET(accurate_seek) },
|
OPT_INPUT, { .off = OFFSET(accurate_seek) },
|
||||||
"enable/disable accurate seeking with -ss" },
|
"enable/disable accurate seeking with -ss" },
|
||||||
@@ -3186,12 +2859,10 @@ const OptionDef options[] = {
|
|||||||
{ "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
|
{ "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
|
||||||
OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
|
OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
|
||||||
"set the input ts scale", "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" },
|
"set the recording timestamp ('now' to set the current time)", "time" },
|
||||||
{ "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
|
{ "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
|
||||||
"add metadata", "string=string" },
|
"add metadata", "string=string" },
|
||||||
{ "program", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(program) },
|
|
||||||
"add program with specified streams", "title=string:st=number..." },
|
|
||||||
{ "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
|
{ "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
|
||||||
OPT_OUTPUT, { .func_arg = opt_data_frames },
|
OPT_OUTPUT, { .func_arg = opt_data_frames },
|
||||||
"set the number of data frames to output", "number" },
|
"set the number of data frames to output", "number" },
|
||||||
@@ -3213,9 +2884,9 @@ const OptionDef options[] = {
|
|||||||
OPT_INPUT, { .off = OFFSET(rate_emu) },
|
OPT_INPUT, { .off = OFFSET(rate_emu) },
|
||||||
"read input at native frame rate", "" },
|
"read input at native frame rate", "" },
|
||||||
{ "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
|
{ "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
|
||||||
"specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\" or \"dv50\" "
|
"specify target file type (\"vcd\", \"svcd\", \"dvd\","
|
||||||
"with optional prefixes \"pal-\", \"ntsc-\" or \"film-\")", "type" },
|
" \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
|
||||||
{ "vsync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vsync },
|
{ "vsync", HAS_ARG | OPT_EXPERT, { opt_vsync },
|
||||||
"video sync method", "" },
|
"video sync method", "" },
|
||||||
{ "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &frame_drop_threshold },
|
{ "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &frame_drop_threshold },
|
||||||
"frame drop threshold", "" },
|
"frame drop threshold", "" },
|
||||||
@@ -3241,8 +2912,6 @@ const OptionDef options[] = {
|
|||||||
"timestamp error delta threshold", "threshold" },
|
"timestamp error delta threshold", "threshold" },
|
||||||
{ "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
|
{ "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
|
||||||
"exit on error", "error" },
|
"exit on error", "error" },
|
||||||
{ "abort_on", HAS_ARG | OPT_EXPERT, { .func_arg = opt_abort_on },
|
|
||||||
"abort on the specified condition flags", "flags" },
|
|
||||||
{ "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
|
{ "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
|
||||||
OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
|
OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
|
||||||
"copy initial non-keyframes" },
|
"copy initial non-keyframes" },
|
||||||
@@ -3281,8 +2950,6 @@ const OptionDef options[] = {
|
|||||||
{ "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
|
{ "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
|
||||||
OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
|
OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
|
||||||
"extract an attachment into a file", "filename" },
|
"extract an attachment into a file", "filename" },
|
||||||
{ "stream_loop", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_INPUT |
|
|
||||||
OPT_OFFSET, { .off = OFFSET(loop) }, "set number of times input stream shall be looped", "loop count" },
|
|
||||||
{ "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
|
{ "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
|
||||||
"print timestamp debugging info" },
|
"print timestamp debugging info" },
|
||||||
{ "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
|
{ "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
|
||||||
@@ -3339,9 +3006,9 @@ const OptionDef options[] = {
|
|||||||
"this option is deprecated, use the yadif filter instead" },
|
"this option is deprecated, use the yadif filter instead" },
|
||||||
{ "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
|
{ "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
|
||||||
"calculate PSNR of compressed frames" },
|
"calculate PSNR of compressed frames" },
|
||||||
{ "vstats", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_vstats },
|
{ "vstats", OPT_VIDEO | OPT_EXPERT , { &opt_vstats },
|
||||||
"dump video coding statistics to file" },
|
"dump video coding statistics to file" },
|
||||||
{ "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { .func_arg = opt_vstats_file },
|
{ "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { opt_vstats_file },
|
||||||
"dump video coding statistics to file", "file" },
|
"dump video coding statistics to file", "file" },
|
||||||
{ "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
|
{ "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
|
||||||
"set video filters", "filter_graph" },
|
"set video filters", "filter_graph" },
|
||||||
@@ -3358,7 +3025,7 @@ const OptionDef options[] = {
|
|||||||
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(top_field_first) },
|
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(top_field_first) },
|
||||||
"top=1/bottom=0/auto=-1 field first", "" },
|
"top=1/bottom=0/auto=-1 field first", "" },
|
||||||
{ "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
|
{ "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
|
||||||
OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_old2new },
|
OPT_OUTPUT, { .func_arg = opt_old2new },
|
||||||
"force video tag/fourcc", "fourcc/tag" },
|
"force video tag/fourcc", "fourcc/tag" },
|
||||||
{ "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
|
{ "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
|
||||||
"show QP histogram" },
|
"show QP histogram" },
|
||||||
@@ -3380,23 +3047,10 @@ const OptionDef options[] = {
|
|||||||
"use HW accelerated decoding", "hwaccel name" },
|
"use HW accelerated decoding", "hwaccel name" },
|
||||||
{ "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
|
{ "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
|
||||||
OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
|
OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
|
||||||
"select a device for HW acceleration", "devicename" },
|
"select a device for HW acceleration" "devicename" },
|
||||||
{ "hwaccel_output_format", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
|
#if HAVE_VDPAU_X11
|
||||||
OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_output_formats) },
|
{ "vdpau_api_ver", HAS_ARG | OPT_INT | OPT_EXPERT, { &vdpau_api_ver }, "" },
|
||||||
"select output format used with HW accelerated decoding", "format" },
|
|
||||||
{ "hwaccel_output_format", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
|
|
||||||
OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_output_formats) },
|
|
||||||
"select output format used with HW accelerated decoding", "format" },
|
|
||||||
#if CONFIG_VDA || CONFIG_VIDEOTOOLBOX
|
|
||||||
{ "videotoolbox_pixfmt", HAS_ARG | OPT_STRING | OPT_EXPERT, { &videotoolbox_pixfmt}, "" },
|
|
||||||
#endif
|
#endif
|
||||||
{ "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
|
|
||||||
"show available HW acceleration methods" },
|
|
||||||
{ "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
|
|
||||||
OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
|
|
||||||
"automatically insert correct rotate filters" },
|
|
||||||
{ "hwaccel_lax_profile_check", OPT_BOOL | OPT_EXPERT, { &hwaccel_lax_profile_check},
|
|
||||||
"attempt to decode anyway if HW accelerated decoder's supported profiles do not exactly match the stream" },
|
|
||||||
|
|
||||||
/* audio options */
|
/* audio options */
|
||||||
{ "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
|
{ "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
|
||||||
@@ -3456,7 +3110,7 @@ const OptionDef options[] = {
|
|||||||
"set the initial demux-decode delay", "seconds" },
|
"set the initial demux-decode delay", "seconds" },
|
||||||
{ "override_ffserver", OPT_BOOL | OPT_EXPERT | OPT_OUTPUT, { &override_ffserver },
|
{ "override_ffserver", OPT_BOOL | OPT_EXPERT | OPT_OUTPUT, { &override_ffserver },
|
||||||
"override the options from ffserver", "" },
|
"override the options from ffserver", "" },
|
||||||
{ "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { .func_arg = opt_sdp_file },
|
{ "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { opt_sdp_file },
|
||||||
"specify a file in which to print sdp information", "file" },
|
"specify a file in which to print sdp information", "file" },
|
||||||
|
|
||||||
{ "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
|
{ "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
|
||||||
@@ -3480,10 +3134,5 @@ const OptionDef options[] = {
|
|||||||
{ "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },
|
{ "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },
|
||||||
"disable data" },
|
"disable data" },
|
||||||
|
|
||||||
#if CONFIG_VAAPI
|
|
||||||
{ "vaapi_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vaapi_device },
|
|
||||||
"set VAAPI hardware device (DRM path or X11 display name)", "device" },
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{ NULL, },
|
{ NULL, },
|
||||||
};
|
};
|
||||||
|
|||||||
268
ffmpeg_qsv.c
268
ffmpeg_qsv.c
@@ -1,268 +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 <mfx/mfxvideo.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "libavutil/dict.h"
|
|
||||||
#include "libavutil/mem.h"
|
|
||||||
#include "libavutil/opt.h"
|
|
||||||
#include "libavcodec/qsv.h"
|
|
||||||
|
|
||||||
#include "ffmpeg.h"
|
|
||||||
|
|
||||||
typedef struct QSVContext {
|
|
||||||
OutputStream *ost;
|
|
||||||
|
|
||||||
mfxSession session;
|
|
||||||
|
|
||||||
mfxExtOpaqueSurfaceAlloc opaque_alloc;
|
|
||||||
AVBufferRef *opaque_surfaces_buf;
|
|
||||||
|
|
||||||
uint8_t *surface_used;
|
|
||||||
mfxFrameSurface1 **surface_ptrs;
|
|
||||||
int nb_surfaces;
|
|
||||||
|
|
||||||
mfxExtBuffer *ext_buffers[1];
|
|
||||||
} QSVContext;
|
|
||||||
|
|
||||||
static void buffer_release(void *opaque, uint8_t *data)
|
|
||||||
{
|
|
||||||
*(uint8_t*)opaque = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int qsv_get_buffer(AVCodecContext *s, AVFrame *frame, int flags)
|
|
||||||
{
|
|
||||||
InputStream *ist = s->opaque;
|
|
||||||
QSVContext *qsv = ist->hwaccel_ctx;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < qsv->nb_surfaces; i++) {
|
|
||||||
if (qsv->surface_used[i])
|
|
||||||
continue;
|
|
||||||
|
|
||||||
frame->buf[0] = av_buffer_create((uint8_t*)qsv->surface_ptrs[i], sizeof(*qsv->surface_ptrs[i]),
|
|
||||||
buffer_release, &qsv->surface_used[i], 0);
|
|
||||||
if (!frame->buf[0])
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
frame->data[3] = (uint8_t*)qsv->surface_ptrs[i];
|
|
||||||
qsv->surface_used[i] = 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int init_opaque_surf(QSVContext *qsv)
|
|
||||||
{
|
|
||||||
AVQSVContext *hwctx_enc = qsv->ost->enc_ctx->hwaccel_context;
|
|
||||||
mfxFrameSurface1 *surfaces;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
qsv->nb_surfaces = hwctx_enc->nb_opaque_surfaces;
|
|
||||||
|
|
||||||
qsv->opaque_surfaces_buf = av_buffer_ref(hwctx_enc->opaque_surfaces);
|
|
||||||
qsv->surface_ptrs = av_mallocz_array(qsv->nb_surfaces, sizeof(*qsv->surface_ptrs));
|
|
||||||
qsv->surface_used = av_mallocz_array(qsv->nb_surfaces, sizeof(*qsv->surface_used));
|
|
||||||
if (!qsv->opaque_surfaces_buf || !qsv->surface_ptrs || !qsv->surface_used)
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
|
|
||||||
surfaces = (mfxFrameSurface1*)qsv->opaque_surfaces_buf->data;
|
|
||||||
for (i = 0; i < qsv->nb_surfaces; i++)
|
|
||||||
qsv->surface_ptrs[i] = surfaces + i;
|
|
||||||
|
|
||||||
qsv->opaque_alloc.Out.Surfaces = qsv->surface_ptrs;
|
|
||||||
qsv->opaque_alloc.Out.NumSurface = qsv->nb_surfaces;
|
|
||||||
qsv->opaque_alloc.Out.Type = hwctx_enc->opaque_alloc_type;
|
|
||||||
|
|
||||||
qsv->opaque_alloc.Header.BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION;
|
|
||||||
qsv->opaque_alloc.Header.BufferSz = sizeof(qsv->opaque_alloc);
|
|
||||||
qsv->ext_buffers[0] = (mfxExtBuffer*)&qsv->opaque_alloc;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void qsv_uninit(AVCodecContext *s)
|
|
||||||
{
|
|
||||||
InputStream *ist = s->opaque;
|
|
||||||
QSVContext *qsv = ist->hwaccel_ctx;
|
|
||||||
|
|
||||||
av_freep(&qsv->ost->enc_ctx->hwaccel_context);
|
|
||||||
av_freep(&s->hwaccel_context);
|
|
||||||
|
|
||||||
av_buffer_unref(&qsv->opaque_surfaces_buf);
|
|
||||||
av_freep(&qsv->surface_used);
|
|
||||||
av_freep(&qsv->surface_ptrs);
|
|
||||||
|
|
||||||
av_freep(&qsv);
|
|
||||||
}
|
|
||||||
|
|
||||||
int qsv_init(AVCodecContext *s)
|
|
||||||
{
|
|
||||||
InputStream *ist = s->opaque;
|
|
||||||
QSVContext *qsv = ist->hwaccel_ctx;
|
|
||||||
AVQSVContext *hwctx_dec;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!qsv) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "QSV transcoding is not initialized. "
|
|
||||||
"-hwaccel qsv should only be used for one-to-one QSV transcoding "
|
|
||||||
"with no filters.\n");
|
|
||||||
return AVERROR_BUG;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = init_opaque_surf(qsv);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
hwctx_dec = av_qsv_alloc_context();
|
|
||||||
if (!hwctx_dec)
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
|
|
||||||
hwctx_dec->session = qsv->session;
|
|
||||||
hwctx_dec->iopattern = MFX_IOPATTERN_OUT_OPAQUE_MEMORY;
|
|
||||||
hwctx_dec->ext_buffers = qsv->ext_buffers;
|
|
||||||
hwctx_dec->nb_ext_buffers = FF_ARRAY_ELEMS(qsv->ext_buffers);
|
|
||||||
|
|
||||||
av_freep(&s->hwaccel_context);
|
|
||||||
s->hwaccel_context = hwctx_dec;
|
|
||||||
|
|
||||||
ist->hwaccel_get_buffer = qsv_get_buffer;
|
|
||||||
ist->hwaccel_uninit = qsv_uninit;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static mfxIMPL choose_implementation(const InputStream *ist)
|
|
||||||
{
|
|
||||||
static const struct {
|
|
||||||
const char *name;
|
|
||||||
mfxIMPL impl;
|
|
||||||
} impl_map[] = {
|
|
||||||
{ "auto", MFX_IMPL_AUTO },
|
|
||||||
{ "sw", MFX_IMPL_SOFTWARE },
|
|
||||||
{ "hw", MFX_IMPL_HARDWARE },
|
|
||||||
{ "auto_any", MFX_IMPL_AUTO_ANY },
|
|
||||||
{ "hw_any", MFX_IMPL_HARDWARE_ANY },
|
|
||||||
{ "hw2", MFX_IMPL_HARDWARE2 },
|
|
||||||
{ "hw3", MFX_IMPL_HARDWARE3 },
|
|
||||||
{ "hw4", MFX_IMPL_HARDWARE4 },
|
|
||||||
};
|
|
||||||
|
|
||||||
mfxIMPL impl = MFX_IMPL_AUTO_ANY;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (ist->hwaccel_device) {
|
|
||||||
for (i = 0; i < FF_ARRAY_ELEMS(impl_map); i++)
|
|
||||||
if (!strcmp(ist->hwaccel_device, impl_map[i].name)) {
|
|
||||||
impl = impl_map[i].impl;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (i == FF_ARRAY_ELEMS(impl_map))
|
|
||||||
impl = strtol(ist->hwaccel_device, NULL, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return impl;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qsv_transcode_init(OutputStream *ost)
|
|
||||||
{
|
|
||||||
InputStream *ist;
|
|
||||||
const enum AVPixelFormat *pix_fmt;
|
|
||||||
|
|
||||||
AVDictionaryEntry *e;
|
|
||||||
const AVOption *opt;
|
|
||||||
int flags = 0;
|
|
||||||
|
|
||||||
int err, i;
|
|
||||||
|
|
||||||
QSVContext *qsv = NULL;
|
|
||||||
AVQSVContext *hwctx = NULL;
|
|
||||||
mfxIMPL impl;
|
|
||||||
mfxVersion ver = { { 3, 1 } };
|
|
||||||
|
|
||||||
/* check if the encoder supports QSV */
|
|
||||||
if (!ost->enc->pix_fmts)
|
|
||||||
return 0;
|
|
||||||
for (pix_fmt = ost->enc->pix_fmts; *pix_fmt != AV_PIX_FMT_NONE; pix_fmt++)
|
|
||||||
if (*pix_fmt == AV_PIX_FMT_QSV)
|
|
||||||
break;
|
|
||||||
if (*pix_fmt == AV_PIX_FMT_NONE)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (strcmp(ost->avfilter, "null") || ost->source_index < 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* check if the decoder supports QSV and the output only goes to this stream */
|
|
||||||
ist = input_streams[ost->source_index];
|
|
||||||
if (ist->nb_filters || ist->hwaccel_id != HWACCEL_QSV ||
|
|
||||||
!ist->dec || !ist->dec->pix_fmts)
|
|
||||||
return 0;
|
|
||||||
for (pix_fmt = ist->dec->pix_fmts; *pix_fmt != AV_PIX_FMT_NONE; pix_fmt++)
|
|
||||||
if (*pix_fmt == AV_PIX_FMT_QSV)
|
|
||||||
break;
|
|
||||||
if (*pix_fmt == AV_PIX_FMT_NONE)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for (i = 0; i < nb_output_streams; i++)
|
|
||||||
if (output_streams[i] != ost &&
|
|
||||||
output_streams[i]->source_index == ost->source_index)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
av_log(NULL, AV_LOG_VERBOSE, "Setting up QSV transcoding\n");
|
|
||||||
|
|
||||||
qsv = av_mallocz(sizeof(*qsv));
|
|
||||||
hwctx = av_qsv_alloc_context();
|
|
||||||
if (!qsv || !hwctx)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
impl = choose_implementation(ist);
|
|
||||||
|
|
||||||
err = MFXInit(impl, &ver, &qsv->session);
|
|
||||||
if (err != MFX_ERR_NONE) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Error initializing an MFX session: %d\n", err);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
e = av_dict_get(ost->encoder_opts, "flags", NULL, 0);
|
|
||||||
opt = av_opt_find(ost->enc_ctx, "flags", NULL, 0, 0);
|
|
||||||
if (e && opt)
|
|
||||||
av_opt_eval_flags(ost->enc_ctx, opt, e->value, &flags);
|
|
||||||
|
|
||||||
qsv->ost = ost;
|
|
||||||
|
|
||||||
hwctx->session = qsv->session;
|
|
||||||
hwctx->iopattern = MFX_IOPATTERN_IN_OPAQUE_MEMORY;
|
|
||||||
hwctx->opaque_alloc = 1;
|
|
||||||
hwctx->nb_opaque_surfaces = 16;
|
|
||||||
|
|
||||||
ost->hwaccel_ctx = qsv;
|
|
||||||
ost->enc_ctx->hwaccel_context = hwctx;
|
|
||||||
ost->enc_ctx->pix_fmt = AV_PIX_FMT_QSV;
|
|
||||||
|
|
||||||
ist->hwaccel_ctx = qsv;
|
|
||||||
ist->dec_ctx->pix_fmt = AV_PIX_FMT_QSV;
|
|
||||||
ist->resample_pix_fmt = AV_PIX_FMT_QSV;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
av_freep(&hwctx);
|
|
||||||
av_freep(&qsv);
|
|
||||||
return AVERROR_UNKNOWN;
|
|
||||||
}
|
|
||||||
538
ffmpeg_vaapi.c
538
ffmpeg_vaapi.c
@@ -1,538 +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 "config.h"
|
|
||||||
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <va/va.h>
|
|
||||||
#if HAVE_VAAPI_X11
|
|
||||||
# include <va/va_x11.h>
|
|
||||||
#endif
|
|
||||||
#if HAVE_VAAPI_DRM
|
|
||||||
# include <va/va_drm.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "libavutil/avassert.h"
|
|
||||||
#include "libavutil/avconfig.h"
|
|
||||||
#include "libavutil/buffer.h"
|
|
||||||
#include "libavutil/frame.h"
|
|
||||||
#include "libavutil/hwcontext.h"
|
|
||||||
#include "libavutil/hwcontext_vaapi.h"
|
|
||||||
#include "libavutil/imgutils.h"
|
|
||||||
#include "libavutil/opt.h"
|
|
||||||
#include "libavutil/pixfmt.h"
|
|
||||||
|
|
||||||
#include "libavcodec/vaapi.h"
|
|
||||||
|
|
||||||
#include "ffmpeg.h"
|
|
||||||
|
|
||||||
|
|
||||||
static AVClass vaapi_class = {
|
|
||||||
.class_name = "vaapi",
|
|
||||||
.item_name = av_default_item_name,
|
|
||||||
.version = LIBAVUTIL_VERSION_INT,
|
|
||||||
};
|
|
||||||
|
|
||||||
#define DEFAULT_SURFACES 20
|
|
||||||
|
|
||||||
typedef struct VAAPIDecoderContext {
|
|
||||||
const AVClass *class;
|
|
||||||
|
|
||||||
AVBufferRef *device_ref;
|
|
||||||
AVHWDeviceContext *device;
|
|
||||||
AVBufferRef *frames_ref;
|
|
||||||
AVHWFramesContext *frames;
|
|
||||||
|
|
||||||
VAProfile va_profile;
|
|
||||||
VAEntrypoint va_entrypoint;
|
|
||||||
VAConfigID va_config;
|
|
||||||
VAContextID va_context;
|
|
||||||
|
|
||||||
enum AVPixelFormat decode_format;
|
|
||||||
int decode_width;
|
|
||||||
int decode_height;
|
|
||||||
int decode_surfaces;
|
|
||||||
|
|
||||||
// The output need not have the same format, width and height as the
|
|
||||||
// decoded frames - the copy for non-direct-mapped access is actually
|
|
||||||
// a whole vpp instance which can do arbitrary scaling and format
|
|
||||||
// conversion.
|
|
||||||
enum AVPixelFormat output_format;
|
|
||||||
|
|
||||||
struct vaapi_context decoder_vaapi_context;
|
|
||||||
} VAAPIDecoderContext;
|
|
||||||
|
|
||||||
|
|
||||||
static int vaapi_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
|
|
||||||
{
|
|
||||||
InputStream *ist = avctx->opaque;
|
|
||||||
VAAPIDecoderContext *ctx = ist->hwaccel_ctx;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
err = av_hwframe_get_buffer(ctx->frames_ref, frame, 0);
|
|
||||||
if (err < 0) {
|
|
||||||
av_log(ctx, AV_LOG_ERROR, "Failed to allocate decoder surface.\n");
|
|
||||||
} else {
|
|
||||||
av_log(ctx, AV_LOG_DEBUG, "Decoder given surface %#x.\n",
|
|
||||||
(unsigned int)(uintptr_t)frame->data[3]);
|
|
||||||
}
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int vaapi_retrieve_data(AVCodecContext *avctx, AVFrame *input)
|
|
||||||
{
|
|
||||||
InputStream *ist = avctx->opaque;
|
|
||||||
VAAPIDecoderContext *ctx = ist->hwaccel_ctx;
|
|
||||||
AVFrame *output = 0;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
av_assert0(input->format == AV_PIX_FMT_VAAPI);
|
|
||||||
|
|
||||||
if (ctx->output_format == AV_PIX_FMT_VAAPI) {
|
|
||||||
// Nothing to do.
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
av_log(ctx, AV_LOG_DEBUG, "Retrieve data from surface %#x.\n",
|
|
||||||
(unsigned int)(uintptr_t)input->data[3]);
|
|
||||||
|
|
||||||
output = av_frame_alloc();
|
|
||||||
if (!output)
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
|
|
||||||
output->format = ctx->output_format;
|
|
||||||
|
|
||||||
err = av_hwframe_transfer_data(output, input, 0);
|
|
||||||
if (err < 0) {
|
|
||||||
av_log(ctx, AV_LOG_ERROR, "Failed to transfer data to "
|
|
||||||
"output frame: %d.\n", err);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = av_frame_copy_props(output, input);
|
|
||||||
if (err < 0) {
|
|
||||||
av_frame_unref(output);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
av_frame_unref(input);
|
|
||||||
av_frame_move_ref(input, output);
|
|
||||||
av_frame_free(&output);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
if (output)
|
|
||||||
av_frame_free(&output);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static const struct {
|
|
||||||
enum AVCodecID codec_id;
|
|
||||||
int codec_profile;
|
|
||||||
VAProfile va_profile;
|
|
||||||
} vaapi_profile_map[] = {
|
|
||||||
#define MAP(c, p, v) { AV_CODEC_ID_ ## c, FF_PROFILE_ ## p, VAProfile ## v }
|
|
||||||
MAP(MPEG2VIDEO, MPEG2_SIMPLE, MPEG2Simple ),
|
|
||||||
MAP(MPEG2VIDEO, MPEG2_MAIN, MPEG2Main ),
|
|
||||||
MAP(H263, UNKNOWN, H263Baseline),
|
|
||||||
MAP(MPEG4, MPEG4_SIMPLE, MPEG4Simple ),
|
|
||||||
MAP(MPEG4, MPEG4_ADVANCED_SIMPLE,
|
|
||||||
MPEG4AdvancedSimple),
|
|
||||||
MAP(MPEG4, MPEG4_MAIN, MPEG4Main ),
|
|
||||||
MAP(H264, H264_CONSTRAINED_BASELINE,
|
|
||||||
H264ConstrainedBaseline),
|
|
||||||
MAP(H264, H264_BASELINE, H264Baseline),
|
|
||||||
MAP(H264, H264_MAIN, H264Main ),
|
|
||||||
MAP(H264, H264_HIGH, H264High ),
|
|
||||||
#if VA_CHECK_VERSION(0, 37, 0)
|
|
||||||
MAP(HEVC, HEVC_MAIN, HEVCMain ),
|
|
||||||
#endif
|
|
||||||
MAP(WMV3, VC1_SIMPLE, VC1Simple ),
|
|
||||||
MAP(WMV3, VC1_MAIN, VC1Main ),
|
|
||||||
MAP(WMV3, VC1_COMPLEX, VC1Advanced ),
|
|
||||||
MAP(WMV3, VC1_ADVANCED, VC1Advanced ),
|
|
||||||
MAP(VC1, VC1_SIMPLE, VC1Simple ),
|
|
||||||
MAP(VC1, VC1_MAIN, VC1Main ),
|
|
||||||
MAP(VC1, VC1_COMPLEX, VC1Advanced ),
|
|
||||||
MAP(VC1, VC1_ADVANCED, VC1Advanced ),
|
|
||||||
#if VA_CHECK_VERSION(0, 35, 0)
|
|
||||||
MAP(VP8, UNKNOWN, VP8Version0_3 ),
|
|
||||||
#endif
|
|
||||||
#if VA_CHECK_VERSION(0, 37, 1)
|
|
||||||
MAP(VP9, VP9_0, VP9Profile0 ),
|
|
||||||
#endif
|
|
||||||
#undef MAP
|
|
||||||
};
|
|
||||||
|
|
||||||
static int vaapi_build_decoder_config(VAAPIDecoderContext *ctx,
|
|
||||||
AVCodecContext *avctx,
|
|
||||||
int fallback_allowed)
|
|
||||||
{
|
|
||||||
AVVAAPIDeviceContext *hwctx = ctx->device->hwctx;
|
|
||||||
AVVAAPIHWConfig *hwconfig = NULL;
|
|
||||||
AVHWFramesConstraints *constraints = NULL;
|
|
||||||
VAStatus vas;
|
|
||||||
int err, i, j;
|
|
||||||
int loglevel = fallback_allowed ? AV_LOG_VERBOSE : AV_LOG_ERROR;
|
|
||||||
const AVCodecDescriptor *codec_desc;
|
|
||||||
const AVPixFmtDescriptor *pix_desc;
|
|
||||||
enum AVPixelFormat pix_fmt;
|
|
||||||
VAProfile profile, *profile_list = NULL;
|
|
||||||
int profile_count, exact_match, alt_profile;
|
|
||||||
|
|
||||||
codec_desc = avcodec_descriptor_get(avctx->codec_id);
|
|
||||||
if (!codec_desc) {
|
|
||||||
err = AVERROR(EINVAL);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
profile_count = vaMaxNumProfiles(hwctx->display);
|
|
||||||
profile_list = av_malloc(profile_count * sizeof(VAProfile));
|
|
||||||
if (!profile_list) {
|
|
||||||
err = AVERROR(ENOMEM);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
vas = vaQueryConfigProfiles(hwctx->display,
|
|
||||||
profile_list, &profile_count);
|
|
||||||
if (vas != VA_STATUS_SUCCESS) {
|
|
||||||
av_log(ctx, loglevel, "Failed to query profiles: %d (%s).\n",
|
|
||||||
vas, vaErrorStr(vas));
|
|
||||||
err = AVERROR(EIO);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
profile = VAProfileNone;
|
|
||||||
exact_match = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < FF_ARRAY_ELEMS(vaapi_profile_map); i++) {
|
|
||||||
int profile_match = 0;
|
|
||||||
if (avctx->codec_id != vaapi_profile_map[i].codec_id)
|
|
||||||
continue;
|
|
||||||
if (avctx->profile == vaapi_profile_map[i].codec_profile)
|
|
||||||
profile_match = 1;
|
|
||||||
profile = vaapi_profile_map[i].va_profile;
|
|
||||||
for (j = 0; j < profile_count; j++) {
|
|
||||||
if (profile == profile_list[j]) {
|
|
||||||
exact_match = profile_match;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (j < profile_count) {
|
|
||||||
if (exact_match)
|
|
||||||
break;
|
|
||||||
alt_profile = vaapi_profile_map[i].codec_profile;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
av_freep(&profile_list);
|
|
||||||
|
|
||||||
if (profile == VAProfileNone) {
|
|
||||||
av_log(ctx, loglevel, "No VAAPI support for codec %s.\n",
|
|
||||||
codec_desc->name);
|
|
||||||
err = AVERROR(ENOSYS);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
if (!exact_match) {
|
|
||||||
if (fallback_allowed || !hwaccel_lax_profile_check) {
|
|
||||||
av_log(ctx, loglevel, "No VAAPI support for codec %s "
|
|
||||||
"profile %d.\n", codec_desc->name, avctx->profile);
|
|
||||||
if (!fallback_allowed) {
|
|
||||||
av_log(ctx, AV_LOG_WARNING, "If you want attempt decoding "
|
|
||||||
"anyway with a possibly-incompatible profile, add "
|
|
||||||
"the option -hwaccel_lax_profile_check.\n");
|
|
||||||
}
|
|
||||||
err = AVERROR(EINVAL);
|
|
||||||
goto fail;
|
|
||||||
} else {
|
|
||||||
av_log(ctx, AV_LOG_WARNING, "No VAAPI support for codec %s "
|
|
||||||
"profile %d: trying instead with profile %d.\n",
|
|
||||||
codec_desc->name, avctx->profile, alt_profile);
|
|
||||||
av_log(ctx, AV_LOG_WARNING, "This may fail or give "
|
|
||||||
"incorrect results, depending on your hardware.\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->va_profile = profile;
|
|
||||||
ctx->va_entrypoint = VAEntrypointVLD;
|
|
||||||
|
|
||||||
vas = vaCreateConfig(hwctx->display, ctx->va_profile,
|
|
||||||
ctx->va_entrypoint, 0, 0, &ctx->va_config);
|
|
||||||
if (vas != VA_STATUS_SUCCESS) {
|
|
||||||
av_log(ctx, AV_LOG_ERROR, "Failed to create decode pipeline "
|
|
||||||
"configuration: %d (%s).\n", vas, vaErrorStr(vas));
|
|
||||||
err = AVERROR(EIO);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
hwconfig = av_hwdevice_hwconfig_alloc(ctx->device_ref);
|
|
||||||
if (!hwconfig) {
|
|
||||||
err = AVERROR(ENOMEM);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
hwconfig->config_id = ctx->va_config;
|
|
||||||
|
|
||||||
constraints = av_hwdevice_get_hwframe_constraints(ctx->device_ref,
|
|
||||||
hwconfig);
|
|
||||||
if (!constraints)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
// Decide on the decoder target format.
|
|
||||||
// If the user specified something with -hwaccel_output_format then
|
|
||||||
// try to use that to minimise conversions later.
|
|
||||||
ctx->decode_format = AV_PIX_FMT_NONE;
|
|
||||||
if (ctx->output_format != AV_PIX_FMT_NONE &&
|
|
||||||
ctx->output_format != AV_PIX_FMT_VAAPI) {
|
|
||||||
for (i = 0; constraints->valid_sw_formats[i] != AV_PIX_FMT_NONE; i++) {
|
|
||||||
if (constraints->valid_sw_formats[i] == ctx->decode_format) {
|
|
||||||
ctx->decode_format = ctx->output_format;
|
|
||||||
av_log(ctx, AV_LOG_DEBUG, "Using decode format %s (output "
|
|
||||||
"format).\n", av_get_pix_fmt_name(ctx->decode_format));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Otherwise, we would like to try to choose something which matches the
|
|
||||||
// decoder output, but there isn't enough information available here to
|
|
||||||
// do so. Assume for now that we are always dealing with YUV 4:2:0, so
|
|
||||||
// pick a format which does that.
|
|
||||||
if (ctx->decode_format == AV_PIX_FMT_NONE) {
|
|
||||||
for (i = 0; constraints->valid_sw_formats[i] != AV_PIX_FMT_NONE; i++) {
|
|
||||||
pix_fmt = constraints->valid_sw_formats[i];
|
|
||||||
pix_desc = av_pix_fmt_desc_get(pix_fmt);
|
|
||||||
if (pix_desc->nb_components == 3 &&
|
|
||||||
pix_desc->log2_chroma_w == 1 &&
|
|
||||||
pix_desc->log2_chroma_h == 1) {
|
|
||||||
ctx->decode_format = pix_fmt;
|
|
||||||
av_log(ctx, AV_LOG_DEBUG, "Using decode format %s (format "
|
|
||||||
"matched).\n", av_get_pix_fmt_name(ctx->decode_format));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Otherwise pick the first in the list and hope for the best.
|
|
||||||
if (ctx->decode_format == AV_PIX_FMT_NONE) {
|
|
||||||
ctx->decode_format = constraints->valid_sw_formats[0];
|
|
||||||
av_log(ctx, AV_LOG_DEBUG, "Using decode format %s (first in list).\n",
|
|
||||||
av_get_pix_fmt_name(ctx->decode_format));
|
|
||||||
if (i > 1) {
|
|
||||||
// There was a choice, and we picked randomly. Warn the user
|
|
||||||
// that they might want to choose intelligently instead.
|
|
||||||
av_log(ctx, AV_LOG_WARNING, "Using randomly chosen decode "
|
|
||||||
"format %s.\n", av_get_pix_fmt_name(ctx->decode_format));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure the picture size is supported by the hardware.
|
|
||||||
ctx->decode_width = avctx->coded_width;
|
|
||||||
ctx->decode_height = avctx->coded_height;
|
|
||||||
if (ctx->decode_width < constraints->min_width ||
|
|
||||||
ctx->decode_height < constraints->min_height ||
|
|
||||||
ctx->decode_width > constraints->max_width ||
|
|
||||||
ctx->decode_height >constraints->max_height) {
|
|
||||||
av_log(ctx, AV_LOG_ERROR, "VAAPI hardware does not support image "
|
|
||||||
"size %dx%d (constraints: width %d-%d height %d-%d).\n",
|
|
||||||
ctx->decode_width, ctx->decode_height,
|
|
||||||
constraints->min_width, constraints->max_width,
|
|
||||||
constraints->min_height, constraints->max_height);
|
|
||||||
err = AVERROR(EINVAL);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
av_hwframe_constraints_free(&constraints);
|
|
||||||
av_freep(&hwconfig);
|
|
||||||
|
|
||||||
// Decide how many reference frames we need. This might be doable more
|
|
||||||
// nicely based on the codec and input stream?
|
|
||||||
ctx->decode_surfaces = DEFAULT_SURFACES;
|
|
||||||
// For frame-threaded decoding, one additional surfaces is needed for
|
|
||||||
// each thread.
|
|
||||||
if (avctx->active_thread_type & FF_THREAD_FRAME)
|
|
||||||
ctx->decode_surfaces += avctx->thread_count;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
av_hwframe_constraints_free(&constraints);
|
|
||||||
av_freep(&hwconfig);
|
|
||||||
vaDestroyConfig(hwctx->display, ctx->va_config);
|
|
||||||
av_freep(&profile_list);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vaapi_decode_uninit(AVCodecContext *avctx)
|
|
||||||
{
|
|
||||||
InputStream *ist = avctx->opaque;
|
|
||||||
VAAPIDecoderContext *ctx = ist->hwaccel_ctx;
|
|
||||||
|
|
||||||
if (ctx) {
|
|
||||||
AVVAAPIDeviceContext *hwctx = ctx->device->hwctx;
|
|
||||||
|
|
||||||
if (ctx->va_context != VA_INVALID_ID) {
|
|
||||||
vaDestroyContext(hwctx->display, ctx->va_context);
|
|
||||||
ctx->va_context = VA_INVALID_ID;
|
|
||||||
}
|
|
||||||
if (ctx->va_config != VA_INVALID_ID) {
|
|
||||||
vaDestroyConfig(hwctx->display, ctx->va_config);
|
|
||||||
ctx->va_config = VA_INVALID_ID;
|
|
||||||
}
|
|
||||||
|
|
||||||
av_buffer_unref(&ctx->frames_ref);
|
|
||||||
av_buffer_unref(&ctx->device_ref);
|
|
||||||
av_free(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
av_buffer_unref(&ist->hw_frames_ctx);
|
|
||||||
|
|
||||||
ist->hwaccel_ctx = 0;
|
|
||||||
ist->hwaccel_uninit = 0;
|
|
||||||
ist->hwaccel_get_buffer = 0;
|
|
||||||
ist->hwaccel_retrieve_data = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int vaapi_decode_init(AVCodecContext *avctx)
|
|
||||||
{
|
|
||||||
InputStream *ist = avctx->opaque;
|
|
||||||
AVVAAPIDeviceContext *hwctx;
|
|
||||||
AVVAAPIFramesContext *avfc;
|
|
||||||
VAAPIDecoderContext *ctx;
|
|
||||||
VAStatus vas;
|
|
||||||
int err;
|
|
||||||
int loglevel = (ist->hwaccel_id != HWACCEL_VAAPI ? AV_LOG_VERBOSE
|
|
||||||
: AV_LOG_ERROR);
|
|
||||||
|
|
||||||
if (ist->hwaccel_ctx)
|
|
||||||
vaapi_decode_uninit(avctx);
|
|
||||||
|
|
||||||
// We have -hwaccel without -vaapi_device, so just initialise here with
|
|
||||||
// the device passed as -hwaccel_device (if -vaapi_device was passed, it
|
|
||||||
// will always have been called before now).
|
|
||||||
if (!hw_device_ctx) {
|
|
||||||
err = vaapi_device_init(ist->hwaccel_device);
|
|
||||||
if (err < 0)
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx = av_mallocz(sizeof(*ctx));
|
|
||||||
if (!ctx)
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
ctx->class = &vaapi_class;
|
|
||||||
|
|
||||||
ctx->device_ref = av_buffer_ref(hw_device_ctx);
|
|
||||||
ctx->device = (AVHWDeviceContext*)ctx->device_ref->data;
|
|
||||||
|
|
||||||
ctx->va_config = VA_INVALID_ID;
|
|
||||||
ctx->va_context = VA_INVALID_ID;
|
|
||||||
|
|
||||||
hwctx = ctx->device->hwctx;
|
|
||||||
|
|
||||||
ctx->output_format = ist->hwaccel_output_format;
|
|
||||||
|
|
||||||
err = vaapi_build_decoder_config(ctx, avctx,
|
|
||||||
ist->hwaccel_id != HWACCEL_VAAPI);
|
|
||||||
if (err < 0) {
|
|
||||||
av_log(ctx, loglevel, "No supported configuration for this codec.");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
avctx->pix_fmt = ctx->output_format;
|
|
||||||
|
|
||||||
ctx->frames_ref = av_hwframe_ctx_alloc(ctx->device_ref);
|
|
||||||
if (!ctx->frames_ref) {
|
|
||||||
av_log(ctx, loglevel, "Failed to create VAAPI frame context.\n");
|
|
||||||
err = AVERROR(ENOMEM);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->frames = (AVHWFramesContext*)ctx->frames_ref->data;
|
|
||||||
|
|
||||||
ctx->frames->format = AV_PIX_FMT_VAAPI;
|
|
||||||
ctx->frames->sw_format = ctx->decode_format;
|
|
||||||
ctx->frames->width = ctx->decode_width;
|
|
||||||
ctx->frames->height = ctx->decode_height;
|
|
||||||
ctx->frames->initial_pool_size = ctx->decode_surfaces;
|
|
||||||
|
|
||||||
err = av_hwframe_ctx_init(ctx->frames_ref);
|
|
||||||
if (err < 0) {
|
|
||||||
av_log(ctx, loglevel, "Failed to initialise VAAPI frame "
|
|
||||||
"context: %d\n", err);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
avfc = ctx->frames->hwctx;
|
|
||||||
|
|
||||||
vas = vaCreateContext(hwctx->display, ctx->va_config,
|
|
||||||
ctx->decode_width, ctx->decode_height,
|
|
||||||
VA_PROGRESSIVE,
|
|
||||||
avfc->surface_ids, avfc->nb_surfaces,
|
|
||||||
&ctx->va_context);
|
|
||||||
if (vas != VA_STATUS_SUCCESS) {
|
|
||||||
av_log(ctx, AV_LOG_ERROR, "Failed to create decode pipeline "
|
|
||||||
"context: %d (%s).\n", vas, vaErrorStr(vas));
|
|
||||||
err = AVERROR(EINVAL);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
av_log(ctx, AV_LOG_DEBUG, "VAAPI decoder (re)init complete.\n");
|
|
||||||
|
|
||||||
// We would like to set this on the AVCodecContext for use by whoever gets
|
|
||||||
// the frames from the decoder, but unfortunately the AVCodecContext we
|
|
||||||
// have here need not be the "real" one (H.264 makes many copies for
|
|
||||||
// threading purposes). To avoid the problem, we instead store it in the
|
|
||||||
// InputStream and propagate it from there.
|
|
||||||
ist->hw_frames_ctx = av_buffer_ref(ctx->frames_ref);
|
|
||||||
if (!ist->hw_frames_ctx) {
|
|
||||||
err = AVERROR(ENOMEM);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
ist->hwaccel_ctx = ctx;
|
|
||||||
ist->hwaccel_uninit = vaapi_decode_uninit;
|
|
||||||
ist->hwaccel_get_buffer = vaapi_get_buffer;
|
|
||||||
ist->hwaccel_retrieve_data = vaapi_retrieve_data;
|
|
||||||
|
|
||||||
ctx->decoder_vaapi_context.display = hwctx->display;
|
|
||||||
ctx->decoder_vaapi_context.config_id = ctx->va_config;
|
|
||||||
ctx->decoder_vaapi_context.context_id = ctx->va_context;
|
|
||||||
avctx->hwaccel_context = &ctx->decoder_vaapi_context;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
vaapi_decode_uninit(avctx);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static AVClass *vaapi_log = &vaapi_class;
|
|
||||||
|
|
||||||
av_cold int vaapi_device_init(const char *device)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
|
|
||||||
err = av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_VAAPI,
|
|
||||||
device, NULL, 0);
|
|
||||||
if (err < 0) {
|
|
||||||
av_log(&vaapi_log, AV_LOG_ERROR, "Failed to create a VAAPI device\n");
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
134
ffmpeg_vda.c
Normal file
134
ffmpeg_vda.c
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
* 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);
|
||||||
|
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;
|
||||||
|
}
|
||||||
288
ffmpeg_vdpau.c
288
ffmpeg_vdpau.c
@@ -18,21 +18,49 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <vdpau/vdpau.h>
|
||||||
|
#include <vdpau/vdpau_x11.h>
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
#include "ffmpeg.h"
|
#include "ffmpeg.h"
|
||||||
|
|
||||||
#include "libavcodec/vdpau.h"
|
#include "libavcodec/vdpau.h"
|
||||||
|
|
||||||
|
#include "libavutil/avassert.h"
|
||||||
#include "libavutil/buffer.h"
|
#include "libavutil/buffer.h"
|
||||||
#include "libavutil/frame.h"
|
#include "libavutil/frame.h"
|
||||||
#include "libavutil/hwcontext.h"
|
|
||||||
#include "libavutil/hwcontext_vdpau.h"
|
|
||||||
#include "libavutil/pixfmt.h"
|
#include "libavutil/pixfmt.h"
|
||||||
|
|
||||||
typedef struct VDPAUContext {
|
typedef struct VDPAUContext {
|
||||||
AVBufferRef *hw_frames_ctx;
|
Display *dpy;
|
||||||
|
|
||||||
|
VdpDevice device;
|
||||||
|
VdpDecoder decoder;
|
||||||
|
VdpGetProcAddress *get_proc_address;
|
||||||
|
|
||||||
|
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;
|
||||||
|
VdpVideoSurfaceGetParameters *video_surface_get_parameters;
|
||||||
|
VdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities *video_surface_query;
|
||||||
|
|
||||||
AVFrame *tmp_frame;
|
AVFrame *tmp_frame;
|
||||||
|
|
||||||
|
enum AVPixelFormat pix_fmt;
|
||||||
|
VdpYCbCrFormat vdpau_format;
|
||||||
} VDPAUContext;
|
} VDPAUContext;
|
||||||
|
|
||||||
|
int vdpau_api_ver = 2;
|
||||||
|
|
||||||
static void vdpau_uninit(AVCodecContext *s)
|
static void vdpau_uninit(AVCodecContext *s)
|
||||||
{
|
{
|
||||||
InputStream *ist = s->opaque;
|
InputStream *ist = s->opaque;
|
||||||
@@ -42,54 +70,140 @@ static void vdpau_uninit(AVCodecContext *s)
|
|||||||
ist->hwaccel_get_buffer = NULL;
|
ist->hwaccel_get_buffer = NULL;
|
||||||
ist->hwaccel_retrieve_data = NULL;
|
ist->hwaccel_retrieve_data = NULL;
|
||||||
|
|
||||||
av_buffer_unref(&ctx->hw_frames_ctx);
|
if (ctx->decoder_destroy)
|
||||||
|
ctx->decoder_destroy(ctx->decoder);
|
||||||
|
|
||||||
|
if (ctx->device_destroy)
|
||||||
|
ctx->device_destroy(ctx->device);
|
||||||
|
|
||||||
|
if (ctx->dpy)
|
||||||
|
XCloseDisplay(ctx->dpy);
|
||||||
|
|
||||||
av_frame_free(&ctx->tmp_frame);
|
av_frame_free(&ctx->tmp_frame);
|
||||||
|
|
||||||
av_freep(&ist->hwaccel_ctx);
|
av_freep(&ist->hwaccel_ctx);
|
||||||
av_freep(&s->hwaccel_context);
|
av_freep(&s->hwaccel_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void vdpau_release_buffer(void *opaque, uint8_t *data)
|
||||||
|
{
|
||||||
|
VdpVideoSurface surface = *(VdpVideoSurface*)data;
|
||||||
|
VDPAUContext *ctx = opaque;
|
||||||
|
|
||||||
|
ctx->video_surface_destroy(surface);
|
||||||
|
av_freep(&data);
|
||||||
|
}
|
||||||
|
|
||||||
static int vdpau_get_buffer(AVCodecContext *s, AVFrame *frame, int flags)
|
static int vdpau_get_buffer(AVCodecContext *s, AVFrame *frame, int flags)
|
||||||
{
|
{
|
||||||
InputStream *ist = s->opaque;
|
InputStream *ist = s->opaque;
|
||||||
VDPAUContext *ctx = ist->hwaccel_ctx;
|
VDPAUContext *ctx = ist->hwaccel_ctx;
|
||||||
|
VdpVideoSurface *surface;
|
||||||
|
VdpStatus err;
|
||||||
|
VdpChromaType chroma;
|
||||||
|
uint32_t width, height;
|
||||||
|
|
||||||
return av_hwframe_get_buffer(ctx->hw_frames_ctx, frame, 0);
|
av_assert0(frame->format == AV_PIX_FMT_VDPAU);
|
||||||
|
|
||||||
|
if (av_vdpau_get_surface_parameters(s, &chroma, &width, &height))
|
||||||
|
return AVERROR(ENOSYS);
|
||||||
|
|
||||||
|
surface = av_malloc(sizeof(*surface));
|
||||||
|
if (!surface)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
|
frame->buf[0] = av_buffer_create((uint8_t*)surface, sizeof(*surface),
|
||||||
|
vdpau_release_buffer, ctx,
|
||||||
|
AV_BUFFER_FLAG_READONLY);
|
||||||
|
if (!frame->buf[0]) {
|
||||||
|
av_freep(&surface);
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
// properly we should keep a pool of surfaces instead of creating
|
||||||
|
// them anew for each frame, but since we don't care about speed
|
||||||
|
// much in this code, we don't bother
|
||||||
|
err = ctx->video_surface_create(ctx->device, chroma, width, height,
|
||||||
|
surface);
|
||||||
|
if (err != VDP_STATUS_OK) {
|
||||||
|
av_log(NULL, AV_LOG_ERROR, "Error allocating a VDPAU video surface: %s\n",
|
||||||
|
ctx->get_error_string(err));
|
||||||
|
av_buffer_unref(&frame->buf[0]);
|
||||||
|
return AVERROR_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
frame->data[3] = (uint8_t*)(uintptr_t)*surface;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vdpau_retrieve_data(AVCodecContext *s, AVFrame *frame)
|
static int vdpau_retrieve_data(AVCodecContext *s, AVFrame *frame)
|
||||||
{
|
{
|
||||||
|
VdpVideoSurface surface = (VdpVideoSurface)(uintptr_t)frame->data[3];
|
||||||
InputStream *ist = s->opaque;
|
InputStream *ist = s->opaque;
|
||||||
VDPAUContext *ctx = ist->hwaccel_ctx;
|
VDPAUContext *ctx = ist->hwaccel_ctx;
|
||||||
int ret;
|
VdpStatus err;
|
||||||
|
int ret, chroma_type;
|
||||||
|
|
||||||
ret = av_hwframe_transfer_data(ctx->tmp_frame, frame, 0);
|
err = ctx->video_surface_get_parameters(surface, &chroma_type,
|
||||||
|
&ctx->tmp_frame->width,
|
||||||
|
&ctx->tmp_frame->height);
|
||||||
|
if (err != VDP_STATUS_OK) {
|
||||||
|
av_log(NULL, AV_LOG_ERROR, "Error getting surface parameters: %s\n",
|
||||||
|
ctx->get_error_string(err));
|
||||||
|
return AVERROR_UNKNOWN;
|
||||||
|
}
|
||||||
|
ctx->tmp_frame->format = ctx->pix_fmt;
|
||||||
|
|
||||||
|
ret = av_frame_get_buffer(ctx->tmp_frame, 32);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = av_frame_copy_props(ctx->tmp_frame, frame);
|
ctx->tmp_frame->width = frame->width;
|
||||||
if (ret < 0) {
|
ctx->tmp_frame->height = frame->height;
|
||||||
av_frame_unref(ctx->tmp_frame);
|
|
||||||
return ret;
|
err = ctx->video_surface_get_bits(surface, ctx->vdpau_format,
|
||||||
|
(void * const *)ctx->tmp_frame->data,
|
||||||
|
ctx->tmp_frame->linesize);
|
||||||
|
if (err != VDP_STATUS_OK) {
|
||||||
|
av_log(NULL, AV_LOG_ERROR, "Error retrieving frame data from VDPAU: %s\n",
|
||||||
|
ctx->get_error_string(err));
|
||||||
|
ret = AVERROR_UNKNOWN;
|
||||||
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctx->vdpau_format == VDP_YCBCR_FORMAT_YV12)
|
||||||
|
FFSWAP(uint8_t*, ctx->tmp_frame->data[1], ctx->tmp_frame->data[2]);
|
||||||
|
|
||||||
|
ret = av_frame_copy_props(ctx->tmp_frame, frame);
|
||||||
|
if (ret < 0)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
av_frame_unref(frame);
|
av_frame_unref(frame);
|
||||||
av_frame_move_ref(frame, ctx->tmp_frame);
|
av_frame_move_ref(frame, ctx->tmp_frame);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
av_frame_unref(ctx->tmp_frame);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const int vdpau_formats[][2] = {
|
||||||
|
{ VDP_YCBCR_FORMAT_YV12, AV_PIX_FMT_YUV420P },
|
||||||
|
{ VDP_YCBCR_FORMAT_NV12, AV_PIX_FMT_NV12 },
|
||||||
|
{ VDP_YCBCR_FORMAT_YUYV, AV_PIX_FMT_YUYV422 },
|
||||||
|
{ VDP_YCBCR_FORMAT_UYVY, AV_PIX_FMT_UYVY422 },
|
||||||
|
};
|
||||||
|
|
||||||
static int vdpau_alloc(AVCodecContext *s)
|
static int vdpau_alloc(AVCodecContext *s)
|
||||||
{
|
{
|
||||||
InputStream *ist = s->opaque;
|
InputStream *ist = s->opaque;
|
||||||
int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
|
int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
|
||||||
|
AVVDPAUContext *vdpau_ctx;
|
||||||
VDPAUContext *ctx;
|
VDPAUContext *ctx;
|
||||||
int ret;
|
const char *display, *vendor;
|
||||||
|
VdpStatus err;
|
||||||
AVBufferRef *device_ref = NULL;
|
int i;
|
||||||
AVHWDeviceContext *device_ctx;
|
|
||||||
AVVDPAUDeviceContext *device_hwctx;
|
|
||||||
AVHWFramesContext *frames_ctx;
|
|
||||||
|
|
||||||
ctx = av_mallocz(sizeof(*ctx));
|
ctx = av_mallocz(sizeof(*ctx));
|
||||||
if (!ctx)
|
if (!ctx)
|
||||||
@@ -104,48 +218,144 @@ static int vdpau_alloc(AVCodecContext *s)
|
|||||||
if (!ctx->tmp_frame)
|
if (!ctx->tmp_frame)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
ret = av_hwdevice_ctx_create(&device_ref, AV_HWDEVICE_TYPE_VDPAU,
|
ctx->dpy = XOpenDisplay(ist->hwaccel_device);
|
||||||
ist->hwaccel_device, NULL, 0);
|
if (!ctx->dpy) {
|
||||||
if (ret < 0)
|
av_log(NULL, loglevel, "Cannot open the X11 display %s.\n",
|
||||||
|
XDisplayName(ist->hwaccel_device));
|
||||||
goto fail;
|
goto fail;
|
||||||
device_ctx = (AVHWDeviceContext*)device_ref->data;
|
}
|
||||||
device_hwctx = device_ctx->hwctx;
|
display = XDisplayString(ctx->dpy);
|
||||||
|
|
||||||
ctx->hw_frames_ctx = av_hwframe_ctx_alloc(device_ref);
|
err = vdp_device_create_x11(ctx->dpy, XDefaultScreen(ctx->dpy), &ctx->device,
|
||||||
if (!ctx->hw_frames_ctx)
|
&ctx->get_proc_address);
|
||||||
|
if (err != VDP_STATUS_OK) {
|
||||||
|
av_log(NULL, loglevel, "VDPAU device creation on X11 display %s failed.\n",
|
||||||
|
display);
|
||||||
goto fail;
|
goto fail;
|
||||||
av_buffer_unref(&device_ref);
|
}
|
||||||
|
|
||||||
frames_ctx = (AVHWFramesContext*)ctx->hw_frames_ctx->data;
|
#define GET_CALLBACK(id, result) \
|
||||||
frames_ctx->format = AV_PIX_FMT_VDPAU;
|
do { \
|
||||||
frames_ctx->sw_format = s->sw_pix_fmt;
|
void *tmp; \
|
||||||
frames_ctx->width = s->coded_width;
|
err = ctx->get_proc_address(ctx->device, id, &tmp); \
|
||||||
frames_ctx->height = s->coded_height;
|
if (err != VDP_STATUS_OK) { \
|
||||||
|
av_log(NULL, loglevel, "Error getting the " #id " callback.\n"); \
|
||||||
|
goto fail; \
|
||||||
|
} \
|
||||||
|
ctx->result = tmp; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
ret = av_hwframe_ctx_init(ctx->hw_frames_ctx);
|
GET_CALLBACK(VDP_FUNC_ID_GET_ERROR_STRING, get_error_string);
|
||||||
if (ret < 0)
|
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);
|
||||||
|
GET_CALLBACK(VDP_FUNC_ID_VIDEO_SURFACE_GET_PARAMETERS, video_surface_get_parameters);
|
||||||
|
GET_CALLBACK(VDP_FUNC_ID_VIDEO_SURFACE_QUERY_GET_PUT_BITS_Y_CB_CR_CAPABILITIES,
|
||||||
|
video_surface_query);
|
||||||
|
|
||||||
|
for (i = 0; i < FF_ARRAY_ELEMS(vdpau_formats); i++) {
|
||||||
|
VdpBool supported;
|
||||||
|
err = ctx->video_surface_query(ctx->device, VDP_CHROMA_TYPE_420,
|
||||||
|
vdpau_formats[i][0], &supported);
|
||||||
|
if (err != VDP_STATUS_OK) {
|
||||||
|
av_log(NULL, loglevel,
|
||||||
|
"Error querying VDPAU surface capabilities: %s\n",
|
||||||
|
ctx->get_error_string(err));
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
if (supported)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == FF_ARRAY_ELEMS(vdpau_formats)) {
|
||||||
|
av_log(NULL, loglevel,
|
||||||
|
"No supported VDPAU format for retrieving the data.\n");
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
|
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;
|
goto fail;
|
||||||
|
|
||||||
if (av_vdpau_bind_context(s, device_hwctx->device, device_hwctx->get_proc_address, 0))
|
ctx->get_information_string(&vendor);
|
||||||
goto fail;
|
av_log(NULL, AV_LOG_VERBOSE, "Using VDPAU -- %s -- on X11 display %s, "
|
||||||
|
"to decode input stream #%d:%d.\n", vendor,
|
||||||
av_log(NULL, AV_LOG_VERBOSE, "Using VDPAU to decode input stream #%d:%d.\n",
|
display, ist->file_index, ist->st->index);
|
||||||
ist->file_index, ist->st->index);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
av_log(NULL, loglevel, "VDPAU init failed for stream #%d:%d.\n",
|
av_log(NULL, loglevel, "VDPAU init failed for stream #%d:%d.\n",
|
||||||
ist->file_index, ist->st->index);
|
ist->file_index, ist->st->index);
|
||||||
av_buffer_unref(&device_ref);
|
|
||||||
vdpau_uninit(s);
|
vdpau_uninit(s);
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int vdpau_old_init(AVCodecContext *s)
|
||||||
|
{
|
||||||
|
InputStream *ist = s->opaque;
|
||||||
|
int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
|
||||||
|
AVVDPAUContext *vdpau_ctx;
|
||||||
|
VDPAUContext *ctx;
|
||||||
|
VdpStatus err;
|
||||||
|
int profile, ret;
|
||||||
|
|
||||||
|
if (!ist->hwaccel_ctx) {
|
||||||
|
ret = vdpau_alloc(s);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
ctx = ist->hwaccel_ctx;
|
||||||
|
vdpau_ctx = s->hwaccel_context;
|
||||||
|
|
||||||
|
ret = av_vdpau_get_profile(s, &profile);
|
||||||
|
if (ret < 0) {
|
||||||
|
av_log(NULL, loglevel, "No known VDPAU decoder profile for this stream.\n");
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctx->decoder)
|
||||||
|
ctx->decoder_destroy(ctx->decoder);
|
||||||
|
|
||||||
|
err = ctx->decoder_create(ctx->device, profile,
|
||||||
|
s->coded_width, s->coded_height,
|
||||||
|
16, &ctx->decoder);
|
||||||
|
if (err != VDP_STATUS_OK) {
|
||||||
|
av_log(NULL, loglevel, "Error creating the VDPAU decoder: %s\n",
|
||||||
|
ctx->get_error_string(err));
|
||||||
|
return AVERROR_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
vdpau_ctx->decoder = ctx->decoder;
|
||||||
|
|
||||||
|
ist->hwaccel_get_buffer = vdpau_get_buffer;
|
||||||
|
ist->hwaccel_retrieve_data = vdpau_retrieve_data;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int vdpau_init(AVCodecContext *s)
|
int vdpau_init(AVCodecContext *s)
|
||||||
{
|
{
|
||||||
InputStream *ist = s->opaque;
|
InputStream *ist = s->opaque;
|
||||||
|
|
||||||
|
if (vdpau_api_ver == 1)
|
||||||
|
return vdpau_old_init(s);
|
||||||
|
|
||||||
if (!ist->hwaccel_ctx) {
|
if (!ist->hwaccel_ctx) {
|
||||||
int ret = vdpau_alloc(s);
|
int ret = vdpau_alloc(s);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
|||||||
@@ -1,202 +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 "config.h"
|
|
||||||
|
|
||||||
#if HAVE_UTGETOSTYPEFROMSTRING
|
|
||||||
#include <CoreServices/CoreServices.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "libavcodec/avcodec.h"
|
|
||||||
#if CONFIG_VDA
|
|
||||||
# include "libavcodec/vda.h"
|
|
||||||
#endif
|
|
||||||
#if CONFIG_VIDEOTOOLBOX
|
|
||||||
# include "libavcodec/videotoolbox.h"
|
|
||||||
#endif
|
|
||||||
#include "libavutil/imgutils.h"
|
|
||||||
#include "ffmpeg.h"
|
|
||||||
|
|
||||||
typedef struct VTContext {
|
|
||||||
AVFrame *tmp_frame;
|
|
||||||
} VTContext;
|
|
||||||
|
|
||||||
char *videotoolbox_pixfmt;
|
|
||||||
|
|
||||||
static int videotoolbox_retrieve_data(AVCodecContext *s, AVFrame *frame)
|
|
||||||
{
|
|
||||||
InputStream *ist = s->opaque;
|
|
||||||
VTContext *vt = 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;
|
|
||||||
char codec_str[32];
|
|
||||||
|
|
||||||
av_frame_unref(vt->tmp_frame);
|
|
||||||
|
|
||||||
switch (pixel_format) {
|
|
||||||
case kCVPixelFormatType_420YpCbCr8Planar: vt->tmp_frame->format = AV_PIX_FMT_YUV420P; break;
|
|
||||||
case kCVPixelFormatType_422YpCbCr8: vt->tmp_frame->format = AV_PIX_FMT_UYVY422; break;
|
|
||||||
case kCVPixelFormatType_32BGRA: vt->tmp_frame->format = AV_PIX_FMT_BGRA; break;
|
|
||||||
#ifdef kCFCoreFoundationVersionNumber10_7
|
|
||||||
case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange: vt->tmp_frame->format = AV_PIX_FMT_NV12; break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
av_get_codec_tag_string(codec_str, sizeof(codec_str), s->codec_tag);
|
|
||||||
av_log(NULL, AV_LOG_ERROR,
|
|
||||||
"%s: Unsupported pixel format: %s\n", codec_str, videotoolbox_pixfmt);
|
|
||||||
return AVERROR(ENOSYS);
|
|
||||||
}
|
|
||||||
|
|
||||||
vt->tmp_frame->width = frame->width;
|
|
||||||
vt->tmp_frame->height = frame->height;
|
|
||||||
ret = av_frame_get_buffer(vt->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(vt->tmp_frame->data, vt->tmp_frame->linesize,
|
|
||||||
(const uint8_t **)data, linesize, vt->tmp_frame->format,
|
|
||||||
frame->width, frame->height);
|
|
||||||
|
|
||||||
ret = av_frame_copy_props(vt->tmp_frame, frame);
|
|
||||||
CVPixelBufferUnlockBaseAddress(pixbuf, kCVPixelBufferLock_ReadOnly);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
av_frame_unref(frame);
|
|
||||||
av_frame_move_ref(frame, vt->tmp_frame);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void videotoolbox_uninit(AVCodecContext *s)
|
|
||||||
{
|
|
||||||
InputStream *ist = s->opaque;
|
|
||||||
VTContext *vt = ist->hwaccel_ctx;
|
|
||||||
|
|
||||||
ist->hwaccel_uninit = NULL;
|
|
||||||
ist->hwaccel_retrieve_data = NULL;
|
|
||||||
|
|
||||||
av_frame_free(&vt->tmp_frame);
|
|
||||||
|
|
||||||
if (ist->hwaccel_id == HWACCEL_VIDEOTOOLBOX) {
|
|
||||||
#if CONFIG_VIDEOTOOLBOX
|
|
||||||
av_videotoolbox_default_free(s);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
#if CONFIG_VDA
|
|
||||||
av_vda_default_free(s);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
av_freep(&ist->hwaccel_ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
int videotoolbox_init(AVCodecContext *s)
|
|
||||||
{
|
|
||||||
InputStream *ist = s->opaque;
|
|
||||||
int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
|
|
||||||
int ret = 0;
|
|
||||||
VTContext *vt;
|
|
||||||
|
|
||||||
vt = av_mallocz(sizeof(*vt));
|
|
||||||
if (!vt)
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
|
|
||||||
ist->hwaccel_ctx = vt;
|
|
||||||
ist->hwaccel_uninit = videotoolbox_uninit;
|
|
||||||
ist->hwaccel_retrieve_data = videotoolbox_retrieve_data;
|
|
||||||
|
|
||||||
vt->tmp_frame = av_frame_alloc();
|
|
||||||
if (!vt->tmp_frame) {
|
|
||||||
ret = AVERROR(ENOMEM);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ist->hwaccel_id == HWACCEL_VIDEOTOOLBOX) {
|
|
||||||
#if CONFIG_VIDEOTOOLBOX
|
|
||||||
if (!videotoolbox_pixfmt) {
|
|
||||||
ret = av_videotoolbox_default_init(s);
|
|
||||||
} else {
|
|
||||||
AVVideotoolboxContext *vtctx = av_videotoolbox_alloc_context();
|
|
||||||
CFStringRef pixfmt_str = CFStringCreateWithCString(kCFAllocatorDefault,
|
|
||||||
videotoolbox_pixfmt,
|
|
||||||
kCFStringEncodingUTF8);
|
|
||||||
#if HAVE_UTGETOSTYPEFROMSTRING
|
|
||||||
vtctx->cv_pix_fmt_type = UTGetOSTypeFromString(pixfmt_str);
|
|
||||||
#else
|
|
||||||
av_log(s, loglevel, "UTGetOSTypeFromString() is not available "
|
|
||||||
"on this platform, %s pixel format can not be honored from "
|
|
||||||
"the command line\n", videotoolbox_pixfmt);
|
|
||||||
#endif
|
|
||||||
ret = av_videotoolbox_default_init2(s, vtctx);
|
|
||||||
CFRelease(pixfmt_str);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
#if CONFIG_VDA
|
|
||||||
if (!videotoolbox_pixfmt) {
|
|
||||||
ret = av_vda_default_init(s);
|
|
||||||
} else {
|
|
||||||
AVVDAContext *vdactx = av_vda_alloc_context();
|
|
||||||
CFStringRef pixfmt_str = CFStringCreateWithCString(kCFAllocatorDefault,
|
|
||||||
videotoolbox_pixfmt,
|
|
||||||
kCFStringEncodingUTF8);
|
|
||||||
#if HAVE_UTGETOSTYPEFROMSTRING
|
|
||||||
vdactx->cv_pix_fmt_type = UTGetOSTypeFromString(pixfmt_str);
|
|
||||||
#else
|
|
||||||
av_log(s, loglevel, "UTGetOSTypeFromString() is not available "
|
|
||||||
"on this platform, %s pixel format can not be honored from "
|
|
||||||
"the command line\n", videotoolbox_pixfmt);
|
|
||||||
#endif
|
|
||||||
ret = av_vda_default_init2(s, vdactx);
|
|
||||||
CFRelease(pixfmt_str);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
if (ret < 0) {
|
|
||||||
av_log(NULL, loglevel,
|
|
||||||
"Error creating %s decoder.\n", ist->hwaccel_id == HWACCEL_VIDEOTOOLBOX ? "Videotoolbox" : "VDA");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
fail:
|
|
||||||
videotoolbox_uninit(s);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user