aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Kondik <steve@cyngn.com>2016-08-19 13:51:45 -0700
committerSteve Kondik <steve@cyngn.com>2016-08-19 13:51:45 -0700
commitb0f585937b1aca650b5997d9a1fc67513a0704f9 (patch)
treecf00e8ff491cf6562aec67cfd2e2881cc243b1ca
parent5934ab8cf4e7b8d3b38f9793adf7c0d54ac4331c (diff)
parent66bd740e0ba5d43d58d12f79addaf9acf8e3c0ae (diff)
downloadandroid_external_ffmpeg-b0f585937b1aca650b5997d9a1fc67513a0704f9.tar.gz
android_external_ffmpeg-b0f585937b1aca650b5997d9a1fc67513a0704f9.tar.bz2
android_external_ffmpeg-b0f585937b1aca650b5997d9a1fc67513a0704f9.zip
Merge branch 'release/3.0' of https://github.com/FFmpeg/FFmpeg into cm-13.0
-rw-r--r--Changelog130
-rw-r--r--MAINTAINERS10
-rw-r--r--RELEASE2
-rw-r--r--cmdutils.c9
-rw-r--r--cmdutils.h5
-rwxr-xr-xconfigure260
-rw-r--r--doc/Doxyfile2
-rw-r--r--doc/demuxers.texi6
-rw-r--r--doc/developer.texi29
-rw-r--r--doc/general.texi2
-rw-r--r--doc/utils.texi2
-rw-r--r--ffmpeg.c5
-rw-r--r--ffplay.c6
-rw-r--r--ffprobe.c2
-rw-r--r--ffserver.c7
-rw-r--r--libavcodec/aacenc_utils.h17
-rw-r--r--libavcodec/ac3dec.c12
-rw-r--r--libavcodec/alsdec.c7
-rw-r--r--libavcodec/apedec.c2
-rw-r--r--libavcodec/avpacket.c6
-rw-r--r--libavcodec/bmp_parser.c14
-rw-r--r--libavcodec/cfhd.c5
-rw-r--r--libavcodec/dca_core.c16
-rw-r--r--libavcodec/diracdec.c30
-rw-r--r--libavcodec/ffv1enc.c6
-rw-r--r--libavcodec/flac_parser.c4
-rw-r--r--libavcodec/h264.c49
-rw-r--r--libavcodec/h264_picture.c41
-rw-r--r--libavcodec/h264_slice.c10
-rw-r--r--libavcodec/hevc.c2
-rw-r--r--libavcodec/hevc.h9
-rw-r--r--libavcodec/hevc_parse.c10
-rw-r--r--libavcodec/hevc_parser.c2
-rw-r--r--libavcodec/hevc_sei.c6
-rw-r--r--libavcodec/indeo2.c15
-rw-r--r--libavcodec/indeo2data.h306
-rw-r--r--libavcodec/internal.h2
-rw-r--r--libavcodec/j2kenc.c38
-rw-r--r--libavcodec/libopenjpegenc.c8
-rw-r--r--libavcodec/libutvideodec.cpp12
-rw-r--r--libavcodec/libwebpenc_animencoder.c3
-rw-r--r--libavcodec/libx264.c4
-rw-r--r--libavcodec/mips/aaccoder_mips.c4
-rw-r--r--libavcodec/mips/aacdec_mips.h2
-rw-r--r--libavcodec/mips/aacpsdsp_mips.c4
-rw-r--r--libavcodec/mips/aacpsy_mips.h2
-rw-r--r--libavcodec/mips/aacsbr_mips.c4
-rw-r--r--libavcodec/mips/aacsbr_mips.h2
-rw-r--r--libavcodec/mips/ac3dsp_mips.c6
-rw-r--r--libavcodec/mips/acelp_filters_mips.c4
-rw-r--r--libavcodec/mips/acelp_vectors_mips.c4
-rw-r--r--libavcodec/mips/amrwbdec_mips.c2
-rw-r--r--libavcodec/mips/amrwbdec_mips.h2
-rw-r--r--libavcodec/mips/celp_filters_mips.c4
-rw-r--r--libavcodec/mips/celp_math_mips.c4
-rw-r--r--libavcodec/mips/compute_antialias_float.h2
-rw-r--r--libavcodec/mips/fft_mips.c4
-rw-r--r--libavcodec/mips/iirfilter_mips.c4
-rw-r--r--libavcodec/mips/lsp_mips.h2
-rw-r--r--libavcodec/mips/mpegaudiodsp_mips_fixed.c10
-rw-r--r--libavcodec/mips/mpegaudiodsp_mips_float.c10
-rw-r--r--libavcodec/mips/sbrdsp_mips.c4
-rw-r--r--libavcodec/mjpegdec.c60
-rw-r--r--libavcodec/mjpegenc_common.c14
-rw-r--r--libavcodec/mpc8.c8
-rw-r--r--libavcodec/mpegvideo.c8
-rw-r--r--libavcodec/pgssubdec.c10
-rw-r--r--libavcodec/pngdec.c1
-rw-r--r--libavcodec/raw.c1
-rw-r--r--libavcodec/resample.c6
-rw-r--r--libavcodec/rscc.c11
-rw-r--r--libavcodec/takdec.c1
-rw-r--r--libavcodec/ttaenc.c15
-rw-r--r--libavcodec/utils.c6
-rw-r--r--libavcodec/vc2enc.c2
-rw-r--r--libavcodec/vp9_parser.c17
-rw-r--r--libavfilter/af_amix.c3
-rw-r--r--libavfilter/src_movie.c2
-rw-r--r--libavfilter/vf_drawtext.c4
-rw-r--r--libavfilter/vf_telecine.c2
-rw-r--r--libavformat/allformats.c3
-rw-r--r--libavformat/avidec.c2
-rw-r--r--libavformat/cache.c7
-rw-r--r--libavformat/concatdec.c2
-rw-r--r--libavformat/ffmdec.c15
-rw-r--r--libavformat/file.c4
-rw-r--r--libavformat/flacdec.c9
-rw-r--r--libavformat/flvdec.c2
-rw-r--r--libavformat/format.c16
-rw-r--r--libavformat/hlsenc.c2
-rw-r--r--libavformat/http.c4
-rw-r--r--libavformat/librtmp.c2
-rw-r--r--libavformat/mov.c19
-rw-r--r--libavformat/mp3dec.c7
-rw-r--r--libavformat/mpegts.c20
-rw-r--r--libavformat/mpegtsenc.c29
-rw-r--r--libavformat/mux.c3
-rw-r--r--libavformat/oggdec.c1
-rw-r--r--libavformat/oggdec.h5
-rw-r--r--libavformat/oggparseopus.c4
-rw-r--r--libavformat/oggparsevp8.c6
-rw-r--r--libavformat/options_table.h1
-rw-r--r--libavformat/rtpdec_asf.c2
-rw-r--r--libavformat/rtpdec_jpeg.c7
-rw-r--r--libavformat/rtpenc.c3
-rw-r--r--libavformat/svag.c2
-rw-r--r--libavformat/utils.c14
-rw-r--r--libavutil/channel_layout.c2
-rw-r--r--libavutil/colorspace.h10
-rw-r--r--libavutil/internal.h16
-rw-r--r--libavutil/mips/float_dsp_mips.c4
-rw-r--r--libavutil/opt.h4
-rw-r--r--libavutil/pixdesc.c4
-rw-r--r--libavutil/random_seed.c7
-rw-r--r--libpostproc/postprocess.c2
-rw-r--r--libswresample/rematrix.c31
-rw-r--r--libswresample/rematrix_template.c7
-rw-r--r--libswresample/resample.c8
-rw-r--r--libswscale/input.c20
-rw-r--r--libswscale/utils.c1
-rw-r--r--libswscale/x86/output.asm160
-rw-r--r--tests/api/api-codec-param-test.c2
-rw-r--r--tests/checkasm/checkasm.c2
-rw-r--r--tests/fate/aac.mak2
-rw-r--r--tests/ref/fate/filter-pixfmts-fieldmatch2
-rw-r--r--tests/ref/fate/mkv2
126 files changed, 1292 insertions, 549 deletions
diff --git a/Changelog b/Changelog
index 2e1cd36f5f..334e69068a 100644
--- a/Changelog
+++ b/Changelog
@@ -1,6 +1,136 @@
Entries are sorted chronologically from oldest to youngest within each release,
releases are sorted from youngest to oldest.
+version 3.0.3:
+- cmdutils: remove the current working directory from the DLL search path on win32
+- avcodec/raw: Fix decoding of ilacetest.mov
+- avcodec/ffv1enc: Fix assertion failure with non zero bits per sample
+- avformat/oggdec: Fix integer overflow with invalid pts
+- ffplay: Fix invalid array index
+- avcodec/vp9_parser: Check the input frame sizes for being consistent
+- libavformat/rtpdec_asf: zero initialize the AVIOContext struct
+- libavutil/opt: Small bugfix in example.
+- libx264: Increase x264 opts character limit to 4096
+- avformat/mov: Check sample size
+- avformat/format: Fix registering a format more than once and related races
+- avformat/flacdec: Fix seeking close to EOF
+- avcodec/flac_parser: Raise threshold for detecting invalid data
+- avformat/flvdec: Accept last size if its off by 1
+- tests/api/api-codec-param-test: Do not directly access caps_internal
+- avcodec: Add avpriv_codec_get_cap_skip_frame_fill_param()
+- avfilter/vf_telecine: Make frame writable before writing into it
+- avformat/mpegts: adjust probe score for low check_count
+- avcodec/mpc8: Correct end truncation
+- avformat/mp3dec: Increase probe score slightly when the whole data from begin to end is mp3
+- avcodec/cfhd: Set dimensions unconditionally
+- avcodec/mpegvideo: Do not clear the parse context during init
+- avcodec/h264: Fix off by 1 context count
+- avcodec/alsdec: Check r to prevent out of array read
+- avcodec/alsdec: fix max bits in ltp prefix code
+- avcodec/utils: check skip_samples signedness
+- avformat/mpegts: Do not trust BSSD descriptor, it is sometimes not an S302M stream
+- avcodec/bmp_parser: Check fsize
+- avcodec/bmp_parser: reset state
+- avcodec/bmp_parser: Fix remaining size
+- avcodec/bmp_parser: Fix frame_start_found in cross frame cases
+- avfilter/af_amix: do not fail if there are no samples in output_frame()
+- avformat/allformats: Making av_register_all() thread-safe.
+- librtmp: Avoid an infiniloop setting connection arguments
+- avformat/oggparsevp8: fix pts calculation on pages ending with an invisible frame
+- Revert "configure: Enable GCC vectorization on ≥4.9 on x86"
+- avcodec/libopenjpegenc: Set numresolutions by default to a value that is not too large
+- ffplay: Fix usage of private lavfi API
+- tests/checkasm/checkasm: Disable checkasm_check_pixblockdsp for ppc64be
+- avcodec/mpegvideo: Deallocate last/next picture earlier
+- avcodec/bmp_parser: Fix state
+- avformat/oggparseopus: Fix Undefined behavior in oggparseopus.c and libavformat/utils.c
+- avformat/utils: avoid overflow in compute_chapters_end() with huge durations
+- avformat/utils: avoid overflow in update_stream_timings() with huge durations
+- doc/developer.texi: Add a code of conduct
+- ffserver: fixed deallocation bug in build_feed_streams
+- avcodec/diracdec: Fix potential integer overflow
+- avformat/avidec: Detect index with too short entries
+- avformat/utils: Check negative bps before shifting in ff_get_pcm_codec_id()
+- avformat/utils: Do not compute the bitrate from duration == 0
+- ffmpeg: Check that r_frame_rate is set before attempting to use it
+- swresample/resample: Fix division by 0 with tap_count=1
+- swresample/rematrix: Use clipping s16 rematrixing if overflows are possible
+- swresample/rematrix: Use error diffusion to avoid error in the DC component of the matrix
+- hevc: Fix memory leak related to a53_caption data
+- libavformat/oggdec: Free stream private when header parsing fails.
+- avformat/utils: Check bps before using it in a shift in ff_get_pcm_codec_id()
+- avformat/oggparseopus: Check that granule pos is within the supported range
+- avcodec/mjpegdec: Do not try to detect last scan but apply idct after all scans for progressive jpeg
+- avformat/options_table: Add missing identifier for very strict compliance
+- avformat/ffmdec: Check pix_fmt
+- doc/general: update supported DCA extensions
+- avcodec/rscc: check input buffer size for deflate mode
+- avcodec/dca: fix sync word search error condition
+- lavf/mpegts: Return small probe score for very short transport streams.
+
+
+version 3.0.2:
+- avcodec/ttaenc: Reallocate packet if its too small
+- configure: build fix for P5600 with mips code restructuring
+- mips: add support for R6
+- pgssubdec: fix subpicture output colorspace and range
+- avcodec/ac3dec: Reset SPX when switching from EAC3 to AC3
+- avfilter/vf_drawtext: Check return code of load_glyph()
+- avformat/mux: Check that deinit is set before calling it
+- avcodec/takdec: add code that got somehow lost in process of REing
+- avcodec/apedec: fix decoding of stereo files with one channel full of silence
+- avcodec/avpacket: Fix off by 5 error
+- avcodec/h264: Fix for H.264 configuration parsing
+- avcodec/bmp_parser: Ensure remaining_size is not too small in startcode packet crossing corner case
+- avcodec/pngdec: Fix alpha detection with skip_frame
+- Changelog: Make formating consistent
+- avfilter/src_movie: fix how we check for overflows with seek_point
+- avcodec/j2kenc: Add attribution to OpenJPEG project:
+
+
+version 3.0.1:
+- avcodec/libutvideodec: copy frame so it has reference counters when refcounted_frames is set
+- avformat/rtpdec_jpeg: fix low contrast image on low quality setting
+- avformat/mpegtsenc: Fix used service
+- avformat/mpegtsenc: Keep track of the program for each service
+- avformat/file: Add crypto to default whitelist
+- avcodec/mjpegenc_common: Store approximate aspect if exact cannot be stored
+- lavc/hevc: Allow arbitrary garbage in bytestream as long as at least one NAL unit is found.
+- avcodec/resample: Remove disabled and faulty code
+- indeo2: Fix banding artefacts
+- indeo2data: K&R formatting cosmetics
+- avformat/hlsenc: Fix passing options, regression since bc9a5965c815cf7fd998d8ce14a18b8e861dd9ce
+- avutil/random_seed: Add the runtime in cycles of the main loop to the entropy pool
+- avutil/channel_layout: AV_CH_LAYOUT_6POINT1_BACK not reachable in parsing
+- avformat/concatdec: set safe mode to enabled instead of auto
+- avformat/utils: fix dts from pts code in compute_pkt_fields() during ascending delay
+- avformat/rtpenc: Fix integer overflow in NTP_TO_RTP_FORMAT
+- avcodec/dca: clear X96 channels if nothing was decoded
+- fate/aac: Increase fuzz from of fate-aac-pns-encode from 72 to 74 for Loongson
+- avformat/cache: Fix memleak of tree entries
+- lavf/mov: downgrade sidx errors to non-fatal warnings; fixes trac #5216
+- lavf/mov: fix sidx with edit lists
+- avcodec/mjpegdec: Fix decoding slightly odd progressive jpeg
+- swscale/utils: Fix chrSrcHSubSample for GBRAP16
+- swscale/input: Fix GBRAP16 input
+- avutil/pixdesc: Make get_color_type() aware of CIE XYZ formats
+- avcodec/h264: Execute error concealment before marking the frame as done.
+- swscale/x86/output: Fix yuv2planeX_16* with unaligned destination
+- swscale/x86/output: Move code into yuv2planeX_mainloop
+- MAINTAINERS: add myself as an OS/2 maintainer
+- libwebpenc_animencoder: print library messages in verbose log levels
+- libwebpenc_animencoder: zero initialize the WebPAnimEncoderOptions struct
+- configure: check for SEC_I_CONTEXT_EXPIRED before enabling SChannel
+- lavf/http: Add httpproxy to the default protocol whitelist.
+- doc/utils: fix typo for min() description
+- ffserver&ffm: Fixed issues preventing ffserver write_index and files_size from being set correctly which was breaking ffserver streaming.
+- postproc: fix unaligned access
+- vc2enc: fix use of uninitialized variables in the rate control system, correctly zero out coefficient array padding
+- aacenc: optimize encoding speed
+- avcodec/diracdec: check bitstream size related fields for overflows
+- avcodec/h264_slice: Check PPS more extensively when its not copied
+
+
version 3.0:
- Common Encryption (CENC) MP4 encoding and decoding support
- DXV decoding
diff --git a/MAINTAINERS b/MAINTAINERS
index e57150da90..15203e29cb 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -56,7 +56,7 @@ Communication
website Deby Barbara Lepage
fate.ffmpeg.org Timothy Gu
Trac bug tracker Alexander Strasser, Michael Niedermayer, Carl Eugen Hoyos, Lou Logan
-mailing lists Michael Niedermayer, Baptiste Coudurier, Lou Logan
+mailing lists Baptiste Coudurier, Lou Logan
Google+ Paul B Mahol, Michael Niedermayer, Alexander Strasser
Twitter Lou Logan, Reynaldo H. Verdejo Pinochet
Launchpad Timothy Gu
@@ -168,7 +168,7 @@ Codecs:
dirac* Rostislav Pehlivanov
dnxhd* Baptiste Coudurier
dpcm.c Mike Melanson
- dss_sp.c Oleksij Rempel, Michael Niedermayer
+ dss_sp.c Oleksij Rempel
dv.c Roman Shaposhnik
dvbsubdec.c Anshul Maheshwari
dxa.c Kostya Shishkov
@@ -422,7 +422,7 @@ Muxers/Demuxers:
cdxl.c Paul B Mahol
crc.c Michael Niedermayer
daud.c Reimar Doeffinger
- dss.c Oleksij Rempel, Michael Niedermayer
+ dss.c Oleksij Rempel
dtshddec.c Paul B Mahol
dv.c Roman Shaposhnik
dxa.c Kostya Shishkov
@@ -458,7 +458,7 @@ Muxers/Demuxers:
mgsts.c Paul B Mahol
microdvd* Aurelien Jacobs
mm.c Peter Ross
- mov.c Michael Niedermayer, Baptiste Coudurier
+ mov.c Baptiste Coudurier
movenc.c Baptiste Coudurier, Matthieu Bouron
movenccenc.c Eran Kornblau
mpc.c Kostya Shishkov
@@ -563,7 +563,7 @@ Windows MSVC Matthew Oliver, Hendrik Leppkes
Windows ICL Matthew Oliver
ADI/Blackfin DSP Marc Hoffman
Sparc Roman Shaposhnik
-x86 Michael Niedermayer
+OS/2 KO Myung-Hun
Releases
diff --git a/RELEASE b/RELEASE
index 9f55b2ccb5..75a22a26ac 100644
--- a/RELEASE
+++ b/RELEASE
@@ -1 +1 @@
-3.0
+3.0.3
diff --git a/cmdutils.c b/cmdutils.c
index 03a4836207..6960f8c99c 100644
--- a/cmdutils.c
+++ b/cmdutils.c
@@ -107,6 +107,15 @@ static void log_callback_report(void *ptr, int level, const char *fmt, va_list v
}
}
+void init_dynload(void)
+{
+#ifdef _WIN32
+ /* Calling SetDllDirectory with the empty string (but not NULL) removes the
+ * current working directory from the DLL search path as a security pre-caution. */
+ SetDllDirectory("");
+#endif
+}
+
static void (*program_exit)(int ret);
void register_exit(void (*cb)(int ret))
diff --git a/cmdutils.h b/cmdutils.h
index 83ea4ad39e..67bf4848b7 100644
--- a/cmdutils.h
+++ b/cmdutils.h
@@ -62,6 +62,11 @@ void register_exit(void (*cb)(int ret));
void exit_program(int ret) av_noreturn;
/**
+ * Initialize dynamic library loading
+ */
+void init_dynload(void);
+
+/**
* Initialize the cmdutils option system, in particular
* allocate the *_opts contexts.
*/
diff --git a/configure b/configure
index 2148f11044..1091bdcc13 100755
--- a/configure
+++ b/configure
@@ -913,6 +913,25 @@ void foo(void){ __asm__ volatile($code); }
EOF
}
+check_inline_asm_flags(){
+ log check_inline_asm_flags "$@"
+ name="$1"
+ code="$2"
+ flags=''
+ shift 2
+ while [ "$1" != "" ]; do
+ append flags $1
+ shift
+ done;
+ disable $name
+ cat > $TMPC <<EOF
+void foo(void){ __asm__ volatile($code); }
+EOF
+ log_file $TMPC
+ check_cmd $cc $CPPFLAGS $CFLAGS $flags "$@" $CC_C $(cc_o $TMPO) $TMPC &&
+ enable $name && add_cflags $flags && add_asflags $flags && add_ldflags $flags
+}
+
check_insn(){
log check_insn "$@"
check_inline_asm ${1}_inline "\"$2\""
@@ -1657,6 +1676,7 @@ ARCH_EXT_LIST_ARM="
ARCH_EXT_LIST_MIPS="
mipsfpu
mips32r2
+ mips32r5
mips64r2
mips32r6
mips64r6
@@ -2150,10 +2170,11 @@ mipsfpu_deps="mips"
mipsdsp_deps="mips"
mipsdspr2_deps="mips"
mips32r2_deps="mips"
+mips32r5_deps="mips"
mips32r6_deps="mips"
mips64r2_deps="mips"
mips64r6_deps="mips"
-msa_deps="mips"
+msa_deps="mipsfpu"
mmi_deps="mips"
altivec_deps="ppc"
@@ -4153,118 +4174,90 @@ elif enabled mips; then
cpuflags="-march=$cpu"
- case $cpu in
- 24kc)
- disable mips32r6
- disable mips64r2
- disable mips64r6
- disable mipsfpu
- disable mipsdsp
- disable mipsdspr2
- disable msa
- ;;
- 24kf*)
- disable mips32r6
- disable mips64r2
- disable mips64r6
- disable mipsdsp
- disable mipsdspr2
- disable msa
- ;;
- 24kec|34kc|1004kc)
- disable mips32r6
- disable mips64r2
- disable mips64r6
- disable mipsfpu
- disable mipsdspr2
- disable msa
- ;;
- 24kef*|34kf*|1004kf*)
- disable mips32r6
- disable mips64r2
- disable mips64r6
- disable mipsdspr2
- disable msa
- ;;
- 74kc)
- disable mips32r6
- disable mips64r2
- disable mips64r6
- disable mipsfpu
- disable msa
- ;;
- 74kf)
- disable mips32r6
- disable mips64r2
- disable mips64r6
- disable msa
- ;;
- p5600)
- disable mips32r6
- disable mips64r2
- disable mips64r6
- disable mipsdsp
- disable mipsdspr2
- check_cflags "-mtune=p5600" &&
- check_cflags "-mfp64 -msched-weight -mload-store-pairs -funroll-loops" &&
- add_asflags "-mfp64"
- ;;
- i6400)
- disable mips32r2
- disable mips32r6
- disable mips64r2
- disable mipsdsp
- disable mipsdspr2
- check_cflags "-mtune=i6400 -mabi=64" &&
- check_cflags "-mfp64 -msched-weight -mload-store-pairs -funroll-loops" &&
- check_ldflags "-mabi=64" &&
- add_asflags "-mfp64"
- ;;
- loongson*)
- disable mips32r2
- disable mips32r6
- disable mips64r2
- disable mips64r6
- disable mipsfpu
- disable mipsdsp
- disable mipsdspr2
- disable msa
- enable local_aligned_8 local_aligned_16 local_aligned_32
- enable simd_align_16
- enable fast_64bit
- enable fast_clz
- enable fast_cmov
- enable fast_unaligned
- disable aligned_stack
- case $cpu in
- loongson3*)
- cpuflags="-march=loongson3a -mhard-float -fno-expensive-optimizations"
- ;;
- loongson2e)
- cpuflags="-march=loongson2e -mhard-float -fno-expensive-optimizations"
- ;;
- loongson2f)
- cpuflags="-march=loongson2f -mhard-float -fno-expensive-optimizations"
- ;;
- esac
- ;;
- generic)
- disable mips64r6
- disable msa
- ;;
- *)
- # Unknown CPU. Disable everything.
- warn "unknown CPU. Disabling all MIPS optimizations."
- disable mipsfpu
- disable mips32r2
- disable mips32r6
- disable mips64r2
- disable mips64r6
- disable mipsdsp
- disable mipsdspr2
- disable msa
- ;;
- esac
+ if [ "$cpu" != "generic" ]; then
+ disable mips32r2
+ disable mips32r5
+ disable mips64r2
+ disable mips32r6
+ disable mips64r6
+ disable loongson2
+ disable loongson3
+
+ case $cpu in
+ 24kc|24kf*|24kec|34kc|1004kc|24kef*|34kf*|1004kf*|74kc|74kf)
+ enable mips32r2
+ disable msa
+ ;;
+ p5600|i6400)
+ disable mipsdsp
+ disable mipsdspr2
+ ;;
+ loongson*)
+ enable loongson2
+ enable loongson3
+ enable local_aligned_8 local_aligned_16 local_aligned_32
+ enable simd_align_16
+ enable fast_64bit
+ enable fast_clz
+ enable fast_cmov
+ enable fast_unaligned
+ disable aligned_stack
+ case $cpu in
+ loongson3*)
+ cpuflags="-march=loongson3a -mhard-float -fno-expensive-optimizations"
+ ;;
+ loongson2e)
+ cpuflags="-march=loongson2e -mhard-float -fno-expensive-optimizations"
+ ;;
+ loongson2f)
+ cpuflags="-march=loongson2f -mhard-float -fno-expensive-optimizations"
+ ;;
+ esac
+ ;;
+ *)
+ # Unknown CPU. Disable everything.
+ warn "unknown CPU. Disabling all MIPS optimizations."
+ disable mipsfpu
+ disable mipsdsp
+ disable mipsdspr2
+ disable msa
+ disable mmi
+ ;;
+ esac
+
+ case $cpu in
+ 24kc)
+ disable mipsfpu
+ disable mipsdsp
+ disable mipsdspr2
+ ;;
+ 24kf*)
+ disable mipsdsp
+ disable mipsdspr2
+ ;;
+ 24kec|34kc|1004kc)
+ disable mipsfpu
+ disable mipsdspr2
+ ;;
+ 24kef*|34kf*|1004kf*)
+ disable mipsdspr2
+ ;;
+ 74kc)
+ disable mipsfpu
+ ;;
+ p5600)
+ enable mips32r5
+ check_cflags "-mtune=p5600" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops"
+ ;;
+ i6400)
+ enable mips64r6
+ check_cflags "-mtune=i6400 -mabi=64" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
+ ;;
+ esac
+ else
+ # We do not disable anything. Is up to the user to disable the unwanted features.
+ warn 'generic cpu selected'
+ fi
elif enabled ppc; then
@@ -5073,27 +5066,22 @@ elif enabled mips; then
enabled mmi && check_inline_asm mmi '"punpcklhw $f0, $f0, $f0"'
# Enable minimum ISA based on selected options
- if enabled mips64 && (enabled mipsdsp || enabled mipsdspr2); then
- add_cflags "-mips64r2"
- add_asflags "-mips64r2"
- elif enabled mips64 && enabled mipsfpu && disabled loongson2 && disabled loongson3; then
- add_cflags "-mips64"
- add_asflags "-mips64"
- elif enabled mipsdsp || enabled mipsdspr2; then
- add_cflags "-mips32r2 -mfp32"
- add_asflags "-mips32r2 -mfp32"
+ if enabled mips64; then
+ enabled mips64r6 && check_inline_asm_flags mips64r6 '"dlsa $0, $0, $0, 1"' '-mips64r6'
+ enabled mips64r2 && check_inline_asm_flags mips64r2 '"dext $0, $0, 0, 1"' '-mips64r2'
+ disabled mips64r6 && disabled mips64r2 && check_inline_asm_flags mips64r1 '"daddi $0, $0, 0"' '-mips64'
+ else
+ enabled mips32r6 && check_inline_asm_flags mips32r6 '"aui $0, $0, 0"' '-mips32r6'
+ enabled mips32r5 && check_inline_asm_flags mips32r5 '"eretnc"' '-mips32r5'
+ enabled mips32r2 && check_inline_asm_flags mips32r2 '"ext $0, $0, 0, 1"' '-mips32r2'
+ disabled mips32r6 && disabled mips32r5 && disabled mips32r2 && check_inline_asm_flags mips32r1 '"addi $0, $0, 0"' '-mips32'
fi
- enabled mipsdsp && add_cflags "-mdsp" && add_asflags "-mdsp" &&
- check_inline_asm mipsdsp '"addu.qb $t0, $t1, $t2"'
- enabled mipsdspr2 && add_cflags "-mdspr2" && add_asflags "-mdspr2" &&
- check_inline_asm mipsdspr2 '"absq_s.qb $t0, $t1"'
- enabled mipsfpu && add_cflags "-mhard-float" && add_asflags "-mhard-float" &&
- check_inline_asm mipsfpu '"madd.d $f0, $f2, $f4, $f6"'
- enabled msa && check_cflags "-mmsa" && check_ldflags "-mmsa" &&
- check_inline_asm msa '"addvi.b $w0, $w1, 1"'
-
- enabled msa && add_asflags "-mmsa"
+ enabled mipsfpu && check_inline_asm_flags mipsfpu '"cvt.d.l $f0, $f2"' '-mhard-float'
+ enabled mipsfpu && (enabled mips32r5 || enabled mips32r6 || enabled mips64r6) && check_inline_asm_flags mipsfpu '"cvt.d.l $f0, $f1"' '-mfp64'
+ enabled mipsfpu && enabled msa && check_inline_asm_flags msa '"addvi.b $w0, $w1, 1"' '-mmsa' && check_header msa.h || disable msa
+ enabled mipsdsp && check_inline_asm_flags mipsdsp '"addu.qb $t0, $t1, $t2"' '-mdsp'
+ enabled mipsdspr2 && check_inline_asm_flags mipsdspr2 '"absq_s.qb $t0, $t1"' '-mdspr2'
elif enabled parisc; then
@@ -5659,7 +5647,7 @@ disabled securetransport || { check_func SecIdentityCreate "-Wl,-framework,CoreF
enable securetransport; }
disabled schannel || { check_func_headers "windows.h Security.h" InitializeSecurityContext -DSECURITY_WIN32 -lSecur32 &&
- enable schannel && add_extralibs -lSecur32; }
+ check_cpp_condition winerror.h "defined(SEC_I_CONTEXT_EXPIRED)" && enable schannel && add_extralibs -lSecur32; }
makeinfo --version > /dev/null 2>&1 && enable makeinfo || disable makeinfo
enabled makeinfo \
@@ -5935,11 +5923,7 @@ elif enabled ccc; then
add_cflags -msg_disable nonstandcast
add_cflags -msg_disable unsupieee
elif enabled gcc; then
- case $gcc_basever in
- 4.9*) enabled x86 || check_optflags -fno-tree-vectorize ;;
- 4.*) check_optflags -fno-tree-vectorize ;;
- *) enabled x86 || check_optflags -fno-tree-vectorize ;;
- esac
+ check_optflags -fno-tree-vectorize
check_cflags -Werror=format-security
check_cflags -Werror=implicit-function-declaration
check_cflags -Werror=missing-prototypes
diff --git a/doc/Doxyfile b/doc/Doxyfile
index 07b4d1fe01..91870f387b 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -31,7 +31,7 @@ PROJECT_NAME = FFmpeg
# This could be handy for archiving the generated documentation or
# if some version control system is used.
-PROJECT_NUMBER = 3.0
+PROJECT_NUMBER = 3.0.3
# With the PROJECT_LOGO tag one can specify a logo or icon that is included
# in the documentation. The maximum height of the logo should not exceed 55
diff --git a/doc/demuxers.texi b/doc/demuxers.texi
index 6b5f8bba15..3947bf640f 100644
--- a/doc/demuxers.texi
+++ b/doc/demuxers.texi
@@ -104,7 +104,7 @@ All subsequent file-related directives apply to that file.
@item @code{ffconcat version 1.0}
Identify the script type and version. It also sets the @option{safe} option
-to 1 if it was to its default -1.
+to 1 if it was -1.
To make FFmpeg recognize the format automatically, this directive must
appears exactly as is (no extra space or byte-order-mark) on the very first
@@ -192,7 +192,9 @@ component.
If set to 0, any file name is accepted.
-The default is -1, it is equivalent to 1 if the format was automatically
+The default is 1.
+
+-1 is equivalent to 1 if the format was automatically
probed and 0 otherwise.
@item auto_convert
diff --git a/doc/developer.texi b/doc/developer.texi
index 6db93cef70..4d3a7aef94 100644
--- a/doc/developer.texi
+++ b/doc/developer.texi
@@ -403,6 +403,35 @@ finding a new maintainer and also don't forget to update the @file{MAINTAINERS}
We think our rules are not too hard. If you have comments, contact us.
+@section Code of conduct
+
+Be friendly and respectful towards others and third parties.
+Treat others the way you yourself want to be treated.
+
+Be considerate. Not everyone shares the same viewpoint and priorities as you do.
+Different opinions and interpretations help the project.
+Looking at issues from a different perspective assists development.
+
+Do not assume malice for things that can be attributed to incompetence. Even if
+it is malice, it's rarely good to start with that as initial assumption.
+
+Stay friendly even if someone acts contrarily. Everyone has a bad day
+once in a while.
+If you yourself have a bad day or are angry then try to take a break and reply
+once you are calm and without anger if you have to.
+
+Try to help other team members and cooperate if you can.
+
+The goal of software development is to create technical excellence, not for any
+individual to be better and "win" against the others. Large software projects
+are only possible and successful through teamwork.
+
+If someone struggles do not put them down. Give them a helping hand
+instead and point them in the right direction.
+
+Finally, keep in mind the immortal words of Bill and Ted,
+"Be excellent to each other."
+
@anchor{Submitting patches}
@section Submitting patches
diff --git a/doc/general.texi b/doc/general.texi
index 59ea4f44d9..df16c3e97f 100644
--- a/doc/general.texi
+++ b/doc/general.texi
@@ -950,7 +950,7 @@ following image formats are supported:
@item COOK @tab @tab X
@tab All versions except 5.1 are supported.
@item DCA (DTS Coherent Acoustics) @tab X @tab X
- @tab supported extensions: XCh, XLL (partially)
+ @tab supported extensions: XCh, XXCH, X96, XBR, XLL
@item DPCM id RoQ @tab X @tab X
@tab Used in Quake III, Jedi Knight 2 and other computer games.
@item DPCM Interplay @tab @tab X
diff --git a/doc/utils.texi b/doc/utils.texi
index 756c609072..7aea460609 100644
--- a/doc/utils.texi
+++ b/doc/utils.texi
@@ -869,7 +869,7 @@ Return 1 if @var{x} is lesser than or equal to @var{y}, 0 otherwise.
Return the maximum between @var{x} and @var{y}.
@item min(x, y)
-Return the maximum between @var{x} and @var{y}.
+Return the minimum between @var{x} and @var{y}.
@item mod(x, y)
Compute the remainder of division of @var{x} by @var{y}.
diff --git a/ffmpeg.c b/ffmpeg.c
index a5ec3c3833..435ad5730c 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -2893,7 +2893,8 @@ static int transcode_init(void)
* overhead
*/
if(!strcmp(oc->oformat->name, "avi")) {
- if ( copy_tb<0 && av_q2d(ist->st->r_frame_rate) >= av_q2d(ist->st->avg_frame_rate)
+ if ( copy_tb<0 && ist->st->r_frame_rate.num
+ && av_q2d(ist->st->r_frame_rate) >= av_q2d(ist->st->avg_frame_rate)
&& 0.5/av_q2d(ist->st->r_frame_rate) > av_q2d(ist->st->time_base)
&& 0.5/av_q2d(ist->st->r_frame_rate) > av_q2d(dec_ctx->time_base)
&& av_q2d(ist->st->time_base) < 1.0/500 && av_q2d(dec_ctx->time_base) < 1.0/500
@@ -4267,6 +4268,8 @@ int main(int argc, char **argv)
int ret;
int64_t ti;
+ init_dynload();
+
register_exit(ffmpeg_cleanup);
setvbuf(stderr,NULL,_IONBF,0); /* win32 runtime needs this */
diff --git a/ffplay.c b/ffplay.c
index 2cfdf26ee9..22c530bb87 100644
--- a/ffplay.c
+++ b/ffplay.c
@@ -2730,7 +2730,7 @@ static int stream_component_open(VideoState *is, int stream_index)
goto fail;
link = is->out_audio_filter->inputs[0];
sample_rate = link->sample_rate;
- nb_channels = link->channels;
+ nb_channels = avfilter_link_get_channels(link);
channel_layout = link->channel_layout;
}
#else
@@ -2931,7 +2931,7 @@ static int read_thread(void *arg)
AVStream *st = ic->streams[i];
enum AVMediaType type = st->codec->codec_type;
st->discard = AVDISCARD_ALL;
- if (wanted_stream_spec[type] && st_index[type] == -1)
+ if (type >= 0 && wanted_stream_spec[type] && st_index[type] == -1)
if (avformat_match_stream_specifier(ic, st, wanted_stream_spec[type]) > 0)
st_index[type] = i;
}
@@ -3771,6 +3771,8 @@ int main(int argc, char **argv)
VideoState *is;
char dummy_videodriver[] = "SDL_VIDEODRIVER=dummy";
+ init_dynload();
+
av_log_set_flags(AV_LOG_SKIP_REPEATED);
parse_loglevel(argc, argv, options);
diff --git a/ffprobe.c b/ffprobe.c
index f7b51adda2..4f23bddb69 100644
--- a/ffprobe.c
+++ b/ffprobe.c
@@ -3178,6 +3178,8 @@ int main(int argc, char **argv)
char *w_name = NULL, *w_args = NULL;
int ret, i;
+ init_dynload();
+
av_log_set_flags(AV_LOG_SKIP_REPEATED);
register_exit(ffprobe_cleanup);
diff --git a/ffserver.c b/ffserver.c
index bc7dbee760..d73caee9ec 100644
--- a/ffserver.c
+++ b/ffserver.c
@@ -373,8 +373,8 @@ static void ffm_set_write_index(AVFormatContext *s, int64_t pos,
int64_t file_size)
{
av_opt_set_int(s, "server_attached", 1, AV_OPT_SEARCH_CHILDREN);
- av_opt_set_int(s, "write_index", pos, AV_OPT_SEARCH_CHILDREN);
- av_opt_set_int(s, "file_size", file_size, AV_OPT_SEARCH_CHILDREN);
+ av_opt_set_int(s, "ffm_write_index", pos, AV_OPT_SEARCH_CHILDREN);
+ av_opt_set_int(s, "ffm_file_size", file_size, AV_OPT_SEARCH_CHILDREN);
}
static char *ctime1(char *buf2, size_t buf_size)
@@ -3858,6 +3858,8 @@ drop:
if (avformat_write_header(s, NULL) < 0) {
http_log("Container doesn't support the required parameters\n");
avio_closep(&s->pb);
+ s->streams = NULL;
+ s->nb_streams = 0;
avformat_free_context(s);
goto bail;
}
@@ -3973,6 +3975,7 @@ int main(int argc, char **argv)
int cfg_parsed;
int ret = EXIT_FAILURE;
+ init_dynload();
config.filename = av_strdup("/etc/ffserver.conf");
diff --git a/libavcodec/aacenc_utils.h b/libavcodec/aacenc_utils.h
index cb5bc8da12..07f733746b 100644
--- a/libavcodec/aacenc_utils.h
+++ b/libavcodec/aacenc_utils.h
@@ -28,6 +28,7 @@
#ifndef AVCODEC_AACENC_UTILS_H
#define AVCODEC_AACENC_UTILS_H
+#include "libavutil/internal.h"
#include "aac.h"
#include "aacenctab.h"
#include "aactab.h"
@@ -66,13 +67,13 @@ static inline void quantize_bands(int *out, const float *in, const float *scaled
const float rounding)
{
int i;
- double qc;
for (i = 0; i < size; i++) {
- qc = scaled[i] * Q34;
- out[i] = (int)FFMIN(qc + rounding, (double)maxval);
+ float qc = scaled[i] * Q34;
+ int tmp = (int)FFMIN(qc + rounding, (float)maxval);
if (is_signed && in[i] < 0.0f) {
- out[i] = -out[i];
+ tmp = -tmp;
}
+ out[i] = tmp;
}
}
@@ -90,8 +91,7 @@ static inline float find_max_val(int group_len, int swb_size, const float *scale
static inline int find_min_book(float maxval, int sf)
{
- float Q = ff_aac_pow2sf_tab[POW_SF2_ZERO - sf + SCALE_ONE_POS - SCALE_DIV_512];
- float Q34 = sqrtf(Q * sqrtf(Q));
+ float Q34 = ff_aac_pow34sf_tab[POW_SF2_ZERO - sf + SCALE_ONE_POS - SCALE_DIV_512];
int qmaxval, cb;
qmaxval = maxval * Q34 + C_QUANT;
if (qmaxval >= (FF_ARRAY_ELEMS(aac_maxval_cb)))
@@ -123,7 +123,10 @@ static inline float find_form_factor(int group_len, int swb_size, float thresh,
if (s >= ethresh) {
nzl += 1.0f;
} else {
- nzl += powf(s / ethresh, nzslope);
+ if (nzslope == 2.f)
+ nzl += (s / ethresh) * (s / ethresh);
+ else
+ nzl += ff_fast_powf(s / ethresh, nzslope);
}
}
if (e2 > thresh) {
diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c
index 5d5330c4aa..f82f3974ef 100644
--- a/libavcodec/ac3dec.c
+++ b/libavcodec/ac3dec.c
@@ -895,11 +895,13 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
ff_eac3_default_spx_band_struct,
&s->num_spx_bands,
s->spx_band_sizes);
- } else {
- for (ch = 1; ch <= fbw_channels; ch++) {
- s->channel_uses_spx[ch] = 0;
- s->first_spx_coords[ch] = 1;
- }
+ }
+ }
+ if (!s->eac3 || !s->spx_in_use) {
+ s->spx_in_use = 0;
+ for (ch = 1; ch <= fbw_channels; ch++) {
+ s->channel_uses_spx[ch] = 0;
+ s->first_spx_coords[ch] = 1;
}
}
diff --git a/libavcodec/alsdec.c b/libavcodec/alsdec.c
index ebd364e085..d2c3485ee6 100644
--- a/libavcodec/alsdec.c
+++ b/libavcodec/alsdec.c
@@ -765,8 +765,13 @@ static int read_var_block_data(ALSDecContext *ctx, ALSBlockData *bd)
bd->ltp_gain[0] = decode_rice(gb, 1) << 3;
bd->ltp_gain[1] = decode_rice(gb, 2) << 3;
- r = get_unary(gb, 0, 3);
+ r = get_unary(gb, 0, 4);
c = get_bits(gb, 2);
+ if (r >= 4) {
+ av_log(avctx, AV_LOG_ERROR, "r overflow\n");
+ return AVERROR_INVALIDDATA;
+ }
+
bd->ltp_gain[2] = ltp_gain_values[r][c];
bd->ltp_gain[3] = decode_rice(gb, 2) << 3;
diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c
index 5f39891dcf..9de0c11a0c 100644
--- a/libavcodec/apedec.c
+++ b/libavcodec/apedec.c
@@ -1372,7 +1372,7 @@ static void ape_unpack_stereo(APEContext *ctx, int count)
int32_t *decoded0 = ctx->decoded[0];
int32_t *decoded1 = ctx->decoded[1];
- if (ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE) {
+ if ((ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE) == APE_FRAMECODE_STEREO_SILENCE) {
/* We are pure silence, so we're done. */
av_log(ctx->avctx, AV_LOG_DEBUG, "pure silence stereo\n");
return;
diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
index 4901d361b1..b2079f61a1 100644
--- a/libavcodec/avpacket.c
+++ b/libavcodec/avpacket.c
@@ -401,10 +401,12 @@ int av_packet_split_side_data(AVPacket *pkt){
p = pkt->data + pkt->size - 8 - 5;
for (i=1; ; i++){
size = AV_RB32(p);
- if (size>INT_MAX || p - pkt->data < size)
+ if (size>INT_MAX - 5 || p - pkt->data < size)
return 0;
if (p[4]&128)
break;
+ if (p - pkt->data < size + 5)
+ return 0;
p-= size+5;
}
@@ -415,7 +417,7 @@ int av_packet_split_side_data(AVPacket *pkt){
p= pkt->data + pkt->size - 8 - 5;
for (i=0; ; i++){
size= AV_RB32(p);
- av_assert0(size<=INT_MAX && p - pkt->data >= size);
+ av_assert0(size<=INT_MAX - 5 && p - pkt->data >= size);
pkt->side_data[i].data = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE);
pkt->side_data[i].size = size;
pkt->side_data[i].type = p[4]&127;
diff --git a/libavcodec/bmp_parser.c b/libavcodec/bmp_parser.c
index c9493dc32d..cd65f02a2e 100644
--- a/libavcodec/bmp_parser.c
+++ b/libavcodec/bmp_parser.c
@@ -53,7 +53,8 @@ restart:
if (bpc->pc.frame_start_found == 0) {
if ((state >> 48) == (('B' << 8) | 'M')) {
bpc->fsize = av_bswap32(state >> 16);
- bpc->pc.frame_start_found = 1;
+ if (bpc->fsize > 17)
+ bpc->pc.frame_start_found = 1;
}
} else if (bpc->pc.frame_start_found == 2+4+4) {
// unsigned hsize = av_bswap32(state>>32);
@@ -67,8 +68,12 @@ restart:
if (bpc->pc.index + i > 17) {
next = i - 17;
- } else
+ state = 0;
+ break;
+ } else {
+ bpc->pc.state64 = 0;
goto restart;
+ }
} else if (bpc->pc.frame_start_found)
bpc->pc.frame_start_found++;
}
@@ -89,7 +94,10 @@ flush:
if (ff_combine_frame(&bpc->pc, next, &buf, &buf_size) < 0)
return buf_size;
- bpc->pc.frame_start_found = 0;
+ if (next != END_NOT_FOUND && next < 0)
+ bpc->pc.frame_start_found = FFMAX(bpc->pc.frame_start_found - i - 1, 0);
+ else
+ bpc->pc.frame_start_found = 0;
*poutbuf = buf;
*poutbuf_size = buf_size;
diff --git a/libavcodec/cfhd.c b/libavcodec/cfhd.c
index d6d831b6cf..3b2901d8ff 100644
--- a/libavcodec/cfhd.c
+++ b/libavcodec/cfhd.c
@@ -425,6 +425,11 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
return ret;
}
}
+ ret = ff_set_dimensions(avctx, s->coded_width, s->coded_height);
+ if (ret < 0)
+ return ret;
+ frame.f->width =
+ frame.f->height = 0;
if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
return ret;
diff --git a/libavcodec/dca_core.c b/libavcodec/dca_core.c
index 48a8f618f7..19496e944b 100644
--- a/libavcodec/dca_core.c
+++ b/libavcodec/dca_core.c
@@ -1760,6 +1760,7 @@ static int parse_x96_frame_exss(DCACoreDecoder *s)
return ret;
// Channel set data
+ s->x96_nchannels = 0;
for (i = 0, x96_base_ch = 0; i < x96_nchsets; i++) {
header_pos = get_bits_count(&s->gb);
@@ -1899,9 +1900,10 @@ static int parse_optional_info(DCACoreDecoder *s)
}
}
- if (s->avctx->err_recognition & AV_EF_EXPLODE) {
+ if (!s->xch_pos) {
av_log(s->avctx, AV_LOG_ERROR, "XCH sync word not found\n");
- return AVERROR_INVALIDDATA;
+ if (s->avctx->err_recognition & AV_EF_EXPLODE)
+ return AVERROR_INVALIDDATA;
}
break;
@@ -1921,9 +1923,10 @@ static int parse_optional_info(DCACoreDecoder *s)
}
}
- if (s->avctx->err_recognition & AV_EF_EXPLODE) {
+ if (!s->x96_pos) {
av_log(s->avctx, AV_LOG_ERROR, "X96 sync word not found\n");
- return AVERROR_INVALIDDATA;
+ if (s->avctx->err_recognition & AV_EF_EXPLODE)
+ return AVERROR_INVALIDDATA;
}
break;
@@ -1946,9 +1949,10 @@ static int parse_optional_info(DCACoreDecoder *s)
}
}
- if (s->avctx->err_recognition & AV_EF_EXPLODE) {
+ if (!s->xxch_pos) {
av_log(s->avctx, AV_LOG_ERROR, "XXCH sync word not found\n");
- return AVERROR_INVALIDDATA;
+ if (s->avctx->err_recognition & AV_EF_EXPLODE)
+ return AVERROR_INVALIDDATA;
}
break;
}
diff --git a/libavcodec/diracdec.c b/libavcodec/diracdec.c
index e530a05de3..1d7bb9b98b 100644
--- a/libavcodec/diracdec.c
+++ b/libavcodec/diracdec.c
@@ -173,7 +173,7 @@ typedef struct DiracContext {
struct {
unsigned prefix_bytes;
- unsigned size_scaler;
+ uint64_t size_scaler;
} highquality;
struct {
@@ -826,9 +826,15 @@ static int decode_hq_slice(AVCodecContext *avctx, void *arg)
/* Luma + 2 Chroma planes */
for (i = 0; i < 3; i++) {
- int length = s->highquality.size_scaler * get_bits(gb, 8);
- int bits_left = 8 * length;
- int bits_end = get_bits_count(gb) + bits_left;
+ int64_t length = s->highquality.size_scaler * get_bits(gb, 8);
+ int64_t bits_left = 8 * length;
+ int64_t bits_end = get_bits_count(gb) + bits_left;
+
+ if (bits_end >= INT_MAX) {
+ av_log(s->avctx, AV_LOG_ERROR, "end too far away\n");
+ return AVERROR_INVALIDDATA;
+ }
+
for (level = 0; level < s->wavelet_depth; level++) {
for (orientation = !!level; orientation < 4; orientation++) {
decode_subband(s, gb, quants[level][orientation], slice->slice_x, slice->slice_y, bits_end,
@@ -848,7 +854,8 @@ static int decode_hq_slice(AVCodecContext *avctx, void *arg)
static int decode_lowdelay(DiracContext *s)
{
AVCodecContext *avctx = s->avctx;
- int slice_x, slice_y, bytes = 0, bufsize;
+ int slice_x, slice_y, bufsize;
+ int64_t bytes = 0;
const uint8_t *buf;
DiracSlice *slices;
int slice_num = 0;
@@ -872,6 +879,11 @@ static int decode_lowdelay(DiracContext *s)
if (bytes <= bufsize/8)
bytes += buf[bytes] * s->highquality.size_scaler + 1;
}
+ if (bytes >= INT_MAX) {
+ av_log(s->avctx, AV_LOG_ERROR, "too many bytes\n");
+ av_free(slices);
+ return AVERROR_INVALIDDATA;
+ }
slices[slice_num].bytes = bytes;
slices[slice_num].slice_x = slice_x;
@@ -891,8 +903,8 @@ static int decode_lowdelay(DiracContext *s)
} else {
for (slice_y = 0; bufsize > 0 && slice_y < s->num_y; slice_y++) {
for (slice_x = 0; bufsize > 0 && slice_x < s->num_x; slice_x++) {
- bytes = (slice_num+1) * s->lowdelay.bytes.num / s->lowdelay.bytes.den
- - slice_num * s->lowdelay.bytes.num / s->lowdelay.bytes.den;
+ bytes = (slice_num+1) * (int64_t)s->lowdelay.bytes.num / s->lowdelay.bytes.den
+ - slice_num * (int64_t)s->lowdelay.bytes.num / s->lowdelay.bytes.den;
slices[slice_num].bytes = bytes;
slices[slice_num].slice_x = slice_x;
slices[slice_num].slice_y = slice_y;
@@ -1151,6 +1163,10 @@ static int dirac_unpack_idwt_params(DiracContext *s)
} else if (s->hq_picture) {
s->highquality.prefix_bytes = svq3_get_ue_golomb(gb);
s->highquality.size_scaler = svq3_get_ue_golomb(gb);
+ if (s->highquality.prefix_bytes >= INT_MAX / 8) {
+ av_log(s->avctx,AV_LOG_ERROR,"too many prefix bytes\n");
+ return AVERROR_INVALIDDATA;
+ }
}
/* [DIRAC_STD] 11.3.5 Quantisation matrices (low-delay syntax). quant_matrix() */
diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c
index 9ee992144b..42e59a1efc 100644
--- a/libavcodec/ffv1enc.c
+++ b/libavcodec/ffv1enc.c
@@ -780,14 +780,12 @@ FF_ENABLE_DEPRECATION_WARNINGS
s->colorspace = 1;
s->transparency = 1;
s->chroma_planes = 1;
- if (!avctx->bits_per_raw_sample)
- s->bits_per_raw_sample = 8;
+ s->bits_per_raw_sample = 8;
break;
case AV_PIX_FMT_0RGB32:
s->colorspace = 1;
s->chroma_planes = 1;
- if (!avctx->bits_per_raw_sample)
- s->bits_per_raw_sample = 8;
+ s->bits_per_raw_sample = 8;
break;
case AV_PIX_FMT_GBRP9:
if (!avctx->bits_per_raw_sample)
diff --git a/libavcodec/flac_parser.c b/libavcodec/flac_parser.c
index 3723716441..183fe6e5c9 100644
--- a/libavcodec/flac_parser.c
+++ b/libavcodec/flac_parser.c
@@ -617,8 +617,8 @@ static int flac_parse(AVCodecParserContext *s, AVCodecContext *avctx,
if (!av_fifo_space(fpc->fifo_buf) &&
av_fifo_size(fpc->fifo_buf) / FLAC_AVG_FRAME_SIZE >
- fpc->nb_headers_buffered * 10) {
- /* There is less than one valid flac header buffered for 10 headers
+ fpc->nb_headers_buffered * 20) {
+ /* There is less than one valid flac header buffered for 20 headers
* buffered. Therefore the fifo is most likely filled with invalid
* data and the input is not a flac file. */
goto handle_error;
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index fe8d44e3bd..b979b15382 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -1656,8 +1656,8 @@ again:
av_log(h->avctx, AV_LOG_ERROR, "decode_slice_header error\n");
sl->ref_count[0] = sl->ref_count[1] = sl->list_count = 0;
} else if (err == SLICE_SINGLETHREAD) {
- if (context_count > 1) {
- ret = ff_h264_execute_decode_slices(h, context_count - 1);
+ if (context_count > 0) {
+ ret = ff_h264_execute_decode_slices(h, context_count);
if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
goto end;
context_count = 0;
@@ -1678,6 +1678,47 @@ again:
ret = 0;
end:
+
+#if CONFIG_ERROR_RESILIENCE
+ sl = h->slice_ctx;
+ /*
+ * FIXME: Error handling code does not seem to support interlaced
+ * when slices span multiple rows
+ * The ff_er_add_slice calls don't work right for bottom
+ * fields; they cause massive erroneous error concealing
+ * Error marking covers both fields (top and bottom).
+ * This causes a mismatched s->error_count
+ * and a bad error table. Further, the error count goes to
+ * INT_MAX when called for bottom field, because mb_y is
+ * past end by one (callers fault) and resync_mb_y != 0
+ * causes problems for the first MB line, too.
+ */
+ if (!FIELD_PICTURE(h) && h->current_slice && !h->sps.new && h->enable_er) {
+ int use_last_pic = h->last_pic_for_ec.f->buf[0] && !sl->ref_count[0];
+
+ ff_h264_set_erpic(&sl->er.cur_pic, h->cur_pic_ptr);
+
+ if (use_last_pic) {
+ ff_h264_set_erpic(&sl->er.last_pic, &h->last_pic_for_ec);
+ sl->ref_list[0][0].parent = &h->last_pic_for_ec;
+ memcpy(sl->ref_list[0][0].data, h->last_pic_for_ec.f->data, sizeof(sl->ref_list[0][0].data));
+ memcpy(sl->ref_list[0][0].linesize, h->last_pic_for_ec.f->linesize, sizeof(sl->ref_list[0][0].linesize));
+ sl->ref_list[0][0].reference = h->last_pic_for_ec.reference;
+ } else if (sl->ref_count[0]) {
+ ff_h264_set_erpic(&sl->er.last_pic, sl->ref_list[0][0].parent);
+ } else
+ ff_h264_set_erpic(&sl->er.last_pic, NULL);
+
+ if (sl->ref_count[1])
+ ff_h264_set_erpic(&sl->er.next_pic, sl->ref_list[1][0].parent);
+
+ sl->er.ref_count = sl->ref_count[0];
+
+ ff_er_frame_end(&sl->er);
+ if (use_last_pic)
+ memset(&sl->ref_list[0][0], 0, sizeof(sl->ref_list[0][0]));
+ }
+#endif /* CONFIG_ERROR_RESILIENCE */
/* clean up */
if (h->cur_pic_ptr && !h->droppable) {
ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX,
@@ -1740,7 +1781,7 @@ static int is_extra(const uint8_t *buf, int buf_size)
const uint8_t *p= buf+6;
while(cnt--){
int nalsize= AV_RB16(p) + 2;
- if(nalsize > buf_size - (p-buf) || p[2]!=0x67)
+ if(nalsize > buf_size - (p-buf) || (p[2] & 0x9F) != 7)
return 0;
p += nalsize;
}
@@ -1749,7 +1790,7 @@ static int is_extra(const uint8_t *buf, int buf_size)
return 0;
while(cnt--){
int nalsize= AV_RB16(p) + 2;
- if(nalsize > buf_size - (p-buf) || p[2]!=0x68)
+ if(nalsize > buf_size - (p-buf) || (p[2] & 0x9F) != 8)
return 0;
p += nalsize;
}
diff --git a/libavcodec/h264_picture.c b/libavcodec/h264_picture.c
index 731d780e67..c4b17c03c9 100644
--- a/libavcodec/h264_picture.c
+++ b/libavcodec/h264_picture.c
@@ -186,47 +186,6 @@ int ff_h264_field_end(H264Context *h, H264SliceContext *sl, int in_setup)
ff_vdpau_h264_picture_complete(h);
#endif
-#if CONFIG_ERROR_RESILIENCE
- av_assert0(sl == h->slice_ctx);
- /*
- * FIXME: Error handling code does not seem to support interlaced
- * when slices span multiple rows
- * The ff_er_add_slice calls don't work right for bottom
- * fields; they cause massive erroneous error concealing
- * Error marking covers both fields (top and bottom).
- * This causes a mismatched s->error_count
- * and a bad error table. Further, the error count goes to
- * INT_MAX when called for bottom field, because mb_y is
- * past end by one (callers fault) and resync_mb_y != 0
- * causes problems for the first MB line, too.
- */
- if (!FIELD_PICTURE(h) && h->current_slice && !h->sps.new && h->enable_er) {
- int use_last_pic = h->last_pic_for_ec.f->buf[0] && !sl->ref_count[0];
-
- ff_h264_set_erpic(&sl->er.cur_pic, h->cur_pic_ptr);
-
- if (use_last_pic) {
- ff_h264_set_erpic(&sl->er.last_pic, &h->last_pic_for_ec);
- sl->ref_list[0][0].parent = &h->last_pic_for_ec;
- memcpy(sl->ref_list[0][0].data, h->last_pic_for_ec.f->data, sizeof(sl->ref_list[0][0].data));
- memcpy(sl->ref_list[0][0].linesize, h->last_pic_for_ec.f->linesize, sizeof(sl->ref_list[0][0].linesize));
- sl->ref_list[0][0].reference = h->last_pic_for_ec.reference;
- } else if (sl->ref_count[0]) {
- ff_h264_set_erpic(&sl->er.last_pic, sl->ref_list[0][0].parent);
- } else
- ff_h264_set_erpic(&sl->er.last_pic, NULL);
-
- if (sl->ref_count[1])
- ff_h264_set_erpic(&sl->er.next_pic, sl->ref_list[1][0].parent);
-
- sl->er.ref_count = sl->ref_count[0];
-
- ff_er_frame_end(&sl->er);
- if (use_last_pic)
- memset(&sl->ref_list[0][0], 0, sizeof(sl->ref_list[0][0]));
- }
-#endif /* CONFIG_ERROR_RESILIENCE */
-
if (!in_setup && !h->droppable)
ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX,
h->picture_structure == PICT_BOTTOM_FIELD);
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 2131338a7b..0b3e0406f2 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -1282,9 +1282,13 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl)
if (first_slice) {
h->pps = *h->pps_buffers[pps_id];
- } else if (h->setup_finished && h->dequant_coeff_pps != pps_id) {
- av_log(h->avctx, AV_LOG_ERROR, "PPS changed between slices\n");
- return AVERROR_INVALIDDATA;
+ } else {
+ if (h->pps.sps_id != pps->sps_id ||
+ h->pps.transform_8x8_mode != pps->transform_8x8_mode ||
+ (h->setup_finished && h->dequant_coeff_pps != pps_id)) {
+ av_log(h->avctx, AV_LOG_ERROR, "PPS changed between slices\n");
+ return AVERROR_INVALIDDATA;
+ }
}
if (pps->sps_id != h->sps.sps_id ||
diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
index 203f90ab2e..0e849b81c6 100644
--- a/libavcodec/hevc.c
+++ b/libavcodec/hevc.c
@@ -3149,6 +3149,8 @@ static av_cold int hevc_init_context(AVCodecContext *avctx)
s->context_initialized = 1;
s->eos = 0;
+ ff_hevc_reset_sei(s);
+
return 0;
fail:
diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h
index c91f815857..5d9d35c446 100644
--- a/libavcodec/hevc.h
+++ b/libavcodec/hevc.h
@@ -1092,6 +1092,15 @@ int ff_hevc_split_packet(HEVCContext *s, HEVCPacket *pkt, const uint8_t *buf, in
int ff_hevc_encode_nal_vps(HEVCVPS *vps, unsigned int id,
uint8_t *buf, int buf_size);
+/**
+ * Reset SEI values that are stored on the Context.
+ * e.g. Caption data that was extracted during NAL
+ * parsing.
+ *
+ * @param s HEVCContext.
+ */
+void ff_hevc_reset_sei(HEVCContext *s);
+
extern const uint8_t ff_hevc_qpel_extra_before[4];
extern const uint8_t ff_hevc_qpel_extra_after[4];
extern const uint8_t ff_hevc_qpel_extra[4];
diff --git a/libavcodec/hevc_parse.c b/libavcodec/hevc_parse.c
index 63ed84a8de..d557cc7f04 100644
--- a/libavcodec/hevc_parse.c
+++ b/libavcodec/hevc_parse.c
@@ -232,8 +232,14 @@ int ff_hevc_split_packet(HEVCContext *s, HEVCPacket *pkt, const uint8_t *buf, in
++buf;
--length;
if (length < 4) {
- av_log(avctx, AV_LOG_ERROR, "No start code is found.\n");
- return AVERROR_INVALIDDATA;
+ if (pkt->nb_nals > 0) {
+ // No more start codes: we discarded some irrelevant
+ // bytes at the end of the packet.
+ return 0;
+ } else {
+ av_log(avctx, AV_LOG_ERROR, "No start code is found.\n");
+ return AVERROR_INVALIDDATA;
+ }
}
}
diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c
index 4625e6149a..d635716fb9 100644
--- a/libavcodec/hevc_parser.c
+++ b/libavcodec/hevc_parser.c
@@ -209,6 +209,8 @@ static inline int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf,
h->avctx = avctx;
+ ff_hevc_reset_sei(h);
+
if (!buf_size)
return 0;
diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c
index 40685fe5d8..f598b6393a 100644
--- a/libavcodec/hevc_sei.c
+++ b/libavcodec/hevc_sei.c
@@ -373,3 +373,9 @@ int ff_hevc_decode_nal_sei(HEVCContext *s)
} while (more_rbsp_data(&s->HEVClc->gb));
return 1;
}
+
+void ff_hevc_reset_sei(HEVCContext *s)
+{
+ s->a53_caption_size = 0;
+ av_freep(&s->a53_caption);
+}
diff --git a/libavcodec/indeo2.c b/libavcodec/indeo2.c
index 3424e00b38..17f236761d 100644
--- a/libavcodec/indeo2.c
+++ b/libavcodec/indeo2.c
@@ -146,6 +146,7 @@ static int ir2_decode_frame(AVCodecContext *avctx,
AVFrame *picture = data;
AVFrame * const p = s->picture;
int start, ret;
+ int ltab, ctab;
if ((ret = ff_reget_buffer(avctx, p)) < 0)
return ret;
@@ -168,34 +169,36 @@ static int ir2_decode_frame(AVCodecContext *avctx,
if ((ret = init_get_bits8(&s->gb, buf + start, buf_size - start)) < 0)
return ret;
+ ltab = buf[0x22] & 3;
+ ctab = buf[0x22] >> 2;
if (s->decode_delta) { /* intraframe */
if ((ret = ir2_decode_plane(s, avctx->width, avctx->height,
p->data[0], p->linesize[0],
- ir2_luma_table)) < 0)
+ ir2_delta_table[ltab])) < 0)
return ret;
/* swapped U and V */
if ((ret = ir2_decode_plane(s, avctx->width >> 2, avctx->height >> 2,
p->data[2], p->linesize[2],
- ir2_luma_table)) < 0)
+ ir2_delta_table[ctab])) < 0)
return ret;
if ((ret = ir2_decode_plane(s, avctx->width >> 2, avctx->height >> 2,
p->data[1], p->linesize[1],
- ir2_luma_table)) < 0)
+ ir2_delta_table[ctab])) < 0)
return ret;
} else { /* interframe */
if ((ret = ir2_decode_plane_inter(s, avctx->width, avctx->height,
p->data[0], p->linesize[0],
- ir2_luma_table)) < 0)
+ ir2_delta_table[ltab])) < 0)
return ret;
/* swapped U and V */
if ((ret = ir2_decode_plane_inter(s, avctx->width >> 2, avctx->height >> 2,
p->data[2], p->linesize[2],
- ir2_luma_table)) < 0)
+ ir2_delta_table[ctab])) < 0)
return ret;
if ((ret = ir2_decode_plane_inter(s, avctx->width >> 2, avctx->height >> 2,
p->data[1], p->linesize[1],
- ir2_luma_table)) < 0)
+ ir2_delta_table[ctab])) < 0)
return ret;
}
diff --git a/libavcodec/indeo2data.h b/libavcodec/indeo2data.h
index 0d6d82f22c..e05c91ff58 100644
--- a/libavcodec/indeo2data.h
+++ b/libavcodec/indeo2data.h
@@ -27,115 +27,211 @@
#define IR2_CODES 143
static const uint16_t ir2_codes[IR2_CODES][2] = {
#ifdef BITSTREAM_READER_LE
-{0x0000, 3}, {0x0004, 3}, {0x0006, 3}, {0x0001, 5},
-{0x0009, 5}, {0x0019, 5}, {0x000D, 5}, {0x001D, 5},
-{0x0023, 6}, {0x0013, 6}, {0x0033, 6}, {0x000B, 6},
-{0x002B, 6}, {0x001B, 6}, {0x0007, 8}, {0x0087, 8},
-{0x0027, 8}, {0x00A7, 8}, {0x0067, 8}, {0x00E7, 8},
-{0x0097, 8}, {0x0057, 8}, {0x0037, 8}, {0x00B7, 8},
-{0x00F7, 8}, {0x000F, 9}, {0x008F, 9}, {0x018F, 9},
-{0x014F, 9}, {0x00CF, 9}, {0x002F, 9}, {0x012F, 9},
-{0x01AF, 9}, {0x006F, 9}, {0x00EF, 9}, {0x01EF, 9},
-{0x001F, 10}, {0x021F, 10}, {0x011F, 10}, {0x031F, 10},
-{0x009F, 10}, {0x029F, 10}, {0x019F, 10}, {0x039F, 10},
-{0x005F, 10}, {0x025F, 10}, {0x015F, 10}, {0x035F, 10},
-{0x00DF, 10}, {0x02DF, 10}, {0x01DF, 10}, {0x03DF, 10},
-{0x003F, 13}, {0x103F, 13}, {0x083F, 13}, {0x183F, 13},
-{0x043F, 13}, {0x143F, 13}, {0x0C3F, 13}, {0x1C3F, 13},
-{0x023F, 13}, {0x123F, 13}, {0x0A3F, 13}, {0x1A3F, 13},
-{0x063F, 13}, {0x163F, 13}, {0x0E3F, 13}, {0x1E3F, 13},
-{0x013F, 13}, {0x113F, 13}, {0x093F, 13}, {0x193F, 13},
-{0x053F, 13}, {0x153F, 13}, {0x0D3F, 13}, {0x1D3F, 13},
-{0x033F, 13}, {0x133F, 13}, {0x0B3F, 13}, {0x1B3F, 13},
-{0x073F, 13}, {0x173F, 13}, {0x0F3F, 13}, {0x1F3F, 13},
-{0x00BF, 13}, {0x10BF, 13}, {0x08BF, 13}, {0x18BF, 13},
-{0x04BF, 13}, {0x14BF, 13}, {0x0CBF, 13}, {0x1CBF, 13},
-{0x02BF, 13}, {0x12BF, 13}, {0x0ABF, 13}, {0x1ABF, 13},
-{0x06BF, 13}, {0x16BF, 13}, {0x0EBF, 13}, {0x1EBF, 13},
-{0x01BF, 13}, {0x11BF, 13}, {0x09BF, 13}, {0x19BF, 13},
-{0x05BF, 13}, {0x15BF, 13}, {0x0DBF, 13}, {0x1DBF, 13},
-{0x03BF, 13}, {0x13BF, 13}, {0x0BBF, 13}, {0x1BBF, 13},
-{0x07BF, 13}, {0x17BF, 13}, {0x0FBF, 13}, {0x1FBF, 13},
-{0x007F, 14}, {0x207F, 14}, {0x107F, 14}, {0x307F, 14},
-{0x087F, 14}, {0x287F, 14}, {0x187F, 14}, {0x387F, 14},
-{0x047F, 14}, {0x247F, 14}, {0x147F, 14}, {0x0002, 3},
-{0x0011, 5}, {0x0005, 5}, {0x0015, 5}, {0x0003, 6},
-{0x003B, 6}, {0x0047, 8}, {0x00C7, 8}, {0x0017, 8},
-{0x00D7, 8}, {0x0077, 8}, {0x010F, 9}, {0x004F, 9},
-{0x01CF, 9}, {0x00AF, 9}, {0x016F, 9},
+ { 0x0000, 3 }, { 0x0004, 3 }, { 0x0006, 3 }, { 0x0001, 5 },
+ { 0x0009, 5 }, { 0x0019, 5 }, { 0x000D, 5 }, { 0x001D, 5 },
+ { 0x0023, 6 }, { 0x0013, 6 }, { 0x0033, 6 }, { 0x000B, 6 },
+ { 0x002B, 6 }, { 0x001B, 6 }, { 0x0007, 8 }, { 0x0087, 8 },
+ { 0x0027, 8 }, { 0x00A7, 8 }, { 0x0067, 8 }, { 0x00E7, 8 },
+ { 0x0097, 8 }, { 0x0057, 8 }, { 0x0037, 8 }, { 0x00B7, 8 },
+ { 0x00F7, 8 }, { 0x000F, 9 }, { 0x008F, 9 }, { 0x018F, 9 },
+ { 0x014F, 9 }, { 0x00CF, 9 }, { 0x002F, 9 }, { 0x012F, 9 },
+ { 0x01AF, 9 }, { 0x006F, 9 }, { 0x00EF, 9 }, { 0x01EF, 9 },
+ { 0x001F, 10 }, { 0x021F, 10 }, { 0x011F, 10 }, { 0x031F, 10 },
+ { 0x009F, 10 }, { 0x029F, 10 }, { 0x019F, 10 }, { 0x039F, 10 },
+ { 0x005F, 10 }, { 0x025F, 10 }, { 0x015F, 10 }, { 0x035F, 10 },
+ { 0x00DF, 10 }, { 0x02DF, 10 }, { 0x01DF, 10 }, { 0x03DF, 10 },
+ { 0x003F, 13 }, { 0x103F, 13 }, { 0x083F, 13 }, { 0x183F, 13 },
+ { 0x043F, 13 }, { 0x143F, 13 }, { 0x0C3F, 13 }, { 0x1C3F, 13 },
+ { 0x023F, 13 }, { 0x123F, 13 }, { 0x0A3F, 13 }, { 0x1A3F, 13 },
+ { 0x063F, 13 }, { 0x163F, 13 }, { 0x0E3F, 13 }, { 0x1E3F, 13 },
+ { 0x013F, 13 }, { 0x113F, 13 }, { 0x093F, 13 }, { 0x193F, 13 },
+ { 0x053F, 13 }, { 0x153F, 13 }, { 0x0D3F, 13 }, { 0x1D3F, 13 },
+ { 0x033F, 13 }, { 0x133F, 13 }, { 0x0B3F, 13 }, { 0x1B3F, 13 },
+ { 0x073F, 13 }, { 0x173F, 13 }, { 0x0F3F, 13 }, { 0x1F3F, 13 },
+ { 0x00BF, 13 }, { 0x10BF, 13 }, { 0x08BF, 13 }, { 0x18BF, 13 },
+ { 0x04BF, 13 }, { 0x14BF, 13 }, { 0x0CBF, 13 }, { 0x1CBF, 13 },
+ { 0x02BF, 13 }, { 0x12BF, 13 }, { 0x0ABF, 13 }, { 0x1ABF, 13 },
+ { 0x06BF, 13 }, { 0x16BF, 13 }, { 0x0EBF, 13 }, { 0x1EBF, 13 },
+ { 0x01BF, 13 }, { 0x11BF, 13 }, { 0x09BF, 13 }, { 0x19BF, 13 },
+ { 0x05BF, 13 }, { 0x15BF, 13 }, { 0x0DBF, 13 }, { 0x1DBF, 13 },
+ { 0x03BF, 13 }, { 0x13BF, 13 }, { 0x0BBF, 13 }, { 0x1BBF, 13 },
+ { 0x07BF, 13 }, { 0x17BF, 13 }, { 0x0FBF, 13 }, { 0x1FBF, 13 },
+ { 0x007F, 14 }, { 0x207F, 14 }, { 0x107F, 14 }, { 0x307F, 14 },
+ { 0x087F, 14 }, { 0x287F, 14 }, { 0x187F, 14 }, { 0x387F, 14 },
+ { 0x047F, 14 }, { 0x247F, 14 }, { 0x147F, 14 }, { 0x0002, 3 },
+ { 0x0011, 5 }, { 0x0005, 5 }, { 0x0015, 5 }, { 0x0003, 6 },
+ { 0x003B, 6 }, { 0x0047, 8 }, { 0x00C7, 8 }, { 0x0017, 8 },
+ { 0x00D7, 8 }, { 0x0077, 8 }, { 0x010F, 9 }, { 0x004F, 9 },
+ { 0x01CF, 9 }, { 0x00AF, 9 }, { 0x016F, 9 },
#else
- {0x0000, 3}, {0x0001, 3}, {0x0003, 3}, {0x0010, 5},
- {0x0012, 5}, {0x0013, 5}, {0x0016, 5}, {0x0017, 5},
- {0x0031, 6}, {0x0032, 6}, {0x0033, 6}, {0x0034, 6},
- {0x0035, 6}, {0x0036, 6}, {0x00E0, 8}, {0x00E1, 8},
- {0x00E4, 8}, {0x00E5, 8}, {0x00E6, 8}, {0x00E7, 8},
- {0x00E9, 8}, {0x00EA, 8}, {0x00EC, 8}, {0x00ED, 8},
- {0x00EF, 8}, {0x01E0, 9}, {0x01E2, 9}, {0x01E3, 9},
- {0x01E5, 9}, {0x01E6, 9}, {0x01E8, 9}, {0x01E9, 9},
- {0x01EB, 9}, {0x01EC, 9}, {0x01EE, 9}, {0x01EF, 9},
- {0x03E0, 10}, {0x03E1, 10}, {0x03E2, 10}, {0x03E3, 10},
- {0x03E4, 10}, {0x03E5, 10}, {0x03E6, 10}, {0x03E7, 10},
- {0x03E8, 10}, {0x03E9, 10}, {0x03EA, 10}, {0x03EB, 10},
- {0x03EC, 10}, {0x03ED, 10}, {0x03EE, 10}, {0x03EF, 10},
- {0x1F80, 13}, {0x1F81, 13}, {0x1F82, 13}, {0x1F83, 13},
- {0x1F84, 13}, {0x1F85, 13}, {0x1F86, 13}, {0x1F87, 13},
- {0x1F88, 13}, {0x1F89, 13}, {0x1F8A, 13}, {0x1F8B, 13},
- {0x1F8C, 13}, {0x1F8D, 13}, {0x1F8E, 13}, {0x1F8F, 13},
- {0x1F90, 13}, {0x1F91, 13}, {0x1F92, 13}, {0x1F93, 13},
- {0x1F94, 13}, {0x1F95, 13}, {0x1F96, 13}, {0x1F97, 13},
- {0x1F98, 13}, {0x1F99, 13}, {0x1F9A, 13}, {0x1F9B, 13},
- {0x1F9C, 13}, {0x1F9D, 13}, {0x1F9E, 13}, {0x1F9F, 13},
- {0x1FA0, 13}, {0x1FA1, 13}, {0x1FA2, 13}, {0x1FA3, 13},
- {0x1FA4, 13}, {0x1FA5, 13}, {0x1FA6, 13}, {0x1FA7, 13},
- {0x1FA8, 13}, {0x1FA9, 13}, {0x1FAA, 13}, {0x1FAB, 13},
- {0x1FAC, 13}, {0x1FAD, 13}, {0x1FAE, 13}, {0x1FAF, 13},
- {0x1FB0, 13}, {0x1FB1, 13}, {0x1FB2, 13}, {0x1FB3, 13},
- {0x1FB4, 13}, {0x1FB5, 13}, {0x1FB6, 13}, {0x1FB7, 13},
- {0x1FB8, 13}, {0x1FB9, 13}, {0x1FBA, 13}, {0x1FBB, 13},
- {0x1FBC, 13}, {0x1FBD, 13}, {0x1FBE, 13}, {0x1FBF, 13},
- {0x3F80, 14}, {0x3F81, 14}, {0x3F82, 14}, {0x3F83, 14},
- {0x3F84, 14}, {0x3F85, 14}, {0x3F86, 14}, {0x3F87, 14},
- {0x3F88, 14}, {0x3F89, 14}, {0x3F8A, 14}, {0x0002, 3},
- {0x0011, 5}, {0x0014, 5}, {0x0015, 5}, {0x0030, 6},
- {0x0037, 6}, {0x00E2, 8}, {0x00E3, 8}, {0x00E8, 8},
- {0x00EB, 8}, {0x00EE, 8}, {0x01E1, 9}, {0x01E4, 9},
- {0x01E7, 9}, {0x01EA, 9}, {0x01ED, 9}
+ { 0x0000, 3 }, { 0x0001, 3 }, { 0x0003, 3 }, { 0x0010, 5 },
+ { 0x0012, 5 }, { 0x0013, 5 }, { 0x0016, 5 }, { 0x0017, 5 },
+ { 0x0031, 6 }, { 0x0032, 6 }, { 0x0033, 6 }, { 0x0034, 6 },
+ { 0x0035, 6 }, { 0x0036, 6 }, { 0x00E0, 8 }, { 0x00E1, 8 },
+ { 0x00E4, 8 }, { 0x00E5, 8 }, { 0x00E6, 8 }, { 0x00E7, 8 },
+ { 0x00E9, 8 }, { 0x00EA, 8 }, { 0x00EC, 8 }, { 0x00ED, 8 },
+ { 0x00EF, 8 }, { 0x01E0, 9 }, { 0x01E2, 9 }, { 0x01E3, 9 },
+ { 0x01E5, 9 }, { 0x01E6, 9 }, { 0x01E8, 9 }, { 0x01E9, 9 },
+ { 0x01EB, 9 }, { 0x01EC, 9 }, { 0x01EE, 9 }, { 0x01EF, 9 },
+ { 0x03E0, 10 }, { 0x03E1, 10 }, { 0x03E2, 10 }, { 0x03E3, 10 },
+ { 0x03E4, 10 }, { 0x03E5, 10 }, { 0x03E6, 10 }, { 0x03E7, 10 },
+ { 0x03E8, 10 }, { 0x03E9, 10 }, { 0x03EA, 10 }, { 0x03EB, 10 },
+ { 0x03EC, 10 }, { 0x03ED, 10 }, { 0x03EE, 10 }, { 0x03EF, 10 },
+ { 0x1F80, 13 }, { 0x1F81, 13 }, { 0x1F82, 13 }, { 0x1F83, 13 },
+ { 0x1F84, 13 }, { 0x1F85, 13 }, { 0x1F86, 13 }, { 0x1F87, 13 },
+ { 0x1F88, 13 }, { 0x1F89, 13 }, { 0x1F8A, 13 }, { 0x1F8B, 13 },
+ { 0x1F8C, 13 }, { 0x1F8D, 13 }, { 0x1F8E, 13 }, { 0x1F8F, 13 },
+ { 0x1F90, 13 }, { 0x1F91, 13 }, { 0x1F92, 13 }, { 0x1F93, 13 },
+ { 0x1F94, 13 }, { 0x1F95, 13 }, { 0x1F96, 13 }, { 0x1F97, 13 },
+ { 0x1F98, 13 }, { 0x1F99, 13 }, { 0x1F9A, 13 }, { 0x1F9B, 13 },
+ { 0x1F9C, 13 }, { 0x1F9D, 13 }, { 0x1F9E, 13 }, { 0x1F9F, 13 },
+ { 0x1FA0, 13 }, { 0x1FA1, 13 }, { 0x1FA2, 13 }, { 0x1FA3, 13 },
+ { 0x1FA4, 13 }, { 0x1FA5, 13 }, { 0x1FA6, 13 }, { 0x1FA7, 13 },
+ { 0x1FA8, 13 }, { 0x1FA9, 13 }, { 0x1FAA, 13 }, { 0x1FAB, 13 },
+ { 0x1FAC, 13 }, { 0x1FAD, 13 }, { 0x1FAE, 13 }, { 0x1FAF, 13 },
+ { 0x1FB0, 13 }, { 0x1FB1, 13 }, { 0x1FB2, 13 }, { 0x1FB3, 13 },
+ { 0x1FB4, 13 }, { 0x1FB5, 13 }, { 0x1FB6, 13 }, { 0x1FB7, 13 },
+ { 0x1FB8, 13 }, { 0x1FB9, 13 }, { 0x1FBA, 13 }, { 0x1FBB, 13 },
+ { 0x1FBC, 13 }, { 0x1FBD, 13 }, { 0x1FBE, 13 }, { 0x1FBF, 13 },
+ { 0x3F80, 14 }, { 0x3F81, 14 }, { 0x3F82, 14 }, { 0x3F83, 14 },
+ { 0x3F84, 14 }, { 0x3F85, 14 }, { 0x3F86, 14 }, { 0x3F87, 14 },
+ { 0x3F88, 14 }, { 0x3F89, 14 }, { 0x3F8A, 14 }, { 0x0002, 3 },
+ { 0x0011, 5 }, { 0x0014, 5 }, { 0x0015, 5 }, { 0x0030, 6 },
+ { 0x0037, 6 }, { 0x00E2, 8 }, { 0x00E3, 8 }, { 0x00E8, 8 },
+ { 0x00EB, 8 }, { 0x00EE, 8 }, { 0x01E1, 9 }, { 0x01E4, 9 },
+ { 0x01E7, 9 }, { 0x01EA, 9 }, { 0x01ED, 9 },
#endif
};
-static const uint8_t ir2_luma_table[256] = {
- 0x80, 0x80, 0x84, 0x84, 0x7C, 0x7C, 0x7F, 0x85,
- 0x81, 0x7B, 0x85, 0x7F, 0x7B, 0x81, 0x8C, 0x8C,
- 0x74, 0x74, 0x83, 0x8D, 0x7D, 0x73, 0x8D, 0x83,
- 0x73, 0x7D, 0x77, 0x89, 0x89, 0x77, 0x89, 0x77,
- 0x77, 0x89, 0x8C, 0x95, 0x74, 0x6B, 0x95, 0x8C,
- 0x6B, 0x74, 0x7C, 0x90, 0x84, 0x70, 0x90, 0x7C,
- 0x70, 0x84, 0x96, 0x96, 0x6A, 0x6A, 0x82, 0x98,
- 0x7E, 0x68, 0x98, 0x82, 0x68, 0x7E, 0x97, 0xA2,
- 0x69, 0x5E, 0xA2, 0x97, 0x5E, 0x69, 0xA2, 0xA2,
- 0x5E, 0x5E, 0x8B, 0xA3, 0x75, 0x5D, 0xA3, 0x8B,
- 0x5D, 0x75, 0x71, 0x95, 0x8F, 0x6B, 0x95, 0x71,
- 0x6B, 0x8F, 0x78, 0x9D, 0x88, 0x63, 0x9D, 0x78,
- 0x63, 0x88, 0x7F, 0xA7, 0x81, 0x59, 0xA7, 0x7F,
- 0x59, 0x81, 0xA4, 0xB1, 0x5C, 0x4F, 0xB1, 0xA4,
- 0x4F, 0x5C, 0x96, 0xB1, 0x6A, 0x4F, 0xB1, 0x96,
- 0x4F, 0x6A, 0xB2, 0xB2, 0x4E, 0x4E, 0x65, 0x9B,
- 0x9B, 0x65, 0x9B, 0x65, 0x65, 0x9B, 0x89, 0xB4,
- 0x77, 0x4C, 0xB4, 0x89, 0x4C, 0x77, 0x6A, 0xA3,
- 0x96, 0x5D, 0xA3, 0x6A, 0x5D, 0x96, 0x73, 0xAC,
- 0x8D, 0x54, 0xAC, 0x73, 0x54, 0x8D, 0xB4, 0xC3,
- 0x4C, 0x3D, 0xC3, 0xB4, 0x3D, 0x4C, 0xA4, 0xC3,
- 0x5C, 0x3D, 0xC3, 0xA4, 0x3D, 0x5C, 0xC4, 0xC4,
- 0x3C, 0x3C, 0x96, 0xC6, 0x6A, 0x3A, 0xC6, 0x96,
- 0x3A, 0x6A, 0x7C, 0xBA, 0x84, 0x46, 0xBA, 0x7C,
- 0x46, 0x84, 0x5B, 0xAB, 0xA5, 0x55, 0xAB, 0x5B,
- 0x55, 0xA5, 0x63, 0xB4, 0x9D, 0x4C, 0xB4, 0x63,
- 0x4C, 0x9D, 0x86, 0xCA, 0x7A, 0x36, 0xCA, 0x86,
- 0x36, 0x7A, 0xB6, 0xD7, 0x4A, 0x29, 0xD7, 0xB6,
- 0x29, 0x4A, 0xC8, 0xD7, 0x38, 0x29, 0xD7, 0xC8,
- 0x29, 0x38, 0xA4, 0xD8, 0x5C, 0x28, 0xD8, 0xA4,
- 0x28, 0x5C, 0x6C, 0xC1, 0x94, 0x3F, 0xC1, 0x6C,
- 0x3F, 0x94, 0xD9, 0xD9, 0x27, 0x27, 0x80, 0x80
+static const uint8_t ir2_delta_table[4][256] = {
+ { 0x80, 0x80, 0x84, 0x84, 0x7C, 0x7C, 0x7F, 0x85,
+ 0x81, 0x7B, 0x85, 0x7F, 0x7B, 0x81, 0x8C, 0x8C,
+ 0x74, 0x74, 0x83, 0x8D, 0x7D, 0x73, 0x8D, 0x83,
+ 0x73, 0x7D, 0x77, 0x89, 0x89, 0x77, 0x89, 0x77,
+ 0x77, 0x89, 0x8C, 0x95, 0x74, 0x6B, 0x95, 0x8C,
+ 0x6B, 0x74, 0x7C, 0x90, 0x84, 0x70, 0x90, 0x7C,
+ 0x70, 0x84, 0x96, 0x96, 0x6A, 0x6A, 0x82, 0x98,
+ 0x7E, 0x68, 0x98, 0x82, 0x68, 0x7E, 0x97, 0xA2,
+ 0x69, 0x5E, 0xA2, 0x97, 0x5E, 0x69, 0xA2, 0xA2,
+ 0x5E, 0x5E, 0x8B, 0xA3, 0x75, 0x5D, 0xA3, 0x8B,
+ 0x5D, 0x75, 0x71, 0x95, 0x8F, 0x6B, 0x95, 0x71,
+ 0x6B, 0x8F, 0x78, 0x9D, 0x88, 0x63, 0x9D, 0x78,
+ 0x63, 0x88, 0x7F, 0xA7, 0x81, 0x59, 0xA7, 0x7F,
+ 0x59, 0x81, 0xA4, 0xB1, 0x5C, 0x4F, 0xB1, 0xA4,
+ 0x4F, 0x5C, 0x96, 0xB1, 0x6A, 0x4F, 0xB1, 0x96,
+ 0x4F, 0x6A, 0xB2, 0xB2, 0x4E, 0x4E, 0x65, 0x9B,
+ 0x9B, 0x65, 0x9B, 0x65, 0x65, 0x9B, 0x89, 0xB4,
+ 0x77, 0x4C, 0xB4, 0x89, 0x4C, 0x77, 0x6A, 0xA3,
+ 0x96, 0x5D, 0xA3, 0x6A, 0x5D, 0x96, 0x73, 0xAC,
+ 0x8D, 0x54, 0xAC, 0x73, 0x54, 0x8D, 0xB4, 0xC3,
+ 0x4C, 0x3D, 0xC3, 0xB4, 0x3D, 0x4C, 0xA4, 0xC3,
+ 0x5C, 0x3D, 0xC3, 0xA4, 0x3D, 0x5C, 0xC4, 0xC4,
+ 0x3C, 0x3C, 0x96, 0xC6, 0x6A, 0x3A, 0xC6, 0x96,
+ 0x3A, 0x6A, 0x7C, 0xBA, 0x84, 0x46, 0xBA, 0x7C,
+ 0x46, 0x84, 0x5B, 0xAB, 0xA5, 0x55, 0xAB, 0x5B,
+ 0x55, 0xA5, 0x63, 0xB4, 0x9D, 0x4C, 0xB4, 0x63,
+ 0x4C, 0x9D, 0x86, 0xCA, 0x7A, 0x36, 0xCA, 0x86,
+ 0x36, 0x7A, 0xB6, 0xD7, 0x4A, 0x29, 0xD7, 0xB6,
+ 0x29, 0x4A, 0xC8, 0xD7, 0x38, 0x29, 0xD7, 0xC8,
+ 0x29, 0x38, 0xA4, 0xD8, 0x5C, 0x28, 0xD8, 0xA4,
+ 0x28, 0x5C, 0x6C, 0xC1, 0x94, 0x3F, 0xC1, 0x6C,
+ 0x3F, 0x94, 0xD9, 0xD9, 0x27, 0x27, 0x80, 0x80, },
+ { 0x80, 0x80, 0x85, 0x85, 0x7B, 0x7B, 0x7E, 0x87,
+ 0x82, 0x79, 0x87, 0x7E, 0x79, 0x82, 0x8F, 0x8F,
+ 0x71, 0x71, 0x84, 0x8F, 0x7C, 0x71, 0x8F, 0x84,
+ 0x71, 0x7C, 0x75, 0x8B, 0x8B, 0x75, 0x8B, 0x75,
+ 0x75, 0x8B, 0x8E, 0x9A, 0x72, 0x66, 0x9A, 0x8E,
+ 0x66, 0x72, 0x7B, 0x93, 0x85, 0x6D, 0x93, 0x7B,
+ 0x6D, 0x85, 0x9B, 0x9B, 0x65, 0x65, 0x82, 0x9D,
+ 0x7E, 0x63, 0x9D, 0x82, 0x63, 0x7E, 0x9B, 0xA8,
+ 0x65, 0x58, 0xA8, 0x9B, 0x58, 0x65, 0xA9, 0xA9,
+ 0x57, 0x57, 0x8D, 0xAA, 0x73, 0x56, 0xAA, 0x8D,
+ 0x56, 0x73, 0x6E, 0x99, 0x92, 0x67, 0x99, 0x6E,
+ 0x67, 0x92, 0x76, 0xA2, 0x8A, 0x5E, 0xA2, 0x76,
+ 0x5E, 0x8A, 0x7F, 0xAF, 0x81, 0x51, 0xAF, 0x7F,
+ 0x51, 0x81, 0xAB, 0xBA, 0x55, 0x46, 0xBA, 0xAB,
+ 0x46, 0x55, 0x9A, 0xBB, 0x66, 0x45, 0xBB, 0x9A,
+ 0x45, 0x66, 0xBB, 0xBB, 0x45, 0x45, 0x60, 0xA0,
+ 0xA0, 0x60, 0xA0, 0x60, 0x60, 0xA0, 0x8B, 0xBE,
+ 0x75, 0x42, 0xBE, 0x8B, 0x42, 0x75, 0x66, 0xAA,
+ 0x9A, 0x56, 0xAA, 0x66, 0x56, 0x9A, 0x70, 0xB5,
+ 0x90, 0x4B, 0xB5, 0x70, 0x4B, 0x90, 0xBE, 0xCF,
+ 0x42, 0x31, 0xCF, 0xBE, 0x31, 0x42, 0xAB, 0xD0,
+ 0x55, 0x30, 0xD0, 0xAB, 0x30, 0x55, 0xD1, 0xD1,
+ 0x2F, 0x2F, 0x9A, 0xD3, 0x66, 0x2D, 0xD3, 0x9A,
+ 0x2D, 0x66, 0x7B, 0xC5, 0x85, 0x3B, 0xC5, 0x7B,
+ 0x3B, 0x85, 0x54, 0xB4, 0xAC, 0x4C, 0xB4, 0x54,
+ 0x4C, 0xAC, 0x5E, 0xBE, 0xA2, 0x42, 0xBE, 0x5E,
+ 0x42, 0xA2, 0x87, 0xD8, 0x79, 0x28, 0xD8, 0x87,
+ 0x28, 0x79, 0xC0, 0xE8, 0x40, 0x18, 0xE8, 0xC0,
+ 0x18, 0x40, 0xD5, 0xE8, 0x2B, 0x18, 0xE8, 0xD5,
+ 0x18, 0x2B, 0xAB, 0xE9, 0x55, 0x17, 0xE9, 0xAB,
+ 0x17, 0x55, 0x68, 0xCD, 0x98, 0x33, 0xCD, 0x68,
+ 0x33, 0x98, 0xEA, 0xEA, 0x16, 0x16, 0x80, 0x80, },
+ { 0x80, 0x80, 0x86, 0x86, 0x7A, 0x7A, 0x7E, 0x88,
+ 0x82, 0x78, 0x88, 0x7E, 0x78, 0x82, 0x92, 0x92,
+ 0x6E, 0x6E, 0x85, 0x92, 0x7B, 0x6E, 0x92, 0x85,
+ 0x6E, 0x7B, 0x73, 0x8D, 0x8D, 0x73, 0x8D, 0x73,
+ 0x73, 0x8D, 0x91, 0x9E, 0x6F, 0x62, 0x9E, 0x91,
+ 0x62, 0x6F, 0x79, 0x97, 0x87, 0x69, 0x97, 0x79,
+ 0x69, 0x87, 0xA0, 0xA0, 0x60, 0x60, 0x83, 0xA2,
+ 0x7D, 0x5E, 0xA2, 0x83, 0x5E, 0x7D, 0xA0, 0xB0,
+ 0x60, 0x50, 0xB0, 0xA0, 0x50, 0x60, 0xB1, 0xB1,
+ 0x4F, 0x4F, 0x8F, 0xB2, 0x71, 0x4E, 0xB2, 0x8F,
+ 0x4E, 0x71, 0x6B, 0x9E, 0x95, 0x62, 0x9E, 0x6B,
+ 0x62, 0x95, 0x74, 0xA9, 0x8C, 0x57, 0xA9, 0x74,
+ 0x57, 0x8C, 0x7F, 0xB8, 0x81, 0x48, 0xB8, 0x7F,
+ 0x48, 0x81, 0xB4, 0xC5, 0x4C, 0x3B, 0xC5, 0xB4,
+ 0x3B, 0x4C, 0x9F, 0xC6, 0x61, 0x3A, 0xC6, 0x9F,
+ 0x3A, 0x61, 0xC6, 0xC6, 0x3A, 0x3A, 0x59, 0xA7,
+ 0xA7, 0x59, 0xA7, 0x59, 0x59, 0xA7, 0x8D, 0xCA,
+ 0x73, 0x36, 0xCA, 0x8D, 0x36, 0x73, 0x61, 0xB2,
+ 0x9F, 0x4E, 0xB2, 0x61, 0x4E, 0x9F, 0x6D, 0xBF,
+ 0x93, 0x41, 0xBF, 0x6D, 0x41, 0x93, 0xCA, 0xDF,
+ 0x36, 0x21, 0xDF, 0xCA, 0x21, 0x36, 0xB3, 0xDF,
+ 0x4D, 0x21, 0xDF, 0xB3, 0x21, 0x4D, 0xE1, 0xE1,
+ 0x1F, 0x1F, 0x9F, 0xE3, 0x61, 0x1D, 0xE3, 0x9F,
+ 0x1D, 0x61, 0x7A, 0xD3, 0x86, 0x2D, 0xD3, 0x7A,
+ 0x2D, 0x86, 0x4C, 0xBE, 0xB4, 0x42, 0xBE, 0x4C,
+ 0x42, 0xB4, 0x57, 0xCA, 0xA9, 0x36, 0xCA, 0x57,
+ 0x36, 0xA9, 0x88, 0xE9, 0x78, 0x17, 0xE9, 0x88,
+ 0x17, 0x78, 0xCC, 0xFB, 0x34, 0x05, 0xFB, 0xCC,
+ 0x05, 0x34, 0xE6, 0xFB, 0x1A, 0x05, 0xFB, 0xE6,
+ 0x05, 0x1A, 0xB4, 0xFD, 0x4C, 0x03, 0xFD, 0xB4,
+ 0x03, 0x4C, 0x63, 0xDC, 0x9D, 0x24, 0xDC, 0x63,
+ 0x24, 0x9D, 0xFE, 0xFE, 0x02, 0x02, 0x80, 0x80, },
+ { 0x80, 0x80, 0x87, 0x87, 0x79, 0x79, 0x7E, 0x89,
+ 0x82, 0x77, 0x89, 0x7E, 0x77, 0x82, 0x95, 0x95,
+ 0x6B, 0x6B, 0x86, 0x96, 0x7A, 0x6A, 0x96, 0x86,
+ 0x6A, 0x7A, 0x70, 0x90, 0x90, 0x70, 0x90, 0x70,
+ 0x70, 0x90, 0x94, 0xA4, 0x6C, 0x5C, 0xA4, 0x94,
+ 0x5C, 0x6C, 0x78, 0x9B, 0x88, 0x65, 0x9B, 0x78,
+ 0x65, 0x88, 0xA6, 0xA6, 0x5A, 0x5A, 0x83, 0xA9,
+ 0x7D, 0x57, 0xA9, 0x83, 0x57, 0x7D, 0xA6, 0xB9,
+ 0x5A, 0x47, 0xB9, 0xA6, 0x47, 0x5A, 0xBA, 0xBA,
+ 0x46, 0x46, 0x92, 0xBC, 0x6E, 0x44, 0xBC, 0x92,
+ 0x44, 0x6E, 0x67, 0xA3, 0x99, 0x5D, 0xA3, 0x67,
+ 0x5D, 0x99, 0x72, 0xB0, 0x8E, 0x50, 0xB0, 0x72,
+ 0x50, 0x8E, 0x7F, 0xC3, 0x81, 0x3D, 0xC3, 0x7F,
+ 0x3D, 0x81, 0xBE, 0xD2, 0x42, 0x2E, 0xD2, 0xBE,
+ 0x2E, 0x42, 0xA5, 0xD4, 0x5B, 0x2C, 0xD4, 0xA5,
+ 0x2C, 0x5B, 0xD4, 0xD4, 0x2C, 0x2C, 0x52, 0xAE,
+ 0xAE, 0x52, 0xAE, 0x52, 0x52, 0xAE, 0x8F, 0xD8,
+ 0x71, 0x28, 0xD8, 0x8F, 0x28, 0x71, 0x5B, 0xBB,
+ 0xA5, 0x45, 0xBB, 0x5B, 0x45, 0xA5, 0x69, 0xCB,
+ 0x97, 0x35, 0xCB, 0x69, 0x35, 0x97, 0xD8, 0xF0,
+ 0x28, 0x10, 0xF0, 0xD8, 0x10, 0x28, 0xBD, 0xF1,
+ 0x43, 0x0F, 0xF1, 0xBD, 0x0F, 0x43, 0xF3, 0xF3,
+ 0x0D, 0x0D, 0xA5, 0xF6, 0x5B, 0x0A, 0xF6, 0xA5,
+ 0x0A, 0x5B, 0x78, 0xE2, 0x88, 0x1E, 0xE2, 0x78,
+ 0x1E, 0x88, 0x42, 0xC9, 0xBE, 0x37, 0xC9, 0x42,
+ 0x37, 0xBE, 0x4F, 0xD8, 0xB1, 0x28, 0xD8, 0x4F,
+ 0x28, 0xB1, 0x8A, 0xFD, 0x76, 0x03, 0xFD, 0x8A,
+ 0x03, 0x76, 0xDB, 0xFF, 0x25, 0x01, 0xFF, 0xDB,
+ 0x01, 0x25, 0xF9, 0xFF, 0x07, 0x01, 0xFF, 0xF9,
+ 0x01, 0x07, 0xBE, 0xFF, 0x42, 0x01, 0xFF, 0xBE,
+ 0x01, 0x42, 0x5E, 0xED, 0xA2, 0x13, 0xED, 0x5E,
+ 0x13, 0xA2, 0xFF, 0xFF, 0x01, 0x01, 0x80, 0x80, },
};
#endif /* AVCODEC_INDEO2DATA_H */
diff --git a/libavcodec/internal.h b/libavcodec/internal.h
index 24d320c186..6c0efec8b1 100644
--- a/libavcodec/internal.h
+++ b/libavcodec/internal.h
@@ -293,6 +293,8 @@ const uint8_t *avpriv_find_start_code(const uint8_t *p,
const uint8_t *end,
uint32_t *state);
+int avpriv_codec_get_cap_skip_frame_fill_param(const AVCodec *codec);
+
/**
* Check that the provided frame dimensions are valid and set them on the codec
* context.
diff --git a/libavcodec/j2kenc.c b/libavcodec/j2kenc.c
index 2cd837d8be..c8d3861732 100644
--- a/libavcodec/j2kenc.c
+++ b/libavcodec/j2kenc.c
@@ -17,8 +17,46 @@
* 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
+ *
+ * **********************************************************************************************************************
+ *
+ *
+ *
+ * This source code incorporates work covered by the following copyright and
+ * permission notice:
+ *
+ * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2007, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 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 COPYRIGHT OWNER 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.
*/
+
/**
* JPEG2000 image encoder
* @file
diff --git a/libavcodec/libopenjpegenc.c b/libavcodec/libopenjpegenc.c
index b67c320b2f..058ca363c8 100644
--- a/libavcodec/libopenjpegenc.c
+++ b/libavcodec/libopenjpegenc.c
@@ -352,6 +352,12 @@ static av_cold int libopenjpeg_encode_init(AVCodecContext *avctx)
ctx->enc_params.cp_cinema = ctx->cinema_mode;
#endif
+ if (!ctx->numresolution) {
+ ctx->numresolution = 6;
+ while (FFMIN(avctx->width, avctx->height) >> ctx->numresolution < 1)
+ ctx->numresolution --;
+ }
+
ctx->enc_params.mode = !!avctx->global_quality;
ctx->enc_params.prog_order = ctx->prog_order;
ctx->enc_params.numresolution = ctx->numresolution;
@@ -814,7 +820,7 @@ static const AVOption options[] = {
{ "rpcl", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OPJ(RPCL) }, 0, 0, VE, "prog_order" },
{ "pcrl", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OPJ(PCRL) }, 0, 0, VE, "prog_order" },
{ "cprl", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OPJ(CPRL) }, 0, 0, VE, "prog_order" },
- { "numresolution", NULL, OFFSET(numresolution), AV_OPT_TYPE_INT, { .i64 = 6 }, 1, INT_MAX, VE },
+ { "numresolution", NULL, OFFSET(numresolution), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
{ "numlayers", NULL, OFFSET(numlayers), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, 10, VE },
{ "disto_alloc", NULL, OFFSET(disto_alloc), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, VE },
{ "fixed_alloc", NULL, OFFSET(fixed_alloc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
diff --git a/libavcodec/libutvideodec.cpp b/libavcodec/libutvideodec.cpp
index 7c60f4fb83..a456735d3c 100644
--- a/libavcodec/libutvideodec.cpp
+++ b/libavcodec/libutvideodec.cpp
@@ -222,9 +222,19 @@ static int utvideo_decode_frame(AVCodecContext *avctx, void *data,
pic->data[0] = utv->buffer + utv->buf_size + pic->linesize[0];
break;
}
+ pic->width = w;
+ pic->height = h;
+ pic->format = avctx->pix_fmt;
+
+ if (avctx->refcounted_frames) {
+ int ret = av_frame_ref((AVFrame*)data, pic);
+ if (ret < 0)
+ return ret;
+ } else {
+ av_frame_move_ref((AVFrame*)data, pic);
+ }
*got_frame = 1;
- av_frame_move_ref((AVFrame*)data, pic);
return avpkt->size;
}
diff --git a/libavcodec/libwebpenc_animencoder.c b/libavcodec/libwebpenc_animencoder.c
index d7437a9a57..61ecae8a8a 100644
--- a/libavcodec/libwebpenc_animencoder.c
+++ b/libavcodec/libwebpenc_animencoder.c
@@ -41,8 +41,9 @@ static av_cold int libwebp_anim_encode_init(AVCodecContext *avctx)
int ret = ff_libwebp_encode_init_common(avctx);
if (!ret) {
LibWebPAnimContext *s = avctx->priv_data;
- WebPAnimEncoderOptions enc_options;
+ WebPAnimEncoderOptions enc_options = { 0 };
WebPAnimEncoderOptionsInit(&enc_options);
+ enc_options.verbose = av_log_get_level() >= AV_LOG_VERBOSE;
// TODO(urvang): Expose some options on command-line perhaps.
s->enc = WebPAnimEncoderNew(avctx->width, avctx->height, &enc_options);
if (!s->enc)
diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
index 5030d65f79..35339bc150 100644
--- a/libavcodec/libx264.c
+++ b/libavcodec/libx264.c
@@ -783,8 +783,8 @@ FF_ENABLE_DEPRECATION_WARNINGS
if(x4->x264opts){
const char *p= x4->x264opts;
while(p){
- char param[256]={0}, val[256]={0};
- if(sscanf(p, "%255[^:=]=%255[^:]", param, val) == 1){
+ char param[4096]={0}, val[4096]={0};
+ if(sscanf(p, "%4095[^:=]=%4095[^:]", param, val) == 1){
OPT_STR(param, "1");
}else
OPT_STR(param, val);
diff --git a/libavcodec/mips/aaccoder_mips.c b/libavcodec/mips/aaccoder_mips.c
index 8fbdfd230a..d690c8c24a 100644
--- a/libavcodec/mips/aaccoder_mips.c
+++ b/libavcodec/mips/aaccoder_mips.c
@@ -66,6 +66,7 @@
#include "libavcodec/aacenc_utils.h"
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
typedef struct BandCodingPath {
int prev_idx;
float cost;
@@ -2477,10 +2478,12 @@ static void search_for_ms_mips(AACEncContext *s, ChannelElement *cpe)
#include "libavcodec/aaccoder_trellis.h"
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_INLINE_ASM */
void ff_aac_coder_init_mips(AACEncContext *c) {
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
AACCoefficientsEncoder *e = c->coder;
int option = c->options.coder;
@@ -2494,5 +2497,6 @@ void ff_aac_coder_init_mips(AACEncContext *c) {
#if HAVE_MIPSFPU
e->search_for_ms = search_for_ms_mips;
#endif /* HAVE_MIPSFPU */
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_INLINE_ASM */
}
diff --git a/libavcodec/mips/aacdec_mips.h b/libavcodec/mips/aacdec_mips.h
index c4f6438570..758266fc16 100644
--- a/libavcodec/mips/aacdec_mips.h
+++ b/libavcodec/mips/aacdec_mips.h
@@ -61,6 +61,7 @@
#include "libavutil/mips/asmdefs.h"
#if HAVE_INLINE_ASM && HAVE_MIPSFPU
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
static inline float *VMUL2_mips(float *dst, const float *v, unsigned idx,
const float *scale)
{
@@ -246,6 +247,7 @@ static inline float *VMUL4S_mips(float *dst, const float *v, unsigned idx,
#define VMUL4 VMUL4_mips
#define VMUL2S VMUL2S_mips
#define VMUL4S VMUL4S_mips
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_INLINE_ASM && HAVE_MIPSFPU */
#endif /* AVCODEC_MIPS_AACDEC_MIPS_H */
diff --git a/libavcodec/mips/aacpsdsp_mips.c b/libavcodec/mips/aacpsdsp_mips.c
index 695f9ef3c6..83fdc2f9db 100644
--- a/libavcodec/mips/aacpsdsp_mips.c
+++ b/libavcodec/mips/aacpsdsp_mips.c
@@ -188,6 +188,7 @@ static void ps_hybrid_synthesis_deint_mips(float out[2][38][64],
}
#if HAVE_MIPSFPU
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
static void ps_add_squares_mips(float *dst, const float (*src)[2], int n)
{
int i;
@@ -442,6 +443,7 @@ static void ps_stereo_interpolate_mips(float (*l)[2], float (*r)[2],
: "memory"
);
}
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_MIPSFPU */
#endif /* HAVE_INLINE_ASM */
@@ -451,10 +453,12 @@ void ff_psdsp_init_mips(PSDSPContext *s)
s->hybrid_analysis_ileave = ps_hybrid_analysis_ileave_mips;
s->hybrid_synthesis_deint = ps_hybrid_synthesis_deint_mips;
#if HAVE_MIPSFPU
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
s->add_squares = ps_add_squares_mips;
s->mul_pair_single = ps_mul_pair_single_mips;
s->decorrelate = ps_decorrelate_mips;
s->stereo_interpolate[0] = ps_stereo_interpolate_mips;
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_MIPSFPU */
#endif /* HAVE_INLINE_ASM */
}
diff --git a/libavcodec/mips/aacpsy_mips.h b/libavcodec/mips/aacpsy_mips.h
index 42ff442a59..a1fe5ccea9 100644
--- a/libavcodec/mips/aacpsy_mips.h
+++ b/libavcodec/mips/aacpsy_mips.h
@@ -59,6 +59,7 @@
#include "libavutil/mips/asmdefs.h"
#if HAVE_INLINE_ASM && HAVE_MIPSFPU && ( PSY_LAME_FIR_LEN == 21 )
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
static void calc_thr_3gpp_mips(const FFPsyWindowInfo *wi, const int num_bands,
AacPsyChannel *pch, const uint8_t *band_sizes,
const float *coefs, const int cutoff)
@@ -232,5 +233,6 @@ static void psy_hp_filter_mips(const float *firbuf, float *hpfsmpl, const float
#define calc_thr_3gpp calc_thr_3gpp_mips
#define psy_hp_filter psy_hp_filter_mips
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_INLINE_ASM && HAVE_MIPSFPU */
#endif /* AVCODEC_MIPS_AACPSY_MIPS_H */
diff --git a/libavcodec/mips/aacsbr_mips.c b/libavcodec/mips/aacsbr_mips.c
index e478290e47..56aa4e8682 100644
--- a/libavcodec/mips/aacsbr_mips.c
+++ b/libavcodec/mips/aacsbr_mips.c
@@ -311,6 +311,7 @@ static int sbr_x_gen_mips(SpectralBandReplication *sbr, float X[2][38][64],
}
#if HAVE_MIPSFPU
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
static void sbr_hf_assemble_mips(float Y1[38][64][2],
const float X_high[64][40][2],
SpectralBandReplication *sbr, SBRData *ch_data,
@@ -603,6 +604,7 @@ static void sbr_hf_inverse_filter_mips(SBRDSPContext *dsp,
}
}
}
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_MIPSFPU */
#endif /* HAVE_INLINE_ASM */
@@ -612,8 +614,10 @@ void ff_aacsbr_func_ptr_init_mips(AACSBRContext *c)
c->sbr_lf_gen = sbr_lf_gen_mips;
c->sbr_x_gen = sbr_x_gen_mips;
#if HAVE_MIPSFPU
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
c->sbr_hf_inverse_filter = sbr_hf_inverse_filter_mips;
c->sbr_hf_assemble = sbr_hf_assemble_mips;
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_MIPSFPU */
#endif /* HAVE_INLINE_ASM */
}
diff --git a/libavcodec/mips/aacsbr_mips.h b/libavcodec/mips/aacsbr_mips.h
index 13e55d26ea..4461e763ed 100644
--- a/libavcodec/mips/aacsbr_mips.h
+++ b/libavcodec/mips/aacsbr_mips.h
@@ -150,6 +150,7 @@ static void sbr_qmf_analysis_mips(AVFloatDSPContext *fdsp, FFTContext *mdct,
}
#if HAVE_MIPSFPU
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
static void sbr_qmf_synthesis_mips(FFTContext *mdct,
SBRDSPContext *sbrdsp, AVFloatDSPContext *fdsp,
float *out, float X[2][38][64],
@@ -488,6 +489,7 @@ static void sbr_qmf_synthesis_mips(FFTContext *mdct,
#define sbr_qmf_analysis sbr_qmf_analysis_mips
#define sbr_qmf_synthesis sbr_qmf_synthesis_mips
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_MIPSFPU */
#endif /* HAVE_INLINE_ASM */
diff --git a/libavcodec/mips/ac3dsp_mips.c b/libavcodec/mips/ac3dsp_mips.c
index da4919f6eb..f9aaf15639 100644
--- a/libavcodec/mips/ac3dsp_mips.c
+++ b/libavcodec/mips/ac3dsp_mips.c
@@ -201,6 +201,7 @@ static void ac3_update_bap_counts_mips(uint16_t mant_cnt[16], uint8_t *bap,
#endif
#if HAVE_MIPSFPU
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
static void float_to_fixed24_mips(int32_t *dst, const float *src, unsigned int len)
{
const float scale = 1 << 24;
@@ -395,7 +396,8 @@ static void ac3_downmix_mips(float **samples, float (*matrix)[2],
:"memory"
);
}
-#endif
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
+#endif /* HAVE_MIPSFPU */
#endif /* HAVE_INLINE_ASM */
void ff_ac3dsp_init_mips(AC3DSPContext *c, int bit_exact) {
@@ -405,9 +407,11 @@ void ff_ac3dsp_init_mips(AC3DSPContext *c, int bit_exact) {
c->update_bap_counts = ac3_update_bap_counts_mips;
#endif
#if HAVE_MIPSFPU
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
c->float_to_fixed24 = float_to_fixed24_mips;
c->downmix = ac3_downmix_mips;
#endif
#endif
+#endif
}
diff --git a/libavcodec/mips/acelp_filters_mips.c b/libavcodec/mips/acelp_filters_mips.c
index ba789abe3f..478db855b2 100644
--- a/libavcodec/mips/acelp_filters_mips.c
+++ b/libavcodec/mips/acelp_filters_mips.c
@@ -57,6 +57,7 @@
#include "libavutil/mips/asmdefs.h"
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
static void ff_acelp_interpolatef_mips(float *out, const float *in,
const float *filter_coeffs, int precision,
int frac_pos, int filter_length, int length)
@@ -206,12 +207,15 @@ static void ff_acelp_apply_order_2_transfer_function_mips(float *out, const floa
"$f12", "$f13", "$f14", "$f15", "$f16", "memory"
);
}
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_INLINE_ASM */
void ff_acelp_filter_init_mips(ACELPFContext *c)
{
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
c->acelp_interpolatef = ff_acelp_interpolatef_mips;
c->acelp_apply_order_2_transfer_function = ff_acelp_apply_order_2_transfer_function_mips;
#endif
+#endif
}
diff --git a/libavcodec/mips/acelp_vectors_mips.c b/libavcodec/mips/acelp_vectors_mips.c
index ad9434866e..0ab2b6a87b 100644
--- a/libavcodec/mips/acelp_vectors_mips.c
+++ b/libavcodec/mips/acelp_vectors_mips.c
@@ -57,6 +57,7 @@
#include "libavutil/mips/asmdefs.h"
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
static void ff_weighted_vector_sumf_mips(
float *out, const float *in_a, const float *in_b,
float weight_coeff_a, float weight_coeff_b, int length)
@@ -92,11 +93,14 @@ static void ff_weighted_vector_sumf_mips(
: "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "memory"
);
}
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_INLINE_ASM */
void ff_acelp_vectors_init_mips(ACELPVContext *c)
{
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
c->weighted_vector_sumf = ff_weighted_vector_sumf_mips;
#endif
+#endif
}
diff --git a/libavcodec/mips/amrwbdec_mips.c b/libavcodec/mips/amrwbdec_mips.c
index e933b8a6c5..5dc054361b 100644
--- a/libavcodec/mips/amrwbdec_mips.c
+++ b/libavcodec/mips/amrwbdec_mips.c
@@ -54,6 +54,7 @@
#include "amrwbdec_mips.h"
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
void ff_hb_fir_filter_mips(float *out, const float fir_coef[HB_FIR_SIZE + 1],
float mem[HB_FIR_SIZE], const float *in)
{
@@ -184,4 +185,5 @@ void ff_hb_fir_filter_mips(float *out, const float fir_coef[HB_FIR_SIZE + 1],
}
memcpy(mem, data + AMRWB_SFR_SIZE_16k, HB_FIR_SIZE * sizeof(float));
}
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_INLINE_ASM */
diff --git a/libavcodec/mips/amrwbdec_mips.h b/libavcodec/mips/amrwbdec_mips.h
index ec46f95224..a9f66fef94 100644
--- a/libavcodec/mips/amrwbdec_mips.h
+++ b/libavcodec/mips/amrwbdec_mips.h
@@ -54,9 +54,11 @@
#include "config.h"
#if HAVE_MIPSFPU && HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
void ff_hb_fir_filter_mips(float *out, const float fir_coef[],
float mem[], const float *in);
#define hb_fir_filter ff_hb_fir_filter_mips
#endif
+#endif
#endif /* AVCODEC_MIPS_AMRWBDEC_MIPS_H */
diff --git a/libavcodec/mips/celp_filters_mips.c b/libavcodec/mips/celp_filters_mips.c
index 88ac45841d..926f1cb334 100644
--- a/libavcodec/mips/celp_filters_mips.c
+++ b/libavcodec/mips/celp_filters_mips.c
@@ -58,6 +58,7 @@
#include "libavutil/mips/asmdefs.h"
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
static void ff_celp_lp_synthesis_filterf_mips(float *out,
const float *filter_coeffs,
const float* in, int buffer_length,
@@ -278,12 +279,15 @@ static void ff_celp_lp_zero_synthesis_filterf_mips(float *out,
out[n] = sum_out1;
}
}
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_INLINE_ASM */
void ff_celp_filter_init_mips(CELPFContext *c)
{
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
c->celp_lp_synthesis_filterf = ff_celp_lp_synthesis_filterf_mips;
c->celp_lp_zero_synthesis_filterf = ff_celp_lp_zero_synthesis_filterf_mips;
#endif
+#endif
}
diff --git a/libavcodec/mips/celp_math_mips.c b/libavcodec/mips/celp_math_mips.c
index 008dd80308..ce711bd63c 100644
--- a/libavcodec/mips/celp_math_mips.c
+++ b/libavcodec/mips/celp_math_mips.c
@@ -56,6 +56,7 @@
#include "libavutil/mips/asmdefs.h"
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
static float ff_dot_productf_mips(const float* a, const float* b,
int length)
{
@@ -80,11 +81,14 @@ static float ff_dot_productf_mips(const float* a, const float* b,
);
return sum;
}
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_INLINE_ASM */
void ff_celp_math_init_mips(CELPMContext *c)
{
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
c->dot_productf = ff_dot_productf_mips;
#endif
+#endif
}
diff --git a/libavcodec/mips/compute_antialias_float.h b/libavcodec/mips/compute_antialias_float.h
index f6cf46508b..e2b4f29f4a 100644
--- a/libavcodec/mips/compute_antialias_float.h
+++ b/libavcodec/mips/compute_antialias_float.h
@@ -58,6 +58,7 @@
#include "libavutil/mips/asmdefs.h"
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
static void compute_antialias_mips_float(MPADecodeContext *s,
GranuleDef *g)
{
@@ -179,6 +180,7 @@ static void compute_antialias_mips_float(MPADecodeContext *s,
);
}
#define compute_antialias compute_antialias_mips_float
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_INLINE_ASM */
#endif /* AVCODEC_MIPS_COMPUTE_ANTIALIAS_FLOAT_H */
diff --git a/libavcodec/mips/fft_mips.c b/libavcodec/mips/fft_mips.c
index cf008c6561..3cb1a4c162 100644
--- a/libavcodec/mips/fft_mips.c
+++ b/libavcodec/mips/fft_mips.c
@@ -57,6 +57,7 @@
*/
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
static void ff_fft_calc_mips(FFTContext *s, FFTComplex *z)
{
int nbits, i, n, num_transforms, offset, step;
@@ -494,6 +495,7 @@ static void ff_imdct_calc_mips(FFTContext *s, FFTSample *output, const FFTSample
output[n-k-4] = output[n2+k+3];
}
}
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_INLINE_ASM */
av_cold void ff_fft_init_mips(FFTContext *s)
@@ -504,10 +506,12 @@ av_cold void ff_fft_init_mips(FFTContext *s)
ff_init_ff_cos_tabs(16);
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
s->fft_calc = ff_fft_calc_mips;
#if CONFIG_MDCT
s->imdct_calc = ff_imdct_calc_mips;
s->imdct_half = ff_imdct_half_mips;
#endif
#endif
+#endif
}
diff --git a/libavcodec/mips/iirfilter_mips.c b/libavcodec/mips/iirfilter_mips.c
index a5646cde8b..87db9ffe55 100644
--- a/libavcodec/mips/iirfilter_mips.c
+++ b/libavcodec/mips/iirfilter_mips.c
@@ -55,6 +55,7 @@
#include "libavcodec/iirfilter.h"
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
typedef struct FFIIRFilterCoeffs {
int order;
float gain;
@@ -195,10 +196,13 @@ static void ff_iir_filter_flt_mips(const struct FFIIRFilterCoeffs *c,
}
}
}
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_INLINE_ASM */
void ff_iir_filter_init_mips(FFIIRFilterContext *f) {
#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
f->filter_flt = ff_iir_filter_flt_mips;
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_INLINE_ASM */
}
diff --git a/libavcodec/mips/lsp_mips.h b/libavcodec/mips/lsp_mips.h
index 1e899bcd7c..6219c5aa40 100644
--- a/libavcodec/mips/lsp_mips.h
+++ b/libavcodec/mips/lsp_mips.h
@@ -55,6 +55,7 @@
#define AVCODEC_MIPS_LSP_MIPS_H
#if HAVE_MIPSFPU && HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
#include "libavutil/mips/asmdefs.h"
static av_always_inline void ff_lsp2polyf_mips(const double *lsp, double *f, int lp_half_order)
@@ -107,5 +108,6 @@ static av_always_inline void ff_lsp2polyf_mips(const double *lsp, double *f, int
}
}
#define ff_lsp2polyf ff_lsp2polyf_mips
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_MIPSFPU && HAVE_INLINE_ASM */
#endif /* AVCODEC_MIPS_LSP_MIPS_H */
diff --git a/libavcodec/mips/mpegaudiodsp_mips_fixed.c b/libavcodec/mips/mpegaudiodsp_mips_fixed.c
index 92d260b85f..ed8c89089e 100644
--- a/libavcodec/mips/mpegaudiodsp_mips_fixed.c
+++ b/libavcodec/mips/mpegaudiodsp_mips_fixed.c
@@ -57,6 +57,9 @@
#include "libavutil/mips/asmdefs.h"
#include "libavcodec/mpegaudiodsp.h"
+#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
+
static void ff_mpadsp_apply_window_mips_fixed(int32_t *synth_buf, int32_t *window,
int *dither_state, int16_t *samples, int incr)
{
@@ -901,8 +904,15 @@ static void ff_imdct36_blocks_mips_fixed(int *out, int *buf, int *in,
}
}
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
+#endif /* HAVE_INLINE_ASM */
+
void ff_mpadsp_init_mipsdsp(MPADSPContext *s)
{
+#if HAVE_INLINE_ASM
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
s->apply_window_fixed = ff_mpadsp_apply_window_mips_fixed;
s->imdct36_blocks_fixed = ff_imdct36_blocks_mips_fixed;
+#endif
+#endif
}
diff --git a/libavcodec/mips/mpegaudiodsp_mips_float.c b/libavcodec/mips/mpegaudiodsp_mips_float.c
index bd36894d31..270838ebf1 100644
--- a/libavcodec/mips/mpegaudiodsp_mips_float.c
+++ b/libavcodec/mips/mpegaudiodsp_mips_float.c
@@ -58,6 +58,9 @@
#include "libavutil/mips/asmdefs.h"
#include "libavcodec/mpegaudiodsp.h"
+#if HAVE_INLINE_ASM && HAVE_MIPSFPU
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
+
static void ff_mpadsp_apply_window_mips_float(float *synth_buf, float *window,
int *dither_state, float *samples, int incr)
{
@@ -1243,9 +1246,16 @@ static void ff_imdct36_blocks_mips_float(float *out, float *buf, float *in,
}
}
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
+#endif /* HAVE_INLINE_ASM && HAVE_MIPSFPU */
+
void ff_mpadsp_init_mipsfpu(MPADSPContext *s)
{
+#if HAVE_INLINE_ASM && HAVE_MIPSFPU
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
s->apply_window_float = ff_mpadsp_apply_window_mips_float;
s->imdct36_blocks_float = ff_imdct36_blocks_mips_float;
s->dct32_float = ff_dct32_mips_float;
+#endif
+#endif
}
diff --git a/libavcodec/mips/sbrdsp_mips.c b/libavcodec/mips/sbrdsp_mips.c
index c203095548..1b0a10608d 100644
--- a/libavcodec/mips/sbrdsp_mips.c
+++ b/libavcodec/mips/sbrdsp_mips.c
@@ -166,6 +166,7 @@ static void sbr_qmf_post_shuffle_mips(float W[32][2], const float *z)
}
#if HAVE_MIPSFPU
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
static void sbr_sum64x5_mips(float *z)
{
int k;
@@ -882,6 +883,7 @@ static void sbr_hf_apply_noise_3_mips(float (*Y)[2], const float *s_m,
phi_sign = -phi_sign;
}
}
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_MIPSFPU */
#endif /* HAVE_INLINE_ASM */
@@ -891,6 +893,7 @@ void ff_sbrdsp_init_mips(SBRDSPContext *s)
s->qmf_pre_shuffle = sbr_qmf_pre_shuffle_mips;
s->qmf_post_shuffle = sbr_qmf_post_shuffle_mips;
#if HAVE_MIPSFPU
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
s->sum64x5 = sbr_sum64x5_mips;
s->sum_square = sbr_sum_square_mips;
s->qmf_deint_bfly = sbr_qmf_deint_bfly_mips;
@@ -902,6 +905,7 @@ void ff_sbrdsp_init_mips(SBRDSPContext *s)
s->hf_apply_noise[1] = sbr_hf_apply_noise_1_mips;
s->hf_apply_noise[2] = sbr_hf_apply_noise_2_mips;
s->hf_apply_noise[3] = sbr_hf_apply_noise_3_mips;
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_MIPSFPU */
#endif /* HAVE_INLINE_ASM */
}
diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
index 69c9cf3626..4bde42f784 100644
--- a/libavcodec/mjpegdec.c
+++ b/libavcodec/mjpegdec.c
@@ -1369,11 +1369,7 @@ static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss,
int mb_x, mb_y;
int EOBRUN = 0;
int c = s->comp_index[0];
- uint8_t *data = s->picture_ptr->data[c];
- int linesize = s->linesize[c];
- int last_scan = 0;
int16_t *quant_matrix = s->quant_matrixes[s->quant_sindex[0]];
- int bytes_per_pixel = 1 + (s->bits > 8);
av_assert0(ss>=0 && Ah>=0 && Al>=0);
if (se < ss || se > 63) {
@@ -1381,20 +1377,13 @@ static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss,
return AVERROR_INVALIDDATA;
}
- if (!Al) {
- // s->coefs_finished is a bitmask for coefficients coded
- // ss and se are parameters telling start and end coefficients
- s->coefs_finished[c] |= (2ULL << se) - (1ULL << ss);
- last_scan = !~s->coefs_finished[c];
- }
-
- if (s->interlaced && s->bottom_field)
- data += linesize >> 1;
+ // s->coefs_finished is a bitmask for coefficients coded
+ // ss and se are parameters telling start and end coefficients
+ s->coefs_finished[c] |= (2ULL << se) - (1ULL << ss);
s->restart_count = 0;
for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
- uint8_t *ptr = data + (mb_y * linesize * 8 >> s->avctx->lowres);
int block_idx = mb_y * s->block_stride[c];
int16_t (*block)[64] = &s->blocks[c][block_idx];
uint8_t *last_nnz = &s->last_nnz[c][block_idx];
@@ -1415,12 +1404,6 @@ static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss,
return AVERROR_INVALIDDATA;
}
- if (last_scan) {
- s->idsp.idct_put(ptr, linesize, *block);
- if (s->bits & 7)
- shift_output(s, ptr, linesize);
- ptr += bytes_per_pixel*8 >> s->avctx->lowres;
- }
if (handle_rstn(s, 0))
EOBRUN = 0;
}
@@ -1428,6 +1411,41 @@ static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss,
return 0;
}
+static void mjpeg_idct_scan_progressive_ac(MJpegDecodeContext *s)
+{
+ int mb_x, mb_y;
+ int c;
+ const int bytes_per_pixel = 1 + (s->bits > 8);
+ const int block_size = s->lossless ? 1 : 8;
+
+ for (c = 0; c < s->nb_components; c++) {
+ uint8_t *data = s->picture_ptr->data[c];
+ int linesize = s->linesize[c];
+ int h = s->h_max / s->h_count[c];
+ int v = s->v_max / s->v_count[c];
+ int mb_width = (s->width + h * block_size - 1) / (h * block_size);
+ int mb_height = (s->height + v * block_size - 1) / (v * block_size);
+
+ if (~s->coefs_finished[c])
+ av_log(s->avctx, AV_LOG_WARNING, "component %d is incomplete\n", c);
+
+ if (s->interlaced && s->bottom_field)
+ data += linesize >> 1;
+
+ for (mb_y = 0; mb_y < mb_height; mb_y++) {
+ uint8_t *ptr = data + (mb_y * linesize * 8 >> s->avctx->lowres);
+ int block_idx = mb_y * s->block_stride[c];
+ int16_t (*block)[64] = &s->blocks[c][block_idx];
+ for (mb_x = 0; mb_x < mb_width; mb_x++, block++) {
+ s->idsp.idct_put(ptr, linesize, *block);
+ if (s->bits & 7)
+ shift_output(s, ptr, linesize);
+ ptr += bytes_per_pixel*8 >> s->avctx->lowres;
+ }
+ }
+ }
+}
+
int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
int mb_bitmask_size, const AVFrame *reference)
{
@@ -2164,6 +2182,8 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
break;
case EOI:
eoi_parser:
+ if (avctx->skip_frame != AVDISCARD_ALL && s->progressive && s->cur_scan && s->got_picture)
+ mjpeg_idct_scan_progressive_ac(s);
s->cur_scan = 0;
if (!s->got_picture) {
av_log(avctx, AV_LOG_WARNING,
diff --git a/libavcodec/mjpegenc_common.c b/libavcodec/mjpegenc_common.c
index 099d817d5f..7a6fe7468f 100644
--- a/libavcodec/mjpegenc_common.c
+++ b/libavcodec/mjpegenc_common.c
@@ -122,6 +122,16 @@ static void jpeg_put_comments(AVCodecContext *avctx, PutBitContext *p)
uint8_t *ptr;
if (avctx->sample_aspect_ratio.num > 0 && avctx->sample_aspect_ratio.den > 0) {
+ AVRational sar = avctx->sample_aspect_ratio;
+
+ if (sar.num > 65535 || sar.den > 65535) {
+ if (!av_reduce(&sar.num, &sar.den, avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den, 65535))
+ av_log(avctx, AV_LOG_WARNING,
+ "Cannot store exact aspect ratio %d:%d\n",
+ avctx->sample_aspect_ratio.num,
+ avctx->sample_aspect_ratio.den);
+ }
+
/* JFIF header */
put_marker(p, APP0);
put_bits(p, 16, 16);
@@ -131,8 +141,8 @@ static void jpeg_put_comments(AVCodecContext *avctx, PutBitContext *p)
* released revision. */
put_bits(p, 16, 0x0102);
put_bits(p, 8, 0); /* units type: 0 - aspect ratio */
- put_bits(p, 16, avctx->sample_aspect_ratio.num);
- put_bits(p, 16, avctx->sample_aspect_ratio.den);
+ put_bits(p, 16, sar.num);
+ put_bits(p, 16, sar.den);
put_bits(p, 8, 0); /* thumbnail width */
put_bits(p, 8, 0); /* thumbnail height */
}
diff --git a/libavcodec/mpc8.c b/libavcodec/mpc8.c
index a8feb6c4ce..8894457c7e 100644
--- a/libavcodec/mpc8.c
+++ b/libavcodec/mpc8.c
@@ -415,10 +415,14 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
c->cur_frame++;
c->last_bits_used = get_bits_count(gb);
- if(get_bits_left(gb) < 8) // we have only padding left
- c->last_bits_used = buf_size << 3;
if(c->cur_frame >= c->frames)
c->cur_frame = 0;
+ if(c->cur_frame == 0 && get_bits_left(gb) < 8) {// we have only padding left
+ c->last_bits_used = buf_size << 3;
+ } else if (get_bits_left(gb) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Overread %d\n", -get_bits_left(gb));
+ c->last_bits_used = buf_size << 3;
+ }
*got_frame_ptr = 1;
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index 236987b3d4..f660a1cbec 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -822,9 +822,7 @@ static void clear_context(MpegEncContext *s)
s->sc.b_scratchpad =
s->sc.obmc_scratchpad = NULL;
- s->parse_context.buffer = NULL;
- s->parse_context.buffer_size = 0;
- s->parse_context.overread = 0;
+
s->bitstream_buffer = NULL;
s->allocated_bitstream_buffer_size = 0;
s->picture = NULL;
@@ -1216,6 +1214,8 @@ int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx)
}
ff_mpeg_unref_picture(s->avctx, &s->current_picture);
+ ff_mpeg_unref_picture(s->avctx, &s->last_picture);
+ ff_mpeg_unref_picture(s->avctx, &s->next_picture);
/* release non reference frames */
for (i = 0; i < MAX_PICTURE_COUNT; i++) {
@@ -1367,14 +1367,12 @@ int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx)
memset(s->next_picture.f->data, 0, sizeof(s->next_picture.f->data));
#endif
if (s->last_picture_ptr) {
- ff_mpeg_unref_picture(s->avctx, &s->last_picture);
if (s->last_picture_ptr->f->buf[0] &&
(ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture,
s->last_picture_ptr)) < 0)
return ret;
}
if (s->next_picture_ptr) {
- ff_mpeg_unref_picture(s->avctx, &s->next_picture);
if (s->next_picture_ptr->f->buf[0] &&
(ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture,
s->next_picture_ptr)) < 0)
diff --git a/libavcodec/pgssubdec.c b/libavcodec/pgssubdec.c
index 07a2a78629..133d08bfa7 100644
--- a/libavcodec/pgssubdec.c
+++ b/libavcodec/pgssubdec.c
@@ -354,8 +354,14 @@ static int parse_palette_segment(AVCodecContext *avctx,
cb = bytestream_get_byte(&buf);
alpha = bytestream_get_byte(&buf);
- YUV_TO_RGB1(cb, cr);
- YUV_TO_RGB2(r, g, b, y);
+ /* Default to BT.709 colorimetry. In case of <= 576 height use BT.601 */
+ if (avctx->height <= 0 || avctx->height > 576) {
+ YUV_TO_RGB1_CCIR_BT709(cb, cr);
+ } else {
+ YUV_TO_RGB1_CCIR(cb, cr);
+ }
+
+ YUV_TO_RGB2_CCIR(r, g, b, y);
ff_dlog(avctx, "Color %d := (%d,%d,%d,%d)\n", color_id, r, g, b, alpha);
diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index 61857d0e5c..24318fbeaf 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -1136,6 +1136,7 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s,
case MKTAG('p', 'H', 'Y', 's'):
case MKTAG('t', 'E', 'X', 't'):
case MKTAG('I', 'D', 'A', 'T'):
+ case MKTAG('t', 'R', 'N', 'S'):
break;
default:
goto skip_tag;
diff --git a/libavcodec/raw.c b/libavcodec/raw.c
index bfa2537b5a..d36b68bfae 100644
--- a/libavcodec/raw.c
+++ b/libavcodec/raw.c
@@ -31,6 +31,7 @@
const PixelFormatTag ff_raw_pix_fmt_tags[] = {
{ AV_PIX_FMT_YUV420P, MKTAG('I', '4', '2', '0') }, /* Planar formats */
{ AV_PIX_FMT_YUV420P, MKTAG('I', 'Y', 'U', 'V') },
+ { AV_PIX_FMT_YUV420P, MKTAG('y', 'v', '1', '2') },
{ AV_PIX_FMT_YUV420P, MKTAG('Y', 'V', '1', '2') },
{ AV_PIX_FMT_YUV410P, MKTAG('Y', 'U', 'V', '9') },
{ AV_PIX_FMT_YUV410P, MKTAG('Y', 'V', 'U', '9') },
diff --git a/libavcodec/resample.c b/libavcodec/resample.c
index 0f5ee84942..4c5eb9f10e 100644
--- a/libavcodec/resample.c
+++ b/libavcodec/resample.c
@@ -291,12 +291,6 @@ int audio_resample(ReSampleContext *s, short *output, short *input, int nb_sampl
short *output_bak = NULL;
int lenout;
- if (s->input_channels == s->output_channels && s->ratio == 1.0 && 0) {
- /* nothing to do */
- memcpy(output, input, nb_samples * s->input_channels * sizeof(short));
- return nb_samples;
- }
-
if (s->sample_fmt[0] != AV_SAMPLE_FMT_S16) {
int istride[1] = { s->sample_size[0] };
int ostride[1] = { 2 };
diff --git a/libavcodec/rscc.c b/libavcodec/rscc.c
index a2f7a0dc7c..0c3e81845d 100644
--- a/libavcodec/rscc.c
+++ b/libavcodec/rscc.c
@@ -223,6 +223,12 @@ static int rscc_decode_frame(AVCodecContext *avctx, void *data,
ff_dlog(avctx, "pixel_size %d packed_size %d.\n", pixel_size, packed_size);
+ if (packed_size < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Invalid tile size %d\n", packed_size);
+ ret = AVERROR_INVALIDDATA;
+ goto end;
+ }
+
/* Get pixels buffer, it may be deflated or just raw */
if (pixel_size == packed_size) {
if (bytestream2_get_bytes_left(gbc) < pixel_size) {
@@ -233,6 +239,11 @@ static int rscc_decode_frame(AVCodecContext *avctx, void *data,
pixels = gbc->buffer;
} else {
uLongf len = ctx->inflated_size;
+ if (bytestream2_get_bytes_left(gbc) < packed_size) {
+ av_log(avctx, AV_LOG_ERROR, "Insufficient input for %d\n", packed_size);
+ ret = AVERROR_INVALIDDATA;
+ goto end;
+ }
ret = uncompress(ctx->inflated_buf, &len, gbc->buffer, packed_size);
if (ret) {
av_log(avctx, AV_LOG_ERROR, "Pixel deflate error %d.\n", ret);
diff --git a/libavcodec/takdec.c b/libavcodec/takdec.c
index d057e0a1cb..001086bc74 100644
--- a/libavcodec/takdec.c
+++ b/libavcodec/takdec.c
@@ -227,6 +227,7 @@ static void decode_lpc(int32_t *coeffs, int mode, int length)
int a3 = coeffs[2];
int a4 = a3 + a1;
int a5 = a4 + a2;
+ coeffs[2] = a5;
coeffs += 3;
for (i = 0; i < length - 3; i++) {
a3 += *coeffs;
diff --git a/libavcodec/ttaenc.c b/libavcodec/ttaenc.c
index 0df1fcb6aa..2f1c8db556 100644
--- a/libavcodec/ttaenc.c
+++ b/libavcodec/ttaenc.c
@@ -114,9 +114,12 @@ static int tta_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
{
TTAEncContext *s = avctx->priv_data;
PutBitContext pb;
- int ret, i, out_bytes, cur_chan = 0, res = 0, samples = 0;
+ int ret, i, out_bytes, cur_chan, res, samples;
+ int64_t pkt_size = frame->nb_samples * 2LL * avctx->channels * s->bps;
- if ((ret = ff_alloc_packet2(avctx, avpkt, frame->nb_samples * 2 * avctx->channels * s->bps, 0)) < 0)
+pkt_alloc:
+ cur_chan = 0, res = 0, samples = 0;
+ if ((ret = ff_alloc_packet2(avctx, avpkt, pkt_size, 0)) < 0)
return ret;
init_put_bits(&pb, avpkt->data, avpkt->size);
@@ -174,6 +177,14 @@ static int tta_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
rice->k1++;
unary = 1 + (outval >> k);
+ if (unary + 100LL > put_bits_left(&pb)) {
+ if (pkt_size < INT_MAX/2) {
+ pkt_size *= 2;
+ av_packet_unref(avpkt);
+ goto pkt_alloc;
+ } else
+ return AVERROR(ENOMEM);
+ }
do {
if (unary > 31) {
put_bits(&pb, 31, 0x7FFFFFFF);
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index f532824f45..5d5190002e 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -1126,6 +1126,10 @@ int av_codec_get_max_lowres(const AVCodec *codec)
return codec->max_lowres;
}
+int avpriv_codec_get_cap_skip_frame_fill_param(const AVCodec *codec){
+ return !!(codec->caps_internal & FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM);
+}
+
static void get_subtitle_defaults(AVSubtitle *sub)
{
memset(sub, 0, sizeof(*sub));
@@ -2254,7 +2258,7 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
skip_reason = AV_RL8(side + 8);
discard_reason = AV_RL8(side + 9);
}
- if (avctx->internal->skip_samples && *got_frame_ptr &&
+ if (avctx->internal->skip_samples > 0 && *got_frame_ptr &&
!(avctx->flags2 & AV_CODEC_FLAG2_SKIP_MANUAL)) {
if(frame->nb_samples <= avctx->internal->skip_samples){
*got_frame_ptr = 0;
diff --git a/libavcodec/vc2enc.c b/libavcodec/vc2enc.c
index f42b10ffef..bf3f3a980d 100644
--- a/libavcodec/vc2enc.c
+++ b/libavcodec/vc2enc.c
@@ -867,7 +867,7 @@ static int dwt_plane(AVCodecContext *avctx, void *arg)
}
}
- memset(buf, 0, (p->coef_stride*p->dwt_height - p->height*p->width)*sizeof(dwtcoef));
+ memset(buf, 0, p->coef_stride * (p->dwt_height - p->height) * sizeof(dwtcoef));
for (level = s->wavelet_depth-1; level >= 0; level--) {
const SubBand *b = &p->band[level][0];
diff --git a/libavcodec/vp9_parser.c b/libavcodec/vp9_parser.c
index 2e9235e657..9900e7ab1f 100644
--- a/libavcodec/vp9_parser.c
+++ b/libavcodec/vp9_parser.c
@@ -28,6 +28,7 @@
typedef struct VP9ParseContext {
int n_frames; // 1-8
int size[8];
+ int marker_size;
int64_t pts;
} VP9ParseContext;
@@ -89,6 +90,21 @@ static int parse(AVCodecParserContext *ctx,
}
if (s->n_frames > 0) {
+ int i;
+ int size_sum = 0;
+
+ for (i = 0; i < s->n_frames ;i++)
+ size_sum += s->size[i];
+ size_sum += s->marker_size;
+
+ if (size_sum != size) {
+ av_log(avctx, AV_LOG_ERROR, "Inconsistent input frame sizes %d %d\n",
+ size_sum, size);
+ s->n_frames = 0;
+ }
+ }
+
+ if (s->n_frames > 0) {
*out_data = data;
*out_size = s->size[--s->n_frames];
parse_frame(ctx, *out_data, *out_size);
@@ -131,6 +147,7 @@ static int parse(AVCodecParserContext *ctx,
data += sz; \
size -= sz; \
} \
+ s->marker_size = size; \
parse_frame(ctx, *out_data, *out_size); \
return s->n_frames > 0 ? *out_size : full_size
diff --git a/libavfilter/af_amix.c b/libavfilter/af_amix.c
index e64e289108..3e5e7ee118 100644
--- a/libavfilter/af_amix.c
+++ b/libavfilter/af_amix.c
@@ -312,6 +312,9 @@ static int output_frame(AVFilterLink *outlink)
calculate_scales(s, nb_samples);
+ if (nb_samples == 0)
+ return 0;
+
out_buf = ff_get_audio_buffer(outlink, nb_samples);
if (!out_buf)
return AVERROR(ENOMEM);
diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
index 82d2bcda10..eab24589dc 100644
--- a/libavfilter/src_movie.c
+++ b/libavfilter/src_movie.c
@@ -240,7 +240,7 @@ static av_cold int movie_common_init(AVFilterContext *ctx)
timestamp = movie->seek_point;
// add the stream start time, should it exist
if (movie->format_ctx->start_time != AV_NOPTS_VALUE) {
- if (timestamp > INT64_MAX - movie->format_ctx->start_time) {
+ if (timestamp > 0 && movie->format_ctx->start_time > INT64_MAX - timestamp) {
av_log(ctx, AV_LOG_ERROR,
"%s: seek value overflow with start_time:%"PRId64" seek_point:%"PRId64"\n",
movie->file_name, movie->format_ctx->start_time, movie->seek_point);
diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c
index 1ef3ecb31f..65c2c58b6f 100644
--- a/libavfilter/vf_drawtext.c
+++ b/libavfilter/vf_drawtext.c
@@ -1222,7 +1222,9 @@ static int draw_text(AVFilterContext *ctx, AVFrame *frame,
dummy.code = code;
glyph = av_tree_find(s->glyphs, &dummy, glyph_cmp, NULL);
if (!glyph) {
- load_glyph(ctx, &glyph, code);
+ ret = load_glyph(ctx, &glyph, code);
+ if (ret < 0)
+ return ret;
}
y_min = FFMIN(glyph->bbox.yMin, y_min);
diff --git a/libavfilter/vf_telecine.c b/libavfilter/vf_telecine.c
index 182c670849..58babca9a1 100644
--- a/libavfilter/vf_telecine.c
+++ b/libavfilter/vf_telecine.c
@@ -190,6 +190,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
}
if (s->occupied) {
+ av_frame_make_writable(s->frame[nout]);
for (i = 0; i < s->nb_planes; i++) {
// fill in the EARLIER field from the buffered pic
av_image_copy_plane(s->frame[nout]->data[i] + s->frame[nout]->linesize[i] * s->first_field,
@@ -213,6 +214,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
while (len >= 2) {
// output THIS image as-is
+ av_frame_make_writable(s->frame[nout]);
for (i = 0; i < s->nb_planes; i++)
av_image_copy_plane(s->frame[nout]->data[i], s->frame[nout]->linesize[i],
inpicref->data[i], inpicref->linesize[i],
diff --git a/libavformat/allformats.c b/libavformat/allformats.c
index 02bb16a71e..fb1a67797b 100644
--- a/libavformat/allformats.c
+++ b/libavformat/allformats.c
@@ -54,7 +54,6 @@ void av_register_all(void)
if (initialized)
return;
- initialized = 1;
avcodec_register_all();
@@ -418,4 +417,6 @@ void av_register_all(void)
REGISTER_PROTOCOL(LIBRTMPTE, librtmpte);
REGISTER_PROTOCOL(LIBSSH, libssh);
REGISTER_PROTOCOL(LIBSMBCLIENT, libsmbclient);
+
+ initialized = 1;
}
diff --git a/libavformat/avidec.c b/libavformat/avidec.c
index 38598107fc..a6459a0e05 100644
--- a/libavformat/avidec.c
+++ b/libavformat/avidec.c
@@ -1695,6 +1695,8 @@ static int guess_ni_flag(AVFormatContext *s)
size = avio_rl32(s->pb);
if (get_stream_idx(tag) == i && pos + size > st->index_entries[1].pos)
last_start = INT64_MAX;
+ if (get_stream_idx(tag) == i && size == st->index_entries[0].size + 8)
+ last_start = INT64_MAX;
}
if (st->index_entries[0].pos > last_start)
diff --git a/libavformat/cache.c b/libavformat/cache.c
index 8e8b9e8412..8aed37eb2d 100644
--- a/libavformat/cache.c
+++ b/libavformat/cache.c
@@ -283,6 +283,12 @@ resolve_eof:
return ret;
}
+static int enu_free(void *opaque, void *elem)
+{
+ av_free(elem);
+ return 0;
+}
+
static int cache_close(URLContext *h)
{
Context *c= h->priv_data;
@@ -292,6 +298,7 @@ static int cache_close(URLContext *h)
close(c->fd);
ffurl_close(c->inner);
+ av_tree_enumerate(c->root, NULL, NULL, enu_free);
av_tree_destroy(c->root);
return 0;
diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c
index d226e1504e..de7b89a28f 100644
--- a/libavformat/concatdec.c
+++ b/libavformat/concatdec.c
@@ -710,7 +710,7 @@ static int concat_seek(AVFormatContext *avf, int stream,
static const AVOption options[] = {
{ "safe", "enable safe mode",
- OFFSET(safe), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, DEC },
+ OFFSET(safe), AV_OPT_TYPE_BOOL, {.i64 = 1}, -1, 1, DEC },
{ "auto_convert", "automatically convert bitstream format",
OFFSET(auto_convert), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, DEC },
{ "segment_time_metadata", "output file segment start time and duration as packet metadata",
diff --git a/libavformat/ffmdec.c b/libavformat/ffmdec.c
index 41c518f3c7..83929fe8c3 100644
--- a/libavformat/ffmdec.c
+++ b/libavformat/ffmdec.c
@@ -27,6 +27,7 @@
#include "libavutil/opt.h"
#include "libavutil/avassert.h"
#include "libavutil/avstring.h"
+#include "libavutil/pixdesc.h"
#include "avformat.h"
#include "internal.h"
#include "ffm.h"
@@ -377,6 +378,11 @@ static int ffm2_read_header(AVFormatContext *s)
codec->height = avio_rb16(pb);
codec->gop_size = avio_rb16(pb);
codec->pix_fmt = avio_rb32(pb);
+ if (!av_pix_fmt_desc_get(codec->pix_fmt)) {
+ av_log(s, AV_LOG_ERROR, "Invalid pix fmt id: %d\n", codec->pix_fmt);
+ codec->pix_fmt = AV_PIX_FMT_NONE;
+ goto fail;
+ }
codec->qmin = avio_r8(pb);
codec->qmax = avio_r8(pb);
codec->max_qdiff = avio_r8(pb);
@@ -569,6 +575,11 @@ static int ffm_read_header(AVFormatContext *s)
codec->height = avio_rb16(pb);
codec->gop_size = avio_rb16(pb);
codec->pix_fmt = avio_rb32(pb);
+ if (!av_pix_fmt_desc_get(codec->pix_fmt)) {
+ av_log(s, AV_LOG_ERROR, "Invalid pix fmt id: %d\n", codec->pix_fmt);
+ codec->pix_fmt = AV_PIX_FMT_NONE;
+ goto fail;
+ }
codec->qmin = avio_r8(pb);
codec->qmax = avio_r8(pb);
codec->max_qdiff = avio_r8(pb);
@@ -775,8 +786,8 @@ static int ffm_probe(AVProbeData *p)
static const AVOption options[] = {
{"server_attached", NULL, offsetof(FFMContext, server_attached), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, AV_OPT_FLAG_EXPORT },
- {"ffm_write_index", NULL, offsetof(FFMContext, write_index), AV_OPT_TYPE_INT64, {.i64 = 0}, 0, 1, AV_OPT_FLAG_EXPORT },
- {"ffm_file_size", NULL, offsetof(FFMContext, file_size), AV_OPT_TYPE_INT64, {.i64 = 0}, 0, 1, AV_OPT_FLAG_EXPORT },
+ {"ffm_write_index", NULL, offsetof(FFMContext, write_index), AV_OPT_TYPE_INT64, {.i64 = 0}, 0, INT64_MAX, AV_OPT_FLAG_EXPORT },
+ {"ffm_file_size", NULL, offsetof(FFMContext, file_size), AV_OPT_TYPE_INT64, {.i64 = 0}, 0, INT64_MAX, AV_OPT_FLAG_EXPORT },
{ NULL },
};
diff --git a/libavformat/file.c b/libavformat/file.c
index 595ba3607e..544647f5e6 100644
--- a/libavformat/file.c
+++ b/libavformat/file.c
@@ -349,7 +349,7 @@ URLProtocol ff_file_protocol = {
.url_open_dir = file_open_dir,
.url_read_dir = file_read_dir,
.url_close_dir = file_close_dir,
- .default_whitelist = "file"
+ .default_whitelist = "file,crypto"
};
#endif /* CONFIG_FILE_PROTOCOL */
@@ -388,7 +388,7 @@ URLProtocol ff_pipe_protocol = {
.url_check = file_check,
.priv_data_size = sizeof(FileContext),
.priv_data_class = &pipe_class,
- .default_whitelist = "none"
+ .default_whitelist = "crypto"
};
#endif /* CONFIG_PIPE_PROTOCOL */
diff --git a/libavformat/flacdec.c b/libavformat/flacdec.c
index eb92216c45..46c51a6453 100644
--- a/libavformat/flacdec.c
+++ b/libavformat/flacdec.c
@@ -259,8 +259,10 @@ static av_unused int64_t flac_read_timestamp(AVFormatContext *s, int stream_inde
if (ret < 0){
if (ret == AVERROR(EAGAIN))
continue;
- else
- break;
+ else {
+ av_packet_unref(&pkt);
+ av_assert1(!pkt.size);
+ }
}
av_init_packet(&out_pkt);
av_parser_parse2(parser, st->codec,
@@ -277,7 +279,8 @@ static av_unused int64_t flac_read_timestamp(AVFormatContext *s, int stream_inde
pts = parser->pts;
break;
}
- }
+ } else if (ret < 0)
+ break;
}
av_parser_close(parser);
return pts;
diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
index 5090ac2157..03bbf98d5e 100644
--- a/libavformat/flvdec.c
+++ b/libavformat/flvdec.c
@@ -1144,7 +1144,7 @@ retry_duration:
leave:
last = avio_rb32(s->pb);
- if (last != orig_size + 11 &&
+ if (last != orig_size + 11 && last != orig_size + 10 &&
(last != orig_size || !last) && last != flv->sum_flv_tag_size &&
!flv->broken_sizes) {
av_log(s, AV_LOG_ERROR, "Packet mismatch %d %d\n", last, orig_size + 11);
diff --git a/libavformat/format.c b/libavformat/format.c
index 15fe167fb2..f0abb5deeb 100644
--- a/libavformat/format.c
+++ b/libavformat/format.c
@@ -62,20 +62,24 @@ void av_register_input_format(AVInputFormat *format)
{
AVInputFormat **p = last_iformat;
- format->next = NULL;
- while(*p || avpriv_atomic_ptr_cas((void * volatile *)p, NULL, format))
+ // Note, format could be added after the first 2 checks but that implies that *p is no longer NULL
+ while(p != &format->next && !format->next && avpriv_atomic_ptr_cas((void * volatile *)p, NULL, format))
p = &(*p)->next;
- last_iformat = &format->next;
+
+ if (!format->next)
+ last_iformat = &format->next;
}
void av_register_output_format(AVOutputFormat *format)
{
AVOutputFormat **p = last_oformat;
- format->next = NULL;
- while(*p || avpriv_atomic_ptr_cas((void * volatile *)p, NULL, format))
+ // Note, format could be added after the first 2 checks but that implies that *p is no longer NULL
+ while(p != &format->next && !format->next && avpriv_atomic_ptr_cas((void * volatile *)p, NULL, format))
p = &(*p)->next;
- last_oformat = &format->next;
+
+ if (!format->next)
+ last_oformat = &format->next;
}
int av_match_ext(const char *filename, const char *extensions)
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index 7ab7cbb9ab..85a0907e67 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -396,7 +396,7 @@ static int hls_window(AVFormatContext *s, int last)
set_http_options(&options, hls);
snprintf(temp_filename, sizeof(temp_filename), use_rename ? "%s.tmp" : "%s", s->filename);
- if ((ret = s->io_open(s, &out, temp_filename, AVIO_FLAG_WRITE, NULL)) < 0)
+ if ((ret = s->io_open(s, &out, temp_filename, AVIO_FLAG_WRITE, &options)) < 0)
goto fail;
for (en = hls->segments; en; en = en->next) {
diff --git a/libavformat/http.c b/libavformat/http.c
index d1b91e23d6..3dad2ef9fb 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -1522,7 +1522,7 @@ URLProtocol ff_http_protocol = {
.priv_data_size = sizeof(HTTPContext),
.priv_data_class = &http_context_class,
.flags = URL_PROTOCOL_FLAG_NETWORK,
- .default_whitelist = "http,https,tls,rtp,tcp,udp,crypto"
+ .default_whitelist = "http,https,tls,rtp,tcp,udp,crypto,httpproxy"
};
#endif /* CONFIG_HTTP_PROTOCOL */
@@ -1541,7 +1541,7 @@ URLProtocol ff_https_protocol = {
.priv_data_size = sizeof(HTTPContext),
.priv_data_class = &https_context_class,
.flags = URL_PROTOCOL_FLAG_NETWORK,
- .default_whitelist = "http,https,tls,rtp,tcp,udp,crypto"
+ .default_whitelist = "http,https,tls,rtp,tcp,udp,crypto,httpproxy"
};
#endif /* CONFIG_HTTPS_PROTOCOL */
diff --git a/libavformat/librtmp.c b/libavformat/librtmp.c
index bfa9a718f1..5a138adad4 100644
--- a/libavformat/librtmp.c
+++ b/libavformat/librtmp.c
@@ -193,6 +193,8 @@ static int rtmp_open(URLContext *s, const char *uri, int flags)
if (sep)
p = sep + 1;
+ else
+ break;
}
}
if (ctx->playpath) {
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 149e3b4a0e..bcba9bb382 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -2750,7 +2750,12 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
sample_size = sc->stsz_sample_size > 0 ? sc->stsz_sample_size : sc->sample_sizes[current_sample];
if (sc->pseudo_stream_id == -1 ||
sc->stsc_data[stsc_index].id - 1 == sc->pseudo_stream_id) {
- AVIndexEntry *e = &st->index_entries[st->nb_index_entries++];
+ AVIndexEntry *e;
+ if (sample_size > 0x3FFFFFFF) {
+ av_log(mov->fc, AV_LOG_ERROR, "Sample size %u is too large\n", sample_size);
+ return;
+ }
+ e = &st->index_entries[st->nb_index_entries++];
e->pos = current_offset;
e->timestamp = current_dts;
e->size = sample_size;
@@ -2875,6 +2880,10 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
av_log(mov->fc, AV_LOG_ERROR, "wrong chunk count %d\n", total);
return;
}
+ if (size > 0x3FFFFFFF) {
+ av_log(mov->fc, AV_LOG_ERROR, "Sample size %u is too large\n", size);
+ return;
+ }
e = &st->index_entries[st->nb_index_entries++];
e->pos = current_offset;
e->timestamp = current_dts;
@@ -3609,7 +3618,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
}
av_log(c->fc, AV_LOG_DEBUG, "calculated into dts %"PRId64"\n", dts);
} else {
- dts = frag->time;
+ dts = frag->time - sc->time_offset;
av_log(c->fc, AV_LOG_DEBUG, "found frag time %"PRId64
", using it for dts\n", dts);
}
@@ -3666,7 +3675,7 @@ static int mov_read_sidx(MOVContext *c, AVIOContext *pb, MOVAtom atom)
version = avio_r8(pb);
if (version > 1) {
avpriv_request_sample(c->fc, "sidx version %u", version);
- return AVERROR_PATCHWELCOME;
+ return 0;
}
avio_rb24(pb); // flags
@@ -3679,8 +3688,8 @@ static int mov_read_sidx(MOVContext *c, AVIOContext *pb, MOVAtom atom)
}
}
if (!st) {
- av_log(c->fc, AV_LOG_ERROR, "could not find corresponding track id %d\n", track_id);
- return AVERROR_INVALIDDATA;
+ av_log(c->fc, AV_LOG_WARNING, "could not find corresponding track id %d\n", track_id);
+ return 0;
}
sc = st->priv_data;
diff --git a/libavformat/mp3dec.c b/libavformat/mp3dec.c
index c76b21ebd6..50bf52cf27 100644
--- a/libavformat/mp3dec.c
+++ b/libavformat/mp3dec.c
@@ -64,6 +64,7 @@ static int check(AVIOContext *pb, int64_t pos, uint32_t *header);
static int mp3_read_probe(AVProbeData *p)
{
int max_frames, first_frames = 0;
+ int whole_used = 0;
int frames, ret;
uint32_t header;
const uint8_t *buf, *buf0, *buf2, *end;
@@ -88,8 +89,11 @@ static int mp3_read_probe(AVProbeData *p)
buf2 += h.frame_size;
}
max_frames = FFMAX(max_frames, frames);
- if(buf == buf0)
+ if(buf == buf0) {
first_frames= frames;
+ if (buf2 == end + sizeof(uint32_t))
+ whole_used = 1;
+ }
}
// keep this in sync with ac3 probe, both need to avoid
// issues with MPEG-files!
@@ -98,6 +102,7 @@ static int mp3_read_probe(AVProbeData *p)
else if(max_frames>=4 && max_frames >= p->buf_size/10000) return AVPROBE_SCORE_EXTENSION / 2;
else if(ff_id3v2_match(buf0, ID3v2_DEFAULT_MAGIC) && 2*ff_id3v2_tag_len(buf0) >= p->buf_size)
return p->buf_size < PROBE_BUF_MAX ? AVPROBE_SCORE_EXTENSION / 4 : AVPROBE_SCORE_EXTENSION - 2;
+ else if(first_frames > 1 && whole_used) return 5;
else if(max_frames>=1 && max_frames >= p->buf_size/10000) return 1;
else return 0;
//mpegps_mp3_unrecognized_format.mpg has max_frames=3
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 22874e6f83..e8f3889d1a 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -1769,8 +1769,11 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
case 0x05: /* registration descriptor */
st->codec->codec_tag = bytestream_get_le32(pp);
av_log(fc, AV_LOG_TRACE, "reg_desc=%.4s\n", (char *)&st->codec->codec_tag);
- if (st->codec->codec_id == AV_CODEC_ID_NONE || st->request_probe > 0)
+ if (st->codec->codec_id == AV_CODEC_ID_NONE || st->request_probe > 0) {
mpegts_find_stream_type(st, st->codec->codec_tag, REGD_types);
+ if (st->codec->codec_tag == MKTAG('B', 'S', 'S', 'D'))
+ st->request_probe = 50;
+ }
break;
case 0x52: /* stream identifier descriptor */
st->stream_identifier = 1 + get8(pp, desc_end);
@@ -2441,7 +2444,7 @@ static int mpegts_probe(AVProbeData *p)
#define CHECK_COUNT 10
#define CHECK_BLOCK 100
- if (check_count < CHECK_COUNT)
+ if (!check_count)
return 0;
for (i = 0; i<check_count; i+=CHECK_BLOCK) {
@@ -2459,10 +2462,17 @@ static int mpegts_probe(AVProbeData *p)
ff_dlog(0, "TS score: %d %d\n", sumscore, maxscore);
- if (sumscore > 6) return AVPROBE_SCORE_MAX + sumscore - CHECK_COUNT;
- else if (maxscore > 6) return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT;
- else
+ if (check_count > CHECK_COUNT && sumscore > 6) {
+ return AVPROBE_SCORE_MAX + sumscore - CHECK_COUNT;
+ } else if (check_count >= CHECK_COUNT && sumscore > 6) {
+ return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT;
+ } else if (check_count >= CHECK_COUNT && maxscore > 6) {
+ return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT;
+ } else if (sumscore > 6) {
+ return 2;
+ } else {
return 0;
+ }
}
/* return the 90kHz PCR and the extension for the 27MHz PCR. return
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 765672067a..6bf5461b64 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -56,6 +56,7 @@ typedef struct MpegTSService {
int pcr_pid;
int pcr_packet_count;
int pcr_packet_period;
+ AVProgram *program;
} MpegTSService;
// service_type values as defined in ETSI 300 468
@@ -275,15 +276,12 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
if (s->nb_programs) {
- int j, k, found = 0;
-
- for (j = 0; j < s->nb_programs; j++)
- if (s->programs[j]->id == service->sid) {
- for (k = 0; k < s->programs[j]->nb_stream_indexes; k++)
- if (s->programs[j]->stream_index[k] == i) {
- found = 1;
- break;
- }
+ int k, found = 0;
+ AVProgram *program = service->program;
+
+ for (k = 0; k < program->nb_stream_indexes; k++)
+ if (program->stream_index[k] == i) {
+ found = 1;
break;
}
@@ -784,6 +782,7 @@ static int mpegts_init(AVFormatContext *s)
service->pmt.write_packet = section_write_packet;
service->pmt.opaque = s;
service->pmt.cc = 15;
+ service->program = program;
}
}
@@ -807,6 +806,7 @@ static int mpegts_init(AVFormatContext *s)
/* assign pids to each stream */
for (i = 0; i < s->nb_streams; i++) {
+ AVProgram *program;
st = s->streams[i];
ts_st = av_mallocz(sizeof(MpegTSWriteStream));
@@ -824,6 +824,17 @@ static int mpegts_init(AVFormatContext *s)
ret = AVERROR(ENOMEM);
goto fail;
}
+
+ program = av_find_program_from_stream(s, NULL, i);
+ if (program) {
+ for (j = 0; j < ts->nb_services; j++) {
+ if (ts->services[j]->program == program) {
+ service = ts->services[j];
+ break;
+ }
+ }
+ }
+
ts_st->service = service;
/* MPEG pid values < 16 are reserved. Applications which set st->id in
* this range are assigned a calculated pid. */
diff --git a/libavformat/mux.c b/libavformat/mux.c
index 789c811cd8..f14bfd52d5 100644
--- a/libavformat/mux.c
+++ b/libavformat/mux.c
@@ -400,7 +400,8 @@ FF_ENABLE_DEPRECATION_WARNINGS
}
if (s->oformat->init && (ret = s->oformat->init(s)) < 0) {
- s->oformat->deinit(s);
+ if (s->oformat->deinit)
+ s->oformat->deinit(s);
goto fail;
}
diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
index 2d99b4af25..8f3b44c3c5 100644
--- a/libavformat/oggdec.c
+++ b/libavformat/oggdec.c
@@ -701,6 +701,7 @@ static int ogg_read_header(AVFormatContext *s)
if (ogg->streams[i].header < 0) {
av_log(s, AV_LOG_ERROR, "Header parsing failed for stream %d\n", i);
ogg->streams[i].codec = NULL;
+ av_freep(&ogg->streams[i].private);
} else if (os->codec && os->nb_header < os->codec->nb_header) {
av_log(s, AV_LOG_WARNING,
"Headers mismatch for stream %d: "
diff --git a/libavformat/oggdec.h b/libavformat/oggdec.h
index d7af1cfabd..4a2b6ddee8 100644
--- a/libavformat/oggdec.h
+++ b/libavformat/oggdec.h
@@ -162,6 +162,11 @@ ogg_gptopts (AVFormatContext * s, int i, uint64_t gp, int64_t *dts)
if (dts)
*dts = pts;
}
+ if (pts > INT64_MAX && pts != AV_NOPTS_VALUE) {
+ // The return type is unsigned, we thus cannot return negative pts
+ av_log(s, AV_LOG_ERROR, "invalid pts %"PRId64"\n", pts);
+ pts = AV_NOPTS_VALUE;
+ }
return pts;
}
diff --git a/libavformat/oggparseopus.c b/libavformat/oggparseopus.c
index c8b02fab4d..8bb2a41366 100644
--- a/libavformat/oggparseopus.c
+++ b/libavformat/oggparseopus.c
@@ -117,6 +117,10 @@ static int opus_packet(AVFormatContext *avf, int idx)
if (!os->psize)
return AVERROR_INVALIDDATA;
+ if (os->granule > (1LL << 62)) {
+ av_log(avf, AV_LOG_ERROR, "Unsupported huge granule pos %"PRId64 "\n", os->granule);
+ return AVERROR_INVALIDDATA;
+ }
if ((!os->lastpts || os->lastpts == AV_NOPTS_VALUE) && !(os->flags & OGG_FLAG_EOS)) {
int seg, d;
diff --git a/libavformat/oggparsevp8.c b/libavformat/oggparsevp8.c
index 7aed8abad3..ca13928f1e 100644
--- a/libavformat/oggparsevp8.c
+++ b/libavformat/oggparsevp8.c
@@ -82,7 +82,11 @@ static uint64_t vp8_gptopts(AVFormatContext *s, int idx,
struct ogg *ogg = s->priv_data;
struct ogg_stream *os = ogg->streams + idx;
- uint64_t pts = (granule >> 32);
+ int invcnt = !((granule >> 30) & 3);
+ // If page granule is that of an invisible vp8 frame, its pts will be
+ // that of the end of the next visible frame. We substract 1 for those
+ // to prevent messing up pts calculations.
+ uint64_t pts = (granule >> 32) - invcnt;
uint32_t dist = (granule >> 3) & 0x07ffffff;
if (!dist)
diff --git a/libavformat/options_table.h b/libavformat/options_table.h
index 8926fe5734..e84e54a5b1 100644
--- a/libavformat/options_table.h
+++ b/libavformat/options_table.h
@@ -87,6 +87,7 @@ static const AVOption avformat_options[] = {
{"max_interleave_delta", "maximum buffering duration for interleaving", OFFSET(max_interleave_delta), AV_OPT_TYPE_INT64, { .i64 = 10000000 }, 0, INT64_MAX, E },
{"f_strict", "how strictly to follow the standards (deprecated; use strict, save via avconv)", OFFSET(strict_std_compliance), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, D|E, "strict"},
{"strict", "how strictly to follow the standards", OFFSET(strict_std_compliance), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, D|E, "strict"},
+{"very", "strictly conform to a older more strict version of the spec or reference software", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_VERY_STRICT }, INT_MIN, INT_MAX, D|E, "strict"},
{"strict", "strictly conform to all the things in the spec no matter what the consequences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_STRICT }, INT_MIN, INT_MAX, D|E, "strict"},
{"normal", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_NORMAL }, INT_MIN, INT_MAX, D|E, "strict"},
{"unofficial", "allow unofficial extensions", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_UNOFFICIAL }, INT_MIN, INT_MAX, D|E, "strict"},
diff --git a/libavformat/rtpdec_asf.c b/libavformat/rtpdec_asf.c
index 2b1ddf140d..1c88580f84 100644
--- a/libavformat/rtpdec_asf.c
+++ b/libavformat/rtpdec_asf.c
@@ -101,7 +101,7 @@ int ff_wms_parse_sdp_a_line(AVFormatContext *s, const char *p)
{
int ret = 0;
if (av_strstart(p, "pgmpu:data:application/vnd.ms.wms-hdr.asfv1;base64,", &p)) {
- AVIOContext pb;
+ AVIOContext pb = { 0 };
RTSPState *rt = s->priv_data;
AVDictionary *opts = NULL;
int len = strlen(p) * 6 / 8;
diff --git a/libavformat/rtpdec_jpeg.c b/libavformat/rtpdec_jpeg.c
index f3a2060523..397b5cf56c 100644
--- a/libavformat/rtpdec_jpeg.c
+++ b/libavformat/rtpdec_jpeg.c
@@ -193,16 +193,17 @@ static void create_default_qtables(uint8_t *qtables, uint8_t q)
{
int factor = q;
int i;
+ uint16_t S;
factor = av_clip(q, 1, 99);
if (q < 50)
- q = 5000 / factor;
+ S = 5000 / factor;
else
- q = 200 - factor * 2;
+ S = 200 - factor * 2;
for (i = 0; i < 128; i++) {
- int val = (default_quantizers[i] * q + 50) / 100;
+ int val = (default_quantizers[i] * S + 50) / 100;
/* Limit the quantizers to 1 <= q <= 255. */
val = av_clip(val, 1, 255);
diff --git a/libavformat/rtpenc.c b/libavformat/rtpenc.c
index 31569d60b7..00b69f5765 100644
--- a/libavformat/rtpenc.c
+++ b/libavformat/rtpenc.c
@@ -271,7 +271,8 @@ static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time, int bye)
avio_w8(s1->pb, RTCP_SR);
avio_wb16(s1->pb, 6); /* length in words - 1 */
avio_wb32(s1->pb, s->ssrc);
- avio_wb64(s1->pb, NTP_TO_RTP_FORMAT(ntp_time));
+ avio_wb32(s1->pb, ntp_time / 1000000);
+ avio_wb32(s1->pb, ((ntp_time % 1000000) << 32) / 1000000);
avio_wb32(s1->pb, rtp_ts);
avio_wb32(s1->pb, s->packet_count);
avio_wb32(s1->pb, s->octet_count);
diff --git a/libavformat/svag.c b/libavformat/svag.c
index ab7f36c81a..08fc06b1ba 100644
--- a/libavformat/svag.c
+++ b/libavformat/svag.c
@@ -48,7 +48,7 @@ static int svag_read_header(AVFormatContext *s)
if (st->codec->sample_rate <= 0)
return AVERROR_INVALIDDATA;
st->codec->channels = avio_rl32(s->pb);
- if (st->codec->channels <= 0)
+ if (st->codec->channels <= 0 || st->codec->channels > 8)
return AVERROR_INVALIDDATA;
st->duration = size / (16 * st->codec->channels) * 28;
align = avio_rl32(s->pb);
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 129a49d699..542ded76cb 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -1186,12 +1186,13 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
}
}
- if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)) {
+ if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
st->pts_buffer[0] = pkt->pts;
for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
- pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
+ if(has_decode_delay_been_guessed(st))
+ pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
}
// We skipped it above so we try here.
if (!onein_oneout)
@@ -2369,7 +2370,7 @@ static void update_stream_timings(AVFormatContext *ic)
end_time1 = av_rescale_q_rnd(st->duration, st->time_base,
AV_TIME_BASE_Q,
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
- if (end_time1 != AV_NOPTS_VALUE) {
+ if (end_time1 != AV_NOPTS_VALUE && start_time1 <= INT64_MAX - end_time1) {
end_time1 += start_time1;
end_time = FFMAX(end_time, end_time1);
}
@@ -2407,7 +2408,7 @@ static void update_stream_timings(AVFormatContext *ic)
if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
ic->duration = duration;
}
- if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
+ if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration > 0) {
/* compute the bitrate */
double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
(double) ic->duration;
@@ -2832,6 +2833,9 @@ enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
{
+ if (bps <= 0 || bps > 64)
+ return AV_CODEC_ID_NONE;
+
if (flt) {
switch (bps) {
case 32:
@@ -2915,7 +2919,7 @@ static void compute_chapters_end(AVFormatContext *s)
unsigned int i, j;
int64_t max_time = 0;
- if (s->duration > 0)
+ if (s->duration > 0 && s->start_time < INT64_MAX - s->duration)
max_time = s->duration +
((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
diff --git a/libavutil/channel_layout.c b/libavutil/channel_layout.c
index 601c7e677c..26c87c96a8 100644
--- a/libavutil/channel_layout.c
+++ b/libavutil/channel_layout.c
@@ -94,7 +94,7 @@ static const struct {
{ "6.0(front)", 6, AV_CH_LAYOUT_6POINT0_FRONT },
{ "hexagonal", 6, AV_CH_LAYOUT_HEXAGONAL },
{ "6.1", 7, AV_CH_LAYOUT_6POINT1 },
- { "6.1", 7, AV_CH_LAYOUT_6POINT1_BACK },
+ { "6.1(back)", 7, AV_CH_LAYOUT_6POINT1_BACK },
{ "6.1(front)", 7, AV_CH_LAYOUT_6POINT1_FRONT },
{ "7.0", 7, AV_CH_LAYOUT_7POINT0 },
{ "7.0(front)", 7, AV_CH_LAYOUT_7POINT0_FRONT },
diff --git a/libavutil/colorspace.h b/libavutil/colorspace.h
index 826ffd52c4..7d3f7110c9 100644
--- a/libavutil/colorspace.h
+++ b/libavutil/colorspace.h
@@ -41,6 +41,16 @@
b_add = FIX(1.77200*255.0/224.0) * cb + ONE_HALF;\
}
+#define YUV_TO_RGB1_CCIR_BT709(cb1, cr1)\
+{\
+ cb = (cb1) - 128;\
+ cr = (cr1) - 128;\
+ r_add = FIX(1.5747*255.0/224.0) * cr + ONE_HALF;\
+ g_add = - FIX(0.1873*255.0/224.0) * cb - FIX(0.4682*255.0/224.0) * cr + \
+ ONE_HALF;\
+ b_add = FIX(1.8556*255.0/224.0) * cb + ONE_HALF;\
+}
+
#define YUV_TO_RGB2_CCIR(r, g, b, y1)\
{\
y = ((y1) - 16) * FIX(255.0/219.0);\
diff --git a/libavutil/internal.h b/libavutil/internal.h
index c4bcf37ab8..44f8c1ee47 100644
--- a/libavutil/internal.h
+++ b/libavutil/internal.h
@@ -314,6 +314,22 @@ static av_always_inline float ff_exp10f(float x)
}
/**
+ * Compute x^y for floating point x, y. Note: this function is faster than the
+ * libm variant due to mainly 2 reasons:
+ * 1. It does not handle any edge cases. In particular, this is only guaranteed
+ * to work correctly for x > 0.
+ * 2. It is not as accurate as a standard nearly "correctly rounded" libm variant.
+ * @param x base
+ * @param y exponent
+ * @return x^y
+ */
+static av_always_inline float ff_fast_powf(float x, float y)
+{
+ return expf(logf(x) * y);
+}
+
+
+/**
* A wrapper for open() setting O_CLOEXEC.
*/
av_warn_unused_result
diff --git a/libavutil/mips/float_dsp_mips.c b/libavutil/mips/float_dsp_mips.c
index b3a812ceeb..0943d6f343 100644
--- a/libavutil/mips/float_dsp_mips.c
+++ b/libavutil/mips/float_dsp_mips.c
@@ -56,6 +56,7 @@
#include "libavutil/mips/asmdefs.h"
#if HAVE_INLINE_ASM && HAVE_MIPSFPU
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
static void vector_fmul_mips(float *dst, const float *src0, const float *src1,
int len)
{
@@ -339,14 +340,17 @@ static void vector_fmul_reverse_mips(float *dst, const float *src0, const float
);
}
}
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_INLINE_ASM && HAVE_MIPSFPU */
void ff_float_dsp_init_mips(AVFloatDSPContext *fdsp) {
#if HAVE_INLINE_ASM && HAVE_MIPSFPU
+#if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
fdsp->vector_fmul = vector_fmul_mips;
fdsp->vector_fmul_scalar = vector_fmul_scalar_mips;
fdsp->vector_fmul_window = vector_fmul_window_mips;
fdsp->butterflies_float = butterflies_float_mips;
fdsp->vector_fmul_reverse = vector_fmul_reverse_mips;
+#endif /* !HAVE_MIPS32R6 && !HAVE_MIPS64R6 */
#endif /* HAVE_INLINE_ASM && HAVE_MIPSFPU */
}
diff --git a/libavutil/opt.h b/libavutil/opt.h
index 753434d628..f6ab2839ed 100644
--- a/libavutil/opt.h
+++ b/libavutil/opt.h
@@ -58,7 +58,7 @@
* The following example illustrates an AVOptions-enabled struct:
* @code
* typedef struct test_struct {
- * AVClass *class;
+ * const AVClass *class;
* int int_opt;
* char *str_opt;
* uint8_t *bin_opt;
@@ -96,7 +96,7 @@
* @code
* test_struct *alloc_test_struct(void)
* {
- * test_struct *ret = av_malloc(sizeof(*ret));
+ * test_struct *ret = av_mallocz(sizeof(*ret));
* ret->class = &test_class;
* av_opt_set_defaults(ret);
* return ret;
diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
index 58833cfb8e..dd7de7ee25 100644
--- a/libavutil/pixdesc.c
+++ b/libavutil/pixdesc.c
@@ -2275,6 +2275,7 @@ enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt)
#define FF_COLOR_GRAY 1 /**< gray color space */
#define FF_COLOR_YUV 2 /**< YUV color space. 16 <= Y <= 235, 16 <= U, V <= 240 */
#define FF_COLOR_YUV_JPEG 3 /**< YUV color space. 0 <= Y <= 255, 0 <= U, V <= 255 */
+#define FF_COLOR_XYZ 4
#define pixdesc_has_alpha(pixdesc) \
((pixdesc)->nb_components == 2 || (pixdesc)->nb_components == 4 || (pixdesc)->flags & AV_PIX_FMT_FLAG_PAL)
@@ -2290,6 +2291,9 @@ static int get_color_type(const AVPixFmtDescriptor *desc) {
if(desc->name && !strncmp(desc->name, "yuvj", 4))
return FF_COLOR_YUV_JPEG;
+ if(desc->name && !strncmp(desc->name, "xyz", 3))
+ return FF_COLOR_XYZ;
+
if(desc->flags & AV_PIX_FMT_FLAG_RGB)
return FF_COLOR_RGB;
diff --git a/libavutil/random_seed.c b/libavutil/random_seed.c
index 205a636f92..0821550bc8 100644
--- a/libavutil/random_seed.c
+++ b/libavutil/random_seed.c
@@ -97,8 +97,13 @@ static uint32_t get_generic_seed(void)
last_t = t;
}
- if(TEST)
+ if(TEST) {
buffer[0] = buffer[1] = 0;
+ } else {
+#ifdef AV_READ_TIME
+ buffer[111] += AV_READ_TIME();
+#endif
+ }
av_sha_init(sha, 160);
av_sha_update(sha, (const uint8_t *)buffer, sizeof(buffer));
diff --git a/libpostproc/postprocess.c b/libpostproc/postprocess.c
index 3b86f93980..1dc719cf93 100644
--- a/libpostproc/postprocess.c
+++ b/libpostproc/postprocess.c
@@ -973,7 +973,7 @@ void pp_postprocess(const uint8_t * src[3], const int srcStride[3],
int i;
const int count= FFMAX(mbHeight * absQPStride, mbWidth);
for(i=0; i<(count>>2); i++){
- ((uint32_t*)c->stdQPTable)[i] = (((const uint32_t*)QP_store)[i]>>1) & 0x7F7F7F7F;
+ AV_WN32(c->stdQPTable + (i<<2), AV_RN32(QP_store + (i<<2)) >> 1 & 0x7F7F7F7F);
}
for(i<<=2; i<count; i++){
c->stdQPTable[i] = QP_store[i]>>1;
diff --git a/libswresample/rematrix.c b/libswresample/rematrix.c
index 932088ffb7..ddba0433e8 100644
--- a/libswresample/rematrix.c
+++ b/libswresample/rematrix.c
@@ -32,6 +32,9 @@
#define TEMPLATE_REMATRIX_S16
#include "rematrix_template.c"
+#define TEMPLATE_CLIP
+#include "rematrix_template.c"
+#undef TEMPLATE_CLIP
#undef TEMPLATE_REMATRIX_S16
#define TEMPLATE_REMATRIX_S32
@@ -367,17 +370,33 @@ av_cold int swri_rematrix_init(SwrContext *s){
return r;
}
if (s->midbuf.fmt == AV_SAMPLE_FMT_S16P){
+ int maxsum = 0;
s->native_matrix = av_calloc(nb_in * nb_out, sizeof(int));
s->native_one = av_mallocz(sizeof(int));
if (!s->native_matrix || !s->native_one)
return AVERROR(ENOMEM);
- for (i = 0; i < nb_out; i++)
- for (j = 0; j < nb_in; j++)
- ((int*)s->native_matrix)[i * nb_in + j] = lrintf(s->matrix[i][j] * 32768);
+ for (i = 0; i < nb_out; i++) {
+ double rem = 0;
+ int sum = 0;
+
+ for (j = 0; j < nb_in; j++) {
+ double target = s->matrix[i][j] * 32768 + rem;
+ ((int*)s->native_matrix)[i * nb_in + j] = lrintf(target);
+ rem += target - ((int*)s->native_matrix)[i * nb_in + j];
+ sum += FFABS(((int*)s->native_matrix)[i * nb_in + j]);
+ }
+ maxsum = FFMAX(maxsum, sum);
+ }
*((int*)s->native_one) = 32768;
- s->mix_1_1_f = (mix_1_1_func_type*)copy_s16;
- s->mix_2_1_f = (mix_2_1_func_type*)sum2_s16;
- s->mix_any_f = (mix_any_func_type*)get_mix_any_func_s16(s);
+ if (maxsum <= 32768) {
+ s->mix_1_1_f = (mix_1_1_func_type*)copy_s16;
+ s->mix_2_1_f = (mix_2_1_func_type*)sum2_s16;
+ s->mix_any_f = (mix_any_func_type*)get_mix_any_func_s16(s);
+ } else {
+ s->mix_1_1_f = (mix_1_1_func_type*)copy_clip_s16;
+ s->mix_2_1_f = (mix_2_1_func_type*)sum2_clip_s16;
+ s->mix_any_f = (mix_any_func_type*)get_mix_any_func_clip_s16(s);
+ }
}else if(s->midbuf.fmt == AV_SAMPLE_FMT_FLTP){
s->native_matrix = av_calloc(nb_in * nb_out, sizeof(float));
s->native_one = av_mallocz(sizeof(float));
diff --git a/libswresample/rematrix_template.c b/libswresample/rematrix_template.c
index 95a3b9a8c0..add65e3155 100644
--- a/libswresample/rematrix_template.c
+++ b/libswresample/rematrix_template.c
@@ -31,11 +31,16 @@
# define INTER double
# define RENAME(x) x ## _double
#elif defined(TEMPLATE_REMATRIX_S16)
-# define R(x) (((x) + 16384)>>15)
# define SAMPLE int16_t
# define COEFF int
# define INTER int
+# ifdef TEMPLATE_CLIP
+# define R(x) av_clip_int16(((x) + 16384)>>15)
+# define RENAME(x) x ## _clip_s16
+# else
+# define R(x) (((x) + 16384)>>15)
# define RENAME(x) x ## _s16
+# endif
#elif defined(TEMPLATE_REMATRIX_S32)
# define R(x) (((x) + 16384)>>15)
# define SAMPLE int32_t
diff --git a/libswresample/resample.c b/libswresample/resample.c
index 7888e570a3..d410432658 100644
--- a/libswresample/resample.c
+++ b/libswresample/resample.c
@@ -203,7 +203,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap
case AV_SAMPLE_FMT_S16P:
for(i=0;i<tap_count;i++)
((int16_t*)filter)[ph * alloc + i] = av_clip_int16(lrintf(tab[i] * scale / norm));
- if (tap_count % 2 == 0) {
+ if (tap_count % 2 == 0 || tap_count == 1) {
for (i = 0; i < tap_count; i++)
((int16_t*)filter)[(phase_count-ph) * alloc + tap_count-1-i] = ((int16_t*)filter)[ph * alloc + i];
}
@@ -216,7 +216,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap
case AV_SAMPLE_FMT_S32P:
for(i=0;i<tap_count;i++)
((int32_t*)filter)[ph * alloc + i] = av_clipl_int32(llrint(tab[i] * scale / norm));
- if (tap_count % 2 == 0) {
+ if (tap_count % 2 == 0 || tap_count == 1) {
for (i = 0; i < tap_count; i++)
((int32_t*)filter)[(phase_count-ph) * alloc + tap_count-1-i] = ((int32_t*)filter)[ph * alloc + i];
}
@@ -229,7 +229,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap
case AV_SAMPLE_FMT_FLTP:
for(i=0;i<tap_count;i++)
((float*)filter)[ph * alloc + i] = tab[i] * scale / norm;
- if (tap_count % 2 == 0) {
+ if (tap_count % 2 == 0 || tap_count == 1) {
for (i = 0; i < tap_count; i++)
((float*)filter)[(phase_count-ph) * alloc + tap_count-1-i] = ((float*)filter)[ph * alloc + i];
}
@@ -241,7 +241,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap
case AV_SAMPLE_FMT_DBLP:
for(i=0;i<tap_count;i++)
((double*)filter)[ph * alloc + i] = tab[i] * scale / norm;
- if (tap_count % 2 == 0) {
+ if (tap_count % 2 == 0 || tap_count == 1) {
for (i = 0; i < tap_count; i++)
((double*)filter)[(phase_count-ph) * alloc + tap_count-1-i] = ((double*)filter)[ph * alloc + i];
}
diff --git a/libswscale/input.c b/libswscale/input.c
index 1df84a9865..ac76aee7f7 100644
--- a/libswscale/input.c
+++ b/libswscale/input.c
@@ -885,6 +885,19 @@ static av_always_inline void planar_rgb16_to_y(uint8_t *_dst, const uint8_t *_sr
}
}
+static av_always_inline void planar_rgb16_to_a(uint8_t *_dst, const uint8_t *_src[4],
+ int width, int bpc, int is_be, int32_t *rgb2yuv)
+{
+ int i;
+ const uint16_t **src = (const uint16_t **)_src;
+ uint16_t *dst = (uint16_t *)_dst;
+ int shift = bpc < 16 ? bpc : 14;
+
+ for (i = 0; i < width; i++) {
+ dst[i] = rdpx(src[3] + i) << (14 - shift);
+ }
+}
+
static av_always_inline void planar_rgb16_to_uv(uint8_t *_dstU, uint8_t *_dstV,
const uint8_t *_src[4], int width,
int bpc, int is_be, int32_t *rgb2yuv)
@@ -913,6 +926,11 @@ static void planar_rgb##nbits##endian_name##_to_y(uint8_t *dst, const uint8_t *s
{ \
planar_rgb16_to_y(dst, src, w, nbits, endian, rgb2yuv); \
} \
+static void planar_rgb##nbits##endian_name##_to_a(uint8_t *dst, const uint8_t *src[4], \
+ int w, int32_t *rgb2yuv) \
+{ \
+ planar_rgb16_to_a(dst, src, w, nbits, endian, rgb2yuv); \
+} \
static void planar_rgb##nbits##endian_name##_to_uv(uint8_t *dstU, uint8_t *dstV, \
const uint8_t *src[4], int w, int32_t *rgb2yuv) \
{ \
@@ -1248,6 +1266,7 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
c->readLumPlanar = planar_rgb14le_to_y;
break;
case AV_PIX_FMT_GBRAP16LE:
+ c->readAlpPlanar = planar_rgb16le_to_a;
case AV_PIX_FMT_GBRP16LE:
c->readLumPlanar = planar_rgb16le_to_y;
break;
@@ -1264,6 +1283,7 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
c->readLumPlanar = planar_rgb14be_to_y;
break;
case AV_PIX_FMT_GBRAP16BE:
+ c->readAlpPlanar = planar_rgb16be_to_a;
case AV_PIX_FMT_GBRP16BE:
c->readLumPlanar = planar_rgb16be_to_y;
break;
diff --git a/libswscale/utils.c b/libswscale/utils.c
index ef4241ac37..0beb7538cb 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -1354,6 +1354,7 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter,
srcFormat != AV_PIX_FMT_GBRP12BE && srcFormat != AV_PIX_FMT_GBRP12LE &&
srcFormat != AV_PIX_FMT_GBRP14BE && srcFormat != AV_PIX_FMT_GBRP14LE &&
srcFormat != AV_PIX_FMT_GBRP16BE && srcFormat != AV_PIX_FMT_GBRP16LE &&
+ srcFormat != AV_PIX_FMT_GBRAP16BE && srcFormat != AV_PIX_FMT_GBRAP16LE &&
((dstW >> c->chrDstHSubSample) <= (srcW >> 1) ||
(flags & SWS_FAST_BILINEAR)))
c->chrSrcHSubSample = 1;
diff --git a/libswscale/x86/output.asm b/libswscale/x86/output.asm
index 9ea4af9535..133817cb71 100644
--- a/libswscale/x86/output.asm
+++ b/libswscale/x86/output.asm
@@ -54,76 +54,8 @@ SECTION .text
; int32_t if $output_size is 16. $filter is 12-bits. $filterSize is a multiple
; of 2. $offset is either 0 or 3. $dither holds 8 values.
;-----------------------------------------------------------------------------
-
-%macro yuv2planeX_fn 3
-
-%if ARCH_X86_32
-%define cntr_reg fltsizeq
-%define movsx mov
-%else
-%define cntr_reg r7
-%define movsx movsxd
-%endif
-
-cglobal yuv2planeX_%1, %3, 8, %2, filter, fltsize, src, dst, w, dither, offset
-%if %1 == 8 || %1 == 9 || %1 == 10
- pxor m6, m6
-%endif ; %1 == 8/9/10
-
-%if %1 == 8
-%if ARCH_X86_32
-%assign pad 0x2c - (stack_offset & 15)
- SUB rsp, pad
-%define m_dith m7
-%else ; x86-64
-%define m_dith m9
-%endif ; x86-32
-
- ; create registers holding dither
- movq m_dith, [ditherq] ; dither
- test offsetd, offsetd
- jz .no_rot
-%if mmsize == 16
- punpcklqdq m_dith, m_dith
-%endif ; mmsize == 16
- PALIGNR m_dith, m_dith, 3, m0
-.no_rot:
-%if mmsize == 16
- punpcklbw m_dith, m6
-%if ARCH_X86_64
- punpcklwd m8, m_dith, m6
- pslld m8, 12
-%else ; x86-32
- punpcklwd m5, m_dith, m6
- pslld m5, 12
-%endif ; x86-32/64
- punpckhwd m_dith, m6
- pslld m_dith, 12
-%if ARCH_X86_32
- mova [rsp+ 0], m5
- mova [rsp+16], m_dith
-%endif
-%else ; mmsize == 8
- punpcklbw m5, m_dith, m6
- punpckhbw m_dith, m6
- punpcklwd m4, m5, m6
- punpckhwd m5, m6
- punpcklwd m3, m_dith, m6
- punpckhwd m_dith, m6
- pslld m4, 12
- pslld m5, 12
- pslld m3, 12
- pslld m_dith, 12
- mova [rsp+ 0], m4
- mova [rsp+ 8], m5
- mova [rsp+16], m3
- mova [rsp+24], m_dith
-%endif ; mmsize == 8/16
-%endif ; %1 == 8
-
- xor r5, r5
-
-.pixelloop:
+%macro yuv2planeX_mainloop 2
+.pixelloop_%2:
%assign %%i 0
; the rep here is for the 8bit output mmx case, where dither covers
; 8 pixels but we can only handle 2 pixels per register, and thus 4
@@ -150,7 +82,7 @@ cglobal yuv2planeX_%1, %3, 8, %2, filter, fltsize, src, dst, w, dither, offset
mova m2, m1
%endif ; %1 == 8/9/10/16
movsx cntr_reg, fltsizem
-.filterloop_ %+ %%i:
+.filterloop_%2_ %+ %%i:
; input pixels
mov r6, [srcq+gprsize*cntr_reg-2*gprsize]
%if %1 == 16
@@ -197,7 +129,7 @@ cglobal yuv2planeX_%1, %3, 8, %2, filter, fltsize, src, dst, w, dither, offset
%endif ; %1 == 8/9/10/16
sub cntr_reg, 2
- jg .filterloop_ %+ %%i
+ jg .filterloop_%2_ %+ %%i
%if %1 == 16
psrad m2, 31 - %1
@@ -224,7 +156,7 @@ cglobal yuv2planeX_%1, %3, 8, %2, filter, fltsize, src, dst, w, dither, offset
%endif ; mmxext/sse2/sse4/avx
pminsw m2, [yuv2yuvX_%1_upper]
%endif ; %1 == 9/10/16
- mova [dstq+r5*2], m2
+ mov%2 [dstq+r5*2], m2
%endif ; %1 == 8/9/10/16
add r5, mmsize/2
@@ -232,7 +164,87 @@ cglobal yuv2planeX_%1, %3, 8, %2, filter, fltsize, src, dst, w, dither, offset
%assign %%i %%i+2
%endrep
- jg .pixelloop
+ jg .pixelloop_%2
+%endmacro
+
+%macro yuv2planeX_fn 3
+
+%if ARCH_X86_32
+%define cntr_reg fltsizeq
+%define movsx mov
+%else
+%define cntr_reg r7
+%define movsx movsxd
+%endif
+
+cglobal yuv2planeX_%1, %3, 8, %2, filter, fltsize, src, dst, w, dither, offset
+%if %1 == 8 || %1 == 9 || %1 == 10
+ pxor m6, m6
+%endif ; %1 == 8/9/10
+
+%if %1 == 8
+%if ARCH_X86_32
+%assign pad 0x2c - (stack_offset & 15)
+ SUB rsp, pad
+%define m_dith m7
+%else ; x86-64
+%define m_dith m9
+%endif ; x86-32
+
+ ; create registers holding dither
+ movq m_dith, [ditherq] ; dither
+ test offsetd, offsetd
+ jz .no_rot
+%if mmsize == 16
+ punpcklqdq m_dith, m_dith
+%endif ; mmsize == 16
+ PALIGNR m_dith, m_dith, 3, m0
+.no_rot:
+%if mmsize == 16
+ punpcklbw m_dith, m6
+%if ARCH_X86_64
+ punpcklwd m8, m_dith, m6
+ pslld m8, 12
+%else ; x86-32
+ punpcklwd m5, m_dith, m6
+ pslld m5, 12
+%endif ; x86-32/64
+ punpckhwd m_dith, m6
+ pslld m_dith, 12
+%if ARCH_X86_32
+ mova [rsp+ 0], m5
+ mova [rsp+16], m_dith
+%endif
+%else ; mmsize == 8
+ punpcklbw m5, m_dith, m6
+ punpckhbw m_dith, m6
+ punpcklwd m4, m5, m6
+ punpckhwd m5, m6
+ punpcklwd m3, m_dith, m6
+ punpckhwd m_dith, m6
+ pslld m4, 12
+ pslld m5, 12
+ pslld m3, 12
+ pslld m_dith, 12
+ mova [rsp+ 0], m4
+ mova [rsp+ 8], m5
+ mova [rsp+16], m3
+ mova [rsp+24], m_dith
+%endif ; mmsize == 8/16
+%endif ; %1 == 8
+
+ xor r5, r5
+
+%if mmsize == 8 || %1 == 8
+ yuv2planeX_mainloop %1, a
+%else ; mmsize == 16
+ test dstq, 15
+ jnz .unaligned
+ yuv2planeX_mainloop %1, a
+ REP_RET
+.unaligned:
+ yuv2planeX_mainloop %1, u
+%endif ; mmsize == 8/16
%if %1 == 8
%if ARCH_X86_32
diff --git a/tests/api/api-codec-param-test.c b/tests/api/api-codec-param-test.c
index fa51964bbd..377a5e9c79 100644
--- a/tests/api/api-codec-param-test.c
+++ b/tests/api/api-codec-param-test.c
@@ -50,7 +50,7 @@ static int try_decode_video_frame(AVCodecContext *codec_ctx, AVPacket *pkt, int
goto end;
}
- if (!decode && codec_ctx->codec->caps_internal & FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM) {
+ if (!decode && avpriv_codec_get_cap_skip_frame_fill_param(codec_ctx->codec)) {
codec_ctx->skip_frame = AVDISCARD_ALL;
}
diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c
index 1e73e34c76..797ecd5d19 100644
--- a/tests/checkasm/checkasm.c
+++ b/tests/checkasm/checkasm.c
@@ -92,7 +92,7 @@ static const struct {
#if CONFIG_JPEG2000_DECODER
{ "jpeg2000dsp", checkasm_check_jpeg2000dsp },
#endif
- #if CONFIG_PIXBLOCKDSP
+ #if CONFIG_PIXBLOCKDSP && !(ARCH_PPC64 && HAVE_BIGENDIAN)
{ "pixblockdsp", checkasm_check_pixblockdsp },
#endif
#if CONFIG_V210_ENCODER
diff --git a/tests/fate/aac.mak b/tests/fate/aac.mak
index 8d1e30368b..324b05d4f5 100644
--- a/tests/fate/aac.mak
+++ b/tests/fate/aac.mak
@@ -175,7 +175,7 @@ fate-aac-pns-encode: REF = $(SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.w
fate-aac-pns-encode: CMP_SHIFT = -4096
fate-aac-pns-encode: CMP_TARGET = 616
fate-aac-pns-encode: SIZE_TOLERANCE = 3560
-fate-aac-pns-encode: FUZZ = 72
+fate-aac-pns-encode: FUZZ = 74
FATE_AAC_ENCODE += fate-aac-tns-encode
fate-aac-tns-encode: CMD = enc_dec_pcm adts wav s16le $(TARGET_SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav -c:a aac -aac_tns 1 -aac_is 0 -aac_pns 0 -aac_ms 0 -b:a 128k -cutoff 22050 -fflags +bitexact -flags +bitexact
diff --git a/tests/ref/fate/filter-pixfmts-fieldmatch b/tests/ref/fate/filter-pixfmts-fieldmatch
index 44622d060c..99946c8d1d 100644
--- a/tests/ref/fate/filter-pixfmts-fieldmatch
+++ b/tests/ref/fate/filter-pixfmts-fieldmatch
@@ -1,5 +1,5 @@
yuv410p a6c9b4065e8253d8120772f69be0bf04
yuv411p b913e634ad37ce046240252bed8681fb
-yuv420p d448d95326eadeeb12ea0cc348067958
+yuv420p a9286560141eb14595e427dbe5829b00
yuv422p 11ad22ce00c5e8a30d0472f29fb15434
yuv444p 9350a3f23cd7d95ec441a49f63f55953
diff --git a/tests/ref/fate/mkv b/tests/ref/fate/mkv
index aea378a881..765798cbfe 100644
--- a/tests/ref/fate/mkv
+++ b/tests/ref/fate/mkv
@@ -25,9 +25,9 @@
1, 264, 264, 21, 609, 0xc0dc255c
1, 285, 285, 21, 619, 0x9ac52dd1
0, 292, 292, 41, 16751, 0xf293ab46, F=0x0
-0, 292, 417, 41, 22029, 0x3696462b, F=0x0
1, 306, 306, 21, 574, 0xf6410d4d
1, 327, 327, 22, 565, 0xfd561191
+0, 334, 417, 41, 22029, 0x3696462b, F=0x0
1, 350, 350, 21, 713, 0x48425147
1, 371, 371, 21, 537, 0x09bbf515
0, 375, 375, 41, 5044, 0xa0344ae6, F=0x0