avfilter/vf_v360: do not reset yaw/pitch/roll with reset_rot true master
authorPaul B Mahol <onemda@gmail.com>
Sun, 24 Oct 2021 12:05:28 +0000 (14:05 +0200)
committerPaul B Mahol <onemda@gmail.com>
Sun, 24 Oct 2021 12:08:10 +0000 (14:08 +0200)
557 files changed:
Changelog
README.md
configure
doc/APIchanges
doc/encoders.texi
doc/examples/extract_mvs.c
doc/examples/filtering_audio.c
doc/examples/filtering_video.c
doc/examples/hw_decode.c
doc/examples/muxing.c
doc/examples/qsvdec.c
doc/examples/remuxing.c
doc/filters.texi
doc/general_contents.texi
doc/protocols.texi
fftools/ffmpeg.c
fftools/ffmpeg_opt.c
libavcodec/Makefile
libavcodec/aarch64/h264qpel_neon.S
libavcodec/adts_header.c
libavcodec/adts_header.h
libavcodec/adts_parser.c
libavcodec/aliaspixenc.c
libavcodec/allcodecs.c
libavcodec/amr_parser.c [new file with mode: 0644]
libavcodec/amrnbdec.c
libavcodec/amrwbdec.c
libavcodec/apedec.c
libavcodec/arm/h264qpel_neon.S
libavcodec/atsc_a53.c
libavcodec/audiotoolboxdec.c
libavcodec/av1.h
libavcodec/av1dec.c
libavcodec/av1dec.h
libavcodec/avs3_parser.c
libavcodec/bitpacked.c
libavcodec/bmpenc.c
libavcodec/cbs_av1_syntax_template.c
libavcodec/codec_desc.c
libavcodec/codec_id.h
libavcodec/dnxhdenc.c
libavcodec/dpxenc.c
libavcodec/dxva2_av1.c
libavcodec/extract_extradata_bsf.c
libavcodec/flac_parser.c
libavcodec/gemdec.c [new file with mode: 0644]
libavcodec/h264_picture.c
libavcodec/h264_slice.c
libavcodec/h264dec.c
libavcodec/h274.c
libavcodec/hevc_filter.c
libavcodec/hevc_refs.c
libavcodec/hevc_sei.c
libavcodec/hevcdec.c
libavcodec/hevcdec.h
libavcodec/lagarith.c
libavcodec/libsvtav1.c
libavcodec/libx264.c
libavcodec/magicyuvenc.c
libavcodec/mlpdec.c
libavcodec/mpeg12dec.c
libavcodec/mpegaudiodec_template.c
libavcodec/mpegutils.c
libavcodec/mpegutils.h
libavcodec/mpegvideo.c
libavcodec/parsers.c
libavcodec/proresenc_anatoliy.c
libavcodec/rasc.c
libavcodec/siren.c
libavcodec/snowenc.c
libavcodec/speexdata.h [new file with mode: 0644]
libavcodec/speexdec.c [new file with mode: 0644]
libavcodec/ttadsp.c
libavcodec/utils.c
libavcodec/vaapi_av1.c
libavcodec/vaapi_decode.c
libavcodec/vc1_block.c
libavcodec/vc1_pred.c
libavcodec/vc1_pred.h
libavcodec/version.h
libavcodec/videotoolboxenc.c
libavcodec/wmaprodec.c
libavcodec/zmbvenc.c
libavdevice/caca.c
libavdevice/xv.c
libavfilter/Makefile
libavfilter/aeval.c
libavfilter/af_acontrast.c
libavfilter/af_acrossover.c
libavfilter/af_acrusher.c
libavfilter/af_adeclick.c
libavfilter/af_adecorrelate.c
libavfilter/af_adelay.c
libavfilter/af_adenorm.c
libavfilter/af_aderivative.c
libavfilter/af_aecho.c
libavfilter/af_aemphasis.c
libavfilter/af_aexciter.c
libavfilter/af_afade.c
libavfilter/af_afftdn.c
libavfilter/af_afftfilt.c
libavfilter/af_afir.c
libavfilter/af_aformat.c
libavfilter/af_afreqshift.c
libavfilter/af_afwtdn.c
libavfilter/af_agate.c
libavfilter/af_aiir.c
libavfilter/af_alimiter.c
libavfilter/af_amerge.c
libavfilter/af_amix.c
libavfilter/af_amultiply.c
libavfilter/af_anequalizer.c
libavfilter/af_anlmdn.c
libavfilter/af_anlms.c
libavfilter/af_aphaser.c
libavfilter/af_apsyclip.c
libavfilter/af_apulsator.c
libavfilter/af_aresample.c
libavfilter/af_arnndn.c
libavfilter/af_asdr.c [new file with mode: 0644]
libavfilter/af_asetrate.c
libavfilter/af_asoftclip.c
libavfilter/af_asr.c
libavfilter/af_astats.c
libavfilter/af_asubboost.c
libavfilter/af_asupercut.c
libavfilter/af_atempo.c
libavfilter/af_atilt.c
libavfilter/af_axcorrelate.c
libavfilter/af_biquads.c
libavfilter/af_bs2b.c
libavfilter/af_channelmap.c
libavfilter/af_channelsplit.c
libavfilter/af_chorus.c
libavfilter/af_compand.c
libavfilter/af_compensationdelay.c
libavfilter/af_crossfeed.c
libavfilter/af_crystalizer.c
libavfilter/af_dcshift.c
libavfilter/af_deesser.c
libavfilter/af_drmeter.c
libavfilter/af_dynaudnorm.c
libavfilter/af_earwax.c
libavfilter/af_extrastereo.c
libavfilter/af_firequalizer.c
libavfilter/af_flanger.c
libavfilter/af_haas.c
libavfilter/af_hdcd.c
libavfilter/af_headphone.c
libavfilter/af_join.c
libavfilter/af_ladspa.c
libavfilter/af_loudnorm.c
libavfilter/af_lv2.c
libavfilter/af_mcompand.c
libavfilter/af_pan.c
libavfilter/af_replaygain.c
libavfilter/af_rubberband.c
libavfilter/af_sidechaincompress.c
libavfilter/af_silencedetect.c
libavfilter/af_silenceremove.c
libavfilter/af_sofalizer.c
libavfilter/af_speechnorm.c
libavfilter/af_stereotools.c
libavfilter/af_stereowiden.c
libavfilter/af_superequalizer.c
libavfilter/af_surround.c
libavfilter/af_tremolo.c
libavfilter/af_vibrato.c
libavfilter/af_volume.c
libavfilter/af_volumedetect.c
libavfilter/allfilters.c
libavfilter/asrc_afirsrc.c
libavfilter/asrc_anoisesrc.c
libavfilter/asrc_anullsrc.c
libavfilter/asrc_flite.c
libavfilter/asrc_hilbert.c
libavfilter/asrc_sinc.c
libavfilter/asrc_sine.c
libavfilter/avf_abitscope.c
libavfilter/avf_ahistogram.c
libavfilter/avf_aphasemeter.c
libavfilter/avf_avectorscope.c
libavfilter/avf_concat.c
libavfilter/avf_showcqt.c
libavfilter/avf_showfreqs.c
libavfilter/avf_showspatial.c
libavfilter/avf_showspectrum.c
libavfilter/avf_showvolume.c
libavfilter/avf_showwaves.c
libavfilter/avfilter.c
libavfilter/avfilter.h
libavfilter/avfiltergraph.c
libavfilter/blend.h
libavfilter/blend_modes.c
libavfilter/buffersink.c
libavfilter/buffersrc.c
libavfilter/f_drawgraph.c
libavfilter/f_ebur128.c
libavfilter/f_graphmonitor.c
libavfilter/f_latency.c [new file with mode: 0644]
libavfilter/f_reverse.c
libavfilter/f_select.c
libavfilter/f_streamselect.c
libavfilter/formats.c
libavfilter/formats.h
libavfilter/internal.h
libavfilter/lut3d.h [new file with mode: 0644]
libavfilter/opencl.c
libavfilter/opencl.h
libavfilter/src_movie.c
libavfilter/tests/filtfmts.c
libavfilter/v360.h
libavfilter/vaf_spectrumsynth.c
libavfilter/version.h
libavfilter/vf_alphamerge.c
libavfilter/vf_amplify.c
libavfilter/vf_atadenoise.c
libavfilter/vf_avgblur.c
libavfilter/vf_avgblur_opencl.c
libavfilter/vf_avgblur_vulkan.c
libavfilter/vf_bbox.c
libavfilter/vf_bilateral.c
libavfilter/vf_bitplanenoise.c
libavfilter/vf_blackdetect.c
libavfilter/vf_blackframe.c
libavfilter/vf_blend.c
libavfilter/vf_bm3d.c
libavfilter/vf_boxblur.c
libavfilter/vf_bwdif.c
libavfilter/vf_cas.c
libavfilter/vf_chromaber_vulkan.c
libavfilter/vf_chromakey.c
libavfilter/vf_chromanr.c
libavfilter/vf_chromashift.c
libavfilter/vf_ciescope.c
libavfilter/vf_codecview.c
libavfilter/vf_colorbalance.c
libavfilter/vf_colorchannelmixer.c
libavfilter/vf_colorconstancy.c
libavfilter/vf_colorcontrast.c
libavfilter/vf_colorcorrect.c
libavfilter/vf_colorize.c
libavfilter/vf_colorkey.c
libavfilter/vf_colorkey_opencl.c
libavfilter/vf_colorlevels.c
libavfilter/vf_colormatrix.c
libavfilter/vf_colorspace.c
libavfilter/vf_colortemperature.c
libavfilter/vf_convolution.c
libavfilter/vf_convolution_opencl.c
libavfilter/vf_convolve.c
libavfilter/vf_copy.c
libavfilter/vf_coreimage.m
libavfilter/vf_cover_rect.c
libavfilter/vf_crop.c
libavfilter/vf_cropdetect.c
libavfilter/vf_curves.c
libavfilter/vf_datascope.c
libavfilter/vf_dblur.c
libavfilter/vf_dctdnoiz.c
libavfilter/vf_deband.c
libavfilter/vf_deblock.c
libavfilter/vf_decimate.c
libavfilter/vf_dedot.c
libavfilter/vf_deflicker.c
libavfilter/vf_deinterlace_qsv.c
libavfilter/vf_deinterlace_vaapi.c
libavfilter/vf_delogo.c
libavfilter/vf_derain.c
libavfilter/vf_deshake.c
libavfilter/vf_deshake_opencl.c
libavfilter/vf_despill.c
libavfilter/vf_detelecine.c
libavfilter/vf_displace.c
libavfilter/vf_dnn_classify.c
libavfilter/vf_dnn_detect.c
libavfilter/vf_dnn_processing.c
libavfilter/vf_drawbox.c
libavfilter/vf_drawtext.c
libavfilter/vf_edgedetect.c
libavfilter/vf_elbg.c
libavfilter/vf_entropy.c
libavfilter/vf_epx.c
libavfilter/vf_eq.c
libavfilter/vf_estdif.c
libavfilter/vf_exposure.c
libavfilter/vf_extractplanes.c
libavfilter/vf_fade.c
libavfilter/vf_fftdnoiz.c
libavfilter/vf_fftfilt.c
libavfilter/vf_fieldhint.c
libavfilter/vf_fieldmatch.c
libavfilter/vf_fieldorder.c
libavfilter/vf_fillborders.c
libavfilter/vf_find_rect.c
libavfilter/vf_floodfill.c
libavfilter/vf_format.c
libavfilter/vf_framepack.c
libavfilter/vf_framerate.c
libavfilter/vf_freezedetect.c
libavfilter/vf_frei0r.c
libavfilter/vf_fspp.c
libavfilter/vf_gblur.c
libavfilter/vf_geq.c
libavfilter/vf_gradfun.c
libavfilter/vf_grayworld.c
libavfilter/vf_guided.c
libavfilter/vf_hflip.c
libavfilter/vf_histeq.c
libavfilter/vf_histogram.c
libavfilter/vf_hqdn3d.c
libavfilter/vf_hqx.c
libavfilter/vf_hsvkey.c
libavfilter/vf_hue.c
libavfilter/vf_hwdownload.c
libavfilter/vf_hwmap.c
libavfilter/vf_hwupload.c
libavfilter/vf_hwupload_cuda.c
libavfilter/vf_hysteresis.c
libavfilter/vf_identity.c
libavfilter/vf_idet.c
libavfilter/vf_il.c
libavfilter/vf_kerndeint.c
libavfilter/vf_lagfun.c
libavfilter/vf_lenscorrection.c
libavfilter/vf_lensfun.c
libavfilter/vf_libopencv.c
libavfilter/vf_libvmaf.c
libavfilter/vf_limitdiff.c [new file with mode: 0644]
libavfilter/vf_limiter.c
libavfilter/vf_lumakey.c
libavfilter/vf_lut.c
libavfilter/vf_lut2.c
libavfilter/vf_lut3d.c
libavfilter/vf_maskedclamp.c
libavfilter/vf_maskedmerge.c
libavfilter/vf_maskedminmax.c
libavfilter/vf_maskedthreshold.c
libavfilter/vf_maskfun.c
libavfilter/vf_mcdeint.c
libavfilter/vf_median.c
libavfilter/vf_mergeplanes.c
libavfilter/vf_mestimate.c
libavfilter/vf_midequalizer.c
libavfilter/vf_minterpolate.c
libavfilter/vf_misc_vaapi.c
libavfilter/vf_mix.c
libavfilter/vf_monochrome.c
libavfilter/vf_morpho.c [new file with mode: 0644]
libavfilter/vf_mpdecimate.c
libavfilter/vf_neighbor.c
libavfilter/vf_neighbor_opencl.c
libavfilter/vf_nlmeans.c
libavfilter/vf_nlmeans_opencl.c
libavfilter/vf_nnedi.c
libavfilter/vf_noise.c
libavfilter/vf_normalize.c
libavfilter/vf_ocr.c
libavfilter/vf_overlay.c
libavfilter/vf_overlay_cuda.c
libavfilter/vf_overlay_opencl.c
libavfilter/vf_overlay_qsv.c
libavfilter/vf_overlay_vulkan.c
libavfilter/vf_owdenoise.c
libavfilter/vf_pad.c
libavfilter/vf_pad_opencl.c
libavfilter/vf_palettegen.c
libavfilter/vf_paletteuse.c
libavfilter/vf_perspective.c
libavfilter/vf_phase.c
libavfilter/vf_photosensitivity.c
libavfilter/vf_pp.c
libavfilter/vf_pp7.c
libavfilter/vf_premultiply.c
libavfilter/vf_procamp_vaapi.c
libavfilter/vf_program_opencl.c
libavfilter/vf_pseudocolor.c
libavfilter/vf_psnr.c
libavfilter/vf_pullup.c
libavfilter/vf_readeia608.c
libavfilter/vf_readvitc.c
libavfilter/vf_remap.c
libavfilter/vf_removegrain.c
libavfilter/vf_removelogo.c
libavfilter/vf_repeatfields.c
libavfilter/vf_rotate.c
libavfilter/vf_sab.c
libavfilter/vf_scale.c
libavfilter/vf_scale_cuda.c
libavfilter/vf_scale_npp.c
libavfilter/vf_scale_qsv.c
libavfilter/vf_scale_vaapi.c
libavfilter/vf_scale_vulkan.c
libavfilter/vf_scdet.c
libavfilter/vf_scroll.c
libavfilter/vf_selectivecolor.c
libavfilter/vf_sharpen_npp.c [new file with mode: 0644]
libavfilter/vf_shear.c
libavfilter/vf_showinfo.c
libavfilter/vf_showpalette.c
libavfilter/vf_shufflepixels.c
libavfilter/vf_shuffleplanes.c
libavfilter/vf_signalstats.c
libavfilter/vf_signature.c
libavfilter/vf_smartblur.c
libavfilter/vf_spp.c
libavfilter/vf_sr.c
libavfilter/vf_ssim.c
libavfilter/vf_stack.c
libavfilter/vf_stereo3d.c
libavfilter/vf_subtitles.c
libavfilter/vf_super2xsai.c
libavfilter/vf_swaprect.c
libavfilter/vf_swapuv.c
libavfilter/vf_telecine.c
libavfilter/vf_threshold.c
libavfilter/vf_thumbnail.c
libavfilter/vf_thumbnail_cuda.c
libavfilter/vf_tile.c
libavfilter/vf_tinterlace.c
libavfilter/vf_tmidequalizer.c
libavfilter/vf_tonemap.c
libavfilter/vf_tonemap_opencl.c
libavfilter/vf_tonemap_vaapi.c
libavfilter/vf_tpad.c
libavfilter/vf_transpose.c
libavfilter/vf_transpose_npp.c
libavfilter/vf_transpose_opencl.c
libavfilter/vf_transpose_vaapi.c
libavfilter/vf_unsharp.c
libavfilter/vf_unsharp_opencl.c
libavfilter/vf_untile.c
libavfilter/vf_uspp.c
libavfilter/vf_v360.c
libavfilter/vf_vaguedenoiser.c
libavfilter/vf_varblur.c [new file with mode: 0644]
libavfilter/vf_vectorscope.c
libavfilter/vf_vibrance.c
libavfilter/vf_vidstabdetect.c
libavfilter/vf_vidstabtransform.c
libavfilter/vf_vif.c
libavfilter/vf_vignette.c
libavfilter/vf_vmafmotion.c
libavfilter/vf_vpp_qsv.c
libavfilter/vf_w3fdif.c
libavfilter/vf_waveform.c
libavfilter/vf_weave.c
libavfilter/vf_xbr.c
libavfilter/vf_xfade.c
libavfilter/vf_xfade_opencl.c
libavfilter/vf_xmedian.c
libavfilter/vf_yadif.c
libavfilter/vf_yadif_cuda.c
libavfilter/vf_yaepblur.c
libavfilter/vf_zoompan.c
libavfilter/vf_zscale.c
libavfilter/vidstabutils.c
libavfilter/vidstabutils.h
libavfilter/vsrc_cellauto.c
libavfilter/vsrc_gradients.c
libavfilter/vsrc_life.c
libavfilter/vsrc_mandelbrot.c
libavfilter/vsrc_mptestsrc.c
libavfilter/vsrc_sierpinski.c
libavfilter/vsrc_testsrc.c
libavfilter/vulkan.c
libavfilter/vulkan.h
libavfilter/window_func.h
libavfilter/x86/Makefile
libavfilter/x86/vf_blend_init.c
libavfilter/x86/vf_lut3d.asm [new file with mode: 0644]
libavfilter/x86/vf_lut3d_init.c [new file with mode: 0644]
libavformat/Makefile
libavformat/aacdec.c
libavformat/allformats.c
libavformat/amr.c
libavformat/amvenc.c
libavformat/argo_asf.c
libavformat/argo_asf.h
libavformat/asfdec_f.c
libavformat/asfenc.c
libavformat/avformat.h
libavformat/avidec.c
libavformat/avienc.c
libavformat/avio.h
libavformat/avio_internal.h
libavformat/aviobuf.c
libavformat/dhav.c
libavformat/flacdec.c
libavformat/flacenc.c
libavformat/format.c
libavformat/gxfenc.c
libavformat/hls.c
libavformat/hls_sample_encryption.c [new file with mode: 0644]
libavformat/hls_sample_encryption.h [new file with mode: 0644]
libavformat/hlsenc.c
libavformat/img2.c
libavformat/img2dec.c
libavformat/img2enc.c
libavformat/internal.h
libavformat/isom.c
libavformat/isom.h
libavformat/librist.c
libavformat/libsrt.c
libavformat/lrcenc.c
libavformat/matroskadec.c
libavformat/matroskaenc.c
libavformat/mov.c
libavformat/movenc.c
libavformat/mp3enc.c
libavformat/mpegts.c
libavformat/mpegts.h
libavformat/mpegtsenc.c
libavformat/mux.c
libavformat/mxfenc.c
libavformat/rawenc.c
libavformat/rmdec.c
libavformat/rtpdec_rfc4175.c
libavformat/sccdec.c
libavformat/sccenc.c
libavformat/seek.c
libavformat/subtitles.c
libavformat/tee.c
libavformat/ttaenc.c
libavformat/utils.c
libavformat/version.h
libavformat/wavdec.c
libavformat/webpenc.c
libavformat/westwood_vqa.c
libavutil/detection_bbox.c
libavutil/mathematics.h
libavutil/md5.c
libavutil/utils.c
libpostproc/postprocess_template.c
libswscale/alphablend.c
libswscale/swscale.c
libswscale/swscale_internal.h
libswscale/x86/rgb2rgb.c
libswscale/x86/rgb_2_rgb.asm
tests/checkasm/hevc_pel.c
tests/fate-run.sh
tests/fate/checkasm.mak
tests/fate/cover-art.mak
tests/fate/image.mak
tests/fate/mov.mak
tests/fate/subtitles.mak
tests/ref/acodec/adpcm-argo
tests/ref/fate/aliaspix-bgr
tests/ref/fate/aliaspix-gray
tests/ref/fate/copy-trac3074
tests/ref/fate/cover-art-flac-remux [new file with mode: 0644]
tests/ref/fate/filter-histogram-levels
tests/ref/fate/filter-refcmp-psnr-yuv
tests/ref/fate/mov-mp4-disposition-mpegts-remux [new file with mode: 0644]
tests/ref/fate/sub-lrc-remux [new file with mode: 0644]
tests/ref/fate/sub-scc-remux [new file with mode: 0644]
tools/target_dec_fuzzer.c

index d0b1a97..d806b96 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -20,6 +20,15 @@ version <next>:
 - MSN Siren decoder
 - scharr video filter
 - apsyclip audio filter
+- morpho video filter
+- amr parser
+- (a)latency filters
+- GEM Raster image decoder
+- asdr audio filter
+- speex decoder
+- limitdiff video filter
+- xcorrelate video filter
+- varblur video filter
 
 
 version 4.4:
index 447347c..f8c23f2 100644 (file)
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ such as audio, video, subtitles and related metadata.
 * `libavcodec` provides implementation of a wider range of codecs.
 * `libavformat` implements streaming protocols, container formats and basic I/O access.
 * `libavutil` includes hashers, decompressors and miscellaneous utility functions.
-* `libavfilter` provides a mean to alter decoded Audio and Video through chain of filters.
+* `libavfilter` provides means to alter decoded audio and video through a directed graph of connected filters.
 * `libavdevice` provides an abstraction to access capture and playback devices.
 * `libswresample` implements audio mixing and resampling routines.
 * `libswscale` implements color conversion and scaling routines.
index 231d039..92610c7 100755 (executable)
--- a/configure
+++ b/configure
@@ -1446,9 +1446,11 @@ test_pkg_config(){
     test_cmd $pkg_config --exists --print-errors $pkg_version || return
     pkg_cflags=$($pkg_config --cflags $pkg_config_flags $pkg)
     pkg_libs=$($pkg_config --libs $pkg_config_flags $pkg)
+    pkg_incdir=$($pkg_config --variable=includedir $pkg_config_flags $pkg)
     check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" &&
         enable $name &&
         set_sanitized "${name}_cflags"    $pkg_cflags &&
+        set_sanitized "${name}_incdir"    $pkg_incdir &&
         set_sanitized "${name}_extralibs" $pkg_libs
 }
 
