From de1cecabc235834cec14a912e7b8e5300759c269 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Fri, 27 Mar 2020 18:57:04 +0100 Subject: [PATCH] Updated ffmpeg-win64 development files to ffmpeg-4.2.2-win64-dev.zip content --- neo/libs/ffmpeg-win64/LICENSE.txt | 674 ++++ neo/libs/ffmpeg-win64/README.txt | 158 +- .../include/libavcodec/ac3_parser.h | 36 + .../include/libavcodec/adts_parser.h | 37 + .../ffmpeg-win64/include/libavcodec/avcodec.h | 2712 +++++++++++------ .../ffmpeg-win64/include/libavcodec/dirac.h | 131 + .../ffmpeg-win64/include/libavcodec/dxva2.h | 6 +- .../ffmpeg-win64/include/libavcodec/jni.h | 46 + .../include/libavcodec/mediacodec.h | 101 + .../ffmpeg-win64/include/libavcodec/vaapi.h | 117 +- .../ffmpeg-win64/include/libavcodec/vda.h | 230 -- .../ffmpeg-win64/include/libavcodec/vdpau.h | 79 +- .../ffmpeg-win64/include/libavcodec/version.h | 180 +- .../include/libavcodec/videotoolbox.h | 3 +- .../include/libavcodec/vorbis_parser.h | 10 +- .../include/libavdevice/avdevice.h | 15 +- .../include/libavdevice/version.h | 4 +- .../include/libavfilter/avfilter.h | 278 +- .../include/libavfilter/buffersink.h | 28 +- .../include/libavfilter/buffersrc.h | 84 +- .../include/libavfilter/version.h | 27 +- .../include/libavformat/avformat.h | 654 +++- .../ffmpeg-win64/include/libavformat/avio.h | 217 +- .../include/libavformat/version.h | 63 +- .../ffmpeg-win64/include/libavutil/adler32.h | 13 +- .../ffmpeg-win64/include/libavutil/aes_ctr.h | 88 + .../include/libavutil/attributes.h | 19 +- .../include/libavutil/audio_fifo.h | 17 + .../ffmpeg-win64/include/libavutil/avassert.h | 11 +- .../ffmpeg-win64/include/libavutil/avconfig.h | 3 +- .../ffmpeg-win64/include/libavutil/avstring.h | 18 +- .../ffmpeg-win64/include/libavutil/avutil.h | 42 +- .../ffmpeg-win64/include/libavutil/base64.h | 9 +- .../ffmpeg-win64/include/libavutil/buffer.h | 19 +- .../include/libavutil/channel_layout.h | 21 +- .../ffmpeg-win64/include/libavutil/common.h | 61 +- neo/libs/ffmpeg-win64/include/libavutil/cpu.h | 20 +- neo/libs/ffmpeg-win64/include/libavutil/crc.h | 20 +- .../ffmpeg-win64/include/libavutil/dict.h | 10 +- .../ffmpeg-win64/include/libavutil/display.h | 28 + .../include/libavutil/encryption_info.h | 205 ++ .../include/libavutil/ffversion.h | 2 +- .../ffmpeg-win64/include/libavutil/file.h | 3 + .../ffmpeg-win64/include/libavutil/frame.h | 330 +- .../ffmpeg-win64/include/libavutil/hash.h | 197 +- .../include/libavutil/hdr_dynamic_metadata.h | 343 +++ .../ffmpeg-win64/include/libavutil/hmac.h | 2 +- .../include/libavutil/hwcontext.h | 584 ++++ .../include/libavutil/hwcontext_cuda.h | 52 + .../include/libavutil/hwcontext_d3d11va.h | 169 + .../include/libavutil/hwcontext_drm.h | 169 + .../include/libavutil/hwcontext_dxva2.h | 75 + .../hwcontext_mediacodec.h} | 24 +- .../include/libavutil/hwcontext_qsv.h | 53 + .../include/libavutil/hwcontext_vaapi.h | 117 + .../include/libavutil/hwcontext_vdpau.h | 44 + .../libavutil/hwcontext_videotoolbox.h | 54 + .../ffmpeg-win64/include/libavutil/imgutils.h | 70 +- .../include/libavutil/intreadwrite.h | 43 +- neo/libs/ffmpeg-win64/include/libavutil/lfg.h | 24 +- neo/libs/ffmpeg-win64/include/libavutil/log.h | 27 +- .../ffmpeg-win64/include/libavutil/macros.h | 2 + .../libavutil/mastering_display_metadata.h | 128 + .../include/libavutil/mathematics.h | 143 +- neo/libs/ffmpeg-win64/include/libavutil/md5.h | 19 +- neo/libs/ffmpeg-win64/include/libavutil/mem.h | 777 +++-- .../include/libavutil/motion_vector.h | 7 + .../ffmpeg-win64/include/libavutil/murmur3.h | 88 + neo/libs/ffmpeg-win64/include/libavutil/opt.h | 30 +- .../ffmpeg-win64/include/libavutil/pixdesc.h | 260 +- .../ffmpeg-win64/include/libavutil/pixfmt.h | 183 +- .../ffmpeg-win64/include/libavutil/rational.h | 119 +- .../include/libavutil/replaygain.h | 1 - .../ffmpeg-win64/include/libavutil/ripemd.h | 14 +- .../include/libavutil/samplefmt.h | 3 +- neo/libs/ffmpeg-win64/include/libavutil/sha.h | 27 +- .../ffmpeg-win64/include/libavutil/sha512.h | 26 +- .../include/libavutil/spherical.h | 232 ++ .../ffmpeg-win64/include/libavutil/stereo3d.h | 81 + .../include/libavutil/threadmessage.h | 40 +- .../ffmpeg-win64/include/libavutil/timecode.h | 2 +- .../include/libavutil/timestamp.h | 2 +- .../ffmpeg-win64/include/libavutil/tree.h | 6 +- neo/libs/ffmpeg-win64/include/libavutil/tx.h | 81 + .../ffmpeg-win64/include/libavutil/version.h | 73 +- .../ffmpeg-win64/include/libavutil/xtea.h | 29 +- .../include/libpostproc/postprocess.h | 8 +- .../include/libpostproc/version.h | 14 +- .../include/libswresample/swresample.h | 40 +- .../include/libswresample/version.h | 10 +- .../ffmpeg-win64/include/libswscale/swscale.h | 44 +- .../ffmpeg-win64/include/libswscale/version.h | 8 +- .../lib/{avcodec-57.def => avcodec-58.def} | 108 +- neo/libs/ffmpeg-win64/lib/avcodec.lib | Bin 160356 -> 185506 bytes .../lib/{avdevice-57.def => avdevice-58.def} | 4 +- neo/libs/ffmpeg-win64/lib/avdevice.lib | Bin 15708 -> 15874 bytes .../lib/{avfilter-6.def => avfilter-7.def} | 23 +- neo/libs/ffmpeg-win64/lib/avfilter.lib | Bin 49000 -> 56582 bytes .../lib/{avformat-57.def => avformat-58.def} | 29 +- neo/libs/ffmpeg-win64/lib/avformat.lib | Bin 132180 -> 134982 bytes .../lib/{avutil-55.def => avutil-56.def} | 121 +- neo/libs/ffmpeg-win64/lib/avutil.lib | Bin 334422 -> 407528 bytes neo/libs/ffmpeg-win64/lib/libavcodec.dll.a | Bin 135286 -> 669086 bytes neo/libs/ffmpeg-win64/lib/libavdevice.dll.a | Bin 12904 -> 453218 bytes neo/libs/ffmpeg-win64/lib/libavfilter.dll.a | Bin 40782 -> 47070 bytes neo/libs/ffmpeg-win64/lib/libavformat.dll.a | Bin 110022 -> 136154 bytes neo/libs/ffmpeg-win64/lib/libavutil.dll.a | Bin 279778 -> 340548 bytes neo/libs/ffmpeg-win64/lib/libpostproc.dll.a | Bin 7124 -> 7130 bytes neo/libs/ffmpeg-win64/lib/libswresample.dll.a | Bin 14560 -> 15196 bytes neo/libs/ffmpeg-win64/lib/libswscale.dll.a | Bin 22232 -> 22232 bytes .../lib/{postproc-54.def => postproc-55.def} | 4 +- neo/libs/ffmpeg-win64/lib/postproc.lib | Bin 8952 -> 9078 bytes .../{swresample-2.def => swresample-3.def} | 3 +- neo/libs/ffmpeg-win64/lib/swresample.lib | Bin 18018 -> 18842 bytes .../lib/{swscale-4.def => swscale-5.def} | 0 neo/libs/ffmpeg-win64/lib/swscale.lib | Bin 27204 -> 27204 bytes 116 files changed, 9029 insertions(+), 2636 deletions(-) create mode 100644 neo/libs/ffmpeg-win64/LICENSE.txt create mode 100644 neo/libs/ffmpeg-win64/include/libavcodec/ac3_parser.h create mode 100644 neo/libs/ffmpeg-win64/include/libavcodec/adts_parser.h create mode 100644 neo/libs/ffmpeg-win64/include/libavcodec/dirac.h create mode 100644 neo/libs/ffmpeg-win64/include/libavcodec/jni.h create mode 100644 neo/libs/ffmpeg-win64/include/libavcodec/mediacodec.h delete mode 100644 neo/libs/ffmpeg-win64/include/libavcodec/vda.h create mode 100644 neo/libs/ffmpeg-win64/include/libavutil/aes_ctr.h create mode 100644 neo/libs/ffmpeg-win64/include/libavutil/encryption_info.h create mode 100644 neo/libs/ffmpeg-win64/include/libavutil/hdr_dynamic_metadata.h create mode 100644 neo/libs/ffmpeg-win64/include/libavutil/hwcontext.h create mode 100644 neo/libs/ffmpeg-win64/include/libavutil/hwcontext_cuda.h create mode 100644 neo/libs/ffmpeg-win64/include/libavutil/hwcontext_d3d11va.h create mode 100644 neo/libs/ffmpeg-win64/include/libavutil/hwcontext_drm.h create mode 100644 neo/libs/ffmpeg-win64/include/libavutil/hwcontext_dxva2.h rename neo/libs/ffmpeg-win64/include/{libavfilter/avfiltergraph.h => libavutil/hwcontext_mediacodec.h} (63%) create mode 100644 neo/libs/ffmpeg-win64/include/libavutil/hwcontext_qsv.h create mode 100644 neo/libs/ffmpeg-win64/include/libavutil/hwcontext_vaapi.h create mode 100644 neo/libs/ffmpeg-win64/include/libavutil/hwcontext_vdpau.h create mode 100644 neo/libs/ffmpeg-win64/include/libavutil/hwcontext_videotoolbox.h create mode 100644 neo/libs/ffmpeg-win64/include/libavutil/mastering_display_metadata.h create mode 100644 neo/libs/ffmpeg-win64/include/libavutil/spherical.h create mode 100644 neo/libs/ffmpeg-win64/include/libavutil/tx.h rename neo/libs/ffmpeg-win64/lib/{avcodec-57.def => avcodec-58.def} (68%) rename neo/libs/ffmpeg-win64/lib/{avdevice-57.def => avdevice-58.def} (88%) rename neo/libs/ffmpeg-win64/lib/{avfilter-6.def => avfilter-7.def} (75%) rename neo/libs/ffmpeg-win64/lib/{avformat-57.def => avformat-58.def} (89%) rename neo/libs/ffmpeg-win64/lib/{avutil-55.def => avutil-56.def} (77%) rename neo/libs/ffmpeg-win64/lib/{postproc-54.def => postproc-55.def} (80%) rename neo/libs/ffmpeg-win64/lib/{swresample-2.def => swresample-3.def} (91%) rename neo/libs/ffmpeg-win64/lib/{swscale-4.def => swscale-5.def} (100%) diff --git a/neo/libs/ffmpeg-win64/LICENSE.txt b/neo/libs/ffmpeg-win64/LICENSE.txt new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/neo/libs/ffmpeg-win64/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/neo/libs/ffmpeg-win64/README.txt b/neo/libs/ffmpeg-win64/README.txt index 13e1db22..2b41621a 100644 --- a/neo/libs/ffmpeg-win64/README.txt +++ b/neo/libs/ffmpeg-win64/README.txt @@ -1,111 +1,107 @@ -This is a FFmpeg win64 shared build by Kyle Schwarz. +Zeranoe FFmpeg Builds -Zeranoe's FFmpeg Builds Home Page: +Build: ffmpeg-4.2.2-win64-shared -FFmpeg version: 20151105-git-c878082 - libavutil 54. 30.100 / 54. 30.100 - libavcodec 56. 57.100 / 56. 57.100 - libavformat 56. 40.101 / 56. 40.101 - libavdevice 56. 4.100 / 56. 4.100 - libavfilter 5. 32.100 / 5. 32.100 - libswscale 3. 1.101 / 3. 1.101 - libswresample 1. 2.101 / 1. 2.101 - libpostproc 53. 3.100 / 53. 3.100 - -This FFmpeg build was configured with: - --disable-static - --enable-shared +Configuration: --enable-gpl --enable-version3 - --disable-w32threads - --enable-avisynth - --enable-bzlib + --enable-sdl2 --enable-fontconfig - --enable-frei0r --enable-gnutls --enable-iconv --enable-libass + --enable-libdav1d --enable-libbluray - --enable-libbs2b - --enable-libcaca - --enable-libdcadec --enable-libfreetype - --enable-libgme - --enable-libgsm - --enable-libilbc - --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus - --enable-librtmp - --enable-libschroedinger + --enable-libshine + --enable-libsnappy --enable-libsoxr - --enable-libspeex --enable-libtheora --enable-libtwolame - --enable-libvidstab - --enable-libvo-aacenc - --enable-libvo-amrwbenc - --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 - --enable-libxavs - --enable-libxvid + --enable-libxml2 + --enable-libzimg --enable-lzma - --enable-decklink --enable-zlib + --enable-gmp + --enable-libvidstab + --enable-libvorbis + --enable-libvo-amrwbenc + --enable-libmysofa + --enable-libspeex + --enable-libxvid + --enable-libaom + --enable-libmfx + --enable-amf + --enable-ffnvcodec + --enable-cuvid + --enable-d3d11va + --enable-nvenc + --enable-nvdec + --enable-dxva2 + --enable-avisynth + --enable-libopenmpt -This build was compiled with the following external libraries: - bzip2 1.0.6 - Fontconfig 2.11.94 - Frei0r 20130909-git-10d8360 - GnuTLS 3.3.16 - libiconv 1.14 - libass 0.13.0 - libbluray 0.9.0 - libbs2b 3.1.0 - libcaca 0.99.beta18 - dcadec 20150506-git-98fb3b6 - FreeType 2.6.1 - Game Music Emu 0.6.0 - GSM 1.0.13-4 - iLBC 20141214-git-ef04ebe - Modplug-XMMS 0.8.8.5 - LAME 3.99.5 - OpenCORE AMR 0.1.3 - OpenJPEG 1.5.2 - Opus 1.1 - RTMPDump 20140707-git-a1900c3 - Schroedinger 1.0.11 - libsoxr 0.1.2 - Speex 1.2rc2 - Theora 1.1.1 - TwoLAME 0.3.13 - vid.stab 0.98 - VisualOn AAC 0.1.3 - VisualOn AMR-WB 0.1.2 - Vorbis 1.3.5 - vpx 1.4.0 - WavPack 4.75.0 - WebP 0.4.3 - x264 20151011-git-7599210 - x265 1.8 - XAVS svn-r55 - Xvid 1.3.4 - XZ Utils 5.2.2 - zlib 1.2.8 +Libraries: + SDL 20200120-cb4dae5 + Fontconfig 2.13.92 + GnuTLS 3.6.11.1 + libiconv 1.16 + libass 0.14.0 + dav1d 20200115-010eae8 + libbluray 20191112-137974c + FreeType 2.10.1 + LAME 3.100 + OpenCORE AMR 20170731-07a5be4 + OpenJPEG 20200113-b63a433 + Opus 20200119-6d29f51 + shine 20190420-76ea4f0 + Snappy 1.1.7 + libsoxr 20180224-945b592 + Theora 20171023-e5d205b + TwoLAME 0.4.0 + vpx 20200118-b78d3b2 + WavPack 5.2.0 + WebP 20200106-0fa56f3 + x264 20191127-1771b55 + x265 20200120-acc5d16 + libxml2 2.9.10 + z.lib 20191204-9ae36d7 + XZ Utils 5.2.4 + zlib 1.2.11 + GMP 6.1.2 + vid.stab 20190213-aeabc8d + Vorbis 20190128-9eadecc + VisualOn AMR-WB 20141107-3b3fcd0 + libmysofa 20190907-e07edb3 + Speex 20190808-58ac1d4 + Xvid 1.3.5 + aom 20200120-412efe2 + libmfx 1.28 + AMF 20191216-acbd877 + nv-codec-headers 20191126-250292d + OpenMPT 20191010-51cb021 -The source code for this FFmpeg build can be found at: +Copyright (C) 2020 Kyle Schwarz -This build was compiled on Debian 8.2 (64-bit): +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. -GCC 5.2.0 was used to compile this FFmpeg build: +This program 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 General Public License for more details. -This build was compiled using the MinGW-w64 toolchain: - -Licenses for each library can be found in the 'licenses' folder. +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/neo/libs/ffmpeg-win64/include/libavcodec/ac3_parser.h b/neo/libs/ffmpeg-win64/include/libavcodec/ac3_parser.h new file mode 100644 index 00000000..ff8cc4cf --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavcodec/ac3_parser.h @@ -0,0 +1,36 @@ +/* + * AC-3 parser prototypes + * Copyright (c) 2003 Fabrice Bellard + * Copyright (c) 2003 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 AVCODEC_AC3_PARSER_H +#define AVCODEC_AC3_PARSER_H + +#include +#include + +/** + * Extract the bitstream ID and the frame size from AC-3 data. + */ +int av_ac3_parse_header(const uint8_t *buf, size_t size, + uint8_t *bitstream_id, uint16_t *frame_size); + + +#endif /* AVCODEC_AC3_PARSER_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavcodec/adts_parser.h b/neo/libs/ffmpeg-win64/include/libavcodec/adts_parser.h new file mode 100644 index 00000000..f85becd1 --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavcodec/adts_parser.h @@ -0,0 +1,37 @@ +/* + * 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_ADTS_PARSER_H +#define AVCODEC_ADTS_PARSER_H + +#include +#include + +#define AV_AAC_ADTS_HEADER_SIZE 7 + +/** + * Extract the number of samples and frames from AAC data. + * @param[in] buf pointer to AAC data buffer + * @param[out] samples Pointer to where number of samples is written + * @param[out] frames Pointer to where number of frames is written + * @return Returns 0 on success, error code on failure. + */ +int av_adts_header_parse(const uint8_t *buf, uint32_t *samples, + uint8_t *frames); + +#endif /* AVCODEC_ADTS_PARSER_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavcodec/avcodec.h b/neo/libs/ffmpeg-win64/include/libavcodec/avcodec.h index 91cd6a82..d234271c 100644 --- a/neo/libs/ffmpeg-win64/include/libavcodec/avcodec.h +++ b/neo/libs/ffmpeg-win64/include/libavcodec/avcodec.h @@ -36,6 +36,7 @@ #include "libavutil/channel_layout.h" #include "libavutil/dict.h" #include "libavutil/frame.h" +#include "libavutil/hwcontext.h" #include "libavutil/log.h" #include "libavutil/pixfmt.h" #include "libavutil/rational.h" @@ -43,7 +44,9 @@ #include "version.h" /** - * @defgroup libavc Encoding/Decoding Library + * @defgroup libavc libavcodec + * Encoding/Decoding Library + * * @{ * * @defgroup lavc_decoding Decoding @@ -70,7 +73,118 @@ * @{ * @} * @} + */ + +/** + * @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 encoder 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. + * + * In theory, sending input can result in EAGAIN - this should happen only if + * not all output was received. You can use this to structure alternative decode + * or encode loops other than the one suggested above. For example, you could + * try sending new input on each iteration, and try to receive output if that + * returns EAGAIN. + * + * 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, or + * at least will not fail with AVERROR(EAGAIN). 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 (unless it is rejected with AVERROR(EAGAIN) - then + * no data was read from the packet). + * 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. All codecs support the new API. + * + * A codec is not allowed to return AVERROR(EAGAIN) for both sending and receiving. This + * would be an invalid state, which could put the codec user into an endless + * loop. The API has no concept of time either: it cannot happen that trying to + * do avcodec_send_packet() results in AVERROR(EAGAIN), but a repeated call 1 second + * later accepts the packet (with no other receive/flush API calls involved). + * The API is a strict state machine, and the passage of time is not supposed + * to influence it. Some timing-dependent behavior might still be deemed + * acceptable in certain cases. But it must never result in both send/receive + * returning EAGAIN at the same time at any point. It must also absolutely be + * avoided that the current state is "unstable" and can "flip-flop" between + * the send/receive APIs allowing progress. For example, it's not allowed that + * the codec randomly decides that it actually wants to consume a packet now + * instead of returning a frame, after it just returned AVERROR(EAGAIN) on an + * avcodec_send_packet() call. + * @} */ /** @@ -92,7 +206,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 @@ -104,9 +218,6 @@ enum AVCodecID { /* video codecs */ AV_CODEC_ID_MPEG1VIDEO, AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding -#if FF_API_XVMC - AV_CODEC_ID_MPEG2VIDEO_XVMC, -#endif /* FF_API_XVMC */ AV_CODEC_ID_H261, AV_CODEC_ID_H263, AV_CODEC_ID_RV10, @@ -298,6 +409,7 @@ enum AVCodecID { AV_CODEC_ID_DXV, AV_CODEC_ID_SCREENPRESSO, AV_CODEC_ID_RSCC, + AV_CODEC_ID_AVS2, AV_CODEC_ID_Y41P = 0x8000, AV_CODEC_ID_AVRP, @@ -315,6 +427,36 @@ 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, + AV_CODEC_ID_PSD, + AV_CODEC_ID_PIXLET, + AV_CODEC_ID_SPEEDHQ, + AV_CODEC_ID_FMVC, + AV_CODEC_ID_SCPR, + AV_CODEC_ID_CLEARVIDEO, + AV_CODEC_ID_XPM, + AV_CODEC_ID_AV1, + AV_CODEC_ID_BITPACKED, + AV_CODEC_ID_MSCC, + AV_CODEC_ID_SRGC, + AV_CODEC_ID_SVG, + AV_CODEC_ID_GDV, + AV_CODEC_ID_FITS, + AV_CODEC_ID_IMM4, + AV_CODEC_ID_PROSUMER, + AV_CODEC_ID_MWSC, + AV_CODEC_ID_WCMV, + AV_CODEC_ID_RASC, + AV_CODEC_ID_HYMT, + AV_CODEC_ID_ARBC, + AV_CODEC_ID_AGM, + AV_CODEC_ID_LSCR, + AV_CODEC_ID_VP4, /* various PCM "codecs" */ AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs @@ -349,9 +491,12 @@ 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, + AV_CODEC_ID_PCM_F16LE, + AV_CODEC_ID_PCM_F24LE, + AV_CODEC_ID_PCM_VIDC, /* various ADPCM codecs */ AV_CODEC_ID_ADPCM_IMA_QT = 0x11000, @@ -385,9 +530,6 @@ enum AVCodecID { AV_CODEC_ID_ADPCM_G722, AV_CODEC_ID_ADPCM_IMA_APC, AV_CODEC_ID_ADPCM_VIMA, -#if FF_API_VIMA_DECODER - AV_CODEC_ID_VIMA = AV_CODEC_ID_ADPCM_VIMA, -#endif AV_CODEC_ID_ADPCM_AFC = 0x11800, AV_CODEC_ID_ADPCM_IMA_OKI, @@ -397,6 +539,9 @@ 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, + AV_CODEC_ID_ADPCM_AGM, /* AMR */ AV_CODEC_ID_AMR_NB = 0x12000, @@ -413,6 +558,7 @@ enum AVCodecID { AV_CODEC_ID_SOL_DPCM, AV_CODEC_ID_SDX2_DPCM = 0x14800, + AV_CODEC_ID_GREMLIN_DPCM, /* audio codecs */ AV_CODEC_ID_MP2 = 0x15000, @@ -447,9 +593,6 @@ enum AVCodecID { AV_CODEC_ID_MLP, AV_CODEC_ID_GSM_MS, /* as found in WAV */ AV_CODEC_ID_ATRAC3, -#if FF_API_VOXWARE - AV_CODEC_ID_VOXWARE, -#endif AV_CODEC_ID_APE, AV_CODEC_ID_NELLYMOSER, AV_CODEC_ID_MUSEPACK8, @@ -485,6 +628,7 @@ enum AVCodecID { AV_CODEC_ID_PAF_AUDIO, AV_CODEC_ID_ON2AVC, AV_CODEC_ID_DSS_SP, + AV_CODEC_ID_CODEC2, AV_CODEC_ID_FFWAVESYNTH = 0x15800, AV_CODEC_ID_SONIC, @@ -497,6 +641,17 @@ enum AVCodecID { AV_CODEC_ID_DSD_MSBF_PLANAR, AV_CODEC_ID_4GV, AV_CODEC_ID_INTERPLAY_ACM, + AV_CODEC_ID_XMA1, + AV_CODEC_ID_XMA2, + AV_CODEC_ID_DST, + AV_CODEC_ID_ATRAC3AL, + AV_CODEC_ID_ATRAC3PAL, + AV_CODEC_ID_DOLBY_E, + AV_CODEC_ID_APTX, + AV_CODEC_ID_APTX_HD, + AV_CODEC_ID_SBC, + AV_CODEC_ID_ATRAC9, + AV_CODEC_ID_HCOM, /* subtitle codecs */ AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs. @@ -525,11 +680,14 @@ enum AVCodecID { AV_CODEC_ID_PJS, AV_CODEC_ID_ASS, AV_CODEC_ID_HDMV_TEXT_SUBTITLE, + AV_CODEC_ID_TTML, + AV_CODEC_ID_ARIB_CAPTION, /* other specific kind of codecs (generally used for attachments) */ 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, @@ -572,18 +730,22 @@ typedef struct AVCodecDescriptor { * Codec properties, a combination of AV_CODEC_PROP_* flags. */ int props; - /** * MIME type(s) associated with the codec. * May be NULL; if not, a NULL-terminated array of MIME types. * The first item is always non-NULL and is the preferred MIME type. */ const char *const *mime_types; + /** + * If non-NULL, an array of profiles recognized for this codec. + * Terminated with FF_PROFILE_UNKNOWN. + */ + const struct AVProfile *profiles; } AVCodecDescriptor; /** * Codec uses only intra compression. - * Video codecs only. + * Video and audio codecs only. */ #define AV_CODEC_PROP_INTRA_ONLY (1 << 0) /** @@ -625,7 +787,7 @@ typedef struct AVCodecDescriptor { * Note: If the first 23 bits of the additional bytes are not 0, then damaged * MPEG bitstreams could cause overread and segfault. */ -#define AV_INPUT_BUFFER_PADDING_SIZE 32 +#define AV_INPUT_BUFFER_PADDING_SIZE 64 /** * @ingroup lavc_encoding @@ -634,38 +796,6 @@ typedef struct AVCodecDescriptor { */ #define AV_INPUT_BUFFER_MIN_SIZE 16384 -#if FF_API_WITHOUT_PREFIX -/** - * @deprecated use AV_INPUT_BUFFER_PADDING_SIZE instead - */ -#define FF_INPUT_BUFFER_PADDING_SIZE 32 - -/** - * @deprecated use AV_INPUT_BUFFER_MIN_SIZE instead - */ -#define FF_MIN_BUFFER_SIZE 16384 -#endif /* FF_API_WITHOUT_PREFIX */ - -/** - * @ingroup lavc_encoding - * motion estimation type. - * @deprecated use codec private option instead - */ -#if FF_API_MOTION_EST -enum Motion_Est_ID { - ME_ZERO = 1, ///< no search, that is use 0,0 vector whenever one is needed - ME_FULL, - ME_LOG, - ME_PHODS, - ME_EPZS, ///< enhanced predictive zonal search - ME_X1, ///< reserved for experiments - ME_HEX, ///< hexagon based search - ME_UMH, ///< uneven multi-hexagon search - ME_TESA, ///< transformed exhaustive search algorithm - ME_ITER=50, ///< iterative search -}; -#endif - /** * @ingroup lavc_decoding */ @@ -704,13 +834,6 @@ typedef struct RcOverride{ float quality_factor; } RcOverride; -#if FF_API_MAX_BFRAMES -/** - * @deprecated there is no libavcodec-wide limit on the number of B-frames - */ -#define FF_MAX_B_FRAMES 16 -#endif - /* encoding support These flags can be passed in AVCodecContext.flags before initialization. Note: Not everything is supported yet. @@ -737,6 +860,11 @@ typedef struct RcOverride{ * Use qpel MC. */ #define AV_CODEC_FLAG_QPEL (1 << 4) +/** + * Don't output frames whose parameters differ from first + * decoded frame in stream. + */ +#define AV_CODEC_FLAG_DROPCHANGED (1 << 5) /** * Use internal 2pass ratecontrol in first pass mode. */ @@ -778,7 +906,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 */ @@ -787,11 +915,11 @@ typedef struct RcOverride{ * interlaced motion estimation */ #define AV_CODEC_FLAG_INTERLACED_ME (1 << 29) +#define AV_CODEC_FLAG_CLOSED_GOP (1U << 31) + /** * Allow non spec compliant speedup tricks. */ -#define AV_CODEC_FLAG_CLOSED_GOP (1U << 31) - #define AV_CODEC_FLAG2_FAST (1 << 0) /** * Skip bitstream encoding. @@ -829,6 +957,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) @@ -878,20 +1010,13 @@ typedef struct RcOverride{ */ #define AV_CODEC_CAP_SMALL_LAST_FRAME (1 << 6) -#if FF_API_CAP_VDPAU -/** - * Codec can export data for HW decoding (VDPAU). - */ -#define AV_CODEC_CAP_HWACCEL_VDPAU (1 << 7) -#endif - /** * Codec can output multiple frames per AVPacket * Normally demuxers return one frame at a time, demuxers which do not do * 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. @@ -926,6 +1051,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. */ @@ -935,231 +1070,33 @@ typedef struct RcOverride{ */ #define AV_CODEC_CAP_LOSSLESS 0x80000000 - -#if FF_API_WITHOUT_PREFIX /** - * Allow decoders to produce frames with data planes that are not aligned - * to CPU requirements (e.g. due to cropping). + * Codec is backed by a hardware implementation. Typically used to + * identify a non-hwaccel hardware decoder. For information about hwaccels, use + * avcodec_get_hw_config() instead. */ -#define CODEC_FLAG_UNALIGNED AV_CODEC_FLAG_UNALIGNED -#define CODEC_FLAG_QSCALE AV_CODEC_FLAG_QSCALE -#define CODEC_FLAG_4MV AV_CODEC_FLAG_4MV -#define CODEC_FLAG_OUTPUT_CORRUPT AV_CODEC_FLAG_OUTPUT_CORRUPT -#define CODEC_FLAG_QPEL AV_CODEC_FLAG_QPEL -#if FF_API_GMC -/** - * @deprecated use the "gmc" private option of the libxvid encoder - */ -#define CODEC_FLAG_GMC 0x0020 ///< Use GMC. -#endif -#if FF_API_MV0 -/** - * @deprecated use the flag "mv0" in the "mpv_flags" private option of the - * mpegvideo encoders - */ -#define CODEC_FLAG_MV0 0x0040 -#endif -#if FF_API_INPUT_PRESERVED -/** - * @deprecated passing reference-counted frames to the encoders replaces this - * flag - */ -#define CODEC_FLAG_INPUT_PRESERVED 0x0100 -#endif -#define CODEC_FLAG_PASS1 AV_CODEC_FLAG_PASS1 -#define CODEC_FLAG_PASS2 AV_CODEC_FLAG_PASS2 -#define CODEC_FLAG_GRAY AV_CODEC_FLAG_GRAY -#if FF_API_EMU_EDGE -/** - * @deprecated edges are not used/required anymore. I.e. this flag is now always - * set. - */ -#define CODEC_FLAG_EMU_EDGE 0x4000 -#endif -#define CODEC_FLAG_PSNR AV_CODEC_FLAG_PSNR -#define CODEC_FLAG_TRUNCATED AV_CODEC_FLAG_TRUNCATED - -#if FF_API_NORMALIZE_AQP -/** - * @deprecated use the flag "naq" in the "mpv_flags" private option of the - * mpegvideo encoders - */ -#define CODEC_FLAG_NORMALIZE_AQP 0x00020000 -#endif -#define CODEC_FLAG_INTERLACED_DCT AV_CODEC_FLAG_INTERLACED_DCT -#define CODEC_FLAG_LOW_DELAY AV_CODEC_FLAG_LOW_DELAY -#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER -#define CODEC_FLAG_BITEXACT AV_CODEC_FLAG_BITEXACT -#define CODEC_FLAG_AC_PRED AV_CODEC_FLAG_AC_PRED -#define CODEC_FLAG_LOOP_FILTER AV_CODEC_FLAG_LOOP_FILTER -#define CODEC_FLAG_INTERLACED_ME AV_CODEC_FLAG_INTERLACED_ME -#define CODEC_FLAG_CLOSED_GOP AV_CODEC_FLAG_CLOSED_GOP -#define CODEC_FLAG2_FAST AV_CODEC_FLAG2_FAST -#define CODEC_FLAG2_NO_OUTPUT AV_CODEC_FLAG2_NO_OUTPUT -#define CODEC_FLAG2_LOCAL_HEADER AV_CODEC_FLAG2_LOCAL_HEADER -#define CODEC_FLAG2_DROP_FRAME_TIMECODE AV_CODEC_FLAG2_DROP_FRAME_TIMECODE -#define CODEC_FLAG2_IGNORE_CROP AV_CODEC_FLAG2_IGNORE_CROP - -#define CODEC_FLAG2_CHUNKS AV_CODEC_FLAG2_CHUNKS -#define CODEC_FLAG2_SHOW_ALL AV_CODEC_FLAG2_SHOW_ALL -#define CODEC_FLAG2_EXPORT_MVS AV_CODEC_FLAG2_EXPORT_MVS -#define CODEC_FLAG2_SKIP_MANUAL AV_CODEC_FLAG2_SKIP_MANUAL - -/* Unsupported options : - * Syntax Arithmetic coding (SAC) - * Reference Picture Selection - * Independent Segment Decoding */ -/* /Fx */ -/* codec capabilities */ - -#define CODEC_CAP_DRAW_HORIZ_BAND AV_CODEC_CAP_DRAW_HORIZ_BAND ///< Decoder can use draw_horiz_band callback. -/** - * Codec uses get_buffer() for allocating buffers and supports custom allocators. - * If not set, it might not use get_buffer() at all or use operations that - * assume the buffer was allocated by avcodec_default_get_buffer. - */ -#define CODEC_CAP_DR1 AV_CODEC_CAP_DR1 -#define CODEC_CAP_TRUNCATED AV_CODEC_CAP_TRUNCATED -#if FF_API_XVMC -/* Codec can export data for HW decoding. This flag indicates that - * the codec would call get_format() with list that might contain HW accelerated - * pixel formats (XvMC, VDPAU, VAAPI, etc). The application can pick any of them - * including raw image format. - * The application can use the passed context to determine bitstream version, - * chroma format, resolution etc. - */ -#define CODEC_CAP_HWACCEL 0x0010 -#endif /* FF_API_XVMC */ -/** - * Encoder or decoder requires flushing with NULL input at the end in order to - * give the complete and correct output. - * - * NOTE: If this flag is not set, the codec is guaranteed to never be fed with - * with NULL data. The user can still send NULL data to the public encode - * or decode function, but libavcodec will not pass it along to the codec - * unless this flag is set. - * - * Decoders: - * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL, - * avpkt->size=0 at the end to get the delayed data until the decoder no longer - * returns frames. - * - * Encoders: - * The encoder needs to be fed with NULL data at the end of encoding until the - * encoder no longer returns data. - * - * NOTE: For encoders implementing the AVCodec.encode2() function, setting this - * flag also means that the encoder must set the pts and duration for - * each output packet. If this flag is not set, the pts and duration will - * be determined by libavcodec from the input frame. - */ -#define CODEC_CAP_DELAY AV_CODEC_CAP_DELAY -/** - * Codec can be fed a final frame with a smaller size. - * This can be used to prevent truncation of the last audio samples. - */ -#define CODEC_CAP_SMALL_LAST_FRAME AV_CODEC_CAP_SMALL_LAST_FRAME -#if FF_API_CAP_VDPAU -/** - * Codec can export data for HW decoding (VDPAU). - */ -#define CODEC_CAP_HWACCEL_VDPAU AV_CODEC_CAP_HWACCEL_VDPAU -#endif -/** - * Codec can output multiple frames per AVPacket - * Normally demuxers return one frame at a time, demuxers which do not do - * 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 - * 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. - */ -#define CODEC_CAP_SUBFRAMES AV_CODEC_CAP_SUBFRAMES -/** - * Codec is experimental and is thus avoided in favor of non experimental - * encoders - */ -#define CODEC_CAP_EXPERIMENTAL AV_CODEC_CAP_EXPERIMENTAL -/** - * Codec should fill in channel configuration and samplerate instead of container - */ -#define CODEC_CAP_CHANNEL_CONF AV_CODEC_CAP_CHANNEL_CONF -#if FF_API_NEG_LINESIZES -/** - * @deprecated no codecs use this capability - */ -#define CODEC_CAP_NEG_LINESIZES 0x0800 -#endif -/** - * Codec supports frame-level multithreading. - */ -#define CODEC_CAP_FRAME_THREADS AV_CODEC_CAP_FRAME_THREADS -/** - * Codec supports slice-based (or partition-based) multithreading. - */ -#define CODEC_CAP_SLICE_THREADS AV_CODEC_CAP_SLICE_THREADS -/** - * Codec supports changed parameters at any point. - */ -#define CODEC_CAP_PARAM_CHANGE AV_CODEC_CAP_PARAM_CHANGE -/** - * Codec supports avctx->thread_count == 0 (auto). - */ -#define CODEC_CAP_AUTO_THREADS AV_CODEC_CAP_AUTO_THREADS -/** - * Audio encoder supports receiving a different number of samples in each call. - */ -#define CODEC_CAP_VARIABLE_FRAME_SIZE AV_CODEC_CAP_VARIABLE_FRAME_SIZE -/** - * Codec is intra only. - */ -#define CODEC_CAP_INTRA_ONLY AV_CODEC_CAP_INTRA_ONLY -/** - * Codec is lossless. - */ -#define CODEC_CAP_LOSSLESS AV_CODEC_CAP_LOSSLESS +#define AV_CODEC_CAP_HARDWARE (1 << 18) /** - * HWAccel is experimental and is thus avoided in favor of non experimental - * codecs + * Codec is potentially backed by a hardware implementation, but not + * necessarily. This is used instead of AV_CODEC_CAP_HARDWARE, if the + * implementation provides some sort of internal fallback. */ -#define HWACCEL_CODEC_CAP_EXPERIMENTAL 0x0200 -#endif /* FF_API_WITHOUT_PREFIX */ +#define AV_CODEC_CAP_HYBRID (1 << 19) -#if FF_API_MB_TYPE -//The following defines may change, don't expect compatibility if you use them. -#define MB_TYPE_INTRA4x4 0x0001 -#define MB_TYPE_INTRA16x16 0x0002 //FIXME H.264-specific -#define MB_TYPE_INTRA_PCM 0x0004 //FIXME H.264-specific -#define MB_TYPE_16x16 0x0008 -#define MB_TYPE_16x8 0x0010 -#define MB_TYPE_8x16 0x0020 -#define MB_TYPE_8x8 0x0040 -#define MB_TYPE_INTERLACED 0x0080 -#define MB_TYPE_DIRECT2 0x0100 //FIXME -#define MB_TYPE_ACPRED 0x0200 -#define MB_TYPE_GMC 0x0400 -#define MB_TYPE_SKIP 0x0800 -#define MB_TYPE_P0L0 0x1000 -#define MB_TYPE_P1L0 0x2000 -#define MB_TYPE_P0L1 0x4000 -#define MB_TYPE_P1L1 0x8000 -#define MB_TYPE_L0 (MB_TYPE_P0L0 | MB_TYPE_P1L0) -#define MB_TYPE_L1 (MB_TYPE_P0L1 | MB_TYPE_P1L1) -#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, ...) -#endif +/** + * This codec takes the reordered_opaque field from input AVFrames + * and returns it in the corresponding field in AVCodecContext after + * encoding. + */ +#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE (1 << 20) /** * Pan Scan area. * This specifies the area which should be displayed. * Note there may be multiple such areas for one frame. */ -typedef struct AVPanScan{ +typedef struct AVPanScan { /** * id * - encoding: Set by user. @@ -1181,14 +1118,57 @@ typedef struct AVPanScan{ * - decoding: Set by libavcodec. */ int16_t position[3][2]; -}AVPanScan; +} AVPanScan; -#if FF_API_QSCALE_TYPE -#define FF_QSCALE_TYPE_MPEG1 0 -#define FF_QSCALE_TYPE_MPEG2 1 -#define FF_QSCALE_TYPE_H264 2 -#define FF_QSCALE_TYPE_VP56 3 +/** + * This structure describes the bitrate properties of an encoded bitstream. It + * roughly corresponds to a subset the VBV parameters for MPEG-2 or HRD + * parameters for H.264/HEVC. + */ +typedef struct AVCPBProperties { + /** + * Maximum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ +#if FF_API_UNSANITIZED_BITRATES + int max_bitrate; +#else + int64_t max_bitrate; #endif + /** + * Minimum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ +#if FF_API_UNSANITIZED_BITRATES + int min_bitrate; +#else + int64_t min_bitrate; +#endif + /** + * Average bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ +#if FF_API_UNSANITIZED_BITRATES + int avg_bitrate; +#else + int64_t avg_bitrate; +#endif + + /** + * The size of the buffer to which the ratecontrol is applied, in bits. + * Zero if unknown or unspecified. + */ + int buffer_size; + + /** + * The delay between the time the packet this structure is associated with + * is received and the time when it should be decoded, in periods of a 27MHz + * clock. + * + * UINT64_MAX when unknown or unspecified. + */ + uint64_t vbv_delay; +} AVCPBProperties; /** * The decoder will keep a reference to the frame and may reuse it later. @@ -1202,7 +1182,20 @@ typedef struct AVPanScan{ * @{ */ enum AVPacketSideDataType { + /** + * An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE + * bytes worth of palette. This side data signals that a new palette is + * present. + */ 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, /** @@ -1282,6 +1275,19 @@ enum AVPacketSideDataType { */ AV_PKT_DATA_QUALITY_STATS, + /** + * This side data contains an integer value representing the stream index + * of a "fallback" track. A fallback track indicates an alternate + * track to use when the current track can not be decoded for some reason. + * e.g. no decoder available for codec. + */ + AV_PKT_DATA_FALLBACK_TRACK, + + /** + * This side data corresponds to the AVCPBProperties struct. + */ + AV_PKT_DATA_CPB_PROPERTIES, + /** * Recommmends skipping the specified number of samples * @code @@ -1291,7 +1297,7 @@ enum AVPacketSideDataType { * u8 reason for end skip (0=padding silence, 1=convergence) * @endcode */ - AV_PKT_DATA_SKIP_SAMPLES=70, + AV_PKT_DATA_SKIP_SAMPLES, /** * An AV_PKT_DATA_JP_DUALMONO side data packet indicates that @@ -1345,6 +1351,68 @@ enum AVPacketSideDataType { * side data includes updated metadata which appeared in the stream. */ AV_PKT_DATA_METADATA_UPDATE, + + /** + * MPEGTS stream ID as uint8_t, 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 contains data in the form + * of the AVMasteringDisplayMetadata struct. + */ + AV_PKT_DATA_MASTERING_DISPLAY_METADATA, + + /** + * This side data should be associated with a video stream and corresponds + * to the AVSphericalMapping structure. + */ + AV_PKT_DATA_SPHERICAL, + + /** + * Content light level (based on CTA-861.3). This metadata should be + * associated with a video stream and contains data in the form of the + * AVContentLightMetadata struct. + */ + AV_PKT_DATA_CONTENT_LIGHT_LEVEL, + + /** + * ATSC A53 Part 4 Closed Captions. This metadata should be associated with + * a video stream. A53 CC bitstream is stored as uint8_t in AVPacketSideData.data. + * The number of bytes of CC data is AVPacketSideData.size. + */ + AV_PKT_DATA_A53_CC, + + /** + * This side data is encryption initialization data. + * The format is not part of ABI, use av_encryption_init_info_* methods to + * access. + */ + AV_PKT_DATA_ENCRYPTION_INIT_INFO, + + /** + * This side data contains encryption info for how to decrypt the packet. + * The format is not part of ABI, use av_encryption_info_* methods to access. + */ + AV_PKT_DATA_ENCRYPTION_INFO, + + /** + * Active Format Description data consisting of a single byte as specified + * in ETSI TS 101 154 using AVActiveFormatDescription enum. + */ + AV_PKT_DATA_AFD, + + /** + * The number of side data types. + * This is not part of the public API/ABI in the sense that it may + * change when new side data types are added. + * This must stay the last enum value. + * If its value becomes huge, some code using it + * needs to be updated as it assumes it to be smaller than other limits. + */ + AV_PKT_DATA_NB }; #define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED @@ -1440,6 +1508,25 @@ 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 +/** + * The packet comes from a trusted source. + * + * Otherwise-unsafe constructs such as arbitrary pointers to data + * outside the packet may be followed. + */ +#define AV_PKT_FLAG_TRUSTED 0x0008 +/** + * Flag is used to indicate packets that contain frames that can + * be discarded by the decoder. I.e. Non-reference frames. + */ +#define AV_PKT_FLAG_DISPOSABLE 0x0010 + enum AVSideDataParamChangeFlags { AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001, @@ -1467,8 +1554,12 @@ enum AVFieldOrder { * New fields can be added to the end with minor version bumps. * Removal, reordering and changes to existing fields require a major * version bump. - * Please use AVOptions (av_opt* / av_set/get*()) to access these fields from user + * You can 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 { @@ -1481,13 +1572,6 @@ typedef struct AVCodecContext { enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */ const struct AVCodec *codec; -#if FF_API_CODEC_NAME - /** - * @deprecated this field is not used for anything in libavcodec - */ - attribute_deprecated - char codec_name[32]; -#endif enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */ /** @@ -1505,14 +1589,6 @@ typedef struct AVCodecContext { */ unsigned int codec_tag; -#if FF_API_STREAM_CODEC_TAG - /** - * @deprecated this field is unused - */ - attribute_deprecated - unsigned int stream_codec_tag; -#endif - void *priv_data; /** @@ -1577,12 +1653,13 @@ 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. + * Must be allocated with the av_malloc() family of functions. * - encoding: Set/allocated/freed by libavcodec. * - decoding: Set/allocated/freed by user. */ @@ -1595,7 +1672,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. @@ -1641,7 +1726,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. @@ -1657,7 +1742,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 @@ -1667,10 +1752,6 @@ typedef struct AVCodecContext { */ int coded_width, coded_height; -#if FF_API_ASPECT_EXTENDED -#define FF_ASPECT_EXTENDED 15 -#endif - /** * the number of pictures in a group of pictures, or 0 for intra_only * - encoding: Set by user. @@ -1684,7 +1765,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. @@ -1693,14 +1774,6 @@ typedef struct AVCodecContext { */ enum AVPixelFormat pix_fmt; -#if FF_API_MOTION_EST - /** - * This option does nothing - * @deprecated use codec private options instead - */ - attribute_deprecated int me_method; -#endif - /** * If non NULL, 'draw_horiz_band' is called by the libavcodec * decoder to draw a horizontal band. It improves cache usage. Not @@ -1760,13 +1833,11 @@ typedef struct AVCodecContext { */ float b_quant_factor; -#if FF_API_RC_STRATEGY - /** @deprecated use codec private option instead */ - attribute_deprecated int rc_strategy; -#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 @@ -1783,16 +1854,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 @@ -1847,15 +1917,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 @@ -1897,22 +1967,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 @@ -1928,12 +1999,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 @@ -1956,26 +2026,6 @@ typedef struct AVCodecContext { */ int me_subpel_quality; -#if FF_API_AFD - /** - * DTG active format information (additional aspect ratio - * information only used in DVB MPEG-2 transport streams) - * 0 if not set. - * - * - encoding: unused - * - decoding: Set by decoder. - * @deprecated Deprecated in favor of AVSideData - */ - attribute_deprecated int dtg_active_format; -#define FF_DTG_AFD_SAME 8 -#define FF_DTG_AFD_4_3 9 -#define FF_DTG_AFD_16_9 10 -#define FF_DTG_AFD_14_9 11 -#define FF_DTG_AFD_4_3_SP_14_9 13 -#define FF_DTG_AFD_16_9_SP_14_9 14 -#define FF_DTG_AFD_SP_4_3 15 -#endif /* FF_API_AFD */ - /** * maximum motion estimation search range in subpel units * If 0 then no limit. @@ -1985,19 +2035,6 @@ typedef struct AVCodecContext { */ int me_range; -#if FF_API_QUANT_BIAS - /** - * @deprecated use encoder private option instead - */ - attribute_deprecated int intra_quant_bias; -#define FF_DEFAULT_QUANT_BIAS 999999 - - /** - * @deprecated use encoder private option instead - */ - attribute_deprecated int inter_quant_bias; -#endif - /** * slice flags * - encoding: unused @@ -2005,19 +2042,9 @@ 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 - /** - * XVideo Motion Acceleration - * - encoding: forbidden - * - decoding: set by decoder - * @deprecated XvMC doesn't need it anymore. - */ - attribute_deprecated int xvmc_acceleration; -#endif /* FF_API_XVMC */ - /** * macroblock decision mode * - encoding: Set by user. @@ -2030,45 +2057,30 @@ typedef struct AVCodecContext { /** * custom intra quantization matrix - * - encoding: Set by user, can be NULL. - * - decoding: Set by libavcodec. + * Must be allocated with the av_malloc() family of functions, and will be freed in + * avcodec_free_context(). + * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL. + * - decoding: Set/allocated/freed by libavcodec. */ uint16_t *intra_matrix; /** * custom inter quantization matrix - * - encoding: Set by user, can be NULL. - * - decoding: Set by libavcodec. + * Must be allocated with the av_malloc() family of functions, and will be freed in + * avcodec_free_context(). + * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL. + * - decoding: Set/allocated/freed by libavcodec. */ 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; - -#if FF_API_MPV_OPT - /** - * @deprecated this field is unused - */ - attribute_deprecated - int me_threshold; - - /** - * @deprecated this field is unused - */ - attribute_deprecated - int mb_threshold; #endif /** @@ -2092,48 +2104,39 @@ typedef struct AVCodecContext { */ int skip_bottom; -#if FF_API_MPV_OPT /** - * @deprecated use encoder private options instead - */ - attribute_deprecated - float border_masking; -#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 @@ -2149,36 +2152,24 @@ 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; - -#if FF_API_UNUSED_MEMBERS - /** - * Multiplied by qscale for each frame and added to scene_change_score. - * - encoding: Set by user. - * - decoding: unused - */ - attribute_deprecated int scenechange_factor; #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. @@ -2332,7 +2323,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 @@ -2396,9 +2387,12 @@ 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(). */ + attribute_deprecated int refcounted_frames; /* - encoding parameters */ @@ -2426,19 +2420,6 @@ typedef struct AVCodecContext { */ int max_qdiff; -#if FF_API_MPV_OPT - /** - * @deprecated use encoder private options instead - */ - attribute_deprecated - float rc_qsquish; - - attribute_deprecated - float rc_qmod_amp; - attribute_deprecated - int rc_qmod_freq; -#endif - /** * decoder bitstream buffer size * - encoding: Set by user. @@ -2454,14 +2435,6 @@ typedef struct AVCodecContext { int rc_override_count; RcOverride *rc_override; -#if FF_API_MPV_OPT - /** - * @deprecated use encoder private options instead - */ - attribute_deprecated - const char *rc_eq; -#endif - /** * maximum bitrate * - encoding: Set by user. @@ -2476,17 +2449,6 @@ typedef struct AVCodecContext { */ int64_t rc_min_rate; -#if FF_API_MPV_OPT - /** - * @deprecated use encoder private options instead - */ - attribute_deprecated - float rc_buffer_aggressivity; - - attribute_deprecated - float rc_initial_cplx; -#endif - /** * Ratecontrol attempt to use, at maximum, of what can be used without an underflow. * - encoding: Set by user. @@ -2508,68 +2470,41 @@ typedef struct AVCodecContext { */ int rc_initial_buffer_occupancy; +#if FF_API_CODER_TYPE #define FF_CODER_TYPE_VLC 0 #define FF_CODER_TYPE_AC 1 #define FF_CODER_TYPE_RAW 2 #define FF_CODER_TYPE_RLE 3 -#if FF_API_UNUSED_MEMBERS -#define FF_CODER_TYPE_DEFLATE 4 -#endif /* FF_API_UNUSED_MEMBERS */ /** - * coder type - * - encoding: Set by user. - * - decoding: unused + * @deprecated use encoder private options instead */ + attribute_deprecated 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; - -#if FF_API_MPV_OPT - /** - * @deprecated use encoder private options instead - */ - attribute_deprecated - int lmin; - - /** - * @deprecated use encoder private options instead - */ - attribute_deprecated - 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 @@ -2578,56 +2513,68 @@ 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 + /** + * @deprecated unused + */ /* The RTP callback: This function is called */ /* every time the encoder has a packet to send. */ /* It depends on the encoder if the data starts */ /* with a Start Code (it should). H.263 does. */ /* mb_nb contains the number of macroblocks */ /* encoded in the RTP payload. */ + attribute_deprecated 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 */ + attribute_deprecated int mv_bits; + attribute_deprecated int header_bits; + attribute_deprecated int i_tex_bits; + attribute_deprecated int p_tex_bits; + attribute_deprecated int i_count; + attribute_deprecated int p_count; + attribute_deprecated int skip_count; + attribute_deprecated int misc_bits; - /** - * number of bits used for the previously encoded frame - * - encoding: Set by libavcodec. - * - decoding: unused - */ + /** @deprecated this field is unused */ + attribute_deprecated int frame_bits; +#endif /** * pass1 encoding statistics output buffer @@ -2651,16 +2598,10 @@ typedef struct AVCodecContext { */ int workaround_bugs; #define FF_BUG_AUTODETECT 1 ///< autodetection -#if FF_API_OLD_MSMPEG4 -#define FF_BUG_OLD_MSMPEG4 2 -#endif #define FF_BUG_XVID_ILACE 4 #define FF_BUG_UMP4 8 #define FF_BUG_NO_PADDING 16 #define FF_BUG_AMV 32 -#if FF_API_AC_VLC -#define FF_BUG_AC_VLC 0 ///< Will be removed, libavcodec can now handle these non-compliant files by default. -#endif #define FF_BUG_QPEL_CHROMA 64 #define FF_BUG_STD_QPEL 128 #define FF_BUG_QPEL_CHROMA2 256 @@ -2670,9 +2611,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 @@ -2720,15 +2662,12 @@ typedef struct AVCodecContext { #define FF_DEBUG_DCT_COEFF 0x00000040 #define FF_DEBUG_SKIP 0x00000080 #define FF_DEBUG_STARTCODE 0x00000100 -#if FF_API_UNUSED_MEMBERS -#define FF_DEBUG_PTS 0x00000200 -#endif /* FF_API_UNUSED_MEMBERS */ #define FF_DEBUG_ER 0x00000400 #define FF_DEBUG_MMCO 0x00000800 #define FF_DEBUG_BUGS 0x00001000 #if FF_API_DEBUG_MV -#define FF_DEBUG_VIS_QP 0x00002000 ///< only access through AVOptions from outside libavcodec -#define FF_DEBUG_VIS_MB_TYPE 0x00004000 ///< only access through AVOptions from outside libavcodec +#define FF_DEBUG_VIS_QP 0x00002000 +#define FF_DEBUG_VIS_MB_TYPE 0x00004000 #endif #define FF_DEBUG_BUFFERS 0x00008000 #define FF_DEBUG_THREADS 0x00010000 @@ -2738,14 +2677,13 @@ typedef struct AVCodecContext { #if FF_API_DEBUG_MV /** * debug - * Code outside libavcodec should access this field using AVOptions * - encoding: Set by user. * - 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 /** @@ -2773,9 +2711,12 @@ 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 + * - encoding: Set by libavcodec to the reordered_opaque of the input + * frame corresponding to the last returned packet. Only + * supported by encoders with the + * AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE capability. * - decoding: Set by user. */ int64_t reordered_opaque; @@ -2785,7 +2726,7 @@ typedef struct AVCodecContext { * - encoding: unused. * - decoding: Set by libavcodec */ - struct AVHWAccel *hwaccel; + const struct AVHWAccel *hwaccel; /** * Hardware accelerator context. @@ -2831,27 +2772,13 @@ typedef struct AVCodecContext { #define FF_IDCT_SIMPLEMMX 3 #define FF_IDCT_ARM 7 #define FF_IDCT_ALTIVEC 8 -#if FF_API_ARCH_SH4 -#define FF_IDCT_SH4 9 -#endif #define FF_IDCT_SIMPLEARM 10 -#if FF_API_UNUSED_MEMBERS -#define FF_IDCT_IPP 13 -#endif /* FF_API_UNUSED_MEMBERS */ #define FF_IDCT_XVID 14 -#if FF_API_IDCT_XVIDMMX -#define FF_IDCT_XVIDMMX 14 -#endif /* FF_API_IDCT_XVIDMMX */ #define FF_IDCT_SIMPLEARMV5TE 16 #define FF_IDCT_SIMPLEARMV6 17 -#if FF_API_ARCH_SPARC -#define FF_IDCT_SIMPLEVIS 18 -#endif #define FF_IDCT_FAAN 20 #define FF_IDCT_SIMPLENEON 22 -#if FF_API_ARCH_ALPHA -#define FF_IDCT_SIMPLEALPHA 23 -#endif +#define FF_IDCT_NONE 24 /* Used by XvMC to extract IDCT coefficients with FF_IDCT_PERM_NONE */ #define FF_IDCT_SIMPLEAUTO 128 /** @@ -2873,8 +2800,6 @@ typedef struct AVCodecContext { * low resolution decoding, 1-> 1/2 size, 2->1/4 size * - encoding: unused * - decoding: Set by user. - * Code outside libavcodec should access this field using: - * av_codec_{get,set}_lowres(avctx) */ int lowres; #endif @@ -2985,6 +2910,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 @@ -3009,8 +2941,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) @@ -3038,9 +2972,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 @@ -3054,6 +2988,28 @@ typedef struct AVCodecContext { #define FF_PROFILE_HEVC_MAIN_STILL_PICTURE 3 #define FF_PROFILE_HEVC_REXT 4 +#define FF_PROFILE_AV1_MAIN 0 +#define FF_PROFILE_AV1_HIGH 1 +#define FF_PROFILE_AV1_PROFESSIONAL 2 + +#define FF_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT 0xc0 +#define FF_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT 0xc1 +#define FF_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT 0xc2 +#define FF_PROFILE_MJPEG_HUFFMAN_LOSSLESS 0xc3 +#define FF_PROFILE_MJPEG_JPEG_LS 0xf7 + +#define FF_PROFILE_SBC_MSBC 1 + +#define FF_PROFILE_PRORES_PROXY 0 +#define FF_PROFILE_PRORES_LT 1 +#define FF_PROFILE_PRORES_STANDARD 2 +#define FF_PROFILE_PRORES_HQ 3 +#define FF_PROFILE_PRORES_4444 4 +#define FF_PROFILE_PRORES_XQ 5 + +#define FF_PROFILE_ARIB_PROFILE_A 0 +#define FF_PROFILE_ARIB_PROFILE_C 1 + /** * level * - encoding: Set by user. @@ -3094,22 +3050,18 @@ typedef struct AVCodecContext { uint8_t *subtitle_header; int subtitle_header_size; -#if FF_API_ERROR_RATE - /** - * @deprecated use the 'error_rate' private AVOption of the mpegvideo - * encoders - */ - attribute_deprecated - int error_rate; -#endif - +#if FF_API_VBV_DELAY /** * VBV delay coded in the last frame (in periods of a 27 MHz clock). * Used for compliant TS muxing. * - encoding: Set by libavcodec. * - decoding: unused. + * @deprecated this value is now exported as a part of + * AV_PKT_DATA_CPB_PROPERTIES packet side data */ + attribute_deprecated uint64_t vbv_delay; +#endif #if FF_API_SIDEDATA_ONLY_PKT /** @@ -3147,7 +3099,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; @@ -3160,8 +3113,6 @@ typedef struct AVCodecContext { /** * Timebase in which pkt_dts/pts and AVPacket.dts/pts are. - * Code outside libavcodec should access this field using: - * av_codec_{get,set}_pkt_timebase(avctx) * - encoding unused. * - decoding set by user. */ @@ -3169,8 +3120,6 @@ typedef struct AVCodecContext { /** * AVCodecDescriptor - * Code outside libavcodec should access this field using: - * av_codec_{get,set}_codec_descriptor(avctx) * - encoding: unused. * - decoding: set by libavcodec. */ @@ -3181,8 +3130,6 @@ typedef struct AVCodecContext { * low resolution decoding, 1-> 1/2 size, 2->1/4 size * - encoding: unused * - decoding: Set by user. - * Code outside libavcodec should access this field using: - * av_codec_{get,set}_lowres(avctx) */ int lowres; #endif @@ -3214,6 +3161,7 @@ typedef struct AVCodecContext { #define FF_SUB_CHARENC_MODE_DO_NOTHING -1 ///< do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for instance) #define FF_SUB_CHARENC_MODE_AUTOMATIC 0 ///< libavcodec will select the mode itself #define FF_SUB_CHARENC_MODE_PRE_DECODER 1 ///< the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv +#define FF_SUB_CHARENC_MODE_IGNORE 2 ///< neither convert the subtitles, nor check them for valid UTF-8 /** * Skip processing alpha if supported by codec. @@ -3223,7 +3171,6 @@ typedef struct AVCodecContext { * However for formats that do not use pre-multiplied alpha * there might be serious artefacts (though e.g. libswscale currently * assumes pre-multiplied alpha anyway). - * Code outside libavcodec should access this field using AVOptions * * - decoding: set by user * - encoding: unused @@ -3240,7 +3187,6 @@ typedef struct AVCodecContext { #if !FF_API_DEBUG_MV /** * debug motion vectors - * Code outside libavcodec should access this field using AVOptions * - encoding: Set by user. * - decoding: Set by user. */ @@ -3252,7 +3198,6 @@ typedef struct AVCodecContext { /** * custom intra quantization matrix - * Code outside libavcodec should access this field using av_codec_g/set_chroma_intra_matrix() * - encoding: Set by user, can be NULL. * - decoding: unused. */ @@ -3261,8 +3206,6 @@ typedef struct AVCodecContext { /** * dump format separator. * can be ", " or "\n " or anything else - * Code outside libavcodec should access this field using AVOptions - * (NO direct access). * - encoding: Set by user. * - decoding: Set by user. */ @@ -3272,37 +3215,198 @@ typedef struct AVCodecContext { * ',' separated list of allowed decoders. * If NULL then all are allowed * - encoding: unused - * - decoding: set by user through AVOPtions (NO direct access) + * - decoding: set by user */ char *codec_whitelist; - /* + /** * Properties of the stream that gets decoded - * To be accessed through av_codec_get_properties() (NO direct access) * - encoding: unused * - decoding: set by libavcodec */ unsigned properties; #define FF_CODEC_PROPERTY_LOSSLESS 0x00000001 #define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002 + + /** + * Additional data associated with the entire coded stream. + * + * - decoding: unused + * - encoding: may be set by libavcodec after avcodec_open2(). + */ + 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 - it should never be read by + * the caller after being set. + * + * - 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; + + /** + * The number of pixels per image to maximally accept. + * + * - decoding: set by user + * - encoding: set by user + */ + int64_t max_pixels; + + /** + * A reference to the AVHWDeviceContext describing the device which will + * be used by a hardware encoder/decoder. The reference is set by the + * caller and afterwards owned (and freed) by libavcodec. + * + * This should be used if either the codec device does not require + * hardware frames or any that are used are to be allocated internally by + * libavcodec. If the user wishes to supply any of the frames used as + * encoder input or decoder output then hw_frames_ctx should be used + * instead. When hw_frames_ctx is set in get_format() for a decoder, this + * field will be ignored while decoding the associated stream segment, but + * may again be used on a following one after another get_format() call. + * + * For both encoders and decoders this field should be set before + * avcodec_open2() is called and must not be written to thereafter. + * + * Note that some decoders may require this field to be set initially in + * order to support hw_frames_ctx at all - in that case, all frames + * contexts used must be created on the same device. + */ + AVBufferRef *hw_device_ctx; + + /** + * Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated + * decoding (if active). + * - encoding: unused + * - decoding: Set by user (either before avcodec_open2(), or in the + * AVCodecContext.get_format callback) + */ + int hwaccel_flags; + + /** + * Video decoding only. Certain video codecs support cropping, meaning that + * only a sub-rectangle of the decoded frame is intended for display. This + * option controls how cropping is handled by libavcodec. + * + * When set to 1 (the default), libavcodec will apply cropping internally. + * I.e. it will modify the output frame width/height fields and offset the + * data pointers (only by as much as possible while preserving alignment, or + * by the full amount if the AV_CODEC_FLAG_UNALIGNED flag is set) so that + * the frames output by the decoder refer only to the cropped area. The + * crop_* fields of the output frames will be zero. + * + * When set to 0, the width/height fields of the output frames will be set + * to the coded dimensions and the crop_* fields will describe the cropping + * rectangle. Applying the cropping is left to the caller. + * + * @warning When hardware acceleration with opaque output frames is used, + * libavcodec is unable to apply cropping from the top/left border. + * + * @note when this option is set to zero, the width/height fields of the + * AVCodecContext and output AVFrames have different meanings. The codec + * context fields store display dimensions (with the coded dimensions in + * coded_width/height), while the frame fields store the coded dimensions + * (with the display dimensions being determined by the crop_* fields). + */ + int apply_cropping; + + /* + * Video decoding only. Sets the number of extra hardware frames which + * the decoder will allocate for use by the caller. This must be set + * before avcodec_open2() is called. + * + * Some hardware decoders require all frames that they will use for + * output to be defined in advance before decoding starts. For such + * decoders, the hardware frame pool must therefore be of a fixed size. + * The extra frames set here are on top of any number that the decoder + * needs internally in order to operate normally (for example, frames + * used as reference pictures). + */ + int extra_hw_frames; + + /** + * The percentage of damaged samples to discard a frame. + * + * - decoding: set by user + * - encoding: unused + */ + int discard_damaged_percentage; } AVCodecContext; +#if FF_API_CODEC_GET_SET +/** + * Accessors for some AVCodecContext fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +attribute_deprecated AVRational av_codec_get_pkt_timebase (const AVCodecContext *avctx); +attribute_deprecated void av_codec_set_pkt_timebase (AVCodecContext *avctx, AVRational val); +attribute_deprecated const AVCodecDescriptor *av_codec_get_codec_descriptor(const AVCodecContext *avctx); +attribute_deprecated void av_codec_set_codec_descriptor(AVCodecContext *avctx, const AVCodecDescriptor *desc); +attribute_deprecated unsigned av_codec_get_codec_properties(const AVCodecContext *avctx); +#if FF_API_LOWRES +attribute_deprecated int av_codec_get_lowres(const AVCodecContext *avctx); +attribute_deprecated void av_codec_set_lowres(AVCodecContext *avctx, int val); +#endif +attribute_deprecated int av_codec_get_seek_preroll(const AVCodecContext *avctx); +attribute_deprecated void av_codec_set_seek_preroll(AVCodecContext *avctx, int val); +attribute_deprecated uint16_t *av_codec_get_chroma_intra_matrix(const AVCodecContext *avctx); +attribute_deprecated void av_codec_set_chroma_intra_matrix(AVCodecContext *avctx, uint16_t *val); +#endif /** * AVProfile. @@ -3312,6 +3416,61 @@ typedef struct AVProfile { const char *name; ///< short name for the profile } AVProfile; +enum { + /** + * The codec supports this format via the hw_device_ctx interface. + * + * When selecting this format, AVCodecContext.hw_device_ctx should + * have been set to a device of the specified type before calling + * avcodec_open2(). + */ + AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX = 0x01, + /** + * The codec supports this format via the hw_frames_ctx interface. + * + * When selecting this format for a decoder, + * AVCodecContext.hw_frames_ctx should be set to a suitable frames + * context inside the get_format() callback. The frames context + * must have been created on a device of the specified type. + */ + AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX = 0x02, + /** + * The codec supports this format by some internal method. + * + * This format can be selected without any additional configuration - + * no device or frames context is required. + */ + AV_CODEC_HW_CONFIG_METHOD_INTERNAL = 0x04, + /** + * The codec supports this format by some ad-hoc method. + * + * Additional settings and/or function calls are required. See the + * codec-specific documentation for details. (Methods requiring + * this sort of configuration are deprecated and others should be + * used in preference.) + */ + AV_CODEC_HW_CONFIG_METHOD_AD_HOC = 0x08, +}; + +typedef struct AVCodecHWConfig { + /** + * A hardware pixel format which the codec can use. + */ + enum AVPixelFormat pix_fmt; + /** + * Bit set of AV_CODEC_HW_CONFIG_METHOD_* flags, describing the possible + * setup methods which can be used with this configuration. + */ + int methods; + /** + * The device type associated with the configuration. + * + * Must be set for AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX and + * AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX, otherwise unused. + */ + enum AVHWDeviceType device_type; +} AVCodecHWConfig; + typedef struct AVCodecDefault AVCodecDefault; struct AVSubtitle; @@ -3344,10 +3503,22 @@ typedef struct AVCodec { const int *supported_samplerates; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0 const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1 const uint64_t *channel_layouts; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0 - uint8_t max_lowres; ///< maximum value for lowres supported by the decoder, no direct access, use av_codec_get_max_lowres() + uint8_t max_lowres; ///< maximum value for lowres supported by the decoder const AVClass *priv_class; ///< AVClass for the private context const AVProfile *profiles; ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN} + /** + * Group name of the codec implementation. + * This is a short symbolic name of the wrapper backing this codec. A + * wrapper uses some kind of external implementation for the codec, such + * as an external library, or a codec implementation provided by the OS or + * the hardware. + * If this field is NULL, this is a builtin, libavcodec native codec. + * If non-NULL, this will be the suffix in AVCodec.name in most cases + * (usually AVCodec.name will be of the form "_"). + */ + const char *wrapper_name; + /***************************************************************** * No fields below this line are part of the public API. They * may not be used outside of libavcodec and can be changed and @@ -3384,6 +3555,9 @@ typedef struct AVCodec { /** * Initialize codec static data, called from avcodec_register(). + * + * This is not intended for time consuming operations as it is + * run for every codec regardless of that codec being used. */ void (*init_static_data)(struct AVCodec *codec); @@ -3404,6 +3578,23 @@ typedef struct AVCodec { int *got_packet_ptr); int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt); int (*close)(AVCodecContext *); + /** + * 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, + * - if AV_CODEC_CAP_DELAY is not set, drain frames are never sent, + * - only one drain frame is ever passed down, + */ + int (*send_frame)(AVCodecContext *avctx, const AVFrame *frame); + int (*receive_packet)(AVCodecContext *avctx, AVPacket *avpkt); + + /** + * Decode API with decoupled packet/frame dataflow. This function is called + * to get one output frame. It should call ff_decode_get_packet() to obtain + * input data. + */ + int (*receive_frame)(AVCodecContext *avctx, AVFrame *frame); /** * Flush buffers. * Will be called when seeking @@ -3414,14 +3605,45 @@ typedef struct AVCodec { * See FF_CODEC_CAP_* in internal.h */ int caps_internal; + + /** + * Decoding only, a comma-separated list of bitstream filters to apply to + * packets before decoding. + */ + const char *bsfs; + + /** + * Array of pointers to hardware configurations supported by the codec, + * or NULL if no hardware supported. The array is terminated by a NULL + * pointer. + * + * The user can only access this field via avcodec_get_hw_config(). + */ + const struct AVCodecHWConfigInternal **hw_configs; } AVCodec; +#if FF_API_CODEC_GET_SET +attribute_deprecated int av_codec_get_max_lowres(const AVCodec *codec); +#endif struct MpegEncContext; +/** + * Retrieve supported hardware configurations for a codec. + * + * Values of index from zero to some maximum return the indexed configuration + * descriptor; all other values return NULL. If the codec does not support + * any hardware configurations then it will always return NULL. + */ +const AVCodecHWConfig *avcodec_get_hw_config(const AVCodec *codec, int index); + /** * @defgroup lavc_hwaccel AVHWAccel + * + * @note Nothing in this structure should be accessed by the user. At some + * point in future it will not be externally visible at all. + * * @{ */ typedef struct AVHWAccel { @@ -3455,7 +3677,7 @@ typedef struct AVHWAccel { /** * Hardware accelerated codec capabilities. - * see HWACCEL_CODEC_CAP_* + * see AV_HWACCEL_CODEC_CAP_* */ int capabilities; @@ -3466,7 +3688,6 @@ typedef struct AVHWAccel { * New public fields should be added right above. ***************************************************************** */ - struct AVHWAccel *next; /** * Allocate a custom buffer @@ -3489,6 +3710,20 @@ typedef struct AVHWAccel { */ int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + /** + * Callback for parameter data (SPS/PPS/VPS etc). + * + * Useful for hardware decoders which keep persistent state about the + * video parameters, and need to receive any changes to update that state. + * + * @param avctx the codec context + * @param type the nal unit type + * @param buf the nal unit data buffer + * @param buf_size the size of the nal unit in bytes + * @return zero if successful, a negative value otherwise + */ + int (*decode_params)(AVCodecContext *avctx, int type, const uint8_t *buf, uint32_t buf_size); + /** * Callback for each slice. * @@ -3526,7 +3761,7 @@ typedef struct AVHWAccel { /** * Called for every Macroblock in a slice. * - * XvMC uses it to replace the ff_mpv_decode_mb(). + * XvMC uses it to replace the ff_mpv_reconstruct_mb(). * Instead of decoding to raw picture, MB parameters are * stored in an array provided by the video driver. * @@ -3556,8 +3791,29 @@ typedef struct AVHWAccel { * AVCodecInternal.hwaccel_priv_data. */ int priv_data_size; + + /** + * Internal hwaccel capabilities. + */ + int caps_internal; + + /** + * Fill the given hw_frames context with current codec parameters. Called + * from get_format. Refer to avcodec_get_hw_frames_parameters() for + * details. + * + * This CAN be called before AVHWAccel.init is called, and you must assume + * that avctx->hwaccel_priv_data is invalid. + */ + int (*frame_params)(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx); } AVHWAccel; +/** + * HWAccel is experimental and is thus avoided in favor of non experimental + * codecs + */ +#define AV_HWACCEL_CODEC_CAP_EXPERIMENTAL 0x0200 + /** * Hardware acceleration should be used for decoding even if the codec level * used is unknown or higher than the maximum supported level reported by the @@ -3574,6 +3830,20 @@ typedef struct AVHWAccel { */ #define AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH (1 << 1) +/** + * Hardware acceleration should still be attempted for decoding when the + * codec profile does not match the reported capabilities of the hardware. + * + * For example, this can be used to try to decode baseline profile H.264 + * streams in hardware - it will often succeed, because many streams marked + * as baseline profile actually conform to constrained baseline profile. + * + * @warning If the stream is actually not supported then the behaviour is + * undefined, and may include returning entirely incorrect output + * while indicating success. + */ +#define AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH (1 << 2) + /** * @} */ @@ -3669,12 +3939,184 @@ 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; + +/** + * Iterate over all registered codecs. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered codec or NULL when the iteration is + * finished + */ +const AVCodec *av_codec_iterate(void **opaque); + +#if FF_API_NEXT /** * If c is NULL, returns the first registered codec, * if c is non-NULL, returns the next registered codec after c, * or NULL if c is the last one. */ +attribute_deprecated AVCodec *av_codec_next(const AVCodec *c); +#endif /** * Return the LIBAVCODEC_VERSION_INT constant. @@ -3691,6 +4133,7 @@ const char *avcodec_configuration(void); */ const char *avcodec_license(void); +#if FF_API_NEXT /** * Register the codec codec and initialize libavcodec. * @@ -3699,6 +4142,7 @@ const char *avcodec_license(void); * * @see avcodec_register_all() */ +attribute_deprecated void avcodec_register(AVCodec *codec); /** @@ -3711,7 +4155,9 @@ void avcodec_register(AVCodec *codec); * @see av_register_codec_parser * @see av_register_bitstream_filter */ +attribute_deprecated void avcodec_register_all(void); +#endif /** * Allocate an AVCodecContext and set its fields to default values. The @@ -3725,7 +4171,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); @@ -3735,16 +4180,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 @@ -3754,6 +4197,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. @@ -3780,8 +4224,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 @@ -3794,7 +4288,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(); @@ -3812,9 +4306,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. * @@ -3829,9 +4322,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); @@ -3874,13 +4371,13 @@ AVPacket *av_packet_alloc(void); * @see av_packet_alloc * @see av_packet_ref */ -AVPacket *av_packet_clone(AVPacket *src); +AVPacket *av_packet_clone(const AVPacket *src); /** * Free the packet, if the packet is reference counted, it will be * unreferenced first. * - * @param packet packet to be freed. The pointer will be set to NULL. + * @param pkt packet to be freed. The pointer will be set to NULL. * @note passing NULL is a no-op. */ void av_packet_free(AVPacket **pkt); @@ -3925,7 +4422,7 @@ int av_grow_packet(AVPacket *pkt, int grow_by); * Initialize a reference-counted packet from av_malloc()ed data. * * @param pkt packet to be initialized. This function will set the data, size, - * buf and destruct fields, all others are left untouched. + * and buf fields, all others are left untouched. * @param data Data allocated by av_malloc() to be used as packet data. If this * function returns successfully, the data is owned by the underlying AVBuffer. * The caller may not access the data through other means. @@ -3941,7 +4438,7 @@ int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size); * @warning This is a hack - the packet memory allocation stuff is broken. The * packet is allocated if it was not really allocated. * - * @deprecated Use av_packet_ref + * @deprecated Use av_packet_ref or av_packet_make_refcounted */ attribute_deprecated int av_dup_packet(AVPacket *pkt); @@ -3949,14 +4446,20 @@ int av_dup_packet(AVPacket *pkt); * Copy packet, including contents * * @return 0 on success, negative AVERROR on fail + * + * @deprecated Use av_packet_ref */ +attribute_deprecated int av_copy_packet(AVPacket *dst, const AVPacket *src); /** * Copy packet side data * * @return 0 on success, negative AVERROR on fail + * + * @deprecated Use av_packet_copy_props */ +attribute_deprecated int av_copy_packet_side_data(AVPacket *dst, const AVPacket *src); /** @@ -3980,6 +4483,22 @@ void av_free_packet(AVPacket *pkt); uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int size); +/** + * Wrap an existing array as a packet side data. + * + * @param pkt packet + * @param type side information type + * @param data the side data array. It must be allocated with the av_malloc() + * family of functions. The ownership of the data is transferred to + * pkt. + * @param size side information size + * @return a non-negative number on success, a negative AVERROR code on + * failure. On failure, the packet is unchanged and the data remains + * owned by the caller. + */ +int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + uint8_t *data, size_t size); + /** * Shrink the already allocated side data buffer * @@ -3999,12 +4518,16 @@ int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type, * @param size pointer for side information size to store (optional) * @return pointer to data if present or NULL otherwise */ -uint8_t* av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type, +uint8_t* av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, int *size); +#if FF_API_MERGE_SD_API +attribute_deprecated int av_packet_merge_side_data(AVPacket *pkt); +attribute_deprecated int av_packet_split_side_data(AVPacket *pkt); +#endif const char *av_packet_side_data_name(enum AVPacketSideDataType type); @@ -4083,10 +4606,36 @@ 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); +/** + * Ensure the data described by a given packet is reference counted. + * + * @note This function does not ensure that the reference will be writable. + * Use av_packet_make_writable instead for that purpose. + * + * @see av_packet_ref + * @see av_packet_make_writable + * + * @param pkt packet whose data should be made reference counted. + * + * @return 0 on success, a negative AVERROR on error. On failure, the + * packet is unchanged. + */ +int av_packet_make_refcounted(AVPacket *pkt); + +/** + * Create a writable reference for the data described by a given packet, + * avoiding data copy if possible. + * + * @param pkt Packet whose data should be made writable. + * + * @return 0 on success, a negative AVERROR on failure. On failure, the + * packet is unchanged. + */ +int av_packet_make_writable(AVPacket *pkt); + /** * Convert valid timing fields (timestamps / durations) in a packet from one * timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be @@ -4132,21 +4681,6 @@ AVCodec *avcodec_find_decoder_by_name(const char *name); */ int avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags); -#if FF_API_EMU_EDGE -/** - * Return the amount of padding in pixels which the get_buffer callback must - * provide around the edge of the image for codecs which do not have the - * CODEC_FLAG_EMU_EDGE flag. - * - * @return Required padding in pixels. - * - * @deprecated CODEC_FLAG_EMU_EDGE is deprecated, so this function is no longer - * needed - */ -attribute_deprecated -unsigned avcodec_get_edge_width(void); -#endif - /** * Modify width and height values so that they will result in a memory * buffer that is acceptable for the codec if you do not use any horizontal @@ -4238,7 +4772,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); @@ -4284,7 +4821,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); @@ -4299,13 +4839,13 @@ int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, * and reusing a get_buffer written for video codecs would probably perform badly * due to a potentially very different allocation pattern. * - * Some decoders (those marked with CODEC_CAP_DELAY) have a delay between input + * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input * and output. This means that for some packets they will not immediately * produce decoded output and need to be flushed at the end of decoding to get * all the decoded data. Flushing is done by calling this function with packets * with avpkt->data set to NULL and avpkt->size set to 0 until it stops * returning subtitles. It is safe to flush even those decoders that are not - * marked with CODEC_CAP_DELAY, then no subtitles will be returned. + * marked with AV_CODEC_CAP_DELAY, then no subtitles will be returned. * * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() * before packets may be fed to the decoder. @@ -4320,6 +4860,239 @@ 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 in the current state - user + * must read output with avcodec_receive_frame() (once + * all output is read, the packet should be resent, and + * the call will not fail with EAGAIN). + * 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 in this state - 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 + * AVERROR_INPUT_CHANGED: current decoded frame has changed parameters + * with respect to first decoded frame. Applicable + * when flag AV_CODEC_FLAG_DROPCHANGED is set. + * 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 in the current state - user + * must read output with avcodec_receive_packet() (once + * all output is read, the packet should be resent, and + * the call will not fail with EAGAIN). + * 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 in the current state - 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); + +/** + * Create and return a AVHWFramesContext with values adequate for hardware + * decoding. This is meant to get called from the get_format callback, and is + * a helper for preparing a AVHWFramesContext for AVCodecContext.hw_frames_ctx. + * This API is for decoding with certain hardware acceleration modes/APIs only. + * + * The returned AVHWFramesContext is not initialized. The caller must do this + * with av_hwframe_ctx_init(). + * + * Calling this function is not a requirement, but makes it simpler to avoid + * codec or hardware API specific details when manually allocating frames. + * + * Alternatively to this, an API user can set AVCodecContext.hw_device_ctx, + * which sets up AVCodecContext.hw_frames_ctx fully automatically, and makes + * it unnecessary to call this function or having to care about + * AVHWFramesContext initialization at all. + * + * There are a number of requirements for calling this function: + * + * - It must be called from get_format with the same avctx parameter that was + * passed to get_format. Calling it outside of get_format is not allowed, and + * can trigger undefined behavior. + * - The function is not always supported (see description of return values). + * Even if this function returns successfully, hwaccel initialization could + * fail later. (The degree to which implementations check whether the stream + * is actually supported varies. Some do this check only after the user's + * get_format callback returns.) + * - The hw_pix_fmt must be one of the choices suggested by get_format. If the + * user decides to use a AVHWFramesContext prepared with this API function, + * the user must return the same hw_pix_fmt from get_format. + * - The device_ref passed to this function must support the given hw_pix_fmt. + * - After calling this API function, it is the user's responsibility to + * initialize the AVHWFramesContext (returned by the out_frames_ref parameter), + * and to set AVCodecContext.hw_frames_ctx to it. If done, this must be done + * before returning from get_format (this is implied by the normal + * AVCodecContext.hw_frames_ctx API rules). + * - The AVHWFramesContext parameters may change every time time get_format is + * called. Also, AVCodecContext.hw_frames_ctx is reset before get_format. So + * you are inherently required to go through this process again on every + * get_format call. + * - It is perfectly possible to call this function without actually using + * the resulting AVHWFramesContext. One use-case might be trying to reuse a + * previously initialized AVHWFramesContext, and calling this API function + * only to test whether the required frame parameters have changed. + * - Fields that use dynamically allocated values of any kind must not be set + * by the user unless setting them is explicitly allowed by the documentation. + * If the user sets AVHWFramesContext.free and AVHWFramesContext.user_opaque, + * the new free callback must call the potentially set previous free callback. + * This API call may set any dynamically allocated fields, including the free + * callback. + * + * The function will set at least the following fields on AVHWFramesContext + * (potentially more, depending on hwaccel API): + * + * - All fields set by av_hwframe_ctx_alloc(). + * - Set the format field to hw_pix_fmt. + * - Set the sw_format field to the most suited and most versatile format. (An + * implication is that this will prefer generic formats over opaque formats + * with arbitrary restrictions, if possible.) + * - Set the width/height fields to the coded frame size, rounded up to the + * API-specific minimum alignment. + * - Only _if_ the hwaccel requires a pre-allocated pool: set the initial_pool_size + * field to the number of maximum reference surfaces possible with the codec, + * plus 1 surface for the user to work (meaning the user can safely reference + * at most 1 decoded surface at a time), plus additional buffering introduced + * by frame threading. If the hwaccel does not require pre-allocation, the + * field is left to 0, and the decoder will allocate new surfaces on demand + * during decoding. + * - Possibly AVHWFramesContext.hwctx fields, depending on the underlying + * hardware API. + * + * Essentially, out_frames_ref returns the same as av_hwframe_ctx_alloc(), but + * with basic frame parameters set. + * + * The function is stateless, and does not change the AVCodecContext or the + * device_ref AVHWDeviceContext. + * + * @param avctx The context which is currently calling get_format, and which + * implicitly contains all state needed for filling the returned + * AVHWFramesContext properly. + * @param device_ref A reference to the AVHWDeviceContext describing the device + * which will be used by the hardware decoder. + * @param hw_pix_fmt The hwaccel format you are going to return from get_format. + * @param out_frames_ref On success, set to a reference to an _uninitialized_ + * AVHWFramesContext, created from the given device_ref. + * Fields will be set to values required for decoding. + * Not changed if an error is returned. + * @return zero on success, a negative value on error. The following error codes + * have special semantics: + * AVERROR(ENOENT): the decoder does not support this functionality. Setup + * is always manual, or it is a decoder which does not + * support setting AVCodecContext.hw_frames_ctx at all, + * or it is a software format. + * AVERROR(EINVAL): it is known that hardware decoding is not supported for + * this configuration, or the device_ref is not supported + * for the hwaccel referenced by hw_pix_fmt. + */ +int avcodec_get_hw_frames_parameters(AVCodecContext *avctx, + AVBufferRef *device_ref, + enum AVPixelFormat hw_pix_fmt, + AVBufferRef **out_frames_ref); + + + /** * @defgroup lavc_parsing Frame parsing * @{ @@ -4514,8 +5287,21 @@ typedef struct AVCodecParser { struct AVCodecParser *next; } AVCodecParser; +/** + * Iterate over all registered codec parsers. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered codec parser or NULL when the iteration is + * finished + */ +const AVCodecParser *av_parser_iterate(void **opaque); + +attribute_deprecated AVCodecParser *av_parser_next(const AVCodecParser *c); +attribute_deprecated void av_register_codec_parser(AVCodecParser *parser); AVCodecParserContext *av_parser_init(int codec_id); @@ -4527,7 +5313,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. @@ -4627,7 +5416,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); @@ -4663,7 +5455,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); @@ -4675,103 +5470,6 @@ int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, * @} */ -#if FF_API_AVCODEC_RESAMPLE -/** - * @defgroup lavc_resample Audio resampling - * @ingroup libavc - * @deprecated use libswresample instead - * - * @{ - */ -struct ReSampleContext; -struct AVResampleContext; - -typedef struct ReSampleContext ReSampleContext; - -/** - * Initialize audio resampling context. - * - * @param output_channels number of output channels - * @param input_channels number of input channels - * @param output_rate output sample rate - * @param input_rate input sample rate - * @param sample_fmt_out requested output sample format - * @param sample_fmt_in input sample format - * @param filter_length length of each FIR filter in the filterbank relative to the cutoff frequency - * @param log2_phase_count log2 of the number of entries in the polyphase filterbank - * @param linear if 1 then the used FIR filter will be linearly interpolated - between the 2 closest, if 0 the closest will be used - * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate - * @return allocated ReSampleContext, NULL if error occurred - */ -attribute_deprecated -ReSampleContext *av_audio_resample_init(int output_channels, int input_channels, - int output_rate, int input_rate, - enum AVSampleFormat sample_fmt_out, - enum AVSampleFormat sample_fmt_in, - int filter_length, int log2_phase_count, - int linear, double cutoff); - -attribute_deprecated -int audio_resample(ReSampleContext *s, short *output, short *input, int nb_samples); - -/** - * Free resample context. - * - * @param s a non-NULL pointer to a resample context previously - * created with av_audio_resample_init() - */ -attribute_deprecated -void audio_resample_close(ReSampleContext *s); - - -/** - * Initialize an audio resampler. - * Note, if either rate is not an integer then simply scale both rates up so they are. - * @param filter_length length of each FIR filter in the filterbank relative to the cutoff freq - * @param log2_phase_count log2 of the number of entries in the polyphase filterbank - * @param linear If 1 then the used FIR filter will be linearly interpolated - between the 2 closest, if 0 the closest will be used - * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate - */ -attribute_deprecated -struct AVResampleContext *av_resample_init(int out_rate, int in_rate, int filter_length, int log2_phase_count, int linear, double cutoff); - -/** - * Resample an array of samples using a previously configured context. - * @param src an array of unconsumed samples - * @param consumed the number of samples of src which have been consumed are returned here - * @param src_size the number of unconsumed samples available - * @param dst_size the amount of space in samples available in dst - * @param update_ctx If this is 0 then the context will not be modified, that way several channels can be resampled with the same context. - * @return the number of samples written in dst or -1 if an error occurred - */ -attribute_deprecated -int av_resample(struct AVResampleContext *c, short *dst, short *src, int *consumed, int src_size, int dst_size, int update_ctx); - - -/** - * Compensate samplerate/timestamp drift. The compensation is done by changing - * the resampler parameters, so no audible clicks or similar distortions occur - * @param compensation_distance distance in output samples over which the compensation should be performed - * @param sample_delta number of output samples which should be output less - * - * example: av_resample_compensate(c, 10, 500) - * here instead of 510 samples only 500 samples would be output - * - * note, due to rounding the actual compensation might be slightly different, - * especially if the compensation_distance is large and the in_rate used during init is small - */ -attribute_deprecated -void av_resample_compensate(struct AVResampleContext *c, int sample_delta, int compensation_distance); -attribute_deprecated -void av_resample_close(struct AVResampleContext *c); - -/** - * @} - */ -#endif - #if FF_API_AVPICTURE /** * @addtogroup lavc_picture @@ -4853,22 +5551,14 @@ int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, * @{ */ +#if FF_API_GETCHROMA /** - * Utility function to access log2_chroma_w log2_chroma_h from - * the pixel format AVPixFmtDescriptor. - * - * This function asserts that pix_fmt is valid. See av_pix_fmt_get_chroma_sub_sample - * for one that returns a failure code and continues in case of invalid - * pix_fmts. - * - * @param[in] pix_fmt the pixel format - * @param[out] h_shift store log2_chroma_w - * @param[out] v_shift store log2_chroma_h - * - * @see av_pix_fmt_get_chroma_sub_sample + * @deprecated Use av_pix_fmt_get_chroma_sub_sample */ +attribute_deprecated void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift); +#endif /** * Return a value representing the fourCC code associated to the @@ -4911,15 +5601,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); @@ -4927,14 +5610,7 @@ enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const en * @} */ -#if FF_API_SET_DIMENSIONS -/** - * @deprecated this function is not supposed to be used from outside of lavc - */ -attribute_deprecated -void avcodec_set_dimensions(AVCodecContext *s, int width, int height); -#endif - +#if FF_API_TAG_STRING /** * Put a string representing the codec tag codec_tag in buf. * @@ -4943,8 +5619,12 @@ void avcodec_set_dimensions(AVCodecContext *s, int width, int height); * @param codec_tag codec tag to assign * @return the length of the string that would have been generated if * enough space had been available, excluding the trailing null + * + * @deprecated see av_fourcc_make_string() and av_fourcc2str(). */ +attribute_deprecated size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag); +#endif void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode); @@ -4957,6 +5637,19 @@ void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode); */ const char *av_get_profile_name(const AVCodec *codec, int profile); +/** + * Return a name for the specified profile, if available. + * + * @param codec_id the ID of the codec to which the requested profile belongs + * @param profile the profile value for which a name is requested + * @return A name for the profile if found, NULL otherwise. + * + * @note unlike av_get_profile_name(), which searches a list of profiles + * supported by a specific decoder or encoder implementation, this + * function searches the list of profiles from the AVCodecDescriptor + */ +const char *avcodec_profile_name(enum AVCodecID codec_id, int profile); + int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size); int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count); //FIXME func typedef @@ -5035,10 +5728,16 @@ 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; + const struct AVBitStreamFilter *filter; AVCodecParserContext *parser; struct AVBitStreamFilterContext *next; /** @@ -5047,92 +5746,332 @@ 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. This field is allocated in + * av_bsf_alloc(), it needs to be filled by the caller before + * av_bsf_init(). + */ + AVCodecParameters *par_in; + + /** + * Parameters of the output stream. This field is allocated in + * av_bsf_alloc(), it is 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); + void (*flush)(AVBSFContext *ctx); } AVBitStreamFilter; +#if FF_API_OLD_BSF /** - * Register a bitstream filter. - * - * The filter will be accessible to the application code through - * av_bitstream_filter_next() or can be directly initialized with - * av_bitstream_filter_init(). - * - * @see avcodec_register_all() + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use the new bitstream filtering API (using AVBSFContext). */ +attribute_deprecated void av_register_bitstream_filter(AVBitStreamFilter *bsf); - /** - * Create and initialize a bitstream filter context given a bitstream - * filter name. - * - * The returned context must be freed with av_bitstream_filter_close(). - * - * @param name the name of the bitstream filter - * @return a bitstream filter context if a matching filter was found - * and successfully initialized, NULL otherwise + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_get_by_name(), av_bsf_alloc(), and av_bsf_init() + * from the new bitstream filtering API (using AVBSFContext). */ +attribute_deprecated AVBitStreamFilterContext *av_bitstream_filter_init(const char *name); - /** - * Filter bitstream. - * - * This function filters the buffer buf with size buf_size, and places the - * filtered buffer in the buffer pointed to by poutbuf. - * - * The output buffer must be freed by the caller. - * - * @param bsfc bitstream filter context created by av_bitstream_filter_init() - * @param avctx AVCodecContext accessed by the filter, may be NULL. - * If specified, this must point to the encoder context of the - * output stream the packet is sent to. - * @param args arguments which specify the filter configuration, may be NULL - * @param poutbuf pointer which is updated to point to the filtered buffer - * @param poutbuf_size pointer which is updated to the filtered buffer size in bytes - * @param buf buffer containing the data to filter - * @param buf_size size in bytes of buf - * @param keyframe set to non-zero if the buffer to filter corresponds to a key-frame packet data - * @return >= 0 in case of success, or a negative error code in case of failure - * - * If the return value is positive, an output buffer is allocated and - * is available in *poutbuf, and is distinct from the input buffer. - * - * 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). + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_send_packet() and av_bsf_receive_packet() from the + * new bitstream filtering API (using AVBSFContext). */ +attribute_deprecated int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size, int keyframe); - /** - * Release bitstream filter context. - * - * @param bsf the bitstream filter context created with - * av_bitstream_filter_init(), can be NULL + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_free() from the new bitstream filtering API (using + * AVBSFContext). */ +attribute_deprecated void av_bitstream_filter_close(AVBitStreamFilterContext *bsf); +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_iterate() from the new bitstream filtering API (using + * AVBSFContext). + */ +attribute_deprecated +const AVBitStreamFilter *av_bitstream_filter_next(const AVBitStreamFilter *f); +#endif /** - * If f is NULL, return the first registered bitstream filter, - * if f is non-NULL, return the next registered bitstream filter - * after f, or NULL if f is the last one. - * - * This function can be used to iterate over all registered bitstream - * filters. + * @return a bitstream filter with the specified name or NULL if no such + * bitstream filter exists. */ -AVBitStreamFilter *av_bitstream_filter_next(const AVBitStreamFilter *f); +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_iterate(void **opaque); +#if FF_API_NEXT +attribute_deprecated +const AVBitStreamFilter *av_bsf_next(void **opaque); +#endif + +/** + * 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. 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); + +/** + * Reset the internal bitstream filter state / flush internal buffers. + */ +void av_bsf_flush(AVBSFContext *ctx); + +/** + * 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 */ @@ -5160,51 +6099,32 @@ void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size); */ unsigned int av_xiphlacing(unsigned char *s, unsigned int v); -#if FF_API_MISSING_SAMPLE -/** - * Log a generic warning message about a missing feature. This function is - * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.) - * only, and would normally not be used by applications. - * @param[in] avc a pointer to an arbitrary struct of which the first field is - * 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 - * message which tells the user how to report samples to the development - * mailing list. - * @deprecated Use avpriv_report_missing_feature() instead. - */ -attribute_deprecated -void av_log_missing_feature(void *avc, const char *feature, int want_sample); - -/** - * Log a generic warning message asking for a sample. This function is - * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.) - * only, and would normally not be used by applications. - * @param[in] avc a pointer to an arbitrary struct of which the first field is - * a pointer to an AVClass struct - * @param[in] msg string containing an optional message, or NULL if no message - * @deprecated Use avpriv_request_sample() instead. - */ -attribute_deprecated -void av_log_ask_for_sample(void *avc, const char *msg, ...) av_printf_format(2, 3); -#endif /* FF_API_MISSING_SAMPLE */ - +#if FF_API_USER_VISIBLE_AVHWACCEL /** * Register the hardware accelerator hwaccel. + * + * @deprecated This function doesn't do anything. */ +attribute_deprecated void av_register_hwaccel(AVHWAccel *hwaccel); /** * If hwaccel is NULL, returns the first registered hardware accelerator, * if hwaccel is non-NULL, returns the next registered hardware accelerator * after hwaccel, or NULL if hwaccel is the last one. + * + * @deprecated AVHWaccel structures contain no user-serviceable parts, so + * this function should not be used. */ +attribute_deprecated AVHWAccel *av_hwaccel_next(const AVHWAccel *hwaccel); +#endif - +#if FF_API_LOCKMGR /** * Lock operation used by lockmgr + * + * @deprecated Deprecated together with av_lockmgr_register(). */ enum AVLockOp { AV_LOCK_CREATE, ///< Create a mutex @@ -5235,8 +6155,13 @@ enum AVLockOp { * mechanism (i.e. do not use a single static object to * implement your lock manager). If cb is set to NULL the * lockmgr will be unregistered. + * + * @deprecated This function does nothing, and always returns 0. Be sure to + * build with thread support to get basic thread safety. */ +attribute_deprecated int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)); +#endif /** * Get the type of the given codec. @@ -5285,6 +6210,17 @@ const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev); */ const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name); +/** + * Allocate a CPB properties structure and initialize its fields to default + * values. + * + * @param size if non-NULL, the size of the allocated struct will be written + * here. This is useful for embedding it in side data. + * + * @return the newly allocated struct or NULL on failure + */ +AVCPBProperties *av_cpb_properties_alloc(size_t *size); + /** * @} */ diff --git a/neo/libs/ffmpeg-win64/include/libavcodec/dirac.h b/neo/libs/ffmpeg-win64/include/libavcodec/dirac.h new file mode 100644 index 00000000..e6d9d346 --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavcodec/dirac.h @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2007 Marco Gerards + * Copyright (C) 2009 David Conrad + * Copyright (C) 2011 Jordi Ortiz + * + * 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_DIRAC_H +#define AVCODEC_DIRAC_H + +/** + * @file + * Interface to Dirac Decoder/Encoder + * @author Marco Gerards + * @author David Conrad + * @author Jordi Ortiz + */ + +#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: + * + * Dirac Specification -> + * 9.6.1 Table 9.1 + * + * VC-2 Specification -> + * 10.4.1 Table 10.1 + */ + +enum DiracParseCodes { + DIRAC_PCODE_SEQ_HEADER = 0x00, + DIRAC_PCODE_END_SEQ = 0x10, + DIRAC_PCODE_AUX = 0x20, + DIRAC_PCODE_PAD = 0x30, + DIRAC_PCODE_PICTURE_CODED = 0x08, + 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, +}; + +typedef struct DiracVersionInfo { + int major; + int minor; +} DiracVersionInfo; + +typedef struct AVDiracSeqHeader { + unsigned width; + unsigned height; + uint8_t chroma_format; ///< 0: 444 1: 422 2: 420 + + uint8_t interlaced; + uint8_t top_field_first; + + uint8_t frame_rate_index; ///< index into dirac_frame_rate[] + uint8_t aspect_ratio_index; ///< index into dirac_aspect_ratio[] + + uint16_t clean_width; + uint16_t clean_height; + uint16_t clean_left_offset; + uint16_t clean_right_offset; + + uint8_t pixel_range_index; ///< index into dirac_pixel_range_presets[] + uint8_t color_spec_index; ///< index into dirac_color_spec_presets[] + + int profile; + int level; + + AVRational framerate; + AVRational sample_aspect_ratio; + + enum AVPixelFormat pix_fmt; + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace colorspace; + + DiracVersionInfo version; + int bit_depth; +} AVDiracSeqHeader; + +/** + * Parse a Dirac sequence header. + * + * @param dsh this function will allocate and fill an AVDiracSeqHeader struct + * and write it into this pointer. The caller must free it with + * av_free(). + * @param buf the data buffer + * @param buf_size the size of the data buffer in bytes + * @param log_ctx if non-NULL, this function will log errors here + * @return 0 on success, a negative AVERROR code on failure + */ +int av_dirac_parse_sequence_header(AVDiracSeqHeader **dsh, + const uint8_t *buf, size_t buf_size, + void *log_ctx); + +#endif /* AVCODEC_DIRAC_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavcodec/dxva2.h b/neo/libs/ffmpeg-win64/include/libavcodec/dxva2.h index 9e3ab86a..22c93992 100644 --- a/neo/libs/ffmpeg-win64/include/libavcodec/dxva2.h +++ b/neo/libs/ffmpeg-win64/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/neo/libs/ffmpeg-win64/include/libavcodec/jni.h b/neo/libs/ffmpeg-win64/include/libavcodec/jni.h new file mode 100644 index 00000000..dd99e926 --- /dev/null +++ b/neo/libs/ffmpeg-win64/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/neo/libs/ffmpeg-win64/include/libavcodec/mediacodec.h b/neo/libs/ffmpeg-win64/include/libavcodec/mediacodec.h new file mode 100644 index 00000000..4c8545df --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavcodec/mediacodec.h @@ -0,0 +1,101 @@ +/* + * 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); + +/** + * Release a MediaCodec buffer and render it at the given time to the surface + * that is associated with the decoder. The timestamp must be within one second + * of the current java/lang/System#nanoTime() (which is implemented using + * CLOCK_MONOTONIC on Android). See the Android MediaCodec documentation + * of android/media/MediaCodec#releaseOutputBuffer(int,long) for more details. + * + * @param buffer the buffer to render + * @param time timestamp in nanoseconds of when to render the buffer + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_render_buffer_at_time(AVMediaCodecBuffer *buffer, int64_t time); + +#endif /* AVCODEC_MEDIACODEC_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavcodec/vaapi.h b/neo/libs/ffmpeg-win64/include/libavcodec/vaapi.h index 7a29f6f8..2cf7da58 100644 --- a/neo/libs/ffmpeg-win64/include/libavcodec/vaapi.h +++ b/neo/libs/ffmpeg-win64/include/libavcodec/vaapi.h @@ -34,6 +34,8 @@ #include "libavutil/attributes.h" #include "version.h" +#if FF_API_STRUCT_VAAPI_CONTEXT + /** * @defgroup lavc_codec_hwaccel_vaapi VA API Decoding * @ingroup lavc_codec_hwaccel @@ -48,8 +50,10 @@ * during initialization or through each AVCodecContext.get_buffer() * function call. In any case, they must be valid prior to calling * decoding functions. + * + * Deprecated: use AVCodecContext.hw_frames_ctx instead. */ -struct vaapi_context { +struct attribute_deprecated vaapi_context { /** * Window system dependent data * @@ -73,117 +77,10 @@ struct vaapi_context { * - decoding: Set by user */ uint32_t context_id; - -#if FF_API_VAAPI_CONTEXT - /** - * VAPictureParameterBuffer ID - * - * - encoding: unused - * - decoding: Set by libavcodec - */ - attribute_deprecated - uint32_t pic_param_buf_id; - - /** - * VAIQMatrixBuffer ID - * - * - encoding: unused - * - decoding: Set by libavcodec - */ - attribute_deprecated - uint32_t iq_matrix_buf_id; - - /** - * VABitPlaneBuffer ID (for VC-1 decoding) - * - * - encoding: unused - * - decoding: Set by libavcodec - */ - attribute_deprecated - uint32_t bitplane_buf_id; - - /** - * Slice parameter/data buffer IDs - * - * - encoding: unused - * - decoding: Set by libavcodec - */ - attribute_deprecated - uint32_t *slice_buf_ids; - - /** - * Number of effective slice buffer IDs to send to the HW - * - * - encoding: unused - * - decoding: Set by libavcodec - */ - attribute_deprecated - unsigned int n_slice_buf_ids; - - /** - * Size of pre-allocated slice_buf_ids - * - * - encoding: unused - * - decoding: Set by libavcodec - */ - attribute_deprecated - unsigned int slice_buf_ids_alloc; - - /** - * Pointer to VASliceParameterBuffers - * - * - encoding: unused - * - decoding: Set by libavcodec - */ - attribute_deprecated - void *slice_params; - - /** - * Size of a VASliceParameterBuffer element - * - * - encoding: unused - * - decoding: Set by libavcodec - */ - attribute_deprecated - unsigned int slice_param_size; - - /** - * Size of pre-allocated slice_params - * - * - encoding: unused - * - decoding: Set by libavcodec - */ - attribute_deprecated - unsigned int slice_params_alloc; - - /** - * Number of slices currently filled in - * - * - encoding: unused - * - decoding: Set by libavcodec - */ - attribute_deprecated - unsigned int slice_count; - - /** - * Pointer to slice data buffer base - * - encoding: unused - * - decoding: Set by libavcodec - */ - attribute_deprecated - const uint8_t *slice_data; - - /** - * Current size of slice data - * - * - encoding: unused - * - decoding: Set by libavcodec - */ - attribute_deprecated - uint32_t slice_data_size; -#endif }; /* @} */ +#endif /* FF_API_STRUCT_VAAPI_CONTEXT */ + #endif /* AVCODEC_VAAPI_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavcodec/vda.h b/neo/libs/ffmpeg-win64/include/libavcodec/vda.h deleted file mode 100644 index bde14e31..00000000 --- a/neo/libs/ffmpeg-win64/include/libavcodec/vda.h +++ /dev/null @@ -1,230 +0,0 @@ -/* - * VDA HW acceleration - * - * copyright (c) 2011 Sebastien Zwickert - * - * 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_VDA_H -#define AVCODEC_VDA_H - -/** - * @file - * @ingroup lavc_codec_hwaccel_vda - * Public libavcodec VDA header. - */ - -#include "libavcodec/avcodec.h" - -#include - -// emmintrin.h is unable to compile with -std=c99 -Werror=missing-prototypes -// http://openradar.appspot.com/8026390 -#undef __GNUC_STDC_INLINE__ - -#define Picture QuickdrawPicture -#include -#undef Picture - -#include "libavcodec/version.h" - -// extra flags not defined in VDADecoder.h -enum { - kVDADecodeInfo_Asynchronous = 1UL << 0, - kVDADecodeInfo_FrameDropped = 1UL << 1 -}; - -/** - * @defgroup lavc_codec_hwaccel_vda VDA - * @ingroup lavc_codec_hwaccel - * - * @{ - */ - -/** - * This structure is used to provide the necessary configurations and data - * to the VDA FFmpeg HWAccel implementation. - * - * The application must make it available as AVCodecContext.hwaccel_context. - */ -struct vda_context { - /** - * VDA decoder object. - * - * - encoding: unused - * - decoding: Set/Unset by libavcodec. - */ - VDADecoder decoder; - - /** - * The Core Video pixel buffer that contains the current image data. - * - * encoding: unused - * decoding: Set by libavcodec. Unset by user. - */ - CVPixelBufferRef cv_buffer; - - /** - * Use the hardware decoder in synchronous mode. - * - * encoding: unused - * decoding: Set by user. - */ - int use_sync_decoding; - - /** - * The frame width. - * - * - encoding: unused - * - decoding: Set/Unset by user. - */ - int width; - - /** - * The frame height. - * - * - encoding: unused - * - decoding: Set/Unset by user. - */ - int height; - - /** - * The frame format. - * - * - encoding: unused - * - decoding: Set/Unset by user. - */ - int format; - - /** - * The pixel format for output image buffers. - * - * - encoding: unused - * - decoding: Set/Unset by user. - */ - OSType cv_pix_fmt_type; - - /** - * unused - */ - uint8_t *priv_bitstream; - - /** - * unused - */ - int priv_bitstream_size; - - /** - * unused - */ - int priv_allocated_size; - - /** - * Use av_buffer to manage buffer. - * When the flag is set, the CVPixelBuffers returned by the decoder will - * be released automatically, so you have to retain them if necessary. - * Not setting this flag may cause memory leak. - * - * encoding: unused - * decoding: Set by user. - */ - int use_ref_buffer; -}; - -/** Create the video decoder. */ -int ff_vda_create_decoder(struct vda_context *vda_ctx, - uint8_t *extradata, - int extradata_size); - -/** Destroy the video decoder. */ -int ff_vda_destroy_decoder(struct vda_context *vda_ctx); - -/** - * This struct holds all the information that needs to be passed - * between the caller and libavcodec for initializing VDA decoding. - * Its size is not a part of the public ABI, it must be allocated with - * av_vda_alloc_context() and freed with av_free(). - */ -typedef struct AVVDAContext { - /** - * VDA decoder object. Created and freed by the caller. - */ - VDADecoder decoder; - - /** - * The output callback that must be passed to VDADecoderCreate. - * Set by av_vda_alloc_context(). - */ - VDADecoderOutputCallback output_callback; - - /** - * CVPixelBuffer Format Type that VDA will use for decoded frames; set by - * the caller. - */ - OSType cv_pix_fmt_type; -} AVVDAContext; - -/** - * Allocate and initialize a VDA context. - * - * This function should be called from the get_format() callback when the caller - * selects the AV_PIX_FMT_VDA format. The caller must then create the decoder - * object (using the output callback provided by libavcodec) that will be used - * for VDA-accelerated decoding. - * - * When decoding with VDA is finished, the caller must destroy the decoder - * object and free the VDA context using av_free(). - * - * @return the newly allocated context or NULL on failure - */ -AVVDAContext *av_vda_alloc_context(void); - -/** - * This is a convenience function that creates and sets up the VDA context using - * an internal implementation. - * - * @param avctx the corresponding codec context - * - * @return >= 0 on success, a negative AVERROR code on failure - */ -int av_vda_default_init(AVCodecContext *avctx); - -/** - * This is a convenience function that creates and sets up the VDA context using - * an internal implementation. - * - * @param avctx the corresponding codec context - * @param vdactx the VDA context to use - * - * @return >= 0 on success, a negative AVERROR code on failure - */ -int av_vda_default_init2(AVCodecContext *avctx, AVVDAContext *vdactx); - -/** - * This function must be called to free the VDA context initialized with - * av_vda_default_init(). - * - * @param avctx the corresponding codec context - */ -void av_vda_default_free(AVCodecContext *avctx); - -/** - * @} - */ - -#endif /* AVCODEC_VDA_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavcodec/vdpau.h b/neo/libs/ffmpeg-win64/include/libavcodec/vdpau.h index e85e4d9e..4d999433 100644 --- a/neo/libs/ffmpeg-win64/include/libavcodec/vdpau.h +++ b/neo/libs/ffmpeg-win64/include/libavcodec/vdpau.h @@ -50,22 +50,13 @@ */ #include -#include + #include "libavutil/avconfig.h" #include "libavutil/attributes.h" #include "avcodec.h" #include "version.h" -#if FF_API_BUFS_VDPAU -union AVVDPAUPictureInfo { - VdpPictureInfoH264 h264; - VdpPictureInfoMPEG1Or2 mpeg; - VdpPictureInfoVC1 vc1; - VdpPictureInfoMPEG4Part2 mpeg4; -}; -#endif - struct AVCodecContext; struct AVFrame; @@ -102,40 +93,6 @@ typedef struct AVVDPAUContext { */ VdpDecoderRender *render; -#if FF_API_BUFS_VDPAU - /** - * VDPAU picture information - * - * Set by libavcodec. - */ - attribute_deprecated - union AVVDPAUPictureInfo info; - - /** - * Allocated size of the bitstream_buffers table. - * - * Set by libavcodec. - */ - attribute_deprecated - int bitstream_buffers_allocated; - - /** - * Useful bitstream buffers in the bitstream buffers table. - * - * Set by libavcodec. - */ - attribute_deprecated - int bitstream_buffers_used; - - /** - * Table of bitstream buffers. - * The user is responsible for freeing this buffer using av_freep(). - * - * Set by libavcodec. - */ - attribute_deprecated - VdpBitstreamBuffer *bitstream_buffers; -#endif AVVDPAU_Render2 render2; } AVVDPAUContext; @@ -214,40 +171,6 @@ attribute_deprecated int av_vdpau_get_profile(AVCodecContext *avctx, VdpDecoderProfile *profile); #endif -#if FF_API_CAP_VDPAU -/** @brief The videoSurface is used for rendering. */ -#define FF_VDPAU_STATE_USED_FOR_RENDER 1 - -/** - * @brief The videoSurface is needed for reference/prediction. - * The codec manipulates this. - */ -#define FF_VDPAU_STATE_USED_FOR_REFERENCE 2 - -/** - * @brief This structure is used as a callback between the FFmpeg - * decoder (vd_) and presentation (vo_) module. - * This is used for defining a video frame containing surface, - * picture parameter, bitstream information etc which are passed - * between the FFmpeg decoder and its clients. - */ -struct vdpau_render_state { - VdpVideoSurface surface; ///< Used as rendered surface, never changed. - - int state; ///< Holds FF_VDPAU_STATE_* values. - - /** picture parameter information for all supported codecs */ - union AVVDPAUPictureInfo info; - - /** Describe size/location of the compressed video data. - Set to 0 when freeing bitstream_buffers. */ - int bitstream_buffers_allocated; - int bitstream_buffers_used; - /** The user is responsible for freeing this buffer using av_freep(). */ - VdpBitstreamBuffer *bitstream_buffers; -}; -#endif - /* @}*/ #endif /* AVCODEC_VDPAU_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavcodec/version.h b/neo/libs/ffmpeg-win64/include/libavcodec/version.h index cc4e2367..3331d473 100644 --- a/neo/libs/ffmpeg-win64/include/libavcodec/version.h +++ b/neo/libs/ffmpeg-win64/include/libavcodec/version.h @@ -1,5 +1,4 @@ /* - * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or @@ -28,8 +27,8 @@ #include "libavutil/version.h" -#define LIBAVCODEC_VERSION_MAJOR 57 -#define LIBAVCODEC_VERSION_MINOR 14 +#define LIBAVCODEC_VERSION_MAJOR 58 +#define LIBAVCODEC_VERSION_MINOR 54 #define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ @@ -52,133 +51,18 @@ * at once through the bump. This improves the git bisect-ability of the change. */ -#ifndef FF_API_VIMA_DECODER -#define FF_API_VIMA_DECODER (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_AUDIO_CONVERT -#define FF_API_AUDIO_CONVERT (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_AVCODEC_RESAMPLE -#define FF_API_AVCODEC_RESAMPLE FF_API_AUDIO_CONVERT -#endif -#ifndef FF_API_MISSING_SAMPLE -#define FF_API_MISSING_SAMPLE (LIBAVCODEC_VERSION_MAJOR < 58) -#endif #ifndef FF_API_LOWRES -#define FF_API_LOWRES (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_CAP_VDPAU -#define FF_API_CAP_VDPAU (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_BUFS_VDPAU -#define FF_API_BUFS_VDPAU (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_VOXWARE -#define FF_API_VOXWARE (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_SET_DIMENSIONS -#define FF_API_SET_DIMENSIONS (LIBAVCODEC_VERSION_MAJOR < 58) +#define FF_API_LOWRES (LIBAVCODEC_VERSION_MAJOR < 59) #endif #ifndef FF_API_DEBUG_MV #define FF_API_DEBUG_MV (LIBAVCODEC_VERSION_MAJOR < 58) #endif -#ifndef FF_API_AC_VLC -#define FF_API_AC_VLC (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_OLD_MSMPEG4 -#define FF_API_OLD_MSMPEG4 (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_ASPECT_EXTENDED -#define FF_API_ASPECT_EXTENDED (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_ARCH_ALPHA -#define FF_API_ARCH_ALPHA (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_XVMC -#define FF_API_XVMC (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_ERROR_RATE -#define FF_API_ERROR_RATE (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_QSCALE_TYPE -#define FF_API_QSCALE_TYPE (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_MB_TYPE -#define FF_API_MB_TYPE (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_MAX_BFRAMES -#define FF_API_MAX_BFRAMES (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_NEG_LINESIZES -#define FF_API_NEG_LINESIZES (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_EMU_EDGE -#define FF_API_EMU_EDGE (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_ARCH_SH4 -#define FF_API_ARCH_SH4 (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_ARCH_SPARC -#define FF_API_ARCH_SPARC (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_UNUSED_MEMBERS -#define FF_API_UNUSED_MEMBERS (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_IDCT_XVIDMMX -#define FF_API_IDCT_XVIDMMX (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_INPUT_PRESERVED -#define FF_API_INPUT_PRESERVED (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_NORMALIZE_AQP -#define FF_API_NORMALIZE_AQP (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_GMC -#define FF_API_GMC (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_MV0 -#define FF_API_MV0 (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_CODEC_NAME -#define FF_API_CODEC_NAME (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_AFD -#define FF_API_AFD (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_VISMV -/* XXX: don't forget to drop the -vismv documentation */ -#define FF_API_VISMV (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_AUDIOENC_DELAY -#define FF_API_AUDIOENC_DELAY (LIBAVCODEC_VERSION_MAJOR < 58) -#endif -#ifndef FF_API_VAAPI_CONTEXT -#define FF_API_VAAPI_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 58) -#endif #ifndef FF_API_AVCTX_TIMEBASE #define FF_API_AVCTX_TIMEBASE (LIBAVCODEC_VERSION_MAJOR < 59) #endif -#ifndef FF_API_MPV_OPT -#define FF_API_MPV_OPT (LIBAVCODEC_VERSION_MAJOR < 59) -#endif -#ifndef FF_API_STREAM_CODEC_TAG -#define FF_API_STREAM_CODEC_TAG (LIBAVCODEC_VERSION_MAJOR < 59) -#endif -#ifndef FF_API_QUANT_BIAS -#define FF_API_QUANT_BIAS (LIBAVCODEC_VERSION_MAJOR < 59) -#endif -#ifndef FF_API_RC_STRATEGY -#define FF_API_RC_STRATEGY (LIBAVCODEC_VERSION_MAJOR < 59) -#endif #ifndef FF_API_CODED_FRAME #define FF_API_CODED_FRAME (LIBAVCODEC_VERSION_MAJOR < 59) #endif -#ifndef FF_API_MOTION_EST -#define FF_API_MOTION_EST (LIBAVCODEC_VERSION_MAJOR < 59) -#endif -#ifndef FF_API_WITHOUT_PREFIX -#define FF_API_WITHOUT_PREFIX (LIBAVCODEC_VERSION_MAJOR < 59) -#endif #ifndef FF_API_SIDEDATA_ONLY_PKT #define FF_API_SIDEDATA_ONLY_PKT (LIBAVCODEC_VERSION_MAJOR < 59) #endif @@ -194,5 +78,63 @@ #ifndef FF_API_AVPACKET_OLD_API #define FF_API_AVPACKET_OLD_API (LIBAVCODEC_VERSION_MAJOR < 59) #endif +#ifndef FF_API_RTP_CALLBACK +#define FF_API_RTP_CALLBACK (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_VBV_DELAY +#define FF_API_VBV_DELAY (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CODER_TYPE +#define FF_API_CODER_TYPE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#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 +#ifndef FF_API_STRUCT_VAAPI_CONTEXT +#define FF_API_STRUCT_VAAPI_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_MERGE_SD_API +#define FF_API_MERGE_SD_API (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_TAG_STRING +#define FF_API_TAG_STRING (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_GETCHROMA +#define FF_API_GETCHROMA (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CODEC_GET_SET +#define FF_API_CODEC_GET_SET (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_USER_VISIBLE_AVHWACCEL +#define FF_API_USER_VISIBLE_AVHWACCEL (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LOCKMGR +#define FF_API_LOCKMGR (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_NEXT +#define FF_API_NEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_UNSANITIZED_BITRATES +#define FF_API_UNSANITIZED_BITRATES (LIBAVCODEC_VERSION_MAJOR < 59) +#endif + #endif /* AVCODEC_VERSION_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavcodec/videotoolbox.h b/neo/libs/ffmpeg-win64/include/libavcodec/videotoolbox.h index a48638e2..af2db0d5 100644 --- a/neo/libs/ffmpeg-win64/include/libavcodec/videotoolbox.h +++ b/neo/libs/ffmpeg-win64/include/libavcodec/videotoolbox.h @@ -58,7 +58,8 @@ typedef struct AVVideotoolboxContext { /** * CVPixelBuffer Format Type that Videotoolbox will use for decoded frames. - * set by the caller. + * set by the caller. If this is set to 0, then no specific format is + * requested from the decoder, and its native format is output. */ OSType cv_pix_fmt_type; diff --git a/neo/libs/ffmpeg-win64/include/libavcodec/vorbis_parser.h b/neo/libs/ffmpeg-win64/include/libavcodec/vorbis_parser.h index 06e48bd3..789932ac 100644 --- a/neo/libs/ffmpeg-win64/include/libavcodec/vorbis_parser.h +++ b/neo/libs/ffmpeg-win64/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 @@ -33,9 +32,6 @@ typedef struct AVVorbisParseContext AVVorbisParseContext; /** * Allocate and initialize the Vorbis parser using headers in the extradata. - * - * @param avctx codec context - * @param s Vorbis parser context */ AVVorbisParseContext *av_vorbis_parse_init(const uint8_t *extradata, int extradata_size); @@ -75,4 +71,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/neo/libs/ffmpeg-win64/include/libavdevice/avdevice.h b/neo/libs/ffmpeg-win64/include/libavdevice/avdevice.h index 6b0446cd..ee946248 100644 --- a/neo/libs/ffmpeg-win64/include/libavdevice/avdevice.h +++ b/neo/libs/ffmpeg-win64/include/libavdevice/avdevice.h @@ -28,19 +28,21 @@ */ /** - * @defgroup lavd Special devices muxing/demuxing library - * @{ + * @defgroup lavd libavdevice + * Special devices muxing/demuxing library. + * * Libavdevice is a complementary library to @ref libavf "libavformat". It * provides various "special" platform-specific muxers and demuxers, e.g. for * grabbing devices, audio capture and playback etc. As a consequence, the * (de)muxers in libavdevice are of the AVFMT_NOFILE type (they use their own * I/O functions). The filename passed to avformat_open_input() often does not * refer to an actually existing file, but has some special device-specific - * meaning - e.g. for x11grab it is the display name. + * meaning - e.g. for xcbgrab it is the display name. * * To use libavdevice, simply call avdevice_register_all() to register all * compiled muxers and demuxers. They all use standard libavformat API. - * @} + * + * @{ */ #include "libavutil/log.h" @@ -65,7 +67,6 @@ const char *avdevice_license(void); /** * Initialize libavdevice and register all the input and output devices. - * @warning This function is not thread safe. */ void avdevice_register_all(void); @@ -506,4 +507,8 @@ int avdevice_list_input_sources(struct AVInputFormat *device, const char *device int avdevice_list_output_sinks(struct AVOutputFormat *device, const char *device_name, AVDictionary *device_options, AVDeviceInfoList **device_list); +/** + * @} + */ + #endif /* AVDEVICE_AVDEVICE_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavdevice/version.h b/neo/libs/ffmpeg-win64/include/libavdevice/version.h index 45c9e8d4..840cefad 100644 --- a/neo/libs/ffmpeg-win64/include/libavdevice/version.h +++ b/neo/libs/ffmpeg-win64/include/libavdevice/version.h @@ -27,8 +27,8 @@ #include "libavutil/version.h" -#define LIBAVDEVICE_VERSION_MAJOR 57 -#define LIBAVDEVICE_VERSION_MINOR 0 +#define LIBAVDEVICE_VERSION_MAJOR 58 +#define LIBAVDEVICE_VERSION_MINOR 8 #define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ diff --git a/neo/libs/ffmpeg-win64/include/libavfilter/avfilter.h b/neo/libs/ffmpeg-win64/include/libavfilter/avfilter.h index 5d4cd6ce..9d70e711 100644 --- a/neo/libs/ffmpeg-win64/include/libavfilter/avfilter.h +++ b/neo/libs/ffmpeg-win64/include/libavfilter/avfilter.h @@ -29,7 +29,9 @@ */ /** - * @defgroup lavfi Libavfilter - graph-based frame editing library + * @defgroup lavfi libavfilter + * Graph-based frame editing library. + * * @{ */ @@ -37,6 +39,7 @@ #include "libavutil/attributes.h" #include "libavutil/avutil.h" +#include "libavutil/buffer.h" #include "libavutil/dict.h" #include "libavutil/frame.h" #include "libavutil/log.h" @@ -191,6 +194,21 @@ typedef struct AVFilter { ***************************************************************** */ + /** + * Filter pre-initialization function + * + * This callback will be called immediately after the filter context is + * allocated, to allow allocating and initing sub-objects. + * + * If this callback is not NULL, the uninit callback will be called on + * allocation failure. + * + * @return 0 on success, + * AVERROR code on failure (but the code will be + * dropped and treated as ENOMEM by the calling code) + */ + int (*preinit)(AVFilterContext *ctx); + /** * Filter initialization function. * @@ -265,6 +283,8 @@ typedef struct AVFilter { int priv_size; ///< size of private data to allocate for the filter + int flags_internal; ///< Additional flags for avfilter internal use only. + /** * Used by the filter registration system. Must not be touched by any other * code. @@ -291,6 +311,20 @@ typedef struct AVFilter { * used for providing binary data. */ int (*init_opaque)(AVFilterContext *ctx, void *opaque); + + /** + * Filter activation function. + * + * Called when any processing is needed from the filter, instead of any + * filter_frame and request_frame on pads. + * + * The function must examine inlinks and outlinks and perform a single + * step of processing. If there is nothing to do, the function must do + * nothing and not return an error. If more steps are or may be + * possible, it must use ff_filter_set_ready() to schedule another + * activation. + */ + int (*activate)(AVFilterContext *ctx); } AVFilter; /** @@ -349,6 +383,45 @@ struct AVFilterContext { void *enable; ///< parsed expression (AVExpr*) double *var_values; ///< variable values for the enable expression int is_disabled; ///< the enabled state from the last expression evaluation + + /** + * For filters which will create hardware frames, sets the device the + * filter should create them in. All other filters will ignore this field: + * in particular, a filter which consumes or processes hardware frames will + * instead use the hw_frames_ctx field in AVFilterLink to carry the + * hardware context information. + */ + AVBufferRef *hw_device_ctx; + + /** + * Max number of threads allowed in this filter instance. + * If <= 0, its value is ignored. + * Overrides global number of threads set per filter graph. + */ + int nb_threads; + + /** + * Ready status of the filter. + * A non-0 value means that the filter needs activating; + * a higher value suggests a more urgent activation. + */ + unsigned ready; + + /** + * Sets the number of extra hardware frames which the filter will + * allocate on its output links for use in following filters or by + * the caller. + * + * Some hardware filters require all frames that they will use for + * output to be defined in advance before filtering starts. For such + * filters, any hardware frame pools used for output must therefore be + * of fixed size. The extra frames set here are on top of any number + * that the filter needs internally in order to operate normally. + * + * This field must be set before the graph containing this filter is + * configured. + */ + int extra_hw_frames; }; /** @@ -357,6 +430,11 @@ struct AVFilterContext { * the pads involved. In addition, this link also contains the parameters * which have been negotiated and agreed upon between the filter, such as * image dimensions, format, etc. + * + * Applications must not normally access the link structure directly. + * Use the buffersrc and buffersink API instead. + * In the future, access to the header may be reserved for filters + * implementation. */ struct AVFilterLink { AVFilterContext *src; ///< source filter @@ -435,21 +513,28 @@ struct AVFilterLink { /** * Current timestamp of the link, as defined by the most recent - * frame(s), in AV_TIME_BASE units. + * frame(s), in link time_base units. */ int64_t current_pts; + /** + * Current timestamp of the link, as defined by the most recent + * frame(s), in AV_TIME_BASE units. + */ + int64_t current_pts_us; + /** * Index in the age array. */ int age_index; /** - * Frame rate of the stream on the link, or 1/0 if unknown; - * if left to 0/0, will be automatically be copied from the first input + * Frame rate of the stream on the link, or 1/0 if unknown or variable; + * if left to 0/0, will be automatically copied from the first input * of the source filter if it exists. * * Sources should set it to the best estimation of the real frame rate. + * If the source frame rate is unknown or variable, set this to 1/0. * Filters should update it if necessary depending on their function. * Sinks can use it to set a default output frame rate. * It is similar to the r_frame_rate field in AVStream. @@ -482,18 +567,6 @@ struct AVFilterLink { */ int max_samples; - /** - * True if the link is closed. - * If set, all attempts of start_frame, filter_frame or request_frame - * will fail with AVERROR_EOF, and if necessary the reference will be - * destroyed. - * If request_frame returns AVERROR_EOF, this flag is set on the - * corresponding link. - * It can be set also be set by either the source or the destination - * filter. - */ - int closed; - /** * Number of channels. */ @@ -507,7 +580,70 @@ struct AVFilterLink { /** * Number of past frames sent through the link. */ - int64_t frame_count; + int64_t frame_count_in, frame_count_out; + + /** + * A pointer to a FFFramePool struct. + */ + void *frame_pool; + + /** + * True if a frame is currently wanted on the output of this filter. + * Set when ff_request_frame() is called by the output, + * cleared when a frame is filtered. + */ + int frame_wanted_out; + + /** + * For hwaccel pixel formats, this should be a reference to the + * AVHWFramesContext describing the frames. + */ + AVBufferRef *hw_frames_ctx; + +#ifndef FF_INTERNAL_FIELDS + + /** + * Internal structure members. + * The fields below this limit are internal for libavfilter's use + * and must in no way be accessed by applications. + */ + char reserved[0xF000]; + +#else /* FF_INTERNAL_FIELDS */ + + /** + * Queue of frames waiting to be filtered. + */ + FFFrameQueue fifo; + + /** + * If set, the source filter can not generate a frame as is. + * The goal is to avoid repeatedly calling the request_frame() method on + * the same link. + */ + int frame_blocked_in; + + /** + * Link input status. + * If not zero, all attempts of filter_frame will fail with the + * corresponding code. + */ + int status_in; + + /** + * Timestamp of the input status change. + */ + int64_t status_in_pts; + + /** + * Link output status. + * If not zero, all attempts of request_frame will fail with the + * corresponding code. + */ + int status_out; + +#endif /* FF_INTERNAL_FIELDS */ + }; /** @@ -527,14 +663,21 @@ int avfilter_link(AVFilterContext *src, unsigned srcpad, */ void avfilter_link_free(AVFilterLink **link); +#if FF_API_FILTER_GET_SET /** * Get the number of channels of a link. + * @deprecated Use av_buffersink_get_channels() */ +attribute_deprecated int avfilter_link_get_channels(AVFilterLink *link); +#endif /** * Set the closed field of a link. + * @deprecated applications are not supposed to mess with links, they should + * close the sinks. */ +attribute_deprecated void avfilter_link_set_closed(AVFilterLink *link, int closed); /** @@ -554,14 +697,21 @@ int avfilter_config_links(AVFilterContext *filter); */ int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags); -/** Initialize the filter system. Register all builtin filters. */ -void avfilter_register_all(void); +/** + * Iterate over all registered filters. + * + * @param opaque a pointer where libavfilter will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered filter or NULL when the iteration is + * finished + */ +const AVFilter *av_filter_iterate(void **opaque); -#if FF_API_OLD_FILTER_REGISTER -/** Uninitialize the filter system. Unregister all filters. */ +#if FF_API_NEXT +/** Initialize the filter system. Register all builtin filters. */ attribute_deprecated -void avfilter_uninit(void); -#endif +void avfilter_register_all(void); /** * Register a filter. This is only needed if you plan to use @@ -573,8 +723,18 @@ void avfilter_uninit(void); * @return 0 if the registration was successful, a negative value * otherwise */ +attribute_deprecated int avfilter_register(AVFilter *filter); +/** + * Iterate over all registered filters. + * @return If prev is non-NULL, next registered filter after prev or NULL if + * prev is the last filter. If prev is NULL, return the first registered filter. + */ +attribute_deprecated +const AVFilter *avfilter_next(const AVFilter *prev); +#endif + /** * Get a filter definition matching the given name. * @@ -582,60 +742,8 @@ int avfilter_register(AVFilter *filter); * @return the filter definition, if any matching one is registered. * NULL if none found. */ -#if !FF_API_NOCONST_GET_NAME -const -#endif -AVFilter *avfilter_get_by_name(const char *name); +const AVFilter *avfilter_get_by_name(const char *name); -/** - * Iterate over all registered filters. - * @return If prev is non-NULL, next registered filter after prev or NULL if - * prev is the last filter. If prev is NULL, return the first registered filter. - */ -const AVFilter *avfilter_next(const AVFilter *prev); - -#if FF_API_OLD_FILTER_REGISTER -/** - * If filter is NULL, returns a pointer to the first registered filter pointer, - * if filter is non-NULL, returns the next pointer after filter. - * If the returned pointer points to NULL, the last registered filter - * was already reached. - * @deprecated use avfilter_next() - */ -attribute_deprecated -AVFilter **av_filter_next(AVFilter **filter); -#endif - -#if FF_API_AVFILTER_OPEN -/** - * Create a filter instance. - * - * @param filter_ctx put here a pointer to the created filter context - * on success, NULL on failure - * @param filter the filter to create an instance of - * @param inst_name Name to give to the new instance. Can be NULL for none. - * @return >= 0 in case of success, a negative error code otherwise - * @deprecated use avfilter_graph_alloc_filter() instead - */ -attribute_deprecated -int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name); -#endif - - -#if FF_API_AVFILTER_INIT_FILTER -/** - * Initialize a filter. - * - * @param filter the filter to initialize - * @param args A string of parameters to use when initializing the filter. - * The format and meaning of this string varies by filter. - * @param opaque Any extra non-string data needed by the filter. The meaning - * of this parameter varies by filter. - * @return zero on success - */ -attribute_deprecated -int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque); -#endif /** * Initialize a filter with the supplied parameters. @@ -735,7 +843,9 @@ typedef struct AVFilterGraph { unsigned nb_filters; char *scale_sws_opts; ///< sws options to use for the auto-inserted scale filters - char *resample_lavr_opts; ///< libavresample options to use for the auto-inserted resample filters +#if FF_API_LAVR_OPTS + attribute_deprecated char *resample_lavr_opts; ///< libavresample options to use for the auto-inserted resample filters +#endif /** * Type of multithreading allowed for filters in this graph. A combination @@ -834,20 +944,6 @@ AVFilterContext *avfilter_graph_alloc_filter(AVFilterGraph *graph, */ AVFilterContext *avfilter_graph_get_filter(AVFilterGraph *graph, const char *name); -#if FF_API_AVFILTER_OPEN -/** - * Add an existing filter instance to a filter graph. - * - * @param graphctx the filter graph - * @param filter the filter to be added - * - * @deprecated use avfilter_graph_alloc_filter() to allocate a filter in a - * filter graph - */ -attribute_deprecated -int avfilter_graph_add_filter(AVFilterGraph *graphctx, AVFilterContext *filter); -#endif - /** * Create and add a filter instance into an existing graph. * The filter instance is created from the filter filt and inited diff --git a/neo/libs/ffmpeg-win64/include/libavfilter/buffersink.h b/neo/libs/ffmpeg-win64/include/libavfilter/buffersink.h index e399b911..3c846bb5 100644 --- a/neo/libs/ffmpeg-win64/include/libavfilter/buffersink.h +++ b/neo/libs/ffmpeg-win64/include/libavfilter/buffersink.h @@ -62,7 +62,7 @@ int av_buffersink_get_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flag /** * Struct to use for initializing a buffersink context. */ -typedef struct { +typedef struct AVBufferSinkParams { const enum AVPixelFormat *pixel_fmts; ///< list of allowed pixel formats, terminated by AV_PIX_FMT_NONE } AVBufferSinkParams; @@ -76,7 +76,7 @@ AVBufferSinkParams *av_buffersink_params_alloc(void); /** * Struct to use for initializing an abuffersink context. */ -typedef struct { +typedef struct AVABufferSinkParams { const enum AVSampleFormat *sample_fmts; ///< list of allowed sample formats, terminated by AV_SAMPLE_FMT_NONE const int64_t *channel_layouts; ///< list of allowed channel layouts, terminated by -1 const int *channel_counts; ///< list of allowed channel counts, terminated by -1 @@ -101,9 +101,27 @@ AVABufferSinkParams *av_abuffersink_params_alloc(void); void av_buffersink_set_frame_size(AVFilterContext *ctx, unsigned frame_size); /** - * Get the frame rate of the input. + * @defgroup lavfi_buffersink_accessors Buffer sink accessors + * Get the properties of the stream + * @{ */ -AVRational av_buffersink_get_frame_rate(AVFilterContext *ctx); + +enum AVMediaType av_buffersink_get_type (const AVFilterContext *ctx); +AVRational av_buffersink_get_time_base (const AVFilterContext *ctx); +int av_buffersink_get_format (const AVFilterContext *ctx); + +AVRational av_buffersink_get_frame_rate (const AVFilterContext *ctx); +int av_buffersink_get_w (const AVFilterContext *ctx); +int av_buffersink_get_h (const AVFilterContext *ctx); +AVRational av_buffersink_get_sample_aspect_ratio (const AVFilterContext *ctx); + +int av_buffersink_get_channels (const AVFilterContext *ctx); +uint64_t av_buffersink_get_channel_layout (const AVFilterContext *ctx); +int av_buffersink_get_sample_rate (const AVFilterContext *ctx); + +AVBufferRef * av_buffersink_get_hw_frames_ctx (const AVFilterContext *ctx); + +/** @} */ /** * Get a frame with filtered data from sink and put it in frame. @@ -133,7 +151,7 @@ int av_buffersink_get_frame(AVFilterContext *ctx, AVFrame *frame); * the end of stream, when it can contain less than nb_samples. * * @return The return codes have the same meaning as for - * av_buffersink_get_samples(). + * av_buffersink_get_frame(). * * @warning do not mix this function with av_buffersink_get_frame(). Use only one or * the other with a single sink, not both. diff --git a/neo/libs/ffmpeg-win64/include/libavfilter/buffersrc.h b/neo/libs/ffmpeg-win64/include/libavfilter/buffersrc.h index 847c093c..08fbd18a 100644 --- a/neo/libs/ffmpeg-win64/include/libavfilter/buffersrc.h +++ b/neo/libs/ffmpeg-win64/include/libavfilter/buffersrc.h @@ -1,5 +1,4 @@ /* - * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or @@ -26,7 +25,6 @@ * Memory buffer source API. */ -#include "libavcodec/avcodec.h" #include "avfilter.h" /** @@ -65,6 +63,80 @@ enum { */ unsigned av_buffersrc_get_nb_failed_requests(AVFilterContext *buffer_src); +/** + * This structure contains the parameters describing the frames that will be + * passed to this filter. + * + * It should be allocated with av_buffersrc_parameters_alloc() and freed with + * av_free(). All the allocated fields in it remain owned by the caller. + */ +typedef struct AVBufferSrcParameters { + /** + * video: the pixel format, value corresponds to enum AVPixelFormat + * audio: the sample format, value corresponds to enum AVSampleFormat + */ + int format; + /** + * The timebase to be used for the timestamps on the input frames. + */ + AVRational time_base; + + /** + * Video only, the display dimensions of the input frames. + */ + int width, height; + + /** + * Video only, the sample (pixel) aspect ratio. + */ + AVRational sample_aspect_ratio; + + /** + * Video only, the frame rate of the input video. This field must only be + * set to a non-zero value if input stream has a known constant framerate + * and should be left at its initial value if the framerate is variable or + * unknown. + */ + AVRational frame_rate; + + /** + * Video with a hwaccel pixel format only. This should be a reference to an + * AVHWFramesContext instance describing the input frames. + */ + AVBufferRef *hw_frames_ctx; + + /** + * Audio only, the audio sampling rate in samples per second. + */ + int sample_rate; + + /** + * Audio only, the audio channel layout + */ + uint64_t channel_layout; +} AVBufferSrcParameters; + +/** + * Allocate a new AVBufferSrcParameters instance. It should be freed by the + * caller with av_free(). + */ +AVBufferSrcParameters *av_buffersrc_parameters_alloc(void); + +/** + * Initialize the buffersrc or abuffersrc filter with the provided parameters. + * This function may be called multiple times, the later calls override the + * previous ones. Some of the parameters may also be set through AVOptions, then + * whatever method is used last takes precedence. + * + * @param ctx an instance of the buffersrc or abuffersrc filter + * @param param the stream parameters. The frames later passed to this filter + * must conform to those parameters. All the allocated fields in + * param remain owned by the caller, libavfilter will make internal + * copies or references when necessary. + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_buffersrc_parameters_set(AVFilterContext *ctx, AVBufferSrcParameters *param); + /** * Add a frame to the buffer source. * @@ -121,6 +193,14 @@ av_warn_unused_result int av_buffersrc_add_frame_flags(AVFilterContext *buffer_src, AVFrame *frame, int flags); +/** + * Close the buffer source after EOF. + * + * This is similar to passing NULL to av_buffersrc_add_frame_flags() + * except it takes the timestamp of the EOF, i.e. the timestamp of the end + * of the last frame. + */ +int av_buffersrc_close(AVFilterContext *ctx, int64_t pts, unsigned flags); /** * @} diff --git a/neo/libs/ffmpeg-win64/include/libavfilter/version.h b/neo/libs/ffmpeg-win64/include/libavfilter/version.h index c3ecf914..cc5b23b7 100644 --- a/neo/libs/ffmpeg-win64/include/libavfilter/version.h +++ b/neo/libs/ffmpeg-win64/include/libavfilter/version.h @@ -29,9 +29,10 @@ #include "libavutil/version.h" -#define LIBAVFILTER_VERSION_MAJOR 6 -#define LIBAVFILTER_VERSION_MINOR 14 -#define LIBAVFILTER_VERSION_MICRO 101 +#define LIBAVFILTER_VERSION_MAJOR 7 +#define LIBAVFILTER_VERSION_MINOR 57 +#define LIBAVFILTER_VERSION_MICRO 100 + #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ LIBAVFILTER_VERSION_MINOR, \ @@ -49,23 +50,17 @@ * the public API and may change, break or disappear at any time. */ -#ifndef FF_API_OLD_FILTER_OPTS -#define FF_API_OLD_FILTER_OPTS (LIBAVFILTER_VERSION_MAJOR < 7) -#endif #ifndef FF_API_OLD_FILTER_OPTS_ERROR -#define FF_API_OLD_FILTER_OPTS_ERROR (LIBAVFILTER_VERSION_MAJOR < 7) +#define FF_API_OLD_FILTER_OPTS_ERROR (LIBAVFILTER_VERSION_MAJOR < 8) #endif -#ifndef FF_API_AVFILTER_OPEN -#define FF_API_AVFILTER_OPEN (LIBAVFILTER_VERSION_MAJOR < 7) +#ifndef FF_API_LAVR_OPTS +#define FF_API_LAVR_OPTS (LIBAVFILTER_VERSION_MAJOR < 8) #endif -#ifndef FF_API_AVFILTER_INIT_FILTER -#define FF_API_AVFILTER_INIT_FILTER (LIBAVFILTER_VERSION_MAJOR < 7) +#ifndef FF_API_FILTER_GET_SET +#define FF_API_FILTER_GET_SET (LIBAVFILTER_VERSION_MAJOR < 8) #endif -#ifndef FF_API_OLD_FILTER_REGISTER -#define FF_API_OLD_FILTER_REGISTER (LIBAVFILTER_VERSION_MAJOR < 7) -#endif -#ifndef FF_API_NOCONST_GET_NAME -#define FF_API_NOCONST_GET_NAME (LIBAVFILTER_VERSION_MAJOR < 7) +#ifndef FF_API_NEXT +#define FF_API_NEXT (LIBAVFILTER_VERSION_MAJOR < 8) #endif #endif /* AVFILTER_VERSION_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavformat/avformat.h b/neo/libs/ffmpeg-win64/include/libavformat/avformat.h index dff5ef67..6eb329f1 100644 --- a/neo/libs/ffmpeg-win64/include/libavformat/avformat.h +++ b/neo/libs/ffmpeg-win64/include/libavformat/avformat.h @@ -28,25 +28,23 @@ */ /** - * @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 * into component streams, and the reverse process of muxing - writing supplied * data in a specified container format. It also has an @ref lavf_io * "I/O module" which supports a number of protocols for accessing the data (e.g. - * file, tcp, http and others). Before using lavf, you need to call - * av_register_all() to register all compiled muxers, demuxers and protocols. + * file, tcp, http and others). * Unless you are absolutely sure you won't use libavformat's network * capabilities, you should also call avformat_network_init(). * * A supported input format is described by an AVInputFormat struct, conversely * an output format is described by AVOutputFormat. You can iterate over all - * registered input/output formats using the av_iformat_next() / - * av_oformat_next() functions. The protocols layer is not part of the public - * API, so you can only get the names of supported protocols with the - * avio_enum_protocols() function. + * input/output formats using the av_demuxer_iterate / av_muxer_iterate() functions. + * The protocols layer is not part of the public API, so you can only get the names + * of supported protocols with the avio_enum_protocols() function. * * Main lavf structure used for both muxing and demuxing is AVFormatContext, * which exports all information about the file being read or written. As with @@ -78,6 +76,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 +100,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 +161,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 @@ -163,8 +175,8 @@ * Otherwise, if AVPacket.buf is NULL, the packet data is backed by a * static storage somewhere inside the demuxer and the packet is only valid * until the next av_read_frame() call or closing the file. If the caller - * requires a longer lifetime, av_dup_packet() will make an av_malloc()ed copy - * of it. + * requires a longer lifetime, av_packet_make_refcounted() will ensure that + * the data is reference counted, copying the data if necessary. * In both cases, the packet must be freed with av_packet_unref() when it is no * longer needed. * @@ -191,15 +203,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 +310,6 @@ * @{ * @} * @} - * */ #include @@ -424,19 +435,6 @@ int av_get_packet(AVIOContext *s, AVPacket *pkt, int size); */ int av_append_packet(AVIOContext *s, AVPacket *pkt, int size); -#if FF_API_LAVF_FRAC -/*************************************************/ -/* fractional numbers for exact pts handling */ - -/** - * The exact value of the fractional number is: 'val + num / den'. - * num is assumed to be 0 <= num < den. - */ -typedef struct AVFrac { - int64_t val, num, den; -} AVFrac; -#endif - /*************************************************/ /* input/output formats */ @@ -465,10 +463,6 @@ typedef struct AVProbeData { #define AVFMT_NOFILE 0x0001 #define AVFMT_NEEDNUMBER 0x0002 /**< Needs '%d' in filename. */ #define AVFMT_SHOW_IDS 0x0008 /**< Show format stream IDs numbers. */ -#if FF_API_LAVF_FMT_RAWPICTURE -#define AVFMT_RAWPICTURE 0x0020 /**< Format wants AVPicture structure for - raw picture data. @deprecated Not used anymore */ -#endif #define AVFMT_GLOBALHEADER 0x0040 /**< Format wants global header. */ #define AVFMT_NOTIMESTAMPS 0x0080 /**< Format does not need / have any timestamps. */ #define AVFMT_GENERIC_INDEX 0x0100 /**< Use generic index building code. */ @@ -516,7 +510,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; @@ -536,7 +530,16 @@ typedef struct AVOutputFormat { * New public fields should be added right above. ***************************************************************** */ - struct AVOutputFormat *next; + /** + * The ff_const59 define is not part of the public API and will + * be removed without further warning. + */ +#if FF_API_AVIOFORMAT +#define ff_const59 +#else +#define ff_const59 const +#endif + ff_const59 struct AVOutputFormat *next; /** * size of private data so that it can be allocated in the wrapper */ @@ -600,6 +603,31 @@ typedef struct AVOutputFormat { */ int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); enum AVCodecID data_codec; /**< default data codec */ + /** + * Initialize format. May allocate data here, and set any AVFormatContext or + * 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 *); + /** + * Deinitialize format. If present, this is called whenever the muxer is being + * destroyed, regardless of whether or not the header has been written. + * + * If a trailer is being written, this is called after write_trailer(). + * + * This is called if init() fails as well. + */ + void (*deinit)(struct AVFormatContext *); + /** + * Set up any necessary bitstream filtering and extract any extra data needed + * for the global header. + * Return 0 if more packets from this stream must be checked; 1 if not. + */ + int (*check_bitstream)(struct AVFormatContext *, const AVPacket *pkt); } AVOutputFormat; /** * @} @@ -625,7 +653,7 @@ typedef struct AVInputFormat { /** * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, - * AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH, + * AVFMT_NOTIMESTAMPS, AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH, * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS. */ int flags; @@ -655,7 +683,7 @@ typedef struct AVInputFormat { * New public fields should be added right above. ***************************************************************** */ - struct AVInputFormat *next; + ff_const59 struct AVInputFormat *next; /** * Raw demuxers store their codec ID here. @@ -672,7 +700,7 @@ typedef struct AVInputFormat { * The buffer provided is guaranteed to be AVPROBE_PADDING_SIZE bytes * big so you do not have to check for that unless you need more. */ - int (*read_probe)(AVProbeData *); + int (*read_probe)(const AVProbeData *); /** * Read the format header and initialize the AVFormatContext @@ -764,9 +792,9 @@ enum AVStreamParseType { AVSTREAM_PARSE_HEADERS, /**< Only parse headers, do not repack. */ AVSTREAM_PARSE_TIMESTAMPS, /**< full parsing and interpolation of timestamps for frames not starting on a packet boundary */ AVSTREAM_PARSE_FULL_ONCE, /**< full parsing and repack of the first frame only, only implemented for H.264 currently */ - AVSTREAM_PARSE_FULL_RAW=MKTAG(0,'R','A','W'), /**< full parsing and repack with timestamp and position generation by parser for raw - this assumes that each packet in the file contains no demuxer level headers and - just codec level data, otherwise position generation would fail */ + AVSTREAM_PARSE_FULL_RAW, /**< full parsing and repack with timestamp and position generation by parser for raw + this assumes that each packet in the file contains no demuxer level headers and + just codec level data, otherwise position generation would fail */ }; typedef struct AVIndexEntry { @@ -778,6 +806,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. */ @@ -801,11 +832,19 @@ 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; /** * To specify text track kind (different from subtitles default). @@ -813,6 +852,8 @@ typedef struct AVIndexEntry { #define AV_DISPOSITION_CAPTIONS 0x10000 #define AV_DISPOSITION_DESCRIPTIONS 0x20000 #define AV_DISPOSITION_METADATA 0x40000 +#define AV_DISPOSITION_DEPENDENT 0x80000 ///< dependent audio stream (mix_type=0 in mpegts) +#define AV_DISPOSITION_STILL_IMAGE 0x100000 ///< still images in video stream (still_picture_flag=1 in mpegts) /** * Options for behavior on timestamp wrap detection. @@ -836,27 +877,14 @@ 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. - */ - AVCodecContext *codec; - void *priv_data; - -#if FF_API_LAVF_FRAC - /** - * @deprecated this field is unused + * @deprecated use the codecpar struct instead */ attribute_deprecated - struct AVFrac pts; + AVCodecContext *codec; #endif + void *priv_data; /** * This is the fundamental unit of time (in seconds) in terms @@ -886,6 +914,9 @@ typedef struct AVStream { * Decoding: duration of the stream, in stream time base. * If a source file does not specify a duration, but does specify * a bitrate, this value will be estimated from bitrate and file size. + * + * Encoding: May be set by the caller before avformat_write_header() to + * provide a hint to the muxer about the estimated duration. */ int64_t duration; @@ -954,18 +985,53 @@ typedef struct AVStream { int event_flags; #define AVSTREAM_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata. + /** + * Real base framerate of the stream. + * This is the lowest framerate with which all timestamps can be + * represented accurately (it is the least common multiple of all + * framerates in the stream). Note, this value is just a guess! + * For example, if the time base is 1/90000 and all frames have either + * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1. + */ + AVRational r_frame_rate; + +#if FF_API_LAVF_FFSERVER + /** + * String containing pairs of key and values describing recommended encoder configuration. + * Pairs are separated by ','. + * Keys are separated from values by '='. + * + * @deprecated unused + */ + attribute_deprecated + char *recommended_encoder_configuration; +#endif + + /** + * Codec parameters associated with this stream. Allocated and freed by + * libavformat in avformat_new_stream() and avformat_free_context() + * respectively. + * + * - demuxing: filled by libavformat on stream creation or in + * avformat_find_stream_info() + * - muxing: filled by the caller before avformat_write_header() + */ + AVCodecParameters *codecpar; + /***************************************************************** * All fields below this line are not part of the public API. They * may not be used outside of libavformat and can be changed and * removed at will. - * New public fields should be added right above. + * Internal note: be aware that physically removing these fields + * will break ABI. Replace removed fields with dummy fields, and + * add new fields to AVStreamInternal. ***************************************************************** */ +#define MAX_STD_TIMEBASES (30*12+30+3+6) /** - * Stream information used internally by av_find_stream_info() + * Stream information used internally by avformat_find_stream_info() */ -#define MAX_STD_TIMEBASES (30*12+7+6) struct { int64_t last_dts; int64_t duration_gcd; @@ -974,6 +1040,7 @@ typedef struct AVStream { double (*duration_error)[2][MAX_STD_TIMEBASES]; int64_t codec_info_duration; int64_t codec_info_duration_fields; + int frame_delay_evidence; /** * 0 -> decoder has not been searched for yet. @@ -1015,7 +1082,7 @@ typedef struct AVStream { int probe_packets; /** - * Number of frames that have been demuxed during av_find_stream_info() + * Number of frames that have been demuxed during avformat_find_stream_info() */ int codec_info_nb_frames; @@ -1036,19 +1103,6 @@ typedef struct AVStream { int nb_index_entries; unsigned int index_entries_allocated_size; - /** - * Real base framerate of the stream. - * This is the lowest framerate with which all timestamps can be - * represented accurately (it is the least common multiple of all - * framerates in the stream). Note, this value is just a guess! - * For example, if the time base is 1/90000 and all frames have either - * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1. - * - * Code outside avformat should access this field using: - * av_stream_get/set_r_frame_rate(stream) - */ - AVRational r_frame_rate; - /** * Stream Identifier * This is the MPEG-TS stream identifier +1 @@ -1056,6 +1110,13 @@ typedef struct AVStream { */ int stream_identifier; + /** + * Details of the MPEG-TS program which created this stream. + */ + int program_num; + int pmt_version; + int pmt_stream_idx; + int64_t interleaver_chunk_size; int64_t interleaver_chunk_duration; @@ -1154,13 +1215,6 @@ typedef struct AVStream { */ int inject_global_side_data; - /** - * String containing paris of key and values describing recommended encoder configuration. - * Paris are separated by ','. - * Keys are separated from values by '='. - */ - char *recommended_encoder_configuration; - /** * display aspect ratio (0 if unknown) * - encoding: unused @@ -1168,14 +1222,31 @@ typedef struct AVStream { */ AVRational display_aspect_ratio; - struct FFFrac *priv_pts; + /** + * An opaque field for libavformat internal usage. + * Must not be accessed in any way by callers. + */ + AVStreamInternal *internal; } AVStream; +#if FF_API_FORMAT_GET_SET +/** + * Accessors for some AVStream fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +attribute_deprecated AVRational av_stream_get_r_frame_rate(const AVStream *s); +attribute_deprecated void av_stream_set_r_frame_rate(AVStream *s, AVRational r); -struct AVCodecParserContext *av_stream_get_parser(const AVStream *s); +#if FF_API_LAVF_FFSERVER +attribute_deprecated char* av_stream_get_recommended_encoder_configuration(const AVStream *s); +attribute_deprecated void av_stream_set_recommended_encoder_configuration(AVStream *s, char *configuration); +#endif +#endif + +struct AVCodecParserContext *av_stream_get_parser(const AVStream *s); /** * Returns the pts of the last muxed packet + its duration @@ -1203,6 +1274,7 @@ typedef struct AVProgram { int program_num; int pmt_pid; int pcr_pid; + int pmt_version; /***************************************************************** * All fields below this line are not part of the public API. They @@ -1220,6 +1292,11 @@ typedef struct AVProgram { #define AVFMTCTX_NOHEADER 0x0001 /**< signal that no header is present (streams are added dynamically) */ +#define AVFMTCTX_UNSEEKABLE 0x0002 /**< signal that the stream is definitely + not seekable, and attempts to call the + seek function will fail. For some + network protocols (e.g. HLS), this can + change dynamically at runtime. */ typedef struct AVChapter { int id; ///< unique ID to identify the chapter @@ -1257,6 +1334,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 { /** @@ -1270,14 +1353,14 @@ typedef struct AVFormatContext { * * Demuxing only, set by avformat_open_input(). */ - struct AVInputFormat *iformat; + ff_const59 struct AVInputFormat *iformat; /** * The output container format. * * Muxing only, must be set by the caller before avformat_write_header(). */ - struct AVOutputFormat *oformat; + ff_const59 struct AVOutputFormat *oformat; /** * Format private data. This is an AVOptions-enabled struct @@ -1328,13 +1411,33 @@ typedef struct AVFormatContext { */ AVStream **streams; +#if FF_API_FORMAT_FILENAME /** * input or output filename * * - demuxing: set by avformat_open_input() * - muxing: may be set by the caller before avformat_write_header() + * + * @deprecated Use url instead. */ + attribute_deprecated char filename[1024]; +#endif + + /** + * input or output URL. Unlike the old filename field, this field has no + * length restriction. + * + * - demuxing: set by avformat_open_input(), initialized to an empty + * string if url parameter was NULL in avformat_open_input(). + * - muxing: may be set by the caller before calling avformat_write_header() + * (or avformat_init_output() if that is called first) to a string + * which is freeable by av_free(). Set to an empty string if it + * was NULL in avformat_init_output(). + * + * Freed by libavformat in avformat_free_context(). + */ + char *url; /** * Position of the first frame of the component, in @@ -1387,11 +1490,17 @@ typedef struct AVFormatContext { * This flag is mainly intended for testing. */ #define AVFMT_FLAG_BITEXACT 0x0400 -#define AVFMT_FLAG_MP4A_LATM 0x8000 ///< Enable RTP MP4A-LATM payload +#if FF_API_LAVF_MP4A_LATM +#define AVFMT_FLAG_MP4A_LATM 0x8000 ///< Deprecated, does nothing. +#endif #define AVFMT_FLAG_SORT_DTS 0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down) #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. +#if FF_API_LAVF_KEEPSIDE_FLAG +#define AVFMT_FLAG_KEEP_SIDE_DATA 0x40000 ///< Deprecated, does nothing. +#endif #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 ///< Add bitstream filters as requested by the muxer /** * Maximum size of the data read from input for determining @@ -1577,7 +1686,7 @@ typedef struct AVFormatContext { /** * Audio preload in microseconds. * Note, not all formats support this and unpredictable things may happen if it is used when not supported. - * - encoding: Set by user via AVOptions (NO direct access) + * - encoding: Set by user * - decoding: unused */ int audio_preload; @@ -1585,7 +1694,7 @@ typedef struct AVFormatContext { /** * Max chunk time in microseconds. * Note, not all formats support this and unpredictable things may happen if it is used when not supported. - * - encoding: Set by user via AVOptions (NO direct access) + * - encoding: Set by user * - decoding: unused */ int max_chunk_duration; @@ -1593,7 +1702,7 @@ typedef struct AVFormatContext { /** * Max chunk size in bytes * Note, not all formats support this and unpredictable things may happen if it is used when not supported. - * - encoding: Set by user via AVOptions (NO direct access) + * - encoding: Set by user * - decoding: unused */ int max_chunk_size; @@ -1602,14 +1711,14 @@ typedef struct AVFormatContext { * forces the use of wallclock timestamps as pts/dts of packets * This has undefined results in the presence of B frames. * - encoding: unused - * - decoding: Set by user via AVOptions (NO direct access) + * - decoding: Set by user */ int use_wallclock_as_timestamps; /** * avio flags, used to force AVIO_FLAG_DIRECT. * - encoding: unused - * - decoding: Set by user via AVOptions (NO direct access) + * - decoding: Set by user */ int avio_flags; @@ -1617,34 +1726,34 @@ typedef struct AVFormatContext { * The duration field can be estimated through various ways, and this field can be used * to know how the duration was estimated. * - encoding: unused - * - decoding: Read by user via AVOptions (NO direct access) + * - decoding: Read by user */ enum AVDurationEstimationMethod duration_estimation_method; /** * Skip initial bytes when opening stream * - encoding: unused - * - decoding: Set by user via AVOptions (NO direct access) + * - decoding: Set by user */ int64_t skip_initial_bytes; /** * Correct single timestamp overflows * - encoding: unused - * - decoding: Set by user via AVOptions (NO direct access) + * - decoding: Set by user */ unsigned int correct_ts_overflow; /** * Force seeking to any (also non key) frames. * - encoding: unused - * - decoding: Set by user via AVOptions (NO direct access) + * - decoding: Set by user */ int seek2any; /** * Flush the I/O context after each packet. - * - encoding: Set by user via AVOptions (NO direct access) + * - encoding: Set by user * - decoding: unused */ int flush_packets; @@ -1654,14 +1763,14 @@ typedef struct AVFormatContext { * The maximal score is AVPROBE_SCORE_MAX, its set when the demuxer probes * the format. * - encoding: unused - * - decoding: set by avformat, read by user via av_format_get_probe_score() (NO direct access) + * - decoding: set by avformat, read by user */ int probe_score; /** * number of bytes to read maximally to identify format. * - encoding: unused - * - decoding: set by user through AVOPtions (NO direct access) + * - decoding: set by user */ int format_probesize; @@ -1669,7 +1778,7 @@ typedef struct AVFormatContext { * ',' separated list of allowed decoders. * If NULL then all are allowed * - encoding: unused - * - decoding: set by user through AVOptions (NO direct access) + * - decoding: set by user */ char *codec_whitelist; @@ -1677,7 +1786,7 @@ typedef struct AVFormatContext { * ',' separated list of allowed demuxers. * If NULL then all are allowed * - encoding: unused - * - decoding: set by user through AVOptions (NO direct access) + * - decoding: set by user */ char *format_whitelist; @@ -1699,7 +1808,7 @@ typedef struct AVFormatContext { * Forced video codec. * This allows forcing a specific decoder, even when there are multiple with * the same codec_id. - * Demuxing: Set by user via av_format_set_video_codec (NO direct access). + * Demuxing: Set by user */ AVCodec *video_codec; @@ -1707,7 +1816,7 @@ typedef struct AVFormatContext { * Forced audio codec. * This allows forcing a specific decoder, even when there are multiple with * the same codec_id. - * Demuxing: Set by user via av_format_set_audio_codec (NO direct access). + * Demuxing: Set by user */ AVCodec *audio_codec; @@ -1715,7 +1824,7 @@ typedef struct AVFormatContext { * Forced subtitle codec. * This allows forcing a specific decoder, even when there are multiple with * the same codec_id. - * Demuxing: Set by user via av_format_set_subtitle_codec (NO direct access). + * Demuxing: Set by user */ AVCodec *subtitle_codec; @@ -1723,7 +1832,7 @@ typedef struct AVFormatContext { * Forced data codec. * This allows forcing a specific decoder, even when there are multiple with * the same codec_id. - * Demuxing: Set by user via av_format_set_data_codec (NO direct access). + * Demuxing: Set by user */ AVCodec *data_codec; @@ -1737,7 +1846,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; @@ -1748,15 +1856,13 @@ typedef struct AVFormatContext { /** * Output timestamp offset, in microseconds. - * Muxing: set by user via AVOptions (NO direct access) + * Muxing: set by user */ int64_t output_ts_offset; /** * dump format separator. * can be ", " or "\n " or anything else - * Code outside libavformat should access this field using AVOptions - * (NO direct access). * - muxing: Set by user. * - demuxing: Set by user. */ @@ -1768,6 +1874,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. * @@ -1782,27 +1889,110 @@ 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 + */ + 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 + */ + char *protocol_blacklist; + + /** + * The maximum number of streams. + * - encoding: unused + * - decoding: set by user + */ + int max_streams; + + /** + * Skip duration calcuation in estimate_timings_from_pts. + * - encoding: unused + * - decoding: set by user + */ + int skip_estimate_duration_from_pts; } AVFormatContext; +#if FF_API_FORMAT_GET_SET +/** + * Accessors for some AVFormatContext fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +attribute_deprecated int av_format_get_probe_score(const AVFormatContext *s); +attribute_deprecated AVCodec * av_format_get_video_codec(const AVFormatContext *s); +attribute_deprecated void av_format_set_video_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated AVCodec * av_format_get_audio_codec(const AVFormatContext *s); +attribute_deprecated void av_format_set_audio_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated AVCodec * av_format_get_subtitle_codec(const AVFormatContext *s); +attribute_deprecated void av_format_set_subtitle_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated AVCodec * av_format_get_data_codec(const AVFormatContext *s); +attribute_deprecated void av_format_set_data_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated int av_format_get_metadata_header_padding(const AVFormatContext *s); +attribute_deprecated void av_format_set_metadata_header_padding(AVFormatContext *s, int c); +attribute_deprecated void * av_format_get_opaque(const AVFormatContext *s); +attribute_deprecated void av_format_set_opaque(AVFormatContext *s, void *opaque); +attribute_deprecated av_format_control_message av_format_get_control_message_cb(const AVFormatContext *s); +attribute_deprecated 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 +#endif /** * This function will cause global side data to be injected in the next packet @@ -1847,6 +2037,7 @@ const char *avformat_configuration(void); */ const char *avformat_license(void); +#if FF_API_NEXT /** * Initialize libavformat and register all the muxers, demuxers and * protocols. If you do not call this function, then you can select @@ -1855,31 +2046,44 @@ const char *avformat_license(void); * @see av_register_input_format() * @see av_register_output_format() */ +attribute_deprecated void av_register_all(void); +attribute_deprecated void av_register_input_format(AVInputFormat *format); +attribute_deprecated void av_register_output_format(AVOutputFormat *format); +#endif /** - * Do global initialization of network components. This is optional, - * but recommended, since it avoids the overhead of implicitly - * doing the setup for each session. + * Do global initialization of network libraries. This is optional, + * and not recommended anymore. * - * Calling this function will become mandatory if using network - * protocols at some major version bump. + * This functions only exists to work around thread-safety issues + * with older GnuTLS or OpenSSL libraries. If libavformat is linked + * to newer versions of those libraries, or if you do not use them, + * calling this function is unnecessary. Otherwise, you need to call + * this function before any other threads using them are started. + * + * This function will be deprecated once support for older GnuTLS and + * OpenSSL libraries is removed, and this function has no purpose + * anymore. */ int avformat_network_init(void); /** - * Undo the initialization done by avformat_network_init. + * Undo the initialization done by avformat_network_init. Call it only + * once for each time you called avformat_network_init. */ int avformat_network_deinit(void); +#if FF_API_NEXT /** * If f is NULL, returns the first registered input format, * if f is non-NULL, returns the next registered input format after f * or NULL if f is the last one. */ +attribute_deprecated AVInputFormat *av_iformat_next(const AVInputFormat *f); /** @@ -1887,7 +2091,31 @@ AVInputFormat *av_iformat_next(const AVInputFormat *f); * if f is non-NULL, returns the next registered output format after f * or NULL if f is the last one. */ +attribute_deprecated AVOutputFormat *av_oformat_next(const AVOutputFormat *f); +#endif + +/** + * Iterate over all registered muxers. + * + * @param opaque a pointer where libavformat will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered muxer or NULL when the iteration is + * finished + */ +const AVOutputFormat *av_muxer_iterate(void **opaque); + +/** + * Iterate over all registered demuxers. + * + * @param opaque a pointer where libavformat will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered demuxer or NULL when the iteration is + * finished + */ +const AVInputFormat *av_demuxer_iterate(void **opaque); /** * Allocate an AVFormatContext. @@ -1931,6 +2159,31 @@ const AVClass *avformat_get_class(void); */ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c); +/** + * Wrap an existing array as stream side data. + * + * @param st stream + * @param type side information type + * @param data the side data array. It must be allocated with the av_malloc() + * family of functions. The ownership of the data is transferred to + * st. + * @param size side information size + * @return zero on success, a negative AVERROR code on failure. On failure, + * the stream is unchanged and the data remains owned by the caller. + */ +int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, + uint8_t *data, size_t size); + +/** + * Allocate new information from stream. + * + * @param stream stream + * @param type desired side information type + * @param size side information size + * @return pointer to fresh allocated data or NULL otherwise + */ +uint8_t *av_stream_new_side_data(AVStream *stream, + enum AVPacketSideDataType type, int size); /** * Get side information from stream. * @@ -1939,7 +2192,7 @@ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c); * @param size pointer for side information size to store (optional) * @return pointer to data if present or NULL otherwise */ -uint8_t *av_stream_get_side_data(AVStream *stream, +uint8_t *av_stream_get_side_data(const AVStream *stream, enum AVPacketSideDataType type, int *size); AVProgram *av_new_program(AVFormatContext *s, int id); @@ -1965,7 +2218,7 @@ AVProgram *av_new_program(AVFormatContext *s, int id); * @return >= 0 in case of success, a negative AVERROR code in case of * failure */ -int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat, +int avformat_alloc_output_context2(AVFormatContext **ctx, ff_const59 AVOutputFormat *oformat, const char *format_name, const char *filename); /** @@ -1976,7 +2229,7 @@ int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oforma /** * Find AVInputFormat based on the short name of the input format. */ -AVInputFormat *av_find_input_format(const char *short_name); +ff_const59 AVInputFormat *av_find_input_format(const char *short_name); /** * Guess the file format. @@ -1985,7 +2238,7 @@ AVInputFormat *av_find_input_format(const char *short_name); * @param is_opened Whether the file is already opened; determines whether * demuxers with or without AVFMT_NOFILE are probed. */ -AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened); +ff_const59 AVInputFormat *av_probe_input_format(ff_const59 AVProbeData *pd, int is_opened); /** * Guess the file format. @@ -1999,7 +2252,7 @@ AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened); * If the score is <= AVPROBE_SCORE_MAX / 4 it is recommended * to retry with a larger probe buffer. */ -AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max); +ff_const59 AVInputFormat *av_probe_input_format2(ff_const59 AVProbeData *pd, int is_opened, int *score_max); /** * Guess the file format. @@ -2008,7 +2261,7 @@ AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score * demuxers with or without AVFMT_NOFILE are probed. * @param score_ret The score of the best detection. */ -AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret); +ff_const59 AVInputFormat *av_probe_input_format3(ff_const59 AVProbeData *pd, int is_opened, int *score_ret); /** * Probe a bytestream to determine the input format. Each time a probe returns @@ -2018,7 +2271,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) @@ -2026,15 +2279,15 @@ AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score * the maximal score is AVPROBE_SCORE_MAX * AVERROR code otherwise */ -int av_probe_input_buffer2(AVIOContext *pb, AVInputFormat **fmt, - const char *filename, void *logctx, +int av_probe_input_buffer2(AVIOContext *pb, ff_const59 AVInputFormat **fmt, + 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, +int av_probe_input_buffer(AVIOContext *pb, ff_const59 AVInputFormat **fmt, + const char *url, void *logctx, unsigned int offset, unsigned int max_probe_size); /** @@ -2045,7 +2298,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. @@ -2056,7 +2309,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, ff_const59 AVInputFormat *fmt, AVDictionary **options); attribute_deprecated int av_demuxer_open(AVFormatContext *ic); @@ -2096,6 +2349,8 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options); */ AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s); +void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx); + /** * Find the "best" stream in the file. * The best stream is determined according to various heuristics as the most @@ -2248,6 +2503,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. @@ -2259,12 +2518,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. * @@ -2287,10 +2571,17 @@ int avformat_write_header(AVFormatContext *s, AVDictionary **options); *
* Packet's @ref AVPacket.stream_index "stream_index" field must be * set to the index of the corresponding stream in @ref - * AVFormatContext.streams "s->streams". It is very strongly - * recommended that timing information (@ref AVPacket.pts "pts", @ref - * AVPacket.dts "dts", @ref AVPacket.duration "duration") is set to - * correct values. + * AVFormatContext.streams "s->streams". + *
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts") + * must be set to correct values in the stream's timebase (unless the + * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then + * they can be set to AV_NOPTS_VALUE). + * The dts for subsequent packets passed to this function must be strictly + * increasing when compared in their respective timebases (unless the + * output format is flagged with the AVFMT_TS_NONSTRICT, then they + * merely have to be nondecreasing). @ref AVPacket.duration + * "duration") should also be set if known. * @return < 0 on error, = 0 if OK, 1 if flushed and there is no more data to flush * * @see av_interleaved_write_frame() @@ -2305,6 +2596,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. *
@@ -2320,10 +2615,16 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt); *
* Packet's @ref AVPacket.stream_index "stream_index" field must be * set to the index of the corresponding stream in @ref - * AVFormatContext.streams "s->streams". It is very strongly - * recommended that timing information (@ref AVPacket.pts "pts", @ref - * AVPacket.dts "dts", @ref AVPacket.duration "duration") is set to - * correct values. + * AVFormatContext.streams "s->streams". + *
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts") + * must be set to correct values in the stream's timebase (unless the + * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then + * they can be set to AV_NOPTS_VALUE). + * The dts for subsequent packets in one stream must be strictly + * increasing (unless the output format is flagged with the + * AVFMT_TS_NONSTRICT, then they merely have to be nondecreasing). + * @ref AVPacket.duration "duration") should also be set if known. * * @return 0 on success, a negative AVERROR on error. Libavformat will always * take care of freeing the packet, even if this function fails. @@ -2333,7 +2634,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. @@ -2344,7 +2645,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. @@ -2393,14 +2694,14 @@ int av_write_trailer(AVFormatContext *s); * @param mime_type if non-NULL checks if mime_type matches with the * MIME type of the registered formats */ -AVOutputFormat *av_guess_format(const char *short_name, +ff_const59 AVOutputFormat *av_guess_format(const char *short_name, const char *filename, const char *mime_type); /** * Guess the codec ID based upon muxer and filename. */ -enum AVCodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name, +enum AVCodecID av_guess_codec(ff_const59 AVOutputFormat *fmt, const char *short_name, const char *filename, const char *mime_type, enum AVMediaType type); @@ -2586,6 +2887,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. * @@ -2596,8 +2900,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); @@ -2730,6 +3038,52 @@ int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st, int avformat_queue_attached_pictures(AVFormatContext *s); +#if FF_API_OLD_BSF +/** + * Apply a list of bitstream filters to a packet. + * + * @param codec AVCodecContext, usually from an AVStream + * @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 + */ +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/neo/libs/ffmpeg-win64/include/libavformat/avio.h b/neo/libs/ffmpeg-win64/include/libavformat/avio.h index 06dd7f5e..dcb8dcdf 100644 --- a/neo/libs/ffmpeg-win64/include/libavformat/avio.h +++ b/neo/libs/ffmpeg-win64/include/libavformat/avio.h @@ -34,7 +34,15 @@ #include "libavformat/version.h" -#define AVIO_SEEKABLE_NORMAL 0x0001 /**< Seeking works like for a local file */ +/** + * Seeking works like for a local file. + */ +#define AVIO_SEEKABLE_NORMAL (1 << 0) + +/** + * Seeking by timestamp with avio_seek_time() is possible. + */ +#define AVIO_SEEKABLE_TIME (1 << 1) /** * Callback for checking whether to abort blocking functions. @@ -96,6 +104,48 @@ 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, + /** + * A point in the output bytestream where the underlying AVIOContext might + * flush the buffer depending on latency or buffering requirements. Typically + * means the end of a packet. + */ + AVIO_DATA_MARKER_FLUSH_POINT, +}; + /** * Bytestream IO Context. * New fields can be added to the end with minor version bumps. @@ -122,6 +172,57 @@ typedef struct AVIOContext { * to any av_opt_* functions in that case. */ const AVClass *av_class; + + /* + * The following shows the relationship between buffer, buf_ptr, + * buf_ptr_max, buf_end, buf_size, and pos, when reading and when writing + * (since AVIOContext is used for both): + * + ********************************************************************************** + * READING + ********************************************************************************** + * + * | buffer_size | + * |---------------------------------------| + * | | + * + * buffer buf_ptr buf_end + * +---------------+-----------------------+ + * |/ / / / / / / /|/ / / / / / /| | + * read buffer: |/ / consumed / | to be read /| | + * |/ / / / / / / /|/ / / / / / /| | + * +---------------+-----------------------+ + * + * pos + * +-------------------------------------------+-----------------+ + * input file: | | | + * +-------------------------------------------+-----------------+ + * + * + ********************************************************************************** + * WRITING + ********************************************************************************** + * + * | buffer_size | + * |--------------------------------------| + * | | + * + * buf_ptr_max + * buffer (buf_ptr) buf_end + * +-----------------------+--------------+ + * |/ / / / / / / / / / / /| | + * write buffer: | / / to be flushed / / | | + * |/ / / / / / / / / / / /| | + * +-----------------------+--------------+ + * buf_ptr can be in this + * due to a backward seek + * + * pos + * +-------------+----------------------------------------------+ + * output file: | | | + * +-------------+----------------------------------------------+ + * + */ unsigned char *buffer; /**< Start of the buffer. */ int buffer_size; /**< Maximum buffer size */ unsigned char *buf_ptr; /**< Current position in the buffer */ @@ -135,8 +236,7 @@ typedef struct AVIOContext { int (*write_packet)(void *opaque, uint8_t *buf, int buf_size); int64_t (*seek)(void *opaque, int64_t offset, int whence); int64_t pos; /**< position in the file of the current buffer */ - int must_flush; /**< true if the next seek should flush */ - int eof_reached; /**< true if eof reached */ + int eof_reached; /**< true if was unable to read due to error or eof */ int write_flag; /**< true if open for writing */ int max_packet_size; unsigned long checksum; @@ -202,9 +302,54 @@ 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; + + /** + * A callback that is used instead of short_seek_threshold. + * This is current internal only, do not use from outside. + */ + int (*short_seek_get)(void *opaque); + + int64_t written; + + /** + * Maximum reached position before a backward seek in the write buffer, + * used keeping track of already written data for a later flush. + */ + unsigned char *buf_ptr_max; + + /** + * Try to buffer at least this amount of data before flushing it + */ + int min_packet_size; +} AVIOContext; /** * Return the name of the protocol that will handle the passed URL. @@ -293,7 +438,7 @@ void avio_free_directory_entry(AVIODirEntry **entry); /** * Allocate and initialize an AVIOContext for buffered I/O. It must be later - * freed with av_free(). + * freed with avio_context_free(). * * @param buffer Memory block for input/output operations via AVIOContext. * The buffer must be allocated with av_malloc() and friends. @@ -306,6 +451,8 @@ void avio_free_directory_entry(AVIODirEntry **entry); * @param write_flag Set to 1 if the buffer should be writable, 0 otherwise. * @param opaque An opaque pointer to user-specific data. * @param read_packet A function for refilling the buffer, may be NULL. + * For stream protocols, must never return 0 but rather + * a proper AVERROR code. * @param write_packet A function for writing the buffer contents, may be NULL. * The function may not change the input buffers content. * @param seek A function for seeking to specified byte position, may be NULL. @@ -321,6 +468,14 @@ AVIOContext *avio_alloc_context( int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t (*seek)(void *opaque, int64_t offset, int whence)); +/** + * Free the supplied IO context and everything associated with it. + * + * @param s Double pointer to the IO context. This function will write NULL + * into s. + */ +void avio_context_free(AVIOContext **s); + void avio_w8(AVIOContext *s, int b); void avio_write(AVIOContext *s, const unsigned char *buf, int size); void avio_wl64(AVIOContext *s, uint64_t val); @@ -357,14 +512,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. @@ -399,19 +566,12 @@ static av_always_inline int64_t avio_tell(AVIOContext *s) int64_t avio_size(AVIOContext *s); /** - * feof() equivalent for AVIOContext. - * @return non zero if and only if end of file + * Similar to feof() but also returns nonzero on read errors. + * @return non zero if and only if at end of file or a read error happened when reading. */ int avio_feof(AVIOContext *s); -#if FF_API_URL_FEOF -/** - * @deprecated use avio_feof() - */ -attribute_deprecated -int url_feof(AVIOContext *s); -#endif -/** @warning currently size is limited */ +/** @warning Writes up to 4 KiB per call */ int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3); /** @@ -432,6 +592,15 @@ void avio_flush(AVIOContext *s); */ int avio_read(AVIOContext *s, unsigned char *buf, int size); +/** + * Read size bytes from AVIOContext into buf. Unlike avio_read(), this is allowed + * to read fewer bytes than requested. The missing bytes can be read in the next + * call. This always tries to read at least 1 byte. + * Useful to reduce latency in certain cases. + * @return number of bytes read or AVERROR + */ +int avio_read_partial(AVIOContext *s, unsigned char *buf, int size); + /** * @name Functions for reading from AVIOContext * @{ @@ -582,6 +751,18 @@ int avio_closep(AVIOContext **s); */ int avio_open_dyn_buf(AVIOContext **s); +/** + * Return the written size and a pointer to the buffer. + * The AVIOContext stream is left intact. + * The buffer must NOT be freed. + * No padding is added to the buffer. + * + * @param s IO context + * @param pbuffer pointer to a byte buffer + * @return the length of the byte buffer + */ +int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer); + /** * Return the written size and a pointer to the buffer. The buffer * must be freed with av_free(). diff --git a/neo/libs/ffmpeg-win64/include/libavformat/version.h b/neo/libs/ffmpeg-win64/include/libavformat/version.h index 44823603..22ed534b 100644 --- a/neo/libs/ffmpeg-win64/include/libavformat/version.h +++ b/neo/libs/ffmpeg-win64/include/libavformat/version.h @@ -29,8 +29,10 @@ #include "libavutil/version.h" -#define LIBAVFORMAT_VERSION_MAJOR 57 -#define LIBAVFORMAT_VERSION_MINOR 14 +// 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 58 +#define LIBAVFORMAT_VERSION_MINOR 29 #define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ @@ -53,21 +55,58 @@ * at once through the bump. This improves the git bisect-ability of the change. * */ -#ifndef FF_API_LAVF_BITEXACT -#define FF_API_LAVF_BITEXACT (LIBAVFORMAT_VERSION_MAJOR < 58) +#ifndef FF_API_COMPUTE_PKT_FIELDS2 +#define FF_API_COMPUTE_PKT_FIELDS2 (LIBAVFORMAT_VERSION_MAJOR < 59) #endif -#ifndef FF_API_LAVF_FRAC -#define FF_API_LAVF_FRAC (LIBAVFORMAT_VERSION_MAJOR < 58) +#ifndef FF_API_OLD_OPEN_CALLBACKS +#define FF_API_OLD_OPEN_CALLBACKS (LIBAVFORMAT_VERSION_MAJOR < 59) #endif -#ifndef FF_API_LAVF_CODEC_TB -#define FF_API_LAVF_CODEC_TB (LIBAVFORMAT_VERSION_MAJOR < 58) +#ifndef FF_API_LAVF_AVCTX +#define FF_API_LAVF_AVCTX (LIBAVFORMAT_VERSION_MAJOR < 59) #endif -#ifndef FF_API_URL_FEOF -#define FF_API_URL_FEOF (LIBAVFORMAT_VERSION_MAJOR < 58) +#ifndef FF_API_HTTP_USER_AGENT +#define FF_API_HTTP_USER_AGENT (LIBAVFORMAT_VERSION_MAJOR < 59) #endif -#ifndef FF_API_LAVF_FMT_RAWPICTURE -#define FF_API_LAVF_FMT_RAWPICTURE (LIBAVFORMAT_VERSION_MAJOR < 58) +#ifndef FF_API_HLS_WRAP +#define FF_API_HLS_WRAP (LIBAVFORMAT_VERSION_MAJOR < 59) #endif +#ifndef FF_API_HLS_USE_LOCALTIME +#define FF_API_HLS_USE_LOCALTIME (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LAVF_KEEPSIDE_FLAG +#define FF_API_LAVF_KEEPSIDE_FLAG (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_ROTATE_API +#define FF_API_OLD_ROTATE_API (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_FORMAT_GET_SET +#define FF_API_FORMAT_GET_SET (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_AVIO_EOF_0 +#define FF_API_OLD_AVIO_EOF_0 (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LAVF_FFSERVER +#define FF_API_LAVF_FFSERVER (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_FORMAT_FILENAME +#define FF_API_FORMAT_FILENAME (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_RTSP_OPTIONS +#define FF_API_OLD_RTSP_OPTIONS (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_NEXT +#define FF_API_NEXT (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_DASH_MIN_SEG_DURATION +#define FF_API_DASH_MIN_SEG_DURATION (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LAVF_MP4A_LATM +#define FF_API_LAVF_MP4A_LATM (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_AVIOFORMAT +#define FF_API_AVIOFORMAT (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif + #ifndef FF_API_R_FRAME_RATE #define FF_API_R_FRAME_RATE 1 diff --git a/neo/libs/ffmpeg-win64/include/libavutil/adler32.h b/neo/libs/ffmpeg-win64/include/libavutil/adler32.h index 0dc69ec0..a1f035b7 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/adler32.h +++ b/neo/libs/ffmpeg-win64/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/neo/libs/ffmpeg-win64/include/libavutil/aes_ctr.h b/neo/libs/ffmpeg-win64/include/libavutil/aes_ctr.h new file mode 100644 index 00000000..e4aae126 --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavutil/aes_ctr.h @@ -0,0 +1,88 @@ +/* + * AES-CTR cipher + * Copyright (c) 2015 Eran Kornblau + * + * 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_AES_CTR_H +#define AVUTIL_AES_CTR_H + +#include + +#include "attributes.h" +#include "version.h" + +#define AES_CTR_KEY_SIZE (16) +#define AES_CTR_IV_SIZE (8) + +struct AVAESCTR; + +/** + * Allocate an AVAESCTR context. + */ +struct AVAESCTR *av_aes_ctr_alloc(void); + +/** + * Initialize an AVAESCTR context. + * @param key encryption key, must have a length of AES_CTR_KEY_SIZE + */ +int av_aes_ctr_init(struct AVAESCTR *a, const uint8_t *key); + +/** + * Release an AVAESCTR context. + */ +void av_aes_ctr_free(struct AVAESCTR *a); + +/** + * Process a buffer using a previously initialized context. + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param size the size of src and dst + */ +void av_aes_ctr_crypt(struct AVAESCTR *a, uint8_t *dst, const uint8_t *src, int size); + +/** + * Get the current iv + */ +const uint8_t* av_aes_ctr_get_iv(struct AVAESCTR *a); + +/** + * Generate a random iv + */ +void av_aes_ctr_set_random_iv(struct AVAESCTR *a); + +/** + * Forcefully change the 8-byte iv + */ +void av_aes_ctr_set_iv(struct AVAESCTR *a, const uint8_t* iv); + +/** + * Forcefully change the "full" 16-byte iv, including the counter + */ +void av_aes_ctr_set_full_iv(struct AVAESCTR *a, const uint8_t* iv); + +/** + * Increment the top 64 bit of the iv (performed after each frame) + */ +void av_aes_ctr_increment_iv(struct AVAESCTR *a); + +/** + * @} + */ + +#endif /* AVUTIL_AES_CTR_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/attributes.h b/neo/libs/ffmpeg-win64/include/libavutil/attributes.h index 5c6b9dee..ced108aa 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/attributes.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/attributes.h @@ -66,19 +66,19 @@ # define av_noinline #endif -#if AV_GCC_VERSION_AT_LEAST(3,1) +#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) # define av_pure __attribute__((pure)) #else # define av_pure #endif -#if AV_GCC_VERSION_AT_LEAST(2,6) +#if AV_GCC_VERSION_AT_LEAST(2,6) || defined(__clang__) # define av_const __attribute__((const)) #else # define av_const #endif -#if AV_GCC_VERSION_AT_LEAST(4,3) +#if AV_GCC_VERSION_AT_LEAST(4,3) || defined(__clang__) # define av_cold __attribute__((cold)) #else # define av_cold @@ -121,8 +121,7 @@ #endif #endif - -#if defined(__GNUC__) +#if defined(__GNUC__) || defined(__clang__) # define av_unused __attribute__((unused)) #else # define av_unused @@ -133,25 +132,25 @@ * away. This is useful for variables accessed only from inline * assembler without the compiler being aware. */ -#if AV_GCC_VERSION_AT_LEAST(3,1) +#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) # define av_used __attribute__((used)) #else # define av_used #endif -#if AV_GCC_VERSION_AT_LEAST(3,3) +#if AV_GCC_VERSION_AT_LEAST(3,3) || defined(__clang__) # define av_alias __attribute__((may_alias)) #else # define av_alias #endif -#if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__) +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__INTEL_COMPILER) # define av_uninit(x) x=x #else # define av_uninit(x) x #endif -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) # define av_builtin_constant_p __builtin_constant_p # define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos))) #else @@ -159,7 +158,7 @@ # define av_printf_format(fmtpos, attrpos) #endif -#if AV_GCC_VERSION_AT_LEAST(2,5) +#if AV_GCC_VERSION_AT_LEAST(2,5) || defined(__clang__) # define av_noreturn __attribute__((noreturn)) #else # define av_noreturn diff --git a/neo/libs/ffmpeg-win64/include/libavutil/audio_fifo.h b/neo/libs/ffmpeg-win64/include/libavutil/audio_fifo.h index 24f91dab..d8a9194a 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/audio_fifo.h +++ b/neo/libs/ffmpeg-win64/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/neo/libs/ffmpeg-win64/include/libavutil/avassert.h b/neo/libs/ffmpeg-win64/include/libavutil/avassert.h index 41f5e0ee..9abeadea 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/avassert.h +++ b/neo/libs/ffmpeg-win64/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 operations 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/neo/libs/ffmpeg-win64/include/libavutil/avconfig.h b/neo/libs/ffmpeg-win64/include/libavutil/avconfig.h index 36a8cd14..c289fbb5 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/avconfig.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/avconfig.h @@ -1,7 +1,6 @@ -/* Generated by ffconf */ +/* Generated by ffmpeg configure */ #ifndef AVUTIL_AVCONFIG_H #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/neo/libs/ffmpeg-win64/include/libavutil/avstring.h b/neo/libs/ffmpeg-win64/include/libavutil/avstring.h index a46d0125..37dd4e2d 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/avstring.h +++ b/neo/libs/ffmpeg-win64/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); @@ -266,6 +266,11 @@ int av_strcasecmp(const char *a, const char *b); */ int av_strncasecmp(const char *a, const char *b, size_t n); +/** + * Locale-independent strings replace. + * @note This means only ASCII-range characters are replace + */ +char *av_strireplace(const char *str, const char *from, const char *to); /** * Thread safe basename. @@ -284,6 +289,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. @@ -390,6 +400,12 @@ int av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end, */ int av_match_list(const char *name, const char *list, char separator); +/** + * See libc sscanf manual for more information. + * Locale-independent sscanf implementation. + */ +int av_sscanf(const char *string, const char *format, ...); + /** * @} */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/avutil.h b/neo/libs/ffmpeg-win64/include/libavutil/avutil.h index 9bcf6741..4d633156 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/avutil.h +++ b/neo/libs/ffmpeg-win64/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 * @{ * * @} @@ -116,6 +118,12 @@ * * @} * + * @defgroup lavu_video Video related + * + * @{ + * + * @} + * * @defgroup lavu_audio Audio related * * @{ @@ -266,7 +274,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 @@ -335,6 +343,20 @@ FILE *av_fopen_utf8(const char *path, const char *mode); */ AVRational av_get_time_base_q(void); +#define AV_FOURCC_MAX_STRING_SIZE 32 + +#define av_fourcc2str(fourcc) av_fourcc_make_string((char[AV_FOURCC_MAX_STRING_SIZE]){0}, fourcc) + +/** + * Fill the provided buffer with a string containing a FourCC (four-character + * code) representation. + * + * @param buf a buffer with size in bytes of at least AV_FOURCC_MAX_STRING_SIZE + * @param fourcc the fourcc to represent + * @return the buffer in input + */ +char *av_fourcc_make_string(char *buf, uint32_t fourcc); + /** * @} * @} diff --git a/neo/libs/ffmpeg-win64/include/libavutil/base64.h b/neo/libs/ffmpeg-win64/include/libavutil/base64.h index 514498ea..2954c12d 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/base64.h +++ b/neo/libs/ffmpeg-win64/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/neo/libs/ffmpeg-win64/include/libavutil/buffer.h b/neo/libs/ffmpeg-win64/include/libavutil/buffer.h index b4399fd3..73b6bd0b 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/buffer.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/buffer.h @@ -248,6 +248,24 @@ 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_uninit() is called + * by the caller 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 +273,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/neo/libs/ffmpeg-win64/include/libavutil/channel_layout.h b/neo/libs/ffmpeg-win64/include/libavutil/channel_layout.h index ec7effea..50bb8f03 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/channel_layout.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/channel_layout.h @@ -131,21 +131,30 @@ enum AVMatrixEncoding { * 5.0(side), 5.1, 5.1(side), 7.1, 7.1(wide), downmix); * - the name of a single channel (FL, FR, FC, LFE, BL, BR, FLC, FRC, BC, * SL, SR, TC, TFL, TFC, TFR, TBL, TBC, TBR, DL, DR); - * - a number of channels, in decimal, optionally followed by 'c', yielding + * - a number of channels, in decimal, followed by 'c', yielding * the default channel layout for that number of channels (@see * av_get_default_channel_layout); * - a channel layout mask, in hexadecimal starting with "0x" (see the * AV_CH_* macros). * - * @warning Starting from the next major bump the trailing character - * 'c' to specify a number of channels will be required, while a - * channel layout mask could also be specified as a decimal number - * (if and only if not followed by "c"). - * * Example: "stereo+FC" = "2c+FC" = "2c+1c" = "0x7" */ uint64_t av_get_channel_layout(const char *name); +/** + * Return a channel layout and the number of channels based on the specified name. + * + * This function is similar to (@see av_get_channel_layout), but can also parse + * unknown channel layout specifications. + * + * @param[in] name channel layout specification string + * @param[out] channel_layout parsed channel layout (0 if unknown) + * @param[out] nb_channels number of channels + * + * @return 0 on success, AVERROR(EINVAL) if the parsing fails. + */ +int av_get_extended_channel_layout(const char *name, uint64_t* channel_layout, int* nb_channels); + /** * Return a description of a channel layout. * If nb_channels is <= 0, it is guessed from the channel_layout. diff --git a/neo/libs/ffmpeg-win64/include/libavutil/common.h b/neo/libs/ffmpeg-win64/include/libavutil/common.h index 6f0f5827..8db02911 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/common.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/common.h @@ -40,6 +40,7 @@ #include #include "attributes.h" +#include "macros.h" #include "version.h" #include "libavutil/avconfig.h" @@ -53,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)) @@ -94,7 +98,6 @@ #define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0) #define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0])) -#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1)) /* misc math functions */ @@ -155,7 +158,7 @@ static av_always_inline av_const int64_t av_clip64_c(int64_t a, int64_t amin, in */ static av_always_inline av_const uint8_t av_clip_uint8_c(int a) { - if (a&(~0xFF)) return (-a)>>31; + if (a&(~0xFF)) return (~a)>>31; else return a; } @@ -177,7 +180,7 @@ static av_always_inline av_const int8_t av_clip_int8_c(int a) */ static av_always_inline av_const uint16_t av_clip_uint16_c(int a) { - if (a&(~0xFFFF)) return (-a)>>31; + if (a&(~0xFFFF)) return (~a)>>31; else return a; } @@ -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; @@ -225,7 +228,7 @@ static av_always_inline av_const int av_clip_intp2_c(int a, int p) */ static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p) { - if (a & ~((1<> 31 & ((1<> 31 & ((1<> 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 +383,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;\ @@ -505,6 +537,12 @@ static av_always_inline av_const int av_popcount64_c(uint64_t x) #ifndef av_sat_dadd32 # define av_sat_dadd32 av_sat_dadd32_c #endif +#ifndef av_sat_sub32 +# define av_sat_sub32 av_sat_sub32_c +#endif +#ifndef av_sat_dsub32 +# define av_sat_dsub32 av_sat_dsub32_c +#endif #ifndef av_clipf # define av_clipf av_clipf_c #endif @@ -517,3 +555,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/neo/libs/ffmpeg-win64/include/libavutil/cpu.h b/neo/libs/ffmpeg-win64/include/libavutil/cpu.h index bff8518c..8bb9eb60 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/cpu.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/cpu.h @@ -21,6 +21,8 @@ #ifndef AVUTIL_CPU_H #define AVUTIL_CPU_H +#include + #include "attributes.h" #define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */ @@ -39,6 +41,7 @@ #define AV_CPU_FLAG_SSE3SLOW 0x20000000 ///< SSE3 supported, but usually not faster ///< than regular MMX/SSE (e.g. Core1) #define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions +#define AV_CPU_FLAG_SSSE3SLOW 0x4000000 ///< SSSE3 supported, but usually not faster #define AV_CPU_FLAG_ATOM 0x10000000 ///< Atom processor, some SSSE3 instructions are slower #define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions #define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions @@ -52,6 +55,7 @@ #define AV_CPU_FLAG_FMA3 0x10000 ///< Haswell FMA3 functions #define AV_CPU_FLAG_BMI1 0x20000 ///< Bit Manipulation Instruction Set 1 #define AV_CPU_FLAG_BMI2 0x40000 ///< Bit Manipulation Instruction Set 2 +#define AV_CPU_FLAG_AVX512 0x100000 ///< AVX-512 functions: requires OS support even if YMM/ZMM registers aren't used #define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard #define AV_CPU_FLAG_VSX 0x0002 ///< ISA 2.06 @@ -64,12 +68,13 @@ #define AV_CPU_FLAG_VFPV3 (1 << 4) #define AV_CPU_FLAG_NEON (1 << 5) #define AV_CPU_FLAG_ARMV8 (1 << 6) +#define AV_CPU_FLAG_VFP_VM (1 << 7) ///< VFPv2 vector mode, deprecated in ARMv7-A and unavailable in various CPUs implementations #define AV_CPU_FLAG_SETEND (1 <<16) /** * 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); @@ -84,8 +89,6 @@ void av_force_cpu_flags(int flags); * Set a mask on flags returned by av_get_cpu_flags(). * This function is mainly useful for testing. * Please use av_force_cpu_flags() and av_get_cpu_flags() instead which are more flexible - * - * @warning this function is not thread safe. */ attribute_deprecated void av_set_cpu_flags_mask(int mask); @@ -113,4 +116,15 @@ int av_parse_cpu_caps(unsigned *flags, const char *s); */ int av_cpu_count(void); +/** + * Get the maximum data alignment that may be required by FFmpeg. + * + * Note that this is affected by the build configuration and the CPU flags mask, + * so e.g. if the CPU supports AVX, but libavutil has been built with + * --disable-avx or the AV_CPU_FLAG_AVX flag has been disabled through + * av_set_cpu_flags_mask(), then this function will behave as if AVX is not + * present. + */ +size_t av_cpu_max_align(void); + #endif /* AVUTIL_CPU_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/crc.h b/neo/libs/ffmpeg-win64/include/libavutil/crc.h index e86bf1de..47e22b4c 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/crc.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/crc.h @@ -18,16 +18,29 @@ * 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 #include #include #include "attributes.h" +#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. + * * @{ */ @@ -40,7 +53,8 @@ typedef enum { AV_CRC_32_IEEE, AV_CRC_32_IEEE_LE, /*< reversed bitorder version of AV_CRC_32_IEEE */ AV_CRC_16_ANSI_LE, /*< reversed bitorder version of AV_CRC_16_ANSI */ - AV_CRC_24_IEEE = 12, + AV_CRC_24_IEEE, + AV_CRC_8_EBU, AV_CRC_MAX, /*< Not part of public API! Do not use outside libavutil. */ }AVCRCId; diff --git a/neo/libs/ffmpeg-win64/include/libavutil/dict.h b/neo/libs/ffmpeg-win64/include/libavutil/dict.h index 5b8d0033..118f1f00 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/dict.h +++ b/neo/libs/ffmpeg-win64/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/neo/libs/ffmpeg-win64/include/libavutil/display.h b/neo/libs/ffmpeg-win64/include/libavutil/display.h index c0cfee32..515adad7 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/display.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/display.h @@ -18,21 +18,38 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/** + * @file + * Display matrix + */ + #ifndef AVUTIL_DISPLAY_H #define AVUTIL_DISPLAY_H #include +#include "common.h" /** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_display Display transformation matrix functions + * @{ + */ + +/** + * @addtogroup lavu_video_display * The display transformation matrix specifies an affine transformation that * should be applied to video frames for correct presentation. It is compatible * with the matrices stored in the ISO/IEC 14496-12 container format. * * The data is a 3x3 matrix represented as a 9-element array: * + * @code{.unparsed} * | a b u | * (a, b, u, c, d, v, x, y, w) -> | c d v | * | x y w | + * @endcode * * All numbers are stored in native endianness, as 16.16 fixed-point values, * except for u, v and w, which are stored as 2.30 fixed-point values. @@ -40,15 +57,21 @@ * The transformation maps a point (p, q) in the source (pre-transformation) * frame to the point (p', q') in the destination (post-transformation) frame as * follows: + * + * @code{.unparsed} * | a b u | * (p, q, 1) . | c d v | = z * (p', q', 1) * | x y w | + * @endcode * * The transformation can also be more explicitly written in components as * follows: + * + * @code{.unparsed} * p' = (a * p + c * q + x) / z; * q' = (b * p + d * q + y) / z; * z = u * p + v * q + w + * @endcode */ /** @@ -83,4 +106,9 @@ void av_display_rotation_set(int32_t matrix[9], double angle); */ void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip); +/** + * @} + * @} + */ + #endif /* AVUTIL_DISPLAY_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/encryption_info.h b/neo/libs/ffmpeg-win64/include/libavutil/encryption_info.h new file mode 100644 index 00000000..8fe7ebfe --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavutil/encryption_info.h @@ -0,0 +1,205 @@ +/** + * 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_ENCRYPTION_INFO_H +#define AVUTIL_ENCRYPTION_INFO_H + +#include +#include + +typedef struct AVSubsampleEncryptionInfo { + /** The number of bytes that are clear. */ + unsigned int bytes_of_clear_data; + + /** + * The number of bytes that are protected. If using pattern encryption, + * the pattern applies to only the protected bytes; if not using pattern + * encryption, all these bytes are encrypted. + */ + unsigned int bytes_of_protected_data; +} AVSubsampleEncryptionInfo; + +/** + * This describes encryption info for a packet. This contains frame-specific + * info for how to decrypt the packet before passing it to the decoder. + * + * The size of this struct is not part of the public ABI. + */ +typedef struct AVEncryptionInfo { + /** The fourcc encryption scheme, in big-endian byte order. */ + uint32_t scheme; + + /** + * Only used for pattern encryption. This is the number of 16-byte blocks + * that are encrypted. + */ + uint32_t crypt_byte_block; + + /** + * Only used for pattern encryption. This is the number of 16-byte blocks + * that are clear. + */ + uint32_t skip_byte_block; + + /** + * The ID of the key used to encrypt the packet. This should always be + * 16 bytes long, but may be changed in the future. + */ + uint8_t *key_id; + uint32_t key_id_size; + + /** + * The initialization vector. This may have been zero-filled to be the + * correct block size. This should always be 16 bytes long, but may be + * changed in the future. + */ + uint8_t *iv; + uint32_t iv_size; + + /** + * An array of subsample encryption info specifying how parts of the sample + * are encrypted. If there are no subsamples, then the whole sample is + * encrypted. + */ + AVSubsampleEncryptionInfo *subsamples; + uint32_t subsample_count; +} AVEncryptionInfo; + +/** + * This describes info used to initialize an encryption key system. + * + * The size of this struct is not part of the public ABI. + */ +typedef struct AVEncryptionInitInfo { + /** + * A unique identifier for the key system this is for, can be NULL if it + * is not known. This should always be 16 bytes, but may change in the + * future. + */ + uint8_t* system_id; + uint32_t system_id_size; + + /** + * An array of key IDs this initialization data is for. All IDs are the + * same length. Can be NULL if there are no known key IDs. + */ + uint8_t** key_ids; + /** The number of key IDs. */ + uint32_t num_key_ids; + /** + * The number of bytes in each key ID. This should always be 16, but may + * change in the future. + */ + uint32_t key_id_size; + + /** + * Key-system specific initialization data. This data is copied directly + * from the file and the format depends on the specific key system. This + * can be NULL if there is no initialization data; in that case, there + * will be at least one key ID. + */ + uint8_t* data; + uint32_t data_size; + + /** + * An optional pointer to the next initialization info in the list. + */ + struct AVEncryptionInitInfo *next; +} AVEncryptionInitInfo; + +/** + * Allocates an AVEncryptionInfo structure and sub-pointers to hold the given + * number of subsamples. This will allocate pointers for the key ID, IV, + * and subsample entries, set the size members, and zero-initialize the rest. + * + * @param subsample_count The number of subsamples. + * @param key_id_size The number of bytes in the key ID, should be 16. + * @param iv_size The number of bytes in the IV, should be 16. + * + * @return The new AVEncryptionInfo structure, or NULL on error. + */ +AVEncryptionInfo *av_encryption_info_alloc(uint32_t subsample_count, uint32_t key_id_size, uint32_t iv_size); + +/** + * Allocates an AVEncryptionInfo structure with a copy of the given data. + * @return The new AVEncryptionInfo structure, or NULL on error. + */ +AVEncryptionInfo *av_encryption_info_clone(const AVEncryptionInfo *info); + +/** + * Frees the given encryption info object. This MUST NOT be used to free the + * side-data data pointer, that should use normal side-data methods. + */ +void av_encryption_info_free(AVEncryptionInfo *info); + +/** + * Creates a copy of the AVEncryptionInfo that is contained in the given side + * data. The resulting object should be passed to av_encryption_info_free() + * when done. + * + * @return The new AVEncryptionInfo structure, or NULL on error. + */ +AVEncryptionInfo *av_encryption_info_get_side_data(const uint8_t *side_data, size_t side_data_size); + +/** + * Allocates and initializes side data that holds a copy of the given encryption + * info. The resulting pointer should be either freed using av_free or given + * to av_packet_add_side_data(). + * + * @return The new side-data pointer, or NULL. + */ +uint8_t *av_encryption_info_add_side_data( + const AVEncryptionInfo *info, size_t *side_data_size); + + +/** + * Allocates an AVEncryptionInitInfo structure and sub-pointers to hold the + * given sizes. This will allocate pointers and set all the fields. + * + * @return The new AVEncryptionInitInfo structure, or NULL on error. + */ +AVEncryptionInitInfo *av_encryption_init_info_alloc( + uint32_t system_id_size, uint32_t num_key_ids, uint32_t key_id_size, uint32_t data_size); + +/** + * Frees the given encryption init info object. This MUST NOT be used to free + * the side-data data pointer, that should use normal side-data methods. + */ +void av_encryption_init_info_free(AVEncryptionInitInfo* info); + +/** + * Creates a copy of the AVEncryptionInitInfo that is contained in the given + * side data. The resulting object should be passed to + * av_encryption_init_info_free() when done. + * + * @return The new AVEncryptionInitInfo structure, or NULL on error. + */ +AVEncryptionInitInfo *av_encryption_init_info_get_side_data( + const uint8_t* side_data, size_t side_data_size); + +/** + * Allocates and initializes side data that holds a copy of the given encryption + * init info. The resulting pointer should be either freed using av_free or + * given to av_packet_add_side_data(). + * + * @return The new side-data pointer, or NULL. + */ +uint8_t *av_encryption_init_info_add_side_data( + const AVEncryptionInitInfo *info, size_t *side_data_size); + +#endif /* AVUTIL_ENCRYPTION_INFO_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/ffversion.h b/neo/libs/ffmpeg-win64/include/libavutil/ffversion.h index e6c73222..e5c2702c 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/ffversion.h +++ b/neo/libs/ffmpeg-win64/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 "N-76479-gc878082" +#define FFMPEG_VERSION "4.2.2" #endif /* AVUTIL_FFVERSION_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/file.h b/neo/libs/ffmpeg-win64/include/libavutil/file.h index e931be71..3ef4a602 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/file.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/file.h @@ -33,6 +33,8 @@ * allocated buffer or map it with mmap() when available. * In case of success set *bufptr to the read or mmapped buffer, and * *size to the size in bytes of the buffer in *bufptr. + * Unlike mmap this function succeeds with zero sized files, in this + * case *bufptr will be set to NULL and *size will be set to 0. * The returned buffer must be released with av_file_unmap(). * * @param log_offset loglevel offset used for logging @@ -62,6 +64,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/neo/libs/ffmpeg-win64/include/libavutil/frame.h b/neo/libs/ffmpeg-win64/include/libavutil/frame.h index 9c6061a1..5d3231e7 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/frame.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/frame.h @@ -1,5 +1,4 @@ /* - * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or @@ -26,6 +25,7 @@ #ifndef AVUTIL_FRAME_H #define AVUTIL_FRAME_H +#include #include #include "avutil.h" @@ -106,12 +106,79 @@ 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, + + /** + * The data represents the AVSphericalMapping structure defined in + * libavutil/spherical.h. + */ + AV_FRAME_DATA_SPHERICAL, + + /** + * Content light level (based on CTA-861.3). This payload contains data in + * the form of the AVContentLightMetadata struct. + */ + AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, + + /** + * The data contains an ICC profile as an opaque octet buffer following the + * format described by ISO 15076-1 with an optional name defined in the + * metadata key entry "name". + */ + AV_FRAME_DATA_ICC_PROFILE, + +#if FF_API_FRAME_QP + /** + * Implementation-specific description of the format of AV_FRAME_QP_TABLE_DATA. + * The contents of this side data are undocumented and internal; use + * av_frame_set_qp_table() and av_frame_get_qp_table() to access this in a + * meaningful way instead. + */ + AV_FRAME_DATA_QP_TABLE_PROPERTIES, + + /** + * Raw QP table data. Its format is described by + * AV_FRAME_DATA_QP_TABLE_PROPERTIES. Use av_frame_set_qp_table() and + * av_frame_get_qp_table() to access this instead. + */ + AV_FRAME_DATA_QP_TABLE_DATA, +#endif + + /** + * Timecode which conforms to SMPTE ST 12-1. The data is an array of 4 uint32_t + * where the first uint32_t describes how many (1-3) of the other timecodes are used. + * The timecode format is described in the av_timecode_get_smpte_from_framenum() + * function in libavutil/timecode.c. + */ + AV_FRAME_DATA_S12M_TIMECODE, + + /** + * HDR dynamic metadata associated with a video frame. The payload is + * an AVDynamicHDRPlus type and contains information for color + * volume transform - application 4 of SMPTE 2094-40:2016 standard. + */ + AV_FRAME_DATA_DYNAMIC_HDR_PLUS, + + /** + * Regions Of Interest, the data is an array of AVRegionOfInterest type, the number of + * array element is implied by AVFrameSideData.size / AVRegionOfInterest.self_size. + */ + AV_FRAME_DATA_REGIONS_OF_INTEREST, }; enum AVActiveFormatDescription { @@ -139,6 +206,62 @@ typedef struct AVFrameSideData { AVBufferRef *buf; } AVFrameSideData; +/** + * Structure describing a single Region Of Interest. + * + * When multiple regions are defined in a single side-data block, they + * should be ordered from most to least important - some encoders are only + * capable of supporting a limited number of distinct regions, so will have + * to truncate the list. + * + * When overlapping regions are defined, the first region containing a given + * area of the frame applies. + */ +typedef struct AVRegionOfInterest { + /** + * Must be set to the size of this data structure (that is, + * sizeof(AVRegionOfInterest)). + */ + uint32_t self_size; + /** + * Distance in pixels from the top edge of the frame to the top and + * bottom edges and from the left edge of the frame to the left and + * right edges of the rectangle defining this region of interest. + * + * The constraints on a region are encoder dependent, so the region + * actually affected may be slightly larger for alignment or other + * reasons. + */ + int top; + int bottom; + int left; + int right; + /** + * Quantisation offset. + * + * Must be in the range -1 to +1. A value of zero indicates no quality + * change. A negative value asks for better quality (less quantisation), + * while a positive value asks for worse quality (greater quantisation). + * + * The range is calibrated so that the extreme values indicate the + * largest possible offset - if the rest of the frame is encoded with the + * worst possible quality, an offset of -1 indicates that this region + * should be encoded with the best possible quality anyway. Intermediate + * values are then interpolated in some codec-dependent way. + * + * For example, in 10-bit H.264 the quantisation parameter varies between + * -12 and 51. A typical qoffset value of -1/10 therefore indicates that + * this region should be encoded with a QP around one-tenth of the full + * range better than the rest of the frame. So, if most of the frame + * were to be encoded with a QP of around 30, this region would get a QP + * of around 24 (an offset of approximately -1/10 * (51 - -12) = -6.3). + * An extreme value of -1 would indicate that this region should be + * encoded with the best possible quality regardless of the treatment of + * the rest of the frame - that is, should be encoded at a QP of -12. + */ + AVRational qoffset; +} AVRegionOfInterest; + /** * This structure describes decoded (raw) audio or video data. * @@ -164,9 +287,10 @@ typedef struct AVFrameSideData { * * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added * to the end with a minor bump. - * 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 +302,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]; @@ -215,9 +342,18 @@ typedef struct AVFrame { uint8_t **extended_data; /** - * width and height of the video frame + * @name Video dimensions + * Video frames only. The coded dimensions (in pixels) of the video frame, + * i.e. the size of the rectangle that contains some well-defined values. + * + * @note The part of the frame intended for display/presentation is further + * restricted by the @ref cropping "Cropping rectangle". + * @{ */ int width, height; + /** + * @} + */ /** * number of audio samples (per channel) described by this frame @@ -251,10 +387,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,13 +452,12 @@ 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, * the decoder reorders values as needed and sets AVFrame.reordered_opaque * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque - * @deprecated in favor of pkt_pts */ int64_t reordered_opaque; @@ -369,6 +508,7 @@ typedef struct AVFrame { /** * @defgroup lavu_frame_flags AV_FRAME_FLAGS + * @ingroup lavu_frame * Flags describing additional frame properties. * * @{ @@ -378,6 +518,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) /** * @} */ @@ -389,8 +533,6 @@ typedef struct AVFrame { /** * MPEG vs JPEG YUV range. - * It must be accessed using av_frame_get_color_range() and - * av_frame_set_color_range(). * - encoding: Set by user * - decoding: Set by libavcodec */ @@ -402,8 +544,6 @@ typedef struct AVFrame { /** * YUV colorspace type. - * It must be accessed using av_frame_get_colorspace() and - * av_frame_set_colorspace(). * - encoding: Set by user * - decoding: Set by libavcodec */ @@ -413,8 +553,6 @@ typedef struct AVFrame { /** * frame timestamp estimated using various heuristics, in stream time base - * Code outside libavutil should access this field using: - * av_frame_get_best_effort_timestamp(frame) * - encoding: unused * - decoding: set by libavcodec, read by user. */ @@ -422,8 +560,6 @@ typedef struct AVFrame { /** * reordered pos from the last AVPacket that has been input into the decoder - * Code outside libavutil should access this field using: - * av_frame_get_pkt_pos(frame) * - encoding: unused * - decoding: Read by user. */ @@ -432,8 +568,6 @@ typedef struct AVFrame { /** * duration of the corresponding packet, expressed in * AVStream->time_base units, 0 if unknown. - * Code outside libavutil should access this field using: - * av_frame_get_pkt_duration(frame) * - encoding: unused * - decoding: Read by user. */ @@ -441,8 +575,6 @@ typedef struct AVFrame { /** * metadata. - * Code outside libavutil should access this field using: - * av_frame_get_metadata(frame) * - encoding: Set by user. * - decoding: Set by libavcodec. */ @@ -452,19 +584,17 @@ typedef struct AVFrame { * decode error flags of the frame, set to a combination of * FF_DECODE_ERROR_xxx flags if the decoder produced a frame, but there * were errors during the decoding. - * Code outside libavutil should access this field using: - * av_frame_get_decode_error_flags(frame) * - encoding: unused * - decoding: set by libavcodec, read by user. */ int decode_error_flags; #define FF_DECODE_ERROR_INVALID_BITSTREAM 1 #define FF_DECODE_ERROR_MISSING_REFERENCE 2 +#define FF_DECODE_ERROR_CONCEALMENT_ACTIVE 4 +#define FF_DECODE_ERROR_DECODE_SLICES 8 /** * number of audio channels, only used for audio. - * Code outside libavutil should access this field using: - * av_frame_get_channels(frame) * - encoding: unused * - decoding: Read by user. */ @@ -472,8 +602,7 @@ typedef struct AVFrame { /** * size of the corresponding packet containing the compressed - * frame. It must be accessed using av_frame_get_pkt_size() and - * av_frame_set_pkt_size(). + * frame. * It is set to a negative value if unknown. * - encoding: unused * - decoding: set by libavcodec, read by user. @@ -483,13 +612,11 @@ typedef struct AVFrame { #if FF_API_FRAME_QP /** * QP table - * Not to be accessed directly from outside libavutil */ attribute_deprecated int8_t *qscale_table; /** * QP store stride - * Not to be accessed directly from outside libavutil */ attribute_deprecated int qstride; @@ -497,45 +624,112 @@ typedef struct AVFrame { attribute_deprecated int qscale_type; - /** - * Not to be accessed directly from outside libavutil - */ + attribute_deprecated AVBufferRef *qp_table_buf; #endif + /** + * For hwaccel-format frames, this should be a reference to the + * AVHWFramesContext describing the frame. + */ + AVBufferRef *hw_frames_ctx; + + /** + * AVBufferRef for free use by the API user. FFmpeg will never check the + * contents of the buffer ref. FFmpeg calls av_buffer_unref() on it when + * the frame is unreferenced. av_frame_copy_props() calls create a new + * reference with av_buffer_ref() for the target frame's opaque_ref field. + * + * This is unrelated to the opaque field, although it serves a similar + * purpose. + */ + AVBufferRef *opaque_ref; + + /** + * @anchor cropping + * @name Cropping + * Video frames only. The number of pixels to discard from the the + * top/bottom/left/right border of the frame to obtain the sub-rectangle of + * the frame intended for presentation. + * @{ + */ + size_t crop_top; + size_t crop_bottom; + size_t crop_left; + size_t crop_right; + /** + * @} + */ + + /** + * AVBufferRef for internal use by a single libav* library. + * Must not be used to transfer data between libraries. + * Has to be NULL when ownership of the frame leaves the respective library. + * + * Code outside the FFmpeg libs should never check or change the contents of the buffer ref. + * + * FFmpeg calls av_buffer_unref() on it when the frame is unreferenced. + * av_frame_copy_props() calls create a new reference with av_buffer_ref() + * for the target frame's private_ref field. + */ + AVBufferRef *private_ref; } AVFrame; +#if FF_API_FRAME_GET_SET /** - * Accessors for some AVFrame fields. - * The position of these field in the structure is not part of the ABI, - * they should not be accessed directly outside libavutil. + * Accessors for some AVFrame fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. */ +attribute_deprecated int64_t av_frame_get_best_effort_timestamp(const AVFrame *frame); +attribute_deprecated void av_frame_set_best_effort_timestamp(AVFrame *frame, int64_t val); +attribute_deprecated int64_t av_frame_get_pkt_duration (const AVFrame *frame); +attribute_deprecated void av_frame_set_pkt_duration (AVFrame *frame, int64_t val); +attribute_deprecated int64_t av_frame_get_pkt_pos (const AVFrame *frame); +attribute_deprecated void av_frame_set_pkt_pos (AVFrame *frame, int64_t val); +attribute_deprecated int64_t av_frame_get_channel_layout (const AVFrame *frame); +attribute_deprecated void av_frame_set_channel_layout (AVFrame *frame, int64_t val); +attribute_deprecated int av_frame_get_channels (const AVFrame *frame); +attribute_deprecated void av_frame_set_channels (AVFrame *frame, int val); +attribute_deprecated int av_frame_get_sample_rate (const AVFrame *frame); +attribute_deprecated void av_frame_set_sample_rate (AVFrame *frame, int val); +attribute_deprecated AVDictionary *av_frame_get_metadata (const AVFrame *frame); +attribute_deprecated void av_frame_set_metadata (AVFrame *frame, AVDictionary *val); +attribute_deprecated int av_frame_get_decode_error_flags (const AVFrame *frame); +attribute_deprecated void av_frame_set_decode_error_flags (AVFrame *frame, int val); +attribute_deprecated int av_frame_get_pkt_size(const AVFrame *frame); +attribute_deprecated void av_frame_set_pkt_size(AVFrame *frame, int val); -AVDictionary **avpriv_frame_get_metadatap(AVFrame *frame); #if FF_API_FRAME_QP +attribute_deprecated int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type); +attribute_deprecated int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int type); #endif +attribute_deprecated enum AVColorSpace av_frame_get_colorspace(const AVFrame *frame); +attribute_deprecated void av_frame_set_colorspace(AVFrame *frame, enum AVColorSpace val); +attribute_deprecated enum AVColorRange av_frame_get_color_range(const AVFrame *frame); +attribute_deprecated void av_frame_set_color_range(AVFrame *frame, enum AVColorRange val); +#endif /** * Get the name of a colorspace. @@ -573,6 +767,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 +791,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,8 +810,14 @@ 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 + * @param align Required buffer size alignment. If equal to 0, alignment will be + * chosen automatically for the current CPU. It is highly + * recommended to pass 0 here unless you know what you are doing. * * @return 0 on success, a negative AVERROR on error. */ @@ -688,6 +896,22 @@ AVFrameSideData *av_frame_new_side_data(AVFrame *frame, enum AVFrameSideDataType type, int size); +/** + * Add a new side data to a frame from an existing AVBufferRef + * + * @param frame a frame to which the side data should be added + * @param type the type of the added side data + * @param buf an AVBufferRef to add as side data. The ownership of + * the reference is transferred to the frame. + * + * @return newly added side data on success, NULL on error. On failure + * the frame is unchanged and the AVBufferRef remains owned by + * the caller. + */ +AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame, + enum AVFrameSideDataType type, + AVBufferRef *buf); + /** * @return a pointer to the side data of a given type on success, NULL if there * is no side data with such type in this frame. @@ -701,6 +925,40 @@ AVFrameSideData *av_frame_get_side_data(const AVFrame *frame, */ void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type); + +/** + * Flags for frame cropping. + */ +enum { + /** + * Apply the maximum possible cropping, even if it requires setting the + * AVFrame.data[] entries to unaligned pointers. Passing unaligned data + * to FFmpeg API is generally not allowed, and causes undefined behavior + * (such as crashes). You can pass unaligned data only to FFmpeg APIs that + * are explicitly documented to accept it. Use this flag only if you + * absolutely know what you are doing. + */ + AV_FRAME_CROP_UNALIGNED = 1 << 0, +}; + +/** + * Crop the given video AVFrame according to its crop_left/crop_top/crop_right/ + * crop_bottom fields. If cropping is successful, the function will adjust the + * data pointers and the width/height fields, and set the crop fields to 0. + * + * In all cases, the cropping boundaries will be rounded to the inherent + * alignment of the pixel format. In some cases, such as for opaque hwaccel + * formats, the left/top cropping is ignored. The crop fields are set to 0 even + * if the cropping was rounded or ignored. + * + * @param frame the frame which should be cropped + * @param flags Some combination of AV_FRAME_CROP_* flags, or 0. + * + * @return >= 0 on success, a negative AVERROR on error. If the cropping fields + * were invalid, AVERROR(ERANGE) is returned, and nothing is changed. + */ +int av_frame_apply_cropping(AVFrame *frame, int flags); + /** * @return a string identifying the side data type */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/hash.h b/neo/libs/ffmpeg-win64/include/libavutil/hash.h index d4bcbf8c..7693e6bf 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/hash.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/hash.h @@ -18,18 +18,110 @@ * 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 +#include "version.h" + +/** + * @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 +130,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 +141,129 @@ 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 */ +#if FF_API_CRYPTO_SIZE_T void av_hash_update(struct AVHashContext *ctx, const uint8_t *src, int len); +#else +void av_hash_update(struct AVHashContext *ctx, const uint8_t *src, size_t len); +#endif /** * 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/neo/libs/ffmpeg-win64/include/libavutil/hdr_dynamic_metadata.h b/neo/libs/ffmpeg-win64/include/libavutil/hdr_dynamic_metadata.h new file mode 100644 index 00000000..2d72de56 --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavutil/hdr_dynamic_metadata.h @@ -0,0 +1,343 @@ +/* + * Copyright (c) 2018 Mohammad Izadi + * + * 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_HDR_DYNAMIC_METADATA_H +#define AVUTIL_HDR_DYNAMIC_METADATA_H + +#include "frame.h" +#include "rational.h" + +/** + * Option for overlapping elliptical pixel selectors in an image. + */ +enum AVHDRPlusOverlapProcessOption { + AV_HDR_PLUS_OVERLAP_PROCESS_WEIGHTED_AVERAGING = 0, + AV_HDR_PLUS_OVERLAP_PROCESS_LAYERING = 1, +}; + +/** + * Represents the percentile at a specific percentage in + * a distribution. + */ +typedef struct AVHDRPlusPercentile { + /** + * The percentage value corresponding to a specific percentile linearized + * RGB value in the processing window in the scene. The value shall be in + * the range of 0 to100, inclusive. + */ + uint8_t percentage; + + /** + * The linearized maxRGB value at a specific percentile in the processing + * window in the scene. The value shall be in the range of 0 to 1, inclusive + * and in multiples of 0.00001. + */ + AVRational percentile; +} AVHDRPlusPercentile; + +/** + * Color transform parameters at a processing window in a dynamic metadata for + * SMPTE 2094-40. + */ +typedef struct AVHDRPlusColorTransformParams { + /** + * The relative x coordinate of the top left pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(width of Picture - 1). The value 1 corresponds + * to the absolute coordinate of width of Picture - 1. The value for + * first processing window shall be 0. + */ + AVRational window_upper_left_corner_x; + + /** + * The relative y coordinate of the top left pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(height of Picture - 1). The value 1 corresponds + * to the absolute coordinate of height of Picture - 1. The value for + * first processing window shall be 0. + */ + AVRational window_upper_left_corner_y; + + /** + * The relative x coordinate of the bottom right pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(width of Picture - 1). The value 1 corresponds + * to the absolute coordinate of width of Picture - 1. The value for + * first processing window shall be 1. + */ + AVRational window_lower_right_corner_x; + + /** + * The relative y coordinate of the bottom right pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(height of Picture - 1). The value 1 corresponds + * to the absolute coordinate of height of Picture - 1. The value for + * first processing window shall be 1. + */ + AVRational window_lower_right_corner_y; + + /** + * The x coordinate of the center position of the concentric internal and + * external ellipses of the elliptical pixel selector in the processing + * window. The value shall be in the range of 0 to (width of Picture - 1), + * inclusive and in multiples of 1 pixel. + */ + uint16_t center_of_ellipse_x; + + /** + * The y coordinate of the center position of the concentric internal and + * external ellipses of the elliptical pixel selector in the processing + * window. The value shall be in the range of 0 to (height of Picture - 1), + * inclusive and in multiples of 1 pixel. + */ + uint16_t center_of_ellipse_y; + + /** + * The clockwise rotation angle in degree of arc with respect to the + * positive direction of the x-axis of the concentric internal and external + * ellipses of the elliptical pixel selector in the processing window. The + * value shall be in the range of 0 to 180, inclusive and in multiples of 1. + */ + uint8_t rotation_angle; + + /** + * The semi-major axis value of the internal ellipse of the elliptical pixel + * selector in amount of pixels in the processing window. The value shall be + * in the range of 1 to 65535, inclusive and in multiples of 1 pixel. + */ + uint16_t semimajor_axis_internal_ellipse; + + /** + * The semi-major axis value of the external ellipse of the elliptical pixel + * selector in amount of pixels in the processing window. The value + * shall not be less than semimajor_axis_internal_ellipse of the current + * processing window. The value shall be in the range of 1 to 65535, + * inclusive and in multiples of 1 pixel. + */ + uint16_t semimajor_axis_external_ellipse; + + /** + * The semi-minor axis value of the external ellipse of the elliptical pixel + * selector in amount of pixels in the processing window. The value shall be + * in the range of 1 to 65535, inclusive and in multiples of 1 pixel. + */ + uint16_t semiminor_axis_external_ellipse; + + /** + * Overlap process option indicates one of the two methods of combining + * rendered pixels in the processing window in an image with at least one + * elliptical pixel selector. For overlapping elliptical pixel selectors + * in an image, overlap_process_option shall have the same value. + */ + enum AVHDRPlusOverlapProcessOption overlap_process_option; + + /** + * The maximum of the color components of linearized RGB values in the + * processing window in the scene. The values should be in the range of 0 to + * 1, inclusive and in multiples of 0.00001. maxscl[ 0 ], maxscl[ 1 ], and + * maxscl[ 2 ] are corresponding to R, G, B color components respectively. + */ + AVRational maxscl[3]; + + /** + * The average of linearized maxRGB values in the processing window in the + * scene. The value should be in the range of 0 to 1, inclusive and in + * multiples of 0.00001. + */ + AVRational average_maxrgb; + + /** + * The number of linearized maxRGB values at given percentiles in the + * processing window in the scene. The maximum value shall be 15. + */ + uint8_t num_distribution_maxrgb_percentiles; + + /** + * The linearized maxRGB values at given percentiles in the + * processing window in the scene. + */ + AVHDRPlusPercentile distribution_maxrgb[15]; + + /** + * The fraction of selected pixels in the image that contains the brightest + * pixel in the scene. The value shall be in the range of 0 to 1, inclusive + * and in multiples of 0.001. + */ + AVRational fraction_bright_pixels; + + /** + * This flag indicates that the metadata for the tone mapping function in + * the processing window is present (for value of 1). + */ + uint8_t tone_mapping_flag; + + /** + * The x coordinate of the separation point between the linear part and the + * curved part of the tone mapping function. The value shall be in the range + * of 0 to 1, excluding 0 and in multiples of 1/4095. + */ + AVRational knee_point_x; + + /** + * The y coordinate of the separation point between the linear part and the + * curved part of the tone mapping function. The value shall be in the range + * of 0 to 1, excluding 0 and in multiples of 1/4095. + */ + AVRational knee_point_y; + + /** + * The number of the intermediate anchor parameters of the tone mapping + * function in the processing window. The maximum value shall be 15. + */ + uint8_t num_bezier_curve_anchors; + + /** + * The intermediate anchor parameters of the tone mapping function in the + * processing window in the scene. The values should be in the range of 0 + * to 1, inclusive and in multiples of 1/1023. + */ + AVRational bezier_curve_anchors[15]; + + /** + * This flag shall be equal to 0 in bitstreams conforming to this version of + * this Specification. Other values are reserved for future use. + */ + uint8_t color_saturation_mapping_flag; + + /** + * The color saturation gain in the processing window in the scene. The + * value shall be in the range of 0 to 63/8, inclusive and in multiples of + * 1/8. The default value shall be 1. + */ + AVRational color_saturation_weight; +} AVHDRPlusColorTransformParams; + +/** + * This struct represents dynamic metadata for color volume transform - + * application 4 of SMPTE 2094-40:2016 standard. + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with + * av_dynamic_hdr_plus_alloc() and its size is not a part of + * the public ABI. + */ +typedef struct AVDynamicHDRPlus { + /** + * Country code by Rec. ITU-T T.35 Annex A. The value shall be 0xB5. + */ + uint8_t itu_t_t35_country_code; + + /** + * Application version in the application defining document in ST-2094 + * suite. The value shall be set to 0. + */ + uint8_t application_version; + + /** + * The number of processing windows. The value shall be in the range + * of 1 to 3, inclusive. + */ + uint8_t num_windows; + + /** + * The color transform parameters for every processing window. + */ + AVHDRPlusColorTransformParams params[3]; + + /** + * The nominal maximum display luminance of the targeted system display, + * in units of 0.0001 candelas per square metre. The value shall be in + * the range of 0 to 10000, inclusive. + */ + AVRational targeted_system_display_maximum_luminance; + + /** + * This flag shall be equal to 0 in bit streams conforming to this version + * of this Specification. The value 1 is reserved for future use. + */ + uint8_t targeted_system_display_actual_peak_luminance_flag; + + /** + * The number of rows in the targeted system_display_actual_peak_luminance + * array. The value shall be in the range of 2 to 25, inclusive. + */ + uint8_t num_rows_targeted_system_display_actual_peak_luminance; + + /** + * The number of columns in the + * targeted_system_display_actual_peak_luminance array. The value shall be + * in the range of 2 to 25, inclusive. + */ + uint8_t num_cols_targeted_system_display_actual_peak_luminance; + + /** + * The normalized actual peak luminance of the targeted system display. The + * values should be in the range of 0 to 1, inclusive and in multiples of + * 1/15. + */ + AVRational targeted_system_display_actual_peak_luminance[25][25]; + + /** + * This flag shall be equal to 0 in bitstreams conforming to this version of + * this Specification. The value 1 is reserved for future use. + */ + uint8_t mastering_display_actual_peak_luminance_flag; + + /** + * The number of rows in the mastering_display_actual_peak_luminance array. + * The value shall be in the range of 2 to 25, inclusive. + */ + uint8_t num_rows_mastering_display_actual_peak_luminance; + + /** + * The number of columns in the mastering_display_actual_peak_luminance + * array. The value shall be in the range of 2 to 25, inclusive. + */ + uint8_t num_cols_mastering_display_actual_peak_luminance; + + /** + * The normalized actual peak luminance of the mastering display used for + * mastering the image essence. The values should be in the range of 0 to 1, + * inclusive and in multiples of 1/15. + */ + AVRational mastering_display_actual_peak_luminance[25][25]; +} AVDynamicHDRPlus; + +/** + * Allocate an AVDynamicHDRPlus structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVDynamicHDRPlus filled with default values or NULL + * on failure. + */ +AVDynamicHDRPlus *av_dynamic_hdr_plus_alloc(size_t *size); + +/** + * Allocate a complete AVDynamicHDRPlus and add it to the frame. + * @param frame The frame which side data is added to. + * + * @return The AVDynamicHDRPlus structure to be filled by caller or NULL + * on failure. + */ +AVDynamicHDRPlus *av_dynamic_hdr_plus_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_HDR_DYNAMIC_METADATA_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/hmac.h b/neo/libs/ffmpeg-win64/include/libavutil/hmac.h index 576a0a4f..412e9507 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/hmac.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/hmac.h @@ -35,7 +35,7 @@ enum AVHMACType { AV_HMAC_SHA1, AV_HMAC_SHA224, AV_HMAC_SHA256, - AV_HMAC_SHA384 = 12, + AV_HMAC_SHA384, AV_HMAC_SHA512, }; diff --git a/neo/libs/ffmpeg-win64/include/libavutil/hwcontext.h b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext.h new file mode 100644 index 00000000..f5a4b623 --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext.h @@ -0,0 +1,584 @@ +/* + * 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_NONE, + AV_HWDEVICE_TYPE_VDPAU, + AV_HWDEVICE_TYPE_CUDA, + AV_HWDEVICE_TYPE_VAAPI, + AV_HWDEVICE_TYPE_DXVA2, + AV_HWDEVICE_TYPE_QSV, + AV_HWDEVICE_TYPE_VIDEOTOOLBOX, + AV_HWDEVICE_TYPE_D3D11VA, + AV_HWDEVICE_TYPE_DRM, + AV_HWDEVICE_TYPE_OPENCL, + AV_HWDEVICE_TYPE_MEDIACODEC, +}; + +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; + +/** + * Look up an AVHWDeviceType by name. + * + * @param name String name of the device type (case-insensitive). + * @return The type from enum AVHWDeviceType, or AV_HWDEVICE_TYPE_NONE if + * not found. + */ +enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name); + +/** Get the string name of an AVHWDeviceType. + * + * @param type Type from enum AVHWDeviceType. + * @return Pointer to a static string containing the name, or NULL if the type + * is not valid. + */ +const char *av_hwdevice_get_type_name(enum AVHWDeviceType type); + +/** + * Iterate over supported device types. + * + * @param type AV_HWDEVICE_TYPE_NONE initially, then the previous type + * returned by this function in subsequent iterations. + * @return The next usable device type from enum AVHWDeviceType, or + * AV_HWDEVICE_TYPE_NONE if there are no more. + */ +enum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev); + +/** + * Allocate an AVHWDeviceContext for a given hardware type. + * + * @param type the type of the hardware device to allocate. + * @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); + +/** + * Create a new device of the specified type from an existing device. + * + * If the source device is a device of the target type or was originally + * derived from such a device (possibly through one or more intermediate + * devices of other types), then this will return a reference to the + * existing device of the same type as is requested. + * + * Otherwise, it will attempt to derive a new device from the given source + * device. If direct derivation to the new type is not implemented, it will + * attempt the same derivation from each ancestor of the source device in + * turn looking for an implemented derivation method. + * + * @param dst_ctx On success, a reference to the newly-created + * AVHWDeviceContext. + * @param type The type of the new device to create. + * @param src_ctx A reference to an existing AVHWDeviceContext which will be + * used to create the new device. + * @param flags Currently unused; should be set to zero. + * @return Zero on success, a negative AVERROR code on failure. + */ +int av_hwdevice_ctx_create_derived(AVBufferRef **dst_ctx, + enum AVHWDeviceType type, + AVBufferRef *src_ctx, 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. + * + * The two frames must have matching allocated dimensions (i.e. equal to + * AVHWFramesContext.width/height), since not all device types support + * transferring a sub-rectangle of the whole surface. The display dimensions + * (i.e. AVFrame.width/height) may be smaller than the allocated dimensions, but + * also have to be equal for both frames. When the display dimensions are + * smaller than the allocated dimensions, the content of the padding in the + * destination frame is unspecified. + * + * @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 ref 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); + + +/** + * Flags to apply to frame mappings. + */ +enum { + /** + * The mapping must be readable. + */ + AV_HWFRAME_MAP_READ = 1 << 0, + /** + * The mapping must be writeable. + */ + AV_HWFRAME_MAP_WRITE = 1 << 1, + /** + * The mapped frame will be overwritten completely in subsequent + * operations, so the current frame data need not be loaded. Any values + * which are not overwritten are unspecified. + */ + AV_HWFRAME_MAP_OVERWRITE = 1 << 2, + /** + * The mapping must be direct. That is, there must not be any copying in + * the map or unmap steps. Note that performance of direct mappings may + * be much lower than normal memory. + */ + AV_HWFRAME_MAP_DIRECT = 1 << 3, +}; + +/** + * Map a hardware frame. + * + * This has a number of different possible effects, depending on the format + * and origin of the src and dst frames. On input, src should be a usable + * frame with valid buffers and dst should be blank (typically as just created + * by av_frame_alloc()). src should have an associated hwframe context, and + * dst may optionally have a format and associated hwframe context. + * + * If src was created by mapping a frame from the hwframe context of dst, + * then this function undoes the mapping - dst is replaced by a reference to + * the frame that src was originally mapped from. + * + * If both src and dst have an associated hwframe context, then this function + * attempts to map the src frame from its hardware context to that of dst and + * then fill dst with appropriate data to be usable there. This will only be + * possible if the hwframe contexts and associated devices are compatible - + * given compatible devices, av_hwframe_ctx_create_derived() can be used to + * create a hwframe context for dst in which mapping should be possible. + * + * If src has a hwframe context but dst does not, then the src frame is + * mapped to normal memory and should thereafter be usable as a normal frame. + * If the format is set on dst, then the mapping will attempt to create dst + * with that format and fail if it is not possible. If format is unset (is + * AV_PIX_FMT_NONE) then dst will be mapped with whatever the most appropriate + * format to use is (probably the sw_format of the src hwframe context). + * + * A return value of AVERROR(ENOSYS) indicates that the mapping is not + * possible with the given arguments and hwframe setup, while other return + * values indicate that it failed somehow. + * + * @param dst Destination frame, to contain the mapping. + * @param src Source frame, to be mapped. + * @param flags Some combination of AV_HWFRAME_MAP_* flags. + * @return Zero on success, negative AVERROR code on failure. + */ +int av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags); + + +/** + * Create and initialise an AVHWFramesContext as a mapping of another existing + * AVHWFramesContext on a different device. + * + * av_hwframe_ctx_init() should not be called after this. + * + * @param derived_frame_ctx On success, a reference to the newly created + * AVHWFramesContext. + * @param derived_device_ctx A reference to the device to create the new + * AVHWFramesContext on. + * @param source_frame_ctx A reference to an existing AVHWFramesContext + * which will be mapped to the derived context. + * @param flags Some combination of AV_HWFRAME_MAP_* flags, defining the + * mapping parameters to apply to frames which are allocated + * in the derived device. + * @return Zero on success, negative AVERROR code on failure. + */ +int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx, + enum AVPixelFormat format, + AVBufferRef *derived_device_ctx, + AVBufferRef *source_frame_ctx, + int flags); + +#endif /* AVUTIL_HWCONTEXT_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_cuda.h b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_cuda.h new file mode 100644 index 00000000..81a0552c --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_cuda.h @@ -0,0 +1,52 @@ +/* + * 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 + +#ifndef CUDA_VERSION +#include +#endif + +#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. + */ + +typedef struct AVCUDADeviceContextInternal AVCUDADeviceContextInternal; + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVCUDADeviceContext { + CUcontext cuda_ctx; + CUstream stream; + AVCUDADeviceContextInternal *internal; +} AVCUDADeviceContext; + +/** + * AVHWFramesContext.hwctx is currently not used + */ + +#endif /* AVUTIL_HWCONTEXT_CUDA_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_d3d11va.h b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_d3d11va.h new file mode 100644 index 00000000..9f91e9b1 --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_d3d11va.h @@ -0,0 +1,169 @@ +/* + * 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_D3D11VA_H +#define AVUTIL_HWCONTEXT_D3D11VA_H + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_D3D11VA. + * + * The default pool implementation will be fixed-size if initial_pool_size is + * set (and allocate elements from an array texture). Otherwise it will allocate + * individual textures. Be aware that decoding requires a single array texture. + * + * Using sw_format==AV_PIX_FMT_YUV420P has special semantics, and maps to + * DXGI_FORMAT_420_OPAQUE. av_hwframe_transfer_data() is not supported for + * this format. Refer to MSDN for details. + * + * av_hwdevice_ctx_create() for this device type supports a key named "debug" + * for the AVDictionary entry. If this is set to any value, the device creation + * code will try to load various supported D3D debugging layers. + */ + +#include +#include + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVD3D11VADeviceContext { + /** + * Device used for texture creation and access. This can also be used to + * set the libavcodec decoding device. + * + * Must be set by the user. This is the only mandatory field - the other + * device context fields are set from this and are available for convenience. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11Device *device; + + /** + * If unset, this will be set from the device field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11DeviceContext *device_context; + + /** + * If unset, this will be set from the device field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11VideoDevice *video_device; + + /** + * If unset, this will be set from the device_context field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11VideoContext *video_context; + + /** + * Callbacks for locking. They protect accesses to device_context and + * video_context calls. They also protect access to the internal staging + * texture (for av_hwframe_transfer_data() calls). They do NOT protect + * access to hwcontext or decoder state in general. + * + * If unset on init, the hwcontext implementation will set them to use an + * internal mutex. + * + * The underlying lock must be recursive. lock_ctx is for free use by the + * locking implementation. + */ + void (*lock)(void *lock_ctx); + void (*unlock)(void *lock_ctx); + void *lock_ctx; +} AVD3D11VADeviceContext; + +/** + * D3D11 frame descriptor for pool allocation. + * + * In user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer pointing at an object of this type describing the + * planes of the frame. + * + * This has no use outside of custom allocation, and AVFrame AVBufferRef do not + * necessarily point to an instance of this struct. + */ +typedef struct AVD3D11FrameDescriptor { + /** + * The texture in which the frame is located. The reference count is + * managed by the AVBufferRef, and destroying the reference will release + * the interface. + * + * Normally stored in AVFrame.data[0]. + */ + ID3D11Texture2D *texture; + + /** + * The index into the array texture element representing the frame, or 0 + * if the texture is not an array texture. + * + * Normally stored in AVFrame.data[1] (cast from intptr_t). + */ + intptr_t index; +} AVD3D11FrameDescriptor; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVD3D11VAFramesContext { + /** + * The canonical texture used for pool allocation. If this is set to NULL + * on init, the hwframes implementation will allocate and set an array + * texture if initial_pool_size > 0. + * + * The only situation when the API user should set this is: + * - the user wants to do manual pool allocation (setting + * AVHWFramesContext.pool), instead of letting AVHWFramesContext + * allocate the pool + * - of an array texture + * - and wants it to use it for decoding + * - this has to be done before calling av_hwframe_ctx_init() + * + * Deallocating the AVHWFramesContext will always release this interface, + * and it does not matter whether it was user-allocated. + * + * This is in particular used by the libavcodec D3D11VA hwaccel, which + * requires a single array texture. It will create ID3D11VideoDecoderOutputView + * objects for each array texture element on decoder initialization. + */ + ID3D11Texture2D *texture; + + /** + * D3D11_TEXTURE2D_DESC.BindFlags used for texture creation. The user must + * at least set D3D11_BIND_DECODER if the frames context is to be used for + * video decoding. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + UINT BindFlags; + + /** + * D3D11_TEXTURE2D_DESC.MiscFlags used for texture creation. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + UINT MiscFlags; +} AVD3D11VAFramesContext; + +#endif /* AVUTIL_HWCONTEXT_D3D11VA_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_drm.h b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_drm.h new file mode 100644 index 00000000..42709f21 --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_drm.h @@ -0,0 +1,169 @@ +/* + * 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_DRM_H +#define AVUTIL_HWCONTEXT_DRM_H + +#include +#include + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_DRM. + * + * Internal frame allocation is not currently supported - all frames + * must be allocated by the user. Thus AVHWFramesContext is always + * NULL, though this may change if support for frame allocation is + * added in future. + */ + +enum { + /** + * The maximum number of layers/planes in a DRM frame. + */ + AV_DRM_MAX_PLANES = 4 +}; + +/** + * DRM object descriptor. + * + * Describes a single DRM object, addressing it as a PRIME file + * descriptor. + */ +typedef struct AVDRMObjectDescriptor { + /** + * DRM PRIME fd for the object. + */ + int fd; + /** + * Total size of the object. + * + * (This includes any parts not which do not contain image data.) + */ + size_t size; + /** + * Format modifier applied to the object (DRM_FORMAT_MOD_*). + * + * If the format modifier is unknown then this should be set to + * DRM_FORMAT_MOD_INVALID. + */ + uint64_t format_modifier; +} AVDRMObjectDescriptor; + +/** + * DRM plane descriptor. + * + * Describes a single plane of a layer, which is contained within + * a single object. + */ +typedef struct AVDRMPlaneDescriptor { + /** + * Index of the object containing this plane in the objects + * array of the enclosing frame descriptor. + */ + int object_index; + /** + * Offset within that object of this plane. + */ + ptrdiff_t offset; + /** + * Pitch (linesize) of this plane. + */ + ptrdiff_t pitch; +} AVDRMPlaneDescriptor; + +/** + * DRM layer descriptor. + * + * Describes a single layer within a frame. This has the structure + * defined by its format, and will contain one or more planes. + */ +typedef struct AVDRMLayerDescriptor { + /** + * Format of the layer (DRM_FORMAT_*). + */ + uint32_t format; + /** + * Number of planes in the layer. + * + * This must match the number of planes required by format. + */ + int nb_planes; + /** + * Array of planes in this layer. + */ + AVDRMPlaneDescriptor planes[AV_DRM_MAX_PLANES]; +} AVDRMLayerDescriptor; + +/** + * DRM frame descriptor. + * + * This is used as the data pointer for AV_PIX_FMT_DRM_PRIME frames. + * It is also used by user-allocated frame pools - allocating in + * AVHWFramesContext.pool must return AVBufferRefs which contain + * an object of this type. + * + * The fields of this structure should be set such it can be + * imported directly by EGL using the EGL_EXT_image_dma_buf_import + * and EGL_EXT_image_dma_buf_import_modifiers extensions. + * (Note that the exact layout of a particular format may vary between + * platforms - we only specify that the same platform should be able + * to import it.) + * + * The total number of planes must not exceed AV_DRM_MAX_PLANES, and + * the order of the planes by increasing layer index followed by + * increasing plane index must be the same as the order which would + * be used for the data pointers in the equivalent software format. + */ +typedef struct AVDRMFrameDescriptor { + /** + * Number of DRM objects making up this frame. + */ + int nb_objects; + /** + * Array of objects making up the frame. + */ + AVDRMObjectDescriptor objects[AV_DRM_MAX_PLANES]; + /** + * Number of layers in the frame. + */ + int nb_layers; + /** + * Array of layers in the frame. + */ + AVDRMLayerDescriptor layers[AV_DRM_MAX_PLANES]; +} AVDRMFrameDescriptor; + +/** + * DRM device. + * + * Allocated as AVHWDeviceContext.hwctx. + */ +typedef struct AVDRMDeviceContext { + /** + * File descriptor of DRM device. + * + * This is used as the device to create frames on, and may also be + * used in some derivation and mapping operations. + * + * If no device is required, set to -1. + */ + int fd; +} AVDRMDeviceContext; + +#endif /* AVUTIL_HWCONTEXT_DRM_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_dxva2.h b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_dxva2.h new file mode 100644 index 00000000..e1b79bc0 --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_dxva2.h @@ -0,0 +1,75 @@ +/* + * 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. + * + * This is for convenience only. Some code uses other methods to manage the + * decoder reference. + */ + IDirectXVideoDecoder *decoder_to_release; +} AVDXVA2FramesContext; + +#endif /* AVUTIL_HWCONTEXT_DXVA2_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavfilter/avfiltergraph.h b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_mediacodec.h similarity index 63% rename from neo/libs/ffmpeg-win64/include/libavfilter/avfiltergraph.h rename to neo/libs/ffmpeg-win64/include/libavutil/hwcontext_mediacodec.h index b31d581c..101a9806 100644 --- a/neo/libs/ffmpeg-win64/include/libavfilter/avfiltergraph.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_mediacodec.h @@ -1,7 +1,4 @@ /* - * Filter graphs - * copyright (c) 2007 Bobby Bingham - * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or @@ -19,10 +16,21 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef AVFILTER_AVFILTERGRAPH_H -#define AVFILTER_AVFILTERGRAPH_H +#ifndef AVUTIL_HWCONTEXT_MEDIACODEC_H +#define AVUTIL_HWCONTEXT_MEDIACODEC_H -#include "avfilter.h" -#include "libavutil/log.h" +/** + * MediaCodec details. + * + * Allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVMediaCodecDeviceContext { + /** + * android/view/Surface handle, to be filled by the user. + * + * This is the default surface used by decoders on this device. + */ + void *surface; +} AVMediaCodecDeviceContext; -#endif /* AVFILTER_AVFILTERGRAPH_H */ +#endif /* AVUTIL_HWCONTEXT_MEDIACODEC_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_qsv.h b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_qsv.h new file mode 100644 index 00000000..b98d611c --- /dev/null +++ b/neo/libs/ffmpeg-win64/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/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_vaapi.h b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_vaapi.h new file mode 100644 index 00000000..0b2e071c --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_vaapi.h @@ -0,0 +1,117 @@ +/* + * 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. + */ + +enum { + /** + * The quirks field has been set by the user and should not be detected + * automatically by av_hwdevice_ctx_init(). + */ + AV_VAAPI_DRIVER_QUIRK_USER_SET = (1 << 0), + /** + * The driver does not destroy parameter buffers when they are used by + * vaRenderPicture(). Additional code will be required to destroy them + * separately afterwards. + */ + AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS = (1 << 1), + + /** + * The driver does not support the VASurfaceAttribMemoryType attribute, + * so the surface allocation code will not try to use it. + */ + AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE = (1 << 2), + + /** + * The driver does not support surface attributes at all. + * The surface allocation code will never pass them to surface allocation, + * and the results of the vaQuerySurfaceAttributes() call will be faked. + */ + AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES = (1 << 3), +}; + +/** + * VAAPI connection details. + * + * Allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVVAAPIDeviceContext { + /** + * The VADisplay handle, to be filled by the user. + */ + VADisplay display; + /** + * Driver quirks to apply - this is filled by av_hwdevice_ctx_init(), + * with reference to a table of known drivers, unless the + * AV_VAAPI_DRIVER_QUIRK_USER_SET bit is already present. The user + * may need to refer to this field when performing any later + * operations using VAAPI with the same VADisplay. + */ + unsigned int driver_quirks; +} 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/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_vdpau.h b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_vdpau.h new file mode 100644 index 00000000..1b7ea1e4 --- /dev/null +++ b/neo/libs/ffmpeg-win64/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/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_videotoolbox.h b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_videotoolbox.h new file mode 100644 index 00000000..380918d9 --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavutil/hwcontext_videotoolbox.h @@ -0,0 +1,54 @@ +/* + * 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_VIDEOTOOLBOX_H +#define AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H + +#include + +#include + +#include "pixfmt.h" + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_VIDEOTOOLBOX. + * + * This API currently does not support frame allocation, as the raw VideoToolbox + * API does allocation, and FFmpeg itself never has the need to allocate frames. + * + * If the API user sets a custom pool, AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a CVImageBufferRef or CVPixelBufferRef. + * + * Currently AVHWDeviceContext.hwctx and AVHWFramesContext.hwctx are always + * NULL. + */ + +/** + * Convert a VideoToolbox (actually CoreVideo) format to AVPixelFormat. + * Returns AV_PIX_FMT_NONE if no known equivalent was found. + */ +enum AVPixelFormat av_map_videotoolbox_format_to_pixfmt(uint32_t cv_fmt); + +/** + * Convert an AVPixelFormat to a VideoToolbox (actually CoreVideo) format. + * Returns 0 if no known equivalent was found. + */ +uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt); + +#endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/imgutils.h b/neo/libs/ffmpeg-win64/include/libavutil/imgutils.h index 23282a38..5b790ecf 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/imgutils.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/imgutils.h @@ -120,6 +120,24 @@ void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4], const uint8_t *src_data[4], const int src_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height); +/** + * Copy image data located in uncacheable (e.g. GPU mapped) memory. Where + * available, this function will use special functionality for reading from such + * memory, which may result in greatly improved performance compared to plain + * av_image_copy(). + * + * The data pointers and the linesizes must be aligned to the maximum required + * by the CPU architecture. + * + * @note The linesize parameters have the type ptrdiff_t here, while they are + * int for av_image_copy(). + * @note On x86, the linesizes currently need to be aligned to the cacheline + * size (i.e. 64) to get improved performance. + */ +void av_image_copy_uc_from(uint8_t *dst_data[4], const ptrdiff_t dst_linesizes[4], + const uint8_t *src_data[4], const ptrdiff_t src_linesizes[4], + enum AVPixelFormat pix_fmt, int width, int height); + /** * Setup the data pointers and linesizes based on the specified image * parameters and the provided array. @@ -137,7 +155,7 @@ void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4], * one call, use av_image_alloc(). * * @param dst_data data pointers to be filled in - * @param dst_linesizes linesizes for the image in dst_data to be filled in + * @param dst_linesize linesizes for the image in dst_data to be filled in * @param src buffer which will contain or contains the actual image data, can be NULL * @param pix_fmt the pixel format of the image * @param width the width of the image in pixels @@ -154,7 +172,11 @@ int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4], * Return the size in bytes of the amount of data required to store an * image with the given parameters. * - * @param[in] align the assumed linesize alignment + * @param pix_fmt the pixel format of the image + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @param align the assumed linesize alignment + * @return the buffer size in bytes, a negative error code in case of failure */ int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align); @@ -167,7 +189,7 @@ int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, * @param dst a buffer into which picture data will be copied * @param dst_size the size in bytes of dst * @param src_data pointers containing the source image data - * @param src_linesizes linesizes for the image in src_data + * @param src_linesize linesizes for the image in src_data * @param pix_fmt the pixel format of the source image * @param width the width of the source image in pixels * @param height the height of the source image in pixels @@ -191,6 +213,21 @@ 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 a plane of an image with the specified pix_fmt 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. * @@ -205,6 +242,33 @@ int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *lo */ int av_image_check_sar(unsigned int w, unsigned int h, AVRational sar); +/** + * Overwrite the image data with black. This is suitable for filling a + * sub-rectangle of an image, meaning the padding between the right most pixel + * and the left most pixel on the next line will not be overwritten. For some + * formats, the image size might be rounded up due to inherent alignment. + * + * If the pixel format has alpha, the alpha is cleared to opaque. + * + * This can return an error if the pixel format is not supported. Normally, all + * non-hwaccel pixel formats should be supported. + * + * Passing NULL for dst_data is allowed. Then the function returns whether the + * operation would have succeeded. (It can return an error if the pix_fmt is + * not supported.) + * + * @param dst_data data pointers to destination image + * @param dst_linesize linesizes for the destination image + * @param pix_fmt the pixel format of the image + * @param range the color range of the image (important for colorspaces such as YUV) + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @return 0 if the image data was cleared, a negative AVERROR code otherwise + */ +int av_image_fill_black(uint8_t *dst_data[4], const ptrdiff_t dst_linesize[4], + enum AVPixelFormat pix_fmt, enum AVColorRange range, + int width, int height); + /** * @} */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/intreadwrite.h b/neo/libs/ffmpeg-win64/include/libavutil/intreadwrite.h index 51fbe30a..4c8413a5 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/intreadwrite.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/intreadwrite.h @@ -215,7 +215,7 @@ typedef union { * by per-arch headers. */ -#if defined(__GNUC__) && !defined(__TI_COMPILER_VERSION__) +#if defined(__GNUC__) union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias; union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias; @@ -224,7 +224,7 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; # define AV_RN(s, p) (((const union unaligned_##s *) (p))->l) # define AV_WN(s, p, v) ((((union unaligned_##s *) (p))->l) = (v)) -#elif defined(__DECC) +#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_X64) || defined(_M_ARM64)) && AV_HAVE_FAST_UNALIGNED # define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) # define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v)) @@ -242,8 +242,8 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; ((const uint8_t*)(x))[1]) #endif #ifndef AV_WB16 -# define AV_WB16(p, darg) do { \ - unsigned d = (darg); \ +# define AV_WB16(p, val) do { \ + uint16_t d = (val); \ ((uint8_t*)(p))[1] = (d); \ ((uint8_t*)(p))[0] = (d)>>8; \ } while(0) @@ -255,8 +255,8 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; ((const uint8_t*)(x))[0]) #endif #ifndef AV_WL16 -# define AV_WL16(p, darg) do { \ - unsigned d = (darg); \ +# define AV_WL16(p, val) do { \ + uint16_t d = (val); \ ((uint8_t*)(p))[0] = (d); \ ((uint8_t*)(p))[1] = (d)>>8; \ } while(0) @@ -270,8 +270,8 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; ((const uint8_t*)(x))[3]) #endif #ifndef AV_WB32 -# define AV_WB32(p, darg) do { \ - unsigned d = (darg); \ +# define AV_WB32(p, val) do { \ + uint32_t d = (val); \ ((uint8_t*)(p))[3] = (d); \ ((uint8_t*)(p))[2] = (d)>>8; \ ((uint8_t*)(p))[1] = (d)>>16; \ @@ -287,8 +287,8 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; ((const uint8_t*)(x))[0]) #endif #ifndef AV_WL32 -# define AV_WL32(p, darg) do { \ - unsigned d = (darg); \ +# define AV_WL32(p, val) do { \ + uint32_t d = (val); \ ((uint8_t*)(p))[0] = (d); \ ((uint8_t*)(p))[1] = (d)>>8; \ ((uint8_t*)(p))[2] = (d)>>16; \ @@ -308,8 +308,8 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; (uint64_t)((const uint8_t*)(x))[7]) #endif #ifndef AV_WB64 -# define AV_WB64(p, darg) do { \ - uint64_t d = (darg); \ +# define AV_WB64(p, val) do { \ + uint64_t d = (val); \ ((uint8_t*)(p))[7] = (d); \ ((uint8_t*)(p))[6] = (d)>>8; \ ((uint8_t*)(p))[5] = (d)>>16; \ @@ -333,8 +333,8 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; (uint64_t)((const uint8_t*)(x))[0]) #endif #ifndef AV_WL64 -# define AV_WL64(p, darg) do { \ - uint64_t d = (darg); \ +# define AV_WL64(p, val) do { \ + uint64_t d = (val); \ ((uint8_t*)(p))[0] = (d); \ ((uint8_t*)(p))[1] = (d)>>8; \ ((uint8_t*)(p))[2] = (d)>>16; \ @@ -542,6 +542,21 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; # define AV_WN64A(p, v) AV_WNA(64, p, v) #endif +#if AV_HAVE_BIGENDIAN +# define AV_RLA(s, p) av_bswap##s(AV_RN##s##A(p)) +# define AV_WLA(s, p, v) AV_WN##s##A(p, av_bswap##s(v)) +#else +# define AV_RLA(s, p) AV_RN##s##A(p) +# define AV_WLA(s, p, v) AV_WN##s##A(p, v) +#endif + +#ifndef AV_RL64A +# define AV_RL64A(p) AV_RLA(64, p) +#endif +#ifndef AV_WL64A +# define AV_WL64A(p, v) AV_WLA(64, p, v) +#endif + /* * The AV_COPYxxU macros are suitable for copying data to/from unaligned * memory locations. diff --git a/neo/libs/ffmpeg-win64/include/libavutil/lfg.h b/neo/libs/ffmpeg-win64/include/libavutil/lfg.h index ec90562c..2b669205 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/lfg.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/lfg.h @@ -22,6 +22,14 @@ #ifndef AVUTIL_LFG_H #define AVUTIL_LFG_H +#include + +/** + * Context structure for the Lagged Fibonacci PRNG. + * The exact layout, types and content of this struct may change and should + * not be accessed directly. Only its sizeof() is guranteed to stay the same + * to allow easy instanciation. + */ typedef struct AVLFG { unsigned int state[64]; int index; @@ -29,6 +37,13 @@ typedef struct AVLFG { void av_lfg_init(AVLFG *c, unsigned int seed); +/** + * Seed the state of the ALFG using binary data. + * + * Return value: 0 on success, negative value (AVERROR) on failure. + */ +int av_lfg_init_from_data(AVLFG *c, const uint8_t *data, unsigned int length); + /** * Get the next random unsigned 32-bit number using an ALFG. * @@ -36,8 +51,9 @@ void av_lfg_init(AVLFG *c, unsigned int seed); * it may be good enough and faster for your specific use case. */ static inline unsigned int av_lfg_get(AVLFG *c){ - c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; - return c->state[c->index++ & 63]; + unsigned a = c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; + c->index += 1U; + return a; } /** @@ -48,7 +64,9 @@ static inline unsigned int av_lfg_get(AVLFG *c){ static inline unsigned int av_mlfg_get(AVLFG *c){ unsigned int a= c->state[(c->index-55) & 63]; unsigned int b= c->state[(c->index-24) & 63]; - return c->state[c->index++ & 63] = 2*a*b+a+b; + a = c->state[c->index & 63] = 2*a*b+a+b; + c->index += 1U; + return a; } /** diff --git a/neo/libs/ffmpeg-win64/include/libavutil/log.h b/neo/libs/ffmpeg-win64/include/libavutil/log.h index 321748cd..d9554e60 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/log.h +++ b/neo/libs/ffmpeg-win64/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,19 +317,22 @@ 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); -#if FF_API_DLOG /** - * av_dlog macros - * @deprecated unused - * Useful to print debug messages that shouldn't get compiled in normally. + * 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. */ - -#ifdef DEBUG -# define av_dlog(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__) -#else -# define av_dlog(pctx, ...) do { if (0) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__); } while (0) -#endif -#endif /* FF_API_DLOG */ +int av_log_format_line2(void *ptr, int level, const char *fmt, va_list vl, + char *line, int line_size, int *print_prefix); /** * Skip repeated messages, this requires the user app to use av_log() instead of diff --git a/neo/libs/ffmpeg-win64/include/libavutil/macros.h b/neo/libs/ffmpeg-win64/include/libavutil/macros.h index 44653237..2007ee56 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/macros.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/macros.h @@ -45,4 +45,6 @@ #define AV_PRAGMA(s) _Pragma(#s) +#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1)) + #endif /* AVUTIL_MACROS_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/mastering_display_metadata.h b/neo/libs/ffmpeg-win64/include/libavutil/mastering_display_metadata.h new file mode 100644 index 00000000..c23b07c3 --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavutil/mastering_display_metadata.h @@ -0,0 +1,128 @@ +/* + * 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); + +/** + * Content light level needed by to transmit HDR over HDMI (CTA-861.3). + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with av_content_light_metadata_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVContentLightMetadata { + /** + * Max content light level (cd/m^2). + */ + unsigned MaxCLL; + + /** + * Max average light level per frame (cd/m^2). + */ + unsigned MaxFALL; +} AVContentLightMetadata; + +/** + * Allocate an AVContentLightMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVContentLightMetadata filled with default values or NULL + * on failure. + */ +AVContentLightMetadata *av_content_light_metadata_alloc(size_t *size); + +/** + * Allocate a complete AVContentLightMetadata and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVContentLightMetadata structure to be filled by caller. + */ +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/mathematics.h b/neo/libs/ffmpeg-win64/include/libavutil/mathematics.h index 57c44f84..54901800 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/mathematics.h +++ b/neo/libs/ffmpeg-win64/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/neo/libs/ffmpeg-win64/include/libavutil/md5.h b/neo/libs/ffmpeg-win64/include/libavutil/md5.h index 79702c88..ca72ccbf 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/md5.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/md5.h @@ -18,9 +18,16 @@ * 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 +#include #include #include "attributes.h" @@ -28,7 +35,9 @@ /** * @defgroup lavu_md5 MD5 - * @ingroup lavu_crypto + * @ingroup lavu_hash + * MD5 hash function implementation. + * * @{ */ @@ -55,7 +64,11 @@ void av_md5_init(struct AVMD5 *ctx); * @param src input data to update hash with * @param len input data length */ +#if FF_API_CRYPTO_SIZE_T void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, int len); +#else +void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, size_t len); +#endif /** * Finish hashing and output digest value. @@ -72,7 +85,11 @@ void av_md5_final(struct AVMD5 *ctx, uint8_t *dst); * @param src The data to hash * @param len The length of the data, in bytes */ +#if FF_API_CRYPTO_SIZE_T void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len); +#else +void av_md5_sum(uint8_t *dst, const uint8_t *src, size_t len); +#endif /** * @} diff --git a/neo/libs/ffmpeg-win64/include/libavutil/mem.h b/neo/libs/ffmpeg-win64/include/libavutil/mem.h index a8eb14ee..5fb1a02d 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/mem.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/mem.h @@ -20,7 +20,8 @@ /** * @file - * memory handling functions + * @ingroup lavu_mem + * Memory handling functions */ #ifndef AVUTIL_MEM_H @@ -35,37 +36,133 @@ /** * @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_ALIGNED(n,t,v) + * Declare an aligned variable appropriate for use in inline assembly code. + * + * @code{.c} + * DECLARE_ASM_ALIGNED(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 + */ + +/** + * @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 + #define DECLARE_ASM_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v #define DECLARE_ASM_CONST(n,t,v) const t __attribute__ ((aligned (n))) v -#elif defined(__TI_COMPILER_VERSION__) - #define DECLARE_ALIGNED(n,t,v) \ - AV_PRAGMA(DATA_ALIGN(v,n)) \ - t __attribute__((aligned(n))) v - #define DECLARE_ASM_CONST(n,t,v) \ - AV_PRAGMA(DATA_ALIGN(v,n)) \ - static const t __attribute__((aligned(n))) v -#elif defined(__GNUC__) +#elif defined(__DJGPP__) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (FFMIN(n, 16)))) v + #define DECLARE_ASM_ALIGNED(n,t,v) t av_used __attribute__ ((aligned (FFMIN(n, 16)))) v + #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (FFMIN(n, 16)))) v +#elif defined(__GNUC__) || defined(__clang__) #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_ALIGNED(n,t,v) t av_used __attribute__ ((aligned (n))) v #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (n))) v #elif defined(_MSC_VER) #define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v + #define DECLARE_ASM_ALIGNED(n,t,v) __declspec(align(n)) t v #define DECLARE_ASM_CONST(n,t,v) __declspec(align(n)) static const t v #else #define DECLARE_ALIGNED(n,t,v) t v + #define DECLARE_ASM_ALIGNED(n,t,v) t v #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,204 +170,423 @@ #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. - * @see av_malloc() - */ -av_alloc_size(1, 2) static inline void *av_malloc_array(size_t nmemb, size_t size) -{ - if (!size || nmemb >= INT_MAX / size) - return NULL; - return av_malloc(nmemb * size); -} - -/** - * 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. - * @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. + * 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 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. + * 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) void *av_malloc_array(size_t nmemb, size_t size); + +/** + * 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 the allocated block, or `NULL` if the block cannot + * be allocated + * + * @see av_mallocz() + * @see av_malloc_array() + */ +av_alloc_size(1, 2) void *av_mallocz_array(size_t nmemb, size_t size); + +/** + * Non-inlined equivalent of av_mallocz_array(). + * + * Created for symmetry with the calloc() C function. */ 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. - * @see av_mallocz() - * @see av_malloc_array() + * 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() */ -av_alloc_size(1, 2) static inline void *av_mallocz_array(size_t nmemb, size_t size) -{ - if (!size || nmemb >= INT_MAX / size) - return NULL; - return av_mallocz(nmemb * size); -} +void *av_realloc(void *ptr, size_t size) av_alloc_size(2); /** - * 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. + * 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. */ -char *av_strdup(const char *s) av_malloc_attrib; +av_warn_unused_result +int av_reallocp(void *ptr, size_t size); /** - * 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. + * + * 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. */ -char *av_strndup(const char *s, size_t len) av_malloc_attrib; +void *av_realloc_f(void *ptr, size_t nelem, size_t elsize); /** - * 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 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() */ -void *av_memdup(const void *p, size_t size); +av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, 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 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. + */ +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 the size of buffer `ptr`. `*size` is + * updated to the new allocated size, in particular 0 + * in case of failure. + * @param[in] min_size Desired minimal 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 the size of buffer `*ptr`. `*size` is + * updated to the new allocated size, in particular 0 + * in case of failure. + * @param[in] min_size Desired minimal 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 the size of buffer `*ptr`. `*size` is + * updated to the new allocated size, in particular 0 + * in case of failure. + * @param[in] min_size Desired minimal 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 +596,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 +615,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,43 +678,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); - -/** + * @} * @} */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/motion_vector.h b/neo/libs/ffmpeg-win64/include/libavutil/motion_vector.h index 30cfb994..ec295563 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/motion_vector.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/motion_vector.h @@ -45,6 +45,13 @@ typedef struct AVMotionVector { * Currently unused. */ uint64_t flags; + /** + * Motion vector + * src_x = dst_x + motion_x / motion_scale + * src_y = dst_y + motion_y / motion_scale + */ + int32_t motion_x, motion_y; + uint16_t motion_scale; } AVMotionVector; #endif /* AVUTIL_MOTION_VECTOR_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/murmur3.h b/neo/libs/ffmpeg-win64/include/libavutil/murmur3.h index f29ed973..1b09175c 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/murmur3.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/murmur3.h @@ -18,15 +18,103 @@ * 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 +#include "version.h" + +/** + * @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` + */ +#if FF_API_CRYPTO_SIZE_T void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, int len); +#else +void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, size_t len); +#endif + +/** + * 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/neo/libs/ffmpeg-win64/include/libavutil/opt.h b/neo/libs/ffmpeg-win64/include/libavutil/opt.h index 753434d6..39f4a8dd 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/opt.h +++ b/neo/libs/ffmpeg-win64/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; @@ -228,15 +228,16 @@ enum AVOptionType{ AV_OPT_TYPE_RATIONAL, AV_OPT_TYPE_BINARY, ///< offset must point to a pointer immediately followed by an int for the length AV_OPT_TYPE_DICT, - AV_OPT_TYPE_CONST = 128, - AV_OPT_TYPE_IMAGE_SIZE = MKBETAG('S','I','Z','E'), ///< offset must point to two consecutive integers - AV_OPT_TYPE_PIXEL_FMT = MKBETAG('P','F','M','T'), - AV_OPT_TYPE_SAMPLE_FMT = MKBETAG('S','F','M','T'), - AV_OPT_TYPE_VIDEO_RATE = MKBETAG('V','R','A','T'), ///< offset must point to AVRational - AV_OPT_TYPE_DURATION = MKBETAG('D','U','R',' '), - AV_OPT_TYPE_COLOR = MKBETAG('C','O','L','R'), - AV_OPT_TYPE_CHANNEL_LAYOUT = MKBETAG('C','H','L','A'), - AV_OPT_TYPE_BOOL = MKBETAG('B','O','O','L'), + AV_OPT_TYPE_UINT64, + AV_OPT_TYPE_CONST, + AV_OPT_TYPE_IMAGE_SIZE, ///< offset must point to two consecutive integers + AV_OPT_TYPE_PIXEL_FMT, + AV_OPT_TYPE_SAMPLE_FMT, + AV_OPT_TYPE_VIDEO_RATE, ///< offset must point to AVRational + AV_OPT_TYPE_DURATION, + AV_OPT_TYPE_COLOR, + AV_OPT_TYPE_CHANNEL_LAYOUT, + AV_OPT_TYPE_BOOL, }; /** @@ -274,14 +275,11 @@ typedef struct AVOption { int flags; #define AV_OPT_FLAG_ENCODING_PARAM 1 ///< a generic parameter which can be set by the user for muxing or encoding #define AV_OPT_FLAG_DECODING_PARAM 2 ///< a generic parameter which can be set by the user for demuxing or decoding -#if FF_API_OPT_TYPE_METADATA -#define AV_OPT_FLAG_METADATA 4 ///< some data extracted or inserted into the file like title, comment, ... -#endif #define AV_OPT_FLAG_AUDIO_PARAM 8 #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 /** @@ -289,7 +287,9 @@ typedef struct AVOption { * This flag only makes sense when AV_OPT_FLAG_EXPORT is also set. */ #define AV_OPT_FLAG_READONLY 128 +#define AV_OPT_FLAG_BSF_PARAM (1<<8) ///< a generic parameter which can be set by the user for bit stream filtering #define AV_OPT_FLAG_FILTERING_PARAM (1<<16) ///< a generic parameter which can be set by the user for filtering +#define AV_OPT_FLAG_DEPRECATED (1<<17) ///< set if option is deprecated, users should refer to AVOption.help text for more information //FIXME think about enc-audio, ... style flags /** diff --git a/neo/libs/ffmpeg-win64/include/libavutil/pixdesc.h b/neo/libs/ffmpeg-win64/include/libavutil/pixdesc.h index a6056fe1..c055810a 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/pixdesc.h +++ b/neo/libs/ffmpeg-win64/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. */ @@ -154,17 +154,21 @@ typedef struct AVPixFmtDescriptor { * in some cases be simpler. Or the data can be interpreted purely based on * the pixel format without using the palette. * An example of a pseudo-paletted format is AV_PIX_FMT_GRAY8 + * + * @deprecated This flag is deprecated, and will be removed. When it is removed, + * the extra palette allocation in AVFrame.data[1] is removed as well. Only + * actual paletted formats (as indicated by AV_PIX_FMT_FLAG_PAL) will have a + * palette. Starting with FFmpeg versions which have this flag deprecated, the + * extra "pseudo" palette is already ignored, and API users are not required to + * allocate a palette for AV_PIX_FMT_FLAG_PSEUDOPAL formats (it was required + * before the deprecation, though). */ #define AV_PIX_FMT_FLAG_PSEUDOPAL (1 << 6) /** * The pixel format has an alpha channel. This is set on all formats that - * support alpha in some way. The exception is AV_PIX_FMT_PAL8, which can - * carry alpha as part of the palette. Details are explained in the - * AVPixelFormat enum, and are also encoded in the corresponding - * AVPixFmtDescriptor. - * - * The alpha is always straight, never pre-multiplied. + * support alpha in some way, including AV_PIX_FMT_PAL8. The alpha is always + * straight, never pre-multiplied. * * If a codec or a filter does not support alpha, it should set all alpha to * opaque, or use the equivalent pixel formats without alpha component, e.g. @@ -173,76 +177,15 @@ 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. + * The pixel format is following a Bayer pattern */ -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); +#define AV_PIX_FMT_FLAG_BAYER (1 << 8) /** - * 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 + * The pixel format contains IEEE-754 floating point values. Precision (double, + * single, or half) should be determined by the pixel size (64, 32, or 16 bits). */ -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); +#define AV_PIX_FMT_FLAG_FLOAT (1 << 9) /** * Return the number of bits per pixel used by the pixel format @@ -286,14 +229,9 @@ enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc); * Utility function to access log2_chroma_w log2_chroma_h from * the pixel format AVPixFmtDescriptor. * - * See av_get_chroma_sub_sample() for a function that asserts a - * valid pixel format instead of returning an error code. - * Its recommended that you use avcodec_get_chroma_sub_sample unless - * 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 +244,139 @@ 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 AVColorRange value for name or an AVError if not found. + */ +int av_color_range_from_name(const char *name); + +/** + * @return the name for provided color primaries or NULL if unknown. + */ +const char *av_color_primaries_name(enum AVColorPrimaries primaries); + +/** + * @return the AVColorPrimaries value for name or an AVError if not found. + */ +int av_color_primaries_from_name(const char *name); + +/** + * @return the name for provided color transfer or NULL if unknown. + */ +const char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer); + +/** + * @return the AVColorTransferCharacteristic value for name or an AVError if not found. + */ +int av_color_transfer_from_name(const char *name); + +/** + * @return the name for provided color space or NULL if unknown. + */ +const char *av_color_space_name(enum AVColorSpace space); + +/** + * @return the AVColorSpace value for name or an AVError if not found. + */ +int av_color_space_from_name(const char *name); + +/** + * @return the name for provided chroma location or NULL if unknown. + */ +const char *av_chroma_location_name(enum AVChromaLocation location); + +/** + * @return the AVChromaLocation value for name or an AVError if not found. + */ +int av_chroma_location_from_name(const char *name); + +/** + * 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. + * @param dst_element_size size of elements in dst array (2 or 4 byte) + */ +void av_read_image_line2(void *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, + int dst_element_size); + +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 + * @param src_element_size size of elements in src array (2 or 4 byte) + */ +void av_write_image_line2(const void *src, uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w, int src_element_size); + +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 +437,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/neo/libs/ffmpeg-win64/include/libavutil/pixfmt.h b/neo/libs/ffmpeg-win64/include/libavutil/pixfmt.h index 32044f07..8b54c941 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/pixfmt.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/pixfmt.h @@ -24,7 +24,6 @@ /** * @file * pixel format definitions - * */ #include "libavutil/avconfig.h" @@ -43,6 +42,10 @@ * This is stored as BGRA on little-endian CPU architectures and ARGB on * big-endian CPUs. * + * @note + * If the resolution is not a multiple of the chroma subsampling factor + * then the chroma plane resolution must be rounded up. + * * @par * When the pixel format is palettized RGB32 (AV_PIX_FMT_PAL8), the palettized * image data is stored in AVFrame.data[0]. The palette is transported in @@ -54,7 +57,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,15 +74,10 @@ 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 -#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 AV_PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb) @@ -101,13 +99,6 @@ enum AVPixelFormat { AV_PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples) AV_PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range AV_PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples) -#if FF_API_VDPAU - AV_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 - AV_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 - AV_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 - AV_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 - AV_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 AV_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 AV_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 @@ -126,7 +117,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 @@ -143,16 +134,13 @@ enum AVPixelFormat { AV_PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian 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 -#endif AV_PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer AV_PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined 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 @@ -177,8 +165,8 @@ enum AVPixelFormat { AV_PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian AV_PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian 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 @@ -221,10 +209,8 @@ enum AVPixelFormat { AV_PIX_FMT_YVYU422, ///< packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb - 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 @@ -240,9 +226,15 @@ enum AVPixelFormat { */ AV_PIX_FMT_MMAL, - AV_PIX_FMT_D3D11VA_VLD, ///< HW decoding through Direct3D11, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer + AV_PIX_FMT_D3D11VA_VLD, ///< HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer - AV_PIX_FMT_0RGB=0x123+4,///< packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined + /** + * HW acceleration through CUDA. data[i] contain CUdeviceptr pointers + * exactly as for system memory frames. + */ + AV_PIX_FMT_CUDA, + + AV_PIX_FMT_0RGB, ///< 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 AV_PIX_FMT_BGR0, ///< packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined @@ -277,9 +269,9 @@ enum AVPixelFormat { AV_PIX_FMT_BAYER_GBRG16BE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian */ AV_PIX_FMT_BAYER_GRBG16LE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian */ AV_PIX_FMT_BAYER_GRBG16BE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian */ -#if !FF_API_XVMC + AV_PIX_FMT_XVMC,///< XVideo Motion Acceleration via common packet passing -#endif /* !FF_API_XVMC */ + AV_PIX_FMT_YUV440P10LE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian AV_PIX_FMT_YUV440P10BE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian AV_PIX_FMT_YUV440P12LE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian @@ -289,11 +281,75 @@ 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_GRAY12BE, ///< Y , 12bpp, big-endian + AV_PIX_FMT_GRAY12LE, ///< Y , 12bpp, little-endian + AV_PIX_FMT_GRAY10BE, ///< Y , 10bpp, big-endian + AV_PIX_FMT_GRAY10LE, ///< Y , 10bpp, little-endian + + AV_PIX_FMT_P016LE, ///< like NV12, with 16bpp per component, little-endian + AV_PIX_FMT_P016BE, ///< like NV12, with 16bpp per component, big-endian + + /** + * Hardware surfaces for Direct3D11. + * + * This is preferred over the legacy AV_PIX_FMT_D3D11VA_VLD. The new D3D11 + * hwaccel API and filtering support AV_PIX_FMT_D3D11 only. + * + * data[0] contains a ID3D11Texture2D pointer, and data[1] contains the + * texture array index of the frame as intptr_t if the ID3D11Texture2D is + * an array texture (or always 0 if it's a normal texture). + */ + AV_PIX_FMT_D3D11, + + AV_PIX_FMT_GRAY9BE, ///< Y , 9bpp, big-endian + AV_PIX_FMT_GRAY9LE, ///< Y , 9bpp, little-endian + + AV_PIX_FMT_GBRPF32BE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, big-endian + AV_PIX_FMT_GBRPF32LE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, little-endian + AV_PIX_FMT_GBRAPF32BE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian + AV_PIX_FMT_GBRAPF32LE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian + + /** + * DRM-managed buffers exposed through PRIME buffer sharing. + * + * data[0] points to an AVDRMFrameDescriptor. + */ + AV_PIX_FMT_DRM_PRIME, + /** + * Hardware surfaces for OpenCL. + * + * data[i] contain 2D image objects (typed in C as cl_mem, used + * in OpenCL as image2d_t) for each plane of the surface. + */ + AV_PIX_FMT_OPENCL, + + AV_PIX_FMT_GRAY14BE, ///< Y , 14bpp, big-endian + AV_PIX_FMT_GRAY14LE, ///< Y , 14bpp, little-endian + + AV_PIX_FMT_GRAYF32BE, ///< IEEE-754 single precision Y, 32bpp, big-endian + AV_PIX_FMT_GRAYF32LE, ///< IEEE-754 single precision Y, 32bpp, little-endian + + AV_PIX_FMT_YUVA422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, big-endian + AV_PIX_FMT_YUVA422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, little-endian + AV_PIX_FMT_YUVA444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, big-endian + AV_PIX_FMT_YUVA444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, little-endian + + AV_PIX_FMT_NV24, ///< planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V) + AV_PIX_FMT_NV42, ///< as above, but U and V bytes are swapped + + 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 @@ -308,6 +364,10 @@ enum AVPixelFormat { #define AV_PIX_FMT_0RGB32 AV_PIX_FMT_NE(0RGB, BGR0) #define AV_PIX_FMT_0BGR32 AV_PIX_FMT_NE(0BGR, RGB0) +#define AV_PIX_FMT_GRAY9 AV_PIX_FMT_NE(GRAY9BE, GRAY9LE) +#define AV_PIX_FMT_GRAY10 AV_PIX_FMT_NE(GRAY10BE, GRAY10LE) +#define AV_PIX_FMT_GRAY12 AV_PIX_FMT_NE(GRAY12BE, GRAY12LE) +#define AV_PIX_FMT_GRAY14 AV_PIX_FMT_NE(GRAY14BE, GRAY14LE) #define AV_PIX_FMT_GRAY16 AV_PIX_FMT_NE(GRAY16BE, GRAY16LE) #define AV_PIX_FMT_YA16 AV_PIX_FMT_NE(YA16BE, YA16LE) #define AV_PIX_FMT_RGB48 AV_PIX_FMT_NE(RGB48BE, RGB48LE) @@ -344,6 +404,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) @@ -351,6 +413,10 @@ enum AVPixelFormat { #define AV_PIX_FMT_BAYER_GBRG16 AV_PIX_FMT_NE(BAYER_GBRG16BE, BAYER_GBRG16LE) #define AV_PIX_FMT_BAYER_GRBG16 AV_PIX_FMT_NE(BAYER_GRBG16BE, BAYER_GRBG16LE) +#define AV_PIX_FMT_GBRPF32 AV_PIX_FMT_NE(GBRPF32BE, GBRPF32LE) +#define AV_PIX_FMT_GBRAPF32 AV_PIX_FMT_NE(GBRAPF32BE, GBRAPF32LE) + +#define AV_PIX_FMT_GRAYF32 AV_PIX_FMT_NE(GRAYF32BE, GRAYF32LE) #define AV_PIX_FMT_YUVA420P9 AV_PIX_FMT_NE(YUVA420P9BE , YUVA420P9LE) #define AV_PIX_FMT_YUVA422P9 AV_PIX_FMT_NE(YUVA422P9BE , YUVA422P9LE) @@ -358,6 +424,8 @@ enum AVPixelFormat { #define AV_PIX_FMT_YUVA420P10 AV_PIX_FMT_NE(YUVA420P10BE, YUVA420P10LE) #define AV_PIX_FMT_YUVA422P10 AV_PIX_FMT_NE(YUVA422P10BE, YUVA422P10LE) #define AV_PIX_FMT_YUVA444P10 AV_PIX_FMT_NE(YUVA444P10BE, YUVA444P10LE) +#define AV_PIX_FMT_YUVA422P12 AV_PIX_FMT_NE(YUVA422P12BE, YUVA422P12LE) +#define AV_PIX_FMT_YUVA444P12 AV_PIX_FMT_NE(YUVA444P12BE, YUVA444P12LE) #define AV_PIX_FMT_YUVA420P16 AV_PIX_FMT_NE(YUVA420P16BE, YUVA420P16LE) #define AV_PIX_FMT_YUVA422P16 AV_PIX_FMT_NE(YUVA422P16BE, YUVA422P16LE) #define AV_PIX_FMT_YUVA444P16 AV_PIX_FMT_NE(YUVA444P16BE, YUVA444P16LE) @@ -365,9 +433,12 @@ 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) +#define AV_PIX_FMT_P016 AV_PIX_FMT_NE(P016BE, P016LE) /** * Chromaticity coordinates of the source primaries. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.1. */ enum AVColorPrimaries { AVCOL_PRI_RESERVED0 = 0, @@ -381,12 +452,17 @@ 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_SMPTE428 = 10, ///< SMPTE ST 428-1 (CIE 1931 XYZ) + AVCOL_PRI_SMPTEST428_1 = AVCOL_PRI_SMPTE428, + AVCOL_PRI_SMPTE431 = 11, ///< SMPTE ST 431-2 (2011) / DCI P3 + AVCOL_PRI_SMPTE432 = 12, ///< SMPTE ST 432-1 (2010) / P3 D65 / Display P3 + AVCOL_PRI_JEDEC_P22 = 22, ///< JEDEC P22 phosphors + AVCOL_PRI_NB ///< Not part of ABI }; /** * Color Transfer Characteristic. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.2. */ enum AVColorTransferCharacteristic { AVCOL_TRC_RESERVED0 = 0, @@ -403,15 +479,19 @@ 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_SMPTEST428_1 = 17, ///< SMPTE ST 428-1 - AVCOL_TRC_NB, ///< Not part of ABI + 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_SMPTE2084 = 16, ///< SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems + AVCOL_TRC_SMPTEST2084 = AVCOL_TRC_SMPTE2084, + AVCOL_TRC_SMPTE428 = 17, ///< SMPTE ST 428-1 + AVCOL_TRC_SMPTEST428_1 = AVCOL_TRC_SMPTE428, + AVCOL_TRC_ARIB_STD_B67 = 18, ///< ARIB STD-B67, known as "Hybrid log-gamma" + AVCOL_TRC_NB ///< Not part of ABI }; /** * YUV colorspace type. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.3. */ enum AVColorSpace { AVCOL_SPC_RGB = 0, ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB) @@ -420,15 +500,18 @@ 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_YCOCG = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16 + 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_YCGCO = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16 + AVCOL_SPC_YCOCG = AVCOL_SPC_YCGCO, 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_CHROMA_DERIVED_NCL = 12, ///< Chromaticity-derived non-constant luminance system + AVCOL_SPC_CHROMA_DERIVED_CL = 13, ///< Chromaticity-derived constant luminance system + AVCOL_SPC_ICTCP = 14, ///< ITU-R BT.2100-0, ICtCp + AVCOL_SPC_NB ///< Not part of ABI }; -#define AVCOL_SPC_YCGCO AVCOL_SPC_YCOCG - /** * MPEG vs JPEG YUV range. @@ -437,7 +520,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 +540,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/neo/libs/ffmpeg-win64/include/libavutil/rational.h b/neo/libs/ffmpeg-win64/include/libavutil/rational.h index 28974696..5c6b67b4 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/rational.h +++ b/neo/libs/ffmpeg-win64/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/neo/libs/ffmpeg-win64/include/libavutil/replaygain.h b/neo/libs/ffmpeg-win64/include/libavutil/replaygain.h index 5c03e199..b49bf1a3 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/replaygain.h +++ b/neo/libs/ffmpeg-win64/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/neo/libs/ffmpeg-win64/include/libavutil/ripemd.h b/neo/libs/ffmpeg-win64/include/libavutil/ripemd.h index 7b0c8bc8..0db6858f 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/ripemd.h +++ b/neo/libs/ffmpeg-win64/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. + * * @{ */ @@ -58,7 +66,11 @@ int av_ripemd_init(struct AVRIPEMD* context, int bits); * @param data input data to update hash with * @param len input data length */ +#if FF_API_CRYPTO_SIZE_T void av_ripemd_update(struct AVRIPEMD* context, const uint8_t* data, unsigned int len); +#else +void av_ripemd_update(struct AVRIPEMD* context, const uint8_t* data, size_t len); +#endif /** * Finish hashing and output digest value. diff --git a/neo/libs/ffmpeg-win64/include/libavutil/samplefmt.h b/neo/libs/ffmpeg-win64/include/libavutil/samplefmt.h index 6a8a031c..8cd43ae8 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/samplefmt.h +++ b/neo/libs/ffmpeg-win64/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/neo/libs/ffmpeg-win64/include/libavutil/sha.h b/neo/libs/ffmpeg-win64/include/libavutil/sha.h index bf4377e5..c0180e57 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/sha.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/sha.h @@ -18,9 +18,16 @@ * 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 +#include #include #include "attributes.h" @@ -28,7 +35,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. + * * @{ */ @@ -53,11 +70,15 @@ int av_sha_init(struct AVSHA* context, int bits); /** * Update hash value. * - * @param context hash function context + * @param ctx hash function context * @param data input data to update hash with * @param len input data length */ -void av_sha_update(struct AVSHA* context, const uint8_t* data, unsigned int len); +#if FF_API_CRYPTO_SIZE_T +void av_sha_update(struct AVSHA *ctx, const uint8_t *data, unsigned int len); +#else +void av_sha_update(struct AVSHA *ctx, const uint8_t *data, size_t len); +#endif /** * Finish hashing and output digest value. diff --git a/neo/libs/ffmpeg-win64/include/libavutil/sha512.h b/neo/libs/ffmpeg-win64/include/libavutil/sha512.h index 7b087014..bef714b4 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/sha512.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/sha512.h @@ -19,17 +19,35 @@ * 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 +#include #include #include "attributes.h" #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. + * * @{ */ @@ -58,7 +76,11 @@ int av_sha512_init(struct AVSHA512* context, int bits); * @param data input data to update hash with * @param len input data length */ +#if FF_API_CRYPTO_SIZE_T void av_sha512_update(struct AVSHA512* context, const uint8_t* data, unsigned int len); +#else +void av_sha512_update(struct AVSHA512* context, const uint8_t* data, size_t len); +#endif /** * Finish hashing and output digest value. diff --git a/neo/libs/ffmpeg-win64/include/libavutil/spherical.h b/neo/libs/ffmpeg-win64/include/libavutil/spherical.h new file mode 100644 index 00000000..cef759cf --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavutil/spherical.h @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2016 Vittorio Giovara + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * Spherical video + */ + +#ifndef AVUTIL_SPHERICAL_H +#define AVUTIL_SPHERICAL_H + +#include +#include + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_spherical Spherical video mapping + * @{ + */ + +/** + * @addtogroup lavu_video_spherical + * A spherical video file contains surfaces that need to be mapped onto a + * sphere. Depending on how the frame was converted, a different distortion + * transformation or surface recomposition function needs to be applied before + * the video should be mapped and displayed. + */ + +/** + * Projection of the video surface(s) on a sphere. + */ +enum AVSphericalProjection { + /** + * Video represents a sphere mapped on a flat surface using + * equirectangular projection. + */ + AV_SPHERICAL_EQUIRECTANGULAR, + + /** + * Video frame is split into 6 faces of a cube, and arranged on a + * 3x2 layout. Faces are oriented upwards for the front, left, right, + * and back faces. The up face is oriented so the top of the face is + * forwards and the down face is oriented so the top of the face is + * to the back. + */ + AV_SPHERICAL_CUBEMAP, + + /** + * Video represents a portion of a sphere mapped on a flat surface + * using equirectangular projection. The @ref bounding fields indicate + * the position of the current video in a larger surface. + */ + AV_SPHERICAL_EQUIRECTANGULAR_TILE, +}; + +/** + * This structure describes how to handle spherical videos, outlining + * information about projection, initial layout, and any other view modifier. + * + * @note The struct must be allocated with av_spherical_alloc() and + * its size is not a part of the public ABI. + */ +typedef struct AVSphericalMapping { + /** + * Projection type. + */ + enum AVSphericalProjection projection; + + /** + * @name Initial orientation + * @{ + * There fields describe additional rotations applied to the sphere after + * the video frame is mapped onto it. The sphere is rotated around the + * viewer, who remains stationary. The order of transformation is always + * yaw, followed by pitch, and finally by roll. + * + * The coordinate system matches the one defined in OpenGL, where the + * forward vector (z) is coming out of screen, and it is equivalent to + * a rotation matrix of R = r_y(yaw) * r_x(pitch) * r_z(roll). + * + * A positive yaw rotates the portion of the sphere in front of the viewer + * toward their right. A positive pitch rotates the portion of the sphere + * in front of the viewer upwards. A positive roll tilts the portion of + * the sphere in front of the viewer to the viewer's right. + * + * These values are exported as 16.16 fixed point. + * + * See this equirectangular projection as example: + * + * @code{.unparsed} + * Yaw + * -180 0 180 + * 90 +-------------+-------------+ 180 + * | | | up + * P | | | y| forward + * i | ^ | | /z + * t 0 +-------------X-------------+ 0 Roll | / + * c | | | | / + * h | | | 0|/_____right + * | | | x + * -90 +-------------+-------------+ -180 + * + * X - the default camera center + * ^ - the default up vector + * @endcode + */ + int32_t yaw; ///< Rotation around the up vector [-180, 180]. + int32_t pitch; ///< Rotation around the right vector [-90, 90]. + int32_t roll; ///< Rotation around the forward vector [-180, 180]. + /** + * @} + */ + + /** + * @name Bounding rectangle + * @anchor bounding + * @{ + * These fields indicate the location of the current tile, and where + * it should be mapped relative to the original surface. They are + * exported as 0.32 fixed point, and can be converted to classic + * pixel values with av_spherical_bounds(). + * + * @code{.unparsed} + * +----------------+----------+ + * | |bound_top | + * | +--------+ | + * | bound_left |tile | | + * +<---------->| |<--->+bound_right + * | +--------+ | + * | | | + * | bound_bottom| | + * +----------------+----------+ + * @endcode + * + * If needed, the original video surface dimensions can be derived + * by adding the current stream or frame size to the related bounds, + * like in the following example: + * + * @code{c} + * original_width = tile->width + bound_left + bound_right; + * original_height = tile->height + bound_top + bound_bottom; + * @endcode + * + * @note These values are valid only for the tiled equirectangular + * projection type (@ref AV_SPHERICAL_EQUIRECTANGULAR_TILE), + * and should be ignored in all other cases. + */ + uint32_t bound_left; ///< Distance from the left edge + uint32_t bound_top; ///< Distance from the top edge + uint32_t bound_right; ///< Distance from the right edge + uint32_t bound_bottom; ///< Distance from the bottom edge + /** + * @} + */ + + /** + * Number of pixels to pad from the edge of each cube face. + * + * @note This value is valid for only for the cubemap projection type + * (@ref AV_SPHERICAL_CUBEMAP), and should be ignored in all other + * cases. + */ + uint32_t padding; +} AVSphericalMapping; + +/** + * Allocate a AVSphericalVideo structure and initialize its fields to default + * values. + * + * @return the newly allocated struct or NULL on failure + */ +AVSphericalMapping *av_spherical_alloc(size_t *size); + +/** + * Convert the @ref bounding fields from an AVSphericalVideo + * from 0.32 fixed point to pixels. + * + * @param map The AVSphericalVideo map to read bound values from. + * @param width Width of the current frame or stream. + * @param height Height of the current frame or stream. + * @param left Pixels from the left edge. + * @param top Pixels from the top edge. + * @param right Pixels from the right edge. + * @param bottom Pixels from the bottom edge. + */ +void av_spherical_tile_bounds(const AVSphericalMapping *map, + size_t width, size_t height, + size_t *left, size_t *top, + size_t *right, size_t *bottom); + +/** + * Provide a human-readable name of a given AVSphericalProjection. + * + * @param projection The input AVSphericalProjection. + * + * @return The name of the AVSphericalProjection, or "unknown". + */ +const char *av_spherical_projection_name(enum AVSphericalProjection projection); + +/** + * Get the AVSphericalProjection form a human-readable name. + * + * @param name The input string. + * + * @return The AVSphericalProjection value, or -1 if not found. + */ +int av_spherical_from_name(const char *name); +/** + * @} + * @} + */ + +#endif /* AVUTIL_SPHERICAL_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/stereo3d.h b/neo/libs/ffmpeg-win64/include/libavutil/stereo3d.h index 1135dc9d..d421aac2 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/stereo3d.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/stereo3d.h @@ -18,6 +18,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/** + * @file + * Stereoscopic video + */ + #ifndef AVUTIL_STEREO3D_H #define AVUTIL_STEREO3D_H @@ -25,6 +30,21 @@ #include "frame.h" +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_stereo3d Stereo3D types and functions + * @{ + */ + +/** + * @addtogroup lavu_video_stereo3d + * A stereoscopic video file consists in multiple views embedded in a single + * frame, usually describing two views of a scene. This file describes all + * possible codec-independent view arrangements. + * */ + /** * List of possible 3D Types */ @@ -37,41 +57,49 @@ enum AVStereo3DType { /** * Views are next to each other. * + * @code{.unparsed} * LLLLRRRR * LLLLRRRR * LLLLRRRR * ... + * @endcode */ AV_STEREO3D_SIDEBYSIDE, /** * Views are on top of each other. * + * @code{.unparsed} * LLLLLLLL * LLLLLLLL * RRRRRRRR * RRRRRRRR + * @endcode */ AV_STEREO3D_TOPBOTTOM, /** * Views are alternated temporally. * + * @code{.unparsed} * frame0 frame1 frame2 ... * LLLLLLLL RRRRRRRR LLLLLLLL * LLLLLLLL RRRRRRRR LLLLLLLL * LLLLLLLL RRRRRRRR LLLLLLLL * ... ... ... + * @endcode */ AV_STEREO3D_FRAMESEQUENCE, /** * Views are packed in a checkerboard-like structure per pixel. * + * @code{.unparsed} * LRLRLRLR * RLRLRLRL * LRLRLRLR * ... + * @endcode */ AV_STEREO3D_CHECKERBOARD, @@ -79,34 +107,59 @@ enum AVStereo3DType { * Views are next to each other, but when upscaling * apply a checkerboard pattern. * + * @code{.unparsed} * LLLLRRRR L L L L R R R R * LLLLRRRR => L L L L R R R R * LLLLRRRR L L L L R R R R * LLLLRRRR L L L L R R R R + * @endcode */ AV_STEREO3D_SIDEBYSIDE_QUINCUNX, /** * Views are packed per line, as if interlaced. * + * @code{.unparsed} * LLLLLLLL * RRRRRRRR * LLLLLLLL * ... + * @endcode */ AV_STEREO3D_LINES, /** * Views are packed per column. * + * @code{.unparsed} * LRLRLRLR * LRLRLRLR * LRLRLRLR * ... + * @endcode */ AV_STEREO3D_COLUMNS, }; +/** + * List of possible view types. + */ +enum AVStereo3DView { + /** + * Frame contains two packed views. + */ + AV_STEREO3D_VIEW_PACKED, + + /** + * Frame contains only the left view. + */ + AV_STEREO3D_VIEW_LEFT, + + /** + * Frame contains only the right view. + */ + AV_STEREO3D_VIEW_RIGHT, +}; /** * Inverted views, Right/Bottom represents the left view. @@ -130,6 +183,11 @@ typedef struct AVStereo3D { * Additional information about the frame packing. */ int flags; + + /** + * Determines which views are packed. + */ + enum AVStereo3DView view; } AVStereo3D; /** @@ -149,4 +207,27 @@ 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 name 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/neo/libs/ffmpeg-win64/include/libavutil/threadmessage.h b/neo/libs/ffmpeg-win64/include/libavutil/threadmessage.h index a8481d8e..42ce655f 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/threadmessage.h +++ b/neo/libs/ffmpeg-win64/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,12 +80,36 @@ 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); +/** + * Set the optional free message callback function which will be called if an + * operation is removing messages from the queue. + */ +void av_thread_message_queue_set_free_func(AVThreadMessageQueue *mq, + void (*free_func)(void *msg)); + +/** + * Return the current number of messages in the queue. + * + * @return the current number of messages or AVERROR(ENOSYS) if lavu was built + * without thread support + */ +int av_thread_message_queue_nb_elems(AVThreadMessageQueue *mq); + +/** + * Flush the message queue + * + * This function is mostly equivalent to reading and free-ing every message + * except that it will be done in a single operation (no lock/unlock between + * reads). + */ +void av_thread_message_flush(AVThreadMessageQueue *mq); + #endif /* AVUTIL_THREADMESSAGE_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/timecode.h b/neo/libs/ffmpeg-win64/include/libavutil/timecode.h index 56e3975f..37c1361b 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/timecode.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/timecode.h @@ -30,7 +30,7 @@ #include #include "rational.h" -#define AV_TIMECODE_STR_SIZE 16 +#define AV_TIMECODE_STR_SIZE 23 enum AVTimecodeFlag { AV_TIMECODE_FLAG_DROPFRAME = 1<<0, ///< timecode is drop frame diff --git a/neo/libs/ffmpeg-win64/include/libavutil/timestamp.h b/neo/libs/ffmpeg-win64/include/libavutil/timestamp.h index f010a7ee..e082f01b 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/timestamp.h +++ b/neo/libs/ffmpeg-win64/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/neo/libs/ffmpeg-win64/include/libavutil/tree.h b/neo/libs/ffmpeg-win64/include/libavutil/tree.h index e1aefaa9..d5e0aebf 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/tree.h +++ b/neo/libs/ffmpeg-win64/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/neo/libs/ffmpeg-win64/include/libavutil/tx.h b/neo/libs/ffmpeg-win64/include/libavutil/tx.h new file mode 100644 index 00000000..b1f2d963 --- /dev/null +++ b/neo/libs/ffmpeg-win64/include/libavutil/tx.h @@ -0,0 +1,81 @@ +/* + * 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_TX_H +#define AVUTIL_TX_H + +#include +#include + +typedef struct AVTXContext AVTXContext; + +typedef struct AVComplexFloat { + float re, im; +} AVComplexFloat; + +enum AVTXType { + /** + * Standard complex to complex FFT with sample data type AVComplexFloat. + * Scaling currently unsupported + */ + AV_TX_FLOAT_FFT = 0, + /** + * Standard MDCT with sample data type of float and a scale type of + * float. Length is the frame size, not the window size (which is 2x frame) + */ + AV_TX_FLOAT_MDCT = 1, +}; + +/** + * Function pointer to a function to perform the transform. + * + * @note Using a different context than the one allocated during av_tx_init() + * is not allowed. + * + * @param s the transform context + * @param out the output array + * @param in the input array + * @param stride the input or output stride (depending on transform direction) + * in bytes, currently implemented for all MDCT transforms + */ +typedef void (*av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride); + +/** + * Initialize a transform context with the given configuration + * Currently power of two lengths from 4 to 131072 are supported, along with + * any length decomposable to a power of two and either 3, 5 or 15. + * + * @param ctx the context to allocate, will be NULL on error + * @param tx pointer to the transform function pointer to set + * @param type type the type of transform + * @param inv whether to do an inverse or a forward transform + * @param len the size of the transform in samples + * @param scale pointer to the value to scale the output if supported by type + * @param flags currently unused + * + * @return 0 on success, negative error code on failure + */ +int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, + int inv, int len, const void *scale, uint64_t flags); + +/** + * Frees a context and sets ctx to NULL, does nothing when ctx == NULL + */ +void av_tx_uninit(AVTXContext **ctx); + +#endif /* AVUTIL_TX_H */ diff --git a/neo/libs/ffmpeg-win64/include/libavutil/version.h b/neo/libs/ffmpeg-win64/include/libavutil/version.h index 909f9a62..24ca8ab7 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/version.h +++ b/neo/libs/ffmpeg-win64/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. + * * @{ */ @@ -37,13 +58,15 @@ #define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) /** - * @} + * Extract version components from the full ::AV_VERSION_INT int as returned + * by functions like ::avformat_version() and ::avcodec_version() */ +#define AV_VERSION_MAJOR(a) ((a) >> 16) +#define AV_VERSION_MINOR(a) (((a) & 0x00FF00) >> 8) +#define AV_VERSION_MICRO(a) ((a) & 0xFF) /** - * @file - * @ingroup lavu - * Libavutil version macros + * @} */ /** @@ -55,8 +78,8 @@ * @{ */ -#define LIBAVUTIL_VERSION_MAJOR 55 -#define LIBAVUTIL_VERSION_MINOR 5 +#define LIBAVUTIL_VERSION_MAJOR 56 +#define LIBAVUTIL_VERSION_MINOR 31 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ @@ -70,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. @@ -84,35 +105,35 @@ * @{ */ -#ifndef FF_API_VDPAU -#define FF_API_VDPAU (LIBAVUTIL_VERSION_MAJOR < 56) -#endif -#ifndef FF_API_XVMC -#define FF_API_XVMC (LIBAVUTIL_VERSION_MAJOR < 56) -#endif -#ifndef FF_API_OPT_TYPE_METADATA -#define FF_API_OPT_TYPE_METADATA (LIBAVUTIL_VERSION_MAJOR < 56) -#endif -#ifndef FF_API_DLOG -#define FF_API_DLOG (LIBAVUTIL_VERSION_MAJOR < 56) -#endif #ifndef FF_API_VAAPI -#define FF_API_VAAPI (LIBAVUTIL_VERSION_MAJOR < 56) +#define FF_API_VAAPI (LIBAVUTIL_VERSION_MAJOR < 57) #endif #ifndef FF_API_FRAME_QP -#define FF_API_FRAME_QP (LIBAVUTIL_VERSION_MAJOR < 56) +#define FF_API_FRAME_QP (LIBAVUTIL_VERSION_MAJOR < 57) #endif #ifndef FF_API_PLUS1_MINUS1 -#define FF_API_PLUS1_MINUS1 (LIBAVUTIL_VERSION_MAJOR < 56) +#define FF_API_PLUS1_MINUS1 (LIBAVUTIL_VERSION_MAJOR < 57) #endif #ifndef FF_API_ERROR_FRAME -#define FF_API_ERROR_FRAME (LIBAVUTIL_VERSION_MAJOR < 56) +#define FF_API_ERROR_FRAME (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_PKT_PTS +#define FF_API_PKT_PTS (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_CRYPTO_SIZE_T +#define FF_API_CRYPTO_SIZE_T (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_FRAME_GET_SET +#define FF_API_FRAME_GET_SET (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_PSEUDOPAL +#define FF_API_PSEUDOPAL (LIBAVUTIL_VERSION_MAJOR < 57) #endif /** + * @} * @} */ #endif /* AVUTIL_VERSION_H */ - diff --git a/neo/libs/ffmpeg-win64/include/libavutil/xtea.h b/neo/libs/ffmpeg-win64/include/libavutil/xtea.h index bcf786cc..735427c1 100644 --- a/neo/libs/ffmpeg-win64/include/libavutil/xtea.h +++ b/neo/libs/ffmpeg-win64/include/libavutil/xtea.h @@ -45,12 +45,23 @@ AVXTEA *av_xtea_alloc(void); * Initialize an AVXTEA context. * * @param ctx an AVXTEA context - * @param key a key of 16 bytes used for encryption/decryption + * @param key a key of 16 bytes used for encryption/decryption, + * interpreted as big endian 32 bit numbers */ void av_xtea_init(struct AVXTEA *ctx, const uint8_t key[16]); /** - * Encrypt or decrypt a buffer using a previously initialized context. + * Initialize an AVXTEA context. + * + * @param ctx an AVXTEA context + * @param key a key of 16 bytes used for encryption/decryption, + * interpreted as little endian 32 bit numbers + */ +void av_xtea_le_init(struct AVXTEA *ctx, const uint8_t key[16]); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, + * in big endian format. * * @param ctx an AVXTEA context * @param dst destination array, can be equal to src @@ -62,6 +73,20 @@ void av_xtea_init(struct AVXTEA *ctx, const uint8_t key[16]); void av_xtea_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); +/** + * Encrypt or decrypt a buffer using a previously initialized context, + * in little endian format. + * + * @param ctx an AVXTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_xtea_le_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + /** * @} */ diff --git a/neo/libs/ffmpeg-win64/include/libpostproc/postprocess.h b/neo/libs/ffmpeg-win64/include/libpostproc/postprocess.h index 2b55ed67..348ee7cc 100644 --- a/neo/libs/ffmpeg-win64/include/libpostproc/postprocess.h +++ b/neo/libs/ffmpeg-win64/include/libpostproc/postprocess.h @@ -28,7 +28,9 @@ */ /** - * @defgroup lpp Libpostproc + * @defgroup lpp libpostproc + * Video postprocessing library. + * * @{ */ @@ -51,10 +53,6 @@ const char *postproc_license(void); #define PP_QUALITY_MAX 6 -#if FF_API_QP_TYPE -#define QP_STORE_T int8_t //deprecated -#endif - #include typedef void pp_context; diff --git a/neo/libs/ffmpeg-win64/include/libpostproc/version.h b/neo/libs/ffmpeg-win64/include/libpostproc/version.h index db557a5b..fa6d12c8 100644 --- a/neo/libs/ffmpeg-win64/include/libpostproc/version.h +++ b/neo/libs/ffmpeg-win64/include/libpostproc/version.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef POSTPROC_POSTPROCESS_VERSION_H -#define POSTPROC_POSTPROCESS_VERSION_H +#ifndef POSTPROC_VERSION_H +#define POSTPROC_VERSION_H /** * @file @@ -28,8 +28,8 @@ #include "libavutil/avutil.h" -#define LIBPOSTPROC_VERSION_MAJOR 54 -#define LIBPOSTPROC_VERSION_MINOR 0 +#define LIBPOSTPROC_VERSION_MAJOR 55 +#define LIBPOSTPROC_VERSION_MINOR 5 #define LIBPOSTPROC_VERSION_MICRO 100 #define LIBPOSTPROC_VERSION_INT AV_VERSION_INT(LIBPOSTPROC_VERSION_MAJOR, \ @@ -42,8 +42,4 @@ #define LIBPOSTPROC_IDENT "postproc" AV_STRINGIFY(LIBPOSTPROC_VERSION) -#ifndef FF_API_QP_TYPE -#define FF_API_QP_TYPE (LIBPOSTPROC_VERSION_MAJOR < 55) -#endif - -#endif /* POSTPROC_POSTPROCESS_VERSION_H */ +#endif /* POSTPROC_VERSION_H */ diff --git a/neo/libs/ffmpeg-win64/include/libswresample/swresample.h b/neo/libs/ffmpeg-win64/include/libswresample/swresample.h index 10eaebc4..c7b84fbc 100644 --- a/neo/libs/ffmpeg-win64/include/libswresample/swresample.h +++ b/neo/libs/ffmpeg-win64/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,15 +120,12 @@ */ #include +#include "libavutil/channel_layout.h" #include "libavutil/frame.h" #include "libavutil/samplefmt.h" #include "libswresample/version.h" -#if LIBSWRESAMPLE_VERSION_MAJOR < 1 -#define SWR_CH_MAX 32 ///< Maximum number of channels -#endif - /** * @name Option constants * These constants are used for the @ref avoptions interface for lswr. @@ -366,6 +362,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/neo/libs/ffmpeg-win64/include/libswresample/version.h b/neo/libs/ffmpeg-win64/include/libswresample/version.h index 12b32826..a0b361bc 100644 --- a/neo/libs/ffmpeg-win64/include/libswresample/version.h +++ b/neo/libs/ffmpeg-win64/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 @@ -28,8 +28,8 @@ #include "libavutil/avutil.h" -#define LIBSWRESAMPLE_VERSION_MAJOR 2 -#define LIBSWRESAMPLE_VERSION_MINOR 0 +#define LIBSWRESAMPLE_VERSION_MAJOR 3 +#define LIBSWRESAMPLE_VERSION_MINOR 5 #define LIBSWRESAMPLE_VERSION_MICRO 100 #define LIBSWRESAMPLE_VERSION_INT AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \ @@ -42,4 +42,4 @@ #define LIBSWRESAMPLE_IDENT "SwR" AV_STRINGIFY(LIBSWRESAMPLE_VERSION) -#endif /* SWR_VERSION_H */ +#endif /* SWRESAMPLE_VERSION_H */ diff --git a/neo/libs/ffmpeg-win64/include/libswscale/swscale.h b/neo/libs/ffmpeg-win64/include/libswscale/swscale.h index da9dd2ea..7713f51e 100644 --- a/neo/libs/ffmpeg-win64/include/libswscale/swscale.h +++ b/neo/libs/ffmpeg-win64/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/neo/libs/ffmpeg-win64/include/libswscale/version.h b/neo/libs/ffmpeg-win64/include/libswscale/version.h index 24908b89..acb289d7 100644 --- a/neo/libs/ffmpeg-win64/include/libswscale/version.h +++ b/neo/libs/ffmpeg-win64/include/libswscale/version.h @@ -26,8 +26,8 @@ #include "libavutil/version.h" -#define LIBSWSCALE_VERSION_MAJOR 4 -#define LIBSWSCALE_VERSION_MINOR 0 +#define LIBSWSCALE_VERSION_MAJOR 5 +#define LIBSWSCALE_VERSION_MINOR 5 #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/neo/libs/ffmpeg-win64/lib/avcodec-57.def b/neo/libs/ffmpeg-win64/lib/avcodec-58.def similarity index 68% rename from neo/libs/ffmpeg-win64/lib/avcodec-57.def rename to neo/libs/ffmpeg-win64/lib/avcodec-58.def index d0bb554a..afc6144a 100644 --- a/neo/libs/ffmpeg-win64/lib/avcodec-57.def +++ b/neo/libs/ffmpeg-win64/lib/avcodec-58.def @@ -1,15 +1,28 @@ EXPORTS - audio_resample - audio_resample_close - av_audio_convert - av_audio_convert_alloc - av_audio_convert_free - av_audio_resample_init + av_ac3_parse_header + av_adts_header_parse av_bitstream_filter_close av_bitstream_filter_filter av_bitstream_filter_init av_bitstream_filter_next - av_codec_ffversion DATA + av_bsf_alloc + av_bsf_flush + av_bsf_free + av_bsf_get_by_name + av_bsf_get_class + av_bsf_get_null_filter + av_bsf_init + av_bsf_iterate + av_bsf_list_alloc + av_bsf_list_append + av_bsf_list_append2 + av_bsf_list_finalize + av_bsf_list_free + av_bsf_list_parse_str + av_bsf_next + av_bsf_receive_packet + av_bsf_send_packet + av_codec_ffversion av_codec_get_chroma_intra_matrix av_codec_get_codec_descriptor av_codec_get_codec_properties @@ -19,6 +32,7 @@ EXPORTS av_codec_get_seek_preroll av_codec_is_decoder av_codec_is_encoder + av_codec_iterate av_codec_next av_codec_set_chroma_intra_matrix av_codec_set_codec_descriptor @@ -27,10 +41,12 @@ EXPORTS av_codec_set_seek_preroll av_copy_packet av_copy_packet_side_data + av_cpb_properties_alloc av_d3d11va_alloc_context av_dct_calc av_dct_end av_dct_init + av_dirac_parse_sequence_header av_dup_packet av_dv_codec_profile av_dv_codec_profile2 @@ -43,6 +59,7 @@ EXPORTS av_fft_permute av_free_packet av_get_audio_frame_duration + av_get_audio_frame_duration2 av_get_bits_per_sample av_get_codec_tag_string av_get_exact_bits_per_sample @@ -53,13 +70,19 @@ EXPORTS av_imdct_calc av_imdct_half av_init_packet + av_jni_get_java_vm + av_jni_set_java_vm av_lockmgr_register - av_log_ask_for_sample - av_log_missing_feature av_mdct_calc av_mdct_end av_mdct_init + av_mediacodec_alloc_context + av_mediacodec_default_free + av_mediacodec_default_init + av_mediacodec_release_buffer + av_mediacodec_render_buffer_at_time av_new_packet + av_packet_add_side_data av_packet_alloc av_packet_clone av_packet_copy_props @@ -67,6 +90,8 @@ EXPORTS av_packet_free_side_data av_packet_from_data av_packet_get_side_data + av_packet_make_refcounted + av_packet_make_writable av_packet_merge_side_data av_packet_move_ref av_packet_new_side_data @@ -81,6 +106,7 @@ EXPORTS av_parser_change av_parser_close av_parser_init + av_parser_iterate av_parser_next av_parser_parse2 av_picture_copy @@ -93,10 +119,6 @@ EXPORTS av_register_bitstream_filter av_register_codec_parser av_register_hwaccel - av_resample - av_resample_close - av_resample_compensate - av_resample_init av_shrink_packet av_vorbis_parse_frame av_vorbis_parse_frame_flags @@ -104,7 +126,6 @@ EXPORTS av_vorbis_parse_init av_vorbis_parse_reset av_xiphlacing - available_bits avcodec_align_dimensions avcodec_align_dimensions2 avcodec_alloc_context3 @@ -142,8 +163,9 @@ EXPORTS avcodec_get_chroma_sub_sample avcodec_get_class avcodec_get_context_defaults3 - avcodec_get_edge_width avcodec_get_frame_class + avcodec_get_hw_config + avcodec_get_hw_frames_parameters avcodec_get_name avcodec_get_pix_fmt_loss avcodec_get_subtitle_rect_class @@ -151,58 +173,66 @@ EXPORTS avcodec_is_open avcodec_license avcodec_open2 + avcodec_parameters_alloc + avcodec_parameters_copy + avcodec_parameters_free + avcodec_parameters_from_context + avcodec_parameters_to_context avcodec_pix_fmt_to_codec_tag + avcodec_profile_name + avcodec_receive_frame + avcodec_receive_packet avcodec_register avcodec_register_all - avcodec_set_dimensions + avcodec_send_frame + avcodec_send_packet avcodec_string avcodec_version - aver_isf_history - average_split_mvs avpicture_alloc avpicture_fill avpicture_free avpicture_get_size avpicture_layout - avpriv_aac_parse_header - avpriv_ac3_channel_layout_tab DATA + avpriv_ac3_channel_layout_tab avpriv_ac3_parse_header avpriv_align_put_bits avpriv_bprint_to_extradata + avpriv_codec2_mode_bit_rate + avpriv_codec2_mode_block_align + avpriv_codec2_mode_frame_size + avpriv_codec_get_cap_skip_frame_fill_param avpriv_copy_bits - avpriv_copy_pce_data avpriv_dca_convert_bitstream - avpriv_dca_sample_rates DATA - avpriv_dirac_parse_sequence_header + avpriv_dca_parse_core_frame_header + avpriv_dca_sample_rates avpriv_dnxhd_get_frame_size + avpriv_dnxhd_get_hr_frame_size avpriv_dnxhd_get_interlaced avpriv_do_elbg avpriv_exif_decode_ifd avpriv_find_pix_fmt avpriv_find_start_code + avpriv_fits_header_init + avpriv_fits_header_parse_line avpriv_get_raw_pix_fmt_tags avpriv_h264_has_num_reorder_frames avpriv_init_elbg - avpriv_lock_avformat - avpriv_mjpeg_bits_ac_chrominance DATA - avpriv_mjpeg_bits_ac_luminance DATA - avpriv_mjpeg_bits_dc_chrominance DATA - avpriv_mjpeg_bits_dc_luminance DATA - avpriv_mjpeg_val_ac_chrominance DATA - avpriv_mjpeg_val_ac_luminance DATA - avpriv_mjpeg_val_dc DATA - avpriv_mpa_bitrate_tab DATA - avpriv_mpa_decode_header - avpriv_mpa_decode_header2 - avpriv_mpa_freq_tab DATA + avpriv_mjpeg_bits_ac_chrominance + avpriv_mjpeg_bits_ac_luminance + avpriv_mjpeg_bits_dc_chrominance + avpriv_mjpeg_bits_dc_luminance + avpriv_mjpeg_val_ac_chrominance + avpriv_mjpeg_val_ac_luminance + avpriv_mjpeg_val_dc + avpriv_mpa_bitrate_tab + avpriv_mpa_freq_tab avpriv_mpeg4audio_get_config - avpriv_mpeg4audio_sample_rates DATA + avpriv_mpeg4audio_sample_rates avpriv_mpegaudio_decode_header - avpriv_pix_fmt_bps_avi DATA - avpriv_pix_fmt_bps_mov DATA + avpriv_pix_fmt_bps_avi + avpriv_pix_fmt_bps_mov avpriv_put_string avpriv_split_xiph_headers avpriv_tak_parse_streaminfo avpriv_toupper4 - avpriv_unlock_avformat avsubtitle_free diff --git a/neo/libs/ffmpeg-win64/lib/avcodec.lib b/neo/libs/ffmpeg-win64/lib/avcodec.lib index fa24c59331ca61712bee1d6ae432fcba45a2a573..340dd3ec305db2351f57a03c1179ca897cc3d665 100644 GIT binary patch literal 185506 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 TdW;cA6X$NJHOO8{Bgg+A5O^?% literal 160356 zcmeI53zQ{Cd6;YNN+8xeWFZ#uo)wFDSS<6}nOz~IwUC5(3k!pUfZm>a`_5eLeW~xA z*7!yozY-1TKHo=ehIEjzrI6frdaN@+rNjRL?heJaC zzpCq9-SgkpXiaOX&#AsM_2}-Z`ugv`>aWMatJA!_dCmS;%-hG}%F626(Y2)`YxDC9 zJjguH&o3?>Sy&leJtW*!UuF#5s~#5a_=Ak0 zd-bi1-S9Vz-E^;TuOBk@rb~sp`TsC>%YDMV?cI!_yKRNB+rPxvyWhdsiElF2{wQPJ z*D<#FHO5ZD^@hiVyAz%Z-Q}8Ch`;Sbx{{;C!_vQBs_g_1Vq5JAh!u=Io3*G)9N-w?9?5+y0Erp?l}&giG#abLiF~59l&@c61wmBHSHNHs}TrhHeb^L6?77 zxUDa+IdrF|!hPQ%Hiz!}Ay4Seenhw*dIy_Bci#cw?uYB6`;l|Pz4vu&4&D1M5bnnx zW^?F1_#WYY@+vlm?nBQO?!#YWbLf8Vi^6^MV{8uHFF?JZ`#3xUx=(ylxL^KbHiz!h z9~ACahiner=O9n$ejW0J?l&P{=pOzl;eMyX=Ft7_yl`Lq3pR)D_sDiVd(w>u8r<59}(_9L;axp3e+>Yul_gT{^}t%hwiWM5bl4zgw3J* z8l*+{^}iJEZ$HK6(0v1*1Kt099d|8u0pkw%ZlSwyUAT)bVJ&p~zardIKE+z-E

X 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 XIJ`lVH44&-Np_A4DeQPwlKcMwK>R0h diff --git a/neo/libs/ffmpeg-win64/lib/avdevice-57.def b/neo/libs/ffmpeg-win64/lib/avdevice-58.def similarity index 88% rename from neo/libs/ffmpeg-win64/lib/avdevice-57.def rename to neo/libs/ffmpeg-win64/lib/avdevice-58.def index f453187e..01682fc5 100644 --- a/neo/libs/ffmpeg-win64/lib/avdevice-57.def +++ b/neo/libs/ffmpeg-win64/lib/avdevice-58.def @@ -1,6 +1,6 @@ EXPORTS - av_device_capabilities DATA - av_device_ffversion DATA + av_device_capabilities + av_device_ffversion av_input_audio_device_next av_input_video_device_next av_output_audio_device_next diff --git a/neo/libs/ffmpeg-win64/lib/avdevice.lib b/neo/libs/ffmpeg-win64/lib/avdevice.lib index 57715828f60f95c517fd1347340f49b6537547b5..1aa39d69e01a1dc798feabd3d697192745028b7c 100644 GIT binary patch delta 1391 zcmai!&1(}u7>D24Bu&{SHE9}?nnX4+8x0AY+0BPZ8$S~4!5$)&K-WE(*$DJu2@21kP)Z`U3z#bKo&!0nAvJkYuOuq8{A%^TCH} z({cRl--mBoI(FL$G>&BogT<9ASBKV(idT3dCGve~2Ub2({5m!w{ z(5_@y&yp^h?imm*0BHHs%&}!nnGbO!njdh{pJK6^6i2Fz$8+a8Vc!~Oi6h=a@v2Z& zGTcO~Ta?(4kQgsU5{-!l(KL-82vLy(AyGLH zPp0O1FkX!ZJ)mSfcrZp2J({RTBjQOTTntAqIPVRf z;7ScUYHbJLO7G+<0d)LuwC5cF*Iov4^)5QfQ~|iMmmTFs0k{fTfWg;GUsmf-mwfn5 zis5G|ifwYJ6Uvj57b?^JQyC|B)o|G~be(zRJsp)zB3u3Ci3v1(8huh9BN`{qZcBb` zSn}9Qudsa#%U-`lkmvp}f*->Hss*#o_BN9jF>|3YLZbLSlA!D10T-1MQHP=|(#@tQ zJ|rRfCRTEBrikm_!MO8@D81Ws*u@Np7@i>(k|DgP1n7LionuzS@zWqdT1@VDMKVML zcjXBHPI*$ad6(OiF2aJ{ERY{pR1K>=YxrHQ{Jk%|C<3R`4D{jK4u!6@7iwAR1rcSR z{X&;QUuYvPMpzkLo&4N;0{Cnwh}Y}9^g-9KixpOgZLc0L^=h=*bHqgnD}>*)SBBFw zr>3q>W5!glVyxn1=4kC~wyhMe^oNgF3auCiT)~AU^C)+Y;0dXbj+m}n)P?0@U%m(M zv6P~kRU!xZ^W^VG7uAgYyz{21s=1=I@e3IDmlqn?FAQLY0QhjlpFq_c$76jJxtGlx z$5(wFvd+HFu&+4&>I=yQHk!a#f146#T#1b~H}xgnkedj>mBD6bZ}1|C+)v4DoyT6= z>LNTa1c1v@3d8%-H7BAnt~tr;%#Ph^PG(s~|2sL!oe&*wwycbB}a=@n~St?t2 ah~wf=!n={`zZTM)ER>jqu-uAwl(yezOJ3Cg diff --git a/neo/libs/ffmpeg-win64/lib/avfilter-6.def b/neo/libs/ffmpeg-win64/lib/avfilter-7.def similarity index 75% rename from neo/libs/ffmpeg-win64/lib/avfilter-6.def rename to neo/libs/ffmpeg-win64/lib/avfilter-7.def index 5c5a4dcc..db3fe973 100644 --- a/neo/libs/ffmpeg-win64/lib/avfilter-6.def +++ b/neo/libs/ffmpeg-win64/lib/avfilter-7.def @@ -1,26 +1,38 @@ EXPORTS av_abuffersink_params_alloc + av_buffersink_get_channel_layout + av_buffersink_get_channels + av_buffersink_get_format av_buffersink_get_frame av_buffersink_get_frame_flags av_buffersink_get_frame_rate + av_buffersink_get_h + av_buffersink_get_hw_frames_ctx + av_buffersink_get_sample_aspect_ratio + av_buffersink_get_sample_rate av_buffersink_get_samples + av_buffersink_get_time_base + av_buffersink_get_type + av_buffersink_get_w av_buffersink_params_alloc av_buffersink_set_frame_size av_buffersrc_add_frame av_buffersrc_add_frame_flags + av_buffersrc_close av_buffersrc_get_nb_failed_requests + av_buffersrc_parameters_alloc + av_buffersrc_parameters_set av_buffersrc_write_frame - av_filter_ffversion DATA - av_filter_next + av_filter_ffversion + av_filter_iterate avfilter_add_matrix - avfilter_all_channel_layouts DATA + avfilter_all_channel_layouts avfilter_config_links avfilter_configuration avfilter_free avfilter_get_by_name avfilter_get_class avfilter_get_matrix - avfilter_graph_add_filter avfilter_graph_alloc avfilter_graph_alloc_filter avfilter_graph_config @@ -36,7 +48,6 @@ EXPORTS avfilter_graph_send_command avfilter_graph_set_auto_convert avfilter_init_dict - avfilter_init_filter avfilter_init_str avfilter_inout_alloc avfilter_inout_free @@ -49,7 +60,6 @@ EXPORTS avfilter_make_format64_list avfilter_mul_matrix avfilter_next - avfilter_open avfilter_pad_count avfilter_pad_get_name avfilter_pad_get_type @@ -58,5 +68,4 @@ EXPORTS avfilter_register_all avfilter_sub_matrix avfilter_transform - avfilter_uninit avfilter_version diff --git a/neo/libs/ffmpeg-win64/lib/avfilter.lib b/neo/libs/ffmpeg-win64/lib/avfilter.lib index 289e546d6b8e96250ff5a57973def59fc712ca39..09c19f75d02ce74823f84df36a514928ec8fa546 100644 GIT binary patch literal 56582 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 HX!QR9{9~ar literal 49000 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 Nz0}<49CP&c{{Swpm8k## diff --git a/neo/libs/ffmpeg-win64/lib/avformat-57.def b/neo/libs/ffmpeg-win64/lib/avformat-58.def similarity index 89% rename from neo/libs/ffmpeg-win64/lib/avformat-57.def rename to neo/libs/ffmpeg-win64/lib/avformat-58.def index 77dd6f0b..b00793e9 100644 --- a/neo/libs/ffmpeg-win64/lib/avformat-57.def +++ b/neo/libs/ffmpeg-win64/lib/avformat-58.def @@ -1,10 +1,11 @@ EXPORTS av_add_index_entry av_append_packet + av_apply_bitstream_filters av_codec_get_id av_codec_get_tag av_codec_get_tag2 - av_convert_lang_to + av_demuxer_iterate av_demuxer_open av_dump_format av_filename_number_test @@ -13,7 +14,7 @@ EXPORTS av_find_input_format av_find_program_from_stream av_fmt_ctx_get_duration_estimation_method - av_format_ffversion DATA + av_format_ffversion av_format_get_audio_codec av_format_get_control_message_cb av_format_get_data_codec @@ -33,6 +34,7 @@ EXPORTS av_format_set_subtitle_codec av_format_set_video_codec av_get_frame_filename + av_get_frame_filename2 av_get_output_timestamp av_get_packet av_guess_codec @@ -46,6 +48,7 @@ EXPORTS av_interleaved_write_frame av_interleaved_write_uncoded_frame av_match_ext + av_muxer_iterate av_new_program av_oformat_next av_pkt_dump2 @@ -55,6 +58,7 @@ EXPORTS av_probe_input_format av_probe_input_format2 av_probe_input_format3 + av_program_add_stream_index av_read_frame av_read_pause av_read_play @@ -63,11 +67,14 @@ EXPORTS av_register_output_format av_sdp_create av_seek_frame + av_stream_add_side_data + av_stream_get_codec_timebase av_stream_get_end_pts av_stream_get_parser av_stream_get_r_frame_rate av_stream_get_recommended_encoder_configuration av_stream_get_side_data + av_stream_new_side_data av_stream_set_r_frame_rate av_stream_set_recommended_encoder_configuration av_url_split @@ -87,6 +94,7 @@ EXPORTS avformat_get_mov_video_tags avformat_get_riff_audio_tags avformat_get_riff_video_tags + avformat_init_output avformat_license avformat_match_stream_specifier avformat_network_deinit @@ -96,6 +104,7 @@ EXPORTS avformat_query_codec avformat_queue_attached_pictures avformat_seek_file + avformat_transfer_internal_stream_timing_info avformat_version avformat_write_header avio_accept @@ -105,11 +114,13 @@ EXPORTS avio_close_dir avio_close_dyn_buf avio_closep + avio_context_free avio_enum_protocols avio_feof avio_find_protocol_name avio_flush avio_free_directory_entry + avio_get_dyn_buf avio_get_str avio_get_str16be avio_get_str16le @@ -130,6 +141,7 @@ EXPORTS avio_rb64 avio_read avio_read_dir + avio_read_partial avio_read_to_bprint avio_rl16 avio_rl24 @@ -149,6 +161,7 @@ EXPORTS avio_wl32 avio_wl64 avio_write + avio_write_marker avpriv_dv_get_packet avpriv_dv_init_demux avpriv_dv_produce_packet @@ -158,15 +171,5 @@ EXPORTS avpriv_mpegts_parse_open avpriv_mpegts_parse_packet avpriv_new_chapter + avpriv_register_devices avpriv_set_pts_info - ff_inet_aton - ff_rtp_get_local_rtcp_port - ff_rtp_get_local_rtp_port - ff_rtsp_parse_line - ff_socket_nonblock - ffio_open_dyn_packet_buf - ffio_set_buf_size - ffurl_close - ffurl_open - ffurl_write - url_feof diff --git a/neo/libs/ffmpeg-win64/lib/avformat.lib b/neo/libs/ffmpeg-win64/lib/avformat.lib index 43fd2d9785e8249944cfc1e2185fdef559426ff3..78e52f2be35585383a63a2d59961281c8ce5fef2 100644 GIT binary patch literal 134982 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 literal 334422 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 diff --git a/neo/libs/ffmpeg-win64/lib/libavcodec.dll.a b/neo/libs/ffmpeg-win64/lib/libavcodec.dll.a index 7866052c65cb3fded1ae5337a6e166ffce4c7a46..015fc05ddb9d26c168e7b5a069f22b24484313d1 100644 GIT binary patch literal 669086 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 CKZ|q# literal 135286 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 Zy=@dQ=1sMBt2Kw&)P~n;R-zX@{~s?BVrKvV diff --git a/neo/libs/ffmpeg-win64/lib/libavdevice.dll.a b/neo/libs/ffmpeg-win64/lib/libavdevice.dll.a index cb1a9b55fe854698e6216d8430d2ecaf7a120d3c..4cde80c0043a230c80a04283984aca563c320b08 100644 GIT binary patch literal 453218 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�e#9{dD~fQ0r&V)yu&mp_`5qEX-DSb z%kl7FEQGgr%dVBi+h5^eOrv$+ewDS&6}smdB1nrYA7Z+L2Vnu6eO$rFe#Su9_G4+Y zCmZyoMOWxNdo3y#S-R1KssLU-&M#z_8>rgW?{olH^R44)XLoumZIl*S7mAut)s6mD zLT+R(z;b*%I1Aw8$KCpIrS0=~nTfMTtDBYE+iUkhu0%GyRR z`t%6E3PobTN2olg31Hac-p8<38^`)*yNgGXc3L}7hYcT&V<}cv^b}n;W<{i9$O!e| zU?hzNaOV^5Jo%NjZfsH_soF`?=3;Uz?QC!2-xUbYvZATz?rVT1H!1^DIc5*CLYQ=S zw$(~Q)`Wqqr==&CT1lt2c%*f_y!$>BogFWcWk%&f%d&g06~Ly)ec9MXfvuge3*NR? zv)6%VD5ah9mRLo1vz_f)5$TY!O&&A_@aC}&WaEUUW)F6yfd`N-fJ`-OyX#HZ_UK2x z4$O;6LshQXgRB6)JTgvfgNv-vBC06kG^;~Ko0DMaJs1jL$0LT=n7~lIx7c4=JlXA~ z%R_)6JsQ0@GV~q{6=%LDwoI<2*Y&5@ZXV@iAMS~Es0`DeL z25fYEdTnfMY~xq}uN|Ko$<}j(?5fw&^0P@27i!#1t~Mp4;4U(VF)bPe99`)tUjkU{ zNw=@R(q^9gG@&OEgiF@#?YG;lPKjCV3lK2yQb?L11%Fp7Mt2R0OvBYc7Z1t;SnoJi z!Y<8Fwzz#_ybLuN!bH|vswOKsR)VPFk(ekV)j-sYUlzb{N7S&N(owTvXi&33YYYh> zfy#rL0QP#!tp=KkbFDnm(vEfVAU>A~tzgO56_~dONUe;`MKm!^NW&&90h#B@24Kq+Z z4GCt(9n65ngP8#CdCVPuU1{aa#TsVtFI(1f=8<@E@KWW>TK=2fDhvx-Rn9n&@ggRG zQ;zK!_LCAZ3p0Bcx0M$$0j*$)#ApQzm8YBuV3A|p#4eJk*|YuXJ@8*GYdI6pp5c)g zpdpP1GsRis$yhhBCrixC&0T}#d|5FQP&Z*D24uLxgO~soIj+QJ>m*{b!9aY

    uV zF2WjKs#SyScKNEXUGP=3YK({s2$>cSmI65CG56`6E3IYx6B0{&%~iLwrO#OcE(${z zNdUoTg32|dK{KMXYZA1B6N|F*sdi-EX>xX%$Lp0TzWmDp;^G@Rqa zw3&vpnRtXu!+A@br=X4jKeUnZv+*aq(2lt?b_su{w+g!wzKB{Yi^eE(l-7fv0KPcR zNM&m?{50xqKGPXjh?TeWDLNw+h8DIN5t%?TO&&A_Fv)Q?278i3(^R8Z-=9|TpIz48 zSK-+hNmoW=U?@|1&=bHZNA$2KX6V^}&E$r0z9@Yd&?BNT(Ib@}^n~!sapdy}8hVCg z6l-e#HP$E=X*`$-VVC15*7+J{%3N0kFol2+v&Y319>fH2%dw7PkIxXZFt<26$EV#5 zLmefeG3zL)^q?nzXO3f_>^zB{jWc_2<$GC?6TtCMBnEDT%7dB!Mmg?Y#vUh7)9%%) z``R_wh>g|daNMz1#~$Tk3;K5Dt^2}ybplry(EvzslLt)!oOeVMJJUfEK0#)< z(8MFkM-!PmXbR!N-M0A_Sd)CJ_04B$>y~}%o6pnyv~|nQ`sQ`{etbqCc7O4F?gv?) z@5ko}q93*|9>6cg%Rfu@kq(;h0e!=TCLU2fn#klqQve4ZXV0=nXlQzRKkY!VRNB_l z+2UWK7^gwAXR$R-(bymo+QInQ6u^H+{IG{>_?hP;D8qsuipIu|(0cF_z<6(P*9xt) z+52Z`__?~BHp{$w`D2{&=TfcSuCQtNr5JA!jSV2F_8=&L?~Yt0`*90F_>8%^7LMhX zwm^qj_q1Ba5cZOJdoUUYLR>i*J(H374rv>WXy}=3*3uItMo-wt z2}NVWM`%6x31GhC{3TY=@Ut`RQBAhkOM3nCwu-{$FWFJqh;r;6Y=v;*Zq2sR=I^f3 zuqA*sWOL)}sBCOGb`Q1!c=0&i0^3=sF|L`k3s3MoNf*1s^wL(JJ-$U08dHqOox#v>yBf@ZnqB@w#0w_v}>j;?`>O(|q&dF46pa^Wv}v zi7)yXyG!h*H$hr8FK%nTUp6o9Vn`4=FYfysKhUOl#=iaVWMOz5dKb2^oom(79j(qn z+HE!ZJ>1i_tUWwAmr3#B`{iYW&kAe6JC?ksj!+@3fUgIC0bF@}7BTzYz`IjkR^bT( zVG47&=dFBI*aCbVggK30$b*^hxe=2gytz9^YNgHi{jR(R^nk|$bFbGEa?7-MN~sY3+-+s8G%WqEiKV^uUZd2!=VJwI6qd#$kl?ez zaEnAyLJ?vpq8um*g9k|g?0H<(!oFi(_r-qaP*Mdfm9lLsTN_h2Z1QQzq9Wx3Mowg*fM&9}PsQup}IbLzIN z1I+8T-FDrUMU;ajW%J-EghhApw9;7g|F-Z{KanrEl!K_u^6GRz)i1#s#SS?pUDvXT?Sh%7CtJY?x+53&N-^0;o8{ilhnS==qKtjs~t z(Y~zqgJ^Pqgjx@NLO5}Ev~Q)&-TbDBpPij#skHbB<_mZMh~h2c=5PG0rved#v^cPcByN(;L$n}Q4XA> zWiXaDhOpvswC)=gmKw?7ZkbD`;L*ArJfb`(k->wc0B$_?@>GRz)ig|OstuKCw;kwvRT%G#qVx{e`hMG5HGD`N)OJ=hB1$>XRn`>KVl zq?Zg&FK-5;$t$L~-h-hKcHCtOR@x}uS4<2|cj||a^qOfG8&YL0pNg(m$jTorsvJb= zRu8TsH;!#<_44nH@ns8FtxgT5oDbQk%d{3%9}sPp!VXiNl2r3XC${CF&f z*uVY%_RcFzj^nuF{jDgAmT8FsDVm}cju1prGz}j>901ZZjSEN;ARg}y1SQLY2D<~^ z3VXY!-B|=jImtQaoO8}O=bW>gWq*3qqaIzIW~#eq>Zb0gwcGQ3*gbSNj;z_=R@eNy zy4upSHJWy}&p=tRneju|B8MWUgCL2aiKmqo@qZ3UYx#|SH{ZIw8}-fu#!8EV23Zvn zg*%(6I-1n+D*Bc`(GmFn)=(Am49AF*5K*o~;B*iqG1T#ND!F)nNm9Ri9fW~cBki`Q zl0%HNr7Uqhk!~WWVJP28ofQ95QnNkIvz{ut6)QQ69F(of8W$hbPB6q!xKkdS_-~h? zs51o^d2pH`KM$^ICHP6|HYW!9uackqRxusto84@X>t)?&XEBDlz2#fwdZeJ2;EJJc zrzbY?pB`7MqrqqlT*Vw;bDr2VIi*!~SXG?_RSac2)eaN?;Ze0R$cMd|^H!Brby%TZ zf-8p3oxGL!caN*(!R~f8bKa`7st&8Flc0*Bf2Xs_#J^dpHg8Xgd}m|%V!X;g+q20) z8K|srI6}7=4B&cGjb+cg?HnOPomw0DD#y&d`aVv{lo}3yoa_YpiX)bo^sApXwhDPr%$ z$U(5YxNfOxCHP_JPu^Y%9SJLmyARNc@${ z&sH{mA%{}X(Z<~j#Yy`jV^NJSvONS#Nfiea&_(ZE`Ae52y~#K7xs9PXX`YZ(HB8}N zf-8n9p4RZhU-(>QH`VgI1T)rHoS`^buB=tHSe2awRSbQ6DXgJ#3eGRw>ukmQ(HV!- z*@_3zIO=T0$Lhx&vo1&e|9lYs9Iqc&9xbr|V?G3b+>7>Be;!g*Ex^Msij}O_86&IH zqfQ~SJK{O`o2k}VkyTmNKo=T75XMl-lZGJvtoj@VSpgL*?TpouW?>Rs$4I!|~ zgDdPO*kb7AsrI4x(^|H43PP-&i&6Va2rBh6bLV z>BJw|`~2)QpXR;gX|F%hb>`xwhw)73Tje;PptI2r9eE1e`u*%ALrNB zvtnC)t2I$~s9*FFc$G7T5c2Q%r^5y8pHw|U$Z7RO;&8tQWlIm8kd4x#l`TuMMgH5e zMa|6mH=2K?=HM5bar(a||CRjB@^=YwuX@$LN4Gp`TI5?toPt;5i%M%8jH*_GABGy9 zc1MXnDDU{_W)1P?IR;9yNdPmBa{ zJdm}<1*mK#_(@tfAb>7<2K&8|pX!iOleDY6P>dWg;v#f1tFp?)$uqfmcioXEI9hl3 ze0B<^;k};eXG!b+-IA(&ES(ah;^$|^`Man2uqzXHW1Zs`%=e~x#$Q3-q>gwV{$^vO zI?G(VYDW;BE2-V+X2XxP=lY$RPhxd69TpL1@iNrz^@<*ARTEuhKfxA5?M`Ze_-)G; zWQC)u+EJey#h4X+s~oU`PJ$|i(w%m3ir)&T(kDpG$SE2nIM%9qtjb=3D~1}Lyp{M( z#1*Q&Jwx8gvC7BF?Ifs5ia95~`VF5dU4MJlsIpeoQdM>~Q+1M|n5Q{V{5qn_rVGil zS!QPrbglBS@_Grb7)pAY1I4c)uFx5kGvuutt9-27PJ$|ix}K;Kzlx|*OU63idWNWS ztn#UHI|-_i=FW+%ekGtv9p*A~R2i%4sj{5}RSeBNRWuO4jHwz7MqNk&9t|haYVC}Q z2B0h~BZ~r{a38@FLtjrPbBJHEJbf5sk>6+BZ?$f77&+vQScAWrbsJ=j!x3&L7-Hz? zi6QZe&Rst<>Q3YJM_h)qH6cT$onVNenx_mG@e370J-wGD-t}Wfh70T>(AIba*;ay| zq>dx!4nNZC#6Ms1lkbeix6e$6T^$&~zl=2xfw7i%(X-0M$?qhn;;7@{ZqAb}GFE62%9nh(IAL-pfSZmbA z<+%Id4|mtf&snOVEZfylHny%QR-#@d4TYK28DfV2>d!$o>tMW^a=mz!L5l_Q= z<(I-7PGCqk622&D-sqOXk955B)98N7a<;aRviu#f&Tfo&34n2|^5-|Vlc0*Bc^^H# zps#nnwD(@QM@NWxiU_l1L7wzNf8sos5~G+akr7{7J?auqMe@9#E)BM&W^LI zSM5P|lbUOhR6#Gn6+`n* zF_QRE%hl-{`LH2! zqt<1eWe!ud0|>$x8h5I7DSpT!?3r;NW;&Jf7OjtB?EW?IV5{oja{39j7z%ibp2QD& zY|W5XX}AitN~eP$DXHEltbiZswUi(5NYeFERBT<#rh{U2I-bO=K5;x%jxF+#a=Hkb7;5tV_2bIeNve9>*y+1HnwBS%d@OUo&t=2j zAZ}&+_3Ex+UGto2k#8OG4tO=X=9(reu&$1=a1cQoM=?JcWID~8V*XwB^Ds^;*17P2 z;iyu~A2KcSts|a-S3{Pu!~w~+HFLAX(9BajCB75g?J;PXsP0^}PkM}a3V89Y@_7pS z3AU12j=rq$BdtSyhsV~8#p;GFY*igwPCvmGLoH8!OMJV>7AhJtLw*ZeRmYaoPq4+% z&(q#t@ognrqrqqliPkDI(fYaEEhxl?<@p-wG*M}dOOmybs6)QQP|cHX65m?#GZ;?Yr_@<<$E0fAm*9$_h9|!y zzQJ;}l1=j2IU%vM#^I=HZRY0~LlsZCnBwa#KT2Sc6|RaH7&tg|3PF$go{uJm_yuh==#Vr6Y6*6fZkl<;FIy824ZRko9_j)ui} zG=L1vOS`?S$m8`^t)r_ttB}8{?It`HLnBXlz~U=v$lAKSo1Ynt&kuX~t(fP-)_K4V zLXLG!oVkMt+8B!Z@vw5nyk(t#c@1rwd9gmoZs(S_Sm((%$gcui)zjhy-Jo7O;wrqW znb4ulv#yCZe;7d=Lu*enr}(m(&tzk|1C=*sZRRvqH4$dJo5^~dp~9ypNb#jLWIeN+ zM_qTb^%JDy!<1D`TM3qdrzYF3?er*N-c8 z)CHIkxH{^W)KCRSeO=6Ucl*N^;yo$opqd5o?0Cks$hVGoJG_RoBetvwFlP+G8AGp6 zaliQDx=#bX^|KrIOLeuht`Rn85J6kg@X^;Bex&n4zo>yW`8#5b_xCqf`Wn77k?Kx@ zDu#xCJls_}Z%>n7SVNVWD9bN;taRCZrPb5qThJG(BYN<+aK7}dYjR`3ID$Eb!k-ij z@m}&%IeY2+TD%@@e+ov$lCo}ZA*_0v3fgcx4bHE_cq<2UOQqJ-YIW~t=tvQMw8V~<)z=6W3;F1$CWYKBk()8 zG1}+Uv$a`_L9~Tu(UoaYj9_IT*7)p=>ds+5wq;u6TSvSLUTgiBZy|wPFqEK=v1V{0 z^lbA+-+T7>Y?g2Jquw9#uwkuwI#@R?@~tDT!7ELlvak(%dLTg_V-?{12-^LTDD5yR|?fYV@Pa=K2yejf!&cD4nVjF&}CC{^vK+hjZu*XBds6hf*Q0%gIB0xW<=5I|fBMTD`!zT`wyDt(ZE82yKpSQA7ecsX};pq zDE{EHi&ZOGFqBo?wbXo#2(%|{Wc0>ZS4hf;xZS{5f7nB+T)eF9TNzn#EToWg2NK?m zvD%RGM8qwUJgvyZ>f!d6Cjyb2p>8iV&KcHB+!4+iMEImSZ}HsCdgA1Vfugy1ecisb zIL|`D+4&<0_82P=DK|viXl5_kIBwr-t9!XO-A}N^SYt?fh?q98RTQ#3VJ}*~_N|93 zTgxaTv}Z)@_>1x_r**am^(k5 z6xpzw&t5jUWC>YEA%}+%#Bo*^(yHmWhPcx=;AkybtS{m{@%vjfMV2*@hKCT8G1eAR z9W3$g8p>AX!5iQeW1T}=*THgf!L?OQaG73$E5@2Z$~S_2B4K94a<69+_La`DaXDhf z_NQ@#7B=x#Gm>DBv6hhXjl_s#FJ8a4znQZlsWIOO4vP?>N)=oakx+iotdY8-TprK+g&h5Uh<9F<#HbyC#z{3?n8CY>`<`F zWubmtP@AY>*G##~a`QpQ@&b>*Za~3weXj4~u+!Ba_Km(X!OK5)829S>*!dcM?=FwELss z{ySN(U@y;fH}WKuXL0O8_SUwr|uTG_y6)jQH zMtN1<>8Nf{uN`p?-mQ1ai^?J&C)7i*#L(oEhZ22z=Qr{Ry7y7Gpp&4A zp}VJ(mS88D`95FFuIH=M@faj``DKswxvuq@T^FukiyWGq4uT|xww_25FIbW;V0~aF zNWvC5Bsm=fNeneT&2+G@+V~_$-JHQ#+_%ahD(EDrV(8?LhqZj>Ef&uaRj?nm3o`LI zpTt|a_yHAj<5;|W6jAf@1$eE#C)gq%D5sC$iKB>z&vx@xx2K2h{@OUZnL+J-a|m;^ z(Gw#c2S?;suHfPzP2B8Mig zi=ZiK=SIFUZ}fhfPqj43E$C%7RJ<`1V-*Hlp;gF8_s0hMuZ z0F6VL1VJv;tLw)F83zy5k1J)qyMY~U#=+YaNoU4+etG#h`1i3s+ezExRb?6+)D7yj zBTmA*d}6hhROpl~1Tzd}{76`#VczoRKBc_Vo73^NtQ&KNip&p`SH+F3w&F8$WyyI$m5_-#$S2x4i$jmG#-+zL67(=M>a^Y= zo-65Dp7#19I6frLcGNdnKW)W!mO$I}4*6V#Epjn(dI**nnskbT#3jwrU^>}W^&Vt0 zcdSqBt>YkM4Ppql68tb!=rogwEsr0-Ct7}5&txSj_z4U(67(=s=ObYT+q^~5o0^{f z0JgeW_Yl!%5<`|Bc6g+Lyxh%VKlh=vCda*qa9>T<#KRiv(GuvUUNS7MCfxK zgVo2q_F~_GRw${J(U+ld)XM1n_2Z7&FO~fN`5^o`SU;{@8NCa}a92j3(e#YRAo#>e z&CASZ^q2pIi$f)$3ooGOZlx9Gb(?8@4J>!bcK;@IZCfSLM= zBBvc|5Ib%=!4N}bPW#QoMZ=KV7t{rDZMd1;$m8`rZTFj<9{LtxmV!QlCx-5vG7iNB z#nak!chK)b#-UAPh;}Y(n{gOeRN)kM5i~KB=d{OKyjj!KpZH%`6=&$UI<}RJw!0VC zLaPu{HJt=i3_Uv4A{B2kREE6yHsWWv_K~)VhqN^TM5dV_h@pa~3`enw34&eH@TeB8V%avs z(Rd*`V zt>{)f+dDZ zois-A$(ALR&2>2|y4%tEpSC$9;D3-c4n??~V2Ghpr|1XvhN|f2t#4UgKYs-(^T&MR zTI=WsTZ0gCnhAm!Ds{?25}%|Adj9NrSd4vUTI^1X^TTVSXgyKeETpx-B7{=dNAQ%i zYQ5%aU+J~irxZ`R4wzmzlP9Og`%Kn03n{Ru!YS-(rfG?xRWF5=V@^Td^IkdGIER|b z$!^G@Ub3IF{O^1K{>VIVdFi+Egufss`*{7hGADZhe#eL8FLExLrcVrLS|0XF9XDR8 z7L1Kmp0?b7X0MKT9)6TFH%13rRu7jmf?zCZ*!E8Acbc&$gHIw}uG+>>m@6a)xXlDX z3=MlJ+&MCDUg`-%kj^){+%L8_A^qsOI`ARZ-6RLi*QD}NXV4d?Bi;^wtGra5Wxk)P z9Yb)Iv~G06;YZq2oeVyWS@BdRORpX$YKP=fd#!sZ<==`Em>{Tb4ToyW@I3mx0uP$6 zN#&{P^KbP8XEKnmWdT{C@kHj^5=SKuE2+<0-H78MWzp&hZIw-jtRSRnk@L31P{-5$ z6S0IC+Ppm}@}2l=v9;ZQqFHjR^8J(BNkmW#y?iP3O!F40AH!6Qt`#@4agOAKXuZ_y zg8A>1X_0Ros5yrt^-bThfUaNwK^R9*4=dix+o^w#W5Twx-Mm*G&lW9ROuvP#3dnLg z391;XddfQxM=@1Z0(i7Uwaq&)Ght~_fK%1e%+fK2rk?hth$D!l4~Mz0?O7t4rP3lF zrK*D4kXB9DDKC@b-^|G zboU|;pE^U4*Kq1gur4TT(#dNt@}8_8SCV%Keg~JlPuPPz`TrHG>i&B9KL=N(Wu4Ov z>a_zWhwVjOAV1WhNvWpC7`l5p8&@2zr7iBfhPG$pnpv}SS<0$rkEXi`KgQ7G)6P!u z@wH^d>$`Z_GL>5*JQnGv7`l7fOC=sdG?~qK(awTx_fl#9EB&3_D^*H^Z6*j}=w(%<;MKmy+sug@33@o% zdH7T}ZzpiS(V=HB8k_HDtUjo1F1m%Kvd9mxS4XIi;EAD{r{^~Dh~{ZDgtDrIQK#&A zaIrGg`nj#nDuh*ScQaX!Ck-8mFz_RtiT7{~S@PeytO-N6PwwRs%`Nem4=?E)1K zVUpJSxAH-}r=+ybmC~>nYXYZa+X;pkYIu5X6K}u_se}09^+c_o+cZPkngAiwOc2CS zxKn2$mR{b~?LByxw6cUQg8a>?Zl- zFBx*9A=5-q!_lt8T!MMa89!K3v)O-Pms{LrhA#qKv^5?>rjekBqhF_I|BtQc(FfN8KC#9`?PoHe$3KR5bx<`D z^f0vRwE7_)(DcADa!}3U;%GXFIHGR7`hl%M-p6Ss2x2JKsn&pal_6-*oetpS)U(;n zPPUQl?8ZEcwcfLv1y*66!cKxJhN7J`NpZiTYGv9V=-7JoxvgktwYHk1YfS}`*G@3R z(Y3?Ma`UDbeT-sAJ(_J6aFFHBx>}ZvmZP?LMxI3#NPY)F5<}fiyS~MJK1opSIp+Co zA0$bOYDrQZ1W8H7mLyaco%{GopQJN`>0~?JC$_fA5pq4+qFRSbnoL(SO-C52cFOn{_xLm|-^lud?CKz5O`vVYKk`qNRkc*1Zh|a^!o3*Q z^^(;e_Nq8>C#w8FRh&40#!jb=-;*2P(3jokB8Ltoq~u zGmTf(B_66KcKE-33jQWHKq{J)B_2Y$jo^l%Z6|KTE2_JFemE=KC`&wUbQ{4>hMm^d#LEyvn|ZNbz(Mh`GQ{&j#u^_X+e{F|P_R?{BR<+CC|Y`2 z$IWW80!*;fShW${F!bt_Q6%m{+^DGwBBoe9PurXjJ$or@e7~a`33?bBb(*)tM34)T+%u#;sbP1Xf&jXkQ5wmI|xJgPghntrmZkBt!8R14+;=3HxMsUMW znis?D`*~a0`UuUy9< z46ec%?GQJ_sw}sya|ZM{7C8{PJp@Y(jXABa!?{O>rPDX^VR1Pty4%rm)Ovlr*F)Ag K6yf$-hW;PeTKfqA literal 12904 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 literal 40782 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 R$8sfwIg`?>n8Pc({tGn6P<8+S diff --git a/neo/libs/ffmpeg-win64/lib/libavformat.dll.a b/neo/libs/ffmpeg-win64/lib/libavformat.dll.a index 2fb5749c9ffdc67e2bc447699ed7af35e1689533..98cebc92ac9e110a0e726b6bf72078e15a68c93d 100644 GIT binary patch literal 136154 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%0DVt*$*B$ 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 literal 110022 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 KM~10(U-Z9_T7WVD diff --git a/neo/libs/ffmpeg-win64/lib/libavutil.dll.a b/neo/libs/ffmpeg-win64/lib/libavutil.dll.a index 84b93eaf5cda37cc7b71eaef818380703adf9597..f3819f7ab8ca4dcc504267dddeb3c733c8ca5d82 100644 GIT binary patch literal 340548 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 AL;wH) literal 279778 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 z

    ?**APvpDcx5br%B*iOKW{)J~2 zUtOI~%`C>ZZrsQBWPZ%9AAci&IC+b@gEp+rlP(vJHshvI_Z(92&j#zjf5F8|lZ1DZ zKgq&bxN~v_kr%ln#7Vt(~@vZvC4&&n;gVd1TUT2?V#qTqlH#Gf{kEYQu;W4|9 z!hjn#9f_-l4zvw+1AKBO0E6xcRA`78v?u^3o)pAV1oyn^xA(7tr++ukbinWsvpmzq zM!s2|>9Xp4>LTI!+zYZ&olkitj8gJ?NLy0-JovqAI%1Qx;VqN~eX;v{s+DUR(G5)Vz(b z{6!m0?Xool4xt>6VVa$ovXU&a4hiq1{ngVgfAs>_UsYIFfw8JwLA2Fp!PhcZ#eTs? zo1OszcPiCdF^;Q(D9f;_0$pZm5LFTEdFHCv>nc#ygykl;_7YdcaU-k>!Ad3vaTUX? zXLjM|9bD0P!*pjHL`Pa;TyAB9P^Sga6v3#k`DmKA5xK9eM3a7%LaO!OK@n5wDC=6G z!G8^QBYaw|!q8}M&5^n}f(VP?){pwJ{JhOw`8oSOY?hO0v+Q(+V|eEdydDK!VbLGa zJ)>yr{u_UQXW{oORWt zaH_uOd~`XmXL&)XRpLwWnA;(c-cHP?$W>)xErY= zDatGLEvsBO*@;0+MX>34yaM|fjVXBbxkgl~c#0aYU|Qs$$w~@hDS|`K{)zpx#uCo0 z)(yD5;-74*97H*ZK}<#P=eb{o{gi_#dO6h|8bi!sV^~#%Dl<8Vs|Y4NkAPu!*tk-o zYE!NEqWWbJQ_7+WK9%wDpew9$kwm4lb2?{qrlIN8WNioHZcSyok`%1#d= zD}oo#ev18sgRDI@I-R3RT2zH7l@>%(1Q(uLd+f)3H0_HbCZhzENUCdr`5LXfGdXBW%k2<*8Q=`*4 zXrx6|eoCbU(GUo|6d#Q8X_w+mm^jU%F3x1px$QZ<3 z1Ovb1d$1)~H)FRoJsxbVtubp&kMoRtv)1&us5+mwrpKk#`P7;o=fcw)yQaqvYuxeG zFH_~TsNy(?0X)G;D${{%}b=Z5Yd+?jSZ z9`I4mP+4L?N9%&9iQuzy?+AM#M-9Bov^gk?F)~Can%(y4WYJT19Exv|Mo~pt5KR%> z^|H_W;2U~(V}8yy7?@ei&-q5aSnj&d`p!r<2yc%!a^}D)=5VXVr4Oay* z6TvxWzK887%s{ifoIda)8o&%$VuMELf~bjLn{x}DO%2p=9)Bg>sHS!cog+tB01d5efA3O`%p;i+`76H`-hOKjYbDu|iPF~`KjV~v?|P>#DTz6Mviv2ksV z8T`(cWsw6SJ1vN&2#z_=?`J1GG>yxmovtUUyP6xu%o0u9qG~WvQV>fKd~=@3$VMKP zMrC=tSxmvbr8;W0?o37#PtvMtNU78ysv@}N?4j7O5>@FU>TB^(h#9AKFP#@91+f&v zK>Iza^A>Lp6qazX`5x%EfLe|$v3-%y1yK{jLg!Xm-$G5go+qZ2Mw2bn1PrX+NEO1& zQVa*3JxxzxradmY>Arn8rsskzu|18@1yK{hLg!gK?6^V=C)%3DcwC%GIC`!-YX{wn zX_1W~DXRupsBqiJait#@jCr+3wbV1Za@X^bDq%&_L4!ayR1&mt-Vnj^6 zNVVmTBPwyzqckoj1^;ZYtKmP6(lD*je#g=V(G$T;=XpD9TV3zI1W&Slr|z6D#EG!R z29Hz*u@k{V=QlyHEyPZFdNgj1it(gu7BIfEJX!ScVNTTp)qGP;l~oE$m5D)2Mexx% z24Wo>Q_13}W(=gEqGKRa7eq}2-<(H}u~MOi6C%l?rY76N5n{7FhAN1e7+%?ro9B&J zZY#`Cot0{h6@wXWiCs^TDu|i-tn%tHA2V0fnBBF{n6)))cGo#ZK4aF_8gClF2hJk9 z2jqh4eBSJ?ORDp!*WX9Jr>8)ladscw3}$HrAwDHv5I2E5PGu?VI)Gd-+uF~y%} z!qYx{xY>h1@VRFUf1BS9Ps`IdrUN&0jEn4Ww_Qw&Lq}1Ab)V93kBeoMhWl39qbS9_ z=vh1ueDI^;f7~7yDdUolnI+hhQJEu}_oZ zXLxGRhdIf7-uKQ3JV})~2)n}$x zH;x>n?Uw!R+tJT5HgB=^3pn1oCz~fy@KYGg(Yctl9M*}rVQopck{mT^8|;bjsbRy* zR|VMn+e@$=i(#KPJbYYL!yg?m{K71Mbg_|dR$J_{>U^F*TB**b{1J}mjP*y~NBEe) z3klCO$HQqc?G6V`oClTyUf?7uqN183SKHkRs|*}fr3SrD1pl1JL$l{sq6(H)-h-$@ ztHP+_sXi|jQ znDGyxhE+Atc>8Q4g00STz}R;y#L(!V2}C`EgjYkXIR}g*$Fj(FJa$sh`$TZpd4*_p zqrwut}l9@4Aj7jj*>-9&GCo=HDHMg8dL=_6TvGlWe)J!95dwvrn|I|GD+3b)a3w$B^ohO z5yVRjXPj4aewM^bchF6l|EtU506e%Q7GOvdL`(#0oNFcaof0vv@tF}oCRGnpw^jng zkR=vmgeruYqcL2uKT>SodZwN!F(YP_?g7k*DeJ144KNa_AZ9XKj1h_6X0ICm9fX-q zvD1UjscG47Qom-Z*s04Fm##&I-|>=ySc+ha^B5lX3=>PpqPAd|>eg_a@~SL#M}`SJ zSyp+FvQvYos?Qzg@u-Y_J4e+DbUvgI1>uMZI+w3~JSs0=)fA`ks7LEF#j6|3-gumO z8?XFy!Uv32P6i+RTxR1##?5rrI8I)Bla&*dM2$d43@4mh-v0{G(Hgg?y_y0-@Q%yz z>o`0cBQ3^iw!D=k3N2a_tZyRt;5=W8-5?QzwfVHz?7=9%RHNaV^R*Bo+8PTwhB}C! z`rL4?j~M$lfggOT?|H2v#`H zn_}NWSGzYHH>cxbFzJ+I!3(F0p_=oiT0`F|14|W&K}1c!fP2x>}mSCgLB#{_Y{&0iyS1GDM2LF z=Z@EMj}^N{BWX15_KR^BI+(@8&Q$$U%^oYN=NzjXM7gO!R7G&k8CC3?IjXkD!+z21 z4WSbh7s%KnsH(C`qpC7Bh^h!)dfjIM=4~CQs|i)bU{Lm&u=dJuX9|meLwFAJCtKTG zooxH=QV}-kSn8QFkb?gWShbO2DKaBuoq@BNSD~tFmCqzyk6^No`71%;>O7&9#|(4S z*U(BocVUj|m3gd{$36?$_E+ay#a-Zr=W`E;xx$dKa*$f-2m6=q1+llKJMG`}>zg>z zU^V|WSYzxqzR1D-zQUnKj*QFCf|JEMnz3)>pY+iH?`!m>wzL(^=AhrifZb44xF+gl zU5{b4ecv>1BM-0Ah~cAvQ;nVKGL#%5_6TQ!&FnGG>k+(mUKxWuRilOv1jhDts>rFi zG6tbUSflGJjwh+Da5}tpTFd;l;mG0Z?2)TiI_SZ&siLPYzpZg%@Y|*`h@A+2JNJ#S zV;Vbqu ziZ=)|{j%5V7CJCaC^D8kAUZN$MyDvY2K!d{X4FZhB|12^v=xw{_;@XXvCd=4*ij2R zJcvxTuBtnx43@v+Pl6jJTj~k`QLGceQ!o2#?#|o0Cf6)WCXo-s(t_z|jhD**7^0I}RJrUn1ZjcL&d?8*3dod4H=d*Yn z=)y80I`ikv+w|_C)$5Tbs#Vb&aOV(XPVxaKzZekDn4mQUu?e*I;IcT_nMjO?>oI z^-DF^U^elB7F9YWo)E-Q1P7f*C9)?QIO-S2%jT(ZS4?kC7E3k9x(Y1WR=I$3QiG_9 zV5W1_#I7(<)tzWerRtsHq9)TK7f)7N5KR#*b@ov(l21phxH18>kmW?_J>sKmt6WSu zsXCpxE=0HOHn0I9wg#-*XEFtrRW73J#2}_381Fnfgk5G}sx>ZQ(ZqDIRC9EQ z@J+%R7e!JX#7_+O?T@~nx6vU_H1NZ@;@kELeuOnHexy2tpCb{>cOHk&E_Lw(^+Bq! zQCxp*bAYL+`jrUz|v-{Z& zX}sVY1v}Gj+V4@W%V%?#Xp0>D7zsffMey0H{>rXbL7!-79KP(YHD`&=>aWF_uDH>^ zr8`Bxt~CxH`)e<&&gb>lu2kn!9hS)R#`f1f-oO!dMKwFH4hzMd$@-v+@uI?}TVhv} zf`2yPT~yQ(BP_XAxsdYGgUE{DwDasBc8P;5yg8}HLp5iXQLW~@w8v5gu@k{yXReVw z&cF^bbHX7di=Vn&BY7mlBG(z2NkJ^d@YeoXvGX<}>7aq7PIplB#9|Do`l7f0g>L7k%_-Wq{%^SaXv4NjfuPnw1$3u1b zA;J$?bdUgb%V7Ju}8ZRwoB>6~S8Pack_+#vLd|qjJ!0wu@EqM;)dLA*q8*SST; z9>wv}8=mTPC)?uHWT|4N?uZY|8jT!V9mG!rL!E0cc7cT-zEVcBY;7j%ck0$&5-i#x zA4o=85KR%BbzU2UJ<>;0vPi1Ay3D49BqOMH^g#qgFx44B?0gGBG`=R)`YaYf?ieD8 zpj}20tweCtOMY+uysaSo2#%m)QYOAm{<*vjZ?^3(5gLm7aYzHU?WHBU{!*Ht&xv8B z^QhMY@;a}tHp@Y4*xm!Z8h{aPjRhS;9mG!zFP-u8a05T>axdXWSmWYHszdl$j$o$q z3J>fPu)?hc!sZfD4+zJd!%Hgc}H!h>g#f{~vRL{bD7osq;I<{*i`GHy>Hi7cu@ zl1K?6DT0U2YlX0LT_o*|5krRO;V-1A1QMDWT)}ZUf}hSFi9OW8(YT!Oj*V2?^zn5Y zSyTlikrMPsnW@H>uHI(P_Bh8wQrhfLO{UuLNHAfSR*!9V`y+h8R8?9KO%Y6WuHV=< z_-JY)5>xd{HAlqSh%w%6?j;0q6v0<#9I>+<9F5BI_};=1x2URmql6%iB3SE;BlZvn zN2#v_67P?=MO8SWgdmP0xa=Hnv;7W^+T)@-NVr~$kGIL9DjAxBrQeo+qp*;=8|JuX2J)Qru+tnnmw}0677SeZ9&#(DT2q&WA))p zc!(GpOg$>5+pu(Fe>5DF0~iyVY74FASp90NG?Xfh4&$mmtG&8$>>zEo>~G(G7B*7Y zyu63}>o}guiSe?*mta$++WQheCp$cLqf`QJMfjNERN{fb7s&P#OX50o9z-YIYR0P|cM@NHS zLCmy!<@m@-b7ute49jGFjf`rvuc>@{t7DCJIJTAH2snagUh>B(&Rb2jKnQBXDsshU zFJ1K1d?#MfR+bpZ(Yjz=Ri9N}-SFR3e+8^Ux7!MN<{Ri|t&kUZ1HHFGUf>P%-U@k_ z?6N}M*-*#dXVm)ib#~u7MFnuJPoxkHb05ghh1M0MHWR)f4ma&@= zfsZudU&0@(-}2W6S3Sph{Ng~`@p}C}&SsAozVBUM?)%_*E33XYJfX!*+{z!t z1-5}YAIC9X#WQ?2oB3O*@wY%aVRM#hnocq=!S zR+phCC@j$$oQz1ZcD*fV6*R`wU_GO-i&49fzF5VP;G)0@La}CNw#oPf1nS!lEsX`@kDOovOIA(PC3pf zvAopt{@Od*Shxv;2k&wkPd+vf?%XvI&{ET^} z{r_#+J5O}z6*u%sDfCL?k5?u`ue8W3P2|RDY;cu~@@%pyJwc%m=;cy~Fh_~Q1^W2? d$ZGhxQjDoX7L$-b9%C!6q*;ir z1RKsqP;ld_UB%f+cP{(`;zGM{*=(>8mGBc#n(eFo23mfkI%S0qT?<8PF}Z4^}1DSt~bh1qD#~+wJv*oPc zyok4@NShtbQ2@-i-g6unG_b5%!?yZ)jQYW#T3#<%K0X+)5cV2f`0qvy=e@)eZUk_i zXwE@6N#^~GnE?lRREv%|&JQORgAyyUOmHV2#;xdgDvkTG)G3eoDn=hO zhn&GfMH15Vk&h)p2wqc@R11B5++bQb%N(_VPM9+K#=!~=k95-iwts!gHTC>O?@^EB ckqhX}*-klQfNeY+G6zns7rd z10GT+1)-oQ6sK1O?;aIBh*&RrP@#eqJQQbk6?YfIxbV9S`=9UipYQ$Ux9fNMJ!%2t z0#*ulN8%fDHZSSlq7MKtfa4*6^Cy7&hJp750LLFU2(AHe!g~h24ggMc!JzLR0H^z~MN^0$4IqUkQL!Vy&b6hb^~%a>b-6)Gol$bLb8qbYm1?c5)k|wD)oY+> z)p}FoKbnt8JwHtJS6voD)VFK3K~$$#3YN|K6Yc9_MIM0OlckwVH&O;NORt)^8Q zrFsQ?x*B7FnjSi5(X1{6b0wymj5HL{Meq892=&q1o-mp=?lV%zX8%hWqpy8-r7TiL z{6R!+c>**Oh}fbE3vUKlz7e_+a#)peQ51DI%#^)kAH~S4?juXFazP+|(#tZw9`cby zN0?4VoVM6A0y&+FGX1k|7iq+Pu&Jk`ebIlqg7R^YV8lgt;$5~Nswjv)$`JjMunj~O zd65RkS=8;go17ZlPZ=)I?IR2Ab9#t1H9*e|_t>%(+NUKkrJp<)IbscINbMTJeP70o ziik*LM6fsYBuEeLML|8N7xB^}h?E|Bte4V5K@ly!x36k97`6|-$76Tq%{MdOoAvpP znM$KmRg)vBk;Krw_Q-;qQYC#&2mlZVuw4h>R{$L246erj6z(ks@iYL1|29M28URH| zWe67lC>mcdG}{0uTDuvfIRJ`|Wr_uWu1$s>LVzNgWQbh_pcr_=Ft`Iikw`J9c>s#! zbBgkn*<3j@eYucJC(_wMAw5;hOy?kdDVNEntAE1Z585#BRoUHZo=5 z5+>oaS7DLEvtBPgb2;&Y^XCA&RABDPLEO2Z#<~3*;ae2LHTWL&h#Xh1o%2f6ZrNYU zZb>9|b=p&(joR(j)v{aj6T5)+H4x+sjFk~H#(nj~(~rJTqjoXK(eL)w=)Q$JE#v*Hp?W_R zQ#s7H5;=If1l+WEaH;K=vACvk*zF*B3;3yh*XSslrL8-<(A#Bnlt;}RY1S^Mo^^gU zhcn6|ZnxO*OZWJheTmB{lY1m7sj|VPjwadrlqQ7iO`Z%fGG{O#G~pe)2P<|b?l>a+ zI{l0RXD7cw4g#)vI(ag8Acz@f8}BElZCn-V@vS}Rb1-)K`P^)Is#L^w_acg|LT7|n z(M4le^ixdV*=B(gB*O7%gFZ=4My36Yluc!RKT0}b*Pis*sl>MjYDxTaj5K^gap6m= z8^8B|GxSY16?$`=gt1|4@Q2aSROj#2AgAROtMPrvrYe7s5IMI+ujpia$FVm&e*=rhnX&)? diff --git a/neo/libs/ffmpeg-win64/lib/libswscale.dll.a b/neo/libs/ffmpeg-win64/lib/libswscale.dll.a index 401045f52b2944dbd4b91fed9064675c4e775882..7f44d67030c7cd3d288c0a1cd017dd21ed5548af 100644 GIT binary patch delta 2070 zcmai#OGs2v7{}*~jyjHWZPJ->bkeKFBxQOZj@=PLM@_QKv9gD>7)+-Ww4v;^h*|^% z(n9#JqK84NBn!E#S}6oUi*|u65?Tk5L0I{qbFUyCar(~UuFn7ae~;h!?))^HpJo#w zchpc6L(z?fnW_#}7EKP0j3kFI^^c|;$)QyLU~=rn*g*eCDj7BJvMHB;i%cS#s>!`O~QZ2h_+T zjPL9g;wV&{iJ-(hR_OTb2JpoG@+SqWC1L5x=l!`DdUZYx|HH0P>)qA7{o+HT&X*=irsS$0Uuh3nU^gwmvt1g<5^jNzC^Lhc~#^0N{Q%QWRmzFEp@Ae{& z1wNrJ*2B-iAW*ve3Sdnd!rYj8EZC zXQnCGy~x3vBTM|+%+XBO>>cRBw=RJvg`~nlo@HY(Q4BpHYRRQ?wujeVo+!YT<10M5 c^ojo_=fsPXq5;W)^~+)mUrznXS^vTQ1D#0eAOHXW delta 2089 zcmai#%TE(g6vpSaw57C6DYk`DphdJ2gD^84pd~ToVJax0fQS+o6ND-xAW?iRj4n(x zAudSH%J{&Ymk5Qy8IV3U>)LOn6V0i6tz-3JJhV&xVjy#l#=`Wl~tlJ2R%Pogc^yOQ1#{!E|xA z;G92vPr5v_=@=iA`fw{%~GJ&V14mfV{!9@HWq%1lN zl!z{I%!SuPLNHtUN66lU>D~ufFJ;+YI7P7PeF)b>U4ly^=JGwnvIk+ad|l8rV7i-! zn68w@!ZraQO~-_s16Zu~LZQ_G(^Ucp8j9a-g{j?9FC?vY_);wvjWW1(fEDcr!+MZv z(K4}cltHs&AH83*t78;8K4RFYb;75^KXwjTMFA`7W^blg0&m_v@E#HPP*JY97#^rj zh%0UwtQXZNU3}1_2-0~0c&@Iq)ibLFa;%;Y8VmK%FaiJq6!Mjw__}2Uq=OXraZzeDkv#jYOzaD zXRoAJI^2X^#+}Ywmtl^?25(NRv9N`cxx)BPgvzuXR=R!)6F|}6)DtVLrhO1g3(PC% oayi?>v=(}?*TI{Z?E7DJgushaqCd(5|BDd`zMlSN&;E1&0XE3+8vpZO++L@=f`LX?2P777yT zO+2=|Q$fUf^H}C2cnNs$Z%~gOJP6)I@Z!vDjC<)g@SU9<-e=~``_BBj{`1Ce@mUyi z9`i;VFvgi`>7KDLiu5dFEe8Pd0M=80j0ceYn#g$#pyXaoG<5+$DfcbW%u4{J**l3& zodi%i^GRs}fW1+ogKT;4-PLTbcdzrH+dKSy94S{iLElS7s#wAKc6VcaV{88L!Z4j$ zD)ErlpJpFKe?8s3SpXmQ9o{bKz zcn#ZzVS#8+e(Mj%dKHwtMF*3&{~cn{kdip-Hqn{@;>g4+ZzU;{K1pQ4)Y+-;*<#b@ zDJC>AA9J!^ygn@P+oUr9FH!@^DLgxHIxFuRKJH{8E8Fl;2kh+Bx~2ly`c}hcoJ9!76}^ eotBRvt~&Y!XoI*RO>v7!Umc*qxq=v!7x53XTGR#r delta 1006 zcmah|&ubGw6n<~pZL>+OZZ}Pu#FEiid#Ua2X0y8$p}qJE_28xSl$5fTR)R*<94lxNKfL-tRxHSxbQt@hWE|;=KI(m*G{g!s_XDK`4g2di_viHs6lV~DcGVaVm^62UM#*_Jn3%|#D8G)Yb3U#vbeIr0Km`}Q0+8LSQ zKZk6bk<88iG6VC#P_2)}J?^6F|HqJgu8nB%Ei1+w@^Zz9H4G)a?6~yc`wQ z0o+Fbi#(@H56lvk3LEB}IJr%`g@);h)e0Ru4Ko(2H99ObaG7>(hYpRRor7Mlvw5%E zQ}+Pm2&-@D``E3)Ln4hVo}6kUy|*p8jurlS{ATKvdQPb0DFa6MfgNWUEgfUr5tCRs z&$o-S==V(vG@OBHVc_x3nY)O?{9O5RW@J-C=gYM%S;IwiLJ%(k6gF^n(Jym*L9gI9XT~xC|YJoWY|v@kvjFVDPvWc*5uNVTbNcgEe2cx dpgE&TFIfGe`bAWDu0}Ke$Yd0a3ST-O;V;7Z*4h97 diff --git a/neo/libs/ffmpeg-win64/lib/swresample-2.def b/neo/libs/ffmpeg-win64/lib/swresample-3.def similarity index 91% rename from neo/libs/ffmpeg-win64/lib/swresample-2.def rename to neo/libs/ffmpeg-win64/lib/swresample-3.def index 38644766..4ca6d903 100644 --- a/neo/libs/ffmpeg-win64/lib/swresample-2.def +++ b/neo/libs/ffmpeg-win64/lib/swresample-3.def @@ -1,12 +1,13 @@ EXPORTS swr_alloc swr_alloc_set_opts + swr_build_matrix swr_close swr_config_frame swr_convert swr_convert_frame swr_drop_output - swr_ffversion DATA + swr_ffversion swr_free swr_get_class swr_get_delay diff --git a/neo/libs/ffmpeg-win64/lib/swresample.lib b/neo/libs/ffmpeg-win64/lib/swresample.lib index cf7dc746aeafe0caa8d45a62d50f8c8f43b5cdd9..67a91b472db057220531b3bbff716bcbc79f6b7b 100644 GIT binary patch delta 1677 zcma)+OH5Ni6o$`0DKA^3$ot_CUbQOBz3puam69S57Mj2YH>S5BpiOv~f{&HBamT_s z2@6AvJ6sry99?Jvx^U&%xH2wS7(<8)6W2O(Z?xmW!6x5ka=tm8GymNEb@Gst`;BE* zoUu3y$MfwCYldY~=a;Df00!WB2T+;;s7Si_#JZ&Fqf1~1KvJ7?X&45OG`G04egKfr z$1WWU0FrLMOYjqbvVI(Io&$f5atm03b<4Zf_qpcpZo(cK`70AFir#7B*TiWSvZJIz9>M!O}V2$n`bXK2T< z{-iQABXX3%(=A^7+J0W?64p5r9pZoa@mXgZF=evkWg5E6r_^998i`OEwPKj3mk3Vv zj4JK4Nq8F+_qyHb#mhZaF{j+@>skr981d8SX}uEHhnVkVb`3%AXh4;DcD7 za&m2KzQl#)#nAy%F|@JSOo&F(Db1FD delta 1648 zcmai!J4_To7{|Xk?g57<$K!zIA$!940KwV2een!JNGLV2Fqj+|xC> z%t~6@0XV4-k_(#voQ~_95rD4K68s7v<4c@<0FJ*S>0Jci4D?6_e*kcXUvtLEve`_} zp=^Mxm+X?2;BabbYBImjHG5gsW?DxjJEm!2jO8!=8FUazQ!{)831j+1V>PlJ5RVqv zENM$T|DVZmEQ`okWsH6-?~~ID2cP7i8v5w;Xwk5`b;dzO7NKf-v+{;w_&VcD6*H=+ zSEIa@<>`zk30BForZ8y@RMJ?TtE}Yeyy<$jQk=YRFzBAquUL-G8fs)#1>I`06~opU zqSL?HB6PfENO3YJIVeU`XVp%pb;e>B>%v5PnEq)qP?`sfe@{!70TDCTwoTJ@JUSP> zhDbwals-Lwm^U$jHV|(*STmyZR=d)4tPO-P%4lP!YG?x?3d2q~n4iz($e!_%tm3<) zM+IVCG>Qc}zIV9SCZbcT5q2N|%pi7zkd}BI*@@JW+GIX-iT!hxEGJt-n2pBRsFu7- z#zH>3nJ z&Ax1qZug`WLmSz6A6sQ_C`=dndlg3;+Rp=7R2~proV+tz$dPZxTe3emd3=UpU4ALw WSqRY=Bg!tp+Q9M!5zx8Oi|8L(J9uXR diff --git a/neo/libs/ffmpeg-win64/lib/swscale-4.def b/neo/libs/ffmpeg-win64/lib/swscale-5.def similarity index 100% rename from neo/libs/ffmpeg-win64/lib/swscale-4.def rename to neo/libs/ffmpeg-win64/lib/swscale-5.def diff --git a/neo/libs/ffmpeg-win64/lib/swscale.lib b/neo/libs/ffmpeg-win64/lib/swscale.lib index 64f0dd6c44cd80dd80f33d04a56315a2d26fd28d..c80624ded3c0d32a2d6b1a29e09da92e4b601e3a 100644 GIT binary patch delta 1901 zcmai#!A}!G6o;7>Tj-(|ftpe&3&e&t2s7L6wh)UciXo^`F<=woR%k?<7&z4E)vF!| zFo`D*ax{vGeKFAk7sJ7WM~vQ#2bBwdg2tIe>AU#ovE6Uqo8SB1bZeV!ZL^hVlbz!{ z$J4pjJ>lTV%EH|Iy}_j+bMGVm{b-w}&4v2X;-(2RL5ndP9yN_HkGOLnvD3Wa^B%2o z&eLh{`Tx8;TyPm<5IvIHd$~tg2NFH-DU1n05Vd|)!i3ef2~>g;0Q_!unOtc*1apx@ zow0@~=H+o!B@RY(5D__wa61*z1)H%cL}V#K*9e_xs6MEcs^z)6@>Sx!bi2#@QCkj0 z|LAs^5!wsN>4kk!D zyztuLMF#aIC_8G7D$xd|>{z`iLCH~bZZlbIY=PksWS}68(7CZz`7Iv-mdBluBFu~` zDhzMVIH)yJ1aHZY!qOO8SwV>adN<_am?3{QhUMqjcbPhW&C=JEc1Tb%n5N*|$z)8^ zu?4J_uBr)-8(>V}S&>%gRMsX!^23G0@O2W$LQ0XjsA4fdUK*&!!bvH-AVYBW3JQ`_ zQh*m^GyIxDL2}9p7`^T?UsJpSEKR6^YUp#kPdjaxeqD}XqPxSe*K@p JdLdRxvOgK*#!UbK delta 1903 zcmai#PiPZC6o)fuNYW%oVrnFbHfhz+#5CF6Y}G=4RBI zLD8QQ7W2n8>GS-4?lwlP$c6ZPmm4Zs1(l+-fIEX0bMA2PyIp%BmOqX#QjSHjD%JyE)xQVA zc2*_jkl9&gH-J9SsiIPPtQexmc4(MY1WLx(h55}7UUmBBEUva zaw;jqL|G(0Uk$*^gGdIIl)*mgJagC&*Q&TXN(Qjc$nBb+e|81=+xSPGIdW37Z!H-) z<%GPu3|&tqjiL(6jd8{Tz-ot3n4}sq7C(P+Gy?BOaV(@6`j`mQ2mDyJQ%51qkU{>e z`(W(EAYv#pK;D^N_*F*-M4{Ax^5k^}Z%(1rE2I?VNwHNorhNSMnFu^TT|u3ZTG;F7 zisgZuQz^udTF8sj1*(OlP$(&E(fPw>0KT0yQ4z`p7@ZLt