Compare commits
123 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2a5c41e3e4 | |||
| 9e6586ceb2 | |||
| 6456a7416e | |||
| de487cb765 | |||
| 2fece989f8 | |||
| a2d3e7392d | |||
| d391719be1 | |||
| a22155dacd | |||
| 1a43626fdf | |||
| 675258764d | |||
| 6109c10b81 | |||
| 08eef74a39 | |||
| 7fefd77668 | |||
| f12c0da09b | |||
| 30c80e81d2 | |||
| fc36e692c4 | |||
| 263add4462 | |||
| d2566b124a | |||
| d89979e86b | |||
| c2ea706282 | |||
| 622ccbd8ab | |||
| c8c5f66b42 | |||
| bc6174d4af | |||
| 2303cea5be | |||
| d0590d9349 | |||
| e60a00e0cc | |||
| e6351504dc | |||
| 8834e080c2 | |||
| 39dc26f0c1 | |||
| 496267f8e9 | |||
| 9d738e6968 | |||
| 77c9c35093 | |||
| 03f996d183 | |||
| c68ce48260 | |||
| ac8ac46641 | |||
| c2087fc48b | |||
| 21a9797737 | |||
| 65c10f0f5c | |||
| ed1c6f701a | |||
| 7a3dc2f7b6 | |||
| e91b7852df | |||
| 5aaf7e3182 | |||
| ed38046c5c | |||
| ba642f0319 | |||
| 8b21b44e7e | |||
| 748a4747da | |||
| 6fc29572fb | |||
| 677ea4a49b | |||
| 12320c0822 | |||
| c46d22a4a5 | |||
| 40ab55746e | |||
| 949094a4cd | |||
| 79f52a0dbd | |||
| ae89381962 | |||
| 596513ca2c | |||
| 2f07937926 | |||
| 4943abe051 | |||
| 8c4a67183b | |||
| 049d767715 | |||
| 8003a5d237 | |||
| ec30a498e6 | |||
| fabc1c9e56 | |||
| 0ad4d4198a | |||
| 93422bc92e | |||
| 22a0c0e764 | |||
| 77f978996b | |||
| 4770eac663 | |||
| afd57722e1 | |||
| 7d42daeea2 | |||
| 055e5c80ee | |||
| 905372be8f | |||
| f4b8892ccb | |||
| 4275b27a23 | |||
| 9745c5ebf8 | |||
| 19d2921bbf | |||
| e160064d39 | |||
| a75a7feebd | |||
| 309fa24f36 | |||
| 3586c68687 | |||
| 456cf87de9 | |||
| 54d48c8e90 | |||
| 43407bde3e | |||
| 7c9ee83d2f | |||
| 67f421fd77 | |||
| 46732e6a55 | |||
| 5222f660d7 | |||
| c70b1ae930 | |||
| 327033d913 | |||
| 9a345b235f | |||
| 8f6a95a103 | |||
| b4922daead | |||
| 88e3e6b943 | |||
| 87d5146fb7 | |||
| caf32880fd | |||
| 7c01fa962e | |||
| e4eab67a0a | |||
| 86f9228740 | |||
| 7cab4142c5 | |||
| 2e1be22715 | |||
| 7da59005be | |||
| 1410732621 | |||
| f9a150fc31 | |||
| ce36e74e75 | |||
| fc25481d17 | |||
| 5c695ce903 | |||
| f617b94c23 | |||
| 79af094b93 | |||
| 7747300289 | |||
| 37c83b5373 | |||
| 3e730278f5 | |||
| 1fdf549462 | |||
| 0a6d760230 | |||
| cd427a9d07 | |||
| 8fd5669077 | |||
| 25f0ea9ece | |||
| 36fcb8cc55 | |||
| 18ce5a4d1b | |||
| cf09348b9e | |||
| 970f2ad966 | |||
| 104c357b6a | |||
| b2a74dd629 | |||
| 182cfe4832 | |||
| e5d434b840 |
@@ -1,8 +1,118 @@
|
||||
Entries are sorted chronologically from oldest to youngest within each release,
|
||||
releases are sorted from youngest to oldest.
|
||||
|
||||
version <next>:
|
||||
- YUY2 Lossless Codec decoder
|
||||
version 3.1.5:
|
||||
- avformat/mxfdec: Check size to avoid integer overflow in mxf_read_utf16_string()
|
||||
- avcodec/mpegvideo_enc: Clear mmx state in ff_mpv_reallocate_putbitbuffer()
|
||||
- avcodec/utils: Clear MMX state before returning from avcodec_default_execute*()
|
||||
- doc/examples/demuxing_decoding: Drop AVFrame->pts use
|
||||
- libopenjpegenc: fix out-of-bounds reads when filling the edges
|
||||
- libopenjpegenc: stop reusing image data buffer for openjpeg 2
|
||||
- configure: fix detection of libopenjpeg
|
||||
- doc: fix various typos and grammar errors
|
||||
- avformat/utils: Update codec_id before using it in the parser init
|
||||
- cmdutils: fix typos
|
||||
- lavfi: fix typos
|
||||
- lavc: fix typos
|
||||
- tools: fix grammar error
|
||||
- ffmpeg: remove unused and errorneous AVFrame timestamp check
|
||||
- Support for MIPS cpu P6600
|
||||
- avutil/mips/generic_macros_msa: rename macro variable which causes segfault for mips r6
|
||||
|
||||
version 3.1.4:
|
||||
- avformat/avidec: Check nb_streams in read_gab2_sub()
|
||||
- avformat/avidec: Remove ancient assert
|
||||
- avfilter/vf_colorspace: fix range for output colorspace option
|
||||
- lavc/mediacodecdec_h264: fix SODB escaping
|
||||
- avcodec/nvenc: fix const options for hevc gpu setting
|
||||
- avformat/avidec: Fix memleak with dv in avi
|
||||
- lavc/movtextdec.c: Avoid infinite loop on invalid data.
|
||||
- avcodec/ansi: Check dimensions
|
||||
- avcodec/cavsdsp: use av_clip_uint8() for idct
|
||||
- avformat/movenc: Check packet in mov_write_single_packet() too
|
||||
- avformat/movenc: Factor check_pkt() out
|
||||
- avformat/utils: fix timebase error in avformat_seek_file()
|
||||
- avcodec/g726: Add missing ADDB output mask
|
||||
- avcodec/avpacket: clear side_data_elems
|
||||
- avformat/movenc: Check first DTS similar to dts difference
|
||||
- avcodec/ccaption_dec: Use simple array instead of AVBuffer
|
||||
- avcodec/svq3: Reintroduce slice_type
|
||||
- avformat/mov: Fix potential integer overflow in mov_read_keys
|
||||
- swscale/swscale_unscaled: Try to fix Rgb16ToPlanarRgb16Wrapper() with slices
|
||||
- swscale/swscale_unscaled: Fix packed_16bpc_bswap() with slices
|
||||
- avformat/avidec: Fix infinite loop in avi_read_nikon()
|
||||
- lavf/utils: Avoid an overflow for huge negative durations.
|
||||
- avformat/hls: Fix handling of EXT-X-BYTERANGE streams over 2GB
|
||||
- lavc/avpacket: Fix undefined behaviour, do not pass a null pointer to memcpy().
|
||||
- lavc/mjpegdec: Do not skip reading quantization tables.
|
||||
- cmdutils: fix implicit declaration of SetDllDirectory function
|
||||
|
||||
version 3.1.3:
|
||||
- examples/demuxing_decoding: convert to codecpar
|
||||
- avcodec/exr: Check tile positions
|
||||
- avcodec/aacenc: Tighter input checks
|
||||
- avformat/wtvdec: Check pointer before use
|
||||
- libavcodec/wmalosslessdec: Check the remaining bits
|
||||
- avcodec/adpcm: Fix adpcm_ima_wav padding
|
||||
- avcodec/svq3: fix slice size check
|
||||
- avcodec/diracdec: Check numx/y
|
||||
- avcodec/h2645_parse: fix nal size
|
||||
- avcodec/h2645_parse: Use get_nalsize() in ff_h2645_packet_split()
|
||||
- h2645_parse: only read avc length code at the correct position
|
||||
- h2645_parse: don't overread AnnexB NALs within an avc stream
|
||||
- avcodec/h264_parser: Factor get_avc_nalsize() out
|
||||
- avcodec/cfhd: Increase minimum band dimension to 3
|
||||
- avcodec/indeo2: check ctab
|
||||
- avformat/swfdec: Fix inflate() error code check
|
||||
- avcodec/rawdec: Fix bits_per_coded_sample checks
|
||||
- vcodec/h2645_parse: Clear buffer padding
|
||||
- avcodec/h2645: Fix NAL unit padding
|
||||
- avfilter/drawutils: Fix single plane with alpha
|
||||
- cmdutils: check for SetDllDirectory() availability
|
||||
|
||||
version 3.1.2:
|
||||
- cmdutils: remove the current working directory from the DLL search path on win32
|
||||
- avcodec/rawdec: Fix palette handling with changing palettes
|
||||
- avcodec/raw: Fix decoding of ilacetest.mov
|
||||
- avformat/mov: Enable mp3 parsing if a packet needs it
|
||||
- avformat/hls: Use an array instead of stream offset for stream mapping
|
||||
- avformat/hls: Sync starting segment across variants on live streams
|
||||
- avformat/hls: Fix regression with ranged media segments
|
||||
- avcodec/ffv1enc: Fix assertion failure with non zero bits per sample
|
||||
- avfilter/af_hdcd: small fix in af_hdcd.c where gain was not being adjusted for "attenuate slowly"
|
||||
- avformat/oggdec: Fix integer overflow with invalid pts
|
||||
- ffplay: Fix invalid array index
|
||||
- avcodec/alacenc: allocate bigger packets (cherry picked from commit 82b84c71b009884c8d041361027718b19922c76d)
|
||||
- libavcodec/dnxhd: Enable 12-bit DNxHR support.
|
||||
- lavc/vaapi_encode_h26x: Fix a crash if "." is not the decimal separator.
|
||||
- jni: Return ENOSYS on unsupported platforms
|
||||
- lavu/hwcontext_vaapi: Fix compilation if VA_FOURCC_ABGR is not defined.
|
||||
- avcodec/vp9_parser: Check the input frame sizes for being consistent
|
||||
- avformat/flvdec: parse keyframe before a\v stream was created add_keyframes_index() when stream created or keyframe parsed
|
||||
- avformat/flvdec: splitting add_keyframes_index() out from parse_keyframes_index()
|
||||
- libavformat/rtpdec_asf: zero initialize the AVIOContext struct
|
||||
- libavutil/opt: Small bugfix in example.
|
||||
- libx264: Increase x264 opts character limit to 4096
|
||||
- avcodec/h264_parser: Set sps/pps_ref
|
||||
- librtmp: Avoid an infiniloop setting connection arguments
|
||||
- avformat/oggparsevp8: fix pts calculation on pages ending with an invisible frame
|
||||
- lavc/Makefile: Fix standalone compilation of the svq3 decoder.
|
||||
- lavf/vplayerdec: Improve auto-detection.
|
||||
- lavc/mediacodecdec_h264: properly convert extradata to annex-b
|
||||
- Revert "configure: Enable GCC vectorization on ≥4.9 on x86"
|
||||
|
||||
version 3.1.1:
|
||||
- doc/APIchanges: document the lavu/lavf field moves
|
||||
- avformat/avformat: Move new field to the end of AVStream
|
||||
- avformat/utils: update deprecated AVStream->codec when the context is updated
|
||||
- avutil/frame: Move new field to the end of AVFrame
|
||||
- libavcodec/exr : fix decoding piz float file.
|
||||
- avformat/mov: Check sample size
|
||||
- lavfi: Move new field to the end of AVFilterContext
|
||||
- lavfi: Move new field to the end of AVFilterLink
|
||||
- ffplay: Fix usage of private lavfi API
|
||||
- lavc/mediacodecdec_h264: add missing NAL headers to SPS/PPS buffers
|
||||
- lavc/pnm_parser: disable parsing for text based PNMs
|
||||
|
||||
|
||||
version 3.1:
|
||||
@@ -48,6 +158,8 @@ version 3.1:
|
||||
- CUDA CUVID H264/HEVC decoder
|
||||
- 10-bit depth support in native utvideo decoder
|
||||
- libutvideo wrapper removed
|
||||
- YUY2 Lossless Codec decoder
|
||||
- VideoToolbox H.264 encoder
|
||||
|
||||
|
||||
version 3.0:
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
|
||||
┌────────────────────────────────────────┐
|
||||
│ RELEASE NOTES for FFmpeg 3.1 "Laplace" │
|
||||
└────────────────────────────────────────┘
|
||||
|
||||
The FFmpeg Project proudly presents FFmpeg 3.1 "Laplace", about 4
|
||||
months after the release of FFmpeg 3.0.
|
||||
|
||||
A complete Changelog is available at the root of the project, and the
|
||||
complete Git history on http://source.ffmpeg.org.
|
||||
|
||||
We hope you will like this release as much as we enjoyed working on it, and
|
||||
as usual, if you have any questions about it, or any FFmpeg related topic,
|
||||
feel free to join us on the #ffmpeg IRC channel (on irc.freenode.net) or ask
|
||||
on the mailing-lists.
|
||||
+14
-2
@@ -61,6 +61,9 @@
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
#endif
|
||||
#if HAVE_SETDLLDIRECTORY
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
static int init_report(const char *env);
|
||||
|
||||
@@ -107,6 +110,15 @@ static void log_callback_report(void *ptr, int level, const char *fmt, va_list v
|
||||
}
|
||||
}
|
||||
|
||||
void init_dynload(void)
|
||||
{
|
||||
#if HAVE_SETDLLDIRECTORY
|
||||
/* Calling SetDllDirectory with the empty string (but not NULL) removes the
|
||||
* current working directory from the DLL search path as a security pre-caution. */
|
||||
SetDllDirectory("");
|
||||
#endif
|
||||
}
|
||||
|
||||
static void (*program_exit)(int ret);
|
||||
|
||||
void register_exit(void (*cb)(int ret))
|
||||
@@ -2099,7 +2111,7 @@ static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts)
|
||||
if (!fmt || !fmt->priv_class || !AV_IS_INPUT_DEVICE(fmt->priv_class->category))
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
printf("Audo-detected sources for %s:\n", fmt->name);
|
||||
printf("Auto-detected sources for %s:\n", fmt->name);
|
||||
if (!fmt->get_device_list) {
|
||||
ret = AVERROR(ENOSYS);
|
||||
printf("Cannot list sources. Not implemented.\n");
|
||||
@@ -2129,7 +2141,7 @@ static int print_device_sinks(AVOutputFormat *fmt, AVDictionary *opts)
|
||||
if (!fmt || !fmt->priv_class || !AV_IS_OUTPUT_DEVICE(fmt->priv_class->category))
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
printf("Audo-detected sinks for %s:\n", fmt->name);
|
||||
printf("Auto-detected sinks for %s:\n", fmt->name);
|
||||
if (!fmt->get_device_list) {
|
||||
ret = AVERROR(ENOSYS);
|
||||
printf("Cannot list sinks. Not implemented.\n");
|
||||
|
||||
+7
-2
@@ -61,6 +61,11 @@ void register_exit(void (*cb)(int ret));
|
||||
*/
|
||||
void exit_program(int ret) av_noreturn;
|
||||
|
||||
/**
|
||||
* Initialize dynamic library loading
|
||||
*/
|
||||
void init_dynload(void);
|
||||
|
||||
/**
|
||||
* Initialize the cmdutils option system, in particular
|
||||
* allocate the *_opts contexts.
|
||||
@@ -445,13 +450,13 @@ int show_devices(void *optctx, const char *opt, const char *arg);
|
||||
|
||||
#if CONFIG_AVDEVICE
|
||||
/**
|
||||
* Print a listing containing audodetected sinks of the output device.
|
||||
* Print a listing containing autodetected sinks of the output device.
|
||||
* Device name with options may be passed as an argument to limit results.
|
||||
*/
|
||||
int show_sinks(void *optctx, const char *opt, const char *arg);
|
||||
|
||||
/**
|
||||
* Print a listing containing audodetected sources of the input device.
|
||||
* Print a listing containing autodetected sources of the input device.
|
||||
* Device name with options may be passed as an argument to limit results.
|
||||
*/
|
||||
int show_sources(void *optctx, const char *opt, const char *arg);
|
||||
|
||||
@@ -1935,6 +1935,7 @@ SYSTEM_FUNCS="
|
||||
sched_getaffinity
|
||||
SetConsoleTextAttribute
|
||||
SetConsoleCtrlHandler
|
||||
SetDllDirectory
|
||||
setmode
|
||||
setrlimit
|
||||
Sleep
|
||||
@@ -4335,7 +4336,7 @@ elif enabled mips; then
|
||||
enable mips32r2
|
||||
disable msa
|
||||
;;
|
||||
p5600|i6400)
|
||||
p5600|i6400|p6600)
|
||||
disable mipsdsp
|
||||
disable mipsdspr2
|
||||
;;
|
||||
@@ -4400,6 +4401,10 @@ elif enabled mips; then
|
||||
enable mips64r6
|
||||
check_cflags "-mtune=i6400 -mabi=64" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
|
||||
;;
|
||||
p6600)
|
||||
enable mips64r6
|
||||
check_cflags "-mtune=p6600 -mabi=64" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
# We do not disable anything. Is up to the user to disable the unwanted features.
|
||||
@@ -4529,7 +4534,7 @@ fi
|
||||
|
||||
add_cppflags -D_ISOC99_SOURCE
|
||||
add_cxxflags -D__STDC_CONSTANT_MACROS
|
||||
add_cxxflags -std=c++11
|
||||
add_cxxflags -std=c++98
|
||||
check_cflags -std=c99
|
||||
check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
|
||||
#include <stdlib.h>
|
||||
@@ -5475,6 +5480,7 @@ check_func_headers windows.h MapViewOfFile
|
||||
check_func_headers windows.h PeekNamedPipe
|
||||
check_func_headers windows.h SetConsoleTextAttribute
|
||||
check_func_headers windows.h SetConsoleCtrlHandler
|
||||
check_func_headers windows.h SetDllDirectory
|
||||
check_func_headers windows.h Sleep
|
||||
check_func_headers windows.h VirtualAlloc
|
||||
check_struct windows.h "CONDITION_VARIABLE" Ptr
|
||||
@@ -5669,10 +5675,11 @@ enabled libopencv && { check_header opencv2/core/core_c.h &&
|
||||
require opencv opencv2/core/core_c.h cvCreateImageHeader -lopencv_core -lopencv_imgproc; } ||
|
||||
require_pkg_config opencv opencv/cxcore.h cvCreateImageHeader; }
|
||||
enabled libopenh264 && require_pkg_config openh264 wels/codec_api.h WelsGetCodecVersion
|
||||
enabled libopenjpeg && { check_lib openjpeg-2.1/openjpeg.h opj_version -lopenjp2 -DOPJ_STATIC ||
|
||||
check_lib openjpeg-2.0/openjpeg.h opj_version -lopenjp2 -DOPJ_STATIC ||
|
||||
check_lib openjpeg-1.5/openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC ||
|
||||
check_lib openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC ||
|
||||
enabled libopenjpeg && { { check_lib2 openjpeg-2.1/openjpeg.h opj_version -lopenjp2 -DOPJ_STATIC && add_cppflags -DOPJ_STATIC; } ||
|
||||
check_lib2 openjpeg-2.1/openjpeg.h opj_version -lopenjp2 ||
|
||||
{ check_lib2 openjpeg-2.0/openjpeg.h opj_version -lopenjp2 -DOPJ_STATIC && add_cppflags -DOPJ_STATIC; } ||
|
||||
{ check_lib2 openjpeg-1.5/openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC && add_cppflags -DOPJ_STATIC; } ||
|
||||
{ check_lib2 openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC && add_cppflags -DOPJ_STATIC; } ||
|
||||
die "ERROR: libopenjpeg not found"; }
|
||||
enabled libopus && require_pkg_config opus opus_multistream.h opus_multistream_decoder_create
|
||||
enabled libpulse && require_pkg_config libpulse pulse/pulseaudio.h pa_context_new
|
||||
@@ -6125,11 +6132,7 @@ elif enabled ccc; then
|
||||
add_cflags -msg_disable nonstandcast
|
||||
add_cflags -msg_disable unsupieee
|
||||
elif enabled gcc; then
|
||||
case $gcc_basever in
|
||||
4.9*) enabled x86 || check_optflags -fno-tree-vectorize ;;
|
||||
4.*) check_optflags -fno-tree-vectorize ;;
|
||||
*) enabled x86 || check_optflags -fno-tree-vectorize ;;
|
||||
esac
|
||||
check_optflags -fno-tree-vectorize
|
||||
check_cflags -Werror=format-security
|
||||
check_cflags -Werror=implicit-function-declaration
|
||||
check_cflags -Werror=missing-prototypes
|
||||
|
||||
+20
-4
@@ -15,14 +15,30 @@ libavutil: 2015-08-28
|
||||
|
||||
API changes, most recent first:
|
||||
|
||||
2016-06-26 - xxxxxxx / 1c9e861 - lavu 55.27.100 / 55.13.0 - hwcontext.h
|
||||
Add av_hwdevice_ctx_create().
|
||||
2016-06-30 - c1c7e0ab - lavf 57.41.100 - avformat.h
|
||||
Moved codecpar field from AVStream to the end of the struct, so that
|
||||
the following private fields are in the same location as in FFmpeg 3.0 (lavf 57.25.100).
|
||||
|
||||
2016-06-26 - xxxxxxx / e47b8bb - lavc 57.48.101 / 57.19.1 - avcodec.h
|
||||
Adjust values for JPEG 2000 profiles.
|
||||
2016-06-30 - 042fb69d - lavu 55.28.100 - frame.h
|
||||
Moved hw_frames_ctx field from AVFrame to the end of the struct, so that
|
||||
the following private fields are in the same location as in FFmpeg 3.0 (lavu 55.17.103).
|
||||
|
||||
2016-06-29 - 1a751455 - lavfi 6.47.100 - avfilter.h
|
||||
Fix accidental ABI breakage in AVFilterContext.
|
||||
ABI was broken in 8688d3a, lavfi 6.42.100 and released as ffmpeg 3.1.
|
||||
|
||||
Because of this, ffmpeg and ffplay built against lavfi>=6.42.100 will not be
|
||||
compatible with lavfi>=6.47.100. Potentially also affects other users of
|
||||
libavfilter if they are using one of the affected fields.
|
||||
|
||||
-------- 8< --------- FFmpeg 3.1 was cut here -------- 8< ---------
|
||||
|
||||
2016-06-26 - 481f320 / 1c9e861 - lavu 55.27.100 / 55.13.0 - hwcontext.h
|
||||
Add av_hwdevice_ctx_create().
|
||||
|
||||
2016-06-26 - b95534b / e47b8bb - lavc 57.48.101 / 57.19.1 - avcodec.h
|
||||
Adjust values for JPEG 2000 profiles.
|
||||
|
||||
2016-06-23 - 5d75e46 / db7968b - lavf 57.40.100 / 57.7.0 - avio.h
|
||||
Add AVIODataMarkerType, write_data_type, ignore_boundary_point and
|
||||
avio_write_marker.
|
||||
|
||||
+1
-1
@@ -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 = 3.1.5
|
||||
|
||||
# With the PROJECT_LOGO tag one can specify a logo or icon that is included
|
||||
# in the documentation. The maximum height of the logo should not exceed 55
|
||||
|
||||
+1
-1
@@ -1173,7 +1173,7 @@ Set to 1 to disable processing alpha (transparency). This works like the
|
||||
instead of alpha. Default is 0.
|
||||
|
||||
@item codec_whitelist @var{list} (@emph{input})
|
||||
"," separated List of allowed decoders. By default all are allowed.
|
||||
"," separated list of allowed decoders. By default all are allowed.
|
||||
|
||||
@item dump_separator @var{string} (@emph{input})
|
||||
Separator used to separate the fields printed on the command line about the
|
||||
|
||||
+2
-2
@@ -72,7 +72,7 @@ Do not try to resynchronize by looking for a certain optional start code.
|
||||
Virtual concatenation script demuxer.
|
||||
|
||||
This demuxer reads a list of files and other directives from a text file and
|
||||
demuxes them one after the other, as if all their packet had been muxed
|
||||
demuxes them one after the other, as if all their packets had been muxed
|
||||
together.
|
||||
|
||||
The timestamps in the files are adjusted so that the first file starts at 0
|
||||
@@ -107,7 +107,7 @@ Identify the script type and version. It also sets the @option{safe} option
|
||||
to 1 if it was -1.
|
||||
|
||||
To make FFmpeg recognize the format automatically, this directive must
|
||||
appears exactly as is (no extra space or byte-order-mark) on the very first
|
||||
appear exactly as is (no extra space or byte-order-mark) on the very first
|
||||
line of the script.
|
||||
|
||||
@item @code{duration @var{dur}}
|
||||
|
||||
@@ -93,10 +93,9 @@ static int decode_packet(int *got_frame, int cached)
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("video_frame%s n:%d coded_n:%d pts:%s\n",
|
||||
printf("video_frame%s n:%d coded_n:%d\n",
|
||||
cached ? "(cached)" : "",
|
||||
video_frame_count++, frame->coded_picture_number,
|
||||
av_ts2timestr(frame->pts, &video_dec_ctx->time_base));
|
||||
video_frame_count++, frame->coded_picture_number);
|
||||
|
||||
/* copy decoded frame to destination buffer:
|
||||
* this is required since rawvideo expects non aligned data */
|
||||
@@ -148,11 +147,10 @@ static int decode_packet(int *got_frame, int cached)
|
||||
}
|
||||
|
||||
static int open_codec_context(int *stream_idx,
|
||||
AVFormatContext *fmt_ctx, enum AVMediaType type)
|
||||
AVCodecContext **dec_ctx, AVFormatContext *fmt_ctx, enum AVMediaType type)
|
||||
{
|
||||
int ret, stream_index;
|
||||
AVStream *st;
|
||||
AVCodecContext *dec_ctx = NULL;
|
||||
AVCodec *dec = NULL;
|
||||
AVDictionary *opts = NULL;
|
||||
|
||||
@@ -166,17 +164,31 @@ static int open_codec_context(int *stream_idx,
|
||||
st = fmt_ctx->streams[stream_index];
|
||||
|
||||
/* find decoder for the stream */
|
||||
dec_ctx = st->codec;
|
||||
dec = avcodec_find_decoder(dec_ctx->codec_id);
|
||||
dec = avcodec_find_decoder(st->codecpar->codec_id);
|
||||
if (!dec) {
|
||||
fprintf(stderr, "Failed to find %s codec\n",
|
||||
av_get_media_type_string(type));
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
/* Allocate a codec context for the decoder */
|
||||
*dec_ctx = avcodec_alloc_context3(dec);
|
||||
if (!*dec_ctx) {
|
||||
fprintf(stderr, "Failed to allocate the %s codec context\n",
|
||||
av_get_media_type_string(type));
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
/* Copy codec parameters from input stream to output codec context */
|
||||
if ((ret = avcodec_parameters_to_context(*dec_ctx, st->codecpar)) < 0) {
|
||||
fprintf(stderr, "Failed to copy %s codec parameters to decoder context\n",
|
||||
av_get_media_type_string(type));
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Init the decoders, with or without reference counting */
|
||||
av_dict_set(&opts, "refcounted_frames", refcount ? "1" : "0", 0);
|
||||
if ((ret = avcodec_open2(dec_ctx, dec, &opts)) < 0) {
|
||||
if ((ret = avcodec_open2(*dec_ctx, dec, &opts)) < 0) {
|
||||
fprintf(stderr, "Failed to open %s codec\n",
|
||||
av_get_media_type_string(type));
|
||||
return ret;
|
||||
@@ -255,9 +267,8 @@ int main (int argc, char **argv)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (open_codec_context(&video_stream_idx, fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0) {
|
||||
if (open_codec_context(&video_stream_idx, &video_dec_ctx, fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0) {
|
||||
video_stream = fmt_ctx->streams[video_stream_idx];
|
||||
video_dec_ctx = video_stream->codec;
|
||||
|
||||
video_dst_file = fopen(video_dst_filename, "wb");
|
||||
if (!video_dst_file) {
|
||||
@@ -279,9 +290,8 @@ int main (int argc, char **argv)
|
||||
video_dst_bufsize = ret;
|
||||
}
|
||||
|
||||
if (open_codec_context(&audio_stream_idx, fmt_ctx, AVMEDIA_TYPE_AUDIO) >= 0) {
|
||||
if (open_codec_context(&audio_stream_idx, &audio_dec_ctx, fmt_ctx, AVMEDIA_TYPE_AUDIO) >= 0) {
|
||||
audio_stream = fmt_ctx->streams[audio_stream_idx];
|
||||
audio_dec_ctx = audio_stream->codec;
|
||||
audio_dst_file = fopen(audio_dst_filename, "wb");
|
||||
if (!audio_dst_file) {
|
||||
fprintf(stderr, "Could not open destination file %s\n", audio_dst_filename);
|
||||
@@ -369,8 +379,8 @@ int main (int argc, char **argv)
|
||||
}
|
||||
|
||||
end:
|
||||
avcodec_close(video_dec_ctx);
|
||||
avcodec_close(audio_dec_ctx);
|
||||
avcodec_free_context(&video_dec_ctx);
|
||||
avcodec_free_context(&audio_dec_ctx);
|
||||
avformat_close_input(&fmt_ctx);
|
||||
if (video_dst_file)
|
||||
fclose(video_dst_file);
|
||||
|
||||
+1
-1
@@ -1008,7 +1008,7 @@ Dump each input packet to stderr.
|
||||
@item -hex (@emph{global})
|
||||
When dumping packets, also dump the payload.
|
||||
@item -re (@emph{input})
|
||||
Read input at native frame rate. Mainly used to simulate a grab device.
|
||||
Read input at native frame rate. Mainly used to simulate a grab device,
|
||||
or live input stream (e.g. when reading from a file). Should not be used
|
||||
with actual grab devices or live input streams (where it can cause packet
|
||||
loss).
|
||||
|
||||
@@ -176,10 +176,10 @@ loglevel will be used. If multiple loglevel parameters are given, using
|
||||
Show nothing at all; be silent.
|
||||
@item panic, 0
|
||||
Only show fatal errors which could lead the process to crash, such as
|
||||
and assert failure. This is not currently used for anything.
|
||||
an assertion failure. This is not currently used for anything.
|
||||
@item fatal, 8
|
||||
Only show fatal errors. These are errors after which the process absolutely
|
||||
cannot continue after.
|
||||
cannot continue.
|
||||
@item error, 16
|
||||
Show all errors, including ones which can be recovered from.
|
||||
@item warning, 24
|
||||
@@ -195,13 +195,13 @@ Show everything, including debugging information.
|
||||
@item trace, 56
|
||||
@end table
|
||||
|
||||
By default the program logs to stderr, if coloring is supported by the
|
||||
By default the program logs to stderr. If coloring is supported by the
|
||||
terminal, colors are used to mark errors and warnings. Log coloring
|
||||
can be disabled setting the environment variable
|
||||
@env{AV_LOG_FORCE_NOCOLOR} or @env{NO_COLOR}, or can be forced setting
|
||||
the environment variable @env{AV_LOG_FORCE_COLOR}.
|
||||
The use of the environment variable @env{NO_COLOR} is deprecated and
|
||||
will be dropped in a following FFmpeg version.
|
||||
will be dropped in a future FFmpeg version.
|
||||
|
||||
@item -report
|
||||
Dump full command line and console output to a file named
|
||||
|
||||
+21
-21
@@ -845,14 +845,14 @@ A gate is mainly used to reduce lower parts of a signal. This kind of signal
|
||||
processing reduces disturbing noise between useful signals.
|
||||
|
||||
Gating is done by detecting the volume below a chosen level @var{threshold}
|
||||
and divide it by the factor set with @var{ratio}. The bottom of the noise
|
||||
and dividing it by the factor set with @var{ratio}. The bottom of the noise
|
||||
floor is set via @var{range}. Because an exact manipulation of the signal
|
||||
would cause distortion of the waveform the reduction can be levelled over
|
||||
time. This is done by setting @var{attack} and @var{release}.
|
||||
|
||||
@var{attack} determines how long the signal has to fall below the threshold
|
||||
before any reduction will occur and @var{release} sets the time the signal
|
||||
has to raise above the threshold to reduce the reduction again.
|
||||
has to rise above the threshold to reduce the reduction again.
|
||||
Shorter signals than the chosen attack time will be left untouched.
|
||||
|
||||
@table @option
|
||||
@@ -869,7 +869,7 @@ If a signal rises above this level the gain reduction is released.
|
||||
Default is 0.125. Allowed range is from 0 to 1.
|
||||
|
||||
@item ratio
|
||||
Set a ratio about which the signal is reduced.
|
||||
Set a ratio by which the signal is reduced.
|
||||
Default is 2. Allowed range is from 1 to 9000.
|
||||
|
||||
@item attack
|
||||
@@ -892,19 +892,19 @@ Default is 2.828427125. Allowed range is from 1 to 8.
|
||||
|
||||
@item detection
|
||||
Choose if exact signal should be taken for detection or an RMS like one.
|
||||
Default is rms. Can be peak or rms.
|
||||
Default is @code{rms}. Can be @code{peak} or @code{rms}.
|
||||
|
||||
@item link
|
||||
Choose if the average level between all channels or the louder channel affects
|
||||
the reduction.
|
||||
Default is average. Can be average or maximum.
|
||||
Default is @code{average}. Can be @code{average} or @code{maximum}.
|
||||
@end table
|
||||
|
||||
@section alimiter
|
||||
|
||||
The limiter prevents input signal from raising over a desired threshold.
|
||||
The limiter prevents an input signal from rising over a desired threshold.
|
||||
This limiter uses lookahead technology to prevent your signal from distorting.
|
||||
It means that there is a small delay after signal is processed. Keep in mind
|
||||
It means that there is a small delay after the signal is processed. Keep in mind
|
||||
that the delay it produces is the attack time you set.
|
||||
|
||||
The filter accepts the following options:
|
||||
@@ -1353,7 +1353,7 @@ Set the number of samples per each output audio frame.
|
||||
|
||||
The last output packet may contain a different number of samples, as
|
||||
the filter will flush all the remaining samples when the input audio
|
||||
signal its end.
|
||||
signals its end.
|
||||
|
||||
The filter accepts the following options:
|
||||
|
||||
@@ -2445,7 +2445,7 @@ filtering with large delay. Default is disabled.
|
||||
Enable multichannels evaluation on gain. Default is disabled.
|
||||
|
||||
@item zero_phase
|
||||
Enable zero phase mode by substracting timestamp to compensate delay.
|
||||
Enable zero phase mode by subtracting timestamp to compensate delay.
|
||||
Default is disabled.
|
||||
@end table
|
||||
|
||||
@@ -3216,7 +3216,7 @@ Can be specified in dB (in case "dB" is appended to the specified value)
|
||||
or amplitude ratio. Default value is @code{0}.
|
||||
|
||||
@item leave_silence
|
||||
This indicate that @var{stop_duration} length of audio should be left intact
|
||||
This indicates that @var{stop_duration} length of audio should be left intact
|
||||
at the beginning of each period of silence.
|
||||
For example, if you want to remove long pauses between words but do not want
|
||||
to remove the pauses completely. Default value is @code{0}.
|
||||
@@ -6622,10 +6622,10 @@ This option does not exist, please see the timeline system
|
||||
|
||||
@item alpha
|
||||
Draw the text applying alpha blending. The value can
|
||||
be either a number between 0.0 and 1.0
|
||||
The expression accepts the same variables @var{x, y} do.
|
||||
be a number between 0.0 and 1.0.
|
||||
The expression accepts the same variables @var{x, y} as well.
|
||||
The default value is 1.
|
||||
Please see fontcolor_expr
|
||||
Please see @var{fontcolor_expr}.
|
||||
|
||||
@item fontsize
|
||||
The font size to be used for drawing text.
|
||||
@@ -6808,7 +6808,7 @@ the following expansion mechanism is used.
|
||||
The backslash character @samp{\}, followed by any character, always expands to
|
||||
the second character.
|
||||
|
||||
Sequence of the form @code{%@{...@}} are expanded. The text between the
|
||||
Sequences of the form @code{%@{...@}} are expanded. The text between the
|
||||
braces is a function name, possibly followed by arguments separated by ':'.
|
||||
If the arguments contain special characters or delimiters (':' or '@}'),
|
||||
they should be escaped.
|
||||
@@ -8714,8 +8714,8 @@ value.
|
||||
|
||||
Detect video interlacing type.
|
||||
|
||||
This filter tries to detect if the input frames as interlaced, progressive,
|
||||
top or bottom field first. It will also try and detect fields that are
|
||||
This filter tries to detect if the input frames are interlaced, progressive,
|
||||
top or bottom field first. It will also try to detect fields that are
|
||||
repeated between adjacent frames (a sign of telecine).
|
||||
|
||||
Single frame detection considers only immediately adjacent frames when classifying each frame.
|
||||
@@ -8782,7 +8782,7 @@ Set progressive threshold.
|
||||
Threshold for repeated field detection.
|
||||
@item half_life
|
||||
Number of frames after which a given frame's contribution to the
|
||||
statistics is halved (i.e., it contributes only 0.5 to it's
|
||||
statistics is halved (i.e., it contributes only 0.5 to its
|
||||
classification). The default of 0 means that all frames seen are given
|
||||
full weight of 1.0 forever.
|
||||
@item analyze_interlaced_flag
|
||||
@@ -14281,7 +14281,7 @@ syntax is deprecated:
|
||||
Create a pattern generated by an elementary cellular automaton.
|
||||
|
||||
The initial state of the cellular automaton can be defined through the
|
||||
@option{filename}, and @option{pattern} options. If such options are
|
||||
@option{filename} and @option{pattern} options. If such options are
|
||||
not specified an initial state is created randomly.
|
||||
|
||||
At each new frame a new row in the video is filled with the result of
|
||||
@@ -15324,7 +15324,7 @@ Temporally interleave frames from several inputs.
|
||||
These filters read frames from several inputs and send the oldest
|
||||
queued frame to the output.
|
||||
|
||||
Input streams must have a well defined, monotonically increasing frame
|
||||
Input streams must have well defined, monotonically increasing frame
|
||||
timestamp values.
|
||||
|
||||
In order to submit one frame to output, these filters need to enqueue
|
||||
@@ -15332,9 +15332,9 @@ at least one frame for each input, so they cannot work in case one
|
||||
input is not yet terminated and will not receive incoming frames.
|
||||
|
||||
For example consider the case when one input is a @code{select} filter
|
||||
which always drop input frames. The @code{interleave} filter will keep
|
||||
which always drops input frames. The @code{interleave} filter will keep
|
||||
reading from that input, but it will never be able to send new frames
|
||||
to output until the input will send an end-of-stream signal.
|
||||
to output until the input sends an end-of-stream signal.
|
||||
|
||||
Also, depending on inputs synchronization, the filters will drop
|
||||
frames in case one input receives more frames than the other ones, and
|
||||
|
||||
+1
-1
@@ -195,7 +195,7 @@ delayed bt the time duration specified in @var{offset}. Default value
|
||||
is @code{0} (meaning that no offset is applied).
|
||||
|
||||
@item format_whitelist @var{list} (@emph{input})
|
||||
"," separated List of allowed demuxers. By default all are allowed.
|
||||
"," separated list of allowed demuxers. By default all are allowed.
|
||||
|
||||
@item dump_separator @var{string} (@emph{input})
|
||||
Separator used to separate the fields printed on the command line about the
|
||||
|
||||
+2
-2
@@ -656,7 +656,7 @@ is an exact value. For HDV, it is not frame exact, since HDV does
|
||||
not have a fixed frame size.
|
||||
|
||||
@item dvguid
|
||||
Select the capture device by specifying it's GUID. Capturing will only
|
||||
Select the capture device by specifying its GUID. Capturing will only
|
||||
be performed from the specified device and fails if no device with the
|
||||
given GUID is found. This is useful to select the input if multiple
|
||||
devices are connected at the same time.
|
||||
@@ -1319,7 +1319,7 @@ ffmpeg -f x11grab -framerate 25 -video_size cif -i :0.0+10,20 out.mpg
|
||||
|
||||
@table @option
|
||||
@item draw_mouse
|
||||
Specify whether to draw the mouse pointer. A value of @code{0} specify
|
||||
Specify whether to draw the mouse pointer. A value of @code{0} specifies
|
||||
not to draw the pointer. Default value is @code{1}.
|
||||
|
||||
@item follow_mouse
|
||||
|
||||
+3
-3
@@ -274,14 +274,14 @@ the loops:
|
||||
ffmpeg -i INPUT -loop 10 -final_delay 500 out.gif
|
||||
@end example
|
||||
|
||||
Note 1: if you wish to extract the frames in separate GIF files, you need to
|
||||
Note 1: if you wish to extract the frames into separate GIF files, you need to
|
||||
force the @ref{image2} muxer:
|
||||
@example
|
||||
ffmpeg -i INPUT -c:v gif -f image2 "out%d.gif"
|
||||
@end example
|
||||
|
||||
Note 2: the GIF format has a very small time base: the delay between two frames
|
||||
can not be smaller than one centi second.
|
||||
Note 2: the GIF format has a very large time base: the delay between two frames
|
||||
can therefore not be smaller than one centi second.
|
||||
|
||||
@anchor{hash}
|
||||
@section hash
|
||||
|
||||
+1
-1
@@ -173,7 +173,7 @@ earlier, place @code{c99wrap.exe} and @code{c99conv.exe} somewhere in your
|
||||
Next, make sure any other headers and libs you want to use, such as zlib, are
|
||||
located in a spot that the compiler can see. Do so by modifying the @code{LIB}
|
||||
and @code{INCLUDE} environment variables to include the @strong{Windows-style}
|
||||
paths to these directories. Alternatively, you can try and use the
|
||||
paths to these directories. Alternatively, you can try to use the
|
||||
@code{--extra-cflags}/@code{--extra-ldflags} configure options. If using MSVC
|
||||
2012 or earlier, place @code{inttypes.h} somewhere the compiler can see too.
|
||||
|
||||
|
||||
+1
-1
@@ -355,7 +355,7 @@ autodetection in the future.
|
||||
If set to 1 enables experimental HTTP server. This can be used to send data when
|
||||
used as an output option, or read data from a client with HTTP POST when used as
|
||||
an input option.
|
||||
If set to 2 enables experimental mutli-client HTTP server. This is not yet implemented
|
||||
If set to 2 enables experimental multi-client HTTP server. This is not yet implemented
|
||||
in ffmpeg.c or ffserver.c and thus must not be used as a command line option.
|
||||
@example
|
||||
# Server side (sending):
|
||||
|
||||
@@ -2026,12 +2026,7 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||
}
|
||||
}
|
||||
|
||||
/* if the decoder provides a pts, use it instead of the last packet pts.
|
||||
the decoder could be delaying output by a packet or more. */
|
||||
if (decoded_frame->pts != AV_NOPTS_VALUE) {
|
||||
ist->dts = ist->next_dts = ist->pts = ist->next_pts = av_rescale_q(decoded_frame->pts, avctx->time_base, AV_TIME_BASE_Q);
|
||||
decoded_frame_tb = avctx->time_base;
|
||||
} else if (decoded_frame->pkt_pts != AV_NOPTS_VALUE) {
|
||||
if (decoded_frame->pkt_pts != AV_NOPTS_VALUE) {
|
||||
decoded_frame->pts = decoded_frame->pkt_pts;
|
||||
decoded_frame_tb = ist->st->time_base;
|
||||
} else if (pkt->pts != AV_NOPTS_VALUE) {
|
||||
@@ -4303,6 +4298,8 @@ int main(int argc, char **argv)
|
||||
int ret;
|
||||
int64_t ti;
|
||||
|
||||
init_dynload();
|
||||
|
||||
register_exit(ffmpeg_cleanup);
|
||||
|
||||
setvbuf(stderr,NULL,_IONBF,0); /* win32 runtime needs this */
|
||||
|
||||
@@ -2725,7 +2725,7 @@ static int stream_component_open(VideoState *is, int stream_index)
|
||||
goto fail;
|
||||
link = is->out_audio_filter->inputs[0];
|
||||
sample_rate = link->sample_rate;
|
||||
nb_channels = link->channels;
|
||||
nb_channels = avfilter_link_get_channels(link);
|
||||
channel_layout = link->channel_layout;
|
||||
}
|
||||
#else
|
||||
@@ -2936,7 +2936,7 @@ static int read_thread(void *arg)
|
||||
AVStream *st = ic->streams[i];
|
||||
enum AVMediaType type = st->codecpar->codec_type;
|
||||
st->discard = AVDISCARD_ALL;
|
||||
if (wanted_stream_spec[type] && st_index[type] == -1)
|
||||
if (type >= 0 && wanted_stream_spec[type] && st_index[type] == -1)
|
||||
if (avformat_match_stream_specifier(ic, st, wanted_stream_spec[type]) > 0)
|
||||
st_index[type] = i;
|
||||
}
|
||||
@@ -3776,6 +3776,8 @@ int main(int argc, char **argv)
|
||||
char dummy_videodriver[] = "SDL_VIDEODRIVER=dummy";
|
||||
char alsa_bufsize[] = "SDL_AUDIO_ALSA_SET_BUFFER_SIZE=1";
|
||||
|
||||
init_dynload();
|
||||
|
||||
av_log_set_flags(AV_LOG_SKIP_REPEATED);
|
||||
parse_loglevel(argc, argv, options);
|
||||
|
||||
|
||||
@@ -3241,6 +3241,8 @@ int main(int argc, char **argv)
|
||||
char *w_name = NULL, *w_args = NULL;
|
||||
int ret, i;
|
||||
|
||||
init_dynload();
|
||||
|
||||
av_log_set_flags(AV_LOG_SKIP_REPEATED);
|
||||
register_exit(ffprobe_cleanup);
|
||||
|
||||
|
||||
@@ -3980,6 +3980,7 @@ int main(int argc, char **argv)
|
||||
int cfg_parsed;
|
||||
int ret = EXIT_FAILURE;
|
||||
|
||||
init_dynload();
|
||||
|
||||
config.filename = av_strdup("/etc/ffserver.conf");
|
||||
|
||||
|
||||
+2
-1
@@ -528,7 +528,8 @@ OBJS-$(CONFIG_SUNRAST_ENCODER) += sunrastenc.o
|
||||
OBJS-$(CONFIG_SVQ1_DECODER) += svq1dec.o svq1.o svq13.o h263data.o
|
||||
OBJS-$(CONFIG_SVQ1_ENCODER) += svq1enc.o svq1.o h263data.o \
|
||||
h263.o ituh263enc.o
|
||||
OBJS-$(CONFIG_SVQ3_DECODER) += svq3.o svq13.o mpegutils.o h264_parse.o h264data.o
|
||||
OBJS-$(CONFIG_SVQ3_DECODER) += svq3.o svq13.o mpegutils.o \
|
||||
h264_parse.o h264data.o h264_ps.o h2645_parse.o
|
||||
OBJS-$(CONFIG_TEXT_DECODER) += textdec.o ass.o
|
||||
OBJS-$(CONFIG_TEXT_ENCODER) += srtenc.o ass_split.o
|
||||
OBJS-$(CONFIG_TAK_DECODER) += takdec.o tak.o takdsp.o
|
||||
|
||||
+2
-2
@@ -622,8 +622,8 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
|
||||
}
|
||||
|
||||
for (k = 0; k < 1024; k++) {
|
||||
if (!isfinite(cpe->ch[ch].coeffs[k])) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Input contains NaN/+-Inf\n");
|
||||
if (!(fabs(cpe->ch[ch].coeffs[k]) < 1E16)) { // Ensure headroom for energy calculation
|
||||
av_log(avctx, AV_LOG_ERROR, "Input contains (near) NaN/+-Inf\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -803,7 +803,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
|
||||
if (avctx->bits_per_coded_sample != 4) {
|
||||
int samples_per_block = ff_adpcm_ima_block_samples[avctx->bits_per_coded_sample - 2];
|
||||
int block_size = ff_adpcm_ima_block_sizes[avctx->bits_per_coded_sample - 2];
|
||||
uint8_t temp[20] = { 0 };
|
||||
uint8_t temp[20 + AV_INPUT_BUFFER_PADDING_SIZE] = { 0 };
|
||||
GetBitContext g;
|
||||
|
||||
for (n = 0; n < (nb_samples - 1) / samples_per_block; n++) {
|
||||
|
||||
@@ -623,7 +623,7 @@ static int alac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
|
||||
else
|
||||
max_frame_size = s->max_coded_frame_size;
|
||||
|
||||
if ((ret = ff_alloc_packet2(avctx, avpkt, 2 * max_frame_size, 0)) < 0)
|
||||
if ((ret = ff_alloc_packet2(avctx, avpkt, 4 * max_frame_size, 0)) < 0)
|
||||
return ret;
|
||||
|
||||
/* use verbatim mode for compression_level 0 */
|
||||
|
||||
@@ -94,6 +94,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
||||
int ret = ff_set_dimensions(avctx, 80 << 3, 25 << 4);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
} else if (avctx->width % FONT_WIDTH || avctx->height % s->font_height) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Invalid dimensions %d %d\n", avctx->width, avctx->height);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
+1
-1
@@ -61,7 +61,7 @@ static inline void asv2_put_level(ASV1Context *a, PutBitContext *pb, int level)
|
||||
} else {
|
||||
put_bits(pb, ff_asv2_level_tab[31][1], ff_asv2_level_tab[31][0]);
|
||||
if (level < -128 || level > 127) {
|
||||
av_log(a->avctx, AV_LOG_WARNING, "Cliping level %d, increase qscale\n", level);
|
||||
av_log(a->avctx, AV_LOG_WARNING, "Clipping level %d, increase qscale\n", level);
|
||||
level = av_clip_int8(level);
|
||||
}
|
||||
asv2_put_bits(pb, 8, level & 0xFF);
|
||||
|
||||
@@ -139,7 +139,8 @@ int av_grow_packet(AVPacket *pkt, int grow_by)
|
||||
pkt->buf = av_buffer_alloc(new_size);
|
||||
if (!pkt->buf)
|
||||
return AVERROR(ENOMEM);
|
||||
memcpy(pkt->buf->data, pkt->data, pkt->size);
|
||||
if (pkt->size > 0)
|
||||
memcpy(pkt->buf->data, pkt->data, pkt->size);
|
||||
pkt->data = pkt->buf->data;
|
||||
}
|
||||
pkt->size += grow_by;
|
||||
@@ -198,6 +199,7 @@ static int copy_packet_data(AVPacket *pkt, const AVPacket *src, int dup)
|
||||
{
|
||||
pkt->data = NULL;
|
||||
pkt->side_data = NULL;
|
||||
pkt->side_data_elems = 0;
|
||||
if (pkt->buf) {
|
||||
AVBufferRef *ref = av_buffer_ref(src->buf);
|
||||
if (!ref)
|
||||
@@ -207,9 +209,11 @@ static int copy_packet_data(AVPacket *pkt, const AVPacket *src, int dup)
|
||||
} else {
|
||||
DUP_DATA(pkt->data, src->data, pkt->size, 1, ALLOC_BUF);
|
||||
}
|
||||
if (pkt->side_data_elems && dup)
|
||||
if (src->side_data_elems && dup) {
|
||||
pkt->side_data = src->side_data;
|
||||
if (pkt->side_data_elems && !dup) {
|
||||
pkt->side_data_elems = src->side_data_elems;
|
||||
}
|
||||
if (src->side_data_elems && !dup) {
|
||||
return av_copy_packet_side_data(pkt, src);
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -188,7 +188,6 @@ static void cavs_filter_ch_c(uint8_t *d, int stride, int alpha, int beta, int tc
|
||||
static void cavs_idct8_add_c(uint8_t *dst, int16_t *block, int stride) {
|
||||
int i;
|
||||
int16_t (*src)[8] = (int16_t(*)[8])block;
|
||||
const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;
|
||||
|
||||
src[0][0] += 8;
|
||||
|
||||
@@ -243,14 +242,14 @@ static void cavs_idct8_add_c(uint8_t *dst, int16_t *block, int stride) {
|
||||
const int b2 = a5 - a7;
|
||||
const int b3 = a4 - a6;
|
||||
|
||||
dst[i + 0*stride] = cm[ dst[i + 0*stride] + ((b0 + b4) >> 7)];
|
||||
dst[i + 1*stride] = cm[ dst[i + 1*stride] + ((b1 + b5) >> 7)];
|
||||
dst[i + 2*stride] = cm[ dst[i + 2*stride] + ((b2 + b6) >> 7)];
|
||||
dst[i + 3*stride] = cm[ dst[i + 3*stride] + ((b3 + b7) >> 7)];
|
||||
dst[i + 4*stride] = cm[ dst[i + 4*stride] + ((b3 - b7) >> 7)];
|
||||
dst[i + 5*stride] = cm[ dst[i + 5*stride] + ((b2 - b6) >> 7)];
|
||||
dst[i + 6*stride] = cm[ dst[i + 6*stride] + ((b1 - b5) >> 7)];
|
||||
dst[i + 7*stride] = cm[ dst[i + 7*stride] + ((b0 - b4) >> 7)];
|
||||
dst[i + 0*stride] = av_clip_uint8( dst[i + 0*stride] + ((b0 + b4) >> 7));
|
||||
dst[i + 1*stride] = av_clip_uint8( dst[i + 1*stride] + ((b1 + b5) >> 7));
|
||||
dst[i + 2*stride] = av_clip_uint8( dst[i + 2*stride] + ((b2 + b6) >> 7));
|
||||
dst[i + 3*stride] = av_clip_uint8( dst[i + 3*stride] + ((b3 + b7) >> 7));
|
||||
dst[i + 4*stride] = av_clip_uint8( dst[i + 4*stride] + ((b3 - b7) >> 7));
|
||||
dst[i + 5*stride] = av_clip_uint8( dst[i + 5*stride] + ((b2 - b6) >> 7));
|
||||
dst[i + 6*stride] = av_clip_uint8( dst[i + 6*stride] + ((b1 - b5) >> 7));
|
||||
dst[i + 7*stride] = av_clip_uint8( dst[i + 7*stride] + ((b0 - b4) >> 7));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+11
-16
@@ -247,7 +247,8 @@ typedef struct CCaptionSubContext {
|
||||
int64_t last_real_time;
|
||||
char prev_cmd[2];
|
||||
/* buffer to store pkt data */
|
||||
AVBufferRef *pktbuf;
|
||||
uint8_t *pktbuf;
|
||||
int pktbuf_size;
|
||||
int readorder;
|
||||
} CCaptionSubContext;
|
||||
|
||||
@@ -273,11 +274,7 @@ static av_cold int init_decoder(AVCodecContext *avctx)
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
/* allocate pkt buffer */
|
||||
ctx->pktbuf = av_buffer_alloc(128);
|
||||
if (!ctx->pktbuf) {
|
||||
ret = AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -285,7 +282,8 @@ static av_cold int close_decoder(AVCodecContext *avctx)
|
||||
{
|
||||
CCaptionSubContext *ctx = avctx->priv_data;
|
||||
av_bprint_finalize(&ctx->buffer, NULL);
|
||||
av_buffer_unref(&ctx->pktbuf);
|
||||
av_freep(&ctx->pktbuf);
|
||||
ctx->pktbuf_size = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -729,16 +727,13 @@ static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avp
|
||||
int ret = 0;
|
||||
int i;
|
||||
|
||||
if (ctx->pktbuf->size < len) {
|
||||
ret = av_buffer_realloc(&ctx->pktbuf, len);
|
||||
if (ret < 0) {
|
||||
av_log(ctx, AV_LOG_WARNING, "Insufficient Memory of %d truncated to %d\n", len, ctx->pktbuf->size);
|
||||
len = ctx->pktbuf->size;
|
||||
ret = 0;
|
||||
}
|
||||
av_fast_padded_malloc(&ctx->pktbuf, &ctx->pktbuf_size, len);
|
||||
if (!ctx->pktbuf) {
|
||||
av_log(ctx, AV_LOG_WARNING, "Insufficient Memory of %d truncated to %d\n", len, ctx->pktbuf_size);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
memcpy(ctx->pktbuf->data, avpkt->data, len);
|
||||
bptr = ctx->pktbuf->data;
|
||||
memcpy(ctx->pktbuf, avpkt->data, len);
|
||||
bptr = ctx->pktbuf;
|
||||
|
||||
for (i = 0; i < len; i += 3) {
|
||||
uint8_t cc_type = *(bptr + i) & 3;
|
||||
|
||||
+6
-6
@@ -320,7 +320,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
||||
s->plane[s->channel_num].band[0][0].width = data;
|
||||
s->plane[s->channel_num].band[0][0].stride = data;
|
||||
av_log(avctx, AV_LOG_DEBUG, "Lowpass width %"PRIu16"\n", data);
|
||||
if (data < 2 || data > s->plane[s->channel_num].band[0][0].a_width) {
|
||||
if (data < 3 || data > s->plane[s->channel_num].band[0][0].a_width) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Invalid lowpass width\n");
|
||||
ret = AVERROR(EINVAL);
|
||||
break;
|
||||
@@ -328,7 +328,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
||||
} else if (tag == 28) {
|
||||
s->plane[s->channel_num].band[0][0].height = data;
|
||||
av_log(avctx, AV_LOG_DEBUG, "Lowpass height %"PRIu16"\n", data);
|
||||
if (data < 2 || data > s->plane[s->channel_num].band[0][0].height) {
|
||||
if (data < 3 || data > s->plane[s->channel_num].band[0][0].height) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Invalid lowpass height\n");
|
||||
ret = AVERROR(EINVAL);
|
||||
break;
|
||||
@@ -366,7 +366,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
||||
s->plane[s->channel_num].band[s->level][s->subband_num].width = data;
|
||||
s->plane[s->channel_num].band[s->level][s->subband_num].stride = FFALIGN(data, 8);
|
||||
av_log(avctx, AV_LOG_DEBUG, "Highpass width %i channel %i level %i subband %i\n", data, s->channel_num, s->level, s->subband_num);
|
||||
if (data < 2) {
|
||||
if (data < 3) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Invalid highpass width\n");
|
||||
ret = AVERROR(EINVAL);
|
||||
break;
|
||||
@@ -374,7 +374,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
||||
} else if (tag == 42) {
|
||||
s->plane[s->channel_num].band[s->level][s->subband_num].height = data;
|
||||
av_log(avctx, AV_LOG_DEBUG, "Highpass height %i\n", data);
|
||||
if (data < 2) {
|
||||
if (data < 3) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Invalid highpass height\n");
|
||||
ret = AVERROR(EINVAL);
|
||||
break;
|
||||
@@ -383,7 +383,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
||||
s->plane[s->channel_num].band[s->level][s->subband_num].width = data;
|
||||
s->plane[s->channel_num].band[s->level][s->subband_num].stride = FFALIGN(data, 8);
|
||||
av_log(avctx, AV_LOG_DEBUG, "Highpass width2 %i\n", data);
|
||||
if (data < 2) {
|
||||
if (data < 3) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Invalid highpass width2\n");
|
||||
ret = AVERROR(EINVAL);
|
||||
break;
|
||||
@@ -391,7 +391,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
||||
} else if (tag == 50) {
|
||||
s->plane[s->channel_num].band[s->level][s->subband_num].height = data;
|
||||
av_log(avctx, AV_LOG_DEBUG, "Highpass height2 %i\n", data);
|
||||
if (data < 2) {
|
||||
if (data < 3) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Invalid highpass height2\n");
|
||||
ret = AVERROR(EINVAL);
|
||||
break;
|
||||
|
||||
@@ -1153,6 +1153,11 @@ static int dirac_unpack_idwt_params(DiracContext *s)
|
||||
else {
|
||||
s->num_x = get_interleaved_ue_golomb(gb);
|
||||
s->num_y = get_interleaved_ue_golomb(gb);
|
||||
if (s->num_x * s->num_y == 0 || s->num_x * (uint64_t)s->num_y > INT_MAX) {
|
||||
av_log(s->avctx,AV_LOG_ERROR,"Invalid numx/y\n");
|
||||
s->num_x = s->num_y = 0;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
if (s->ld_picture) {
|
||||
s->lowdelay.bytes.num = get_interleaved_ue_golomb(gb);
|
||||
s->lowdelay.bytes.den = get_interleaved_ue_golomb(gb);
|
||||
|
||||
@@ -118,11 +118,6 @@ static int dnxhd_init_vlc(DNXHDContext *ctx, uint32_t cid, int bitdepth)
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "bit depth mismatches %d %d\n", ff_dnxhd_cid_table[index].bit_depth, bitdepth);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
if (bitdepth > 10) {
|
||||
avpriv_request_sample(ctx->avctx, "DNXHR 12-bit");
|
||||
if (ctx->avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL)
|
||||
return AVERROR_PATCHWELCOME;
|
||||
}
|
||||
ctx->cid_table = &ff_dnxhd_cid_table[index];
|
||||
av_log(ctx->avctx, AV_LOG_VERBOSE, "Profile cid %d.\n", cid);
|
||||
|
||||
@@ -133,7 +128,7 @@ static int dnxhd_init_vlc(DNXHDContext *ctx, uint32_t cid, int bitdepth)
|
||||
init_vlc(&ctx->ac_vlc, DNXHD_VLC_BITS, 257,
|
||||
ctx->cid_table->ac_bits, 1, 1,
|
||||
ctx->cid_table->ac_codes, 2, 2, 0);
|
||||
init_vlc(&ctx->dc_vlc, DNXHD_DC_VLC_BITS, bitdepth + 4,
|
||||
init_vlc(&ctx->dc_vlc, DNXHD_DC_VLC_BITS, bitdepth > 8 ? 14 : 12,
|
||||
ctx->cid_table->dc_bits, 1, 1,
|
||||
ctx->cid_table->dc_codes, 1, 1, 0);
|
||||
init_vlc(&ctx->run_vlc, DNXHD_VLC_BITS, 62,
|
||||
|
||||
+39
-12
@@ -749,6 +749,9 @@ static int piz_uncompress(EXRContext *s, const uint8_t *src, int ssize,
|
||||
uint16_t *tmp = (uint16_t *)td->tmp;
|
||||
uint8_t *out;
|
||||
int ret, i, j;
|
||||
int pixel_half_size;/* 1 for half, 2 for float and uint32 */
|
||||
EXRChannel *channel;
|
||||
int tmp_offset;
|
||||
|
||||
if (!td->bitmap)
|
||||
td->bitmap = av_malloc(BITMAP_SIZE);
|
||||
@@ -781,24 +784,38 @@ static int piz_uncompress(EXRContext *s, const uint8_t *src, int ssize,
|
||||
|
||||
ptr = tmp;
|
||||
for (i = 0; i < s->nb_channels; i++) {
|
||||
EXRChannel *channel = &s->channels[i];
|
||||
int size = channel->pixel_type;
|
||||
channel = &s->channels[i];
|
||||
|
||||
for (j = 0; j < size; j++)
|
||||
wav_decode(ptr + j, td->xsize, size, td->ysize,
|
||||
td->xsize * size, maxval);
|
||||
ptr += td->xsize * td->ysize * size;
|
||||
if (channel->pixel_type == EXR_HALF)
|
||||
pixel_half_size = 1;
|
||||
else
|
||||
pixel_half_size = 2;
|
||||
|
||||
for (j = 0; j < pixel_half_size; j++)
|
||||
wav_decode(ptr + j, td->xsize, pixel_half_size, td->ysize,
|
||||
td->xsize * pixel_half_size, maxval);
|
||||
ptr += td->xsize * td->ysize * pixel_half_size;
|
||||
}
|
||||
|
||||
apply_lut(td->lut, tmp, dsize / sizeof(uint16_t));
|
||||
|
||||
out = td->uncompressed_data;
|
||||
for (i = 0; i < td->ysize; i++)
|
||||
for (i = 0; i < td->ysize; i++) {
|
||||
tmp_offset = 0;
|
||||
for (j = 0; j < s->nb_channels; j++) {
|
||||
uint16_t *in = tmp + j * td->xsize * td->ysize + i * td->xsize;
|
||||
memcpy(out, in, td->xsize * 2);
|
||||
out += td->xsize * 2;
|
||||
uint16_t *in;
|
||||
EXRChannel *channel = &s->channels[j];
|
||||
if (channel->pixel_type == EXR_HALF)
|
||||
pixel_half_size = 1;
|
||||
else
|
||||
pixel_half_size = 2;
|
||||
|
||||
in = tmp + tmp_offset * td->xsize * td->ysize + i * td->xsize * pixel_half_size;
|
||||
tmp_offset += pixel_half_size;
|
||||
memcpy(out, in, td->xsize * 2 * pixel_half_size);
|
||||
out += td->xsize * 2 * pixel_half_size;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1010,8 +1027,9 @@ static int decode_block(AVCodecContext *avctx, void *tdata,
|
||||
uint64_t line_offset, uncompressed_size;
|
||||
uint16_t *ptr_x;
|
||||
uint8_t *ptr;
|
||||
uint32_t data_size, line, col = 0;
|
||||
uint32_t tileX, tileY, tileLevelX, tileLevelY;
|
||||
uint32_t data_size;
|
||||
uint64_t line, col = 0;
|
||||
uint64_t tileX, tileY, tileLevelX, tileLevelY;
|
||||
const uint8_t *src;
|
||||
int axmax = (avctx->width - (s->xmax + 1)) * 2 * s->desc->nb_components; /* nb pixel to add at the right of the datawindow */
|
||||
int bxmin = s->xmin * 2 * s->desc->nb_components; /* nb pixel to add at the left of the datawindow */
|
||||
@@ -1042,9 +1060,18 @@ static int decode_block(AVCodecContext *avctx, void *tdata,
|
||||
return AVERROR_PATCHWELCOME;
|
||||
}
|
||||
|
||||
if (s->xmin || s->ymin) {
|
||||
avpriv_report_missing_feature(s->avctx, "Tiles with xmin/ymin");
|
||||
return AVERROR_PATCHWELCOME;
|
||||
}
|
||||
|
||||
line = s->tile_attr.ySize * tileY;
|
||||
col = s->tile_attr.xSize * tileX;
|
||||
|
||||
if (line < s->ymin || line > s->ymax ||
|
||||
col < s->xmin || col > s->xmax)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
td->ysize = FFMIN(s->tile_attr.ySize, s->ydelta - tileY * s->tile_attr.ySize);
|
||||
td->xsize = FFMIN(s->tile_attr.xSize, s->xdelta - tileX * s->tile_attr.xSize);
|
||||
|
||||
|
||||
@@ -781,14 +781,12 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
s->colorspace = 1;
|
||||
s->transparency = 1;
|
||||
s->chroma_planes = 1;
|
||||
if (!avctx->bits_per_raw_sample)
|
||||
s->bits_per_raw_sample = 8;
|
||||
s->bits_per_raw_sample = 8;
|
||||
break;
|
||||
case AV_PIX_FMT_0RGB32:
|
||||
s->colorspace = 1;
|
||||
s->chroma_planes = 1;
|
||||
if (!avctx->bits_per_raw_sample)
|
||||
s->bits_per_raw_sample = 8;
|
||||
s->bits_per_raw_sample = 8;
|
||||
break;
|
||||
case AV_PIX_FMT_GBRP9:
|
||||
if (!avctx->bits_per_raw_sample)
|
||||
|
||||
+1
-1
@@ -206,7 +206,7 @@ static int16_t g726_decode(G726Context* c, int I)
|
||||
|
||||
if (I_sig) /* get the sign */
|
||||
dq = -dq;
|
||||
re_signal = c->se + dq;
|
||||
re_signal = (int16_t)(c->se + dq);
|
||||
|
||||
/* Update second order predictor coefficient A2 and A1 */
|
||||
pk0 = (c->sez + dq) ? sgn(c->sez + dq) : 0;
|
||||
|
||||
+1
-1
@@ -898,7 +898,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size)
|
||||
}
|
||||
|
||||
ret = ff_h2645_packet_split(&h->pkt, buf, buf_size, avctx, h->is_avc,
|
||||
h->nal_length_size, avctx->codec_id);
|
||||
h->nal_length_size, avctx->codec_id, avctx->flags2 & AV_CODEC_FLAG2_FAST);
|
||||
if (ret < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"Error splitting the input into NAL units.\n");
|
||||
|
||||
@@ -57,8 +57,6 @@
|
||||
|
||||
#define MAX_DELAYED_PIC_COUNT 16
|
||||
|
||||
#define MAX_MBPAIR_SIZE (256*1024) // a tighter bound could be calculated if someone cares about a few bytes
|
||||
|
||||
/* Compiling in interlaced support reduces the speed
|
||||
* of progressive decoding by about 2%. */
|
||||
#define ALLOW_INTERLACE
|
||||
|
||||
+20
-16
@@ -30,10 +30,11 @@
|
||||
#include "h2645_parse.h"
|
||||
|
||||
int ff_h2645_extract_rbsp(const uint8_t *src, int length,
|
||||
H2645NAL *nal)
|
||||
H2645NAL *nal, int small_padding)
|
||||
{
|
||||
int i, si, di;
|
||||
uint8_t *dst;
|
||||
int64_t padding = small_padding ? 0 : MAX_MBPAIR_SIZE;
|
||||
|
||||
nal->skipped_bytes = 0;
|
||||
#define STARTCODE_TEST \
|
||||
@@ -81,16 +82,17 @@ int ff_h2645_extract_rbsp(const uint8_t *src, int length,
|
||||
}
|
||||
#endif /* HAVE_FAST_UNALIGNED */
|
||||
|
||||
if (i >= length - 1) { // no escaped 0
|
||||
if (i >= length - 1 && small_padding) { // no escaped 0
|
||||
nal->data =
|
||||
nal->raw_data = src;
|
||||
nal->size =
|
||||
nal->raw_size = length;
|
||||
return length;
|
||||
}
|
||||
} else if (i > length)
|
||||
i = length;
|
||||
|
||||
av_fast_malloc(&nal->rbsp_buffer, &nal->rbsp_buffer_size,
|
||||
length + AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
av_fast_padded_malloc(&nal->rbsp_buffer, &nal->rbsp_buffer_size,
|
||||
length + padding);
|
||||
if (!nal->rbsp_buffer)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
@@ -247,7 +249,7 @@ static int h264_parse_nal_header(H2645NAL *nal, void *logctx)
|
||||
|
||||
int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
|
||||
void *logctx, int is_nalff, int nal_length_size,
|
||||
enum AVCodecID codec_id)
|
||||
enum AVCodecID codec_id, int small_padding)
|
||||
{
|
||||
int consumed, ret = 0;
|
||||
const uint8_t *next_avc = is_nalff ? buf : buf + length;
|
||||
@@ -258,19 +260,21 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
|
||||
int extract_length = 0;
|
||||
int skip_trailing_zeros = 1;
|
||||
|
||||
if (buf >= next_avc) {
|
||||
int i;
|
||||
for (i = 0; i < nal_length_size; i++)
|
||||
extract_length = (extract_length << 8) | buf[i];
|
||||
if (buf == next_avc) {
|
||||
int i = 0;
|
||||
extract_length = get_nalsize(nal_length_size,
|
||||
buf, length, &i, logctx);
|
||||
if (extract_length < 0)
|
||||
return extract_length;
|
||||
|
||||
buf += nal_length_size;
|
||||
length -= nal_length_size;
|
||||
|
||||
if (extract_length > length) {
|
||||
av_log(logctx, AV_LOG_ERROR, "Invalid NAL unit size.\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
next_avc = buf + extract_length;
|
||||
} else {
|
||||
if (buf > next_avc)
|
||||
av_log(logctx, AV_LOG_WARNING, "Exceeded next NALFF position, re-syncing.\n");
|
||||
|
||||
/* search start code */
|
||||
while (buf[0] != 0 || buf[1] != 0 || buf[2] != 1) {
|
||||
++buf;
|
||||
@@ -290,7 +294,7 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
|
||||
|
||||
buf += 3;
|
||||
length -= 3;
|
||||
extract_length = length;
|
||||
extract_length = FFMIN(length, next_avc - buf);
|
||||
|
||||
if (buf >= next_avc) {
|
||||
/* skip to the start of the next NAL */
|
||||
@@ -322,7 +326,7 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
|
||||
}
|
||||
nal = &pkt->nals[pkt->nb_nals];
|
||||
|
||||
consumed = ff_h2645_extract_rbsp(buf, extract_length, nal);
|
||||
consumed = ff_h2645_extract_rbsp(buf, extract_length, nal, small_padding);
|
||||
if (consumed < 0)
|
||||
return consumed;
|
||||
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
#include "avcodec.h"
|
||||
#include "get_bits.h"
|
||||
|
||||
#define MAX_MBPAIR_SIZE (256*1024) // a tighter bound could be calculated if someone cares about a few bytes
|
||||
|
||||
typedef struct H2645NAL {
|
||||
uint8_t *rbsp_buffer;
|
||||
int rbsp_buffer_size;
|
||||
@@ -74,18 +76,38 @@ typedef struct H2645Packet {
|
||||
* Extract the raw (unescaped) bitstream.
|
||||
*/
|
||||
int ff_h2645_extract_rbsp(const uint8_t *src, int length,
|
||||
H2645NAL *nal);
|
||||
H2645NAL *nal, int small_padding);
|
||||
|
||||
/**
|
||||
* Split an input packet into NAL units.
|
||||
*/
|
||||
int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
|
||||
void *logctx, int is_nalff, int nal_length_size,
|
||||
enum AVCodecID codec_id);
|
||||
enum AVCodecID codec_id, int small_padding);
|
||||
|
||||
/**
|
||||
* Free all the allocated memory in the packet.
|
||||
*/
|
||||
void ff_h2645_packet_uninit(H2645Packet *pkt);
|
||||
|
||||
static inline int get_nalsize(int nal_length_size, const uint8_t *buf,
|
||||
int buf_size, int *buf_index, void *logctx)
|
||||
{
|
||||
int i, nalsize = 0;
|
||||
|
||||
if (*buf_index >= buf_size - nal_length_size) {
|
||||
// the end of the buffer is reached, refill it
|
||||
return AVERROR(EAGAIN);
|
||||
}
|
||||
|
||||
for (i = 0; i < nal_length_size; i++)
|
||||
nalsize = ((unsigned)nalsize << 8) | buf[(*buf_index)++];
|
||||
if (nalsize <= 0 || nalsize > buf_size - *buf_index) {
|
||||
av_log(logctx, AV_LOG_ERROR,
|
||||
"Invalid nal size %d\n", nalsize);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
return nalsize;
|
||||
}
|
||||
|
||||
#endif /* AVCODEC_H2645_PARSE_H */
|
||||
|
||||
@@ -327,7 +327,7 @@ static int decode_extradata_ps(const uint8_t *data, int size, H264ParamSets *ps,
|
||||
H2645Packet pkt = { 0 };
|
||||
int i, ret = 0;
|
||||
|
||||
ret = ff_h2645_packet_split(&pkt, data, size, logctx, is_avc, 2, AV_CODEC_ID_H264);
|
||||
ret = ff_h2645_packet_split(&pkt, data, size, logctx, is_avc, 2, AV_CODEC_ID_H264, 1);
|
||||
if (ret < 0) {
|
||||
ret = 0;
|
||||
goto fail;
|
||||
|
||||
+17
-24
@@ -226,26 +226,6 @@ static int scan_mmco_reset(AVCodecParserContext *s, GetBitContext *gb,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int get_avc_nalsize(H264ParseContext *p, const uint8_t *buf,
|
||||
int buf_size, int *buf_index, void *logctx)
|
||||
{
|
||||
int i, nalsize = 0;
|
||||
|
||||
if (*buf_index >= buf_size - p->nal_length_size) {
|
||||
// the end of the buffer is reached, refill it
|
||||
return AVERROR(EAGAIN);
|
||||
}
|
||||
|
||||
for (i = 0; i < p->nal_length_size; i++)
|
||||
nalsize = ((unsigned)nalsize << 8) | buf[(*buf_index)++];
|
||||
if (nalsize <= 0 || nalsize > buf_size - *buf_index) {
|
||||
av_log(logctx, AV_LOG_ERROR,
|
||||
"AVC: nal size %d\n", nalsize);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
return nalsize;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse NAL units of found picture and decode some basic information.
|
||||
*
|
||||
@@ -286,7 +266,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
|
||||
int src_length, consumed, nalsize = 0;
|
||||
|
||||
if (buf_index >= next_avc) {
|
||||
nalsize = get_avc_nalsize(p, buf, buf_size, &buf_index, avctx);
|
||||
nalsize = get_nalsize(p->nal_length_size, buf, buf_size, &buf_index, avctx);
|
||||
if (nalsize < 0)
|
||||
break;
|
||||
next_avc = buf_index + nalsize;
|
||||
@@ -316,7 +296,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
|
||||
}
|
||||
break;
|
||||
}
|
||||
consumed = ff_h2645_extract_rbsp(buf + buf_index, src_length, &nal);
|
||||
consumed = ff_h2645_extract_rbsp(buf + buf_index, src_length, &nal, 1);
|
||||
if (consumed < 0)
|
||||
break;
|
||||
|
||||
@@ -367,13 +347,26 @@ static inline int parse_nal_units(AVCodecParserContext *s,
|
||||
"non-existing PPS %u referenced\n", pps_id);
|
||||
goto fail;
|
||||
}
|
||||
p->ps.pps = (const PPS*)p->ps.pps_list[pps_id]->data;
|
||||
|
||||
av_buffer_unref(&p->ps.pps_ref);
|
||||
av_buffer_unref(&p->ps.sps_ref);
|
||||
p->ps.pps = NULL;
|
||||
p->ps.sps = NULL;
|
||||
p->ps.pps_ref = av_buffer_ref(p->ps.pps_list[pps_id]);
|
||||
if (!p->ps.pps_ref)
|
||||
goto fail;
|
||||
p->ps.pps = (const PPS*)p->ps.pps_ref->data;
|
||||
|
||||
if (!p->ps.sps_list[p->ps.pps->sps_id]) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"non-existing SPS %u referenced\n", p->ps.pps->sps_id);
|
||||
goto fail;
|
||||
}
|
||||
p->ps.sps = (SPS*)p->ps.sps_list[p->ps.pps->sps_id]->data;
|
||||
|
||||
p->ps.sps_ref = av_buffer_ref(p->ps.sps_list[p->ps.pps->sps_id]);
|
||||
if (!p->ps.sps_ref)
|
||||
goto fail;
|
||||
p->ps.sps = (SPS*)p->ps.sps_ref->data;
|
||||
|
||||
sps = p->ps.sps;
|
||||
|
||||
|
||||
+1
-1
@@ -2867,7 +2867,7 @@ static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
|
||||
/* split the input packet into NAL units, so we know the upper bound on the
|
||||
* number of slices in the frame */
|
||||
ret = ff_h2645_packet_split(&s->pkt, buf, length, s->avctx, s->is_nalff,
|
||||
s->nal_length_size, s->avctx->codec_id);
|
||||
s->nal_length_size, s->avctx->codec_id, 1);
|
||||
if (ret < 0) {
|
||||
av_log(s->avctx, AV_LOG_ERROR,
|
||||
"Error splitting the input into NAL units.\n");
|
||||
|
||||
@@ -90,7 +90,7 @@ static int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf,
|
||||
int ret, i;
|
||||
|
||||
ret = ff_h2645_packet_split(&ctx->pkt, buf, buf_size, avctx, 0, 0,
|
||||
AV_CODEC_ID_HEVC);
|
||||
AV_CODEC_ID_HEVC, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -243,7 +243,7 @@ static inline int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf,
|
||||
src_length = 20;
|
||||
}
|
||||
|
||||
consumed = ff_h2645_extract_rbsp(buf, src_length, nal);
|
||||
consumed = ff_h2645_extract_rbsp(buf, src_length, nal, 1);
|
||||
if (consumed < 0)
|
||||
return consumed;
|
||||
|
||||
|
||||
@@ -171,6 +171,12 @@ static int ir2_decode_frame(AVCodecContext *avctx,
|
||||
|
||||
ltab = buf[0x22] & 3;
|
||||
ctab = buf[0x22] >> 2;
|
||||
|
||||
if (ctab > 3) {
|
||||
av_log(avctx, AV_LOG_ERROR, "ctab %d is invalid\n", ctab);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
if (s->decode_delta) { /* intraframe */
|
||||
if ((ret = ir2_decode_plane(s, avctx->width, avctx->height,
|
||||
p->data[0], p->linesize[0],
|
||||
|
||||
+4
-5
@@ -20,19 +20,18 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "libavutil/error.h"
|
||||
#include "jni.h"
|
||||
|
||||
#if CONFIG_JNI
|
||||
|
||||
#include <errno.h>
|
||||
#include <jni.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include "libavutil/log.h"
|
||||
#include "libavutil/error.h"
|
||||
#include "ffjni.h"
|
||||
|
||||
void *java_vm;
|
||||
@@ -69,7 +68,7 @@ void *av_jni_get_java_vm(void *log_ctx)
|
||||
|
||||
int av_jni_set_java_vm(void *vm, void *log_ctx)
|
||||
{
|
||||
return 0;
|
||||
return AVERROR(ENOSYS);
|
||||
}
|
||||
|
||||
void *av_jni_get_java_vm(void *log_ctx)
|
||||
|
||||
@@ -24,8 +24,6 @@
|
||||
* JPEG 2000 decoder using libopenjpeg
|
||||
*/
|
||||
|
||||
#define OPJ_STATIC
|
||||
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/imgutils.h"
|
||||
#include "libavutil/intreadwrite.h"
|
||||
|
||||
+39
-22
@@ -24,8 +24,6 @@
|
||||
* JPEG 2000 encoder using libopenjpeg
|
||||
*/
|
||||
|
||||
#define OPJ_STATIC
|
||||
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/imgutils.h"
|
||||
@@ -54,7 +52,9 @@
|
||||
|
||||
typedef struct LibOpenJPEGContext {
|
||||
AVClass *avclass;
|
||||
#if OPENJPEG_MAJOR_VERSION == 1
|
||||
opj_image_t *image;
|
||||
#endif // OPENJPEG_MAJOR_VERSION == 1
|
||||
opj_cparameters_t enc_params;
|
||||
#if OPENJPEG_MAJOR_VERSION == 1
|
||||
opj_event_mgr_t event_mgr;
|
||||
@@ -371,18 +371,22 @@ static av_cold int libopenjpeg_encode_init(AVCodecContext *avctx)
|
||||
cinema_parameters(&ctx->enc_params);
|
||||
}
|
||||
|
||||
#if OPENJPEG_MAJOR_VERSION == 1
|
||||
ctx->image = mj2_create_image(avctx, &ctx->enc_params);
|
||||
if (!ctx->image) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Error creating the mj2 image\n");
|
||||
err = AVERROR(EINVAL);
|
||||
goto fail;
|
||||
}
|
||||
#endif // OPENJPEG_MAJOR_VERSION == 1
|
||||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
#if OPENJPEG_MAJOR_VERSION == 1
|
||||
opj_image_destroy(ctx->image);
|
||||
ctx->image = NULL;
|
||||
#endif // OPENJPEG_MAJOR_VERSION == 1
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -417,7 +421,7 @@ static int libopenjpeg_copy_packed8(AVCodecContext *avctx, const AVFrame *frame,
|
||||
for (; y < image->comps[compno].h; ++y) {
|
||||
image_line = image->comps[compno].data + y * image->comps[compno].w;
|
||||
for (x = 0; x < image->comps[compno].w; ++x) {
|
||||
image_line[x] = image_line[x - image->comps[compno].w];
|
||||
image_line[x] = image_line[x - (int)image->comps[compno].w];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -457,7 +461,7 @@ static int libopenjpeg_copy_packed12(AVCodecContext *avctx, const AVFrame *frame
|
||||
for (; y < image->comps[compno].h; ++y) {
|
||||
image_line = image->comps[compno].data + y * image->comps[compno].w;
|
||||
for (x = 0; x < image->comps[compno].w; ++x) {
|
||||
image_line[x] = image_line[x - image->comps[compno].w];
|
||||
image_line[x] = image_line[x - (int)image->comps[compno].w];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -497,7 +501,7 @@ static int libopenjpeg_copy_packed16(AVCodecContext *avctx, const AVFrame *frame
|
||||
for (; y < image->comps[compno].h; ++y) {
|
||||
image_line = image->comps[compno].data + y * image->comps[compno].w;
|
||||
for (x = 0; x < image->comps[compno].w; ++x) {
|
||||
image_line[x] = image_line[x - image->comps[compno].w];
|
||||
image_line[x] = image_line[x - (int)image->comps[compno].w];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -524,8 +528,8 @@ static int libopenjpeg_copy_unpacked8(AVCodecContext *avctx, const AVFrame *fram
|
||||
}
|
||||
|
||||
for (compno = 0; compno < numcomps; ++compno) {
|
||||
width = avctx->width / image->comps[compno].dx;
|
||||
height = avctx->height / image->comps[compno].dy;
|
||||
width = (avctx->width + image->comps[compno].dx - 1) / image->comps[compno].dx;
|
||||
height = (avctx->height + image->comps[compno].dy - 1) / image->comps[compno].dy;
|
||||
for (y = 0; y < height; ++y) {
|
||||
image_line = image->comps[compno].data + y * image->comps[compno].w;
|
||||
frame_index = y * frame->linesize[compno];
|
||||
@@ -538,7 +542,7 @@ static int libopenjpeg_copy_unpacked8(AVCodecContext *avctx, const AVFrame *fram
|
||||
for (; y < image->comps[compno].h; ++y) {
|
||||
image_line = image->comps[compno].data + y * image->comps[compno].w;
|
||||
for (x = 0; x < image->comps[compno].w; ++x) {
|
||||
image_line[x] = image_line[x - image->comps[compno].w];
|
||||
image_line[x] = image_line[x - (int)image->comps[compno].w];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -566,8 +570,8 @@ static int libopenjpeg_copy_unpacked16(AVCodecContext *avctx, const AVFrame *fra
|
||||
}
|
||||
|
||||
for (compno = 0; compno < numcomps; ++compno) {
|
||||
width = avctx->width / image->comps[compno].dx;
|
||||
height = avctx->height / image->comps[compno].dy;
|
||||
width = (avctx->width + image->comps[compno].dx - 1) / image->comps[compno].dx;
|
||||
height = (avctx->height + image->comps[compno].dy - 1) / image->comps[compno].dy;
|
||||
frame_ptr = (uint16_t *)frame->data[compno];
|
||||
for (y = 0; y < height; ++y) {
|
||||
image_line = image->comps[compno].data + y * image->comps[compno].w;
|
||||
@@ -581,7 +585,7 @@ static int libopenjpeg_copy_unpacked16(AVCodecContext *avctx, const AVFrame *fra
|
||||
for (; y < image->comps[compno].h; ++y) {
|
||||
image_line = image->comps[compno].data + y * image->comps[compno].w;
|
||||
for (x = 0; x < image->comps[compno].w; ++x) {
|
||||
image_line[x] = image_line[x - image->comps[compno].w];
|
||||
image_line[x] = image_line[x - (int)image->comps[compno].w];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -593,19 +597,25 @@ static int libopenjpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
||||
const AVFrame *frame, int *got_packet)
|
||||
{
|
||||
LibOpenJPEGContext *ctx = avctx->priv_data;
|
||||
opj_image_t *image = ctx->image;
|
||||
int ret;
|
||||
AVFrame *gbrframe;
|
||||
int cpyresult = 0;
|
||||
#if OPENJPEG_MAJOR_VERSION == 1
|
||||
opj_image_t *image = ctx->image;
|
||||
opj_cinfo_t *compress = NULL;
|
||||
opj_cio_t *stream = NULL;
|
||||
int len;
|
||||
#else // OPENJPEG_MAJOR_VERSION == 2
|
||||
PacketWriter writer = { 0 };
|
||||
opj_codec_t *compress = NULL;
|
||||
opj_stream_t *stream = NULL;
|
||||
PacketWriter writer = { 0 };
|
||||
opj_image_t *image = mj2_create_image(avctx, &ctx->enc_params);
|
||||
if (!image) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Error creating the mj2 image\n");
|
||||
ret = AVERROR(EINVAL);
|
||||
goto done;
|
||||
}
|
||||
#endif // OPENJPEG_MAJOR_VERSION == 1
|
||||
int cpyresult = 0;
|
||||
int ret;
|
||||
AVFrame *gbrframe;
|
||||
|
||||
switch (avctx->pix_fmt) {
|
||||
case AV_PIX_FMT_RGB24:
|
||||
@@ -628,8 +638,10 @@ static int libopenjpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
||||
case AV_PIX_FMT_GBRP14:
|
||||
case AV_PIX_FMT_GBRP16:
|
||||
gbrframe = av_frame_clone(frame);
|
||||
if (!gbrframe)
|
||||
return AVERROR(ENOMEM);
|
||||
if (!gbrframe) {
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto done;
|
||||
}
|
||||
gbrframe->data[0] = frame->data[2]; // swap to be rgb
|
||||
gbrframe->data[1] = frame->data[0];
|
||||
gbrframe->data[2] = frame->data[1];
|
||||
@@ -686,19 +698,21 @@ static int libopenjpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"The frame's pixel format '%s' is not supported\n",
|
||||
av_get_pix_fmt_name(avctx->pix_fmt));
|
||||
return AVERROR(EINVAL);
|
||||
ret = AVERROR(EINVAL);
|
||||
goto done;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!cpyresult) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"Could not copy the frame data to the internal image buffer\n");
|
||||
return -1;
|
||||
ret = -1;
|
||||
goto done;
|
||||
}
|
||||
|
||||
#if OPENJPEG_MAJOR_VERSION == 2
|
||||
if ((ret = ff_alloc_packet2(avctx, pkt, 1024, 0)) < 0) {
|
||||
return ret;
|
||||
goto done;
|
||||
}
|
||||
#endif // OPENJPEG_MAJOR_VERSION == 2
|
||||
|
||||
@@ -765,7 +779,7 @@ static int libopenjpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
||||
#error Missing call to opj_stream_set_user_data
|
||||
#endif
|
||||
|
||||
if (!opj_start_compress(compress, ctx->image, stream) ||
|
||||
if (!opj_start_compress(compress, image, stream) ||
|
||||
!opj_encode(compress, stream) ||
|
||||
!opj_end_compress(compress, stream)) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Error during the opj encode\n");
|
||||
@@ -784,6 +798,7 @@ done:
|
||||
#if OPENJPEG_MAJOR_VERSION == 2
|
||||
opj_stream_destroy(stream);
|
||||
opj_destroy_codec(compress);
|
||||
opj_image_destroy(image);
|
||||
#else
|
||||
opj_cio_close(stream);
|
||||
opj_destroy_compress(compress);
|
||||
@@ -793,10 +808,12 @@ done:
|
||||
|
||||
static av_cold int libopenjpeg_encode_close(AVCodecContext *avctx)
|
||||
{
|
||||
#if OPENJPEG_MAJOR_VERSION == 1
|
||||
LibOpenJPEGContext *ctx = avctx->priv_data;
|
||||
|
||||
opj_image_destroy(ctx->image);
|
||||
ctx->image = NULL;
|
||||
#endif // OPENJPEG_MAJOR_VERSION == 1
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -777,8 +777,8 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
if(x4->x264opts){
|
||||
const char *p= x4->x264opts;
|
||||
while(p){
|
||||
char param[256]={0}, val[256]={0};
|
||||
if(sscanf(p, "%255[^:=]=%255[^:]", param, val) == 1){
|
||||
char param[4096]={0}, val[4096]={0};
|
||||
if(sscanf(p, "%4095[^:=]=%4095[^:]", param, val) == 1){
|
||||
OPT_STR(param, "1");
|
||||
}else
|
||||
OPT_STR(param, val);
|
||||
|
||||
@@ -65,6 +65,58 @@ static av_cold int mediacodec_decode_close(AVCodecContext *avctx)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int h264_ps_to_nalu(const uint8_t *src, int src_size, uint8_t **out, int *out_size)
|
||||
{
|
||||
int i;
|
||||
int ret = 0;
|
||||
uint8_t *p = NULL;
|
||||
static const uint8_t nalu_header[] = { 0x00, 0x00, 0x00, 0x01 };
|
||||
|
||||
if (!out || !out_size) {
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
p = av_malloc(sizeof(nalu_header) + src_size);
|
||||
if (!p) {
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
*out = p;
|
||||
*out_size = sizeof(nalu_header) + src_size;
|
||||
|
||||
memcpy(p, nalu_header, sizeof(nalu_header));
|
||||
memcpy(p + sizeof(nalu_header), src, src_size);
|
||||
|
||||
/* Escape 0x00, 0x00, 0x0{0-3} pattern */
|
||||
for (i = 4; i < *out_size; i++) {
|
||||
if (i < *out_size - 3 &&
|
||||
p[i + 0] == 0 &&
|
||||
p[i + 1] == 0 &&
|
||||
p[i + 2] <= 3) {
|
||||
uint8_t *new;
|
||||
|
||||
*out_size += 1;
|
||||
new = av_realloc(*out, *out_size);
|
||||
if (!new) {
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto done;
|
||||
}
|
||||
*out = p = new;
|
||||
|
||||
i = i + 2;
|
||||
memmove(p + i + 1, p + i, *out_size - (i + 1));
|
||||
p[i] = 0x03;
|
||||
}
|
||||
}
|
||||
done:
|
||||
if (ret < 0) {
|
||||
av_freep(out);
|
||||
*out_size = 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static av_cold int mediacodec_decode_init(AVCodecContext *avctx)
|
||||
{
|
||||
int i;
|
||||
@@ -112,8 +164,20 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx)
|
||||
}
|
||||
|
||||
if (pps && sps) {
|
||||
ff_AMediaFormat_setBuffer(format, "csd-0", (void*)sps->data, sps->data_size);
|
||||
ff_AMediaFormat_setBuffer(format, "csd-1", (void*)pps->data, pps->data_size);
|
||||
uint8_t *data = NULL;
|
||||
size_t data_size = 0;
|
||||
|
||||
if ((ret = h264_ps_to_nalu(sps->data, sps->data_size, &data, &data_size)) < 0) {
|
||||
goto done;
|
||||
}
|
||||
ff_AMediaFormat_setBuffer(format, "csd-0", (void*)data, data_size);
|
||||
av_freep(&data);
|
||||
|
||||
if ((ret = h264_ps_to_nalu(pps->data, pps->data_size, &data, &data_size)) < 0) {
|
||||
goto done;
|
||||
}
|
||||
ff_AMediaFormat_setBuffer(format, "csd-1", (void*)data, data_size);
|
||||
av_freep(&data);
|
||||
} else {
|
||||
av_log(avctx, AV_LOG_ERROR, "Could not extract PPS/SPS from extradata");
|
||||
ret = AVERROR_INVALIDDATA;
|
||||
|
||||
@@ -2119,6 +2119,8 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
||||
ret = mjpeg_decode_com(s);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
} else if (start_code == DQT) {
|
||||
ff_mjpeg_decode_dqt(s);
|
||||
}
|
||||
|
||||
ret = -1;
|
||||
@@ -2151,9 +2153,6 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
||||
s->restart_count = 0;
|
||||
/* nothing to do on SOI */
|
||||
break;
|
||||
case DQT:
|
||||
ff_mjpeg_decode_dqt(s);
|
||||
break;
|
||||
case DHT:
|
||||
if ((ret = ff_mjpeg_decode_dht(s)) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "huffman table decode error\n");
|
||||
|
||||
@@ -471,6 +471,10 @@ static int mov_text_decode_frame(AVCodecContext *avctx,
|
||||
tsmb_type = AV_RB32(tsmb);
|
||||
tsmb += 4;
|
||||
|
||||
if (tsmb_size == 0) {
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
if (tsmb_size == 1) {
|
||||
if (m->tracksize + 16 > avpkt->size)
|
||||
break;
|
||||
|
||||
@@ -2389,7 +2389,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
#endif
|
||||
|
||||
s->closed_gop = get_bits1(&s->gb);
|
||||
/* broken_link indicate that after editing the
|
||||
/* broken_link indicates that after editing the
|
||||
* reference frames of the first B-Frames after GOP I-Frame
|
||||
* are missing (open gop) */
|
||||
broken_link = get_bits1(&s->gb);
|
||||
|
||||
@@ -2911,6 +2911,8 @@ int ff_mpv_reallocate_putbitbuffer(MpegEncContext *s, size_t threshold, size_t s
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
emms_c();
|
||||
|
||||
av_fast_padded_malloc(&new_buffer, &new_buffer_size,
|
||||
s->avctx->internal->byte_buffer_size + size_increase);
|
||||
if (!new_buffer)
|
||||
|
||||
@@ -76,7 +76,7 @@ static const AVOption options[] = {
|
||||
{ "surfaces", "Number of concurrent surfaces", OFFSET(nb_surfaces), AV_OPT_TYPE_INT, { .i64 = 32 }, 0, INT_MAX, VE },
|
||||
{ "cbr", "Use cbr encoding mode", OFFSET(cbr), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
|
||||
{ "2pass", "Use 2pass encoding mode", OFFSET(twopass), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE },
|
||||
{ "gpu", "Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on.", OFFSET(device), AV_OPT_TYPE_INT, { .i64 = ANY_DEVICE }, -2, INT_MAX, VE },
|
||||
{ "gpu", "Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on.", OFFSET(device), AV_OPT_TYPE_INT, { .i64 = ANY_DEVICE }, -2, INT_MAX, VE, "device" },
|
||||
{ "any", "Pick the first device available", 0, AV_OPT_TYPE_CONST, { .i64 = ANY_DEVICE }, 0, 0, VE, "device" },
|
||||
{ "list", "List the available devices", 0, AV_OPT_TYPE_CONST, { .i64 = LIST_DEVICES }, 0, 0, VE, "device" },
|
||||
{ "delay", "Delay frame output by the given amount of frames", OFFSET(async_depth), AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 0, INT_MAX, VE },
|
||||
|
||||
@@ -66,6 +66,8 @@ retry:
|
||||
}
|
||||
#endif
|
||||
next = END_NOT_FOUND;
|
||||
} else if (pnmctx.type < 4) {
|
||||
next = END_NOT_FOUND;
|
||||
} else {
|
||||
next = pnmctx.bytestream - pnmctx.bytestream_start
|
||||
+ av_image_get_buffer_size(avctx->pix_fmt, avctx->width, avctx->height, 1);
|
||||
|
||||
@@ -69,7 +69,7 @@ static int generate_fake_vps(QSVEncContext *q, AVCodecContext *avctx)
|
||||
}
|
||||
|
||||
/* parse the SPS */
|
||||
ret = ff_h2645_extract_rbsp(avctx->extradata + 4, avctx->extradata_size - 4, &sps_nal);
|
||||
ret = ff_h2645_extract_rbsp(avctx->extradata + 4, avctx->extradata_size - 4, &sps_nal, 1);
|
||||
if (ret < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Error unescaping the SPS buffer\n");
|
||||
return ret;
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
const PixelFormatTag ff_raw_pix_fmt_tags[] = {
|
||||
{ AV_PIX_FMT_YUV420P, MKTAG('I', '4', '2', '0') }, /* Planar formats */
|
||||
{ AV_PIX_FMT_YUV420P, MKTAG('I', 'Y', 'U', 'V') },
|
||||
{ AV_PIX_FMT_YUV420P, MKTAG('y', 'v', '1', '2') },
|
||||
{ AV_PIX_FMT_YUV420P, MKTAG('Y', 'V', '1', '2') },
|
||||
{ AV_PIX_FMT_YUV410P, MKTAG('Y', 'U', 'V', '9') },
|
||||
{ AV_PIX_FMT_YUV410P, MKTAG('Y', 'V', 'U', '9') },
|
||||
|
||||
+20
-10
@@ -204,8 +204,9 @@ static int raw_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
||||
|
||||
desc = av_pix_fmt_desc_get(avctx->pix_fmt);
|
||||
|
||||
if ((avctx->bits_per_coded_sample == 8 || avctx->bits_per_coded_sample == 4
|
||||
|| avctx->bits_per_coded_sample <= 2) &&
|
||||
if ((avctx->bits_per_coded_sample == 8 || avctx->bits_per_coded_sample == 4 ||
|
||||
avctx->bits_per_coded_sample == 2 || avctx->bits_per_coded_sample == 1 ||
|
||||
(avctx->bits_per_coded_sample == 0 && (context->is_nut_pal8 || context->is_mono)) ) &&
|
||||
(context->is_mono || context->is_pal8) &&
|
||||
(!avctx->codec_tag || avctx->codec_tag == MKTAG('r','a','w',' ') ||
|
||||
context->is_nut_mono || context->is_nut_pal8)) {
|
||||
@@ -365,20 +366,29 @@ static int raw_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
||||
if (avctx->pix_fmt == AV_PIX_FMT_PAL8) {
|
||||
const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE,
|
||||
NULL);
|
||||
if (pal) {
|
||||
av_buffer_unref(&context->palette);
|
||||
int ret;
|
||||
if (!context->palette)
|
||||
context->palette = av_buffer_alloc(AVPALETTE_SIZE);
|
||||
if (!context->palette) {
|
||||
av_buffer_unref(&frame->buf[0]);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
if (!context->palette) {
|
||||
av_buffer_unref(&frame->buf[0]);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
ret = av_buffer_make_writable(&context->palette);
|
||||
if (ret < 0) {
|
||||
av_buffer_unref(&frame->buf[0]);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (pal) {
|
||||
memcpy(context->palette->data, pal, AVPALETTE_SIZE);
|
||||
frame->palette_has_changed = 1;
|
||||
} else if (context->is_nut_pal8) {
|
||||
int vid_size = avctx->width * avctx->height;
|
||||
if (avpkt->size - vid_size) {
|
||||
int pal_size = avpkt->size - vid_size;
|
||||
|
||||
if (avpkt->size > vid_size && pal_size <= AVPALETTE_SIZE) {
|
||||
pal = avpkt->data + vid_size;
|
||||
memcpy(context->palette->data, pal, avpkt->size - vid_size);
|
||||
memcpy(context->palette->data, pal, pal_size);
|
||||
frame->palette_has_changed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
+8
-2
@@ -102,6 +102,7 @@ typedef struct SVQ3Context {
|
||||
int prev_frame_num;
|
||||
|
||||
enum AVPictureType pict_type;
|
||||
enum AVPictureType slice_type;
|
||||
int low_delay;
|
||||
|
||||
int mb_x, mb_y;
|
||||
@@ -1027,7 +1028,7 @@ static int svq3_decode_slice_header(AVCodecContext *avctx)
|
||||
slice_bits = slice_length * 8;
|
||||
slice_bytes = slice_length + length - 1;
|
||||
|
||||
if (slice_bytes > get_bits_left(&s->gb)) {
|
||||
if (8LL*slice_bytes > get_bits_left(&s->gb)) {
|
||||
av_log(avctx, AV_LOG_ERROR, "slice after bitstream end\n");
|
||||
return -1;
|
||||
}
|
||||
@@ -1057,7 +1058,7 @@ static int svq3_decode_slice_header(AVCodecContext *avctx)
|
||||
return -1;
|
||||
}
|
||||
|
||||
s->pict_type = ff_h264_golomb_to_pict_type[slice_id];
|
||||
s->slice_type = ff_h264_golomb_to_pict_type[slice_id];
|
||||
|
||||
if ((header & 0x9F) == 2) {
|
||||
i = (s->mb_num < 64) ? 6 : (1 + av_log2(s->mb_num - 1));
|
||||
@@ -1426,6 +1427,8 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data,
|
||||
if (svq3_decode_slice_header(avctx))
|
||||
return -1;
|
||||
|
||||
s->pict_type = s->slice_type;
|
||||
|
||||
if (s->pict_type != AV_PICTURE_TYPE_B)
|
||||
FFSWAP(H264Picture*, s->next_pic, s->last_pic);
|
||||
|
||||
@@ -1539,6 +1542,9 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data,
|
||||
if (svq3_decode_slice_header(avctx))
|
||||
return -1;
|
||||
}
|
||||
if (s->slice_type != s->pict_type) {
|
||||
avpriv_request_sample(avctx, "non constant slice type\n");
|
||||
}
|
||||
/* TODO: support s->mb_skip_run */
|
||||
}
|
||||
|
||||
|
||||
@@ -991,6 +991,7 @@ int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, v
|
||||
if (ret)
|
||||
ret[i] = r;
|
||||
}
|
||||
emms_c();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1003,6 +1004,7 @@ int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2,
|
||||
if (ret)
|
||||
ret[i] = r;
|
||||
}
|
||||
emms_c();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -967,10 +967,10 @@ static const AVCodecDefault vaapi_encode_h264_defaults[] = {
|
||||
{ "b", "0" },
|
||||
{ "bf", "2" },
|
||||
{ "g", "120" },
|
||||
{ "i_qfactor", "1.0" },
|
||||
{ "i_qoffset", "0.0" },
|
||||
{ "b_qfactor", "1.2" },
|
||||
{ "b_qoffset", "0.0" },
|
||||
{ "i_qfactor", "1" },
|
||||
{ "i_qoffset", "0" },
|
||||
{ "b_qfactor", "6/5" },
|
||||
{ "b_qoffset", "0" },
|
||||
{ NULL },
|
||||
};
|
||||
|
||||
|
||||
@@ -1338,10 +1338,10 @@ static const AVCodecDefault vaapi_encode_h265_defaults[] = {
|
||||
{ "b", "0" },
|
||||
{ "bf", "2" },
|
||||
{ "g", "120" },
|
||||
{ "i_qfactor", "1.0" },
|
||||
{ "i_qoffset", "0.0" },
|
||||
{ "b_qfactor", "1.2" },
|
||||
{ "b_qoffset", "0.0" },
|
||||
{ "i_qfactor", "1" },
|
||||
{ "i_qoffset", "0" },
|
||||
{ "b_qfactor", "6/5" },
|
||||
{ "b_qoffset", "0" },
|
||||
{ NULL },
|
||||
};
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
typedef struct VP9ParseContext {
|
||||
int n_frames; // 1-8
|
||||
int size[8];
|
||||
int marker_size;
|
||||
int64_t pts;
|
||||
} VP9ParseContext;
|
||||
|
||||
@@ -88,6 +89,21 @@ static int parse(AVCodecParserContext *ctx,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (s->n_frames > 0) {
|
||||
int i;
|
||||
int size_sum = 0;
|
||||
|
||||
for (i = 0; i < s->n_frames ;i++)
|
||||
size_sum += s->size[i];
|
||||
size_sum += s->marker_size;
|
||||
|
||||
if (size_sum != size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Inconsistent input frame sizes %d %d\n",
|
||||
size_sum, size);
|
||||
s->n_frames = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (s->n_frames > 0) {
|
||||
*out_data = data;
|
||||
*out_size = s->size[--s->n_frames];
|
||||
@@ -131,6 +147,7 @@ static int parse(AVCodecParserContext *ctx,
|
||||
data += sz; \
|
||||
size -= sz; \
|
||||
} \
|
||||
s->marker_size = size; \
|
||||
parse_frame(ctx, *out_data, *out_size); \
|
||||
return s->n_frames > 0 ? *out_size : full_size
|
||||
|
||||
|
||||
@@ -1271,6 +1271,11 @@ static int decode_packet(AVCodecContext *avctx, void *data, int *got_frame_ptr,
|
||||
}
|
||||
}
|
||||
|
||||
if (remaining_bits(s, gb) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Overread %d\n", -remaining_bits(s, gb));
|
||||
s->packet_loss = 1;
|
||||
}
|
||||
|
||||
if (s->packet_done && !s->packet_loss &&
|
||||
remaining_bits(s, gb) > 0) {
|
||||
/* save the rest of the data so that it can be decoded
|
||||
|
||||
@@ -949,6 +949,7 @@ static int hdcd_envelope(int32_t *samples, int count, int stride, int gain, int
|
||||
int len = FFMIN(count, target_gain - gain);
|
||||
/* attenuate slowly */
|
||||
for (i = 0; i < len; i++) {
|
||||
++gain;
|
||||
APPLY_GAIN(*samples, gain);
|
||||
samples += stride;
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ static av_cold int init(AVFilterContext *ctx)
|
||||
if (!pan->args) {
|
||||
av_log(ctx, AV_LOG_ERROR,
|
||||
"pan filter needs a channel layout and a set "
|
||||
"of channels definitions as parameter\n");
|
||||
"of channel definitions as parameter\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
if (!args)
|
||||
@@ -276,7 +276,7 @@ static int config_props(AVFilterLink *link)
|
||||
if (link->channels > MAX_CHANNELS ||
|
||||
pan->nb_output_channels > MAX_CHANNELS) {
|
||||
av_log(ctx, AV_LOG_ERROR,
|
||||
"af_pan support a maximum of %d channels. "
|
||||
"af_pan supports a maximum of %d channels. "
|
||||
"Feel free to ask for a higher limit.\n", MAX_CHANNELS);
|
||||
return AVERROR_PATCHWELCOME;
|
||||
}
|
||||
|
||||
+13
-13
@@ -344,6 +344,13 @@ struct AVFilterContext {
|
||||
*/
|
||||
AVFilterInternal *internal;
|
||||
|
||||
struct AVFilterCommand *command_queue;
|
||||
|
||||
char *enable_str; ///< enable expression string
|
||||
void *enable; ///< parsed expression (AVExpr*)
|
||||
double *var_values; ///< variable values for the enable expression
|
||||
int is_disabled; ///< the enabled state from the last expression evaluation
|
||||
|
||||
/**
|
||||
* For filters which will create hardware frames, sets the device the
|
||||
* filter should create them in. All other filters will ignore this field:
|
||||
@@ -352,13 +359,6 @@ struct AVFilterContext {
|
||||
* hardware context information.
|
||||
*/
|
||||
AVBufferRef *hw_device_ctx;
|
||||
|
||||
struct AVFilterCommand *command_queue;
|
||||
|
||||
char *enable_str; ///< enable expression string
|
||||
void *enable; ///< parsed expression (AVExpr*)
|
||||
double *var_values; ///< variable values for the enable expression
|
||||
int is_disabled; ///< the enabled state from the last expression evaluation
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -473,12 +473,6 @@ struct AVFilterLink {
|
||||
*/
|
||||
AVRational frame_rate;
|
||||
|
||||
/**
|
||||
* For hwaccel pixel formats, this should be a reference to the
|
||||
* AVHWFramesContext describing the frames.
|
||||
*/
|
||||
AVBufferRef *hw_frames_ctx;
|
||||
|
||||
/**
|
||||
* Buffer partially filled with samples to achieve a fixed/minimum size.
|
||||
*/
|
||||
@@ -550,6 +544,12 @@ struct AVFilterLink {
|
||||
* cleared when a frame is filtered.
|
||||
*/
|
||||
int frame_wanted_out;
|
||||
|
||||
/**
|
||||
* For hwaccel pixel formats, this should be a reference to the
|
||||
* AVHWFramesContext describing the frames.
|
||||
*/
|
||||
AVBufferRef *hw_frames_ctx;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -450,6 +450,7 @@ void ff_blend_rectangle(FFDrawContext *draw, FFDrawColor *color,
|
||||
alpha = 0x101 * color->rgba[3] + 0x2;
|
||||
}
|
||||
nb_planes = draw->nb_planes - !!(draw->desc->flags & AV_PIX_FMT_FLAG_ALPHA);
|
||||
nb_planes += !nb_planes;
|
||||
for (plane = 0; plane < nb_planes; plane++) {
|
||||
nb_comp = draw->pixelstep[plane];
|
||||
p0 = pointer_at(draw, dst, dst_linesize, plane, x0, y0);
|
||||
@@ -627,6 +628,7 @@ void ff_blend_mask(FFDrawContext *draw, FFDrawColor *color,
|
||||
alpha = (0x101 * color->rgba[3] + 0x2) >> 8;
|
||||
}
|
||||
nb_planes = draw->nb_planes - !!(draw->desc->flags & AV_PIX_FMT_FLAG_ALPHA);
|
||||
nb_planes += !nb_planes;
|
||||
for (plane = 0; plane < nb_planes; plane++) {
|
||||
nb_comp = draw->pixelstep[plane];
|
||||
p0 = pointer_at(draw, dst, dst_linesize, plane, x0, y0);
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
#include "libavutil/version.h"
|
||||
|
||||
#define LIBAVFILTER_VERSION_MAJOR 6
|
||||
#define LIBAVFILTER_VERSION_MINOR 46
|
||||
#define LIBAVFILTER_VERSION_MICRO 102
|
||||
#define LIBAVFILTER_VERSION_MINOR 47
|
||||
#define LIBAVFILTER_VERSION_MICRO 100
|
||||
|
||||
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
|
||||
LIBAVFILTER_VERSION_MINOR, \
|
||||
|
||||
@@ -104,8 +104,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
|
||||
#define OFFSET(x) offsetof(BlackFrameContext, x)
|
||||
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
|
||||
static const AVOption blackframe_options[] = {
|
||||
{ "amount", "Percentage of the pixels that have to be below the threshold "
|
||||
"for the frame to be considered black.", OFFSET(bamount), AV_OPT_TYPE_INT, { .i64 = 98 }, 0, 100, FLAGS },
|
||||
{ "amount", "percentage of the pixels that have to be below the threshold "
|
||||
"for the frame to be considered black", OFFSET(bamount), AV_OPT_TYPE_INT, { .i64 = 98 }, 0, 100, FLAGS },
|
||||
{ "threshold", "threshold below which a pixel value is considered black",
|
||||
OFFSET(bthresh), AV_OPT_TYPE_INT, { .i64 = 32 }, 0, 255, FLAGS },
|
||||
{ "thresh", "threshold below which a pixel value is considered black",
|
||||
|
||||
@@ -1008,7 +1008,7 @@ static const AVOption colorspace_options[] = {
|
||||
|
||||
{ "space", "Output colorspace",
|
||||
OFFSET(user_csp), AV_OPT_TYPE_INT, { .i64 = AVCOL_SPC_UNSPECIFIED },
|
||||
AVCOL_PRI_RESERVED0, AVCOL_PRI_NB - 1, FLAGS, "csp" },
|
||||
AVCOL_SPC_RGB, AVCOL_SPC_NB - 1, FLAGS, "csp"},
|
||||
ENUM("bt709", AVCOL_SPC_BT709, "csp"),
|
||||
ENUM("fcc", AVCOL_SPC_FCC, "csp"),
|
||||
ENUM("bt470bg", AVCOL_SPC_BT470BG, "csp"),
|
||||
|
||||
+11
-11
@@ -985,17 +985,6 @@ typedef struct AVStream {
|
||||
int event_flags;
|
||||
#define AVSTREAM_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata.
|
||||
|
||||
/*
|
||||
* Codec parameters associated with this stream. Allocated and freed by
|
||||
* libavformat in avformat_new_stream() and avformat_free_context()
|
||||
* respectively.
|
||||
*
|
||||
* - demuxing: filled by libavformat on stream creation or in
|
||||
* avformat_find_stream_info()
|
||||
* - muxing: filled by the caller before avformat_write_header()
|
||||
*/
|
||||
AVCodecParameters *codecpar;
|
||||
|
||||
/*****************************************************************
|
||||
* All fields below this line are not part of the public API. They
|
||||
* may not be used outside of libavformat and can be changed and
|
||||
@@ -1217,6 +1206,17 @@ typedef struct AVStream {
|
||||
* Must not be accessed in any way by callers.
|
||||
*/
|
||||
AVStreamInternal *internal;
|
||||
|
||||
/*
|
||||
* Codec parameters associated with this stream. Allocated and freed by
|
||||
* libavformat in avformat_new_stream() and avformat_free_context()
|
||||
* respectively.
|
||||
*
|
||||
* - demuxing: filled by libavformat on stream creation or in
|
||||
* avformat_find_stream_info()
|
||||
* - muxing: filled by the caller before avformat_write_header()
|
||||
*/
|
||||
AVCodecParameters *codecpar;
|
||||
} AVStream;
|
||||
|
||||
AVRational av_stream_get_r_frame_rate(const AVStream *s);
|
||||
|
||||
@@ -344,14 +344,14 @@ static void avi_metadata_creation_time(AVDictionary **metadata, char *date)
|
||||
|
||||
static void avi_read_nikon(AVFormatContext *s, uint64_t end)
|
||||
{
|
||||
while (avio_tell(s->pb) < end) {
|
||||
while (avio_tell(s->pb) < end && !avio_feof(s->pb)) {
|
||||
uint32_t tag = avio_rl32(s->pb);
|
||||
uint32_t size = avio_rl32(s->pb);
|
||||
switch (tag) {
|
||||
case MKTAG('n', 'c', 't', 'g'): /* Nikon Tags */
|
||||
{
|
||||
uint64_t tag_end = avio_tell(s->pb) + size;
|
||||
while (avio_tell(s->pb) < tag_end) {
|
||||
while (avio_tell(s->pb) < tag_end && !avio_feof(s->pb)) {
|
||||
uint16_t tag = avio_rl16(s->pb);
|
||||
uint16_t size = avio_rl16(s->pb);
|
||||
const char *name = NULL;
|
||||
@@ -605,9 +605,13 @@ static int avi_read_header(AVFormatContext *s)
|
||||
ast = s->streams[0]->priv_data;
|
||||
av_freep(&s->streams[0]->codecpar->extradata);
|
||||
av_freep(&s->streams[0]->codecpar);
|
||||
av_freep(&s->streams[0]->codec);
|
||||
if (s->streams[0]->info)
|
||||
av_freep(&s->streams[0]->info->duration_error);
|
||||
av_freep(&s->streams[0]->info);
|
||||
if (s->streams[0]->internal)
|
||||
av_freep(&s->streams[0]->internal->avctx);
|
||||
av_freep(&s->streams[0]->internal);
|
||||
av_freep(&s->streams[0]);
|
||||
s->nb_streams = 0;
|
||||
if (CONFIG_DV_DEMUXER) {
|
||||
@@ -1093,6 +1097,8 @@ static int read_gab2_sub(AVFormatContext *s, AVStream *st, AVPacket *pkt)
|
||||
goto error;
|
||||
|
||||
if (!avformat_open_input(&ast->sub_ctx, "", sub_demuxer, NULL)) {
|
||||
if (ast->sub_ctx->nb_streams != 1)
|
||||
goto error;
|
||||
ff_read_packet(ast->sub_ctx, &ast->sub_pkt);
|
||||
avcodec_parameters_copy(st->codecpar, ast->sub_ctx->streams[0]->codecpar);
|
||||
time_base = ast->sub_ctx->streams[0]->time_base;
|
||||
@@ -1849,7 +1855,6 @@ static int avi_read_seek(AVFormatContext *s, int stream_index,
|
||||
continue;
|
||||
|
||||
// av_assert1(st2->codecpar->block_align);
|
||||
av_assert0(fabs(av_q2d(st2->time_base) - ast2->scale / (double)ast2->rate) < av_q2d(st2->time_base) * 0.00000001);
|
||||
index = av_index_search_timestamp(st2,
|
||||
av_rescale_q(timestamp,
|
||||
st->time_base,
|
||||
|
||||
+65
-17
@@ -61,6 +61,11 @@ typedef struct FLVContext {
|
||||
|
||||
int broken_sizes;
|
||||
int sum_flv_tag_size;
|
||||
|
||||
int last_keyframe_stream_index;
|
||||
int keyframe_count;
|
||||
int64_t *keyframe_times;
|
||||
int64_t *keyframe_filepositions;
|
||||
} FLVContext;
|
||||
|
||||
static int probe(AVProbeData *p, int live)
|
||||
@@ -92,8 +97,38 @@ static int live_flv_probe(AVProbeData *p)
|
||||
return probe(p, 1);
|
||||
}
|
||||
|
||||
static void add_keyframes_index(AVFormatContext *s)
|
||||
{
|
||||
FLVContext *flv = s->priv_data;
|
||||
AVStream *stream = NULL;
|
||||
unsigned int i = 0;
|
||||
|
||||
if (flv->last_keyframe_stream_index < 0) {
|
||||
av_log(s, AV_LOG_DEBUG, "keyframe stream hasn't been created\n");
|
||||
return;
|
||||
}
|
||||
|
||||
av_assert0(flv->last_keyframe_stream_index <= s->nb_streams);
|
||||
stream = s->streams[flv->last_keyframe_stream_index];
|
||||
|
||||
if (stream->nb_index_entries == 0) {
|
||||
for (i = 0; i < flv->keyframe_count; i++) {
|
||||
av_add_index_entry(stream, flv->keyframe_filepositions[i],
|
||||
flv->keyframe_times[i] * 1000, 0, 0, AVINDEX_KEYFRAME);
|
||||
}
|
||||
} else
|
||||
av_log(s, AV_LOG_WARNING, "Skipping duplicate index\n");
|
||||
|
||||
if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
|
||||
av_freep(&flv->keyframe_times);
|
||||
av_freep(&flv->keyframe_filepositions);
|
||||
flv->keyframe_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static AVStream *create_stream(AVFormatContext *s, int codec_type)
|
||||
{
|
||||
FLVContext *flv = s->priv_data;
|
||||
AVStream *st = avformat_new_stream(s, NULL);
|
||||
if (!st)
|
||||
return NULL;
|
||||
@@ -104,6 +139,8 @@ static AVStream *create_stream(AVFormatContext *s, int codec_type)
|
||||
s->ctx_flags &= ~AVFMTCTX_NOHEADER;
|
||||
|
||||
avpriv_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */
|
||||
flv->last_keyframe_stream_index = s->nb_streams - 1;
|
||||
add_keyframes_index(s);
|
||||
return st;
|
||||
}
|
||||
|
||||
@@ -305,8 +342,7 @@ static int amf_get_string(AVIOContext *ioc, char *buffer, int buffsize)
|
||||
return length;
|
||||
}
|
||||
|
||||
static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc,
|
||||
AVStream *vstream, int64_t max_pos)
|
||||
static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, int64_t max_pos)
|
||||
{
|
||||
FLVContext *flv = s->priv_data;
|
||||
unsigned int timeslen = 0, fileposlen = 0, i;
|
||||
@@ -316,10 +352,12 @@ static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc,
|
||||
int ret = AVERROR(ENOSYS);
|
||||
int64_t initial_pos = avio_tell(ioc);
|
||||
|
||||
if (vstream->nb_index_entries>0) {
|
||||
av_log(s, AV_LOG_WARNING, "Skipping duplicate index\n");
|
||||
if (flv->keyframe_count > 0) {
|
||||
av_log(s, AV_LOG_DEBUG, "keyframes have been paresed\n");
|
||||
return 0;
|
||||
}
|
||||
av_assert0(!flv->keyframe_times);
|
||||
av_assert0(!flv->keyframe_filepositions);
|
||||
|
||||
if (s->flags & AVFMT_FLAG_IGNIDX)
|
||||
return 0;
|
||||
@@ -368,15 +406,16 @@ static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc,
|
||||
}
|
||||
|
||||
if (timeslen == fileposlen && fileposlen>1 && max_pos <= filepositions[0]) {
|
||||
for (i = 0; i < fileposlen; i++) {
|
||||
av_add_index_entry(vstream, filepositions[i], times[i] * 1000,
|
||||
0, 0, AVINDEX_KEYFRAME);
|
||||
if (i < 2) {
|
||||
flv->validate_index[i].pos = filepositions[i];
|
||||
flv->validate_index[i].dts = times[i] * 1000;
|
||||
flv->validate_count = i + 1;
|
||||
}
|
||||
for (i = 0; i < FFMIN(2,fileposlen); i++) {
|
||||
flv->validate_index[i].pos = filepositions[i];
|
||||
flv->validate_index[i].dts = times[i] * 1000;
|
||||
flv->validate_count = i + 1;
|
||||
}
|
||||
flv->keyframe_times = times;
|
||||
flv->keyframe_filepositions = filepositions;
|
||||
flv->keyframe_count = timeslen;
|
||||
times = NULL;
|
||||
filepositions = NULL;
|
||||
} else {
|
||||
invalid:
|
||||
av_log(s, AV_LOG_WARNING, "Invalid keyframes object, skipping.\n");
|
||||
@@ -418,13 +457,14 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream,
|
||||
}
|
||||
break;
|
||||
case AMF_DATA_TYPE_OBJECT:
|
||||
if ((vstream || astream) && key &&
|
||||
if (key &&
|
||||
ioc->seekable &&
|
||||
!strcmp(KEYFRAMES_TAG, key) && depth == 1)
|
||||
if (parse_keyframes_index(s, ioc, vstream ? vstream : astream,
|
||||
if (parse_keyframes_index(s, ioc,
|
||||
max_pos) < 0)
|
||||
av_log(s, AV_LOG_ERROR, "Keyframe index parsing failed\n");
|
||||
|
||||
else
|
||||
add_keyframes_index(s);
|
||||
while (avio_tell(ioc) < max_pos - 2 &&
|
||||
amf_get_string(ioc, str_val, sizeof(str_val)) > 0)
|
||||
if (amf_parse_object(s, astream, vstream, str_val, max_pos,
|
||||
@@ -574,6 +614,7 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream,
|
||||
|
||||
static int flv_read_metabody(AVFormatContext *s, int64_t next_pos)
|
||||
{
|
||||
FLVContext *flv = s->priv_data;
|
||||
AMFDataType type;
|
||||
AVStream *stream, *astream, *vstream;
|
||||
AVStream av_unused *dstream;
|
||||
@@ -612,10 +653,14 @@ static int flv_read_metabody(AVFormatContext *s, int64_t next_pos)
|
||||
// the lookup every time it is called.
|
||||
for (i = 0; i < s->nb_streams; i++) {
|
||||
stream = s->streams[i];
|
||||
if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
|
||||
if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
|
||||
vstream = stream;
|
||||
else if (stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
|
||||
flv->last_keyframe_stream_index = i;
|
||||
} else if (stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||
astream = stream;
|
||||
if (flv->last_keyframe_stream_index == -1)
|
||||
flv->last_keyframe_stream_index = i;
|
||||
}
|
||||
else if (stream->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
|
||||
dstream = stream;
|
||||
}
|
||||
@@ -643,6 +688,7 @@ static int flv_read_header(AVFormatContext *s)
|
||||
|
||||
s->start_time = 0;
|
||||
flv->sum_flv_tag_size = 0;
|
||||
flv->last_keyframe_stream_index = -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -653,6 +699,8 @@ static int flv_read_close(AVFormatContext *s)
|
||||
FLVContext *flv = s->priv_data;
|
||||
for (i=0; i<FLV_STREAM_TYPE_NB; i++)
|
||||
av_freep(&flv->new_extradata[i]);
|
||||
av_freep(&flv->keyframe_times);
|
||||
av_freep(&flv->keyframe_filepositions);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+84
-33
@@ -98,7 +98,11 @@ struct playlist {
|
||||
int index;
|
||||
AVFormatContext *ctx;
|
||||
AVPacket pkt;
|
||||
int stream_offset;
|
||||
|
||||
/* main demuxer streams associated with this playlist
|
||||
* indexed by the subdemuxer stream indexes */
|
||||
AVStream **main_streams;
|
||||
int n_main_streams;
|
||||
|
||||
int finished;
|
||||
enum PlaylistType type;
|
||||
@@ -239,6 +243,7 @@ static void free_playlist_list(HLSContext *c)
|
||||
struct playlist *pls = c->playlists[i];
|
||||
free_segment_list(pls);
|
||||
free_init_section_list(pls);
|
||||
av_freep(&pls->main_streams);
|
||||
av_freep(&pls->renditions);
|
||||
av_freep(&pls->id3_buf);
|
||||
av_dict_free(&pls->id3_initial);
|
||||
@@ -411,10 +416,10 @@ static struct segment *new_init_section(struct playlist *pls,
|
||||
}
|
||||
|
||||
if (info->byterange[0]) {
|
||||
sec->size = atoi(info->byterange);
|
||||
sec->size = strtoll(info->byterange, NULL, 10);
|
||||
ptr = strchr(info->byterange, '@');
|
||||
if (ptr)
|
||||
sec->url_offset = atoi(ptr+1);
|
||||
sec->url_offset = strtoll(ptr+1, NULL, 10);
|
||||
} else {
|
||||
/* the entire file is the init section */
|
||||
sec->size = -1;
|
||||
@@ -590,7 +595,7 @@ static void update_options(char **dest, const char *name, void *src)
|
||||
}
|
||||
|
||||
static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url,
|
||||
AVDictionary *opts, AVDictionary *opts2)
|
||||
AVDictionary *opts, AVDictionary *opts2, int *is_http)
|
||||
{
|
||||
HLSContext *c = s->priv_data;
|
||||
AVDictionary *tmp = NULL;
|
||||
@@ -631,6 +636,9 @@ static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url,
|
||||
|
||||
av_dict_free(&tmp);
|
||||
|
||||
if (is_http)
|
||||
*is_http = av_strstart(proto_name, "http", NULL);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -723,7 +731,7 @@ static int parse_playlist(HLSContext *c, const char *url,
|
||||
ret = ensure_playlist(c, &pls, url);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
pls->target_duration = atoi(ptr) * AV_TIME_BASE;
|
||||
pls->target_duration = strtoll(ptr, NULL, 10) * AV_TIME_BASE;
|
||||
} else if (av_strstart(line, "#EXT-X-MEDIA-SEQUENCE:", &ptr)) {
|
||||
ret = ensure_playlist(c, &pls, url);
|
||||
if (ret < 0)
|
||||
@@ -752,10 +760,10 @@ static int parse_playlist(HLSContext *c, const char *url,
|
||||
is_segment = 1;
|
||||
duration = atof(ptr) * AV_TIME_BASE;
|
||||
} else if (av_strstart(line, "#EXT-X-BYTERANGE:", &ptr)) {
|
||||
seg_size = atoi(ptr);
|
||||
seg_size = strtoll(ptr, NULL, 10);
|
||||
ptr = strchr(ptr, '@');
|
||||
if (ptr)
|
||||
seg_offset = atoi(ptr+1);
|
||||
seg_offset = strtoll(ptr+1, NULL, 10);
|
||||
} else if (av_strstart(line, "#", NULL)) {
|
||||
continue;
|
||||
} else if (line[0]) {
|
||||
@@ -1072,6 +1080,7 @@ static int open_input(HLSContext *c, struct playlist *pls, struct segment *seg)
|
||||
{
|
||||
AVDictionary *opts = NULL;
|
||||
int ret;
|
||||
int is_http = 0;
|
||||
|
||||
// broker prior HTTP options that should be consistent across requests
|
||||
av_dict_set(&opts, "user-agent", c->user_agent, 0);
|
||||
@@ -1091,13 +1100,13 @@ static int open_input(HLSContext *c, struct playlist *pls, struct segment *seg)
|
||||
seg->url, seg->url_offset, pls->index);
|
||||
|
||||
if (seg->key_type == KEY_NONE) {
|
||||
ret = open_url(pls->parent, &pls->input, seg->url, c->avio_opts, opts);
|
||||
ret = open_url(pls->parent, &pls->input, seg->url, c->avio_opts, opts, &is_http);
|
||||
} else if (seg->key_type == KEY_AES_128) {
|
||||
AVDictionary *opts2 = NULL;
|
||||
char iv[33], key[33], url[MAX_URL_SIZE];
|
||||
if (strcmp(seg->key, pls->key_url)) {
|
||||
AVIOContext *pb;
|
||||
if (open_url(pls->parent, &pb, seg->key, c->avio_opts, opts) == 0) {
|
||||
if (open_url(pls->parent, &pb, seg->key, c->avio_opts, opts, NULL) == 0) {
|
||||
ret = avio_read(pb, pls->key, sizeof(pls->key));
|
||||
if (ret != sizeof(pls->key)) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Unable to read key file %s\n",
|
||||
@@ -1122,7 +1131,7 @@ static int open_input(HLSContext *c, struct playlist *pls, struct segment *seg)
|
||||
av_dict_set(&opts2, "key", key, 0);
|
||||
av_dict_set(&opts2, "iv", iv, 0);
|
||||
|
||||
ret = open_url(pls->parent, &pls->input, url, opts2, opts);
|
||||
ret = open_url(pls->parent, &pls->input, url, opts2, opts, &is_http);
|
||||
|
||||
av_dict_free(&opts2);
|
||||
|
||||
@@ -1140,8 +1149,15 @@ static int open_input(HLSContext *c, struct playlist *pls, struct segment *seg)
|
||||
|
||||
/* Seek to the requested position. If this was a HTTP request, the offset
|
||||
* should already be where want it to, but this allows e.g. local testing
|
||||
* without a HTTP server. */
|
||||
if (ret == 0 && seg->key_type == KEY_NONE && seg->url_offset) {
|
||||
* without a HTTP server.
|
||||
*
|
||||
* This is not done for HTTP at all as avio_seek() does internal bookkeeping
|
||||
* of file offset which is out-of-sync with the actual offset when "offset"
|
||||
* AVOption is used with http protocol, causing the seek to not be a no-op
|
||||
* as would be expected. Wrong offset received from the server will not be
|
||||
* noticed without the call, though.
|
||||
*/
|
||||
if (ret == 0 && !is_http && seg->key_type == KEY_NONE && seg->url_offset) {
|
||||
int64_t seekret = avio_seek(pls->input, seg->url_offset, SEEK_SET);
|
||||
if (seekret < 0) {
|
||||
av_log(pls->parent, AV_LOG_ERROR, "Unable to seek to offset %"PRId64" of HLS segment '%s'\n", seg->url_offset, seg->url);
|
||||
@@ -1237,13 +1253,13 @@ restart:
|
||||
|
||||
/* Check that the playlist is still needed before opening a new
|
||||
* segment. */
|
||||
if (v->ctx && v->ctx->nb_streams &&
|
||||
v->parent->nb_streams >= v->stream_offset + v->ctx->nb_streams) {
|
||||
if (v->ctx && v->ctx->nb_streams) {
|
||||
v->needed = 0;
|
||||
for (i = v->stream_offset; i < v->stream_offset + v->ctx->nb_streams;
|
||||
i++) {
|
||||
if (v->parent->streams[i]->discard < AVDISCARD_ALL)
|
||||
for (i = 0; i < v->n_main_streams; i++) {
|
||||
if (v->main_streams[i]->discard < AVDISCARD_ALL) {
|
||||
v->needed = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!v->needed) {
|
||||
@@ -1381,8 +1397,8 @@ static void add_metadata_from_renditions(AVFormatContext *s, struct playlist *pl
|
||||
int rend_idx = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < pls->ctx->nb_streams; i++) {
|
||||
AVStream *st = s->streams[pls->stream_offset + i];
|
||||
for (i = 0; i < pls->n_main_streams; i++) {
|
||||
AVStream *st = pls->main_streams[i];
|
||||
|
||||
if (st->codecpar->codec_type != type)
|
||||
continue;
|
||||
@@ -1508,7 +1524,8 @@ static int hls_read_header(AVFormatContext *s)
|
||||
{
|
||||
void *u = (s->flags & AVFMT_FLAG_CUSTOM_IO) ? NULL : s->pb;
|
||||
HLSContext *c = s->priv_data;
|
||||
int ret = 0, i, j, stream_offset = 0;
|
||||
int ret = 0, i, j;
|
||||
int highest_cur_seq_no = 0;
|
||||
|
||||
c->ctx = s;
|
||||
c->interrupt_callback = &s->interrupt_callback;
|
||||
@@ -1583,6 +1600,17 @@ static int hls_read_header(AVFormatContext *s)
|
||||
add_renditions_to_variant(c, var, AVMEDIA_TYPE_SUBTITLE, var->subtitles_group);
|
||||
}
|
||||
|
||||
/* Select the starting segments */
|
||||
for (i = 0; i < c->n_playlists; i++) {
|
||||
struct playlist *pls = c->playlists[i];
|
||||
|
||||
if (pls->n_segments == 0)
|
||||
continue;
|
||||
|
||||
pls->cur_seq_no = select_cur_seq_no(c, pls);
|
||||
highest_cur_seq_no = FFMAX(highest_cur_seq_no, pls->cur_seq_no);
|
||||
}
|
||||
|
||||
/* Open the demuxer for each playlist */
|
||||
for (i = 0; i < c->n_playlists; i++) {
|
||||
struct playlist *pls = c->playlists[i];
|
||||
@@ -1599,7 +1627,18 @@ static int hls_read_header(AVFormatContext *s)
|
||||
pls->index = i;
|
||||
pls->needed = 1;
|
||||
pls->parent = s;
|
||||
pls->cur_seq_no = select_cur_seq_no(c, pls);
|
||||
|
||||
/*
|
||||
* If this is a live stream and this playlist looks like it is one segment
|
||||
* behind, try to sync it up so that every substream starts at the same
|
||||
* time position (so e.g. avformat_find_stream_info() will see packets from
|
||||
* all active streams within the first few seconds). This is not very generic,
|
||||
* though, as the sequence numbers are technically independent.
|
||||
*/
|
||||
if (!pls->finished && pls->cur_seq_no == highest_cur_seq_no - 1 &&
|
||||
highest_cur_seq_no < pls->start_seq_no + pls->n_segments) {
|
||||
pls->cur_seq_no = highest_cur_seq_no;
|
||||
}
|
||||
|
||||
pls->read_buffer = av_malloc(INITIAL_BUFFER_SIZE);
|
||||
if (!pls->read_buffer){
|
||||
@@ -1625,7 +1664,6 @@ static int hls_read_header(AVFormatContext *s)
|
||||
}
|
||||
pls->ctx->pb = &pls->pb;
|
||||
pls->ctx->io_open = nested_io_open;
|
||||
pls->stream_offset = stream_offset;
|
||||
|
||||
if ((ret = ff_copy_whiteblacklists(pls->ctx, s)) < 0)
|
||||
goto fail;
|
||||
@@ -1665,13 +1703,13 @@ static int hls_read_header(AVFormatContext *s)
|
||||
avpriv_set_pts_info(st, 33, 1, MPEG_TIME_BASE);
|
||||
else
|
||||
avpriv_set_pts_info(st, ist->pts_wrap_bits, ist->time_base.num, ist->time_base.den);
|
||||
|
||||
dynarray_add(&pls->main_streams, &pls->n_main_streams, st);
|
||||
}
|
||||
|
||||
add_metadata_from_renditions(s, pls, AVMEDIA_TYPE_AUDIO);
|
||||
add_metadata_from_renditions(s, pls, AVMEDIA_TYPE_VIDEO);
|
||||
add_metadata_from_renditions(s, pls, AVMEDIA_TYPE_SUBTITLE);
|
||||
|
||||
stream_offset += pls->ctx->nb_streams;
|
||||
}
|
||||
|
||||
/* Create a program for each variant */
|
||||
@@ -1689,10 +1727,10 @@ static int hls_read_header(AVFormatContext *s)
|
||||
int is_shared = playlist_in_multiple_variants(c, pls);
|
||||
int k;
|
||||
|
||||
for (k = 0; k < pls->ctx->nb_streams; k++) {
|
||||
struct AVStream *st = s->streams[pls->stream_offset + k];
|
||||
for (k = 0; k < pls->n_main_streams; k++) {
|
||||
struct AVStream *st = pls->main_streams[k];
|
||||
|
||||
av_program_add_stream_index(s, i, pls->stream_offset + k);
|
||||
av_program_add_stream_index(s, i, st->index);
|
||||
|
||||
/* Set variant_bitrate for streams unique to this variant */
|
||||
if (!is_shared && v->bandwidth)
|
||||
@@ -1871,8 +1909,17 @@ static int hls_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
/* If we got a packet, return it */
|
||||
if (minplaylist >= 0) {
|
||||
struct playlist *pls = c->playlists[minplaylist];
|
||||
|
||||
if (pls->pkt.stream_index >= pls->n_main_streams) {
|
||||
av_log(s, AV_LOG_ERROR, "stream index inconsistency: index %d, %d main streams, %d subdemuxer streams\n",
|
||||
pls->pkt.stream_index, pls->n_main_streams, pls->ctx->nb_streams);
|
||||
av_packet_unref(&pls->pkt);
|
||||
reset_packet(&pls->pkt);
|
||||
return AVERROR_BUG;
|
||||
}
|
||||
|
||||
*pkt = pls->pkt;
|
||||
pkt->stream_index += pls->stream_offset;
|
||||
pkt->stream_index = pls->main_streams[pls->pkt.stream_index]->index;
|
||||
reset_packet(&c->playlists[minplaylist]->pkt);
|
||||
|
||||
if (pkt->dts != AV_NOPTS_VALUE)
|
||||
@@ -1904,6 +1951,8 @@ static int hls_read_seek(AVFormatContext *s, int stream_index,
|
||||
HLSContext *c = s->priv_data;
|
||||
struct playlist *seek_pls = NULL;
|
||||
int i, seq_no;
|
||||
int j;
|
||||
int stream_subdemuxer_index;
|
||||
int64_t first_timestamp, seek_timestamp, duration;
|
||||
|
||||
if ((flags & AVSEEK_FLAG_BYTE) ||
|
||||
@@ -1927,10 +1976,12 @@ static int hls_read_seek(AVFormatContext *s, int stream_index,
|
||||
/* find the playlist with the specified stream */
|
||||
for (i = 0; i < c->n_playlists; i++) {
|
||||
struct playlist *pls = c->playlists[i];
|
||||
if (stream_index >= pls->stream_offset &&
|
||||
stream_index - pls->stream_offset < pls->ctx->nb_streams) {
|
||||
seek_pls = pls;
|
||||
break;
|
||||
for (j = 0; j < pls->n_main_streams; j++) {
|
||||
if (pls->main_streams[j] == s->streams[stream_index]) {
|
||||
seek_pls = pls;
|
||||
stream_subdemuxer_index = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* check if the timestamp is valid for the playlist with the
|
||||
@@ -1940,7 +1991,7 @@ static int hls_read_seek(AVFormatContext *s, int stream_index,
|
||||
|
||||
/* set segment now so we do not need to search again below */
|
||||
seek_pls->cur_seq_no = seq_no;
|
||||
seek_pls->seek_stream_index = stream_index - seek_pls->stream_offset;
|
||||
seek_pls->seek_stream_index = stream_subdemuxer_index;
|
||||
|
||||
for (i = 0; i < c->n_playlists; i++) {
|
||||
/* Reset reading */
|
||||
|
||||
@@ -193,6 +193,8 @@ static int rtmp_open(URLContext *s, const char *uri, int flags)
|
||||
|
||||
if (sep)
|
||||
p = sep + 1;
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ctx->playpath) {
|
||||
|
||||
+16
-2
@@ -43,6 +43,7 @@
|
||||
#include "libavutil/sha.h"
|
||||
#include "libavutil/timecode.h"
|
||||
#include "libavcodec/ac3tab.h"
|
||||
#include "libavcodec/mpegaudiodecheader.h"
|
||||
#include "avformat.h"
|
||||
#include "internal.h"
|
||||
#include "avio_internal.h"
|
||||
@@ -2843,7 +2844,12 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
|
||||
sample_size = sc->stsz_sample_size > 0 ? sc->stsz_sample_size : sc->sample_sizes[current_sample];
|
||||
if (sc->pseudo_stream_id == -1 ||
|
||||
sc->stsc_data[stsc_index].id - 1 == sc->pseudo_stream_id) {
|
||||
AVIndexEntry *e = &st->index_entries[st->nb_index_entries++];
|
||||
AVIndexEntry *e;
|
||||
if (sample_size > 0x3FFFFFFF) {
|
||||
av_log(mov->fc, AV_LOG_ERROR, "Sample size %u is too large\n", sample_size);
|
||||
return;
|
||||
}
|
||||
e = &st->index_entries[st->nb_index_entries++];
|
||||
e->pos = current_offset;
|
||||
e->timestamp = current_dts;
|
||||
e->size = sample_size;
|
||||
@@ -2968,6 +2974,10 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
|
||||
av_log(mov->fc, AV_LOG_ERROR, "wrong chunk count %d\n", total);
|
||||
return;
|
||||
}
|
||||
if (size > 0x3FFFFFFF) {
|
||||
av_log(mov->fc, AV_LOG_ERROR, "Sample size %u is too large\n", size);
|
||||
return;
|
||||
}
|
||||
e = &st->index_entries[st->nb_index_entries++];
|
||||
e->pos = current_offset;
|
||||
e->timestamp = current_dts;
|
||||
@@ -3233,7 +3243,7 @@ static int mov_read_keys(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
|
||||
avio_skip(pb, 4);
|
||||
count = avio_rb32(pb);
|
||||
if (count > UINT_MAX / sizeof(*c->meta_keys)) {
|
||||
if (count > UINT_MAX / sizeof(*c->meta_keys) - 1) {
|
||||
av_log(c->fc, AV_LOG_ERROR,
|
||||
"The 'keys' atom with the invalid key count: %d\n", count);
|
||||
return AVERROR_INVALIDDATA;
|
||||
@@ -5213,6 +5223,10 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
if (st->codecpar->codec_id == AV_CODEC_ID_MP3 && !st->need_parsing && pkt->size > 4) {
|
||||
if (ff_mpa_check_header(AV_RB32(pkt->data)) < 0)
|
||||
st->need_parsing = AVSTREAM_PARSE_FULL;
|
||||
}
|
||||
}
|
||||
|
||||
pkt->stream_index = sc->ffindex;
|
||||
|
||||
+29
-6
@@ -4592,15 +4592,10 @@ static int mov_auto_flush_fragment(AVFormatContext *s, int force)
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
static int check_pkt(AVFormatContext *s, AVPacket *pkt)
|
||||
{
|
||||
MOVMuxContext *mov = s->priv_data;
|
||||
AVIOContext *pb = s->pb;
|
||||
MOVTrack *trk = &mov->tracks[pkt->stream_index];
|
||||
AVCodecParameters *par = trk->par;
|
||||
unsigned int samples_in_chunk = 0;
|
||||
int size = pkt->size, ret = 0;
|
||||
uint8_t *reformatted_data = NULL;
|
||||
|
||||
if (trk->entry) {
|
||||
int64_t duration = pkt->dts - trk->cluster[trk->entry - 1].dts;
|
||||
@@ -4612,11 +4607,35 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
pkt->dts = trk->cluster[trk->entry - 1].dts + 1;
|
||||
pkt->pts = AV_NOPTS_VALUE;
|
||||
}
|
||||
} else if (pkt->dts <= INT_MIN || pkt->dts >= INT_MAX) {
|
||||
av_log(s, AV_LOG_ERROR, "Application provided initial timestamp: %"PRId64" is out of range for mov/mp4 format\n",
|
||||
pkt->dts
|
||||
);
|
||||
|
||||
pkt->dts = 0;
|
||||
pkt->pts = AV_NOPTS_VALUE;
|
||||
}
|
||||
if (pkt->duration < 0 || pkt->duration > INT_MAX) {
|
||||
av_log(s, AV_LOG_ERROR, "Application provided duration: %"PRId64" is invalid\n", pkt->duration);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
{
|
||||
MOVMuxContext *mov = s->priv_data;
|
||||
AVIOContext *pb = s->pb;
|
||||
MOVTrack *trk = &mov->tracks[pkt->stream_index];
|
||||
AVCodecParameters *par = trk->par;
|
||||
unsigned int samples_in_chunk = 0;
|
||||
int size = pkt->size, ret = 0;
|
||||
uint8_t *reformatted_data = NULL;
|
||||
|
||||
ret = check_pkt(s, pkt);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (mov->flags & FF_MOV_FLAG_FRAGMENT) {
|
||||
int ret;
|
||||
if (mov->moov_written || mov->flags & FF_MOV_FLAG_EMPTY_MOOV) {
|
||||
@@ -4882,6 +4901,10 @@ static int mov_write_single_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
int64_t frag_duration = 0;
|
||||
int size = pkt->size;
|
||||
|
||||
int ret = check_pkt(s, pkt);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (mov->flags & FF_MOV_FLAG_FRAG_DISCONT) {
|
||||
int i;
|
||||
for (i = 0; i < s->nb_streams; i++)
|
||||
|
||||
@@ -827,7 +827,7 @@ static inline int mxf_read_utf16_string(AVIOContext *pb, int size, char** str, i
|
||||
int ret;
|
||||
size_t buf_size;
|
||||
|
||||
if (size < 0)
|
||||
if (size < 0 || size > INT_MAX/2)
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
buf_size = size + size / 2 + 1;
|
||||
|
||||
@@ -162,6 +162,11 @@ ogg_gptopts (AVFormatContext * s, int i, uint64_t gp, int64_t *dts)
|
||||
if (dts)
|
||||
*dts = pts;
|
||||
}
|
||||
if (pts > INT64_MAX && pts != AV_NOPTS_VALUE) {
|
||||
// The return type is unsigned, we thus cannot return negative pts
|
||||
av_log(s, AV_LOG_ERROR, "invalid pts %"PRId64"\n", pts);
|
||||
pts = AV_NOPTS_VALUE;
|
||||
}
|
||||
|
||||
return pts;
|
||||
}
|
||||
|
||||
@@ -82,7 +82,11 @@ static uint64_t vp8_gptopts(AVFormatContext *s, int idx,
|
||||
struct ogg *ogg = s->priv_data;
|
||||
struct ogg_stream *os = ogg->streams + idx;
|
||||
|
||||
uint64_t pts = (granule >> 32);
|
||||
int invcnt = !((granule >> 30) & 3);
|
||||
// If page granule is that of an invisible vp8 frame, its pts will be
|
||||
// that of the end of the next visible frame. We substract 1 for those
|
||||
// to prevent messing up pts calculations.
|
||||
uint64_t pts = (granule >> 32) - invcnt;
|
||||
uint32_t dist = (granule >> 3) & 0x07ffffff;
|
||||
|
||||
if (!dist)
|
||||
|
||||
@@ -101,7 +101,7 @@ int ff_wms_parse_sdp_a_line(AVFormatContext *s, const char *p)
|
||||
{
|
||||
int ret = 0;
|
||||
if (av_strstart(p, "pgmpu:data:application/vnd.ms.wms-hdr.asfv1;base64,", &p)) {
|
||||
AVIOContext pb;
|
||||
AVIOContext pb = { 0 };
|
||||
RTSPState *rt = s->priv_data;
|
||||
AVDictionary *opts = NULL;
|
||||
int len = strlen(p) * 6 / 8;
|
||||
|
||||
@@ -119,10 +119,10 @@ retry:
|
||||
z->avail_out = buf_size;
|
||||
|
||||
ret = inflate(z, Z_NO_FLUSH);
|
||||
if (ret < 0)
|
||||
return AVERROR(EINVAL);
|
||||
if (ret == Z_STREAM_END)
|
||||
return AVERROR_EOF;
|
||||
if (ret != Z_OK)
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
if (buf_size - z->avail_out == 0)
|
||||
goto retry;
|
||||
|
||||
+26
-12
@@ -307,7 +307,7 @@ static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
|
||||
int score;
|
||||
AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
|
||||
|
||||
if (fmt && st->request_probe <= score) {
|
||||
if (fmt) {
|
||||
int i;
|
||||
av_log(s, AV_LOG_DEBUG,
|
||||
"Probe with size=%d, packets=%d detected %s with score=%d\n",
|
||||
@@ -318,6 +318,9 @@ static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
|
||||
if (fmt_id_type[i].type != AVMEDIA_TYPE_AUDIO &&
|
||||
st->codecpar->sample_rate)
|
||||
continue;
|
||||
if (st->request_probe > score &&
|
||||
st->codecpar->codec_id != fmt_id_type[i].id)
|
||||
continue;
|
||||
st->codecpar->codec_id = fmt_id_type[i].id;
|
||||
st->codecpar->codec_type = fmt_id_type[i].type;
|
||||
st->internal->need_context_update = 1;
|
||||
@@ -1483,6 +1486,15 @@ static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
#if FF_API_LAVF_AVCTX
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
/* update deprecated public codec context */
|
||||
ret = avcodec_parameters_to_context(st->codec, st->codecpar);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
#endif
|
||||
|
||||
st->internal->need_context_update = 0;
|
||||
}
|
||||
|
||||
@@ -2402,6 +2414,7 @@ int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
|
||||
max_ts = av_rescale_rnd(max_ts, time_base.den,
|
||||
time_base.num * (int64_t)AV_TIME_BASE,
|
||||
AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
|
||||
stream_index = 0;
|
||||
}
|
||||
|
||||
ret = s->iformat->read_seek2(s, stream_index, min_ts,
|
||||
@@ -2491,7 +2504,7 @@ static void update_stream_timings(AVFormatContext *ic)
|
||||
end_time1 = av_rescale_q_rnd(st->duration, st->time_base,
|
||||
AV_TIME_BASE_Q,
|
||||
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
|
||||
if (end_time1 != AV_NOPTS_VALUE && start_time1 <= INT64_MAX - end_time1) {
|
||||
if (end_time1 != AV_NOPTS_VALUE && (end_time1 > 0 ? start_time1 <= INT64_MAX - end_time1 : start_time1 >= INT64_MIN - end_time1)) {
|
||||
end_time1 += start_time1;
|
||||
end_time = FFMAX(end_time, end_time1);
|
||||
}
|
||||
@@ -3315,6 +3328,17 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
|
||||
if (!avctx->time_base.num)
|
||||
avctx->time_base = st->time_base;
|
||||
}
|
||||
|
||||
/* check if the caller has overridden the codec id */
|
||||
#if FF_API_LAVF_AVCTX
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
if (st->codec->codec_id != st->internal->orig_codec_id) {
|
||||
st->codecpar->codec_id = st->codec->codec_id;
|
||||
st->codecpar->codec_type = st->codec->codec_type;
|
||||
st->internal->orig_codec_id = st->codec->codec_id;
|
||||
}
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
#endif
|
||||
// only for the split stuff
|
||||
if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE) && st->request_probe <= 0) {
|
||||
st->parser = av_parser_init(st->codecpar->codec_id);
|
||||
@@ -3331,16 +3355,6 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
|
||||
}
|
||||
}
|
||||
|
||||
/* check if the caller has overridden the codec id */
|
||||
#if FF_API_LAVF_AVCTX
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
if (st->codec->codec_id != st->internal->orig_codec_id) {
|
||||
st->codecpar->codec_id = st->codec->codec_id;
|
||||
st->codecpar->codec_type = st->codec->codec_type;
|
||||
st->internal->orig_codec_id = st->codec->codec_id;
|
||||
}
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
#endif
|
||||
if (st->codecpar->codec_id != st->internal->orig_codec_id)
|
||||
st->internal->orig_codec_id = st->codecpar->codec_id;
|
||||
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
// Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium)
|
||||
// Also please add any ticket numbers that you belive might be affected here
|
||||
#define LIBAVFORMAT_VERSION_MAJOR 57
|
||||
#define LIBAVFORMAT_VERSION_MINOR 40
|
||||
#define LIBAVFORMAT_VERSION_MICRO 101
|
||||
#define LIBAVFORMAT_VERSION_MINOR 41
|
||||
#define LIBAVFORMAT_VERSION_MICRO 100
|
||||
|
||||
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
||||
LIBAVFORMAT_VERSION_MINOR, \
|
||||
|
||||
@@ -36,8 +36,8 @@ static int vplayer_probe(AVProbeData *p)
|
||||
char c;
|
||||
const unsigned char *ptr = p->buf;
|
||||
|
||||
if ((sscanf(ptr, "%*d:%*d:%*d.%*d%c", &c) == 1 ||
|
||||
sscanf(ptr, "%*d:%*d:%*d%c", &c) == 1) && strchr(": =", c))
|
||||
if ((sscanf(ptr, "%*3d:%*2d:%*2d.%*2d%c", &c) == 1 ||
|
||||
sscanf(ptr, "%*3d:%*2d:%*2d%c", &c) == 1) && strchr(": =", c))
|
||||
return AVPROBE_SCORE_MAX;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1031,7 +1031,7 @@ static int read_header(AVFormatContext *s)
|
||||
while (1) {
|
||||
uint64_t frame_nb = avio_rl64(pb);
|
||||
uint64_t position = avio_rl64(pb);
|
||||
while (frame_nb > e->size && e <= e_end) {
|
||||
while (e <= e_end && frame_nb > e->size) {
|
||||
e->pos = last_position;
|
||||
e++;
|
||||
}
|
||||
|
||||
+5
-6
@@ -427,12 +427,6 @@ typedef struct AVFrame {
|
||||
|
||||
enum AVChromaLocation chroma_location;
|
||||
|
||||
/**
|
||||
* For hwaccel-format frames, this should be a reference to the
|
||||
* AVHWFramesContext describing the frame.
|
||||
*/
|
||||
AVBufferRef *hw_frames_ctx;
|
||||
|
||||
/**
|
||||
* frame timestamp estimated using various heuristics, in stream time base
|
||||
* Code outside libavutil should access this field using:
|
||||
@@ -524,6 +518,11 @@ typedef struct AVFrame {
|
||||
*/
|
||||
AVBufferRef *qp_table_buf;
|
||||
#endif
|
||||
/**
|
||||
* For hwaccel-format frames, this should be a reference to the
|
||||
* AVHWFramesContext describing the frame.
|
||||
*/
|
||||
AVBufferRef *hw_frames_ctx;
|
||||
} AVFrame;
|
||||
|
||||
/**
|
||||
|
||||
@@ -115,8 +115,10 @@ static struct {
|
||||
MAP(BGRX, RGB32, BGR0),
|
||||
MAP(RGBA, RGB32, RGBA),
|
||||
MAP(RGBX, RGB32, RGB0),
|
||||
#ifdef VA_FOURCC_ABGR
|
||||
MAP(ABGR, RGB32, ABGR),
|
||||
MAP(XBGR, RGB32, 0BGR),
|
||||
#endif
|
||||
MAP(ARGB, RGB32, ARGB),
|
||||
MAP(XRGB, RGB32, 0RGB),
|
||||
};
|
||||
|
||||
@@ -85,12 +85,12 @@
|
||||
#else // !(__mips == 64)
|
||||
#define LD(psrc) \
|
||||
( { \
|
||||
uint8_t *psrc_m = (uint8_t *) (psrc); \
|
||||
uint8_t *psrc_ld_m = (uint8_t *) (psrc); \
|
||||
uint32_t val0_m, val1_m; \
|
||||
uint64_t val_m = 0; \
|
||||
\
|
||||
val0_m = LW(psrc_m); \
|
||||
val1_m = LW(psrc_m + 4); \
|
||||
val0_m = LW(psrc_ld_m); \
|
||||
val1_m = LW(psrc_ld_m + 4); \
|
||||
\
|
||||
val_m = (uint64_t) (val1_m); \
|
||||
val_m = (uint64_t) ((val_m << 32) & 0xFFFFFFFF00000000); \
|
||||
@@ -172,12 +172,12 @@
|
||||
#else // !(__mips == 64)
|
||||
#define LD(psrc) \
|
||||
( { \
|
||||
uint8_t *psrc_m1 = (uint8_t *) (psrc); \
|
||||
uint8_t *psrc_ld_m = (uint8_t *) (psrc); \
|
||||
uint32_t val0_m, val1_m; \
|
||||
uint64_t val_m = 0; \
|
||||
\
|
||||
val0_m = LW(psrc_m1); \
|
||||
val1_m = LW(psrc_m1 + 4); \
|
||||
val0_m = LW(psrc_ld_m); \
|
||||
val1_m = LW(psrc_ld_m + 4); \
|
||||
\
|
||||
val_m = (uint64_t) (val1_m); \
|
||||
val_m = (uint64_t) ((val_m << 32) & 0xFFFFFFFF00000000); \
|
||||
|
||||
+2
-2
@@ -58,7 +58,7 @@
|
||||
* The following example illustrates an AVOptions-enabled struct:
|
||||
* @code
|
||||
* typedef struct test_struct {
|
||||
* AVClass *class;
|
||||
* const AVClass *class;
|
||||
* int int_opt;
|
||||
* char *str_opt;
|
||||
* uint8_t *bin_opt;
|
||||
@@ -96,7 +96,7 @@
|
||||
* @code
|
||||
* test_struct *alloc_test_struct(void)
|
||||
* {
|
||||
* test_struct *ret = av_malloc(sizeof(*ret));
|
||||
* test_struct *ret = av_mallocz(sizeof(*ret));
|
||||
* ret->class = &test_class;
|
||||
* av_opt_set_defaults(ret);
|
||||
* return ret;
|
||||
|
||||
+1
-1
@@ -64,7 +64,7 @@
|
||||
*/
|
||||
|
||||
#define LIBAVUTIL_VERSION_MAJOR 55
|
||||
#define LIBAVUTIL_VERSION_MINOR 27
|
||||
#define LIBAVUTIL_VERSION_MINOR 28
|
||||
#define LIBAVUTIL_VERSION_MICRO 100
|
||||
|
||||
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
|
||||
|
||||
@@ -352,6 +352,7 @@ static int packed_16bpc_bswap(SwsContext *c, const uint8_t *src[],
|
||||
int min_stride = FFMIN(FFABS(srcstr), FFABS(dststr));
|
||||
if(!dstPtr || !srcPtr)
|
||||
continue;
|
||||
dstPtr += (srcSliceY >> c->chrDstVSubSample) * dststr;
|
||||
for (i = 0; i < (srcSliceH >> c->chrDstVSubSample); i++) {
|
||||
for (j = 0; j < min_stride; j++) {
|
||||
dstPtr[j] = av_bswap16(srcPtr[j]);
|
||||
@@ -557,6 +558,8 @@ static int Rgb16ToPlanarRgb16Wrapper(SwsContext *c, const uint8_t *src[],
|
||||
int bpc = dst_format->comp[0].depth;
|
||||
int alpha = src_format->flags & AV_PIX_FMT_FLAG_ALPHA;
|
||||
int swap = 0;
|
||||
int i;
|
||||
|
||||
if ( HAVE_BIGENDIAN && !(src_format->flags & AV_PIX_FMT_FLAG_BE) ||
|
||||
!HAVE_BIGENDIAN && src_format->flags & AV_PIX_FMT_FLAG_BE)
|
||||
swap++;
|
||||
@@ -570,6 +573,12 @@ static int Rgb16ToPlanarRgb16Wrapper(SwsContext *c, const uint8_t *src[],
|
||||
src_format->name, dst_format->name);
|
||||
return srcSliceH;
|
||||
}
|
||||
|
||||
for(i=0; i<4; i++) {
|
||||
dst2013[i] += stride2013[i] * srcSliceY / 2;
|
||||
dst1023[i] += stride1023[i] * srcSliceY / 2;
|
||||
}
|
||||
|
||||
switch (c->srcFormat) {
|
||||
case AV_PIX_FMT_RGB48LE:
|
||||
case AV_PIX_FMT_RGB48BE:
|
||||
|
||||
@@ -89,7 +89,7 @@ static const struct {
|
||||
#if CONFIG_JPEG2000_DECODER
|
||||
{ "jpeg2000dsp", checkasm_check_jpeg2000dsp },
|
||||
#endif
|
||||
#if CONFIG_PIXBLOCKDSP
|
||||
#if CONFIG_PIXBLOCKDSP && !(ARCH_PPC64 && HAVE_BIGENDIAN)
|
||||
{ "pixblockdsp", checkasm_check_pixblockdsp },
|
||||
#endif
|
||||
#if CONFIG_V210_ENCODER
|
||||
|
||||
+1
-1
@@ -375,7 +375,7 @@ static int read_tfra(struct Tracks *tracks, int start_index, AVIOContext *f)
|
||||
track->duration -
|
||||
track->offsets[track->chunks - 1].time;
|
||||
}
|
||||
// Now try and read the actual durations from the trun sample data.
|
||||
// Now try to read the actual durations from the trun sample data.
|
||||
for (i = 0; i < track->chunks; i++) {
|
||||
int64_t duration = read_moof_duration(f, track->offsets[i].offset);
|
||||
if (duration > 0 && llabs(duration - track->offsets[i].duration) > 3) {
|
||||
|
||||
Reference in New Issue
Block a user