Compare commits

..

5 Commits
n2.7.3 ... n2.3

Author SHA1 Message Date
Timothy Gu
bef4d9bf87 RELEASE_NOTES: update
Signed-off-by: Timothy Gu <timothygu99@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2014-07-16 02:42:16 +02:00
Michael Niedermayer
bc4f6ae88e Changelog: change "version <next>" to "version 2.3"
Found-by: jamrial
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit faafd1e4f1)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2014-07-16 02:09:50 +02:00
Michael Niedermayer
2678b25099 doc/APIchanges: update
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit 13a72d9b08)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2014-07-16 02:07:02 +02:00
Michael Niedermayer
e322496054 RELEASE_NOTES: update version numbers
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2014-07-16 02:01:14 +02:00
Michael Niedermayer
7fa72ff19c update for FFmpeg 2.3
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2014-07-16 01:45:34 +02:00
2646 changed files with 73078 additions and 185972 deletions

1
.gitattributes vendored
View File

@@ -1 +0,0 @@
*.pnm -diff -text

5
.gitignore vendored
View File

@@ -36,11 +36,9 @@
/doc/avoptions_codec.texi /doc/avoptions_codec.texi
/doc/avoptions_format.texi /doc/avoptions_format.texi
/doc/doxy/html/ /doc/doxy/html/
/doc/examples/avio_list_dir
/doc/examples/avio_reading /doc/examples/avio_reading
/doc/examples/decoding_encoding /doc/examples/decoding_encoding
/doc/examples/demuxing_decoding /doc/examples/demuxing_decoding
/doc/examples/extract_mvs
/doc/examples/filter_audio /doc/examples/filter_audio
/doc/examples/filtering_audio /doc/examples/filtering_audio
/doc/examples/filtering_video /doc/examples/filtering_video
@@ -63,9 +61,7 @@
/tests/audiogen /tests/audiogen
/tests/base64 /tests/base64
/tests/data/ /tests/data/
/tests/pixfmts.mak
/tests/rotozoom /tests/rotozoom
/tests/test_copy.ffmeta
/tests/tiny_psnr /tests/tiny_psnr
/tests/tiny_ssim /tests/tiny_ssim
/tests/videogen /tests/videogen
@@ -84,7 +80,6 @@
/tools/pktdumper /tools/pktdumper
/tools/probetest /tools/probetest
/tools/qt-faststart /tools/qt-faststart
/tools/sidxindex
/tools/trasher /tools/trasher
/tools/seek_print /tools/seek_print
/tools/uncoded_frame /tools/uncoded_frame

291
Changelog
View File

@@ -1,292 +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 2.7.3:
- rtmpcrypt: Do the xtea decryption in little endian mode
- Update versions for 2.7.3
- avformat/matroskadec: Check subtitle stream before dereferencing
- avformat/utils: Do not init parser if probing is unfinished
- avcodec/jpeg2000dec: Fix potential integer overflow with tile dimensions
- avcodec/jpeg2000dec: Check SIZ dimensions to be within the supported range
- avcodec/jpeg2000: Check comp coords to be within the supported size
- avcodec/jpeg2000: Use av_image_check_size() in ff_jpeg2000_init_component()
- avcodec/wmaprodec: Check for overread in decode_packet()
- avcodec/smacker: Check that the data size is a multiple of a sample vector
- avcodec/takdec: Skip last p2 sample (which is unused)
- avcodec/dxtory: Fix input size check in dxtory_decode_v1_410()
- avcodec/dxtory: Fix input size check in dxtory_decode_v1_420()
- avcodec/error_resilience: avoid accessing previous or next frames tables beyond height
- avcodec/dpx: Move need_align to act per line
- avcodec/flashsv: Check size before updating it
- avcodec/ivi: Check image dimensions
- avcodec/utils: Better check for channels in av_get_audio_frame_duration()
- avcodec/jpeg2000dec: Check for duplicate SIZ marker
- tests/fate/avformat: Fix fate-lavf
- doc/ffmpeg: Clarify that the sdp_file option requires an rtp output.
- ffmpeg: Don't try and write sdp info if none of the outputs had an rtp format.
- apng: use correct size for output buffer
- jvdec: avoid unsigned overflow in comparison
- avcodec/hevc_ps: Check chroma_format_idc
- avcodec/jpeg2000dec: Clip all tile coordinates
- avcodec/microdvddec: Check for string end in 'P' case
- avcodec/dirac_parser: Fix undefined memcpy() use
- avformat/xmv: Discard remainder of packet on error
- avformat/xmv: factor return check out of if/else
- avcodec/mpeg12dec: Do not call show_bits() with invalid bits
- libavutil/channel_layout: Check strtol*() for failure
- avcodec/ffv1dec: Check for 0 quant tables
- avcodec/mjpegdec: Reinitialize IDCT on BPP changes
- avcodec/mjpegdec: Check index in ljpeg_decode_yuv_scan() before using it
- avutil/file_open: avoid file handle inheritance on Windows
- avcodec/h264_slice: Disable slice threads if there are multiple access units in a packet
- opusdec: Don't run vector_fmul_scalar on zero length arrays
- avcodec/ffv1: Initialize vlc_state on allocation
- avcodec/ffv1dec: update progress in case of broken pointer chains
- avcodec/ffv1dec: Clear slice coordinates if they are invalid or slice header decoding fails for other reasons
- avformat/httpauth: Add space after commas in HTTP/RTSP auth header
- avcodec/x86/sbrdsp: Fix using uninitialized upper 32bit of noise
- avcodec/ffv1dec: Fix off by 1 error in quant_table_count check
- avcodec/ffv1dec: Explicitly check read_quant_table() return value
- avcodec/rangecoder: Check e
- avutil/log: fix zero length gnu_printf format string warning
- lavf/webvttenc: Require webvtt file to contain exactly one WebVTT stream.
- avcodec/mjpegdec: Fix decoding RGBA RCT LJPEG
- avfilter/af_asyncts: use llabs for int64_t
- avcodec/g2meet: Also clear tile dimensions on header_fail
- avcodec/g2meet: Fix potential overflow in tile dimensions check
- avcodec/svq1dec: Check init_get_bits8() for failure
- avcodec/tta: Check init_get_bits8() for failure
- avcodec/vp3: Check init_get_bits8() for failure
- swresample/swresample: Fix integer overflow in seed calculation
- avformat/mov: Fix integer overflow in FFABS
- avutil/common: Add FFNABS()
- avutil/common: Document FFABS() corner case
- avformat/dump: Fix integer overflow in aspect ratio calculation
- avformat/mxg: Use memmove()
- avcodec/truemotion1: Check for even width
- avcodec/mpeg12dec: Set dimensions in mpeg1_decode_sequence() only in absence of errors
- avcodec/libopusenc: Fix infinite loop on flushing after 0 input
- avformat/hevc: Check num_long_term_ref_pics_sps to avoid potentially long loops
- avformat/hevc: Fix parsing errors
- ffmpeg: Use correct codec_id for av_parser_change() check
- ffmpeg: Check av_parser_change() for failure
- ffmpeg: Check for RAWVIDEO and do not relay only on AVFMT_RAWPICTURE
- ffmpeg: check avpicture_fill() return value
- avformat/mux: Update sidedata in ff_write_chained()
- avcodec/flashsvenc: Correct max dimension in error message
- avcodec/svq1enc: Check dimensions
- avcodec/dcaenc: clear bitstream end
- libavcodec/aacdec_template: Use init_get_bits8() in aac_decode_frame()
- rawdec: fix mjpeg probing buffer size check
- rawdec: fix mjpeg probing
- configure: loongson disable expensive optimizations in gcc O3 optimization
- videodsp: don't overread edges in vfix3 emu_edge.
- avformat/mp3dec: improve junk skipping heuristic
- avformat/hls: add support for EXT-X-MAP
- avformat/hls: fix segment selection regression on track changes of live streams
- lavf/matroskadec: Fully parse and repack MP3 packets
- avcodec/h264_mp4toannexb_bsf: Reorder operations in nal_size check
- avformat/oggenc: Check segments_count for headers too
- avformat/segment: atomically update list if possible
- avformat/avidec: Workaround broken initial frame
- hevc: properly handle no_rasl_output_flag when removing pictures from the DPB
- hevc: fix wpp threading deadlock.
- avcodec/ffv1: separate slice_count from max_slice_count
- lavf/img2dec: Fix memory leak
- avcodec/mp3: fix skipping zeros
- avformat/srtdec: make sure we probe a number
- avformat/srtdec: more lenient first line probing
- doc: mention libavcodec can decode Opus natively
- avcodec/ffv1enc: fix assertion failure with unset bits per raw sample
- MAINTAINERS: Remove myself as leader
- mips/hevcdsp: fix string concatenation on macros
version 2.7.2:
- imc: use correct position for flcoeffs2 calculation
- hevc: check slice address length
- snow: remove an obsolete av_assert2
- webp: fix infinite loop in webp_decode_frame
- wavpack: limit extra_bits to 32 and use get_bits_long
- ffmpeg: only count got_output/errors in decode_error_stat
- ffmpeg: exit_on_error if decoding a packet failed
- pthread_frame: forward error codes when flushing
- huffyuvdec: validate image size
- wavpack: use get_bits_long to read up to 32 bits
- nutdec: check maxpos in read_sm_data before returning success
- s302m: fix arithmetic exception
- vc1dec: use get_bits_long and limit the read bits to 32
- mpegaudiodec: copy AVFloatDSPContext from first context to all contexts
- avcodec/vp8: Check buffer size in vp8_decode_frame_header()
- avcodec/vp8: Fix null pointer dereference in ff_vp8_decode_free()
- avcodec/diracdec: Check for hpel_base allocation failure
- avcodec/rv34: Clear pointers in ff_rv34_decode_init_thread_copy()
- avfilter/af_aresample: Check ff_all_* for allocation failures
- avcodec/pthread_frame: clear priv_data, avoid stale pointer in error case
- swscale/utils: Clear pix buffers
- avutil/fifo: Fix the case where func() returns less bytes than requested in av_fifo_generic_write()
- ffmpeg: Fix cleanup after failed allocation of output_files
- avformat/mov: Fix deallocation when MOVStreamContext failed to allocate
- ffmpeg: Fix crash with ost->last_frame allocation failure
- ffmpeg: Fix cleanup with ost = NULL
- avcodec/pthread_frame: check avctx on deallocation
- avcodec/sanm: Reset sizes in destroy_buffers()
- avcodec/alac: Clear pointers in allocate_buffers()
- bytestream2: set the reader to the end when reading more than available
- avcodec/utils: use a minimum 32pixel width in avcodec_align_dimensions2() for H.264
- avcodec/mpegvideo: Clear pointers in ff_mpv_common_init()
- oggparsedirac: check return value of init_get_bits
- wmalosslessdec: reset frame->nb_samples on packet loss
- wmalosslessdec: avoid reading 0 bits with get_bits
- Put a space between string literals and macros.
- avcodec/rawenc: Use ff_alloc_packet() instead of ff_alloc_packet2()
- avcodec/aacsbr: check that the element type matches before applying SBR
- avcodec/h264_slice: Use w/h from the AVFrame instead of mb_w/h
- vp9/update_prob: prevent out of bounds table read
- avfilter/vf_transpose: Fix rounding error
- avcodec/h264_refs: discard mismatching references
- avcodec/mjpegdec: Fix small picture upscale
- avcodec/pngdec: Check values before updating context in decode_fctl_chunk()
- avcodec/pngdec: Copy IHDR & plte state from last thread
- avcodec/pngdec: Require a IHDR chunk before fctl
- avcodec/pngdec: Only allow one IHDR chunk
- wmavoice: limit wmavoice_decode_packet return value to packet size
- swscale/swscale_unscaled: Fix rounding difference with RGBA output between little and big endian
- ffmpeg: Do not use the data/size of a bitstream filter after failure
- swscale/x86/rgb2rgb_template: fix signedness of v in shuffle_bytes_2103_{mmx,mmxext}
- vda: unlock the pixel buffer base address.
- swscale/rgb2rgb_template: Fix signedness of v in shuffle_bytes_2103_c()
- swscale/rgb2rgb_template: Implement shuffle_bytes_0321_c and fix shuffle_bytes_2103_c on BE
- swscale/rgb2rgb_template: Disable shuffle_bytes_2103_c on big endian
- swr: Remember previously set int_sample_format from user
- swresample: soxr implementation for swr_get_out_samples()
- avformat/swfdec: Do not error out on pixel format changes
- ffmpeg_opt: Fix forcing fourccs
- configure: Check for x265_api_get
- swscale/x86/rgb2rgb_template: don't call emms on sse2/avx functions
- swscale/x86/rgb2rgb_template: add missing xmm clobbers
- library.mak: Workaround SDL redefining main and breaking fate tests on mingw
- vaapi_h264: fix RefPicList[] field flags.
version 2.7.1:
- postproc: fix unaligned access
- avformat: clarify what package needs to be compiled with SSL support
- avcodec/libx264: Avoid reconfig on equivalent aspect ratios
- avcodec/flacenc: Fix Invalid Rice order
- tls_gnutls: fix hang on disconnection
- avcodec/hevc_ps: Only discard overread VPS if a previous is available
- ffmpeg: Free last_frame instead of just unref
- avcodec/ffv1enc: fix bps for >8bit yuv when not explicitly set
- avio: fix potential crashes when combining ffio_ensure_seekback + crc
- examples/demuxing_decoding: use properties from frame instead of video_dec_ctx
- h264: er: Copy from the previous reference only if compatible
- doc: fix spelling errors
- configure: only disable VSX for !ppc64el
- ffmpeg_opt: Check for localtime() failure
- avformat/singlejpeg: fix standalone compilation
- configure: Disable VSX on unspecified / generic CPUs
- avformat: Fix bug in parse_rps for HEVC.
- takdec: ensure chan2 is a valid channel index
- avcodec/h264_slice: Use AVFrame dimensions for grayscale handling
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:
- nvenc encoder
- 10bit spp filter
- colorlevels filter
- RIFX format for *.wav files
- RTP/mpegts muxer
- non continuous cache protocol support
- tblend filter
- cropdetect support for non 8bpp, absolute (if limit >= 1) and relative (if limit < 1.0) threshold
- Camellia symmetric block cipher
- OpenH264 encoder wrapper
- VOC seeking support
- Closed caption Decoder
- fspp, uspp, pp7 MPlayer postprocessing filters ported to native filters
- showpalette filter
- Twofish symmetric block cipher
- Support DNx100 (960x720@8)
- eq2 filter ported from libmpcodecs as eq filter
- removed libmpcodecs
- Changed default DNxHD colour range in QuickTime .mov derivatives to mpeg range
- ported softpulldown filter from libmpcodecs as repeatfields filter
- dcshift filter
- RTP depacketizer for loss tolerant payload format for MP3 audio (RFC 5219)
- RTP depacketizer for AC3 payload format (RFC 4184)
- palettegen and paletteuse filters
- VP9 RTP payload format (draft 0) experimental depacketizer
- RTP depacketizer for DV (RFC 6469)
- DXVA2-accelerated HEVC decoding
- AAC ELD 480 decoding
- Intel QSV-accelerated H.264 decoding
- DSS SP decoder and DSS demuxer
- Fix stsd atom corruption in DNxHD QuickTimes
- Canopus HQX decoder
- RTP depacketization of T.140 text (RFC 4103)
- Port MIPS optimizations to 64-bit
version 2.5:
- HEVC/H.265 RTP payload format (draft v6) packetizer
- SUP/PGS subtitle demuxer
- ffprobe -show_pixel_formats option
- CAST128 symmetric block cipher, ECB mode
- STL subtitle demuxer and decoder
- libutvideo YUV 4:2:2 10bit support
- XCB-based screen-grabber
- UDP-Lite support (RFC 3828)
- xBR scaling filter
- AVFoundation screen capturing support
- ffserver supports codec private options
- creating DASH compatible fragmented MP4, MPEG-DASH segmenting muxer
- WebP muxer with animated WebP support
- zygoaudio decoding support
- APNG demuxer
- postproc visualization support
version 2.4:
- Icecast protocol
- ported lenscorrection filter from frei0r filter
- large optimizations in dctdnoiz to make it usable
- ICY metadata are now requested by default with the HTTP protocol
- support for using metadata in stream specifiers in fftools
- LZMA compression support in TIFF decoder
- H.261 RTP payload format (RFC 4587) depacketizer and experimental packetizer
- HEVC/H.265 RTP payload format (draft v6) depacketizer
- added codecview filter to visualize information exported by some codecs
- Matroska 3D support thorugh side data
- HTML generation using texi2html is deprecated in favor of makeinfo/texi2any
- silenceremove filter
version 2.3: version 2.3:
- AC3 fixed-point decoding - AC3 fixed-point decoding
- shuffleplanes filter - shuffleplanes filter
@@ -310,7 +24,7 @@ version 2.3:
- libbs2b-based stereo-to-binaural audio filter - libbs2b-based stereo-to-binaural audio filter
- libx264 reference frames count limiting depending on level - libx264 reference frames count limiting depending on level
- native Opus decoder - native Opus decoder
- display matrix export and rotation API - display matrix export and rotation api
- WebVTT encoder - WebVTT encoder
- showcqt multimedia filter - showcqt multimedia filter
- zoompan filter - zoompan filter
@@ -352,7 +66,6 @@ version 2.2:
- libx265 encoder - libx265 encoder
- dejudder filter - dejudder filter
- Autodetect VDA like all other hardware accelerations - Autodetect VDA like all other hardware accelerations
- aliases and defaults for Ogg subtypes (opus, spx)
version 2.1: version 2.1:
@@ -759,7 +472,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

View File

@@ -1,75 +1,67 @@
#FFmpeg: #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
files have MIT/X11/BSD-style licenses. In combination the LGPL v2.1+ applies to files have MIT/X11/BSD-style licenses. In combination the LGPL v2.1+ applies to
FFmpeg. FFmpeg.
Some optional parts of FFmpeg are licensed under the GNU General Public License Some optional parts of FFmpeg are licensed under the GNU General Public License
version 2 or later (GPL v2+). See the file `COPYING.GPLv2` for details. None of version 2 or later (GPL v2+). See the file COPYING.GPLv2 for details. None of
these parts are used by default, you have to explicitly pass `--enable-gpl` to these parts are used by default, you have to explicitly pass --enable-gpl to
configure to activate them. In this case, FFmpeg's license changes to GPL v2+. 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
- libmpcodecs
- optional x86 optimizations in the files - optional x86 optimizations in the files
- `libavcodec/x86/flac_dsp_gpl.asm` libavcodec/x86/idct_mmx.c
- `libavcodec/x86/idct_mmx.c`
- libutvideo encoding/decoding wrappers in - libutvideo encoding/decoding wrappers in
`libavcodec/libutvideo*.cpp` libavcodec/libutvideo*.cpp
- the X11 grabber in `libavdevice/x11grab.c` - the X11 grabber in libavdevice/x11grab.c
- the swresample test app in - the swresample test app in
`libswresample/swresample-test.c` libswresample/swresample-test.c
- the `texi2pod.pl` tool - the texi2pod.pl tool
- 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_decimate.c
- `vf_delogo.c` - vf_delogo.c
- `vf_eq.c` - vf_geq.c
- `vf_find_rect.c` - vf_histeq.c
- `vf_fspp.c` - vf_hqdn3d.c
- `vf_geq.c` - vf_kerndeint.c
- `vf_histeq.c` - vf_mcdeint.c
- `vf_hqdn3d.c` - vf_mp.c
- `vf_interlace.c` - vf_owdenoise.c
- `vf_kerndeint.c` - vf_perspective.c
- `vf_mcdeint.c` - vf_phase.c
- `vf_mpdecimate.c` - vf_pp.c
- `vf_owdenoise.c` - vf_pullup.c
- `vf_perspective.c` - vf_sab.c
- `vf_phase.c` - vf_smartblur.c
- `vf_pp.c` - vf_spp.c
- `vf_pp7.c` - vf_stereo3d.c
- `vf_pullup.c` - vf_super2xsai.c
- `vf_sab.c` - vf_tinterlace.c
- `vf_smartblur.c` - vsrc_mptestsrc.c
- `vf_repeatfields.c`
- `vf_spp.c`
- `vf_stereo3d.c`
- `vf_super2xsai.c`
- `vf_tinterlace.c`
- `vf_uspp.c`
- `vsrc_mptestsrc.c`
Should you, for whatever reason, prefer to use version 3 of the (L)GPL, then Should you, for whatever reason, prefer to use version 3 of the (L)GPL, then
the configure parameter `--enable-version3` will activate this licensing option the configure parameter --enable-version3 will activate this licensing option
for you. Read the file `COPYING.LGPLv3` or, if you have enabled GPL parts, for you. Read the file COPYING.LGPLv3 or, if you have enabled GPL parts,
`COPYING.GPLv3` to learn the exact legal terms that apply in this case. COPYING.GPLv3 to learn the exact legal terms that apply in this case.
There are a handful of files under other licensing terms, namely: There are a handful of files under other licensing terms, namely:
* The files `libavcodec/jfdctfst.c`, `libavcodec/jfdctint_template.c` and * The files libavcodec/jfdctfst.c, libavcodec/jfdctint_template.c and
`libavcodec/jrevdct.c` are taken from libjpeg, see the top of the files for libavcodec/jrevdct.c are taken from libjpeg, see the top of the files for
licensing details. Specifically note that you must credit the IJG in the licensing details. Specifically note that you must credit the IJG in the
documentation accompanying your program if you only distribute executables. documentation accompanying your program if you only distribute executables.
You must also indicate any changes including additions and deletions to You must also indicate any changes including additions and deletions to
those three files in the documentation. those three files in the documentation.
* `tests/reference.pnm` is under the expat license.
external libraries external libraries
@@ -90,14 +82,13 @@ The following libraries are under GPL:
- libx265 - libx265
- libxavs - libxavs
- libxvid - libxvid
When combining them with FFmpeg, FFmpeg needs to be licensed as GPL as well by When combining them with FFmpeg, FFmpeg needs to be licensed as GPL as well by
passing `--enable-gpl` to configure. passing --enable-gpl to configure.
The OpenCORE and VisualOn libraries are under the Apache License 2.0. That The OpenCORE and VisualOn libraries are under the Apache License 2.0. That
license is incompatible with the LGPL v2.1 and the GPL v2, but not with 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
---------------------- ----------------------
@@ -105,7 +96,7 @@ incompatible libraries
The Fraunhofer AAC library, FAAC and aacplus are under licenses which The Fraunhofer AAC library, FAAC and aacplus are under licenses which
are incompatible with the GPLv2 and v3. We do not know for certain if their are incompatible with the GPLv2 and v3. We do not know for certain if their
licenses are compatible with the LGPL. licenses are compatible with the LGPL.
If you wish to enable these libraries, pass `--enable-nonfree` to configure. If you wish to enable these libraries, pass --enable-nonfree to configure.
But note that if you enable any of these libraries the resulting binary will But note that if you enable any of these libraries the resulting binary will
be under a complex license mix that is more restrictive than the LGPL and that be under a complex license mix that is more restrictive than the LGPL and that
may result in additional obligations. It is possible that these may result in additional obligations. It is possible that these

View File

@@ -14,6 +14,7 @@ patches and related discussions.
Project Leader Project Leader
============== ==============
Michael Niedermayer
final design decisions final design decisions
@@ -44,7 +45,7 @@ Miscellaneous Areas
documentation Stefano Sabatini, Mike Melanson, Timothy Gu documentation Stefano Sabatini, Mike Melanson, Timothy Gu
build system (configure, makefiles) Diego Biurrun, Mans Rullgard build system (configure, makefiles) Diego Biurrun, Mans Rullgard
project server Árpád Gereöffy, Michael Niedermayer, Reimar Doeffinger, Alexander Strasser, Lou Logan 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
release management Michael Niedermayer release management Michael Niedermayer
@@ -53,12 +54,12 @@ release management Michael Niedermayer
Communication Communication
============= =============
website Deby Barbara Lepage website Robert Swain
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 Michael Niedermayer, 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
@@ -155,7 +156,6 @@ Codecs:
celp_filters.* Vitor Sessak celp_filters.* Vitor Sessak
cinepak.c Roberto Togni cinepak.c Roberto Togni
cinepakenc.c Rl / Aetey G.T. AB cinepakenc.c Rl / Aetey G.T. AB
ccaption_dec.c Anshul Maheshwari
cljr Alex Beregszaszi cljr Alex Beregszaszi
cllc.c Derek Buitenhuis cllc.c Derek Buitenhuis
cook.c, cookdata.h Benjamin Larsson cook.c, cookdata.h Benjamin Larsson
@@ -165,7 +165,6 @@ Codecs:
dca.c Kostya Shishkov, Benjamin Larsson dca.c Kostya Shishkov, Benjamin Larsson
dnxhd* Baptiste Coudurier dnxhd* Baptiste Coudurier
dpcm.c Mike Melanson dpcm.c Mike Melanson
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 dxa.c Kostya Shishkov
@@ -227,7 +226,6 @@ Codecs:
msvideo1.c Mike Melanson msvideo1.c Mike Melanson
nellymoserdec.c Benjamin Larsson nellymoserdec.c Benjamin Larsson
nuv.c Reimar Doeffinger nuv.c Reimar Doeffinger
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
@@ -311,7 +309,6 @@ libavdevice
avfoundation.m Thilo Borgmann avfoundation.m Thilo Borgmann
decklink* Deti Fliegl
dshow.c Roger Pack (CC rogerdpack@gmail.com) dshow.c Roger Pack (CC rogerdpack@gmail.com)
fbdev_enc.c Lukasz Marek fbdev_enc.c Lukasz Marek
gdigrab.c Roger Pack (CC rogerdpack@gmail.com) gdigrab.c Roger Pack (CC rogerdpack@gmail.com)
@@ -322,7 +319,7 @@ libavdevice
pulse_audio_enc.c Lukasz Marek pulse_audio_enc.c Lukasz Marek
qtkit.m Thilo Borgmann qtkit.m Thilo Borgmann
sdl Stefano Sabatini sdl Stefano Sabatini
v4l2.c Giorgio Vazzana v4l2.c Luca Abeni
vfwcap.c Ramiro Polla vfwcap.c Ramiro Polla
xv.c Lukasz Marek xv.c Lukasz Marek
@@ -346,7 +343,6 @@ Filters:
af_compand.c Paul B Mahol af_compand.c Paul B Mahol
af_ladspa.c Paul B Mahol af_ladspa.c Paul B Mahol
af_pan.c Nicolas George af_pan.c Nicolas George
af_silenceremove.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
@@ -357,9 +353,7 @@ Filters:
vf_extractplanes.c Paul B Mahol vf_extractplanes.c Paul B Mahol
vf_histogram.c Paul B Mahol vf_histogram.c Paul B Mahol
vf_hqx.c Clément Bœsch vf_hqx.c Clément Bœsch
vf_idet.c Pascal Massimino
vf_il.c Paul B Mahol vf_il.c Paul B Mahol
vf_lenscorrection.c Daniel Oberhoff
vf_mergeplanes.c Paul B Mahol vf_mergeplanes.c Paul B Mahol
vf_psnr.c Paul B Mahol vf_psnr.c Paul B Mahol
vf_scale.c Michael Niedermayer vf_scale.c Michael Niedermayer
@@ -388,7 +382,6 @@ Muxers/Demuxers:
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 ape.c Kostya Shishkov
apngdec.c Benoit Fouet
ass* Aurelien Jacobs ass* Aurelien Jacobs
astdec.c Paul B Mahol astdec.c Paul B Mahol
astenc.c James Almer astenc.c James Almer
@@ -401,7 +394,6 @@ 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, Michael Niedermayer
dtshddec.c Paul B Mahol dtshddec.c Paul B Mahol
dv.c Roman Shaposhnik dv.c Roman Shaposhnik
dxa.c Kostya Shishkov dxa.c Kostya Shishkov
@@ -466,19 +458,12 @@ Muxers/Demuxers:
rmdec.c, rmenc.c Ronald S. Bultje, Kostya Shishkov rmdec.c, rmenc.c Ronald S. Bultje, Kostya Shishkov
rtmp* Kostya Shishkov rtmp* Kostya Shishkov
rtp.c, rtpenc.c Martin Storsjo rtp.c, rtpenc.c Martin Storsjo
rtpdec_ac3.* Gilles Chanteperdrix
rtpdec_dv.* Thomas Volkert
rtpdec_h261.*, rtpenc_h261.* Thomas Volkert
rtpdec_hevc.*, rtpenc_hevc.* Thomas Volkert
rtpdec_mpa_robust.* Gilles Chanteperdrix
rtpdec_asf.* Ronald S. Bultje rtpdec_asf.* Ronald S. Bultje
rtpdec_vp9.c Thomas Volkert
rtpenc_mpv.*, rtpenc_aac.* Martin Storsjo rtpenc_mpv.*, rtpenc_aac.* Martin Storsjo
rtsp.c Luca Barbato 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
siff.c Kostya Shishkov siff.c Kostya Shishkov
smacker.c Kostya Shishkov smacker.c Kostya Shishkov
smjpeg* Paul B Mahol smjpeg* Paul B Mahol
@@ -505,7 +490,6 @@ Protocols:
libssh.c Lukasz Marek libssh.c Lukasz Marek
mms*.c Ronald S. Bultje mms*.c Ronald S. Bultje
udp.c Luca Abeni udp.c Luca Abeni
icecast.c Marvin Scholz
libswresample libswresample
@@ -544,11 +528,9 @@ x86 Michael Niedermayer
Releases Releases
======== ========
2.7 Michael Niedermayer
2.6 Michael Niedermayer
2.5 Michael Niedermayer
2.4 Michael Niedermayer
2.2 Michael Niedermayer 2.2 Michael Niedermayer
2.1 Michael Niedermayer
1.2 Michael Niedermayer
If you want to maintain an older release, please contact us If you want to maintain an older release, please contact us

View File

@@ -32,7 +32,6 @@ OBJS-ffmpeg += ffmpeg_opt.o ffmpeg_filter.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-$(HAVE_DXVA2_LIB) += ffmpeg_dxva2.o
OBJS-ffmpeg-$(CONFIG_VDA) += ffmpeg_vda.o OBJS-ffmpeg-$(CONFIG_VDA) += ffmpeg_vda.o
OBJS-ffserver += ffserver_config.o
TESTTOOLS = audiogen videogen rotozoom tiny_psnr tiny_ssim base64 TESTTOOLS = audiogen videogen rotozoom tiny_psnr tiny_ssim base64
HOSTPROGS := $(TESTTOOLS:%=tests/%) doc/print_options HOSTPROGS := $(TESTTOOLS:%=tests/%) doc/print_options
@@ -64,7 +63,7 @@ FF_DEP_LIBS := $(DEP_LIBS)
all: $(AVPROGS) all: $(AVPROGS)
$(TOOLS): %$(EXESUF): %.o $(EXEOBJS) $(TOOLS): %$(EXESUF): %.o $(EXEOBJS)
$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(LD) $(LDFLAGS) $(LD_O) $^ $(ELIBS)
tools/cws2fws$(EXESUF): ELIBS = $(ZLIB) tools/cws2fws$(EXESUF): ELIBS = $(ZLIB)
tools/uncoded_frame$(EXESUF): $(FF_DEP_LIBS) tools/uncoded_frame$(EXESUF): $(FF_DEP_LIBS)
@@ -80,8 +79,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 MIPSDSPR1-OBJS MSA-OBJS \ MIPSFPU-OBJS MIPSDSPR2-OBJS MIPSDSPR1-OBJS MIPS32R2-OBJS \
LOONGSON3-OBJS OBJS SLIBOBJS HOSTOBJS TESTOBJS OBJS SLIBOBJS HOSTOBJS TESTOBJS
define RESET define RESET
$(1) := $(1) :=
@@ -93,7 +92,6 @@ $(foreach V,$(SUBDIR_VARS),$(eval $(call RESET,$(V))))
SUBDIR := $(1)/ SUBDIR := $(1)/
include $(SRC_PATH)/$(1)/Makefile include $(SRC_PATH)/$(1)/Makefile
-include $(SRC_PATH)/$(1)/$(ARCH)/Makefile -include $(SRC_PATH)/$(1)/$(ARCH)/Makefile
-include $(SRC_PATH)/$(1)/$(INTRINSICS)/Makefile
include $(SRC_PATH)/library.mak include $(SRC_PATH)/library.mak
endef endef
@@ -112,14 +110,14 @@ endef
$(foreach P,$(PROGS),$(eval $(call DOPROG,$(P:$(PROGSSUF)$(EXESUF)=)))) $(foreach P,$(PROGS),$(eval $(call DOPROG,$(P:$(PROGSSUF)$(EXESUF)=))))
ffprobe.o cmdutils.o libavcodec/utils.o libavformat/utils.o libavdevice/avdevice.o libavfilter/avfilter.o libavutil/utils.o libpostproc/postprocess.o libswresample/swresample.o libswscale/utils.o : libavutil/ffversion.h ffprobe.o cmdutils.o : libavutil/ffversion.h
$(PROGS): %$(PROGSSUF)$(EXESUF): %$(PROGSSUF)_g$(EXESUF) $(PROGS): %$(PROGSSUF)$(EXESUF): %$(PROGSSUF)_g$(EXESUF)
$(CP) $< $@ $(CP) $< $@
$(STRIP) $@ $(STRIP) $@
%$(PROGSSUF)_g$(EXESUF): %.o $(FF_DEP_LIBS) %$(PROGSSUF)_g$(EXESUF): %.o $(FF_DEP_LIBS)
$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $(OBJS-$*) $(FF_EXTRALIBS) $(LD) $(LDFLAGS) $(LD_O) $(OBJS-$*) $(FF_EXTRALIBS)
OBJDIRS += tools OBJDIRS += tools

View File

