From: Michael Niedermayer Date: Sun, 22 Dec 2013 10:53:41 +0000 (+0100) Subject: Merge commit 'be7c323176e2e5fcf30e3d2ff20975b2f936811b' X-Git-Tag: android-x86-6.0-r1~8167 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=6fe5f770db3ac2a5fb77d2f3bb4eb977be440bbd;p=android-x86%2Fexternal-ffmpeg.git Merge commit 'be7c323176e2e5fcf30e3d2ff20975b2f936811b' * commit 'be7c323176e2e5fcf30e3d2ff20975b2f936811b': Add a libwebp encoder Conflicts: Changelog doc/encoders.texi doc/general.texi libavcodec/version.h libavformat/img2enc.c Merged-by: Michael Niedermayer --- 6fe5f770db3ac2a5fb77d2f3bb4eb977be440bbd diff --cc Changelog index 494feb5b64,efd474a5d8..dd68a01980 --- a/Changelog +++ b/Changelog @@@ -1,235 -1,109 +1,236 @@@ Entries are sorted chronologically from oldest to youngest within each release, releases are sorted from youngest to oldest. -version 10: -- av_strnstr -- support ID3v2 tags in ASF files +version + +- HNM version 4 demuxer and video decoder +- Live HDS muxer +- setsar/setdar filters now support variables in ratio expressions +- elbg filter +- string validation in ffprobe +- support for decoding through VDPAU in ffmpeg (the -hwaccel option) +- complete Voxware MetaSound decoder +- remove mp3_header_compress bitstream filter +- Windows resource files for shared libraries +- aeval filter +- stereoscopic 3d metadata handling ++- WebP encoding via libwebp + + +version 2.1: + +- aecho filter +- perspective filter ported from libmpcodecs +- ffprobe -show_programs option +- compand filter +- RTMP seek support +- when transcoding with ffmpeg (i.e. not streamcopying), -ss is now accurate + even when used as an input option. Previous behavior can be restored with + the -noaccurate_seek option. +- ffmpeg -t option can now be used for inputs, to limit the duration of + data read from an input file +- incomplete Voxware MetaSound decoder +- read EXIF metadata from JPEG +- DVB teletext decoder +- phase filter ported from libmpcodecs +- w3fdif filter +- Opus support in Matroska +- FFV1 version 1.3 is stable and no longer experimental +- FFV1: YUVA(444,422,420) 9, 10 and 16 bit support +- changed DTS stream id in lavf mpeg ps muxer from 0x8a to 0x88, to be + more consistent with other muxers. +- adelay filter +- pullup filter ported from libmpcodecs +- ffprobe -read_intervals option +- Lossless and alpha support for WebP decoder +- Error Resilient AAC syntax (ER AAC LC) decoding +- Low Delay AAC (ER AAC LD) decoding +- mux chapters in ASF files +- SFTP protocol (via libssh) +- libx264: add ability to encode in YUVJ422P and YUVJ444P +- Fraps: use BT.709 colorspace by default for yuv, as reference fraps decoder does +- make decoding alpha optional for prores, ffv1 and vp6 by setting + the skip_alpha flag. +- ladspa wrapper filter +- native VP9 decoder +- dpx parser +- max_error_rate parameter in ffmpeg +- PulseAudio output device +- ReplayGain scanner +- Enhanced Low Delay AAC (ER AAC ELD) decoding (no LD SBR support) +- Linux framebuffer output device +- HEVC decoder +- raw HEVC, HEVC in MOV/MP4, HEVC in Matroska, HEVC in MPEG-TS demuxing +- mergeplanes filter + + +version 2.0: + +- curves filter - reference-counting for AVFrame and AVPacket data -- avconv now fails when input options are used for output file +- ffmpeg now fails when input options are used for output file or vice versa -- avconv options -filter_script and -filter_complex_script, which allow a +- support for Monkey's Audio versions from 3.93 +- perms and aperms filters +- audio filtering support in ffplay +- 10% faster aac encoding on x86 and MIPS +- sine audio filter source +- WebP demuxing and decoding support +- ffmpeg options -filter_script and -filter_complex_script, which allow a filtergraph description to be read from a file +- OpenCL support +- audio phaser filter +- separatefields filter +- libquvi demuxer - uniform options syntax across all filters +- telecine filter - interlace filter -- JPEG 2000 decoder -- asetpts filter (same as setpts, but for audio) +- smptehdbars source +- inverse telecine filters (fieldmatch and decimate) +- colorbalance filter +- colorchannelmixer filter +- The matroska demuxer can now output proper verbatim ASS packets. It will + become the default at the next libavformat major bump. +- decent native animated GIF encoding +- asetrate filter +- interleave filter +- timeline editing with filters +- vidstabdetect and vidstabtransform filters for video stabilization using + the vid.stab library +- astats filter - trim and atrim filters -- avconv -t and -ss (output-only) options are now sample-accurate when +- ffmpeg -t and -ss (output-only) options are now sample-accurate when transcoding audio - Matroska muxer can now put the index at the beginning of the file. -- avconv -deinterlace option removed, the yadif filter should be used instead +- extractplanes filter +- avectorscope filter +- ADPCM DTK decoder +- ADP demuxer +- RSD demuxer +- RedSpark demuxer +- ADPCM IMA Radical decoder +- zmq filters +- DCT denoiser filter (dctdnoiz) +- Wavelet denoiser filter ported from libmpcodecs as owdenoise (formerly "ow") - Apple Intermediate Codec decoder - Escape 130 video decoder +- FTP protocol support +- V4L2 output device +- 3D LUT filter (lut3d) +- SMPTE 302M audio encoder - support for slice multithreading in libavfilter +- Hald CLUT support (generation and filtering) - VC-1 interlaced B-frame support - support for WavPack muxing (raw and in Matroska) +- XVideo output device +- vignette filter +- True Audio (TTA) encoder - Go2Webinar decoder +- mcdeint filter ported from libmpcodecs +- sab filter ported from libmpcodecs +- ffprobe -show_chapters option - WavPack encoding through libwavpack -- Added the -n parameter to avconv -- RTMP seek support -- when transcoding with avconv (i.e. not streamcopying), -ss is now accurate - even when used as an input option. Previous behavior can be restored with - the -noaccurate_seek option. -- avconv -t option can now be used for inputs, to limit the duration of - data read from an input file -- Voxware MetaSound decoder -- WebP decoder -- Error Resilient AAC syntax (ER AAC LC) decoding -- Low Delay AAC (ER AAC LD) decoding -- mux chapters in ASF files -- Opus in Ogg demuxing -- Enhanced Low Delay AAC (ER AAC ELD) decoding (no LD SBR support) -- F4V muxer -- HNM version 4 demuxer and video decoder -- HEVC decoder -- raw HEVC, HEVC in MOV/MP4, HEVC in Matroska, HEVC in MPEG-TS demuxing -- remove avplay -vismv option, which has not worked for a long time -- Live HDS muxer -- setsar/setdar filters now support variables in ratio expressions -- dar variable in the scale filter now returns the actual DAR (i.e. a * sar) -- VP9 decoder -- support for decoding through VDPAU in avconv (the -hwaccel option) -- remove mp3_header_(de)compress bitstream filters -- stereoscopic 3d metadata handling -- png standalone parser -- WebP encoding via libwebp +- rotate filter +- spp filter ported from libmpcodecs +- libgme support +- psnr filter -version 9: -- av_basename and av_dirname -- adobe and limelight publisher authentication in RTMP +version 1.2: + - VDPAU hardware acceleration through normal hwaccel - SRTP support +- Error diffusion dither in Swscale +- Chained Ogg support +- Theora Midstream reconfiguration support +- EVRC decoder +- audio fade filter +- filtering audio with unknown channel layout +- allpass, bass, bandpass, bandreject, biquad, equalizer, highpass, lowpass + and treble audio filter +- improved showspectrum filter, with multichannel support and sox-like colors +- histogram filter +- tee muxer +- il filter ported from libmpcodecs +- support ID3v2 tags in ASF files +- encrypted TTA stream decoding support +- RF64 support in WAV muxer +- noise filter ported from libmpcodecs +- Subtitles character encoding conversion +- blend filter +- stereo3d filter ported from libmpcodecs + +version 1.1: -version 9_beta3: -- ashowinfo audio filter +- stream disposition information printing in ffprobe +- filter for loudness analysis following EBU R128 +- Opus encoder using libopus +- ffprobe -select_streams option +- Pinnacle TARGA CineWave YUV16 decoder +- TAK demuxer, decoder and parser +- DTS-HD demuxer +- remove -same_quant, it hasn't worked for years +- FFM2 support +- X-Face image encoder and decoder - 24-bit FLAC encoding -- audio volume filter -- deprecated the avconv -vol option. the volume filter is to be used instead. - multi-channel ALAC encoding up to 7.1 -- TAK demuxer, parser, and decoder -- adaptive frame-level multithreading for H.264 - - -version 9_beta2: - metadata (INFO tag) support in WAV muxer +- subtitles raw text decoder - support for building DLLs using MSVC -- remove avserver daemon mode +- LVF demuxer +- ffescape tool +- metadata (info chunk) support in CAF muxer +- field filter ported from libmpcodecs +- AVR demuxer +- geq filter ported from libmpcodecs +- remove ffserver daemon mode +- AST muxer/demuxer +- new expansion syntax for drawtext +- BRender PIX image decoder +- ffprobe -show_entries option +- ffprobe -sections option +- ADPCM IMA Dialogic decoder +- BRSTM demuxer +- animated GIF decoder and demuxer +- PVF demuxer +- subtitles filter +- IRCAM muxer/demuxer +- Paris Audio File demuxer +- Virtual concatenation demuxer +- VobSub demuxer +- JSON captions for TED talks decoding support +- SOX Resampler support in libswresample +- aselect filter +- SGI RLE 8-bit decoder +- Silicon Graphics Motion Video Compressor 1 & 2 decoder +- Silicon Graphics Movie demuxer +- apad filter +- Resolution & pixel format change support with multithreading for H.264 +- documentation split into per-component manuals +- pp (postproc) filter ported from MPlayer +- NIST Sphere demuxer +- MPL2, VPlayer, MPlayer, AQTitle, PJS and SubViewer v1 subtitles demuxers and decoders +- Sony Wave64 muxer +- adobe and limelight publisher authentication in RTMP +- data: URI scheme - support building on the Plan 9 operating system -- ffv1: support version 1.3 +- kerndeint filter ported from MPlayer +- histeq filter ported from VirtualDub +- Megalux Frame demuxer +- 012v decoder +- Improved AVC Intra decoding support -version 9_beta1: +version 1.0: -- XWD encoder and decoder -- Support for fragmentation in the mov/mp4 muxer -- ISMV (Smooth Streaming) muxer -- CDXL demuxer and decoder -- Apple ProRes encoder -- Sun Rasterfile Encoder -- remove libpostproc -- ID3v2 attached pictures reading and writing -- WMA Lossless decoder -- XBM encoder -- RealAudio Lossless decoder -- ZeroCodec decoder -- drop support for avconv without libavfilter -- add libavresample audio conversion library -- audio filters support in libavfilter and avconv -- add fps filter -- audio split filter -- audio mix filter -- avprobe output is now standard INI or JSON. The old format can still - be used with -of old. +- INI and flat output in ffprobe +- Scene detection in libavfilter - Indeo Audio decoder - channelsplit audio filter +- setnsamples audio filter +- atempo filter +- ffprobe -show_data option - RTMPT protocol support - iLBC encoding/decoding via libilbc - Microsoft Screen 1 decoder diff --cc configure index 5f0d8b995d,69bdefce1e..c7bb778054 --- a/configure +++ b/configure @@@ -222,25 -193,16 +222,26 @@@ External library support --enable-libopenjpeg enable JPEG 2000 de/encoding via OpenJPEG [no] --enable-libopus enable Opus decoding via libopus [no] --enable-libpulse enable Pulseaudio input via libpulse [no] + --enable-libquvi enable quvi input via libquvi [no] --enable-librtmp enable RTMP[E] support via librtmp [no] --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no] + --enable-libshine enable fixed-point MP3 encoding via libshine [no] + --enable-libsoxr enable Include libsoxr resampling [no] --enable-libspeex enable Speex de/encoding via libspeex [no] + --enable-libssh enable SFTP protocol via libssh [no] + --enable-libstagefright-h264 enable H.264 decoding via libstagefright [no] --enable-libtheora enable Theora encoding via libtheora [no] + --enable-libtwolame enable MP2 encoding via libtwolame [no] + --enable-libutvideo enable Ut Video encoding and decoding via libutvideo [no] + --enable-libv4l2 enable libv4l2/v4l-utils [no] + --enable-libvidstab enable video stabilization using vid.stab [no] --enable-libvo-aacenc enable AAC encoding via libvo-aacenc [no] --enable-libvo-amrwbenc enable AMR-WB encoding via libvo-amrwbenc [no] - --enable-libvorbis enable Vorbis encoding via libvorbis [no] + --enable-libvorbis enable Vorbis en/decoding via libvorbis, + native implementation exists [no] --enable-libvpx enable VP8 and VP9 de/encoding via libvpx [no] --enable-libwavpack enable wavpack encoding via libwavpack [no] + --enable-libwebp enable WebP encoding via libwebp [no] --enable-libx264 enable H.264 encoding via x264 [no] --enable-libxavs enable AVS encoding via xavs [no] --enable-libxvid enable Xvid encoding via xvidcore, @@@ -2145,13 -1869,10 +2147,14 @@@ libvpx_vp8_encoder_deps="libvpx libvpx_vp9_decoder_deps="libvpx" libvpx_vp9_encoder_deps="libvpx" libwavpack_encoder_deps="libwavpack" + libwebp_encoder_deps="libwebp" libx264_encoder_deps="libx264" +libx264rgb_encoder_deps="libx264" libxavs_encoder_deps="libxavs" libxvid_encoder_deps="libxvid" +libutvideo_decoder_deps="libutvideo" +libutvideo_encoder_deps="libutvideo" +libzvbi_teletext_decoder_deps="libzvbi" # demuxers / muxers ac3_demuxer_select="ac3_parser" @@@ -4432,31 -3924,17 +4435,32 @@@ enabled libvorbis && require li enabled libvpx && { enabled libvpx_vp8_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx || die "ERROR: libvpx decoder version must be >=0.9.1"; } - enabled libvpx_vp8_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VPX_CQ" -lvpx || - die "ERROR: libvpx encoder version must be >=0.9.6"; } + enabled libvpx_vp8_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VP8E_SET_MAX_INTRA_BITRATE_PCT" -lvpx || + die "ERROR: libvpx encoder version must be >=0.9.7"; } enabled libvpx_vp9_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp9_dx" -lvpx || disable libvpx_vp9_decoder; } - enabled libvpx_vp9_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx" -lvpx || disable libvpx_vp9_encoder; } } + enabled libvpx_vp9_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx VP9E_SET_SVC" -lvpx || disable libvpx_vp9_encoder; } } enabled libwavpack && require libwavpack wavpack/wavpack.h WavpackOpenFileOutput -lwavpack + enabled libwebp && require_pkg_config libwebp webp/encode.h WebPGetEncoderVersion enabled libx264 && require libx264 x264.h x264_encoder_encode -lx264 && { check_cpp_condition x264.h "X264_BUILD >= 118" || - die "ERROR: libx264 version must be >= 0.118."; } + die "ERROR: libx264 must be installed and version must be >= 0.118."; } enabled libxavs && require libxavs xavs.h xavs_encoder_encode -lxavs enabled libxvid && require libxvid xvid.h xvid_global -lxvidcore +enabled libzmq && require_pkg_config libzmq zmq.h zmq_ctx_new +enabled libzvbi && require libzvbi libzvbi.h vbi_decoder_new -lzvbi +enabled openal && { { for al_libs in "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32"; do + check_lib 'AL/al.h' alGetError "${al_libs}" && break; done } || + die "ERROR: openal not found"; } && + { check_cpp_condition "AL/al.h" "defined(AL_VERSION_1_1)" || + die "ERROR: openal must be installed and version must be 1.1 or compatible"; } +enabled opencl && { check_lib2 OpenCL/cl.h clEnqueueNDRangeKernel -Wl,-framework,OpenCL || + check_lib2 CL/cl.h clEnqueueNDRangeKernel -lOpenCL || + die "ERROR: opencl not found"; } && + { ! enabled_any w32threads os2threads || + die "opencl currently needs --enable-pthreads or --disable-w32threads"; } && + { check_cpp_condition "OpenCL/cl.h" "defined(CL_VERSION_1_2)" || + check_cpp_condition "CL/cl.h" "defined(CL_VERSION_1_2)" || + die "ERROR: opencl must be installed and version must be 1.2 or compatible"; } enabled openssl && { check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto || check_lib openssl/ssl.h SSL_library_init -lssl32 -leay32 || check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 || diff --cc doc/encoders.texi index a93edb4b93,6068662b4c..ea5b3e4165 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@@ -1178,715 -446,246 +1178,777 @@@ Same as 3, but with extra processing en @chapter Video Encoders @c man begin VIDEO ENCODERS +A description of some of the currently available video encoders +follows. + +@section libtheora + +libtheora Theora encoder wrapper. + +Requires the presence of the libtheora headers and library during +configuration. You need to explicitly configure the build with +@code{--enable-libtheora}. + +For more informations about the libtheora project see +@url{http://www.theora.org/}. + +@subsection Options + +The following global options are mapped to internal libtheora options +which affect the quality and the bitrate of the encoded stream. + +@table @option +@item b +Set the video bitrate in bit/s for CBR (Constant Bit Rate) mode. In +case VBR (Variable Bit Rate) mode is enabled this option is ignored. + +@item flags +Used to enable constant quality mode (VBR) encoding through the +@option{qscale} flag, and to enable the @code{pass1} and @code{pass2} +modes. + +@item g +Set the GOP size. + +@item global_quality +Set the global quality as an integer in lambda units. + +Only relevant when VBR mode is enabled with @code{flags +qscale}. The +value is converted to QP units by dividing it by @code{FF_QP2LAMBDA}, +clipped in the [0 - 10] range, and then multiplied by 6.3 to get a +value in the native libtheora range [0-63]. A higher value corresponds +to a higher quality. + +@item q +Enable VBR mode when set to a non-negative value, and set constant +quality value as a double floating point value in QP units. + +The value is clipped in the [0-10] range, and then multiplied by 6.3 +to get a value in the native libtheora range [0-63]. + +This option is valid only using the @command{ffmpeg} command-line +tool. For library interface users, use @option{global_quality}. +@end table + +@subsection Examples + +@itemize +@item +Set maximum constant quality (VBR) encoding with @command{ffmpeg}: +@example +ffmpeg -i INPUT -codec:v libtheora -q:v 10 OUTPUT.ogg +@end example + +@item +Use @command{ffmpeg} to convert a CBR 1000 kbps Theora video stream: +@example +ffmpeg -i INPUT -codec:v libtheora -b:v 1000k OUTPUT.ogg +@end example +@end itemize + +@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 libwebp + + libwebp WebP Image encoder wrapper + + libwebp is Google's official encoder for WebP images. It can encode in either + lossy or lossless mode. Lossy images are essentially a wrapper around a VP8 + frame. Lossless images are a separate codec developed by Google. + + @subsection Pixel Format + + Currently, libwebp only supports YUV420 for lossy and RGB for lossless due + to limitations of the format and libwebp. Alpha is supported for either mode. + Because of API limitations, if RGB is passed in when encoding lossy or YUV is + passed in for encoding lossless, the pixel format will automatically be + converted using functions from libwebp. This is not ideal and is done only for + convenience. + + @subsection Options + + @table @option + + @item -lossless @var{boolean} + Enables/Disables use of lossless mode. Default is 0. + + @item -compression_level @var{integer} + For lossy, this is a quality/speed tradeoff. Higher values give better quality + for a given size at the cost of increased encoding time. For lossless, this is + a size/speed tradeoff. Higher values give smaller size at the cost of increased + encoding time. More specifically, it controls the number of extra algorithms + and compression tools used, and varies the combination of these tools. This + maps to the @var{method} option in libwebp. The valid range is 0 to 6. + Default is 4. + + @item -qscale @var{float} + For lossy encoding, this controls image quality, 0 to 100. For lossless + encoding, this controls the effort and time spent at compressing more. The + default value is 75. Note that for usage via libavcodec, this option is called + @var{global_quality} and must be multiplied by @var{FF_QP2LAMBDA}. + + @item -preset @var{type} + Configuration preset. This does some automatic settings based on the general + type of the image. + @table @option + @item none + Do not use a preset. + @item default + Use the encoder default. + @item picture + Digital picture, like portrait, inner shot + @item photo + Outdoor photograph, with natural lighting + @item drawing + Hand or line drawing, with high-contrast details + @item icon + Small-sized colorful images + @item text + Text-like + @end table + + @end table + @section libx264 -x264 H.264/MPEG-4 AVC encoder wrapper +x264 H.264/MPEG-4 AVC encoder wrapper. -x264 supports an impressive number of features, including 8x8 and 4x4 adaptive -spatial transform, adaptive B-frame placement, CAVLC/CABAC entropy coding, -interlacing (MBAFF), lossless mode, psy optimizations for detail retention -(adaptive quantization, psy-RD, psy-trellis). +This encoder requires the presence of the libx264 headers and library +during configuration. You need to explicitly configure the build with +@code{--enable-libx264}. -The Libav wrapper provides a mapping for most of them using global options -that match those of the encoders and provides private options for the unique -encoder options. Additionally an expert override is provided to directly pass -a list of key=value tuples as accepted by x264_param_parse. +libx264 supports an impressive number of features, including 8x8 and +4x4 adaptive spatial transform, adaptive B-frame placement, CAVLC/CABAC +entropy coding, interlacing (MBAFF), lossless mode, psy optimizations +for detail retention (adaptive quantization, psy-RD, psy-trellis). -@subsection Option Mapping +Many libx264 encoder options are mapped to FFmpeg global codec +options, while unique encoder options are provided through private +options. Additionally the @option{x264opts} and @option{x264-params} +private options allows to pass a list of key=value tuples as accepted +by the libx264 @code{x264_param_parse} function. + +The x264 project website is at +@url{http://www.videolan.org/developers/x264.html}. + +@subsection Options + +The following options are supported by the libx264 wrapper. The +@command{x264}-equivalent options or values are listed in parentheses +for easy migration. + +To reduce the duplication of documentation, only the private options +and some others requiring special attention are documented here. For +the documentation of the undocumented generic options, see +@ref{codec-options,,the Codec Options chapter}. + +To get a more accurate and extensive documentation of the libx264 +options, invoke the command @command{x264 --full-help} or consult +the libx264 documentation. + +@table @option +@item b (@emph{bitrate}) +Set bitrate in bits/s. Note that FFmpeg's @option{b} option is +expressed in bits/s, while @command{x264}'s @option{bitrate} is in +kilobits/s. + +@item bf (@emph{bframes}) + +@item g (@emph{keyint}) + +@item qmax (@emph{qpmax}) + +@item qmin (@emph{qpmin}) + +@item qdiff (@emph{qpstep}) + +@item qblur (@emph{qblur}) + +@item qcomp (@emph{qcomp}) + +@item refs (@emph{ref}) + +@item sc_threshold (@emph{scenecut}) + +@item trellis (@emph{trellis}) + +@item nr (@emph{nr}) + +@item me_range (@emph{merange}) + +@item me_method (@emph{me}) +Set motion estimation method. Possible values in the decreasing order +of speed: + +@table @samp +@item dia (@emph{dia}) +@item epzs (@emph{dia}) +Diamond search with radius 1 (fastest). @samp{epzs} is an alias for +@samp{dia}. +@item hex (@emph{hex}) +Hexagonal search with radius 2. +@item umh (@emph{umh}) +Uneven multi-hexagon search. +@item esa (@emph{esa}) +Exhaustive search. +@item tesa (@emph{tesa}) +Hadamard exhaustive search (slowest). +@end table + +@item subq (@emph{subme}) + +@item b_strategy (@emph{b-adapt}) + +@item keyint_min (@emph{min-keyint}) + +@item coder +Set entropy encoder. Possible values: + +@table @samp +@item ac +Enable CABAC. + +@item vlc +Enable CAVLC and disable CABAC. It generates the same effect as +@command{x264}'s @option{--no-cabac} option. +@end table + +@item cmp +Set full pixel motion estimation comparation algorithm. Possible values: + +@table @samp +@item chroma +Enable chroma in motion estimation. -The following options are supported by the x264 wrapper, the x264-equivalent -options follow the Libav ones. - -@multitable @columnfractions .2 .2 -@item b @tab bitrate -Libav @code{b} option is expressed in bits/s, x264 @code{bitrate} in kilobits/s. -@item bf @tab bframes -Maximum number of B-frames. -@item g @tab keyint -Maximum GOP size. -@item qmin @tab qpmin -@item qmax @tab qpmax -@item qdiff @tab qpstep -@item qblur @tab qblur -@item qcomp @tab qcomp -@item refs @tab ref -@item sc_threshold @tab scenecut -@item trellis @tab trellis -@item nr @tab nr -Noise reduction. -@item me_range @tab merange -@item me_method @tab me -@item subq @tab subme -@item b_strategy @tab b-adapt -@item keyint_min @tab keyint-min -@item coder @tab cabac -Set coder to @code{ac} to use CABAC. -@item cmp @tab chroma-me -Set to @code{chroma} to use chroma motion estimation. -@item threads @tab threads -@item thread_type @tab sliced_threads -Set to @code{slice} to use sliced threading instead of frame threading. -@item flags -cgop @tab open-gop -Set @code{-cgop} to use recovery points to close GOPs. -@item rc_init_occupancy @tab vbv-init -Initial buffer occupancy. -@end multitable - -@subsection Private Options -@table @option -@item -preset @var{string} -Set the encoding preset (cf. x264 --fullhelp). -@item -tune @var{string} -Tune the encoding params (cf. x264 --fullhelp). -@item -profile @var{string} -Set profile restrictions (cf. x264 --fullhelp). -@item -fastfirstpass @var{integer} -Use fast settings when encoding first pass. -@item -crf @var{float} -Select the quality for constant quality mode. -@item -crf_max @var{float} +@item sad +Ignore chroma in motion estimation. It generates the same effect as +@command{x264}'s @option{--no-chroma-me} option. +@end table + +@item threads (@emph{threads}) + +@item thread_type +Set multithreading technique. Possible values: + +@table @samp +@item slice +Slice-based multithreading. It generates the same effect as +@command{x264}'s @option{--sliced-threads} option. +@item frame +Frame-based multithreading. +@end table + +@item flags +Set encoding flags. It can be used to disable closed GOP and enable +open GOP by setting it to @code{-cgop}. The result is similar to +the behavior of @command{x264}'s @option{--open-gop} option. + +@item rc_init_occupancy (@emph{vbv-init}) + +@item preset (@emph{preset}) +Set the encoding preset. + +@item tune (@emph{tune}) +Set tuning of the encoding params. + +@item profile (@emph{profile}) +Set profile restrictions. + +@item fastfirstpass +Enable fast settings when encoding first pass, when set to 1. When set +to 0, it has the same effect of @command{x264}'s +@option{--slow-firstpass} option. + +@item crf (@emph{crf}) +Set the quality for constant quality mode. + +@item crf_max (@emph{crf-max}) In CRF mode, prevents VBV from lowering quality beyond this point. -@item -qp @var{integer} -Constant quantization parameter rate control method. -@item -aq-mode @var{integer} -AQ method -Possible values: +@item qp (@emph{qp}) +Set constant quantization rate control method parameter. + +@item aq-mode (@emph{aq-mode}) +Set AQ method. Possible values: + @table @samp -@item none +@item none (@emph{0}) +Disabled. -@item variance +@item variance (@emph{1}) Variance AQ (complexity mask). -@item autovariance + +@item autovariance (@emph{2}) Auto-variance AQ (experimental). @end table -@item -aq-strength @var{float} -AQ strength, reduces blocking and blurring in flat and textured areas. -@item -psy @var{integer} -Use psychovisual optimizations. -@item -psy-rd @var{string} -Strength of psychovisual optimization, in : format. -@item -rc-lookahead @var{integer} -Number of frames to look ahead for frametype and ratecontrol. -@item -weightb @var{integer} -Weighted prediction for B-frames. -@item -weightp @var{integer} -Weighted prediction analysis method. -Possible values: -@table @samp -@item none +@item aq-strength (@emph{aq-strength}) +Set AQ strength, reduce blocking and blurring in flat and textured areas. -@item simple +@item psy +Use psychovisual optimizations when set to 1. When set to 0, it has the +same effect as @command{x264}'s @option{--no-psy} option. + +@item psy-rd (@emph{psy-rd}) +Set strength of psychovisual optimization, in +@var{psy-rd}:@var{psy-trellis} format. -@item smart +@item rc-lookahead (@emph{rc-lookahead}) +Set number of frames to look ahead for frametype and ratecontrol. +@item weightb +Enable weighted prediction for B-frames when set to 1. When set to 0, +it has the same effect as @command{x264}'s @option{--no-weightb} option. + +@item weightp (@emph{weightp}) +Set weighted prediction method for P-frames. Possible values: + +@table @samp +@item none (@emph{0}) +Disabled +@item simple (@emph{1}) +Enable only weighted refs +@item smart (@emph{2}) +Enable both weighted refs and duplicates @end table -@item -ssim @var{integer} -Calculate and print SSIM stats. -@item -intra-refresh @var{integer} -Use Periodic Intra Refresh instead of IDR frames. -@item -bluray-compat @var{integer} + +@item ssim (@emph{ssim}) +Enable calculation and printing SSIM stats after the encoding. + +@item intra-refresh (@emph{intra-refresh}) +Enable the use of Periodic Intra Refresh instead of IDR frames when set +to 1. + +@item bluray-compat (@emph{bluray-compat}) Configure the encoder to be compatible with the bluray standard. It is a shorthand for setting "bluray-compat=1 force-cfr=1". -@item -b-bias @var{integer} -Influences how often B-frames are used. -@item -b-pyramid @var{integer} -Keep some B-frames as references. -Possible values: -@table @samp -@item none +@item b-bias (@emph{b-bias}) +Set the influence on how often B-frames are used. + +@item b-pyramid (@emph{b-pyramid}) +Set method for keeping of some B-frames as references. Possible values: -@item strict +@table @samp +@item none (@emph{none}) +Disabled. +@item strict (@emph{strict}) Strictly hierarchical pyramid. -@item normal +@item normal (@emph{normal}) Non-strict (not Blu-ray compatible). @end table -@item -mixed-refs @var{integer} -One reference per partition, as opposed to one reference per macroblock. -@item -8x8dct @var{integer} -High profile 8x8 transform. -@item -fast-pskip @var{integer} -@item -aud @var{integer} -Use access unit delimiters. -@item -mbtree @var{integer} -Use macroblock tree ratecontrol. -@item -deblock @var{string} -Loop filter parameters, in form. -@item -cplxblur @var{float} -Reduce fluctuations in QP (before curve compression). -@item -partitions @var{string} -A comma-separated list of partitions to consider, possible values: p8x8, p4x4, b8x8, i8x8, i4x4, none, all. -@item -direct-pred @var{integer} -Direct MV prediction mode +@item mixed-refs +Enable the use of one reference per partition, as opposed to one +reference per macroblock when set to 1. When set to 0, it has the +same effect as @command{x264}'s @option{--no-mixed-refs} option. + +@item 8x8dct +Enable adaptive spatial transform (high profile 8x8 transform) +when set to 1. When set to 0, it has the same effect as +@command{x264}'s @option{--no-8x8dct} option. + +@item fast-pskip +Enable early SKIP detection on P-frames when set to 1. When set +to 0, it has the same effect as @command{x264}'s +@option{--no-fast-pskip} option. + +@item aud (@emph{aud}) +Enable use of access unit delimiters when set to 1. + +@item mbtree +Enable use macroblock tree ratecontrol when set to 1. When set +to 0, it has the same effect as @command{x264}'s +@option{--no-mbtree} option. + +@item deblock (@emph{deblock}) +Set loop filter parameters, in @var{alpha}:@var{beta} form. + +@item cplxblur (@emph{cplxblur}) +Set fluctuations reduction in QP (before curve compression). + +@item partitions (@emph{partitions}) +Set partitions to consider as a comma-separated list of. Possible +values in the list: + +@table @samp +@item p8x8 +8x8 P-frame partition. +@item p4x4 +4x4 P-frame partition. +@item b8x8 +4x4 B-frame partition. +@item i8x8 +8x8 I-frame partition. +@item i4x4 +4x4 I-frame partition. +(Enabling @samp{p4x4} requires @samp{p8x8} to be enabled. Enabling +@samp{i8x8} requires adaptive spatial transform (@option{8x8dct} +option) to be enabled.) +@item none (@emph{none}) +Do not consider any partitions. +@item all (@emph{all}) +Consider every partition. +@end table + +@item direct-pred (@emph{direct}) +Set direct MV prediction mode. Possible values: + +@table @samp +@item none (@emph{none}) +Disable MV prediction. +@item spatial (@emph{spatial}) +Enable spatial predicting. +@item temporal (@emph{temporal}) +Enable temporal predicting. +@item auto (@emph{auto}) +Automatically decided. +@end table + +@item slice-max-size (@emph{slice-max-size}) +Set the limit of the size of each slice in bytes. If not specified +but RTP payload size (@option{ps}) is specified, that is used. + +@item stats (@emph{stats}) +Set the file name for multi-pass stats. + +@item nal-hrd (@emph{nal-hrd}) +Set signal HRD information (requires @option{vbv-bufsize} to be set). Possible values: + @table @samp -@item none +@item none (@emph{none}) +Disable HRD information signaling. +@item vbr (@emph{vbr}) +Variable bit rate. +@item cbr (@emph{cbr}) +Constant bit rate (not allowed in MP4 container). +@end table -@item spatial +@item x264opts (N.A.) +Set any x264 option, see @command{x264 --fullhelp} for a list. -@item temporal +Argument is a list of @var{key}=@var{value} couples separated by +":". In @var{filter} and @var{psy-rd} options that use ":" as a separator +themselves, use "," instead. They accept it as well since long ago but this +is kept undocumented for some reason. -@item auto +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 + +@item x264-params (N.A.) +Override the x264 configuration using a :-separated list of key=value +parameters. + +This option is functionally the same as the @option{x264opts}, but is +duplicated for compability with the Libav fork. +For example to specify libx264 encoding options with @command{ffmpeg}: +@example +ffmpeg -i INPUT -c:v libx264 -x264-params level=30:bframes=0:weightp=0:\ +cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:\ +no-fast-pskip=1:subq=6:8x8dct=0:trellis=0 OUTPUT +@end example @end table -@item -slice-max-size @var{integer} -Limit the size of each slice in bytes. -@item -stats @var{string} -Filename for 2 pass stats. -@item -nal-hrd @var{integer} -Signal HRD information (requires vbv-bufsize; cbr not allowed in .mp4). -Possible values: +Encoding ffpresets for common usages are provided so they can be used with the +general presets system (e.g. passing the @option{pre} option). + +@section libxvid + +Xvid MPEG-4 Part 2 encoder wrapper. + +This encoder requires the presence of the libxvidcore headers and library +during configuration. You need to explicitly configure the build with +@code{--enable-libxvid --enable-gpl}. + +The native @code{mpeg4} encoder supports the MPEG-4 Part 2 format, so +users can encode to this format without this library. + +@subsection Options + +The following options are supported by the libxvid wrapper. Some of +the following options are listed but are not documented, and +correspond to shared codec options. See @ref{codec-options,,the Codec +Options chapter} for their documentation. The other shared options +which are not listed have no effect for the libxvid encoder. + +@table @option +@item b + +@item g + +@item qmin + +@item qmax + +@item mpeg_quant + +@item threads + +@item bf + +@item b_qfactor + +@item b_qoffset + +@item flags +Set specific encoding flags. Possible values: + @table @samp -@item none -@item vbr +@item mv4 +Use four motion vector by macroblock. + +@item aic +Enable high quality AC prediction. + +@item gray +Only encode grayscale. + +@item gmc +Enable the use of global motion compensation (GMC). + +@item qpel +Enable quarter-pixel motion compensation. + +@item cgop +Enable closed GOP. + +@item global_header +Place global headers in extradata instead of every keyframe. + +@end table + +@item trellis + +@item me_method +Set motion estimation method. Possible values in decreasing order of +speed and increasing order of quality: -@item cbr +@table @samp +@item zero +Use no motion estimation (default). + +@item phods +@item x1 +@item log +Enable advanced diamond zonal search for 16x16 blocks and half-pixel +refinement for 16x16 blocks. @samp{x1} and @samp{log} are aliases for +@samp{phods}. + +@item epzs +Enable all of the things described above, plus advanced diamond zonal +search for 8x8 blocks, half-pixel refinement for 8x8 blocks, and motion +estimation on chroma planes. + +@item full +Enable all of the things described above, plus extended 16x16 and 8x8 +blocks search. +@end table + +@item mbd +Set macroblock decision algorithm. Possible values in the increasing +order of quality: + +@table @samp +@item simple +Use macroblock comparing function algorithm (default). +@item bits +Enable rate distortion-based half pixel and quarter pixel refinement for +16x16 blocks. + +@item rd +Enable all of the things described above, plus rate distortion-based +half pixel and quarter pixel refinement for 8x8 blocks, and rate +distortion-based search using square pattern. @end table -@item -x264-params @var{string} -Override the x264 configuration using a :-separated list of key=value parameters. + +@item lumi_aq +Enable lumi masking adaptive quantization when set to 1. Default is 0 +(disabled). + +@item variance_aq +Enable variance adaptive quantization when set to 1. Default is 0 +(disabled). + +When combined with @option{lumi_aq}, the resulting quality will not +be better than any of the two specified individually. In other +words, the resulting quality will be the worse one of the two +effects. + +@item ssim +Set structural similarity (SSIM) displaying method. Possible values: + +@table @samp +@item off +Disable displaying of SSIM information. + +@item avg +Output average SSIM at the end of encoding to stdout. The format of +showing the average SSIM is: + @example --x264-params level=30:bframes=0:weightp=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subq=6:8x8dct=0:trellis=0 +Average SSIM: %f @end example + +For users who are not familiar with C, %f means a float number, or +a decimal (e.g. 0.939232). + +@item frame +Output both per-frame SSIM data during encoding and average SSIM at +the end of encoding to stdout. The format of per-frame information +is: + +@example + SSIM: avg: %1.3f min: %1.3f max: %1.3f +@end example + +For users who are not familiar with C, %1.3f means a float number +rounded to 3 digits after the dot (e.g. 0.932). + @end table -Encoding avpresets for common usages are provided so they can be used with the -general presets system (e.g. passing the @code{-pre} option). +@item ssim_acc +Set SSIM accuracy. Valid options are integers within the range of +0-4, while 0 gives the most accurate result and 4 computes the +fastest. + +@end table + +@section png + +PNG image encoder. + +@subsection Private options + +@table @option +@item dpi @var{integer} +Set physical density of pixels, in dots per inch, unset by default +@item dpm @var{integer} +Set physical density of pixels, in dots per meter, unset by default +@end table @section ProRes diff --cc doc/general.texi index a3221d54fb,a5282804b4..0ac6455979 --- a/doc/general.texi +++ b/doc/general.texi @@@ -491,12 -415,10 +491,12 @@@ 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 WebP @tab @tab X - @tab WebP image format + @item WebP @tab E @tab X + @tab WebP image format, encoding supported through external library libwebp -@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 diff --cc libavcodec/allcodecs.c index 6d084acb64,5a6c914884..ffa828baf0 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@@ -509,17 -437,10 +509,18 @@@ void avcodec_register_all(void REGISTER_ENCDEC (LIBVPX_VP8, libvpx_vp8); REGISTER_ENCDEC (LIBVPX_VP9, libvpx_vp9); REGISTER_ENCODER(LIBWAVPACK, libwavpack); + REGISTER_ENCODER(LIBWEBP, libwebp); REGISTER_ENCODER(LIBX264, libx264); + REGISTER_ENCODER(LIBX264RGB, libx264rgb); REGISTER_ENCODER(LIBXAVS, libxavs); REGISTER_ENCODER(LIBXVID, libxvid); + REGISTER_DECODER(LIBZVBI_TELETEXT, libzvbi_teletext); + REGISTER_ENCODER(LIBAACPLUS, libaacplus); + + /* text */ + REGISTER_DECODER(BINTEXT, bintext); + REGISTER_DECODER(XBIN, xbin); + REGISTER_DECODER(IDF, idf); /* parsers */ REGISTER_PARSER(AAC, aac); diff --cc libavcodec/libwebpenc.c index 0000000000,74e73dc8cb..5e0c7a8236 mode 000000,100644..100644 --- a/libavcodec/libwebpenc.c +++ b/libavcodec/libwebpenc.c @@@ -1,0 -1,287 +1,287 @@@ + /* + * WebP encoding support via libwebp + * Copyright (c) 2013 Justin Ruggles + * - * This file is part of Libav. ++ * This file is part of FFmpeg. + * - * Libav is free software; you can redistribute it and/or ++ * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * - * Libav is distributed in the hope that it will be useful, ++ * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software ++ * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + /** + * @file + * WebP encoder using libwebp + */ + + #include + + #include "libavutil/common.h" + #include "libavutil/frame.h" + #include "libavutil/imgutils.h" + #include "libavutil/opt.h" + #include "avcodec.h" + #include "internal.h" + + typedef struct LibWebPContext { + AVClass *class; // class for AVOptions + float quality; // lossy quality 0 - 100 + int lossless; // use lossless encoding + int preset; // configuration preset + int chroma_warning; // chroma linesize mismatch warning has been printed + int conversion_warning; // pixel format conversion warning has been printed + WebPConfig config; // libwebp configuration + } LibWebPContext; + + static int libwebp_error_to_averror(int err) + { + switch (err) { + case VP8_ENC_ERROR_OUT_OF_MEMORY: + case VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY: + return AVERROR(ENOMEM); + case VP8_ENC_ERROR_NULL_PARAMETER: + case VP8_ENC_ERROR_INVALID_CONFIGURATION: + case VP8_ENC_ERROR_BAD_DIMENSION: + return AVERROR(EINVAL); + } + return AVERROR_UNKNOWN; + } + + static av_cold int libwebp_encode_init(AVCodecContext *avctx) + { + LibWebPContext *s = avctx->priv_data; + int ret; + + if (avctx->global_quality < 0) + avctx->global_quality = 75 * FF_QP2LAMBDA; + s->quality = av_clipf(avctx->global_quality / (float)FF_QP2LAMBDA, + 0.0f, 100.0f); + + if (avctx->compression_level < 0 || avctx->compression_level > 6) { + av_log(avctx, AV_LOG_WARNING, "invalid compression level: %d\n", + avctx->compression_level); + avctx->compression_level = av_clip(avctx->compression_level, 0, 6); + } + + if (s->preset >= WEBP_PRESET_DEFAULT) { + ret = WebPConfigPreset(&s->config, s->preset, s->quality); + if (!ret) + return AVERROR_UNKNOWN; + s->lossless = s->config.lossless; + s->quality = s->config.quality; + avctx->compression_level = s->config.method; + } else { + ret = WebPConfigInit(&s->config); + if (!ret) + return AVERROR_UNKNOWN; + + s->config.lossless = s->lossless; + s->config.quality = s->quality; + s->config.method = avctx->compression_level; + + ret = WebPValidateConfig(&s->config); + if (!ret) + return AVERROR(EINVAL); + } + + av_log(avctx, AV_LOG_DEBUG, "%s - quality=%.1f method=%d\n", + s->lossless ? "Lossless" : "Lossy", s->quality, + avctx->compression_level); + + return 0; + } + + static int libwebp_encode_frame(AVCodecContext *avctx, AVPacket *pkt, + const AVFrame *frame, int *got_packet) + { + LibWebPContext *s = avctx->priv_data; + AVFrame *alt_frame = NULL; + WebPPicture *pic = NULL; + WebPMemoryWriter mw = { 0 }; + int ret; + + if (avctx->width > WEBP_MAX_DIMENSION || avctx->height > WEBP_MAX_DIMENSION) { + av_log(avctx, AV_LOG_ERROR, "Picture size is too large. Max is %dx%d.\n", + WEBP_MAX_DIMENSION, WEBP_MAX_DIMENSION); + return AVERROR(EINVAL); + } + + pic = av_malloc(sizeof(*pic)); + if (!pic) + return AVERROR(ENOMEM); + + ret = WebPPictureInit(pic); + if (!ret) { + ret = AVERROR_UNKNOWN; + goto end; + } + pic->width = avctx->width; + pic->height = avctx->height; + + if (avctx->pix_fmt == AV_PIX_FMT_RGB32) { + if (!s->lossless) { + /* libwebp will automatically convert RGB input to YUV when + encoding lossy. */ + if (!s->conversion_warning) { + av_log(avctx, AV_LOG_WARNING, + "Using libwebp for RGB-to-YUV conversion. You may want " + "to consider passing in YUV instead for lossy " + "encoding.\n"); + s->conversion_warning = 1; + } + } + pic->use_argb = 1; + pic->argb = (uint32_t *)frame->data[0]; + pic->argb_stride = frame->linesize[0] / 4; + } else { + if (frame->linesize[1] != frame->linesize[2]) { + if (!s->chroma_warning) { + av_log(avctx, AV_LOG_WARNING, + "Copying frame due to differing chroma linesizes.\n"); + s->chroma_warning = 1; + } + alt_frame = av_frame_alloc(); + if (!alt_frame) { + ret = AVERROR(ENOMEM); + goto end; + } + alt_frame->width = frame->width; + alt_frame->height = frame->height; + alt_frame->format = frame->format; + ret = av_frame_get_buffer(alt_frame, 32); + if (ret < 0) + goto end; + av_image_copy(alt_frame->data, alt_frame->linesize, + frame->data, frame->linesize, + avctx->pix_fmt, frame->width, frame->height); + frame = alt_frame; + } + pic->use_argb = 0; + pic->y = frame->data[0]; + pic->u = frame->data[1]; + pic->v = frame->data[2]; + pic->y_stride = frame->linesize[0]; + pic->uv_stride = frame->linesize[1]; + if (avctx->pix_fmt == AV_PIX_FMT_YUVA420P) { + pic->colorspace = WEBP_YUV420A; + pic->a = frame->data[3]; + pic->a_stride = frame->linesize[3]; + } else { + pic->colorspace = WEBP_YUV420; + } + + if (s->lossless) { + /* We do not have a way to automatically prioritize RGB over YUV + in automatic pixel format conversion based on whether we're + encoding lossless or lossy, so we do conversion with libwebp as + a convenience. */ + if (!s->conversion_warning) { + av_log(avctx, AV_LOG_WARNING, + "Using libwebp for YUV-to-RGB conversion. You may want " + "to consider passing in RGB instead for lossless " + "encoding.\n"); + s->conversion_warning = 1; + } + + #if (WEBP_ENCODER_ABI_VERSION <= 0x201) + /* libwebp should do the conversion automatically, but there is a + bug that causes it to return an error instead, so a work-around + is required. + See https://code.google.com/p/webp/issues/detail?id=178 */ + pic->memory_ = (void*)1; /* something non-null */ + ret = WebPPictureYUVAToARGB(pic); + if (!ret) { + av_log(avctx, AV_LOG_ERROR, + "WebPPictureYUVAToARGB() failed with error: %d\n", + pic->error_code); + ret = libwebp_error_to_averror(pic->error_code); + goto end; + } + pic->memory_ = NULL; /* restore pointer */ + #endif + } + } + + WebPMemoryWriterInit(&mw); + pic->custom_ptr = &mw; + pic->writer = WebPMemoryWrite; + + ret = WebPEncode(&s->config, pic); + if (!ret) { + av_log(avctx, AV_LOG_ERROR, "WebPEncode() failed with error: %d\n", + pic->error_code); + ret = libwebp_error_to_averror(pic->error_code); + goto end; + } + + ret = ff_alloc_packet(pkt, mw.size); + if (ret < 0) + goto end; + memcpy(pkt->data, mw.mem, mw.size); + + pkt->flags |= AV_PKT_FLAG_KEY; + *got_packet = 1; + + end: + free(mw.mem); /* must use free() according to libwebp documentation */ + WebPPictureFree(pic); + av_freep(&pic); + av_frame_free(&alt_frame); + + return ret; + } + + #define OFFSET(x) offsetof(LibWebPContext, x) + #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM + static const AVOption options[] = { + { "lossless", "Use lossless mode", OFFSET(lossless), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, + { "preset", "Configuration preset", OFFSET(preset), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, WEBP_PRESET_TEXT, VE, "preset" }, + { "none", "do not use a preset", 0, AV_OPT_TYPE_CONST, { .i64 = -1 }, 0, 0, VE, "preset" }, + { "default", "default preset", 0, AV_OPT_TYPE_CONST, { .i64 = WEBP_PRESET_DEFAULT }, 0, 0, VE, "preset" }, + { "picture", "digital picture, like portrait, inner shot", 0, AV_OPT_TYPE_CONST, { .i64 = WEBP_PRESET_PICTURE }, 0, 0, VE, "preset" }, + { "photo", "outdoor photograph, with natural lighting", 0, AV_OPT_TYPE_CONST, { .i64 = WEBP_PRESET_PHOTO }, 0, 0, VE, "preset" }, + { "drawing", "hand or line drawing, with high-contrast details", 0, AV_OPT_TYPE_CONST, { .i64 = WEBP_PRESET_DRAWING }, 0, 0, VE, "preset" }, + { "icon", "small-sized colorful images", 0, AV_OPT_TYPE_CONST, { .i64 = WEBP_PRESET_ICON }, 0, 0, VE, "preset" }, + { "text", "text-like", 0, AV_OPT_TYPE_CONST, { .i64 = WEBP_PRESET_TEXT }, 0, 0, VE, "preset" }, + { NULL }, + }; + + static const AVClass class = { + .class_name = "libwebp", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, + }; + + static const AVCodecDefault libwebp_defaults[] = { + { "compression_level", "4" }, + { "global_quality", "-1" }, + { NULL }, + }; + + AVCodec ff_libwebp_encoder = { + .name = "libwebp", + .long_name = NULL_IF_CONFIG_SMALL("libwebp WebP image"), + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_WEBP, + .priv_data_size = sizeof(LibWebPContext), + .init = libwebp_encode_init, + .encode2 = libwebp_encode_frame, + .pix_fmts = (const enum AVPixelFormat[]) { + AV_PIX_FMT_RGB32, + AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P, + AV_PIX_FMT_NONE + }, + .priv_class = &class, + .defaults = libwebp_defaults, + }; diff --cc libavcodec/version.h index 1993fa60c0,9a43e82d6f..0d75976bd6 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@@ -26,11 -26,9 +26,11 @@@ * Libavcodec version macros. */ +#include "libavutil/avutil.h" + #define LIBAVCODEC_VERSION_MAJOR 55 - #define LIBAVCODEC_VERSION_MINOR 45 - #define LIBAVCODEC_VERSION_MICRO 103 -#define LIBAVCODEC_VERSION_MINOR 31 -#define LIBAVCODEC_VERSION_MICRO 0 ++#define LIBAVCODEC_VERSION_MINOR 46 ++#define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ diff --cc libavformat/img2enc.c index 3529e12c55,4cc5c3feac..f61b0ca30b --- a/libavformat/img2enc.c +++ b/libavformat/img2enc.c @@@ -192,9 -146,9 +192,9 @@@ static const AVClass img2mux_class = AVOutputFormat ff_image2_muxer = { .name = "image2", .long_name = NULL_IF_CONFIG_SMALL("image2 sequence"), - .extensions = "bmp,dpx,jpeg,jpg,ljpg,pam,pbm,pcx,pgm,pgmyuv,png," - "ppm,sgi,tga,tif,tiff,jp2,xwd,sun,ras,rs,im1,im8,im24," - "sunras,webp,xbm", + .extensions = "bmp,dpx,jls,jpeg,jpg,ljpg,pam,pbm,pcx,pgm,pgmyuv,png," + "ppm,sgi,tga,tif,tiff,jp2,j2c,j2k,xwd,sun,ras,rs,im1,im8,im24," - "sunras,xbm,xface", ++ "sunras,webp,xbm,xface", .priv_data_size = sizeof(VideoMuxData), .video_codec = AV_CODEC_ID_MJPEG, .write_header = write_header,