diff options
Diffstat (limited to 'doc')
56 files changed, 9921 insertions, 1681 deletions
diff --git a/doc/APIchanges b/doc/APIchanges index 24defe4..fd38aa0 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -7,12 +7,103 @@ libavdevice: 2011-04-18 libavfilter: 2012-06-22 libavformat: 2012-01-27 libavresample: 2012-10-05 +libpostproc: 2011-04-18 +libswresample: 2011-09-19 libswscale: 2011-06-20 libavutil: 2012-10-22 API changes, most recent first: +2012-10-21 - xxxxxxx - lavc 54.68.100 - avcodec.h + lavfi 3.20.100 - avfilter.h + Add AV_PKT_DATA_STRINGS_METADATA side data type, used to transmit key/value + strings between AVPacket and AVFrame, and add metadata field to + AVCodecContext (which shall not be accessed by users; see AVFrame metadata + instead). + +2012-09-27 - a70b493 - lavd 54.3.100 - version.h + Add LIBAVDEVICE_IDENT symbol. + +2012-09-27 - a70b493 - lavfi 3.18.100 - version.h + Add LIBAVFILTER_IDENT symbol. + +2012-09-27 - a70b493 - libswr 0.16.100 - version.h + Add LIBSWRESAMPLE_VERSION, LIBSWRESAMPLE_BUILD + and LIBSWRESAMPLE_IDENT symbols. + +2012-09-06 - 29e972f - lavu 51.72.100 - parseutils.h + Add av_small_strptime() time parsing function. + + Can be used as a stripped-down replacement for strptime(), on + systems which do not support it. + +2012-08-25 - 2626cc4 - lavf 54.28.100 + Matroska demuxer now identifies SRT subtitles as AV_CODEC_ID_SUBRIP instead + of AV_CODEC_ID_TEXT. + +2012-08-13 - 5c0d8bc - lavfi 3.8.100 - avfilter.h + Add avfilter_get_class() function, and priv_class field to AVFilter + struct. + +2012-08-12 - a25346e - lavu 51.69.100 - opt.h + Add AV_OPT_FLAG_FILTERING_PARAM symbol in opt.h. + +2012-07-31 - 23fc4dd - lavc 54.46.100 + Add channels field to AVFrame. + +2012-07-30 - f893904 - lavu 51.66.100 + Add av_get_channel_description() + and av_get_standard_channel_layout() functions. + +2012-07-21 - 016a472 - lavc 54.43.100 + Add decode_error_flags field to AVFrame. + +2012-07-20 - b062936 - lavf 54.18.100 + Add avformat_match_stream_specifier() function. + +2012-07-14 - f49ec1b - lavc 54.38.100 - avcodec.h + Add metadata to AVFrame, and the accessor functions + av_frame_get_metadata() and av_frame_set_metadata(). + +2012-07-10 - 0e003d8 - lavc 54.33.100 + Add av_fast_padded_mallocz(). + +2012-07-10 - 21d5609 - lavfi 3.2.0 - avfilter.h + Add init_opaque() callback to AVFilter struct. + +2012-06-26 - e6674e4 - lavu 51.63.100 - imgutils.h + Add functions to libavutil/imgutils.h: + av_image_get_buffer_size() + av_image_fill_arrays() + av_image_copy_to_buffer() + +2012-06-24 - c41899a - lavu 51.62.100 - version.h + version moved from avutil.h to version.h + +2012-04-11 - 359abb1 - lavu 51.58.100 - error.h + Add av_make_error_string() and av_err2str() utilities to + libavutil/error.h. + +2012-06-05 - 62b39d4 - lavc 54.24.100 + Add pkt_duration field to AVFrame. + +2012-05-24 - f2ee065 - lavu 51.54.100 + Move AVPALETTE_SIZE and AVPALETTE_COUNT macros from + libavcodec/avcodec.h to libavutil/pixfmt.h. + +2012-05-14 - 94a9ac1 - lavf 54.5.100 + Add av_guess_sample_aspect_ratio() function. + +2012-04-20 - 65fa7bc - lavfi 2.70.100 + Add avfilter_unref_bufferp() to avfilter.h. + +2012-04-13 - 162e400 - lavfi 2.68.100 + Install libavfilter/asrc_abuffer.h public header. + +2012-03-26 - a67d9cf - lavfi 2.66.100 + Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions. + 2012-10-18 - xxxxxxx - lavu 51.45.0 - error.h Add AVERROR_EXPERIMENTAL @@ -65,10 +156,6 @@ API changes, most recent first: 51efed1 - Add AVCodecDescriptor.props and AV_CODEC_PROP_INTRA_ONLY. 91e59fe - Add avcodec_descriptor_get_by_name(). - -2012-08-08 - 1d9c2dc - lavu 51.39 - avutil.h - Don't implicitly include libavutil/common.h in avutil.h - 2012-08-08 - 987170c - lavu 51.38 - dict.h Add av_dict_count(). @@ -87,9 +174,6 @@ API changes, most recent first: 2012-07-29 - 681ed00 - lavf 54.13.0 - avformat.h Add AVFMT_FLAG_NOBUFFER for low latency use cases. -2012-07-20 - b70d89a - lavfi 3.0.0 - avfilter.h - Add avfilter_unref_bufferp(). - 2012-07-10 - 5fade8a - lavu 51.37.0 Add av_malloc_array() and av_mallocz_array() @@ -118,10 +202,6 @@ API changes, most recent first: 2012-05-25 - 154486f - lavu 51.31.0 - opt.h Add av_opt_set_bin() -2012-05-26 - e9cef89 - lavf 54.3.0 - Add AVFMT_TS_NONSTRICT format flag to indicate that a muxer supports - non-increasing monotone timestamps. - 2012-05-15 - lavfi 2.17.0 Add support for audio filters ac71230/a2cd9be - add video/audio buffer sink in a new installed @@ -168,16 +248,34 @@ API changes, most recent first: 2012-04-14 - lavfi 2.16.0 - avfiltergraph.h d7bcc71 Add avfilter_graph_parse2(). - 91d3cbe Add avfilter_inout_alloc() and avfilter_inout_free(). 2012-04-08 - 4d693b0 - lavu 51.27.0 - samplefmt.h Add av_get_packed_sample_fmt() and av_get_planar_sample_fmt() -2012-04-05 - 5cc51a5 - lavu 51.26.0 - audioconvert.h - Add av_get_default_channel_layout() +2012-03-21 - b75c67d - lavu 51.43.100 + Add bprint.h for bprint API. + +2012-02-21 - 9cbf17e - lavc 54.4.100 + Add av_get_pcm_codec() function. + +2012-02-16 - 560b224 - libswr 0.7.100 + Add swr_set_matrix() function. + +2012-02-09 - c28e7af - lavu 51.39.100 + Add a new installed header libavutil/timestamp.h with timestamp + utilities. + +2012-02-06 - 70ffda3 - lavu 51.38.100 + Add av_parse_ratio() function to parseutils.h. -2012-03-06 - 4d851f8 - lavu 51.25.0 - cpu.h - Add av_set_cpu_flags_mask(). +2012-02-06 - 70ffda3 - lavu 51.38.100 + Add AV_LOG_MAX_OFFSET macro to log.h. + +2012-02-02 - 0eaa123 - lavu 51.37.100 + Add public timecode helpers. + +2012-01-24 - 0c3577b - lavfi 2.60.100 + Add avfilter_graph_dump. 2012-03-05 - lavc 54.8.0 6699d07 Add av_get_exact_bits_per_sample() @@ -233,10 +331,6 @@ API changes, most recent first: muxers supporting it (av_write_frame makes sure it is called only for muxers with this flag). -------------------------------8<------------------------------------- - 0.8 branch was cut here ------------------------------>8-------------------------------------- - 2012-01-15 - lavc 53.34.0 New audio encoding API: b2c75b6 Add CODEC_CAP_VARIABLE_FRAME_SIZE capability for use by audio @@ -248,22 +342,26 @@ API changes, most recent first: 2012-01-12 - 3167dc9 - lavfi 2.15.0 Add a new installed header -- libavfilter/version.h -- with version macros. -2011-01-03 - b73ec05 - lavu 51.21.0 - Add av_popcount64 +2011-12-08 - a502939 - lavfi 2.52.0 + Add av_buffersink_poll_frame() to buffersink.h. + +2011-12-08 - 26c6fec - lavu 51.31.0 + Add av_log_format_line. + +2011-12-03 - 976b095 - lavu 51.30.0 + Add AVERROR_BUG. + +2011-11-24 - 573ffbb - lavu 51.28.1 + Add av_get_alt_sample_fmt() to samplefmt.h. + +2011-11-03 - 96949da - lavu 51.23.0 + Add av_strcasecmp() and av_strncasecmp() to avstring.h. -2011-12-25 - lavfi 2.14.0 - e1d9dbf Add a new installed header - buffersrc.h - It contains a new function av_buffersrc_buffer() that allows passing - frames to the 'buffer' filter, but unlike av_vsrc_buffer_add_frame() - it allows for direct rendering. - 1c9e340 Add avfilter_copy_frame_props() for copying properties from - AVFrame to AVFilterBufferRef. +2011-10-20 - b35e9e1 - lavu 51.22.0 + Add av_strtok() to avstring.h. -2011-12-25 - lavc 53.31.0 - Add the following new fields to AVFrame: - b58dbb5 sample_aspect_ratio - 3a2ddf7 width, height - 8a4a5f6 format +2011-01-03 - b73ec05 - lavu 51.21.0 + Add av_popcount64 2011-12-18 - 8400b12 - lavc 53.28.1 Deprecate AVFrame.age. The field is unused. @@ -351,49 +449,134 @@ API changes, most recent first: - 641c7af new functions - av_opt_child_next, av_opt_child_class_next and av_opt_find2() -2011-09-03 - fb4ca26 - lavc 53.10.0 - lavf 53.6.0 +2011-09-22 - a70e787 - lavu 51.17.0 + Add av_x_if_null(). + +2011-09-18 - 645cebb - lavc 53.16.0 + Add showall flag2 + +2011-09-16 - ea8de10 - lavfi 2.42.0 + Add avfilter_all_channel_layouts. + +2011-09-16 - 9899037 - lavfi 2.41.0 + Rename avfilter_all_* function names to avfilter_make_all_*. + + In particular, apply the renames: + avfilter_all_formats -> avfilter_make_all_formats + avfilter_all_channel_layouts -> avfilter_make_all_channel_layouts + avfilter_all_packing_formats -> avfilter_make_all_packing_formats + +2011-09-12 - 4381bdd - lavfi 2.40.0 + Change AVFilterBufferRefAudioProps.sample_rate type from uint32_t to int. + +2011-09-12 - 2c03174 - lavfi 2.40.0 + Simplify signature for avfilter_get_audio_buffer(), make it + consistent with avfilter_get_video_buffer(). + +2011-09-06 - 4f7dfe1 - lavfi 2.39.0 + Rename libavfilter/vsink_buffer.h to libavfilter/buffersink.h. + +2011-09-06 - c4415f6 - lavfi 2.38.0 + Unify video and audio sink API. + + In particular, add av_buffersink_get_buffer_ref(), deprecate + av_vsink_buffer_get_video_buffer_ref() and change the value for the + opaque field passed to the abuffersink init function. + +2011-09-04 - 61e2e29 - lavu 51.16.0 + Add av_asprintf(). + +2011-08-22 - dacd827 - lavf 53.10.0 + Add av_find_program_from_stream(). + +2011-08-20 - 69e2c1a - lavu 51.13.0 + Add av_get_media_type_string(). + +2011-09-03 - fb4ca26 - lavc 53.13.0 + lavf 53.11.0 lsws 2.1.0 Add {avcodec,avformat,sws}_get_class(). -2011-09-03 - c11fb82 - lavu 51.10.0 +2011-08-03 - c11fb82 - lavu 51.15.0 Add AV_OPT_SEARCH_FAKE_OBJ flag for av_opt_find() function. +2011-08-14 - 323b930 - lavu 51.12.0 + Add av_fifo_peek2(), deprecate av_fifo_peek(). + 2011-08-26 - lavu 51.9.0 - - f2011ed Add av_fifo_peek2(), deprecate av_fifo_peek(). - add41de..abc78a5 Do not include intfloat_readwrite.h, mathematics.h, rational.h, pixfmt.h, or log.h from avutil.h. -2011-08-16 - 48f9e45 - lavf 53.4.0 +2011-08-16 - 48f9e45 - lavf 53.8.0 Add avformat_query_codec(). -2011-08-16 - bca06e7 - lavc 53.8.0 +2011-08-16 - bca06e7 - lavc 53.11.0 Add avcodec_get_type(). -2011-08-06 - 2f63440 - lavf 53.4.0 +2011-08-06 - 2f63440 - lavf 53.7.0 Add error_recognition to AVFormatContext. -2011-08-02 - 9d39cbf - lavc 53.7.1 +2011-08-02 - 9d39cbf - lavc 53.9.1 Add AV_PKT_FLAG_CORRUPT AVPacket flag. -2011-07-10 - a67c061 - lavf 53.3.0 +2011-07-16 - b57df29 - lavfi 2.27.0 + Add audio packing negotiation fields and helper functions. + + In particular, add AVFilterPacking enum, planar, in_packings and + out_packings fields to AVFilterLink, and the functions: + avfilter_set_common_packing_formats() + avfilter_all_packing_formats() + +2011-07-10 - a67c061 - lavf 53.6.0 Add avformat_find_stream_info(), deprecate av_find_stream_info(). NOTE: this was backported to 0.7 -2011-07-10 - 0b950fe - lavc 53.6.0 +2011-07-10 - 0b950fe - lavc 53.8.0 Add avcodec_open2(), deprecate avcodec_open(). NOTE: this was backported to 0.7 Add avcodec_alloc_context3. Deprecate avcodec_alloc_context() and avcodec_alloc_context2(). +2011-07-01 - b442ca6 - lavf 53.5.0 - avformat.h + Add function av_get_output_timestamp(). + +2011-06-28 - 5129336 - lavu 51.11.0 - avutil.h + Define the AV_PICTURE_TYPE_NONE value in AVPictureType enum. + +2011-06-19 - fd2c0a5 - lavfi 2.23.0 - avfilter.h + Add layout negotiation fields and helper functions. + + In particular, add in_chlayouts and out_chlayouts to AVFilterLink, + and the functions: + avfilter_set_common_sample_formats() + avfilter_set_common_channel_layouts() + avfilter_all_channel_layouts() + +2011-06-19 - 527ca39 - lavfi 2.22.0 - AVFilterFormats + Change type of AVFilterFormats.formats from int * to int64_t *, + and update formats handling API accordingly. + + avfilter_make_format_list() still takes a int32_t array and converts + it to int64_t. A new function, avfilter_make_format64_list(), that + takes int64_t arrays has been added. + +2011-06-19 - 44f669e - lavfi 2.21.0 - vsink_buffer.h + Add video sink buffer and vsink_buffer.h public header. + +2011-06-12 - 9fdf772 - lavfi 2.18.0 - avcodec.h + Add avfilter_get_video_buffer_ref_from_frame() function in + libavfilter/avcodec.h. + +2011-06-12 - c535494 - lavfi 2.17.0 - avfiltergraph.h + Add avfilter_inout_alloc() and avfilter_inout_free() functions. + +2011-06-12 - 6119b23 - lavfi 2.16.0 - avfilter_graph_parse() + Change avfilter_graph_parse() signature. + 2011-06-23 - 67e9ae1 - lavu 51.8.0 - attributes.h Add av_printf_format(). -------------------------------8<------------------------------------- - 0.7 branch was cut here ------------------------------>8-------------------------------------- - 2011-06-16 - 05e84c9, 25de595 - lavf 53.2.0 - avformat.h Add avformat_open_input and avformat_write_header(). Deprecate av_open_input_stream, av_open_input_file, @@ -407,34 +590,97 @@ API changes, most recent first: 2011-06-10 - cb7c11c - lavu 51.6.0 - opt.h Add av_opt_flag_is_set(). -2011-06-08 - d9f80ea - lavu 51.5.0 - AVMetadata +2011-06-10 - c381960 - lavfi 2.15.0 - avfilter_get_audio_buffer_ref_from_arrays + Add avfilter_get_audio_buffer_ref_from_arrays() to avfilter.h. + +2011-06-09 - d9f80ea - lavu 51.8.0 - AVMetadata Move AVMetadata from lavf to lavu and rename it to AVDictionary -- new installed header dict.h. All av_metadata_* functions renamed to av_dict_*. -2011-06-07 - a6703fa - lavu 51.4.0 - av_get_bytes_per_sample() +2011-06-07 - a6703fa - lavu 51.8.0 - av_get_bytes_per_sample() Add av_get_bytes_per_sample() in libavutil/samplefmt.h. Deprecate av_get_bits_per_sample_fmt(). -2011-06-05 - b39b062 - lavu 51.3.0 - opt.h +2011-06-05 - b39b062 - lavu 51.8.0 - opt.h Add av_opt_free convenience function. -2011-05-28 - 0420bd7 - lavu 51.2.0 - pixdesc.h +2011-06-06 - 95a0242 - lavfi 2.14.0 - AVFilterBufferRefAudioProps + Remove AVFilterBufferRefAudioProps.size, and use nb_samples in + avfilter_get_audio_buffer() and avfilter_default_get_audio_buffer() in + place of size. + +2011-06-06 - 0bc2cca - lavu 51.6.0 - av_samples_alloc() + Switch nb_channels and nb_samples parameters order in + av_samples_alloc(). + +2011-06-06 - e1c7414 - lavu 51.5.0 - av_samples_* + Change the data layout created by av_samples_fill_arrays() and + av_samples_alloc(). + +2011-06-06 - 27bcf55 - lavfi 2.13.0 - vsrc_buffer.h + Make av_vsrc_buffer_add_video_buffer_ref() accepts an additional + flags parameter in input. + +2011-06-03 - e977ca2 - lavfi 2.12.0 - avfilter_link_free() + Add avfilter_link_free() function. + +2011-06-02 - 5ad38d9 - lavu 51.4.0 - av_force_cpu_flags() + Add av_cpu_flags() in libavutil/cpu.h. + +2011-05-28 - e71f260 - lavu 51.3.0 - pixdesc.h Add av_get_pix_fmt_name() in libavutil/pixdesc.h, and deprecate avcodec_get_pix_fmt_name() in libavcodec/avcodec.h in its favor. -2011-05-25 - 30315a8 - lavf 53.1.0 - avformat.h +2011-05-25 - 30315a8 - lavf 53.3.0 - avformat.h Add fps_probe_size to AVFormatContext. -2011-05-18 - 64150ff - lavc 53.4.0 - AVCodecContext.request_sample_fmt +2011-05-22 - 5ecdfd0 - lavf 53.2.0 - avformat.h + Introduce avformat_alloc_output_context2() and deprecate + avformat_alloc_output_context(). + +2011-05-22 - 83db719 - lavfi 2.10.0 - vsrc_buffer.h + Make libavfilter/vsrc_buffer.h public. + +2011-05-19 - c000a9f - lavfi 2.8.0 - avcodec.h + Add av_vsrc_buffer_add_frame() to libavfilter/avcodec.h. + +2011-05-14 - 9fdf772 - lavfi 2.6.0 - avcodec.h + Add avfilter_get_video_buffer_ref_from_frame() to libavfilter/avcodec.h. + +2011-05-18 - 64150ff - lavc 53.7.0 - AVCodecContext.request_sample_fmt Add request_sample_fmt field to AVCodecContext. -2011-05-10 - 188dea1 - lavc 53.3.0 - avcodec.h +2011-05-10 - 188dea1 - lavc 53.6.0 - avcodec.h Deprecate AVLPCType and the following fields in AVCodecContext: lpc_coeff_precision, prediction_order_method, min_partition_order, max_partition_order, lpc_type, lpc_passes. Corresponding FLAC encoder options should be used instead. +2011-05-07 - 9fdf772 - lavfi 2.5.0 - avcodec.h + Add libavfilter/avcodec.h header and avfilter_copy_frame_props() + function. + +2011-05-07 - 18ded93 - lavc 53.5.0 - AVFrame + Add format field to AVFrame. + +2011-05-07 - 22333a6 - lavc 53.4.0 - AVFrame + Add width and height fields to AVFrame. + +2011-05-01 - 35fe66a - lavfi 2.4.0 - avfilter.h + Rename AVFilterBufferRefVideoProps.pixel_aspect to + sample_aspect_ratio. + +2011-05-01 - 77e9dee - lavc 53.3.0 - AVFrame + Add a sample_aspect_ratio field to AVFrame. + +2011-05-01 - 1ba5727 - lavc 53.2.0 - AVFrame + Add a pkt_pos field to AVFrame. + +2011-04-29 - 35ceaa7 - lavu 51.2.0 - mem.h + Add av_dynarray_add function for adding + an element to a dynamic array. + 2011-04-26 - bebe72f - lavu 51.1.0 - avutil.h Add AVPictureType enum and av_get_picture_type_char(), deprecate FF_*_TYPE defines and av_get_pict_type_char() defined in @@ -486,9 +732,6 @@ API changes, most recent first: 333e894 deprecate url_open_protocol e230705 deprecate url_poll and URLPollEntry -2011-04-10 - lavu 50.40.0 - pixfmt.h - Add PIX_FMT_BGR48LE and PIX_FMT_BGR48BE pixel formats - 2011-04-08 - lavf 52.106.0 - avformat.h Minor avformat.h cleanup: a9bf9d8 deprecate av_guess_image2_codec @@ -513,7 +756,6 @@ API changes, most recent first: d9d86e0 rename url_fprintf -> avio_printf 59f65d9 deprecate url_setbufsize 3e68b3b deprecate url_ferror - 66e5b1d deprecate url_feof e8bb2e2 deprecate url_fget_max_packet_size 76aa876 rename url_fsize -> avio_size e519753 deprecate url_fgetc @@ -537,6 +779,9 @@ API changes, most recent first: 2011-03-25 - 34b47d7 - lavc 52.115.0 - AVCodecContext.audio_service_type Add audio_service_type field to AVCodecContext. +2011-03-17 - e309fdc - lavu 50.40.0 - pixfmt.h + Add PIX_FMT_BGR48LE and PIX_FMT_BGR48BE pixel formats + 2011-03-02 - 863c471 - lavf 52.103.0 - av_pkt_dump2, av_pkt_dump_log2 Add new functions av_pkt_dump2, av_pkt_dump_log2 that uses the source stream timebase for outputting timestamps. Deprecate @@ -603,6 +848,12 @@ API changes, most recent first: 2011-02-02 - dfd2a00 - lavu 50.37.0 - log.h Make av_dlog public. +2011-01-31 - 7b3ea55 - lavfi 1.76.0 - vsrc_buffer + Add sample_aspect_ratio fields to vsrc_buffer arguments + +2011-01-31 - 910b5b8 - lavfi 1.75.0 - AVFilterLink sample_aspect_ratio + Add sample_aspect_ratio field to AVFilterLink. + 2011-01-15 - a242ac3 - lavfi 1.74.0 - AVFilterBufferRefAudioProps Rename AVFilterBufferRefAudioProps.samples_nb to nb_samples. diff --git a/doc/Doxyfile b/doc/Doxyfile index 1b4e7d5..4d2ba33 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -25,7 +25,7 @@ DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. -PROJECT_NAME = Libav +PROJECT_NAME = FFmpeg # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or diff --git a/doc/Makefile b/doc/Makefile index 6353034..41b0173 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -6,23 +6,37 @@ HTMLPAGES = $(PROGS-yes:%=doc/%.html) \ doc/fate.html \ doc/general.html \ doc/git-howto.html \ - doc/libavfilter.html \ doc/nut.html \ doc/platform.html \ + doc/syntax.html \ -DOCS = $(HTMLPAGES) $(MANPAGES) $(PODPAGES) +TXTPAGES = doc/fate.txt \ -all-$(CONFIG_DOC): documentation + +DOCS-$(CONFIG_HTMLPAGES) += $(HTMLPAGES) +DOCS-$(CONFIG_PODPAGES) += $(PODPAGES) +DOCS-$(CONFIG_MANPAGES) += $(MANPAGES) +DOCS-$(CONFIG_TXTPAGES) += $(TXTPAGES) +DOCS = $(DOCS-yes) + +all-$(CONFIG_DOC): doc + +doc: documentation documentation: $(DOCS) -TEXIDEP = awk '/^@include/ { printf "$@: $(@D)/%s\n", $$2 }' <$< >$(@:%=%.d) +TEXIDEP = awk '/^@(verbatim)?include/ { printf "$@: $(@D)/%s\n", $$2 }' <$< >$(@:%=%.d) + +doc/%.txt: TAG = TXT +doc/%.txt: doc/%.texi + $(Q)$(TEXIDEP) + $(M)makeinfo --force --no-headers -o $@ $< 2>/dev/null GENTEXI = format codec GENTEXI := $(GENTEXI:%=doc/avoptions_%.texi) $(GENTEXI): TAG = GENTEXI -$(GENTEXI): doc/avoptions_%.texi: doc/print_options +$(GENTEXI): doc/avoptions_%.texi: doc/print_options$(HOSTEXESUF) $(M)doc/print_options $* > $@ doc/%.html: TAG = HTML @@ -33,7 +47,7 @@ doc/%.html: doc/%.texi $(SRC_PATH)/doc/t2h.init $(GENTEXI) doc/%.pod: TAG = POD doc/%.pod: doc/%.texi $(GENTEXI) $(Q)$(TEXIDEP) - $(M)$(SRC_PATH)/doc/texi2pod.pl -Idoc $< $@ + $(M)perl $(SRC_PATH)/doc/texi2pod.pl -Idoc $< $@ doc/%.1: TAG = MAN doc/%.1: doc/%.pod $(GENTEXI) @@ -41,11 +55,15 @@ doc/%.1: doc/%.pod $(GENTEXI) $(DOCS): | doc/ +install-man: + +ifdef CONFIG_MANPAGES install-progs-$(CONFIG_DOC): install-man install-man: $(MANPAGES) $(Q)mkdir -p "$(MANDIR)/man1" $(INSTALL) -m 644 $(MANPAGES) "$(MANDIR)/man1" +endif uninstall: uninstall-man @@ -53,8 +71,8 @@ uninstall-man: $(RM) $(addprefix "$(MANDIR)/man1/",$(ALLMANPAGES)) clean:: - $(RM) doc/*.html doc/*.pod doc/*.1 $(CLEANSUFFIXES:%=doc/%) doc/avoptions_*.texi + $(RM) $(TXTPAGES) doc/*.html doc/*.pod doc/*.1 $(CLEANSUFFIXES:%=doc/%) doc/avoptions_*.texi -include $(wildcard $(DOCS:%=%.d)) -.PHONY: documentation +.PHONY: doc documentation diff --git a/doc/RELEASE_NOTES b/doc/RELEASE_NOTES index bb1aecb..135165a 100644 --- a/doc/RELEASE_NOTES +++ b/doc/RELEASE_NOTES @@ -1,95 +1,16 @@ Release Notes ============= -* 9 "Plain Nine" +* 0.10 "Freedom" January, 2012 + General notes ------------- +See the Changelog file for a list of significant changes. Note, there +are many more new features and bugfixes than whats listed there. -From this release onwards, we have decided to drop the leading zero from our -release numbers. There were no plans of ever changing it, so it carried no -information. Thus this release is just a plain 9, the next will be 10 etc. - -A new library arrived in Libav during this development cycle -- its name is -libavresample and it handles audio conversion and mixing. All users are -encouraged to use it instead of the old, now deprecated, audio conversion -API in libavcodec. - -The libpostproc library now resides in a separate tree. It was fully independent -of the other Libav libraries, not used by any of the tools and saw very little -development. For these reasons we decided that it has no place in Libav. A -standalone Git tree is available at http://git.videolan.org/?p=libpostproc.git -for people wishing to use libpostproc. - -The major versions of the libavcodec, libavformat and libavfilter libraries have -been bumped, so they are not API or ABI compatible with the 0.8 release. The -ffmpeg transcoding tool, kept for compatibility in 0.8, has also been dropped. - -This release brings a number of significant changes in the libavfilter library. -Firstly, all the API dealing with filter internals is no longer public. The -result is that creating user-side filters will not be supported until -libavfilter is more mature. -Secondly, full audio filtering support is now available along with a set of -basic audio filters. We hope that their number will soon grow significantly. -The avconv transcoding tool has of course been extended to handle audio -filtering as well. -There were a number of other API changes, most importantly the addition of -the buffer sink public API. - -In the libavcodec library, one of the most notable changes is added support for -planar audio (i.e. not interleaved). Many decoders and encoders, that previously -did inefficient (de)interleaving internally, now only work with planar audio -formats. Libavresample can be used for optimized conversion between interleaved -and planar formats. - -As usual, this release also contains support for some new formats, many smaller -new features and countless bug fixes. We can highlight Opus decoding / encoding -through libopus, encoders for Apple ProRes and Ut Video, WMA Lossless and -RealAudio Lossless decoders, fragmented MOV/MP4 and ISMV (Smooth Streaming) -muxers, a large number of RTMP improvements and support for cover art in -ID3v2, WMA, MP4 and FLAC. - -See the Changelog file for a list of significant changes. - -Please note that our policy on bug reports has not changed. We still only accept -bug reports against HEAD of the Libav trunk repository. If you are experiencing -issues with any formally released version of Libav, please try a current version -of the development code to check if the issue still exists. If it does, make -your report against the development code following the usual bug reporting +Bugreports against FFmpeg git master or the most recent FFmpeg release are +accepted. If you are experiencing issues with any formally released version of +FFmpeg, please try git master to check if the issue still exists. If it does, +make your report against the development code following the usual bug reporting guidelines. - - -API changes ------------ - -A number of additional APIs have been introduced and some existing functions -have been deprecated and are scheduled for removal in the next release. -Significant API changes include: - -[libavcodec]: -* New video encoding API, similar to the previously introduced audio encoding - API, which encodes from an AVFrame to an AVPacket, thus allowing it to - properly output timing information and side data. - -* All CODEC_ID_* symbols now carry AV_ prefixes. Non-prefixed codec IDs are - deprecated. - -* New codec descriptor API, which allows getting the properties of a given codec - (identified by its ID), without referring to a specific decoder or encoder. - -* An AVFrame must now be freed with a dedicated function, avcodec_free_frame(). - -[libavutil]: -* New audio FIFO API, which simplifies managing/merging/splitting audio buffers. - -* new int/float type punning API - -[libavfilter]: -* All filter internals were hidden. - -* audio filtering. - -* new buffer sink API for getting frames out of libavfilter. - -Please see the file doc/APIchanges for details along with similar -programmer-centric information. diff --git a/doc/avprobe.texi b/doc/avprobe.texi deleted file mode 100644 index 7e6fedf..0000000 --- a/doc/avprobe.texi +++ /dev/null @@ -1,141 +0,0 @@ -\input texinfo @c -*- texinfo -*- - -@settitle avprobe Documentation -@titlepage -@center @titlefont{avprobe Documentation} -@end titlepage - -@top - -@contents - -@chapter Synopsis - -The generic syntax is: - -@example -@c man begin SYNOPSIS -avprobe [options] [@file{input_file}] -@c man end -@end example - -@chapter Description -@c man begin DESCRIPTION - -avprobe gathers information from multimedia streams and prints it in -human- and machine-readable fashion. - -For example it can be used to check the format of the container used -by a multimedia stream and the format and type of each media stream -contained in it. - -If a filename is specified in input, avprobe will try to open and -probe the file content. If the file cannot be opened or recognized as -a multimedia file, a positive exit code is returned. - -avprobe may be employed both as a standalone application or in -combination with a textual filter, which may perform more -sophisticated processing, e.g. statistical processing or plotting. - -Options are used to list some of the formats supported by avprobe or -for specifying which information to display, and for setting how -avprobe will show it. - -avprobe output is designed to be easily parsable by any INI or JSON -parsers. - -@c man end - -@chapter Options -@c man begin OPTIONS - -@include avtools-common-opts.texi - -@section Main options - -@table @option - -@item -f @var{format} -Force format to use. - -@item -of @var{formatter} -Use a specific formatter to output the document. The following -formatters are available -@table @option -@item ini - -@item json - -@item old -Pseudo-INI format that used to be the only one available in old -avprobe versions. -@end table - -@item -unit -Show the unit of the displayed values. - -@item -prefix -Use SI prefixes for the displayed values. -Unless the "-byte_binary_prefix" option is used all the prefixes -are decimal. - -@item -byte_binary_prefix -Force the use of binary prefixes for byte values. - -@item -sexagesimal -Use sexagesimal format HH:MM:SS.MICROSECONDS for time values. - -@item -pretty -Prettify the format of the displayed values, it corresponds to the -options "-unit -prefix -byte_binary_prefix -sexagesimal". - -@item -show_format -Show information about the container format of the input multimedia -stream. - -All the container format information is printed within a section with -name "FORMAT". - -@item -show_format_entry @var{name} -Like @option{-show_format}, but only prints the specified entry of the -container format information, rather than all. This option may be given more -than once, then all specified entries will be shown. - -@item -show_packets -Show information about each packet contained in the input multimedia -stream. - -The information for each single packet is printed within a dedicated -section with name "PACKET". - -@item -show_streams -Show information about each media stream contained in the input -multimedia stream. - -Each media stream information is printed within a dedicated section -with name "STREAM". - -@end table -@c man end - -@include demuxers.texi -@include muxers.texi -@include protocols.texi -@include indevs.texi - -@ignore - -@setfilename avprobe -@settitle avprobe media prober - -@c man begin SEEALSO -avconv(1), avplay(1) and the Libav HTML documentation -@c man end - -@c man begin AUTHORS -The Libav developers -@c man end - -@end ignore - -@bye diff --git a/doc/avtools-common-opts.texi b/doc/avtools-common-opts.texi index d07505d..1fc12aa 100644 --- a/doc/avtools-common-opts.texi +++ b/doc/avtools-common-opts.texi @@ -18,10 +18,10 @@ are used to precisely specify which stream(s) does a given option belong to. A stream specifier is a string generally appended to the option name and separated from it by a colon. E.g. @code{-codec:a:1 ac3} option contains -@code{a:1} stream specifer, which matches the second audio stream. Therefore it +@code{a:1} stream specifier, which matches the second audio stream. Therefore it would select the ac3 codec for the second audio stream. -A stream specifier can match several stream, the option is then applied to all +A stream specifier can match several streams, the option is then applied to all of them. E.g. the stream specifier in @code{-b:a 128k} matches all audio streams. @@ -41,7 +41,10 @@ streams of this type. @item p:@var{program_id}[:@var{stream_index}] If @var{stream_index} is given, then matches stream number @var{stream_index} in program with id @var{program_id}. Otherwise matches all streams in this program. +@item #@var{stream_id} +Matches the stream by format-specific ID. @end table + @section Generic options These options are shared amongst the av* tools. @@ -116,6 +119,9 @@ Show available pixel formats. @item -sample_fmts Show available sample formats. +@item -layouts +Show channel names and standard channel layouts. + @item -loglevel @var{loglevel} | -v @var{loglevel} Set the logging level used by the library. @var{loglevel} is a number or a string containing one of the following values: @@ -136,7 +142,26 @@ can be disabled setting the environment variable @env{AV_LOG_FORCE_NOCOLOR} or @env{NO_COLOR}, or can be forced setting the environment variable @env{AV_LOG_FORCE_COLOR}. The use of the environment variable @env{NO_COLOR} is deprecated and -will be dropped in a following Libav version. +will be dropped in a following FFmpeg version. + +@item -report +Dump full command line and console output to a file named +@code{@var{program}-@var{YYYYMMDD}-@var{HHMMSS}.log} in the current +directory. +This file can be useful for bug reports. +It also implies @code{-loglevel verbose}. + +Note: setting the environment variable @code{FFREPORT} to any value has the +same effect. + +@item -cpuflags flags (@emph{global}) +Allows setting and clearing cpu flags. This option is intended +for testing. Do not use it unless you know what you're doing. +@example +ffmpeg -cpuflags -sse+mmx ... +ffmpeg -cpuflags mmx ... +ffmpeg -cpuflags 0 ... +@end example @end table @@ -159,7 +184,7 @@ For example to write an ID3v2.3 header instead of a default ID3v2.4 to an MP3 file, use the @option{id3v2_version} private option of the MP3 muxer: @example -avconv -i input.flac -id3v2_version 3 out.mp3 +ffmpeg -i input.flac -id3v2_version 3 out.mp3 @end example All codec AVOptions are obviously per-stream, so the chapter on stream diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi index a6fe2f2..2ee00c1 100644 --- a/doc/bitstream_filters.texi +++ b/doc/bitstream_filters.texi @@ -1,7 +1,7 @@ @chapter Bitstream Filters @c man begin BITSTREAM FILTERS -When you configure your Libav build, all the supported bitstream +When you configure your FFmpeg build, all the supported bitstream filters are enabled by default. You can list all available ones using the configure option @code{--list-bsfs}. @@ -23,6 +23,20 @@ Below is a description of the currently available bitstream filters. @section h264_mp4toannexb +Convert an H.264 bitstream from length prefixed mode to start code +prefixed mode (as defined in the Annex B of the ITU-T H.264 +specification). + +This is required by some streaming formats, typically the MPEG-2 +transport stream format ("mpegts"). + +For example to remux an MP4 file containing an H.264 stream to mpegts +format with @command{ffmpeg}, you can use the command: + +@example +ffmpeg -i INPUT.mp4 -codec copy -bsf:v h264_mp4toannexb OUTPUT.ts +@end example + @section imx_dump_header @section mjpeg2jpeg @@ -34,7 +48,7 @@ JPEG image. The individual frames can be extracted without loss, e.g. by @example -avconv -i ../some_mjpeg.avi -c:v copy frames_%d.jpg +ffmpeg -i ../some_mjpeg.avi -c:v copy frames_%d.jpg @end example Unfortunately, these chunks are incomplete JPEG images, because @@ -57,9 +71,9 @@ stream (carrying the AVI1 header ID and lacking a DHT segment) to produce fully qualified JPEG images. @example -avconv -i mjpeg-movie.avi -c:v copy -bsf:v mjpeg2jpeg frame_%d.jpg +ffmpeg -i mjpeg-movie.avi -c:v copy -bsf:v mjpeg2jpeg frame_%d.jpg exiftran -i -9 frame*.jpg -avconv -i frame_%d.jpg -c:v copy rotated.avi +ffmpeg -i frame_%d.jpg -c:v copy rotated.avi @end example @section mjpega_dump_header diff --git a/doc/build_system.txt b/doc/build_system.txt index c3dede7..36c141e 100644 --- a/doc/build_system.txt +++ b/doc/build_system.txt @@ -1,4 +1,4 @@ -Libav currently uses a custom build system, this text attempts to document +FFmpeg currently uses a custom build system, this text attempts to document some of its obscure features and options. Makefile variables: @@ -9,13 +9,19 @@ V DESTDIR Destination directory for the install targets, useful to prepare packages - or install Libav in cross-environments. + or install FFmpeg in cross-environments. Makefile targets: all Default target, builds all the libraries and the executables. +fate + Run the fate test suite, note you must have installed it + +fate-list + Will list all fate/regression test targets + install Install headers, libraries and programs. @@ -27,3 +33,18 @@ libavcodec/api-example libswscale/swscale-test Build the swscale self-test (useful also as example). + + +Useful standard make commands: +make -t <target> + Touch all files that otherwise would be build, this is useful to reduce + unneeded rebuilding when changing headers, but note you must force rebuilds + of files that actually need it by hand then. + +make -j<num> + rebuild with multiple jobs at the same time. Faster on multi processor systems + +make -k + continue build in case of errors, this is useful for the regression tests + sometimes but note it will still not run all reg tests. + diff --git a/doc/decoders.texi b/doc/decoders.texi new file mode 100644 index 0000000..87ad4ee --- /dev/null +++ b/doc/decoders.texi @@ -0,0 +1,63 @@ +@chapter Decoders +@c man begin DECODERS + +Decoders are configured elements in FFmpeg which allow the decoding of +multimedia streams. + +When you configure your FFmpeg build, all the supported native decoders +are enabled by default. Decoders requiring an external library must be enabled +manually via the corresponding @code{--enable-lib} option. You can list all +available decoders using the configure option @code{--list-decoders}. + +You can disable all the decoders with the configure option +@code{--disable-decoders} and selectively enable / disable single decoders +with the options @code{--enable-decoder=@var{DECODER}} / +@code{--disable-decoder=@var{DECODER}}. + +The option @code{-codecs} of the ff* tools will display the list of +enabled decoders. + +@c man end DECODERS + +@chapter Video Decoders +@c man begin VIDEO DECODERS + +A description of some of the currently available video decoders +follows. + +@section rawvideo + +Raw video decoder. + +This decoder decodes rawvideo streams. + +@subsection Options + +@table @option +@item top @var{top_field_first} +Specify the assumed field type of the input video. +@table @option +@item -1 +the video is assumed to be progressive (default) +@item 0 +bottom-field-first is assumed +@item 1 +top-field-first is assumed +@end table + +@end table + +@c man end VIDEO DECODERS + +@chapter Audio Decoders +@c man begin AUDIO DECODERS + +@section ffwavesynth + +Internal wave synthetizer. + +This decoder generates wave patterns according to predefined sequences. Its +use is purely internal and the format of the data it accepts is not publicly +documented. + +@c man end AUDIO DECODERS diff --git a/doc/demuxers.texi b/doc/demuxers.texi index c3049dd..aea4c54 100644 --- a/doc/demuxers.texi +++ b/doc/demuxers.texi @@ -1,10 +1,10 @@ @chapter Demuxers @c man begin DEMUXERS -Demuxers are configured elements in Libav which allow to read the +Demuxers are configured elements in FFmpeg which allow to read the multimedia streams from a particular type of file. -When you configure your Libav build, all the supported demuxers +When you configure your FFmpeg build, all the supported demuxers are enabled by default. You can list all available ones using the configure option "--list-demuxers". @@ -23,8 +23,31 @@ The description of some of the currently available demuxers follows. Image file demuxer. This demuxer reads from a list of image files specified by a pattern. +The syntax and meaning of the pattern is specified by the +option @var{pattern_type}. -The pattern may contain the string "%d" or "%0@var{N}d", which +The pattern may contain a suffix which is used to automatically +determine the format of the images contained in the files. + +The size, the pixel format, and the format of each image must be the +same for all the files in the sequence. + +This demuxer accepts the following options: +@table @option +@item framerate +Set the framerate for the video stream. It defaults to 25. +@item loop +If set to 1, loop over the input. Default value is 0. +@item pattern_type +Select the pattern type used to interpret the provided filename. + +@var{pattern_type} accepts one of the following values. +@table @option +@item sequence +Select a sequence pattern type, used to specify a sequence of files +indexed by sequential numbers. + +A sequence pattern may contain the string "%d" or "%0@var{N}d", which specifies the position of the characters representing a sequential number in each filename matched by the pattern. If the form "%d0@var{N}d" is used, the string representing the number in each @@ -32,13 +55,11 @@ filename is 0-padded and @var{N} is the total number of 0-padded digits representing the number. The literal character '%' can be specified in the pattern with the string "%%". -If the pattern contains "%d" or "%0@var{N}d", the first filename of +If the sequence pattern contains "%d" or "%0@var{N}d", the first filename of the file list specified by the pattern must contain a number -inclusively contained between 0 and 4, all the following numbers must -be sequential. This limitation may be hopefully fixed. - -The pattern may contain a suffix which is used to automatically -determine the format of the images contained in the files. +inclusively contained between @var{start_number} and +@var{start_number}+@var{start_number_range}-1, and all the following +numbers must be sequential. For example the pattern "img-%03d.bmp" will match a sequence of filenames of the form @file{img-001.bmp}, @file{img-002.bmp}, ..., @@ -46,23 +67,81 @@ filenames of the form @file{img-001.bmp}, @file{img-002.bmp}, ..., sequence of filenames of the form @file{i%m%g-1.jpg}, @file{i%m%g-2.jpg}, ..., @file{i%m%g-10.jpg}, etc. -The size, the pixel format, and the format of each image must be the -same for all the files in the sequence. +Note that the pattern must not necessarily contain "%d" or +"%0@var{N}d", for example to convert a single image file +@file{img.jpeg} you can employ the command: +@example +ffmpeg -i img.jpeg img.png +@end example -The following example shows how to use @command{avconv} for creating a -video from the images in the file sequence @file{img-001.jpeg}, -@file{img-002.jpeg}, ..., assuming an input framerate of 10 frames per -second: +@item glob +Select a glob wildcard pattern type. + +The pattern is interpreted like a @code{glob()} pattern. This is only +selectable if libavformat was compiled with globbing support. + +@item glob_sequence @emph{(deprecated, will be removed)} +Select a mixed glob wildcard/sequence pattern. + +If your version of libavformat was compiled with globbing support, and +the provided pattern contains at least one glob meta character among +@code{%*?[]@{@}} that is preceded by an unescaped "%", the pattern is +interpreted like a @code{glob()} pattern, otherwise it is interpreted +like a sequence pattern. + +All glob special characters @code{%*?[]@{@}} must be prefixed +with "%". To escape a literal "%" you shall use "%%". + +For example the pattern @code{foo-%*.jpeg} will match all the +filenames prefixed by "foo-" and terminating with ".jpeg", and +@code{foo-%?%?%?.jpeg} will match all the filenames prefixed with +"foo-", followed by a sequence of three characters, and terminating +with ".jpeg". + +This pattern type is deprecated in favor of @var{glob} and +@var{sequence}. +@end table + +Default value is @var{glob_sequence}. +@item pixel_format +Set the pixel format of the images to read. If not specified the pixel +format is guessed from the first image file in the sequence. +@item start_number +Set the index of the file matched by the image file pattern to start +to read from. Default value is 0. +@item start_number_range +Set the index interval range to check when looking for the first image +file in the sequence, starting from @var{start_number}. Default value +is 5. +@item video_size +Set the video size of the images to read. If not specified the video +size is guessed from the first image file in the sequence. +@end table + +@subsection Examples + +@itemize +@item +Use @command{ffmpeg} for creating a video from the images in the file +sequence @file{img-001.jpeg}, @file{img-002.jpeg}, ..., assuming an +input frame rate of 10 frames per second: @example -avconv -i 'img-%03d.jpeg' -r 10 out.mkv +ffmpeg -i 'img-%03d.jpeg' -r 10 out.mkv @end example -Note that the pattern must not necessarily contain "%d" or -"%0@var{N}d", for example to convert a single image file -@file{img.jpeg} you can employ the command: +@item +As above, but start by reading from a file with index 100 in the sequence: +@example +ffmpeg -start_number 100 -i 'img-%03d.jpeg' -r 10 out.mkv +@end example + +@item +Read images matching the "*.png" glob pattern , that is all the files +terminating with the ".png" suffix: @example -avconv -i img.jpeg img.png +ffmpeg -pattern_type glob -i "*.png" -r 10 out.mkv @end example +@end itemize @section applehttp @@ -70,9 +149,39 @@ Apple HTTP Live Streaming demuxer. This demuxer presents all AVStreams from all variant streams. The id field is set to the bitrate variant index number. By setting -the discard flags on AVStreams (by pressing 'a' or 'v' in avplay), +the discard flags on AVStreams (by pressing 'a' or 'v' in ffplay), the caller can decide which variant streams to actually receive. The total bitrate of the variant that the stream belongs to is available in a metadata key named "variant_bitrate". +@section sbg + +SBaGen script demuxer. + +This demuxer reads the script language used by SBaGen +@url{http://uazu.net/sbagen/} to generate binaural beats sessions. A SBG +script looks like that: +@example +-SE +a: 300-2.5/3 440+4.5/0 +b: 300-2.5/0 440+4.5/3 +off: - +NOW == a ++0:07:00 == b ++0:14:00 == a ++0:21:00 == b ++0:30:00 off +@end example + +A SBG script can mix absolute and relative timestamps. If the script uses +either only absolute timestamps (including the script start time) or only +relative ones, then its layout is fixed, and the conversion is +straightforward. On the other hand, if the script mixes both kind of +timestamps, then the @var{NOW} reference for relative timestamps will be +taken from the current time of day at the time the script is read, and the +script layout will be frozen according to that reference. That means that if +the script is directly played, the actual times will match the absolute +timestamps up to the sound controller's clock accuracy, but if the user +somehow pauses the playback or seeks, all times will be shifted accordingly. + @c man end INPUT DEVICES diff --git a/doc/developer.texi b/doc/developer.texi index aff28b8..cd635a8 100644 --- a/doc/developer.texi +++ b/doc/developer.texi @@ -14,78 +14,47 @@ @section API @itemize @bullet @item libavcodec is the library containing the codecs (both encoding and -decoding). Look at @file{libavcodec/apiexample.c} to see how to use it. +decoding). Look at @file{doc/examples/decoding_encoding.c} to see how to use +it. @item libavformat is the library containing the file format handling (mux and -demux code for several formats). Look at @file{avplay.c} to use it in a -player. See @file{libavformat/output-example.c} to use it to generate -audio or video streams. +demux code for several formats). Look at @file{ffplay.c} to use it in a +player. See @file{doc/examples/muxing.c} to use it to generate audio or video +streams. @end itemize -@section Integrating libav in your program - -Shared libraries should be used whenever is possible in order to reduce -the effort distributors have to pour to support programs and to ensure -only the public api is used. - -You can use Libav in your commercial program, but you must abide to the -license, LGPL or GPL depending on the specific features used, please refer -to @uref{http://libav.org/legal.html, our legal page} for a quick checklist and to -the following links for the exact text of each license: -@uref{http://git.libav.org/?p=libav.git;a=blob;f=COPYING.GPLv2, GPL version 2}, -@uref{http://git.libav.org/?p=libav.git;a=blob;f=COPYING.GPLv3, GPL version 3}, -@uref{http://git.libav.org/?p=libav.git;a=blob;f=COPYING.LGPLv2.1, LGPL version 2.1}, -@uref{http://git.libav.org/?p=libav.git;a=blob;f=COPYING.LGPLv3, LGPL version 3}. -Any modification to the source code can be suggested for inclusion. -The best way to proceed is to send your patches to the -@uref{https://lists.libav.org/mailman/listinfo/libav-devel, libav-devel} -mailing list. +@section Integrating libavcodec or libavformat in your program + +You can integrate all the source code of the libraries to link them +statically to avoid any version problem. All you need is to provide a +'config.mak' and a 'config.h' in the parent directory. See the defines +generated by ./configure to understand what is needed. + +You can use libavcodec or libavformat in your commercial program, but +@emph{any patch you make must be published}. The best way to proceed is +to send your patches to the FFmpeg mailing list. + +@section Contributing + +There are 3 ways by which code gets into ffmpeg. +@itemize @bullet +@item Submitting Patches to the main developer mailing list + see @ref{Submitting patches} for details. +@item Directly committing changes to the main tree. +@item Committing changes to a git clone, for example on github.com or + gitorious.org. And asking us to merge these changes. +@end itemize + +Whichever way, changes should be reviewed by the maintainer of the code +before they are committed. And they should follow the @ref{Coding Rules}. +The developer making the commit and the author are responsible for their changes +and should try to fix issues their commit causes. @anchor{Coding Rules} @section Coding Rules @subsection Code formatting conventions -The code is written in K&R C style. That means the following: -@itemize @bullet -@item -The control statements are formatted by putting space between the statement -and parenthesis in the following way: -@example -for (i = 0; i < filter->input_count; i++) @{ -@end example -@item -The case statement is always located at the same level as the switch itself: -@example -switch (link->init_state) @{ -case AVLINK_INIT: - continue; -case AVLINK_STARTINIT: - av_log(filter, AV_LOG_INFO, "circular filter chain detected"); - return 0; -@end example -@item -Braces in function declarations are written on the new line: -@example -const char *avfilter_configuration(void) -@{ - return LIBAV_CONFIGURATION; -@} -@end example -@item -Do not check for NULL values by comparison, @samp{if (p)} and -@samp{if (!p)} are correct; @samp{if (p == NULL)} and @samp{if (p != NULL)} -are not. -@item -In case of a single-statement if, no curly braces are required: -@example -if (!pic || !picref) - goto fail; -@end example -@item -Do not put spaces immediately inside parentheses. @samp{if (ret)} is -a valid style; @samp{if ( ret )} is not. -@end itemize There are the following guidelines regarding the indentation in files: @itemize @bullet @@ -101,7 +70,7 @@ and only if this improves readability. @end itemize The presentation is one inspired by 'indent -i4 -kr -nut'. -The main priority in Libav is simplicity and small code size in order to +The main priority in FFmpeg is simplicity and small code size in order to minimize the bug count. @subsection Comments @@ -146,7 +115,7 @@ int myfunc(int my_parameter) @subsection C language features -Libav is programmed in the ISO C90 language with a few additional +FFmpeg is programmed in the ISO C90 language with a few additional features from ISO C99, namely: @itemize @bullet @item @@ -178,10 +147,10 @@ GCC statement expressions (@samp{(x = (@{ int y = 4; y; @})}). @end itemize @subsection Naming conventions -All names are using underscores (_), not CamelCase. For example, -@samp{avfilter_get_video_buffer} is a valid function name and -@samp{AVFilterGetVideo} is not. The only exception from this are structure -names; they should always be in the CamelCase +All names are using underscores (_), not CamelCase. For example, @samp{avfilter_get_video_buffer} is +a valid function name and @samp{AVFilterGetVideo} is not. The exception from this are type names, like +for example structs and enums; they should always be in the CamelCase + There are following conventions for naming variables and functions: @itemize @bullet @@ -212,10 +181,10 @@ should also be avoided if they don't make the code easier to understand. @end itemize @subsection Editor configuration -In order to configure Vim to follow Libav formatting conventions, paste +In order to configure Vim to follow FFmpeg formatting conventions, paste the following snippet into your @file{.vimrc}: @example -" indentation rules for libav: 4 spaces, no tabs +" indentation rules for FFmpeg: 4 spaces, no tabs set expandtab set shiftwidth=4 set softtabstop=4 @@ -232,7 +201,7 @@ autocmd InsertEnter * match ForbiddenWhitespace /\t\|\s\+\%#\@@<!$/ For Emacs, add these roughly equivalent lines to your @file{.emacs.d/init.el}: @example -(c-add-style "libav" +(c-add-style "ffmpeg" '("k&r" (c-basic-offset . 4) (indent-tabs-mode . nil) @@ -241,7 +210,7 @@ For Emacs, add these roughly equivalent lines to your @file{.emacs.d/init.el}: (statement-cont . (c-lineup-assignments +))) ) ) -(setq c-default-style "libav") +(setq c-default-style "ffmpeg") @end example @section Development Policy @@ -253,33 +222,17 @@ For Emacs, add these roughly equivalent lines to your @file{.emacs.d/init.el}: an "or any later version" clause is also acceptable, but LGPL is preferred. @item - All the patches MUST be reviewed in the mailing list before they are - committed. -@item - The Libav coding style should remain consistent. Changes to - conform will be suggested during the review or implemented on commit. -@item - Patches should be generated using @code{git format-patch} or directly sent - using @code{git send-email}. - Please make sure you give the proper credit by setting the correct author - in the commit. + You must not commit code which breaks FFmpeg! (Meaning unfinished but + enabled code which breaks compilation or compiles but does not work or + breaks the regression tests) + You can commit unfinished stuff (for testing etc), but it must be disabled + (#ifdef etc) by default so it does not interfere with other developers' + work. @item - The commit message should have a short first line in the form of - @samp{topic: short description} as header, separated by a newline - from the body consting in few lines explaining the reason of the patch. - Referring to the issue on the bug tracker does not exempt to report an - excerpt of the bug. -@item - Work in progress patches should be sent to the mailing list with the [WIP] - or the [RFC] tag. -@item - Branches in public personal repos are advised as way to - work on issues collaboratively. -@item - You do not have to over-test things. If it works for you and you think it - should work for others, send it to the mailing list for review. - If you have doubt about portability please state it in the submission so - people with specific hardware could test it. + You do not have to over-test things. If it works for you, and you think it + should work for others, then commit. If your code has problems + (portability, triggers compiler bugs, unusual environment etc) they will be + reported and eventually fixed. @item Do not commit unrelated changes together, split them into self-contained pieces. Also do not forget that if part B depends on part A, but A does not @@ -287,37 +240,75 @@ For Emacs, add these roughly equivalent lines to your @file{.emacs.d/init.el}: Keeping changes well split into self-contained parts makes reviewing and understanding them on the commit log mailing list easier. This also helps in case of debugging later on. -@item - Patches that change behavior of the programs (renaming options etc) or - public API or ABI should be discussed in depth and possible few days should - pass between discussion and commit. - Changes to the build system (Makefiles, configure script) which alter - the expected behavior should be considered in the same regard. + Also if you have doubts about splitting or not splitting, do not hesitate to + ask/discuss it on the developer mailing list. +@item + Do not change behavior of the programs (renaming options etc) or public + API or ABI without first discussing it on the ffmpeg-devel mailing list. + Do not remove functionality from the code. Just improve! + + Note: Redundant code can be removed. +@item + Do not commit changes to the build system (Makefiles, configure script) + which change behavior, defaults etc, without asking first. The same + applies to compiler warning fixes, trivial looking fixes and to code + maintained by other developers. We usually have a reason for doing things + the way we do. Send your changes as patches to the ffmpeg-devel mailing + list, and if the code maintainers say OK, you may commit. This does not + apply to files you wrote and/or maintain. +@item + We refuse source indentation and other cosmetic changes if they are mixed + with functional changes, such commits will be rejected and removed. Every + developer has his own indentation style, you should not change it. Of course + if you (re)write something, you can use your own style, even though we would + prefer if the indentation throughout FFmpeg was consistent (Many projects + force a given indentation style - we do not.). If you really need to make + indentation changes (try to avoid this), separate them strictly from real + changes. + + NOTE: If you had to put if()@{ .. @} over a large (> 5 lines) chunk of code, + then either do NOT change the indentation of the inner part within (do not + move it to the right)! or do so in a separate commit +@item + Always fill out the commit log message. Describe in a few lines what you + changed and why. You can refer to mailing list postings if you fix a + particular bug. Comments such as "fixed!" or "Changed it." are unacceptable. + Recommended format: + area changed: Short 1 line description + + details describing what and why and giving references. +@item + Make sure the author of the commit is set correctly. (see git commit --author) + If you apply a patch, send an + answer to ffmpeg-devel (or wherever you got the patch from) saying that + you applied the patch. @item When applying patches that have been discussed (at length) on the mailing list, reference the thread in the log message. @item - Subscribe to the - @uref{https://lists.libav.org/mailman/listinfo/libav-devel, libav-devel} and - @uref{https://lists.libav.org/mailman/listinfo/libav-commits, libav-commits} - mailing lists. - Bugs and possible improvements or general questions regarding commits - are discussed on libav-devel. We expect you to react if problems with - your code are uncovered. + Do NOT commit to code actively maintained by others without permission. + Send a patch to ffmpeg-devel instead. If no one answers within a reasonable + timeframe (12h for build failures and security fixes, 3 days small changes, + 1 week for big patches) then commit your patch if you think it is OK. + Also note, the maintainer can simply ask for more time to review! +@item + Subscribe to the ffmpeg-cvslog mailing list. The diffs of all commits + are sent there and reviewed by all the other developers. Bugs and possible + improvements or general questions regarding commits are discussed there. We + expect you to react if problems with your code are uncovered. @item Update the documentation if you change behavior or add features. If you are - unsure how best to do this, send an [RFC] patch to libav-devel. + unsure how best to do this, send a patch to ffmpeg-devel, the documentation + maintainer(s) will review and commit your stuff. @item - All discussions and decisions should be reported on the public developer - mailing list, so that there is a reference to them. - Other media (e.g. IRC) should be used for coordination and immediate - collaboration. + Try to keep important discussions and requests (also) on the public + developer mailing list, so that all developers can benefit from them. @item Never write to unallocated memory, never write over the end of arrays, always check values read from some untrusted source before using them - as array index or other risky things. Always use valgrind to doublecheck. + as array index or other risky things. @item - Remember to check if you need to bump versions for the specific libav + Remember to check if you need to bump versions for the specific libav* parts (libavutil, libavcodec, libavformat) you are changing. You need to change the version integer. Incrementing the first component means no backward compatibility to @@ -328,12 +319,13 @@ For Emacs, add these roughly equivalent lines to your @file{.emacs.d/init.el}: Incrementing the third component means a noteworthy binary compatible change (e.g. encoder bug fix that matters for the decoder). @item - Compiler warnings indicate potential bugs or code with bad style. + Compiler warnings indicate potential bugs or code with bad style. If a type of + warning always points to correct and clean code, that warning should + be disabled, not the code changed. + Thus the remaining warnings can either be bugs or correct code. If it is a bug, the bug has to be fixed. If it is not, the code should be changed to not generate a warning unless that causes a slowdown or obfuscates the code. - If a type of warning leads to too many false positives, that warning - should be disabled, not the code changed. @item If you add a new file, give it a proper license header. Do not copy and paste it from a random place, use an existing file as template. @@ -341,49 +333,47 @@ For Emacs, add these roughly equivalent lines to your @file{.emacs.d/init.el}: We think our rules are not too hard. If you have comments, contact us. -Note, some rules were borrowed from the MPlayer project. +Note, these rules are mostly borrowed from the MPlayer project. +@anchor{Submitting patches} @section Submitting patches First, read the @ref{Coding Rules} above if you did not yet, in particular the rules regarding patch submission. -As stated already, please do not submit a patch which contains several -unrelated changes. +When you submit your patch, please use @code{git format-patch} or +@code{git send-email}. We cannot read other diffs :-) + +Also please do not submit a patch which contains several unrelated changes. Split it into separate, self-contained pieces. This does not mean splitting file by file. Instead, make the patch as small as possible while still keeping it as a logical unit that contains an individual change, even if it spans multiple files. This makes reviewing your patches much easier for us and greatly increases your chances of getting your patch applied. -Use the patcheck tool of Libav to check your patch. +Use the patcheck tool of FFmpeg to check your patch. The tool is located in the tools directory. -Run the @ref{Regression Tests} before submitting a patch in order to verify +Run the @ref{Regression tests} before submitting a patch in order to verify it does not cause unexpected problems. Patches should be posted as base64 encoded attachments (or any other encoding which ensures that the patch will not be trashed during -transmission) to the -@uref{https://lists.libav.org/mailman/listinfo/libav-devel, libav-devel} -mailing list. +transmission) to the ffmpeg-devel mailing list, see +@url{http://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel} It also helps quite a bit if you tell us what the patch does (for example 'replaces lrint by lrintf'), and why (for example '*BSD isn't C99 compliant -and has no lrint()'). This kind of explanation should be the body of the -commit message. +and has no lrint()') Also please if you send several patches, send each patch as a separate mail, do not attach several unrelated patches to the same mail. -Use @code{git send-email} when possible since it will properly send patches -without requiring extra care. - Your patch will be reviewed on the mailing list. You will likely be asked to make some changes and are expected to send in an improved version that incorporates the requests from the review. This process may go through -several iterations. Once your patch is deemed good enough, it will be -committed to the official Libav tree. +several iterations. Once your patch is deemed good enough, some developer +will pick it up and commit it to the official FFmpeg tree. Give us a few days to react. But if some time passes without reaction, send a reminder by email. Your patch should eventually be dealt with. @@ -407,12 +397,12 @@ send a reminder by email. Your patch should eventually be dealt with. When adding new codec IDs, also add an entry to the codec descriptor list in @file{libavcodec/codec_desc.c}. @item - If it has a fourcc, did you add it to @file{libavformat/riff.c}, + If it has a fourCC, did you add it to @file{libavformat/riff.c}, even if it is only a decoder? @item Did you add a rule to compile the appropriate files in the Makefile? - Remember to do this even if you are just adding a format to a file that - is already being compiled by some other rule, like a raw demuxer. + Remember to do this even if you're just adding a format to a file that is + already being compiled by some other rule, like a raw demuxer. @item Did you add an entry to the table of supported formats or codecs in @file{doc/general.texi}? @@ -434,13 +424,20 @@ send a reminder by email. Your patch should eventually be dealt with. @enumerate @item - Does @code{make check} pass with the patch applied? + Does @code{make fate} pass with the patch applied? +@item + Was the patch generated with git format-patch or send-email? +@item + Did you sign off your patch? (git commit -s) + See @url{http://kerneltrap.org/files/Jeremy/DCO.txt} for the meaning + of sign off. +@item + Did you provide a clear git commit log message? @item - Is the patch against latest Libav git master branch? + Is the patch against latest FFmpeg git master branch? @item - Are you subscribed to the - @uref{https://lists.libav.org/mailman/listinfo/libav-devel, libav-devel} - mailing list? (Only list subscribers are allowed to post.) + Are you subscribed to ffmpeg-devel? + (the list is subscribers only due to spam) @item Have you checked that the changes are minimal, so that the same cannot be achieved with a smaller patch and/or simpler final code? @@ -470,7 +467,7 @@ send a reminder by email. Your patch should eventually be dealt with. If the patch fixes a bug, did you provide enough information, including a sample, so the bug can be reproduced and the fix can be verified? Note please do not attach samples >100k to mails but rather provide a - URL, you can upload to ftp://upload.libav.org + URL, you can upload to ftp://upload.ffmpeg.org @item Did you provide a verbose summary about what the patch does change? @item @@ -483,7 +480,7 @@ send a reminder by email. Your patch should eventually be dealt with. patch easily? @item If you added a new file, did you insert a license header? It should be - taken from Libav, not randomly copied and pasted from somewhere else. + taken from FFmpeg, not randomly copied and pasted from somewhere else. @item You should maintain alphabetical order in alphabetically ordered lists as long as doing so does not break API/ABI compatibility. @@ -491,16 +488,18 @@ send a reminder by email. Your patch should eventually be dealt with. Lines with similar content should be aligned vertically when doing so improves readability. @item + Consider to add a regression test for your code. +@item + If you added YASM code please check that things still work with --disable-yasm +@item Make sure you check the return values of function and return appropriate - error codes. Especially memory allocation functions like @code{malloc()} + error codes. Especially memory allocation functions like @code{av_malloc()} are notoriously left unchecked, which is a serious problem. @end enumerate @section Patch review process -All patches posted to the -@uref{https://lists.libav.org/mailman/listinfo/libav-devel, libav-devel} -mailing list will be reviewed, unless they contain a +All patches posted to ffmpeg-devel will be reviewed, unless they contain a clear note that the patch is not for the git master branch. Reviews and comments will be posted as replies to the patch on the mailing list. The patch submitter then has to take care of every comment, @@ -514,22 +513,38 @@ After a patch is approved it will be committed to the repository. We will review all submitted patches, but sometimes we are quite busy so especially for large patches this can take several weeks. -When resubmitting patches, if their size grew or during the review different -issues arisen please split the patch so each issue has a specific patch. +If you feel that the review process is too slow and you are willing to try to +take over maintainership of the area of code you change then just clone +git master and maintain the area of code there. We will merge each area from +where its best maintained. + +When resubmitting patches, please do not make any significant changes +not related to the comments received during review. Such patches will +be rejected. Instead, submit significant changes or new features as +separate patches. + +@anchor{Regression tests} +@section Regression tests + +Before submitting a patch (or committing to the repository), you should at least +test that you did not break anything. -@anchor{Regression Tests} -@section Regression Tests +Running 'make fate' accomplishes this, please see @url{fate.html} for details. -Before submitting a patch (or committing to the repository), you should at -least make sure that it does not break anything. +[Of course, some patches may change the results of the regression tests. In +this case, the reference results of the regression tests shall be modified +accordingly]. -If the code changed has already a test present in FATE you should run it, -otherwise it is advised to add it. +@subsection Adding files to the fate-suite dataset -Improvements to codec or demuxer might change the FATE results. Make sure -to commit the update reference with the change and to explain in the comment -why the expected result changed. +When there is no muxer or encoder available to generate test media for a +specific test then the media has to be inlcuded in the fate-suite. +First please make sure that the sample file is as small as possible to test the +respective decoder or demuxer sufficiently. Large files increase network +bandwidth and disk space requirements. +Once you have a working fate test and fate sample, provide in the commit +message or introductionary message for the patch series that you post to +the ffmpeg-devel mailing list, a direct link to download the sample media. -Please refer to @url{fate.html}. @bye diff --git a/doc/encoders.texi b/doc/encoders.texi index 830981f..a7a2761 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -1,10 +1,10 @@ @chapter Encoders @c man begin ENCODERS -Encoders are configured elements in Libav which allow the encoding of +Encoders are configured elements in FFmpeg which allow the encoding of multimedia streams. -When you configure your Libav build, all the supported native encoders +When you configure your FFmpeg build, all the supported native encoders are enabled by default. Encoders requiring an external library must be enabled manually via the corresponding @code{--enable-lib} option. You can list all available encoders using the configure option @code{--list-encoders}. @@ -369,7 +369,7 @@ is highly recommended that it be left as enabled except for testing purposes. @end table -@subheading Floating-Point-Only AC-3 Encoding Options +@subsection Floating-Point-Only AC-3 Encoding Options These options are only valid for the floating-point encoder and do not exist for the fixed-point encoder due to the corresponding features not being @@ -413,3 +413,182 @@ Selected by Encoder (default) @end table @c man end AUDIO ENCODERS + +@chapter Video Encoders +@c man begin VIDEO ENCODERS + +A description of some of the currently available video encoders +follows. + +@section libvpx + +VP8 format supported through libvpx. + +Requires the presence of the libvpx headers and library during configuration. +You need to explicitly configure the build with @code{--enable-libvpx}. + +@subsection Options + +Mapping from FFmpeg to libvpx options with conversion notes in parentheses. + +@table @option + +@item threads +g_threads + +@item profile +g_profile + +@item vb +rc_target_bitrate + +@item g +kf_max_dist + +@item keyint_min +kf_min_dist + +@item qmin +rc_min_quantizer + +@item qmax +rc_max_quantizer + +@item bufsize, vb +rc_buf_sz +@code{(bufsize * 1000 / vb)} + +rc_buf_optimal_sz +@code{(bufsize * 1000 / vb * 5 / 6)} + +@item rc_init_occupancy, vb +rc_buf_initial_sz +@code{(rc_init_occupancy * 1000 / vb)} + +@item rc_buffer_aggressivity +rc_undershoot_pct + +@item skip_threshold +rc_dropframe_thresh + +@item qcomp +rc_2pass_vbr_bias_pct + +@item maxrate, vb +rc_2pass_vbr_maxsection_pct +@code{(maxrate * 100 / vb)} + +@item minrate, vb +rc_2pass_vbr_minsection_pct +@code{(minrate * 100 / vb)} + +@item minrate, maxrate, vb +@code{VPX_CBR} +@code{(minrate == maxrate == vb)} + +@item crf +@code{VPX_CQ}, @code{VP8E_SET_CQ_LEVEL} + +@item quality +@table @option +@item @var{best} +@code{VPX_DL_BEST_QUALITY} +@item @var{good} +@code{VPX_DL_GOOD_QUALITY} +@item @var{realtime} +@code{VPX_DL_REALTIME} +@end table + +@item speed +@code{VP8E_SET_CPUUSED} + +@item nr +@code{VP8E_SET_NOISE_SENSITIVITY} + +@item mb_threshold +@code{VP8E_SET_STATIC_THRESHOLD} + +@item slices +@code{VP8E_SET_TOKEN_PARTITIONS} + +@item max-intra-rate +@code{VP8E_SET_MAX_INTRA_BITRATE_PCT} + +@item force_key_frames +@code{VPX_EFLAG_FORCE_KF} + +@item Alternate reference frame related +@table @option +@item vp8flags altref +@code{VP8E_SET_ENABLEAUTOALTREF} +@item @var{arnr_max_frames} +@code{VP8E_SET_ARNR_MAXFRAMES} +@item @var{arnr_type} +@code{VP8E_SET_ARNR_TYPE} +@item @var{arnr_strength} +@code{VP8E_SET_ARNR_STRENGTH} +@item @var{rc_lookahead} +g_lag_in_frames +@end table + +@item vp8flags error_resilient +g_error_resilient + +@end table + +For more information about libvpx see: +@url{http://www.webmproject.org/} + +@section libx264 + +H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 format supported through +libx264. + +Requires the presence of the libx264 headers and library during +configuration. You need to explicitly configure the build with +@code{--enable-libx264}. + +@subsection Options + +@table @option + +@item preset @var{preset_name} +Set the encoding preset. + +@item tune @var{tune_name} +Tune the encoding params. + +@item fastfirstpass @var{bool} +Use fast settings when encoding first pass, default value is 1. + +@item profile @var{profile_name} +Set profile restrictions. + +@item level @var{level} +Specify level (as defined by Annex A). +Deprecated in favor of @var{x264opts}. + +@item passlogfile @var{filename} +Specify filename for 2 pass stats. +Deprecated in favor of @var{x264opts} (see @var{stats} libx264 option). + +@item wpredp @var{wpred_type} +Specify Weighted prediction for P-frames. +Deprecated in favor of @var{x264opts} (see @var{weightp} libx264 option). + +@item x264opts @var{options} +Allow to set any x264 option, see x264 --fullhelp for a list. + +@var{options} is a list of @var{key}=@var{value} couples separated by +":". +@end table + +For example to specify libx264 encoding options with @command{ffmpeg}: +@example +ffmpeg -i foo.mpg -vcodec libx264 -x264opts keyint=123:min-keyint=20 -an out.mkv +@end example + +For more information about libx264 and the supported options see: +@url{http://www.videolan.org/developers/x264.html} + +@c man end VIDEO ENCODERS diff --git a/doc/errno.txt b/doc/errno.txt new file mode 100644 index 0000000..31cab26 --- /dev/null +++ b/doc/errno.txt @@ -0,0 +1,174 @@ +The following table lists most error codes found in various operating +systems supported by FFmpeg. + + OS +Code Std F LBMWwb Text (YMMV) + +E2BIG POSIX ++++++ Argument list too long +EACCES POSIX ++++++ Permission denied +EADDRINUSE POSIX +++..+ Address in use +EADDRNOTAVAIL POSIX +++..+ Cannot assign requested address +EADV +..... Advertise error +EAFNOSUPPORT POSIX +++..+ Address family not supported +EAGAIN POSIX + ++++++ Resource temporarily unavailable +EALREADY POSIX +++..+ Operation already in progress +EAUTH .++... Authentication error +EBADARCH ..+... Bad CPU type in executable +EBADE +..... Invalid exchange +EBADEXEC ..+... Bad executable +EBADF POSIX ++++++ Bad file descriptor +EBADFD +..... File descriptor in bad state +EBADMACHO ..+... Malformed Macho file +EBADMSG POSIX ++4... Bad message +EBADR +..... Invalid request descriptor +EBADRPC .++... RPC struct is bad +EBADRQC +..... Invalid request code +EBADSLT +..... Invalid slot +EBFONT +..... Bad font file format +EBUSY POSIX - ++++++ Device or resource busy +ECANCELED POSIX +++... Operation canceled +ECHILD POSIX ++++++ No child processes +ECHRNG +..... Channel number out of range +ECOMM +..... Communication error on send +ECONNABORTED POSIX +++..+ Software caused connection abort +ECONNREFUSED POSIX - +++ss+ Connection refused +ECONNRESET POSIX +++..+ Connection reset +EDEADLK POSIX ++++++ Resource deadlock avoided +EDEADLOCK +..++. File locking deadlock error +EDESTADDRREQ POSIX +++... Destination address required +EDEVERR ..+... Device error +EDOM C89 - ++++++ Numerical argument out of domain +EDOOFUS .F.... Programming error +EDOTDOT +..... RFS specific error +EDQUOT POSIX +++... Disc quota exceeded +EEXIST POSIX ++++++ File exists +EFAULT POSIX - ++++++ Bad address +EFBIG POSIX - ++++++ File too large +EFTYPE .++... Inappropriate file type or format +EHOSTDOWN +++... Host is down +EHOSTUNREACH POSIX +++..+ No route to host +EHWPOISON +..... Memory page has hardware error +EIDRM POSIX +++... Identifier removed +EILSEQ C99 ++++++ Illegal byte sequence +EINPROGRESS POSIX - +++ss+ Operation in progress +EINTR POSIX - ++++++ Interrupted system call +EINVAL POSIX + ++++++ Invalid argument +EIO POSIX + ++++++ I/O error +EISCONN POSIX +++..+ Socket is already connected +EISDIR POSIX ++++++ Is a directory +EISNAM +..... Is a named type file +EKEYEXPIRED +..... Key has expired +EKEYREJECTED +..... Key was rejected by service +EKEYREVOKED +..... Key has been revoked +EL2HLT +..... Level 2 halted +EL2NSYNC +..... Level 2 not synchronized +EL3HLT +..... Level 3 halted +EL3RST +..... Level 3 reset +ELIBACC +..... Can not access a needed shared library +ELIBBAD +..... Accessing a corrupted shared library +ELIBEXEC +..... Cannot exec a shared library directly +ELIBMAX +..... Too many shared libraries +ELIBSCN +..... .lib section in a.out corrupted +ELNRNG +..... Link number out of range +ELOOP POSIX +++..+ Too many levels of symbolic links +EMEDIUMTYPE +..... Wrong medium type +EMFILE POSIX ++++++ Too many open files +EMLINK POSIX ++++++ Too many links +EMSGSIZE POSIX +++..+ Message too long +EMULTIHOP POSIX ++4... Multihop attempted +ENAMETOOLONG POSIX - ++++++ Filen ame too long +ENAVAIL +..... No XENIX semaphores available +ENEEDAUTH .++... Need authenticator +ENETDOWN POSIX +++..+ Network is down +ENETRESET SUSv3 +++..+ Network dropped connection on reset +ENETUNREACH POSIX +++..+ Network unreachable +ENFILE POSIX ++++++ Too many open files in system +ENOANO +..... No anode +ENOATTR .++... Attribute not found +ENOBUFS POSIX - +++..+ No buffer space available +ENOCSI +..... No CSI structure available +ENODATA XSR +N4... No message available +ENODEV POSIX - ++++++ No such device +ENOENT POSIX - ++++++ No such file or directory +ENOEXEC POSIX ++++++ Exec format error +ENOFILE ...++. No such file or directory +ENOKEY +..... Required key not available +ENOLCK POSIX ++++++ No locks available +ENOLINK POSIX ++4... Link has been severed +ENOMEDIUM +..... No medium found +ENOMEM POSIX ++++++ Not enough space +ENOMSG POSIX +++..+ No message of desired type +ENONET +..... Machine is not on the network +ENOPKG +..... Package not installed +ENOPROTOOPT POSIX +++..+ Protocol not available +ENOSPC POSIX ++++++ No space left on device +ENOSR XSR +N4... No STREAM resources +ENOSTR XSR +N4... Not a STREAM +ENOSYS POSIX + ++++++ Function not implemented +ENOTBLK +++... Block device required +ENOTCONN POSIX +++..+ Socket is not connected +ENOTDIR POSIX ++++++ Not a directory +ENOTEMPTY POSIX ++++++ Directory not empty +ENOTNAM +..... Not a XENIX named type file +ENOTRECOVERABLE SUSv4 - +..... State not recoverable +ENOTSOCK POSIX +++..+ Socket operation on non-socket +ENOTSUP POSIX +++... Operation not supported +ENOTTY POSIX ++++++ Inappropriate I/O control operation +ENOTUNIQ +..... Name not unique on network +ENXIO POSIX ++++++ No such device or address +EOPNOTSUPP POSIX +++..+ Operation not supported (on socket) +EOVERFLOW POSIX +++..+ Value too large to be stored in data type +EOWNERDEAD SUSv4 +..... Owner died +EPERM POSIX - ++++++ Operation not permitted +EPFNOSUPPORT +++..+ Protocol family not supported +EPIPE POSIX - ++++++ Broken pipe +EPROCLIM .++... Too many processes +EPROCUNAVAIL .++... Bad procedure for program +EPROGMISMATCH .++... Program version wrong +EPROGUNAVAIL .++... RPC prog. not avail +EPROTO POSIX ++4... Protocol error +EPROTONOSUPPORT POSIX - +++ss+ Protocol not supported +EPROTOTYPE POSIX +++..+ Protocol wrong type for socket +EPWROFF ..+... Device power is off +ERANGE C89 - ++++++ Result too large +EREMCHG +..... Remote address changed +EREMOTE +++... Object is remote +EREMOTEIO +..... Remote I/O error +ERESTART +..... Interrupted system call should be restarted +ERFKILL +..... Operation not possible due to RF-kill +EROFS POSIX ++++++ Read-only file system +ERPCMISMATCH .++... RPC version wrong +ESHLIBVERS ..+... Shared library version mismatch +ESHUTDOWN +++..+ Cannot send after socket shutdown +ESOCKTNOSUPPORT +++... Socket type not supported +ESPIPE POSIX ++++++ Illegal seek +ESRCH POSIX ++++++ No such process +ESRMNT +..... Srmount error +ESTALE POSIX +++..+ Stale NFS file handle +ESTRPIPE +..... Streams pipe error +ETIME XSR +N4... Stream ioctl timeout +ETIMEDOUT POSIX - +++ss+ Connection timed out +ETOOMANYREFS +++... Too many references: cannot splice +ETXTBSY POSIX +++... Text file busy +EUCLEAN +..... Structure needs cleaning +EUNATCH +..... Protocol driver not attached +EUSERS +++... Too many users +EWOULDBLOCK POSIX +++..+ Operation would block +EXDEV POSIX ++++++ Cross-device link +EXFULL +..... Exchange full + +Notations: + +F: used in FFmpeg (-: a few times, +: a lot) + +SUSv3: Single Unix Specification, version 3 +SUSv4: Single Unix Specification, version 4 +XSR: XSI STREAMS (obsolete) + +OS: availability on some supported operating systems +L: GNU/Linux +B: BSD (F: FreeBSD, N: NetBSD) +M: MacOS X +W: Microsoft Windows (s: emulated with winsock, see libavformat/network.h) +w: Mingw32 (3.17) and Mingw64 (2.0.1) +b: BeOS diff --git a/doc/eval.texi b/doc/eval.texi index e1fd7ee..1ea89d6 100644 --- a/doc/eval.texi +++ b/doc/eval.texi @@ -1,7 +1,7 @@ @chapter Expression Evaluation @c man begin EXPRESSION EVALUATION -When evaluating an arithmetic expression, Libav uses an internal +When evaluating an arithmetic expression, FFmpeg uses an internal formula evaluator, implemented through the @file{libavutil/eval.h} interface. @@ -21,37 +21,84 @@ The following unary operators are available: @code{+}, @code{-}. The following functions are available: @table @option @item sinh(x) +Compute hyperbolic sine of @var{x}. + @item cosh(x) +Compute hyperbolic cosine of @var{x}. + @item tanh(x) +Compute hyperbolic tangent of @var{x}. + @item sin(x) +Compute sine of @var{x}. + @item cos(x) +Compute cosine of @var{x}. + @item tan(x) +Compute tangent of @var{x}. + @item atan(x) +Compute arctangent of @var{x}. + @item asin(x) +Compute arcsine of @var{x}. + @item acos(x) +Compute arccosine of @var{x}. + @item exp(x) +Compute exponential of @var{x} (with base @code{e}, the Euler's number). + @item log(x) +Compute natural logarithm of @var{x}. + @item abs(x) +Compute absolute value of @var{x}. + @item squish(x) +Compute expression @code{1/(1 + exp(4*x))}. + @item gauss(x) +Compute Gauss function of @var{x}, corresponding to +@code{exp(-x*x/2) / sqrt(2*PI)}. + @item isinf(x) Return 1.0 if @var{x} is +/-INFINITY, 0.0 otherwise. + @item isnan(x) Return 1.0 if @var{x} is NAN, 0.0 otherwise. @item mod(x, y) +Compute the remainder of division of @var{x} by @var{y}. + @item max(x, y) +Return the maximum between @var{x} and @var{y}. + @item min(x, y) +Return the maximum between @var{x} and @var{y}. + @item eq(x, y) +Return 1 if @var{x} and @var{y} are equivalent, 0 otherwise. + @item gte(x, y) +Return 1 if @var{x} is greater than or equal to @var{y}, 0 otherwise. + @item gt(x, y) +Return 1 if @var{x} is greater than @var{y}, 0 otherwise. + @item lte(x, y) +Return 1 if @var{x} is lesser than or equal to @var{y}, 0 otherwise. + @item lt(x, y) +Return 1 if @var{x} is lesser than @var{y}, 0 otherwise. + @item st(var, expr) Allow to store the value of the expression @var{expr} in an internal variable. @var{var} specifies the number of the variable where to store the value, and it is a value ranging from 0 to 9. The function returns the value stored in the internal variable. +Note, Variables are currently not shared between expressions. @item ld(var) Allow to load the value of the internal variable with number @@ -81,21 +128,70 @@ Compute the square root of @var{expr}. This is equivalent to @item not(expr) Return 1.0 if @var{expr} is zero, 0.0 otherwise. + +@item pow(x, y) +Compute the power of @var{x} elevated @var{y}, it is equivalent to +"(@var{x})^(@var{y})". + +@item random(x) +Return a pseudo random value between 0.0 and 1.0. @var{x} is the index of the +internal variable which will be used to save the seed/state. + +@item hypot(x, y) +This function is similar to the C function with the same name; it returns +"sqrt(@var{x}*@var{x} + @var{y}*@var{y})", the length of the hypotenuse of a +right triangle with sides of length @var{x} and @var{y}, or the distance of the +point (@var{x}, @var{y}) from the origin. + +@item gcd(x, y) +Return the greatest common divisor of @var{x} and @var{y}. If both @var{x} and +@var{y} are 0 or either or both are less than zero then behavior is undefined. + +@item if(x, y) +Evaluate @var{x}, and if the result is non-zero return the result of +the evaluation of @var{y}, return 0 otherwise. + +@item ifnot(x, y) +Evaluate @var{x}, and if the result is zero return the result of the +evaluation of @var{y}, return 0 otherwise. + +@item taylor(expr, x) taylor(expr, x, id) +Evaluate a taylor series at x. +expr represents the LD(id)-th derivates of f(x) at 0. If id is not specified +then 0 is assumed. +note, when you have the derivatives at y instead of 0 +taylor(expr, x-y) can be used +When the series does not converge the results are undefined. + +@item root(expr, max) +Finds x where f(x)=0 in the interval 0..max. +f() must be continuous or the result is undefined. +@end table + +The following constants are available: +@table @option +@item PI +area of the unit disc, approximately 3.14 +@item E +exp(1) (Euler's number), approximately 2.718 +@item PHI +golden ratio (1+sqrt(5))/2, approximately 1.618 @end table -Note that: +Assuming that an expression is considered "true" if it has a non-zero +value, note that: @code{*} works like AND @code{+} works like OR -thus +and the construct: @example if A then B else C @end example is equivalent to @example -A*B + not(A)*C +if(A,B) + ifnot(A,C) @end example In your C code, you can extend the list of unary and binary functions, diff --git a/doc/examples/Makefile b/doc/examples/Makefile new file mode 100644 index 0000000..36c949a --- /dev/null +++ b/doc/examples/Makefile @@ -0,0 +1,36 @@ +# use pkg-config for getting CFLAGS and LDLIBS +FFMPEG_LIBS= libavdevice \ + libavformat \ + libavfilter \ + libavcodec \ + libswresample \ + libswscale \ + libavutil \ + +CFLAGS += -Wall -O2 -g +CFLAGS := $(shell pkg-config --cflags $(FFMPEG_LIBS)) $(CFLAGS) +LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS)) $(LDLIBS) + +EXAMPLES= decoding_encoding \ + demuxing \ + filtering_video \ + filtering_audio \ + metadata \ + muxing \ + scaling_video \ + +OBJS=$(addsuffix .o,$(EXAMPLES)) + +# the following examples make explicit use of the math library +decoding_encoding: LDLIBS += -lm +muxing: LDLIBS += -lm + +.phony: all clean-test clean + +all: $(OBJS) $(EXAMPLES) + +clean-test: + $(RM) test*.pgm test.h264 test.mp2 test.sw test.mpg + +clean: clean-test + $(RM) $(EXAMPLES) $(OBJS) diff --git a/doc/examples/README b/doc/examples/README new file mode 100644 index 0000000..a461813 --- /dev/null +++ b/doc/examples/README @@ -0,0 +1,18 @@ +FFmpeg examples README +---------------------- + +Both following use cases rely on pkg-config and make, thus make sure +that you have them installed and working on your system. + + +1) Build the installed examples in a generic read/write user directory + +Copy to a read/write user directory and just use "make", it will link +to the libraries on your system, assuming the PKG_CONFIG_PATH is +correctly configured. + +2) Build the examples in-tree + +Assuming you are in the source FFmpeg checkout directory, you need to build +FFmpeg (no need to make install in any prefix). Then you can go into the +doc/examples and run a command such as PKG_CONFIG_PATH=pc-uninstalled make. diff --git a/doc/examples/decoding_encoding.c b/doc/examples/decoding_encoding.c new file mode 100644 index 0000000..0c6abb8 --- /dev/null +++ b/doc/examples/decoding_encoding.c @@ -0,0 +1,649 @@ +/* + * Copyright (c) 2001 Fabrice Bellard + * + * 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 + * libavcodec API use example. + * + * Note that libavcodec only handles codecs (mpeg, mpeg4, etc...), + * not file formats (avi, vob, mp4, mov, mkv, mxf, flv, mpegts, mpegps, etc...). See library 'libavformat' for the + * format handling + */ + +#include <math.h> + +#include <libavutil/opt.h> +#include <libavcodec/avcodec.h> +#include <libavutil/audioconvert.h> +#include <libavutil/common.h> +#include <libavutil/imgutils.h> +#include <libavutil/mathematics.h> +#include <libavutil/samplefmt.h> + +#define INBUF_SIZE 4096 +#define AUDIO_INBUF_SIZE 20480 +#define AUDIO_REFILL_THRESH 4096 + +/* check that a given sample format is supported by the encoder */ +static int check_sample_fmt(AVCodec *codec, enum AVSampleFormat sample_fmt) +{ + const enum AVSampleFormat *p = codec->sample_fmts; + + while (*p != AV_SAMPLE_FMT_NONE) { + if (*p == sample_fmt) + return 1; + p++; + } + return 0; +} + +/* just pick the highest supported samplerate */ +static int select_sample_rate(AVCodec *codec) +{ + const int *p; + int best_samplerate = 0; + + if (!codec->supported_samplerates) + return 44100; + + p = codec->supported_samplerates; + while (*p) { + best_samplerate = FFMAX(*p, best_samplerate); + p++; + } + return best_samplerate; +} + +/* select layout with the highest channel count */ +static int select_channel_layout(AVCodec *codec) +{ + const uint64_t *p; + uint64_t best_ch_layout = 0; + int best_nb_channells = 0; + + if (!codec->channel_layouts) + return AV_CH_LAYOUT_STEREO; + + p = codec->channel_layouts; + while (*p) { + int nb_channels = av_get_channel_layout_nb_channels(*p); + + if (nb_channels > best_nb_channells) { + best_ch_layout = *p; + best_nb_channells = nb_channels; + } + p++; + } + return best_ch_layout; +} + +/* + * Audio encoding example + */ +static void audio_encode_example(const char *filename) +{ + AVCodec *codec; + AVCodecContext *c= NULL; + AVFrame *frame; + AVPacket pkt; + int i, j, k, ret, got_output; + int buffer_size; + FILE *f; + uint16_t *samples; + float t, tincr; + + printf("Encode audio file %s\n", filename); + + /* find the MP2 encoder */ + codec = avcodec_find_encoder(AV_CODEC_ID_MP2); + if (!codec) { + fprintf(stderr, "Codec not found\n"); + exit(1); + } + + c = avcodec_alloc_context3(codec); + if (!c) { + fprintf(stderr, "Could not allocate audio codec context\n"); + exit(1); + } + + /* put sample parameters */ + c->bit_rate = 64000; + + /* check that the encoder supports s16 pcm input */ + c->sample_fmt = AV_SAMPLE_FMT_S16; + if (!check_sample_fmt(codec, c->sample_fmt)) { + fprintf(stderr, "Encoder does not support sample format %s", + av_get_sample_fmt_name(c->sample_fmt)); + exit(1); + } + + /* select other audio parameters supported by the encoder */ + c->sample_rate = select_sample_rate(codec); + c->channel_layout = select_channel_layout(codec); + c->channels = av_get_channel_layout_nb_channels(c->channel_layout); + + /* open it */ + if (avcodec_open2(c, codec, NULL) < 0) { + fprintf(stderr, "Could not open codec\n"); + exit(1); + } + + f = fopen(filename, "wb"); + if (!f) { + fprintf(stderr, "Could not open %s\n", filename); + exit(1); + } + + /* frame containing input raw audio */ + frame = avcodec_alloc_frame(); + if (!frame) { + fprintf(stderr, "Could not allocate audio frame\n"); + exit(1); + } + + frame->nb_samples = c->frame_size; + frame->format = c->sample_fmt; + frame->channel_layout = c->channel_layout; + + /* the codec gives us the frame size, in samples, + * we calculate the size of the samples buffer in bytes */ + buffer_size = av_samples_get_buffer_size(NULL, c->channels, c->frame_size, + c->sample_fmt, 0); + samples = av_malloc(buffer_size); + if (!samples) { + fprintf(stderr, "Could not allocate %d bytes for samples buffer\n", + buffer_size); + exit(1); + } + /* setup the data pointers in the AVFrame */ + ret = avcodec_fill_audio_frame(frame, c->channels, c->sample_fmt, + (const uint8_t*)samples, buffer_size, 0); + if (ret < 0) { + fprintf(stderr, "Could not setup audio frame\n"); + exit(1); + } + + /* encode a single tone sound */ + t = 0; + tincr = 2 * M_PI * 440.0 / c->sample_rate; + for(i=0;i<200;i++) { + av_init_packet(&pkt); + pkt.data = NULL; // packet data will be allocated by the encoder + pkt.size = 0; + + for (j = 0; j < c->frame_size; j++) { + samples[2*j] = (int)(sin(t) * 10000); + + for (k = 1; k < c->channels; k++) + samples[2*j + k] = samples[2*j]; + t += tincr; + } + /* encode the samples */ + ret = avcodec_encode_audio2(c, &pkt, frame, &got_output); + if (ret < 0) { + fprintf(stderr, "Error encoding audio frame\n"); + exit(1); + } + if (got_output) { + fwrite(pkt.data, 1, pkt.size, f); + av_free_packet(&pkt); + } + } + + /* get the delayed frames */ + for (got_output = 1; got_output; i++) { + ret = avcodec_encode_audio2(c, &pkt, NULL, &got_output); + if (ret < 0) { + fprintf(stderr, "Error encoding frame\n"); + exit(1); + } + + if (got_output) { + fwrite(pkt.data, 1, pkt.size, f); + av_free_packet(&pkt); + } + } + fclose(f); + + av_freep(&samples); + avcodec_free_frame(&frame); + avcodec_close(c); + av_free(c); +} + +/* + * Audio decoding. + */ +static void audio_decode_example(const char *outfilename, const char *filename) +{ + AVCodec *codec; + AVCodecContext *c= NULL; + int len; + FILE *f, *outfile; + uint8_t inbuf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; + AVPacket avpkt; + AVFrame *decoded_frame = NULL; + + av_init_packet(&avpkt); + + printf("Decode audio file %s to %s\n", filename, outfilename); + + /* find the mpeg audio decoder */ + codec = avcodec_find_decoder(AV_CODEC_ID_MP2); + if (!codec) { + fprintf(stderr, "Codec not found\n"); + exit(1); + } + + c = avcodec_alloc_context3(codec); + if (!c) { + fprintf(stderr, "Could not allocate audio codec context\n"); + exit(1); + } + + /* open it */ + if (avcodec_open2(c, codec, NULL) < 0) { + fprintf(stderr, "Could not open codec\n"); + exit(1); + } + + f = fopen(filename, "rb"); + if (!f) { + fprintf(stderr, "Could not open %s\n", filename); + exit(1); + } + outfile = fopen(outfilename, "wb"); + if (!outfile) { + av_free(c); + exit(1); + } + + /* decode until eof */ + avpkt.data = inbuf; + avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f); + + while (avpkt.size > 0) { + int got_frame = 0; + + if (!decoded_frame) { + if (!(decoded_frame = avcodec_alloc_frame())) { + fprintf(stderr, "Could not allocate audio frame\n"); + exit(1); + } + } else + avcodec_get_frame_defaults(decoded_frame); + + len = avcodec_decode_audio4(c, decoded_frame, &got_frame, &avpkt); + if (len < 0) { + fprintf(stderr, "Error while decoding\n"); + exit(1); + } + if (got_frame) { + /* if a frame has been decoded, output it */ + int data_size = av_samples_get_buffer_size(NULL, c->channels, + decoded_frame->nb_samples, + c->sample_fmt, 1); + fwrite(decoded_frame->data[0], 1, data_size, outfile); + } + avpkt.size -= len; + avpkt.data += len; + avpkt.dts = + avpkt.pts = AV_NOPTS_VALUE; + if (avpkt.size < AUDIO_REFILL_THRESH) { + /* Refill the input buffer, to avoid trying to decode + * incomplete frames. Instead of this, one could also use + * a parser, or use a proper container format through + * libavformat. */ + memmove(inbuf, avpkt.data, avpkt.size); + avpkt.data = inbuf; + len = fread(avpkt.data + avpkt.size, 1, + AUDIO_INBUF_SIZE - avpkt.size, f); + if (len > 0) + avpkt.size += len; + } + } + + fclose(outfile); + fclose(f); + + avcodec_close(c); + av_free(c); + avcodec_free_frame(&decoded_frame); +} + +/* + * Video encoding example + */ +static void video_encode_example(const char *filename, int codec_id) +{ + AVCodec *codec; + AVCodecContext *c= NULL; + int i, ret, x, y, got_output; + FILE *f; + AVFrame *frame; + AVPacket pkt; + uint8_t endcode[] = { 0, 0, 1, 0xb7 }; + + printf("Encode video file %s\n", filename); + + /* find the mpeg1 video encoder */ + codec = avcodec_find_encoder(codec_id); + if (!codec) { + fprintf(stderr, "Codec not found\n"); + exit(1); + } + + c = avcodec_alloc_context3(codec); + if (!c) { + fprintf(stderr, "Could not allocate video codec context\n"); + exit(1); + } + + /* put sample parameters */ + c->bit_rate = 400000; + /* resolution must be a multiple of two */ + c->width = 352; + c->height = 288; + /* frames per second */ + c->time_base= (AVRational){1,25}; + c->gop_size = 10; /* emit one intra frame every ten frames */ + c->max_b_frames=1; + c->pix_fmt = AV_PIX_FMT_YUV420P; + + if(codec_id == AV_CODEC_ID_H264) + av_opt_set(c->priv_data, "preset", "slow", 0); + + /* open it */ + if (avcodec_open2(c, codec, NULL) < 0) { + fprintf(stderr, "Could not open codec\n"); + exit(1); + } + + f = fopen(filename, "wb"); + if (!f) { + fprintf(stderr, "Could not open %s\n", filename); + exit(1); + } + + frame = avcodec_alloc_frame(); + if (!frame) { + fprintf(stderr, "Could not allocate video frame\n"); + exit(1); + } + frame->format = c->pix_fmt; + frame->width = c->width; + frame->height = c->height; + + /* the image can be allocated by any means and av_image_alloc() is + * just the most convenient way if av_malloc() is to be used */ + ret = av_image_alloc(frame->data, frame->linesize, c->width, c->height, + c->pix_fmt, 32); + if (ret < 0) { + fprintf(stderr, "Could not allocate raw picture buffer\n"); + exit(1); + } + + /* encode 1 second of video */ + for(i=0;i<25;i++) { + av_init_packet(&pkt); + pkt.data = NULL; // packet data will be allocated by the encoder + pkt.size = 0; + + fflush(stdout); + /* prepare a dummy image */ + /* Y */ + for(y=0;y<c->height;y++) { + for(x=0;x<c->width;x++) { + frame->data[0][y * frame->linesize[0] + x] = x + y + i * 3; + } + } + + /* Cb and Cr */ + for(y=0;y<c->height/2;y++) { + for(x=0;x<c->width/2;x++) { + frame->data[1][y * frame->linesize[1] + x] = 128 + y + i * 2; + frame->data[2][y * frame->linesize[2] + x] = 64 + x + i * 5; + } + } + + frame->pts = i; + + /* encode the image */ + ret = avcodec_encode_video2(c, &pkt, frame, &got_output); + if (ret < 0) { + fprintf(stderr, "Error encoding frame\n"); + exit(1); + } + + if (got_output) { + printf("Write frame %3d (size=%5d)\n", i, pkt.size); + fwrite(pkt.data, 1, pkt.size, f); + av_free_packet(&pkt); + } + } + + /* get the delayed frames */ + for (got_output = 1; got_output; i++) { + fflush(stdout); + + ret = avcodec_encode_video2(c, &pkt, NULL, &got_output); + if (ret < 0) { + fprintf(stderr, "Error encoding frame\n"); + exit(1); + } + + if (got_output) { + printf("Write frame %3d (size=%5d)\n", i, pkt.size); + fwrite(pkt.data, 1, pkt.size, f); + av_free_packet(&pkt); + } + } + + /* add sequence end code to have a real mpeg file */ + fwrite(endcode, 1, sizeof(endcode), f); + fclose(f); + + avcodec_close(c); + av_free(c); + av_freep(&frame->data[0]); + avcodec_free_frame(&frame); + printf("\n"); +} + +/* + * Video decoding example + */ + +static void pgm_save(unsigned char *buf, int wrap, int xsize, int ysize, + char *filename) +{ + FILE *f; + int i; + + f=fopen(filename,"w"); + fprintf(f,"P5\n%d %d\n%d\n",xsize,ysize,255); + for(i=0;i<ysize;i++) + fwrite(buf + i * wrap,1,xsize,f); + fclose(f); +} + +static int decode_write_frame(const char *outfilename, AVCodecContext *avctx, + AVFrame *frame, int *frame_count, AVPacket *pkt, int last) +{ + int len, got_frame; + char buf[1024]; + + len = avcodec_decode_video2(avctx, frame, &got_frame, pkt); + if (len < 0) { + fprintf(stderr, "Error while decoding frame %d\n", *frame_count); + return len; + } + if (got_frame) { + printf("Saving %sframe %3d\n", last ? "last " : "", *frame_count); + fflush(stdout); + + /* the picture is allocated by the decoder, no need to free it */ + snprintf(buf, sizeof(buf), outfilename, *frame_count); + pgm_save(frame->data[0], frame->linesize[0], + avctx->width, avctx->height, buf); + (*frame_count)++; + } + if (pkt->data) { + pkt->size -= len; + pkt->data += len; + } + return 0; +} + +static void video_decode_example(const char *outfilename, const char *filename) +{ + AVCodec *codec; + AVCodecContext *c= NULL; + int frame_count; + FILE *f; + AVFrame *frame; + uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; + AVPacket avpkt; + + av_init_packet(&avpkt); + + /* set end of buffer to 0 (this ensures that no overreading happens for damaged mpeg streams) */ + memset(inbuf + INBUF_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE); + + printf("Decode video file %s to %s\n", filename, outfilename); + + /* find the mpeg1 video decoder */ + codec = avcodec_find_decoder(AV_CODEC_ID_MPEG1VIDEO); + if (!codec) { + fprintf(stderr, "Codec not found\n"); + exit(1); + } + + c = avcodec_alloc_context3(codec); + if (!c) { + fprintf(stderr, "Could not allocate video codec context\n"); + exit(1); + } + + if(codec->capabilities&CODEC_CAP_TRUNCATED) + c->flags|= CODEC_FLAG_TRUNCATED; /* we do not send complete frames */ + + /* For some codecs, such as msmpeg4 and mpeg4, width and height + MUST be initialized there because this information is not + available in the bitstream. */ + + /* open it */ + if (avcodec_open2(c, codec, NULL) < 0) { + fprintf(stderr, "Could not open codec\n"); + exit(1); + } + + f = fopen(filename, "rb"); + if (!f) { + fprintf(stderr, "Could not open %s\n", filename); + exit(1); + } + + frame = avcodec_alloc_frame(); + if (!frame) { + fprintf(stderr, "Could not allocate video frame\n"); + exit(1); + } + + frame_count = 0; + for(;;) { + avpkt.size = fread(inbuf, 1, INBUF_SIZE, f); + if (avpkt.size == 0) + break; + + /* NOTE1: some codecs are stream based (mpegvideo, mpegaudio) + and this is the only method to use them because you cannot + know the compressed data size before analysing it. + + BUT some other codecs (msmpeg4, mpeg4) are inherently frame + based, so you must call them with all the data for one + frame exactly. You must also initialize 'width' and + 'height' before initializing them. */ + + /* NOTE2: some codecs allow the raw parameters (frame size, + sample rate) to be changed at any frame. We handle this, so + you should also take care of it */ + + /* here, we use a stream based decoder (mpeg1video), so we + feed decoder and see if it could decode a frame */ + avpkt.data = inbuf; + while (avpkt.size > 0) + if (decode_write_frame(outfilename, c, frame, &frame_count, &avpkt, 0) < 0) + exit(1); + } + + /* some codecs, such as MPEG, transmit the I and P frame with a + latency of one frame. You must do the following to have a + chance to get the last frame of the video */ + avpkt.data = NULL; + avpkt.size = 0; + decode_write_frame(outfilename, c, frame, &frame_count, &avpkt, 1); + + fclose(f); + + avcodec_close(c); + av_free(c); + avcodec_free_frame(&frame); + printf("\n"); +} + +int main(int argc, char **argv) +{ + const char *output_type; + + /* register all the codecs */ + avcodec_register_all(); + + if (argc < 2) { + printf("usage: %s output_type\n" + "API example program to decode/encode a media stream with libavcodec.\n" + "This program generates a synthetic stream and encodes it to a file\n" + "named test.h264, test.mp2 or test.mpg depending on output_type.\n" + "The encoded stream is then decoded and written to a raw data output.\n" + "output_type must be choosen between 'h264', 'mp2', 'mpg'.\n", + argv[0]); + return 1; + } + output_type = argv[1]; + + if (!strcmp(output_type, "h264")) { + video_encode_example("test.h264", AV_CODEC_ID_H264); + } else if (!strcmp(output_type, "mp2")) { + audio_encode_example("test.mp2"); + audio_decode_example("test.sw", "test.mp2"); + } else if (!strcmp(output_type, "mpg")) { + video_encode_example("test.mpg", AV_CODEC_ID_MPEG1VIDEO); + video_decode_example("test%02d.pgm", "test.mpg"); + } else { + fprintf(stderr, "Invalid output type '%s', choose between 'h264', 'mp2', or 'mpg'\n", + output_type); + return 1; + } + + return 0; +} diff --git a/doc/examples/demuxing.c b/doc/examples/demuxing.c new file mode 100644 index 0000000..0e0015e --- /dev/null +++ b/doc/examples/demuxing.c @@ -0,0 +1,339 @@ +/* + * Copyright (c) 2012 Stefano Sabatini + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * @file + * libavformat demuxing API use example. + * + * Show how to use the libavformat and libavcodec API to demux and + * decode audio and video data. + */ + +#include <libavutil/imgutils.h> +#include <libavutil/samplefmt.h> +#include <libavutil/timestamp.h> +#include <libavformat/avformat.h> + +static AVFormatContext *fmt_ctx = NULL; +static AVCodecContext *video_dec_ctx = NULL, *audio_dec_ctx; +static AVStream *video_stream = NULL, *audio_stream = NULL; +static const char *src_filename = NULL; +static const char *video_dst_filename = NULL; +static const char *audio_dst_filename = NULL; +static FILE *video_dst_file = NULL; +static FILE *audio_dst_file = NULL; + +static uint8_t *video_dst_data[4] = {NULL}; +static int video_dst_linesize[4]; +static int video_dst_bufsize; + +static uint8_t **audio_dst_data = NULL; +static int audio_dst_linesize; +static int audio_dst_bufsize; + +static int video_stream_idx = -1, audio_stream_idx = -1; +static AVFrame *frame = NULL; +static AVPacket pkt; +static int video_frame_count = 0; +static int audio_frame_count = 0; + +static int decode_packet(int *got_frame, int cached) +{ + int ret = 0; + + if (pkt.stream_index == video_stream_idx) { + /* decode video frame */ + ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt); + if (ret < 0) { + fprintf(stderr, "Error decoding video frame\n"); + return ret; + } + + if (*got_frame) { + printf("video_frame%s n:%d coded_n:%d pts:%s\n", + cached ? "(cached)" : "", + video_frame_count++, frame->coded_picture_number, + av_ts2timestr(frame->pts, &video_dec_ctx->time_base)); + + /* copy decoded frame to destination buffer: + * this is required since rawvideo expects non aligned data */ + av_image_copy(video_dst_data, video_dst_linesize, + (const uint8_t **)(frame->data), frame->linesize, + video_dec_ctx->pix_fmt, video_dec_ctx->width, video_dec_ctx->height); + + /* write to rawvideo file */ + fwrite(video_dst_data[0], 1, video_dst_bufsize, video_dst_file); + } + } else if (pkt.stream_index == audio_stream_idx) { + /* decode audio frame */ + ret = avcodec_decode_audio4(audio_dec_ctx, frame, got_frame, &pkt); + if (ret < 0) { + fprintf(stderr, "Error decoding audio frame\n"); + return ret; + } + + if (*got_frame) { + printf("audio_frame%s n:%d nb_samples:%d pts:%s\n", + cached ? "(cached)" : "", + audio_frame_count++, frame->nb_samples, + av_ts2timestr(frame->pts, &audio_dec_ctx->time_base)); + + ret = av_samples_alloc(audio_dst_data, &audio_dst_linesize, frame->channels, + frame->nb_samples, frame->format, 1); + if (ret < 0) { + fprintf(stderr, "Could not allocate audio buffer\n"); + return AVERROR(ENOMEM); + } + + /* TODO: extend return code of the av_samples_* functions so that this call is not needed */ + audio_dst_bufsize = + av_samples_get_buffer_size(NULL, frame->channels, + frame->nb_samples, frame->format, 1); + + /* copy audio data to destination buffer: + * this is required since rawaudio expects non aligned data */ + av_samples_copy(audio_dst_data, frame->data, 0, 0, + frame->nb_samples, frame->channels, frame->format); + + /* write to rawaudio file */ + fwrite(audio_dst_data[0], 1, audio_dst_bufsize, audio_dst_file); + av_freep(&audio_dst_data[0]); + } + } + + return ret; +} + +static int open_codec_context(int *stream_idx, + AVFormatContext *fmt_ctx, enum AVMediaType type) +{ + int ret; + AVStream *st; + AVCodecContext *dec_ctx = NULL; + AVCodec *dec = NULL; + + ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0); + if (ret < 0) { + fprintf(stderr, "Could not find %s stream in input file '%s'\n", + av_get_media_type_string(type), src_filename); + return ret; + } else { + *stream_idx = ret; + st = fmt_ctx->streams[*stream_idx]; + + /* find decoder for the stream */ + dec_ctx = st->codec; + dec = avcodec_find_decoder(dec_ctx->codec_id); + if (!dec) { + fprintf(stderr, "Failed to find %s codec\n", + av_get_media_type_string(type)); + return ret; + } + + if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) { + fprintf(stderr, "Failed to open %s codec\n", + av_get_media_type_string(type)); + return ret; + } + } + + return 0; +} + +static int get_format_from_sample_fmt(const char **fmt, + enum AVSampleFormat sample_fmt) +{ + int i; + struct sample_fmt_entry { + enum AVSampleFormat sample_fmt; const char *fmt_be, *fmt_le; + } sample_fmt_entries[] = { + { AV_SAMPLE_FMT_U8, "u8", "u8" }, + { AV_SAMPLE_FMT_S16, "s16be", "s16le" }, + { AV_SAMPLE_FMT_S32, "s32be", "s32le" }, + { AV_SAMPLE_FMT_FLT, "f32be", "f32le" }, + { AV_SAMPLE_FMT_DBL, "f64be", "f64le" }, + }; + *fmt = NULL; + + for (i = 0; i < FF_ARRAY_ELEMS(sample_fmt_entries); i++) { + struct sample_fmt_entry *entry = &sample_fmt_entries[i]; + if (sample_fmt == entry->sample_fmt) { + *fmt = AV_NE(entry->fmt_be, entry->fmt_le); + return 0; + } + } + + fprintf(stderr, + "sample format %s is not supported as output format\n", + av_get_sample_fmt_name(sample_fmt)); + return -1; +} + +int main (int argc, char **argv) +{ + int ret = 0, got_frame; + + if (argc != 4) { + fprintf(stderr, "usage: %s input_file video_output_file audio_output_file\n" + "API example program to show how to read frames from an input file.\n" + "This program reads frames from a file, decodes them, and writes decoded\n" + "video frames to a rawvideo file named video_output_file, and decoded\n" + "audio frames to a rawaudio file named audio_output_file.\n" + "\n", argv[0]); + exit(1); + } + src_filename = argv[1]; + video_dst_filename = argv[2]; + audio_dst_filename = argv[3]; + + /* register all formats and codecs */ + av_register_all(); + + /* open input file, and allocated format context */ + if (avformat_open_input(&fmt_ctx, src_filename, NULL, NULL) < 0) { + fprintf(stderr, "Could not open source file %s\n", src_filename); + exit(1); + } + + /* retrieve stream information */ + if (avformat_find_stream_info(fmt_ctx, NULL) < 0) { + fprintf(stderr, "Could not find stream information\n"); + exit(1); + } + + if (open_codec_context(&video_stream_idx, fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0) { + video_stream = fmt_ctx->streams[video_stream_idx]; + video_dec_ctx = video_stream->codec; + + video_dst_file = fopen(video_dst_filename, "wb"); + if (!video_dst_file) { + fprintf(stderr, "Could not open destination file %s\n", video_dst_filename); + ret = 1; + goto end; + } + + /* allocate image where the decoded image will be put */ + ret = av_image_alloc(video_dst_data, video_dst_linesize, + video_dec_ctx->width, video_dec_ctx->height, + video_dec_ctx->pix_fmt, 1); + if (ret < 0) { + fprintf(stderr, "Could not allocate raw video buffer\n"); + goto end; + } + video_dst_bufsize = ret; + } + + /* dump input information to stderr */ + av_dump_format(fmt_ctx, 0, src_filename, 0); + + if (open_codec_context(&audio_stream_idx, fmt_ctx, AVMEDIA_TYPE_AUDIO) >= 0) { + int nb_planes; + + audio_stream = fmt_ctx->streams[audio_stream_idx]; + audio_dec_ctx = audio_stream->codec; + audio_dst_file = fopen(audio_dst_filename, "wb"); + if (!audio_dst_file) { + fprintf(stderr, "Could not open destination file %s\n", video_dst_filename); + ret = 1; + goto end; + } + + nb_planes = av_sample_fmt_is_planar(audio_dec_ctx->sample_fmt) ? + audio_dec_ctx->channels : 1; + audio_dst_data = av_mallocz(sizeof(uint8_t *) * nb_planes); + if (!audio_dst_data) { + fprintf(stderr, "Could not allocate audio data buffers\n"); + ret = AVERROR(ENOMEM); + goto end; + } + } + + if (!audio_stream && !video_stream) { + fprintf(stderr, "Could not find audio or video stream in the input, aborting\n"); + ret = 1; + goto end; + } + + frame = avcodec_alloc_frame(); + if (!frame) { + fprintf(stderr, "Could not allocate frame\n"); + ret = AVERROR(ENOMEM); + goto end; + } + + /* initialize packet, set data to NULL, let the demuxer fill it */ + av_init_packet(&pkt); + pkt.data = NULL; + pkt.size = 0; + + if (video_stream) + printf("Demuxing video from file '%s' into '%s'\n", src_filename, video_dst_filename); + if (audio_stream) + printf("Demuxing video from file '%s' into '%s'\n", src_filename, audio_dst_filename); + + /* read frames from the file */ + while (av_read_frame(fmt_ctx, &pkt) >= 0) + decode_packet(&got_frame, 0); + + /* flush cached frames */ + pkt.data = NULL; + pkt.size = 0; + do { + decode_packet(&got_frame, 1); + } while (got_frame); + + printf("Demuxing succeeded.\n"); + + if (video_stream) { + printf("Play the output video file with the command:\n" + "ffplay -f rawvideo -pix_fmt %s -video_size %dx%d %s\n", + av_get_pix_fmt_name(video_dec_ctx->pix_fmt), video_dec_ctx->width, video_dec_ctx->height, + video_dst_filename); + } + + if (audio_stream) { + const char *fmt; + + if ((ret = get_format_from_sample_fmt(&fmt, audio_dec_ctx->sample_fmt) < 0)) + goto end; + printf("Play the output audio file with the command:\n" + "ffplay -f %s -ac %d -ar %d %s\n", + fmt, audio_dec_ctx->channels, audio_dec_ctx->sample_rate, + audio_dst_filename); + } + +end: + if (video_dec_ctx) + avcodec_close(video_dec_ctx); + if (audio_dec_ctx) + avcodec_close(audio_dec_ctx); + avformat_close_input(&fmt_ctx); + if (video_dst_file) + fclose(video_dst_file); + if (audio_dst_file) + fclose(audio_dst_file); + av_free(frame); + av_free(video_dst_data[0]); + av_free(audio_dst_data); + + return ret < 0; +} diff --git a/doc/examples/filtering_audio.c b/doc/examples/filtering_audio.c new file mode 100644 index 0000000..39f4450 --- /dev/null +++ b/doc/examples/filtering_audio.c @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2010 Nicolas George + * Copyright (c) 2011 Stefano Sabatini + * Copyright (c) 2012 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. + */ + +/** + * @file + * API example for audio decoding and filtering + */ + +#include <unistd.h> + +#include <libavcodec/avcodec.h> +#include <libavformat/avformat.h> +#include <libavfilter/avfiltergraph.h> +#include <libavfilter/avcodec.h> +#include <libavfilter/buffersink.h> +#include <libavfilter/buffersrc.h> + +const char *filter_descr = "aresample=8000,aconvert=s16:mono"; +const char *player = "ffplay -f s16le -ar 8000 -ac 1 -"; + +static AVFormatContext *fmt_ctx; +static AVCodecContext *dec_ctx; +AVFilterContext *buffersink_ctx; +AVFilterContext *buffersrc_ctx; +AVFilterGraph *filter_graph; +static int audio_stream_index = -1; + +static int open_input_file(const char *filename) +{ + int ret; + AVCodec *dec; + + if ((ret = avformat_open_input(&fmt_ctx, filename, NULL, NULL)) < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n"); + return ret; + } + + if ((ret = avformat_find_stream_info(fmt_ctx, NULL)) < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot find stream information\n"); + return ret; + } + + /* select the audio stream */ + ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, &dec, 0); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot find a audio stream in the input file\n"); + return ret; + } + audio_stream_index = ret; + dec_ctx = fmt_ctx->streams[audio_stream_index]->codec; + + /* init the audio decoder */ + if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot open audio decoder\n"); + return ret; + } + + return 0; +} + +static int init_filters(const char *filters_descr) +{ + char args[512]; + int ret; + AVFilter *abuffersrc = avfilter_get_by_name("abuffer"); + AVFilter *abuffersink = avfilter_get_by_name("ffabuffersink"); + AVFilterInOut *outputs = avfilter_inout_alloc(); + AVFilterInOut *inputs = avfilter_inout_alloc(); + const enum AVSampleFormat sample_fmts[] = { AV_SAMPLE_FMT_S16, -1 }; + AVABufferSinkParams *abuffersink_params; + const AVFilterLink *outlink; + AVRational time_base = fmt_ctx->streams[audio_stream_index]->time_base; + + filter_graph = avfilter_graph_alloc(); + + /* buffer audio source: the decoded frames from the decoder will be inserted here. */ + if (!dec_ctx->channel_layout) + dec_ctx->channel_layout = av_get_default_channel_layout(dec_ctx->channels); + snprintf(args, sizeof(args), + "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=0x%"PRIx64, + time_base.num, time_base.den, dec_ctx->sample_rate, + av_get_sample_fmt_name(dec_ctx->sample_fmt), dec_ctx->channel_layout); + ret = avfilter_graph_create_filter(&buffersrc_ctx, abuffersrc, "in", + args, NULL, filter_graph); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer source\n"); + return ret; + } + + /* buffer audio sink: to terminate the filter chain. */ + abuffersink_params = av_abuffersink_params_alloc(); + abuffersink_params->sample_fmts = sample_fmts; + ret = avfilter_graph_create_filter(&buffersink_ctx, abuffersink, "out", + NULL, abuffersink_params, filter_graph); + av_free(abuffersink_params); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer sink\n"); + return ret; + } + + /* Endpoints for the filter graph. */ + outputs->name = av_strdup("in"); + outputs->filter_ctx = buffersrc_ctx; + outputs->pad_idx = 0; + outputs->next = NULL; + + inputs->name = av_strdup("out"); + inputs->filter_ctx = buffersink_ctx; + inputs->pad_idx = 0; + inputs->next = NULL; + + if ((ret = avfilter_graph_parse(filter_graph, filters_descr, + &inputs, &outputs, NULL)) < 0) + return ret; + + if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0) + return ret; + + /* Print summary of the sink buffer + * Note: args buffer is reused to store channel layout string */ + outlink = buffersink_ctx->inputs[0]; + av_get_channel_layout_string(args, sizeof(args), -1, outlink->channel_layout); + av_log(NULL, AV_LOG_INFO, "Output: srate:%dHz fmt:%s chlayout:%s\n", + (int)outlink->sample_rate, + (char *)av_x_if_null(av_get_sample_fmt_name(outlink->format), "?"), + args); + + return 0; +} + +static void print_samplesref(AVFilterBufferRef *samplesref) +{ + const AVFilterBufferRefAudioProps *props = samplesref->audio; + const int n = props->nb_samples * av_get_channel_layout_nb_channels(props->channel_layout); + const uint16_t *p = (uint16_t*)samplesref->data[0]; + const uint16_t *p_end = p + n; + + while (p < p_end) { + fputc(*p & 0xff, stdout); + fputc(*p>>8 & 0xff, stdout); + p++; + } + fflush(stdout); +} + +int main(int argc, char **argv) +{ + int ret; + AVPacket packet; + AVFrame frame; + int got_frame; + + if (argc != 2) { + fprintf(stderr, "Usage: %s file | %s\n", argv[0], player); + exit(1); + } + + avcodec_register_all(); + av_register_all(); + avfilter_register_all(); + + if ((ret = open_input_file(argv[1])) < 0) + goto end; + if ((ret = init_filters(filter_descr)) < 0) + goto end; + + /* read all packets */ + while (1) { + AVFilterBufferRef *samplesref; + if ((ret = av_read_frame(fmt_ctx, &packet)) < 0) + break; + + if (packet.stream_index == audio_stream_index) { + avcodec_get_frame_defaults(&frame); + got_frame = 0; + ret = avcodec_decode_audio4(dec_ctx, &frame, &got_frame, &packet); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Error decoding audio\n"); + continue; + } + + if (got_frame) { + /* push the audio data from decoded frame into the filtergraph */ + if (av_buffersrc_add_frame(buffersrc_ctx, &frame, 0) < 0) { + av_log(NULL, AV_LOG_ERROR, "Error while feeding the audio filtergraph\n"); + break; + } + + /* pull filtered audio from the filtergraph */ + while (1) { + ret = av_buffersink_get_buffer_ref(buffersink_ctx, &samplesref, 0); + if(ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) + break; + if(ret < 0) + goto end; + if (samplesref) { + print_samplesref(samplesref); + avfilter_unref_bufferp(&samplesref); + } + } + } + } + av_free_packet(&packet); + } +end: + avfilter_graph_free(&filter_graph); + if (dec_ctx) + avcodec_close(dec_ctx); + avformat_close_input(&fmt_ctx); + + if (ret < 0 && ret != AVERROR_EOF) { + char buf[1024]; + av_strerror(ret, buf, sizeof(buf)); + fprintf(stderr, "Error occurred: %s\n", buf); + exit(1); + } + + exit(0); +} diff --git a/doc/examples/filtering_video.c b/doc/examples/filtering_video.c new file mode 100644 index 0000000..ca0266e --- /dev/null +++ b/doc/examples/filtering_video.c @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2010 Nicolas George + * Copyright (c) 2011 Stefano Sabatini + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * @file + * API example for decoding and filtering + */ + +#define _XOPEN_SOURCE 600 /* for usleep */ +#include <unistd.h> + +#include <libavcodec/avcodec.h> +#include <libavformat/avformat.h> +#include <libavfilter/avfiltergraph.h> +#include <libavfilter/avcodec.h> +#include <libavfilter/buffersink.h> +#include <libavfilter/buffersrc.h> + +const char *filter_descr = "scale=78:24"; + +static AVFormatContext *fmt_ctx; +static AVCodecContext *dec_ctx; +AVFilterContext *buffersink_ctx; +AVFilterContext *buffersrc_ctx; +AVFilterGraph *filter_graph; +static int video_stream_index = -1; +static int64_t last_pts = AV_NOPTS_VALUE; + +static int open_input_file(const char *filename) +{ + int ret; + AVCodec *dec; + + if ((ret = avformat_open_input(&fmt_ctx, filename, NULL, NULL)) < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n"); + return ret; + } + + if ((ret = avformat_find_stream_info(fmt_ctx, NULL)) < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot find stream information\n"); + return ret; + } + + /* select the video stream */ + ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, &dec, 0); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot find a video stream in the input file\n"); + return ret; + } + video_stream_index = ret; + dec_ctx = fmt_ctx->streams[video_stream_index]->codec; + + /* init the video decoder */ + if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot open video decoder\n"); + return ret; + } + + return 0; +} + +static int init_filters(const char *filters_descr) +{ + char args[512]; + int ret; + AVFilter *buffersrc = avfilter_get_by_name("buffer"); + AVFilter *buffersink = avfilter_get_by_name("ffbuffersink"); + AVFilterInOut *outputs = avfilter_inout_alloc(); + AVFilterInOut *inputs = avfilter_inout_alloc(); + enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE }; + AVBufferSinkParams *buffersink_params; + + filter_graph = avfilter_graph_alloc(); + + /* buffer video source: the decoded frames from the decoder will be inserted here. */ + snprintf(args, sizeof(args), + "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d", + dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt, + dec_ctx->time_base.num, dec_ctx->time_base.den, + dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den); + + ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in", + args, NULL, filter_graph); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot create buffer source\n"); + return ret; + } + + /* buffer video sink: to terminate the filter chain. */ + buffersink_params = av_buffersink_params_alloc(); + buffersink_params->pixel_fmts = pix_fmts; + ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out", + NULL, buffersink_params, filter_graph); + av_free(buffersink_params); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot create buffer sink\n"); + return ret; + } + + /* Endpoints for the filter graph. */ + outputs->name = av_strdup("in"); + outputs->filter_ctx = buffersrc_ctx; + outputs->pad_idx = 0; + outputs->next = NULL; + + inputs->name = av_strdup("out"); + inputs->filter_ctx = buffersink_ctx; + inputs->pad_idx = 0; + inputs->next = NULL; + + if ((ret = avfilter_graph_parse(filter_graph, filters_descr, + &inputs, &outputs, NULL)) < 0) + return ret; + + if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0) + return ret; + return 0; +} + +static void display_picref(AVFilterBufferRef *picref, AVRational time_base) +{ + int x, y; + uint8_t *p0, *p; + int64_t delay; + + if (picref->pts != AV_NOPTS_VALUE) { + if (last_pts != AV_NOPTS_VALUE) { + /* sleep roughly the right amount of time; + * usleep is in microseconds, just like AV_TIME_BASE. */ + delay = av_rescale_q(picref->pts - last_pts, + time_base, AV_TIME_BASE_Q); + if (delay > 0 && delay < 1000000) + usleep(delay); + } + last_pts = picref->pts; + } + + /* Trivial ASCII grayscale display. */ + p0 = picref->data[0]; + puts("\033c"); + for (y = 0; y < picref->video->h; y++) { + p = p0; + for (x = 0; x < picref->video->w; x++) + putchar(" .-+#"[*(p++) / 52]); + putchar('\n'); + p0 += picref->linesize[0]; + } + fflush(stdout); +} + +int main(int argc, char **argv) +{ + int ret; + AVPacket packet; + AVFrame frame; + int got_frame; + + if (argc != 2) { + fprintf(stderr, "Usage: %s file\n", argv[0]); + exit(1); + } + + avcodec_register_all(); + av_register_all(); + avfilter_register_all(); + + if ((ret = open_input_file(argv[1])) < 0) + goto end; + if ((ret = init_filters(filter_descr)) < 0) + goto end; + + /* read all packets */ + while (1) { + AVFilterBufferRef *picref; + if ((ret = av_read_frame(fmt_ctx, &packet)) < 0) + break; + + if (packet.stream_index == video_stream_index) { + avcodec_get_frame_defaults(&frame); + got_frame = 0; + ret = avcodec_decode_video2(dec_ctx, &frame, &got_frame, &packet); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Error decoding video\n"); + break; + } + + if (got_frame) { + frame.pts = av_frame_get_best_effort_timestamp(&frame); + + /* push the decoded frame into the filtergraph */ + if (av_buffersrc_add_frame(buffersrc_ctx, &frame, 0) < 0) { + av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n"); + break; + } + + /* pull filtered pictures from the filtergraph */ + while (1) { + ret = av_buffersink_get_buffer_ref(buffersink_ctx, &picref, 0); + if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) + break; + if (ret < 0) + goto end; + + if (picref) { + display_picref(picref, buffersink_ctx->inputs[0]->time_base); + avfilter_unref_bufferp(&picref); + } + } + } + } + av_free_packet(&packet); + } +end: + avfilter_graph_free(&filter_graph); + if (dec_ctx) + avcodec_close(dec_ctx); + avformat_close_input(&fmt_ctx); + + if (ret < 0 && ret != AVERROR_EOF) { + char buf[1024]; + av_strerror(ret, buf, sizeof(buf)); + fprintf(stderr, "Error occurred: %s\n", buf); + exit(1); + } + + exit(0); +} diff --git a/doc/examples/metadata.c b/doc/examples/metadata.c new file mode 100644 index 0000000..9f35912 --- /dev/null +++ b/doc/examples/metadata.c @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2011 Reinhard Tartler + * + * 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 + * Shows how the metadata API can be used in application programs. + */ + +#include <stdio.h> + +#include <libavformat/avformat.h> +#include <libavutil/dict.h> + +int main (int argc, char **argv) +{ + AVFormatContext *fmt_ctx = NULL; + AVDictionaryEntry *tag = NULL; + int ret; + + if (argc != 2) { + printf("usage: %s <input_file>\n" + "example program to demonstrate the use of the libavformat metadata API.\n" + "\n", argv[0]); + return 1; + } + + av_register_all(); + if ((ret = avformat_open_input(&fmt_ctx, argv[1], NULL, NULL))) + return ret; + + while ((tag = av_dict_get(fmt_ctx->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) + printf("%s=%s\n", tag->key, tag->value); + + avformat_close_input(&fmt_ctx); + return 0; +} diff --git a/doc/examples/muxing.c b/doc/examples/muxing.c new file mode 100644 index 0000000..f0a5f63 --- /dev/null +++ b/doc/examples/muxing.c @@ -0,0 +1,509 @@ +/* + * Copyright (c) 2003 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * @file + * libavformat API example. + * + * Output a media file in any supported libavformat format. + * The default codecs are used. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <math.h> + +#include <libavutil/mathematics.h> +#include <libavformat/avformat.h> +#include <libswscale/swscale.h> + +/* 5 seconds stream duration */ +#define STREAM_DURATION 200.0 +#define STREAM_FRAME_RATE 25 /* 25 images/s */ +#define STREAM_NB_FRAMES ((int)(STREAM_DURATION * STREAM_FRAME_RATE)) +#define STREAM_PIX_FMT AV_PIX_FMT_YUV420P /* default pix_fmt */ + +static int sws_flags = SWS_BICUBIC; + +/**************************************************************/ +/* audio output */ + +static float t, tincr, tincr2; +static int16_t *samples; +static int audio_input_frame_size; + +/* Add an output stream. */ +static AVStream *add_stream(AVFormatContext *oc, AVCodec **codec, + enum AVCodecID codec_id) +{ + AVCodecContext *c; + AVStream *st; + + /* find the encoder */ + *codec = avcodec_find_encoder(codec_id); + if (!(*codec)) { + fprintf(stderr, "Could not find codec\n"); + exit(1); + } + + st = avformat_new_stream(oc, *codec); + if (!st) { + fprintf(stderr, "Could not allocate stream\n"); + exit(1); + } + st->id = oc->nb_streams-1; + c = st->codec; + + switch ((*codec)->type) { + case AVMEDIA_TYPE_AUDIO: + st->id = 1; + c->sample_fmt = AV_SAMPLE_FMT_S16; + c->bit_rate = 64000; + c->sample_rate = 44100; + c->channels = 2; + break; + + case AVMEDIA_TYPE_VIDEO: + avcodec_get_context_defaults3(c, *codec); + c->codec_id = codec_id; + + c->bit_rate = 400000; + /* Resolution must be a multiple of two. */ + c->width = 352; + c->height = 288; + /* timebase: This is the fundamental unit of time (in seconds) in terms + * of which frame timestamps are represented. For fixed-fps content, + * timebase should be 1/framerate and timestamp increments should be + * identical to 1. */ + c->time_base.den = STREAM_FRAME_RATE; + c->time_base.num = 1; + c->gop_size = 12; /* emit one intra frame every twelve frames at most */ + c->pix_fmt = STREAM_PIX_FMT; + if (c->codec_id == AV_CODEC_ID_MPEG2VIDEO) { + /* just for testing, we also add B frames */ + c->max_b_frames = 2; + } + if (c->codec_id == AV_CODEC_ID_MPEG1VIDEO) { + /* Needed to avoid using macroblocks in which some coeffs overflow. + * This does not happen with normal video, it just happens here as + * the motion of the chroma plane does not match the luma plane. */ + c->mb_decision = 2; + } + break; + + default: + break; + } + + /* Some formats want stream headers to be separate. */ + if (oc->oformat->flags & AVFMT_GLOBALHEADER) + c->flags |= CODEC_FLAG_GLOBAL_HEADER; + + return st; +} + +/**************************************************************/ +/* audio output */ + +static float t, tincr, tincr2; +static int16_t *samples; +static int audio_input_frame_size; + +static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st) +{ + AVCodecContext *c; + + c = st->codec; + + /* open it */ + if (avcodec_open2(c, codec, NULL) < 0) { + fprintf(stderr, "Could not open audio codec\n"); + exit(1); + } + + /* init signal generator */ + t = 0; + tincr = 2 * M_PI * 110.0 / c->sample_rate; + /* increment frequency by 110 Hz per second */ + tincr2 = 2 * M_PI * 110.0 / c->sample_rate / c->sample_rate; + + if (c->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE) + audio_input_frame_size = 10000; + else + audio_input_frame_size = c->frame_size; + samples = av_malloc(audio_input_frame_size * + av_get_bytes_per_sample(c->sample_fmt) * + c->channels); + if (!samples) { + fprintf(stderr, "Could not allocate audio samples buffer\n"); + exit(1); + } +} + +/* Prepare a 16 bit dummy audio frame of 'frame_size' samples and + * 'nb_channels' channels. */ +static void get_audio_frame(int16_t *samples, int frame_size, int nb_channels) +{ + int j, i, v; + int16_t *q; + + q = samples; + for (j = 0; j < frame_size; j++) { + v = (int)(sin(t) * 10000); + for (i = 0; i < nb_channels; i++) + *q++ = v; + t += tincr; + tincr += tincr2; + } +} + +static void write_audio_frame(AVFormatContext *oc, AVStream *st) +{ + AVCodecContext *c; + AVPacket pkt = { 0 }; // data and size must be 0; + AVFrame *frame = avcodec_alloc_frame(); + int got_packet, ret; + + av_init_packet(&pkt); + c = st->codec; + + get_audio_frame(samples, audio_input_frame_size, c->channels); + frame->nb_samples = audio_input_frame_size; + avcodec_fill_audio_frame(frame, c->channels, c->sample_fmt, + (uint8_t *)samples, + audio_input_frame_size * + av_get_bytes_per_sample(c->sample_fmt) * + c->channels, 1); + + ret = avcodec_encode_audio2(c, &pkt, frame, &got_packet); + if (ret < 0) { + fprintf(stderr, "Error encoding audio frame\n"); + exit(1); + } + + if (!got_packet) + return; + + pkt.stream_index = st->index; + + /* Write the compressed frame to the media file. */ + if (av_interleaved_write_frame(oc, &pkt) != 0) { + fprintf(stderr, "Error while writing audio frame\n"); + exit(1); + } + avcodec_free_frame(&frame); +} + +static void close_audio(AVFormatContext *oc, AVStream *st) +{ + avcodec_close(st->codec); + + av_free(samples); +} + +/**************************************************************/ +/* video output */ + +static AVFrame *frame; +static AVPicture src_picture, dst_picture; +static int frame_count; + +static void open_video(AVFormatContext *oc, AVCodec *codec, AVStream *st) +{ + int ret; + AVCodecContext *c = st->codec; + + /* open the codec */ + if (avcodec_open2(c, codec, NULL) < 0) { + fprintf(stderr, "Could not open video codec\n"); + exit(1); + } + + /* allocate and init a re-usable frame */ + frame = avcodec_alloc_frame(); + if (!frame) { + fprintf(stderr, "Could not allocate video frame\n"); + exit(1); + } + + /* Allocate the encoded raw picture. */ + ret = avpicture_alloc(&dst_picture, c->pix_fmt, c->width, c->height); + if (ret < 0) { + fprintf(stderr, "Could not allocate picture\n"); + exit(1); + } + + /* If the output format is not YUV420P, then a temporary YUV420P + * picture is needed too. It is then converted to the required + * output format. */ + if (c->pix_fmt != AV_PIX_FMT_YUV420P) { + ret = avpicture_alloc(&src_picture, AV_PIX_FMT_YUV420P, c->width, c->height); + if (ret < 0) { + fprintf(stderr, "Could not allocate temporary picture\n"); + exit(1); + } + } + + /* copy data and linesize picture pointers to frame */ + *((AVPicture *)frame) = dst_picture; +} + +/* Prepare a dummy image. */ +static void fill_yuv_image(AVPicture *pict, int frame_index, + int width, int height) +{ + int x, y, i; + + i = frame_index; + + /* Y */ + for (y = 0; y < height; y++) + for (x = 0; x < width; x++) + pict->data[0][y * pict->linesize[0] + x] = x + y + i * 3; + + /* Cb and Cr */ + for (y = 0; y < height / 2; y++) { + for (x = 0; x < width / 2; x++) { + pict->data[1][y * pict->linesize[1] + x] = 128 + y + i * 2; + pict->data[2][y * pict->linesize[2] + x] = 64 + x + i * 5; + } + } +} + +static void write_video_frame(AVFormatContext *oc, AVStream *st) +{ + int ret; + static struct SwsContext *sws_ctx; + AVCodecContext *c = st->codec; + + if (frame_count >= STREAM_NB_FRAMES) { + /* No more frames to compress. The codec has a latency of a few + * frames if using B-frames, so we get the last frames by + * passing the same picture again. */ + } else { + if (c->pix_fmt != AV_PIX_FMT_YUV420P) { + /* as we only generate a YUV420P picture, we must convert it + * to the codec pixel format if needed */ + if (!sws_ctx) { + sws_ctx = sws_getContext(c->width, c->height, AV_PIX_FMT_YUV420P, + c->width, c->height, c->pix_fmt, + sws_flags, NULL, NULL, NULL); + if (!sws_ctx) { + fprintf(stderr, + "Could not initialize the conversion context\n"); + exit(1); + } + } + fill_yuv_image(&src_picture, frame_count, c->width, c->height); + sws_scale(sws_ctx, + (const uint8_t * const *)src_picture.data, src_picture.linesize, + 0, c->height, dst_picture.data, dst_picture.linesize); + } else { + fill_yuv_image(&dst_picture, frame_count, c->width, c->height); + } + } + + if (oc->oformat->flags & AVFMT_RAWPICTURE) { + /* Raw video case - directly store the picture in the packet */ + AVPacket pkt; + av_init_packet(&pkt); + + pkt.flags |= AV_PKT_FLAG_KEY; + pkt.stream_index = st->index; + pkt.data = dst_picture.data[0]; + pkt.size = sizeof(AVPicture); + + ret = av_interleaved_write_frame(oc, &pkt); + } else { + /* encode the image */ + AVPacket pkt; + int got_output; + + av_init_packet(&pkt); + pkt.data = NULL; // packet data will be allocated by the encoder + pkt.size = 0; + + ret = avcodec_encode_video2(c, &pkt, frame, &got_output); + if (ret < 0) { + fprintf(stderr, "Error encoding video frame\n"); + exit(1); + } + + /* If size is zero, it means the image was buffered. */ + if (got_output) { + if (c->coded_frame->key_frame) + pkt.flags |= AV_PKT_FLAG_KEY; + + pkt.stream_index = st->index; + + /* Write the compressed frame to the media file. */ + ret = av_interleaved_write_frame(oc, &pkt); + } else { + ret = 0; + } + } + if (ret != 0) { + fprintf(stderr, "Error while writing video frame\n"); + exit(1); + } + frame_count++; +} + +static void close_video(AVFormatContext *oc, AVStream *st) +{ + avcodec_close(st->codec); + av_free(src_picture.data[0]); + av_free(dst_picture.data[0]); + av_free(frame); +} + +/**************************************************************/ +/* media file output */ + +int main(int argc, char **argv) +{ + const char *filename; + AVOutputFormat *fmt; + AVFormatContext *oc; + AVStream *audio_st, *video_st; + AVCodec *audio_codec, *video_codec; + double audio_pts, video_pts; + int i; + + /* Initialize libavcodec, and register all codecs and formats. */ + av_register_all(); + + if (argc != 2) { + printf("usage: %s output_file\n" + "API example program to output a media file with libavformat.\n" + "This program generates a synthetic audio and video stream, encodes and\n" + "muxes them into a file named output_file.\n" + "The output format is automatically guessed according to the file extension.\n" + "Raw images can also be output by using '%%d' in the filename.\n" + "\n", argv[0]); + return 1; + } + + filename = argv[1]; + + /* allocate the output media context */ + avformat_alloc_output_context2(&oc, NULL, NULL, filename); + if (!oc) { + printf("Could not deduce output format from file extension: using MPEG.\n"); + avformat_alloc_output_context2(&oc, NULL, "mpeg", filename); + } + if (!oc) { + return 1; + } + fmt = oc->oformat; + + /* Add the audio and video streams using the default format codecs + * and initialize the codecs. */ + video_st = NULL; + audio_st = NULL; + + if (fmt->video_codec != AV_CODEC_ID_NONE) { + video_st = add_stream(oc, &video_codec, fmt->video_codec); + } + if (fmt->audio_codec != AV_CODEC_ID_NONE) { + audio_st = add_stream(oc, &audio_codec, fmt->audio_codec); + } + + /* Now that all the parameters are set, we can open the audio and + * video codecs and allocate the necessary encode buffers. */ + if (video_st) + open_video(oc, video_codec, video_st); + if (audio_st) + open_audio(oc, audio_codec, audio_st); + + av_dump_format(oc, 0, filename, 1); + + /* open the output file, if needed */ + if (!(fmt->flags & AVFMT_NOFILE)) { + if (avio_open(&oc->pb, filename, AVIO_FLAG_WRITE) < 0) { + fprintf(stderr, "Could not open '%s'\n", filename); + return 1; + } + } + + /* Write the stream header, if any. */ + if (avformat_write_header(oc, NULL) < 0) { + fprintf(stderr, "Error occurred when opening output file\n"); + return 1; + } + + if (frame) + frame->pts = 0; + for (;;) { + /* Compute current audio and video time. */ + if (audio_st) + audio_pts = (double)audio_st->pts.val * audio_st->time_base.num / audio_st->time_base.den; + else + audio_pts = 0.0; + + if (video_st) + video_pts = (double)video_st->pts.val * video_st->time_base.num / + video_st->time_base.den; + else + video_pts = 0.0; + + if ((!audio_st || audio_pts >= STREAM_DURATION) && + (!video_st || video_pts >= STREAM_DURATION)) + break; + + /* write interleaved audio and video frames */ + if (!video_st || (video_st && audio_st && audio_pts < video_pts)) { + write_audio_frame(oc, audio_st); + } else { + write_video_frame(oc, video_st); + frame->pts += av_rescale_q(1, video_st->codec->time_base, video_st->time_base); + } + } + + /* Write the trailer, if any. The trailer must be written before you + * close the CodecContexts open when you wrote the header; otherwise + * av_write_trailer() may try to use memory that was freed on + * av_codec_close(). */ + av_write_trailer(oc); + + /* Close each codec. */ + if (video_st) + close_video(oc, video_st); + if (audio_st) + close_audio(oc, audio_st); + + /* Free the streams. */ + for (i = 0; i < oc->nb_streams; i++) { + av_freep(&oc->streams[i]->codec); + av_freep(&oc->streams[i]); + } + + if (!(fmt->flags & AVFMT_NOFILE)) + /* Close the output file. */ + avio_close(oc->pb); + + /* free the stream */ + av_free(oc); + + return 0; +} diff --git a/doc/examples/scaling_video.c b/doc/examples/scaling_video.c new file mode 100644 index 0000000..660be2f --- /dev/null +++ b/doc/examples/scaling_video.c @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2012 Stefano Sabatini + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * @file + * libswscale API use example. + */ + +#include <libavutil/imgutils.h> +#include <libavutil/parseutils.h> +#include <libswscale/swscale.h> + +static void fill_yuv_image(uint8_t *data[4], int linesize[4], + int width, int height, int frame_index) +{ + int x, y; + + /* Y */ + for (y = 0; y < height; y++) + for (x = 0; x < width; x++) + data[0][y * linesize[0] + x] = x + y + frame_index * 3; + + /* Cb and Cr */ + for (y = 0; y < height / 2; y++) { + for (x = 0; x < width / 2; x++) { + data[1][y * linesize[1] + x] = 128 + y + frame_index * 2; + data[2][y * linesize[2] + x] = 64 + x + frame_index * 5; + } + } +} + +int main(int argc, char **argv) +{ + uint8_t *src_data[4], *dst_data[4]; + int src_linesize[4], dst_linesize[4]; + int src_w = 320, src_h = 240, dst_w, dst_h; + enum AVPixelFormat src_pix_fmt = AV_PIX_FMT_YUV420P, dst_pix_fmt = AV_PIX_FMT_RGB24; + const char *dst_size = NULL; + const char *dst_filename = NULL; + FILE *dst_file; + int dst_bufsize; + struct SwsContext *sws_ctx; + int i, ret; + + if (argc != 3) { + fprintf(stderr, "Usage: %s output_file output_size\n" + "API example program to show how to scale an image with libswscale.\n" + "This program generates a series of pictures, rescales them to the given " + "output_size and saves them to an output file named output_file\n." + "\n", argv[0]); + exit(1); + } + dst_filename = argv[1]; + dst_size = argv[2]; + + if (av_parse_video_size(&dst_w, &dst_h, dst_size) < 0) { + fprintf(stderr, + "Invalid size '%s', must be in the form WxH or a valid size abbreviation\n", + dst_size); + exit(1); + } + + dst_file = fopen(dst_filename, "wb"); + if (!dst_file) { + fprintf(stderr, "Could not open destination file %s\n", dst_filename); + exit(1); + } + + /* create scaling context */ + sws_ctx = sws_getContext(src_w, src_h, src_pix_fmt, + dst_w, dst_h, dst_pix_fmt, + SWS_BILINEAR, NULL, NULL, NULL); + if (!sws_ctx) { + fprintf(stderr, + "Impossible to create scale context for the conversion " + "fmt:%s s:%dx%d -> fmt:%s s:%dx%d\n", + av_get_pix_fmt_name(src_pix_fmt), src_w, src_h, + av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h); + ret = AVERROR(EINVAL); + goto end; + } + + /* allocate source and destination image buffers */ + if ((ret = av_image_alloc(src_data, src_linesize, + src_w, src_h, src_pix_fmt, 16)) < 0) { + fprintf(stderr, "Could not allocate source image\n"); + goto end; + } + + /* buffer is going to be written to rawvideo file, no alignmnet */ + if ((ret = av_image_alloc(dst_data, dst_linesize, + dst_w, dst_h, dst_pix_fmt, 1)) < 0) { + fprintf(stderr, "Could not allocate destination image\n"); + goto end; + } + dst_bufsize = ret; + + for (i = 0; i < 100; i++) { + /* generate synthetic video */ + fill_yuv_image(src_data, src_linesize, src_w, src_h, i); + + /* convert to destination format */ + sws_scale(sws_ctx, (const uint8_t * const*)src_data, + src_linesize, 0, src_h, dst_data, dst_linesize); + + /* write scaled image to file */ + fwrite(dst_data[0], 1, dst_bufsize, dst_file); + } + + fprintf(stderr, "Scaling succeeded. Play the output file with the command:\n" + "ffplay -f rawvideo -pix_fmt %s -video_size %dx%d %s\n", + av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h, dst_filename); + +end: + if (dst_file) + fclose(dst_file); + av_freep(&src_data[0]); + av_freep(&dst_data[0]); + sws_freeContext(sws_ctx); + return ret < 0; +} diff --git a/doc/faq.texi b/doc/faq.texi index 088ca03..1158091 100644 --- a/doc/faq.texi +++ b/doc/faq.texi @@ -1,8 +1,8 @@ \input texinfo @c -*- texinfo -*- -@settitle Libav FAQ +@settitle FFmpeg FAQ @titlepage -@center @titlefont{Libav FAQ} +@center @titlefont{FFmpeg FAQ} @end titlepage @top @@ -11,23 +11,23 @@ @chapter General Questions -@section Why doesn't Libav support feature [xyz]? +@section Why doesn't FFmpeg support feature [xyz]? -Because no one has taken on that task yet. Libav development is +Because no one has taken on that task yet. FFmpeg development is driven by the tasks that are important to the individual developers. If there is a feature that is important to you, the best way to get it implemented is to undertake the task yourself or sponsor a developer. -@section Libav does not support codec XXX. Can you include a Windows DLL loader to support it? +@section FFmpeg does not support codec XXX. Can you include a Windows DLL loader to support it? No. Windows DLLs are not portable, bloated and often slow. -Moreover Libav strives to support all codecs natively. +Moreover FFmpeg strives to support all codecs natively. A DLL loader is not conducive to that goal. -@section I cannot read this file although this format seems to be supported by avconv. +@section I cannot read this file although this format seems to be supported by ffmpeg. -Even if avconv can read the container format, it may not support all its -codecs. Please consult the supported codec list in the avconv +Even if ffmpeg can read the container format, it may not support all its +codecs. Please consult the supported codec list in the ffmpeg documentation. @section Which codecs are supported by Windows? @@ -81,6 +81,12 @@ problem and an NP-hard problem... @chapter Usage +@section ffmpeg does not work; what is wrong? + +Try a @code{make distclean} in the ffmpeg source directory before the build. +If this does not help see +(@url{http://ffmpeg.org/bugreports.html}). + @section How do I encode single pictures into movies? First, rename your pictures to follow a numerical sequence. @@ -88,7 +94,7 @@ For example, img1.jpg, img2.jpg, img3.jpg,... Then you may run: @example - avconv -f image2 -i img%d.jpg /tmp/a.mpg + ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg @end example Notice that @samp{%d} is replaced by the image number. @@ -111,17 +117,17 @@ If you want to sequence them by oldest modified first, substitute Then run: @example - avconv -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg + ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg @end example -The same logic is used for any image format that avconv reads. +The same logic is used for any image format that ffmpeg reads. @section How do I encode movie to single pictures? Use: @example - avconv -i movie.mpg movie%d.jpg + ffmpeg -i movie.mpg movie%d.jpg @end example The @file{movie.mpg} used as input will be converted to @@ -137,7 +143,7 @@ to force the encoding. Applying that to the previous example: @example - avconv -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg + ffmpeg -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg @end example Beware that there is no "jpeg" codec. Use "mjpeg" instead. @@ -156,12 +162,12 @@ Use @file{-} as file name. Try '-f image2 test%d.jpg'. -@section Why can I not change the framerate? +@section Why can I not change the frame rate? -Some codecs, like MPEG-1/2, only allow a small number of fixed framerates. +Some codecs, like MPEG-1/2, only allow a small number of fixed frame rates. Choose a different codec with the -c:v command line option. -@section How do I encode Xvid or DivX video with avconv? +@section How do I encode Xvid or DivX video with ffmpeg? Both Xvid and DivX (version 4+) are implementations of the ISO MPEG-4 standard (note that there are many other coding formats that use this @@ -182,14 +188,14 @@ things to try: '-bf 2', '-flags qprd', '-flags mv0', '-flags skiprd'. but beware the '-g 100' might cause problems with some decoders. Things to try: '-bf 2', '-flags qprd', '-flags mv0', '-flags skiprd. -@section Interlaced video looks very bad when encoded with avconv, what is wrong? +@section Interlaced video looks very bad when encoded with ffmpeg, what is wrong? You should use '-flags +ilme+ildct' and maybe '-flags +alt' for interlaced material, and try '-top 0/1' if the result looks really messed-up. @section How can I read DirectShow files? -If you have built Libav with @code{./configure --enable-avisynth} +If you have built FFmpeg with @code{./configure --enable-avisynth} (only possible on MinGW/Cygwin platforms), then you may use any file that DirectShow can read as input. @@ -197,9 +203,9 @@ Just create an "input.avs" text file with this single line ... @example DirectShowSource("C:\path to your file\yourfile.asf") @end example -... and then feed that text file to avconv: +... and then feed that text file to ffmpeg: @example - avconv -i input.avs + ffmpeg -i input.avs @end example For ANY other help on Avisynth, please visit the @@ -207,8 +213,56 @@ For ANY other help on Avisynth, please visit the @section How can I join video files? -A few multimedia containers (MPEG-1, MPEG-2 PS, DV) allow to join video files by -merely concatenating them. +To "join" video files is quite ambiguous. The following list explains the +different kinds of "joining" and points out how those are addressed in +FFmpeg. To join video files may mean: + +@itemize + +@item +To put them one after the other: this is called to @emph{concatenate} them +(in short: concat) and is addressed +@ref{How can I concatenate video files, in this very faq}. + +@item +To put them together in the same file, to let the user choose between the +different versions (example: different audio languages): this is called to +@emph{multiplex} them together (in short: mux), and is done by simply +invoking ffmpeg with several @option{-i} options. + +@item +For audio, to put all channels together in a single stream (example: two +mono streams into one stereo stream): this is sometimes called to +@emph{merge} them, and can be done using the +@url{http://ffmpeg.org/ffmpeg.html#amerge, @code{amerge}} filter. + +@item +For audio, to play one on top of the other: this is called to @emph{mix} +them, and can be done by first merging them into a single stream and then +using the @url{http://ffmpeg.org/ffmpeg.html#pan, @code{pan}} filter to mix +the channels at will. + +@item +For video, to display both together, side by side or one on top of a part of +the other; it can be done using the +@url{http://ffmpeg.org/ffmpeg.html#overlay, @code{overlay}} video filter. + +@end itemize + +@anchor{How can I concatenate video files} +@section How can I concatenate video files? + +There are several solutions, depending on the exact circumstances. + +@subsection Concatenating using filters + +FFmpeg has a @url{http://ffmpeg.org/ffmpeg.html#concat-1, @code{concat}} +filter designed specifically for that, with examples in the documentation. + +@subsection Concatenating at the file level + +A few multimedia containers (MPEG-1, MPEG-2 PS, DV) allow to concatenate +video by merely concatenating the files them. Hence you may concatenate your multimedia files by first transcoding them to these privileged formats, then using the humble @code{cat} command (or the @@ -216,27 +270,38 @@ equally humble @code{copy} under Windows), and finally transcoding back to your format of choice. @example -avconv -i input1.avi intermediate1.mpg -avconv -i input2.avi intermediate2.mpg +ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg +ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg -avconv -i intermediate_all.mpg output.avi +ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi @end example -Notice that you should set a reasonably high bitrate for your intermediate and -output files, if you want to preserve video quality. +Additionally, you can use the @code{concat} protocol instead of @code{cat} or +@code{copy} which will avoid creation of a potentially huge intermediate file. -Also notice that you may avoid the huge intermediate files by taking advantage -of named pipes, should your platform support it: +@example +ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg +ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg +ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg +ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi +@end example + +Note that you may need to escape the character "|" which is special for many +shells. + +Another option is usage of named pipes, should your platform support it: @example mkfifo intermediate1.mpg mkfifo intermediate2.mpg -avconv -i input1.avi -y intermediate1.mpg < /dev/null & -avconv -i input2.avi -y intermediate2.mpg < /dev/null & +ffmpeg -i input1.avi -qscale:v 1 -y intermediate1.mpg < /dev/null & +ffmpeg -i input2.avi -qscale:v 1 -y intermediate2.mpg < /dev/null & cat intermediate1.mpg intermediate2.mpg |\ -avconv -f mpeg -i - -c:v mpeg4 -acodec libmp3lame output.avi +ffmpeg -f mpeg -i - -c:v mpeg4 -acodec libmp3lame output.avi @end example +@subsection Concatenating using raw audio and video + Similarly, the yuv4mpegpipe format, and the raw video, raw audio codecs also allow concatenation, and the transcoding step is almost lossless. When using multiple yuv4mpegpipe(s), the first line needs to be discarded @@ -244,7 +309,8 @@ from all but the first stream. This can be accomplished by piping through @code{tail} as seen below. Note that when piping through @code{tail} you must use command grouping, @code{@{ ;@}}, to background properly. -For example, let's say we want to join two FLV files into an output.flv file: +For example, let's say we want to concatenate two FLV files into an +output.flv file: @example mkfifo temp1.a @@ -253,13 +319,13 @@ mkfifo temp2.a mkfifo temp2.v mkfifo all.a mkfifo all.v -avconv -i input1.flv -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 - > temp1.a < /dev/null & -avconv -i input2.flv -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 - > temp2.a < /dev/null & -avconv -i input1.flv -an -f yuv4mpegpipe - > temp1.v < /dev/null & -@{ avconv -i input2.flv -an -f yuv4mpegpipe - < /dev/null | tail -n +2 > temp2.v ; @} & +ffmpeg -i input1.flv -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 - > temp1.a < /dev/null & +ffmpeg -i input2.flv -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 - > temp2.a < /dev/null & +ffmpeg -i input1.flv -an -f yuv4mpegpipe - > temp1.v < /dev/null & +@{ ffmpeg -i input2.flv -an -f yuv4mpegpipe - < /dev/null | tail -n +2 > temp2.v ; @} & cat temp1.a temp2.a > all.a & cat temp1.v temp2.v > all.v & -avconv -f u16le -acodec pcm_s16le -ac 2 -ar 44100 -i all.a \ +ffmpeg -f u16le -acodec pcm_s16le -ac 2 -ar 44100 -i all.a \ -f yuv4mpegpipe -i all.v \ -y output.flv rm temp[12].[av] all.[av] @@ -267,7 +333,7 @@ rm temp[12].[av] all.[av] @section -profile option fails when encoding H.264 video with AAC audio -@command{avconv} prints an error like +@command{ffmpeg} prints an error like @example Undefined constant or missing '(' in 'baseline' @@ -282,16 +348,57 @@ video and audio. Specifically the AAC encoder also defines some profiles, none of which are named @var{baseline}. The solution is to apply the @option{-profile} option to the video stream only -by using @url{http://libav.org/avconv.html#Stream-specifiers-1, Stream specifiers}. +by using @url{http://ffmpeg.org/ffmpeg.html#Stream-specifiers-1, Stream specifiers}. Appending @code{:v} to it will do exactly that. +@section Using @option{-f lavfi}, audio becomes mono for no apparent reason. + +Use @option{-dumpgraph -} to find out exactly where the channel layout is +lost. + +Most likely, it is through @code{auto-inserted aconvert}. Try to understand +why the converting filter was needed at that place. + +Just before the output is a likely place, as @option{-f lavfi} currently +only support packed S16. + +Then insert the correct @code{aconvert} explicitly in the filter graph, +specifying the exact format. + +@example +aconvert=s16:stereo:packed +@end example + +@section Why does FFmpeg not see the subtitles in my VOB file? + +VOB and a few other formats do not have a global header that describes +everything present in the file. Instead, applications are supposed to scan +the file to see what it contains. Since VOB files are frequently large, only +the beginning is scanned. If the subtitles happen only later in the file, +they will not be initally detected. + +Some applications, including the @code{ffmpeg} command-line tool, can only +work with streams that were detected during the initial scan; streams that +are detected later are ignored. + +The size of the initial scan is controlled by two options: @code{probesize} +(default ~5 Mo) and @code{analyzeduration} (default 5,000,000 µs = 5 s). For +the subtitle stream to be detected, both values must be large enough. + @chapter Development -@section Are there examples illustrating how to use the Libav libraries, particularly libavcodec and libavformat? +@section Are there examples illustrating how to use the FFmpeg libraries, particularly libavcodec and libavformat? + +Yes. Check the @file{doc/examples} directory in the source +repository, also available online at: +@url{https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples}. -Yes. Read the Developers Guide of the Libav documentation. Alternatively, +Examples are also installed by default, usually in +@code{$PREFIX/share/ffmpeg/examples}. + +Also you may read the Developers Guide of the FFmpeg documentation. Alternatively, examine the source code for one of the many open source projects that -already incorporate Libav at (@url{projects.html}). +already incorporate FFmpeg at (@url{projects.html}). @section Can you support my C compiler XXX? @@ -302,42 +409,88 @@ with @code{#ifdef}s related to the compiler. @section Is Microsoft Visual C++ supported? Yes. Please see the @uref{platform.html, Microsoft Visual C++} -section in the Libav documentation. +section in the FFmpeg documentation. @section Can you add automake, libtool or autoconf support? No. These tools are too bloated and they complicate the build. -@section Why not rewrite Libav in object-oriented C++? +@section Why not rewrite FFmpeg in object-oriented C++? -Libav is already organized in a highly modular manner and does not need to +FFmpeg is already organized in a highly modular manner and does not need to be rewritten in a formal object language. Further, many of the developers favor straight C; it works for them. For more arguments on this matter, read @uref{http://www.tux.org/lkml/#s15, "Programming Religion"}. +@section Why are the ffmpeg programs devoid of debugging symbols? + +The build process creates ffmpeg_g, ffplay_g, etc. which contain full debug +information. Those binaries are stripped to create ffmpeg, ffplay, etc. If +you need the debug information, use the *_g versions. + @section I do not like the LGPL, can I contribute code under the GPL instead? Yes, as long as the code is optional and can easily and cleanly be placed -under #if CONFIG_GPL without breaking anything. So for example a new codec +under #if CONFIG_GPL without breaking anything. So, for example, a new codec or filter would be OK under GPL while a bug fix to LGPL code would not. -@section I'm using Libav from within my C++ application but the linker complains about missing symbols which seem to be available. +@section I'm using FFmpeg from within my C application but the linker complains about missing symbols from the libraries themselves. -Libav is a pure C project, so to use the libraries within your C++ application +FFmpeg builds static libraries by default. In static libraries, dependencies +are not handled. That has two consequences. First, you must specify the +libraries in dependency order: @code{-lavdevice} must come before +@code{-lavformat}, @code{-lavutil} must come after everything else, etc. +Second, external libraries that are used in FFmpeg have to be specified too. + +An easy way to get the full list of required libraries in dependency order +is to use @code{pkg-config}. + +@example + c99 -o program program.c $(pkg-config --cflags --libs libavformat libavcodec) +@end example + +See @file{doc/example/Makefile} and @file{doc/example/pc-uninstalled} for +more details. + +@section I'm using FFmpeg from within my C++ application but the linker complains about missing symbols which seem to be available. + +FFmpeg is a pure C project, so to use the libraries within your C++ application you need to explicitly state that you are using a C library. You can do this by -encompassing your Libav includes using @code{extern "C"}. +encompassing your FFmpeg includes using @code{extern "C"}. See @url{http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3} @section I'm using libavutil from within my C++ application but the compiler complains about 'UINT64_C' was not declared in this scope -Libav is a pure C project using C99 math features, in order to enable C++ +FFmpeg is a pure C project using C99 math features, in order to enable C++ to use them you have to append -D__STDC_CONSTANT_MACROS to your CXXFLAGS @section I have a file in memory / a API different from *open/*read/ libc how do I use it with libavformat? You have to create a custom AVIOContext using @code{avio_alloc_context}, -see @file{libavformat/aviobuf.c} in Libav and @file{libmpdemux/demux_lavf.c} in MPlayer2 sources. +see @file{libavformat/aviobuf.c} in FFmpeg and @file{libmpdemux/demux_lavf.c} in MPlayer or MPlayer2 sources. + +@section Where can I find libav* headers for Pascal/Delphi? + +see @url{http://www.iversenit.dk/dev/ffmpeg-headers/} + +@section Where is the documentation about ffv1, msmpeg4, asv1, 4xm? + +see @url{http://www.ffmpeg.org/~michael/} + +@section How do I feed H.263-RTP (and other codecs in RTP) to libavcodec? + +Even if peculiar since it is network oriented, RTP is a container like any +other. You have to @emph{demux} RTP before feeding the payload to libavcodec. +In this specific case please look at RFC 4629 to see how it should be done. + +@section AVStream.r_frame_rate is wrong, it is much larger than the frame rate. + +r_frame_rate is NOT the average frame rate, it is the smallest frame rate +that can accurately represent all timestamps. So no, it is not +wrong if it is larger than the average! +For example, if you have mixed 25 and 30 fps content, then r_frame_rate +will be 150. @section Why is @code{make fate} not running all tests? diff --git a/doc/fate.texi b/doc/fate.texi index 975f40a..4c2ba4d 100644 --- a/doc/fate.texi +++ b/doc/fate.texi @@ -1,150 +1,194 @@ \input texinfo @c -*- texinfo -*- -@settitle FATE Automated Testing Environment +@settitle FFmpeg Automated Testing Environment @titlepage -@center @titlefont{FATE Automated Testing Environment} +@center @titlefont{FFmpeg Automated Testing Environment} @end titlepage +@node Top @top @contents @chapter Introduction -FATE provides a regression testsuite embedded within the Libav build system. -It can be run locally and optionally configured to send reports to a web -aggregator and viewer @url{http://fate.libav.org}. + FATE is an extended regression suite on the client-side and a means +for results aggregation and presentation on the server-side. -It is advised to run FATE before submitting patches to the current codebase -and provide new tests when submitting patches to add additional features. + The first part of this document explains how you can use FATE from +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 +FATE server. -@chapter Running FATE + In any way you can have a look at the publicly viewable FATE results +by visiting this website: -@section Samples and References -In order to run, FATE needs a large amount of data (samples and references) -that is provided separately from the actual source distribution. + @url{http://fate.ffmpeg.org/} -To inform the build system about the testsuite location, pass -@option{--samples=<path to the samples>} to @command{configure} or set the -@var{SAMPLES} Make variable or the @var{LIBAV_SAMPLES} environment variable -to a suitable value. + This is especially recommended for all people contributing source +code to FFmpeg, as it can be seen if some test on some platform broke +with there recent contribution. This usually happens on the platforms +the developers could not test on. + + The second part of this document describes how you can run FATE to +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 +is not already listed on the above mentioned website. + + In the third part you can find a comprehensive listing of FATE makefile +targets and variables. -To use a custom wrapper to run the test, pass @option{--target-exec} to -@command{configure} or set the @var{TARGET_EXEC} Make variable. -The dataset is available through @command{rsync}, is possible to fetch -the current sample using the straight rsync command or through a specific -@ref{Makefile target}. +@chapter Using FATE from your FFmpeg source directory + + 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. +Use this command from the top-level source directory: @example -# rsync -aL rsync://fate-suite.libav.org/fate-suite/ fate-suite +make fate-rsync SAMPLES=fate-suite/ +make fate SAMPLES=fate-suite/ @end example + The above commands set the samples location by passing a makefile +variable via command line. It is also possible to set the samples +location at source configuration time by invoking configure with +`--samples=<path to the samples directory>'. Afterwards you can +invoke the makefile targets without setting the SAMPLES makefile +variable. This is illustrated by the following commands: + @example -# make fate-rsync SAMPLES=fate-suite +./configure --samples=fate-suite/ +make fate-rsync +make fate @end example + Yet another way to tell FATE about the location of the sample +directory is by making sure the environment variable FATE_SAMPLES +contains the path to your samples directory. This can be achieved +by e.g. putting that variable in your shell profile or by setting +it in your interactive session. + +@example +FATE_SAMPLES=fate-suite/ make fate +@end example + +@float NOTE +Do not put a '~' character in the samples path to indicate a home +directory. Because of shell nuances, this will cause FATE to fail. +@end float + +To use a custom wrapper to run the test, pass @option{--target-exec} to +@command{configure} or set the @var{TARGET_EXEC} Make variable. + + +@chapter Submitting the results to the FFmpeg result aggregation server + + To submit your results to the server you should run fate through the +shell script @file{tests/fate.sh} from the FFmpeg sources. This script needs +to be invoked with a configuration file as its first argument. + +@example +tests/fate.sh /path/to/fate_config +@end example + + A configuration file template with comments describing the individual +configuration variables can be found at @file{doc/fate_config.sh.template}. + +@ifhtml + The mentioned configuration template is also available here: +@verbatiminclude fate_config.sh.template +@end ifhtml + + Create a configuration that suits your needs, based on the configuration +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 +pattern <arch>-<os>-<compiler>-<compiler version>. The configuration file +itself will be sourced in a shell script, therefore all shell features may +be used. This enables you to setup the environment as you need it for your +build. + + 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 +the submission of the results to the server. The following files should be +present in $workdir as specified in the configuration file: + +@itemize + @item configure.log + @item compile.log + @item test.log + @item report + @item version +@end itemize + + When you have everything working properly you can create an SSH key pair +and send the public key to the FATE server administrator who can be contacted +at the email address @email{fate-admin@@ffmpeg.org}. -@chapter Manual Run -FATE regression test can be run through @command{make}. -Specific Makefile targets and Makefile variables are available: + 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 +of the server and to accept its host key. This can usually be achieved by +running your SSH client manually and killing it after you accepted the key. +The FATE server's fingerprint is: + + b1:31:c8:79:3f:04:1d:f8:f2:23:26:5a:fd:55:fa:92 + + If you have problems connecting to the FATE server, it may help to try out +the @command{ssh} command with one or more @option{-v} options. You should +get detailed output concerning your SSH configuration and the authentication +process. + + The only thing left is to automate the execution of the fate.sh script and +the synchronisation of the samples directory. + + +@chapter FATE makefile targets and variables + +@section Makefile targets -@anchor{Makefile target} -@section FATE Makefile targets @table @option -@item fate-list -List all fate/regression test targets. @item fate-rsync -Shortcut to download the fate test samples to the specified testsuite location. + Download/synchronize sample files to the configured samples directory. + +@item fate-list + Will list all fate/regression test targets. + @item fate -Run the FATE test suite (requires the fate-suite dataset). + Run the FATE test suite (requires the fate-suite dataset). @end table -@section FATE Makefile variables +@section Makefile variables + @table @option @item V -Verbosity level, can be set to 0, 1 or 2. -@table @option - @item 0 - show just the test arguments - @item 1 - show just the command used in the test - @item 2 - show everything -@end table + Verbosity level, can be set to 0, 1 or 2. + @itemize + @item 0: show just the test arguments + @item 1: show just the command used in the test + @item 2: show everything + @end itemize + @item SAMPLES -Specify or override the path to the FATE samples at make time, it has a -meaning only while running the regression tests. + Specify or override the path to the FATE samples at make time, it has a + meaning only while running the regression tests. + @item THREADS -Specify how many threads to use while running regression tests, it is -quite useful to detect thread-related regressions. + Specify how many threads to use while running regression tests, it is + quite useful to detect thread-related regressions. @item THREAD_TYPE -Specify which threading strategy test, either @var{slice} or @var{frame}, -by default @var{slice+frame} + Specify which threading strategy test, either @var{slice} or @var{frame}, + by default @var{slice+frame} @item CPUFLAGS -Specify a mask to be applied to autodetected CPU flags. + Specify CPU flags. @item TARGET_EXEC -Specify or override the wrapper used to run the tests. + Specify or override the wrapper used to run the tests. + The @var{TARGET_EXEC} option provides a way to run FATE wrapped in + @command{valgrind}, @command{qemu-user} or @command{wine} or on remote targets + through @command{ssh}. @end table -@example - make V=1 SAMPLES=/var/fate/samples THREADS=2 CPUFLAGS=mmx fate -@end example - -@chapter Automated Tests -In order to automatically testing specific configurations, e.g. multiple -compilers, @command{tests/fate.sh} is provided. - -This shell script builds Libav, runs the regression tests and prepares -a report that can be sent to @url{http://fate.libav.org/} or directly -examined locally. - -@section Testing Profiles -The configuration file passed to @command{fate.sh} is shell scripts as well. - -It must provide at least a @var{slot} identifier, the @var{repo} from -which fetch the sources, the @var{samples} directory, a @var{workdir} with -enough space to build and run all the tests. -Optional submit command @var{fate_recv} and a @var{comment} to describe -the testing profile are available. - -Additional optional parameter to tune the Libav building and reporting process -can be passed. +@section Examples @example -slot= # some unique identifier -repo=git://git.libav.org/libav.git # the source repository -samples=/path/to/fate/samples -workdir= # directory in which to do all the work -fate_recv="ssh -T fate@@fate.libav.org" # command to submit report -comment= # optional description - -# the following are optional and map to configure options -arch= -cpu= -cross_prefix= -cc= -target_os= -sysroot= -target_exec= -target_path= -extra_cflags= -extra_ldflags= -extra_libs= -extra_conf= # extra configure options not covered above - -#make= # name of GNU make if not 'make' -makeopts= # extra options passed to 'make' -#tar= # command to create a tar archive from its arguments on - # stdout, defaults to 'tar c' +make V=1 SAMPLES=/var/fate/samples THREADS=2 CPUFLAGS=mmx fate @end example - -@section Special Instances -The @var{TARGET_EXEC} option provides a way to run FATE wrapped in -@command{valgrind}, @command{qemu-user} or @command{wine} or on remote targets -through @command{ssh}. - -@section Submitting Reports -In order to send reports you need to create an @command{ssh} key and send it -to @email{root@@libav.org}. -The current server fingerprint is @var{a4:99:d7:d3:1c:92:0d:56:d6:d5:61:be:01:ae:7d:e6} diff --git a/doc/fate_config.sh.template b/doc/fate_config.sh.template new file mode 100644 index 0000000..f7bd625 --- /dev/null +++ b/doc/fate_config.sh.template @@ -0,0 +1,25 @@ +slot= # some unique identifier +repo=git://source.ffmpeg.org/ffmpeg.git # the source repository +samples= # path to samples directory +workdir= # directory in which to do all the work +#fate_recv="ssh -T fate@fate.ffmpeg.org" # command to submit report +comment= # optional description + +# the following are optional and map to configure options +arch= +cpu= +cross_prefix= +cc= +target_os= +sysroot= +target_exec= +target_path= +extra_cflags= +extra_ldflags= +extra_libs= +extra_conf= # extra configure options not covered above + +#make= # name of GNU make if not 'make' +makeopts= # extra options passed to 'make' +#tar= # command to create a tar archive from its arguments on stdout, + # defaults to 'tar c' diff --git a/doc/avconv.texi b/doc/ffmpeg.texi index 7341d2f..e73ef25 100644 --- a/doc/avconv.texi +++ b/doc/ffmpeg.texi @@ -1,8 +1,8 @@ \input texinfo @c -*- texinfo -*- -@settitle avconv Documentation +@settitle ffmpeg Documentation @titlepage -@center @titlefont{avconv Documentation} +@center @titlefont{ffmpeg Documentation} @end titlepage @top @@ -15,18 +15,18 @@ The generic syntax is: @example @c man begin SYNOPSIS -avconv [global options] [[infile options][@option{-i} @var{infile}]]... @{[outfile options] @var{outfile}@}... +ffmpeg [global options] [[infile options][@option{-i} @var{infile}]]... @{[outfile options] @var{outfile}@}... @c man end @end example @chapter Description @c man begin DESCRIPTION -avconv is a very fast video and audio converter that can also grab from +ffmpeg is a very fast video and audio converter that can also grab from a live audio/video source. It can also convert between arbitrary sample rates and resize video on the fly with a high quality polyphase filter. -avconv reads from an arbitrary number of input "files" (which can be regular +ffmpeg reads from an arbitrary number of input "files" (which can be regular files, pipes, network streams, grabbing devices, etc.), specified by the @code{-i} option, and writes to an arbitrary number of output "files", which are specified by a plain output filename. Anything found on the command line which @@ -58,20 +58,20 @@ options apply ONLY to the next input or output file and are reset between files. @item To set the video bitrate of the output file to 64kbit/s: @example -avconv -i input.avi -b 64k output.avi +ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi @end example @item To force the frame rate of the output file to 24 fps: @example -avconv -i input.avi -r 24 output.avi +ffmpeg -i input.avi -r 24 output.avi @end example @item To force the frame rate of the input file (valid for raw formats only) to 1 fps and the frame rate of the output file to 24 fps: @example -avconv -r 1 -i input.m2v -r 24 output.avi +ffmpeg -r 1 -i input.m2v -r 24 output.avi @end example @end itemize @@ -82,7 +82,7 @@ The format option may be needed for raw input files. @chapter Detailed description @c man begin DETAILED DESCRIPTION -The transcoding process in @command{avconv} for each output can be described by +The transcoding process in @command{ffmpeg} for each output can be described by the following diagram: @example @@ -94,9 +94,9 @@ the following diagram: @end example -@command{avconv} 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 -multiple input files, @command{avconv} tries to keep them synchronized by +multiple input files, @command{ffmpeg} tries to keep them synchronized by tracking lowest timestamp on any active input stream. Encoded packets are then passed to the decoder (unless streamcopy is selected @@ -107,9 +107,9 @@ encoder, which encodes them and outputs encoded packets again. Finally those are passed to the muxer, which writes the encoded packets to the output file. @section Filtering -Before encoding, @command{avconv} can process raw audio and video frames using +Before encoding, @command{ffmpeg} can process raw audio and video frames using filters from the libavfilter library. Several chained filters form a filter -graph. @command{avconv} distinguishes between two types of filtergraphs - +graph. @command{ffmpeg} distinguishes between two types of filtergraphs - simple and complex. @subsection Simple filtergraphs @@ -179,7 +179,7 @@ of the other. Its audio counterpart is the @code{amix} filter. @section Stream copy Stream copy is a mode selected by supplying the @code{copy} parameter to the -@option{-codec} option. It makes @command{avconv} omit the decoding and encoding +@option{-codec} option. It makes @command{ffmpeg} omit the decoding and encoding step for the specified stream, so it does only demuxing and muxing. It is useful for changing the container format or modifying container-level metadata. The diagram above will in this case simplify to this: @@ -202,10 +202,12 @@ filters is obviously also impossible, since filters work on uncompressed data. @chapter Stream selection @c man begin STREAM SELECTION -By default avconv tries to pick the "best" stream of each type present in input -files and add them to each output file. For video, this means the highest -resolution, for audio the highest channel count. For subtitle it's simply the -first subtitle stream. +By default ffmpeg includes only one stream of each type (video, audio, subtitle) +present in the input files and adds them to each output file. It picks the +"best" of each based upon the following criteria; for video it is the stream +with the highest resolution, for audio the stream with the most channels, for +subtitle it's the first subtitle stream. In the case where several streams of +the same type rate equally, the lowest numbered stream is chosen. You can disable some of those defaults by using @code{-vn/-an/-sn} options. For full manual control, use the @code{-map} option, which disables the defaults just @@ -223,7 +225,7 @@ described. @table @option @item -f @var{fmt} (@emph{input/output}) -Force input or output file format. The format is normally autodetected for input +Force input or output file format. The format is normally auto detected for input files and guessed from file extension for output files, so this option is not needed in most cases. @@ -233,22 +235,25 @@ input file name @item -y (@emph{global}) Overwrite output files without asking. +@item -n (@emph{global}) +Do not overwrite output files but exit if file exists. + @item -c[:@var{stream_specifier}] @var{codec} (@emph{input/output,per-stream}) @itemx -codec[:@var{stream_specifier}] @var{codec} (@emph{input/output,per-stream}) Select an encoder (when used before an output file) or a decoder (when used before an input file) for one or more streams. @var{codec} is the name of a decoder/encoder or a special value @code{copy} (output only) to indicate that -the stream is not to be reencoded. +the stream is not to be re-encoded. For example @example -avconv -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT +ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT @end example encodes all video streams with libx264 and copies all audio streams. For each stream, the last matching @code{c} option is applied, so @example -avconv -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT +ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT @end example will copy all the streams except the second video, which will be encoded with libx264, and the 138th audio, which will be encoded with libvorbis. @@ -258,7 +263,7 @@ Stop writing the output after its duration reaches @var{duration}. @var{duration} may be a number in seconds, or in @code{hh:mm:ss[.xxx]} form. @item -fs @var{limit_size} (@emph{output}) -Set the file size limit. +Set the file size limit, expressed in bytes. @item -ss @var{position} (@emph{input/output}) When used as an input option (before @code{-i}), seeks in this input file to @@ -275,6 +280,18 @@ The offset is added to the timestamps of the input files. Specifying a positive offset means that the corresponding streams are delayed by @var{offset} seconds. +@item -timestamp @var{time} (@emph{output}) +Set the recording timestamp in the container. +The syntax for @var{time} is: +@example +now|([(YYYY-MM-DD|YYYYMMDD)[T|t| ]]((HH:MM:SS[.m...])|(HHMMSS[.m...]))[Z|z]) +@end example +If the value is "now" it takes the current time. +Time is local time unless 'Z' or 'z' is appended, in which case it is +interpreted as UTC. +If the year-month-day part is not specified it takes the current +year-month-day. + @item -metadata[:metadata_specifier] @var{key}=@var{value} (@emph{output,per-metadata}) Set a metadata key/value pair. @@ -287,12 +304,12 @@ also possible to delete metadata by using an empty value. For example, for setting the title in the output file: @example -avconv -i in.avi -metadata title="my title" out.flv +ffmpeg -i in.avi -metadata title="my title" out.flv @end example To set the language of the first audio stream: @example -avconv -i INPUT -metadata:s:a:0 language=eng OUTPUT +ffmpeg -i INPUT -metadata:s:a:1 language=eng OUTPUT @end example @item -target @var{type} (@emph{output}) @@ -302,14 +319,14 @@ Specify target file type (@code{vcd}, @code{svcd}, @code{dvd}, @code{dv}, (bitrate, codecs, buffer sizes) are then set automatically. You can just type: @example -avconv -i myfile.avi -target vcd /tmp/vcd.mpg +ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg @end example Nevertheless you can specify additional options as long as you know they do not conflict with the standard, as in: @example -avconv -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg +ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg @end example @item -dframes @var{number} (@emph{output}) @@ -336,6 +353,32 @@ Specify the preset for matching stream(s). @item -stats (@emph{global}) Print encoding progress/statistics. On by default. +@item -progress @var{url} (@emph{global}) +Send program-friendly progress information to @var{url}. + +Progress information is written approximately every second and at the end of +the encoding process. It is made of "@var{key}=@var{value}" lines. @var{key} +consists of only alphanumeric characters. The last key of a sequence of +progress information is always "progress". + +@item -stdin +Enable interaction on standard input. On by default unless standard input is +used as an input. To explicitly disable interaction you need to specify +@code{-nostdin}. + +Disabling interaction on standard input is useful, for example, if +ffmpeg is in the background process group. Roughly the same result can +be achieved with @code{ffmpeg ... < /dev/null} but it requires a +shell. + +@item -debug_ts (@emph{global}) +Print timestamp information. It is off by default. This option is +mostly useful for testing and debugging purposes, and the output +format may change from one version to another, so it should not be +employed by portable scripts. + +See also the option @code{-fdebug ts}. + @item -attach @var{filename} (@emph{output}) Add an attachment to the output file. This is supported by a few formats like Matroska for e.g. fonts used in rendering subtitles. Attachments @@ -347,7 +390,7 @@ with @code{-map} or automatic mappings). Note that for Matroska you also have to set the mimetype metadata tag: @example -avconv -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv +ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv @end example (assuming that the attachment stream will be third in the output file). @@ -358,11 +401,11 @@ will be used. E.g. to extract the first attachment to a file named 'out.ttf': @example -avconv -dump_attachment:t:0 out.ttf INPUT +ffmpeg -dump_attachment:t:0 out.ttf INPUT @end example To extract all attachments to files determined by the @code{filename} tag: @example -avconv -dump_attachment:t "" INPUT +ffmpeg -dump_attachment:t "" INPUT @end example Technical note -- attachments are implemented as codec extradata, so this @@ -397,68 +440,7 @@ As an output option, this inserts the @code{scale} video filter to the @emph{end} of the corresponding filtergraph. Please use the @code{scale} filter directly to insert it at the beginning or some other place. -The format is @samp{wxh} (default - same as source). The following -abbreviations are recognized: -@table @samp -@item sqcif -128x96 -@item qcif -176x144 -@item cif -352x288 -@item 4cif -704x576 -@item 16cif -1408x1152 -@item qqvga -160x120 -@item qvga -320x240 -@item vga -640x480 -@item svga -800x600 -@item xga -1024x768 -@item uxga -1600x1200 -@item qxga -2048x1536 -@item sxga -1280x1024 -@item qsxga -2560x2048 -@item hsxga -5120x4096 -@item wvga -852x480 -@item wxga -1366x768 -@item wsxga -1600x1024 -@item wuxga -1920x1200 -@item woxga -2560x1600 -@item wqsxga -3200x2048 -@item wquxga -3840x2400 -@item whsxga -6400x4096 -@item whuxga -7680x4800 -@item cga -320x200 -@item ega -640x350 -@item hd480 -852x480 -@item hd720 -1280x720 -@item hd1080 -1920x1080 -@end table +The format is @samp{wxh} (default - same as source). @item -aspect[:@var{stream_specifier}] @var{aspect} (@emph{output,per-stream}) Set the video display aspect ratio specified by @var{aspect}. @@ -468,6 +450,21 @@ form @var{num}:@var{den}, where @var{num} and @var{den} are the numerator and denominator of the aspect ratio. For example "4:3", "16:9", "1.3333", and "1.7777" are valid argument values. +@item -croptop @var{size} +@item -cropbottom @var{size} +@item -cropleft @var{size} +@item -cropright @var{size} +All the crop options have been removed. Use -vf +crop=width:height:x:y instead. + +@item -padtop @var{size} +@item -padbottom @var{size} +@item -padleft @var{size} +@item -padright @var{size} +@item -padcolor @var{hex_color} +All the pad options have been removed. Use -vf +pad=width:height:x:y:color instead. + @item -vn (@emph{output}) Disable video recording. @@ -483,15 +480,18 @@ at the exact requested bitrate. On pass 1, you may just deactivate audio and set output to null, examples for Windows and Unix: @example -avconv -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL -avconv -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null +ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL +ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null @end example @item -passlogfile[:@var{stream_specifier}] @var{prefix} (@emph{output,per-stream}) Set two-pass log file name prefix to @var{prefix}, the default file name -prefix is ``av2pass''. The complete file name will be +prefix is ``ffmpeg2pass''. The complete file name will be @file{PREFIX-N.log}, where N is a number specific to the output -stream. +stream + +@item -vlang @var{code} +Set the ISO 639 language code (3 letters) of the current video stream. @item -vf @var{filter_graph} (@emph{output}) @var{filter_graph} is a description of the filter graph to apply to @@ -507,18 +507,37 @@ also sources and sinks). This is an alias for @code{-filter:v}. @item -pix_fmt[:@var{stream_specifier}] @var{format} (@emph{input/output,per-stream}) Set pixel format. Use @code{-pix_fmts} to show all the supported pixel formats. +If the selected pixel format can not be selected, ffmpeg will print a +warning and select the best pixel format supported by the encoder. +If @var{pix_fmt} is prefixed by a @code{+}, ffmpeg will exit with an error +if the requested pixel format can not be selected, and automatic conversions +inside filter graphs are disabled. +If @var{pix_fmt} is a single @code{+}, ffmpeg selects the same pixel format +as the input (or graph output) and automatic conversions are disabled. + @item -sws_flags @var{flags} (@emph{input/output}) Set SwScaler flags. @item -vdt @var{n} Discard threshold. @item -rc_override[:@var{stream_specifier}] @var{override} (@emph{output,per-stream}) -rate control override for specific intervals +Rate control override for specific intervals, formatted as "int,int,int" +list separated with slashes. Two first values are the beginning and +end frame numbers, last one is quantizer to use if positive, or quality +factor if negative. @item -deinterlace Deinterlace pictures. This option is deprecated since the deinterlacing is very low quality. Use the yadif filter with @code{-filter:v yadif}. +@item -ilme +Force interlacing support in encoder (MPEG-2 and MPEG-4 only). +Use this option if your input file is interlaced and you want +to keep the interlaced format for minimum losses. +The alternative is to deinterlace the input stream with +@option{-deinterlace}, but deinterlacing introduces losses. +@item -psnr +Calculate PSNR of compressed frames. @item -vstats Dump video coding statistics to @file{vstats_HHMMSS.log}. @item -vstats_file @var{file} @@ -530,7 +549,9 @@ Intra_dc_precision. @item -vtag @var{fourcc/tag} (@emph{output}) Force video tag/fourcc. This is an alias for @code{-tag:v}. @item -qphist (@emph{global}) -Show QP histogram. +Show QP histogram +@item -vbsf @var{bitstream_filter} +Deprecated see -bsf @item -force_key_frames[:@var{stream_specifier}] @var{time}[,@var{time}...] (@emph{output,per-stream}) Force key frames at the specified timestamps, more precisely at the first frames after each specified time. @@ -579,15 +600,40 @@ also sources and sinks). This is an alias for @code{-filter:a}. @table @option @item -atag @var{fourcc/tag} (@emph{output}) Force audio tag/fourcc. This is an alias for @code{-tag:a}. +@item -absf @var{bitstream_filter} +Deprecated, see -bsf @end table @section Subtitle options: @table @option +@item -slang @var{code} +Set the ISO 639 language code (3 letters) of the current subtitle stream. @item -scodec @var{codec} (@emph{input/output}) Set the subtitle codec. This is an alias for @code{-codec:s}. @item -sn (@emph{output}) Disable subtitle recording. +@item -sbsf @var{bitstream_filter} +Deprecated, see -bsf +@end table + +@section Advanced Subtitle options: + +@table @option + +@item -fix_sub_duration +Fix subtitles durations. For each subtitle, wait for the next packet in the +same stream and adjust the duration of the first to avoid overlap. This is +necessary with some subtitles codecs, especially DVB subtitles, because the +duration in the original packet is only a rough estimate and the end is +actually marked by an empty subtitle frame. Failing to use this option when +necessary can result in exaggerated durations or muxing failures due to +non-monotonic timestamps. + +Note that this option will delay the output of all data until the next +subtitle packet is decoded: it may increase memory consumption and latency a +lot. + @end table @section Advanced options @@ -615,7 +661,7 @@ graphs (see the @option{-filter_complex} option) to the output file. For example, to map ALL streams from the first input file to output @example -avconv -i INPUT -map 0 output +ffmpeg -i INPUT -map 0 output @end example For example, if you have two audio streams in the first input file, @@ -623,7 +669,7 @@ these streams are identified by "0:0" and "0:1". You can use @code{-map} to select which streams to place in an output file. For example: @example -avconv -i INPUT -map 0:1 out.wav +ffmpeg -i INPUT -map 0:1 out.wav @end example will map the input stream in @file{INPUT} identified by "0:1" to the (single) output stream in @file{out.wav}. @@ -633,21 +679,77 @@ For example, to select the stream with index 2 from input file index 6 from input @file{b.mov} (specified by the identifier "1:6"), and copy them to the output file @file{out.mov}: @example -avconv -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov +ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov @end example To select all video and the third audio stream from an input file: @example -avconv -i INPUT -map 0:v -map 0:a:2 OUTPUT +ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT @end example To map all the streams except the second audio, use negative mappings @example -avconv -i INPUT -map 0 -map -0:a:1 OUTPUT +ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT @end example Note that using this option disables the default mappings for this output file. +@item -map_channel [@var{input_file_id}.@var{stream_specifier}.@var{channel_id}|-1][:@var{output_file_id}.@var{stream_specifier}] +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 +be mapped on all the audio streams. + +Using "-1" instead of +@var{input_file_id}.@var{stream_specifier}.@var{channel_id} will map a muted +channel. + +For example, assuming @var{INPUT} is a stereo audio file, you can switch the +two audio channels with the following command: +@example +ffmpeg -i INPUT -map_channel 0.0.1 -map_channel 0.0.0 OUTPUT +@end example + +If you want to mute the first channel and keep the second: +@example +ffmpeg -i INPUT -map_channel -1 -map_channel 0.0.1 OUTPUT +@end example + +The order of the "-map_channel" option specifies the order of the channels in +the output stream. The output channel layout is guessed from the number of +channels mapped (mono if one "-map_channel", stereo if two, etc.). Using "-ac" +in combination of "-map_channel" makes the channel gain levels to be updated if +input and output channel layouts don't match (for instance two "-map_channel" +options and "-ac 6"). + +You can also extract each channel of an input to specific outputs; the following +command extracts two channels of the @var{INPUT} audio stream (file 0, stream 0) +to the respective @var{OUTPUT_CH0} and @var{OUTPUT_CH1} outputs: +@example +ffmpeg -i INPUT -map_channel 0.0.0 OUTPUT_CH0 -map_channel 0.0.1 OUTPUT_CH1 +@end example + +The following example splits the channels of a stereo input into two separate +streams, which are put into the same output file: +@example +ffmpeg -i stereo.wav -map 0:0 -map 0:0 -map_channel 0.0.0:0.0 -map_channel 0.0.1:0.1 -y out.ogg +@end example + +Note that currently each output stream can only contain channels from a single +input stream; you can't for example use "-map_channel" to pick multiple input +audio channels contained in different streams (from the same or different files) +and merge them into a single output stream. It is therefore not currently +possible, for example, to turn two separate mono streams into a single stereo +stream. However splitting a stereo stream into two single channel mono streams +is possible. + +If you need this feature, a possible workaround is to use the @emph{amerge} +filter. For example, if you need to merge a media (here @file{input.mkv}) with 2 +mono audio streams into one single stereo channel audio stream (and keep the +video stream), you can use the following command: +@example +ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv +@end example + @item -map_metadata[:@var{metadata_spec_out}] @var{infile}[:@var{metadata_spec_in}] (@emph{output,per-metadata}) Set metadata information of the next output file from @var{infile}. Note that those are file indices (zero-based), not filenames. @@ -679,12 +781,12 @@ file index can be used to create a dummy mapping that just disables automatic co For example to copy metadata from the first stream of the input file to global metadata of the output file: @example -avconv -i in.ogg -map_metadata 0:s:0 out.mp3 +ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3 @end example To do the reverse, i.e. copy global metadata to all audio streams: @example -avconv -i in.mkv -map_metadata:s:a 0:g out.mkv +ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv @end example Note that simple @code{0} would work as well in this example, since global metadata is assumed by default. @@ -694,34 +796,88 @@ Copy chapters from input file with index @var{input_file_index} to the next output file. If no chapter mapping is specified, then chapters are copied from the first input file with at least one chapter. Use a negative file index to disable any chapter copying. -@item -debug +@item -debug @var{category} Print specific debug info. +@var{category} is a number or a string containing one of the following values: +@table @samp +@item bitstream +@item buffers +picture buffer allocations +@item bugs +@item dct_coeff +@item er +error recognition +@item mb_type +macroblock (MB) type +@item mmco +memory management control operations (H.264) +@item mv +motion vector +@item pict +picture info +@item pts +@item qp +per-block quantization parameter (QP) +@item rc +rate control +@item skip +@item startcode +@item thread_ops +threading operations +@item vis_mb_type +visualize block types +@item vis_qp +visualize quantization parameter (QP), lower QP are tinted greener +@end table @item -benchmark (@emph{global}) Show benchmarking information at the end of an encode. Shows CPU time used and maximum memory consumption. Maximum memory consumption is not supported on all systems, it will usually display as 0 if not supported. +@item -benchmark_all (@emph{global}) +Show benchmarking information during the encode. +Shows CPU time used in various steps (audio/video encode/decode). @item -timelimit @var{duration} (@emph{global}) -Exit after avconv has been running for @var{duration} seconds. +Exit after ffmpeg has been running for @var{duration} seconds. @item -dump (@emph{global}) Dump each input packet to stderr. @item -hex (@emph{global}) When dumping packets, also dump the payload. @item -re (@emph{input}) Read input at native frame rate. Mainly used to simulate a grab device. +By default @command{ffmpeg} attempts to read the input(s) as fast as possible. +This option will slow down the reading of the input(s) to the native frame rate +of the input(s). It is useful for real-time output (e.g. live streaming). If +your input(s) is coming from some other live streaming source (through HTTP or +UDP for example) the server might already be in real-time, thus the option will +likely not be required. On the other hand, this is meaningful if your input(s) +is a file you are trying to push in real-time. +@item -loop_input +Loop over the input stream. Currently it works only for image +streams. This option is used for automatic FFserver testing. +This option is deprecated, use -loop 1. +@item -loop_output @var{number_of_times} +Repeatedly loop output for formats that support looping such as animated GIF +(0 will loop the output infinitely). +This option is deprecated, use -loop. @item -vsync @var{parameter} Video sync method. +For compatibility reasons old values can be specified as numbers. +Newly added values will have to be specified as strings always. @table @option -@item passthrough +@item 0, passthrough Each frame is passed with its timestamp from the demuxer to the muxer. -@item cfr +@item 1, cfr Frames will be duplicated and dropped to achieve exactly the requested constant framerate. -@item vfr +@item 2, vfr Frames are passed through with their timestamp or dropped so as to prevent 2 frames from having the same timestamp. -@item auto +@item drop +As passthrough but destroys all timestamps, making the muxer generate +fresh timestamps based on frame-rate. +@item -1, auto Chooses between 1 and 2 depending on muxer capabilities. This is the default method. @end table @@ -738,8 +894,30 @@ without any later correction. This option has been deprecated. Use the @code{asyncts} audio filter instead. @item -copyts Copy timestamps from input to output. -@item -copytb -Copy input stream time base from input to output when stream copying. +@item -copytb @var{mode} +Specify how to set the encoder timebase when stream copying. @var{mode} is an +integer numeric value, and can assume one of the following values: + +@table @option +@item 1 +Use the demuxer timebase. + +The time base is copied to the output encoder from the corresponding input +demuxer. This is sometimes required to avoid non monotonically increasing +timestamps when copying video streams with variable frame rate. + +@item 0 +Use the decoder timebase. + +The time base is copied to the output encoder from the corresponding input +decoder. + +@item -1 +Try to make the choice automatically, in order to generate a sane output. +@end table + +Default value is -1. + @item -shortest (@emph{output}) Finish encoding when the shortest input stream ends. @item -dts_delta_threshold @@ -757,7 +935,7 @@ may be reassigned to a different value. For example, to set the stream 0 PID to 33 and the stream 1 PID to 36 for an output mpegts file: @example -avconv -i infile -streamid 0:33 -streamid 1:36 out.ts +ffmpeg -i infile -streamid 0:33 -streamid 1:36 out.ts @end example @item -bsf[:@var{stream_specifier}] @var{bitstream_filters} (@emph{output,per-stream}) @@ -765,18 +943,21 @@ Set bitstream filters for matching streams. @var{bistream_filters} is a comma-separated list of bitstream filters. Use the @code{-bsfs} option to get the list of bitstream filters. @example -avconv -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264 +ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264 @end example @example -avconv -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt +ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt @end example -@item -tag[:@var{stream_specifier}] @var{codec_tag} (@emph{output,per-stream}) +@item -tag[:@var{stream_specifier}] @var{codec_tag} (@emph{per-stream}) Force a tag/fourcc for matching streams. -@item -cpuflags mask (@emph{global}) -Set a mask that's applied to autodetected CPU flags. This option is intended -for testing. Do not use it unless you know what you're doing. +@item -timecode @var{hh}:@var{mm}:@var{ss}SEP@var{ff} +Specify Timecode for writing. @var{SEP} is ':' for non drop timecode and ';' +(or '.') for drop. +@example +ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg +@end example @item -filter_complex @var{filtergraph} (@emph{global}) Define a complex filter graph, i.e. one with arbitrary number of inputs and/or @@ -798,7 +979,7 @@ normal input files. For example, to overlay an image over video @example -avconv -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map +ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map '[out]' out.mkv @end example Here @code{[0:v]} refers to the first video stream in the first input file, @@ -809,21 +990,70 @@ of overlay. Assuming there is only one video stream in each input file, we can omit input labels, so the above is equivalent to @example -avconv -i video.mkv -i image.png -filter_complex 'overlay[out]' -map +ffmpeg -i video.mkv -i image.png -filter_complex 'overlay[out]' -map '[out]' out.mkv @end example Furthermore we can omit the output label and the single output from the filter graph will be added to the output file automatically, so we can simply write @example -avconv -i video.mkv -i image.png -filter_complex 'overlay' out.mkv +ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv @end example To generate 5 seconds of pure red video using lavfi @code{color} source: @example -avconv -filter_complex 'color=red' -t 5 out.mkv +ffmpeg -filter_complex 'color=red' -t 5 out.mkv @end example @end table + +As a special exception, you can use a bitmap subtitle stream as input: it +will be converted into a video with the same size as the largest video in +the file, or 720×576 if no video is present. Note that this is an +experimental and temporary solution. It will be removed once libavfilter has +proper support for subtitles. + +For example, to hardcode subtitles on top of a DVB-T recording stored in +MPEG-TS format, delaying the subtitles by 1 second: +@example +ffmpeg -i input.ts -filter_complex \ + '[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \ + -sn -map '#0x2dc' output.mkv +@end example +(0x2d0, 0x2dc and 0x2ef are the MPEG-TS PIDs of respectively the video, +audio and subtitles streams; 0:0, 0:3 and 0:7 would have worked too) + +@section Preset files +A preset file contains a sequence of @var{option}=@var{value} pairs, +one for each line, specifying a sequence of options which would be +awkward to specify on the command line. Lines starting with the hash +('#') character are ignored and are used to provide comments. Check +the @file{presets} directory in the FFmpeg source tree for examples. + +Preset files are specified with the @code{vpre}, @code{apre}, +@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 +used for any kind of codec. For the @code{vpre}, @code{apre}, and +@code{spre} options, the options specified in a preset file are +applied to the currently selected codec of the same type as the preset +option. + +The argument passed to the @code{vpre}, @code{apre}, and @code{spre} +preset options identifies the preset file to use according to the +following rules: + +First ffmpeg searches for a file named @var{arg}.ffpreset in the +directories @file{$FFMPEG_DATADIR} (if set), and @file{$HOME/.ffmpeg}, and in +the datadir defined at configuration time (usually @file{PREFIX/share/ffmpeg}) +or in a @file{ffpresets} folder along the executable on win32, +in that order. For example, if the argument is @code{libvpx-1080p}, it will +search for the file @file{libvpx-1080p.ffpreset}. + +If no such file is found, then ffmpeg will search for a file named +@var{codec_name}-@var{arg}.ffpreset in the above-mentioned +directories, where @var{codec_name} is the name of the codec to which +the preset file options will be applied. For example, if you select +the video codec with @code{-vcodec libvpx} and use @code{-vpre 1080p}, +then it will search for the file @file{libvpx-1080p.ffpreset}. @c man end OPTIONS @chapter Tips @@ -837,7 +1067,7 @@ the Linux player does not seem to be very fast, so it can miss frames. An example is: @example -avconv -g 3 -r 3 -t 10 -b 50k -s qcif -f rv10 /tmp/b.rm +ffmpeg -g 3 -r 3 -t 10 -b:v 50k -s qcif -f rv10 /tmp/b.rm @end example @item @@ -876,43 +1106,48 @@ 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 Libav source tree for examples. +@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. Avconv searches for a file named @var{preset_name}.avpreset in -the directories @file{$AVCONV_DATADIR} (if set), and @file{$HOME/.avconv}, and in -the data directory defined at configuration time (usually @file{$PREFIX/share/avconv}) +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 -If you specify the input format and device then avconv can grab video +If you specify the input format and device then ffmpeg can grab video and audio directly. @example -avconv -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg +ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg +@end example + +Or with an ALSA audio source (mono input, card id 1) instead of OSS: +@example +ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg @end example Note that you must activate the right video source and channel before -launching avconv with any TV viewer such as +launching ffmpeg with any TV viewer such as @uref{http://linux.bytesex.org/xawtv/, xawtv} by Gerd Knorr. You also have to set the audio recording levels correctly with a standard mixer. @section X11 grabbing -Grab the X11 display with avconv via +Grab the X11 display with ffmpeg via @example -avconv -f x11grab -s cif -r 25 -i :0.0 /tmp/out.mpg +ffmpeg -f x11grab -s cif -r 25 -i :0.0 /tmp/out.mpg @end example 0.0 is display.screen number of your X11 server, same as the DISPLAY environment variable. @example -avconv -f x11grab -s cif -r 25 -i :0.0+10,20 /tmp/out.mpg +ffmpeg -f x11grab -s cif -r 25 -i :0.0+10,20 /tmp/out.mpg @end example 0.0 is display.screen number of your X11 server, same as the DISPLAY environment @@ -920,7 +1155,7 @@ variable. 10 is the x-offset and 20 the y-offset for the grabbing. @section Video and Audio file format conversion -Any supported file format and protocol can serve as input to avconv: +Any supported file format and protocol can serve as input to ffmpeg: Examples: @itemize @@ -928,7 +1163,7 @@ Examples: You can use YUV files as input: @example -avconv -i /tmp/test%d.Y /tmp/out.mpg +ffmpeg -i /tmp/test%d.Y /tmp/out.mpg @end example It will use the files: @@ -940,13 +1175,13 @@ It will use the files: The Y files use twice the resolution of the U and V files. They are raw files, without header. They can be generated by all decent video decoders. You must specify the size of the image with the @option{-s} option -if avconv cannot guess it. +if ffmpeg cannot guess it. @item You can input from a raw YUV420P file: @example -avconv -i /tmp/test.yuv /tmp/out.avi +ffmpeg -i /tmp/test.yuv /tmp/out.avi @end example test.yuv is a file containing raw YUV planar data. Each frame is composed @@ -957,14 +1192,14 @@ horizontal resolution. You can output to a raw YUV420P file: @example -avconv -i mydivx.avi hugefile.yuv +ffmpeg -i mydivx.avi hugefile.yuv @end example @item You can set several input files and output files: @example -avconv -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg +ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg @end example Converts the audio file a.wav and the raw YUV video file a.yuv @@ -974,7 +1209,7 @@ to MPEG file a.mpg. You can also do audio and video conversions at the same time: @example -avconv -i /tmp/a.wav -ar 22050 /tmp/a.mp2 +ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2 @end example Converts a.wav to MPEG audio at 22050 Hz sample rate. @@ -984,7 +1219,7 @@ You can encode to several formats at the same time and define a mapping from input stream to output streams: @example -avconv -i /tmp/a.wav -map 0:a -b 64k /tmp/a.mp2 -map 0:a -b 128k /tmp/b.mp2 +ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2 @end example Converts a.wav to a.mp2 at 64 kbits and to b.mp2 at 128 kbits. '-map @@ -995,7 +1230,7 @@ stream, in the order of the definition of output streams. You can transcode decrypted VOBs: @example -avconv -i snatch_1.vob -f avi -c:v mpeg4 -b:v 800k -g 300 -bf 2 -c:a libmp3lame -b:a 128k snatch.avi +ffmpeg -i snatch_1.vob -f avi -c:v mpeg4 -b:v 800k -g 300 -bf 2 -c:a libmp3lame -b:a 128k snatch.avi @end example This is a typical DVD ripping example; the input is a VOB file, the @@ -1007,14 +1242,14 @@ to enable LAME support by passing @code{--enable-libmp3lame} to configure. The mapping is particularly useful for DVD transcoding to get the desired audio language. -NOTE: To see the supported input formats, use @code{avconv -formats}. +NOTE: To see the supported input formats, use @code{ffmpeg -formats}. @item You can extract images from a video, or create a video from many images: For extracting images from a video: @example -avconv -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg +ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg @end example This will extract one video frame per second from the video and will @@ -1027,7 +1262,7 @@ combination with -ss to start extracting from a certain point in time. For creating a video from many images: @example -avconv -f image2 -i foo-%03d.jpeg -r 12 -s WxH foo.avi +ffmpeg -f image2 -i foo-%03d.jpeg -r 12 -s WxH foo.avi @end example The syntax @code{foo-%03d.jpeg} specifies to use a decimal number @@ -1035,11 +1270,21 @@ composed of three digits padded with zeroes to express the sequence number. It is the same syntax supported by the C printf function, but only formats accepting a normal integer are suitable. +When importing an image sequence, -i also supports expanding +shell-like wildcard patterns (globbing) internally, by selecting the +image2-specific @code{-pattern_type glob} option. + +For example, for creating a video from filenames matching the glob pattern +@code{foo-*.jpeg}: +@example +ffmpeg -f image2 -pattern_type glob -i 'foo-*.jpeg' -r 12 -s WxH foo.avi +@end example + @item You can put many streams of the same type in the output: @example -avconv -i test1.avi -i test2.avi -map 0.3 -map 0.2 -map 0.1 -map 0.0 -c copy test12.nut +ffmpeg -i test1.avi -i test2.avi -map 0.3 -map 0.2 -map 0.1 -map 0.0 -c copy test12.nut @end example The resulting output file @file{test12.avi} will contain first four streams from @@ -1048,20 +1293,22 @@ the input file in reverse order. @item To force CBR video output: @example -avconv -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v +ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v @end example @item The four options lmin, lmax, mblmin and mblmax use 'lambda' units, but you may use the QP2LAMBDA constant to easily convert from 'q' units: @example -avconv -i src.ext -lmax 21*QP2LAMBDA dst.ext +ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext @end example @end itemize @c man end EXAMPLES +@include syntax.texi @include eval.texi +@include decoders.texi @include encoders.texi @include demuxers.texi @include muxers.texi @@ -1074,15 +1321,15 @@ avconv -i src.ext -lmax 21*QP2LAMBDA dst.ext @ignore -@setfilename avconv -@settitle avconv video converter +@setfilename ffmpeg +@settitle ffmpeg video converter @c man begin SEEALSO -avplay(1), avprobe(1) and the Libav HTML documentation +ffplay(1), ffprobe(1), ffserver(1) and the FFmpeg HTML documentation @c man end @c man begin AUTHORS -The Libav developers +See git history @c man end @end ignore diff --git a/doc/ffmpeg.txt b/doc/ffmpeg.txt new file mode 100644 index 0000000..a028ca2 --- /dev/null +++ b/doc/ffmpeg.txt @@ -0,0 +1,47 @@ + : + ffmpeg.c : libav* + ======== : ====== + : + : + --------------------------------:---> AVStream... + InputStream input_streams[] / : + / : + InputFile input_files[] +==========================+ / ^ : + ------> 0 | : st ---:-----------:--/ : : + ^ +------+-----------+-----+ / +--------------------------+ : : + : | :ist_index--:-----:---------/ 1 | : st : | : : + : +------+-----------+-----+ +==========================+ : : + nb_input_files : | :ist_index--:-----:------------------> 2 | : st : | : : + : +------+-----------+-----+ +--------------------------+ : nb_input_streams : + : | :ist_index : | 3 | ... | : : + v +------+-----------+-----+ +--------------------------+ : : + --> 4 | | : : + | +--------------------------+ : : + | 5 | | : : + | +==========================+ v : + | : + | : + | : + | : + --------- --------------------------------:---> AVStream... + \ / : + OutputStream output_streams[] / : + \ / : + +======\======================/======+ ^ : + ------> 0 | : source_index : st-:--- | : : + OutputFile output_files[] / +------------------------------------+ : : + / 1 | : : : | : : + ^ +------+------------+-----+ / +------------------------------------+ : : + : | : ost_index -:-----:------/ 2 | : : : | : : + nb_output_files : +------+------------+-----+ +====================================+ : : + : | : ost_index -:-----|-----------------> 3 | : : : | : : + : +------+------------+-----+ +------------------------------------+ : nb_output_streams : + : | : : | 4 | | : : + : +------+------------+-----+ +------------------------------------+ : : + : | : : | 5 | | : : + v +------+------------+-----+ +------------------------------------+ : : + 6 | | : : + +------------------------------------+ : : + 7 | | : : + +====================================+ v : + : diff --git a/doc/avplay.texi b/doc/ffplay.texi index 8fc3308..e2bded7 100644 --- a/doc/avplay.texi +++ b/doc/ffplay.texi @@ -1,8 +1,8 @@ \input texinfo @c -*- texinfo -*- -@settitle avplay Documentation +@settitle ffplay Documentation @titlepage -@center @titlefont{avplay Documentation} +@center @titlefont{ffplay Documentation} @end titlepage @top @@ -13,16 +13,16 @@ @example @c man begin SYNOPSIS -avplay [options] @file{input_file} +ffplay [options] [@file{input_file}] @c man end @end example @chapter Description @c man begin DESCRIPTION -AVplay is a very simple and portable media player using the Libav +FFplay is a very simple and portable media player using the FFmpeg libraries and the SDL library. It is mostly used as a testbed for the -various Libav APIs. +various FFmpeg APIs. @c man end @chapter Options @@ -38,9 +38,9 @@ Force displayed width. @item -y @var{height} Force displayed height. @item -s @var{size} -This option has been removed. Use private format options for specifying the -input video size. For example with the rawvideo demuxer you need to specify the -option @var{video_size}. +Set frame size (WxH or abbreviation), needed for videos which do +not contain a header with the frame size like raw YUV. This option +has been deprecated in favor of private options, try -video_size. @item -an Disable audio. @item -vn @@ -59,29 +59,44 @@ Force format. Set window title (default is the input filename). @item -loop @var{number} Loops movie playback <number> times. 0 means forever. +@item -showmode @var{mode} +Set the show mode to use. +Available values for @var{mode} are: +@table @samp +@item 0, video +show video +@item 1, waves +show audio waves +@item 2, rdft +show audio frequency band using RDFT ((Inverse) Real Discrete Fourier Transform) +@end table + +Default value is "video", if video is not present or cannot be played +"rdft" is automatically selected. + +You can interactively cycle through the available show modes by +pressing the key @key{w}. + @item -vf @var{filter_graph} @var{filter_graph} is a description of the filter graph to apply to the input video. Use the option "-filters" to show all the available filters (including also sources and sinks). +@item -i @var{input_file} +Read @var{input_file}. @end table @section Advanced options @table @option @item -pix_fmt @var{format} -This option has been removed. Use private options for specifying the -input pixel format. For example with the rawvideo demuxer you need to specify -the option @var{pixel_format}. +Set pixel format. +This option has been deprecated in favor of private options, try -pixel_format. @item -stats Show the stream duration, the codec parameters, the current position in the stream and the audio/video synchronisation drift. -@item -debug -Print specific debug info. @item -bug Work around bugs. -@item -vismv -Visualize motion vectors. @item -fast Non-spec-compliant optimizations. @item -genpts @@ -119,6 +134,8 @@ Exit when video is done playing. Exit if any key is pressed. @item -exitonmousedown Exit if any mouse button is pressed. +@item -codec:@var{stream_type} +Force a specific decoder implementation @end table @section While playing @@ -151,6 +168,9 @@ Seek backward/forward 10 seconds. @item down/up Seek backward/forward 1 minute. +@item page down/page up +Seek backward/forward 10 minutes. + @item mouse click Seek to percentage in file corresponding to fraction of width. @@ -158,7 +178,9 @@ Seek to percentage in file corresponding to fraction of width. @c man end +@include syntax.texi @include eval.texi +@include decoders.texi @include demuxers.texi @include muxers.texi @include indevs.texi @@ -168,15 +190,15 @@ Seek to percentage in file corresponding to fraction of width. @ignore -@setfilename avplay -@settitle AVplay media player +@setfilename ffplay +@settitle FFplay media player @c man begin SEEALSO -avconv(1), avprobe(1) and the Libav HTML documentation +ffmpeg(1), ffprobe(1), ffserver(1) and the FFmpeg HTML documentation @c man end @c man begin AUTHORS -The Libav developers +The FFmpeg developers @c man end @end ignore diff --git a/doc/ffprobe.texi b/doc/ffprobe.texi new file mode 100644 index 0000000..6295eb3 --- /dev/null +++ b/doc/ffprobe.texi @@ -0,0 +1,470 @@ +\input texinfo @c -*- texinfo -*- + +@settitle ffprobe Documentation +@titlepage +@center @titlefont{ffprobe Documentation} +@end titlepage + +@top + +@contents + +@chapter Synopsis + +The generic syntax is: + +@example +@c man begin SYNOPSIS +ffprobe [options] [@file{input_file}] +@c man end +@end example + +@chapter Description +@c man begin DESCRIPTION + +ffprobe gathers information from multimedia streams and prints it in +human- and machine-readable fashion. + +For example it can be used to check the format of the container used +by a multimedia stream and the format and type of each media stream +contained in it. + +If a filename is specified in input, ffprobe will try to open and +probe the file content. If the file cannot be opened or recognized as +a multimedia file, a positive exit code is returned. + +ffprobe may be employed both as a standalone application or in +combination with a textual filter, which may perform more +sophisticated processing, e.g. statistical processing or plotting. + +Options are used to list some of the formats supported by ffprobe or +for specifying which information to display, and for setting how +ffprobe will show it. + +ffprobe output is designed to be easily parsable by a textual filter, +and consists of one or more sections of a form defined by the selected +writer, which is specified by the @option{print_format} option. + +Metadata tags stored in the container or in the streams are recognized +and printed in the corresponding "FORMAT" or "STREAM" section. + +@c man end + +@chapter Options +@c man begin OPTIONS + +@include avtools-common-opts.texi + +@section Main options + +@table @option + +@item -f @var{format} +Force format to use. + +@item -unit +Show the unit of the displayed values. + +@item -prefix +Use SI prefixes for the displayed values. +Unless the "-byte_binary_prefix" option is used all the prefixes +are decimal. + +@item -byte_binary_prefix +Force the use of binary prefixes for byte values. + +@item -sexagesimal +Use sexagesimal format HH:MM:SS.MICROSECONDS for time values. + +@item -pretty +Prettify the format of the displayed values, it corresponds to the +options "-unit -prefix -byte_binary_prefix -sexagesimal". + +@item -of, -print_format @var{writer_name}[=@var{writer_options}] +Set the output printing format. + +@var{writer_name} specifies the name of the writer, and +@var{writer_options} specifies the options to be passed to the writer. + +For example for printing the output in JSON format, specify: +@example +-print_format json +@end example + +For more details on the available output printing formats, see the +Writers section below. + +@item -select_streams @var{stream_specifier} +Select only the streams specified by @var{stream_specifier}. This +option affects only the options related to streams +(e.g. @code{show_streams}, @code{show_packets}, etc.). + +For example to show only audio streams, you can use the command: +@example +ffprobe -show_streams -select_streams a INPUT +@end example + +To show only video packets belonging to the video stream with index 1: +@example +ffprobe -show_packets -select_streams v:1 INPUT +@end example + +@item -show_data +Show payload data, as an hexadecimal and ASCII dump. Coupled with +@option{-show_packets}, it will dump the packets' data. Coupled with +@option{-show_streams}, it will dump the codec extradata. + +The dump is printed as the "data" field. It may contain newlines. + +@item -show_error +Show information about the error found when trying to probe the input. + +The error information is printed within a section with name "ERROR". + +@item -show_format +Show information about the container format of the input multimedia +stream. + +All the container format information is printed within a section with +name "FORMAT". + +@item -show_format_entry @var{name} +Like @option{-show_format}, but only prints the specified entry of the +container format information, rather than all. This option may be given more +than once, then all specified entries will be shown. + +@item -show_packets +Show information about each packet contained in the input multimedia +stream. + +The information for each single packet is printed within a dedicated +section with name "PACKET". + +@item -show_frames +Show information about each frame contained in the input multimedia +stream. + +The information for each single frame is printed within a dedicated +section with name "FRAME". + +@item -show_streams +Show information about each media stream contained in the input +multimedia stream. + +Each media stream information is printed within a dedicated section +with name "STREAM". + +@item -count_frames +Count the number of frames per stream and report it in the +corresponding stream section. + +@item -count_packets +Count the number of packets per stream and report it in the +corresponding stream section. + +@item -show_private_data, -private +Show private data, that is data depending on the format of the +particular shown element. +This option is enabled by default, but you may need to disable it +for specific uses, for example when creating XSD-compliant XML output. + +@item -show_program_version +Show information related to program version. + +Version information is printed within a section with name +"PROGRAM_VERSION". + +@item -show_library_versions +Show information related to library versions. + +Version information for each library is printed within a section with +name "LIBRARY_VERSION". + +@item -show_versions +Show information related to program and library versions. This is the +equivalent of setting both @option{-show_program_version} and +@option{-show_library_versions} options. + +@item -bitexact +Force bitexact output, useful to produce output which is not dependent +on the specific build. + +@item -i @var{input_file} +Read @var{input_file}. + +@end table +@c man end + +@chapter Writers +@c man begin WRITERS + +A writer defines the output format adopted by @command{ffprobe}, and will be +used for printing all the parts of the output. + +A writer may accept one or more arguments, which specify the options to +adopt. + +A description of the currently available writers follows. + +@section default +Default format. + +Print each section in the form: +@example +[SECTION] +key1=val1 +... +keyN=valN +[/SECTION] +@end example + +Metadata tags are printed as a line in the corresponding FORMAT or +STREAM section, and are prefixed by the string "TAG:". + +This writer accepts options as a list of @var{key}=@var{value} pairs, +separated by ":". + +A description of the accepted options follows. + +@table @option + +@item nokey, nk +If set to 1 specify not to print the key of each field. Default value +is 0. + +@item noprint_wrappers, nw +If set to 1 specify not to print the section header and footer. +Default value is 0. +@end table + +@section compact, csv +Compact and CSV format. + +The @code{csv} writer is equivalent to @code{compact}, but supports +different defaults. + +Each section is printed on a single line. +If no option is specifid, the output has the form: +@example +section|key1=val1| ... |keyN=valN +@end example + +Metadata tags are printed in the corresponding "format" or "stream" +section. A metadata tag key, if printed, is prefixed by the string +"tag:". + +This writer accepts options as a list of @var{key}=@var{value} pairs, +separated by ":". + +The description of the accepted options follows. + +@table @option + +@item item_sep, s +Specify the character to use for separating fields in the output line. +It must be a single printable character, it is "|" by default ("," for +the @code{csv} writer). + +@item nokey, nk +If set to 1 specify not to print the key of each field. Its default +value is 0 (1 for the @code{csv} writer). + +@item escape, e +Set the escape mode to use, default to "c" ("csv" for the @code{csv} +writer). + +It can assume one of the following values: +@table @option +@item c +Perform C-like escaping. Strings containing a newline ('\n'), carriage +return ('\r'), a tab ('\t'), a form feed ('\f'), the escaping +character ('\') or the item separator character @var{SEP} are escaped using C-like fashioned +escaping, so that a newline is converted to the sequence "\n", a +carriage return to "\r", '\' to "\\" and the separator @var{SEP} is +converted to "\@var{SEP}". + +@item csv +Perform CSV-like escaping, as described in RFC4180. Strings +containing a newline ('\n'), a carriage return ('\r'), a double quote +('"'), or @var{SEP} are enclosed in double-quotes. + +@item none +Perform no escaping. +@end table + +@item print_section, p +Print the section name at the begin of each line if the value is +@code{1}, disable it with value set to @code{0}. Default value is +@code{1}. + +@end table + +@section flat +Flat format. + +A free-form output where each line contains an explicit key=value, such as +"streams.stream.3.tags.foo=bar". The output is shell escaped, so it can be +directly embedded in sh scripts as long as the separator character is an +alphanumeric character or an underscore (see @var{sep_char} option). + +This writer accepts options as a list of @var{key}=@var{value} pairs, +separated by ":". + +The description of the accepted options follows. + +@table @option +@item sep_char, s +Separator character used to separate the chapter, the section name, IDs and +potential tags in the printed field key. + +Default value is '.'. + +@item hierarchical, h +Specify if the section name specification should be hierarchical. If +set to 1, and if there is more than one section in the current +chapter, the section name will be prefixed by the name of the +chapter. A value of 0 will disable this behavior. + +Default value is 1. +@end table + +@section ini +INI format output. + +Print output in an INI based format. + +The following conventions are adopted: + +@itemize +@item +all key and values are UTF-8 +@item +'.' is the subgroup separator +@item +newline, '\t', '\f', '\b' and the following characters are escaped +@item +'\' is the escape character +@item +'#' is the comment indicator +@item +'=' is the key/value separator +@item +':' is not used but usually parsed as key/value separator +@end itemize + +This writer accepts options as a list of @var{key}=@var{value} pairs, +separated by ":". + +The description of the accepted options follows. + +@table @option +@item hierarchical, h +Specify if the section name specification should be hierarchical. If +set to 1, and if there is more than one section in the current +chapter, the section name will be prefixed by the name of the +chapter. A value of 0 will disable this behavior. + +Default value is 1. +@end table + +@section json +JSON based format. + +Each section is printed using JSON notation. + +This writer accepts options as a list of @var{key}=@var{value} pairs, +separated by ":". + +The description of the accepted options follows. + +@table @option + +@item compact, c +If set to 1 enable compact output, that is each section will be +printed on a single line. Default value is 0. +@end table + +For more information about JSON, see @url{http://www.json.org/}. + +@section xml +XML based format. + +The XML output is described in the XML schema description file +@file{ffprobe.xsd} installed in the FFmpeg datadir. + +An updated version of the schema can be retrieved at the url +@url{http://www.ffmpeg.org/schema/ffprobe.xsd}, which redirects to the +latest schema committed into the FFmpeg development source code tree. + +Note that the output issued will be compliant to the +@file{ffprobe.xsd} schema only when no special global output options +(@option{unit}, @option{prefix}, @option{byte_binary_prefix}, +@option{sexagesimal} etc.) are specified. + +This writer accepts options as a list of @var{key}=@var{value} pairs, +separated by ":". + +The description of the accepted options follows. + +@table @option + +@item fully_qualified, q +If set to 1 specify if the output should be fully qualified. Default +value is 0. +This is required for generating an XML file which can be validated +through an XSD file. + +@item xsd_compliant, x +If set to 1 perform more checks for ensuring that the output is XSD +compliant. Default value is 0. +This option automatically sets @option{fully_qualified} to 1. +@end table + +For more information about the XML format, see +@url{http://www.w3.org/XML/}. +@c man end WRITERS + +@chapter Timecode +@c man begin TIMECODE + +@command{ffprobe} supports Timecode extraction: + +@itemize + +@item +MPEG1/2 timecode is extracted from the GOP, and is available in the video +stream details (@option{-show_streams}, see @var{timecode}). + +@item +MOV timecode is extracted from tmcd track, so is available in the tmcd +stream metadata (@option{-show_streams}, see @var{TAG:timecode}). + +@item +DV, GXF and AVI timecodes are available in format metadata +(@option{-show_format}, see @var{TAG:timecode}). + +@end itemize +@c man end TIMECODE + +@include syntax.texi +@include decoders.texi +@include demuxers.texi +@include protocols.texi +@include indevs.texi + +@ignore + +@setfilename ffprobe +@settitle ffprobe media prober + +@c man begin SEEALSO +ffmpeg(1), ffplay(1), ffserver(1) and the FFmpeg HTML documentation +@c man end + +@c man begin AUTHORS +The FFmpeg developers +@c man end + +@end ignore + +@bye diff --git a/doc/ffprobe.xsd b/doc/ffprobe.xsd new file mode 100644 index 0000000..d9c9392 --- /dev/null +++ b/doc/ffprobe.xsd @@ -0,0 +1,198 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.ffmpeg.org/schema/ffprobe" + xmlns:ffprobe="http://www.ffmpeg.org/schema/ffprobe"> + + <xsd:element name="ffprobe" type="ffprobe:ffprobeType"/> + + <xsd:complexType name="ffprobeType"> + <xsd:sequence> + <xsd:element name="packets" type="ffprobe:packetsType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="frames" type="ffprobe:framesType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="streams" type="ffprobe:streamsType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="format" type="ffprobe:formatType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="error" type="ffprobe:errorType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="program_version" type="ffprobe:programVersionType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="library_versions" type="ffprobe:libraryVersionsType" minOccurs="0" maxOccurs="1" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="packetsType"> + <xsd:sequence> + <xsd:element name="packet" type="ffprobe:packetType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="framesType"> + <xsd:sequence> + <xsd:element name="frame" type="ffprobe:frameType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="packetType"> + <xsd:attribute name="codec_type" type="xsd:string" use="required" /> + <xsd:attribute name="stream_index" type="xsd:int" use="required" /> + <xsd:attribute name="pts" type="xsd:long" /> + <xsd:attribute name="pts_time" type="xsd:float" /> + <xsd:attribute name="dts" type="xsd:long" /> + <xsd:attribute name="dts_time" type="xsd:float" /> + <xsd:attribute name="duration" type="xsd:long" /> + <xsd:attribute name="duration_time" type="xsd:float" /> + <xsd:attribute name="convergence_duration" type="xsd:long" /> + <xsd:attribute name="convergence_duration_time" type="xsd:float" /> + <xsd:attribute name="size" type="xsd:long" use="required" /> + <xsd:attribute name="pos" type="xsd:long" /> + <xsd:attribute name="flags" type="xsd:string" use="required" /> + <xsd:attribute name="data" type="xsd:string" /> + </xsd:complexType> + + <xsd:complexType name="frameType"> + <xsd:attribute name="media_type" type="xsd:string" use="required"/> + <xsd:attribute name="key_frame" type="xsd:int" use="required"/> + <xsd:attribute name="pts" type="xsd:long" /> + <xsd:attribute name="pts_time" type="xsd:float"/> + <xsd:attribute name="pkt_pts" type="xsd:long" /> + <xsd:attribute name="pkt_pts_time" type="xsd:float"/> + <xsd:attribute name="pkt_dts" type="xsd:long" /> + <xsd:attribute name="pkt_dts_time" type="xsd:float"/> + <xsd:attribute name="pkt_duration" type="xsd:long" /> + <xsd:attribute name="pkt_duration_time" type="xsd:float"/> + <xsd:attribute name="pkt_pos" type="xsd:long" /> + + <!-- audio attributes --> + <xsd:attribute name="sample_fmt" type="xsd:string"/> + <xsd:attribute name="nb_samples" type="xsd:long" /> + <xsd:attribute name="channels" type="xsd:int" /> + <xsd:attribute name="channel_layout" type="xsd:string"/> + + <!-- video attributes --> + <xsd:attribute name="width" type="xsd:long" /> + <xsd:attribute name="height" type="xsd:long" /> + <xsd:attribute name="pix_fmt" type="xsd:string"/> + <xsd:attribute name="sample_aspect_ratio" type="xsd:string"/> + <xsd:attribute name="pict_type" type="xsd:string"/> + <xsd:attribute name="coded_picture_number" type="xsd:long" /> + <xsd:attribute name="display_picture_number" type="xsd:long" /> + <xsd:attribute name="interlaced_frame" type="xsd:int" /> + <xsd:attribute name="top_field_first" type="xsd:int" /> + <xsd:attribute name="repeat_pict" type="xsd:int" /> + <xsd:attribute name="reference" type="xsd:int" /> + </xsd:complexType> + + <xsd:complexType name="streamsType"> + <xsd:sequence> + <xsd:element name="stream" type="ffprobe:streamType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="streamDispositionType"> + <xsd:attribute name="default" type="xsd:int" use="required" /> + <xsd:attribute name="dub" type="xsd:int" use="required" /> + <xsd:attribute name="original" type="xsd:int" use="required" /> + <xsd:attribute name="comment" type="xsd:int" use="required" /> + <xsd:attribute name="lyrics" type="xsd:int" use="required" /> + <xsd:attribute name="karaoke" type="xsd:int" use="required" /> + <xsd:attribute name="forced" type="xsd:int" use="required" /> + <xsd:attribute name="hearing_impaired" type="xsd:int" use="required" /> + <xsd:attribute name="visual_impaired" type="xsd:int" use="required" /> + <xsd:attribute name="clean_effects" type="xsd:int" use="required" /> + <xsd:attribute name="attached_pic" type="xsd:int" use="required" /> + </xsd:complexType> + + <xsd:complexType name="streamType"> + <xsd:sequence> + <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="disposition" type="ffprobe:streamDispositionType" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + + <xsd:attribute name="index" type="xsd:int" use="required"/> + <xsd:attribute name="codec_name" type="xsd:string" /> + <xsd:attribute name="codec_long_name" type="xsd:string" /> + <xsd:attribute name="profile" type="xsd:string" /> + <xsd:attribute name="codec_type" type="xsd:string" /> + <xsd:attribute name="codec_time_base" type="xsd:string" use="required"/> + <xsd:attribute name="codec_tag" type="xsd:string" use="required"/> + <xsd:attribute name="codec_tag_string" type="xsd:string" use="required"/> + <xsd:attribute name="extradata" type="xsd:string" /> + + <!-- video attributes --> + <xsd:attribute name="width" type="xsd:int"/> + <xsd:attribute name="height" type="xsd:int"/> + <xsd:attribute name="has_b_frames" type="xsd:int"/> + <xsd:attribute name="sample_aspect_ratio" type="xsd:string"/> + <xsd:attribute name="display_aspect_ratio" type="xsd:string"/> + <xsd:attribute name="pix_fmt" type="xsd:string"/> + <xsd:attribute name="level" type="xsd:int"/> + <xsd:attribute name="timecode" type="xsd:string"/> + + <!-- audio attributes --> + <xsd:attribute name="sample_fmt" type="xsd:string"/> + <xsd:attribute name="sample_rate" type="xsd:int"/> + <xsd:attribute name="channels" type="xsd:int"/> + <xsd:attribute name="bits_per_sample" type="xsd:int"/> + + <xsd:attribute name="id" type="xsd:string"/> + <xsd:attribute name="r_frame_rate" type="xsd:string" use="required"/> + <xsd:attribute name="avg_frame_rate" type="xsd:string" use="required"/> + <xsd:attribute name="time_base" type="xsd:string" use="required"/> + <xsd:attribute name="start_pts" type="xsd:long"/> + <xsd:attribute name="start_time" type="xsd:float"/> + <xsd:attribute name="duration_ts" type="xsd:long"/> + <xsd:attribute name="duration" type="xsd:float"/> + <xsd:attribute name="bit_rate" type="xsd:int"/> + <xsd:attribute name="nb_frames" type="xsd:int"/> + <xsd:attribute name="nb_read_frames" type="xsd:int"/> + <xsd:attribute name="nb_read_packets" type="xsd:int"/> + </xsd:complexType> + + <xsd:complexType name="formatType"> + <xsd:sequence> + <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + + <xsd:attribute name="filename" type="xsd:string" use="required"/> + <xsd:attribute name="nb_streams" type="xsd:int" use="required"/> + <xsd:attribute name="format_name" type="xsd:string" use="required"/> + <xsd:attribute name="format_long_name" type="xsd:string"/> + <xsd:attribute name="start_time" type="xsd:float"/> + <xsd:attribute name="duration" type="xsd:float"/> + <xsd:attribute name="size" type="xsd:long"/> + <xsd:attribute name="bit_rate" type="xsd:long"/> + </xsd:complexType> + + <xsd:complexType name="tagType"> + <xsd:attribute name="key" type="xsd:string" use="required"/> + <xsd:attribute name="value" type="xsd:string" use="required"/> + </xsd:complexType> + + <xsd:complexType name="errorType"> + <xsd:attribute name="code" type="xsd:int" use="required"/> + <xsd:attribute name="string" type="xsd:string" use="required"/> + </xsd:complexType> + + <xsd:complexType name="programVersionType"> + <xsd:attribute name="version" type="xsd:string" use="required"/> + <xsd:attribute name="copyright" type="xsd:string" use="required"/> + <xsd:attribute name="build_date" type="xsd:string" use="required"/> + <xsd:attribute name="build_time" type="xsd:string" use="required"/> + <xsd:attribute name="compiler_type" type="xsd:string" use="required"/> + <xsd:attribute name="compiler_version" type="xsd:string" use="required"/> + <xsd:attribute name="configuration" type="xsd:string" use="required"/> + </xsd:complexType> + + <xsd:complexType name="libraryVersionType"> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="major" type="xsd:int" use="required"/> + <xsd:attribute name="minor" type="xsd:int" use="required"/> + <xsd:attribute name="micro" type="xsd:int" use="required"/> + <xsd:attribute name="version" type="xsd:int" use="required"/> + <xsd:attribute name="ident" type="xsd:string" use="required"/> + </xsd:complexType> + + <xsd:complexType name="libraryVersionsType"> + <xsd:sequence> + <xsd:element name="library_version" type="ffprobe:libraryVersionType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> +</xsd:schema> diff --git a/doc/avserver.conf b/doc/ffserver.conf index e9724bb..d10ac5b 100644 --- a/doc/avserver.conf +++ b/doc/ffserver.conf @@ -12,7 +12,7 @@ BindAddress 0.0.0.0 # MaxClients maximum limit. MaxHTTPConnections 2000 -# Number of simultaneous requests that can be handled. Since AVServer +# Number of simultaneous requests that can be handled. Since FFServer # is very fast, it is more likely that you will want to leave this high # and use MaxBandwidth, below. MaxClients 1000 @@ -25,24 +25,24 @@ MaxBandwidth 1000 # '-' is the standard output. CustomLog - -# Suppress that if you want to launch avserver as a daemon. +# Suppress that if you want to launch ffserver as a daemon. NoDaemon ################################################################## # Definition of the live feeds. Each live feed contains one video -# and/or audio sequence coming from an avconv encoder or another -# avserver. This sequence may be encoded simultaneously with several +# and/or audio sequence coming from an ffmpeg encoder or another +# ffserver. This sequence may be encoded simultaneously with several # codecs at several resolutions. <Feed feed1.ffm> -# You must use 'avconv' to send a live feed to avserver. In this +# You must use 'ffmpeg' to send a live feed to ffserver. In this # example, you can type: # -# avconv http://localhost:8090/feed1.ffm +# ffmpeg http://localhost:8090/feed1.ffm -# avserver can also do time shifting. It means that it can stream any +# ffserver can also do time shifting. It means that it can stream any # previously recorded live stream. The request should contain: # "http://xxxx?date=[YYYY-MM-DDT][[HH:]MM:]SS[.m...]".You must specify # a path where the feed is stored on disk. You also specify the @@ -55,10 +55,10 @@ FileMaxSize 200K # ReadOnlyFile /saved/specialvideo.ffm # This marks the file as readonly and it will not be deleted or updated. -# Specify launch in order to start avconv automatically. -# First avconv must be defined with an appropriate path if needed, +# Specify launch in order to start ffmpeg automatically. +# First ffmpeg must be defined with an appropriate path if needed, # after that options can follow, but avoid adding the http:// field -#Launch avconv +#Launch ffmpeg # Only allow connections from localhost to the feed. ACL allow 127.0.0.1 @@ -69,7 +69,7 @@ ACL allow 127.0.0.1 ################################################################## # Now you can define each stream which will be generated from the # original audio and video stream. Each format has a filename (here -# 'test1.mpg'). AVServer will send this stream when answering a +# 'test1.mpg'). FFServer will send this stream when answering a # request containing this filename. <Stream test1.mpg> @@ -334,7 +334,7 @@ StartSendOnKey # multicast address with MulticastAddress. The port and the TTL can # also be set. # -# An SDP file is automatically generated by avserver by adding the +# An SDP file is automatically generated by ffserver by adding the # 'sdp' extension to the stream name (here # http://localhost:8090/test1-sdp.sdp). You should usually give this # file to your player to play the stream. @@ -371,5 +371,5 @@ ACL allow 192.168.0.0 192.168.255.255 # Redirect index.html to the appropriate site <Redirect index.html> -URL http://www.libav.org/ +URL http://www.ffmpeg.org/ </Redirect> diff --git a/doc/avserver.texi b/doc/ffserver.texi index c023814..074c075 100644 --- a/doc/avserver.texi +++ b/doc/ffserver.texi @@ -1,8 +1,8 @@ \input texinfo @c -*- texinfo -*- -@settitle avserver Documentation +@settitle ffserver Documentation @titlepage -@center @titlefont{avserver Documentation} +@center @titlefont{ffserver Documentation} @end titlepage @top @@ -15,41 +15,38 @@ The generic syntax is: @example @c man begin SYNOPSIS -avserver [options] +ffserver [options] @c man end @end example @chapter Description @c man begin DESCRIPTION -WARNING: avserver is unmaintained, largely broken and in need of a -complete rewrite. It probably won't work for you. Use at your own -risk. +ffserver is a streaming server for both audio and video. It supports -avserver is a streaming server for both audio and video. It supports several live feeds, streaming from files and time shifting on live feeds (you can seek to positions in the past on each live feed, provided you -specify a big enough feed storage in avserver.conf). +specify a big enough feed storage in ffserver.conf). -avserver runs in daemon mode by default; that is, it puts itself in +ffserver runs in daemon mode by default; that is, it puts itself in the background and detaches from its TTY, unless it is launched in debug mode or a NoDaemon option is specified in the configuration file. -This documentation covers only the streaming aspects of avserver / -avconv. All questions about parameters for avconv, codec questions, -etc. are not covered here. Read @file{avconv.html} for more +This documentation covers only the streaming aspects of ffserver / +ffmpeg. All questions about parameters for ffmpeg, codec questions, +etc. are not covered here. Read @file{ffmpeg.html} for more information. @section How does it work? -avserver receives prerecorded files or FFM streams from some avconv +ffserver receives prerecorded files or FFM streams from some ffmpeg instance as input, then streams them over RTP/RTSP/HTTP. -An avserver instance will listen on some port as specified in the -configuration file. You can launch one or more instances of avconv and -send one or more FFM streams to the port where avserver is expecting -to receive them. Alternately, you can make avserver launch such avconv +An ffserver instance will listen on some port as specified in the +configuration file. You can launch one or more instances of ffmpeg and +send one or more FFM streams to the port where ffserver is expecting +to receive them. Alternately, you can make ffserver launch such ffmpeg instances at startup. Input streams are called feeds, and each one is specified by a <Feed> @@ -61,7 +58,7 @@ file. @section Status stream -avserver supports an HTTP interface which exposes the current status +ffserver supports an HTTP interface which exposes the current status of the server. Simply point your browser to the address of the special status stream @@ -104,18 +101,18 @@ I understand that FreeBSD systems work just fine as well. @section How do I make it work? First, build the kit. It *really* helps to have installed LAME first. Then when -you run the avserver ./configure, make sure that you have the +you run the ffserver ./configure, make sure that you have the @code{--enable-libmp3lame} flag turned on. LAME is important as it allows for streaming audio to Windows Media Player. Don't ask why the other audio types do not work. As a simple test, just run the following two command lines where INPUTFILE -is some file which you can decode with avconv: +is some file which you can decode with ffmpeg: @example -./avserver -f doc/avserver.conf & -./avconv -i INPUTFILE http://localhost:8090/feed1.ffm +ffserver -f doc/ffserver.conf & +ffmpeg -i INPUTFILE http://localhost:8090/feed1.ffm @end example At this point you should be able to go to your Windows machine and fire up @@ -133,8 +130,8 @@ The same is true of AVI files. @section What happens next? -You should edit the avserver.conf file to suit your needs (in terms of -frame rates etc). Then install avserver and avconv, write a script to start +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 Troubleshooting @@ -142,13 +139,13 @@ them up, and off you go. @subsection I don't hear any audio, but video is fine. Maybe you didn't install LAME, or got your ./configure statement wrong. Check -the avconv output to see if a line referring to MP3 is present. If not, then +the ffmpeg output to see if a line referring to MP3 is present. If not, then your configuration was incorrect. If it is, then maybe your wiring is not set up correctly. Maybe the sound card is not getting data from the right input source. Maybe you have a really awful audio interface (like I do) that only captures in stereo and also requires that one channel be flipped. If you are one of these people, then export 'AUDIO_FLIP_LEFT=1' before -starting avconv. +starting ffmpeg. @subsection The audio and video lose sync after a while. @@ -170,14 +167,14 @@ I suspect that the new one is not available unless you have installed WMP 7]. You can replay video from .ffm files that was recorded earlier. However, there are a number of caveats, including the fact that the -avserver parameters must match the original parameters used to record the -file. If they do not, then avserver deletes the file before recording into it. +ffserver parameters must match the original parameters used to record the +file. If they do not, then ffserver deletes the file before recording into it. (Now that I write this, it seems broken). You can fiddle with many of the codec choices and encoding parameters, and there are a bunch more parameters that you cannot control. Post a message to the mailing list if there are some 'must have' parameters. Look in -avserver.conf for a list of the currently available controls. +ffserver.conf for a list of the currently available controls. It will automatically generate the ASX or RAM files that are often used in browsers. These files are actually redirections to the underlying ASF @@ -191,7 +188,7 @@ finishes.] * When you connect to a live stream, most players (WMP, RA, etc) want to buffer a certain number of seconds of material so that they can display the -signal continuously. However, avserver (by default) starts sending data +signal continuously. However, ffserver (by default) starts sending data in realtime. This means that there is a pause of a few seconds while the buffering is being done by the player. The good news is that this can be cured by adding a '?buffer=5' to the end of the URL. This means that the @@ -199,13 +196,13 @@ stream should start 5 seconds in the past -- and so the first 5 seconds of the stream are sent as fast as the network will allow. It will then slow down to real time. This noticeably improves the startup experience. -You can also add a 'Preroll 15' statement into the avserver.conf that will +You can also add a 'Preroll 15' statement into the ffserver.conf that will add the 15 second prebuffering on all requests that do not otherwise -specify a time. In addition, avserver will skip frames until a key_frame +specify a time. In addition, ffserver will skip frames until a key_frame is found. This further reduces the startup delay by not transferring data that will be discarded. -* You may want to adjust the MaxBandwidth in the avserver.conf to limit +* You may want to adjust the MaxBandwidth in the ffserver.conf to limit the amount of bandwidth consumed by live streams. @section Why does the ?buffer / Preroll stop working after a time? @@ -222,7 +219,7 @@ handled. @section Does the @code{?date=} stuff work. Yes (subject to the limitation outlined above). Also note that whenever you -start avserver, it deletes the ffm file (if any parameters have changed), +start ffserver, it deletes the ffm file (if any parameters have changed), thus wiping out what you had recorded before. The format of the @code{?date=xxxxxx} is fairly flexible. You should use one @@ -250,31 +247,31 @@ For example: @samp{http://localhost:8080/test.asf?date=2002-07-26T23:05:00}. @table @option @item -f @var{configfile} -Use @file{configfile} instead of @file{/etc/avserver.conf}. +Use @file{configfile} instead of @file{/etc/ffserver.conf}. @item -n Enable no-launch mode. This option disables all the Launch directives -within the various <Stream> sections. Since avserver will not launch -any avconv instances, you will have to launch them manually. +within the various <Stream> sections. Since ffserver will not launch +any ffmpeg instances, you will have to launch them manually. @item -d Enable debug mode. This option increases log verbosity, directs log -messages to stdout and causes avserver to run in the foreground +messages to stdout and causes ffserver to run in the foreground rather than as a daemon. @end table @c man end @ignore -@setfilename avserver -@settitle avserver video server +@setfilename ffserver +@settitle ffserver video server @c man begin SEEALSO -avconv(1), avplay(1), avprobe(1), the @file{avserver.conf} -example and the Libav HTML documentation +ffmpeg(1), ffplay(1), ffprobe(1), the @file{ffserver.conf} +example and the FFmpeg HTML documentation @c man end @c man begin AUTHORS -The Libav developers +The FFmpeg developers @c man end @end ignore diff --git a/doc/filter_design.txt b/doc/filter_design.txt new file mode 100644 index 0000000..11bcc72 --- /dev/null +++ b/doc/filter_design.txt @@ -0,0 +1,269 @@ +Filter design +============= + +This document explains guidelines that should be observed (or ignored with +good reason) when writing filters for libavfilter. + +In this document, the word “frame” indicates either a video frame or a group +of audio samples, as stored in an AVFilterBuffer structure. + + +Format negotiation +================== + + The query_formats method should set, for each input and each output links, + the list of supported formats. + + For video links, that means pixel format. For audio links, that means + channel layout, and sample format (the sample packing is implied by the + sample format). + + The lists are not just lists, they are references to shared objects. When + the negotiation mechanism computes the intersection of the formats + supported at each ends of a link, all references to both lists are + replaced with a reference to the intersection. And when a single format is + eventually chosen for a link amongst the remaining list, again, all + references to the list are updated. + + That means that if a filter requires that its input and output have the + same format amongst a supported list, all it has to do is use a reference + to the same list of formats. + + +Buffer references ownership and permissions +=========================================== + + Principle + --------- + + Audio and video data are voluminous; the buffer and buffer reference + mechanism is intended to avoid, as much as possible, expensive copies of + that data while still allowing the filters to produce correct results. + + The data is stored in buffers represented by AVFilterBuffer structures. + They must not be accessed directly, but through references stored in + AVFilterBufferRef structures. Several references can point to the + same buffer; the buffer is automatically deallocated once all + corresponding references have been destroyed. + + The characteristics of the data (resolution, sample rate, etc.) are + stored in the reference; different references for the same buffer can + show different characteristics. In particular, a video reference can + point to only a part of a video buffer. + + A reference is usually obtained as input to the start_frame or + filter_samples method or requested using the ff_get_video_buffer or + ff_get_audio_buffer functions. A new reference on an existing buffer can + be created with the avfilter_ref_buffer. A reference is destroyed using + the avfilter_unref_bufferp function. + + Reference ownership + ------------------- + + At any time, a reference “belongs” to a particular piece of code, + usually a filter. With a few caveats that will be explained below, only + that piece of code is allowed to access it. It is also responsible for + destroying it, although this is sometimes done automatically (see the + section on link reference fields). + + Here are the (fairly obvious) rules for reference ownership: + + * A reference received by the start_frame or filter_samples method + belong to the corresponding filter. + + Special exception: for video references: the reference may be used + internally for automatic copying and must not be destroyed before + end_frame; it can be given away to ff_start_frame. + + * A reference passed to ff_start_frame or ff_filter_samples is given + away and must no longer be used. + + * A reference created with avfilter_ref_buffer belongs to the code that + created it. + + * A reference obtained with ff_get_video_buffer or ff_get_audio_buffer + belongs to the code that requested it. + + * A reference given as return value by the get_video_buffer or + get_audio_buffer method is given away and must no longer be used. + + Link reference fields + --------------------- + + The AVFilterLink structure has a few AVFilterBufferRef fields. Here are + the rules to handle them: + + * cur_buf is set before the start_frame and filter_samples methods to + the same reference given as argument to the methods and belongs to the + destination filter of the link. If it has not been cleared after + end_frame or filter_samples, libavfilter will automatically destroy + the reference; therefore, any filter that needs to keep the reference + for longer must set cur_buf to NULL. + + * out_buf belongs to the source filter of the link and can be used to + store a reference to the buffer that has been sent to the destination. + If it is not NULL after end_frame or filter_samples, libavfilter will + automatically destroy the reference. + + If a video input pad does not have a start_frame method, the default + method will request a buffer on the first output of the filter, store + the reference in out_buf and push a second reference to the output. + + * src_buf, cur_buf_copy and partial_buf are used by libavfilter + internally and must not be accessed by filters. + + Reference permissions + --------------------- + + The AVFilterBufferRef structure has a perms field that describes what + the code that owns the reference is allowed to do to the buffer data. + Different references for the same buffer can have different permissions. + + For video filters, the permissions only apply to the parts of the buffer + that have already been covered by the draw_slice method. + + The value is a binary OR of the following constants: + + * AV_PERM_READ: the owner can read the buffer data; this is essentially + always true and is there for self-documentation. + + * AV_PERM_WRITE: the owner can modify the buffer data. + + * AV_PERM_PRESERVE: the owner can rely on the fact that the buffer data + will not be modified by previous filters. + + * AV_PERM_REUSE: the owner can output the buffer several times, without + modifying the data in between. + + * AV_PERM_REUSE2: the owner can output the buffer several times and + modify the data in between (useless without the WRITE permissions). + + * AV_PERM_ALIGN: the owner can access the data using fast operations + that require data alignment. + + The READ, WRITE and PRESERVE permissions are about sharing the same + buffer between several filters to avoid expensive copies without them + doing conflicting changes on the data. + + The REUSE and REUSE2 permissions are about special memory for direct + rendering. For example a buffer directly allocated in video memory must + not modified once it is displayed on screen, or it will cause tearing; + it will therefore not have the REUSE2 permission. + + The ALIGN permission is about extracting part of the buffer, for + copy-less padding or cropping for example. + + + References received on input pads are guaranteed to have all the + permissions stated in the min_perms field and none of the permissions + stated in the rej_perms. + + References obtained by ff_get_video_buffer and ff_get_audio_buffer are + guaranteed to have at least all the permissions requested as argument. + + References created by avfilter_ref_buffer have the same permissions as + the original reference minus the ones explicitly masked; the mask is + usually ~0 to keep the same permissions. + + Filters should remove permissions on reference they give to output + whenever necessary. It can be automatically done by setting the + rej_perms field on the output pad. + + Here are a few guidelines corresponding to common situations: + + * Filters that modify and forward their frame (like drawtext) need the + WRITE permission. + + * Filters that read their input to produce a new frame on output (like + scale) need the READ permission on input and and must request a buffer + with the WRITE permission. + + * Filters that intend to keep a reference after the filtering process + is finished (after end_frame or filter_samples returns) must have the + PRESERVE permission on it and remove the WRITE permission if they + create a new reference to give it away. + + * Filters that intend to modify a reference they have kept after the end + of the filtering process need the REUSE2 permission and must remove + the PRESERVE permission if they create a new reference to give it + away. + + +Frame scheduling +================ + + The purpose of these rules is to ensure that frames flow in the filter + graph without getting stuck and accumulating somewhere. + + Simple filters that output one frame for each input frame should not have + to worry about it. + + start_frame / filter_samples + ---------------------------- + + These methods are called when a frame is pushed to the filter's input. + They can be called at any time except in a reentrant way. + + If the input frame is enough to produce output, then the filter should + push the output frames on the output link immediately. + + As an exception to the previous rule, if the input frame is enough to + produce several output frames, then the filter needs output only at + least one per link. The additional frames can be left buffered in the + filter; these buffered frames must be flushed immediately if a new input + produces new output. + + (Example: framerate-doubling filter: start_frame must (1) flush the + second copy of the previous frame, if it is still there, (2) push the + first copy of the incoming frame, (3) keep the second copy for later.) + + If the input frame is not enough to produce output, the filter must not + call request_frame to get more. It must just process the frame or queue + it. The task of requesting more frames is left to the filter's + request_frame method or the application. + + If a filter has several inputs, the filter must be ready for frames + arriving randomly on any input. Therefore, any filter with several inputs + will most likely require some kind of queuing mechanism. It is perfectly + acceptable to have a limited queue and to drop frames when the inputs + are too unbalanced. + + request_frame + ------------- + + This method is called when a frame is wanted on an output. + + For an input, it should directly call start_frame or filter_samples on + the corresponding output. + + For a filter, if there are queued frames already ready, one of these + frames should be pushed. If not, the filter should request a frame on + one of its inputs, repeatedly until at least one frame has been pushed. + + Return values: + if request_frame could produce a frame, it should return 0; + if it could not for temporary reasons, it should return AVERROR(EAGAIN); + if it could not because there are no more frames, it should return + AVERROR_EOF. + + The typical implementation of request_frame for a filter with several + inputs will look like that: + + if (frames_queued) { + push_one_frame(); + return 0; + } + while (!frame_pushed) { + input = input_where_a_frame_is_most_needed(); + ret = avfilter_request_frame(input); + if (ret == AVERROR_EOF) { + process_eof_on_input(); + } else if (ret < 0) { + return ret; + } + } + return 0; + + Note that, except for filters that can have queued frames, request_frame + does not push frames: it requests them to its input, and as a reaction, + the start_frame / filter_samples method will be called and do the work. diff --git a/doc/filters.texi b/doc/filters.texi index 8f90e84..ea04450 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -1,3 +1,99 @@ +@chapter Filtering Introduction +@c man begin FILTERING INTRODUCTION + +Filtering in FFmpeg is enabled through the libavfilter library. + +Libavfilter is the filtering API of FFmpeg. It is the substitute of +the now deprecated 'vhooks' and started as a Google Summer of Code +project. + +Audio filtering integration into the main FFmpeg repository is a work in +progress, so audio API and ABI should not be considered stable yet. + +In libavfilter, it is possible for filters to have multiple inputs and +multiple outputs. +To illustrate the sorts of things that are possible, we can +use a complex filter graph. For example, the following one: + +@example +input --> split --> fifo -----------------------> overlay --> output + | ^ + | | + +------> fifo --> crop --> vflip --------+ +@end example + +splits the stream in two streams, sends one stream through the crop filter +and the vflip filter before merging it back with the other stream by +overlaying it on top. You can use the following command to achieve this: + +@example +ffmpeg -i input -vf "[in] split [T1], fifo, [T2] overlay=0:H/2 [out]; [T1] fifo, crop=iw:ih/2:0:ih/2, vflip [T2]" output +@end example + +The result will be that in output the top half of the video is mirrored +onto the bottom half. + +Filters are loaded using the @var{-vf} or @var{-af} option passed to +@command{ffmpeg} or to @command{ffplay}. Filters in the same linear +chain are separated by commas. In our example, @var{split, fifo, +overlay} are in one linear chain, and @var{fifo, crop, vflip} are in +another. The points where the linear chains join are labeled by names +enclosed in square brackets. In our example, that is @var{[T1]} and +@var{[T2]}. The special labels @var{[in]} and @var{[out]} are the points +where video is input and output. + +Some filters take in input a list of parameters: they are specified +after the filter name and an equal sign, and are separated from each other +by a colon. + +There exist so-called @var{source filters} that do not have an +audio/video input, and @var{sink filters} that will not have audio/video +output. + +@c man end FILTERING INTRODUCTION + +@chapter graph2dot +@c man begin GRAPH2DOT + +The @file{graph2dot} program included in the FFmpeg @file{tools} +directory can be used to parse a filter graph description and issue a +corresponding textual representation in the dot language. + +Invoke the command: +@example +graph2dot -h +@end example + +to see how to use @file{graph2dot}. + +You can then pass the dot description to the @file{dot} program (from +the graphviz suite of programs) and obtain a graphical representation +of the filter graph. + +For example the sequence of commands: +@example +echo @var{GRAPH_DESCRIPTION} | \ +tools/graph2dot -o graph.tmp && \ +dot -Tpng graph.tmp -o graph.png && \ +display graph.png +@end example + +can be used to create and display an image representing the graph +described by the @var{GRAPH_DESCRIPTION} string. Note that this string must be +a complete self-contained graph, with its inputs and outputs explicitly defined. +For example if your command line is of the form: +@example +ffmpeg -i infile -vf scale=640:360 outfile +@end example +your @var{GRAPH_DESCRIPTION} string will need to be of the form: +@example +nullsrc,scale=640:360,nullsink +@end example +you may also need to set the @var{nullsrc} parameters and add a @var{format} +filter in order to simulate a specific input file. + +@c man end GRAPH2DOT + @chapter Filtergraph description @c man begin FILTERGRAPH DESCRIPTION @@ -19,7 +115,7 @@ output pads is called a "sink". A filtergraph can be represented using a textual representation, which is recognized by the @option{-filter}/@option{-vf} and @option{-filter_complex} -options in @command{avconv} and @option{-vf} in @command{avplay}, and by the +options in @command{ffmpeg} and @option{-vf} in @command{ffplay}, and by the @code{avfilter_graph_parse()}/@code{avfilter_graph_parse2()} function defined in @file{libavfilter/avfiltergraph.h}. @@ -100,13 +196,46 @@ Follows a BNF description for the filtergraph syntax: @chapter Audio Filters @c man begin AUDIO FILTERS -When you configure your Libav build, you can disable any of the -existing filters using --disable-filters. +When you configure your FFmpeg build, you can disable any of the +existing filters using @code{--disable-filters}. The configure output will show the audio filters included in your build. Below is a description of the currently available audio filters. +@section aconvert + +Convert the input audio format to the specified formats. + +The filter accepts a string of the form: +"@var{sample_format}:@var{channel_layout}". + +@var{sample_format} specifies the sample format, and can be a string or the +corresponding numeric value defined in @file{libavutil/samplefmt.h}. Use 'p' +suffix for a planar sample format. + +@var{channel_layout} specifies the channel layout, and can be a string +or the corresponding number value defined in @file{libavutil/audioconvert.h}. + +The special parameter "auto", signifies that the filter will +automatically select the output format depending on the output filter. + +Some examples follow. + +@itemize +@item +Convert input to float, planar, stereo: +@example +aconvert=fltp:stereo +@end example + +@item +Convert input to unsigned 8-bit, automatically select out channel layout: +@example +aconvert=u8:auto +@end example +@end itemize + @section aformat Convert the input audio to one of the specified formats. The framework will @@ -133,13 +262,65 @@ For example to force the output to either unsigned 8-bit or signed 16-bit stereo aformat=sample_fmts\=u8\,s16:channel_layouts\=stereo @end example +@section amerge + +Merge two or more audio streams into a single multi-channel stream. + +The filter accepts the following named options: + +@table @option + +@item inputs +Set the number of inputs. Default is 2. + +@end table + +If the channel layouts of the inputs are disjoint, and therefore compatible, +the channel layout of the output will be set accordingly and the channels +will be reordered as necessary. If the channel layouts of the inputs are not +disjoint, the output will have all the channels of the first input then all +the channels of the second input, in that order, and the channel layout of +the output will be the default value corresponding to the total number of +channels. + +For example, if the first input is in 2.1 (FL+FR+LF) and the second input +is FC+BL+BR, then the output will be in 5.1, with the channels in the +following order: a1, a2, b1, a3, b2, b3 (a1 is the first channel of the +first input, b1 is the first channel of the second input). + +On the other hand, if both input are in stereo, the output channels will be +in the default order: a1, a2, b1, b2, and the channel layout will be +arbitrarily set to 4.0, which may or may not be the expected value. + +All inputs must have the same sample rate, and format. + +If inputs do not have the same duration, the output will stop with the +shortest. + +Example: merge two mono files into a stereo stream: +@example +amovie=left.wav [l] ; amovie=right.mp3 [r] ; [l] [r] amerge +@end example + +Example: multiple merges: +@example +ffmpeg -f lavfi -i " +amovie=input.mkv:si=0 [a0]; +amovie=input.mkv:si=1 [a1]; +amovie=input.mkv:si=2 [a2]; +amovie=input.mkv:si=3 [a3]; +amovie=input.mkv:si=4 [a4]; +amovie=input.mkv:si=5 [a5]; +[a0][a1][a2][a3][a4][a5] amerge=inputs=6" -c:a pcm_s16le output.mkv +@end example + @section amix Mixes multiple audio inputs into a single output. For example @example -avconv -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT +ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT @end example will mix 3 input audio streams to a single output with the same duration as the first input and a dropout transition time of 3 seconds. @@ -175,6 +356,97 @@ stream ends. The default value is 2 seconds. Pass the audio source unchanged to the output. +@section aresample + +Resample the input audio to the specified sample rate. + +The filter accepts exactly one parameter, the output sample rate. If not +specified then the filter will automatically convert between its input +and output sample rates. + +For example, to resample the input audio to 44100Hz: +@example +aresample=44100 +@end example + +@section asetnsamples + +Set the number of samples per each output audio frame. + +The last output packet may contain a different number of samples, as +the filter will flush all the remaining samples when the input audio +signal its end. + +The filter accepts parameters as a list of @var{key}=@var{value} pairs, +separated by ":". + +@table @option + +@item nb_out_samples, n +Set the number of frames per each output audio frame. The number is +intended as the number of samples @emph{per each channel}. +Default value is 1024. + +@item pad, p +If set to 1, the filter will pad the last audio frame with zeroes, so +that the last frame will contain the same number of samples as the +previous ones. Default value is 1. +@end table + +For example, to set the number of per-frame samples to 1234 and +disable padding for the last frame, use: +@example +asetnsamples=n=1234:p=0 +@end example + +@section ashowinfo + +Show a line containing various information for each input audio frame. +The input audio is not modified. + +The shown line contains a sequence of key/value pairs of the form +@var{key}:@var{value}. + +A description of each shown parameter follows: + +@table @option +@item n +sequential number of the input frame, starting from 0 + +@item pts +presentation TimeStamp of the input frame, expressed as a number of +time base units. The time base unit depends on the filter input pad, and +is usually 1/@var{sample_rate}. + +@item pts_time +presentation TimeStamp of the input frame, expressed as a number of +seconds + +@item pos +position of the frame in the input stream, -1 if this information in +unavailable and/or meaningless (for example in case of synthetic audio) + +@item fmt +sample format name + +@item chlayout +channel layout description + +@item nb_samples +number of samples (per each channel) contained in the filtered frame + +@item rate +sample rate for the audio frame + +@item checksum +Adler-32 checksum (printed in hexadecimal) of all the planes of the input frame + +@item plane_checksum +Adler-32 checksum (printed in hexadecimal) for each input frame plane, +expressed in the form "[@var{c0} @var{c1} @var{c2} @var{c3} @var{c4} @var{c5} +@var{c6} @var{c7}]" +@end table + @section asplit Split input audio into several identical outputs. @@ -182,12 +454,293 @@ Split input audio into several identical outputs. The filter accepts a single parameter which specifies the number of outputs. If unspecified, it defaults to 2. -For example +For example: +@example +[in] asplit [out0][out1] +@end example + +will create two separate outputs from the same input. + +To create 3 or more outputs, you need to specify the number of +outputs, like in: @example -avconv -i INPUT -filter_complex asplit=5 OUTPUT +[in] asplit=3 [out0][out1][out2] +@end example + +@example +ffmpeg -i INPUT -filter_complex asplit=5 OUTPUT @end example will create 5 copies of the input audio. + +@section astreamsync + +Forward two audio streams and control the order the buffers are forwarded. + +The argument to the filter is an expression deciding which stream should be +forwarded next: if the result is negative, the first stream is forwarded; if +the result is positive or zero, the second stream is forwarded. It can use +the following variables: + +@table @var +@item b1 b2 +number of buffers forwarded so far on each stream +@item s1 s2 +number of samples forwarded so far on each stream +@item t1 t2 +current timestamp of each stream +@end table + +The default value is @code{t1-t2}, which means to always forward the stream +that has a smaller timestamp. + +Example: stress-test @code{amerge} by randomly sending buffers on the wrong +input, while avoiding too much of a desynchronization: +@example +amovie=file.ogg [a] ; amovie=file.mp3 [b] ; +[a] [b] astreamsync=(2*random(1))-1+tanh(5*(t1-t2)) [a2] [b2] ; +[a2] [b2] amerge +@end example + +@section atempo + +Adjust audio tempo. + +The filter accepts exactly one parameter, the audio tempo. If not +specified then the filter will assume nominal 1.0 tempo. Tempo must +be in the [0.5, 2.0] range. + +For example, to slow down audio to 80% tempo: +@example +atempo=0.8 +@end example + +For example, to speed up audio to 125% tempo: +@example +atempo=1.25 +@end example + +@section earwax + +Make audio easier to listen to on headphones. + +This filter adds `cues' to 44.1kHz stereo (i.e. audio CD format) audio +so that when listened to on headphones the stereo image is moved from +inside your head (standard for headphones) to outside and in front of +the listener (standard for speakers). + +Ported from SoX. + +@section pan + +Mix channels with specific gain levels. The filter accepts the output +channel layout followed by a set of channels definitions. + +This filter is also designed to remap efficiently the channels of an audio +stream. + +The filter accepts parameters of the form: +"@var{l}:@var{outdef}:@var{outdef}:..." + +@table @option +@item l +output channel layout or number of channels + +@item outdef +output channel specification, of the form: +"@var{out_name}=[@var{gain}*]@var{in_name}[+[@var{gain}*]@var{in_name}...]" + +@item out_name +output channel to define, either a channel name (FL, FR, etc.) or a channel +number (c0, c1, etc.) + +@item gain +multiplicative coefficient for the channel, 1 leaving the volume unchanged + +@item in_name +input channel to use, see out_name for details; it is not possible to mix +named and numbered input channels +@end table + +If the `=' in a channel specification is replaced by `<', then the gains for +that specification will be renormalized so that the total is 1, thus +avoiding clipping noise. + +@subsection Mixing examples + +For example, if you want to down-mix from stereo to mono, but with a bigger +factor for the left channel: +@example +pan=1:c0=0.9*c0+0.1*c1 +@end example + +A customized down-mix to stereo that works automatically for 3-, 4-, 5- and +7-channels surround: +@example +pan=stereo: FL < FL + 0.5*FC + 0.6*BL + 0.6*SL : FR < FR + 0.5*FC + 0.6*BR + 0.6*SR +@end example + +Note that @command{ffmpeg} integrates a default down-mix (and up-mix) system +that should be preferred (see "-ac" option) unless you have very specific +needs. + +@subsection Remapping examples + +The channel remapping will be effective if, and only if: + +@itemize +@item gain coefficients are zeroes or ones, +@item only one input per channel output, +@end itemize + +If all these conditions are satisfied, the filter will notify the user ("Pure +channel mapping detected"), and use an optimized and lossless method to do the +remapping. + +For example, if you have a 5.1 source and want a stereo audio stream by +dropping the extra channels: +@example +pan="stereo: c0=FL : c1=FR" +@end example + +Given the same source, you can also switch front left and front right channels +and keep the input channel layout: +@example +pan="5.1: c0=c1 : c1=c0 : c2=c2 : c3=c3 : c4=c4 : c5=c5" +@end example + +If the input is a stereo audio stream, you can mute the front left channel (and +still keep the stereo channel layout) with: +@example +pan="stereo:c1=c1" +@end example + +Still with a stereo audio stream input, you can copy the right channel in both +front left and right: +@example +pan="stereo: c0=FR : c1=FR" +@end example + +@section silencedetect + +Detect silence in an audio stream. + +This filter logs a message when it detects that the input audio volume is less +or equal to a noise tolerance value for a duration greater or equal to the +minimum detected noise duration. + +The printed times and duration are expressed in seconds. + +@table @option +@item duration, d +Set silence duration until notification (default is 2 seconds). + +@item noise, n +Set noise tolerance. Can be specified in dB (in case "dB" is appended to the +specified value) or amplitude ratio. Default is -60dB, or 0.001. +@end table + +Detect 5 seconds of silence with -50dB noise tolerance: +@example +silencedetect=n=-50dB:d=5 +@end example + +Complete example with @command{ffmpeg} to detect silence with 0.0001 noise +tolerance in @file{silence.mp3}: +@example +ffmpeg -f lavfi -i amovie=silence.mp3,silencedetect=noise=0.0001 -f null - +@end example + +@section volume + +Adjust the input audio volume. + +The filter accepts exactly one parameter @var{vol}, which expresses +how the audio volume will be increased or decreased. + +Output values are clipped to the maximum value. + +If @var{vol} is expressed as a decimal number, the output audio +volume is given by the relation: +@example +@var{output_volume} = @var{vol} * @var{input_volume} +@end example + +If @var{vol} is expressed as a decimal number followed by the string +"dB", the value represents the requested change in decibels of the +input audio power, and the output audio volume is given by the +relation: +@example +@var{output_volume} = 10^(@var{vol}/20) * @var{input_volume} +@end example + +Otherwise @var{vol} is considered an expression and its evaluated +value is used for computing the output audio volume according to the +first relation. + +Default value for @var{vol} is 1.0. + +@subsection Examples + +@itemize +@item +Half the input audio volume: +@example +volume=0.5 +@end example + +The above example is equivalent to: +@example +volume=1/2 +@end example + +@item +Decrease input audio power by 12 decibels: +@example +volume=-12dB +@end example +@end itemize + +@section volumedetect + +Detect the volume of the input video. + +The filter has no parameters. The input is not modified. Statistics about +the volume will be printed in the log when the input stream end is reached. + +In particular it will show the mean volume (root mean square), maximum +volume (on a per-sample basis), and the beginning of an histogram of the +registered volume values (from the maximum value to a cumulated 1/1000 of +the samples). + +All volumes are in decibels relative to the maximum PCM value. + +Here is an excerpt of the output: +@example +[Parsed_volumedetect_0 @ 0xa23120] mean_volume: -27 dB +[Parsed_volumedetect_0 @ 0xa23120] max_volume: -4 dB +[Parsed_volumedetect_0 @ 0xa23120] histogram_4db: 6 +[Parsed_volumedetect_0 @ 0xa23120] histogram_5db: 62 +[Parsed_volumedetect_0 @ 0xa23120] histogram_6db: 286 +[Parsed_volumedetect_0 @ 0xa23120] histogram_7db: 1042 +[Parsed_volumedetect_0 @ 0xa23120] histogram_8db: 2551 +[Parsed_volumedetect_0 @ 0xa23120] histogram_9db: 4609 +[Parsed_volumedetect_0 @ 0xa23120] histogram_10db: 8409 +@end example + +It means that: +@itemize +@item +The mean square energy is approximately -27 dB, or 10^-2.7. +@item +The largest sample is at -4 dB, or more precisely between -4 dB and -5 dB. +@item +There are 6 samples at -4 dB, 62 at -5 dB, 286 at -6 dB, etc. +@end itemize + +In other words, raising the volume by +4 dB does not cause any clipping, +raising it by +5 dB causes clipping for 6 samples, etc. + @section asyncts Synchronize audio data with timestamps by squeezing/stretching it and/or dropping samples/adding silence when needed. @@ -228,14 +781,14 @@ Channel layout of the input stream. Default is "stereo". For example, assuming a stereo input MP3 file @example -avconv -i in.mp3 -filter_complex channelsplit out.mkv +ffmpeg -i in.mp3 -filter_complex channelsplit out.mkv @end example will create an output Matroska file with two audio streams, one containing only the left channel and the other the right channel. To split a 5.1 WAV file into per-channel files @example -avconv -i in.wav -filter_complex +ffmpeg -i in.wav -filter_complex 'channelsplit=channel_layout=5.1[FL][FR][FC][LFE][SL][SR]' -map '[FL]' front_left.wav -map '[FR]' front_right.wav -map '[FC]' front_center.wav -map '[LFE]' lfe.wav -map '[SL]' side_left.wav -map '[SR]' @@ -265,14 +818,14 @@ output channels preserving index. For example, assuming a 5.1+downmix input MOV file @example -avconv -i in.mov -filter 'channelmap=map=DL-FL\,DR-FR' out.wav +ffmpeg -i in.mov -filter 'channelmap=map=DL-FL\,DR-FR' out.wav @end example will create an output WAV file tagged as stereo from the downmix channels of the input. To fix a 5.1 WAV improperly encoded in AAC's native channel order @example -avconv -i in.wav -filter 'channelmap=1\,2\,0\,5\,3\,4:channel_layout=5.1' out.wav +ffmpeg -i in.wav -filter 'channelmap=1\,2\,0\,5\,3\,4:channel_layout=5.1' out.wav @end example @section join @@ -302,21 +855,19 @@ and if that fails it picks the first unused input channel. E.g. to join 3 inputs (with properly set channel layouts) @example -avconv -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex join=inputs=3 OUTPUT +ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex join=inputs=3 OUTPUT @end example To build a 5.1 output from 6 single-channel streams: @example -avconv -i fl -i fr -i fc -i sl -i sr -i lfe -filter_complex +ffmpeg -i fl -i fr -i fc -i sl -i sr -i lfe -filter_complex 'join=inputs=6:channel_layout=5.1:map=0.0-FL\,1.0-FR\,2.0-FC\,3.0-SL\,4.0-SR\,5.0-LFE' out @end example @section resample Convert the audio sample format, sample rate and channel layout. This filter is -not meant to be used directly, it is inserted automatically by libavfilter -whenever conversion is needed. Use the @var{aformat} filter to force a specific -conversion. +not meant to be used directly. @c man end AUDIO FILTERS @@ -325,31 +876,188 @@ conversion. Below is a description of the currently available audio sources. +@section abuffer + +Buffer audio frames, and make them available to the filter chain. + +This source is mainly intended for a programmatic use, in particular +through the interface defined in @file{libavfilter/asrc_abuffer.h}. + +It accepts the following mandatory parameters: +@var{sample_rate}:@var{sample_fmt}:@var{channel_layout} + +@table @option + +@item sample_rate +The sample rate of the incoming audio buffers. + +@item sample_fmt +The sample format of the incoming audio buffers. +Either a sample format name or its corresponging integer representation from +the enum AVSampleFormat in @file{libavutil/samplefmt.h} + +@item channel_layout +The channel layout of the incoming audio buffers. +Either a channel layout name from channel_layout_map in +@file{libavutil/audioconvert.c} or its corresponding integer representation +from the AV_CH_LAYOUT_* macros in @file{libavutil/audioconvert.h} + +@end table + +For example: +@example +abuffer=44100:s16p:stereo +@end example + +will instruct the source to accept planar 16bit signed stereo at 44100Hz. +Since the sample format with name "s16p" corresponds to the number +6 and the "stereo" channel layout corresponds to the value 0x3, this is +equivalent to: +@example +abuffer=44100:6:0x3 +@end example + +@section aevalsrc + +Generate an audio signal specified by an expression. + +This source accepts in input one or more expressions (one for each +channel), which are evaluated and used to generate a corresponding +audio signal. + +It accepts the syntax: @var{exprs}[::@var{options}]. +@var{exprs} is a list of expressions separated by ":", one for each +separate channel. In case the @var{channel_layout} is not +specified, the selected channel layout depends on the number of +provided expressions. + +@var{options} is an optional sequence of @var{key}=@var{value} pairs, +separated by ":". + +The description of the accepted options follows. + +@table @option + +@item channel_layout, c +Set the channel layout. The number of channels in the specified layout +must be equal to the number of specified expressions. + +@item duration, d +Set the minimum duration of the sourced audio. See the function +@code{av_parse_time()} for the accepted format. +Note that the resulting duration may be greater than the specified +duration, as the generated audio is always cut at the end of a +complete frame. + +If not specified, or the expressed duration is negative, the audio is +supposed to be generated forever. + +@item nb_samples, n +Set the number of samples per channel per each output frame, +default to 1024. + +@item sample_rate, s +Specify the sample rate, default to 44100. +@end table + +Each expression in @var{exprs} can contain the following constants: + +@table @option +@item n +number of the evaluated sample, starting from 0 + +@item t +time of the evaluated sample expressed in seconds, starting from 0 + +@item s +sample rate + +@end table + +@subsection Examples + +@itemize + +@item +Generate silence: +@example +aevalsrc=0 +@end example + +@item + +Generate a sin signal with frequency of 440 Hz, set sample rate to +8000 Hz: +@example +aevalsrc="sin(440*2*PI*t)::s=8000" +@end example + +@item +Generate a two channels signal, specify the channel layout (Front +Center + Back Center) explicitly: +@example +aevalsrc="sin(420*2*PI*t):cos(430*2*PI*t)::c=FC|BC" +@end example + +@item +Generate white noise: +@example +aevalsrc="-2+random(0)" +@end example + +@item +Generate an amplitude modulated signal: +@example +aevalsrc="sin(10*2*PI*t)*sin(880*2*PI*t)" +@end example + +@item +Generate 2.5 Hz binaural beats on a 360 Hz carrier: +@example +aevalsrc="0.1*sin(2*PI*(360-2.5/2)*t) : 0.1*sin(2*PI*(360+2.5/2)*t)" +@end example + +@end itemize + @section anullsrc -Null audio source, never return audio frames. It is mainly useful as a -template and to be employed in analysis / debugging tools. +Null audio source, return unprocessed audio frames. It is mainly useful +as a template and to be employed in analysis / debugging tools, or as +the source for filters which ignore the input data (for example the sox +synth filter). + +It accepts an optional sequence of @var{key}=@var{value} pairs, +separated by ":". + +The description of the accepted options follows. -It accepts as optional parameter a string of the form -@var{sample_rate}:@var{channel_layout}. +@table @option + +@item sample_rate, s +Specify the sample rate, and defaults to 44100. -@var{sample_rate} specify the sample rate, and defaults to 44100. +@item channel_layout, cl -@var{channel_layout} specify the channel layout, and can be either an -integer or a string representing a channel layout. The default value -of @var{channel_layout} is 3, which corresponds to CH_LAYOUT_STEREO. +Specify the channel layout, and can be either an integer or a string +representing a channel layout. The default value of @var{channel_layout} +is "stereo". Check the channel_layout_map definition in @file{libavcodec/audioconvert.c} for the mapping between strings and channel layout values. +@item nb_samples, n +Set the number of samples per requested frames. + +@end table + Follow some examples: @example -# set the sample rate to 48000 Hz and the channel layout to CH_LAYOUT_MONO. -anullsrc=48000:4 +# set the sample rate to 48000 Hz and the channel layout to AV_CH_LAYOUT_MONO. +anullsrc=r=48000:cl=4 # same as -anullsrc=48000:mono +anullsrc=r=48000:cl=mono @end example @section abuffer @@ -379,6 +1087,73 @@ Channel layout of the audio data, in the form that can be accepted by All the parameters need to be explicitly defined. +@section flite + +Synthesize a voice utterance using the libflite library. + +To enable compilation of this filter you need to configure FFmpeg with +@code{--enable-libflite}. + +Note that the flite library is not thread-safe. + +The source accepts parameters as a list of @var{key}=@var{value} pairs, +separated by ":". + +The description of the accepted parameters follows. + +@table @option + +@item list_voices +If set to 1, list the names of the available voices and exit +immediately. Default value is 0. + +@item nb_samples, n +Set the maximum number of samples per frame. Default value is 512. + +@item textfile +Set the filename containing the text to speak. + +@item text +Set the text to speak. + +@item voice, v +Set the voice to use for the speech synthesis. Default value is +@code{kal}. See also the @var{list_voices} option. +@end table + +@subsection Examples + +@itemize +@item +Read from file @file{speech.txt}, and synthetize the text using the +standard flite voice: +@example +flite=textfile=speech.txt +@end example + +@item +Read the specified text selecting the @code{slt} voice: +@example +flite=text='So fare thee well, poor devil of a Sub-Sub, whose commentator I am':voice=slt +@end example + +@item +Input text to ffmpeg: +@example +ffmpeg -f lavfi -i flite=text='So fare thee well, poor devil of a Sub-Sub, whose commentator I am':voice=slt +@end example + +@item +Make @file{ffplay} speak the specified text, using @code{flite} and +the @code{lavfi} device: +@example +ffplay -f lavfi flite=text='No more be grieved for which that thou hast done.' +@end example +@end itemize + +For more information about libflite, check: +@url{http://www.speech.cs.cmu.edu/flite/} + @c man end AUDIO SOURCES @chapter Audio Sinks @@ -386,6 +1161,17 @@ All the parameters need to be explicitly defined. Below is a description of the currently available audio sinks. +@section abuffersink + +Buffer audio frames, and make them available to the end of filter chain. + +This sink is mainly intended for programmatic use, in particular +through the interface defined in @file{libavfilter/buffersink.h}. + +It requires a pointer to an AVABufferSinkContext structure, which +defines the incoming buffers' formats, to be passed as the opaque +parameter to @code{avfilter_init_filter} for initialization. + @section anullsink Null audio sink, do absolutely nothing with the input audio. It is @@ -404,13 +1190,137 @@ This filter accepts no parameters. @chapter Video Filters @c man begin VIDEO FILTERS -When you configure your Libav build, you can disable any of the -existing filters using --disable-filters. +When you configure your FFmpeg build, you can disable any of the +existing filters using @code{--disable-filters}. The configure output will show the video filters included in your build. Below is a description of the currently available video filters. +@section alphaextract + +Extract the alpha component from the input as a grayscale video. This +is especially useful with the @var{alphamerge} filter. + +@section alphamerge + +Add or replace the alpha component of the primary input with the +grayscale value of a second input. This is intended for use with +@var{alphaextract} to allow the transmission or storage of frame +sequences that have alpha in a format that doesn't support an alpha +channel. + +For example, to reconstruct full frames from a normal YUV-encoded video +and a separate video created with @var{alphaextract}, you might use: +@example +movie=in_alpha.mkv [alpha]; [in][alpha] alphamerge [out] +@end example + +Since this filter is designed for reconstruction, it operates on frame +sequences without considering timestamps, and terminates when either +input reaches end of stream. This will cause problems if your encoding +pipeline drops frames. If you're trying to apply an image as an +overlay to a video stream, consider the @var{overlay} filter instead. + +@section ass + +Draw ASS (Advanced Substation Alpha) subtitles on top of input video +using the libass library. + +To enable compilation of this filter you need to configure FFmpeg with +@code{--enable-libass}. + +This filter accepts the following named options, expressed as a +sequence of @var{key}=@var{value} pairs, separated by ":". + +@table @option +@item filename, f +Set the filename of the ASS file to read. It must be specified. + +@item original_size +Specify the size of the original video, the video for which the ASS file +was composed. Due to a misdesign in ASS aspect ratio arithmetic, this is +necessary to correctly scale the fonts if the aspect ratio has been changed. +@end table + +If the first key is not specified, it is assumed that the first value +specifies the @option{filename}. + +For example, to render the file @file{sub.ass} on top of the input +video, use the command: +@example +ass=sub.ass +@end example + +which is equivalent to: +@example +ass=filename=sub.ass +@end example + +@section bbox + +Compute the bounding box for the non-black pixels in the input frame +luminance plane. + +This filter computes the bounding box containing all the pixels with a +luminance value greater than the minimum allowed value. +The parameters describing the bounding box are printed on the filter +log. + +@section blackdetect + +Detect video intervals that are (almost) completely black. Can be +useful to detect chapter transitions, commercials, or invalid +recordings. Output lines contains the time for the start, end and +duration of the detected black interval expressed in seconds. + +In order to display the output lines, you need to set the loglevel at +least to the AV_LOG_INFO value. + +This filter accepts a list of options in the form of +@var{key}=@var{value} pairs separated by ":". A description of the +accepted options follows. + +@table @option +@item black_min_duration, d +Set the minimum detected black duration expressed in seconds. It must +be a non-negative floating point number. + +Default value is 2.0. + +@item picture_black_ratio_th, pic_th +Set the threshold for considering a picture "black". +Express the minimum value for the ratio: +@example +@var{nb_black_pixels} / @var{nb_pixels} +@end example + +for which a picture is considered black. +Default value is 0.98. + +@item pixel_black_th, pix_th +Set the threshold for considering a pixel "black". + +The threshold expresses the maximum pixel luminance value for which a +pixel is considered "black". The provided value is scaled according to +the following equation: +@example +@var{absolute_threshold} = @var{luminance_minimum_value} + @var{pixel_black_th} * @var{luminance_range_size} +@end example + +@var{luminance_range_size} and @var{luminance_minimum_value} depend on +the input video format, the range is [0-255] for YUV full-range +formats and [16-235] for YUV non full-range formats. + +Default value is 0.10. +@end table + +The following example sets the maximum pixel threshold to the minimum +value, and detects only black intervals of 2 or more seconds: +@example +blackdetect=d=2:pix_th=0.00 +@end example + @section blackframe Detect frames that are (almost) completely black. Can be useful to @@ -437,7 +1347,7 @@ considered black, and defaults to 32. Apply boxblur algorithm to the input video. This filter accepts the parameters: -@var{luma_power}:@var{luma_radius}:@var{chroma_radius}:@var{chroma_power}:@var{alpha_radius}:@var{alpha_power} +@var{luma_radius}:@var{luma_power}:@var{chroma_radius}:@var{chroma_power}:@var{alpha_radius}:@var{alpha_power} Chroma and alpha parameters are optional, if not specified they default to the corresponding values set for @var{luma_radius} and @@ -492,6 +1402,18 @@ boxblur=min(h\,w)/10:1:min(cw\,ch)/10:1 @end itemize +@section colormatrix + +The colormatrix filter allows conversion between any of the following color +space: BT.709 (@var{bt709}), BT.601 (@var{bt601}), SMPTE-240M (@var{smpte240m}) +and FCC (@var{fcc}). + +The syntax of the parameters is @var{source}:@var{destination}: + +@example +colormatrix=bt601:smpte240m +@end example + @section copy Copy the input source unchanged to the output. Mainly useful for @@ -499,15 +1421,16 @@ testing purposes. @section crop -Crop the input video to @var{out_w}:@var{out_h}:@var{x}:@var{y}. +Crop the input video to @var{out_w}:@var{out_h}:@var{x}:@var{y}:@var{keep_aspect} -The parameters are expressions containing the following constants: +The @var{keep_aspect} parameter is optional, if specified and set to a +non-zero value will force the output display aspect ratio to be the +same of the input, by changing the output sample aspect ratio. -@table @option -@item E, PI, PHI -the corresponding mathematical approximated values for e -(euler number), pi (greek PI), PHI (golden ratio) +The @var{out_w}, @var{out_h}, @var{x}, @var{y} parameters are +expressions containing the following constants: +@table @option @item x, y the computed values for @var{x} and @var{y}. They are evaluated for each new frame. @@ -524,6 +1447,19 @@ the output (cropped) width and height @item ow, oh same as @var{out_w} and @var{out_h} +@item a +same as @var{iw} / @var{ih} + +@item sar +input sample aspect ratio + +@item dar +input display aspect ratio, it is the same as (@var{iw} / @var{ih}) * @var{sar} + +@item hsub, vsub +horizontal and vertical chroma subsample values. For example for the +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1. + @item n the number of input frame, starting from 0 @@ -630,6 +1566,43 @@ indicates never reset and return the largest area encountered during playback. @end table +@section decimate + +This filter drops frames that do not differ greatly from the previous +frame in order to reduce framerate. The main use of this filter is +for very-low-bitrate encoding (e.g. streaming over dialup modem), but +it could in theory be used for fixing movies that were +inverse-telecined incorrectly. + +It accepts the following parameters: +@var{max}:@var{hi}:@var{lo}:@var{frac}. + +@table @option + +@item max +Set the maximum number of consecutive frames which can be dropped (if +positive), or the minimum interval between dropped frames (if +negative). If the value is 0, the frame is dropped unregarding the +number of previous sequentially dropped frames. + +Default value is 0. + +@item hi, lo, frac +Set the dropping threshold values. + +Values for @var{hi} and @var{lo} are for 8x8 pixel blocks and +represent actual pixel value differences, so a threshold of 64 +corresponds to 1 unit of difference for each pixel, or the same spread +out differently over the block. + +A frame is a candidate for dropping if no 8x8 blocks differ by more +than a threshold of @var{hi}, and if no more than @var{frac} blocks (1 +meaning the whole image) differ by more than a threshold of @var{lo}. + +Default value for @var{hi} is 64*12, default value for @var{lo} is +64*5, and default value for @var{frac} is 0.33. +@end table + @section delogo Suppress a TV station logo by a simple interpolation of the surrounding @@ -682,6 +1655,76 @@ delogo=x=0:y=0:w=100:h=77:band=10 @end itemize +@section deshake + +Attempt to fix small changes in horizontal and/or vertical shift. This +filter helps remove camera shake from hand-holding a camera, bumping a +tripod, moving on a vehicle, etc. + +The filter accepts parameters as a string of the form +"@var{x}:@var{y}:@var{w}:@var{h}:@var{rx}:@var{ry}:@var{edge}:@var{blocksize}:@var{contrast}:@var{search}:@var{filename}" + +A description of the accepted parameters follows. + +@table @option + +@item x, y, w, h +Specify a rectangular area where to limit the search for motion +vectors. +If desired the search for motion vectors can be limited to a +rectangular area of the frame defined by its top left corner, width +and height. These parameters have the same meaning as the drawbox +filter which can be used to visualise the position of the bounding +box. + +This is useful when simultaneous movement of subjects within the frame +might be confused for camera motion by the motion vector search. + +If any or all of @var{x}, @var{y}, @var{w} and @var{h} are set to -1 +then the full frame is used. This allows later options to be set +without specifying the bounding box for the motion vector search. + +Default - search the whole frame. + +@item rx, ry +Specify the maximum extent of movement in x and y directions in the +range 0-64 pixels. Default 16. + +@item edge +Specify how to generate pixels to fill blanks at the edge of the +frame. An integer from 0 to 3 as follows: +@table @option +@item 0 +Fill zeroes at blank locations +@item 1 +Original image at blank locations +@item 2 +Extruded edge value at blank locations +@item 3 +Mirrored edge at blank locations +@end table + +The default setting is mirror edge at blank locations. + +@item blocksize +Specify the blocksize to use for motion search. Range 4-128 pixels, +default 8. + +@item contrast +Specify the contrast threshold for blocks. Only blocks with more than +the specified contrast (difference between darkest and lightest +pixels) will be considered. Range 1-255, default 125. + +@item search +Specify the search strategy 0 = exhaustive search, 1 = less exhaustive +search. Default - exhaustive search. + +@item filename +If set then a detailed log of the motion search is written to the +specified file. + +@end table + @section drawbox Draw a colored box on the input image. @@ -719,7 +1762,7 @@ drawbox=10:20:200:60:red@@0.5" Draw text string or text from specified file on top of video using the libfreetype library. -To enable compilation of this filter you need to configure Libav with +To enable compilation of this filter you need to configure FFmpeg with @code{--enable-libfreetype}. The filter also recognizes strftime() sequences in the provided text @@ -732,60 +1775,29 @@ The description of the accepted parameters follows. @table @option -@item fontfile -The font file to be used for drawing text. Path must be included. -This parameter is mandatory. - -@item text -The text string to be drawn. The text must be a sequence of UTF-8 -encoded characters. -This parameter is mandatory if no file is specified with the parameter -@var{textfile}. - -@item textfile -A text file containing text to be drawn. The text must be a sequence -of UTF-8 encoded characters. - -This parameter is mandatory if no text string is specified with the -parameter @var{text}. - -If both text and textfile are specified, an error is thrown. - -@item x, y -The offsets where text will be drawn within the video frame. -Relative to the top/left border of the output image. -They accept expressions similar to the @ref{overlay} filter: -@table @option - -@item x, y -the computed values for @var{x} and @var{y}. They are evaluated for -each new frame. - -@item main_w, main_h -main input width and height - -@item W, H -same as @var{main_w} and @var{main_h} - -@item text_w, text_h -rendered text width and height - -@item w, h -same as @var{text_w} and @var{text_h} +@item box +Used to draw a box around text using background color. +Value should be either 1 (enable) or 0 (disable). +The default value of @var{box} is 0. -@item n -the number of frames processed, starting from 0 +@item boxcolor +The color to be used for drawing box around text. +Either a string (e.g. "yellow") or in 0xRRGGBB[AA] format +(e.g. "0xff00ff"), possibly followed by an alpha specifier. +The default value of @var{boxcolor} is "white". -@item t -timestamp expressed in seconds, NAN if the input timestamp is unknown +@item draw +Set an expression which specifies if the text should be drawn. If the +expression evaluates to 0, the text is not drawn. This is useful for +specifying that the text should be drawn only when specific conditions +are met. -@end table +Default value is "1". -The default value of @var{x} and @var{y} is 0. +See below for the list of accepted constants and functions. -@item fontsize -The font size to be used for drawing text. -The default value of @var{fontsize} is 16. +@item fix_bounds +If true, check and fix text coords to avoid clipping. @item fontcolor The color to be used for drawing fonts. @@ -793,27 +1805,13 @@ Either a string (e.g. "red") or in 0xRRGGBB[AA] format (e.g. "0xff000033"), possibly followed by an alpha specifier. The default value of @var{fontcolor} is "black". -@item boxcolor -The color to be used for drawing box around text. -Either a string (e.g. "yellow") or in 0xRRGGBB[AA] format -(e.g. "0xff00ff"), possibly followed by an alpha specifier. -The default value of @var{boxcolor} is "white". - -@item box -Used to draw a box around text using background color. -Value should be either 1 (enable) or 0 (disable). -The default value of @var{box} is 0. - -@item shadowx, shadowy -The x and y offsets for the text shadow position with respect to the -position of the text. They can be either positive or negative -values. Default value for both is "0". +@item fontfile +The font file to be used for drawing text. Path must be included. +This parameter is mandatory. -@item shadowcolor -The color to be used for drawing a shadow behind the drawn text. It -can be a color name (e.g. "yellow") or a string in the 0xRRGGBB[AA] -form (e.g. "0xff00ff"), possibly followed by an alpha specifier. -The default value of @var{shadowcolor} is "black". +@item fontsize +The font size to be used for drawing text. +The default value of @var{fontsize} is 16. @item ft_load_flags Flags to be used for loading the fonts. @@ -844,45 +1842,230 @@ Default value is "render". For more information consult the documentation for the FT_LOAD_* libfreetype flags. +@item shadowcolor +The color to be used for drawing a shadow behind the drawn text. It +can be a color name (e.g. "yellow") or a string in the 0xRRGGBB[AA] +form (e.g. "0xff00ff"), possibly followed by an alpha specifier. +The default value of @var{shadowcolor} is "black". + +@item shadowx, shadowy +The x and y offsets for the text shadow position with respect to the +position of the text. They can be either positive or negative +values. Default value for both is "0". + @item tabsize The size in number of spaces to use for rendering the tab. Default value is 4. -@item fix_bounds -If true, check and fix text coords to avoid clipping. +@item timecode +Set the initial timecode representation in "hh:mm:ss[:;.]ff" +format. It can be used with or without text parameter. @var{timecode_rate} +option must be specified. + +@item timecode_rate, rate, r +Set the timecode frame rate (timecode only). + +@item text +The text string to be drawn. The text must be a sequence of UTF-8 +encoded characters. +This parameter is mandatory if no file is specified with the parameter +@var{textfile}. + +@item textfile +A text file containing text to be drawn. The text must be a sequence +of UTF-8 encoded characters. + +This parameter is mandatory if no text string is specified with the +parameter @var{text}. + +If both @var{text} and @var{textfile} are specified, an error is thrown. + +@item x, y +The expressions which specify the offsets where text will be drawn +within the video frame. They are relative to the top/left border of the +output image. + +The default value of @var{x} and @var{y} is "0". + +See below for the list of accepted constants and functions. +@end table + +The parameters for @var{x} and @var{y} are expressions containing the +following constants and functions: + +@table @option +@item dar +input display aspect ratio, it is the same as (@var{w} / @var{h}) * @var{sar} + +@item hsub, vsub +horizontal and vertical chroma subsample values. For example for the +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1. + +@item line_h, lh +the height of each text line + +@item main_h, h, H +the input height + +@item main_w, w, W +the input width + +@item max_glyph_a, ascent +the maximum distance from the baseline to the highest/upper grid +coordinate used to place a glyph outline point, for all the rendered +glyphs. +It is a positive value, due to the grid's orientation with the Y axis +upwards. + +@item max_glyph_d, descent +the maximum distance from the baseline to the lowest grid coordinate +used to place a glyph outline point, for all the rendered glyphs. +This is a negative value, due to the grid's orientation, with the Y axis +upwards. + +@item max_glyph_h +maximum glyph height, that is the maximum height for all the glyphs +contained in the rendered text, it is equivalent to @var{ascent} - +@var{descent}. + +@item max_glyph_w +maximum glyph width, that is the maximum width for all the glyphs +contained in the rendered text + +@item n +the number of input frame, starting from 0 + +@item rand(min, max) +return a random number included between @var{min} and @var{max} + +@item sar +input sample aspect ratio + +@item t +timestamp expressed in seconds, NAN if the input timestamp is unknown + +@item text_h, th +the height of the rendered text + +@item text_w, tw +the width of the rendered text + +@item x, y +the x and y offset coordinates where the text is drawn. + +These parameters allow the @var{x} and @var{y} expressions to refer +each other, so you can for example specify @code{y=x/dar}. @end table -For example the command: +If libavfilter was built with @code{--enable-fontconfig}, then +@option{fontfile} can be a fontconfig pattern or omitted. + +Some examples follow. + +@itemize + +@item +Draw "Test Text" with font FreeSerif, using the default values for the +optional parameters. + @example drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='Test Text'" @end example -will draw "Test Text" with font FreeSerif, using the default values -for the optional parameters. +@item +Draw 'Test Text' with font FreeSerif of size 24 at position x=100 +and y=50 (counting from the top-left corner of the screen), text is +yellow with a red box around it. Both the text and the box have an +opacity of 20%. -The command: @example drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='Test Text':\ x=100: y=50: fontsize=24: fontcolor=yellow@@0.2: box=1: boxcolor=red@@0.2" @end example -will draw 'Test Text' with font FreeSerif of size 24 at position x=100 -and y=50 (counting from the top-left corner of the screen), text is -yellow with a red box around it. Both the text and the box have an -opacity of 20%. - Note that the double quotes are not necessary if spaces are not used within the parameter list. +@item +Show the text at the center of the video frame: +@example +drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=(w-text_w)/2:y=(h-text_h-line_h)/2" +@end example + +@item +Show a text line sliding from right to left in the last row of the video +frame. The file @file{LONG_LINE} is assumed to contain a single line +with no newlines. +@example +drawtext="fontsize=15:fontfile=FreeSerif.ttf:text=LONG_LINE:y=h-line_h:x=-50*t" +@end example + +@item +Show the content of file @file{CREDITS} off the bottom of the frame and scroll up. +@example +drawtext="fontsize=20:fontfile=FreeSerif.ttf:textfile=CREDITS:y=h-20*t" +@end example + +@item +Draw a single green letter "g", at the center of the input video. +The glyph baseline is placed at half screen height. +@example +drawtext="fontsize=60:fontfile=FreeSerif.ttf:fontcolor=green:text=g:x=(w-max_glyph_w)/2:y=h/2-ascent" +@end example + +@item +Show text for 1 second every 3 seconds: +@example +drawtext="fontfile=FreeSerif.ttf:fontcolor=white:x=100:y=x/dar:draw=lt(mod(t\\,3)\\,1):text='blink'" +@end example + +@item +Use fontconfig to set the font. Note that the colons need to be escaped. +@example +drawtext='fontfile=Linux Libertine O-40\\:style=Semibold:text=FFmpeg' +@end example + +@end itemize + For more information about libfreetype, check: @url{http://www.freetype.org/}. +For more information about fontconfig, check: +@url{http://freedesktop.org/software/fontconfig/fontconfig-user.html}. + +@section edgedetect + +Detect and draw edges. The filter uses the Canny Edge Detection algorithm. + +This filter accepts the following optional named parameters: + +@table @option +@item low, high +Set low and high threshold values used by the Canny thresholding +algorithm. + +The high threshold selects the "strong" edge pixels, which are then +connected through 8-connectivity with the "weak" edge pixels selected +by the low threshold. + +@var{low} and @var{high} threshold values must be choosen in the range +[0,1], and @var{low} should be lesser or equal to @var{high}. + +Default value for @var{low} is @code{20/255}, and default value for @var{high} +is @code{50/255}. +@end table + +Example: +@example +edgedetect=low=0.1:high=0.4 +@end example + @section fade Apply fade-in/out effect to input video. It accepts the parameters: -@var{type}:@var{start_frame}:@var{nb_frames} +@var{type}:@var{start_frame}:@var{nb_frames}[:@var{options}] @var{type} specifies if the effect type, can be either "in" for fade-in, or "out" for a fade-out effect. @@ -895,6 +2078,25 @@ effect has to last. At the end of the fade-in effect the output video will have the same intensity as the input video, at the end of the fade-out transition the output video will be completely black. +@var{options} is an optional sequence of @var{key}=@var{value} pairs, +separated by ":". The description of the accepted options follows. + +@table @option + +@item type, t +See @var{type}. + +@item start_frame, s +See @var{start_frame}. + +@item nb_frames, n +See @var{nb_frames}. + +@item alpha +If set to 1, fade only alpha channel, if one exists on the input. +Default value is 0. +@end table + A few usage examples follow, usable too as test scenarios. @example # fade in first 30 frames of video @@ -908,6 +2110,9 @@ fade=in:0:25, fade=out:975:25 # make first 5 frames black, then fade in from frame 5-24 fade=in:5:20 + +# fade in alpha over first 25 frames of video +fade=in:0:25:alpha=1 @end example @section fieldorder @@ -940,7 +2145,7 @@ which is bottom field first. For example: @example -./avconv -i in.vob -vf "fieldorder=bff" out.dv +ffmpeg -i in.vob -vf "fieldorder=bff" out.dv @end example @section fifo @@ -983,13 +2188,20 @@ Desired output framerate. @end table +@section framestep + +Select one frame every N. + +This filter accepts in input a string representing a positive +integer. Default argument is @code{1}. + @anchor{frei0r} @section frei0r Apply a frei0r effect to the input video. To enable compilation of this filter you need to install the frei0r -header and configure Libav with --enable-frei0r. +header and configure FFmpeg with @code{--enable-frei0r}. The filter supports the syntax: @example @@ -1017,27 +2229,37 @@ The number and kind of parameters depend on the loaded effect. If an effect parameter is not specified the default value is set. Some examples follow: + +@itemize +@item +Apply the distort0r effect, set the first two double parameters: @example -# apply the distort0r effect, set the first two double parameters frei0r=distort0r:0.5:0.01 +@end example -# apply the colordistance effect, takes a color as first parameter +@item +Apply the colordistance effect, takes a color as first parameter: +@example frei0r=colordistance:0.2/0.3/0.4 frei0r=colordistance:violet frei0r=colordistance:0x112233 +@end example -# apply the perspective effect, specify the top left and top right -# image positions +@item +Apply the perspective effect, specify the top left and top right image +positions: +@example frei0r=perspective:0.2/0.2:0.8/0.2 @end example +@end itemize For more information see: -@url{http://piksel.org/frei0r} +@url{http://frei0r.dyne.org} @section gradfun Fix the banding artifacts that are sometimes introduced into nearly flat -regions by truncation to 8bit colordepth. +regions by truncation to 8bit color depth. Interpolate the gradients that should go where the bands are, and dither them. @@ -1071,9 +2293,9 @@ gradfun=1.2 Flip the input video horizontally. -For example to horizontally flip the input video with @command{avconv}: +For example to horizontally flip the input video with @command{ffmpeg}: @example -avconv -i in.avi -vf "hflip" out.avi +ffmpeg -i in.avi -vf "hflip" out.avi @end example @section hqdn3d @@ -1103,6 +2325,125 @@ a float number which specifies chroma temporal strength, defaults to @var{luma_tmp}*@var{chroma_spatial}/@var{luma_spatial} @end table +@section hue + +Modify the hue and/or the saturation of the input. + +This filter accepts the following optional named options: + +@table @option +@item h +Specify the hue angle as a number of degrees. It accepts a float +number or an expression, and defaults to 0.0. + +@item H +Specify the hue angle as a number of degrees. It accepts a float +number or an expression, and defaults to 0.0. + +@item s +Specify the saturation in the [-10,10] range. It accepts a float number and +defaults to 1.0. +@end table + +The @var{h}, @var{H} and @var{s} parameters are expressions containing the +following constants: + +@table @option +@item n +frame count of the input frame starting from 0 + +@item pts +presentation timestamp of the input frame expressed in time base units + +@item r +frame rate of the input video, NAN if the input frame rate is unknown + +@item t +timestamp expressed in seconds, NAN if the input timestamp is unknown + +@item tb +time base of the input video +@end table + +The options can also be set using the syntax: @var{hue}:@var{saturation} + +In this case @var{hue} is expressed in degrees. + +Some examples follow: +@itemize +@item +Set the hue to 90 degrees and the saturation to 1.0: +@example +hue=h=90:s=1 +@end example + +@item +Same command but expressing the hue in radians: +@example +hue=H=PI/2:s=1 +@end example + +@item +Same command without named options, hue must be expressed in degrees: +@example +hue=90:1 +@end example + +@item +Note that "h:s" syntax does not support expressions for the values of +h and s, so the following example will issue an error: +@example +hue=PI/2:1 +@end example + +@item +Rotate hue and make the saturation swing between 0 +and 2 over a period of 1 second: +@example +hue="H=2*PI*t: s=sin(2*PI*t)+1" +@end example + +@item +Apply a 3 seconds saturation fade-in effect starting at 0: +@example +hue="s=min(t/3\,1)" +@end example + +The general fade-in expression can be written as: +@example +hue="s=min(0\, max((t-START)/DURATION\, 1))" +@end example + +@item +Apply a 3 seconds saturation fade-out effect starting at 5 seconds: +@example +hue="s=max(0\, min(1\, (8-t)/3))" +@end example + +The general fade-out expression can be written as: +@example +hue="s=max(0\, min(1\, (START+DURATION-t)/DURATION))" +@end example + +@end itemize + +@subsection Commands + +This filter supports the following command: +@table @option +@item reinit +Modify the hue and/or the saturation of the input video. +The command accepts the same named options and syntax than when calling the +filter from the command-line. + +If a parameter is omitted, it is kept at its current value. +@end table + +@section idet + +Interlaceing detect filter. This filter tries to detect if the input is +interlaced or progressive. Top or bottom field first. + @section lut, lutrgb, lutyuv Compute a look-up table for binding each pixel component input value @@ -1148,10 +2489,6 @@ accepts the options: The expressions can contain the following constants and functions: @table @option -@item E, PI, PHI -the corresponding mathematical approximated values for e -(euler number), pi (greek PI), PHI (golden ratio) - @item w, h the input width and height @@ -1197,7 +2534,7 @@ lutrgb="r=negval:g=negval:b=negval" lutyuv="y=negval:u=negval:v=negval" # negate luminance -lutyuv=negval +lutyuv=y=negval # remove chroma components, turns the video into a graytone image lutyuv="u=128:v=128" @@ -1215,6 +2552,90 @@ format=rgba,lutrgb=a="maxval-minval/2" lutyuv=y=gammaval(0.5) @end example +@section mp + +Apply an MPlayer filter to the input video. + +This filter provides a wrapper around most of the filters of +MPlayer/MEncoder. + +This wrapper is considered experimental. Some of the wrapped filters +may not work properly and we may drop support for them, as they will +be implemented natively into FFmpeg. Thus you should avoid +depending on them when writing portable scripts. + +The filters accepts the parameters: +@var{filter_name}[:=]@var{filter_params} + +@var{filter_name} is the name of a supported MPlayer filter, +@var{filter_params} is a string containing the parameters accepted by +the named filter. + +The list of the currently supported filters follows: +@table @var +@item denoise3d +@item detc +@item dint +@item divtc +@item down3dright +@item dsize +@item eq2 +@item eq +@item field +@item fil +@item fixpts +@item fspp +@item geq +@item harddup +@item hqdn3d +@item il +@item ilpack +@item ivtc +@item kerndeint +@item mcdeint +@item noise +@item ow +@item palette +@item perspective +@item phase +@item pp7 +@item pullup +@item qp +@item rectangle +@item sab +@item softpulldown +@item softskip +@item spp +@item telecine +@item tile +@item tinterlace +@item unsharp +@item uspp +@item yuvcsp +@item yvu9 +@end table + +The parameter syntax and behavior for the listed filters are the same +of the corresponding MPlayer filters. For detailed instructions check +the "VIDEO FILTERS" section in the MPlayer manual. + +Some examples follow: +@itemize +@item +Adjust gamma, brightness, contrast: +@example +mp=eq2=1.0:2:0.5 +@end example + +@item +Add temporal noise to input video: +@example +mp=noise=20t +@end example +@end itemize + +See also mplayer(1), @url{http://www.mplayerhq.hu/}. + @section negate Negate input video. @@ -1222,6 +2643,8 @@ Negate input video. This filter accepts an integer in input, if non-zero it negates the alpha component (if available). The default value in input is 0. +@section noformat + Force libavfilter not to use any of the specified pixel formats for the input to the next filter. @@ -1247,7 +2670,7 @@ Pass the video source unchanged to the output. Apply video transform using libopencv. To enable this filter install libopencv library and headers and -configure Libav with --enable-libopencv. +configure FFmpeg with @code{--enable-libopencv}. The filter takes the parameters: @var{filter_name}@{:=@}@var{filter_params}. @@ -1347,10 +2770,10 @@ Overlay one video on top of another. It takes two inputs and one output, the first input is the "main" video on which the second input is overlayed. -It accepts the parameters: @var{x}:@var{y}. +It accepts the parameters: @var{x}:@var{y}[:@var{options}]. @var{x} is the x coordinate of the overlayed video on the main video, -@var{y} is the y coordinate. The parameters are expressions containing +@var{y} is the y coordinate. @var{x} and @var{y} are expressions containing the following parameters: @table @option @@ -1367,6 +2790,17 @@ overlay input width and height same as @var{overlay_w} and @var{overlay_h} @end table +@var{options} is an optional list of @var{key}=@var{value} pairs, +separated by ":". + +The description of the accepted options follows. + +@table @option +@item rgb +If set to 1, force the filter to accept inputs in the RGB +color space. Default value is 0. +@end table + Be aware that frames are taken from each input video in timestamp order, hence, if their initial timestamps differ, it is a a good idea to pass the two inputs through a @var{setpts=PTS-STARTPTS} filter to @@ -1380,16 +2814,23 @@ Follow some examples: overlay=main_w-overlay_w-10:main_h-overlay_h-10 # insert a transparent PNG logo in the bottom left corner of the input -avconv -i input -i logo -filter_complex 'overlay=10:main_h-overlay_h-10' output +ffmpeg -i input -i logo -filter_complex 'overlay=10:main_h-overlay_h-10' output # insert 2 different transparent PNG logos (second logo on bottom # right corner): -avconv -i input -i logo1 -i logo2 -filter_complex +ffmpeg -i input -i logo1 -i logo2 -filter_complex 'overlay=10:H-h-10,overlay=W-w-10:H-h-10' output # add a transparent color layer on top of the main video, # WxH specifies the size of the main input to the overlay filter color=red@.3:WxH [over]; [in][over] overlay [out] + +# play an original video and a filtered version (here with the deshake filter) +# side by side +ffplay input.avi -vf 'split[a][b]; [a]pad=iw*2:ih[src]; [b]deshake[filt]; [src][filt]overlay=w' + +# the previous example is the same as: +ffplay input.avi -vf 'split[b], pad=iw*2[src], [b]deshake, [src]overlay=w' @end example You can chain together more overlays but the efficiency of such @@ -1407,10 +2848,6 @@ The parameters @var{width}, @var{height}, @var{x}, and @var{y} are expressions containing the following constants: @table @option -@item E, PI, PHI -the corresponding mathematical approximated values for e -(euler number), pi (greek PI), phi (golden ratio) - @item in_w, in_h the input video width and height @@ -1429,7 +2866,13 @@ x and y offsets as specified by the @var{x} and @var{y} expressions, or NAN if not yet specified @item a -input display aspect ratio, same as @var{iw} / @var{ih} +same as @var{iw} / @var{ih} + +@item sar +input sample aspect ratio + +@item dar +input display aspect ratio, it is the same as (@var{iw} / @var{ih}) * @var{sar} @item hsub, vsub horizontal and vertical chroma subsample values. For example for the @@ -1469,30 +2912,59 @@ The default value of @var{color} is "black". @end table -Some examples follow: +@subsection Examples +@itemize +@item +Add paddings with color "violet" to the input video. Output video +size is 640x480, the top-left corner of the input video is placed at +column 0, row 40: @example -# Add paddings with color "violet" to the input video. Output video -# size is 640x480, the top-left corner of the input video is placed at -# column 0, row 40. pad=640:480:0:40:violet +@end example -# pad the input to get an output with dimensions increased bt 3/2, -# and put the input video at the center of the padded area +@item +Pad the input to get an output with dimensions increased by 3/2, +and put the input video at the center of the padded area: +@example pad="3/2*iw:3/2*ih:(ow-iw)/2:(oh-ih)/2" +@end example -# pad the input to get a squared output with size equal to the maximum -# value between the input width and height, and put the input video at -# the center of the padded area +@item +Pad the input to get a squared output with size equal to the maximum +value between the input width and height, and put the input video at +the center of the padded area: +@example pad="max(iw\,ih):ow:(ow-iw)/2:(oh-ih)/2" +@end example -# pad the input to get a final w/h ratio of 16:9 +@item +Pad the input to get a final w/h ratio of 16:9: +@example pad="ih*16/9:ih:(ow-iw)/2:(oh-ih)/2" +@end example -# double output size and put the input video in the bottom-right -# corner of the output padded area +@item +In case of anamorphic video, in order to set the output display aspect +correctly, it is necessary to use @var{sar} in the expression, +according to the relation: +@example +(ih * X / ih) * sar = output_dar +X = output_dar / sar +@end example + +Thus the previous example needs to be modified to: +@example +pad="ih*16/9/sar:ih:(ow-iw)/2:(oh-ih)/2" +@end example + +@item +Double output size and put the input video in the bottom-right +corner of the output padded area: +@example pad="2*iw:2*ih:ow-iw:oh-ih" @end example +@end itemize @section pixdesctest @@ -1506,18 +2978,43 @@ format=monow, pixdesctest can be used to test the monowhite pixel format descriptor definition. +@section removelogo + +Suppress a TV station logo, using an image file to determine which +pixels comprise the logo. It works by filling in the pixels that +comprise the logo with neighboring pixels. + +This filter requires one argument which specifies the filter bitmap +file, which can be any image format supported by libavformat. The +width and height of the image file must match those of the video +stream being processed. + +Pixels in the provided bitmap image with a value of zero are not +considered part of the logo, non-zero pixels are considered part of +the logo. If you use white (255) for the logo and black (0) for the +rest, you will be safe. For making the filter bitmap, it is +recommended to take a screen capture of a black frame with the logo +visible, and then using a threshold filter followed by the erode +filter once or twice. + +If needed, little splotches can be fixed manually. Remember that if +logo pixels are not covered, the filter quality will be much +reduced. Marking too many pixels as part of the logo does not hurt as +much, but it will increase the amount of blurring needed to cover over +the image and will destroy more information than necessary, and extra +pixels will slow things down on a large logo. + @section scale -Scale the input video to @var{width}:@var{height} and/or convert the image format. +Scale (resize) the input video to @var{width}:@var{height}[:@var{interl}=@{1|-1@}] and/or convert the image format. + +The scale filter forces the output display aspect ratio to be the same +of the input, by changing the output sample aspect ratio. The parameters @var{width} and @var{height} are expressions containing the following constants: @table @option -@item E, PI, PHI -the corresponding mathematical approximated values for e -(euler number), pi (greek PI), phi (golden ratio) - @item in_w, in_h the input width and height @@ -1530,12 +3027,15 @@ the output (cropped) width and height @item ow, oh same as @var{out_w} and @var{out_h} -@item dar, a -input display aspect ratio, same as @var{iw} / @var{ih} +@item a +same as @var{iw} / @var{ih} @item sar input sample aspect ratio +@item dar +input display aspect ratio, it is the same as (@var{iw} / @var{ih}) * @var{sar} + @item hsub, vsub horizontal and vertical chroma subsample values. For example for the pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1. @@ -1554,6 +3054,19 @@ ratio of the input image. The default value of @var{width} and @var{height} is 0. +Valid values for the optional parameter @var{interl} are: + +@table @option +@item 1 +force interlaced aware scaling + +@item -1 +select interlaced aware scaling depending on whether the source frames +are flagged as interlaced or not +@end table + +Unless @var{interl} is set to one of the above options, interlaced scaling will not be used. + Some examples follow: @example # scale the input video to a size of 200x100. @@ -1564,6 +3077,9 @@ scale=2*iw:2*ih # the above is the same as scale=2*in_w:2*in_h +# scale the input to 2x with forced interlaced scaling +scale=2*iw:2*ih:interl=1 + # scale the input to half size scale=iw/2:ih/2 @@ -1594,15 +3110,6 @@ is selected and passed to the output, otherwise it is discarded. The expression can contain the following constants: @table @option -@item PI -Greek PI - -@item PHI -golden ratio - -@item E -Euler number - @item n the sequential number of the filtered frame, starting from 0 @@ -1668,6 +3175,12 @@ the frame is bottom-field-first @item pos the position in the file of the filtered frame, -1 if the information is not available (e.g. for synthetic video) + +@item scene +value between 0 and 1 to indicate a new scene; a low value reflects a low +probability for the current frame to introduce a new scene, while a higher +value means the current frame is more likely to be one (see the example below) + @end table The default value of the select expression is "1". @@ -1700,151 +3213,112 @@ select='gte(t\,10)*lte(t\,20)*eq(pict_type\,I)' select='isnan(prev_selected_t)+gte(t-prev_selected_t\,10)' @end example -@anchor{setdar} -@section setdar - -Set the Display Aspect Ratio for the filter output video. +Complete example to create a mosaic of the first scenes: -This is done by changing the specified Sample (aka Pixel) Aspect -Ratio, according to the following equation: -@math{DAR = HORIZONTAL_RESOLUTION / VERTICAL_RESOLUTION * SAR} - -Keep in mind that this filter does not modify the pixel dimensions of -the video frame. Also the display aspect ratio set by this filter may -be changed by later filters in the filterchain, e.g. in case of -scaling or if another "setdar" or a "setsar" filter is applied. - -The filter accepts a parameter string which represents the wanted -display aspect ratio. -The parameter can be a floating point number string, or an expression -of the form @var{num}:@var{den}, where @var{num} and @var{den} are the -numerator and denominator of the aspect ratio. -If the parameter is not specified, it is assumed the value "0:1". - -For example to change the display aspect ratio to 16:9, specify: @example -setdar=16:9 -# the above is equivalent to -setdar=1.77777 +ffmpeg -i video.avi -vf select='gt(scene\,0.4)',scale=160:120,tile -frames:v 1 preview.png @end example -See also the @ref{setsar} filter documentation. - -@section setpts - -Change the PTS (presentation timestamp) of the input video frames. - -Accept in input an expression evaluated through the eval API, which -can contain the following constants: - -@table @option -@item PTS -the presentation timestamp in input +Comparing @var{scene} against a value between 0.3 and 0.5 is generally a sane +choice. -@item PI -Greek PI +@section setdar, setsar -@item PHI -golden ratio +The @code{setdar} filter sets the Display Aspect Ratio for the filter +output video. -@item E -Euler number +This is done by changing the specified Sample (aka Pixel) Aspect +Ratio, according to the following equation: +@example +@var{DAR} = @var{HORIZONTAL_RESOLUTION} / @var{VERTICAL_RESOLUTION} * @var{SAR} +@end example -@item N -the count of the input frame, starting from 0. +Keep in mind that the @code{setdar} filter does not modify the pixel +dimensions of the video frame. Also the display aspect ratio set by +this filter may be changed by later filters in the filterchain, +e.g. in case of scaling or if another "setdar" or a "setsar" filter is +applied. -@item STARTPTS -the PTS of the first video frame +The @code{setsar} filter sets the Sample (aka Pixel) Aspect Ratio for +the filter output video. -@item INTERLACED -tell if the current frame is interlaced +Note that as a consequence of the application of this filter, the +output display aspect ratio will change according to the equation +above. -@item POS -original position in the file of the frame, or undefined if undefined -for the current frame +Keep in mind that the sample aspect ratio set by the @code{setsar} +filter may be changed by later filters in the filterchain, e.g. if +another "setsar" or a "setdar" filter is applied. -@item PREV_INPTS -previous input PTS - -@item PREV_OUTPTS -previous output PTS +The @code{setdar} and @code{setsar} filters accept a string in the +form @var{num}:@var{den} expressing an aspect ratio, or the following +named options, expressed as a sequence of @var{key}=@var{value} pairs, +separated by ":". +@table @option +@item max +Set the maximum integer value to use for expressing numerator and +denominator when reducing the expressed aspect ratio to a rational. +Default value is @code{100}. + +@item r, ratio: +Set the aspect ratio used by the filter. + +The parameter can be a floating point number string, an expression, or +a string of the form @var{num}:@var{den}, where @var{num} and +@var{den} are the numerator and denominator of the aspect ratio. If +the parameter is not specified, it is assumed the value "0". +In case the form "@var{num}:@var{den}" the @code{:} character should +be escaped. @end table -Some examples follow: +If the keys are omitted in the named options list, the specifed values +are assumed to be @var{ratio} and @var{max} in that order. +For example to change the display aspect ratio to 16:9, specify: @example -# start counting PTS from zero -setpts=PTS-STARTPTS - -# fast motion -setpts=0.5*PTS - -# slow motion -setpts=2.0*PTS - -# fixed rate 25 fps -setpts=N/(25*TB) - -# fixed rate 25 fps with some jitter -setpts='1/(25*TB) * (N + 0.05 * sin(N*2*PI/25))' +setdar='16:9' @end example -@anchor{setsar} -@section setsar - -Set the Sample (aka Pixel) Aspect Ratio for the filter output video. - -Note that as a consequence of the application of this filter, the -output display aspect ratio will change according to the following -equation: -@math{DAR = HORIZONTAL_RESOLUTION / VERTICAL_RESOLUTION * SAR} - -Keep in mind that the sample aspect ratio set by this filter may be -changed by later filters in the filterchain, e.g. if another "setsar" -or a "setdar" filter is applied. - -The filter accepts a parameter string which represents the wanted -sample aspect ratio. -The parameter can be a floating point number string, or an expression -of the form @var{num}:@var{den}, where @var{num} and @var{den} are the -numerator and denominator of the aspect ratio. -If the parameter is not specified, it is assumed the value "0:1". - -For example to change the sample aspect ratio to 10:11, specify: +The example above is equivalent to: @example -setsar=10:11 +setdar=1.77777 @end example -@section settb - -Set the timebase to use for the output frames timestamps. -It is mainly useful for testing timebase configuration. +To change the sample aspect ratio to 10:11, specify: +@example +setsar='10:11' +@end example -It accepts in input an arithmetic expression representing a rational. -The expression can contain the constants "PI", "E", "PHI", "AVTB" (the -default timebase), and "intb" (the input timebase). +To set a display aspect ratio of 16:9, and specify a maximum integer value of +1000 in the aspect ratio reduction, use the command: +@example +setdar=ratio='16:9':max=1000 +@end example -The default value for the input is "intb". +@section setfield -Follow some examples. +Force field for the output video frame. -@example -# set the timebase to 1/25 -settb=1/25 +The @code{setfield} filter marks the interlace type field for the +output frames. It does not change the input frame, but only sets the +corresponding property, which affects how the frame is treated by +following filters (e.g. @code{fieldorder} or @code{yadif}). -# set the timebase to 1/10 -settb=0.1 +It accepts a string parameter, which can assume the following values: +@table @samp +@item auto +Keep the same field property. -#set the timebase to 1001/1000 -settb=1+0.001 +@item bff +Mark the frame as bottom-field-first. -#set the timebase to 2*intb -settb=2*intb +@item tff +Mark the frame as top-field-first. -#set the default timebase value -settb=AVTB -@end example +@item prog +Mark the frame as progressive. +@end table @section showinfo @@ -1898,11 +3372,11 @@ the @code{av_get_picture_type_char} function defined in @file{libavutil/avutil.h}. @item checksum -Adler-32 checksum of all the planes of the input frame +Adler-32 checksum (printed in hexadecimal) of all the planes of the input frame @item plane_checksum -Adler-32 checksum of each plane of the input frame, expressed in the form -"[@var{c0} @var{c1} @var{c2} @var{c3}]" +Adler-32 checksum (printed in hexadecimal) of each plane of the input frame, +expressed in the form "[@var{c0} @var{c1} @var{c2} @var{c3}]" @end table @section slicify @@ -1911,7 +3385,7 @@ Pass the images of input video on to next video filter as multiple slices. @example -./avconv -i in.avi -vf "slicify=32" out.avi +ffmpeg -i in.avi -vf "slicify=32" out.avi @end example The filter accepts the slice height as parameter. If the parameter is @@ -1920,6 +3394,35 @@ not specified it will use the default value of 16. Adding this in the beginning of filter chains should make filtering faster due to better use of the memory cache. +@section smartblur + +Blur the input video without impacting the outlines. + +The filter accepts the following parameters: +@var{luma_radius}:@var{luma_strength}:@var{luma_threshold}[:@var{chroma_radius}:@var{chroma_strength}:@var{chroma_threshold}] + +Parameters prefixed by @var{luma} indicate that they work on the +luminance of the pixels whereas parameters prefixed by @var{chroma} +refer to the chrominance of the pixels. + +If the chroma parameters are not set, the luma parameters are used for +either the luminance and the chrominance of the pixels. + +@var{luma_radius} or @var{chroma_radius} must be a float number in the +range [0.1,5.0] that specifies the variance of the gaussian filter +used to blur the image (slower if larger). + +@var{luma_strength} or @var{chroma_strength} must be a float number in +the range [-1.0,1.0] that configures the blurring. A value included in +[0.0,1.0] will blur the image whereas a value included in [-1.0,0.0] +will sharpen the image. + +@var{luma_threshold} or @var{chroma_threshold} must be an integer in +the range [-30,30] that is used as a coefficient to determine whether +a pixel should be blurred or not. A value of 0 will filter all the +image, a value included in [0,30] will filter flat areas and a value +included in [-30,0] will filter edges. + @section split Split input video into several identical outputs. @@ -1929,19 +3432,126 @@ unspecified, it defaults to 2. For example @example -avconv -i INPUT -filter_complex split=5 OUTPUT +ffmpeg -i INPUT -filter_complex split=5 OUTPUT @end example will create 5 copies of the input video. +For example: +@example +[in] split [splitout1][splitout2]; +[splitout1] crop=100:100:0:0 [cropout]; +[splitout2] pad=200:200:100:100 [padout]; +@end example + +will create two separate outputs from the same input, one cropped and +one padded. + +@section super2xsai + +Scale the input by 2x and smooth using the Super2xSaI (Scale and +Interpolate) pixel art scaling algorithm. + +Useful for enlarging pixel art images without reducing sharpness. + +@section swapuv +Swap U & V plane. + +@section thumbnail +Select the most representative frame in a given sequence of consecutive frames. + +It accepts as argument the frames batch size to analyze (default @var{N}=100); +in a set of @var{N} frames, the filter will pick one of them, and then handle +the next batch of @var{N} frames until the end. + +Since the filter keeps track of the whole frames sequence, a bigger @var{N} +value will result in a higher memory usage, so a high value is not recommended. + +The following example extract one picture each 50 frames: +@example +thumbnail=50 +@end example + +Complete example of a thumbnail creation with @command{ffmpeg}: +@example +ffmpeg -i in.avi -vf thumbnail,scale=300:200 -frames:v 1 out.png +@end example + +@section tile + +Tile several successive frames together. + +It accepts as argument the tile size (i.e. the number of lines and columns) +in the form "@var{w}x@var{h}". + +For example, produce 8×8 PNG tiles of all keyframes (@option{-skip_frame +nokey}) in a movie: +@example +ffmpeg -skip_frame nokey -i file.avi -vf 'scale=128:72,tile=8x8' -an -vsync 0 keyframes%03d.png +@end example +The @option{-vsync 0} is necessary to prevent @command{ffmpeg} from +duplicating each output frame to accomodate the originally detected frame +rate. + +@section tinterlace + +Perform various types of temporal field interlacing. + +Frames are counted starting from 1, so the first input frame is +considered odd. + +This filter accepts a single parameter specifying the mode. Available +modes are: + +@table @samp +@item merge, 0 +Move odd frames into the upper field, even into the lower field, +generating a double height frame at half framerate. + +@item drop_odd, 1 +Only output even frames, odd frames are dropped, generating a frame with +unchanged height at half framerate. + +@item drop_even, 2 +Only output odd frames, even frames are dropped, generating a frame with +unchanged height at half framerate. + +@item pad, 3 +Expand each frame to full height, but pad alternate lines with black, +generating a frame with double height at the same input framerate. + +@item interleave_top, 4 +Interleave the upper field from odd frames with the lower field from +even frames, generating a frame with unchanged height at half framerate. + +@item interleave_bottom, 5 +Interleave the lower field from odd frames with the upper field from +even frames, generating a frame with unchanged height at half framerate. + +@item interlacex2, 6 +Double frame rate with unchanged height. Frames are inserted each +containing the second temporal field from the previous input frame and +the first temporal field from the next input frame. This mode relies on +the top_field_first flag. Useful for interlaced video displays with no +field synchronisation. +@end table + +Numeric values are deprecated but are accepted for backward +compatibility reasons. + +Default mode is @code{merge}. + @section transpose Transpose rows with columns in the input video and optionally flip it. -It accepts a parameter representing an integer, which can assume the -values: +This filter accepts the following named parameters: + +@table @option +@item dir +Specify the transposition direction. Can assume the following values: @table @samp -@item 0 +@item 0, 4 Rotate by 90 degrees counterclockwise and vertically flip (default), that is: @example L.R L.l @@ -1949,7 +3559,7 @@ L.R L.l l.r R.r @end example -@item 1 +@item 1, 5 Rotate by 90 degrees clockwise, that is: @example L.R l.L @@ -1957,7 +3567,7 @@ L.R l.L l.r r.R @end example -@item 2 +@item 2, 6 Rotate by 90 degrees counterclockwise, that is: @example L.R R.r @@ -1965,7 +3575,7 @@ L.R R.r l.r L.l @end example -@item 3 +@item 3, 7 Rotate by 90 degrees clockwise and vertically flip, that is: @example L.R r.R @@ -1974,6 +3584,25 @@ l.r l.L @end example @end table +For values between 4-7, the transposition is only done if the input +video geometry is portrait and not landscape. These values are +deprecated, the @code{passthrough} option should be used instead. + +@item passthrough +Do not apply the transposition if the input geometry matches the one +specified by the specified value. It accepts the following values: +@table @samp +@item none +Always apply transposition. +@item portrait +Preserve portrait geometry (when @var{height} >= @var{width}). +@item landscape +Preserve landscape geometry (when @var{width} >= @var{height}). +@end table + +Default value is @code{none}. +@end table + @section unsharp Sharpen or blur the input video. @@ -2007,7 +3636,7 @@ and 13, default value is 5. Set the chroma matrix vertical size. It can be an integer between 3 and 13, default value is 5. -@item luma_amount +@item chroma_amount Set the chroma effect strength. It can be a float number between -2.0 and 5.0, default value is 0.0. @@ -2020,8 +3649,8 @@ unsharp=7:7:2.5 # Strong blur of both luma and chroma parameters unsharp=7:7:-2:7:7:-2 -# Use the default values with @command{avconv} -./avconv -i in.avi -vf "unsharp" out.mp4 +# Use the default values with @command{ffmpeg} +ffmpeg -i in.avi -vf "unsharp" out.mp4 @end example @section vflip @@ -2029,7 +3658,7 @@ unsharp=7:7:-2:7:7:-2 Flip the input video vertically. @example -./avconv -i in.avi -vf "vflip" out.avi +ffmpeg -i in.avi -vf "vflip" out.avi @end example @section yadif @@ -2097,35 +3726,37 @@ Buffer video frames, and make them available to the filter chain. This source is mainly intended for a programmatic use, in particular through the interface defined in @file{libavfilter/vsrc_buffer.h}. -It accepts the following parameters: -@var{width}:@var{height}:@var{pix_fmt_string}:@var{timebase_num}:@var{timebase_den}:@var{sample_aspect_ratio_num}:@var{sample_aspect_ratio.den} - -All the parameters need to be explicitly defined. - -Follows the list of the accepted parameters. +It accepts a list of options in the form of @var{key}=@var{value} pairs +separated by ":". A description of the accepted options follows. @table @option -@item width, height -Specify the width and height of the buffered video frames. +@item video_size +Specify the size (width and height) of the buffered video frames. -@item pix_fmt_string +@item pix_fmt A string representing the pixel format of the buffered video frames. It may be a number corresponding to a pixel format, or a pixel format name. -@item timebase_num, timebase_den -Specify numerator and denomitor of the timebase assumed by the -timestamps of the buffered frames. +@item time_base +Specify the timebase assumed by the timestamps of the buffered frames. + +@item time_base +Specify the frame rate expected for the video stream. -@item sample_aspect_ratio.num, sample_aspect_ratio.den -Specify numerator and denominator of the sample aspect ratio assumed -by the video frames. +@item pixel_aspect +Specify the sample aspect ratio assumed by the video frames. + +@item sws_param +Specify the optional parameters to be used for the scale filter which +is automatically inserted when an input change is detected in the +input size or format. @end table For example: @example -buffer=320:240:yuv410p:1:24:1:1 +buffer=size=320x240:pix_fmt=yuv410p:time_base=1/24:pixel_aspect=1/1 @end example will instruct the source to accept video frames with size 320x240 and @@ -2135,130 +3766,265 @@ Since the pixel format with name "yuv410p" corresponds to the number 6 (check the enum AVPixelFormat definition in @file{libavutil/pixfmt.h}), this example corresponds to: @example -buffer=320:240:6:1:24 +buffer=size=320x240:pixfmt=6:time_base=1/24:pixel_aspect=1/1 @end example -@section color +Alternatively, the options can be specified as a flat string, but this +syntax is deprecated: -Provide an uniformly colored input. +@var{width}:@var{height}:@var{pix_fmt}:@var{time_base.num}:@var{time_base.den}:@var{pixel_aspect.num}:@var{pixel_aspect.den}[:@var{sws_param}] -It accepts the following parameters: -@var{color}:@var{frame_size}:@var{frame_rate} +@section cellauto -Follows the description of the accepted parameters. +Create a pattern generated by an elementary cellular automaton. + +The initial state of the cellular automaton can be defined through the +@option{filename}, and @option{pattern} options. If such options are +not specified an initial state is created randomly. + +At each new frame a new row in the video is filled with the result of +the cellular automaton next generation. The behavior when the whole +frame is filled is defined by the @option{scroll} option. + +This source accepts a list of options in the form of +@var{key}=@var{value} pairs separated by ":". A description of the +accepted options follows. @table @option +@item filename, f +Read the initial cellular automaton state, i.e. the starting row, from +the specified file. +In the file, each non-whitespace character is considered an alive +cell, a newline will terminate the row, and further characters in the +file will be ignored. -@item color -Specify the color of the source. It can be the name of a color (case -insensitive match) or a 0xRRGGBB[AA] sequence, possibly followed by an -alpha specifier. The default value is "black". +@item pattern, p +Read the initial cellular automaton state, i.e. the starting row, from +the specified string. -@item frame_size -Specify the size of the sourced video, it may be a string of the form -@var{width}x@var{height}, or the name of a size abbreviation. The -default value is "320x240". +Each non-whitespace character in the string is considered an alive +cell, a newline will terminate the row, and further characters in the +string will be ignored. -@item frame_rate -Specify the frame rate of the sourced video, as the number of frames -generated per second. It has to be a string in the format -@var{frame_rate_num}/@var{frame_rate_den}, an integer number, a float -number or a valid video frame rate abbreviation. The default value is -"25". +@item rate, r +Set the video rate, that is the number of frames generated per second. +Default is 25. + +@item random_fill_ratio, ratio +Set the random fill ratio for the initial cellular automaton row. It +is a floating point number value ranging from 0 to 1, defaults to +1/PHI. + +This option is ignored when a file or a pattern is specified. + +@item random_seed, seed +Set the seed for filling randomly the initial row, must be an integer +included between 0 and UINT32_MAX. If not specified, or if explicitly +set to -1, the filter will try to use a good random seed on a best +effort basis. + +@item rule +Set the cellular automaton rule, it is a number ranging from 0 to 255. +Default value is 110. + +@item size, s +Set the size of the output video. + +If @option{filename} or @option{pattern} is specified, the size is set +by default to the width of the specified initial state row, and the +height is set to @var{width} * PHI. + +If @option{size} is set, it must contain the width of the specified +pattern string, and the specified pattern will be centered in the +larger row. + +If a filename or a pattern string is not specified, the size value +defaults to "320x518" (used for a randomly generated initial state). + +@item scroll +If set to 1, scroll the output upward when all the rows in the output +have been already filled. If set to 0, the new generated row will be +written over the top row just after the bottom row is filled. +Defaults to 1. +@item start_full, full +If set to 1, completely fill the output with generated rows before +outputting the first frame. +This is the default behavior, for disabling set the value to 0. + +@item stitch +If set to 1, stitch the left and right row edges together. +This is the default behavior, for disabling set the value to 0. @end table -For example the following graph description will generate a red source -with an opacity of 0.2, with size "qcif" and a frame rate of 10 -frames per second, which will be overlayed over the source connected -to the pad with identifier "in". +@subsection Examples +@itemize +@item +Read the initial state from @file{pattern}, and specify an output of +size 200x400. @example -"color=red@@0.2:qcif:10 [color]; [in][color] overlay [out]" +cellauto=f=pattern:s=200x400 @end example -@section movie +@item +Generate a random initial row with a width of 200 cells, with a fill +ratio of 2/3: +@example +cellauto=ratio=2/3:s=200x200 +@end example + +@item +Create a pattern generated by rule 18 starting by a single alive cell +centered on an initial row with width 100: +@example +cellauto=p=@@:s=100x400:full=0:rule=18 +@end example -Read a video stream from a movie container. +@item +Specify a more elaborated initial pattern: +@example +cellauto=p='@@@@ @@ @@@@':s=100x400:full=0:rule=18 +@end example -Note that this source is a hack that bypasses the standard input path. It can be -useful in applications that do not support arbitrary filter graphs, but its use -is discouraged in those that do. Specifically in @command{avconv} this filter -should never be used, the @option{-filter_complex} option fully replaces it. +@end itemize -It accepts the syntax: @var{movie_name}[:@var{options}] where -@var{movie_name} is the name of the resource to read (not necessarily -a file but also a device or a stream accessed through some protocol), -and @var{options} is an optional sequence of @var{key}=@var{value} -pairs, separated by ":". +@section mandelbrot -The description of the accepted options follows. +Generate a Mandelbrot set fractal, and progressively zoom towards the +point specified with @var{start_x} and @var{start_y}. + +This source accepts a list of options in the form of +@var{key}=@var{value} pairs separated by ":". A description of the +accepted options follows. @table @option -@item format_name, f -Specifies the format assumed for the movie to read, and can be either -the name of a container or an input device. If not specified the -format is guessed from @var{movie_name} or by probing. +@item end_pts +Set the terminal pts value. Default value is 400. -@item seek_point, sp -Specifies the seek point in seconds, the frames will be output -starting from this seek point, the parameter is evaluated with -@code{av_strtod} so the numerical value may be suffixed by an IS -postfix. Default value is "0". +@item end_scale +Set the terminal scale value. +Must be a floating point value. Default value is 0.3. -@item stream_index, si -Specifies the index of the video stream to read. If the value is -1, -the best suited video stream will be automatically selected. Default -value is "-1". +@item inner +Set the inner coloring mode, that is the algorithm used to draw the +Mandelbrot fractal internal region. +It shall assume one of the following values: +@table @option +@item black +Set black mode. +@item convergence +Show time until convergence. +@item mincol +Set color based on point closest to the origin of the iterations. +@item period +Set period mode. @end table -This filter allows to overlay a second video on top of main input of -a filtergraph as shown in this graph: -@example -input -----------> deltapts0 --> overlay --> output - ^ - | -movie --> scale--> deltapts1 -------+ -@end example +Default value is @var{mincol}. -Some examples follow: -@example -# skip 3.2 seconds from the start of the avi file in.avi, and overlay it -# on top of the input labelled as "in". -movie=in.avi:seek_point=3.2, scale=180:-1, setpts=PTS-STARTPTS [movie]; -[in] setpts=PTS-STARTPTS, [movie] overlay=16:16 [out] +@item bailout +Set the bailout value. Default value is 10.0. -# read from a video4linux2 device, and overlay it on top of the input -# labelled as "in" -movie=/dev/video0:f=video4linux2, scale=180:-1, setpts=PTS-STARTPTS [movie]; -[in] setpts=PTS-STARTPTS, [movie] overlay=16:16 [out] +@item maxiter +Set the maximum of iterations performed by the rendering +algorithm. Default value is 7189. + +@item outer +Set outer coloring mode. +It shall assume one of following values: +@table @option +@item iteration_count +Set iteration cound mode. +@item normalized_iteration_count +set normalized iteration count mode. +@end table +Default value is @var{normalized_iteration_count}. + +@item rate, r +Set frame rate, expressed as number of frames per second. Default +value is "25". + +@item size, s +Set frame size. Default value is "640x480". +@item start_scale +Set the initial scale value. Default value is 3.0. + +@item start_x +Set the initial x position. Must be a floating point value between +-100 and 100. Default value is -0.743643887037158704752191506114774. + +@item start_y +Set the initial y position. Must be a floating point value between +-100 and 100. Default value is -0.131825904205311970493132056385139. +@end table + +@section mptestsrc + +Generate various test patterns, as generated by the MPlayer test filter. + +The size of the generated video is fixed, and is 256x256. +This source is useful in particular for testing encoding features. + +This source accepts an optional sequence of @var{key}=@var{value} pairs, +separated by ":". The description of the accepted options follows. + +@table @option + +@item rate, r +Specify the frame rate of the sourced video, as the number of frames +generated per second. It has to be a string in the format +@var{frame_rate_num}/@var{frame_rate_den}, an integer number, a float +number or a valid video frame rate abbreviation. The default value is +"25". + +@item duration, d +Set the video duration of the sourced video. The accepted syntax is: +@example +[-]HH:MM:SS[.m...] +[-]S+[.m...] @end example +See also the function @code{av_parse_time()}. -@section nullsrc +If not specified, or the expressed duration is negative, the video is +supposed to be generated forever. + +@item test, t -Null video source, never return images. It is mainly useful as a -template and to be employed in analysis / debugging tools. +Set the number or the name of the test to perform. Supported tests are: +@table @option +@item dc_luma +@item dc_chroma +@item freq_luma +@item freq_chroma +@item amp_luma +@item amp_chroma +@item cbp +@item mv +@item ring1 +@item ring2 +@item all +@end table -It accepts as optional parameter a string of the form -@var{width}:@var{height}:@var{timebase}. +Default value is "all", which will cycle through the list of all tests. +@end table -@var{width} and @var{height} specify the size of the configured -source. The default values of @var{width} and @var{height} are -respectively 352 and 288 (corresponding to the CIF size format). +For example the following: +@example +testsrc=t=dc_luma +@end example -@var{timebase} specifies an arithmetic expression representing a -timebase. The expression can contain the constants "PI", "E", "PHI", -"AVTB" (the default timebase), and defaults to the value "AVTB". +will generate a "dc_luma" test pattern. @section frei0r_src Provide a frei0r source. To enable compilation of this filter you need to install the frei0r -header and configure Libav with --enable-frei0r. +header and configure FFmpeg with @code{--enable-frei0r}. The source supports the syntax: @example @@ -2273,28 +4039,169 @@ the form @var{num}/@var{den} or a frame rate abbreviation. information regarding frei0r and how to set the parameters read the section @ref{frei0r} in the description of the video filters. -Some examples follow: +For example, to generate a frei0r partik0l source with size 200x200 +and frame rate 10 which is overlayed on the overlay filter main input: @example -# generate a frei0r partik0l source with size 200x200 and framerate 10 -# which is overlayed on the overlay filter main input frei0r_src=200x200:10:partik0l=1234 [overlay]; [in][overlay] overlay @end example -@section rgbtestsrc, testsrc +@section life + +Generate a life pattern. + +This source is based on a generalization of John Conway's life game. + +The sourced input represents a life grid, each pixel represents a cell +which can be in one of two possible states, alive or dead. Every cell +interacts with its eight neighbours, which are the cells that are +horizontally, vertically, or diagonally adjacent. + +At each interaction the grid evolves according to the adopted rule, +which specifies the number of neighbor alive cells which will make a +cell stay alive or born. The @option{rule} option allows to specify +the rule to adopt. + +This source accepts a list of options in the form of +@var{key}=@var{value} pairs separated by ":". A description of the +accepted options follows. + +@table @option +@item filename, f +Set the file from which to read the initial grid state. In the file, +each non-whitespace character is considered an alive cell, and newline +is used to delimit the end of each row. + +If this option is not specified, the initial grid is generated +randomly. + +@item rate, r +Set the video rate, that is the number of frames generated per second. +Default is 25. + +@item random_fill_ratio, ratio +Set the random fill ratio for the initial random grid. It is a +floating point number value ranging from 0 to 1, defaults to 1/PHI. +It is ignored when a file is specified. + +@item random_seed, seed +Set the seed for filling the initial random grid, must be an integer +included between 0 and UINT32_MAX. If not specified, or if explicitly +set to -1, the filter will try to use a good random seed on a best +effort basis. + +@item rule +Set the life rule. + +A rule can be specified with a code of the kind "S@var{NS}/B@var{NB}", +where @var{NS} and @var{NB} are sequences of numbers in the range 0-8, +@var{NS} specifies the number of alive neighbor cells which make a +live cell stay alive, and @var{NB} the number of alive neighbor cells +which make a dead cell to become alive (i.e. to "born"). +"s" and "b" can be used in place of "S" and "B", respectively. + +Alternatively a rule can be specified by an 18-bits integer. The 9 +high order bits are used to encode the next cell state if it is alive +for each number of neighbor alive cells, the low order bits specify +the rule for "borning" new cells. Higher order bits encode for an +higher number of neighbor cells. +For example the number 6153 = @code{(12<<9)+9} specifies a stay alive +rule of 12 and a born rule of 9, which corresponds to "S23/B03". + +Default value is "S23/B3", which is the original Conway's game of life +rule, and will keep a cell alive if it has 2 or 3 neighbor alive +cells, and will born a new cell if there are three alive cells around +a dead cell. + +@item size, s +Set the size of the output video. + +If @option{filename} is specified, the size is set by default to the +same size of the input file. If @option{size} is set, it must contain +the size specified in the input file, and the initial grid defined in +that file is centered in the larger resulting area. + +If a filename is not specified, the size value defaults to "320x240" +(used for a randomly generated initial grid). + +@item stitch +If set to 1, stitch the left and right grid edges together, and the +top and bottom edges also. Defaults to 1. + +@item mold +Set cell mold speed. If set, a dead cell will go from @option{death_color} to +@option{mold_color} with a step of @option{mold}. @option{mold} can have a +value from 0 to 255. + +@item life_color +Set the color of living (or new born) cells. + +@item death_color +Set the color of dead cells. If @option{mold} is set, this is the first color +used to represent a dead cell. + +@item mold_color +Set mold color, for definitely dead and moldy cells. +@end table + +@subsection Examples + +@itemize +@item +Read a grid from @file{pattern}, and center it on a grid of size +300x300 pixels: +@example +life=f=pattern:s=300x300 +@end example + +@item +Generate a random grid of size 200x200, with a fill ratio of 2/3: +@example +life=ratio=2/3:s=200x200 +@end example + +@item +Specify a custom rule for evolving a randomly generated grid: +@example +life=rule=S14/B34 +@end example + +@item +Full example with slow death effect (mold) using @command{ffplay}: +@example +ffplay -f lavfi life=s=300x200:mold=10:r=60:ratio=0.1:death_color=#C83232:life_color=#00ff00,scale=1200:800:flags=16 +@end example +@end itemize + +@section color, nullsrc, rgbtestsrc, smptebars, testsrc + +The @code{color} source provides an uniformly colored input. + +The @code{nullsrc} source returns unprocessed video frames. It is +mainly useful to be employed in analysis / debugging tools, or as the +source for filters which ignore the input data. The @code{rgbtestsrc} source generates an RGB test pattern useful for detecting RGB vs BGR issues. You should see a red, green and blue stripe from top to bottom. +The @code{smptebars} source generates a color bars pattern, based on +the SMPTE Engineering Guideline EG 1-1990. + The @code{testsrc} source generates a test video pattern, showing a color pattern, a scrolling gradient and a timestamp. This is mainly intended for testing purposes. -Both sources accept an optional sequence of @var{key}=@var{value} pairs, +These sources accept an optional sequence of @var{key}=@var{value} pairs, separated by ":". The description of the accepted options follows. @table @option +@item color, c +Specify the color of the source, only used in the @code{color} +source. It can be the name of a color (case insensitive match) or a +0xRRGGBB[AA] sequence, possibly followed by an alpha specifier. The +default value is "black". + @item size, s Specify the size of the sourced video, it may be a string of the form @var{width}x@var{height}, or the name of a size abbreviation. The @@ -2310,7 +4217,7 @@ number or a valid video frame rate abbreviation. The default value is @item sar Set the sample aspect ratio of the sourced video. -@item duration +@item duration, d Set the video duration of the sourced video. The accepted syntax is: @example [-]HH[:MM[:SS[.m...]]] @@ -2320,6 +4227,14 @@ See also the function @code{av_parse_time()}. If not specified, or the expressed duration is negative, the video is supposed to be generated forever. + +@item decimals, n +Set the number of decimals to show in the timestamp, only used in the +@code{testsrc} source. + +The displayed timestamp value will correspond to the original +timestamp value multiplied by the power of 10 of the specified +value. Default value is 0. @end table For example the following: @@ -2328,7 +4243,21 @@ testsrc=duration=5.3:size=qcif:rate=10 @end example will generate a video with a duration of 5.3 seconds, with size -176x144 and a framerate of 10 frames per second. +176x144 and a frame rate of 10 frames per second. + +The following graph description will generate a red source +with an opacity of 0.2, with size "qcif" and a frame rate of 10 +frames per second. +@example +color=c=red@@0.2:s=qcif:r=10 +@end example + +If the input content is to be ignored, @code{nullsrc} can be used. The +following command generates noise in the luminance plane by employing +the @code{mp=geq} filter: +@example +nullsrc=s=256x256, mp=geq=random(1)*255:128:128 +@end example @c man end VIDEO SOURCES @@ -2342,8 +4271,13 @@ Below is a description of the currently available video sinks. Buffer video frames, and make them available to the end of the filter graph. -This sink is intended for a programmatic use through the interface defined in -@file{libavfilter/buffersink.h}. +This sink is mainly intended for a programmatic use, in particular +through the interface defined in @file{libavfilter/buffersink.h}. + +It does not require a string parameter in input, but you need to +specify a pointer to a list of supported pixel formats terminated by +-1 in the opaque parameter provided to @code{avfilter_init_filter} +when initializing this sink. @section nullsink @@ -2352,3 +4286,560 @@ mainly useful as a template and to be employed in analysis / debugging tools. @c man end VIDEO SINKS + +@chapter Multimedia Filters +@c man begin MULTIMEDIA FILTERS + +Below is a description of the currently available multimedia filters. + +@section asendcmd, sendcmd + +Send commands to filters in the filtergraph. + +These filters read commands to be sent to other filters in the +filtergraph. + +@code{asendcmd} must be inserted between two audio filters, +@code{sendcmd} must be inserted between two video filters, but apart +from that they act the same way. + +The specification of commands can be provided in the filter arguments +with the @var{commands} option, or in a file specified by the +@var{filename} option. + +These filters accept the following options: +@table @option +@item commands, c +Set the commands to be read and sent to the other filters. +@item filename, f +Set the filename of the commands to be read and sent to the other +filters. +@end table + +@subsection Commands syntax + +A commands description consists of a sequence of interval +specifications, comprising a list of commands to be executed when a +particular event related to that interval occurs. The occurring event +is typically the current frame time entering or leaving a given time +interval. + +An interval is specified by the following syntax: +@example +@var{START}[-@var{END}] @var{COMMANDS}; +@end example + +The time interval is specified by the @var{START} and @var{END} times. +@var{END} is optional and defaults to the maximum time. + +The current frame time is considered within the specified interval if +it is included in the interval [@var{START}, @var{END}), that is when +the time is greater or equal to @var{START} and is lesser than +@var{END}. + +@var{COMMANDS} consists of a sequence of one or more command +specifications, separated by ",", relating to that interval. The +syntax of a command specification is given by: +@example +[@var{FLAGS}] @var{TARGET} @var{COMMAND} @var{ARG} +@end example + +@var{FLAGS} is optional and specifies the type of events relating to +the time interval which enable sending the specified command, and must +be a non-null sequence of identifier flags separated by "+" or "|" and +enclosed between "[" and "]". + +The following flags are recognized: +@table @option +@item enter +The command is sent when the current frame timestamp enters the +specified interval. In other words, the command is sent when the +previous frame timestamp was not in the given interval, and the +current is. + +@item leave +The command is sent when the current frame timestamp leaves the +specified interval. In other words, the command is sent when the +previous frame timestamp was in the given interval, and the +current is not. +@end table + +If @var{FLAGS} is not specified, a default value of @code{[enter]} is +assumed. + +@var{TARGET} specifies the target of the command, usually the name of +the filter class or a specific filter instance name. + +@var{COMMAND} specifies the name of the command for the target filter. + +@var{ARG} is optional and specifies the optional list of argument for +the given @var{COMMAND}. + +Between one interval specification and another, whitespaces, or +sequences of characters starting with @code{#} until the end of line, +are ignored and can be used to annotate comments. + +A simplified BNF description of the commands specification syntax +follows: +@example +@var{COMMAND_FLAG} ::= "enter" | "leave" +@var{COMMAND_FLAGS} ::= @var{COMMAND_FLAG} [(+|"|")@var{COMMAND_FLAG}] +@var{COMMAND} ::= ["[" @var{COMMAND_FLAGS} "]"] @var{TARGET} @var{COMMAND} [@var{ARG}] +@var{COMMANDS} ::= @var{COMMAND} [,@var{COMMANDS}] +@var{INTERVAL} ::= @var{START}[-@var{END}] @var{COMMANDS} +@var{INTERVALS} ::= @var{INTERVAL}[;@var{INTERVALS}] +@end example + +@subsection Examples + +@itemize +@item +Specify audio tempo change at second 4: +@example +asendcmd=c='4.0 atempo tempo 1.5',atempo +@end example + +@item +Specify a list of drawtext and hue commands in a file. +@example +# show text in the interval 5-10 +5.0-10.0 [enter] drawtext reinit 'fontfile=FreeSerif.ttf:text=hello world', + [leave] drawtext reinit 'fontfile=FreeSerif.ttf:text='; + +# desaturate the image in the interval 15-20 +15.0-20.0 [enter] hue reinit s=0, + [enter] drawtext reinit 'fontfile=FreeSerif.ttf:text=nocolor', + [leave] hue reinit s=1, + [leave] drawtext reinit 'fontfile=FreeSerif.ttf:text=color'; + +# apply an exponential saturation fade-out effect, starting from time 25 +25 [enter] hue s=exp(t-25) +@end example + +A filtergraph allowing to read and process the above command list +stored in a file @file{test.cmd}, can be specified with: +@example +sendcmd=f=test.cmd,drawtext=fontfile=FreeSerif.ttf:text='',hue +@end example +@end itemize + +@section asetpts, setpts + +Change the PTS (presentation timestamp) of the input frames. + +@code{asetpts} works on audio frames, @code{setpts} on video frames. + +Accept in input an expression evaluated through the eval API, which +can contain the following constants: + +@table @option +@item FRAME_RATE +frame rate, only defined for constant frame-rate video + +@item PTS +the presentation timestamp in input + +@item N +the count of the input frame, starting from 0. + +@item NB_CONSUMED_SAMPLES +the number of consumed samples, not including the current frame (only +audio) + +@item NB_SAMPLES +the number of samples in the current frame (only audio) + +@item SAMPLE_RATE +audio sample rate + +@item STARTPTS +the PTS of the first frame + +@item STARTT +the time in seconds of the first frame + +@item INTERLACED +tell if the current frame is interlaced + +@item T +the time in seconds of the current frame + +@item TB +the time base + +@item POS +original position in the file of the frame, or undefined if undefined +for the current frame + +@item PREV_INPTS +previous input PTS + +@item PREV_INT +previous input time in seconds + +@item PREV_OUTPTS +previous output PTS + +@item PREV_OUTT +previous output time in seconds +@end table + +@subsection Examples + +@itemize +@item +Start counting PTS from zero +@example +setpts=PTS-STARTPTS +@end example + +@item +Apply fast motion effect: +@example +setpts=0.5*PTS +@end example + +@item +Apply slow motion effect: +@example +setpts=2.0*PTS +@end example + +@item +Set fixed rate of 25 frames per second: +@example +setpts=N/(25*TB) +@end example + +@item +Set fixed rate 25 fps with some jitter: +@example +setpts='1/(25*TB) * (N + 0.05 * sin(N*2*PI/25))' +@end example + +@item +Apply an offset of 10 seconds to the input PTS: +@example +setpts=PTS+10/TB +@end example +@end itemize + +@section ebur128 + +EBU R128 scanner filter. This filter takes an audio stream as input and outputs +it unchanged. By default, it logs a message at a frequency of 10Hz with the +Momentary loudness (identified by @code{M}), Short-term loudness (@code{S}), +Integrated loudness (@code{I}) and Loudness Range (@code{LRA}). + +The filter also has a video output (see the @var{video} option) with a real +time graph to observe the loudness evolution. The graphic contains the logged +message mentioned above, so it is not printed anymore when this option is set, +unless the verbose logging is set. The main graphing area contains the +short-term loudness (3 seconds of analysis), and the gauge on the right is for +the momentary loudness (400 milliseconds). + +More information about the Loudness Recommendation EBU R128 on +@url{http://tech.ebu.ch/loudness}. + +The filter accepts the following named parameters: + +@table @option + +@item video +Activate the video output. The audio stream is passed unchanged whether this +option is set or no. The video stream will be the first output stream if +activated. Default is @code{0}. + +@item size +Set the video size. This option is for video only. Default and minimum +resolution is @code{640x480}. + +@item meter +Set the EBU scale meter. Default is @code{9}. Common values are @code{9} and +@code{18}, respectively for EBU scale meter +9 and EBU scale meter +18. Any +other integer value between this range is allowed. + +@end table + +Example of real-time graph using @command{ffplay}, with a EBU scale meter +18: +@example +ffplay -f lavfi -i "amovie=input.mp3,ebur128=video=1:meter=18 [out0][out1]" +@end example + +Run an analysis with @command{ffmpeg}: +@example +ffmpeg -nostats -i input.mp3 -filter_complex ebur128 -f null - +@end example + +@section settb, asettb + +Set the timebase to use for the output frames timestamps. +It is mainly useful for testing timebase configuration. + +It accepts in input an arithmetic expression representing a rational. +The expression can contain the constants "AVTB" (the +default timebase), "intb" (the input timebase) and "sr" (the sample rate, +audio only). + +The default value for the input is "intb". + +@subsection Examples + +@itemize +@item +Set the timebase to 1/25: +@example +settb=1/25 +@end example + +@item +Set the timebase to 1/10: +@example +settb=0.1 +@end example + +@item +Set the timebase to 1001/1000: +@example +settb=1+0.001 +@end example + +@item +Set the timebase to 2*intb: +@example +settb=2*intb +@end example + +@item +Set the default timebase value: +@example +settb=AVTB +@end example +@end itemize + +@section concat + +Concatenate audio and video streams, joining them together one after the +other. + +The filter works on segments of synchronized video and audio streams. All +segments must have the same number of streams of each type, and that will +also be the number of streams at output. + +The filter accepts the following named parameters: +@table @option + +@item n +Set the number of segments. Default is 2. + +@item v +Set the number of output video streams, that is also the number of video +streams in each segment. Default is 1. + +@item a +Set the number of output audio streams, that is also the number of video +streams in each segment. Default is 0. + +@end table + +The filter has @var{v}+@var{a} outputs: first @var{v} video outputs, then +@var{a} audio outputs. + +There are @var{n}×(@var{v}+@var{a}) inputs: first the inputs for the first +segment, in the same order as the outputs, then the inputs for the second +segment, etc. + +Related streams do not always have exactly the same duration, for various +reasons including codec frame size or sloppy authoring. For that reason, +related synchronized streams (e.g. a video and its audio track) should be +concatenated at once. The concat filter will use the duration of the longest +stream in each segment (except the last one), and if necessary pad shorter +audio streams with silence. + +For this filter to work correctly, all segments must start at timestamp 0. + +All corresponding streams must have the same parameters in all segments; the +filtering system will automatically select a common pixel format for video +streams, and a common sample format, sample rate and channel layout for +audio streams, but other settings, such as resolution, must be converted +explicitly by the user. + +Different frame rates are acceptable but will result in variable frame rate +at output; be sure to configure the output file to handle it. + +Examples: +@itemize +@item +Concatenate an opening, an episode and an ending, all in bilingual version +(video in stream 0, audio in streams 1 and 2): +@example +ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv -filter_complex \ + '[0:0] [0:1] [0:2] [1:0] [1:1] [1:2] [2:0] [2:1] [2:2] + concat=n=3:v=1:a=2 [v] [a1] [a2]' \ + -map '[v]' -map '[a1]' -map '[a2]' output.mkv +@end example + +@item +Concatenate two parts, handling audio and video separately, using the +(a)movie sources, and adjusting the resolution: +@example +movie=part1.mp4, scale=512:288 [v1] ; amovie=part1.mp4 [a1] ; +movie=part2.mp4, scale=512:288 [v2] ; amovie=part2.mp4 [a2] ; +[v1] [v2] concat [outv] ; [a1] [a2] concat=v=0:a=1 [outa] +@end example +Note that a desync will happen at the stitch if the audio and video streams +do not have exactly the same duration in the first file. + +@end itemize + +@section showspectrum + +Convert input audio to a video output, representing the audio frequency +spectrum. + +The filter accepts the following named parameters: +@table @option +@item size, s +Specify the video size for the output. Default value is @code{640x480}. +@end table + +The usage is very similar to the showwaves filter; see the examples in that +section. + +@section showwaves + +Convert input audio to a video output, representing the samples waves. + +The filter accepts the following named parameters: +@table @option + +@item n +Set the number of samples which are printed on the same column. A +larger value will decrease the frame rate. Must be a positive +integer. This option can be set only if the value for @var{rate} +is not explicitly specified. + +@item rate, r +Set the (approximate) output frame rate. This is done by setting the +option @var{n}. Default value is "25". + +@item size, s +Specify the video size for the output. Default value is "600x240". +@end table + +Some examples follow. +@itemize +@item +Output the input file audio and the corresponding video representation +at the same time: +@example +amovie=a.mp3,asplit[out0],showwaves[out1] +@end example + +@item +Create a synthetic signal and show it with showwaves, forcing a +framerate of 30 frames per second: +@example +aevalsrc=sin(1*2*PI*t)*sin(880*2*PI*t):cos(2*PI*200*t),asplit[out0],showwaves=r=30[out1] +@end example +@end itemize + +@c man end MULTIMEDIA FILTERS + +@chapter Multimedia Sources +@c man begin MULTIMEDIA SOURCES + +Below is a description of the currently available multimedia sources. + +@section amovie + +This is the same as @ref{src_movie} source, except it selects an audio +stream by default. + +@anchor{src_movie} +@section movie + +Read audio and/or video stream(s) from a movie container. + +It accepts the syntax: @var{movie_name}[:@var{options}] where +@var{movie_name} is the name of the resource to read (not necessarily +a file but also a device or a stream accessed through some protocol), +and @var{options} is an optional sequence of @var{key}=@var{value} +pairs, separated by ":". + +The description of the accepted options follows. + +@table @option + +@item format_name, f +Specifies the format assumed for the movie to read, and can be either +the name of a container or an input device. If not specified the +format is guessed from @var{movie_name} or by probing. + +@item seek_point, sp +Specifies the seek point in seconds, the frames will be output +starting from this seek point, the parameter is evaluated with +@code{av_strtod} so the numerical value may be suffixed by an IS +postfix. Default value is "0". + +@item streams, s +Specifies the streams to read. Several streams can be specified, separated +by "+". The source will then have as many outputs, in the same order. The +syntax is explained in the @ref{Stream specifiers} chapter. Two special +names, "dv" and "da" specify respectively the default (best suited) video +and audio stream. Default is "dv", or "da" if the filter is called as +"amovie". + +@item stream_index, si +Specifies the index of the video stream to read. If the value is -1, +the best suited video stream will be automatically selected. Default +value is "-1". Deprecated. If the filter is called "amovie", it will select +audio instead of video. + +@item loop +Specifies how many times to read the stream in sequence. +If the value is less than 1, the stream will be read again and again. +Default value is "1". + +Note that when the movie is looped the source timestamps are not +changed, so it will generate non monotonically increasing timestamps. +@end table + +This filter allows to overlay a second video on top of main input of +a filtergraph as shown in this graph: +@example +input -----------> deltapts0 --> overlay --> output + ^ + | +movie --> scale--> deltapts1 -------+ +@end example + +Some examples follow. + +@itemize +@item +Skip 3.2 seconds from the start of the avi file in.avi, and overlay it +on top of the input labelled as "in": +@example +movie=in.avi:seek_point=3.2, scale=180:-1, setpts=PTS-STARTPTS [movie]; +[in] setpts=PTS-STARTPTS, [movie] overlay=16:16 [out] +@end example + +@item +Read from a video4linux2 device, and overlay it on top of the input +labelled as "in": +@example +movie=/dev/video0:f=video4linux2, scale=180:-1, setpts=PTS-STARTPTS [movie]; +[in] setpts=PTS-STARTPTS, [movie] overlay=16:16 [out] +@end example + +@item +Read the first video stream and the audio stream with id 0x81 from +dvd.vob; the video is connected to the pad named "video" and the audio is +connected to the pad named "audio": +@example +movie=dvd.vob:s=v:0+#0x81 [video] [audio] +@end example +@end itemize + +@c man end MULTIMEDIA SOURCES diff --git a/doc/general.texi b/doc/general.texi index 7b78308..8ec1d28 100644 --- a/doc/general.texi +++ b/doc/general.texi @@ -11,11 +11,19 @@ @chapter External libraries -Libav can be hooked up with a number of external libraries to add support +FFmpeg can be hooked up with a number of external libraries to add support for more formats. None of them are used by default, their use has to be explicitly requested by passing the appropriate flags to @command{./configure}. +@section OpenJPEG + +FFmpeg can use the OpenJPEG libraries for encoding/decoding J2K videos. Go to +@url{http://www.openjpeg.org/} to get the libraries and follow the installation +instructions. To enable using OpenJPEG in FFmpeg, pass @code{--enable-libopenjpeg} to +@file{./configure}. + + @section OpenCORE and VisualOn libraries Spun off Google Android sources, OpenCore, VisualOn and Fraunhofer @@ -25,13 +33,13 @@ libraries provide encoders for a number of audio codecs. OpenCORE and VisualOn libraries are under the Apache License 2.0 (see @url{http://www.apache.org/licenses/LICENSE-2.0} for details), which is incompatible with the LGPL version 2.1 and GPL version 2. You have to -upgrade Libav's license to LGPL version 3 (or if you have enabled +upgrade FFmpeg's license to LGPL version 3 (or if you have enabled GPL components, GPL version 3) to use it. @end float @subsection OpenCORE AMR -Libav can make use of the OpenCORE libraries for AMR-NB +FFmpeg can make use of the OpenCORE libraries for AMR-NB decoding/encoding and AMR-WB decoding. Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the @@ -41,7 +49,7 @@ Then pass @code{--enable-libopencore-amrnb} and/or @subsection VisualOn AAC encoder library -Libav can make use of the VisualOn AACenc library for AAC encoding. +FFmpeg can make use of the VisualOn AACenc library for AAC encoding. Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the instructions for installing the library. @@ -49,7 +57,7 @@ Then pass @code{--enable-libvo-aacenc} to configure to enable it. @subsection VisualOn AMR-WB encoder library -Libav can make use of the VisualOn AMR-WBenc library for AMR-WB encoding. +FFmpeg can make use of the VisualOn AMR-WBenc library for AMR-WB encoding. Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the instructions for installing the library. @@ -57,7 +65,7 @@ Then pass @code{--enable-libvo-amrwbenc} to configure to enable it. @subsection Fraunhofer AAC library -Libav can make use of the Fraunhofer AAC library for AAC encoding. +FFmpeg can make use of the Fraunhofer AAC library for AAC encoding. Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the instructions for installing the library. @@ -65,15 +73,23 @@ Then pass @code{--enable-libfdk-aac} to configure to enable it. @section LAME -Libav can make use of the LAME library for MP3 encoding. +FFmpeg can make use of the LAME library for MP3 encoding. Go to @url{http://lame.sourceforge.net/} and follow the instructions for installing the library. Then pass @code{--enable-libmp3lame} to configure to enable it. +@section TwoLAME + +FFmpeg can make use of the TwoLAME library for MP2 encoding. + +Go to @url{http://www.twolame.org/} and follow the +instructions for installing the library. +Then pass @code{--enable-libtwolame} to configure to enable it. + @section libvpx -Libav can make use of the libvpx library for VP8 encoding. +FFmpeg can make use of the libvpx library for VP8 encoding. Go to @url{http://www.webmproject.org/} and follow the instructions for installing the library. Then pass @code{--enable-libvpx} to configure to @@ -81,7 +97,7 @@ enable it. @section x264 -Libav can make use of the x264 library for H.264 encoding. +FFmpeg can make use of the x264 library for H.264 encoding. Go to @url{http://www.videolan.org/developers/x264.html} and follow the instructions for installing the library. Then pass @code{--enable-libx264} to @@ -90,14 +106,14 @@ configure to enable it. @float NOTE x264 is under the GNU Public License Version 2 or later (see @url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html} for -details), you must upgrade Libav's license to GPL in order to use it. +details), you must upgrade FFmpeg's license to GPL in order to use it. @end float @section libilbc iLBC is a narrowband speech codec that has been made freely available by Google as part of the WebRTC project. libilbc is a packaging friendly -copy of the iLBC codec. Libav 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. Go to @url{https://github.com/dekkers/libilbc} and follow the instructions for @@ -106,13 +122,13 @@ enable it. -@chapter Supported File Formats and Codecs +@chapter Supported File Formats, Codecs or Features You can use the @code{-formats} and @code{-codecs} options to have an exhaustive list. @section File Formats -Libav supports the following file formats through the @code{libavformat} +FFmpeg supports the following file formats through the @code{libavformat} library: @multitable @columnfractions .4 .1 .1 .4 @@ -120,12 +136,17 @@ library: @item 4xm @tab @tab X @tab 4X Technologies format, used in some games. @item 8088flex TMV @tab @tab X +@item ACT Voice @tab @tab X + @tab contains G.729 audio @item Adobe Filmstrip @tab X @tab X @item Audio IFF (AIFF) @tab X @tab X @item American Laser Games MM @tab @tab X @tab Multimedia format used in games like Mad Dog McCree. @item 3GPP AMR @tab X @tab X +@item Amazing Studio Packed Animation File @tab @tab X + @tab Multimedia format used in game Heart Of Darkness. @item Apple HTTP Live Streaming @tab @tab X +@item Artworx Data Format @tab @tab X @item ASF @tab X @tab X @item AVI @tab X @tab X @item AVISynth @tab @tab X @@ -135,6 +156,7 @@ library: @tab Audio and video format used in some games by Beam Software. @item Bethesda Softworks VID @tab @tab X @tab Used in some games from Bethesda Softworks. +@item Binary text @tab @tab X @item Bink @tab @tab X @tab Multimedia format used by many games. @item Bitmap Brothers JV @tab @tab X @@ -153,7 +175,7 @@ library: @tab Video format used by CD+G karaoke disks @item Commodore CDXL @tab @tab X @tab Amiga CD video format -@item Core Audio Format @tab @tab X +@item Core Audio Format @tab X @tab X @tab Apple Core Audio Format @item CRC testing format @tab X @tab @item Creative Voice @tab X @tab X @@ -171,7 +193,7 @@ library: @item Electronic Arts cdata @tab @tab X @item Electronic Arts Multimedia @tab @tab X @tab Used in various EA games; files have extensions like WVE and UV2. -@item FFM (AVserver live feed) @tab X @tab X +@item FFM (FFserver live feed) @tab X @tab X @item Flash (SWF) @tab X @tab X @item Flash 9 (AVM2) @tab X @tab X @tab Only embedded audio is decoded. @@ -182,13 +204,19 @@ library: @item framecrc testing format @tab X @tab @item FunCom ISS @tab @tab X @tab Audio format used in various games from FunCom like The Longest Journey. +@item G.723.1 @tab X @tab X +@item G.729 BIT @tab X @tab X +@item G.729 raw @tab @tab X @item GIF Animation @tab X @tab @item GXF @tab X @tab X @tab General eXchange Format SMPTE 360M, used by Thomson Grass Valley playout servers. +@item iCEDraw File @tab @tab X +@item ICO @tab X @tab X + @tab Microsoft Windows ICO @item id Quake II CIN video @tab @tab X @item id RoQ @tab X @tab X - @tab Used in Quake III, Jedi Knight 2, other computer games. + @tab Used in Quake III, Jedi Knight 2 and other computer games. @item IEC61937 encapsulation @tab X @tab X @item IFF @tab @tab X @tab Interchange File Format @@ -202,6 +230,9 @@ library: @item LATM @tab X @tab X @item LMLM4 @tab @tab X @tab Used by Linux Media Labs MPEG-4 PCI boards +@item LOAS @tab @tab X + @tab contains LATM multiplexed AAC audio +@item LVF @tab @tab X @item LXF @tab @tab X @tab VR native stream format, used by Leitch/Harris' video servers. @item Matroska @tab X @tab X @@ -211,6 +242,7 @@ library: @item MAXIS XA @tab @tab X @tab Used in Sim City 3000; file extension .xa. @item MD Studio @tab @tab X +@item Metal Gear Solid: The Twin Snakes @tab @tab X @item Mobotix .mxg @tab @tab X @item Monkey's Audio @tab @tab X @item Motion Pixels MVI @tab @tab X @@ -256,6 +288,7 @@ library: @item raw Dirac @tab X @tab X @item raw DNxHD @tab X @tab X @item raw DTS @tab X @tab X +@item raw DTS-HD @tab @tab X @item raw E-AC-3 @tab X @tab X @item raw FLAC @tab X @tab X @item raw GSM @tab @tab X @@ -273,6 +306,7 @@ library: @item raw video @tab X @tab X @item raw id RoQ @tab X @tab @item raw Shorten @tab @tab X +@item raw TAK @tab @tab X @item raw TrueHD @tab X @tab X @item raw VC-1 @tab @tab X @item raw PCM A-law @tab X @tab X @@ -310,6 +344,7 @@ library: @item RTP @tab X @tab X @item RTSP @tab X @tab X @item SAP @tab X @tab X +@item SBG @tab @tab X @item SDP @tab @tab X @item Sega FILM/CPK @tab @tab X @tab Used in many Sega Saturn console games. @@ -321,6 +356,8 @@ library: @tab Multimedia format used by many games. @item SMJPEG @tab X @tab X @tab Used in certain Loki game ports. +@item Smush @tab @tab X + @tab Multimedia format used in some LucasArts games. @item Sony OpenMG (OMA) @tab X @tab X @tab Audio format used in Sony Sonic Stage and Sony Vegas. @item Sony PlayStation STR @tab @tab X @@ -335,9 +372,9 @@ library: @item True Audio @tab @tab X @item VC-1 test bitstream @tab X @tab X @item WAV @tab X @tab X -@item WavPack @tab @tab X +@item WavPack @tab X @tab X @item WebM @tab X @tab X -@item Windows Televison (WTV) @tab @tab X +@item Windows Televison (WTV) @tab X @tab X @item Wing Commander III movie @tab @tab X @tab Multimedia format used in Origin's Wing Commander III computer game. @item Westwood Studios audio @tab @tab X @@ -348,16 +385,16 @@ library: @tab Microsoft video container used in Xbox games. @item xWMA @tab @tab X @tab Microsoft audio container used by XAudio 2. +@item eXtended BINary text (XBIN) @tab @tab X @item YUV4MPEG pipe @tab X @tab X @item Psygnosis YOP @tab @tab X -@item ZeroCodec Lossless Video @tab @tab X @end multitable @code{X} means that encoding (resp. decoding) is supported. @section Image Formats -Libav can read and write images for each frame of a video sequence. The +FFmpeg can read and write images for each frame of a video sequence. The following image formats are supported: @multitable @columnfractions .4 .1 .1 .4 @@ -370,10 +407,11 @@ following image formats are supported: @tab Microsoft BMP image @item DPX @tab X @tab X @tab Digital Picture Exchange +@item EXR @tab @tab X + @tab OpenEXR @item JPEG @tab X @tab X @tab Progressive JPEG is not supported. -@item JPEG 2000 @tab E @tab E - @tab decoding supported through external library libopenjpeg +@item JPEG 2000 @tab X @tab X @item JPEG-LS @tab X @tab X @item LJPEG @tab X @tab @tab Lossless JPEG @@ -390,7 +428,6 @@ following image formats are supported: @item PIC @tab @tab X @tab Pictor/PC Paint @item PNG @tab X @tab X - @tab 2/4 bpp not supported yet @item PPM @tab X @tab X @tab Portable PixelMap image @item PTX @tab @tab X @@ -403,8 +440,10 @@ following image formats are supported: @tab YUV, JPEG and some extension is not supported yet. @item Truevision Targa @tab X @tab X @tab Targa (.TGA) image format -@item XBM @tab X @tab +@item XBM @tab X @tab X @tab X BitMap image format +@item XFace @tab X @tab X + @tab X-Face image format @item XWD @tab X @tab X @tab X Window Dump image format @end multitable @@ -424,9 +463,10 @@ following image formats are supported: @item 8SVX fibonacci @tab @tab X @item A64 multicolor @tab X @tab @tab Creates video suitable to be played on a commodore 64 (multicolor mode). +@item Amazing Studio PAF Video @tab @tab X @item American Laser Games MM @tab @tab X @tab Used in games like Mad Dog McCree. -@item AMV Video @tab @tab X +@item AMV Video @tab X @tab X @tab Used in Chinese MP3 players. @item ANSI/ASCII art @tab @tab X @item Apple MJPEG-B @tab @tab X @@ -446,13 +486,18 @@ following image formats are supported: @item Autodesk Animator Flic video @tab @tab X @item Autodesk RLE @tab @tab X @tab fourcc: AASC +@item Avid 1:1 10-bit RGB Packer @tab X @tab X + @tab fourcc: AVrp @item AVS (Audio Video Standard) video @tab @tab X @tab Video encoding used by the Creature Shock game. +@item AYUV @tab X @tab X + @tab Microsoft uncompressed packed 4:4:4:4 @item Beam Software VB @tab @tab X @item Bethesda VID video @tab @tab X @tab Used in some games from Bethesda Softworks. @item Bink Video @tab @tab X @item Bitmap Brothers JV video @tab @tab X +@item y41p Brooktree uncompressed 4:1:1 12-bit @tab X @tab X @item Brute Force & Ignorance @tab @tab X @tab Used in the game Flash Traffic: City of Angels. @item C93 video @tab @tab X @@ -472,10 +517,11 @@ following image formats are supported: @item Cinepak @tab @tab X @item Cirrus Logic AccuPak @tab X @tab X @tab fourcc: CLJR +@item CPiA Video Format @tab @tab X @item Creative YUV (CYUV) @tab @tab X @item DFA @tab @tab X @tab Codec used in Chronomaster game. -@item Dirac @tab E @tab E +@item Dirac @tab E @tab X @tab supported through external library libschroedinger @item Deluxe Paint Animation @tab @tab X @item DNxHD @tab X @tab X @@ -495,11 +541,12 @@ following image formats are supported: @item Electronic Arts TGQ video @tab @tab X @item Electronic Arts TQI video @tab @tab X @item Escape 124 @tab @tab X +@item Escape 130 @tab @tab X @item FFmpeg video codec #1 @tab X @tab X - @tab experimental lossless codec (fourcc: FFV1) + @tab lossless codec (fourcc: FFV1) @item Flash Screen Video v1 @tab X @tab X @tab fourcc: FSV1 -@item Flash Screen Video v2 @tab @tab X +@item Flash Screen Video v2 @tab X @tab X @item Flash Video (FLV) @tab X @tab X @tab Sorenson H.263 used in Flash @item Forward Uncompressed @tab @tab X @@ -531,6 +578,7 @@ following image formats are supported: @tab Used in the game Cyberia from Interplay. @item Interplay MVE video @tab @tab X @tab Used in Interplay .MVE files. +@item J2K @tab X @tab X @item Karl Morton's video codec @tab @tab X @tab Codec used in Worms games. @item Kega Game Video (KGV1) @tab @tab X @@ -539,6 +587,8 @@ following image formats are supported: @item LCL (LossLess Codec Library) MSZH @tab @tab X @item LCL (LossLess Codec Library) ZLIB @tab E @tab E @item LOCO @tab @tab X +@item LucasArts Smush @tab @tab X + @tab Used in LucasArts games. @item lossless MJPEG @tab X @tab X @item Microsoft ATC Screen @tab @tab X @tab Also known as Microsoft Screen 3. @@ -577,8 +627,10 @@ following image formats are supported: @tab fourcc: VP60,VP61,VP62 @item VP8 @tab E @tab X @tab fourcc: VP80, encoding supported through external library libvpx -@item planar RGB @tab @tab X - @tab fourcc: 8BPS +@item Pinnacle TARGA CineWave YUV16 @tab @tab X + @tab fourcc: Y216 +@item Prores @tab @tab X + @tab fourcc: apch,apcn,apcs,apco @item Q-team QPEG @tab @tab X @tab fourccs: QPEG, Q1.0, Q1.1 @item QuickTime 8BPS video @tab @tab X @@ -588,8 +640,8 @@ following image formats are supported: @tab fourcc: 'smc ' @item QuickTime video (RPZA) @tab @tab X @tab fourcc: rpza -@item R10K AJA Kona 10-bit RGB Codec @tab @tab X -@item R210 Quicktime Uncompressed RGB 10-bit @tab @tab X +@item R10K AJA Kona 10-bit RGB Codec @tab X @tab X +@item R210 Quicktime Uncompressed RGB 10-bit @tab X @tab X @item Raw Video @tab X @tab X @item RealVideo 1.0 @tab X @tab X @item RealVideo 2.0 @tab X @tab X @@ -624,6 +676,8 @@ following image formats are supported: @tab Codec used in DOS CD-ROM FlashBack game. @item Ut Video @tab X @tab X @item v210 QuickTime uncompressed 4:2:2 10-bit @tab X @tab X +@item v308 QuickTime uncompressed 4:4:4 @tab X @tab X +@item v408 QuickTime uncompressed 4:4:4:4 @tab X @tab X @item v410 QuickTime uncompressed 4:4:4 10-bit @tab X @tab X @item VBLE Lossless Codec @tab @tab X @item VMware Screen Codec / VMware Video @tab @tab X @@ -642,6 +696,9 @@ following image formats are supported: @item WMV7 @tab X @tab X @item YAMAHA SMAF @tab X @tab X @item Psygnosis YOP Video @tab @tab X +@item yuv4 @tab X @tab X + @tab libquicktime uncompressed packed 4:2:0 +@item ZeroCodec Lossless Video @tab @tab X @item ZLIB @tab X @tab X @tab part of LCL, encoder experimental @item Zip Motion Blocks Video @tab X @tab X @@ -657,6 +714,8 @@ following image formats are supported: @multitable @columnfractions .4 .1 .1 .4 @item Name @tab Encoding @tab Decoding @tab Comments @item 8SVX audio @tab @tab X +@item AAC+ @tab E @tab X + @tab encoding supported through external library libaacplus @item AAC @tab E @tab X @tab encoding supported through external library libfaac and libvo-aacenc @item AC-3 @tab IX @tab X @@ -708,20 +767,23 @@ following image formats are supported: @tab encoding supported through external library libopencore-amrnb @item AMR-WB @tab E @tab X @tab encoding supported through external library libvo-amrwbenc +@item Amazing Studio PAF Audio @tab @tab X @item Apple lossless audio @tab X @tab X @tab QuickTime fourcc 'alac' @item Atrac 1 @tab @tab X @item Atrac 3 @tab @tab X @item Bink Audio @tab @tab X @tab Used in Bink and Smacker files in many games. +@item CELT @tab @tab E + @tab decoding supported through external library libcelt @item Delphine Software International CIN audio @tab @tab X @tab Codec used in Delphine Software International games. @item Discworld II BMV Audio @tab @tab X @item COOK @tab @tab X @tab All versions except 5.1 are supported. -@item DCA (DTS Coherent Acoustics) @tab @tab X +@item DCA (DTS Coherent Acoustics) @tab X @tab X @item DPCM id RoQ @tab X @tab X - @tab Used in Quake III, Jedi Knight 2, other computer games. + @tab Used in Quake III, Jedi Knight 2 and other computer games. @item DPCM Interplay @tab @tab X @tab Used in various Interplay computer games. @item DPCM Sierra Online @tab @tab X @@ -733,7 +795,8 @@ following image formats are supported: @item DV audio @tab @tab X @item Enhanced AC-3 @tab X @tab X @item FLAC (Free Lossless Audio Codec) @tab X @tab IX -@item G.723.1 @tab @tab X +@item G.723.1 @tab X @tab X +@item G.729 @tab @tab X @item GSM @tab E @tab X @tab encoding supported through external library libgsm @item GSM Microsoft variant @tab E @tab X @@ -750,6 +813,7 @@ following image formats are supported: @tab Only versions 3.97-3.99 are supported. @item MP1 (MPEG audio layer 1) @tab @tab IX @item MP2 (MPEG audio layer 2) @tab IX @tab IX + @tab libtwolame can be used alternatively for encoding. @item MP3 (MPEG audio layer 3) @tab E @tab IX @tab encoding supported through external library LAME, ADU MP3 and MP3onMP4 also supported @item MPEG-4 Audio Lossless Coding (ALS) @tab @tab X @@ -798,12 +862,19 @@ following image formats are supported: @tab Used in Sierra VMD files. @item Smacker audio @tab @tab X @item SMPTE 302M AES3 audio @tab @tab X +@item Sonic @tab X @tab X + @tab experimental codec +@item Sonic lossless @tab X @tab X + @tab experimental codec @item Speex @tab E @tab E @tab supported through external library libspeex +@item TAK (Tom's lossless Audio Kompressor) @tab @tab X @item True Audio (TTA) @tab @tab X @item TrueHD @tab @tab X @tab Used in HD-DVD and Blu-Ray discs. @item TwinVQ (VQF flavor) @tab @tab X +@item VIMA @tab @tab X + @tab Used in LucasArts SMUSH animations. @item Vorbis @tab E @tab X @tab A native but very primitive encoder exists. @item WavPack @tab @tab X @@ -826,12 +897,19 @@ performance on systems without hardware floating point support). @multitable @columnfractions .4 .1 .1 .1 .1 @item Name @tab Muxing @tab Demuxing @tab Encoding @tab Decoding -@item SSA/ASS @tab X @tab X @tab X @tab X -@item DVB @tab X @tab X @tab X @tab X -@item DVD @tab X @tab X @tab X @tab X -@item PGS @tab @tab @tab @tab X -@item SubRip (SRT) @tab X @tab X @tab @tab X -@item XSUB @tab @tab @tab X @tab X +@item SSA/ASS @tab X @tab X @tab X @tab X +@item DVB @tab X @tab X @tab X @tab X +@item DVD @tab X @tab X @tab X @tab X +@item JACOsub @tab X @tab X @tab @tab X +@item MicroDVD @tab X @tab X @tab @tab X +@item PGS @tab @tab @tab @tab X +@item RealText @tab @tab X @tab @tab X +@item SAMI @tab @tab X @tab @tab X +@item SubRip (SRT) @tab X @tab X @tab X @tab X +@item SubViewer @tab @tab X @tab @tab X +@item 3GPP Timed Text @tab @tab @tab X @tab X +@item WebVTT @tab @tab X @tab @tab X +@item XSUB @tab @tab @tab X @tab X @end multitable @code{X} means that the feature is supported. @@ -872,13 +950,17 @@ performance on systems without hardware floating point support). @item Name @tab Input @tab Output @item ALSA @tab X @tab X @item BKTR @tab X @tab +@item caca @tab @tab X @item DV1394 @tab X @tab +@item Lavfi virtual device @tab X @tab @item Linux framebuffer @tab X @tab @item JACK @tab X @tab @item LIBCDIO @tab X @item LIBDC1394 @tab X @tab +@item OpenAL @tab X @item OSS @tab X @tab X @item Pulseaudio @tab X @tab +@item SDL @tab @tab X @item Video4Linux2 @tab X @tab @item VfW capture @tab X @tab @item X11 grabbing @tab X @tab @@ -886,4 +968,16 @@ performance on systems without hardware floating point support). @code{X} means that input/output is supported. +@section Timecode + +@multitable @columnfractions .4 .1 .1 +@item Codec/format @tab Read @tab Write +@item AVI @tab X @tab X +@item DV @tab X @tab X +@item GXF @tab X @tab X +@item MOV @tab X @tab X +@item MPEG1/2 @tab X @tab X +@item MXF @tab X @tab X +@end multitable + @bye diff --git a/doc/git-howto.texi b/doc/git-howto.texi index 5114115..44e1cc6 100644 --- a/doc/git-howto.texi +++ b/doc/git-howto.texi @@ -1,9 +1,9 @@ \input texinfo @c -*- texinfo -*- -@settitle Using git to develop Libav +@settitle Using git to develop FFmpeg @titlepage -@center @titlefont{Using git to develop Libav} +@center @titlefont{Using git to develop FFmpeg} @end titlepage @top @@ -39,7 +39,7 @@ For more information about the Git project, visit the Consult these resources whenever you have problems, they are quite exhaustive. -What follows now is a basic introduction to Git and some Libav-specific +What follows now is a basic introduction to Git and some FFmpeg-specific guidelines to ease the contribution to the project @chapter Basics Usage @@ -53,16 +53,16 @@ Most distribution and operating system provide a package for it. @section Cloning the source tree @example -git clone git://git.libav.org/libav.git <target> +git clone git://source.ffmpeg.org/ffmpeg <target> @end example -This will put the Libav sources into the directory @var{<target>}. +This will put the FFmpeg sources into the directory @var{<target>}. @example -git clone git@@git.libav.org:libav.git <target> +git clone git@@source.ffmpeg.org:ffmpeg <target> @end example -This will put the Libav sources into the directory @var{<target>} and let +This will put the FFmpeg sources into the directory @var{<target>} and let you push back your changes to the remote repository. Make sure that you do not have Windows line endings in your checkouts, @@ -85,7 +85,7 @@ can be remote. By default the master branch tracks the branch master in the remote origin. @float IMPORTANT -Since merge commits are forbidden @command{--rebase} (see below) is recommended. +@command{--rebase} (see below) is recommended. @end float @section Rebasing your local branches @@ -96,7 +96,7 @@ git pull --rebase fetches the changes from the main repository and replays your local commits over it. This is required to keep all your local changes at the top of -Libav's master tree. The master tree will reject pushes with merge commits. +FFmpeg's master tree. The master tree will reject pushes with merge commits. @section Adding/removing files/directories @@ -127,7 +127,7 @@ git log <filename(s)> @end example You may also use the graphical tools like gitview or gitk or the web -interface available at http://git.libav.org/ +interface available at http://source.ffmpeg.org/ @section Checking source tree status @@ -261,7 +261,7 @@ git commit @chapter Git configuration In order to simplify a few workflows, it is advisable to configure both -your personal Git installation and your local Libav repository. +your personal Git installation and your local FFmpeg repository. @section Personal Git installation @@ -276,15 +276,15 @@ and @command{git format-patch} detect renames: @section Repository configuration In order to have @command{git send-email} automatically send patches -to the libav-devel mailing list, add the following stanza -to @file{/path/to/libav/repository/.git/config}: +to the ffmpeg-devel mailing list, add the following stanza +to @file{/path/to/ffmpeg/repository/.git/config}: @example [sendemail] - to = libav-devel@@libav.org + to = ffmpeg-devel@@ffmpeg.org @end example -@chapter Libav specific +@chapter FFmpeg specific @section Reverting broken commits @@ -381,53 +381,35 @@ proper order. This list tries to be exhaustive. In case you are just pushing a typo in a comment, some of the steps may be unnecessary. Apply your common sense, but if in doubt, err on the side of caution. -First make sure your Git repository is on a branch that is a direct -descendant of the Libav master branch, which is the only one from which -pushing to Libav is possible. Then run the following command: +First, make sure that the commits and branches you are going to push +match what you want pushed and that nothing is missing, extraneous or +wrong. You can see what will be pushed by running the git push command +with --dry-run first. And then inspecting the commits listed with +@command{git log -p 1234567..987654}. The @command{git status} command +may help in finding local changes that have been forgotten to be added. -@itemize -@item @command{git log --patch --stat origin/master..} - -to make sure that only the commits you want to push are pending, that -the log messages of the commits are correct and descriptive and contain -no cruft from @command{git am} and to doublecheck that the commits you -want to push really only contain the changes they are supposed to contain. - -@item @command{git status} - -to ensure no local changes still need to be committed and that no local -changes may have thrown off the results of your testing. -@end itemize - -Next let the code pass through a full run of our testsuite. Before you do, -the command @command{make fate-rsync} will update the test samples. Changes -to the samples set are not very common and commits depending on samples -changes are delayed for at least 24 hours to allow the new samples to -propagate, so updating it once per day is sufficient. Now execute +Next let the code pass through a full run of our testsuite. @itemize @item @command{make distclean} -@item @command{/path/to/libav/configure} +@item @command{/path/to/ffmpeg/configure} @item @command{make check} +@item if fate fails due to missing samples run @command{make fate-rsync} and retry @end itemize -While the test suite covers a wide range of possible problems, it is not -a panacea. Do not hesitate to perform any other tests necessary to convince -yourself that the changes you are about to push actually work as expected. +Make sure all your changes have been checked before pushing them, the +testsuite only checks against regressions and that only to some extend. It does +obviously not check newly added features/code to be working unless you have +added a test for that (which is recommended). Also note that every single commit should pass the test suite, not just -the result of a series of patches. So if you have a series of related -commits, run the test suite on every single commit. - -Finally, after pushing, mark all patches as committed on -@url{http://patches.libav.org/,patchwork}. -Sometimes this is not automatically done when a patch has been -slightly modified from the version on the mailing list. -Also update previous incarnations of the patches you push so that -patchwork is not cluttered with cruft. +the result of a series of patches. +Once everything passed, push the changes to your public ffmpeg clone and post a +merge request to ffmpeg-devel. You can also push them directly but this is not +recommended. @chapter Server Issues -Contact the project admins @email{git@@libav.org} if you have technical +Contact the project admins @email{root@@ffmpeg.org} if you have technical problems with the GIT server. diff --git a/doc/git-howto.txt b/doc/git-howto.txt index 036b567..5ba72ee 100644 --- a/doc/git-howto.txt +++ b/doc/git-howto.txt @@ -28,9 +28,9 @@ Consult these resources whenever you have problems, they are quite exhaustive. You do not need a special username or password. All you need is to provide a ssh public key to the Git server admin. -What follows now is a basic introduction to Git and some Libav-specific +What follows now is a basic introduction to Git and some FFmpeg-specific guidelines. Read it at least once, if you are granted commit privileges to the -Libav project you are expected to be familiar with these rules. +FFmpeg project you are expected to be familiar with these rules. @@ -39,18 +39,19 @@ I. BASICS: 0. Get GIT: + Most distributions have a git package, if not You can get git from http://git-scm.com/ 1. Cloning the source tree: - git clone git://git.libav.org/libav.git <target> + git clone git://source.ffmpeg.org/ffmpeg <target> - This will put the Libav sources into the directory <target>. + This will put the FFmpeg sources into the directory <target>. - git clone git@git.libav.org:libav.git <target> + git clone git@source.ffmpeg.org:ffmpeg <target> - This will put the Libav sources into the directory <target> and let + This will put the FFmpeg sources into the directory <target> and let you push back your changes to the remote repository. @@ -72,7 +73,7 @@ I. BASICS: fetches the changes from the main repository and replays your local commits over it. This is required to keep all your local changes at the top of - Libav's master tree. The master tree will reject pushes with merge commits. + FFmpeg's master tree. The master tree will reject pushes with merge commits. 3. Adding/removing files/directories: @@ -97,7 +98,7 @@ I. BASICS: git log <filename(s)> You may also use the graphical tools like gitview or gitk or the web - interface available at http://git.libav.org/ + interface available at http://source.ffmpeg.org 6. Checking source tree status: @@ -268,5 +269,5 @@ I. BASICS: where $SHA1 is the commit SHA1 from the 'git log' output. -Contact the project admins <git at libav dot org> if you have technical +Contact the project admins <root at ffmpeg dot org> if you have technical problems with the GIT server. diff --git a/doc/indevs.texi b/doc/indevs.texi index b0ba6ac..8ac102b 100644 --- a/doc/indevs.texi +++ b/doc/indevs.texi @@ -1,10 +1,10 @@ @chapter Input Devices @c man begin INPUT DEVICES -Input devices are configured elements in Libav which allow to access +Input devices are configured elements in FFmpeg which allow to access the data coming from a multimedia device attached to your system. -When you configure your Libav build, all the supported input devices +When you configure your FFmpeg build, all the supported input devices are enabled by default. You can list all available ones using the configure option "--list-indevs". @@ -42,10 +42,10 @@ specify card number or identifier, device number and subdevice number To see the list of cards currently recognized by your system check the files @file{/proc/asound/cards} and @file{/proc/asound/devices}. -For example to capture with @command{avconv} from an ALSA device with +For example to capture with @command{ffmpeg} from an ALSA device with card id 0, you may run the command: @example -avconv -f alsa -i hw:0 alsaout.wav +ffmpeg -f alsa -i hw:0 alsaout.wav @end example For more information see: @@ -55,6 +55,114 @@ For more information see: BSD video input device. +@section dshow + +Windows DirectShow input device. + +DirectShow support is enabled when FFmpeg is built with the mingw-w64 project. +Currently only audio and video devices are supported. + +Multiple devices may be opened as separate inputs, but they may also be +opened on the same input, which should improve synchronism between them. + +The input name should be in the format: + +@example +@var{TYPE}=@var{NAME}[:@var{TYPE}=@var{NAME}] +@end example + +where @var{TYPE} can be either @var{audio} or @var{video}, +and @var{NAME} is the device's name. + +@subsection Options + +If no options are specified, the device's defaults are used. +If the device does not support the requested options, it will +fail to open. + +@table @option + +@item video_size +Set the video size in the captured video. + +@item framerate +Set the framerate in the captured video. + +@item sample_rate +Set the sample rate (in Hz) of the captured audio. + +@item sample_size +Set the sample size (in bits) of the captured audio. + +@item channels +Set the number of channels in the captured audio. + +@item list_devices +If set to @option{true}, print a list of devices and exit. + +@item list_options +If set to @option{true}, print a list of selected device's options +and exit. + +@item video_device_number +Set video device number for devices with same name (starts at 0, +defaults to 0). + +@item audio_device_number +Set audio device number for devices with same name (starts at 0, +defaults to 0). + +@item pixel_format +Select pixel format to be used by DirectShow. This may only be set when +the video codec is not set or set to rawvideo. + +@item audio_buffer_size +Set audio device buffer size in milliseconds (which can directly +impact latency, depending on the device). +Defaults to using the audio device's +default buffer size (typically some multiple of 500ms). +Setting this value too low can degrade performance. +See also +@url{http://msdn.microsoft.com/en-us/library/windows/desktop/dd377582(v=vs.85).aspx} + +@end table + +@subsection Examples + +@itemize + +@item +Print the list of DirectShow supported devices and exit: +@example +$ ffmpeg -list_devices true -f dshow -i dummy +@end example + +@item +Open video device @var{Camera}: +@example +$ ffmpeg -f dshow -i video="Camera" +@end example + +@item +Open second video device with name @var{Camera}: +@example +$ ffmpeg -f dshow -video_device_number 1 -i video="Camera" +@end example + +@item +Open video device @var{Camera} and audio device @var{Microphone}: +@example +$ ffmpeg -f dshow -i video="Camera":audio="Microphone" +@end example + +@item +Print the list of supported options in selected device and exit: +@example +$ ffmpeg -list_options true -f dshow -i video="Camera" +@end example + +@end itemize + @section dv1394 Linux DV 1394 input device. @@ -72,18 +180,71 @@ For more detailed information read the file Documentation/fb/framebuffer.txt included in the Linux source tree. To record from the framebuffer device @file{/dev/fb0} with -@command{avconv}: +@command{ffmpeg}: @example -avconv -f fbdev -r 10 -i /dev/fb0 out.avi +ffmpeg -f fbdev -r 10 -i /dev/fb0 out.avi @end example You can take a single screenshot image with the command: @example -avconv -f fbdev -frames:v 1 -r 1 -i /dev/fb0 screenshot.jpeg +ffmpeg -f fbdev -frames:v 1 -r 1 -i /dev/fb0 screenshot.jpeg @end example See also @url{http://linux-fbdev.sourceforge.net/}, and fbset(1). +@section iec61883 + +FireWire DV/HDV input device using libiec61883. + +To enable this input device, you need libiec61883, libraw1394 and +libavc1394 installed on your system. Use the configure option +@code{--enable-libiec61883} to compile with the device enabled. + +The iec61883 capture device supports capturing from a video device +connected via IEEE1394 (FireWire), using libiec61883 and the new Linux +FireWire stack (juju). This is the default DV/HDV input method in Linux +Kernel 2.6.37 and later, since the old FireWire stack was removed. + +Specify the FireWire port to be used as input file, or "auto" +to choose the first port connected. + +@subsection Options + +@table @option + +@item dvtype +Override autodetection of DV/HDV. This should only be used if auto +detection does not work, or if usage of a different device type +should be prohibited. Treating a DV device as HDV (or vice versa) will +not work and result in undefined behavior. +The values @option{auto}, @option{dv} and @option{hdv} are supported. + +@item dvbuffer +Set maxiumum size of buffer for incoming data, in frames. For DV, this +is an exact value. For HDV, it is not frame exact, since HDV does +not have a fixed frame size. + +@end table + +@subsection Examples + +@itemize + +@item +Grab and show the input of a FireWire DV/HDV device. +@example +ffplay -f iec61883 -i auto +@end example + +@item +Grab and record the input of a FireWire DV/HDV device, +using a packet buffer of 100000 packets if the source is HDV. +@example +ffmpeg -f iec61883 -i auto -hdvbuffer 100000 out.mpg +@end example + +@end itemize + @section jack JACK input device. @@ -95,24 +256,24 @@ A JACK input device creates one or more JACK writable clients, one for each audio channel, with name @var{client_name}:input_@var{N}, where @var{client_name} is the name provided by the application, and @var{N} is a number which identifies the channel. -Each writable client will send the acquired data to the Libav input +Each writable client will send the acquired data to the FFmpeg input device. Once you have created one or more JACK readable clients, you need to connect them to one or more JACK writable clients. -To connect or disconnect JACK clients you can use the -@file{jack_connect} and @file{jack_disconnect} programs, or do it -through a graphical interface, for example with @file{qjackctl}. +To connect or disconnect JACK clients you can use the @command{jack_connect} +and @command{jack_disconnect} programs, or do it through a graphical interface, +for example with @command{qjackctl}. To list the JACK clients and their properties you can invoke the command -@file{jack_lsp}. +@command{jack_lsp}. Follows an example which shows how to capture a JACK readable client -with @command{avconv}. +with @command{ffmpeg}. @example -# Create a JACK writable client with name "libav". -$ avconv -f jack -i libav -y out.wav +# Create a JACK writable client with name "ffmpeg". +$ ffmpeg -f jack -i ffmpeg -y out.wav # Start the sample jack_metro readable client. $ jack_metro -b 120 -d 0.2 -f 4000 @@ -123,20 +284,181 @@ system:capture_1 system:capture_2 system:playback_1 system:playback_2 -libav:input_1 +ffmpeg:input_1 metro:120_bpm -# Connect metro to the avconv writable client. -$ jack_connect metro:120_bpm libav:input_1 +# Connect metro to the ffmpeg writable client. +$ jack_connect metro:120_bpm ffmpeg:input_1 @end example For more information read: @url{http://jackaudio.org/} +@section lavfi + +Libavfilter input virtual device. + +This input device reads data from the open output pads of a libavfilter +filtergraph. + +For each filtergraph open output, the input device will create a +corresponding stream which is mapped to the generated output. Currently +only video data is supported. The filtergraph is specified through the +option @option{graph}. + +@subsection Options + +@table @option + +@item graph +Specify the filtergraph to use as input. Each video open output must be +labelled by a unique string of the form "out@var{N}", where @var{N} is a +number starting from 0 corresponding to the mapped input stream +generated by the device. +The first unlabelled output is automatically assigned to the "out0" +label, but all the others need to be specified explicitly. + +If not specified defaults to the filename specified for the input +device. + +@item graph_file +Set the filename of the filtergraph to be read and sent to the other +filters. Syntax of the filtergraph is the same as the one specified by +the option @var{graph}. + +@end table + +@subsection Examples + +@itemize +@item +Create a color video stream and play it back with @command{ffplay}: +@example +ffplay -f lavfi -graph "color=pink [out0]" dummy +@end example + +@item +As the previous example, but use filename for specifying the graph +description, and omit the "out0" label: +@example +ffplay -f lavfi color=pink +@end example + +@item +Create three different video test filtered sources and play them: +@example +ffplay -f lavfi -graph "testsrc [out0]; testsrc,hflip [out1]; testsrc,negate [out2]" test3 +@end example + +@item +Read an audio stream from a file using the amovie source and play it +back with @command{ffplay}: +@example +ffplay -f lavfi "amovie=test.wav" +@end example + +@item +Read an audio stream and a video stream and play it back with +@command{ffplay}: +@example +ffplay -f lavfi "movie=test.avi[out0];amovie=test.wav[out1]" +@end example + +@end itemize + @section libdc1394 IIDC1394 input device, based on libdc1394 and libraw1394. +@section openal + +The OpenAL input device provides audio capture on all systems with a +working OpenAL 1.1 implementation. + +To enable this input device during configuration, you need OpenAL +headers and libraries installed on your system, and need to configure +FFmpeg with @code{--enable-openal}. + +OpenAL headers and libraries should be provided as part of your OpenAL +implementation, or as an additional download (an SDK). Depending on your +installation you may need to specify additional flags via the +@code{--extra-cflags} and @code{--extra-ldflags} for allowing the build +system to locate the OpenAL headers and libraries. + +An incomplete list of OpenAL implementations follows: + +@table @strong +@item Creative +The official Windows implementation, providing hardware acceleration +with supported devices and software fallback. +See @url{http://openal.org/}. +@item OpenAL Soft +Portable, open source (LGPL) software implementation. Includes +backends for the most common sound APIs on the Windows, Linux, +Solaris, and BSD operating systems. +See @url{http://kcat.strangesoft.net/openal.html}. +@item Apple +OpenAL is part of Core Audio, the official Mac OS X Audio interface. +See @url{http://developer.apple.com/technologies/mac/audio-and-video.html} +@end table + +This device allows to capture from an audio input device handled +through OpenAL. + +You need to specify the name of the device to capture in the provided +filename. If the empty string is provided, the device will +automatically select the default device. You can get the list of the +supported devices by using the option @var{list_devices}. + +@subsection Options + +@table @option + +@item channels +Set the number of channels in the captured audio. Only the values +@option{1} (monaural) and @option{2} (stereo) are currently supported. +Defaults to @option{2}. + +@item sample_size +Set the sample size (in bits) of the captured audio. Only the values +@option{8} and @option{16} are currently supported. Defaults to +@option{16}. + +@item sample_rate +Set the sample rate (in Hz) of the captured audio. +Defaults to @option{44.1k}. + +@item list_devices +If set to @option{true}, print a list of devices and exit. +Defaults to @option{false}. + +@end table + +@subsection Examples + +Print the list of OpenAL supported devices and exit: +@example +$ ffmpeg -list_devices true -f openal -i dummy out.ogg +@end example + +Capture from the OpenAL device @file{DR-BT101 via PulseAudio}: +@example +$ ffmpeg -f openal -i 'DR-BT101 via PulseAudio' out.ogg +@end example + +Capture from the default device (note the empty string '' as filename): +@example +$ ffmpeg -f openal -i '' out.ogg +@end example + +Capture from two devices simultaneously, writing to two different files, +within the same @command{ffmpeg} command: +@example +$ ffmpeg -f openal -i 'DR-BT101 via PulseAudio' out1.ogg -f openal -i 'ALSA Default' out2.ogg +@end example +Note: not all OpenAL implementations support multiple simultaneous capture - +try the latest OpenAL Soft if the above does not work. + @section oss Open Sound System input device. @@ -145,10 +467,10 @@ The filename to provide to the input device is the device node representing the OSS input device, and is usually set to @file{/dev/dsp}. -For example to grab from @file{/dev/dsp} using @command{avconv} use the +For example to grab from @file{/dev/dsp} using @command{ffmpeg} use the command: @example -avconv -f oss -i /dev/dsp /tmp/oss.wav +ffmpeg -f oss -i /dev/dsp /tmp/oss.wav @end example For more information about OSS see: @@ -165,10 +487,10 @@ The filename to provide to the input device is a source device or the string "default" To list the pulse source devices and their properties you can invoke -the command @file{pactl list sources}. +the command @command{pactl list sources}. @example -avconv -f pulse -i default /tmp/pulse.wav +ffmpeg -f pulse -i default /tmp/pulse.wav @end example @subsection @var{server} AVOption @@ -188,7 +510,7 @@ The syntax is: @end example Specify the application name pulse will use when showing active clients, -by default it is "libav" +by default it is the LIBAVFORMAT_IDENT string @subsection @var{stream_name} AVOption @@ -248,10 +570,10 @@ The filename to provide to the input device is the device node representing the sndio input device, and is usually set to @file{/dev/audio0}. -For example to grab from @file{/dev/audio0} using @command{avconv} use the +For example to grab from @file{/dev/audio0} using @command{ffmpeg} use the command: @example -avconv -f sndio -i /dev/audio0 /tmp/oss.wav +ffmpeg -f sndio -i /dev/audio0 /tmp/oss.wav @end example @section video4linux2 @@ -268,17 +590,29 @@ Video4Linux2 devices usually support a limited set of @var{width}x@var{height} sizes and framerates. You can check which are supported using @command{-list_formats all} for Video4Linux2 devices. -Some usage examples of the video4linux2 devices with avconv and avplay: +Some usage examples of the video4linux2 devices with ffmpeg and ffplay: +The time base for the timestamps is 1 microsecond. Depending on the kernel +version and configuration, the timestamps may be derived from the real time +clock (origin at the Unix Epoch) or the monotonic clock (origin usually at +boot time, unaffected by NTP or manual changes to the clock). The +@option{-timestamps abs} or @option{-ts abs} option can be used to force +conversion into the real time clock. + +Note that if FFmpeg is build with v4l-utils support ("--enable-libv4l2" +option), it will always be used. @example # Grab and show the input of a video4linux2 device. -avplay -f video4linux2 -framerate 30 -video_size hd720 /dev/video0 +ffplay -f video4linux2 -framerate 30 -video_size hd720 /dev/video0 # Grab and record the input of a video4linux2 device, leave the framerate and size as previously set. -avconv -f video4linux2 -input_format mjpeg -i /dev/video0 out.mpeg +ffmpeg -f video4linux2 -input_format mjpeg -i /dev/video0 out.mpeg @end example +"v4l" and "v4l2" can be used as aliases for the respective "video4linux" and +"video4linux2". + @section vfwcap VfW (Video for Windows) capture input device. @@ -300,7 +634,7 @@ The filename passed as input has the syntax: @var{hostname}:@var{display_number}.@var{screen_number} specifies the X11 display name of the screen to grab from. @var{hostname} can be -ommitted, and defaults to "localhost". The environment variable +omitted, and defaults to "localhost". The environment variable @env{DISPLAY} contains the default display name. @var{x_offset} and @var{y_offset} specify the offsets of the grabbed @@ -309,24 +643,30 @@ default to 0. Check the X11 documentation (e.g. man X) for more detailed information. -Use the @file{dpyinfo} program for getting basic information about the +Use the @command{dpyinfo} program for getting basic information about the properties of your X11 display (e.g. grep for "name" or "dimensions"). -For example to grab from @file{:0.0} using @command{avconv}: +For example to grab from @file{:0.0} using @command{ffmpeg}: @example -avconv -f x11grab -r 25 -s cif -i :0.0 out.mpg - -# Grab at position 10,20. -avconv -f x11grab -r 25 -s cif -i :0.0+10,20 out.mpg +ffmpeg -f x11grab -r 25 -s cif -i :0.0 out.mpg @end example -@subsection @var{follow_mouse} AVOption - -The syntax is: +Grab at position @code{10,20}: @example --follow_mouse centered|@var{PIXELS} +ffmpeg -f x11grab -r 25 -s cif -i :0.0+10,20 out.mpg @end example +@subsection Options + +@table @option +@item draw_mouse +Specify whether to draw the mouse pointer. A value of @code{0} specify +not to draw the pointer. Default value is @code{1}. + +@item follow_mouse +Make the grabbed area follow the mouse. The argument can be +@code{centered} or a number of pixels @var{PIXELS}. + When it is specified with "centered", the grabbing region follows the mouse pointer and keeps the pointer at the center of region; otherwise, the region follows only when the mouse pointer reaches within @var{PIXELS} (greater than @@ -334,29 +674,37 @@ zero) to the edge of region. For example: @example -avconv -f x11grab -follow_mouse centered -r 25 -s cif -i :0.0 out.mpg - -# Follows only when the mouse pointer reaches within 100 pixels to edge -avconv -f x11grab -follow_mouse 100 -r 25 -s cif -i :0.0 out.mpg +ffmpeg -f x11grab -follow_mouse centered -r 25 -s cif -i :0.0 out.mpg @end example -@subsection @var{show_region} AVOption - -The syntax is: +To follow only when the mouse pointer reaches within 100 pixels to edge: @example --show_region 1 +ffmpeg -f x11grab -follow_mouse 100 -r 25 -s cif -i :0.0 out.mpg @end example -If @var{show_region} AVOption is specified with @var{1}, then the grabbing -region will be indicated on screen. With this option, it's easy to know what is -being grabbed if only a portion of the screen is grabbed. +@item framerate +Set the grabbing frame rate. Default value is @code{ntsc}, +corresponding to a framerate of @code{30000/1001}. + +@item show_region +Show grabbed region on screen. + +If @var{show_region} is specified with @code{1}, then the grabbing +region will be indicated on screen. With this option, it is easy to +know what is being grabbed if only a portion of the screen is grabbed. For example: @example -avconv -f x11grab -show_region 1 -r 25 -s cif -i :0.0+10,20 out.mpg +ffmpeg -f x11grab -show_region 1 -r 25 -s cif -i :0.0+10,20 out.mpg +@end example -# With follow_mouse -avconv -f x11grab -follow_mouse centered -show_region 1 -r 25 -s cif -i :0.0 out.mpg +With @var{follow_mouse}: +@example +ffmpeg -f x11grab -follow_mouse centered -show_region 1 -r 25 -s cif -i :0.0 out.mpg @end example +@item video_size +Set the video frame size. Default value is @code{vga}. +@end table + @c man end INPUT DEVICES diff --git a/doc/issue_tracker.txt b/doc/issue_tracker.txt new file mode 100644 index 0000000..d487f66 --- /dev/null +++ b/doc/issue_tracker.txt @@ -0,0 +1,213 @@ +FFmpeg's bug/patch/feature request tracker manual +================================================= + +NOTE: This is a draft. + +Overview: +--------- + +FFmpeg uses Trac for tracking issues, new issues and changes to +existing issues can be done through a web interface. + +Issues can be different kinds of things we want to keep track of +but that do not belong into the source tree itself. This includes +bug reports, patches, feature requests and license violations. We +might add more items to this list in the future, so feel free to +propose a new `type of issue' on the ffmpeg-devel mailing list if +you feel it is worth tracking. + +It is possible to subscribe to individual issues by adding yourself to the +Cc list or to subscribe to the ffmpeg-trac mailing list which receives +a mail for every change to every issue. +(the above does all work already after light testing) + +The subscription URL for the ffmpeg-trac list is: +http(s)://ffmpeg.org/mailman/listinfo/ffmpeg-trac +The URL of the webinterface of the tracker is: +http(s)://ffmpeg.org/trac/ffmpeg + +Type: +----- +bug / defect + An error, flaw, mistake, failure, or fault in FFmpeg or libav* that + prevents it from behaving as intended. + +feature request / enhancement + Request of support for encoding or decoding of a new codec, container + or variant. + Request of support for more, less or plain different output or behavior + where the current implementation cannot be considered wrong. + +license violation + ticket to keep track of (L)GPL violations of ffmpeg by others + +patch + A patch as generated by diff which conforms to the patch submission and + development policy. + + +Priority: +--------- +critical + Bugs and patches which deal with data loss and security issues. + No feature request can be critical. + +important + Bugs which make FFmpeg unusable for a significant number of users, and + patches fixing them. + Examples here might be completely broken MPEG-4 decoding or a build issue + on Linux. + While broken 4xm decoding or a broken OS/2 build would not be important, + the separation to normal is somewhat fuzzy. + For feature requests this priority would be used for things many people + want. + Regressions also should be marked as important, regressions are bugs that + don't exist in a past revision or another branch. + +normal + + +minor + Bugs and patches about things like spelling errors, "mp2" instead of + "mp3" being shown and such. + Feature requests about things few people want or which do not make a big + difference. + +wish + Something that is desirable to have but that there is no urgency at + all to implement, e.g. something completely cosmetic like a website + restyle or a personalized doxy template or the FFmpeg logo. + This priority is not valid for bugs. + + +Status: +------- +new + initial state + +open + intermediate states + +closed + final state + + +Analyzed flag: +-------------- +Bugs which have been analyzed and where it is understood what causes them +and which exact chain of events triggers them. This analysis should be +available as a message in the bug report. +Note, do not change the status to analyzed without also providing a clear +and understandable analysis. +This state implicates that the bug either has been reproduced or that +reproduction is not needed as the bug is already understood. + + +Type/Status/Substatus: +---------- +*/new/new + Initial state of new bugs, patches and feature requests submitted by + users. + +*/open/open + Issues which have been briefly looked at and which did not look outright + invalid. + This implicates that no real more detailed state applies yet. Conversely, + the more detailed states below implicate that the issue has been briefly + looked at. + +*/closed/duplicate + Bugs, patches or feature requests which are duplicates. + Note that patches dealing with the same thing in a different way are not + duplicates. + Note, if you mark something as duplicate, do not forget setting the + superseder so bug reports are properly linked. + +*/closed/invalid + Bugs caused by user errors, random ineligible or otherwise nonsense stuff. + +*/closed/needs_more_info + Issues for which some information has been requested by the developers, + but which has not been provided by anyone within reasonable time. + + +bug/closed/fixed + Bugs which have to the best of our knowledge been fixed. + +bug/closed/wont_fix + Bugs which we will not fix. Possible reasons include legality, high + complexity for the sake of supporting obscure corner cases, speed loss + for similarly esoteric purposes, et cetera. + This also means that we would reject a patch. + If we are just too lazy to fix a bug then the correct state is open + and unassigned. Closed means that the case is closed which is not + the case if we are just waiting for a patch. + +bug/closed/works_for_me + Bugs for which sufficient information was provided to reproduce but + reproduction failed - that is the code seems to work correctly to the + best of our knowledge. + +patch/open/approved + Patches which have been reviewed and approved by a developer. + Such patches can be applied anytime by any other developer after some + reasonable testing (compile + regression tests + does the patch do + what the author claimed). + +patch/open/needs_changes + Patches which have been reviewed and need changes to be accepted. + +patch/closed/applied + Patches which have been applied. + +patch/closed/rejected + Patches which have been rejected. + +feature_request/closed/implemented + Feature requests which have been implemented. + +feature_request/closed/wont_implement + Feature requests which will not be implemented. The reasons here could + be legal, philosophical or others. + +Note, please do not use type-status-substatus combinations other than the +above without asking on ffmpeg-dev first! + +Note2, if you provide the requested info do not forget to remove the +needs_more_info substatus. + +Component: +---------- + +avcodec + issues in libavcodec/* + +avformat + issues in libavformat/* + +avutil + issues in libavutil/* + +regression test + issues in tests/* + +ffmpeg + issues in or related to ffmpeg.c + +ffplay + issues in or related to ffplay.c + +ffprobe + issues in or related to ffprobe.c + +ffserver + issues in or related to ffserver.c + +build system + issues in or related to configure/Makefile + +regression + bugs which were not present in a past revision + +trac + issues related to our issue tracker diff --git a/doc/libavfilter.texi b/doc/libavfilter.texi deleted file mode 100644 index b452294..0000000 --- a/doc/libavfilter.texi +++ /dev/null @@ -1,92 +0,0 @@ -\input texinfo @c -*- texinfo -*- - -@settitle Libavfilter Documentation -@titlepage -@center @titlefont{Libavfilter Documentation} -@end titlepage - -@top - -@contents - -@chapter Introduction - -Libavfilter is the filtering API of Libav. It is the substitute of the -now deprecated 'vhooks' and started as a Google Summer of Code project. - -But note that there may still be serious bugs in the code and its API -and ABI should not be considered stable yet! - -@chapter Tutorial - -In libavfilter, it is possible for filters to have multiple inputs and -multiple outputs. -To illustrate the sorts of things that are possible, we can -use a complex filter graph. For example, the following one: - -@example -input --> split --> fifo -----------------------> overlay --> output - | ^ - | | - +------> fifo --> crop --> vflip --------+ -@end example - -splits the stream in two streams, sends one stream through the crop filter -and the vflip filter before merging it back with the other stream by -overlaying it on top. You can use the following command to achieve this: - -@example -./avconv -i input -vf "[in] split [T1], fifo, [T2] overlay=0:H/2 [out]; [T1] fifo, crop=iw:ih/2:0:ih/2, vflip [T2]" output -@end example - -The result will be that in output the top half of the video is mirrored -onto the bottom half. - -Video filters are loaded using the @var{-vf} option passed to -avconv or to avplay. Filters in the same linear chain are separated by -commas. In our example, @var{split, fifo, overlay} are in one linear -chain, and @var{fifo, crop, vflip} are in another. The points where -the linear chains join are labeled by names enclosed in square -brackets. In our example, that is @var{[T1]} and @var{[T2]}. The magic -labels @var{[in]} and @var{[out]} are the points where video is input -and output. - -Some filters take in input a list of parameters: they are specified -after the filter name and an equal sign, and are separated each other -by a semicolon. - -There exist so-called @var{source filters} that do not have a video -input, and we expect in the future some @var{sink filters} that will -not have video output. - -@chapter graph2dot - -The @file{graph2dot} program included in the Libav @file{tools} -directory can be used to parse a filter graph description and issue a -corresponding textual representation in the dot language. - -Invoke the command: -@example -graph2dot -h -@end example - -to see how to use @file{graph2dot}. - -You can then pass the dot description to the @file{dot} program (from -the graphviz suite of programs) and obtain a graphical representation -of the filter graph. - -For example the sequence of commands: -@example -echo @var{GRAPH_DESCRIPTION} | \ -tools/graph2dot -o graph.tmp && \ -dot -Tpng graph.tmp -o graph.png && \ -display graph.png -@end example - -can be used to create and display an image representing the graph -described by the @var{GRAPH_DESCRIPTION} string. - -@include filters.texi - -@bye diff --git a/doc/metadata.texi b/doc/metadata.texi index cfaf491..2a28575 100644 --- a/doc/metadata.texi +++ b/doc/metadata.texi @@ -1,7 +1,7 @@ @chapter Metadata @c man begin METADATA -Libav is able to dump metadata from media files into a simple UTF-8-encoded +FFmpeg is able to dump metadata from media files into a simple UTF-8-encoded INI-like text file and then load it back using the metadata muxer/demuxer. The file format is as follows: @@ -53,7 +53,7 @@ A ffmetadata file might look like this: ;FFMETADATA1 title=bike\\shed ;this is a comment -artist=Libav troll team +artist=FFmpeg troll team [CHAPTER] TIMEBASE=1/1000 diff --git a/doc/mips.txt b/doc/mips.txt new file mode 100644 index 0000000..6fa6fb4 --- /dev/null +++ b/doc/mips.txt @@ -0,0 +1,65 @@ +MIPS optimizations info +=============================================== + +MIPS optimizations of codecs are targeting MIPS 74k family of +CPUs. Some of these optimizations are relying more on properties of +this architecture and some are relying less (and can be used on most +MIPS architectures without degradation in performance). + +Along with FFMPEG copyright notice, there is MIPS copyright notice in +all the files that are created by people from MIPS Technologies. + +Example of copyright notice: +=============================================== +/* + * Copyright (c) 2012 + * MIPS Technologies, Inc., California. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Author: Author Name (author_name@@mips.com) + */ + +Files that have MIPS copyright notice in them: +=============================================== +* libavutil/mips/ + libm_mips.h +* libavcodec/mips/ + acelp_filters_mips.c + acelp_vectors_mips.c + amrwbdec_mips.c + amrwbdec_mips.h + celp_filters_mips.c + celp_math_mips.c + compute_antialias_fixed.h + compute_antialias_float.h + lsp_mips.h + dsputil_mips.c + fft_mips.c + fft_table.h + fft_init_table.c + fmtconvert_mips.c + mpegaudiodsp_mips_fixed.c + mpegaudiodsp_mips_float.c diff --git a/doc/multithreading.txt b/doc/multithreading.txt index b72bc16..a106842 100644 --- a/doc/multithreading.txt +++ b/doc/multithreading.txt @@ -1,7 +1,7 @@ -Libav multithreading methods +FFmpeg multithreading methods ============================================== -Libav provides two methods for multithreading codecs. +FFmpeg provides two methods for multithreading codecs. Slice threading decodes multiple parts of a frame at the same time, using AVCodecContext execute() and execute2(). diff --git a/doc/muxers.texi b/doc/muxers.texi index 4bb6d56..34eed0f 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -1,10 +1,10 @@ @chapter Muxers @c man begin MUXERS -Muxers are configured elements in Libav which allow writing +Muxers are configured elements in FFmpeg which allow writing multimedia streams to a particular type of file. -When you configure your Libav build, all the supported muxers +When you configure your FFmpeg build, all the supported muxers are enabled by default. You can list all available muxers using the configure option @code{--list-muxers}. @@ -35,20 +35,20 @@ CRC=0x@var{CRC}, where @var{CRC} is a hexadecimal number 0-padded to For example to compute the CRC of the input, and store it in the file @file{out.crc}: @example -avconv -i INPUT -f crc out.crc +ffmpeg -i INPUT -f crc out.crc @end example You can print the CRC to stdout with the command: @example -avconv -i INPUT -f crc - +ffmpeg -i INPUT -f crc - @end example -You can select the output format of each frame with @command{avconv} by +You can select the output format of each frame with @command{ffmpeg} by specifying the audio and video codec and format. For example to compute the CRC of the input audio converted to PCM unsigned 8-bit and the input video converted to MPEG-2 video, use the command: @example -avconv -i INPUT -c:a pcm_u8 -c:v mpeg2video -f crc - +ffmpeg -i INPUT -c:a pcm_u8 -c:v mpeg2video -f crc - @end example See also the @ref{framecrc} muxer. @@ -56,40 +56,112 @@ See also the @ref{framecrc} muxer. @anchor{framecrc} @section framecrc -Per-frame CRC (Cyclic Redundancy Check) testing format. +Per-packet CRC (Cyclic Redundancy Check) testing format. -This muxer computes and prints the Adler-32 CRC for each decoded audio -and video frame. By default audio frames are converted to signed +This muxer computes and prints the Adler-32 CRC for each audio +and video packet. By default audio frames are converted to signed 16-bit raw audio and video frames to raw video before computing the CRC. The output of the muxer consists of a line for each audio and video -frame of the form: @var{stream_index}, @var{frame_dts}, -@var{frame_size}, 0x@var{CRC}, where @var{CRC} is a hexadecimal -number 0-padded to 8 digits containing the CRC of the decoded frame. +packet of the form: +@example +@var{stream_index}, @var{packet_dts}, @var{packet_pts}, @var{packet_duration}, @var{packet_size}, 0x@var{CRC} +@end example + +@var{CRC} is a hexadecimal number 0-padded to 8 digits containing the +CRC of the packet. -For example to compute the CRC of each decoded frame in the input, and -store it in the file @file{out.crc}: +For example to compute the CRC of the audio and video frames in +@file{INPUT}, converted to raw audio and video packets, and store it +in the file @file{out.crc}: @example -avconv -i INPUT -f framecrc out.crc +ffmpeg -i INPUT -f framecrc out.crc @end example -You can print the CRC of each decoded frame to stdout with the command: +To print the information to stdout, use the command: @example -avconv -i INPUT -f framecrc - +ffmpeg -i INPUT -f framecrc - @end example -You can select the output format of each frame with @command{avconv} by -specifying the audio and video codec and format. For example, to +With @command{ffmpeg}, you can select the output format to which the +audio and video frames are encoded before computing the CRC for each +packet by specifying the audio and video codec. For example, to compute the CRC of each decoded input audio frame converted to PCM unsigned 8-bit and of each decoded input video frame converted to MPEG-2 video, use the command: @example -avconv -i INPUT -c:a pcm_u8 -c:v mpeg2video -f framecrc - +ffmpeg -i INPUT -c:a pcm_u8 -c:v mpeg2video -f framecrc - @end example See also the @ref{crc} muxer. +@anchor{framemd5} +@section framemd5 + +Per-packet MD5 testing format. + +This muxer computes and prints the MD5 hash for each audio +and video packet. By default audio frames are converted to signed +16-bit raw audio and video frames to raw video before computing the +hash. + +The output of the muxer consists of a line for each audio and video +packet of the form: +@example +@var{stream_index}, @var{packet_dts}, @var{packet_pts}, @var{packet_duration}, @var{packet_size}, @var{MD5} +@end example + +@var{MD5} is a hexadecimal number representing the computed MD5 hash +for the packet. + +For example to compute the MD5 of the audio and video frames in +@file{INPUT}, converted to raw audio and video packets, and store it +in the file @file{out.md5}: +@example +ffmpeg -i INPUT -f framemd5 out.md5 +@end example + +To print the information to stdout, use the command: +@example +ffmpeg -i INPUT -f framemd5 - +@end example + +See also the @ref{md5} muxer. + +@anchor{ico} +@section ico + +ICO file muxer. + +Microsoft's icon file format (ICO) has some strict limitations that should be noted: + +@itemize +@item +Size cannot exceed 256 pixels in any dimension + +@item +Only BMP and PNG images can be stored + +@item +If a BMP image is used, it must be one of the following pixel formats: +@example +BMP Bit Depth FFmpeg Pixel Format +1bit pal8 +4bit pal8 +8bit pal8 +16bit rgb555le +24bit bgr24 +32bit bgra +@end example + +@item +If a BMP image is used, it must use the BITMAPINFOHEADER DIB header + +@item +If a PNG image is used, it must use the rgba pixel format +@end itemize + @anchor{image2} @section image2 @@ -120,34 +192,68 @@ The pattern "img%%-%d.jpg" will specify a sequence of filenames of the form @file{img%-1.jpg}, @file{img%-2.jpg}, ..., @file{img%-10.jpg}, etc. -The following example shows how to use @command{avconv} for creating a +The following example shows how to use @command{ffmpeg} for creating a sequence of files @file{img-001.jpeg}, @file{img-002.jpeg}, ..., taking one image every second from the input video: @example -avconv -i in.avi -vsync 1 -r 1 -f image2 'img-%03d.jpeg' +ffmpeg -i in.avi -vsync 1 -r 1 -f image2 'img-%03d.jpeg' @end example -Note that with @command{avconv}, if the format is not specified with the +Note that with @command{ffmpeg}, if the format is not specified with the @code{-f} option and the output filename specifies an image file format, the image2 muxer is automatically selected, so the previous command can be written as: @example -avconv -i in.avi -vsync 1 -r 1 'img-%03d.jpeg' +ffmpeg -i in.avi -vsync 1 -r 1 'img-%03d.jpeg' @end example Note also that the pattern must not necessarily contain "%d" or "%0@var{N}d", for example to create a single image file @file{img.jpeg} from the input video you can employ the command: @example -avconv -i in.avi -f image2 -frames:v 1 img.jpeg +ffmpeg -i in.avi -f image2 -frames:v 1 img.jpeg +@end example + +The image muxer supports the .Y.U.V image file format. This format is +special in that that each image frame consists of three files, for +each of the YUV420P components. To read or write this image file format, +specify the name of the '.Y' file. The muxer will automatically open the +'.U' and '.V' files as required. + +@anchor{md5} +@section md5 + +MD5 testing format. + +This muxer computes and prints the MD5 hash of all the input audio +and video frames. By default audio frames are converted to signed +16-bit raw audio and video frames to raw video before computing the +hash. + +The output of the muxer consists of a single line of the form: +MD5=@var{MD5}, where @var{MD5} is a hexadecimal number representing +the computed MD5 hash. + +For example to compute the MD5 hash of the input converted to raw +audio and video, and store it in the file @file{out.md5}: +@example +ffmpeg -i INPUT -f md5 out.md5 @end example +You can print the MD5 to stdout with the command: +@example +ffmpeg -i INPUT -f md5 - +@end example + +See also the @ref{framemd5} muxer. + @section MOV/MP4/ISMV The mov/mp4/ismv muxer supports fragmentation. Normally, a MOV/MP4 file has all the metadata about all packets stored in one location (written at the end of the file, it can be moved to the start for -better playback using the @command{qt-faststart} tool). A fragmented +better playback by adding @var{faststart} to the @var{movflags}, or +using the @command{qt-faststart} tool). A fragmented file consists of a number of fragments, where packets and metadata about these packets are stored together. Writing a fragmented file has the advantage that the file is decodable even if the @@ -161,6 +267,9 @@ Fragmentation is enabled by setting one of the AVOptions that define how to cut the file into fragments: @table @option +@item -moov_size @var{bytes} +Reserves space for the moov atom at the beginning of the file instead of placing the +moov atom at the end. If the space reserved is insufficient, muxing will fail. @item -movflags frag_keyframe Start a new fragment at each video keyframe. @item -frag_duration @var{duration} @@ -171,7 +280,7 @@ Create fragments that contain up to @var{size} bytes of payload data. Allow the caller to manually choose when to cut fragments, by calling @code{av_write_frame(ctx, NULL)} to write a fragment with the packets written so far. (This is only useful with other -applications integrating libavformat, not from @command{avconv}.) +applications integrating libavformat, not from @command{ffmpeg}.) @item -min_frag_duration @var{duration} Don't create fragments that are shorter than @var{duration} microseconds long. @end table @@ -202,12 +311,16 @@ more efficient), but with this option set, the muxer writes one moof/mdat pair for each track, making it easier to separate tracks. This option is implicitly set when writing ismv (Smooth Streaming) files. +@item -movflags faststart +Run a second pass moving the moov atom on top of the file. This +operation can take a while, and will not work in various situations such +as fragmented output, thus it is not enabled by default. @end table Smooth Streaming content can be pushed in real time to a publishing point on IIS with this muxer. Example: @example -avconv -re @var{<normal input/transcoding options>} -movflags isml+frag_keyframe -f ismv http://server/publishingpoint.isml/Streams(Encoder1) +ffmpeg -re @var{<normal input/transcoding options>} -movflags isml+frag_keyframe -f ismv http://server/publishingpoint.isml/Streams(Encoder1) @end example @section mpegts @@ -236,11 +349,11 @@ Set the first PID for data packets (default 0x0100, max 0x0f00). The recognized metadata settings in mpegts muxer are @code{service_provider} and @code{service_name}. If they are not set the default for -@code{service_provider} is "Libav" and the default for +@code{service_provider} is "FFmpeg" and the default for @code{service_name} is "Service01". @example -avconv -i file.mpg -c copy \ +ffmpeg -i file.mpg -c copy \ -mpegts_original_network_id 0x1122 \ -mpegts_transport_stream_id 0x3344 \ -mpegts_service_id 0x5566 \ @@ -258,19 +371,19 @@ Null muxer. This muxer does not generate any output file, it is mainly useful for testing or benchmarking purposes. -For example to benchmark decoding with @command{avconv} you can use the +For example to benchmark decoding with @command{ffmpeg} you can use the command: @example -avconv -benchmark -i INPUT -f null out.null +ffmpeg -benchmark -i INPUT -f null out.null @end example Note that the above command does not read or write the @file{out.null} -file, but specifying the output file is required by the @command{avconv} +file, but specifying the output file is required by the @command{ffmpeg} syntax. Alternatively you can write the command as: @example -avconv -benchmark -i INPUT -f null - +ffmpeg -benchmark -i INPUT -f null - @end example @section matroska @@ -295,7 +408,7 @@ Specifies the language of the track in the Matroska languages form @table @option -@item STEREO_MODE=@var{mode} +@item stereo_mode=@var{mode} Stereo 3D video layout of two views in a single video track @table @option @item mono @@ -333,10 +446,10 @@ Both eyes laced in one Block, Right-eye view is first For example a 3D WebM clip can be created using the following command line: @example -avconv -i sample_left_right_clip.mpg -an -c:v libvpx -metadata STEREO_MODE=left_right -y stereo_clip.webm +ffmpeg -i sample_left_right_clip.mpg -an -c:v libvpx -metadata stereo_mode=left_right -y stereo_clip.webm @end example -@section segment +@section segment, stream_segment, ssegment Basic stream segmenter. @@ -344,29 +457,165 @@ The segmenter muxer outputs streams to a number of separate files of nearly fixed duration. Output filename pattern can be set in a fashion similar to @ref{image2}. +@code{stream_segment} is a variant of the muxer used to write to +streaming output formats, i.e. which do not require global headers, +and is recommended for outputting e.g. to MPEG transport stream segments. +@code{ssegment} is a shorter alias for @code{stream_segment}. + Every segment starts with a video keyframe, if a video stream is present. +Note that if you want accurate splitting for a video file, you need to +make the input key frames correspond to the exact splitting times +expected by the segmenter, or the segment muxer will start the new +segment with the key frame found next after the specified start +time. + The segment muxer works best with a single constant frame rate video. -Optionally it can generate a flat list of the created segments, one segment -per line. +Optionally it can generate a list of the created segments, by setting +the option @var{segment_list}. The list type is specified by the +@var{segment_list_type} option. + +The segment muxer supports the following options: @table @option @item segment_format @var{format} Override the inner container format, by default it is guessed by the filename extension. -@item segment_time @var{t} -Set segment duration to @var{t} seconds. @item segment_list @var{name} -Generate also a listfile named @var{name}. +Generate also a listfile named @var{name}. If not specified no +listfile is generated. +@item segment_list_flags @var{flags} +Set flags affecting the segment list generation. + +It currently supports the following flags: +@table @var +@item cache +Allow caching (only affects M3U8 list files). + +@item live +Allow live-friendly file generation. + +This currently only affects M3U8 lists. In particular, write a fake +EXT-X-TARGETDURATION duration field at the top of the file, based on +the specified @var{segment_time}. +@end table + +Default value is @code{cache}. + @item segment_list_size @var{size} -Overwrite the listfile once it reaches @var{size} entries. +Overwrite the listfile once it reaches @var{size} entries. If 0 +the listfile is never overwritten. Default value is 0. +@item segment_list type @var{type} +Specify the format for the segment list file. + +The following values are recognized: +@table @option +@item flat +Generate a flat list for the created segments, one segment per line. + +@item csv, ext +Generate a list for the created segments, one segment per line, +each line matching the format (comma-separated values): +@example +@var{segment_filename},@var{segment_start_time},@var{segment_end_time} +@end example + +@var{segment_filename} is the name of the output file generated by the +muxer according to the provided pattern. CSV escaping (according to +RFC4180) is applied if required. + +@var{segment_start_time} and @var{segment_end_time} specify +the segment start and end time expressed in seconds. + +A list file with the suffix @code{".csv"} or @code{".ext"} will +auto-select this format. + +@code{ext} is deprecated in favor or @code{csv}. + +@item m3u8 +Generate an extended M3U8 file, version 4, compliant with +@url{http://tools.ietf.org/id/draft-pantos-http-live-streaming-08.txt}. + +A list file with the suffix @code{".m3u8"} will auto-select this format. +@end table + +If not specified the type is guessed from the list file name suffix. +@item segment_time @var{time} +Set segment duration to @var{time}. Default value is "2". +@item segment_time_delta @var{delta} +Specify the accuracy time when selecting the start time for a +segment. Default value is "0". + +When delta is specified a key-frame will start a new segment if its +PTS satisfies the relation: +@example +PTS >= start_time - time_delta +@end example + +This option is useful when splitting video content, which is always +split at GOP boundaries, in case a key frame is found just before the +specified split time. + +In particular may be used in combination with the @file{ffmpeg} option +@var{force_key_frames}. The key frame times specified by +@var{force_key_frames} may not be set accurately because of rounding +issues, with the consequence that a key frame time may result set just +before the specified time. For constant frame rate videos a value of +1/2*@var{frame_rate} should address the worst case mismatch between +the specified time and the time set by @var{force_key_frames}. + +@item segment_times @var{times} +Specify a list of split points. @var{times} contains a list of comma +separated duration specifications, in increasing order. @item segment_wrap @var{limit} Wrap around segment index once it reaches @var{limit}. @end table +Some examples follow. + +@itemize +@item +To remux the content of file @file{in.mkv} to a list of segments +@file{out-000.nut}, @file{out-001.nut}, etc., and write the list of +generated segments to @file{out.list}: +@example +ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.list out%03d.nut +@end example + +@item +As the example above, but segment the input file according to the split +points specified by the @var{segment_times} option: +@example +ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_times 1,2,3,5,8,13,21 out%03d.nut +@end example + +@item +As the example above, but use the @code{ffmpeg} @var{force_key_frames} +option to force key frames in the input at the specified location, together +with the segment option @var{segment_time_delta} to account for +possible roundings operated when setting key frame times. +@example +ffmpeg -i in.mkv -force_key_frames 1,2,3,5,8,13,21 -vcodec mpeg4 -acodec pcm_s16le -map 0 \ +-f segment -segment_list out.csv -segment_times 1,2,3,5,8,13,21 -segment_time_delta 0.05 out%03d.nut +@end example +In order to force key frames on the input file, transcoding is +required. + +@item +To convert the @file{in.mkv} to TS segments using the @code{libx264} +and @code{libfaac} encoders: +@example +ffmpeg -i in.mkv -map 0 -codec:v libx264 -codec:a libfaac -f ssegment -segment_list out.list out%03d.ts +@end example + +@item +Segment the input file, and create an M3U8 live playlist (can be used +as live HLS source): @example -avconv -i in.mkv -c copy -map 0 -f segment -list out.list out%03d.nut +ffmpeg -re -i in.mkv -codec copy -map 0 -f segment -segment_list playlist.m3u8 \ +-segment_list_flags +live -segment_time 10 out%03d.mkv @end example +@end itemize @section mp3 @@ -394,12 +643,12 @@ Examples: Write an mp3 with an ID3v2.3 header and an ID3v1 footer: @example -avconv -i INPUT -id3v2_version 3 -write_id3v1 1 out.mp3 +ffmpeg -i INPUT -id3v2_version 3 -write_id3v1 1 out.mp3 @end example Attach a picture to an mp3: @example -avconv -i input.mp3 -i cover.png -c copy -metadata:s:v title="Album cover" +ffmpeg -i input.mp3 -i cover.png -c copy -metadata:s:v title="Album cover" -metadata:s:v comment="Cover (Front)" out.mp3 @end example diff --git a/doc/nut.texi b/doc/nut.texi index 1c23934..d697e2e 100644 --- a/doc/nut.texi +++ b/doc/nut.texi @@ -17,6 +17,10 @@ subtitle and user-defined streams in a simple, yet efficient, way. It was created by a group of FFmpeg and MPlayer developers in 2003 and was finalized in 2008. +The official nut specification is at svn://svn.mplayerhq.hu/nut +In case of any differences between this text and the official specification, +the official specification shall prevail. + @chapter Container-specific codec tags @section Generic raw YUVA formats diff --git a/doc/optimization.txt b/doc/optimization.txt index 78e0077..b027efe 100644 --- a/doc/optimization.txt +++ b/doc/optimization.txt @@ -17,15 +17,15 @@ Understanding these overoptimized functions: As many functions tend to be a bit difficult to understand because of optimizations, it can be hard to optimize them further, or write architecture-specific versions. It is recommended to look at older -revisions of the interesting files (web frontends for the various Libav -branches are listed at http://libav.org/download.html). +revisions of the interesting files (web frontends for the various FFmpeg +branches are listed at http://ffmpeg.org/download.html). Alternatively, look into the other architecture-specific versions in the x86/, ppc/, alpha/ subdirectories. Even if you don't exactly comprehend the instructions, it could help understanding the functions and how they can be optimized. NOTE: If you still don't understand some function, ask at our mailing list!!! -(https://lists.libav.org/mailman/listinfo/libav-devel) +(http://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel) When is an optimization justified? @@ -201,7 +201,7 @@ Inline asm vs. external asm --------------------------- Both inline asm (__asm__("..") in a .c file, handled by a compiler such as gcc) and external asm (.s or .asm files, handled by an assembler such as yasm/nasm) -are accepted in Libav. Which one to use differs per specific case. +are accepted in FFmpeg. Which one to use differs per specific case. - if your code is intended to be inlined in a C function, inline asm is always better, because external asm cannot be inlined diff --git a/doc/outdevs.texi b/doc/outdevs.texi index 938909c..371d63a 100644 --- a/doc/outdevs.texi +++ b/doc/outdevs.texi @@ -1,10 +1,10 @@ @chapter Output Devices @c man begin OUTPUT DEVICES -Output devices are configured elements in Libav which allow to write +Output devices are configured elements in FFmpeg which allow to write multimedia data to an output device attached to your system. -When you configure your Libav build, all the supported output devices +When you configure your FFmpeg build, all the supported output devices are enabled by default. You can list all available ones using the configure option "--list-outdevs". @@ -22,10 +22,133 @@ A description of the currently available output devices follows. ALSA (Advanced Linux Sound Architecture) output device. +@section caca + +CACA output device. + +This output devices allows to show a video stream in CACA window. +Only one CACA window is allowed per application, so you can +have only one instance of this output device in an application. + +To enable this output device you need to configure FFmpeg with +@code{--enable-libcaca}. +libcaca is a graphics library that outputs text instead of pixels. + +For more information about libcaca, check: +@url{http://caca.zoy.org/wiki/libcaca} + +@subsection Options + +@table @option + +@item window_title +Set the CACA window title, if not specified default to the filename +specified for the output device. + +@item window_size +Set the CACA window size, can be a string of the form +@var{width}x@var{height} or a video size abbreviation. +If not specified it defaults to the size of the input video. + +@item driver +Set display driver. + +@item algorithm +Set dithering algorithm. Dithering is necessary +because the picture being rendered has usually far more colours than +the available palette. +The accepted values are listed with @code{-list_dither algorithms}. + +@item antialias +Set antialias method. Antialiasing smoothens the rendered +image and avoids the commonly seen staircase effect. +The accepted values are listed with @code{-list_dither antialiases}. + +@item charset +Set which characters are going to be used when rendering text. +The accepted values are listed with @code{-list_dither charsets}. + +@item color +Set color to be used when rendering text. +The accepted values are listed with @code{-list_dither colors}. + +@item list_drivers +If set to @option{true}, print a list of available drivers and exit. + +@item list_dither +List available dither options related to the argument. +The argument must be one of @code{algorithms}, @code{antialiases}, +@code{charsets}, @code{colors}. +@end table + +@subsection Examples + +@itemize +@item +The following command shows the @command{ffmpeg} output is an +CACA window, forcing its size to 80x25: +@example +ffmpeg -i INPUT -vcodec rawvideo -pix_fmt rgb24 -window_size 80x25 -f caca - +@end example + +@item +Show the list of available drivers and exit: +@example +ffmpeg -i INPUT -pix_fmt rgb24 -f caca -list_drivers true - +@end example + +@item +Show the list of available dither colors and exit: +@example +ffmpeg -i INPUT -pix_fmt rgb24 -f caca -list_dither colors - +@end example +@end itemize + @section oss OSS (Open Sound System) output device. +@section sdl + +SDL (Simple DirectMedia Layer) output device. + +This output devices allows to show a video stream in an SDL +window. Only one SDL window is allowed per application, so you can +have only one instance of this output device in an application. + +To enable this output device you need libsdl installed on your system +when configuring your build. + +For more information about SDL, check: +@url{http://www.libsdl.org/} + +@subsection Options + +@table @option + +@item window_title +Set the SDL window title, if not specified default to the filename +specified for the output device. + +@item icon_title +Set the name of the iconified SDL window, if not specified it is set +to the same value of @var{window_title}. + +@item window_size +Set the SDL window size, can be a string of the form +@var{width}x@var{height} or a video size abbreviation. +If not specified it defaults to the size of the input video, +downscaled according to the aspect ratio. +@end table + +@subsection Examples + +The following command shows the @command{ffmpeg} output is an +SDL window, forcing its size to the qcif format: +@example +ffmpeg -i INPUT -vcodec rawvideo -pix_fmt yuv420p -window_size qcif -f sdl "SDL output" +@end example + @section sndio sndio audio output device. diff --git a/doc/platform.texi b/doc/platform.texi index 6bb7136..9da8bc8 100644 --- a/doc/platform.texi +++ b/doc/platform.texi @@ -11,7 +11,7 @@ @chapter Unix-like -Some parts of Libav cannot be built with version 2.15 of the GNU +Some parts of FFmpeg cannot be built with version 2.15 of the GNU assembler which is still provided by a few AMD64 distributions. To make sure your compiler really uses the required version of gas after a binutils upgrade, run: @@ -26,12 +26,12 @@ to configure. @section BSD -BSD make will not build Libav, you need to install and use GNU Make +BSD make will not build FFmpeg, you need to install and use GNU Make (@command{gmake}). @section (Open)Solaris -GNU Make is required to build Libav, so you have to invoke (@command{gmake}), +GNU Make is required to build FFmpeg, so you have to invoke (@command{gmake}), standard Solaris Make will not work. When building with a non-c99 front-end (gcc, generic suncc) add either @code{--extra-libs=/usr/lib/values-xpg6.o} or @code{--extra-libs=/usr/lib/64/values-xpg6.o} to the configure options @@ -45,20 +45,21 @@ bash ./configure @end example @anchor{Darwin} -@section Darwin (OS X, iPhone) +@section Darwin (Mac OS X, iPhone) The toolchain provided with Xcode is sufficient to build the basic unacelerated code. -OS X on PowerPC or ARM (iPhone) requires a preprocessor from +Mac OS X on PowerPC or ARM (iPhone) requires a preprocessor from @url{http://github.com/yuvi/gas-preprocessor} to build the optimized assembler functions. Just download the Perl script and put it somewhere -in your PATH, Libav's configure will pick it up automatically. +in your PATH, FFmpeg's configure will pick it up automatically. -OS X on AMD64 and x86 requires @command{yasm} to build most of the -optimized assembler functions @url{http://mxcl.github.com/homebrew/, Homebrew}, -@url{http://www.gentoo.org/proj/en/gentoo-alt/prefix/bootstrap-macos.xml, Gentoo Prefix} -or @url{http://www.macports.org, MacPorts} can easily provide it. +Mac OS X on amd64 and x86 requires @command{yasm} to build most of the +optimized assembler functions. @uref{http://www.finkproject.org/, Fink}, +@uref{http://www.gentoo.org/proj/en/gentoo-alt/prefix/bootstrap-macos.xml, Gentoo Prefix}, +@uref{http://mxcl.github.com/homebrew/, Homebrew} +or @uref{http://www.macports.org, MacPorts} can easily provide it. @chapter DOS @@ -69,15 +70,19 @@ Using a cross-compiler is preferred for various reasons. @chapter OS/2 -For information about compiling Libav on OS/2 see +For information about compiling FFmpeg on OS/2 see @url{http://www.edm2.com/index.php/FFmpeg}. @chapter Windows +To get help and instructions for building FFmpeg under Windows, check out +the FFmpeg Windows Help Forum at +@url{http://ffmpeg.arrozcru.org/}. + @section Native Windows compilation using MinGW or MinGW-w64 -Libav can be built to run natively on Windows using the MinGW or MinGW-w64 +FFmpeg can be built to run natively on Windows using the MinGW or MinGW-w64 toolchains. Install the latest versions of MSYS and MinGW or MinGW-w64 from @url{http://www.mingw.org/} or @url{http://mingw-w64.sourceforge.net/}. You can find detailed installation instructions in the download section and @@ -93,17 +98,18 @@ 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 @code{make install}). -@item In order to compile AVplay, you must have the MinGW development library +@item In order to compile FFplay, you must have the MinGW development library of @uref{http://www.libsdl.org/, SDL} and @code{pkg-config} installed. -@item By using @code{./configure --enable-shared} when configuring Libav, -you can build all libraries as DLLs. +@item By using @code{./configure --enable-shared} when configuring FFmpeg, +you can build the FFmpeg libraries (e.g. libavutil, libavcodec, +libavformat) as DLLs. @end itemize @section Microsoft Visual C++ -Libav can be built with MSVC using a C99-to-C89 conversion utility and +FFmpeg can be built with MSVC using a C99-to-C89 conversion utility and wrapper. You will need the following prerequisites: @@ -160,26 +166,26 @@ follow step 3, or compilation will fail. @enumerate @item Grab the @uref{http://zlib.net/, zlib sources}. @item Edit @code{win32/Makefile.msc} so that it uses -MT instead of -MD, since -this is how Libav is built as well. +this is how FFmpeg is built as well. @item Edit @code{zconf.h} and remove its inclusion of @code{unistd.h}. This gets -erroneously included when building Libav. +erroneously included when building FFmpeg. @item Run @code{nmake -f win32/Makefile.msc}. @item Move @code{zlib.lib}, @code{zconf.h}, and @code{zlib.h} to somewhere MSVC can see. @end enumerate -@item Libav has been tested with Visual Studio 2010 and 2012, Pro and Express. +@item FFmpeg has been tested with Visual Studio 2010 and 2012, Pro and Express. Anything else is not officially supported. @end itemize -@subsection Linking to Libav with Microsoft Visual C++ +@subsection Linking to FFmpeg with Microsoft Visual C++ If you plan to link with MSVC-built static libraries, you will need to make sure you have @code{Runtime Library} set to @code{Multi-threaded (/MT)} in your project's settings. -Libav headers do not declare global data for Windows DLLs through the usual +FFmpeg headers do not declare global data for Windows DLLs through the usual dllexport/dllimport interface. Such data will be exported properly while building, but to use them in your MSVC code you will have to edit the appropriate headers and mark the data as dllimport. For example, in @@ -234,14 +240,14 @@ Replace @code{foo-version} and @code{foo} with the respective library names. You must use the MinGW cross compilation tools available at @url{http://www.mingw.org/}. -Then configure Libav with the following options: +Then configure FFmpeg with the following options: @example ./configure --target-os=mingw32 --cross-prefix=i386-mingw32msvc- @end example (you can change the cross-prefix according to the prefix chosen for the MinGW tools). -Then you can easily test Libav with @uref{http://www.winehq.com/, Wine}. +Then you can easily test FFmpeg with @uref{http://www.winehq.com/, Wine}. @section Compilation under Cygwin @@ -259,7 +265,7 @@ In order to run FATE you will also need the following "Utils" packages: bc, diffutils @end example -If you want to build Libav with additional libraries, download Cygwin +If you want to build FFmpeg with additional libraries, download Cygwin "Devel" packages for Ogg and Vorbis from any Cygwin packages repository: @example libogg-devel, libvorbis-devel @@ -269,7 +275,7 @@ These library packages are only available from @uref{http://sourceware.org/cygwinports/, Cygwin Ports}: @example -yasm, libSDL-devel, libfaac-devel, libgsm-devel, libmp3lame-devel, +yasm, libSDL-devel, libfaac-devel, libaacplus-devel, libgsm-devel, libmp3lame-devel, libschroedinger1.0-devel, speex-devel, libtheora-devel, libxvidcore-devel @end example @@ -301,7 +307,7 @@ and for a build with shared libraries @chapter Plan 9 The native @uref{http://plan9.bell-labs.com/plan9/, Plan 9} compiler -does not implement all the C99 features needed by Libav so the gcc +does not implement all the C99 features needed by FFmpeg so the gcc port must be used. Furthermore, a few items missing from the C library and shell environment need to be fixed. @@ -317,7 +323,7 @@ utility by setting @code{pkgpath} to @item Missing/broken @code{head} and @code{printf} commands -Replacements adequate for building Libav can be found in the +Replacements adequate for building FFmpeg can be found in the @code{compat/plan9} directory. Place these somewhere they will be found by the shell. These are not full implementations of the commands and are @emph{not} suitable for general use. @@ -355,7 +361,7 @@ build system of this library. @item FPU exceptions enabled by default Unlike most other systems, Plan 9 enables FPU exceptions by default. -These must be disabled before calling any Libav functions. While the +These must be disabled before calling any FFmpeg functions. While the included tools will do this automatically, other users of the libraries must do it themselves. diff --git a/doc/print_options.c b/doc/print_options.c index 4283e6a..339b942 100644 --- a/doc/print_options.c +++ b/doc/print_options.c @@ -112,6 +112,8 @@ int main(int argc, char **argv) if (argc < 2) print_usage(); + printf("@c DO NOT EDIT THIS FILE!\n" + "@c It was generated by print_options.\n\n"); if (!strcmp(argv[1], "format")) show_format_opts(); else if (!strcmp(argv[1], "codec")) diff --git a/doc/protocols.texi b/doc/protocols.texi index 086a249..e790459 100644 --- a/doc/protocols.texi +++ b/doc/protocols.texi @@ -1,10 +1,10 @@ @chapter Protocols @c man begin PROTOCOLS -Protocols are configured elements in Libav which allow to access +Protocols are configured elements in FFmpeg which allow to access resources which require the use of a particular protocol. -When you configure your Libav build, all the supported protocols are +When you configure your FFmpeg build, all the supported protocols are enabled by default. You can list all available ones using the configure option "--list-protocols". @@ -19,6 +19,36 @@ supported protocols. A description of the currently available protocols follows. +@section bluray + +Read BluRay playlist. + +The accepted options are: +@table @option + +@item angle +BluRay angle + +@item chapter +Start chapter (1...N) + +@item playlist +Playlist to read (BDMV/PLAYLIST/?????.mpls) + +@end table + +Examples: + +Read longest playlist from BluRay mounted to /mnt/bluray: +@example +bluray:/mnt/bluray +@end example + +Read angle 2 of playlist 4 from BluRay mounted to /mnt/bluray, start from chapter 2: +@example +-playlist 4 -angle 2 -chapter 2 bluray:/mnt/bluray +@end example + @section concat Physical concatenation protocol. @@ -36,10 +66,10 @@ resource to be concatenated, each one possibly specifying a distinct protocol. For example to read a sequence of files @file{split1.mpeg}, -@file{split2.mpeg}, @file{split3.mpeg} with @command{avplay} use the +@file{split2.mpeg}, @file{split3.mpeg} with @command{ffplay} use the command: @example -avplay concat:split1.mpeg\|split2.mpeg\|split3.mpeg +ffplay concat:split1.mpeg\|split2.mpeg\|split3.mpeg @end example Note that you may need to escape the character "|" which is special for @@ -51,10 +81,10 @@ File access protocol. Allow to read from or read to a file. -For example to read from a file @file{input.mpeg} with @command{avconv} +For example to read from a file @file{input.mpeg} with @command{ffmpeg} use the command: @example -avconv -i file:input.mpeg output.mpeg +ffmpeg -i file:input.mpeg output.mpeg @end example The ff* tools default to the file protocol, that is a resource @@ -113,10 +143,10 @@ be used to test muxers without writing an actual file. Some examples follow. @example # Write the MD5 hash of the encoded AVI file to the file output.avi.md5. -avconv -i input.flv -f avi -y md5:output.avi.md5 +ffmpeg -i input.flv -f avi -y md5:output.avi.md5 # Write the MD5 hash of the encoded AVI file to stdout. -avconv -i input.flv -f avi -y md5: +ffmpeg -i input.flv -f avi -y md5: @end example Note that some formats (typically MOV) require the output protocol to @@ -138,18 +168,18 @@ pipe (e.g. 0 for stdin, 1 for stdout, 2 for stderr). If @var{number} is not specified, by default the stdout file descriptor will be used for writing, stdin for reading. -For example to read from stdin with @command{avconv}: +For example to read from stdin with @command{ffmpeg}: @example -cat test.wav | avconv -i pipe:0 +cat test.wav | ffmpeg -i pipe:0 # ...this is the same as... -cat test.wav | avconv -i pipe: +cat test.wav | ffmpeg -i pipe: @end example -For writing to stdout with @command{avconv}: +For writing to stdout with @command{ffmpeg}: @example -avconv -i test.wav -f avi pipe:1 | cat > test.avi +ffmpeg -i test.wav -f avi pipe:1 | cat > test.avi # ...this is the same as... -avconv -i test.wav -f avi pipe: | cat > test.avi +ffmpeg -i test.wav -f avi pipe: | cat > test.avi @end example Note that some formats (typically MOV), require the output protocol to @@ -264,10 +294,10 @@ URL of the target stream. Defaults to proto://host[:port]/app. @end table -For example to read with @command{avplay} a multimedia resource named +For example to read with @command{ffplay} a multimedia resource named "sample" from the application "vod" from an RTMP server "myserver": @example -avplay rtmp://myserver/vod/sample +ffplay rtmp://myserver/vod/sample @end example @section rtmpe @@ -340,14 +370,14 @@ meaning as specified for the RTMP native protocol. See the librtmp manual page (man 3 librtmp) for more information. For example, to stream a file in real-time to an RTMP server using -@command{avconv}: +@command{ffmpeg}: @example -avconv -re -i myfile -f flv rtmp://myserver/live/mystream +ffmpeg -re -i myfile -f flv rtmp://myserver/live/mystream @end example -To play the same stream using @command{avplay}: +To play the same stream using @command{ffplay}: @example -avplay "rtmp://myserver/live/mystream live=1" +ffplay "rtmp://myserver/live/mystream live=1" @end example @section rtp @@ -370,7 +400,7 @@ The required syntax for a RTSP url is: rtsp://@var{hostname}[:@var{port}]/@var{path} @end example -The following options (set on the @command{avconv}/@command{avplay} command +The following options (set on the @command{ffmpeg}/@command{ffplay} command line, or set in code via @code{AVOption}s or in @code{avformat_open_input}), are supported: @@ -411,7 +441,7 @@ When receiving data over UDP, the demuxer tries to reorder received packets can be disabled by setting the maximum demuxing delay to zero (via the @code{max_delay} field of AVFormatContext). -When watching multi-bitrate Real-RTSP streams with @command{avplay}, the +When watching multi-bitrate Real-RTSP streams with @command{ffplay}, the streams to display can be chosen with @code{-vst} @var{n} and @code{-ast} @var{n} for video and audio respectively, and can be switched on the fly by pressing @code{v} and @code{a}. @@ -421,25 +451,25 @@ Example command lines: To watch a stream over UDP, with a max reordering delay of 0.5 seconds: @example -avplay -max_delay 500000 -rtsp_transport udp rtsp://server/video.mp4 +ffplay -max_delay 500000 -rtsp_transport udp rtsp://server/video.mp4 @end example To watch a stream tunneled over HTTP: @example -avplay -rtsp_transport http rtsp://server/video.mp4 +ffplay -rtsp_transport http rtsp://server/video.mp4 @end example To send a stream in realtime to a RTSP server, for others to watch: @example -avconv -re -i @var{input} -f rtsp -muxdelay 0.1 rtsp://server/live.sdp +ffmpeg -re -i @var{input} -f rtsp -muxdelay 0.1 rtsp://server/live.sdp @end example To receive a stream in realtime: @example -avconv -rtsp_flags listen -i rtsp://ownaddress/live.sdp @var{output} +ffmpeg -rtsp_flags listen -i rtsp://ownaddress/live.sdp @var{output} @end example @section sap @@ -491,19 +521,19 @@ Example command lines follow. To broadcast a stream on the local subnet, for watching in VLC: @example -avconv -re -i @var{input} -f sap sap://224.0.0.255?same_port=1 +ffmpeg -re -i @var{input} -f sap sap://224.0.0.255?same_port=1 @end example -Similarly, for watching in avplay: +Similarly, for watching in @command{ffplay}: @example -avconv -re -i @var{input} -f sap sap://224.0.0.255 +ffmpeg -re -i @var{input} -f sap sap://224.0.0.255 @end example -And for watching in avplay, over IPv6: +And for watching in @command{ffplay}, over IPv6: @example -avconv -re -i @var{input} -f sap sap://[ff0e::1:2:3:4] +ffmpeg -re -i @var{input} -f sap sap://[ff0e::1:2:3:4] @end example @subsection Demuxer @@ -525,13 +555,13 @@ Example command lines follow. To play back the first stream announced on the normal SAP multicast address: @example -avplay sap:// +ffplay sap:// @end example To play back the first stream announced on one the default IPv6 SAP multicast address: @example -avplay sap://[ff0e::2:7ffe] +ffplay sap://[ff0e::2:7ffe] @end example @section tcp @@ -548,13 +578,60 @@ tcp://@var{hostname}:@var{port}[?@var{options}] @item listen Listen for an incoming connection +@item timeout=@var{microseconds} +In read mode: if no data arrived in more than this time interval, raise error. +In write mode: if socket cannot be written in more than this time interval, raise error. +This also sets timeout on TCP connection establishing. + +@example +ffmpeg -i @var{input} -f @var{format} tcp://@var{hostname}:@var{port}?listen +ffplay tcp://@var{hostname}:@var{port} +@end example + +@end table + +@section tls + +Transport Layer Security/Secure Sockets Layer + +The required syntax for a TLS/SSL url is: @example -avconv -i @var{input} -f @var{format} tcp://@var{hostname}:@var{port}?listen -avplay tcp://@var{hostname}:@var{port} +tls://@var{hostname}:@var{port}[?@var{options}] @end example +@table @option + +@item listen +Act as a server, listening for an incoming connection. + +@item cafile=@var{filename} +Certificate authority file. The file must be in OpenSSL PEM format. + +@item cert=@var{filename} +Certificate file. The file must be in OpenSSL PEM format. + +@item key=@var{filename} +Private key file. + +@item verify=@var{0|1} +Verify the peer's certificate. + @end table +Example command lines: + +To create a TLS/SSL server that serves an input stream. + +@example +ffmpeg -i @var{input} -f @var{format} tls://@var{hostname}:@var{port}?listen&cert=@var{server.crt}&key=@var{server.key} +@end example + +To play back a stream from the TLS/SSL server using @command{ffplay}: + +@example +ffplay tls://@var{hostname}:@var{port} +@end example + @section udp User Datagram Protocol. @@ -564,16 +641,23 @@ The required syntax for a UDP url is: udp://@var{hostname}:@var{port}[?@var{options}] @end example -@var{options} contains a list of &-seperated options of the form @var{key}=@var{val}. -Follow the list of supported options. +@var{options} contains a list of &-separated options of the form @var{key}=@var{val}. + +In case threading is enabled on the system, a circular buffer is used +to store the incoming data, which allows to reduce loss of data due to +UDP socket buffer overruns. The @var{fifo_size} and +@var{overrun_nonfatal} options are related to this buffer. + +The list of supported options follows. @table @option @item buffer_size=@var{size} -set the UDP buffer size in bytes +Set the UDP socket buffer size in bytes. This is used both for the +receiving and the sending buffer size. @item localport=@var{port} -override the local UDP port to bind with +Override the local UDP port to bind with. @item localaddr=@var{addr} Choose the local IP address. This is useful e.g. if sending multicast @@ -581,13 +665,13 @@ and the host has multiple interfaces, where the user can choose which interface to send on by specifying the IP address of that interface. @item pkt_size=@var{size} -set the size in bytes of UDP packets +Set the size in bytes of UDP packets. @item reuse=@var{1|0} -explicitly allow or disallow reusing UDP sockets +Explicitly allow or disallow reusing UDP sockets. @item ttl=@var{ttl} -set the time to live value (for multicast only) +Set the time to live value (for multicast only). @item connect=@var{1|0} Initialize the UDP socket with @code{connect()}. In this case, the @@ -607,23 +691,34 @@ specified sender IP addresses. @item block=@var{address}[,@var{address}] Ignore packets sent to the multicast group from the specified sender IP addresses. + +@item fifo_size=@var{units} +Set the UDP receiving circular buffer size, expressed as a number of +packets with size of 188 bytes. If not specified defaults to 7*4096. + +@item overrun_nonfatal=@var{1|0} +Survive in case of UDP receiving circular buffer overrun. Default +value is 0. + +@item timeout=@var{microseconds} +In read mode: if no data arrived in more than this time interval, raise error. @end table -Some usage examples of the udp protocol with @command{avconv} follow. +Some usage examples of the UDP protocol with @command{ffmpeg} follow. To stream over UDP to a remote endpoint: @example -avconv -i @var{input} -f @var{format} udp://@var{hostname}:@var{port} +ffmpeg -i @var{input} -f @var{format} udp://@var{hostname}:@var{port} @end example To stream in mpegts format over UDP using 188 sized UDP packets, using a large input buffer: @example -avconv -i @var{input} -f mpegts udp://@var{hostname}:@var{port}?pkt_size=188&buffer_size=65535 +ffmpeg -i @var{input} -f mpegts udp://@var{hostname}:@var{port}?pkt_size=188&buffer_size=65535 @end example To receive over UDP from a remote endpoint: @example -avconv -i udp://[@var{multicast-address}]:@var{port} +ffmpeg -i udp://[@var{multicast-address}]:@var{port} @end example @c man end PROTOCOLS diff --git a/doc/soc.txt b/doc/soc.txt index 89728b5..2504dba 100644 --- a/doc/soc.txt +++ b/doc/soc.txt @@ -8,9 +8,9 @@ it's a little late for this year's soc (2006). The Goal: Our goal in respect to soc is and must be of course exactly one thing and -that is to improve Libav, to reach this goal, code must +that is to improve FFmpeg, to reach this goal, code must * conform to the development policy and patch submission guidelines -* must improve Libav somehow (faster, smaller, "better", +* must improve FFmpeg somehow (faster, smaller, "better", more codecs supported, fewer bugs, cleaner, ...) for mentors and other developers to help students to reach that goal it is @@ -20,5 +20,5 @@ easy reviewable that again leads us to: * separation of cosmetic from non-cosmetic changes (this is almost entirely ignored by mentors and students in soc 2006 which might lead to a surprise when the code will be reviewed at the end before a possible inclusion in - Libav, individual changes were generally not reviewable due to cosmetics). + FFmpeg, individual changes were generally not reviewable due to cosmetics). * frequent commits, so that comments can be provided early diff --git a/doc/swresample.txt b/doc/swresample.txt new file mode 100644 index 0000000..7904147 --- /dev/null +++ b/doc/swresample.txt @@ -0,0 +1,46 @@ + The official guide to swresample for confused developers. + ========================================================= + +Current (simplified) Architecture: +--------------------------------- + Input + v + __________________/|\___________ + / | \ + / input sample format convert v + / | ___________/ + | |/ + | v + | ___________/|\___________ _____________ + | / | \ | | + | Rematrix | resample <---->| Buffers | + | \___________ | ___________/ |_____________| + v \|/ +Special Converter v + v ___________/|\___________ _____________ + | / | \ | | + | Rematrix | resample <---->| Buffers | + | \___________ | ___________/ |_____________| + | \|/ + | v + | |\___________ + \ | \ + \ output sample format convert v + \_________________ | ___________/ + \|/ + v + Output + +Planar/Packed conversion is done when needed during sample format conversion. +Every step can be skipped without memcpy when its not needed. +Either Resampling and Rematrixing can be performed first depending on which +way its faster. +The Buffers are needed for resampling due to resamplng being a process that +requires future and past data, it thus also introduces inevitably a delay when +used. +Internally 32bit float and 16bit int is supported currently, other formats can +easily be added. +Externally all sample formats in packed and planar configuration are supported +It's also trivial to add special converters for common cases. +If only sample format and/or packed/planar conversion is needed, it +is performed from input to output directly in a single pass with no intermediates. diff --git a/doc/syntax.texi b/doc/syntax.texi new file mode 100644 index 0000000..169fa78 --- /dev/null +++ b/doc/syntax.texi @@ -0,0 +1,158 @@ +@chapter Syntax +@c man begin SYNTAX + +When evaluating specific formats, FFmpeg uses internal library parsing +functions, shared by the tools. This section documents the syntax of +some of these formats. + +@anchor{date syntax} +@section Date + +The accepted syntax is: +@example +[(YYYY-MM-DD|YYYYMMDD)[T|t| ]]((HH:MM:SS[.m...]]])|(HHMMSS[.m...]]]))[Z] +now +@end example + +If the value is "now" it takes the current time. + +Time is local time unless Z is appended, in which case it is +interpreted as UTC. +If the year-month-day part is not specified it takes the current +year-month-day. + +@anchor{time duration syntax} +@section Time duration + +The accepted syntax is: +@example +[-]HH:MM:SS[.m...] +[-]S+[.m...] +@end example + +@var{HH} expresses the number of hours, @var{MM} the number a of minutes +and @var{SS} the number of seconds. + +@anchor{video size syntax} +@section Video size +Specify the size of the sourced video, it may be a string of the form +@var{width}x@var{height}, or the name of a size abbreviation. + +The following abbreviations are recognized: +@table @samp +@item sqcif +128x96 +@item qcif +176x144 +@item cif +352x288 +@item 4cif +704x576 +@item 16cif +1408x1152 +@item qqvga +160x120 +@item qvga +320x240 +@item vga +640x480 +@item svga +800x600 +@item xga +1024x768 +@item uxga +1600x1200 +@item qxga +2048x1536 +@item sxga +1280x1024 +@item qsxga +2560x2048 +@item hsxga +5120x4096 +@item wvga +852x480 +@item wxga +1366x768 +@item wsxga +1600x1024 +@item wuxga +1920x1200 +@item woxga +2560x1600 +@item wqsxga +3200x2048 +@item wquxga +3840x2400 +@item whsxga +6400x4096 +@item whuxga +7680x4800 +@item cga +320x200 +@item ega +640x350 +@item hd480 +852x480 +@item hd720 +1280x720 +@item hd1080 +1920x1080 +@end table + +@anchor{video rate syntax} +@section Video rate + +Specify the frame rate of a video, expressed as the number of frames +generated per second. It has to be a string in the format +@var{frame_rate_num}/@var{frame_rate_den}, an integer number, a float +number or a valid video frame rate abbreviation. + +The following abbreviations are recognized: +@table @samp +@item ntsc +30000/1001 +@item pal +25/1 +@item qntsc +30000/1 +@item qpal +25/1 +@item sntsc +30000/1 +@item spal +25/1 +@item film +24/1 +@item ntsc-film +24000/1 +@end table + +@anchor{ratio syntax} +@section Ratio + +A ratio can be expressed as an expression, or in the form +@var{numerator}:@var{denominator}. + +Note that a ratio with infinite (1/0) or negative value is +considered valid, so you should check on the returned value if you +want to exclude those values. + +The undefined value can be expressed using the "0:0" string. + +@anchor{color syntax} +@section Color + +It can be the name of a color (case insensitive match) or a +[0x|#]RRGGBB[AA] sequence, possibly followed by "@@" and a string +representing the alpha component. + +The alpha component may be a string composed by "0x" followed by an +hexadecimal number or a decimal number between 0.0 and 1.0, which +represents the opacity value (0x00/0.0 means completely transparent, +0xff/1.0 completely opaque). +If the alpha component is not specified then 0xff is assumed. + +The string "random" will result in a random color. + +@c man end SYNTAX diff --git a/doc/t2h.init b/doc/t2h.init index 78c5177..ec7d2a0 100644 --- a/doc/t2h.init +++ b/doc/t2h.init @@ -1,6 +1,6 @@ # no horiz rules between sections -$end_section = \&Libav_end_section; -sub Libav_end_section($$) +$end_section = \&FFmpeg_end_section; +sub FFmpeg_end_section($$) { } @@ -8,7 +8,7 @@ $EXTRA_HEAD = '<link rel="icon" href="favicon.png" type="image/png" /> '; -$CSS_LINES = $ENV{"LIBAV_CSS"} || <<EOT; +$CSS_LINES = $ENV{"FFMPEG_CSS"} || <<EOT; <style type="text/css"> <!-- .container { @@ -129,7 +129,7 @@ ul.toc { </style> EOT -my $TEMPLATE_HEADER = $ENV{"LIBAV_HEADER"} || <<EOT; +my $TEMPLATE_HEADER = $ENV{"FFMPEG_HEADER"} || <<EOT; <link rel="icon" href="favicon.png" type="image/png" /> </head> <body> @@ -141,8 +141,8 @@ $PRE_BODY_CLOSE = '</div></div>'; $SMALL_RULE = ''; $BODYTEXT = ''; -$print_page_foot = \&Libav_print_page_foot; -sub Libav_print_page_foot($$) +$print_page_foot = \&FFmpeg_print_page_foot; +sub FFmpeg_print_page_foot($$) { my $fh = shift; my $program_string = defined &T2H_DEFAULT_program_string ? @@ -152,9 +152,9 @@ sub Libav_print_page_foot($$) print $fh "</span></footer></div>\n"; } -$float = \&Libav_float; +$float = \&FFmpeg_float; -sub Libav_float($$$$) +sub FFmpeg_float($$$$) { my $text = shift; my $float = shift; @@ -181,8 +181,8 @@ sub Libav_float($$$$) return '<div class="float ' . $class . '">' . "$label\n" . $text . '</div>'; } -$print_page_head = \&Libav_print_page_head; -sub Libav_print_page_head($$) +$print_page_head = \&FFmpeg_print_page_head; +sub FFmpeg_print_page_head($$) { my $fh = shift; my $longtitle = "$Texi2HTML::THISDOC{'title_no_texi'}"; @@ -195,7 +195,7 @@ sub Libav_print_page_head($$) my $encoding = ''; $encoding = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=$ENCODING\">" if (defined($ENCODING) and ($ENCODING ne '')); $longtitle =~ s/Documentation.*//g; - $longtitle = "Libav documentation : " . $longtitle; + $longtitle = "FFmpeg documentation : " . $longtitle; print $fh <<EOT; <!DOCTYPE html> @@ -218,6 +218,9 @@ $TEMPLATE_HEADER EOT } +# declare encoding in header +$IN_ENCODING = $ENCODING = "utf-8"; + # no navigation elements $SECTION_NAVIGATION = 0; # the same for texi2html 5.0 diff --git a/doc/texi2pod.pl b/doc/texi2pod.pl index 94323be..5e8814f 100755 --- a/doc/texi2pod.pl +++ b/doc/texi2pod.pl @@ -1,4 +1,4 @@ -#! /usr/bin/perl -w +#! /usr/bin/perl # Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. @@ -23,6 +23,8 @@ # markup to Perl POD format. It's intended to be used to extract # something suitable for a manpage from a Texinfo document. +use warnings; + $output = 0; $skipping = 0; %sects = (); |