@@ -1,42 +1,19 @@
FFmpeg README FFmpeg README
============= =============
FFmpeg is a collection of libraries and tools to process multimedia content 1) Documentation
such as audio, video, subtitles and related metadata. ----------------
## Libraries * Read the documentation in the doc/ directory in git.
* `libavcodec` provides implementation of a wider range of codecs. You can also view it online at http://ffmpeg.org/documentation.html
* `libavformat` implements streaming protocols, container formats and basic I/O access.
* `libavutil` includes hashers, decompressors and miscellaneous utility functions.
* `libavfilter` provides a mean to alter decoded Audio and Video through chain of filters.
* `libavdevice` provides an abstraction to access capture and playback devices.
* `libswresample` implements audio mixing and resampling routines.
* `libswscale` implements color conversion and scaling routines.
## Tools 2) Licensing
------------
* [ffmpeg](http://ffmpeg.org/ffmpeg.html) is a command line toolbox to * See the LICENSE file.
manipulate, convert and stream multimedia content.
* [ffplay](http://ffmpeg.org/ffplay.html) is a minimalistic multimedia player.
* [ffprobe](http://ffmpeg.org/ffprobe.html) is a simple analysis tool to inspect
multimedia content.
* [ffserver](http://ffmpeg.org/ffserver.html) is a multimedia streaming server
for live broadcasts.
* Additional small tools such as `aviocat`, `ismindex` and `qt-faststart`.
## Documentation 3) Build and Install
--------------------
The offline documentation is available in the **doc/** directory. * See the INSTALL file.
The online documentation is available in the main [website](http://ffmpeg.org)
and in the [wiki](http://trac.ffmpeg.org).
### Examples
Coding examples are available in the **doc/examples** directory.
## License
FFmpeg codebase is mainly LGPL-licensed with optional components licensed under
GPL. Please refer to the LICENSE file for detailed information.

View File

@@ -1 +1 @@
2.7.3 2.3

View File

@@ -1,15 +1,177 @@
┌───────────────────────────────────────────┐
│ RELEASE NOTES for FFmpeg 2.3 "Mandelbrot" │
└───────────────────────────────────────────┘
┌─────────────────────────────────────┐ The FFmpeg Project proudly presents FFmpeg 2.3 "Mandelbrot", a major
│ RELEASE NOTES for FFmpeg 2.7 "Nash" │ release with all the great features committed during the three-month period
└─────────────────────────────────────┘ since the release of FFmpeg 2.2.
The FFmpeg Project proudly presents FFmpeg 2.7 "Nash", about 3 In this release, there are lots of internal overhauls that make FFmpeg a
months after the release of FFmpeg 2.6. more accessible project for new developers. Many important new
optimizations and features like QTKit and AVFoundation input devices are
committed. Contributions done by Libav such as a new native Opus decoder
are also merged.
A complete Changelog is available at the root of the project, and the Because of the increasing difficulty to maintain and lack of maintainers,
complete Git history on http://source.ffmpeg.org. we are very sorry to say that we have removed all Blackfin and SPARC
architecture assembly optimizations with the cleanups done. If you are
interested in maintaining optimization for these two architecture, feel
free to contact us and we will restore the code!
We hope you will like this release as much as we enjoyed working on it, and Oh, and since this release, this modern-looking release note is provided in
as usual, if you have any questions about it, or any FFmpeg related topic, addition to the old-style Changelog file, to make it easier for you to
feel free to join us on the #ffmpeg IRC channel (on irc.freenode.net) or ask focus on the most important features in this release.
on the mailing-lists.
Enjoy!
┌────────────────────────────┐
│ * API Information │
└────────────────────────────┘
FFmpeg 2.3 is completely source-compatible to the FFmpeg 2.2 series. There
are however some API deprecations that you need to take care of. Use `git
diff n2.2 n2.3 doc/APIchanges` to show the list of added and deprecated
APIs. FFmpeg 2.3 includes the following library versions:
• libavutil 52.92.100
• libavcodec 55.69.100
• libavformat 55.48.100
• libavdevice 55.13.102
• libavfilter 4.11.100
• libswscale 2. 6.100
• libswresample 0.19.100
• libpostproc 52. 3.100
Please refer to the doc/APIChanges file for more information.
┌────────────────────────────┐
│ New Optimization │
└────────────────────────────┘
We are excited to announce that we have committed new x86 assembly
optimization for HEVC, and FFmpeg's audio resampler libswresample. ARM
users will get a boost in MLP/TrueHD decoding thanks to new optimization.
Decoding Huffyuv also got a major boost from optimization on the C code.
Of special interest for Microsoft Visual Studio users, we have also
converted some preexisting x86 assembly to NASM/Yasm format compatible
with MSVC setup, especially in the area of audio resampling.
Another major feature in this release is the introduction of AArch64
(ARMv8) assembly optimization. AArch64 is another name for the first
64-bit ARM architecture, used by Apple A7 SoC inside iPhone 5S. Some
32-bit ARM assembly has already been ported to AArch64, but more work is
underway.
┌────────────────────────────┐
│ Native Opus decoder │
└────────────────────────────┘
Opus is an open audio format jointly developed by Xiph.Org, Mozilla,
Skype/Microsoft, and Broadcom. It combines the features of the Skype Cilk
speech codec and the Xiph.Org CELT music codec into one low-latency
codec. Decoding Opus is already possible since FFmpeg 1.0 using the
libopus library, but the new Opus native decoder brings a higher level of
stability and speed.
┌────────────────────────────┐
│ QTKit and AVFoundation │
└────────────────────────────┘
For OS X users, the new QTKit and AVFoundation devices allow you to use
the integrated camera on Macs. AVFoundation is a newer API only available
on OS X 10.7 "Lion" or newer. For users with older OS X systems, the
QTKit device using the older OS X API is for you.
┌────────────────────────────┐
│ API Additions │
└────────────────────────────┘
In this release, stream side data are introduced as AVStream.side_data as
a way to store miscellaneous stream-wide information. The format is
similar to the previously anonymous structure AVPacket.side_data (now
named as AVPacketSideData). With this change, audio ReplayGain
information and video rotation matrix are now exported through this API,
if available in the demuxer.
We also have improved libswresample's Doxygen API documentation, so new
developers wishing to use FFmpeg's excellent libraries can get started
more easily and faster.
┌────────────────────────────┐
│ Last But Not Least │
└────────────────────────────┘
Other interesting new features including hqx video filter, a pixel art
scaling filter; a fixed-point AC-3 decoder contributed by Imagination
Technologies; an On2 TrueMotion VP7 video decoder; an HTML5 WebVTT
subtitle decoder that allows creation of WebVTT from any text-based
subtitles; and an 1-bit Direct Stream Digital audio decoder.
┌────────────────────────────┐
│ ★ List of New Features │
└────────────────────────────┘
┌────────────────────────────┐
│ Command line tools │
└────────────────────────────┘
• Support for decoding through DXVA2 in ffmpeg
┌────────────────────────────┐
│ libavcodec │
└────────────────────────────┘
• AC3 fixed-point decoding
• VP7 video decoder
• Alias PIX image encoder and decoder
• Improvements to the BRender PIX image decoder
• Improvements to the XBM decoder
• Improvements to OpenEXR image decoder
• Support decoding 16-bit RLE SGI images
• Direct Stream Digital (DSD) decoder
• On2 AVC (Audio for Video) decoder
• Native Opus decoder
• WebVTT encoder
┌────────────────────────────┐
│ libavdevice │
└────────────────────────────┘
• QTKit input device
• GDI screen grabbing for Windows
• AVFoundation input device
┌────────────────────────────┐
│ libavformat │
└────────────────────────────┘
• subfile protocol
• Phantom Cine demuxer
• Alternative rendition support for HTTP Live Streaming
• Magic Lantern Video (MLV) demuxer
• Image format auto-detection
• LRC lyric file demuxer and muxer
• Samba protocol (via libsmbclient)
• WebM DASH Manifest muxer
┌────────────────────────────┐
│ libavfilter │
└────────────────────────────┘
• shuffleplanes filter
• libbs2b-based stereo-to-binaural audio filter
• showcqt multimedia filter
• zoompan filter
• signalstats filter
• hqx filter (hq2x, hq3x, hq4x)
• flanger filter
• libfribidi support in drawtext
┌────────────────────────────┐
│ ⚠ Behaviour changes │
└────────────────────────────┘
• libx264 reference frames count is now limited depending on level chosen
• Because of the new image format auto-detection feature, you don't need to
specify image format when decoding an image with no extension.

1
VERSION Normal file
View File

@@ -0,0 +1 @@
2.3

View File

@@ -5,13 +5,11 @@ 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_MIPS32R2) += $(MIPS32R2-OBJS) $(MIPS32R2-OBJS-yes)
OBJS-$(HAVE_MIPSDSPR1) += $(MIPSDSPR1-OBJS) $(MIPSDSPR1-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_LOONGSON3) += $(LOONGSON3-OBJS) $(LOONGSON3-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)

View File

@@ -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"
@@ -168,7 +166,7 @@ void show_help_options(const OptionDef *options, const char *msg, int req_flags,
int first; int first;
first = 1; first = 1;
for (po = options; po->name; po++) { for (po = options; po->name != NULL; po++) {
char buf[64]; char buf[64];
if (((po->flags & req_flags) != req_flags) || if (((po->flags & req_flags) != req_flags) ||
@@ -207,7 +205,7 @@ static const OptionDef *find_option(const OptionDef *po, const char *name)
const char *p = strchr(name, ':'); const char *p = strchr(name, ':');
int len = p ? p - name : strlen(name); int len = p ? p - name : strlen(name);
while (po->name) { while (po->name != NULL) {
if (!strncmp(name, po->name, len) && strlen(po->name) == len) if (!strncmp(name, po->name, len) && strlen(po->name) == len)
break; break;
po++; po++;
@@ -256,7 +254,7 @@ static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
win32_argv_utf8 = av_mallocz(sizeof(char *) * (win32_argc + 1) + buffsize); win32_argv_utf8 = av_mallocz(sizeof(char *) * (win32_argc + 1) + buffsize);
argstr_flat = (char *)win32_argv_utf8 + sizeof(char *) * (win32_argc + 1); argstr_flat = (char *)win32_argv_utf8 + sizeof(char *) * (win32_argc + 1);
if (!win32_argv_utf8) { if (win32_argv_utf8 == NULL) {
LocalFree(argv_w); LocalFree(argv_w);
return; return;
} }
@@ -292,14 +290,10 @@ static int write_option(void *optctx, const OptionDef *po, const char *opt,
if (po->flags & OPT_SPEC) { if (po->flags & OPT_SPEC) {
SpecifierOpt **so = dst; SpecifierOpt **so = dst;
char *p = strchr(opt, ':'); char *p = strchr(opt, ':');
char *str;
dstcount = (int *)(so + 1); dstcount = (int *)(so + 1);
*so = grow_array(*so, sizeof(**so), dstcount, *dstcount + 1); *so = grow_array(*so, sizeof(**so), dstcount, *dstcount + 1);
str = av_strdup(p ? p + 1 : ""); (*so)[*dstcount - 1].specifier = av_strdup(p ? p + 1 : "");
if (!str)
return AVERROR(ENOMEM);
(*so)[*dstcount - 1].specifier = str;
dst = &(*so)[*dstcount - 1].u; dst = &(*so)[*dstcount - 1].u;
} }
@@ -307,8 +301,6 @@ static int write_option(void *optctx, const OptionDef *po, const char *opt,
char *str; char *str;
str = av_strdup(arg); str = av_strdup(arg);
av_freep(dst); av_freep(dst);
if (!str)
return AVERROR(ENOMEM);
*(char **)dst = str; *(char **)dst = str;
} else if (po->flags & OPT_BOOL || po->flags & OPT_INT) { } else if (po->flags & OPT_BOOL || po->flags & OPT_INT) {
*(int *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX); *(int *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
@@ -452,7 +444,7 @@ int locate_option(int argc, char **argv, const OptionDef *options,
(po->name && !strcmp(optname, po->name))) (po->name && !strcmp(optname, po->name)))
return i; return i;
if (!po->name || po->flags & HAS_ARG) if (po->flags & HAS_ARG)
i++; i++;
} }
return 0; return 0;
@@ -482,22 +474,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])
@@ -859,7 +839,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;
@@ -980,10 +959,9 @@ static int init_report(const char *env)
report_file = fopen(filename.str, "w"); report_file = fopen(filename.str, "w");
if (!report_file) { if (!report_file) {
int ret = AVERROR(errno);
av_log(NULL, AV_LOG_ERROR, "Failed to open report \"%s\": %s\n", av_log(NULL, AV_LOG_ERROR, "Failed to open report \"%s\": %s\n",
filename.str, strerror(errno)); filename.str, strerror(errno));
return ret; return AVERROR(errno);
} }
av_log_set_callback(log_callback_report); av_log_set_callback(log_callback_report);
av_log(NULL, AV_LOG_INFO, av_log(NULL, AV_LOG_INFO,
@@ -1096,7 +1074,8 @@ static void print_program_info(int flags, int level)
av_log(NULL, level, " Copyright (c) %d-%d the FFmpeg developers", av_log(NULL, level, " Copyright (c) %d-%d the FFmpeg developers",
program_birth_year, CONFIG_THIS_YEAR); program_birth_year, CONFIG_THIS_YEAR);
av_log(NULL, level, "\n"); av_log(NULL, level, "\n");
av_log(NULL, level, "%sbuilt with %s\n", indent, CC_IDENT); av_log(NULL, level, "%sbuilt on %s %s with %s\n",
indent, __DATE__, __TIME__, CC_IDENT);
av_log(NULL, level, "%sconfiguration: " FFMPEG_CONFIGURATION "\n", indent); av_log(NULL, level, "%sconfiguration: " FFMPEG_CONFIGURATION "\n", indent);
} }
@@ -1233,7 +1212,12 @@ static int is_device(const AVClass *avclass)
{ {
if (!avclass) if (!avclass)
return 0; return 0;
return AV_IS_INPUT_DEVICE(avclass->category) || AV_IS_OUTPUT_DEVICE(avclass->category); return avclass->category == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT ||
avclass->category == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT ||
avclass->category == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT ||
avclass->category == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT ||
avclass->category == AV_CLASS_CATEGORY_DEVICE_OUTPUT ||
avclass->category == AV_CLASS_CATEGORY_DEVICE_INPUT;
} }
static int show_formats_devices(void *optctx, const char *opt, const char *arg, int device_only) static int show_formats_devices(void *optctx, const char *opt, const char *arg, int device_only)
@@ -1258,7 +1242,7 @@ static int show_formats_devices(void *optctx, const char *opt, const char *arg,
is_dev = is_device(ofmt->priv_class); is_dev = is_device(ofmt->priv_class);
if (!is_dev && device_only) if (!is_dev && device_only)
continue; continue;
if ((!name || strcmp(ofmt->name, name) < 0) && if ((name == NULL || strcmp(ofmt->name, name) < 0) &&
strcmp(ofmt->name, last_name) > 0) { strcmp(ofmt->name, last_name) > 0) {
name = ofmt->name; name = ofmt->name;
long_name = ofmt->long_name; long_name = ofmt->long_name;
@@ -1269,7 +1253,7 @@ static int show_formats_devices(void *optctx, const char *opt, const char *arg,
is_dev = is_device(ifmt->priv_class); is_dev = is_device(ifmt->priv_class);
if (!is_dev && device_only) if (!is_dev && device_only)
continue; continue;
if ((!name || strcmp(ifmt->name, name) < 0) && if ((name == NULL || strcmp(ifmt->name, name) < 0) &&
strcmp(ifmt->name, last_name) > 0) { strcmp(ifmt->name, last_name) > 0) {
name = ifmt->name; name = ifmt->name;
long_name = ifmt->long_name; long_name = ifmt->long_name;
@@ -1278,7 +1262,7 @@ static int show_formats_devices(void *optctx, const char *opt, const char *arg,
if (name && strcmp(ifmt->name, name) == 0) if (name && strcmp(ifmt->name, name) == 0)
decode = 1; decode = 1;
} }
if (!name) if (name == NULL)
break; break;
last_name = name; last_name = name;
@@ -1559,8 +1543,7 @@ int show_protocols(void *optctx, const char *opt, const char *arg)
int show_filters(void *optctx, const char *opt, const char *arg) int show_filters(void *optctx, const char *opt, const char *arg)
{ {
#if CONFIG_AVFILTER const AVFilter av_unused(*filter) = NULL;
const AVFilter *filter = NULL;
char descr[64], *descr_cur; char descr[64], *descr_cur;
int i, j; int i, j;
const AVFilterPad *pad; const AVFilterPad *pad;
@@ -1568,11 +1551,12 @@ 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"
" | = Source or sink filter\n"); " | = Source or sink filter\n");
#if CONFIG_AVFILTER
while ((filter = avfilter_next(filter))) { while ((filter = avfilter_next(filter))) {
descr_cur = descr; descr_cur = descr;
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
@@ -1597,8 +1581,6 @@ int show_filters(void *optctx, const char *opt, const char *arg)
filter->process_command ? 'C' : '.', filter->process_command ? 'C' : '.',
filter->name, descr, filter->description); filter->name, descr, filter->description);
} }
#else
printf("No filters available: libavfilter disabled\n");
#endif #endif
return 0; return 0;
} }
@@ -1663,13 +1645,13 @@ int show_layouts(void *optctx, const char *opt, const char *arg)
if (!name) if (!name)
continue; continue;
descr = av_get_channel_description((uint64_t)1 << i); descr = av_get_channel_description((uint64_t)1 << i);
printf("%-14s %s\n", name, descr); printf("%-12s%s\n", name, descr);
} }
printf("\nStandard channel layouts:\n" printf("\nStandard channel layouts:\n"
"NAME DECOMPOSITION\n"); "NAME DECOMPOSITION\n");
for (i = 0; !av_get_standard_channel_layout(i, &layout, &name); i++) { for (i = 0; !av_get_standard_channel_layout(i, &layout, &name); i++) {
if (name) { if (name) {
printf("%-14s ", name); printf("%-12s", name);
for (j = 1; j; j <<= 1) for (j = 1; j; j <<= 1)
if ((layout & j)) if ((layout & j))
printf("%s%s", (layout & (j - 1)) ? "+" : "", av_get_channel_name(j)); printf("%s%s", (layout & (j - 1)) ? "+" : "", av_get_channel_name(j));
@@ -1836,8 +1818,6 @@ int show_help(void *optctx, const char *opt, const char *arg)
av_log_set_callback(log_callback_help); av_log_set_callback(log_callback_help);
topic = av_strdup(arg ? arg : ""); topic = av_strdup(arg ? arg : "");
if (!topic)
return AVERROR(ENOMEM);
par = strchr(topic, '='); par = strchr(topic, '=');
if (par) if (par)
*par++ = 0; *par++ = 0;
@@ -1877,48 +1857,35 @@ int read_yesno(void)
int cmdutils_read_file(const char *filename, char **bufptr, size_t *size) int cmdutils_read_file(const char *filename, char **bufptr, size_t *size)
{ {
int64_t ret; int ret;
FILE *f = av_fopen_utf8(filename, "rb"); FILE *f = av_fopen_utf8(filename, "rb");
if (!f) { if (!f) {
ret = AVERROR(errno);
av_log(NULL, AV_LOG_ERROR, "Cannot read file '%s': %s\n", filename, av_log(NULL, AV_LOG_ERROR, "Cannot read file '%s': %s\n", filename,
strerror(errno)); strerror(errno));
return ret; return AVERROR(errno);
} }
fseek(f, 0, SEEK_END);
ret = fseek(f, 0, SEEK_END); *size = ftell(f);
if (ret == -1) { fseek(f, 0, SEEK_SET);
ret = AVERROR(errno); if (*size == (size_t)-1) {
goto out; av_log(NULL, AV_LOG_ERROR, "IO error: %s\n", strerror(errno));
fclose(f);
return AVERROR(errno);
} }
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); *bufptr = av_malloc(*size + 1);
if (!*bufptr) { if (!*bufptr) {
av_log(NULL, AV_LOG_ERROR, "Could not allocate file buffer\n"); av_log(NULL, AV_LOG_ERROR, "Could not allocate file buffer\n");
ret = AVERROR(ENOMEM); fclose(f);
goto out; return AVERROR(ENOMEM);
} }
ret = fread(*bufptr, 1, *size, f); ret = fread(*bufptr, 1, *size, f);
if (ret < *size) { if (ret < *size) {
av_free(*bufptr); av_free(*bufptr);
if (ferror(f)) { if (ferror(f)) {
ret = AVERROR(errno);
av_log(NULL, AV_LOG_ERROR, "Error while reading file '%s': %s\n", av_log(NULL, AV_LOG_ERROR, "Error while reading file '%s': %s\n",
filename, strerror(errno)); filename, strerror(errno));
ret = AVERROR(errno);
} else } else
ret = AVERROR_EOF; ret = AVERROR_EOF;
} else { } else {
@@ -1926,9 +1893,6 @@ int cmdutils_read_file(const char *filename, char **bufptr, size_t *size)
(*bufptr)[(*size)++] = '\0'; (*bufptr)[(*size)++] = '\0';
} }
out:
if (ret < 0)
av_log(NULL, AV_LOG_ERROR, "IO error: %s\n", av_err2str(ret));
fclose(f); fclose(f);
return ret; return ret;
} }
@@ -2028,7 +1992,7 @@ AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id,
switch (check_stream_specifier(s, st, p + 1)) { switch (check_stream_specifier(s, st, p + 1)) {
case 1: *p = 0; break; case 1: *p = 0; break;
case 0: continue; case 0: continue;
default: exit_program(1); default: return NULL;
} }
if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) || if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) ||
@@ -2075,7 +2039,7 @@ void *grow_array(void *array, int elem_size, int *size, int new_size)
exit_program(1); exit_program(1);
} }
if (*size < new_size) { if (*size < new_size) {
uint8_t *tmp = av_realloc_array(array, new_size, elem_size); uint8_t *tmp = av_realloc(array, new_size*elem_size);
if (!tmp) { if (!tmp) {
av_log(NULL, AV_LOG_ERROR, "Could not alloc buffer.\n"); av_log(NULL, AV_LOG_ERROR, "Could not alloc buffer.\n");
exit_program(1); exit_program(1);
@@ -2086,186 +2050,3 @@ 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_ask_for_sample(NULL, "Odd rotation angle\n");
return theta;
}
#if CONFIG_AVDEVICE
static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts)
{
int ret, i;
AVDeviceInfoList *device_list = NULL;
if (!fmt || !fmt->priv_class || !AV_IS_INPUT_DEVICE(fmt->priv_class->category))
return AVERROR(EINVAL);
printf("Audo-detected sources for %s:\n", fmt->name);
if (!fmt->get_device_list) {
ret = AVERROR(ENOSYS);
printf("Cannot list sources. Not implemented.\n");
goto fail;
}
if ((ret = avdevice_list_input_sources(fmt, NULL, opts, &device_list)) < 0) {
printf("Cannot list sources.\n");
goto fail;
}
for (i = 0; i < device_list->nb_devices; i++) {
printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ",
device_list->devices[i]->device_name, device_list->devices[i]->device_description);
}
fail:
avdevice_free_list_devices(&device_list);
return ret;
}
static int print_device_sinks(AVOutputFormat *fmt, AVDictionary *opts)
{
int ret, i;
AVDeviceInfoList *device_list = NULL;
if (!fmt || !fmt->priv_class || !AV_IS_OUTPUT_DEVICE(fmt->priv_class->category))
return AVERROR(EINVAL);
printf("Audo-detected sinks for %s:\n", fmt->name);
if (!fmt->get_device_list) {
ret = AVERROR(ENOSYS);
printf("Cannot list sinks. Not implemented.\n");
goto fail;
}
if ((ret = avdevice_list_output_sinks(fmt, NULL, opts, &device_list)) < 0) {
printf("Cannot list sinks.\n");
goto fail;
}
for (i = 0; i < device_list->nb_devices; i++) {
printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ",
device_list->devices[i]->device_name, device_list->devices[i]->device_description);
}
fail:
avdevice_free_list_devices(&device_list);
return ret;
}
static int show_sinks_sources_parse_arg(const char *arg, char **dev, AVDictionary **opts)
{
int ret;
if (arg) {
char *opts_str = NULL;
av_assert0(dev && opts);
*dev = av_strdup(arg);
if (!*dev)
return AVERROR(ENOMEM);
if ((opts_str = strchr(*dev, ','))) {
*(opts_str++) = '\0';
if (opts_str[0] && ((ret = av_dict_parse_string(opts, opts_str, "=", ":", 0)) < 0)) {
av_freep(dev);
return ret;
}
}
} else
printf("\nDevice name is not provided.\n"
"You can pass devicename[,opt1=val1[,opt2=val2...]] as an argument.\n\n");
return 0;
}
int show_sources(void *optctx, const char *opt, const char *arg)
{
AVInputFormat *fmt = NULL;
char *dev = NULL;
AVDictionary *opts = NULL;
int ret = 0;
int error_level = av_log_get_level();
av_log_set_level(AV_LOG_ERROR);
if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
goto fail;
do {
fmt = av_input_audio_device_next(fmt);
if (fmt) {
if (!strcmp(fmt->name, "lavfi"))
continue; //it's pointless to probe lavfi
if (dev && !av_match_name(dev, fmt->name))
continue;
print_device_sources(fmt, opts);
}
} while (fmt);
do {
fmt = av_input_video_device_next(fmt);
if (fmt) {
if (dev && !av_match_name(dev, fmt->name))
continue;
print_device_sources(fmt, opts);
}
} while (fmt);
fail:
av_dict_free(&opts);
av_free(dev);
av_log_set_level(error_level);
return ret;
}
int show_sinks(void *optctx, const char *opt, const char *arg)
{
AVOutputFormat *fmt = NULL;
char *dev = NULL;
AVDictionary *opts = NULL;
int ret = 0;
int error_level = av_log_get_level();
av_log_set_level(AV_LOG_ERROR);
if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
goto fail;
do {
fmt = av_output_audio_device_next(fmt);
if (fmt) {
if (dev && !av_match_name(dev, fmt->name))
continue;
print_device_sinks(fmt, opts);
}
} while (fmt);
do {
fmt = av_output_video_device_next(fmt);
if (fmt) {
if (dev && !av_match_name(dev, fmt->name))
continue;
print_device_sinks(fmt, opts);
}
} while (fmt);
fail:
av_dict_free(&opts);
av_free(dev);
av_log_set_level(error_level);
return ret;
}
#endif

View File

@@ -443,20 +443,6 @@ int show_formats(void *optctx, const char *opt, const char *arg);
*/ */
int show_devices(void *optctx, const char *opt, const char *arg); int show_devices(void *optctx, const char *opt, const char *arg);
#if CONFIG_AVDEVICE
/**
* Print a listing containing audodetected sinks of the output device.
* Device name with options may be passed as an argument to limit results.
*/
int show_sinks(void *optctx, const char *opt, const char *arg);
/**
* Print a listing containing audodetected sources of the input device.
* Device name with options may be passed as an argument to limit results.
*/
int show_sources(void *optctx, const char *opt, const char *arg);
#endif
/** /**
* Print a listing containing all the codecs supported by the * Print a listing containing all the codecs supported by the
* program. * program.
@@ -597,6 +583,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 */

View File

@@ -27,9 +27,3 @@
{ "opencl_bench", OPT_EXIT, {.func_arg = opt_opencl_bench}, "run benchmark on all OpenCL devices and show results" }, { "opencl_bench", OPT_EXIT, {.func_arg = opt_opencl_bench}, "run benchmark on all OpenCL devices and show results" },
{ "opencl_options", HAS_ARG, {.func_arg = opt_opencl}, "set OpenCL environment options" }, { "opencl_options", HAS_ARG, {.func_arg = opt_opencl}, "set OpenCL environment options" },
#endif #endif
#if CONFIG_AVDEVICE
{ "sources" , OPT_EXIT | HAS_ARG, { .func_arg = show_sources },
"list sources of the input device", "device" },
{ "sinks" , OPT_EXIT | HAS_ARG, { .func_arg = show_sinks },
"list sinks of the output device", "device" },
#endif

View File

@@ -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 {
@@ -239,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++;
} }
} }

View File

@@ -5,14 +5,6 @@
# first so "all" becomes default target # first so "all" becomes default target
all: all-yes all: all-yes
DEFAULT_YASMD=.dbg
ifeq ($(DBG),1)
YASMD=$(DEFAULT_YASMD)
else
YASMD=
endif
ifndef SUBDIR ifndef SUBDIR
ifndef V ifndef V
@@ -146,17 +138,17 @@ $(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 *.ho *.gcno *.gcda *$(DEFAULT_YASMD).asm CLEANSUFFIXES = *.d *.o *~ *.h.c *.map *.ver *.ho *.gcno *.gcda
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) $(OBJS) $(OBJS:.o=.d) $(OBJS:.o=$(DEFAULT_YASMD).d) $(RM) $(OBJS) $(OBJS:.o=.d)
$(RM) $(HOSTPROGS) $(RM) $(HOSTPROGS)
$(RM) $(TOOLS) $(RM) $(TOOLS)
endef endef
$(eval $(RULES)) $(eval $(RULES))
-include $(wildcard $(OBJS:.o=.d) $(HOSTOBJS:.o=.d) $(TESTOBJS:.o=.d) $(HOBJS:.o=.d) $(SLIBOBJS:.o=.d)) $(OBJS:.o=$(DEFAULT_YASMD).d) -include $(wildcard $(OBJS:.o=.d) $(HOSTOBJS:.o=.d) $(TESTOBJS:.o=.d) $(HOBJS:.o=.d) $(SLIBOBJS:.o=.d))

View File

@@ -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
@@ -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

View 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); }

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -513,21 +513,21 @@ AVSC_INLINE AVS_Value avs_array_elt(AVS_Value v, int index)
// only use these functions on am AVS_Value that does not already have // only use these functions on am AVS_Value that does not already have
// an active value. Remember, treat AVS_Value as a fat pointer. // an active value. Remember, treat AVS_Value as a fat pointer.
AVSC_INLINE AVS_Value avs_new_value_bool(int v0) AVSC_INLINE AVS_Value avs_new_value_bool(int v0)
{ AVS_Value v = {0}; v.type = 'b'; v.d.boolean = v0 == 0 ? 0 : 1; return v; } { AVS_Value v; v.type = 'b'; v.d.boolean = v0 == 0 ? 0 : 1; return v; }
AVSC_INLINE AVS_Value avs_new_value_int(int v0) AVSC_INLINE AVS_Value avs_new_value_int(int v0)
{ AVS_Value v = {0}; v.type = 'i'; v.d.integer = v0; return v; } { AVS_Value v; v.type = 'i'; v.d.integer = v0; return v; }
AVSC_INLINE AVS_Value avs_new_value_string(const char * v0) AVSC_INLINE AVS_Value avs_new_value_string(const char * v0)
{ AVS_Value v = {0}; v.type = 's'; v.d.string = v0; return v; } { AVS_Value v; v.type = 's'; v.d.string = v0; return v; }
AVSC_INLINE AVS_Value avs_new_value_float(float v0) AVSC_INLINE AVS_Value avs_new_value_float(float v0)
{ AVS_Value v = {0}; v.type = 'f'; v.d.floating_pt = v0; return v;} { AVS_Value v; v.type = 'f'; v.d.floating_pt = v0; return v;}
AVSC_INLINE AVS_Value avs_new_value_error(const char * v0) AVSC_INLINE AVS_Value avs_new_value_error(const char * v0)
{ AVS_Value v = {0}; v.type = 'e'; v.d.string = v0; return v; } { AVS_Value v; v.type = 'e'; v.d.string = v0; return v; }
#ifndef AVSC_NO_DECLSPEC #ifndef AVSC_NO_DECLSPEC
AVSC_INLINE AVS_Value avs_new_value_clip(AVS_Clip * v0) AVSC_INLINE AVS_Value avs_new_value_clip(AVS_Clip * v0)
{ AVS_Value v = {0}; avs_set_to_clip(&v, v0); return v; } { AVS_Value v; avs_set_to_clip(&v, v0); return v; }
#endif #endif
AVSC_INLINE AVS_Value avs_new_value_array(AVS_Value * v0, int size) AVSC_INLINE AVS_Value avs_new_value_array(AVS_Value * v0, int size)
{ AVS_Value v = {0}; v.type = 'a'; v.d.array = v0; v.array_size = size; return v; } { AVS_Value v; v.type = 'a'; v.d.array = v0; v.array_size = size; return v; }
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
// //

View File

