Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
bef4d9bf87 | ||
![]() |
bc4f6ae88e | ||
![]() |
2678b25099 | ||
![]() |
e322496054 | ||
![]() |
7fa72ff19c |
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -1 +0,0 @@
|
|||||||
*.pnm -diff -text
|
|
5
.gitignore
vendored
5
.gitignore
vendored
@@ -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
291
Changelog
@@ -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
|
||||||
|
109
LICENSE.md
109
LICENSE.md
@@ -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
|
||||||
@@ -82,22 +74,21 @@ compatible libraries
|
|||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
The following libraries are under GPL:
|
The following libraries are under GPL:
|
||||||
- frei0r
|
- frei0r
|
||||||
- libcdio
|
- libcdio
|
||||||
- libutvideo
|
- libutvideo
|
||||||
- libvidstab
|
- libvidstab
|
||||||
- libx264
|
- libx264
|
||||||
- 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
|
||||||
|
32
MAINTAINERS
32
MAINTAINERS
@@ -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
|
||||||
|
|
||||||
|
12
Makefile
12
Makefile
@@ -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
|
||||||
|
|
||||||
|
43
README.md
43
README.md
@@ -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.
|
|
||||||
|
184
RELEASE_NOTES
184
RELEASE_NOTES
@@ -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.
|
||||||
|
4
arch.mak
4
arch.mak
@@ -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)
|
||||||
|
299
cmdutils.c
299
cmdutils.c
@@ -41,10 +41,8 @@
|
|||||||
#include "libavutil/avassert.h"
|
#include "libavutil/avassert.h"
|
||||||
#include "libavutil/avstring.h"
|
#include "libavutil/avstring.h"
|
||||||
#include "libavutil/bprint.h"
|
#include "libavutil/bprint.h"
|
||||||
#include "libavutil/display.h"
|
|
||||||
#include "libavutil/mathematics.h"
|
#include "libavutil/mathematics.h"
|
||||||
#include "libavutil/imgutils.h"
|
#include "libavutil/imgutils.h"
|
||||||
#include "libavutil/libm.h"
|
|
||||||
#include "libavutil/parseutils.h"
|
#include "libavutil/parseutils.h"
|
||||||
#include "libavutil/pixdesc.h"
|
#include "libavutil/pixdesc.h"
|
||||||
#include "libavutil/eval.h"
|
#include "libavutil/eval.h"
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -1550,17 +1534,16 @@ int show_protocols(void *optctx, const char *opt, const char *arg)
|
|||||||
printf("Supported file protocols:\n"
|
printf("Supported file protocols:\n"
|
||||||
"Input:\n");
|
"Input:\n");
|
||||||
while ((name = avio_enum_protocols(&opaque, 0)))
|
while ((name = avio_enum_protocols(&opaque, 0)))
|
||||||
printf(" %s\n", name);
|
printf("%s\n", name);
|
||||||
printf("Output:\n");
|
printf("Output:\n");
|
||||||
while ((name = avio_enum_protocols(&opaque, 1)))
|
while ((name = avio_enum_protocols(&opaque, 1)))
|
||||||
printf(" %s\n", name);
|
printf("%s\n", name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
@@ -1657,19 +1639,19 @@ int show_layouts(void *optctx, const char *opt, const char *arg)
|
|||||||
const char *name, *descr;
|
const char *name, *descr;
|
||||||
|
|
||||||
printf("Individual channels:\n"
|
printf("Individual channels:\n"
|
||||||
"NAME DESCRIPTION\n");
|
"NAME DESCRIPTION\n");
|
||||||
for (i = 0; i < 63; i++) {
|
for (i = 0; i < 63; i++) {
|
||||||
name = av_get_channel_name((uint64_t)1 << i);
|
name = av_get_channel_name((uint64_t)1 << i);
|
||||||
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
|
|
||||||
|
16
cmdutils.h
16
cmdutils.h
@@ -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 */
|
||||||
|
@@ -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
|
|
||||||
|
@@ -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++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
14
common.mak
14
common.mak
@@ -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))
|
||||||
|
@@ -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
|
||||||
|
68
compat/avisynth/avisynth_c_25.h
Normal file
68
compat/avisynth/avisynth_c_25.h
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
// Copyright (c) 2011 FFmpegSource Project
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
/* these are defines/functions that are used and were changed in the switch to 2.6
|
||||||
|
* and are needed to maintain full compatility with 2.5 */
|
||||||
|
|
||||||
|
enum {
|
||||||
|
AVS_CS_YV12_25 = 1<<3 | AVS_CS_YUV | AVS_CS_PLANAR, // y-v-u, planar
|
||||||
|
AVS_CS_I420_25 = 1<<4 | AVS_CS_YUV | AVS_CS_PLANAR, // y-u-v, planar
|
||||||
|
};
|
||||||
|
|
||||||
|
AVSC_INLINE int avs_get_height_p_25(const AVS_VideoFrame * p, int plane) {
|
||||||
|
switch (plane)
|
||||||
|
{
|
||||||
|
case AVS_PLANAR_U: case AVS_PLANAR_V:
|
||||||
|
if (p->pitchUV)
|
||||||
|
return p->height>>1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return p->height;}
|
||||||
|
|
||||||
|
AVSC_INLINE int avs_get_row_size_p_25(const AVS_VideoFrame * p, int plane) {
|
||||||
|
int r;
|
||||||
|
switch (plane)
|
||||||
|
{
|
||||||
|
case AVS_PLANAR_U: case AVS_PLANAR_V:
|
||||||
|
if (p->pitchUV)
|
||||||
|
return p->row_size>>1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
case AVS_PLANAR_U_ALIGNED: case AVS_PLANAR_V_ALIGNED:
|
||||||
|
if (p->pitchUV)
|
||||||
|
{
|
||||||
|
r = ((p->row_size+AVS_FRAME_ALIGN-1)&(~(AVS_FRAME_ALIGN-1)) )>>1; // Aligned rowsize
|
||||||
|
if (r < p->pitchUV)
|
||||||
|
return r;
|
||||||
|
return p->row_size>>1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
case AVS_PLANAR_Y_ALIGNED:
|
||||||
|
r = (p->row_size+AVS_FRAME_ALIGN-1)&(~(AVS_FRAME_ALIGN-1)); // Aligned rowsize
|
||||||
|
if (r <= p->pitch)
|
||||||
|
return r;
|
||||||
|
return p->row_size;
|
||||||
|
}
|
||||||
|
return p->row_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
AVSC_INLINE int avs_is_yv12_25(const AVS_VideoInfo * p)
|
||||||
|
{ return ((p->pixel_type & AVS_CS_YV12_25) == AVS_CS_YV12_25)||((p->pixel_type & AVS_CS_I420_25) == AVS_CS_I420_25); }
|
@@ -1,62 +0,0 @@
|
|||||||
// Avisynth C Interface Version 0.20
|
|
||||||
// Copyright 2003 Kevin Atkinson
|
|
||||||
|
|
||||||
// This program is free software; you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation; either version 2 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit
|
|
||||||
// http://www.gnu.org/copyleft/gpl.html .
|
|
||||||
//
|
|
||||||
// As a special exception, I give you permission to link to the
|
|
||||||
// Avisynth C interface with independent modules that communicate with
|
|
||||||
// the Avisynth C interface solely through the interfaces defined in
|
|
||||||
// avisynth_c.h, regardless of the license terms of these independent
|
|
||||||
// modules, and to copy and distribute the resulting combined work
|
|
||||||
// under terms of your choice, provided that every copy of the
|
|
||||||
// combined work is accompanied by a complete copy of the source code
|
|
||||||
// of the Avisynth C interface and Avisynth itself (with the version
|
|
||||||
// used to produce the combined work), being distributed under the
|
|
||||||
// terms of the GNU General Public License plus this exception. An
|
|
||||||
// independent module is a module which is not derived from or based
|
|
||||||
// on Avisynth C Interface, such as 3rd-party filters, import and
|
|
||||||
// export plugins, or graphical user interfaces.
|
|
||||||
|
|
||||||
#ifndef AVS_CAPI_H
|
|
||||||
#define AVS_CAPI_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
# define EXTERN_C extern "C"
|
|
||||||
#else
|
|
||||||
# define EXTERN_C
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AVSC_USE_STDCALL
|
|
||||||
# define AVSC_CC __cdecl
|
|
||||||
#else
|
|
||||||
# define AVSC_CC __stdcall
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define AVSC_INLINE static __inline
|
|
||||||
|
|
||||||
#ifdef BUILDING_AVSCORE
|
|
||||||
# define AVSC_EXPORT EXTERN_C
|
|
||||||
# define AVSC_API(ret, name) EXTERN_C __declspec(dllexport) ret AVSC_CC name
|
|
||||||
#else
|
|
||||||
# define AVSC_EXPORT EXTERN_C __declspec(dllexport)
|
|
||||||
# ifndef AVSC_NO_DECLSPEC
|
|
||||||
# define AVSC_API(ret, name) EXTERN_C __declspec(dllimport) ret AVSC_CC name
|
|
||||||
# else
|
|
||||||
# define AVSC_API(ret, name) typedef ret (AVSC_CC *name##_func)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif //AVS_CAPI_H
|
|
@@ -1,55 +0,0 @@
|
|||||||
// Avisynth C Interface Version 0.20
|
|
||||||
// Copyright 2003 Kevin Atkinson
|
|
||||||
|
|
||||||
// This program is free software; you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation; either version 2 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit
|
|
||||||
// http://www.gnu.org/copyleft/gpl.html .
|
|
||||||
//
|
|
||||||
// As a special exception, I give you permission to link to the
|
|
||||||
// Avisynth C interface with independent modules that communicate with
|
|
||||||
// the Avisynth C interface solely through the interfaces defined in
|
|
||||||
// avisynth_c.h, regardless of the license terms of these independent
|
|
||||||
// modules, and to copy and distribute the resulting combined work
|
|
||||||
// under terms of your choice, provided that every copy of the
|
|
||||||
// combined work is accompanied by a complete copy of the source code
|
|
||||||
// of the Avisynth C interface and Avisynth itself (with the version
|
|
||||||
// used to produce the combined work), being distributed under the
|
|
||||||
// terms of the GNU General Public License plus this exception. An
|
|
||||||
// independent module is a module which is not derived from or based
|
|
||||||
// on Avisynth C Interface, such as 3rd-party filters, import and
|
|
||||||
// export plugins, or graphical user interfaces.
|
|
||||||
|
|
||||||
#ifndef AVS_CONFIG_H
|
|
||||||
#define AVS_CONFIG_H
|
|
||||||
|
|
||||||
// Undefine this to get cdecl calling convention
|
|
||||||
#define AVSC_USE_STDCALL 1
|
|
||||||
|
|
||||||
// NOTE TO PLUGIN AUTHORS:
|
|
||||||
// Because FRAME_ALIGN can be substantially higher than the alignment
|
|
||||||
// a plugin actually needs, plugins should not use FRAME_ALIGN to check for
|
|
||||||
// alignment. They should always request the exact alignment value they need.
|
|
||||||
// This is to make sure that plugins work over the widest range of AviSynth
|
|
||||||
// builds possible.
|
|
||||||
#define FRAME_ALIGN 32
|
|
||||||
|
|
||||||
#if defined(_M_AMD64) || defined(__x86_64)
|
|
||||||
# define X86_64
|
|
||||||
#elif defined(_M_IX86) || defined(__i386__)
|
|
||||||
# define X86_32
|
|
||||||
#else
|
|
||||||
# error Unsupported CPU architecture.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif //AVS_CONFIG_H
|
|
@@ -1,51 +0,0 @@
|
|||||||
// Avisynth C Interface Version 0.20
|
|
||||||
// Copyright 2003 Kevin Atkinson
|
|
||||||
|
|
||||||
// This program is free software; you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation; either version 2 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit
|
|
||||||
// http://www.gnu.org/copyleft/gpl.html .
|
|
||||||
//
|
|
||||||
// As a special exception, I give you permission to link to the
|
|
||||||
// Avisynth C interface with independent modules that communicate with
|
|
||||||
// the Avisynth C interface solely through the interfaces defined in
|
|
||||||
// avisynth_c.h, regardless of the license terms of these independent
|
|
||||||
// modules, and to copy and distribute the resulting combined work
|
|
||||||
// under terms of your choice, provided that every copy of the
|
|
||||||
// combined work is accompanied by a complete copy of the source code
|
|
||||||
// of the Avisynth C interface and Avisynth itself (with the version
|
|
||||||
// used to produce the combined work), being distributed under the
|
|
||||||
// terms of the GNU General Public License plus this exception. An
|
|
||||||
// independent module is a module which is not derived from or based
|
|
||||||
// on Avisynth C Interface, such as 3rd-party filters, import and
|
|
||||||
// export plugins, or graphical user interfaces.
|
|
||||||
|
|
||||||
#ifndef AVS_TYPES_H
|
|
||||||
#define AVS_TYPES_H
|
|
||||||
|
|
||||||
// Define all types necessary for interfacing with avisynth.dll
|
|
||||||
|
|
||||||
// Raster types used by VirtualDub & Avisynth
|
|
||||||
typedef unsigned int Pixel32;
|
|
||||||
typedef unsigned char BYTE;
|
|
||||||
|
|
||||||
// Audio Sample information
|
|
||||||
typedef float SFLOAT;
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
typedef long long int INT64;
|
|
||||||
#else
|
|
||||||
typedef __int64 INT64;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif //AVS_TYPES_H
|
|
@@ -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; }
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
|
@@ -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
|
||||||
|
@@ -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++;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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,30 +54,36 @@ 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;
|
||||||
thread->arg = arg;
|
thread->arg = arg;
|
||||||
@@ -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"));
|
||||||
|
352
doc/APIchanges
352
doc/APIchanges
@@ -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.
|
||||||
|
@@ -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
|
||||||
|
21
doc/Makefile
21
doc/Makefile
@@ -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
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
5
doc/bootstrap.min.css
vendored
5
doc/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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.
|
||||||
|
@@ -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.
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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.
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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;
|
|
||||||
}
|
|
@@ -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");
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,185 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2012 Stefano Sabatini
|
|
||||||
* Copyright (c) 2014 Clément Bœsch
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <libavutil/motion_vector.h>
|
|
||||||
#include <libavformat/avformat.h>
|
|
||||||
|
|
||||||
static AVFormatContext *fmt_ctx = NULL;
|
|
||||||
static AVCodecContext *video_dec_ctx = NULL;
|
|
||||||
static AVStream *video_stream = NULL;
|
|
||||||
static const char *src_filename = NULL;
|
|
||||||
|
|
||||||
static int video_stream_idx = -1;
|
|
||||||
static AVFrame *frame = NULL;
|
|
||||||
static AVPacket pkt;
|
|
||||||
static int video_frame_count = 0;
|
|
||||||
|
|
||||||
static int decode_packet(int *got_frame, int cached)
|
|
||||||
{
|
|
||||||
int decoded = pkt.size;
|
|
||||||
|
|
||||||
*got_frame = 0;
|
|
||||||
|
|
||||||
if (pkt.stream_index == video_stream_idx) {
|
|
||||||
int ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt);
|
|
||||||
if (ret < 0) {
|
|
||||||
fprintf(stderr, "Error decoding video frame (%s)\n", av_err2str(ret));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*got_frame) {
|
|
||||||
int i;
|
|
||||||
AVFrameSideData *sd;
|
|
||||||
|
|
||||||
video_frame_count++;
|
|
||||||
sd = av_frame_get_side_data(frame, AV_FRAME_DATA_MOTION_VECTORS);
|
|
||||||
if (sd) {
|
|
||||||
const AVMotionVector *mvs = (const AVMotionVector *)sd->data;
|
|
||||||
for (i = 0; i < sd->size / sizeof(*mvs); i++) {
|
|
||||||
const AVMotionVector *mv = &mvs[i];
|
|
||||||
printf("%d,%2d,%2d,%2d,%4d,%4d,%4d,%4d,0x%"PRIx64"\n",
|
|
||||||
video_frame_count, mv->source,
|
|
||||||
mv->w, mv->h, mv->src_x, mv->src_y,
|
|
||||||
mv->dst_x, mv->dst_y, mv->flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return decoded;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int open_codec_context(int *stream_idx,
|
|
||||||
AVFormatContext *fmt_ctx, enum AVMediaType type)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
AVStream *st;
|
|
||||||
AVCodecContext *dec_ctx = NULL;
|
|
||||||
AVCodec *dec = NULL;
|
|
||||||
AVDictionary *opts = NULL;
|
|
||||||
|
|
||||||
ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0);
|
|
||||||
if (ret < 0) {
|
|
||||||
fprintf(stderr, "Could not find %s stream in input file '%s'\n",
|
|
||||||
av_get_media_type_string(type), src_filename);
|
|
||||||
return ret;
|
|
||||||
} else {
|
|
||||||
*stream_idx = ret;
|
|
||||||
st = fmt_ctx->streams[*stream_idx];
|
|
||||||
|
|
||||||
/* find decoder for the stream */
|
|
||||||
dec_ctx = st->codec;
|
|
||||||
dec = avcodec_find_decoder(dec_ctx->codec_id);
|
|
||||||
if (!dec) {
|
|
||||||
fprintf(stderr, "Failed to find %s codec\n",
|
|
||||||
av_get_media_type_string(type));
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Init the video decoder */
|
|
||||||
av_dict_set(&opts, "flags2", "+export_mvs", 0);
|
|
||||||
if ((ret = avcodec_open2(dec_ctx, dec, &opts)) < 0) {
|
|
||||||
fprintf(stderr, "Failed to open %s codec\n",
|
|
||||||
av_get_media_type_string(type));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
int ret = 0, got_frame;
|
|
||||||
|
|
||||||
if (argc != 2) {
|
|
||||||
fprintf(stderr, "Usage: %s <video>\n", argv[0]);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
src_filename = argv[1];
|
|
||||||
|
|
||||||
av_register_all();
|
|
||||||
|
|
||||||
if (avformat_open_input(&fmt_ctx, src_filename, NULL, NULL) < 0) {
|
|
||||||
fprintf(stderr, "Could not open source file %s\n", src_filename);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (avformat_find_stream_info(fmt_ctx, NULL) < 0) {
|
|
||||||
fprintf(stderr, "Could not find stream information\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (open_codec_context(&video_stream_idx, fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0) {
|
|
||||||
video_stream = fmt_ctx->streams[video_stream_idx];
|
|
||||||
video_dec_ctx = video_stream->codec;
|
|
||||||
}
|
|
||||||
|
|
||||||
av_dump_format(fmt_ctx, 0, src_filename, 0);
|
|
||||||
|
|
||||||
if (!video_stream) {
|
|
||||||
fprintf(stderr, "Could not find video stream in the input, aborting\n");
|
|
||||||
ret = 1;
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
frame = av_frame_alloc();
|
|
||||||
if (!frame) {
|
|
||||||
fprintf(stderr, "Could not allocate frame\n");
|
|
||||||
ret = AVERROR(ENOMEM);
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("framenum,source,blockw,blockh,srcx,srcy,dstx,dsty,flags\n");
|
|
||||||
|
|
||||||
/* initialize packet, set data to NULL, let the demuxer fill it */
|
|
||||||
av_init_packet(&pkt);
|
|
||||||
pkt.data = NULL;
|
|
||||||
pkt.size = 0;
|
|
||||||
|
|
||||||
/* read frames from the file */
|
|
||||||
while (av_read_frame(fmt_ctx, &pkt) >= 0) {
|
|
||||||
AVPacket orig_pkt = pkt;
|
|
||||||
do {
|
|
||||||
ret = decode_packet(&got_frame, 0);
|
|
||||||
if (ret < 0)
|
|
||||||
break;
|
|
||||||
pkt.data += ret;
|
|
||||||
pkt.size -= ret;
|
|
||||||
} while (pkt.size > 0);
|
|
||||||
av_free_packet(&orig_pkt);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* flush cached frames */
|
|
||||||
pkt.data = NULL;
|
|
||||||
pkt.size = 0;
|
|
||||||
do {
|
|
||||||
decode_packet(&got_frame, 1);
|
|
||||||
} while (got_frame);
|
|
||||||
|
|
||||||
end:
|
|
||||||
avcodec_close(video_dec_ctx);
|
|
||||||
avformat_close_input(&fmt_ctx);
|
|
||||||
av_frame_free(&frame);
|
|
||||||
return ret < 0;
|
|
||||||
}
|
|
@@ -45,7 +45,6 @@
|
|||||||
|
|
||||||
#include "libavutil/channel_layout.h"
|
#include "libavutil/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"
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
|
||||||
}
|
|
@@ -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) {
|
||||||
|
@@ -199,7 +199,8 @@ 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:
|
||||||
fclose(dst_file);
|
if (dst_file)
|
||||||
|
fclose(dst_file);
|
||||||
|
|
||||||
if (src_data)
|
if (src_data)
|
||||||
av_freep(&src_data[0]);
|
av_freep(&src_data[0]);
|
||||||
|
@@ -132,7 +132,8 @@ 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:
|
||||||
fclose(dst_file);
|
if (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]);
|
||||||
sws_freeContext(sws_ctx);
|
sws_freeContext(sws_ctx);
|
||||||
|
@@ -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)
|
||||||
|
@@ -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,9 +385,17 @@ 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]->codec->time_base,
|
||||||
ofmt_ctx->streams[stream_index]->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]->time_base);
|
||||||
|
|
||||||
av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n");
|
av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n");
|
||||||
/* mux encoded frame */
|
/* mux encoded frame */
|
||||||
@@ -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)
|
||||||
|
87
doc/faq.texi
87
doc/faq.texi
@@ -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?
|
||||||
|
@@ -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
|
||||||
@@ -13,36 +12,36 @@
|
|||||||
|
|
||||||
@chapter Introduction
|
@chapter Introduction
|
||||||
|
|
||||||
FATE is an extended regression suite on the client-side and a means
|
FATE is an extended regression suite on the client-side and a means
|
||||||
for results aggregation and presentation on the server-side.
|
for results aggregation and presentation on the server-side.
|
||||||
|
|
||||||
The first part of this document explains how you can use FATE from
|
The first part of this document explains how you can use FATE from
|
||||||
your FFmpeg source directory to test your ffmpeg binary. The second
|
your FFmpeg source directory to test your ffmpeg binary. The second
|
||||||
part describes how you can run FATE to submit the results to FFmpeg's
|
part describes how you can run FATE to submit the results to FFmpeg's
|
||||||
FATE server.
|
FATE server.
|
||||||
|
|
||||||
In any way you can have a look at the publicly viewable FATE results
|
In any way you can have a look at the publicly viewable FATE results
|
||||||
by visiting this website:
|
by visiting this website:
|
||||||
|
|
||||||
@url{http://fate.ffmpeg.org/}
|
@url{http://fate.ffmpeg.org/}
|
||||||
|
|
||||||
This is especially recommended for all people contributing source
|
This is especially recommended for all people contributing source
|
||||||
code to FFmpeg, as it can be seen if some test on some platform broke
|
code to FFmpeg, as it can be seen if some test on some platform broke
|
||||||
with their recent contribution. This usually happens on the platforms
|
with their recent contribution. This usually happens on the platforms
|
||||||
the developers could not test on.
|
the developers could not test on.
|
||||||
|
|
||||||
The second part of this document describes how you can run FATE to
|
The second part of this document describes how you can run FATE to
|
||||||
submit your results to FFmpeg's FATE server. If you want to submit your
|
submit your results to FFmpeg's FATE server. If you want to submit your
|
||||||
results be sure to check that your combination of CPU, OS and compiler
|
results be sure to check that your combination of CPU, OS and compiler
|
||||||
is not already listed on the above mentioned website.
|
is not already listed on the above mentioned website.
|
||||||
|
|
||||||
In the third part you can find a comprehensive listing of FATE makefile
|
In the third part you can find a comprehensive listing of FATE makefile
|
||||||
targets and variables.
|
targets and variables.
|
||||||
|
|
||||||
|
|
||||||
@chapter Using FATE from your FFmpeg source directory
|
@chapter Using FATE from your FFmpeg source directory
|
||||||
|
|
||||||
If you want to run FATE on your machine you need to have the samples
|
If you want to run FATE on your machine you need to have the samples
|
||||||
in place. You can get the samples via the build target fate-rsync.
|
in place. You can get the samples via the build target fate-rsync.
|
||||||
Use this command from the top-level source directory:
|
Use this command from the top-level source directory:
|
||||||
|
|
||||||
@@ -51,11 +50,11 @@ make fate-rsync SAMPLES=fate-suite/
|
|||||||
make fate SAMPLES=fate-suite/
|
make fate SAMPLES=fate-suite/
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
The above commands set the samples location by passing a makefile
|
The above commands set the samples location by passing a makefile
|
||||||
variable via command line. It is also possible to set the samples
|
variable via command line. It is also possible to set the samples
|
||||||
location at source configuration time by invoking configure with
|
location at source configuration time by invoking configure with
|
||||||
@option{--samples=<path to the samples directory>}. Afterwards you can
|
`--samples=<path to the samples directory>'. Afterwards you can
|
||||||
invoke the makefile targets without setting the @var{SAMPLES} makefile
|
invoke the makefile targets without setting the SAMPLES makefile
|
||||||
variable. This is illustrated by the following commands:
|
variable. This is illustrated by the following commands:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
@@ -64,7 +63,7 @@ make fate-rsync
|
|||||||
make fate
|
make fate
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Yet another way to tell FATE about the location of the sample
|
Yet another way to tell FATE about the location of the sample
|
||||||
directory is by making sure the environment variable FATE_SAMPLES
|
directory is by making sure the environment variable FATE_SAMPLES
|
||||||
contains the path to your samples directory. This can be achieved
|
contains the path to your samples directory. This can be achieved
|
||||||
by e.g. putting that variable in your shell profile or by setting
|
by e.g. putting that variable in your shell profile or by setting
|
||||||
@@ -85,7 +84,7 @@ To use a custom wrapper to run the test, pass @option{--target-exec} to
|
|||||||
|
|
||||||
@chapter Submitting the results to the FFmpeg result aggregation server
|
@chapter Submitting the results to the FFmpeg result aggregation server
|
||||||
|
|
||||||
To submit your results to the server you should run fate through the
|
To submit your results to the server you should run fate through the
|
||||||
shell script @file{tests/fate.sh} from the FFmpeg sources. This script needs
|
shell script @file{tests/fate.sh} from the FFmpeg sources. This script needs
|
||||||
to be invoked with a configuration file as its first argument.
|
to be invoked with a configuration file as its first argument.
|
||||||
|
|
||||||
@@ -93,23 +92,23 @@ to be invoked with a configuration file as its first argument.
|
|||||||
tests/fate.sh /path/to/fate_config
|
tests/fate.sh /path/to/fate_config
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
A configuration file template with comments describing the individual
|
A configuration file template with comments describing the individual
|
||||||
configuration variables can be found at @file{doc/fate_config.sh.template}.
|
configuration variables can be found at @file{doc/fate_config.sh.template}.
|
||||||
|
|
||||||
@ifhtml
|
@ifhtml
|
||||||
The mentioned configuration template is also available here:
|
The mentioned configuration template is also available here:
|
||||||
@verbatiminclude fate_config.sh.template
|
@verbatiminclude fate_config.sh.template
|
||||||
@end ifhtml
|
@end ifhtml
|
||||||
|
|
||||||
Create a configuration that suits your needs, based on the configuration
|
Create a configuration that suits your needs, based on the configuration
|
||||||
template. The @env{slot} configuration variable can be any string that is not
|
template. The `slot' configuration variable can be any string that is not
|
||||||
yet used, but it is suggested that you name it adhering to the following
|
yet used, but it is suggested that you name it adhering to the following
|
||||||
pattern @samp{@var{arch}-@var{os}-@var{compiler}-@var{compiler version}}. The
|
pattern <arch>-<os>-<compiler>-<compiler version>. The configuration file
|
||||||
configuration file itself will be sourced in a shell script, therefore all
|
itself will be sourced in a shell script, therefore all shell features may
|
||||||
shell features may be used. This enables you to setup the environment as you
|
be used. This enables you to setup the environment as you need it for your
|
||||||
need it for your build.
|
build.
|
||||||
|
|
||||||
For your first test runs the @env{fate_recv} variable should be empty or
|
For your first test runs the `fate_recv' variable should be empty or
|
||||||
commented out. This will run everything as normal except that it will omit
|
commented out. This will run everything as normal except that it will omit
|
||||||
the submission of the results to the server. The following files should be
|
the submission of the results to the server. The following files should be
|
||||||
present in $workdir as specified in the configuration file:
|
present in $workdir as specified in the configuration file:
|
||||||
@@ -122,29 +121,29 @@ present in $workdir as specified in the configuration file:
|
|||||||
@item version
|
@item version
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
When you have everything working properly you can create an SSH key pair
|
When you have everything working properly you can create an SSH key pair
|
||||||
and send the public key to the FATE server administrator who can be contacted
|
and send the public key to the FATE server administrator who can be contacted
|
||||||
at the email address @email{fate-admin@@ffmpeg.org}.
|
at the email address @email{fate-admin@@ffmpeg.org}.
|
||||||
|
|
||||||
Configure your SSH client to use public key authentication with that key
|
Configure your SSH client to use public key authentication with that key
|
||||||
when connecting to the FATE server. Also do not forget to check the identity
|
when connecting to the FATE server. Also do not forget to check the identity
|
||||||
of the server and to accept its host key. This can usually be achieved by
|
of the server and to accept its host key. This can usually be achieved by
|
||||||
running your SSH client manually and killing it after you accepted the key.
|
running your SSH client manually and killing it after you accepted the key.
|
||||||
The FATE server's fingerprint is:
|
The FATE server's fingerprint is:
|
||||||
|
|
||||||
@table @samp
|
@table @option
|
||||||
@item RSA
|
@item RSA
|
||||||
d3:f1:83:97:a4:75:2b:a6:fb:d6:e8:aa:81:93:97:51
|
d3:f1:83:97:a4:75:2b:a6:fb:d6:e8:aa:81:93:97:51
|
||||||
@item ECDSA
|
@item ECDSA
|
||||||
76:9f:68:32:04:1e:d5:d4:ec:47:3f:dc:fc:18:17:86
|
76:9f:68:32:04:1e:d5:d4:ec:47:3f:dc:fc:18:17:86
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
If you have problems connecting to the FATE server, it may help to try out
|
If you have problems connecting to the FATE server, it may help to try out
|
||||||
the @command{ssh} command with one or more @option{-v} options. You should
|
the @command{ssh} command with one or more @option{-v} options. You should
|
||||||
get detailed output concerning your SSH configuration and the authentication
|
get detailed output concerning your SSH configuration and the authentication
|
||||||
process.
|
process.
|
||||||
|
|
||||||
The only thing left is to automate the execution of the fate.sh script and
|
The only thing left is to automate the execution of the fate.sh script and
|
||||||
the synchronisation of the samples directory.
|
the synchronisation of the samples directory.
|
||||||
|
|
||||||
|
|
||||||
@@ -165,7 +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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
132
doc/ffmpeg.texi
132
doc/ffmpeg.texi
@@ -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:
|
||||||
|
@@ -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
|
||||||
|
@@ -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.
|
||||||
|
|
||||||
|
@@ -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>
|
||||||
|
@@ -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)
|
||||||
|
@@ -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.
|
||||||
|
@@ -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
|
||||||
|
1689
doc/filters.texi
1689
doc/filters.texi
File diff suppressed because it is too large
Load Diff
@@ -23,7 +23,7 @@ Reduce buffering.
|
|||||||
|
|
||||||
@item probesize @var{integer} (@emph{input})
|
@item probesize @var{integer} (@emph{input})
|
||||||
Set probing size in bytes, i.e. the size of the data to analyze to get
|
Set probing size in bytes, i.e. the size of the data to analyze to get
|
||||||
stream information. A higher value will enable detecting more
|
stream information. A higher value will allow to detect more
|
||||||
information in case it is dispersed into the stream, but will increase
|
information in case it is dispersed into the stream, but will increase
|
||||||
latency. Must be an integer not lesser than 32. It is 5000000 by default.
|
latency. Must be an integer not lesser than 32. It is 5000000 by default.
|
||||||
|
|
||||||
@@ -37,8 +37,6 @@ Possible values:
|
|||||||
@table @samp
|
@table @samp
|
||||||
@item ignidx
|
@item ignidx
|
||||||
Ignore index.
|
Ignore index.
|
||||||
@item fastseek
|
|
||||||
Enable fast, but inaccurate seeks for some formats.
|
|
||||||
@item genpts
|
@item genpts
|
||||||
Generate PTS.
|
Generate PTS.
|
||||||
@item nofillin
|
@item nofillin
|
||||||
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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>
|
||||||
|
361
doc/indevs.texi
361
doc/indevs.texi
@@ -1,7 +1,7 @@
|
|||||||
@chapter Input Devices
|
@chapter Input Devices
|
||||||
@c man begin INPUT DEVICES
|
@c man begin INPUT DEVICES
|
||||||
|
|
||||||
Input devices are configured elements in FFmpeg which enable accessing
|
Input devices are configured elements in FFmpeg which allow to access
|
||||||
the data coming from a multimedia device attached to your system.
|
the data coming from a multimedia device attached to your system.
|
||||||
|
|
||||||
When you configure your FFmpeg build, all the supported input devices
|
When you configure your FFmpeg build, all the supported input devices
|
||||||
@@ -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
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
\input texinfo @c -*- texinfo -*-
|
\input texinfo @c -*- texinfo -*-
|
||||||
@documentencoding UTF-8
|
|
||||||
|
|
||||||
@settitle Libavcodec Documentation
|
@settitle Libavcodec Documentation
|
||||||
@titlepage
|
@titlepage
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
\input texinfo @c -*- texinfo -*-
|
\input texinfo @c -*- texinfo -*-
|
||||||
@documentencoding UTF-8
|
|
||||||
|
|
||||||
@settitle Libavdevice Documentation
|
@settitle Libavdevice Documentation
|
||||||
@titlepage
|
@titlepage
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
\input texinfo @c -*- texinfo -*-
|
\input texinfo @c -*- texinfo -*-
|
||||||
@documentencoding UTF-8
|
|
||||||
|
|
||||||
@settitle Libavfilter Documentation
|
@settitle Libavfilter Documentation
|
||||||
@titlepage
|
@titlepage
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
\input texinfo @c -*- texinfo -*-
|
\input texinfo @c -*- texinfo -*-
|
||||||
@documentencoding UTF-8
|
|
||||||
|
|
||||||
@settitle Libavformat Documentation
|
@settitle Libavformat Documentation
|
||||||
@titlepage
|
@titlepage
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
\input texinfo @c -*- texinfo -*-
|
\input texinfo @c -*- texinfo -*-
|
||||||
@documentencoding UTF-8
|
|
||||||
|
|
||||||
@settitle Libavutil Documentation
|
@settitle Libavutil Documentation
|
||||||
@titlepage
|
@titlepage
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
\input texinfo @c -*- texinfo -*-
|
\input texinfo @c -*- texinfo -*-
|
||||||
@documentencoding UTF-8
|
|
||||||
|
|
||||||
@settitle Libswresample Documentation
|
@settitle Libswresample Documentation
|
||||||
@titlepage
|
@titlepage
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
\input texinfo @c -*- texinfo -*-
|
\input texinfo @c -*- texinfo -*-
|
||||||
@documentencoding UTF-8
|
|
||||||
|
|
||||||
@settitle Libswscale Documentation
|
@settitle Libswscale Documentation
|
||||||
@titlepage
|
@titlepage
|
||||||
|
@@ -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:
|
||||||
|
257
doc/muxers.texi
257
doc/muxers.texi
@@ -194,19 +194,15 @@ can not be smaller than one centi second.
|
|||||||
Apple HTTP Live Streaming muxer that segments MPEG-TS according to
|
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
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
\input texinfo @c -*- texinfo -*-
|
\input texinfo @c -*- texinfo -*-
|
||||||
@documentencoding UTF-8
|
|
||||||
|
|
||||||
@settitle NUT
|
@settitle NUT
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
@@ -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
|
||||||
|
@@ -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"
|
||||||
|
@@ -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
|
||||||
|
@@ -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
23
doc/style.min.css
vendored
File diff suppressed because one or more lines are too long
59
doc/t2h.init
59
doc/t2h.init
@@ -1,35 +1,26 @@
|
|||||||
# Init file for texi2html.
|
|
||||||
|
|
||||||
# This is deprecated, and the makeinfo/texi2any version is doc/t2h.pm
|
|
||||||
|
|
||||||
# no horiz rules between sections
|
# 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;
|
||||||
</head>
|
<link rel="icon" href="favicon.png" type="image/png" />
|
||||||
<body>
|
</head>
|
||||||
<div style="width: 95%; margin: auto">
|
<body>
|
||||||
|
<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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
339
doc/t2h.pm
339
doc/t2h.pm
@@ -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;
|
|
@@ -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}) {
|
||||||
|
@@ -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.
|
||||||
|
@@ -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
Reference in New Issue
Block a user