From 9b1165acf6d7365bb88fe91d469cab9c758775da Mon Sep 17 00:00:00 2001 From: Chris Burgener Date: Fri, 24 Feb 2017 20:02:05 -0500 Subject: [PATCH] Update Windows ffmpeg to 3.2.4 --- Externals/ffmpeg/include/libavcodec/avcodec.h | 1147 ++++++++++++++--- Externals/ffmpeg/include/libavcodec/dirac.h | 18 + Externals/ffmpeg/include/libavcodec/dxva2.h | 6 +- Externals/ffmpeg/include/libavcodec/jni.h | 46 + .../ffmpeg/include/libavcodec/mediacodec.h | 88 ++ .../ffmpeg/include/libavcodec/old_codec_ids.h | 397 ------ Externals/ffmpeg/include/libavcodec/version.h | 26 +- .../ffmpeg/include/libavcodec/vorbis_parser.h | 7 +- .../ffmpeg/include/libavformat/avformat.h | 246 +++- Externals/ffmpeg/include/libavformat/avio.h | 82 +- .../ffmpeg/include/libavformat/version.h | 18 +- Externals/ffmpeg/include/libavutil/adler32.h | 13 +- .../ffmpeg/include/libavutil/audio_fifo.h | 17 + .../ffmpeg/include/libavutil/audioconvert.h | 6 - Externals/ffmpeg/include/libavutil/avassert.h | 11 +- Externals/ffmpeg/include/libavutil/avconfig.h | 1 - Externals/ffmpeg/include/libavutil/avstring.h | 7 +- Externals/ffmpeg/include/libavutil/avutil.h | 22 +- Externals/ffmpeg/include/libavutil/base64.h | 9 +- Externals/ffmpeg/include/libavutil/buffer.h | 18 +- Externals/ffmpeg/include/libavutil/common.h | 21 +- Externals/ffmpeg/include/libavutil/cpu.h | 2 +- Externals/ffmpeg/include/libavutil/crc.h | 16 +- Externals/ffmpeg/include/libavutil/dict.h | 10 +- Externals/ffmpeg/include/libavutil/display.h | 1 + .../ffmpeg/include/libavutil/ffversion.h | 2 +- Externals/ffmpeg/include/libavutil/file.h | 1 + Externals/ffmpeg/include/libavutil/frame.h | 48 +- Externals/ffmpeg/include/libavutil/hash.h | 191 ++- .../ffmpeg/include/libavutil/hwcontext.h | 429 ++++++ .../ffmpeg/include/libavutil/hwcontext_cuda.h | 46 + .../include/libavutil/hwcontext_dxva2.h | 72 ++ .../ffmpeg/include/libavutil/hwcontext_qsv.h | 53 + .../include/libavutil/hwcontext_vaapi.h | 82 ++ .../include/libavutil/hwcontext_vdpau.h | 44 + Externals/ffmpeg/include/libavutil/imgutils.h | 14 + Externals/ffmpeg/include/libavutil/log.h | 19 +- .../libavutil/mastering_display_metadata.h | 89 ++ .../ffmpeg/include/libavutil/mathematics.h | 143 +- Externals/ffmpeg/include/libavutil/md5.h | 10 +- Externals/ffmpeg/include/libavutil/mem.h | 752 +++++++---- Externals/ffmpeg/include/libavutil/murmur3.h | 82 ++ .../ffmpeg/include/libavutil/old_pix_fmts.h | 177 --- Externals/ffmpeg/include/libavutil/opt.h | 6 +- Externals/ffmpeg/include/libavutil/pixdesc.h | 204 +-- Externals/ffmpeg/include/libavutil/pixfmt.h | 73 +- Externals/ffmpeg/include/libavutil/rational.h | 119 +- .../ffmpeg/include/libavutil/replaygain.h | 1 - Externals/ffmpeg/include/libavutil/ripemd.h | 10 +- .../ffmpeg/include/libavutil/samplefmt.h | 3 +- Externals/ffmpeg/include/libavutil/sha.h | 18 +- Externals/ffmpeg/include/libavutil/sha512.h | 21 +- Externals/ffmpeg/include/libavutil/stereo3d.h | 18 + .../ffmpeg/include/libavutil/threadmessage.h | 16 +- .../ffmpeg/include/libavutil/timestamp.h | 2 +- Externals/ffmpeg/include/libavutil/tree.h | 6 +- Externals/ffmpeg/include/libavutil/version.h | 40 +- .../ffmpeg/include/libswresample/swresample.h | 36 +- .../ffmpeg/include/libswresample/version.h | 10 +- Externals/ffmpeg/include/libswscale/swscale.h | 44 +- Externals/ffmpeg/include/libswscale/version.h | 6 +- Externals/ffmpeg/lib/avcodec.lib | Bin 8775744 -> 9307376 bytes Externals/ffmpeg/lib/avformat.lib | Bin 2889980 -> 3176114 bytes Externals/ffmpeg/lib/avutil.lib | Bin 2972570 -> 3213090 bytes Externals/ffmpeg/lib/swresample.lib | Bin 751418 -> 778612 bytes Externals/ffmpeg/lib/swscale.lib | Bin 3255786 -> 3263296 bytes 66 files changed, 3767 insertions(+), 1355 deletions(-) create mode 100644 Externals/ffmpeg/include/libavcodec/jni.h create mode 100644 Externals/ffmpeg/include/libavcodec/mediacodec.h delete mode 100644 Externals/ffmpeg/include/libavcodec/old_codec_ids.h delete mode 100644 Externals/ffmpeg/include/libavutil/audioconvert.h create mode 100644 Externals/ffmpeg/include/libavutil/hwcontext.h create mode 100644 Externals/ffmpeg/include/libavutil/hwcontext_cuda.h create mode 100644 Externals/ffmpeg/include/libavutil/hwcontext_dxva2.h create mode 100644 Externals/ffmpeg/include/libavutil/hwcontext_qsv.h create mode 100644 Externals/ffmpeg/include/libavutil/hwcontext_vaapi.h create mode 100644 Externals/ffmpeg/include/libavutil/hwcontext_vdpau.h create mode 100644 Externals/ffmpeg/include/libavutil/mastering_display_metadata.h delete mode 100644 Externals/ffmpeg/include/libavutil/old_pix_fmts.h diff --git a/Externals/ffmpeg/include/libavcodec/avcodec.h b/Externals/ffmpeg/include/libavcodec/avcodec.h index f365775f0b..e5e7f4225d 100644 --- a/Externals/ffmpeg/include/libavcodec/avcodec.h +++ b/Externals/ffmpeg/include/libavcodec/avcodec.h @@ -43,7 +43,9 @@ #include "version.h" /** - * @defgroup libavc Encoding/Decoding Library + * @defgroup libavc libavcodec + * Encoding/Decoding Library + * * @{ * * @defgroup lavc_decoding Decoding @@ -70,7 +72,95 @@ * @{ * @} * @} + */ + +/** + * @ingroup libavc + * @defgroup lavc_encdec send/receive encoding and decoding API overview + * @{ * + * The avcodec_send_packet()/avcodec_receive_frame()/avcodec_send_frame()/ + * avcodec_receive_packet() functions provide an encode/decode API, which + * decouples input and output. + * + * The API is very similar for encoding/decoding and audio/video, and works as + * follows: + * - Set up and open the AVCodecContext as usual. + * - Send valid input: + * - For decoding, call avcodec_send_packet() to give the decoder raw + * compressed data in an AVPacket. + * - For encoding, call avcodec_send_frame() to give the decoder an AVFrame + * containing uncompressed audio or video. + * In both cases, it is recommended that AVPackets and AVFrames are + * refcounted, or libavcodec might have to copy the input data. (libavformat + * always returns refcounted AVPackets, and av_frame_get_buffer() allocates + * refcounted AVFrames.) + * - Receive output in a loop. Periodically call one of the avcodec_receive_*() + * functions and process their output: + * - For decoding, call avcodec_receive_frame(). On success, it will return + * an AVFrame containing uncompressed audio or video data. + * - For encoding, call avcodec_receive_packet(). On success, it will return + * an AVPacket with a compressed frame. + * Repeat this call until it returns AVERROR(EAGAIN) or an error. The + * AVERROR(EAGAIN) return value means that new input data is required to + * return new output. In this case, continue with sending input. For each + * input frame/packet, the codec will typically return 1 output frame/packet, + * but it can also be 0 or more than 1. + * + * At the beginning of decoding or encoding, the codec might accept multiple + * input frames/packets without returning a frame, until its internal buffers + * are filled. This situation is handled transparently if you follow the steps + * outlined above. + * + * End of stream situations. These require "flushing" (aka draining) the codec, + * as the codec might buffer multiple frames or packets internally for + * performance or out of necessity (consider B-frames). + * This is handled as follows: + * - Instead of valid input, send NULL to the avcodec_send_packet() (decoding) + * or avcodec_send_frame() (encoding) functions. This will enter draining + * mode. + * - Call avcodec_receive_frame() (decoding) or avcodec_receive_packet() + * (encoding) in a loop until AVERROR_EOF is returned. The functions will + * not return AVERROR(EAGAIN), unless you forgot to enter draining mode. + * - Before decoding can be resumed again, the codec has to be reset with + * avcodec_flush_buffers(). + * + * Using the API as outlined above is highly recommended. But it is also + * possible to call functions outside of this rigid schema. For example, you can + * call avcodec_send_packet() repeatedly without calling + * avcodec_receive_frame(). In this case, avcodec_send_packet() will succeed + * until the codec's internal buffer has been filled up (which is typically of + * size 1 per output frame, after initial input), and then reject input with + * AVERROR(EAGAIN). Once it starts rejecting input, you have no choice but to + * read at least some output. + * + * Not all codecs will follow a rigid and predictable dataflow; the only + * guarantee is that an AVERROR(EAGAIN) return value on a send/receive call on + * one end implies that a receive/send call on the other end will succeed. In + * general, no codec will permit unlimited buffering of input or output. + * + * This API replaces the following legacy functions: + * - avcodec_decode_video2() and avcodec_decode_audio4(): + * Use avcodec_send_packet() to feed input to the decoder, then use + * avcodec_receive_frame() to receive decoded frames after each packet. + * Unlike with the old video decoding API, multiple frames might result from + * a packet. For audio, splitting the input packet into frames by partially + * decoding packets becomes transparent to the API user. You never need to + * feed an AVPacket to the API twice. + * Additionally, sending a flush/draining packet is required only once. + * - avcodec_encode_video2()/avcodec_encode_audio2(): + * Use avcodec_send_frame() to feed input to the encoder, then use + * avcodec_receive_packet() to receive encoded packets. + * Providing user-allocated buffers for avcodec_receive_packet() is not + * possible. + * - The new API does not handle subtitles yet. + * + * Mixing new and old function calls on the same AVCodecContext is not allowed, + * and will result in undefined behavior. + * + * Some codecs might require using the new API; using the old API will return + * an error when calling it. + * @} */ /** @@ -92,7 +182,7 @@ * details. * * If you add a codec ID to this list, add it so that - * 1. no value of a existing codec ID changes (that would break ABI), + * 1. no value of an existing codec ID changes (that would break ABI), * 2. it is as close as possible to similar codecs * * After adding new codec IDs, do not forget to add an entry to the codec @@ -315,6 +405,12 @@ enum AVCodecID { AV_CODEC_ID_SMVJPEG, AV_CODEC_ID_APNG, AV_CODEC_ID_DAALA, + AV_CODEC_ID_CFHD, + AV_CODEC_ID_TRUEMOTION2RT, + AV_CODEC_ID_M101, + AV_CODEC_ID_MAGICYUV, + AV_CODEC_ID_SHEERVIDEO, + AV_CODEC_ID_YLC, /* various PCM "codecs" */ AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs @@ -349,9 +445,9 @@ enum AVCodecID { AV_CODEC_ID_PCM_S24LE_PLANAR, AV_CODEC_ID_PCM_S32LE_PLANAR, AV_CODEC_ID_PCM_S16BE_PLANAR, - /* new PCM "codecs" should be added right below this line starting with - * an explicit value of for example 0x10800 - */ + + AV_CODEC_ID_PCM_S64LE = 0x10800, + AV_CODEC_ID_PCM_S64BE, /* various ADPCM codecs */ AV_CODEC_ID_ADPCM_IMA_QT = 0x11000, @@ -397,6 +493,8 @@ enum AVCodecID { AV_CODEC_ID_ADPCM_THP_LE, AV_CODEC_ID_ADPCM_PSX, AV_CODEC_ID_ADPCM_AICA, + AV_CODEC_ID_ADPCM_IMA_DAT4, + AV_CODEC_ID_ADPCM_MTAF, /* AMR */ AV_CODEC_ID_AMR_NB = 0x12000, @@ -499,6 +597,7 @@ enum AVCodecID { AV_CODEC_ID_INTERPLAY_ACM, AV_CODEC_ID_XMA1, AV_CODEC_ID_XMA2, + AV_CODEC_ID_DST, /* subtitle codecs */ AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs. @@ -532,6 +631,7 @@ enum AVCodecID { AV_CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs. AV_CODEC_ID_TTF = 0x18000, + AV_CODEC_ID_SCTE_35, ///< Contain timestamp estimated through PCR of program stream. AV_CODEC_ID_BINTEXT = 0x18800, AV_CODEC_ID_XBIN, AV_CODEC_ID_IDF, @@ -784,7 +884,7 @@ typedef struct RcOverride{ * Use only bitexact stuff (except (I)DCT). */ #define AV_CODEC_FLAG_BITEXACT (1 << 23) -/* Fx : Flag for h263+ extra options */ +/* Fx : Flag for H.263+ extra options */ /** * H.263 advanced intra coding / MPEG-4 AC prediction */ @@ -835,6 +935,10 @@ typedef struct RcOverride{ * Do not skip samples and export skip information as frame side data */ #define AV_CODEC_FLAG2_SKIP_MANUAL (1 << 29) +/** + * Do not reset ASS ReadOrder field on flush (subtitles decoding) + */ +#define AV_CODEC_FLAG2_RO_FLUSH_NOOP (1 << 30) /* Unsupported options : * Syntax Arithmetic coding (SAC) @@ -897,7 +1001,7 @@ typedef struct RcOverride{ * are connected to a parser to split what they return into proper frames. * This flag is reserved to the very rare category of codecs which have a * bitstream that cannot be split into frames without timeconsuming - * operations like full decoding. Demuxers carring such bitstreams thus + * operations like full decoding. Demuxers carrying such bitstreams thus * may return multiple frames in a packet. This has many disadvantages like * prohibiting stream copy in many cases thus it should only be considered * as a last resort. @@ -932,6 +1036,16 @@ typedef struct RcOverride{ * Audio encoder supports receiving a different number of samples in each call. */ #define AV_CODEC_CAP_VARIABLE_FRAME_SIZE (1 << 16) +/** + * Decoder is not a preferred choice for probing. + * This indicates that the decoder is not a good choice for probing. + * It could for example be an expensive to spin up hardware decoder, + * or it could simply not provide a lot of useful information about + * the stream. + * A decoder marked with this flag should only be used as last resort + * choice for probing. + */ +#define AV_CODEC_CAP_AVOID_PROBING (1 << 17) /** * Codec is intra only. */ @@ -1077,7 +1191,7 @@ typedef struct RcOverride{ * are connected to a parser to split what they return into proper frames. * This flag is reserved to the very rare category of codecs which have a * bitstream that cannot be split into frames without timeconsuming - * operations like full decoding. Demuxers carring such bitstreams thus + * operations like full decoding. Demuxers carrying such bitstreams thus * may return multiple frames in a packet. This has many disadvantages like * prohibiting stream copy in many cases thus it should only be considered * as a last resort. @@ -1157,7 +1271,7 @@ typedef struct RcOverride{ #define MB_TYPE_L0L1 (MB_TYPE_L0 | MB_TYPE_L1) #define MB_TYPE_QUANT 0x00010000 #define MB_TYPE_CBP 0x00020000 -//Note bits 24-31 are reserved for codec specific use (h264 ref0, mpeg1 0mv, ...) +// Note bits 24-31 are reserved for codec specific use (H.264 ref0, MPEG-1 0mv, ...) #endif /** @@ -1247,6 +1361,14 @@ typedef struct AVCPBProperties { */ enum AVPacketSideDataType { AV_PKT_DATA_PALETTE, + + /** + * The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format + * that the extradata buffer was changed and the receiving side should + * act upon it appropriately. The new extradata is embedded in the side + * data buffer and should be immediately used for processing the current + * frame or packet. + */ AV_PKT_DATA_NEW_EXTRADATA, /** @@ -1402,6 +1524,19 @@ enum AVPacketSideDataType { * side data includes updated metadata which appeared in the stream. */ AV_PKT_DATA_METADATA_UPDATE, + + /** + * MPEGTS stream ID, this is required to pass the stream ID + * information from the demuxer to the corresponding muxer. + */ + AV_PKT_DATA_MPEGTS_STREAM_ID, + + /** + * Mastering display metadata (based on SMPTE-2086:2014). This metadata + * should be associated with a video stream and containts data in the form + * of the AVMasteringDisplayMetadata struct. + */ + AV_PKT_DATA_MASTERING_DISPLAY_METADATA }; #define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED @@ -1497,6 +1632,12 @@ typedef struct AVPacket { } AVPacket; #define AV_PKT_FLAG_KEY 0x0001 ///< The packet contains a keyframe #define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted +/** + * Flag is used to discard packets which are required to maintain valid + * decoder state but are not required for output and should be dropped + * after decoding. + **/ +#define AV_PKT_FLAG_DISCARD 0x0004 enum AVSideDataParamChangeFlags { AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001, @@ -1526,6 +1667,10 @@ enum AVFieldOrder { * version bump. * Please use AVOptions (av_opt* / av_set/get*()) to access these fields from user * applications. + * The name string for AVOptions options matches the associated command line + * parameter name and can be found in libavcodec/options_table.h + * The AVOption/command line parameter names differ in some cases from the C + * structure field names for historic reasons or brevity. * sizeof(AVCodecContext) must not be used outside libav*. */ typedef struct AVCodecContext { @@ -1634,9 +1779,9 @@ typedef struct AVCodecContext { /** * some codecs need / can use extradata like Huffman tables. - * mjpeg: Huffman tables + * MJPEG: Huffman tables * rv10: additional flags - * mpeg4: global headers (they can be in the bitstream or here) + * MPEG-4: global headers (they can be in the bitstream or here) * The allocated memory should be AV_INPUT_BUFFER_PADDING_SIZE bytes larger * than extradata_size to avoid problems if it is read with the bitstream reader. * The bytewise contents of extradata must not depend on the architecture or CPU endianness. @@ -1652,7 +1797,15 @@ typedef struct AVCodecContext { * timebase should be 1/framerate and timestamp increments should be * identically 1. * This often, but not always is the inverse of the frame rate or field rate - * for video. + * for video. 1/time_base is not the average frame rate if the frame rate is not + * constant. + * + * Like containers, elementary streams also can store timestamps, 1/time_base + * is the unit in which these timestamps are specified. + * As example of such codec time base see ISO/IEC 14496-2:2001(E) + * vop_time_increment_resolution and fixed_vop_rate + * (fixed_vop_rate == 0 implies that it is different from the framerate) + * * - encoding: MUST be set by user. * - decoding: the use of this field for decoding is deprecated. * Use framerate instead. @@ -1698,7 +1851,7 @@ typedef struct AVCodecContext { * picture width / height. * * @note Those fields may not match the values of the last - * AVFrame outputted by avcodec_decode_video2 due frame + * AVFrame output by avcodec_decode_video2 due frame * reordering. * * - encoding: MUST be set by user. @@ -1714,7 +1867,7 @@ typedef struct AVCodecContext { * the decoded frame is cropped before being output or lowres is enabled. * * @note Those field may not match the value of the last - * AVFrame outputted by avcodec_decode_video2 due frame + * AVFrame output by avcodec_receive_frame() due frame * reordering. * * - encoding: unused @@ -1741,7 +1894,7 @@ typedef struct AVCodecContext { * May be overridden by the decoder if it knows better. * * @note This field may not match the value of the last - * AVFrame outputted by avcodec_decode_video2 due frame + * AVFrame output by avcodec_receive_frame() due frame * reordering. * * - encoding: Set by user. @@ -1823,7 +1976,11 @@ typedef struct AVCodecContext { #define FF_RC_STRATEGY_XVID 1 #endif +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated int b_frame_strategy; +#endif /** * qscale offset between IP and B-frames @@ -1840,16 +1997,15 @@ typedef struct AVCodecContext { */ int has_b_frames; - /** - * 0-> h263 quant 1-> mpeg quant - * - encoding: Set by user. - * - decoding: unused - */ +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated int mpeg_quant; +#endif /** - * qscale factor between P and I-frames - * If > 0 then the last p frame quantizer will be used (q= lastp_q*factor+offset). + * qscale factor between P- and I-frames + * If > 0 then the last P-frame quantizer will be used (q = lastp_q * factor + offset). * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). * - encoding: Set by user. * - decoding: unused @@ -1904,15 +2060,15 @@ typedef struct AVCodecContext { * - decoding: Set by user (or 0). */ int slice_count; - /** - * prediction method (needed for huffyuv) - * - encoding: Set by user. - * - decoding: unused - */ + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated int prediction_method; #define FF_PRED_LEFT 0 #define FF_PRED_PLANE 1 #define FF_PRED_MEDIAN 2 +#endif /** * slice offsets in the frame in bytes @@ -1954,22 +2110,23 @@ typedef struct AVCodecContext { * - decoding: unused */ int ildct_cmp; -#define FF_CMP_SAD 0 -#define FF_CMP_SSE 1 -#define FF_CMP_SATD 2 -#define FF_CMP_DCT 3 -#define FF_CMP_PSNR 4 -#define FF_CMP_BIT 5 -#define FF_CMP_RD 6 -#define FF_CMP_ZERO 7 -#define FF_CMP_VSAD 8 -#define FF_CMP_VSSE 9 -#define FF_CMP_NSSE 10 -#define FF_CMP_W53 11 -#define FF_CMP_W97 12 -#define FF_CMP_DCTMAX 13 -#define FF_CMP_DCT264 14 -#define FF_CMP_CHROMA 256 +#define FF_CMP_SAD 0 +#define FF_CMP_SSE 1 +#define FF_CMP_SATD 2 +#define FF_CMP_DCT 3 +#define FF_CMP_PSNR 4 +#define FF_CMP_BIT 5 +#define FF_CMP_RD 6 +#define FF_CMP_ZERO 7 +#define FF_CMP_VSAD 8 +#define FF_CMP_VSSE 9 +#define FF_CMP_NSSE 10 +#define FF_CMP_W53 11 +#define FF_CMP_W97 12 +#define FF_CMP_DCTMAX 13 +#define FF_CMP_DCT264 14 +#define FF_CMP_MEDIAN_SAD 15 +#define FF_CMP_CHROMA 256 /** * ME diamond size & shape @@ -1985,12 +2142,11 @@ typedef struct AVCodecContext { */ int last_predictor_count; - /** - * prepass for motion estimation - * - encoding: Set by user. - * - decoding: unused - */ +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated int pre_me; +#endif /** * motion estimation prepass comparison function @@ -2062,7 +2218,7 @@ typedef struct AVCodecContext { */ int slice_flags; #define SLICE_FLAG_CODED_ORDER 0x0001 ///< draw_horiz_band() is called in coded order instead of display -#define SLICE_FLAG_ALLOW_FIELD 0x0002 ///< allow draw_horiz_band() with field slices (MPEG2 field pics) +#define SLICE_FLAG_ALLOW_FIELD 0x0002 ///< allow draw_horiz_band() with field slices (MPEG-2 field pics) #define SLICE_FLAG_ALLOW_PLANE 0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1) #if FF_API_XVMC @@ -2099,20 +2255,15 @@ typedef struct AVCodecContext { */ uint16_t *inter_matrix; - /** - * scene change detection threshold - * 0 is default, larger means fewer detected scene changes. - * - encoding: Set by user. - * - decoding: unused - */ +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated int scenechange_threshold; - /** - * noise reduction strength - * - encoding: Set by user. - * - decoding: unused - */ + /** @deprecated use encoder private options instead */ + attribute_deprecated int noise_reduction; +#endif #if FF_API_MPV_OPT /** @@ -2158,39 +2309,38 @@ typedef struct AVCodecContext { #endif /** - * minimum MB lagrange multipler + * minimum MB Lagrange multiplier * - encoding: Set by user. * - decoding: unused */ int mb_lmin; /** - * maximum MB lagrange multipler + * maximum MB Lagrange multiplier * - encoding: Set by user. * - decoding: unused */ int mb_lmax; +#if FF_API_PRIVATE_OPT /** - * - * - encoding: Set by user. - * - decoding: unused + * @deprecated use encoder private options instead */ + attribute_deprecated int me_penalty_compensation; +#endif /** - * * - encoding: Set by user. * - decoding: unused */ int bidir_refine; - /** - * - * - encoding: Set by user. - * - decoding: unused - */ +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated int brd_scale; +#endif /** * minimum GOP size @@ -2206,12 +2356,11 @@ typedef struct AVCodecContext { */ int refs; - /** - * chroma qp offset from luma - * - encoding: Set by user. - * - decoding: unused - */ +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated int chromaoffset; +#endif #if FF_API_UNUSED_MEMBERS /** @@ -2223,19 +2372,17 @@ typedef struct AVCodecContext { #endif /** - * * Note: Value depends upon the compare function used for fullpel ME. * - encoding: Set by user. * - decoding: unused */ int mv0_threshold; - /** - * Adjust sensitivity of b_frame_strategy 1. - * - encoding: Set by user. - * - decoding: unused - */ +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated int b_sensitivity; +#endif /** * Chromaticity coordinates of the source primaries. @@ -2389,7 +2536,7 @@ typedef struct AVCodecContext { * to all data planes. data[] must hold as many pointers as it can. * extended_data must be allocated with av_malloc() and will be freed in * av_frame_unref(). - * * otherwise exended_data must point to data + * * otherwise extended_data must point to data * - buf[] must contain one or more pointers to AVBufferRef structures. Each of * the frame's data and extended_data pointers must be contained in these. That * is, one AVBufferRef for each allocated chunk of memory, not necessarily one @@ -2453,6 +2600,8 @@ typedef struct AVCodecContext { * Otherwise, the decoded frames must not be freed by the caller and are * only valid until the next decode call. * + * This is always automatically enabled if avcodec_receive_frame() is used. + * * - encoding: unused * - decoding: set by the caller before avcodec_open2(). */ @@ -2580,12 +2729,11 @@ typedef struct AVCodecContext { int coder_type; #endif /* FF_API_CODER_TYPE */ - /** - * context model - * - encoding: Set by user. - * - decoding: unused - */ +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated int context_model; +#endif #if FF_API_MPV_OPT /** @@ -2601,33 +2749,23 @@ typedef struct AVCodecContext { int lmax; #endif - /** - * frame skip threshold - * - encoding: Set by user. - * - decoding: unused - */ +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated int frame_skip_threshold; - /** - * frame skip factor - * - encoding: Set by user. - * - decoding: unused - */ + /** @deprecated use encoder private options instead */ + attribute_deprecated int frame_skip_factor; - /** - * frame skip exponent - * - encoding: Set by user. - * - decoding: unused - */ + /** @deprecated use encoder private options instead */ + attribute_deprecated int frame_skip_exp; - /** - * frame skip comparison function - * - encoding: Set by user. - * - decoding: unused - */ + /** @deprecated use encoder private options instead */ + attribute_deprecated int frame_skip_cmp; +#endif /* FF_API_PRIVATE_OPT */ /** * trellis RD quantization @@ -2636,24 +2774,19 @@ typedef struct AVCodecContext { */ int trellis; - /** - * - encoding: Set by user. - * - decoding: unused - */ +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated int min_prediction_order; - /** - * - encoding: Set by user. - * - decoding: unused - */ + /** @deprecated use encoder private options instead */ + attribute_deprecated int max_prediction_order; - /** - * GOP timecode frame start number - * - encoding: Set by user, in non drop frame format - * - decoding: Set by libavcodec (timecode in the 25 bits format, -1 if unset) - */ + /** @deprecated use encoder private options instead */ + attribute_deprecated int64_t timecode_frame_start; +#endif #if FF_API_RTP_CALLBACK /** @@ -2669,12 +2802,16 @@ typedef struct AVCodecContext { void (*rtp_callback)(struct AVCodecContext *avctx, void *data, int size, int mb_nb); #endif +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated int rtp_payload_size; /* The size of the RTP payload: the coder will */ /* do its best to deliver a chunk with size */ /* below rtp_payload_size, the chunk will start */ /* with a start code on some codecs like H.263. */ /* This doesn't take account of any particular */ /* headers inside the transmitted RTP payload. */ +#endif #if FF_API_STAT_BITS /* statistics, used for 2-pass encoding */ @@ -2741,9 +2878,10 @@ typedef struct AVCodecContext { #define FF_BUG_DC_CLIP 4096 #define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders. #define FF_BUG_TRUNCATED 16384 +#define FF_BUG_IEDGE 32768 /** - * strictly follow the standard (MPEG4, ...). + * strictly follow the standard (MPEG-4, ...). * - encoding: Set by user. * - decoding: Set by user. * Setting this to STRICT or higher means the encoder and decoder will @@ -2814,9 +2952,9 @@ typedef struct AVCodecContext { * - decoding: Set by user. */ int debug_mv; -#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 //visualize forward predicted MVs of P frames -#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 //visualize forward predicted MVs of B frames -#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames +#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 // visualize forward predicted MVs of P-frames +#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 // visualize forward predicted MVs of B-frames +#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 // visualize backward predicted MVs of B-frames #endif /** @@ -2844,7 +2982,7 @@ typedef struct AVCodecContext { /** - * opaque 64bit number (generally a PTS) that will be reordered and + * opaque 64-bit number (generally a PTS) that will be reordered and * output in AVFrame.reordered_opaque * - encoding: unused * - decoding: Set by user. @@ -3056,6 +3194,13 @@ typedef struct AVCodecContext { #define FF_PROFILE_MPEG2_AAC_LOW 128 #define FF_PROFILE_MPEG2_AAC_HE 131 +#define FF_PROFILE_DNXHD 0 +#define FF_PROFILE_DNXHR_LB 1 +#define FF_PROFILE_DNXHR_SQ 2 +#define FF_PROFILE_DNXHR_HQ 3 +#define FF_PROFILE_DNXHR_HQX 4 +#define FF_PROFILE_DNXHR_444 5 + #define FF_PROFILE_DTS 20 #define FF_PROFILE_DTS_ES 30 #define FF_PROFILE_DTS_96_24 40 @@ -3080,8 +3225,10 @@ typedef struct AVCodecContext { #define FF_PROFILE_H264_HIGH 100 #define FF_PROFILE_H264_HIGH_10 110 #define FF_PROFILE_H264_HIGH_10_INTRA (110|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_MULTIVIEW_HIGH 118 #define FF_PROFILE_H264_HIGH_422 122 #define FF_PROFILE_H264_HIGH_422_INTRA (122|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_STEREO_HIGH 128 #define FF_PROFILE_H264_HIGH_444 144 #define FF_PROFILE_H264_HIGH_444_PREDICTIVE 244 #define FF_PROFILE_H264_HIGH_444_INTRA (244|FF_PROFILE_H264_INTRA) @@ -3109,9 +3256,9 @@ typedef struct AVCodecContext { #define FF_PROFILE_MPEG4_SIMPLE_STUDIO 14 #define FF_PROFILE_MPEG4_ADVANCED_SIMPLE 15 -#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 0 -#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 1 -#define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 2 +#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 1 +#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 2 +#define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 32768 #define FF_PROFILE_JPEG2000_DCINEMA_2K 3 #define FF_PROFILE_JPEG2000_DCINEMA_4K 4 @@ -3223,7 +3370,8 @@ typedef struct AVCodecContext { * - decoding: For codecs that store a framerate value in the compressed * bitstream, the decoder may export it here. { 0, 1} when * unknown. - * - encoding: unused + * - encoding: May be used to signal the framerate of CFR content to an + * encoder. */ AVRational framerate; @@ -3371,6 +3519,51 @@ typedef struct AVCodecContext { AVPacketSideData *coded_side_data; int nb_coded_side_data; + /** + * A reference to the AVHWFramesContext describing the input (for encoding) + * or output (decoding) frames. The reference is set by the caller and + * afterwards owned (and freed) by libavcodec. + * + * - decoding: This field should be set by the caller from the get_format() + * callback. The previous reference (if any) will always be + * unreffed by libavcodec before the get_format() call. + * + * If the default get_buffer2() is used with a hwaccel pixel + * format, then this AVHWFramesContext will be used for + * allocating the frame buffers. + * + * - encoding: For hardware encoders configured to use a hwaccel pixel + * format, this field should be set by the caller to a reference + * to the AVHWFramesContext describing input frames. + * AVHWFramesContext.format must be equal to + * AVCodecContext.pix_fmt. + * + * This field should be set before avcodec_open2() is called. + */ + AVBufferRef *hw_frames_ctx; + + /** + * Control the form of AVSubtitle.rects[N]->ass + * - decoding: set by user + * - encoding: unused + */ + int sub_text_format; +#define FF_SUB_TEXT_FMT_ASS 0 +#if FF_API_ASS_TIMING +#define FF_SUB_TEXT_FMT_ASS_WITH_TIMINGS 1 +#endif + + /** + * Audio only. The amount of padding (in samples) appended by the encoder to + * the end of the audio. I.e. this number of decoded samples must be + * discarded by the caller from the end of the stream to get the original + * audio without any trailing padding. + * + * - decoding: unused + * - encoding: unused + */ + int trailing_padding; + } AVCodecContext; AVRational av_codec_get_pkt_timebase (const AVCodecContext *avctx); @@ -3490,6 +3683,21 @@ typedef struct AVCodec { int *got_packet_ptr); int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt); int (*close)(AVCodecContext *); + /** + * Decode/encode API with decoupled packet/frame dataflow. The API is the + * same as the avcodec_ prefixed APIs (avcodec_send_frame() etc.), except + * that: + * - never called if the codec is closed or the wrong type, + * - AVPacket parameter change side data is applied right before calling + * AVCodec->send_packet, + * - if AV_CODEC_CAP_DELAY is not set, drain packets or frames are never sent, + * - only one drain packet is ever passed down (until the next flush()), + * - a drain AVPacket is always NULL (no need to check for avpkt->size). + */ + int (*send_frame)(AVCodecContext *avctx, const AVFrame *frame); + int (*send_packet)(AVCodecContext *avctx, const AVPacket *avpkt); + int (*receive_frame)(AVCodecContext *avctx, AVFrame *frame); + int (*receive_packet)(AVCodecContext *avctx, AVPacket *avpkt); /** * Flush buffers. * Will be called when seeking @@ -3755,6 +3963,164 @@ typedef struct AVSubtitle { int64_t pts; ///< Same as packet pts, in AV_TIME_BASE } AVSubtitle; +/** + * This struct describes the properties of an encoded stream. + * + * sizeof(AVCodecParameters) is not a part of the public ABI, this struct must + * be allocated with avcodec_parameters_alloc() and freed with + * avcodec_parameters_free(). + */ +typedef struct AVCodecParameters { + /** + * General type of the encoded data. + */ + enum AVMediaType codec_type; + /** + * Specific type of the encoded data (the codec used). + */ + enum AVCodecID codec_id; + /** + * Additional information about the codec (corresponds to the AVI FOURCC). + */ + uint32_t codec_tag; + + /** + * Extra binary data needed for initializing the decoder, codec-dependent. + * + * Must be allocated with av_malloc() and will be freed by + * avcodec_parameters_free(). The allocated size of extradata must be at + * least extradata_size + AV_INPUT_BUFFER_PADDING_SIZE, with the padding + * bytes zeroed. + */ + uint8_t *extradata; + /** + * Size of the extradata content in bytes. + */ + int extradata_size; + + /** + * - video: the pixel format, the value corresponds to enum AVPixelFormat. + * - audio: the sample format, the value corresponds to enum AVSampleFormat. + */ + int format; + + /** + * The average bitrate of the encoded data (in bits per second). + */ + int64_t bit_rate; + + /** + * The number of bits per sample in the codedwords. + * + * This is basically the bitrate per sample. It is mandatory for a bunch of + * formats to actually decode them. It's the number of bits for one sample in + * the actual coded bitstream. + * + * This could be for example 4 for ADPCM + * For PCM formats this matches bits_per_raw_sample + * Can be 0 + */ + int bits_per_coded_sample; + + /** + * This is the number of valid bits in each output sample. If the + * sample format has more bits, the least significant bits are additional + * padding bits, which are always 0. Use right shifts to reduce the sample + * to its actual size. For example, audio formats with 24 bit samples will + * have bits_per_raw_sample set to 24, and format set to AV_SAMPLE_FMT_S32. + * To get the original sample use "(int32_t)sample >> 8"." + * + * For ADPCM this might be 12 or 16 or similar + * Can be 0 + */ + int bits_per_raw_sample; + + /** + * Codec-specific bitstream restrictions that the stream conforms to. + */ + int profile; + int level; + + /** + * Video only. The dimensions of the video frame in pixels. + */ + int width; + int height; + + /** + * Video only. The aspect ratio (width / height) which a single pixel + * should have when displayed. + * + * When the aspect ratio is unknown / undefined, the numerator should be + * set to 0 (the denominator may have any value). + */ + AVRational sample_aspect_ratio; + + /** + * Video only. The order of the fields in interlaced video. + */ + enum AVFieldOrder field_order; + + /** + * Video only. Additional colorspace characteristics. + */ + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace color_space; + enum AVChromaLocation chroma_location; + + /** + * Video only. Number of delayed frames. + */ + int video_delay; + + /** + * Audio only. The channel layout bitmask. May be 0 if the channel layout is + * unknown or unspecified, otherwise the number of bits set must be equal to + * the channels field. + */ + uint64_t channel_layout; + /** + * Audio only. The number of audio channels. + */ + int channels; + /** + * Audio only. The number of audio samples per second. + */ + int sample_rate; + /** + * Audio only. The number of bytes per coded audio frame, required by some + * formats. + * + * Corresponds to nBlockAlign in WAVEFORMATEX. + */ + int block_align; + /** + * Audio only. Audio frame size, if known. Required by some formats to be static. + */ + int frame_size; + + /** + * Audio only. The amount of padding (in samples) inserted by the encoder at + * the beginning of the audio. I.e. this number of leading decoded samples + * must be discarded by the caller to get the original audio without leading + * padding. + */ + int initial_padding; + /** + * Audio only. The amount of padding (in samples) appended by the encoder to + * the end of the audio. I.e. this number of decoded samples must be + * discarded by the caller from the end of the stream to get the original + * audio without any trailing padding. + */ + int trailing_padding; + /** + * Audio only. Number of samples to skip after a discontinuity. + */ + int seek_preroll; +} AVCodecParameters; + /** * If c is NULL, returns the first registered codec, * if c is non-NULL, returns the next registered codec after c, @@ -3811,7 +4177,6 @@ void avcodec_register_all(void); * important mainly for encoders, e.g. libx264). * * @return An AVCodecContext filled with default values or NULL on failure. - * @see avcodec_get_context_defaults */ AVCodecContext *avcodec_alloc_context3(const AVCodec *codec); @@ -3821,16 +4186,14 @@ AVCodecContext *avcodec_alloc_context3(const AVCodec *codec); */ void avcodec_free_context(AVCodecContext **avctx); +#if FF_API_GET_CONTEXT_DEFAULTS /** - * Set the fields of the given AVCodecContext to default values corresponding - * to the given codec (defaults may be codec-dependent). - * - * Do not call this function if a non-NULL codec has been passed - * to avcodec_alloc_context3() that allocated this AVCodecContext. - * If codec is non-NULL, it is illegal to call avcodec_open2() with a - * different codec on this AVCodecContext. + * @deprecated This function should not be used, as closing and opening a codec + * context multiple time is not supported. A new codec context should be + * allocated for each new use. */ int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec); +#endif /** * Get the AVClass for AVCodecContext. It can be used in combination with @@ -3840,6 +4203,7 @@ int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec); */ const AVClass *avcodec_get_class(void); +#if FF_API_COPY_CONTEXT /** * Get the AVClass for AVFrame. It can be used in combination with * AV_OPT_SEARCH_FAKE_OBJ for examining options. @@ -3866,8 +4230,58 @@ const AVClass *avcodec_get_subtitle_rect_class(void); * avcodec_alloc_context3(NULL), but otherwise uninitialized * @param src source codec context * @return AVERROR() on error (e.g. memory allocation error), 0 on success + * + * @deprecated The semantics of this function are ill-defined and it should not + * be used. If you need to transfer the stream parameters from one codec context + * to another, use an intermediate AVCodecParameters instance and the + * avcodec_parameters_from_context() / avcodec_parameters_to_context() + * functions. */ +attribute_deprecated int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src); +#endif + +/** + * Allocate a new AVCodecParameters and set its fields to default values + * (unknown/invalid/0). The returned struct must be freed with + * avcodec_parameters_free(). + */ +AVCodecParameters *avcodec_parameters_alloc(void); + +/** + * Free an AVCodecParameters instance and everything associated with it and + * write NULL to the supplied pointer. + */ +void avcodec_parameters_free(AVCodecParameters **par); + +/** + * Copy the contents of src to dst. Any allocated fields in dst are freed and + * replaced with newly allocated duplicates of the corresponding fields in src. + * + * @return >= 0 on success, a negative AVERROR code on failure. + */ +int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src); + +/** + * Fill the parameters struct based on the values from the supplied codec + * context. Any allocated fields in par are freed and replaced with duplicates + * of the corresponding fields in codec. + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int avcodec_parameters_from_context(AVCodecParameters *par, + const AVCodecContext *codec); + +/** + * Fill the codec context based on the values from the supplied codec + * parameters. Any allocated fields in codec that have a corresponding field in + * par are freed and replaced with duplicates of the corresponding field in par. + * Fields in codec that do not have a counterpart in par are not touched. + * + * @return >= 0 on success, a negative AVERROR code on failure. + */ +int avcodec_parameters_to_context(AVCodecContext *codec, + const AVCodecParameters *par); /** * Initialize the AVCodecContext to use the given AVCodec. Prior to using this @@ -3880,7 +4294,7 @@ int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src); * @warning This function is not thread safe! * * @note Always call this function before using decoding routines (such as - * @ref avcodec_decode_video2()). + * @ref avcodec_receive_frame()). * * @code * avcodec_register_all(); @@ -3898,9 +4312,8 @@ int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src); * @param avctx The context to initialize. * @param codec The codec to open this context for. If a non-NULL codec has been * previously passed to avcodec_alloc_context3() or - * avcodec_get_context_defaults3() for this context, then this - * parameter MUST be either NULL or equal to the previously passed - * codec. + * for this context, then this parameter MUST be either NULL or + * equal to the previously passed codec. * @param options A dictionary filled with AVCodecContext and codec-private options. * On return this object will be filled with options that were not found. * @@ -3915,9 +4328,13 @@ int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **op * (but not the AVCodecContext itself). * * Calling this function on an AVCodecContext that hasn't been opened will free - * the codec-specific data allocated in avcodec_alloc_context3() / - * avcodec_get_context_defaults3() with a non-NULL codec. Subsequent calls will - * do nothing. + * the codec-specific data allocated in avcodec_alloc_context3() with a non-NULL + * codec. Subsequent calls will do nothing. + * + * @note Do not use this function. Use avcodec_free_context() to destroy a + * codec context (either open or closed). Opening and closing a codec context + * multiple times is not supported anymore -- use multiple codec contexts + * instead. */ int avcodec_close(AVCodecContext *avctx); @@ -4185,7 +4602,6 @@ void av_packet_move_ref(AVPacket *dst, AVPacket *src); * @param src Source packet * * @return 0 on success AVERROR on failure. - * */ int av_packet_copy_props(AVPacket *dst, const AVPacket *src); @@ -4340,7 +4756,10 @@ enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos); * @return A negative error code is returned if an error occurred during * decoding, otherwise the number of bytes consumed from the input * AVPacket is returned. + * +* @deprecated Use avcodec_send_packet() and avcodec_receive_frame(). */ +attribute_deprecated int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, const AVPacket *avpkt); @@ -4386,7 +4805,10 @@ int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero. * @return On error a negative value is returned, otherwise the number of bytes * used or zero if no frame could be decompressed. + * + * @deprecated Use avcodec_send_packet() and avcodec_receive_frame(). */ +attribute_deprecated int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, const AVPacket *avpkt); @@ -4422,6 +4844,129 @@ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt); +/** + * Supply raw packet data as input to a decoder. + * + * Internally, this call will copy relevant AVCodecContext fields, which can + * influence decoding per-packet, and apply them when the packet is actually + * decoded. (For example AVCodecContext.skip_frame, which might direct the + * decoder to drop the frame contained by the packet sent with this function.) + * + * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE + * larger than the actual read bytes because some optimized bitstream + * readers read 32 or 64 bits at once and could read over the end. + * + * @warning Do not mix this API with the legacy API (like avcodec_decode_video2()) + * on the same AVCodecContext. It will return unexpected results now + * or in future libavcodec versions. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx codec context + * @param[in] avpkt The input AVPacket. Usually, this will be a single video + * frame, or several complete audio frames. + * Ownership of the packet remains with the caller, and the + * decoder will not write to the packet. The decoder may create + * a reference to the packet data (or copy it if the packet is + * not reference-counted). + * Unlike with older APIs, the packet is always fully consumed, + * and if it contains multiple frames (e.g. some audio codecs), + * will require you to call avcodec_receive_frame() multiple + * times afterwards before you can send a new packet. + * It can be NULL (or an AVPacket with data set to NULL and + * size set to 0); in this case, it is considered a flush + * packet, which signals the end of the stream. Sending the + * first flush packet will return success. Subsequent ones are + * unnecessary and will return AVERROR_EOF. If the decoder + * still has frames buffered, it will return them after sending + * a flush packet. + * + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): input is not accepted right now - the packet must be + * resent after trying to read output + * AVERROR_EOF: the decoder has been flushed, and no new packets can + * be sent to it (also returned if more than 1 flush + * packet is sent) + * AVERROR(EINVAL): codec not opened, it is an encoder, or requires flush + * AVERROR(ENOMEM): failed to add packet to internal queue, or similar + * other errors: legitimate decoding errors + */ +int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt); + +/** + * Return decoded output data from a decoder. + * + * @param avctx codec context + * @param frame This will be set to a reference-counted video or audio + * frame (depending on the decoder type) allocated by the + * decoder. Note that the function will always call + * av_frame_unref(frame) before doing anything else. + * + * @return + * 0: success, a frame was returned + * AVERROR(EAGAIN): output is not available right now - user must try + * to send new input + * AVERROR_EOF: the decoder has been fully flushed, and there will be + * no more output frames + * AVERROR(EINVAL): codec not opened, or it is an encoder + * other negative values: legitimate decoding errors + */ +int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame); + +/** + * Supply a raw video or audio frame to the encoder. Use avcodec_receive_packet() + * to retrieve buffered output packets. + * + * @param avctx codec context + * @param[in] frame AVFrame containing the raw audio or video frame to be encoded. + * Ownership of the frame remains with the caller, and the + * encoder will not write to the frame. The encoder may create + * a reference to the frame data (or copy it if the frame is + * not reference-counted). + * It can be NULL, in which case it is considered a flush + * packet. This signals the end of the stream. If the encoder + * still has packets buffered, it will return them after this + * call. Once flushing mode has been entered, additional flush + * packets are ignored, and sending frames will return + * AVERROR_EOF. + * + * For audio: + * If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame + * can have any number of samples. + * If it is not set, frame->nb_samples must be equal to + * avctx->frame_size for all frames except the last. + * The final frame may be smaller than avctx->frame_size. + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): input is not accepted right now - the frame must be + * resent after trying to read output packets + * AVERROR_EOF: the encoder has been flushed, and no new frames can + * be sent to it + * AVERROR(EINVAL): codec not opened, refcounted_frames not set, it is a + * decoder, or requires flush + * AVERROR(ENOMEM): failed to add packet to internal queue, or similar + * other errors: legitimate decoding errors + */ +int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame); + +/** + * Read encoded data from the encoder. + * + * @param avctx codec context + * @param avpkt This will be set to a reference-counted packet allocated by the + * encoder. Note that the function will always call + * av_frame_unref(frame) before doing anything else. + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): output is not available right now - user must try + * to send input + * AVERROR_EOF: the encoder has been fully flushed, and there will be + * no more output packets + * AVERROR(EINVAL): codec not opened, or it is an encoder + * other errors: legitimate decoding errors + */ +int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt); + + /** * @defgroup lavc_parsing Frame parsing * @{ @@ -4629,7 +5174,10 @@ AVCodecParserContext *av_parser_init(int codec_id); * @param poutbuf set to pointer to parsed buffer or NULL if not yet finished. * @param poutbuf_size set to size of parsed buffer or zero if not yet finished. * @param buf input buffer. - * @param buf_size input length, to signal EOF, this should be 0 (so that the last frame can be output). + * @param buf_size buffer size in bytes without the padding. I.e. the full buffer + size is assumed to be buf_size + AV_INPUT_BUFFER_PADDING_SIZE. + To signal EOF, this should be 0 (so that the last frame + can be output). * @param pts input presentation timestamp. * @param dts input decoding timestamp. * @param pos input byte position in stream. @@ -4729,7 +5277,10 @@ AVCodec *avcodec_find_encoder_by_name(const char *name); * value of got_packet_ptr is undefined and should * not be used. * @return 0 on success, negative error code on failure + * + * @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead */ +attribute_deprecated int avcodec_encode_audio2(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr); @@ -4765,7 +5316,10 @@ int avcodec_encode_audio2(AVCodecContext *avctx, AVPacket *avpkt, * value of got_packet_ptr is undefined and should * not be used. * @return 0 on success, negative error code on failure + * + * @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead */ +attribute_deprecated int avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr); @@ -5013,15 +5567,8 @@ enum AVPixelFormat avcodec_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); attribute_deprecated -#if AV_HAVE_INCOMPATIBLE_LIBAV_ABI -enum AVPixelFormat avcodec_find_best_pix_fmt2(const enum AVPixelFormat *pix_fmt_list, - enum AVPixelFormat src_pix_fmt, - int has_alpha, int *loss_ptr); -#else enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); -#endif - enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat * fmt); @@ -5150,7 +5697,13 @@ int av_get_exact_bits_per_sample(enum AVCodecID codec_id); */ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes); +/** + * This function is the same as av_get_audio_frame_duration(), except it works + * with AVCodecParameters instead of an AVCodecContext. + */ +int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes); +#if FF_API_OLD_BSF typedef struct AVBitStreamFilterContext { void *priv_data; struct AVBitStreamFilter *filter; @@ -5162,19 +5715,102 @@ typedef struct AVBitStreamFilterContext { */ char *args; } AVBitStreamFilterContext; +#endif +typedef struct AVBSFInternal AVBSFInternal; + +/** + * The bitstream filter state. + * + * This struct must be allocated with av_bsf_alloc() and freed with + * av_bsf_free(). + * + * The fields in the struct will only be changed (by the caller or by the + * filter) as described in their documentation, and are to be considered + * immutable otherwise. + */ +typedef struct AVBSFContext { + /** + * A class for logging and AVOptions + */ + const AVClass *av_class; + + /** + * The bitstream filter this context is an instance of. + */ + const struct AVBitStreamFilter *filter; + + /** + * Opaque libavcodec internal data. Must not be touched by the caller in any + * way. + */ + AVBSFInternal *internal; + + /** + * Opaque filter-specific private data. If filter->priv_class is non-NULL, + * this is an AVOptions-enabled struct. + */ + void *priv_data; + + /** + * Parameters of the input stream. Set by the caller before av_bsf_init(). + */ + AVCodecParameters *par_in; + + /** + * Parameters of the output stream. Set by the filter in av_bsf_init(). + */ + AVCodecParameters *par_out; + + /** + * The timebase used for the timestamps of the input packets. Set by the + * caller before av_bsf_init(). + */ + AVRational time_base_in; + + /** + * The timebase used for the timestamps of the output packets. Set by the + * filter in av_bsf_init(). + */ + AVRational time_base_out; +} AVBSFContext; typedef struct AVBitStreamFilter { const char *name; + + /** + * A list of codec ids supported by the filter, terminated by + * AV_CODEC_ID_NONE. + * May be NULL, in that case the bitstream filter works with any codec id. + */ + const enum AVCodecID *codec_ids; + + /** + * A class for the private data, used to declare bitstream filter private + * AVOptions. This field is NULL for bitstream filters that do not declare + * any options. + * + * If this field is non-NULL, the first member of the filter private data + * must be a pointer to AVClass, which will be set by libavcodec generic + * code to this class. + */ + const AVClass *priv_class; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavcodec and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + int priv_data_size; - int (*filter)(AVBitStreamFilterContext *bsfc, - AVCodecContext *avctx, const char *args, - uint8_t **poutbuf, int *poutbuf_size, - const uint8_t *buf, int buf_size, int keyframe); - void (*close)(AVBitStreamFilterContext *bsfc); - struct AVBitStreamFilter *next; + int (*init)(AVBSFContext *ctx); + int (*filter)(AVBSFContext *ctx, AVPacket *pkt); + void (*close)(AVBSFContext *ctx); } AVBitStreamFilter; +#if FF_API_OLD_BSF /** * Register a bitstream filter. * @@ -5184,6 +5820,7 @@ typedef struct AVBitStreamFilter { * * @see avcodec_register_all() */ +attribute_deprecated void av_register_bitstream_filter(AVBitStreamFilter *bsf); /** @@ -5196,6 +5833,7 @@ void av_register_bitstream_filter(AVBitStreamFilter *bsf); * @return a bitstream filter context if a matching filter was found * and successfully initialized, NULL otherwise */ +attribute_deprecated AVBitStreamFilterContext *av_bitstream_filter_init(const char *name); /** @@ -5224,8 +5862,10 @@ AVBitStreamFilterContext *av_bitstream_filter_init(const char *name); * If the return value is 0, the output buffer is not allocated and * should be considered identical to the input buffer, or in case * *poutbuf was set it points to the input buffer (not necessarily to - * its starting address). + * its starting address). A special case is if *poutbuf was set to NULL and + * *poutbuf_size was set to 0, which indicates the packet should be dropped. */ +attribute_deprecated int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, uint8_t **poutbuf, int *poutbuf_size, @@ -5237,6 +5877,7 @@ int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, * @param bsf the bitstream filter context created with * av_bitstream_filter_init(), can be NULL */ +attribute_deprecated void av_bitstream_filter_close(AVBitStreamFilterContext *bsf); /** @@ -5247,7 +5888,189 @@ void av_bitstream_filter_close(AVBitStreamFilterContext *bsf); * This function can be used to iterate over all registered bitstream * filters. */ +attribute_deprecated AVBitStreamFilter *av_bitstream_filter_next(const AVBitStreamFilter *f); +#endif + +/** + * @return a bitstream filter with the specified name or NULL if no such + * bitstream filter exists. + */ +const AVBitStreamFilter *av_bsf_get_by_name(const char *name); + +/** + * Iterate over all registered bitstream filters. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered bitstream filter or NULL when the iteration is + * finished + */ +const AVBitStreamFilter *av_bsf_next(void **opaque); + +/** + * Allocate a context for a given bitstream filter. The caller must fill in the + * context parameters as described in the documentation and then call + * av_bsf_init() before sending any data to the filter. + * + * @param filter the filter for which to allocate an instance. + * @param ctx a pointer into which the pointer to the newly-allocated context + * will be written. It must be freed with av_bsf_free() after the + * filtering is done. + * + * @return 0 on success, a negative AVERROR code on failure + */ +int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **ctx); + +/** + * Prepare the filter for use, after all the parameters and options have been + * set. + */ +int av_bsf_init(AVBSFContext *ctx); + +/** + * Submit a packet for filtering. + * + * After sending each packet, the filter must be completely drained by calling + * av_bsf_receive_packet() repeatedly until it returns AVERROR(EAGAIN) or + * AVERROR_EOF. + * + * @param pkt the packet to filter. pkt must contain some payload (i.e data or + * side data must be present in pkt). The bitstream filter will take ownership of + * the packet and reset the contents of pkt. pkt is not touched if an error occurs. + * This parameter may be NULL, which signals the end of the stream (i.e. no more + * packets will be sent). That will cause the filter to output any packets it + * may have buffered internally. + * + * @return 0 on success, a negative AVERROR on error. + */ +int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt); + +/** + * Retrieve a filtered packet. + * + * @param[out] pkt this struct will be filled with the contents of the filtered + * packet. It is owned by the caller and must be freed using + * av_packet_unref() when it is no longer needed. + * This parameter should be "clean" (i.e. freshly allocated + * with av_packet_alloc() or unreffed with av_packet_unref()) + * when this function is called. If this function returns + * successfully, the contents of pkt will be completely + * overwritten by the returned data. On failure, pkt is not + * touched. + * + * @return 0 on success. AVERROR(EAGAIN) if more packets need to be sent to the + * filter (using av_bsf_send_packet()) to get more output. AVERROR_EOF if there + * will be no further output from the filter. Another negative AVERROR value if + * an error occurs. + * + * @note one input packet may result in several output packets, so after sending + * a packet with av_bsf_send_packet(), this function needs to be called + * repeatedly until it stops returning 0. It is also possible for a filter to + * output fewer packets than were sent to it, so this function may return + * AVERROR(EAGAIN) immediately after a successful av_bsf_send_packet() call. + */ +int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt); + +/** + * Free a bitstream filter context and everything associated with it; write NULL + * into the supplied pointer. + */ +void av_bsf_free(AVBSFContext **ctx); + +/** + * Get the AVClass for AVBSFContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *av_bsf_get_class(void); + +/** + * Structure for chain/list of bitstream filters. + * Empty list can be allocated by av_bsf_list_alloc(). + */ +typedef struct AVBSFList AVBSFList; + +/** + * Allocate empty list of bitstream filters. + * The list must be later freed by av_bsf_list_free() + * or finalized by av_bsf_list_finalize(). + * + * @return Pointer to @ref AVBSFList on success, NULL in case of failure + */ +AVBSFList *av_bsf_list_alloc(void); + +/** + * Free list of bitstream filters. + * + * @param lst Pointer to pointer returned by av_bsf_list_alloc() + */ +void av_bsf_list_free(AVBSFList **lst); + +/** + * Append bitstream filter to the list of bitstream filters. + * + * @param lst List to append to + * @param bsf Filter context to be appended + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_append(AVBSFList *lst, AVBSFContext *bsf); + +/** + * Construct new bitstream filter context given it's name and options + * and append it to the list of bitstream filters. + * + * @param lst List to append to + * @param bsf_name Name of the bitstream filter + * @param options Options for the bitstream filter, can be set to NULL + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_append2(AVBSFList *lst, const char * bsf_name, AVDictionary **options); +/** + * Finalize list of bitstream filters. + * + * This function will transform @ref AVBSFList to single @ref AVBSFContext, + * so the whole chain of bitstream filters can be treated as single filter + * freshly allocated by av_bsf_alloc(). + * If the call is successful, @ref AVBSFList structure is freed and lst + * will be set to NULL. In case of failure, caller is responsible for + * freeing the structure by av_bsf_list_free() + * + * @param lst Filter list structure to be transformed + * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure + * representing the chain of bitstream filters + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_finalize(AVBSFList **lst, AVBSFContext **bsf); + +/** + * Parse string describing list of bitstream filters and create single + * @ref AVBSFContext describing the whole chain of bitstream filters. + * Resulting @ref AVBSFContext can be treated as any other @ref AVBSFContext freshly + * allocated by av_bsf_alloc(). + * + * @param str String describing chain of bitstream filters in format + * `bsf1[=opt1=val1:opt2=val2][,bsf2]` + * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure + * representing the chain of bitstream filters + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf); + +/** + * Get null/pass-through bitstream filter. + * + * @param[out] bsf Pointer to be set to new instance of pass-through bitstream filter + * + * @return + */ +int av_bsf_get_null_filter(AVBSFContext **bsf); /* memory */ @@ -5284,7 +6107,7 @@ unsigned int av_xiphlacing(unsigned char *s, unsigned int v); * a pointer to an AVClass struct * @param[in] feature string containing the name of the missing feature * @param[in] want_sample indicates if samples are wanted which exhibit this feature. - * If want_sample is non-zero, additional verbage will be added to the log + * If want_sample is non-zero, additional verbiage will be added to the log * message which tells the user how to report samples to the development * mailing list. * @deprecated Use avpriv_report_missing_feature() instead. diff --git a/Externals/ffmpeg/include/libavcodec/dirac.h b/Externals/ffmpeg/include/libavcodec/dirac.h index 8d7953d9b4..e6d9d346d9 100644 --- a/Externals/ffmpeg/include/libavcodec/dirac.h +++ b/Externals/ffmpeg/include/libavcodec/dirac.h @@ -33,6 +33,17 @@ #include "avcodec.h" +/** + * The spec limits the number of wavelet decompositions to 4 for both + * level 1 (VC-2) and 128 (long-gop default). + * 5 decompositions is the maximum before >16-bit buffers are needed. + * Schroedinger allows this for DD 9,7 and 13,7 wavelets only, limiting + * the others to 4 decompositions (or 3 for the fidelity filter). + * + * We use this instead of MAX_DECOMPOSITIONS to save some memory. + */ +#define MAX_DWT_LEVELS 5 + /** * Parse code values: * @@ -52,6 +63,13 @@ enum DiracParseCodes { DIRAC_PCODE_PICTURE_RAW = 0x48, DIRAC_PCODE_PICTURE_LOW_DEL = 0xC8, DIRAC_PCODE_PICTURE_HQ = 0xE8, + DIRAC_PCODE_INTER_NOREF_CO1 = 0x0A, + DIRAC_PCODE_INTER_NOREF_CO2 = 0x09, + DIRAC_PCODE_INTER_REF_CO1 = 0x0D, + DIRAC_PCODE_INTER_REF_CO2 = 0x0E, + DIRAC_PCODE_INTRA_REF_CO = 0x0C, + DIRAC_PCODE_INTRA_REF_RAW = 0x4C, + DIRAC_PCODE_INTRA_REF_PICT = 0xCC, DIRAC_PCODE_MAGIC = 0x42424344, }; diff --git a/Externals/ffmpeg/include/libavcodec/dxva2.h b/Externals/ffmpeg/include/libavcodec/dxva2.h index 9e3ab86a82..22c93992f2 100644 --- a/Externals/ffmpeg/include/libavcodec/dxva2.h +++ b/Externals/ffmpeg/include/libavcodec/dxva2.h @@ -20,8 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef AVCODEC_DXVA_H -#define AVCODEC_DXVA_H +#ifndef AVCODEC_DXVA2_H +#define AVCODEC_DXVA2_H /** * @file @@ -90,4 +90,4 @@ struct dxva_context { * @} */ -#endif /* AVCODEC_DXVA_H */ +#endif /* AVCODEC_DXVA2_H */ diff --git a/Externals/ffmpeg/include/libavcodec/jni.h b/Externals/ffmpeg/include/libavcodec/jni.h new file mode 100644 index 0000000000..dd99e92611 --- /dev/null +++ b/Externals/ffmpeg/include/libavcodec/jni.h @@ -0,0 +1,46 @@ +/* + * JNI public API functions + * + * Copyright (c) 2015-2016 Matthieu Bouron + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_JNI_H +#define AVCODEC_JNI_H + +/* + * Manually set a Java virtual machine which will be used to retrieve the JNI + * environment. Once a Java VM is set it cannot be changed afterwards, meaning + * you can call multiple times av_jni_set_java_vm with the same Java VM pointer + * however it will error out if you try to set a different Java VM. + * + * @param vm Java virtual machine + * @param log_ctx context used for logging, can be NULL + * @return 0 on success, < 0 otherwise + */ +int av_jni_set_java_vm(void *vm, void *log_ctx); + +/* + * Get the Java virtual machine which has been set with av_jni_set_java_vm. + * + * @param vm Java virtual machine + * @return a pointer to the Java virtual machine + */ +void *av_jni_get_java_vm(void *log_ctx); + +#endif /* AVCODEC_JNI_H */ diff --git a/Externals/ffmpeg/include/libavcodec/mediacodec.h b/Externals/ffmpeg/include/libavcodec/mediacodec.h new file mode 100644 index 0000000000..5606d24a1e --- /dev/null +++ b/Externals/ffmpeg/include/libavcodec/mediacodec.h @@ -0,0 +1,88 @@ +/* + * Android MediaCodec public API + * + * Copyright (c) 2016 Matthieu Bouron + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_MEDIACODEC_H +#define AVCODEC_MEDIACODEC_H + +#include "libavcodec/avcodec.h" + +/** + * This structure holds a reference to a android/view/Surface object that will + * be used as output by the decoder. + * + */ +typedef struct AVMediaCodecContext { + + /** + * android/view/Surface object reference. + */ + void *surface; + +} AVMediaCodecContext; + +/** + * Allocate and initialize a MediaCodec context. + * + * When decoding with MediaCodec is finished, the caller must free the + * MediaCodec context with av_mediacodec_default_free. + * + * @return a pointer to a newly allocated AVMediaCodecContext on success, NULL otherwise + */ +AVMediaCodecContext *av_mediacodec_alloc_context(void); + +/** + * Convenience function that sets up the MediaCodec context. + * + * @param avctx codec context + * @param ctx MediaCodec context to initialize + * @param surface reference to an android/view/Surface + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_default_init(AVCodecContext *avctx, AVMediaCodecContext *ctx, void *surface); + +/** + * This function must be called to free the MediaCodec context initialized with + * av_mediacodec_default_init(). + * + * @param avctx codec context + */ +void av_mediacodec_default_free(AVCodecContext *avctx); + +/** + * Opaque structure representing a MediaCodec buffer to render. + */ +typedef struct MediaCodecBuffer AVMediaCodecBuffer; + +/** + * Release a MediaCodec buffer and render it to the surface that is associated + * with the decoder. This function should only be called once on a given + * buffer, once released the underlying buffer returns to the codec, thus + * subsequent calls to this function will have no effect. + * + * @param buffer the buffer to render + * @param render 1 to release and render the buffer to the surface or 0 to + * discard the buffer + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render); + +#endif /* AVCODEC_MEDIACODEC_H */ diff --git a/Externals/ffmpeg/include/libavcodec/old_codec_ids.h b/Externals/ffmpeg/include/libavcodec/old_codec_ids.h deleted file mode 100644 index c7aa0e0a12..0000000000 --- a/Externals/ffmpeg/include/libavcodec/old_codec_ids.h +++ /dev/null @@ -1,397 +0,0 @@ -/* - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef AVCODEC_OLD_CODEC_IDS_H -#define AVCODEC_OLD_CODEC_IDS_H - -/* - * This header exists to prevent new codec IDs from being accidentally added to - * the deprecated list. - * Do not include it directly. It will be removed on next major bump - * - * Do not add new items to this list. Use the AVCodecID enum instead. - */ - - CODEC_ID_NONE = AV_CODEC_ID_NONE, - - /* video codecs */ - CODEC_ID_MPEG1VIDEO, - CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding -#if FF_API_XVMC - CODEC_ID_MPEG2VIDEO_XVMC, -#endif - CODEC_ID_H261, - CODEC_ID_H263, - CODEC_ID_RV10, - CODEC_ID_RV20, - CODEC_ID_MJPEG, - CODEC_ID_MJPEGB, - CODEC_ID_LJPEG, - CODEC_ID_SP5X, - CODEC_ID_JPEGLS, - CODEC_ID_MPEG4, - CODEC_ID_RAWVIDEO, - CODEC_ID_MSMPEG4V1, - CODEC_ID_MSMPEG4V2, - CODEC_ID_MSMPEG4V3, - CODEC_ID_WMV1, - CODEC_ID_WMV2, - CODEC_ID_H263P, - CODEC_ID_H263I, - CODEC_ID_FLV1, - CODEC_ID_SVQ1, - CODEC_ID_SVQ3, - CODEC_ID_DVVIDEO, - CODEC_ID_HUFFYUV, - CODEC_ID_CYUV, - CODEC_ID_H264, - CODEC_ID_INDEO3, - CODEC_ID_VP3, - CODEC_ID_THEORA, - CODEC_ID_ASV1, - CODEC_ID_ASV2, - CODEC_ID_FFV1, - CODEC_ID_4XM, - CODEC_ID_VCR1, - CODEC_ID_CLJR, - CODEC_ID_MDEC, - CODEC_ID_ROQ, - CODEC_ID_INTERPLAY_VIDEO, - CODEC_ID_XAN_WC3, - CODEC_ID_XAN_WC4, - CODEC_ID_RPZA, - CODEC_ID_CINEPAK, - CODEC_ID_WS_VQA, - CODEC_ID_MSRLE, - CODEC_ID_MSVIDEO1, - CODEC_ID_IDCIN, - CODEC_ID_8BPS, - CODEC_ID_SMC, - CODEC_ID_FLIC, - CODEC_ID_TRUEMOTION1, - CODEC_ID_VMDVIDEO, - CODEC_ID_MSZH, - CODEC_ID_ZLIB, - CODEC_ID_QTRLE, - CODEC_ID_TSCC, - CODEC_ID_ULTI, - CODEC_ID_QDRAW, - CODEC_ID_VIXL, - CODEC_ID_QPEG, - CODEC_ID_PNG, - CODEC_ID_PPM, - CODEC_ID_PBM, - CODEC_ID_PGM, - CODEC_ID_PGMYUV, - CODEC_ID_PAM, - CODEC_ID_FFVHUFF, - CODEC_ID_RV30, - CODEC_ID_RV40, - CODEC_ID_VC1, - CODEC_ID_WMV3, - CODEC_ID_LOCO, - CODEC_ID_WNV1, - CODEC_ID_AASC, - CODEC_ID_INDEO2, - CODEC_ID_FRAPS, - CODEC_ID_TRUEMOTION2, - CODEC_ID_BMP, - CODEC_ID_CSCD, - CODEC_ID_MMVIDEO, - CODEC_ID_ZMBV, - CODEC_ID_AVS, - CODEC_ID_SMACKVIDEO, - CODEC_ID_NUV, - CODEC_ID_KMVC, - CODEC_ID_FLASHSV, - CODEC_ID_CAVS, - CODEC_ID_JPEG2000, - CODEC_ID_VMNC, - CODEC_ID_VP5, - CODEC_ID_VP6, - CODEC_ID_VP6F, - CODEC_ID_TARGA, - CODEC_ID_DSICINVIDEO, - CODEC_ID_TIERTEXSEQVIDEO, - CODEC_ID_TIFF, - CODEC_ID_GIF, - CODEC_ID_DXA, - CODEC_ID_DNXHD, - CODEC_ID_THP, - CODEC_ID_SGI, - CODEC_ID_C93, - CODEC_ID_BETHSOFTVID, - CODEC_ID_PTX, - CODEC_ID_TXD, - CODEC_ID_VP6A, - CODEC_ID_AMV, - CODEC_ID_VB, - CODEC_ID_PCX, - CODEC_ID_SUNRAST, - CODEC_ID_INDEO4, - CODEC_ID_INDEO5, - CODEC_ID_MIMIC, - CODEC_ID_RL2, - CODEC_ID_ESCAPE124, - CODEC_ID_DIRAC, - CODEC_ID_BFI, - CODEC_ID_CMV, - CODEC_ID_MOTIONPIXELS, - CODEC_ID_TGV, - CODEC_ID_TGQ, - CODEC_ID_TQI, - CODEC_ID_AURA, - CODEC_ID_AURA2, - CODEC_ID_V210X, - CODEC_ID_TMV, - CODEC_ID_V210, - CODEC_ID_DPX, - CODEC_ID_MAD, - CODEC_ID_FRWU, - CODEC_ID_FLASHSV2, - CODEC_ID_CDGRAPHICS, - CODEC_ID_R210, - CODEC_ID_ANM, - CODEC_ID_BINKVIDEO, - CODEC_ID_IFF_ILBM, - CODEC_ID_IFF_BYTERUN1, - CODEC_ID_KGV1, - CODEC_ID_YOP, - CODEC_ID_VP8, - CODEC_ID_PICTOR, - CODEC_ID_ANSI, - CODEC_ID_A64_MULTI, - CODEC_ID_A64_MULTI5, - CODEC_ID_R10K, - CODEC_ID_MXPEG, - CODEC_ID_LAGARITH, - CODEC_ID_PRORES, - CODEC_ID_JV, - CODEC_ID_DFA, - CODEC_ID_WMV3IMAGE, - CODEC_ID_VC1IMAGE, - CODEC_ID_UTVIDEO, - CODEC_ID_BMV_VIDEO, - CODEC_ID_VBLE, - CODEC_ID_DXTORY, - CODEC_ID_V410, - CODEC_ID_XWD, - CODEC_ID_CDXL, - CODEC_ID_XBM, - CODEC_ID_ZEROCODEC, - CODEC_ID_MSS1, - CODEC_ID_MSA1, - CODEC_ID_TSCC2, - CODEC_ID_MTS2, - CODEC_ID_CLLC, - CODEC_ID_Y41P = MKBETAG('Y','4','1','P'), - CODEC_ID_ESCAPE130 = MKBETAG('E','1','3','0'), - CODEC_ID_EXR = MKBETAG('0','E','X','R'), - CODEC_ID_AVRP = MKBETAG('A','V','R','P'), - - CODEC_ID_G2M = MKBETAG( 0 ,'G','2','M'), - CODEC_ID_AVUI = MKBETAG('A','V','U','I'), - CODEC_ID_AYUV = MKBETAG('A','Y','U','V'), - CODEC_ID_V308 = MKBETAG('V','3','0','8'), - CODEC_ID_V408 = MKBETAG('V','4','0','8'), - CODEC_ID_YUV4 = MKBETAG('Y','U','V','4'), - CODEC_ID_SANM = MKBETAG('S','A','N','M'), - CODEC_ID_PAF_VIDEO = MKBETAG('P','A','F','V'), - CODEC_ID_SNOW = AV_CODEC_ID_SNOW, - - /* various PCM "codecs" */ - CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs - CODEC_ID_PCM_S16LE = 0x10000, - CODEC_ID_PCM_S16BE, - CODEC_ID_PCM_U16LE, - CODEC_ID_PCM_U16BE, - CODEC_ID_PCM_S8, - CODEC_ID_PCM_U8, - CODEC_ID_PCM_MULAW, - CODEC_ID_PCM_ALAW, - CODEC_ID_PCM_S32LE, - CODEC_ID_PCM_S32BE, - CODEC_ID_PCM_U32LE, - CODEC_ID_PCM_U32BE, - CODEC_ID_PCM_S24LE, - CODEC_ID_PCM_S24BE, - CODEC_ID_PCM_U24LE, - CODEC_ID_PCM_U24BE, - CODEC_ID_PCM_S24DAUD, - CODEC_ID_PCM_ZORK, - CODEC_ID_PCM_S16LE_PLANAR, - CODEC_ID_PCM_DVD, - CODEC_ID_PCM_F32BE, - CODEC_ID_PCM_F32LE, - CODEC_ID_PCM_F64BE, - CODEC_ID_PCM_F64LE, - CODEC_ID_PCM_BLURAY, - CODEC_ID_PCM_LXF, - CODEC_ID_S302M, - CODEC_ID_PCM_S8_PLANAR, - - /* various ADPCM codecs */ - CODEC_ID_ADPCM_IMA_QT = 0x11000, - CODEC_ID_ADPCM_IMA_WAV, - CODEC_ID_ADPCM_IMA_DK3, - CODEC_ID_ADPCM_IMA_DK4, - CODEC_ID_ADPCM_IMA_WS, - CODEC_ID_ADPCM_IMA_SMJPEG, - CODEC_ID_ADPCM_MS, - CODEC_ID_ADPCM_4XM, - CODEC_ID_ADPCM_XA, - CODEC_ID_ADPCM_ADX, - CODEC_ID_ADPCM_EA, - CODEC_ID_ADPCM_G726, - CODEC_ID_ADPCM_CT, - CODEC_ID_ADPCM_SWF, - CODEC_ID_ADPCM_YAMAHA, - CODEC_ID_ADPCM_SBPRO_4, - CODEC_ID_ADPCM_SBPRO_3, - CODEC_ID_ADPCM_SBPRO_2, - CODEC_ID_ADPCM_THP, - CODEC_ID_ADPCM_IMA_AMV, - CODEC_ID_ADPCM_EA_R1, - CODEC_ID_ADPCM_EA_R3, - CODEC_ID_ADPCM_EA_R2, - CODEC_ID_ADPCM_IMA_EA_SEAD, - CODEC_ID_ADPCM_IMA_EA_EACS, - CODEC_ID_ADPCM_EA_XAS, - CODEC_ID_ADPCM_EA_MAXIS_XA, - CODEC_ID_ADPCM_IMA_ISS, - CODEC_ID_ADPCM_G722, - CODEC_ID_ADPCM_IMA_APC, - CODEC_ID_VIMA = MKBETAG('V','I','M','A'), - - /* AMR */ - CODEC_ID_AMR_NB = 0x12000, - CODEC_ID_AMR_WB, - - /* RealAudio codecs*/ - CODEC_ID_RA_144 = 0x13000, - CODEC_ID_RA_288, - - /* various DPCM codecs */ - CODEC_ID_ROQ_DPCM = 0x14000, - CODEC_ID_INTERPLAY_DPCM, - CODEC_ID_XAN_DPCM, - CODEC_ID_SOL_DPCM, - - /* audio codecs */ - CODEC_ID_MP2 = 0x15000, - CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3 - CODEC_ID_AAC, - CODEC_ID_AC3, - CODEC_ID_DTS, - CODEC_ID_VORBIS, - CODEC_ID_DVAUDIO, - CODEC_ID_WMAV1, - CODEC_ID_WMAV2, - CODEC_ID_MACE3, - CODEC_ID_MACE6, - CODEC_ID_VMDAUDIO, - CODEC_ID_FLAC, - CODEC_ID_MP3ADU, - CODEC_ID_MP3ON4, - CODEC_ID_SHORTEN, - CODEC_ID_ALAC, - CODEC_ID_WESTWOOD_SND1, - CODEC_ID_GSM, ///< as in Berlin toast format - CODEC_ID_QDM2, - CODEC_ID_COOK, - CODEC_ID_TRUESPEECH, - CODEC_ID_TTA, - CODEC_ID_SMACKAUDIO, - CODEC_ID_QCELP, - CODEC_ID_WAVPACK, - CODEC_ID_DSICINAUDIO, - CODEC_ID_IMC, - CODEC_ID_MUSEPACK7, - CODEC_ID_MLP, - CODEC_ID_GSM_MS, /* as found in WAV */ - CODEC_ID_ATRAC3, - CODEC_ID_VOXWARE, - CODEC_ID_APE, - CODEC_ID_NELLYMOSER, - CODEC_ID_MUSEPACK8, - CODEC_ID_SPEEX, - CODEC_ID_WMAVOICE, - CODEC_ID_WMAPRO, - CODEC_ID_WMALOSSLESS, - CODEC_ID_ATRAC3P, - CODEC_ID_EAC3, - CODEC_ID_SIPR, - CODEC_ID_MP1, - CODEC_ID_TWINVQ, - CODEC_ID_TRUEHD, - CODEC_ID_MP4ALS, - CODEC_ID_ATRAC1, - CODEC_ID_BINKAUDIO_RDFT, - CODEC_ID_BINKAUDIO_DCT, - CODEC_ID_AAC_LATM, - CODEC_ID_QDMC, - CODEC_ID_CELT, - CODEC_ID_G723_1, - CODEC_ID_G729, - CODEC_ID_8SVX_EXP, - CODEC_ID_8SVX_FIB, - CODEC_ID_BMV_AUDIO, - CODEC_ID_RALF, - CODEC_ID_IAC, - CODEC_ID_ILBC, - CODEC_ID_FFWAVESYNTH = MKBETAG('F','F','W','S'), - CODEC_ID_SONIC = MKBETAG('S','O','N','C'), - CODEC_ID_SONIC_LS = MKBETAG('S','O','N','L'), - CODEC_ID_PAF_AUDIO = MKBETAG('P','A','F','A'), - CODEC_ID_OPUS = MKBETAG('O','P','U','S'), - - /* subtitle codecs */ - CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs. - CODEC_ID_DVD_SUBTITLE = 0x17000, - CODEC_ID_DVB_SUBTITLE, - CODEC_ID_TEXT, ///< raw UTF-8 text - CODEC_ID_XSUB, - CODEC_ID_SSA, - CODEC_ID_MOV_TEXT, - CODEC_ID_HDMV_PGS_SUBTITLE, - CODEC_ID_DVB_TELETEXT, - CODEC_ID_SRT, - CODEC_ID_MICRODVD = MKBETAG('m','D','V','D'), - CODEC_ID_EIA_608 = MKBETAG('c','6','0','8'), - CODEC_ID_JACOSUB = MKBETAG('J','S','U','B'), - CODEC_ID_SAMI = MKBETAG('S','A','M','I'), - CODEC_ID_REALTEXT = MKBETAG('R','T','X','T'), - CODEC_ID_SUBVIEWER = MKBETAG('S','u','b','V'), - - /* other specific kind of codecs (generally used for attachments) */ - CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs. - CODEC_ID_TTF = 0x18000, - CODEC_ID_BINTEXT = MKBETAG('B','T','X','T'), - CODEC_ID_XBIN = MKBETAG('X','B','I','N'), - CODEC_ID_IDF = MKBETAG( 0 ,'I','D','F'), - CODEC_ID_OTF = MKBETAG( 0 ,'O','T','F'), - - CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like CODEC_ID_NONE) but lavf should attempt to identify it - - CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS - * stream (only used by libavformat) */ - CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems - * stream (only used by libavformat) */ - CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information. - -#endif /* AVCODEC_OLD_CODEC_IDS_H */ diff --git a/Externals/ffmpeg/include/libavcodec/version.h b/Externals/ffmpeg/include/libavcodec/version.h index 9846275e09..ec8837a4e7 100644 --- a/Externals/ffmpeg/include/libavcodec/version.h +++ b/Externals/ffmpeg/include/libavcodec/version.h @@ -1,5 +1,4 @@ /* - * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or @@ -29,8 +28,8 @@ #include "libavutil/version.h" #define LIBAVCODEC_VERSION_MAJOR 57 -#define LIBAVCODEC_VERSION_MINOR 21 -#define LIBAVCODEC_VERSION_MICRO 100 +#define LIBAVCODEC_VERSION_MINOR 64 +#define LIBAVCODEC_VERSION_MICRO 101 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ @@ -61,6 +60,9 @@ #ifndef FF_API_AVCODEC_RESAMPLE #define FF_API_AVCODEC_RESAMPLE FF_API_AUDIO_CONVERT #endif +#ifndef FF_API_GETCHROMA +#define FF_API_GETCHROMA (LIBAVCODEC_VERSION_MAJOR < 58) +#endif #ifndef FF_API_MISSING_SAMPLE #define FF_API_MISSING_SAMPLE (LIBAVCODEC_VERSION_MAJOR < 58) #endif @@ -206,5 +208,23 @@ #ifndef FF_API_STAT_BITS #define FF_API_STAT_BITS (LIBAVCODEC_VERSION_MAJOR < 59) #endif +#ifndef FF_API_PRIVATE_OPT +#define FF_API_PRIVATE_OPT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_ASS_TIMING +#define FF_API_ASS_TIMING (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_BSF +#define FF_API_OLD_BSF (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_COPY_CONTEXT +#define FF_API_COPY_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_GET_CONTEXT_DEFAULTS +#define FF_API_GET_CONTEXT_DEFAULTS (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_NVENC_OLD_NAME +#define FF_API_NVENC_OLD_NAME (LIBAVCODEC_VERSION_MAJOR < 59) +#endif #endif /* AVCODEC_VERSION_H */ diff --git a/Externals/ffmpeg/include/libavcodec/vorbis_parser.h b/Externals/ffmpeg/include/libavcodec/vorbis_parser.h index 06e48bd3b0..92050277ed 100644 --- a/Externals/ffmpeg/include/libavcodec/vorbis_parser.h +++ b/Externals/ffmpeg/include/libavcodec/vorbis_parser.h @@ -1,5 +1,4 @@ /* - * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or @@ -24,8 +23,8 @@ * Determines the duration for each packet. */ -#ifndef AVCODEC_VORBIS_PARSE_H -#define AVCODEC_VORBIS_PARSE_H +#ifndef AVCODEC_VORBIS_PARSER_H +#define AVCODEC_VORBIS_PARSER_H #include @@ -75,4 +74,4 @@ int av_vorbis_parse_frame(AVVorbisParseContext *s, const uint8_t *buf, void av_vorbis_parse_reset(AVVorbisParseContext *s); -#endif /* AVCODEC_VORBIS_PARSE_H */ +#endif /* AVCODEC_VORBIS_PARSER_H */ diff --git a/Externals/ffmpeg/include/libavformat/avformat.h b/Externals/ffmpeg/include/libavformat/avformat.h index 95a645b35c..c81a916d30 100644 --- a/Externals/ffmpeg/include/libavformat/avformat.h +++ b/Externals/ffmpeg/include/libavformat/avformat.h @@ -28,8 +28,8 @@ */ /** - * @defgroup libavf I/O and Muxing/Demuxing Library - * @{ + * @defgroup libavf libavformat + * I/O and Muxing/Demuxing Library * * Libavformat (lavf) is a library for dealing with various media container * formats. Its main two purposes are demuxing - i.e. splitting a media file @@ -78,6 +78,20 @@ * if its AVClass is non-NULL, and the protocols layer. See the discussion on * nesting in @ref avoptions documentation to learn how to access those. * + * @section urls + * URL strings in libavformat are made of a scheme/protocol, a ':', and a + * scheme specific string. URLs without a scheme and ':' used for local files + * are supported but deprecated. "file:" should be used for local files. + * + * It is important that the scheme string is not taken from untrusted + * sources without checks. + * + * Note that some schemes/protocols are quite powerful, allowing access to + * both local and remote files, parts of them, concatenations of them, local + * audio and video devices and so on. + * + * @{ + * * @defgroup lavf_decoding Demuxing * @{ * Demuxers read a media file and split it into chunks of data (@em packets). A @@ -88,10 +102,10 @@ * cleanup. * * @section lavf_decoding_open Opening a media file - * The minimum information required to open a file is its URL or filename, which + * The minimum information required to open a file is its URL, which * is passed to avformat_open_input(), as in the following code: * @code - * const char *url = "in.mp3"; + * const char *url = "file:in.mp3"; * AVFormatContext *s = NULL; * int ret = avformat_open_input(&s, url, NULL, NULL); * if (ret < 0) @@ -149,8 +163,8 @@ * av_read_frame() on it. Each call, if successful, will return an AVPacket * containing encoded data for one AVStream, identified by * AVPacket.stream_index. This packet may be passed straight into the libavcodec - * decoding functions avcodec_decode_video2(), avcodec_decode_audio4() or - * avcodec_decode_subtitle2() if the caller wishes to decode the data. + * decoding functions avcodec_send_packet() or avcodec_decode_subtitle2() if the + * caller wishes to decode the data. * * AVPacket.pts, AVPacket.dts and AVPacket.duration timing information will be * set if known. They may also be unset (i.e. AV_NOPTS_VALUE for @@ -191,15 +205,15 @@ * avio_open2() or a custom one. * - Unless the format is of the AVFMT_NOSTREAMS type, at least one stream must * be created with the avformat_new_stream() function. The caller should fill - * the @ref AVStream.codec "stream codec context" information, such as the - * codec @ref AVCodecContext.codec_type "type", @ref AVCodecContext.codec_id + * the @ref AVStream.codecpar "stream codec parameters" information, such as the + * codec @ref AVCodecParameters.codec_type "type", @ref AVCodecParameters.codec_id * "id" and other parameters (e.g. width / height, the pixel or sample format, * etc.) as known. The @ref AVStream.time_base "stream timebase" should * be set to the timebase that the caller desires to use for this stream (note * that the timebase actually used by the muxer can be different, as will be * described later). * - It is advised to manually initialize only the relevant fields in - * AVCodecContext, rather than using @ref avcodec_copy_context() during + * AVCodecParameters, rather than using @ref avcodec_parameters_copy() during * remuxing: there is no guarantee that the codec context values remain valid * for both input and output format contexts. * - The caller may fill in additional information, such as @ref @@ -298,7 +312,6 @@ * @{ * @} * @} - * */ #include @@ -516,7 +529,7 @@ typedef struct AVOutputFormat { * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS, * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH, - * AVFMT_TS_NONSTRICT + * AVFMT_TS_NONSTRICT, AVFMT_TS_NEGATIVE */ int flags; @@ -605,6 +618,8 @@ typedef struct AVOutputFormat { * AVStream parameters that need to be set before packets are sent. * This method must not write output. * + * Return 0 if streams were fully configured, 1 if not, negative AVERROR on failure + * * Any allocations made here must be freed in deinit(). */ int (*init)(struct AVFormatContext *); @@ -801,6 +816,9 @@ typedef struct AVIndexEntry { * is known */ #define AVINDEX_KEYFRAME 0x0001 +#define AVINDEX_DISCARD_FRAME 0x0002 /** + * Flag is used to indicate which frame should be discarded after decoding. + */ int flags:2; int size:30; //Yeah, trying to keep the size of this small to reduce memory requirements (it is 24 vs. 32 bytes due to possible 8-byte alignment). int min_distance; /**< Minimum distance between this and the previous keyframe, used to avoid unneeded searching. */ @@ -824,11 +842,17 @@ typedef struct AVIndexEntry { #define AV_DISPOSITION_CLEAN_EFFECTS 0x0200 /**< stream without voice */ /** * The stream is stored in the file as an attached picture/"cover art" (e.g. - * APIC frame in ID3v2). The single packet associated with it will be returned - * among the first few packets read from the file unless seeking takes place. - * It can also be accessed at any time in AVStream.attached_pic. + * APIC frame in ID3v2). The first (usually only) packet associated with it + * will be returned among the first few packets read from the file unless + * seeking takes place. It can also be accessed at any time in + * AVStream.attached_pic. */ #define AV_DISPOSITION_ATTACHED_PIC 0x0400 +/** + * The stream is sparse, and contains thumbnail images, often corresponding + * to chapter markers. Only ever used with AV_DISPOSITION_ATTACHED_PIC. + */ +#define AV_DISPOSITION_TIMED_THUMBNAILS 0x0800 typedef struct AVStreamInternal AVStreamInternal; @@ -861,18 +885,13 @@ typedef struct AVStream { * encoding: set by the user, replaced by libavformat if left unset */ int id; +#if FF_API_LAVF_AVCTX /** - * Codec context associated with this stream. Allocated and freed by - * libavformat. - * - * - decoding: The demuxer exports codec information stored in the headers - * here. - * - encoding: The user sets codec information, the muxer writes it to the - * output. Mandatory fields as specified in AVCodecContext - * documentation must be set even if this AVCodecContext is - * not actually used for encoding. + * @deprecated use the codecpar struct instead */ + attribute_deprecated AVCodecContext *codec; +#endif void *priv_data; #if FF_API_LAVF_FRAC @@ -990,7 +1009,7 @@ typedef struct AVStream { /** * Stream information used internally by av_find_stream_info() */ -#define MAX_STD_TIMEBASES (30*12+7+6) +#define MAX_STD_TIMEBASES (30*12+30+3+6) struct { int64_t last_dts; int64_t duration_gcd; @@ -1200,6 +1219,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); @@ -1288,6 +1318,12 @@ typedef struct AVFormatInternal AVFormatInternal; * version bump. * sizeof(AVFormatContext) must not be used outside libav*, use * avformat_alloc_context() to create an AVFormatContext. + * + * Fields can be accessed through AVOptions (av_opt*), + * the name string used matches the associated command line parameter name and + * can be found in libavformat/options_table.h. + * The AVOption/command line parameter names differ in some cases from the C + * structure field names for historic reasons or brevity. */ typedef struct AVFormatContext { /** @@ -1423,6 +1459,8 @@ typedef struct AVFormatContext { #define AVFMT_FLAG_PRIV_OPT 0x20000 ///< Enable use of private options by delaying codec open (this could be made default once all code is converted) #define AVFMT_FLAG_KEEP_SIDE_DATA 0x40000 ///< Don't merge side data but keep it separate. #define AVFMT_FLAG_FAST_SEEK 0x80000 ///< Enable fast, but inaccurate seeks for some formats +#define AVFMT_FLAG_SHORTEST 0x100000 ///< Stop muxing when the shortest stream stops. +#define AVFMT_FLAG_AUTO_BSF 0x200000 ///< Wait for packet data before writing a header, and add bitstream filters as requested by the muxer /** * Maximum size of the data read from input for determining @@ -1768,7 +1806,6 @@ typedef struct AVFormatContext { /** * User data. * This is a place for some private data of the user. - * Mostly usable with control_message_cb or any future callbacks in device's context. */ void *opaque; @@ -1799,6 +1836,7 @@ typedef struct AVFormatContext { */ enum AVCodecID data_codec_id; +#if FF_API_OLD_OPEN_CALLBACKS /** * Called to open further IO contexts when needed for demuxing. * @@ -1813,8 +1851,61 @@ typedef struct AVFormatContext { * @See av_format_set_open_cb() * * Demuxing: Set by user. + * + * @deprecated Use io_open and io_close. */ + attribute_deprecated int (*open_cb)(struct AVFormatContext *s, AVIOContext **p, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options); +#endif + + /** + * ',' separated list of allowed protocols. + * - encoding: unused + * - decoding: set by user through AVOptions (NO direct access) + */ + char *protocol_whitelist; + + /* + * A callback for opening new IO streams. + * + * Whenever a muxer or a demuxer needs to open an IO stream (typically from + * avformat_open_input() for demuxers, but for certain formats can happen at + * other times as well), it will call this callback to obtain an IO context. + * + * @param s the format context + * @param pb on success, the newly opened IO context should be returned here + * @param url the url to open + * @param flags a combination of AVIO_FLAG_* + * @param options a dictionary of additional options, with the same + * semantics as in avio_open2() + * @return 0 on success, a negative AVERROR code on failure + * + * @note Certain muxers and demuxers do nesting, i.e. they open one or more + * additional internal format contexts. Thus the AVFormatContext pointer + * passed to this callback may be different from the one facing the caller. + * It will, however, have the same 'opaque' field. + */ + int (*io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, + int flags, AVDictionary **options); + + /** + * A callback for closing the streams opened with AVFormatContext.io_open(). + */ + void (*io_close)(struct AVFormatContext *s, AVIOContext *pb); + + /** + * ',' separated list of disallowed protocols. + * - encoding: unused + * - decoding: set by user through AVOptions (NO direct access) + */ + char *protocol_blacklist; + + /** + * The maximum number of streams. + * - encoding: unused + * - decoding: set by user through AVOptions (NO direct access) + */ + int max_streams; } AVFormatContext; int av_format_get_probe_score(const AVFormatContext *s); @@ -1832,8 +1923,10 @@ void * av_format_get_opaque(const AVFormatContext *s); void av_format_set_opaque(AVFormatContext *s, void *opaque); av_format_control_message av_format_get_control_message_cb(const AVFormatContext *s); void av_format_set_control_message_cb(AVFormatContext *s, av_format_control_message callback); -AVOpenCallback av_format_get_open_cb(const AVFormatContext *s); -void av_format_set_open_cb(AVFormatContext *s, AVOpenCallback callback); +#if FF_API_OLD_OPEN_CALLBACKS +attribute_deprecated AVOpenCallback av_format_get_open_cb(const AVFormatContext *s); +attribute_deprecated void av_format_set_open_cb(AVFormatContext *s, AVOpenCallback callback); +#endif /** * This function will cause global side data to be injected in the next packet @@ -1980,8 +2073,13 @@ uint8_t *av_stream_new_side_data(AVStream *stream, * @param size pointer for side information size to store (optional) * @return pointer to data if present or NULL otherwise */ +#if FF_API_NOCONST_GET_SIDE_DATA uint8_t *av_stream_get_side_data(AVStream *stream, enum AVPacketSideDataType type, int *size); +#else +uint8_t *av_stream_get_side_data(const AVStream *stream, + enum AVPacketSideDataType type, int *size); +#endif AVProgram *av_new_program(AVFormatContext *s, int id); @@ -2059,7 +2157,7 @@ AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score * * @param pb the bytestream to probe * @param fmt the input format is put here - * @param filename the filename of the stream + * @param url the url of the stream * @param logctx the log context * @param offset the offset within the bytestream to probe from * @param max_probe_size the maximum probe buffer size (zero for default) @@ -2068,14 +2166,14 @@ AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score * AVERROR code otherwise */ int av_probe_input_buffer2(AVIOContext *pb, AVInputFormat **fmt, - const char *filename, void *logctx, + const char *url, void *logctx, unsigned int offset, unsigned int max_probe_size); /** * Like av_probe_input_buffer2() but returns 0 on success */ int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, - const char *filename, void *logctx, + const char *url, void *logctx, unsigned int offset, unsigned int max_probe_size); /** @@ -2086,7 +2184,7 @@ int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, * May be a pointer to NULL, in which case an AVFormatContext is allocated by this * function and written into ps. * Note that a user-supplied AVFormatContext will be freed on failure. - * @param filename Name of the stream to open. + * @param url URL of the stream to open. * @param fmt If non-NULL, this parameter forces a specific input format. * Otherwise the format is autodetected. * @param options A dictionary filled with AVFormatContext and demuxer-private options. @@ -2097,7 +2195,7 @@ int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, * * @note If you want to use custom IO, preallocate the format context and set its pb field. */ -int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options); +int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); attribute_deprecated int av_demuxer_open(AVFormatContext *ic); @@ -2291,6 +2389,10 @@ void avformat_close_input(AVFormatContext **s); * @addtogroup lavf_encoding * @{ */ + +#define AVSTREAM_INIT_IN_WRITE_HEADER 0 ///< stream parameters initialized in avformat_write_header +#define AVSTREAM_INIT_IN_INIT_OUTPUT 1 ///< stream parameters initialized in avformat_init_output + /** * Allocate the stream private data and write the stream header to * an output media file. @@ -2302,13 +2404,37 @@ void avformat_close_input(AVFormatContext **s); * On return this parameter will be destroyed and replaced with a dict containing * options that were not found. May be NULL. * - * @return 0 on success, negative AVERROR on failure. + * @return AVSTREAM_INIT_IN_WRITE_HEADER on success if the codec had not already been fully initialized in avformat_init, + * AVSTREAM_INIT_IN_INIT_OUTPUT on success if the codec had already been fully initialized in avformat_init, + * negative AVERROR on failure. * - * @see av_opt_find, av_dict_set, avio_open, av_oformat_next. + * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_init_output. */ av_warn_unused_result int avformat_write_header(AVFormatContext *s, AVDictionary **options); +/** + * Allocate the stream private data and initialize the codec, but do not write the header. + * May optionally be used before avformat_write_header to initialize stream parameters + * before actually writing the header. + * If using this function, do not pass the same options to avformat_write_header. + * + * @param s Media file handle, must be allocated with avformat_alloc_context(). + * Its oformat field must be set to the desired output format; + * Its pb field must be set to an already opened AVIOContext. + * @param options An AVDictionary filled with AVFormatContext and muxer-private options. + * On return this parameter will be destroyed and replaced with a dict containing + * options that were not found. May be NULL. + * + * @return AVSTREAM_INIT_IN_WRITE_HEADER on success if the codec requires avformat_write_header to fully initialize, + * AVSTREAM_INIT_IN_INIT_OUTPUT on success if the codec has been fully initialized, + * negative AVERROR on failure. + * + * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_write_header. + */ +av_warn_unused_result +int avformat_init_output(AVFormatContext *s, AVDictionary **options); + /** * Write a packet to an output media file. * @@ -2356,6 +2482,10 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt); * increasing dts. Callers doing their own interleaving should call * av_write_frame() instead of this function. * + * Using this function instead of av_write_frame() can give muxers advance + * knowledge of future packets, improving e.g. the behaviour of the mp4 + * muxer for VFR content in fragmenting mode. + * * @param s media file handle * @param pkt The packet containing the data to be written. *
@@ -2390,7 +2520,7 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt); int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt); /** - * Write a uncoded frame to an output media file. + * Write an uncoded frame to an output media file. * * The frame must be correctly interleaved according to the container * specification; if not, then av_interleaved_write_frame() must be used. @@ -2401,7 +2531,7 @@ int av_write_uncoded_frame(AVFormatContext *s, int stream_index, AVFrame *frame); /** - * Write a uncoded frame to an output media file. + * Write an uncoded frame to an output media file. * * If the muxer supports it, this function makes it possible to write an AVFrame * structure directly, without encoding it into a packet. @@ -2643,6 +2773,9 @@ void av_dump_format(AVFormatContext *ic, const char *url, int is_output); + +#define AV_FRAME_FILENAME_FLAGS_MULTIPLE 1 ///< Allow multiple %d + /** * Return in 'buf' the path with '%d' replaced by a number. * @@ -2653,8 +2786,12 @@ void av_dump_format(AVFormatContext *ic, * @param buf_size destination buffer size * @param path numbered sequence string * @param number frame number + * @param flags AV_FRAME_FILENAME_FLAGS_* * @return 0 if OK, -1 on format error */ +int av_get_frame_filename2(char *buf, int buf_size, + const char *path, int number, int flags); + int av_get_frame_filename(char *buf, int buf_size, const char *path, int number); @@ -2791,13 +2928,48 @@ int avformat_queue_attached_pictures(AVFormatContext *s); * Apply a list of bitstream filters to a packet. * * @param codec AVCodecContext, usually from an AVStream - * @param pkt the packet to apply filters to + * @param pkt the packet to apply filters to. If, on success, the returned + * packet has size == 0 and side_data_elems == 0, it indicates that + * the packet should be dropped * @param bsfc a NULL-terminated list of filters to apply * @return >=0 on success; * AVERROR code on failure */ +#if FF_API_OLD_BSF +attribute_deprecated int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt, AVBitStreamFilterContext *bsfc); +#endif + +enum AVTimebaseSource { + AVFMT_TBCF_AUTO = -1, + AVFMT_TBCF_DECODER, + AVFMT_TBCF_DEMUXER, +#if FF_API_R_FRAME_RATE + AVFMT_TBCF_R_FRAMERATE, +#endif +}; + +/** + * Transfer internal timing information from one stream to another. + * + * This function is useful when doing stream copy. + * + * @param ofmt target output format for ost + * @param ost output stream which needs timings copy and adjustments + * @param ist reference input stream to copy timings from + * @param copy_tb define from where the stream codec timebase needs to be imported + */ +int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt, + AVStream *ost, const AVStream *ist, + enum AVTimebaseSource copy_tb); + +/** + * Get the internal codec timebase from a stream. + * + * @param st input stream to extract the timebase from + */ +AVRational av_stream_get_codec_timebase(const AVStream *st); /** * @} diff --git a/Externals/ffmpeg/include/libavformat/avio.h b/Externals/ffmpeg/include/libavformat/avio.h index c3c0b73f2c..b1ce1d1c72 100644 --- a/Externals/ffmpeg/include/libavformat/avio.h +++ b/Externals/ffmpeg/include/libavformat/avio.h @@ -96,6 +96,42 @@ typedef struct AVIODirContext { struct URLContext *url_context; } AVIODirContext; +/** + * Different data types that can be returned via the AVIO + * write_data_type callback. + */ +enum AVIODataMarkerType { + /** + * Header data; this needs to be present for the stream to be decodeable. + */ + AVIO_DATA_MARKER_HEADER, + /** + * A point in the output bytestream where a decoder can start decoding + * (i.e. a keyframe). A demuxer/decoder given the data flagged with + * AVIO_DATA_MARKER_HEADER, followed by any AVIO_DATA_MARKER_SYNC_POINT, + * should give decodeable results. + */ + AVIO_DATA_MARKER_SYNC_POINT, + /** + * A point in the output bytestream where a demuxer can start parsing + * (for non self synchronizing bytestream formats). That is, any + * non-keyframe packet start point. + */ + AVIO_DATA_MARKER_BOUNDARY_POINT, + /** + * This is any, unlabelled data. It can either be a muxer not marking + * any positions at all, it can be an actual boundary/sync point + * that the muxer chooses not to mark, or a later part of a packet/fragment + * that is cut into multiple write callbacks due to limited IO buffer size. + */ + AVIO_DATA_MARKER_UNKNOWN, + /** + * Trailer data, which doesn't contain actual content, but only for + * finalizing the output file. + */ + AVIO_DATA_MARKER_TRAILER +}; + /** * Bytestream IO Context. * New fields can be added to the end with minor version bumps. @@ -249,9 +285,35 @@ typedef struct AVIOContext { * This is current internal only, do not use from outside. */ int short_seek_threshold; -} AVIOContext; -/* unbuffered I/O */ + /** + * ',' separated list of allowed protocols. + */ + const char *protocol_whitelist; + + /** + * ',' separated list of disallowed protocols. + */ + const char *protocol_blacklist; + + /** + * A callback that is used instead of write_packet. + */ + int (*write_data_type)(void *opaque, uint8_t *buf, int buf_size, + enum AVIODataMarkerType type, int64_t time); + /** + * If set, don't call write_data_type separately for AVIO_DATA_MARKER_BOUNDARY_POINT, + * but ignore them and treat them as AVIO_DATA_MARKER_UNKNOWN (to avoid needlessly + * small chunks of data returned from the callback). + */ + int ignore_boundary_point; + + /** + * Internal, not meant to be used from outside of AVIOContext. + */ + enum AVIODataMarkerType current_type; + int64_t last_time; +} AVIOContext; /** * Return the name of the protocol that will handle the passed URL. @@ -404,14 +466,26 @@ int avio_put_str16le(AVIOContext *s, const char *str); int avio_put_str16be(AVIOContext *s, const char *str); /** - * Passing this as the "whence" parameter to a seek function causes it to + * Mark the written bytestream as a specific type. + * + * Zero-length ranges are omitted from the output. + * + * @param time the stream time the current bytestream pos corresponds to + * (in AV_TIME_BASE units), or AV_NOPTS_VALUE if unknown or not + * applicable + * @param type the kind of data written starting at the current pos + */ +void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type); + +/** + * ORing this as the "whence" parameter to a seek function causes it to * return the filesize without seeking anywhere. Supporting this is optional. * If it is not supported then the seek function will return <0. */ #define AVSEEK_SIZE 0x10000 /** - * Oring this flag as into the "whence" parameter to a seek function causes it to + * Passing this flag as the "whence" parameter to a seek function causes it to * seek by any means (like reopening and linear reading) or other normally unreasonable * means that can be extremely slow. * This may be ignored by the seek code. diff --git a/Externals/ffmpeg/include/libavformat/version.h b/Externals/ffmpeg/include/libavformat/version.h index a57eb12fd6..ad25596d9c 100644 --- a/Externals/ffmpeg/include/libavformat/version.h +++ b/Externals/ffmpeg/include/libavformat/version.h @@ -29,9 +29,11 @@ #include "libavutil/version.h" +// Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) +// Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 57 -#define LIBAVFORMAT_VERSION_MINOR 21 -#define LIBAVFORMAT_VERSION_MICRO 100 +#define LIBAVFORMAT_VERSION_MINOR 56 +#define LIBAVFORMAT_VERSION_MICRO 101 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ @@ -71,6 +73,18 @@ #ifndef FF_API_COMPUTE_PKT_FIELDS2 #define FF_API_COMPUTE_PKT_FIELDS2 (LIBAVFORMAT_VERSION_MAJOR < 58) #endif +#ifndef FF_API_OLD_OPEN_CALLBACKS +#define FF_API_OLD_OPEN_CALLBACKS (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_LAVF_AVCTX +#define FF_API_LAVF_AVCTX (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_NOCONST_GET_SIDE_DATA +#define FF_API_NOCONST_GET_SIDE_DATA (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_HTTP_USER_AGENT +#define FF_API_HTTP_USER_AGENT (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif #ifndef FF_API_R_FRAME_RATE #define FF_API_R_FRAME_RATE 1 diff --git a/Externals/ffmpeg/include/libavutil/adler32.h b/Externals/ffmpeg/include/libavutil/adler32.h index 0dc69ec0a8..a1f035b734 100644 --- a/Externals/ffmpeg/include/libavutil/adler32.h +++ b/Externals/ffmpeg/include/libavutil/adler32.h @@ -18,6 +18,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/** + * @file + * @ingroup lavu_adler32 + * Public header for Adler-32 hash function implementation. + */ + #ifndef AVUTIL_ADLER32_H #define AVUTIL_ADLER32_H @@ -25,11 +31,10 @@ #include "attributes.h" /** - * @file - * Public header for libavutil Adler32 hasher + * @defgroup lavu_adler32 Adler-32 + * @ingroup lavu_hash + * Adler-32 hash function implementation. * - * @defgroup lavu_adler32 Adler32 - * @ingroup lavu_crypto * @{ */ diff --git a/Externals/ffmpeg/include/libavutil/audio_fifo.h b/Externals/ffmpeg/include/libavutil/audio_fifo.h index 24f91dab72..d8a9194a8d 100644 --- a/Externals/ffmpeg/include/libavutil/audio_fifo.h +++ b/Externals/ffmpeg/include/libavutil/audio_fifo.h @@ -110,6 +110,23 @@ int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples); */ int av_audio_fifo_peek(AVAudioFifo *af, void **data, int nb_samples); +/** + * Peek data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to peek + * @param offset offset from current read position + * @return number of samples actually peek, or negative AVERROR code + * on failure. The number of samples actually peek will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_peek_at(AVAudioFifo *af, void **data, int nb_samples, int offset); + /** * Read data from an AVAudioFifo. * diff --git a/Externals/ffmpeg/include/libavutil/audioconvert.h b/Externals/ffmpeg/include/libavutil/audioconvert.h deleted file mode 100644 index 300a67cd3d..0000000000 --- a/Externals/ffmpeg/include/libavutil/audioconvert.h +++ /dev/null @@ -1,6 +0,0 @@ - -#include "version.h" - -#if FF_API_AUDIOCONVERT -#include "channel_layout.h" -#endif diff --git a/Externals/ffmpeg/include/libavutil/avassert.h b/Externals/ffmpeg/include/libavutil/avassert.h index 41f5e0eea7..46f3fea580 100644 --- a/Externals/ffmpeg/include/libavutil/avassert.h +++ b/Externals/ffmpeg/include/libavutil/avassert.h @@ -45,7 +45,7 @@ /** * assert() equivalent, that does not lie in speed critical code. - * These asserts() thus can be enabled without fearing speedloss. + * These asserts() thus can be enabled without fearing speed loss. */ #if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 0 #define av_assert1(cond) av_assert0(cond) @@ -59,8 +59,17 @@ */ #if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1 #define av_assert2(cond) av_assert0(cond) +#define av_assert2_fpu() av_assert0_fpu() #else #define av_assert2(cond) ((void)0) +#define av_assert2_fpu() ((void)0) #endif +/** + * Assert that floating point opperations can be executed. + * + * This will av_assert0() that the cpu is not in MMX state on X86 + */ +void av_assert0_fpu(void); + #endif /* AVUTIL_AVASSERT_H */ diff --git a/Externals/ffmpeg/include/libavutil/avconfig.h b/Externals/ffmpeg/include/libavutil/avconfig.h index 36a8cd14da..f10aa6186b 100644 --- a/Externals/ffmpeg/include/libavutil/avconfig.h +++ b/Externals/ffmpeg/include/libavutil/avconfig.h @@ -3,5 +3,4 @@ #define AVUTIL_AVCONFIG_H #define AV_HAVE_BIGENDIAN 0 #define AV_HAVE_FAST_UNALIGNED 1 -#define AV_HAVE_INCOMPATIBLE_LIBAV_ABI 0 #endif /* AVUTIL_AVCONFIG_H */ diff --git a/Externals/ffmpeg/include/libavutil/avstring.h b/Externals/ffmpeg/include/libavutil/avstring.h index a46d012552..dd2876990f 100644 --- a/Externals/ffmpeg/include/libavutil/avstring.h +++ b/Externals/ffmpeg/include/libavutil/avstring.h @@ -156,7 +156,7 @@ static inline size_t av_strnlen(const char *s, size_t len) char *av_asprintf(const char *fmt, ...) av_printf_format(1, 2); /** - * Convert a number to a av_malloced string. + * Convert a number to an av_malloced string. */ char *av_d2str(double d); @@ -284,6 +284,11 @@ const char *av_dirname(char *path); /** * Match instances of a name in a comma-separated list of names. + * List entries are checked from the start to the end of the names list, + * the first match ends further processing. If an entry prefixed with '-' + * matches, then 0 is returned. The "ALL" list entry is considered to + * match all names. + * * @param name Name to look for. * @param names List of names. * @return 1 on match, 0 otherwise. diff --git a/Externals/ffmpeg/include/libavutil/avutil.h b/Externals/ffmpeg/include/libavutil/avutil.h index 9bcf674126..29dd830bf5 100644 --- a/Externals/ffmpeg/include/libavutil/avutil.h +++ b/Externals/ffmpeg/include/libavutil/avutil.h @@ -23,7 +23,8 @@ /** * @file - * external API header + * @ingroup lavu + * Convenience header that includes @ref lavu "libavutil"'s core. */ /** @@ -78,14 +79,15 @@ */ /** - * @defgroup lavu Common utility functions + * @defgroup lavu libavutil + * Common code shared across all FFmpeg libraries. * - * @brief - * libavutil contains the code shared across all the other FFmpeg - * libraries - * - * @note In order to use the functions provided by avutil you must include - * the specific header. + * @note + * libavutil is designed to be modular. In most cases, in order to use the + * functions provided by one component of libavutil you must explicitly include + * the specific header containing that feature. If you are only using + * media-related components, you could simply include libavutil/avutil.h, which + * brings in most of the "core" components. * * @{ * @@ -94,7 +96,7 @@ * @{ * @} * - * @defgroup lavu_math Maths + * @defgroup lavu_math Mathematics * @{ * * @} @@ -266,7 +268,7 @@ enum AVPictureType { AV_PICTURE_TYPE_I, ///< Intra AV_PICTURE_TYPE_P, ///< Predicted AV_PICTURE_TYPE_B, ///< Bi-dir predicted - AV_PICTURE_TYPE_S, ///< S(GMC)-VOP MPEG4 + AV_PICTURE_TYPE_S, ///< S(GMC)-VOP MPEG-4 AV_PICTURE_TYPE_SI, ///< Switching Intra AV_PICTURE_TYPE_SP, ///< Switching Predicted AV_PICTURE_TYPE_BI, ///< BI type diff --git a/Externals/ffmpeg/include/libavutil/base64.h b/Externals/ffmpeg/include/libavutil/base64.h index 514498eac8..2954c12d42 100644 --- a/Externals/ffmpeg/include/libavutil/base64.h +++ b/Externals/ffmpeg/include/libavutil/base64.h @@ -29,19 +29,24 @@ * @{ */ - /** * Decode a base64-encoded string. * * @param out buffer for decoded data * @param in null-terminated input string * @param out_size size in bytes of the out buffer, must be at - * least 3/4 of the length of in + * least 3/4 of the length of in, that is AV_BASE64_DECODE_SIZE(strlen(in)) * @return number of bytes written, or a negative value in case of * invalid input */ int av_base64_decode(uint8_t *out, const char *in, int out_size); +/** + * Calculate the output size in bytes needed to decode a base64 string + * with length x to a data buffer. + */ +#define AV_BASE64_DECODE_SIZE(x) ((x) * 3LL / 4) + /** * Encode data to base64 and null-terminate. * diff --git a/Externals/ffmpeg/include/libavutil/buffer.h b/Externals/ffmpeg/include/libavutil/buffer.h index b4399fd39f..0c0ce12cf2 100644 --- a/Externals/ffmpeg/include/libavutil/buffer.h +++ b/Externals/ffmpeg/include/libavutil/buffer.h @@ -248,6 +248,23 @@ typedef struct AVBufferPool AVBufferPool; */ AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size)); +/** + * Allocate and initialize a buffer pool with a more complex allocator. + * + * @param size size of each buffer in this pool + * @param opaque arbitrary user data used by the allocator + * @param alloc a function that will be used to allocate new buffers when the + * pool is empty. + * @param pool_free a function that will be called immediately before the pool + * is freed. I.e. after av_buffer_pool_can_uninit() is called + * by the pool and all the frames are returned to the pool and + * freed. It is intended to uninitialize the user opaque data. + * @return newly created buffer pool on success, NULL on error. + */ +AVBufferPool *av_buffer_pool_init2(int size, void *opaque, + AVBufferRef* (*alloc)(void *opaque, int size), + void (*pool_free)(void *opaque)); + /** * Mark the pool as being available for freeing. It will actually be freed only * once all the allocated buffers associated with the pool are released. Thus it @@ -255,7 +272,6 @@ AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size)); * in use. * * @param pool pointer to the pool to be freed. It will be set to NULL. - * @see av_buffer_pool_can_uninit() */ void av_buffer_pool_uninit(AVBufferPool **pool); diff --git a/Externals/ffmpeg/include/libavutil/common.h b/Externals/ffmpeg/include/libavutil/common.h index ea636431c1..8142b31fdb 100644 --- a/Externals/ffmpeg/include/libavutil/common.h +++ b/Externals/ffmpeg/include/libavutil/common.h @@ -54,9 +54,12 @@ #define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b)) /* assume b>0 */ #define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) -/* assume a>0 and b>0 */ -#define FF_CEIL_RSHIFT(a,b) (!av_builtin_constant_p(b) ? -((-(a)) >> (b)) \ +/* Fast a/(1<=0 and b>=0 */ +#define AV_CEIL_RSHIFT(a,b) (!av_builtin_constant_p(b) ? -((-(a)) >> (b)) \ : ((a) + (1<<(b)) - 1) >> (b)) +/* Backwards compat. */ +#define FF_CEIL_RSHIFT AV_CEIL_RSHIFT + #define FFUDIV(a,b) (((a)>0 ?(a):(a)-(b)+1) / (b)) #define FFUMOD(a,b) ((a)-(b)*FFUDIV(a,b)) @@ -211,7 +214,7 @@ static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a) */ static av_always_inline av_const int av_clip_intp2_c(int a, int p) { - if ((a + (1 << p)) & ~((2 << p) - 1)) + if (((unsigned)a + (1 << p)) & ~((2 << p) - 1)) return (a >> 31) ^ ((1 << p) - 1); else return a; @@ -331,6 +334,11 @@ static av_always_inline av_const int av_popcount64_c(uint64_t x) return av_popcount((uint32_t)x) + av_popcount((uint32_t)(x >> 32)); } +static av_always_inline av_const int av_parity_c(uint32_t v) +{ + return av_popcount(v) & 1; +} + #define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24)) #define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24)) @@ -351,13 +359,13 @@ static av_always_inline av_const int av_popcount64_c(uint64_t x) * to prevent undefined results. */ #define GET_UTF8(val, GET_BYTE, ERROR)\ - val= GET_BYTE;\ + val= (GET_BYTE);\ {\ uint32_t top = (val & 128) >> 1;\ if ((val & 0xc0) == 0x80 || val >= 0xFE)\ ERROR\ while (val & top) {\ - int tmp= GET_BYTE - 128;\ + int tmp= (GET_BYTE) - 128;\ if(tmp>>6)\ ERROR\ val= (val<<6) + tmp;\ @@ -517,3 +525,6 @@ static av_always_inline av_const int av_popcount64_c(uint64_t x) #ifndef av_popcount64 # define av_popcount64 av_popcount64_c #endif +#ifndef av_parity +# define av_parity av_parity_c +#endif diff --git a/Externals/ffmpeg/include/libavutil/cpu.h b/Externals/ffmpeg/include/libavutil/cpu.h index cc4e30c4cd..4bff16714a 100644 --- a/Externals/ffmpeg/include/libavutil/cpu.h +++ b/Externals/ffmpeg/include/libavutil/cpu.h @@ -70,7 +70,7 @@ /** * Return the flags which specify extensions supported by the CPU. * The returned value is affected by av_force_cpu_flags() if that was used - * before. So av_get_cpu_flags() can easily be used in a application to + * before. So av_get_cpu_flags() can easily be used in an application to * detect the enabled cpu flags. */ int av_get_cpu_flags(void); diff --git a/Externals/ffmpeg/include/libavutil/crc.h b/Externals/ffmpeg/include/libavutil/crc.h index ef8a7137e4..2a1b0d7624 100644 --- a/Externals/ffmpeg/include/libavutil/crc.h +++ b/Externals/ffmpeg/include/libavutil/crc.h @@ -18,6 +18,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/** + * @file + * @ingroup lavu_crc32 + * Public header for CRC hash function implementation. + */ + #ifndef AVUTIL_CRC_H #define AVUTIL_CRC_H @@ -27,8 +33,14 @@ #include "version.h" /** - * @defgroup lavu_crc32 CRC32 - * @ingroup lavu_crypto + * @defgroup lavu_crc32 CRC + * @ingroup lavu_hash + * CRC (Cyclic Redundancy Check) hash function implementation. + * + * This module supports numerous CRC polynomials, in addition to the most + * widely used CRC-32-IEEE. See @ref AVCRCId for a list of available + * polynomials. + * * @{ */ diff --git a/Externals/ffmpeg/include/libavutil/dict.h b/Externals/ffmpeg/include/libavutil/dict.h index 5b8d003396..118f1f00ed 100644 --- a/Externals/ffmpeg/include/libavutil/dict.h +++ b/Externals/ffmpeg/include/libavutil/dict.h @@ -1,5 +1,4 @@ /* - * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or @@ -65,7 +64,6 @@ } av_dict_free(&d); @endcode - * */ #define AV_DICT_MATCH_CASE 1 /**< Only get an entry with exact-case key match. Only relevant in av_dict_get(). */ @@ -78,6 +76,7 @@ #define AV_DICT_DONT_OVERWRITE 16 ///< Don't overwrite existing entries. #define AV_DICT_APPEND 32 /**< If the entry already exists, append to it. Note that no delimiter is added, the strings are simply concatenated. */ +#define AV_DICT_MULTIKEY 64 /**< Allow to store several equal keys in the dictionary */ typedef struct AVDictionaryEntry { char *key; @@ -118,10 +117,13 @@ int av_dict_count(const AVDictionary *m); * Note: If AV_DICT_DONT_STRDUP_KEY or AV_DICT_DONT_STRDUP_VAL is set, * these arguments will be freed on error. * + * Warning: Adding a new entry to a dictionary invalidates all existing entries + * previously returned with av_dict_get. + * * @param pm pointer to a pointer to a dictionary struct. If *pm is NULL * a dictionary struct is allocated and put in *pm. - * @param key entry key to add to *pm (will be av_strduped depending on flags) - * @param value entry value to add to *pm (will be av_strduped depending on flags). + * @param key entry key to add to *pm (will either be av_strduped or added as a new key depending on flags) + * @param value entry value to add to *pm (will be av_strduped or added as a new key depending on flags). * Passing a NULL value will cause an existing entry to be deleted. * @return >= 0 on success otherwise an error code <0 */ diff --git a/Externals/ffmpeg/include/libavutil/display.h b/Externals/ffmpeg/include/libavutil/display.h index c0cfee326d..39c15ee6b8 100644 --- a/Externals/ffmpeg/include/libavutil/display.h +++ b/Externals/ffmpeg/include/libavutil/display.h @@ -22,6 +22,7 @@ #define AVUTIL_DISPLAY_H #include +#include "common.h" /** * The display transformation matrix specifies an affine transformation that diff --git a/Externals/ffmpeg/include/libavutil/ffversion.h b/Externals/ffmpeg/include/libavutil/ffversion.h index 5a10c20ba7..50d62f9375 100644 --- a/Externals/ffmpeg/include/libavutil/ffversion.h +++ b/Externals/ffmpeg/include/libavutil/ffversion.h @@ -1,5 +1,5 @@ /* Automatically generated by version.sh, do not manually edit! */ #ifndef AVUTIL_FFVERSION_H #define AVUTIL_FFVERSION_H -#define FFMPEG_VERSION "git-2015-12-28-4deafba" +#define FFMPEG_VERSION "3.2.4" #endif /* AVUTIL_FFVERSION_H */ diff --git a/Externals/ffmpeg/include/libavutil/file.h b/Externals/ffmpeg/include/libavutil/file.h index e931be71e4..8666c7b1d5 100644 --- a/Externals/ffmpeg/include/libavutil/file.h +++ b/Externals/ffmpeg/include/libavutil/file.h @@ -62,6 +62,7 @@ void av_file_unmap(uint8_t *bufptr, size_t size); * @note On very old libcs it is necessary to set a secure umask before * calling this, av_tempfile() can't call umask itself as it is used in * libraries and could interfere with the calling application. + * @deprecated as fd numbers cannot be passed saftely between libs on some platforms */ int av_tempfile(const char *prefix, char **filename, int log_offset, void *log_ctx); diff --git a/Externals/ffmpeg/include/libavutil/frame.h b/Externals/ffmpeg/include/libavutil/frame.h index 9c6061a11b..8e51361e29 100644 --- a/Externals/ffmpeg/include/libavutil/frame.h +++ b/Externals/ffmpeg/include/libavutil/frame.h @@ -1,5 +1,4 @@ /* - * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or @@ -106,12 +105,22 @@ enum AVFrameSideDataType { * @endcode */ AV_FRAME_DATA_SKIP_SAMPLES, - /** * This side data must be associated with an audio frame and corresponds to * enum AVAudioServiceType defined in avcodec.h. */ AV_FRAME_DATA_AUDIO_SERVICE_TYPE, + /** + * Mastering display metadata associated with a video frame. The payload is + * an AVMasteringDisplayMetadata type and contains information about the + * mastering display color volume. + */ + AV_FRAME_DATA_MASTERING_DISPLAY_METADATA, + /** + * The GOP timecode in 25 bit timecode format. Data format is 64-bit integer. + * This is set on the first frame of a GOP that has a temporal reference of 0. + */ + AV_FRAME_DATA_GOP_TIMECODE }; enum AVActiveFormatDescription { @@ -167,6 +176,10 @@ typedef struct AVFrameSideData { * Similarly fields that are marked as to be only accessed by * av_opt_ptr() can be reordered. This allows 2 forks to add fields * without breaking compatibility with each other. + * + * Fields can be accessed through AVOptions, the name string used, matches the + * C structure field name for fields accessible through AVOptions. The AVClass + * for AVFrame can be obtained from avcodec_get_frame_class() */ typedef struct AVFrame { #define AV_NUM_DATA_POINTERS 8 @@ -178,6 +191,9 @@ typedef struct AVFrame { * see avcodec_align_dimensions2(). Some filters and swscale can read * up to 16 bytes beyond the planes, if these filters are to be used, * then 16 extra bytes must be allocated. + * + * NOTE: Except for hwaccel formats, pointers not needed by the format + * MUST be set to NULL. */ uint8_t *data[AV_NUM_DATA_POINTERS]; @@ -251,10 +267,14 @@ typedef struct AVFrame { */ int64_t pts; +#if FF_API_PKT_PTS /** * PTS copied from the AVPacket that was decoded to produce this frame. + * @deprecated use the pts field instead */ + attribute_deprecated int64_t pkt_pts; +#endif /** * DTS copied from the AVPacket that triggered returning this frame. (if frame threading isn't used) @@ -312,7 +332,7 @@ typedef struct AVFrame { int palette_has_changed; /** - * reordered opaque 64bit (generally an integer or a double precision float + * reordered opaque 64 bits (generally an integer or a double precision float * PTS but can be anything). * The user sets AVCodecContext.reordered_opaque to represent the input at * that time, @@ -369,6 +389,7 @@ typedef struct AVFrame { /** * @defgroup lavu_frame_flags AV_FRAME_FLAGS + * @ingroup lavu_frame * Flags describing additional frame properties. * * @{ @@ -378,6 +399,10 @@ typedef struct AVFrame { * The frame data may be corrupted, e.g. due to decoding errors. */ #define AV_FRAME_FLAG_CORRUPT (1 << 0) +/** + * A flag to mark the frames which need to be decoded, but shouldn't be output. + */ +#define AV_FRAME_FLAG_DISCARD (1 << 2) /** * @} */ @@ -502,6 +527,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; /** @@ -573,6 +603,10 @@ void av_frame_free(AVFrame **frame); * If src is not reference counted, new buffers are allocated and the data is * copied. * + * @warning: dst MUST have been either unreferenced with av_frame_unref(dst), + * or newly allocated with av_frame_alloc() before calling this + * function, or undefined behavior will occur. + * * @return 0 on success, a negative AVERROR on error */ int av_frame_ref(AVFrame *dst, const AVFrame *src); @@ -593,6 +627,10 @@ void av_frame_unref(AVFrame *frame); /** * Move everything contained in src to dst and reset src. + * + * @warning: dst is not unreferenced, but directly overwritten without reading + * or deallocating its contents. Call av_frame_unref(dst) manually + * before calling this function to ensure that no memory is leaked. */ void av_frame_move_ref(AVFrame *dst, AVFrame *src); @@ -608,6 +646,10 @@ void av_frame_move_ref(AVFrame *dst, AVFrame *src); * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf. * For planar formats, one buffer will be allocated for each plane. * + * @warning: if frame already has been allocated, calling this function will + * leak memory. In addition, undefined behavior can occur in certain + * cases. + * * @param frame frame in which to store the new buffers. * @param align required buffer size alignment * diff --git a/Externals/ffmpeg/include/libavutil/hash.h b/Externals/ffmpeg/include/libavutil/hash.h index d4bcbf8cc8..a20b8934f1 100644 --- a/Externals/ffmpeg/include/libavutil/hash.h +++ b/Externals/ffmpeg/include/libavutil/hash.h @@ -18,18 +18,108 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/** + * @file + * @ingroup lavu_hash_generic + * Generic hashing API + */ + #ifndef AVUTIL_HASH_H #define AVUTIL_HASH_H #include +/** + * @defgroup lavu_hash Hash Functions + * @ingroup lavu_crypto + * Hash functions useful in multimedia. + * + * Hash functions are widely used in multimedia, from error checking and + * concealment to internal regression testing. libavutil has efficient + * implementations of a variety of hash functions that may be useful for + * FFmpeg and other multimedia applications. + * + * @{ + * + * @defgroup lavu_hash_generic Generic Hashing API + * An abstraction layer for all hash functions supported by libavutil. + * + * If your application needs to support a wide range of different hash + * functions, then the Generic Hashing API is for you. It provides a generic, + * reusable API for @ref lavu_hash "all hash functions" implemented in libavutil. + * If you just need to use one particular hash function, use the @ref lavu_hash + * "individual hash" directly. + * + * @section Sample Code + * + * A basic template for using the Generic Hashing API follows: + * + * @code + * struct AVHashContext *ctx = NULL; + * const char *hash_name = NULL; + * uint8_t *output_buf = NULL; + * + * // Select from a string returned by av_hash_names() + * hash_name = ...; + * + * // Allocate a hash context + * ret = av_hash_alloc(&ctx, hash_name); + * if (ret < 0) + * return ret; + * + * // Initialize the hash context + * av_hash_init(ctx); + * + * // Update the hash context with data + * while (data_left) { + * av_hash_update(ctx, data, size); + * } + * + * // Now we have no more data, so it is time to finalize the hash and get the + * // output. But we need to first allocate an output buffer. Note that you can + * // use any memory allocation function, including malloc(), not just + * // av_malloc(). + * output_buf = av_malloc(av_hash_get_size(ctx)); + * if (!output_buf) + * return AVERROR(ENOMEM); + * + * // Finalize the hash context. + * // You can use any of the av_hash_final*() functions provided, for other + * // output formats. If you do so, be sure to adjust the memory allocation + * // above. See the function documentation below for the exact amount of extra + * // memory needed. + * av_hash_final(ctx, output_buffer); + * + * // Free the context + * av_hash_freep(&ctx); + * @endcode + * + * @section Hash Function-Specific Information + * If the CRC32 hash is selected, the #AV_CRC_32_IEEE polynomial will be + * used. + * + * If the Murmur3 hash is selected, the default seed will be used. See @ref + * lavu_murmur3_seedinfo "Murmur3" for more information. + * + * @{ + */ + +/** + * @example ffhash.c + * This example is a simple command line application that takes one or more + * arguments. It demonstrates a typical use of the hashing API with allocation, + * initialization, updating, and finalizing. + */ + struct AVHashContext; /** * Allocate a hash context for the algorithm specified by name. * * @return >= 0 for success, a negative error code for failure - * @note The context is not initialized, you must call av_hash_init(). + * + * @note The context is not initialized after a call to this function; you must + * call av_hash_init() to do so. */ int av_hash_alloc(struct AVHashContext **ctx, const char *name); @@ -38,8 +128,8 @@ int av_hash_alloc(struct AVHashContext **ctx, const char *name); * * This function can be used to enumerate the algorithms. * - * @param i index of the hash algorithm, starting from 0 - * @return a pointer to a static string or NULL if i is out of range + * @param[in] i Index of the hash algorithm, starting from 0 + * @return Pointer to a static string or `NULL` if `i` is out of range */ const char *av_hash_names(int i); @@ -49,64 +139,125 @@ const char *av_hash_names(int i); const char *av_hash_get_name(const struct AVHashContext *ctx); /** - * Maximum value that av_hash_get_size will currently return. + * Maximum value that av_hash_get_size() will currently return. * - * You can use this if you absolutely want or need to use static allocation - * and are fine with not supporting hashes newly added to libavutil without - * recompilation. - * Note that you still need to check against av_hash_get_size, adding new hashes - * with larger sizes will not be considered an ABI change and should not cause - * your code to overflow a buffer. + * You can use this if you absolutely want or need to use static allocation for + * the output buffer and are fine with not supporting hashes newly added to + * libavutil without recompilation. + * + * @warning + * Adding new hashes with larger sizes, and increasing the macro while doing + * so, will not be considered an ABI change. To prevent your code from + * overflowing a buffer, either dynamically allocate the output buffer with + * av_hash_get_size(), or limit your use of the Hashing API to hashes that are + * already in FFmpeg during the time of compilation. */ #define AV_HASH_MAX_SIZE 64 /** * Get the size of the resulting hash value in bytes. * - * The pointer passed to av_hash_final have space for at least this many bytes. + * The maximum value this function will currently return is available as macro + * #AV_HASH_MAX_SIZE. + * + * @param[in] ctx Hash context + * @return Size of the hash value in bytes */ int av_hash_get_size(const struct AVHashContext *ctx); /** * Initialize or reset a hash context. + * + * @param[in,out] ctx Hash context */ void av_hash_init(struct AVHashContext *ctx); /** * Update a hash context with additional data. + * + * @param[in,out] ctx Hash context + * @param[in] src Data to be added to the hash context + * @param[in] len Size of the additional data */ void av_hash_update(struct AVHashContext *ctx, const uint8_t *src, int len); /** * Finalize a hash context and compute the actual hash value. + * + * The minimum size of `dst` buffer is given by av_hash_get_size() or + * #AV_HASH_MAX_SIZE. The use of the latter macro is discouraged. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * + * @see av_hash_final_bin() provides an alternative API */ void av_hash_final(struct AVHashContext *ctx, uint8_t *dst); /** - * Finalize a hash context and compute the actual hash value. - * If size is smaller than the hash size, the hash is truncated; - * if size is larger, the buffer is padded with 0. + * Finalize a hash context and store the actual hash value in a buffer. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * If `size` is smaller than the hash size (given by av_hash_get_size()), the + * hash is truncated; if size is larger, the buffer is padded with 0. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * @param[in] size Number of bytes to write to `dst` */ void av_hash_final_bin(struct AVHashContext *ctx, uint8_t *dst, int size); /** - * Finalize a hash context and compute the actual hash value as a hex string. + * Finalize a hash context and store the hexadecimal representation of the + * actual hash value as a string. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * * The string is always 0-terminated. - * If size is smaller than 2 * hash_size + 1, the hex string is truncated. + * + * If `size` is smaller than `2 * hash_size + 1`, where `hash_size` is the + * value returned by av_hash_get_size(), the string will be truncated. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the string will be stored + * @param[in] size Maximum number of bytes to write to `dst` */ void av_hash_final_hex(struct AVHashContext *ctx, uint8_t *dst, int size); /** - * Finalize a hash context and compute the actual hash value as a base64 string. + * Finalize a hash context and store the Base64 representation of the + * actual hash value as a string. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * * The string is always 0-terminated. - * If size is smaller than AV_BASE64_SIZE(hash_size), the base64 string is - * truncated. + * + * If `size` is smaller than AV_BASE64_SIZE(hash_size), where `hash_size` is + * the value returned by av_hash_get_size(), the string will be truncated. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * @param[in] size Maximum number of bytes to write to `dst` */ void av_hash_final_b64(struct AVHashContext *ctx, uint8_t *dst, int size); /** - * Free hash context. + * Free hash context and set hash context pointer to `NULL`. + * + * @param[in,out] ctx Pointer to hash context */ void av_hash_freep(struct AVHashContext **ctx); +/** + * @} + * @} + */ + #endif /* AVUTIL_HASH_H */ diff --git a/Externals/ffmpeg/include/libavutil/hwcontext.h b/Externals/ffmpeg/include/libavutil/hwcontext.h new file mode 100644 index 0000000000..5e2af092a4 --- /dev/null +++ b/Externals/ffmpeg/include/libavutil/hwcontext.h @@ -0,0 +1,429 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_HWCONTEXT_H +#define AVUTIL_HWCONTEXT_H + +#include "buffer.h" +#include "frame.h" +#include "log.h" +#include "pixfmt.h" + +enum AVHWDeviceType { + AV_HWDEVICE_TYPE_VDPAU, + AV_HWDEVICE_TYPE_CUDA, + AV_HWDEVICE_TYPE_VAAPI, + AV_HWDEVICE_TYPE_DXVA2, + AV_HWDEVICE_TYPE_QSV, +}; + +typedef struct AVHWDeviceInternal AVHWDeviceInternal; + +/** + * This struct aggregates all the (hardware/vendor-specific) "high-level" state, + * i.e. state that is not tied to a concrete processing configuration. + * E.g., in an API that supports hardware-accelerated encoding and decoding, + * this struct will (if possible) wrap the state that is common to both encoding + * and decoding and from which specific instances of encoders or decoders can be + * derived. + * + * This struct is reference-counted with the AVBuffer mechanism. The + * av_hwdevice_ctx_alloc() constructor yields a reference, whose data field + * points to the actual AVHWDeviceContext. Further objects derived from + * AVHWDeviceContext (such as AVHWFramesContext, describing a frame pool with + * specific properties) will hold an internal reference to it. After all the + * references are released, the AVHWDeviceContext itself will be freed, + * optionally invoking a user-specified callback for uninitializing the hardware + * state. + */ +typedef struct AVHWDeviceContext { + /** + * A class for logging. Set by av_hwdevice_ctx_alloc(). + */ + const AVClass *av_class; + + /** + * Private data used internally by libavutil. Must not be accessed in any + * way by the caller. + */ + AVHWDeviceInternal *internal; + + /** + * This field identifies the underlying API used for hardware access. + * + * This field is set when this struct is allocated and never changed + * afterwards. + */ + enum AVHWDeviceType type; + + /** + * The format-specific data, allocated and freed by libavutil along with + * this context. + * + * Should be cast by the user to the format-specific context defined in the + * corresponding header (hwcontext_*.h) and filled as described in the + * documentation before calling av_hwdevice_ctx_init(). + * + * After calling av_hwdevice_ctx_init() this struct should not be modified + * by the caller. + */ + void *hwctx; + + /** + * This field may be set by the caller before calling av_hwdevice_ctx_init(). + * + * If non-NULL, this callback will be called when the last reference to + * this context is unreferenced, immediately before it is freed. + * + * @note when other objects (e.g an AVHWFramesContext) are derived from this + * struct, this callback will be invoked after all such child objects + * are fully uninitialized and their respective destructors invoked. + */ + void (*free)(struct AVHWDeviceContext *ctx); + + /** + * Arbitrary user data, to be used e.g. by the free() callback. + */ + void *user_opaque; +} AVHWDeviceContext; + +typedef struct AVHWFramesInternal AVHWFramesInternal; + +/** + * This struct describes a set or pool of "hardware" frames (i.e. those with + * data not located in normal system memory). All the frames in the pool are + * assumed to be allocated in the same way and interchangeable. + * + * This struct is reference-counted with the AVBuffer mechanism and tied to a + * given AVHWDeviceContext instance. The av_hwframe_ctx_alloc() constructor + * yields a reference, whose data field points to the actual AVHWFramesContext + * struct. + */ +typedef struct AVHWFramesContext { + /** + * A class for logging. + */ + const AVClass *av_class; + + /** + * Private data used internally by libavutil. Must not be accessed in any + * way by the caller. + */ + AVHWFramesInternal *internal; + + /** + * A reference to the parent AVHWDeviceContext. This reference is owned and + * managed by the enclosing AVHWFramesContext, but the caller may derive + * additional references from it. + */ + AVBufferRef *device_ref; + + /** + * The parent AVHWDeviceContext. This is simply a pointer to + * device_ref->data provided for convenience. + * + * Set by libavutil in av_hwframe_ctx_init(). + */ + AVHWDeviceContext *device_ctx; + + /** + * The format-specific data, allocated and freed automatically along with + * this context. + * + * Should be cast by the user to the format-specific context defined in the + * corresponding header (hwframe_*.h) and filled as described in the + * documentation before calling av_hwframe_ctx_init(). + * + * After any frames using this context are created, the contents of this + * struct should not be modified by the caller. + */ + void *hwctx; + + /** + * This field may be set by the caller before calling av_hwframe_ctx_init(). + * + * If non-NULL, this callback will be called when the last reference to + * this context is unreferenced, immediately before it is freed. + */ + void (*free)(struct AVHWFramesContext *ctx); + + /** + * Arbitrary user data, to be used e.g. by the free() callback. + */ + void *user_opaque; + + /** + * A pool from which the frames are allocated by av_hwframe_get_buffer(). + * This field may be set by the caller before calling av_hwframe_ctx_init(). + * The buffers returned by calling av_buffer_pool_get() on this pool must + * have the properties described in the documentation in the corresponding hw + * type's header (hwcontext_*.h). The pool will be freed strictly before + * this struct's free() callback is invoked. + * + * This field may be NULL, then libavutil will attempt to allocate a pool + * internally. Note that certain device types enforce pools allocated at + * fixed size (frame count), which cannot be extended dynamically. In such a + * case, initial_pool_size must be set appropriately. + */ + AVBufferPool *pool; + + /** + * Initial size of the frame pool. If a device type does not support + * dynamically resizing the pool, then this is also the maximum pool size. + * + * May be set by the caller before calling av_hwframe_ctx_init(). Must be + * set if pool is NULL and the device type does not support dynamic pools. + */ + int initial_pool_size; + + /** + * The pixel format identifying the underlying HW surface type. + * + * Must be a hwaccel format, i.e. the corresponding descriptor must have the + * AV_PIX_FMT_FLAG_HWACCEL flag set. + * + * Must be set by the user before calling av_hwframe_ctx_init(). + */ + enum AVPixelFormat format; + + /** + * The pixel format identifying the actual data layout of the hardware + * frames. + * + * Must be set by the caller before calling av_hwframe_ctx_init(). + * + * @note when the underlying API does not provide the exact data layout, but + * only the colorspace/bit depth, this field should be set to the fully + * planar version of that format (e.g. for 8-bit 420 YUV it should be + * AV_PIX_FMT_YUV420P, not AV_PIX_FMT_NV12 or anything else). + */ + enum AVPixelFormat sw_format; + + /** + * The allocated dimensions of the frames in this pool. + * + * Must be set by the user before calling av_hwframe_ctx_init(). + */ + int width, height; +} AVHWFramesContext; + +/** + * Allocate an AVHWDeviceContext for a given pixel format. + * + * @param format a hwaccel pixel format (AV_PIX_FMT_FLAG_HWACCEL must be set + * on the corresponding format descriptor) + * @return a reference to the newly created AVHWDeviceContext on success or NULL + * on failure. + */ +AVBufferRef *av_hwdevice_ctx_alloc(enum AVHWDeviceType type); + +/** + * Finalize the device context before use. This function must be called after + * the context is filled with all the required information and before it is + * used in any way. + * + * @param ref a reference to the AVHWDeviceContext + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwdevice_ctx_init(AVBufferRef *ref); + +/** + * Open a device of the specified type and create an AVHWDeviceContext for it. + * + * This is a convenience function intended to cover the simple cases. Callers + * who need to fine-tune device creation/management should open the device + * manually and then wrap it in an AVHWDeviceContext using + * av_hwdevice_ctx_alloc()/av_hwdevice_ctx_init(). + * + * The returned context is already initialized and ready for use, the caller + * should not call av_hwdevice_ctx_init() on it. The user_opaque/free fields of + * the created AVHWDeviceContext are set by this function and should not be + * touched by the caller. + * + * @param device_ctx On success, a reference to the newly-created device context + * will be written here. The reference is owned by the caller + * and must be released with av_buffer_unref() when no longer + * needed. On failure, NULL will be written to this pointer. + * @param type The type of the device to create. + * @param device A type-specific string identifying the device to open. + * @param opts A dictionary of additional (type-specific) options to use in + * opening the device. The dictionary remains owned by the caller. + * @param flags currently unused + * + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_hwdevice_ctx_create(AVBufferRef **device_ctx, enum AVHWDeviceType type, + const char *device, AVDictionary *opts, int flags); + +/** + * Allocate an AVHWFramesContext tied to a given device context. + * + * @param device_ctx a reference to a AVHWDeviceContext. This function will make + * a new reference for internal use, the one passed to the + * function remains owned by the caller. + * @return a reference to the newly created AVHWFramesContext on success or NULL + * on failure. + */ +AVBufferRef *av_hwframe_ctx_alloc(AVBufferRef *device_ctx); + +/** + * Finalize the context before use. This function must be called after the + * context is filled with all the required information and before it is attached + * to any frames. + * + * @param ref a reference to the AVHWFramesContext + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwframe_ctx_init(AVBufferRef *ref); + +/** + * Allocate a new frame attached to the given AVHWFramesContext. + * + * @param hwframe_ctx a reference to an AVHWFramesContext + * @param frame an empty (freshly allocated or unreffed) frame to be filled with + * newly allocated buffers. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwframe_get_buffer(AVBufferRef *hwframe_ctx, AVFrame *frame, int flags); + +/** + * Copy data to or from a hw surface. At least one of dst/src must have an + * AVHWFramesContext attached. + * + * If src has an AVHWFramesContext attached, then the format of dst (if set) + * must use one of the formats returned by av_hwframe_transfer_get_formats(src, + * AV_HWFRAME_TRANSFER_DIRECTION_FROM). + * If dst has an AVHWFramesContext attached, then the format of src must use one + * of the formats returned by av_hwframe_transfer_get_formats(dst, + * AV_HWFRAME_TRANSFER_DIRECTION_TO) + * + * dst may be "clean" (i.e. with data/buf pointers unset), in which case the + * data buffers will be allocated by this function using av_frame_get_buffer(). + * If dst->format is set, then this format will be used, otherwise (when + * dst->format is AV_PIX_FMT_NONE) the first acceptable format will be chosen. + * + * @param dst the destination frame. dst is not touched on failure. + * @param src the source frame. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR error code on failure. + */ +int av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags); + +enum AVHWFrameTransferDirection { + /** + * Transfer the data from the queried hw frame. + */ + AV_HWFRAME_TRANSFER_DIRECTION_FROM, + + /** + * Transfer the data to the queried hw frame. + */ + AV_HWFRAME_TRANSFER_DIRECTION_TO, +}; + +/** + * Get a list of possible source or target formats usable in + * av_hwframe_transfer_data(). + * + * @param hwframe_ctx the frame context to obtain the information for + * @param dir the direction of the transfer + * @param formats the pointer to the output format list will be written here. + * The list is terminated with AV_PIX_FMT_NONE and must be freed + * by the caller when no longer needed using av_free(). + * If this function returns successfully, the format list will + * have at least one item (not counting the terminator). + * On failure, the contents of this pointer are unspecified. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_hwframe_transfer_get_formats(AVBufferRef *hwframe_ctx, + enum AVHWFrameTransferDirection dir, + enum AVPixelFormat **formats, int flags); + + +/** + * This struct describes the constraints on hardware frames attached to + * a given device with a hardware-specific configuration. This is returned + * by av_hwdevice_get_hwframe_constraints() and must be freed by + * av_hwframe_constraints_free() after use. + */ +typedef struct AVHWFramesConstraints { + /** + * A list of possible values for format in the hw_frames_ctx, + * terminated by AV_PIX_FMT_NONE. This member will always be filled. + */ + enum AVPixelFormat *valid_hw_formats; + + /** + * A list of possible values for sw_format in the hw_frames_ctx, + * terminated by AV_PIX_FMT_NONE. Can be NULL if this information is + * not known. + */ + enum AVPixelFormat *valid_sw_formats; + + /** + * The minimum size of frames in this hw_frames_ctx. + * (Zero if not known.) + */ + int min_width; + int min_height; + + /** + * The maximum size of frames in this hw_frames_ctx. + * (INT_MAX if not known / no limit.) + */ + int max_width; + int max_height; +} AVHWFramesConstraints; + +/** + * Allocate a HW-specific configuration structure for a given HW device. + * After use, the user must free all members as required by the specific + * hardware structure being used, then free the structure itself with + * av_free(). + * + * @param device_ctx a reference to the associated AVHWDeviceContext. + * @return The newly created HW-specific configuration structure on + * success or NULL on failure. + */ +void *av_hwdevice_hwconfig_alloc(AVBufferRef *device_ctx); + +/** + * Get the constraints on HW frames given a device and the HW-specific + * configuration to be used with that device. If no HW-specific + * configuration is provided, returns the maximum possible capabilities + * of the device. + * + * @param device_ctx a reference to the associated AVHWDeviceContext. + * @param hwconfig a filled HW-specific configuration structure, or NULL + * to return the maximum possible capabilities of the device. + * @return AVHWFramesConstraints structure describing the constraints + * on the device, or NULL if not available. + */ +AVHWFramesConstraints *av_hwdevice_get_hwframe_constraints(AVBufferRef *ref, + const void *hwconfig); + +/** + * Free an AVHWFrameConstraints structure. + * + * @param constraints The (filled or unfilled) AVHWFrameConstraints structure. + */ +void av_hwframe_constraints_free(AVHWFramesConstraints **constraints); + +#endif /* AVUTIL_HWCONTEXT_H */ diff --git a/Externals/ffmpeg/include/libavutil/hwcontext_cuda.h b/Externals/ffmpeg/include/libavutil/hwcontext_cuda.h new file mode 100644 index 0000000000..23a77cee73 --- /dev/null +++ b/Externals/ffmpeg/include/libavutil/hwcontext_cuda.h @@ -0,0 +1,46 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef AVUTIL_HWCONTEXT_CUDA_H +#define AVUTIL_HWCONTEXT_CUDA_H + +#include + +#include "pixfmt.h" + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_CUDA. + * + * This API supports dynamic frame pools. AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a CUdeviceptr. + */ + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVCUDADeviceContext { + CUcontext cuda_ctx; +} AVCUDADeviceContext; + +/** + * AVHWFramesContext.hwctx is currently not used + */ + +#endif /* AVUTIL_HWCONTEXT_CUDA_H */ diff --git a/Externals/ffmpeg/include/libavutil/hwcontext_dxva2.h b/Externals/ffmpeg/include/libavutil/hwcontext_dxva2.h new file mode 100644 index 0000000000..6c36cb4b6b --- /dev/null +++ b/Externals/ffmpeg/include/libavutil/hwcontext_dxva2.h @@ -0,0 +1,72 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef AVUTIL_HWCONTEXT_DXVA2_H +#define AVUTIL_HWCONTEXT_DXVA2_H + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_DXVA2. + * + * Only fixed-size pools are supported. + * + * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer set to a pointer to IDirect3DSurface9. + */ + +#include +#include + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVDXVA2DeviceContext { + IDirect3DDeviceManager9 *devmgr; +} AVDXVA2DeviceContext; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVDXVA2FramesContext { + /** + * The surface type (e.g. DXVA2_VideoProcessorRenderTarget or + * DXVA2_VideoDecoderRenderTarget). Must be set by the caller. + */ + DWORD surface_type; + + /** + * The surface pool. When an external pool is not provided by the caller, + * this will be managed (allocated and filled on init, freed on uninit) by + * libavutil. + */ + IDirect3DSurface9 **surfaces; + int nb_surfaces; + + /** + * Certain drivers require the decoder to be destroyed before the surfaces. + * To allow internally managed pools to work properly in such cases, this + * field is provided. + * + * If it is non-NULL, libavutil will call IDirectXVideoDecoder_Release() on + * it just before the internal surface pool is freed. + */ + IDirectXVideoDecoder *decoder_to_release; +} AVDXVA2FramesContext; + +#endif /* AVUTIL_HWCONTEXT_DXVA2_H */ diff --git a/Externals/ffmpeg/include/libavutil/hwcontext_qsv.h b/Externals/ffmpeg/include/libavutil/hwcontext_qsv.h new file mode 100644 index 0000000000..b98d611cfc --- /dev/null +++ b/Externals/ffmpeg/include/libavutil/hwcontext_qsv.h @@ -0,0 +1,53 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_HWCONTEXT_QSV_H +#define AVUTIL_HWCONTEXT_QSV_H + +#include + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_QSV. + * + * This API does not support dynamic frame pools. AVHWFramesContext.pool must + * contain AVBufferRefs whose data pointer points to an mfxFrameSurface1 struct. + */ + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVQSVDeviceContext { + mfxSession session; +} AVQSVDeviceContext; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVQSVFramesContext { + mfxFrameSurface1 *surfaces; + int nb_surfaces; + + /** + * A combination of MFX_MEMTYPE_* describing the frame pool. + */ + int frame_type; +} AVQSVFramesContext; + +#endif /* AVUTIL_HWCONTEXT_QSV_H */ + diff --git a/Externals/ffmpeg/include/libavutil/hwcontext_vaapi.h b/Externals/ffmpeg/include/libavutil/hwcontext_vaapi.h new file mode 100644 index 0000000000..7fd1a36e8f --- /dev/null +++ b/Externals/ffmpeg/include/libavutil/hwcontext_vaapi.h @@ -0,0 +1,82 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_HWCONTEXT_VAAPI_H +#define AVUTIL_HWCONTEXT_VAAPI_H + +#include + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_VAAPI. + * + * Dynamic frame pools are supported, but note that any pool used as a render + * target is required to be of fixed size in order to be be usable as an + * argument to vaCreateContext(). + * + * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer set to a VASurfaceID. + */ + +/** + * VAAPI connection details. + * + * Allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVVAAPIDeviceContext { + /** + * The VADisplay handle, to be filled by the user. + */ + VADisplay display; +} AVVAAPIDeviceContext; + +/** + * VAAPI-specific data associated with a frame pool. + * + * Allocated as AVHWFramesContext.hwctx. + */ +typedef struct AVVAAPIFramesContext { + /** + * Set by the user to apply surface attributes to all surfaces in + * the frame pool. If null, default settings are used. + */ + VASurfaceAttrib *attributes; + int nb_attributes; + /** + * The surfaces IDs of all surfaces in the pool after creation. + * Only valid if AVHWFramesContext.initial_pool_size was positive. + * These are intended to be used as the render_targets arguments to + * vaCreateContext(). + */ + VASurfaceID *surface_ids; + int nb_surfaces; +} AVVAAPIFramesContext; + +/** + * VAAPI hardware pipeline configuration details. + * + * Allocated with av_hwdevice_hwconfig_alloc(). + */ +typedef struct AVVAAPIHWConfig { + /** + * ID of a VAAPI pipeline configuration. + */ + VAConfigID config_id; +} AVVAAPIHWConfig; + +#endif /* AVUTIL_HWCONTEXT_VAAPI_H */ diff --git a/Externals/ffmpeg/include/libavutil/hwcontext_vdpau.h b/Externals/ffmpeg/include/libavutil/hwcontext_vdpau.h new file mode 100644 index 0000000000..1b7ea1e443 --- /dev/null +++ b/Externals/ffmpeg/include/libavutil/hwcontext_vdpau.h @@ -0,0 +1,44 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_HWCONTEXT_VDPAU_H +#define AVUTIL_HWCONTEXT_VDPAU_H + +#include + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_VDPAU. + * + * This API supports dynamic frame pools. AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a VdpVideoSurface. + */ + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVVDPAUDeviceContext { + VdpDevice device; + VdpGetProcAddress *get_proc_address; +} AVVDPAUDeviceContext; + +/** + * AVHWFramesContext.hwctx is currently not used + */ + +#endif /* AVUTIL_HWCONTEXT_VDPAU_H */ diff --git a/Externals/ffmpeg/include/libavutil/imgutils.h b/Externals/ffmpeg/include/libavutil/imgutils.h index 23282a38fa..19f34deced 100644 --- a/Externals/ffmpeg/include/libavutil/imgutils.h +++ b/Externals/ffmpeg/include/libavutil/imgutils.h @@ -191,6 +191,20 @@ int av_image_copy_to_buffer(uint8_t *dst, int dst_size, */ int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx); +/** + * Check if the given dimension of an image is valid, meaning that all + * bytes of the image can be addressed with a signed int. + * + * @param w the width of the picture + * @param h the height of the picture + * @param max_pixels the maximum number of pixels the user wants to accept + * @param pix_fmt the pixel format, can be AV_PIX_FMT_NONE if unknown. + * @param log_offset the offset to sum to the log level for logging with log_ctx + * @param log_ctx the parent logging context, it may be NULL + * @return >= 0 if valid, a negative error code otherwise + */ +int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx); + /** * Check if the given sample aspect ratio of an image is valid. * diff --git a/Externals/ffmpeg/include/libavutil/log.h b/Externals/ffmpeg/include/libavutil/log.h index 321748cd80..f0a57385df 100644 --- a/Externals/ffmpeg/include/libavutil/log.h +++ b/Externals/ffmpeg/include/libavutil/log.h @@ -44,7 +44,7 @@ typedef enum { AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, AV_CLASS_CATEGORY_DEVICE_OUTPUT, AV_CLASS_CATEGORY_DEVICE_INPUT, - AV_CLASS_CATEGORY_NB, ///< not part of ABI/API + AV_CLASS_CATEGORY_NB ///< not part of ABI/API }AVClassCategory; #define AV_IS_INPUT_DEVICE(category) \ @@ -317,6 +317,23 @@ AVClassCategory av_default_get_category(void *ptr); void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl, char *line, int line_size, int *print_prefix); +/** + * Format a line of log the same way as the default callback. + * @param line buffer to receive the formatted line; + * may be NULL if line_size is 0 + * @param line_size size of the buffer; at most line_size-1 characters will + * be written to the buffer, plus one null terminator + * @param print_prefix used to store whether the prefix must be printed; + * must point to a persistent integer initially set to 1 + * @return Returns a negative value if an error occurred, otherwise returns + * the number of characters that would have been written for a + * sufficiently large buffer, not including the terminating null + * character. If the return value is not less than line_size, it means + * that the log message was truncated to fit the buffer. + */ +int av_log_format_line2(void *ptr, int level, const char *fmt, va_list vl, + char *line, int line_size, int *print_prefix); + #if FF_API_DLOG /** * av_dlog macros diff --git a/Externals/ffmpeg/include/libavutil/mastering_display_metadata.h b/Externals/ffmpeg/include/libavutil/mastering_display_metadata.h new file mode 100644 index 0000000000..936533fec4 --- /dev/null +++ b/Externals/ffmpeg/include/libavutil/mastering_display_metadata.h @@ -0,0 +1,89 @@ +/** + * Copyright (c) 2016 Neil Birkbeck + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_MASTERING_DISPLAY_METADATA_H +#define AVUTIL_MASTERING_DISPLAY_METADATA_H + +#include "frame.h" +#include "rational.h" + + +/** + * Mastering display metadata capable of representing the color volume of + * the display used to master the content (SMPTE 2086:2014). + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with av_mastering_display_metadata_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVMasteringDisplayMetadata { + /** + * CIE 1931 xy chromaticity coords of color primaries (r, g, b order). + */ + AVRational display_primaries[3][2]; + + /** + * CIE 1931 xy chromaticity coords of white point. + */ + AVRational white_point[2]; + + /** + * Min luminance of mastering display (cd/m^2). + */ + AVRational min_luminance; + + /** + * Max luminance of mastering display (cd/m^2). + */ + AVRational max_luminance; + + /** + * Flag indicating whether the display primaries (and white point) are set. + */ + int has_primaries; + + /** + * Flag indicating whether the luminance (min_ and max_) have been set. + */ + int has_luminance; + +} AVMasteringDisplayMetadata; + +/** + * Allocate an AVMasteringDisplayMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVMasteringDisplayMetadata filled with default values or NULL + * on failure. + */ +AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void); + +/** + * Allocate a complete AVMasteringDisplayMetadata and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVMasteringDisplayMetadata structure to be filled by caller. + */ +AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */ diff --git a/Externals/ffmpeg/include/libavutil/mathematics.h b/Externals/ffmpeg/include/libavutil/mathematics.h index 57c44f845d..54901800ba 100644 --- a/Externals/ffmpeg/include/libavutil/mathematics.h +++ b/Externals/ffmpeg/include/libavutil/mathematics.h @@ -18,6 +18,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/** + * @file + * @addtogroup lavu_math + * Mathematical utilities for working with timestamp and time base. + */ + #ifndef AVUTIL_MATHEMATICS_H #define AVUTIL_MATHEMATICS_H @@ -63,84 +69,155 @@ /** * @addtogroup lavu_math + * * @{ */ - +/** + * Rounding methods. + */ enum AVRounding { AV_ROUND_ZERO = 0, ///< Round toward zero. AV_ROUND_INF = 1, ///< Round away from zero. AV_ROUND_DOWN = 2, ///< Round toward -infinity. AV_ROUND_UP = 3, ///< Round toward +infinity. AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero. - AV_ROUND_PASS_MINMAX = 8192, ///< Flag to pass INT64_MIN/MAX through instead of rescaling, this avoids special cases for AV_NOPTS_VALUE + /** + * Flag telling rescaling functions to pass `INT64_MIN`/`MAX` through + * unchanged, avoiding special cases for #AV_NOPTS_VALUE. + * + * Unlike other values of the enumeration AVRounding, this value is a + * bitmask that must be used in conjunction with another value of the + * enumeration through a bitwise OR, in order to set behavior for normal + * cases. + * + * @code{.c} + * av_rescale_rnd(3, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); + * // Rescaling 3: + * // Calculating 3 * 1 / 2 + * // 3 / 2 is rounded up to 2 + * // => 2 + * + * av_rescale_rnd(AV_NOPTS_VALUE, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); + * // Rescaling AV_NOPTS_VALUE: + * // AV_NOPTS_VALUE == INT64_MIN + * // AV_NOPTS_VALUE is passed through + * // => AV_NOPTS_VALUE + * @endcode + */ + AV_ROUND_PASS_MINMAX = 8192, }; /** - * Compute the greatest common divisor of a and b. + * Compute the greatest common divisor of two integer operands. * - * @return gcd of a and b up to sign; if a >= 0 and b >= 0, return value is >= 0; + * @param a,b Operands + * @return GCD of a and b up to sign; if a >= 0 and b >= 0, return value is >= 0; * if a == 0 and b == 0, returns 0. */ int64_t av_const av_gcd(int64_t a, int64_t b); /** * Rescale a 64-bit integer with rounding to nearest. - * A simple a*b/c isn't possible as it can overflow. + * + * The operation is mathematically equivalent to `a * b / c`, but writing that + * directly can overflow. + * + * This function is equivalent to av_rescale_rnd() with #AV_ROUND_NEAR_INF. + * + * @see av_rescale_rnd(), av_rescale_q(), av_rescale_q_rnd() */ int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const; /** * Rescale a 64-bit integer with specified rounding. - * A simple a*b/c isn't possible as it can overflow. * - * @return rescaled value a, or if AV_ROUND_PASS_MINMAX is set and a is - * INT64_MIN or INT64_MAX then a is passed through unchanged. + * The operation is mathematically equivalent to `a * b / c`, but writing that + * directly can overflow, and does not support different rounding methods. + * + * @see av_rescale(), av_rescale_q(), av_rescale_q_rnd() */ -int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding) av_const; +int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd) av_const; /** * Rescale a 64-bit integer by 2 rational numbers. + * + * The operation is mathematically equivalent to `a * bq / cq`. + * + * This function is equivalent to av_rescale_q_rnd() with #AV_ROUND_NEAR_INF. + * + * @see av_rescale(), av_rescale_rnd(), av_rescale_q_rnd() */ int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const; /** * Rescale a 64-bit integer by 2 rational numbers with specified rounding. * - * @return rescaled value a, or if AV_ROUND_PASS_MINMAX is set and a is - * INT64_MIN or INT64_MAX then a is passed through unchanged. + * The operation is mathematically equivalent to `a * bq / cq`. + * + * @see av_rescale(), av_rescale_rnd(), av_rescale_q() */ int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, - enum AVRounding) av_const; + enum AVRounding rnd) av_const; /** - * Compare 2 timestamps each in its own timebases. - * The result of the function is undefined if one of the timestamps - * is outside the int64_t range when represented in the others timebase. - * @return -1 if ts_a is before ts_b, 1 if ts_a is after ts_b or 0 if they represent the same position + * Compare two timestamps each in its own time base. + * + * @return One of the following values: + * - -1 if `ts_a` is before `ts_b` + * - 1 if `ts_a` is after `ts_b` + * - 0 if they represent the same position + * + * @warning + * The result of the function is undefined if one of the timestamps is outside + * the `int64_t` range when represented in the other's timebase. */ int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b); /** - * Compare 2 integers modulo mod. - * That is we compare integers a and b for which only the least - * significant log2(mod) bits are known. + * Compare the remainders of two integer operands divided by a common divisor. * - * @param mod must be a power of 2 - * @return a negative value if a is smaller than b - * a positive value if a is greater than b - * 0 if a equals b + * In other words, compare the least significant `log2(mod)` bits of integers + * `a` and `b`. + * + * @code{.c} + * av_compare_mod(0x11, 0x02, 0x10) < 0 // since 0x11 % 0x10 (0x1) < 0x02 % 0x10 (0x2) + * av_compare_mod(0x11, 0x02, 0x20) > 0 // since 0x11 % 0x20 (0x11) > 0x02 % 0x20 (0x02) + * @endcode + * + * @param a,b Operands + * @param mod Divisor; must be a power of 2 + * @return + * - a negative value if `a % mod < b % mod` + * - a positive value if `a % mod > b % mod` + * - zero if `a % mod == b % mod` */ int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod); /** * Rescale a timestamp while preserving known durations. * - * @param in_ts Input timestamp - * @param in_tb Input timebase - * @param fs_tb Duration and *last timebase - * @param duration duration till the next call - * @param out_tb Output timebase + * This function is designed to be called per audio packet to scale the input + * timestamp to a different time base. Compared to a simple av_rescale_q() + * call, this function is robust against possible inconsistent frame durations. + * + * The `last` parameter is a state variable that must be preserved for all + * subsequent calls for the same stream. For the first call, `*last` should be + * initialized to #AV_NOPTS_VALUE. + * + * @param[in] in_tb Input time base + * @param[in] in_ts Input timestamp + * @param[in] fs_tb Duration time base; typically this is finer-grained + * (greater) than `in_tb` and `out_tb` + * @param[in] duration Duration till the next call to this function (i.e. + * duration of the current packet/frame) + * @param[in,out] last Pointer to a timestamp expressed in terms of + * `fs_tb`, acting as a state variable + * @param[in] out_tb Output timebase + * @return Timestamp expressed in terms of `out_tb` + * + * @note In the context of this function, "duration" is in term of samples, not + * seconds. */ int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts, AVRational fs_tb, int duration, int64_t *last, AVRational out_tb); @@ -150,15 +227,15 @@ int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts, AVRational fs_tb, int * This function guarantees that when the same value is repeatly added that * no accumulation of rounding errors occurs. * - * @param ts Input timestamp - * @param ts_tb Input timestamp timebase - * @param inc value to add to ts - * @param inc_tb inc timebase + * @param[in] ts Input timestamp + * @param[in] ts_tb Input timestamp time base + * @param[in] inc Value to be added + * @param[in] inc_tb Time base of `inc` */ int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t inc); - /** +/** * @} */ diff --git a/Externals/ffmpeg/include/libavutil/md5.h b/Externals/ffmpeg/include/libavutil/md5.h index 79702c88c2..9571c1fa46 100644 --- a/Externals/ffmpeg/include/libavutil/md5.h +++ b/Externals/ffmpeg/include/libavutil/md5.h @@ -18,6 +18,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/** + * @file + * @ingroup lavu_md5 + * Public header for MD5 hash function implementation. + */ + #ifndef AVUTIL_MD5_H #define AVUTIL_MD5_H @@ -28,7 +34,9 @@ /** * @defgroup lavu_md5 MD5 - * @ingroup lavu_crypto + * @ingroup lavu_hash + * MD5 hash function implementation. + * * @{ */ diff --git a/Externals/ffmpeg/include/libavutil/mem.h b/Externals/ffmpeg/include/libavutil/mem.h index d25b3229b7..f9d8884788 100644 --- a/Externals/ffmpeg/include/libavutil/mem.h +++ b/Externals/ffmpeg/include/libavutil/mem.h @@ -20,7 +20,8 @@ /** * @file - * memory handling functions + * @ingroup lavu_mem + * Memory handling functions */ #ifndef AVUTIL_MEM_H @@ -35,9 +36,56 @@ /** * @addtogroup lavu_mem + * Utilities for manipulating memory. + * + * FFmpeg has several applications of memory that are not required of a typical + * program. For example, the computing-heavy components like video decoding and + * encoding can be sped up significantly through the use of aligned memory. + * + * However, for each of FFmpeg's applications of memory, there might not be a + * recognized or standardized API for that specific use. Memory alignment, for + * instance, varies wildly depending on operating systems, architectures, and + * compilers. Hence, this component of @ref libavutil is created to make + * dealing with memory consistently possible on all platforms. + * + * @{ + * + * @defgroup lavu_mem_macros Alignment Macros + * Helper macros for declaring aligned variables. * @{ */ +/** + * @def DECLARE_ALIGNED(n,t,v) + * Declare a variable that is aligned in memory. + * + * @code{.c} + * DECLARE_ALIGNED(16, uint16_t, aligned_int) = 42; + * DECLARE_ALIGNED(32, uint8_t, aligned_array)[128]; + * + * // The default-alignment equivalent would be + * uint16_t aligned_int = 42; + * uint8_t aligned_array[128]; + * @endcode + * + * @param n Minimum alignment in bytes + * @param t Type of the variable (or array element) + * @param v Name of the variable + */ + +/** + * @def DECLARE_ASM_CONST(n,t,v) + * Declare a static constant aligned variable appropriate for use in inline + * assembly code. + * + * @code{.c} + * DECLARE_ASM_CONST(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008); + * @endcode + * + * @param n Minimum alignment in bytes + * @param t Type of the variable (or array element) + * @param v Name of the variable + */ #if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1110 || defined(__SUNPRO_C) #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v @@ -60,12 +108,47 @@ #define DECLARE_ASM_CONST(n,t,v) static const t v #endif +/** + * @} + */ + +/** + * @defgroup lavu_mem_attrs Function Attributes + * Function attributes applicable to memory handling functions. + * + * These function attributes can help compilers emit more useful warnings, or + * generate better code. + * @{ + */ + +/** + * @def av_malloc_attrib + * Function attribute denoting a malloc-like function. + * + * @see Function attribute `malloc` in GCC's documentation + */ + #if AV_GCC_VERSION_AT_LEAST(3,1) #define av_malloc_attrib __attribute__((__malloc__)) #else #define av_malloc_attrib #endif +/** + * @def av_alloc_size(...) + * Function attribute used on a function that allocates memory, whose size is + * given by the specified parameter(s). + * + * @code{.c} + * void *av_malloc(size_t size) av_alloc_size(1); + * void *av_calloc(size_t nmemb, size_t size) av_alloc_size(1, 2); + * @endcode + * + * @param ... One or two parameter indexes, separated by a comma + * + * @see Function attribute `alloc_size` in GCC's documentation + */ + #if AV_GCC_VERSION_AT_LEAST(4,3) #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__))) #else @@ -73,21 +156,51 @@ #endif /** - * Allocate a block of size bytes with alignment suitable for all - * memory accesses (including vectors if available on the CPU). - * @param size Size in bytes for the memory block to be allocated. - * @return Pointer to the allocated block, NULL if the block cannot - * be allocated. + * @} + */ + +/** + * @defgroup lavu_mem_funcs Heap Management + * Functions responsible for allocating, freeing, and copying memory. + * + * All memory allocation functions have a built-in upper limit of `INT_MAX` + * bytes. This may be changed with av_max_alloc(), although exercise extreme + * caution when doing so. + * + * @{ + */ + +/** + * Allocate a memory block with alignment suitable for all memory accesses + * (including vectors if available on the CPU). + * + * @param size Size in bytes for the memory block to be allocated + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated * @see av_mallocz() */ void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1); /** - * Allocate a block of size * nmemb bytes with av_malloc(). - * @param nmemb Number of elements - * @param size Size of the single element - * @return Pointer to the allocated block, NULL if the block cannot - * be allocated. + * Allocate a memory block with alignment suitable for all memory accesses + * (including vectors if available on the CPU) and zero all the bytes of the + * block. + * + * @param size Size in bytes for the memory block to be allocated + * @return Pointer to the allocated block, or `NULL` if it cannot be allocated + * @see av_malloc() + */ +void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1); + +/** + * Allocate a memory block for an array with av_malloc(). + * + * The allocated memory will have size `size * nmemb` bytes. + * + * @param nmemb Number of element + * @param size Size of a single element + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated * @see av_malloc() */ av_alloc_size(1, 2) static inline void *av_malloc_array(size_t nmemb, size_t size) @@ -98,131 +211,15 @@ av_alloc_size(1, 2) static inline void *av_malloc_array(size_t nmemb, size_t siz } /** - * Allocate or reallocate a block of memory. - * If ptr is NULL and size > 0, allocate a new block. If - * size is zero, free the memory block pointed to by ptr. - * @param ptr Pointer to a memory block already allocated with - * av_realloc() or NULL. - * @param size Size in bytes of the memory block to be allocated or - * reallocated. - * @return Pointer to a newly-reallocated block or NULL if the block - * cannot be reallocated or the function is used to free the memory block. - * @warning Pointers originating from the av_malloc() family of functions must - * not be passed to av_realloc(). The former can be implemented using - * memalign() (or other functions), and there is no guarantee that - * pointers from such functions can be passed to realloc() at all. - * The situation is undefined according to POSIX and may crash with - * some libc implementations. - * @see av_fast_realloc() - */ -void *av_realloc(void *ptr, size_t size) av_alloc_size(2); - -/** - * Allocate or reallocate a block of memory. - * This function does the same thing as av_realloc, except: - * - It takes two arguments and checks the result of the multiplication for - * integer overflow. - * - It frees the input block in case of failure, thus avoiding the memory - * leak with the classic "buf = realloc(buf); if (!buf) return -1;". - */ -void *av_realloc_f(void *ptr, size_t nelem, size_t elsize); - -/** - * Allocate or reallocate a block of memory. - * If *ptr is NULL and size > 0, allocate a new block. If - * size is zero, free the memory block pointed to by ptr. - * @param ptr Pointer to a pointer to a memory block already allocated - * with av_realloc(), or pointer to a pointer to NULL. - * The pointer is updated on success, or freed on failure. - * @param size Size in bytes for the memory block to be allocated or - * reallocated - * @return Zero on success, an AVERROR error code on failure. - * @warning Pointers originating from the av_malloc() family of functions must - * not be passed to av_reallocp(). The former can be implemented using - * memalign() (or other functions), and there is no guarantee that - * pointers from such functions can be passed to realloc() at all. - * The situation is undefined according to POSIX and may crash with - * some libc implementations. - */ -av_warn_unused_result -int av_reallocp(void *ptr, size_t size); - -/** - * Allocate or reallocate an array. - * If ptr is NULL and nmemb > 0, allocate a new block. If - * nmemb is zero, free the memory block pointed to by ptr. - * @param ptr Pointer to a memory block already allocated with - * av_realloc() or NULL. + * Allocate a memory block for an array with av_mallocz(). + * + * The allocated memory will have size `size * nmemb` bytes. + * * @param nmemb Number of elements - * @param size Size of the single element - * @return Pointer to a newly-reallocated block or NULL if the block - * cannot be reallocated or the function is used to free the memory block. - * @warning Pointers originating from the av_malloc() family of functions must - * not be passed to av_realloc(). The former can be implemented using - * memalign() (or other functions), and there is no guarantee that - * pointers from such functions can be passed to realloc() at all. - * The situation is undefined according to POSIX and may crash with - * some libc implementations. - */ -av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size); - -/** - * Allocate or reallocate an array through a pointer to a pointer. - * If *ptr is NULL and nmemb > 0, allocate a new block. If - * nmemb is zero, free the memory block pointed to by ptr. - * @param ptr Pointer to a pointer to a memory block already allocated - * with av_realloc(), or pointer to a pointer to NULL. - * The pointer is updated on success, or freed on failure. - * @param nmemb Number of elements - * @param size Size of the single element - * @return Zero on success, an AVERROR error code on failure. - * @warning Pointers originating from the av_malloc() family of functions must - * not be passed to av_realloc(). The former can be implemented using - * memalign() (or other functions), and there is no guarantee that - * pointers from such functions can be passed to realloc() at all. - * The situation is undefined according to POSIX and may crash with - * some libc implementations. - */ -av_alloc_size(2, 3) int av_reallocp_array(void *ptr, size_t nmemb, size_t size); - -/** - * Free a memory block which has been allocated with av_malloc(z)() or - * av_realloc(). - * @param ptr Pointer to the memory block which should be freed. - * @note ptr = NULL is explicitly allowed. - * @note It is recommended that you use av_freep() instead. - * @see av_freep() - */ -void av_free(void *ptr); - -/** - * Allocate a block of size bytes with alignment suitable for all - * memory accesses (including vectors if available on the CPU) and - * zero all the bytes of the block. - * @param size Size in bytes for the memory block to be allocated. - * @return Pointer to the allocated block, NULL if it cannot be allocated. - * @see av_malloc() - */ -void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1); - -/** - * Allocate a block of nmemb * size bytes with alignment suitable for all - * memory accesses (including vectors if available on the CPU) and - * zero all the bytes of the block. - * The allocation will fail if nmemb * size is greater than or equal - * to INT_MAX. - * @param nmemb - * @param size - * @return Pointer to the allocated block, NULL if it cannot be allocated. - */ -void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib; - -/** - * Allocate a block of size * nmemb bytes with av_mallocz(). - * @param nmemb Number of elements - * @param size Size of the single element - * @return Pointer to the allocated block, NULL if the block cannot - * be allocated. + * @param size Size of the single element + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * * @see av_mallocz() * @see av_malloc_array() */ @@ -234,43 +231,358 @@ av_alloc_size(1, 2) static inline void *av_mallocz_array(size_t nmemb, size_t si } /** - * Duplicate the string s. - * @param s string to be duplicated - * @return Pointer to a newly-allocated string containing a - * copy of s or NULL if the string cannot be allocated. + * Non-inlined equivalent of av_mallocz_array(). + * + * Created for symmetry with the calloc() C function. */ -char *av_strdup(const char *s) av_malloc_attrib; +void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib; /** - * Duplicate a substring of the string s. - * @param s string to be duplicated - * @param len the maximum length of the resulting string (not counting the - * terminating byte). - * @return Pointer to a newly-allocated string containing a - * copy of s or NULL if the string cannot be allocated. + * Allocate, reallocate, or free a block of memory. + * + * If `ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is + * zero, free the memory block pointed to by `ptr`. Otherwise, expand or + * shrink that block of memory according to `size`. + * + * @param ptr Pointer to a memory block already allocated with + * av_realloc() or `NULL` + * @param size Size in bytes of the memory block to be allocated or + * reallocated + * + * @return Pointer to a newly-reallocated block or `NULL` if the block + * cannot be reallocated or the function is used to free the memory block + * + * @warning Unlike av_malloc(), the returned pointer is not guaranteed to be + * correctly aligned. + * @see av_fast_realloc() + * @see av_reallocp() */ -char *av_strndup(const char *s, size_t len) av_malloc_attrib; +void *av_realloc(void *ptr, size_t size) av_alloc_size(2); /** - * Duplicate the buffer p. - * @param p buffer to be duplicated - * @return Pointer to a newly allocated buffer containing a - * copy of p or NULL if the buffer cannot be allocated. + * Allocate, reallocate, or free a block of memory through a pointer to a + * pointer. + * + * If `*ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is + * zero, free the memory block pointed to by `*ptr`. Otherwise, expand or + * shrink that block of memory according to `size`. + * + * @param[in,out] ptr Pointer to a pointer to a memory block already allocated + * with av_realloc(), or a pointer to `NULL`. The pointer + * is updated on success, or freed on failure. + * @param[in] size Size in bytes for the memory block to be allocated or + * reallocated + * + * @return Zero on success, an AVERROR error code on failure + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. */ -void *av_memdup(const void *p, size_t size); +av_warn_unused_result +int av_reallocp(void *ptr, size_t size); /** - * Free a memory block which has been allocated with av_malloc(z)() or - * av_realloc() and set the pointer pointing to it to NULL. - * @param ptr Pointer to the pointer to the memory block which should - * be freed. - * @note passing a pointer to a NULL pointer is safe and leads to no action. + * Allocate, reallocate, or free a block of memory. + * + * This function does the same thing as av_realloc(), except: + * - It takes two size arguments and allocates `nelem * elsize` bytes, + * after checking the result of the multiplication for integer overflow. + * - It frees the input block in case of failure, thus avoiding the memory + * leak with the classic + * @code{.c} + * buf = realloc(buf); + * if (!buf) + * return -1; + * @endcode + * pattern. + */ +void *av_realloc_f(void *ptr, size_t nelem, size_t elsize); + +/** + * Allocate, reallocate, or free an array. + * + * If `ptr` is `NULL` and `nmemb` > 0, allocate a new block. If + * `nmemb` is zero, free the memory block pointed to by `ptr`. + * + * @param ptr Pointer to a memory block already allocated with + * av_realloc() or `NULL` + * @param nmemb Number of elements in the array + * @param size Size of the single element of the array + * + * @return Pointer to a newly-reallocated block or NULL if the block + * cannot be reallocated or the function is used to free the memory block + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + * @see av_reallocp_array() + */ +av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size); + +/** + * Allocate, reallocate, or free an array through a pointer to a pointer. + * + * If `*ptr` is `NULL` and `nmemb` > 0, allocate a new block. If `nmemb` is + * zero, free the memory block pointed to by `*ptr`. + * + * @param[in,out] ptr Pointer to a pointer to a memory block already + * allocated with av_realloc(), or a pointer to `NULL`. + * The pointer is updated on success, or freed on failure. + * @param[in] nmemb Number of elements + * @param[in] size Size of the single element + * + * @return Zero on success, an AVERROR error code on failure + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + */ +av_alloc_size(2, 3) int av_reallocp_array(void *ptr, size_t nmemb, size_t size); + +/** + * Reallocate the given buffer if it is not large enough, otherwise do nothing. + * + * If the given buffer is `NULL`, then a new uninitialized buffer is allocated. + * + * If the given buffer is not large enough, and reallocation fails, `NULL` is + * returned and `*size` is set to 0, but the original buffer is not changed or + * freed. + * + * A typical use pattern follows: + * + * @code{.c} + * uint8_t *buf = ...; + * uint8_t *new_buf = av_fast_realloc(buf, ¤t_size, size_needed); + * if (!new_buf) { + * // Allocation failed; clean up original buffer + * av_freep(&buf); + * return AVERROR(ENOMEM); + * } + * @endcode + * + * @param[in,out] ptr Already allocated buffer, or `NULL` + * @param[in,out] size Pointer to current size of buffer `ptr`. `*size` is + * changed to `min_size` in case of success or 0 in + * case of failure + * @param[in] min_size New size of buffer `ptr` + * @return `ptr` if the buffer is large enough, a pointer to newly reallocated + * buffer if the buffer was not large enough, or `NULL` in case of + * error + * @see av_realloc() + * @see av_fast_malloc() + */ +void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Allocate a buffer, reusing the given one if large enough. + * + * Contrary to av_fast_realloc(), the current buffer contents might not be + * preserved and on error the old buffer is freed, thus no special handling to + * avoid memleaks is necessary. + * + * `*ptr` is allowed to be `NULL`, in which case allocation always happens if + * `size_needed` is greater than 0. + * + * @code{.c} + * uint8_t *buf = ...; + * av_fast_malloc(&buf, ¤t_size, size_needed); + * if (!buf) { + * // Allocation failed; buf already freed + * return AVERROR(ENOMEM); + * } + * @endcode + * + * @param[in,out] ptr Pointer to pointer to an already allocated buffer. + * `*ptr` will be overwritten with pointer to new + * buffer on success or `NULL` on failure + * @param[in,out] size Pointer to current size of buffer `*ptr`. `*size` is + * changed to `min_size` in case of success or 0 in + * case of failure + * @param[in] min_size New size of buffer `*ptr` + * @see av_realloc() + * @see av_fast_mallocz() + */ +void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Allocate and clear a buffer, reusing the given one if large enough. + * + * Like av_fast_malloc(), but all newly allocated space is initially cleared. + * Reused buffer is not cleared. + * + * `*ptr` is allowed to be `NULL`, in which case allocation always happens if + * `size_needed` is greater than 0. + * + * @param[in,out] ptr Pointer to pointer to an already allocated buffer. + * `*ptr` will be overwritten with pointer to new + * buffer on success or `NULL` on failure + * @param[in,out] size Pointer to current size of buffer `*ptr`. `*size` is + * changed to `min_size` in case of success or 0 in + * case of failure + * @param[in] min_size New size of buffer `*ptr` + * @see av_fast_malloc() + */ +void av_fast_mallocz(void *ptr, unsigned int *size, size_t min_size); + +/** + * Free a memory block which has been allocated with a function of av_malloc() + * or av_realloc() family. + * + * @param ptr Pointer to the memory block which should be freed. + * + * @note `ptr = NULL` is explicitly allowed. + * @note It is recommended that you use av_freep() instead, to prevent leaving + * behind dangling pointers. + * @see av_freep() + */ +void av_free(void *ptr); + +/** + * Free a memory block which has been allocated with a function of av_malloc() + * or av_realloc() family, and set the pointer pointing to it to `NULL`. + * + * @code{.c} + * uint8_t *buf = av_malloc(16); + * av_free(buf); + * // buf now contains a dangling pointer to freed memory, and accidental + * // dereference of buf will result in a use-after-free, which may be a + * // security risk. + * + * uint8_t *buf = av_malloc(16); + * av_freep(&buf); + * // buf is now NULL, and accidental dereference will only result in a + * // NULL-pointer dereference. + * @endcode + * + * @param ptr Pointer to the pointer to the memory block which should be freed + * @note `*ptr = NULL` is safe and leads to no action. * @see av_free() */ void av_freep(void *ptr); /** - * Add an element to a dynamic array. + * Duplicate a string. + * + * @param s String to be duplicated + * @return Pointer to a newly-allocated string containing a + * copy of `s` or `NULL` if the string cannot be allocated + * @see av_strndup() + */ +char *av_strdup(const char *s) av_malloc_attrib; + +/** + * Duplicate a substring of a string. + * + * @param s String to be duplicated + * @param len Maximum length of the resulting string (not counting the + * terminating byte) + * @return Pointer to a newly-allocated string containing a + * substring of `s` or `NULL` if the string cannot be allocated + */ +char *av_strndup(const char *s, size_t len) av_malloc_attrib; + +/** + * Duplicate a buffer with av_malloc(). + * + * @param p Buffer to be duplicated + * @param size Size in bytes of the buffer copied + * @return Pointer to a newly allocated buffer containing a + * copy of `p` or `NULL` if the buffer cannot be allocated + */ +void *av_memdup(const void *p, size_t size); + +/** + * Overlapping memcpy() implementation. + * + * @param dst Destination buffer + * @param back Number of bytes back to start copying (i.e. the initial size of + * the overlapping window); must be > 0 + * @param cnt Number of bytes to copy; must be >= 0 + * + * @note `cnt > back` is valid, this will copy the bytes we just copied, + * thus creating a repeating pattern with a period length of `back`. + */ +void av_memcpy_backptr(uint8_t *dst, int back, int cnt); + +/** + * @} + */ + +/** + * @defgroup lavu_mem_dynarray Dynamic Array + * + * Utilities to make an array grow when needed. + * + * Sometimes, the programmer would want to have an array that can grow when + * needed. The libavutil dynamic array utilities fill that need. + * + * libavutil supports two systems of appending elements onto a dynamically + * allocated array, the first one storing the pointer to the value in the + * array, and the second storing the value directly. In both systems, the + * caller is responsible for maintaining a variable containing the length of + * the array, as well as freeing of the array after use. + * + * The first system stores pointers to values in a block of dynamically + * allocated memory. Since only pointers are stored, the function does not need + * to know the size of the type. Both av_dynarray_add() and + * av_dynarray_add_nofree() implement this system. + * + * @code + * type **array = NULL; //< an array of pointers to values + * int nb = 0; //< a variable to keep track of the length of the array + * + * type to_be_added = ...; + * type to_be_added2 = ...; + * + * av_dynarray_add(&array, &nb, &to_be_added); + * if (nb == 0) + * return AVERROR(ENOMEM); + * + * av_dynarray_add(&array, &nb, &to_be_added2); + * if (nb == 0) + * return AVERROR(ENOMEM); + * + * // Now: + * // nb == 2 + * // &to_be_added == array[0] + * // &to_be_added2 == array[1] + * + * av_freep(&array); + * @endcode + * + * The second system stores the value directly in a block of memory. As a + * result, the function has to know the size of the type. av_dynarray2_add() + * implements this mechanism. + * + * @code + * type *array = NULL; //< an array of values + * int nb = 0; //< a variable to keep track of the length of the array + * + * type to_be_added = ...; + * type to_be_added2 = ...; + * + * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), NULL); + * if (!addr) + * return AVERROR(ENOMEM); + * memcpy(addr, &to_be_added, sizeof(to_be_added)); + * + * // Shortcut of the above. + * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), + * (const void *)&to_be_added2); + * if (!addr) + * return AVERROR(ENOMEM); + * + * // Now: + * // nb == 2 + * // to_be_added == array[0] + * // to_be_added2 == array[1] + * + * av_freep(&array); + * @endcode + * + * @{ + */ + +/** + * Add the pointer to an element to a dynamic array. * * The array to grow is supposed to be an array of pointers to * structures, and the element to add must be a pointer to an already @@ -280,14 +592,14 @@ void av_freep(void *ptr); * Therefore, the amortized cost of adding an element is constant. * * In case of success, the pointer to the array is updated in order to - * point to the new grown array, and the number pointed to by nb_ptr + * point to the new grown array, and the number pointed to by `nb_ptr` * is incremented. - * In case of failure, the array is freed, *tab_ptr is set to NULL and - * *nb_ptr is set to 0. + * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and + * `*nb_ptr` is set to 0. * - * @param tab_ptr pointer to the array to grow - * @param nb_ptr pointer to the number of elements in the array - * @param elem element to add + * @param[in,out] tab_ptr Pointer to the array to grow + * @param[in,out] nb_ptr Pointer to the number of elements in the array + * @param[in] elem Element to add * @see av_dynarray_add_nofree(), av_dynarray2_add() */ void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem); @@ -299,48 +611,62 @@ void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem); * but it doesn't free memory on fails. It returns error code * instead and leave current buffer untouched. * - * @param tab_ptr pointer to the array to grow - * @param nb_ptr pointer to the number of elements in the array - * @param elem element to add - * @return >=0 on success, negative otherwise. + * @return >=0 on success, negative otherwise * @see av_dynarray_add(), av_dynarray2_add() */ av_warn_unused_result int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem); /** - * Add an element of size elem_size to a dynamic array. + * Add an element of size `elem_size` to a dynamic array. * * The array is reallocated when its number of elements reaches powers of 2. * Therefore, the amortized cost of adding an element is constant. * * In case of success, the pointer to the array is updated in order to - * point to the new grown array, and the number pointed to by nb_ptr + * point to the new grown array, and the number pointed to by `nb_ptr` * is incremented. - * In case of failure, the array is freed, *tab_ptr is set to NULL and - * *nb_ptr is set to 0. + * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and + * `*nb_ptr` is set to 0. * - * @param tab_ptr pointer to the array to grow - * @param nb_ptr pointer to the number of elements in the array - * @param elem_size size in bytes of the elements in the array - * @param elem_data pointer to the data of the element to add. If NULL, the space of - * the new added element is not filled. - * @return pointer to the data of the element to copy in the new allocated space. - * If NULL, the new allocated space is left uninitialized." + * @param[in,out] tab_ptr Pointer to the array to grow + * @param[in,out] nb_ptr Pointer to the number of elements in the array + * @param[in] elem_size Size in bytes of an element in the array + * @param[in] elem_data Pointer to the data of the element to add. If + * `NULL`, the space of the newly added element is + * allocated but left uninitialized. + * + * @return Pointer to the data of the element to copy in the newly allocated + * space * @see av_dynarray_add(), av_dynarray_add_nofree() */ void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size, const uint8_t *elem_data); /** - * Multiply two size_t values checking for overflow. - * @return 0 if success, AVERROR(EINVAL) if overflow. + * @} + */ + +/** + * @defgroup lavu_mem_misc Miscellaneous Functions + * + * Other functions related to memory allocation. + * + * @{ + */ + +/** + * Multiply two `size_t` values checking for overflow. + * + * @param[in] a,b Operands of multiplication + * @param[out] r Pointer to the result of the operation + * @return 0 on success, AVERROR(EINVAL) on overflow */ static inline int av_size_mult(size_t a, size_t b, size_t *r) { size_t t = a * b; - /* Hack inspired from glibc: only try the division if nelem and elsize - * are both greater than sqrt(SIZE_MAX). */ + /* Hack inspired from glibc: don't try the division if nelem and elsize + * are both less than sqrt(SIZE_MAX). */ if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b) return AVERROR(EINVAL); *r = t; @@ -348,58 +674,22 @@ static inline int av_size_mult(size_t a, size_t b, size_t *r) } /** - * Set the maximum size that may me allocated in one block. + * Set the maximum size that may be allocated in one block. + * + * The value specified with this function is effective for all libavutil's @ref + * lavu_mem_funcs "heap management functions." + * + * By default, the max value is defined as `INT_MAX`. + * + * @param max Value to be set as the new maximum size + * + * @warning Exercise extreme caution when using this function. Don't touch + * this if you do not understand the full consequence of doing so. */ void av_max_alloc(size_t max); /** - * deliberately overlapping memcpy implementation - * @param dst destination buffer - * @param back how many bytes back we start (the initial size of the overlapping window), must be > 0 - * @param cnt number of bytes to copy, must be >= 0 - * - * cnt > back is valid, this will copy the bytes we just copied, - * thus creating a repeating pattern with a period length of back. - */ -void av_memcpy_backptr(uint8_t *dst, int back, int cnt); - -/** - * Reallocate the given block if it is not large enough, otherwise do nothing. - * - * @see av_realloc - */ -void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size); - -/** - * Allocate a buffer, reusing the given one if large enough. - * - * Contrary to av_fast_realloc the current buffer contents might not be - * preserved and on error the old buffer is freed, thus no special - * handling to avoid memleaks is necessary. - * - * @param ptr pointer to pointer to already allocated buffer, overwritten with pointer to new buffer - * @param size size of the buffer *ptr points to - * @param min_size minimum size of *ptr buffer after returning, *ptr will be NULL and - * *size 0 if an error occurred. - */ -void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size); - -/** - * Allocate a buffer, reusing the given one if large enough. - * - * All newly allocated space is initially cleared - * Contrary to av_fast_realloc the current buffer contents might not be - * preserved and on error the old buffer is freed, thus no special - * handling to avoid memleaks is necessary. - * - * @param ptr pointer to pointer to already allocated buffer, overwritten with pointer to new buffer - * @param size size of the buffer *ptr points to - * @param min_size minimum size of *ptr buffer after returning, *ptr will be NULL and - * *size 0 if an error occurred. - */ -void av_fast_mallocz(void *ptr, unsigned int *size, size_t min_size); - -/** + * @} * @} */ diff --git a/Externals/ffmpeg/include/libavutil/murmur3.h b/Externals/ffmpeg/include/libavutil/murmur3.h index f29ed973e9..6a1694c08d 100644 --- a/Externals/ffmpeg/include/libavutil/murmur3.h +++ b/Externals/ffmpeg/include/libavutil/murmur3.h @@ -18,15 +18,97 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/** + * @file + * @ingroup lavu_murmur3 + * Public header for MurmurHash3 hash function implementation. + */ + #ifndef AVUTIL_MURMUR3_H #define AVUTIL_MURMUR3_H #include +/** + * @defgroup lavu_murmur3 Murmur3 + * @ingroup lavu_hash + * MurmurHash3 hash function implementation. + * + * MurmurHash3 is a non-cryptographic hash function, of which three + * incompatible versions were created by its inventor Austin Appleby: + * + * - 32-bit output + * - 128-bit output for 32-bit platforms + * - 128-bit output for 64-bit platforms + * + * FFmpeg only implements the last variant: 128-bit output designed for 64-bit + * platforms. Even though the hash function was designed for 64-bit platforms, + * the function in reality works on 32-bit systems too, only with reduced + * performance. + * + * @anchor lavu_murmur3_seedinfo + * By design, MurmurHash3 requires a seed to operate. In response to this, + * libavutil provides two functions for hash initiation, one that requires a + * seed (av_murmur3_init_seeded()) and one that uses a fixed arbitrary integer + * as the seed, and therefore does not (av_murmur3_init()). + * + * To make hashes comparable, you should provide the same seed for all calls to + * this hash function -- if you are supplying one yourself, that is. + * + * @{ + */ + +/** + * Allocate an AVMurMur3 hash context. + * + * @return Uninitialized hash context or `NULL` in case of error + */ struct AVMurMur3 *av_murmur3_alloc(void); + +/** + * Initialize or reinitialize an AVMurMur3 hash context with a seed. + * + * @param[out] c Hash context + * @param[in] seed Random seed + * + * @see av_murmur3_init() + * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of + * seeds for MurmurHash3. + */ void av_murmur3_init_seeded(struct AVMurMur3 *c, uint64_t seed); + +/** + * Initialize or reinitialize an AVMurMur3 hash context. + * + * Equivalent to av_murmur3_init_seeded() with a built-in seed. + * + * @param[out] c Hash context + * + * @see av_murmur3_init_seeded() + * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of + * seeds for MurmurHash3. + */ void av_murmur3_init(struct AVMurMur3 *c); + +/** + * Update hash context with new data. + * + * @param[out] c Hash context + * @param[in] src Input data to update hash with + * @param[in] len Number of bytes to read from `src` + */ void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, int len); + +/** + * Finish hashing and output digest value. + * + * @param[in,out] c Hash context + * @param[out] dst Buffer where output digest value is stored + */ void av_murmur3_final(struct AVMurMur3 *c, uint8_t dst[16]); +/** + * @} + */ + #endif /* AVUTIL_MURMUR3_H */ diff --git a/Externals/ffmpeg/include/libavutil/old_pix_fmts.h b/Externals/ffmpeg/include/libavutil/old_pix_fmts.h deleted file mode 100644 index cd1ed7c19f..0000000000 --- a/Externals/ffmpeg/include/libavutil/old_pix_fmts.h +++ /dev/null @@ -1,177 +0,0 @@ -/* - * copyright (c) 2006-2012 Michael Niedermayer - * - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef AVUTIL_OLD_PIX_FMTS_H -#define AVUTIL_OLD_PIX_FMTS_H - -/* - * This header exists to prevent new pixel formats from being accidentally added - * to the deprecated list. - * Do not include it directly. It will be removed on next major bump - * - * Do not add new items to this list. Use the AVPixelFormat enum instead. - */ - PIX_FMT_NONE = AV_PIX_FMT_NONE, - PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples) - PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr - PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB... - PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR... - PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) - PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples) - PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples) - PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) - PIX_FMT_GRAY8, ///< Y , 8bpp - PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb - PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb - PIX_FMT_PAL8, ///< 8 bit with PIX_FMT_RGB32 palette - PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV420P and setting color_range - PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV422P and setting color_range - PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV444P and setting color_range -#if FF_API_XVMC - PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing - PIX_FMT_XVMC_MPEG2_IDCT, -#endif /* FF_API_XVMC */ - PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 - PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3 - PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb) - PIX_FMT_BGR4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits - PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb) - PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb) - PIX_FMT_RGB4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits - PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb) - PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V) - PIX_FMT_NV21, ///< as above, but U and V bytes are swapped - - PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB... - PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA... - PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR... - PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA... - - PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian - PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian - PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples) - PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of PIX_FMT_YUV440P and setting color_range - PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples) -#if FF_API_VDPAU - PIX_FMT_VDPAU_H264,///< H.264 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers - PIX_FMT_VDPAU_MPEG1,///< MPEG-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers - PIX_FMT_VDPAU_MPEG2,///< MPEG-2 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers - PIX_FMT_VDPAU_WMV3,///< WMV3 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers - PIX_FMT_VDPAU_VC1, ///< VC-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers -#endif - PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian - PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian - - PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian - PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian - PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), big-endian, most significant bit to 0 - PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), little-endian, most significant bit to 0 - - PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian - PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian - PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), big-endian, most significant bit to 1 - PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), little-endian, most significant bit to 1 - - PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers - PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers - PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a vaapi_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers - - PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian - PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian - PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian - PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian -#if FF_API_VDPAU - PIX_FMT_VDPAU_MPEG4, ///< MPEG4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers -#endif - PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer - - PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0 - PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0 - PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), little-endian, most significant bits to 1 - PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), big-endian, most significant bits to 1 - PIX_FMT_GRAY8A, ///< 8bit gray, 8bit alpha - PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian - PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian - - //the following 10 formats have the disadvantage of needing 1 format for each bit depth, thus - //If you want to support multiple bit depths, then using PIX_FMT_YUV420P16* with the bpp stored separately - //is better - PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian - PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian - PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian - PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian - PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian - PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian - PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian - PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian - PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - PIX_FMT_VDA_VLD, ///< hardware decoding through VDA - -#ifdef AV_PIX_FMT_ABI_GIT_MASTER - PIX_FMT_RGBA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian - PIX_FMT_RGBA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian - PIX_FMT_BGRA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian - PIX_FMT_BGRA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian -#endif - PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp - PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big endian - PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little endian - PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big endian - PIX_FMT_GBRP10LE, ///< planar GBR 4:4:4 30bpp, little endian - PIX_FMT_GBRP16BE, ///< planar GBR 4:4:4 48bpp, big endian - PIX_FMT_GBRP16LE, ///< planar GBR 4:4:4 48bpp, little endian - -#ifndef AV_PIX_FMT_ABI_GIT_MASTER - PIX_FMT_RGBA64BE=0x123, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian - PIX_FMT_RGBA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian - PIX_FMT_BGRA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian - PIX_FMT_BGRA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian -#endif - PIX_FMT_0RGB=0x123+4, ///< packed RGB 8:8:8, 32bpp, 0RGB0RGB... - PIX_FMT_RGB0, ///< packed RGB 8:8:8, 32bpp, RGB0RGB0... - PIX_FMT_0BGR, ///< packed BGR 8:8:8, 32bpp, 0BGR0BGR... - PIX_FMT_BGR0, ///< packed BGR 8:8:8, 32bpp, BGR0BGR0... - PIX_FMT_YUVA444P, ///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples) - PIX_FMT_YUVA422P, ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples) - - PIX_FMT_YUV420P12BE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian - PIX_FMT_YUV420P12LE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian - PIX_FMT_YUV420P14BE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian - PIX_FMT_YUV420P14LE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian - PIX_FMT_YUV422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - PIX_FMT_YUV422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - PIX_FMT_YUV422P14BE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian - PIX_FMT_YUV422P14LE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - PIX_FMT_YUV444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian - PIX_FMT_YUV444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian - PIX_FMT_YUV444P14BE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian - PIX_FMT_YUV444P14LE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian - PIX_FMT_GBRP12BE, ///< planar GBR 4:4:4 36bpp, big endian - PIX_FMT_GBRP12LE, ///< planar GBR 4:4:4 36bpp, little endian - PIX_FMT_GBRP14BE, ///< planar GBR 4:4:4 42bpp, big endian - PIX_FMT_GBRP14LE, ///< planar GBR 4:4:4 42bpp, little endian - - PIX_FMT_NB, ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions -#endif /* AVUTIL_OLD_PIX_FMTS_H */ diff --git a/Externals/ffmpeg/include/libavutil/opt.h b/Externals/ffmpeg/include/libavutil/opt.h index 753434d628..9430b989e9 100644 --- a/Externals/ffmpeg/include/libavutil/opt.h +++ b/Externals/ffmpeg/include/libavutil/opt.h @@ -58,7 +58,7 @@ * The following example illustrates an AVOptions-enabled struct: * @code * typedef struct test_struct { - * AVClass *class; + * const AVClass *class; * int int_opt; * char *str_opt; * uint8_t *bin_opt; @@ -96,7 +96,7 @@ * @code * test_struct *alloc_test_struct(void) * { - * test_struct *ret = av_malloc(sizeof(*ret)); + * test_struct *ret = av_mallocz(sizeof(*ret)); * ret->class = &test_class; * av_opt_set_defaults(ret); * return ret; @@ -281,7 +281,7 @@ typedef struct AVOption { #define AV_OPT_FLAG_VIDEO_PARAM 16 #define AV_OPT_FLAG_SUBTITLE_PARAM 32 /** - * The option is inteded for exporting values to the caller. + * The option is intended for exporting values to the caller. */ #define AV_OPT_FLAG_EXPORT 64 /** diff --git a/Externals/ffmpeg/include/libavutil/pixdesc.h b/Externals/ffmpeg/include/libavutil/pixdesc.h index a6056fe1c0..a8ad588913 100644 --- a/Externals/ffmpeg/include/libavutil/pixdesc.h +++ b/Externals/ffmpeg/include/libavutil/pixdesc.h @@ -85,16 +85,16 @@ typedef struct AVPixFmtDescriptor { /** * Amount to shift the luma width right to find the chroma width. * For YV12 this is 1 for example. - * chroma_width = -((-luma_width) >> log2_chroma_w) + * chroma_width = AV_CEIL_RSHIFT(luma_width, log2_chroma_w) * The note above is needed to ensure rounding up. * This value only refers to the chroma components. */ - uint8_t log2_chroma_w; ///< chroma_width = -((-luma_width )>>log2_chroma_w) + uint8_t log2_chroma_w; /** * Amount to shift the luma height right to find the chroma height. * For YV12 this is 1 for example. - * chroma_height= -((-luma_height) >> log2_chroma_h) + * chroma_height= AV_CEIL_RSHIFT(luma_height, log2_chroma_h) * The note above is needed to ensure rounding up. * This value only refers to the chroma components. */ @@ -172,78 +172,6 @@ typedef struct AVPixFmtDescriptor { */ #define AV_PIX_FMT_FLAG_ALPHA (1 << 7) -/** - * Read a line from an image, and write the values of the - * pixel format component c to dst. - * - * @param data the array containing the pointers to the planes of the image - * @param linesize the array containing the linesizes of the image - * @param desc the pixel format descriptor for the image - * @param x the horizontal coordinate of the first pixel to read - * @param y the vertical coordinate of the first pixel to read - * @param w the width of the line to read, that is the number of - * values to write to dst - * @param read_pal_component if not zero and the format is a paletted - * format writes the values corresponding to the palette - * component c in data[1] to dst, rather than the palette indexes in - * data[0]. The behavior is undefined if the format is not paletted. - */ -void av_read_image_line(uint16_t *dst, const uint8_t *data[4], - const int linesize[4], const AVPixFmtDescriptor *desc, - int x, int y, int c, int w, int read_pal_component); - -/** - * Write the values from src to the pixel format component c of an - * image line. - * - * @param src array containing the values to write - * @param data the array containing the pointers to the planes of the - * image to write into. It is supposed to be zeroed. - * @param linesize the array containing the linesizes of the image - * @param desc the pixel format descriptor for the image - * @param x the horizontal coordinate of the first pixel to write - * @param y the vertical coordinate of the first pixel to write - * @param w the width of the line to write, that is the number of - * values to write to the image line - */ -void av_write_image_line(const uint16_t *src, uint8_t *data[4], - const int linesize[4], const AVPixFmtDescriptor *desc, - int x, int y, int c, int w); - -/** - * Return the pixel format corresponding to name. - * - * If there is no pixel format with name name, then looks for a - * pixel format with the name corresponding to the native endian - * format of name. - * For example in a little-endian system, first looks for "gray16", - * then for "gray16le". - * - * Finally if no pixel format has been found, returns AV_PIX_FMT_NONE. - */ -enum AVPixelFormat av_get_pix_fmt(const char *name); - -/** - * Return the short name for a pixel format, NULL in case pix_fmt is - * unknown. - * - * @see av_get_pix_fmt(), av_get_pix_fmt_string() - */ -const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt); - -/** - * Print in buf the string corresponding to the pixel format with - * number pix_fmt, or a header if pix_fmt is negative. - * - * @param buf the buffer where to write the string - * @param buf_size the size of buf - * @param pix_fmt the number of the pixel format to print the - * corresponding info string, or a negative value to print the - * corresponding header. - */ -char *av_get_pix_fmt_string(char *buf, int buf_size, - enum AVPixelFormat pix_fmt); - /** * Return the number of bits per pixel used by the pixel format * described by pixdesc. Note that this is not the same as the number @@ -292,8 +220,8 @@ enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc); * you do check the return code! * * @param[in] pix_fmt the pixel format - * @param[out] h_shift store log2_chroma_w - * @param[out] v_shift store log2_chroma_h + * @param[out] h_shift store log2_chroma_w (horizontal/width shift) + * @param[out] v_shift store log2_chroma_h (vertical/height shift) * * @return 0 on success, AVERROR(ENOSYS) on invalid or unknown pixel format */ @@ -306,6 +234,103 @@ int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, */ int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt); +/** + * @return the name for provided color range or NULL if unknown. + */ +const char *av_color_range_name(enum AVColorRange range); + +/** + * @return the name for provided color primaries or NULL if unknown. + */ +const char *av_color_primaries_name(enum AVColorPrimaries primaries); + +/** + * @return the name for provided color transfer or NULL if unknown. + */ +const char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer); + +/** + * @return the name for provided color space or NULL if unknown. + */ +const char *av_color_space_name(enum AVColorSpace space); + +/** + * @return the name for provided chroma location or NULL if unknown. + */ +const char *av_chroma_location_name(enum AVChromaLocation location); + +/** + * Return the pixel format corresponding to name. + * + * If there is no pixel format with name name, then looks for a + * pixel format with the name corresponding to the native endian + * format of name. + * For example in a little-endian system, first looks for "gray16", + * then for "gray16le". + * + * Finally if no pixel format has been found, returns AV_PIX_FMT_NONE. + */ +enum AVPixelFormat av_get_pix_fmt(const char *name); + +/** + * Return the short name for a pixel format, NULL in case pix_fmt is + * unknown. + * + * @see av_get_pix_fmt(), av_get_pix_fmt_string() + */ +const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt); + +/** + * Print in buf the string corresponding to the pixel format with + * number pix_fmt, or a header if pix_fmt is negative. + * + * @param buf the buffer where to write the string + * @param buf_size the size of buf + * @param pix_fmt the number of the pixel format to print the + * corresponding info string, or a negative value to print the + * corresponding header. + */ +char *av_get_pix_fmt_string(char *buf, int buf_size, + enum AVPixelFormat pix_fmt); + +/** + * Read a line from an image, and write the values of the + * pixel format component c to dst. + * + * @param data the array containing the pointers to the planes of the image + * @param linesize the array containing the linesizes of the image + * @param desc the pixel format descriptor for the image + * @param x the horizontal coordinate of the first pixel to read + * @param y the vertical coordinate of the first pixel to read + * @param w the width of the line to read, that is the number of + * values to write to dst + * @param read_pal_component if not zero and the format is a paletted + * format writes the values corresponding to the palette + * component c in data[1] to dst, rather than the palette indexes in + * data[0]. The behavior is undefined if the format is not paletted. + */ +void av_read_image_line(uint16_t *dst, const uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w, int read_pal_component); + +/** + * Write the values from src to the pixel format component c of an + * image line. + * + * @param src array containing the values to write + * @param data the array containing the pointers to the planes of the + * image to write into. It is supposed to be zeroed. + * @param linesize the array containing the linesizes of the image + * @param desc the pixel format descriptor for the image + * @param x the horizontal coordinate of the first pixel to write + * @param y the vertical coordinate of the first pixel to write + * @param w the width of the line to write, that is the number of + * values to write to the image line + */ +void av_write_image_line(const uint16_t *src, uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w); + /** * Utility function to swap the endianness of a pixel format. * @@ -366,29 +391,4 @@ int av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); -/** - * @return the name for provided color range or NULL if unknown. - */ -const char *av_color_range_name(enum AVColorRange range); - -/** - * @return the name for provided color primaries or NULL if unknown. - */ -const char *av_color_primaries_name(enum AVColorPrimaries primaries); - -/** - * @return the name for provided color transfer or NULL if unknown. - */ -const char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer); - -/** - * @return the name for provided color space or NULL if unknown. - */ -const char *av_color_space_name(enum AVColorSpace space); - -/** - * @return the name for provided chroma location or NULL if unknown. - */ -const char *av_chroma_location_name(enum AVChromaLocation location); - #endif /* AVUTIL_PIXDESC_H */ diff --git a/Externals/ffmpeg/include/libavutil/pixfmt.h b/Externals/ffmpeg/include/libavutil/pixfmt.h index 32044f0778..7a3f68be7e 100644 --- a/Externals/ffmpeg/include/libavutil/pixfmt.h +++ b/Externals/ffmpeg/include/libavutil/pixfmt.h @@ -24,7 +24,6 @@ /** * @file * pixel format definitions - * */ #include "libavutil/avconfig.h" @@ -54,7 +53,7 @@ * to run on the IBM VGA graphics adapter use 6-bit palette components. * * @par - * For all the 8bit per pixel formats, an RGB32 palette is in data[1] like + * For all the 8 bits per pixel formats, an RGB32 palette is in data[1] like * for pal8. This palette is filled in automatically by the function * allocating the picture. */ @@ -71,14 +70,14 @@ enum AVPixelFormat { AV_PIX_FMT_GRAY8, ///< Y , 8bpp AV_PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb AV_PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb - AV_PIX_FMT_PAL8, ///< 8 bit with AV_PIX_FMT_RGB32 palette + AV_PIX_FMT_PAL8, ///< 8 bits with AV_PIX_FMT_RGB32 palette AV_PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range AV_PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range AV_PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range #if FF_API_XVMC AV_PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing AV_PIX_FMT_XVMC_MPEG2_IDCT, -#define AV_PIX_FMT_XVMC AV_PIX_FMT_XVMC_MPEG2_IDCT + AV_PIX_FMT_XVMC = AV_PIX_FMT_XVMC_MPEG2_IDCT, #endif /* FF_API_XVMC */ AV_PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 AV_PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3 @@ -126,7 +125,7 @@ enum AVPixelFormat { /**@{*/ AV_PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers AV_PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers - AV_PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a vaapi_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + AV_PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a VASurfaceID /**@}*/ AV_PIX_FMT_VAAPI = AV_PIX_FMT_VAAPI_VLD, #else @@ -144,7 +143,7 @@ enum AVPixelFormat { AV_PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian AV_PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian #if FF_API_VDPAU - AV_PIX_FMT_VDPAU_MPEG4, ///< MPEG4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + AV_PIX_FMT_VDPAU_MPEG4, ///< MPEG-4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers #endif AV_PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer @@ -152,7 +151,7 @@ enum AVPixelFormat { AV_PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined AV_PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined AV_PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined - AV_PIX_FMT_YA8, ///< 8bit gray, 8bit alpha + AV_PIX_FMT_YA8, ///< 8 bits gray, 8 bits alpha AV_PIX_FMT_Y400A = AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 AV_PIX_FMT_GRAY8A= AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 @@ -179,6 +178,7 @@ enum AVPixelFormat { AV_PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian AV_PIX_FMT_VDA_VLD, ///< hardware decoding through VDA AV_PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp + AV_PIX_FMT_GBR24P = AV_PIX_FMT_GBRP, // alias for #AV_PIX_FMT_GBRP AV_PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big-endian AV_PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little-endian AV_PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big-endian @@ -223,8 +223,8 @@ enum AVPixelFormat { AV_PIX_FMT_VDA, ///< HW acceleration through VDA, data[3] contains a CVPixelBufferRef - AV_PIX_FMT_YA16BE, ///< 16bit gray, 16bit alpha (big-endian) - AV_PIX_FMT_YA16LE, ///< 16bit gray, 16bit alpha (little-endian) + AV_PIX_FMT_YA16BE, ///< 16 bits gray, 16 bits alpha (big-endian) + AV_PIX_FMT_YA16LE, ///< 16 bits gray, 16 bits alpha (little-endian) AV_PIX_FMT_GBRAP, ///< planar GBRA 4:4:4:4 32bpp AV_PIX_FMT_GBRAP16BE, ///< planar GBRA 4:4:4:4 64bpp, big-endian @@ -242,6 +242,12 @@ enum AVPixelFormat { AV_PIX_FMT_D3D11VA_VLD, ///< HW decoding through Direct3D11, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer + /** + * HW acceleration through CUDA. data[i] contain CUdeviceptr pointers + * exactly as for system memory frames. + */ + AV_PIX_FMT_CUDA, + AV_PIX_FMT_0RGB=0x123+4,///< packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined AV_PIX_FMT_RGB0, ///< packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined AV_PIX_FMT_0BGR, ///< packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined @@ -289,11 +295,19 @@ enum AVPixelFormat { AV_PIX_FMT_VIDEOTOOLBOX, ///< hardware decoding through Videotoolbox - AV_PIX_FMT_NB, ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions -}; + AV_PIX_FMT_P010LE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, little-endian + AV_PIX_FMT_P010BE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, big-endian -#define AV_PIX_FMT_Y400A AV_PIX_FMT_GRAY8A -#define AV_PIX_FMT_GBR24P AV_PIX_FMT_GBRP + AV_PIX_FMT_GBRAP12BE, ///< planar GBR 4:4:4:4 48bpp, big-endian + AV_PIX_FMT_GBRAP12LE, ///< planar GBR 4:4:4:4 48bpp, little-endian + + AV_PIX_FMT_GBRAP10BE, ///< planar GBR 4:4:4:4 40bpp, big-endian + AV_PIX_FMT_GBRAP10LE, ///< planar GBR 4:4:4:4 40bpp, little-endian + + AV_PIX_FMT_MEDIACODEC, ///< hardware decoding through MediaCodec + + AV_PIX_FMT_NB ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions +}; #if AV_HAVE_BIGENDIAN # define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##be @@ -344,6 +358,8 @@ enum AVPixelFormat { #define AV_PIX_FMT_GBRP12 AV_PIX_FMT_NE(GBRP12BE, GBRP12LE) #define AV_PIX_FMT_GBRP14 AV_PIX_FMT_NE(GBRP14BE, GBRP14LE) #define AV_PIX_FMT_GBRP16 AV_PIX_FMT_NE(GBRP16BE, GBRP16LE) +#define AV_PIX_FMT_GBRAP10 AV_PIX_FMT_NE(GBRAP10BE, GBRAP10LE) +#define AV_PIX_FMT_GBRAP12 AV_PIX_FMT_NE(GBRAP12BE, GBRAP12LE) #define AV_PIX_FMT_GBRAP16 AV_PIX_FMT_NE(GBRAP16BE, GBRAP16LE) #define AV_PIX_FMT_BAYER_BGGR16 AV_PIX_FMT_NE(BAYER_BGGR16BE, BAYER_BGGR16LE) @@ -365,6 +381,7 @@ enum AVPixelFormat { #define AV_PIX_FMT_XYZ12 AV_PIX_FMT_NE(XYZ12BE, XYZ12LE) #define AV_PIX_FMT_NV20 AV_PIX_FMT_NE(NV20BE, NV20LE) #define AV_PIX_FMT_AYUV64 AV_PIX_FMT_NE(AYUV64BE, AYUV64LE) +#define AV_PIX_FMT_P010 AV_PIX_FMT_NE(P010BE, P010LE) /** * Chromaticity coordinates of the source primaries. @@ -381,8 +398,10 @@ enum AVColorPrimaries { AVCOL_PRI_SMPTE240M = 7, ///< functionally identical to above AVCOL_PRI_FILM = 8, ///< colour filters using Illuminant C AVCOL_PRI_BT2020 = 9, ///< ITU-R BT2020 - AVCOL_PRI_SMPTEST428_1= 10, ///< SMPTE ST 428-1 (CIE 1931 XYZ) - AVCOL_PRI_NB, ///< Not part of ABI + AVCOL_PRI_SMPTEST428_1 = 10, ///< SMPTE ST 428-1 (CIE 1931 XYZ) + AVCOL_PRI_SMPTE431 = 11, ///< SMPTE ST 431-2 (2011) + AVCOL_PRI_SMPTE432 = 12, ///< SMPTE ST 432-1 D65 (2010) + AVCOL_PRI_NB ///< Not part of ABI }; /** @@ -403,11 +422,12 @@ enum AVColorTransferCharacteristic { AVCOL_TRC_IEC61966_2_4 = 11, ///< IEC 61966-2-4 AVCOL_TRC_BT1361_ECG = 12, ///< ITU-R BT1361 Extended Colour Gamut AVCOL_TRC_IEC61966_2_1 = 13, ///< IEC 61966-2-1 (sRGB or sYCC) - AVCOL_TRC_BT2020_10 = 14, ///< ITU-R BT2020 for 10 bit system - AVCOL_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12 bit system - AVCOL_TRC_SMPTEST2084 = 16, ///< SMPTE ST 2084 for 10, 12, 14 and 16 bit systems + AVCOL_TRC_BT2020_10 = 14, ///< ITU-R BT2020 for 10-bit system + AVCOL_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12-bit system + AVCOL_TRC_SMPTEST2084 = 16, ///< SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems AVCOL_TRC_SMPTEST428_1 = 17, ///< SMPTE ST 428-1 - AVCOL_TRC_NB, ///< Not part of ABI + AVCOL_TRC_ARIB_STD_B67 = 18, ///< ARIB STD-B67, known as "Hybrid log-gamma" + AVCOL_TRC_NB ///< Not part of ABI }; /** @@ -420,12 +440,13 @@ enum AVColorSpace { AVCOL_SPC_RESERVED = 3, AVCOL_SPC_FCC = 4, ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20) AVCOL_SPC_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601 - AVCOL_SPC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above - AVCOL_SPC_SMPTE240M = 7, + AVCOL_SPC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC + AVCOL_SPC_SMPTE240M = 7, ///< functionally identical to above AVCOL_SPC_YCOCG = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16 AVCOL_SPC_BT2020_NCL = 9, ///< ITU-R BT2020 non-constant luminance system AVCOL_SPC_BT2020_CL = 10, ///< ITU-R BT2020 constant luminance system - AVCOL_SPC_NB, ///< Not part of ABI + AVCOL_SPC_SMPTE2085 = 11, ///< SMPTE 2085, Y'D'zD'x + AVCOL_SPC_NB ///< Not part of ABI }; #define AVCOL_SPC_YCGCO AVCOL_SPC_YCOCG @@ -437,7 +458,7 @@ enum AVColorRange { AVCOL_RANGE_UNSPECIFIED = 0, AVCOL_RANGE_MPEG = 1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges AVCOL_RANGE_JPEG = 2, ///< the normal 2^n-1 "JPEG" YUV ranges - AVCOL_RANGE_NB, ///< Not part of ABI + AVCOL_RANGE_NB ///< Not part of ABI }; /** @@ -457,13 +478,13 @@ enum AVColorRange { */ enum AVChromaLocation { AVCHROMA_LOC_UNSPECIFIED = 0, - AVCHROMA_LOC_LEFT = 1, ///< mpeg2/4 4:2:0, h264 default for 4:2:0 - AVCHROMA_LOC_CENTER = 2, ///< mpeg1 4:2:0, jpeg 4:2:0, h263 4:2:0 + AVCHROMA_LOC_LEFT = 1, ///< MPEG-2/4 4:2:0, H.264 default for 4:2:0 + AVCHROMA_LOC_CENTER = 2, ///< MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0 AVCHROMA_LOC_TOPLEFT = 3, ///< ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2 AVCHROMA_LOC_TOP = 4, AVCHROMA_LOC_BOTTOMLEFT = 5, AVCHROMA_LOC_BOTTOM = 6, - AVCHROMA_LOC_NB, ///< Not part of ABI + AVCHROMA_LOC_NB ///< Not part of ABI }; #endif /* AVUTIL_PIXFMT_H */ diff --git a/Externals/ffmpeg/include/libavutil/rational.h b/Externals/ffmpeg/include/libavutil/rational.h index 2897469680..5c6b67b4e9 100644 --- a/Externals/ffmpeg/include/libavutil/rational.h +++ b/Externals/ffmpeg/include/libavutil/rational.h @@ -21,7 +21,8 @@ /** * @file - * rational numbers + * @ingroup lavu_math_rational + * Utilties for rational number calculation. * @author Michael Niedermayer */ @@ -33,22 +34,39 @@ #include "attributes.h" /** - * @addtogroup lavu_math + * @defgroup lavu_math_rational AVRational + * @ingroup lavu_math + * Rational number calculation. + * + * While rational numbers can be expressed as floating-point numbers, the + * conversion process is a lossy one, so are floating-point operations. On the + * other hand, the nature of FFmpeg demands highly accurate calculation of + * timestamps. This set of rational number utilities serves as a generic + * interface for manipulating rational numbers as pairs of numerators and + * denominators. + * + * Many of the functions that operate on AVRational's have the suffix `_q`, in + * reference to the mathematical symbol "ℚ" (Q) which denotes the set of all + * rational numbers. + * * @{ */ /** - * rational number numerator/denominator + * Rational number (pair of numerator and denominator). */ typedef struct AVRational{ - int num; ///< numerator - int den; ///< denominator + int num; ///< Numerator + int den; ///< Denominator } AVRational; /** - * Create a rational. + * Create an AVRational. + * * Useful for compilers that do not support compound literals. - * @note The return value is not reduced. + * + * @note The return value is not reduced. + * @see av_reduce() */ static inline AVRational av_make_q(int num, int den) { @@ -58,10 +76,15 @@ static inline AVRational av_make_q(int num, int den) /** * Compare two rationals. - * @param a first rational - * @param b second rational - * @return 0 if a==b, 1 if a>b, -1 if a b` + * - -1 if `a < b` + * - `INT_MIN` if one of the values is of the form `0 / 0` */ static inline int av_cmp_q(AVRational a, AVRational b){ const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den; @@ -73,9 +96,10 @@ static inline int av_cmp_q(AVRational a, AVRational b){ } /** - * Convert rational to double. - * @param a rational to convert - * @return (double) a + * Convert an AVRational to a `double`. + * @param a AVRational to convert + * @return `a` in floating-point form + * @see av_d2q() */ static inline double av_q2d(AVRational a){ return a.num / (double) a.den; @@ -83,44 +107,46 @@ static inline double av_q2d(AVRational a){ /** * Reduce a fraction. + * * This is useful for framerate calculations. - * @param dst_num destination numerator - * @param dst_den destination denominator - * @param num source numerator - * @param den source denominator - * @param max the maximum allowed for dst_num & dst_den - * @return 1 if exact, 0 otherwise + * + * @param[out] dst_num Destination numerator + * @param[out] dst_den Destination denominator + * @param[in] num Source numerator + * @param[in] den Source denominator + * @param[in] max Maximum allowed values for `dst_num` & `dst_den` + * @return 1 if the operation is exact, 0 otherwise */ int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max); /** * Multiply two rationals. - * @param b first rational - * @param c second rational + * @param b First rational + * @param c Second rational * @return b*c */ AVRational av_mul_q(AVRational b, AVRational c) av_const; /** * Divide one rational by another. - * @param b first rational - * @param c second rational + * @param b First rational + * @param c Second rational * @return b/c */ AVRational av_div_q(AVRational b, AVRational c) av_const; /** * Add two rationals. - * @param b first rational - * @param c second rational + * @param b First rational + * @param c Second rational * @return b+c */ AVRational av_add_q(AVRational b, AVRational c) av_const; /** * Subtract one rational from another. - * @param b first rational - * @param c second rational + * @param b First rational + * @param c Second rational * @return b-c */ AVRational av_sub_q(AVRational b, AVRational c) av_const; @@ -138,31 +164,46 @@ static av_always_inline AVRational av_inv_q(AVRational q) /** * Convert a double precision floating point number to a rational. - * inf is expressed as {1,0} or {-1,0} depending on the sign. * - * @param d double to convert - * @param max the maximum allowed numerator and denominator - * @return (AVRational) d + * In case of infinity, the returned value is expressed as `{1, 0}` or + * `{-1, 0}` depending on the sign. + * + * @param d `double` to convert + * @param max Maximum allowed numerator and denominator + * @return `d` in AVRational form + * @see av_q2d() */ AVRational av_d2q(double d, int max) av_const; /** - * @return 1 if q1 is nearer to q than q2, -1 if q2 is nearer - * than q1, 0 if they have the same distance. + * Find which of the two rationals is closer to another rational. + * + * @param q Rational to be compared against + * @param q1,q2 Rationals to be tested + * @return One of the following values: + * - 1 if `q1` is nearer to `q` than `q2` + * - -1 if `q2` is nearer to `q` than `q1` + * - 0 if they have the same distance */ int av_nearer_q(AVRational q, AVRational q1, AVRational q2); /** - * Find the nearest value in q_list to q. - * @param q_list an array of rationals terminated by {0, 0} - * @return the index of the nearest value found in the array + * Find the value in a list of rationals nearest a given reference rational. + * + * @param q Reference rational + * @param q_list Array of rationals terminated by `{0, 0}` + * @return Index of the nearest value found in the array */ int av_find_nearest_q_idx(AVRational q, const AVRational* q_list); /** - * Converts a AVRational to a IEEE 32bit float. + * Convert an AVRational to a IEEE 32-bit `float` expressed in fixed-point + * format. * - * The float is returned in a uint32_t and its value is platform indepenant. + * @param q Rational to be converted + * @return Equivalent floating-point value, expressed as an unsigned 32-bit + * integer. + * @note The returned value is platform-indepedant. */ uint32_t av_q2intfloat(AVRational q); diff --git a/Externals/ffmpeg/include/libavutil/replaygain.h b/Externals/ffmpeg/include/libavutil/replaygain.h index 5c03e1993d..b49bf1a3d9 100644 --- a/Externals/ffmpeg/include/libavutil/replaygain.h +++ b/Externals/ffmpeg/include/libavutil/replaygain.h @@ -1,5 +1,4 @@ /* - * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/Externals/ffmpeg/include/libavutil/ripemd.h b/Externals/ffmpeg/include/libavutil/ripemd.h index 7b0c8bc89c..6d6bb3208f 100644 --- a/Externals/ffmpeg/include/libavutil/ripemd.h +++ b/Externals/ffmpeg/include/libavutil/ripemd.h @@ -19,6 +19,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/** + * @file + * @ingroup lavu_ripemd + * Public header for RIPEMD hash function implementation. + */ + #ifndef AVUTIL_RIPEMD_H #define AVUTIL_RIPEMD_H @@ -29,7 +35,9 @@ /** * @defgroup lavu_ripemd RIPEMD - * @ingroup lavu_crypto + * @ingroup lavu_hash + * RIPEMD hash function implementation. + * * @{ */ diff --git a/Externals/ffmpeg/include/libavutil/samplefmt.h b/Externals/ffmpeg/include/libavutil/samplefmt.h index 6a8a031c02..8cd43ae856 100644 --- a/Externals/ffmpeg/include/libavutil/samplefmt.h +++ b/Externals/ffmpeg/include/libavutil/samplefmt.h @@ -32,7 +32,6 @@ * * Audio sample format enumeration and related convenience functions. * @{ - * */ /** @@ -69,6 +68,8 @@ enum AVSampleFormat { AV_SAMPLE_FMT_S32P, ///< signed 32 bits, planar AV_SAMPLE_FMT_FLTP, ///< float, planar AV_SAMPLE_FMT_DBLP, ///< double, planar + AV_SAMPLE_FMT_S64, ///< signed 64 bits + AV_SAMPLE_FMT_S64P, ///< signed 64 bits, planar AV_SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if linking dynamically }; diff --git a/Externals/ffmpeg/include/libavutil/sha.h b/Externals/ffmpeg/include/libavutil/sha.h index bf4377e51b..c7558a8964 100644 --- a/Externals/ffmpeg/include/libavutil/sha.h +++ b/Externals/ffmpeg/include/libavutil/sha.h @@ -18,6 +18,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/** + * @file + * @ingroup lavu_sha + * Public header for SHA-1 & SHA-256 hash function implementations. + */ + #ifndef AVUTIL_SHA_H #define AVUTIL_SHA_H @@ -28,7 +34,17 @@ /** * @defgroup lavu_sha SHA - * @ingroup lavu_crypto + * @ingroup lavu_hash + * SHA-1 and SHA-256 (Secure Hash Algorithm) hash function implementations. + * + * This module supports the following SHA hash functions: + * + * - SHA-1: 160 bits + * - SHA-224: 224 bits, as a variant of SHA-2 + * - SHA-256: 256 bits, as a variant of SHA-2 + * + * @see For SHA-384, SHA-512, and variants thereof, see @ref lavu_sha512. + * * @{ */ diff --git a/Externals/ffmpeg/include/libavutil/sha512.h b/Externals/ffmpeg/include/libavutil/sha512.h index 7b08701477..5bac184cf3 100644 --- a/Externals/ffmpeg/include/libavutil/sha512.h +++ b/Externals/ffmpeg/include/libavutil/sha512.h @@ -19,6 +19,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/** + * @file + * @ingroup lavu_sha512 + * Public header for SHA-512 implementation. + */ + #ifndef AVUTIL_SHA512_H #define AVUTIL_SHA512_H @@ -28,8 +34,19 @@ #include "version.h" /** - * @defgroup lavu_sha512 SHA512 - * @ingroup lavu_crypto + * @defgroup lavu_sha512 SHA-512 + * @ingroup lavu_hash + * SHA-512 (Secure Hash Algorithm) hash function implementations. + * + * This module supports the following SHA-2 hash functions: + * + * - SHA-512/224: 224 bits + * - SHA-512/256: 256 bits + * - SHA-384: 384 bits + * - SHA-512: 512 bits + * + * @see For SHA-1, SHA-256, and variants thereof, see @ref lavu_sha. + * * @{ */ diff --git a/Externals/ffmpeg/include/libavutil/stereo3d.h b/Externals/ffmpeg/include/libavutil/stereo3d.h index 1135dc9ddc..19c541643e 100644 --- a/Externals/ffmpeg/include/libavutil/stereo3d.h +++ b/Externals/ffmpeg/include/libavutil/stereo3d.h @@ -149,4 +149,22 @@ AVStereo3D *av_stereo3d_alloc(void); */ AVStereo3D *av_stereo3d_create_side_data(AVFrame *frame); +/** + * Provide a human-readable name of a given stereo3d type. + * + * @param type The input stereo3d type value. + * + * @return The name of the stereo3d value, or "unknown". + */ +const char *av_stereo3d_type_name(unsigned int type); + +/** + * Get the AVStereo3DType form a human-readable name. + * + * @param type The input string. + * + * @return The AVStereo3DType value, or -1 if not found. + */ +int av_stereo3d_from_name(const char *name); + #endif /* AVUTIL_STEREO3D_H */ diff --git a/Externals/ffmpeg/include/libavutil/threadmessage.h b/Externals/ffmpeg/include/libavutil/threadmessage.h index e256cae9db..8480a0a3db 100644 --- a/Externals/ffmpeg/include/libavutil/threadmessage.h +++ b/Externals/ffmpeg/include/libavutil/threadmessage.h @@ -69,10 +69,10 @@ int av_thread_message_queue_recv(AVThreadMessageQueue *mq, /** * Set the sending error code. * - * If the error code is set to non-zero, av_thread_message_queue_recv() will - * return it immediately when there are no longer available messages. - * Conventional values, such as AVERROR_EOF or AVERROR(EAGAIN), can be used - * to cause the receiving thread to stop or suspend its operation. + * If the error code is set to non-zero, av_thread_message_queue_send() will + * return it immediately. Conventional values, such as AVERROR_EOF or + * AVERROR(EAGAIN), can be used to cause the sending thread to stop or + * suspend its operation. */ void av_thread_message_queue_set_err_send(AVThreadMessageQueue *mq, int err); @@ -80,10 +80,10 @@ void av_thread_message_queue_set_err_send(AVThreadMessageQueue *mq, /** * Set the receiving error code. * - * If the error code is set to non-zero, av_thread_message_queue_send() will - * return it immediately. Conventional values, such as AVERROR_EOF or - * AVERROR(EAGAIN), can be used to cause the sending thread to stop or - * suspend its operation. + * If the error code is set to non-zero, av_thread_message_queue_recv() will + * return it immediately when there are no longer available messages. + * Conventional values, such as AVERROR_EOF or AVERROR(EAGAIN), can be used + * to cause the receiving thread to stop or suspend its operation. */ void av_thread_message_queue_set_err_recv(AVThreadMessageQueue *mq, int err); diff --git a/Externals/ffmpeg/include/libavutil/timestamp.h b/Externals/ffmpeg/include/libavutil/timestamp.h index f010a7ee38..e082f01b40 100644 --- a/Externals/ffmpeg/include/libavutil/timestamp.h +++ b/Externals/ffmpeg/include/libavutil/timestamp.h @@ -43,7 +43,7 @@ static inline char *av_ts_make_string(char *buf, int64_t ts) { if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); - else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%"PRId64, ts); + else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%" PRId64, ts); return buf; } diff --git a/Externals/ffmpeg/include/libavutil/tree.h b/Externals/ffmpeg/include/libavutil/tree.h index e1aefaa9f6..d5e0aebfbd 100644 --- a/Externals/ffmpeg/include/libavutil/tree.h +++ b/Externals/ffmpeg/include/libavutil/tree.h @@ -58,7 +58,7 @@ struct AVTreeNode *av_tree_node_alloc(void); * then the corresponding entry in next is unchanged. * @param cmp compare function used to compare elements in the tree, * API identical to that of Standard C's qsort - * It is guranteed that the first and only the first argument to cmp() + * It is guaranteed that the first and only the first argument to cmp() * will be the key parameter to av_tree_find(), thus it could if the * user wants, be a different type (like an opaque context). * @return An element with cmp(key, elem) == 0 or NULL if no such element @@ -120,8 +120,8 @@ void av_tree_destroy(struct AVTreeNode *t); /** * Apply enu(opaque, &elem) to all the elements in the tree in a given range. * - * @param cmp a comparison function that returns < 0 for a element below the - * range, > 0 for a element above the range and == 0 for a + * @param cmp a comparison function that returns < 0 for an element below the + * range, > 0 for an element above the range and == 0 for an * element inside the range * * @note The cmp function should use the same ordering used to construct the diff --git a/Externals/ffmpeg/include/libavutil/version.h b/Externals/ffmpeg/include/libavutil/version.h index 9ffa7a8666..c57ac7fab3 100644 --- a/Externals/ffmpeg/include/libavutil/version.h +++ b/Externals/ffmpeg/include/libavutil/version.h @@ -18,6 +18,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/** + * @file + * @ingroup lavu + * Libavutil version macros + */ + #ifndef AVUTIL_VERSION_H #define AVUTIL_VERSION_H @@ -29,6 +35,21 @@ * Useful to check and match library version in order to maintain * backward compatibility. * + * The FFmpeg libraries follow a versioning sheme very similar to + * Semantic Versioning (http://semver.org/) + * The difference is that the component called PATCH is called MICRO in FFmpeg + * and its value is reset to 100 instead of 0 to keep it above or equal to 100. + * Also we do not increase MICRO for every bugfix or change in git master. + * + * Prior to FFmpeg 3.2 point releases did not change any lib version number to + * avoid aliassing different git master checkouts. + * Starting with FFmpeg 3.2, the released library versions will occupy + * a separate MAJOR.MINOR that is not used on the master development branch. + * That is if we branch a release of master 55.10.123 we will bump to 55.11.100 + * for the release and master will continue at 55.12.100 after it. Each new + * point release will then bump the MICRO improving the usefulness of the lib + * versions. + * * @{ */ @@ -48,12 +69,6 @@ * @} */ -/** - * @file - * @ingroup lavu - * Libavutil version macros - */ - /** * @defgroup lavu_ver Version and Build diagnostics * @@ -64,8 +79,8 @@ */ #define LIBAVUTIL_VERSION_MAJOR 55 -#define LIBAVUTIL_VERSION_MINOR 12 -#define LIBAVUTIL_VERSION_MICRO 100 +#define LIBAVUTIL_VERSION_MINOR 34 +#define LIBAVUTIL_VERSION_MICRO 101 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ LIBAVUTIL_VERSION_MINOR, \ @@ -78,9 +93,7 @@ #define LIBAVUTIL_IDENT "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION) /** - * @} - * - * @defgroup depr_guards Deprecation guards + * @defgroup lavu_depr_guards Deprecation Guards * FF_API_* defines may be placed below to indicate public API that will be * dropped at a future version bump. The defines themselves are not part of * the public API and may change, break or disappear at any time. @@ -119,11 +132,14 @@ #ifndef FF_API_CRC_BIG_TABLE #define FF_API_CRC_BIG_TABLE (LIBAVUTIL_VERSION_MAJOR < 56) #endif +#ifndef FF_API_PKT_PTS +#define FF_API_PKT_PTS (LIBAVUTIL_VERSION_MAJOR < 56) +#endif /** + * @} * @} */ #endif /* AVUTIL_VERSION_H */ - diff --git a/Externals/ffmpeg/include/libswresample/swresample.h b/Externals/ffmpeg/include/libswresample/swresample.h index 10eaebc439..a8db5c2490 100644 --- a/Externals/ffmpeg/include/libswresample/swresample.h +++ b/Externals/ffmpeg/include/libswresample/swresample.h @@ -28,11 +28,10 @@ */ /** - * @defgroup lswr Libswresample + * @defgroup lswr libswresample * @{ * - * Libswresample (lswr) is a library that handles audio resampling, sample - * format conversion and mixing. + * Audio resampling, sample format conversion and mixing library. * * Interaction with lswr is done through SwrContext, which is * allocated with swr_alloc() or swr_alloc_set_opts(). It is opaque, so all parameters @@ -121,6 +120,7 @@ */ #include +#include "libavutil/channel_layout.h" #include "libavutil/frame.h" #include "libavutil/samplefmt.h" @@ -366,6 +366,36 @@ int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensatio */ int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map); +/** + * Generate a channel mixing matrix. + * + * This function is the one used internally by libswresample for building the + * default mixing matrix. It is made public just as a utility function for + * building custom matrices. + * + * @param in_layout input channel layout + * @param out_layout output channel layout + * @param center_mix_level mix level for the center channel + * @param surround_mix_level mix level for the surround channel(s) + * @param lfe_mix_level mix level for the low-frequency effects channel + * @param rematrix_maxval if 1.0, coefficients will be normalized to prevent + * overflow. if INT_MAX, coefficients will not be + * normalized. + * @param[out] matrix mixing coefficients; matrix[i + stride * o] is + * the weight of input channel i in output channel o. + * @param stride distance between adjacent input channels in the + * matrix array + * @param matrix_encoding matrixed stereo downmix mode (e.g. dplii) + * @param log_ctx parent logging context, can be NULL + * @return 0 on success, negative AVERROR code on failure + */ +int swr_build_matrix(uint64_t in_layout, uint64_t out_layout, + double center_mix_level, double surround_mix_level, + double lfe_mix_level, double rematrix_maxval, + double rematrix_volume, double *matrix, + int stride, enum AVMatrixEncoding matrix_encoding, + void *log_ctx); + /** * Set a customized remix matrix. * diff --git a/Externals/ffmpeg/include/libswresample/version.h b/Externals/ffmpeg/include/libswresample/version.h index 8f6ecb418a..685154982c 100644 --- a/Externals/ffmpeg/include/libswresample/version.h +++ b/Externals/ffmpeg/include/libswresample/version.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef SWR_VERSION_H -#define SWR_VERSION_H +#ifndef SWRESAMPLE_VERSION_H +#define SWRESAMPLE_VERSION_H /** * @file @@ -29,8 +29,8 @@ #include "libavutil/avutil.h" #define LIBSWRESAMPLE_VERSION_MAJOR 2 -#define LIBSWRESAMPLE_VERSION_MINOR 0 -#define LIBSWRESAMPLE_VERSION_MICRO 101 +#define LIBSWRESAMPLE_VERSION_MINOR 3 +#define LIBSWRESAMPLE_VERSION_MICRO 100 #define LIBSWRESAMPLE_VERSION_INT AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \ LIBSWRESAMPLE_VERSION_MINOR, \ @@ -42,4 +42,4 @@ #define LIBSWRESAMPLE_IDENT "SwR" AV_STRINGIFY(LIBSWRESAMPLE_VERSION) -#endif /* SWR_VERSION_H */ +#endif /* SWRESAMPLE_VERSION_H */ diff --git a/Externals/ffmpeg/include/libswscale/swscale.h b/Externals/ffmpeg/include/libswscale/swscale.h index da9dd2ea8f..7713f51ec6 100644 --- a/Externals/ffmpeg/include/libswscale/swscale.h +++ b/Externals/ffmpeg/include/libswscale/swscale.h @@ -35,7 +35,9 @@ #include "version.h" /** - * @defgroup libsws Color conversion and scaling + * @defgroup libsws libswscale + * Color conversion and scaling library. + * * @{ * * Return the LIBSWSCALE_VERSION_INT constant. @@ -73,7 +75,7 @@ const char *swscale_license(void); #define SWS_PRINT_INFO 0x1000 //the following 3 flags are not completely implemented -//internal chrominace subsampling info +//internal chrominance subsampling info #define SWS_FULL_CHR_H_INT 0x2000 //input subsampling info #define SWS_FULL_CHR_H_INP 0x4000 @@ -91,6 +93,7 @@ const char *swscale_license(void); #define SWS_CS_SMPTE170M 5 #define SWS_CS_SMPTE240M 7 #define SWS_CS_DEFAULT 5 +#define SWS_CS_BT2020 9 /** * Return a pointer to yuv<->rgb coefficients for the given colorspace @@ -247,18 +250,6 @@ SwsVector *sws_allocVec(int length); */ SwsVector *sws_getGaussianVec(double variance, double quality); -/** - * Allocate and return a vector with length coefficients, all - * with the same value c. - */ -SwsVector *sws_getConstVec(double c, int length); - -/** - * Allocate and return a vector with just one coefficient, with - * value 1.0. - */ -SwsVector *sws_getIdentityVec(void); - /** * Scale all the coefficients of a by the scalar value. */ @@ -268,22 +259,17 @@ void sws_scaleVec(SwsVector *a, double scalar); * Scale all the coefficients of a so that their sum equals height. */ void sws_normalizeVec(SwsVector *a, double height); -void sws_convVec(SwsVector *a, SwsVector *b); -void sws_addVec(SwsVector *a, SwsVector *b); -void sws_subVec(SwsVector *a, SwsVector *b); -void sws_shiftVec(SwsVector *a, int shift); -/** - * Allocate and return a clone of the vector a, that is a vector - * with the same coefficients as a. - */ -SwsVector *sws_cloneVec(SwsVector *a); - -/** - * Print with av_log() a textual representation of the vector a - * if log_level <= av_log_level. - */ -void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level); +#if FF_API_SWS_VECTOR +attribute_deprecated SwsVector *sws_getConstVec(double c, int length); +attribute_deprecated SwsVector *sws_getIdentityVec(void); +attribute_deprecated void sws_convVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_addVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_subVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_shiftVec(SwsVector *a, int shift); +attribute_deprecated SwsVector *sws_cloneVec(SwsVector *a); +attribute_deprecated void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level); +#endif void sws_freeVec(SwsVector *a); diff --git a/Externals/ffmpeg/include/libswscale/version.h b/Externals/ffmpeg/include/libswscale/version.h index 24908b8931..ee536723cb 100644 --- a/Externals/ffmpeg/include/libswscale/version.h +++ b/Externals/ffmpeg/include/libswscale/version.h @@ -27,7 +27,7 @@ #include "libavutil/version.h" #define LIBSWSCALE_VERSION_MAJOR 4 -#define LIBSWSCALE_VERSION_MINOR 0 +#define LIBSWSCALE_VERSION_MINOR 2 #define LIBSWSCALE_VERSION_MICRO 100 #define LIBSWSCALE_VERSION_INT AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \ @@ -46,4 +46,8 @@ * the public API and may change, break or disappear at any time. */ +#ifndef FF_API_SWS_VECTOR +#define FF_API_SWS_VECTOR (LIBSWSCALE_VERSION_MAJOR < 6) +#endif + #endif /* SWSCALE_VERSION_H */ diff --git a/Externals/ffmpeg/lib/avcodec.lib b/Externals/ffmpeg/lib/avcodec.lib index 84e959ccbbfc0f93e578399a4ebbe4c20fbe22d2..457ad8659c05c69ccc574130aed30d5e9d9d05cb 100644 GIT binary patch delta 2976819 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
gwE(;L^R%W_{} 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

0pHedrM~bf0_gEyj=gTLURLlwpgs(0aK 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%0AmrOp3SK+S4^Hf}_bk>rj6$H3f+kH{7OO2K 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

eH*mShPrv7+%`yGfOF2Hq|I;1Y^yR19Cbn=) z7kDMd$0Wr#UE!6S38TsML}zXJ=_Rk^#29_2A4qJGpS}vj&YXVmm7FPK+jReSef8;b zujTj{7flyTOO>DQU}ME0aAua0A*l5ZiI+W$(-V2zjMr3hM4Ia?VII!KnJ^lTKHdfMdwVv1Jd^oqz|-m3e*~2evEzkMI%+= z=^H@$K7caFbVr9~d7gKSpaT*a7-so#X-v;?XqK4X_fbxVg(u?b@#*Kci%U$u_EAoS z2Q(84>ZCaKc!y0dyd5dQTEoP^AUFM>K%o3|r%!SL%%}RwrxzO83s0Zt*vvM4-6uH} zZqPIhA806R>AC5K2KK_!6WH0=SUXri2M&I8Y?kMq#RZz%VPII(_k4QcTutHWdQQ!3 z)9pUXsc?f@@}PXj!Kg9)qn4`h^ba7tAJ`Zef~Ge*HOp^b^;vET6E_2c0t3ih3=G$% zn}3s&pPplCFSNbto16+0W99VuKjf78K_LLzy359(;^Sv&vHju?xpXEL>yDJr={CRR zj0EbJsMQ!SfI1?e$U4tD{eG9a8p~=qPp#=Ie#;rLEc>ysYWh8p%4?rrI3rYQvQ2O7 zR##(j{~|Yey4N2$BbJ|?_cEq8fLPa)jNeS(_D9Z$S^v%C>97CD84EB61tcLfA7q=} z-=nU^GViOG>h_4gat@3v*7a=V)93t?%V4>=vR-65$A7sDf!zW=2TkB^Q{|ZcuuolX z`@H{hYgky;3mv#V-H%0n9?QGyq6embV39XsF;%haGZ{RFFg2LC0NeOd_V`_n%<*~@Q_W0QAb1f38G3KE9hKY|xc zU&k(Q#Q*ltTum3aS$WeJy4cH4&!4W&!4kG!Q*F8whrAKX^Xe^grw4GzYw>_822hfG zSH0=-^fr)O{9P%j>3cZjwZuWk{D9+U3?Ujl zeXpCn{B$O6dC<+fj$HEU0{dd`PDCh}&NDq>x2Bvp=x{}l-7B>mnGmwurpLS6s|yq= zG%ZI6Ugeq2SmP%L_toNkTO1IwU#6c1X_+zE_%K3Hn0I;rx4fJLs3ZW{GWXO~IfSec z@ASMqn(BN?sV@+MLDO?R?B%C#;*l3)ESmn2TV7otU|A3sLct{7=>mH-<)+K=%8M~> zn$GWOuWlR{zUe$d#U;=v9s>iz8V1ObjtmT+ctL{z;CP1SB+cplyz-KaYo~9#7%$Bf z&o{lizD7=>5u$`)#y&A~M9H>1G1*VoYBJrvGoOkrNjLX<=Ysh}>QA2cb)M`uoIY z`RR*5DkBA_XE)WzNd!PuzHa-jh)~%nIDKJLjofrTL3uI8!_y}wHOo(T5tJ8W`XV@; zx4A}60vZbpPoA#hKxi`)nqII*UvByakkTZf=^q5-<)%Laapnt6U*B9KCk{*J#b