@@ -52,8 +52,8 @@ namespace avxsynth {
// //
// Functions // Functions
// //
#define MAKEDWORD(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) #define MAKEDWORD(a,b,c,d) ((a << 24) | (b << 16) | (c << 8) | (d))
#define MAKEWORD(a,b) (((a) << 8) | (b)) #define MAKEWORD(a,b) ((a << 8) | (b))
#define lstrlen strlen #define lstrlen strlen
#define lstrcpy strcpy #define lstrcpy strcpy

View File

@@ -54,7 +54,7 @@ static int getopt(int argc, char *argv[], char *opts)
} }
} }
optopt = c = argv[optind][sp]; optopt = c = argv[optind][sp];
if (c == ':' || !(cp = strchr(opts, c))) { if (c == ':' || (cp = strchr(opts, c)) == NULL) {
fprintf(stderr, ": illegal option -- %c\n", c); fprintf(stderr, ": illegal option -- %c\n", c);
if (argv[optind][++sp] == '\0') { if (argv[optind][++sp] == '\0') {
optind++; optind++;

View File

@@ -66,8 +66,6 @@ static av_always_inline int pthread_create(pthread_t *thread, const pthread_attr
struct thread_arg *thread_arg; struct thread_arg *thread_arg;
thread_arg = av_mallocz(sizeof(struct thread_arg)); thread_arg = av_mallocz(sizeof(struct thread_arg));
if (!thread_arg)
return ENOMEM;
thread_arg->start_routine = start_routine; thread_arg->start_routine = start_routine;
thread_arg->arg = arg; thread_arg->arg = arg;

View File

@@ -39,7 +39,6 @@
#include <windows.h> #include <windows.h>
#include <process.h> #include <process.h>
#include "libavutil/attributes.h"
#include "libavutil/common.h" #include "libavutil/common.h"
#include "libavutil/internal.h" #include "libavutil/internal.h"
#include "libavutil/mem.h" #include "libavutil/mem.h"
@@ -55,29 +54,35 @@ typedef struct pthread_t {
* not mutexes */ * not mutexes */
typedef CRITICAL_SECTION pthread_mutex_t; typedef CRITICAL_SECTION pthread_mutex_t;
/* This is the CONDITION_VARIABLE typedef for using Windows' native /* This is the CONDITIONAL_VARIABLE typedef for using Window's native
* conditional variables on kernels 6.0+. */ * conditional variables on kernels 6.0+.
#if HAVE_CONDITION_VARIABLE_PTR * MinGW does not currently have this typedef. */
typedef CONDITION_VARIABLE pthread_cond_t;
#else
typedef struct pthread_cond_t { typedef struct pthread_cond_t {
void *Ptr; void *ptr;
} pthread_cond_t; } pthread_cond_t;
/* function pointers to conditional variable API on windows 6.0+ kernels */
#if _WIN32_WINNT < 0x0600
static void (WINAPI *cond_broadcast)(pthread_cond_t *cond);
static void (WINAPI *cond_init)(pthread_cond_t *cond);
static void (WINAPI *cond_signal)(pthread_cond_t *cond);
static BOOL (WINAPI *cond_wait)(pthread_cond_t *cond, pthread_mutex_t *mutex,
DWORD milliseconds);
#else
#define cond_init InitializeConditionVariable
#define cond_broadcast WakeAllConditionVariable
#define cond_signal WakeConditionVariable
#define cond_wait SleepConditionVariableCS
#endif #endif
#if _WIN32_WINNT >= 0x0600 static unsigned __stdcall attribute_align_arg win32thread_worker(void *arg)
#define InitializeCriticalSection(x) InitializeCriticalSectionEx(x, 0, 0)
#define WaitForSingleObject(a, b) WaitForSingleObjectEx(a, b, FALSE)
#endif
static av_unused unsigned __stdcall attribute_align_arg win32thread_worker(void *arg)
{ {
pthread_t *h = arg; pthread_t *h = arg;
h->ret = h->func(h->arg); h->ret = h->func(h->arg);
return 0; return 0;
} }
static av_unused int pthread_create(pthread_t *thread, const void *unused_attr, static int pthread_create(pthread_t *thread, const void *unused_attr,
void *(*start_routine)(void*), void *arg) void *(*start_routine)(void*), void *arg)
{ {
thread->func = start_routine; thread->func = start_routine;
@@ -87,7 +92,7 @@ static av_unused int pthread_create(pthread_t *thread, const void *unused_attr,
return !thread->handle; return !thread->handle;
} }
static av_unused void pthread_join(pthread_t thread, void **value_ptr) static void pthread_join(pthread_t thread, void **value_ptr)
{ {
DWORD ret = WaitForSingleObject(thread.handle, INFINITE); DWORD ret = WaitForSingleObject(thread.handle, INFINITE);
if (ret != WAIT_OBJECT_0) if (ret != WAIT_OBJECT_0)
@@ -118,36 +123,6 @@ static inline int pthread_mutex_unlock(pthread_mutex_t *m)
return 0; return 0;
} }
#if _WIN32_WINNT >= 0x0600
static inline int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
{
InitializeConditionVariable(cond);
return 0;
}
/* native condition variables do not destroy */
static inline void pthread_cond_destroy(pthread_cond_t *cond)
{
return;
}
static inline void pthread_cond_broadcast(pthread_cond_t *cond)
{
WakeAllConditionVariable(cond);
}
static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
{
SleepConditionVariableCS(cond, mutex, INFINITE);
return 0;
}
static inline void pthread_cond_signal(pthread_cond_t *cond)
{
WakeConditionVariable(cond);
}
#else // _WIN32_WINNT < 0x0600
/* for pre-Windows 6.0 platforms we need to define and use our own condition /* 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 {
@@ -159,14 +134,7 @@ typedef struct win32_cond_t {
volatile int is_broadcast; volatile int is_broadcast;
} win32_cond_t; } win32_cond_t;
/* function pointers to conditional variable API on windows 6.0+ kernels */ static int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
static void (WINAPI *cond_broadcast)(pthread_cond_t *cond);
static void (WINAPI *cond_init)(pthread_cond_t *cond);
static void (WINAPI *cond_signal)(pthread_cond_t *cond);
static BOOL (WINAPI *cond_wait)(pthread_cond_t *cond, pthread_mutex_t *mutex,
DWORD milliseconds);
static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
{ {
win32_cond_t *win32_cond = NULL; win32_cond_t *win32_cond = NULL;
if (cond_init) { if (cond_init) {
@@ -178,7 +146,7 @@ static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_
win32_cond = av_mallocz(sizeof(win32_cond_t)); win32_cond = av_mallocz(sizeof(win32_cond_t));
if (!win32_cond) if (!win32_cond)
return ENOMEM; return ENOMEM;
cond->Ptr = win32_cond; cond->ptr = win32_cond;
win32_cond->semaphore = CreateSemaphore(NULL, 0, 0x7fffffff, NULL); win32_cond->semaphore = CreateSemaphore(NULL, 0, 0x7fffffff, NULL);
if (!win32_cond->semaphore) if (!win32_cond->semaphore)
return ENOMEM; return ENOMEM;
@@ -191,9 +159,9 @@ static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_
return 0; return 0;
} }
static av_unused void pthread_cond_destroy(pthread_cond_t *cond) static void pthread_cond_destroy(pthread_cond_t *cond)
{ {
win32_cond_t *win32_cond = cond->Ptr; win32_cond_t *win32_cond = cond->ptr;
/* native condition variables do not destroy */ /* native condition variables do not destroy */
if (cond_init) if (cond_init)
return; return;
@@ -204,12 +172,12 @@ static av_unused void pthread_cond_destroy(pthread_cond_t *cond)
pthread_mutex_destroy(&win32_cond->mtx_waiter_count); pthread_mutex_destroy(&win32_cond->mtx_waiter_count);
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;
} }
static av_unused void pthread_cond_broadcast(pthread_cond_t *cond) static void pthread_cond_broadcast(pthread_cond_t *cond)
{ {
win32_cond_t *win32_cond = cond->Ptr; win32_cond_t *win32_cond = cond->ptr;
int have_waiter; int have_waiter;
if (cond_broadcast) { if (cond_broadcast) {
@@ -238,9 +206,9 @@ static av_unused void pthread_cond_broadcast(pthread_cond_t *cond)
pthread_mutex_unlock(&win32_cond->mtx_broadcast); pthread_mutex_unlock(&win32_cond->mtx_broadcast);
} }
static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) static int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
{ {
win32_cond_t *win32_cond = cond->Ptr; win32_cond_t *win32_cond = cond->ptr;
int last_waiter; int last_waiter;
if (cond_wait) { if (cond_wait) {
cond_wait(cond, mutex, INFINITE); cond_wait(cond, mutex, INFINITE);
@@ -270,9 +238,9 @@ 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 void pthread_cond_signal(pthread_cond_t *cond) static void pthread_cond_signal(pthread_cond_t *cond)
{ {
win32_cond_t *win32_cond = cond->Ptr; win32_cond_t *win32_cond = cond->ptr;
int have_waiter; int have_waiter;
if (cond_signal) { if (cond_signal) {
cond_signal(cond); cond_signal(cond);
@@ -294,9 +262,8 @@ static av_unused void pthread_cond_signal(pthread_cond_t *cond)
pthread_mutex_unlock(&win32_cond->mtx_broadcast); pthread_mutex_unlock(&win32_cond->mtx_broadcast);
} }
#endif
static av_unused void w32thread_init(void) static void w32thread_init(void)
{ {
#if _WIN32_WINNT < 0x0600 #if _WIN32_WINNT < 0x0600
HANDLE kernel_dll = GetModuleHandle(TEXT("kernel32.dll")); HANDLE kernel_dll = GetModuleHandle(TEXT("kernel32.dll"));

885
configure vendored

File diff suppressed because it is too large Load Diff

View File

@@ -2,279 +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: 2014-08-09 libavcodec: 2013-03-xx
libavdevice: 2014-08-09 libavdevice: 2013-03-xx
libavfilter: 2014-08-09 libavfilter: 2013-12-xx
libavformat: 2014-08-09 libavformat: 2013-03-xx
libavresample: 2014-08-09 libavresample: 2012-10-05
libpostproc: 2014-08-09 libpostproc: 2011-04-18
libswresample: 2014-08-09 libswresample: 2011-09-19
libswscale: 2014-08-09 libswscale: 2011-06-20
libavutil: 2014-08-09 libavutil: 2012-10-22
API changes, most recent first: API changes, most recent first:
-------- 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< ---------
2015-03-04 - cca4476 - lavf 56.25.100
Add avformat_flush()
2015-03-03 - 81a9126 - lavf 56.24.100
Add avio_put_str16be()
2015-02-19 - 560eb71 / 31d2039 - lavc 56.23.100 / 56.13.0
Add width, height, coded_width, coded_height and format to
AVCodecParserContext.
2015-02-19 - e375511 / 5b1d9ce - lavu 54.19.100 / 54.9.0
Add AV_PIX_FMT_QSV for QSV hardware acceleration.
2015-02-14 - ba22295 - lavc 56.21.102
Deprecate VIMA decoder.
2015-01-27 - 62a82c6 / 728685f - lavc 56.21.100 / 56.12.0, lavu 54.18.100 / 54.8.0 - avcodec.h, frame.h
Add AV_PKT_DATA_AUDIO_SERVICE_TYPE and AV_FRAME_DATA_AUDIO_SERVICE_TYPE for
storing the audio service type as side data.
2015-01-16 - a47c933 - lavf 56.19.100 - avformat.h
Add data_codec and data_codec_id for storing codec of data stream
2015-01-11 - 007c33d - lavd 56.4.100 - avdevice.h
Add avdevice_list_input_sources().
Add avdevice_list_output_sinks().
2014-12-25 - d7aaeea / c220a60 - lavc 56.19.100 / 56.10.0 - vdpau.h
Add av_vdpau_get_surface_parameters().
2014-12-25 - ddb9a24 / 6c99c92 - lavc 56.18.100 / 56.9.0 - avcodec.h
Add AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH flag to av_vdpau_bind_context().
2014-12-25 - d16079a / 57b6704 - lavc 56.17.100 / 56.8.0 - avcodec.h
Add AVCodecContext.sw_pix_fmt.
2014-12-04 - 6e9ac02 - lavc 56.14.100 - dv_profile.h
Add av_dv_codec_profile2().
-------- 8< --------- FFmpeg 2.5 was cut here -------- 8< ---------
2014-11-21 - ab922f9 - lavu 54.15.100 - dict.h
Add av_dict_get_string().
2014-11-18 - a54a51c - lavu 54.14.100 - float_dsp.h
Add avpriv_float_dsp_alloc().
2014-11-16 - 6690d4c3 - lavf 56.13.100 - avformat.h
Add AVStream.recommended_encoder_configuration with accessors.
2014-11-16 - bee5844d - lavu 54.13.100 - opt.h
Add av_opt_serialize().
2014-11-16 - eec69332 - lavu 54.12.100 - opt.h
Add av_opt_is_set_to_default().
2014-11-06 - 44fa267 / 5e80fb7 - lavc 56.11.100 / 56.6.0 - vorbis_parser.h
Add a public API for parsing vorbis packets.
2014-10-15 - 17085a0 / 7ea1b34 - lavc 56.7.100 / 56.5.0 - avcodec.h
Replace AVCodecContext.time_base used for decoding
with AVCodecContext.framerate.
2014-10-15 - 51c810e / d565fef1 - lavc 56.6.100 / 56.4.0 - avcodec.h
Add AV_HWACCEL_FLAG_IGNORE_LEVEL flag to av_vdpau_bind_context().
2014-10-13 - da21895 / 2df0c32e - lavc 56.5.100 / 56.3.0 - avcodec.h
Add AVCodecContext.initial_padding. Deprecate the use of AVCodecContext.delay
for audio encoding.
2014-10-08 - bb44f7d / 5a419b2 - lavu 54.10.100 / 54.4.0 - pixdesc.h
Add API to return the name of frame and context color properties.
2014-10-06 - a61899a / e3e158e - lavc 56.3.100 / 56.2.0 - vdpau.h
Add av_vdpau_bind_context(). This function should now be used for creating
(or resetting) a AVVDPAUContext instead of av_vdpau_alloc_context().
2014-10-02 - cdd6f05 - lavc 56.2.100 - avcodec.h
2014-10-02 - cdd6f05 - lavu 54.9.100 - frame.h
Add AV_FRAME_DATA_SKIP_SAMPLES. Add lavc CODEC_FLAG2_SKIP_MANUAL and
AVOption "skip_manual", which makes lavc export skip information via
AV_FRAME_DATA_SKIP_SAMPLES AVFrame side data, instead of skipping and
discarding samples automatically.
2014-10-02 - 0d92b0d - lavu 54.8.100 - avstring.h
Add av_match_list()
2014-09-24 - ac68295 - libpostproc 53.1.100
Add visualization support
2014-09-19 - 6edd6a4 - lavc 56.1.101 - dv_profile.h
deprecate avpriv_dv_frame_profile2(), which was made public by accident.
-------- 8< --------- FFmpeg 2.4 was cut here -------- 8< ---------
2014-08-25 - 215db29 / b263f8f - lavf 56.3.100 / 56.3.0 - avformat.h
Add AVFormatContext.max_ts_probe.
2014-08-28 - f30a815 / 9301486 - lavc 56.1.100 / 56.1.0 - avcodec.h
Add AV_PKT_DATA_STEREO3D to export container-level stereo3d information.
2014-08-23 - 8fc9bd0 - lavu 54.7.100 - dict.h
AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL arguments are now
freed even on error. This is consistent with the behaviour all users
of it we could find expect.
2014-08-21 - 980a5b0 - lavu 54.6.100 - frame.h motion_vector.h
Add AV_FRAME_DATA_MOTION_VECTORS side data and AVMotionVector structure
2014-08-16 - b7d5e01 - lswr 1.1.100 - swresample.h
Add AVFrame based API
2014-08-16 - c2829dc - lavu 54.4.100 - dict.h
Add av_dict_set_int helper function.
2014-08-13 - c8571c6 / 8ddc326 - lavu 54.3.100 / 54.3.0 - mem.h
Add av_strndup().
2014-08-13 - 2ba4577 / a8c104a - lavu 54.2.100 / 54.2.0 - opt.h
Add av_opt_get_dict_val/set_dict_val with AV_OPT_TYPE_DICT to support
dictionary types being set as options.
2014-08-13 - afbd4b8 - lavf 56.01.0 - avformat.h
Add AVFormatContext.event_flags and AVStream.event_flags for signaling to
the user when events happen in the file/stream.
2014-08-10 - 78eaaa8 / fb1ddcd - lavr 2.1.0 - avresample.h
Add avresample_convert_frame() and avresample_config().
2014-08-10 - 78eaaa8 / fb1ddcd - lavu 54.1.100 / 54.1.0 - error.h
Add AVERROR_INPUT_CHANGED and AVERROR_OUTPUT_CHANGED.
2014-08-08 - 3841f2a / d35b94f - lavc 55.73.102 / 55.57.4 - avcodec.h
Deprecate FF_IDCT_XVIDMMX define and xvidmmx idct option.
Replaced by FF_IDCT_XVID and xvid respectively.
2014-08-08 - 5c3c671 - lavf 55.53.100 - avio.h
Add avio_feof() and deprecate url_feof().
2014-08-07 - bb78903 - lsws 2.1.3 - swscale.h
sws_getContext is not going to be removed in the future.
2014-08-07 - a561662 / ad1ee5f - lavc 55.73.101 / 55.57.3 - avcodec.h
reordered_opaque is not going to be removed in the future.
2014-08-02 - 28a2107 - lavu 52.98.100 - pixelutils.h
Add pixelutils API with SAD functions
2014-08-04 - 6017c98 / e9abafc - lavu 52.97.100 / 53.22.0 - pixfmt.h
Add AV_PIX_FMT_YA16 pixel format for 16 bit packed gray with alpha.
2014-08-04 - 4c8bc6f / e96c3b8 - lavu 52.96.101 / 53.21.1 - avstring.h
Rename AV_PIX_FMT_Y400A to AV_PIX_FMT_YA8 to better identify the format.
An alias pixel format and color space name are provided for compatibility.
2014-08-04 - 073c074 / d2962e9 - lavu 52.96.100 / 53.21.0 - pixdesc.h
Support name aliases for pixel formats.
2014-08-03 - 71d008e / 1ef9e83 - lavc 55.72.101 / 55.57.2 - avcodec.h
2014-08-03 - 71d008e / 1ef9e83 - lavu 52.95.100 / 53.20.0 - frame.h
Deprecate AVCodecContext.dtg_active_format and use side-data instead.
2014-08-03 - e680c73 - lavc 55.72.100 - avcodec.h
Add get_pixels() to AVDCT
2014-08-03 - 9400603 / 9f17685 - lavc 55.71.101 / 55.57.1 - avcodec.h
Deprecate unused FF_IDCT_IPP define and ipp avcodec option.
Deprecate unused FF_DEBUG_PTS define and pts avcodec option.
Deprecate unused FF_CODER_TYPE_DEFLATE define and deflate avcodec option.
Deprecate unused FF_DCT_INT define and int avcodec option.
Deprecate unused avcodec option scenechange_factor.
2014-07-30 - ba3e331 - lavu 52.94.100 - frame.h
Add av_frame_side_data_name()
2014-07-29 - 80a3a66 / 3a19405 - lavf 56.01.100 / 56.01.0 - avformat.h
Add mime_type field to AVProbeData, which now MUST be initialized in
order to avoid uninitialized reads of the mime_type pointer, likely
leading to crashes.
Typically, this means you will do 'AVProbeData pd = { 0 };' instead of
'AVProbeData pd;'.
2014-07-29 - 31e0b5d / 69e7336 - lavu 52.92.100 / 53.19.0 - avstring.h
Make name matching function from lavf public as av_match_name().
2014-07-28 - 2e5c8b0 / c5fca01 - lavc 55.71.100 / 55.57.0 - avcodec.h
Add AV_CODEC_PROP_REORDER to mark codecs supporting frame reordering.
2014-07-27 - ff9a154 - lavf 55.50.100 - avformat.h
New field int64_t probesize2 instead of deprecated
field int probesize.
2014-07-27 - 932ff70 - lavc 55.70.100 - avdct.h
Add AVDCT / avcodec_dct_alloc() / avcodec_dct_init().
2014-07-23 - 8a4c086 - lavf 55.49.100 - avio.h
Add avio_read_to_bprint()
-------- 8< --------- FFmpeg 2.3 was cut here -------- 8< ---------
2014-07-14 - 62227a7 - lavf 55.47.100 - avformat.h 2014-07-14 - 62227a7 - lavf 55.47.100 - avformat.h
Add av_stream_get_parser() Add av_stream_get_parser()
@@ -295,11 +35,7 @@ API changes, most recent first:
is now setting AVStream.time_base, instead of AVStream.codec.time_base as was is now setting AVStream.time_base, instead of AVStream.codec.time_base as was
done previously. The old method is now deprecated. done previously. The old method is now deprecated.
2014-06-11 - 67d29da - lavc 55.66.101 - avcodec.h 2014-06-10 - xxxxxxx - lavf 55.43.100 - avformat.h
Increase FF_INPUT_BUFFER_PADDING_SIZE to 32 due to some corner cases needing
it
2014-06-10 - 5482780 - lavf 55.43.100 - avformat.h
New field int64_t max_analyze_duration2 instead of deprecated New field int64_t max_analyze_duration2 instead of deprecated
int max_analyze_duration. int max_analyze_duration.
@@ -319,28 +55,28 @@ API changes, most recent first:
2014-05-29 - bdb2e80 / b2d4565 - lavr 1.3.0 - avresample.h 2014-05-29 - bdb2e80 / b2d4565 - lavr 1.3.0 - avresample.h
Add avresample_max_output_samples Add avresample_max_output_samples
2014-05-28 - d858ee7 / 6d21259 - lavf 55.42.100 / 55.19.0 - avformat.h 2014-05-24 - d858ee7 / 6d21259 - lavf 55.42.100 / 55.19.0 - avformat.h
Add strict_std_compliance and related AVOptions to support experimental Add strict_std_compliance and related AVOptions to support experimental
muxing. muxing.
2014-05-26 - 55cc60c - lavu 52.87.100 - threadmessage.h 2014-05-26 - xxxxxxx - lavu 52.87.100 - threadmessage.h
Add thread message queue API. Add thread message queue API.
2014-05-26 - c37d179 - lavf 55.41.100 - avformat.h 2014-05-26 - c37d179 - lavf 55.41.100 - avformat.h
Add format_probesize to AVFormatContext. Add format_probesize to AVFormatContext.
2014-05-20 - 7d25af1 / c23c96b - lavf 55.39.100 / 55.18.0 - avformat.h 2014-05-19 - 7d25af1 / c23c96b - lavf 55.39.100 / 55.18.0 - avformat.h
Add av_stream_get_side_data() to access stream-level side data Add av_stream_get_side_data() to access stream-level side data
in the same way as av_packet_get_side_data(). in the same way as av_packet_get_side_data().
2014-05-20 - 7336e39 - lavu 52.86.100 - fifo.h 2014-05-xx - xxxxxxx - lavu 52.86.100 - fifo.h
Add av_fifo_alloc_array() function. Add av_fifo_alloc_array() function.
2014-05-19 - ef1d4ee / bddd8cb - lavu 52.85.100 / 53.15.0 - frame.h, display.h 2014-05-19 - ef1d4ee / bddd8cb - lavu 52.85.100 / 53.15.0 - frame.h, display.h
Add AV_FRAME_DATA_DISPLAYMATRIX for exporting frame-level Add AV_FRAME_DATA_DISPLAYMATRIX for exporting frame-level
spatial rendering on video frames for proper display. spatial rendering on video frames for proper display.
2014-05-19 - ef1d4ee / bddd8cb - lavc 55.64.100 / 55.53.0 - avcodec.h 2014-05-xx - xxxxxxx - lavc 55.64.100 / 55.53.0 - avcodec.h
Add AV_PKT_DATA_DISPLAYMATRIX for exporting packet-level Add AV_PKT_DATA_DISPLAYMATRIX for exporting packet-level
spatial rendering on video frames for proper display. spatial rendering on video frames for proper display.
@@ -352,11 +88,11 @@ API changes, most recent first:
Add avcodec_free_context(). From now on it should be used for freeing Add avcodec_free_context(). From now on it should be used for freeing
AVCodecContext. AVCodecContext.
2014-05-17 - 0eec06e / 1bd0bdc - lavu 52.84.100 / 54.5.0 - time.h 2014-05-17 - 0eec06e - lavu 52.84.100 - time.h
Add av_gettime_relative() av_gettime_relative_is_monotonic() Add av_gettime_relative() av_gettime_relative_is_monotonic()
2014-05-15 - eacf7d6 / 0c1959b - lavf 55.38.100 / 55.17.0 - avformat.h 2014-05-15 - eacf7d6 / 0c1959b - lavf 55.38.100 / 55.17.0 - avformat.h
Add AVFMT_FLAG_BITEXACT flag. Muxers now use it instead of checking Add AVMFT_FLAG_BITEXACT flag. Muxers now use it instead of checking
CODEC_FLAG_BITEXACT on the first stream. CODEC_FLAG_BITEXACT on the first stream.
2014-05-15 - 96cb4c8 - lswr 0.19.100 - swresample.h 2014-05-15 - 96cb4c8 - lswr 0.19.100 - swresample.h
@@ -365,10 +101,10 @@ API changes, most recent first:
2014-05-11 - 14aef38 / 66e6c8a - lavu 52.83.100 / 53.14.0 - pixfmt.h 2014-05-11 - 14aef38 / 66e6c8a - lavu 52.83.100 / 53.14.0 - pixfmt.h
Add AV_PIX_FMT_VDA for new-style VDA acceleration. Add AV_PIX_FMT_VDA for new-style VDA acceleration.
2014-05-07 - 351f611 - lavu 52.82.100 - fifo.h 2014-05-xx - xxxxxxx - lavu 52.82.0 - fifo.h
Add av_fifo_freep() function. Add av_fifo_freep() function.
2014-05-02 - ba52fb11 - lavu 52.81.100 - opt.h 2014-05-02 - ba52fb11 - lavu 52.81.0 - opt.h
Add av_opt_set_dict2() function. Add av_opt_set_dict2() function.
2014-05-01 - e77b985 / a2941c8 - lavc 55.60.103 / 55.50.3 - avcodec.h 2014-05-01 - e77b985 / a2941c8 - lavc 55.60.103 / 55.50.3 - avcodec.h
@@ -387,14 +123,10 @@ API changes, most recent first:
Deprecate CODEC_FLAG_INPUT_PRESERVED. Its functionality is replaced by passing Deprecate CODEC_FLAG_INPUT_PRESERVED. Its functionality is replaced by passing
reference-counted frames to encoders. reference-counted frames to encoders.
2014-04-30 - 617e866 - lavu 52.81.100 - pixdesc.h
Add av_find_best_pix_fmt_of_2(), av_get_pix_fmt_loss()
Deprecate avcodec_get_pix_fmt_loss(), avcodec_find_best_pix_fmt_of_2()
2014-04-29 - 1bf6396 - lavc 55.60.100 - avcodec.h 2014-04-29 - 1bf6396 - lavc 55.60.100 - avcodec.h
Add AVCodecDescriptor.mime_types field. Add AVCodecDescriptor.mime_types field.
2014-04-29 - b804eb4 - lavu 52.80.100 - hash.h 2014-04-29 - xxxxxxx - lavu 52.80.0 - hash.h
Add av_hash_final_bin(), av_hash_final_hex() and av_hash_final_b64(). Add av_hash_final_bin(), av_hash_final_hex() and av_hash_final_b64().
2014-03-07 - 8b2a130 - lavc 55.50.0 / 55.53.100 - dxva2.h 2014-03-07 - 8b2a130 - lavc 55.50.0 / 55.53.100 - dxva2.h
@@ -406,7 +138,7 @@ API changes, most recent first:
2014-04-17 - a8d01a7 / 0983d48 - lavu 53.12.0 / 52.77.100 - crc.h 2014-04-17 - a8d01a7 / 0983d48 - lavu 53.12.0 / 52.77.100 - crc.h
Add AV_CRC_16_ANSI_LE crc variant. Add AV_CRC_16_ANSI_LE crc variant.
2014-04-15 - ef818d8 - lavf 55.37.101 - avformat.h 2014-04-XX - xxxxxxx - lavf xx.xx.1xx - avformat.h
Add av_format_inject_global_side_data() Add av_format_inject_global_side_data()
2014-04-12 - 4f698be - lavu 52.76.100 - log.h 2014-04-12 - 4f698be - lavu 52.76.100 - log.h
@@ -452,9 +184,6 @@ API changes, most recent first:
Give the name AVPacketSideData to the previously anonymous struct used for Give the name AVPacketSideData to the previously anonymous struct used for
AVPacket.side_data. AVPacket.side_data.
-------- 8< --------- FFmpeg 2.2 was cut here -------- 8< ---------
2014-03-18 - 37c07d4 - lsws 2.5.102 2014-03-18 - 37c07d4 - lsws 2.5.102
Make gray16 full-scale. Make gray16 full-scale.
@@ -486,7 +215,7 @@ API changes, most recent first:
2014-02-19 - f4c8d00 / 6bb8720 - lavu 52.64.101 / 53.3.1 - opt.h 2014-02-19 - f4c8d00 / 6bb8720 - lavu 52.64.101 / 53.3.1 - opt.h
Deprecate unused AV_OPT_FLAG_METADATA. Deprecate unused AV_OPT_FLAG_METADATA.
2014-02-16 - 81c3f81 - lavd 55.10.100 - avdevice.h 2014-02-xx - xxxxxxx - lavd 55.10.100 - avdevice.h
Add avdevice_list_devices() and avdevice_free_list_devices() Add avdevice_list_devices() and avdevice_free_list_devices()
2014-02-16 - db3c970 - lavf 55.33.100 - avio.h 2014-02-16 - db3c970 - lavf 55.33.100 - avio.h
@@ -527,7 +256,7 @@ API changes, most recent first:
2014-01-19 - 1a193c4 - lavf 55.25.100 - avformat.h 2014-01-19 - 1a193c4 - lavf 55.25.100 - avformat.h
Add avformat_get_mov_video_tags() and avformat_get_mov_audio_tags(). Add avformat_get_mov_video_tags() and avformat_get_mov_audio_tags().
2014-01-19 - 3532dd5 - lavu 52.63.100 - rational.h 2014-01-19 - xxxxxxx - lavu 52.63.100 - rational.h
Add av_make_q() function. Add av_make_q() function.
2014-01-05 - 4cf4da9 / 5b4797a - lavu 52.62.100 / 53.2.0 - frame.h 2014-01-05 - 4cf4da9 / 5b4797a - lavu 52.62.100 / 53.2.0 - frame.h
@@ -597,9 +326,6 @@ API changes, most recent first:
2013-10-31 - 78265fc / 28096e0 - lavu 52.49.100 / 52.17.0 - frame.h 2013-10-31 - 78265fc / 28096e0 - lavu 52.49.100 / 52.17.0 - frame.h
Add AVFrame.flags and AV_FRAME_FLAG_CORRUPT. Add AVFrame.flags and AV_FRAME_FLAG_CORRUPT.
-------- 8< --------- FFmpeg 2.1 was cut here -------- 8< ---------
2013-10-27 - dbe6f9f - lavc 55.39.100 - avcodec.h 2013-10-27 - dbe6f9f - lavc 55.39.100 - avcodec.h
Add CODEC_CAP_DELAY support to avcodec_decode_subtitle2. Add CODEC_CAP_DELAY support to avcodec_decode_subtitle2.
@@ -672,9 +398,6 @@ API changes, most recent first:
Add avcodec_chroma_pos_to_enum() Add avcodec_chroma_pos_to_enum()
Add avcodec_enum_to_chroma_pos() Add avcodec_enum_to_chroma_pos()
-------- 8< --------- FFmpeg 2.0 was cut here -------- 8< ---------
2013-07-03 - 838bd73 - lavfi 3.78.100 - avfilter.h 2013-07-03 - 838bd73 - lavfi 3.78.100 - avfilter.h
Deprecate avfilter_graph_parse() in favor of the equivalent Deprecate avfilter_graph_parse() in favor of the equivalent
avfilter_graph_parse_ptr(). avfilter_graph_parse_ptr().
@@ -747,9 +470,6 @@ API changes, most recent first:
2013-03-17 - 7aa9af5 - lavu 52.20.100 - opt.h 2013-03-17 - 7aa9af5 - lavu 52.20.100 - opt.h
Add AV_OPT_TYPE_VIDEO_RATE value to AVOptionType enum. Add AV_OPT_TYPE_VIDEO_RATE value to AVOptionType enum.
-------- 8< --------- FFmpeg 1.2 was cut here -------- 8< ---------
2013-03-07 - 9767ec6 - lavu 52.18.100 - avstring.h,bprint.h 2013-03-07 - 9767ec6 - lavu 52.18.100 - avstring.h,bprint.h
Add av_escape() and av_bprint_escape() API. Add av_escape() and av_bprint_escape() API.
@@ -762,9 +482,6 @@ API changes, most recent first:
2013-01-01 - 2eb2e17 - lavfi 3.34.100 2013-01-01 - 2eb2e17 - lavfi 3.34.100
Add avfilter_get_audio_buffer_ref_from_arrays_channels. Add avfilter_get_audio_buffer_ref_from_arrays_channels.
-------- 8< --------- FFmpeg 1.1 was cut here -------- 8< ---------
2012-12-20 - 34de47aa - lavfi 3.29.100 - avfilter.h 2012-12-20 - 34de47aa - lavfi 3.29.100 - avfilter.h
Add AVFilterLink.channels, avfilter_link_get_channels() Add AVFilterLink.channels, avfilter_link_get_channels()
and avfilter_ref_get_channels(). and avfilter_ref_get_channels().
@@ -810,9 +527,6 @@ API changes, most recent first:
Add LIBSWRESAMPLE_VERSION, LIBSWRESAMPLE_BUILD Add LIBSWRESAMPLE_VERSION, LIBSWRESAMPLE_BUILD
and LIBSWRESAMPLE_IDENT symbols. and LIBSWRESAMPLE_IDENT symbols.
-------- 8< --------- FFmpeg 1.0 was cut here -------- 8< ---------
2012-09-06 - 29e972f - lavu 51.72.100 - parseutils.h 2012-09-06 - 29e972f - lavu 51.72.100 - parseutils.h
Add av_small_strptime() time parsing function. Add av_small_strptime() time parsing function.
@@ -1017,9 +731,6 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
avresample_read() are now uint8_t** instead of void**. avresample_read() are now uint8_t** instead of void**.
Libavresample is now stable. Libavresample is now stable.
2012-09-26 - 3ba0dab7 / 1384df64 - lavf 54.29.101 / 56.06.3 - avformat.h
Add AVFormatContext.avoid_negative_ts.
2012-09-24 - 46a3595 / a42aada - lavc 54.59.100 / 54.28.0 - avcodec.h 2012-09-24 - 46a3595 / a42aada - lavc 54.59.100 / 54.28.0 - avcodec.h
Add avcodec_free_frame(). This function must now Add avcodec_free_frame(). This function must now
be used for freeing an AVFrame. be used for freeing an AVFrame.
@@ -1234,9 +945,6 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
2012-01-12 - b18e17e / 3167dc9 - lavfi 2.59.100 / 2.15.0 2012-01-12 - b18e17e / 3167dc9 - lavfi 2.59.100 / 2.15.0
Add a new installed header -- libavfilter/version.h -- with version macros. Add a new installed header -- libavfilter/version.h -- with version macros.
-------- 8< --------- FFmpeg 0.9 was cut here -------- 8< ---------
2011-12-08 - a502939 - lavfi 2.52.0 2011-12-08 - a502939 - lavfi 2.52.0
Add av_buffersink_poll_frame() to buffersink.h. Add av_buffersink_poll_frame() to buffersink.h.
@@ -1446,13 +1154,6 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
2011-06-28 - 5129336 - lavu 51.11.0 - avutil.h 2011-06-28 - 5129336 - lavu 51.11.0 - avutil.h
Define the AV_PICTURE_TYPE_NONE value in AVPictureType enum. Define the AV_PICTURE_TYPE_NONE value in AVPictureType enum.
-------- 8< --------- FFmpeg 0.7 was cut here -------- 8< ---------
-------- 8< --------- FFmpeg 0.8 was cut here -------- 8< ---------
2011-06-19 - fd2c0a5 - lavfi 2.23.0 - avfilter.h 2011-06-19 - fd2c0a5 - lavfi 2.23.0 - avfilter.h
Add layout negotiation fields and helper functions. Add layout negotiation fields and helper functions.
@@ -2130,9 +1831,6 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
2010-06-02 - 7e566bb - lavc 52.73.0 - av_get_codec_tag_string() 2010-06-02 - 7e566bb - lavc 52.73.0 - av_get_codec_tag_string()
Add av_get_codec_tag_string(). Add av_get_codec_tag_string().
-------- 8< --------- FFmpeg 0.6 was cut here -------- 8< ---------
2010-06-01 - 2b99142 - lsws 0.11.0 - convertPalette API 2010-06-01 - 2b99142 - lsws 0.11.0 - convertPalette API
Add sws_convertPalette8ToPacked32() and sws_convertPalette8ToPacked24(). Add sws_convertPalette8ToPacked32() and sws_convertPalette8ToPacked24().
@@ -2150,6 +1848,10 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
2010-05-09 - b6bc205 - lavfi 1.20.0 - AVFilterPicRef 2010-05-09 - b6bc205 - lavfi 1.20.0 - AVFilterPicRef
Add interlaced and top_field_first fields to AVFilterPicRef. Add interlaced and top_field_first fields to AVFilterPicRef.
------------------------------8<-------------------------------------
0.6 branch was cut here
----------------------------->8--------------------------------------
2010-05-01 - 8e2ee18 - lavf 52.62.0 - probe function 2010-05-01 - 8e2ee18 - lavf 52.62.0 - probe function
Add av_probe_input_format2 to API, it allows ignoring probe Add av_probe_input_format2 to API, it allows ignoring probe
results below given score and returns the actual probe score. results below given score and returns the actual probe score.

View File

@@ -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 = 2.7.3 PROJECT_NUMBER = 2.3
# 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

View File

@@ -36,18 +36,14 @@ DOCS-$(CONFIG_MANPAGES) += $(MANPAGES)
DOCS-$(CONFIG_TXTPAGES) += $(TXTPAGES) DOCS-$(CONFIG_TXTPAGES) += $(TXTPAGES)
DOCS = $(DOCS-yes) DOCS = $(DOCS-yes)
DOC_EXAMPLES-$(CONFIG_AVIO_LIST_DIR_EXAMPLE) += avio_list_dir
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_DEMUXING_DECODING_EXAMPLE) += demuxing_decoding DOC_EXAMPLES-$(CONFIG_DEMUXING_DECODING_EXAMPLE) += demuxing_decoding
DOC_EXAMPLES-$(CONFIG_EXTRACT_MVS_EXAMPLE) += extract_mvs
DOC_EXAMPLES-$(CONFIG_FILTER_AUDIO_EXAMPLE) += filter_audio DOC_EXAMPLES-$(CONFIG_FILTER_AUDIO_EXAMPLE) += filter_audio
DOC_EXAMPLES-$(CONFIG_FILTERING_AUDIO_EXAMPLE) += filtering_audio DOC_EXAMPLES-$(CONFIG_FILTERING_AUDIO_EXAMPLE) += filtering_audio
DOC_EXAMPLES-$(CONFIG_FILTERING_VIDEO_EXAMPLE) += filtering_video DOC_EXAMPLES-$(CONFIG_FILTERING_VIDEO_EXAMPLE) += filtering_video
DOC_EXAMPLES-$(CONFIG_METADATA_EXAMPLE) += metadata DOC_EXAMPLES-$(CONFIG_METADATA_EXAMPLE) += metadata
DOC_EXAMPLES-$(CONFIG_MUXING_EXAMPLE) += muxing DOC_EXAMPLES-$(CONFIG_MUXING_EXAMPLE) += muxing
DOC_EXAMPLES-$(CONFIG_QSVDEC_EXAMPLE) += qsvdec
DOC_EXAMPLES-$(CONFIG_REMUXING_EXAMPLE) += remuxing DOC_EXAMPLES-$(CONFIG_REMUXING_EXAMPLE) += remuxing
DOC_EXAMPLES-$(CONFIG_RESAMPLING_AUDIO_EXAMPLE) += resampling_audio DOC_EXAMPLES-$(CONFIG_RESAMPLING_AUDIO_EXAMPLE) += resampling_audio
DOC_EXAMPLES-$(CONFIG_SCALING_VIDEO_EXAMPLE) += scaling_video DOC_EXAMPLES-$(CONFIG_SCALING_VIDEO_EXAMPLE) += scaling_video
@@ -84,25 +80,14 @@ $(GENTEXI): doc/avoptions_%.texi: doc/print_options$(HOSTEXESUF)
$(M)doc/print_options $* > $@ $(M)doc/print_options $* > $@
doc/%.html: TAG = HTML doc/%.html: TAG = HTML
doc/%-all.html: TAG = HTML
ifdef HAVE_MAKEINFO_HTML
doc/%.html: doc/%.texi $(SRC_PATH)/doc/t2h.pm $(GENTEXI)
$(Q)$(TEXIDEP)
$(M)makeinfo --html -I doc --no-split -D config-not-all --init-file=$(SRC_PATH)/doc/t2h.pm --output $@ $<
doc/%-all.html: doc/%.texi $(SRC_PATH)/doc/t2h.pm $(GENTEXI)
$(Q)$(TEXIDEP)
$(M)makeinfo --html -I doc --no-split -D config-all --init-file=$(SRC_PATH)/doc/t2h.pm --output $@ $<
else
doc/%.html: doc/%.texi $(SRC_PATH)/doc/t2h.init $(GENTEXI) doc/%.html: doc/%.texi $(SRC_PATH)/doc/t2h.init $(GENTEXI)
$(Q)$(TEXIDEP) $(Q)$(TEXIDEP)
$(M)texi2html -I doc -monolithic --D=config-not-all --init-file $(SRC_PATH)/doc/t2h.init --output $@ $< $(M)texi2html -I doc -monolithic --D=config-not-all --init-file $(SRC_PATH)/doc/t2h.init --output $@ $<
doc/%-all.html: TAG = HTML
doc/%-all.html: doc/%.texi $(SRC_PATH)/doc/t2h.init $(GENTEXI) doc/%-all.html: doc/%.texi $(SRC_PATH)/doc/t2h.init $(GENTEXI)
$(Q)$(TEXIDEP) $(Q)$(TEXIDEP)
$(M)texi2html -I doc -monolithic --D=config-all --init-file $(SRC_PATH)/doc/t2h.init --output $@ $< $(M)texi2html -I doc -monolithic --D=config-all --init-file $(SRC_PATH)/doc/t2h.init --output $@ $<
endif
doc/%.pod: TAG = POD doc/%.pod: TAG = POD
doc/%.pod: doc/%.texi $(SRC_PATH)/doc/texi2pod.pl $(GENTEXI) doc/%.pod: doc/%.texi $(SRC_PATH)/doc/texi2pod.pl $(GENTEXI)
@@ -116,9 +101,9 @@ doc/%-all.pod: doc/%.texi $(SRC_PATH)/doc/texi2pod.pl $(GENTEXI)
doc/%.1 doc/%.3: TAG = MAN doc/%.1 doc/%.3: TAG = MAN
doc/%.1: doc/%.pod $(GENTEXI) doc/%.1: doc/%.pod $(GENTEXI)
$(M)pod2man --section=1 --center=" " --release=" " --date=" " $< > $@ $(M)pod2man --section=1 --center=" " --release=" " $< > $@
doc/%.3: doc/%.pod $(GENTEXI) doc/%.3: doc/%.pod $(GENTEXI)
$(M)pod2man --section=3 --center=" " --release=" " --date=" " $< > $@ $(M)pod2man --section=3 --center=" " --release=" " $< > $@
$(DOCS) doc/doxy/html: | doc/ $(DOCS) doc/doxy/html: | doc/
$(DOC_EXAMPLES:%$(EXESUF)=%.o): | doc/examples $(DOC_EXAMPLES:%$(EXESUF)=%.o): | doc/examples

View File

@@ -13,16 +13,7 @@ bitstream filter using the option @code{--disable-bsf=BSF}.
The option @code{-bsfs} of the ff* tools will display the list of The option @code{-bsfs} of the ff* tools will display the list of
all the supported bitstream filters included in your build. all the supported bitstream filters included in your build.
The ff* tools have a -bsf option applied per stream, taking a Below is a description of the currently available bitstream filters.
comma-separated list of filters, whose parameters follow the filter
name after a '='.
@example
ffmpeg -i INPUT -c:v copy -bsf:v filter1[=opt1=str1/opt2=str2][,filter2] OUTPUT
@end example
Below is a description of the currently available bitstream filters,
with their parameters, if any.
@section aac_adtstoasc @section aac_adtstoasc
@@ -139,41 +130,14 @@ 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
used for fuzzing or testing error resilience/concealment. used for fuzzing or testing error resilience/concealment.
Parameters:
A numeral string, whose value is related to how often output bytes will
be modified. Therefore, values below or equal to 0 are forbidden, and
the lower the more frequent bytes will be modified, with 1 meaning
every byte is modified.
@example @example
ffmpeg -i INPUT -c copy -bsf noise[=1] output.mkv ffmpeg -i INPUT -c copy -bsf noise output.mkv
@end example @end example
applies the modification to every byte.
@section remove_extra @section remove_extra

File diff suppressed because one or more lines are too long

View File

@@ -7,18 +7,10 @@ V
Disable the default terse mode, the full command issued by make and its Disable the default terse mode, the full command issued by make and its
output will be shown on the screen. output will be shown on the screen.
DBG
Preprocess x86 external assembler files to a .dbg.asm file in the object
directory, which then gets compiled. Helps developping those assembler
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

View File

@@ -7,7 +7,7 @@ all the encoders and decoders. In addition each codec may support
so-called private options, which are specific for a given codec. so-called private options, which are specific for a given codec.
Sometimes, a global option may only affect a specific kind of codec, Sometimes, a global option may only affect a specific kind of codec,
and may be nonsensical or ignored by another, so you need to be aware and may be unsensical or ignored by another, so you need to be aware
of the meaning of the specified options. Also some options are of the meaning of the specified options. Also some options are
meant only for decoding or encoding. meant only for decoding or encoding.
@@ -71,9 +71,7 @@ Force low delay.
@item global_header @item global_header
Place global headers in extradata instead of every keyframe. Place global headers in extradata instead of every keyframe.
@item bitexact @item bitexact
Only write platform-, build- and time-independent data. (except (I)DCT). Use only bitexact stuff (except (I)DCT).
This ensures that file and data checksums are reproducible and match between
platforms. Its primary use is for regression testing.
@item aic @item aic
Apply H263 advanced intra coding / mpeg4 ac prediction. Apply H263 advanced intra coding / mpeg4 ac prediction.
@item cbp @item cbp
@@ -495,15 +493,11 @@ visualize block types
picture buffer allocations picture buffer allocations
@item thread_ops @item thread_ops
threading operations threading operations
@item nomc
skip motion compensation
@end table @end table
@item vismv @var{integer} (@emph{decoding,video}) @item vismv @var{integer} (@emph{decoding,video})
Visualize motion vectors (MVs). Visualize motion vectors (MVs).
This option is deprecated, see the codecview filter instead.
Possible values: Possible values:
@table @samp @table @samp
@item pf @item pf
@@ -803,9 +797,6 @@ Frame data might be split into multiple chunks.
Show all frames before the first keyframe. Show all frames before the first keyframe.
@item skiprd @item skiprd
Deprecated, use mpegvideo private options instead. Deprecated, use mpegvideo private options instead.
@item export_mvs
Export motion vectors into frame side-data (see @code{AV_FRAME_DATA_MOTION_VECTORS})
for codecs that support it. See also @file{doc/examples/export_mvs.c}.
@end table @end table
@item error @var{integer} (@emph{encoding,video}) @item error @var{integer} (@emph{encoding,video})
@@ -865,14 +856,6 @@ Possible values:
@item mpeg2_aac_he @item mpeg2_aac_he
@item mpeg4_sp
@item mpeg4_core
@item mpeg4_main
@item mpeg4_asp
@item dts @item dts
@item dts_es @item dts_es
@@ -1126,19 +1109,6 @@ Interlaced video, bottom coded first, top displayed first
Set to 1 to disable processing alpha (transparency). This works like the Set to 1 to disable processing alpha (transparency). This works like the
@samp{gray} flag in the @option{flags} option which skips chroma information @samp{gray} flag in the @option{flags} option which skips chroma information
instead of alpha. Default is 0. instead of alpha. Default is 0.
@item codec_whitelist @var{list} (@emph{input})
"," separated List of allowed decoders. By default all are allowed.
@item dump_separator @var{string} (@emph{input})
Separator used to separate the fields printed on the command line about the
Stream parameters.
For example to separate the fields with newlines and indention:
@example
ffprobe -dump_separator "
" -i ~/videos/matrixbench_mpeg2.mpg
@end example
@end table @end table
@c man end CODEC OPTIONS @c man end CODEC OPTIONS

View File

@@ -83,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.
@@ -180,9 +163,6 @@ Requires the presence of the libopus headers and library during
configuration. You need to explicitly configure the build with configuration. You need to explicitly configure the build with
@code{--enable-libopus}. @code{--enable-libopus}.
An FFmpeg native decoder for Opus exists, so users can decode Opus
without this library.
@c man end AUDIO DECODERS @c man end AUDIO DECODERS
@chapter Subtitles Decoders @chapter Subtitles Decoders
@@ -207,15 +187,6 @@ The format for this option is a string containing 16 24-bits hexadecimal
numbers (without 0x prefix) separated by comas, for example @code{0d00ee, numbers (without 0x prefix) separated by comas, for example @code{0d00ee,
ee450d, 101010, eaeaea, 0ce60b, ec14ed, ebff0b, 0d617a, 7b7b7b, d1d1d1, ee450d, 101010, eaeaea, 0ce60b, ec14ed, ebff0b, 0d617a, 7b7b7b, d1d1d1,
7b2a0e, 0d950c, 0f007b, cf0dec, cfa80c, 7c127b}. 7b2a0e, 0d950c, 0f007b, cf0dec, cfa80c, 7c127b}.
@item ifo_palette
Specify the IFO file from which the global palette is obtained.
(experimental)
@item forced_subs_only
Only decode subtitle entries marked as forced. Some titles have forced
and non-forced subtitles in the same track. Setting this flag to @code{1}
will only keep the forced subtitles. Default value is @code{0}.
@end table @end table
@section libzvbi-teletext @section libzvbi-teletext

View File

@@ -29,26 +29,6 @@ the caller can decide which variant streams to actually receive.
The total bitrate of the variant that the stream belongs to is The total bitrate of the variant that the stream belongs to is
available in a metadata key named "variant_bitrate". available in a metadata key named "variant_bitrate".
@section apng
Animated Portable Network Graphics demuxer.
This demuxer is used to demux APNG files.
All headers, but the PNG signature, up to (but not including) the first
fcTL chunk are transmitted as extradata.
Frames are then split as being all the chunks between two fcTL ones, or
between the last fcTL and IEND chunks.
@table @option
@item -ignore_loop @var{bool}
Ignore the loop variable in the file if set.
@item -max_fps @var{int}
Maximum framerate in frames per second (0 for no limit).
@item -default_fps @var{int}
Default framerate in frames per second when none is specified in the file
(0 meaning as fast as possible).
@end table
@section asf @section asf
Advanced Systems Format demuxer. Advanced Systems Format demuxer.
@@ -151,7 +131,6 @@ 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
@@ -195,45 +174,6 @@ See @url{http://quvi.sourceforge.net/} for more information.
FFmpeg needs to be built with @code{--enable-libquvi} for this demuxer to be FFmpeg needs to be built with @code{--enable-libquvi} for this demuxer to be
enabled. enabled.
@section gif
Animated GIF demuxer.
It accepts the following options:
@table @option
@item min_delay
Set the minimum valid delay between frames in hundredths of seconds.
Range is 0 to 6000. Default value is 2.
@item 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
Set the default delay between frames in hundredths of seconds.
Range is 0 to 6000. Default value is 10.
@item ignore_loop
GIF files can contain information to loop a certain number of times (or
infinitely). If @option{ignore_loop} is set to 1, then the loop setting
from the input will be ignored and looping will not occur. If set to 0,
then looping will occur and will cycle the number of times according to
the GIF. Default value is 1.
@end table
For example, with the overlay filter, place an infinitely looping GIF
over another video:
@example
ffmpeg -i input.mp4 -ignore_loop 0 -i input.gif -filter_complex overlay=shortest=1 out.mkv
@end example
Note that in the above example the shortest option for overlay filter is
used to end the output video at the length of the shortest input file,
which in this case is @file{input.mp4} as the GIF in this example loops
infinitely.
@section image2 @section image2
Image file demuxer. Image file demuxer.
@@ -259,10 +199,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.

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle Developer Documentation @settitle Developer Documentation
@titlepage @titlepage
@@ -228,7 +227,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)
@@ -239,7 +238,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
@@ -324,12 +323,9 @@ Always fill out the commit log message. Describe in a few lines what you
changed and why. You can refer to mailing list postings if you fix a changed and why. You can refer to mailing list postings if you fix a
particular bug. Comments such as "fixed!" or "Changed it." are unacceptable. particular bug. Comments such as "fixed!" or "Changed it." are unacceptable.
Recommended format: Recommended format:
@example
area changed: Short 1 line description area changed: Short 1 line description
details describing what and why and giving references. details describing what and why and giving references.
@end example
@item @item
Make sure the author of the commit is set correctly. (see git commit --author) Make sure the author of the commit is set correctly. (see git commit --author)
@@ -648,12 +644,12 @@ accordingly].
@subsection Adding files to the fate-suite dataset @subsection Adding files to the fate-suite dataset
When there is no muxer or encoder available to generate test media for a When there is no muxer or encoder available to generate test media for a
specific test then the media has to be included in the fate-suite. specific test then the media has to be inlcuded in the fate-suite.
First please make sure that the sample file is as small as possible to test the First please make sure that the sample file is as small as possible to test the
respective decoder or demuxer sufficiently. Large files increase network respective decoder or demuxer sufficiently. Large files increase network
bandwidth and disk space requirements. bandwidth and disk space requirements.
Once you have a working fate test and fate sample, provide in the commit 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 introductionary 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.

View File

@@ -6,16 +6,8 @@ DOXYGEN="${3}"
shift 3 shift 3
if [ -e "$SRC_PATH/VERSION" ]; then
VERSION=`cat "$SRC_PATH/VERSION"`
else
VERSION=`cd "$SRC_PATH"; git describe`
fi
$DOXYGEN - <<EOF $DOXYGEN - <<EOF
@INCLUDE = ${DOXYFILE} @INCLUDE = ${DOXYFILE}
INPUT = $@ INPUT = $@
EXAMPLE_PATH = ${SRC_PATH}/doc/examples EXAMPLE_PATH = ${SRC_PATH}/doc/examples
HTML_TIMESTAMP = NO
PROJECT_NUMBER = $VERSION
EOF EOF

View File

@@ -494,85 +494,6 @@ 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
@@ -1111,7 +1032,7 @@ configuration. You need to explicitly configure the build with
@subsection Option Mapping @subsection Option Mapping
Most libopus options are modelled after the @command{opusenc} utility from Most libopus options are modeled after the @command{opusenc} utility from
opus-tools. The following is an option mapping chart describing options opus-tools. The following is an option mapping chart describing options
supported by the libopus wrapper, and their @command{opusenc}-equivalent supported by the libopus wrapper, and their @command{opusenc}-equivalent
in parentheses. in parentheses.
@@ -1409,7 +1330,7 @@ ffmpeg -i INPUT -codec:v libtheora -b:v 1000k OUTPUT.ogg
@section libvpx @section libvpx
VP8/VP9 format supported through libvpx. VP8 format supported through libvpx.
Requires the presence of the libvpx headers and library during configuration. Requires the presence of the libvpx headers and library during configuration.
You need to explicitly configure the build with @code{--enable-libvpx}. You need to explicitly configure the build with @code{--enable-libvpx}.
@@ -1521,9 +1442,6 @@ g_lag_in_frames
@item vp8flags error_resilient @item vp8flags error_resilient
g_error_resilient g_error_resilient
@item aq_mode
@code{VP9E_SET_AQ_MODE}
@end table @end table
For more information about libvpx see: For more information about libvpx see:
@@ -1824,10 +1742,6 @@ Enable calculation and printing SSIM stats after the encoding.
Enable the use of Periodic Intra Refresh instead of IDR frames when set Enable the use of Periodic Intra Refresh instead of IDR frames when set
to 1. to 1.
@item avcintra-class (@emph{class})
Configure the encoder to generate AVC-Intra.
Valid values are 50,100 and 200
@item bluray-compat (@emph{bluray-compat}) @item bluray-compat (@emph{bluray-compat})
Configure the encoder to be compatible with the bluray standard. Configure the encoder to be compatible with the bluray standard.
It is a shorthand for setting "bluray-compat=1 force-cfr=1". It is a shorthand for setting "bluray-compat=1 force-cfr=1".
@@ -1965,34 +1879,6 @@ no-fast-pskip=1:subq=6:8x8dct=0:trellis=0 OUTPUT
Encoding ffpresets for common usages are provided so they can be used with the Encoding ffpresets for common usages are provided so they can be used with the
general presets system (e.g. passing the @option{pre} option). general presets system (e.g. passing the @option{pre} option).
@section libx265
x265 H.265/HEVC encoder wrapper.
This encoder requires the presence of the libx265 headers and library
during configuration. You need to explicitly configure the build with
@option{--enable-libx265}.
@subsection Options
@table @option
@item preset
Set the x265 preset.
@item tune
Set the x265 tune parameter.
@item x265-params
Set x265 options using a list of @var{key}=@var{value} couples separated
by ":". See @command{x265 --help} for a list of options.
For example to specify libx265 encoding options with @option{-x265-params}:
@example
ffmpeg -i input -c:v libx265 -x265-params crf=26:psy-rd=1 output.mp4
@end example
@end table
@section libxvid @section libxvid
Xvid MPEG-4 Part 2 encoder wrapper. Xvid MPEG-4 Part 2 encoder wrapper.
@@ -2250,7 +2136,7 @@ Use @var{0} to disable alpha plane coding.
@subsection Speed considerations @subsection Speed considerations
In the default mode of operation the encoder has to honor frame constraints In the default mode of operation the encoder has to honor frame constraints
(i.e. not produce frames with size bigger than requested) while still making (i.e. not produc frames with size bigger than requested) while still making
output picture as good as possible. output picture as good as possible.
A frame containing a lot of small details is harder to compress and the encoder A frame containing a lot of small details is harder to compress and the encoder
would spend more time searching for appropriate quantizers for each slice. would spend more time searching for appropriate quantizers for each slice.

View File

@@ -11,11 +11,9 @@ 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_list_dir \ EXAMPLES= avio_reading \
avio_reading \
decoding_encoding \ decoding_encoding \
demuxing_decoding \ demuxing_decoding \
extract_mvs \
filtering_video \ filtering_video \
filtering_audio \ filtering_audio \
metadata \ metadata \
@@ -30,7 +28,6 @@ OBJS=$(addsuffix .o,$(EXAMPLES))
# the following examples make explicit use of the math library # the following examples make explicit use of the math library
avcodec: LDLIBS += -lm avcodec: LDLIBS += -lm
decoding_encoding: LDLIBS += -lm
muxing: LDLIBS += -lm muxing: LDLIBS += -lm
resampling_audio: LDLIBS += -lm resampling_audio: LDLIBS += -lm

View File

@@ -1,120 +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>";
}
int main(int argc, char *argv[])
{
const char *input_dir = NULL;
AVIODirEntry *entry = NULL;
AVIODirContext *ctx = NULL;
int cnt, ret;
char filemode[4], uid_and_gid[20];
av_log_set_level(AV_LOG_DEBUG);
if (argc != 2) {
fprintf(stderr, "usage: %s input_dir\n"
"API example program to show how to list files in directory "
"accessed through AVIOContext.\n", argv[0]);
return 1;
}
input_dir = argv[1];
/* register codecs and formats and other lavf/lavc components*/
av_register_all();
avformat_network_init();
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);
avformat_network_deinit();
return ret < 0 ? 1 : 0;
}

View File

@@ -288,7 +288,6 @@ static void audio_decode_example(const char *outfilename, const char *filename)
avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f); avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);
while (avpkt.size > 0) { while (avpkt.size > 0) {
int i, ch;
int got_frame = 0; int got_frame = 0;
if (!decoded_frame) { if (!decoded_frame) {
@@ -305,15 +304,15 @@ static void audio_decode_example(const char *outfilename, const char *filename)
} }
if (got_frame) { if (got_frame) {
/* if a frame has been decoded, output it */ /* if a frame has been decoded, output it */
int data_size = av_get_bytes_per_sample(c->sample_fmt); int data_size = av_samples_get_buffer_size(NULL, c->channels,
decoded_frame->nb_samples,
c->sample_fmt, 1);
if (data_size < 0) { if (data_size < 0) {
/* This should not occur, checking just for paranoia */ /* This should not occur, checking just for paranoia */
fprintf(stderr, "Failed to calculate data size\n"); fprintf(stderr, "Failed to calculate data size\n");
exit(1); exit(1);
} }
for (i=0; i<decoded_frame->nb_samples; i++) fwrite(decoded_frame->data[0], 1, data_size, outfile);
for (ch=0; ch<c->channels; ch++)
fwrite(decoded_frame->data[ch] + data_size*i, 1, data_size, outfile);
} }
avpkt.size -= len; avpkt.size -= len;
avpkt.data += len; avpkt.data += len;
@@ -651,7 +650,7 @@ int main(int argc, char **argv)
video_encode_example("test.h264", AV_CODEC_ID_H264); video_encode_example("test.h264", AV_CODEC_ID_H264);
} else if (!strcmp(output_type, "mp2")) { } else if (!strcmp(output_type, "mp2")) {
audio_encode_example("test.mp2"); audio_encode_example("test.mp2");
audio_decode_example("test.pcm", "test.mp2"); audio_decode_example("test.sw", "test.mp2");
} else if (!strcmp(output_type, "mpg")) { } else if (!strcmp(output_type, "mpg")) {
video_encode_example("test.mpg", AV_CODEC_ID_MPEG1VIDEO); video_encode_example("test.mpg", AV_CODEC_ID_MPEG1VIDEO);
video_decode_example("test%02d.pgm", "test.mpg"); video_decode_example("test%02d.pgm", "test.mpg");

View File

@@ -36,8 +36,6 @@
static AVFormatContext *fmt_ctx = NULL; static AVFormatContext *fmt_ctx = NULL;
static AVCodecContext *video_dec_ctx = NULL, *audio_dec_ctx; static AVCodecContext *video_dec_ctx = NULL, *audio_dec_ctx;
static int width, height;
static enum AVPixelFormat pix_fmt;
static AVStream *video_stream = NULL, *audio_stream = NULL; static AVStream *video_stream = NULL, *audio_stream = NULL;
static const char *src_filename = NULL; static const char *src_filename = NULL;
static const char *video_dst_filename = NULL; static const char *video_dst_filename = NULL;
@@ -83,22 +81,6 @@ static int decode_packet(int *got_frame, int cached)
} }
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,
@@ -108,7 +90,7 @@ static int decode_packet(int *got_frame, int cached)
* this is required since rawvideo expects non aligned data */ * this is required since rawvideo expects non aligned data */
av_image_copy(video_dst_data, video_dst_linesize, av_image_copy(video_dst_data, video_dst_linesize,
(const uint8_t **)(frame->data), frame->linesize, (const uint8_t **)(frame->data), frame->linesize,
pix_fmt, width, height); video_dec_ctx->pix_fmt, video_dec_ctx->width, video_dec_ctx->height);
/* write to rawvideo file */ /* write to rawvideo file */
fwrite(video_dst_data[0], 1, video_dst_bufsize, video_dst_file); fwrite(video_dst_data[0], 1, video_dst_bufsize, video_dst_file);
@@ -156,7 +138,7 @@ static int decode_packet(int *got_frame, int cached)
static int open_codec_context(int *stream_idx, static int open_codec_context(int *stream_idx,
AVFormatContext *fmt_ctx, enum AVMediaType type) AVFormatContext *fmt_ctx, enum AVMediaType type)
{ {
int ret, stream_index; int ret;
AVStream *st; AVStream *st;
AVCodecContext *dec_ctx = NULL; AVCodecContext *dec_ctx = NULL;
AVCodec *dec = NULL; AVCodec *dec = NULL;
@@ -168,8 +150,8 @@ static int open_codec_context(int *stream_idx,
av_get_media_type_string(type), src_filename); av_get_media_type_string(type), src_filename);
return ret; return ret;
} else { } else {
stream_index = ret; *stream_idx = ret;
st = fmt_ctx->streams[stream_index]; st = fmt_ctx->streams[*stream_idx];
/* find decoder for the stream */ /* find decoder for the stream */
dec_ctx = st->codec; dec_ctx = st->codec;
@@ -188,7 +170,6 @@ static int open_codec_context(int *stream_idx,
av_get_media_type_string(type)); av_get_media_type_string(type));
return ret; return ret;
} }
*stream_idx = stream_index;
} }
return 0; return 0;
@@ -283,11 +264,9 @@ int main (int argc, char **argv)
} }
/* allocate image where the decoded image will be put */ /* allocate image where the decoded image will be put */
width = video_dec_ctx->width;
height = video_dec_ctx->height;
pix_fmt = video_dec_ctx->pix_fmt;
ret = av_image_alloc(video_dst_data, video_dst_linesize, ret = av_image_alloc(video_dst_data, video_dst_linesize,
width, height, pix_fmt, 1); video_dec_ctx->width, video_dec_ctx->height,
video_dec_ctx->pix_fmt, 1);
if (ret < 0) { if (ret < 0) {
fprintf(stderr, "Could not allocate raw video buffer\n"); fprintf(stderr, "Could not allocate raw video buffer\n");
goto end; goto end;
@@ -362,7 +341,7 @@ int main (int argc, char **argv)
if (video_stream) { if (video_stream) {
printf("Play the output video file with the command:\n" printf("Play the output video file with the command:\n"
"ffplay -f rawvideo -pix_fmt %s -video_size %dx%d %s\n", "ffplay -f rawvideo -pix_fmt %s -video_size %dx%d %s\n",
av_get_pix_fmt_name(pix_fmt), width, height, av_get_pix_fmt_name(video_dec_ctx->pix_fmt), video_dec_ctx->width, video_dec_ctx->height,
video_dst_filename); video_dst_filename);
} }

View File

@@ -1,185 +0,0 @@
/*
* Copyright (c) 2012 Stefano Sabatini
* Copyright (c) 2014 Clément Bœsch
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <libavutil/motion_vector.h>
#include <libavformat/avformat.h>
static AVFormatContext *fmt_ctx = NULL;
static AVCodecContext *video_dec_ctx = NULL;
static AVStream *video_stream = NULL;
static const char *src_filename = NULL;
static int video_stream_idx = -1;
static AVFrame *frame = NULL;
static AVPacket pkt;
static int video_frame_count = 0;
static int decode_packet(int *got_frame, int cached)
{
int decoded = pkt.size;
*got_frame = 0;
if (pkt.stream_index == video_stream_idx) {
int ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt);
if (ret < 0) {
fprintf(stderr, "Error decoding video frame (%s)\n", av_err2str(ret));
return ret;
}
if (*got_frame) {
int i;
AVFrameSideData *sd;
video_frame_count++;
sd = av_frame_get_side_data(frame, AV_FRAME_DATA_MOTION_VECTORS);
if (sd) {
const AVMotionVector *mvs = (const AVMotionVector *)sd->data;
for (i = 0; i < sd->size / sizeof(*mvs); i++) {
const AVMotionVector *mv = &mvs[i];
printf("%d,%2d,%2d,%2d,%4d,%4d,%4d,%4d,0x%"PRIx64"\n",
video_frame_count, mv->source,
mv->w, mv->h, mv->src_x, mv->src_y,
mv->dst_x, mv->dst_y, mv->flags);
}
}
}
}
return decoded;
}
static int open_codec_context(int *stream_idx,
AVFormatContext *fmt_ctx, enum AVMediaType type)
{
int ret;
AVStream *st;
AVCodecContext *dec_ctx = NULL;
AVCodec *dec = NULL;
AVDictionary *opts = NULL;
ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0);
if (ret < 0) {
fprintf(stderr, "Could not find %s stream in input file '%s'\n",
av_get_media_type_string(type), src_filename);
return ret;
} else {
*stream_idx = ret;
st = fmt_ctx->streams[*stream_idx];
/* find decoder for the stream */
dec_ctx = st->codec;
dec = avcodec_find_decoder(dec_ctx->codec_id);
if (!dec) {
fprintf(stderr, "Failed to find %s codec\n",
av_get_media_type_string(type));
return AVERROR(EINVAL);
}
/* Init the video decoder */
av_dict_set(&opts, "flags2", "+export_mvs", 0);
if ((ret = avcodec_open2(dec_ctx, dec, &opts)) < 0) {
fprintf(stderr, "Failed to open %s codec\n",
av_get_media_type_string(type));
return ret;
}
}
return 0;
}
int main(int argc, char **argv)
{
int ret = 0, got_frame;
if (argc != 2) {
fprintf(stderr, "Usage: %s <video>\n", argv[0]);
exit(1);
}
src_filename = argv[1];
av_register_all();
if (avformat_open_input(&fmt_ctx, src_filename, NULL, NULL) < 0) {
fprintf(stderr, "Could not open source file %s\n", src_filename);
exit(1);
}
if (avformat_find_stream_info(fmt_ctx, NULL) < 0) {
fprintf(stderr, "Could not find stream information\n");
exit(1);
}
if (open_codec_context(&video_stream_idx, fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0) {
video_stream = fmt_ctx->streams[video_stream_idx];
video_dec_ctx = video_stream->codec;
}
av_dump_format(fmt_ctx, 0, src_filename, 0);
if (!video_stream) {
fprintf(stderr, "Could not find video stream in the input, aborting\n");
ret = 1;
goto end;
}
frame = av_frame_alloc();
if (!frame) {
fprintf(stderr, "Could not allocate frame\n");
ret = AVERROR(ENOMEM);
goto end;
}
printf("framenum,source,blockw,blockh,srcx,srcy,dstx,dsty,flags\n");
/* initialize packet, set data to NULL, let the demuxer fill it */
av_init_packet(&pkt);
pkt.data = NULL;
pkt.size = 0;
/* read frames from the file */
while (av_read_frame(fmt_ctx, &pkt) >= 0) {
AVPacket orig_pkt = pkt;
do {
ret = decode_packet(&got_frame, 0);
if (ret < 0)
break;
pkt.data += ret;
pkt.size -= ret;
} while (pkt.size > 0);
av_free_packet(&orig_pkt);
}
/* flush cached frames */
pkt.data = NULL;
pkt.size = 0;
do {
decode_packet(&got_frame, 1);
} while (got_frame);
end:
avcodec_close(video_dec_ctx);
avformat_close_input(&fmt_ctx);
av_frame_free(&frame);
return ret < 0;
}

View File

@@ -45,7 +45,6 @@
#include "libavutil/channel_layout.h" #include "libavutil/channel_layout.h"
#include "libavutil/md5.h" #include "libavutil/md5.h"
#include "libavutil/mem.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
#include "libavutil/samplefmt.h" #include "libavutil/samplefmt.h"

View File

@@ -145,28 +145,12 @@ static int init_filters(const char *filters_descr)
goto end; goto end;
} }
/* /* Endpoints for the filter graph. */
* Set the endpoints for the filter graph. The filter_graph will
* be linked to the graph described by filters_descr.
*/
/*
* The buffer source output must be connected to the input pad of
* the first filter described by filters_descr; since the first
* filter input label is not specified, it is set to "in" by
* default.
*/
outputs->name = av_strdup("in"); outputs->name = av_strdup("in");
outputs->filter_ctx = buffersrc_ctx; outputs->filter_ctx = buffersrc_ctx;
outputs->pad_idx = 0; outputs->pad_idx = 0;
outputs->next = NULL; outputs->next = NULL;
/*
* The buffer sink input must be connected to the output pad of
* the last filter described by filters_descr; since the last
* filter output label is not specified, it is set to "out" by
* default.
*/
inputs->name = av_strdup("out"); inputs->name = av_strdup("out");
inputs->filter_ctx = buffersink_ctx; inputs->filter_ctx = buffersink_ctx;
inputs->pad_idx = 0; inputs->pad_idx = 0;

View File

@@ -90,7 +90,6 @@ static int init_filters(const char *filters_descr)
AVFilter *buffersink = avfilter_get_by_name("buffersink"); AVFilter *buffersink = avfilter_get_by_name("buffersink");
AVFilterInOut *outputs = avfilter_inout_alloc(); AVFilterInOut *outputs = avfilter_inout_alloc();
AVFilterInOut *inputs = avfilter_inout_alloc(); AVFilterInOut *inputs = avfilter_inout_alloc();
AVRational time_base = fmt_ctx->streams[video_stream_index]->time_base;
enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE }; enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE };
filter_graph = avfilter_graph_alloc(); filter_graph = avfilter_graph_alloc();
@@ -103,7 +102,7 @@ static int init_filters(const char *filters_descr)
snprintf(args, sizeof(args), snprintf(args, sizeof(args),
"video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d", "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt, dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
time_base.num, time_base.den, dec_ctx->time_base.num, dec_ctx->time_base.den,
dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den); dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den);
ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in", ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
@@ -128,28 +127,12 @@ static int init_filters(const char *filters_descr)
goto end; goto end;
} }
/* /* Endpoints for the filter graph. */
* Set the endpoints for the filter graph. The filter_graph will
* be linked to the graph described by filters_descr.
*/
/*
* The buffer source output must be connected to the input pad of
* the first filter described by filters_descr; since the first
* filter input label is not specified, it is set to "in" by
* default.
*/
outputs->name = av_strdup("in"); outputs->name = av_strdup("in");
outputs->filter_ctx = buffersrc_ctx; outputs->filter_ctx = buffersrc_ctx;
outputs->pad_idx = 0; outputs->pad_idx = 0;
outputs->next = NULL; outputs->next = NULL;
/*
* The buffer sink input must be connected to the output pad of
* the last filter described by filters_descr; since the last
* filter output label is not specified, it is set to "out" by
* default.
*/
inputs->name = av_strdup("out"); inputs->name = av_strdup("out");
inputs->filter_ctx = buffersink_ctx; inputs->filter_ctx = buffersink_ctx;
inputs->pad_idx = 0; inputs->pad_idx = 0;

View File

@@ -55,7 +55,6 @@ typedef struct OutputStream {
/* 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;
int samples_count;
AVFrame *frame; AVFrame *frame;
AVFrame *tmp_frame; AVFrame *tmp_frame;
@@ -63,7 +62,6 @@ typedef struct OutputStream {
float t, tincr, tincr2; float t, tincr, tincr2;
struct SwsContext *sws_ctx; struct SwsContext *sws_ctx;
struct SwrContext *swr_ctx;
} OutputStream; } OutputStream;
static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt) static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt)
@@ -94,7 +92,6 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
enum AVCodecID codec_id) enum AVCodecID codec_id)
{ {
AVCodecContext *c; AVCodecContext *c;
int i;
/* find the encoder */ /* find the encoder */
*codec = avcodec_find_encoder(codec_id); *codec = avcodec_find_encoder(codec_id);
@@ -118,24 +115,8 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
(*codec)->sample_fmts[0] : AV_SAMPLE_FMT_FLTP; (*codec)->sample_fmts[0] : AV_SAMPLE_FMT_FLTP;
c->bit_rate = 64000; c->bit_rate = 64000;
c->sample_rate = 44100; c->sample_rate = 44100;
if ((*codec)->supported_samplerates) { c->channels = 2;
c->sample_rate = (*codec)->supported_samplerates[0];
for (i = 0; (*codec)->supported_samplerates[i]; i++) {
if ((*codec)->supported_samplerates[i] == 44100)
c->sample_rate = 44100;
}
}
c->channels = av_get_channel_layout_nb_channels(c->channel_layout);
c->channel_layout = AV_CH_LAYOUT_STEREO; c->channel_layout = AV_CH_LAYOUT_STEREO;
if ((*codec)->channel_layouts) {
c->channel_layout = (*codec)->channel_layouts[0];
for (i = 0; (*codec)->channel_layouts[i]; i++) {
if ((*codec)->channel_layouts[i] == AV_CH_LAYOUT_STEREO)
c->channel_layout = AV_CH_LAYOUT_STEREO;
}
}
c->channels = av_get_channel_layout_nb_channels(c->channel_layout);
ost->st->time_base = (AVRational){ 1, c->sample_rate };
break; break;
case AVMEDIA_TYPE_VIDEO: case AVMEDIA_TYPE_VIDEO:
@@ -149,9 +130,8 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
* of which frame timestamps are represented. For fixed-fps content, * of which frame timestamps are represented. For fixed-fps content,
* timebase should be 1/framerate and timestamp increments should be * timebase should be 1/framerate and timestamp increments should be
* identical to 1. */ * identical to 1. */
ost->st->time_base = (AVRational){ 1, STREAM_FRAME_RATE }; c->time_base.den = STREAM_FRAME_RATE;
c->time_base = ost->st->time_base; c->time_base.num = 1;
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) {
@@ -178,47 +158,19 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
/**************************************************************/ /**************************************************************/
/* audio output */ /* audio output */
static AVFrame *alloc_audio_frame(enum AVSampleFormat sample_fmt, int samples_count;
uint64_t channel_layout,
int sample_rate, int nb_samples)
{
AVFrame *frame = av_frame_alloc();
int ret;
if (!frame) { struct SwrContext *swr_ctx = NULL;
fprintf(stderr, "Error allocating an audio frame\n");
exit(1);
}
frame->format = sample_fmt; static void open_audio(AVFormatContext *oc, AVCodec *codec, OutputStream *ost)
frame->channel_layout = channel_layout;
frame->sample_rate = sample_rate;
frame->nb_samples = nb_samples;
if (nb_samples) {
ret = av_frame_get_buffer(frame, 0);
if (ret < 0) {
fprintf(stderr, "Error allocating an audio buffer\n");
exit(1);
}
}
return frame;
}
static void open_audio(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg)
{ {
AVCodecContext *c; AVCodecContext *c;
int nb_samples;
int ret; int ret;
AVDictionary *opt = NULL;
c = ost->st->codec; c = ost->st->codec;
/* open it */ /* open it */
av_dict_copy(&opt, opt_arg, 0); ret = avcodec_open2(c, codec, NULL);
ret = avcodec_open2(c, codec, &opt);
av_dict_free(&opt);
if (ret < 0) { if (ret < 0) {
fprintf(stderr, "Could not open audio codec: %s\n", av_err2str(ret)); fprintf(stderr, "Could not open audio codec: %s\n", av_err2str(ret));
exit(1); exit(1);
@@ -230,52 +182,84 @@ 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 & CODEC_CAP_VARIABLE_FRAME_SIZE) ost->frame = av_frame_alloc();
nb_samples = 10000; if (!ost->frame)
else exit(1);
nb_samples = c->frame_size;
ost->frame = alloc_audio_frame(c->sample_fmt, c->channel_layout, ost->frame->sample_rate = c->sample_rate;
c->sample_rate, nb_samples); ost->frame->format = AV_SAMPLE_FMT_S16;
ost->tmp_frame = alloc_audio_frame(AV_SAMPLE_FMT_S16, c->channel_layout, ost->frame->channel_layout = c->channel_layout;
c->sample_rate, nb_samples);
if (c->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)
ost->frame->nb_samples = 10000;
else
ost->frame->nb_samples = c->frame_size;
ost->tmp_frame = av_frame_alloc();
if (!ost->frame)
exit(1);
ost->tmp_frame->sample_rate = c->sample_rate;
ost->tmp_frame->format = c->sample_fmt;
ost->tmp_frame->channel_layout = c->channel_layout;
ost->tmp_frame->nb_samples = ost->frame->nb_samples;
/* create resampler context */ /* create resampler context */
ost->swr_ctx = swr_alloc(); if (c->sample_fmt != AV_SAMPLE_FMT_S16) {
if (!ost->swr_ctx) { swr_ctx = swr_alloc();
if (!swr_ctx) {
fprintf(stderr, "Could not allocate resampler context\n"); fprintf(stderr, "Could not allocate resampler context\n");
exit(1); exit(1);
} }
/* set options */ /* set options */
av_opt_set_int (ost->swr_ctx, "in_channel_count", c->channels, 0); av_opt_set_int (swr_ctx, "in_channel_count", c->channels, 0);
av_opt_set_int (ost->swr_ctx, "in_sample_rate", c->sample_rate, 0); av_opt_set_int (swr_ctx, "in_sample_rate", c->sample_rate, 0);
av_opt_set_sample_fmt(ost->swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0); av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0);
av_opt_set_int (ost->swr_ctx, "out_channel_count", c->channels, 0); av_opt_set_int (swr_ctx, "out_channel_count", c->channels, 0);
av_opt_set_int (ost->swr_ctx, "out_sample_rate", c->sample_rate, 0); av_opt_set_int (swr_ctx, "out_sample_rate", c->sample_rate, 0);
av_opt_set_sample_fmt(ost->swr_ctx, "out_sample_fmt", c->sample_fmt, 0); av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", c->sample_fmt, 0);
/* initialize the resampling context */ /* initialize the resampling context */
if ((ret = swr_init(ost->swr_ctx)) < 0) { if ((ret = swr_init(swr_ctx)) < 0) {
fprintf(stderr, "Failed to initialize the resampling context\n"); fprintf(stderr, "Failed to initialize the resampling context\n");
exit(1); exit(1);
} }
} }
ret = av_frame_get_buffer(ost->frame, 0);
if (ret < 0) {
fprintf(stderr, "Could not allocate an audio frame.\n");
exit(1);
}
ret = av_frame_get_buffer(ost->tmp_frame, 0);
if (ret < 0) {
fprintf(stderr, "Could not allocate an audio frame.\n");
exit(1);
}
}
/* Prepare a 16 bit dummy audio frame of 'frame_size' samples and /* Prepare a 16 bit dummy audio frame of 'frame_size' samples and
* 'nb_channels' channels. */ * 'nb_channels' channels. */
static AVFrame *get_audio_frame(OutputStream *ost) static AVFrame *get_audio_frame(OutputStream *ost)
{ {
AVFrame *frame = ost->tmp_frame; int j, i, v, ret;
int j, i, v; int16_t *q = (int16_t*)ost->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->st->codec->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++) { /* when we pass a frame to the encoder, it may keep a reference to it
* internally;
* make sure we do not overwrite it here
*/
ret = av_frame_make_writable(ost->frame);
if (ret < 0)
exit(1);
for (j = 0; j < ost->frame->nb_samples; j++) {
v = (int)(sin(ost->t) * 10000); v = (int)(sin(ost->t) * 10000);
for (i = 0; i < ost->st->codec->channels; i++) for (i = 0; i < ost->st->codec->channels; i++)
*q++ = v; *q++ = v;
@@ -283,10 +267,10 @@ static AVFrame *get_audio_frame(OutputStream *ost)
ost->tincr += ost->tincr2; ost->tincr += ost->tincr2;
} }
frame->pts = ost->next_pts; ost->frame->pts = ost->next_pts;
ost->next_pts += frame->nb_samples; ost->next_pts += ost->frame->nb_samples;
return frame; return ost->frame;
} }
/* /*
@@ -309,31 +293,27 @@ static int write_audio_frame(AVFormatContext *oc, OutputStream *ost)
if (frame) { if (frame) {
/* convert samples from native format to destination codec format, using the resampler */ /* convert samples from native format to destination codec format, using the resampler */
if (swr_ctx) {
/* compute destination number of samples */ /* compute destination number of samples */
dst_nb_samples = av_rescale_rnd(swr_get_delay(ost->swr_ctx, c->sample_rate) + frame->nb_samples, dst_nb_samples = av_rescale_rnd(swr_get_delay(swr_ctx, c->sample_rate) + frame->nb_samples,
c->sample_rate, c->sample_rate, AV_ROUND_UP); c->sample_rate, c->sample_rate, AV_ROUND_UP);
av_assert0(dst_nb_samples == frame->nb_samples); av_assert0(dst_nb_samples == frame->nb_samples);
/* when we pass a frame to the encoder, it may keep a reference to it
* internally;
* make sure we do not overwrite it here
*/
ret = av_frame_make_writable(ost->frame);
if (ret < 0)
exit(1);
/* convert to destination format */ /* convert to destination format */
ret = swr_convert(ost->swr_ctx, ret = swr_convert(swr_ctx,
ost->frame->data, dst_nb_samples, ost->tmp_frame->data, dst_nb_samples,
(const uint8_t **)frame->data, frame->nb_samples); (const uint8_t **)frame->data, frame->nb_samples);
if (ret < 0) { if (ret < 0) {
fprintf(stderr, "Error while converting\n"); fprintf(stderr, "Error while converting\n");
exit(1); exit(1);
} }
frame = ost->frame; frame = ost->tmp_frame;
} else {
dst_nb_samples = frame->nb_samples;
}
frame->pts = av_rescale_q(ost->samples_count, (AVRational){1, c->sample_rate}, c->time_base); frame->pts = av_rescale_q(samples_count, (AVRational){1, c->sample_rate}, c->time_base);
ost->samples_count += dst_nb_samples; samples_count += dst_nb_samples;
} }
ret = avcodec_encode_audio2(c, &pkt, frame, &got_packet); ret = avcodec_encode_audio2(c, &pkt, frame, &got_packet);
@@ -380,17 +360,13 @@ static AVFrame *alloc_picture(enum AVPixelFormat pix_fmt, int width, int height)
return picture; return picture;
} }
static void open_video(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg) static void open_video(AVFormatContext *oc, AVCodec *codec, OutputStream *ost)
{ {
int ret; int ret;
AVCodecContext *c = ost->st->codec; AVCodecContext *c = ost->st->codec;
AVDictionary *opt = NULL;
av_dict_copy(&opt, opt_arg, 0);
/* open the codec */ /* open the codec */
ret = avcodec_open2(c, codec, &opt); ret = avcodec_open2(c, codec, NULL);
av_dict_free(&opt);
if (ret < 0) { if (ret < 0) {
fprintf(stderr, "Could not open video codec: %s\n", av_err2str(ret)); fprintf(stderr, "Could not open video codec: %s\n", av_err2str(ret));
exit(1); exit(1);
@@ -547,7 +523,6 @@ static void close_stream(AVFormatContext *oc, OutputStream *ost)
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);
swr_free(&ost->swr_ctx);
} }
/**************************************************************/ /**************************************************************/
@@ -563,12 +538,11 @@ int main(int argc, char **argv)
int ret; int ret;
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;
/* Initialize libavcodec, and register all codecs and formats. */ /* Initialize libavcodec, and register all codecs and formats. */
av_register_all(); av_register_all();
if (argc < 2) { if (argc != 2) {
printf("usage: %s output_file\n" printf("usage: %s output_file\n"
"API example program to output a media file with libavformat.\n" "API example program to output a media file with libavformat.\n"
"This program generates a synthetic audio and video stream, encodes and\n" "This program generates a synthetic audio and video stream, encodes and\n"
@@ -580,9 +554,6 @@ int main(int argc, char **argv)
} }
filename = argv[1]; filename = argv[1];
if (argc > 3 && !strcmp(argv[2], "-flags")) {
av_dict_set(&opt, argv[2]+1, argv[3], 0);
}
/* allocate the output media context */ /* allocate the output media context */
avformat_alloc_output_context2(&oc, NULL, NULL, filename); avformat_alloc_output_context2(&oc, NULL, NULL, filename);
@@ -611,10 +582,10 @@ int main(int argc, char **argv)
/* Now that all the parameters are set, we can open the audio and /* Now that all the parameters are set, we can open the audio and
* video codecs and allocate the necessary encode buffers. */ * video codecs and allocate the necessary encode buffers. */
if (have_video) if (have_video)
open_video(oc, video_codec, &video_st, opt); open_video(oc, video_codec, &video_st);
if (have_audio) if (have_audio)
open_audio(oc, audio_codec, &audio_st, opt); open_audio(oc, audio_codec, &audio_st);
av_dump_format(oc, 0, filename, 1); av_dump_format(oc, 0, filename, 1);
@@ -629,7 +600,7 @@ int main(int argc, char **argv)
} }
/* Write the stream header, if any. */ /* Write the stream header, if any. */
ret = avformat_write_header(oc, &opt); ret = avformat_write_header(oc, NULL);
if (ret < 0) { if (ret < 0) {
fprintf(stderr, "Error occurred when opening output file: %s\n", fprintf(stderr, "Error occurred when opening output file: %s\n",
av_err2str(ret)); av_err2str(ret));
@@ -661,7 +632,7 @@ int main(int argc, char **argv)
if (!(fmt->flags & AVFMT_NOFILE)) if (!(fmt->flags & AVFMT_NOFILE))
/* Close the output file. */ /* Close the output file. */
avio_closep(&oc->pb); avio_close(oc->pb);
/* free the stream */ /* free the stream */
avformat_free_context(oc); avformat_free_context(oc);

View File

@@ -1,484 +0,0 @@
/*
* Copyright (c) 2015 Anton Khirnov
*
* 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
* Intel QSV-accelerated H.264 decoding example.
*
* @example qsvdec.c
* This example shows how to do QSV-accelerated H.264 decoding with output
* frames in the VA-API video surfaces.
*/
#include "config.h"
#include <stdio.h>
#include <mfx/mfxvideo.h>
#include <va/va.h>
#include <va/va_x11.h>
#include <X11/Xlib.h>
#include "libavformat/avformat.h"
#include "libavformat/avio.h"
#include "libavcodec/avcodec.h"
#include "libavcodec/qsv.h"
#include "libavutil/error.h"
#include "libavutil/mem.h"
typedef struct DecodeContext {
mfxSession mfx_session;
VADisplay va_dpy;
VASurfaceID *surfaces;
mfxMemId *surface_ids;
int *surface_used;
int nb_surfaces;
mfxFrameInfo frame_info;
} DecodeContext;
static mfxStatus frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req,
mfxFrameAllocResponse *resp)
{
DecodeContext *decode = pthis;
int err, i;
if (decode->surfaces) {
fprintf(stderr, "Multiple allocation requests.\n");
return MFX_ERR_MEMORY_ALLOC;
}
if (!(req->Type & MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET)) {
fprintf(stderr, "Unsupported surface type: %d\n", req->Type);
return MFX_ERR_UNSUPPORTED;
}
if (req->Info.BitDepthLuma != 8 || req->Info.BitDepthChroma != 8 ||
req->Info.Shift || req->Info.FourCC != MFX_FOURCC_NV12 ||
req->Info.ChromaFormat != MFX_CHROMAFORMAT_YUV420) {
fprintf(stderr, "Unsupported surface properties.\n");
return MFX_ERR_UNSUPPORTED;
}
decode->surfaces = av_malloc_array (req->NumFrameSuggested, sizeof(*decode->surfaces));
decode->surface_ids = av_malloc_array (req->NumFrameSuggested, sizeof(*decode->surface_ids));
decode->surface_used = av_mallocz_array(req->NumFrameSuggested, sizeof(*decode->surface_used));
if (!decode->surfaces || !decode->surface_ids || !decode->surface_used)
goto fail;
err = vaCreateSurfaces(decode->va_dpy, VA_RT_FORMAT_YUV420,
req->Info.Width, req->Info.Height,
decode->surfaces, req->NumFrameSuggested,
NULL, 0);
if (err != VA_STATUS_SUCCESS) {
fprintf(stderr, "Error allocating VA surfaces\n");
goto fail;
}
decode->nb_surfaces = req->NumFrameSuggested;
for (i = 0; i < decode->nb_surfaces; i++)
decode->surface_ids[i] = &decode->surfaces[i];
resp->mids = decode->surface_ids;
resp->NumFrameActual = decode->nb_surfaces;
decode->frame_info = req->Info;
return MFX_ERR_NONE;
fail:
av_freep(&decode->surfaces);
av_freep(&decode->surface_ids);
av_freep(&decode->surface_used);
return MFX_ERR_MEMORY_ALLOC;
}
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;
}
static mfxStatus frame_lock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr)
{
return MFX_ERR_UNSUPPORTED;
}
static mfxStatus frame_unlock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr)
{
return MFX_ERR_UNSUPPORTED;
}
static mfxStatus frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl)
{
*hdl = mid;
return MFX_ERR_NONE;
}
static void free_buffer(void *opaque, uint8_t *data)
{
int *used = opaque;
*used = 0;
av_freep(&data);
}
static int get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
{
DecodeContext *decode = avctx->opaque;
mfxFrameSurface1 *surf;
AVBufferRef *surf_buf;
int idx;
for (idx = 0; idx < decode->nb_surfaces; idx++) {
if (!decode->surface_used[idx])
break;
}
if (idx == decode->nb_surfaces) {
fprintf(stderr, "No free surfaces\n");
return AVERROR(ENOMEM);
}
surf = av_mallocz(sizeof(*surf));
if (!surf)
return AVERROR(ENOMEM);
surf_buf = av_buffer_create((uint8_t*)surf, sizeof(*surf), free_buffer,
&decode->surface_used[idx], AV_BUFFER_FLAG_READONLY);
if (!surf_buf) {
av_freep(&surf);
return AVERROR(ENOMEM);
}
surf->Info = decode->frame_info;
surf->Data.MemId = &decode->surfaces[idx];
frame->buf[0] = surf_buf;
frame->data[3] = (uint8_t*)surf;
decode->surface_used[idx] = 1;
return 0;
}
static int get_format(AVCodecContext *avctx, const enum AVPixelFormat *pix_fmts)
{
while (*pix_fmts != AV_PIX_FMT_NONE) {
if (*pix_fmts == AV_PIX_FMT_QSV) {
if (!avctx->hwaccel_context) {
DecodeContext *decode = avctx->opaque;
AVQSVContext *qsv = av_qsv_alloc_context();
if (!qsv)
return AV_PIX_FMT_NONE;
qsv->session = decode->mfx_session;
qsv->iopattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY;
avctx->hwaccel_context = qsv;
}
return AV_PIX_FMT_QSV;
}
pix_fmts++;
}
fprintf(stderr, "The QSV pixel format not offered in get_format()\n");
return AV_PIX_FMT_NONE;
}
static int decode_packet(DecodeContext *decode, AVCodecContext *decoder_ctx,
AVFrame *frame, AVPacket *pkt,
AVIOContext *output_ctx)
{
int ret = 0;
int got_frame = 1;
while (pkt->size > 0 || (!pkt->data && got_frame)) {
ret = avcodec_decode_video2(decoder_ctx, frame, &got_frame, pkt);
if (ret < 0) {
fprintf(stderr, "Error during decoding\n");
return ret;
}
pkt->data += ret;
pkt->size -= ret;
/* A real program would do something useful with the decoded frame here.
* We just retrieve the raw data and write it to a file, which is rather
* useless but pedagogic. */
if (got_frame) {
mfxFrameSurface1 *surf = (mfxFrameSurface1*)frame->data[3];
VASurfaceID surface = *(VASurfaceID*)surf->Data.MemId;
VAImageFormat img_fmt = {
.fourcc = VA_FOURCC_NV12,
.byte_order = VA_LSB_FIRST,
.bits_per_pixel = 8,
.depth = 8,
};
VAImage img;
VAStatus err;
uint8_t *data;
int i, j;
img.buf = VA_INVALID_ID;
img.image_id = VA_INVALID_ID;
err = vaCreateImage(decode->va_dpy, &img_fmt,
frame->width, frame->height, &img);
if (err != VA_STATUS_SUCCESS) {
fprintf(stderr, "Error creating an image: %s\n",
vaErrorStr(err));
ret = AVERROR_UNKNOWN;
goto fail;
}
err = vaGetImage(decode->va_dpy, surface, 0, 0,
frame->width, frame->height,
img.image_id);
if (err != VA_STATUS_SUCCESS) {
fprintf(stderr, "Error getting an image: %s\n",
vaErrorStr(err));
ret = AVERROR_UNKNOWN;
goto fail;
}
err = vaMapBuffer(decode->va_dpy, img.buf, (void**)&data);
if (err != VA_STATUS_SUCCESS) {
fprintf(stderr, "Error mapping the image buffer: %s\n",
vaErrorStr(err));
ret = AVERROR_UNKNOWN;
goto fail;
}
for (i = 0; i < img.num_planes; i++)
for (j = 0; j < (img.height >> (i > 0)); j++)
avio_write(output_ctx, data + img.offsets[i] + j * img.pitches[i], img.width);
fail:
if (img.buf != VA_INVALID_ID)
vaUnmapBuffer(decode->va_dpy, img.buf);
if (img.image_id != VA_INVALID_ID)
vaDestroyImage(decode->va_dpy, img.image_id);
av_frame_unref(frame);
if (ret < 0)
return ret;
}
}
return 0;
}
int main(int argc, char **argv)
{
AVFormatContext *input_ctx = NULL;
AVStream *video_st = NULL;
AVCodecContext *decoder_ctx = NULL;
const AVCodec *decoder;
AVPacket pkt = { 0 };
AVFrame *frame = NULL;
DecodeContext decode = { NULL };
Display *dpy = NULL;
int va_ver_major, va_ver_minor;
mfxIMPL mfx_impl = MFX_IMPL_AUTO_ANY;
mfxVersion mfx_ver = { { 1, 1 } };
mfxFrameAllocator frame_allocator = {
.pthis = &decode,
.Alloc = frame_alloc,
.Lock = frame_lock,
.Unlock = frame_unlock,
.GetHDL = frame_get_hdl,
.Free = frame_free,
};
AVIOContext *output_ctx = NULL;
int ret, i, err;
av_register_all();
if (argc < 3) {
fprintf(stderr, "Usage: %s <input file> <output file>\n", argv[0]);
return 1;
}
/* open the input file */
ret = avformat_open_input(&input_ctx, argv[1], NULL, NULL);
if (ret < 0) {
fprintf(stderr, "Cannot open input file '%s': ", argv[1]);
goto finish;
}
/* find the first H.264 video stream */
for (i = 0; i < input_ctx->nb_streams; i++) {
AVStream *st = input_ctx->streams[i];
if (st->codec->codec_id == AV_CODEC_ID_H264 && !video_st)
video_st = st;
else
st->discard = AVDISCARD_ALL;
}
if (!video_st) {
fprintf(stderr, "No H.264 video stream in the input file\n");
goto finish;
}
/* initialize VA-API */
dpy = XOpenDisplay(NULL);
if (!dpy) {
fprintf(stderr, "Cannot open the X display\n");
goto finish;
}
decode.va_dpy = vaGetDisplay(dpy);
if (!decode.va_dpy) {
fprintf(stderr, "Cannot open the VA display\n");
goto finish;
}
err = vaInitialize(decode.va_dpy, &va_ver_major, &va_ver_minor);
if (err != VA_STATUS_SUCCESS) {
fprintf(stderr, "Cannot initialize VA: %s\n", vaErrorStr(err));
goto finish;
}
fprintf(stderr, "Initialized VA v%d.%d\n", va_ver_major, va_ver_minor);
/* initialize an MFX session */
err = MFXInit(mfx_impl, &mfx_ver, &decode.mfx_session);
if (err != MFX_ERR_NONE) {
fprintf(stderr, "Error initializing an MFX session\n");
goto finish;
}
MFXVideoCORE_SetHandle(decode.mfx_session, MFX_HANDLE_VA_DISPLAY, decode.va_dpy);
MFXVideoCORE_SetFrameAllocator(decode.mfx_session, &frame_allocator);
/* initialize the decoder */
decoder = avcodec_find_decoder_by_name("h264_qsv");
if (!decoder) {
fprintf(stderr, "The QSV decoder is not present in libavcodec\n");
goto finish;
}
decoder_ctx = avcodec_alloc_context3(decoder);
if (!decoder_ctx) {
ret = AVERROR(ENOMEM);
goto finish;
}
decoder_ctx->codec_id = AV_CODEC_ID_H264;
if (video_st->codec->extradata_size) {
decoder_ctx->extradata = av_mallocz(video_st->codec->extradata_size +
FF_INPUT_BUFFER_PADDING_SIZE);
if (!decoder_ctx->extradata) {
ret = AVERROR(ENOMEM);
goto finish;
}
memcpy(decoder_ctx->extradata, video_st->codec->extradata,
video_st->codec->extradata_size);
decoder_ctx->extradata_size = video_st->codec->extradata_size;
}
decoder_ctx->refcounted_frames = 1;
decoder_ctx->opaque = &decode;
decoder_ctx->get_buffer2 = get_buffer;
decoder_ctx->get_format = get_format;
ret = avcodec_open2(decoder_ctx, NULL, NULL);
if (ret < 0) {
fprintf(stderr, "Error opening the decoder: ");
goto finish;
}
/* open the output stream */
ret = avio_open(&output_ctx, argv[2], AVIO_FLAG_WRITE);
if (ret < 0) {
fprintf(stderr, "Error opening the output context: ");
goto finish;
}
frame = av_frame_alloc();
if (!frame) {
ret = AVERROR(ENOMEM);
goto finish;
}
/* actual decoding */
while (ret >= 0) {
ret = av_read_frame(input_ctx, &pkt);
if (ret < 0)
break;
if (pkt.stream_index == video_st->index)
ret = decode_packet(&decode, decoder_ctx, frame, &pkt, output_ctx);
av_packet_unref(&pkt);
}
/* flush the decoder */
pkt.data = NULL;
pkt.size = 0;
ret = decode_packet(&decode, decoder_ctx, frame, &pkt, output_ctx);
finish:
if (ret < 0) {
char buf[1024];
av_strerror(ret, buf, sizeof(buf));
fprintf(stderr, "%s\n", buf);
}
avformat_close_input(&input_ctx);
av_frame_free(&frame);
if (decode.mfx_session)
MFXClose(decode.mfx_session);
if (decode.va_dpy)
vaTerminate(decode.va_dpy);
if (dpy)
XCloseDisplay(dpy);
if (decoder_ctx)
av_freep(&decoder_ctx->hwaccel_context);
avcodec_free_context(&decoder_ctx);
avio_close(output_ctx);
return ret;
}

