diff --git a/Changelog b/Changelog index 89d1893369..9d406bf10b 100644 --- a/Changelog +++ b/Changelog @@ -1,8 +1,11 @@ Entries are sorted chronologically from oldest to youngest within each release, releases are sorted from youngest to oldest. -version next: +version 0.9: +- Indeo 4 decoder +- SMJPEG demuxer +- y41p Brooktree Uncompressed 4:1:1 12-bit encoder and decoder - openal input device added - boxblur filter added - BWF muxer @@ -134,7 +137,7 @@ easier to use. The changes are: - new option: -report - Dxtory capture format decoder - cellauto source - +- v410 Quicktime Uncompressed 4:4:4 10-bit encoder and decoder version 0.8: diff --git a/Doxyfile b/Doxyfile index 91907aeff9..99fb63093e 100644 --- a/Doxyfile +++ b/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 = +PROJECT_NUMBER = 0.9.4 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. diff --git a/MAINTAINERS b/MAINTAINERS index a254985f98..f0110cfa32 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -14,7 +14,6 @@ and related discussions. Project Leader ============== -Michael Niedermayer final design decisions @@ -218,6 +217,7 @@ Codecs: tta.c Alex Beregszaszi, Jaikrishnan Menon txd.c Ivo van Poorten ulti* Kostya Shishkov + v410*.c Derek Buitenhuis vb.c Kostya Shishkov vble.c Derek Buitenhuis vc1* Kostya Shishkov @@ -388,6 +388,7 @@ Releases 0.6 *Deprecated/Unmaintained* 0.7 Michael Niedermayer 0.8 Michael Niedermayer +0.9 Michael Niedermayer diff --git a/Makefile b/Makefile index 24fc455f46..c0af5c2c74 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ include $(SRC_PATH)/common.mak FF_EXTRALIBS := $(FFEXTRALIBS) FF_DEP_LIBS := $(DEP_LIBS) -all: $(filter-out avconv, $(PROGS)) +all: $(PROGS) $(PROGS): %$(EXESUF): %$(PROGSSUF)_g$(EXESUF) $(CP) $< $@$(PROGSSUF) diff --git a/RELEASE b/RELEASE index 32b6aeee56..a602fc9e28 100644 --- a/RELEASE +++ b/RELEASE @@ -1 +1 @@ -0.8.7.git +0.9.4 diff --git a/VERSION b/VERSION new file mode 100644 index 0000000000..a602fc9e28 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.9.4 diff --git a/avconv.c b/avconv.c index 4c99a6fdd7..10e99ff67a 100644 --- a/avconv.c +++ b/avconv.c @@ -4361,7 +4361,7 @@ int main(int argc, char **argv) av_register_all(); avformat_network_init(); - show_banner(); + show_banner(argc, argv, options); /* parse options */ parse_options(&o, argc, argv, options, opt_output_file); diff --git a/cmdutils.c b/cmdutils.c index 65628fcc86..507df2cc5a 100644 --- a/cmdutils.c +++ b/cmdutils.c @@ -53,7 +53,7 @@ struct SwsContext *sws_opts; AVDictionary *format_opts, *codec_opts; -static const int this_year = 2011; +static const int this_year = 2014; static FILE *report_file; @@ -582,8 +582,12 @@ static void print_all_libs_info(int flags, int level) PRINT_LIB_INFO(postproc, POSTPROC, flags, level); } -void show_banner(void) +void show_banner(int argc, char **argv, const OptionDef *options) { + int idx = locate_option(argc, argv, options, "version"); + if (idx) + return; + av_log(NULL, AV_LOG_INFO, "%s version " FFMPEG_VERSION ", Copyright (c) %d-%d the FFmpeg developers\n", program_name, program_birth_year, this_year); av_log(NULL, AV_LOG_INFO, " built on %s %s with %s %s\n", diff --git a/cmdutils.h b/cmdutils.h index 15f983643a..3aad0174d2 100644 --- a/cmdutils.h +++ b/cmdutils.h @@ -245,7 +245,7 @@ void print_error(const char *filename, int err); * current version of the repository and of the libav* libraries used by * the program. */ -void show_banner(void); +void show_banner(int argc, char **argv, const OptionDef *options); /** * Print the version of the program to stdout. The version message diff --git a/configure b/configure index cc7ba534df..7070245d74 100755 --- a/configure +++ b/configure @@ -81,7 +81,7 @@ Configuration options: and binaries will be unredistributable [no] --disable-doc do not build documentation --disable-ffmpeg disable ffmpeg build - --disable-avconv disable avconv build + --enable-avconv enable avconv build --disable-ffplay disable ffplay build --disable-ffprobe disable ffprobe build --disable-ffserver disable ffserver build @@ -116,6 +116,9 @@ Configuration options: --disable-vda disable VDA code --enable-runtime-cpudetect detect cpu capabilities at runtime (bigger binary) --enable-hardcoded-tables use hardcoded tables instead of runtime generation + --disable-safe-bitstream-reader + disable buffer boundary checking in bitreaders + (faster, but may crash) --enable-memalign-hack emulate memalign, interferes with memory debuggers --disable-everything disable all components listed below --disable-encoder=NAME disable encoder NAME @@ -1055,6 +1058,7 @@ CONFIG_LIST=" rdft rtpdec runtime_cpudetect + safe_bitstream_reader shared sinewin small @@ -1137,6 +1141,7 @@ HAVE_LIST=" altivec_h arpa_inet_h asm_mod_y + asm_types_h attribute_may_alias attribute_packed bswap @@ -1152,6 +1157,7 @@ HAVE_LIST=" dlfcn_h dlopen dos_paths + dxva_h ebp_available ebx_available exp2 @@ -1799,7 +1805,6 @@ enable debug enable doc enable fastdiv enable ffmpeg -enable avconv enable ffplay enable ffprobe enable ffserver @@ -1807,6 +1812,7 @@ enable network enable optimizations enable postproc enable protocols +enable safe_bitstream_reader enable static enable stripping enable swresample @@ -2294,7 +2300,7 @@ fi # Deal with common $arch aliases case "$arch" in - arm*) + arm*|iPad*) arch="arm" ;; mips|mipsel|IP*) @@ -2986,6 +2992,7 @@ check_func_headers windows.h MapViewOfFile check_func_headers windows.h VirtualAlloc check_header dlfcn.h +check_header dxva.h check_header dxva2api.h -D_WIN32_WINNT=0x0600 check_header libcrystalhd/libcrystalhd_if.h check_header malloc.h @@ -2997,6 +3004,7 @@ check_header termios.h check_header vdpau/vdpau.h check_header vdpau/vdpau_x11.h check_header X11/extensions/XvMClib.h +check_header asm/types.h disabled zlib || check_lib zlib.h zlibVersion -lz || disable zlib disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib @@ -3285,11 +3293,13 @@ elif enabled gcc; then check_cflags -fno-tree-vectorize check_cflags -Werror=implicit-function-declaration check_cflags -Werror=missing-prototypes + check_cflags -Werror=return-type elif enabled llvm_gcc; then check_cflags -mllvm -stack-alignment=16 elif enabled clang; then check_cflags -mllvm -stack-alignment=16 check_cflags -Qunused-arguments + check_cflags -Werror=return-type elif enabled armcc; then # 2523: use of inline assembler is deprecated add_cflags -W${armcc_opt},--diag_suppress=2523 @@ -3394,6 +3404,7 @@ echo "postprocessing support ${postproc-no}" echo "new filter support ${avfilter-no}" echo "network support ${network-no}" echo "threading support ${thread_type-no}" +echo "safe bitstream reader ${safe_bitstream_reader-no}" echo "SDL support ${sdl-no}" echo "Sun medialib support ${mlib-no}" echo "libdxva2 enabled ${dxva2-no}" diff --git a/doc/APIchanges b/doc/APIchanges index 7e8365e4eb..a2199bc249 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -31,6 +31,10 @@ API changes, most recent first: 2011-10-20 - b35e9e1 - lavu 51.22.0 Add av_strtok() to avstring.h. +2011-xx-xx - xxxxxxx - lavf 53.17.0 + Add avformat_open_input(). + Deprecate av_close_input_file() and av_close_input_stream(). + 2011-xx-xx - xxxxxxx - lavc 53.25.0 Add nb_samples and extended_data fields to AVFrame. Deprecate AVCODEC_MAX_AUDIO_FRAME_SIZE. @@ -44,14 +48,14 @@ API changes, most recent first: Change AVCodecContext.error[4] to [8] at next major bump. Add AV_NUM_DATA_POINTERS to simplify the bump transition. -2011-11-23 - bbb46f3 - lavu 51.18.0 +2011-11-23 - 8e576d5 / bbb46f3 - lavu 51.27.0 / 51.18.0 Add av_samples_get_buffer_size(), av_samples_fill_arrays(), and av_samples_alloc(), to samplefmt.h. -2011-11-23 - 8889cc4 - lavu 51.17.0 +2011-11-23 - 8e576d5 / 8889cc4 - lavu 51.27.0 / 51.17.0 Add planar sample formats and av_sample_fmt_is_planar() to samplefmt.h. -2011-11-19 - f3a29b7 - lavc 53.21.0 +2011-11-19 - dbb38bc / f3a29b7 - lavc 53.36.0 / 53.21.0 Move some AVCodecContext fields to a new private struct, AVCodecInternal, which is accessed from a new field, AVCodecContext.internal. - fields moved: @@ -59,55 +63,55 @@ API changes, most recent first: AVCodecContext.internal_buffer_count --> AVCodecInternal.buffer_count AVCodecContext.is_copy --> AVCodecInternal.is_copy -2011-11-16 - 6270671 - lavu 51.16.0 +2011-11-16 - 8709ba9 / 6270671 - lavu 51.26.0 / 51.16.0 Add av_timegm() -2011-11-13 - lavf 53.15.0 +2011-11-13 - lavf 53.21.0 / 53.15.0 New interrupt callback API, allowing per-AVFormatContext/AVIOContext interrupt callbacks. - 6aa0b98 Add AVIOInterruptCB struct and the interrupt_callback field to + 5f268ca / 6aa0b98 Add AVIOInterruptCB struct and the interrupt_callback field to AVFormatContext. - 1dee0ac Add avio_open2() with additional parameters. Those are + 5f268ca / 1dee0ac Add avio_open2() with additional parameters. Those are an interrupt callback and an options AVDictionary. This will allow passing AVOptions to protocols after lavf 54.0. -2011-11-06 - ba04ecf - lavu 51.14.0 +2011-11-06 - 13b7781 / ba04ecf - lavu 51.24.0 / 51.14.0 Add av_strcasecmp() and av_strncasecmp() to avstring.h. -2011-11-06 - 07b172f - lavu 51.13.0 +2011-11-06 - 13b7781 / 07b172f - lavu 51.24.0 / 51.13.0 Add av_toupper()/av_tolower() -2011-11-05 - b6d08f4 - lavf 53.13.0 +2011-11-05 - d8cab5c / b6d08f4 - lavf 53.19.0 / 53.13.0 Add avformat_network_init()/avformat_network_uninit() -2011-10-27 - 512557b - lavc 53.15.0 +2011-10-27 - 6faf0a2 / 512557b - lavc 53.24.0 / 53.15.0 Remove avcodec_parse_frame. Deprecate AVCodecContext.parse_only and CODEC_CAP_PARSE_ONLY. -2011-10-19 - 569129a - lavf 53.10.0 +2011-10-19 - d049257 / 569129a - lavf 53.17.0 / 53.10.0 Add avformat_new_stream(). Deprecate av_new_stream(). -2011-10-13 - b631fba - lavf 53.9.0 +2011-10-13 - 91eb1b1 / b631fba - lavf 53.16.0 / 53.9.0 Add AVFMT_NO_BYTE_SEEK AVInputFormat flag. -2011-10-12 - lavu 51.12.0 +2011-10-12 - lavu 51.21.0 / 51.12.0 AVOptions API rewrite. - - 145f741 FF_OPT_TYPE* renamed to AV_OPT_TYPE_* + - f884ef0 / 145f741 FF_OPT_TYPE* renamed to AV_OPT_TYPE_* - new setting/getting functions with slightly different semantics: - dac66da av_set_string3 -> av_opt_set + f884ef0 / dac66da av_set_string3 -> av_opt_set av_set_double -> av_opt_set_double av_set_q -> av_opt_set_q av_set_int -> av_opt_set_int - 41d9d51 av_get_string -> av_opt_get + f884ef0 / 41d9d51 av_get_string -> av_opt_get av_get_double -> av_opt_get_double av_get_q -> av_opt_get_q av_get_int -> av_opt_get_int - - 8c5dcaa trivial rename av_next_option -> av_opt_next - - 641c7af new functions - av_opt_child_next, av_opt_child_class_next + - f884ef0 / 8c5dcaa trivial rename av_next_option -> av_opt_next + - f884ef0 / 641c7af new functions - av_opt_child_next, av_opt_child_class_next and av_opt_find2() 2011-09-22 - a70e787 - lavu 51.17.0 @@ -153,27 +157,27 @@ API changes, most recent first: 2011-08-20 - 69e2c1a - lavu 51.13.0 Add av_get_media_type_string(). -2011-09-03 - fb4ca26 - lavc 53.13.0 +2011-09-03 - 1889c67 / fb4ca26 - lavc 53.13.0 lavf 53.11.0 lsws 2.1.0 Add {avcodec,avformat,sws}_get_class(). -2011-08-03 - c11fb82 - lavu 51.15.0 +2011-08-03 - 1889c67 / c11fb82 - lavu 51.15.0 Add AV_OPT_SEARCH_FAKE_OBJ flag for av_opt_find() function. 2011-08-14 - 323b930 - lavu 51.12.0 Add av_fifo_peek2(), deprecate av_fifo_peek(). -2011-08-16 - 48f9e45 - lavf 53.8.0 +2011-08-16 - 27fbe31 / 48f9e45 - lavf 53.11.0 / 53.8.0 Add avformat_query_codec(). -2011-08-16 - bca06e7 - lavc 53.11.0 +2011-08-16 - 27fbe31 / bca06e7 - lavc 53.11.0 Add avcodec_get_type(). -2011-08-06 - 2f63440 - lavf 53.7.0 +2011-08-06 - 0cb233c / 2f63440 - lavf 53.7.0 Add error_recognition to AVFormatContext. -2011-08-02 - 9d39cbf - lavc 53.9.1 +2011-08-02 - 1d186e9 / 9d39cbf - lavc 53.9.1 Add AV_PKT_FLAG_CORRUPT AVPacket flag. 2011-07-16 - b57df29 - lavfi 2.27.0 @@ -184,10 +188,10 @@ API changes, most recent first: avfilter_set_common_packing_formats() avfilter_all_packing_formats() -2011-07-10 - a67c061 - lavf 53.6.0 +2011-07-10 - 3602ad7 / a67c061 - lavf 53.6.0 Add avformat_find_stream_info(), deprecate av_find_stream_info(). -2011-07-10 - 0b950fe - lavc 53.8.0 +2011-07-10 - 3602ad7 / 0b950fe - lavc 53.8.0 Add avcodec_open2(), deprecate avcodec_open(). 2011-07-01 - b442ca6 - lavf 53.5.0 - avformat.h @@ -226,35 +230,35 @@ API changes, most recent first: 2011-06-12 - 6119b23 - lavfi 2.16.0 - avfilter_graph_parse() Change avfilter_graph_parse() signature. -2011-06-23 - 67e9ae1 - lavu 51.8.0 - attributes.h +2011-06-23 - 686959e / 67e9ae1 - lavu 51.10.0 / 51.8.0 - attributes.h Add av_printf_format(). -2011-06-16 - 05e84c9, 25de595 - lavf 53.2.0 - avformat.h +2011-06-16 - 2905e3f / 05e84c9, 2905e3f / 25de595 - lavf 53.4.0 / 53.2.0 - avformat.h Add avformat_open_input and avformat_write_header(). Deprecate av_open_input_stream, av_open_input_file, AVFormatParameters and av_write_header. -2011-06-16 - 7e83e1c, dc59ec5 - lavu 51.7.0 - opt.h +2011-06-16 - 2905e3f / 7e83e1c, 2905e3f / dc59ec5 - lavu 51.9.0 / 51.7.0 - opt.h Add av_opt_set_dict() and av_opt_find(). Deprecate av_find_opt(). Add AV_DICT_APPEND flag. -2011-06-10 - cb7c11c - lavu 51.6.0 - opt.h +2011-06-10 - 45fb647 / cb7c11c - lavu 51.6.0 - opt.h Add av_opt_flag_is_set(). 2011-06-10 - c381960 - lavfi 2.15.0 - avfilter_get_audio_buffer_ref_from_arrays Add avfilter_get_audio_buffer_ref_from_arrays() to avfilter.h. -2011-06-09 - d9f80ea - lavu 51.8.0 - AVMetadata +2011-06-09 - f9ecb84 / d9f80ea - lavu 51.8.0 - AVMetadata Move AVMetadata from lavf to lavu and rename it to AVDictionary -- new installed header dict.h. All av_metadata_* functions renamed to av_dict_*. -2011-06-07 - a6703fa - lavu 51.8.0 - av_get_bytes_per_sample() +2011-06-07 - d552f61 / a6703fa - lavu 51.8.0 - av_get_bytes_per_sample() Add av_get_bytes_per_sample() in libavutil/samplefmt.h. Deprecate av_get_bits_per_sample_fmt(). -2011-06-05 - b39b062 - lavu 51.8.0 - opt.h +2011-06-05 - f956924 / b39b062 - lavu 51.8.0 - opt.h Add av_opt_free convenience function. 2011-06-06 - 95a0242 - lavfi 2.14.0 - AVFilterBufferRefAudioProps @@ -284,7 +288,7 @@ API changes, most recent first: Add av_get_pix_fmt_name() in libavutil/pixdesc.h, and deprecate avcodec_get_pix_fmt_name() in libavcodec/avcodec.h in its favor. -2011-05-25 - 30315a8 - lavf 53.3.0 - avformat.h +2011-05-25 - 39e4206 / 30315a8 - lavf 53.3.0 - avformat.h Add fps_probe_size to AVFormatContext. 2011-05-22 - 5ecdfd0 - lavf 53.2.0 - avformat.h @@ -300,10 +304,10 @@ API changes, most recent first: 2011-05-14 - 9fdf772 - lavfi 2.6.0 - avcodec.h Add avfilter_get_video_buffer_ref_from_frame() to libavfilter/avcodec.h. -2011-05-18 - 64150ff - lavc 53.7.0 - AVCodecContext.request_sample_fmt +2011-05-18 - 75a37b5 / 64150ff - lavc 53.7.0 - AVCodecContext.request_sample_fmt Add request_sample_fmt field to AVCodecContext. -2011-05-10 - 188dea1 - lavc 53.6.0 - avcodec.h +2011-05-10 - 59eb12f / 188dea1 - lavc 53.6.0 - avcodec.h Deprecate AVLPCType and the following fields in AVCodecContext: lpc_coeff_precision, prediction_order_method, min_partition_order, max_partition_order, lpc_type, lpc_passes. @@ -333,81 +337,81 @@ API changes, most recent first: Add av_dynarray_add function for adding an element to a dynamic array. -2011-04-26 - bebe72f - lavu 51.1.0 - avutil.h +2011-04-26 - d7e5aeb / bebe72f - lavu 51.1.0 - avutil.h Add AVPictureType enum and av_get_picture_type_char(), deprecate FF_*_TYPE defines and av_get_pict_type_char() defined in libavcodec/avcodec.h. -2011-04-26 - 10d3940 - lavfi 2.3.0 - avfilter.h +2011-04-26 - d7e5aeb / 10d3940 - lavfi 2.3.0 - avfilter.h Add pict_type and key_frame fields to AVFilterBufferRefVideo. -2011-04-26 - 7a11c82 - lavfi 2.2.0 - vsrc_buffer +2011-04-26 - d7e5aeb / 7a11c82 - lavfi 2.2.0 - vsrc_buffer Add sample_aspect_ratio fields to vsrc_buffer arguments -2011-04-21 - 94f7451 - lavc 53.1.0 - avcodec.h +2011-04-21 - 8772156 / 94f7451 - lavc 53.1.0 - avcodec.h Add CODEC_CAP_SLICE_THREADS for codecs supporting sliced threading. 2011-04-15 - lavc 52.120.0 - avcodec.h AVPacket structure got additional members for passing side information: - 4de339e introduce side information for AVPacket - 2d8591c make containers pass palette change in AVPacket + c407984 / 4de339e introduce side information for AVPacket + c407984 / 2d8591c make containers pass palette change in AVPacket 2011-04-12 - lavf 52.107.0 - avio.h Avio cleanup, part II - deprecate the entire URLContext API: - 175389c add avio_check as a replacement for url_exist - ff1ec0c add avio_pause and avio_seek_time as replacements + c55780d / 175389c add avio_check as a replacement for url_exist + 9891004 / ff1ec0c add avio_pause and avio_seek_time as replacements for _av_url_read_fseek/fpause - cdc6a87 deprecate av_protocol_next(), avio_enum_protocols + d4d0932 / cdc6a87 deprecate av_protocol_next(), avio_enum_protocols should be used instead. - 80c6e23 rename url_set_interrupt_cb->avio_set_interrupt_cb. - f87b1b3 rename open flags: URL_* -> AVIO_* - f8270bb add avio_enum_protocols. - 5593f03 deprecate URLProtocol. - c486dad deprecate URLContext. - 026e175 deprecate the typedef for URLInterruptCB - 8e76a19 deprecate av_register_protocol2. - b840484 deprecate URL_PROTOCOL_FLAG_NESTED_SCHEME - 1305d93 deprecate av_url_read_seek - fa104e1 deprecate av_url_read_pause - 727c7aa deprecate url_get_filename(). - 5958df3 deprecate url_max_packet_size(). - 1869ea0 deprecate url_get_file_handle(). - 32a97d4 deprecate url_filesize(). - e52a914 deprecate url_close(). - 58a48c6 deprecate url_seek(). - 925e908 deprecate url_write(). - dce3756 deprecate url_read_complete(). - bc371ac deprecate url_read(). - 0589da0 deprecate url_open(). - 62eaaea deprecate url_connect. - 5652bb9 deprecate url_alloc. - 333e894 deprecate url_open_protocol - e230705 deprecate url_poll and URLPollEntry + c88caa5 / 80c6e23 rename url_set_interrupt_cb->avio_set_interrupt_cb. + c88caa5 / f87b1b3 rename open flags: URL_* -> AVIO_* + d4d0932 / f8270bb add avio_enum_protocols. + d4d0932 / 5593f03 deprecate URLProtocol. + d4d0932 / c486dad deprecate URLContext. + d4d0932 / 026e175 deprecate the typedef for URLInterruptCB + c88caa5 / 8e76a19 deprecate av_register_protocol2. + 11d7841 / b840484 deprecate URL_PROTOCOL_FLAG_NESTED_SCHEME + 11d7841 / 1305d93 deprecate av_url_read_seek + 11d7841 / fa104e1 deprecate av_url_read_pause + 434f248 / 727c7aa deprecate url_get_filename(). + 434f248 / 5958df3 deprecate url_max_packet_size(). + 434f248 / 1869ea0 deprecate url_get_file_handle(). + 434f248 / 32a97d4 deprecate url_filesize(). + 434f248 / e52a914 deprecate url_close(). + 434f248 / 58a48c6 deprecate url_seek(). + 434f248 / 925e908 deprecate url_write(). + 434f248 / dce3756 deprecate url_read_complete(). + 434f248 / bc371ac deprecate url_read(). + 434f248 / 0589da0 deprecate url_open(). + 434f248 / 62eaaea deprecate url_connect. + 434f248 / 5652bb9 deprecate url_alloc. + 434f248 / 333e894 deprecate url_open_protocol + 434f248 / e230705 deprecate url_poll and URLPollEntry 2011-04-08 - lavf 52.106.0 - avformat.h Minor avformat.h cleanup: - a9bf9d8 deprecate av_guess_image2_codec - c3675df rename avf_sdp_create->av_sdp_create + d4d0932 / a9bf9d8 deprecate av_guess_image2_codec + d4d0932 / c3675df rename avf_sdp_create->av_sdp_create 2011-04-03 - lavf 52.105.0 - avio.h Large-scale renaming/deprecating of AVIOContext-related functions: - 724f6a0 deprecate url_fdopen - 403ee83 deprecate url_open_dyn_packet_buf - 6dc7d80 rename url_close_dyn_buf -> avio_close_dyn_buf - b92c545 rename url_open_dyn_buf -> avio_open_dyn_buf - 8978fed introduce an AVIOContext.seekable field as a replacement for + 2cae980 / 724f6a0 deprecate url_fdopen + 2cae980 / 403ee83 deprecate url_open_dyn_packet_buf + 2cae980 / 6dc7d80 rename url_close_dyn_buf -> avio_close_dyn_buf + 2cae980 / b92c545 rename url_open_dyn_buf -> avio_open_dyn_buf + 2cae980 / 8978fed introduce an AVIOContext.seekable field as a replacement for AVIOContext.is_streamed and url_is_streamed() - b64030f deprecate get_checksum() - 4c4427a deprecate init_checksum() - 4ec153b deprecate udp_set_remote_url/get_local_port - 933e90a deprecate av_url_read_fseek/fpause - 8d9769a deprecate url_fileno - b7f2fdd rename put_flush_packet -> avio_flush - 35f1023 deprecate url_close_buf - 83fddae deprecate url_open_buf - d9d86e0 rename url_fprintf -> avio_printf - 59f65d9 deprecate url_setbufsize - 3e68b3b deprecate url_ferror + 1caa412 / b64030f deprecate get_checksum() + 1caa412 / 4c4427a deprecate init_checksum() + 2fd41c9 / 4ec153b deprecate udp_set_remote_url/get_local_port + 4fa0e24 / 933e90a deprecate av_url_read_fseek/fpause + 4fa0e24 / 8d9769a deprecate url_fileno + 0fecf26 / b7f2fdd rename put_flush_packet -> avio_flush + 0fecf26 / 35f1023 deprecate url_close_buf + 0fecf26 / 83fddae deprecate url_open_buf + 0fecf26 / d9d86e0 rename url_fprintf -> avio_printf + 0fecf26 / 59f65d9 deprecate url_setbufsize + 6947b0c / 3e68b3b deprecate url_ferror e8bb2e2 deprecate url_fget_max_packet_size 76aa876 rename url_fsize -> avio_size e519753 deprecate url_fgetc @@ -428,7 +432,7 @@ API changes, most recent first: b3db9ce deprecate get_partial_buffer 8d9ac96 rename av_alloc_put_byte -> avio_alloc_context -2011-03-25 - 34b47d7 - lavc 52.115.0 - AVCodecContext.audio_service_type +2011-03-25 - 27ef7b1 / 34b47d7 - lavc 52.115.0 - AVCodecContext.audio_service_type Add audio_service_type field to AVCodecContext. 2011-03-17 - e309fdc - lavu 50.40.0 - pixfmt.h @@ -466,11 +470,11 @@ API changes, most recent first: 2011-02-10 - 12c14cd - lavf 52.99.0 - AVStream.disposition Add AV_DISPOSITION_HEARING_IMPAIRED and AV_DISPOSITION_VISUAL_IMPAIRED. -2011-02-09 - 5592734 - lavc 52.112.0 - avcodec_thread_init() +2011-02-09 - c0b102c - lavc 52.112.0 - avcodec_thread_init() Deprecate avcodec_thread_init()/avcodec_thread_free() use; instead set thread_count before calling avcodec_open. -2011-02-09 - 778b08a - lavc 52.111.0 - threading API +2011-02-09 - 37b00b4 - lavc 52.111.0 - threading API Add CODEC_CAP_FRAME_THREADS with new restrictions on get_buffer()/ release_buffer()/draw_horiz_band() callbacks for appropriate codecs. Add thread_type and active_thread_type fields to AVCodecContext. diff --git a/doc/RELEASE_NOTES b/doc/RELEASE_NOTES index 7861bfd4bc..74a5dcd94c 100644 --- a/doc/RELEASE_NOTES +++ b/doc/RELEASE_NOTES @@ -1,65 +1,17 @@ Release Notes ============= -* 0.8 "Love" June, 2011 -* 0.7 "Peace" June, 2011 (identical to 0.8 but using 0.6 ABI/API) +* 0.9 "Harmony" December, 2011 General notes ------------- -This release enables frame-based multithreaded decoding for a number of codecs, -including theora, huffyuv, VP8, H.263, mpeg4 and H.264. Additionally, there has -been a major cleanup of -both internal and external APIs. For this reason, the major versions of all -libraries except libpostproc have been bumped. This means that 0.8 can be installed -side-by-side with previous releases, on the other hand applications need to be -recompiled to use 0.8. - -Other important changes are more than 200 bugfixes, known regressions were fixed -w.r.t 0.5 and 0.6, additions of decoders including, but not limited to, -AMR-WB, single stream LATM/LOAS, G.722 ADPCM, a native VP8 decoder -and HE-AACv2. Additionally, many new de/muxers such as WebM in Matroska, Apple -HTTP Live Streaming, SAP, IEC 61937 (S/PDIF) have been added. - -See the Changelog file for a list of significant changes. +See the Changelog file for a list of significant changes. Note, there +are many more new features and bugfixes than whats listed there. Bugreports against FFmpeg git master or the most recent FFmpeg release are accepted. If you are experiencing issues with any formally released version of FFmpeg, please try git master to check if the issue still exists. If it does, make your report against the development code following the usual bug reporting guidelines. - -Note, if you have difficulty building for mingw, try --disable-outdev=sdl - - -API changes ------------ - -Please see git log of the public headers or the file doc/APIchanges for -programmer-centric information. Note that some long-time deprecated APIs have -been removed. Also, a number of additional APIs have been deprecated and might -be removed in the next release. - - -Other notable changes ---------------------- - -- high quality dithering in swscale to fix banding issues -- ffmpeg is now interactive and various information can be turned on/off while its running -- resolution changing support in ffmpeg -- sdl output device -- optimizations in libavfilter that make it much faster -- split, buffer, select, lut, negate filters amongth others -- more than 50 new video filters from mplayers libmpcodecs -- many ARM NEON optimizations -- nonfree libfaad support for AAC decoding removed -- 4:4:4 H.264 decoding -- 9/10bit H.264 decoding -- Win64 Assembler support -- native MMSH/MMST support -- Windows TV demuxing -- native AMR-WB decoding -- native GSM-MS decoding -- SMPTE 302M decoding -- AVS encoding diff --git a/doc/errno.txt b/doc/errno.txt new file mode 100644 index 0000000000..31cab26fc2 --- /dev/null +++ b/doc/errno.txt @@ -0,0 +1,174 @@ +The following table lists most error codes found in various operating +systems supported by FFmpeg. + + OS +Code Std F LBMWwb Text (YMMV) + +E2BIG POSIX ++++++ Argument list too long +EACCES POSIX ++++++ Permission denied +EADDRINUSE POSIX +++..+ Address in use +EADDRNOTAVAIL POSIX +++..+ Cannot assign requested address +EADV +..... Advertise error +EAFNOSUPPORT POSIX +++..+ Address family not supported +EAGAIN POSIX + ++++++ Resource temporarily unavailable +EALREADY POSIX +++..+ Operation already in progress +EAUTH .++... Authentication error +EBADARCH ..+... Bad CPU type in executable +EBADE +..... Invalid exchange +EBADEXEC ..+... Bad executable +EBADF POSIX ++++++ Bad file descriptor +EBADFD +..... File descriptor in bad state +EBADMACHO ..+... Malformed Macho file +EBADMSG POSIX ++4... Bad message +EBADR +..... Invalid request descriptor +EBADRPC .++... RPC struct is bad +EBADRQC +..... Invalid request code +EBADSLT +..... Invalid slot +EBFONT +..... Bad font file format +EBUSY POSIX - ++++++ Device or resource busy +ECANCELED POSIX +++... Operation canceled +ECHILD POSIX ++++++ No child processes +ECHRNG +..... Channel number out of range +ECOMM +..... Communication error on send +ECONNABORTED POSIX +++..+ Software caused connection abort +ECONNREFUSED POSIX - +++ss+ Connection refused +ECONNRESET POSIX +++..+ Connection reset +EDEADLK POSIX ++++++ Resource deadlock avoided +EDEADLOCK +..++. File locking deadlock error +EDESTADDRREQ POSIX +++... Destination address required +EDEVERR ..+... Device error +EDOM C89 - ++++++ Numerical argument out of domain +EDOOFUS .F.... Programming error +EDOTDOT +..... RFS specific error +EDQUOT POSIX +++... Disc quota exceeded +EEXIST POSIX ++++++ File exists +EFAULT POSIX - ++++++ Bad address +EFBIG POSIX - ++++++ File too large +EFTYPE .++... Inappropriate file type or format +EHOSTDOWN +++... Host is down +EHOSTUNREACH POSIX +++..+ No route to host +EHWPOISON +..... Memory page has hardware error +EIDRM POSIX +++... Identifier removed +EILSEQ C99 ++++++ Illegal byte sequence +EINPROGRESS POSIX - +++ss+ Operation in progress +EINTR POSIX - ++++++ Interrupted system call +EINVAL POSIX + ++++++ Invalid argument +EIO POSIX + ++++++ I/O error +EISCONN POSIX +++..+ Socket is already connected +EISDIR POSIX ++++++ Is a directory +EISNAM +..... Is a named type file +EKEYEXPIRED +..... Key has expired +EKEYREJECTED +..... Key was rejected by service +EKEYREVOKED +..... Key has been revoked +EL2HLT +..... Level 2 halted +EL2NSYNC +..... Level 2 not synchronized +EL3HLT +..... Level 3 halted +EL3RST +..... Level 3 reset +ELIBACC +..... Can not access a needed shared library +ELIBBAD +..... Accessing a corrupted shared library +ELIBEXEC +..... Cannot exec a shared library directly +ELIBMAX +..... Too many shared libraries +ELIBSCN +..... .lib section in a.out corrupted +ELNRNG +..... Link number out of range +ELOOP POSIX +++..+ Too many levels of symbolic links +EMEDIUMTYPE +..... Wrong medium type +EMFILE POSIX ++++++ Too many open files +EMLINK POSIX ++++++ Too many links +EMSGSIZE POSIX +++..+ Message too long +EMULTIHOP POSIX ++4... Multihop attempted +ENAMETOOLONG POSIX - ++++++ Filen ame too long +ENAVAIL +..... No XENIX semaphores available +ENEEDAUTH .++... Need authenticator +ENETDOWN POSIX +++..+ Network is down +ENETRESET SUSv3 +++..+ Network dropped connection on reset +ENETUNREACH POSIX +++..+ Network unreachable +ENFILE POSIX ++++++ Too many open files in system +ENOANO +..... No anode +ENOATTR .++... Attribute not found +ENOBUFS POSIX - +++..+ No buffer space available +ENOCSI +..... No CSI structure available +ENODATA XSR +N4... No message available +ENODEV POSIX - ++++++ No such device +ENOENT POSIX - ++++++ No such file or directory +ENOEXEC POSIX ++++++ Exec format error +ENOFILE ...++. No such file or directory +ENOKEY +..... Required key not available +ENOLCK POSIX ++++++ No locks available +ENOLINK POSIX ++4... Link has been severed +ENOMEDIUM +..... No medium found +ENOMEM POSIX ++++++ Not enough space +ENOMSG POSIX +++..+ No message of desired type +ENONET +..... Machine is not on the network +ENOPKG +..... Package not installed +ENOPROTOOPT POSIX +++..+ Protocol not available +ENOSPC POSIX ++++++ No space left on device +ENOSR XSR +N4... No STREAM resources +ENOSTR XSR +N4... Not a STREAM +ENOSYS POSIX + ++++++ Function not implemented +ENOTBLK +++... Block device required +ENOTCONN POSIX +++..+ Socket is not connected +ENOTDIR POSIX ++++++ Not a directory +ENOTEMPTY POSIX ++++++ Directory not empty +ENOTNAM +..... Not a XENIX named type file +ENOTRECOVERABLE SUSv4 - +..... State not recoverable +ENOTSOCK POSIX +++..+ Socket operation on non-socket +ENOTSUP POSIX +++... Operation not supported +ENOTTY POSIX ++++++ Inappropriate I/O control operation +ENOTUNIQ +..... Name not unique on network +ENXIO POSIX ++++++ No such device or address +EOPNOTSUPP POSIX +++..+ Operation not supported (on socket) +EOVERFLOW POSIX +++..+ Value too large to be stored in data type +EOWNERDEAD SUSv4 +..... Owner died +EPERM POSIX - ++++++ Operation not permitted +EPFNOSUPPORT +++..+ Protocol family not supported +EPIPE POSIX - ++++++ Broken pipe +EPROCLIM .++... Too many processes +EPROCUNAVAIL .++... Bad procedure for program +EPROGMISMATCH .++... Program version wrong +EPROGUNAVAIL .++... RPC prog. not avail +EPROTO POSIX ++4... Protocol error +EPROTONOSUPPORT POSIX - +++ss+ Protocol not supported +EPROTOTYPE POSIX +++..+ Protocol wrong type for socket +EPWROFF ..+... Device power is off +ERANGE C89 - ++++++ Result too large +EREMCHG +..... Remote address changed +EREMOTE +++... Object is remote +EREMOTEIO +..... Remote I/O error +ERESTART +..... Interrupted system call should be restarted +ERFKILL +..... Operation not possible due to RF-kill +EROFS POSIX ++++++ Read-only file system +ERPCMISMATCH .++... RPC version wrong +ESHLIBVERS ..+... Shared library version mismatch +ESHUTDOWN +++..+ Cannot send after socket shutdown +ESOCKTNOSUPPORT +++... Socket type not supported +ESPIPE POSIX ++++++ Illegal seek +ESRCH POSIX ++++++ No such process +ESRMNT +..... Srmount error +ESTALE POSIX +++..+ Stale NFS file handle +ESTRPIPE +..... Streams pipe error +ETIME XSR +N4... Stream ioctl timeout +ETIMEDOUT POSIX - +++ss+ Connection timed out +ETOOMANYREFS +++... Too many references: cannot splice +ETXTBSY POSIX +++... Text file busy +EUCLEAN +..... Structure needs cleaning +EUNATCH +..... Protocol driver not attached +EUSERS +++... Too many users +EWOULDBLOCK POSIX +++..+ Operation would block +EXDEV POSIX ++++++ Cross-device link +EXFULL +..... Exchange full + +Notations: + +F: used in FFmpeg (-: a few times, +: a lot) + +SUSv3: Single Unix Specification, version 3 +SUSv4: Single Unix Specification, version 4 +XSR: XSI STREAMS (obsolete) + +OS: availability on some supported operating systems +L: GNU/Linux +B: BSD (F: FreeBSD, N: NetBSD) +M: MacOS X +W: Microsoft Windows (s: emulated with winsock, see libavformat/network.h) +w: Mingw32 (3.17) and Mingw64 (2.0.1) +b: BeOS diff --git a/doc/examples/decoding_encoding.c b/doc/examples/decoding_encoding.c index f87a8c9c41..5271edf34e 100644 --- a/doc/examples/decoding_encoding.c +++ b/doc/examples/decoding_encoding.c @@ -180,6 +180,8 @@ static void audio_decode_example(const char *outfilename, const char *filename) } avpkt.size -= len; avpkt.data += len; + avpkt.dts = + avpkt.pts = AV_NOPTS_VALUE; if (avpkt.size < AUDIO_REFILL_THRESH) { /* Refill the input buffer, to avoid trying to decode * incomplete frames. Instead of this, one could also use diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi index 553d759ba2..e9276c279a 100644 --- a/doc/ffmpeg.texi +++ b/doc/ffmpeg.texi @@ -407,6 +407,10 @@ prefix is ``ffmpeg2pass''. The complete file name will be @file{PREFIX-N.log}, where N is a number specific to the output stream +Note that this option is overwritten by a local option of the same name +when using @code{-vcodec libx264}. That option maps to the x264 option stats +which has a different syntax. + @item -vlang @var{code} Set the ISO 639 language code (3 letters) of the current video stream. diff --git a/doc/ffplay.texi b/doc/ffplay.texi index b4d6dbcdcb..06666f6e59 100644 --- a/doc/ffplay.texi +++ b/doc/ffplay.texi @@ -168,6 +168,9 @@ Seek backward/forward 10 seconds. @item down/up Seek backward/forward 1 minute. +@item page down/page up +Seek backward/forward 10 minutes. + @item mouse click Seek to percentage in file corresponding to fraction of width. diff --git a/doc/general.texi b/doc/general.texi index fc4ee1cf3a..495527aefd 100644 --- a/doc/general.texi +++ b/doc/general.texi @@ -316,6 +316,7 @@ library: @tab Used in Sierra CD-ROM games. @item Smacker @tab @tab X @tab Multimedia format used by many games. +@item SMJPEG @tab @tab X @item Sony OpenMG (OMA) @tab @tab X @tab Audio format used in Sony Sonic Stage and Sony Vegas. @item Sony PlayStation STR @tab @tab X @@ -442,6 +443,7 @@ following image formats are supported: @tab Used in some games from Bethesda Softworks. @item Bink Video @tab @tab X @item Bitmap Brothers JV video @tab @tab X +@item y41p Brooktree uncompressed 4:1:1 12-bit @tab X @tab X @item Brute Force & Ignorance @tab @tab X @tab Used in the game Flash Traffic: City of Angels. @item C93 video @tab @tab X @@ -511,6 +513,7 @@ following image formats are supported: @item Intel H.263 @tab @tab X @item Intel Indeo 2 @tab @tab X @item Intel Indeo 3 @tab @tab X +@item Intel Indeo 4 @tab @tab X @item Intel Indeo 5 @tab @tab X @item Interplay C93 @tab @tab X @tab Used in the game Cyberia from Interplay. @@ -602,6 +605,7 @@ following image formats are supported: @tab Codec used in DOS CD-ROM FlashBack game. @item Ut Video @tab @tab X @item V210 Quicktime Uncompressed 4:2:2 10-bit @tab X @tab X +@item v410 Quicktime Uncompressed 4:4:4 10-bit @tab X @tab X @item VBLE Lossless Codec @tab @tab X @item VMware Screen Codec / VMware Video @tab @tab X @tab Codec used in videos captured by VMware. diff --git a/doc/issue_tracker.txt b/doc/issue_tracker.txt index d487f66830..27b0009b58 100644 --- a/doc/issue_tracker.txt +++ b/doc/issue_tracker.txt @@ -24,7 +24,7 @@ a mail for every change to every issue. The subscription URL for the ffmpeg-trac list is: http(s)://ffmpeg.org/mailman/listinfo/ffmpeg-trac The URL of the webinterface of the tracker is: -http(s)://ffmpeg.org/trac/ffmpeg +http(s)://trac.ffmpeg.org Type: ----- diff --git a/ffmpeg.c b/ffmpeg.c index ee79e32039..b120177222 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -549,6 +549,8 @@ static void sigterm_handler(int sig) received_sigterm = sig; received_nb_signals++; term_exit(); + if(received_nb_signals > 3) + exit(123); } static void term_init(void) @@ -1902,7 +1904,10 @@ static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int *frame_sample_aspect = ist->st->sample_aspect_ratio; decoded_frame->pts = ist->pts; - av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, AV_VSRC_BUF_FLAG_OVERWRITE); + if((av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, AV_VSRC_BUF_FLAG_OVERWRITE)) < 0){ + av_log(0, AV_LOG_FATAL, "Failed to inject frame into filter network\n"); + exit_program(1); + } } } #endif @@ -2047,6 +2052,10 @@ static int output_packet(InputStream *ist, if (ret < 0) return ret; + + avpkt.dts= + avpkt.pts= AV_NOPTS_VALUE; + // touch data and size only if not EOF if (pkt) { if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO) @@ -3293,6 +3302,7 @@ static void assert_file_overwrite(const char *filename) fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename); fflush(stderr); term_exit(); + signal(SIGINT, SIG_DFL); if (!read_yesno()) { av_log(0, AV_LOG_FATAL, "Not overwriting - exiting\n"); exit_program(1); @@ -3769,9 +3779,11 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc) if (do_pass) { if (do_pass & 1) { video_enc->flags |= CODEC_FLAG_PASS1; + av_dict_set(&ost->opts, "flags", "+pass1", AV_DICT_APPEND); } if (do_pass & 2) { video_enc->flags |= CODEC_FLAG_PASS2; + av_dict_set(&ost->opts, "flags", "+pass2", AV_DICT_APPEND); } } @@ -3962,6 +3974,7 @@ static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const ch ost = new_output_stream(o, s, codec->type); st = ost->st; avctx = st->codec; + ost->enc = codec; // FIXME: a more elegant solution is needed memcpy(st, ic->streams[i], sizeof(AVStream)); @@ -4826,7 +4839,7 @@ int main(int argc, char **argv) av_register_all(); avformat_network_init(); - show_banner(); + show_banner(argc, argv, options); term_init(); diff --git a/ffplay.c b/ffplay.c index 7ebe6f3b44..f0861a8091 100644 --- a/ffplay.c +++ b/ffplay.c @@ -922,7 +922,7 @@ static void do_exit(VideoState *is) exit(0); } -static int video_open(VideoState *is){ +static int video_open(VideoState *is, int force_set_video_mode){ int flags = SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_HWACCEL; int w,h; @@ -949,7 +949,7 @@ static int video_open(VideoState *is){ h = 480; } if(screen && is->width == screen->w && screen->w == w - && is->height== screen->h && screen->h == h) + && is->height== screen->h && screen->h == h && !force_set_video_mode) return 0; screen = SDL_SetVideoMode(w, h, 0, flags); if (!screen) { @@ -970,7 +970,7 @@ static int video_open(VideoState *is){ static void video_display(VideoState *is) { if(!screen) - video_open(is); + video_open(is, 0); if (is->audio_st && is->show_mode != SHOW_MODE_VIDEO) video_audio_display(is); else if (is->video_st) @@ -2043,7 +2043,8 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr) AVPacket *pkt = &is->audio_pkt; AVCodecContext *dec= is->audio_st->codec; int len1, len2, data_size, resampled_data_size; - int64_t dec_channel_layout, got_frame; + int64_t dec_channel_layout; + int got_frame; double pts; int new_packet = 0; int flush_complete = 0; @@ -2144,6 +2145,7 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr) /* free the current packet */ if (pkt->data) av_free_packet(pkt); + memset(pkt_temp, 0, sizeof(*pkt_temp)); if (is->paused || is->audioq.abort_request) { return -1; @@ -2776,14 +2778,15 @@ static void stream_cycle_channel(VideoState *is, int codec_type) static void toggle_full_screen(VideoState *is) { + int i; is_full_screen = !is_full_screen; #if defined(__APPLE__) && SDL_VERSION_ATLEAST(1, 2, 14) /* OS X needs to reallocate the SDL overlays */ - for (int i = 0; i < VIDEO_PICTURE_QUEUE_SIZE; i++) { + for (i = 0; i < VIDEO_PICTURE_QUEUE_SIZE; i++) { is->pictq[i].reallocate = 1; } #endif - video_open(is); + video_open(is, 1); } static void toggle_pause(VideoState *is) @@ -2852,6 +2855,12 @@ static void event_loop(VideoState *cur_stream) case SDLK_w: toggle_audio_display(cur_stream); break; + case SDLK_PAGEUP: + incr = 600.0; + goto do_seek; + case SDLK_PAGEDOWN: + incr = -600.0; + goto do_seek; case SDLK_LEFT: incr = -10.0; goto do_seek; @@ -2935,7 +2944,7 @@ static void event_loop(VideoState *cur_stream) do_exit(cur_stream); break; case FF_ALLOC_EVENT: - video_open(event.user.data1); + video_open(event.user.data1, 0); alloc_picture(event.user.data1); break; case FF_REFRESH_EVENT: @@ -3121,6 +3130,7 @@ static int opt_help(const char *opt, const char *arg) "s activate frame-step mode\n" "left/right seek backward/forward 10 seconds\n" "down/up seek backward/forward 1 minute\n" + "page down/page up seek backward/forward 10 minutes\n" "mouse click seek to percentage in file corresponding to fraction of width\n" ); return 0; @@ -3167,7 +3177,7 @@ int main(int argc, char **argv) init_opts(); - show_banner(); + show_banner(argc, argv, options); parse_options(NULL, argc, argv, options, opt_input_file); diff --git a/ffprobe.c b/ffprobe.c index 6af76953aa..a2aaeb295f 100644 --- a/ffprobe.c +++ b/ffprobe.c @@ -1252,7 +1252,7 @@ int main(int argc, char **argv) avdevice_register_all(); #endif - show_banner(); + show_banner(argc, argv, options); parse_options(NULL, argc, argv, options, opt_input_file); if (!input_filename) { diff --git a/ffserver.c b/ffserver.c index 1244b45b90..c1593500be 100644 --- a/ffserver.c +++ b/ffserver.c @@ -4674,7 +4674,7 @@ int main(int argc, char **argv) av_register_all(); avformat_network_init(); - show_banner(); + show_banner(argc, argv, options); my_program_name = argv[0]; my_program_dir = getcwd(0, 0); diff --git a/libavcodec/4xm.c b/libavcodec/4xm.c index 9350f06e9b..f854f1cfb5 100644 --- a/libavcodec/4xm.c +++ b/libavcodec/4xm.c @@ -459,6 +459,11 @@ static int decode_p_frame(FourXContext *f, const uint8_t *buf, int length){ static int decode_i_block(FourXContext *f, DCTELEM *block){ int code, i, j, level, val; + if(get_bits_left(&f->gb) < 2){ + av_log(f->avctx, AV_LOG_ERROR, "%d bits left before decode_i_block()\n", get_bits_left(&f->gb)); + return -1; + } + /* DC coef */ val = get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3); if (val>>4){ diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 6410ed47f3..bc7650f331 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -207,6 +207,7 @@ OBJS-$(CONFIG_IFF_ILBM_DECODER) += iff.o OBJS-$(CONFIG_IMC_DECODER) += imc.o OBJS-$(CONFIG_INDEO2_DECODER) += indeo2.o OBJS-$(CONFIG_INDEO3_DECODER) += indeo3.o +OBJS-$(CONFIG_INDEO4_DECODER) += indeo4.o ivi_common.o ivi_dsp.o OBJS-$(CONFIG_INDEO5_DECODER) += indeo5.o ivi_common.o ivi_dsp.o OBJS-$(CONFIG_INTERPLAY_DPCM_DECODER) += dpcm.o OBJS-$(CONFIG_INTERPLAY_VIDEO_DECODER) += interplayvideo.o @@ -413,6 +414,8 @@ OBJS-$(CONFIG_ULTI_DECODER) += ulti.o OBJS-$(CONFIG_UTVIDEO_DECODER) += utvideo.o OBJS-$(CONFIG_V210_DECODER) += v210dec.o OBJS-$(CONFIG_V210_ENCODER) += v210enc.o +OBJS-$(CONFIG_V410_DECODER) += v410dec.o +OBJS-$(CONFIG_V410_ENCODER) += v410enc.o OBJS-$(CONFIG_V210X_DECODER) += v210x.o OBJS-$(CONFIG_VB_DECODER) += vb.o OBJS-$(CONFIG_VBLE_DECODER) += vble.o @@ -463,6 +466,8 @@ OBJS-$(CONFIG_XBIN_DECODER) += bintext.o cga_data.o OBJS-$(CONFIG_XL_DECODER) += xl.o OBJS-$(CONFIG_XSUB_DECODER) += xsubdec.o OBJS-$(CONFIG_XSUB_ENCODER) += xsubenc.o +OBJS-$(CONFIG_Y41P_DECODER) += y41pdec.o +OBJS-$(CONFIG_Y41P_ENCODER) += y41penc.o OBJS-$(CONFIG_YOP_DECODER) += yop.o OBJS-$(CONFIG_ZLIB_DECODER) += lcldec.o OBJS-$(CONFIG_ZLIB_ENCODER) += lclenc.o diff --git a/libavcodec/aac.h b/libavcodec/aac.h index d31103684c..631fdd405f 100644 --- a/libavcodec/aac.h +++ b/libavcodec/aac.h @@ -300,6 +300,7 @@ typedef struct { DECLARE_ALIGNED(32, float, temp)[128]; enum OCStatus output_configured; + int warned_num_aac_frames; } AACContext; #endif /* AVCODEC_AAC_H */ diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c index a046d991e6..806e1b52ea 100644 --- a/libavcodec/aacdec.c +++ b/libavcodec/aacdec.c @@ -819,10 +819,10 @@ static int decode_band_types(AACContext *ac, enum BandType band_type[120], av_log(ac->avctx, AV_LOG_ERROR, "invalid band type\n"); return -1; } - while ((sect_len_incr = get_bits(gb, bits)) == (1 << bits) - 1) + while ((sect_len_incr = get_bits(gb, bits)) == (1 << bits) - 1 && get_bits_left(gb) >= bits) sect_end += sect_len_incr; sect_end += sect_len_incr; - if (get_bits_left(gb) < 0) { + if (get_bits_left(gb) < 0 || sect_len_incr == (1 << bits) - 1) { av_log(ac->avctx, AV_LOG_ERROR, overread_err); return -1; } @@ -2125,13 +2125,14 @@ static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb) } if (!ac->avctx->sample_rate) ac->avctx->sample_rate = hdr_info.sample_rate; - if (hdr_info.num_aac_frames == 1) { - if (!hdr_info.crc_absent) - skip_bits(gb, 16); - } else { + if (!ac->warned_num_aac_frames && hdr_info.num_aac_frames != 1) { + // This is 2 for "VLB " audio in NSV files. + // See samples/nsv/vlb_audio. av_log_missing_feature(ac->avctx, "More than one AAC RDB per ADTS frame is", 0); - return -1; + ac->warned_num_aac_frames = 1; } + if (!hdr_info.crc_absent) + skip_bits(gb, 16); } return size; } diff --git a/libavcodec/aacsbr.c b/libavcodec/aacsbr.c index a213827132..d2f37c5e10 100644 --- a/libavcodec/aacsbr.c +++ b/libavcodec/aacsbr.c @@ -1187,7 +1187,7 @@ static void sbr_qmf_synthesis(DSPContext *dsp, FFTContext *mdct, const float *sbr_qmf_window = div ? sbr_qmf_window_ds : sbr_qmf_window_us; float *v; for (i = 0; i < 32; i++) { - if (*v_off == 0) { + if (*v_off < 128 >> div) { int saved_samples = (1280 - 128) >> div; memcpy(&v0[SBR_SYNTHESIS_BUF_SIZE - saved_samples], v0, saved_samples * sizeof(float)); *v_off = SBR_SYNTHESIS_BUF_SIZE - saved_samples - (128 >> div); diff --git a/libavcodec/aasc.c b/libavcodec/aasc.c index 919bbc72bd..197bfe5f05 100644 --- a/libavcodec/aasc.c +++ b/libavcodec/aasc.c @@ -79,8 +79,13 @@ static int aasc_decode_frame(AVCodecContext *avctx, case 0: stride = (avctx->width * 3 + 3) & ~3; for(i = avctx->height - 1; i >= 0; i--){ + if(avctx->width*3 > buf_size){ + av_log(avctx, AV_LOG_ERROR, "Next line is beyond buffer bounds\n"); + break; + } memcpy(s->frame.data[0] + i*s->frame.linesize[0], buf, avctx->width*3); buf += stride; + buf_size -= stride; } break; case 1: diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index 5e8b36404b..0cb7c67a1f 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -1371,7 +1371,7 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, if (s->frame_size > buf_size) { av_log(avctx, AV_LOG_ERROR, "incomplete frame\n"); err = AAC_AC3_PARSE_ERROR_FRAME_SIZE; - } else if (avctx->err_recognition & AV_EF_CRCCHECK) { + } else if (avctx->err_recognition & (AV_EF_CRCCHECK|AV_EF_CAREFUL)) { /* check for crc mismatch */ if (av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, &buf[2], s->frame_size - 2)) { diff --git a/libavcodec/acelp_vectors.c b/libavcodec/acelp_vectors.c index a44ab8cfe6..e6db556410 100644 --- a/libavcodec/acelp_vectors.c +++ b/libavcodec/acelp_vectors.c @@ -237,6 +237,7 @@ void ff_set_fixed_vector(float *out, const AMRFixed *in, float scale, int size) int x = in->x[i], repeats = !((in->no_repeat_mask >> i) & 1); float y = in->y[i] * scale; + if (in->pitch_lag > 0) do { out[x] += y; y *= in->pitch_fac; @@ -252,6 +253,7 @@ void ff_clear_fixed_vector(float *out, const AMRFixed *in, int size) for (i=0; i < in->n; i++) { int x = in->x[i], repeats = !((in->no_repeat_mask >> i) & 1); + if (in->pitch_lag > 0) do { out[x] = 0.0; x += in->pitch_lag; diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c index cee1eed7bd..688fba430c 100644 --- a/libavcodec/adpcm.c +++ b/libavcodec/adpcm.c @@ -101,8 +101,9 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx) max_channels = 6; break; } - if(avctx->channels > max_channels){ - return -1; + if (avctx->channels <= 0 || avctx->channels > max_channels) { + av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n"); + return AVERROR(EINVAL); } switch(avctx->codec->id) { @@ -817,6 +818,9 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, /* Each EA ADPCM frame has a 12-byte header followed by 30-byte pieces, each coding 28 stereo samples. */ + if(avctx->channels != 2) + return AVERROR_INVALIDDATA; + src += 4; // skip sample count (already read) current_left_sample = (int16_t)bytestream_get_le16(&src); @@ -1003,11 +1007,15 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, break; case CODEC_ID_ADPCM_IMA_AMV: case CODEC_ID_ADPCM_IMA_SMJPEG: - c->status[0].predictor = (int16_t)bytestream_get_le16(&src); - c->status[0].step_index = bytestream_get_le16(&src); - - if (avctx->codec->id == CODEC_ID_ADPCM_IMA_AMV) - src+=4; + if (avctx->codec->id == CODEC_ID_ADPCM_IMA_AMV) { + c->status[0].predictor = sign_extend(bytestream_get_le16(&src), 16); + c->status[0].step_index = bytestream_get_le16(&src); + src += 4; + } else { + c->status[0].predictor = sign_extend(bytestream_get_be16(&src), 16); + c->status[0].step_index = bytestream_get_byte(&src); + src += 1; + } for (n = nb_samples >> (1 - st); n > 0; n--, src++) { char hi, lo; diff --git a/libavcodec/adx_parser.c b/libavcodec/adx_parser.c index ebcb1370e5..bbd865454e 100644 --- a/libavcodec/adx_parser.c +++ b/libavcodec/adx_parser.c @@ -22,7 +22,7 @@ * @file * ADX audio parser * - * Reads header to extradata and splits packets into individual blocks. + * Splits packets into individual blocks. */ #include "libavutil/intreadwrite.h" @@ -33,11 +33,9 @@ typedef struct ADXParseContext { ParseContext pc; int header_size; int block_size; - int buf_pos; + int remaining; } ADXParseContext; -#define MIN_HEADER_SIZE 24 - static int adx_parse(AVCodecParserContext *s1, AVCodecContext *avctx, const uint8_t **poutbuf, int *poutbuf_size, @@ -46,45 +44,32 @@ static int adx_parse(AVCodecParserContext *s1, ADXParseContext *s = s1->priv_data; ParseContext *pc = &s->pc; int next = END_NOT_FOUND; + int i; + uint64_t state= pc->state64; - if (!avctx->extradata_size) { - int ret; - - ff_combine_frame(pc, END_NOT_FOUND, &buf, &buf_size); - - if (!s->header_size && pc->index >= MIN_HEADER_SIZE) { - if (ret = avpriv_adx_decode_header(avctx, pc->buffer, pc->index, - &s->header_size, NULL)) - return AVERROR_INVALIDDATA; - s->block_size = BLOCK_SIZE * avctx->channels; + if(!s->header_size){ + for(i=0; i>32)&0xFFFF)>=4){ + s->header_size= ((state>>32)&0xFFFF) + 4; + s->block_size = BLOCK_SIZE * (state&0xFF); + s->remaining = i - 7 + s->header_size + s->block_size; + break; + } } - if (s->header_size && s->header_size <= pc->index) { - avctx->extradata = av_mallocz(s->header_size + FF_INPUT_BUFFER_PADDING_SIZE); - if (!avctx->extradata) - return AVERROR(ENOMEM); - avctx->extradata_size = s->header_size; - memcpy(avctx->extradata, pc->buffer, s->header_size); - memmove(pc->buffer, pc->buffer + s->header_size, s->header_size); - pc->index -= s->header_size; - } - *poutbuf = NULL; - *poutbuf_size = 0; - return buf_size; + pc->state64= state; } - if (pc->index - s->buf_pos >= s->block_size) { - *poutbuf = &pc->buffer[s->buf_pos]; - *poutbuf_size = s->block_size; - s->buf_pos += s->block_size; - return 0; + if (s->header_size) { + if (!s->remaining) { + s->remaining = s->block_size; + } + if (s->remaining<=buf_size) { + next= s->remaining; + s->remaining = 0; + } else + s->remaining -= buf_size; } - if (pc->index && s->buf_pos) { - memmove(pc->buffer, &pc->buffer[s->buf_pos], pc->index - s->buf_pos); - pc->index -= s->buf_pos; - s->buf_pos = 0; - } - if (buf_size + pc->index >= s->block_size) - next = s->block_size - pc->index; if (ff_combine_frame(pc, next, &buf, &buf_size) < 0 || !buf_size) { *poutbuf = NULL; diff --git a/libavcodec/adxdec.c b/libavcodec/adxdec.c index f049def626..cf494c12d4 100644 --- a/libavcodec/adxdec.c +++ b/libavcodec/adxdec.c @@ -38,16 +38,15 @@ static av_cold int adx_decode_init(AVCodecContext *avctx) ADXContext *c = avctx->priv_data; int ret, header_size; - if (avctx->extradata_size < 24) - return AVERROR_INVALIDDATA; - - if ((ret = avpriv_adx_decode_header(avctx, avctx->extradata, - avctx->extradata_size, &header_size, - c->coeff)) < 0) { - av_log(avctx, AV_LOG_ERROR, "error parsing ADX header\n"); - return AVERROR_INVALIDDATA; + if (avctx->extradata_size >= 24) { + if ((ret = avpriv_adx_decode_header(avctx, avctx->extradata, + avctx->extradata_size, &header_size, + c->coeff)) < 0) { + av_log(avctx, AV_LOG_ERROR, "error parsing ADX header\n"); + return AVERROR_INVALIDDATA; + } + c->channels = avctx->channels; } - c->channels = avctx->channels; avctx->sample_fmt = AV_SAMPLE_FMT_S16; @@ -107,6 +106,23 @@ static int adx_decode_frame(AVCodecContext *avctx, void *data, return buf_size; } + if(AV_RB16(buf) == 0x8000){ + int header_size; + if ((ret = avpriv_adx_decode_header(avctx, buf, + buf_size, &header_size, + c->coeff)) < 0) { + av_log(avctx, AV_LOG_ERROR, "error parsing ADX header\n"); + return AVERROR_INVALIDDATA; + } + c->channels = avctx->channels; + if(buf_size < header_size) + return AVERROR_INVALIDDATA; + buf += header_size; + buf_size -= header_size; + } + if(c->channels <= 0) + return AVERROR_INVALIDDATA; + /* calculate number of blocks in the packet */ num_blocks = buf_size / (BLOCK_SIZE * c->channels); diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 2788238c78..c08d2848ed 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -112,7 +112,7 @@ static inline int decode_scalar(GetBitContext *gb, int k, int limit, int readsam return x; } -static void bastardized_rice_decompress(ALACContext *alac, +static int bastardized_rice_decompress(ALACContext *alac, int32_t *output_buffer, int output_size, int readsamplesize, /* arg_10 */ @@ -134,6 +134,9 @@ static void bastardized_rice_decompress(ALACContext *alac, /* standard rice encoding */ int k; /* size of extra bits */ + if(get_bits_left(&alac->gb) <= 0) + return -1; + /* read k, that is bits as is */ k = av_log2((history >> 9) + 3); x= decode_scalar(&alac->gb, k, rice_kmodifier, readsamplesize); @@ -179,6 +182,7 @@ static void bastardized_rice_decompress(ALACContext *alac, history = 0; } } + return 0; } static inline int sign_only(int v) @@ -442,12 +446,14 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data, if (alac->extra_bits) { for (i = 0; i < outputsamples; i++) { + if(get_bits_left(&alac->gb) <= 0) + return -1; for (ch = 0; ch < channels; ch++) alac->extra_bits_buffer[ch][i] = get_bits(&alac->gb, alac->extra_bits); } } for (ch = 0; ch < channels; ch++) { - bastardized_rice_decompress(alac, + int ret = bastardized_rice_decompress(alac, alac->predicterror_buffer[ch], outputsamples, readsamplesize, @@ -455,6 +461,8 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data, alac->setinfo_rice_kmodifier, ricemodifier[ch] * alac->setinfo_rice_historymult / 4, (1 << alac->setinfo_rice_kmodifier) - 1); + if(ret<0) + return ret; if (prediction_type[ch] == 0) { /* adaptive fir */ @@ -478,6 +486,8 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data, } else { /* not compressed, easy case */ for (i = 0; i < outputsamples; i++) { + if(get_bits_left(&alac->gb) <= 0) + return -1; for (ch = 0; ch < channels; ch++) { alac->outputsamples_buffer[ch][i] = get_sbits_long(&alac->gb, alac->setinfo_sample_size); diff --git a/libavcodec/alacenc.c b/libavcodec/alacenc.c index 305a5b825b..6142a1e42e 100644 --- a/libavcodec/alacenc.c +++ b/libavcodec/alacenc.c @@ -259,7 +259,7 @@ static void alac_linear_predictor(AlacEncodeContext *s, int ch) // generate warm-up samples residual[0] = samples[0]; for (i = 1; i <= lpc.lpc_order; i++) - residual[i] = samples[i] - samples[i-1]; + residual[i] = sign_extend(samples[i] - samples[i-1], s->write_sample_size); // perform lpc on remaining samples for (i = lpc.lpc_order + 1; i < s->avctx->frame_size; i++) { diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 9e130477dd..9a608ebf7e 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -133,6 +133,7 @@ void avcodec_register_all(void) REGISTER_DECODER (IFF_ILBM, iff_ilbm); REGISTER_DECODER (INDEO2, indeo2); REGISTER_DECODER (INDEO3, indeo3); + REGISTER_DECODER (INDEO4, indeo4); REGISTER_DECODER (INDEO5, indeo5); REGISTER_DECODER (INTERPLAY_VIDEO, interplay_video); REGISTER_ENCDEC (JPEG2000, jpeg2000); @@ -215,6 +216,7 @@ void avcodec_register_all(void) REGISTER_DECODER (UTVIDEO, utvideo); REGISTER_ENCDEC (V210, v210); REGISTER_DECODER (V210X, v210x); + REGISTER_ENCDEC (V410, v410); REGISTER_DECODER (VB, vb); REGISTER_DECODER (VBLE, vble); REGISTER_DECODER (VC1, vc1); @@ -241,6 +243,7 @@ void avcodec_register_all(void) REGISTER_DECODER (XAN_WC3, xan_wc3); REGISTER_DECODER (XAN_WC4, xan_wc4); REGISTER_DECODER (XL, xl); + REGISTER_ENCDEC (Y41P, y41p); REGISTER_DECODER (YOP, yop); REGISTER_ENCDEC (ZLIB, zlib); REGISTER_ENCDEC (ZMBV, zmbv); diff --git a/libavcodec/alsdec.c b/libavcodec/alsdec.c index 0e5509c74a..9d371de0c8 100644 --- a/libavcodec/alsdec.c +++ b/libavcodec/alsdec.c @@ -1012,7 +1012,7 @@ static void zero_remaining(unsigned int b, unsigned int b_max, unsigned int count = 0; while (b < b_max) - count += div_blocks[b]; + count += div_blocks[b++]; if (count) memset(buf, 0, sizeof(*buf) * count); diff --git a/libavcodec/arm/int_neon.S b/libavcodec/arm/int_neon.S index e1353982d0..bb3c9533f9 100644 --- a/libavcodec/arm/int_neon.S +++ b/libavcodec/arm/int_neon.S @@ -66,10 +66,10 @@ function ff_scalarproduct_int16_neon, export=1 3: vpadd.s32 d16, d0, d1 vpadd.s32 d17, d2, d3 - vpadd.s32 d10, d4, d5 - vpadd.s32 d11, d6, d7 + vpadd.s32 d18, d4, d5 + vpadd.s32 d19, d6, d7 vpadd.s32 d0, d16, d17 - vpadd.s32 d1, d10, d11 + vpadd.s32 d1, d18, d19 vpadd.s32 d2, d0, d1 vpaddl.s32 d3, d2 vmov.32 r0, d3[0] @@ -106,10 +106,10 @@ function ff_scalarproduct_and_madd_int16_neon, export=1 vpadd.s32 d16, d0, d1 vpadd.s32 d17, d2, d3 - vpadd.s32 d10, d4, d5 - vpadd.s32 d11, d6, d7 + vpadd.s32 d18, d4, d5 + vpadd.s32 d19, d6, d7 vpadd.s32 d0, d16, d17 - vpadd.s32 d1, d10, d11 + vpadd.s32 d1, d18, d19 vpadd.s32 d2, d0, d1 vpaddl.s32 d3, d2 vmov.32 r0, d3[0] diff --git a/libavcodec/ass_split.c b/libavcodec/ass_split.c index 2a3b76445e..33c1c2714f 100644 --- a/libavcodec/ass_split.c +++ b/libavcodec/ass_split.c @@ -366,7 +366,7 @@ int ff_ass_split_override_codes(const ASSCodesCallbacks *callbacks, void *priv, char new_line[2]; int text_len = 0; - while (*buf) { + while (buf && *buf) { if (text && callbacks->text && (sscanf(buf, "\\%1[nN]", new_line) == 1 || !strncmp(buf, "{\\", 2))) { diff --git a/libavcodec/atrac3.c b/libavcodec/atrac3.c index b9f1f516cc..fcf7c925eb 100644 --- a/libavcodec/atrac3.c +++ b/libavcodec/atrac3.c @@ -402,6 +402,8 @@ static int decodeTonalComponents (GetBitContext *gb, tonal_component *pComponent for (k=0; k=64) + return AVERROR_INVALIDDATA; pComponent[component_count].pos = j * 64 + (get_bits(gb,6)); max_coded_values = SAMPLES_PER_FRAME - pComponent[component_count].pos; coded_values = coded_values_per_component + 1; diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 23048ddb72..85e24ba515 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -254,6 +254,8 @@ enum CodecID { CODEC_ID_BMV_VIDEO, CODEC_ID_VBLE, CODEC_ID_DXTORY, + CODEC_ID_V410, + CODEC_ID_Y41P = MKBETAG('Y','4','1','P'), CODEC_ID_UTVIDEO = 0x800, CODEC_ID_ESCAPE130 = MKBETAG('E','1','3','0'), @@ -789,6 +791,10 @@ typedef struct RcOverride{ * Codec supports slice-based (or partition-based) multithreading. */ #define CODEC_CAP_SLICE_THREADS 0x2000 +/** + * Codec supports changed parameters at any point. + */ +#define CODEC_CAP_PARAM_CHANGE 0x4000 /** * Codec is lossless. */ @@ -875,6 +881,8 @@ typedef struct AVPanScan{ enum AVPacketSideDataType { AV_PKT_DATA_PALETTE, + AV_PKT_DATA_NEW_EXTRADATA, + AV_PKT_DATA_PARAM_CHANGE, }; typedef struct AVPacket { @@ -943,6 +951,27 @@ typedef struct AVPacket { #define AV_PKT_FLAG_KEY 0x0001 ///< The packet contains a keyframe #define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted +/** + * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows: + * u32le param_flags + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT) + * s32le channel_count + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT) + * u64le channel_layout + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) + * s32le sample_rate + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS) + * s32le width + * s32le height + */ + +enum AVSideDataParamChangeFlags { + AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001, + AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002, + AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = 0x0004, + AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = 0x0008, +}; + /** * Audio Video Frame. * New fields can be added to the end of AVFRAME with minor version diff --git a/libavcodec/bmp.c b/libavcodec/bmp.c index e97f6ed67c..419c3fa197 100644 --- a/libavcodec/bmp.c +++ b/libavcodec/bmp.c @@ -206,7 +206,7 @@ static int bmp_decode_frame(AVCodecContext *avctx, dsize = buf_size - hsize; /* Line size in file multiple of 4 */ - n = ((avctx->width * depth) / 8 + 3) & ~3; + n = ((avctx->width * depth + 31) / 8) & ~3; if(n * avctx->height > dsize && comp != BMP_RLE4 && comp != BMP_RLE8){ av_log(avctx, AV_LOG_ERROR, "not enough data (%d < %d)\n", diff --git a/libavcodec/bmv.c b/libavcodec/bmv.c index e98d5998ca..37c844858f 100644 --- a/libavcodec/bmv.c +++ b/libavcodec/bmv.c @@ -285,12 +285,17 @@ static av_cold int decode_end(AVCodecContext *avctx) return 0; } +typedef struct BMVAudioDecContext { + AVFrame frame; +} BMVAudioDecContext; + static const int bmv_aud_mults[16] = { 16512, 8256, 4128, 2064, 1032, 516, 258, 192, 129, 88, 64, 56, 48, 40, 36, 32 }; static av_cold int bmv_aud_decode_init(AVCodecContext *avctx) { + BMVAudioDecContext *c = avctx->priv_data; if (avctx->channels != 2) { av_log(avctx, AV_LOG_INFO, "invalid number of channels\n"); @@ -299,17 +304,21 @@ static av_cold int bmv_aud_decode_init(AVCodecContext *avctx) avctx->sample_fmt = AV_SAMPLE_FMT_S16; + avcodec_get_frame_defaults(&c->frame); + avctx->coded_frame = &c->frame; + return 0; } -static int bmv_aud_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - AVPacket *avpkt) +static int bmv_aud_decode_frame(AVCodecContext *avctx, void *data, + int *got_frame_ptr, AVPacket *avpkt) { + BMVAudioDecContext *c = avctx->priv_data; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; int blocks = 0, total_blocks, i; - int out_size; - int16_t *output_samples = data; + int ret; + int16_t *output_samples; int scale[2]; total_blocks = *buf++; @@ -318,11 +327,14 @@ static int bmv_aud_decode_frame(AVCodecContext *avctx, void *data, int *data_siz total_blocks * 65 + 1, buf_size); return AVERROR_INVALIDDATA; } - out_size = total_blocks * 64 * sizeof(*output_samples); - if (*data_size < out_size) { - av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n"); - return AVERROR(EINVAL); + + /* get output buffer */ + c->frame.nb_samples = total_blocks * 32; + if ((ret = avctx->get_buffer(avctx, &c->frame)) < 0) { + av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); + return ret; } + output_samples = (int16_t *)c->frame.data[0]; for (blocks = 0; blocks < total_blocks; blocks++) { uint8_t code = *buf++; @@ -335,7 +347,9 @@ static int bmv_aud_decode_frame(AVCodecContext *avctx, void *data, int *data_siz } } - *data_size = out_size; + *got_frame_ptr = 1; + *(AVFrame *)data = c->frame; + return buf_size; } @@ -354,7 +368,9 @@ AVCodec ff_bmv_audio_decoder = { .name = "bmv_audio", .type = AVMEDIA_TYPE_AUDIO, .id = CODEC_ID_BMV_AUDIO, + .priv_data_size = sizeof(BMVAudioDecContext), .init = bmv_aud_decode_init, .decode = bmv_aud_decode_frame, + .capabilities = CODEC_CAP_DR1, .long_name = NULL_IF_CONFIG_SMALL("Discworld II BMV audio"), }; diff --git a/libavcodec/bytestream.h b/libavcodec/bytestream.h index b56f6ce743..7ca36f8ad3 100644 --- a/libavcodec/bytestream.h +++ b/libavcodec/bytestream.h @@ -26,6 +26,10 @@ #include "libavutil/common.h" #include "libavutil/intreadwrite.h" +typedef struct { + const uint8_t *buffer, *buffer_end; +} GetByteContext; + #define DEF_T(type, name, bytes, read, write) \ static av_always_inline type bytestream_get_ ## name(const uint8_t **b){\ (*b) += bytes;\ @@ -34,6 +38,18 @@ static av_always_inline type bytestream_get_ ## name(const uint8_t **b){\ static av_always_inline void bytestream_put_ ##name(uint8_t **b, const type value){\ write(*b, value);\ (*b) += bytes;\ +}\ +static av_always_inline type bytestream2_get_ ## name(GetByteContext *g)\ +{\ + if (g->buffer_end - g->buffer < bytes)\ + return 0;\ + return bytestream_get_ ## name(&g->buffer);\ +}\ +static av_always_inline type bytestream2_peek_ ## name(GetByteContext *g)\ +{\ + if (g->buffer_end - g->buffer < bytes)\ + return 0;\ + return read(g->buffer);\ } #define DEF(name, bytes, read, write) \ @@ -55,6 +71,34 @@ DEF (byte, 1, AV_RB8 , AV_WB8 ) #undef DEF64 #undef DEF_T +static av_always_inline void bytestream2_init(GetByteContext *g, + const uint8_t *buf, int buf_size) +{ + g->buffer = buf; + g->buffer_end = buf + buf_size; +} + +static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g) +{ + return g->buffer_end - g->buffer; +} + +static av_always_inline void bytestream2_skip(GetByteContext *g, + unsigned int size) +{ + g->buffer += FFMIN(g->buffer_end - g->buffer, size); +} + +static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, + uint8_t *dst, + unsigned int size) +{ + int size2 = FFMIN(g->buffer_end - g->buffer, size); + memcpy(dst, g->buffer, size2); + g->buffer += size2; + return size2; +} + static av_always_inline unsigned int bytestream_get_buffer(const uint8_t **b, uint8_t *dst, unsigned int size) { memcpy(dst, *b, size); diff --git a/libavcodec/cljr.c b/libavcodec/cljr.c index 7ae3e7eeeb..f86d85028d 100644 --- a/libavcodec/cljr.c +++ b/libavcodec/cljr.c @@ -61,7 +61,12 @@ static int decode_frame(AVCodecContext *avctx, if (p->data[0]) avctx->release_buffer(avctx, p); - if (buf_size / avctx->height < avctx->width) { + if (avctx->height <= 0 || avctx->width <= 0) { + av_log(avctx, AV_LOG_ERROR, "Invalid width or height\n"); + return AVERROR_INVALIDDATA; + } + + if (buf_size < avctx->height * avctx->width) { av_log(avctx, AV_LOG_ERROR, "Resolution larger than buffer size. Invalid header?\n"); return AVERROR_INVALIDDATA; @@ -82,10 +87,10 @@ static int decode_frame(AVCodecContext *avctx, uint8_t *cb = &a->picture.data[1][y * a->picture.linesize[1]]; uint8_t *cr = &a->picture.data[2][y * a->picture.linesize[2]]; for (x = 0; x < avctx->width; x += 4) { - luma[3] = get_bits(&gb, 5) << 3; - luma[2] = get_bits(&gb, 5) << 3; - luma[1] = get_bits(&gb, 5) << 3; - luma[0] = get_bits(&gb, 5) << 3; + luma[3] = (get_bits(&gb, 5)*33) >> 2; + luma[2] = (get_bits(&gb, 5)*33) >> 2; + luma[1] = (get_bits(&gb, 5)*33) >> 2; + luma[0] = (get_bits(&gb, 5)*33) >> 2; luma += 4; *(cb++) = get_bits(&gb, 6) << 2; *(cr++) = get_bits(&gb, 6) << 2; @@ -156,13 +161,13 @@ static int encode_frame(AVCodecContext *avctx, unsigned char *buf, case 1: dither = dither * 1664525 + 1013904223; break; case 2: dither = ordered_dither[ y&1 ][ (x>>2)&1 ];break; } - put_bits(&pb, 5, (luma[3] + (dither>>29) ) >> 3); - put_bits(&pb, 5, (luma[2] + ((dither>>26)&7)) >> 3); - put_bits(&pb, 5, (luma[1] + ((dither>>23)&7)) >> 3); - put_bits(&pb, 5, (luma[0] + ((dither>>20)&7)) >> 3); + put_bits(&pb, 5, (249*(luma[3] + (dither>>29) )) >> 11); + put_bits(&pb, 5, (249*(luma[2] + ((dither>>26)&7))) >> 11); + put_bits(&pb, 5, (249*(luma[1] + ((dither>>23)&7))) >> 11); + put_bits(&pb, 5, (249*(luma[0] + ((dither>>20)&7))) >> 11); luma += 4; - put_bits(&pb, 6, (*(cb++) + ((dither>>18)&3)) >> 2); - put_bits(&pb, 6, (*(cr++) + ((dither>>16)&3)) >> 2); + put_bits(&pb, 6, (253*(*(cb++) + ((dither>>18)&3))) >> 10); + put_bits(&pb, 6, (253*(*(cr++) + ((dither>>16)&3))) >> 10); } } diff --git a/libavcodec/dnxhdenc.c b/libavcodec/dnxhdenc.c index 7021a70650..13795cb0e1 100644 --- a/libavcodec/dnxhdenc.c +++ b/libavcodec/dnxhdenc.c @@ -220,7 +220,7 @@ static int dnxhd_init_qmat(DNXHDEncContext *ctx, int lbias, int cbias) static int dnxhd_init_rc(DNXHDEncContext *ctx) { - FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_rc, 8160*ctx->m.avctx->qmax*sizeof(RCEntry), fail); + FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_rc, 8160*(ctx->m.avctx->qmax + 1)*sizeof(RCEntry), fail); if (ctx->m.avctx->mb_decision != FF_MB_DECISION_RD) FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_cmp, ctx->m.mb_num*sizeof(RCCMPEntry), fail); diff --git a/libavcodec/dpcm.c b/libavcodec/dpcm.c index b96461984b..5f186ebd0d 100644 --- a/libavcodec/dpcm.c +++ b/libavcodec/dpcm.c @@ -288,7 +288,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, } case CODEC_ID_SOL_DPCM: if (avctx->codec_tag != 3) { - uint8_t *output_samples_u8 = data; + uint8_t *output_samples_u8 = output_samples; while (buf < buf_end) { uint8_t n = *buf++; diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c index 4c13cb3ca4..593796d33c 100644 --- a/libavcodec/dsputil.c +++ b/libavcodec/dsputil.c @@ -1918,7 +1918,7 @@ void ff_set_cmp(DSPContext* c, me_cmp_func *cmp, int type){ static void add_bytes_c(uint8_t *dst, uint8_t *src, int w){ long i; - for(i=0; i<=w-sizeof(long); i+=sizeof(long)){ + for(i=0; i<=w-(int)sizeof(long); i+=sizeof(long)){ long a = *(long*)(src+i); long b = *(long*)(dst+i); *(long*)(dst+i) = ((a&pb_7f) + (b&pb_7f)) ^ ((a^b)&pb_80); @@ -1943,7 +1943,7 @@ static void diff_bytes_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){ } }else #endif - for(i=0; i<=w-sizeof(long); i+=sizeof(long)){ + for(i=0; i<=w-(int)sizeof(long); i+=sizeof(long)){ long a = *(long*)(src1+i); long b = *(long*)(src2+i); *(long*)(dst+i) = ((a|pb_80) - (b&pb_7f)) ^ ((a^b^pb_80)&pb_80); diff --git a/libavcodec/dv.c b/libavcodec/dv.c index 787bd6511e..a05928801d 100644 --- a/libavcodec/dv.c +++ b/libavcodec/dv.c @@ -37,7 +37,7 @@ * @file * DV codec. */ -#define ALT_BITSTREAM_READER + #include "libavutil/pixdesc.h" #include "avcodec.h" #include "dsputil.h" diff --git a/libavcodec/dxva2_internal.h b/libavcodec/dxva2_internal.h index 23d4d87522..fcf45bc664 100644 --- a/libavcodec/dxva2_internal.h +++ b/libavcodec/dxva2_internal.h @@ -25,7 +25,14 @@ #define _WIN32_WINNT 0x0600 #define COBJMACROS + +#include "config.h" + #include "dxva2.h" +#if HAVE_DXVA_H +#include +#endif + #include "avcodec.h" #include "mpegvideo.h" diff --git a/libavcodec/eamad.c b/libavcodec/eamad.c index 1f6282394e..40fdb37670 100644 --- a/libavcodec/eamad.c +++ b/libavcodec/eamad.c @@ -119,7 +119,7 @@ static inline void idct_put(MadContext *t, DCTELEM *block, int mb_x, int mb_y, i } } -static inline void decode_block_intra(MadContext * t, DCTELEM * block) +static inline int decode_block_intra(MadContext * t, DCTELEM * block) { MpegEncContext *s = &t->s; int level, i, j, run; @@ -170,13 +170,14 @@ static inline void decode_block_intra(MadContext * t, DCTELEM * block) } if (i > 63) { av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); - return; + return -1; } block[j] = level; } CLOSE_READER(re, &s->gb); } + return 0; } static int decode_motion(GetBitContext *gb) @@ -190,7 +191,7 @@ static int decode_motion(GetBitContext *gb) return value; } -static void decode_mb(MadContext *t, int inter) +static int decode_mb(MadContext *t, int inter) { MpegEncContext *s = &t->s; int mv_map = 0; @@ -215,10 +216,12 @@ static void decode_mb(MadContext *t, int inter) comp_block(t, s->mb_x, s->mb_y, j, mv_x, mv_y, add); } else { s->dsp.clear_block(t->block); - decode_block_intra(t, t->block); + if(decode_block_intra(t, t->block) < 0) + return -1; idct_put(t, t->block, s->mb_x, s->mb_y, j); } } + return 0; } static void calc_intra_matrix(MadContext *t, int qscale) @@ -268,6 +271,8 @@ static int decode_frame(AVCodecContext *avctx, buf += 16; if (avctx->width != s->width || avctx->height != s->height) { + if((s->width * s->height)/2048*7 > buf_end-buf) + return -1; if (av_image_check_size(s->width, s->height, 0, avctx) < 0) return -1; avcodec_set_dimensions(avctx, s->width, s->height); @@ -294,7 +299,8 @@ static int decode_frame(AVCodecContext *avctx, for (s->mb_y=0; s->mb_y < (avctx->height+15)/16; s->mb_y++) for (s->mb_x=0; s->mb_x < (avctx->width +15)/16; s->mb_x++) - decode_mb(t, inter); + if(decode_mb(t, inter) < 0) + return -1; *data_size = sizeof(AVFrame); *(AVFrame*)data = t->frame; diff --git a/libavcodec/eatqi.c b/libavcodec/eatqi.c index a1ad8147dc..245c143c88 100644 --- a/libavcodec/eatqi.c +++ b/libavcodec/eatqi.c @@ -57,12 +57,15 @@ static av_cold int tqi_decode_init(AVCodecContext *avctx) return 0; } -static void tqi_decode_mb(MpegEncContext *s, DCTELEM (*block)[64]) +static int tqi_decode_mb(MpegEncContext *s, DCTELEM (*block)[64]) { int n; s->dsp.clear_blocks(block[0]); for (n=0; n<6; n++) - ff_mpeg1_decode_block_intra(s, block[n], n); + if(ff_mpeg1_decode_block_intra(s, block[n], n)<0) + return -1; + + return 0; } static inline void tqi_idct_put(TqiContext *t, DCTELEM (*block)[64]) @@ -134,7 +137,8 @@ static int tqi_decode_frame(AVCodecContext *avctx, for (s->mb_y=0; s->mb_y<(avctx->height+15)/16; s->mb_y++) for (s->mb_x=0; s->mb_x<(avctx->width+15)/16; s->mb_x++) { - tqi_decode_mb(s, t->block); + if(tqi_decode_mb(s, t->block) < 0) + break; tqi_idct_put(t, t->block); } diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c index c3034d326c..c2b4942ae6 100644 --- a/libavcodec/ffv1.c +++ b/libavcodec/ffv1.c @@ -451,7 +451,7 @@ static av_always_inline int encode_line(FFV1Context *s, int w, int run_mode=0; if(s->ac){ - if(c->bytestream_end - c->bytestream < w*20){ + if(c->bytestream_end - c->bytestream < w*35){ av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); return -1; } diff --git a/libavcodec/flacdata.c b/libavcodec/flacdata.c index 6fcbe3955a..1954f32d32 100644 --- a/libavcodec/flacdata.c +++ b/libavcodec/flacdata.c @@ -27,7 +27,7 @@ const int ff_flac_sample_rate_table[16] = 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000, 0, 0, 0, 0 }; -const int16_t ff_flac_blocksize_table[16] = { +const int32_t ff_flac_blocksize_table[16] = { 0, 192, 576<<0, 576<<1, 576<<2, 576<<3, 0, 0, 256<<0, 256<<1, 256<<2, 256<<3, 256<<4, 256<<5, 256<<6, 256<<7 }; diff --git a/libavcodec/flacdata.h b/libavcodec/flacdata.h index 96a50b9183..e2c1e5d7f2 100644 --- a/libavcodec/flacdata.h +++ b/libavcodec/flacdata.h @@ -26,6 +26,6 @@ extern const int ff_flac_sample_rate_table[16]; -extern const int16_t ff_flac_blocksize_table[16]; +extern const int32_t ff_flac_blocksize_table[16]; #endif /* AVCODEC_FLACDATA_H */ diff --git a/libavcodec/flashsv.c b/libavcodec/flashsv.c index 3861344cb7..b1e460785e 100644 --- a/libavcodec/flashsv.c +++ b/libavcodec/flashsv.c @@ -373,6 +373,10 @@ static int flashsv_decode_frame(AVCodecContext *avctx, void *data, if (has_diff) { s->diff_start = get_bits(&gb, 8); s->diff_height = get_bits(&gb, 8); + if (s->diff_start + s->diff_height > cur_blk_height) { + av_log(avctx, AV_LOG_ERROR, "Block parameters invalid\n"); + return AVERROR_INVALIDDATA; + } av_log(avctx, AV_LOG_DEBUG, "%dx%d diff start %d height %d\n", i, j, s->diff_start, s->diff_height); diff --git a/libavcodec/flicvideo.c b/libavcodec/flicvideo.c index 9111d17d82..dded6f5293 100644 --- a/libavcodec/flicvideo.c +++ b/libavcodec/flicvideo.c @@ -319,12 +319,14 @@ static int flic_decode_frame_8BPP(AVCodecContext *avctx, pixel_ptr = y_ptr; CHECK_PIXEL_PTR(0); pixel_countdown = s->avctx->width; - line_packets = buf[stream_ptr++]; - if (stream_ptr + 2 * line_packets > stream_ptr_after_chunk) + if (stream_ptr + 1 > stream_ptr_after_chunk) break; + line_packets = buf[stream_ptr++]; if (line_packets > 0) { for (i = 0; i < line_packets; i++) { /* account for the skip bytes */ + if (stream_ptr + 2 > stream_ptr_after_chunk) + break; pixel_skip = buf[stream_ptr++]; pixel_ptr += pixel_skip; pixel_countdown -= pixel_skip; @@ -497,16 +499,27 @@ static int flic_decode_frame_15_16BPP(AVCodecContext *avctx, stream_ptr += 6; /* skip the magic number */ num_chunks = AV_RL16(&buf[stream_ptr]); stream_ptr += 10; /* skip padding */ + if (frame_size > buf_size) + frame_size = buf_size; frame_size -= 16; /* iterate through the chunks */ while ((frame_size > 0) && (num_chunks > 0)) { + int stream_ptr_after_chunk; chunk_size = AV_RL32(&buf[stream_ptr]); + if (chunk_size > frame_size) { + av_log(avctx, AV_LOG_WARNING, + "Invalid chunk_size = %u > frame_size = %u\n", chunk_size, frame_size); + chunk_size = frame_size; + } + stream_ptr_after_chunk = stream_ptr + chunk_size; + stream_ptr += 4; chunk_type = AV_RL16(&buf[stream_ptr]); stream_ptr += 2; + switch (chunk_type) { case FLI_256_COLOR: case FLI_COLOR: @@ -523,6 +536,8 @@ static int flic_decode_frame_15_16BPP(AVCodecContext *avctx, compressed_lines = AV_RL16(&buf[stream_ptr]); stream_ptr += 2; while (compressed_lines > 0) { + if (stream_ptr + 2 > stream_ptr_after_chunk) + break; line_packets = AV_RL16(&buf[stream_ptr]); stream_ptr += 2; if (line_packets < 0) { @@ -535,6 +550,8 @@ static int flic_decode_frame_15_16BPP(AVCodecContext *avctx, pixel_countdown = s->avctx->width; for (i = 0; i < line_packets; i++) { /* account for the skip bytes */ + if (stream_ptr + 2 > stream_ptr_after_chunk) + break; pixel_skip = buf[stream_ptr++]; pixel_ptr += (pixel_skip*2); /* Pixel is 2 bytes wide */ pixel_countdown -= pixel_skip; @@ -549,6 +566,8 @@ static int flic_decode_frame_15_16BPP(AVCodecContext *avctx, pixel_ptr += 2; } } else { + if (stream_ptr + 2*byte_run > stream_ptr_after_chunk) + break; CHECK_PIXEL_PTR(2 * byte_run); for (j = 0; j < byte_run; j++, pixel_countdown--) { *((signed short*)(&pixels[pixel_ptr])) = AV_RL16(&buf[stream_ptr]); @@ -584,6 +603,8 @@ static int flic_decode_frame_15_16BPP(AVCodecContext *avctx, pixel_countdown = (s->avctx->width * 2); while (pixel_countdown > 0) { + if (stream_ptr + 1 > stream_ptr_after_chunk) + break; byte_run = (signed char)(buf[stream_ptr++]); if (byte_run > 0) { palette_idx1 = buf[stream_ptr++]; @@ -597,6 +618,8 @@ static int flic_decode_frame_15_16BPP(AVCodecContext *avctx, } } else { /* copy bytes if byte_run < 0 */ byte_run = -byte_run; + if (stream_ptr + byte_run > stream_ptr_after_chunk) + break; CHECK_PIXEL_PTR(byte_run); for (j = 0; j < byte_run; j++) { palette_idx1 = buf[stream_ptr++]; @@ -636,6 +659,8 @@ static int flic_decode_frame_15_16BPP(AVCodecContext *avctx, pixel_countdown = s->avctx->width; /* Width is in pixels, not bytes */ while (pixel_countdown > 0) { + if (stream_ptr + 1 > stream_ptr_after_chunk) + break; byte_run = (signed char)(buf[stream_ptr++]); if (byte_run > 0) { pixel = AV_RL16(&buf[stream_ptr]); @@ -651,6 +676,8 @@ static int flic_decode_frame_15_16BPP(AVCodecContext *avctx, } } else { /* copy pixels if byte_run < 0 */ byte_run = -byte_run; + if (stream_ptr + 2 * byte_run > stream_ptr_after_chunk) + break; CHECK_PIXEL_PTR(2 * byte_run); for (j = 0; j < byte_run; j++) { *((signed short*)(&pixels[pixel_ptr])) = AV_RL16(&buf[stream_ptr]); diff --git a/libavcodec/get_bits.h b/libavcodec/get_bits.h index 3b09dfd285..ba5aa0bc57 100644 --- a/libavcodec/get_bits.h +++ b/libavcodec/get_bits.h @@ -35,32 +35,30 @@ #include "libavutil/log.h" #include "mathops.h" -#if defined(ALT_BITSTREAM_READER_LE) && !defined(ALT_BITSTREAM_READER) -# define ALT_BITSTREAM_READER -#endif - -#if !defined(A32_BITSTREAM_READER) && !defined(ALT_BITSTREAM_READER) -# if ARCH_ARM && !HAVE_FAST_UNALIGNED -# define A32_BITSTREAM_READER -# else -# define ALT_BITSTREAM_READER -//#define A32_BITSTREAM_READER -# endif +/* + * Safe bitstream reading: + * optionally, the get_bits API can check to ensure that we + * don't read past input buffer boundaries. This is protected + * with CONFIG_SAFE_BITSTREAM_READER at the global level, and + * then below that with UNCHECKED_BITSTREAM_READER at the per- + * decoder level. This means that decoders that check internally + * can "#define UNCHECKED_BITSTREAM_READER 1" to disable + * overread checks. + * Boundary checking causes a minor performance penalty so for + * applications that won't want/need this, it can be disabled + * globally using "#define CONFIG_SAFE_BITSTREAM_READER 0". + */ +#ifndef UNCHECKED_BITSTREAM_READER +#define UNCHECKED_BITSTREAM_READER !CONFIG_SAFE_BITSTREAM_READER #endif /* bit input */ /* buffer, buffer_end and size_in_bits must be present and used by every reader */ typedef struct GetBitContext { const uint8_t *buffer, *buffer_end; -#ifdef ALT_BITSTREAM_READER int index; -#elif defined A32_BITSTREAM_READER - uint32_t *buffer_ptr; - uint32_t cache0; - uint32_t cache1; - int bit_count; -#endif int size_in_bits; + int size_in_bits_plus8; } GetBitContext; #define VLC_TYPE int16_t @@ -122,8 +120,11 @@ LAST_SKIP_BITS(name, gb, num) for examples see get_bits, show_bits, skip_bits, get_vlc */ -#ifdef ALT_BITSTREAM_READER +#ifdef LONG_BITSTREAM_READER +# define MIN_CACHE_BITS 32 +#else # define MIN_CACHE_BITS 25 +#endif # define OPEN_READER(name, gb) \ unsigned int name##_index = (gb)->index; \ @@ -132,19 +133,34 @@ for examples see get_bits, show_bits, skip_bits, get_vlc # define CLOSE_READER(name, gb) (gb)->index = name##_index # ifdef ALT_BITSTREAM_READER_LE +# ifdef LONG_BITSTREAM_READER +# define UPDATE_CACHE(name, gb) \ + name##_cache = AV_RL64((gb)->buffer+(name##_index>>3)) >> (name##_index&0x07) +# else # define UPDATE_CACHE(name, gb) \ name##_cache = AV_RL32(((const uint8_t *)(gb)->buffer)+(name##_index>>3)) >> (name##_index&0x07) +# endif # define SKIP_CACHE(name, gb, num) name##_cache >>= (num) # else +# ifdef LONG_BITSTREAM_READER +# define UPDATE_CACHE(name, gb) \ + name##_cache = AV_RB64((gb)->buffer+(name##_index >> 3)) >> (32 - (name##_index & 0x07)) +# else # define UPDATE_CACHE(name, gb) \ name##_cache = AV_RB32(((const uint8_t *)(gb)->buffer)+(name##_index>>3)) << (name##_index&0x07) +# endif # define SKIP_CACHE(name, gb, num) name##_cache <<= (num) # endif // FIXME name? +#if UNCHECKED_BITSTREAM_READER # define SKIP_COUNTER(name, gb, num) name##_index += (num) +#else +# define SKIP_COUNTER(name, gb, num) \ + name##_index = FFMIN((gb)->size_in_bits_plus8, name##_index + (num)) +#endif # define SKIP_BITS(name, gb, num) do { \ SKIP_CACHE(name, gb, num); \ @@ -171,83 +187,13 @@ static inline int get_bits_count(const GetBitContext *s){ } static inline void skip_bits_long(GetBitContext *s, int n){ +#if UNCHECKED_BITSTREAM_READER s->index += n; -} - -#elif defined A32_BITSTREAM_READER - -# define MIN_CACHE_BITS 32 - -# define OPEN_READER(name, gb) \ - int name##_bit_count = (gb)->bit_count; \ - uint32_t name##_cache0 = (gb)->cache0; \ - uint32_t name##_cache1 = (gb)->cache1; \ - uint32_t *name##_buffer_ptr = (gb)->buffer_ptr - -# define CLOSE_READER(name, gb) do { \ - (gb)->bit_count = name##_bit_count; \ - (gb)->cache0 = name##_cache0; \ - (gb)->cache1 = name##_cache1; \ - (gb)->buffer_ptr = name##_buffer_ptr; \ - } while (0) - -# define UPDATE_CACHE(name, gb) do { \ - if(name##_bit_count > 0){ \ - const uint32_t next = av_be2ne32(*name##_buffer_ptr); \ - name##_cache0 |= NEG_USR32(next, name##_bit_count); \ - name##_cache1 |= next << name##_bit_count; \ - name##_buffer_ptr++; \ - name##_bit_count -= 32; \ - } \ - } while (0) - -#if ARCH_X86 -# define SKIP_CACHE(name, gb, num) \ - __asm__("shldl %2, %1, %0 \n\t" \ - "shll %2, %1 \n\t" \ - : "+r" (name##_cache0), "+r" (name##_cache1) \ - : "Ic" ((uint8_t)(num))) #else -# define SKIP_CACHE(name, gb, num) do { \ - name##_cache0 <<= (num); \ - name##_cache0 |= NEG_USR32(name##_cache1,num); \ - name##_cache1 <<= (num); \ - } while (0) + s->index += av_clip(n, -s->index, s->size_in_bits_plus8 - s->index); #endif - -# define SKIP_COUNTER(name, gb, num) name##_bit_count += (num) - -# define SKIP_BITS(name, gb, num) do { \ - SKIP_CACHE(name, gb, num); \ - SKIP_COUNTER(name, gb, num); \ - } while (0) - -# define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num) -# define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num) - -# define SHOW_UBITS(name, gb, num) NEG_USR32(name##_cache0, num) - -# define SHOW_SBITS(name, gb, num) NEG_SSR32(name##_cache0, num) - -# define GET_CACHE(name, gb) name##_cache0 - -static inline int get_bits_count(const GetBitContext *s) { - return ((uint8_t*)s->buffer_ptr - s->buffer)*8 - 32 + s->bit_count; } -static inline void skip_bits_long(GetBitContext *s, int n){ - OPEN_READER(re, s); - re_bit_count += n; - re_buffer_ptr += re_bit_count>>5; - re_bit_count &= 31; - re_cache0 = av_be2ne32(re_buffer_ptr[-1]) << re_bit_count; - re_cache1 = 0; - UPDATE_CACHE(re, s); - CLOSE_READER(re, s); -} - -#endif - /** * read mpeg1 dc style vlc (sign bit + mantisse with no MSB). * if MSB not set it is negative @@ -309,7 +255,6 @@ static inline void skip_bits(GetBitContext *s, int n){ } static inline unsigned int get_bits1(GetBitContext *s){ -#ifdef ALT_BITSTREAM_READER unsigned int index = s->index; uint8_t result = s->buffer[index>>3]; #ifdef ALT_BITSTREAM_READER_LE @@ -319,13 +264,13 @@ static inline unsigned int get_bits1(GetBitContext *s){ result <<= index & 7; result >>= 8 - 1; #endif - index++; +#if !UNCHECKED_BITSTREAM_READER + if (s->index < s->size_in_bits_plus8) +#endif + index++; s->index = index; return result; -#else - return get_bits(s, 1); -#endif } static inline unsigned int show_bits1(GetBitContext *s){ @@ -399,14 +344,9 @@ static inline void init_get_bits(GetBitContext *s, s->buffer = buffer; s->size_in_bits = bit_size; + s->size_in_bits_plus8 = bit_size + 8; s->buffer_end = buffer + buffer_size; -#ifdef ALT_BITSTREAM_READER s->index = 0; -#elif defined A32_BITSTREAM_READER - s->buffer_ptr = (uint32_t*)((intptr_t)buffer & ~3); - s->bit_count = 32 + 8*((intptr_t)buffer & 3); - skip_bits_long(s, 0); -#endif } static inline void align_get_bits(GetBitContext *s) diff --git a/libavcodec/golomb.h b/libavcodec/golomb.h index d92bc40ee7..638357b470 100644 --- a/libavcodec/golomb.h +++ b/libavcodec/golomb.h @@ -123,7 +123,7 @@ static inline int svq3_get_ue_golomb(GetBitContext *gb){ }else{ int ret = 1; - while (1) { + do { buf >>= 32 - 8; LAST_SKIP_BITS(re, gb, FFMIN(ff_interleaved_golomb_vlc_len[buf], 8)); @@ -135,7 +135,7 @@ static inline int svq3_get_ue_golomb(GetBitContext *gb){ ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf]; UPDATE_CACHE(re, gb); buf = GET_CACHE(re, gb); - } + } while(ret<0x8000000U); CLOSE_READER(re, gb); return ret - 1; @@ -302,7 +302,7 @@ static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, int }else{ int i; for(i=0; SHOW_UBITS(re, gb, 1) == 0; i++){ - if (get_bits_left(gb)<=0) + if (gb->size_in_bits <= re_index) return -1; LAST_SKIP_BITS(re, gb, 1); UPDATE_CACHE(re, gb); diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c index dfb055b930..830eec0e95 100644 --- a/libavcodec/h263dec.c +++ b/libavcodec/h263dec.c @@ -25,6 +25,8 @@ * H.263 decoder. */ +#define UNCHECKED_BITSTREAM_READER 1 + #include "libavutil/cpu.h" #include "internal.h" #include "avcodec.h" diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 7daca10c02..310635f9a8 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -25,6 +25,8 @@ * @author Michael Niedermayer */ +#define UNCHECKED_BITSTREAM_READER 1 + #include "libavutil/imgutils.h" #include "libavutil/opt.h" #include "internal.h" @@ -1324,6 +1326,7 @@ int ff_h264_frame_start(H264Context *h){ * See decode_nal_units(). */ s->current_picture_ptr->f.key_frame = 0; + s->current_picture_ptr->sync = 0; s->current_picture_ptr->mmco_reset= 0; assert(s->linesize && s->uvlinesize); @@ -1815,7 +1818,7 @@ static av_always_inline void hl_decode_mb_predict_luma(H264Context *h, int mb_ty idct_dc_add(ptr, h->mb + (i*16+p*256 << pixel_shift), linesize); else idct_add (ptr, h->mb + (i*16+p*256 << pixel_shift), linesize); - }else + }else if(CONFIG_SVQ3_DECODER) ff_svq3_add_idct_c(ptr, h->mb + i*16+p*256, linesize, qscale, 0); } } @@ -1835,7 +1838,7 @@ static av_always_inline void hl_decode_mb_predict_luma(H264Context *h, int mb_ty dctcoef_set(h->mb+(p*256 << pixel_shift), pixel_shift, dc_mapping[i], dctcoef_get(h->mb_luma_dc[p], pixel_shift, i)); } } - }else + }else if(CONFIG_SVQ3_DECODER) ff_svq3_luma_dc_dequant_idct_c(h->mb+p*256, h->mb_luma_dc[p], qscale); } } @@ -1879,7 +1882,7 @@ static av_always_inline void hl_decode_mb_idct_luma(H264Context *h, int mb_type, } } } - }else{ + }else if(CONFIG_SVQ3_DECODER) { for(i=0; i<16; i++){ if(h->non_zero_count_cache[ scan8[i+p*16] ] || h->mb[i*16+p*256]){ //FIXME benchmark weird rule, & below uint8_t * const ptr= dest_y + block_offset[i]; @@ -3776,6 +3779,8 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ int nals_needed=0; ///< number of NALs that need decoding before the next frame thread starts int nal_index; + h->nal_unit_type= 0; + h->max_contexts = (HAVE_THREADS && (s->avctx->active_thread_type&FF_THREAD_SLICE)) ? avctx->thread_count : 1; if(!(s->flags2 & CODEC_FLAG2_CHUNKS)){ h->current_slice = 0; @@ -3798,7 +3803,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ int err; if(buf_index >= next_avc) { - if(buf_index >= buf_size) break; + if (buf_index >= buf_size - h->nal_length_size) break; nalsize = 0; for(i = 0; i < h->nal_length_size; i++) nalsize = (nalsize << 8) | buf[buf_index++]; @@ -3839,7 +3844,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ bit_length= !dst_length ? 0 : (8*dst_length - ff_h264_decode_rbsp_trailing(h, ptr + dst_length - 1)); if(s->avctx->debug&FF_DEBUG_STARTCODE){ - av_log(h->s.avctx, AV_LOG_DEBUG, "NAL %d/%d at %d/%d length %d\n", hx->nal_unit_type, hx->nal_ref_idc, buf_index, buf_size, dst_length); + av_log(h->s.avctx, AV_LOG_DEBUG, "NAL %d/%d at %d/%d length %d pass %d\n", hx->nal_unit_type, hx->nal_ref_idc, buf_index, buf_size, dst_length, pass); } if (h->is_avc && (nalsize != consumed) && nalsize){ @@ -3876,7 +3881,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ switch(hx->nal_unit_type){ case NAL_IDR_SLICE: if (h->nal_unit_type != NAL_IDR_SLICE) { - av_log(h->s.avctx, AV_LOG_ERROR, "Invalid mix of idr and non-idr slices"); + av_log(h->s.avctx, AV_LOG_ERROR, "Invalid mix of idr and non-idr slices\n"); return -1; } idr(h); //FIXME ensure we don't loose some frames if there is reordering @@ -3890,7 +3895,8 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ break; if ( h->sei_recovery_frame_cnt >= 0 - && ((h->recovery_frame - h->frame_num) & ((1 << h->sps.log2_max_frame_num)-1)) > h->sei_recovery_frame_cnt) { + && ( h->recovery_frame<0 + || ((h->recovery_frame - h->frame_num) & ((1 << h->sps.log2_max_frame_num)-1)) > h->sei_recovery_frame_cnt)) { h->recovery_frame = (h->frame_num + h->sei_recovery_frame_cnt) % (1 << h->sps.log2_max_frame_num); } @@ -3899,13 +3905,13 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ (hx->nal_unit_type == NAL_IDR_SLICE); if (h->recovery_frame == h->frame_num) { - h->sync |= 1; + s->current_picture_ptr->sync |= 1; h->recovery_frame = -1; } h->sync |= !!s->current_picture_ptr->f.key_frame; h->sync |= 3*!!(s->flags2 & CODEC_FLAG2_SHOW_ALL); - s->current_picture_ptr->sync = h->sync; + s->current_picture_ptr->sync |= h->sync; if (h->current_slice == 1) { if(!(s->flags2 & CODEC_FLAG2_CHUNKS)) { @@ -4043,15 +4049,15 @@ static int decode_frame(AVCodecContext *avctx, MpegEncContext *s = &h->s; AVFrame *pict = data; int buf_index; + Picture *out; + int i, out_idx; s->flags= avctx->flags; s->flags2= avctx->flags2; /* end of stream, output what is still in the buffers */ - out: if (buf_size == 0) { - Picture *out; - int i, out_idx; + out: s->current_picture_ptr = NULL; @@ -4072,24 +4078,45 @@ static int decode_frame(AVCodecContext *avctx, *pict= *(AVFrame*)out; } - return 0; + return buf_size; } - if(h->is_avc && buf_size >= 9 && AV_RB32(buf)==0x0164001F && buf[5] && buf[8]==0x67) + if(h->is_avc && buf_size >= 9 && buf[0]==1 && buf[2]==0 && (buf[4]&0xFC)==0xFC && (buf[5]&0x1F) && buf[8]==0x67){ + int cnt= buf[5]&0x1f; + uint8_t *p= buf+6; + while(cnt--){ + int nalsize= AV_RB16(p) + 2; + if(nalsize > buf_size - (p-buf) || p[2]!=0x67) + goto not_extra; + p += nalsize; + } + cnt = *(p++); + if(!cnt) + goto not_extra; + while(cnt--){ + int nalsize= AV_RB16(p) + 2; + if(nalsize > buf_size - (p-buf) || p[2]!=0x68) + goto not_extra; + p += nalsize; + } + return ff_h264_decode_extradata(h, buf, buf_size); + } +not_extra: buf_index=decode_nal_units(h, buf, buf_size); if(buf_index < 0) return -1; if (!s->current_picture_ptr && h->nal_unit_type == NAL_END_SEQUENCE) { - buf_size = 0; + av_assert0(buf_index <= buf_size); + buf_size = buf_index; goto out; } if(!(s->flags2 & CODEC_FLAG2_CHUNKS) && !s->current_picture_ptr){ if (avctx->skip_frame >= AVDISCARD_NONREF || buf_size >= 4 && !memcmp("Q264", buf, 4)) - return 0; + return buf_size; av_log(avctx, AV_LOG_ERROR, "no frame!\n"); return -1; } @@ -4101,11 +4128,9 @@ static int decode_frame(AVCodecContext *avctx, field_end(h, 0); *data_size = 0; /* Wait for second field. */ - if (h->next_output_pic && h->next_output_pic->sync) { - if(h->sync>1 || h->next_output_pic->f.pict_type != AV_PICTURE_TYPE_B){ + if (h->next_output_pic && (h->next_output_pic->sync || h->sync>1)) { *data_size = sizeof(AVFrame); *pict = *(AVFrame*)h->next_output_pic; - } } } diff --git a/libavcodec/h264_cabac.c b/libavcodec/h264_cabac.c index 31c2658a6b..f5f9be4a43 100644 --- a/libavcodec/h264_cabac.c +++ b/libavcodec/h264_cabac.c @@ -26,6 +26,7 @@ */ #define CABAC 1 +#define UNCHECKED_BITSTREAM_READER 1 #include "internal.h" #include "dsputil.h" diff --git a/libavcodec/h264_cavlc.c b/libavcodec/h264_cavlc.c index b0dc999132..b2acdc18f3 100644 --- a/libavcodec/h264_cavlc.c +++ b/libavcodec/h264_cavlc.c @@ -26,6 +26,7 @@ */ #define CABAC 0 +#define UNCHECKED_BITSTREAM_READER 1 #include "internal.h" #include "avcodec.h" @@ -707,7 +708,7 @@ int ff_h264_decode_mb_cavlc(H264Context *h){ down the code */ if(h->slice_type_nos != AV_PICTURE_TYPE_I){ if(s->mb_skip_run==-1) - s->mb_skip_run= get_ue_golomb(&s->gb); + s->mb_skip_run= get_ue_golomb_long(&s->gb); if (s->mb_skip_run--) { if(FRAME_MBAFF && (s->mb_y&1) == 0){ diff --git a/libavcodec/h264_mp4toannexb_bsf.c b/libavcodec/h264_mp4toannexb_bsf.c index e85bdb6712..5085ecbdfd 100644 --- a/libavcodec/h264_mp4toannexb_bsf.c +++ b/libavcodec/h264_mp4toannexb_bsf.c @@ -63,6 +63,7 @@ static int h264_mp4toannexb_filter(AVBitStreamFilterContext *bsfc, int32_t nal_size; uint32_t cumul_size = 0; const uint8_t *buf_end = buf + buf_size; + int ret = AVERROR(EINVAL); /* nothing to filter */ if (!avctx->extradata || avctx->extradata_size < 6) { @@ -137,6 +138,7 @@ pps: *poutbuf_size = 0; *poutbuf = NULL; do { + ret= AVERROR(EINVAL); if (buf + ctx->length_size > buf_end) goto fail; @@ -155,15 +157,15 @@ pps: /* prepend only to the first type 5 NAL unit of an IDR picture */ if (ctx->first_idr && unit_type == 5) { - if (alloc_and_copy(poutbuf, poutbuf_size, + if ((ret=alloc_and_copy(poutbuf, poutbuf_size, avctx->extradata, avctx->extradata_size, - buf, nal_size) < 0) + buf, nal_size)) < 0) goto fail; ctx->first_idr = 0; } else { - if (alloc_and_copy(poutbuf, poutbuf_size, + if ((ret=alloc_and_copy(poutbuf, poutbuf_size, NULL, 0, - buf, nal_size) < 0) + buf, nal_size)) < 0) goto fail; if (!ctx->first_idr && unit_type == 1) ctx->first_idr = 1; @@ -178,7 +180,7 @@ pps: fail: av_freep(poutbuf); *poutbuf_size = 0; - return AVERROR(EINVAL); + return ret; } AVBitStreamFilter ff_h264_mp4toannexb_bsf = { diff --git a/libavcodec/h264_mvpred.h b/libavcodec/h264_mvpred.h index 4cf79ea161..20cc5dacd1 100644 --- a/libavcodec/h264_mvpred.h +++ b/libavcodec/h264_mvpred.h @@ -633,7 +633,7 @@ static void fill_decode_caches(H264Context *h, int mb_type){ AV_ZERO32(mv_cache[4 - 1*8]); ref_cache[4 - 1*8]= topright_type ? LIST_NOT_USED : PART_NOT_AVAILABLE; } - if(ref_cache[4 - 1*8] < 0){ + if(ref_cache[2 - 1*8] < 0 || ref_cache[4 - 1*8] < 0){ if(USES_LIST(topleft_type, list)){ const int b_xy = h->mb2b_xy[topleft_xy] + 3 + b_stride + (h->topleft_partition & 2*b_stride); const int b8_xy= 4*topleft_xy + 1 + (h->topleft_partition & 2); diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c index ee766a1f27..9d28cc3707 100644 --- a/libavcodec/h264_parser.c +++ b/libavcodec/h264_parser.c @@ -25,6 +25,8 @@ * @author Michael Niedermayer */ +#define UNCHECKED_BITSTREAM_READER 1 + #include "parser.h" #include "h264data.h" #include "golomb.h" diff --git a/libavcodec/h264_ps.c b/libavcodec/h264_ps.c index 3184cadb21..5c21d80265 100644 --- a/libavcodec/h264_ps.c +++ b/libavcodec/h264_ps.c @@ -229,7 +229,8 @@ static inline int decode_vui_parameters(H264Context *h, SPS *sps){ if(sps->nal_hrd_parameters_present_flag || sps->vcl_hrd_parameters_present_flag) get_bits1(&s->gb); /* low_delay_hrd_flag */ sps->pic_struct_present_flag = get_bits1(&s->gb); - + if(!get_bits_left(&s->gb)) + return 0; sps->bitstream_restriction_flag = get_bits1(&s->gb); if(sps->bitstream_restriction_flag){ get_bits1(&s->gb); /* motion_vectors_over_pic_boundaries_flag */ @@ -347,6 +348,10 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){ if(sps->profile_idc >= 100){ //high profile sps->chroma_format_idc= get_ue_golomb_31(&s->gb); + if (sps->chroma_format_idc > 3U) { + av_log(h->s.avctx, AV_LOG_ERROR, "chroma_format_idc %d is illegal\n", sps->chroma_format_idc); + goto fail; + } if(sps->chroma_format_idc == 3) sps->residual_color_transform_flag = get_bits1(&s->gb); sps->bit_depth_luma = get_ue_golomb(&s->gb) + 8; diff --git a/libavcodec/h264_refs.c b/libavcodec/h264_refs.c index cdc1fca1a0..0ccbe62bcb 100644 --- a/libavcodec/h264_refs.c +++ b/libavcodec/h264_refs.c @@ -516,7 +516,7 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){ if(!pic){ if(mmco[i].opcode != MMCO_SHORT2LONG || !h->long_ref[mmco[i].long_arg] || h->long_ref[mmco[i].long_arg]->frame_num != frame_num) { - av_log(h->s.avctx, AV_LOG_ERROR, "mmco: unref short failure\n"); + av_log(h->s.avctx, h->short_ref_count ? AV_LOG_ERROR : AV_LOG_DEBUG, "mmco: unref short failure\n"); err = AVERROR_INVALIDDATA; } continue; @@ -653,9 +653,10 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){ print_short_term(h); print_long_term(h); - if(err >= 0 && h->long_ref_count==0 && h->short_ref_count<=2 && h->pps.ref_count[0]<=1 && s->current_picture_ptr->f.pict_type == AV_PICTURE_TYPE_I){ - h->sync |= 1; - s->current_picture_ptr->sync |= h->sync; + if(err >= 0 && h->long_ref_count==0 && h->short_ref_count<=2 && h->pps.ref_count[0]<=2 + (s->picture_structure != PICT_FRAME) && s->current_picture_ptr->f.pict_type == AV_PICTURE_TYPE_I){ + s->current_picture_ptr->sync |= 1; + if(!h->s.avctx->has_b_frames) + h->sync = 2; } return (h->s.avctx->err_recognition & AV_EF_EXPLODE) ? err : 0; diff --git a/libavcodec/huffyuv.c b/libavcodec/huffyuv.c index 574daacc0b..c137da0e0f 100644 --- a/libavcodec/huffyuv.c +++ b/libavcodec/huffyuv.c @@ -33,6 +33,7 @@ #include "put_bits.h" #include "dsputil.h" #include "thread.h" +#include "libavutil/avassert.h" #define VLC_BITS 11 @@ -309,12 +310,13 @@ static void generate_joint_tables(HYuvContext *s){ for(i=y=0; y<256; y++){ int len0 = s->len[0][y]; int limit = VLC_BITS - len0; - if(limit <= 0) + if(limit <= 0 || !len0) continue; for(u=0; u<256; u++){ int len1 = s->len[p][u]; - if(len1 > limit) + if (len1 > limit || !len1) continue; + av_assert0(i < (1 << VLC_BITS)); len[i] = len0 + len1; bits[i] = (s->bits[0][y] << len1) + s->bits[p][u]; symbols[i] = (y<<8) + u; @@ -336,18 +338,19 @@ static void generate_joint_tables(HYuvContext *s){ for(i=0, g=-16; g<16; g++){ int len0 = s->len[p0][g&255]; int limit0 = VLC_BITS - len0; - if(limit0 < 2) + if (limit0 < 2 || !len0) continue; for(b=-16; b<16; b++){ int len1 = s->len[p1][b&255]; int limit1 = limit0 - len1; - if(limit1 < 1) + if (limit1 < 1 || !len1) continue; code = (s->bits[p0][g&255] << len1) + s->bits[p1][b&255]; for(r=-16; r<16; r++){ int len2 = s->len[2][r&255]; - if(len2 > limit1) + if (len2 > limit1 || !len2) continue; + av_assert0(i < (1 << VLC_BITS)); len[i] = len0 + len1 + len2; bits[i] = (code << len2) + s->bits[2][r&255]; if(s->decorrelate){ @@ -371,6 +374,7 @@ static void generate_joint_tables(HYuvContext *s){ static int read_huffman_tables(HYuvContext *s, const uint8_t *src, int length){ GetBitContext gb; int i; + int ret; init_get_bits(&gb, src, length*8); @@ -381,7 +385,8 @@ static int read_huffman_tables(HYuvContext *s, const uint8_t *src, int length){ return -1; } free_vlc(&s->vlc[i]); - init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0); + if ((ret = init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0)) < 0) + return ret; } generate_joint_tables(s); @@ -393,6 +398,7 @@ static int read_old_huffman_tables(HYuvContext *s){ #if 1 GetBitContext gb; int i; + int ret; init_get_bits(&gb, classic_shift_luma, sizeof(classic_shift_luma)*8); if(read_len_table(s->len[0], &gb)<0) @@ -413,7 +419,8 @@ static int read_old_huffman_tables(HYuvContext *s){ for(i=0; i<3; i++){ free_vlc(&s->vlc[i]); - init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0); + if ((ret = init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0)) < 0) + return ret; } generate_joint_tables(s); diff --git a/libavcodec/imc.c b/libavcodec/imc.c index 3919797038..d3b8bf5a12 100644 --- a/libavcodec/imc.c +++ b/libavcodec/imc.c @@ -35,7 +35,6 @@ #include #include -#define ALT_BITSTREAM_READER #include "avcodec.h" #include "get_bits.h" #include "dsputil.h" diff --git a/libavcodec/indeo3.c b/libavcodec/indeo3.c index 1bb73fe790..83c97bb96d 100644 --- a/libavcodec/indeo3.c +++ b/libavcodec/indeo3.c @@ -770,7 +770,8 @@ static int parse_bintree(Indeo3DecodeContext *ctx, AVCodecContext *avctx, /* get motion vector index and setup the pointer to the mv set */ if (!ctx->need_resync) ctx->next_cell_data = &ctx->gb.buffer[(get_bits_count(&ctx->gb) + 7) >> 3]; - curr_cell.mv_ptr = &ctx->mc_vectors[*(ctx->next_cell_data++) << 1]; + if(ctx->mc_vectors) + curr_cell.mv_ptr = &ctx->mc_vectors[*(ctx->next_cell_data++) << 1]; curr_cell.tree = 1; /* enter the VQ tree */ UPDATE_BITPOS(8); } else { /* VQ tree DATA code */ @@ -884,7 +885,8 @@ static int decode_frame_headers(Indeo3DecodeContext *ctx, AVCodecContext *avctx, ctx->height = height; free_frame_buffers(ctx); - allocate_frame_buffers(ctx, avctx); + if(allocate_frame_buffers(ctx, avctx) < 0) + return AVERROR_INVALIDDATA; avcodec_set_dimensions(avctx, width, height); } @@ -984,9 +986,7 @@ static av_cold int decode_init(AVCodecContext *avctx) dsputil_init(&ctx->dsp, avctx); - allocate_frame_buffers(ctx, avctx); - - return 0; + return allocate_frame_buffers(ctx, avctx); } diff --git a/libavcodec/indeo4.c b/libavcodec/indeo4.c new file mode 100644 index 0000000000..6763af4eb8 --- /dev/null +++ b/libavcodec/indeo4.c @@ -0,0 +1,828 @@ +/* + * Indeo Video Interactive v4 compatible decoder + * Copyright (c) 2009-2011 Maxim Poliakovski + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * Indeo Video Interactive version 4 decoder + * + * Indeo 4 data is usually transported within .avi or .mov files. + * Known FOURCCs: 'IV41' + */ + +#define ALT_BITSTREAM_READER_LE +#include "avcodec.h" +#include "get_bits.h" +#include "dsputil.h" +#include "ivi_dsp.h" +#include "ivi_common.h" +#include "indeo4data.h" + +#define IVI4_STREAM_ANALYSER 0 +#define IVI4_DEBUG_CHECKSUM 0 + +/** + * Indeo 4 frame types. + */ +enum { + FRAMETYPE_INTRA = 0, + FRAMETYPE_BIDIR1 = 1, ///< bidirectional frame + FRAMETYPE_INTER = 2, ///< non-droppable P-frame + FRAMETYPE_BIDIR = 3, ///< bidirectional frame + FRAMETYPE_INTER_NOREF = 4, ///< droppable P-frame + FRAMETYPE_NULL_FIRST = 5, ///< empty frame with no data + FRAMETYPE_NULL_LAST = 6 ///< empty frame with no data +}; + +#define IVI4_PIC_SIZE_ESC 7 + + +typedef struct { + GetBitContext gb; + AVFrame frame; + RVMapDesc rvmap_tabs[9]; ///< local corrected copy of the static rvmap tables + + uint32_t frame_num; + int frame_type; + int prev_frame_type; ///< frame type of the previous frame + uint32_t data_size; ///< size of the frame data in bytes from picture header + int is_scalable; + int transp_status; ///< transparency mode status: 1 - enabled + + IVIPicConfig pic_conf; + IVIPlaneDesc planes[3]; ///< color planes + + int buf_switch; ///< used to switch between three buffers + int dst_buf; ///< buffer index for the currently decoded frame + int ref_buf; ///< inter frame reference buffer index + + IVIHuffTab mb_vlc; ///< current macroblock table descriptor + IVIHuffTab blk_vlc; ///< current block table descriptor + + uint16_t checksum; ///< frame checksum + + uint8_t rvmap_sel; + uint8_t in_imf; + uint8_t in_q; ///< flag for explicitly stored quantiser delta + uint8_t pic_glob_quant; + uint8_t unknown1; + +#if IVI4_STREAM_ANALYSER + uint8_t has_b_frames; + uint8_t has_transp; + uint8_t uses_tiling; + uint8_t uses_haar; + uint8_t uses_fullpel; +#endif +} IVI4DecContext; + + +struct { + InvTransformPtr *inv_trans; + DCTransformPtr *dc_trans; + int is_2d_trans; +} transforms[18] = { + { ff_ivi_inverse_haar_8x8, ff_ivi_dc_haar_2d, 1 }, + { NULL, NULL, 0 }, /* inverse Haar 8x1 */ + { NULL, NULL, 0 }, /* inverse Haar 1x8 */ + { ff_ivi_put_pixels_8x8, ff_ivi_put_dc_pixel_8x8, 1 }, + { ff_ivi_inverse_slant_8x8, ff_ivi_dc_slant_2d, 1 }, + { ff_ivi_row_slant8, ff_ivi_dc_row_slant, 1 }, + { ff_ivi_col_slant8, ff_ivi_dc_col_slant, 1 }, + { NULL, NULL, 0 }, /* inverse DCT 8x8 */ + { NULL, NULL, 0 }, /* inverse DCT 8x1 */ + { NULL, NULL, 0 }, /* inverse DCT 1x8 */ + { NULL, NULL, 0 }, /* inverse Haar 4x4 */ + { ff_ivi_inverse_slant_4x4, ff_ivi_dc_slant_2d, 1 }, + { NULL, NULL, 0 }, /* no transform 4x4 */ + { NULL, NULL, 0 }, /* inverse Haar 1x4 */ + { NULL, NULL, 0 }, /* inverse Haar 4x1 */ + { NULL, NULL, 0 }, /* inverse slant 1x4 */ + { NULL, NULL, 0 }, /* inverse slant 4x1 */ + { NULL, NULL, 0 }, /* inverse DCT 4x4 */ +}; + +/** + * Decode subdivision of a plane. + * This is a simplified version that checks for two supported subdivisions: + * - 1 wavelet band per plane, size factor 1:1, code pattern: 3 + * - 4 wavelet bands per plane, size factor 1:4, code pattern: 2,3,3,3,3 + * Anything else is either unsupported or corrupt. + * + * @param[in,out] gb the GetBit context + * @return number of wavelet bands or 0 on error + */ +static int decode_plane_subdivision(GetBitContext *gb) +{ + int i; + + switch (get_bits(gb, 2)) { + case 3: + return 1; + case 2: + for (i = 0; i < 4; i++) + if (get_bits(gb, 2) != 3) + return 0; + return 4; + default: + return 0; + } +} + +static inline int scale_tile_size(int def_size, int size_factor) +{ + return (size_factor == 15 ? def_size : (size_factor + 1) << 5); +} + +/** + * Decode Indeo 4 picture header. + * + * @param[in,out] ctx pointer to the decoder context + * @param[in] avctx pointer to the AVCodecContext + * @return result code: 0 = OK, negative number = error + */ +static int decode_pic_hdr(IVI4DecContext *ctx, AVCodecContext *avctx) +{ + int pic_size_indx, val, i, p; + IVIPicConfig pic_conf; + + if (get_bits(&ctx->gb, 18) != 0x3FFF8) { + av_log(avctx, AV_LOG_ERROR, "Invalid picture start code!\n"); + return AVERROR_INVALIDDATA; + } + + ctx->prev_frame_type = ctx->frame_type; + ctx->frame_type = get_bits(&ctx->gb, 3); + if (ctx->frame_type == 7) { + av_log(avctx, AV_LOG_ERROR, "Invalid frame type: %d\n", ctx->frame_type); + return AVERROR_INVALIDDATA; + } + +#if IVI4_STREAM_ANALYSER + if ( ctx->frame_type == FRAMETYPE_BIDIR1 + || ctx->frame_type == FRAMETYPE_BIDIR) + ctx->has_b_frames = 1; +#endif + + ctx->transp_status = get_bits1(&ctx->gb); +#if IVI4_STREAM_ANALYSER + if (ctx->transp_status) { + ctx->has_transp = 1; + } +#endif + + /* unknown bit: Mac decoder ignores this bit, XANIM returns error */ + if (get_bits1(&ctx->gb)) { + av_log(avctx, AV_LOG_ERROR, "Sync bit is set!\n"); + return AVERROR_INVALIDDATA; + } + + ctx->data_size = get_bits1(&ctx->gb) ? get_bits(&ctx->gb, 24) : 0; + + /* null frames don't contain anything else so we just return */ + if (ctx->frame_type >= FRAMETYPE_NULL_FIRST) { + av_dlog(avctx, "Null frame encountered!\n"); + return 0; + } + + /* Check key lock status. If enabled - ignore lock word. */ + /* Usually we have to prompt the user for the password, but */ + /* we don't do that because Indeo 4 videos can be decoded anyway */ + if (get_bits1(&ctx->gb)) { + skip_bits_long(&ctx->gb, 32); + av_dlog(avctx, "Password-protected clip!\n"); + } + + pic_size_indx = get_bits(&ctx->gb, 3); + if (pic_size_indx == IVI4_PIC_SIZE_ESC) { + pic_conf.pic_height = get_bits(&ctx->gb, 16); + pic_conf.pic_width = get_bits(&ctx->gb, 16); + } else { + pic_conf.pic_height = ivi4_common_pic_sizes[pic_size_indx * 2 + 1]; + pic_conf.pic_width = ivi4_common_pic_sizes[pic_size_indx * 2 ]; + } + + /* Decode tile dimensions. */ + if (get_bits1(&ctx->gb)) { + pic_conf.tile_height = scale_tile_size(pic_conf.pic_height, get_bits(&ctx->gb, 4)); + pic_conf.tile_width = scale_tile_size(pic_conf.pic_width, get_bits(&ctx->gb, 4)); +#if IVI4_STREAM_ANALYSER + ctx->uses_tiling = 1; +#endif + } else { + pic_conf.tile_height = pic_conf.pic_height; + pic_conf.tile_width = pic_conf.pic_width; + } + + /* Decode chroma subsampling. We support only 4:4 aka YVU9. */ + if (get_bits(&ctx->gb, 2)) { + av_log(avctx, AV_LOG_ERROR, "Only YVU9 picture format is supported!\n"); + return AVERROR_INVALIDDATA; + } + pic_conf.chroma_height = (pic_conf.pic_height + 3) >> 2; + pic_conf.chroma_width = (pic_conf.pic_width + 3) >> 2; + + /* decode subdivision of the planes */ + pic_conf.luma_bands = decode_plane_subdivision(&ctx->gb); + if (pic_conf.luma_bands) + pic_conf.chroma_bands = decode_plane_subdivision(&ctx->gb); + ctx->is_scalable = pic_conf.luma_bands != 1 || pic_conf.chroma_bands != 1; + if (ctx->is_scalable && (pic_conf.luma_bands != 4 || pic_conf.chroma_bands != 1)) { + av_log(avctx, AV_LOG_ERROR, "Scalability: unsupported subdivision! Luma bands: %d, chroma bands: %d\n", + pic_conf.luma_bands, pic_conf.chroma_bands); + return AVERROR_INVALIDDATA; + } + + /* check if picture layout was changed and reallocate buffers */ + if (ivi_pic_config_cmp(&pic_conf, &ctx->pic_conf)) { + if (ff_ivi_init_planes(ctx->planes, &pic_conf)) { + av_log(avctx, AV_LOG_ERROR, "Couldn't reallocate color planes!\n"); + return AVERROR(ENOMEM); + } + + ctx->pic_conf = pic_conf; + + /* set default macroblock/block dimensions */ + for (p = 0; p <= 2; p++) { + for (i = 0; i < (!p ? pic_conf.luma_bands : pic_conf.chroma_bands); i++) { + ctx->planes[p].bands[i].mb_size = !p ? (!ctx->is_scalable ? 16 : 8) : 4; + ctx->planes[p].bands[i].blk_size = !p ? 8 : 4; + } + } + + if (ff_ivi_init_tiles(ctx->planes, ctx->pic_conf.tile_width, + ctx->pic_conf.tile_height)) { + av_log(avctx, AV_LOG_ERROR, + "Couldn't reallocate internal structures!\n"); + return AVERROR(ENOMEM); + } + } + + ctx->frame_num = get_bits1(&ctx->gb) ? get_bits(&ctx->gb, 20) : 0; + + /* skip decTimeEst field if present */ + if (get_bits1(&ctx->gb)) + skip_bits(&ctx->gb, 8); + + /* decode macroblock and block huffman codebooks */ + if (ff_ivi_dec_huff_desc(&ctx->gb, get_bits1(&ctx->gb), IVI_MB_HUFF, &ctx->mb_vlc, avctx) || + ff_ivi_dec_huff_desc(&ctx->gb, get_bits1(&ctx->gb), IVI_BLK_HUFF, &ctx->blk_vlc, avctx)) + return AVERROR_INVALIDDATA; + + ctx->rvmap_sel = get_bits1(&ctx->gb) ? get_bits(&ctx->gb, 3) : 8; + + ctx->in_imf = get_bits1(&ctx->gb); + ctx->in_q = get_bits1(&ctx->gb); + + ctx->pic_glob_quant = get_bits(&ctx->gb, 5); + + /* TODO: ignore this parameter if unused */ + ctx->unknown1 = get_bits1(&ctx->gb) ? get_bits(&ctx->gb, 3) : 0; + + ctx->checksum = get_bits1(&ctx->gb) ? get_bits(&ctx->gb, 16) : 0; + + /* skip picture header extension if any */ + while (get_bits1(&ctx->gb)) { + av_dlog(avctx, "Pic hdr extension encountered!\n"); + val = get_bits(&ctx->gb, 8); + } + + if (get_bits1(&ctx->gb)) { + av_log(avctx, AV_LOG_ERROR, "Bad blocks bits encountered!\n"); + } + + align_get_bits(&ctx->gb); + + return 0; +} + + +/** + * Decode Indeo 4 band header. + * + * @param[in,out] ctx pointer to the decoder context + * @param[in,out] band pointer to the band descriptor + * @param[in] avctx pointer to the AVCodecContext + * @return result code: 0 = OK, negative number = error + */ +static int decode_band_hdr(IVI4DecContext *ctx, IVIBandDesc *band, + AVCodecContext *avctx) +{ + int plane, band_num, hdr_size, indx, transform_id, scan_indx; + int i; + + plane = get_bits(&ctx->gb, 2); + band_num = get_bits(&ctx->gb, 4); + if (band->plane != plane || band->band_num != band_num) { + av_log(avctx, AV_LOG_ERROR, "Invalid band header sequence!\n"); + return AVERROR_INVALIDDATA; + } + + band->is_empty = get_bits1(&ctx->gb); + if (!band->is_empty) { + hdr_size = get_bits1(&ctx->gb) ? get_bits(&ctx->gb, 16) : 4; + + band->is_halfpel = get_bits(&ctx->gb, 2); + if (band->is_halfpel >= 2) { + av_log(avctx, AV_LOG_ERROR, "Invalid/unsupported mv resolution: %d!\n", + band->is_halfpel); + return AVERROR_INVALIDDATA; + } +#if IVI4_STREAM_ANALYSER + if (!band->is_halfpel) + ctx->uses_fullpel = 1; +#endif + + band->checksum_present = get_bits1(&ctx->gb); + if (band->checksum_present) + band->checksum = get_bits(&ctx->gb, 16); + + indx = get_bits(&ctx->gb, 2); + if (indx == 3) { + av_log(avctx, AV_LOG_ERROR, "Invalid block size!\n"); + return AVERROR_INVALIDDATA; + } + band->mb_size = 16 >> indx; + band->blk_size = 8 >> (indx >> 1); + + band->inherit_mv = get_bits1(&ctx->gb); + band->inherit_qdelta = get_bits1(&ctx->gb); + + band->glob_quant = get_bits(&ctx->gb, 5); + + if (!get_bits1(&ctx->gb) || ctx->frame_type == FRAMETYPE_INTRA) { + transform_id = get_bits(&ctx->gb, 5); + if (!transforms[transform_id].inv_trans) { + av_log_ask_for_sample(avctx, "Unimplemented transform: %d!\n", transform_id); + return AVERROR_PATCHWELCOME; + } + if ((transform_id >= 7 && transform_id <= 9) || + transform_id == 17) { + av_log_ask_for_sample(avctx, "DCT transform not supported yet!\n"); + return AVERROR_PATCHWELCOME; + } + +#if IVI4_STREAM_ANALYSER + if ((transform_id >= 0 && transform_id <= 2) || transform_id == 10) + ctx->uses_haar = 1; +#endif + + band->inv_transform = transforms[transform_id].inv_trans; + band->dc_transform = transforms[transform_id].dc_trans; + band->is_2d_trans = transforms[transform_id].is_2d_trans; + + scan_indx = get_bits(&ctx->gb, 4); + if (scan_indx == 15) { + av_log(avctx, AV_LOG_ERROR, "Custom scan pattern encountered!\n"); + return AVERROR_INVALIDDATA; + } + band->scan = scan_index_to_tab[scan_indx]; + + band->quant_mat = get_bits(&ctx->gb, 5); + if (band->quant_mat == 31) { + av_log(avctx, AV_LOG_ERROR, "Custom quant matrix encountered!\n"); + return AVERROR_INVALIDDATA; + } + } + + /* decode block huffman codebook */ + if (ff_ivi_dec_huff_desc(&ctx->gb, get_bits1(&ctx->gb), IVI_BLK_HUFF, + &band->blk_vlc, avctx)) + return AVERROR_INVALIDDATA; + + /* select appropriate rvmap table for this band */ + band->rvmap_sel = get_bits1(&ctx->gb) ? get_bits(&ctx->gb, 3) : 8; + + /* decode rvmap probability corrections if any */ + band->num_corr = 0; /* there is no corrections */ + if (get_bits1(&ctx->gb)) { + band->num_corr = get_bits(&ctx->gb, 8); /* get number of correction pairs */ + if (band->num_corr > 61) { + av_log(avctx, AV_LOG_ERROR, "Too many corrections: %d\n", + band->num_corr); + return AVERROR_INVALIDDATA; + } + + /* read correction pairs */ + for (i = 0; i < band->num_corr * 2; i++) + band->corr[i] = get_bits(&ctx->gb, 8); + } + } + + if (band->blk_size == 8) { + band->intra_base = &ivi4_quant_8x8_intra[quant_index_to_tab[band->quant_mat]][0]; + band->inter_base = &ivi4_quant_8x8_inter[quant_index_to_tab[band->quant_mat]][0]; + } else { + band->intra_base = &ivi4_quant_4x4_intra[quant_index_to_tab[band->quant_mat]][0]; + band->inter_base = &ivi4_quant_4x4_inter[quant_index_to_tab[band->quant_mat]][0]; + } + + /* Indeo 4 doesn't use scale tables */ + band->intra_scale = NULL; + band->inter_scale = NULL; + + align_get_bits(&ctx->gb); + + return 0; +} + + +/** + * Decode information (block type, cbp, quant delta, motion vector) + * for all macroblocks in the current tile. + * + * @param[in,out] ctx pointer to the decoder context + * @param[in,out] band pointer to the band descriptor + * @param[in,out] tile pointer to the tile descriptor + * @param[in] avctx pointer to the AVCodecContext + * @return result code: 0 = OK, negative number = error + */ +static int decode_mb_info(IVI4DecContext *ctx, IVIBandDesc *band, + IVITile *tile, AVCodecContext *avctx) +{ + int x, y, mv_x, mv_y, mv_delta, offs, mb_offset, blks_per_mb, + mv_scale, mb_type_bits; + IVIMbInfo *mb, *ref_mb; + int row_offset = band->mb_size * band->pitch; + + mb = tile->mbs; + ref_mb = tile->ref_mbs; + offs = tile->ypos * band->pitch + tile->xpos; + + blks_per_mb = band->mb_size != band->blk_size ? 4 : 1; + mb_type_bits = ctx->frame_type == FRAMETYPE_BIDIR ? 2 : 1; + + /* scale factor for motion vectors */ + mv_scale = (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3); + mv_x = mv_y = 0; + + if (((tile->width + band->mb_size-1)/band->mb_size) * ((tile->height + band->mb_size-1)/band->mb_size) != tile->num_MBs) { + av_log(avctx, AV_LOG_ERROR, "num_MBs mismatch %d %d %d %d\n", tile->width, tile->height, band->mb_size, tile->num_MBs); + return -1; + } + + for (y = tile->ypos; y < tile->ypos + tile->height; y += band->mb_size) { + mb_offset = offs; + + for (x = tile->xpos; x < tile->xpos + tile->width; x += band->mb_size) { + mb->xpos = x; + mb->ypos = y; + mb->buf_offs = mb_offset; + + if (get_bits1(&ctx->gb)) { + if (ctx->frame_type == FRAMETYPE_INTRA) { + av_log(avctx, AV_LOG_ERROR, "Empty macroblock in an INTRA picture!\n"); + return AVERROR_INVALIDDATA; + } + mb->type = 1; /* empty macroblocks are always INTER */ + mb->cbp = 0; /* all blocks are empty */ + + mb->q_delta = 0; + if (!band->plane && !band->band_num && ctx->in_q) { + mb->q_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table, + IVI_VLC_BITS, 1); + mb->q_delta = IVI_TOSIGNED(mb->q_delta); + } + + mb->mv_x = mb->mv_y = 0; /* no motion vector coded */ + if (band->inherit_mv) { + /* motion vector inheritance */ + if (mv_scale) { + mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale); + mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale); + } else { + mb->mv_x = ref_mb->mv_x; + mb->mv_y = ref_mb->mv_y; + } + } + } else { + if (band->inherit_mv) { + mb->type = ref_mb->type; /* copy mb_type from corresponding reference mb */ + } else if (ctx->frame_type == FRAMETYPE_INTRA) { + mb->type = 0; /* mb_type is always INTRA for intra-frames */ + } else { + mb->type = get_bits(&ctx->gb, mb_type_bits); + } + + mb->cbp = get_bits(&ctx->gb, blks_per_mb); + + mb->q_delta = 0; + if (band->inherit_qdelta) { + if (ref_mb) mb->q_delta = ref_mb->q_delta; + } else if (mb->cbp || (!band->plane && !band->band_num && + ctx->in_q)) { + mb->q_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table, + IVI_VLC_BITS, 1); + mb->q_delta = IVI_TOSIGNED(mb->q_delta); + } + + if (!mb->type) { + mb->mv_x = mb->mv_y = 0; /* there is no motion vector in intra-macroblocks */ + } else { + if (band->inherit_mv) { + /* motion vector inheritance */ + if (mv_scale) { + mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale); + mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale); + } else { + mb->mv_x = ref_mb->mv_x; + mb->mv_y = ref_mb->mv_y; + } + } else { + /* decode motion vector deltas */ + mv_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table, + IVI_VLC_BITS, 1); + mv_y += IVI_TOSIGNED(mv_delta); + mv_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table, + IVI_VLC_BITS, 1); + mv_x += IVI_TOSIGNED(mv_delta); + mb->mv_x = mv_x; + mb->mv_y = mv_y; + } + } + } + + mb++; + if (ref_mb) + ref_mb++; + mb_offset += band->mb_size; + } + + offs += row_offset; + } + + align_get_bits(&ctx->gb); + + return 0; +} + + +/** + * Decode an Indeo 4 band. + * + * @param[in,out] ctx pointer to the decoder context + * @param[in,out] band pointer to the band descriptor + * @param[in] avctx pointer to the AVCodecContext + * @return result code: 0 = OK, negative number = error + */ +static int decode_band(IVI4DecContext *ctx, int plane_num, + IVIBandDesc *band, AVCodecContext *avctx) +{ + int result, i, t, pos, idx1, idx2; + IVITile *tile; + + band->buf = band->bufs[ctx->dst_buf]; + band->ref_buf = band->bufs[ctx->ref_buf]; + + result = decode_band_hdr(ctx, band, avctx); + if (result) { + av_log(avctx, AV_LOG_ERROR, "Error decoding band header\n"); + return result; + } + + if (band->is_empty) { + av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n"); + return AVERROR_INVALIDDATA; + } + + band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel]; + + /* apply corrections to the selected rvmap table if present */ + for (i = 0; i < band->num_corr; i++) { + idx1 = band->corr[i * 2]; + idx2 = band->corr[i * 2 + 1]; + FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]); + FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]); + } + + pos = get_bits_count(&ctx->gb); + + for (t = 0; t < band->num_tiles; t++) { + tile = &band->tiles[t]; + + tile->is_empty = get_bits1(&ctx->gb); + if (tile->is_empty) { + ff_ivi_process_empty_tile(avctx, band, tile, + (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3)); + av_dlog(avctx, "Empty tile encountered!\n"); + } else { + tile->data_size = ff_ivi_dec_tile_data_size(&ctx->gb); + if (!tile->data_size) { + av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n"); + return AVERROR_INVALIDDATA; + } + + result = decode_mb_info(ctx, band, tile, avctx); + if (result < 0) + break; + + result = ff_ivi_decode_blocks(&ctx->gb, band, tile); + if (result < 0 || ((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) { + av_log(avctx, AV_LOG_ERROR, "Corrupted tile data encountered!\n"); + break; + } + + pos += tile->data_size << 3; // skip to next tile + } + } + + /* restore the selected rvmap table by applying its corrections in reverse order */ + for (i = band->num_corr - 1; i >= 0; i--) { + idx1 = band->corr[i * 2]; + idx2 = band->corr[i * 2 + 1]; + FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]); + FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]); + } + +#if defined(DEBUG) && IVI4_DEBUG_CHECKSUM + if (band->checksum_present) { + uint16_t chksum = ivi_calc_band_checksum(band); + if (chksum != band->checksum) { + av_log(avctx, AV_LOG_ERROR, + "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n", + band->plane, band->band_num, band->checksum, chksum); + } + } +#endif + + align_get_bits(&ctx->gb); + + return 0; +} + + +static av_cold int decode_init(AVCodecContext *avctx) +{ + IVI4DecContext *ctx = avctx->priv_data; + + ff_ivi_init_static_vlc(); + + /* copy rvmap tables in our context so we can apply changes to them */ + memcpy(ctx->rvmap_tabs, ff_ivi_rvmap_tabs, sizeof(ff_ivi_rvmap_tabs)); + + /* Force allocation of the internal buffers */ + /* during picture header decoding. */ + ctx->pic_conf.pic_width = 0; + ctx->pic_conf.pic_height = 0; + + avctx->pix_fmt = PIX_FMT_YUV410P; + + return 0; +} + + +/** + * Rearrange decoding and reference buffers. + * + * @param[in,out] ctx pointer to the decoder context + */ +static void switch_buffers(IVI4DecContext *ctx) +{ + switch (ctx->prev_frame_type) { + case FRAMETYPE_INTRA: + case FRAMETYPE_INTER: + ctx->buf_switch ^= 1; + ctx->dst_buf = ctx->buf_switch; + ctx->ref_buf = ctx->buf_switch ^ 1; + break; + case FRAMETYPE_INTER_NOREF: + break; + } + + switch (ctx->frame_type) { + case FRAMETYPE_INTRA: + ctx->buf_switch = 0; + /* FALLTHROUGH */ + case FRAMETYPE_INTER: + ctx->dst_buf = ctx->buf_switch; + ctx->ref_buf = ctx->buf_switch ^ 1; + break; + case FRAMETYPE_INTER_NOREF: + case FRAMETYPE_NULL_FIRST: + case FRAMETYPE_NULL_LAST: + break; + } +} + + +static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, + AVPacket *avpkt) +{ + IVI4DecContext *ctx = avctx->priv_data; + const uint8_t *buf = avpkt->data; + int buf_size = avpkt->size; + int result, p, b; + + init_get_bits(&ctx->gb, buf, buf_size * 8); + + result = decode_pic_hdr(ctx, avctx); + if (result) { + av_log(avctx, AV_LOG_ERROR, "Error decoding picture header\n"); + return result; + } + + switch_buffers(ctx); + + if (ctx->frame_type < FRAMETYPE_NULL_FIRST) { + for (p = 0; p < 3; p++) { + for (b = 0; b < ctx->planes[p].num_bands; b++) { + result = decode_band(ctx, p, &ctx->planes[p].bands[b], avctx); + if (result) { + av_log(avctx, AV_LOG_ERROR, + "Error decoding band: %d, plane: %d\n", b, p); + return result; + } + } + } + } + + /* If the bidirectional mode is enabled, next I and the following P frame will */ + /* be sent together. Unfortunately the approach below seems to be the only way */ + /* to handle the B-frames mode. That's exactly the same Intel decoders do. */ + if (ctx->frame_type == FRAMETYPE_INTRA) { + while (get_bits(&ctx->gb, 8)); // skip version string + skip_bits_long(&ctx->gb, 64); // skip padding, TODO: implement correct 8-bytes alignment + if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8) + av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n"); + } + + if (ctx->frame.data[0]) + avctx->release_buffer(avctx, &ctx->frame); + + ctx->frame.reference = 0; + if ((result = avctx->get_buffer(avctx, &ctx->frame)) < 0) { + av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); + return result; + } + + if (ctx->is_scalable) { + ff_ivi_recompose_haar(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4); + } else { + ff_ivi_output_plane(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0]); + } + + ff_ivi_output_plane(&ctx->planes[2], ctx->frame.data[1], ctx->frame.linesize[1]); + ff_ivi_output_plane(&ctx->planes[1], ctx->frame.data[2], ctx->frame.linesize[2]); + + *data_size = sizeof(AVFrame); + *(AVFrame*)data = ctx->frame; + + return buf_size; +} + + +static av_cold int decode_close(AVCodecContext *avctx) +{ + IVI4DecContext *ctx = avctx->priv_data; + + ff_ivi_free_buffers(&ctx->planes[0]); + + if (ctx->frame.data[0]) + avctx->release_buffer(avctx, &ctx->frame); + +#if IVI4_STREAM_ANALYSER + if (ctx->is_scalable) + av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n"); + if (ctx->uses_tiling) + av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n"); + if (ctx->has_b_frames) + av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n"); + if (ctx->has_transp) + av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n"); + if (ctx->uses_haar) + av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n"); + if (ctx->uses_fullpel) + av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n"); +#endif + + return 0; +} + + +AVCodec ff_indeo4_decoder = { + .name = "indeo4", + .type = AVMEDIA_TYPE_VIDEO, + .id = CODEC_ID_INDEO4, + .priv_data_size = sizeof(IVI4DecContext), + .init = decode_init, + .close = decode_close, + .decode = decode_frame, + .long_name = NULL_IF_CONFIG_SMALL("Intel Indeo Video Interactive 4"), +}; diff --git a/libavcodec/indeo4data.h b/libavcodec/indeo4data.h new file mode 100644 index 0000000000..affd9c6203 --- /dev/null +++ b/libavcodec/indeo4data.h @@ -0,0 +1,350 @@ +/* + * Indeo Video Interactive 4 compatible decoder + * Copyright (c) 2009-2010 Maxim Poliakovski + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * This file contains data needed for the Indeo 4 decoder. + */ + +#ifndef AVCODEC_INDEO4DATA_H +#define AVCODEC_INDEO4DATA_H + +#include +#include "dsputil.h" +#include "ivi_common.h" + +/** + * standard picture dimensions + */ +static const uint16_t ivi4_common_pic_sizes[14] = { + 640, 480, 320, 240, 160, 120, 704, 480, 352, 240, 352, 288, 176, 144 +}; + +/** + * Indeo 4 8x8 scan (zigzag) patterns + */ +static const uint8_t ivi4_alternate_scan_8x8[64] = { + 0, 8, 1, 9, 16, 24, 2, 3, 17, 25, 10, 11, 32, 40, 48, 56, + 4, 5, 6, 7, 33, 41, 49, 57, 18, 19, 26, 27, 12, 13, 14, 15, + 34, 35, 43, 42, 50, 51, 59, 58, 20, 21, 22, 23, 31, 30, 29, 28, + 36, 37, 38, 39, 47, 46, 45, 44, 52, 53, 54, 55, 63, 62, 61, 60 +}; + +static const uint8_t ivi4_alternate_scan_4x4[16] = { + 0, 1, 4, 5, 8, 12, 2, 3, 9, 13, 6, 7, 10, 11, 14, 15 +}; + +static const uint8_t ivi4_vertical_scan_4x4[16] = { + 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15 +}; + +static const uint8_t ivi4_horizontal_scan_4x4[16] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 +}; + +static const uint8_t *scan_index_to_tab[15] = { + // for 8x8 transforms + ff_zigzag_direct, + ivi4_alternate_scan_8x8, + ff_ivi_horizontal_scan_8x8, + ff_ivi_vertical_scan_8x8, + ff_zigzag_direct, + + // for 4x4 transforms + ff_ivi_direct_scan_4x4, + ivi4_alternate_scan_4x4, + ivi4_vertical_scan_4x4, + ivi4_horizontal_scan_4x4, + ff_ivi_direct_scan_4x4, + + // TODO: check if those are needed + ff_ivi_horizontal_scan_8x8, + ff_ivi_horizontal_scan_8x8, + ff_ivi_horizontal_scan_8x8, + ff_ivi_horizontal_scan_8x8, + ff_ivi_horizontal_scan_8x8 +}; + +/** + * Indeo 4 dequant tables + */ +static uint16_t ivi4_quant_8x8_intra[9][64] = { + { + 43, 342, 385, 470, 555, 555, 598, 726, + 342, 342, 470, 513, 555, 598, 726, 769, + 385, 470, 555, 555, 598, 726, 726, 811, + 470, 470, 555, 555, 598, 726, 769, 854, + 470, 555, 555, 598, 683, 726, 854, 1025, + 555, 555, 598, 683, 726, 854, 1025, 1153, + 555, 555, 598, 726, 811, 982, 1195, 1451, + 555, 598, 726, 811, 982, 1195, 1451, 1793 + }, + { + 86, 1195, 2390, 2390, 4865, 4865, 4865, 4865, + 1195, 1195, 2390, 2390, 4865, 4865, 4865, 4865, + 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827, + 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827, + 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827, + 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827, + 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827, + 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827 + }, + { + 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835, + 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835, + 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835, + 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835, + 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835, + 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835, + 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835, + 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835 + }, + { + 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414, + 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414, + 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414, + 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414, + 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414, + 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414, + 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414, + 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414 + }, + { + 897, 897, 897, 897, 897, 897, 897, 897, + 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, + 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, + 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091 + }, + { + 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, + 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, + 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, + 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, + 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, + 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, + 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, + 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414 + }, + { + 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, + 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, + 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, + 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, + 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, + 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, + 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, + 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390 + }, + { + 22, 171, 214, 257, 257, 299, 299, 342, + 171, 171, 257, 257, 299, 299, 342, 385, + 214, 257, 257, 299, 299, 342, 342, 385, + 257, 257, 257, 299, 299, 342, 385, 427, + 257, 257, 299, 299, 342, 385, 427, 513, + 257, 299, 299, 342, 385, 427, 513, 598, + 299, 299, 299, 385, 385, 470, 598, 726, + 299, 299, 385, 385, 470, 598, 726, 897 + }, + { + 86, 598, 1195, 1195, 2390, 2390, 2390, 2390, + 598, 598, 1195, 1195, 2390, 2390, 2390, 2390, + 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414, + 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414, + 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414, + 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414, + 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414, + 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414 + } +}; + +static uint16_t ivi4_quant_8x8_inter[9][64] = { + { + 427, 427, 470, 427, 427, 427, 470, 470, + 427, 427, 470, 427, 427, 427, 470, 470, + 470, 470, 470, 470, 470, 470, 470, 470, + 427, 427, 470, 470, 427, 427, 470, 470, + 427, 427, 470, 427, 427, 427, 470, 470, + 427, 427, 470, 427, 427, 427, 470, 470, + 470, 470, 470, 470, 470, 470, 470, 470, + 470, 470, 470, 470, 470, 470, 470, 470 + }, + { + 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414, + 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414, + 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822, + 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822, + 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414, + 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414, + 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414, + 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414 + }, + { + 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281, + 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281, + 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281, + 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281, + 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281, + 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281, + 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281, + 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281 + }, + { + 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433, + 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433, + 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433, + 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433, + 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433, + 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433, + 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433, + 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433 + }, + { + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, + 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, + 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281 + }, + { + 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, + 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, + 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, + 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, + 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, + 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, + 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, + 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433 + }, + { + 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, + 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, + 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, + 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, + 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, + 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, + 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, + 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707 + }, + { + 86, 171, 171, 214, 214, 214, 214, 257, + 171, 171, 214, 214, 214, 214, 257, 257, + 171, 214, 214, 214, 214, 257, 257, 257, + 214, 214, 214, 214, 257, 257, 257, 299, + 214, 214, 214, 257, 257, 257, 299, 299, + 214, 214, 257, 257, 257, 299, 299, 299, + 214, 257, 257, 257, 299, 299, 299, 342, + 257, 257, 257, 299, 299, 299, 342, 342 + }, + { + 854, 854, 1195, 1195, 1707, 1707, 1707, 1707, + 854, 854, 1195, 1195, 1707, 1707, 1707, 1707, + 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390, + 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390, + 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707, + 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707, + 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707, + 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707 + } +}; + +static uint16_t ivi4_quant_4x4_intra[5][16] = { + { + 22, 214, 257, 299, + 214, 257, 299, 342, + 257, 299, 342, 427, + 299, 342, 427, 513 + }, + { + 129, 1025, 1451, 1451, + 1025, 1025, 1451, 1451, + 1451, 1451, 2049, 2049, + 1451, 1451, 2049, 2049 + }, + { + 43, 171, 171, 171, + 43, 171, 171, 171, + 43, 171, 171, 171, + 43, 171, 171, 171 + }, + { + 43, 43, 43, 43, + 171, 171, 171, 171, + 171, 171, 171, 171, + 171, 171, 171, 171 + }, + { + 43, 43, 43, 43, + 43, 43, 43, 43, + 43, 43, 43, 43, + 43, 43, 43, 43 + } +}; + +static uint16_t ivi4_quant_4x4_inter[5][16] = { + { + 107, 214, 257, 299, + 214, 257, 299, 299, + 257, 299, 299, 342, + 299, 299, 342, 342 + }, + { + 513, 1025, 1238, 1238, + 1025, 1025, 1238, 1238, + 1238, 1238, 1451, 1451, + 1238, 1238, 1451, 1451 + }, + { + 43, 171, 171, 171, + 43, 171, 171, 171, + 43, 171, 171, 171, + 43, 171, 171, 171 + }, + { + 43, 43, 43, 43, + 171, 171, 171, 171, + 171, 171, 171, 171, + 171, 171, 171, 171 + }, + { + 43, 43, 43, 43, + 43, 43, 43, 43, + 43, 43, 43, 43, + 43, 43, 43, 43 + } +}; + +/** + * Table for mapping quant matrix index from the bitstream + * into internal quant table number. + */ +static uint8_t quant_index_to_tab[22] = { + 0, 1, 0, 2, 1, 3, 0, 4, 1, 5, 0, 1, 6, 7, 8, // for 8x8 quant matrixes + 0, 1, 2, 2, 3, 3, 4 // for 4x4 quant matrixes +}; + +#endif /* AVCODEC_INDEO4DATA_H */ diff --git a/libavcodec/indeo5.c b/libavcodec/indeo5.c index 4c6bfd66d1..983518838f 100644 --- a/libavcodec/indeo5.c +++ b/libavcodec/indeo5.c @@ -90,7 +90,7 @@ typedef struct { */ static int decode_gop_header(IVI5DecContext *ctx, AVCodecContext *avctx) { - int result, i, p, tile_size, pic_size_indx, mb_size, blk_size; + int result, i, p, tile_size, pic_size_indx, mb_size, blk_size, is_scalable; int quant_mat, blk_size_changed = 0; IVIBandDesc *band, *band1, *band2; IVIPicConfig pic_conf; @@ -112,8 +112,8 @@ static int decode_gop_header(IVI5DecContext *ctx, AVCodecContext *avctx) /* num_levels * 3 + 1 */ pic_conf.luma_bands = get_bits(&ctx->gb, 2) * 3 + 1; pic_conf.chroma_bands = get_bits1(&ctx->gb) * 3 + 1; - ctx->is_scalable = pic_conf.luma_bands != 1 || pic_conf.chroma_bands != 1; - if (ctx->is_scalable && (pic_conf.luma_bands != 4 || pic_conf.chroma_bands != 1)) { + is_scalable = pic_conf.luma_bands != 1 || pic_conf.chroma_bands != 1; + if (is_scalable && (pic_conf.luma_bands != 4 || pic_conf.chroma_bands != 1)) { av_log(avctx, AV_LOG_ERROR, "Scalability: unsupported subdivision! Luma bands: %d, chroma bands: %d\n", pic_conf.luma_bands, pic_conf.chroma_bands); return -1; @@ -151,6 +151,7 @@ static int decode_gop_header(IVI5DecContext *ctx, AVCodecContext *avctx) return -1; } ctx->pic_conf = pic_conf; + ctx->is_scalable = is_scalable; blk_size_changed = 1; /* force reallocation of the internal structures */ } @@ -481,7 +482,7 @@ static int decode_mb_info(IVI5DecContext *ctx, IVIBandDesc *band, } mb->mv_x = mb->mv_y = 0; /* no motion vector coded */ - if (band->inherit_mv){ + if (band->inherit_mv && ref_mb){ /* motion vector inheritance */ if (mv_scale) { mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale); @@ -492,7 +493,7 @@ static int decode_mb_info(IVI5DecContext *ctx, IVIBandDesc *band, } } } else { - if (band->inherit_mv) { + if (band->inherit_mv && ref_mb) { mb->type = ref_mb->type; /* copy mb_type from corresponding reference mb */ } else if (ctx->frame_type == FRAMETYPE_INTRA) { mb->type = 0; /* mb_type is always INTRA for intra-frames */ @@ -518,7 +519,7 @@ static int decode_mb_info(IVI5DecContext *ctx, IVIBandDesc *band, if (!mb->type) { mb->mv_x = mb->mv_y = 0; /* there is no motion vector in intra-macroblocks */ } else { - if (band->inherit_mv){ + if (band->inherit_mv && ref_mb){ /* motion vector inheritance */ if (mv_scale) { mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale); diff --git a/libavcodec/ituh263dec.c b/libavcodec/ituh263dec.c index 69e7ab9c99..21365a673e 100644 --- a/libavcodec/ituh263dec.c +++ b/libavcodec/ituh263dec.c @@ -27,6 +27,8 @@ * h263 decoder. */ +#define UNCHECKED_BITSTREAM_READER 1 + //#define DEBUG #include diff --git a/libavcodec/ivi_common.c b/libavcodec/ivi_common.c index 7f14a89f33..e5fdd4a95b 100644 --- a/libavcodec/ivi_common.c +++ b/libavcodec/ivi_common.c @@ -260,6 +260,8 @@ int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_hei t_width >>= 1; t_height >>= 1; } + if(t_width<=0 || t_height<=0) + return AVERROR(EINVAL); for (b = 0; b < planes[p].num_bands; b++) { band = &planes[p].bands[b]; @@ -506,7 +508,7 @@ void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band, if (band->inherit_qdelta && ref_mb) mb->q_delta = ref_mb->q_delta; - if (band->inherit_mv) { + if (band->inherit_mv && ref_mb) { /* motion vector inheritance */ if (mv_scale) { mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale); @@ -611,6 +613,9 @@ void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch) const int16_t *src = plane->bands[0].buf; uint32_t pitch = plane->bands[0].pitch; + if(!src) + return; + for (y = 0; y < plane->height; y++) { for (x = 0; x < plane->width; x++) dst[x] = av_clip_uint8(src[x] + 128); diff --git a/libavcodec/ivi_dsp.c b/libavcodec/ivi_dsp.c index 913fdc31b2..0ee7035741 100644 --- a/libavcodec/ivi_dsp.c +++ b/libavcodec/ivi_dsp.c @@ -1,7 +1,7 @@ /* * DSP functions for Indeo Video Interactive codecs (Indeo4 and Indeo5) * - * Copyright (c) 2009 Maxim Poliakovski + * Copyright (c) 2009-2011 Maxim Poliakovski * * This file is part of FFmpeg. * @@ -178,6 +178,153 @@ void ff_ivi_recompose53(const IVIPlaneDesc *plane, uint8_t *dst, } } +void ff_ivi_recompose_haar(const IVIPlaneDesc *plane, uint8_t *dst, + const int dst_pitch, const int num_bands) +{ + int x, y, indx, b0, b1, b2, b3, p0, p1, p2, p3; + const IDWTELEM *b0_ptr, *b1_ptr, *b2_ptr, *b3_ptr; + int32_t pitch; + + /* all bands should have the same pitch */ + pitch = plane->bands[0].pitch; + + /* get pointers to the wavelet bands */ + b0_ptr = plane->bands[0].buf; + b1_ptr = plane->bands[1].buf; + b2_ptr = plane->bands[2].buf; + b3_ptr = plane->bands[3].buf; + + for (y = 0; y < plane->height; y += 2) { + for (x = 0, indx = 0; x < plane->width; x += 2, indx++) { + /* load coefficients */ + b0 = b0_ptr[indx]; //should be: b0 = (num_bands > 0) ? b0_ptr[indx] : 0; + b1 = b1_ptr[indx]; //should be: b1 = (num_bands > 1) ? b1_ptr[indx] : 0; + b2 = b2_ptr[indx]; //should be: b2 = (num_bands > 2) ? b2_ptr[indx] : 0; + b3 = b3_ptr[indx]; //should be: b3 = (num_bands > 3) ? b3_ptr[indx] : 0; + + /* haar wavelet recomposition */ + p0 = (b0 + b1 + b2 + b3 + 2) >> 2; + p1 = (b0 + b1 - b2 - b3 + 2) >> 2; + p2 = (b0 - b1 + b2 - b3 + 2) >> 2; + p3 = (b0 - b1 - b2 + b3 + 2) >> 2; + + /* bias, convert and output four pixels */ + dst[x] = av_clip_uint8(p0 + 128); + dst[x + 1] = av_clip_uint8(p1 + 128); + dst[dst_pitch + x] = av_clip_uint8(p2 + 128); + dst[dst_pitch + x + 1] = av_clip_uint8(p3 + 128); + }// for x + + dst += dst_pitch << 1; + + b0_ptr += pitch; + b1_ptr += pitch; + b2_ptr += pitch; + b3_ptr += pitch; + }// for y +} + +/** butterfly operation for the inverse Haar transform */ +#define IVI_HAAR_BFLY(s1, s2, o1, o2, t) \ + t = (s1 - s2) >> 1;\ + o1 = (s1 + s2) >> 1;\ + o2 = t;\ + +/** inverse 8-point Haar transform */ +#define INV_HAAR8(s1, s5, s3, s7, s2, s4, s6, s8,\ + d1, d2, d3, d4, d5, d6, d7, d8,\ + t0, t1, t2, t3, t4, t5, t6, t7, t8) {\ + t1 = s1 << 1; t5 = s5 << 1;\ + IVI_HAAR_BFLY(t1, t5, t1, t5, t0); IVI_HAAR_BFLY(t1, s3, t1, t3, t0);\ + IVI_HAAR_BFLY(t5, s7, t5, t7, t0); IVI_HAAR_BFLY(t1, s2, t1, t2, t0);\ + IVI_HAAR_BFLY(t3, s4, t3, t4, t0); IVI_HAAR_BFLY(t5, s6, t5, t6, t0);\ + IVI_HAAR_BFLY(t7, s8, t7, t8, t0);\ + d1 = COMPENSATE(t1);\ + d2 = COMPENSATE(t2);\ + d3 = COMPENSATE(t3);\ + d4 = COMPENSATE(t4);\ + d5 = COMPENSATE(t5);\ + d6 = COMPENSATE(t6);\ + d7 = COMPENSATE(t7);\ + d8 = COMPENSATE(t8); } + +/** inverse 4-point Haar transform */ +#define INV_HAAR4(s1, s3, s5, s7) {\ + HAAR_BFLY(s1, s5); HAAR_BFLY(s1, s3); HAAR_BFLY(s5, s7);\ + s1 = COMPENSATE(s1);\ + s3 = COMPENSATE(s3);\ + s5 = COMPENSATE(s5);\ + s7 = COMPENSATE(s7); } + +void ff_ivi_inverse_haar_8x8(const int32_t *in, int16_t *out, uint32_t pitch, + const uint8_t *flags) +{ + int i, shift, sp1, sp2, sp3, sp4; + const int32_t *src; + int32_t *dst; + int tmp[64]; + int t0, t1, t2, t3, t4, t5, t6, t7, t8; + + /* apply the InvHaar8 to all columns */ +#define COMPENSATE(x) (x) + src = in; + dst = tmp; + for (i = 0; i < 8; i++) { + if (flags[i]) { + /* pre-scaling */ + shift = !(i & 4); + sp1 = src[ 0] << shift; + sp2 = src[ 8] << shift; + sp3 = src[16] << shift; + sp4 = src[24] << shift; + INV_HAAR8( sp1, sp2, sp3, sp4, + src[32], src[40], src[48], src[56], + dst[ 0], dst[ 8], dst[16], dst[24], + dst[32], dst[40], dst[48], dst[56], + t0, t1, t2, t3, t4, t5, t6, t7, t8); + } else + dst[ 0] = dst[ 8] = dst[16] = dst[24] = + dst[32] = dst[40] = dst[48] = dst[56] = 0; + + src++; + dst++; + } +#undef COMPENSATE + + /* apply the InvHaar8 to all rows */ +#define COMPENSATE(x) (x) + src = tmp; + for (i = 0; i < 8; i++) { + if ( !src[0] && !src[1] && !src[2] && !src[3] + && !src[4] && !src[5] && !src[6] && !src[7]) { + memset(out, 0, 8 * sizeof(out[0])); + } else { + INV_HAAR8(src[0], src[1], src[2], src[3], + src[4], src[5], src[6], src[7], + out[0], out[1], out[2], out[3], + out[4], out[5], out[6], out[7], + t0, t1, t2, t3, t4, t5, t6, t7, t8); + } + src += 8; + out += pitch; + } +#undef COMPENSATE +} + +void ff_ivi_dc_haar_2d(const int32_t *in, int16_t *out, uint32_t pitch, + int blk_size) +{ + int x, y; + int16_t dc_coeff; + + dc_coeff = (*in + 0) >> 3; + + for (y = 0; y < blk_size; out += pitch, y++) { + for (x = 0; x < blk_size; x++) + out[x] = dc_coeff; + } +} + /** butterfly operation for the inverse slant transform */ #define IVI_SLANT_BFLY(s1, s2, o1, o2, t) \ t = s1 - s2;\ diff --git a/libavcodec/ivi_dsp.h b/libavcodec/ivi_dsp.h index 4fb2f80035..5a3441764c 100644 --- a/libavcodec/ivi_dsp.h +++ b/libavcodec/ivi_dsp.h @@ -1,7 +1,7 @@ /* * DSP functions for Indeo Video Interactive codecs (Indeo4 and Indeo5) * - * Copyright (c) 2009 Maxim Poliakovski + * Copyright (c) 2009-2011 Maxim Poliakovski * * This file is part of FFmpeg. * @@ -43,6 +43,43 @@ void ff_ivi_recompose53(const IVIPlaneDesc *plane, uint8_t *dst, const int dst_pitch, const int num_bands); +/** + * Haar wavelet recomposition filter for Indeo 4 + * + * @param[in] plane pointer to the descriptor of the plane being processed + * @param[out] dst pointer to the destination buffer + * @param[in] dst_pitch pitch of the destination buffer + * @param[in] num_bands number of wavelet bands to be processed + */ +void ff_ivi_recompose_haar(const IVIPlaneDesc *plane, uint8_t *dst, + const int dst_pitch, const int num_bands); + +/** + * two-dimensional inverse Haar 8x8 transform for Indeo 4 + * + * @param[in] in pointer to the vector of transform coefficients + * @param[out] out pointer to the output buffer (frame) + * @param[in] pitch pitch to move to the next y line + * @param[in] flags pointer to the array of column flags: + * != 0 - non_empty column, 0 - empty one + * (this array must be filled by caller) + */ +void ff_ivi_inverse_haar_8x8(const int32_t *in, int16_t *out, uint32_t pitch, + const uint8_t *flags); + +/** + * DC-only two-dimensional inverse Haar transform for Indeo 4. + * Performing the inverse transform in this case is equivalent to + * spreading DC_coeff >> 3 over the whole block. + * + * @param[in] in pointer to the dc coefficient + * @param[out] out pointer to the output buffer (frame) + * @param[in] pitch pitch to move to the next y line + * @param[in] blk_size transform block size + */ +void ff_ivi_dc_haar_2d(const int32_t *in, int16_t *out, uint32_t pitch, + int blk_size); + /** * two-dimensional inverse slant 8x8 transform * diff --git a/libavcodec/j2k_dwt.c b/libavcodec/j2k_dwt.c index ab7a1ab757..48aa33735e 100644 --- a/libavcodec/j2k_dwt.c +++ b/libavcodec/j2k_dwt.c @@ -321,7 +321,7 @@ int ff_j2k_dwt_init(DWTContext *s, uint16_t border[2][2], int decomp_levels, int int i, j, lev = decomp_levels, maxlen, b[2][2]; - if (decomp_levels >= FF_DWT_MAX_DECLVLS) + if ((unsigned)decomp_levels >= FF_DWT_MAX_DECLVLS) return AVERROR_INVALIDDATA; s->ndeclevels = decomp_levels; s->type = type; diff --git a/libavcodec/j2kdec.c b/libavcodec/j2kdec.c index 1f4acc53fd..d3710e832c 100644 --- a/libavcodec/j2kdec.c +++ b/libavcodec/j2kdec.c @@ -28,6 +28,7 @@ #include "avcodec.h" #include "bytestream.h" #include "j2k.h" +#include "libavutil/avassert.h" #include "libavutil/common.h" #define JP2_SIG_TYPE 0x6A502020 @@ -220,6 +221,9 @@ static int get_siz(J2kDecoderContext *s) s->tile_offset_y = bytestream_get_be32(&s->buf); // YT0Siz s->ncomponents = bytestream_get_be16(&s->buf); // CSiz + if(s->tile_width<=0 || s->tile_height<=0) + return AVERROR(EINVAL); + if (s->buf_end - s->buf < 2 * s->ncomponents) return AVERROR(EINVAL); @@ -235,6 +239,9 @@ static int get_siz(J2kDecoderContext *s) s->numXtiles = ff_j2k_ceildiv(s->width - s->tile_offset_x, s->tile_width); s->numYtiles = ff_j2k_ceildiv(s->height - s->tile_offset_y, s->tile_height); + if(s->numXtiles * (uint64_t)s->numYtiles > INT_MAX/sizeof(J2kTile)) + return AVERROR(EINVAL); + s->tile = av_mallocz(s->numXtiles * s->numYtiles * sizeof(J2kTile)); if (!s->tile) return AVERROR(ENOMEM); @@ -283,6 +290,10 @@ static int get_cox(J2kDecoderContext *s, J2kCodingStyle *c) c->log2_cblk_width = bytestream_get_byte(&s->buf) + 2; // cblk width c->log2_cblk_height = bytestream_get_byte(&s->buf) + 2; // cblk height + if (c->log2_cblk_width > 6 || c->log2_cblk_height > 6) { + return AVERROR_PATCHWELCOME; + } + c->cblk_style = bytestream_get_byte(&s->buf); if (c->cblk_style != 0){ // cblk style av_log(s->avctx, AV_LOG_WARNING, "extra cblk styles %X\n", c->cblk_style); @@ -359,7 +370,7 @@ static int get_qcx(J2kDecoderContext *s, int n, J2kQuantStyle *q) if (q->quantsty == J2K_QSTY_NONE){ n -= 3; - if (s->buf_end - s->buf < n) + if (s->buf_end - s->buf < n || 32*3 < n) return AVERROR(EINVAL); for (i = 0; i < n; i++) q->expn[i] = bytestream_get_byte(&s->buf) >> 3; @@ -376,7 +387,7 @@ static int get_qcx(J2kDecoderContext *s, int n, J2kQuantStyle *q) } } else{ n = (n - 3) >> 1; - if (s->buf_end - s->buf < n) + if (s->buf_end - s->buf < n || 32*3 < n) return AVERROR(EINVAL); for (i = 0; i < n; i++){ x = bytestream_get_be16(&s->buf); @@ -421,6 +432,10 @@ static uint8_t get_sot(J2kDecoderContext *s) return AVERROR(EINVAL); s->curtileno = bytestream_get_be16(&s->buf); ///< Isot + if((unsigned)s->curtileno >= s->numXtiles * s->numYtiles){ + s->curtileno=0; + return AVERROR(EINVAL); + } s->buf += 4; ///< Psot (ignored) @@ -695,6 +710,9 @@ static int decode_cblk(J2kDecoderContext *s, J2kCodingStyle *codsty, J2kT1Contex int bpass_csty_symbol = J2K_CBLK_BYPASS & codsty->cblk_style; int vert_causal_ctx_csty_symbol = J2K_CBLK_VSC & codsty->cblk_style; + av_assert0(width <= J2K_MAX_CBLKW); + av_assert0(height <= J2K_MAX_CBLKH); + for (y = 0; y < height+2; y++) memset(t1->flags[y], 0, (width+2)*sizeof(int)); @@ -911,7 +929,7 @@ static int decode_codestream(J2kDecoderContext *s) marker = bytestream_get_be16(&s->buf); if(s->avctx->debug & FF_DEBUG_STARTCODE) - av_log(s->avctx, AV_LOG_DEBUG, "marker 0x%.4X at pos 0x%x\n", marker, s->buf - s->buf_start - 4); + av_log(s->avctx, AV_LOG_DEBUG, "marker 0x%.4X at pos 0x%tx\n", marker, s->buf - s->buf_start - 4); oldbuf = s->buf; if (marker == J2K_SOD){ diff --git a/libavcodec/jpeglsdec.c b/libavcodec/jpeglsdec.c index 5e98b64644..81b350cd87 100644 --- a/libavcodec/jpeglsdec.c +++ b/libavcodec/jpeglsdec.c @@ -143,6 +143,8 @@ static inline int ls_get_code_runterm(GetBitContext *gb, JLSState *state, int RI ret = ret >> 1; } + if(FFABS(ret) > 0xFFFF) + return -0x10000; /* update state */ state->A[Q] += FFABS(ret) - RItype; ret *= state->twonear; diff --git a/libavcodec/kmvc.c b/libavcodec/kmvc.c index 8663c9524a..19f9677649 100644 --- a/libavcodec/kmvc.c +++ b/libavcodec/kmvc.c @@ -57,17 +57,21 @@ typedef struct BitBuf { #define kmvc_init_getbits(bb, src) bb.bits = 7; bb.bitbuf = *src++; -#define kmvc_getbit(bb, src, res) {\ +#define kmvc_getbit(bb, src, src_end, res) {\ res = 0; \ if (bb.bitbuf & (1 << bb.bits)) res = 1; \ bb.bits--; \ if(bb.bits == -1) { \ + if (src >= src_end) { \ + av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); \ + return AVERROR_INVALIDDATA; \ + } \ bb.bitbuf = *src++; \ bb.bits = 7; \ } \ } -static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w, int h) +static int kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int src_size, int w, int h) { BitBuf bb; int res, val; @@ -75,13 +79,18 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w, int bx, by; int l0x, l1x, l0y, l1y; int mx, my; + const uint8_t *src_end = src + src_size; kmvc_init_getbits(bb, src); for (by = 0; by < h; by += 8) for (bx = 0; bx < w; bx += 8) { - kmvc_getbit(bb, src, res); + kmvc_getbit(bb, src, src_end, res); if (!res) { // fill whole 8x8 block + if (src >= src_end) { + av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); + return AVERROR_INVALIDDATA; + } val = *src++; for (i = 0; i < 64; i++) BLK(ctx->cur, bx + (i & 0x7), by + (i >> 3)) = val; @@ -89,14 +98,22 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w, for (i = 0; i < 4; i++) { l0x = bx + (i & 1) * 4; l0y = by + (i & 2) * 2; - kmvc_getbit(bb, src, res); + kmvc_getbit(bb, src, src_end, res); if (!res) { - kmvc_getbit(bb, src, res); + kmvc_getbit(bb, src, src_end, res); if (!res) { // fill whole 4x4 block + if (src >= src_end) { + av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); + return AVERROR_INVALIDDATA; + } val = *src++; for (j = 0; j < 16; j++) BLK(ctx->cur, l0x + (j & 3), l0y + (j >> 2)) = val; } else { // copy block from already decoded place + if (src >= src_end) { + av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); + return AVERROR_INVALIDDATA; + } val = *src++; mx = val & 0xF; my = val >> 4; @@ -108,16 +125,24 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w, for (j = 0; j < 4; j++) { l1x = l0x + (j & 1) * 2; l1y = l0y + (j & 2); - kmvc_getbit(bb, src, res); + kmvc_getbit(bb, src, src_end, res); if (!res) { - kmvc_getbit(bb, src, res); + kmvc_getbit(bb, src, src_end, res); if (!res) { // fill whole 2x2 block + if (src >= src_end) { + av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); + return AVERROR_INVALIDDATA; + } val = *src++; BLK(ctx->cur, l1x, l1y) = val; BLK(ctx->cur, l1x + 1, l1y) = val; BLK(ctx->cur, l1x, l1y + 1) = val; BLK(ctx->cur, l1x + 1, l1y + 1) = val; } else { // copy block from already decoded place + if (src >= src_end) { + av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); + return AVERROR_INVALIDDATA; + } val = *src++; mx = val & 0xF; my = val >> 4; @@ -140,9 +165,11 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w, } } } + + return 0; } -static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w, int h) +static int kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int src_size, int w, int h) { BitBuf bb; int res, val; @@ -150,15 +177,20 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w, int bx, by; int l0x, l1x, l0y, l1y; int mx, my; + const uint8_t *src_end = src + src_size; kmvc_init_getbits(bb, src); for (by = 0; by < h; by += 8) for (bx = 0; bx < w; bx += 8) { - kmvc_getbit(bb, src, res); + kmvc_getbit(bb, src, src_end, res); if (!res) { - kmvc_getbit(bb, src, res); + kmvc_getbit(bb, src, src_end, res); if (!res) { // fill whole 8x8 block + if (src >= src_end) { + av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); + return AVERROR_INVALIDDATA; + } val = *src++; for (i = 0; i < 64; i++) BLK(ctx->cur, bx + (i & 0x7), by + (i >> 3)) = val; @@ -171,14 +203,22 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w, for (i = 0; i < 4; i++) { l0x = bx + (i & 1) * 4; l0y = by + (i & 2) * 2; - kmvc_getbit(bb, src, res); + kmvc_getbit(bb, src, src_end, res); if (!res) { - kmvc_getbit(bb, src, res); + kmvc_getbit(bb, src, src_end, res); if (!res) { // fill whole 4x4 block + if (src >= src_end) { + av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); + return AVERROR_INVALIDDATA; + } val = *src++; for (j = 0; j < 16; j++) BLK(ctx->cur, l0x + (j & 3), l0y + (j >> 2)) = val; } else { // copy block + if (src >= src_end) { + av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); + return AVERROR_INVALIDDATA; + } val = *src++; mx = (val & 0xF) - 8; my = (val >> 4) - 8; @@ -190,16 +230,24 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w, for (j = 0; j < 4; j++) { l1x = l0x + (j & 1) * 2; l1y = l0y + (j & 2); - kmvc_getbit(bb, src, res); + kmvc_getbit(bb, src, src_end, res); if (!res) { - kmvc_getbit(bb, src, res); + kmvc_getbit(bb, src, src_end, res); if (!res) { // fill whole 2x2 block + if (src >= src_end) { + av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); + return AVERROR_INVALIDDATA; + } val = *src++; BLK(ctx->cur, l1x, l1y) = val; BLK(ctx->cur, l1x + 1, l1y) = val; BLK(ctx->cur, l1x, l1y + 1) = val; BLK(ctx->cur, l1x + 1, l1y + 1) = val; } else { // copy block + if (src >= src_end) { + av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); + return AVERROR_INVALIDDATA; + } val = *src++; mx = (val & 0xF) - 8; my = (val >> 4) - 8; @@ -222,6 +270,8 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w, } } } + + return 0; } static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, AVPacket *avpkt) @@ -299,10 +349,10 @@ static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, AVPa memcpy(ctx->cur, ctx->prev, 320 * 200); break; case 3: - kmvc_decode_intra_8x8(ctx, buf, avctx->width, avctx->height); + kmvc_decode_intra_8x8(ctx, buf, buf_size, avctx->width, avctx->height); break; case 4: - kmvc_decode_inter_8x8(ctx, buf, avctx->width, avctx->height); + kmvc_decode_inter_8x8(ctx, buf, buf_size, avctx->width, avctx->height); break; default: av_log(avctx, AV_LOG_ERROR, "Unknown compression method %i\n", header & KMVC_METHOD); diff --git a/libavcodec/lagarith.c b/libavcodec/lagarith.c index bf845f1ffd..43027cff4e 100644 --- a/libavcodec/lagarith.c +++ b/libavcodec/lagarith.c @@ -524,6 +524,50 @@ static int lag_decode_frame(AVCodecContext *avctx, srcs[i] += l->rgb_stride; } break; + case FRAME_ARITH_RGB24: + avctx->pix_fmt = PIX_FMT_RGB24; + + if (avctx->get_buffer(avctx, p) < 0) { + av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); + return -1; + } + offs[0] = offset_bv; + offs[1] = offset_gu; + offs[2] = 9; + + if (!l->rgb_planes) { + l->rgb_stride = FFALIGN(avctx->width, 16); + l->rgb_planes = av_malloc(l->rgb_stride * avctx->height * 3); + if (!l->rgb_planes) { + av_log(avctx, AV_LOG_ERROR, "cannot allocate temporary buffer\n"); + return AVERROR(ENOMEM); + } + } + for (i = 0; i < 3; i++) + srcs[i] = l->rgb_planes + (i + 1) * l->rgb_stride * avctx->height - l->rgb_stride; + for (i = 0; i < 3; i++) + lag_decode_arith_plane(l, srcs[i], + avctx->width, avctx->height, + -l->rgb_stride, buf + offs[i], + buf_size); + dst = p->data[0]; + for (i = 0; i < 3; i++) + srcs[i] = l->rgb_planes + i * l->rgb_stride * avctx->height; + for (j = 0; j < avctx->height; j++) { + for (i = 0; i < avctx->width; i++) { + uint8_t r, g, b; + r = srcs[0][i]; + g = srcs[1][i]; + b = srcs[2][i]; + dst[3*i+0] = r+g; + dst[3*i+1] = g; + dst[3*i+2] = b+g; + } + dst += p->linesize[0]; + for (i = 0; i < 3; i++) + srcs[i] += l->rgb_stride; + } + break; case FRAME_ARITH_YV12: avctx->pix_fmt = PIX_FMT_YUV420P; diff --git a/libavcodec/lcldec.c b/libavcodec/lcldec.c index e288fc3f63..57b04f79f1 100644 --- a/libavcodec/lcldec.c +++ b/libavcodec/lcldec.c @@ -96,7 +96,13 @@ static unsigned int mszh_decomp(const unsigned char * srcptr, int srclen, unsign ofs = FFMIN(ofs, destptr - destptr_bak); cnt *= 4; cnt = FFMIN(cnt, destptr_end - destptr); - av_memcpy_backptr(destptr, ofs, cnt); + if (ofs) { + av_memcpy_backptr(destptr, ofs, cnt); + } else { + // Not known what the correct behaviour is, but + // this at least avoids uninitialized data. + memset(destptr, 0, cnt); + } destptr += cnt; } maskbit >>= 1; diff --git a/libavcodec/libavcodec.v b/libavcodec/libavcodec.v index 9f6b01d103..6539d7bdb7 100644 --- a/libavcodec/libavcodec.v +++ b/libavcodec/libavcodec.v @@ -25,5 +25,7 @@ LIBAVCODEC_$MAJOR { ff_mmxext_idct; ff_idct_xvid*; ff_jpeg_fdct*; + #XBMC's configure checks for ff_vdpau_vc1_decode_picture() + ff_vdpau_vc1_decode_picture; local: *; }; diff --git a/libavcodec/libgsm.c b/libavcodec/libgsm.c index 9ba9da9e3f..ed4962a3b2 100644 --- a/libavcodec/libgsm.c +++ b/libavcodec/libgsm.c @@ -155,7 +155,7 @@ static av_cold int libgsm_decode_init(AVCodecContext *avctx) { break; case CODEC_ID_GSM_MS: { int one = 1; - gsm_option(avctx->priv_data, GSM_OPT_WAV49, &one); + gsm_option(s->state, GSM_OPT_WAV49, &one); avctx->frame_size = 2 * GSM_FRAME_SIZE; avctx->block_align = GSM_MS_BLOCK_SIZE; } @@ -212,9 +212,12 @@ static int libgsm_decode_frame(AVCodecContext *avctx, void *data, static void libgsm_flush(AVCodecContext *avctx) { LibGSMDecodeContext *s = avctx->priv_data; + int one = 1; gsm_destroy(s->state); s->state = gsm_create(); + if (avctx->codec_id == CODEC_ID_GSM_MS) + gsm_option(s->state, GSM_OPT_WAV49, &one); } AVCodec ff_libgsm_decoder = { diff --git a/libavcodec/libopenjpegdec.c b/libavcodec/libopenjpegdec.c index ca3ef5f842..07cca2547b 100644 --- a/libavcodec/libopenjpegdec.c +++ b/libavcodec/libopenjpegdec.c @@ -52,9 +52,10 @@ static enum PixelFormat check_image_attributes(AVCodecContext *avctx, opj_image_ switch (compRatio) { case 0111111: goto libopenjpeg_yuv444_rgb; + case 0111212: return PIX_FMT_YUV440P; case 0112121: goto libopenjpeg_yuv422; case 0112222: goto libopenjpeg_yuv420; - default: return PIX_FMT_RGB24; + default: goto libopenjpeg_rgb; } libopenjpeg_yuv420: @@ -80,9 +81,25 @@ libopenjpeg_yuv444_rgb: case 10: return PIX_FMT_YUV444P10; case 16: return PIX_FMT_YUV444P16; } + +libopenjpeg_rgb: + switch (c0.prec) { + case 8: return PIX_FMT_RGB24; + default: return PIX_FMT_RGB48; + } + return PIX_FMT_RGB24; } +static int is_yuva420(opj_image_t *image) +{ + return image->numcomps == 4 && + image->comps[0].dx == 1 && image->comps[0].dy == 1 && + image->comps[1].dx == 2 && image->comps[1].dy == 2 && + image->comps[2].dx == 2 && image->comps[2].dy == 2 && + image->comps[3].dx == 1 && image->comps[3].dy == 1; +} + static inline int libopenjpeg_ispacked(enum PixelFormat pix_fmt) { int i, component_plane; component_plane = av_pix_fmt_descriptors[pix_fmt].comp[0].plane; @@ -107,6 +124,24 @@ static inline void libopenjpeg_copy_to_packed8(AVFrame *picture, opj_image_t *im } } +static inline void libopenjpeg_copy_to_packed16(AVFrame *picture, opj_image_t *image) { + uint16_t *img_ptr; + int index, x, y, c; + int adjust[4]; + for (x = 0; x < image->numcomps; x++) { + adjust[x] = FFMAX(FFMIN(16 - image->comps[x].prec, 8), 0); + } + for (y = 0; y < picture->height; y++) { + index = y*picture->width; + img_ptr = (uint16_t*) (picture->data[0] + y*picture->linesize[0]); + for (x = 0; x < picture->width; x++, index++) { + for (c = 0; c < image->numcomps; c++) { + *img_ptr++ = image->comps[c].data[index] << adjust[c]; + } + } + } +} + static inline void libopenjpeg_copyto8(AVFrame *picture, opj_image_t *image) { int *comp_data; uint8_t *img_ptr; @@ -114,8 +149,8 @@ static inline void libopenjpeg_copyto8(AVFrame *picture, opj_image_t *image) { for(index = 0; index < image->numcomps; index++) { comp_data = image->comps[index].data; - img_ptr = picture->data[index]; for(y = 0; y < image->comps[index].h; y++) { + img_ptr = picture->data[index] + y * picture->linesize[index]; for(x = 0; x < image->comps[index].w; x++) { *img_ptr = (uint8_t) *comp_data; img_ptr++; @@ -131,8 +166,8 @@ static inline void libopenjpeg_copyto16(AVFrame *picture, opj_image_t *image) { int index, x, y; for(index = 0; index < image->numcomps; index++) { comp_data = image->comps[index].data; - img_ptr = (uint16_t*) picture->data[index]; for(y = 0; y < image->comps[index].h; y++) { + img_ptr = (uint16_t*) (picture->data[index] + y * picture->linesize[index]); for(x = 0; x < image->comps[index].w; x++) { *img_ptr = *comp_data; img_ptr++; @@ -227,7 +262,7 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, break; case 3: avctx->pix_fmt = check_image_attributes(avctx, image); break; - case 4: avctx->pix_fmt = PIX_FMT_RGBA; + case 4: avctx->pix_fmt = is_yuva420(image) ? PIX_FMT_YUVA420P : PIX_FMT_RGBA; break; default: av_log(avctx, AV_LOG_ERROR, "%d components unsupported.\n", image->numcomps); goto done; @@ -271,10 +306,16 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, libopenjpeg_copyto16(picture, image); break; case 3: + case 4: if (ispacked) { libopenjpeg_copy_to_packed8(picture, image); } break; + case 6: + if (ispacked) { + libopenjpeg_copy_to_packed16(picture, image); + } + break; default: av_log(avctx, AV_LOG_ERROR, "unsupported pixel size %d\n", pixel_size); goto done; diff --git a/libavcodec/libopenjpegenc.c b/libavcodec/libopenjpegenc.c index 6b37fb08cf..409abd6c60 100644 --- a/libavcodec/libopenjpegenc.c +++ b/libavcodec/libopenjpegenc.c @@ -372,6 +372,7 @@ AVCodec ff_libopenjpeg_encoder = { PIX_FMT_YUV440P,PIX_FMT_YUV444P, PIX_FMT_YUV420P9,PIX_FMT_YUV422P9,PIX_FMT_YUV444P9, PIX_FMT_YUV420P10,PIX_FMT_YUV422P10,PIX_FMT_YUV444P10, - PIX_FMT_YUV420P16,PIX_FMT_YUV422P16,PIX_FMT_YUV444P16}, + PIX_FMT_YUV420P16,PIX_FMT_YUV422P16,PIX_FMT_YUV444P16, + PIX_FMT_NONE}, .long_name = NULL_IF_CONFIG_SMALL("OpenJPEG based JPEG 2000 encoder"), } ; diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index 38351e59cf..acc4cac07b 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -174,7 +174,7 @@ static int X264_frame(AVCodecContext *ctx, uint8_t *buf, frame->pict_type == AV_PICTURE_TYPE_P ? X264_TYPE_P : frame->pict_type == AV_PICTURE_TYPE_B ? X264_TYPE_B : X264_TYPE_AUTO; - if (x4->params.b_tff != frame->top_field_first) { + if (x4->params.b_interlaced && x4->params.b_tff != frame->top_field_first) { x4->params.b_tff = frame->top_field_first; x264_encoder_reconfig(x4->enc, &x4->params); } diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index 5a51201d9d..833e80fcdf 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -233,6 +233,11 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) return -1; } + if(s->lossless && s->avctx->lowres){ + av_log(s->avctx, AV_LOG_ERROR, "lowres is not possible with lossless jpeg\n"); + return -1; + } + height = get_bits(&s->gb, 16); width = get_bits(&s->gb, 16); @@ -277,7 +282,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) return -1; } - if(s->v_max==1 && s->h_max==1 && s->lossless==1) s->rgb=1; + if(s->v_max==1 && s->h_max==1 && s->lossless==1 && nb_components==3) s->rgb=1; /* if different size, realloc/alloc picture */ /* XXX: also check h_count and v_count */ @@ -336,7 +341,10 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) assert(s->nb_components==3); break; case 0x11000000: - s->avctx->pix_fmt = PIX_FMT_GRAY8; + if(s->bits <= 8) + s->avctx->pix_fmt = PIX_FMT_GRAY8; + else + s->avctx->pix_fmt = PIX_FMT_GRAY16; break; case 0x12111100: s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV440P : PIX_FMT_YUVJ440P; @@ -640,7 +648,7 @@ static int decode_block_refinement(MJpegDecodeContext *s, DCTELEM *block, uint8_ #undef REFINE_BIT #undef ZERO_RUN -static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point_transform){ +static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int nb_components, int predictor, int point_transform){ int i, mb_x, mb_y; uint16_t (*buffer)[4]; int left[3], top[3], topleft[3]; @@ -651,7 +659,7 @@ static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point buffer= s->ljpeg_buffer; for(i=0; i<3; i++){ - buffer[0][i]= 1 << (s->bits + point_transform - 1); + buffer[0][i]= 1 << (s->bits - 1); } for(mb_y = 0; mb_y < s->mb_height; mb_y++) { const int modified_predictor= mb_y ? predictor : 1; @@ -667,16 +675,20 @@ static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point if (s->restart_interval && !s->restart_count) s->restart_count = s->restart_interval; - for(i=0;i<3;i++) { - int pred; + for(i=0;idc_index[i]); + if(dc == 0xFFFF) + return -1; + left[i]= - buffer[mb_x][i]= mask & (pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform)); + buffer[mb_x][i]= mask & (pred + (dc << point_transform)); } if (s->restart_interval && !--s->restart_count) { @@ -698,10 +710,11 @@ static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point ptr[3*mb_x+2] = buffer[mb_x][2] + ptr[3*mb_x+1]; } }else{ - for(mb_x = 0; mb_x < s->mb_width; mb_x++) { - ptr[3*mb_x+0] = buffer[mb_x][2]; - ptr[3*mb_x+1] = buffer[mb_x][1]; - ptr[3*mb_x+2] = buffer[mb_x][0]; + for(i=0;icomp_index[i]; + for(mb_x = 0; mb_x < s->mb_width; mb_x++) { + ptr[3*mb_x+2-c] = buffer[mb_x][i]; + } } } } @@ -710,7 +723,12 @@ static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point_transform){ int i, mb_x, mb_y; - const int nb_components=3; + const int nb_components=s->nb_components; + int bits= (s->bits+7)&~7; + + point_transform += bits - s->bits; + + av_assert0(nb_components==1 || nb_components==3); for(mb_y = 0; mb_y < s->mb_height; mb_y++) { for(mb_x = 0; mb_x < s->mb_width; mb_x++) { @@ -720,6 +738,7 @@ static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point if(mb_x==0 || mb_y==0 || s->interlaced){ for(i=0;inb_blocks[i]; c = s->comp_index[i]; @@ -729,13 +748,19 @@ static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point y = 0; linesize= s->linesize[c]; - for(j=0; j8) linesize /= 2; + for(j=0; jdc_index[i]); + if(dc == 0xFFFF) + return -1; + if(bits<=8){ ptr = s->picture.data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap if(y==0 && mb_y==0){ if(x==0 && mb_x==0){ - pred= 128 << point_transform; + pred= 1 << (bits - 1); }else{ pred= ptr[-1]; } @@ -749,8 +774,27 @@ static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point if (s->interlaced && s->bottom_field) ptr += linesize >> 1; - *ptr= pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform); + *ptr= pred + (dc << point_transform); + }else{ + ptr16 = s->picture.data[c] + 2*(linesize * (v * mb_y + y)) + 2*(h * mb_x + x); //FIXME optimize this crap + if(y==0 && mb_y==0){ + if(x==0 && mb_x==0){ + pred= 1 << (bits - 1); + }else{ + pred= ptr16[-1]; + } + }else{ + if(x==0 && mb_x==0){ + pred= ptr16[-linesize]; + }else{ + PREDICT(pred, ptr16[-linesize-1], ptr16[-linesize], ptr16[-1], predictor); + } + } + if (s->interlaced && s->bottom_field) + ptr16 += linesize >> 1; + *ptr16= pred + (dc << point_transform); + } if (++x == h) { x = 0; y++; @@ -760,7 +804,8 @@ static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point }else{ for(i=0;inb_blocks[i]; c = s->comp_index[i]; h = s->h_scount[i]; @@ -769,12 +814,25 @@ static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point y = 0; linesize= s->linesize[c]; + if(bits>8) linesize /= 2; + for(j=0; jdc_index[i]); + if(dc == 0xFFFF) + return -1; + if(bits<=8){ ptr = s->picture.data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor); - *ptr= pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform); + + *ptr= pred + (dc << point_transform); + }else{ + ptr16 = s->picture.data[c] + 2*(linesize * (v * mb_y + y)) + 2*(h * mb_x + x); //FIXME optimize this crap + PREDICT(pred, ptr16[-linesize-1], ptr16[-linesize], ptr16[-1], predictor); + + *ptr16= pred + (dc << point_transform); + } if (++x == h) { x = 0; y++; @@ -1011,7 +1069,7 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, if (s->dc_index[i] < 0 || s->ac_index[i] < 0 || s->dc_index[i] >= 4 || s->ac_index[i] >= 4) goto out_of_range; - if (!s->vlcs[0][s->dc_index[i]].table || !s->vlcs[1][s->ac_index[i]].table) + if (!s->vlcs[0][s->dc_index[i]].table || !(s->progressive ? s->vlcs[2][s->ac_index[0]].table : s->vlcs[1][s->ac_index[i]].table)) goto out_of_range; } @@ -1060,7 +1118,7 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, return -1; }else{ if(s->rgb){ - if(ljpeg_decode_rgb_scan(s, predictor, point_transform) < 0) + if(ljpeg_decode_rgb_scan(s, nb_components, predictor, point_transform) < 0) return -1; }else{ if(ljpeg_decode_yuv_scan(s, predictor, point_transform) < 0) diff --git a/libavcodec/mlp_parser.c b/libavcodec/mlp_parser.c index 4ceea5e9e1..f31e2d5727 100644 --- a/libavcodec/mlp_parser.c +++ b/libavcodec/mlp_parser.c @@ -263,6 +263,9 @@ static int mlp_parse(AVCodecParserContext *s, mp->bytes_left = ((mp->pc.index > 0 ? mp->pc.buffer[0] : buf[0]) << 8) | (mp->pc.index > 1 ? mp->pc.buffer[1] : buf[1-mp->pc.index]); mp->bytes_left = (mp->bytes_left & 0xfff) * 2; + if (mp->bytes_left <= 0) { // prevent infinite loop + goto lost_sync; + } mp->bytes_left -= mp->pc.index; } diff --git a/libavcodec/mlpdec.c b/libavcodec/mlpdec.c index e91295084c..47aee286ff 100644 --- a/libavcodec/mlpdec.c +++ b/libavcodec/mlpdec.c @@ -476,9 +476,18 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp, } } if (m->avctx->codec_id == CODEC_ID_TRUEHD && - m->avctx->channel_layout == AV_CH_LAYOUT_7POINT1) { + (m->avctx->channel_layout == AV_CH_LAYOUT_7POINT1 || + m->avctx->channel_layout == AV_CH_LAYOUT_7POINT1_WIDE)) { FFSWAP(int, s->ch_assign[4], s->ch_assign[6]); FFSWAP(int, s->ch_assign[5], s->ch_assign[7]); + } else if (m->avctx->codec_id == CODEC_ID_TRUEHD && + (m->avctx->channel_layout == AV_CH_LAYOUT_6POINT1 || + m->avctx->channel_layout == (AV_CH_LAYOUT_6POINT1 | AV_CH_TOP_CENTER) || + m->avctx->channel_layout == (AV_CH_LAYOUT_6POINT1 | AV_CH_TOP_FRONT_CENTER))) { + int i = s->ch_assign[6]; + s->ch_assign[6] = s->ch_assign[5]; + s->ch_assign[5] = s->ch_assign[4]; + s->ch_assign[4] = i; } checksum = ff_mlp_restart_checksum(buf, get_bits_count(gbp) - start_count); diff --git a/libavcodec/motion_est.c b/libavcodec/motion_est.c index 319aaf97ca..215f5b1b75 100644 --- a/libavcodec/motion_est.c +++ b/libavcodec/motion_est.c @@ -536,8 +536,8 @@ static inline void get_limits(MpegEncContext *s, int x, int y) if (s->unrestricted_mv) { c->xmin = - x - 16; c->ymin = - y - 16; - c->xmax = - x + s->mb_width *16; - c->ymax = - y + s->mb_height*16; + c->xmax = - x + s->width; + c->ymax = - y + s->height; } else if (s->out_format == FMT_H261){ // Search range of H261 is different from other codec standards c->xmin = (x > 15) ? - 15 : 0; @@ -576,10 +576,11 @@ static inline int h263_mv4_search(MpegEncContext *s, int mx, int my, int shift) const int h=8; int block; int P[10][2]; - int dmin_sum=0, mx4_sum=0, my4_sum=0; + int dmin_sum=0, mx4_sum=0, my4_sum=0, i; int same=1; const int stride= c->stride; uint8_t *mv_penalty= c->current_mv_penalty; + int saftey_cliping= s->unrestricted_mv && (s->width&15) && (s->height&15); init_mv4_ref(c); @@ -591,6 +592,11 @@ static inline int h263_mv4_search(MpegEncContext *s, int mx, int my, int shift) const int mot_stride = s->b8_stride; const int mot_xy = s->block_index[block]; + if(saftey_cliping){ + c->xmax = - 16*s->mb_x + s->width - 8*(block &1); + c->ymax = - 16*s->mb_y + s->height - 8*(block>>1); + } + P_LEFT[0] = s->current_picture.f.motion_val[0][mot_xy - 1][0]; P_LEFT[1] = s->current_picture.f.motion_val[0][mot_xy - 1][1]; @@ -618,6 +624,11 @@ static inline int h263_mv4_search(MpegEncContext *s, int mx, int my, int shift) } P_MV1[0]= mx; P_MV1[1]= my; + if(saftey_cliping) + for(i=0; i<10; i++){ + if(P[i][0] > (c->xmax<xmax< (c->ymax<ymax<p_mv_table, (1<<16)>>shift); diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c index fde4e0217e..5306d1d87a 100644 --- a/libavcodec/mpeg12.c +++ b/libavcodec/mpeg12.c @@ -25,6 +25,8 @@ * MPEG-1/2 decoder */ +#define UNCHECKED_BITSTREAM_READER 1 + //#define DEBUG #include "internal.h" #include "avcodec.h" @@ -1248,7 +1250,7 @@ static int mpeg_decode_postinit(AVCodecContext *avctx) s1->save_width != s->width || s1->save_height != s->height || s1->save_aspect_info != s->aspect_ratio_info || - s1->save_progressive_seq != s->progressive_sequence || + (s1->save_progressive_seq != s->progressive_sequence && (s->height&31)) || 0) { @@ -2030,6 +2032,7 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, s->progressive_sequence = 1; s->progressive_frame = 1; s->picture_structure = PICT_FRAME; + s->first_field = 0; s->frame_pred_frame_dct = 1; s->chroma_format = 1; s->codec_id = s->avctx->codec_id = CODEC_ID_MPEG1VIDEO; @@ -2089,6 +2092,7 @@ static int vcr2_init_sequence(AVCodecContext *avctx) s->progressive_sequence = 1; s->progressive_frame = 1; s->picture_structure = PICT_FRAME; + s->first_field = 0; s->frame_pred_frame_dct = 1; s->chroma_format = 1; s->codec_id = s->avctx->codec_id = CODEC_ID_MPEG2VIDEO; diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c index 3cfe733139..1c620c8489 100644 --- a/libavcodec/mpeg12enc.c +++ b/libavcodec/mpeg12enc.c @@ -184,6 +184,7 @@ static av_cold int encode_init(AVCodecContext *avctx) s->tc.rate = avpriv_frame_rate_tab[s->frame_rate_index]; if (ff_init_smtpe_timecode(s, &s->tc) < 0) return -1; + s->drop_frame_timecode = s->tc.drop; s->avctx->timecode_frame_start = s->tc.start; } else { s->avctx->timecode_frame_start = 0; // default is -1 diff --git a/libavcodec/mpeg4audio.c b/libavcodec/mpeg4audio.c index 67445935c4..abd3fa4a9b 100644 --- a/libavcodec/mpeg4audio.c +++ b/libavcodec/mpeg4audio.c @@ -82,6 +82,9 @@ int avpriv_mpeg4audio_get_config(MPEG4AudioConfig *c, const uint8_t *buf, GetBitContext gb; int specific_config_bitindex; + if(bit_size<=0) + return AVERROR_INVALIDDATA; + init_get_bits(&gb, buf, bit_size); c->object_type = get_object_type(&gb); c->sample_rate = get_sample_rate(&gb, &c->sampling_index); diff --git a/libavcodec/mpeg4video_parser.c b/libavcodec/mpeg4video_parser.c index c331435cc1..5f3b19d5aa 100644 --- a/libavcodec/mpeg4video_parser.c +++ b/libavcodec/mpeg4video_parser.c @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#define UNCHECKED_BITSTREAM_READER 1 + #include "parser.h" #include "mpegvideo.h" #include "mpeg4video.h" diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c index 5394887edf..88874b46b4 100644 --- a/libavcodec/mpeg4videodec.c +++ b/libavcodec/mpeg4videodec.c @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#define UNCHECKED_BITSTREAM_READER 1 + #include "libavutil/opt.h" #include "mpegvideo.h" #include "mpeg4video.h" @@ -158,7 +160,7 @@ static inline int mpeg4_is_resync(MpegEncContext *s){ return 0; } -static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb) +static int mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb) { int i; int a= 2<sprite_warping_accuracy; @@ -174,6 +176,9 @@ static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb int h= s->height; int min_ab; + if(w<=0 || h<=0) + return -1; + for(i=0; inum_sprite_warping_points; i++){ int length; int x=0, y=0; @@ -346,6 +351,7 @@ static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb } s->real_sprite_warping_points= s->num_sprite_warping_points; } + return 0; } /** @@ -409,7 +415,8 @@ int mpeg4_decode_video_packet_header(MpegEncContext *s) skip_bits(&s->gb, 3); /* intra dc vlc threshold */ //FIXME don't just ignore everything if(s->pict_type == AV_PICTURE_TYPE_S && s->vol_sprite_usage==GMC_SPRITE){ - mpeg4_decode_sprite_trajectory(s, &s->gb); + if(mpeg4_decode_sprite_trajectory(s, &s->gb) < 0) + return -1; av_log(s->avctx, AV_LOG_ERROR, "untested\n"); } @@ -2049,7 +2056,8 @@ static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){ } if(s->pict_type == AV_PICTURE_TYPE_S && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){ - mpeg4_decode_sprite_trajectory(s, gb); + if(mpeg4_decode_sprite_trajectory(s, gb) < 0) + return -1; if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n"); if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n"); } diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c index 5cc3c74339..eead3064ec 100644 --- a/libavcodec/mpegaudiodec.c +++ b/libavcodec/mpegaudiodec.c @@ -24,6 +24,8 @@ * MPEG Audio decoder */ +#define UNCHECKED_BITSTREAM_READER 1 + #include "libavutil/audioconvert.h" #include "avcodec.h" #include "get_bits.h" diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 666cad8151..e00131b8de 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -1228,8 +1228,8 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) return -1; if(s->codec_id == CODEC_ID_FLV1 || s->codec_id == CODEC_ID_H263){ - for(i=0; iheight; i++) - memset(s->last_picture_ptr->f.data[0] + s->last_picture_ptr->f.linesize[0]*i, 16, s->width); + for(i=0; iheight; i++) + memset(s->last_picture_ptr->f.data[0] + s->last_picture_ptr->f.linesize[0]*i, 16, avctx->width); } ff_thread_report_progress((AVFrame*)s->last_picture_ptr, INT_MAX, 0); diff --git a/libavcodec/msrle.c b/libavcodec/msrle.c index 30159bb006..c39ae7bd44 100644 --- a/libavcodec/msrle.c +++ b/libavcodec/msrle.c @@ -35,6 +35,7 @@ #include "avcodec.h" #include "dsputil.h" #include "msrledec.h" +#include "libavutil/imgutils.h" typedef struct MsrleContext { AVCodecContext *avctx; @@ -107,7 +108,7 @@ static int msrle_decode_frame(AVCodecContext *avctx, /* FIXME how to correctly detect RLE ??? */ if (avctx->height * istride == avpkt->size) { /* assume uncompressed */ - int linesize = (avctx->width * avctx->bits_per_coded_sample + 7) / 8; + int linesize = av_image_get_linesize(avctx->pix_fmt, avctx->width, 0); uint8_t *ptr = s->frame.data[0]; uint8_t *buf = avpkt->data + (avctx->height-1)*istride; int i, j; diff --git a/libavcodec/msrledec.c b/libavcodec/msrledec.c index db8de7032d..129f0e0bc0 100644 --- a/libavcodec/msrledec.c +++ b/libavcodec/msrledec.c @@ -140,7 +140,7 @@ static int msrle_decode_8_16_24_32(AVCodecContext *avctx, AVPicture *pic, int de output = pic->data[0] + (avctx->height - 1) * pic->linesize[0]; output_end = pic->data[0] + avctx->height * pic->linesize[0]; - while(src < data + srcsize) { + while(src + 1 < data + srcsize) { p1 = *src++; if(p1 == 0) { //Escape code p2 = *src++; @@ -172,6 +172,10 @@ static int msrle_decode_8_16_24_32(AVCodecContext *avctx, AVPicture *pic, int de src += p2 * (depth >> 3); continue; } + if(data + srcsize - src < p2 * (depth >> 3)){ + av_log(avctx, AV_LOG_ERROR, "Copy beyond input buffer\n"); + return -1; + } if ((depth == 8) || (depth == 24)) { for(i = 0; i < p2 * (depth >> 3); i++) { *output++ = *src++; diff --git a/libavcodec/msvideo1enc.c b/libavcodec/msvideo1enc.c index 837fca5ea4..09cc7a196d 100644 --- a/libavcodec/msvideo1enc.c +++ b/libavcodec/msvideo1enc.c @@ -261,6 +261,10 @@ static av_cold int encode_init(AVCodecContext *avctx) if (av_image_check_size(avctx->width, avctx->height, 0, avctx) < 0) { return -1; } + if((avctx->width&3) || (avctx->height&3)){ + av_log(avctx, AV_LOG_ERROR, "width and height must be multiplies of 4\n"); + return -1; + } avcodec_get_frame_defaults(&c->pic); avctx->coded_frame = (AVFrame*)&c->pic; diff --git a/libavcodec/parser.c b/libavcodec/parser.c index ff71656f78..2ba546dba4 100644 --- a/libavcodec/parser.c +++ b/libavcodec/parser.c @@ -241,8 +241,10 @@ int ff_combine_frame(ParseContext *pc, int next, const uint8_t **buf, int *buf_s if(next == END_NOT_FOUND){ void* new_buffer = av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE); - if(!new_buffer) + if(!new_buffer) { + pc->index = 0; return AVERROR(ENOMEM); + } pc->buffer = new_buffer; memcpy(&pc->buffer[pc->index], *buf, *buf_size); pc->index += *buf_size; @@ -255,9 +257,11 @@ int ff_combine_frame(ParseContext *pc, int next, const uint8_t **buf, int *buf_s /* append to buffer */ if(pc->index){ void* new_buffer = av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE); - - if(!new_buffer) + if(!new_buffer) { + pc->overread_index = + pc->index = 0; return AVERROR(ENOMEM); + } pc->buffer = new_buffer; memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE ); pc->index = 0; diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index 609b21e2aa..1a0b298c37 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -133,7 +133,7 @@ static void png_put_interlaced_row(uint8_t *dst, int width, static void add_bytes_l2_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w) { long i; - for(i=0; i<=w-sizeof(long); i+=sizeof(long)){ + for(i=0; i<=w-(int)sizeof(long); i+=sizeof(long)){ long a = *(long*)(src1+i); long b = *(long*)(src2+i); *(long*)(dst+i) = ((a&pb_7f) + (b&pb_7f)) ^ ((a^b)&pb_80); diff --git a/libavcodec/pnm.c b/libavcodec/pnm.c index dfc18d6013..b52cd27f72 100644 --- a/libavcodec/pnm.c +++ b/libavcodec/pnm.c @@ -107,6 +107,7 @@ int ff_pnm_decode_header(AVCodecContext *avctx, PNMContext * const s) avctx->width = w; avctx->height = h; + s->maxval = maxval; if (depth == 1) { if (maxval == 1) avctx->pix_fmt = PIX_FMT_MONOWHITE; diff --git a/libavcodec/proresdec2.c b/libavcodec/proresdec2.c index a96af4fa9f..2d4ff04df9 100644 --- a/libavcodec/proresdec2.c +++ b/libavcodec/proresdec2.c @@ -26,7 +26,7 @@ //#define DEBUG -#define A32_BITSTREAM_READER +#define LONG_BITSTREAM_READER #include "avcodec.h" #include "get_bits.h" @@ -325,7 +325,7 @@ static av_always_inline void decode_ac_coeffs(AVCodecContext *avctx, GetBitConte int log2_block_count = av_log2(blocks_per_slice); OPEN_READER(re, gb); - + UPDATE_CACHE(re, gb); \ run = 4; level = 2; @@ -333,7 +333,7 @@ static av_always_inline void decode_ac_coeffs(AVCodecContext *avctx, GetBitConte block_mask = blocks_per_slice - 1; for (pos = block_mask;;) { - bits_left = gb->size_in_bits - (((uint8_t*)re_buffer_ptr - gb->buffer)*8 - 32 + re_bit_count); + bits_left = gb->size_in_bits - re_index; if (!bits_left || (bits_left < 32 && !SHOW_UBITS(re, gb, bits_left))) break; @@ -443,7 +443,8 @@ static int decode_slice_thread(AVCodecContext *avctx, void *arg, int jobnr, int v_data_size = slice->data_size - y_data_size - u_data_size - hdr_size; if (hdr_size > 7) v_data_size = AV_RB16(buf + 6); - if (y_data_size < 0 || u_data_size < 0 || v_data_size < 0) { + if (y_data_size < 0 || u_data_size < 0 || v_data_size < 0 + || hdr_size+y_data_size+u_data_size+v_data_size > slice->data_size){ av_log(avctx, AV_LOG_ERROR, "invalid plane data size\n"); return -1; } diff --git a/libavcodec/proresdec_lgpl.c b/libavcodec/proresdec_lgpl.c index 84d81ee425..3d44cc2194 100644 --- a/libavcodec/proresdec_lgpl.c +++ b/libavcodec/proresdec_lgpl.c @@ -28,7 +28,7 @@ * @see http://wiki.multimedia.cx/index.php?title=Apple_ProRes */ -#define A32_BITSTREAM_READER // some ProRes vlc codes require up to 28 bits to be read at once +#define LONG_BITSTREAM_READER // some ProRes vlc codes require up to 28 bits to be read at once #include diff --git a/libavcodec/proresenc.c b/libavcodec/proresenc.c index d27719d368..8cdcff3c49 100644 --- a/libavcodec/proresenc.c +++ b/libavcodec/proresenc.c @@ -234,10 +234,10 @@ static void encode_ac_coeffs(AVCodecContext *avctx, PutBitContext *pb, int prev_run = 4; int prev_level = 2; - int run = 0, level, code; - for (int i = 1; i < 64; i++) { + int run = 0, level, code, i, j; + for (i = 1; i < 64; i++) { int indp = progressive_scan[i]; - for (int j = 0; j < blocks_per_slice; j++) { + for (j = 0; j < blocks_per_slice; j++) { int val = QSCALE(qmat, indp, in[(j << 6) + indp]); if (val) { encode_codeword(pb, run, run_to_cb[FFMIN(prev_run, 15)]); @@ -441,13 +441,13 @@ static int prores_encode_picture(AVCodecContext *avctx, AVFrame *pic, { int mb_width = (avctx->width + 15) >> 4; int mb_height = (avctx->height + 15) >> 4; - int hdr_size, sl_size; + int hdr_size, sl_size, i; int mb_y, sl_data_size, qp; int unsafe_bot, unsafe_right; uint8_t *sl_data, *sl_data_sizes; int slice_per_line = 0, rem = mb_width; - for (int i = av_log2(DEFAULT_SLICE_MB_WIDTH); i >= 0; --i) { + for (i = av_log2(DEFAULT_SLICE_MB_WIDTH); i >= 0; --i) { slice_per_line += rem >> i; rem &= (1 << i) - 1; } diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c index 2154163c10..0399ea7901 100644 --- a/libavcodec/pthread.c +++ b/libavcodec/pthread.c @@ -239,8 +239,10 @@ static int thread_init(AVCodecContext *avctx) ThreadContext *c; int thread_count = avctx->thread_count; - if (thread_count <= 1) + if (thread_count <= 1) { + avctx->active_thread_type = 0; return 0; + } c = av_mallocz(sizeof(ThreadContext)); if (!c) diff --git a/libavcodec/qpeg.c b/libavcodec/qpeg.c index 84e2b41629..adbeff03ae 100644 --- a/libavcodec/qpeg.c +++ b/libavcodec/qpeg.c @@ -32,7 +32,7 @@ typedef struct QpegContext{ uint32_t pal[256]; } QpegContext; -static void qpeg_decode_intra(const uint8_t *src, uint8_t *dst, int size, +static int qpeg_decode_intra(const uint8_t *src, uint8_t *dst, int size, int stride, int width, int height) { int i; @@ -94,6 +94,8 @@ static void qpeg_decode_intra(const uint8_t *src, uint8_t *dst, int size, } } else { size -= copy; + if (size<0) + return AVERROR_INVALIDDATA; for(i = 0; i < copy; i++) { dst[filled++] = *src++; if (filled >= width) { @@ -106,6 +108,7 @@ static void qpeg_decode_intra(const uint8_t *src, uint8_t *dst, int size, } } } + return 0; } static const int qpeg_table_h[16] = @@ -200,6 +203,8 @@ static void qpeg_decode_inter(const uint8_t *src, uint8_t *dst, int size, filled = 0; dst -= stride; height--; + if(height < 0) + break; } } } else if(code >= 0xC0) { /* copy code: 0xC0..0xDF */ @@ -211,6 +216,8 @@ static void qpeg_decode_inter(const uint8_t *src, uint8_t *dst, int size, filled = 0; dst -= stride; height--; + if(height < 0) + break; } } size -= code + 1; @@ -259,7 +266,7 @@ static int decode_frame(AVCodecContext *avctx, AVFrame * p= (AVFrame*)&a->pic; AVFrame * ref= (AVFrame*)&a->ref; uint8_t* outdata; - int delta; + int delta, ret = 0; const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL); if(ref->data[0]) @@ -273,12 +280,15 @@ static int decode_frame(AVCodecContext *avctx, } outdata = a->pic.data[0]; if(buf[0x85] == 0x10) { - qpeg_decode_intra(buf+0x86, outdata, buf_size - 0x86, a->pic.linesize[0], avctx->width, avctx->height); + ret = qpeg_decode_intra(buf+0x86, outdata, buf_size - 0x86, a->pic.linesize[0], avctx->width, avctx->height); } else { delta = buf[0x85]; qpeg_decode_inter(buf+0x86, outdata, buf_size - 0x86, a->pic.linesize[0], avctx->width, avctx->height, delta, buf + 4, a->ref.data[0]); } + if (ret<0) + return ret; + /* make the palette available on the way out */ if (pal) { a->pic.palette_has_changed = 1; diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c index 4ef529d5b2..e031c727b2 100644 --- a/libavcodec/qtrle.c +++ b/libavcodec/qtrle.c @@ -77,7 +77,7 @@ static void qtrle_decode_1bpp(QtrleContext *s, int stream_ptr, int row_ptr, int * line' at the beginning. Since we always interpret it as 'go to next line' * in the decoding loop (which makes code simpler/faster), the first line * would not be counted, so we count one more. - * See: https://ffmpeg.org/trac/ffmpeg/ticket/226 + * See: https://trac.ffmpeg.org/ticket/226 * In the following decoding loop, row_ptr will be the position of the * _next_ row. */ lines_to_change++; diff --git a/libavcodec/ra144enc.c b/libavcodec/ra144enc.c index 19fe06c840..2436bac147 100644 --- a/libavcodec/ra144enc.c +++ b/libavcodec/ra144enc.c @@ -477,7 +477,10 @@ static int ra144_encode_frame(AVCodecContext *avctx, uint8_t *frame, * The filter is unstable: use the coefficients of the previous frame. */ ff_int_to_int16(block_coefs[NBLOCKS - 1], ractx->lpc_coef[1]); - ff_eval_refl(lpc_refl, block_coefs[NBLOCKS - 1], avctx); + if (ff_eval_refl(lpc_refl, block_coefs[NBLOCKS - 1], avctx)) { + /* the filter is still unstable. set reflection coeffs to zero. */ + memset(lpc_refl, 0, sizeof(lpc_refl)); + } } init_put_bits(&pb, frame, buf_size); for (i = 0; i < LPC_ORDER; i++) { diff --git a/libavcodec/ratecontrol.c b/libavcodec/ratecontrol.c index 5919ea2b23..dda8b2616a 100644 --- a/libavcodec/ratecontrol.c +++ b/libavcodec/ratecontrol.c @@ -708,7 +708,7 @@ float ff_rate_estimate_qscale(MpegEncContext *s, int dry_run) dts_pic= s->last_picture_ptr; //if(dts_pic) -// av_log(NULL, AV_LOG_ERROR, "%Ld %Ld %Ld %d\n", s->current_picture_ptr->pts, s->user_specified_pts, dts_pic->pts, picture_number); +// av_log(NULL, AV_LOG_ERROR, "%"PRId64" %"PRId64" %"PRId64" %d\n", s->current_picture_ptr->pts, s->user_specified_pts, dts_pic->pts, picture_number); if (!dts_pic || dts_pic->f.pts == AV_NOPTS_VALUE) wanted_bits= (uint64_t)(s->bit_rate*(double)picture_number/fps); diff --git a/libavcodec/raw.c b/libavcodec/raw.c index a26dea8146..42469fdf65 100644 --- a/libavcodec/raw.c +++ b/libavcodec/raw.c @@ -108,6 +108,12 @@ const PixelFormatTag ff_raw_pix_fmt_tags[] = { { PIX_FMT_BGR48BE, MKTAG( 48, 'B', 'G', 'R') }, { PIX_FMT_GRAY16LE, MKTAG('Y', '1', 0 , 16 ) }, { PIX_FMT_GRAY16BE, MKTAG(16 , 0 , '1', 'Y') }, + { PIX_FMT_YUV420P10LE, MKTAG('Y', '3', 11 , 10 ) }, + { PIX_FMT_YUV420P10BE, MKTAG(10 , 11 , '3', 'Y') }, + { PIX_FMT_YUV422P10LE, MKTAG('Y', '3', 10 , 10 ) }, + { PIX_FMT_YUV422P10BE, MKTAG(10 , 10 , '3', 'Y') }, + { PIX_FMT_YUV444P10LE, MKTAG('Y', '3', 0 , 10 ) }, + { PIX_FMT_YUV444P10BE, MKTAG(10 , 0 , '3', 'Y') }, { PIX_FMT_YUV420P16LE, MKTAG('Y', '3', 11 , 16 ) }, { PIX_FMT_YUV420P16BE, MKTAG(16 , 11 , '3', 'Y') }, { PIX_FMT_YUV422P16LE, MKTAG('Y', '3', 10 , 16 ) }, diff --git a/libavcodec/rpza.c b/libavcodec/rpza.c index 4c87b3c1b2..1f01ea0b08 100644 --- a/libavcodec/rpza.c +++ b/libavcodec/rpza.c @@ -83,7 +83,7 @@ static void rpza_decode_stream(RpzaContext *s) unsigned short *pixels = (unsigned short *)s->frame.data[0]; int row_ptr = 0; - int pixel_ptr = 0; + int pixel_ptr = -4; int block_ptr; int pixel_x, pixel_y; int total_blocks; @@ -139,6 +139,7 @@ static void rpza_decode_stream(RpzaContext *s) colorA = AV_RB16 (&s->buf[stream_ptr]); stream_ptr += 2; while (n_blocks--) { + ADVANCE_BLOCK() block_ptr = row_ptr + pixel_ptr; for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_x = 0; pixel_x < 4; pixel_x++){ @@ -147,7 +148,6 @@ static void rpza_decode_stream(RpzaContext *s) } block_ptr += row_inc; } - ADVANCE_BLOCK(); } break; @@ -184,6 +184,7 @@ static void rpza_decode_stream(RpzaContext *s) color4[2] |= ((21 * ta + 11 * tb) >> 5); while (n_blocks--) { + ADVANCE_BLOCK(); block_ptr = row_ptr + pixel_ptr; for (pixel_y = 0; pixel_y < 4; pixel_y++) { index = s->buf[stream_ptr++]; @@ -194,12 +195,12 @@ static void rpza_decode_stream(RpzaContext *s) } block_ptr += row_inc; } - ADVANCE_BLOCK(); } break; /* Fill block with 16 colors */ case 0x00: + ADVANCE_BLOCK(); block_ptr = row_ptr + pixel_ptr; for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_x = 0; pixel_x < 4; pixel_x++){ @@ -213,7 +214,6 @@ static void rpza_decode_stream(RpzaContext *s) } block_ptr += row_inc; } - ADVANCE_BLOCK(); break; /* Unknown opcode */ diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c index 15a5c5430f..1e05906a6f 100644 --- a/libavcodec/rv34.c +++ b/libavcodec/rv34.c @@ -690,8 +690,9 @@ static inline void rv34_mc(RV34DecContext *r, const int block_type, srcY += src_y * s->linesize + src_x; srcU += uvsrc_y * s->uvlinesize + uvsrc_x; srcV += uvsrc_y * s->uvlinesize + uvsrc_x; - if( (unsigned)(src_x - !!lx*2) > s->h_edge_pos - !!lx*2 - (width <<3) - 4 - || (unsigned)(src_y - !!ly*2) > s->v_edge_pos - !!ly*2 - (height<<3) - 4){ + if(s->h_edge_pos - (width << 3) < 6 || s->v_edge_pos - (height << 3) < 6 || + (unsigned)(src_x - !!lx*2) > s->h_edge_pos - !!lx*2 - (width <<3) - 4 || + (unsigned)(src_y - !!ly*2) > s->v_edge_pos - !!ly*2 - (height<<3) - 4) { uint8_t *uvbuf = s->edge_emu_buffer + 22 * s->linesize; srcY -= 2 + 2*s->linesize; diff --git a/libavcodec/rv34_parser.c b/libavcodec/rv34_parser.c index 4c1d2e396e..9672f26182 100644 --- a/libavcodec/rv34_parser.c +++ b/libavcodec/rv34_parser.c @@ -76,7 +76,7 @@ static int rv34_parse(AVCodecParserContext *s, return buf_size; } -#ifdef CONFIG_RV30_PARSER +#if CONFIG_RV30_PARSER AVCodecParser ff_rv30_parser = { .codec_ids = { CODEC_ID_RV30 }, .priv_data_size = sizeof(RV34ParseContext), @@ -84,7 +84,7 @@ AVCodecParser ff_rv30_parser = { }; #endif -#ifdef CONFIG_RV40_PARSER +#if CONFIG_RV40_PARSER AVCodecParser ff_rv40_parser = { .codec_ids = { CODEC_ID_RV40 }, .priv_data_size = sizeof(RV34ParseContext), diff --git a/libavcodec/shorten.c b/libavcodec/shorten.c index e0d3f6f986..ef58aaa6aa 100644 --- a/libavcodec/shorten.c +++ b/libavcodec/shorten.c @@ -86,6 +86,7 @@ typedef struct ShortenContext { int channels; int32_t *decoded[MAX_CHANNELS]; + int32_t *decoded_base[MAX_CHANNELS]; int32_t *offset[MAX_CHANNELS]; int *coeffs; uint8_t *bitstream; @@ -140,13 +141,13 @@ static int allocate_buffers(ShortenContext *s) return AVERROR(ENOMEM); s->offset[chan] = tmp_ptr; - tmp_ptr = av_realloc(s->decoded[chan], sizeof(int32_t)*(s->blocksize + s->nwrap)); + tmp_ptr = av_realloc(s->decoded_base[chan], sizeof(int32_t)*(s->blocksize + s->nwrap)); if (!tmp_ptr) return AVERROR(ENOMEM); - s->decoded[chan] = tmp_ptr; + s->decoded_base[chan] = tmp_ptr; for (i=0; inwrap; i++) - s->decoded[chan][i] = 0; - s->decoded[chan] += s->nwrap; + s->decoded_base[chan][i] = 0; + s->decoded[chan] = s->decoded_base[chan] + s->nwrap; } coeffs = av_realloc(s->coeffs, s->nwrap * sizeof(*s->coeffs)); @@ -204,7 +205,7 @@ static int decode_wave_header(AVCodecContext *avctx, const uint8_t *header, { int len; short wave_format; - + const uint8_t *end= header + header_size; if (bytestream_get_le32(&header) != MKTAG('R','I','F','F')) { av_log(avctx, AV_LOG_ERROR, "missing RIFF tag\n"); @@ -220,6 +221,8 @@ static int decode_wave_header(AVCodecContext *avctx, const uint8_t *header, while (bytestream_get_le32(&header) != MKTAG('f','m','t',' ')) { len = bytestream_get_le32(&header); + if(len<0 || end - header - 8 < len) + return AVERROR_INVALIDDATA; header += len; } len = bytestream_get_le32(&header); @@ -615,8 +618,8 @@ static av_cold int shorten_decode_close(AVCodecContext *avctx) int i; for (i = 0; i < s->channels; i++) { - s->decoded[i] -= s->nwrap; - av_freep(&s->decoded[i]); + s->decoded[i] = NULL; + av_freep(&s->decoded_base[i]); av_freep(&s->offset[i]); } av_freep(&s->bitstream); diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index a983922fc7..4451f14b36 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -659,10 +659,12 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, } if(bits) { //decode 16-bit data for(i = stereo; i >= 0; i--) - pred[i] = av_bswap16(get_bits(&gb, 16)); + pred[i] = sign_extend(av_bswap16(get_bits(&gb, 16)), 16); for(i = 0; i <= stereo; i++) *samples++ = pred[i]; for(; i < unp_size / 2; i++) { + if(get_bits_left(&gb)<0) + return -1; if(i & stereo) { if(vlc[2].table) res = get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3); @@ -675,7 +677,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, res = 0; val |= h[3].values[res] << 8; pred[1] += sign_extend(val, 16); - *samples++ = av_clip_int16(pred[1]); + *samples++ = pred[1]; } else { if(vlc[0].table) res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3); @@ -688,7 +690,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, res = 0; val |= h[1].values[res] << 8; pred[0] += sign_extend(val, 16); - *samples++ = av_clip_int16(pred[0]); + *samples++ = pred[0]; } } } else { //8-bit data @@ -697,6 +699,8 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, for(i = 0; i <= stereo; i++) *samples8++ = pred[i]; for(; i < unp_size; i++) { + if(get_bits_left(&gb)<0) + return -1; if(i & stereo){ if(vlc[1].table) res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3); diff --git a/libavcodec/snow.h b/libavcodec/snow.h index 3a5cdc7175..6a04d694bb 100644 --- a/libavcodec/snow.h +++ b/libavcodec/snow.h @@ -311,7 +311,8 @@ static av_always_inline void add_yblock(SnowContext *s, int sliced, slice_buffer if(!sliced && !offset_dst) dst -= src_x; src_x=0; - }else if(src_x + b_w > w){ + } + if(src_x + b_w > w){ b_w = w - src_x; } if(src_y<0){ @@ -320,7 +321,8 @@ static av_always_inline void add_yblock(SnowContext *s, int sliced, slice_buffer if(!sliced && !offset_dst) dst -= src_y*dst_stride; src_y=0; - }else if(src_y + b_h> h){ + } + if(src_y + b_h> h){ b_h = h - src_y; } diff --git a/libavcodec/sonic.c b/libavcodec/sonic.c index e7cdb3ba81..d33514f421 100644 --- a/libavcodec/sonic.c +++ b/libavcodec/sonic.c @@ -44,6 +44,7 @@ #define RIGHT_SIDE 2 typedef struct SonicContext { + AVFrame frame; int lossless, decorrelation; int num_taps, downsampling; @@ -757,6 +758,9 @@ static av_cold int sonic_decode_init(AVCodecContext *avctx) s->channels = avctx->channels; s->samplerate = avctx->sample_rate; + avcodec_get_frame_defaults(&s->frame); + avctx->coded_frame = &s->frame; + if (!avctx->extradata) { av_log(avctx, AV_LOG_ERROR, "No mandatory headers present\n"); @@ -848,18 +852,25 @@ static av_cold int sonic_decode_close(AVCodecContext *avctx) } static int sonic_decode_frame(AVCodecContext *avctx, - void *data, int *data_size, + void *data, int *got_frame_ptr, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; SonicContext *s = avctx->priv_data; GetBitContext gb; - int i, quant, ch, j; - short *samples = data; + int i, quant, ch, j, ret; + short *samples; if (buf_size == 0) return 0; + s->frame.nb_samples = s->frame_size; + if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) { + av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); + return ret; + } + samples = s->frame.data[0]; + // av_log(NULL, AV_LOG_INFO, "buf_size: %d\n", buf_size); init_get_bits(&gb, buf, buf_size*8); @@ -930,20 +941,21 @@ static int sonic_decode_frame(AVCodecContext *avctx, align_get_bits(&gb); - *data_size = s->frame_size * 2; + *got_frame_ptr = 1; + *(AVFrame*)data = s->frame; return (get_bits_count(&gb)+7)/8; } AVCodec ff_sonic_decoder = { - "sonic", - AVMEDIA_TYPE_AUDIO, - CODEC_ID_SONIC, - sizeof(SonicContext), - sonic_decode_init, - NULL, - sonic_decode_close, - sonic_decode_frame, + .name = "sonic", + .type = AVMEDIA_TYPE_AUDIO, + .id = CODEC_ID_SONIC, + .priv_data_size = sizeof(SonicContext), + .init = sonic_decode_init, + .close = sonic_decode_close, + .decode = sonic_decode_frame, + .capabilities = CODEC_CAP_DR1, .long_name = NULL_IF_CONFIG_SMALL("Sonic"), }; #endif /* CONFIG_SONIC_DECODER */ diff --git a/libavcodec/srtdec.c b/libavcodec/srtdec.c index aa73f4c7bf..b6f2dade0c 100644 --- a/libavcodec/srtdec.c +++ b/libavcodec/srtdec.c @@ -110,7 +110,7 @@ static const char *srt_to_ass(AVCodecContext *avctx, char *out, char *out_end, for (j=sptr-2; j>=0; j--) if (stack[j].param[i][0]) { out += snprintf(out, out_end-out, - stack[j].param[i]); + "%s", stack[j].param[i]); break; } } else { @@ -146,7 +146,7 @@ static const char *srt_to_ass(AVCodecContext *avctx, char *out, char *out_end, for (i=0; imotion_val8[i]); av_freep(&s->motion_val16[i]); } + if(s->current_picture.data[0]) + avctx->release_buffer(avctx, &s->current_picture); + if(s->last_picture.data[0]) + avctx->release_buffer(avctx, &s->last_picture); return 0; } diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c index 1060a4403e..690d691e92 100644 --- a/libavcodec/tiff.c +++ b/libavcodec/tiff.c @@ -436,7 +436,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t * break; case TIFF_ROWSPERSTRIP: if(type == TIFF_LONG && value == -1) - value = s->avctx->height; + value = s->height; if(value < 1){ av_log(s->avctx, AV_LOG_ERROR, "Incorrect value of rows per strip\n"); return -1; diff --git a/libavcodec/truemotion2.c b/libavcodec/truemotion2.c index 1054a7e06b..95487d9436 100644 --- a/libavcodec/truemotion2.c +++ b/libavcodec/truemotion2.c @@ -286,6 +286,8 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, i buf += 4; cur += 4; buf += 4; cur += 4; /* unused by decoder */ + if(skip < cur) + return -1; init_get_bits(&ctx->gb, buf, (skip - cur) * 8); if(tm2_build_huff_table(ctx, &codes) == -1) return -1; diff --git a/libavcodec/truespeech.c b/libavcodec/truespeech.c index bb4ce6f219..9bbbf5172e 100644 --- a/libavcodec/truespeech.c +++ b/libavcodec/truespeech.c @@ -179,6 +179,7 @@ static void truespeech_apply_twopoint_filter(TSContext *dec, int quart) for(i = 0; i < 146; i++) tmp[i] = dec->filtbuf[i]; off = (t / 25) + dec->offset1[quart >> 1] + 18; + off = av_clip(off, 0, 145); ptr0 = tmp + 145 - off; ptr1 = tmp + 146; filter = (const int16_t*)ts_order2_coeffs + (t % 25) * 2; diff --git a/libavcodec/twinvq.c b/libavcodec/twinvq.c index 1810ce8c88..6a0bd4d145 100644 --- a/libavcodec/twinvq.c +++ b/libavcodec/twinvq.c @@ -871,7 +871,7 @@ static int twin_decode_frame(AVCodecContext * avctx, void *data, } *got_frame_ptr = 1; - *(AVFrame *)data = tctx->frame;; + *(AVFrame *)data = tctx->frame; return buf_size; } diff --git a/libavcodec/ulti.c b/libavcodec/ulti.c index f96c6ac43c..4f0d90f665 100644 --- a/libavcodec/ulti.c +++ b/libavcodec/ulti.c @@ -40,6 +40,14 @@ typedef struct UltimotionDecodeContext { const uint8_t *ulti_codebook; } UltimotionDecodeContext; +#define CHECK_OVERREAD_SIZE(size) \ + do { \ + if (buf_end - buf < (size)) { \ + av_log(avctx, AV_LOG_ERROR, "Insufficient data\n"); \ + return AVERROR_INVALIDDATA; \ + } \ + } while(0) + static av_cold int ulti_decode_init(AVCodecContext *avctx) { UltimotionDecodeContext *s = avctx->priv_data; @@ -224,6 +232,7 @@ static int ulti_decode_frame(AVCodecContext *avctx, int i; int skip; int tmp; + const uint8_t *buf_end = buf + buf_size; s->frame.reference = 3; s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE; @@ -237,10 +246,12 @@ static int ulti_decode_frame(AVCodecContext *avctx, if(blocks >= s->blocks || y >= s->height) break;//all blocks decoded + CHECK_OVERREAD_SIZE(1); idx = *buf++; if((idx & 0xF8) == 0x70) { switch(idx) { case 0x70: //change modifier + CHECK_OVERREAD_SIZE(1); modifier = *buf++; if(modifier>1) av_log(avctx, AV_LOG_INFO, "warning: modifier must be 0 or 1, got %i\n", modifier); @@ -255,6 +266,7 @@ static int ulti_decode_frame(AVCodecContext *avctx, done = 1; break; case 0x74: //skip some blocks + CHECK_OVERREAD_SIZE(1); skip = *buf++; if ((blocks + skip) >= s->blocks) break; @@ -281,19 +293,24 @@ static int ulti_decode_frame(AVCodecContext *avctx, chroma = 0; } else { cf = 0; - if (idx) + if (idx) { + CHECK_OVERREAD_SIZE(1); chroma = *buf++; + } } for (i = 0; i < 4; i++) { // for every subblock code = (idx >> (6 - i*2)) & 3; //extract 2 bits if(!code) //skip subblock continue; - if(cf) + if(cf) { + CHECK_OVERREAD_SIZE(1); chroma = *buf++; + } tx = x + block_coords[i * 2]; ty = y + block_coords[(i * 2) + 1]; switch(code) { case 1: + CHECK_OVERREAD_SIZE(1); tmp = *buf++; angle = angle_by_index[(tmp >> 6) & 0x3]; @@ -314,6 +331,7 @@ static int ulti_decode_frame(AVCodecContext *avctx, case 2: if (modifier) { // unpack four luma samples + CHECK_OVERREAD_SIZE(3); tmp = bytestream_get_be24(&buf); Y[0] = (tmp >> 18) & 0x3F; @@ -322,6 +340,7 @@ static int ulti_decode_frame(AVCodecContext *avctx, Y[3] = tmp & 0x3F; angle = 16; } else { // retrieve luma samples from codebook + CHECK_OVERREAD_SIZE(2); tmp = bytestream_get_be16(&buf); angle = (tmp >> 12) & 0xF; @@ -338,6 +357,8 @@ static int ulti_decode_frame(AVCodecContext *avctx, if (modifier) { // all 16 luma samples uint8_t Luma[16]; + CHECK_OVERREAD_SIZE(12); + tmp = bytestream_get_be24(&buf); Luma[0] = (tmp >> 18) & 0x3F; Luma[1] = (tmp >> 12) & 0x3F; @@ -364,6 +385,7 @@ static int ulti_decode_frame(AVCodecContext *avctx, ulti_convert_yuv(&s->frame, tx, ty, Luma, chroma); } else { + CHECK_OVERREAD_SIZE(4); tmp = *buf++; if(tmp & 0x80) { angle = (tmp >> 4) & 0x7; diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 1685b4d196..8cef043cb2 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -33,6 +33,7 @@ #include "libavutil/imgutils.h" #include "libavutil/samplefmt.h" #include "libavutil/dict.h" +#include "libavutil/avassert.h" #include "avcodec.h" #include "dsputil.h" #include "libavutil/opt.h" @@ -166,10 +167,8 @@ void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, case PIX_FMT_GBRP9BE: case PIX_FMT_GBRP10LE: case PIX_FMT_GBRP10BE: - w_align= 16; //FIXME check for non mpeg style codecs and use less alignment - h_align= 16; - if(s->codec_id == CODEC_ID_MPEG2VIDEO || s->codec_id == CODEC_ID_MJPEG || s->codec_id == CODEC_ID_AMV || s->codec_id == CODEC_ID_THP || s->codec_id == CODEC_ID_H264 || s->codec_id == CODEC_ID_PRORES) - h_align= 32; // interlaced is rounded up to 2 MBs + w_align = 16; //FIXME assume 16 pixel per macroblock + h_align = 16 * 2; // interlaced needs 2 macroblocks height break; case PIX_FMT_YUV411P: case PIX_FMT_UYYVYY411: @@ -999,9 +998,10 @@ int attribute_align_arg avcodec_decode_audio3(AVCodecContext *avctx, int16_t *sa int ret, got_frame = 0; if (avctx->get_buffer != avcodec_default_get_buffer) { - av_log(avctx, AV_LOG_ERROR, "A custom get_buffer() cannot be used with " + av_log(avctx, AV_LOG_ERROR, "Overriding custom get_buffer() for " "avcodec_decode_audio3()\n"); - return AVERROR(EINVAL); + avctx->get_buffer = avcodec_default_get_buffer; + avctx->release_buffer = avcodec_default_release_buffer; } ret = avcodec_decode_audio4(avctx, &frame, &got_frame, avpkt); @@ -1373,6 +1373,12 @@ const char *av_get_profile_name(const AVCodec *codec, int profile) unsigned avcodec_version( void ) { + av_assert0(CODEC_ID_V410==164); + av_assert0(CODEC_ID_PCM_S8_PLANAR==65563); + av_assert0(CODEC_ID_ADPCM_G722==69660); + av_assert0(CODEC_ID_BMV_AUDIO==86071); + av_assert0(CODEC_ID_SRT==94216); + return LIBAVCODEC_VERSION_INT; } diff --git a/libavcodec/v210dec.c b/libavcodec/v210dec.c index 68dbd3753a..147f1f20be 100644 --- a/libavcodec/v210dec.c +++ b/libavcodec/v210dec.c @@ -158,7 +158,7 @@ static av_cold int decode_close(AVCodecContext *avctx) return 0; } -#define V210DEC_FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM +#define V210DEC_FLAGS AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM static const AVOption v210dec_options[] = { {"custom_stride", "Custom V210 stride", offsetof(V210DecContext, custom_stride), FF_OPT_TYPE_INT, {.dbl = 0}, INT_MIN, INT_MAX, V210DEC_FLAGS}, diff --git a/libavcodec/v410dec.c b/libavcodec/v410dec.c new file mode 100644 index 0000000000..c86009d31a --- /dev/null +++ b/libavcodec/v410dec.c @@ -0,0 +1,118 @@ +/* + * v410 decoder + * + * Copyright (c) 2011 Derek Buitenhuis + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "avcodec.h" +#include "get_bits.h" + +static av_cold int v410_decode_init(AVCodecContext *avctx) +{ + avctx->pix_fmt = PIX_FMT_YUV444P10; + avctx->bits_per_raw_sample = 10; + + if (avctx->width & 1) { + av_log(avctx, AV_LOG_ERROR, "v410 requires width to be even.\n"); + return AVERROR_INVALIDDATA; + } + + avctx->coded_frame = avcodec_alloc_frame(); + + if (!avctx->coded_frame) { + av_log(avctx, AV_LOG_ERROR, "Could not allocate frame.\n"); + return AVERROR(ENOMEM); + } + + return 0; +} + +static int v410_decode_frame(AVCodecContext *avctx, void *data, + int *data_size, AVPacket *avpkt) +{ + AVFrame *pic = avctx->coded_frame; + uint8_t *src = avpkt->data; + uint16_t *y, *u, *v; + uint32_t val; + int i, j; + + if (pic->data[0]) + avctx->release_buffer(avctx, pic); + + if (avpkt->size < 4*avctx->height*avctx->width) { + av_log(avctx, AV_LOG_ERROR, "Insufficient input data.\n"); + return AVERROR(EINVAL); + } + + pic->reference = 0; + + if (avctx->get_buffer(avctx, pic) < 0) { + av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n"); + return AVERROR(ENOMEM); + } + + pic->key_frame = 1; + pic->pict_type = FF_I_TYPE; + + y = (uint16_t *)pic->data[0]; + u = (uint16_t *)pic->data[1]; + v = (uint16_t *)pic->data[2]; + + for (i = 0; i < avctx->height; i++) { + for (j = 0; j < avctx->width; j++) { + val = AV_RL32(src); + + u[j] = (val >> 2) & 0x3FF; + y[j] = (val >> 12) & 0x3FF; + v[j] = (val >> 22); + + src += 4; + } + + y += pic->linesize[0] >> 1; + u += pic->linesize[1] >> 1; + v += pic->linesize[2] >> 1; + } + + *data_size = sizeof(AVFrame); + *(AVFrame *)data = *pic; + + return avpkt->size; +} + +static av_cold int v410_decode_close(AVCodecContext *avctx) +{ + if (avctx->coded_frame->data[0]) + avctx->release_buffer(avctx, avctx->coded_frame); + + av_freep(&avctx->coded_frame); + + return 0; +} + +AVCodec ff_v410_decoder = { + .name = "v410", + .type = AVMEDIA_TYPE_VIDEO, + .id = CODEC_ID_V410, + .init = v410_decode_init, + .decode = v410_decode_frame, + .close = v410_decode_close, + .capabilities = CODEC_CAP_DR1, + .long_name = NULL_IF_CONFIG_SMALL("Uncompressed 4:4:4 10-bit"), +}; diff --git a/libavcodec/v410enc.c b/libavcodec/v410enc.c new file mode 100644 index 0000000000..52f87ae940 --- /dev/null +++ b/libavcodec/v410enc.c @@ -0,0 +1,99 @@ +/* + * v410 encoder + * + * Copyright (c) 2011 Derek Buitenhuis + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "avcodec.h" +#include "put_bits.h" + +static av_cold int v410_encode_init(AVCodecContext *avctx) +{ + if (avctx->width & 1) { + av_log(avctx, AV_LOG_ERROR, "v410 requires width to be even.\n"); + return AVERROR_INVALIDDATA; + } + + avctx->coded_frame = avcodec_alloc_frame(); + + if (!avctx->coded_frame) { + av_log(avctx, AV_LOG_ERROR, "Could not allocate frame.\n"); + return AVERROR(ENOMEM); + } + + return 0; +} + +static int v410_encode_frame(AVCodecContext *avctx, uint8_t *buf, + int buf_size, void *data) +{ + AVFrame *pic = data; + uint8_t *dst = buf; + uint16_t *y, *u, *v; + uint32_t val; + int i, j; + int output_size = 0; + + if (buf_size < avctx->width * avctx->height * 4) { + av_log(avctx, AV_LOG_ERROR, "Out buffer is too small.\n"); + return AVERROR(ENOMEM); + } + + avctx->coded_frame->reference = 0; + avctx->coded_frame->key_frame = 1; + avctx->coded_frame->pict_type = FF_I_TYPE; + + y = (uint16_t *)pic->data[0]; + u = (uint16_t *)pic->data[1]; + v = (uint16_t *)pic->data[2]; + + for (i = 0; i < avctx->height; i++) { + for (j = 0; j < avctx->width; j++) { + val = u[j] << 2; + val |= y[j] << 12; + val |= v[j] << 22; + AV_WL32(dst, val); + dst += 4; + output_size += 4; + } + y += pic->linesize[0] >> 1; + u += pic->linesize[1] >> 1; + v += pic->linesize[2] >> 1; + } + + return output_size; +} + +static av_cold int v410_encode_close(AVCodecContext *avctx) +{ + av_freep(&avctx->coded_frame); + + return 0; +} + +AVCodec ff_v410_encoder = { + .name = "v410", + .type = AVMEDIA_TYPE_VIDEO, + .id = CODEC_ID_V410, + .init = v410_encode_init, + .encode = v410_encode_frame, + .close = v410_encode_close, + .pix_fmts = (const enum PixelFormat[]){ PIX_FMT_YUV444P10, PIX_FMT_NONE }, + .long_name = NULL_IF_CONFIG_SMALL("Uncompressed 4:4:4 10-bit"), +}; diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index 775caa69f8..284cbead96 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -578,6 +578,8 @@ int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) { int pqindex, lowquant, status; + v->field_mode = 0; + v->fcm = 0; if (v->finterpflag) v->interpfrm = get_bits1(gb); skip_bits(gb, 2); //framecnt unused diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c index 20b7f72291..219f8dd468 100644 --- a/libavcodec/vc1dec.c +++ b/libavcodec/vc1dec.c @@ -568,6 +568,7 @@ static void vc1_mc_1mv(VC1Context *v, int dir) } if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) + || s->h_edge_pos < 22 || v_edge_pos < 22 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel * 3 || (unsigned)(src_y - s->mspel) > v_edge_pos - (my&3) - 16 - s->mspel * 3) { uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize; @@ -799,6 +800,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir) if (fieldmv && (src_y & 1) && src_y < 4) src_y--; if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) + || s->h_edge_pos < 13 || v_edge_pos < 23 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx & 3) - 8 - s->mspel * 2 || (unsigned)(src_y - (s->mspel << fieldmv)) > v_edge_pos - (my & 3) - ((8 + s->mspel * 2) << fieldmv)) { srcY -= s->mspel * (1 + (s->linesize << fieldmv)); @@ -998,6 +1000,7 @@ static void vc1_mc_4mv_chroma(VC1Context *v, int dir) } if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) + || s->h_edge_pos < 18 || v_edge_pos < 18 || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9 || (unsigned)uvsrc_y > (v_edge_pos >> 1) - 9) { s->dsp.emulated_edge_mc(s->edge_emu_buffer , srcU, s->uvlinesize, @@ -1102,6 +1105,7 @@ static void vc1_mc_4mv_chroma4(VC1Context *v) if (fieldmv && (uvsrc_y & 1) && uvsrc_y < 2) uvsrc_y--; if ((v->mv_mode == MV_PMODE_INTENSITY_COMP) + || s->h_edge_pos < 10 || v_edge_pos < (5 << fieldmv) || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 5 || (unsigned)uvsrc_y > v_edge_pos - (5 << fieldmv)) { s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcU, s->uvlinesize, @@ -2006,7 +2010,7 @@ static void vc1_interp_mc(VC1Context *v) srcV = s->edge_emu_buffer + 18 * s->linesize; } - if (v->rangeredfrm + if (v->rangeredfrm || s->h_edge_pos < 22 || v_edge_pos < 22 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx & 3) - 16 - s->mspel * 3 || (unsigned)(src_y - s->mspel) > v_edge_pos - (my & 3) - 16 - s->mspel * 3) { uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize; diff --git a/libavcodec/vcr1.c b/libavcodec/vcr1.c index 0c06813cf1..caeb29c487 100644 --- a/libavcodec/vcr1.c +++ b/libavcodec/vcr1.c @@ -56,6 +56,11 @@ static int decode_frame(AVCodecContext *avctx, if(p->data[0]) avctx->release_buffer(avctx, p); + if(buf_size < 16 + avctx->height + avctx->width*avctx->height*5/8){ + av_log(avctx, AV_LOG_ERROR, "Insufficient input data.\n"); + return AVERROR(EINVAL); + } + p->reference= 0; if(avctx->get_buffer(avctx, p) < 0){ av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); diff --git a/libavcodec/version.h b/libavcodec/version.h index 0e2c58e852..8d7f4a8d38 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -22,7 +22,7 @@ #define LIBAVCODEC_VERSION_MAJOR 53 #define LIBAVCODEC_VERSION_MINOR 42 -#define LIBAVCODEC_VERSION_MICRO 0 +#define LIBAVCODEC_VERSION_MICRO 4 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ diff --git a/libavcodec/vmdav.c b/libavcodec/vmdav.c index ec7c967f74..7006f61f2b 100644 --- a/libavcodec/vmdav.c +++ b/libavcodec/vmdav.c @@ -618,7 +618,7 @@ static int vmdaudio_decode_frame(AVCodecContext *avctx, void *data, /* decode audio chunks */ if (audio_chunks > 0) { buf_end = buf + buf_size; - while (buf < buf_end) { + while ( buf_end - buf >= s->chunk_size) { if (s->out_bps == 2) { decode_audio_s16(output_samples_s16, buf, s->chunk_size, avctx->channels); diff --git a/libavcodec/vmnc.c b/libavcodec/vmnc.c index 7655103b6a..ecde81c4f2 100644 --- a/libavcodec/vmnc.c +++ b/libavcodec/vmnc.c @@ -275,6 +275,11 @@ static int decode_hextile(VmncContext *c, uint8_t* dst, const uint8_t* src, int } xy = *src++; wh = *src++; + if ( (xy >> 4) + (wh >> 4) + 1 > w - i + || (xy & 0xF) + (wh & 0xF)+1 > h - j) { + av_log(c->avctx, AV_LOG_ERROR, "Rectangle outside picture\n"); + return AVERROR_INVALIDDATA; + } paint_rect(dst2, xy >> 4, xy & 0xF, (wh>>4)+1, (wh & 0xF)+1, fg, bpp, stride); } } diff --git a/libavcodec/vorbis.c b/libavcodec/vorbis.c index 1624948626..9e5dfd8e7e 100644 --- a/libavcodec/vorbis.c +++ b/libavcodec/vorbis.c @@ -156,7 +156,7 @@ void ff_vorbis_ready_floor1_list(vorbis_floor1_entry * list, int values) } } -static inline void render_line_unrolled(intptr_t x, intptr_t y, int x1, +static inline void render_line_unrolled(intptr_t x, unsigned char y, int x1, intptr_t sy, int ady, int adx, float *buf) { @@ -179,7 +179,7 @@ static inline void render_line_unrolled(intptr_t x, intptr_t y, int x1, } } -static void render_line(int x0, int y0, int x1, int y1, float *buf) +static void render_line(int x0, unsigned char y0, int x1, int y1, float *buf) { int dy = y1 - y0; int adx = x1 - x0; @@ -191,7 +191,7 @@ static void render_line(int x0, int y0, int x1, int y1, float *buf) } else { int base = dy / adx; int x = x0; - int y = y0; + unsigned char y = y0; int err = -adx; ady -= FFABS(base) * adx; while (++x < x1) { diff --git a/libavcodec/vorbisdec.c b/libavcodec/vorbisdec.c index 03ecc38ed4..5e23580d92 100644 --- a/libavcodec/vorbisdec.c +++ b/libavcodec/vorbisdec.c @@ -595,6 +595,10 @@ static int vorbis_parse_setup_hdr_floors(vorbis_context *vc) "Floor 0 amplitude bits is 0.\n"); return AVERROR_INVALIDDATA; } + if (floor_setup->data.t0.bark_map_size == 0) { + av_log(vc->avccontext, AV_LOG_ERROR, "Floor 0 bark map size is 0.\n"); + return AVERROR_INVALIDDATA; + } floor_setup->data.t0.amplitude_offset = get_bits(gb, 8); floor_setup->data.t0.num_books = get_bits(gb, 4) + 1; @@ -679,7 +683,7 @@ static int vorbis_parse_setup_hdr_residues(vorbis_context *vc) res_setup->partition_size = get_bits(gb, 24) + 1; /* Validations to prevent a buffer overflow later. */ if (res_setup->begin>res_setup->end || - res_setup->end > vc->avccontext->channels * vc->blocksize[1] / 2 || + res_setup->end > (res_setup->type == 2 ? vc->avccontext->channels : 1) * vc->blocksize[1] / 2 || (res_setup->end-res_setup->begin) / res_setup->partition_size > V_MAX_PARTITIONS) { av_log(vc->avccontext, AV_LOG_ERROR, "partition out of bounds: type, begin, end, size, blocksize: %"PRIu16", %"PRIu32", %"PRIu32", %u, %"PRIu32"\n", @@ -935,12 +939,12 @@ static int vorbis_parse_id_hdr(vorbis_context *vc) vc->bitrate_minimum = get_bits_long(gb, 32); bl0 = get_bits(gb, 4); bl1 = get_bits(gb, 4); - vc->blocksize[0] = (1 << bl0); - vc->blocksize[1] = (1 << bl1); if (bl0 > 13 || bl0 < 6 || bl1 > 13 || bl1 < 6 || bl1 < bl0) { av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis id header packet corrupt (illegal blocksize). \n"); return AVERROR_INVALIDDATA; } + vc->blocksize[0] = (1 << bl0); + vc->blocksize[1] = (1 << bl1); vc->win[0] = ff_vorbis_vwin[bl0 - 6]; vc->win[1] = ff_vorbis_vwin[bl1 - 6]; @@ -1286,6 +1290,7 @@ static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc, uint8_t *do_not_decode, float *vec, unsigned vlen, + unsigned ch_left, int vr_type) { GetBitContext *gb = &vc->gb; @@ -1293,6 +1298,7 @@ static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc, unsigned ptns_to_read = vr->ptns_to_read; uint8_t *classifs = vr->classifs; unsigned pass, ch_used, i, j, k, l; + unsigned max_output = (ch - 1) * vlen; if (vr_type == 2) { for (j = 1; j < ch; ++j) @@ -1300,8 +1306,15 @@ static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc, if (do_not_decode[0]) return 0; ch_used = 1; + max_output += vr->end / ch; } else { ch_used = ch; + max_output += vr->end; + } + + if (max_output > ch_left * vlen) { + av_log(vc->avccontext, AV_LOG_ERROR, "Insufficient output buffer\n"); + return -1; } av_dlog(NULL, " residue type 0/1/2 decode begin, ch: %d cpc %d \n", ch, c_p_c); @@ -1428,14 +1441,15 @@ static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc, static inline int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, unsigned ch, uint8_t *do_not_decode, - float *vec, unsigned vlen) + float *vec, unsigned vlen, + unsigned ch_left) { if (vr->type == 2) - return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, 2); + return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, ch_left, 2); else if (vr->type == 1) - return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, 1); + return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, ch_left, 1); else if (vr->type == 0) - return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, 0); + return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, ch_left, 0); else { av_log(vc->avccontext, AV_LOG_ERROR, " Invalid residue type while residue decode?! \n"); return AVERROR_INVALIDDATA; @@ -1483,6 +1497,8 @@ static int vorbis_parse_audio_packet(vorbis_context *vc) uint8_t res_chan[255]; unsigned res_num = 0; int retlen = 0; + unsigned ch_left = vc->audio_channels; + unsigned vlen; if (get_bits1(gb)) { av_log(vc->avccontext, AV_LOG_ERROR, "Not a Vorbis I audio packet.\n"); @@ -1502,11 +1518,12 @@ static int vorbis_parse_audio_packet(vorbis_context *vc) blockflag = vc->modes[mode_number].blockflag; blocksize = vc->blocksize[blockflag]; + vlen = blocksize / 2; if (blockflag) skip_bits(gb, 2); // previous_window, next_window - memset(ch_res_ptr, 0, sizeof(float) * vc->audio_channels * blocksize / 2); //FIXME can this be removed ? - memset(ch_floor_ptr, 0, sizeof(float) * vc->audio_channels * blocksize / 2); //FIXME can this be removed ? + memset(ch_res_ptr, 0, sizeof(float) * vc->audio_channels * vlen); //FIXME can this be removed ? + memset(ch_floor_ptr, 0, sizeof(float) * vc->audio_channels * vlen); //FIXME can this be removed ? // Decode floor @@ -1526,7 +1543,7 @@ static int vorbis_parse_audio_packet(vorbis_context *vc) return AVERROR_INVALIDDATA; } no_residue[i] = ret; - ch_floor_ptr += blocksize / 2; + ch_floor_ptr += vlen; } // Nonzero vector propagate @@ -1543,6 +1560,7 @@ static int vorbis_parse_audio_packet(vorbis_context *vc) for (i = 0; i < mapping->submaps; ++i) { vorbis_residue *residue; unsigned ch = 0; + int ret; for (j = 0; j < vc->audio_channels; ++j) { if ((mapping->submaps == 1) || (i == mapping->mux[j])) { @@ -1557,9 +1575,18 @@ static int vorbis_parse_audio_packet(vorbis_context *vc) } } residue = &vc->residues[mapping->submap_residue[i]]; - vorbis_residue_decode(vc, residue, ch, do_not_decode, ch_res_ptr, blocksize/2); + if (ch_left < ch) { + av_log(vc->avccontext, AV_LOG_ERROR, "Too many channels in vorbis_floor_decode.\n"); + return -1; + } + if (ch) { + ret = vorbis_residue_decode(vc, residue, ch, do_not_decode, ch_res_ptr, vlen, ch_left); + if (ret < 0) + return ret; + } - ch_res_ptr += ch * blocksize / 2; + ch_res_ptr += ch * vlen; + ch_left -= ch; } // Inverse coupling diff --git a/libavcodec/vqavideo.c b/libavcodec/vqavideo.c index 917e04be47..727354defa 100644 --- a/libavcodec/vqavideo.c +++ b/libavcodec/vqavideo.c @@ -164,6 +164,11 @@ static av_cold int vqa_decode_init(AVCodecContext *avctx) s->codebook = av_malloc(s->codebook_size); s->next_codebook_buffer = av_malloc(s->codebook_size); + if (s->width % s->vector_width || s->height % s->vector_height) { + av_log(avctx, AV_LOG_ERROR, "Picture dimensions are not a multiple of the vector size\n"); + return AVERROR_INVALIDDATA; + } + /* initialize the solid-color vectors */ if (s->vector_height == 4) { codebook_index = 0xFF00 * 16; diff --git a/libavcodec/w32pthreads.h b/libavcodec/w32pthreads.h index 2d1470c5ee..70b84cf2e1 100644 --- a/libavcodec/w32pthreads.h +++ b/libavcodec/w32pthreads.h @@ -120,7 +120,7 @@ typedef struct { volatile int waiter_count; HANDLE semaphore; HANDLE waiters_done; - int is_broadcast; + volatile int is_broadcast; } win32_cond_t; static void pthread_cond_init(pthread_cond_t *cond, const void *unused_attr) @@ -139,7 +139,7 @@ static void pthread_cond_init(pthread_cond_t *cond, const void *unused_attr) win32_cond->semaphore = CreateSemaphore(NULL, 0, 0x7fffffff, NULL); if (!win32_cond->semaphore) return; - win32_cond->waiters_done = CreateEvent(NULL, FALSE, FALSE, NULL); + win32_cond->waiters_done = CreateEvent(NULL, TRUE, FALSE, NULL); if (!win32_cond->waiters_done) return; @@ -187,6 +187,7 @@ static void pthread_cond_broadcast(pthread_cond_t *cond) ReleaseSemaphore(win32_cond->semaphore, win32_cond->waiter_count, NULL); pthread_mutex_unlock(&win32_cond->mtx_waiter_count); WaitForSingleObject(win32_cond->waiters_done, INFINITE); + ResetEvent(win32_cond->waiters_done); win32_cond->is_broadcast = 0; } else pthread_mutex_unlock(&win32_cond->mtx_waiter_count); @@ -204,11 +205,10 @@ static void pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) /* non native condition variables */ pthread_mutex_lock(&win32_cond->mtx_broadcast); - pthread_mutex_unlock(&win32_cond->mtx_broadcast); - pthread_mutex_lock(&win32_cond->mtx_waiter_count); win32_cond->waiter_count++; pthread_mutex_unlock(&win32_cond->mtx_waiter_count); + pthread_mutex_unlock(&win32_cond->mtx_broadcast); // unlock the external mutex pthread_mutex_unlock(mutex); @@ -216,7 +216,7 @@ static void pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) pthread_mutex_lock(&win32_cond->mtx_waiter_count); win32_cond->waiter_count--; - last_waiter = !win32_cond->waiter_count && win32_cond->is_broadcast; + last_waiter = !win32_cond->waiter_count || !win32_cond->is_broadcast; pthread_mutex_unlock(&win32_cond->mtx_waiter_count); if (last_waiter) @@ -235,13 +235,20 @@ static void pthread_cond_signal(pthread_cond_t *cond) return; } + pthread_mutex_lock(&win32_cond->mtx_broadcast); + /* non-native condition variables */ pthread_mutex_lock(&win32_cond->mtx_waiter_count); have_waiter = win32_cond->waiter_count; pthread_mutex_unlock(&win32_cond->mtx_waiter_count); - if (have_waiter) + if (have_waiter) { ReleaseSemaphore(win32_cond->semaphore, 1, NULL); + WaitForSingleObject(win32_cond->waiters_done, INFINITE); + ResetEvent(win32_cond->waiters_done); + } + + pthread_mutex_unlock(&win32_cond->mtx_broadcast); } static void w32thread_init(void) diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c index 1a8c25943f..5b05e59ea9 100644 --- a/libavcodec/wavpack.c +++ b/libavcodec/wavpack.c @@ -408,7 +408,7 @@ static inline int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc, in bit = (((S + bit) << s->shift) - bit); if(s->hybrid) - bit = av_clip(bit, -s->hybrid_maxclip, s->hybrid_maxclip - 1); + bit = av_clip(bit, -s->hybrid_maxclip - 1, s->hybrid_maxclip); return bit << s->post_shift; } @@ -783,13 +783,6 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, s->samples = wc->samples; } s->frame_flags = AV_RL32(buf); buf += 4; - if(s->frame_flags&0x80){ - avctx->sample_fmt = AV_SAMPLE_FMT_FLT; - } else if((s->frame_flags&0x03) <= 1){ - avctx->sample_fmt = AV_SAMPLE_FMT_S16; - } else { - avctx->sample_fmt = AV_SAMPLE_FMT_S32; - } bpp = av_get_bytes_per_sample(avctx->sample_fmt); samples = (uint8_t*)samples + bpp * wc->ch_offset; @@ -798,7 +791,7 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, s->joint = s->frame_flags & WV_JOINT_STEREO; s->hybrid = s->frame_flags & WV_HYBRID_MODE; s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE; - s->hybrid_maxclip = 1 << ((((s->frame_flags & 0x03) + 1) << 3) - 1); + s->hybrid_maxclip = (1LL << ((((s->frame_flags & 0x03) + 1) << 3) - 1)) - 1; s->post_shift = 8 * (bpp-1-(s->frame_flags&0x03)) + ((s->frame_flags >> 13) & 0x1f); s->CRC = AV_RL32(buf); buf += 4; if(wc->mkv_mode) @@ -1147,7 +1140,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, WavpackContext *s = avctx->priv_data; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; - int frame_size, ret; + int frame_size, ret, frame_flags; int samplecount = 0; s->block = 0; @@ -1155,12 +1148,16 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, /* determine number of samples */ if(s->mkv_mode){ - s->samples = AV_RL32(buf); buf += 4; + s->samples = AV_RL32(buf); buf += 4; + frame_flags = AV_RL32(buf); } else { - if (s->multichannel) - s->samples = AV_RL32(buf + 4); - else - s->samples = AV_RL32(buf); + if (s->multichannel) { + s->samples = AV_RL32(buf + 4); + frame_flags = AV_RL32(buf + 8); + } else { + s->samples = AV_RL32(buf); + frame_flags = AV_RL32(buf + 4); + } } if (s->samples <= 0) { av_log(avctx, AV_LOG_ERROR, "Invalid number of samples: %d\n", @@ -1168,6 +1165,14 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, return AVERROR(EINVAL); } + if (frame_flags & 0x80) { + avctx->sample_fmt = AV_SAMPLE_FMT_FLT; + } else if ((frame_flags & 0x03) <= 1) { + avctx->sample_fmt = AV_SAMPLE_FMT_S16; + } else { + avctx->sample_fmt = AV_SAMPLE_FMT_S32; + } + /* get output buffer */ s->frame.nb_samples = s->samples; if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) { diff --git a/libavcodec/wmalosslessdec.c b/libavcodec/wmalosslessdec.c index 2b32bccba1..691bfbf00a 100644 --- a/libavcodec/wmalosslessdec.c +++ b/libavcodec/wmalosslessdec.c @@ -235,11 +235,11 @@ typedef struct WmallDecodeCtx { int8_t mclms_order; int8_t mclms_scaling; - int16_t mclms_coeffs[128]; - int16_t mclms_coeffs_cur[4]; - int16_t mclms_prevvalues[64]; // FIXME: should be 32-bit / 16-bit depending on bit-depth - int16_t mclms_updates[64]; - int mclms_recent; + int16_t mclms_coeffs[WMALL_MAX_CHANNELS * WMALL_MAX_CHANNELS * 32]; + int16_t mclms_coeffs_cur[WMALL_MAX_CHANNELS * WMALL_MAX_CHANNELS]; + int16_t mclms_prevvalues[WMALL_MAX_CHANNELS * 2 * 32]; + int16_t mclms_updates[WMALL_MAX_CHANNELS * 2 * 32]; + int mclms_recent; int movave_scaling; int quant_stepsize; diff --git a/libavcodec/wmavoice.c b/libavcodec/wmavoice.c index 45383b033b..caa9307d77 100644 --- a/libavcodec/wmavoice.c +++ b/libavcodec/wmavoice.c @@ -25,6 +25,8 @@ * @author Ronald S. Bultje */ +#define UNCHECKED_BITSTREAM_READER 1 + #include #include "avcodec.h" #include "get_bits.h" diff --git a/libavcodec/ws-snd1.c b/libavcodec/ws-snd1.c index b7e28f5e56..2cb8bb44a6 100644 --- a/libavcodec/ws-snd1.c +++ b/libavcodec/ws-snd1.c @@ -112,8 +112,8 @@ static int ws_snd_decode_frame(AVCodecContext *avctx, void *data, /* make sure we don't write past the output buffer */ switch (code) { - case 0: smp = 4; break; - case 1: smp = 2; break; + case 0: smp = 4*(count+1); break; + case 1: smp = 2*(count+1); break; case 2: smp = (count & 0x20) ? 1 : count + 1; break; default: smp = count + 1; break; } diff --git a/libavcodec/x86/dsputil_yasm.asm b/libavcodec/x86/dsputil_yasm.asm index dcd6fa4223..0f533241b1 100644 --- a/libavcodec/x86/dsputil_yasm.asm +++ b/libavcodec/x86/dsputil_yasm.asm @@ -475,7 +475,7 @@ cglobal scalarproduct_float_sse, 3,3,2, v1, v2, offset shufps xmm0, xmm0, 1 addss xmm0, xmm1 %ifndef ARCH_X86_64 - movd r0m, xmm0 + movss r0m, xmm0 fld dword r0m %endif RET diff --git a/libavcodec/x86/dsputilenc_mmx.c b/libavcodec/x86/dsputilenc_mmx.c index f13c1219da..35d50bec9e 100644 --- a/libavcodec/x86/dsputilenc_mmx.c +++ b/libavcodec/x86/dsputilenc_mmx.c @@ -823,6 +823,7 @@ static int vsad16_mmx2(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, i static void diff_bytes_mmx(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){ x86_reg i=0; + if(w>=16) __asm__ volatile( "1: \n\t" "movq (%2, %0), %%mm0 \n\t" diff --git a/libavcodec/x86/imdct36_sse.asm b/libavcodec/x86/imdct36_sse.asm index 2b8fe57e0b..95a7c0154c 100644 --- a/libavcodec/x86/imdct36_sse.asm +++ b/libavcodec/x86/imdct36_sse.asm @@ -357,5 +357,7 @@ DEFINE_IMDCT ssse3 %define BUILDINVHIGHLOW BUILDINVHIGHLOW_AVX %define PSHUFD PSHUFD_SSE_AVX +%ifdef HAVE_AVX INIT_AVX DEFINE_IMDCT avx +%endif diff --git a/libavcodec/x86/proresdsp.asm b/libavcodec/x86/proresdsp.asm index d674308c05..f733bdf7cb 100644 --- a/libavcodec/x86/proresdsp.asm +++ b/libavcodec/x86/proresdsp.asm @@ -306,7 +306,9 @@ INIT_XMM idct_put_fn sse2, 16 INIT_XMM idct_put_fn sse4, 16 +%ifdef HAVE_AVX INIT_AVX idct_put_fn avx, 16 +%endif %endif diff --git a/libavcodec/x86/v210-init.c b/libavcodec/x86/v210-init.c index 4dd6d6de8a..425c6284c5 100644 --- a/libavcodec/x86/v210-init.c +++ b/libavcodec/x86/v210-init.c @@ -34,14 +34,14 @@ av_cold void v210_x86_init(V210DecContext *s) if (cpu_flags & AV_CPU_FLAG_SSSE3) s->unpack_frame = ff_v210_planar_unpack_aligned_ssse3; - if (cpu_flags & AV_CPU_FLAG_AVX) + if (HAVE_AVX && cpu_flags & AV_CPU_FLAG_AVX) s->unpack_frame = ff_v210_planar_unpack_aligned_avx; } else { if (cpu_flags & AV_CPU_FLAG_SSSE3) s->unpack_frame = ff_v210_planar_unpack_unaligned_ssse3; - if (cpu_flags & AV_CPU_FLAG_AVX) + if (HAVE_AVX && cpu_flags & AV_CPU_FLAG_AVX) s->unpack_frame = ff_v210_planar_unpack_unaligned_avx; } #endif diff --git a/libavcodec/x86/v210.asm b/libavcodec/x86/v210.asm index 344bed0beb..9ce17c2ed5 100644 --- a/libavcodec/x86/v210.asm +++ b/libavcodec/x86/v210.asm @@ -76,10 +76,14 @@ cglobal v210_planar_unpack_%1_%2, 5, 5 INIT_XMM v210_planar_unpack unaligned, ssse3 +%ifdef HAVE_AVX INIT_AVX v210_planar_unpack unaligned, avx +%endif INIT_XMM v210_planar_unpack aligned, ssse3 +%ifdef HAVE_AVX INIT_AVX v210_planar_unpack aligned, avx +%endif diff --git a/libavcodec/xl.c b/libavcodec/xl.c index c29e8b3190..78f34afa4e 100644 --- a/libavcodec/xl.c +++ b/libavcodec/xl.c @@ -68,6 +68,12 @@ static int decode_frame(AVCodecContext *avctx, V = a->pic.data[2]; stride = avctx->width - 4; + + if (buf_size < avctx->width * avctx->height) { + av_log(avctx, AV_LOG_ERROR, "Packet is too small\n"); + return AVERROR_INVALIDDATA; + } + for (i = 0; i < avctx->height; i++) { /* lines are stored in reversed order */ buf += stride; diff --git a/libavcodec/y41pdec.c b/libavcodec/y41pdec.c new file mode 100644 index 0000000000..ea9bf9282a --- /dev/null +++ b/libavcodec/y41pdec.c @@ -0,0 +1,116 @@ +/* + * y41p decoder + * + * Copyright (c) 2012 Paul B Mahol + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "avcodec.h" + +static av_cold int y41p_decode_init(AVCodecContext *avctx) +{ + avctx->pix_fmt = PIX_FMT_YUV411P; + avctx->bits_per_raw_sample = 12; + + if (avctx->width & 7) { + av_log(avctx, AV_LOG_WARNING, "y41p requires width to be divisible by 8.\n"); + } + + avctx->coded_frame = avcodec_alloc_frame(); + if (!avctx->coded_frame) { + av_log(avctx, AV_LOG_ERROR, "Could not allocate frame.\n"); + return AVERROR(ENOMEM); + } + + return 0; +} + +static int y41p_decode_frame(AVCodecContext *avctx, void *data, + int *data_size, AVPacket *avpkt) +{ + AVFrame *pic = avctx->coded_frame; + uint8_t *src = avpkt->data; + uint8_t *y, *u, *v; + int i, j; + + if (pic->data[0]) + avctx->release_buffer(avctx, pic); + + if (avpkt->size < 1.5 * avctx->height * avctx->width) { + av_log(avctx, AV_LOG_ERROR, "Insufficient input data.\n"); + return AVERROR(EINVAL); + } + + pic->reference = 0; + + if (avctx->get_buffer(avctx, pic) < 0) { + av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n"); + return AVERROR(ENOMEM); + } + + pic->key_frame = 1; + pic->pict_type = FF_I_TYPE; + + for (i = avctx->height - 1; i >= 0 ; i--) { + y = &pic->data[0][i * pic->linesize[0]]; + u = &pic->data[1][i * pic->linesize[1]]; + v = &pic->data[2][i * pic->linesize[2]]; + for (j = 0; j < avctx->width; j += 8) { + *(u++) = *src++; + *(y++) = *src++; + *(v++) = *src++; + *(y++) = *src++; + + *(u++) = *src++; + *(y++) = *src++; + *(v++) = *src++; + *(y++) = *src++; + + *(y++) = *src++; + *(y++) = *src++; + *(y++) = *src++; + *(y++) = *src++; + } + } + + *data_size = sizeof(AVFrame); + *(AVFrame *)data = *pic; + + return avpkt->size; +} + +static av_cold int y41p_decode_close(AVCodecContext *avctx) +{ + if (avctx->coded_frame->data[0]) + avctx->release_buffer(avctx, avctx->coded_frame); + + av_freep(&avctx->coded_frame); + + return 0; +} + +AVCodec ff_y41p_decoder = { + .name = "y41p", + .type = AVMEDIA_TYPE_VIDEO, + .id = CODEC_ID_Y41P, + .init = y41p_decode_init, + .decode = y41p_decode_frame, + .close = y41p_decode_close, + .capabilities = CODEC_CAP_DR1, + .long_name = NULL_IF_CONFIG_SMALL("Uncompressed YUV 4:1:1 12-bit"), +}; diff --git a/libavcodec/y41penc.c b/libavcodec/y41penc.c new file mode 100644 index 0000000000..b8b4a2e43b --- /dev/null +++ b/libavcodec/y41penc.c @@ -0,0 +1,101 @@ +/* + * y41p encoder + * + * Copyright (c) 2012 Paul B Mahol + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "avcodec.h" + +static av_cold int y41p_encode_init(AVCodecContext *avctx) +{ + if (avctx->width & 7) { + av_log(avctx, AV_LOG_ERROR, "y41p requires width to be divisible by 8.\n"); + return AVERROR_INVALIDDATA; + } + + avctx->coded_frame = avcodec_alloc_frame(); + + if (!avctx->coded_frame) { + av_log(avctx, AV_LOG_ERROR, "Could not allocate frame.\n"); + return AVERROR(ENOMEM); + } + + return 0; +} + +static int y41p_encode_frame(AVCodecContext *avctx, uint8_t *buf, + int buf_size, void *data) +{ + AVFrame *pic = data; + uint8_t *dst = buf; + uint8_t *y, *u, *v; + int i, j; + + if (buf_size < avctx->width * avctx->height * 1.5) { + av_log(avctx, AV_LOG_ERROR, "Out buffer is too small.\n"); + return AVERROR(ENOMEM); + } + + avctx->coded_frame->reference = 0; + avctx->coded_frame->key_frame = 1; + avctx->coded_frame->pict_type = FF_I_TYPE; + + for (i = avctx->height - 1; i >= 0; i--) { + y = &pic->data[0][i * pic->linesize[0]]; + u = &pic->data[1][i * pic->linesize[1]]; + v = &pic->data[2][i * pic->linesize[2]]; + for (j = 0; j < avctx->width; j += 8) { + *(dst++) = *(u++); + *(dst++) = *(y++); + *(dst++) = *(v++); + *(dst++) = *(y++); + + *(dst++) = *(u++); + *(dst++) = *(y++); + *(dst++) = *(v++); + *(dst++) = *(y++); + + *(dst++) = *(y++); + *(dst++) = *(y++); + *(dst++) = *(y++); + *(dst++) = *(y++); + } + } + + return avctx->width * avctx->height * 1.5; +} + +static av_cold int y41p_encode_close(AVCodecContext *avctx) +{ + av_freep(&avctx->coded_frame); + + return 0; +} + +AVCodec ff_y41p_encoder = { + .name = "y41p", + .type = AVMEDIA_TYPE_VIDEO, + .id = CODEC_ID_Y41P, + .init = y41p_encode_init, + .encode = y41p_encode_frame, + .close = y41p_encode_close, + .pix_fmts = (const enum PixelFormat[]) { PIX_FMT_YUV411P, + PIX_FMT_NONE }, + .long_name = NULL_IF_CONFIG_SMALL("Uncompressed YUV 4:1:1 12-bit"), +}; diff --git a/libavdevice/dv1394.h b/libavdevice/dv1394.h index 00706f7541..1bab0314c5 100644 --- a/libavdevice/dv1394.h +++ b/libavdevice/dv1394.h @@ -175,7 +175,8 @@ if(status.dropped_frames > 0) { reset_dv1394(); } else { - for(int i = 0; i < status.n_clear_frames; i++) { + int i; + for(i = 0; i < status.n_clear_frames; i++) { copy_DV_frame(); } } diff --git a/libavdevice/lavfi.c b/libavdevice/lavfi.c index 04dc3b233c..37c782a69c 100644 --- a/libavdevice/lavfi.c +++ b/libavdevice/lavfi.c @@ -88,6 +88,9 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx, #define FAIL(ERR) { ret = ERR; goto end; } + if (!pix_fmts) + FAIL(AVERROR(ENOMEM)); + avfilter_register_all(); buffersink = avfilter_get_by_name("buffersink"); diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c index dc54c4a205..15356fe980 100644 --- a/libavdevice/v4l2.c +++ b/libavdevice/v4l2.c @@ -41,7 +41,9 @@ #if HAVE_SYS_VIDEOIO_H #include #else +#if HAVE_ASM_TYPES_H #include +#endif #include #endif #include diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index 5327cf9b69..799ce7ba50 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -140,9 +140,9 @@ void avfilter_insert_pad(unsigned idx, unsigned *count, size_t padidx_off, (*links)[idx] = NULL; (*count)++; - for (i = idx+1; i < *count; i++) - if (*links[i]) - (*(unsigned *)((uint8_t *) *links[i] + padidx_off))++; + for (i = idx + 1; i < *count; i++) + if ((*links)[i]) + (*(unsigned *)((uint8_t *) (*links)[i] + padidx_off))++; } int avfilter_link(AVFilterContext *src, unsigned srcpad, @@ -677,7 +677,7 @@ void avfilter_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref) link->cur_buf->audio->sample_rate = samplesref->audio->sample_rate; /* Copy actual data into new samples buffer */ - for (i = 0; samplesref->data[i]; i++) + for (i = 0; samplesref->data[i] && i < 8; i++) memcpy(link->cur_buf->data[i], samplesref->data[i], samplesref->linesize[0]); avfilter_unref_buffer(samplesref); diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c index 5806339eb7..a2a9f11732 100644 --- a/libavfilter/src_movie.c +++ b/libavfilter/src_movie.c @@ -416,8 +416,10 @@ static int amovie_get_samples(AVFilterLink *outlink) /* decode and update the movie pkt */ ret = avcodec_decode_audio3(movie->codec_ctx, movie->samples_buf, &decoded_data_size, &movie->pkt); - if (ret < 0) + if (ret < 0) { + movie->pkt.size = 0; return ret; + } movie->pkt.data += ret; movie->pkt.size -= ret; diff --git a/libavfilter/transform.c b/libavfilter/transform.c index 800f784446..8afc5fea6a 100644 --- a/libavfilter/transform.c +++ b/libavfilter/transform.c @@ -116,19 +116,22 @@ void avfilter_get_matrix(float x_shift, float y_shift, float angle, float zoom, void avfilter_add_matrix(const float *m1, const float *m2, float *result) { - for (int i = 0; i < 9; i++) + int i; + for (i = 0; i < 9; i++) result[i] = m1[i] + m2[i]; } void avfilter_sub_matrix(const float *m1, const float *m2, float *result) { - for (int i = 0; i < 9; i++) + int i; + for (i = 0; i < 9; i++) result[i] = m1[i] - m2[i]; } void avfilter_mul_matrix(const float *m1, float scalar, float *result) { - for (int i = 0; i < 9; i++) + int i; + for (i = 0; i < 9; i++) result[i] = m1[i] * scalar; } diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c index 912a8547bb..bf43ea9ed1 100644 --- a/libavfilter/vf_drawtext.c +++ b/libavfilter/vf_drawtext.c @@ -805,7 +805,7 @@ static int draw_text(AVFilterContext *ctx, AVFilterBufferRef *picref, /* draw box */ if (dtext->draw_box) drawbox(picref, dtext->x, dtext->y, box_w, box_h, - dtext->box_line, dtext->pixel_step, dtext->boxcolor_rgba, + dtext->box_line, dtext->pixel_step, dtext->is_packed_rgb ? dtext->boxcolor_rgba : dtext->boxcolor, dtext->hsub, dtext->vsub, dtext->is_packed_rgb, dtext->rgba_map); if (dtext->shadowx || dtext->shadowy) { diff --git a/libavfilter/vf_fade.c b/libavfilter/vf_fade.c index 68cb567571..f20ba71c55 100644 --- a/libavfilter/vf_fade.c +++ b/libavfilter/vf_fade.c @@ -191,9 +191,9 @@ static int config_props(AVFilterLink *inlink) fade->alpha = fade->alpha ? ff_fmt_is_in(inlink->format, alpha_pix_fmts) : 0; fade->is_packed_rgb = ff_fill_rgba_map(fade->rgba_map, inlink->format) >= 0; - /* CCIR601/709 black level unless input is RGB or has alpha */ + /* use CCIR601/709 black level for studio-level pixel non-alpha components */ fade->black_level = - ff_fmt_is_in(inlink->format, studio_level_pix_fmts) || fade->alpha ? 0 : 16; + ff_fmt_is_in(inlink->format, studio_level_pix_fmts) && !fade->alpha ? 16 : 0; /* 32768 = 1 << 15, it is an integer representation * of 0.5 and is for rounding. */ fade->black_level_scaled = (fade->black_level << 16) + 32768; diff --git a/libavformat/Makefile b/libavformat/Makefile index ca66a39677..0500b61258 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -287,6 +287,7 @@ OBJS-$(CONFIG_SEGMENT_MUXER) += segment.o OBJS-$(CONFIG_SHORTEN_DEMUXER) += rawdec.o OBJS-$(CONFIG_SIFF_DEMUXER) += siff.o OBJS-$(CONFIG_SMACKER_DEMUXER) += smacker.o +OBJS-$(CONFIG_SMJPEG_DEMUXER) += smjpeg.o OBJS-$(CONFIG_SOL_DEMUXER) += sol.o pcm.o OBJS-$(CONFIG_SOX_DEMUXER) += soxdec.o pcm.o OBJS-$(CONFIG_SOX_MUXER) += soxenc.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index 9593bd5a08..27de11679a 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -211,6 +211,7 @@ void av_register_all(void) REGISTER_DEMUXER (SHORTEN, shorten); REGISTER_DEMUXER (SIFF, siff); REGISTER_DEMUXER (SMACKER, smacker); + REGISTER_DEMUXER (SMJPEG, smjpeg); REGISTER_DEMUXER (SOL, sol); REGISTER_MUXDEMUX (SOX, sox); REGISTER_MUXDEMUX (SPDIF, spdif); diff --git a/libavformat/applehttp.c b/libavformat/applehttp.c index 1694096d9b..d530db4952 100644 --- a/libavformat/applehttp.c +++ b/libavformat/applehttp.c @@ -204,7 +204,7 @@ static int parse_playlist(AppleHTTPContext *c, const char *url, enum KeyType key_type = KEY_NONE; uint8_t iv[16] = ""; int has_iv = 0; - char key[MAX_URL_SIZE]; + char key[MAX_URL_SIZE] = ""; char line[1024]; const char *ptr; int close_in = 0; @@ -503,8 +503,15 @@ static int applehttp_read_header(AVFormatContext *s, AVFormatParameters *ap) v->pb.seekable = 0; ret = av_probe_input_buffer(&v->pb, &in_fmt, v->segments[0]->url, NULL, 0, 0); - if (ret < 0) + if (ret < 0) { + /* Free the ctx - it isn't initialized properly at this point, + * so avformat_close_input shouldn't be called. If + * avformat_open_input fails below, it frees and zeros the + * context, so it doesn't need any special treatment like this. */ + avformat_free_context(v->ctx); + v->ctx = NULL; goto fail; + } v->ctx->pb = &v->pb; ret = avformat_open_input(&v->ctx, v->segments[0]->url, in_fmt, NULL); if (ret < 0) diff --git a/libavformat/asfdec.c b/libavformat/asfdec.c index 0bb210bcd6..6386e96377 100644 --- a/libavformat/asfdec.c +++ b/libavformat/asfdec.c @@ -765,7 +765,7 @@ static int ff_asf_get_packet(AVFormatContext *s, AVIOContext *pb) c= avio_r8(pb); d= avio_r8(pb); rsize+=3; - }else{ + }else if(!url_feof(pb)){ avio_seek(pb, -1, SEEK_CUR); //FIXME } diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 1f3506d158..f2b431730e 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1641,12 +1641,22 @@ int av_read_pause(AVFormatContext *s); */ void av_close_input_stream(AVFormatContext *s); +#if FF_API_CLOSE_INPUT_FILE /** + * @deprecated use avformat_close_input() * Close a media file (but not its codecs). * * @param s media file handle */ +attribute_deprecated void av_close_input_file(AVFormatContext *s); +#endif + +/** + * Close an opened input AVFormatContext. Free it and all its contents + * and set *s to NULL. + */ +void avformat_close_input(AVFormatContext **s); /** * @} */ diff --git a/libavformat/avidec.c b/libavformat/avidec.c index 116099ad6b..287fa4e380 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -387,6 +387,11 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) tag = avio_rl32(pb); size = avio_rl32(pb); + if(size > avi->fsize){ + av_log(s, AV_LOG_ERROR, "chunk size is too big during header parsing\n"); + goto fail; + } + print_tag("tag", tag, size); switch(tag) { @@ -954,9 +959,9 @@ start_sync: || st->discard >= AVDISCARD_ALL){ if (!exit_early) { ast->frame_offset += get_duration(ast, size); + avio_skip(pb, size); + goto start_sync; } - avio_skip(pb, size); - goto start_sync; } if (d[2] == 'p' && d[3] == 'c' && size<=4*256+4) { @@ -1050,7 +1055,7 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt) return AVERROR_EOF; best_ast = best_st->priv_data; - best_ts = av_rescale_q(best_ts, (AVRational){FFMAX(1, best_ast->sample_size), AV_TIME_BASE}, best_st->time_base); + best_ts = best_ast->frame_offset; if(best_ast->remaining) i= av_index_search_timestamp(best_st, best_ts, AVSEEK_FLAG_ANY | AVSEEK_FLAG_BACKWARD); else{ @@ -1225,8 +1230,16 @@ static int avi_read_idx1(AVFormatContext *s, int size) avi->stream_index = -1; avio_seek(pb, idx1_pos, SEEK_SET); + if (s->nb_streams == 1 && s->streams[0]->codec->codec_tag == AV_RL32("MMES")){ + first_packet_pos = 0; + data_offset = avi->movi_list; + } + /* Read the entries and sort them in each stream component. */ for(i = 0; i < nb_index_entries; i++) { + if(url_feof(pb)) + return -1; + tag = avio_rl32(pb); flags = avio_rl32(pb); pos = avio_rl32(pb); @@ -1241,7 +1254,7 @@ static int avi_read_idx1(AVFormatContext *s, int size) st = s->streams[index]; ast = st->priv_data; - if(first_packet && first_packet_pos && len) { + if (first_packet && first_packet_pos) { data_offset = first_packet_pos - pos; first_packet = 0; } @@ -1249,8 +1262,6 @@ static int avi_read_idx1(AVFormatContext *s, int size) av_dlog(s, "%d cum_len=%"PRId64"\n", len, ast->cum_len); - if(url_feof(pb)) - return -1; if(last_pos == pos) avi->non_interleaved= 1; diff --git a/libavformat/avienc.c b/libavformat/avienc.c index 091d4cbb1e..d27c2f58ed 100644 --- a/libavformat/avienc.c +++ b/libavformat/avienc.c @@ -525,7 +525,7 @@ static int avi_write_packet(AVFormatContext *s, AVPacket *pkt) AVPacket empty_packet; if(pkt->dts - avist->packet_count > 60000){ - av_log(s, AV_LOG_ERROR, "Too large number of skiped frames %Ld\n", pkt->dts - avist->packet_count); + av_log(s, AV_LOG_ERROR, "Too large number of skiped frames %"PRId64"\n", pkt->dts - avist->packet_count); return AVERROR(EINVAL); } diff --git a/libavformat/avio.c b/libavformat/avio.c index efe1c26683..16700d838c 100644 --- a/libavformat/avio.c +++ b/libavformat/avio.c @@ -145,10 +145,11 @@ static int url_alloc_for_protocol (URLContext **puc, struct URLProtocol *up, if (up->priv_data_size) { uc->priv_data = av_mallocz(up->priv_data_size); if (up->priv_data_class) { + int proto_len= strlen(up->name); char *start = strchr(uc->filename, ','); *(const AVClass**)uc->priv_data = up->priv_data_class; av_opt_set_defaults(uc->priv_data); - if(start){ + if(!strncmp(up->name, uc->filename, proto_len) && uc->filename + proto_len == start){ int ret= 0; char *p= start; char sep= *++p; @@ -295,7 +296,9 @@ int ffurl_alloc(URLContext **puc, const char *filename, int flags, "Missing call to av_register_all()?\n"); } - if (filename[proto_len] != ':' && filename[proto_len] != ',' || is_dos_path(filename)) + if (filename[proto_len] != ':' && + (filename[proto_len] != ',' || !strchr(filename + proto_len + 1, ':')) || + is_dos_path(filename)) strcpy(proto_str, "file"); else av_strlcpy(proto_str, filename, FFMIN(proto_len+1, sizeof(proto_str))); diff --git a/libavformat/avio.h b/libavformat/avio.h index 7cf14f9f8c..16216819f4 100644 --- a/libavformat/avio.h +++ b/libavformat/avio.h @@ -120,6 +120,12 @@ typedef struct { * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable. */ int seekable; + + /** + * max filesize, used to limit allocations + * This field is internal to libavformat and access from outside is not allowed. + */ + int64_t maxsize; } AVIOContext; /* unbuffered I/O */ @@ -672,13 +678,13 @@ int avio_pause(AVIOContext *h, int pause); * If stream_index is (-1) the timestamp should be in AV_TIME_BASE * units from the beginning of the presentation. * If a stream_index >= 0 is used and the protocol does not support - * seeking based on component streams, the call will fail with ENOTSUP. + * seeking based on component streams, the call will fail. * @param timestamp timestamp in AVStream.time_base units * or if there is no stream specified then in AV_TIME_BASE units. * @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE * and AVSEEK_FLAG_ANY. The protocol may silently ignore * AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will - * fail with ENOTSUP if used and not supported. + * fail if used and not supported. * @return >= 0 on success * @see AVInputFormat::read_seek */ diff --git a/libavformat/avio_internal.h b/libavformat/avio_internal.h index f140897c5d..df614b22d9 100644 --- a/libavformat/avio_internal.h +++ b/libavformat/avio_internal.h @@ -71,6 +71,8 @@ uint64_t ffio_read_varlen(AVIOContext *bc); /** @warning must be called before any I/O */ int ffio_set_buf_size(AVIOContext *s, int buf_size); +int ffio_limit(AVIOContext *s, int size); + void ffio_init_checksum(AVIOContext *s, unsigned long (*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len), unsigned long checksum); diff --git a/libavformat/bit.c b/libavformat/bit.c index 3449ce1b21..1249ea1aee 100644 --- a/libavformat/bit.c +++ b/libavformat/bit.c @@ -113,7 +113,7 @@ AVInputFormat ff_bit_demuxer = { .extensions = "bit", }; -#ifdef CONFIG_MUXERS +#if CONFIG_MUXERS static int write_header(AVFormatContext *s) { AVCodecContext *enc = s->streams[0]->codec; diff --git a/libavformat/cache.c b/libavformat/cache.c index d94cf5fbac..011ea829c3 100644 --- a/libavformat/cache.c +++ b/libavformat/cache.c @@ -64,7 +64,7 @@ static int cache_open(URLContext *h, const char *arg, int flags) } unlink(buffername); - av_free(buffername); + av_freep(&buffername); return ffurl_open(&c->inner, arg, flags, &h->interrupt_callback, NULL); } diff --git a/libavformat/dsicin.c b/libavformat/dsicin.c index 20b1d02f36..e0db8ba10e 100644 --- a/libavformat/dsicin.c +++ b/libavformat/dsicin.c @@ -27,6 +27,7 @@ #include "libavutil/intreadwrite.h" #include "avformat.h" #include "internal.h" +#include "avio_internal.h" typedef struct CinFileHeader { @@ -179,6 +180,8 @@ static int cin_read_packet(AVFormatContext *s, AVPacket *pkt) /* palette and video packet */ pkt_size = (palette_type + 3) * hdr->pal_colors_count + hdr->video_frame_size; + pkt_size = ffio_limit(pb, pkt_size); + ret = av_new_packet(pkt, 4 + pkt_size); if (ret < 0) return ret; diff --git a/libavformat/electronicarts.c b/libavformat/electronicarts.c index 75f92afc0f..53041eee51 100644 --- a/libavformat/electronicarts.c +++ b/libavformat/electronicarts.c @@ -221,6 +221,10 @@ static int process_audio_header_eacs(AVFormatContext *s) ea->sample_rate = ea->big_endian ? avio_rb32(pb) : avio_rl32(pb); ea->bytes = avio_r8(pb); /* 1=8-bit, 2=16-bit */ + if(ea->bytes == 0){ + av_log(s,AV_LOG_ERROR,"the file is corrupted, ea->bytes = 0\n"); + return AVERROR_INVALIDDATA; + } ea->num_channels = avio_r8(pb); compression_type = avio_r8(pb); avio_skip(pb, 13); @@ -404,7 +408,7 @@ static int ea_read_header(AVFormatContext *s, EaDemuxContext *ea = s->priv_data; AVStream *st; - if (!process_ea_header(s)) + if (process_ea_header(s)<=0) return AVERROR(EIO); if (ea->video_codec) { @@ -436,6 +440,11 @@ static int ea_read_header(AVFormatContext *s, ea->audio_codec = 0; return 1; } + if (ea->bytes <= 0) { + av_log(s, AV_LOG_ERROR, "Invalid number of bytes per sample: %d\n", ea->bytes); + ea->audio_codec = CODEC_ID_NONE; + return 1; + } /* initialize the audio decoder stream */ st = avformat_new_stream(s, NULL); diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index 0699f544b5..d823628817 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -197,7 +197,16 @@ static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream } } - if (timeslen == fileposlen && fileposlen && max_pos <= filepositions[0]) { + if (timeslen == fileposlen && fileposlen>1 && max_pos <= filepositions[0]) { + int64_t dts, size0, size1; + avio_seek(ioc, filepositions[1]-4, SEEK_SET); + size0 = avio_rb32(ioc); + avio_r8(ioc); + size1 = avio_rb24(ioc); + dts = avio_rb24(ioc); + dts |= avio_r8(ioc) << 24; + if (size0 > filepositions[1] || FFABS(dts - times[1]*1000)>5000) + goto finish; for(i = 0; i < timeslen; i++) av_add_index_entry(vstream, filepositions[i], times[i]*1000, 0, 0, AVINDEX_KEYFRAME); } else @@ -551,8 +560,8 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) return ret; if (st->codec->codec_id == CODEC_ID_AAC) { MPEG4AudioConfig cfg; - avpriv_mpeg4audio_get_config(&cfg, st->codec->extradata, - st->codec->extradata_size * 8, 1); + if (avpriv_mpeg4audio_get_config(&cfg, st->codec->extradata, + st->codec->extradata_size * 8, 1) >= 0) { st->codec->channels = cfg.channels; if (cfg.ext_sample_rate) st->codec->sample_rate = cfg.ext_sample_rate; @@ -560,6 +569,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) st->codec->sample_rate = cfg.sample_rate; av_dlog(s, "mp4a config channels %d sample rate %d\n", st->codec->channels, st->codec->sample_rate); + } } ret = AVERROR(EAGAIN); diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c index 2a223eeeb3..e874e14778 100644 --- a/libavformat/flvenc.c +++ b/libavformat/flvenc.c @@ -93,6 +93,7 @@ static int get_audio_flags(AVCodecContext *enc){ case 11025: flags |= FLV_SAMPLERATE_11025HZ; break; + case 16000: //nellymoser only case 8000: //nellymoser only case 5512: //not mp3 if(enc->codec_id != CODEC_ID_MP3){ @@ -128,6 +129,8 @@ static int get_audio_flags(AVCodecContext *enc){ case CODEC_ID_NELLYMOSER: if (enc->sample_rate == 8000) { flags |= FLV_CODECID_NELLYMOSER_8KHZ_MONO | FLV_SAMPLESSIZE_16BIT; + } else if (enc->sample_rate == 16000) { + flags |= FLV_CODECID_NELLYMOSER_16KHZ_MONO | FLV_SAMPLESSIZE_16BIT; } else { flags |= FLV_CODECID_NELLYMOSER | FLV_SAMPLESSIZE_16BIT; } @@ -443,8 +446,13 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) } } else if (enc->codec_id == CODEC_ID_AAC && pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) { - av_log(s, AV_LOG_ERROR, "malformated aac bitstream, use -absf aac_adtstoasc\n"); - return -1; + if (!s->streams[pkt->stream_index]->nb_frames) { + av_log(s, AV_LOG_ERROR, "Malformed AAC bitstream detected: " + "use audio bitstream filter 'aac_adtstoasc' to fix it " + "('-bsf:a aac_adtstoasc' option with ffmpeg)\n"); + return AVERROR_INVALIDDATA; + } + av_log(s, AV_LOG_WARNING, "aac bitstream error\n"); } if (flv->delay == AV_NOPTS_VALUE) flv->delay = -pkt->dts; diff --git a/libavformat/idcin.c b/libavformat/idcin.c index 0cca69f088..4289fd763b 100644 --- a/libavformat/idcin.c +++ b/libavformat/idcin.c @@ -91,7 +91,7 @@ typedef struct IdcinDemuxContext { static int idcin_probe(AVProbeData *p) { - unsigned int number; + unsigned int number, sample_rate; /* * This is what you could call a "probabilistic" file check: id CIN @@ -120,18 +120,18 @@ static int idcin_probe(AVProbeData *p) return 0; /* check the audio sample rate */ - number = AV_RL32(&p->buf[8]); - if ((number != 0) && ((number < 8000) | (number > 48000))) + sample_rate = AV_RL32(&p->buf[8]); + if (sample_rate && (sample_rate < 8000 || sample_rate > 48000)) return 0; /* check the audio bytes/sample */ number = AV_RL32(&p->buf[12]); - if (number > 2) + if (number > 2 || sample_rate && !number) return 0; /* check the audio channels */ number = AV_RL32(&p->buf[16]); - if (number > 2) + if (number > 2 || sample_rate && !number) return 0; /* return half certainly since this check is a bit sketchy */ diff --git a/libavformat/idroqdec.c b/libavformat/idroqdec.c index eb11c69adb..9ac32eb668 100644 --- a/libavformat/idroqdec.c +++ b/libavformat/idroqdec.c @@ -30,6 +30,7 @@ #include "libavutil/intreadwrite.h" #include "avformat.h" #include "internal.h" +#include "avio_internal.h" #define RoQ_MAGIC_NUMBER 0x1084 #define RoQ_CHUNK_PREAMBLE_SIZE 8 @@ -125,6 +126,8 @@ static int roq_read_packet(AVFormatContext *s, if(chunk_size > INT_MAX) return AVERROR_INVALIDDATA; + chunk_size = ffio_limit(pb, chunk_size); + switch (chunk_type) { case RoQ_INFO: diff --git a/libavformat/ipmovie.c b/libavformat/ipmovie.c index 9b42ee2948..24dc24bec8 100644 --- a/libavformat/ipmovie.c +++ b/libavformat/ipmovie.c @@ -115,7 +115,7 @@ static int load_ipmovie_packet(IPMVEContext *s, AVIOContext *pb, int chunk_type; - if (s->audio_chunk_offset) { + if (s->audio_chunk_offset && s->audio_channels && s->audio_bits) { /* adjust for PCM audio by skipping chunk header */ if (s->audio_type != CODEC_ID_INTERPLAY_DPCM) { diff --git a/libavformat/isom.c b/libavformat/isom.c index 7a625780f3..7cadcef79e 100644 --- a/libavformat/isom.c +++ b/libavformat/isom.c @@ -90,6 +90,8 @@ const AVCodecTag codec_movvideo_tags[] = { { CODEC_ID_R10K, MKTAG('R', '1', '0', 'g') }, /* UNCOMPRESSED 10BIT RGB */ { CODEC_ID_R210, MKTAG('r', '2', '1', '0') }, /* UNCOMPRESSED 10BIT RGB */ { CODEC_ID_V210, MKTAG('v', '2', '1', '0') }, /* UNCOMPRESSED 10BIT 4:2:2 */ + { CODEC_ID_V410, MKTAG('v', '4', '1', '0') }, /* UNCOMPRESSED 10BIT 4:4:4 */ + { CODEC_ID_Y41P, MKTAG('Y', '4', '1', 'P') }, /* UNCOMPRESSED 12BIT 4:1:1 */ { CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') }, /* PhotoJPEG */ { CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'a') }, /* Motion-JPEG (format A) */ diff --git a/libavformat/iss.c b/libavformat/iss.c index 2bae3c1d7b..bbc8465b35 100644 --- a/libavformat/iss.c +++ b/libavformat/iss.c @@ -87,6 +87,11 @@ static av_cold int iss_read_header(AVFormatContext *s, AVFormatParameters *ap) get_token(pb, token, sizeof(token)); //Version ID get_token(pb, token, sizeof(token)); //Size + if (iss->packet_size <= 0) { + av_log(s, AV_LOG_ERROR, "packet_size %d is invalid\n", iss->packet_size); + return AVERROR_INVALIDDATA; + } + iss->sample_start_pos = avio_tell(pb); st = avformat_new_stream(s, NULL); diff --git a/libavformat/libmodplug.c b/libavformat/libmodplug.c index dfbf67c2d2..f3f0e5ee10 100644 --- a/libavformat/libmodplug.c +++ b/libavformat/libmodplug.c @@ -347,6 +347,19 @@ static int modplug_read_seek(AVFormatContext *s, int stream_idx, int64_t ts, int return 0; } +static const char modplug_extensions[] = "669,abc,amf,ams,dbm,dmf,dsm,far,it,mdl,med,mid,mod,mt2,mtm,okt,psm,ptm,s3m,stm,ult,umx,xm,itgz,itr,itz,mdgz,mdr,mdz,s3gz,s3r,s3z,xmgz,xmr,xmz"; + +static int modplug_probe(AVProbeData *p) +{ + if (av_match_ext(p->filename, modplug_extensions)) { + if (p->buf_size < 16384) + return AVPROBE_SCORE_MAX/4-1; + else + return AVPROBE_SCORE_MAX/2; + } + return 0; +} + static const AVClass modplug_class = { .class_name = "ModPlug demuxer", .item_name = av_default_item_name, @@ -358,11 +371,11 @@ AVInputFormat ff_libmodplug_demuxer = { .name = "libmodplug", .long_name = NULL_IF_CONFIG_SMALL("ModPlug demuxer"), .priv_data_size = sizeof(ModPlugContext), + .read_probe = modplug_probe, .read_header = modplug_read_header, .read_packet = modplug_read_packet, .read_close = modplug_read_close, .read_seek = modplug_read_seek, - .extensions = "669,abc,amf,ams,dbm,dmf,dsm,far,it,mdl,med,mid,mod,mt2,mtm,okt,psm,ptm,s3m,stm,ult,umx,xm" - ",itgz,itr,itz,mdgz,mdr,mdz,s3gz,s3r,s3z,xmgz,xmr,xmz", // compressed mods + .extensions = modplug_extensions, .priv_class = &modplug_class, }; diff --git a/libavformat/loasdec.c b/libavformat/loasdec.c index e48c21905a..fbe1cb4aa9 100644 --- a/libavformat/loasdec.c +++ b/libavformat/loasdec.c @@ -55,7 +55,6 @@ static int loas_probe(AVProbeData *p) if (first_frames>=3) return AVPROBE_SCORE_MAX/2+1; else if(max_frames>100)return AVPROBE_SCORE_MAX/2; else if(max_frames>=3) return AVPROBE_SCORE_MAX/4; - else if(max_frames>=1) return 1; else return 0; } diff --git a/libavformat/matroska.c b/libavformat/matroska.c index 52481d7556..a5a4363cc0 100644 --- a/libavformat/matroska.c +++ b/libavformat/matroska.c @@ -21,6 +21,9 @@ #include "matroska.h" +/* If you add a tag here that is not in ff_codec_bmp_tags[] + or ff_codec_wav_tags[], add it also to additional_audio_tags[] + or additional_video_tags[] in matroskaenc.c */ const CodecTags ff_mkv_codec_tags[]={ {"A_AAC" , CODEC_ID_AAC}, {"A_AC3" , CODEC_ID_AC3}, diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 4a0c2fa76c..60fbf6ec95 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -1223,7 +1223,6 @@ static int matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska, int idx static void matroska_execute_seekhead(MatroskaDemuxContext *matroska) { EbmlList *seekhead_list = &matroska->seekhead; - MatroskaSeekhead *seekhead = seekhead_list->elem; int64_t before_pos = avio_tell(matroska->ctx->pb); int i; @@ -1233,6 +1232,7 @@ static void matroska_execute_seekhead(MatroskaDemuxContext *matroska) return; for (i = 0; i < seekhead_list->nb_elem; i++) { + MatroskaSeekhead *seekhead = seekhead_list->elem; if (seekhead[i].pos <= before_pos) continue; @@ -2055,10 +2055,11 @@ static int matroska_read_seek(AVFormatContext *s, int stream_index, if (tracks[i].type == MATROSKA_TRACK_TYPE_SUBTITLE && !tracks[i].stream->discard != AVDISCARD_ALL) { index_sub = av_index_search_timestamp(tracks[i].stream, st->index_entries[index].timestamp, AVSEEK_FLAG_BACKWARD); - if (index_sub >= 0 - && st->index_entries[index_sub].pos < st->index_entries[index_min].pos - && st->index_entries[index].timestamp - st->index_entries[index_sub].timestamp < 30000000000/matroska->time_scale) - index_min = index_sub; + while(index_sub >= 0 + && index_min >= 0 + && tracks[i].stream->index_entries[index_sub].pos < st->index_entries[index_min].pos + && st->index_entries[index].timestamp - tracks[i].stream->index_entries[index_sub].timestamp < 30000000000/matroska->time_scale) + index_min--; } } diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index b8c4667a4e..e556b3c3e9 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1295,6 +1295,32 @@ static int mkv_query_codec(enum CodecID codec_id, int std_compliance) return 0; } +const AVCodecTag additional_audio_tags[] = { + { CODEC_ID_ALAC, 0XFFFFFFFF }, + { CODEC_ID_EAC3, 0XFFFFFFFF }, + { CODEC_ID_MLP, 0xFFFFFFFF }, + { CODEC_ID_PCM_S16BE, 0xFFFFFFFF }, + { CODEC_ID_PCM_S24BE, 0xFFFFFFFF }, + { CODEC_ID_PCM_S32BE, 0xFFFFFFFF }, + { CODEC_ID_QDM2, 0xFFFFFFFF }, + { CODEC_ID_RA_144, 0xFFFFFFFF }, + { CODEC_ID_RA_288, 0xFFFFFFFF }, + { CODEC_ID_COOK, 0xFFFFFFFF }, + { CODEC_ID_TRUEHD, 0xFFFFFFFF }, + { CODEC_ID_TTA, 0xFFFFFFFF }, + { CODEC_ID_WAVPACK, 0xFFFFFFFF }, + { CODEC_ID_NONE, 0xFFFFFFFF } +}; + +const AVCodecTag additional_video_tags[] = { + { CODEC_ID_PRORES, 0xFFFFFFFF }, + { CODEC_ID_RV10, 0xFFFFFFFF }, + { CODEC_ID_RV20, 0xFFFFFFFF }, + { CODEC_ID_RV30, 0xFFFFFFFF }, + { CODEC_ID_RV40, 0xFFFFFFFF }, + { CODEC_ID_NONE, 0xFFFFFFFF } +}; + #if CONFIG_MATROSKA_MUXER AVOutputFormat ff_matroska_muxer = { .name = "matroska", @@ -1316,6 +1342,10 @@ AVOutputFormat ff_matroska_muxer = { .write_packet = mkv_write_packet, .write_trailer = mkv_write_trailer, .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS, + .codec_tag = (const AVCodecTag* const []){ + ff_codec_bmp_tags, ff_codec_wav_tags, + additional_audio_tags, additional_video_tags, 0 + }, .subtitle_codec = CODEC_ID_SSA, .query_codec = mkv_query_codec, }; @@ -1354,5 +1384,8 @@ AVOutputFormat ff_matroska_audio_muxer = { .write_packet = mkv_write_packet, .write_trailer = mkv_write_trailer, .flags = AVFMT_GLOBALHEADER, + .codec_tag = (const AVCodecTag* const []){ + ff_codec_wav_tags, additional_audio_tags, 0 + }, }; #endif diff --git a/libavformat/mov.c b/libavformat/mov.c index 12af19ed50..97c16f6af8 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -431,6 +431,8 @@ static int mov_read_dref(MOVContext *c, AVIOContext *pb, MOVAtom atom) avio_skip(pb, 16); for (type = 0; type != -1 && avio_tell(pb) < next; ) { + if(url_feof(pb)) + return AVERROR(EOF); type = avio_rb16(pb); len = avio_rb16(pb); av_log(c->fc, AV_LOG_DEBUG, "type %d, len %d\n", type, len); @@ -1082,6 +1084,9 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) avio_rb32(pb); /* reserved */ avio_rb16(pb); /* reserved */ dref_id = avio_rb16(pb); + }else if (size <= 0){ + av_log(c->fc, AV_LOG_ERROR, "invalid size %d in stsd\n", size); + return -1; } if (st->codec->codec_tag && diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 181965f720..43bda7f811 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -2249,6 +2249,14 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) return -1; } + if (enc->codec_id == CODEC_ID_AAC && pkt->size > 2 && + (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) { + if (!s->streams[pkt->stream_index]->nb_frames) { + av_log(s, AV_LOG_ERROR, "malformated aac bitstream, use -absf aac_adtstoasc\n"); + return -1; + } + av_log(s, AV_LOG_WARNING, "aac bitstream error\n"); + } if (enc->codec_id == CODEC_ID_H264 && trk->vosLen > 0 && *(uint8_t *)trk->vosData != 1) { /* from x264 or from bytestream h264 */ /* nal reformating needed */ @@ -2262,10 +2270,6 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) trk->cluster[trk->entry].data= buf; }else size = ff_avc_parse_nal_units(pb, pkt->data, pkt->size); - } else if (enc->codec_id == CODEC_ID_AAC && pkt->size > 2 && - (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) { - av_log(s, AV_LOG_ERROR, "malformated aac bitstream, use -absf aac_adtstoasc\n"); - return -1; } else if (mov->frag_seq_num>0){ trk->cluster[trk->entry].data = av_malloc(size); if (!trk->cluster[trk->entry].data) @@ -2562,7 +2566,7 @@ static int update_first_fragment(AVFormatContext *s) if(mov->reserved_moov_size){ int64_t size= mov->reserved_moov_size - (avio_tell(pb) - mov->reserved_moov_pos); if(size < 8){ - av_log(s, AV_LOG_ERROR, "reserved_moov_size is too small, needed %Ld additional\n", 8-size); + av_log(s, AV_LOG_ERROR, "reserved_moov_size is too small, needed %"PRId64" additional\n", 8-size); return -1; } avio_wb32(pb, size); diff --git a/libavformat/mp3enc.c b/libavformat/mp3enc.c index 1200d0f297..8d82452689 100644 --- a/libavformat/mp3enc.c +++ b/libavformat/mp3enc.c @@ -160,7 +160,7 @@ static int mp3_write_xing(AVFormatContext *s) int best_bitrate_idx; int best_bitrate_error= INT_MAX; int64_t xing_offset; - int32_t mask, header; + int32_t header, mask; MPADecodeHeader c; int srate_idx, i, channels; int needed; @@ -200,8 +200,9 @@ static int mp3_write_xing(AVFormatContext *s) for (bitrate_idx= best_bitrate_idx;; bitrate_idx++) { if (15 == bitrate_idx) return -1; - - avpriv_mpegaudio_decode_header(&c, header | (bitrate_idx << (4+8))); + mask = bitrate_idx << (4+8); + header |= mask; + avpriv_mpegaudio_decode_header(&c, header); xing_offset=xing_offtbl[c.lsf == 1][c.nb_channels == 1]; needed = 4 // header + xing_offset @@ -213,6 +214,7 @@ static int mp3_write_xing(AVFormatContext *s) if (needed <= c.frame_size) break; + header &= ~mask; } avio_wb32(s->pb, header); diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c index 01ee004f45..455be5706d 100644 --- a/libavformat/mpegenc.c +++ b/libavformat/mpegenc.c @@ -429,7 +429,7 @@ static int mpeg_mux_init(AVFormatContext *ctx) if (!s->mux_rate) { /* we increase slightly the bitrate to take into account the headers. XXX: compute it exactly */ - bitrate += bitrate*5/100; + bitrate += bitrate*5LL/100; bitrate += 10000; s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50); } diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 8d026fd372..7935048136 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -762,7 +762,8 @@ static int read_sl_header(PESContext *pes, SLConfigDescr *sl, const uint8_t *buf if (cts != AV_NOPTS_VALUE) pes->pts = cts; - avpriv_set_pts_info(pes->st, sl->timestamp_len, 1, sl->timestamp_res); + if (sl->timestamp_len && sl->timestamp_res) + avpriv_set_pts_info(pes->st, sl->timestamp_len, 1, sl->timestamp_res); return (get_bits_count(&gb) + 7) >> 3; } @@ -1496,7 +1497,7 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len if (idx >= 0) { st = ts->stream->streams[idx]; } else { - st = avformat_new_stream(pes->stream, NULL); + st = avformat_new_stream(ts->stream, NULL); st->id = pid; st->codec->codec_type = AVMEDIA_TYPE_DATA; } @@ -1570,12 +1571,18 @@ static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len if (sid == 0x0000) { /* NIT info */ } else { + MpegTSFilter *fil = ts->pids[pmt_pid]; program = av_new_program(ts->stream, sid); program->program_num = sid; program->pmt_pid = pmt_pid; - if (ts->pids[pmt_pid]) - mpegts_close_filter(ts, ts->pids[pmt_pid]); - mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1); + if (fil) + if ( fil->type != MPEGTS_SECTION + || fil->pid != pmt_pid + || fil->u.section_filter.section_cb != pmt_cb) + mpegts_close_filter(ts, ts->pids[pmt_pid]); + + if (!ts->pids[pmt_pid]) + mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1); add_pat_entry(ts, sid); add_pid_to_pmt(ts, sid, 0); //add pat pid to program add_pid_to_pmt(ts, sid, pmt_pid); diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index b75eff73c0..d6100ce5d5 100644 --- a/libavformat/mpegtsenc.c +++ b/libavformat/mpegtsenc.c @@ -232,7 +232,7 @@ static void mpegts_write_pat(AVFormatContext *s) data, q - data); } -static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) +static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) { // MpegTSWrite *ts = s->priv_data; uint8_t data[1012], *q, *desc_length_ptr, *program_info_length_ptr; @@ -285,6 +285,10 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) stream_type = STREAM_TYPE_PRIVATE_DATA; break; } + + if (q - data > sizeof(data) - 32) + return AVERROR(EINVAL); + *q++ = stream_type; put16(&q, 0xe000 | ts_st->pid); desc_length_ptr = q; @@ -308,7 +312,7 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) len_ptr = q++; *len_ptr = 0; - for (p = lang->value; next && *len_ptr < 255 / 4 * 4; p = next + 1) { + for (p = lang->value; next && *len_ptr < 255 / 4 * 4 && q - data < sizeof(data) - 4; p = next + 1) { next = strchr(p, ','); if (strlen(p) != 3 && (!next || next != p + 3)) continue; /* not a 3-letter code */ @@ -370,6 +374,7 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) } mpegts_write_section1(&service->pmt, PMT_TID, service->sid, 0, 0, 0, data, q - data); + return 0; } /* NOTE: str == NULL is accepted for an empty string */ diff --git a/libavformat/mtv.c b/libavformat/mtv.c index 00da9a1e49..4252309a6e 100644 --- a/libavformat/mtv.c +++ b/libavformat/mtv.c @@ -96,16 +96,26 @@ static int mtv_read_header(AVFormatContext *s, AVFormatParameters *ap) /* Calculate width and height if missing from header */ - if(!mtv->img_width) + if(mtv->img_bpp>>3){ + if(!mtv->img_width && mtv->img_height) mtv->img_width=mtv->img_segment_size / (mtv->img_bpp>>3) / mtv->img_height; - if(!mtv->img_height) + if(!mtv->img_height && mtv->img_width) mtv->img_height=mtv->img_segment_size / (mtv->img_bpp>>3) / mtv->img_width; + } + if(!mtv->img_height || !mtv->img_width){ + av_log(s, AV_LOG_ERROR, "width or height is invalid and I cannot calculate them from other information\n"); + return AVERROR(EINVAL); + } avio_skip(pb, 4); audio_subsegments = avio_rl16(pb); + if(!audio_subsegments){ + av_log(s, AV_LOG_ERROR, "audio_subsegments is 0\n"); + return AVERROR(EINVAL); + } mtv->full_segment_size = audio_subsegments * (MTV_AUDIO_PADDING_SIZE + MTV_ASUBCHUNK_DATA_SIZE) + mtv->img_segment_size; @@ -186,7 +196,7 @@ static int mtv_read_packet(AVFormatContext *s, AVPacket *pkt) * just swap bytes as they come */ - for(i=0;iimg_segment_size/2;i++) + for(i=0;idata+i) = av_bswap16(*((uint16_t *)pkt->data+i)); #endif pkt->stream_index = 0; diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index d61c1154de..8fdc5caeb3 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -433,7 +433,7 @@ static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt) /* TODO: better logic for this? * only files that lack all index segments prior to the essence need this */ - if (!s->pb->seekable && mxf->op != OPAtom || mxf->d10 || mxf->broken_index) + if (mxf->op != OPAtom) return mxf_read_packet_old(s, pkt); if (mxf->current_stream >= s->nb_streams) { @@ -577,6 +577,13 @@ static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size partition->previous_partition, footer_partition, partition->index_sid, partition->body_sid); + /* sanity check PreviousPartition if set */ + if (partition->previous_partition && + mxf->run_in + partition->previous_partition >= klv_offset) { + av_log(mxf->fc, AV_LOG_ERROR, "PreviousPartition points to this partition or forward\n"); + return AVERROR_INVALIDDATA; + } + if (op[12] == 1 && op[13] == 1) mxf->op = OP1a; else if (op[12] == 1 && op[13] == 2) mxf->op = OP1b; else if (op[12] == 1 && op[13] == 3) mxf->op = OP1c; @@ -1080,6 +1087,7 @@ static int mxf_absolute_bodysid_offset(MXFContext *mxf, int body_sid, int64_t of static int mxf_parse_index(MXFContext *mxf, int track_id, AVStream *st) { + int64_t accumulated_offset = 0; int j, k, ret, nb_sorted_segments; MXFIndexTableSegment **sorted_segments = NULL; int n_delta = track_id - 1; /* TrackID = 1-based stream index */ @@ -1104,6 +1112,10 @@ static int mxf_parse_index(MXFContext *mxf, int track_id, AVStream *st) int64_t segment_size; MXFIndexTableSegment *tableseg = sorted_segments[j]; + /* reset accumulated_offset on BodySID change */ + if (j > 0 && tableseg->body_sid != sorted_segments[j-1]->body_sid) + accumulated_offset = 0; + if (n_delta >= tableseg->nb_delta_entries && st->index != 0) continue; duration = tableseg->index_duration > 0 ? tableseg->index_duration : @@ -1155,7 +1167,7 @@ static int mxf_parse_index(MXFContext *mxf, int track_id, AVStream *st) size = 0; flags = !(tableseg->flag_entries[k] & 0x30) ? AVINDEX_KEYFRAME : 0; } else { - pos = (int64_t)(tableseg->index_start_position + k) * tableseg->edit_unit_byte_count; + pos = (int64_t)k * tableseg->edit_unit_byte_count + accumulated_offset; if (n_delta < tableseg->nb_delta_entries - 1) size = tableseg->element_delta[n_delta+1] - tableseg->element_delta[n_delta]; else { @@ -1183,6 +1195,7 @@ static int mxf_parse_index(MXFContext *mxf, int track_id, AVStream *st) if ((ret = av_add_index_entry(st, pos, sample_duration * st->nb_index_entries, size, 0, flags)) < 0) return ret; } + accumulated_offset += segment_size; } av_free(sorted_segments); @@ -1269,7 +1282,7 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) break; } } - if (!source_track) + if (!source_track || !component) continue; if (!(source_track->sequence = mxf_resolve_strong_ref(mxf, &source_track->sequence_ref, Sequence))) { @@ -1431,7 +1444,7 @@ static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, MXFMetadataReadF if (!ctx) return -1; - while (avio_tell(pb) + 4 < klv_end) { + while (avio_tell(pb) + 4 < klv_end && !url_feof(pb)) { int tag = avio_rb16(pb); int size = avio_rb16(pb); /* KLV specified by 0x53 */ uint64_t next = avio_tell(pb) + size; @@ -1494,11 +1507,6 @@ static int mxf_parse_handle_essence(MXFContext *mxf) AVIOContext *pb = mxf->fc->pb; int64_t ret; - if (!mxf->current_partition) { - av_log(mxf->fc, AV_LOG_ERROR, "found essence prior to PartitionPack\n"); - return AVERROR_INVALIDDATA; - } - if (mxf->parsing_backward) { return mxf_seek_to_previous_partition(mxf); } else { @@ -1612,6 +1620,12 @@ static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap) if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key) || IS_KLV_KEY(klv.key, mxf_essence_element_key) || IS_KLV_KEY(klv.key, mxf_system_item_key)) { + + if (!mxf->current_partition) { + av_log(mxf->fc, AV_LOG_ERROR, "found essence prior to first PartitionPack\n"); + return AVERROR_INVALIDDATA; + } + if (!mxf->current_partition->essence_offset) { /* for OP1a we compute essence_offset * for OPAtom we point essence_offset after the KL (usually op1a_essence_offset + 20 or 25) @@ -1648,6 +1662,9 @@ static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap) /* next partition pack - keep going, seek to previous partition or stop */ if(mxf_parse_handle_partition_or_eof(mxf) <= 0) break; + else if (mxf->parsing_backward) + continue; + /* we're still parsing forward. proceed to parsing this partition pack */ } for (metadata = mxf_metadata_read_table; metadata->read; metadata++) { @@ -1707,6 +1724,7 @@ static int mxf_read_close(AVFormatContext *s) break; case IndexTableSegment: seg = (MXFIndexTableSegment *)mxf->metadata_sets[i]; + if (seg->slice_count) for (j = 0; j < seg->nb_index_entries; j++) av_freep(&seg->slice_offset_entries[j]); av_freep(&seg->slice); @@ -1754,7 +1772,7 @@ static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti int64_t seekpos; int index; - if (mxf->d10) { + if (mxf->op != OPAtom) { if (!s->bit_rate) return -1; if (sample_time < 0) diff --git a/libavformat/nsvdec.c b/libavformat/nsvdec.c index 9da036eb2b..76bcd4a5ea 100644 --- a/libavformat/nsvdec.c +++ b/libavformat/nsvdec.c @@ -206,6 +206,7 @@ static const AVCodecTag nsv_codec_audio_tags[] = { { CODEC_ID_MP3, MKTAG('M', 'P', '3', ' ') }, { CODEC_ID_AAC, MKTAG('A', 'A', 'C', ' ') }, { CODEC_ID_AAC, MKTAG('A', 'A', 'C', 'P') }, + { CODEC_ID_AAC, MKTAG('V', 'L', 'B', ' ') }, { CODEC_ID_SPEEX, MKTAG('S', 'P', 'X', ' ') }, { CODEC_ID_PCM_U16LE, MKTAG('P', 'C', 'M', ' ') }, { CODEC_ID_NONE, 0 }, @@ -313,6 +314,8 @@ static int nsv_parse_NSVf_header(AVFormatContext *s, AVFormatParameters *ap) char quote; p = strings = av_mallocz(strings_size + 1); + if (!p) + return AVERROR(ENOMEM); endp = strings + strings_size; avio_read(pb, strings, strings_size); while (p < endp) { diff --git a/libavformat/nut.c b/libavformat/nut.c index 2a5e6fe567..0a44811c57 100644 --- a/libavformat/nut.c +++ b/libavformat/nut.c @@ -70,6 +70,12 @@ const AVCodecTag ff_nut_video_tags[] = { { CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 48 ) }, { CODEC_ID_RAWVIDEO, MKTAG(48 , 'B', 'G', 'R') }, { CODEC_ID_RAWVIDEO, MKTAG(48 , 'R', 'G', 'B') }, + { CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 11 , 10 ) }, + { CODEC_ID_RAWVIDEO, MKTAG(10 , 11 , '3', 'Y') }, + { CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 10 , 10 ) }, + { CODEC_ID_RAWVIDEO, MKTAG(10 , 10 , '3', 'Y') }, + { CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 0 , 10 ) }, + { CODEC_ID_RAWVIDEO, MKTAG(10 , 0 , '3', 'Y') }, { CODEC_ID_RAWVIDEO, MKTAG('Y', '1', 0 , 16 ) }, { CODEC_ID_RAWVIDEO, MKTAG(16 , 0 , '1', 'Y') }, { CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 11 , 16 ) }, diff --git a/libavformat/riff.c b/libavformat/riff.c index 3cc3c354c0..59dd5df711 100644 --- a/libavformat/riff.c +++ b/libavformat/riff.c @@ -174,6 +174,7 @@ const AVCodecTag ff_codec_bmp_tags[] = { { CODEC_ID_RAWVIDEO, MKTAG('2', 'V', 'u', '1') }, { CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') }, { CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', 's') }, + { CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', '2') }, { CODEC_ID_RAWVIDEO, MKTAG('P', '4', '2', '2') }, { CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '2') }, { CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '6') }, @@ -198,6 +199,7 @@ const AVCodecTag ff_codec_bmp_tags[] = { { CODEC_ID_R10K, MKTAG('R', '1', '0', 'k') }, { CODEC_ID_R210, MKTAG('r', '2', '1', '0') }, { CODEC_ID_V210, MKTAG('v', '2', '1', '0') }, + { CODEC_ID_V410, MKTAG('v', '4', '1', '0') }, { CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') }, { CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') }, { CODEC_ID_INDEO4, MKTAG('I', 'V', '4', '1') }, @@ -288,6 +290,7 @@ const AVCodecTag ff_codec_bmp_tags[] = { { CODEC_ID_VBLE, MKTAG('V', 'B', 'L', 'E') }, { CODEC_ID_ESCAPE130, MKTAG('E', '1', '3', '0') }, { CODEC_ID_DXTORY, MKTAG('x', 't', 'o', 'r') }, + { CODEC_ID_Y41P, MKTAG('Y', '4', '1', 'P') }, { CODEC_ID_NONE, 0 } }; @@ -517,7 +520,7 @@ void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc, const AVCodecTag *t avio_wl16(pb, enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24); /* depth */ /* compression type */ avio_wl32(pb, enc->codec_tag); - avio_wl32(pb, enc->width * enc->height * 3); + avio_wl32(pb, (enc->width * enc->height * (enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24)+7) / 8); avio_wl32(pb, 0); avio_wl32(pb, 0); avio_wl32(pb, 0); @@ -698,8 +701,13 @@ int ff_read_riff_info(AVFormatContext *s, int64_t size) chunk_code = avio_rl32(pb); chunk_size = avio_rl32(pb); if (chunk_size > end || end - chunk_size < cur || chunk_size == UINT_MAX) { - av_log(s, AV_LOG_ERROR, "too big INFO subchunk\n"); - return AVERROR_INVALIDDATA; + avio_seek(pb, -9, SEEK_CUR); + chunk_code = avio_rl32(pb); + chunk_size = avio_rl32(pb); + if (chunk_size > end || end - chunk_size < cur || chunk_size == UINT_MAX) { + av_log(s, AV_LOG_ERROR, "too big INFO subchunk\n"); + return AVERROR_INVALIDDATA; + } } chunk_size += (chunk_size & 1); @@ -713,8 +721,7 @@ int ff_read_riff_info(AVFormatContext *s, int64_t size) AV_WL32(key, chunk_code); if (avio_read(pb, value, chunk_size) != chunk_size) { - av_freep(key); - av_freep(value); + av_freep(&value); av_log(s, AV_LOG_ERROR, "premature end of file while reading INFO tag\n"); return AVERROR_INVALIDDATA; } diff --git a/libavformat/rl2.c b/libavformat/rl2.c index 530e0dfb9a..78edec5b18 100644 --- a/libavformat/rl2.c +++ b/libavformat/rl2.c @@ -138,6 +138,9 @@ static av_cold int rl2_read_header(AVFormatContext *s, /** setup audio stream if present */ if(sound_rate){ + if(channels <= 0) + return AVERROR_INVALIDDATA; + pts_num = def_sound_size; pts_den = rate; diff --git a/libavformat/rmdec.c b/libavformat/rmdec.c index 5b9bfb869a..143f95ffe5 100644 --- a/libavformat/rmdec.c +++ b/libavformat/rmdec.c @@ -107,13 +107,14 @@ static int rm_read_extradata(AVIOContext *pb, AVCodecContext *avctx, unsigned si return 0; } -static void rm_read_metadata(AVFormatContext *s, int wide) +static void rm_read_metadata(AVFormatContext *s, AVIOContext *pb, int wide) { char buf[1024]; int i; + for (i=0; ipb) : avio_r8(s->pb); - get_strl(s->pb, buf, sizeof(buf), len); + int len = wide ? avio_rb16(pb) : avio_r8(pb); + get_strl(pb, buf, sizeof(buf), len); av_dict_set(&s->metadata, ff_rm_metadata[i], buf, 0); } } @@ -143,7 +144,7 @@ static int rm_read_audio_stream_info(AVFormatContext *s, AVIOContext *pb, int header_size = avio_rb16(pb); int64_t startpos = avio_tell(pb); avio_skip(pb, 14); - rm_read_metadata(s, 0); + rm_read_metadata(s, pb, 0); if ((startpos + header_size) >= avio_tell(pb) + 2) { // fourcc (should always be "lpcJ") avio_r8(pb); @@ -288,7 +289,7 @@ static int rm_read_audio_stream_info(AVFormatContext *s, AVIOContext *pb, avio_r8(pb); avio_r8(pb); avio_r8(pb); - rm_read_metadata(s, 0); + rm_read_metadata(s, pb, 0); } } return 0; @@ -460,7 +461,7 @@ static int rm_read_header(AVFormatContext *s, AVFormatParameters *ap) flags = avio_rb16(pb); /* flags */ break; case MKTAG('C', 'O', 'N', 'T'): - rm_read_metadata(s, 1); + rm_read_metadata(s, pb, 1); break; case MKTAG('M', 'D', 'P', 'R'): st = avformat_new_stream(s, NULL); @@ -959,6 +960,18 @@ static int64_t rm_read_dts(AVFormatContext *s, int stream_index, return dts; } +static int rm_read_seek(AVFormatContext *s, int stream_index, + int64_t pts, int flags) +{ + RMDemuxContext *rm = s->priv_data; + + if (ff_seek_frame_binary(s, stream_index, pts, flags) < 0) + return -1; + rm->audio_pkt_cnt = 0; + return 0; +} + + AVInputFormat ff_rm_demuxer = { .name = "rm", .long_name = NULL_IF_CONFIG_SMALL("RealMedia format"), @@ -968,6 +981,7 @@ AVInputFormat ff_rm_demuxer = { .read_packet = rm_read_packet, .read_close = rm_read_close, .read_timestamp = rm_read_dts, + .read_seek = rm_read_seek, }; AVInputFormat ff_rdt_demuxer = { diff --git a/libavformat/rpl.c b/libavformat/rpl.c index 9816cb7c30..7100331d5a 100644 --- a/libavformat/rpl.c +++ b/libavformat/rpl.c @@ -58,7 +58,7 @@ static int read_line(AVIOContext * pb, char* line, int bufsize) break; if (b == '\n') { line[i] = '\0'; - return 0; + return url_feof(pb) ? -1 : 0; } line[i] = b; } @@ -252,7 +252,7 @@ static int rpl_read_header(AVFormatContext *s, AVFormatParameters *ap) // Read the index avio_seek(pb, chunk_catalog_offset, SEEK_SET); total_audio_size = 0; - for (i = 0; i < number_of_chunks; i++) { + for (i = 0; !error && i < number_of_chunks; i++) { int64_t offset, video_size, audio_size; error |= read_line(pb, line, sizeof(line)); if (3 != sscanf(line, "%"PRId64" , %"PRId64" ; %"PRId64, diff --git a/libavformat/rtmppkt.c b/libavformat/rtmppkt.c index 7e2ccdc6ac..7489732664 100644 --- a/libavformat/rtmppkt.c +++ b/libavformat/rtmppkt.c @@ -279,11 +279,11 @@ int ff_amf_tag_size(const uint8_t *data, const uint8_t *data_end) data++; break; } - if (data + size >= data_end || data + size < data) + if (size < 0 || size >= data_end - data) return -1; data += size; t = ff_amf_tag_size(data, data_end); - if (t < 0 || data + t >= data_end) + if (t < 0 || t >= data_end - data) return -1; data += t; } @@ -312,7 +312,7 @@ int ff_amf_get_field_value(const uint8_t *data, const uint8_t *data_end, int size = bytestream_get_be16(&data); if (!size) break; - if (data + size >= data_end || data + size < data) + if (size < 0 || size >= data_end - data) return -1; data += size; if (size == namelen && !memcmp(data-size, name, namelen)) { @@ -333,7 +333,7 @@ int ff_amf_get_field_value(const uint8_t *data, const uint8_t *data_end, return 0; } len = ff_amf_tag_size(data, data_end); - if (len < 0 || data + len >= data_end || data + len < data) + if (len < 0 || len >= data_end - data) return -1; data += len; } @@ -363,7 +363,7 @@ static const char* rtmp_packet_type(int type) static void ff_amf_tag_contents(void *ctx, const uint8_t *data, const uint8_t *data_end) { - int size; + unsigned int size; char buf[1024]; if (data >= data_end) @@ -382,7 +382,7 @@ static void ff_amf_tag_contents(void *ctx, const uint8_t *data, const uint8_t *d } else { size = bytestream_get_be32(&data); } - size = FFMIN(size, 1023); + size = FFMIN(size, sizeof(buf) - 1); memcpy(buf, data, size); buf[size] = 0; av_log(ctx, AV_LOG_DEBUG, " string '%s'\n", buf); @@ -395,22 +395,21 @@ static void ff_amf_tag_contents(void *ctx, const uint8_t *data, const uint8_t *d case AMF_DATA_TYPE_OBJECT: av_log(ctx, AV_LOG_DEBUG, " {\n"); for (;;) { - int size = bytestream_get_be16(&data); int t; - memcpy(buf, data, size); - buf[size] = 0; + size = bytestream_get_be16(&data); + av_strlcpy(buf, data, FFMIN(sizeof(buf), size + 1)); if (!size) { av_log(ctx, AV_LOG_DEBUG, " }\n"); data++; break; } - if (data + size >= data_end || data + size < data) + if (size >= data_end - data) return; data += size; av_log(ctx, AV_LOG_DEBUG, " %s: ", buf); ff_amf_tag_contents(ctx, data, data_end); t = ff_amf_tag_size(data, data_end); - if (t < 0 || data + t >= data_end) + if (t < 0 || t >= data_end - data) return; data += t; } diff --git a/libavformat/seek-test.c b/libavformat/seek-test.c index 519f9492ab..34238e0e5d 100644 --- a/libavformat/seek-test.c +++ b/libavformat/seek-test.c @@ -53,7 +53,7 @@ static void ts_str(char buffer[60], int64_t ts, AVRational base) return; } ts= av_rescale_q(ts, base, (AVRational){1, 1000000}); - snprintf(buffer, 60, "%c%Ld.%06Ld", ts<0 ? '-' : ' ', FFABS(ts)/1000000, FFABS(ts)%1000000); + snprintf(buffer, 60, "%c%"PRId64".%06"PRId64"", ts<0 ? '-' : ' ', FFABS(ts)/1000000, FFABS(ts)%1000000); } int main(int argc, char **argv) diff --git a/libavformat/segafilm.c b/libavformat/segafilm.c index 17b118a91c..c2a163d9fc 100644 --- a/libavformat/segafilm.c +++ b/libavformat/segafilm.c @@ -30,6 +30,7 @@ #include "libavutil/intreadwrite.h" #include "avformat.h" #include "internal.h" +#include "avio_internal.h" #define FILM_TAG MKBETAG('F', 'I', 'L', 'M') #define FDSC_TAG MKBETAG('F', 'D', 'S', 'C') @@ -264,6 +265,8 @@ static int film_read_packet(AVFormatContext *s, (film->audio_type != CODEC_ID_ADPCM_ADX)) { /* stereo PCM needs to be interleaved */ + if (ffio_limit(pb, sample->sample_size) != sample->sample_size) + return AVERROR(EIO); if (av_new_packet(pkt, sample->sample_size)) return AVERROR(ENOMEM); diff --git a/libavformat/sierravmd.c b/libavformat/sierravmd.c index faf97b2d6a..f614e51b5c 100644 --- a/libavformat/sierravmd.c +++ b/libavformat/sierravmd.c @@ -30,6 +30,7 @@ #include "libavutil/intreadwrite.h" #include "avformat.h" #include "internal.h" +#include "avio_internal.h" #define VMD_HEADER_SIZE 0x0330 #define BYTES_PER_FRAME_RECORD 16 @@ -246,6 +247,8 @@ static int vmd_read_packet(AVFormatContext *s, /* position the stream (will probably be there already) */ avio_seek(pb, frame->frame_offset, SEEK_SET); + if(ffio_limit(pb, frame->frame_size) != frame->frame_size) + return AVERROR(EIO); if (av_new_packet(pkt, frame->frame_size + BYTES_PER_FRAME_RECORD)) return AVERROR(ENOMEM); pkt->pos= avio_tell(pb); diff --git a/libavformat/siff.c b/libavformat/siff.c index a8d63ee1c0..1a3f0a4e47 100644 --- a/libavformat/siff.c +++ b/libavformat/siff.c @@ -22,6 +22,7 @@ #include "libavutil/intreadwrite.h" #include "avformat.h" #include "internal.h" +#include "avio_internal.h" enum SIFFTags{ TAG_SIFF = MKTAG('S', 'I', 'F', 'F'), @@ -201,13 +202,16 @@ static int siff_read_packet(AVFormatContext *s, AVPacket *pkt) } if (!c->curstrm){ - size = c->pktsize - c->sndsize; - if (av_new_packet(pkt, size) < 0) + size = c->pktsize - c->sndsize - c->gmcsize - 2; + size = ffio_limit(s->pb, size); + if(size < 0 || c->pktsize < c->sndsize) + return AVERROR_INVALIDDATA; + if (av_new_packet(pkt, size + c->gmcsize + 2) < 0) return AVERROR(ENOMEM); AV_WL16(pkt->data, c->flags); if (c->gmcsize) memcpy(pkt->data + 2, c->gmc, c->gmcsize); - avio_read(s->pb, pkt->data + 2 + c->gmcsize, size - c->gmcsize - 2); + avio_read(s->pb, pkt->data + 2 + c->gmcsize, size); pkt->stream_index = 0; c->curstrm = -1; }else{ diff --git a/libavformat/smacker.c b/libavformat/smacker.c index b3de8c7690..26319d4d59 100644 --- a/libavformat/smacker.c +++ b/libavformat/smacker.c @@ -255,6 +255,8 @@ static int smacker_read_packet(AVFormatContext *s, AVPacket *pkt) memcpy(oldpal, pal, 768); size = avio_r8(s->pb); size = size * 4 - 1; + if(size + 1 > frame_size) + return AVERROR_INVALIDDATA; frame_size -= size; frame_size--; sz = 0; @@ -289,10 +291,12 @@ static int smacker_read_packet(AVFormatContext *s, AVPacket *pkt) /* if audio chunks are present, put them to stack and retrieve later */ for(i = 0; i < 7; i++) { if(flags & 1) { - int size; + unsigned int size; uint8_t *tmpbuf; size = avio_rl32(s->pb) - 4; + if(size + 4L > frame_size) + return AVERROR_INVALIDDATA; frame_size -= size; frame_size -= 4; smk->curstream++; diff --git a/libavformat/smjpeg.c b/libavformat/smjpeg.c new file mode 100644 index 0000000000..86cdc46570 --- /dev/null +++ b/libavformat/smjpeg.c @@ -0,0 +1,183 @@ +/* + * SMJPEG demuxer + * Copyright (c) 2011 Paul B Mahol + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * This is a demuxer for Loki SDL MJPEG files + */ + +#include "avformat.h" +#include "internal.h" +#include "riff.h" + +static const AVCodecTag codec_smjpeg_tags[] = { + { CODEC_ID_ADPCM_IMA_SMJPEG, MKTAG('A', 'P', 'C', 'M') }, + { CODEC_ID_PCM_S16LE, MKTAG('N', 'O', 'N', 'E') }, + { CODEC_ID_MJPEG, MKTAG('J', 'F', 'I', 'F') }, + { CODEC_ID_NONE, 0 }, +}; + +typedef struct SMJPEGContext { + int audio_stream_index; + int video_stream_index; +} SMJPEGContext; + +static int smjpeg_probe(AVProbeData *p) +{ + if (!memcmp(p->buf, "\x0\xaSMJPEG", 8)) + return AVPROBE_SCORE_MAX; + return 0; +} + +static int smjpeg_read_header(AVFormatContext *s, AVFormatParameters *ap) +{ + SMJPEGContext *sc = s->priv_data; + AVStream *ast = NULL, *vst = NULL; + AVIOContext *pb = s->pb; + uint32_t version, htype, hlength, duration; + char *comment; + + avio_skip(pb, 8); // magic + version = avio_rb32(pb); + if (version) { + av_log_ask_for_sample(s, "unknown version %d\n", version); + } + duration = avio_rb32(pb); // in msec + + while (!pb->eof_reached) { + htype = avio_rl32(pb); + switch (htype) { + case MKTAG('_', 'T', 'X', 'T'): + hlength = avio_rb32(pb); + if (!hlength || hlength > 512) + return AVERROR_INVALIDDATA; + comment = av_malloc(hlength + 1); + if (!comment) + return AVERROR(ENOMEM); + if (avio_read(pb, comment, hlength) != hlength) { + av_freep(&comment); + av_log(s, AV_LOG_ERROR, "error when reading comment\n"); + return AVERROR_INVALIDDATA; + } + comment[hlength] = 0; + av_dict_set(&s->metadata, "comment", comment, + AV_DICT_DONT_STRDUP_VAL); + break; + case MKTAG('_', 'S', 'N', 'D'): + if (ast) { + av_log_ask_for_sample(s, "multiple audio streams not supported\n"); + return AVERROR_INVALIDDATA; + } + hlength = avio_rb32(pb); + if (hlength < 8) + return AVERROR_INVALIDDATA; + ast = avformat_new_stream(s, 0); + if (!ast) + return AVERROR(ENOMEM); + ast->codec->codec_type = AVMEDIA_TYPE_AUDIO; + ast->codec->sample_rate = avio_rb16(pb); + ast->codec->bits_per_coded_sample = avio_r8(pb); + ast->codec->channels = avio_r8(pb); + ast->codec->codec_tag = avio_rl32(pb); + ast->codec->codec_id = ff_codec_get_id(codec_smjpeg_tags, + ast->codec->codec_tag); + ast->duration = duration; + sc->audio_stream_index = ast->index; + avpriv_set_pts_info(ast, 32, 1, 1000); + avio_skip(pb, hlength - 8); + break; + case MKTAG('_', 'V', 'I', 'D'): + if (vst) { + av_log_ask_for_sample(s, "multiple video streams not supported\n"); + return AVERROR_INVALIDDATA; + } + hlength = avio_rb32(pb); + if (hlength < 12) + return AVERROR_INVALIDDATA; + avio_skip(pb, 4); // number of frames + vst = avformat_new_stream(s, 0); + if (!vst) + return AVERROR(ENOMEM); + vst->codec->codec_type = AVMEDIA_TYPE_VIDEO; + vst->codec->width = avio_rb16(pb); + vst->codec->height = avio_rb16(pb); + vst->codec->codec_tag = avio_rl32(pb); + vst->codec->codec_id = ff_codec_get_id(codec_smjpeg_tags, + vst->codec->codec_tag); + vst->duration = duration; + sc->video_stream_index = vst->index; + avpriv_set_pts_info(vst, 32, 1, 1000); + avio_skip(pb, hlength - 12); + break; + case MKTAG('H', 'E', 'N', 'D'): + return 0; + default: + av_log(s, AV_LOG_ERROR, "unknown header %x\n", htype); + return AVERROR_INVALIDDATA; + } + } + + return AVERROR_EOF; +} + +static int smjpeg_read_packet(AVFormatContext *s, AVPacket *pkt) +{ + SMJPEGContext *sc = s->priv_data; + uint32_t dtype, ret, size, timestamp; + + if (s->pb->eof_reached) + return AVERROR_EOF; + dtype = avio_rl32(s->pb); + switch (dtype) { + case MKTAG('s', 'n', 'd', 'D'): + timestamp = avio_rb32(s->pb); + size = avio_rb32(s->pb); + ret = av_get_packet(s->pb, pkt, size); + pkt->stream_index = sc->audio_stream_index; + pkt->pts = timestamp; + break; + case MKTAG('v', 'i', 'd', 'D'): + timestamp = avio_rb32(s->pb); + size = avio_rb32(s->pb); + ret = av_get_packet(s->pb, pkt, size); + pkt->stream_index = sc->video_stream_index; + pkt->pts = timestamp; + break; + case MKTAG('D', 'O', 'N', 'E'): + ret = AVERROR_EOF; + break; + default: + av_log(s, AV_LOG_ERROR, "unknown chunk %x\n", dtype); + ret = AVERROR_INVALIDDATA; + break; + } + return ret; +} + +AVInputFormat ff_smjpeg_demuxer = { + .name = "smjpeg", + .long_name = NULL_IF_CONFIG_SMALL("Loki SDL MJPEG"), + .priv_data_size = sizeof(SMJPEGContext), + .read_probe = smjpeg_probe, + .read_header = smjpeg_read_header, + .read_packet = smjpeg_read_packet, + .extensions = "mjpg", +}; diff --git a/libavformat/soxdec.c b/libavformat/soxdec.c index 45607ec666..62e701626f 100644 --- a/libavformat/soxdec.c +++ b/libavformat/soxdec.c @@ -98,6 +98,8 @@ static int sox_read_header(AVFormatContext *s, if (comment_size && comment_size < UINT_MAX) { char *comment = av_malloc(comment_size+1); + if(!comment) + return AVERROR(ENOMEM); if (avio_read(pb, comment, comment_size) != comment_size) { av_freep(&comment); return AVERROR(EIO); diff --git a/libavformat/swfenc.c b/libavformat/swfenc.c index af812d09eb..0ad7b3342c 100644 --- a/libavformat/swfenc.c +++ b/libavformat/swfenc.c @@ -498,8 +498,10 @@ static int swf_write_trailer(AVFormatContext *s) avio_wl32(pb, file_size); avio_seek(pb, swf->duration_pos, SEEK_SET); avio_wl16(pb, swf->video_frame_number); + if (swf->vframes_pos) { avio_seek(pb, swf->vframes_pos, SEEK_SET); avio_wl16(pb, swf->video_frame_number); + } avio_seek(pb, file_size, SEEK_SET); } return 0; diff --git a/libavformat/thp.c b/libavformat/thp.c index 96f9ba115c..bd7e60965b 100644 --- a/libavformat/thp.c +++ b/libavformat/thp.c @@ -41,7 +41,7 @@ typedef struct ThpDemuxContext { unsigned char components[16]; AVStream* vst; int has_audio; - int audiosize; + unsigned audiosize; } ThpDemuxContext; @@ -60,6 +60,7 @@ static int thp_read_header(AVFormatContext *s, ThpDemuxContext *thp = s->priv_data; AVStream *st; AVIOContext *pb = s->pb; + int64_t fsize= avio_size(pb); int i; /* Read the file header. */ @@ -72,7 +73,9 @@ static int thp_read_header(AVFormatContext *s, thp->fps = av_d2q(av_int2flt(avio_rb32(pb)), INT_MAX); thp->framecnt = avio_rb32(pb); thp->first_framesz = avio_rb32(pb); - avio_rb32(pb); /* Data size. */ + pb->maxsize = avio_rb32(pb); + if(fsize>0 && (!pb->maxsize || fsize < pb->maxsize)) + pb->maxsize= fsize; thp->compoff = avio_rb32(pb); avio_rb32(pb); /* offsetDataOffset. */ @@ -143,7 +146,7 @@ static int thp_read_packet(AVFormatContext *s, { ThpDemuxContext *thp = s->priv_data; AVIOContext *pb = s->pb; - int size; + unsigned int size; int ret; if (thp->audiosize == 0) { diff --git a/libavformat/txd.c b/libavformat/txd.c index 5d9f969270..06aca8c3f4 100644 --- a/libavformat/txd.c +++ b/libavformat/txd.c @@ -48,6 +48,7 @@ static int txd_read_header(AVFormatContext *s, AVFormatParameters *ap) { st->codec->time_base.den = 5; st->codec->time_base.num = 1; /* the parameters will be extracted from the compressed bitstream */ + return 0; } diff --git a/libavformat/udp.c b/libavformat/udp.c index a0d127c614..b9ebf4153a 100644 --- a/libavformat/udp.c +++ b/libavformat/udp.c @@ -69,6 +69,8 @@ typedef struct { int circular_buffer_error; #if HAVE_PTHREADS pthread_t circular_buffer_thread; + pthread_mutex_t mutex; + pthread_cond_t cond; #endif uint8_t tmp[UDP_MAX_PKT_SIZE+4]; int remaining_in_dg; @@ -317,6 +319,7 @@ static int udp_get_file_handle(URLContext *h) return s->udp_fd; } +#if HAVE_PTHREADS static void *circular_buffer_task( void *_URLContext) { URLContext *h = _URLContext; @@ -331,7 +334,7 @@ static void *circular_buffer_task( void *_URLContext) if (ff_check_interrupt(&h->interrupt_callback)) { s->circular_buffer_error = EINTR; - return NULL; + goto end; } FD_ZERO(&rfds); @@ -343,7 +346,7 @@ static void *circular_buffer_task( void *_URLContext) if (ff_neterrno() == AVERROR(EINTR)) continue; s->circular_buffer_error = EIO; - return NULL; + goto end; } if (!(ret > 0 && FD_ISSET(s->udp_fd, &rfds))) @@ -357,23 +360,31 @@ static void *circular_buffer_task( void *_URLContext) if(left < UDP_MAX_PKT_SIZE + 4) { av_log(h, AV_LOG_ERROR, "circular_buffer: OVERRUN\n"); s->circular_buffer_error = EIO; - return NULL; + goto end; } left = FFMIN(left, s->fifo->end - s->fifo->wptr); len = recv(s->udp_fd, s->tmp+4, sizeof(s->tmp)-4, 0); if (len < 0) { if (ff_neterrno() != AVERROR(EAGAIN) && ff_neterrno() != AVERROR(EINTR)) { s->circular_buffer_error = EIO; - return NULL; + goto end; } continue; } AV_WL32(s->tmp, len); + pthread_mutex_lock(&s->mutex); av_fifo_generic_write(s->fifo, s->tmp, len+4, NULL); + pthread_cond_signal(&s->cond); + pthread_mutex_unlock(&s->mutex); } +end: + pthread_mutex_lock(&s->mutex); + pthread_cond_signal(&s->cond); + pthread_mutex_unlock(&s->mutex); return NULL; } +#endif /* put it in UDP context */ /* return non zero if error */ @@ -516,6 +527,8 @@ static int udp_open(URLContext *h, const char *uri, int flags) if (!is_output && s->circular_buffer_size) { /* start the task going */ s->fifo = av_fifo_alloc(s->circular_buffer_size); + pthread_mutex_init(&s->mutex, NULL); + pthread_cond_init(&s->cond, NULL); if (pthread_create(&s->circular_buffer_thread, NULL, circular_buffer_task, h)) { av_log(h, AV_LOG_ERROR, "pthread_create failed\n"); goto fail; @@ -536,15 +549,15 @@ static int udp_read(URLContext *h, uint8_t *buf, int size) UDPContext *s = h->priv_data; int ret; int avail; - fd_set rfds; - struct timeval tv; +#if HAVE_PTHREADS if (s->fifo) { - + pthread_mutex_lock(&s->mutex); do { avail = av_fifo_size(s->fifo); if (avail) { // >=size) { uint8_t tmp[4]; + pthread_mutex_unlock(&s->mutex); av_fifo_generic_read(s->fifo, tmp, 4, NULL); avail= AV_RL32(tmp); @@ -556,18 +569,19 @@ static int udp_read(URLContext *h, uint8_t *buf, int size) av_fifo_generic_read(s->fifo, buf, avail, NULL); av_fifo_drain(s->fifo, AV_RL32(tmp) - avail); return avail; + } else if(s->circular_buffer_error){ + pthread_mutex_unlock(&s->mutex); + return s->circular_buffer_error; + } else if(h->flags & AVIO_FLAG_NONBLOCK) { + pthread_mutex_unlock(&s->mutex); + return AVERROR(EAGAIN); } else { - FD_ZERO(&rfds); - FD_SET(s->udp_fd, &rfds); - tv.tv_sec = 1; - tv.tv_usec = 0; - ret = select(s->udp_fd + 1, &rfds, NULL, NULL, &tv); - if (ret<0) - return ret; + pthread_cond_wait(&s->cond, &s->mutex); } } while( 1); } +#endif if (!(h->flags & AVIO_FLAG_NONBLOCK)) { ret = ff_network_wait_fd(s->udp_fd, 0); @@ -608,6 +622,10 @@ static int udp_close(URLContext *h) udp_leave_multicast_group(s->udp_fd, (struct sockaddr *)&s->dest_addr); closesocket(s->udp_fd); av_fifo_free(s->fifo); +#if HAVE_PTHREADS + pthread_mutex_destroy(&s->mutex); + pthread_cond_destroy(&s->cond); +#endif return 0; } diff --git a/libavformat/utils.c b/libavformat/utils.c index 3e5a7b76dd..4817507fb3 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -264,10 +264,32 @@ AVInputFormat *av_find_input_format(const char *short_name) return NULL; } +int ffio_limit(AVIOContext *s, int size) +{ + if(s->maxsize>=0){ + int64_t remaining= s->maxsize - avio_tell(s); + if(remaining < size){ + int64_t newsize= avio_size(s); + if(!s->maxsize || s->maxsizemaxsize= newsize - !newsize; + remaining= s->maxsize - avio_tell(s); + remaining= FFMAX(remaining, 0); + } + + if(s->maxsize>=0 && remaining+1 < size){ + av_log(0, AV_LOG_ERROR, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1); + size= remaining+1; + } + } + return size; +} int av_get_packet(AVIOContext *s, AVPacket *pkt, int size) { - int ret= av_new_packet(pkt, size); + int ret; + size= ffio_limit(s, size); + + ret= av_new_packet(pkt, size); if(ret<0) return ret; @@ -609,9 +631,6 @@ static int init_input(AVFormatContext *s, const char *filename, AVDictionary **o int ret; AVProbeData pd = {filename, NULL, 0}; - if(s->iformat && !strlen(filename)) - return 0; - if (s->pb) { s->flags |= AVFMT_FLAG_CUSTOM_IO; if (!s->iformat) @@ -1057,12 +1076,14 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st, if (pkt->dts != AV_NOPTS_VALUE) { // got DTS from the stream, update reference timestamp st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den; - pkt->pts = pkt->dts + pc->pts_dts_delta * num / den; } else if (st->reference_dts != AV_NOPTS_VALUE) { // compute DTS based on reference timestamp pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den; - pkt->pts = pkt->dts + pc->pts_dts_delta * num / den; } + + if (st->reference_dts != AV_NOPTS_VALUE && pkt->pts == AV_NOPTS_VALUE) + pkt->pts = pkt->dts + pc->pts_dts_delta * num / den; + if (pc->dts_sync_point > 0) st->reference_dts = pkt->dts; // new reference } @@ -2480,8 +2501,13 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) st = ic->streams[pkt->stream_index]; if (st->codec_info_nb_frames>1) { - int64_t t; - if (st->time_base.den > 0 && (t=av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q)) >= ic->max_analyze_duration) { + int64_t t=0; + if (st->time_base.den > 0) + t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q); + if (st->avg_frame_rate.num > 0) + t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, (AVRational){st->avg_frame_rate.den, st->avg_frame_rate.num}, AV_TIME_BASE_Q)); + + if (t >= ic->max_analyze_duration) { av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t); break; } @@ -2575,6 +2601,8 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j)) continue; + if(!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j)) + continue; for(k=0; k<2; k++){ int n= st->info->duration_count; double a= st->info->duration_error[k][0][j] / n; @@ -2797,11 +2825,20 @@ void avformat_free_context(AVFormatContext *s) av_free(s); } +#if FF_API_CLOSE_INPUT_FILE void av_close_input_file(AVFormatContext *s) { + avformat_close_input(&s); +} +#endif + +void avformat_close_input(AVFormatContext **ps) +{ + AVFormatContext *s = *ps; AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ? NULL : s->pb; av_close_input_stream(s); + *ps = NULL; if (pb) avio_close(pb); } diff --git a/libavformat/version.h b/libavformat/version.h index 0fb0b18197..e7fc89da22 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -31,7 +31,7 @@ #define LIBAVFORMAT_VERSION_MAJOR 53 #define LIBAVFORMAT_VERSION_MINOR 24 -#define LIBAVFORMAT_VERSION_MICRO 0 +#define LIBAVFORMAT_VERSION_MICRO 2 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ @@ -125,5 +125,8 @@ #ifndef FF_API_SET_PTS_INFO #define FF_API_SET_PTS_INFO (LIBAVFORMAT_VERSION_MAJOR < 54) #endif +#ifndef FF_API_CLOSE_INPUT_FILE +#define FF_API_CLOSE_INPUT_FILE (LIBAVFORMAT_VERSION_MAJOR < 54) +#endif #endif /* AVFORMAT_VERSION_H */ diff --git a/libavformat/wav.c b/libavformat/wav.c index 87d97b4c0c..2080d8e664 100644 --- a/libavformat/wav.c +++ b/libavformat/wav.c @@ -507,14 +507,13 @@ static int wav_read_header(AVFormatContext *s, goto break_loop; case MKTAG('L', 'I', 'S', 'T'): list_type = avio_rl32(pb); - if (size <= 4) { + if (size < 4) { av_log(s, AV_LOG_ERROR, "too short LIST"); return AVERROR_INVALIDDATA; } switch (list_type) { case MKTAG('I', 'N', 'F', 'O'): - if ((ret = ff_read_riff_info(s, size - 4)) < 0) - return ret; + ff_read_riff_info(s, size - 4); } break; } diff --git a/libavformat/westwood.c b/libavformat/westwood.c index d39c4c695e..4cbd5be396 100644 --- a/libavformat/westwood.c +++ b/libavformat/westwood.c @@ -322,17 +322,19 @@ static int wsvqa_read_packet(AVFormatContext *s, while (avio_read(pb, preamble, VQA_PREAMBLE_SIZE) == VQA_PREAMBLE_SIZE) { chunk_type = AV_RB32(&preamble[0]); chunk_size = AV_RB32(&preamble[4]); + skip_byte = chunk_size & 0x01; + if ((chunk_type == SND2_TAG || chunk_type == SND1_TAG) && wsvqa->audio_channels == 0) { + av_log(s, AV_LOG_ERROR, "audio chunk without any audio header information found\n"); + return AVERROR_INVALIDDATA; + } + if ((chunk_type == SND1_TAG) || (chunk_type == SND2_TAG) || (chunk_type == VQFR_TAG)) { - if (av_new_packet(pkt, chunk_size)) + ret= av_get_packet(pb, pkt, chunk_size); + if (ret<0) return AVERROR(EIO); - ret = avio_read(pb, pkt->data, chunk_size); - if (ret != chunk_size) { - av_free_packet(pkt); - return AVERROR(EIO); - } if (chunk_type == SND2_TAG) { pkt->stream_index = wsvqa->audio_stream_index; diff --git a/libavutil/fifo.c b/libavutil/fifo.c index 3ebd5f9b20..d1d9ba8003 100644 --- a/libavutil/fifo.c +++ b/libavutil/fifo.c @@ -83,22 +83,27 @@ int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size) int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)) { int total = size; + uint32_t wndx= f->wndx; + uint8_t *wptr= f->wptr; + do { - int len = FFMIN(f->end - f->wptr, size); + int len = FFMIN(f->end - wptr, size); if (func) { - if (func(src, f->wptr, len) <= 0) + if (func(src, wptr, len) <= 0) break; } else { - memcpy(f->wptr, src, len); + memcpy(wptr, src, len); src = (uint8_t*)src + len; } // Write memory barrier needed for SMP here in theory - f->wptr += len; - if (f->wptr >= f->end) - f->wptr = f->buffer; - f->wndx += len; + wptr += len; + if (wptr >= f->end) + wptr = f->buffer; + wndx += len; size -= len; } while (size > 0); + f->wndx= wndx; + f->wptr= wptr; return total - size; } diff --git a/libavutil/lzo.c b/libavutil/lzo.c index b3c69cf0c5..3642308100 100644 --- a/libavutil/lzo.c +++ b/libavutil/lzo.c @@ -112,7 +112,7 @@ static inline void memcpy_backptr(uint8_t *dst, int back, int cnt); /** * @brief Copies previously decoded bytes to current position. - * @param back how many bytes back we start + * @param back how many bytes back we start, must be > 0 * @param cnt number of bytes to copy, must be >= 0 * * cnt > back is valid, this will copy the bytes we just copied, @@ -135,7 +135,7 @@ static inline void copy_backptr(LZOContext *c, int back, int cnt) { static inline void memcpy_backptr(uint8_t *dst, int back, int cnt) { const uint8_t *src = &dst[-back]; - if (back == 1) { + if (back <= 1) { memset(dst, *src, cnt); } else { #ifdef OUTBUF_PADDED diff --git a/libavutil/lzo.h b/libavutil/lzo.h index d60d8d7487..060b5c9d76 100644 --- a/libavutil/lzo.h +++ b/libavutil/lzo.h @@ -62,7 +62,7 @@ int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen); /** * @brief deliberately overlapping memcpy implementation * @param dst destination buffer; must be padded with 12 additional bytes - * @param back how many bytes back we start (the initial size of the overlapping window) + * @param back how many bytes back we start (the initial size of the overlapping window), must be > 0 * @param cnt number of bytes to copy, must be >= 0 * * cnt > back is valid, this will copy the bytes we just copied, diff --git a/libavutil/utils.c b/libavutil/utils.c index e6c8424ab4..a8d546e352 100644 --- a/libavutil/utils.c +++ b/libavutil/utils.c @@ -18,6 +18,8 @@ #include "config.h" #include "avutil.h" +#include "avassert.h" +#include "samplefmt.h" /** * @file @@ -26,6 +28,11 @@ unsigned avutil_version(void) { + av_assert0(PIX_FMT_VDA_VLD == 81); //check if the pix fmt enum has not had anything inserted or removed by mistake + av_assert0(AV_SAMPLE_FMT_DBLP == 9); + av_assert0(AVMEDIA_TYPE_ATTACHMENT == 4); + av_assert0(AV_PICTURE_TYPE_BI == 7); + return LIBAVUTIL_VERSION_INT; } diff --git a/libswresample/swresample.c b/libswresample/swresample.c index 0575f7dead..f97a2c1b19 100644 --- a/libswresample/swresample.c +++ b/libswresample/swresample.c @@ -202,7 +202,12 @@ int swr_init(struct SwrContext *s){ if(!s->out.ch_count) s->out.ch_count= av_get_channel_layout_nb_channels(s->out_ch_layout); -av_assert0(s-> in.ch_count); + if(!s-> in.ch_count){ + av_assert0(!s->in_ch_layout); + av_log(s, AV_LOG_ERROR, "Input channel count and layout are unset\n"); + return -1; + } + av_assert0(s->used_ch_count); av_assert0(s->out.ch_count); s->resample_first= RSC*s->out.ch_count/s->in.ch_count - RSC < s->out_sample_rate/(float)s-> in_sample_rate - 1.0; diff --git a/libswscale/utils.c b/libswscale/utils.c index 3240b96030..294dd1a458 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -220,7 +220,7 @@ static int initFilter(int16_t **outFilter, int16_t **filterPos, int *outFilterSi } else if (flags&SWS_POINT) { // lame looking point sampling mode int i; - int xDstInSrc; + int64_t xDstInSrc; filterSize= 1; FF_ALLOC_OR_GOTO(NULL, filter, dstW*sizeof(*filter)*filterSize, fail); @@ -234,7 +234,7 @@ static int initFilter(int16_t **outFilter, int16_t **filterPos, int *outFilterSi } } else if ((xInc <= (1<<16) && (flags&SWS_AREA)) || (flags&SWS_FAST_BILINEAR)) { // bilinear upscale int i; - int xDstInSrc; + int64_t xDstInSrc; filterSize= 2; FF_ALLOC_OR_GOTO(NULL, filter, dstW*sizeof(*filter)*filterSize, fail); @@ -246,7 +246,7 @@ static int initFilter(int16_t **outFilter, int16_t **filterPos, int *outFilterSi (*filterPos)[i]= xx; //bilinear upscale / linear interpolate / area averaging for (j=0; j>16); + int64_t coeff= fone - FFABS(((int64_t)xx<<16) - xDstInSrc)*(fone>>16); if (coeff<0) coeff=0; filter[i*filterSize + j]= coeff; xx++; @@ -254,7 +254,7 @@ static int initFilter(int16_t **outFilter, int16_t **filterPos, int *outFilterSi xDstInSrc+= xInc; } } else { - int xDstInSrc; + int64_t xDstInSrc; int sizeFactor; if (flags&SWS_BICUBIC) sizeFactor= 4; @@ -283,7 +283,7 @@ static int initFilter(int16_t **outFilter, int16_t **filterPos, int *outFilterSi int j; (*filterPos)[i]= xx; for (j=0; jdstBpc){ \ c->yuv2plane1 = ff_yuv2plane1_16_sse4; } - if (cpu_flags & AV_CPU_FLAG_AVX) { + if (HAVE_AVX && cpu_flags & AV_CPU_FLAG_AVX) { ASSIGN_VSCALEX_FUNC(c->yuv2planeX, avx, avx, 1,); ASSIGN_VSCALE_FUNC(c->yuv2plane1, avx, avx, 1); } diff --git a/subdir.mak b/subdir.mak index 3589dfb7d6..84d92e7c60 100644 --- a/subdir.mak +++ b/subdir.mak @@ -84,8 +84,8 @@ uninstall-libs:: -$(RM) "$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR)" \ "$(SHLIBDIR)/$(SLIBNAME)" \ "$(SHLIBDIR)/$(SLIBNAME_WITH_VERSION)" - -$(RM) $(SLIB_INSTALL_EXTRA_SHLIB:%="$(SHLIBDIR)"%) - -$(RM) $(SLIB_INSTALL_EXTRA_LIB:%="$(LIBDIR)"%) + -$(RM) $(SLIB_INSTALL_EXTRA_SHLIB:%="$(SHLIBDIR)/%") + -$(RM) $(SLIB_INSTALL_EXTRA_LIB:%="$(LIBDIR)/%") -$(RM) "$(LIBDIR)/$(LIBNAME)" uninstall-headers:: diff --git a/tests/Makefile b/tests/Makefile index 9c192b78d9..15675dc9e6 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -4,8 +4,8 @@ AREF = fate-acodec-aref VREF = fate-vsynth1-vref fate-vsynth2-vref REFS = $(AREF) $(VREF) -$(VREF): avconv$(EXESUF) tests/vsynth1/00.pgm tests/vsynth2/00.pgm -$(AREF): avconv$(EXESUF) tests/data/asynth1.sw +$(VREF): ffmpeg$(EXESUF) tests/vsynth1/00.pgm tests/vsynth2/00.pgm +$(AREF): ffmpeg$(EXESUF) tests/data/asynth1.sw ffservertest: ffserver$(EXESUF) tests/vsynth1/00.pgm tests/data/asynth1.sw @echo diff --git a/tests/fate2.mak b/tests/fate2.mak index 969fd95961..b06e0ab317 100644 --- a/tests/fate2.mak +++ b/tests/fate2.mak @@ -265,3 +265,10 @@ fate-utvideo_yuv422_left: CMD = framecrc -i $(SAMPLES)/utvideo/utvideo_yuv422_le FATE_TESTS += fate-utvideo_yuv422_median fate-utvideo_yuv422_median: CMD = framecrc -i $(SAMPLES)/utvideo/utvideo_yuv422_median.avi + +FATE_TESTS += fate-v410dec +fate-v410dec: CMD = framecrc -i $(SAMPLES)/v410/lenav410.mov -pix_fmt yuv444p10le + +FATE_TESTS += fate-v410enc +fate-v410enc: tests/vsynth1/00.pgm +fate-v410enc: CMD = md5 -f image2 -vcodec pgmyuv -i $(TARGET_PATH)/tests/vsynth1/%02d.pgm -flags +bitexact -vcodec v410 -f avi diff --git a/tests/ref/fate/aasc b/tests/ref/fate/aasc index 07b326983d..5da230f052 100644 --- a/tests/ref/fate/aasc +++ b/tests/ref/fate/aasc @@ -21,4 +21,4 @@ 0, 72000, 168000, 0x646fa087 0, 75600, 168000, 0x404450a2 0, 79200, 168000, 0x5214c456 -0, 82800, 168000, 0xe573025c +0, 82800, 168000, 0xaef602d3 diff --git a/tests/ref/fate/cljr b/tests/ref/fate/cljr index 7221b9e4e6..208b9511be 100644 --- a/tests/ref/fate/cljr +++ b/tests/ref/fate/cljr @@ -1,36 +1,36 @@ -0, 0, 64800, 0x44a1c47c -0, 3169, 64800, 0x649cc3a4 -0, 6338, 64800, 0xcab1b88c -0, 9507, 64800, 0xf56cb788 -0, 12676, 64800, 0x5336b618 -0, 15845, 64800, 0x2704b438 -0, 19013, 64800, 0x04c7b8e4 -0, 22182, 64800, 0x3185b288 -0, 25351, 64800, 0xa537c410 -0, 28520, 64800, 0x6495c0f8 -0, 31689, 64800, 0x06a1ca14 -0, 34858, 64800, 0x69cdd2a0 -0, 38027, 64800, 0x4ad2d828 -0, 41196, 64800, 0x9604dea4 -0, 44365, 64800, 0x1c00e430 -0, 47534, 64800, 0x9afeefe0 -0, 50702, 64800, 0xc13fdd78 -0, 53871, 64800, 0x8438da7c -0, 57040, 64800, 0xa0ead278 -0, 60209, 64800, 0xbeced2d8 -0, 63378, 64800, 0x85bbd7dc -0, 66547, 64800, 0xbe59ce34 -0, 69716, 64800, 0xd76ecccc -0, 72885, 64800, 0xe182b474 -0, 76054, 64800, 0x916cc394 -0, 79223, 64800, 0x7efebd14 -0, 82391, 64800, 0x8d28c9f0 -0, 85560, 64800, 0x00a1c960 -0, 88729, 64800, 0xc164c400 -0, 91898, 64800, 0xfd4dc544 -0, 95067, 64800, 0x01bfbe38 -0, 98236, 64800, 0xff11b5d0 -0, 101405, 64800, 0x4876bb20 -0, 104574, 64800, 0x756ecb04 -0, 107743, 64800, 0x3b8cd540 -0, 110912, 64800, 0x063ed444 +0, 0, 64800, 0x63132a60 +0, 3169, 64800, 0xb3c729a3 +0, 6338, 64800, 0xa27b1e0e +0, 9507, 64800, 0xb9131d00 +0, 12676, 64800, 0xaf9a1bae +0, 15845, 64800, 0x11e319c5 +0, 19013, 64800, 0xee6e1e6b +0, 22182, 64800, 0x418417e9 +0, 25351, 64800, 0x339d29f4 +0, 28520, 64800, 0x198926c4 +0, 31689, 64800, 0x439a3044 +0, 34858, 64800, 0x0a4e38e1 +0, 38027, 64800, 0x6e043e7e +0, 41196, 64800, 0xde434533 +0, 44365, 64800, 0xb58a4ad1 +0, 47534, 64800, 0xaa105710 +0, 50702, 64800, 0x1723440c +0, 53871, 64800, 0x3b064116 +0, 57040, 64800, 0x853f38e4 +0, 60209, 64800, 0x52f53917 +0, 63378, 64800, 0xea363e5a +0, 66547, 64800, 0x4d0a344e +0, 69716, 64800, 0xe49232fc +0, 72885, 64800, 0x747b1a02 +0, 76054, 64800, 0xbaa82992 +0, 79223, 64800, 0x8e9322db +0, 82391, 64800, 0x029a2fcf +0, 85560, 64800, 0xb9a62f6a +0, 88729, 64800, 0x553329fe +0, 91898, 64800, 0x9a052b5b +0, 95067, 64800, 0xe2ff2404 +0, 98236, 64800, 0xaacd1b59 +0, 101405, 64800, 0x17d820de +0, 104574, 64800, 0x1c9e312c +0, 107743, 64800, 0x84df3b99 +0, 110912, 64800, 0xf7d13aa1 diff --git a/tests/ref/fate/v410dec b/tests/ref/fate/v410dec new file mode 100644 index 0000000000..f72d74fc38 --- /dev/null +++ b/tests/ref/fate/v410dec @@ -0,0 +1 @@ +0, 0, 393216, 0xfe11a6b0 diff --git a/tests/ref/fate/v410enc b/tests/ref/fate/v410enc new file mode 100644 index 0000000000..e5332dedd4 --- /dev/null +++ b/tests/ref/fate/v410enc @@ -0,0 +1 @@ +979c9a9a09e8eaaf6467b8c22c0ac8bb diff --git a/tests/ref/fate/vqa-cc b/tests/ref/fate/vqa-cc index e15e727fa1..fdc7e72eeb 100644 --- a/tests/ref/fate/vqa-cc +++ b/tests/ref/fate/vqa-cc @@ -68,6 +68,7 @@ 1, 218996, 2940, 0xac8bb6c8 0, 222000, 192000, 0xb58c1566 1, 224996, 2940, 0xa503c73b +0, 228000, 192000, 0xb58c1566 1, 230996, 2940, 0x7cd588a3 1, 236996, 2940, 0xa6974b04 1, 242996, 2940, 0xbf448241 diff --git a/tests/ref/lavfi/pixdesc b/tests/ref/lavfi/pixdesc index 63e2980dcc..07d1d36417 100644 --- a/tests/ref/lavfi/pixdesc +++ b/tests/ref/lavfi/pixdesc @@ -35,23 +35,23 @@ uyvy422 adcf64516a19fce44df77082bdb16291 yuv410p 2d9225153c83ee1132397d619d94d1b3 yuv411p 8b298af3e43348ca1b11eb8a3252ac6c yuv420p eba2f135a08829387e2f698ff72a2939 -yuv420p10be ea2aee509286fa3d07a6c68fec9967a5 -yuv420p10le 645ef73e06de41c83a7bc724179d2ce3 +yuv420p10be 2f88c301feeaccd2a5fb55f54fc30be9 +yuv420p10le 93f175084af4e78f97c7710e505f3057 yuv420p16be ba858ff4246368c28f03152487f57ef3 yuv420p16le de239729a4fe1d4cfa3743e006654e78 yuv420p9be 64e36fd90573f67ac2006d103972a79b yuv420p9le 9ed4b1dfabc53fd9e586ff6c4c43af80 yuv422p c9bba4529821d796a6ab09f6a5fd355a -yuv422p10be bdc13b630fd668b34c6fe1aae28dfc71 -yuv422p10le d0607c260a45c973e6639f4e449730ad +yuv422p10be 11af7dfafe8bc025c7e3bd82b830fe8a +yuv422p10le ec04efb76efa79bf0d02b21572371a56 yuv422p16be 5499502e1c29534a158a1fe60e889f60 yuv422p16le e3d61fde6978591596bc36b914386623 yuv422p9be 29b71579946940a8c00fa844c9dff507 yuv422p9le 062b7f9cbb972bf36b5bdb1a7623701a yuv440p 5a064afe2b453bb52cdb3f176b1aa1cf yuv444p 0a98447b78fd476aa39686da6a74fa2e -yuv444p10be e65cbae7e4f1892c23defbc8e8052cf6 -yuv444p10le 767179dd82846cf00ee4c340c9c1ab74 +yuv444p10be 71be185a2fb7a353eb024df9bc63212d +yuv444p10le c1c6b30a12065c7901c0a267e4861a0f yuv444p16be 1c6ea2c2f5e539006112ceec3d4e7d90 yuv444p16le 20f86bc2f68d2b3f1f2b48b97b2189f4 yuv444p9be 6ab31f4c12b533ce318ecdff83cdd054 diff --git a/tests/ref/lavfi/pixfmts_copy b/tests/ref/lavfi/pixfmts_copy index 3a638c33c2..5ced4785c8 100644 --- a/tests/ref/lavfi/pixfmts_copy +++ b/tests/ref/lavfi/pixfmts_copy @@ -36,23 +36,23 @@ uyvy422 adcf64516a19fce44df77082bdb16291 yuv410p 2d9225153c83ee1132397d619d94d1b3 yuv411p 8b298af3e43348ca1b11eb8a3252ac6c yuv420p eba2f135a08829387e2f698ff72a2939 -yuv420p10be ea2aee509286fa3d07a6c68fec9967a5 -yuv420p10le 645ef73e06de41c83a7bc724179d2ce3 +yuv420p10be 2f88c301feeaccd2a5fb55f54fc30be9 +yuv420p10le 93f175084af4e78f97c7710e505f3057 yuv420p16be ba858ff4246368c28f03152487f57ef3 yuv420p16le de239729a4fe1d4cfa3743e006654e78 yuv420p9be 64e36fd90573f67ac2006d103972a79b yuv420p9le 9ed4b1dfabc53fd9e586ff6c4c43af80 yuv422p c9bba4529821d796a6ab09f6a5fd355a -yuv422p10be bdc13b630fd668b34c6fe1aae28dfc71 -yuv422p10le d0607c260a45c973e6639f4e449730ad +yuv422p10be 11af7dfafe8bc025c7e3bd82b830fe8a +yuv422p10le ec04efb76efa79bf0d02b21572371a56 yuv422p16be 5499502e1c29534a158a1fe60e889f60 yuv422p16le e3d61fde6978591596bc36b914386623 yuv422p9be 29b71579946940a8c00fa844c9dff507 yuv422p9le 062b7f9cbb972bf36b5bdb1a7623701a yuv440p 5a064afe2b453bb52cdb3f176b1aa1cf yuv444p 0a98447b78fd476aa39686da6a74fa2e -yuv444p10be e65cbae7e4f1892c23defbc8e8052cf6 -yuv444p10le 767179dd82846cf00ee4c340c9c1ab74 +yuv444p10be 71be185a2fb7a353eb024df9bc63212d +yuv444p10le c1c6b30a12065c7901c0a267e4861a0f yuv444p16be 1c6ea2c2f5e539006112ceec3d4e7d90 yuv444p16le 20f86bc2f68d2b3f1f2b48b97b2189f4 yuv444p9be 6ab31f4c12b533ce318ecdff83cdd054 diff --git a/tests/ref/lavfi/pixfmts_null b/tests/ref/lavfi/pixfmts_null index 3a638c33c2..5ced4785c8 100644 --- a/tests/ref/lavfi/pixfmts_null +++ b/tests/ref/lavfi/pixfmts_null @@ -36,23 +36,23 @@ uyvy422 adcf64516a19fce44df77082bdb16291 yuv410p 2d9225153c83ee1132397d619d94d1b3 yuv411p 8b298af3e43348ca1b11eb8a3252ac6c yuv420p eba2f135a08829387e2f698ff72a2939 -yuv420p10be ea2aee509286fa3d07a6c68fec9967a5 -yuv420p10le 645ef73e06de41c83a7bc724179d2ce3 +yuv420p10be 2f88c301feeaccd2a5fb55f54fc30be9 +yuv420p10le 93f175084af4e78f97c7710e505f3057 yuv420p16be ba858ff4246368c28f03152487f57ef3 yuv420p16le de239729a4fe1d4cfa3743e006654e78 yuv420p9be 64e36fd90573f67ac2006d103972a79b yuv420p9le 9ed4b1dfabc53fd9e586ff6c4c43af80 yuv422p c9bba4529821d796a6ab09f6a5fd355a -yuv422p10be bdc13b630fd668b34c6fe1aae28dfc71 -yuv422p10le d0607c260a45c973e6639f4e449730ad +yuv422p10be 11af7dfafe8bc025c7e3bd82b830fe8a +yuv422p10le ec04efb76efa79bf0d02b21572371a56 yuv422p16be 5499502e1c29534a158a1fe60e889f60 yuv422p16le e3d61fde6978591596bc36b914386623 yuv422p9be 29b71579946940a8c00fa844c9dff507 yuv422p9le 062b7f9cbb972bf36b5bdb1a7623701a yuv440p 5a064afe2b453bb52cdb3f176b1aa1cf yuv444p 0a98447b78fd476aa39686da6a74fa2e -yuv444p10be e65cbae7e4f1892c23defbc8e8052cf6 -yuv444p10le 767179dd82846cf00ee4c340c9c1ab74 +yuv444p10be 71be185a2fb7a353eb024df9bc63212d +yuv444p10le c1c6b30a12065c7901c0a267e4861a0f yuv444p16be 1c6ea2c2f5e539006112ceec3d4e7d90 yuv444p16le 20f86bc2f68d2b3f1f2b48b97b2189f4 yuv444p9be 6ab31f4c12b533ce318ecdff83cdd054 diff --git a/tests/ref/lavfi/pixfmts_scale b/tests/ref/lavfi/pixfmts_scale index 53ea7db703..597904d02c 100644 --- a/tests/ref/lavfi/pixfmts_scale +++ b/tests/ref/lavfi/pixfmts_scale @@ -36,23 +36,23 @@ uyvy422 314bd486277111a95d9369b944fa0400 yuv410p 7df8f6d69b56a8dcb6c7ee908e5018b5 yuv411p 1143e7c5cc28fe0922b051b17733bc4c yuv420p fdad2d8df8985e3d17e73c71f713cb14 -yuv420p10be 6d335e75b553da590135cf8bb999610c -yuv420p10le d510ddbabefd03ef39ec943fcb51b709 +yuv420p10be 418039dbd82cf612db88417276aa0d1a +yuv420p10le ff7e5321208ab995b4f95634ebdf192b yuv420p16be 31988e9a5d6acacaa710f67bc1172f3a yuv420p16le f5390ce399f88e0e4e2621ed7833b250 yuv420p9be ec4983b7a949c0472110a7a2c58e278a yuv420p9le c136dce5913a722eee44ab72cff664b2 yuv422p 918e37701ee7377d16a8a6c119c56a40 -yuv422p10be cea7ca6b0e66d6f29539885896c88603 -yuv422p10le a10c4a5837547716f13cd61918b145f9 +yuv422p10be 315654908d50718e175aae018c484732 +yuv422p10le 91bbc78a9a56f659b55abc17722dcc09 yuv422p16be e7e34fe9264784763ab6cb406524c0f3 yuv422p16le c435b76b08204dda6908640fb5fd4621 yuv422p9be 82494823944912f73cebc58ad2979bbd yuv422p9le fc69c8a21f473916a4b4225636b97e06 yuv440p 461503fdb9b90451020aa3b25ddf041c yuv444p 81b2eba962d12e8d64f003ac56f6faf2 -yuv444p10be e9d3c8e744b8b0d8187ca092fa203fc9 -yuv444p10le 02f0a336e9da062a64df1ba487e102c5 +yuv444p10be fb304d77c6d2e18df5938662a22176f0 +yuv444p10le b17136913eb066dca6be6af645b9f7e8 yuv444p16be 0da9bed80f5542682ab286f3261cf24c yuv444p16le a0c5d3c7bf3f181db503cf8e450d1335 yuv444p9be 9ac2643ce7f7e5c4e17c8c9fd8494d4a diff --git a/tests/ref/lavfi/pixfmts_vflip b/tests/ref/lavfi/pixfmts_vflip index ce613debe5..333bd46484 100644 --- a/tests/ref/lavfi/pixfmts_vflip +++ b/tests/ref/lavfi/pixfmts_vflip @@ -36,23 +36,23 @@ uyvy422 ffbd36720c77398d9a0d03ce2625928f yuv410p 7bfb39d7afb49d6a6173e6b23ae321eb yuv411p 4a90048cc3a65fac150e53289700efe1 yuv420p 2e6d6062e8cad37fb3ab2c433b55f382 -yuv420p10be fac8e0ae5a81861cddac97ddc4100b66 -yuv420p10le cb83ed3552113e0292e30adee774359c +yuv420p10be 7ce787a888381dd46b0212c099ecaad9 +yuv420p10le bf22a1c543a7b3dbc556a0eb9592e179 yuv420p16be b6d25ba55bc1831d352f379311b42b6d yuv420p16le 1d7ef427b6f79a02b93948738dab5442 yuv420p9be 9865bf5c4392b56b1c4eb4f5a3fd32f9 yuv420p9le 0f1e371a1374d3cba2205b70cc7cac90 yuv422p d7f5cb44d9b0210d66d6a8762640ab34 -yuv422p10be 588fe319b96513c32e21d3e32b45447f -yuv422p10le 11b57f2bd9661024153f3973b9090cdb +yuv422p10be 0be8378c3773e1c0b394315ef4994351 +yuv422p10le 6518094fe8de6bee95af21af1e5dc1e1 yuv422p16be 9bd8f8c961822b586fa4cf992be54acc yuv422p16le 9c4a1239605c7952b736ac3130163f14 yuv422p9be 7c6f1e140b3999ee7d923854e507752a yuv422p9le 51f10d79c07989060dd06e767e6d7d60 yuv440p 876385e96165acf51271b20e5d85a416 yuv444p 9c3c667d1613b72d15bc6d851c5eb8f7 -yuv444p10be 944a4997c4edb3a8dd0f0493cfd5a1fd -yuv444p10le 2d0947ae89ecc6a501eee6832cb27e06 +yuv444p10be ee069cc6db48975eb029d72f889a7fe6 +yuv444p10le 645b3335248113cafe3c29edb1d7f3be yuv444p16be de2dedfc6f12073ffead113f86e07ecf yuv444p16le 8e83323cf102d6c823a03ae8a7b7e033 yuv444p9be 6ac92b7dc9ab2fc59bee99204886899a diff --git a/tests/ref/seek/lavf_mxf b/tests/ref/seek/lavf_mxf index 00dea3d8fd..4c1aecc68e 100644 --- a/tests/ref/seek/lavf_mxf +++ b/tests/ref/seek/lavf_mxf @@ -2,47 +2,52 @@ ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 6144 size: 24801 ret: 0 st:-1 flags:0 ts:-1.000000 ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 6144 size: 24801 ret: 0 st:-1 flags:1 ts: 1.894167 -ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 460800 size: 24712 +ret:-1 ret: 0 st: 0 flags:0 ts: 0.800000 -ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 460800 size: 24712 +ret:-1 ret: 0 st: 0 flags:1 ts:-0.320000 ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 6144 size: 24801 -ret:-1 st: 1 flags:0 ts: 2.560000 +ret: 0 st: 1 flags:0 ts: 2.560000 +ret:-1 ret: 0 st: 1 flags:1 ts: 1.480000 -ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 460800 size: 24712 +ret:-1 ret: 0 st:-1 flags:0 ts: 0.365002 -ret: 0 st: 0 flags:1 dts: 0.400000 pts: NOPTS pos: 211968 size: 24787 +ret: 0 st: 0 flags:1 dts: 0.360000 pts: NOPTS pos: 6144 size: 24801 ret: 0 st:-1 flags:1 ts:-0.740831 ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 6144 size: 24801 -ret:-1 st: 0 flags:0 ts: 2.160000 +ret: 0 st: 0 flags:0 ts: 2.160000 +ret:-1 ret: 0 st: 0 flags:1 ts: 1.040000 -ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 460800 size: 24712 +ret:-1 ret: 0 st: 1 flags:0 ts:-0.040000 ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 6144 size: 24801 ret: 0 st: 1 flags:1 ts: 2.840000 -ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 460800 size: 24712 -ret:-1 st:-1 flags:0 ts: 1.730004 +ret:-1 +ret: 0 st:-1 flags:0 ts: 1.730004 +ret:-1 ret: 0 st:-1 flags:1 ts: 0.624171 -ret: 0 st: 0 flags:1 dts: 0.400000 pts: NOPTS pos: 211968 size: 24787 +ret:-1 ret: 0 st: 0 flags:0 ts:-0.480000 ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 6144 size: 24801 ret: 0 st: 0 flags:1 ts: 2.400000 -ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 460800 size: 24712 -ret:-1 st: 1 flags:0 ts: 1.320000 +ret:-1 +ret: 0 st: 1 flags:0 ts: 1.320000 +ret:-1 ret: 0 st: 1 flags:1 ts: 0.200000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 6144 size: 24801 +ret: 0 st: 0 flags:1 dts: 0.200000 pts: NOPTS pos: 6144 size: 24801 ret: 0 st:-1 flags:0 ts:-0.904994 ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 6144 size: 24801 ret: 0 st:-1 flags:1 ts: 1.989173 -ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 460800 size: 24712 +ret:-1 ret: 0 st: 0 flags:0 ts: 0.880000 -ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 460800 size: 24712 +ret:-1 ret: 0 st: 0 flags:1 ts:-0.240000 ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 6144 size: 24801 -ret:-1 st: 1 flags:0 ts: 2.680000 +ret: 0 st: 1 flags:0 ts: 2.680000 +ret:-1 ret: 0 st: 1 flags:1 ts: 1.560000 -ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 460800 size: 24712 +ret:-1 ret: 0 st:-1 flags:0 ts: 0.460008 -ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 460800 size: 24712 +ret: 0 st: 0 flags:1 dts: 0.480000 pts: NOPTS pos: 6144 size: 24801 ret: 0 st:-1 flags:1 ts:-0.645825 ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 6144 size: 24801 diff --git a/tests/ref/vsynth1/cljr b/tests/ref/vsynth1/cljr index 9a7a980b41..73dc6ba578 100644 --- a/tests/ref/vsynth1/cljr +++ b/tests/ref/vsynth1/cljr @@ -1,4 +1,4 @@ -ff4eebcd5bd7b6470f97867cdecb0bec *./tests/data/vsynth1/cljr.avi +041982e4fa83428c621a127647d47b3f *./tests/data/vsynth1/cljr.avi 5075660 ./tests/data/vsynth1/cljr.avi -0d473eb49653a05685178dd261de861c *./tests/data/cljr.vsynth1.out.yuv -stddev: 30.70 PSNR: 18.39 MAXDIFF: 255 bytes: 7603200/ 7603200 +e1c4c96c74de3435d0f9f6118c5ed9b5 *./tests/data/cljr.vsynth1.out.yuv +stddev: 30.53 PSNR: 18.43 MAXDIFF: 225 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth1/huffyuv b/tests/ref/vsynth1/huffyuv index fefc84a3b4..9ec091eb36 100644 --- a/tests/ref/vsynth1/huffyuv +++ b/tests/ref/vsynth1/huffyuv @@ -1,4 +1,4 @@ -ace2536fa169d835d0fb332abde28d51 *./tests/data/vsynth1/huffyuv.avi +f5f2e109af0612694ff3cd6464063e82 *./tests/data/vsynth1/huffyuv.avi 7933800 ./tests/data/vsynth1/huffyuv.avi c5ccac874dbf808e9088bc3107860042 *./tests/data/huffyuv.vsynth1.out.yuv stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth1/yuv b/tests/ref/vsynth1/yuv index b98dda503a..6d8b1431db 100644 --- a/tests/ref/vsynth1/yuv +++ b/tests/ref/vsynth1/yuv @@ -1,4 +1,4 @@ -aa6b9e862aebcf8902a6d770e7729d59 *./tests/data/vsynth1/yuv.avi +eaa66c3b27a2602e882befe154a8b119 *./tests/data/vsynth1/yuv.avi 7610060 ./tests/data/vsynth1/yuv.avi c5ccac874dbf808e9088bc3107860042 *./tests/data/yuv.vsynth1.out.yuv stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth2/cljr b/tests/ref/vsynth2/cljr index cf3c8e1abf..75466437ff 100644 --- a/tests/ref/vsynth2/cljr +++ b/tests/ref/vsynth2/cljr @@ -1,4 +1,4 @@ -8ca3f24da468f32561100d3a1a71348d *./tests/data/vsynth2/cljr.avi +fdc1926e0a599de94513f0a3472b598f *./tests/data/vsynth2/cljr.avi 5075660 ./tests/data/vsynth2/cljr.avi -a0126ba9f2b2192b6b63b485e0118114 *./tests/data/cljr.vsynth2.out.yuv -stddev: 10.26 PSNR: 27.90 MAXDIFF: 62 bytes: 7603200/ 7603200 +7df03229ee6361ea11a0d83d4926cb10 *./tests/data/cljr.vsynth2.out.yuv +stddev: 10.30 PSNR: 27.87 MAXDIFF: 65 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth2/huffyuv b/tests/ref/vsynth2/huffyuv index 740862aba4..e59b53ca3e 100644 --- a/tests/ref/vsynth2/huffyuv +++ b/tests/ref/vsynth2/huffyuv @@ -1,4 +1,4 @@ -56cd44907a48990e06bd065e189ff461 *./tests/data/vsynth2/huffyuv.avi +ed66182be0d515e8b6cb970ad63162da *./tests/data/vsynth2/huffyuv.avi 6455232 ./tests/data/vsynth2/huffyuv.avi dde5895817ad9d219f79a52d0bdfb001 *./tests/data/huffyuv.vsynth2.out.yuv stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth2/yuv b/tests/ref/vsynth2/yuv index 6593ce9b3d..699ebc9b9f 100644 --- a/tests/ref/vsynth2/yuv +++ b/tests/ref/vsynth2/yuv @@ -1,4 +1,4 @@ -30a400773ab26f2c83e469198b156f1d *./tests/data/vsynth2/yuv.avi +3d5ee6d2023bc15bba898819e4977e46 *./tests/data/vsynth2/yuv.avi 7610060 ./tests/data/vsynth2/yuv.avi dde5895817ad9d219f79a52d0bdfb001 *./tests/data/yuv.vsynth2.out.yuv stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 7603200/ 7603200