@@ -1466,7 +1468,8 @@ test_pkg_config_cpp(){
     pkg_incdir=$($pkg_config --variable=includedir $pkg_config_flags $pkg)
     test_cpp_condition "$pkg_incdir/$headers" "$cond" "$@" &&
         enable $name &&
-        set_sanitized "${name}_cflags" $pkg_cflags
+        set_sanitized "${name}_cflags" $pkg_cflags &&
+        set_sanitized "${name}_incdir" $pkg_incdir
 }
 
 check_pkg_config(){
@@ -3094,6 +3097,7 @@ thumbnail_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
 transpose_npp_filter_deps="ffnvcodec libnpp"
 overlay_cuda_filter_deps="ffnvcodec"
 overlay_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
+sharpen_npp_filter_deps="ffnvcodec libnpp"
 
 amf_deps_any="libdl LoadLibrary"
 nvenc_deps="ffnvcodec"
@@ -6444,8 +6448,8 @@ enabled libmodplug        && require_pkg_config libmodplug libmodplug libmodplug
 enabled libmp3lame        && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame $libm_extralibs
 enabled libmysofa         && { check_pkg_config libmysofa libmysofa mysofa.h mysofa_neighborhood_init_withstepdefine ||
                                require libmysofa mysofa.h mysofa_neighborhood_init_withstepdefine -lmysofa $zlib_extralibs; }
-enabled libnpp            && { check_lib libnpp npp.h nppGetLibVersion -lnppig -lnppicc -lnppc -lnppidei ||
-                               check_lib libnpp npp.h nppGetLibVersion -lnppi -lnppc -lnppidei ||
+enabled libnpp            && { check_lib libnpp npp.h nppGetLibVersion -lnppig -lnppicc -lnppc -lnppidei -lnppif ||
+                               check_lib libnpp npp.h nppGetLibVersion -lnppi -lnppif -lnppc -lnppidei ||
                                die "ERROR: libnpp not found"; }
 enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
 enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
index 7b267a7..99e185e 100644 (file)
@@ -14,6 +14,15 @@ libavutil:     2021-04-27
 
 API changes, most recent first:
 
+2021-10-18 - xxxxxxxxxx - lavf 59.8.100 - avio.h
+  Introduce public bytes_{read,written} statistic fields to AVIOContext.
+
+2021-10-13 - xxxxxxxxxx - lavf 59.7.100 - avio.h
+  Deprecate AVIOContext.written. Originally added as a private entry in
+  commit 3f75e5116b900f1428aa13041fc7d6301bf1988a, its grouping with
+  the comment noting its private state was missed during merging of the field
+  from Libav (most likely due to an already existing field in between).
+
 2021-09-21 - xxxxxxxxxx - lavu 57.7.100 - pixfmt.h
   Add AV_PIX_FMT_X2BGR10.
 
index 8fccd73..8a7589c 100644 (file)
@@ -1750,12 +1750,30 @@ You need to explicitly configure the build with @code{--enable-libsvtav1}.
 @table @option
 @item profile
 Set the encoding profile.
+@table @samp
+@item main
+@item high
+@item professional
+@end table
 
 @item level
-Set the operating point level.
+Set the operating point level. For example: '4.0'
+
+@item hielevel
+Set the Hierarchical prediction levels.
+@table @samp
+@item 3level
+@item 4level
+This is the default.
+@end table
 
 @item tier
 Set the operating point tier.
+@table @samp
+@item main
+This is the default.
+@item high
+@end table
 
 @item rc
 Set the rate control mode to use.
index 84f0710..cc1311d 100644 (file)
@@ -124,7 +124,7 @@ static int open_codec_context(AVFormatContext *fmt_ctx, enum AVMediaType type)
 int main(int argc, char **argv)
 {
     int ret = 0;
-    AVPacket pkt = { 0 };
+    AVPacket *pkt = NULL;
 
     if (argc != 2) {
         fprintf(stderr, "Usage: %s <video>\n", argv[0]);
@@ -159,13 +159,20 @@ int main(int argc, char **argv)
         goto end;
     }
 
+    pkt = av_packet_alloc();
+    if (!pkt) {
+        fprintf(stderr, "Could not allocate AVPacket\n");
+        ret = AVERROR(ENOMEM);
+        goto end;
+    }
+
     printf("framenum,source,blockw,blockh,srcx,srcy,dstx,dsty,flags\n");
 
     /* read frames from the file */
-    while (av_read_frame(fmt_ctx, &pkt) >= 0) {
-        if (pkt.stream_index == video_stream_idx)
-            ret = decode_packet(&pkt);
-        av_packet_unref(&pkt);
+    while (av_read_frame(fmt_ctx, pkt) >= 0) {
+        if (pkt->stream_index == video_stream_idx)
+            ret = decode_packet(pkt);
+        av_packet_unref(pkt);
         if (ret < 0)
             break;
     }
@@ -177,5 +184,6 @@ end:
     avcodec_free_context(&video_dec_ctx);
     avformat_close_input(&fmt_ctx);
     av_frame_free(&frame);
+    av_packet_free(&pkt);
     return ret < 0;
 }
index 2af73a7..7d0eb19 100644 (file)
@@ -215,12 +215,12 @@ static void print_frame(const AVFrame *frame)
 int main(int argc, char **argv)
 {
     int ret;
-    AVPacket packet;
+    AVPacket *packet = av_packet_alloc();
     AVFrame *frame = av_frame_alloc();
     AVFrame *filt_frame = av_frame_alloc();
 
-    if (!frame || !filt_frame) {
-        perror("Could not allocate frame");
+    if (!packet || !frame || !filt_frame) {
+        fprintf(stderr, "Could not allocate frame or packet\n");
         exit(1);
     }
     if (argc != 2) {
@@ -235,11 +235,11 @@ int main(int argc, char **argv)
 
     /* read all packets */
     while (1) {
-        if ((ret = av_read_frame(fmt_ctx, &packet)) < 0)
+        if ((ret = av_read_frame(fmt_ctx, packet)) < 0)
             break;
 
-        if (packet.stream_index == audio_stream_index) {
-            ret = avcodec_send_packet(dec_ctx, &packet);
+        if (packet->stream_index == audio_stream_index) {
+            ret = avcodec_send_packet(dec_ctx, packet);
             if (ret < 0) {
                 av_log(NULL, AV_LOG_ERROR, "Error while sending a packet to the decoder\n");
                 break;
@@ -275,12 +275,13 @@ int main(int argc, char **argv)
                 }
             }
         }
-        av_packet_unref(&packet);
+        av_packet_unref(packet);
     }
 end:
     avfilter_graph_free(&filter_graph);
     avcodec_free_context(&dec_ctx);
     avformat_close_input(&fmt_ctx);
+    av_packet_free(&packet);
     av_frame_free(&frame);
     av_frame_free(&filt_frame);
 
index 8839453..7b3e16c 100644 (file)
@@ -210,7 +210,7 @@ static void display_frame(const AVFrame *frame, AVRational time_base)
 int main(int argc, char **argv)
 {
     int ret;
-    AVPacket packet;
+    AVPacket *packet;
     AVFrame *frame;
     AVFrame *filt_frame;
 
@@ -221,8 +221,9 @@ int main(int argc, char **argv)
 
     frame = av_frame_alloc();
     filt_frame = av_frame_alloc();
-    if (!frame || !filt_frame) {
-        perror("Could not allocate frame");
+    packet = av_packet_alloc();
+    if (!frame || !filt_frame || !packet) {
+        fprintf(stderr, "Could not allocate frame or packet\n");
         exit(1);
     }
 
@@ -233,11 +234,11 @@ int main(int argc, char **argv)
 
     /* read all packets */
     while (1) {
-        if ((ret = av_read_frame(fmt_ctx, &packet)) < 0)
+        if ((ret = av_read_frame(fmt_ctx, packet)) < 0)
             break;
 
-        if (packet.stream_index == video_stream_index) {
-            ret = avcodec_send_packet(dec_ctx, &packet);
+        if (packet->stream_index == video_stream_index) {
+            ret = avcodec_send_packet(dec_ctx, packet);
             if (ret < 0) {
                 av_log(NULL, AV_LOG_ERROR, "Error while sending a packet to the decoder\n");
                 break;
@@ -273,7 +274,7 @@ int main(int argc, char **argv)
                 av_frame_unref(frame);
             }
         }
-        av_packet_unref(&packet);
+        av_packet_unref(packet);
     }
 end:
     avfilter_graph_free(&filter_graph);
@@ -281,6 +282,7 @@ end:
     avformat_close_input(&fmt_ctx);
     av_frame_free(&frame);
     av_frame_free(&filt_frame);
+    av_packet_free(&packet);
 
     if (ret < 0 && ret != AVERROR_EOF) {
         fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));
index 096a229..0d23f45 100644 (file)
@@ -153,7 +153,7 @@ int main(int argc, char *argv[])
     AVStream *video = NULL;
     AVCodecContext *decoder_ctx = NULL;
     const AVCodec *decoder = NULL;
-    AVPacket packet;
+    AVPacket *packet = NULL;
     enum AVHWDeviceType type;
     int i;
 
@@ -172,6 +172,12 @@ int main(int argc, char *argv[])
         return -1;
     }
 
+    packet = av_packet_alloc();
+    if (!packet) {
+        fprintf(stderr, "Failed to allocate AVPacket\n");
+        return -1;
+    }
+
     /* open the input file */
     if (avformat_open_input(&input_ctx, argv[2], NULL, NULL) != 0) {
         fprintf(stderr, "Cannot open input file '%s'\n", argv[2]);
@@ -227,23 +233,21 @@ int main(int argc, char *argv[])
 
     /* actual decoding and dump the raw data */
     while (ret >= 0) {
-        if ((ret = av_read_frame(input_ctx, &packet)) < 0)
+        if ((ret = av_read_frame(input_ctx, packet)) < 0)
             break;
 
-        if (video_stream == packet.stream_index)
-            ret = decode_write(decoder_ctx, &packet);
+        if (video_stream == packet->stream_index)
+            ret = decode_write(decoder_ctx, packet);
 
-        av_packet_unref(&packet);
+        av_packet_unref(packet);
     }
 
     /* flush the decoder */
-    packet.data = NULL;
-    packet.size = 0;
-    ret = decode_write(decoder_ctx, &packet);
-    av_packet_unref(&packet);
+    ret = decode_write(decoder_ctx, NULL);
 
     if (output_file)
         fclose(output_file);
+    av_packet_free(&packet);
     avcodec_free_context(&decoder_ctx);
     avformat_close_input(&input_ctx);
     av_buffer_unref(&hw_device_ctx);
index abc14a8..8a11e52 100644 (file)
@@ -62,6 +62,8 @@ typedef struct OutputStream {
     AVFrame *frame;
     AVFrame *tmp_frame;
 
+    AVPacket *tmp_pkt;
+
     float t, tincr, tincr2;
 
     struct SwsContext *sws_ctx;
@@ -80,7 +82,7 @@ static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt)
 }
 
 static int write_frame(AVFormatContext *fmt_ctx, AVCodecContext *c,
-                       AVStream *st, AVFrame *frame)
+                       AVStream *st, AVFrame *frame, AVPacket *pkt)
 {
     int ret;
 
@@ -93,9 +95,7 @@ static int write_frame(AVFormatContext *fmt_ctx, AVCodecContext *c,
     }
 
     while (ret >= 0) {
-        AVPacket pkt = { 0 };
-
-        ret = avcodec_receive_packet(c, &pkt);
+        ret = avcodec_receive_packet(c, pkt);
         if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
             break;
         else if (ret < 0) {
@@ -104,13 +104,15 @@ static int write_frame(AVFormatContext *fmt_ctx, AVCodecContext *c,
         }
 
         /* rescale output packet timestamp values from codec to stream timebase */
-        av_packet_rescale_ts(&pkt, c->time_base, st->time_base);
-        pkt.stream_index = st->index;
+        av_packet_rescale_ts(pkt, c->time_base, st->time_base);
+        pkt->stream_index = st->index;
 
         /* Write the compressed frame to the media file. */
-        log_packet(fmt_ctx, &pkt);
-        ret = av_interleaved_write_frame(fmt_ctx, &pkt);
-        av_packet_unref(&pkt);
+        log_packet(fmt_ctx, pkt);
+        ret = av_interleaved_write_frame(fmt_ctx, pkt);
+        /* pkt is now blank (av_interleaved_write_frame() takes ownership of
+         * its contents and resets pkt), so that no unreferencing is necessary.
+         * This would be different if one used av_write_frame(). */
         if (ret < 0) {
             fprintf(stderr, "Error while writing output packet: %s\n", av_err2str(ret));
             exit(1);
@@ -136,6 +138,12 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
         exit(1);
     }
 
+    ost->tmp_pkt = av_packet_alloc();
+    if (!ost->tmp_pkt) {
+        fprintf(stderr, "Could not allocate AVPacket\n");
+        exit(1);
+    }
+
     ost->st = avformat_new_stream(oc, NULL);
     if (!ost->st) {
         fprintf(stderr, "Could not allocate stream\n");
@@ -378,7 +386,7 @@ static int write_audio_frame(AVFormatContext *oc, OutputStream *ost)
         ost->samples_count += dst_nb_samples;
     }
 
-    return write_frame(oc, c, ost->st, frame);
+    return write_frame(oc, c, ost->st, frame, ost->tmp_pkt);
 }
 
 /**************************************************************/
@@ -521,7 +529,7 @@ static AVFrame *get_video_frame(OutputStream *ost)
  */
 static int write_video_frame(AVFormatContext *oc, OutputStream *ost)
 {
-    return write_frame(oc, ost->enc, ost->st, get_video_frame(ost));
+    return write_frame(oc, ost->enc, ost->st, get_video_frame(ost), ost->tmp_pkt);
 }
 
 static void close_stream(AVFormatContext *oc, OutputStream *ost)
@@ -529,6 +537,7 @@ static void close_stream(AVFormatContext *oc, OutputStream *ost)
     avcodec_free_context(&ost->enc);
     av_frame_free(&ost->frame);
     av_frame_free(&ost->tmp_frame);
+    av_packet_free(&ost->tmp_pkt);
     sws_freeContext(ost->sws_ctx);
     swr_free(&ost->swr_ctx);
 }
index 571d868..b662ae9 100644 (file)
@@ -113,7 +113,7 @@ int main(int argc, char **argv)
     AVCodecContext *decoder_ctx = NULL;
     const AVCodec *decoder;
 
-    AVPacket pkt = { 0 };
+    AVPacket *pkt = NULL;
     AVFrame *frame = NULL, *sw_frame = NULL;
 
     AVIOContext *output_ctx = NULL;
@@ -200,27 +200,26 @@ int main(int argc, char **argv)
 
     frame    = av_frame_alloc();
     sw_frame = av_frame_alloc();
-    if (!frame || !sw_frame) {
+    pkt      = av_packet_alloc();
+    if (!frame || !sw_frame || !pkt) {
         ret = AVERROR(ENOMEM);
         goto finish;
     }
 
     /* actual decoding */
     while (ret >= 0) {
-        ret = av_read_frame(input_ctx, &pkt);
+        ret = av_read_frame(input_ctx, pkt);
         if (ret < 0)
             break;
 
-        if (pkt.stream_index == video_st->index)
-            ret = decode_packet(decoder_ctx, frame, sw_frame, &pkt, output_ctx);
+        if (pkt->stream_index == video_st->index)
+            ret = decode_packet(decoder_ctx, frame, sw_frame, pkt, output_ctx);
 
-        av_packet_unref(&pkt);
+        av_packet_unref(pkt);
     }
 
     /* flush the decoder */
-    pkt.data = NULL;
-    pkt.size = 0;
-    ret = decode_packet(decoder_ctx, frame, sw_frame, &pkt, output_ctx);
+    ret = decode_packet(decoder_ctx, frame, sw_frame, NULL, output_ctx);
 
 finish:
     if (ret < 0) {
@@ -233,6 +232,7 @@ finish:
 
     av_frame_free(&frame);
     av_frame_free(&sw_frame);
+    av_packet_free(&pkt);
 
     avcodec_free_context(&decoder_ctx);
 
index fbf6de0..2657f9d 100644 (file)
@@ -47,7 +47,7 @@ int main(int argc, char **argv)
 {
     const AVOutputFormat *ofmt = NULL;
     AVFormatContext *ifmt_ctx = NULL, *ofmt_ctx = NULL;
-    AVPacket pkt;
+    AVPacket *pkt = NULL;
     const char *in_filename, *out_filename;
     int ret, i;
     int stream_index = 0;
@@ -65,6 +65,12 @@ int main(int argc, char **argv)
     in_filename  = argv[1];
     out_filename = argv[2];
 
+    pkt = av_packet_alloc();
+    if (!pkt) {
+        fprintf(stderr, "Could not allocate AVPacket\n");
+        return 1;
+    }
+
     if ((ret = avformat_open_input(&ifmt_ctx, in_filename, 0, 0)) < 0) {
         fprintf(stderr, "Could not open input file '%s'", in_filename);
         goto end;
@@ -140,38 +146,39 @@ int main(int argc, char **argv)
     while (1) {
         AVStream *in_stream, *out_stream;
 
-        ret = av_read_frame(ifmt_ctx, &pkt);
+        ret = av_read_frame(ifmt_ctx, pkt);
         if (ret < 0)
             break;
 
-        in_stream  = ifmt_ctx->streams[pkt.stream_index];
-        if (pkt.stream_index >= stream_mapping_size ||
-            stream_mapping[pkt.stream_index] < 0) {
-            av_packet_unref(&pkt);
+        in_stream  = ifmt_ctx->streams[pkt->stream_index];
+        if (pkt->stream_index >= stream_mapping_size ||
+            stream_mapping[pkt->stream_index] < 0) {
+            av_packet_unref(pkt);
             continue;
         }
 
-        pkt.stream_index = stream_mapping[pkt.stream_index];
-        out_stream = ofmt_ctx->streams[pkt.stream_index];
-        log_packet(ifmt_ctx, &pkt, "in");
+        pkt->stream_index = stream_mapping[pkt->stream_index];
+        out_stream = ofmt_ctx->streams[pkt->stream_index];
+        log_packet(ifmt_ctx, pkt, "in");
 
         /* copy packet */
-        pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
-        pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
-        pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);
-        pkt.pos = -1;
-        log_packet(ofmt_ctx, &pkt, "out");
-
-        ret = av_interleaved_write_frame(ofmt_ctx, &pkt);
+        av_packet_rescale_ts(pkt, in_stream->time_base, out_stream->time_base);
+        pkt->pos = -1;
+        log_packet(ofmt_ctx, pkt, "out");
+
+        ret = av_interleaved_write_frame(ofmt_ctx, pkt);
+        /* pkt is now blank (av_interleaved_write_frame() takes ownership of
+         * its contents and resets pkt), so that no unreferencing is necessary.
+         * This would be different if one used av_write_frame(). */
         if (ret < 0) {
             fprintf(stderr, "Error muxing packet\n");
             break;
         }
-        av_packet_unref(&pkt);
     }
 
     av_write_trailer(ofmt_ctx);
 end:
+    av_packet_free(&pkt);
 
     avformat_close_input(&ifmt_ctx);
 
index 0b7e21f..93eadda 100644 (file)
@@ -1325,7 +1325,32 @@ Set window size. Allowed range is from 16 to 131072.
 Default is @code{4096}
 
 @item win_func
-Set window function. Default is @code{hann}.
+Set window function.
+
+It accepts the following values:
+@table @samp
+@item rect
+@item bartlett
+@item hann, hanning
+@item hamming
+@item blackman
+@item welch
+@item flattop
+@item bharris
+@item bnuttall
+@item bhann
+@item sine
+@item nuttall
+@item lanczos
+@item gauss
+@item tukey
+@item dolph
+@item cauchy
+@item parzen
+@item poisson
+@item bohman
+@end table
+Default is @code{hann}.
 
 @item overlap
 Set window overlap. If set to 1, the recommended overlap for selected
@@ -2531,6 +2556,13 @@ noise removed from input signal.
 
 This filter supports the all above options as @ref{commands}.
 
+@section asdr
+Measure Audio Signal-to-Distortion Ratio.
+
+This filter takes two audio streams for input, and outputs first
+audio stream.
+Results are in dB per channel at end of either input.
+
 @section asetnsamples
 
 Set the number of samples per each output audio frame.
@@ -3129,7 +3161,7 @@ ffmpeg -i INPUT -af atrim=end_sample=1000
 @end itemize
 
 @section axcorrelate
-Calculate normalized cross-correlation between two input audio streams.
+Calculate normalized windowed cross-correlation between two input audio streams.
 
 Resulted samples are always between -1 and 1 inclusive.
 If result is 1 it means two input samples are highly correlated in that selected segment.
@@ -7531,22 +7563,27 @@ of @var{all_mode}. Default value is @code{normal}.
 Available values for component modes are:
 @table @samp
 @item addition
-@item grainmerge
 @item and
 @item average
+@item bleach
 @item burn
 @item darken
 @item difference
-@item grainextract
 @item divide
 @item dodge
-@item freeze
 @item exclusion
 @item extremity
+@item freeze
+@item geometric
 @item glow
+@item grainextract
+@item grainmerge
 @item hardlight
 @item hardmix
+@item hardoverlay
+@item harmonic
 @item heat
+@item interpolate
 @item lighten
 @item linearlight
 @item multiply
@@ -7561,6 +7598,7 @@ Available values for component modes are:
 @item screen
 @item softdifference
 @item softlight
+@item stain
 @item subtract
 @item vividlight
 @item xor
@@ -8153,6 +8191,9 @@ means. For example, some MPEG based codecs export motion vectors through the
 The filter accepts the following option:
 
 @table @option
+@item block
+Display block partition structure using the luma plane.
+
 @item mv
 Set motion vectors to visualize.
 
@@ -10257,6 +10298,7 @@ A number representing position of the first frame with respect to the telecine
 pattern. This is to be used if the stream is cut. The default value is @code{0}.
 @end table
 
+@anchor{dilation}
 @section dilation
 
 Apply dilation effect to the video.
@@ -11577,6 +11619,7 @@ value.
 
 @end table
 
+@anchor{erosion}
 @section erosion
 
 Apply erosion effect to the video.
@@ -11920,6 +11963,10 @@ The width and height of the image.
 
 @item N
 The number of input frame, starting from 0.
+
+@item WS
+@item HS
+The size of FFT array for horizontal and vertical processing.
 @end table
 
 @subsection Examples
@@ -13456,6 +13503,20 @@ Set foreground opacity. Default is @code{0.7}.
 
 @item bgopacity
 Set background opacity. Default is @code{0.5}.
+
+@item colors_mode
+Set colors mode.
+It accepts the following values:
+@table @samp
+@item whiteonblack
+@item blackonwhite
+@item whiteongray
+@item blackongray
+@item coloronblack
+@item coloronwhite
+@item colorongray
+@end table
+Default is @code{whiteonblack}.
 @end table
 
 @subsection Examples
@@ -14445,6 +14506,37 @@ ffmpeg -i main.mpg -i ref.mkv -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[main];
 @end example
 @end itemize
 
+@section limitdiff
+Apply limited difference filter using second and optionally third video stream.
+
+The filter accepts the following options:
+
+@table @option
+@item threshold
+Set the threshold to use when allowing certain differences between video streams.
+Any absolute difference value lower or exact than this threshold will pick pixel components from
+first video stream.
+
+@item elasticity
+Set the elasticity of soft thresholding when processing video streams.
+This value multiplied with first one sets second threshold.
+Any absolute difference value greater or exact than second threshold will pick pixel components
+from second video stream. For values between those two threshold
+linear interpolation between first and second video stream will be used.
+
+@item reference
+Enable the reference (third) video stream processing. By default is disabled.
+If set, this video stream will be used for calculating absolute difference with first video
+stream.
+
+@item planes
+Specify which planes will be processed. Defaults to all available.
+@end table
+
+@subsection Commands
+
+This filter supports the all above options as @ref{commands} except option @samp{reference}.
+
 @section limiter
 
 Limits the pixel components values to the specified range [min, max].
@@ -15352,6 +15444,46 @@ Default value is 0.
 
 This filter supports the all above options as @ref{commands}.
 
+@section morpho
+
+This filter allows to apply main morphological grayscale transforms,
+erode and dilate with arbitrary structures set in second input stream.
+
+Unlike naive implementation and much slower performance in @ref{erosion}
+and @ref{dilation} filters, when speed is critical @code{morpho} filter
+should be used instead.
+
+A description of accepted options follows,
+
+@table @option
+@item mode
+Set morphological transform to apply, can be:
+
+@table @samp
+@item erode
+@item dilate
+@item open
+@item close
+@item gradient
+@item tophat
+@item blackhat
+@end table
+Default is @code{erode}.
+
+@item planes
+Set planes to filter, by default all planes except alpha are filtered.
+
+@item structure
+Set which structure video frames will be processed from second input stream,
+can be @var{first} or @var{all}. Default is @var{all}.
+@end table
+
+The @code{morpho} filter also supports the @ref{framesync} options.
+
+@subsection Commands
+
+This filter supports same @ref{commands} as options.
+
 @section mpdecimate
 
 Drop frames that do not differ greatly from the previous frame in
@@ -16497,6 +16629,9 @@ Compute new histogram for each frame.
 @end table
 
 Default value is @var{full}.
+@item use_alpha
+Create a palette of colors with alpha components.
+Setting this, will automatically disable 'reserve_transparent'.
 @end table
 
 The filter also exports the frame metadata @code{lavfi.color_quant_ratio}
@@ -16575,6 +16710,11 @@ will be treated as completely opaque, and values below this threshold will be
 treated as completely transparent.
 
 The option must be an integer value in the range [0,255]. Default is @var{128}.
+
+@item use_alpha
+Apply the palette by taking alpha values into account. Only useful with
+palettes that are containing multiple colors with alpha components.
+Setting this will automatically disable 'alpha_treshold'.
 @end table
 
 @subsection Examples
@@ -18849,6 +18989,23 @@ Keep the same colorspace property (default).
 @end table
 @end table
 
+@section sharpen_npp
+Use the NVIDIA Performance Primitives (libnpp) to perform image sharpening with
+border control.
+
+The following additional options are accepted:
+@table @option
+
+@item border_type
+Type of sampling to be used ad frame borders. One of the following:
+@table @option
+
+@item replicate
+Replicate pixel values.
+
+@end table
+@end table
+
 @section shear
 Apply shear transform to input video.
 
@@ -21455,6 +21612,9 @@ Set if output video needs to be transposed. Boolean value, by default disabled.
 
 @item alpha_mask
 Build mask in alpha plane for all unmapped pixels by marking them fully transparent. Boolean value, by default disabled.
+
+@item reset_rot
+Reset rotation of output video. Boolean value, by default disabled.
 @end table
 
 @subsection Examples
@@ -21544,6 +21704,27 @@ Threshold used depends also on each decomposition coefficients.
 Default is universal.
 @end table
 
+@section varblur
+Apply variable blur filter by using 2nd video stream to set blur radius.
+The 2nd stream must have the same dimensions.
+
+This filter accepts the following options:
+
+@table @option
+@item min_r
+Set min allowed radius. Allowed range is from 0 to 254. Default is 0.
+@item max_r
+Set max allowed radius. Allowed range is from 1 to 255. Default is 8.
+@item planes
+Set which planes to process. By default, all are used.
+@end table
+
+The @code{varblur} filter also supports the @ref{framesync} options.
+
+@subsection Commands
+
+This filter supports all the above options as @ref{commands}.
+
 @section vectorscope
 
 Display 2 color component values in the two dimensional graph (which is called
@@ -22424,6 +22605,24 @@ Set the scaling dimension: @code{2} for @code{2xBR}, @code{3} for
 Default is @code{3}.
 @end table
 
+@section xcorrelate
+Apply normalized cross-correlation between first and second input video stream.
+
+Second input video stream dimensions must be lower than first input video stream.
+
+The filter accepts the following options:
+
+@table @option
+@item planes
+Set which planes to process.
+
+@item secondary
+Set which secondary video frames will be processed from second input video stream,
+can be @var{first} or @var{all}. Default is @var{all}.
+@end table
+
+The @code{xcorrelate} filter also supports the @ref{framesync} options.
+
 @section xfade
 
 Apply cross fade from one input video stream to another input video stream.
@@ -25753,6 +25952,15 @@ select='if(gt(random(0), 0.2), 1, 2)':n=2 [tmp], boxblur=2:2, [tmp] interleave
 @end example
 @end itemize
 
+@section latency, alatency
+Measure filtering latency.
+
+Report previous filter filtering latency, delay in number of audio samples for audio filters
+or number of video frames for video filters.
+
+On end of input stream, filter will report min and max measured latency for previous running filter
+in filtergraph.
+
 @section metadata, ametadata
 
 Manipulate frame metadata.
@@ -26013,27 +26221,27 @@ The sequential number of the last selected frame. It's NAN if undefined.
 The timebase of the input timestamps.
 
 @item pts
-The PTS (Presentation TimeStamp) of the filtered video frame,
+The PTS (Presentation TimeStamp) of the filtered frame,
 expressed in @var{TB} units. It's NAN if undefined.
 
 @item t
-The PTS of the filtered video frame,
+The PTS of the filtered frame,
 expressed in seconds. It's NAN if undefined.
 
 @item prev_pts
-The PTS of the previously filtered video frame. It's NAN if undefined.
+The PTS of the previously filtered frame. It's NAN if undefined.
 
 @item prev_selected_pts
-The PTS of the last previously filtered video frame. It's NAN if undefined.
+The PTS of the last previously filtered frame. It's NAN if undefined.
 
 @item prev_selected_t
-The PTS of the last previously selected video frame, expressed in seconds. It's NAN if undefined.
+The PTS of the last previously selected frame, expressed in seconds. It's NAN if undefined.
 
 @item start_pts
-The PTS of the first video frame in the video. It's NAN if undefined.
+The first PTS in the stream which is not NAN. It remains NAN if not found.
 
 @item start_t
-The time of the first video frame in the video. It's NAN if undefined.
+The first PTS, in seconds, in the stream which is not NAN. It remains NAN if not found.
 
 @item pict_type @emph{(video only)}
 The type of the filtered frame. It can assume one of the following
index ce5fd46..df1692c 100644 (file)
@@ -741,6 +741,8 @@ following image formats are supported:
     @tab OpenEXR
 @item FITS         @tab X @tab X
     @tab Flexible Image Transport System
+@item IMG          @tab   @tab X
+    @tab GEM Raster image
 @item JPEG         @tab X @tab X
     @tab Progressive JPEG is not supported.
 @item JPEG 2000    @tab X @tab X
@@ -1229,7 +1231,7 @@ following image formats are supported:
 @item GSM Microsoft variant  @tab  E  @tab  X
     @tab encoding supported through external library libgsm
 @item IAC (Indeo Audio Coder)  @tab     @tab  X
-@item iLBC (Internet Low Bitrate Codec) @tab  E  @tab  E
+@item iLBC (Internet Low Bitrate Codec) @tab  E  @tab  EX
     @tab encoding and decoding supported through external library libilbc
 @item IMC (Intel Music Coder)  @tab     @tab  X
 @item Interplay ACM            @tab     @tab  X
@@ -1301,7 +1303,7 @@ following image formats are supported:
     @tab experimental codec
 @item Sonic lossless         @tab  X  @tab  X
     @tab experimental codec
-@item Speex                  @tab  E  @tab  E
+@item Speex                  @tab  E  @tab  EX
     @tab supported through external library libspeex
 @item TAK (Tom's lossless Audio Kompressor)  @tab     @tab  X
 @item True Audio (TTA)       @tab  X  @tab  X
index 726e5f1..c100f23 100644 (file)
@@ -1496,6 +1496,12 @@ when the old encryption key is decommissioned. Default is -1.
 -1 means auto (0x1000 in srt library). The range for
 this option is integers in the 0 - @code{INT_MAX}.
 
+@item snddropdelay=@var{microseconds}
+The sender's extra delay before dropping packets. This delay is
+added to the default drop delay time interval value.
+
+Special value -1: Do not drop packets on the sender at all.
+
 @item payload_size=@var{bytes}
 Sets the maximum declared size of a packet transferred
 during the single call to the sending function in Live
index 98c2421..9d4f9d7 100644 (file)
@@ -871,7 +871,6 @@ static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int u
         main_return_code = 1;
         close_all_output_streams(ost, MUXER_FINISHED | ENCODER_FINISHED, ENCODER_FINISHED);
     }
-    av_packet_unref(pkt);
 }
 
 static void close_output_stream(OutputStream *ost)
@@ -1034,7 +1033,6 @@ static void do_audio_out(OutputFile *of, OutputStream *ost,
         goto error;
 
     while (1) {
-        av_packet_unref(pkt);
         ret = avcodec_receive_packet(enc, pkt);
         if (ret == AVERROR(EAGAIN))
             break;
@@ -1379,7 +1377,6 @@ static void do_video_out(OutputFile *of,
         av_frame_remove_side_data(in_picture, AV_FRAME_DATA_A53_CC);
 
         while (1) {
-            av_packet_unref(pkt);
             ret = avcodec_receive_packet(enc, pkt);
             update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
             if (ret == AVERROR(EAGAIN))
@@ -1536,9 +1533,6 @@ static int reap_filters(int flush)
         if (av_buffersink_get_type(filter) == AVMEDIA_TYPE_AUDIO)
             init_output_stream_wrapper(ost, NULL, 1);
 
-        if (!ost->pkt && !(ost->pkt = av_packet_alloc())) {
-            return AVERROR(ENOMEM);
-        }
         if (!ost->filtered_frame && !(ost->filtered_frame = av_frame_alloc())) {
             return AVERROR(ENOMEM);
         }
@@ -1995,7 +1989,6 @@ static void flush_encoders(void)
 
             update_benchmark(NULL);
 
-            av_packet_unref(pkt);
             while ((ret = avcodec_receive_packet(enc, pkt)) == AVERROR(EAGAIN)) {
                 ret = avcodec_send_frame(enc, NULL);
                 if (ret < 0) {
@@ -2598,8 +2591,6 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output,
     for (i = 0; i < nb_output_streams; i++) {
         OutputStream *ost = output_streams[i];
 
-        if (!ost->pkt && !(ost->pkt = av_packet_alloc()))
-            exit_program(1);
         if (!check_output_constraints(ist, ost) || !ost->encoding_needed
             || ost->enc->type != AVMEDIA_TYPE_SUBTITLE)
             continue;
@@ -2635,11 +2626,7 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo
     int repeating = 0;
     int eof_reached = 0;
 
-    AVPacket *avpkt;
-
-    if (!ist->pkt && !(ist->pkt = av_packet_alloc()))
-        return AVERROR(ENOMEM);
-    avpkt = ist->pkt;
+    AVPacket *avpkt = ist->pkt;
 
     if (!ist->saw_first_ts) {
         ist->first_dts =
@@ -2810,8 +2797,6 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo
     for (i = 0; i < nb_output_streams; i++) {
         OutputStream *ost = output_streams[i];
 
-        if (!ost->pkt && !(ost->pkt = av_packet_alloc()))
-            exit_program(1);
         if (!check_output_constraints(ist, ost) || ost->encoding_needed)
             continue;
 
index 1d6d29c..7aff43d 100644 (file)
@@ -888,6 +888,10 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
             exit_program(1);
         }
 
+        ist->pkt = av_packet_alloc();
+        if (!ist->pkt)
+            exit_program(1);
+
         if (o->bitexact)
             ist->dec_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
 
@@ -1516,6 +1520,10 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
         exit_program(1);
     }
 
+    ost->pkt = av_packet_alloc();
+    if (!ost->pkt)
+        exit_program(1);
+
     if (ost->enc) {
         AVIOContext *s = NULL;
         char *buf = NULL, *arg = NULL, *preset = NULL;
@@ -2205,7 +2213,6 @@ static int open_output_file(OptionsContext *o, const char *filename)
     InputStream  *ist;
     AVDictionary *unused_opts = NULL;
     AVDictionaryEntry *e = NULL;
-    int format_flags = 0;
 
     if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
         o->stop_time = INT64_MAX;
@@ -2250,13 +2257,7 @@ static int open_output_file(OptionsContext *o, const char *filename)
 
     oc->interrupt_callback = int_cb;
 
-    e = av_dict_get(o->g->format_opts, "fflags", NULL, 0);
-    if (e) {
-        const AVOption *o = av_opt_find(oc, "fflags", NULL, 0, 0);
-        av_opt_eval_flags(oc, o, e->value, &format_flags);
-    }
     if (o->bitexact) {
-        format_flags |= AVFMT_FLAG_BITEXACT;
         oc->flags    |= AVFMT_FLAG_BITEXACT;
     }
 
index 8012b69..14fbd2e 100644 (file)
@@ -348,6 +348,7 @@ OBJS-$(CONFIG_G723_1_ENCODER)          += g723_1enc.o g723_1.o \
                                           acelp_vectors.o celp_filters.o celp_math.o
 OBJS-$(CONFIG_G729_DECODER)            += g729dec.o lsp.o celp_math.o celp_filters.o acelp_filters.o acelp_pitch_delay.o acelp_vectors.o g729postfilter.o
 OBJS-$(CONFIG_GDV_DECODER)             += gdv.o
+OBJS-$(CONFIG_GEM_DECODER)             += gemdec.o
 OBJS-$(CONFIG_GIF_DECODER)             += gifdec.o lzw.o
 OBJS-$(CONFIG_GIF_ENCODER)             += gif.o lzwenc.o
 OBJS-$(CONFIG_GREMLIN_DPCM_DECODER)    += dpcm.o
@@ -632,6 +633,7 @@ OBJS-$(CONFIG_SONIC_ENCODER)           += sonic.o
 OBJS-$(CONFIG_SONIC_LS_ENCODER)        += sonic.o
 OBJS-$(CONFIG_SPEEDHQ_DECODER)         += speedhq.o mpeg12.o mpeg12data.o simple_idct.o
 OBJS-$(CONFIG_SPEEDHQ_ENCODER)         += speedhq.o mpeg12data.o mpeg12enc.o speedhqenc.o
+OBJS-$(CONFIG_SPEEX_DECODER)           += speexdec.o
 OBJS-$(CONFIG_SP5X_DECODER)            += sp5xdec.o
 OBJS-$(CONFIG_SRGC_DECODER)            += mscc.o
 OBJS-$(CONFIG_SRT_DECODER)             += srtdec.o ass.o htmlsubtitles.o
@@ -1078,6 +1080,7 @@ OBJS-$(CONFIG_AAC_PARSER)              += aac_parser.o aac_ac3_parser.o \
                                           mpeg4audio.o
 OBJS-$(CONFIG_AC3_PARSER)              += ac3tab.o aac_ac3_parser.o
 OBJS-$(CONFIG_ADX_PARSER)              += adx_parser.o adx.o
+OBJS-$(CONFIG_AMR_PARSER)              += amr_parser.o
 OBJS-$(CONFIG_AV1_PARSER)              += av1_parser.o
 OBJS-$(CONFIG_AVS2_PARSER)             += avs2_parser.o
 OBJS-$(CONFIG_AVS3_PARSER)             += avs3_parser.o
index d27cfac..451fd8a 100644 (file)
   .endif
 .endm
 
+//trashes v0-v4
+.macro  lowpass_8_v     r0,  r1,  r2,  r3,  r4,  r5,  r6,  d0,  d1,  narrow=1
+        uaddl           v2.8H,      \r2\().8B, \r3\().8B
+        uaddl           v0.8H,      \r3\().8B, \r4\().8B
+        uaddl           v4.8H,      \r1\().8B, \r4\().8B
+        uaddl           v1.8H,      \r2\().8B, \r5\().8B
+        uaddl           \d0\().8H,  \r0\().8B, \r5\().8B
+        uaddl           \d1\().8H,  \r1\().8B, \r6\().8B
+        mla             \d0\().8H,  v2.8H,     v6.H[1]
+        mls             \d0\().8H,  v4.8H,     v6.H[0]
+        mla             \d1\().8H,  v0.8H,     v6.H[1]
+        mls             \d1\().8H,  v1.8H,     v6.H[0]
+  .if \narrow
+        sqrshrun        \d0\().8B,  \d0\().8H, #5
+        sqrshrun        \d1\().8B,  \d1\().8H, #5
+  .endif
+.endm
+
 //trashes v0-v5, v7, v30-v31
 .macro  lowpass_8H      r0,  r1
         ext             v0.16B,     \r0\().16B, \r0\().16B, #2
 .endm
 
 // trashed v0-v7
-.macro  lowpass_8.16    r0,  r1,  r2
-        ext             v1.16B,     \r0\().16B, \r1\().16B, #4
-        ext             v0.16B,     \r0\().16B, \r1\().16B, #6
-        saddl           v5.4S,      v1.4H,      v0.4H
-        ext             v2.16B,     \r0\().16B, \r1\().16B, #2
-        saddl2          v1.4S,      v1.8H,      v0.8H
-        ext             v3.16B,     \r0\().16B, \r1\().16B, #8
-        saddl           v6.4S,      v2.4H,      v3.4H
-        ext             \r1\().16B, \r0\().16B, \r1\().16B, #10
-        saddl2          v2.4S,      v2.8H,      v3.8H
-        saddl           v0.4S,      \r0\().4H,  \r1\().4H
-        saddl2          v4.4S,      \r0\().8H,  \r1\().8H
+.macro  lowpass_8.16    r0,  r1,  r2,  r3,  r4,  r5
+        saddl           v5.4S,      \r2\().4H,  \r3\().4H
+        saddl2          v1.4S,      \r2\().8H,  \r3\().8H
+        saddl           v6.4S,      \r1\().4H,  \r4\().4H
+        saddl2          v2.4S,      \r1\().8H,  \r4\().8H
+        saddl           v0.4S,      \r0\().4H,  \r5\().4H
+        saddl2          v4.4S,      \r0\().8H,  \r5\().8H
 
         shl             v3.4S,  v5.4S,  #4
         shl             v5.4S,  v5.4S,  #2
         rshrn           v5.4H,  v5.4S,  #10
         rshrn2          v5.8H,  v1.4S,  #10
 
-        sqxtun          \r2\().8B,  v5.8H
+        sqxtun          \r0\().8B,  v5.8H
 .endm
 
 function put_h264_qpel16_h_lowpass_neon_packed
@@ -169,8 +182,8 @@ function \type\()_h264_qpel8_h_lowpass_neon
         lowpass_8       v28, v29, v16, v17, v28, v16
   .ifc \type,avg
         ld1             {v2.8B},    [x0], x3
-        urhadd          v28.8B, v28.8B,  v2.8B
         ld1             {v3.8B},    [x0]
+        urhadd          v28.8B, v28.8B,  v2.8B
         urhadd          v16.8B, v16.8B, v3.8B
         sub             x0,  x0,  x3
   .endif
@@ -210,8 +223,8 @@ function \type\()_h264_qpel8_h_lowpass_l2_neon
         urhadd          v27.8B, v27.8B, v29.8B
   .ifc \type,avg
         ld1             {v2.8B},      [x0], x2
-        urhadd          v26.8B, v26.8B, v2.8B
         ld1             {v3.8B},      [x0]
+        urhadd          v26.8B, v26.8B, v2.8B
         urhadd          v27.8B, v27.8B, v3.8B
         sub             x0,  x0,  x2
   .endif
@@ -258,43 +271,39 @@ endfunc
 
 function \type\()_h264_qpel8_v_lowpass_neon
         ld1             {v16.8B}, [x1], x3
+        ld1             {v17.8B}, [x1], x3
         ld1             {v18.8B}, [x1], x3
+        ld1             {v19.8B}, [x1], x3
         ld1             {v20.8B}, [x1], x3
+        ld1             {v21.8B}, [x1], x3
         ld1             {v22.8B}, [x1], x3
+        ld1             {v23.8B}, [x1], x3
         ld1             {v24.8B}, [x1], x3
+        ld1             {v25.8B}, [x1], x3
         ld1             {v26.8B}, [x1], x3
-        ld1             {v28.8B}, [x1], x3
-        ld1             {v30.8B}, [x1], x3
-        ld1             {v17.8B}, [x1], x3
-        ld1             {v19.8B}, [x1], x3
-        ld1             {v21.8B}, [x1], x3
-        ld1             {v23.8B}, [x1], x3
-        ld1             {v25.8B}, [x1]
-
-        transpose_8x8B  v16, v18, v20, v22, v24, v26, v28, v30, v0,  v1
-        transpose_8x8B  v17, v19, v21, v23, v25, v27, v29, v31, v0,  v1
-        lowpass_8       v16, v17, v18, v19, v16, v17
-        lowpass_8       v20, v21, v22, v23, v18, v19
-        lowpass_8       v24, v25, v26, v27, v20, v21
-        lowpass_8       v28, v29, v30, v31, v22, v23
-        transpose_8x8B  v16, v17, v18, v19, v20, v21, v22, v23, v0,  v1
+        ld1             {v27.8B}, [x1], x3
+        ld1             {v28.8B}, [x1]
 
+        lowpass_8_v     v16, v17, v18, v19, v20, v21, v22, v16, v17
+        lowpass_8_v     v18, v19, v20, v21, v22, v23, v24, v18, v19
+        lowpass_8_v     v20, v21, v22, v23, v24, v25, v26, v20, v21
+        lowpass_8_v     v22, v23, v24, v25, v26, v27, v28, v22, v23
   .ifc \type,avg
         ld1             {v24.8B},  [x0], x2
-        urhadd          v16.8B, v16.8B, v24.8B
         ld1             {v25.8B}, [x0], x2
-        urhadd          v17.8B, v17.8B, v25.8B
         ld1             {v26.8B}, [x0], x2
-        urhadd          v18.8B, v18.8B, v26.8B
+        urhadd          v16.8B, v16.8B, v24.8B
         ld1             {v27.8B}, [x0], x2
-        urhadd          v19.8B, v19.8B, v27.8B
+        urhadd          v17.8B, v17.8B, v25.8B
         ld1             {v28.8B}, [x0], x2
-        urhadd          v20.8B, v20.8B, v28.8B
+        urhadd          v18.8B, v18.8B, v26.8B
         ld1             {v29.8B}, [x0], x2
-        urhadd          v21.8B, v21.8B, v29.8B
+        urhadd          v19.8B, v19.8B, v27.8B
         ld1             {v30.8B}, [x0], x2
-        urhadd          v22.8B, v22.8B, v30.8B
+        urhadd          v20.8B, v20.8B, v28.8B
         ld1             {v31.8B}, [x0], x2
+        urhadd          v21.8B, v21.8B, v29.8B
+        urhadd          v22.8B, v22.8B, v30.8B
         urhadd          v23.8B, v23.8B, v31.8B
         sub             x0,  x0,  x2,  lsl #3
   .endif
@@ -335,26 +344,23 @@ endfunc
 
 function \type\()_h264_qpel8_v_lowpass_l2_neon
         ld1             {v16.8B}, [x1], x3
+        ld1             {v17.8B}, [x1], x3
         ld1             {v18.8B}, [x1], x3
+        ld1             {v19.8B}, [x1], x3
         ld1             {v20.8B}, [x1], x3
+        ld1             {v21.8B}, [x1], x3
         ld1             {v22.8B}, [x1], x3
+        ld1             {v23.8B}, [x1], x3
         ld1             {v24.8B}, [x1], x3
+        ld1             {v25.8B}, [x1], x3
         ld1             {v26.8B}, [x1], x3
-        ld1             {v28.8B}, [x1], x3
-        ld1             {v30.8B}, [x1], x3
-        ld1             {v17.8B}, [x1], x3
-        ld1             {v19.8B}, [x1], x3
-        ld1             {v21.8B}, [x1], x3
-        ld1             {v23.8B}, [x1], x3
-        ld1             {v25.8B}, [x1]
+        ld1             {v27.8B}, [x1], x3
+        ld1             {v28.8B}, [x1]
 
-        transpose_8x8B  v16, v18, v20, v22, v24, v26, v28, v30, v0,  v1
-        transpose_8x8B  v17, v19, v21, v23, v25, v27, v29, v31, v0,  v1
-        lowpass_8       v16, v17, v18, v19, v16, v17
-        lowpass_8       v20, v21, v22, v23, v18, v19
-        lowpass_8       v24, v25, v26, v27, v20, v21
-        lowpass_8       v28, v29, v30, v31, v22, v23
-        transpose_8x8B  v16, v17, v18, v19, v20, v21, v22, v23, v0,  v1
+        lowpass_8_v     v16, v17, v18, v19, v20, v21, v22, v16, v17
+        lowpass_8_v     v18, v19, v20, v21, v22, v23, v24, v18, v19
+        lowpass_8_v     v20, v21, v22, v23, v24, v25, v26, v20, v21
+        lowpass_8_v     v22, v23, v24, v25, v26, v27, v28, v22, v23
 
         ld1             {v24.8B},  [x12], x2
         ld1             {v25.8B},  [x12], x2
@@ -375,20 +381,20 @@ function \type\()_h264_qpel8_v_lowpass_l2_neon
 
   .ifc \type,avg
         ld1             {v24.8B}, [x0], x3
-        urhadd          v16.8B, v16.8B, v24.8B
         ld1             {v25.8B}, [x0], x3
-        urhadd          v17.8B, v17.8B, v25.8B
         ld1             {v26.8B}, [x0], x3
-        urhadd          v18.8B, v18.8B, v26.8B
+        urhadd          v16.8B, v16.8B, v24.8B
         ld1             {v27.8B}, [x0], x3
-        urhadd          v19.8B, v19.8B, v27.8B
+        urhadd          v17.8B, v17.8B, v25.8B
         ld1             {v28.8B}, [x0], x3
-        urhadd          v20.8B, v20.8B, v28.8B
+        urhadd          v18.8B, v18.8B, v26.8B
         ld1             {v29.8B}, [x0], x3
-        urhadd          v21.8B, v21.8B, v29.8B
+        urhadd          v19.8B, v19.8B, v27.8B
         ld1             {v30.8B}, [x0], x3
-        urhadd          v22.8B, v22.8B, v30.8B
+        urhadd          v20.8B, v20.8B, v28.8B
         ld1             {v31.8B}, [x0], x3
+        urhadd          v21.8B, v21.8B, v29.8B
+        urhadd          v22.8B, v22.8B, v30.8B
         urhadd          v23.8B, v23.8B, v31.8B
         sub             x0,  x0,  x3,  lsl #3
   .endif
@@ -432,22 +438,17 @@ function put_h264_qpel8_hv_lowpass_neon_top
         lowpass_8H      v26, v27
         lowpass_8H      v28, v29
 
-        transpose_8x8H  v16, v17, v18, v19, v20, v21, v22, v23, v0,  v1
-        transpose_8x8H  v24, v25, v26, v27, v28, v29, v30, v31, v0,  v1
+        lowpass_8.16    v16, v17, v18, v19, v20, v21
+        lowpass_8.16    v17, v18, v19, v20, v21, v22
 
-        lowpass_8.16    v16, v24, v16
-        lowpass_8.16    v17, v25, v17
+        lowpass_8.16    v18, v19, v20, v21, v22, v23
+        lowpass_8.16    v19, v20, v21, v22, v23, v24
 
-        lowpass_8.16    v18, v26, v18
-        lowpass_8.16    v19, v27, v19
+        lowpass_8.16    v20, v21, v22, v23, v24, v25
+        lowpass_8.16    v21, v22, v23, v24, v25, v26
 
-        lowpass_8.16    v20, v28, v20
-        lowpass_8.16    v21, v29, v21
-
-        lowpass_8.16    v22, v30, v22
-        lowpass_8.16    v23, v31, v23
-
-        transpose_8x8B v16, v17, v18, v19, v20, v21, v22, v23, v0,  v1
+        lowpass_8.16    v22, v23, v24, v25, v26, v27
+        lowpass_8.16    v23, v24, v25, v26, v27, v28
 
         ret
 endfunc
@@ -458,20 +459,20 @@ function \type\()_h264_qpel8_hv_lowpass_neon
         bl              put_h264_qpel8_hv_lowpass_neon_top
   .ifc \type,avg
         ld1             {v0.8B},      [x0], x2
-        urhadd          v16.8B, v16.8B, v0.8B
         ld1             {v1.8B},      [x0], x2
-        urhadd          v17.8B, v17.8B, v1.8B
         ld1             {v2.8B},      [x0], x2
-        urhadd          v18.8B, v18.8B, v2.8B
+        urhadd          v16.8B, v16.8B, v0.8B
         ld1             {v3.8B},      [x0], x2
-        urhadd          v19.8B, v19.8B, v3.8B
+        urhadd          v17.8B, v17.8B, v1.8B
         ld1             {v4.8B},      [x0], x2
-        urhadd          v20.8B, v20.8B, v4.8B
+        urhadd          v18.8B, v18.8B, v2.8B
         ld1             {v5.8B},      [x0], x2
-        urhadd          v21.8B, v21.8B, v5.8B
+        urhadd          v19.8B, v19.8B, v3.8B
         ld1             {v6.8B},      [x0], x2
-        urhadd          v22.8B, v22.8B, v6.8B
+        urhadd          v20.8B, v20.8B, v4.8B
         ld1             {v7.8B},      [x0], x2
+        urhadd          v21.8B, v21.8B, v5.8B
+        urhadd          v22.8B, v22.8B, v6.8B
         urhadd          v23.8B, v23.8B, v7.8B
         sub             x0,  x0,  x2,  lsl #3
   .endif
@@ -511,20 +512,20 @@ function \type\()_h264_qpel8_hv_lowpass_l2_neon
         urhadd          v7.8B,  v7.8B,  v23.8B
   .ifc \type,avg
         ld1             {v16.8B},     [x0], x3
-        urhadd          v0.8B,  v0.8B,  v16.8B
         ld1             {v17.8B},     [x0], x3
-        urhadd          v1.8B,  v1.8B,  v17.8B
         ld1             {v18.8B},     [x0], x3
-        urhadd          v2.8B,  v2.8B,  v18.8B
+        urhadd          v0.8B,  v0.8B,  v16.8B
         ld1             {v19.8B},     [x0], x3
-        urhadd          v3.8B,  v3.8B,  v19.8B
+        urhadd          v1.8B,  v1.8B,  v17.8B
         ld1             {v20.8B},     [x0], x3
-        urhadd          v4.8B,  v4.8B,  v20.8B
+        urhadd          v2.8B,  v2.8B,  v18.8B
         ld1             {v21.8B},     [x0], x3
-        urhadd          v5.8B,  v5.8B,  v21.8B
+        urhadd          v3.8B,  v3.8B,  v19.8B
         ld1             {v22.8B},     [x0], x3
-        urhadd          v6.8B,  v6.8B,  v22.8B
+        urhadd          v4.8B,  v4.8B,  v20.8B
         ld1             {v23.8B},     [x0], x3
+        urhadd          v5.8B,  v5.8B,  v21.8B
+        urhadd          v6.8B,  v6.8B,  v22.8B
         urhadd          v7.8B,  v7.8B,  v23.8B
         sub             x0,  x0,  x3,  lsl #3
   .endif
index 0889820..e445452 100644 (file)
@@ -66,6 +66,7 @@ int ff_adts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr)
     hdr->sample_rate    = avpriv_mpeg4audio_sample_rates[sr];
     hdr->samples        = (rdb + 1) * 1024;
     hdr->bit_rate       = size * 8 * hdr->sample_rate / hdr->samples;
+    hdr->frame_length   = size;
 
     return size;
 }
index f615f6a..354d07e 100644 (file)
@@ -34,6 +34,7 @@ typedef struct AACADTSHeaderInfo {
     uint8_t  sampling_index;
     uint8_t  chan_config;
     uint8_t  num_aac_frames;
+    uint32_t frame_length;
 } AACADTSHeaderInfo;
 
 /**
@@ -47,4 +48,18 @@ typedef struct AACADTSHeaderInfo {
  */
 int ff_adts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr);
 
+/**
+ * Parse the ADTS frame header contained in the buffer, which is
+ * the first 54 bits.
+ * @param[in]  buf  Pointer to buffer containing the first 54 bits of the frame.
+ * @param[in]  size Size of buffer containing the first 54 bits of the frame.
+ * @param[out] phdr Pointer to pointer to struct AACADTSHeaderInfo for which
+ * memory is allocated and header info is written into it. After using the header
+ * information, the allocated memory must be freed by using av_free.
+ * @return Returns 0 on success, -1 if there is a sync word mismatch,
+ * -2 if the version element is invalid, -3 if the sample rate
+ * element is invalid, or -4 if the bit rate element is invalid.
+ */
+int avpriv_adts_header_parse(AACADTSHeaderInfo **phdr, const uint8_t *buf, size_t size);
+
 #endif /* AVCODEC_ADTS_HEADER_H */
index 5c9f8ff..4a1a8fd 100644 (file)
@@ -42,3 +42,34 @@ int av_adts_header_parse(const uint8_t *buf, uint32_t *samples, uint8_t *frames)
     return AVERROR(ENOSYS);
 #endif
 }
+
+int avpriv_adts_header_parse(AACADTSHeaderInfo **phdr, const uint8_t *buf, size_t size)
+{
+#if CONFIG_ADTS_HEADER
+    int ret = 0;
+    GetBitContext gb;
+
+    if (!phdr || !buf || size < AV_AAC_ADTS_HEADER_SIZE)
+        return AVERROR_INVALIDDATA;
+
+    *phdr = av_mallocz(sizeof(AACADTSHeaderInfo));
+    if (!*phdr)
+        return AVERROR(ENOMEM);
+
+    ret = init_get_bits8(&gb, buf, AV_AAC_ADTS_HEADER_SIZE);
+    if (ret < 0) {
+        av_freep(phdr);
+        return ret;
+    }
+
+    ret = ff_adts_header_parse(&gb, *phdr);
+    if (ret < 0) {
+        av_freep(phdr);
+        return ret;
+    }
+
+    return 0;
+#else
+    return AVERROR(ENOSYS);
+#endif
+}
index 01461c9..fa273df 100644 (file)
@@ -31,8 +31,8 @@
 static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
                         const AVFrame *frame, int *got_packet)
 {
-    int width, height, bits_pixel, i, j, length, ret;
-    uint8_t *in_buf, *buf;
+    int width, height, bits_pixel, length, ret;
+    uint8_t *buf;
 
     width  = avctx->width;
     height = avctx->height;
@@ -66,15 +66,16 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     bytestream_put_be32(&buf, 0); /* X, Y offset */
     bytestream_put_be16(&buf, bits_pixel);
 
-    for (j = 0; j < height; j++) {
-        in_buf = frame->data[0] + frame->linesize[0] * j;
-        for (i = 0; i < width; ) {
+    for (int j = 0, bytes_pixel = bits_pixel >> 3; j < height; j++) {
+        const uint8_t *in_buf = frame->data[0] + frame->linesize[0] * j;
+        const uint8_t *const line_end = in_buf + bytes_pixel * width;
+        while (in_buf < line_end) {
             int count = 0;
             int pixel;
 
             if (avctx->pix_fmt == AV_PIX_FMT_GRAY8) {
                 pixel = *in_buf;
-                while (count < 255 && count + i < width && pixel == *in_buf) {
+                while (count < 255 && in_buf < line_end && pixel == *in_buf) {
                     count++;
                     in_buf++;
                 }
@@ -82,7 +83,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
                 bytestream_put_byte(&buf, pixel);
             } else { /* AV_PIX_FMT_BGR24 */
                 pixel = AV_RB24(in_buf);
-                while (count < 255 && count + i < width &&
+                while (count < 255 && in_buf < line_end &&
                        pixel == AV_RB24(in_buf)) {
                     count++;
                     in_buf += 3;
@@ -90,7 +91,6 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
                 bytestream_put_byte(&buf, count);
                 bytestream_put_be24(&buf, pixel);
             }
-            i += count;
         }
     }
 
index c42aba1..9ede09b 100644 (file)
@@ -134,6 +134,7 @@ extern const AVCodec ff_fraps_decoder;
 extern const AVCodec ff_frwu_decoder;
 extern const AVCodec ff_g2m_decoder;
 extern const AVCodec ff_gdv_decoder;
+extern const AVCodec ff_gem_decoder;
 extern const AVCodec ff_gif_encoder;
 extern const AVCodec ff_gif_decoder;
 extern const AVCodec ff_h261_encoder;
@@ -307,6 +308,7 @@ extern const AVCodec ff_snow_decoder;
 extern const AVCodec ff_sp5x_decoder;
 extern const AVCodec ff_speedhq_decoder;
 extern const AVCodec ff_speedhq_encoder;
+extern const AVCodec ff_speex_decoder;
 extern const AVCodec ff_srgc_decoder;
 extern const AVCodec ff_sunrast_encoder;
 extern const AVCodec ff_sunrast_decoder;
diff --git a/libavcodec/amr_parser.c b/libavcodec/amr_parser.c
new file mode 100644 (file)
index 0000000..c0b1470
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2021 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * AMR audio parser
+ *
+ * Splits packets into individual blocks.
+ */
+
+#include "libavutil/channel_layout.h"
+#include "libavutil/intreadwrite.h"
+#include "parser.h"
+
+static const uint8_t amrnb_packed_size[16] = {
+    13, 14, 16, 18, 20, 21, 27, 32, 6, 1, 1, 1, 1, 1, 1, 1
+};
+static const uint8_t amrwb_packed_size[16] = {
+    18, 24, 33, 37, 41, 47, 51, 59, 61, 6, 1, 1, 1, 1, 1, 1
+};
+
+typedef struct AMRParseContext {
+    ParseContext pc;
+    uint64_t cumulated_size;
+    uint64_t block_count;
+    int current_channel;
+    int remaining;
+} AMRParseContext;
+
+static av_cold int amr_parse_init(AVCodecParserContext *s1)
+{
+    AMRParseContext *s = s1->priv_data;
+    s->remaining = -1;
+    return 0;
+}
+
+static int amr_parse(AVCodecParserContext *s1,
+                     AVCodecContext *avctx,
+                     const uint8_t **poutbuf, int *poutbuf_size,
+                     const uint8_t *buf, int buf_size)
+{
+    AMRParseContext *s = s1->priv_data;
+    ParseContext *pc = &s->pc;
+    int next = END_NOT_FOUND;
+
+    *poutbuf_size = 0;
+    *poutbuf = NULL;
+
+    if (!avctx->channels) {
+        avctx->channels       = 1;
+        avctx->channel_layout = AV_CH_LAYOUT_MONO;
+    }
+
+    if (s1->flags & PARSER_FLAG_COMPLETE_FRAMES) {
+        next = buf_size;
+    } else {
+        int ch, offset = 0;
+
+        for (ch = s->current_channel; ch < avctx->channels; ch++) {
+            if (s->remaining >= 0) {
+                next = s->remaining;
+            } else {
+                int mode = (buf[offset] >> 3) & 0x0F;
+
+                if (avctx->codec_id == AV_CODEC_ID_AMR_NB) {
+                    next = amrnb_packed_size[mode];
+                } else if (avctx->codec_id == AV_CODEC_ID_AMR_WB) {
+                    next = amrwb_packed_size[mode];
+                }
+            }
+
+            offset += next;
+            if (offset >= buf_size) {
+                s->remaining = offset - buf_size;
+                next = END_NOT_FOUND;
+                break;
+            } else {
+                s->remaining = -1;
+            }
+        }
+
+        s->current_channel = ch % avctx->channels;
+        if (s->remaining < 0)
+            next = offset;
+
+        if (next != END_NOT_FOUND) {
+            if (s->cumulated_size < UINT64_MAX - next) {
+                s->cumulated_size += next;
+                /* Both AMR formats have 50 frames per second */
+                avctx->bit_rate = s->cumulated_size / ++s->block_count * 8 * 50;
+            }
+        }
+
+        if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) {
+            *poutbuf      = NULL;
+            *poutbuf_size = 0;
+            return buf_size;
+        }
+    }
+
+    s1->duration = avctx->codec_id == AV_CODEC_ID_AMR_NB ? 160 : 320;
+
+    *poutbuf = buf;
+    *poutbuf_size = buf_size;
+    return next;
+}
+
+const AVCodecParser ff_amr_parser = {
+    .codec_ids      = { AV_CODEC_ID_AMR_NB, AV_CODEC_ID_AMR_WB },
+    .priv_data_size = sizeof(AMRParseContext),
+    .parser_init    = amr_parse_init,
+    .parser_parse   = amr_parse,
+    .parser_close   = ff_parse_close,
+};
index e366a09..d8e0370 100644 (file)
@@ -145,6 +145,10 @@ typedef struct AMRContext {
 
 } AMRContext;
 
+typedef struct AMRChannelsContext {
+    AMRContext ch[2];
+} AMRChannelsContext;
+
 /** Double version of ff_weighted_vector_sumf() */
 static void weighted_vector_sumd(double *out, const double *in_a,
                                  const double *in_b, double weight_coeff_a,
@@ -159,35 +163,40 @@ static void weighted_vector_sumd(double *out, const double *in_a,
 
 static av_cold int amrnb_decode_init(AVCodecContext *avctx)
 {
-    AMRContext *p = avctx->priv_data;
+    AMRChannelsContext *s = avctx->priv_data;
     int i;
 
-    if (avctx->channels > 1) {
-        avpriv_report_missing_feature(avctx, "multi-channel AMR");
+    if (avctx->channels > 2) {
+        avpriv_report_missing_feature(avctx, ">2 channel AMR");
         return AVERROR_PATCHWELCOME;
     }
 
-    avctx->channels       = 1;
-    avctx->channel_layout = AV_CH_LAYOUT_MONO;
+    if (!avctx->channels) {
+        avctx->channels       = 1;
+        avctx->channel_layout = AV_CH_LAYOUT_MONO;
+    }
     if (!avctx->sample_rate)
         avctx->sample_rate = 8000;
-    avctx->sample_fmt     = AV_SAMPLE_FMT_FLT;
+    avctx->sample_fmt     = AV_SAMPLE_FMT_FLTP;
 
-    // p->excitation always points to the same position in p->excitation_buf
-    p->excitation = &p->excitation_buf[PITCH_DELAY_MAX + LP_FILTER_ORDER + 1];
+    for (int ch = 0; ch < avctx->channels; ch++) {
+        AMRContext *p = &s->ch[ch];
+        // p->excitation always points to the same position in p->excitation_buf
+        p->excitation = &p->excitation_buf[PITCH_DELAY_MAX + LP_FILTER_ORDER + 1];
 
-    for (i = 0; i < LP_FILTER_ORDER; i++) {
-        p->prev_lsp_sub4[i] =    lsp_sub4_init[i] * 1000 / (float)(1 << 15);
-        p->lsf_avg[i] = p->lsf_q[3][i] = lsp_avg_init[i] / (float)(1 << 15);
-    }
+        for (i = 0; i < LP_FILTER_ORDER; i++) {
+            p->prev_lsp_sub4[i] =    lsp_sub4_init[i] * 1000 / (float)(1 << 15);
+            p->lsf_avg[i] = p->lsf_q[3][i] = lsp_avg_init[i] / (float)(1 << 15);
+        }
 
-    for (i = 0; i < 4; i++)
-        p->prediction_error[i] = MIN_ENERGY;
+        for (i = 0; i < 4; i++)
+            p->prediction_error[i] = MIN_ENERGY;
 
-    ff_acelp_filter_init(&p->acelpf_ctx);
-    ff_acelp_vectors_init(&p->acelpv_ctx);
-    ff_celp_filter_init(&p->celpf_ctx);
-    ff_celp_math_init(&p->celpm_ctx);
+        ff_acelp_filter_init(&p->acelpf_ctx);
+        ff_acelp_vectors_init(&p->acelpv_ctx);
+        ff_celp_filter_init(&p->celpf_ctx);
+        ff_celp_math_init(&p->celpm_ctx);
+    }
 
     return 0;
 }
@@ -949,134 +958,141 @@ static int amrnb_decode_frame(AVCodecContext *avctx, void *data,
                               int *got_frame_ptr, AVPacket *avpkt)
 {
 
-    AMRContext *p = avctx->priv_data;        // pointer to private data
+    AMRChannelsContext *s = avctx->priv_data;        // pointer to private data
     AVFrame *frame     = data;
     const uint8_t *buf = avpkt->data;
     int buf_size       = avpkt->size;
-    float *buf_out;                          // pointer to the output data buffer
-    int i, subframe, ret;
-    float fixed_gain_factor;
-    AMRFixed fixed_sparse = {0};             // fixed vector up to anti-sparseness processing
-    float spare_vector[AMR_SUBFRAME_SIZE];   // extra stack space to hold result from anti-sparseness processing
-    float synth_fixed_gain;                  // the fixed gain that synthesis should use
-    const float *synth_fixed_vector;         // pointer to the fixed vector that synthesis should use
+    int ret;
 
     /* get output buffer */
     frame->nb_samples = AMR_BLOCK_SIZE;
     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
         return ret;
-    buf_out = (float *)frame->data[0];
 
-    p->cur_frame_mode = unpack_bitstream(p, buf, buf_size);
-    if (p->cur_frame_mode == NO_DATA) {
-        av_log(avctx, AV_LOG_ERROR, "Corrupt bitstream\n");
-        return AVERROR_INVALIDDATA;
-    }
-    if (p->cur_frame_mode == MODE_DTX) {
-        avpriv_report_missing_feature(avctx, "dtx mode");
-        av_log(avctx, AV_LOG_INFO, "Note: libopencore_amrnb supports dtx\n");
-        return AVERROR_PATCHWELCOME;
-    }
-
-    if (p->cur_frame_mode == MODE_12k2) {
-        lsf2lsp_5(p);
-    } else
-        lsf2lsp_3(p);
-
-    for (i = 0; i < 4; i++)
-        ff_acelp_lspd2lpc(p->lsp[i], p->lpc[i], 5);
-
-    for (subframe = 0; subframe < 4; subframe++) {
-        const AMRNBSubframe *amr_subframe = &p->frame.subframe[subframe];
-
-        decode_pitch_vector(p, amr_subframe, subframe);
-
-        decode_fixed_sparse(&fixed_sparse, amr_subframe->pulses,
-                            p->cur_frame_mode, subframe);
-
-        // The fixed gain (section 6.1.3) depends on the fixed vector
-        // (section 6.1.2), but the fixed vector calculation uses
-        // pitch sharpening based on the on the pitch gain (section 6.1.3).
-        // So the correct order is: pitch gain, pitch sharpening, fixed gain.
-        decode_gains(p, amr_subframe, p->cur_frame_mode, subframe,
-                     &fixed_gain_factor);
-
-        pitch_sharpening(p, subframe, p->cur_frame_mode, &fixed_sparse);
-
-        if (fixed_sparse.pitch_lag == 0) {
-            av_log(avctx, AV_LOG_ERROR, "The file is corrupted, pitch_lag = 0 is not allowed\n");
+    for (int ch = 0; ch < avctx->channels; ch++) {
+        AMRContext *p = &s->ch[ch];
+        float fixed_gain_factor;
+        AMRFixed fixed_sparse = {0};             // fixed vector up to anti-sparseness processing
+        float spare_vector[AMR_SUBFRAME_SIZE];   // extra stack space to hold result from anti-sparseness processing
+        float synth_fixed_gain;                  // the fixed gain that synthesis should use
+        const float *synth_fixed_vector;         // pointer to the fixed vector that synthesis should use
+        float *buf_out = (float *)frame->extended_data[ch];
+        int channel_size;
+        int i, subframe;
+
+        p->cur_frame_mode = unpack_bitstream(p, buf, buf_size);
+        if (p->cur_frame_mode == NO_DATA) {
+            av_log(avctx, AV_LOG_ERROR, "Corrupt bitstream\n");
             return AVERROR_INVALIDDATA;
         }
-        ff_set_fixed_vector(p->fixed_vector, &fixed_sparse, 1.0,
-                            AMR_SUBFRAME_SIZE);
-
-        p->fixed_gain[4] =
-            ff_amr_set_fixed_gain(fixed_gain_factor,
-                       p->celpm_ctx.dot_productf(p->fixed_vector,
-                                                               p->fixed_vector,
-                                                               AMR_SUBFRAME_SIZE) /
-                                  AMR_SUBFRAME_SIZE,
-                       p->prediction_error,
-                       energy_mean[p->cur_frame_mode], energy_pred_fac);
-
-        // The excitation feedback is calculated without any processing such
-        // as fixed gain smoothing. This isn't mentioned in the specification.
-        for (i = 0; i < AMR_SUBFRAME_SIZE; i++)
-            p->excitation[i] *= p->pitch_gain[4];
-        ff_set_fixed_vector(p->excitation, &fixed_sparse, p->fixed_gain[4],
-                            AMR_SUBFRAME_SIZE);
-
-        // In the ref decoder, excitation is stored with no fractional bits.
-        // This step prevents buzz in silent periods. The ref encoder can
-        // emit long sequences with pitch factor greater than one. This
-        // creates unwanted feedback if the excitation vector is nonzero.
-        // (e.g. test sequence T19_795.COD in 3GPP TS 26.074)
-        for (i = 0; i < AMR_SUBFRAME_SIZE; i++)
-            p->excitation[i] = truncf(p->excitation[i]);
-
-        // Smooth fixed gain.
-        // The specification is ambiguous, but in the reference source, the
-        // smoothed value is NOT fed back into later fixed gain smoothing.
-        synth_fixed_gain = fixed_gain_smooth(p, p->lsf_q[subframe],
-                                             p->lsf_avg, p->cur_frame_mode);
-
-        synth_fixed_vector = anti_sparseness(p, &fixed_sparse, p->fixed_vector,
-                                             synth_fixed_gain, spare_vector);
-
-        if (synthesis(p, p->lpc[subframe], synth_fixed_gain,
-                      synth_fixed_vector, &p->samples_in[LP_FILTER_ORDER], 0))
-            // overflow detected -> rerun synthesis scaling pitch vector down
-            // by a factor of 4, skipping pitch vector contribution emphasis
-            // and adaptive gain control
-            synthesis(p, p->lpc[subframe], synth_fixed_gain,
-                      synth_fixed_vector, &p->samples_in[LP_FILTER_ORDER], 1);
-
-        postfilter(p, p->lpc[subframe], buf_out + subframe * AMR_SUBFRAME_SIZE);
-
-        // update buffers and history
-        ff_clear_fixed_vector(p->fixed_vector, &fixed_sparse, AMR_SUBFRAME_SIZE);
-        update_state(p);
-    }
+        if (p->cur_frame_mode == MODE_DTX) {
+            avpriv_report_missing_feature(avctx, "dtx mode");
+            av_log(avctx, AV_LOG_INFO, "Note: libopencore_amrnb supports dtx\n");
+            return AVERROR_PATCHWELCOME;
+        }
 
-    p->acelpf_ctx.acelp_apply_order_2_transfer_function(buf_out,
-                                             buf_out, highpass_zeros,
-                                             highpass_poles,
-                                             highpass_gain * AMR_SAMPLE_SCALE,
-                                             p->high_pass_mem, AMR_BLOCK_SIZE);
-
-    /* Update averaged lsf vector (used for fixed gain smoothing).
-     *
-     * Note that lsf_avg should not incorporate the current frame's LSFs
-     * for fixed_gain_smooth.
-     * The specification has an incorrect formula: the reference decoder uses
-     * qbar(n-1) rather than qbar(n) in section 6.1(4) equation 71. */
-    p->acelpv_ctx.weighted_vector_sumf(p->lsf_avg, p->lsf_avg, p->lsf_q[3],
-                            0.84, 0.16, LP_FILTER_ORDER);
+        channel_size = frame_sizes_nb[p->cur_frame_mode] + 1; // +7 for rounding and +8 for TOC
+        if (p->cur_frame_mode == MODE_12k2) {
+            lsf2lsp_5(p);
+        } else
+            lsf2lsp_3(p);
+
+        for (i = 0; i < 4; i++)
+            ff_acelp_lspd2lpc(p->lsp[i], p->lpc[i], 5);
+
+        for (subframe = 0; subframe < 4; subframe++) {
+            const AMRNBSubframe *amr_subframe = &p->frame.subframe[subframe];
+
+            decode_pitch_vector(p, amr_subframe, subframe);
+
+            decode_fixed_sparse(&fixed_sparse, amr_subframe->pulses,
+                                p->cur_frame_mode, subframe);
+
+            // The fixed gain (section 6.1.3) depends on the fixed vector
+            // (section 6.1.2), but the fixed vector calculation uses
+            // pitch sharpening based on the on the pitch gain (section 6.1.3).
+            // So the correct order is: pitch gain, pitch sharpening, fixed gain.
+            decode_gains(p, amr_subframe, p->cur_frame_mode, subframe,
+                         &fixed_gain_factor);
+
+            pitch_sharpening(p, subframe, p->cur_frame_mode, &fixed_sparse);
+
+            if (fixed_sparse.pitch_lag == 0) {
+                av_log(avctx, AV_LOG_ERROR, "The file is corrupted, pitch_lag = 0 is not allowed\n");
+                return AVERROR_INVALIDDATA;
+            }
+            ff_set_fixed_vector(p->fixed_vector, &fixed_sparse, 1.0,
+                                AMR_SUBFRAME_SIZE);
+
+            p->fixed_gain[4] =
+                ff_amr_set_fixed_gain(fixed_gain_factor,
+                                      p->celpm_ctx.dot_productf(p->fixed_vector,
+                                                                p->fixed_vector,
+                                                                AMR_SUBFRAME_SIZE) /
+                                      AMR_SUBFRAME_SIZE,
+                                      p->prediction_error,
+                                      energy_mean[p->cur_frame_mode], energy_pred_fac);
+
+            // The excitation feedback is calculated without any processing such
+            // as fixed gain smoothing. This isn't mentioned in the specification.
+            for (i = 0; i < AMR_SUBFRAME_SIZE; i++)
+                p->excitation[i] *= p->pitch_gain[4];
+            ff_set_fixed_vector(p->excitation, &fixed_sparse, p->fixed_gain[4],
+                                AMR_SUBFRAME_SIZE);
+
+            // In the ref decoder, excitation is stored with no fractional bits.
+            // This step prevents buzz in silent periods. The ref encoder can
+            // emit long sequences with pitch factor greater than one. This
+            // creates unwanted feedback if the excitation vector is nonzero.
+            // (e.g. test sequence T19_795.COD in 3GPP TS 26.074)
+            for (i = 0; i < AMR_SUBFRAME_SIZE; i++)
+                p->excitation[i] = truncf(p->excitation[i]);
+
+            // Smooth fixed gain.
+            // The specification is ambiguous, but in the reference source, the
+            // smoothed value is NOT fed back into later fixed gain smoothing.
+            synth_fixed_gain = fixed_gain_smooth(p, p->lsf_q[subframe],
+                                                 p->lsf_avg, p->cur_frame_mode);
+
+            synth_fixed_vector = anti_sparseness(p, &fixed_sparse, p->fixed_vector,
+                                                 synth_fixed_gain, spare_vector);
+
+            if (synthesis(p, p->lpc[subframe], synth_fixed_gain,
+                          synth_fixed_vector, &p->samples_in[LP_FILTER_ORDER], 0))
+                // overflow detected -> rerun synthesis scaling pitch vector down
+                // by a factor of 4, skipping pitch vector contribution emphasis
+                // and adaptive gain control
+                synthesis(p, p->lpc[subframe], synth_fixed_gain,
+                          synth_fixed_vector, &p->samples_in[LP_FILTER_ORDER], 1);
+
+            postfilter(p, p->lpc[subframe], buf_out + subframe * AMR_SUBFRAME_SIZE);
+
+            // update buffers and history
+            ff_clear_fixed_vector(p->fixed_vector, &fixed_sparse, AMR_SUBFRAME_SIZE);
+            update_state(p);
+        }
+
+        p->acelpf_ctx.acelp_apply_order_2_transfer_function(buf_out,
+                                                            buf_out, highpass_zeros,
+                                                            highpass_poles,
+                                                            highpass_gain * AMR_SAMPLE_SCALE,
+                                                            p->high_pass_mem, AMR_BLOCK_SIZE);
+
+        /* Update averaged lsf vector (used for fixed gain smoothing).
+         *
+         * Note that lsf_avg should not incorporate the current frame's LSFs
+         * for fixed_gain_smooth.
+         * The specification has an incorrect formula: the reference decoder uses
+         * qbar(n-1) rather than qbar(n) in section 6.1(4) equation 71. */
+        p->acelpv_ctx.weighted_vector_sumf(p->lsf_avg, p->lsf_avg, p->lsf_q[3],
+                                           0.84, 0.16, LP_FILTER_ORDER);
+        buf += channel_size;
+        buf_size -= channel_size;
+    }
 
     *got_frame_ptr = 1;
 
-    /* return the amount of bytes consumed if everything was OK */
-    return frame_sizes_nb[p->cur_frame_mode] + 1; // +7 for rounding and +8 for TOC
+    return avpkt->size;
 }
 
 
@@ -1085,10 +1101,10 @@ const AVCodec ff_amrnb_decoder = {
     .long_name      = NULL_IF_CONFIG_SMALL("AMR-NB (Adaptive Multi-Rate NarrowBand)"),
     .type           = AVMEDIA_TYPE_AUDIO,
     .id             = AV_CODEC_ID_AMR_NB,
-    .priv_data_size = sizeof(AMRContext),
+    .priv_data_size = sizeof(AMRChannelsContext),
     .init           = amrnb_decode_init,
     .decode         = amrnb_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
-    .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLT,
+    .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
                                                      AV_SAMPLE_FMT_NONE },
 };
index a6c1d89..3ff4077 100644 (file)
@@ -93,37 +93,47 @@ typedef struct AMRWBContext {
 
 } AMRWBContext;
 
+typedef struct AMRWBChannelsContext {
+    AMRWBContext ch[2];
+} AMRWBChannelsContext;
+
 static av_cold int amrwb_decode_init(AVCodecContext *avctx)
 {
-    AMRWBContext *ctx = avctx->priv_data;
+    AMRWBChannelsContext *s = avctx->priv_data;
     int i;
 
-    if (avctx->channels > 1) {
-        avpriv_report_missing_feature(avctx, "multi-channel AMR");
+    if (avctx->channels > 2) {
+        avpriv_report_missing_feature(avctx, ">2 channel AMR");
         return AVERROR_PATCHWELCOME;
     }
 
-    avctx->channels       = 1;
-    avctx->channel_layout = AV_CH_LAYOUT_MONO;
+    if (!avctx->channels) {
+        avctx->channels       = 1;
+        avctx->channel_layout = AV_CH_LAYOUT_MONO;
+    }
     if (!avctx->sample_rate)
         avctx->sample_rate = 16000;
-    avctx->sample_fmt     = AV_SAMPLE_FMT_FLT;
+    avctx->sample_fmt     = AV_SAMPLE_FMT_FLTP;
 
-    av_lfg_init(&ctx->prng, 1);
+    for (int ch = 0; ch < avctx->channels; ch++) {
+        AMRWBContext *ctx = &s->ch[ch];
 
-    ctx->excitation  = &ctx->excitation_buf[AMRWB_P_DELAY_MAX + LP_ORDER + 1];
-    ctx->first_frame = 1;
+        av_lfg_init(&ctx->prng, 1);
 
-    for (i = 0; i < LP_ORDER; i++)
-        ctx->isf_past_final[i] = isf_init[i] * (1.0f / (1 << 15));
+        ctx->excitation  = &ctx->excitation_buf[AMRWB_P_DELAY_MAX + LP_ORDER + 1];
+        ctx->first_frame = 1;
 
-    for (i = 0; i < 4; i++)
-        ctx->prediction_error[i] = MIN_ENERGY;
+        for (i = 0; i < LP_ORDER; i++)
+            ctx->isf_past_final[i] = isf_init[i] * (1.0f / (1 << 15));
 
-    ff_acelp_filter_init(&ctx->acelpf_ctx);
-    ff_acelp_vectors_init(&ctx->acelpv_ctx);
-    ff_celp_filter_init(&ctx->celpf_ctx);
-    ff_celp_math_init(&ctx->celpm_ctx);
+        for (i = 0; i < 4; i++)
+            ctx->prediction_error[i] = MIN_ENERGY;
+
+        ff_acelp_filter_init(&ctx->acelpf_ctx);
+        ff_acelp_vectors_init(&ctx->acelpv_ctx);
+        ff_celp_filter_init(&ctx->celpf_ctx);
+        ff_celp_math_init(&ctx->celpm_ctx);
+    }
 
     return 0;
 }
@@ -1094,185 +1104,192 @@ static void update_sub_state(AMRWBContext *ctx)
 static int amrwb_decode_frame(AVCodecContext *avctx, void *data,
                               int *got_frame_ptr, AVPacket *avpkt)
 {
-    AMRWBContext *ctx  = avctx->priv_data;
+    AMRWBChannelsContext *s  = avctx->priv_data;
     AVFrame *frame     = data;
-    AMRWBFrame   *cf   = &ctx->frame;
     const uint8_t *buf = avpkt->data;
     int buf_size       = avpkt->size;
-    int expected_fr_size, header_size;
-    float *buf_out;
-    float spare_vector[AMRWB_SFR_SIZE];      // extra stack space to hold result from anti-sparseness processing
-    float fixed_gain_factor;                 // fixed gain correction factor (gamma)
-    float *synth_fixed_vector;               // pointer to the fixed vector that synthesis should use
-    float synth_fixed_gain;                  // the fixed gain that synthesis should use
-    float voice_fac, stab_fac;               // parameters used for gain smoothing
-    float synth_exc[AMRWB_SFR_SIZE];         // post-processed excitation for synthesis
-    float hb_exc[AMRWB_SFR_SIZE_16k];        // excitation for the high frequency band
-    float hb_samples[AMRWB_SFR_SIZE_16k];    // filtered high-band samples from synthesis
-    float hb_gain;
     int sub, i, ret;
 
     /* get output buffer */
     frame->nb_samples = 4 * AMRWB_SFR_SIZE_16k;
     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
         return ret;
-    buf_out = (float *)frame->data[0];
 
-    header_size      = decode_mime_header(ctx, buf);
-    expected_fr_size = ((cf_sizes_wb[ctx->fr_cur_mode] + 7) >> 3) + 1;
+    for (int ch = 0; ch < avctx->channels; ch++) {
+        AMRWBContext *ctx  = &s->ch[ch];
+        AMRWBFrame   *cf   = &ctx->frame;
+        int expected_fr_size, header_size;
+        float spare_vector[AMRWB_SFR_SIZE];      // extra stack space to hold result from anti-sparseness processing
+        float fixed_gain_factor;                 // fixed gain correction factor (gamma)
+        float *synth_fixed_vector;               // pointer to the fixed vector that synthesis should use
+        float synth_fixed_gain;                  // the fixed gain that synthesis should use
+        float voice_fac, stab_fac;               // parameters used for gain smoothing
+        float synth_exc[AMRWB_SFR_SIZE];         // post-processed excitation for synthesis
+        float hb_exc[AMRWB_SFR_SIZE_16k];        // excitation for the high frequency band
+        float hb_samples[AMRWB_SFR_SIZE_16k];    // filtered high-band samples from synthesis
+        float hb_gain;
+        float *buf_out = (float *)frame->extended_data[ch];
+
+        header_size      = decode_mime_header(ctx, buf);
+        expected_fr_size = ((cf_sizes_wb[ctx->fr_cur_mode] + 7) >> 3) + 1;
+
+        if (!ctx->fr_quality)
+            av_log(avctx, AV_LOG_ERROR, "Encountered a bad or corrupted frame\n");
+
+        if (ctx->fr_cur_mode == NO_DATA || !ctx->fr_quality) {
+            /* The specification suggests a "random signal" and
+               "a muting technique" to "gradually decrease the output level". */
+            av_samples_set_silence(&frame->extended_data[ch], 0, frame->nb_samples, 1, AV_SAMPLE_FMT_FLT);
+            buf += expected_fr_size;
+            buf_size -= expected_fr_size;
+            continue;
+        }
+        if (ctx->fr_cur_mode > MODE_SID) {
+            av_log(avctx, AV_LOG_ERROR,
+                   "Invalid mode %d\n", ctx->fr_cur_mode);
+            return AVERROR_INVALIDDATA;
+        }
 
-    if (!ctx->fr_quality)
-        av_log(avctx, AV_LOG_ERROR, "Encountered a bad or corrupted frame\n");
+        if (buf_size < expected_fr_size) {
+            av_log(avctx, AV_LOG_ERROR,
+                   "Frame too small (%d bytes). Truncated file?\n", buf_size);
+            *got_frame_ptr = 0;
+            return AVERROR_INVALIDDATA;
+        }
 
-    if (ctx->fr_cur_mode == NO_DATA || !ctx->fr_quality) {
-        /* The specification suggests a "random signal" and
-           "a muting technique" to "gradually decrease the output level". */
-        av_samples_set_silence(&frame->data[0], 0, frame->nb_samples, 1, AV_SAMPLE_FMT_FLT);
-        *got_frame_ptr = 1;
-        return expected_fr_size;
-    }
-    if (ctx->fr_cur_mode > MODE_SID) {
-        av_log(avctx, AV_LOG_ERROR,
-               "Invalid mode %d\n", ctx->fr_cur_mode);
-        return AVERROR_INVALIDDATA;
-    }
+        if (ctx->fr_cur_mode == MODE_SID) { /* Comfort noise frame */
+            avpriv_request_sample(avctx, "SID mode");
+            return AVERROR_PATCHWELCOME;
+        }
 
-    if (buf_size < expected_fr_size) {
-        av_log(avctx, AV_LOG_ERROR,
-            "Frame too small (%d bytes). Truncated file?\n", buf_size);
-        *got_frame_ptr = 0;
-        return AVERROR_INVALIDDATA;
-    }
+        ff_amr_bit_reorder((uint16_t *) &ctx->frame, sizeof(AMRWBFrame),
+                           buf + header_size, amr_bit_orderings_by_mode[ctx->fr_cur_mode]);
 
-    if (ctx->fr_cur_mode == MODE_SID) { /* Comfort noise frame */
-        avpriv_request_sample(avctx, "SID mode");
-        return AVERROR_PATCHWELCOME;
-    }
+        /* Decode the quantized ISF vector */
+        if (ctx->fr_cur_mode == MODE_6k60) {
+            decode_isf_indices_36b(cf->isp_id, ctx->isf_cur);
+        } else {
+            decode_isf_indices_46b(cf->isp_id, ctx->isf_cur);
+        }
 
-    ff_amr_bit_reorder((uint16_t *) &ctx->frame, sizeof(AMRWBFrame),
-        buf + header_size, amr_bit_orderings_by_mode[ctx->fr_cur_mode]);
+        isf_add_mean_and_past(ctx->isf_cur, ctx->isf_q_past);
+        ff_set_min_dist_lsf(ctx->isf_cur, MIN_ISF_SPACING, LP_ORDER - 1);
 
-    /* Decode the quantized ISF vector */
-    if (ctx->fr_cur_mode == MODE_6k60) {
-        decode_isf_indices_36b(cf->isp_id, ctx->isf_cur);
-    } else {
-        decode_isf_indices_46b(cf->isp_id, ctx->isf_cur);
-    }
+        stab_fac = stability_factor(ctx->isf_cur, ctx->isf_past_final);
+
+        ctx->isf_cur[LP_ORDER - 1] *= 2.0;
+        ff_acelp_lsf2lspd(ctx->isp[3], ctx->isf_cur, LP_ORDER);
 
-    isf_add_mean_and_past(ctx->isf_cur, ctx->isf_q_past);
-    ff_set_min_dist_lsf(ctx->isf_cur, MIN_ISF_SPACING, LP_ORDER - 1);
+        /* Generate a ISP vector for each subframe */
+        if (ctx->first_frame) {
+            ctx->first_frame = 0;
+            memcpy(ctx->isp_sub4_past, ctx->isp[3], LP_ORDER * sizeof(double));
+        }
+        interpolate_isp(ctx->isp, ctx->isp_sub4_past);
 
-    stab_fac = stability_factor(ctx->isf_cur, ctx->isf_past_final);
+        for (sub = 0; sub < 4; sub++)
+            ff_amrwb_lsp2lpc(ctx->isp[sub], ctx->lp_coef[sub], LP_ORDER);
 
-    ctx->isf_cur[LP_ORDER - 1] *= 2.0;
-    ff_acelp_lsf2lspd(ctx->isp[3], ctx->isf_cur, LP_ORDER);
+        for (sub = 0; sub < 4; sub++) {
+            const AMRWBSubFrame *cur_subframe = &cf->subframe[sub];
+            float *sub_buf = buf_out + sub * AMRWB_SFR_SIZE_16k;
 
-    /* Generate a ISP vector for each subframe */
-    if (ctx->first_frame) {
-        ctx->first_frame = 0;
-        memcpy(ctx->isp_sub4_past, ctx->isp[3], LP_ORDER * sizeof(double));
-    }
-    interpolate_isp(ctx->isp, ctx->isp_sub4_past);
-
-    for (sub = 0; sub < 4; sub++)
-        ff_amrwb_lsp2lpc(ctx->isp[sub], ctx->lp_coef[sub], LP_ORDER);
-
-    for (sub = 0; sub < 4; sub++) {
-        const AMRWBSubFrame *cur_subframe = &cf->subframe[sub];
-        float *sub_buf = buf_out + sub * AMRWB_SFR_SIZE_16k;
-
-        /* Decode adaptive codebook (pitch vector) */
-        decode_pitch_vector(ctx, cur_subframe, sub);
-        /* Decode innovative codebook (fixed vector) */
-        decode_fixed_vector(ctx->fixed_vector, cur_subframe->pul_ih,
-                            cur_subframe->pul_il, ctx->fr_cur_mode);
-
-        pitch_sharpening(ctx, ctx->fixed_vector);
-
-        decode_gains(cur_subframe->vq_gain, ctx->fr_cur_mode,
-                     &fixed_gain_factor, &ctx->pitch_gain[0]);
-
-        ctx->fixed_gain[0] =
-            ff_amr_set_fixed_gain(fixed_gain_factor,
-                                  ctx->celpm_ctx.dot_productf(ctx->fixed_vector,
-                                                               ctx->fixed_vector,
-                                                               AMRWB_SFR_SIZE) /
-                                  AMRWB_SFR_SIZE,
-                       ctx->prediction_error,
-                       ENERGY_MEAN, energy_pred_fac);
-
-        /* Calculate voice factor and store tilt for next subframe */
-        voice_fac      = voice_factor(ctx->pitch_vector, ctx->pitch_gain[0],
-                                      ctx->fixed_vector, ctx->fixed_gain[0],
-                                      &ctx->celpm_ctx);
-        ctx->tilt_coef = voice_fac * 0.25 + 0.25;
-
-        /* Construct current excitation */
-        for (i = 0; i < AMRWB_SFR_SIZE; i++) {
-            ctx->excitation[i] *= ctx->pitch_gain[0];
-            ctx->excitation[i] += ctx->fixed_gain[0] * ctx->fixed_vector[i];
-            ctx->excitation[i] = truncf(ctx->excitation[i]);
-        }
+            /* Decode adaptive codebook (pitch vector) */
+            decode_pitch_vector(ctx, cur_subframe, sub);
+            /* Decode innovative codebook (fixed vector) */
+            decode_fixed_vector(ctx->fixed_vector, cur_subframe->pul_ih,
+                                cur_subframe->pul_il, ctx->fr_cur_mode);
 
-        /* Post-processing of excitation elements */
-        synth_fixed_gain = noise_enhancer(ctx->fixed_gain[0], &ctx->prev_tr_gain,
-                                          voice_fac, stab_fac);
+            pitch_sharpening(ctx, ctx->fixed_vector);
 
-        synth_fixed_vector = anti_sparseness(ctx, ctx->fixed_vector,
-                                             spare_vector);
+            decode_gains(cur_subframe->vq_gain, ctx->fr_cur_mode,
+                         &fixed_gain_factor, &ctx->pitch_gain[0]);
 
-        pitch_enhancer(synth_fixed_vector, voice_fac);
+            ctx->fixed_gain[0] =
+                ff_amr_set_fixed_gain(fixed_gain_factor,
+                                      ctx->celpm_ctx.dot_productf(ctx->fixed_vector,
+                                                                  ctx->fixed_vector,
+                                                                  AMRWB_SFR_SIZE) /
+                                      AMRWB_SFR_SIZE,
+                                      ctx->prediction_error,
+                                      ENERGY_MEAN, energy_pred_fac);
 
-        synthesis(ctx, ctx->lp_coef[sub], synth_exc, synth_fixed_gain,
-                  synth_fixed_vector, &ctx->samples_az[LP_ORDER]);
+            /* Calculate voice factor and store tilt for next subframe */
+            voice_fac      = voice_factor(ctx->pitch_vector, ctx->pitch_gain[0],
+                                          ctx->fixed_vector, ctx->fixed_gain[0],
+                                          &ctx->celpm_ctx);
+            ctx->tilt_coef = voice_fac * 0.25 + 0.25;
 
-        /* Synthesis speech post-processing */
-        de_emphasis(&ctx->samples_up[UPS_MEM_SIZE],
-                    &ctx->samples_az[LP_ORDER], PREEMPH_FAC, ctx->demph_mem);
+            /* Construct current excitation */
+            for (i = 0; i < AMRWB_SFR_SIZE; i++) {
+                ctx->excitation[i] *= ctx->pitch_gain[0];
+                ctx->excitation[i] += ctx->fixed_gain[0] * ctx->fixed_vector[i];
+                ctx->excitation[i] = truncf(ctx->excitation[i]);
+            }
 
-        ctx->acelpf_ctx.acelp_apply_order_2_transfer_function(&ctx->samples_up[UPS_MEM_SIZE],
-            &ctx->samples_up[UPS_MEM_SIZE], hpf_zeros, hpf_31_poles,
-            hpf_31_gain, ctx->hpf_31_mem, AMRWB_SFR_SIZE);
+            /* Post-processing of excitation elements */
+            synth_fixed_gain = noise_enhancer(ctx->fixed_gain[0], &ctx->prev_tr_gain,
+                                              voice_fac, stab_fac);
 
-        upsample_5_4(sub_buf, &ctx->samples_up[UPS_FIR_SIZE],
-                     AMRWB_SFR_SIZE_16k, &ctx->celpm_ctx);
+            synth_fixed_vector = anti_sparseness(ctx, ctx->fixed_vector,
+                                                 spare_vector);
 
-        /* High frequency band (6.4 - 7.0 kHz) generation part */
-        ctx->acelpf_ctx.acelp_apply_order_2_transfer_function(hb_samples,
-            &ctx->samples_up[UPS_MEM_SIZE], hpf_zeros, hpf_400_poles,
-            hpf_400_gain, ctx->hpf_400_mem, AMRWB_SFR_SIZE);
+            pitch_enhancer(synth_fixed_vector, voice_fac);
 
-        hb_gain = find_hb_gain(ctx, hb_samples,
-                               cur_subframe->hb_gain, cf->vad);
+            synthesis(ctx, ctx->lp_coef[sub], synth_exc, synth_fixed_gain,
+                      synth_fixed_vector, &ctx->samples_az[LP_ORDER]);
 
-        scaled_hb_excitation(ctx, hb_exc, synth_exc, hb_gain);
+            /* Synthesis speech post-processing */
+            de_emphasis(&ctx->samples_up[UPS_MEM_SIZE],
+                        &ctx->samples_az[LP_ORDER], PREEMPH_FAC, ctx->demph_mem);
 
-        hb_synthesis(ctx, sub, &ctx->samples_hb[LP_ORDER_16k],
-                     hb_exc, ctx->isf_cur, ctx->isf_past_final);
+            ctx->acelpf_ctx.acelp_apply_order_2_transfer_function(&ctx->samples_up[UPS_MEM_SIZE],
+                                                                  &ctx->samples_up[UPS_MEM_SIZE], hpf_zeros, hpf_31_poles,
+                                                                  hpf_31_gain, ctx->hpf_31_mem, AMRWB_SFR_SIZE);
 
-        /* High-band post-processing filters */
-        hb_fir_filter(hb_samples, bpf_6_7_coef, ctx->bpf_6_7_mem,
-                      &ctx->samples_hb[LP_ORDER_16k]);
+            upsample_5_4(sub_buf, &ctx->samples_up[UPS_FIR_SIZE],
+                         AMRWB_SFR_SIZE_16k, &ctx->celpm_ctx);
 
-        if (ctx->fr_cur_mode == MODE_23k85)
-            hb_fir_filter(hb_samples, lpf_7_coef, ctx->lpf_7_mem,
-                          hb_samples);
+            /* High frequency band (6.4 - 7.0 kHz) generation part */
+            ctx->acelpf_ctx.acelp_apply_order_2_transfer_function(hb_samples,
+                                                                  &ctx->samples_up[UPS_MEM_SIZE], hpf_zeros, hpf_400_poles,
+                                                                  hpf_400_gain, ctx->hpf_400_mem, AMRWB_SFR_SIZE);
 
-        /* Add the low and high frequency bands */
-        for (i = 0; i < AMRWB_SFR_SIZE_16k; i++)
-            sub_buf[i] = (sub_buf[i] + hb_samples[i]) * (1.0f / (1 << 15));
+            hb_gain = find_hb_gain(ctx, hb_samples,
+                                   cur_subframe->hb_gain, cf->vad);
 
-        /* Update buffers and history */
-        update_sub_state(ctx);
-    }
+            scaled_hb_excitation(ctx, hb_exc, synth_exc, hb_gain);
 
-    /* update state for next frame */
-    memcpy(ctx->isp_sub4_past, ctx->isp[3], LP_ORDER * sizeof(ctx->isp[3][0]));
-    memcpy(ctx->isf_past_final, ctx->isf_cur, LP_ORDER * sizeof(float));
+            hb_synthesis(ctx, sub, &ctx->samples_hb[LP_ORDER_16k],
+                         hb_exc, ctx->isf_cur, ctx->isf_past_final);
+
+            /* High-band post-processing filters */
+            hb_fir_filter(hb_samples, bpf_6_7_coef, ctx->bpf_6_7_mem,
+                          &ctx->samples_hb[LP_ORDER_16k]);
+
+            if (ctx->fr_cur_mode == MODE_23k85)
+                hb_fir_filter(hb_samples, lpf_7_coef, ctx->lpf_7_mem,
+                              hb_samples);
+
+            /* Add the low and high frequency bands */
+            for (i = 0; i < AMRWB_SFR_SIZE_16k; i++)
+                sub_buf[i] = (sub_buf[i] + hb_samples[i]) * (1.0f / (1 << 15));
+
+            /* Update buffers and history */
+            update_sub_state(ctx);
+        }
+
+        /* update state for next frame */
+        memcpy(ctx->isp_sub4_past, ctx->isp[3], LP_ORDER * sizeof(ctx->isp[3][0]));
+        memcpy(ctx->isf_past_final, ctx->isf_cur, LP_ORDER * sizeof(float));
+
+        buf += expected_fr_size;
+        buf_size -= expected_fr_size;
+    }
 
     *got_frame_ptr = 1;
 
-    return expected_fr_size;
+    return avpkt->size;
 }
 
 const AVCodec ff_amrwb_decoder = {
@@ -1280,7 +1297,7 @@ const AVCodec ff_amrwb_decoder = {
     .long_name      = NULL_IF_CONFIG_SMALL("AMR-WB (Adaptive Multi-Rate WideBand)"),
     .type           = AVMEDIA_TYPE_AUDIO,
     .id             = AV_CODEC_ID_AMR_WB,
-    .priv_data_size = sizeof(AMRWBContext),
+    .priv_data_size = sizeof(AMRWBChannelsContext),
     .init           = amrwb_decode_init,
     .decode         = amrwb_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
index 27d0ff3..9c723f2 100644 (file)
@@ -979,7 +979,7 @@ static void long_filter_ehigh_3830(int32_t *buffer, int length)
         for (j = 7; j > 0; j--)
             delay[j] = delay[j - 1];
         delay[0] = buffer[i];
-        buffer[i] -= dotprod >> 9;
+        buffer[i] -= (unsigned)(dotprod >> 9);
     }
 }
 
@@ -1337,7 +1337,7 @@ static void do_apply_filter(APEContext *ctx, int version, APEFilter *f,
             absres = FFABSU(res);
             if (absres)
                 *f->adaptcoeffs = APESIGN(res) *
-                                  (8 << ((absres > f->avg * 3) + (absres > (f->avg + f->avg / 3))));
+                                  (8 << ((absres > f->avg * 3LL) + (absres > (f->avg + f->avg / 3))));
                 /* equivalent to the following code
                     if (absres <= f->avg * 4 / 3)
                         *f->adaptcoeffs = APESIGN(res) * 8;
index 21336c6..99aeba9 100644 (file)
@@ -156,8 +156,8 @@ function \type\()_h264_qpel8_h_lowpass_neon
         lowpass_8       d0,  d1,  d16, d17, d0,  d16
   .ifc \type,avg
         vld1.8          {d2},     [r0,:64], r3
-        vrhadd.u8       d0,  d0,  d2
         vld1.8          {d3},     [r0,:64]
+        vrhadd.u8       d0,  d0,  d2
         vrhadd.u8       d16, d16, d3
         sub             r0,  r0,  r3
   .endif
@@ -196,9 +196,8 @@ function \type\()_h264_qpel8_h_lowpass_l2_neon
         vrhadd.u8       q0,  q0,  q14
   .ifc \type,avg
         vld1.8          {d2},      [r0,:64], r2
-        vrhadd.u8       d0,  d0,  d2
         vld1.8          {d3},      [r0,:64]
-        vrhadd.u8       d1,  d1,  d3
+        vrhadd.u8       q0,  q0,  q1
         sub             r0,  r0,  r2
   .endif
         vst1.8          {d0},      [r0,:64], r2
@@ -266,20 +265,20 @@ function \type\()_h264_qpel8_v_lowpass_neon
 
   .ifc \type,avg
         vld1.8          {d9},  [r0,:64], r2
-        vrhadd.u8       d8,  d8,  d9
         vld1.8          {d11}, [r0,:64], r2
-        vrhadd.u8       d10, d10, d11
         vld1.8          {d13}, [r0,:64], r2
-        vrhadd.u8       d12, d12, d13
+        vrhadd.u8       d8,  d8,  d9
         vld1.8          {d15}, [r0,:64], r2
-        vrhadd.u8       d14, d14, d15
+        vrhadd.u8       d10, d10, d11
         vld1.8          {d23}, [r0,:64], r2
-        vrhadd.u8       d22, d22, d23
+        vrhadd.u8       d12, d12, d13
         vld1.8          {d25}, [r0,:64], r2
-        vrhadd.u8       d24, d24, d25
+        vrhadd.u8       d14, d14, d15
         vld1.8          {d27}, [r0,:64], r2
-        vrhadd.u8       d26, d26, d27
+        vrhadd.u8       d22, d22, d23
         vld1.8          {d29}, [r0,:64], r2
+        vrhadd.u8       d24, d24, d25
+        vrhadd.u8       d26, d26, d27
         vrhadd.u8       d28, d28, d29
         sub             r0,  r0,  r2,  lsl #3
   .endif
@@ -355,20 +354,20 @@ function \type\()_h264_qpel8_v_lowpass_l2_neon
 
   .ifc \type,avg
         vld1.8          {d16}, [r0,:64], r3
-        vrhadd.u8       d0,  d0,  d16
         vld1.8          {d17}, [r0,:64], r3
-        vrhadd.u8       d1,  d1,  d17
+        vrhadd.u8       d0,  d0,  d16
         vld1.8          {d16}, [r0,:64], r3
-        vrhadd.u8       d2,  d2,  d16
+        vrhadd.u8       d1,  d1,  d17
         vld1.8          {d17}, [r0,:64], r3
-        vrhadd.u8       d3,  d3,  d17
+        vrhadd.u8       d2,  d2,  d16
         vld1.8          {d16}, [r0,:64], r3
-        vrhadd.u8       d4,  d4,  d16
+        vrhadd.u8       d3,  d3,  d17
         vld1.8          {d17}, [r0,:64], r3
-        vrhadd.u8       d5,  d5,  d17
+        vrhadd.u8       d4,  d4,  d16
         vld1.8          {d16}, [r0,:64], r3
-        vrhadd.u8       d10, d10, d16
+        vrhadd.u8       d5,  d5,  d17
         vld1.8          {d17}, [r0,:64], r3
+        vrhadd.u8       d10, d10, d16
         vrhadd.u8       d11, d11, d17
         sub             r0,  r0,  r3,  lsl #3
   .endif
@@ -461,21 +460,17 @@ function \type\()_h264_qpel8_hv_lowpass_neon
         bl              put_h264_qpel8_hv_lowpass_neon_top
   .ifc \type,avg
         vld1.8          {d0},      [r0,:64], r2
-        vrhadd.u8       d12, d12, d0
         vld1.8          {d1},      [r0,:64], r2
-        vrhadd.u8       d13, d13, d1
         vld1.8          {d2},      [r0,:64], r2
-        vrhadd.u8       d14, d14, d2
         vld1.8          {d3},      [r0,:64], r2
-        vrhadd.u8       d15, d15, d3
+        vrhadd.u8       q6,  q6,  q0
         vld1.8          {d4},      [r0,:64], r2
-        vrhadd.u8       d8,  d8,  d4
         vld1.8          {d5},      [r0,:64], r2
-        vrhadd.u8       d9,  d9,  d5
+        vrhadd.u8       q7,  q7,  q1
         vld1.8          {d6},      [r0,:64], r2
-        vrhadd.u8       d10, d10, d6
         vld1.8          {d7},      [r0,:64], r2
-        vrhadd.u8       d11, d11, d7
+        vrhadd.u8       q4,  q4,  q2
+        vrhadd.u8       q5,  q5,  q3
         sub             r0,  r0,  r2,  lsl #3
   .endif
 
@@ -511,21 +506,17 @@ function \type\()_h264_qpel8_hv_lowpass_l2_neon
         vrhadd.u8       q3,  q3,  q5
   .ifc \type,avg
         vld1.8          {d16},     [r0,:64], r3
-        vrhadd.u8       d0,  d0,  d16
         vld1.8          {d17},     [r0,:64], r3
-        vrhadd.u8       d1,  d1,  d17
         vld1.8          {d18},     [r0,:64], r3
-        vrhadd.u8       d2,  d2,  d18
         vld1.8          {d19},     [r0,:64], r3
-        vrhadd.u8       d3,  d3,  d19
+        vrhadd.u8       q0,  q0,  q8
         vld1.8          {d20},     [r0,:64], r3
-        vrhadd.u8       d4,  d4,  d20
         vld1.8          {d21},     [r0,:64], r3
-        vrhadd.u8       d5,  d5,  d21
+        vrhadd.u8       q1,  q1,  q9
         vld1.8          {d22},     [r0,:64], r3
-        vrhadd.u8       d6,  d6,  d22
         vld1.8          {d23},     [r0,:64], r3
-        vrhadd.u8       d7,  d7,  d23
+        vrhadd.u8       q2,  q2,  q10
+        vrhadd.u8       q3,  q3,  q11
         sub             r0,  r0,  r3,  lsl #3
   .endif
         vst1.8          {d0},      [r0,:64], r3
index 2d89ef5..29ec71b 100644 (file)
@@ -73,7 +73,7 @@ int ff_parse_a53_cc(AVBufferRef **pbuf, const uint8_t *data, int size)
     int ret, cc_count;
 
     if (size < 3)
-        return AVERROR(EINVAL);
+        return AVERROR_INVALIDDATA;
 
     ret = init_get_bits8(&gb, data, size);
     if (ret < 0)
@@ -95,12 +95,12 @@ int ff_parse_a53_cc(AVBufferRef **pbuf, const uint8_t *data, int size)
 
     /* 3 bytes per CC plus one byte marker_bits at the end */
     if (cc_count * 3 >= (get_bits_left(&gb) >> 3))
-        return AVERROR(EINVAL);
+        return AVERROR_INVALIDDATA;
 
     new_size = (old_size + cc_count * 3);
 
     if (new_size > INT_MAX)
-        return AVERROR(EINVAL);
+        return AVERROR_INVALIDDATA;
 
     /* Allow merging of the cc data from two fields. */
     ret = av_buffer_realloc(pbuf, new_size);
index a222cde..9939fef 100644 (file)
@@ -354,7 +354,7 @@ static av_cold int ffat_create_decoder(AVCodecContext *avctx,
                 avctx->codec_id == AV_CODEC_ID_EAC3)) {
         AC3HeaderInfo hdr;
         GetBitContext gbc;
-        init_get_bits(&gbc, pkt->data, pkt->size);
+        init_get_bits8(&gbc, pkt->data, pkt->size);
         if (ff_ac3_parse_header(&gbc, &hdr) < 0)
             return AVERROR_INVALIDDATA;
         in_format.mSampleRate = hdr.sample_rate;
index 0f99ae4..951a18e 100644 (file)
@@ -114,6 +114,13 @@ enum {
     AV1_WARP_MODEL_TRANSLATION = 1,
     AV1_WARP_MODEL_ROTZOOM     = 2,
     AV1_WARP_MODEL_AFFINE      = 3,
+    AV1_WARP_PARAM_REDUCE_BITS = 6,
+
+    AV1_DIV_LUT_BITS      = 8,
+    AV1_DIV_LUT_PREC_BITS = 14,
+    AV1_DIV_LUT_NUM       = 257,
+
+    AV1_MAX_LOOP_FILTER = 63,
 };
 
 
index a69808f..db110c5 100644 (file)
 #include "internal.h"
 #include "profiles.h"
 
+/**< same with Div_Lut defined in spec 7.11.3.7 */
+static const uint16_t div_lut[AV1_DIV_LUT_NUM] = {
+  16384, 16320, 16257, 16194, 16132, 16070, 16009, 15948, 15888, 15828, 15768,
+  15709, 15650, 15592, 15534, 15477, 15420, 15364, 15308, 15252, 15197, 15142,
+  15087, 15033, 14980, 14926, 14873, 14821, 14769, 14717, 14665, 14614, 14564,
+  14513, 14463, 14413, 14364, 14315, 14266, 14218, 14170, 14122, 14075, 14028,
+  13981, 13935, 13888, 13843, 13797, 13752, 13707, 13662, 13618, 13574, 13530,
+  13487, 13443, 13400, 13358, 13315, 13273, 13231, 13190, 13148, 13107, 13066,
+  13026, 12985, 12945, 12906, 12866, 12827, 12788, 12749, 12710, 12672, 12633,
+  12596, 12558, 12520, 12483, 12446, 12409, 12373, 12336, 12300, 12264, 12228,
+  12193, 12157, 12122, 12087, 12053, 12018, 11984, 11950, 11916, 11882, 11848,
+  11815, 11782, 11749, 11716, 11683, 11651, 11619, 11586, 11555, 11523, 11491,
+  11460, 11429, 11398, 11367, 11336, 11305, 11275, 11245, 11215, 11185, 11155,
+  11125, 11096, 11067, 11038, 11009, 10980, 10951, 10923, 10894, 10866, 10838,
+  10810, 10782, 10755, 10727, 10700, 10673, 10645, 10618, 10592, 10565, 10538,
+  10512, 10486, 10460, 10434, 10408, 10382, 10356, 10331, 10305, 10280, 10255,
+  10230, 10205, 10180, 10156, 10131, 10107, 10082, 10058, 10034, 10010, 9986,
+  9963,  9939,  9916,  9892,  9869,  9846,  9823,  9800,  9777,  9754,  9732,
+  9709,  9687,  9664,  9642,  9620,  9598,  9576,  9554,  9533,  9511,  9489,
+  9468,  9447,  9425,  9404,  9383,  9362,  9341,  9321,  9300,  9279,  9259,
+  9239,  9218,  9198,  9178,  9158,  9138,  9118,  9098,  9079,  9059,  9039,
+  9020,  9001,  8981,  8962,  8943,  8924,  8905,  8886,  8867,  8849,  8830,
+  8812,  8793,  8775,  8756,  8738,  8720,  8702,  8684,  8666,  8648,  8630,
+  8613,  8595,  8577,  8560,  8542,  8525,  8508,  8490,  8473,  8456,  8439,
+  8422,  8405,  8389,  8372,  8355,  8339,  8322,  8306,  8289,  8273,  8257,
+  8240,  8224,  8208,  8192
+};
+
 static uint32_t inverse_recenter(int r, uint32_t v)
 {
     if (v > 2 * r)
@@ -97,6 +125,70 @@ static void read_global_param(AV1DecContext *s, int type, int ref, int idx)
                                        -mx, mx + 1, r) << prec_diff) + round;
 }
 
+static uint64_t round_two(uint64_t x, uint16_t n)
+{
+    if (n == 0)
+        return x;
+    return ((x + ((uint64_t)1 << (n - 1))) >> n);
+}
+
+static int64_t round_two_signed(int64_t x, uint16_t n)
+{
+    return ((x<0) ? -((int64_t)round_two(-x, n)) : (int64_t)round_two(x, n));
+}
+
+/**
+ * Resolve divisor process.
+ * see spec 7.11.3.7
+ */
+static int16_t resolve_divisor(uint32_t d, uint16_t *shift)
+{
+    int32_t e, f;
+
+    *shift = av_log2(d);
+    e = d - (1 << (*shift));
+    if (*shift > AV1_DIV_LUT_BITS)
+        f = round_two(e, *shift - AV1_DIV_LUT_BITS);
+    else
+        f = e << (AV1_DIV_LUT_BITS - (*shift));
+
+    *shift += AV1_DIV_LUT_PREC_BITS;
+
+    return div_lut[f];
+}
+
+/**
+ * check if global motion params is valid.
+ * see spec 7.11.3.6
+ */
+static uint8_t get_shear_params_valid(AV1DecContext *s, int idx)
+{
+    int16_t alpha, beta, gamma, delta, divf, divs;
+    int64_t v, w;
+    int32_t *param = &s->cur_frame.gm_params[idx][0];
+    if (param[2] < 0)
+        return 0;
+
+    alpha = av_clip_int16(param[2] - (1 << AV1_WARPEDMODEL_PREC_BITS));
+    beta  = av_clip_int16(param[3]);
+    divf  = resolve_divisor(abs(param[2]), &divs);
+    v     = (int64_t)param[4] * (1 << AV1_WARPEDMODEL_PREC_BITS);
+    w     = (int64_t)param[3] * param[4];
+    gamma = av_clip_int16((int)round_two_signed((v * divf), divs));
+    delta = av_clip_int16(param[5] - (int)round_two_signed((w * divf), divs) - (1 << AV1_WARPEDMODEL_PREC_BITS));
+
+    alpha = round_two_signed(alpha, AV1_WARP_PARAM_REDUCE_BITS) << AV1_WARP_PARAM_REDUCE_BITS;
+    beta  = round_two_signed(beta,  AV1_WARP_PARAM_REDUCE_BITS) << AV1_WARP_PARAM_REDUCE_BITS;
+    gamma = round_two_signed(gamma, AV1_WARP_PARAM_REDUCE_BITS) << AV1_WARP_PARAM_REDUCE_BITS;
+    delta = round_two_signed(delta, AV1_WARP_PARAM_REDUCE_BITS) << AV1_WARP_PARAM_REDUCE_BITS;
+
+    if ((4 * abs(alpha) + 7 * abs(beta)) >= (1 << AV1_WARPEDMODEL_PREC_BITS) ||
+        (4 * abs(gamma) + 4 * abs(delta)) >= (1 << AV1_WARPEDMODEL_PREC_BITS))
+        return 0;
+
+    return 1;
+}
+
 /**
 * update gm type/params, since cbs already implemented part of this funcation,
 * so we don't need to full implement spec.
@@ -144,6 +236,9 @@ static void global_motion_params(AV1DecContext *s)
             read_global_param(s, type, ref, 0);
             read_global_param(s, type, ref, 1);
         }
+        if (type <= AV1_WARP_MODEL_AFFINE) {
+            s->cur_frame.gm_invalid[ref] = !get_shear_params_valid(s, ref);
+        }
     }
 }
 
@@ -509,6 +604,9 @@ static int av1_frame_ref(AVCodecContext *avctx, AV1Frame *dst, const AV1Frame *s
 
     dst->spatial_id = src->spatial_id;
     dst->temporal_id = src->temporal_id;
+    memcpy(dst->gm_invalid,
+           src->gm_invalid,
+           AV1_NUM_REF_FRAMES * sizeof(uint8_t));
     memcpy(dst->gm_type,
            src->gm_type,
            AV1_NUM_REF_FRAMES * sizeof(uint8_t));
index 248a687..4e14058 100644 (file)
@@ -42,6 +42,7 @@ typedef struct AV1Frame {
     int temporal_id;
     int spatial_id;
 
+    uint8_t gm_invalid[AV1_NUM_REF_FRAMES];
     uint8_t gm_type[AV1_NUM_REF_FRAMES];
     int32_t gm_params[AV1_NUM_REF_FRAMES][6];
 
index 1a05ea0..d04d96a 100644 (file)
@@ -73,7 +73,7 @@ static void parse_avs3_nal_units(AVCodecParserContext *s, const uint8_t *buf,
             GetBitContext gb;
             int profile, ratecode;
 
-            init_get_bits(&gb, buf + 4, buf_size - 4);
+            init_get_bits8(&gb, buf + 4, buf_size - 4);
 
             s->key_frame = 1;
             s->pict_type = AV_PICTURE_TYPE_I;
index 8143151..0440df9 100644 (file)
@@ -45,6 +45,10 @@ static int bitpacked_decode_uyvy422(AVCodecContext *avctx, AVFrame *frame,
     /* there is no need to copy as the data already match
      * a known pixel format */
     frame->buf[0] = av_buffer_ref(avpkt->buf);
+    if (!frame->buf[0]) {
+        return AVERROR(ENOMEM);
+    }
+
     ret = av_image_fill_arrays(frame->data, frame->linesize, avpkt->data,
                                avctx->pix_fmt, avctx->width, avctx->height, 1);
     if (ret < 0) {
index 1eebf5a..672c0e4 100644 (file)
@@ -58,9 +58,6 @@ static av_cold int bmp_encode_init(AVCodecContext *avctx){
     case AV_PIX_FMT_MONOBLACK:
         avctx->bits_per_coded_sample = 1;
         break;
-    default:
-        av_log(avctx, AV_LOG_INFO, "unsupported pixel format\n");
-        return AVERROR(EINVAL);
     }
 
     return 0;
index 6fe6e9a..d98d3d4 100644 (file)
@@ -355,7 +355,7 @@ static int FUNC(set_frame_refs)(CodedBitstreamContext *ctx, RWContext *rw,
         AV1_REF_FRAME_ALTREF2, AV1_REF_FRAME_ALTREF
     };
     int8_t ref_frame_idx[AV1_REFS_PER_FRAME], used_frame[AV1_NUM_REF_FRAMES];
-    int8_t shifted_order_hints[AV1_NUM_REF_FRAMES];
+    int16_t shifted_order_hints[AV1_NUM_REF_FRAMES];
     int cur_frame_hint, latest_order_hint, earliest_order_hint, ref;
     int i, j;
 
index d954f0a..0974ee0 100644 (file)
@@ -1855,6 +1855,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
         .long_name = NULL_IF_CONFIG_SMALL("Digital Pictures SGA Video"),
         .props     = AV_CODEC_PROP_LOSSY,
     },
+    {
+        .id        = AV_CODEC_ID_GEM,
+        .type      = AVMEDIA_TYPE_VIDEO,
+        .name      = "gem",
+        .long_name = NULL_IF_CONFIG_SMALL("GEM Raster image"),
+        .props     = AV_CODEC_PROP_LOSSY,
+    },
 
     /* various PCM "codecs" */
     {
index 446bb2c..ab265ec 100644 (file)
@@ -307,6 +307,7 @@ enum AVCodecID {
     AV_CODEC_ID_CRI,
     AV_CODEC_ID_SIMBIOSIS_IMX,
     AV_CODEC_ID_SGA_VIDEO,
+    AV_CODEC_ID_GEM,
 
     /* various PCM "codecs" */
     AV_CODEC_ID_FIRST_AUDIO = 0x10000,     ///< A dummy id pointing at the start of audio codecs
index b45fb41..ebfb853 100644 (file)
@@ -363,10 +363,6 @@ static av_cold int dnxhd_encode_init(AVCodecContext *avctx)
     case AV_PIX_FMT_GBRP10:
         ctx->bit_depth = 10;
         break;
-    default:
-        av_log(avctx, AV_LOG_ERROR,
-               "pixel format is incompatible with DNxHD\n");
-        return AVERROR(EINVAL);
     }
 
     if ((ctx->profile == FF_PROFILE_DNXHR_444 && (avctx->pix_fmt != AV_PIX_FMT_YUV444P10 &&
index 09036a2..0db6aa8 100644 (file)
@@ -68,9 +68,6 @@ static av_cold int encode_init(AVCodecContext *avctx)
         if (avctx->bits_per_raw_sample)
             s->bits_per_component = avctx->bits_per_raw_sample;
         break;
-    default:
-        av_log(avctx, AV_LOG_INFO, "unsupported pixel format\n");
-        return -1;
     }
 
     return 0;
index c30b577..8a912bf 100644 (file)
@@ -139,7 +139,7 @@ static int fill_picture_parameters(const AVCodecContext *avctx, AVDXVAContext *c
         pp->frame_refs[i].Index  = ref_frame->buf[0] ? ref_idx : 0xFF;
 
         /* Global Motion */
-        pp->frame_refs[i].wminvalid = (h->cur_frame.gm_type[AV1_REF_FRAME_LAST + i] == AV1_WARP_MODEL_IDENTITY);
+        pp->frame_refs[i].wminvalid = h->cur_frame.gm_invalid[AV1_REF_FRAME_LAST + i];
         pp->frame_refs[i].wmtype    = h->cur_frame.gm_type[AV1_REF_FRAME_LAST + i];
         for (j = 0; j < 6; ++j) {
              pp->frame_refs[i].wmmat[j] = h->cur_frame.gm_params[AV1_REF_FRAME_LAST + i][j];
index 32c732f..dbcb850 100644 (file)
@@ -328,6 +328,7 @@ static const struct {
 } extract_tab[] = {
     { AV_CODEC_ID_AV1,        extract_extradata_av1     },
     { AV_CODEC_ID_AVS2,       extract_extradata_mpeg4   },
+    { AV_CODEC_ID_AVS3,       extract_extradata_mpeg4   },
     { AV_CODEC_ID_CAVS,       extract_extradata_mpeg4   },
     { AV_CODEC_ID_H264,       extract_extradata_h2645   },
     { AV_CODEC_ID_HEVC,       extract_extradata_h2645   },
@@ -396,6 +397,7 @@ static void extract_extradata_close(AVBSFContext *ctx)
 static const enum AVCodecID codec_ids[] = {
     AV_CODEC_ID_AV1,
     AV_CODEC_ID_AVS2,
+    AV_CODEC_ID_AVS3,
     AV_CODEC_ID_CAVS,
     AV_CODEC_ID_H264,
     AV_CODEC_ID_HEVC,
index d3d9c88..3b27b15 100644 (file)
@@ -55,6 +55,7 @@
 
 /** largest possible size of flac header */
 #define MAX_FRAME_HEADER_SIZE 16
+#define MAX_FRAME_VERIFY_SIZE (MAX_FRAME_HEADER_SIZE + 1)
 
 typedef struct FLACHeaderMarker {
     int offset;       /**< byte offset from start of FLACParseContext->buffer */
@@ -96,8 +97,34 @@ static int frame_header_is_valid(AVCodecContext *avctx, const uint8_t *buf,
                                  FLACFrameInfo *fi)
 {
     GetBitContext gb;
-    init_get_bits(&gb, buf, MAX_FRAME_HEADER_SIZE * 8);
-    return !ff_flac_decode_frame_header(avctx, &gb, fi, 127);
+    uint8_t subframe_type;
+
+    // header plus one byte from first subframe
+    init_get_bits(&gb, buf, MAX_FRAME_VERIFY_SIZE * 8);
+    if (ff_flac_decode_frame_header(avctx, &gb, fi, 127)) {
+        return 0;
+    }
+    // subframe zero bit
+    if (get_bits1(&gb) != 0) {
+        return 0;
+    }
+    // subframe type
+    // 000000 : SUBFRAME_CONSTANT
+    // 000001 : SUBFRAME_VERBATIM
+    // 00001x : reserved
+    // 0001xx : reserved
+    // 001xxx : if(xxx <= 4) SUBFRAME_FIXED, xxx=order ; else reserved
+    // 01xxxx : reserved
+    // 1xxxxx : SUBFRAME_LPC, xxxxx=order-1
+    subframe_type = get_bits(&gb, 6);
+    if (!(subframe_type == 0 ||
+          subframe_type == 1 ||
+          ((subframe_type >= 8) && (subframe_type <= 12)) ||
+          (subframe_type >= 32))) {
+        return 0;
+    }
+
+    return 1;
 }
 
 /**
@@ -170,7 +197,7 @@ static int find_headers_search_validate(FLACParseContext *fpc, int offset)
     uint8_t *header_buf;
     int size = 0;
     header_buf = flac_fifo_read_wrap(fpc, offset,
-                                     MAX_FRAME_HEADER_SIZE,
+                                     MAX_FRAME_VERIFY_SIZE + AV_INPUT_BUFFER_PADDING_SIZE,
                                      &fpc->wrap_buf,
                                      &fpc->wrap_buf_allocated_size);
     if (frame_header_is_valid(fpc->avctx, header_buf, &fi)) {
diff --git a/libavcodec/gemdec.c b/libavcodec/gemdec.c
new file mode 100644 (file)
index 0000000..2464dda
--- /dev/null
@@ -0,0 +1,347 @@
+/*
+ * GEM Raster image decoder
+ * Copyright (c) 2021 Peter Ross (pross@xvid.org)
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * GEM Raster image decoder
+ */
+
+#include "avcodec.h"
+#include "bytestream.h"
+#include "internal.h"
+
+static const uint32_t gem_color_palette[16]={
+    0xFFFFFFFF, 0xFFFF0000, 0xFF00FF00, 0xFFFFFF00,
+    0xFF0000FF, 0xFFFF00FF, 0xFF00FFFF, 0xFFAEAEAE,
+    0xFF555555, 0xFFAE0000, 0xFF00AE00, 0xFFAEAE00,
+    0xFF0000AE, 0xFFAE00AE, 0xFF00AEAE, 0xFF000000,
+};
+
+static const uint8_t gem_gray[256]={
+    0xFF, 0x7F, 0xBF, 0x3F, 0xDF, 0x5F, 0x9F, 0x1F, 0xEF, 0x6F, 0xAF, 0x2F, 0xCF, 0x4F, 0x8F, 0x0F,
+    0xF7, 0x77, 0xB7, 0x37, 0xD7, 0x57, 0x97, 0x17, 0xE7, 0x67, 0xA7, 0x27, 0xC7, 0x47, 0x87, 0x07,
+    0xFB, 0x7B, 0xBB, 0x3B, 0xDB, 0x5B, 0x9B, 0x1B, 0xEB, 0x6B, 0xAB, 0x2B, 0xCB, 0x4B, 0x8B, 0x0B,
+    0xF3, 0x73, 0xB3, 0x33, 0xD3, 0x53, 0x93, 0x13, 0xE3, 0x63, 0xA3, 0x23, 0xC3, 0x43, 0x83, 0x03,
+    0xFD, 0x7D, 0xBD, 0x3D, 0xDD, 0x5D, 0x9D, 0x1D, 0xED, 0x6D, 0xAD, 0x2D, 0xCD, 0x4D, 0x8D, 0x0D,
+    0xF5, 0x75, 0xB5, 0x35, 0xD5, 0x55, 0x95, 0x15, 0xE5, 0x65, 0xA5, 0x25, 0xC5, 0x45, 0x85, 0x05,
+    0xF9, 0x79, 0xB9, 0x39, 0xD9, 0x59, 0x99, 0x19, 0xE9, 0x69, 0xA9, 0x29, 0xC9, 0x49, 0x89, 0x09,
+    0xF1, 0x71, 0xB1, 0x31, 0xD1, 0x51, 0x91, 0x11, 0xE1, 0x61, 0xA1, 0x21, 0xC1, 0x41, 0x81, 0x01,
+    0xFE, 0x7E, 0xBE, 0x3E, 0xDE, 0x5E, 0x9E, 0x1E, 0xEE, 0x6E, 0xAE, 0x2E, 0xCE, 0x4E, 0x8E, 0x0E,
+    0xF6, 0x76, 0xB6, 0x36, 0xD6, 0x56, 0x96, 0x16, 0xE6, 0x66, 0xA6, 0x26, 0xC6, 0x46, 0x86, 0x06,
+    0xFA, 0x7A, 0xBA, 0x3A, 0xDA, 0x5A, 0x9A, 0x1A, 0xEA, 0x6A, 0xAA, 0x2A, 0xCA, 0x4A, 0x8A, 0x0A,
+    0xF2, 0x72, 0xB2, 0x32, 0xD2, 0x52, 0x92, 0x12, 0xE2, 0x62, 0xA2, 0x22, 0xC2, 0x42, 0x82, 0x02,
+    0xFC, 0x7C, 0xBC, 0x3C, 0xDC, 0x5C, 0x9C, 0x1C, 0xEC, 0x6C, 0xAC, 0x2C, 0xCC, 0x4C, 0x8C, 0x0C,
+    0xF4, 0x74, 0xB4, 0x34, 0xD4, 0x54, 0x94, 0x14, 0xE4, 0x64, 0xA4, 0x24, 0xC4, 0x44, 0x84, 0x04,
+    0xF8, 0x78, 0xB8, 0x38, 0xD8, 0x58, 0x98, 0x18, 0xE8, 0x68, 0xA8, 0x28, 0xC8, 0x48, 0x88, 0x08,
+    0xF0, 0x70, 0xB0, 0x30, 0xD0, 0x50, 0x90, 0x10, 0xE0, 0x60, 0xA0, 0x20, 0xC0, 0x40, 0x80, 0x00,
+};
+
+typedef struct {
+    int y, pl, x, vdup;
+} State;
+
+static void put_lines_bits(AVCodecContext *avctx, int planes, int row_width, int pixel_size, State * state, uint8_t * row, AVFrame *p)
+{
+    int pl_byte = state->pl / 8;
+    int pl_bit  = state->pl & 7;
+    for (int y = 0; y < state->vdup && (state->y + y) < avctx->height; y++)
+        for (int x = 0; x < row_width; x++)
+            for (int i = 7; i >= 0 && x * 8 + 7 - i < avctx->width; i--)
+                p->data[0][ (state->y + y) * p->linesize[0] + (x * 8 + 7 - i) * pixel_size + pl_byte] |= !!(row[x] & (1 << i)) << pl_bit;
+
+    state->pl++;
+    if (state->pl >= planes) {
+        state->pl = 0;
+        state->y += state->vdup;
+        state->vdup = 1;
+    }
+}
+
+static void put_lines_bytes(AVCodecContext *avctx, int planes, int row_width, int pixel_size, State * state, uint8_t * row, AVFrame *p)
+{
+    for (int y = 0; y < state->vdup && (state->y + y) < avctx->height; y++)
+        memcpy(p->data[0] + (state->y + y) * p->linesize[0], row, avctx->width * pixel_size);
+
+    state->y += state->vdup;
+    state->vdup = 1;
+}
+
+static int gem_decode_frame(AVCodecContext *avctx,
+                            void *data, int *got_frame,
+                            AVPacket *avpkt)
+{
+    const uint8_t *buf     = avpkt->data;
+    int buf_size           = avpkt->size;
+    const uint8_t *buf_end = buf + buf_size;
+    AVFrame *p             = data;
+    int header_size, planes, pattern_size, tag = 0, count_scalar = 1, ret;
+    unsigned int x, count, v;
+    GetByteContext gb;
+    uint32_t  *palette;
+    const uint8_t * b;
+    uint8_t * row;
+    int row_width, pixel_size;
+    State state = {.y = 0, .pl = 0, .x = 0, .vdup = 1};
+    void (*put_lines)(AVCodecContext *avctx, int planes, int row_width, int pixel_size, State * state, uint8_t * row, AVFrame *p);
+    int width, height;
+
+    if (buf_size <= 16)
+        return AVERROR_INVALIDDATA;
+
+    bytestream2_init(&gb, buf + 2, buf_size - 2);
+    header_size = bytestream2_get_be16(&gb);
+    if (header_size < 8 || buf_size <= header_size * 2)
+        return AVERROR_INVALIDDATA;
+
+    planes = bytestream2_get_be16(&gb);
+    pattern_size = bytestream2_get_be16(&gb);
+    avctx->sample_aspect_ratio.num = bytestream2_get_be16(&gb);
+    avctx->sample_aspect_ratio.den = bytestream2_get_be16(&gb);
+    width  = bytestream2_get_be16(&gb);
+    height = bytestream2_get_be16(&gb);
+    ret = ff_set_dimensions(avctx, width, height);
+    if (ret < 0)
+        return ret;
+
+    row_width = (avctx->width + 7) / 8;
+    put_lines = put_lines_bits;
+
+    if (header_size == 9) {
+        count_scalar = bytestream2_get_be16(&gb);
+        if (count_scalar != 3) {
+            avpriv_request_sample(avctx, "count_scalar=%d", count_scalar);
+            return AVERROR_PATCHWELCOME;
+        }
+        planes = 24;
+        avctx->pix_fmt = AV_PIX_FMT_BGR24;
+        pixel_size = 3;
+    } else if (planes == 15) {
+#if HAVE_BIGENDIAN
+        avctx->pix_fmt = AV_PIX_FMT_BGR555BE;
+#else
+        avctx->pix_fmt = AV_PIX_FMT_BGR555LE;
+#endif
+        pixel_size = 2;
+    } else if (planes == 16) {
+        avctx->pix_fmt = AV_PIX_FMT_RGB565BE;
+        pixel_size = 2;
+    } else if (planes == 24) {
+        avctx->pix_fmt = AV_PIX_FMT_RGB24;
+        pixel_size = 3;
+    } else if (planes == 32) {
+        avctx->pix_fmt = AV_PIX_FMT_0RGB;
+        pixel_size = 4;
+    } else {
+        avctx->pix_fmt = AV_PIX_FMT_PAL8;
+        pixel_size = 1;
+    }
+
+    if (header_size >= 11)
+        tag = bytestream2_peek_be32(&gb);
+
+    if ((ret = ff_get_buffer(avctx, p, 0)) < 0)
+        return ret;
+
+    p->pict_type = AV_PICTURE_TYPE_I;
+    p->key_frame = 1;
+    p->palette_has_changed = 1;
+    palette = (uint32_t  *)p->data[1];
+
+    if (tag == AV_RB32("STTT")) {
+        bytestream2_skip(&gb, 6);
+        if (planes == 4) {
+            for (int i = 0; i < (1 << planes); i++) {
+                int v = bytestream2_get_be16(&gb);
+                int r = ((v >> 8) & 0x7) << 5;
+                int g = ((v >> 4) & 0x7) << 5;
+                int b = ((v     ) & 0x7) << 5;
+                palette[i] = 0xFF000000 | r << 16 | g << 8 | b;
+            }
+        } else {
+            avpriv_request_sample(avctx, "STTT planes=%d", planes);
+            return AVERROR_PATCHWELCOME;
+        }
+    } else if (tag == AV_RB32("TIMG")) {
+        bytestream2_skip(&gb, 4);
+        if (planes != 15) {
+            avpriv_request_sample(avctx, "TIMG planes=%d", planes);
+            return AVERROR_PATCHWELCOME;
+        }
+    } else if (tag == AV_RB32("XIMG")) {
+        bytestream2_skip(&gb, 6);
+        if (planes == 1 || planes == 2 || planes == 4 || planes == 8) {
+            for (int i = 0; i < (1 << planes); i++) {
+                int r = (bytestream2_get_be16(&gb) * 51 + 100) / 200;
+                int g = (bytestream2_get_be16(&gb) * 51 + 100) / 200;
+                int b = (bytestream2_get_be16(&gb) * 51 + 100) / 200;
+                palette[i] = 0xFF000000 | r << 16 | g << 8 | b;
+            }
+        } else if (planes == 16) {
+            planes = 1;
+            row_width = ((avctx->width + 7)/8)*8 * pixel_size;
+            put_lines = put_lines_bytes;
+        } else if (planes == 24) {
+            planes = 1;
+            row_width = ((avctx->width + 15)/16)*16 * pixel_size;
+            put_lines = put_lines_bytes;
+        } else if (planes == 32) {
+            planes = 1;
+            row_width = avctx->width * pixel_size;
+            put_lines = put_lines_bytes;
+        } else {
+            avpriv_request_sample(avctx, "XIMG planes=%d", planes);
+            return AVERROR_PATCHWELCOME;
+        }
+    } else if (planes == 1) {
+        palette[0] = 0xFFFFFFFF;
+        palette[1] = 0xFF000000;
+    } else if (planes == 2 || planes == 3 || planes == 4) {
+        if (header_size == 9 + (1 << planes)) {
+            bytestream2_skip(&gb, 2);
+            for (int i = 0; i < (1 << planes); i++) {
+                int v = bytestream2_get_be16(&gb);
+                int r = ((v >> 8) & 0x7) << 5;
+                int g = ((v >> 4) & 0x7) << 5;
+                int b = ((v     ) & 0x7) << 5;
+                palette[i] = 0xFF000000 | r << 16 | g << 8 | b;
+            }
+        } else
+            memcpy(palette, gem_color_palette, sizeof(gem_color_palette));
+    } else if (planes == 8) {
+        for (int i = 0; i < 256; i++)
+            palette[i] = 0xFF000000 | (gem_gray[i]<<16) | (gem_gray[i]<<8) | gem_gray[i];
+    } else if (planes == 16) {
+        planes = 1;
+        row_width = avctx->width * pixel_size;
+        put_lines = put_lines_bytes;
+    } else if (planes == 24) {
+        planes = 1;
+        row_width = avctx->width * pixel_size;
+        put_lines = put_lines_bytes;
+    } else {
+        avpriv_request_sample(avctx, "planes=%d", planes);
+        return AVERROR_PATCHWELCOME;
+    }
+
+    ret = av_reallocp_array(&avctx->priv_data, planes, row_width);
+    if (ret < 0)
+        return ret;
+    row = avctx->priv_data;
+
+    memset(p->data[0], 0, avctx->height * p->linesize[0]);
+    b = buf + header_size * 2;
+    x = 0;
+
+#define SKIP \
+do { \
+    x++; \
+    if (x >= row_width) { \
+        put_lines(avctx, planes, row_width, pixel_size, &state, row + state.pl * row_width, p); \
+        if (state.y >= avctx->height) goto abort; \
+        x = 0; \
+    } \
+} while(0)
+
+#define PUT(v) \
+do { \
+    row[state.pl * row_width + x++] = v; \
+    if (x >= row_width) { \
+        put_lines(avctx, planes, row_width, pixel_size, &state, row + state.pl * row_width, p); \
+        if (state.y >= avctx->height) goto abort; \
+        x = 0; \
+    } \
+} while(0)
+
+    while(b < buf_end) {
+        int opcode = *b++;
+        if (opcode == 0x80) { /* copy */
+            if (b >= buf_end)
+                goto abort;
+            count = *b++;
+            if (!count)
+                count = 256;
+            count *= count_scalar;
+            for (int j = 0; j < count; j++) {
+                if (b >= buf_end)
+                    goto abort;
+                PUT(*b++);
+            }
+        } else if (opcode) { /* run */
+            count = opcode & 0x7f;
+            if (!count)
+                count = 256;
+            count *= count_scalar;
+            v = opcode & 0x80 ? 0xFF : 0x00;
+            for (int i = 0; i < count; i++)
+                PUT(v);
+        } else {
+            if (b >= buf_end)
+                goto abort;
+            count = *b++;
+            if (count) { /* pattern */
+                if (b > buf_end - pattern_size)
+                    goto abort;
+
+                count *= count_scalar;
+                for (int j = 0; j < count; j++)
+                    for (int k = 0; k < pattern_size; k++)
+                        PUT(b[k]);
+
+                b += pattern_size;
+            } else {
+                if (b >= buf_end)
+                    goto abort;
+                count = *b++;
+                if (count == 0xFF) { /* vertical duplication */
+                    if (b >= buf_end)
+                        goto abort;
+                    state.vdup = *b++;
+                    if (!state.vdup)
+                        state.vdup = 256;
+                } else { /* horizontal duplication */
+                    for (int i = 0; i < count + 1; i++)
+                        SKIP;
+                }
+            }
+        }
+    }
+
+abort:
+
+    *got_frame = 1;
+    return buf_size;
+}
+
+static av_cold int gem_close(AVCodecContext *avctx)
+{
+    av_freep(&avctx->priv_data);
+    return 0;
+}
+
+const AVCodec ff_gem_decoder = {
+    .name           = "gem",
+    .long_name      = NULL_IF_CONFIG_SMALL("GEM Raster image"),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_GEM,
+    .decode         = gem_decode_frame,
+    .close          = gem_close,
+    .capabilities   = AV_CODEC_CAP_DR1,
+};
index 66fd9bc..adf8a32 100644 (file)
@@ -252,9 +252,11 @@ int ff_h264_field_end(H264Context *h, H264SliceContext *sl, int in_setup)
                    "hardware accelerator failed to decode picture\n");
     } else if (!in_setup && cur->needs_fg && (!FIELD_PICTURE(h) || !h->first_field)) {
         AVFrameSideData *sd = av_frame_get_side_data(cur->f, AV_FRAME_DATA_FILM_GRAIN_PARAMS);
-        av_assert0(sd); // always present if `cur->needs_fg`
-        err = ff_h274_apply_film_grain(cur->f_grain, cur->f, &h->h274db,
-                                       (AVFilmGrainParams *) sd->data);
+
+        err = AVERROR_INVALIDDATA;
+        if (sd) // a decoding error may have happened before the side data could be allocated
+            err = ff_h274_apply_film_grain(cur->f_grain, cur->f, &h->h274db,
+                                           (AVFilmGrainParams *) sd->data);
         if (err < 0) {
             av_log(h->avctx, AV_LOG_WARNING, "Failed synthesizing film "
                    "grain, ignoring: %s\n", av_err2str(err));
index 201b224..89ea16a 100644 (file)
@@ -1911,8 +1911,13 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
         sl->max_pic_num  = 1 << (sps->log2_max_frame_num + 1);
     }
 
-    if (nal->type == H264_NAL_IDR_SLICE)
-        sl->idr_pic_id = get_ue_golomb_long(&sl->gb);
+    if (nal->type == H264_NAL_IDR_SLICE) {
+        unsigned idr_pic_id = get_ue_golomb_long(&sl->gb);
+        if (idr_pic_id < 65536) {
+            sl->idr_pic_id = idr_pic_id;
+        } else
+            av_log(h->avctx, AV_LOG_WARNING, "idr_pic_id is invalid\n");
+    }
 
     sl->poc_lsb = 0;
     sl->delta_poc_bottom = 0;
index 5ca41cc..6a5bf51 100644 (file)
@@ -944,7 +944,6 @@ static int finalize_frame(H264Context *h, AVFrame *dst, H264Picture *out, int *g
                                  out->mb_type,
                                  out->qscale_table,
                                  out->motion_val,
-                                 NULL,
                                  out->mb_width, out->mb_height, out->mb_stride, 1);
         }
     }
index 20401ba..a69f941 100644 (file)
@@ -145,8 +145,8 @@ static void deblock_8x8_c(int8_t *out, const int out_stride)
     for (int y = 0; y < 8; y++) {
         const int8_t l1 = out[-2], l0 = out[-1];
         const int8_t r0 = out[0], r1 = out[1];
-        out[0]  = (l0 + (r0 << 1) + r1) >> 2;
-        out[-1] = (r0 + (l0 << 1) + l1) >> 2;
+        out[0]  = (l0 + r0 * 2 + r1) >> 2;
+        out[-1] = (r0 + l0 * 2 + l1) >> 2;
         out += out_stride;
     }
 }
index 6b98240..3c45b5a 100644 (file)
 #include "libavutil/common.h"
 #include "libavutil/internal.h"
 
-#include "cabac_functions.h"
 #include "hevcdec.h"
 
-#include "bit_depth_template.c"
-
 #define LUMA 0
 #define CB 1
 #define CR 2
@@ -141,7 +138,7 @@ static int get_qPy(HEVCContext *s, int xC, int yC)
 static void copy_CTB(uint8_t *dst, const uint8_t *src, int width, int height,
                      ptrdiff_t stride_dst, ptrdiff_t stride_src)
 {
-int i, j;
+    int i, j;
 
     if (((intptr_t)dst | (intptr_t)src | stride_dst | stride_src) & 15) {
         for (i = 0; i < height; i++) {
@@ -322,18 +319,18 @@ static void sao_filter_CTB(HEVCContext *s, int x, int y)
                            x_ctb, y_ctb);
             if (s->ps.pps->transquant_bypass_enable_flag ||
                 (s->ps.sps->pcm.loop_filter_disable_flag && s->ps.sps->pcm_enabled_flag)) {
-            dst = lc->edge_emu_buffer;
-            stride_dst = 2*MAX_PB_SIZE;
-            copy_CTB(dst, src, width << s->ps.sps->pixel_shift, height, stride_dst, stride_src);
-            s->hevcdsp.sao_band_filter[tab](src, dst, stride_src, stride_dst,
-                                            sao->offset_val[c_idx], sao->band_position[c_idx],
-                                            width, height);
-            restore_tqb_pixels(s, src, dst, stride_src, stride_dst,
-                               x, y, width, height, c_idx);
+                dst = lc->edge_emu_buffer;
+                stride_dst = 2*MAX_PB_SIZE;
+                copy_CTB(dst, src, width << s->ps.sps->pixel_shift, height, stride_dst, stride_src);
+                s->hevcdsp.sao_band_filter[tab](src, dst, stride_src, stride_dst,
+                                                sao->offset_val[c_idx], sao->band_position[c_idx],
+                                                width, height);
+                restore_tqb_pixels(s, src, dst, stride_src, stride_dst,
+                                   x, y, width, height, c_idx);
             } else {
-            s->hevcdsp.sao_band_filter[tab](src, src, stride_src, stride_src,
-                                            sao->offset_val[c_idx], sao->band_position[c_idx],
-                                            width, height);
+                s->hevcdsp.sao_band_filter[tab](src, src, stride_src, stride_src,
+                                                sao->offset_val[c_idx], sao->band_position[c_idx],
+                                                width, height);
             }
             sao->type_idx[c_idx] = SAO_APPLIED;
             break;
index 4f6d985..06e42d9 100644 (file)
@@ -38,6 +38,8 @@ void ff_hevc_unref_frame(HEVCContext *s, HEVCFrame *frame, int flags)
     frame->flags &= ~flags;
     if (!frame->flags) {
         ff_thread_release_buffer(s->avctx, &frame->tf);
+        ff_thread_release_buffer(s->avctx, &frame->tf_grain);
+        frame->needs_fg = 0;
 
         av_buffer_unref(&frame->tab_mvf_buf);
         frame->tab_mvf = NULL;
@@ -208,7 +210,7 @@ int ff_hevc_output_frame(HEVCContext *s, AVFrame *out, int flush)
         if (nb_output) {
             HEVCFrame *frame = &s->DPB[min_idx];
 
-            ret = av_frame_ref(out, frame->frame);
+            ret = av_frame_ref(out, frame->needs_fg ? frame->frame_grain : frame->frame);
             if (frame->flags & HEVC_FRAME_FLAG_BUMPING)
                 ff_hevc_unref_frame(s, frame, HEVC_FRAME_FLAG_OUTPUT | HEVC_FRAME_FLAG_BUMPING);
             else
@@ -216,6 +218,12 @@ int ff_hevc_output_frame(HEVCContext *s, AVFrame *out, int flush)
             if (ret < 0)
                 return ret;
 
+            if (frame->needs_fg && (ret = av_frame_copy_props(out, frame->frame)) < 0)
+                return ret;
+
+            if (!(s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN))
+                av_frame_remove_side_data(out, AV_FRAME_DATA_FILM_GRAIN_PARAMS);
+
             av_log(s->avctx, AV_LOG_DEBUG,
                    "Output frame with POC %d.\n", frame->poc);
             return 1;
index 29d0346..7fd8226 100644 (file)
@@ -181,9 +181,6 @@ static int decode_registered_user_data_closed_caption(HEVCSEIA53Caption *s, GetB
 {
     int ret;
 
-    if (size < 3)
-       return AVERROR_INVALIDDATA;
-
     ret = ff_parse_a53_cc(&s->buf_ref, gb->buffer + get_bits_count(gb) / 8, size);
 
     if (ret < 0)
index 57a6175..246ffd7 100644 (file)
@@ -385,6 +385,9 @@ static int export_stream_params_from_sei(HEVCContext *s)
         avctx->color_trc = s->sei.alternative_transfer.preferred_transfer_characteristics;
     }
 
+    if (s->sei.film_grain_characteristics.present)
+        avctx->properties |= FF_CODEC_PROPERTY_FILM_GRAIN;
+
     return 0;
 }
 
@@ -2881,14 +2884,14 @@ static int set_side_data(HEVCContext *s)
         s->sei.timecode.num_clock_ts = 0;
     }
 
-    if (s->sei.film_grain_characteristics.present &&
-        (s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN)) {
+    if (s->sei.film_grain_characteristics.present) {
         HEVCSEIFilmGrainCharacteristics *fgc = &s->sei.film_grain_characteristics;
         AVFilmGrainParams *fgp = av_film_grain_params_create_side_data(out);
         if (!fgp)
             return AVERROR(ENOMEM);
 
         fgp->type = AV_FILM_GRAIN_PARAMS_H274;
+        fgp->seed = s->ref->poc; /* no poc_offset in HEVC */
 
         fgp->codec.h274.model_id = fgc->model_id;
         if (fgc->separate_colour_description_present_flag) {
@@ -2983,6 +2986,18 @@ static int hevc_frame_start(HEVCContext *s)
 
     s->ref->frame->key_frame = IS_IRAP(s);
 
+    s->ref->needs_fg = s->sei.film_grain_characteristics.present &&
+        !(s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) &&
+        !s->avctx->hwaccel;
+
+    if (s->ref->needs_fg) {
+        s->ref->frame_grain->format = s->ref->frame->format;
+        s->ref->frame_grain->width = s->ref->frame->width;
+        s->ref->frame_grain->height = s->ref->frame->height;
+        if ((ret = ff_thread_get_buffer(s->avctx, &s->ref->tf_grain, 0)) < 0)
+            goto fail;
+    }
+
     ret = set_side_data(s);
     if (ret < 0)
         goto fail;
@@ -3009,6 +3024,28 @@ fail:
     return ret;
 }
 
+static int hevc_frame_end(HEVCContext *s)
+{
+    HEVCFrame *out = s->ref;
+    const AVFrameSideData *sd;
+    int ret;
+
+    if (out->needs_fg) {
+        sd = av_frame_get_side_data(out->frame, AV_FRAME_DATA_FILM_GRAIN_PARAMS);
+        av_assert0(out->frame_grain->buf[0] && sd);
+        ret = ff_h274_apply_film_grain(out->frame_grain, out->frame, &s->h274db,
+                                       (AVFilmGrainParams *) sd->data);
+
+        if (ret < 0) {
+            av_log(s->avctx, AV_LOG_WARNING, "Failed synthesizing film "
+                   "grain, ignoring: %s\n", av_err2str(ret));
+            out->needs_fg = 0;
+        }
+    }
+
+    return 0;
+}
+
 static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal)
 {
     HEVCLocalContext *lc = s->HEVClc;
@@ -3167,6 +3204,9 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal)
             else
                 ctb_addr_ts = hls_slice_data(s);
             if (ctb_addr_ts >= (s->ps.sps->ctb_width * s->ps.sps->ctb_height)) {
+                ret = hevc_frame_end(s);
+                if (ret < 0)
+                    goto fail;
                 s->is_decoded = 1;
             }
 
@@ -3426,6 +3466,13 @@ static int hevc_ref_frame(HEVCContext *s, HEVCFrame *dst, HEVCFrame *src)
     if (ret < 0)
         return ret;
 
+    if (src->needs_fg) {
+        ret = ff_thread_ref_frame(&dst->tf_grain, &src->tf_grain);
+        if (ret < 0)
+            return ret;
+        dst->needs_fg = 1;
+    }
+
     dst->tab_mvf_buf = av_buffer_ref(src->tab_mvf_buf);
     if (!dst->tab_mvf_buf)
         goto fail;
@@ -3478,6 +3525,7 @@ static av_cold int hevc_decode_free(AVCodecContext *avctx)
     for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
         ff_hevc_unref_frame(s, &s->DPB[i], ~0);
         av_frame_free(&s->DPB[i].frame);
+        av_frame_free(&s->DPB[i].frame_grain);
     }
 
     ff_hevc_ps_uninit(&s->ps);
@@ -3531,6 +3579,11 @@ static av_cold int hevc_init_context(AVCodecContext *avctx)
         if (!s->DPB[i].frame)
             goto fail;
         s->DPB[i].tf.f = s->DPB[i].frame;
+
+        s->DPB[i].frame_grain = av_frame_alloc();
+        if (!s->DPB[i].frame_grain)
+            goto fail;
+        s->DPB[i].tf_grain.f = s->DPB[i].frame_grain;
     }
 
     s->max_ra = INT_MAX;
index 482638a..77fdf90 100644 (file)
 #include "hevc_ps.h"
 #include "hevc_sei.h"
 #include "hevcdsp.h"
+#include "h274.h"
 #include "internal.h"
 #include "thread.h"
 #include "videodsp.h"
 
 #define SHIFT_CTB_WPP 2
 
-//TODO: check if this is really the maximum
-#define MAX_TRANSFORM_DEPTH 5
-
 #define MAX_TB_SIZE 32
 #define MAX_QP 51
 #define DEFAULT_INTRA_TC_OFFSET 2
@@ -395,7 +393,10 @@ typedef struct DBParams {
 
 typedef struct HEVCFrame {
     AVFrame *frame;
+    AVFrame *frame_grain;
     ThreadFrame tf;
+    ThreadFrame tf_grain;
+    int needs_fg; /* 1 if grain needs to be applied by the decoder */
     MvField *tab_mvf;
     RefPicList *refPicList;
     RefPicListTab **rpl_tab;
@@ -525,6 +526,7 @@ typedef struct HEVCContext {
     HEVCDSPContext hevcdsp;
     VideoDSPContext vdsp;
     BswapDSPContext bdsp;
+    H274FilmGrainDatabase h274db;
     int8_t *qp_y_tab;
     uint8_t *horizontal_bs;
     uint8_t *vertical_bs;
index 3b5e956..7220648 100644 (file)
@@ -119,7 +119,7 @@ static int lag_decode_prob(GetBitContext *gb, uint32_t *value)
     bits--;
     if (bits < 0 || bits > 31) {
         *value = 0;
-        return -1;
+        return AVERROR_INVALIDDATA;
     } else if (bits == 0) {
         *value = 0;
         return 0;
@@ -147,17 +147,17 @@ static int lag_read_prob_header(lag_rac *rac, GetBitContext *gb)
     for (i = 1; i < 257; i++) {
         if (lag_decode_prob(gb, &rac->prob[i]) < 0) {
             av_log(rac->avctx, AV_LOG_ERROR, "Invalid probability encountered.\n");
-            return -1;
+            return AVERROR_INVALIDDATA;
         }
         if ((uint64_t)cumul_prob + rac->prob[i] > UINT_MAX) {
             av_log(rac->avctx, AV_LOG_ERROR, "Integer overflow encountered in cumulative probability calculation.\n");
-            return -1;
+            return AVERROR_INVALIDDATA;
         }
         cumul_prob += rac->prob[i];
         if (!rac->prob[i]) {
             if (lag_decode_prob(gb, &prob)) {
                 av_log(rac->avctx, AV_LOG_ERROR, "Invalid probability run encountered.\n");
-                return -1;
+                return AVERROR_INVALIDDATA;
             }
             if (prob > 256 - i)
                 prob = 256 - i;
@@ -170,7 +170,7 @@ static int lag_read_prob_header(lag_rac *rac, GetBitContext *gb)
 
     if (!cumul_prob) {
         av_log(rac->avctx, AV_LOG_ERROR, "All probabilities are 0!\n");
-        return -1;
+        return AVERROR_INVALIDDATA;
     }
 
     if (nnz == 1 && (show_bits_long(gb, 32) & 0xFFFFFF)) {
@@ -203,7 +203,7 @@ static int lag_read_prob_header(lag_rac *rac, GetBitContext *gb)
         if (scaled_cumul_prob > cumulative_target) {
             av_log(rac->avctx, AV_LOG_ERROR,
                    "Scaled probabilities are larger than target!\n");
-            return -1;
+            return AVERROR_INVALIDDATA;
         }
 
         scaled_cumul_prob = cumulative_target - scaled_cumul_prob;
@@ -459,8 +459,8 @@ static int lag_decode_arith_plane(LagarithContext *l, uint8_t *dst,
         if ((ret = init_get_bits8(&gb, src + offset, src_size - offset)) < 0)
             return ret;
 
-        if (lag_read_prob_header(&rac, &gb) < 0)
-            return -1;
+        if ((ret = lag_read_prob_header(&rac, &gb)) < 0)
+            return ret;
 
         ff_lag_rac_init(&rac, &gb, length - stride);
         for (i = 0; i < height; i++) {
@@ -507,7 +507,7 @@ static int lag_decode_arith_plane(LagarithContext *l, uint8_t *dst,
     } else {
         av_log(l->avctx, AV_LOG_ERROR,
                "Invalid zero run escape code! (%#x)\n", esc_count);
-        return -1;
+        return AVERROR_INVALIDDATA;
     }
 
     if (l->avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
@@ -547,7 +547,7 @@ static int lag_decode_frame(AVCodecContext *avctx,
     uint32_t offs[4];
     uint8_t *srcs[4];
     int i, j, planes = 3;
-    int ret;
+    int ret = 0;
 
     p->key_frame = 1;
     p->pict_type = AV_PICTURE_TYPE_I;
@@ -630,11 +630,14 @@ static int lag_decode_frame(AVCodecContext *avctx,
                 return AVERROR_INVALIDDATA;
             }
 
-        for (i = 0; i < planes; i++)
-            lag_decode_arith_plane(l, srcs[i],
+        for (i = 0; i < planes; i++) {
+            ret = lag_decode_arith_plane(l, srcs[i],
                                    avctx->width, avctx->height,
                                    -p->linesize[i], buf + offs[i],
                                    buf_size - offs[i]);
+            if (ret < 0)
+                return ret;
+        }
         for (i = 0; i < avctx->height; i++) {
             l->llviddsp.add_bytes(p->data[0] + i * p->linesize[0], p->data[1] + i * p->linesize[1], avctx->width);
             l->llviddsp.add_bytes(p->data[2] + i * p->linesize[2], p->data[1] + i * p->linesize[1], avctx->width);
@@ -658,13 +661,17 @@ static int lag_decode_frame(AVCodecContext *avctx,
             return AVERROR_INVALIDDATA;
         }
 
-        lag_decode_arith_plane(l, p->data[0], avctx->width, avctx->height,
+        ret = lag_decode_arith_plane(l, p->data[0], avctx->width, avctx->height,
                                p->linesize[0], buf + offset_ry,
                                buf_size - offset_ry);
-        lag_decode_arith_plane(l, p->data[1], (avctx->width + 1) / 2,
+        if (ret < 0)
+            return ret;
+        ret = lag_decode_arith_plane(l, p->data[1], (avctx->width + 1) / 2,
                                avctx->height, p->linesize[1],
                                buf + offset_gu, buf_size - offset_gu);
-        lag_decode_arith_plane(l, p->data[2], (avctx->width + 1) / 2,
+        if (ret < 0)
+            return ret;
+        ret = lag_decode_arith_plane(l, p->data[2], (avctx->width + 1) / 2,
                                avctx->height, p->linesize[2],
                                buf + offset_bv, buf_size - offset_bv);
         break;
@@ -682,13 +689,17 @@ static int lag_decode_frame(AVCodecContext *avctx,
             return AVERROR_INVALIDDATA;
         }
 
-        lag_decode_arith_plane(l, p->data[0], avctx->width, avctx->height,
+        ret = lag_decode_arith_plane(l, p->data[0], avctx->width, avctx->height,
                                p->linesize[0], buf + offset_ry,
                                buf_size - offset_ry);
-        lag_decode_arith_plane(l, p->data[2], (avctx->width + 1) / 2,
+        if (ret < 0)
+            return ret;
+        ret = lag_decode_arith_plane(l, p->data[2], (avctx->width + 1) / 2,
                                (avctx->height + 1) / 2, p->linesize[2],
                                buf + offset_gu, buf_size - offset_gu);
-        lag_decode_arith_plane(l, p->data[1], (avctx->width + 1) / 2,
+        if (ret < 0)
+            return ret;
+        ret = lag_decode_arith_plane(l, p->data[1], (avctx->width + 1) / 2,
                                (avctx->height + 1) / 2, p->linesize[1],
                                buf + offset_bv, buf_size - offset_bv);
         break;
@@ -698,6 +709,9 @@ static int lag_decode_frame(AVCodecContext *avctx,
         return AVERROR_PATCHWELCOME;
     }
 
+    if (ret < 0)
+        return ret;
+
     *got_frame = 1;
 
     return buf_size;
index a02ba6a..6196da2 100644 (file)
@@ -205,6 +205,7 @@ static int config_enc_params(EbSvtAv1EncConfiguration *param,
         param->frame_rate_denominator = avctx->time_base.num * avctx->ticks_per_frame;
     }
 
+    param->enable_tpl_la = !!param->rate_control_mode;
     if (param->rate_control_mode) {
         param->max_qp_allowed       = avctx->qmax;
         param->min_qp_allowed       = avctx->qmin;
index 0f88671..21f434d 100644 (file)
@@ -32,6 +32,7 @@
 #include "internal.h"
 #include "packet_internal.h"
 #include "atsc_a53.h"
+#include "sei.h"
 
 #if defined(_MSC_VER)
 #define X264_API_IMPORTS 1
@@ -317,6 +318,9 @@ static int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame,
     x4->pic.img.i_plane = avfmt2_num_planes(ctx->pix_fmt);
 
     if (frame) {
+        x264_sei_t *sei = &x4->pic.extra_sei;
+        unsigned int sei_data_size = 0;
+
         for (i = 0; i < x4->pic.img.i_plane; i++) {
             x4->pic.img.plane[i]    = frame->data[i];
             x4->pic.img.i_stride[i] = frame->linesize[i];
@@ -439,6 +443,30 @@ static int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame,
                 }
             }
         }
+
+        for (int j = 0; j < frame->nb_side_data; j++) {
+            AVFrameSideData *side_data = frame->side_data[j];
+            void *tmp;
+            x264_sei_payload_t *sei_payload;
+            if (side_data->type != AV_FRAME_DATA_SEI_UNREGISTERED)
+                continue;
+            tmp = av_fast_realloc(sei->payloads, &sei_data_size, (sei->num_payloads + 1) * sizeof(*sei_payload));
+            if (!tmp) {
+                av_freep(&x4->pic.prop.quant_offsets);
+                return AVERROR(ENOMEM);
+            }
+            sei->payloads = tmp;
+            sei->sei_free = av_free;
+            sei_payload = &sei->payloads[sei->num_payloads];
+            sei_payload->payload = av_memdup(side_data->data, side_data->size);
+            if (!sei_payload->payload) {
+                av_freep(&x4->pic.prop.quant_offsets);
+                return AVERROR(ENOMEM);
+            }
+            sei_payload->payload_size = side_data->size;
+            sei_payload->payload_type = SEI_TYPE_USER_DATA_UNREGISTERED;
+            sei->num_payloads++;
+        }
     }
 
     do {
index 5aef810..ab32d4c 100644 (file)
@@ -34,6 +34,8 @@
 #include "thread.h"
 #include "lossless_videoencdsp.h"
 
+#define MAGICYUV_EXTRADATA_SIZE 32
+
 typedef enum Prediction {
     LEFT = 1,
     GRADIENT,
@@ -187,10 +189,6 @@ static av_cold int magy_encode_init(AVCodecContext *avctx)
         avctx->codec_tag = MKTAG('M', '8', 'G', '0');
         s->format = 0x6b;
         break;
-    default:
-        av_log(avctx, AV_LOG_ERROR, "Unsupported pixel format: %d\n",
-               avctx->pix_fmt);
-        return AVERROR_INVALIDDATA;
     }
 
     ff_llvidencdsp_init(&s->llvidencdsp);
@@ -214,7 +212,7 @@ static av_cold int magy_encode_init(AVCodecContext *avctx)
     case MEDIAN:   s->predict = median_predict;   break;
     }
 
-    avctx->extradata_size = 32;
+    avctx->extradata_size = MAGICYUV_EXTRADATA_SIZE;
 
     avctx->extradata = av_mallocz(avctx->extradata_size +
                                   AV_INPUT_BUFFER_PADDING_SIZE);
@@ -224,7 +222,7 @@ static av_cold int magy_encode_init(AVCodecContext *avctx)
         return AVERROR(ENOMEM);
     }
 
-    bytestream2_init_writer(&pb, avctx->extradata, avctx->extradata_size);
+    bytestream2_init_writer(&pb, avctx->extradata, MAGICYUV_EXTRADATA_SIZE);
     bytestream2_put_le32(&pb, MKTAG('M', 'A', 'G', 'Y'));
     bytestream2_put_le32(&pb, 32);
     bytestream2_put_byte(&pb, 7);
index 6c29409..68c270e 100644 (file)
@@ -73,6 +73,7 @@ typedef struct SubStream {
     uint64_t    mask;
     /// The matrix encoding mode for this substream
     enum AVMatrixEncoding matrix_encoding;
+    enum AVMatrixEncoding prev_matrix_encoding;
 
     /// Channel coding parameters for channels in the substream
     ChannelParams channel_params[MAX_CHANNELS];
@@ -1123,8 +1124,12 @@ static int output_data(MLPDecodeContext *m, unsigned int substr,
                                                     is32);
 
     /* Update matrix encoding side data */
-    if ((ret = ff_side_data_update_matrix_encoding(frame, s->matrix_encoding)) < 0)
-        return ret;
+    if (s->matrix_encoding != s->prev_matrix_encoding) {
+        if ((ret = ff_side_data_update_matrix_encoding(frame, s->matrix_encoding)) < 0)
+            return ret;
+
+        s->prev_matrix_encoding = s->matrix_encoding;
+    }
 
     *got_frame_ptr = 1;
 
@@ -1244,6 +1249,12 @@ static int read_access_unit(AVCodecContext *avctx, void* data,
 
     for (substr = 0; substr <= m->max_decoded_substream; substr++) {
         SubStream *s = &m->substream[substr];
+
+        if (substr != m->max_decoded_substream &&
+            m->substream[m->max_decoded_substream].min_channel == 0 &&
+            m->substream[m->max_decoded_substream].max_channel == avctx->channels - 1)
+            goto skip_substr;
+
         init_get_bits(&gb, buf, substream_data_len[substr] * 8);
 
         m->matrix_changed = 0;
@@ -1317,6 +1328,7 @@ next_substr:
             av_log(m->avctx, AV_LOG_ERROR,
                    "No restart header present in substream %d.\n", substr);
 
+skip_substr:
         buf += substream_data_len[substr];
     }
 
@@ -1353,6 +1365,7 @@ static void mlp_decode_flush(AVCodecContext *avctx)
         SubStream *s = &m->substream[substr];
 
         s->lossless_check_data = 0xffffffff;
+        s->prev_matrix_encoding = 0;
     }
 }
 
index e6ada1c..09b2902 100644 (file)
@@ -2265,7 +2265,7 @@ static int mpeg_decode_a53_cc(AVCodecContext *avctx,
         int cc_count = 0;
         int i, ret;
 
-        init_get_bits(&gb, p + 2, buf_size - 2);
+        init_get_bits8(&gb, p + 2, buf_size - 2);
         cc_count = get_bits(&gb, 5);
         if (cc_count > 0) {
             int old_size = s1->a53_buf_ref ? s1->a53_buf_ref->size : 0;
index 4fd9e3a..bbb6ff1 100644 (file)
@@ -1638,7 +1638,6 @@ static int decode_frame_adu(AVCodecContext *avctx, void *data,
     MPADecodeContext *s = avctx->priv_data;
     uint32_t header;
     int len, ret;
-    int av_unused out_size;
 
     len = buf_size;
 
index e5105ec..4cbc474 100644 (file)
@@ -102,7 +102,6 @@ void ff_draw_horiz_band(AVCodecContext *avctx,
 
 void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict, uint8_t *mbskip_table,
                          uint32_t *mbtype_table, int8_t *qscale_table, int16_t (*motion_val[2])[2],
-                         int *low_delay,
                          int mb_width, int mb_height, int mb_stride, int quarter_sample)
 {
     if ((avctx->export_side_data & AV_CODEC_EXPORT_DATA_MVS) && mbtype_table && motion_val[0]) {
index 5aeff47..0770585 100644 (file)
@@ -142,7 +142,6 @@ void ff_draw_horiz_band(AVCodecContext *avctx, AVFrame *cur, AVFrame *last,
  */
 void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict, uint8_t *mbskip_table,
                          uint32_t *mbtype_table, int8_t *qscale_table, int16_t (*motion_val[2])[2],
-                         int *low_delay,
                          int mb_width, int mb_height, int mb_stride, int quarter_sample);
 
 #endif /* AVCODEC_MPEGUTILS_H */
index 5383f9d..ba5b519 100644 (file)
@@ -1417,7 +1417,7 @@ void ff_mpv_frame_end(MpegEncContext *s)
 void ff_print_debug_info(MpegEncContext *s, Picture *p, AVFrame *pict)
 {
     ff_print_debug_info2(s->avctx, pict, s->mbskip_table, p->mb_type,
-                         p->qscale_table, p->motion_val, &s->low_delay,
+                         p->qscale_table, p->motion_val,
                          s->mb_width, s->mb_height, s->mb_stride, s->quarter_sample);
 }
 
index 5ab1a22..6b40c18 100644 (file)
@@ -24,6 +24,7 @@ extern const AVCodecParser ff_aac_parser;
 extern const AVCodecParser ff_aac_latm_parser;
 extern const AVCodecParser ff_ac3_parser;
 extern const AVCodecParser ff_adx_parser;
+extern const AVCodecParser ff_amr_parser;
 extern const AVCodecParser ff_av1_parser;
 extern const AVCodecParser ff_avs2_parser;
 extern const AVCodecParser ff_avs3_parser;
index 21938c8..b7e00f2 100644 (file)
@@ -852,9 +852,6 @@ static av_cold int prores_encode_init(AVCodecContext *avctx)
             avctx->profile = FF_PROFILE_PRORES_4444;
             av_log(avctx, AV_LOG_INFO,
                    "encoding with ProRes 4444+ (ap4h) profile\n");
-        } else {
-            av_log(avctx, AV_LOG_ERROR, "Unknown pixel format\n");
-            return AVERROR(EINVAL);
         }
     } else if (avctx->profile < FF_PROFILE_PRORES_PROXY
             || avctx->profile > FF_PROFILE_PRORES_XQ) {
index 7fedf73..b328e21 100644 (file)
@@ -721,6 +721,7 @@ static int decode_frame(AVCodecContext *avctx,
             break;
         default:
             bytestream2_skip(gb, size);
+            ret = 0;
         }
 
         if (ret < 0)
index 0ecf0fc..bdb2491 100644 (file)
@@ -447,6 +447,8 @@ static int decode_envelope(SirenContext *s, GetBitContext *gb,
         int index = 0;
 
         do {
+            if (get_bits_left(gb) < 4 + number_of_regions - i + s->checksum_bits)
+                return AVERROR_INVALIDDATA;
             index = differential_decoder_tree[i - 1][index][get_bits1(gb)];
         } while (index > 0);
 
@@ -724,9 +726,11 @@ static int siren_decode(AVCodecContext *avctx, void *data,
 
     skip_bits(gb, s->sample_rate_bits);
 
-    decode_envelope(s, gb, s->number_of_regions,
+    ret = decode_envelope(s, gb, s->number_of_regions,
                     s->decoder_standard_deviation,
                     s->absolute_region_power_index, s->esf_adjustment);
+    if (ret < 0)
+        return ret;
 
     rate_control = get_bits(gb, 4);
 
@@ -760,7 +764,37 @@ static int siren_decode(AVCodecContext *avctx, void *data,
             frame_error = 1;
     }
 
-    skip_bits(gb, s->checksum_bits);
+    if ((avctx->err_recognition & AV_EF_CRCCHECK) && s->checksum_bits) {
+        static const uint16_t ChecksumTable[4] = {0x7F80, 0x7878, 0x6666, 0x5555};
+        int wpf, checksum, sum, calculated_checksum, temp1;
+
+        checksum = get_bits(gb, s->checksum_bits);
+
+        wpf = bits_per_frame / 16;
+        sum = 0;
+        for (int i = 0; i < wpf - 1; i++)
+            sum ^= AV_RB16(avpkt->data + i * 2) << (i % 15);
+        sum ^= (AV_RB16(avpkt->data + (wpf - 1) * 2) & ~checksum) << ((wpf - 1) % 15);
+        sum = (sum >> 15) ^ (sum & 0x7FFF);
+
+        calculated_checksum = 0;
+        for (int i = 0; i < 4; i++) {
+            temp1 = ChecksumTable[i] & sum;
+
+            for (int j = 8; j > 0; j >>= 1)
+                temp1 ^= temp1 >> j;
+
+            calculated_checksum <<= 1;
+            calculated_checksum |= temp1 & 1;
+        }
+
+        if (checksum != calculated_checksum) {
+            av_log(avctx, AV_LOG_WARNING, "Invalid checksum\n");
+            if (avctx->err_recognition & AV_EF_EXPLODE)
+                return AVERROR_INVALIDDATA;
+            frame_error = 1;
+        }
+    }
 
     if (frame_error) {
         memcpy(s->imdct_in, s->backup_frame, number_of_valid_coefs * sizeof(float));
index 55ebfba..96b0d32 100644 (file)
@@ -120,17 +120,12 @@ static av_cold int encode_init(AVCodecContext *avctx)
 /*    case AV_PIX_FMT_RGB32:
         s->colorspace= 1;
         break;*/
-    default:
-        av_log(avctx, AV_LOG_ERROR, "pixel format not supported\n");
-        return AVERROR_PATCHWELCOME;
     }
 
     ret = av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift,
                                            &s->chroma_v_shift);
-    if (ret) {
-        av_log(avctx, AV_LOG_ERROR, "pixel format invalid or unknown\n");
+    if (ret)
         return ret;
-    }
 
     ff_set_cmp(&s->mecc, s->mecc.me_cmp, s->avctx->me_cmp);
     ff_set_cmp(&s->mecc, s->mecc.me_sub_cmp, s->avctx->me_sub_cmp);
diff --git a/libavcodec/speexdata.h b/libavcodec/speexdata.h
new file mode 100644 (file)
index 0000000..476a8c1
--- /dev/null
@@ -0,0 +1,780 @@
+/*
+ * Copyright 2002-2008  Xiph.org Foundation
+ * Copyright 2002-2008  Jean-Marc Valin
+ * Copyright 2005-2007  Analog Devices Inc.
+ * Copyright 2005-2008  Commonwealth Scientific and Industrial Research Organisation (CSIRO)
+ * Copyright 1993, 2002, 2006 David Rowe
+ * Copyright 2003       EpicGames
+ * Copyright 1992-1994  Jutta Degener, Carsten Bormann
+
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+
+ * - 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.
+
+ * - Neither the name of the Xiph.org Foundation 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 COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``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 FOUNDATION OR
+ * CONTRIBUTORS 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.
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_SPEEXDATA_H
+#define AVCODEC_SPEEXDATA_H
+
+#include "libavutil/common.h"
+
+static const int8_t high_lsp_cdbk[512] = {
+    39,   12,   -14, -20, -29, -61, -67,  -76,  -32, -71,  -67, 68,   77,  46,
+    34,   5,    -13, -48, -46, -72, -81,  -84,  -60, -58,  -40, -28,  82,  93,
+    68,   45,   29,  3,   -19, -47, -28,  -43,  -35, -30,  -8,  -13,  -39, -91,
+    -91,  -123, -96, 10,  10,  -6,  -18,  -55,  -60, -91,  -56, -36,  -27, -16,
+    -48,  -75,  40,  28,  -10, -28, 35,   9,    37,  19,   1,   -20,  -31, -41,
+    -18,  -25,  -35, -68, -80, 45,  27,   -1,   47,  13,   0,   -29,  -35, -57,
+    -50,  -79,  -73, -38, -19, 5,   35,   14,   -10, -23,  16,  -8,   5,   -24,
+    -40,  -62,  -23, -27, -22, -16, -18,  -46,  -72, -77,  43,  21,   33,  1,
+    -80,  -70,  -70, -64, -56, -52, -39,  -33,  -31, -38,  -19, -19,  -15, 32,
+    33,   -2,   7,   -15, -15, -24, -23,  -33,  -41, -56,  -24, -57,  5,   89,
+    64,   41,   27,  5,   -9,  -47, -60,  -97,  -97, -124, -20, -9,   -44, -73,
+    31,   29,   -4,  64,  48,  7,   -35,  -57,  0,   -3,   -26, -47,  -3,  -6,
+    -40,  -76,  -79, -48, 12,  81,  55,   10,   9,   -24,  -43, -73,  -57, -69,
+    16,   5,    -28, -53, 18,  29,  20,   0,    -4,  -11,  6,   -13,  23,  7,
+    -17,  -35,  -37, -37, -30, -68, -63,  6,    24,  -9,   -14, 3,    21,  -13,
+    -27,  -57,  -49, -80, -24, -41, -5,   -16,  -5,  1,    45,  25,   12,  -7,
+    3,    -15,  -6,  -16, -15, -8,  6,    -13,  -42, -81,  -80, -87,  14,  1,
+    -10,  -3,   -43, -69, -46, -24, -28,  -29,  36,  6,    -43, -56,  -12, 12,
+    54,   79,   43,  9,   54,  22,  2,    8,    -12, -43,  -46, -52,  -38, -69,
+    -89,  -5,   75,  38,  33,  5,   -13,  -53,  -62, -87,  -89, -113, -99, -55,
+    -34,  -37,  62,  55,  33,  16,  21,   -2,   -17, -46,  -29, -38,  -38, -48,
+    -39,  -42,  -36, -75, -72, -88, -48,  -30,  21,  2,    -15, -57,  -64, -98,
+    -84,  -76,  25,  1,   -46, -80, -12,  18,   -7,  3,    34,  6,    38,  31,
+    23,   4,    -1,  20,  14,  -15, -43,  -78,  -91, -24,  14,  -3,   54,  16,
+    0,    -27,  -28, -44, -56, -83, -92,  -89,  -3,  34,   56,  41,   36,  22,
+    20,   -8,   -7,  -35, -42, -62, -49,  3,    12,  -10,  -50, -87,  -96, -66,
+    92,   70,   38,  9,   -70, -71, -62,  -42,  -39, -43,  -11, -7,   -50, -79,
+    -58,  -50,  -31, 32,  31,  -6,  -4,   -25,  7,   -17,  -38, -70,  -58, -27,
+    -43,  -83,  -28, 59,  36,  20,  31,   2,    -27, -71,  -80, -109, -98, -75,
+    -33,  -32,  -31, -2,  33,  15,  -6,   43,   33,  -5,   0,   -22,  -10, -27,
+    -34,  -49,  -11, -20, -41, -91, -100, -121, -39, 57,   41,  10,   -19, -50,
+    -38,  -59,  -60, -70, -18, -20, -8,   -31,  -8,  -15,  1,   -14,  -26, -25,
+    33,   21,   32,  17,  1,   -19, -19,  -26,  -58, -81,  -35, -22,  45,  30,
+    11,   -11,  3,   -26, -48, -87, -67,  -83,  -58, 3,    -1,  -26,  -20, 44,
+    10,   25,   39,  5,   -9,  -35, -27,  -38,  7,   10,   4,   -9,   -42, -85,
+    -102, -127, 52,  44,  28,  10,  -47,  -61,  -40, -39,  -17, -1,   -10, -33,
+    -42,  -74,  -48, 21,  -4,  70,  52,   10
+};
+
+static const int8_t high_lsp_cdbk2[512] = {
+    -36, -62, 6,   -9,  -10, -14, -56, 23,  1,   -26, 23,  -48, -17, 12,  8,
+    -7,  23,  29,  -36, -28, -6,  -29, -17, -5,  40,  23,  10,  10,  -46, -13,
+    36,  6,   4,   -30, -29, 62,  32,  -32, -1,  22,  -14, 1,   -4,  -22, -45,
+    2,   54,  4,   -30, -57, -59, -12, 27,  -3,  -31, 8,   -9,  5,   10,  -14,
+    32,  66,  19,  9,   2,   -25, -37, 23,  -15, 18,  -38, -31, 5,   -9,  -21,
+    15,  0,   22,  62,  30,  15,  -12, -14, -46, 77,  21,  33,  3,   34,  29,
+    -19, 50,  2,   11,  9,   -38, -12, -37, 62,  1,   -15, 54,  32,  6,   2,
+    -24, 20,  35,  -21, 2,   19,  24,  -13, 55,  4,   9,   39,  -19, 30,  -1,
+    -21, 73,  54,  33,  8,   18,  3,   15,  6,   -19, -47, 6,   -3,  -48, -50,
+    1,   26,  20,  8,   -23, -50, 65,  -14, -55, -17, -31, -37, -28, 53,  -1,
+    -17, -53, 1,   57,  11,  -8,  -25, -30, -37, 64,  5,   -52, -45, 15,  23,
+    31,  15,  14,  -25, 24,  33,  -2,  -44, -56, -18, 6,   -21, -43, 4,   -12,
+    17,  -37, 20,  -10, 34,  15,  2,   15,  55,  21,  -11, -31, -6,  46,  25,
+    16,  -9,  -25, -8,  -62, 28,  17,  20,  -32, -29, 26,  30,  25,  -19, 2,
+    -16, -17, 26,  -51, 2,   50,  42,  19,  -66, 23,  29,  -2,  3,   19,  -19,
+    -37, 32,  15,  6,   30,  -34, 13,  11,  -5,  40,  31,  10,  -42, 4,   -9,
+    26,  -9,  -70, 17,  -2,  -23, 20,  -22, -55, 51,  -24, -31, 22,  -22, 15,
+    -13, 3,   -10, -28, -16, 56,  4,   -63, 11,  -18, -15, -18, -38, -35, 16,
+    -7,  34,  -1,  -21, -49, -47, 9,   -37, 7,   8,   69,  55,  20,  6,   -33,
+    -45, -10, -9,  6,   -9,  12,  71,  15,  -3,  -42, -7,  -24, 32,  -35, -2,
+    -42, -17, -5,  0,   -2,  -33, -54, 13,  -12, -34, 47,  23,  19,  55,  7,
+    -8,  74,  31,  14,  16,  -23, -26, 19,  12,  -18, -49, -28, -31, -20, 2,
+    -14, -20, -47, 78,  40,  13,  -23, -11, 21,  -6,  18,  1,   47,  5,   38,
+    35,  32,  46,  22,  8,   13,  16,  -14, 18,  51,  19,  40,  39,  11,  -26,
+    -1,  -17, 47,  2,   -53, -15, 31,  -22, 38,  21,  -15, -16, 5,   -33, 53,
+    15,  -38, 86,  11,  -3,  -24, 49,  13,  -4,  -11, -18, 28,  20,  -12, -27,
+    -26, 35,  -25, -35, -3,  -20, -61, 30,  10,  -55, -12, -22, -52, -54, -14,
+    19,  -32, -12, 45,  15,  -8,  -48, -9,  11,  -32, 8,   -16, -34, -13, 51,
+    18,  38,  -2,  -32, -17, 22,  -2,  -18, -28, -70, 59,  27,  -28, -19, -10,
+    -20, -9,  -9,  -8,  -21, 21,  -8,  35,  -2,  45,  -3,  -9,  12,  0,   30,
+    7,   -39, 43,  27,  -38, -91, 30,  26,  19,  -55, -4,  63,  14,  -17, 13,
+    9,   13,  2,   7,   4,   6,   61,  72,  -1,  -17, 29,  -1,  -22, -17, 8,
+    -28, -37, 63,  44,  41,  3,   2,   14,  9,   -6,  75,  -8,  -7,  -12, -15,
+    -12, 13,  9,   -4,  30,  -22, -65, 15,  0,   -45, 4,   -4,  1,   5,   22,
+    11,  23
+};
+
+static const int8_t exc_5_256_table[1280] = {
+    -8,  -37, 5,   -43, 5,   73,   61,  39,  12,  -3,   -61, -32, 2,    42,
+    30,  -3,  17,  -27, 9,   34,   20,  -1,  -5,  2,    23,  -7,  -46,  26,
+    53,  -47, 20,  -2,  -33, -89,  -51, -64, 27,  11,   15,  -34, -5,   -56,
+    25,  -9,  -1,  -29, 1,   40,   67,  -23, -16, 16,   33,  19,  7,    14,
+    85,  22,  -10, -10, -12, -7,   -1,  52,  89,  29,   11,  -20, -37,  -46,
+    -15, 17,  -24, -28, 24,  2,    1,   0,   23,  -101, 23,  14,  -1,   -23,
+    -18, 9,   5,   -13, 38,  1,    -28, -28, 4,   27,   51,  -26, 34,   -40,
+    35,  47,  54,  38,  -54, -26,  -6,  42,  -25, 13,   -30, -36, 18,   41,
+    -4,  -33, 23,  -32, -7,  -4,   51,  -3,  17,  -52,  56,  -47, 36,   -2,
+    -21, 36,  10,  8,   -33, 31,   19,  9,   -5,  -40,  10,  -9,  -21,  19,
+    18,  -78, -18, -5,  0,   -26,  -36, -47, -51, -44,  18,  40,  27,   -2,
+    29,  49,  -26, 2,   32,  -54,  30,  -73, 54,  3,    -5,  36,  22,   53,
+    10,  -1,  -84, -53, -29, -5,   3,   -44, 53,  -51,  4,   22,  71,   -35,
+    -1,  33,  -5,  -27, -7,  36,   17,  -23, -39, 16,   -9,  -55, -15,  -20,
+    39,  -35, 6,   -39, -14, 18,   48,  -64, -17, -15,  9,   39,  81,   37,
+    -68, 37,  47,  -21, -6,  -104, 13,  6,   9,   -2,   35,  8,   -23,  18,
+    42,  45,  21,  33,  -5,  -49,  9,   -6,  -43, -56,  39,  2,   -16,  -25,
+    87,  1,   -3,  -9,  17,  -25,  -11, -9,  -1,  10,   2,   -14, -14,  4,
+    -1,  -10, 28,  -23, 40,  -32,  26,  -9,  26,  4,    -27, -23, 3,    42,
+    -60, 1,   49,  -3,  27,  10,   -52, -40, -2,  18,   45,  -23, 17,   -44,
+    3,   -3,  17,  -46, 52,  -40,  -47, 25,  75,  31,   -49, 53,  30,   -30,
+    -32, -36, 38,  -6,  -15, -16,  54,  -27, -48, 3,    38,  -29, -32,  -22,
+    -14, -4,  -23, -13, 32,  -39,  9,   8,   -45, -13,  34,  -16, 49,   40,
+    32,  31,  28,  23,  23,  32,   47,  59,  -68, 8,    62,  44,  25,   -14,
+    -24, -65, -16, 36,  67,  -25,  -38, -21, 4,   -33,  -2,  42,  5,    -63,
+    40,  11,  26,  -42, -23, -61,  79,  -31, 23,  -20,  10,  -32, 53,   -25,
+    -36, 10,  -26, -5,  3,   0,    -71, 5,   -10, -37,  1,   -24, 21,   -54,
+    -17, 1,   -29, -25, -15, -27,  32,  68,  45,  -16,  -37, -18, -5,   1,
+    0,   -77, 71,  -6,  3,   -20,  71,  -67, 29,  -35,  10,  -30, 19,   4,
+    16,  17,  5,   0,   -14, 19,   2,   28,  26,  59,   3,   2,   24,   39,
+    55,  -50, -45, -18, -17,