View File

@@ -153,7 +153,7 @@ end:
/* close output */ /* close output */
if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE)) if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE))
avio_closep(&ofmt_ctx->pb); avio_close(ofmt_ctx->pb);
avformat_free_context(ofmt_ctx); avformat_free_context(ofmt_ctx);
if (ret < 0 && ret != AVERROR_EOF) { if (ret < 0 && ret != AVERROR_EOF) {

View File

@@ -199,6 +199,7 @@ int main(int argc, char **argv)
fmt, dst_ch_layout, dst_nb_channels, dst_rate, dst_filename); fmt, dst_ch_layout, dst_nb_channels, dst_rate, dst_filename);
end: end:
if (dst_file)
fclose(dst_file); fclose(dst_file);
if (src_data) if (src_data)

View File

@@ -132,6 +132,7 @@ int main(int argc, char **argv)
av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h, dst_filename); av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h, dst_filename);
end: end:
if (dst_file)
fclose(dst_file); fclose(dst_file);
av_freep(&src_data[0]); av_freep(&src_data[0]);
av_freep(&dst_data[0]); av_freep(&dst_data[0]);

View File

@@ -41,16 +41,18 @@
#include "libswresample/swresample.h" #include "libswresample/swresample.h"
/** The output bit rate in kbit/s */ /** The output bit rate in kbit/s */
#define OUTPUT_BIT_RATE 96000 #define OUTPUT_BIT_RATE 48000
/** The number of output channels */ /** The number of output channels */
#define OUTPUT_CHANNELS 2 #define OUTPUT_CHANNELS 2
/** The audio sample output format */
#define OUTPUT_SAMPLE_FORMAT AV_SAMPLE_FMT_S16
/** /**
* Convert an error code into a text message. * Convert an error code into a text message.
* @param error Error code to be converted * @param error Error code to be converted
* @return Corresponding error text (not thread-safe) * @return Corresponding error text (not thread-safe)
*/ */
static const char *get_error_text(const int error) static char *const get_error_text(const int error)
{ {
static char error_buffer[255]; static char error_buffer[255];
av_strerror(error, error_buffer, sizeof(error_buffer)); av_strerror(error, error_buffer, sizeof(error_buffer));
@@ -167,7 +169,7 @@ static int open_output_file(const char *filename,
goto cleanup; goto cleanup;
} }
/** Save the encoder context for easier access later. */ /** Save the encoder context for easiert access later. */
*output_codec_context = stream->codec; *output_codec_context = stream->codec;
/** /**
@@ -177,16 +179,9 @@ static int open_output_file(const char *filename,
(*output_codec_context)->channels = OUTPUT_CHANNELS; (*output_codec_context)->channels = OUTPUT_CHANNELS;
(*output_codec_context)->channel_layout = av_get_default_channel_layout(OUTPUT_CHANNELS); (*output_codec_context)->channel_layout = av_get_default_channel_layout(OUTPUT_CHANNELS);
(*output_codec_context)->sample_rate = input_codec_context->sample_rate; (*output_codec_context)->sample_rate = input_codec_context->sample_rate;
(*output_codec_context)->sample_fmt = output_codec->sample_fmts[0]; (*output_codec_context)->sample_fmt = AV_SAMPLE_FMT_S16;
(*output_codec_context)->bit_rate = OUTPUT_BIT_RATE; (*output_codec_context)->bit_rate = OUTPUT_BIT_RATE;
/** Allow the use of the experimental AAC encoder */
(*output_codec_context)->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
/** Set the sample rate for the container. */
stream->time_base.den = input_codec_context->sample_rate;
stream->time_base.num = 1;
/** /**
* Some container formats (like MP4) require global headers to be present * Some container formats (like MP4) require global headers to be present
* Mark the encoder so that it behaves accordingly. * Mark the encoder so that it behaves accordingly.
@@ -204,7 +199,7 @@ static int open_output_file(const char *filename,
return 0; return 0;
cleanup: cleanup:
avio_closep(&(*output_format_context)->pb); avio_close((*output_format_context)->pb);
avformat_free_context(*output_format_context); avformat_free_context(*output_format_context);
*output_format_context = NULL; *output_format_context = NULL;
return error < 0 ? error : AVERROR_EXIT; return error < 0 ? error : AVERROR_EXIT;
@@ -276,11 +271,10 @@ static int init_resampler(AVCodecContext *input_codec_context,
} }
/** Initialize a FIFO buffer for the audio samples to be encoded. */ /** Initialize a FIFO buffer for the audio samples to be encoded. */
static int init_fifo(AVAudioFifo **fifo, AVCodecContext *output_codec_context) static int init_fifo(AVAudioFifo **fifo)
{ {
/** Create the FIFO buffer based on the specified output sample format. */ /** Create the FIFO buffer based on the specified output sample format. */
if (!(*fifo = av_audio_fifo_alloc(output_codec_context->sample_fmt, if (!(*fifo = av_audio_fifo_alloc(OUTPUT_SAMPLE_FORMAT, OUTPUT_CHANNELS, 1))) {
output_codec_context->channels, 1))) {
fprintf(stderr, "Could not allocate FIFO\n"); fprintf(stderr, "Could not allocate FIFO\n");
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
} }
@@ -312,7 +306,7 @@ static int decode_audio_frame(AVFrame *frame,
/** Read one audio frame from the input file into a temporary packet. */ /** Read one audio frame from the input file into a temporary packet. */
if ((error = av_read_frame(input_format_context, &input_packet)) < 0) { if ((error = av_read_frame(input_format_context, &input_packet)) < 0) {
/** If we are at the end of the file, flush the decoder below. */ /** If we are the the end of the file, flush the decoder below. */
if (error == AVERROR_EOF) if (error == AVERROR_EOF)
*finished = 1; *finished = 1;
else { else {
@@ -543,9 +537,6 @@ static int init_output_frame(AVFrame **frame,
return 0; return 0;
} }
/** Global timestamp for the audio frames */
static int64_t pts = 0;
/** Encode one frame worth of audio to the output file. */ /** Encode one frame worth of audio to the output file. */
static int encode_audio_frame(AVFrame *frame, static int encode_audio_frame(AVFrame *frame,
AVFormatContext *output_format_context, AVFormatContext *output_format_context,
@@ -557,12 +548,6 @@ static int encode_audio_frame(AVFrame *frame,
int error; int error;
init_packet(&output_packet); init_packet(&output_packet);
/** Set a timestamp based on the sample rate for the container. */
if (frame) {
frame->pts = pts;
pts += frame->nb_samples;
}
/** /**
* Encode the audio frame and store it in the temporary packet. * Encode the audio frame and store it in the temporary packet.
* The output audio stream encoder is used to do this. * The output audio stream encoder is used to do this.
@@ -674,7 +659,7 @@ int main(int argc, char **argv)
&resample_context)) &resample_context))
goto cleanup; goto cleanup;
/** Initialize the FIFO buffer to store audio samples to be encoded. */ /** Initialize the FIFO buffer to store audio samples to be encoded. */
if (init_fifo(&fifo, output_codec_context)) if (init_fifo(&fifo))
goto cleanup; goto cleanup;
/** Write the header of the output file container. */ /** Write the header of the output file container. */
if (write_output_file_header(output_format_context)) if (write_output_file_header(output_format_context))
@@ -758,7 +743,7 @@ cleanup:
if (output_codec_context) if (output_codec_context)
avcodec_close(output_codec_context); avcodec_close(output_codec_context);
if (output_format_context) { if (output_format_context) {
avio_closep(&output_format_context->pb); avio_close(output_format_context->pb);
avformat_free_context(output_format_context); avformat_free_context(output_format_context);
} }
if (input_codec_context) if (input_codec_context)

View File

@@ -116,10 +116,6 @@ static int open_output_file(const char *filename)
|| dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) { || dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
/* 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) {
av_log(NULL, AV_LOG_FATAL, "Necessary encoder not found\n");
return AVERROR_INVALIDDATA;
}
/* In this example, we transcode to same properties (picture size, /* In this example, we transcode to same properties (picture size,
* sample rate etc.). These properties can be changed for output * sample rate etc.). These properties can be changed for output
@@ -389,7 +385,15 @@ static int encode_write_frame(AVFrame *filt_frame, unsigned int stream_index, in
/* prepare packet for muxing */ /* prepare packet for muxing */
enc_pkt.stream_index = stream_index; enc_pkt.stream_index = stream_index;
av_packet_rescale_ts(&enc_pkt, enc_pkt.dts = av_rescale_q_rnd(enc_pkt.dts,
ofmt_ctx->streams[stream_index]->codec->time_base,
ofmt_ctx->streams[stream_index]->time_base,
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
enc_pkt.pts = av_rescale_q_rnd(enc_pkt.pts,
ofmt_ctx->streams[stream_index]->codec->time_base,
ofmt_ctx->streams[stream_index]->time_base,
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
enc_pkt.duration = av_rescale_q(enc_pkt.duration,
ofmt_ctx->streams[stream_index]->codec->time_base, ofmt_ctx->streams[stream_index]->codec->time_base,
ofmt_ctx->streams[stream_index]->time_base); ofmt_ctx->streams[stream_index]->time_base);
@@ -505,9 +509,14 @@ int main(int argc, char **argv)
ret = AVERROR(ENOMEM); ret = AVERROR(ENOMEM);
break; break;
} }
av_packet_rescale_ts(&packet, packet.dts = av_rescale_q_rnd(packet.dts,
ifmt_ctx->streams[stream_index]->time_base, ifmt_ctx->streams[stream_index]->time_base,
ifmt_ctx->streams[stream_index]->codec->time_base); ifmt_ctx->streams[stream_index]->codec->time_base,
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
packet.pts = av_rescale_q_rnd(packet.pts,
ifmt_ctx->streams[stream_index]->time_base,
ifmt_ctx->streams[stream_index]->codec->time_base,
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
dec_func = (type == AVMEDIA_TYPE_VIDEO) ? avcodec_decode_video2 : dec_func = (type == AVMEDIA_TYPE_VIDEO) ? avcodec_decode_video2 :
avcodec_decode_audio4; avcodec_decode_audio4;
ret = dec_func(ifmt_ctx->streams[stream_index]->codec, frame, ret = dec_func(ifmt_ctx->streams[stream_index]->codec, frame,
@@ -529,9 +538,14 @@ int main(int argc, char **argv)
} }
} else { } else {
/* remux this frame without reencoding */ /* remux this frame without reencoding */
av_packet_rescale_ts(&packet, packet.dts = av_rescale_q_rnd(packet.dts,
ifmt_ctx->streams[stream_index]->time_base, ifmt_ctx->streams[stream_index]->time_base,
ofmt_ctx->streams[stream_index]->time_base); ofmt_ctx->streams[stream_index]->time_base,
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
packet.pts = av_rescale_q_rnd(packet.pts,
ifmt_ctx->streams[stream_index]->time_base,
ofmt_ctx->streams[stream_index]->time_base,
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
ret = av_interleaved_write_frame(ofmt_ctx, &packet); ret = av_interleaved_write_frame(ofmt_ctx, &packet);
if (ret < 0) if (ret < 0)
@@ -573,7 +587,7 @@ end:
av_free(filter_ctx); av_free(filter_ctx);
avformat_close_input(&ifmt_ctx); avformat_close_input(&ifmt_ctx);
if (ofmt_ctx && !(ofmt_ctx->oformat->flags & AVFMT_NOFILE)) if (ofmt_ctx && !(ofmt_ctx->oformat->flags & AVFMT_NOFILE))
avio_closep(&ofmt_ctx->pb); avio_close(ofmt_ctx->pb);
avformat_free_context(ofmt_ctx); avformat_free_context(ofmt_ctx);
if (ret < 0) if (ret < 0)

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle FFmpeg FAQ @settitle FFmpeg FAQ
@titlepage @titlepage
@@ -91,56 +90,6 @@ To build FFmpeg, you need to install the development package. It is usually
called @file{libfoo-dev} or @file{libfoo-devel}. You can remove it after the called @file{libfoo-dev} or @file{libfoo-devel}. You can remove it after the
build is finished, but be sure to keep the main package. build is finished, but be sure to keep the main package.
@section How do I make @command{pkg-config} find my libraries?
Somewhere along with your libraries, there is a @file{.pc} file (or several)
in a @file{pkgconfig} directory. You need to set environment variables to
point @command{pkg-config} to these files.
If you need to @emph{add} directories to @command{pkg-config}'s search list
(typical use case: library installed separately), add it to
@code{$PKG_CONFIG_PATH}:
@example
export PKG_CONFIG_PATH=/opt/x264/lib/pkgconfig:/opt/opus/lib/pkgconfig
@end example
If you need to @emph{replace} @command{pkg-config}'s search list
(typical use case: cross-compiling), set it in
@code{$PKG_CONFIG_LIBDIR}:
@example
export PKG_CONFIG_LIBDIR=/home/me/cross/usr/lib/pkgconfig:/home/me/cross/usr/local/lib/pkgconfig
@end example
If you need to know the library's internal dependencies (typical use: static
linking), add the @code{--static} option to @command{pkg-config}:
@example
./configure --pkg-config-flags=--static
@end example
@section How do I use @command{pkg-config} when cross-compiling?
The best way is to install @command{pkg-config} in your cross-compilation
environment. It will automatically use the cross-compilation libraries.
You can also use @command{pkg-config} from the host environment by
specifying explicitly @code{--pkg-config=pkg-config} to @command{configure}.
In that case, you must point @command{pkg-config} to the correct directories
using the @code{PKG_CONFIG_LIBDIR}, as explained in the previous entry.
As an intermediate solution, you can place in your cross-compilation
environment a script that calls the host @command{pkg-config} with
@code{PKG_CONFIG_LIBDIR} set. That script can look like that:
@example
#!/bin/sh
PKG_CONFIG_LIBDIR=/path/to/cross/lib/pkgconfig
export PKG_CONFIG_LIBDIR
exec /usr/bin/pkg-config "$@@"
@end example
@chapter Usage @chapter Usage
@section ffmpeg does not work; what is wrong? @section ffmpeg does not work; what is wrong?
@@ -349,7 +298,7 @@ FFmpeg has a @url{http://ffmpeg.org/ffmpeg-protocols.html#concat,
@code{concat}} protocol designed specifically for that, with examples in the @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
@@ -467,40 +416,6 @@ point acceptable for your tastes. The most common options to do that are
@option{-qscale} and @option{-qmax}, but you should peruse the documentation @option{-qscale} and @option{-qmax}, but you should peruse the documentation
of the encoder you chose. of the encoder you chose.
@section I have a stretched video, why does scaling does not fix it?
A lot of video codecs and formats can store the @emph{aspect ratio} of the
video: this is the ratio between the width and the height of either the full
image (DAR, display aspect ratio) or individual pixels (SAR, sample aspect
ratio). For example, EGA screens at resolution 640×350 had 4:3 DAR and 35:48
SAR.
Most still image processing work with square pixels, i.e. 1:1 SAR, but a lot
of video standards, especially from the analogic-numeric transition era, use
non-square pixels.
Most processing filters in FFmpeg handle the aspect ratio to avoid
stretching the image: cropping adjusts the DAR to keep the SAR constant,
scaling adjusts the SAR to keep the DAR constant.
If you want to stretch, or “unstretch”, the image, you need to override the
information with the
@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
stretching comes from the image or from the aspect ratio information.
For example, to fix a badly encoded EGA capture, use the following commands,
either the first one to upscale to square pixels or the second one to set
the correct aspect ratio or the third one to avoid transcoding (may not work
depending on the format / codec / player / phase of the moon):
@example
ffmpeg -i ega_screen.nut -vf scale=640:480,setsar=1 ega_screen_scaled.nut
ffmpeg -i ega_screen.nut -vf setdar=4/3 ega_screen_anamorphic.nut
ffmpeg -i ega_screen.nut -aspect 4/3 -c copy ega_screen_overridden.nut
@end example
@chapter Development @chapter Development
@section Are there examples illustrating how to use the FFmpeg libraries, particularly libavcodec and libavformat? @section Are there examples illustrating how to use the FFmpeg libraries, particularly libavcodec and libavformat?

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle FFmpeg Automated Testing Environment @settitle FFmpeg Automated Testing Environment
@titlepage @titlepage
@@ -54,8 +53,8 @@ make fate SAMPLES=fate-suite/
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
@@ -102,14 +101,14 @@ The mentioned configuration template is also available here:
@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:
@@ -132,7 +131,7 @@ of the server and to accept its host key. This can usually be achieved by
running your SSH client manually and killing it after you accepted the key. 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
@@ -165,7 +164,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 +182,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

View File

@@ -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

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle FFmpeg Bitstream Filters Documentation @settitle FFmpeg Bitstream Filters Documentation
@titlepage @titlepage

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle FFmpeg Codecs Documentation @settitle FFmpeg Codecs Documentation
@titlepage @titlepage

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle FFmpeg Devices Documentation @settitle FFmpeg Devices Documentation
@titlepage @titlepage

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle FFmpeg Filters Documentation @settitle FFmpeg Filters Documentation
@titlepage @titlepage

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle FFmpeg Formats Documentation @settitle FFmpeg Formats Documentation
@titlepage @titlepage

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle FFmpeg Protocols Documentation @settitle FFmpeg Protocols Documentation
@titlepage @titlepage

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle FFmpeg Resampler Documentation @settitle FFmpeg Resampler Documentation
@titlepage @titlepage

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle FFmpeg Scaler Documentation @settitle FFmpeg Scaler Documentation
@titlepage @titlepage

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle FFmpeg Utilities Documentation @settitle FFmpeg Utilities Documentation
@titlepage @titlepage

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle ffmpeg Documentation @settitle ffmpeg Documentation
@titlepage @titlepage
@@ -80,7 +79,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 +98,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 +123,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 +135,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 +160,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 +178,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 +197,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
@@ -340,7 +339,7 @@ ffmpeg -i in.avi -metadata title="my title" out.flv
To set the language of the first audio stream: To set the language of the first audio stream:
@example @example
ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT ffmpeg -i INPUT -metadata:s:a:1 language=eng OUTPUT
@end example @end example
@item -target @var{type} (@emph{output}) @item -target @var{type} (@emph{output})
@@ -361,7 +360,7 @@ ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
@end example @end example
@item -dframes @var{number} (@emph{output}) @item -dframes @var{number} (@emph{output})
Set the number of data frames to output. This is an alias for @code{-frames:d}. Set the number of data frames to record. This is an alias for @code{-frames:d}.
@item -frames[:@var{stream_specifier}] @var{framecount} (@emph{output,per-stream}) @item -frames[:@var{stream_specifier}] @var{framecount} (@emph{output,per-stream})
Stop writing to the stream after @var{framecount} frames. Stop writing to the stream after @var{framecount} frames.
@@ -462,24 +461,18 @@ 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
@table @option @table @option
@item -vframes @var{number} (@emph{output}) @item -vframes @var{number} (@emph{output})
Set the number of video frames to output. This is an alias for @code{-frames:v}. Set the number of video frames to record. This is an alias for @code{-frames:v}.
@item -r[:@var{stream_specifier}] @var{fps} (@emph{input/output,per-stream}) @item -r[:@var{stream_specifier}] @var{fps} (@emph{input/output,per-stream})
Set frame rate (Hz value, fraction or abbreviation). Set frame rate (Hz value, fraction or abbreviation).
As an input option, ignore any timestamps stored in the file and instead As an input option, ignore any timestamps stored in the file and instead
generate timestamps assuming constant frame rate @var{fps}. generate timestamps assuming constant frame rate @var{fps}.
This is not the same as the @option{-framerate} option used for some input formats
like image2 or v4l2 (it used to be the same in older versions of FFmpeg).
If in doubt use @option{-framerate} instead of the input option @option{-r}.
As an output option, duplicate or drop input frames to achieve constant output As an output option, duplicate or drop input frames to achieve constant output
frame rate @var{fps}. frame rate @var{fps}.
@@ -696,7 +689,7 @@ If this option is not specified, the default adapter is used.
@table @option @table @option
@item -aframes @var{number} (@emph{output}) @item -aframes @var{number} (@emph{output})
Set the number of audio frames to output. This is an alias for @code{-frames:a}. Set the number of audio frames to record. This is an alias for @code{-frames:a}.
@item -ar[:@var{stream_specifier}] @var{freq} (@emph{input/output,per-stream}) @item -ar[:@var{stream_specifier}] @var{freq} (@emph{input/output,per-stream})
Set the audio sampling frequency. For output streams it is set by Set the audio sampling frequency. For output streams it is set by
default to the frequency of the corresponding input stream. For input default to the frequency of the corresponding input stream. For input
@@ -828,21 +821,8 @@ To map all the streams except the second audio, use negative mappings
ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT
@end example @end example
To pick the English audio stream:
@example
ffmpeg -i INPUT -map 0:m:language:eng OUTPUT
@end example
Note that using this option disables the default mappings for this output file. 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
@@ -1006,13 +986,6 @@ With -map you can select from which stream the timestamps should be
taken. You can leave either video or audio unchanged and sync the taken. You can leave either video or audio unchanged and sync the
remaining stream(s) to the unchanged one. remaining stream(s) to the unchanged one.
@item -frame_drop_threshold @var{parameter}
Frame drop threshold, which specifies how much behind video frames can
be before they are dropped. In frame rate units, so 1.0 is one frame.
The default is -1.1. One possible usecase is to avoid framedrops in case
of noisy timestamps or to increase frame drop precision in case of exact
timestamps.
@item -async @var{samples_per_second} @item -async @var{samples_per_second}
Audio sync method. "Stretches/squeezes" the audio stream to match the timestamps, Audio sync method. "Stretches/squeezes" the audio stream to match the timestamps,
the parameter is the maximum samples per second by which the audio is changed. the parameter is the maximum samples per second by which the audio is changed.
@@ -1035,12 +1008,6 @@ processing (e.g. in case the format option @option{avoid_negative_ts}
is enabled) the output timestamps may mismatch with the input is enabled) the output timestamps may mismatch with the input
timestamps even when this option is selected. timestamps even when this option is selected.
@item -start_at_zero
When used with @option{copyts}, shift input timestamps so they start at zero.
This means that using e.g. @code{-ss 50} will make output timestamps start at
50 seconds, regardless of what timestamp the input file started at.
@item -copytb @var{mode} @item -copytb @var{mode}
Specify how to set the encoder timebase when stream copying. @var{mode} is an Specify how to set the encoder timebase when stream copying. @var{mode} is an
integer numeric value, and can assume one of the following values: integer numeric value, and can assume one of the following values:
@@ -1169,19 +1136,6 @@ 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})
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
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
avoid it.
@item -override_ffserver (@emph{global}) @item -override_ffserver (@emph{global})
Overrides the input specifications from @command{ffserver}. Using this Overrides the input specifications from @command{ffserver}. Using this
option you can map any input stream to @command{ffserver} and control option you can map any input stream to @command{ffserver} and control
@@ -1192,11 +1146,6 @@ requested by @command{ffserver}.
The option is intended for cases where features are needed that cannot be 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})
Print sdp information for an output stream to @var{file}.
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).
@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.
Not all demuxers support this. Not all demuxers support this.
@@ -1221,9 +1170,6 @@ Discard all frames excepts keyframes.
Discard all frames. Discard all frames.
@end table @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
@@ -1249,10 +1195,7 @@ awkward to specify on the command line. Lines starting with the hash
('#') character are ignored and are used to provide comments. Check ('#') character are ignored and are used to provide comments. Check
the @file{presets} directory in the FFmpeg source tree for examples. the @file{presets} directory in the FFmpeg source tree for examples.
There are two types of preset files: ffpreset and avpreset files. Preset files are specified with the @code{vpre}, @code{apre},
@subsection ffpreset files
ffpreset files are specified with the @code{vpre}, @code{apre},
@code{spre}, and @code{fpre} options. The @code{fpre} option takes the @code{spre}, and @code{fpre} options. The @code{fpre} option takes the
filename of the preset instead of a preset name as input and can be filename of the preset instead of a preset name as input and can be
used for any kind of codec. For the @code{vpre}, @code{apre}, and used for any kind of codec. For the @code{vpre}, @code{apre}, and
@@ -1277,26 +1220,6 @@ directories, where @var{codec_name} is the name of the codec to which
the preset file options will be applied. For example, if you select the preset file options will be applied. For example, if you select
the video codec with @code{-vcodec libvpx} and use @code{-vpre 1080p}, the video codec with @code{-vcodec libvpx} and use @code{-vpre 1080p},
then it will search for the file @file{libvpx-1080p.ffpreset}. then it will search for the file @file{libvpx-1080p.ffpreset}.
@subsection avpreset files
avpreset files are specified with the @code{pre} option. They work similar to
ffpreset files, but they only allow encoder- specific options. Therefore, an
@var{option}=@var{value} pair specifying an encoder cannot be used.
When the @code{pre} option is specified, ffmpeg will look for files with the
suffix .avpreset in the directories @file{$AVCONV_DATADIR} (if set), and
@file{$HOME/.avconv}, and in the datadir defined at configuration time (usually
@file{PREFIX/share/ffmpeg}), in that order.
First ffmpeg searches for a file named @var{codec_name}-@var{arg}.avpreset in
the above-mentioned directories, where @var{codec_name} is the name of the codec
to which the preset file options will be applied. For example, if you select the
video codec with @code{-vcodec libvpx} and use @code{-pre 1080p}, then it will
search for the file @file{libvpx-1080p.avpreset}.
If no such file is found, then ffmpeg will search for a file named
@var{arg}.avpreset in the same directories.
@c man end OPTIONS @c man end OPTIONS
@chapter Tips @chapter Tips
@@ -1343,6 +1266,21 @@ quality).
@chapter Examples @chapter Examples
@c man begin EXAMPLES @c man begin EXAMPLES
@section Preset files
A preset file contains a sequence of @var{option=value} pairs, one for
each line, specifying a sequence of options which can be specified also on
the command line. Lines starting with the hash ('#') character are ignored and
are used to provide comments. Empty lines are also ignored. Check the
@file{presets} directory in the FFmpeg source tree for examples.
Preset files are specified with the @code{pre} option, this option takes a
preset name as input. FFmpeg searches for a file named @var{preset_name}.avpreset in
the directories @file{$AVCONV_DATADIR} (if set), and @file{$HOME/.ffmpeg}, and in
the data directory defined at configuration time (usually @file{$PREFIX/share/ffmpeg})
in that order. For example, if the argument is @code{libx264-max}, it will
search for the file @file{libx264-max.avpreset}.
@section Video and Audio grabbing @section Video and Audio grabbing
If you specify the input format and device then ffmpeg can grab video If you specify the input format and device then ffmpeg can grab video
@@ -1490,7 +1428,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
@@ -1505,18 +1443,18 @@ 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
You can put many streams of the same type in the output: You can put many streams of the same type in the output:
@example @example
ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut ffmpeg -i test1.avi -i test2.avi -map 0:3 -map 0:2 -map 0:1 -map 0:0 -c copy test12.nut
@end example @end example
The resulting output file @file{test12.nut} will contain the first four streams The resulting output file @file{test12.avi} will contain first four streams from
from the input files in reverse order. the input file in reverse order.
@item @item
To force CBR video output: To force CBR video output:

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle ffplay Documentation @settitle ffplay Documentation
@titlepage @titlepage
@@ -38,14 +37,10 @@ Force displayed height.
Set frame size (WxH or abbreviation), needed for videos which do Set frame size (WxH or abbreviation), needed for videos which do
not contain a header with the frame size like raw YUV. This option not contain a header with the frame size like raw YUV. This option
has been deprecated in favor of private options, try -video_size. has been deprecated in favor of private options, try -video_size.
@item -fs
Start in fullscreen mode.
@item -an @item -an
Disable audio. Disable audio.
@item -vn @item -vn
Disable video. Disable video.
@item -sn
Disable subtitles.
@item -ss @var{pos} @item -ss @var{pos}
Seek to a given position in seconds. Seek to a given position in seconds.
@item -t @var{duration} @item -t @var{duration}
@@ -114,10 +109,15 @@ duration, the codec parameters, the current position in the stream and
the audio/video synchronisation drift. It is on by default, to the audio/video synchronisation drift. It is on by default, to
explicitly disable it you need to specify @code{-nostats}. explicitly disable it you need to specify @code{-nostats}.
@item -bug
Work around bugs.
@item -fast @item -fast
Non-spec-compliant optimizations. Non-spec-compliant optimizations.
@item -genpts @item -genpts
Generate pts. Generate pts.
@item -rtp_tcp
Force RTP/TCP protocol usage instead of RTP/UDP. It is only meaningful
if you are streaming with the RTSP protocol.
@item -sync @var{type} @item -sync @var{type}
Set the master clock to audio (@code{type=audio}), video Set the master clock to audio (@code{type=audio}), video
(@code{type=video}) or external (@code{type=ext}). Default is audio. The (@code{type=video}) or external (@code{type=ext}). Default is audio. The
@@ -125,20 +125,23 @@ master clock is used to control audio-video synchronization. Most media
players use audio as master clock, but in some cases (streaming or high players use audio as master clock, but in some cases (streaming or high
quality broadcast) it is necessary to change that. This option is mainly quality broadcast) it is necessary to change that. This option is mainly
used for debugging purposes. used for debugging purposes.
@item -ast @var{audio_stream_specifier} @item -threads @var{count}
Select the desired audio stream using the given stream specifier. The stream Set the thread count.
specifiers are described in the @ref{Stream specifiers} chapter. If this option @item -ast @var{audio_stream_number}
is not specified, the "best" audio stream is selected in the program of the Select the desired audio stream number, counting from 0. The number
already selected video stream. refers to the list of all the input audio streams. If it is greater
@item -vst @var{video_stream_specifier} than the number of audio streams minus one, then the last one is
Select the desired video stream using the given stream specifier. The stream selected, if it is negative the audio playback is disabled.
specifiers are described in the @ref{Stream specifiers} chapter. If this option @item -vst @var{video_stream_number}
is not specified, the "best" video stream is selected. Select the desired video stream number, counting from 0. The number
@item -sst @var{subtitle_stream_specifier} refers to the list of all the input video streams. If it is greater
Select the desired subtitle stream using the given stream specifier. The stream than the number of video streams minus one, then the last one is
specifiers are described in the @ref{Stream specifiers} chapter. If this option selected, if it is negative the video playback is disabled.
is not specified, the "best" subtitle stream is selected in the program of the @item -sst @var{subtitle_stream_number}
already selected video or audio stream. Select the desired subtitle stream number, counting from 0. The number
refers to the list of all the input subtitle streams. If it is greater
than the number of subtitle streams minus one, then the last one is
selected, if it is negative the subtitle rendering is disabled.
@item -autoexit @item -autoexit
Exit when video is done playing. Exit when video is done playing.
@item -exitonkeydown @item -exitonkeydown
@@ -161,20 +164,8 @@ 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. Set by
default, use @option{-noautorotate} to disable it. default, use -noautorotate to disable.
@item -framedrop
Drop video frames if video is out of sync. Enabled by default if the master
clock is not set to video. Use this option to enable frame dropping for all
master clock sources, use @option{-noframedrop} to disable it.
@item -infbuf
Do not limit the input buffer size, read as much data as possible from the
input as soon as possible. Enabled by default for realtime streams, where data
may be dropped if not read in time. Use this option to enable infinite buffers
for all inputs, use @option{-noinfbuf} to disable it.
@end table @end table
@section While playing @section While playing

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle ffprobe Documentation @settitle ffprobe Documentation
@titlepage @titlepage
@@ -120,10 +119,6 @@ Show payload data, as a hexadecimal and ASCII dump. Coupled with
The dump is printed as the "data" field. It may contain newlines. The dump is printed as the "data" field. It may contain newlines.
@item -show_data_hash @var{algorithm}
Show a hash of payload data, for packets with @option{-show_packets} and for
codec extradata with @option{-show_streams}.
@item -show_error @item -show_error
Show information about the error found when trying to probe the input. Show information about the error found when trying to probe the input.
@@ -185,7 +180,7 @@ format : stream=codec_type
To show all the tags in the stream and format sections: To show all the tags in the stream and format sections:
@example @example
stream_tags : format_tags format_tags : format_tags
@end example @end example
To show only the @code{title} tag (if available) in the stream To show only the @code{title} tag (if available) in the stream
@@ -322,12 +317,6 @@ Show information related to program and library versions. This is the
equivalent of setting both @option{-show_program_version} and equivalent of setting both @option{-show_program_version} and
@option{-show_library_versions} options. @option{-show_library_versions} options.
@item -show_pixel_formats
Show information about all pixel formats supported by FFmpeg.
Pixel format information for each format is printed within a section
with name "PIXEL_FORMAT".
@item -bitexact @item -bitexact
Force bitexact output, useful to produce output which is not dependent Force bitexact output, useful to produce output which is not dependent
on the specific build. on the specific build.
@@ -447,17 +436,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 +474,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 +496,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.

View File

@@ -10,10 +10,8 @@
<xsd:sequence> <xsd:sequence>
<xsd:element name="program_version" type="ffprobe:programVersionType" minOccurs="0" maxOccurs="1" /> <xsd:element name="program_version" type="ffprobe:programVersionType" minOccurs="0" maxOccurs="1" />
<xsd:element name="library_versions" type="ffprobe:libraryVersionsType" minOccurs="0" maxOccurs="1" /> <xsd:element name="library_versions" type="ffprobe:libraryVersionsType" minOccurs="0" maxOccurs="1" />
<xsd:element name="pixel_formats" type="ffprobe:pixelFormatsType" minOccurs="0" maxOccurs="1" />
<xsd:element name="packets" type="ffprobe:packetsType" minOccurs="0" maxOccurs="1" /> <xsd:element name="packets" type="ffprobe:packetsType" minOccurs="0" maxOccurs="1" />
<xsd:element name="frames" type="ffprobe:framesType" minOccurs="0" maxOccurs="1" /> <xsd:element name="frames" type="ffprobe:framesType" minOccurs="0" maxOccurs="1" />
<xsd:element name="packets_and_frames" type="ffprobe:packetsAndFramesType" minOccurs="0" maxOccurs="1" />
<xsd:element name="programs" type="ffprobe:programsType" minOccurs="0" maxOccurs="1" /> <xsd:element name="programs" type="ffprobe:programsType" minOccurs="0" maxOccurs="1" />
<xsd:element name="streams" type="ffprobe:streamsType" minOccurs="0" maxOccurs="1" /> <xsd:element name="streams" type="ffprobe:streamsType" minOccurs="0" maxOccurs="1" />
<xsd:element name="chapters" type="ffprobe:chaptersType" minOccurs="0" maxOccurs="1" /> <xsd:element name="chapters" type="ffprobe:chaptersType" minOccurs="0" maxOccurs="1" />
@@ -37,22 +35,7 @@
</xsd:sequence> </xsd:sequence>
</xsd:complexType> </xsd:complexType>
<xsd:complexType name="packetsAndFramesType">
<xsd:sequence>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="packet" type="ffprobe:packetType" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="frame" type="ffprobe:frameType" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="subtitle" type="ffprobe:subtitleType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="packetType"> <xsd: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" />
@@ -67,27 +50,14 @@
<xsd:attribute name="pos" type="xsd:long" /> <xsd:attribute name="pos" type="xsd:long" />
<xsd:attribute name="flags" type="xsd:string" use="required" /> <xsd:attribute name="flags" type="xsd:string" use="required" />
<xsd:attribute name="data" type="xsd:string" /> <xsd:attribute name="data" type="xsd:string" />
<xsd:attribute name="data_hash" type="xsd:string" />
</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>
<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"/>
<xsd:element name="side_data_list" type="ffprobe:frameSideDataListType" minOccurs="0" maxOccurs="1" />
</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"/>
@@ -121,16 +91,6 @@
<xsd:attribute name="repeat_pict" type="xsd:int" /> <xsd:attribute name="repeat_pict" type="xsd:int" />
</xsd:complexType> </xsd:complexType>
<xsd:complexType name="frameSideDataListType">
<xsd:sequence>
<xsd:element name="side_data" type="ffprobe:frameSideDataType" minOccurs="1" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="frameSideDataType">
<xsd:attribute name="side_data_type" type="xsd:string"/>
<xsd:attribute name="side_data_size" type="xsd:int" />
</xsd:complexType>
<xsd:complexType name="subtitleType"> <xsd:complexType name="subtitleType">
<xsd:attribute name="media_type" type="xsd:string" fixed="subtitle" use="required"/> <xsd:attribute name="media_type" type="xsd:string" fixed="subtitle" use="required"/>
<xsd:attribute name="pts" type="xsd:long" /> <xsd:attribute name="pts" type="xsd:long" />
@@ -171,7 +131,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"/>
@@ -183,13 +142,10 @@
<xsd:attribute name="codec_tag" type="xsd:string" use="required"/> <xsd:attribute name="codec_tag" type="xsd:string" use="required"/>
<xsd:attribute name="codec_tag_string" type="xsd:string" use="required"/> <xsd:attribute name="codec_tag_string" type="xsd:string" use="required"/>
<xsd:attribute name="extradata" type="xsd:string" /> <xsd:attribute name="extradata" type="xsd:string" />
<xsd:attribute name="extradata_hash" type="xsd:string" />
<!-- 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"/>
@@ -197,11 +153,7 @@
<xsd:attribute name="level" type="xsd:int"/> <xsd:attribute name="level" type="xsd:int"/>
<xsd:attribute name="color_range" type="xsd:string"/> <xsd:attribute name="color_range" type="xsd:string"/>
<xsd:attribute name="color_space" type="xsd:string"/> <xsd:attribute name="color_space" type="xsd:string"/>
<xsd:attribute name="color_transfer" type="xsd:string"/>
<xsd:attribute name="color_primaries" type="xsd:string"/>
<xsd:attribute name="chroma_location" type="xsd:string"/>
<xsd:attribute name="timecode" type="xsd:string"/> <xsd:attribute name="timecode" type="xsd:string"/>
<xsd:attribute name="refs" type="xsd:int"/>
<!-- audio attributes --> <!-- audio attributes -->
<xsd:attribute name="sample_fmt" type="xsd:string"/> <xsd:attribute name="sample_fmt" type="xsd:string"/>
@@ -220,7 +172,6 @@
<xsd:attribute name="duration" type="xsd:float"/> <xsd:attribute name="duration" type="xsd:float"/>
<xsd:attribute name="bit_rate" type="xsd:int"/> <xsd:attribute name="bit_rate" type="xsd:int"/>
<xsd:attribute name="max_bit_rate" type="xsd:int"/> <xsd:attribute name="max_bit_rate" type="xsd:int"/>
<xsd:attribute name="bits_per_raw_sample" type="xsd:int"/>
<xsd:attribute name="nb_frames" type="xsd:int"/> <xsd:attribute name="nb_frames" type="xsd:int"/>
<xsd:attribute name="nb_read_frames" type="xsd:int"/> <xsd:attribute name="nb_read_frames" type="xsd:int"/>
<xsd:attribute name="nb_read_packets" type="xsd:int"/> <xsd:attribute name="nb_read_packets" type="xsd:int"/>
@@ -273,8 +224,8 @@
<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_date" type="xsd:string" use="required"/>
<xsd:attribute name="build_time" type="xsd:string"/> <xsd:attribute name="build_time" type="xsd:string" use="required"/>
<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>
@@ -312,45 +263,4 @@
<xsd:element name="library_version" type="ffprobe:libraryVersionType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="library_version" type="ffprobe:libraryVersionType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence> </xsd:sequence>
</xsd:complexType> </xsd:complexType>
<xsd:complexType name="pixelFormatFlagsType">
<xsd:attribute name="big_endian" type="xsd:int" use="required"/>
<xsd:attribute name="palette" type="xsd:int" use="required"/>
<xsd:attribute name="bitstream" type="xsd:int" use="required"/>
<xsd:attribute name="hwaccel" type="xsd:int" use="required"/>
<xsd:attribute name="planar" type="xsd:int" use="required"/>
<xsd:attribute name="rgb" type="xsd:int" use="required"/>
<xsd:attribute name="pseudopal" type="xsd:int" use="required"/>
<xsd:attribute name="alpha" type="xsd:int" use="required"/>
</xsd:complexType>
<xsd:complexType name="pixelFormatComponentType">
<xsd:attribute name="index" type="xsd:int" use="required"/>
<xsd:attribute name="bit_depth" type="xsd:int" use="required"/>
</xsd:complexType>
<xsd:complexType name="pixelFormatComponentsType">
<xsd:sequence>
<xsd:element name="component" type="ffprobe:pixelFormatComponentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="pixelFormatType">
<xsd:sequence>
<xsd:element name="flags" type="ffprobe:pixelFormatFlagsType" minOccurs="0" maxOccurs="1"/>
<xsd:element name="components" type="ffprobe:pixelFormatComponentsType" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
<xsd:attribute name="nb_components" type="xsd:int" use="required"/>
<xsd:attribute name="log2_chroma_w" type="xsd:int"/>
<xsd:attribute name="log2_chroma_h" type="xsd:int"/>
<xsd:attribute name="bits_per_pixel" type="xsd:int"/>
</xsd:complexType>
<xsd:complexType name="pixelFormatsType">
<xsd:sequence>
<xsd:element name="pixel_format" type="ffprobe:pixelFormatType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema> </xsd:schema>

View File

@@ -1,11 +1,11 @@
# Port on which the server is listening. You must select a different # Port on which the server is listening. You must select a different
# port from your standard HTTP web server if it is running on the same # port from your standard HTTP web server if it is running on the same
# computer. # computer.
HTTPPort 8090 Port 8090
# Address on which the server is bound. Only useful if you have # Address on which the server is bound. Only useful if you have
# several network interfaces. # several network interfaces.
HTTPBindAddress 0.0.0.0 BindAddress 0.0.0.0
# Number of simultaneous HTTP connections that can be handled. It has # Number of simultaneous HTTP connections that can be handled. It has
# to be defined *before* the MaxClients parameter, since it defines the # to be defined *before* the MaxClients parameter, since it defines the
@@ -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)

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle ffserver Documentation @settitle ffserver Documentation
@titlepage @titlepage
@@ -67,12 +66,12 @@ http://@var{ffserver_ip_address}:@var{http_port}/@var{feed_name}
where @var{ffserver_ip_address} is the IP address of the machine where where @var{ffserver_ip_address} is the IP address of the machine where
@command{ffserver} is installed, @var{http_port} is the port number of @command{ffserver} is installed, @var{http_port} is the port number of
the HTTP server (configured through the @option{HTTPPort} option), and the HTTP server (configured through the @option{Port} option), and
@var{feed_name} is the name of the corresponding feed defined in the @var{feed_name} is the name of the corresponding feed defined in the
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
@@ -102,7 +101,7 @@ http://@var{ffserver_ip_address}:@var{rtsp_port}/@var{stream_name}[@var{options}
the configuration file. @var{options} is a list of options specified the configuration file. @var{options} is a list of options specified
after the URL which affects how the stream is served by after the URL which affects how the stream is served by
@command{ffserver}. @var{http_port} and @var{rtsp_port} are the HTTP @command{ffserver}. @var{http_port} and @var{rtsp_port} are the HTTP
and RTSP ports configured with the options @var{HTTPPort} and and RTSP ports configured with the options @var{Port} and
@var{RTSPPort} respectively. @var{RTSPPort} respectively.
In case the stream is associated to a feed, the encoding parameters In case the stream is associated to a feed, the encoding parameters
@@ -118,8 +117,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 +142,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
@@ -206,9 +203,11 @@ WARNING: trying to stream test1.mpg doesn't work with WMP as it tries to
transfer the entire file before starting to play. transfer the entire file before starting to play.
The same is true of AVI files. The same is true of AVI files.
You should edit the @file{ffserver.conf} file to suit your needs (in @section What happens next?
terms of frame rates etc). Then install @command{ffserver} and
@command{ffmpeg}, write a script to start them up, and off you go. You should edit the ffserver.conf file to suit your needs (in terms of
frame rates etc). Then install ffserver and ffmpeg, write a script to start
them up, and off you go.
@section What else can it do? @section What else can it do?
@@ -355,29 +354,20 @@ allow everybody else.
@section Global options @section Global options
@table @option @table @option
@item HTTPPort @var{port_number}
@item Port @var{port_number} @item Port @var{port_number}
@item RTSPPort @var{port_number} @item RTSPPort @var{port_number}
@var{HTTPPort} sets the HTTP server listening TCP port number, Set TCP port number on which the HTTP/RTSP server is listening. You
@var{RTSPPort} sets the RTSP server listening TCP port number. must select a different port from your standard HTTP web server if it
is running on the same computer.
@var{Port} is the equivalent of @var{HTTPPort} and is deprecated.
You must select a different port from your standard HTTP web server if
it is running on the same computer.
If not specified, no corresponding server will be created. If not specified, no corresponding server will be created.
@item HTTPBindAddress @var{ip_address}
@item BindAddress @var{ip_address} @item BindAddress @var{ip_address}
@item RTSPBindAddress @var{ip_address} @item RTSPBindAddress @var{ip_address}
Set address on which the HTTP/RTSP server is bound. Only useful if you Set address on which the HTTP/RTSP server is bound. Only useful if you
have several network interfaces. have several network interfaces.
@var{BindAddress} is the equivalent of @var{HTTPBindAddress} and is
deprecated.
@item MaxHTTPConnections @var{n} @item MaxHTTPConnections @var{n}
Set number of simultaneous HTTP connections that can be handled. It Set number of simultaneous HTTP connections that can be handled. It
has to be defined @emph{before} the @option{MaxClients} parameter, has to be defined @emph{before} the @option{MaxClients} parameter,
@@ -411,12 +401,6 @@ ignored, and the log is written to standard output.
Set no-daemon mode. This option is currently ignored since now Set no-daemon mode. This option is currently ignored since now
@command{ffserver} will always work in no-daemon mode, and is @command{ffserver} will always work in no-daemon mode, and is
deprecated. deprecated.
@item UseDefaults
@item NoDefaults
Control whether default codec options are used for the all streams or not.
Each stream may overwrite this setting for its own. Default is @var{UseDefaults}.
The lastest occurrence overrides previous if multiple definitions.
@end table @end table
@section Feed section @section Feed section
@@ -580,11 +564,6 @@ deprecated in favor of @option{Metadata}.
@item Metadata @var{key} @var{value} @item Metadata @var{key} @var{value}
Set metadata value on the output stream. Set metadata value on the output stream.
@item UseDefaults
@item NoDefaults
Control whether default codec options are used for the stream or not.
Default is @var{UseDefaults} unless disabled globally.
@item NoAudio @item NoAudio
@item NoVideo @item NoVideo
Suppress audio/video. Suppress audio/video.
@@ -603,9 +582,8 @@ Set sampling frequency for audio. When using low bitrates, you should
lower this frequency to 22050 or 11025. The supported frequencies lower this frequency to 22050 or 11025. The supported frequencies
depend on the selected audio codec. depend on the selected audio codec.
@item AVOptionAudio [@var{codec}:]@var{option} @var{value} (@emph{encoding,audio}) @item AVOptionAudio @var{option} @var{value} (@emph{encoding,audio})
Set generic or private option for audio stream. Set generic option for audio stream.
Private option must be prefixed with codec name or codec must be defined before.
@item AVPresetAudio @var{preset} (@emph{encoding,audio}) @item AVPresetAudio @var{preset} (@emph{encoding,audio})
Set preset for audio stream. Set preset for audio stream.
@@ -682,9 +660,8 @@ Set video @option{qdiff} encoding option.
@item DarkMask @var{float} (@emph{encoding,video}) @item DarkMask @var{float} (@emph{encoding,video})
Set @option{lumi_mask}/@option{dark_mask} encoding options. Set @option{lumi_mask}/@option{dark_mask} encoding options.
@item AVOptionVideo [@var{codec}:]@var{option} @var{value} (@emph{encoding,video}) @item AVOptionVideo @var{option} @var{value} (@emph{encoding,video})
Set generic or private option for video stream. Set generic option for video stream.
Private option must be prefixed with codec name or codec must be defined before.
@item AVPresetVideo @var{preset} (@emph{encoding,video}) @item AVPresetVideo @var{preset} (@emph{encoding,video})
Set preset for video stream. Set preset for video stream.

View File

@@ -3,7 +3,7 @@ representing a number as input, which may be followed by one of the SI
unit prefixes, for example: 'K', 'M', or 'G'. unit prefixes, for example: 'K', 'M', or 'G'.
If 'i' is appended to the SI unit prefix, the complete prefix will be If 'i' is appended to the SI unit prefix, the complete prefix will be
interpreted as a unit prefix for binary multiples, which are based on interpreted as a unit prefix for binary multiplies, which are based on
powers of 1024 instead of powers of 1000. Appending 'B' to the SI unit powers of 1024 instead of powers of 1000. Appending 'B' to the SI unit
prefix multiplies the value by 8. This allows using, for example: prefix multiplies the value by 8. This allows using, for example:
'KB', 'MiB', 'G' and 'B' as number suffixes. 'KB', 'MiB', 'G' and 'B' as number suffixes.
@@ -46,16 +46,6 @@ in the program with the id @var{program_id}. Otherwise, it matches all streams i
program. program.
@item #@var{stream_id} or i:@var{stream_id} @item #@var{stream_id} or i:@var{stream_id}
Match the stream by stream id (e.g. PID in MPEG-TS container). Match the stream by stream id (e.g. PID in MPEG-TS container).
@item m:@var{key}[:@var{value}]
Matches streams with the metadata tag @var{key} having the specified value. If
@var{value} is not given, matches streams that contain the given tag with any
value.
@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
input files.
@end table @end table
@section Generic options @section Generic options
@@ -106,10 +96,7 @@ Print detailed information about the filter name @var{filter_name}. Use the
Show version. Show version.
@item -formats @item -formats
Show available formats (including devices). Show available formats.
@item -devices
Show available devices.
@item -codecs @item -codecs
Show all codecs known to libavcodec. Show all codecs known to libavcodec.
@@ -144,22 +131,6 @@ Show channel names and standard channel layouts.
@item -colors @item -colors
Show recognized color names. Show recognized color names.
@item -sources @var{device}[,@var{opt1}=@var{val1}[,@var{opt2}=@var{val2}]...]
Show autodetected sources of the intput device.
Some devices may provide system-dependent source names that cannot be autodetected.
The returned list cannot be assumed to be always complete.
@example
ffmpeg -sources pulse,server=192.168.0.4
@end example
@item -sinks @var{device}[,@var{opt1}=@var{val1}[,@var{opt2}=@var{val2}]...]
Show autodetected sinks of the output device.
Some devices may provide system-dependent sink names that cannot be autodetected.
The returned list cannot be assumed to be always complete.
@example
ffmpeg -sinks pulse,server=192.168.0.4
@end example
@item -loglevel [repeat+]@var{loglevel} | -v [repeat+]@var{loglevel} @item -loglevel [repeat+]@var{loglevel} | -v [repeat+]@var{loglevel}
Set the logging level used by the library. Set the logging level used by the library.
Adding "repeat+" indicates that repeated log output should not be compressed Adding "repeat+" indicates that repeated log output should not be compressed
@@ -168,29 +139,28 @@ omitted. "repeat" can also be used alone.
If "repeat" is used alone, and with no prior loglevel set, the default If "repeat" is used alone, and with no prior loglevel set, the default
loglevel will be used. If multiple loglevel parameters are given, using loglevel will be used. If multiple loglevel parameters are given, using
'repeat' will not change the loglevel. 'repeat' will not change the loglevel.
@var{loglevel} is a string or a number containing one of the following values: @var{loglevel} is a number or a string containing one of the following values:
@table @samp @table @samp
@item quiet, -8 @item quiet
Show nothing at all; be silent. Show nothing at all; be silent.
@item panic, 0 @item panic
Only show fatal errors which could lead the process to crash, such as Only show fatal errors which could lead the process to crash, such as
and assert failure. This is not currently used for anything. and assert failure. This is not currently used for anything.
@item fatal, 8 @item fatal
Only show fatal errors. These are errors after which the process absolutely Only show fatal errors. These are errors after which the process absolutely
cannot continue after. cannot continue after.
@item error, 16 @item error
Show all errors, including ones which can be recovered from. Show all errors, including ones which can be recovered from.
@item warning, 24 @item warning
Show all warnings and errors. Any message related to possibly Show all warnings and errors. Any message related to possibly
incorrect or unexpected events will be shown. incorrect or unexpected events will be shown.
@item info, 32 @item info
Show informative messages during processing. This is in addition to Show informative messages during processing. This is in addition to
warnings and errors. This is the default value. warnings and errors. This is the default value.
@item verbose, 40 @item verbose
Same as @code{info}, except more verbose. Same as @code{info}, except more verbose.
@item debug, 48 @item debug
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
@@ -208,29 +178,21 @@ directory.
This file can be useful for bug reports. This file can be useful for bug reports.
It also implies @code{-loglevel verbose}. It also implies @code{-loglevel verbose}.
Setting the environment variable @env{FFREPORT} to any value has the Setting the environment variable @code{FFREPORT} to any value has the
same effect. If the value is a ':'-separated key=value sequence, these same effect. If the value is a ':'-separated key=value sequence, these
options will affect the report; option values must be escaped if they options will affect the report; options values must be escaped if they
contain special characters or the options delimiter ':' (see the contain special characters or the options delimiter ':' (see the
``Quoting and escaping'' section in the ffmpeg-utils manual). ``Quoting and escaping'' section in the ffmpeg-utils manual). The
following option is recognized:
The following options are recognized:
@table @option @table @option
@item file @item file
set the file name to use for the report; @code{%p} is expanded to the name set the file name to use for the report; @code{%p} is expanded to the name
of the program, @code{%t} is expanded to a timestamp, @code{%%} is expanded of the program, @code{%t} is expanded to a timestamp, @code{%%} is expanded
to a plain @code{%} to a plain @code{%}
@item level @item level
set the log verbosity level using a numerical value (see @code{-loglevel}). set the log level
@end table @end table
For example, to output a report to a file named @file{ffreport.log}
using a log level of @code{32} (alias for log level @code{info}):
@example
FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output
@end example
Errors in parsing the environment variable are not fatal, and will not Errors in parsing the environment variable are not fatal, and will not
appear in the report. appear in the report.
@@ -265,14 +227,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
@@ -283,13 +241,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
@@ -309,41 +260,8 @@ Possible flags for this option are:
@end table @end table
@item -opencl_bench @item -opencl_bench
This option is used to benchmark all available OpenCL devices and print the Benchmark all available OpenCL devices and show the results. This option
results. This option is only available when FFmpeg has been compiled with is only available when FFmpeg has been compiled with @code{--enable-opencl}.
@code{--enable-opencl}.
When FFmpeg is configured with @code{--enable-opencl}, the options for the
global OpenCL context are set via @option{-opencl_options}. See the
"OpenCL Options" section in the ffmpeg-utils manual for the complete list of
supported options. Amongst others, these options include the ability to select
a specific platform and device to run the OpenCL code on. By default, FFmpeg
will run on the first device of the first platform. While the options for the
global OpenCL context provide flexibility to the user in selecting the OpenCL
device of their choice, most users would probably want to select the fastest
OpenCL device for their system.
This option assists the selection of the most efficient configuration by
identifying the appropriate device for the user's system. The built-in
benchmark is run on all the OpenCL devices and the performance is measured for
each device. The devices in the results list are sorted based on their
performance with the fastest device listed first. The user can subsequently
invoke @command{ffmpeg} using the device deemed most appropriate via
@option{-opencl_options} to obtain the best performance for the OpenCL
accelerated code.
Typical usage to use the fastest OpenCL device involve the following steps.
Run the command:
@example
ffmpeg -opencl_bench
@end example
Note down the platform ID (@var{pidx}) and device ID (@var{didx}) of the first
i.e. fastest device in the list.
Select the platform and device using the command:
@example
ffmpeg -opencl_options platform_idx=@var{pidx}:device_idx=@var{didx} ...
@end example
@item -opencl_options options (@emph{global}) @item -opencl_options options (@emph{global})
Set OpenCL environment options. This option is only available when Set OpenCL environment options. This option is only available when

File diff suppressed because it is too large Load Diff

View File

@@ -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
@@ -57,10 +55,6 @@ Do not merge side data.
Enable RTP MP4A-LATM payload. Enable RTP MP4A-LATM payload.
@item nobuffer @item nobuffer
Reduce the latency introduced by optional buffering Reduce the latency introduced by optional buffering
@item bitexact
Only write platform-, build- and time-independent data.
This ensures that file and data checksums are reproducible and match between
platforms. Its primary use is for regression testing.
@end table @end table
@item seek2any @var{integer} (@emph{input}) @item seek2any @var{integer} (@emph{input})
@@ -69,7 +63,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,25 +121,6 @@ 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. Use wallclock as timestamps.
@@ -193,18 +168,6 @@ The offset is added by the muxer to the output timestamps.
Specifying a positive offset means that the corresponding streams are Specifying a positive offset means that the corresponding streams are
delayed bt the time duration specified in @var{offset}. Default value delayed bt the time duration specified in @var{offset}. Default value
is @code{0} (meaning that no offset is applied). is @code{0} (meaning that no offset is applied).
@item format_whitelist @var{list} (@emph{input})
"," separated List of allowed demuxers. By default all are allowed.
@item dump_separator @var{string} (@emph{input})
Separator used to separate the fields printed on the command line about the
Stream parameters.
For example to separate the fields with newlines and indention:
@example
ffprobe -dump_separator "
" -i ~/videos/matrixbench_mpeg2.mpg
@end example
@end table @end table
@c man end FORMAT OPTIONS @c man end FORMAT OPTIONS

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle General Documentation @settitle General Documentation
@titlepage @titlepage
@@ -109,14 +108,6 @@ Go to @url{http://www.wavpack.com/} and follow the instructions for
installing the library. Then pass @code{--enable-libwavpack} to configure to installing the library. Then pass @code{--enable-libwavpack} to configure to
enable it. enable it.
@section OpenH264
FFmpeg can make use of the OpenH264 library for H.264 encoding.
Go to @url{http://www.openh264.org/} and follow the instructions for
installing the library. Then pass @code{--enable-libopenh264} to configure to
enable it.
@section x264 @section x264
FFmpeg can make use of the x264 library for H.264 encoding. FFmpeg can make use of the x264 library for H.264 encoding.
@@ -139,7 +130,7 @@ Go to @url{http://x265.org/developers.html} and follow the instructions
for installing the library. Then pass @code{--enable-libx265} to configure for installing the library. Then pass @code{--enable-libx265} to configure
to enable it. to enable it.
@float NOTE @float note
x265 is under the GNU Public License Version 2 or later x265 is under the GNU Public License Version 2 or later
(see @url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html} for (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. details), you must upgrade FFmpeg's license to GPL in order to use it.
@@ -152,7 +143,7 @@ by Google as part of the WebRTC project. libilbc is a packaging friendly
copy of the iLBC codec. FFmpeg can make use of the libilbc library for copy of the iLBC codec. FFmpeg can make use of the libilbc library for
iLBC encoding and decoding. iLBC encoding and decoding.
Go to @url{https://github.com/TimothyGu/libilbc} and follow the instructions for Go to @url{https://github.com/dekkers/libilbc} and follow the instructions for
installing the library. Then pass @code{--enable-libilbc} to configure to installing the library. Then pass @code{--enable-libilbc} to configure to
enable it. enable it.
@@ -179,8 +170,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}.
@@ -222,7 +213,6 @@ library:
@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 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.
@@ -253,10 +243,6 @@ library:
@tab Used in the game Cyberia from Interplay. @tab Used in the game Cyberia from Interplay.
@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 Canopus HQ @tab @tab X
@item Canopus HQA @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
@@ -468,8 +454,6 @@ library:
@item Sony Wave64 (W64) @tab X @tab X @item Sony Wave64 (W64) @tab X @tab X
@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 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.
@@ -511,7 +495,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
@@ -669,7 +652,7 @@ following image formats are supported:
@item H.263 / H.263-1996 @tab X @tab X @item H.263 / H.263-1996 @tab X @tab X
@item H.263+ / H.263-1998 / H.263 version 2 @tab X @tab X @item H.263+ / H.263-1998 / H.263 version 2 @tab X @tab X
@item H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 @tab E @tab X @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
@item HEVC @tab X @tab X @item HEVC @tab X @tab X
@tab encoding supported through the external library libx265 @tab encoding supported through the external library libx265
@item HNM version 4 @tab @tab X @item HNM version 4 @tab @tab X
@@ -905,12 +888,10 @@ following image formats are supported:
@tab decoding supported through external library libcelt @tab decoding supported through external library libcelt
@item Delphine Software International CIN audio @tab @tab X @item Delphine Software International CIN audio @tab @tab X
@tab Codec used in Delphine Software International games. @tab Codec used in Delphine Software International games.
@item Digital Speech Standard - Standard Play mode (DSS SP) @tab @tab X
@item Discworld II BMV Audio @tab @tab X @item Discworld II BMV Audio @tab @tab X
@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, XLL (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
@@ -954,8 +935,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
@@ -1049,7 +1030,6 @@ performance on systems without hardware floating point support).
@item PJS (Phoenix) @tab @tab X @tab @tab X @item PJS (Phoenix) @tab @tab X @tab @tab X
@item RealText @tab @tab X @tab @tab X @item RealText @tab @tab X @tab @tab X
@item SAMI @tab @tab X @tab @tab X @item SAMI @tab @tab X @tab @tab X
@item Spruce format (STL) @tab @tab X @tab @tab X
@item SSA/ASS @tab X @tab X @tab X @tab X @item SSA/ASS @tab X @tab X @tab X @tab X
@item SubRip (SRT) @tab X @tab X @tab X @tab X @item SubRip (SRT) @tab X @tab X @tab X @tab X
@item SubViewer v1 @tab @tab X @tab @tab X @item SubViewer v1 @tab @tab X @tab @tab X
@@ -1075,7 +1055,6 @@ performance on systems without hardware floating point support).
@item HLS @tab X @item HLS @tab X
@item HTTP @tab X @item HTTP @tab X
@item HTTPS @tab X @item HTTPS @tab X
@item Icecast @tab X
@item MMSH @tab X @item MMSH @tab X
@item MMST @tab X @item MMST @tab X
@item pipe @tab X @item pipe @tab X

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle Using git to develop FFmpeg @settitle Using git to develop FFmpeg
@@ -75,7 +74,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
@@ -331,7 +329,7 @@ git push
Will push the changes to the default remote (@var{origin}). Will push the changes to the default remote (@var{origin}).
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>

View File

@@ -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
@@ -58,173 +58,38 @@ AVFoundation input device.
AVFoundation is the currently recommended framework by Apple for streamgrabbing on OSX >= 10.7 as well as on iOS. AVFoundation is the currently recommended framework by Apple for streamgrabbing on OSX >= 10.7 as well as on iOS.
The older QTKit framework has been marked deprecated since OSX version 10.7. The older QTKit framework has been marked deprecated since OSX version 10.7.
The input filename has to be given in the following syntax: The filename passed as input is parsed to contain either a device name or index.
@example The device index can also be given by using -video_device_index.
-i "[[VIDEO]:[AUDIO]]" A given device index will override any given device name.
@end example If the desired device consists of numbers only, use -video_device_index to identify it.
The first entry selects the video input while the latter selects the audio input. The default device will be chosen if an empty string or the device name "default" is given.
The stream has to be specified by the device name or the device index as shown by the device list. The available devices can be enumerated by using -list_devices.
Alternatively, the video and/or audio input device can be chosen by index using the The pixel format can be set using -pixel_format.
@option{ Available formats:
-video_device_index <INDEX> monob, rgb555be, rgb555le, rgb565be, rgb565le, rgb24, bgr24, 0rgb, bgr0, 0bgr, rgb0,
}
and/or
@option{
-audio_device_index <INDEX>
}
, overriding any
device name or index given in the input filename.
All available devices can be enumerated by using @option{-list_devices true}, listing
all device names and corresponding indices.
There are two device name aliases:
@table @code
@item default
Select the AVFoundation default device of the corresponding type.
@item none
Do not record the corresponding media type.
This is equivalent to specifying an empty device name or index.
@end table
@subsection Options
AVFoundation supports the following options:
@table @option
@item -list_devices <TRUE|FALSE>
If set to true, a list of all available input devices is given showing all
device names and indices.
@item -video_device_index <INDEX>
Specify the video device by its index. Overrides anything given in the input filename.
@item -audio_device_index <INDEX>
Specify the audio device by its index. Overrides anything given in the input filename.
@item -pixel_format <FORMAT>
Request the video device to use a specific pixel format.
If the specified format is not supported, a list of available formats is given
und the first one in this list is used instead. Available pixel formats are:
@code{monob, rgb555be, rgb555le, rgb565be, rgb565le, rgb24, bgr24, 0rgb, bgr0, 0bgr, rgb0,
bgr48be, uyvy422, yuva444p, yuva444p16le, yuv444p, yuv422p16, yuv422p10, yuv444p10, bgr48be, uyvy422, yuva444p, yuva444p16le, yuv444p, yuv422p16, yuv422p10, yuv444p10,
yuv420p, nv12, yuyv422, gray} yuv420p, nv12, yuyv422, gray
@end table
@subsection Examples
@itemize
@item
Print the list of AVFoundation supported devices and exit:
@example @example
$ ffmpeg -f avfoundation -list_devices true -i "" ffmpeg -f avfoundation -i "0" out.mpg
@end example @end example
@item
Record video from video device 0 and audio from audio device 0 into out.avi:
@example @example
$ ffmpeg -f avfoundation -i "0:0" out.avi ffmpeg -f avfoundation -video_device_index 0 -i "" out.mpg
@end example @end example
@item
Record video from video device 2 and audio from audio device 1 into out.avi:
@example @example
$ ffmpeg -f avfoundation -video_device_index 2 -i ":1" out.avi ffmpeg -f avfoundation -pixel_format bgr0 -i "default" out.mpg
@end example @end example
@item
Record video from the system default video device using the pixel format bgr0 and do not record any audio into out.avi:
@example @example
$ ffmpeg -f avfoundation -pixel_format bgr0 -i "default:none" out.avi ffmpeg -f avfoundation -list_devices true -i ""
@end example @end example
@end itemize
@section bktr @section bktr
BSD video input device. BSD video input device.
@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.
@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
@section dshow @section dshow
Windows DirectShow input device. Windows DirectShow input device.
@@ -242,7 +107,7 @@ The input name should be in the format:
@end example @end example
where @var{TYPE} can be either @var{audio} or @var{video}, where @var{TYPE} can be either @var{audio} or @var{video},
and @var{NAME} is the device's name or alternative name.. and @var{NAME} is the device's name.
@subsection Options @subsection Options
@@ -295,85 +160,6 @@ Setting this value too low can degrade performance.
See also See also
@url{http://msdn.microsoft.com/en-us/library/windows/desktop/dd377582(v=vs.85).aspx} @url{http://msdn.microsoft.com/en-us/library/windows/desktop/dd377582(v=vs.85).aspx}
@item video_pin_name
Select video capture pin to use by name or alternative name.
@item audio_pin_name
Select audio capture pin to use by name or alternative name.
@item crossbar_video_input_pin_number
Select video input pin number for crossbar device. This will be
routed to the crossbar device's Video Decoder output pin.
Note that changing this value can affect future invocations
(sets a new default) until system reboot occurs.
@item crossbar_audio_input_pin_number
Select audio input pin number for crossbar device. This will be
routed to the crossbar device's Audio Decoder output pin.
Note that changing this value can affect future invocations
(sets a new default) until system reboot occurs.
@item show_video_device_dialog
If set to @option{true}, before capture starts, popup a display dialog
to the end user, allowing them to change video filter properties
and configurations manually.
Note that for crossbar devices, adjusting values in this dialog
may be needed at times to toggle between PAL (25 fps) and NTSC (29.97)
input frame rates, sizes, interlacing, etc. Changing these values can
enable different scan rates/frame rates and avoiding green bars at
the bottom, flickering scan lines, etc.
Note that with some devices, changing these properties can also affect future
invocations (sets new defaults) until system reboot occurs.
@item show_audio_device_dialog
If set to @option{true}, before capture starts, popup a display dialog
to the end user, allowing them to change audio filter properties
and configurations manually.
@item show_video_crossbar_connection_dialog
If set to @option{true}, before capture starts, popup a display
dialog to the end user, allowing them to manually
modify crossbar pin routings, when it opens a video device.
@item show_audio_crossbar_connection_dialog
If set to @option{true}, before capture starts, popup a display
dialog to the end user, allowing them to manually
modify crossbar pin routings, when it opens an audio device.
@item show_analog_tv_tuner_dialog
If set to @option{true}, before capture starts, popup a display
dialog to the end user, allowing them to manually
modify TV channels and frequencies.
@item show_analog_tv_tuner_audio_dialog
If set to @option{true}, before capture starts, popup a display
dialog to the end user, allowing them to manually
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
@@ -410,19 +196,6 @@ Print the list of supported options in selected device and exit:
$ ffmpeg -list_options true -f dshow -i video="Camera" $ ffmpeg -list_options true -f dshow -i video="Camera"
@end example @end example
@item
Specify pin names to capture by name or alternative name, specify alternative device name:
@example
$ ffmpeg -f dshow -audio_pin_name "Audio Out" -video_pin_name 2 -i video=video="@@device_pnp_\\?\pci#ven_1a0a&dev_6200&subsys_62021461&rev_01#4&e2c7dd6&0&00e1#@{65e8773d-8f56-11d0-a3b9-00a0c9223196@}\@{ca465100-deb0-4d59-818f-8c477184adf6@}":audio="Microphone"
@end example
@item
Configure a crossbar device, specifying crossbar pins, allow user to adjust video capture properties at startup:
@example
$ ffmpeg -f dshow -show_video_device_dialog true -crossbar_video_input_pin_number 0
-crossbar_audio_input_pin_number 3 -i video="AVerMedia BDA Analog Capture":audio="AVerMedia BDA Analog Capture"
@end example
@end itemize @end itemize
@section dv1394 @section dv1394
@@ -557,7 +330,7 @@ not work and result in undefined behavior.
The values @option{auto}, @option{dv} and @option{hdv} are supported. The values @option{auto}, @option{dv} and @option{hdv} are supported.
@item dvbuffer @item dvbuffer
Set maximum size of buffer for incoming data, in frames. For DV, this Set maxiumum size of buffer for incoming data, in frames. For DV, this
is an exact value. For HDV, it is not frame exact, since HDV does is an exact value. For HDV, it is not frame exact, since HDV does
not have a fixed frame size. not have a fixed frame size.
@@ -662,14 +435,6 @@ generated by the device.
The first unlabelled output is automatically assigned to the "out0" The first unlabelled output is automatically assigned to the "out0"
label, but all the others need to be specified explicitly. label, but all the others need to be specified explicitly.
The suffix "+subcc" can be appended to the output label to create an extra
stream with the closed captions packets attached to that output
(experimental; only for EIA-608 / CEA-708 for now).
The subcc streams are created after all the normal streams, in the order of
the corresponding stream.
For example, if there is "out19+subcc", "out7+subcc" and up to "out42", the
stream #43 is subcc for stream #7 and stream #44 is subcc for stream #19.
If not specified defaults to the filename specified for the input If not specified defaults to the filename specified for the input
device. device.
@@ -716,63 +481,12 @@ Read an audio stream and a video stream and play it back with
ffplay -f lavfi "movie=test.avi[out0];amovie=test.wav[out1]" ffplay -f lavfi "movie=test.avi[out0];amovie=test.wav[out1]"
@end example @end example
@item
Dump decoded frames to images and closed captions to a file (experimental):
@example
ffmpeg -f lavfi -i "movie=test.ts[out0+subcc]" -map v frame%08d.png -map s -c copy -f rawvideo subcc.bin
@end example
@end itemize @end itemize
@section libcdio
Audio-CD input device based on libcdio.
To enable this input device during configuration you need libcdio
installed on your system. It requires the configure option
@code{--enable-libcdio}.
This device allows playing and grabbing from an Audio-CD.
For example to copy with @command{ffmpeg} the entire Audio-CD in @file{/dev/sr0},
you may run the command:
@example
ffmpeg -f libcdio -i /dev/sr0 cd.wav
@end example
@subsection Options
@table @option
@item speed
Set drive reading speed. Default value is 0.
The speed is specified CD-ROM speed units. The speed is set through
the libcdio @code{cdio_cddap_speed_set} function. On many CD-ROM
drives, specifying a value too large will result in using the fastest
speed.
@item paranoia_mode
Set paranoia recovery mode flags. It accepts one of the following values:
@table @samp
@item disable
@item verify
@item overlap
@item neverskip
@item full
@end table
Default value is @samp{disable}.
For more information about the available recovery modes, consult the
paranoia project documentation.
@end table
@section libdc1394 @section libdc1394
IIDC1394 input device, based on libdc1394 and libraw1394. IIDC1394 input device, based on libdc1394 and libraw1394.
Requires the configure option @code{--enable-libdc1394}.
@section openal @section openal
The OpenAL input device provides audio capture on all systems with a The OpenAL input device provides audio capture on all systems with a
@@ -1003,12 +717,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
@@ -1107,13 +815,6 @@ other filename will be interpreted as device number 0.
X11 video input device. X11 video input device.
To enable this input device during configuration you need libxcb
installed on your system. It will be automatically detected during
configuration.
Alternatively, the configure option @option{--enable-x11grab} exists
for legacy Xlib users.
This device allows one to capture a region of an X11 display. This device allows one to capture a region of an X11 display.
The filename passed as input has the syntax: The filename passed as input has the syntax:
@@ -1130,12 +831,10 @@ omitted, and defaults to "localhost". The environment variable
area with respect to the top-left border of the X11 screen. They area with respect to the top-left border of the X11 screen. They
default to 0. default to 0.
Check the X11 documentation (e.g. @command{man X}) for more detailed Check the X11 documentation (e.g. man X) for more detailed information.
information.
Use the @command{xdpyinfo} program for getting basic information about Use the @command{dpyinfo} program for getting basic information about the
the properties of your X11 display (e.g. grep for "name" or properties of your X11 display (e.g. grep for "name" or "dimensions").
"dimensions").
For example to grab from @file{:0.0} using @command{ffmpeg}: For example to grab from @file{:0.0} using @command{ffmpeg}:
@example @example
@@ -1184,10 +883,6 @@ If @var{show_region} is specified with @code{1}, then the grabbing
region will be indicated on screen. With this option, it is easy to region will be indicated on screen. With this option, it is easy to
know what is being grabbed if only a portion of the screen is grabbed. know what is being grabbed if only a portion of the screen is grabbed.
@item region_border
Set the region border thickness if @option{-show_region 1} is used.
Range is 1 to 128 and default is 3 (XCB-based x11grab only).
For example: For example:
@example @example
ffmpeg -f x11grab -show_region 1 -framerate 25 -video_size cif -i :0.0+10,20 out.mpg ffmpeg -f x11grab -show_region 1 -framerate 25 -video_size cif -i :0.0+10,20 out.mpg
@@ -1200,22 +895,6 @@ ffmpeg -f x11grab -follow_mouse centered -show_region 1 -framerate 25 -video_siz
@item video_size @item video_size
Set the video frame size. Default value is @code{vga}. Set the video frame size. Default value is @code{vga}.
@item use_shm
Use the MIT-SHM extension for shared memory. Default value is @code{1}.
It may be necessary to disable it for remote displays (legacy x11grab
only).
@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.
@c man end INPUT DEVICES @c man end INPUT DEVICES

View File

@@ -22,7 +22,7 @@ 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:
http(s)://lists.ffmpeg.org/mailman/listinfo/ffmpeg-trac http(s)://ffmpeg.org/mailman/listinfo/ffmpeg-trac
The URL of the webinterface of the tracker is: The URL of the webinterface of the tracker is:
http(s)://trac.ffmpeg.org http(s)://trac.ffmpeg.org

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle Libavcodec Documentation @settitle Libavcodec Documentation
@titlepage @titlepage

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle Libavdevice Documentation @settitle Libavdevice Documentation
@titlepage @titlepage

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle Libavfilter Documentation @settitle Libavfilter Documentation
@titlepage @titlepage

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle Libavformat Documentation @settitle Libavformat Documentation
@titlepage @titlepage

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle Libavutil Documentation @settitle Libavutil Documentation
@titlepage @titlepage

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle Libswresample Documentation @settitle Libswresample Documentation
@titlepage @titlepage

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle Libswscale Documentation @settitle Libswscale Documentation
@titlepage @titlepage

View File

@@ -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:

View File

@@ -194,19 +194,15 @@ can not be smaller than one centi second.
Apple HTTP Live Streaming muxer that segments MPEG-TS according to Apple HTTP Live Streaming muxer that segments MPEG-TS according to
the HTTP Live Streaming (HLS) specification. the HTTP Live Streaming (HLS) specification.
It creates a playlist file, and one or more segment files. The output filename It creates a playlist file and numbered segment files. The output
specifies the playlist filename. filename specifies the playlist filename; the segment filenames
receive the same basename as the playlist, a sequential number and
By default, the muxer creates a file for each segment produced. These files a .ts extension.
have the same name as the playlist, followed by a sequential number and a
.ts extension.
For example, to convert an input file with @command{ffmpeg}: For example, to convert an input file with @command{ffmpeg}:
@example @example
ffmpeg -i in.nut out.m3u8 ffmpeg -i in.nut out.m3u8
@end example @end example
This example will produce the playlist, @file{out.m3u8}, and segment files:
@file{out0.ts}, @file{out1.ts}, @file{out2.ts}, etc.
See also the @ref{segment} muxer, which provides a more generic and See also the @ref{segment} muxer, which provides a more generic and
flexible implementation of a segmenter, and can be used to perform HLS flexible implementation of a segmenter, and can be used to perform HLS
@@ -224,11 +220,6 @@ Set the segment length in seconds. Default value is 2.
Set the maximum number of playlist entries. If set to 0 the list file Set the maximum number of playlist entries. If set to 0 the list file
will contain all the segments. Default value is 5. will contain all the segments. Default value is 5.
@item hls_ts_options @var{options_list}
Set output format options using a :-separated list of key=value
parameters. Values containing @code{:} special characters must be
escaped.
@item hls_wrap @var{wrap} @item hls_wrap @var{wrap}
Set the number after which the segment filename number (the number Set the number after which the segment filename number (the number
specified in each segment file) wraps. If set to 0 the number will be specified in each segment file) wraps. If set to 0 the number will be
@@ -242,9 +233,6 @@ to @var{wrap}.
Start the playlist sequence number from @var{number}. Default value is Start the playlist sequence number from @var{number}. Default value is
0. 0.
@item hls_allow_cache @var{allowcache}
Explicitly set whether the client MAY (1) or MUST NOT (0) cache media segments.
@item hls_base_url @var{baseurl} @item hls_base_url @var{baseurl}
Append @var{baseurl} to every entry in the playlist. Append @var{baseurl} to every entry in the playlist.
Useful to generate playlists with absolute paths. Useful to generate playlists with absolute paths.
@@ -253,30 +241,6 @@ Note that the playlist sequence number must be unique for each segment
and it is not to be confused with the segment filename sequence number and it is not to be confused with the segment filename sequence number
which can be cyclic, for example if the @option{wrap} option is which can be cyclic, for example if the @option{wrap} option is
specified. specified.
@item hls_segment_filename @var{filename}
Set the segment filename. Unless hls_flags single_file is set @var{filename}
is used as a string format with the segment number:
@example
ffmpeg in.nut -hls_segment_filename 'file%03d.ts' out.m3u8
@end example
This example will produce the playlist, @file{out.m3u8}, and segment files:
@file{file000.ts}, @file{file001.ts}, @file{file002.ts}, etc.
@item hls_flags single_file
If this flag is set, the muxer will store all segments in a single MPEG-TS
file, and will use byte ranges in the playlist. HLS playlists generated with
this way will have the version number 4.
For example:
@example
ffmpeg -i in.nut -hls_flags single_file out.m3u8
@end example
Will produce the playlist, @file{out.m3u8}, and a single segment file,
@file{out.ts}.
@item hls_flags delete_segments
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.
@end table @end table
@anchor{ico} @anchor{ico}
@@ -381,7 +345,8 @@ ffmpeg -f v4l2 -r 1 -i /dev/video0 -f image2 -strftime 1 "%Y-%m-%d_%H-%M-%S.jpg"
@table @option @table @option
@item start_number @item start_number
Start the sequence from the specified number. Default value is 0. Start the sequence from the specified number. Default value is 1. Must
be a non-negative number.
@item update @item update
If set to 1, the filename will always be interpreted as just a If set to 1, the filename will always be interpreted as just a
@@ -571,6 +536,7 @@ a short portion of the file. With this option set, there is no initial
mdat atom, and the moov atom only describes the tracks but has mdat atom, and the moov atom only describes the tracks but has
a zero duration. a zero duration.
Files written with this option set do not work in QuickTime.
This option is implicitly set when writing ismv (Smooth Streaming) files. This option is implicitly set when writing ismv (Smooth Streaming) files.
@item -movflags separate_moof @item -movflags separate_moof
Write a separate moof (movie fragment) atom for each track. Normally, Write a separate moof (movie fragment) atom for each track. Normally,
@@ -585,22 +551,6 @@ This operation can take a while, and will not work in various situations such
as fragmented output, thus it is not enabled by default. as fragmented output, thus it is not enabled by default.
@item -movflags rtphint @item -movflags rtphint
Add RTP hinting tracks to the output file. Add RTP hinting tracks to the output file.
@item -movflags disable_chpl
Disable Nero chapter markers (chpl atom). Normally, both Nero chapters
and a QuickTime chapter track are written to the file. With this option
set, only the QuickTime chapter track will be written. Nero chapters can
cause failures when the file is reprocessed with certain tagging programs, like
mp3Tag 2.61a and iTunes 11.3, most likely other versions are affected as well.
@item -movflags omit_tfhd_offset
Do not write any absolute base_data_offset in tfhd atoms. This avoids
tying fragments to absolute byte positions in the file/streams.
@item -movflags default_base_moof
Similarly to the omit_tfhd_offset, this flag avoids writing the
absolute base_data_offset field in tfhd atoms, but does so by using
the new default-base-is-moof flag instead. This flag is new from
14496-12:2012. This may make the fragments easier to parse in certain
circumstances (avoiding basing track fragment location calculations
on the implicit end of the previous track fragment).
@end table @end table
@subsection Example @subsection Example
@@ -613,38 +563,29 @@ ffmpeg -re @var{<normal input/transcoding options>} -movflags isml+frag_keyframe
@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 an ID3v2 header at the beginning and
@itemize @bullet optionally an ID3v1 tag at the end. ID3v2.3 and ID3v2.4 are supported, the
@item @code{id3v2_version} option controls which one is used. Setting
An ID3v2 metadata header at the beginning (enabled by default). Versions 2.3 and @code{id3v2_version} to 0 will disable the ID3v2 header completely. The legacy
2.4 are supported, the @code{id3v2_version} private option controls which one is ID3v1 tag is not written by default, but may be enabled with the
used (3 or 4). Setting @code{id3v2_version} to 0 disables the ID3v2 header @code{write_id3v1} option.
completely.
The muxer supports writing attached pictures (APIC frames) to the ID3v2 header. The muxer may also write a Xing frame at the beginning, which contains the
The pictures are supplied to the muxer in form of a video stream with a single number of frames in the file. It is useful for computing duration of VBR files.
packet. There can be any number of those streams, each will correspond to a The Xing frame is written if the output stream is seekable and if the
single APIC frame. The stream metadata tags @var{title} and @var{comment} map @code{write_xing} option is set to 1 (the default).
to APIC @var{description} and @var{picture type} respectively. See
The muxer supports writing ID3v2 attached pictures (APIC frames). The pictures
are supplied to the muxer in form of a video stream with a single packet. There
can be any number of those streams, each will correspond to a single APIC frame.
The stream metadata tags @var{title} and @var{comment} map to APIC
@var{description} and @var{picture type} respectively. See
@url{http://id3.org/id3v2.4.0-frames} for allowed picture types. @url{http://id3.org/id3v2.4.0-frames} for allowed picture types.
Note that the APIC frames must be written at the beginning, so the muxer will Note that the APIC frames must be written at the beginning, so the muxer will
buffer the audio frames until it gets all the pictures. It is therefore advised buffer the audio frames until it gets all the pictures. It is therefore advised
to provide the pictures as soon as possible to avoid excessive buffering. to provide the pictures as soon as possible to avoid excessive buffering.
@item
A Xing/LAME frame right after the ID3v2 header (if present). It is enabled by
default, but will be written only if the output is seekable. The
@code{write_xing} private option can be used to disable it. The frame contains
various information that may be useful to the decoder, like the audio duration
or encoder delay.
@item
A legacy ID3v1 tag at the end of the file (disabled by default). It may be
enabled with the @code{write_id3v1} private option, but as its capabilities are
very limited, its usage is not recommended.
@end itemize
Examples: Examples:
Write an mp3 with an ID3v2.3 header and an ID3v1 footer: Write an mp3 with an ID3v2.3 header and an ID3v1 footer:
@@ -689,9 +630,6 @@ 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}
Set the program service_type (default @var{digital_tv}), see below
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}
@@ -726,27 +664,6 @@ 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 mpegts_service_type accepts the following values:
@table @option
@item hex_value
Any hexdecimal value between 0x01 to 0xff as defined in ETSI 300 468.
@item digital_tv
Digital TV service.
@item digital_radio
Digital Radio service.
@item teletext
Teletext service.
@item advanced_codec_digital_radio
Advanced Codec Digital Radio service.
@item mpeg2_digital_hdtv
MPEG2 Digital HDTV service.
@item advanced_codec_digital_sdtv
Advanced Codec Digital SDTV service.
@item advanced_codec_digital_hdtv
Advanced Codec Digital HDTV service.
@end table
Option mpegts_flags may take a set of such flags: Option mpegts_flags may take a set of such flags:
@table @option @table @option
@@ -804,7 +721,7 @@ Change the syncpoint usage in nut:
sensitive and seeking is not possible. Also in general the overhead from sensitive and seeking is not possible. Also in general the overhead from
syncpoints is negligible. Note, -@code{write_index} 0 can be used to disable syncpoints is negligible. Note, -@code{write_index} 0 can be used to disable
all growing data tables, allowing to mux endless streams with limited memory all growing data tables, allowing to mux endless streams with limited memory
and without these disadvantages. and wihout these disadvantages.
@item @var{timestamped} extend the syncpoint with a wallclock field. @item @var{timestamped} extend the syncpoint with a wallclock field.
@end table @end table
The @var{none} and @var{timestamped} flags are experimental. The @var{none} and @var{timestamped} flags are experimental.
@@ -829,11 +746,6 @@ is 1 second. A value of 0 will fill all segments, making pages as large as
possible. A value of 1 will effectively use 1 packet-per-page in most possible. A value of 1 will effectively use 1 packet-per-page in most
situations, giving a small seek granularity at the cost of additional container situations, giving a small seek granularity at the cost of additional container
overhead. overhead.
@item -serial_offset @var{value}
Serial value from which to set the streams serial number.
Setting it to different and sufficiently large values ensures that the produced
ogg files can be safely chained.
@end table @end table
@anchor{segment} @anchor{segment}
@@ -842,9 +754,8 @@ ogg files can be safely chained.
Basic stream segmenter. Basic stream segmenter.
This muxer outputs streams to a number of separate files of nearly This muxer outputs streams to a number of separate files of nearly
fixed duration. Output filename pattern can be set in a fashion fixed duration. Output filename pattern can be set in a fashion similar to
similar to @ref{image2}, or by using a @code{strftime} template if @ref{image2}.
the @option{strftime} option is enabled.
@code{stream_segment} is a variant of the muxer used to write to @code{stream_segment} is a variant of the muxer used to write to
streaming output formats, i.e. which do not require global headers, streaming output formats, i.e. which do not require global headers,
@@ -887,11 +798,6 @@ reference stream. The default value is @code{auto}.
Override the inner container format, by default it is guessed by the filename Override the inner container format, by default it is guessed by the filename
extension. extension.
@item segment_format_options @var{options_list}
Set output format options using a :-separated list of key=value
parameters. Values containing the @code{:} special character must be
escaped.
@item segment_list @var{name} @item segment_list @var{name}
Generate also a listfile named @var{name}. If not specified no Generate also a listfile named @var{name}. If not specified no
listfile is generated. listfile is generated.
@@ -916,7 +822,7 @@ Select the listing format.
@end table @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 the last @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
value is 0. value is 0.
@@ -1024,18 +930,6 @@ Wrap around segment index once it reaches @var{limit}.
@item segment_start_number @var{number} @item segment_start_number @var{number}
Set the sequence number of the first segment. Defaults to @code{0}. Set the sequence number of the first segment. Defaults to @code{0}.
@item strftime @var{1|0}
Use the @code{strftime} function to define the name of the new
segments to write. If this is selected, the output segment name must
contain a @code{strftime} function template. Default value is
@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
@@ -1051,7 +945,7 @@ argument must be a time duration specification, and defaults to 0.
@itemize @itemize
@item @item
Remux the content of file @file{in.mkv} to a list of segments To remux the content of file @file{in.mkv} to a list of segments
@file{out-000.nut}, @file{out-001.nut}, etc., and write the list of @file{out-000.nut}, @file{out-001.nut}, etc., and write the list of
generated segments to @file{out.list}: generated segments to @file{out.list}:
@example @example
@@ -1059,20 +953,14 @@ ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.list out%03d.nu
@end example @end example
@item @item
Segment input and set output format options for the output segments: As the example above, but segment the input file according to the split
@example points specified by the @var{segment_times} option:
ffmpeg -i in.mkv -f segment -segment_time 10 -segment_format_options movflags=+faststart out%03d.mp4
@end example
@item
Segment the input file according to the split points specified by the
@var{segment_times} option:
@example @example
ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_times 1,2,3,5,8,13,21 out%03d.nut ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_times 1,2,3,5,8,13,21 out%03d.nut
@end example @end example
@item @item
Use the @command{ffmpeg} @option{force_key_frames} As the example above, but use the @command{ffmpeg} @option{force_key_frames}
option to force key frames in the input at the specified location, together option to force key frames in the input at the specified location, together
with the segment option @option{segment_time_delta} to account for with the segment option @option{segment_time_delta} to account for
possible roundings operated when setting key frame times. possible roundings operated when setting key frame times.
@@ -1091,7 +979,7 @@ ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_fr
@end example @end example
@item @item
Convert the @file{in.mkv} to TS segments using the @code{libx264} To convert the @file{in.mkv} to TS segments using the @code{libx264}
and @code{libfaac} encoders: and @code{libfaac} encoders:
@example @example
ffmpeg -i in.mkv -map 0 -codec:v libx264 -codec:a libfaac -f ssegment -segment_list out.list out%03d.ts ffmpeg -i in.mkv -map 0 -codec:v libx264 -codec:a libfaac -f ssegment -segment_list out.list out%03d.ts
@@ -1216,17 +1104,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
@@ -1237,32 +1115,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
@@ -1278,47 +1130,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

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle NUT @settitle NUT

View File

@@ -191,11 +191,6 @@ __asm__() block.
Use external asm (nasm/yasm) or inline asm (__asm__()), do not use intrinsics. Use external asm (nasm/yasm) or inline asm (__asm__()), do not use intrinsics.
The latter requires a good optimizing compiler which gcc is not. The latter requires a good optimizing compiler which gcc is not.
When debugging a x86 external asm compilation issue, if lost in the macro
expansions, add DBG=1 to your make command-line: the input file will be
preprocessed, stripped of the debug/empty lines, then compiled, showing the
actual lines causing issues.
Inline asm vs. external asm Inline asm vs. external asm
--------------------------- ---------------------------
Both inline asm (__asm__("..") in a .c file, handled by a compiler such as gcc) Both inline asm (__asm__("..") in a .c file, handled by a compiler such as gcc)

View File

@@ -1,5 +1,4 @@
\input texinfo @c -*- texinfo -*- \input texinfo @c -*- texinfo -*-
@documentencoding UTF-8
@settitle Platform Specific Information @settitle Platform Specific Information
@titlepage @titlepage
@@ -36,9 +35,6 @@ to your project LDFLAGS:
-Wl,-Bsymbolic -Wl,-Bsymbolic
@end example @end example
If your target platform requires position independent binaries, you should
pass the correct linking flag (e.g. @code{-pie}) to @code{--extra-ldexeflags}.
@section BSD @section BSD
BSD make will not build FFmpeg, you need to install and use GNU Make BSD make will not build FFmpeg, you need to install and use GNU Make
@@ -97,9 +93,9 @@ the FFmpeg Windows Help Forum at @url{http://ffmpeg.zeranoe.com/forum/}.
@section Native Windows compilation using MinGW or MinGW-w64 @section Native Windows compilation using MinGW or MinGW-w64
FFmpeg can be built to run natively on Windows using the MinGW-w64 FFmpeg can be built to run natively on Windows using the MinGW or MinGW-w64
toolchain. Install the latest versions of MSYS2 and MinGW-w64 from toolchains. Install the latest versions of MSYS and MinGW or MinGW-w64 from
@url{http://msys2.github.io/} and/or @url{http://mingw-w64.sourceforge.net/}. @url{http://www.mingw.org/} or @url{http://mingw-w64.sourceforge.net/}.
You can find detailed installation instructions in the download section and You can find detailed installation instructions in the download section and
the FAQ. the FAQ.
@@ -107,7 +103,7 @@ Notes:
@itemize @itemize
@item Building natively using MSYS2 can be sped up by disabling implicit rules @item Building natively using MSYS can be sped up by disabling implicit rules
in the Makefile by calling @code{make -r} instead of plain @code{make}. This 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
@@ -134,12 +130,13 @@ You will need the following prerequisites:
(if using MSVC 2012 or earlier) (if using MSVC 2012 or earlier)
@item @uref{http://code.google.com/p/msinttypes/, msinttypes} @item @uref{http://code.google.com/p/msinttypes/, msinttypes}
(if using MSVC 2012 or earlier) (if using MSVC 2012 or earlier)
@item @uref{http://msys2.github.io/, MSYS2} @item @uref{http://www.mingw.org/, MSYS}
@item @uref{http://yasm.tortall.net/, YASM} @item @uref{http://yasm.tortall.net/, YASM}
(Also available via MSYS2's package manager.) @item @uref{http://gnuwin32.sourceforge.net/packages/bc.htm, bc for Windows} if
you want to run @uref{fate.html, FATE}.
@end itemize @end itemize
To set up a proper environment in MSYS2, you need to run @code{msys_shell.bat} from To set up a proper environment in MSYS, you need to run @code{msys.bat} from
the Visual Studio or Intel Compiler command prompt. the Visual Studio or Intel Compiler command prompt.
Place @code{yasm.exe} somewhere in your @code{PATH}. If using MSVC 2012 or Place @code{yasm.exe} somewhere in your @code{PATH}. If using MSVC 2012 or
@@ -278,12 +275,12 @@ llrint() in its C library.
Install your Cygwin with all the "Base" packages, plus the Install your Cygwin with all the "Base" packages, plus the
following "Devel" ones: following "Devel" ones:
@example @example
binutils, gcc4-core, make, git, mingw-runtime, texinfo binutils, gcc4-core, make, git, mingw-runtime, texi2html
@end example @end example
In order to run FATE you will also need the following "Utils" packages: In order to run FATE you will also need the following "Utils" packages:
@example @example
diffutils bc, diffutils
@end example @end example
If you want to build FFmpeg with additional libraries, download Cygwin If you want to build FFmpeg with additional libraries, download Cygwin

View File

@@ -26,10 +26,6 @@
#include <string.h> #include <string.h>
#include <float.h> #include <float.h>
// print_options is build for the host, os_support.h isn't needed and is setup
// for the target. without this build breaks on mingw
#define AVFORMAT_OS_SUPPORT_H
#include "libavformat/avformat.h" #include "libavformat/avformat.h"
#include "libavformat/options_table.h" #include "libavformat/options_table.h"
#include "libavcodec/avcodec.h" #include "libavcodec/avcodec.h"

View File

@@ -63,7 +63,7 @@ cache:@var{URL}
Physical concatenation protocol. Physical concatenation protocol.
Read and seek from many resources in sequence as if they were Allow to read and seek from many resource in sequence as if they were
a unique resource. a unique resource.
A URL accepted by this protocol has the syntax: A URL accepted by this protocol has the syntax:
@@ -117,7 +117,7 @@ ffmpeg -i "data:image/gif;base64,R0lGODdhCAAIAMIEAAAAAAAA//8AAP//AP/////////////
File access protocol. File access protocol.
Read from or write to a file. Allow to read from or write to a file.
A file URL can have the form: A file URL can have the form:
@example @example
@@ -155,7 +155,7 @@ time, which is valuable for files on slow medium.
FTP (File Transfer Protocol). FTP (File Transfer Protocol).
Read from or write to remote resources using FTP protocol. Allow to read from or write to remote resources using FTP protocol.
Following syntax is required. Following syntax is required.
@example @example
@@ -255,7 +255,7 @@ Export the MIME type.
If set to 1 request ICY (SHOUTcast) metadata from the server. If the server If set to 1 request ICY (SHOUTcast) metadata from the server. If the server
supports this, the metadata has to be retrieved by the application by reading supports this, the metadata has to be retrieved by the application by reading
the @option{icy_metadata_headers} and @option{icy_metadata_packet} options. the @option{icy_metadata_headers} and @option{icy_metadata_packet} options.
The default is 1. The default is 0.
@item icy_metadata_headers @item icy_metadata_headers
If the server supports ICY metadata, this contains the ICY-specific HTTP reply If the server supports ICY metadata, this contains the ICY-specific HTTP reply
@@ -277,41 +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.
@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
@@ -328,50 +293,6 @@ The required syntax to play a stream specifying a cookie is:
ffplay -cookies "nlqptid=nltid=tsn; path=/; domain=somedomain.com;" http://somedomain.com/somestream.m3u8 ffplay -cookies "nlqptid=nltid=tsn; path=/; domain=somedomain.com;" http://somedomain.com/somestream.m3u8
@end example @end example
@section Icecast
Icecast protocol (stream to Icecast servers)
This protocol accepts the following options:
@table @option
@item ice_genre
Set the stream genre.
@item ice_name
Set the stream name.
@item ice_description
Set the stream description.
@item ice_url
Set the stream website URL.
@item ice_public
Set if the stream should be public.
The default is 0 (not public).
@item user_agent
Override the User-Agent header. If not specified a string of the form
"Lavf/<version>" will be used.
@item password
Set the Icecast mountpoint password.
@item content_type
Set the stream content type. This must be set if it is different from
audio/mpeg.
@item legacy_icecast
This enables support for Icecast versions < 2.4.0, that do not support the
HTTP PUT method but the SOURCE method.
@end table
@example
icecast://[@var{username}[:@var{password}]@@]@var{server}:@var{port}/@var{mountpoint}
@end example
@section mmst @section mmst
MMS (Microsoft Media Server) protocol over TCP. MMS (Microsoft Media Server) protocol over TCP.
@@ -409,7 +330,7 @@ be seekable, so they will fail with the MD5 output protocol.
UNIX pipe access protocol. UNIX pipe access protocol.
Read and write from UNIX pipes. Allow to read and write from UNIX pipes.
The accepted syntax is: The accepted syntax is:
@example @example
@@ -618,7 +539,7 @@ firewalls.
@section libsmbclient @section libsmbclient
libsmbclient permits one to manipulate CIFS/SMB network resources. libsmbclient permits to manipulate CIFS/SMB network resources.
Following syntax is required. Following syntax is required.
@@ -649,7 +570,7 @@ For more information see: @url{http://www.samba.org/}.
Secure File Transfer Protocol via libssh Secure File Transfer Protocol via libssh
Read from or write to remote resources using SFTP protocol. Allow to read from or write to remote resources using SFTP protocol.
Following syntax is required. Following syntax is required.
@@ -785,7 +706,7 @@ port will be used for the local RTP and RTCP ports.
@item @item
If @option{localrtcpport} (the local RTCP port) is not set it will be If @option{localrtcpport} (the local RTCP port) is not set it will be
set to the local RTP port value plus 1. set to the the local RTP port value plus 1.
@end enumerate @end enumerate
@section rtsp @section rtsp
@@ -1090,9 +1011,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
@@ -1118,8 +1037,8 @@ Set raise error timeout, expressed in microseconds.
This option is only relevant in read mode: if no data arrived in more This option is only relevant in read mode: if no data arrived in more
than this time interval, raise error. than this time interval, raise error.
@item listen_timeout=@var{milliseconds} @item listen_timeout=@var{microseconds}
Set listen timeout, expressed in milliseconds. Set listen timeout, expressed in microseconds.
@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

View File

@@ -618,6 +618,7 @@ flip wavelet?
try to use the wavelet transformed predicted image (motion compensated image) as context for coding the residual coefficients try to use the wavelet transformed predicted image (motion compensated image) as context for coding the residual coefficients
try the MV length as context for coding the residual coefficients try the MV length as context for coding the residual coefficients
use extradata for stuff which is in the keyframes now? use extradata for stuff which is in the keyframes now?
the MV median predictor is patented IIRC
implement per picture halfpel interpolation implement per picture halfpel interpolation
try different range coder state transition tables for different contexts try different range coder state transition tables for different contexts

23
doc/style.min.css vendored

File diff suppressed because one or more lines are too long

View File

@@ -1,35 +1,26 @@
# Init file for texi2html.
# This is deprecated, and the makeinfo/texi2any version is doc/t2h.pm
# no horiz rules between sections # no horiz rules between sections
$end_section = \&FFmpeg_end_section; $end_section = \&FFmpeg_end_section;
sub FFmpeg_end_section($$) sub FFmpeg_end_section($$)
{ {
} }
my $TEMPLATE_HEADER1 = $ENV{"FFMPEG_HEADER1"} || <<EOT; $EXTRA_HEAD =
<!DOCTYPE html> '<link rel="icon" href="favicon.png" type="image/png" />
<html lang="en"> ';
<head>
<meta charset="utf-8" /> $CSS_LINES = $ENV{"FFMPEG_CSS"} || <<EOT;
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <link rel="stylesheet" type="text/css" href="default.css" />
<title>FFmpeg documentation</title>
<link rel="stylesheet" href="bootstrap.min.css" />
<link rel="stylesheet" href="style.min.css" />
EOT EOT
my $TEMPLATE_HEADER2 = $ENV{"FFMPEG_HEADER2"} || <<EOT; my $TEMPLATE_HEADER = $ENV{"FFMPEG_HEADER"} || <<EOT;
<link rel="icon" href="favicon.png" type="image/png" />
</head> </head>
<body> <body>
<div style="width: 95%; margin: auto"> <div id="container">
<div id="body">
EOT EOT
my $TEMPLATE_FOOTER = $ENV{"FFMPEG_FOOTER"} || <<EOT; $PRE_BODY_CLOSE = '</div></div>';
</div>
</body>
</html>
EOT
$SMALL_RULE = ''; $SMALL_RULE = '';
$BODYTEXT = ''; $BODYTEXT = '';
@@ -91,25 +82,21 @@ sub FFmpeg_print_page_head($$)
$longtitle = "FFmpeg documentation : " . $longtitle; $longtitle = "FFmpeg documentation : " . $longtitle;
print $fh <<EOT; print $fh <<EOT;
$TEMPLATE_HEADER1 <!DOCTYPE html>
$description <html>
<meta name="keywords" content="$longtitle">
<meta name="Generator" content="$Texi2HTML::THISDOC{program}">
$Texi2HTML::THISDOC{'copying'}<!-- Created on $Texi2HTML::THISDOC{today} by $Texi2HTML::THISDOC{program} --> $Texi2HTML::THISDOC{'copying'}<!-- Created on $Texi2HTML::THISDOC{today} by $Texi2HTML::THISDOC{program} -->
<!-- <!--
$Texi2HTML::THISDOC{program_authors} $Texi2HTML::THISDOC{program_authors}
--> -->
$encoding <head>
$TEMPLATE_HEADER2 <title>$longtitle</title>
EOT
}
$print_page_foot = \&FFmpeg_print_page_foot; $description
sub FFmpeg_print_page_foot($$) <meta name="keywords" content="$longtitle">
{ <meta name="Generator" content="$Texi2HTML::THISDOC{program}">
my $fh = shift; $encoding
print $fh <<EOT; $CSS_LINES
$TEMPLATE_FOOTER $TEMPLATE_HEADER
EOT EOT
} }

View File

@@ -1,339 +0,0 @@
# makeinfo HTML output init file
#
# Copyright (c) 2011, 2012 Free Software Foundation, Inc.
# Copyright (c) 2014 Andreas Cadhalpun
# Copyright (c) 2014 Tiancheng "Timothy" Gu
#
# This file is part of FFmpeg.
#
# FFmpeg is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# FFmpeg is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with FFmpeg; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# no navigation elements
set_from_init_file('HEADERS', 0);
sub ffmpeg_heading_command($$$$$)
{
my $self = shift;
my $cmdname = shift;
my $command = shift;
my $args = shift;
my $content = shift;
my $result = '';
# not clear that it may really happen
if ($self->in_string) {
$result .= $self->command_string($command) ."\n" if ($cmdname ne 'node');
$result .= $content if (defined($content));
return $result;
}
my $element_id = $self->command_id($command);
$result .= "<a name=\"$element_id\"></a>\n"
if (defined($element_id) and $element_id ne '');
print STDERR "Process $command "
.Texinfo::Structuring::_print_root_command_texi($command)."\n"
if ($self->get_conf('DEBUG'));
my $element;
if ($Texinfo::Common::root_commands{$command->{'cmdname'}}
and $command->{'parent'}
and $command->{'parent'}->{'type'}
and $command->{'parent'}->{'type'} eq 'element') {
$element = $command->{'parent'};
}
if ($element) {
$result .= &{$self->{'format_element_header'}}($self, $cmdname,
$command, $element);
}
my $heading_level;
# node is used as heading if there is nothing else.
if ($cmdname eq 'node') {
if (!$element or (!$element->{'extra'}->{'section'}
and $element->{'extra'}->{'node'}
and $element->{'extra'}->{'node'} eq $command
# bogus node may not have been normalized
and defined($command->{'extra'}->{'normalized'}))) {
if ($command->{'extra'}->{'normalized'} eq 'Top') {
$heading_level = 0;
} else {
$heading_level = 3;
}
}
} else {
$heading_level = $command->{'level'};
}
my $heading = $self->command_text($command);
# $heading not defined may happen if the command is a @node, for example
# if there is an error in the node.
if (defined($heading) and $heading ne '' and defined($heading_level)) {
if ($Texinfo::Common::root_commands{$cmdname}
and $Texinfo::Common::sectioning_commands{$cmdname}) {
my $content_href = $self->command_contents_href($command, 'contents',
$self->{'current_filename'});
if ($content_href) {
my $this_href = $content_href =~ s/^\#toc-/\#/r;
$heading .= '<span class="pull-right">'.
'<a class="anchor hidden-xs" '.
"href=\"$this_href\" aria-hidden=\"true\">".
($ENV{"FA_ICONS"} ? '<i class="fa fa-link"></i>'
: '#').
'</a> '.
'<a class="anchor hidden-xs"'.
"href=\"$content_href\" aria-hidden=\"true\">".
($ENV{"FA_ICONS"} ? '<i class="fa fa-navicon"></i>'
: 'TOC').
'</a>'.
'</span>';
}
}
if ($self->in_preformatted()) {
$result .= $heading."\n";
} else {
# if the level was changed, set the command name right
if ($cmdname ne 'node'
and $heading_level ne $Texinfo::Common::command_structuring_level{$cmdname}) {
$cmdname
= $Texinfo::Common::level_to_structuring_command{$cmdname}->[$heading_level];
}
$result .= &{$self->{'format_heading_text'}}(
$self, $cmdname, $heading,
$heading_level +
$self->get_conf('CHAPTER_HEADER_LEVEL') - 1, $command);
}
}
$result .= $content if (defined($content));
return $result;
}
foreach my $command (keys(%Texinfo::Common::sectioning_commands), 'node') {
texinfo_register_command_formatting($command, \&ffmpeg_heading_command);
}
# print the TOC where @contents is used
set_from_init_file('INLINE_CONTENTS', 1);
# make chapters <h2>
set_from_init_file('CHAPTER_HEADER_LEVEL', 2);
# Do not add <hr>
set_from_init_file('DEFAULT_RULE', '');
set_from_init_file('BIG_RULE', '');
# Customized file beginning
sub ffmpeg_begin_file($$$)
{
my $self = shift;
my $filename = shift;
my $element = shift;
my $command;
if ($element and $self->get_conf('SPLIT')) {
$command = $self->element_command($element);
}
my ($title, $description, $encoding, $date, $css_lines,
$doctype, $bodytext, $copying_comment, $after_body_open,
$extra_head, $program_and_version, $program_homepage,
$program, $generator) = $self->_file_header_informations($command);
my $links = $self->_get_links ($filename, $element);
my $head1 = $ENV{"FFMPEG_HEADER1"} || <<EOT;
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Created by $program_and_version, $program_homepage -->
<head>
<meta charset="utf-8">
<title>
EOT
my $head_title = <<EOT;
$title
EOT
my $head2 = $ENV{"FFMPEG_HEADER2"} || <<EOT;
</title>
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="style.min.css">
</head>
<body>
<div style="width: 95%; margin: auto">
<h1>
EOT
my $head3 = $ENV{"FFMPEG_HEADER3"} || <<EOT;
</h1>
EOT
return $head1 . $head_title . $head2 . $head_title . $head3;
}
texinfo_register_formatting_function('begin_file', \&ffmpeg_begin_file);
sub ffmpeg_program_string($)
{
my $self = shift;
if (defined($self->get_conf('PROGRAM'))
and $self->get_conf('PROGRAM') ne ''
and defined($self->get_conf('PACKAGE_URL'))) {
return $self->convert_tree(
$self->gdt('This document was generated using @uref{{program_homepage}, @emph{{program}}}.',
{ 'program_homepage' => $self->get_conf('PACKAGE_URL'),
'program' => $self->get_conf('PROGRAM') }));
} else {
return $self->convert_tree(
$self->gdt('This document was generated automatically.'));
}
}
texinfo_register_formatting_function('program_string', \&ffmpeg_program_string);
# Customized file ending
sub ffmpeg_end_file($)
{
my $self = shift;
my $program_string = &{$self->{'format_program_string'}}($self);
my $program_text = <<EOT;
<p style="font-size: small;">
$program_string
</p>
EOT
my $footer = $ENV{FFMPEG_FOOTER} || <<EOT;
</div>
</body>
</html>
EOT
return $program_text . $footer;
}
texinfo_register_formatting_function('end_file', \&ffmpeg_end_file);
# Dummy title command
# Ignore title. Title is handled through ffmpeg_begin_file().
set_from_init_file('USE_TITLEPAGE_FOR_TITLE', 1);
sub ffmpeg_title($$$$)
{
return '';
}
texinfo_register_command_formatting('titlefont',
\&ffmpeg_title);
# Customized float command. Part of code borrowed from GNU Texinfo.
sub ffmpeg_float($$$$$)
{
my $self = shift;
my $cmdname = shift;
my $command = shift;
my $args = shift;
my $content = shift;
my ($caption, $prepended) = Texinfo::Common::float_name_caption($self,
$command);
my $caption_text = '';
my $prepended_text;
my $prepended_save = '';
if ($self->in_string()) {
if ($prepended) {
$prepended_text = $self->convert_tree_new_formatting_context(
$prepended, 'float prepended');
} else {
$prepended_text = '';
}
if ($caption) {
$caption_text = $self->convert_tree_new_formatting_context(
{'contents' => $caption->{'args'}->[0]->{'contents'}},
'float caption');
}
return $prepended.$content.$caption_text;
}
my $id = $self->command_id($command);
my $label;
if (defined($id) and $id ne '') {
$label = "<a name=\"$id\"></a>";
} else {
$label = '';
}
if ($prepended) {
if ($caption) {
# prepend the prepended tree to the first paragraph
my @caption_original_contents = @{$caption->{'args'}->[0]->{'contents'}};
my @caption_contents;
my $new_paragraph;
while (@caption_original_contents) {
my $content = shift @caption_original_contents;
if ($content->{'type'} and $content->{'type'} eq 'paragraph') {
%{$new_paragraph} = %{$content};
$new_paragraph->{'contents'} = [@{$content->{'contents'}}];
unshift (@{$new_paragraph->{'contents'}}, {'cmdname' => 'strong',
'args' => [{'type' => 'brace_command_arg',
'contents' => [$prepended]}]});
push @caption_contents, $new_paragraph;
last;
} else {
push @caption_contents, $content;
}
}
push @caption_contents, @caption_original_contents;
if ($new_paragraph) {
$caption_text = $self->convert_tree_new_formatting_context(
{'contents' => \@caption_contents}, 'float caption');
$prepended_text = '';
}
}
if ($caption_text eq '') {
$prepended_text = $self->convert_tree_new_formatting_context(
$prepended, 'float prepended');
if ($prepended_text ne '') {
$prepended_save = $prepended_text;
$prepended_text = '<p><strong>'.$prepended_text.'</strong></p>';
}
}
} else {
$prepended_text = '';
}
if ($caption and $caption_text eq '') {
$caption_text = $self->convert_tree_new_formatting_context(
$caption->{'args'}->[0], 'float caption');
}
if ($prepended_text.$caption_text ne '') {
$prepended_text = $self->_attribute_class('div','float-caption'). '>'
. $prepended_text;
$caption_text .= '</div>';
}
my $html_class = '';
if ($prepended_save =~ /NOTE/) {
$html_class = 'info';
$prepended_text = '';
$caption_text = '';
} elsif ($prepended_save =~ /IMPORTANT/) {
$html_class = 'warning';
$prepended_text = '';
$caption_text = '';
}
return $self->_attribute_class('div', $html_class). '>' . "\n" .
$prepended_text . $caption_text . $content . '</div>';
}
texinfo_register_command_formatting('float',
\&ffmpeg_float);
1;

View File

@@ -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";
@@ -332,12 +332,12 @@ $inf = pop @instack;
die "No filename or title\n" unless defined $fn && defined $tl; die "No filename or title\n" unless defined $fn && defined $tl;
# always use utf8
print "=encoding utf8\n\n";
$chapters{NAME} = "$fn \- $tl\n"; $chapters{NAME} = "$fn \- $tl\n";
$chapters{FOOTNOTES} .= "=back\n" if exists $chapters{FOOTNOTES}; $chapters{FOOTNOTES} .= "=back\n" if exists $chapters{FOOTNOTES};
# always use utf8
print "=encoding utf8\n\n";
unshift @chapters_sequence, "NAME"; unshift @chapters_sequence, "NAME";
for $chapter (@chapters_sequence) { for $chapter (@chapters_sequence) {
if (exists $chapters{$chapter}) { if (exists $chapters{$chapter}) {

View File

@@ -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
@@ -782,9 +782,6 @@ large numbers (usually 2^53 and larger).
Round the value of expression @var{expr} upwards to the nearest Round the value of expression @var{expr} upwards to the nearest
integer. For example, "ceil(1.5)" is "2.0". integer. For example, "ceil(1.5)" is "2.0".
@item clip(x, min, max)
Return the value of @var{x} clipped between @var{min} and @var{max}.
@item cos(x) @item cos(x)
Compute cosine of @var{x}. Compute cosine of @var{x}.
@@ -844,7 +841,7 @@ Return 1.0 if @var{x} is +/-INFINITY, 0.0 otherwise.
Return 1.0 if @var{x} is NAN, 0.0 otherwise. 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.
@@ -912,7 +909,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.

View File

@@ -16,15 +16,16 @@ outputs the modified frame. The most simple way of doing this is to take a
similar filter. We'll pick edgedetect, but any other should do. You can look similar filter. We'll pick edgedetect, but any other should do. You can look
for others using the `./ffmpeg -v 0 -filters|grep ' V->V '` command. for others using the `./ffmpeg -v 0 -filters|grep ' V->V '` command.
- sed 's/edgedetect/foobar/g;s/EdgeDetect/Foobar/g' libavfilter/vf_edgedetect.c > libavfilter/vf_foobar.c - cp libavfilter/vf_{edgedetect,foobar}.c
- sed -i s/edgedetect/foobar/g -i libavfilter/vf_foobar.c
- sed -i s/EdgeDetect/Foobar/g -i libavfilter/vf_foobar.c
- edit libavfilter/Makefile, and add an entry for "foobar" following the - edit libavfilter/Makefile, and add an entry for "foobar" following the
pattern of the other filters. pattern of the other filters.
- edit libavfilter/allfilters.c, and add an entry for "foobar" following the - edit libavfilter/allfilters.c, and add an entry for "foobar" following the
pattern of the other filters. pattern of the other filters.
- ./configure ... - ./configure ...
- make -j<whatever> ffmpeg - make -j<whatever> ffmpeg
- ./ffmpeg -i http://samples.ffmpeg.org/image-samples/lena.pnm -vf foobar foobar.png - ./ffmpeg -i tests/lena.pnm -vf foobar foobar.png
Note here: you can obviously use a random local image instead of a remote URL.
If everything went right, you should get a foobar.png with Lena edge-detected. If everything went right, you should get a foobar.png with Lena edge-detected.

Some files were not shown because too many files have changed in this diff Show More