commit
						8f760dbea4
					
				| @ -0,0 +1,9 @@ | ||||
| *.iml | ||||
| .gradle | ||||
| /local.properties | ||||
| /.idea/workspace.xml | ||||
| /.idea/libraries | ||||
| .DS_Store | ||||
| /build | ||||
| /captures | ||||
| .externalNativeBuild | ||||
| @ -0,0 +1,22 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="CompilerConfiguration"> | ||||
|     <resourceExtensions /> | ||||
|     <wildcardResourcePatterns> | ||||
|       <entry name="!?*.java" /> | ||||
|       <entry name="!?*.form" /> | ||||
|       <entry name="!?*.class" /> | ||||
|       <entry name="!?*.groovy" /> | ||||
|       <entry name="!?*.scala" /> | ||||
|       <entry name="!?*.flex" /> | ||||
|       <entry name="!?*.kt" /> | ||||
|       <entry name="!?*.clj" /> | ||||
|       <entry name="!?*.aj" /> | ||||
|     </wildcardResourcePatterns> | ||||
|     <annotationProcessing> | ||||
|       <profile default="true" name="Default" enabled="false"> | ||||
|         <processorPath useClasspath="true" /> | ||||
|       </profile> | ||||
|     </annotationProcessing> | ||||
|   </component> | ||||
| </project> | ||||
| @ -0,0 +1,3 @@ | ||||
| <component name="CopyrightManager"> | ||||
|   <settings default="" /> | ||||
| </component> | ||||
| @ -0,0 +1,18 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="GradleSettings"> | ||||
|     <option name="linkedExternalProjectsSettings"> | ||||
|       <GradleProjectSettings> | ||||
|         <option name="distributionType" value="DEFAULT_WRAPPED" /> | ||||
|         <option name="externalProjectPath" value="$PROJECT_DIR$" /> | ||||
|         <option name="modules"> | ||||
|           <set> | ||||
|             <option value="$PROJECT_DIR$" /> | ||||
|             <option value="$PROJECT_DIR$/app" /> | ||||
|           </set> | ||||
|         </option> | ||||
|         <option name="resolveModulePerSourceSet" value="false" /> | ||||
|       </GradleProjectSettings> | ||||
|     </option> | ||||
|   </component> | ||||
| </project> | ||||
| @ -0,0 +1,72 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="MarkdownProjectSettings"> | ||||
|     <PreviewSettings splitEditorLayout="SPLIT" splitEditorPreview="PREVIEW" useGrayscaleRendering="false" zoomFactor="1.0" maxImageWidth="0" showGitHubPageIfSynced="false" allowBrowsingInPreview="false" synchronizePreviewPosition="true" highlightPreviewType="NONE" highlightFadeOut="5" highlightOnTyping="true" synchronizeSourcePosition="true" verticallyAlignSourceAndPreviewSyncPosition="true" showSearchHighlightsInPreview="false" showSelectionInPreview="true" openRemoteLinks="true"> | ||||
|       <PanelProvider> | ||||
|         <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.panel" providerName="Default - Swing" /> | ||||
|       </PanelProvider> | ||||
|     </PreviewSettings> | ||||
|     <ParserSettings gitHubSyntaxChange="false"> | ||||
|       <PegdownExtensions> | ||||
|         <option name="ABBREVIATIONS" value="false" /> | ||||
|         <option name="ANCHORLINKS" value="true" /> | ||||
|         <option name="ASIDE" value="false" /> | ||||
|         <option name="ATXHEADERSPACE" value="true" /> | ||||
|         <option name="AUTOLINKS" value="true" /> | ||||
|         <option name="DEFINITIONS" value="false" /> | ||||
|         <option name="DEFINITION_BREAK_DOUBLE_BLANK_LINE" value="false" /> | ||||
|         <option name="FENCED_CODE_BLOCKS" value="true" /> | ||||
|         <option name="FOOTNOTES" value="false" /> | ||||
|         <option name="HARDWRAPS" value="false" /> | ||||
|         <option name="HTML_DEEP_PARSER" value="false" /> | ||||
|         <option name="INSERTED" value="false" /> | ||||
|         <option name="QUOTES" value="false" /> | ||||
|         <option name="RELAXEDHRULES" value="true" /> | ||||
|         <option name="SMARTS" value="false" /> | ||||
|         <option name="STRIKETHROUGH" value="true" /> | ||||
|         <option name="SUBSCRIPT" value="false" /> | ||||
|         <option name="SUPERSCRIPT" value="false" /> | ||||
|         <option name="SUPPRESS_HTML_BLOCKS" value="false" /> | ||||
|         <option name="SUPPRESS_INLINE_HTML" value="false" /> | ||||
|         <option name="TABLES" value="true" /> | ||||
|         <option name="TASKLISTITEMS" value="true" /> | ||||
|         <option name="TOC" value="false" /> | ||||
|         <option name="WIKILINKS" value="true" /> | ||||
|       </PegdownExtensions> | ||||
|       <ParserOptions> | ||||
|         <option name="COMMONMARK_LISTS" value="true" /> | ||||
|         <option name="DUMMY" value="false" /> | ||||
|         <option name="EMOJI_SHORTCUTS" value="true" /> | ||||
|         <option name="FLEXMARK_FRONT_MATTER" value="false" /> | ||||
|         <option name="GFM_LOOSE_BLANK_LINE_AFTER_ITEM_PARA" value="false" /> | ||||
|         <option name="GFM_TABLE_RENDERING" value="true" /> | ||||
|         <option name="GITBOOK_URL_ENCODING" value="false" /> | ||||
|         <option name="GITHUB_EMOJI_URL" value="false" /> | ||||
|         <option name="GITHUB_LISTS" value="false" /> | ||||
|         <option name="GITHUB_WIKI_LINKS" value="true" /> | ||||
|         <option name="JEKYLL_FRONT_MATTER" value="false" /> | ||||
|         <option name="SIM_TOC_BLANK_LINE_SPACER" value="true" /> | ||||
|       </ParserOptions> | ||||
|     </ParserSettings> | ||||
|     <HtmlSettings headerTopEnabled="false" headerBottomEnabled="false" bodyTopEnabled="false" bodyBottomEnabled="false" embedUrlContent="false" addPageHeader="true" embedImages="false" embedHttpImages="false"> | ||||
|       <GeneratorProvider> | ||||
|         <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.generator" providerName="Default Swing HTML Generator" /> | ||||
|       </GeneratorProvider> | ||||
|       <headerTop /> | ||||
|       <headerBottom /> | ||||
|       <bodyTop /> | ||||
|       <bodyBottom /> | ||||
|     </HtmlSettings> | ||||
|     <CssSettings previewScheme="UI_SCHEME" cssUri="" isCssUriEnabled="false" isCssTextEnabled="false" isDynamicPageWidth="true"> | ||||
|       <StylesheetProvider> | ||||
|         <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.css" providerName="Default Swing Stylesheet" /> | ||||
|       </StylesheetProvider> | ||||
|       <ScriptProviders /> | ||||
|       <cssText /> | ||||
|     </CssSettings> | ||||
|     <HtmlExportSettings updateOnSave="false" parentDir="$ProjectFileDir$" targetDir="$ProjectFileDir$" cssDir="" scriptDir="" plainHtml="false" imageDir="" copyLinkedImages="false" imageUniquifyType="0" targetExt="" useTargetExt="false" noCssNoScripts="false" linkToExportedHtml="true" exportOnSettingsChange="true" regenerateOnProjectOpen="false" linkFormatType="HTTP_ABSOLUTE" /> | ||||
|     <LinkMapSettings> | ||||
|       <textMaps /> | ||||
|     </LinkMapSettings> | ||||
|   </component> | ||||
| </project> | ||||
| @ -0,0 +1,3 @@ | ||||
| <component name="MarkdownNavigator.ProfileManager"> | ||||
|   <settings default="" pdf-export="" /> | ||||
| </component> | ||||
| @ -0,0 +1,33 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="NullableNotNullManager"> | ||||
|     <option name="myDefaultNullable" value="android.support.annotation.Nullable" /> | ||||
|     <option name="myDefaultNotNull" value="android.support.annotation.NonNull" /> | ||||
|     <option name="myNullables"> | ||||
|       <value> | ||||
|         <list size="4"> | ||||
|           <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" /> | ||||
|           <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" /> | ||||
|           <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" /> | ||||
|           <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" /> | ||||
|         </list> | ||||
|       </value> | ||||
|     </option> | ||||
|     <option name="myNotNulls"> | ||||
|       <value> | ||||
|         <list size="4"> | ||||
|           <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" /> | ||||
|           <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" /> | ||||
|           <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" /> | ||||
|           <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" /> | ||||
|         </list> | ||||
|       </value> | ||||
|     </option> | ||||
|   </component> | ||||
|   <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> | ||||
|     <output url="file://$PROJECT_DIR$/build/classes" /> | ||||
|   </component> | ||||
|   <component name="ProjectType"> | ||||
|     <option name="id" value="Android" /> | ||||
|   </component> | ||||
| </project> | ||||
| @ -0,0 +1,11 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="ProjectModuleManager"> | ||||
|     <modules> | ||||
|       <module fileurl="file://D:\git-repository\FFmpegAndroid\ConcatAudio.iml" filepath="D:\git-repository\FFmpegAndroid\ConcatAudio.iml" /> | ||||
|       <module fileurl="file://$PROJECT_DIR$/FFmpegAndroid.iml" filepath="$PROJECT_DIR$/FFmpegAndroid.iml" /> | ||||
|       <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" /> | ||||
|       <module fileurl="file://C:\Users\frank\Desktop\ffmpegCLDemo-master\ffmpegCLDemo.iml" filepath="C:\Users\frank\Desktop\ffmpegCLDemo-master\ffmpegCLDemo.iml" /> | ||||
|     </modules> | ||||
|   </component> | ||||
| </project> | ||||
| @ -0,0 +1,12 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="RunConfigurationProducerService"> | ||||
|     <option name="ignoredProducers"> | ||||
|       <set> | ||||
|         <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" /> | ||||
|         <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" /> | ||||
|         <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" /> | ||||
|       </set> | ||||
|     </option> | ||||
|   </component> | ||||
| </project> | ||||
| @ -0,0 +1,13 @@ | ||||
| # FFmpegAndroid | ||||
| android端基于FFmpeg库在中的使用。<br> | ||||
| 基于ffmpeg3.2.4版本,编译生成libffmpeg.so文件。<br> | ||||
| 目前音视频相关处理:<br> | ||||
| 
 | ||||
| - #### 音频剪切、拼接 | ||||
| - #### 音频混音 | ||||
| - #### 音频转码 | ||||
| *** | ||||
| 
 | ||||
| 后续会加上音视频编解码、合成与分离,视频水印、截图、转Gif动图、剪切、转码。 | ||||
| <br><br> | ||||
| 
 | ||||
| @ -0,0 +1 @@ | ||||
| /build | ||||
| @ -0,0 +1,45 @@ | ||||
| # For more information about using CMake with Android Studio, read the | ||||
| # documentation: https://d.android.com/studio/projects/add-native-code.html | ||||
| 
 | ||||
| # Sets the minimum version of CMake required to build the native library. | ||||
| 
 | ||||
| cmake_minimum_required(VERSION 3.4.1) | ||||
| 
 | ||||
| # Creates and names a library, sets it as either STATIC | ||||
| # or SHARED, and provides the relative paths to its source code. | ||||
| # You can define multiple libraries, and CMake builds them for you. | ||||
| # Gradle automatically packages shared libraries with your APK. | ||||
| 
 | ||||
| add_library( # Sets the name of the library. | ||||
|              audio-handle | ||||
| 
 | ||||
|              # Sets the library as a shared library. | ||||
|              SHARED | ||||
| 
 | ||||
|              # Provides a relative path to your source file(s). | ||||
|              src/main/cpp/ffmpeg_cmd.c | ||||
|              src/main/cpp/cmdutils.c | ||||
|              src/main/cpp/ffmpeg.c | ||||
|              src/main/cpp/ffmpeg_filter.c | ||||
|              src/main/cpp/ffmpeg_opt.c) | ||||
| 
 | ||||
| add_library( ffmpeg | ||||
|              SHARED | ||||
|              IMPORTED ) | ||||
| set_target_properties( ffmpeg | ||||
|                        PROPERTIES IMPORTED_LOCATION | ||||
|                        ../../../../libs/armeabi-v7a/libffmpeg.so ) | ||||
| 
 | ||||
| include_directories(src/main/cpp) | ||||
| include_directories(src/main/cpp/include) | ||||
| 
 | ||||
| find_library( # Sets the name of the path variable. | ||||
|               log-lib | ||||
|               log ) | ||||
| 
 | ||||
| target_link_libraries( # Specifies the target library. | ||||
|                        audio-handle | ||||
|                        ffmpeg | ||||
|                        # Links the target library to the log library | ||||
|                        # included in the NDK. | ||||
|                        ${log-lib} ) | ||||
| @ -0,0 +1,50 @@ | ||||
| apply plugin: 'com.android.application' | ||||
| 
 | ||||
| android { | ||||
|     compileSdkVersion 25 | ||||
|     buildToolsVersion "25.0.2" | ||||
|     defaultConfig { | ||||
|         applicationId "com.frank.ffmpeg" | ||||
|         minSdkVersion 17 | ||||
|         targetSdkVersion 22 | ||||
|         versionCode 1 | ||||
|         versionName "1.0" | ||||
|         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" | ||||
| 
 | ||||
|         externalNativeBuild { | ||||
|             cmake { | ||||
|                 cppFlags "" | ||||
|             } | ||||
|         } | ||||
|         ndk { | ||||
|             abiFilters "armeabi-v7a" | ||||
|         } | ||||
|     } | ||||
|     buildTypes { | ||||
|         release { | ||||
|             minifyEnabled false | ||||
|             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     externalNativeBuild { | ||||
|         cmake { | ||||
|             path "CMakeLists.txt" | ||||
|         } | ||||
|     } | ||||
|     sourceSets { | ||||
|         main { | ||||
|             jniLibs.srcDirs = ['libs'] | ||||
|             jni.srcDirs = [] | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| dependencies { | ||||
|     compile fileTree(include: ['*.jar'], dir: 'libs') | ||||
|     androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { | ||||
|         exclude group: 'com.android.support', module: 'support-annotations' | ||||
|     }) | ||||
|     compile 'com.android.support:appcompat-v7:25.0.0' | ||||
|     testCompile 'junit:junit:4.12' | ||||
| } | ||||
									
										Binary file not shown.
									
								
							
						| @ -0,0 +1,25 @@ | ||||
| # Add project specific ProGuard rules here. | ||||
| # By default, the flags in this file are appended to flags specified | ||||
| # in D:\adt-bundle-windows-x86_64-20131030\sdk/tools/proguard/proguard-android.txt | ||||
| # You can edit the include path and order by changing the proguardFiles | ||||
| # directive in build.gradle. | ||||
| # | ||||
| # For more details, see | ||||
| #   http://developer.android.com/guide/developing/tools/proguard.html | ||||
| 
 | ||||
| # Add any project specific keep options here: | ||||
| 
 | ||||
| # If your project uses WebView with JS, uncomment the following | ||||
| # and specify the fully qualified class name to the JavaScript interface | ||||
| # class: | ||||
| #-keepclassmembers class fqcn.of.javascript.interface.for.webview { | ||||
| #   public *; | ||||
| #} | ||||
| 
 | ||||
| # Uncomment this to preserve the line number information for | ||||
| # debugging stack traces. | ||||
| #-keepattributes SourceFile,LineNumberTable | ||||
| 
 | ||||
| # If you keep the line number information, uncomment this to | ||||
| # hide the original source file name. | ||||
| #-renamesourcefileattribute SourceFile | ||||
| @ -0,0 +1,26 @@ | ||||
| package com.frank; | ||||
| 
 | ||||
| import android.content.Context; | ||||
| import android.support.test.InstrumentationRegistry; | ||||
| import android.support.test.runner.AndroidJUnit4; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| import org.junit.runner.RunWith; | ||||
| 
 | ||||
| import static org.junit.Assert.*; | ||||
| 
 | ||||
| /** | ||||
|  * Instrumentation test, which will execute on an Android device. | ||||
|  * | ||||
|  * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> | ||||
|  */ | ||||
| @RunWith(AndroidJUnit4.class) | ||||
| public class ExampleInstrumentedTest { | ||||
|     @Test | ||||
|     public void useAppContext() throws Exception { | ||||
|         // Context of the app under test.
 | ||||
|         Context appContext = InstrumentationRegistry.getTargetContext(); | ||||
| 
 | ||||
|         assertEquals("codepig.ffmpegcldemo", appContext.getPackageName()); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,33 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     package="com.frank.ffmpeg"> | ||||
| 
 | ||||
|     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> | ||||
|     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> | ||||
|     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> | ||||
|     <uses-permission android:name="android.permission.CAMERA" /> | ||||
|     <uses-permission android:name="android.permission.RECORD_AUDIO" /> | ||||
|     <uses-permission android:name="android.permission.INTERNET" /> | ||||
| 
 | ||||
|     <uses-feature android:name="android.hardware.camera" /> | ||||
|     <uses-feature android:name="android.hardware.camera.autofocus" /> | ||||
| 
 | ||||
|     <application | ||||
|         android:allowBackup="true" | ||||
|         android:icon="@mipmap/ic_launcher" | ||||
|         android:label="@string/app_name" | ||||
|         android:roundIcon="@mipmap/ic_launcher_round" | ||||
|         android:screenOrientation="landscape" | ||||
|         android:supportsRtl="true" | ||||
|         android:theme="@style/AppTheme"> | ||||
| 
 | ||||
|         <activity android:name=".activity.AudioHandleActivity"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.MAIN" /> | ||||
|                 <category android:name="android.intent.category.LAUNCHER" /> | ||||
|             </intent-filter> | ||||
|         </activity> | ||||
| 
 | ||||
|     </application> | ||||
| 
 | ||||
| </manifest> | ||||
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						| @ -0,0 +1,590 @@ | ||||
| /*
 | ||||
|  * Various utilities for command line tools | ||||
|  * copyright (c) 2003 Fabrice Bellard | ||||
|  * | ||||
|  * 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 CMDUTILS_H | ||||
| #define CMDUTILS_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "config.h" | ||||
| #include "libavcodec/avcodec.h" | ||||
| #include "libavfilter/avfilter.h" | ||||
| #include "libavformat/avformat.h" | ||||
| #include "libswscale/swscale.h" | ||||
| 
 | ||||
| #ifdef _WIN32 | ||||
| #undef main /* We don't want SDL to override our main() */ | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * program name, defined by the program for show_version(). | ||||
|  */ | ||||
| extern const char program_name[]; | ||||
| 
 | ||||
| /**
 | ||||
|  * program birth year, defined by the program for show_banner() | ||||
|  */ | ||||
| extern const int program_birth_year; | ||||
| 
 | ||||
| extern AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB]; | ||||
| extern AVFormatContext *avformat_opts; | ||||
| extern AVDictionary *sws_dict; | ||||
| extern AVDictionary *swr_opts; | ||||
| extern AVDictionary *format_opts, *codec_opts, *resample_opts; | ||||
| extern int hide_banner; | ||||
| 
 | ||||
| /**
 | ||||
|  * Register a program-specific cleanup routine. | ||||
|  */ | ||||
| void register_exit(void (*cb)(int ret)); | ||||
| 
 | ||||
| /**
 | ||||
|  * Wraps exit with a program-specific cleanup routine. | ||||
|  */ | ||||
| int exit_program(int ret); | ||||
| 
 | ||||
| /**
 | ||||
|  * Initialize the cmdutils option system, in particular | ||||
|  * allocate the *_opts contexts. | ||||
|  */ | ||||
| void init_opts(void); | ||||
| /**
 | ||||
|  * Uninitialize the cmdutils option system, in particular | ||||
|  * free the *_opts contexts and their contents. | ||||
|  */ | ||||
| void uninit_opts(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Trivial log callback. | ||||
|  * Only suitable for opt_help and similar since it lacks prefix handling. | ||||
|  */ | ||||
| void log_callback_help(void* ptr, int level, const char* fmt, va_list vl); | ||||
| 
 | ||||
| /**
 | ||||
|  * Override the cpuflags. | ||||
|  */ | ||||
| int opt_cpuflags(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Fallback for options that are not explicitly handled, these will be | ||||
|  * parsed through AVOptions. | ||||
|  */ | ||||
| int opt_default(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Set the libav* libraries log level. | ||||
|  */ | ||||
| int opt_loglevel(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| int opt_report(const char *opt); | ||||
| 
 | ||||
| int opt_max_alloc(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| int opt_codec_debug(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| #if CONFIG_OPENCL | ||||
| int opt_opencl(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| int opt_opencl_bench(void *optctx, const char *opt, const char *arg); | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * Limit the execution time. | ||||
|  */ | ||||
| int opt_timelimit(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Parse a string and return its corresponding value as a double. | ||||
|  * Exit from the application if the string cannot be correctly | ||||
|  * parsed or the corresponding value is invalid. | ||||
|  * | ||||
|  * @param context the context of the value to be set (e.g. the | ||||
|  * corresponding command line option name) | ||||
|  * @param numstr the string to be parsed | ||||
|  * @param type the type (OPT_INT64 or OPT_FLOAT) as which the | ||||
|  * string should be parsed | ||||
|  * @param min the minimum valid accepted value | ||||
|  * @param max the maximum valid accepted value | ||||
|  */ | ||||
| double parse_number_or_die(const char *context, const char *numstr, int type, | ||||
|                            double min, double max); | ||||
| 
 | ||||
| /**
 | ||||
|  * Parse a string specifying a time and return its corresponding | ||||
|  * value as a number of microseconds. Exit from the application if | ||||
|  * the string cannot be correctly parsed. | ||||
|  * | ||||
|  * @param context the context of the value to be set (e.g. the | ||||
|  * corresponding command line option name) | ||||
|  * @param timestr the string to be parsed | ||||
|  * @param is_duration a flag which tells how to interpret timestr, if | ||||
|  * not zero timestr is interpreted as a duration, otherwise as a | ||||
|  * date | ||||
|  * | ||||
|  * @see av_parse_time() | ||||
|  */ | ||||
| int64_t parse_time_or_die(const char *context, const char *timestr, | ||||
|                           int is_duration); | ||||
| 
 | ||||
| typedef struct SpecifierOpt { | ||||
|     char *specifier;    /**< stream/chapter/program/... specifier */ | ||||
|     union { | ||||
|         uint8_t *str; | ||||
|         int        i; | ||||
|         int64_t  i64; | ||||
|         float      f; | ||||
|         double   dbl; | ||||
|     } u; | ||||
| } SpecifierOpt; | ||||
| 
 | ||||
| typedef struct OptionDef { | ||||
|     const char *name; | ||||
|     int flags; | ||||
| #define HAS_ARG    0x0001 | ||||
| #define OPT_BOOL   0x0002 | ||||
| #define OPT_EXPERT 0x0004 | ||||
| #define OPT_STRING 0x0008 | ||||
| #define OPT_VIDEO  0x0010 | ||||
| #define OPT_AUDIO  0x0020 | ||||
| #define OPT_INT    0x0080 | ||||
| #define OPT_FLOAT  0x0100 | ||||
| #define OPT_SUBTITLE 0x0200 | ||||
| #define OPT_INT64  0x0400 | ||||
| #define OPT_EXIT   0x0800 | ||||
| #define OPT_DATA   0x1000 | ||||
| #define OPT_PERFILE  0x2000     /* the option is per-file (currently ffmpeg-only). | ||||
|                                    implied by OPT_OFFSET or OPT_SPEC */ | ||||
| #define OPT_OFFSET 0x4000       /* option is specified as an offset in a passed optctx */ | ||||
| #define OPT_SPEC   0x8000       /* option is to be stored in an array of SpecifierOpt. | ||||
|                                    Implies OPT_OFFSET. Next element after the offset is | ||||
|                                    an int containing element count in the array. */ | ||||
| #define OPT_TIME  0x10000 | ||||
| #define OPT_DOUBLE 0x20000 | ||||
| #define OPT_INPUT  0x40000 | ||||
| #define OPT_OUTPUT 0x80000 | ||||
|      union { | ||||
|         void *dst_ptr; | ||||
|         int (*func_arg)(void *, const char *, const char *); | ||||
|         size_t off; | ||||
|     } u; | ||||
|     const char *help; | ||||
|     const char *argname; | ||||
| } OptionDef; | ||||
| 
 | ||||
| /**
 | ||||
|  * Print help for all options matching specified flags. | ||||
|  * | ||||
|  * @param options a list of options | ||||
|  * @param msg title of this group. Only printed if at least one option matches. | ||||
|  * @param req_flags print only options which have all those flags set. | ||||
|  * @param rej_flags don't print options which have any of those flags set. | ||||
|  * @param alt_flags print only options that have at least one of those flags set | ||||
|  */ | ||||
| void show_help_options(const OptionDef *options, const char *msg, int req_flags, | ||||
|                        int rej_flags, int alt_flags); | ||||
| 
 | ||||
| /**
 | ||||
|  * Show help for all options with given flags in class and all its | ||||
|  * children. | ||||
|  */ | ||||
| void show_help_children(const AVClass *class, int flags); | ||||
| 
 | ||||
| /**
 | ||||
|  * Per-fftool specific help handler. Implemented in each | ||||
|  * fftool, called by show_help(). | ||||
|  */ | ||||
| void show_help_default(const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Generic -h handler common to all fftools. | ||||
|  */ | ||||
| int show_help(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Parse the command line arguments. | ||||
|  * | ||||
|  * @param optctx an opaque options context | ||||
|  * @param argc   number of command line arguments | ||||
|  * @param argv   values of command line arguments | ||||
|  * @param options Array with the definitions required to interpret every | ||||
|  * option of the form: -option_name [argument] | ||||
|  * @param parse_arg_function Name of the function called to process every | ||||
|  * argument without a leading option name flag. NULL if such arguments do | ||||
|  * not have to be processed. | ||||
|  */ | ||||
| void parse_options(void *optctx, int argc, char **argv, const OptionDef *options, | ||||
|                    void (* parse_arg_function)(void *optctx, const char*)); | ||||
| 
 | ||||
| /**
 | ||||
|  * Parse one given option. | ||||
|  * | ||||
|  * @return on success 1 if arg was consumed, 0 otherwise; negative number on error | ||||
|  */ | ||||
| int parse_option(void *optctx, const char *opt, const char *arg, | ||||
|                  const OptionDef *options); | ||||
| 
 | ||||
| /**
 | ||||
|  * An option extracted from the commandline. | ||||
|  * Cannot use AVDictionary because of options like -map which can be | ||||
|  * used multiple times. | ||||
|  */ | ||||
| typedef struct Option { | ||||
|     const OptionDef  *opt; | ||||
|     const char       *key; | ||||
|     const char       *val; | ||||
| } Option; | ||||
| 
 | ||||
| typedef struct OptionGroupDef { | ||||
|     /**< group name */ | ||||
|     const char *name; | ||||
|     /**
 | ||||
|      * Option to be used as group separator. Can be NULL for groups which | ||||
|      * are terminated by a non-option argument (e.g. ffmpeg output files) | ||||
|      */ | ||||
|     const char *sep; | ||||
|     /**
 | ||||
|      * Option flags that must be set on each option that is | ||||
|      * applied to this group | ||||
|      */ | ||||
|     int flags; | ||||
| } OptionGroupDef; | ||||
| 
 | ||||
| typedef struct OptionGroup { | ||||
|     const OptionGroupDef *group_def; | ||||
|     const char *arg; | ||||
| 
 | ||||
|     Option *opts; | ||||
|     int  nb_opts; | ||||
| 
 | ||||
|     AVDictionary *codec_opts; | ||||
|     AVDictionary *format_opts; | ||||
|     AVDictionary *resample_opts; | ||||
|     AVDictionary *sws_dict; | ||||
|     AVDictionary *swr_opts; | ||||
| } OptionGroup; | ||||
| 
 | ||||
| /**
 | ||||
|  * A list of option groups that all have the same group type | ||||
|  * (e.g. input files or output files) | ||||
|  */ | ||||
| typedef struct OptionGroupList { | ||||
|     const OptionGroupDef *group_def; | ||||
| 
 | ||||
|     OptionGroup *groups; | ||||
|     int       nb_groups; | ||||
| } OptionGroupList; | ||||
| 
 | ||||
| typedef struct OptionParseContext { | ||||
|     OptionGroup global_opts; | ||||
| 
 | ||||
|     OptionGroupList *groups; | ||||
|     int           nb_groups; | ||||
| 
 | ||||
|     /* parsing state */ | ||||
|     OptionGroup cur_group; | ||||
| } OptionParseContext; | ||||
| 
 | ||||
| /**
 | ||||
|  * Parse an options group and write results into optctx. | ||||
|  * | ||||
|  * @param optctx an app-specific options context. NULL for global options group | ||||
|  */ | ||||
| int parse_optgroup(void *optctx, OptionGroup *g); | ||||
| 
 | ||||
| /**
 | ||||
|  * Split the commandline into an intermediate form convenient for further | ||||
|  * processing. | ||||
|  * | ||||
|  * The commandline is assumed to be composed of options which either belong to a | ||||
|  * group (those with OPT_SPEC, OPT_OFFSET or OPT_PERFILE) or are global | ||||
|  * (everything else). | ||||
|  * | ||||
|  * A group (defined by an OptionGroupDef struct) is a sequence of options | ||||
|  * terminated by either a group separator option (e.g. -i) or a parameter that | ||||
|  * is not an option (doesn't start with -). A group without a separator option | ||||
|  * must always be first in the supplied groups list. | ||||
|  * | ||||
|  * All options within the same group are stored in one OptionGroup struct in an | ||||
|  * OptionGroupList, all groups with the same group definition are stored in one | ||||
|  * OptionGroupList in OptionParseContext.groups. The order of group lists is the | ||||
|  * same as the order of group definitions. | ||||
|  */ | ||||
| int split_commandline(OptionParseContext *octx, int argc, char *argv[], | ||||
|                       const OptionDef *options, | ||||
|                       const OptionGroupDef *groups, int nb_groups); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free all allocated memory in an OptionParseContext. | ||||
|  */ | ||||
| void uninit_parse_context(OptionParseContext *octx); | ||||
| 
 | ||||
| /**
 | ||||
|  * Find the '-loglevel' option in the command line args and apply it. | ||||
|  */ | ||||
| void parse_loglevel(int argc, char **argv, const OptionDef *options); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return index of option opt in argv or 0 if not found. | ||||
|  */ | ||||
| int locate_option(int argc, char **argv, const OptionDef *options, | ||||
|                   const char *optname); | ||||
| 
 | ||||
| /**
 | ||||
|  * Check if the given stream matches a stream specifier. | ||||
|  * | ||||
|  * @param s  Corresponding format context. | ||||
|  * @param st Stream from s to be checked. | ||||
|  * @param spec A stream specifier of the [v|a|s|d]:[\<stream index\>] form. | ||||
|  * | ||||
|  * @return 1 if the stream matches, 0 if it doesn't, <0 on error | ||||
|  */ | ||||
| int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec); | ||||
| 
 | ||||
| /**
 | ||||
|  * Filter out options for given codec. | ||||
|  * | ||||
|  * Create a new options dictionary containing only the options from | ||||
|  * opts which apply to the codec with ID codec_id. | ||||
|  * | ||||
|  * @param opts     dictionary to place options in | ||||
|  * @param codec_id ID of the codec that should be filtered for | ||||
|  * @param s Corresponding format context. | ||||
|  * @param st A stream from s for which the options should be filtered. | ||||
|  * @param codec The particular codec for which the options should be filtered. | ||||
|  *              If null, the default one is looked up according to the codec id. | ||||
|  * @return a pointer to the created dictionary | ||||
|  */ | ||||
| AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id, | ||||
|                                 AVFormatContext *s, AVStream *st, AVCodec *codec); | ||||
| 
 | ||||
| /**
 | ||||
|  * Setup AVCodecContext options for avformat_find_stream_info(). | ||||
|  * | ||||
|  * Create an array of dictionaries, one dictionary for each stream | ||||
|  * contained in s. | ||||
|  * Each dictionary will contain the options from codec_opts which can | ||||
|  * be applied to the corresponding stream codec context. | ||||
|  * | ||||
|  * @return pointer to the created array of dictionaries, NULL if it | ||||
|  * cannot be created | ||||
|  */ | ||||
| AVDictionary **setup_find_stream_info_opts(AVFormatContext *s, | ||||
|                                            AVDictionary *codec_opts); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print an error message to stderr, indicating filename and a human | ||||
|  * readable description of the error code err. | ||||
|  * | ||||
|  * If strerror_r() is not available the use of this function in a | ||||
|  * multithreaded application may be unsafe. | ||||
|  * | ||||
|  * @see av_strerror() | ||||
|  */ | ||||
| void print_error(const char *filename, int err); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print the program banner to stderr. The banner contents depend on the | ||||
|  * current version of the repository and of the libav* libraries used by | ||||
|  * the program. | ||||
|  */ | ||||
| void show_banner(int argc, char **argv, const OptionDef *options); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print the version of the program to stdout. The version message | ||||
|  * depends on the current versions of the repository and of the libav* | ||||
|  * libraries. | ||||
|  * This option processing function does not utilize the arguments. | ||||
|  */ | ||||
| int show_version(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print the build configuration of the program to stdout. The contents | ||||
|  * depend on the definition of FFMPEG_CONFIGURATION. | ||||
|  * This option processing function does not utilize the arguments. | ||||
|  */ | ||||
| int show_buildconf(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print the license of the program to stdout. The license depends on | ||||
|  * the license of the libraries compiled into the program. | ||||
|  * This option processing function does not utilize the arguments. | ||||
|  */ | ||||
| int show_license(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print a listing containing all the formats supported by the | ||||
|  * program (including devices). | ||||
|  * This option processing function does not utilize the arguments. | ||||
|  */ | ||||
| int show_formats(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print a listing containing all the devices supported by the | ||||
|  * program. | ||||
|  * This option processing function does not utilize the arguments. | ||||
|  */ | ||||
| int show_devices(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| #if CONFIG_AVDEVICE | ||||
| /**
 | ||||
|  * Print a listing containing audodetected sinks of the output device. | ||||
|  * Device name with options may be passed as an argument to limit results. | ||||
|  */ | ||||
| int show_sinks(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print a listing containing audodetected sources of the input device. | ||||
|  * Device name with options may be passed as an argument to limit results. | ||||
|  */ | ||||
| int show_sources(void *optctx, const char *opt, const char *arg); | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * Print a listing containing all the codecs supported by the | ||||
|  * program. | ||||
|  * This option processing function does not utilize the arguments. | ||||
|  */ | ||||
| int show_codecs(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print a listing containing all the decoders supported by the | ||||
|  * program. | ||||
|  */ | ||||
| int show_decoders(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print a listing containing all the encoders supported by the | ||||
|  * program. | ||||
|  */ | ||||
| int show_encoders(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print a listing containing all the filters supported by the | ||||
|  * program. | ||||
|  * This option processing function does not utilize the arguments. | ||||
|  */ | ||||
| int show_filters(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print a listing containing all the bit stream filters supported by the | ||||
|  * program. | ||||
|  * This option processing function does not utilize the arguments. | ||||
|  */ | ||||
| int show_bsfs(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print a listing containing all the protocols supported by the | ||||
|  * program. | ||||
|  * This option processing function does not utilize the arguments. | ||||
|  */ | ||||
| int show_protocols(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print a listing containing all the pixel formats supported by the | ||||
|  * program. | ||||
|  * This option processing function does not utilize the arguments. | ||||
|  */ | ||||
| int show_pix_fmts(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print a listing containing all the standard channel layouts supported by | ||||
|  * the program. | ||||
|  * This option processing function does not utilize the arguments. | ||||
|  */ | ||||
| int show_layouts(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print a listing containing all the sample formats supported by the | ||||
|  * program. | ||||
|  */ | ||||
| int show_sample_fmts(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Print a listing containing all the color names and values recognized | ||||
|  * by the program. | ||||
|  */ | ||||
| int show_colors(void *optctx, const char *opt, const char *arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return a positive value if a line read from standard input | ||||
|  * starts with [yY], otherwise return 0. | ||||
|  */ | ||||
| int read_yesno(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get a file corresponding to a preset file. | ||||
|  * | ||||
|  * If is_path is non-zero, look for the file in the path preset_name. | ||||
|  * Otherwise search for a file named arg.ffpreset in the directories | ||||
|  * $FFMPEG_DATADIR (if set), $HOME/.ffmpeg, and in the datadir defined | ||||
|  * at configuration time or in a "ffpresets" folder along the executable | ||||
|  * on win32, in that order. If no such file is found and | ||||
|  * codec_name is defined, then search for a file named | ||||
|  * codec_name-preset_name.avpreset in the above-mentioned directories. | ||||
|  * | ||||
|  * @param filename buffer where the name of the found filename is written | ||||
|  * @param filename_size size in bytes of the filename buffer | ||||
|  * @param preset_name name of the preset to search | ||||
|  * @param is_path tell if preset_name is a filename path | ||||
|  * @param codec_name name of the codec for which to look for the | ||||
|  * preset, may be NULL | ||||
|  */ | ||||
| FILE *get_preset_file(char *filename, size_t filename_size, | ||||
|                       const char *preset_name, int is_path, const char *codec_name); | ||||
| 
 | ||||
| /**
 | ||||
|  * Realloc array to hold new_size elements of elem_size. | ||||
|  * Calls exit() on failure. | ||||
|  * | ||||
|  * @param array array to reallocate | ||||
|  * @param elem_size size in bytes of each element | ||||
|  * @param size new element count will be written here | ||||
|  * @param new_size number of elements to place in reallocated array | ||||
|  * @return reallocated array | ||||
|  */ | ||||
| void *grow_array(void *array, int elem_size, int *size, int new_size); | ||||
| 
 | ||||
| #define media_type_string av_get_media_type_string | ||||
| 
 | ||||
| #define GROW_ARRAY(array, nb_elems)\ | ||||
|     array = grow_array(array, sizeof(*array), &nb_elems, nb_elems + 1) | ||||
| 
 | ||||
| #define GET_PIX_FMT_NAME(pix_fmt)\ | ||||
|     const char *name = av_get_pix_fmt_name(pix_fmt); | ||||
| 
 | ||||
| #define GET_SAMPLE_FMT_NAME(sample_fmt)\ | ||||
|     const char *name = av_get_sample_fmt_name(sample_fmt) | ||||
| 
 | ||||
| #define GET_SAMPLE_RATE_NAME(rate)\ | ||||
|     char name[16];\
 | ||||
|     snprintf(name, sizeof(name), "%d", rate); | ||||
| 
 | ||||
| #define GET_CH_LAYOUT_NAME(ch_layout)\ | ||||
|     char name[16];\
 | ||||
|     snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout); | ||||
| 
 | ||||
| #define GET_CH_LAYOUT_DESC(ch_layout)\ | ||||
|     char name[128];\
 | ||||
|     av_get_channel_layout_string(name, sizeof(name), 0, ch_layout); | ||||
| 
 | ||||
| double get_rotation(AVStream *st); | ||||
| 
 | ||||
| #endif /* CMDUTILS_H */ | ||||
| @ -0,0 +1,35 @@ | ||||
|     { "L"          , OPT_EXIT, {.func_arg = show_license},      "show license" }, | ||||
|     { "h"          , OPT_EXIT, {.func_arg = show_help},         "show help", "topic" }, | ||||
|     { "?"          , OPT_EXIT, {.func_arg = show_help},         "show help", "topic" }, | ||||
|     { "help"       , OPT_EXIT, {.func_arg = show_help},         "show help", "topic" }, | ||||
|     { "-help"      , OPT_EXIT, {.func_arg = show_help},         "show help", "topic" }, | ||||
|     { "version"    , OPT_EXIT, {.func_arg = show_version},      "show version" }, | ||||
|     { "buildconf"  , OPT_EXIT, {.func_arg = show_buildconf},    "show build configuration" }, | ||||
|     { "formats"    , OPT_EXIT, {.func_arg = show_formats  },    "show available formats" }, | ||||
|     { "devices"    , OPT_EXIT, {.func_arg = show_devices  },    "show available devices" }, | ||||
|     { "codecs"     , OPT_EXIT, {.func_arg = show_codecs   },    "show available codecs" }, | ||||
|     { "decoders"   , OPT_EXIT, {.func_arg = show_decoders },    "show available decoders" }, | ||||
|     { "encoders"   , OPT_EXIT, {.func_arg = show_encoders },    "show available encoders" }, | ||||
|     { "bsfs"       , OPT_EXIT, {.func_arg = show_bsfs     },    "show available bit stream filters" }, | ||||
|     { "protocols"  , OPT_EXIT, {.func_arg = show_protocols},    "show available protocols" }, | ||||
|     { "filters"    , OPT_EXIT, {.func_arg = show_filters  },    "show available filters" }, | ||||
|     { "pix_fmts"   , OPT_EXIT, {.func_arg = show_pix_fmts },    "show available pixel formats" }, | ||||
|     { "layouts"    , OPT_EXIT, {.func_arg = show_layouts  },    "show standard channel layouts" }, | ||||
|     { "sample_fmts", OPT_EXIT, {.func_arg = show_sample_fmts }, "show available audio sample formats" }, | ||||
|     { "colors"     , OPT_EXIT, {.func_arg = show_colors },      "show available color names" }, | ||||
|     { "loglevel"   , HAS_ARG,  {.func_arg = opt_loglevel},      "set logging level", "loglevel" }, | ||||
|     { "v",           HAS_ARG,  {.func_arg = opt_loglevel},      "set logging level", "loglevel" }, | ||||
|     { "report"     , 0,        {(void*)opt_report}, "generate a report" }, | ||||
|     { "max_alloc"  , HAS_ARG,  {.func_arg = opt_max_alloc},     "set maximum size of a single allocated block", "bytes" }, | ||||
|     { "cpuflags"   , HAS_ARG | OPT_EXPERT, { .func_arg = opt_cpuflags }, "force specific cpu flags", "flags" }, | ||||
|     { "hide_banner", OPT_BOOL | OPT_EXPERT, {&hide_banner},     "do not show program banner", "hide_banner" }, | ||||
| #if CONFIG_OPENCL | ||||
|     { "opencl_bench", OPT_EXIT, {.func_arg = opt_opencl_bench}, "run benchmark on all OpenCL devices and show results" }, | ||||
|     { "opencl_options", HAS_ARG, {.func_arg = opt_opencl},      "set OpenCL environment options" }, | ||||
| #endif | ||||
| #if CONFIG_AVDEVICE | ||||
|     { "sources"    , OPT_EXIT | HAS_ARG, { .func_arg = show_sources }, | ||||
|       "list sources of the input device", "device" }, | ||||
|     { "sinks"      , OPT_EXIT | HAS_ARG, { .func_arg = show_sinks }, | ||||
|       "list sinks of the output device", "device" }, | ||||
| #endif | ||||
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						| @ -0,0 +1,583 @@ | ||||
| /*
 | ||||
|  * 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 FFMPEG_H | ||||
| #define FFMPEG_H | ||||
| 
 | ||||
| #include "config.h" | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <signal.h> | ||||
| 
 | ||||
| #if HAVE_PTHREADS | ||||
| #include <pthread.h> | ||||
| #endif | ||||
| 
 | ||||
| #include "cmdutils.h" | ||||
| 
 | ||||
| #include "libavformat/avformat.h" | ||||
| #include "libavformat/avio.h" | ||||
| 
 | ||||
| #include "libavcodec/avcodec.h" | ||||
| 
 | ||||
| #include "libavfilter/avfilter.h" | ||||
| 
 | ||||
| #include "libavutil/avutil.h" | ||||
| #include "libavutil/dict.h" | ||||
| #include "libavutil/eval.h" | ||||
| #include "libavutil/fifo.h" | ||||
| #include "libavutil/pixfmt.h" | ||||
| #include "libavutil/rational.h" | ||||
| #include "libavutil/threadmessage.h" | ||||
| 
 | ||||
| #include "libswresample/swresample.h" | ||||
| 
 | ||||
| #define VSYNC_AUTO       -1 | ||||
| #define VSYNC_PASSTHROUGH 0 | ||||
| #define VSYNC_CFR         1 | ||||
| #define VSYNC_VFR         2 | ||||
| #define VSYNC_VSCFR       0xfe | ||||
| #define VSYNC_DROP        0xff | ||||
| 
 | ||||
| #define MAX_STREAMS 1024    /* arbitrary sanity check value */ | ||||
| 
 | ||||
| enum HWAccelID { | ||||
|     HWACCEL_NONE = 0, | ||||
|     HWACCEL_AUTO, | ||||
|     HWACCEL_VDPAU, | ||||
|     HWACCEL_DXVA2, | ||||
|     HWACCEL_VDA, | ||||
|     HWACCEL_VIDEOTOOLBOX, | ||||
|     HWACCEL_QSV, | ||||
| }; | ||||
| 
 | ||||
| typedef struct HWAccel { | ||||
|     const char *name; | ||||
|     int (*init)(AVCodecContext *s); | ||||
|     enum HWAccelID id; | ||||
|     enum AVPixelFormat pix_fmt; | ||||
| } HWAccel; | ||||
| 
 | ||||
| /* select an input stream for an output stream */ | ||||
| typedef struct StreamMap { | ||||
|     int disabled;           /* 1 is this mapping is disabled by a negative map */ | ||||
|     int file_index; | ||||
|     int stream_index; | ||||
|     int sync_file_index; | ||||
|     int sync_stream_index; | ||||
|     char *linklabel;       /* name of an output link, for mapping lavfi outputs */ | ||||
| } StreamMap; | ||||
| 
 | ||||
| typedef struct { | ||||
|     int  file_idx,  stream_idx,  channel_idx; // input
 | ||||
|     int ofile_idx, ostream_idx;               // output
 | ||||
| } AudioChannelMap; | ||||
| 
 | ||||
| typedef struct OptionsContext { | ||||
|     OptionGroup *g; | ||||
| 
 | ||||
|     /* input/output options */ | ||||
|     int64_t start_time; | ||||
|     int64_t start_time_eof; | ||||
|     int seek_timestamp; | ||||
|     const char *format; | ||||
| 
 | ||||
|     SpecifierOpt *codec_names; | ||||
|     int        nb_codec_names; | ||||
|     SpecifierOpt *audio_channels; | ||||
|     int        nb_audio_channels; | ||||
|     SpecifierOpt *audio_sample_rate; | ||||
|     int        nb_audio_sample_rate; | ||||
|     SpecifierOpt *frame_rates; | ||||
|     int        nb_frame_rates; | ||||
|     SpecifierOpt *frame_sizes; | ||||
|     int        nb_frame_sizes; | ||||
|     SpecifierOpt *frame_pix_fmts; | ||||
|     int        nb_frame_pix_fmts; | ||||
| 
 | ||||
|     /* input options */ | ||||
|     int64_t input_ts_offset; | ||||
|     int loop; | ||||
|     int rate_emu; | ||||
|     int accurate_seek; | ||||
|     int thread_queue_size; | ||||
| 
 | ||||
|     SpecifierOpt *ts_scale; | ||||
|     int        nb_ts_scale; | ||||
|     SpecifierOpt *dump_attachment; | ||||
|     int        nb_dump_attachment; | ||||
|     SpecifierOpt *hwaccels; | ||||
|     int        nb_hwaccels; | ||||
|     SpecifierOpt *hwaccel_devices; | ||||
|     int        nb_hwaccel_devices; | ||||
|     SpecifierOpt *autorotate; | ||||
|     int        nb_autorotate; | ||||
| 
 | ||||
|     /* output options */ | ||||
|     StreamMap *stream_maps; | ||||
|     int     nb_stream_maps; | ||||
|     AudioChannelMap *audio_channel_maps; /* one info entry per -map_channel */ | ||||
|     int           nb_audio_channel_maps; /* number of (valid) -map_channel settings */ | ||||
|     int metadata_global_manual; | ||||
|     int metadata_streams_manual; | ||||
|     int metadata_chapters_manual; | ||||
|     const char **attachments; | ||||
|     int       nb_attachments; | ||||
| 
 | ||||
|     int chapters_input_file; | ||||
| 
 | ||||
|     int64_t recording_time; | ||||
|     int64_t stop_time; | ||||
|     uint64_t limit_filesize; | ||||
|     float mux_preload; | ||||
|     float mux_max_delay; | ||||
|     int shortest; | ||||
| 
 | ||||
|     int video_disable; | ||||
|     int audio_disable; | ||||
|     int subtitle_disable; | ||||
|     int data_disable; | ||||
| 
 | ||||
|     /* indexed by output file stream index */ | ||||
|     int   *streamid_map; | ||||
|     int nb_streamid_map; | ||||
| 
 | ||||
|     SpecifierOpt *metadata; | ||||
|     int        nb_metadata; | ||||
|     SpecifierOpt *max_frames; | ||||
|     int        nb_max_frames; | ||||
|     SpecifierOpt *bitstream_filters; | ||||
|     int        nb_bitstream_filters; | ||||
|     SpecifierOpt *codec_tags; | ||||
|     int        nb_codec_tags; | ||||
|     SpecifierOpt *sample_fmts; | ||||
|     int        nb_sample_fmts; | ||||
|     SpecifierOpt *qscale; | ||||
|     int        nb_qscale; | ||||
|     SpecifierOpt *forced_key_frames; | ||||
|     int        nb_forced_key_frames; | ||||
|     SpecifierOpt *force_fps; | ||||
|     int        nb_force_fps; | ||||
|     SpecifierOpt *frame_aspect_ratios; | ||||
|     int        nb_frame_aspect_ratios; | ||||
|     SpecifierOpt *rc_overrides; | ||||
|     int        nb_rc_overrides; | ||||
|     SpecifierOpt *intra_matrices; | ||||
|     int        nb_intra_matrices; | ||||
|     SpecifierOpt *inter_matrices; | ||||
|     int        nb_inter_matrices; | ||||
|     SpecifierOpt *chroma_intra_matrices; | ||||
|     int        nb_chroma_intra_matrices; | ||||
|     SpecifierOpt *top_field_first; | ||||
|     int        nb_top_field_first; | ||||
|     SpecifierOpt *metadata_map; | ||||
|     int        nb_metadata_map; | ||||
|     SpecifierOpt *presets; | ||||
|     int        nb_presets; | ||||
|     SpecifierOpt *copy_initial_nonkeyframes; | ||||
|     int        nb_copy_initial_nonkeyframes; | ||||
|     SpecifierOpt *copy_prior_start; | ||||
|     int        nb_copy_prior_start; | ||||
|     SpecifierOpt *filters; | ||||
|     int        nb_filters; | ||||
|     SpecifierOpt *filter_scripts; | ||||
|     int        nb_filter_scripts; | ||||
|     SpecifierOpt *reinit_filters; | ||||
|     int        nb_reinit_filters; | ||||
|     SpecifierOpt *fix_sub_duration; | ||||
|     int        nb_fix_sub_duration; | ||||
|     SpecifierOpt *canvas_sizes; | ||||
|     int        nb_canvas_sizes; | ||||
|     SpecifierOpt *pass; | ||||
|     int        nb_pass; | ||||
|     SpecifierOpt *passlogfiles; | ||||
|     int        nb_passlogfiles; | ||||
|     SpecifierOpt *guess_layout_max; | ||||
|     int        nb_guess_layout_max; | ||||
|     SpecifierOpt *apad; | ||||
|     int        nb_apad; | ||||
|     SpecifierOpt *discard; | ||||
|     int        nb_discard; | ||||
|     SpecifierOpt *disposition; | ||||
|     int        nb_disposition; | ||||
|     SpecifierOpt *program; | ||||
|     int        nb_program; | ||||
| } OptionsContext; | ||||
| 
 | ||||
| typedef struct InputFilter { | ||||
|     AVFilterContext    *filter; | ||||
|     struct InputStream *ist; | ||||
|     struct FilterGraph *graph; | ||||
|     uint8_t            *name; | ||||
| } InputFilter; | ||||
| 
 | ||||
| typedef struct OutputFilter { | ||||
|     AVFilterContext     *filter; | ||||
|     struct OutputStream *ost; | ||||
|     struct FilterGraph  *graph; | ||||
|     uint8_t             *name; | ||||
| 
 | ||||
|     /* temporary storage until stream maps are processed */ | ||||
|     AVFilterInOut       *out_tmp; | ||||
|     enum AVMediaType     type; | ||||
| } OutputFilter; | ||||
| 
 | ||||
| typedef struct FilterGraph { | ||||
|     int            index; | ||||
|     const char    *graph_desc; | ||||
| 
 | ||||
|     AVFilterGraph *graph; | ||||
|     int reconfiguration; | ||||
| 
 | ||||
|     InputFilter   **inputs; | ||||
|     int          nb_inputs; | ||||
|     OutputFilter **outputs; | ||||
|     int         nb_outputs; | ||||
| } FilterGraph; | ||||
| 
 | ||||
| typedef struct InputStream { | ||||
|     int file_index; | ||||
|     AVStream *st; | ||||
|     int discard;             /* true if stream data should be discarded */ | ||||
|     int user_set_discard; | ||||
|     int decoding_needed;     /* non zero if the packets must be decoded in 'raw_fifo', see DECODING_FOR_* */ | ||||
| #define DECODING_FOR_OST    1 | ||||
| #define DECODING_FOR_FILTER 2 | ||||
| 
 | ||||
|     AVCodecContext *dec_ctx; | ||||
|     AVCodec *dec; | ||||
|     AVFrame *decoded_frame; | ||||
|     AVFrame *filter_frame; /* a ref of decoded_frame, to be sent to filters */ | ||||
| 
 | ||||
|     int64_t       start;     /* time when read started */ | ||||
|     /* predicted dts of the next packet read for this stream or (when there are
 | ||||
|      * several frames in a packet) of the next frame in current packet (in AV_TIME_BASE units) */ | ||||
|     int64_t       next_dts; | ||||
|     int64_t       dts;       ///< dts of the last packet read for this stream (in AV_TIME_BASE units)
 | ||||
| 
 | ||||
|     int64_t       next_pts;  ///< synthetic pts for the next decode frame (in AV_TIME_BASE units)
 | ||||
|     int64_t       pts;       ///< current pts of the decoded frame  (in AV_TIME_BASE units)
 | ||||
|     int           wrap_correction_done; | ||||
| 
 | ||||
|     int64_t filter_in_rescale_delta_last; | ||||
| 
 | ||||
|     int64_t min_pts; /* pts with the smallest value in a current stream */ | ||||
|     int64_t max_pts; /* pts with the higher value in a current stream */ | ||||
|     int64_t nb_samples; /* number of samples in the last decoded audio frame before looping */ | ||||
| 
 | ||||
|     double ts_scale; | ||||
|     int saw_first_ts; | ||||
|     int showed_multi_packet_warning; | ||||
|     AVDictionary *decoder_opts; | ||||
|     AVRational framerate;               /* framerate forced with -r */ | ||||
|     int top_field_first; | ||||
|     int guess_layout_max; | ||||
| 
 | ||||
|     int autorotate; | ||||
|     int resample_height; | ||||
|     int resample_width; | ||||
|     int resample_pix_fmt; | ||||
| 
 | ||||
|     int      resample_sample_fmt; | ||||
|     int      resample_sample_rate; | ||||
|     int      resample_channels; | ||||
|     uint64_t resample_channel_layout; | ||||
| 
 | ||||
|     int fix_sub_duration; | ||||
|     struct { /* previous decoded subtitle and related variables */ | ||||
|         int got_output; | ||||
|         int ret; | ||||
|         AVSubtitle subtitle; | ||||
|     } prev_sub; | ||||
| 
 | ||||
|     struct sub2video { | ||||
|         int64_t last_pts; | ||||
|         int64_t end_pts; | ||||
|         AVFrame *frame; | ||||
|         int w, h; | ||||
|     } sub2video; | ||||
| 
 | ||||
|     int dr1; | ||||
| 
 | ||||
|     /* decoded data from this stream goes into all those filters
 | ||||
|      * currently video and audio only */ | ||||
|     InputFilter **filters; | ||||
|     int        nb_filters; | ||||
| 
 | ||||
|     int reinit_filters; | ||||
| 
 | ||||
|     /* hwaccel options */ | ||||
|     enum HWAccelID hwaccel_id; | ||||
|     char  *hwaccel_device; | ||||
| 
 | ||||
|     /* hwaccel context */ | ||||
|     enum HWAccelID active_hwaccel_id; | ||||
|     void  *hwaccel_ctx; | ||||
|     void (*hwaccel_uninit)(AVCodecContext *s); | ||||
|     int  (*hwaccel_get_buffer)(AVCodecContext *s, AVFrame *frame, int flags); | ||||
|     int  (*hwaccel_retrieve_data)(AVCodecContext *s, AVFrame *frame); | ||||
|     enum AVPixelFormat hwaccel_pix_fmt; | ||||
|     enum AVPixelFormat hwaccel_retrieved_pix_fmt; | ||||
| 
 | ||||
|     /* stats */ | ||||
|     // combined size of all the packets read
 | ||||
|     uint64_t data_size; | ||||
|     /* number of packets successfully read for this stream */ | ||||
|     uint64_t nb_packets; | ||||
|     // number of frames/samples retrieved from the decoder
 | ||||
|     uint64_t frames_decoded; | ||||
|     uint64_t samples_decoded; | ||||
| } InputStream; | ||||
| 
 | ||||
| typedef struct InputFile { | ||||
|     AVFormatContext *ctx; | ||||
|     int eof_reached;      /* true if eof reached */ | ||||
|     int eagain;           /* true if last read attempt returned EAGAIN */ | ||||
|     int ist_index;        /* index of first stream in input_streams */ | ||||
|     int loop;             /* set number of times input stream should be looped */ | ||||
|     int64_t duration;     /* actual duration of the longest stream in a file
 | ||||
|                              at the moment when looping happens */ | ||||
|     AVRational time_base; /* time base of the duration */ | ||||
|     int64_t input_ts_offset; | ||||
| 
 | ||||
|     int64_t ts_offset; | ||||
|     int64_t last_ts; | ||||
|     int64_t start_time;   /* user-specified start time in AV_TIME_BASE or AV_NOPTS_VALUE */ | ||||
|     int seek_timestamp; | ||||
|     int64_t recording_time; | ||||
|     int nb_streams;       /* number of stream that ffmpeg is aware of; may be different
 | ||||
|                              from ctx.nb_streams if new streams appear during av_read_frame() */ | ||||
|     int nb_streams_warn;  /* number of streams that the user was warned of */ | ||||
|     int rate_emu; | ||||
|     int accurate_seek; | ||||
| 
 | ||||
| #if HAVE_PTHREADS | ||||
|     AVThreadMessageQueue *in_thread_queue; | ||||
|     pthread_t thread;           /* thread reading from this file */ | ||||
|     int non_blocking;           /* reading packets from the thread should not block */ | ||||
|     int joined;                 /* the thread has been joined */ | ||||
|     int thread_queue_size;      /* maximum number of queued packets */ | ||||
| #endif | ||||
| } InputFile; | ||||
| 
 | ||||
| enum forced_keyframes_const { | ||||
|     FKF_N, | ||||
|     FKF_N_FORCED, | ||||
|     FKF_PREV_FORCED_N, | ||||
|     FKF_PREV_FORCED_T, | ||||
|     FKF_T, | ||||
|     FKF_NB | ||||
| }; | ||||
| 
 | ||||
| #define ABORT_ON_FLAG_EMPTY_OUTPUT (1 <<  0) | ||||
| 
 | ||||
| extern const char *const forced_keyframes_const_names[]; | ||||
| 
 | ||||
| typedef enum { | ||||
|     ENCODER_FINISHED = 1, | ||||
|     MUXER_FINISHED = 2, | ||||
| } OSTFinished ; | ||||
| 
 | ||||
| typedef struct OutputStream { | ||||
|     int file_index;          /* file index */ | ||||
|     int index;               /* stream index in the output file */ | ||||
|     int source_index;        /* InputStream index */ | ||||
|     AVStream *st;            /* stream in the output file */ | ||||
|     int encoding_needed;     /* true if encoding needed for this stream */ | ||||
|     int frame_number; | ||||
|     /* input pts and corresponding output pts
 | ||||
|        for A/V sync */ | ||||
|     struct InputStream *sync_ist; /* input stream to sync against */ | ||||
|     int64_t sync_opts;       /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
 | ||||
|     /* pts of the first frame encoded for this stream, used for limiting
 | ||||
|      * recording time */ | ||||
|     int64_t first_pts; | ||||
|     /* dts of the last packet sent to the muxer */ | ||||
|     int64_t last_mux_dts; | ||||
|     AVBitStreamFilterContext *bitstream_filters; | ||||
|     AVCodecContext *enc_ctx; | ||||
|     AVCodec *enc; | ||||
|     int64_t max_frames; | ||||
|     AVFrame *filtered_frame; | ||||
|     AVFrame *last_frame; | ||||
|     int last_dropped; | ||||
|     int last_nb0_frames[3]; | ||||
| 
 | ||||
|     void  *hwaccel_ctx; | ||||
| 
 | ||||
|     /* video only */ | ||||
|     AVRational frame_rate; | ||||
|     int is_cfr; | ||||
|     int force_fps; | ||||
|     int top_field_first; | ||||
|     int rotate_overridden; | ||||
| 
 | ||||
|     AVRational frame_aspect_ratio; | ||||
| 
 | ||||
|     /* forced key frames */ | ||||
|     int64_t *forced_kf_pts; | ||||
|     int forced_kf_count; | ||||
|     int forced_kf_index; | ||||
|     char *forced_keyframes; | ||||
|     AVExpr *forced_keyframes_pexpr; | ||||
|     double forced_keyframes_expr_const_values[FKF_NB]; | ||||
| 
 | ||||
|     /* audio only */ | ||||
|     int *audio_channels_map;             /* list of the channels id to pick from the source stream */ | ||||
|     int audio_channels_mapped;           /* number of channels in audio_channels_map */ | ||||
| 
 | ||||
|     char *logfile_prefix; | ||||
|     FILE *logfile; | ||||
| 
 | ||||
|     OutputFilter *filter; | ||||
|     char *avfilter; | ||||
|     char *filters;         ///< filtergraph associated to the -filter option
 | ||||
|     char *filters_script;  ///< filtergraph script associated to the -filter_script option
 | ||||
| 
 | ||||
|     AVDictionary *encoder_opts; | ||||
|     AVDictionary *sws_dict; | ||||
|     AVDictionary *swr_opts; | ||||
|     AVDictionary *resample_opts; | ||||
|     char *apad; | ||||
|     OSTFinished finished;        /* no more packets should be written for this stream */ | ||||
|     int unavailable;                     /* true if the steram is unavailable (possibly temporarily) */ | ||||
|     int stream_copy; | ||||
|     const char *attachment_filename; | ||||
|     int copy_initial_nonkeyframes; | ||||
|     int copy_prior_start; | ||||
|     char *disposition; | ||||
| 
 | ||||
|     int keep_pix_fmt; | ||||
| 
 | ||||
|     AVCodecParserContext *parser; | ||||
| 
 | ||||
|     /* stats */ | ||||
|     // combined size of all the packets written
 | ||||
|     uint64_t data_size; | ||||
|     // number of packets send to the muxer
 | ||||
|     uint64_t packets_written; | ||||
|     // number of frames/samples sent to the encoder
 | ||||
|     uint64_t frames_encoded; | ||||
|     uint64_t samples_encoded; | ||||
| 
 | ||||
|     /* packet quality factor */ | ||||
|     int quality; | ||||
| 
 | ||||
|     /* packet picture type */ | ||||
|     int pict_type; | ||||
| 
 | ||||
|     /* frame encode sum of squared error values */ | ||||
|     int64_t error[4]; | ||||
| } OutputStream; | ||||
| 
 | ||||
| typedef struct OutputFile { | ||||
|     AVFormatContext *ctx; | ||||
|     AVDictionary *opts; | ||||
|     int ost_index;       /* index of the first stream in output_streams */ | ||||
|     int64_t recording_time;  ///< desired length of the resulting file in microseconds == AV_TIME_BASE units
 | ||||
|     int64_t start_time;      ///< start time in microseconds == AV_TIME_BASE units
 | ||||
|     uint64_t limit_filesize; /* filesize limit expressed in bytes */ | ||||
| 
 | ||||
|     int shortest; | ||||
| } OutputFile; | ||||
| 
 | ||||
| extern InputStream **input_streams; | ||||
| extern int        nb_input_streams; | ||||
| extern InputFile   **input_files; | ||||
| extern int        nb_input_files; | ||||
| 
 | ||||
| extern OutputStream **output_streams; | ||||
| extern int         nb_output_streams; | ||||
| extern OutputFile   **output_files; | ||||
| extern int         nb_output_files; | ||||
| 
 | ||||
| extern FilterGraph **filtergraphs; | ||||
| extern int        nb_filtergraphs; | ||||
| 
 | ||||
| extern char *vstats_filename; | ||||
| extern char *sdp_filename; | ||||
| 
 | ||||
| extern float audio_drift_threshold; | ||||
| extern float dts_delta_threshold; | ||||
| extern float dts_error_threshold; | ||||
| 
 | ||||
| extern int audio_volume; | ||||
| extern int audio_sync_method; | ||||
| extern int video_sync_method; | ||||
| extern float frame_drop_threshold; | ||||
| extern int do_benchmark; | ||||
| extern int do_benchmark_all; | ||||
| extern int do_deinterlace; | ||||
| extern int do_hex_dump; | ||||
| extern int do_pkt_dump; | ||||
| extern int copy_ts; | ||||
| extern int start_at_zero; | ||||
| extern int copy_tb; | ||||
| extern int debug_ts; | ||||
| extern int exit_on_error; | ||||
| extern int abort_on_flags; | ||||
| extern int print_stats; | ||||
| extern int qp_hist; | ||||
| extern int stdin_interaction; | ||||
| extern int frame_bits_per_raw_sample; | ||||
| extern AVIOContext *progress_avio; | ||||
| extern float max_error_rate; | ||||
| extern int vdpau_api_ver; | ||||
| extern char *videotoolbox_pixfmt; | ||||
| 
 | ||||
| extern const AVIOInterruptCB int_cb; | ||||
| 
 | ||||
| extern const OptionDef options[]; | ||||
| extern const HWAccel hwaccels[]; | ||||
| 
 | ||||
| 
 | ||||
| void term_init(void); | ||||
| void term_exit(void); | ||||
| 
 | ||||
| void reset_options(OptionsContext *o, int is_input); | ||||
| void show_usage(void); | ||||
| 
 | ||||
| void opt_output_file(void *optctx, const char *filename); | ||||
| 
 | ||||
| void remove_avoptions(AVDictionary **a, AVDictionary *b); | ||||
| void assert_avoptions(AVDictionary *m); | ||||
| 
 | ||||
| int guess_input_channel_layout(InputStream *ist); | ||||
| 
 | ||||
| enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *avctx, AVCodec *codec, enum AVPixelFormat target); | ||||
| void choose_sample_fmt(AVStream *st, AVCodec *codec); | ||||
| 
 | ||||
| int configure_filtergraph(FilterGraph *fg); | ||||
| int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out); | ||||
| int ist_in_filtergraph(FilterGraph *fg, InputStream *ist); | ||||
| FilterGraph *init_simple_filtergraph(InputStream *ist, OutputStream *ost); | ||||
| int init_complex_filtergraph(FilterGraph *fg); | ||||
| 
 | ||||
| int ffmpeg_parse_options(int argc, char **argv); | ||||
| 
 | ||||
| int vdpau_init(AVCodecContext *s); | ||||
| int dxva2_init(AVCodecContext *s); | ||||
| int vda_init(AVCodecContext *s); | ||||
| int videotoolbox_init(AVCodecContext *s); | ||||
| int qsv_init(AVCodecContext *s); | ||||
| int qsv_transcode_init(OutputStream *ost); | ||||
| 
 | ||||
| int run(int argc, char **argv); | ||||
| 
 | ||||
| #endif /* FFMPEG_H */ | ||||
| @ -0,0 +1,25 @@ | ||||
| #include <jni.h> | ||||
| #include "ffmpeg.h" | ||||
| 
 | ||||
| JNIEXPORT jint JNICALL Java_com_frank_ffmpeg_FFmpegCmd_handle | ||||
| (JNIEnv *env, jclass obj, jobjectArray commands){ | ||||
|     int argc = (*env)->GetArrayLength(env, commands); | ||||
|     char **argv = (char**)malloc(argc * sizeof(char*)); | ||||
|     int i; | ||||
|     int result; | ||||
|     for (i = 0; i < argc; i++) { | ||||
|         jstring jstr = (jstring) (*env)->GetObjectArrayElement(env, commands, i); | ||||
|         char* temp = (char*) (*env)->GetStringUTFChars(env, jstr, 0); | ||||
|         argv[i] = malloc(1024); | ||||
|         strcpy(argv[i], temp); | ||||
|         (*env)->ReleaseStringUTFChars(env, jstr, temp); | ||||
|     } | ||||
|     //执行ffmpeg命令
 | ||||
|     result =  run(argc, argv); | ||||
|     //释放内存
 | ||||
|     for (i = 0; i < argc; i++) { | ||||
|         free(argv[i]); | ||||
|     } | ||||
|     free(argv); | ||||
|     return result; | ||||
| } | ||||
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						| @ -0,0 +1,34 @@ | ||||
| /*
 | ||||
|  * MSVC Compatible va_copy macro | ||||
|  * Copyright (c) 2012 Derek Buitenhuis | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * FFmpeg is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with FFmpeg; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
|  */ | ||||
| 
 | ||||
| #ifndef COMPAT_VA_COPY_H | ||||
| #define COMPAT_VA_COPY_H | ||||
| 
 | ||||
| #include <stdarg.h> | ||||
| 
 | ||||
| #if !defined(va_copy) && defined(_MSC_VER) | ||||
| #define va_copy(dst, src) ((dst) = (src)) | ||||
| #endif | ||||
| #if !defined(va_copy) && defined(__GNUC__) && __GNUC__ < 3 | ||||
| #define va_copy(dst, src) __va_copy(dst, src) | ||||
| #endif | ||||
| 
 | ||||
| #endif /* COMPAT_VA_COPY_H */ | ||||
| @ -0,0 +1,108 @@ | ||||
| /*
 | ||||
|  * simple math operations | ||||
|  * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al | ||||
|  * | ||||
|  * 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_ARM_MATHOPS_H | ||||
| #define AVCODEC_ARM_MATHOPS_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include "config.h" | ||||
| #include "libavutil/common.h" | ||||
| 
 | ||||
| #if HAVE_INLINE_ASM | ||||
| 
 | ||||
| #if HAVE_ARMV6_INLINE | ||||
| #define MULH MULH | ||||
| static inline av_const int MULH(int a, int b) | ||||
| { | ||||
|     int r; | ||||
|     __asm__ ("smmul %0, %1, %2" : "=r"(r) : "r"(a), "r"(b)); | ||||
|     return r; | ||||
| } | ||||
| 
 | ||||
| #define FASTDIV FASTDIV | ||||
| static av_always_inline av_const int FASTDIV(int a, int b) | ||||
| { | ||||
|     int r; | ||||
|     __asm__ ("cmp     %2, #2               \n\t" | ||||
|              "ldr     %0, [%3, %2, lsl #2] \n\t" | ||||
|              "ite     le                   \n\t" | ||||
|              "lsrle   %0, %1, #1           \n\t" | ||||
|              "smmulgt %0, %0, %1           \n\t" | ||||
|              : "=&r"(r) : "r"(a), "r"(b), "r"(ff_inverse) : "cc"); | ||||
|     return r; | ||||
| } | ||||
| 
 | ||||
| #else /* HAVE_ARMV6_INLINE */ | ||||
| 
 | ||||
| #define FASTDIV FASTDIV | ||||
| static av_always_inline av_const int FASTDIV(int a, int b) | ||||
| { | ||||
|     int r, t; | ||||
|     __asm__ ("umull %1, %0, %2, %3" | ||||
|              : "=&r"(r), "=&r"(t) : "r"(a), "r"(ff_inverse[b])); | ||||
|     return r; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #define MLS64(d, a, b) MAC64(d, -(a), b) | ||||
| 
 | ||||
| #if HAVE_ARMV5TE_INLINE | ||||
| 
 | ||||
| /* signed 16x16 -> 32 multiply add accumulate */ | ||||
| #   define MAC16(rt, ra, rb)                                            \ | ||||
|     __asm__ ("smlabb %0, %1, %2, %0" : "+r"(rt) : "r"(ra), "r"(rb)); | ||||
| 
 | ||||
| /* signed 16x16 -> 32 multiply */ | ||||
| #   define MUL16 MUL16 | ||||
| static inline av_const int MUL16(int ra, int rb) | ||||
| { | ||||
|     int rt; | ||||
|     __asm__ ("smulbb %0, %1, %2" : "=r"(rt) : "r"(ra), "r"(rb)); | ||||
|     return rt; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #define mid_pred mid_pred | ||||
| static inline av_const int mid_pred(int a, int b, int c) | ||||
| { | ||||
|     int m; | ||||
|     __asm__ ( | ||||
|         "mov   %0, %2  \n\t" | ||||
|         "cmp   %1, %2  \n\t" | ||||
|         "itt   gt      \n\t" | ||||
|         "movgt %0, %1  \n\t" | ||||
|         "movgt %1, %2  \n\t" | ||||
|         "cmp   %1, %3  \n\t" | ||||
|         "it    le      \n\t" | ||||
|         "movle %1, %3  \n\t" | ||||
|         "cmp   %0, %1  \n\t" | ||||
|         "it    gt      \n\t" | ||||
|         "movgt %0, %1  \n\t" | ||||
|         : "=&r"(m), "+r"(a) | ||||
|         : "r"(b), "r"(c) | ||||
|         : "cc"); | ||||
|     return m; | ||||
| } | ||||
| 
 | ||||
| #endif /* HAVE_INLINE_ASM */ | ||||
| 
 | ||||
| #endif /* AVCODEC_ARM_MATHOPS_H */ | ||||
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						| @ -0,0 +1,84 @@ | ||||
| /*
 | ||||
|  * 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_AVDCT_H | ||||
| #define AVCODEC_AVDCT_H | ||||
| 
 | ||||
| #include "libavutil/opt.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * AVDCT context. | ||||
|  * @note function pointers can be NULL if the specific features have been | ||||
|  *       disabled at build time. | ||||
|  */ | ||||
| typedef struct AVDCT { | ||||
|     const AVClass *av_class; | ||||
| 
 | ||||
|     void (*idct)(int16_t *block /* align 16 */); | ||||
| 
 | ||||
|     /**
 | ||||
|      * IDCT input permutation. | ||||
|      * Several optimized IDCTs need a permutated input (relative to the | ||||
|      * normal order of the reference IDCT). | ||||
|      * This permutation must be performed before the idct_put/add. | ||||
|      * Note, normally this can be merged with the zigzag/alternate scan<br> | ||||
|      * An example to avoid confusion: | ||||
|      * - (->decode coeffs -> zigzag reorder -> dequant -> reference IDCT -> ...) | ||||
|      * - (x -> reference DCT -> reference IDCT -> x) | ||||
|      * - (x -> reference DCT -> simple_mmx_perm = idct_permutation | ||||
|      *    -> simple_idct_mmx -> x) | ||||
|      * - (-> decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant | ||||
|      *    -> simple_idct_mmx -> ...) | ||||
|      */ | ||||
|     uint8_t idct_permutation[64]; | ||||
| 
 | ||||
|     void (*fdct)(int16_t *block /* align 16 */); | ||||
| 
 | ||||
| 
 | ||||
|     /**
 | ||||
|      * DCT algorithm. | ||||
|      * must use AVOptions to set this field. | ||||
|      */ | ||||
|     int dct_algo; | ||||
| 
 | ||||
|     /**
 | ||||
|      * IDCT algorithm. | ||||
|      * must use AVOptions to set this field. | ||||
|      */ | ||||
|     int idct_algo; | ||||
| 
 | ||||
|     void (*get_pixels)(int16_t *block /* align 16 */, | ||||
|                        const uint8_t *pixels /* align 8 */, | ||||
|                        ptrdiff_t line_size); | ||||
| 
 | ||||
|     int bits_per_sample; | ||||
| } AVDCT; | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocates a AVDCT context. | ||||
|  * This needs to be initialized with avcodec_dct_init() after optionally | ||||
|  * configuring it with AVOptions. | ||||
|  * | ||||
|  * To free it use av_free() | ||||
|  */ | ||||
| AVDCT *avcodec_dct_alloc(void); | ||||
| int avcodec_dct_init(AVDCT *); | ||||
| 
 | ||||
| const AVClass *avcodec_dct_get_class(void); | ||||
| 
 | ||||
| #endif /* AVCODEC_AVDCT_H */ | ||||
| @ -0,0 +1,118 @@ | ||||
| /*
 | ||||
|  * 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_AVFFT_H | ||||
| #define AVCODEC_AVFFT_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup lavc_fft | ||||
|  * FFT functions | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavc_fft FFT functions | ||||
|  * @ingroup lavc_misc | ||||
|  * | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| typedef float FFTSample; | ||||
| 
 | ||||
| typedef struct FFTComplex { | ||||
|     FFTSample re, im; | ||||
| } FFTComplex; | ||||
| 
 | ||||
| typedef struct FFTContext FFTContext; | ||||
| 
 | ||||
| /**
 | ||||
|  * Set up a complex FFT. | ||||
|  * @param nbits           log2 of the length of the input array | ||||
|  * @param inverse         if 0 perform the forward transform, if 1 perform the inverse | ||||
|  */ | ||||
| FFTContext *av_fft_init(int nbits, int inverse); | ||||
| 
 | ||||
| /**
 | ||||
|  * Do the permutation needed BEFORE calling ff_fft_calc(). | ||||
|  */ | ||||
| void av_fft_permute(FFTContext *s, FFTComplex *z); | ||||
| 
 | ||||
| /**
 | ||||
|  * Do a complex FFT with the parameters defined in av_fft_init(). The | ||||
|  * input data must be permuted before. No 1.0/sqrt(n) normalization is done. | ||||
|  */ | ||||
| void av_fft_calc(FFTContext *s, FFTComplex *z); | ||||
| 
 | ||||
| void av_fft_end(FFTContext *s); | ||||
| 
 | ||||
| FFTContext *av_mdct_init(int nbits, int inverse, double scale); | ||||
| void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); | ||||
| void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input); | ||||
| void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); | ||||
| void av_mdct_end(FFTContext *s); | ||||
| 
 | ||||
| /* Real Discrete Fourier Transform */ | ||||
| 
 | ||||
| enum RDFTransformType { | ||||
|     DFT_R2C, | ||||
|     IDFT_C2R, | ||||
|     IDFT_R2C, | ||||
|     DFT_C2R, | ||||
| }; | ||||
| 
 | ||||
| typedef struct RDFTContext RDFTContext; | ||||
| 
 | ||||
| /**
 | ||||
|  * Set up a real FFT. | ||||
|  * @param nbits           log2 of the length of the input array | ||||
|  * @param trans           the type of transform | ||||
|  */ | ||||
| RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans); | ||||
| void av_rdft_calc(RDFTContext *s, FFTSample *data); | ||||
| void av_rdft_end(RDFTContext *s); | ||||
| 
 | ||||
| /* Discrete Cosine Transform */ | ||||
| 
 | ||||
| typedef struct DCTContext DCTContext; | ||||
| 
 | ||||
| enum DCTTransformType { | ||||
|     DCT_II = 0, | ||||
|     DCT_III, | ||||
|     DCT_I, | ||||
|     DST_I, | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Set up DCT. | ||||
|  * | ||||
|  * @param nbits           size of the input array: | ||||
|  *                        (1 << nbits)     for DCT-II, DCT-III and DST-I | ||||
|  *                        (1 << nbits) + 1 for DCT-I | ||||
|  * @param type            the type of transform | ||||
|  * | ||||
|  * @note the first element of the input of DST-I is ignored | ||||
|  */ | ||||
| DCTContext *av_dct_init(int nbits, enum DCTTransformType type); | ||||
| void av_dct_calc(DCTContext *s, FFTSample *data); | ||||
| void av_dct_end (DCTContext *s); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVCODEC_AVFFT_H */ | ||||
| @ -0,0 +1,112 @@ | ||||
| /*
 | ||||
|  * Direct3D11 HW acceleration | ||||
|  * | ||||
|  * copyright (c) 2009 Laurent Aimar | ||||
|  * copyright (c) 2015 Steve Lhomme | ||||
|  * | ||||
|  * 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_D3D11VA_H | ||||
| #define AVCODEC_D3D11VA_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup lavc_codec_hwaccel_d3d11va | ||||
|  * Public libavcodec D3D11VA header. | ||||
|  */ | ||||
| 
 | ||||
| #if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602 | ||||
| #undef _WIN32_WINNT | ||||
| #define _WIN32_WINNT 0x0602 | ||||
| #endif | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <d3d11.h> | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavc_codec_hwaccel_d3d11va Direct3D11 | ||||
|  * @ingroup lavc_codec_hwaccel | ||||
|  * | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| #define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for Direct3D11 and old UVD/UVD+ ATI video cards
 | ||||
| #define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO    2 ///< Work around for Direct3D11 and old Intel GPUs with ClearVideo interface
 | ||||
| 
 | ||||
| /**
 | ||||
|  * This structure is used to provides the necessary configurations and data | ||||
|  * to the Direct3D11 FFmpeg HWAccel implementation. | ||||
|  * | ||||
|  * The application must make it available as AVCodecContext.hwaccel_context. | ||||
|  * | ||||
|  * Use av_d3d11va_alloc_context() exclusively to allocate an AVD3D11VAContext. | ||||
|  */ | ||||
| typedef struct AVD3D11VAContext { | ||||
|     /**
 | ||||
|      * D3D11 decoder object | ||||
|      */ | ||||
|     ID3D11VideoDecoder *decoder; | ||||
| 
 | ||||
|     /**
 | ||||
|       * D3D11 VideoContext | ||||
|       */ | ||||
|     ID3D11VideoContext *video_context; | ||||
| 
 | ||||
|     /**
 | ||||
|      * D3D11 configuration used to create the decoder | ||||
|      */ | ||||
|     D3D11_VIDEO_DECODER_CONFIG *cfg; | ||||
| 
 | ||||
|     /**
 | ||||
|      * The number of surface in the surface array | ||||
|      */ | ||||
|     unsigned surface_count; | ||||
| 
 | ||||
|     /**
 | ||||
|      * The array of Direct3D surfaces used to create the decoder | ||||
|      */ | ||||
|     ID3D11VideoDecoderOutputView **surface; | ||||
| 
 | ||||
|     /**
 | ||||
|      * A bit field configuring the workarounds needed for using the decoder | ||||
|      */ | ||||
|     uint64_t workaround; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Private to the FFmpeg AVHWAccel implementation | ||||
|      */ | ||||
|     unsigned report_id; | ||||
| 
 | ||||
|     /**
 | ||||
|       * Mutex to access video_context | ||||
|       */ | ||||
|     HANDLE  context_mutex; | ||||
| } AVD3D11VAContext; | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate an AVD3D11VAContext. | ||||
|  * | ||||
|  * @return Newly-allocated AVD3D11VAContext or NULL on failure. | ||||
|  */ | ||||
| AVD3D11VAContext *av_d3d11va_alloc_context(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVCODEC_D3D11VA_H */ | ||||
| @ -0,0 +1,131 @@ | ||||
| /*
 | ||||
|  * Copyright (C) 2007 Marco Gerards <marco@gnu.org> | ||||
|  * 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 <marco@gnu.org> | ||||
|  * @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 */ | ||||
| @ -0,0 +1,83 @@ | ||||
| /*
 | ||||
|  * 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_DV_PROFILE_H | ||||
| #define AVCODEC_DV_PROFILE_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "libavutil/pixfmt.h" | ||||
| #include "libavutil/rational.h" | ||||
| #include "avcodec.h" | ||||
| 
 | ||||
| /* minimum number of bytes to read from a DV stream in order to
 | ||||
|  * determine the profile */ | ||||
| #define DV_PROFILE_BYTES (6 * 80) /* 6 DIF blocks */ | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  * AVDVProfile is used to express the differences between various | ||||
|  * DV flavors. For now it's primarily used for differentiating | ||||
|  * 525/60 and 625/50, but the plans are to use it for various | ||||
|  * DV specs as well (e.g. SMPTE314M vs. IEC 61834). | ||||
|  */ | ||||
| typedef struct AVDVProfile { | ||||
|     int              dsf;                   /* value of the dsf in the DV header */ | ||||
|     int              video_stype;           /* stype for VAUX source pack */ | ||||
|     int              frame_size;            /* total size of one frame in bytes */ | ||||
|     int              difseg_size;           /* number of DIF segments per DIF channel */ | ||||
|     int              n_difchan;             /* number of DIF channels per frame */ | ||||
|     AVRational       time_base;             /* 1/framerate */ | ||||
|     int              ltc_divisor;           /* FPS from the LTS standpoint */ | ||||
|     int              height;                /* picture height in pixels */ | ||||
|     int              width;                 /* picture width in pixels */ | ||||
|     AVRational       sar[2];                /* sample aspect ratios for 4:3 and 16:9 */ | ||||
|     enum AVPixelFormat pix_fmt;             /* picture pixel format */ | ||||
|     int              bpm;                   /* blocks per macroblock */ | ||||
|     const uint8_t   *block_sizes;           /* AC block sizes, in bits */ | ||||
|     int              audio_stride;          /* size of audio_shuffle table */ | ||||
|     int              audio_min_samples[3];  /* min amount of audio samples */ | ||||
|                                             /* for 48kHz, 44.1kHz and 32kHz */ | ||||
|     int              audio_samples_dist[5]; /* how many samples are supposed to be */ | ||||
|                                             /* in each frame in a 5 frames window */ | ||||
|     const uint8_t  (*audio_shuffle)[9];     /* PCM shuffling table */ | ||||
| } AVDVProfile; | ||||
| 
 | ||||
| /**
 | ||||
|  * Get a DV profile for the provided compressed frame. | ||||
|  * | ||||
|  * @param sys the profile used for the previous frame, may be NULL | ||||
|  * @param frame the compressed data buffer | ||||
|  * @param buf_size size of the buffer in bytes | ||||
|  * @return the DV profile for the supplied data or NULL on failure | ||||
|  */ | ||||
| const AVDVProfile *av_dv_frame_profile(const AVDVProfile *sys, | ||||
|                                        const uint8_t *frame, unsigned buf_size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get a DV profile for the provided stream parameters. | ||||
|  */ | ||||
| const AVDVProfile *av_dv_codec_profile(int width, int height, enum AVPixelFormat pix_fmt); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get a DV profile for the provided stream parameters. | ||||
|  * The frame rate is used as a best-effort parameter. | ||||
|  */ | ||||
| const AVDVProfile *av_dv_codec_profile2(int width, int height, enum AVPixelFormat pix_fmt, AVRational frame_rate); | ||||
| 
 | ||||
| #endif /* AVCODEC_DV_PROFILE_H */ | ||||
| @ -0,0 +1,93 @@ | ||||
| /*
 | ||||
|  * DXVA2 HW acceleration | ||||
|  * | ||||
|  * copyright (c) 2009 Laurent Aimar | ||||
|  * | ||||
|  * 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_DXVA2_H | ||||
| #define AVCODEC_DXVA2_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup lavc_codec_hwaccel_dxva2 | ||||
|  * Public libavcodec DXVA2 header. | ||||
|  */ | ||||
| 
 | ||||
| #if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602 | ||||
| #undef _WIN32_WINNT | ||||
| #define _WIN32_WINNT 0x0602 | ||||
| #endif | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <d3d9.h> | ||||
| #include <dxva2api.h> | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavc_codec_hwaccel_dxva2 DXVA2 | ||||
|  * @ingroup lavc_codec_hwaccel | ||||
|  * | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| #define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards
 | ||||
| #define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO    2 ///< Work around for DXVA2 and old Intel GPUs with ClearVideo interface
 | ||||
| 
 | ||||
| /**
 | ||||
|  * This structure is used to provides the necessary configurations and data | ||||
|  * to the DXVA2 FFmpeg HWAccel implementation. | ||||
|  * | ||||
|  * The application must make it available as AVCodecContext.hwaccel_context. | ||||
|  */ | ||||
| struct dxva_context { | ||||
|     /**
 | ||||
|      * DXVA2 decoder object | ||||
|      */ | ||||
|     IDirectXVideoDecoder *decoder; | ||||
| 
 | ||||
|     /**
 | ||||
|      * DXVA2 configuration used to create the decoder | ||||
|      */ | ||||
|     const DXVA2_ConfigPictureDecode *cfg; | ||||
| 
 | ||||
|     /**
 | ||||
|      * The number of surface in the surface array | ||||
|      */ | ||||
|     unsigned surface_count; | ||||
| 
 | ||||
|     /**
 | ||||
|      * The array of Direct3D surfaces used to create the decoder | ||||
|      */ | ||||
|     LPDIRECT3DSURFACE9 *surface; | ||||
| 
 | ||||
|     /**
 | ||||
|      * A bit field configuring the workarounds needed for using the decoder | ||||
|      */ | ||||
|     uint64_t workaround; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Private to the FFmpeg AVHWAccel implementation | ||||
|      */ | ||||
|     unsigned report_id; | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVCODEC_DXVA2_H */ | ||||
| @ -0,0 +1,252 @@ | ||||
| /*
 | ||||
|  * simple math operations | ||||
|  * Copyright (c) 2001, 2002 Fabrice Bellard | ||||
|  * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al | ||||
|  * | ||||
|  * 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_MATHOPS_H | ||||
| #define AVCODEC_MATHOPS_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "libavutil/common.h" | ||||
| #include "config.h" | ||||
| 
 | ||||
| #define MAX_NEG_CROP 1024 | ||||
| 
 | ||||
| extern const uint32_t ff_inverse[257]; | ||||
| extern const uint8_t ff_sqrt_tab[256]; | ||||
| extern const uint8_t ff_crop_tab[256 + 2 * MAX_NEG_CROP]; | ||||
| extern const uint8_t ff_zigzag_direct[64]; | ||||
| extern const uint8_t ff_zigzag_scan[16+1]; | ||||
| 
 | ||||
| #if   ARCH_ARM | ||||
| #   include "arm/mathops.h" | ||||
| #elif ARCH_AVR32 | ||||
| #   include "avr32/mathops.h" | ||||
| #elif ARCH_MIPS | ||||
| #   include "mips/mathops.h" | ||||
| #elif ARCH_PPC | ||||
| #   include "ppc/mathops.h" | ||||
| #elif ARCH_X86 | ||||
| #   include "x86/mathops.h" | ||||
| #endif | ||||
| 
 | ||||
| /* generic implementation */ | ||||
| 
 | ||||
| #ifndef MUL64 | ||||
| #   define MUL64(a,b) ((int64_t)(a) * (int64_t)(b)) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MULL | ||||
| #   define MULL(a,b,s) (MUL64(a, b) >> (s)) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MULH | ||||
| static av_always_inline int MULH(int a, int b){ | ||||
|     return MUL64(a, b) >> 32; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifndef UMULH | ||||
| static av_always_inline unsigned UMULH(unsigned a, unsigned b){ | ||||
|     return ((uint64_t)(a) * (uint64_t)(b))>>32; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MAC64 | ||||
| #   define MAC64(d, a, b) ((d) += MUL64(a, b)) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MLS64 | ||||
| #   define MLS64(d, a, b) ((d) -= MUL64(a, b)) | ||||
| #endif | ||||
| 
 | ||||
| /* signed 16x16 -> 32 multiply add accumulate */ | ||||
| #ifndef MAC16 | ||||
| #   define MAC16(rt, ra, rb) rt += (ra) * (rb) | ||||
| #endif | ||||
| 
 | ||||
| /* signed 16x16 -> 32 multiply */ | ||||
| #ifndef MUL16 | ||||
| #   define MUL16(ra, rb) ((ra) * (rb)) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MLS16 | ||||
| #   define MLS16(rt, ra, rb) ((rt) -= (ra) * (rb)) | ||||
| #endif | ||||
| 
 | ||||
| /* median of 3 */ | ||||
| #ifndef mid_pred | ||||
| #define mid_pred mid_pred | ||||
| static inline av_const int mid_pred(int a, int b, int c) | ||||
| { | ||||
| #if 0 | ||||
|     int t= (a-b)&((a-b)>>31); | ||||
|     a-=t; | ||||
|     b+=t; | ||||
|     b-= (b-c)&((b-c)>>31); | ||||
|     b+= (a-b)&((a-b)>>31); | ||||
| 
 | ||||
|     return b; | ||||
| #else | ||||
|     if(a>b){ | ||||
|         if(c>b){ | ||||
|             if(c>a) b=a; | ||||
|             else    b=c; | ||||
|         } | ||||
|     }else{ | ||||
|         if(b>c){ | ||||
|             if(c>a) b=c; | ||||
|             else    b=a; | ||||
|         } | ||||
|     } | ||||
|     return b; | ||||
| #endif | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifndef median4 | ||||
| #define median4 median4 | ||||
| static inline av_const int median4(int a, int b, int c, int d) | ||||
| { | ||||
|     if (a < b) { | ||||
|         if (c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2; | ||||
|         else       return (FFMIN(b, c) + FFMAX(a, d)) / 2; | ||||
|     } else { | ||||
|         if (c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2; | ||||
|         else       return (FFMIN(a, c) + FFMAX(b, d)) / 2; | ||||
|     } | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifndef sign_extend | ||||
| static inline av_const int sign_extend(int val, unsigned bits) | ||||
| { | ||||
|     unsigned shift = 8 * sizeof(int) - bits; | ||||
|     union { unsigned u; int s; } v = { (unsigned) val << shift }; | ||||
|     return v.s >> shift; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifndef zero_extend | ||||
| static inline av_const unsigned zero_extend(unsigned val, unsigned bits) | ||||
| { | ||||
|     return (val << ((8 * sizeof(int)) - bits)) >> ((8 * sizeof(int)) - bits); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifndef COPY3_IF_LT | ||||
| #define COPY3_IF_LT(x, y, a, b, c, d)\ | ||||
| if ((y) < (x)) {\
 | ||||
|     (x) = (y);\
 | ||||
|     (a) = (b);\
 | ||||
|     (c) = (d);\
 | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MASK_ABS | ||||
| #define MASK_ABS(mask, level) do {              \ | ||||
|         mask  = level >> 31;                    \
 | ||||
|         level = (level ^ mask) - mask;          \
 | ||||
|     } while (0) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef NEG_SSR32 | ||||
| #   define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s))) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef NEG_USR32 | ||||
| #   define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s))) | ||||
| #endif | ||||
| 
 | ||||
| #if HAVE_BIGENDIAN | ||||
| # ifndef PACK_2U8 | ||||
| #   define PACK_2U8(a,b)     (((a) <<  8) | (b)) | ||||
| # endif | ||||
| # ifndef PACK_4U8 | ||||
| #   define PACK_4U8(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) | ||||
| # endif | ||||
| # ifndef PACK_2U16 | ||||
| #   define PACK_2U16(a,b)    (((a) << 16) | (b)) | ||||
| # endif | ||||
| #else | ||||
| # ifndef PACK_2U8 | ||||
| #   define PACK_2U8(a,b)     (((b) <<  8) | (a)) | ||||
| # endif | ||||
| # ifndef PACK_4U2 | ||||
| #   define PACK_4U8(a,b,c,d) (((d) << 24) | ((c) << 16) | ((b) << 8) | (a)) | ||||
| # endif | ||||
| # ifndef PACK_2U16 | ||||
| #   define PACK_2U16(a,b)    (((b) << 16) | (a)) | ||||
| # endif | ||||
| #endif | ||||
| 
 | ||||
| #ifndef PACK_2S8 | ||||
| #   define PACK_2S8(a,b)     PACK_2U8((a)&255, (b)&255) | ||||
| #endif | ||||
| #ifndef PACK_4S8 | ||||
| #   define PACK_4S8(a,b,c,d) PACK_4U8((a)&255, (b)&255, (c)&255, (d)&255) | ||||
| #endif | ||||
| #ifndef PACK_2S16 | ||||
| #   define PACK_2S16(a,b)    PACK_2U16((a)&0xffff, (b)&0xffff) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef FASTDIV | ||||
| #   define FASTDIV(a,b) ((uint32_t)((((uint64_t)a) * ff_inverse[b]) >> 32)) | ||||
| #endif /* FASTDIV */ | ||||
| 
 | ||||
| #ifndef ff_sqrt | ||||
| #define ff_sqrt ff_sqrt | ||||
| static inline av_const unsigned int ff_sqrt(unsigned int a) | ||||
| { | ||||
|     unsigned int b; | ||||
| 
 | ||||
|     if (a < 255) return (ff_sqrt_tab[a + 1] - 1) >> 4; | ||||
|     else if (a < (1 << 12)) b = ff_sqrt_tab[a >> 4] >> 2; | ||||
| #if !CONFIG_SMALL | ||||
|     else if (a < (1 << 14)) b = ff_sqrt_tab[a >> 6] >> 1; | ||||
|     else if (a < (1 << 16)) b = ff_sqrt_tab[a >> 8]   ; | ||||
| #endif | ||||
|     else { | ||||
|         int s = av_log2_16bit(a >> 16) >> 1; | ||||
|         unsigned int c = a >> (s + 2); | ||||
|         b = ff_sqrt_tab[c >> (s + 8)]; | ||||
|         b = FASTDIV(c,b) + (b << s); | ||||
|     } | ||||
| 
 | ||||
|     return b - (a < b * b); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| static inline av_const float ff_sqrf(float a) | ||||
| { | ||||
|     return a*a; | ||||
| } | ||||
| 
 | ||||
| static inline int8_t ff_u8_to_s8(uint8_t a) | ||||
| { | ||||
|     union { | ||||
|         uint8_t u8; | ||||
|         int8_t  s8; | ||||
|     } b; | ||||
|     b.u8 = a; | ||||
|     return b.s8; | ||||
| } | ||||
| 
 | ||||
| #endif /* AVCODEC_MATHOPS_H */ | ||||
| @ -0,0 +1,107 @@ | ||||
| /*
 | ||||
|  * Intel MediaSDK QSV public API | ||||
|  * | ||||
|  * 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_QSV_H | ||||
| #define AVCODEC_QSV_H | ||||
| 
 | ||||
| #include <mfx/mfxvideo.h> | ||||
| 
 | ||||
| #include "libavutil/buffer.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * This struct is used for communicating QSV parameters between libavcodec and | ||||
|  * the caller. It is managed by the caller and must be assigned to | ||||
|  * AVCodecContext.hwaccel_context. | ||||
|  * - decoding: hwaccel_context must be set on return from the get_format() | ||||
|  *             callback | ||||
|  * - encoding: hwaccel_context must be set before avcodec_open2() | ||||
|  */ | ||||
| typedef struct AVQSVContext { | ||||
|     /**
 | ||||
|      * If non-NULL, the session to use for encoding or decoding. | ||||
|      * Otherwise, libavcodec will try to create an internal session. | ||||
|      */ | ||||
|     mfxSession session; | ||||
| 
 | ||||
|     /**
 | ||||
|      * The IO pattern to use. | ||||
|      */ | ||||
|     int iopattern; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Extra buffers to pass to encoder or decoder initialization. | ||||
|      */ | ||||
|     mfxExtBuffer **ext_buffers; | ||||
|     int         nb_ext_buffers; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Encoding only. If this field is set to non-zero by the caller, libavcodec | ||||
|      * will create an mfxExtOpaqueSurfaceAlloc extended buffer and pass it to | ||||
|      * the encoder initialization. This only makes sense if iopattern is also | ||||
|      * set to MFX_IOPATTERN_IN_OPAQUE_MEMORY. | ||||
|      * | ||||
|      * The number of allocated opaque surfaces will be the sum of the number | ||||
|      * required by the encoder and the user-provided value nb_opaque_surfaces. | ||||
|      * The array of the opaque surfaces will be exported to the caller through | ||||
|      * the opaque_surfaces field. | ||||
|      */ | ||||
|     int opaque_alloc; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Encoding only, and only if opaque_alloc is set to non-zero. Before | ||||
|      * calling avcodec_open2(), the caller should set this field to the number | ||||
|      * of extra opaque surfaces to allocate beyond what is required by the | ||||
|      * encoder. | ||||
|      * | ||||
|      * On return from avcodec_open2(), this field will be set by libavcodec to | ||||
|      * the total number of allocated opaque surfaces. | ||||
|      */ | ||||
|     int nb_opaque_surfaces; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Encoding only, and only if opaque_alloc is set to non-zero. On return | ||||
|      * from avcodec_open2(), this field will be used by libavcodec to export the | ||||
|      * array of the allocated opaque surfaces to the caller, so they can be | ||||
|      * passed to other parts of the pipeline. | ||||
|      * | ||||
|      * The buffer reference exported here is owned and managed by libavcodec, | ||||
|      * the callers should make their own reference with av_buffer_ref() and free | ||||
|      * it with av_buffer_unref() when it is no longer needed. | ||||
|      * | ||||
|      * The buffer data is an nb_opaque_surfaces-sized array of mfxFrameSurface1. | ||||
|      */ | ||||
|     AVBufferRef *opaque_surfaces; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Encoding only, and only if opaque_alloc is set to non-zero. On return | ||||
|      * from avcodec_open2(), this field will be set to the surface type used in | ||||
|      * the opaque allocation request. | ||||
|      */ | ||||
|     int opaque_alloc_type; | ||||
| } AVQSVContext; | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate a new context. | ||||
|  * | ||||
|  * It must be freed by the caller with av_free(). | ||||
|  */ | ||||
| AVQSVContext *av_qsv_alloc_context(void); | ||||
| 
 | ||||
| #endif /* AVCODEC_QSV_H */ | ||||
| @ -0,0 +1,189 @@ | ||||
| /*
 | ||||
|  * Video Acceleration API (shared data between FFmpeg and the video player) | ||||
|  * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1 | ||||
|  * | ||||
|  * Copyright (C) 2008-2009 Splitted-Desktop Systems | ||||
|  * | ||||
|  * 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_VAAPI_H | ||||
| #define AVCODEC_VAAPI_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup lavc_codec_hwaccel_vaapi | ||||
|  * Public libavcodec VA API header. | ||||
|  */ | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include "libavutil/attributes.h" | ||||
| #include "version.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavc_codec_hwaccel_vaapi VA API Decoding | ||||
|  * @ingroup lavc_codec_hwaccel | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * This structure is used to share data between the FFmpeg library and | ||||
|  * the client video application. | ||||
|  * This shall be zero-allocated and available as | ||||
|  * AVCodecContext.hwaccel_context. All user members can be set once | ||||
|  * during initialization or through each AVCodecContext.get_buffer() | ||||
|  * function call. In any case, they must be valid prior to calling | ||||
|  * decoding functions. | ||||
|  */ | ||||
| struct vaapi_context { | ||||
|     /**
 | ||||
|      * Window system dependent data | ||||
|      * | ||||
|      * - encoding: unused | ||||
|      * - decoding: Set by user | ||||
|      */ | ||||
|     void *display; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Configuration ID | ||||
|      * | ||||
|      * - encoding: unused | ||||
|      * - decoding: Set by user | ||||
|      */ | ||||
|     uint32_t config_id; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Context ID (video decode pipeline) | ||||
|      * | ||||
|      * - encoding: unused | ||||
|      * - 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 /* AVCODEC_VAAPI_H */ | ||||
| @ -0,0 +1,230 @@ | ||||
| /*
 | ||||
|  * 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 <stdint.h> | ||||
| 
 | ||||
| // 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 <VideoDecodeAcceleration/VDADecoder.h> | ||||
| #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 */ | ||||
| @ -0,0 +1,253 @@ | ||||
| /*
 | ||||
|  * The Video Decode and Presentation API for UNIX (VDPAU) is used for | ||||
|  * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1. | ||||
|  * | ||||
|  * Copyright (C) 2008 NVIDIA | ||||
|  * | ||||
|  * 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_VDPAU_H | ||||
| #define AVCODEC_VDPAU_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup lavc_codec_hwaccel_vdpau | ||||
|  * Public libavcodec VDPAU header. | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavc_codec_hwaccel_vdpau VDPAU Decoder and Renderer | ||||
|  * @ingroup lavc_codec_hwaccel | ||||
|  * | ||||
|  * VDPAU hardware acceleration has two modules | ||||
|  * - VDPAU decoding | ||||
|  * - VDPAU presentation | ||||
|  * | ||||
|  * The VDPAU decoding module parses all headers using FFmpeg | ||||
|  * parsing mechanisms and uses VDPAU for the actual decoding. | ||||
|  * | ||||
|  * As per the current implementation, the actual decoding | ||||
|  * and rendering (API calls) are done as part of the VDPAU | ||||
|  * presentation (vo_vdpau.c) module. | ||||
|  * | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| #include <vdpau/vdpau.h> | ||||
| #include <vdpau/vdpau_x11.h> | ||||
| #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; | ||||
| 
 | ||||
| typedef int (*AVVDPAU_Render2)(struct AVCodecContext *, struct AVFrame *, | ||||
|                                const VdpPictureInfo *, uint32_t, | ||||
|                                const VdpBitstreamBuffer *); | ||||
| 
 | ||||
| /**
 | ||||
|  * This structure is used to share data between the libavcodec library and | ||||
|  * the client video application. | ||||
|  * The user shall allocate the structure via the av_alloc_vdpau_hwaccel | ||||
|  * function and make it available as | ||||
|  * AVCodecContext.hwaccel_context. Members can be set by the user once | ||||
|  * during initialization or through each AVCodecContext.get_buffer() | ||||
|  * function call. In any case, they must be valid prior to calling | ||||
|  * decoding functions. | ||||
|  * | ||||
|  * The size of this structure is not a part of the public ABI and must not | ||||
|  * be used outside of libavcodec. Use av_vdpau_alloc_context() to allocate an | ||||
|  * AVVDPAUContext. | ||||
|  */ | ||||
| typedef struct AVVDPAUContext { | ||||
|     /**
 | ||||
|      * VDPAU decoder handle | ||||
|      * | ||||
|      * Set by user. | ||||
|      */ | ||||
|     VdpDecoder decoder; | ||||
| 
 | ||||
|     /**
 | ||||
|      * VDPAU decoder render callback | ||||
|      * | ||||
|      * Set by the user. | ||||
|      */ | ||||
|     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; | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief allocation function for AVVDPAUContext | ||||
|  * | ||||
|  * Allows extending the struct without breaking API/ABI | ||||
|  */ | ||||
| AVVDPAUContext *av_alloc_vdpaucontext(void); | ||||
| 
 | ||||
| AVVDPAU_Render2 av_vdpau_hwaccel_get_render2(const AVVDPAUContext *); | ||||
| void av_vdpau_hwaccel_set_render2(AVVDPAUContext *, AVVDPAU_Render2); | ||||
| 
 | ||||
| /**
 | ||||
|  * Associate a VDPAU device with a codec context for hardware acceleration. | ||||
|  * This function is meant to be called from the get_format() codec callback, | ||||
|  * or earlier. It can also be called after avcodec_flush_buffers() to change | ||||
|  * the underlying VDPAU device mid-stream (e.g. to recover from non-transparent | ||||
|  * display preemption). | ||||
|  * | ||||
|  * @note get_format() must return AV_PIX_FMT_VDPAU if this function completes | ||||
|  * successfully. | ||||
|  * | ||||
|  * @param avctx decoding context whose get_format() callback is invoked | ||||
|  * @param device VDPAU device handle to use for hardware acceleration | ||||
|  * @param get_proc_address VDPAU device driver | ||||
|  * @param flags zero of more OR'd AV_HWACCEL_FLAG_* flags | ||||
|  * | ||||
|  * @return 0 on success, an AVERROR code on failure. | ||||
|  */ | ||||
| int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device, | ||||
|                           VdpGetProcAddress *get_proc_address, unsigned flags); | ||||
| 
 | ||||
| /**
 | ||||
|  * Gets the parameters to create an adequate VDPAU video surface for the codec | ||||
|  * context using VDPAU hardware decoding acceleration. | ||||
|  * | ||||
|  * @note Behavior is undefined if the context was not successfully bound to a | ||||
|  * VDPAU device using av_vdpau_bind_context(). | ||||
|  * | ||||
|  * @param avctx the codec context being used for decoding the stream | ||||
|  * @param type storage space for the VDPAU video surface chroma type | ||||
|  *              (or NULL to ignore) | ||||
|  * @param width storage space for the VDPAU video surface pixel width | ||||
|  *              (or NULL to ignore) | ||||
|  * @param height storage space for the VDPAU video surface pixel height | ||||
|  *              (or NULL to ignore) | ||||
|  * | ||||
|  * @return 0 on success, a negative AVERROR code on failure. | ||||
|  */ | ||||
| int av_vdpau_get_surface_parameters(AVCodecContext *avctx, VdpChromaType *type, | ||||
|                                     uint32_t *width, uint32_t *height); | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate an AVVDPAUContext. | ||||
|  * | ||||
|  * @return Newly-allocated AVVDPAUContext or NULL on failure. | ||||
|  */ | ||||
| AVVDPAUContext *av_vdpau_alloc_context(void); | ||||
| 
 | ||||
| #if FF_API_VDPAU_PROFILE | ||||
| /**
 | ||||
|  * Get a decoder profile that should be used for initializing a VDPAU decoder. | ||||
|  * Should be called from the AVCodecContext.get_format() callback. | ||||
|  * | ||||
|  * @deprecated Use av_vdpau_bind_context() instead. | ||||
|  * | ||||
|  * @param avctx the codec context being used for decoding the stream | ||||
|  * @param profile a pointer into which the result will be written on success. | ||||
|  *                The contents of profile are undefined if this function returns | ||||
|  *                an error. | ||||
|  * | ||||
|  * @return 0 on success (non-negative), a negative AVERROR on failure. | ||||
|  */ | ||||
| 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 */ | ||||
| @ -0,0 +1,216 @@ | ||||
| /*
 | ||||
|  * | ||||
|  * 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_VERSION_H | ||||
| #define AVCODEC_VERSION_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup libavc | ||||
|  * Libavcodec version macros. | ||||
|  */ | ||||
| 
 | ||||
| #include "libavutil/version.h" | ||||
| 
 | ||||
| #define LIBAVCODEC_VERSION_MAJOR  57 | ||||
| #define LIBAVCODEC_VERSION_MINOR  24 | ||||
| #define LIBAVCODEC_VERSION_MICRO 102 | ||||
| 
 | ||||
| #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | ||||
|                                                LIBAVCODEC_VERSION_MINOR, \
 | ||||
|                                                LIBAVCODEC_VERSION_MICRO) | ||||
| #define LIBAVCODEC_VERSION      AV_VERSION(LIBAVCODEC_VERSION_MAJOR,    \ | ||||
|                                            LIBAVCODEC_VERSION_MINOR,    \
 | ||||
|                                            LIBAVCODEC_VERSION_MICRO) | ||||
| #define LIBAVCODEC_BUILD        LIBAVCODEC_VERSION_INT | ||||
| 
 | ||||
| #define LIBAVCODEC_IDENT        "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION) | ||||
| 
 | ||||
| /**
 | ||||
|  * 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. | ||||
|  * | ||||
|  * @note, when bumping the major version it is recommended to manually | ||||
|  * disable each FF_API_* in its own commit instead of disabling them all | ||||
|  * 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_GETCHROMA | ||||
| #define FF_API_GETCHROMA         (LIBAVCODEC_VERSION_MAJOR < 58) | ||||
| #endif | ||||
| #ifndef FF_API_MISSING_SAMPLE | ||||
| #define FF_API_MISSING_SAMPLE    (LIBAVCODEC_VERSION_MAJOR < 58) | ||||
| #endif | ||||
| #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) | ||||
| #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 | ||||
| #ifndef FF_API_VDPAU_PROFILE | ||||
| #define FF_API_VDPAU_PROFILE     (LIBAVCODEC_VERSION_MAJOR < 59) | ||||
| #endif | ||||
| #ifndef FF_API_CONVERGENCE_DURATION | ||||
| #define FF_API_CONVERGENCE_DURATION (LIBAVCODEC_VERSION_MAJOR < 59) | ||||
| #endif | ||||
| #ifndef FF_API_AVPICTURE | ||||
| #define FF_API_AVPICTURE         (LIBAVCODEC_VERSION_MAJOR < 59) | ||||
| #endif | ||||
| #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 | ||||
| 
 | ||||
| #endif /* AVCODEC_VERSION_H */ | ||||
| @ -0,0 +1,126 @@ | ||||
| /*
 | ||||
|  * Videotoolbox hardware acceleration | ||||
|  * | ||||
|  * copyright (c) 2012 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_VIDEOTOOLBOX_H | ||||
| #define AVCODEC_VIDEOTOOLBOX_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup lavc_codec_hwaccel_videotoolbox | ||||
|  * Public libavcodec Videotoolbox header. | ||||
|  */ | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #define Picture QuickdrawPicture | ||||
| #include <VideoToolbox/VideoToolbox.h> | ||||
| #undef Picture | ||||
| 
 | ||||
| #include "libavcodec/avcodec.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * This struct holds all the information that needs to be passed | ||||
|  * between the caller and libavcodec for initializing Videotoolbox decoding. | ||||
|  * Its size is not a part of the public ABI, it must be allocated with | ||||
|  * av_videotoolbox_alloc_context() and freed with av_free(). | ||||
|  */ | ||||
| typedef struct AVVideotoolboxContext { | ||||
|     /**
 | ||||
|      * Videotoolbox decompression session object. | ||||
|      * Created and freed the caller. | ||||
|      */ | ||||
|     VTDecompressionSessionRef session; | ||||
| 
 | ||||
|     /**
 | ||||
|      * The output callback that must be passed to the session. | ||||
|      * Set by av_videottoolbox_default_init() | ||||
|      */ | ||||
|     VTDecompressionOutputCallback output_callback; | ||||
| 
 | ||||
|     /**
 | ||||
|      * CVPixelBuffer Format Type that Videotoolbox will use for decoded frames. | ||||
|      * set by the caller. | ||||
|      */ | ||||
|     OSType cv_pix_fmt_type; | ||||
| 
 | ||||
|     /**
 | ||||
|      * CoreMedia Format Description that Videotoolbox will use to create the decompression session. | ||||
|      * Set by the caller. | ||||
|      */ | ||||
|     CMVideoFormatDescriptionRef cm_fmt_desc; | ||||
| 
 | ||||
|     /**
 | ||||
|      * CoreMedia codec type that Videotoolbox will use to create the decompression session. | ||||
|      * Set by the caller. | ||||
|      */ | ||||
|     int cm_codec_type; | ||||
| } AVVideotoolboxContext; | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate and initialize a Videotoolbox context. | ||||
|  * | ||||
|  * This function should be called from the get_format() callback when the caller | ||||
|  * selects the AV_PIX_FMT_VIDETOOLBOX format. The caller must then create | ||||
|  * the decoder object (using the output callback provided by libavcodec) that | ||||
|  * will be used for Videotoolbox-accelerated decoding. | ||||
|  * | ||||
|  * When decoding with Videotoolbox is finished, the caller must destroy the decoder | ||||
|  * object and free the Videotoolbox context using av_free(). | ||||
|  * | ||||
|  * @return the newly allocated context or NULL on failure | ||||
|  */ | ||||
| AVVideotoolboxContext *av_videotoolbox_alloc_context(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * This is a convenience function that creates and sets up the Videotoolbox context using | ||||
|  * an internal implementation. | ||||
|  * | ||||
|  * @param avctx the corresponding codec context | ||||
|  * | ||||
|  * @return >= 0 on success, a negative AVERROR code on failure | ||||
|  */ | ||||
| int av_videotoolbox_default_init(AVCodecContext *avctx); | ||||
| 
 | ||||
| /**
 | ||||
|  * This is a convenience function that creates and sets up the Videotoolbox context using | ||||
|  * an internal implementation. | ||||
|  * | ||||
|  * @param avctx the corresponding codec context | ||||
|  * @param vtctx the Videotoolbox context to use | ||||
|  * | ||||
|  * @return >= 0 on success, a negative AVERROR code on failure | ||||
|  */ | ||||
| int av_videotoolbox_default_init2(AVCodecContext *avctx, AVVideotoolboxContext *vtctx); | ||||
| 
 | ||||
| /**
 | ||||
|  * This function must be called to free the Videotoolbox context initialized with | ||||
|  * av_videotoolbox_default_init(). | ||||
|  * | ||||
|  * @param avctx the corresponding codec context | ||||
|  */ | ||||
| void av_videotoolbox_default_free(AVCodecContext *avctx); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVCODEC_VIDEOTOOLBOX_H */ | ||||
| @ -0,0 +1,78 @@ | ||||
| /*
 | ||||
|  * | ||||
|  * 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 | ||||
|  * A public API for Vorbis parsing | ||||
|  * | ||||
|  * Determines the duration for each packet. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVCODEC_VORBIS_PARSER_H | ||||
| #define AVCODEC_VORBIS_PARSER_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| 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); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free the parser and everything associated with it. | ||||
|  */ | ||||
| void av_vorbis_parse_free(AVVorbisParseContext **s); | ||||
| 
 | ||||
| #define VORBIS_FLAG_HEADER  0x00000001 | ||||
| #define VORBIS_FLAG_COMMENT 0x00000002 | ||||
| #define VORBIS_FLAG_SETUP   0x00000004 | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the duration for a Vorbis packet. | ||||
|  * | ||||
|  * If @p flags is @c NULL, | ||||
|  * special frames are considered invalid. | ||||
|  * | ||||
|  * @param s        Vorbis parser context | ||||
|  * @param buf      buffer containing a Vorbis frame | ||||
|  * @param buf_size size of the buffer | ||||
|  * @param flags    flags for special frames | ||||
|  */ | ||||
| int av_vorbis_parse_frame_flags(AVVorbisParseContext *s, const uint8_t *buf, | ||||
|                                 int buf_size, int *flags); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the duration for a Vorbis packet. | ||||
|  * | ||||
|  * @param s        Vorbis parser context | ||||
|  * @param buf      buffer containing a Vorbis frame | ||||
|  * @param buf_size size of the buffer | ||||
|  */ | ||||
| int av_vorbis_parse_frame(AVVorbisParseContext *s, const uint8_t *buf, | ||||
|                           int buf_size); | ||||
| 
 | ||||
| void av_vorbis_parse_reset(AVVorbisParseContext *s); | ||||
| 
 | ||||
| #endif /* AVCODEC_VORBIS_PARSER_H */ | ||||
| @ -0,0 +1,170 @@ | ||||
| /*
 | ||||
|  * Copyright (C) 2003 Ivan Kalvachev | ||||
|  * | ||||
|  * 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_XVMC_H | ||||
| #define AVCODEC_XVMC_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup lavc_codec_hwaccel_xvmc | ||||
|  * Public libavcodec XvMC header. | ||||
|  */ | ||||
| 
 | ||||
| #include <X11/extensions/XvMC.h> | ||||
| 
 | ||||
| #include "libavutil/attributes.h" | ||||
| #include "version.h" | ||||
| #include "avcodec.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavc_codec_hwaccel_xvmc XvMC | ||||
|  * @ingroup lavc_codec_hwaccel | ||||
|  * | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| #define AV_XVMC_ID                    0x1DC711C0  /**< special value to ensure that regular pixel routines haven't corrupted the struct | ||||
|                                                        the number is 1337 speak for the letters IDCT MCo (motion compensation) */ | ||||
| 
 | ||||
| struct attribute_deprecated xvmc_pix_fmt { | ||||
|     /** The field contains the special constant value AV_XVMC_ID.
 | ||||
|         It is used as a test that the application correctly uses the API, | ||||
|         and that there is no corruption caused by pixel routines. | ||||
|         - application - set during initialization | ||||
|         - libavcodec  - unchanged | ||||
|     */ | ||||
|     int             xvmc_id; | ||||
| 
 | ||||
|     /** Pointer to the block array allocated by XvMCCreateBlocks().
 | ||||
|         The array has to be freed by XvMCDestroyBlocks(). | ||||
|         Each group of 64 values represents one data block of differential | ||||
|         pixel information (in MoCo mode) or coefficients for IDCT. | ||||
|         - application - set the pointer during initialization | ||||
|         - libavcodec  - fills coefficients/pixel data into the array | ||||
|     */ | ||||
|     short*          data_blocks; | ||||
| 
 | ||||
|     /** Pointer to the macroblock description array allocated by
 | ||||
|         XvMCCreateMacroBlocks() and freed by XvMCDestroyMacroBlocks(). | ||||
|         - application - set the pointer during initialization | ||||
|         - libavcodec  - fills description data into the array | ||||
|     */ | ||||
|     XvMCMacroBlock* mv_blocks; | ||||
| 
 | ||||
|     /** Number of macroblock descriptions that can be stored in the mv_blocks
 | ||||
|         array. | ||||
|         - application - set during initialization | ||||
|         - libavcodec  - unchanged | ||||
|     */ | ||||
|     int             allocated_mv_blocks; | ||||
| 
 | ||||
|     /** Number of blocks that can be stored at once in the data_blocks array.
 | ||||
|         - application - set during initialization | ||||
|         - libavcodec  - unchanged | ||||
|     */ | ||||
|     int             allocated_data_blocks; | ||||
| 
 | ||||
|     /** Indicate that the hardware would interpret data_blocks as IDCT
 | ||||
|         coefficients and perform IDCT on them. | ||||
|         - application - set during initialization | ||||
|         - libavcodec  - unchanged | ||||
|     */ | ||||
|     int             idct; | ||||
| 
 | ||||
|     /** In MoCo mode it indicates that intra macroblocks are assumed to be in
 | ||||
|         unsigned format; same as the XVMC_INTRA_UNSIGNED flag. | ||||
|         - application - set during initialization | ||||
|         - libavcodec  - unchanged | ||||
|     */ | ||||
|     int             unsigned_intra; | ||||
| 
 | ||||
|     /** Pointer to the surface allocated by XvMCCreateSurface().
 | ||||
|         It has to be freed by XvMCDestroySurface() on application exit. | ||||
|         It identifies the frame and its state on the video hardware. | ||||
|         - application - set during initialization | ||||
|         - libavcodec  - unchanged | ||||
|     */ | ||||
|     XvMCSurface*    p_surface; | ||||
| 
 | ||||
| /** Set by the decoder before calling ff_draw_horiz_band(),
 | ||||
|     needed by the XvMCRenderSurface function. */ | ||||
| //@{
 | ||||
|     /** Pointer to the surface used as past reference
 | ||||
|         - application - unchanged | ||||
|         - libavcodec  - set | ||||
|     */ | ||||
|     XvMCSurface*    p_past_surface; | ||||
| 
 | ||||
|     /** Pointer to the surface used as future reference
 | ||||
|         - application - unchanged | ||||
|         - libavcodec  - set | ||||
|     */ | ||||
|     XvMCSurface*    p_future_surface; | ||||
| 
 | ||||
|     /** top/bottom field or frame
 | ||||
|         - application - unchanged | ||||
|         - libavcodec  - set | ||||
|     */ | ||||
|     unsigned int    picture_structure; | ||||
| 
 | ||||
|     /** XVMC_SECOND_FIELD - 1st or 2nd field in the sequence
 | ||||
|         - application - unchanged | ||||
|         - libavcodec  - set | ||||
|     */ | ||||
|     unsigned int    flags; | ||||
| //}@
 | ||||
| 
 | ||||
|     /** Number of macroblock descriptions in the mv_blocks array
 | ||||
|         that have already been passed to the hardware. | ||||
|         - application - zeroes it on get_buffer(). | ||||
|                         A successful ff_draw_horiz_band() may increment it | ||||
|                         with filled_mb_block_num or zero both. | ||||
|         - libavcodec  - unchanged | ||||
|     */ | ||||
|     int             start_mv_blocks_num; | ||||
| 
 | ||||
|     /** Number of new macroblock descriptions in the mv_blocks array (after
 | ||||
|         start_mv_blocks_num) that are filled by libavcodec and have to be | ||||
|         passed to the hardware. | ||||
|         - application - zeroes it on get_buffer() or after successful | ||||
|                         ff_draw_horiz_band(). | ||||
|         - libavcodec  - increment with one of each stored MB | ||||
|     */ | ||||
|     int             filled_mv_blocks_num; | ||||
| 
 | ||||
|     /** Number of the next free data block; one data block consists of
 | ||||
|         64 short values in the data_blocks array. | ||||
|         All blocks before this one have already been claimed by placing their | ||||
|         position into the corresponding block description structure field, | ||||
|         that are part of the mv_blocks array. | ||||
|         - application - zeroes it on get_buffer(). | ||||
|                         A successful ff_draw_horiz_band() may zero it together | ||||
|                         with start_mb_blocks_num. | ||||
|         - libavcodec  - each decoded macroblock increases it by the number | ||||
|                         of coded blocks it contains. | ||||
|     */ | ||||
|     int             next_free_data_block_num; | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVCODEC_XVMC_H */ | ||||
| @ -0,0 +1,509 @@ | ||||
| /*
 | ||||
|  * 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 AVDEVICE_AVDEVICE_H | ||||
| #define AVDEVICE_AVDEVICE_H | ||||
| 
 | ||||
| #include "version.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup lavd | ||||
|  * Main libavdevice API header | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavd 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. | ||||
|  * | ||||
|  * 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" | ||||
| #include "libavutil/opt.h" | ||||
| #include "libavutil/dict.h" | ||||
| #include "libavformat/avformat.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the LIBAVDEVICE_VERSION_INT constant. | ||||
|  */ | ||||
| unsigned avdevice_version(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the libavdevice build-time configuration. | ||||
|  */ | ||||
| const char *avdevice_configuration(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the libavdevice license. | ||||
|  */ | ||||
| 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); | ||||
| 
 | ||||
| /**
 | ||||
|  * Audio input devices iterator. | ||||
|  * | ||||
|  * If d is NULL, returns the first registered input audio/video device, | ||||
|  * if d is non-NULL, returns the next registered input audio/video device after d | ||||
|  * or NULL if d is the last one. | ||||
|  */ | ||||
| AVInputFormat *av_input_audio_device_next(AVInputFormat  *d); | ||||
| 
 | ||||
| /**
 | ||||
|  * Video input devices iterator. | ||||
|  * | ||||
|  * If d is NULL, returns the first registered input audio/video device, | ||||
|  * if d is non-NULL, returns the next registered input audio/video device after d | ||||
|  * or NULL if d is the last one. | ||||
|  */ | ||||
| AVInputFormat *av_input_video_device_next(AVInputFormat  *d); | ||||
| 
 | ||||
| /**
 | ||||
|  * Audio output devices iterator. | ||||
|  * | ||||
|  * If d is NULL, returns the first registered output audio/video device, | ||||
|  * if d is non-NULL, returns the next registered output audio/video device after d | ||||
|  * or NULL if d is the last one. | ||||
|  */ | ||||
| AVOutputFormat *av_output_audio_device_next(AVOutputFormat *d); | ||||
| 
 | ||||
| /**
 | ||||
|  * Video output devices iterator. | ||||
|  * | ||||
|  * If d is NULL, returns the first registered output audio/video device, | ||||
|  * if d is non-NULL, returns the next registered output audio/video device after d | ||||
|  * or NULL if d is the last one. | ||||
|  */ | ||||
| AVOutputFormat *av_output_video_device_next(AVOutputFormat *d); | ||||
| 
 | ||||
| typedef struct AVDeviceRect { | ||||
|     int x;      /**< x coordinate of top left corner */ | ||||
|     int y;      /**< y coordinate of top left corner */ | ||||
|     int width;  /**< width */ | ||||
|     int height; /**< height */ | ||||
| } AVDeviceRect; | ||||
| 
 | ||||
| /**
 | ||||
|  * Message types used by avdevice_app_to_dev_control_message(). | ||||
|  */ | ||||
| enum AVAppToDevMessageType { | ||||
|     /**
 | ||||
|      * Dummy message. | ||||
|      */ | ||||
|     AV_APP_TO_DEV_NONE = MKBETAG('N','O','N','E'), | ||||
| 
 | ||||
|     /**
 | ||||
|      * Window size change message. | ||||
|      * | ||||
|      * Message is sent to the device every time the application changes the size | ||||
|      * of the window device renders to. | ||||
|      * Message should also be sent right after window is created. | ||||
|      * | ||||
|      * data: AVDeviceRect: new window size. | ||||
|      */ | ||||
|     AV_APP_TO_DEV_WINDOW_SIZE = MKBETAG('G','E','O','M'), | ||||
| 
 | ||||
|     /**
 | ||||
|      * Repaint request message. | ||||
|      * | ||||
|      * Message is sent to the device when window has to be repainted. | ||||
|      * | ||||
|      * data: AVDeviceRect: area required to be repainted. | ||||
|      *       NULL: whole area is required to be repainted. | ||||
|      */ | ||||
|     AV_APP_TO_DEV_WINDOW_REPAINT = MKBETAG('R','E','P','A'), | ||||
| 
 | ||||
|     /**
 | ||||
|      * Request pause/play. | ||||
|      * | ||||
|      * Application requests pause/unpause playback. | ||||
|      * Mostly usable with devices that have internal buffer. | ||||
|      * By default devices are not paused. | ||||
|      * | ||||
|      * data: NULL | ||||
|      */ | ||||
|     AV_APP_TO_DEV_PAUSE        = MKBETAG('P', 'A', 'U', ' '), | ||||
|     AV_APP_TO_DEV_PLAY         = MKBETAG('P', 'L', 'A', 'Y'), | ||||
|     AV_APP_TO_DEV_TOGGLE_PAUSE = MKBETAG('P', 'A', 'U', 'T'), | ||||
| 
 | ||||
|     /**
 | ||||
|      * Volume control message. | ||||
|      * | ||||
|      * Set volume level. It may be device-dependent if volume | ||||
|      * is changed per stream or system wide. Per stream volume | ||||
|      * change is expected when possible. | ||||
|      * | ||||
|      * data: double: new volume with range of 0.0 - 1.0. | ||||
|      */ | ||||
|     AV_APP_TO_DEV_SET_VOLUME = MKBETAG('S', 'V', 'O', 'L'), | ||||
| 
 | ||||
|     /**
 | ||||
|      * Mute control messages. | ||||
|      * | ||||
|      * Change mute state. It may be device-dependent if mute status | ||||
|      * is changed per stream or system wide. Per stream mute status | ||||
|      * change is expected when possible. | ||||
|      * | ||||
|      * data: NULL. | ||||
|      */ | ||||
|     AV_APP_TO_DEV_MUTE        = MKBETAG(' ', 'M', 'U', 'T'), | ||||
|     AV_APP_TO_DEV_UNMUTE      = MKBETAG('U', 'M', 'U', 'T'), | ||||
|     AV_APP_TO_DEV_TOGGLE_MUTE = MKBETAG('T', 'M', 'U', 'T'), | ||||
| 
 | ||||
|     /**
 | ||||
|      * Get volume/mute messages. | ||||
|      * | ||||
|      * Force the device to send AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED or | ||||
|      * AV_DEV_TO_APP_MUTE_STATE_CHANGED command respectively. | ||||
|      * | ||||
|      * data: NULL. | ||||
|      */ | ||||
|     AV_APP_TO_DEV_GET_VOLUME = MKBETAG('G', 'V', 'O', 'L'), | ||||
|     AV_APP_TO_DEV_GET_MUTE   = MKBETAG('G', 'M', 'U', 'T'), | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Message types used by avdevice_dev_to_app_control_message(). | ||||
|  */ | ||||
| enum AVDevToAppMessageType { | ||||
|     /**
 | ||||
|      * Dummy message. | ||||
|      */ | ||||
|     AV_DEV_TO_APP_NONE = MKBETAG('N','O','N','E'), | ||||
| 
 | ||||
|     /**
 | ||||
|      * Create window buffer message. | ||||
|      * | ||||
|      * Device requests to create a window buffer. Exact meaning is device- | ||||
|      * and application-dependent. Message is sent before rendering first | ||||
|      * frame and all one-shot initializations should be done here. | ||||
|      * Application is allowed to ignore preferred window buffer size. | ||||
|      * | ||||
|      * @note: Application is obligated to inform about window buffer size | ||||
|      *        with AV_APP_TO_DEV_WINDOW_SIZE message. | ||||
|      * | ||||
|      * data: AVDeviceRect: preferred size of the window buffer. | ||||
|      *       NULL: no preferred size of the window buffer. | ||||
|      */ | ||||
|     AV_DEV_TO_APP_CREATE_WINDOW_BUFFER = MKBETAG('B','C','R','E'), | ||||
| 
 | ||||
|     /**
 | ||||
|      * Prepare window buffer message. | ||||
|      * | ||||
|      * Device requests to prepare a window buffer for rendering. | ||||
|      * Exact meaning is device- and application-dependent. | ||||
|      * Message is sent before rendering of each frame. | ||||
|      * | ||||
|      * data: NULL. | ||||
|      */ | ||||
|     AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER = MKBETAG('B','P','R','E'), | ||||
| 
 | ||||
|     /**
 | ||||
|      * Display window buffer message. | ||||
|      * | ||||
|      * Device requests to display a window buffer. | ||||
|      * Message is sent when new frame is ready to be displayed. | ||||
|      * Usually buffers need to be swapped in handler of this message. | ||||
|      * | ||||
|      * data: NULL. | ||||
|      */ | ||||
|     AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER = MKBETAG('B','D','I','S'), | ||||
| 
 | ||||
|     /**
 | ||||
|      * Destroy window buffer message. | ||||
|      * | ||||
|      * Device requests to destroy a window buffer. | ||||
|      * Message is sent when device is about to be destroyed and window | ||||
|      * buffer is not required anymore. | ||||
|      * | ||||
|      * data: NULL. | ||||
|      */ | ||||
|     AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER = MKBETAG('B','D','E','S'), | ||||
| 
 | ||||
|     /**
 | ||||
|      * Buffer fullness status messages. | ||||
|      * | ||||
|      * Device signals buffer overflow/underflow. | ||||
|      * | ||||
|      * data: NULL. | ||||
|      */ | ||||
|     AV_DEV_TO_APP_BUFFER_OVERFLOW = MKBETAG('B','O','F','L'), | ||||
|     AV_DEV_TO_APP_BUFFER_UNDERFLOW = MKBETAG('B','U','F','L'), | ||||
| 
 | ||||
|     /**
 | ||||
|      * Buffer readable/writable. | ||||
|      * | ||||
|      * Device informs that buffer is readable/writable. | ||||
|      * When possible, device informs how many bytes can be read/write. | ||||
|      * | ||||
|      * @warning Device may not inform when number of bytes than can be read/write changes. | ||||
|      * | ||||
|      * data: int64_t: amount of bytes available to read/write. | ||||
|      *       NULL: amount of bytes available to read/write is not known. | ||||
|      */ | ||||
|     AV_DEV_TO_APP_BUFFER_READABLE = MKBETAG('B','R','D',' '), | ||||
|     AV_DEV_TO_APP_BUFFER_WRITABLE = MKBETAG('B','W','R',' '), | ||||
| 
 | ||||
|     /**
 | ||||
|      * Mute state change message. | ||||
|      * | ||||
|      * Device informs that mute state has changed. | ||||
|      * | ||||
|      * data: int: 0 for not muted state, non-zero for muted state. | ||||
|      */ | ||||
|     AV_DEV_TO_APP_MUTE_STATE_CHANGED = MKBETAG('C','M','U','T'), | ||||
| 
 | ||||
|     /**
 | ||||
|      * Volume level change message. | ||||
|      * | ||||
|      * Device informs that volume level has changed. | ||||
|      * | ||||
|      * data: double: new volume with range of 0.0 - 1.0. | ||||
|      */ | ||||
|     AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED = MKBETAG('C','V','O','L'), | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Send control message from application to device. | ||||
|  * | ||||
|  * @param s         device context. | ||||
|  * @param type      message type. | ||||
|  * @param data      message data. Exact type depends on message type. | ||||
|  * @param data_size size of message data. | ||||
|  * @return >= 0 on success, negative on error. | ||||
|  *         AVERROR(ENOSYS) when device doesn't implement handler of the message. | ||||
|  */ | ||||
| int avdevice_app_to_dev_control_message(struct AVFormatContext *s, | ||||
|                                         enum AVAppToDevMessageType type, | ||||
|                                         void *data, size_t data_size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Send control message from device to application. | ||||
|  * | ||||
|  * @param s         device context. | ||||
|  * @param type      message type. | ||||
|  * @param data      message data. Can be NULL. | ||||
|  * @param data_size size of message data. | ||||
|  * @return >= 0 on success, negative on error. | ||||
|  *         AVERROR(ENOSYS) when application doesn't implement handler of the message. | ||||
|  */ | ||||
| int avdevice_dev_to_app_control_message(struct AVFormatContext *s, | ||||
|                                         enum AVDevToAppMessageType type, | ||||
|                                         void *data, size_t data_size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Following API allows user to probe device capabilities (supported codecs, | ||||
|  * pixel formats, sample formats, resolutions, channel counts, etc). | ||||
|  * It is build on top op AVOption API. | ||||
|  * Queried capabilities make it possible to set up converters of video or audio | ||||
|  * parameters that fit to the device. | ||||
|  * | ||||
|  * List of capabilities that can be queried: | ||||
|  *  - Capabilities valid for both audio and video devices: | ||||
|  *    - codec:          supported audio/video codecs. | ||||
|  *                      type: AV_OPT_TYPE_INT (AVCodecID value) | ||||
|  *  - Capabilities valid for audio devices: | ||||
|  *    - sample_format:  supported sample formats. | ||||
|  *                      type: AV_OPT_TYPE_INT (AVSampleFormat value) | ||||
|  *    - sample_rate:    supported sample rates. | ||||
|  *                      type: AV_OPT_TYPE_INT | ||||
|  *    - channels:       supported number of channels. | ||||
|  *                      type: AV_OPT_TYPE_INT | ||||
|  *    - channel_layout: supported channel layouts. | ||||
|  *                      type: AV_OPT_TYPE_INT64 | ||||
|  *  - Capabilities valid for video devices: | ||||
|  *    - pixel_format:   supported pixel formats. | ||||
|  *                      type: AV_OPT_TYPE_INT (AVPixelFormat value) | ||||
|  *    - window_size:    supported window sizes (describes size of the window size presented to the user). | ||||
|  *                      type: AV_OPT_TYPE_IMAGE_SIZE | ||||
|  *    - frame_size:     supported frame sizes (describes size of provided video frames). | ||||
|  *                      type: AV_OPT_TYPE_IMAGE_SIZE | ||||
|  *    - fps:            supported fps values | ||||
|  *                      type: AV_OPT_TYPE_RATIONAL | ||||
|  * | ||||
|  * Value of the capability may be set by user using av_opt_set() function | ||||
|  * and AVDeviceCapabilitiesQuery object. Following queries will | ||||
|  * limit results to the values matching already set capabilities. | ||||
|  * For example, setting a codec may impact number of formats or fps values | ||||
|  * returned during next query. Setting invalid value may limit results to zero. | ||||
|  * | ||||
|  * Example of the usage basing on opengl output device: | ||||
|  * | ||||
|  * @code | ||||
|  *  AVFormatContext *oc = NULL; | ||||
|  *  AVDeviceCapabilitiesQuery *caps = NULL; | ||||
|  *  AVOptionRanges *ranges; | ||||
|  *  int ret; | ||||
|  * | ||||
|  *  if ((ret = avformat_alloc_output_context2(&oc, NULL, "opengl", NULL)) < 0) | ||||
|  *      goto fail; | ||||
|  *  if (avdevice_capabilities_create(&caps, oc, NULL) < 0) | ||||
|  *      goto fail; | ||||
|  * | ||||
|  *  //query codecs
 | ||||
|  *  if (av_opt_query_ranges(&ranges, caps, "codec", AV_OPT_MULTI_COMPONENT_RANGE)) < 0) | ||||
|  *      goto fail; | ||||
|  *  //pick codec here and set it
 | ||||
|  *  av_opt_set(caps, "codec", AV_CODEC_ID_RAWVIDEO, 0); | ||||
|  * | ||||
|  *  //query format
 | ||||
|  *  if (av_opt_query_ranges(&ranges, caps, "pixel_format", AV_OPT_MULTI_COMPONENT_RANGE)) < 0) | ||||
|  *      goto fail; | ||||
|  *  //pick format here and set it
 | ||||
|  *  av_opt_set(caps, "pixel_format", AV_PIX_FMT_YUV420P, 0); | ||||
|  * | ||||
|  *  //query and set more capabilities
 | ||||
|  * | ||||
|  * fail: | ||||
|  *  //clean up code
 | ||||
|  *  avdevice_capabilities_free(&query, oc); | ||||
|  *  avformat_free_context(oc); | ||||
|  * @endcode | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Structure describes device capabilities. | ||||
|  * | ||||
|  * It is used by devices in conjunction with av_device_capabilities AVOption table | ||||
|  * to implement capabilities probing API based on AVOption API. Should not be used directly. | ||||
|  */ | ||||
| typedef struct AVDeviceCapabilitiesQuery { | ||||
|     const AVClass *av_class; | ||||
|     AVFormatContext *device_context; | ||||
|     enum AVCodecID codec; | ||||
|     enum AVSampleFormat sample_format; | ||||
|     enum AVPixelFormat pixel_format; | ||||
|     int sample_rate; | ||||
|     int channels; | ||||
|     int64_t channel_layout; | ||||
|     int window_width; | ||||
|     int window_height; | ||||
|     int frame_width; | ||||
|     int frame_height; | ||||
|     AVRational fps; | ||||
| } AVDeviceCapabilitiesQuery; | ||||
| 
 | ||||
| /**
 | ||||
|  * AVOption table used by devices to implement device capabilities API. Should not be used by a user. | ||||
|  */ | ||||
| extern const AVOption av_device_capabilities[]; | ||||
| 
 | ||||
| /**
 | ||||
|  * Initialize capabilities probing API based on AVOption API. | ||||
|  * | ||||
|  * avdevice_capabilities_free() must be called when query capabilities API is | ||||
|  * not used anymore. | ||||
|  * | ||||
|  * @param[out] caps      Device capabilities data. Pointer to a NULL pointer must be passed. | ||||
|  * @param s              Context of the device. | ||||
|  * @param device_options An AVDictionary filled with device-private options. | ||||
|  *                       On return this parameter will be destroyed and replaced with a dict | ||||
|  *                       containing options that were not found. May be NULL. | ||||
|  *                       The same options must be passed later to avformat_write_header() for output | ||||
|  *                       devices or avformat_open_input() for input devices, or at any other place | ||||
|  *                       that affects device-private options. | ||||
|  * | ||||
|  * @return >= 0 on success, negative otherwise. | ||||
|  */ | ||||
| int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, | ||||
|                                  AVDictionary **device_options); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free resources created by avdevice_capabilities_create() | ||||
|  * | ||||
|  * @param caps Device capabilities data to be freed. | ||||
|  * @param s    Context of the device. | ||||
|  */ | ||||
| void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s); | ||||
| 
 | ||||
| /**
 | ||||
|  * Structure describes basic parameters of the device. | ||||
|  */ | ||||
| typedef struct AVDeviceInfo { | ||||
|     char *device_name;                   /**< device name, format depends on device */ | ||||
|     char *device_description;            /**< human friendly name */ | ||||
| } AVDeviceInfo; | ||||
| 
 | ||||
| /**
 | ||||
|  * List of devices. | ||||
|  */ | ||||
| typedef struct AVDeviceInfoList { | ||||
|     AVDeviceInfo **devices;              /**< list of autodetected devices */ | ||||
|     int nb_devices;                      /**< number of autodetected devices */ | ||||
|     int default_device;                  /**< index of default device or -1 if no default */ | ||||
| } AVDeviceInfoList; | ||||
| 
 | ||||
| /**
 | ||||
|  * List devices. | ||||
|  * | ||||
|  * Returns available device names and their parameters. | ||||
|  * | ||||
|  * @note: Some devices may accept system-dependent device names that cannot be | ||||
|  *        autodetected. The list returned by this function cannot be assumed to | ||||
|  *        be always completed. | ||||
|  * | ||||
|  * @param s                device context. | ||||
|  * @param[out] device_list list of autodetected devices. | ||||
|  * @return count of autodetected devices, negative on error. | ||||
|  */ | ||||
| int avdevice_list_devices(struct AVFormatContext *s, AVDeviceInfoList **device_list); | ||||
| 
 | ||||
| /**
 | ||||
|  * Convenient function to free result of avdevice_list_devices(). | ||||
|  * | ||||
|  * @param devices device list to be freed. | ||||
|  */ | ||||
| void avdevice_free_list_devices(AVDeviceInfoList **device_list); | ||||
| 
 | ||||
| /**
 | ||||
|  * List devices. | ||||
|  * | ||||
|  * Returns available device names and their parameters. | ||||
|  * These are convinient wrappers for avdevice_list_devices(). | ||||
|  * Device context is allocated and deallocated internally. | ||||
|  * | ||||
|  * @param device           device format. May be NULL if device name is set. | ||||
|  * @param device_name      device name. May be NULL if device format is set. | ||||
|  * @param device_options   An AVDictionary filled with device-private options. May be NULL. | ||||
|  *                         The same options must be passed later to avformat_write_header() for output | ||||
|  *                         devices or avformat_open_input() for input devices, or at any other place | ||||
|  *                         that affects device-private options. | ||||
|  * @param[out] device_list list of autodetected devices | ||||
|  * @return count of autodetected devices, negative on error. | ||||
|  * @note device argument takes precedence over device_name when both are set. | ||||
|  */ | ||||
| int avdevice_list_input_sources(struct AVInputFormat *device, const char *device_name, | ||||
|                                 AVDictionary *device_options, AVDeviceInfoList **device_list); | ||||
| int avdevice_list_output_sinks(struct AVOutputFormat *device, const char *device_name, | ||||
|                                AVDictionary *device_options, AVDeviceInfoList **device_list); | ||||
| 
 | ||||
| #endif /* AVDEVICE_AVDEVICE_H */ | ||||
| @ -0,0 +1,50 @@ | ||||
| /*
 | ||||
|  * 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 AVDEVICE_VERSION_H | ||||
| #define AVDEVICE_VERSION_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup lavd | ||||
|  * Libavdevice version macros | ||||
|  */ | ||||
| 
 | ||||
| #include "libavutil/version.h" | ||||
| 
 | ||||
| #define LIBAVDEVICE_VERSION_MAJOR  57 | ||||
| #define LIBAVDEVICE_VERSION_MINOR   0 | ||||
| #define LIBAVDEVICE_VERSION_MICRO 101 | ||||
| 
 | ||||
| #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ | ||||
|                                                LIBAVDEVICE_VERSION_MINOR, \
 | ||||
|                                                LIBAVDEVICE_VERSION_MICRO) | ||||
| #define LIBAVDEVICE_VERSION     AV_VERSION(LIBAVDEVICE_VERSION_MAJOR, \ | ||||
|                                            LIBAVDEVICE_VERSION_MINOR, \
 | ||||
|                                            LIBAVDEVICE_VERSION_MICRO) | ||||
| #define LIBAVDEVICE_BUILD       LIBAVDEVICE_VERSION_INT | ||||
| 
 | ||||
| #define LIBAVDEVICE_IDENT       "Lavd" AV_STRINGIFY(LIBAVDEVICE_VERSION) | ||||
| 
 | ||||
| /**
 | ||||
|  * 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. | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVDEVICE_VERSION_H */ | ||||
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						| @ -0,0 +1,28 @@ | ||||
| /*
 | ||||
|  * Filter graphs | ||||
|  * copyright (c) 2007 Bobby Bingham | ||||
|  * | ||||
|  * 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 AVFILTER_AVFILTERGRAPH_H | ||||
| #define AVFILTER_AVFILTERGRAPH_H | ||||
| 
 | ||||
| #include "avfilter.h" | ||||
| #include "libavutil/log.h" | ||||
| 
 | ||||
| #endif /* AVFILTER_AVFILTERGRAPH_H */ | ||||
| @ -0,0 +1,147 @@ | ||||
| /*
 | ||||
|  * 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 AVFILTER_BUFFERSINK_H | ||||
| #define AVFILTER_BUFFERSINK_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup lavfi_buffersink | ||||
|  * memory buffer sink API for audio and video | ||||
|  */ | ||||
| 
 | ||||
| #include "avfilter.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavfi_buffersink Buffer sink API | ||||
|  * @ingroup lavfi | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Get a frame with filtered data from sink and put it in frame. | ||||
|  * | ||||
|  * @param ctx    pointer to a buffersink or abuffersink filter context. | ||||
|  * @param frame  pointer to an allocated frame that will be filled with data. | ||||
|  *               The data must be freed using av_frame_unref() / av_frame_free() | ||||
|  * @param flags  a combination of AV_BUFFERSINK_FLAG_* flags | ||||
|  * | ||||
|  * @return  >= 0 in for success, a negative AVERROR code for failure. | ||||
|  */ | ||||
| int av_buffersink_get_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flags); | ||||
| 
 | ||||
| /**
 | ||||
|  * Tell av_buffersink_get_buffer_ref() to read video/samples buffer | ||||
|  * reference, but not remove it from the buffer. This is useful if you | ||||
|  * need only to read a video/samples buffer, without to fetch it. | ||||
|  */ | ||||
| #define AV_BUFFERSINK_FLAG_PEEK 1 | ||||
| 
 | ||||
| /**
 | ||||
|  * Tell av_buffersink_get_buffer_ref() not to request a frame from its input. | ||||
|  * If a frame is already buffered, it is read (and removed from the buffer), | ||||
|  * but if no frame is present, return AVERROR(EAGAIN). | ||||
|  */ | ||||
| #define AV_BUFFERSINK_FLAG_NO_REQUEST 2 | ||||
| 
 | ||||
| /**
 | ||||
|  * Struct to use for initializing a buffersink context. | ||||
|  */ | ||||
| typedef struct { | ||||
|     const enum AVPixelFormat *pixel_fmts; ///< list of allowed pixel formats, terminated by AV_PIX_FMT_NONE
 | ||||
| } AVBufferSinkParams; | ||||
| 
 | ||||
| /**
 | ||||
|  * Create an AVBufferSinkParams structure. | ||||
|  * | ||||
|  * Must be freed with av_free(). | ||||
|  */ | ||||
| AVBufferSinkParams *av_buffersink_params_alloc(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Struct to use for initializing an abuffersink context. | ||||
|  */ | ||||
| typedef struct { | ||||
|     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
 | ||||
|     int all_channel_counts;                 ///< if not 0, accept any channel count or layout
 | ||||
|     int *sample_rates;                      ///< list of allowed sample rates, terminated by -1
 | ||||
| } AVABufferSinkParams; | ||||
| 
 | ||||
| /**
 | ||||
|  * Create an AVABufferSinkParams structure. | ||||
|  * | ||||
|  * Must be freed with av_free(). | ||||
|  */ | ||||
| AVABufferSinkParams *av_abuffersink_params_alloc(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Set the frame size for an audio buffer sink. | ||||
|  * | ||||
|  * All calls to av_buffersink_get_buffer_ref will return a buffer with | ||||
|  * exactly the specified number of samples, or AVERROR(EAGAIN) if there is | ||||
|  * not enough. The last buffer at EOF will be padded with 0. | ||||
|  */ | ||||
| void av_buffersink_set_frame_size(AVFilterContext *ctx, unsigned frame_size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the frame rate of the input. | ||||
|  */ | ||||
| AVRational av_buffersink_get_frame_rate(AVFilterContext *ctx); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get a frame with filtered data from sink and put it in frame. | ||||
|  * | ||||
|  * @param ctx pointer to a context of a buffersink or abuffersink AVFilter. | ||||
|  * @param frame pointer to an allocated frame that will be filled with data. | ||||
|  *              The data must be freed using av_frame_unref() / av_frame_free() | ||||
|  * | ||||
|  * @return | ||||
|  *         - >= 0 if a frame was successfully returned. | ||||
|  *         - AVERROR(EAGAIN) if no frames are available at this point; more | ||||
|  *           input frames must be added to the filtergraph to get more output. | ||||
|  *         - AVERROR_EOF if there will be no more output frames on this sink. | ||||
|  *         - A different negative AVERROR code in other failure cases. | ||||
|  */ | ||||
| int av_buffersink_get_frame(AVFilterContext *ctx, AVFrame *frame); | ||||
| 
 | ||||
| /**
 | ||||
|  * Same as av_buffersink_get_frame(), but with the ability to specify the number | ||||
|  * of samples read. This function is less efficient than | ||||
|  * av_buffersink_get_frame(), because it copies the data around. | ||||
|  * | ||||
|  * @param ctx pointer to a context of the abuffersink AVFilter. | ||||
|  * @param frame pointer to an allocated frame that will be filled with data. | ||||
|  *              The data must be freed using av_frame_unref() / av_frame_free() | ||||
|  *              frame will contain exactly nb_samples audio samples, except at | ||||
|  *              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(). | ||||
|  * | ||||
|  * @warning do not mix this function with av_buffersink_get_frame(). Use only one or | ||||
|  * the other with a single sink, not both. | ||||
|  */ | ||||
| int av_buffersink_get_samples(AVFilterContext *ctx, AVFrame *frame, int nb_samples); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVFILTER_BUFFERSINK_H */ | ||||
| @ -0,0 +1,129 @@ | ||||
| /*
 | ||||
|  * | ||||
|  * 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 AVFILTER_BUFFERSRC_H | ||||
| #define AVFILTER_BUFFERSRC_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup lavfi_buffersrc | ||||
|  * Memory buffer source API. | ||||
|  */ | ||||
| 
 | ||||
| #include "libavcodec/avcodec.h" | ||||
| #include "avfilter.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavfi_buffersrc Buffer source API | ||||
|  * @ingroup lavfi | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| enum { | ||||
| 
 | ||||
|     /**
 | ||||
|      * Do not check for format changes. | ||||
|      */ | ||||
|     AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT = 1, | ||||
| 
 | ||||
|     /**
 | ||||
|      * Immediately push the frame to the output. | ||||
|      */ | ||||
|     AV_BUFFERSRC_FLAG_PUSH = 4, | ||||
| 
 | ||||
|     /**
 | ||||
|      * Keep a reference to the frame. | ||||
|      * If the frame if reference-counted, create a new reference; otherwise | ||||
|      * copy the frame data. | ||||
|      */ | ||||
|     AV_BUFFERSRC_FLAG_KEEP_REF = 8, | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the number of failed requests. | ||||
|  * | ||||
|  * A failed request is when the request_frame method is called while no | ||||
|  * frame is present in the buffer. | ||||
|  * The number is reset when a frame is added. | ||||
|  */ | ||||
| unsigned av_buffersrc_get_nb_failed_requests(AVFilterContext *buffer_src); | ||||
| 
 | ||||
| /**
 | ||||
|  * Add a frame to the buffer source. | ||||
|  * | ||||
|  * @param ctx   an instance of the buffersrc filter | ||||
|  * @param frame frame to be added. If the frame is reference counted, this | ||||
|  * function will make a new reference to it. Otherwise the frame data will be | ||||
|  * copied. | ||||
|  * | ||||
|  * @return 0 on success, a negative AVERROR on error | ||||
|  * | ||||
|  * This function is equivalent to av_buffersrc_add_frame_flags() with the | ||||
|  * AV_BUFFERSRC_FLAG_KEEP_REF flag. | ||||
|  */ | ||||
| av_warn_unused_result | ||||
| int av_buffersrc_write_frame(AVFilterContext *ctx, const AVFrame *frame); | ||||
| 
 | ||||
| /**
 | ||||
|  * Add a frame to the buffer source. | ||||
|  * | ||||
|  * @param ctx   an instance of the buffersrc filter | ||||
|  * @param frame frame to be added. If the frame is reference counted, this | ||||
|  * function will take ownership of the reference(s) and reset the frame. | ||||
|  * Otherwise the frame data will be copied. If this function returns an error, | ||||
|  * the input frame is not touched. | ||||
|  * | ||||
|  * @return 0 on success, a negative AVERROR on error. | ||||
|  * | ||||
|  * @note the difference between this function and av_buffersrc_write_frame() is | ||||
|  * that av_buffersrc_write_frame() creates a new reference to the input frame, | ||||
|  * while this function takes ownership of the reference passed to it. | ||||
|  * | ||||
|  * This function is equivalent to av_buffersrc_add_frame_flags() without the | ||||
|  * AV_BUFFERSRC_FLAG_KEEP_REF flag. | ||||
|  */ | ||||
| av_warn_unused_result | ||||
| int av_buffersrc_add_frame(AVFilterContext *ctx, AVFrame *frame); | ||||
| 
 | ||||
| /**
 | ||||
|  * Add a frame to the buffer source. | ||||
|  * | ||||
|  * By default, if the frame is reference-counted, this function will take | ||||
|  * ownership of the reference(s) and reset the frame. This can be controlled | ||||
|  * using the flags. | ||||
|  * | ||||
|  * If this function returns an error, the input frame is not touched. | ||||
|  * | ||||
|  * @param buffer_src  pointer to a buffer source context | ||||
|  * @param frame       a frame, or NULL to mark EOF | ||||
|  * @param flags       a combination of AV_BUFFERSRC_FLAG_* | ||||
|  * @return            >= 0 in case of success, a negative AVERROR code | ||||
|  *                    in case of failure | ||||
|  */ | ||||
| av_warn_unused_result | ||||
| int av_buffersrc_add_frame_flags(AVFilterContext *buffer_src, | ||||
|                                  AVFrame *frame, int flags); | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVFILTER_BUFFERSRC_H */ | ||||
| @ -0,0 +1,71 @@ | ||||
| /*
 | ||||
|  * Version macros. | ||||
|  * | ||||
|  * 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 AVFILTER_VERSION_H | ||||
| #define AVFILTER_VERSION_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup lavfi | ||||
|  * Libavfilter version macros | ||||
|  */ | ||||
| 
 | ||||
| #include "libavutil/version.h" | ||||
| 
 | ||||
| #define LIBAVFILTER_VERSION_MAJOR   6 | ||||
| #define LIBAVFILTER_VERSION_MINOR  31 | ||||
| #define LIBAVFILTER_VERSION_MICRO 100 | ||||
| 
 | ||||
| #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ | ||||
|                                                LIBAVFILTER_VERSION_MINOR, \
 | ||||
|                                                LIBAVFILTER_VERSION_MICRO) | ||||
| #define LIBAVFILTER_VERSION     AV_VERSION(LIBAVFILTER_VERSION_MAJOR,   \ | ||||
|                                            LIBAVFILTER_VERSION_MINOR,   \
 | ||||
|                                            LIBAVFILTER_VERSION_MICRO) | ||||
| #define LIBAVFILTER_BUILD       LIBAVFILTER_VERSION_INT | ||||
| 
 | ||||
| #define LIBAVFILTER_IDENT       "Lavfi" AV_STRINGIFY(LIBAVFILTER_VERSION) | ||||
| 
 | ||||
| /**
 | ||||
|  * 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. | ||||
|  */ | ||||
| 
 | ||||
| #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) | ||||
| #endif | ||||
| #ifndef FF_API_AVFILTER_OPEN | ||||
| #define FF_API_AVFILTER_OPEN                (LIBAVFILTER_VERSION_MAJOR < 7) | ||||
| #endif | ||||
| #ifndef FF_API_AVFILTER_INIT_FILTER | ||||
| #define FF_API_AVFILTER_INIT_FILTER         (LIBAVFILTER_VERSION_MAJOR < 7) | ||||
| #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) | ||||
| #endif | ||||
| 
 | ||||
| #endif /* AVFILTER_VERSION_H */ | ||||
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						| @ -0,0 +1,732 @@ | ||||
| /*
 | ||||
|  * copyright (c) 2001 Fabrice Bellard | ||||
|  * | ||||
|  * 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 AVFORMAT_AVIO_H | ||||
| #define AVFORMAT_AVIO_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup lavf_io | ||||
|  * Buffered I/O operations | ||||
|  */ | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "libavutil/common.h" | ||||
| #include "libavutil/dict.h" | ||||
| #include "libavutil/log.h" | ||||
| 
 | ||||
| #include "libavformat/version.h" | ||||
| 
 | ||||
| #define AVIO_SEEKABLE_NORMAL 0x0001 /**< Seeking works like for a local file */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Callback for checking whether to abort blocking functions. | ||||
|  * AVERROR_EXIT is returned in this case by the interrupted | ||||
|  * function. During blocking operations, callback is called with | ||||
|  * opaque as parameter. If the callback returns 1, the | ||||
|  * blocking operation will be aborted. | ||||
|  * | ||||
|  * No members can be added to this struct without a major bump, if | ||||
|  * new elements have been added after this struct in AVFormatContext | ||||
|  * or AVIOContext. | ||||
|  */ | ||||
| typedef struct AVIOInterruptCB { | ||||
|     int (*callback)(void*); | ||||
|     void *opaque; | ||||
| } AVIOInterruptCB; | ||||
| 
 | ||||
| /**
 | ||||
|  * Directory entry types. | ||||
|  */ | ||||
| enum AVIODirEntryType { | ||||
|     AVIO_ENTRY_UNKNOWN, | ||||
|     AVIO_ENTRY_BLOCK_DEVICE, | ||||
|     AVIO_ENTRY_CHARACTER_DEVICE, | ||||
|     AVIO_ENTRY_DIRECTORY, | ||||
|     AVIO_ENTRY_NAMED_PIPE, | ||||
|     AVIO_ENTRY_SYMBOLIC_LINK, | ||||
|     AVIO_ENTRY_SOCKET, | ||||
|     AVIO_ENTRY_FILE, | ||||
|     AVIO_ENTRY_SERVER, | ||||
|     AVIO_ENTRY_SHARE, | ||||
|     AVIO_ENTRY_WORKGROUP, | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Describes single entry of the directory. | ||||
|  * | ||||
|  * Only name and type fields are guaranteed be set. | ||||
|  * Rest of fields are protocol or/and platform dependent and might be unknown. | ||||
|  */ | ||||
| typedef struct AVIODirEntry { | ||||
|     char *name;                           /**< Filename */ | ||||
|     int type;                             /**< Type of the entry */ | ||||
|     int utf8;                             /**< Set to 1 when name is encoded with UTF-8, 0 otherwise.
 | ||||
|                                                Name can be encoded with UTF-8 even though 0 is set. */ | ||||
|     int64_t size;                         /**< File size in bytes, -1 if unknown. */ | ||||
|     int64_t modification_timestamp;       /**< Time of last modification in microseconds since unix
 | ||||
|                                                epoch, -1 if unknown. */ | ||||
|     int64_t access_timestamp;             /**< Time of last access in microseconds since unix epoch,
 | ||||
|                                                -1 if unknown. */ | ||||
|     int64_t status_change_timestamp;      /**< Time of last status change in microseconds since unix
 | ||||
|                                                epoch, -1 if unknown. */ | ||||
|     int64_t user_id;                      /**< User ID of owner, -1 if unknown. */ | ||||
|     int64_t group_id;                     /**< Group ID of owner, -1 if unknown. */ | ||||
|     int64_t filemode;                     /**< Unix file mode, -1 if unknown. */ | ||||
| } AVIODirEntry; | ||||
| 
 | ||||
| typedef struct AVIODirContext { | ||||
|     struct URLContext *url_context; | ||||
| } AVIODirContext; | ||||
| 
 | ||||
| /**
 | ||||
|  * Bytestream IO Context. | ||||
|  * New fields can be added to the end with minor version bumps. | ||||
|  * Removal, reordering and changes to existing fields require a major | ||||
|  * version bump. | ||||
|  * sizeof(AVIOContext) must not be used outside libav*. | ||||
|  * | ||||
|  * @note None of the function pointers in AVIOContext should be called | ||||
|  *       directly, they should only be set by the client application | ||||
|  *       when implementing custom I/O. Normally these are set to the | ||||
|  *       function pointers specified in avio_alloc_context() | ||||
|  */ | ||||
| typedef struct AVIOContext { | ||||
|     /**
 | ||||
|      * A class for private options. | ||||
|      * | ||||
|      * If this AVIOContext is created by avio_open2(), av_class is set and | ||||
|      * passes the options down to protocols. | ||||
|      * | ||||
|      * If this AVIOContext is manually allocated, then av_class may be set by | ||||
|      * the caller. | ||||
|      * | ||||
|      * warning -- this field can be NULL, be sure to not pass this AVIOContext | ||||
|      * to any av_opt_* functions in that case. | ||||
|      */ | ||||
|     const AVClass *av_class; | ||||
| 
 | ||||
|     /*
 | ||||
|      * The following shows the relationship between buffer, buf_ptr, 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          | | ||||
|      *                                          |-------------------------------| | ||||
|      *                                          |                               | | ||||
|      * | ||||
|      *                                       buffer              buf_ptr     buf_end | ||||
|      *                                          +-------------------+-----------+ | ||||
|      *                                          |/ / / / / / / / / /|           | | ||||
|      *  write buffer:                           | / to be flushed / |           | | ||||
|      *                                          |/ / / / / / / / / /|           | | ||||
|      *                                          +-------------------+-----------+ | ||||
|      * | ||||
|      *                                         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 */ | ||||
|     unsigned char *buf_end; /**< End of the data, may be less than
 | ||||
|                                  buffer+buffer_size if the read function returned | ||||
|                                  less data than requested, e.g. for streams where | ||||
|                                  no more data has been received yet. */ | ||||
|     void *opaque;           /**< A private pointer, passed to the read/write/seek/...
 | ||||
|                                  functions. */ | ||||
|     int (*read_packet)(void *opaque, uint8_t *buf, int buf_size); | ||||
|     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 write_flag;         /**< true if open for writing */ | ||||
|     int max_packet_size; | ||||
|     unsigned long checksum; | ||||
|     unsigned char *checksum_ptr; | ||||
|     unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size); | ||||
|     int error;              /**< contains the error code or 0 if no error happened */ | ||||
|     /**
 | ||||
|      * Pause or resume playback for network streaming protocols - e.g. MMS. | ||||
|      */ | ||||
|     int (*read_pause)(void *opaque, int pause); | ||||
|     /**
 | ||||
|      * Seek to a given timestamp in stream with the specified stream_index. | ||||
|      * Needed for some network streaming protocols which don't support seeking | ||||
|      * to byte position. | ||||
|      */ | ||||
|     int64_t (*read_seek)(void *opaque, int stream_index, | ||||
|                          int64_t timestamp, int flags); | ||||
|     /**
 | ||||
|      * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable. | ||||
|      */ | ||||
|     int seekable; | ||||
| 
 | ||||
|     /**
 | ||||
|      * max filesize, used to limit allocations | ||||
|      * This field is internal to libavformat and access from outside is not allowed. | ||||
|      */ | ||||
|     int64_t maxsize; | ||||
| 
 | ||||
|     /**
 | ||||
|      * avio_read and avio_write should if possible be satisfied directly | ||||
|      * instead of going through a buffer, and avio_seek will always | ||||
|      * call the underlying seek function directly. | ||||
|      */ | ||||
|     int direct; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Bytes read statistic | ||||
|      * This field is internal to libavformat and access from outside is not allowed. | ||||
|      */ | ||||
|     int64_t bytes_read; | ||||
| 
 | ||||
|     /**
 | ||||
|      * seek statistic | ||||
|      * This field is internal to libavformat and access from outside is not allowed. | ||||
|      */ | ||||
|     int seek_count; | ||||
| 
 | ||||
|     /**
 | ||||
|      * writeout statistic | ||||
|      * This field is internal to libavformat and access from outside is not allowed. | ||||
|      */ | ||||
|     int writeout_count; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Original buffer size | ||||
|      * used internally after probing and ensure seekback to reset the buffer size | ||||
|      * This field is internal to libavformat and access from outside is not allowed. | ||||
|      */ | ||||
|     int orig_buffer_size; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Threshold to favor readahead over seek. | ||||
|      * This is current internal only, do not use from outside. | ||||
|      */ | ||||
|     int short_seek_threshold; | ||||
| 
 | ||||
|     /**
 | ||||
|      * ',' separated list of allowed protocols. | ||||
|      */ | ||||
|     const char *protocol_whitelist; | ||||
| } AVIOContext; | ||||
| 
 | ||||
| /* unbuffered I/O */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the name of the protocol that will handle the passed URL. | ||||
|  * | ||||
|  * NULL is returned if no protocol could be found for the given URL. | ||||
|  * | ||||
|  * @return Name of the protocol or NULL. | ||||
|  */ | ||||
| const char *avio_find_protocol_name(const char *url); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return AVIO_FLAG_* access flags corresponding to the access permissions | ||||
|  * of the resource in url, or a negative value corresponding to an | ||||
|  * AVERROR code in case of failure. The returned access flags are | ||||
|  * masked by the value in flags. | ||||
|  * | ||||
|  * @note This function is intrinsically unsafe, in the sense that the | ||||
|  * checked resource may change its existence or permission status from | ||||
|  * one call to another. Thus you should not trust the returned value, | ||||
|  * unless you are sure that no other processes are accessing the | ||||
|  * checked resource. | ||||
|  */ | ||||
| int avio_check(const char *url, int flags); | ||||
| 
 | ||||
| /**
 | ||||
|  * Move or rename a resource. | ||||
|  * | ||||
|  * @note url_src and url_dst should share the same protocol and authority. | ||||
|  * | ||||
|  * @param url_src url to resource to be moved | ||||
|  * @param url_dst new url to resource if the operation succeeded | ||||
|  * @return >=0 on success or negative on error. | ||||
|  */ | ||||
| int avpriv_io_move(const char *url_src, const char *url_dst); | ||||
| 
 | ||||
| /**
 | ||||
|  * Delete a resource. | ||||
|  * | ||||
|  * @param url resource to be deleted. | ||||
|  * @return >=0 on success or negative on error. | ||||
|  */ | ||||
| int avpriv_io_delete(const char *url); | ||||
| 
 | ||||
| /**
 | ||||
|  * Open directory for reading. | ||||
|  * | ||||
|  * @param s       directory read context. Pointer to a NULL pointer must be passed. | ||||
|  * @param url     directory to be listed. | ||||
|  * @param options A dictionary filled with protocol-private options. On return | ||||
|  *                this parameter will be destroyed and replaced with a dictionary | ||||
|  *                containing options that were not found. May be NULL. | ||||
|  * @return >=0 on success or negative on error. | ||||
|  */ | ||||
| int avio_open_dir(AVIODirContext **s, const char *url, AVDictionary **options); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get next directory entry. | ||||
|  * | ||||
|  * Returned entry must be freed with avio_free_directory_entry(). In particular | ||||
|  * it may outlive AVIODirContext. | ||||
|  * | ||||
|  * @param s         directory read context. | ||||
|  * @param[out] next next entry or NULL when no more entries. | ||||
|  * @return >=0 on success or negative on error. End of list is not considered an | ||||
|  *             error. | ||||
|  */ | ||||
| int avio_read_dir(AVIODirContext *s, AVIODirEntry **next); | ||||
| 
 | ||||
| /**
 | ||||
|  * Close directory. | ||||
|  * | ||||
|  * @note Entries created using avio_read_dir() are not deleted and must be | ||||
|  * freeded with avio_free_directory_entry(). | ||||
|  * | ||||
|  * @param s         directory read context. | ||||
|  * @return >=0 on success or negative on error. | ||||
|  */ | ||||
| int avio_close_dir(AVIODirContext **s); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free entry allocated by avio_read_dir(). | ||||
|  * | ||||
|  * @param entry entry to be freed. | ||||
|  */ | ||||
| void avio_free_directory_entry(AVIODirEntry **entry); | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate and initialize an AVIOContext for buffered I/O. It must be later | ||||
|  * freed with av_free(). | ||||
|  * | ||||
|  * @param buffer Memory block for input/output operations via AVIOContext. | ||||
|  *        The buffer must be allocated with av_malloc() and friends. | ||||
|  *        It may be freed and replaced with a new buffer by libavformat. | ||||
|  *        AVIOContext.buffer holds the buffer currently in use, | ||||
|  *        which must be later freed with av_free(). | ||||
|  * @param buffer_size The buffer size is very important for performance. | ||||
|  *        For protocols with fixed blocksize it should be set to this blocksize. | ||||
|  *        For others a typical size is a cache page, e.g. 4kb. | ||||
|  * @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. | ||||
|  * @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. | ||||
|  * | ||||
|  * @return Allocated AVIOContext or NULL on failure. | ||||
|  */ | ||||
| AVIOContext *avio_alloc_context( | ||||
|                   unsigned char *buffer, | ||||
|                   int buffer_size, | ||||
|                   int write_flag, | ||||
|                   void *opaque, | ||||
|                   int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), | ||||
|                   int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), | ||||
|                   int64_t (*seek)(void *opaque, int64_t offset, int whence)); | ||||
| 
 | ||||
| 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); | ||||
| void avio_wb64(AVIOContext *s, uint64_t val); | ||||
| void avio_wl32(AVIOContext *s, unsigned int val); | ||||
| void avio_wb32(AVIOContext *s, unsigned int val); | ||||
| void avio_wl24(AVIOContext *s, unsigned int val); | ||||
| void avio_wb24(AVIOContext *s, unsigned int val); | ||||
| void avio_wl16(AVIOContext *s, unsigned int val); | ||||
| void avio_wb16(AVIOContext *s, unsigned int val); | ||||
| 
 | ||||
| /**
 | ||||
|  * Write a NULL-terminated string. | ||||
|  * @return number of bytes written. | ||||
|  */ | ||||
| int avio_put_str(AVIOContext *s, const char *str); | ||||
| 
 | ||||
| /**
 | ||||
|  * Convert an UTF-8 string to UTF-16LE and write it. | ||||
|  * @param s the AVIOContext | ||||
|  * @param str NULL-terminated UTF-8 string | ||||
|  * | ||||
|  * @return number of bytes written. | ||||
|  */ | ||||
| int avio_put_str16le(AVIOContext *s, const char *str); | ||||
| 
 | ||||
| /**
 | ||||
|  * Convert an UTF-8 string to UTF-16BE and write it. | ||||
|  * @param s the AVIOContext | ||||
|  * @param str NULL-terminated UTF-8 string | ||||
|  * | ||||
|  * @return number of bytes written. | ||||
|  */ | ||||
| int avio_put_str16be(AVIOContext *s, const char *str); | ||||
| 
 | ||||
| /**
 | ||||
|  * Passing 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 | ||||
|  * 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. | ||||
|  */ | ||||
| #define AVSEEK_FORCE 0x20000 | ||||
| 
 | ||||
| /**
 | ||||
|  * fseek() equivalent for AVIOContext. | ||||
|  * @return new position or AVERROR. | ||||
|  */ | ||||
| int64_t avio_seek(AVIOContext *s, int64_t offset, int whence); | ||||
| 
 | ||||
| /**
 | ||||
|  * Skip given number of bytes forward | ||||
|  * @return new position or AVERROR. | ||||
|  */ | ||||
| int64_t avio_skip(AVIOContext *s, int64_t offset); | ||||
| 
 | ||||
| /**
 | ||||
|  * ftell() equivalent for AVIOContext. | ||||
|  * @return position or AVERROR. | ||||
|  */ | ||||
| static av_always_inline int64_t avio_tell(AVIOContext *s) | ||||
| { | ||||
|     return avio_seek(s, 0, SEEK_CUR); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the filesize. | ||||
|  * @return filesize or AVERROR | ||||
|  */ | ||||
| int64_t avio_size(AVIOContext *s); | ||||
| 
 | ||||
| /**
 | ||||
|  * feof() equivalent for AVIOContext. | ||||
|  * @return non zero if and only if end of file | ||||
|  */ | ||||
| int avio_feof(AVIOContext *s); | ||||
| #if FF_API_URL_FEOF | ||||
| /**
 | ||||
|  * @deprecated use avio_feof() | ||||
|  */ | ||||
| attribute_deprecated | ||||
| int url_feof(AVIOContext *s); | ||||
| #endif | ||||
| 
 | ||||
| /** @warning Writes up to 4 KiB per call */ | ||||
| int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3); | ||||
| 
 | ||||
| /**
 | ||||
|  * Force flushing of buffered data. | ||||
|  * | ||||
|  * For write streams, force the buffered data to be immediately written to the output, | ||||
|  * without to wait to fill the internal buffer. | ||||
|  * | ||||
|  * For read streams, discard all currently buffered data, and advance the | ||||
|  * reported file position to that of the underlying stream. This does not | ||||
|  * read new data, and does not perform any seeks. | ||||
|  */ | ||||
| void avio_flush(AVIOContext *s); | ||||
| 
 | ||||
| /**
 | ||||
|  * Read size bytes from AVIOContext into buf. | ||||
|  * @return number of bytes read or AVERROR | ||||
|  */ | ||||
| int avio_read(AVIOContext *s, unsigned char *buf, int size); | ||||
| 
 | ||||
| /**
 | ||||
|  * @name Functions for reading from AVIOContext | ||||
|  * @{ | ||||
|  * | ||||
|  * @note return 0 if EOF, so you cannot use it if EOF handling is | ||||
|  *       necessary | ||||
|  */ | ||||
| int          avio_r8  (AVIOContext *s); | ||||
| unsigned int avio_rl16(AVIOContext *s); | ||||
| unsigned int avio_rl24(AVIOContext *s); | ||||
| unsigned int avio_rl32(AVIOContext *s); | ||||
| uint64_t     avio_rl64(AVIOContext *s); | ||||
| unsigned int avio_rb16(AVIOContext *s); | ||||
| unsigned int avio_rb24(AVIOContext *s); | ||||
| unsigned int avio_rb32(AVIOContext *s); | ||||
| uint64_t     avio_rb64(AVIOContext *s); | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Read a string from pb into buf. The reading will terminate when either | ||||
|  * a NULL character was encountered, maxlen bytes have been read, or nothing | ||||
|  * more can be read from pb. The result is guaranteed to be NULL-terminated, it | ||||
|  * will be truncated if buf is too small. | ||||
|  * Note that the string is not interpreted or validated in any way, it | ||||
|  * might get truncated in the middle of a sequence for multi-byte encodings. | ||||
|  * | ||||
|  * @return number of bytes read (is always <= maxlen). | ||||
|  * If reading ends on EOF or error, the return value will be one more than | ||||
|  * bytes actually read. | ||||
|  */ | ||||
| int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen); | ||||
| 
 | ||||
| /**
 | ||||
|  * Read a UTF-16 string from pb and convert it to UTF-8. | ||||
|  * The reading will terminate when either a null or invalid character was | ||||
|  * encountered or maxlen bytes have been read. | ||||
|  * @return number of bytes read (is always <= maxlen) | ||||
|  */ | ||||
| int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen); | ||||
| int avio_get_str16be(AVIOContext *pb, int maxlen, char *buf, int buflen); | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * @name URL open modes | ||||
|  * The flags argument to avio_open must be one of the following | ||||
|  * constants, optionally ORed with other flags. | ||||
|  * @{ | ||||
|  */ | ||||
| #define AVIO_FLAG_READ  1                                      /**< read-only */ | ||||
| #define AVIO_FLAG_WRITE 2                                      /**< write-only */ | ||||
| #define AVIO_FLAG_READ_WRITE (AVIO_FLAG_READ|AVIO_FLAG_WRITE)  /**< read-write pseudo flag */ | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Use non-blocking mode. | ||||
|  * If this flag is set, operations on the context will return | ||||
|  * AVERROR(EAGAIN) if they can not be performed immediately. | ||||
|  * If this flag is not set, operations on the context will never return | ||||
|  * AVERROR(EAGAIN). | ||||
|  * Note that this flag does not affect the opening/connecting of the | ||||
|  * context. Connecting a protocol will always block if necessary (e.g. on | ||||
|  * network protocols) but never hang (e.g. on busy devices). | ||||
|  * Warning: non-blocking protocols is work-in-progress; this flag may be | ||||
|  * silently ignored. | ||||
|  */ | ||||
| #define AVIO_FLAG_NONBLOCK 8 | ||||
| 
 | ||||
| /**
 | ||||
|  * Use direct mode. | ||||
|  * avio_read and avio_write should if possible be satisfied directly | ||||
|  * instead of going through a buffer, and avio_seek will always | ||||
|  * call the underlying seek function directly. | ||||
|  */ | ||||
| #define AVIO_FLAG_DIRECT 0x8000 | ||||
| 
 | ||||
| /**
 | ||||
|  * Create and initialize a AVIOContext for accessing the | ||||
|  * resource indicated by url. | ||||
|  * @note When the resource indicated by url has been opened in | ||||
|  * read+write mode, the AVIOContext can be used only for writing. | ||||
|  * | ||||
|  * @param s Used to return the pointer to the created AVIOContext. | ||||
|  * In case of failure the pointed to value is set to NULL. | ||||
|  * @param url resource to access | ||||
|  * @param flags flags which control how the resource indicated by url | ||||
|  * is to be opened | ||||
|  * @return >= 0 in case of success, a negative value corresponding to an | ||||
|  * AVERROR code in case of failure | ||||
|  */ | ||||
| int avio_open(AVIOContext **s, const char *url, int flags); | ||||
| 
 | ||||
| /**
 | ||||
|  * Create and initialize a AVIOContext for accessing the | ||||
|  * resource indicated by url. | ||||
|  * @note When the resource indicated by url has been opened in | ||||
|  * read+write mode, the AVIOContext can be used only for writing. | ||||
|  * | ||||
|  * @param s Used to return the pointer to the created AVIOContext. | ||||
|  * In case of failure the pointed to value is set to NULL. | ||||
|  * @param url resource to access | ||||
|  * @param flags flags which control how the resource indicated by url | ||||
|  * is to be opened | ||||
|  * @param int_cb an interrupt callback to be used at the protocols level | ||||
|  * @param options  A dictionary filled with protocol-private options. On return | ||||
|  * this parameter will be destroyed and replaced with a dict containing options | ||||
|  * that were not found. May be NULL. | ||||
|  * @return >= 0 in case of success, a negative value corresponding to an | ||||
|  * AVERROR code in case of failure | ||||
|  */ | ||||
| int avio_open2(AVIOContext **s, const char *url, int flags, | ||||
|                const AVIOInterruptCB *int_cb, AVDictionary **options); | ||||
| 
 | ||||
| /**
 | ||||
|  * Close the resource accessed by the AVIOContext s and free it. | ||||
|  * This function can only be used if s was opened by avio_open(). | ||||
|  * | ||||
|  * The internal buffer is automatically flushed before closing the | ||||
|  * resource. | ||||
|  * | ||||
|  * @return 0 on success, an AVERROR < 0 on error. | ||||
|  * @see avio_closep | ||||
|  */ | ||||
| int avio_close(AVIOContext *s); | ||||
| 
 | ||||
| /**
 | ||||
|  * Close the resource accessed by the AVIOContext *s, free it | ||||
|  * and set the pointer pointing to it to NULL. | ||||
|  * This function can only be used if s was opened by avio_open(). | ||||
|  * | ||||
|  * The internal buffer is automatically flushed before closing the | ||||
|  * resource. | ||||
|  * | ||||
|  * @return 0 on success, an AVERROR < 0 on error. | ||||
|  * @see avio_close | ||||
|  */ | ||||
| int avio_closep(AVIOContext **s); | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * Open a write only memory stream. | ||||
|  * | ||||
|  * @param s new IO context | ||||
|  * @return zero if no error. | ||||
|  */ | ||||
| int avio_open_dyn_buf(AVIOContext **s); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the written size and a pointer to the buffer. The buffer | ||||
|  * must be freed with av_free(). | ||||
|  * Padding of AV_INPUT_BUFFER_PADDING_SIZE 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_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer); | ||||
| 
 | ||||
| /**
 | ||||
|  * Iterate through names of available protocols. | ||||
|  * | ||||
|  * @param opaque A private pointer representing current protocol. | ||||
|  *        It must be a pointer to NULL on first iteration and will | ||||
|  *        be updated by successive calls to avio_enum_protocols. | ||||
|  * @param output If set to 1, iterate over output protocols, | ||||
|  *               otherwise over input protocols. | ||||
|  * | ||||
|  * @return A static string containing the name of current protocol or NULL | ||||
|  */ | ||||
| const char *avio_enum_protocols(void **opaque, int output); | ||||
| 
 | ||||
| /**
 | ||||
|  * Pause and resume playing - only meaningful if using a network streaming | ||||
|  * protocol (e.g. MMS). | ||||
|  * | ||||
|  * @param h     IO context from which to call the read_pause function pointer | ||||
|  * @param pause 1 for pause, 0 for resume | ||||
|  */ | ||||
| int     avio_pause(AVIOContext *h, int pause); | ||||
| 
 | ||||
| /**
 | ||||
|  * Seek to a given timestamp relative to some component stream. | ||||
|  * Only meaningful if using a network streaming protocol (e.g. MMS.). | ||||
|  * | ||||
|  * @param h IO context from which to call the seek function pointers | ||||
|  * @param stream_index The stream index that the timestamp is relative to. | ||||
|  *        If stream_index is (-1) the timestamp should be in AV_TIME_BASE | ||||
|  *        units from the beginning of the presentation. | ||||
|  *        If a stream_index >= 0 is used and the protocol does not support | ||||
|  *        seeking based on component streams, the call will fail. | ||||
|  * @param timestamp timestamp in AVStream.time_base units | ||||
|  *        or if there is no stream specified then in AV_TIME_BASE units. | ||||
|  * @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE | ||||
|  *        and AVSEEK_FLAG_ANY. The protocol may silently ignore | ||||
|  *        AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will | ||||
|  *        fail if used and not supported. | ||||
|  * @return >= 0 on success | ||||
|  * @see AVInputFormat::read_seek | ||||
|  */ | ||||
| int64_t avio_seek_time(AVIOContext *h, int stream_index, | ||||
|                        int64_t timestamp, int flags); | ||||
| 
 | ||||
| /* Avoid a warning. The header can not be included because it breaks c++. */ | ||||
| struct AVBPrint; | ||||
| 
 | ||||
| /**
 | ||||
|  * Read contents of h into print buffer, up to max_size bytes, or up to EOF. | ||||
|  * | ||||
|  * @return 0 for success (max_size bytes read or EOF reached), negative error | ||||
|  * code otherwise | ||||
|  */ | ||||
| int avio_read_to_bprint(AVIOContext *h, struct AVBPrint *pb, size_t max_size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Accept and allocate a client context on a server context. | ||||
|  * @param  s the server context | ||||
|  * @param  c the client context, must be unallocated | ||||
|  * @return   >= 0 on success or a negative value corresponding | ||||
|  *           to an AVERROR on failure | ||||
|  */ | ||||
| int avio_accept(AVIOContext *s, AVIOContext **c); | ||||
| 
 | ||||
| /**
 | ||||
|  * Perform one step of the protocol handshake to accept a new client. | ||||
|  * This function must be called on a client returned by avio_accept() before | ||||
|  * using it as a read/write context. | ||||
|  * It is separate from avio_accept() because it may block. | ||||
|  * A step of the handshake is defined by places where the application may | ||||
|  * decide to change the proceedings. | ||||
|  * For example, on a protocol with a request header and a reply header, each | ||||
|  * one can constitute a step because the application may use the parameters | ||||
|  * from the request to change parameters in the reply; or each individual | ||||
|  * chunk of the request can constitute a step. | ||||
|  * If the handshake is already finished, avio_handshake() does nothing and | ||||
|  * returns 0 immediately. | ||||
|  * | ||||
|  * @param  c the client context to perform the handshake on | ||||
|  * @return   0   on a complete and successful handshake | ||||
|  *           > 0 if the handshake progressed, but is not complete | ||||
|  *           < 0 for an AVERROR code | ||||
|  */ | ||||
| int avio_handshake(AVIOContext *c); | ||||
| #endif /* AVFORMAT_AVIO_H */ | ||||
| @ -0,0 +1,300 @@ | ||||
| /*
 | ||||
|  * Copyright (c) 2007 The FFmpeg Project | ||||
|  * | ||||
|  * 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 AVFORMAT_NETWORK_H | ||||
| #define AVFORMAT_NETWORK_H | ||||
| 
 | ||||
| #include <errno.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "config.h" | ||||
| #include "libavutil/error.h" | ||||
| #include "os_support.h" | ||||
| #include "avio.h" | ||||
| #include "url.h" | ||||
| 
 | ||||
| #if HAVE_UNISTD_H | ||||
| #include <unistd.h> | ||||
| #endif | ||||
| 
 | ||||
| #if HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #include <ws2tcpip.h> | ||||
| 
 | ||||
| #ifndef EPROTONOSUPPORT | ||||
| #define EPROTONOSUPPORT WSAEPROTONOSUPPORT | ||||
| #endif | ||||
| #ifndef ETIMEDOUT | ||||
| #define ETIMEDOUT       WSAETIMEDOUT | ||||
| #endif | ||||
| #ifndef ECONNREFUSED | ||||
| #define ECONNREFUSED    WSAECONNREFUSED | ||||
| #endif | ||||
| #ifndef EINPROGRESS | ||||
| #define EINPROGRESS     WSAEINPROGRESS | ||||
| #endif | ||||
| 
 | ||||
| #define getsockopt(a, b, c, d, e) getsockopt(a, b, c, (char*) d, e) | ||||
| #define setsockopt(a, b, c, d, e) setsockopt(a, b, c, (const char*) d, e) | ||||
| 
 | ||||
| int ff_neterrno(void); | ||||
| #else | ||||
| #include <sys/types.h> | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <netdb.h> | ||||
| 
 | ||||
| #define ff_neterrno() AVERROR(errno) | ||||
| #endif /* HAVE_WINSOCK2_H */ | ||||
| 
 | ||||
| #if HAVE_ARPA_INET_H | ||||
| #include <arpa/inet.h> | ||||
| #endif | ||||
| 
 | ||||
| #if HAVE_POLL_H | ||||
| #include <poll.h> | ||||
| #endif | ||||
| 
 | ||||
| int ff_socket_nonblock(int socket, int enable); | ||||
| 
 | ||||
| extern int ff_network_inited_globally; | ||||
| int ff_network_init(void); | ||||
| void ff_network_close(void); | ||||
| 
 | ||||
| int ff_tls_init(void); | ||||
| void ff_tls_deinit(void); | ||||
| 
 | ||||
| int ff_network_wait_fd(int fd, int write); | ||||
| 
 | ||||
| /**
 | ||||
|  * This works similarly to ff_network_wait_fd, but waits up to 'timeout' microseconds | ||||
|  * Uses ff_network_wait_fd in a loop | ||||
|  * | ||||
|  * @fd Socket descriptor | ||||
|  * @write Set 1 to wait for socket able to be read, 0 to be written | ||||
|  * @timeout Timeout interval, in microseconds. Actual precision is 100000 mcs, due to ff_network_wait_fd usage | ||||
|  * @param int_cb Interrupt callback, is checked before each ff_network_wait_fd call | ||||
|  * @return 0 if data can be read/written, AVERROR(ETIMEDOUT) if timeout expired, or negative error code | ||||
|  */ | ||||
| int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout, AVIOInterruptCB *int_cb); | ||||
| 
 | ||||
| int ff_inet_aton (const char * str, struct in_addr * add); | ||||
| 
 | ||||
| #if !HAVE_STRUCT_SOCKADDR_STORAGE | ||||
| struct sockaddr_storage { | ||||
| #if HAVE_STRUCT_SOCKADDR_SA_LEN | ||||
|     uint8_t ss_len; | ||||
|     uint8_t ss_family; | ||||
| #else | ||||
|     uint16_t ss_family; | ||||
| #endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */ | ||||
|     char ss_pad1[6]; | ||||
|     int64_t ss_align; | ||||
|     char ss_pad2[112]; | ||||
| }; | ||||
| #endif /* !HAVE_STRUCT_SOCKADDR_STORAGE */ | ||||
| 
 | ||||
| typedef union sockaddr_union { | ||||
|     struct sockaddr_storage storage; | ||||
|     struct sockaddr_in in; | ||||
| #if HAVE_STRUCT_SOCKADDR_IN6 | ||||
|     struct sockaddr_in6 in6; | ||||
| #endif | ||||
| } sockaddr_union; | ||||
| 
 | ||||
| #ifndef MSG_NOSIGNAL | ||||
| #define MSG_NOSIGNAL 0 | ||||
| #endif | ||||
| 
 | ||||
| #if !HAVE_STRUCT_ADDRINFO | ||||
| struct addrinfo { | ||||
|     int ai_flags; | ||||
|     int ai_family; | ||||
|     int ai_socktype; | ||||
|     int ai_protocol; | ||||
|     int ai_addrlen; | ||||
|     struct sockaddr *ai_addr; | ||||
|     char *ai_canonname; | ||||
|     struct addrinfo *ai_next; | ||||
| }; | ||||
| #endif /* !HAVE_STRUCT_ADDRINFO */ | ||||
| 
 | ||||
| /* getaddrinfo constants */ | ||||
| #ifndef EAI_AGAIN | ||||
| #define EAI_AGAIN 2 | ||||
| #endif | ||||
| #ifndef EAI_BADFLAGS | ||||
| #define EAI_BADFLAGS 3 | ||||
| #endif | ||||
| #ifndef EAI_FAIL | ||||
| #define EAI_FAIL 4 | ||||
| #endif | ||||
| #ifndef EAI_FAMILY | ||||
| #define EAI_FAMILY 5 | ||||
| #endif | ||||
| #ifndef EAI_MEMORY | ||||
| #define EAI_MEMORY 6 | ||||
| #endif | ||||
| #ifndef EAI_NODATA | ||||
| #define EAI_NODATA 7 | ||||
| #endif | ||||
| #ifndef EAI_NONAME | ||||
| #define EAI_NONAME 8 | ||||
| #endif | ||||
| #ifndef EAI_SERVICE | ||||
| #define EAI_SERVICE 9 | ||||
| #endif | ||||
| #ifndef EAI_SOCKTYPE | ||||
| #define EAI_SOCKTYPE 10 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AI_PASSIVE | ||||
| #define AI_PASSIVE 1 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AI_CANONNAME | ||||
| #define AI_CANONNAME 2 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AI_NUMERICHOST | ||||
| #define AI_NUMERICHOST 4 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef NI_NOFQDN | ||||
| #define NI_NOFQDN 1 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef NI_NUMERICHOST | ||||
| #define NI_NUMERICHOST 2 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef NI_NAMERQD | ||||
| #define NI_NAMERQD 4 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef NI_NUMERICSERV | ||||
| #define NI_NUMERICSERV 8 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef NI_DGRAM | ||||
| #define NI_DGRAM 16 | ||||
| #endif | ||||
| 
 | ||||
| #if !HAVE_GETADDRINFO | ||||
| int ff_getaddrinfo(const char *node, const char *service, | ||||
|                    const struct addrinfo *hints, struct addrinfo **res); | ||||
| void ff_freeaddrinfo(struct addrinfo *res); | ||||
| int ff_getnameinfo(const struct sockaddr *sa, int salen, | ||||
|                    char *host, int hostlen, | ||||
|                    char *serv, int servlen, int flags); | ||||
| #define getaddrinfo ff_getaddrinfo | ||||
| #define freeaddrinfo ff_freeaddrinfo | ||||
| #define getnameinfo ff_getnameinfo | ||||
| #endif /* !HAVE_GETADDRINFO */ | ||||
| 
 | ||||
| #if !HAVE_GETADDRINFO || HAVE_WINSOCK2_H | ||||
| const char *ff_gai_strerror(int ecode); | ||||
| #undef gai_strerror | ||||
| #define gai_strerror ff_gai_strerror | ||||
| #endif /* !HAVE_GETADDRINFO || HAVE_WINSOCK2_H */ | ||||
| 
 | ||||
| #ifndef INADDR_LOOPBACK | ||||
| #define INADDR_LOOPBACK 0x7f000001 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef INET_ADDRSTRLEN | ||||
| #define INET_ADDRSTRLEN 16 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef INET6_ADDRSTRLEN | ||||
| #define INET6_ADDRSTRLEN INET_ADDRSTRLEN | ||||
| #endif | ||||
| 
 | ||||
| #ifndef IN_MULTICAST | ||||
| #define IN_MULTICAST(a) ((((uint32_t)(a)) & 0xf0000000) == 0xe0000000) | ||||
| #endif | ||||
| #ifndef IN6_IS_ADDR_MULTICAST | ||||
| #define IN6_IS_ADDR_MULTICAST(a) (((uint8_t *) (a))[0] == 0xff) | ||||
| #endif | ||||
| 
 | ||||
| int ff_is_multicast_address(struct sockaddr *addr); | ||||
| 
 | ||||
| #define POLLING_TIME 100 /// Time in milliseconds between interrupt check
 | ||||
| 
 | ||||
| /**
 | ||||
|  * Bind to a file descriptor and poll for a connection. | ||||
|  * | ||||
|  * @param fd      First argument of bind(). | ||||
|  * @param addr    Second argument of bind(). | ||||
|  * @param addrlen Third argument of bind(). | ||||
|  * @param timeout Polling timeout in milliseconds. | ||||
|  * @param h       URLContext providing interrupt check | ||||
|  *                callback and logging context. | ||||
|  * @return        A non-blocking file descriptor on success | ||||
|  *                or an AVERROR on failure. | ||||
|  */ | ||||
| int ff_listen_bind(int fd, const struct sockaddr *addr, | ||||
|                    socklen_t addrlen, int timeout, | ||||
|                    URLContext *h); | ||||
| 
 | ||||
| /**
 | ||||
|  * Bind to a file descriptor to an address without accepting connections. | ||||
|  * @param fd      First argument of bind(). | ||||
|  * @param addr    Second argument of bind(). | ||||
|  * @param addrlen Third argument of bind(). | ||||
|  * @return        0 on success or an AVERROR on failure. | ||||
|  */ | ||||
| int ff_listen(int fd, const struct sockaddr *addr, socklen_t addrlen); | ||||
| 
 | ||||
| /**
 | ||||
|  * Poll for a single connection on the passed file descriptor. | ||||
|  * @param fd      The listening socket file descriptor. | ||||
|  * @param timeout Polling timeout in milliseconds. | ||||
|  * @param h       URLContext providing interrupt check | ||||
|  *                callback and logging context. | ||||
|  * @return        A non-blocking file descriptor on success | ||||
|  *                or an AVERROR on failure. | ||||
|  */ | ||||
| int ff_accept(int fd, int timeout, URLContext *h); | ||||
| 
 | ||||
| /**
 | ||||
|  * Connect to a file descriptor and poll for result. | ||||
|  * | ||||
|  * @param fd       First argument of connect(), | ||||
|  *                 will be set as non-blocking. | ||||
|  * @param addr     Second argument of connect(). | ||||
|  * @param addrlen  Third argument of connect(). | ||||
|  * @param timeout  Polling timeout in milliseconds. | ||||
|  * @param h        URLContext providing interrupt check | ||||
|  *                 callback and logging context. | ||||
|  * @param will_try_next Whether the caller will try to connect to another | ||||
|  *                 address for the same host name, affecting the form of | ||||
|  *                 logged errors. | ||||
|  * @return         0 on success, AVERROR on failure. | ||||
|  */ | ||||
| int ff_listen_connect(int fd, const struct sockaddr *addr, | ||||
|                       socklen_t addrlen, int timeout, | ||||
|                       URLContext *h, int will_try_next); | ||||
| 
 | ||||
| int ff_http_match_no_proxy(const char *no_proxy, const char *hostname); | ||||
| 
 | ||||
| int ff_socket(int domain, int type, int protocol); | ||||
| 
 | ||||
| #endif /* AVFORMAT_NETWORK_H */ | ||||
| @ -0,0 +1,261 @@ | ||||
| /*
 | ||||
|  * various OS-feature replacement utilities | ||||
|  * copyright (c) 2000, 2001, 2002 Fabrice Bellard | ||||
|  * | ||||
|  * 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 AVFORMAT_OS_SUPPORT_H | ||||
| #define AVFORMAT_OS_SUPPORT_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * miscellaneous OS support macros and functions. | ||||
|  */ | ||||
| 
 | ||||
| #include "config.h" | ||||
| 
 | ||||
| #include <sys/stat.h> | ||||
| 
 | ||||
| #ifdef _WIN32 | ||||
| #if HAVE_DIRECT_H | ||||
| #include <direct.h> | ||||
| #endif | ||||
| #if HAVE_IO_H | ||||
| #include <io.h> | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if defined(_WIN32) && !defined(__MINGW32CE__) | ||||
| #  include <fcntl.h> | ||||
| #  ifdef lseek | ||||
| #   undef lseek | ||||
| #  endif | ||||
| #  define lseek(f,p,w) _lseeki64((f), (p), (w)) | ||||
| #  ifdef stat | ||||
| #   undef stat | ||||
| #  endif | ||||
| #  define stat _stati64 | ||||
| #  ifdef fstat | ||||
| #   undef fstat | ||||
| #  endif | ||||
| #  define fstat(f,s) _fstati64((f), (s)) | ||||
| #endif /* defined(_WIN32) && !defined(__MINGW32CE__) */ | ||||
| 
 | ||||
| 
 | ||||
| #ifdef __ANDROID__ | ||||
| #  if HAVE_UNISTD_H | ||||
| #    include <unistd.h> | ||||
| #  endif | ||||
| #  ifdef lseek | ||||
| #   undef lseek | ||||
| #  endif | ||||
| #  define lseek(f,p,w) lseek64((f), (p), (w)) | ||||
| #endif | ||||
| 
 | ||||
| static inline int is_dos_path(const char *path) | ||||
| { | ||||
| #if HAVE_DOS_PATHS | ||||
|     if (path[0] && path[1] == ':') | ||||
|         return 1; | ||||
| #endif | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| #if defined(__OS2__) || defined(__Plan9__) | ||||
| #define SHUT_RD 0 | ||||
| #define SHUT_WR 1 | ||||
| #define SHUT_RDWR 2 | ||||
| #endif | ||||
| 
 | ||||
| #if defined(_WIN32) | ||||
| #define SHUT_RD SD_RECEIVE | ||||
| #define SHUT_WR SD_SEND | ||||
| #define SHUT_RDWR SD_BOTH | ||||
| 
 | ||||
| #ifndef S_IRUSR | ||||
| #define S_IRUSR S_IREAD | ||||
| #endif | ||||
| #ifndef S_IWUSR | ||||
| #define S_IWUSR S_IWRITE | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if CONFIG_NETWORK | ||||
| #if !HAVE_SOCKLEN_T | ||||
| typedef int socklen_t; | ||||
| #endif | ||||
| 
 | ||||
| /* most of the time closing a socket is just closing an fd */ | ||||
| #if !HAVE_CLOSESOCKET | ||||
| #define closesocket close | ||||
| #endif | ||||
| 
 | ||||
| #if !HAVE_POLL_H | ||||
| typedef unsigned long nfds_t; | ||||
| 
 | ||||
| #if HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #endif | ||||
| #if !HAVE_STRUCT_POLLFD | ||||
| struct pollfd { | ||||
|     int fd; | ||||
|     short events;  /* events to look for */ | ||||
|     short revents; /* events that occurred */ | ||||
| }; | ||||
| 
 | ||||
| /* events & revents */ | ||||
| #define POLLIN     0x0001  /* any readable data available */ | ||||
| #define POLLOUT    0x0002  /* file descriptor is writeable */ | ||||
| #define POLLRDNORM POLLIN | ||||
| #define POLLWRNORM POLLOUT | ||||
| #define POLLRDBAND 0x0008  /* priority readable data */ | ||||
| #define POLLWRBAND 0x0010  /* priority data can be written */ | ||||
| #define POLLPRI    0x0020  /* high priority readable data */ | ||||
| 
 | ||||
| /* revents only */ | ||||
| #define POLLERR    0x0004  /* errors pending */ | ||||
| #define POLLHUP    0x0080  /* disconnected */ | ||||
| #define POLLNVAL   0x1000  /* invalid file descriptor */ | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| int ff_poll(struct pollfd *fds, nfds_t numfds, int timeout); | ||||
| #define poll ff_poll | ||||
| #endif /* HAVE_POLL_H */ | ||||
| #endif /* CONFIG_NETWORK */ | ||||
| 
 | ||||
| #if defined(__MINGW32CE__) | ||||
| #define mkdir(a, b) _mkdir(a) | ||||
| #elif defined(_WIN32) | ||||
| #include <stdio.h> | ||||
| #include <windows.h> | ||||
| #include "libavutil/wchar_filename.h" | ||||
| 
 | ||||
| #ifdef WINAPI_FAMILY | ||||
| #include <winapifamily.h> | ||||
| // If a WINAPI_FAMILY is defined, check that the desktop API subset
 | ||||
| // is enabled
 | ||||
| #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) | ||||
| #define USE_MOVEFILEEXA | ||||
| #endif | ||||
| #else | ||||
| // If no WINAPI_FAMILY is defined, assume the full API subset
 | ||||
| #define USE_MOVEFILEEXA | ||||
| #endif | ||||
| 
 | ||||
| #define DEF_FS_FUNCTION(name, wfunc, afunc)               \ | ||||
| static inline int win32_##name(const char *filename_utf8) \
 | ||||
| {                                                         \
 | ||||
|     wchar_t *filename_w;                                  \
 | ||||
|     int ret;                                              \
 | ||||
|                                                           \
 | ||||
|     if (utf8towchar(filename_utf8, &filename_w))          \
 | ||||
|         return -1;                                        \
 | ||||
|     if (!filename_w)                                      \
 | ||||
|         goto fallback;                                    \
 | ||||
|                                                           \
 | ||||
|     ret = wfunc(filename_w);                              \
 | ||||
|     av_free(filename_w);                                  \
 | ||||
|     return ret;                                           \
 | ||||
|                                                           \
 | ||||
| fallback:                                                 \
 | ||||
|     /* filename may be be in CP_ACP */                    \
 | ||||
|     return afunc(filename_utf8);                          \
 | ||||
| } | ||||
| 
 | ||||
| DEF_FS_FUNCTION(unlink, _wunlink, _unlink) | ||||
| DEF_FS_FUNCTION(mkdir,  _wmkdir,  _mkdir) | ||||
| DEF_FS_FUNCTION(rmdir,  _wrmdir , _rmdir) | ||||
| 
 | ||||
| #define DEF_FS_FUNCTION2(name, wfunc, afunc, partype)     \ | ||||
| static inline int win32_##name(const char *filename_utf8, partype par) \
 | ||||
| {                                                         \
 | ||||
|     wchar_t *filename_w;                                  \
 | ||||
|     int ret;                                              \
 | ||||
|                                                           \
 | ||||
|     if (utf8towchar(filename_utf8, &filename_w))          \
 | ||||
|         return -1;                                        \
 | ||||
|     if (!filename_w)                                      \
 | ||||
|         goto fallback;                                    \
 | ||||
|                                                           \
 | ||||
|     ret = wfunc(filename_w, par);                         \
 | ||||
|     av_free(filename_w);                                  \
 | ||||
|     return ret;                                           \
 | ||||
|                                                           \
 | ||||
| fallback:                                                 \
 | ||||
|     /* filename may be be in CP_ACP */                    \
 | ||||
|     return afunc(filename_utf8, par);                     \
 | ||||
| } | ||||
| 
 | ||||
| DEF_FS_FUNCTION2(access, _waccess, _access, int) | ||||
| DEF_FS_FUNCTION2(stat, _wstati64, _stati64, struct stat*) | ||||
| 
 | ||||
| static inline int win32_rename(const char *src_utf8, const char *dest_utf8) | ||||
| { | ||||
|     wchar_t *src_w, *dest_w; | ||||
|     int ret; | ||||
| 
 | ||||
|     if (utf8towchar(src_utf8, &src_w)) | ||||
|         return -1; | ||||
|     if (utf8towchar(dest_utf8, &dest_w)) { | ||||
|         av_free(src_w); | ||||
|         return -1; | ||||
|     } | ||||
|     if (!src_w || !dest_w) { | ||||
|         av_free(src_w); | ||||
|         av_free(dest_w); | ||||
|         goto fallback; | ||||
|     } | ||||
| 
 | ||||
|     ret = MoveFileExW(src_w, dest_w, MOVEFILE_REPLACE_EXISTING); | ||||
|     av_free(src_w); | ||||
|     av_free(dest_w); | ||||
|     // Lacking proper mapping from GetLastError() error codes to errno codes
 | ||||
|     if (ret) | ||||
|         errno = EPERM; | ||||
|     return ret; | ||||
| 
 | ||||
| fallback: | ||||
|     /* filename may be be in CP_ACP */ | ||||
| #ifdef USE_MOVEFILEEXA | ||||
|     ret = MoveFileExA(src_utf8, dest_utf8, MOVEFILE_REPLACE_EXISTING); | ||||
|     if (ret) | ||||
|         errno = EPERM; | ||||
| #else | ||||
|     /* Windows Phone doesn't have MoveFileExA, and for Windows Store apps,
 | ||||
|      * it is available but not allowed by the app certification kit. However, | ||||
|      * it's unlikely that anybody would input filenames in CP_ACP there, so this | ||||
|      * fallback is kept mostly for completeness. Alternatively we could | ||||
|      * do MultiByteToWideChar(CP_ACP) and use MoveFileExW, but doing | ||||
|      * explicit conversions with CP_ACP is allegedly forbidden in windows | ||||
|      * store apps (or windows phone), and the notion of a native code page | ||||
|      * doesn't make much sense there. */ | ||||
|     ret = rename(src_utf8, dest_utf8); | ||||
| #endif | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| #define mkdir(a, b) win32_mkdir(a) | ||||
| #define rename      win32_rename | ||||
| #define rmdir       win32_rmdir | ||||
| #define unlink      win32_unlink | ||||
| #define access      win32_access | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #endif /* AVFORMAT_OS_SUPPORT_H */ | ||||
| @ -0,0 +1,334 @@ | ||||
| /*
 | ||||
|  * 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 | ||||
|  * unbuffered private I/O API | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVFORMAT_URL_H | ||||
| #define AVFORMAT_URL_H | ||||
| 
 | ||||
| #include "avio.h" | ||||
| #include "libavformat/version.h" | ||||
| 
 | ||||
| #include "libavutil/dict.h" | ||||
| #include "libavutil/log.h" | ||||
| 
 | ||||
| #define URL_PROTOCOL_FLAG_NESTED_SCHEME 1 /*< The protocol name can be the first part of a nested protocol scheme */ | ||||
| #define URL_PROTOCOL_FLAG_NETWORK       2 /*< The protocol uses network */ | ||||
| 
 | ||||
| extern const AVClass ffurl_context_class; | ||||
| 
 | ||||
| typedef struct URLContext { | ||||
|     const AVClass *av_class;    /**< information for av_log(). Set by url_open(). */ | ||||
|     const struct URLProtocol *prot; | ||||
|     void *priv_data; | ||||
|     char *filename;             /**< specified URL */ | ||||
|     int flags; | ||||
|     int max_packet_size;        /**< if non zero, the stream is packetized with this max packet size */ | ||||
|     int is_streamed;            /**< true if streamed (no seek possible), default = false */ | ||||
|     int is_connected; | ||||
|     AVIOInterruptCB interrupt_callback; | ||||
|     int64_t rw_timeout;         /**< maximum time to wait for (network) read/write operation completion, in mcs */ | ||||
|     const char *protocol_whitelist; | ||||
|     const char *protocol_blacklist; | ||||
| } URLContext; | ||||
| 
 | ||||
| typedef struct URLProtocol { | ||||
|     const char *name; | ||||
|     int     (*url_open)( URLContext *h, const char *url, int flags); | ||||
|     /**
 | ||||
|      * This callback is to be used by protocols which open further nested | ||||
|      * protocols. options are then to be passed to ffurl_open()/ffurl_connect() | ||||
|      * for those nested protocols. | ||||
|      */ | ||||
|     int     (*url_open2)(URLContext *h, const char *url, int flags, AVDictionary **options); | ||||
|     int     (*url_accept)(URLContext *s, URLContext **c); | ||||
|     int     (*url_handshake)(URLContext *c); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Read data from the protocol. | ||||
|      * If data is immediately available (even less than size), EOF is | ||||
|      * reached or an error occurs (including EINTR), return immediately. | ||||
|      * Otherwise: | ||||
|      * In non-blocking mode, return AVERROR(EAGAIN) immediately. | ||||
|      * In blocking mode, wait for data/EOF/error with a short timeout (0.1s), | ||||
|      * and return AVERROR(EAGAIN) on timeout. | ||||
|      * Checking interrupt_callback, looping on EINTR and EAGAIN and until | ||||
|      * enough data has been read is left to the calling function; see | ||||
|      * retry_transfer_wrapper in avio.c. | ||||
|      */ | ||||
|     int     (*url_read)( URLContext *h, unsigned char *buf, int size); | ||||
|     int     (*url_write)(URLContext *h, const unsigned char *buf, int size); | ||||
|     int64_t (*url_seek)( URLContext *h, int64_t pos, int whence); | ||||
|     int     (*url_close)(URLContext *h); | ||||
|     int (*url_read_pause)(URLContext *h, int pause); | ||||
|     int64_t (*url_read_seek)(URLContext *h, int stream_index, | ||||
|                              int64_t timestamp, int flags); | ||||
|     int (*url_get_file_handle)(URLContext *h); | ||||
|     int (*url_get_multi_file_handle)(URLContext *h, int **handles, | ||||
|                                      int *numhandles); | ||||
|     int (*url_shutdown)(URLContext *h, int flags); | ||||
|     int priv_data_size; | ||||
|     const AVClass *priv_data_class; | ||||
|     int flags; | ||||
|     int (*url_check)(URLContext *h, int mask); | ||||
|     int (*url_open_dir)(URLContext *h); | ||||
|     int (*url_read_dir)(URLContext *h, AVIODirEntry **next); | ||||
|     int (*url_close_dir)(URLContext *h); | ||||
|     int (*url_delete)(URLContext *h); | ||||
|     int (*url_move)(URLContext *h_src, URLContext *h_dst); | ||||
|     const char *default_whitelist; | ||||
| } URLProtocol; | ||||
| 
 | ||||
| /**
 | ||||
|  * Create a URLContext for accessing to the resource indicated by | ||||
|  * url, but do not initiate the connection yet. | ||||
|  * | ||||
|  * @param puc pointer to the location where, in case of success, the | ||||
|  * function puts the pointer to the created URLContext | ||||
|  * @param flags flags which control how the resource indicated by url | ||||
|  * is to be opened | ||||
|  * @param int_cb interrupt callback to use for the URLContext, may be | ||||
|  * NULL | ||||
|  * @return >= 0 in case of success, a negative value corresponding to an | ||||
|  * AVERROR code in case of failure | ||||
|  */ | ||||
| int ffurl_alloc(URLContext **puc, const char *filename, int flags, | ||||
|                 const AVIOInterruptCB *int_cb); | ||||
| 
 | ||||
| /**
 | ||||
|  * Connect an URLContext that has been allocated by ffurl_alloc | ||||
|  * | ||||
|  * @param options  A dictionary filled with options for nested protocols, | ||||
|  * i.e. it will be passed to url_open2() for protocols implementing it. | ||||
|  * This parameter will be destroyed and replaced with a dict containing options | ||||
|  * that were not found. May be NULL. | ||||
|  */ | ||||
| int ffurl_connect(URLContext *uc, AVDictionary **options); | ||||
| 
 | ||||
| /**
 | ||||
|  * Create an URLContext for accessing to the resource indicated by | ||||
|  * url, and open it. | ||||
|  * | ||||
|  * @param puc pointer to the location where, in case of success, the | ||||
|  * function puts the pointer to the created URLContext | ||||
|  * @param flags flags which control how the resource indicated by url | ||||
|  * is to be opened | ||||
|  * @param int_cb interrupt callback to use for the URLContext, may be | ||||
|  * NULL | ||||
|  * @param options  A dictionary filled with protocol-private options. On return | ||||
|  * this parameter will be destroyed and replaced with a dict containing options | ||||
|  * that were not found. May be NULL. | ||||
|  * @param parent An enclosing URLContext, whose generic options should | ||||
|  *               be applied to this URLContext as well. | ||||
|  * @return >= 0 in case of success, a negative value corresponding to an | ||||
|  * AVERROR code in case of failure | ||||
|  */ | ||||
| int ffurl_open_whitelist(URLContext **puc, const char *filename, int flags, | ||||
|                const AVIOInterruptCB *int_cb, AVDictionary **options, | ||||
|                const char *whitelist, const char* blacklist, | ||||
|                URLContext *parent); | ||||
| 
 | ||||
| int ffurl_open(URLContext **puc, const char *filename, int flags, | ||||
|                const AVIOInterruptCB *int_cb, AVDictionary **options); | ||||
| 
 | ||||
| /**
 | ||||
|  * Accept an URLContext c on an URLContext s | ||||
|  * | ||||
|  * @param  s server context | ||||
|  * @param  c client context, must be unallocated. | ||||
|  * @return >= 0 on success, ff_neterrno() on failure. | ||||
|  */ | ||||
| int ffurl_accept(URLContext *s, URLContext **c); | ||||
| 
 | ||||
| /**
 | ||||
|  * Perform one step of the protocol handshake to accept a new client. | ||||
|  * See avio_handshake() for details. | ||||
|  * Implementations should try to return decreasing values. | ||||
|  * If the protocol uses an underlying protocol, the underlying handshake is | ||||
|  * usually the first step, and the return value can be: | ||||
|  * (largest value for this protocol) + (return value from other protocol) | ||||
|  * | ||||
|  * @param  c the client context | ||||
|  * @return >= 0 on success or a negative value corresponding | ||||
|  *         to an AVERROR code on failure | ||||
|  */ | ||||
| int ffurl_handshake(URLContext *c); | ||||
| 
 | ||||
| /**
 | ||||
|  * Read up to size bytes from the resource accessed by h, and store | ||||
|  * the read bytes in buf. | ||||
|  * | ||||
|  * @return The number of bytes actually read, or a negative value | ||||
|  * corresponding to an AVERROR code in case of error. A value of zero | ||||
|  * indicates that it is not possible to read more from the accessed | ||||
|  * resource (except if the value of the size argument is also zero). | ||||
|  */ | ||||
| int ffurl_read(URLContext *h, unsigned char *buf, int size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Read as many bytes as possible (up to size), calling the | ||||
|  * read function multiple times if necessary. | ||||
|  * This makes special short-read handling in applications | ||||
|  * unnecessary, if the return value is < size then it is | ||||
|  * certain there was either an error or the end of file was reached. | ||||
|  */ | ||||
| int ffurl_read_complete(URLContext *h, unsigned char *buf, int size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Write size bytes from buf to the resource accessed by h. | ||||
|  * | ||||
|  * @return the number of bytes actually written, or a negative value | ||||
|  * corresponding to an AVERROR code in case of failure | ||||
|  */ | ||||
| int ffurl_write(URLContext *h, const unsigned char *buf, int size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Change the position that will be used by the next read/write | ||||
|  * operation on the resource accessed by h. | ||||
|  * | ||||
|  * @param pos specifies the new position to set | ||||
|  * @param whence specifies how pos should be interpreted, it must be | ||||
|  * one of SEEK_SET (seek from the beginning), SEEK_CUR (seek from the | ||||
|  * current position), SEEK_END (seek from the end), or AVSEEK_SIZE | ||||
|  * (return the filesize of the requested resource, pos is ignored). | ||||
|  * @return a negative value corresponding to an AVERROR code in case | ||||
|  * of failure, or the resulting file position, measured in bytes from | ||||
|  * the beginning of the file. You can use this feature together with | ||||
|  * SEEK_CUR to read the current file position. | ||||
|  */ | ||||
| int64_t ffurl_seek(URLContext *h, int64_t pos, int whence); | ||||
| 
 | ||||
| /**
 | ||||
|  * Close the resource accessed by the URLContext h, and free the | ||||
|  * memory used by it. Also set the URLContext pointer to NULL. | ||||
|  * | ||||
|  * @return a negative value if an error condition occurred, 0 | ||||
|  * otherwise | ||||
|  */ | ||||
| int ffurl_closep(URLContext **h); | ||||
| int ffurl_close(URLContext *h); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the filesize of the resource accessed by h, AVERROR(ENOSYS) | ||||
|  * if the operation is not supported by h, or another negative value | ||||
|  * corresponding to an AVERROR error code in case of failure. | ||||
|  */ | ||||
| int64_t ffurl_size(URLContext *h); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the file descriptor associated with this URL. For RTP, this | ||||
|  * will return only the RTP file descriptor, not the RTCP file descriptor. | ||||
|  * | ||||
|  * @return the file descriptor associated with this URL, or <0 on error. | ||||
|  */ | ||||
| int ffurl_get_file_handle(URLContext *h); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the file descriptors associated with this URL. | ||||
|  * | ||||
|  * @return 0 on success or <0 on error. | ||||
|  */ | ||||
| int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles); | ||||
| 
 | ||||
| /**
 | ||||
|  * Signal the URLContext that we are done reading or writing the stream. | ||||
|  * | ||||
|  * @param h pointer to the resource | ||||
|  * @param flags flags which control how the resource indicated by url | ||||
|  * is to be shutdown | ||||
|  * | ||||
|  * @return a negative value if an error condition occurred, 0 | ||||
|  * otherwise | ||||
|  */ | ||||
| int ffurl_shutdown(URLContext *h, int flags); | ||||
| 
 | ||||
| /**
 | ||||
|  * Check if the user has requested to interrupt a blocking function | ||||
|  * associated with cb. | ||||
|  */ | ||||
| int ff_check_interrupt(AVIOInterruptCB *cb); | ||||
| 
 | ||||
| /* udp.c */ | ||||
| int ff_udp_set_remote_url(URLContext *h, const char *uri); | ||||
| int ff_udp_get_local_port(URLContext *h); | ||||
| 
 | ||||
| /**
 | ||||
|  * Assemble a URL string from components. This is the reverse operation | ||||
|  * of av_url_split. | ||||
|  * | ||||
|  * Note, this requires networking to be initialized, so the caller must | ||||
|  * ensure ff_network_init has been called. | ||||
|  * | ||||
|  * @see av_url_split | ||||
|  * | ||||
|  * @param str the buffer to fill with the url | ||||
|  * @param size the size of the str buffer | ||||
|  * @param proto the protocol identifier, if null, the separator | ||||
|  *              after the identifier is left out, too | ||||
|  * @param authorization an optional authorization string, may be null. | ||||
|  *                      An empty string is treated the same as a null string. | ||||
|  * @param hostname the host name string | ||||
|  * @param port the port number, left out from the string if negative | ||||
|  * @param fmt a generic format string for everything to add after the | ||||
|  *            host/port, may be null | ||||
|  * @return the number of characters written to the destination buffer | ||||
|  */ | ||||
| int ff_url_join(char *str, int size, const char *proto, | ||||
|                 const char *authorization, const char *hostname, | ||||
|                 int port, const char *fmt, ...) av_printf_format(7, 8); | ||||
| 
 | ||||
| /**
 | ||||
|  * Convert a relative url into an absolute url, given a base url. | ||||
|  * | ||||
|  * @param buf the buffer where output absolute url is written | ||||
|  * @param size the size of buf | ||||
|  * @param base the base url, may be equal to buf. | ||||
|  * @param rel the new url, which is interpreted relative to base | ||||
|  */ | ||||
| void ff_make_absolute_url(char *buf, int size, const char *base, | ||||
|                           const char *rel); | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate directory entry with default values. | ||||
|  * | ||||
|  * @return entry or NULL on error | ||||
|  */ | ||||
| AVIODirEntry *ff_alloc_dir_entry(void); | ||||
| 
 | ||||
| const AVClass *ff_urlcontext_child_class_next(const AVClass *prev); | ||||
| 
 | ||||
| /**
 | ||||
|  * Construct a list of protocols matching a given whitelist and/or blacklist. | ||||
|  * | ||||
|  * @param whitelist a comma-separated list of allowed protocol names or NULL. If | ||||
|  *                  this is a non-empty string, only protocols in this list will | ||||
|  *                  be included. | ||||
|  * @param blacklist a comma-separated list of forbidden protocol names or NULL. | ||||
|  *                  If this is a non-empty string, all protocols in this list | ||||
|  *                  will be excluded. | ||||
|  * | ||||
|  * @return a NULL-terminated array of matching protocols. The array must be | ||||
|  * freed by the caller. | ||||
|  */ | ||||
| const URLProtocol **ffurl_get_protocols(const char *whitelist, | ||||
|                                         const char *blacklist); | ||||
| 
 | ||||
| #endif /* AVFORMAT_URL_H */ | ||||
| @ -0,0 +1,81 @@ | ||||
| /*
 | ||||
|  * Version macros. | ||||
|  * | ||||
|  * 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 AVFORMAT_VERSION_H | ||||
| #define AVFORMAT_VERSION_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup libavf | ||||
|  * Libavformat version macros | ||||
|  */ | ||||
| 
 | ||||
| #include "libavutil/version.h" | ||||
| 
 | ||||
| #define LIBAVFORMAT_VERSION_MAJOR  57 | ||||
| #define LIBAVFORMAT_VERSION_MINOR  25 | ||||
| #define LIBAVFORMAT_VERSION_MICRO 100 | ||||
| 
 | ||||
| #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | ||||
|                                                LIBAVFORMAT_VERSION_MINOR, \
 | ||||
|                                                LIBAVFORMAT_VERSION_MICRO) | ||||
| #define LIBAVFORMAT_VERSION     AV_VERSION(LIBAVFORMAT_VERSION_MAJOR,   \ | ||||
|                                            LIBAVFORMAT_VERSION_MINOR,   \
 | ||||
|                                            LIBAVFORMAT_VERSION_MICRO) | ||||
| #define LIBAVFORMAT_BUILD       LIBAVFORMAT_VERSION_INT | ||||
| 
 | ||||
| #define LIBAVFORMAT_IDENT       "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) | ||||
| 
 | ||||
| /**
 | ||||
|  * 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. | ||||
|  * | ||||
|  * @note, when bumping the major version it is recommended to manually | ||||
|  * disable each FF_API_* in its own commit instead of disabling them all | ||||
|  * 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) | ||||
| #endif | ||||
| #ifndef FF_API_LAVF_FRAC | ||||
| #define FF_API_LAVF_FRAC                (LIBAVFORMAT_VERSION_MAJOR < 58) | ||||
| #endif | ||||
| #ifndef FF_API_LAVF_CODEC_TB | ||||
| #define FF_API_LAVF_CODEC_TB            (LIBAVFORMAT_VERSION_MAJOR < 58) | ||||
| #endif | ||||
| #ifndef FF_API_URL_FEOF | ||||
| #define FF_API_URL_FEOF                 (LIBAVFORMAT_VERSION_MAJOR < 58) | ||||
| #endif | ||||
| #ifndef FF_API_LAVF_FMT_RAWPICTURE | ||||
| #define FF_API_LAVF_FMT_RAWPICTURE      (LIBAVFORMAT_VERSION_MAJOR < 58) | ||||
| #endif | ||||
| #ifndef FF_API_COMPUTE_PKT_FIELDS2 | ||||
| #define FF_API_COMPUTE_PKT_FIELDS2      (LIBAVFORMAT_VERSION_MAJOR < 58) | ||||
| #endif | ||||
| #ifndef FF_API_OLD_OPEN_CALLBACKS | ||||
| #define FF_API_OLD_OPEN_CALLBACKS       (LIBAVFORMAT_VERSION_MAJOR < 58) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef FF_API_R_FRAME_RATE | ||||
| #define FF_API_R_FRAME_RATE            1 | ||||
| #endif | ||||
| #endif /* AVFORMAT_VERSION_H */ | ||||
| @ -0,0 +1,503 @@ | ||||
| /*
 | ||||
|  * Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com> | ||||
|  * | ||||
|  * 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 AVRESAMPLE_AVRESAMPLE_H | ||||
| #define AVRESAMPLE_AVRESAMPLE_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup lavr | ||||
|  * external API header | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavr libavresample | ||||
|  * @{ | ||||
|  * | ||||
|  * Libavresample (lavr) is a library that handles audio resampling, sample | ||||
|  * format conversion and mixing. | ||||
|  * | ||||
|  * Interaction with lavr is done through AVAudioResampleContext, which is | ||||
|  * allocated with avresample_alloc_context(). It is opaque, so all parameters | ||||
|  * must be set with the @ref avoptions API. | ||||
|  * | ||||
|  * For example the following code will setup conversion from planar float sample | ||||
|  * format to interleaved signed 16-bit integer, downsampling from 48kHz to | ||||
|  * 44.1kHz and downmixing from 5.1 channels to stereo (using the default mixing | ||||
|  * matrix): | ||||
|  * @code | ||||
|  * AVAudioResampleContext *avr = avresample_alloc_context(); | ||||
|  * av_opt_set_int(avr, "in_channel_layout",  AV_CH_LAYOUT_5POINT1, 0); | ||||
|  * av_opt_set_int(avr, "out_channel_layout", AV_CH_LAYOUT_STEREO,  0); | ||||
|  * av_opt_set_int(avr, "in_sample_rate",     48000,                0); | ||||
|  * av_opt_set_int(avr, "out_sample_rate",    44100,                0); | ||||
|  * av_opt_set_int(avr, "in_sample_fmt",      AV_SAMPLE_FMT_FLTP,   0); | ||||
|  * av_opt_set_int(avr, "out_sample_fmt",     AV_SAMPLE_FMT_S16,    0); | ||||
|  * @endcode | ||||
|  * | ||||
|  * Once the context is initialized, it must be opened with avresample_open(). If | ||||
|  * you need to change the conversion parameters, you must close the context with | ||||
|  * avresample_close(), change the parameters as described above, then reopen it | ||||
|  * again. | ||||
|  * | ||||
|  * The conversion itself is done by repeatedly calling avresample_convert(). | ||||
|  * Note that the samples may get buffered in two places in lavr. The first one | ||||
|  * is the output FIFO, where the samples end up if the output buffer is not | ||||
|  * large enough. The data stored in there may be retrieved at any time with | ||||
|  * avresample_read(). The second place is the resampling delay buffer, | ||||
|  * applicable only when resampling is done. The samples in it require more input | ||||
|  * before they can be processed. Their current amount is returned by | ||||
|  * avresample_get_delay(). At the end of conversion the resampling buffer can be | ||||
|  * flushed by calling avresample_convert() with NULL input. | ||||
|  * | ||||
|  * The following code demonstrates the conversion loop assuming the parameters | ||||
|  * from above and caller-defined functions get_input() and handle_output(): | ||||
|  * @code | ||||
|  * uint8_t **input; | ||||
|  * int in_linesize, in_samples; | ||||
|  * | ||||
|  * while (get_input(&input, &in_linesize, &in_samples)) { | ||||
|  *     uint8_t *output | ||||
|  *     int out_linesize; | ||||
|  *     int out_samples = avresample_get_out_samples(avr, in_samples); | ||||
|  * | ||||
|  *     av_samples_alloc(&output, &out_linesize, 2, out_samples, | ||||
|  *                      AV_SAMPLE_FMT_S16, 0); | ||||
|  *     out_samples = avresample_convert(avr, &output, out_linesize, out_samples, | ||||
|  *                                      input, in_linesize, in_samples); | ||||
|  *     handle_output(output, out_linesize, out_samples); | ||||
|  *     av_freep(&output); | ||||
|  *  } | ||||
|  *  @endcode | ||||
|  * | ||||
|  *  When the conversion is finished and the FIFOs are flushed if required, the | ||||
|  *  conversion context and everything associated with it must be freed with | ||||
|  *  avresample_free(). | ||||
|  */ | ||||
| 
 | ||||
| #include "libavutil/avutil.h" | ||||
| #include "libavutil/channel_layout.h" | ||||
| #include "libavutil/dict.h" | ||||
| #include "libavutil/frame.h" | ||||
| #include "libavutil/log.h" | ||||
| #include "libavutil/mathematics.h" | ||||
| 
 | ||||
| #include "libavresample/version.h" | ||||
| 
 | ||||
| #define AVRESAMPLE_MAX_CHANNELS 32 | ||||
| 
 | ||||
| typedef struct AVAudioResampleContext AVAudioResampleContext; | ||||
| 
 | ||||
| /** Mixing Coefficient Types */ | ||||
| enum AVMixCoeffType { | ||||
|     AV_MIX_COEFF_TYPE_Q8,   /** 16-bit 8.8 fixed-point                      */ | ||||
|     AV_MIX_COEFF_TYPE_Q15,  /** 32-bit 17.15 fixed-point                    */ | ||||
|     AV_MIX_COEFF_TYPE_FLT,  /** floating-point                              */ | ||||
|     AV_MIX_COEFF_TYPE_NB,   /** Number of coeff types. Not part of ABI      */ | ||||
| }; | ||||
| 
 | ||||
| /** Resampling Filter Types */ | ||||
| enum AVResampleFilterType { | ||||
|     AV_RESAMPLE_FILTER_TYPE_CUBIC,              /**< Cubic */ | ||||
|     AV_RESAMPLE_FILTER_TYPE_BLACKMAN_NUTTALL,   /**< Blackman Nuttall Windowed Sinc */ | ||||
|     AV_RESAMPLE_FILTER_TYPE_KAISER,             /**< Kaiser Windowed Sinc */ | ||||
| }; | ||||
| 
 | ||||
| enum AVResampleDitherMethod { | ||||
|     AV_RESAMPLE_DITHER_NONE,            /**< Do not use dithering */ | ||||
|     AV_RESAMPLE_DITHER_RECTANGULAR,     /**< Rectangular Dither */ | ||||
|     AV_RESAMPLE_DITHER_TRIANGULAR,      /**< Triangular Dither*/ | ||||
|     AV_RESAMPLE_DITHER_TRIANGULAR_HP,   /**< Triangular Dither with High Pass */ | ||||
|     AV_RESAMPLE_DITHER_TRIANGULAR_NS,   /**< Triangular Dither with Noise Shaping */ | ||||
|     AV_RESAMPLE_DITHER_NB,              /**< Number of dither types. Not part of ABI. */ | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the LIBAVRESAMPLE_VERSION_INT constant. | ||||
|  */ | ||||
| unsigned avresample_version(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the libavresample build-time configuration. | ||||
|  * @return  configure string | ||||
|  */ | ||||
| const char *avresample_configuration(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the libavresample license. | ||||
|  */ | ||||
| const char *avresample_license(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the AVClass for AVAudioResampleContext. | ||||
|  * | ||||
|  * Can be used in combination with AV_OPT_SEARCH_FAKE_OBJ for examining options | ||||
|  * without allocating a context. | ||||
|  * | ||||
|  * @see av_opt_find(). | ||||
|  * | ||||
|  * @return AVClass for AVAudioResampleContext | ||||
|  */ | ||||
| const AVClass *avresample_get_class(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate AVAudioResampleContext and set options. | ||||
|  * | ||||
|  * @return  allocated audio resample context, or NULL on failure | ||||
|  */ | ||||
| AVAudioResampleContext *avresample_alloc_context(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Initialize AVAudioResampleContext. | ||||
|  * @note The context must be configured using the AVOption API. | ||||
|  * @note The fields "in_channel_layout", "out_channel_layout", | ||||
|  *       "in_sample_rate", "out_sample_rate", "in_sample_fmt", | ||||
|  *       "out_sample_fmt" must be set. | ||||
|  * | ||||
|  * @see av_opt_set_int() | ||||
|  * @see av_opt_set_dict() | ||||
|  * @see av_get_default_channel_layout() | ||||
|  * | ||||
|  * @param avr  audio resample context | ||||
|  * @return     0 on success, negative AVERROR code on failure | ||||
|  */ | ||||
| int avresample_open(AVAudioResampleContext *avr); | ||||
| 
 | ||||
| /**
 | ||||
|  * Check whether an AVAudioResampleContext is open or closed. | ||||
|  * | ||||
|  * @param avr AVAudioResampleContext to check | ||||
|  * @return 1 if avr is open, 0 if avr is closed. | ||||
|  */ | ||||
| int avresample_is_open(AVAudioResampleContext *avr); | ||||
| 
 | ||||
| /**
 | ||||
|  * Close AVAudioResampleContext. | ||||
|  * | ||||
|  * This closes the context, but it does not change the parameters. The context | ||||
|  * can be reopened with avresample_open(). It does, however, clear the output | ||||
|  * FIFO and any remaining leftover samples in the resampling delay buffer. If | ||||
|  * there was a custom matrix being used, that is also cleared. | ||||
|  * | ||||
|  * @see avresample_convert() | ||||
|  * @see avresample_set_matrix() | ||||
|  * | ||||
|  * @param avr  audio resample context | ||||
|  */ | ||||
| void avresample_close(AVAudioResampleContext *avr); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free AVAudioResampleContext and associated AVOption values. | ||||
|  * | ||||
|  * This also calls avresample_close() before freeing. | ||||
|  * | ||||
|  * @param avr  audio resample context | ||||
|  */ | ||||
| void avresample_free(AVAudioResampleContext **avr); | ||||
| 
 | ||||
| /**
 | ||||
|  * Generate a channel mixing matrix. | ||||
|  * | ||||
|  * This function is the one used internally by libavresample 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 normalize           if 1, coefficients will be normalized to prevent | ||||
|  *                            overflow. if 0, 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) | ||||
|  * @return                    0 on success, negative AVERROR code on failure | ||||
|  */ | ||||
| int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout, | ||||
|                             double center_mix_level, double surround_mix_level, | ||||
|                             double lfe_mix_level, int normalize, double *matrix, | ||||
|                             int stride, enum AVMatrixEncoding matrix_encoding); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the current channel mixing matrix. | ||||
|  * | ||||
|  * If no custom matrix has been previously set or the AVAudioResampleContext is | ||||
|  * not open, an error is returned. | ||||
|  * | ||||
|  * @param avr     audio resample context | ||||
|  * @param 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 | ||||
|  * @return        0 on success, negative AVERROR code on failure | ||||
|  */ | ||||
| int avresample_get_matrix(AVAudioResampleContext *avr, double *matrix, | ||||
|                           int stride); | ||||
| 
 | ||||
| /**
 | ||||
|  * Set channel mixing matrix. | ||||
|  * | ||||
|  * Allows for setting a custom mixing matrix, overriding the default matrix | ||||
|  * generated internally during avresample_open(). This function can be called | ||||
|  * anytime on an allocated context, either before or after calling | ||||
|  * avresample_open(), as long as the channel layouts have been set. | ||||
|  * avresample_convert() always uses the current matrix. | ||||
|  * Calling avresample_close() on the context will clear the current matrix. | ||||
|  * | ||||
|  * @see avresample_close() | ||||
|  * | ||||
|  * @param avr     audio resample context | ||||
|  * @param 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 | ||||
|  * @return        0 on success, negative AVERROR code on failure | ||||
|  */ | ||||
| int avresample_set_matrix(AVAudioResampleContext *avr, const double *matrix, | ||||
|                           int stride); | ||||
| 
 | ||||
| /**
 | ||||
|  * Set a customized input channel mapping. | ||||
|  * | ||||
|  * This function can only be called when the allocated context is not open. | ||||
|  * Also, the input channel layout must have already been set. | ||||
|  * | ||||
|  * Calling avresample_close() on the context will clear the channel mapping. | ||||
|  * | ||||
|  * The map for each input channel specifies the channel index in the source to | ||||
|  * use for that particular channel, or -1 to mute the channel. Source channels | ||||
|  * can be duplicated by using the same index for multiple input channels. | ||||
|  * | ||||
|  * Examples: | ||||
|  * | ||||
|  * Reordering 5.1 AAC order (C,L,R,Ls,Rs,LFE) to FFmpeg order (L,R,C,LFE,Ls,Rs): | ||||
|  * { 1, 2, 0, 5, 3, 4 } | ||||
|  * | ||||
|  * Muting the 3rd channel in 4-channel input: | ||||
|  * { 0, 1, -1, 3 } | ||||
|  * | ||||
|  * Duplicating the left channel of stereo input: | ||||
|  * { 0, 0 } | ||||
|  * | ||||
|  * @param avr         audio resample context | ||||
|  * @param channel_map customized input channel mapping | ||||
|  * @return            0 on success, negative AVERROR code on failure | ||||
|  */ | ||||
| int avresample_set_channel_mapping(AVAudioResampleContext *avr, | ||||
|                                    const int *channel_map); | ||||
| 
 | ||||
| /**
 | ||||
|  * Set compensation for resampling. | ||||
|  * | ||||
|  * This can be called anytime after avresample_open(). If resampling is not | ||||
|  * automatically enabled because of a sample rate conversion, the | ||||
|  * "force_resampling" option must have been set to 1 when opening the context | ||||
|  * in order to use resampling compensation. | ||||
|  * | ||||
|  * @param avr                    audio resample context | ||||
|  * @param sample_delta           compensation delta, in samples | ||||
|  * @param compensation_distance  compensation distance, in samples | ||||
|  * @return                       0 on success, negative AVERROR code on failure | ||||
|  */ | ||||
| int avresample_set_compensation(AVAudioResampleContext *avr, int sample_delta, | ||||
|                                 int compensation_distance); | ||||
| 
 | ||||
| /**
 | ||||
|  * Provide the upper bound on the number of samples the configured | ||||
|  * conversion would output. | ||||
|  * | ||||
|  * @param avr           audio resample context | ||||
|  * @param in_nb_samples number of input samples | ||||
|  * | ||||
|  * @return              number of samples or AVERROR(EINVAL) if the value | ||||
|  *                      would exceed INT_MAX | ||||
|  */ | ||||
| 
 | ||||
| int avresample_get_out_samples(AVAudioResampleContext *avr, int in_nb_samples); | ||||
| 
 | ||||
| /**
 | ||||
|  * Convert input samples and write them to the output FIFO. | ||||
|  * | ||||
|  * The upper bound on the number of output samples can be obtained through | ||||
|  * avresample_get_out_samples(). | ||||
|  * | ||||
|  * The output data can be NULL or have fewer allocated samples than required. | ||||
|  * In this case, any remaining samples not written to the output will be added | ||||
|  * to an internal FIFO buffer, to be returned at the next call to this function | ||||
|  * or to avresample_read(). | ||||
|  * | ||||
|  * If converting sample rate, there may be data remaining in the internal | ||||
|  * resampling delay buffer. avresample_get_delay() tells the number of remaining | ||||
|  * samples. To get this data as output, call avresample_convert() with NULL | ||||
|  * input. | ||||
|  * | ||||
|  * At the end of the conversion process, there may be data remaining in the | ||||
|  * internal FIFO buffer. avresample_available() tells the number of remaining | ||||
|  * samples. To get this data as output, either call avresample_convert() with | ||||
|  * NULL input or call avresample_read(). | ||||
|  * | ||||
|  * @see avresample_get_out_samples() | ||||
|  * @see avresample_read() | ||||
|  * @see avresample_get_delay() | ||||
|  * | ||||
|  * @param avr             audio resample context | ||||
|  * @param output          output data pointers | ||||
|  * @param out_plane_size  output plane size, in bytes. | ||||
|  *                        This can be 0 if unknown, but that will lead to | ||||
|  *                        optimized functions not being used directly on the | ||||
|  *                        output, which could slow down some conversions. | ||||
|  * @param out_samples     maximum number of samples that the output buffer can hold | ||||
|  * @param input           input data pointers | ||||
|  * @param in_plane_size   input plane size, in bytes | ||||
|  *                        This can be 0 if unknown, but that will lead to | ||||
|  *                        optimized functions not being used directly on the | ||||
|  *                        input, which could slow down some conversions. | ||||
|  * @param in_samples      number of input samples to convert | ||||
|  * @return                number of samples written to the output buffer, | ||||
|  *                        not including converted samples added to the internal | ||||
|  *                        output FIFO | ||||
|  */ | ||||
| int avresample_convert(AVAudioResampleContext *avr, uint8_t **output, | ||||
|                        int out_plane_size, int out_samples, | ||||
|                        uint8_t * const *input, int in_plane_size, | ||||
|                        int in_samples); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the number of samples currently in the resampling delay buffer. | ||||
|  * | ||||
|  * When resampling, there may be a delay between the input and output. Any | ||||
|  * unconverted samples in each call are stored internally in a delay buffer. | ||||
|  * This function allows the user to determine the current number of samples in | ||||
|  * the delay buffer, which can be useful for synchronization. | ||||
|  * | ||||
|  * @see avresample_convert() | ||||
|  * | ||||
|  * @param avr  audio resample context | ||||
|  * @return     number of samples currently in the resampling delay buffer | ||||
|  */ | ||||
| int avresample_get_delay(AVAudioResampleContext *avr); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the number of available samples in the output FIFO. | ||||
|  * | ||||
|  * During conversion, if the user does not specify an output buffer or | ||||
|  * specifies an output buffer that is smaller than what is needed, remaining | ||||
|  * samples that are not written to the output are stored to an internal FIFO | ||||
|  * buffer. The samples in the FIFO can be read with avresample_read() or | ||||
|  * avresample_convert(). | ||||
|  * | ||||
|  * @see avresample_read() | ||||
|  * @see avresample_convert() | ||||
|  * | ||||
|  * @param avr  audio resample context | ||||
|  * @return     number of samples available for reading | ||||
|  */ | ||||
| int avresample_available(AVAudioResampleContext *avr); | ||||
| 
 | ||||
| /**
 | ||||
|  * Read samples from the output FIFO. | ||||
|  * | ||||
|  * During conversion, if the user does not specify an output buffer or | ||||
|  * specifies an output buffer that is smaller than what is needed, remaining | ||||
|  * samples that are not written to the output are stored to an internal FIFO | ||||
|  * buffer. This function can be used to read samples from that internal FIFO. | ||||
|  * | ||||
|  * @see avresample_available() | ||||
|  * @see avresample_convert() | ||||
|  * | ||||
|  * @param avr         audio resample context | ||||
|  * @param output      output data pointers. May be NULL, in which case | ||||
|  *                    nb_samples of data is discarded from output FIFO. | ||||
|  * @param nb_samples  number of samples to read from the FIFO | ||||
|  * @return            the number of samples written to output | ||||
|  */ | ||||
| int avresample_read(AVAudioResampleContext *avr, uint8_t **output, int nb_samples); | ||||
| 
 | ||||
| /**
 | ||||
|  * Convert the samples in the input AVFrame and write them to the output AVFrame. | ||||
|  * | ||||
|  * Input and output AVFrames must have channel_layout, sample_rate and format set. | ||||
|  * | ||||
|  * The upper bound on the number of output samples is obtained through | ||||
|  * avresample_get_out_samples(). | ||||
|  * | ||||
|  * If the output AVFrame does not have the data pointers allocated the nb_samples | ||||
|  * field will be set using avresample_get_out_samples() and av_frame_get_buffer() | ||||
|  * is called to allocate the frame. | ||||
|  * | ||||
|  * The output AVFrame can be NULL or have fewer allocated samples than required. | ||||
|  * In this case, any remaining samples not written to the output will be added | ||||
|  * to an internal FIFO buffer, to be returned at the next call to this function | ||||
|  * or to avresample_convert() or to avresample_read(). | ||||
|  * | ||||
|  * If converting sample rate, there may be data remaining in the internal | ||||
|  * resampling delay buffer. avresample_get_delay() tells the number of | ||||
|  * remaining samples. To get this data as output, call this function or | ||||
|  * avresample_convert() with NULL input. | ||||
|  * | ||||
|  * At the end of the conversion process, there may be data remaining in the | ||||
|  * internal FIFO buffer. avresample_available() tells the number of remaining | ||||
|  * samples. To get this data as output, either call this function or | ||||
|  * avresample_convert() with NULL input or call avresample_read(). | ||||
|  * | ||||
|  * If the AVAudioResampleContext configuration does not match the output and | ||||
|  * input AVFrame settings the conversion does not take place and depending on | ||||
|  * which AVFrame is not matching AVERROR_OUTPUT_CHANGED, AVERROR_INPUT_CHANGED | ||||
|  * or AVERROR_OUTPUT_CHANGED|AVERROR_INPUT_CHANGED is returned. | ||||
|  * | ||||
|  * @see avresample_get_out_samples() | ||||
|  * @see avresample_available() | ||||
|  * @see avresample_convert() | ||||
|  * @see avresample_read() | ||||
|  * @see avresample_get_delay() | ||||
|  * | ||||
|  * @param avr             audio resample context | ||||
|  * @param output          output AVFrame | ||||
|  * @param input           input AVFrame | ||||
|  * @return                0 on success, AVERROR on failure or nonmatching | ||||
|  *                        configuration. | ||||
|  */ | ||||
| int avresample_convert_frame(AVAudioResampleContext *avr, | ||||
|                              AVFrame *output, AVFrame *input); | ||||
| 
 | ||||
| /**
 | ||||
|  * Configure or reconfigure the AVAudioResampleContext using the information | ||||
|  * provided by the AVFrames. | ||||
|  * | ||||
|  * The original resampling context is reset even on failure. | ||||
|  * The function calls avresample_close() internally if the context is open. | ||||
|  * | ||||
|  * @see avresample_open(); | ||||
|  * @see avresample_close(); | ||||
|  * | ||||
|  * @param avr             audio resample context | ||||
|  * @param output          output AVFrame | ||||
|  * @param input           input AVFrame | ||||
|  * @return                0 on success, AVERROR on failure. | ||||
|  */ | ||||
| int avresample_config(AVAudioResampleContext *avr, AVFrame *out, AVFrame *in); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVRESAMPLE_AVRESAMPLE_H */ | ||||
| @ -0,0 +1,50 @@ | ||||
| /*
 | ||||
|  * 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 AVRESAMPLE_VERSION_H | ||||
| #define AVRESAMPLE_VERSION_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * @ingroup lavr | ||||
|  * Libavresample version macros. | ||||
|  */ | ||||
| 
 | ||||
| #include "libavutil/version.h" | ||||
| 
 | ||||
| #define LIBAVRESAMPLE_VERSION_MAJOR  3 | ||||
| #define LIBAVRESAMPLE_VERSION_MINOR  1 | ||||
| #define LIBAVRESAMPLE_VERSION_MICRO  0 | ||||
| 
 | ||||
| #define LIBAVRESAMPLE_VERSION_INT  AV_VERSION_INT(LIBAVRESAMPLE_VERSION_MAJOR, \ | ||||
|                                                   LIBAVRESAMPLE_VERSION_MINOR, \
 | ||||
|                                                   LIBAVRESAMPLE_VERSION_MICRO) | ||||
| #define LIBAVRESAMPLE_VERSION          AV_VERSION(LIBAVRESAMPLE_VERSION_MAJOR, \ | ||||
|                                                   LIBAVRESAMPLE_VERSION_MINOR, \
 | ||||
|                                                   LIBAVRESAMPLE_VERSION_MICRO) | ||||
| #define LIBAVRESAMPLE_BUILD        LIBAVRESAMPLE_VERSION_INT | ||||
| 
 | ||||
| #define LIBAVRESAMPLE_IDENT        "Lavr" AV_STRINGIFY(LIBAVRESAMPLE_VERSION) | ||||
| 
 | ||||
| /**
 | ||||
|  * 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. | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVRESAMPLE_VERSION_H */ | ||||
| @ -0,0 +1,55 @@ | ||||
| /*
 | ||||
|  * copyright (c) 2006 Mans Rullgard | ||||
|  * | ||||
|  * 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_ADLER32_H | ||||
| #define AVUTIL_ADLER32_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include "attributes.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * Public header for libavutil Adler32 hasher | ||||
|  * | ||||
|  * @defgroup lavu_adler32 Adler32 | ||||
|  * @ingroup lavu_crypto | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Calculate the Adler32 checksum of a buffer. | ||||
|  * | ||||
|  * Passing the return value to a subsequent av_adler32_update() call | ||||
|  * allows the checksum of multiple buffers to be calculated as though | ||||
|  * they were concatenated. | ||||
|  * | ||||
|  * @param adler initial checksum value | ||||
|  * @param buf   pointer to input buffer | ||||
|  * @param len   size of input buffer | ||||
|  * @return      updated checksum | ||||
|  */ | ||||
| unsigned long av_adler32_update(unsigned long adler, const uint8_t *buf, | ||||
|                                 unsigned int len) av_pure; | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_ADLER32_H */ | ||||
| @ -0,0 +1,65 @@ | ||||
| /*
 | ||||
|  * copyright (c) 2007 Michael Niedermayer <michaelni@gmx.at> | ||||
|  * | ||||
|  * 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_H | ||||
| #define AVUTIL_AES_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "attributes.h" | ||||
| #include "version.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavu_aes AES | ||||
|  * @ingroup lavu_crypto | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| extern const int av_aes_size; | ||||
| 
 | ||||
| struct AVAES; | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate an AVAES context. | ||||
|  */ | ||||
| struct AVAES *av_aes_alloc(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Initialize an AVAES context. | ||||
|  * @param key_bits 128, 192 or 256 | ||||
|  * @param decrypt 0 for encryption, 1 for decryption | ||||
|  */ | ||||
| int av_aes_init(struct AVAES *a, const uint8_t *key, int key_bits, int decrypt); | ||||
| 
 | ||||
| /**
 | ||||
|  * Encrypt or decrypt a buffer using a previously initialized context. | ||||
|  * @param count number of 16 byte blocks | ||||
|  * @param dst destination array, can be equal to src | ||||
|  * @param src source array, can be equal to dst | ||||
|  * @param iv initialization vector for CBC mode, if NULL then ECB will be used | ||||
|  * @param decrypt 0 for encryption, 1 for decryption | ||||
|  */ | ||||
| void av_aes_crypt(struct AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_AES_H */ | ||||
| @ -0,0 +1,83 @@ | ||||
| /*
 | ||||
|  * AES-CTR cipher | ||||
|  * Copyright (c) 2015 Eran Kornblau <erankor at gmail dot com> | ||||
|  * | ||||
|  * 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 <stdint.h> | ||||
| 
 | ||||
| #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 iv | ||||
|  */ | ||||
| void av_aes_ctr_set_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 */ | ||||
| @ -0,0 +1,40 @@ | ||||
| /*
 | ||||
|  * Copyright (c) 2009 Mans Rullgard <mans@mansr.com> | ||||
|  * | ||||
|  * 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_ARM_TIMER_H | ||||
| #define AVUTIL_ARM_TIMER_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include "config.h" | ||||
| 
 | ||||
| #if HAVE_INLINE_ASM && defined(__ARM_ARCH_7A__) | ||||
| 
 | ||||
| #define AV_READ_TIME read_time | ||||
| 
 | ||||
| static inline uint64_t read_time(void) | ||||
| { | ||||
|     unsigned cc; | ||||
|     __asm__ volatile ("mrc p15, 0, %0, c9, c13, 0" : "=r"(cc)); | ||||
|     return cc; | ||||
| } | ||||
| 
 | ||||
| #endif /* HAVE_INLINE_ASM && __ARM_ARCH_7A__ */ | ||||
| 
 | ||||
| #endif /* AVUTIL_ARM_TIMER_H */ | ||||
| @ -0,0 +1,168 @@ | ||||
| /*
 | ||||
|  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | ||||
|  * | ||||
|  * 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 | ||||
|  * Macro definitions for various function/variable attributes | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVUTIL_ATTRIBUTES_H | ||||
| #define AVUTIL_ATTRIBUTES_H | ||||
| 
 | ||||
| #ifdef __GNUC__ | ||||
| #    define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y)) | ||||
| #    define AV_GCC_VERSION_AT_MOST(x,y)  (__GNUC__ < (x) || __GNUC__ == (x) && __GNUC_MINOR__ <= (y)) | ||||
| #else | ||||
| #    define AV_GCC_VERSION_AT_LEAST(x,y) 0 | ||||
| #    define AV_GCC_VERSION_AT_MOST(x,y)  0 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef av_always_inline | ||||
| #if AV_GCC_VERSION_AT_LEAST(3,1) | ||||
| #    define av_always_inline __attribute__((always_inline)) inline | ||||
| #elif defined(_MSC_VER) | ||||
| #    define av_always_inline __forceinline | ||||
| #else | ||||
| #    define av_always_inline inline | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #ifndef av_extern_inline | ||||
| #if defined(__ICL) && __ICL >= 1210 || defined(__GNUC_STDC_INLINE__) | ||||
| #    define av_extern_inline extern inline | ||||
| #else | ||||
| #    define av_extern_inline inline | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if AV_GCC_VERSION_AT_LEAST(3,4) | ||||
| #    define av_warn_unused_result __attribute__((warn_unused_result)) | ||||
| #else | ||||
| #    define av_warn_unused_result | ||||
| #endif | ||||
| 
 | ||||
| #if AV_GCC_VERSION_AT_LEAST(3,1) | ||||
| #    define av_noinline __attribute__((noinline)) | ||||
| #elif defined(_MSC_VER) | ||||
| #    define av_noinline __declspec(noinline) | ||||
| #else | ||||
| #    define av_noinline | ||||
| #endif | ||||
| 
 | ||||
| #if AV_GCC_VERSION_AT_LEAST(3,1) | ||||
| #    define av_pure __attribute__((pure)) | ||||
| #else | ||||
| #    define av_pure | ||||
| #endif | ||||
| 
 | ||||
| #if AV_GCC_VERSION_AT_LEAST(2,6) | ||||
| #    define av_const __attribute__((const)) | ||||
| #else | ||||
| #    define av_const | ||||
| #endif | ||||
| 
 | ||||
| #if AV_GCC_VERSION_AT_LEAST(4,3) | ||||
| #    define av_cold __attribute__((cold)) | ||||
| #else | ||||
| #    define av_cold | ||||
| #endif | ||||
| 
 | ||||
| #if AV_GCC_VERSION_AT_LEAST(4,1) && !defined(__llvm__) | ||||
| #    define av_flatten __attribute__((flatten)) | ||||
| #else | ||||
| #    define av_flatten | ||||
| #endif | ||||
| 
 | ||||
| #if AV_GCC_VERSION_AT_LEAST(3,1) | ||||
| #    define attribute_deprecated __attribute__((deprecated)) | ||||
| #elif defined(_MSC_VER) | ||||
| #    define attribute_deprecated __declspec(deprecated) | ||||
| #else | ||||
| #    define attribute_deprecated | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * Disable warnings about deprecated features | ||||
|  * This is useful for sections of code kept for backward compatibility and | ||||
|  * scheduled for removal. | ||||
|  */ | ||||
| #ifndef AV_NOWARN_DEPRECATED | ||||
| #if AV_GCC_VERSION_AT_LEAST(4,6) | ||||
| #    define AV_NOWARN_DEPRECATED(code) \ | ||||
|         _Pragma("GCC diagnostic push") \
 | ||||
|         _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") \
 | ||||
|         code \
 | ||||
|         _Pragma("GCC diagnostic pop") | ||||
| #elif defined(_MSC_VER) | ||||
| #    define AV_NOWARN_DEPRECATED(code) \ | ||||
|         __pragma(warning(push)) \
 | ||||
|         __pragma(warning(disable : 4996)) \
 | ||||
|         code; \
 | ||||
|         __pragma(warning(pop)) | ||||
| #else | ||||
| #    define AV_NOWARN_DEPRECATED(code) code | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| #if defined(__GNUC__) | ||||
| #    define av_unused __attribute__((unused)) | ||||
| #else | ||||
| #    define av_unused | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * Mark a variable as used and prevent the compiler from optimizing it | ||||
|  * away.  This is useful for variables accessed only from inline | ||||
|  * assembler without the compiler being aware. | ||||
|  */ | ||||
| #if AV_GCC_VERSION_AT_LEAST(3,1) | ||||
| #    define av_used __attribute__((used)) | ||||
| #else | ||||
| #    define av_used | ||||
| #endif | ||||
| 
 | ||||
| #if AV_GCC_VERSION_AT_LEAST(3,3) | ||||
| #   define av_alias __attribute__((may_alias)) | ||||
| #else | ||||
| #   define av_alias | ||||
| #endif | ||||
| 
 | ||||
| #if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__) | ||||
| #    define av_uninit(x) x=x | ||||
| #else | ||||
| #    define av_uninit(x) x | ||||
| #endif | ||||
| 
 | ||||
| #ifdef __GNUC__ | ||||
| #    define av_builtin_constant_p __builtin_constant_p | ||||
| #    define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos))) | ||||
| #else | ||||
| #    define av_builtin_constant_p(x) 0 | ||||
| #    define av_printf_format(fmtpos, attrpos) | ||||
| #endif | ||||
| 
 | ||||
| #if AV_GCC_VERSION_AT_LEAST(2,5) | ||||
| #    define av_noreturn __attribute__((noreturn)) | ||||
| #else | ||||
| #    define av_noreturn | ||||
| #endif | ||||
| 
 | ||||
| #endif /* AVUTIL_ATTRIBUTES_H */ | ||||
| @ -0,0 +1,170 @@ | ||||
| /*
 | ||||
|  * Audio FIFO | ||||
|  * Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com> | ||||
|  * | ||||
|  * 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 | ||||
|  * Audio FIFO Buffer | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVUTIL_AUDIO_FIFO_H | ||||
| #define AVUTIL_AUDIO_FIFO_H | ||||
| 
 | ||||
| #include "avutil.h" | ||||
| #include "fifo.h" | ||||
| #include "samplefmt.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * @addtogroup lavu_audio | ||||
|  * @{ | ||||
|  * | ||||
|  * @defgroup lavu_audiofifo Audio FIFO Buffer | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Context for an Audio FIFO Buffer. | ||||
|  * | ||||
|  * - Operates at the sample level rather than the byte level. | ||||
|  * - Supports multiple channels with either planar or packed sample format. | ||||
|  * - Automatic reallocation when writing to a full buffer. | ||||
|  */ | ||||
| typedef struct AVAudioFifo AVAudioFifo; | ||||
| 
 | ||||
| /**
 | ||||
|  * Free an AVAudioFifo. | ||||
|  * | ||||
|  * @param af  AVAudioFifo to free | ||||
|  */ | ||||
| void av_audio_fifo_free(AVAudioFifo *af); | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate an AVAudioFifo. | ||||
|  * | ||||
|  * @param sample_fmt  sample format | ||||
|  * @param channels    number of channels | ||||
|  * @param nb_samples  initial allocation size, in samples | ||||
|  * @return            newly allocated AVAudioFifo, or NULL on error | ||||
|  */ | ||||
| AVAudioFifo *av_audio_fifo_alloc(enum AVSampleFormat sample_fmt, int channels, | ||||
|                                  int nb_samples); | ||||
| 
 | ||||
| /**
 | ||||
|  * Reallocate an AVAudioFifo. | ||||
|  * | ||||
|  * @param af          AVAudioFifo to reallocate | ||||
|  * @param nb_samples  new allocation size, in samples | ||||
|  * @return            0 if OK, or negative AVERROR code on failure | ||||
|  */ | ||||
| av_warn_unused_result | ||||
| int av_audio_fifo_realloc(AVAudioFifo *af, int nb_samples); | ||||
| 
 | ||||
| /**
 | ||||
|  * Write data to an AVAudioFifo. | ||||
|  * | ||||
|  * The AVAudioFifo will be reallocated automatically if the available space | ||||
|  * is less than nb_samples. | ||||
|  * | ||||
|  * @see enum AVSampleFormat | ||||
|  * The documentation for AVSampleFormat describes the data layout. | ||||
|  * | ||||
|  * @param af          AVAudioFifo to write to | ||||
|  * @param data        audio data plane pointers | ||||
|  * @param nb_samples  number of samples to write | ||||
|  * @return            number of samples actually written, or negative AVERROR | ||||
|  *                    code on failure. If successful, the number of samples | ||||
|  *                    actually written will always be nb_samples. | ||||
|  */ | ||||
| int av_audio_fifo_write(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 | ||||
|  * @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(AVAudioFifo *af, void **data, int nb_samples); | ||||
| 
 | ||||
| /**
 | ||||
|  * Read 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 read | ||||
|  * @return            number of samples actually read, or negative AVERROR code | ||||
|  *                    on failure. The number of samples actually read 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_read(AVAudioFifo *af, void **data, int nb_samples); | ||||
| 
 | ||||
| /**
 | ||||
|  * Drain data from an AVAudioFifo. | ||||
|  * | ||||
|  * Removes the data without reading it. | ||||
|  * | ||||
|  * @param af          AVAudioFifo to drain | ||||
|  * @param nb_samples  number of samples to drain | ||||
|  * @return            0 if OK, or negative AVERROR code on failure | ||||
|  */ | ||||
| int av_audio_fifo_drain(AVAudioFifo *af, int nb_samples); | ||||
| 
 | ||||
| /**
 | ||||
|  * Reset the AVAudioFifo buffer. | ||||
|  * | ||||
|  * This empties all data in the buffer. | ||||
|  * | ||||
|  * @param af  AVAudioFifo to reset | ||||
|  */ | ||||
| void av_audio_fifo_reset(AVAudioFifo *af); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the current number of samples in the AVAudioFifo available for reading. | ||||
|  * | ||||
|  * @param af  the AVAudioFifo to query | ||||
|  * @return    number of samples available for reading | ||||
|  */ | ||||
| int av_audio_fifo_size(AVAudioFifo *af); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the current number of samples in the AVAudioFifo available for writing. | ||||
|  * | ||||
|  * @param af  the AVAudioFifo to query | ||||
|  * @return    number of samples available for writing | ||||
|  */ | ||||
| int av_audio_fifo_space(AVAudioFifo *af); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_AUDIO_FIFO_H */ | ||||
| @ -0,0 +1,66 @@ | ||||
| /*
 | ||||
|  * copyright (c) 2010 Michael Niedermayer <michaelni@gmx.at> | ||||
|  * | ||||
|  * 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 | ||||
|  * simple assert() macros that are a bit more flexible than ISO C assert(). | ||||
|  * @author Michael Niedermayer <michaelni@gmx.at> | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVUTIL_AVASSERT_H | ||||
| #define AVUTIL_AVASSERT_H | ||||
| 
 | ||||
| #include <stdlib.h> | ||||
| #include "avutil.h" | ||||
| #include "log.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * assert() equivalent, that is always enabled. | ||||
|  */ | ||||
| #define av_assert0(cond) do {                                           \ | ||||
|     if (!(cond)) {                                                      \
 | ||||
|         av_log(NULL, AV_LOG_PANIC, "Assertion %s failed at %s:%d\n",    \
 | ||||
|                AV_STRINGIFY(cond), __FILE__, __LINE__);                 \
 | ||||
|         abort();                                                        \
 | ||||
|     }                                                                   \
 | ||||
| } while (0) | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * assert() equivalent, that does not lie in speed critical code. | ||||
|  * These asserts() thus can be enabled without fearing speedloss. | ||||
|  */ | ||||
| #if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 0 | ||||
| #define av_assert1(cond) av_assert0(cond) | ||||
| #else | ||||
| #define av_assert1(cond) ((void)0) | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * assert() equivalent, that does lie in speed critical code. | ||||
|  */ | ||||
| #if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1 | ||||
| #define av_assert2(cond) av_assert0(cond) | ||||
| #else | ||||
| #define av_assert2(cond) ((void)0) | ||||
| #endif | ||||
| 
 | ||||
| #endif /* AVUTIL_AVASSERT_H */ | ||||
| @ -0,0 +1,7 @@ | ||||
| /* Generated by ffconf */ | ||||
| #ifndef AVUTIL_AVCONFIG_H | ||||
| #define AVUTIL_AVCONFIG_H | ||||
| #define AV_HAVE_BIGENDIAN 0 | ||||
| #define AV_HAVE_FAST_UNALIGNED 0 | ||||
| #define AV_HAVE_INCOMPATIBLE_LIBAV_ABI 0 | ||||
| #endif /* AVUTIL_AVCONFIG_H */ | ||||
| @ -0,0 +1,402 @@ | ||||
| /*
 | ||||
|  * Copyright (c) 2007 Mans Rullgard | ||||
|  * | ||||
|  * 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_AVSTRING_H | ||||
| #define AVUTIL_AVSTRING_H | ||||
| 
 | ||||
| #include <stddef.h> | ||||
| #include <stdint.h> | ||||
| #include "attributes.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * @addtogroup lavu_string | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Return non-zero if pfx is a prefix of str. If it is, *ptr is set to | ||||
|  * the address of the first character in str after the prefix. | ||||
|  * | ||||
|  * @param str input string | ||||
|  * @param pfx prefix to test | ||||
|  * @param ptr updated if the prefix is matched inside str | ||||
|  * @return non-zero if the prefix matches, zero otherwise | ||||
|  */ | ||||
| int av_strstart(const char *str, const char *pfx, const char **ptr); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return non-zero if pfx is a prefix of str independent of case. If | ||||
|  * it is, *ptr is set to the address of the first character in str | ||||
|  * after the prefix. | ||||
|  * | ||||
|  * @param str input string | ||||
|  * @param pfx prefix to test | ||||
|  * @param ptr updated if the prefix is matched inside str | ||||
|  * @return non-zero if the prefix matches, zero otherwise | ||||
|  */ | ||||
| int av_stristart(const char *str, const char *pfx, const char **ptr); | ||||
| 
 | ||||
| /**
 | ||||
|  * Locate the first case-independent occurrence in the string haystack | ||||
|  * of the string needle.  A zero-length string needle is considered to | ||||
|  * match at the start of haystack. | ||||
|  * | ||||
|  * This function is a case-insensitive version of the standard strstr(). | ||||
|  * | ||||
|  * @param haystack string to search in | ||||
|  * @param needle   string to search for | ||||
|  * @return         pointer to the located match within haystack | ||||
|  *                 or a null pointer if no match | ||||
|  */ | ||||
| char *av_stristr(const char *haystack, const char *needle); | ||||
| 
 | ||||
| /**
 | ||||
|  * Locate the first occurrence of the string needle in the string haystack | ||||
|  * where not more than hay_length characters are searched. A zero-length | ||||
|  * string needle is considered to match at the start of haystack. | ||||
|  * | ||||
|  * This function is a length-limited version of the standard strstr(). | ||||
|  * | ||||
|  * @param haystack   string to search in | ||||
|  * @param needle     string to search for | ||||
|  * @param hay_length length of string to search in | ||||
|  * @return           pointer to the located match within haystack | ||||
|  *                   or a null pointer if no match | ||||
|  */ | ||||
| char *av_strnstr(const char *haystack, const char *needle, size_t hay_length); | ||||
| 
 | ||||
| /**
 | ||||
|  * Copy the string src to dst, but no more than size - 1 bytes, and | ||||
|  * null-terminate dst. | ||||
|  * | ||||
|  * This function is the same as BSD strlcpy(). | ||||
|  * | ||||
|  * @param dst destination buffer | ||||
|  * @param src source string | ||||
|  * @param size size of destination buffer | ||||
|  * @return the length of src | ||||
|  * | ||||
|  * @warning since the return value is the length of src, src absolutely | ||||
|  * _must_ be a properly 0-terminated string, otherwise this will read beyond | ||||
|  * the end of the buffer and possibly crash. | ||||
|  */ | ||||
| size_t av_strlcpy(char *dst, const char *src, size_t size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Append the string src to the string dst, but to a total length of | ||||
|  * no more than size - 1 bytes, and null-terminate dst. | ||||
|  * | ||||
|  * This function is similar to BSD strlcat(), but differs when | ||||
|  * size <= strlen(dst). | ||||
|  * | ||||
|  * @param dst destination buffer | ||||
|  * @param src source string | ||||
|  * @param size size of destination buffer | ||||
|  * @return the total length of src and dst | ||||
|  * | ||||
|  * @warning since the return value use the length of src and dst, these | ||||
|  * absolutely _must_ be a properly 0-terminated strings, otherwise this | ||||
|  * will read beyond the end of the buffer and possibly crash. | ||||
|  */ | ||||
| size_t av_strlcat(char *dst, const char *src, size_t size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Append output to a string, according to a format. Never write out of | ||||
|  * the destination buffer, and always put a terminating 0 within | ||||
|  * the buffer. | ||||
|  * @param dst destination buffer (string to which the output is | ||||
|  *  appended) | ||||
|  * @param size total size of the destination buffer | ||||
|  * @param fmt printf-compatible format string, specifying how the | ||||
|  *  following parameters are used | ||||
|  * @return the length of the string that would have been generated | ||||
|  *  if enough space had been available | ||||
|  */ | ||||
| size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) av_printf_format(3, 4); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the count of continuous non zero chars starting from the beginning. | ||||
|  * | ||||
|  * @param len maximum number of characters to check in the string, that | ||||
|  *            is the maximum value which is returned by the function | ||||
|  */ | ||||
| static inline size_t av_strnlen(const char *s, size_t len) | ||||
| { | ||||
|     size_t i; | ||||
|     for (i = 0; i < len && s[i]; i++) | ||||
|         ; | ||||
|     return i; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Print arguments following specified format into a large enough auto | ||||
|  * allocated buffer. It is similar to GNU asprintf(). | ||||
|  * @param fmt printf-compatible format string, specifying how the | ||||
|  *            following parameters are used. | ||||
|  * @return the allocated string | ||||
|  * @note You have to free the string yourself with av_free(). | ||||
|  */ | ||||
| char *av_asprintf(const char *fmt, ...) av_printf_format(1, 2); | ||||
| 
 | ||||
| /**
 | ||||
|  * Convert a number to a av_malloced string. | ||||
|  */ | ||||
| char *av_d2str(double d); | ||||
| 
 | ||||
| /**
 | ||||
|  * Unescape the given string until a non escaped terminating char, | ||||
|  * and return the token corresponding to the unescaped string. | ||||
|  * | ||||
|  * The normal \ and ' escaping is supported. Leading and trailing | ||||
|  * whitespaces are removed, unless they are escaped with '\' or are | ||||
|  * enclosed between ''. | ||||
|  * | ||||
|  * @param buf the buffer to parse, buf will be updated to point to the | ||||
|  * terminating char | ||||
|  * @param term a 0-terminated list of terminating chars | ||||
|  * @return the malloced unescaped string, which must be av_freed by | ||||
|  * the user, NULL in case of allocation failure | ||||
|  */ | ||||
| char *av_get_token(const char **buf, const char *term); | ||||
| 
 | ||||
| /**
 | ||||
|  * Split the string into several tokens which can be accessed by | ||||
|  * successive calls to av_strtok(). | ||||
|  * | ||||
|  * A token is defined as a sequence of characters not belonging to the | ||||
|  * set specified in delim. | ||||
|  * | ||||
|  * On the first call to av_strtok(), s should point to the string to | ||||
|  * parse, and the value of saveptr is ignored. In subsequent calls, s | ||||
|  * should be NULL, and saveptr should be unchanged since the previous | ||||
|  * call. | ||||
|  * | ||||
|  * This function is similar to strtok_r() defined in POSIX.1. | ||||
|  * | ||||
|  * @param s the string to parse, may be NULL | ||||
|  * @param delim 0-terminated list of token delimiters, must be non-NULL | ||||
|  * @param saveptr user-provided pointer which points to stored | ||||
|  * information necessary for av_strtok() to continue scanning the same | ||||
|  * string. saveptr is updated to point to the next character after the | ||||
|  * first delimiter found, or to NULL if the string was terminated | ||||
|  * @return the found token, or NULL when no token is found | ||||
|  */ | ||||
| char *av_strtok(char *s, const char *delim, char **saveptr); | ||||
| 
 | ||||
| /**
 | ||||
|  * Locale-independent conversion of ASCII isdigit. | ||||
|  */ | ||||
| static inline av_const int av_isdigit(int c) | ||||
| { | ||||
|     return c >= '0' && c <= '9'; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Locale-independent conversion of ASCII isgraph. | ||||
|  */ | ||||
| static inline av_const int av_isgraph(int c) | ||||
| { | ||||
|     return c > 32 && c < 127; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Locale-independent conversion of ASCII isspace. | ||||
|  */ | ||||
| static inline av_const int av_isspace(int c) | ||||
| { | ||||
|     return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || | ||||
|            c == '\v'; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Locale-independent conversion of ASCII characters to uppercase. | ||||
|  */ | ||||
| static inline av_const int av_toupper(int c) | ||||
| { | ||||
|     if (c >= 'a' && c <= 'z') | ||||
|         c ^= 0x20; | ||||
|     return c; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Locale-independent conversion of ASCII characters to lowercase. | ||||
|  */ | ||||
| static inline av_const int av_tolower(int c) | ||||
| { | ||||
|     if (c >= 'A' && c <= 'Z') | ||||
|         c ^= 0x20; | ||||
|     return c; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Locale-independent conversion of ASCII isxdigit. | ||||
|  */ | ||||
| static inline av_const int av_isxdigit(int c) | ||||
| { | ||||
|     c = av_tolower(c); | ||||
|     return av_isdigit(c) || (c >= 'a' && c <= 'f'); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Locale-independent case-insensitive compare. | ||||
|  * @note This means only ASCII-range characters are case-insensitive | ||||
|  */ | ||||
| int av_strcasecmp(const char *a, const char *b); | ||||
| 
 | ||||
| /**
 | ||||
|  * Locale-independent case-insensitive compare. | ||||
|  * @note This means only ASCII-range characters are case-insensitive | ||||
|  */ | ||||
| int av_strncasecmp(const char *a, const char *b, size_t n); | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * Thread safe basename. | ||||
|  * @param path the path, on DOS both \ and / are considered separators. | ||||
|  * @return pointer to the basename substring. | ||||
|  */ | ||||
| const char *av_basename(const char *path); | ||||
| 
 | ||||
| /**
 | ||||
|  * Thread safe dirname. | ||||
|  * @param path the path, on DOS both \ and / are considered separators. | ||||
|  * @return the path with the separator replaced by the string terminator or ".". | ||||
|  * @note the function may change the input string. | ||||
|  */ | ||||
| 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. | ||||
|  */ | ||||
| int av_match_name(const char *name, const char *names); | ||||
| 
 | ||||
| /**
 | ||||
|  * Append path component to the existing path. | ||||
|  * Path separator '/' is placed between when needed. | ||||
|  * Resulting string have to be freed with av_free(). | ||||
|  * @param path      base path | ||||
|  * @param component component to be appended | ||||
|  * @return new path or NULL on error. | ||||
|  */ | ||||
| char *av_append_path_component(const char *path, const char *component); | ||||
| 
 | ||||
| enum AVEscapeMode { | ||||
|     AV_ESCAPE_MODE_AUTO,      ///< Use auto-selected escaping mode.
 | ||||
|     AV_ESCAPE_MODE_BACKSLASH, ///< Use backslash escaping.
 | ||||
|     AV_ESCAPE_MODE_QUOTE,     ///< Use single-quote escaping.
 | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Consider spaces special and escape them even in the middle of the | ||||
|  * string. | ||||
|  * | ||||
|  * This is equivalent to adding the whitespace characters to the special | ||||
|  * characters lists, except it is guaranteed to use the exact same list | ||||
|  * of whitespace characters as the rest of libavutil. | ||||
|  */ | ||||
| #define AV_ESCAPE_FLAG_WHITESPACE (1 << 0) | ||||
| 
 | ||||
| /**
 | ||||
|  * Escape only specified special characters. | ||||
|  * Without this flag, escape also any characters that may be considered | ||||
|  * special by av_get_token(), such as the single quote. | ||||
|  */ | ||||
| #define AV_ESCAPE_FLAG_STRICT (1 << 1) | ||||
| 
 | ||||
| /**
 | ||||
|  * Escape string in src, and put the escaped string in an allocated | ||||
|  * string in *dst, which must be freed with av_free(). | ||||
|  * | ||||
|  * @param dst           pointer where an allocated string is put | ||||
|  * @param src           string to escape, must be non-NULL | ||||
|  * @param special_chars string containing the special characters which | ||||
|  *                      need to be escaped, can be NULL | ||||
|  * @param mode          escape mode to employ, see AV_ESCAPE_MODE_* macros. | ||||
|  *                      Any unknown value for mode will be considered equivalent to | ||||
|  *                      AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without | ||||
|  *                      notice. | ||||
|  * @param flags         flags which control how to escape, see AV_ESCAPE_FLAG_ macros | ||||
|  * @return the length of the allocated string, or a negative error code in case of error | ||||
|  * @see av_bprint_escape() | ||||
|  */ | ||||
| av_warn_unused_result | ||||
| int av_escape(char **dst, const char *src, const char *special_chars, | ||||
|               enum AVEscapeMode mode, int flags); | ||||
| 
 | ||||
| #define AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES          1 ///< accept codepoints over 0x10FFFF
 | ||||
| #define AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS             2 ///< accept non-characters - 0xFFFE and 0xFFFF
 | ||||
| #define AV_UTF8_FLAG_ACCEPT_SURROGATES                 4 ///< accept UTF-16 surrogates codes
 | ||||
| #define AV_UTF8_FLAG_EXCLUDE_XML_INVALID_CONTROL_CODES 8 ///< exclude control codes not accepted by XML
 | ||||
| 
 | ||||
| #define AV_UTF8_FLAG_ACCEPT_ALL \ | ||||
|     AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES|AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS|AV_UTF8_FLAG_ACCEPT_SURROGATES | ||||
| 
 | ||||
| /**
 | ||||
|  * Read and decode a single UTF-8 code point (character) from the | ||||
|  * buffer in *buf, and update *buf to point to the next byte to | ||||
|  * decode. | ||||
|  * | ||||
|  * In case of an invalid byte sequence, the pointer will be updated to | ||||
|  * the next byte after the invalid sequence and the function will | ||||
|  * return an error code. | ||||
|  * | ||||
|  * Depending on the specified flags, the function will also fail in | ||||
|  * case the decoded code point does not belong to a valid range. | ||||
|  * | ||||
|  * @note For speed-relevant code a carefully implemented use of | ||||
|  * GET_UTF8() may be preferred. | ||||
|  * | ||||
|  * @param codep   pointer used to return the parsed code in case of success. | ||||
|  *                The value in *codep is set even in case the range check fails. | ||||
|  * @param bufp    pointer to the address the first byte of the sequence | ||||
|  *                to decode, updated by the function to point to the | ||||
|  *                byte next after the decoded sequence | ||||
|  * @param buf_end pointer to the end of the buffer, points to the next | ||||
|  *                byte past the last in the buffer. This is used to | ||||
|  *                avoid buffer overreads (in case of an unfinished | ||||
|  *                UTF-8 sequence towards the end of the buffer). | ||||
|  * @param flags   a collection of AV_UTF8_FLAG_* flags | ||||
|  * @return >= 0 in case a sequence was successfully read, a negative | ||||
|  * value in case of invalid sequence | ||||
|  */ | ||||
| av_warn_unused_result | ||||
| int av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end, | ||||
|                    unsigned int flags); | ||||
| 
 | ||||
| /**
 | ||||
|  * Check if a name is in a list. | ||||
|  * @returns 0 if not found, or the 1 based index where it has been found in the | ||||
|  *            list. | ||||
|  */ | ||||
| int av_match_list(const char *name, const char *list, char separator); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_AVSTRING_H */ | ||||
| @ -0,0 +1,343 @@ | ||||
| /*
 | ||||
|  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | ||||
|  * | ||||
|  * 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_AVUTIL_H | ||||
| #define AVUTIL_AVUTIL_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * external API header | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @mainpage | ||||
|  * | ||||
|  * @section ffmpeg_intro Introduction | ||||
|  * | ||||
|  * This document describes the usage of the different libraries | ||||
|  * provided by FFmpeg. | ||||
|  * | ||||
|  * @li @ref libavc "libavcodec" encoding/decoding library | ||||
|  * @li @ref lavfi "libavfilter" graph-based frame editing library | ||||
|  * @li @ref libavf "libavformat" I/O and muxing/demuxing library | ||||
|  * @li @ref lavd "libavdevice" special devices muxing/demuxing library | ||||
|  * @li @ref lavu "libavutil" common utility library | ||||
|  * @li @ref lswr "libswresample" audio resampling, format conversion and mixing | ||||
|  * @li @ref lpp  "libpostproc" post processing library | ||||
|  * @li @ref libsws "libswscale" color conversion and scaling library | ||||
|  * | ||||
|  * @section ffmpeg_versioning Versioning and compatibility | ||||
|  * | ||||
|  * Each of the FFmpeg libraries contains a version.h header, which defines a | ||||
|  * major, minor and micro version number with the | ||||
|  * <em>LIBRARYNAME_VERSION_{MAJOR,MINOR,MICRO}</em> macros. The major version | ||||
|  * number is incremented with backward incompatible changes - e.g. removing | ||||
|  * parts of the public API, reordering public struct members, etc. The minor | ||||
|  * version number is incremented for backward compatible API changes or major | ||||
|  * new features - e.g. adding a new public function or a new decoder. The micro | ||||
|  * version number is incremented for smaller changes that a calling program | ||||
|  * might still want to check for - e.g. changing behavior in a previously | ||||
|  * unspecified situation. | ||||
|  * | ||||
|  * FFmpeg guarantees backward API and ABI compatibility for each library as long | ||||
|  * as its major version number is unchanged. This means that no public symbols | ||||
|  * will be removed or renamed. Types and names of the public struct members and | ||||
|  * values of public macros and enums will remain the same (unless they were | ||||
|  * explicitly declared as not part of the public API). Documented behavior will | ||||
|  * not change. | ||||
|  * | ||||
|  * In other words, any correct program that works with a given FFmpeg snapshot | ||||
|  * should work just as well without any changes with any later snapshot with the | ||||
|  * same major versions. This applies to both rebuilding the program against new | ||||
|  * FFmpeg versions or to replacing the dynamic FFmpeg libraries that a program | ||||
|  * links against. | ||||
|  * | ||||
|  * However, new public symbols may be added and new members may be appended to | ||||
|  * public structs whose size is not part of public ABI (most public structs in | ||||
|  * FFmpeg). New macros and enum values may be added. Behavior in undocumented | ||||
|  * situations may change slightly (and be documented). All those are accompanied | ||||
|  * by an entry in doc/APIchanges and incrementing either the minor or micro | ||||
|  * version number. | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavu Common utility functions | ||||
|  * | ||||
|  * @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. | ||||
|  * | ||||
|  * @{ | ||||
|  * | ||||
|  * @defgroup lavu_crypto Crypto and Hashing | ||||
|  * | ||||
|  * @{ | ||||
|  * @} | ||||
|  * | ||||
|  * @defgroup lavu_math Maths | ||||
|  * @{ | ||||
|  * | ||||
|  * @} | ||||
|  * | ||||
|  * @defgroup lavu_string String Manipulation | ||||
|  * | ||||
|  * @{ | ||||
|  * | ||||
|  * @} | ||||
|  * | ||||
|  * @defgroup lavu_mem Memory Management | ||||
|  * | ||||
|  * @{ | ||||
|  * | ||||
|  * @} | ||||
|  * | ||||
|  * @defgroup lavu_data Data Structures | ||||
|  * @{ | ||||
|  * | ||||
|  * @} | ||||
|  * | ||||
|  * @defgroup lavu_audio Audio related | ||||
|  * | ||||
|  * @{ | ||||
|  * | ||||
|  * @} | ||||
|  * | ||||
|  * @defgroup lavu_error Error Codes | ||||
|  * | ||||
|  * @{ | ||||
|  * | ||||
|  * @} | ||||
|  * | ||||
|  * @defgroup lavu_log Logging Facility | ||||
|  * | ||||
|  * @{ | ||||
|  * | ||||
|  * @} | ||||
|  * | ||||
|  * @defgroup lavu_misc Other | ||||
|  * | ||||
|  * @{ | ||||
|  * | ||||
|  * @defgroup preproc_misc Preprocessor String Macros | ||||
|  * | ||||
|  * @{ | ||||
|  * | ||||
|  * @} | ||||
|  * | ||||
|  * @defgroup version_utils Library Version Macros | ||||
|  * | ||||
|  * @{ | ||||
|  * | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * @addtogroup lavu_ver | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the LIBAVUTIL_VERSION_INT constant. | ||||
|  */ | ||||
| unsigned avutil_version(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return an informative version string. This usually is the actual release | ||||
|  * version number or a git commit description. This string has no fixed format | ||||
|  * and can change any time. It should never be parsed by code. | ||||
|  */ | ||||
| const char *av_version_info(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the libavutil build-time configuration. | ||||
|  */ | ||||
| const char *avutil_configuration(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the libavutil license. | ||||
|  */ | ||||
| const char *avutil_license(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @addtogroup lavu_media Media Type | ||||
|  * @brief Media Type | ||||
|  */ | ||||
| 
 | ||||
| enum AVMediaType { | ||||
|     AVMEDIA_TYPE_UNKNOWN = -1,  ///< Usually treated as AVMEDIA_TYPE_DATA
 | ||||
|     AVMEDIA_TYPE_VIDEO, | ||||
|     AVMEDIA_TYPE_AUDIO, | ||||
|     AVMEDIA_TYPE_DATA,          ///< Opaque data information usually continuous
 | ||||
|     AVMEDIA_TYPE_SUBTITLE, | ||||
|     AVMEDIA_TYPE_ATTACHMENT,    ///< Opaque data information usually sparse
 | ||||
|     AVMEDIA_TYPE_NB | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Return a string describing the media_type enum, NULL if media_type | ||||
|  * is unknown. | ||||
|  */ | ||||
| const char *av_get_media_type_string(enum AVMediaType media_type); | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavu_const Constants | ||||
|  * @{ | ||||
|  * | ||||
|  * @defgroup lavu_enc Encoding specific | ||||
|  * | ||||
|  * @note those definition should move to avcodec | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| #define FF_LAMBDA_SHIFT 7 | ||||
| #define FF_LAMBDA_SCALE (1<<FF_LAMBDA_SHIFT) | ||||
| #define FF_QP2LAMBDA 118 ///< factor to convert from H.263 QP to lambda
 | ||||
| #define FF_LAMBDA_MAX (256*128-1) | ||||
| 
 | ||||
| #define FF_QUALITY_SCALE FF_LAMBDA_SCALE //FIXME maybe remove
 | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  * @defgroup lavu_time Timestamp specific | ||||
|  * | ||||
|  * FFmpeg internal timebase and timestamp definitions | ||||
|  * | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Undefined timestamp value | ||||
|  * | ||||
|  * Usually reported by demuxer that work on containers that do not provide | ||||
|  * either pts or dts. | ||||
|  */ | ||||
| 
 | ||||
| #define AV_NOPTS_VALUE          ((int64_t)UINT64_C(0x8000000000000000)) | ||||
| 
 | ||||
| /**
 | ||||
|  * Internal time base represented as integer | ||||
|  */ | ||||
| 
 | ||||
| #define AV_TIME_BASE            1000000 | ||||
| 
 | ||||
| /**
 | ||||
|  * Internal time base represented as fractional value | ||||
|  */ | ||||
| 
 | ||||
| #define AV_TIME_BASE_Q          (AVRational){1, AV_TIME_BASE} | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  * @} | ||||
|  * @defgroup lavu_picture Image related | ||||
|  * | ||||
|  * AVPicture types, pixel formats and basic image planes manipulation. | ||||
|  * | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| enum AVPictureType { | ||||
|     AV_PICTURE_TYPE_NONE = 0, ///< Undefined
 | ||||
|     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_SI,    ///< Switching Intra
 | ||||
|     AV_PICTURE_TYPE_SP,    ///< Switching Predicted
 | ||||
|     AV_PICTURE_TYPE_BI,    ///< BI type
 | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Return a single letter to describe the given picture type | ||||
|  * pict_type. | ||||
|  * | ||||
|  * @param[in] pict_type the picture type @return a single character | ||||
|  * representing the picture type, '?' if pict_type is unknown | ||||
|  */ | ||||
| char av_get_picture_type_char(enum AVPictureType pict_type); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #include "common.h" | ||||
| #include "error.h" | ||||
| #include "rational.h" | ||||
| #include "version.h" | ||||
| #include "macros.h" | ||||
| #include "mathematics.h" | ||||
| #include "log.h" | ||||
| #include "pixfmt.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * Return x default pointer in case p is NULL. | ||||
|  */ | ||||
| static inline void *av_x_if_null(const void *p, const void *x) | ||||
| { | ||||
|     return (void *)(intptr_t)(p ? p : x); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Compute the length of an integer list. | ||||
|  * | ||||
|  * @param elsize  size in bytes of each list element (only 1, 2, 4 or 8) | ||||
|  * @param term    list terminator (usually 0 or -1) | ||||
|  * @param list    pointer to the list | ||||
|  * @return  length of the list, in elements, not counting the terminator | ||||
|  */ | ||||
| unsigned av_int_list_length_for_size(unsigned elsize, | ||||
|                                      const void *list, uint64_t term) av_pure; | ||||
| 
 | ||||
| /**
 | ||||
|  * Compute the length of an integer list. | ||||
|  * | ||||
|  * @param term  list terminator (usually 0 or -1) | ||||
|  * @param list  pointer to the list | ||||
|  * @return  length of the list, in elements, not counting the terminator | ||||
|  */ | ||||
| #define av_int_list_length(list, term) \ | ||||
|     av_int_list_length_for_size(sizeof(*(list)), list, term) | ||||
| 
 | ||||
| /**
 | ||||
|  * Open a file using a UTF-8 filename. | ||||
|  * The API of this function matches POSIX fopen(), errors are returned through | ||||
|  * errno. | ||||
|  */ | ||||
| FILE *av_fopen_utf8(const char *path, const char *mode); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the fractional representation of the internal time base. | ||||
|  */ | ||||
| AVRational av_get_time_base_q(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_AVUTIL_H */ | ||||
| @ -0,0 +1,67 @@ | ||||
| /*
 | ||||
|  * Copyright (c) 2006 Ryan Martell. (rdm4@martellventures.com) | ||||
|  * | ||||
|  * 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_BASE64_H | ||||
| #define AVUTIL_BASE64_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavu_base64 Base64 | ||||
|  * @ingroup lavu_crypto | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * 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 | ||||
|  * @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); | ||||
| 
 | ||||
| /**
 | ||||
|  * Encode data to base64 and null-terminate. | ||||
|  * | ||||
|  * @param out      buffer for encoded data | ||||
|  * @param out_size size in bytes of the out buffer (including the | ||||
|  *                 null terminator), must be at least AV_BASE64_SIZE(in_size) | ||||
|  * @param in       input buffer containing the data to encode | ||||
|  * @param in_size  size in bytes of the in buffer | ||||
|  * @return         out or NULL in case of error | ||||
|  */ | ||||
| char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Calculate the output size needed to base64-encode x bytes to a | ||||
|  * null-terminated string. | ||||
|  */ | ||||
| #define AV_BASE64_SIZE(x)  (((x)+2) / 3 * 4 + 1) | ||||
| 
 | ||||
|  /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| #endif /* AVUTIL_BASE64_H */ | ||||
| @ -0,0 +1,82 @@ | ||||
| /*
 | ||||
|  * Blowfish algorithm | ||||
|  * Copyright (c) 2012 Samuel Pitoiset | ||||
|  * | ||||
|  * 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_BLOWFISH_H | ||||
| #define AVUTIL_BLOWFISH_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavu_blowfish Blowfish | ||||
|  * @ingroup lavu_crypto | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| #define AV_BF_ROUNDS 16 | ||||
| 
 | ||||
| typedef struct AVBlowfish { | ||||
|     uint32_t p[AV_BF_ROUNDS + 2]; | ||||
|     uint32_t s[4][256]; | ||||
| } AVBlowfish; | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate an AVBlowfish context. | ||||
|  */ | ||||
| AVBlowfish *av_blowfish_alloc(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Initialize an AVBlowfish context. | ||||
|  * | ||||
|  * @param ctx an AVBlowfish context | ||||
|  * @param key a key | ||||
|  * @param key_len length of the key | ||||
|  */ | ||||
| void av_blowfish_init(struct AVBlowfish *ctx, const uint8_t *key, int key_len); | ||||
| 
 | ||||
| /**
 | ||||
|  * Encrypt or decrypt a buffer using a previously initialized context. | ||||
|  * | ||||
|  * @param ctx an AVBlowfish context | ||||
|  * @param xl left four bytes halves of input to be encrypted | ||||
|  * @param xr right four bytes halves of input to be encrypted | ||||
|  * @param decrypt 0 for encryption, 1 for decryption | ||||
|  */ | ||||
| void av_blowfish_crypt_ecb(struct AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, | ||||
|                            int decrypt); | ||||
| 
 | ||||
| /**
 | ||||
|  * Encrypt or decrypt a buffer using a previously initialized context. | ||||
|  * | ||||
|  * @param ctx an AVBlowfish 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 ECB will be used | ||||
|  * @param decrypt 0 for encryption, 1 for decryption | ||||
|  */ | ||||
| void av_blowfish_crypt(struct AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, | ||||
|                        int count, uint8_t *iv, int decrypt); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_BLOWFISH_H */ | ||||
| @ -0,0 +1,219 @@ | ||||
| /*
 | ||||
|  * Copyright (c) 2012 Nicolas George | ||||
|  * | ||||
|  * 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_BPRINT_H | ||||
| #define AVUTIL_BPRINT_H | ||||
| 
 | ||||
| #include <stdarg.h> | ||||
| 
 | ||||
| #include "attributes.h" | ||||
| #include "avstring.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * Define a structure with extra padding to a fixed size | ||||
|  * This helps ensuring binary compatibility with future versions. | ||||
|  */ | ||||
| 
 | ||||
| #define FF_PAD_STRUCTURE(name, size, ...) \ | ||||
| struct ff_pad_helper_##name { __VA_ARGS__ }; \
 | ||||
| typedef struct name { \
 | ||||
|     __VA_ARGS__ \
 | ||||
|     char reserved_padding[size - sizeof(struct ff_pad_helper_##name)]; \
 | ||||
| } name; | ||||
| 
 | ||||
| /**
 | ||||
|  * Buffer to print data progressively | ||||
|  * | ||||
|  * The string buffer grows as necessary and is always 0-terminated. | ||||
|  * The content of the string is never accessed, and thus is | ||||
|  * encoding-agnostic and can even hold binary data. | ||||
|  * | ||||
|  * Small buffers are kept in the structure itself, and thus require no | ||||
|  * memory allocation at all (unless the contents of the buffer is needed | ||||
|  * after the structure goes out of scope). This is almost as lightweight as | ||||
|  * declaring a local "char buf[512]". | ||||
|  * | ||||
|  * The length of the string can go beyond the allocated size: the buffer is | ||||
|  * then truncated, but the functions still keep account of the actual total | ||||
|  * length. | ||||
|  * | ||||
|  * In other words, buf->len can be greater than buf->size and records the | ||||
|  * total length of what would have been to the buffer if there had been | ||||
|  * enough memory. | ||||
|  * | ||||
|  * Append operations do not need to be tested for failure: if a memory | ||||
|  * allocation fails, data stop being appended to the buffer, but the length | ||||
|  * is still updated. This situation can be tested with | ||||
|  * av_bprint_is_complete(). | ||||
|  * | ||||
|  * The size_max field determines several possible behaviours: | ||||
|  * | ||||
|  * size_max = -1 (= UINT_MAX) or any large value will let the buffer be | ||||
|  * reallocated as necessary, with an amortized linear cost. | ||||
|  * | ||||
|  * size_max = 0 prevents writing anything to the buffer: only the total | ||||
|  * length is computed. The write operations can then possibly be repeated in | ||||
|  * a buffer with exactly the necessary size | ||||
|  * (using size_init = size_max = len + 1). | ||||
|  * | ||||
|  * size_max = 1 is automatically replaced by the exact size available in the | ||||
|  * structure itself, thus ensuring no dynamic memory allocation. The | ||||
|  * internal buffer is large enough to hold a reasonable paragraph of text, | ||||
|  * such as the current paragraph. | ||||
|  */ | ||||
| 
 | ||||
| FF_PAD_STRUCTURE(AVBPrint, 1024, | ||||
|     char *str;         /**< string so far */ | ||||
|     unsigned len;      /**< length so far */ | ||||
|     unsigned size;     /**< allocated memory */ | ||||
|     unsigned size_max; /**< maximum allocated memory */ | ||||
|     char reserved_internal_buffer[1]; | ||||
| ) | ||||
| 
 | ||||
| /**
 | ||||
|  * Convenience macros for special values for av_bprint_init() size_max | ||||
|  * parameter. | ||||
|  */ | ||||
| #define AV_BPRINT_SIZE_UNLIMITED  ((unsigned)-1) | ||||
| #define AV_BPRINT_SIZE_AUTOMATIC  1 | ||||
| #define AV_BPRINT_SIZE_COUNT_ONLY 0 | ||||
| 
 | ||||
| /**
 | ||||
|  * Init a print buffer. | ||||
|  * | ||||
|  * @param buf        buffer to init | ||||
|  * @param size_init  initial size (including the final 0) | ||||
|  * @param size_max   maximum size; | ||||
|  *                   0 means do not write anything, just count the length; | ||||
|  *                   1 is replaced by the maximum value for automatic storage; | ||||
|  *                   any large value means that the internal buffer will be | ||||
|  *                   reallocated as needed up to that limit; -1 is converted to | ||||
|  *                   UINT_MAX, the largest limit possible. | ||||
|  *                   Check also AV_BPRINT_SIZE_* macros. | ||||
|  */ | ||||
| void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max); | ||||
| 
 | ||||
| /**
 | ||||
|  * Init a print buffer using a pre-existing buffer. | ||||
|  * | ||||
|  * The buffer will not be reallocated. | ||||
|  * | ||||
|  * @param buf     buffer structure to init | ||||
|  * @param buffer  byte buffer to use for the string data | ||||
|  * @param size    size of buffer | ||||
|  */ | ||||
| void av_bprint_init_for_buffer(AVBPrint *buf, char *buffer, unsigned size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Append a formatted string to a print buffer. | ||||
|  */ | ||||
| void av_bprintf(AVBPrint *buf, const char *fmt, ...) av_printf_format(2, 3); | ||||
| 
 | ||||
| /**
 | ||||
|  * Append a formatted string to a print buffer. | ||||
|  */ | ||||
| void av_vbprintf(AVBPrint *buf, const char *fmt, va_list vl_arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * Append char c n times to a print buffer. | ||||
|  */ | ||||
| void av_bprint_chars(AVBPrint *buf, char c, unsigned n); | ||||
| 
 | ||||
| /**
 | ||||
|  * Append data to a print buffer. | ||||
|  * | ||||
|  * param buf  bprint buffer to use | ||||
|  * param data pointer to data | ||||
|  * param size size of data | ||||
|  */ | ||||
| void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size); | ||||
| 
 | ||||
| struct tm; | ||||
| /**
 | ||||
|  * Append a formatted date and time to a print buffer. | ||||
|  * | ||||
|  * param buf  bprint buffer to use | ||||
|  * param fmt  date and time format string, see strftime() | ||||
|  * param tm   broken-down time structure to translate | ||||
|  * | ||||
|  * @note due to poor design of the standard strftime function, it may | ||||
|  * produce poor results if the format string expands to a very long text and | ||||
|  * the bprint buffer is near the limit stated by the size_max option. | ||||
|  */ | ||||
| void av_bprint_strftime(AVBPrint *buf, const char *fmt, const struct tm *tm); | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate bytes in the buffer for external use. | ||||
|  * | ||||
|  * @param[in]  buf          buffer structure | ||||
|  * @param[in]  size         required size | ||||
|  * @param[out] mem          pointer to the memory area | ||||
|  * @param[out] actual_size  size of the memory area after allocation; | ||||
|  *                          can be larger or smaller than size | ||||
|  */ | ||||
| void av_bprint_get_buffer(AVBPrint *buf, unsigned size, | ||||
|                           unsigned char **mem, unsigned *actual_size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Reset the string to "" but keep internal allocated data. | ||||
|  */ | ||||
| void av_bprint_clear(AVBPrint *buf); | ||||
| 
 | ||||
| /**
 | ||||
|  * Test if the print buffer is complete (not truncated). | ||||
|  * | ||||
|  * It may have been truncated due to a memory allocation failure | ||||
|  * or the size_max limit (compare size and size_max if necessary). | ||||
|  */ | ||||
| static inline int av_bprint_is_complete(const AVBPrint *buf) | ||||
| { | ||||
|     return buf->len < buf->size; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Finalize a print buffer. | ||||
|  * | ||||
|  * The print buffer can no longer be used afterwards, | ||||
|  * but the len and size fields are still valid. | ||||
|  * | ||||
|  * @arg[out] ret_str  if not NULL, used to return a permanent copy of the | ||||
|  *                    buffer contents, or NULL if memory allocation fails; | ||||
|  *                    if NULL, the buffer is discarded and freed | ||||
|  * @return  0 for success or error code (probably AVERROR(ENOMEM)) | ||||
|  */ | ||||
| int av_bprint_finalize(AVBPrint *buf, char **ret_str); | ||||
| 
 | ||||
| /**
 | ||||
|  * Escape the content in src and append it to dstbuf. | ||||
|  * | ||||
|  * @param dstbuf        already inited destination bprint buffer | ||||
|  * @param src           string containing the text to escape | ||||
|  * @param special_chars string containing the special characters which | ||||
|  *                      need to be escaped, can be NULL | ||||
|  * @param mode          escape mode to employ, see AV_ESCAPE_MODE_* macros. | ||||
|  *                      Any unknown value for mode will be considered equivalent to | ||||
|  *                      AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without | ||||
|  *                      notice. | ||||
|  * @param flags         flags which control how to escape, see AV_ESCAPE_FLAG_* macros | ||||
|  */ | ||||
| void av_bprint_escape(AVBPrint *dstbuf, const char *src, const char *special_chars, | ||||
|                       enum AVEscapeMode mode, int flags); | ||||
| 
 | ||||
| #endif /* AVUTIL_BPRINT_H */ | ||||
| @ -0,0 +1,109 @@ | ||||
| /*
 | ||||
|  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | ||||
|  * | ||||
|  * 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 | ||||
|  * byte swapping routines | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVUTIL_BSWAP_H | ||||
| #define AVUTIL_BSWAP_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include "libavutil/avconfig.h" | ||||
| #include "attributes.h" | ||||
| 
 | ||||
| #ifdef HAVE_AV_CONFIG_H | ||||
| 
 | ||||
| #include "config.h" | ||||
| 
 | ||||
| #if   ARCH_AARCH64 | ||||
| #   include "aarch64/bswap.h" | ||||
| #elif ARCH_ARM | ||||
| #   include "arm/bswap.h" | ||||
| #elif ARCH_AVR32 | ||||
| #   include "avr32/bswap.h" | ||||
| #elif ARCH_SH4 | ||||
| #   include "sh4/bswap.h" | ||||
| #elif ARCH_X86 | ||||
| #   include "x86/bswap.h" | ||||
| #endif | ||||
| 
 | ||||
| #endif /* HAVE_AV_CONFIG_H */ | ||||
| 
 | ||||
| #define AV_BSWAP16C(x) (((x) << 8 & 0xff00)  | ((x) >> 8 & 0x00ff)) | ||||
| #define AV_BSWAP32C(x) (AV_BSWAP16C(x) << 16 | AV_BSWAP16C((x) >> 16)) | ||||
| #define AV_BSWAP64C(x) (AV_BSWAP32C(x) << 32 | AV_BSWAP32C((x) >> 32)) | ||||
| 
 | ||||
| #define AV_BSWAPC(s, x) AV_BSWAP##s##C(x) | ||||
| 
 | ||||
| #ifndef av_bswap16 | ||||
| static av_always_inline av_const uint16_t av_bswap16(uint16_t x) | ||||
| { | ||||
|     x= (x>>8) | (x<<8); | ||||
|     return x; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifndef av_bswap32 | ||||
| static av_always_inline av_const uint32_t av_bswap32(uint32_t x) | ||||
| { | ||||
|     return AV_BSWAP32C(x); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifndef av_bswap64 | ||||
| static inline uint64_t av_const av_bswap64(uint64_t x) | ||||
| { | ||||
|     return (uint64_t)av_bswap32(x) << 32 | av_bswap32(x >> 32); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| // be2ne ... big-endian to native-endian
 | ||||
| // le2ne ... little-endian to native-endian
 | ||||
| 
 | ||||
| #if AV_HAVE_BIGENDIAN | ||||
| #define av_be2ne16(x) (x) | ||||
| #define av_be2ne32(x) (x) | ||||
| #define av_be2ne64(x) (x) | ||||
| #define av_le2ne16(x) av_bswap16(x) | ||||
| #define av_le2ne32(x) av_bswap32(x) | ||||
| #define av_le2ne64(x) av_bswap64(x) | ||||
| #define AV_BE2NEC(s, x) (x) | ||||
| #define AV_LE2NEC(s, x) AV_BSWAPC(s, x) | ||||
| #else | ||||
| #define av_be2ne16(x) av_bswap16(x) | ||||
| #define av_be2ne32(x) av_bswap32(x) | ||||
| #define av_be2ne64(x) av_bswap64(x) | ||||
| #define av_le2ne16(x) (x) | ||||
| #define av_le2ne32(x) (x) | ||||
| #define av_le2ne64(x) (x) | ||||
| #define AV_BE2NEC(s, x) AV_BSWAPC(s, x) | ||||
| #define AV_LE2NEC(s, x) (x) | ||||
| #endif | ||||
| 
 | ||||
| #define AV_BE2NE16C(x) AV_BE2NEC(16, x) | ||||
| #define AV_BE2NE32C(x) AV_BE2NEC(32, x) | ||||
| #define AV_BE2NE64C(x) AV_BE2NEC(64, x) | ||||
| #define AV_LE2NE16C(x) AV_LE2NEC(16, x) | ||||
| #define AV_LE2NE32C(x) AV_LE2NEC(32, x) | ||||
| #define AV_LE2NE64C(x) AV_LE2NEC(64, x) | ||||
| 
 | ||||
| #endif /* AVUTIL_BSWAP_H */ | ||||
| @ -0,0 +1,274 @@ | ||||
| /*
 | ||||
|  * 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 | ||||
|  * @ingroup lavu_buffer | ||||
|  * refcounted data buffer API | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVUTIL_BUFFER_H | ||||
| #define AVUTIL_BUFFER_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavu_buffer AVBuffer | ||||
|  * @ingroup lavu_data | ||||
|  * | ||||
|  * @{ | ||||
|  * AVBuffer is an API for reference-counted data buffers. | ||||
|  * | ||||
|  * There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer | ||||
|  * represents the data buffer itself; it is opaque and not meant to be accessed | ||||
|  * by the caller directly, but only through AVBufferRef. However, the caller may | ||||
|  * e.g. compare two AVBuffer pointers to check whether two different references | ||||
|  * are describing the same data buffer. AVBufferRef represents a single | ||||
|  * reference to an AVBuffer and it is the object that may be manipulated by the | ||||
|  * caller directly. | ||||
|  * | ||||
|  * There are two functions provided for creating a new AVBuffer with a single | ||||
|  * reference -- av_buffer_alloc() to just allocate a new buffer, and | ||||
|  * av_buffer_create() to wrap an existing array in an AVBuffer. From an existing | ||||
|  * reference, additional references may be created with av_buffer_ref(). | ||||
|  * Use av_buffer_unref() to free a reference (this will automatically free the | ||||
|  * data once all the references are freed). | ||||
|  * | ||||
|  * The convention throughout this API and the rest of FFmpeg is such that the | ||||
|  * buffer is considered writable if there exists only one reference to it (and | ||||
|  * it has not been marked as read-only). The av_buffer_is_writable() function is | ||||
|  * provided to check whether this is true and av_buffer_make_writable() will | ||||
|  * automatically create a new writable buffer when necessary. | ||||
|  * Of course nothing prevents the calling code from violating this convention, | ||||
|  * however that is safe only when all the existing references are under its | ||||
|  * control. | ||||
|  * | ||||
|  * @note Referencing and unreferencing the buffers is thread-safe and thus | ||||
|  * may be done from multiple threads simultaneously without any need for | ||||
|  * additional locking. | ||||
|  * | ||||
|  * @note Two different references to the same buffer can point to different | ||||
|  * parts of the buffer (i.e. their AVBufferRef.data will not be equal). | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * A reference counted buffer type. It is opaque and is meant to be used through | ||||
|  * references (AVBufferRef). | ||||
|  */ | ||||
| typedef struct AVBuffer AVBuffer; | ||||
| 
 | ||||
| /**
 | ||||
|  * A reference to a data buffer. | ||||
|  * | ||||
|  * The size of this struct is not a part of the public ABI and it is not meant | ||||
|  * to be allocated directly. | ||||
|  */ | ||||
| typedef struct AVBufferRef { | ||||
|     AVBuffer *buffer; | ||||
| 
 | ||||
|     /**
 | ||||
|      * The data buffer. It is considered writable if and only if | ||||
|      * this is the only reference to the buffer, in which case | ||||
|      * av_buffer_is_writable() returns 1. | ||||
|      */ | ||||
|     uint8_t *data; | ||||
|     /**
 | ||||
|      * Size of data in bytes. | ||||
|      */ | ||||
|     int      size; | ||||
| } AVBufferRef; | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate an AVBuffer of the given size using av_malloc(). | ||||
|  * | ||||
|  * @return an AVBufferRef of given size or NULL when out of memory | ||||
|  */ | ||||
| AVBufferRef *av_buffer_alloc(int size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Same as av_buffer_alloc(), except the returned buffer will be initialized | ||||
|  * to zero. | ||||
|  */ | ||||
| AVBufferRef *av_buffer_allocz(int size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Always treat the buffer as read-only, even when it has only one | ||||
|  * reference. | ||||
|  */ | ||||
| #define AV_BUFFER_FLAG_READONLY (1 << 0) | ||||
| 
 | ||||
| /**
 | ||||
|  * Create an AVBuffer from an existing array. | ||||
|  * | ||||
|  * If this function is successful, data is owned by the AVBuffer. The caller may | ||||
|  * only access data through the returned AVBufferRef and references derived from | ||||
|  * it. | ||||
|  * If this function fails, data is left untouched. | ||||
|  * @param data   data array | ||||
|  * @param size   size of data in bytes | ||||
|  * @param free   a callback for freeing this buffer's data | ||||
|  * @param opaque parameter to be got for processing or passed to free | ||||
|  * @param flags  a combination of AV_BUFFER_FLAG_* | ||||
|  * | ||||
|  * @return an AVBufferRef referring to data on success, NULL on failure. | ||||
|  */ | ||||
| AVBufferRef *av_buffer_create(uint8_t *data, int size, | ||||
|                               void (*free)(void *opaque, uint8_t *data), | ||||
|                               void *opaque, int flags); | ||||
| 
 | ||||
| /**
 | ||||
|  * Default free callback, which calls av_free() on the buffer data. | ||||
|  * This function is meant to be passed to av_buffer_create(), not called | ||||
|  * directly. | ||||
|  */ | ||||
| void av_buffer_default_free(void *opaque, uint8_t *data); | ||||
| 
 | ||||
| /**
 | ||||
|  * Create a new reference to an AVBuffer. | ||||
|  * | ||||
|  * @return a new AVBufferRef referring to the same AVBuffer as buf or NULL on | ||||
|  * failure. | ||||
|  */ | ||||
| AVBufferRef *av_buffer_ref(AVBufferRef *buf); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free a given reference and automatically free the buffer if there are no more | ||||
|  * references to it. | ||||
|  * | ||||
|  * @param buf the reference to be freed. The pointer is set to NULL on return. | ||||
|  */ | ||||
| void av_buffer_unref(AVBufferRef **buf); | ||||
| 
 | ||||
| /**
 | ||||
|  * @return 1 if the caller may write to the data referred to by buf (which is | ||||
|  * true if and only if buf is the only reference to the underlying AVBuffer). | ||||
|  * Return 0 otherwise. | ||||
|  * A positive answer is valid until av_buffer_ref() is called on buf. | ||||
|  */ | ||||
| int av_buffer_is_writable(const AVBufferRef *buf); | ||||
| 
 | ||||
| /**
 | ||||
|  * @return the opaque parameter set by av_buffer_create. | ||||
|  */ | ||||
| void *av_buffer_get_opaque(const AVBufferRef *buf); | ||||
| 
 | ||||
| int av_buffer_get_ref_count(const AVBufferRef *buf); | ||||
| 
 | ||||
| /**
 | ||||
|  * Create a writable reference from a given buffer reference, avoiding data copy | ||||
|  * if possible. | ||||
|  * | ||||
|  * @param buf buffer reference to make writable. On success, buf is either left | ||||
|  *            untouched, or it is unreferenced and a new writable AVBufferRef is | ||||
|  *            written in its place. On failure, buf is left untouched. | ||||
|  * @return 0 on success, a negative AVERROR on failure. | ||||
|  */ | ||||
| int av_buffer_make_writable(AVBufferRef **buf); | ||||
| 
 | ||||
| /**
 | ||||
|  * Reallocate a given buffer. | ||||
|  * | ||||
|  * @param buf  a buffer reference to reallocate. On success, buf will be | ||||
|  *             unreferenced and a new reference with the required size will be | ||||
|  *             written in its place. On failure buf will be left untouched. *buf | ||||
|  *             may be NULL, then a new buffer is allocated. | ||||
|  * @param size required new buffer size. | ||||
|  * @return 0 on success, a negative AVERROR on failure. | ||||
|  * | ||||
|  * @note the buffer is actually reallocated with av_realloc() only if it was | ||||
|  * initially allocated through av_buffer_realloc(NULL) and there is only one | ||||
|  * reference to it (i.e. the one passed to this function). In all other cases | ||||
|  * a new buffer is allocated and the data is copied. | ||||
|  */ | ||||
| int av_buffer_realloc(AVBufferRef **buf, int size); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavu_bufferpool AVBufferPool | ||||
|  * @ingroup lavu_data | ||||
|  * | ||||
|  * @{ | ||||
|  * AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers. | ||||
|  * | ||||
|  * Frequently allocating and freeing large buffers may be slow. AVBufferPool is | ||||
|  * meant to solve this in cases when the caller needs a set of buffers of the | ||||
|  * same size (the most obvious use case being buffers for raw video or audio | ||||
|  * frames). | ||||
|  * | ||||
|  * At the beginning, the user must call av_buffer_pool_init() to create the | ||||
|  * buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to | ||||
|  * get a reference to a new buffer, similar to av_buffer_alloc(). This new | ||||
|  * reference works in all aspects the same way as the one created by | ||||
|  * av_buffer_alloc(). However, when the last reference to this buffer is | ||||
|  * unreferenced, it is returned to the pool instead of being freed and will be | ||||
|  * reused for subsequent av_buffer_pool_get() calls. | ||||
|  * | ||||
|  * When the caller is done with the pool and no longer needs to allocate any new | ||||
|  * buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable. | ||||
|  * Once all the buffers are released, it will automatically be freed. | ||||
|  * | ||||
|  * Allocating and releasing buffers with this API is thread-safe as long as | ||||
|  * either the default alloc callback is used, or the user-supplied one is | ||||
|  * thread-safe. | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * The buffer pool. This structure is opaque and not meant to be accessed | ||||
|  * directly. It is allocated with av_buffer_pool_init() and freed with | ||||
|  * av_buffer_pool_uninit(). | ||||
|  */ | ||||
| typedef struct AVBufferPool AVBufferPool; | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate and initialize a buffer pool. | ||||
|  * | ||||
|  * @param size size of each buffer in this pool | ||||
|  * @param alloc a function that will be used to allocate new buffers when the | ||||
|  * pool is empty. May be NULL, then the default allocator will be used | ||||
|  * (av_buffer_alloc()). | ||||
|  * @return newly created buffer pool on success, NULL on error. | ||||
|  */ | ||||
| AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size)); | ||||
| 
 | ||||
| /**
 | ||||
|  * 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 | ||||
|  * is safe to call this function while some of the allocated buffers are still | ||||
|  * 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); | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate a new AVBuffer, reusing an old buffer from the pool when available. | ||||
|  * This function may be called simultaneously from multiple threads. | ||||
|  * | ||||
|  * @return a reference to the new buffer on success, NULL on error. | ||||
|  */ | ||||
| AVBufferRef *av_buffer_pool_get(AVBufferPool *pool); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_BUFFER_H */ | ||||
| @ -0,0 +1,70 @@ | ||||
| /*
 | ||||
|  * An implementation of the CAMELLIA algorithm as mentioned in RFC3713 | ||||
|  * Copyright (c) 2014 Supraja Meedinti | ||||
|  * | ||||
|  * 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_CAMELLIA_H | ||||
| #define AVUTIL_CAMELLIA_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   * @file | ||||
|   * @brief Public header for libavutil CAMELLIA algorithm | ||||
|   * @defgroup lavu_camellia CAMELLIA | ||||
|   * @ingroup lavu_crypto | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| extern const int av_camellia_size; | ||||
| 
 | ||||
| struct AVCAMELLIA; | ||||
| 
 | ||||
| /**
 | ||||
|   * Allocate an AVCAMELLIA context | ||||
|   * To free the struct: av_free(ptr) | ||||
|   */ | ||||
| struct AVCAMELLIA *av_camellia_alloc(void); | ||||
| 
 | ||||
| /**
 | ||||
|   * Initialize an AVCAMELLIA context. | ||||
|   * | ||||
|   * @param ctx an AVCAMELLIA context | ||||
|   * @param key a key of 16, 24, 32 bytes used for encryption/decryption | ||||
|   * @param key_bits number of keybits: possible are 128, 192, 256 | ||||
|  */ | ||||
| int av_camellia_init(struct AVCAMELLIA *ctx, const uint8_t *key, int key_bits); | ||||
| 
 | ||||
| /**
 | ||||
|   * Encrypt or decrypt a buffer using a previously initialized context | ||||
|   * | ||||
|   * @param ctx an AVCAMELLIA context | ||||
|   * @param dst destination array, can be equal to src | ||||
|   * @param src source array, can be equal to dst | ||||
|   * @param count number of 16 byte blocks | ||||
|   * @paran iv initialization vector for CBC mode, NULL for ECB mode | ||||
|   * @param decrypt 0 for encryption, 1 for decryption | ||||
|  */ | ||||
| void av_camellia_crypt(struct AVCAMELLIA *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t* iv, int decrypt); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| #endif /* AVUTIL_CAMELLIA_H */ | ||||
| @ -0,0 +1,80 @@ | ||||
| /*
 | ||||
|  * An implementation of the CAST128 algorithm as mentioned in RFC2144 | ||||
|  * Copyright (c) 2014 Supraja Meedinti | ||||
|  * | ||||
|  * 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_CAST5_H | ||||
| #define AVUTIL_CAST5_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   * @file | ||||
|   * @brief Public header for libavutil CAST5 algorithm | ||||
|   * @defgroup lavu_cast5 CAST5 | ||||
|   * @ingroup lavu_crypto | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| extern const int av_cast5_size; | ||||
| 
 | ||||
| struct AVCAST5; | ||||
| 
 | ||||
| /**
 | ||||
|   * Allocate an AVCAST5 context | ||||
|   * To free the struct: av_free(ptr) | ||||
|   */ | ||||
| struct AVCAST5 *av_cast5_alloc(void); | ||||
| /**
 | ||||
|   * Initialize an AVCAST5 context. | ||||
|   * | ||||
|   * @param ctx an AVCAST5 context | ||||
|   * @param key a key of 5,6,...16 bytes used for encryption/decryption | ||||
|   * @param key_bits number of keybits: possible are 40,48,...,128 | ||||
|   * @return 0 on success, less than 0 on failure | ||||
|  */ | ||||
| int av_cast5_init(struct AVCAST5 *ctx, const uint8_t *key, int key_bits); | ||||
| 
 | ||||
| /**
 | ||||
|   * Encrypt or decrypt a buffer using a previously initialized context, ECB mode only | ||||
|   * | ||||
|   * @param ctx an AVCAST5 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 decrypt 0 for encryption, 1 for decryption | ||||
|  */ | ||||
| void av_cast5_crypt(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, int decrypt); | ||||
| 
 | ||||
| /**
 | ||||
|   * Encrypt or decrypt a buffer using a previously initialized context | ||||
|   * | ||||
|   * @param ctx an AVCAST5 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, NULL for ECB mode | ||||
|   * @param decrypt 0 for encryption, 1 for decryption | ||||
|  */ | ||||
| void av_cast5_crypt2(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| #endif /* AVUTIL_CAST5_H */ | ||||
| @ -0,0 +1,223 @@ | ||||
| /*
 | ||||
|  * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | ||||
|  * Copyright (c) 2008 Peter Ross | ||||
|  * | ||||
|  * 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_CHANNEL_LAYOUT_H | ||||
| #define AVUTIL_CHANNEL_LAYOUT_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * audio channel layout utility functions | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @addtogroup lavu_audio | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup channel_masks Audio channel masks | ||||
|  * | ||||
|  * A channel layout is a 64-bits integer with a bit set for every channel. | ||||
|  * The number of bits set must be equal to the number of channels. | ||||
|  * The value 0 means that the channel layout is not known. | ||||
|  * @note this data structure is not powerful enough to handle channels | ||||
|  * combinations that have the same channel multiple times, such as | ||||
|  * dual-mono. | ||||
|  * | ||||
|  * @{ | ||||
|  */ | ||||
| #define AV_CH_FRONT_LEFT             0x00000001 | ||||
| #define AV_CH_FRONT_RIGHT            0x00000002 | ||||
| #define AV_CH_FRONT_CENTER           0x00000004 | ||||
| #define AV_CH_LOW_FREQUENCY          0x00000008 | ||||
| #define AV_CH_BACK_LEFT              0x00000010 | ||||
| #define AV_CH_BACK_RIGHT             0x00000020 | ||||
| #define AV_CH_FRONT_LEFT_OF_CENTER   0x00000040 | ||||
| #define AV_CH_FRONT_RIGHT_OF_CENTER  0x00000080 | ||||
| #define AV_CH_BACK_CENTER            0x00000100 | ||||
| #define AV_CH_SIDE_LEFT              0x00000200 | ||||
| #define AV_CH_SIDE_RIGHT             0x00000400 | ||||
| #define AV_CH_TOP_CENTER             0x00000800 | ||||
| #define AV_CH_TOP_FRONT_LEFT         0x00001000 | ||||
| #define AV_CH_TOP_FRONT_CENTER       0x00002000 | ||||
| #define AV_CH_TOP_FRONT_RIGHT        0x00004000 | ||||
| #define AV_CH_TOP_BACK_LEFT          0x00008000 | ||||
| #define AV_CH_TOP_BACK_CENTER        0x00010000 | ||||
| #define AV_CH_TOP_BACK_RIGHT         0x00020000 | ||||
| #define AV_CH_STEREO_LEFT            0x20000000  ///< Stereo downmix.
 | ||||
| #define AV_CH_STEREO_RIGHT           0x40000000  ///< See AV_CH_STEREO_LEFT.
 | ||||
| #define AV_CH_WIDE_LEFT              0x0000000080000000ULL | ||||
| #define AV_CH_WIDE_RIGHT             0x0000000100000000ULL | ||||
| #define AV_CH_SURROUND_DIRECT_LEFT   0x0000000200000000ULL | ||||
| #define AV_CH_SURROUND_DIRECT_RIGHT  0x0000000400000000ULL | ||||
| #define AV_CH_LOW_FREQUENCY_2        0x0000000800000000ULL | ||||
| 
 | ||||
| /** Channel mask value used for AVCodecContext.request_channel_layout
 | ||||
|     to indicate that the user requests the channel order of the decoder output | ||||
|     to be the native codec channel order. */ | ||||
| #define AV_CH_LAYOUT_NATIVE          0x8000000000000000ULL | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  * @defgroup channel_mask_c Audio channel layouts | ||||
|  * @{ | ||||
|  * */ | ||||
| #define AV_CH_LAYOUT_MONO              (AV_CH_FRONT_CENTER) | ||||
| #define AV_CH_LAYOUT_STEREO            (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT) | ||||
| #define AV_CH_LAYOUT_2POINT1           (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY) | ||||
| #define AV_CH_LAYOUT_2_1               (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER) | ||||
| #define AV_CH_LAYOUT_SURROUND          (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) | ||||
| #define AV_CH_LAYOUT_3POINT1           (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY) | ||||
| #define AV_CH_LAYOUT_4POINT0           (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER) | ||||
| #define AV_CH_LAYOUT_4POINT1           (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY) | ||||
| #define AV_CH_LAYOUT_2_2               (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) | ||||
| #define AV_CH_LAYOUT_QUAD              (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) | ||||
| #define AV_CH_LAYOUT_5POINT0           (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) | ||||
| #define AV_CH_LAYOUT_5POINT1           (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY) | ||||
| #define AV_CH_LAYOUT_5POINT0_BACK      (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) | ||||
| #define AV_CH_LAYOUT_5POINT1_BACK      (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY) | ||||
| #define AV_CH_LAYOUT_6POINT0           (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER) | ||||
| #define AV_CH_LAYOUT_6POINT0_FRONT     (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) | ||||
| #define AV_CH_LAYOUT_HEXAGONAL         (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER) | ||||
| #define AV_CH_LAYOUT_6POINT1           (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER) | ||||
| #define AV_CH_LAYOUT_6POINT1_BACK      (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER) | ||||
| #define AV_CH_LAYOUT_6POINT1_FRONT     (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY) | ||||
| #define AV_CH_LAYOUT_7POINT0           (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) | ||||
| #define AV_CH_LAYOUT_7POINT0_FRONT     (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) | ||||
| #define AV_CH_LAYOUT_7POINT1           (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) | ||||
| #define AV_CH_LAYOUT_7POINT1_WIDE      (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) | ||||
| #define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) | ||||
| #define AV_CH_LAYOUT_OCTAGONAL         (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT) | ||||
| #define AV_CH_LAYOUT_HEXADECAGONAL     (AV_CH_LAYOUT_OCTAGONAL|AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT) | ||||
| #define AV_CH_LAYOUT_STEREO_DOWNMIX    (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT) | ||||
| 
 | ||||
| enum AVMatrixEncoding { | ||||
|     AV_MATRIX_ENCODING_NONE, | ||||
|     AV_MATRIX_ENCODING_DOLBY, | ||||
|     AV_MATRIX_ENCODING_DPLII, | ||||
|     AV_MATRIX_ENCODING_DPLIIX, | ||||
|     AV_MATRIX_ENCODING_DPLIIZ, | ||||
|     AV_MATRIX_ENCODING_DOLBYEX, | ||||
|     AV_MATRIX_ENCODING_DOLBYHEADPHONE, | ||||
|     AV_MATRIX_ENCODING_NB | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Return a channel layout id that matches name, or 0 if no match is found. | ||||
|  * | ||||
|  * name can be one or several of the following notations, | ||||
|  * separated by '+' or '|': | ||||
|  * - the name of an usual channel layout (mono, stereo, 4.0, quad, 5.0, | ||||
|  *   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 | ||||
|  *   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 description of a channel layout. | ||||
|  * If nb_channels is <= 0, it is guessed from the channel_layout. | ||||
|  * | ||||
|  * @param buf put here the string containing the channel layout | ||||
|  * @param buf_size size in bytes of the buffer | ||||
|  */ | ||||
| void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout); | ||||
| 
 | ||||
| struct AVBPrint; | ||||
| /**
 | ||||
|  * Append a description of a channel layout to a bprint buffer. | ||||
|  */ | ||||
| void av_bprint_channel_layout(struct AVBPrint *bp, int nb_channels, uint64_t channel_layout); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the number of channels in the channel layout. | ||||
|  */ | ||||
| int av_get_channel_layout_nb_channels(uint64_t channel_layout); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return default channel layout for a given number of channels. | ||||
|  */ | ||||
| int64_t av_get_default_channel_layout(int nb_channels); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the index of a channel in channel_layout. | ||||
|  * | ||||
|  * @param channel a channel layout describing exactly one channel which must be | ||||
|  *                present in channel_layout. | ||||
|  * | ||||
|  * @return index of channel in channel_layout on success, a negative AVERROR | ||||
|  *         on error. | ||||
|  */ | ||||
| int av_get_channel_layout_channel_index(uint64_t channel_layout, | ||||
|                                         uint64_t channel); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the channel with the given index in channel_layout. | ||||
|  */ | ||||
| uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the name of a given channel. | ||||
|  * | ||||
|  * @return channel name on success, NULL on error. | ||||
|  */ | ||||
| const char *av_get_channel_name(uint64_t channel); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the description of a given channel. | ||||
|  * | ||||
|  * @param channel  a channel layout with a single channel | ||||
|  * @return  channel description on success, NULL on error | ||||
|  */ | ||||
| const char *av_get_channel_description(uint64_t channel); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the value and name of a standard channel layout. | ||||
|  * | ||||
|  * @param[in]  index   index in an internal list, starting at 0 | ||||
|  * @param[out] layout  channel layout mask | ||||
|  * @param[out] name    name of the layout | ||||
|  * @return  0  if the layout exists, | ||||
|  *          <0 if index is beyond the limits | ||||
|  */ | ||||
| int av_get_standard_channel_layout(unsigned index, uint64_t *layout, | ||||
|                                    const char **name); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_CHANNEL_LAYOUT_H */ | ||||
| @ -0,0 +1,530 @@ | ||||
| /*
 | ||||
|  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | ||||
|  * | ||||
|  * 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 | ||||
|  * common internal and external API header | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVUTIL_COMMON_H | ||||
| #define AVUTIL_COMMON_H | ||||
| 
 | ||||
| #if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C) | ||||
| #error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS | ||||
| #endif | ||||
| 
 | ||||
| #include <errno.h> | ||||
| #include <inttypes.h> | ||||
| #include <limits.h> | ||||
| #include <math.h> | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| 
 | ||||
| #include "attributes.h" | ||||
| #include "macros.h" | ||||
| #include "version.h" | ||||
| #include "libavutil/avconfig.h" | ||||
| 
 | ||||
| #if AV_HAVE_BIGENDIAN | ||||
| #   define AV_NE(be, le) (be) | ||||
| #else | ||||
| #   define AV_NE(be, le) (le) | ||||
| #endif | ||||
| 
 | ||||
| //rounded division & shift
 | ||||
| #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)) | ||||
| /* Fast a/(1<<b) rounded toward +inf. Assume a>=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)) | ||||
| 
 | ||||
| /**
 | ||||
|  * Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they | ||||
|  * are not representable as absolute values of their type. This is the same | ||||
|  * as with *abs() | ||||
|  * @see FFNABS() | ||||
|  */ | ||||
| #define FFABS(a) ((a) >= 0 ? (a) : (-(a))) | ||||
| #define FFSIGN(a) ((a) > 0 ? 1 : -1) | ||||
| 
 | ||||
| /**
 | ||||
|  * Negative Absolute value. | ||||
|  * this works for all integers of all types. | ||||
|  * As with many macros, this evaluates its argument twice, it thus must not have | ||||
|  * a sideeffect, that is FFNABS(x++) has undefined behavior. | ||||
|  */ | ||||
| #define FFNABS(a) ((a) <= 0 ? (a) : (-(a))) | ||||
| 
 | ||||
| /**
 | ||||
|  * Comparator. | ||||
|  * For two numerical expressions x and y, gives 1 if x > y, -1 if x < y, and 0 | ||||
|  * if x == y. This is useful for instance in a qsort comparator callback. | ||||
|  * Furthermore, compilers are able to optimize this to branchless code, and | ||||
|  * there is no risk of overflow with signed types. | ||||
|  * As with many macros, this evaluates its argument multiple times, it thus | ||||
|  * must not have a side-effect. | ||||
|  */ | ||||
| #define FFDIFFSIGN(x,y) (((x)>(y)) - ((x)<(y))) | ||||
| 
 | ||||
| #define FFMAX(a,b) ((a) > (b) ? (a) : (b)) | ||||
| #define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c) | ||||
| #define FFMIN(a,b) ((a) > (b) ? (b) : (a)) | ||||
| #define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c) | ||||
| 
 | ||||
| #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])) | ||||
| 
 | ||||
| /* misc math functions */ | ||||
| 
 | ||||
| #ifdef HAVE_AV_CONFIG_H | ||||
| #   include "config.h" | ||||
| #   include "intmath.h" | ||||
| #endif | ||||
| 
 | ||||
| /* Pull in unguarded fallback defines at the end of this file. */ | ||||
| #include "common.h" | ||||
| 
 | ||||
| #ifndef av_log2 | ||||
| av_const int av_log2(unsigned v); | ||||
| #endif | ||||
| 
 | ||||
| #ifndef av_log2_16bit | ||||
| av_const int av_log2_16bit(unsigned v); | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * Clip a signed integer value into the amin-amax range. | ||||
|  * @param a value to clip | ||||
|  * @param amin minimum value of the clip range | ||||
|  * @param amax maximum value of the clip range | ||||
|  * @return clipped value | ||||
|  */ | ||||
| static av_always_inline av_const int av_clip_c(int a, int amin, int amax) | ||||
| { | ||||
| #if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 | ||||
|     if (amin > amax) abort(); | ||||
| #endif | ||||
|     if      (a < amin) return amin; | ||||
|     else if (a > amax) return amax; | ||||
|     else               return a; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Clip a signed 64bit integer value into the amin-amax range. | ||||
|  * @param a value to clip | ||||
|  * @param amin minimum value of the clip range | ||||
|  * @param amax maximum value of the clip range | ||||
|  * @return clipped value | ||||
|  */ | ||||
| static av_always_inline av_const int64_t av_clip64_c(int64_t a, int64_t amin, int64_t amax) | ||||
| { | ||||
| #if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 | ||||
|     if (amin > amax) abort(); | ||||
| #endif | ||||
|     if      (a < amin) return amin; | ||||
|     else if (a > amax) return amax; | ||||
|     else               return a; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Clip a signed integer value into the 0-255 range. | ||||
|  * @param a value to clip | ||||
|  * @return clipped value | ||||
|  */ | ||||
| static av_always_inline av_const uint8_t av_clip_uint8_c(int a) | ||||
| { | ||||
|     if (a&(~0xFF)) return (-a)>>31; | ||||
|     else           return a; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Clip a signed integer value into the -128,127 range. | ||||
|  * @param a value to clip | ||||
|  * @return clipped value | ||||
|  */ | ||||
| static av_always_inline av_const int8_t av_clip_int8_c(int a) | ||||
| { | ||||
|     if ((a+0x80U) & ~0xFF) return (a>>31) ^ 0x7F; | ||||
|     else                  return a; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Clip a signed integer value into the 0-65535 range. | ||||
|  * @param a value to clip | ||||
|  * @return clipped value | ||||
|  */ | ||||
| static av_always_inline av_const uint16_t av_clip_uint16_c(int a) | ||||
| { | ||||
|     if (a&(~0xFFFF)) return (-a)>>31; | ||||
|     else             return a; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Clip a signed integer value into the -32768,32767 range. | ||||
|  * @param a value to clip | ||||
|  * @return clipped value | ||||
|  */ | ||||
| static av_always_inline av_const int16_t av_clip_int16_c(int a) | ||||
| { | ||||
|     if ((a+0x8000U) & ~0xFFFF) return (a>>31) ^ 0x7FFF; | ||||
|     else                      return a; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Clip a signed 64-bit integer value into the -2147483648,2147483647 range. | ||||
|  * @param a value to clip | ||||
|  * @return clipped value | ||||
|  */ | ||||
| static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a) | ||||
| { | ||||
|     if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (int32_t)((a>>63) ^ 0x7FFFFFFF); | ||||
|     else                                         return (int32_t)a; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Clip a signed integer into the -(2^p),(2^p-1) range. | ||||
|  * @param  a value to clip | ||||
|  * @param  p bit position to clip at | ||||
|  * @return clipped value | ||||
|  */ | ||||
| static av_always_inline av_const int av_clip_intp2_c(int a, int p) | ||||
| { | ||||
|     if (((unsigned)a + (1 << p)) & ~((2 << p) - 1)) | ||||
|         return (a >> 31) ^ ((1 << p) - 1); | ||||
|     else | ||||
|         return a; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Clip a signed integer to an unsigned power of two range. | ||||
|  * @param  a value to clip | ||||
|  * @param  p bit position to clip at | ||||
|  * @return clipped value | ||||
|  */ | ||||
| static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p) | ||||
| { | ||||
|     if (a & ~((1<<p) - 1)) return -a >> 31 & ((1<<p) - 1); | ||||
|     else                   return  a; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Clear high bits from an unsigned integer starting with specific bit position | ||||
|  * @param  a value to clip | ||||
|  * @param  p bit position to clip at | ||||
|  * @return clipped value | ||||
|  */ | ||||
| static av_always_inline av_const unsigned av_mod_uintp2_c(unsigned a, unsigned p) | ||||
| { | ||||
|     return a & ((1 << p) - 1); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Add two signed 32-bit values with saturation. | ||||
|  * | ||||
|  * @param  a one value | ||||
|  * @param  b another value | ||||
|  * @return sum with signed saturation | ||||
|  */ | ||||
| static av_always_inline int av_sat_add32_c(int a, int b) | ||||
| { | ||||
|     return av_clipl_int32((int64_t)a + b); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Add a doubled value to another value with saturation at both stages. | ||||
|  * | ||||
|  * @param  a first value | ||||
|  * @param  b value doubled and added to a | ||||
|  * @return sum with signed saturation | ||||
|  */ | ||||
| static av_always_inline int av_sat_dadd32_c(int a, int b) | ||||
| { | ||||
|     return av_sat_add32(a, av_sat_add32(b, b)); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Clip a float value into the amin-amax range. | ||||
|  * @param a value to clip | ||||
|  * @param amin minimum value of the clip range | ||||
|  * @param amax maximum value of the clip range | ||||
|  * @return clipped value | ||||
|  */ | ||||
| static av_always_inline av_const float av_clipf_c(float a, float amin, float amax) | ||||
| { | ||||
| #if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 | ||||
|     if (amin > amax) abort(); | ||||
| #endif | ||||
|     if      (a < amin) return amin; | ||||
|     else if (a > amax) return amax; | ||||
|     else               return a; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Clip a double value into the amin-amax range. | ||||
|  * @param a value to clip | ||||
|  * @param amin minimum value of the clip range | ||||
|  * @param amax maximum value of the clip range | ||||
|  * @return clipped value | ||||
|  */ | ||||
| static av_always_inline av_const double av_clipd_c(double a, double amin, double amax) | ||||
| { | ||||
| #if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 | ||||
|     if (amin > amax) abort(); | ||||
| #endif | ||||
|     if      (a < amin) return amin; | ||||
|     else if (a > amax) return amax; | ||||
|     else               return a; | ||||
| } | ||||
| 
 | ||||
| /** Compute ceil(log2(x)).
 | ||||
|  * @param x value used to compute ceil(log2(x)) | ||||
|  * @return computed ceiling of log2(x) | ||||
|  */ | ||||
| static av_always_inline av_const int av_ceil_log2_c(int x) | ||||
| { | ||||
|     return av_log2((x - 1) << 1); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Count number of bits set to one in x | ||||
|  * @param x value to count bits of | ||||
|  * @return the number of bits set to one in x | ||||
|  */ | ||||
| static av_always_inline av_const int av_popcount_c(uint32_t x) | ||||
| { | ||||
|     x -= (x >> 1) & 0x55555555; | ||||
|     x = (x & 0x33333333) + ((x >> 2) & 0x33333333); | ||||
|     x = (x + (x >> 4)) & 0x0F0F0F0F; | ||||
|     x += x >> 8; | ||||
|     return (x + (x >> 16)) & 0x3F; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Count number of bits set to one in x | ||||
|  * @param x value to count bits of | ||||
|  * @return the number of bits set to one in x | ||||
|  */ | ||||
| static av_always_inline av_const int av_popcount64_c(uint64_t x) | ||||
| { | ||||
|     return av_popcount((uint32_t)x) + av_popcount((uint32_t)(x >> 32)); | ||||
| } | ||||
| 
 | ||||
| static av_always_inline av_const int av_parity_c(uint32_t v) | ||||
| { | ||||
|     return av_popcount(v) & 1; | ||||
| } | ||||
| 
 | ||||
| #define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24)) | ||||
| #define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24)) | ||||
| 
 | ||||
| /**
 | ||||
|  * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form. | ||||
|  * | ||||
|  * @param val      Output value, must be an lvalue of type uint32_t. | ||||
|  * @param GET_BYTE Expression reading one byte from the input. | ||||
|  *                 Evaluated up to 7 times (4 for the currently | ||||
|  *                 assigned Unicode range).  With a memory buffer | ||||
|  *                 input, this could be *ptr++. | ||||
|  * @param ERROR    Expression to be evaluated on invalid input, | ||||
|  *                 typically a goto statement. | ||||
|  * | ||||
|  * @warning ERROR should not contain a loop control statement which | ||||
|  * could interact with the internal while loop, and should force an | ||||
|  * exit from the macro code (e.g. through a goto or a return) in order | ||||
|  * to prevent undefined results. | ||||
|  */ | ||||
| #define GET_UTF8(val, GET_BYTE, ERROR)\ | ||||
|     val= (GET_BYTE);\
 | ||||
|     {\
 | ||||
|         uint32_t top = (val & 128) >> 1;\
 | ||||
|         if ((val & 0xc0) == 0x80 || val >= 0xFE)\
 | ||||
|             ERROR\
 | ||||
|         while (val & top) {\
 | ||||
|             int tmp= (GET_BYTE) - 128;\
 | ||||
|             if(tmp>>6)\
 | ||||
|                 ERROR\
 | ||||
|             val= (val<<6) + tmp;\
 | ||||
|             top <<= 5;\
 | ||||
|         }\
 | ||||
|         val &= (top << 1) - 1;\
 | ||||
|     } | ||||
| 
 | ||||
| /**
 | ||||
|  * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form. | ||||
|  * | ||||
|  * @param val       Output value, must be an lvalue of type uint32_t. | ||||
|  * @param GET_16BIT Expression returning two bytes of UTF-16 data converted | ||||
|  *                  to native byte order.  Evaluated one or two times. | ||||
|  * @param ERROR     Expression to be evaluated on invalid input, | ||||
|  *                  typically a goto statement. | ||||
|  */ | ||||
| #define GET_UTF16(val, GET_16BIT, ERROR)\ | ||||
|     val = GET_16BIT;\
 | ||||
|     {\
 | ||||
|         unsigned int hi = val - 0xD800;\
 | ||||
|         if (hi < 0x800) {\
 | ||||
|             val = GET_16BIT - 0xDC00;\
 | ||||
|             if (val > 0x3FFU || hi > 0x3FFU)\
 | ||||
|                 ERROR\
 | ||||
|             val += (hi<<10) + 0x10000;\
 | ||||
|         }\
 | ||||
|     }\
 | ||||
| 
 | ||||
| /**
 | ||||
|  * @def PUT_UTF8(val, tmp, PUT_BYTE) | ||||
|  * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long). | ||||
|  * @param val is an input-only argument and should be of type uint32_t. It holds | ||||
|  * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If | ||||
|  * val is given as a function it is executed only once. | ||||
|  * @param tmp is a temporary variable and should be of type uint8_t. It | ||||
|  * represents an intermediate value during conversion that is to be | ||||
|  * output by PUT_BYTE. | ||||
|  * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination. | ||||
|  * It could be a function or a statement, and uses tmp as the input byte. | ||||
|  * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be | ||||
|  * executed up to 4 times for values in the valid UTF-8 range and up to | ||||
|  * 7 times in the general case, depending on the length of the converted | ||||
|  * Unicode character. | ||||
|  */ | ||||
| #define PUT_UTF8(val, tmp, PUT_BYTE)\ | ||||
|     {\
 | ||||
|         int bytes, shift;\
 | ||||
|         uint32_t in = val;\
 | ||||
|         if (in < 0x80) {\
 | ||||
|             tmp = in;\
 | ||||
|             PUT_BYTE\
 | ||||
|         } else {\
 | ||||
|             bytes = (av_log2(in) + 4) / 5;\
 | ||||
|             shift = (bytes - 1) * 6;\
 | ||||
|             tmp = (256 - (256 >> bytes)) | (in >> shift);\
 | ||||
|             PUT_BYTE\
 | ||||
|             while (shift >= 6) {\
 | ||||
|                 shift -= 6;\
 | ||||
|                 tmp = 0x80 | ((in >> shift) & 0x3f);\
 | ||||
|                 PUT_BYTE\
 | ||||
|             }\
 | ||||
|         }\
 | ||||
|     } | ||||
| 
 | ||||
| /**
 | ||||
|  * @def PUT_UTF16(val, tmp, PUT_16BIT) | ||||
|  * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes). | ||||
|  * @param val is an input-only argument and should be of type uint32_t. It holds | ||||
|  * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If | ||||
|  * val is given as a function it is executed only once. | ||||
|  * @param tmp is a temporary variable and should be of type uint16_t. It | ||||
|  * represents an intermediate value during conversion that is to be | ||||
|  * output by PUT_16BIT. | ||||
|  * @param PUT_16BIT writes the converted UTF-16 data to any proper destination | ||||
|  * in desired endianness. It could be a function or a statement, and uses tmp | ||||
|  * as the input byte.  For example, PUT_BYTE could be "*output++ = tmp;" | ||||
|  * PUT_BYTE will be executed 1 or 2 times depending on input character. | ||||
|  */ | ||||
| #define PUT_UTF16(val, tmp, PUT_16BIT)\ | ||||
|     {\
 | ||||
|         uint32_t in = val;\
 | ||||
|         if (in < 0x10000) {\
 | ||||
|             tmp = in;\
 | ||||
|             PUT_16BIT\
 | ||||
|         } else {\
 | ||||
|             tmp = 0xD800 | ((in - 0x10000) >> 10);\
 | ||||
|             PUT_16BIT\
 | ||||
|             tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\
 | ||||
|             PUT_16BIT\
 | ||||
|         }\
 | ||||
|     }\
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #include "mem.h" | ||||
| 
 | ||||
| #ifdef HAVE_AV_CONFIG_H | ||||
| #    include "internal.h" | ||||
| #endif /* HAVE_AV_CONFIG_H */ | ||||
| 
 | ||||
| #endif /* AVUTIL_COMMON_H */ | ||||
| 
 | ||||
| /*
 | ||||
|  * The following definitions are outside the multiple inclusion guard | ||||
|  * to ensure they are immediately available in intmath.h. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef av_ceil_log2 | ||||
| #   define av_ceil_log2     av_ceil_log2_c | ||||
| #endif | ||||
| #ifndef av_clip | ||||
| #   define av_clip          av_clip_c | ||||
| #endif | ||||
| #ifndef av_clip64 | ||||
| #   define av_clip64        av_clip64_c | ||||
| #endif | ||||
| #ifndef av_clip_uint8 | ||||
| #   define av_clip_uint8    av_clip_uint8_c | ||||
| #endif | ||||
| #ifndef av_clip_int8 | ||||
| #   define av_clip_int8     av_clip_int8_c | ||||
| #endif | ||||
| #ifndef av_clip_uint16 | ||||
| #   define av_clip_uint16   av_clip_uint16_c | ||||
| #endif | ||||
| #ifndef av_clip_int16 | ||||
| #   define av_clip_int16    av_clip_int16_c | ||||
| #endif | ||||
| #ifndef av_clipl_int32 | ||||
| #   define av_clipl_int32   av_clipl_int32_c | ||||
| #endif | ||||
| #ifndef av_clip_intp2 | ||||
| #   define av_clip_intp2    av_clip_intp2_c | ||||
| #endif | ||||
| #ifndef av_clip_uintp2 | ||||
| #   define av_clip_uintp2   av_clip_uintp2_c | ||||
| #endif | ||||
| #ifndef av_mod_uintp2 | ||||
| #   define av_mod_uintp2    av_mod_uintp2_c | ||||
| #endif | ||||
| #ifndef av_sat_add32 | ||||
| #   define av_sat_add32     av_sat_add32_c | ||||
| #endif | ||||
| #ifndef av_sat_dadd32 | ||||
| #   define av_sat_dadd32    av_sat_dadd32_c | ||||
| #endif | ||||
| #ifndef av_clipf | ||||
| #   define av_clipf         av_clipf_c | ||||
| #endif | ||||
| #ifndef av_clipd | ||||
| #   define av_clipd         av_clipd_c | ||||
| #endif | ||||
| #ifndef av_popcount | ||||
| #   define av_popcount      av_popcount_c | ||||
| #endif | ||||
| #ifndef av_popcount64 | ||||
| #   define av_popcount64    av_popcount64_c | ||||
| #endif | ||||
| #ifndef av_parity | ||||
| #   define av_parity        av_parity_c | ||||
| #endif | ||||
| @ -0,0 +1,117 @@ | ||||
| /*
 | ||||
|  * Copyright (c) 2000, 2001, 2002 Fabrice Bellard | ||||
|  * | ||||
|  * 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_CPU_H | ||||
| #define AVUTIL_CPU_H | ||||
| 
 | ||||
| #include "attributes.h" | ||||
| 
 | ||||
| #define AV_CPU_FLAG_FORCE    0x80000000 /* force usage of selected flags (OR) */ | ||||
| 
 | ||||
|     /* lower 16 bits - CPU features */ | ||||
| #define AV_CPU_FLAG_MMX          0x0001 ///< standard MMX
 | ||||
| #define AV_CPU_FLAG_MMXEXT       0x0002 ///< SSE integer functions or AMD MMX ext
 | ||||
| #define AV_CPU_FLAG_MMX2         0x0002 ///< SSE integer functions or AMD MMX ext
 | ||||
| #define AV_CPU_FLAG_3DNOW        0x0004 ///< AMD 3DNOW
 | ||||
| #define AV_CPU_FLAG_SSE          0x0008 ///< SSE functions
 | ||||
| #define AV_CPU_FLAG_SSE2         0x0010 ///< PIV SSE2 functions
 | ||||
| #define AV_CPU_FLAG_SSE2SLOW 0x40000000 ///< SSE2 supported, but usually not faster
 | ||||
|                                         ///< than regular MMX/SSE (e.g. Core1)
 | ||||
| #define AV_CPU_FLAG_3DNOWEXT     0x0020 ///< AMD 3DNowExt
 | ||||
| #define AV_CPU_FLAG_SSE3         0x0040 ///< Prescott SSE3 functions
 | ||||
| #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_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
 | ||||
| #define AV_CPU_FLAG_AESNI       0x80000 ///< Advanced Encryption Standard functions
 | ||||
| #define AV_CPU_FLAG_AVX          0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used
 | ||||
| #define AV_CPU_FLAG_AVXSLOW   0x8000000 ///< AVX supported, but slow when using YMM registers (e.g. Bulldozer)
 | ||||
| #define AV_CPU_FLAG_XOP          0x0400 ///< Bulldozer XOP functions
 | ||||
| #define AV_CPU_FLAG_FMA4         0x0800 ///< Bulldozer FMA4 functions
 | ||||
| #define AV_CPU_FLAG_CMOV         0x1000 ///< supports cmov instruction
 | ||||
| #define AV_CPU_FLAG_AVX2         0x8000 ///< AVX2 functions: requires OS support even if YMM registers aren't used
 | ||||
| #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_ALTIVEC      0x0001 ///< standard
 | ||||
| #define AV_CPU_FLAG_VSX          0x0002 ///< ISA 2.06
 | ||||
| #define AV_CPU_FLAG_POWER8       0x0004 ///< ISA 2.07
 | ||||
| 
 | ||||
| #define AV_CPU_FLAG_ARMV5TE      (1 << 0) | ||||
| #define AV_CPU_FLAG_ARMV6        (1 << 1) | ||||
| #define AV_CPU_FLAG_ARMV6T2      (1 << 2) | ||||
| #define AV_CPU_FLAG_VFP          (1 << 3) | ||||
| #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 | ||||
|  * detect the enabled cpu flags. | ||||
|  */ | ||||
| int av_get_cpu_flags(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Disables cpu detection and forces the specified flags. | ||||
|  * -1 is a special case that disables forcing of specific flags. | ||||
|  */ | ||||
| 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); | ||||
| 
 | ||||
| /**
 | ||||
|  * Parse CPU flags from a string. | ||||
|  * | ||||
|  * The returned flags contain the specified flags as well as related unspecified flags. | ||||
|  * | ||||
|  * This function exists only for compatibility with libav. | ||||
|  * Please use av_parse_cpu_caps() when possible. | ||||
|  * @return a combination of AV_CPU_* flags, negative on error. | ||||
|  */ | ||||
| attribute_deprecated | ||||
| int av_parse_cpu_flags(const char *s); | ||||
| 
 | ||||
| /**
 | ||||
|  * Parse CPU caps from a string and update the given AV_CPU_* flags based on that. | ||||
|  * | ||||
|  * @return negative on error. | ||||
|  */ | ||||
| int av_parse_cpu_caps(unsigned *flags, const char *s); | ||||
| 
 | ||||
| /**
 | ||||
|  * @return the number of logical CPU cores present. | ||||
|  */ | ||||
| int av_cpu_count(void); | ||||
| 
 | ||||
| #endif /* AVUTIL_CPU_H */ | ||||
| @ -0,0 +1,91 @@ | ||||
| /*
 | ||||
|  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | ||||
|  * | ||||
|  * 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_CRC_H | ||||
| #define AVUTIL_CRC_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <stddef.h> | ||||
| #include "attributes.h" | ||||
| #include "version.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavu_crc32 CRC32 | ||||
|  * @ingroup lavu_crypto | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| typedef uint32_t AVCRC; | ||||
| 
 | ||||
| typedef enum { | ||||
|     AV_CRC_8_ATM, | ||||
|     AV_CRC_16_ANSI, | ||||
|     AV_CRC_16_CCITT, | ||||
|     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 */ | ||||
| #if FF_API_CRC_BIG_TABLE | ||||
|     AV_CRC_24_IEEE = 12, | ||||
| #else | ||||
|     AV_CRC_24_IEEE, | ||||
| #endif /* FF_API_CRC_BIG_TABLE */ | ||||
|     AV_CRC_MAX,         /*< Not part of public API! Do not use outside libavutil. */ | ||||
| }AVCRCId; | ||||
| 
 | ||||
| /**
 | ||||
|  * Initialize a CRC table. | ||||
|  * @param ctx must be an array of size sizeof(AVCRC)*257 or sizeof(AVCRC)*1024 | ||||
|  * @param le If 1, the lowest bit represents the coefficient for the highest | ||||
|  *           exponent of the corresponding polynomial (both for poly and | ||||
|  *           actual CRC). | ||||
|  *           If 0, you must swap the CRC parameter and the result of av_crc | ||||
|  *           if you need the standard representation (can be simplified in | ||||
|  *           most cases to e.g. bswap16): | ||||
|  *           av_bswap32(crc << (32-bits)) | ||||
|  * @param bits number of bits for the CRC | ||||
|  * @param poly generator polynomial without the x**bits coefficient, in the | ||||
|  *             representation as specified by le | ||||
|  * @param ctx_size size of ctx in bytes | ||||
|  * @return <0 on failure | ||||
|  */ | ||||
| int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get an initialized standard CRC table. | ||||
|  * @param crc_id ID of a standard CRC | ||||
|  * @return a pointer to the CRC table or NULL on failure | ||||
|  */ | ||||
| const AVCRC *av_crc_get_table(AVCRCId crc_id); | ||||
| 
 | ||||
| /**
 | ||||
|  * Calculate the CRC of a block. | ||||
|  * @param crc CRC of previous blocks if any or initial value for CRC | ||||
|  * @return CRC updated with the data from the given block | ||||
|  * | ||||
|  * @see av_crc_init() "le" parameter | ||||
|  */ | ||||
| uint32_t av_crc(const AVCRC *ctx, uint32_t crc, | ||||
|                 const uint8_t *buffer, size_t length) av_pure; | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_CRC_H */ | ||||
| @ -0,0 +1,77 @@ | ||||
| /*
 | ||||
|  * DES encryption/decryption | ||||
|  * Copyright (c) 2007 Reimar Doeffinger | ||||
|  * | ||||
|  * 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_DES_H | ||||
| #define AVUTIL_DES_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavu_des DES | ||||
|  * @ingroup lavu_crypto | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| typedef struct AVDES { | ||||
|     uint64_t round_keys[3][16]; | ||||
|     int triple_des; | ||||
| } AVDES; | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate an AVDES context. | ||||
|  */ | ||||
| AVDES *av_des_alloc(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Initializes an AVDES context. | ||||
|  * | ||||
|  * @param key_bits must be 64 or 192 | ||||
|  * @param decrypt 0 for encryption/CBC-MAC, 1 for decryption | ||||
|  * @return zero on success, negative value otherwise | ||||
|  */ | ||||
| int av_des_init(struct AVDES *d, const uint8_t *key, int key_bits, int decrypt); | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Encrypts / decrypts using the DES algorithm. | ||||
|  * | ||||
|  * @param count number of 8 byte blocks | ||||
|  * @param dst destination array, can be equal to src, must be 8-byte aligned | ||||
|  * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL | ||||
|  * @param iv initialization vector for CBC mode, if NULL then ECB will be used, | ||||
|  *           must be 8-byte aligned | ||||
|  * @param decrypt 0 for encryption, 1 for decryption | ||||
|  */ | ||||
| void av_des_crypt(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Calculates CBC-MAC using the DES algorithm. | ||||
|  * | ||||
|  * @param count number of 8 byte blocks | ||||
|  * @param dst destination array, can be equal to src, must be 8-byte aligned | ||||
|  * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL | ||||
|  */ | ||||
| void av_des_mac(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_DES_H */ | ||||
| @ -0,0 +1,198 @@ | ||||
| /*
 | ||||
|  * | ||||
|  * 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 | ||||
|  * Public dictionary API. | ||||
|  * @deprecated | ||||
|  *  AVDictionary is provided for compatibility with libav. It is both in | ||||
|  *  implementation as well as API inefficient. It does not scale and is | ||||
|  *  extremely slow with large dictionaries. | ||||
|  *  It is recommended that new code uses our tree container from tree.c/h | ||||
|  *  where applicable, which uses AVL trees to achieve O(log n) performance. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVUTIL_DICT_H | ||||
| #define AVUTIL_DICT_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "version.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * @addtogroup lavu_dict AVDictionary | ||||
|  * @ingroup lavu_data | ||||
|  * | ||||
|  * @brief Simple key:value store | ||||
|  * | ||||
|  * @{ | ||||
|  * Dictionaries are used for storing key:value pairs. To create | ||||
|  * an AVDictionary, simply pass an address of a NULL pointer to | ||||
|  * av_dict_set(). NULL can be used as an empty dictionary wherever | ||||
|  * a pointer to an AVDictionary is required. | ||||
|  * Use av_dict_get() to retrieve an entry or iterate over all | ||||
|  * entries and finally av_dict_free() to free the dictionary | ||||
|  * and all its contents. | ||||
|  * | ||||
|  @code | ||||
|    AVDictionary *d = NULL;           // "create" an empty dictionary
 | ||||
|    AVDictionaryEntry *t = NULL; | ||||
| 
 | ||||
|    av_dict_set(&d, "foo", "bar", 0); // add an entry
 | ||||
| 
 | ||||
|    char *k = av_strdup("key");       // if your strings are already allocated,
 | ||||
|    char *v = av_strdup("value");     // you can avoid copying them like this
 | ||||
|    av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL); | ||||
| 
 | ||||
|    while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) { | ||||
|        <....>                             // iterate over all entries in d
 | ||||
|    } | ||||
|    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(). */ | ||||
| #define AV_DICT_IGNORE_SUFFIX   2   /**< Return first entry in a dictionary whose first part corresponds to the search key, | ||||
|                                          ignoring the suffix of the found key string. Only relevant in av_dict_get(). */ | ||||
| #define AV_DICT_DONT_STRDUP_KEY 4   /**< Take ownership of a key that's been | ||||
|                                          allocated with av_malloc() or another memory allocation function. */ | ||||
| #define AV_DICT_DONT_STRDUP_VAL 8   /**< Take ownership of a value that's been | ||||
|                                          allocated with av_malloc() or another memory allocation function. */ | ||||
| #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. */ | ||||
| 
 | ||||
| typedef struct AVDictionaryEntry { | ||||
|     char *key; | ||||
|     char *value; | ||||
| } AVDictionaryEntry; | ||||
| 
 | ||||
| typedef struct AVDictionary AVDictionary; | ||||
| 
 | ||||
| /**
 | ||||
|  * Get a dictionary entry with matching key. | ||||
|  * | ||||
|  * The returned entry key or value must not be changed, or it will | ||||
|  * cause undefined behavior. | ||||
|  * | ||||
|  * To iterate through all the dictionary entries, you can set the matching key | ||||
|  * to the null string "" and set the AV_DICT_IGNORE_SUFFIX flag. | ||||
|  * | ||||
|  * @param prev Set to the previous matching element to find the next. | ||||
|  *             If set to NULL the first matching element is returned. | ||||
|  * @param key matching key | ||||
|  * @param flags a collection of AV_DICT_* flags controlling how the entry is retrieved | ||||
|  * @return found entry or NULL in case no matching entry was found in the dictionary | ||||
|  */ | ||||
| AVDictionaryEntry *av_dict_get(const AVDictionary *m, const char *key, | ||||
|                                const AVDictionaryEntry *prev, int flags); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get number of entries in dictionary. | ||||
|  * | ||||
|  * @param m dictionary | ||||
|  * @return  number of entries in dictionary | ||||
|  */ | ||||
| int av_dict_count(const AVDictionary *m); | ||||
| 
 | ||||
| /**
 | ||||
|  * Set the given entry in *pm, overwriting an existing entry. | ||||
|  * | ||||
|  * Note: If AV_DICT_DONT_STRDUP_KEY or AV_DICT_DONT_STRDUP_VAL is set, | ||||
|  * these arguments will be freed on error. | ||||
|  * | ||||
|  * @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). | ||||
|  *        Passing a NULL value will cause an existing entry to be deleted. | ||||
|  * @return >= 0 on success otherwise an error code <0 | ||||
|  */ | ||||
| int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags); | ||||
| 
 | ||||
| /**
 | ||||
|  * Convenience wrapper for av_dict_set that converts the value to a string | ||||
|  * and stores it. | ||||
|  * | ||||
|  * Note: If AV_DICT_DONT_STRDUP_KEY is set, key will be freed on error. | ||||
|  */ | ||||
| int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags); | ||||
| 
 | ||||
| /**
 | ||||
|  * Parse the key/value pairs list and add the parsed entries to a dictionary. | ||||
|  * | ||||
|  * In case of failure, all the successfully set entries are stored in | ||||
|  * *pm. You may need to manually free the created dictionary. | ||||
|  * | ||||
|  * @param key_val_sep  a 0-terminated list of characters used to separate | ||||
|  *                     key from value | ||||
|  * @param pairs_sep    a 0-terminated list of characters used to separate | ||||
|  *                     two pairs from each other | ||||
|  * @param flags        flags to use when adding to dictionary. | ||||
|  *                     AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL | ||||
|  *                     are ignored since the key/value tokens will always | ||||
|  *                     be duplicated. | ||||
|  * @return             0 on success, negative AVERROR code on failure | ||||
|  */ | ||||
| int av_dict_parse_string(AVDictionary **pm, const char *str, | ||||
|                          const char *key_val_sep, const char *pairs_sep, | ||||
|                          int flags); | ||||
| 
 | ||||
| /**
 | ||||
|  * Copy entries from one AVDictionary struct into another. | ||||
|  * @param dst pointer to a pointer to a AVDictionary struct. If *dst is NULL, | ||||
|  *            this function will allocate a struct for you and put it in *dst | ||||
|  * @param src pointer to source AVDictionary struct | ||||
|  * @param flags flags to use when setting entries in *dst | ||||
|  * @note metadata is read using the AV_DICT_IGNORE_SUFFIX flag | ||||
|  * @return 0 on success, negative AVERROR code on failure. If dst was allocated | ||||
|  *           by this function, callers should free the associated memory. | ||||
|  */ | ||||
| int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free all the memory allocated for an AVDictionary struct | ||||
|  * and all keys and values. | ||||
|  */ | ||||
| void av_dict_free(AVDictionary **m); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get dictionary entries as a string. | ||||
|  * | ||||
|  * Create a string containing dictionary's entries. | ||||
|  * Such string may be passed back to av_dict_parse_string(). | ||||
|  * @note String is escaped with backslashes ('\'). | ||||
|  * | ||||
|  * @param[in]  m             dictionary | ||||
|  * @param[out] buffer        Pointer to buffer that will be allocated with string containg entries. | ||||
|  *                           Buffer must be freed by the caller when is no longer needed. | ||||
|  * @param[in]  key_val_sep   character used to separate key from value | ||||
|  * @param[in]  pairs_sep     character used to separate two pairs from each other | ||||
|  * @return                   >= 0 on success, negative on error | ||||
|  * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same. | ||||
|  */ | ||||
| int av_dict_get_string(const AVDictionary *m, char **buffer, | ||||
|                        const char key_val_sep, const char pairs_sep); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_DICT_H */ | ||||
| @ -0,0 +1,86 @@ | ||||
| /*
 | ||||
|  * Copyright (c) 2014 Vittorio Giovara <vittorio.giovara@gmail.com> | ||||
|  * | ||||
|  * 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_DISPLAY_H | ||||
| #define AVUTIL_DISPLAY_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| /**
 | ||||
|  * 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: | ||||
|  * | ||||
|  *                                  | a b u | | ||||
|  *   (a, b, u, c, d, v, x, y, w) -> | c d v | | ||||
|  *                                  | x y w | | ||||
|  * | ||||
|  * 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. | ||||
|  * | ||||
|  * 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: | ||||
|  *               | a b u | | ||||
|  *   (p, q, 1) . | c d v | = z * (p', q', 1) | ||||
|  *               | x y w | | ||||
|  * | ||||
|  * The transformation can also be more explicitly written in components as | ||||
|  * follows: | ||||
|  *   p' = (a * p + c * q + x) / z; | ||||
|  *   q' = (b * p + d * q + y) / z; | ||||
|  *   z  =  u * p + v * q + w | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Extract the rotation component of the transformation matrix. | ||||
|  * | ||||
|  * @param matrix the transformation matrix | ||||
|  * @return the angle (in degrees) by which the transformation rotates the frame | ||||
|  *         counterclockwise. The angle will be in range [-180.0, 180.0], | ||||
|  *         or NaN if the matrix is singular. | ||||
|  * | ||||
|  * @note floating point numbers are inherently inexact, so callers are | ||||
|  *       recommended to round the return value to nearest integer before use. | ||||
|  */ | ||||
| double av_display_rotation_get(const int32_t matrix[9]); | ||||
| 
 | ||||
| /**
 | ||||
|  * Initialize a transformation matrix describing a pure counterclockwise | ||||
|  * rotation by the specified angle (in degrees). | ||||
|  * | ||||
|  * @param matrix an allocated transformation matrix (will be fully overwritten | ||||
|  *               by this function) | ||||
|  * @param angle rotation angle in degrees. | ||||
|  */ | ||||
| void av_display_rotation_set(int32_t matrix[9], double angle); | ||||
| 
 | ||||
| /**
 | ||||
|  * Flip the input matrix horizontally and/or vertically. | ||||
|  * | ||||
|  * @param matrix an allocated transformation matrix | ||||
|  * @param hflip whether the matrix should be flipped horizontally | ||||
|  * @param vflip whether the matrix should be flipped vertically | ||||
|  */ | ||||
| void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip); | ||||
| 
 | ||||
| #endif /* AVUTIL_DISPLAY_H */ | ||||
| @ -0,0 +1,115 @@ | ||||
| /*
 | ||||
|  * Copyright (c) 2014 Tim Walker <tdskywalker@gmail.com> | ||||
|  * | ||||
|  * 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_DOWNMIX_INFO_H | ||||
| #define AVUTIL_DOWNMIX_INFO_H | ||||
| 
 | ||||
| #include "frame.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * audio downmix medatata | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @addtogroup lavu_audio | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup downmix_info Audio downmix metadata | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Possible downmix types. | ||||
|  */ | ||||
| enum AVDownmixType { | ||||
|     AV_DOWNMIX_TYPE_UNKNOWN, /**< Not indicated. */ | ||||
|     AV_DOWNMIX_TYPE_LORO,    /**< Lo/Ro 2-channel downmix (Stereo). */ | ||||
|     AV_DOWNMIX_TYPE_LTRT,    /**< Lt/Rt 2-channel downmix, Dolby Surround compatible. */ | ||||
|     AV_DOWNMIX_TYPE_DPLII,   /**< Lt/Rt 2-channel downmix, Dolby Pro Logic II compatible. */ | ||||
|     AV_DOWNMIX_TYPE_NB       /**< Number of downmix types. Not part of ABI. */ | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * This structure describes optional metadata relevant to a downmix procedure. | ||||
|  * | ||||
|  * All fields are set by the decoder to the value indicated in the audio | ||||
|  * bitstream (if present), or to a "sane" default otherwise. | ||||
|  */ | ||||
| typedef struct AVDownmixInfo { | ||||
|     /**
 | ||||
|      * Type of downmix preferred by the mastering engineer. | ||||
|      */ | ||||
|     enum AVDownmixType preferred_downmix_type; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Absolute scale factor representing the nominal level of the center | ||||
|      * channel during a regular downmix. | ||||
|      */ | ||||
|     double center_mix_level; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Absolute scale factor representing the nominal level of the center | ||||
|      * channel during an Lt/Rt compatible downmix. | ||||
|      */ | ||||
|     double center_mix_level_ltrt; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Absolute scale factor representing the nominal level of the surround | ||||
|      * channels during a regular downmix. | ||||
|      */ | ||||
|     double surround_mix_level; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Absolute scale factor representing the nominal level of the surround | ||||
|      * channels during an Lt/Rt compatible downmix. | ||||
|      */ | ||||
|     double surround_mix_level_ltrt; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Absolute scale factor representing the level at which the LFE data is | ||||
|      * mixed into L/R channels during downmixing. | ||||
|      */ | ||||
|     double lfe_mix_level; | ||||
| } AVDownmixInfo; | ||||
| 
 | ||||
| /**
 | ||||
|  * Get a frame's AV_FRAME_DATA_DOWNMIX_INFO side data for editing. | ||||
|  * | ||||
|  * If the side data is absent, it is created and added to the frame. | ||||
|  * | ||||
|  * @param frame the frame for which the side data is to be obtained or created | ||||
|  * | ||||
|  * @return the AVDownmixInfo structure to be edited by the caller, or NULL if | ||||
|  *         the structure cannot be allocated. | ||||
|  */ | ||||
| AVDownmixInfo *av_downmix_info_update_side_data(AVFrame *frame); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_DOWNMIX_INFO_H */ | ||||
| @ -0,0 +1,126 @@ | ||||
| /*
 | ||||
|  * 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 | ||||
|  * error code definitions | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVUTIL_ERROR_H | ||||
| #define AVUTIL_ERROR_H | ||||
| 
 | ||||
| #include <errno.h> | ||||
| #include <stddef.h> | ||||
| 
 | ||||
| /**
 | ||||
|  * @addtogroup lavu_error | ||||
|  * | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| /* error handling */ | ||||
| #if EDOM > 0 | ||||
| #define AVERROR(e) (-(e))   ///< Returns a negative error code from a POSIX error code, to return from library functions.
 | ||||
| #define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value.
 | ||||
| #else | ||||
| /* Some platforms have E* and errno already negated. */ | ||||
| #define AVERROR(e) (e) | ||||
| #define AVUNERROR(e) (e) | ||||
| #endif | ||||
| 
 | ||||
| #define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d)) | ||||
| 
 | ||||
| #define AVERROR_BSF_NOT_FOUND      FFERRTAG(0xF8,'B','S','F') ///< Bitstream filter not found
 | ||||
| #define AVERROR_BUG                FFERRTAG( 'B','U','G','!') ///< Internal bug, also see AVERROR_BUG2
 | ||||
| #define AVERROR_BUFFER_TOO_SMALL   FFERRTAG( 'B','U','F','S') ///< Buffer too small
 | ||||
| #define AVERROR_DECODER_NOT_FOUND  FFERRTAG(0xF8,'D','E','C') ///< Decoder not found
 | ||||
| #define AVERROR_DEMUXER_NOT_FOUND  FFERRTAG(0xF8,'D','E','M') ///< Demuxer not found
 | ||||
| #define AVERROR_ENCODER_NOT_FOUND  FFERRTAG(0xF8,'E','N','C') ///< Encoder not found
 | ||||
| #define AVERROR_EOF                FFERRTAG( 'E','O','F',' ') ///< End of file
 | ||||
| #define AVERROR_EXIT               FFERRTAG( 'E','X','I','T') ///< Immediate exit was requested; the called function should not be restarted
 | ||||
| #define AVERROR_EXTERNAL           FFERRTAG( 'E','X','T',' ') ///< Generic error in an external library
 | ||||
| #define AVERROR_FILTER_NOT_FOUND   FFERRTAG(0xF8,'F','I','L') ///< Filter not found
 | ||||
| #define AVERROR_INVALIDDATA        FFERRTAG( 'I','N','D','A') ///< Invalid data found when processing input
 | ||||
| #define AVERROR_MUXER_NOT_FOUND    FFERRTAG(0xF8,'M','U','X') ///< Muxer not found
 | ||||
| #define AVERROR_OPTION_NOT_FOUND   FFERRTAG(0xF8,'O','P','T') ///< Option not found
 | ||||
| #define AVERROR_PATCHWELCOME       FFERRTAG( 'P','A','W','E') ///< Not yet implemented in FFmpeg, patches welcome
 | ||||
| #define AVERROR_PROTOCOL_NOT_FOUND FFERRTAG(0xF8,'P','R','O') ///< Protocol not found
 | ||||
| 
 | ||||
| #define AVERROR_STREAM_NOT_FOUND   FFERRTAG(0xF8,'S','T','R') ///< Stream not found
 | ||||
| /**
 | ||||
|  * This is semantically identical to AVERROR_BUG | ||||
|  * it has been introduced in Libav after our AVERROR_BUG and with a modified value. | ||||
|  */ | ||||
| #define AVERROR_BUG2               FFERRTAG( 'B','U','G',' ') | ||||
| #define AVERROR_UNKNOWN            FFERRTAG( 'U','N','K','N') ///< Unknown error, typically from an external library
 | ||||
| #define AVERROR_EXPERIMENTAL       (-0x2bb2afa8) ///< Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it.
 | ||||
| #define AVERROR_INPUT_CHANGED      (-0x636e6701) ///< Input changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_OUTPUT_CHANGED)
 | ||||
| #define AVERROR_OUTPUT_CHANGED     (-0x636e6702) ///< Output changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_INPUT_CHANGED)
 | ||||
| /* HTTP & RTSP errors */ | ||||
| #define AVERROR_HTTP_BAD_REQUEST   FFERRTAG(0xF8,'4','0','0') | ||||
| #define AVERROR_HTTP_UNAUTHORIZED  FFERRTAG(0xF8,'4','0','1') | ||||
| #define AVERROR_HTTP_FORBIDDEN     FFERRTAG(0xF8,'4','0','3') | ||||
| #define AVERROR_HTTP_NOT_FOUND     FFERRTAG(0xF8,'4','0','4') | ||||
| #define AVERROR_HTTP_OTHER_4XX     FFERRTAG(0xF8,'4','X','X') | ||||
| #define AVERROR_HTTP_SERVER_ERROR  FFERRTAG(0xF8,'5','X','X') | ||||
| 
 | ||||
| #define AV_ERROR_MAX_STRING_SIZE 64 | ||||
| 
 | ||||
| /**
 | ||||
|  * Put a description of the AVERROR code errnum in errbuf. | ||||
|  * In case of failure the global variable errno is set to indicate the | ||||
|  * error. Even in case of failure av_strerror() will print a generic | ||||
|  * error message indicating the errnum provided to errbuf. | ||||
|  * | ||||
|  * @param errnum      error code to describe | ||||
|  * @param errbuf      buffer to which description is written | ||||
|  * @param errbuf_size the size in bytes of errbuf | ||||
|  * @return 0 on success, a negative value if a description for errnum | ||||
|  * cannot be found | ||||
|  */ | ||||
| int av_strerror(int errnum, char *errbuf, size_t errbuf_size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Fill the provided buffer with a string containing an error string | ||||
|  * corresponding to the AVERROR code errnum. | ||||
|  * | ||||
|  * @param errbuf         a buffer | ||||
|  * @param errbuf_size    size in bytes of errbuf | ||||
|  * @param errnum         error code to describe | ||||
|  * @return the buffer in input, filled with the error description | ||||
|  * @see av_strerror() | ||||
|  */ | ||||
| static inline char *av_make_error_string(char *errbuf, size_t errbuf_size, int errnum) | ||||
| { | ||||
|     av_strerror(errnum, errbuf, errbuf_size); | ||||
|     return errbuf; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Convenience macro, the return value should be used only directly in | ||||
|  * function arguments but never stand-alone. | ||||
|  */ | ||||
| #define av_err2str(errnum) \ | ||||
|     av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum) | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_ERROR_H */ | ||||
| @ -0,0 +1,113 @@ | ||||
| /*
 | ||||
|  * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at> | ||||
|  * | ||||
|  * 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 | ||||
|  * simple arithmetic expression evaluator | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVUTIL_EVAL_H | ||||
| #define AVUTIL_EVAL_H | ||||
| 
 | ||||
| #include "avutil.h" | ||||
| 
 | ||||
| typedef struct AVExpr AVExpr; | ||||
| 
 | ||||
| /**
 | ||||
|  * Parse and evaluate an expression. | ||||
|  * Note, this is significantly slower than av_expr_eval(). | ||||
|  * | ||||
|  * @param res a pointer to a double where is put the result value of | ||||
|  * the expression, or NAN in case of error | ||||
|  * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" | ||||
|  * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} | ||||
|  * @param const_values a zero terminated array of values for the identifiers from const_names | ||||
|  * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers | ||||
|  * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument | ||||
|  * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers | ||||
|  * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments | ||||
|  * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 | ||||
|  * @param log_ctx parent logging context | ||||
|  * @return >= 0 in case of success, a negative value corresponding to an | ||||
|  * AVERROR code otherwise | ||||
|  */ | ||||
| int av_expr_parse_and_eval(double *res, const char *s, | ||||
|                            const char * const *const_names, const double *const_values, | ||||
|                            const char * const *func1_names, double (* const *funcs1)(void *, double), | ||||
|                            const char * const *func2_names, double (* const *funcs2)(void *, double, double), | ||||
|                            void *opaque, int log_offset, void *log_ctx); | ||||
| 
 | ||||
| /**
 | ||||
|  * Parse an expression. | ||||
|  * | ||||
|  * @param expr a pointer where is put an AVExpr containing the parsed | ||||
|  * value in case of successful parsing, or NULL otherwise. | ||||
|  * The pointed to AVExpr must be freed with av_expr_free() by the user | ||||
|  * when it is not needed anymore. | ||||
|  * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" | ||||
|  * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} | ||||
|  * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers | ||||
|  * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument | ||||
|  * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers | ||||
|  * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments | ||||
|  * @param log_ctx parent logging context | ||||
|  * @return >= 0 in case of success, a negative value corresponding to an | ||||
|  * AVERROR code otherwise | ||||
|  */ | ||||
| int av_expr_parse(AVExpr **expr, const char *s, | ||||
|                   const char * const *const_names, | ||||
|                   const char * const *func1_names, double (* const *funcs1)(void *, double), | ||||
|                   const char * const *func2_names, double (* const *funcs2)(void *, double, double), | ||||
|                   int log_offset, void *log_ctx); | ||||
| 
 | ||||
| /**
 | ||||
|  * Evaluate a previously parsed expression. | ||||
|  * | ||||
|  * @param const_values a zero terminated array of values for the identifiers from av_expr_parse() const_names | ||||
|  * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 | ||||
|  * @return the value of the expression | ||||
|  */ | ||||
| double av_expr_eval(AVExpr *e, const double *const_values, void *opaque); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free a parsed expression previously created with av_expr_parse(). | ||||
|  */ | ||||
| void av_expr_free(AVExpr *e); | ||||
| 
 | ||||
| /**
 | ||||
|  * Parse the string in numstr and return its value as a double. If | ||||
|  * the string is empty, contains only whitespaces, or does not contain | ||||
|  * an initial substring that has the expected syntax for a | ||||
|  * floating-point number, no conversion is performed. In this case, | ||||
|  * returns a value of zero and the value returned in tail is the value | ||||
|  * of numstr. | ||||
|  * | ||||
|  * @param numstr a string representing a number, may contain one of | ||||
|  * the International System number postfixes, for example 'K', 'M', | ||||
|  * 'G'. If 'i' is appended after the postfix, powers of 2 are used | ||||
|  * instead of powers of 10. The 'B' postfix multiplies the value by | ||||
|  * 8, and can be appended after another postfix or used alone. This | ||||
|  * allows using for example 'KB', 'MiB', 'G' and 'B' as postfix. | ||||
|  * @param tail if non-NULL puts here the pointer to the char next | ||||
|  * after the last parsed character | ||||
|  */ | ||||
| double av_strtod(const char *numstr, char **tail); | ||||
| 
 | ||||
| #endif /* AVUTIL_EVAL_H */ | ||||
| @ -0,0 +1,5 @@ | ||||
| /* Automatically generated by version.sh, do not manually edit! */ | ||||
| #ifndef AVUTIL_FFVERSION_H | ||||
| #define AVUTIL_FFVERSION_H | ||||
| #define FFMPEG_VERSION "3.0.3" | ||||
| #endif /* AVUTIL_FFVERSION_H */ | ||||
| @ -0,0 +1,179 @@ | ||||
| /*
 | ||||
|  * 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 | ||||
|  * a very simple circular buffer FIFO implementation | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVUTIL_FIFO_H | ||||
| #define AVUTIL_FIFO_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include "avutil.h" | ||||
| #include "attributes.h" | ||||
| 
 | ||||
| typedef struct AVFifoBuffer { | ||||
|     uint8_t *buffer; | ||||
|     uint8_t *rptr, *wptr, *end; | ||||
|     uint32_t rndx, wndx; | ||||
| } AVFifoBuffer; | ||||
| 
 | ||||
| /**
 | ||||
|  * Initialize an AVFifoBuffer. | ||||
|  * @param size of FIFO | ||||
|  * @return AVFifoBuffer or NULL in case of memory allocation failure | ||||
|  */ | ||||
| AVFifoBuffer *av_fifo_alloc(unsigned int size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Initialize an AVFifoBuffer. | ||||
|  * @param nmemb number of elements | ||||
|  * @param size  size of the single element | ||||
|  * @return AVFifoBuffer or NULL in case of memory allocation failure | ||||
|  */ | ||||
| AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free an AVFifoBuffer. | ||||
|  * @param f AVFifoBuffer to free | ||||
|  */ | ||||
| void av_fifo_free(AVFifoBuffer *f); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free an AVFifoBuffer and reset pointer to NULL. | ||||
|  * @param f AVFifoBuffer to free | ||||
|  */ | ||||
| void av_fifo_freep(AVFifoBuffer **f); | ||||
| 
 | ||||
| /**
 | ||||
|  * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied. | ||||
|  * @param f AVFifoBuffer to reset | ||||
|  */ | ||||
| void av_fifo_reset(AVFifoBuffer *f); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the amount of data in bytes in the AVFifoBuffer, that is the | ||||
|  * amount of data you can read from it. | ||||
|  * @param f AVFifoBuffer to read from | ||||
|  * @return size | ||||
|  */ | ||||
| int av_fifo_size(const AVFifoBuffer *f); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the amount of space in bytes in the AVFifoBuffer, that is the | ||||
|  * amount of data you can write into it. | ||||
|  * @param f AVFifoBuffer to write into | ||||
|  * @return size | ||||
|  */ | ||||
| int av_fifo_space(const AVFifoBuffer *f); | ||||
| 
 | ||||
| /**
 | ||||
|  * Feed data at specific position from an AVFifoBuffer to a user-supplied callback. | ||||
|  * Similar as av_fifo_gereric_read but without discarding data. | ||||
|  * @param f AVFifoBuffer to read from | ||||
|  * @param offset offset from current read position | ||||
|  * @param buf_size number of bytes to read | ||||
|  * @param func generic read function | ||||
|  * @param dest data destination | ||||
|  */ | ||||
| int av_fifo_generic_peek_at(AVFifoBuffer *f, void *dest, int offset, int buf_size, void (*func)(void*, void*, int)); | ||||
| 
 | ||||
| /**
 | ||||
|  * Feed data from an AVFifoBuffer to a user-supplied callback. | ||||
|  * Similar as av_fifo_gereric_read but without discarding data. | ||||
|  * @param f AVFifoBuffer to read from | ||||
|  * @param buf_size number of bytes to read | ||||
|  * @param func generic read function | ||||
|  * @param dest data destination | ||||
|  */ | ||||
| int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); | ||||
| 
 | ||||
| /**
 | ||||
|  * Feed data from an AVFifoBuffer to a user-supplied callback. | ||||
|  * @param f AVFifoBuffer to read from | ||||
|  * @param buf_size number of bytes to read | ||||
|  * @param func generic read function | ||||
|  * @param dest data destination | ||||
|  */ | ||||
| int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); | ||||
| 
 | ||||
| /**
 | ||||
|  * Feed data from a user-supplied callback to an AVFifoBuffer. | ||||
|  * @param f AVFifoBuffer to write to | ||||
|  * @param src data source; non-const since it may be used as a | ||||
|  * modifiable context by the function defined in func | ||||
|  * @param size number of bytes to write | ||||
|  * @param func generic write function; the first parameter is src, | ||||
|  * the second is dest_buf, the third is dest_buf_size. | ||||
|  * func must return the number of bytes written to dest_buf, or <= 0 to | ||||
|  * indicate no more data available to write. | ||||
|  * If func is NULL, src is interpreted as a simple byte array for source data. | ||||
|  * @return the number of bytes written to the FIFO | ||||
|  */ | ||||
| int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)); | ||||
| 
 | ||||
| /**
 | ||||
|  * Resize an AVFifoBuffer. | ||||
|  * In case of reallocation failure, the old FIFO is kept unchanged. | ||||
|  * | ||||
|  * @param f AVFifoBuffer to resize | ||||
|  * @param size new AVFifoBuffer size in bytes | ||||
|  * @return <0 for failure, >=0 otherwise | ||||
|  */ | ||||
| int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Enlarge an AVFifoBuffer. | ||||
|  * In case of reallocation failure, the old FIFO is kept unchanged. | ||||
|  * The new fifo size may be larger than the requested size. | ||||
|  * | ||||
|  * @param f AVFifoBuffer to resize | ||||
|  * @param additional_space the amount of space in bytes to allocate in addition to av_fifo_size() | ||||
|  * @return <0 for failure, >=0 otherwise | ||||
|  */ | ||||
| int av_fifo_grow(AVFifoBuffer *f, unsigned int additional_space); | ||||
| 
 | ||||
| /**
 | ||||
|  * Read and discard the specified amount of data from an AVFifoBuffer. | ||||
|  * @param f AVFifoBuffer to read from | ||||
|  * @param size amount of data to read in bytes | ||||
|  */ | ||||
| void av_fifo_drain(AVFifoBuffer *f, int size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return a pointer to the data stored in a FIFO buffer at a certain offset. | ||||
|  * The FIFO buffer is not modified. | ||||
|  * | ||||
|  * @param f    AVFifoBuffer to peek at, f must be non-NULL | ||||
|  * @param offs an offset in bytes, its absolute value must be less | ||||
|  *             than the used buffer size or the returned pointer will | ||||
|  *             point outside to the buffer data. | ||||
|  *             The used buffer size can be checked with av_fifo_size(). | ||||
|  */ | ||||
| static inline uint8_t *av_fifo_peek2(const AVFifoBuffer *f, int offs) | ||||
| { | ||||
|     uint8_t *ptr = f->rptr + offs; | ||||
|     if (ptr >= f->end) | ||||
|         ptr = f->buffer + (ptr - f->end); | ||||
|     else if (ptr < f->buffer) | ||||
|         ptr = f->end - (f->buffer - ptr); | ||||
|     return ptr; | ||||
| } | ||||
| 
 | ||||
| #endif /* AVUTIL_FIFO_H */ | ||||
| @ -0,0 +1,68 @@ | ||||
| /*
 | ||||
|  * 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_FILE_H | ||||
| #define AVUTIL_FILE_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "avutil.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * Misc file utilities. | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Read the file with name filename, and put its content in a newly | ||||
|  * 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. | ||||
|  * The returned buffer must be released with av_file_unmap(). | ||||
|  * | ||||
|  * @param log_offset loglevel offset used for logging | ||||
|  * @param log_ctx context used for logging | ||||
|  * @return a non negative number in case of success, a negative value | ||||
|  * corresponding to an AVERROR error code in case of failure | ||||
|  */ | ||||
| av_warn_unused_result | ||||
| int av_file_map(const char *filename, uint8_t **bufptr, size_t *size, | ||||
|                 int log_offset, void *log_ctx); | ||||
| 
 | ||||
| /**
 | ||||
|  * Unmap or free the buffer bufptr created by av_file_map(). | ||||
|  * | ||||
|  * @param size size in bytes of bufptr, must be the same as returned | ||||
|  * by av_file_map() | ||||
|  */ | ||||
| void av_file_unmap(uint8_t *bufptr, size_t size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Wrapper to work around the lack of mkstemp() on mingw. | ||||
|  * Also, tries to create file in /tmp first, if possible. | ||||
|  * *prefix can be a character constant; *filename will be allocated internally. | ||||
|  * @return file descriptor of opened file (or negative value corresponding to an | ||||
|  * AVERROR code on error) | ||||
|  * and opened file name in **filename. | ||||
|  * @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. | ||||
|  */ | ||||
| int av_tempfile(const char *prefix, char **filename, int log_offset, void *log_ctx); | ||||
| 
 | ||||
| #endif /* AVUTIL_FILE_H */ | ||||
| @ -0,0 +1,723 @@ | ||||
| /*
 | ||||
|  * | ||||
|  * 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 | ||||
|  * @ingroup lavu_frame | ||||
|  * reference-counted frame API | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVUTIL_FRAME_H | ||||
| #define AVUTIL_FRAME_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "avutil.h" | ||||
| #include "buffer.h" | ||||
| #include "dict.h" | ||||
| #include "rational.h" | ||||
| #include "samplefmt.h" | ||||
| #include "pixfmt.h" | ||||
| #include "version.h" | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavu_frame AVFrame | ||||
|  * @ingroup lavu_data | ||||
|  * | ||||
|  * @{ | ||||
|  * AVFrame is an abstraction for reference-counted raw multimedia data. | ||||
|  */ | ||||
| 
 | ||||
| enum AVFrameSideDataType { | ||||
|     /**
 | ||||
|      * The data is the AVPanScan struct defined in libavcodec. | ||||
|      */ | ||||
|     AV_FRAME_DATA_PANSCAN, | ||||
|     /**
 | ||||
|      * ATSC A53 Part 4 Closed Captions. | ||||
|      * A53 CC bitstream is stored as uint8_t in AVFrameSideData.data. | ||||
|      * The number of bytes of CC data is AVFrameSideData.size. | ||||
|      */ | ||||
|     AV_FRAME_DATA_A53_CC, | ||||
|     /**
 | ||||
|      * Stereoscopic 3d metadata. | ||||
|      * The data is the AVStereo3D struct defined in libavutil/stereo3d.h. | ||||
|      */ | ||||
|     AV_FRAME_DATA_STEREO3D, | ||||
|     /**
 | ||||
|      * The data is the AVMatrixEncoding enum defined in libavutil/channel_layout.h. | ||||
|      */ | ||||
|     AV_FRAME_DATA_MATRIXENCODING, | ||||
|     /**
 | ||||
|      * Metadata relevant to a downmix procedure. | ||||
|      * The data is the AVDownmixInfo struct defined in libavutil/downmix_info.h. | ||||
|      */ | ||||
|     AV_FRAME_DATA_DOWNMIX_INFO, | ||||
|     /**
 | ||||
|      * ReplayGain information in the form of the AVReplayGain struct. | ||||
|      */ | ||||
|     AV_FRAME_DATA_REPLAYGAIN, | ||||
|     /**
 | ||||
|      * This side data contains a 3x3 transformation matrix describing an affine | ||||
|      * transformation that needs to be applied to the frame for correct | ||||
|      * presentation. | ||||
|      * | ||||
|      * See libavutil/display.h for a detailed description of the data. | ||||
|      */ | ||||
|     AV_FRAME_DATA_DISPLAYMATRIX, | ||||
|     /**
 | ||||
|      * Active Format Description data consisting of a single byte as specified | ||||
|      * in ETSI TS 101 154 using AVActiveFormatDescription enum. | ||||
|      */ | ||||
|     AV_FRAME_DATA_AFD, | ||||
|     /**
 | ||||
|      * Motion vectors exported by some codecs (on demand through the export_mvs | ||||
|      * flag set in the libavcodec AVCodecContext flags2 option). | ||||
|      * The data is the AVMotionVector struct defined in | ||||
|      * libavutil/motion_vector.h. | ||||
|      */ | ||||
|     AV_FRAME_DATA_MOTION_VECTORS, | ||||
|     /**
 | ||||
|      * Recommmends skipping the specified number of samples. This is exported | ||||
|      * only if the "skip_manual" AVOption is set in libavcodec. | ||||
|      * This has the same format as AV_PKT_DATA_SKIP_SAMPLES. | ||||
|      * @code | ||||
|      * u32le number of samples to skip from start of this packet | ||||
|      * u32le number of samples to skip from end of this packet | ||||
|      * u8    reason for start skip | ||||
|      * u8    reason for end   skip (0=padding silence, 1=convergence) | ||||
|      * @endcode | ||||
|      */ | ||||
|     AV_FRAME_DATA_SKIP_SAMPLES, | ||||
|     /**
 | ||||
|      * This side data must be associated with an audio frame and corresponds to | ||||
|      * enum AVAudioServiceType defined in avcodec.h. | ||||
|      */ | ||||
|     AV_FRAME_DATA_AUDIO_SERVICE_TYPE, | ||||
|     /**
 | ||||
|      * Mastering display metadata associated with a video frame. The payload is | ||||
|      * an AVMasteringDisplayMetadata type and contains information about the | ||||
|      * mastering display color volume. | ||||
|      */ | ||||
|     AV_FRAME_DATA_MASTERING_DISPLAY_METADATA, | ||||
|     /**
 | ||||
|      * The GOP timecode in 25 bit timecode format. Data format is 64-bit integer. | ||||
|      * This is set on the first frame of a GOP that has a temporal reference of 0. | ||||
|      */ | ||||
|     AV_FRAME_DATA_GOP_TIMECODE | ||||
| }; | ||||
| 
 | ||||
| enum AVActiveFormatDescription { | ||||
|     AV_AFD_SAME         = 8, | ||||
|     AV_AFD_4_3          = 9, | ||||
|     AV_AFD_16_9         = 10, | ||||
|     AV_AFD_14_9         = 11, | ||||
|     AV_AFD_4_3_SP_14_9  = 13, | ||||
|     AV_AFD_16_9_SP_14_9 = 14, | ||||
|     AV_AFD_SP_4_3       = 15, | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * Structure to hold side data for an AVFrame. | ||||
|  * | ||||
|  * sizeof(AVFrameSideData) is not a part of the public ABI, so new fields may be added | ||||
|  * to the end with a minor bump. | ||||
|  */ | ||||
| typedef struct AVFrameSideData { | ||||
|     enum AVFrameSideDataType type; | ||||
|     uint8_t *data; | ||||
|     int      size; | ||||
|     AVDictionary *metadata; | ||||
|     AVBufferRef *buf; | ||||
| } AVFrameSideData; | ||||
| 
 | ||||
| /**
 | ||||
|  * This structure describes decoded (raw) audio or video data. | ||||
|  * | ||||
|  * AVFrame must be allocated using av_frame_alloc(). Note that this only | ||||
|  * allocates the AVFrame itself, the buffers for the data must be managed | ||||
|  * through other means (see below). | ||||
|  * AVFrame must be freed with av_frame_free(). | ||||
|  * | ||||
|  * AVFrame is typically allocated once and then reused multiple times to hold | ||||
|  * different data (e.g. a single AVFrame to hold frames received from a | ||||
|  * decoder). In such a case, av_frame_unref() will free any references held by | ||||
|  * the frame and reset it to its original clean state before it | ||||
|  * is reused again. | ||||
|  * | ||||
|  * The data described by an AVFrame is usually reference counted through the | ||||
|  * AVBuffer API. The underlying buffer references are stored in AVFrame.buf / | ||||
|  * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at | ||||
|  * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case, | ||||
|  * every single data plane must be contained in one of the buffers in | ||||
|  * AVFrame.buf or AVFrame.extended_buf. | ||||
|  * There may be a single buffer for all the data, or one separate buffer for | ||||
|  * each plane, or anything in between. | ||||
|  * | ||||
|  * 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. | ||||
|  */ | ||||
| typedef struct AVFrame { | ||||
| #define AV_NUM_DATA_POINTERS 8 | ||||
|     /**
 | ||||
|      * pointer to the picture/channel planes. | ||||
|      * This might be different from the first allocated byte | ||||
|      * | ||||
|      * Some decoders access areas outside 0,0 - width,height, please | ||||
|      * 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. | ||||
|      */ | ||||
|     uint8_t *data[AV_NUM_DATA_POINTERS]; | ||||
| 
 | ||||
|     /**
 | ||||
|      * For video, size in bytes of each picture line. | ||||
|      * For audio, size in bytes of each plane. | ||||
|      * | ||||
|      * For audio, only linesize[0] may be set. For planar audio, each channel | ||||
|      * plane must be the same size. | ||||
|      * | ||||
|      * For video the linesizes should be multiples of the CPUs alignment | ||||
|      * preference, this is 16 or 32 for modern desktop CPUs. | ||||
|      * Some code requires such alignment other code can be slower without | ||||
|      * correct alignment, for yet other it makes no difference. | ||||
|      * | ||||
|      * @note The linesize may be larger than the size of usable data -- there | ||||
|      * may be extra padding present for performance reasons. | ||||
|      */ | ||||
|     int linesize[AV_NUM_DATA_POINTERS]; | ||||
| 
 | ||||
|     /**
 | ||||
|      * pointers to the data planes/channels. | ||||
|      * | ||||
|      * For video, this should simply point to data[]. | ||||
|      * | ||||
|      * For planar audio, each channel has a separate data pointer, and | ||||
|      * linesize[0] contains the size of each channel buffer. | ||||
|      * For packed audio, there is just one data pointer, and linesize[0] | ||||
|      * contains the total size of the buffer for all channels. | ||||
|      * | ||||
|      * Note: Both data and extended_data should always be set in a valid frame, | ||||
|      * but for planar audio with more channels that can fit in data, | ||||
|      * extended_data must be used in order to access all channels. | ||||
|      */ | ||||
|     uint8_t **extended_data; | ||||
| 
 | ||||
|     /**
 | ||||
|      * width and height of the video frame | ||||
|      */ | ||||
|     int width, height; | ||||
| 
 | ||||
|     /**
 | ||||
|      * number of audio samples (per channel) described by this frame | ||||
|      */ | ||||
|     int nb_samples; | ||||
| 
 | ||||
|     /**
 | ||||
|      * format of the frame, -1 if unknown or unset | ||||
|      * Values correspond to enum AVPixelFormat for video frames, | ||||
|      * enum AVSampleFormat for audio) | ||||
|      */ | ||||
|     int format; | ||||
| 
 | ||||
|     /**
 | ||||
|      * 1 -> keyframe, 0-> not | ||||
|      */ | ||||
|     int key_frame; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Picture type of the frame. | ||||
|      */ | ||||
|     enum AVPictureType pict_type; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified. | ||||
|      */ | ||||
|     AVRational sample_aspect_ratio; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Presentation timestamp in time_base units (time when frame should be shown to user). | ||||
|      */ | ||||
|     int64_t pts; | ||||
| 
 | ||||
|     /**
 | ||||
|      * PTS copied from the AVPacket that was decoded to produce this frame. | ||||
|      */ | ||||
|     int64_t pkt_pts; | ||||
| 
 | ||||
|     /**
 | ||||
|      * DTS copied from the AVPacket that triggered returning this frame. (if frame threading isn't used) | ||||
|      * This is also the Presentation time of this AVFrame calculated from | ||||
|      * only AVPacket.dts values without pts values. | ||||
|      */ | ||||
|     int64_t pkt_dts; | ||||
| 
 | ||||
|     /**
 | ||||
|      * picture number in bitstream order | ||||
|      */ | ||||
|     int coded_picture_number; | ||||
|     /**
 | ||||
|      * picture number in display order | ||||
|      */ | ||||
|     int display_picture_number; | ||||
| 
 | ||||
|     /**
 | ||||
|      * quality (between 1 (good) and FF_LAMBDA_MAX (bad)) | ||||
|      */ | ||||
|     int quality; | ||||
| 
 | ||||
|     /**
 | ||||
|      * for some private data of the user | ||||
|      */ | ||||
|     void *opaque; | ||||
| 
 | ||||
| #if FF_API_ERROR_FRAME | ||||
|     /**
 | ||||
|      * @deprecated unused | ||||
|      */ | ||||
|     attribute_deprecated | ||||
|     uint64_t error[AV_NUM_DATA_POINTERS]; | ||||
| #endif | ||||
| 
 | ||||
|     /**
 | ||||
|      * When decoding, this signals how much the picture must be delayed. | ||||
|      * extra_delay = repeat_pict / (2*fps) | ||||
|      */ | ||||
|     int repeat_pict; | ||||
| 
 | ||||
|     /**
 | ||||
|      * The content of the picture is interlaced. | ||||
|      */ | ||||
|     int interlaced_frame; | ||||
| 
 | ||||
|     /**
 | ||||
|      * If the content is interlaced, is top field displayed first. | ||||
|      */ | ||||
|     int top_field_first; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Tell user application that palette has changed from previous frame. | ||||
|      */ | ||||
|     int palette_has_changed; | ||||
| 
 | ||||
|     /**
 | ||||
|      * reordered opaque 64bit (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; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Sample rate of the audio data. | ||||
|      */ | ||||
|     int sample_rate; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Channel layout of the audio data. | ||||
|      */ | ||||
|     uint64_t channel_layout; | ||||
| 
 | ||||
|     /**
 | ||||
|      * AVBuffer references backing the data for this frame. If all elements of | ||||
|      * this array are NULL, then this frame is not reference counted. This array | ||||
|      * must be filled contiguously -- if buf[i] is non-NULL then buf[j] must | ||||
|      * also be non-NULL for all j < i. | ||||
|      * | ||||
|      * There may be at most one AVBuffer per data plane, so for video this array | ||||
|      * always contains all the references. For planar audio with more than | ||||
|      * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in | ||||
|      * this array. Then the extra AVBufferRef pointers are stored in the | ||||
|      * extended_buf array. | ||||
|      */ | ||||
|     AVBufferRef *buf[AV_NUM_DATA_POINTERS]; | ||||
| 
 | ||||
|     /**
 | ||||
|      * For planar audio which requires more than AV_NUM_DATA_POINTERS | ||||
|      * AVBufferRef pointers, this array will hold all the references which | ||||
|      * cannot fit into AVFrame.buf. | ||||
|      * | ||||
|      * Note that this is different from AVFrame.extended_data, which always | ||||
|      * contains all the pointers. This array only contains the extra pointers, | ||||
|      * which cannot fit into AVFrame.buf. | ||||
|      * | ||||
|      * This array is always allocated using av_malloc() by whoever constructs | ||||
|      * the frame. It is freed in av_frame_unref(). | ||||
|      */ | ||||
|     AVBufferRef **extended_buf; | ||||
|     /**
 | ||||
|      * Number of elements in extended_buf. | ||||
|      */ | ||||
|     int        nb_extended_buf; | ||||
| 
 | ||||
|     AVFrameSideData **side_data; | ||||
|     int            nb_side_data; | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavu_frame_flags AV_FRAME_FLAGS | ||||
|  * Flags describing additional frame properties. | ||||
|  * | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * The frame data may be corrupted, e.g. due to decoding errors. | ||||
|  */ | ||||
| #define AV_FRAME_FLAG_CORRUPT       (1 << 0) | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
|     /**
 | ||||
|      * Frame flags, a combination of @ref lavu_frame_flags | ||||
|      */ | ||||
|     int flags; | ||||
| 
 | ||||
|     /**
 | ||||
|      * 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 | ||||
|      */ | ||||
|     enum AVColorRange color_range; | ||||
| 
 | ||||
|     enum AVColorPrimaries color_primaries; | ||||
| 
 | ||||
|     enum AVColorTransferCharacteristic color_trc; | ||||
| 
 | ||||
|     /**
 | ||||
|      * 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 | ||||
|      */ | ||||
|     enum AVColorSpace colorspace; | ||||
| 
 | ||||
|     enum AVChromaLocation chroma_location; | ||||
| 
 | ||||
|     /**
 | ||||
|      * 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. | ||||
|      */ | ||||
|     int64_t best_effort_timestamp; | ||||
| 
 | ||||
|     /**
 | ||||
|      * 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. | ||||
|      */ | ||||
|     int64_t pkt_pos; | ||||
| 
 | ||||
|     /**
 | ||||
|      * 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. | ||||
|      */ | ||||
|     int64_t pkt_duration; | ||||
| 
 | ||||
|     /**
 | ||||
|      * metadata. | ||||
|      * Code outside libavutil should access this field using: | ||||
|      * av_frame_get_metadata(frame) | ||||
|      * - encoding: Set by user. | ||||
|      * - decoding: Set by libavcodec. | ||||
|      */ | ||||
|     AVDictionary *metadata; | ||||
| 
 | ||||
|     /**
 | ||||
|      * 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 | ||||
| 
 | ||||
|     /**
 | ||||
|      * 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. | ||||
|      */ | ||||
|     int channels; | ||||
| 
 | ||||
|     /**
 | ||||
|      * 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(). | ||||
|      * It is set to a negative value if unknown. | ||||
|      * - encoding: unused | ||||
|      * - decoding: set by libavcodec, read by user. | ||||
|      */ | ||||
|     int pkt_size; | ||||
| 
 | ||||
| #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; | ||||
| 
 | ||||
|     attribute_deprecated | ||||
|     int qscale_type; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Not to be accessed directly from outside libavutil | ||||
|      */ | ||||
|     AVBufferRef *qp_table_buf; | ||||
| #endif | ||||
| } AVFrame; | ||||
| 
 | ||||
| /**
 | ||||
|  * 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. | ||||
|  */ | ||||
| int64_t av_frame_get_best_effort_timestamp(const AVFrame *frame); | ||||
| void    av_frame_set_best_effort_timestamp(AVFrame *frame, int64_t val); | ||||
| int64_t av_frame_get_pkt_duration         (const AVFrame *frame); | ||||
| void    av_frame_set_pkt_duration         (AVFrame *frame, int64_t val); | ||||
| int64_t av_frame_get_pkt_pos              (const AVFrame *frame); | ||||
| void    av_frame_set_pkt_pos              (AVFrame *frame, int64_t val); | ||||
| int64_t av_frame_get_channel_layout       (const AVFrame *frame); | ||||
| void    av_frame_set_channel_layout       (AVFrame *frame, int64_t val); | ||||
| int     av_frame_get_channels             (const AVFrame *frame); | ||||
| void    av_frame_set_channels             (AVFrame *frame, int     val); | ||||
| int     av_frame_get_sample_rate          (const AVFrame *frame); | ||||
| void    av_frame_set_sample_rate          (AVFrame *frame, int     val); | ||||
| AVDictionary *av_frame_get_metadata       (const AVFrame *frame); | ||||
| void          av_frame_set_metadata       (AVFrame *frame, AVDictionary *val); | ||||
| int     av_frame_get_decode_error_flags   (const AVFrame *frame); | ||||
| void    av_frame_set_decode_error_flags   (AVFrame *frame, int     val); | ||||
| int     av_frame_get_pkt_size(const AVFrame *frame); | ||||
| void    av_frame_set_pkt_size(AVFrame *frame, int val); | ||||
| AVDictionary **avpriv_frame_get_metadatap(AVFrame *frame); | ||||
| #if FF_API_FRAME_QP | ||||
| int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type); | ||||
| int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int type); | ||||
| #endif | ||||
| enum AVColorSpace av_frame_get_colorspace(const AVFrame *frame); | ||||
| void    av_frame_set_colorspace(AVFrame *frame, enum AVColorSpace val); | ||||
| enum AVColorRange av_frame_get_color_range(const AVFrame *frame); | ||||
| void    av_frame_set_color_range(AVFrame *frame, enum AVColorRange val); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the name of a colorspace. | ||||
|  * @return a static string identifying the colorspace; can be NULL. | ||||
|  */ | ||||
| const char *av_get_colorspace_name(enum AVColorSpace val); | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate an AVFrame and set its fields to default values.  The resulting | ||||
|  * struct must be freed using av_frame_free(). | ||||
|  * | ||||
|  * @return An AVFrame filled with default values or NULL on failure. | ||||
|  * | ||||
|  * @note this only allocates the AVFrame itself, not the data buffers. Those | ||||
|  * must be allocated through other means, e.g. with av_frame_get_buffer() or | ||||
|  * manually. | ||||
|  */ | ||||
| AVFrame *av_frame_alloc(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free the frame and any dynamically allocated objects in it, | ||||
|  * e.g. extended_data. If the frame is reference counted, it will be | ||||
|  * unreferenced first. | ||||
|  * | ||||
|  * @param frame frame to be freed. The pointer will be set to NULL. | ||||
|  */ | ||||
| void av_frame_free(AVFrame **frame); | ||||
| 
 | ||||
| /**
 | ||||
|  * Set up a new reference to the data described by the source frame. | ||||
|  * | ||||
|  * Copy frame properties from src to dst and create a new reference for each | ||||
|  * AVBufferRef from src. | ||||
|  * | ||||
|  * If src is not reference counted, new buffers are allocated and the data is | ||||
|  * copied. | ||||
|  * | ||||
|  * @return 0 on success, a negative AVERROR on error | ||||
|  */ | ||||
| int av_frame_ref(AVFrame *dst, const AVFrame *src); | ||||
| 
 | ||||
| /**
 | ||||
|  * Create a new frame that references the same data as src. | ||||
|  * | ||||
|  * This is a shortcut for av_frame_alloc()+av_frame_ref(). | ||||
|  * | ||||
|  * @return newly created AVFrame on success, NULL on error. | ||||
|  */ | ||||
| AVFrame *av_frame_clone(const AVFrame *src); | ||||
| 
 | ||||
| /**
 | ||||
|  * Unreference all the buffers referenced by frame and reset the frame fields. | ||||
|  */ | ||||
| void av_frame_unref(AVFrame *frame); | ||||
| 
 | ||||
| /**
 | ||||
|  * Move everything contained in src to dst and reset src. | ||||
|  */ | ||||
| void av_frame_move_ref(AVFrame *dst, AVFrame *src); | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate new buffer(s) for audio or video data. | ||||
|  * | ||||
|  * The following fields must be set on frame before calling this function: | ||||
|  * - format (pixel format for video, sample format for audio) | ||||
|  * - width and height for video | ||||
|  * - nb_samples and channel_layout for audio | ||||
|  * | ||||
|  * This function will fill AVFrame.data and AVFrame.buf arrays and, if | ||||
|  * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf. | ||||
|  * For planar formats, one buffer will be allocated for each plane. | ||||
|  * | ||||
|  * @param frame frame in which to store the new buffers. | ||||
|  * @param align required buffer size alignment | ||||
|  * | ||||
|  * @return 0 on success, a negative AVERROR on error. | ||||
|  */ | ||||
| int av_frame_get_buffer(AVFrame *frame, int align); | ||||
| 
 | ||||
| /**
 | ||||
|  * Check if the frame data is writable. | ||||
|  * | ||||
|  * @return A positive value if the frame data is writable (which is true if and | ||||
|  * only if each of the underlying buffers has only one reference, namely the one | ||||
|  * stored in this frame). Return 0 otherwise. | ||||
|  * | ||||
|  * If 1 is returned the answer is valid until av_buffer_ref() is called on any | ||||
|  * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly). | ||||
|  * | ||||
|  * @see av_frame_make_writable(), av_buffer_is_writable() | ||||
|  */ | ||||
| int av_frame_is_writable(AVFrame *frame); | ||||
| 
 | ||||
| /**
 | ||||
|  * Ensure that the frame data is writable, avoiding data copy if possible. | ||||
|  * | ||||
|  * Do nothing if the frame is writable, allocate new buffers and copy the data | ||||
|  * if it is not. | ||||
|  * | ||||
|  * @return 0 on success, a negative AVERROR on error. | ||||
|  * | ||||
|  * @see av_frame_is_writable(), av_buffer_is_writable(), | ||||
|  * av_buffer_make_writable() | ||||
|  */ | ||||
| int av_frame_make_writable(AVFrame *frame); | ||||
| 
 | ||||
| /**
 | ||||
|  * Copy the frame data from src to dst. | ||||
|  * | ||||
|  * This function does not allocate anything, dst must be already initialized and | ||||
|  * allocated with the same parameters as src. | ||||
|  * | ||||
|  * This function only copies the frame data (i.e. the contents of the data / | ||||
|  * extended data arrays), not any other properties. | ||||
|  * | ||||
|  * @return >= 0 on success, a negative AVERROR on error. | ||||
|  */ | ||||
| int av_frame_copy(AVFrame *dst, const AVFrame *src); | ||||
| 
 | ||||
| /**
 | ||||
|  * Copy only "metadata" fields from src to dst. | ||||
|  * | ||||
|  * Metadata for the purpose of this function are those fields that do not affect | ||||
|  * the data layout in the buffers.  E.g. pts, sample rate (for audio) or sample | ||||
|  * aspect ratio (for video), but not width/height or channel layout. | ||||
|  * Side data is also copied. | ||||
|  */ | ||||
| int av_frame_copy_props(AVFrame *dst, const AVFrame *src); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the buffer reference a given data plane is stored in. | ||||
|  * | ||||
|  * @param plane index of the data plane of interest in frame->extended_data. | ||||
|  * | ||||
|  * @return the buffer reference that contains the plane or NULL if the input | ||||
|  * frame is not valid. | ||||
|  */ | ||||
| AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane); | ||||
| 
 | ||||
| /**
 | ||||
|  * Add a new side data to a frame. | ||||
|  * | ||||
|  * @param frame a frame to which the side data should be added | ||||
|  * @param type type of the added side data | ||||
|  * @param size size of the side data | ||||
|  * | ||||
|  * @return newly added side data on success, NULL on error | ||||
|  */ | ||||
| AVFrameSideData *av_frame_new_side_data(AVFrame *frame, | ||||
|                                         enum AVFrameSideDataType type, | ||||
|                                         int size); | ||||
| 
 | ||||
| /**
 | ||||
|  * @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. | ||||
|  */ | ||||
| AVFrameSideData *av_frame_get_side_data(const AVFrame *frame, | ||||
|                                         enum AVFrameSideDataType type); | ||||
| 
 | ||||
| /**
 | ||||
|  * If side data of the supplied type exists in the frame, free it and remove it | ||||
|  * from the frame. | ||||
|  */ | ||||
| void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type); | ||||
| 
 | ||||
| /**
 | ||||
|  * @return a string identifying the side data type | ||||
|  */ | ||||
| const char *av_frame_side_data_name(enum AVFrameSideDataType type); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_FRAME_H */ | ||||
| @ -0,0 +1,112 @@ | ||||
| /*
 | ||||
|  * Copyright (C) 2013 Reimar Döffinger <Reimar.Doeffinger@gmx.de> | ||||
|  * | ||||
|  * 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_HASH_H | ||||
| #define AVUTIL_HASH_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| 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(). | ||||
|  */ | ||||
| int av_hash_alloc(struct AVHashContext **ctx, const char *name); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the names of available hash algorithms. | ||||
|  * | ||||
|  * 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 | ||||
|  */ | ||||
| const char *av_hash_names(int i); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the name of the algorithm corresponding to the given hash context. | ||||
|  */ | ||||
| const char *av_hash_get_name(const struct AVHashContext *ctx); | ||||
| 
 | ||||
| /**
 | ||||
|  * 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. | ||||
|  */ | ||||
| #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. | ||||
|  */ | ||||
| int av_hash_get_size(const struct AVHashContext *ctx); | ||||
| 
 | ||||
| /**
 | ||||
|  * Initialize or reset a hash context. | ||||
|  */ | ||||
| void av_hash_init(struct AVHashContext *ctx); | ||||
| 
 | ||||
| /**
 | ||||
|  * Update a hash context with additional data. | ||||
|  */ | ||||
| void av_hash_update(struct AVHashContext *ctx, const uint8_t *src, int len); | ||||
| 
 | ||||
| /**
 | ||||
|  * Finalize a hash context and compute the actual hash value. | ||||
|  */ | ||||
| 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. | ||||
|  */ | ||||
| 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. | ||||
|  * The string is always 0-terminated. | ||||
|  * If size is smaller than 2 * hash_size + 1, the hex string is truncated. | ||||
|  */ | ||||
| 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. | ||||
|  * The string is always 0-terminated. | ||||
|  * If size is smaller than AV_BASE64_SIZE(hash_size), the base64 string is | ||||
|  * truncated. | ||||
|  */ | ||||
| void av_hash_final_b64(struct AVHashContext *ctx, uint8_t *dst, int size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free hash context. | ||||
|  */ | ||||
| void av_hash_freep(struct AVHashContext **ctx); | ||||
| 
 | ||||
| #endif /* AVUTIL_HASH_H */ | ||||
| @ -0,0 +1,100 @@ | ||||
| /*
 | ||||
|  * Copyright (C) 2012 Martin Storsjo | ||||
|  * | ||||
|  * 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_HMAC_H | ||||
| #define AVUTIL_HMAC_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "version.h" | ||||
| /**
 | ||||
|  * @defgroup lavu_hmac HMAC | ||||
|  * @ingroup lavu_crypto | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| enum AVHMACType { | ||||
|     AV_HMAC_MD5, | ||||
|     AV_HMAC_SHA1, | ||||
|     AV_HMAC_SHA224, | ||||
|     AV_HMAC_SHA256, | ||||
|     AV_HMAC_SHA384 = 12, | ||||
|     AV_HMAC_SHA512, | ||||
| }; | ||||
| 
 | ||||
| typedef struct AVHMAC AVHMAC; | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate an AVHMAC context. | ||||
|  * @param type The hash function used for the HMAC. | ||||
|  */ | ||||
| AVHMAC *av_hmac_alloc(enum AVHMACType type); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free an AVHMAC context. | ||||
|  * @param ctx The context to free, may be NULL | ||||
|  */ | ||||
| void av_hmac_free(AVHMAC *ctx); | ||||
| 
 | ||||
| /**
 | ||||
|  * Initialize an AVHMAC context with an authentication key. | ||||
|  * @param ctx    The HMAC context | ||||
|  * @param key    The authentication key | ||||
|  * @param keylen The length of the key, in bytes | ||||
|  */ | ||||
| void av_hmac_init(AVHMAC *ctx, const uint8_t *key, unsigned int keylen); | ||||
| 
 | ||||
| /**
 | ||||
|  * Hash data with the HMAC. | ||||
|  * @param ctx  The HMAC context | ||||
|  * @param data The data to hash | ||||
|  * @param len  The length of the data, in bytes | ||||
|  */ | ||||
| void av_hmac_update(AVHMAC *ctx, const uint8_t *data, unsigned int len); | ||||
| 
 | ||||
| /**
 | ||||
|  * Finish hashing and output the HMAC digest. | ||||
|  * @param ctx    The HMAC context | ||||
|  * @param out    The output buffer to write the digest into | ||||
|  * @param outlen The length of the out buffer, in bytes | ||||
|  * @return       The number of bytes written to out, or a negative error code. | ||||
|  */ | ||||
| int av_hmac_final(AVHMAC *ctx, uint8_t *out, unsigned int outlen); | ||||
| 
 | ||||
| /**
 | ||||
|  * Hash an array of data with a key. | ||||
|  * @param ctx    The HMAC context | ||||
|  * @param data   The data to hash | ||||
|  * @param len    The length of the data, in bytes | ||||
|  * @param key    The authentication key | ||||
|  * @param keylen The length of the key, in bytes | ||||
|  * @param out    The output buffer to write the digest into | ||||
|  * @param outlen The length of the out buffer, in bytes | ||||
|  * @return       The number of bytes written to out, or a negative error code. | ||||
|  */ | ||||
| int av_hmac_calc(AVHMAC *ctx, const uint8_t *data, unsigned int len, | ||||
|                  const uint8_t *key, unsigned int keylen, | ||||
|                  uint8_t *out, unsigned int outlen); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_HMAC_H */ | ||||
| @ -0,0 +1,213 @@ | ||||
| /*
 | ||||
|  * 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_IMGUTILS_H | ||||
| #define AVUTIL_IMGUTILS_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @file | ||||
|  * misc image utilities | ||||
|  * | ||||
|  * @addtogroup lavu_picture | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| #include "avutil.h" | ||||
| #include "pixdesc.h" | ||||
| #include "rational.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * Compute the max pixel step for each plane of an image with a | ||||
|  * format described by pixdesc. | ||||
|  * | ||||
|  * The pixel step is the distance in bytes between the first byte of | ||||
|  * the group of bytes which describe a pixel component and the first | ||||
|  * byte of the successive group in the same plane for the same | ||||
|  * component. | ||||
|  * | ||||
|  * @param max_pixsteps an array which is filled with the max pixel step | ||||
|  * for each plane. Since a plane may contain different pixel | ||||
|  * components, the computed max_pixsteps[plane] is relative to the | ||||
|  * component in the plane with the max pixel step. | ||||
|  * @param max_pixstep_comps an array which is filled with the component | ||||
|  * for each plane which has the max pixel step. May be NULL. | ||||
|  */ | ||||
| void av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4], | ||||
|                                 const AVPixFmtDescriptor *pixdesc); | ||||
| 
 | ||||
| /**
 | ||||
|  * Compute the size of an image line with format pix_fmt and width | ||||
|  * width for the plane plane. | ||||
|  * | ||||
|  * @return the computed size in bytes | ||||
|  */ | ||||
| int av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int plane); | ||||
| 
 | ||||
| /**
 | ||||
|  * Fill plane linesizes for an image with pixel format pix_fmt and | ||||
|  * width width. | ||||
|  * | ||||
|  * @param linesizes array to be filled with the linesize for each plane | ||||
|  * @return >= 0 in case of success, a negative error code otherwise | ||||
|  */ | ||||
| int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width); | ||||
| 
 | ||||
| /**
 | ||||
|  * Fill plane data pointers for an image with pixel format pix_fmt and | ||||
|  * height height. | ||||
|  * | ||||
|  * @param data pointers array to be filled with the pointer for each image plane | ||||
|  * @param ptr the pointer to a buffer which will contain the image | ||||
|  * @param linesizes the array containing the linesize for each | ||||
|  * plane, should be filled by av_image_fill_linesizes() | ||||
|  * @return the size in bytes required for the image buffer, a negative | ||||
|  * error code in case of failure | ||||
|  */ | ||||
| int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int height, | ||||
|                            uint8_t *ptr, const int linesizes[4]); | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate an image with size w and h and pixel format pix_fmt, and | ||||
|  * fill pointers and linesizes accordingly. | ||||
|  * The allocated image buffer has to be freed by using | ||||
|  * av_freep(&pointers[0]). | ||||
|  * | ||||
|  * @param align the value to use for buffer size alignment | ||||
|  * @return the size in bytes required for the image buffer, a negative | ||||
|  * error code in case of failure | ||||
|  */ | ||||
| int av_image_alloc(uint8_t *pointers[4], int linesizes[4], | ||||
|                    int w, int h, enum AVPixelFormat pix_fmt, int align); | ||||
| 
 | ||||
| /**
 | ||||
|  * Copy image plane from src to dst. | ||||
|  * That is, copy "height" number of lines of "bytewidth" bytes each. | ||||
|  * The first byte of each successive line is separated by *_linesize | ||||
|  * bytes. | ||||
|  * | ||||
|  * bytewidth must be contained by both absolute values of dst_linesize | ||||
|  * and src_linesize, otherwise the function behavior is undefined. | ||||
|  * | ||||
|  * @param dst_linesize linesize for the image plane in dst | ||||
|  * @param src_linesize linesize for the image plane in src | ||||
|  */ | ||||
| void av_image_copy_plane(uint8_t       *dst, int dst_linesize, | ||||
|                          const uint8_t *src, int src_linesize, | ||||
|                          int bytewidth, int height); | ||||
| 
 | ||||
| /**
 | ||||
|  * Copy image in src_data to dst_data. | ||||
|  * | ||||
|  * @param dst_linesizes linesizes for the image in dst_data | ||||
|  * @param src_linesizes linesizes for the image in src_data | ||||
|  */ | ||||
| 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); | ||||
| 
 | ||||
| /**
 | ||||
|  * Setup the data pointers and linesizes based on the specified image | ||||
|  * parameters and the provided array. | ||||
|  * | ||||
|  * The fields of the given image are filled in by using the src | ||||
|  * address which points to the image data buffer. Depending on the | ||||
|  * specified pixel format, one or multiple image data pointers and | ||||
|  * line sizes will be set.  If a planar format is specified, several | ||||
|  * pointers will be set pointing to the different picture planes and | ||||
|  * the line sizes of the different planes will be stored in the | ||||
|  * lines_sizes array. Call with src == NULL to get the required | ||||
|  * size for the src buffer. | ||||
|  * | ||||
|  * To allocate the buffer and fill in the dst_data and dst_linesize in | ||||
|  * 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 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 | ||||
|  * @param height        the height of the image in pixels | ||||
|  * @param align         the value used in src for linesize alignment | ||||
|  * @return the size in bytes required for src, a negative error code | ||||
|  * in case of failure | ||||
|  */ | ||||
| int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4], | ||||
|                          const uint8_t *src, | ||||
|                          enum AVPixelFormat pix_fmt, int width, int height, int align); | ||||
| 
 | ||||
| /**
 | ||||
|  * 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 | ||||
|  */ | ||||
| int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align); | ||||
| 
 | ||||
| /**
 | ||||
|  * Copy image data from an image into a buffer. | ||||
|  * | ||||
|  * av_image_get_buffer_size() can be used to compute the required size | ||||
|  * for the buffer to fill. | ||||
|  * | ||||
|  * @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 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 | ||||
|  * @param align         the assumed linesize alignment for dst | ||||
|  * @return the number of bytes written to dst, or a negative value | ||||
|  * (error code) on error | ||||
|  */ | ||||
| int av_image_copy_to_buffer(uint8_t *dst, int dst_size, | ||||
|                             const uint8_t * const src_data[4], const int src_linesize[4], | ||||
|                             enum AVPixelFormat pix_fmt, int width, int height, int align); | ||||
| 
 | ||||
| /**
 | ||||
|  * Check if the given dimension of an image is valid, meaning that all | ||||
|  * bytes of the image can be addressed with a signed int. | ||||
|  * | ||||
|  * @param w the width of the picture | ||||
|  * @param h the height of the picture | ||||
|  * @param 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_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx); | ||||
| 
 | ||||
| /**
 | ||||
|  * Check if the given sample aspect ratio of an image is valid. | ||||
|  * | ||||
|  * It is considered invalid if the denominator is 0 or if applying the ratio | ||||
|  * to the image size would make the smaller dimension less than 1. If the | ||||
|  * sar numerator is 0, it is considered unknown and will return as valid. | ||||
|  * | ||||
|  * @param w width of the image | ||||
|  * @param h height of the image | ||||
|  * @param sar sample aspect ratio of the image | ||||
|  * @return 0 if valid, a negative AVERROR code otherwise | ||||
|  */ | ||||
| int av_image_check_sar(unsigned int w, unsigned int h, AVRational sar); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| #endif /* AVUTIL_IMGUTILS_H */ | ||||
| @ -0,0 +1,345 @@ | ||||
| /*
 | ||||
|  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | ||||
|  * | ||||
|  * 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 | ||||
|  * common internal API header | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVUTIL_INTERNAL_H | ||||
| #define AVUTIL_INTERNAL_H | ||||
| 
 | ||||
| #if !defined(DEBUG) && !defined(NDEBUG) | ||||
| #    define NDEBUG | ||||
| #endif | ||||
| 
 | ||||
| #include <limits.h> | ||||
| #include <stdint.h> | ||||
| #include <stddef.h> | ||||
| #include <assert.h> | ||||
| #include "config.h" | ||||
| #include "attributes.h" | ||||
| #include "timer.h" | ||||
| #include "cpu.h" | ||||
| #include "dict.h" | ||||
| #include "macros.h" | ||||
| #include "pixfmt.h" | ||||
| #include "version.h" | ||||
| 
 | ||||
| #if ARCH_X86 | ||||
| #   include "x86/emms.h" | ||||
| #endif | ||||
| 
 | ||||
| #ifndef emms_c | ||||
| #   define emms_c() while(0) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef attribute_align_arg | ||||
| #if ARCH_X86_32 && AV_GCC_VERSION_AT_LEAST(4,2) | ||||
| #    define attribute_align_arg __attribute__((force_align_arg_pointer)) | ||||
| #else | ||||
| #    define attribute_align_arg | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if defined(_MSC_VER) && CONFIG_SHARED | ||||
| #    define av_export __declspec(dllimport) | ||||
| #else | ||||
| #    define av_export | ||||
| #endif | ||||
| 
 | ||||
| #if HAVE_PRAGMA_DEPRECATED | ||||
| #    if defined(__ICL) || defined (__INTEL_COMPILER) | ||||
| #        define FF_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:1478)) | ||||
| #        define FF_ENABLE_DEPRECATION_WARNINGS  __pragma(warning(pop)) | ||||
| #    elif defined(_MSC_VER) | ||||
| #        define FF_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:4996)) | ||||
| #        define FF_ENABLE_DEPRECATION_WARNINGS  __pragma(warning(pop)) | ||||
| #    else | ||||
| #        define FF_DISABLE_DEPRECATION_WARNINGS _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") | ||||
| #        define FF_ENABLE_DEPRECATION_WARNINGS  _Pragma("GCC diagnostic warning \"-Wdeprecated-declarations\"") | ||||
| #    endif | ||||
| #else | ||||
| #    define FF_DISABLE_DEPRECATION_WARNINGS | ||||
| #    define FF_ENABLE_DEPRECATION_WARNINGS | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| #define FF_MEMORY_POISON 0x2a | ||||
| 
 | ||||
| #define MAKE_ACCESSORS(str, name, type, field) \ | ||||
|     type av_##name##_get_##field(const str *s) { return s->field; } \
 | ||||
|     void av_##name##_set_##field(str *s, type v) { s->field = v; } | ||||
| 
 | ||||
| // Some broken preprocessors need a second expansion
 | ||||
| // to be forced to tokenize __VA_ARGS__
 | ||||
| #define E1(x) x | ||||
| 
 | ||||
| /* Check if the hard coded offset of a struct member still matches reality.
 | ||||
|  * Induce a compilation failure if not. | ||||
|  */ | ||||
| #define AV_CHECK_OFFSET(s, m, o) struct check_##o {    \ | ||||
|         int x_##o[offsetof(s, m) == o? 1: -1];         \
 | ||||
|     } | ||||
| 
 | ||||
| #define LOCAL_ALIGNED_A(a, t, v, s, o, ...)             \ | ||||
|     uint8_t la_##v[sizeof(t s o) + (a)];                \
 | ||||
|     t (*v) o = (void *)FFALIGN((uintptr_t)la_##v, a) | ||||
| 
 | ||||
| #define LOCAL_ALIGNED_D(a, t, v, s, o, ...)             \ | ||||
|     DECLARE_ALIGNED(a, t, la_##v) s o;                  \
 | ||||
|     t (*v) o = la_##v | ||||
| 
 | ||||
| #define LOCAL_ALIGNED(a, t, v, ...) E1(LOCAL_ALIGNED_A(a, t, v, __VA_ARGS__,,)) | ||||
| 
 | ||||
| #if HAVE_LOCAL_ALIGNED_8 | ||||
| #   define LOCAL_ALIGNED_8(t, v, ...) E1(LOCAL_ALIGNED_D(8, t, v, __VA_ARGS__,,)) | ||||
| #else | ||||
| #   define LOCAL_ALIGNED_8(t, v, ...) LOCAL_ALIGNED(8, t, v, __VA_ARGS__) | ||||
| #endif | ||||
| 
 | ||||
| #if HAVE_LOCAL_ALIGNED_16 | ||||
| #   define LOCAL_ALIGNED_16(t, v, ...) E1(LOCAL_ALIGNED_D(16, t, v, __VA_ARGS__,,)) | ||||
| #else | ||||
| #   define LOCAL_ALIGNED_16(t, v, ...) LOCAL_ALIGNED(16, t, v, __VA_ARGS__) | ||||
| #endif | ||||
| 
 | ||||
| #if HAVE_LOCAL_ALIGNED_32 | ||||
| #   define LOCAL_ALIGNED_32(t, v, ...) E1(LOCAL_ALIGNED_D(32, t, v, __VA_ARGS__,,)) | ||||
| #else | ||||
| #   define LOCAL_ALIGNED_32(t, v, ...) LOCAL_ALIGNED(32, t, v, __VA_ARGS__) | ||||
| #endif | ||||
| 
 | ||||
| #define FF_ALLOC_OR_GOTO(ctx, p, size, label)\ | ||||
| {\
 | ||||
|     p = av_malloc(size);\
 | ||||
|     if (!(p) && (size) != 0) {\
 | ||||
|         av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\
 | ||||
|         goto label;\
 | ||||
|     }\
 | ||||
| } | ||||
| 
 | ||||
| #define FF_ALLOCZ_OR_GOTO(ctx, p, size, label)\ | ||||
| {\
 | ||||
|     p = av_mallocz(size);\
 | ||||
|     if (!(p) && (size) != 0) {\
 | ||||
|         av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\
 | ||||
|         goto label;\
 | ||||
|     }\
 | ||||
| } | ||||
| 
 | ||||
| #define FF_ALLOC_ARRAY_OR_GOTO(ctx, p, nelem, elsize, label)\ | ||||
| {\
 | ||||
|     p = av_malloc_array(nelem, elsize);\
 | ||||
|     if (!p) {\
 | ||||
|         av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\
 | ||||
|         goto label;\
 | ||||
|     }\
 | ||||
| } | ||||
| 
 | ||||
| #define FF_ALLOCZ_ARRAY_OR_GOTO(ctx, p, nelem, elsize, label)\ | ||||
| {\
 | ||||
|     p = av_mallocz_array(nelem, elsize);\
 | ||||
|     if (!p) {\
 | ||||
|         av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\
 | ||||
|         goto label;\
 | ||||
|     }\
 | ||||
| } | ||||
| 
 | ||||
| #include "libm.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * Return NULL if CONFIG_SMALL is true, otherwise the argument | ||||
|  * without modification. Used to disable the definition of strings | ||||
|  * (for example AVCodec long_names). | ||||
|  */ | ||||
| #if CONFIG_SMALL | ||||
| #   define NULL_IF_CONFIG_SMALL(x) NULL | ||||
| #else | ||||
| #   define NULL_IF_CONFIG_SMALL(x) x | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * Define a function with only the non-default version specified. | ||||
|  * | ||||
|  * On systems with ELF shared libraries, all symbols exported from | ||||
|  * FFmpeg libraries are tagged with the name and major version of the | ||||
|  * library to which they belong.  If a function is moved from one | ||||
|  * library to another, a wrapper must be retained in the original | ||||
|  * location to preserve binary compatibility. | ||||
|  * | ||||
|  * Functions defined with this macro will never be used to resolve | ||||
|  * symbols by the build-time linker. | ||||
|  * | ||||
|  * @param type return type of function | ||||
|  * @param name name of function | ||||
|  * @param args argument list of function | ||||
|  * @param ver  version tag to assign function | ||||
|  */ | ||||
| #if HAVE_SYMVER_ASM_LABEL | ||||
| #   define FF_SYMVER(type, name, args, ver)                     \ | ||||
|     type ff_##name args __asm__ (EXTERN_PREFIX #name "@" ver);  \
 | ||||
|     type ff_##name args | ||||
| #elif HAVE_SYMVER_GNU_ASM | ||||
| #   define FF_SYMVER(type, name, args, ver)                             \ | ||||
|     __asm__ (".symver ff_" #name "," EXTERN_PREFIX #name "@" ver);      \
 | ||||
|     type ff_##name args;                                                \
 | ||||
|     type ff_##name args | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * Return NULL if a threading library has not been enabled. | ||||
|  * Used to disable threading functions in AVCodec definitions | ||||
|  * when not needed. | ||||
|  */ | ||||
| #if HAVE_THREADS | ||||
| #   define ONLY_IF_THREADS_ENABLED(x) x | ||||
| #else | ||||
| #   define ONLY_IF_THREADS_ENABLED(x) NULL | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * Log a generic warning message about a missing feature. | ||||
|  * | ||||
|  * @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 the name of the missing feature | ||||
|  */ | ||||
| void avpriv_report_missing_feature(void *avc, | ||||
|                                    const char *msg, ...) av_printf_format(2, 3); | ||||
| 
 | ||||
| /**
 | ||||
|  * Log a generic warning message about a missing feature. | ||||
|  * Additionally request that a sample showcasing the feature be uploaded. | ||||
|  * | ||||
|  * @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 the name of the missing feature | ||||
|  */ | ||||
| void avpriv_request_sample(void *avc, | ||||
|                            const char *msg, ...) av_printf_format(2, 3); | ||||
| 
 | ||||
| #if HAVE_LIBC_MSVCRT | ||||
| #include <crtversion.h> | ||||
| #if defined(_VC_CRT_MAJOR_VERSION) && _VC_CRT_MAJOR_VERSION < 14 | ||||
| #pragma comment(linker, "/include:" EXTERN_PREFIX "avpriv_strtod") | ||||
| #pragma comment(linker, "/include:" EXTERN_PREFIX "avpriv_snprintf") | ||||
| #endif | ||||
| 
 | ||||
| #define avpriv_open ff_open | ||||
| #define avpriv_tempfile ff_tempfile | ||||
| #define PTRDIFF_SPECIFIER "Id" | ||||
| #define SIZE_SPECIFIER "Iu" | ||||
| #else | ||||
| #define PTRDIFF_SPECIFIER "td" | ||||
| #define SIZE_SPECIFIER "zu" | ||||
| #endif | ||||
| 
 | ||||
| #ifdef DEBUG | ||||
| #   define ff_dlog(ctx, ...) av_log(ctx, AV_LOG_DEBUG, __VA_ARGS__) | ||||
| #else | ||||
| #   define ff_dlog(ctx, ...) do { if (0) av_log(ctx, AV_LOG_DEBUG, __VA_ARGS__); } while (0) | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * Clip and convert a double value into the long long amin-amax range. | ||||
|  * This function is needed because conversion of floating point to integers when | ||||
|  * it does not fit in the integer's representation does not necessarily saturate | ||||
|  * correctly (usually converted to a cvttsd2si on x86) which saturates numbers | ||||
|  * > INT64_MAX to INT64_MIN. The standard marks such conversions as undefined | ||||
|  * behavior, allowing this sort of mathematically bogus conversions. This provides | ||||
|  * a safe alternative that is slower obviously but assures safety and better | ||||
|  * mathematical behavior. | ||||
|  * @param a value to clip | ||||
|  * @param amin minimum value of the clip range | ||||
|  * @param amax maximum value of the clip range | ||||
|  * @return clipped value | ||||
|  */ | ||||
| static av_always_inline av_const int64_t ff_rint64_clip(double a, int64_t amin, int64_t amax) | ||||
| { | ||||
|     int64_t res; | ||||
| #if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 | ||||
|     if (amin > amax) abort(); | ||||
| #endif | ||||
|     // INT64_MAX+1,INT64_MIN are exactly representable as IEEE doubles
 | ||||
|     // do range checks first
 | ||||
|     if (a >=  9223372036854775808.0) | ||||
|         return amax; | ||||
|     if (a <= -9223372036854775808.0) | ||||
|         return amin; | ||||
| 
 | ||||
|     // safe to call llrint and clip accordingly
 | ||||
|     res = llrint(a); | ||||
|     if (res > amax) | ||||
|         return amax; | ||||
|     if (res < amin) | ||||
|         return amin; | ||||
|     return res; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * A wrapper for open() setting O_CLOEXEC. | ||||
|  */ | ||||
| av_warn_unused_result | ||||
| int avpriv_open(const char *filename, int flags, ...); | ||||
| 
 | ||||
| /**
 | ||||
|  * Wrapper to work around the lack of mkstemp() on mingw. | ||||
|  * Also, tries to create file in /tmp first, if possible. | ||||
|  * *prefix can be a character constant; *filename will be allocated internally. | ||||
|  * @return file descriptor of opened file (or negative value corresponding to an | ||||
|  * AVERROR code on error) | ||||
|  * and opened file name in **filename. | ||||
|  * @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. | ||||
|  */ | ||||
| int avpriv_tempfile(const char *prefix, char **filename, int log_offset, void *log_ctx); | ||||
| 
 | ||||
| int avpriv_set_systematic_pal2(uint32_t pal[256], enum AVPixelFormat pix_fmt); | ||||
| 
 | ||||
| static av_always_inline av_const int avpriv_mirror(int x, int w) | ||||
| { | ||||
|     if (!w) | ||||
|         return 0; | ||||
| 
 | ||||
|     while ((unsigned)x > (unsigned)w) { | ||||
|         x = -x; | ||||
|         if (x < 0) | ||||
|             x += 2 * w; | ||||
|     } | ||||
|     return x; | ||||
| } | ||||
| 
 | ||||
| void ff_check_pixfmt_descriptors(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Set a dictionary value to an ISO-8601 compliant timestamp string. | ||||
|  * | ||||
|  * @param s AVFormatContext | ||||
|  * @param key metadata key | ||||
|  * @param timestamp unix timestamp in microseconds | ||||
|  * @return <0 on error | ||||
|  */ | ||||
| int avpriv_dict_set_timestamp(AVDictionary **dict, const char *key, int64_t timestamp); | ||||
| 
 | ||||
| extern const uint8_t ff_reverse[256]; | ||||
| 
 | ||||
| #endif /* AVUTIL_INTERNAL_H */ | ||||
| @ -0,0 +1,77 @@ | ||||
| /*
 | ||||
|  * Copyright (c) 2011 Mans Rullgard | ||||
|  * | ||||
|  * 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_INTFLOAT_H | ||||
| #define AVUTIL_INTFLOAT_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include "attributes.h" | ||||
| 
 | ||||
| union av_intfloat32 { | ||||
|     uint32_t i; | ||||
|     float    f; | ||||
| }; | ||||
| 
 | ||||
| union av_intfloat64 { | ||||
|     uint64_t i; | ||||
|     double   f; | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Reinterpret a 32-bit integer as a float. | ||||
|  */ | ||||
| static av_always_inline float av_int2float(uint32_t i) | ||||
| { | ||||
|     union av_intfloat32 v; | ||||
|     v.i = i; | ||||
|     return v.f; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Reinterpret a float as a 32-bit integer. | ||||
|  */ | ||||
| static av_always_inline uint32_t av_float2int(float f) | ||||
| { | ||||
|     union av_intfloat32 v; | ||||
|     v.f = f; | ||||
|     return v.i; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Reinterpret a 64-bit integer as a double. | ||||
|  */ | ||||
| static av_always_inline double av_int2double(uint64_t i) | ||||
| { | ||||
|     union av_intfloat64 v; | ||||
|     v.i = i; | ||||
|     return v.f; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Reinterpret a double as a 64-bit integer. | ||||
|  */ | ||||
| static av_always_inline uint64_t av_double2int(double f) | ||||
| { | ||||
|     union av_intfloat64 v; | ||||
|     v.f = f; | ||||
|     return v.i; | ||||
| } | ||||
| 
 | ||||
| #endif /* AVUTIL_INTFLOAT_H */ | ||||
| @ -0,0 +1,629 @@ | ||||
| /*
 | ||||
|  * 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_INTREADWRITE_H | ||||
| #define AVUTIL_INTREADWRITE_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include "libavutil/avconfig.h" | ||||
| #include "attributes.h" | ||||
| #include "bswap.h" | ||||
| 
 | ||||
| typedef union { | ||||
|     uint64_t u64; | ||||
|     uint32_t u32[2]; | ||||
|     uint16_t u16[4]; | ||||
|     uint8_t  u8 [8]; | ||||
|     double   f64; | ||||
|     float    f32[2]; | ||||
| } av_alias av_alias64; | ||||
| 
 | ||||
| typedef union { | ||||
|     uint32_t u32; | ||||
|     uint16_t u16[2]; | ||||
|     uint8_t  u8 [4]; | ||||
|     float    f32; | ||||
| } av_alias av_alias32; | ||||
| 
 | ||||
| typedef union { | ||||
|     uint16_t u16; | ||||
|     uint8_t  u8 [2]; | ||||
| } av_alias av_alias16; | ||||
| 
 | ||||
| /*
 | ||||
|  * Arch-specific headers can provide any combination of | ||||
|  * AV_[RW][BLN](16|24|32|48|64) and AV_(COPY|SWAP|ZERO)(64|128) macros. | ||||
|  * Preprocessor symbols must be defined, even if these are implemented | ||||
|  * as inline functions. | ||||
|  * | ||||
|  * R/W means read/write, B/L/N means big/little/native endianness. | ||||
|  * The following macros require aligned access, compared to their | ||||
|  * unaligned variants: AV_(COPY|SWAP|ZERO)(64|128), AV_[RW]N[8-64]A. | ||||
|  * Incorrect usage may range from abysmal performance to crash | ||||
|  * depending on the platform. | ||||
|  * | ||||
|  * The unaligned variants are AV_[RW][BLN][8-64] and AV_COPY*U. | ||||
|  */ | ||||
| 
 | ||||
| #ifdef HAVE_AV_CONFIG_H | ||||
| 
 | ||||
| #include "config.h" | ||||
| 
 | ||||
| #if   ARCH_ARM | ||||
| #   include "arm/intreadwrite.h" | ||||
| #elif ARCH_AVR32 | ||||
| #   include "avr32/intreadwrite.h" | ||||
| #elif ARCH_MIPS | ||||
| #   include "mips/intreadwrite.h" | ||||
| #elif ARCH_PPC | ||||
| #   include "ppc/intreadwrite.h" | ||||
| #elif ARCH_TOMI | ||||
| #   include "tomi/intreadwrite.h" | ||||
| #elif ARCH_X86 | ||||
| #   include "x86/intreadwrite.h" | ||||
| #endif | ||||
| 
 | ||||
| #endif /* HAVE_AV_CONFIG_H */ | ||||
| 
 | ||||
| /*
 | ||||
|  * Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers. | ||||
|  */ | ||||
| 
 | ||||
| #if AV_HAVE_BIGENDIAN | ||||
| 
 | ||||
| #   if    defined(AV_RN16) && !defined(AV_RB16) | ||||
| #       define AV_RB16(p) AV_RN16(p) | ||||
| #   elif !defined(AV_RN16) &&  defined(AV_RB16) | ||||
| #       define AV_RN16(p) AV_RB16(p) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_WN16) && !defined(AV_WB16) | ||||
| #       define AV_WB16(p, v) AV_WN16(p, v) | ||||
| #   elif !defined(AV_WN16) &&  defined(AV_WB16) | ||||
| #       define AV_WN16(p, v) AV_WB16(p, v) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_RN24) && !defined(AV_RB24) | ||||
| #       define AV_RB24(p) AV_RN24(p) | ||||
| #   elif !defined(AV_RN24) &&  defined(AV_RB24) | ||||
| #       define AV_RN24(p) AV_RB24(p) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_WN24) && !defined(AV_WB24) | ||||
| #       define AV_WB24(p, v) AV_WN24(p, v) | ||||
| #   elif !defined(AV_WN24) &&  defined(AV_WB24) | ||||
| #       define AV_WN24(p, v) AV_WB24(p, v) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_RN32) && !defined(AV_RB32) | ||||
| #       define AV_RB32(p) AV_RN32(p) | ||||
| #   elif !defined(AV_RN32) &&  defined(AV_RB32) | ||||
| #       define AV_RN32(p) AV_RB32(p) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_WN32) && !defined(AV_WB32) | ||||
| #       define AV_WB32(p, v) AV_WN32(p, v) | ||||
| #   elif !defined(AV_WN32) &&  defined(AV_WB32) | ||||
| #       define AV_WN32(p, v) AV_WB32(p, v) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_RN48) && !defined(AV_RB48) | ||||
| #       define AV_RB48(p) AV_RN48(p) | ||||
| #   elif !defined(AV_RN48) &&  defined(AV_RB48) | ||||
| #       define AV_RN48(p) AV_RB48(p) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_WN48) && !defined(AV_WB48) | ||||
| #       define AV_WB48(p, v) AV_WN48(p, v) | ||||
| #   elif !defined(AV_WN48) &&  defined(AV_WB48) | ||||
| #       define AV_WN48(p, v) AV_WB48(p, v) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_RN64) && !defined(AV_RB64) | ||||
| #       define AV_RB64(p) AV_RN64(p) | ||||
| #   elif !defined(AV_RN64) &&  defined(AV_RB64) | ||||
| #       define AV_RN64(p) AV_RB64(p) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_WN64) && !defined(AV_WB64) | ||||
| #       define AV_WB64(p, v) AV_WN64(p, v) | ||||
| #   elif !defined(AV_WN64) &&  defined(AV_WB64) | ||||
| #       define AV_WN64(p, v) AV_WB64(p, v) | ||||
| #   endif | ||||
| 
 | ||||
| #else /* AV_HAVE_BIGENDIAN */ | ||||
| 
 | ||||
| #   if    defined(AV_RN16) && !defined(AV_RL16) | ||||
| #       define AV_RL16(p) AV_RN16(p) | ||||
| #   elif !defined(AV_RN16) &&  defined(AV_RL16) | ||||
| #       define AV_RN16(p) AV_RL16(p) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_WN16) && !defined(AV_WL16) | ||||
| #       define AV_WL16(p, v) AV_WN16(p, v) | ||||
| #   elif !defined(AV_WN16) &&  defined(AV_WL16) | ||||
| #       define AV_WN16(p, v) AV_WL16(p, v) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_RN24) && !defined(AV_RL24) | ||||
| #       define AV_RL24(p) AV_RN24(p) | ||||
| #   elif !defined(AV_RN24) &&  defined(AV_RL24) | ||||
| #       define AV_RN24(p) AV_RL24(p) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_WN24) && !defined(AV_WL24) | ||||
| #       define AV_WL24(p, v) AV_WN24(p, v) | ||||
| #   elif !defined(AV_WN24) &&  defined(AV_WL24) | ||||
| #       define AV_WN24(p, v) AV_WL24(p, v) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_RN32) && !defined(AV_RL32) | ||||
| #       define AV_RL32(p) AV_RN32(p) | ||||
| #   elif !defined(AV_RN32) &&  defined(AV_RL32) | ||||
| #       define AV_RN32(p) AV_RL32(p) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_WN32) && !defined(AV_WL32) | ||||
| #       define AV_WL32(p, v) AV_WN32(p, v) | ||||
| #   elif !defined(AV_WN32) &&  defined(AV_WL32) | ||||
| #       define AV_WN32(p, v) AV_WL32(p, v) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_RN48) && !defined(AV_RL48) | ||||
| #       define AV_RL48(p) AV_RN48(p) | ||||
| #   elif !defined(AV_RN48) &&  defined(AV_RL48) | ||||
| #       define AV_RN48(p) AV_RL48(p) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_WN48) && !defined(AV_WL48) | ||||
| #       define AV_WL48(p, v) AV_WN48(p, v) | ||||
| #   elif !defined(AV_WN48) &&  defined(AV_WL48) | ||||
| #       define AV_WN48(p, v) AV_WL48(p, v) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_RN64) && !defined(AV_RL64) | ||||
| #       define AV_RL64(p) AV_RN64(p) | ||||
| #   elif !defined(AV_RN64) &&  defined(AV_RL64) | ||||
| #       define AV_RN64(p) AV_RL64(p) | ||||
| #   endif | ||||
| 
 | ||||
| #   if    defined(AV_WN64) && !defined(AV_WL64) | ||||
| #       define AV_WL64(p, v) AV_WN64(p, v) | ||||
| #   elif !defined(AV_WN64) &&  defined(AV_WL64) | ||||
| #       define AV_WN64(p, v) AV_WL64(p, v) | ||||
| #   endif | ||||
| 
 | ||||
| #endif /* !AV_HAVE_BIGENDIAN */ | ||||
| 
 | ||||
| /*
 | ||||
|  * Define AV_[RW]N helper macros to simplify definitions not provided | ||||
|  * by per-arch headers. | ||||
|  */ | ||||
| 
 | ||||
| #if defined(__GNUC__) && !defined(__TI_COMPILER_VERSION__) | ||||
| 
 | ||||
| union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias; | ||||
| union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias; | ||||
| 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) | ||||
| 
 | ||||
| #   define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) | ||||
| #   define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v)) | ||||
| 
 | ||||
| #elif AV_HAVE_FAST_UNALIGNED | ||||
| 
 | ||||
| #   define AV_RN(s, p) (((const av_alias##s*)(p))->u##s) | ||||
| #   define AV_WN(s, p, v) (((av_alias##s*)(p))->u##s = (v)) | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| #ifndef AV_RB16 | ||||
| #   define AV_RB16(x)                           \ | ||||
|     ((((const uint8_t*)(x))[0] << 8) |          \
 | ||||
|       ((const uint8_t*)(x))[1]) | ||||
| #endif | ||||
| #ifndef AV_WB16 | ||||
| #   define AV_WB16(p, darg) do {                \ | ||||
|         unsigned d = (darg);                    \
 | ||||
|         ((uint8_t*)(p))[1] = (d);               \
 | ||||
|         ((uint8_t*)(p))[0] = (d)>>8;            \
 | ||||
|     } while(0) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RL16 | ||||
| #   define AV_RL16(x)                           \ | ||||
|     ((((const uint8_t*)(x))[1] << 8) |          \
 | ||||
|       ((const uint8_t*)(x))[0]) | ||||
| #endif | ||||
| #ifndef AV_WL16 | ||||
| #   define AV_WL16(p, darg) do {                \ | ||||
|         unsigned d = (darg);                    \
 | ||||
|         ((uint8_t*)(p))[0] = (d);               \
 | ||||
|         ((uint8_t*)(p))[1] = (d)>>8;            \
 | ||||
|     } while(0) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RB32 | ||||
| #   define AV_RB32(x)                                \ | ||||
|     (((uint32_t)((const uint8_t*)(x))[0] << 24) |    \
 | ||||
|                (((const uint8_t*)(x))[1] << 16) |    \
 | ||||
|                (((const uint8_t*)(x))[2] <<  8) |    \
 | ||||
|                 ((const uint8_t*)(x))[3]) | ||||
| #endif | ||||
| #ifndef AV_WB32 | ||||
| #   define AV_WB32(p, darg) do {                \ | ||||
|         unsigned d = (darg);                    \
 | ||||
|         ((uint8_t*)(p))[3] = (d);               \
 | ||||
|         ((uint8_t*)(p))[2] = (d)>>8;            \
 | ||||
|         ((uint8_t*)(p))[1] = (d)>>16;           \
 | ||||
|         ((uint8_t*)(p))[0] = (d)>>24;           \
 | ||||
|     } while(0) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RL32 | ||||
| #   define AV_RL32(x)                                \ | ||||
|     (((uint32_t)((const uint8_t*)(x))[3] << 24) |    \
 | ||||
|                (((const uint8_t*)(x))[2] << 16) |    \
 | ||||
|                (((const uint8_t*)(x))[1] <<  8) |    \
 | ||||
|                 ((const uint8_t*)(x))[0]) | ||||
| #endif | ||||
| #ifndef AV_WL32 | ||||
| #   define AV_WL32(p, darg) do {                \ | ||||
|         unsigned d = (darg);                    \
 | ||||
|         ((uint8_t*)(p))[0] = (d);               \
 | ||||
|         ((uint8_t*)(p))[1] = (d)>>8;            \
 | ||||
|         ((uint8_t*)(p))[2] = (d)>>16;           \
 | ||||
|         ((uint8_t*)(p))[3] = (d)>>24;           \
 | ||||
|     } while(0) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RB64 | ||||
| #   define AV_RB64(x)                                   \ | ||||
|     (((uint64_t)((const uint8_t*)(x))[0] << 56) |       \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[1] << 48) |       \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[2] << 40) |       \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[3] << 32) |       \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[4] << 24) |       \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[5] << 16) |       \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[6] <<  8) |       \
 | ||||
|       (uint64_t)((const uint8_t*)(x))[7]) | ||||
| #endif | ||||
| #ifndef AV_WB64 | ||||
| #   define AV_WB64(p, darg) do {                \ | ||||
|         uint64_t d = (darg);                    \
 | ||||
|         ((uint8_t*)(p))[7] = (d);               \
 | ||||
|         ((uint8_t*)(p))[6] = (d)>>8;            \
 | ||||
|         ((uint8_t*)(p))[5] = (d)>>16;           \
 | ||||
|         ((uint8_t*)(p))[4] = (d)>>24;           \
 | ||||
|         ((uint8_t*)(p))[3] = (d)>>32;           \
 | ||||
|         ((uint8_t*)(p))[2] = (d)>>40;           \
 | ||||
|         ((uint8_t*)(p))[1] = (d)>>48;           \
 | ||||
|         ((uint8_t*)(p))[0] = (d)>>56;           \
 | ||||
|     } while(0) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RL64 | ||||
| #   define AV_RL64(x)                                   \ | ||||
|     (((uint64_t)((const uint8_t*)(x))[7] << 56) |       \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[6] << 48) |       \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[5] << 40) |       \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[4] << 32) |       \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[3] << 24) |       \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[2] << 16) |       \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[1] <<  8) |       \
 | ||||
|       (uint64_t)((const uint8_t*)(x))[0]) | ||||
| #endif | ||||
| #ifndef AV_WL64 | ||||
| #   define AV_WL64(p, darg) do {                \ | ||||
|         uint64_t d = (darg);                    \
 | ||||
|         ((uint8_t*)(p))[0] = (d);               \
 | ||||
|         ((uint8_t*)(p))[1] = (d)>>8;            \
 | ||||
|         ((uint8_t*)(p))[2] = (d)>>16;           \
 | ||||
|         ((uint8_t*)(p))[3] = (d)>>24;           \
 | ||||
|         ((uint8_t*)(p))[4] = (d)>>32;           \
 | ||||
|         ((uint8_t*)(p))[5] = (d)>>40;           \
 | ||||
|         ((uint8_t*)(p))[6] = (d)>>48;           \
 | ||||
|         ((uint8_t*)(p))[7] = (d)>>56;           \
 | ||||
|     } while(0) | ||||
| #endif | ||||
| 
 | ||||
| #if AV_HAVE_BIGENDIAN | ||||
| #   define AV_RN(s, p)    AV_RB##s(p) | ||||
| #   define AV_WN(s, p, v) AV_WB##s(p, v) | ||||
| #else | ||||
| #   define AV_RN(s, p)    AV_RL##s(p) | ||||
| #   define AV_WN(s, p, v) AV_WL##s(p, v) | ||||
| #endif | ||||
| 
 | ||||
| #endif /* HAVE_FAST_UNALIGNED */ | ||||
| 
 | ||||
| #ifndef AV_RN16 | ||||
| #   define AV_RN16(p) AV_RN(16, p) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RN32 | ||||
| #   define AV_RN32(p) AV_RN(32, p) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RN64 | ||||
| #   define AV_RN64(p) AV_RN(64, p) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_WN16 | ||||
| #   define AV_WN16(p, v) AV_WN(16, p, v) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_WN32 | ||||
| #   define AV_WN32(p, v) AV_WN(32, p, v) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_WN64 | ||||
| #   define AV_WN64(p, v) AV_WN(64, p, v) | ||||
| #endif | ||||
| 
 | ||||
| #if AV_HAVE_BIGENDIAN | ||||
| #   define AV_RB(s, p)    AV_RN##s(p) | ||||
| #   define AV_WB(s, p, v) AV_WN##s(p, v) | ||||
| #   define AV_RL(s, p)    av_bswap##s(AV_RN##s(p)) | ||||
| #   define AV_WL(s, p, v) AV_WN##s(p, av_bswap##s(v)) | ||||
| #else | ||||
| #   define AV_RB(s, p)    av_bswap##s(AV_RN##s(p)) | ||||
| #   define AV_WB(s, p, v) AV_WN##s(p, av_bswap##s(v)) | ||||
| #   define AV_RL(s, p)    AV_RN##s(p) | ||||
| #   define AV_WL(s, p, v) AV_WN##s(p, v) | ||||
| #endif | ||||
| 
 | ||||
| #define AV_RB8(x)     (((const uint8_t*)(x))[0]) | ||||
| #define AV_WB8(p, d)  do { ((uint8_t*)(p))[0] = (d); } while(0) | ||||
| 
 | ||||
| #define AV_RL8(x)     AV_RB8(x) | ||||
| #define AV_WL8(p, d)  AV_WB8(p, d) | ||||
| 
 | ||||
| #ifndef AV_RB16 | ||||
| #   define AV_RB16(p)    AV_RB(16, p) | ||||
| #endif | ||||
| #ifndef AV_WB16 | ||||
| #   define AV_WB16(p, v) AV_WB(16, p, v) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RL16 | ||||
| #   define AV_RL16(p)    AV_RL(16, p) | ||||
| #endif | ||||
| #ifndef AV_WL16 | ||||
| #   define AV_WL16(p, v) AV_WL(16, p, v) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RB32 | ||||
| #   define AV_RB32(p)    AV_RB(32, p) | ||||
| #endif | ||||
| #ifndef AV_WB32 | ||||
| #   define AV_WB32(p, v) AV_WB(32, p, v) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RL32 | ||||
| #   define AV_RL32(p)    AV_RL(32, p) | ||||
| #endif | ||||
| #ifndef AV_WL32 | ||||
| #   define AV_WL32(p, v) AV_WL(32, p, v) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RB64 | ||||
| #   define AV_RB64(p)    AV_RB(64, p) | ||||
| #endif | ||||
| #ifndef AV_WB64 | ||||
| #   define AV_WB64(p, v) AV_WB(64, p, v) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RL64 | ||||
| #   define AV_RL64(p)    AV_RL(64, p) | ||||
| #endif | ||||
| #ifndef AV_WL64 | ||||
| #   define AV_WL64(p, v) AV_WL(64, p, v) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RB24 | ||||
| #   define AV_RB24(x)                           \ | ||||
|     ((((const uint8_t*)(x))[0] << 16) |         \
 | ||||
|      (((const uint8_t*)(x))[1] <<  8) |         \
 | ||||
|       ((const uint8_t*)(x))[2]) | ||||
| #endif | ||||
| #ifndef AV_WB24 | ||||
| #   define AV_WB24(p, d) do {                   \ | ||||
|         ((uint8_t*)(p))[2] = (d);               \
 | ||||
|         ((uint8_t*)(p))[1] = (d)>>8;            \
 | ||||
|         ((uint8_t*)(p))[0] = (d)>>16;           \
 | ||||
|     } while(0) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RL24 | ||||
| #   define AV_RL24(x)                           \ | ||||
|     ((((const uint8_t*)(x))[2] << 16) |         \
 | ||||
|      (((const uint8_t*)(x))[1] <<  8) |         \
 | ||||
|       ((const uint8_t*)(x))[0]) | ||||
| #endif | ||||
| #ifndef AV_WL24 | ||||
| #   define AV_WL24(p, d) do {                   \ | ||||
|         ((uint8_t*)(p))[0] = (d);               \
 | ||||
|         ((uint8_t*)(p))[1] = (d)>>8;            \
 | ||||
|         ((uint8_t*)(p))[2] = (d)>>16;           \
 | ||||
|     } while(0) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RB48 | ||||
| #   define AV_RB48(x)                                     \ | ||||
|     (((uint64_t)((const uint8_t*)(x))[0] << 40) |         \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[1] << 32) |         \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[2] << 24) |         \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[3] << 16) |         \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[4] <<  8) |         \
 | ||||
|       (uint64_t)((const uint8_t*)(x))[5]) | ||||
| #endif | ||||
| #ifndef AV_WB48 | ||||
| #   define AV_WB48(p, darg) do {                \ | ||||
|         uint64_t d = (darg);                    \
 | ||||
|         ((uint8_t*)(p))[5] = (d);               \
 | ||||
|         ((uint8_t*)(p))[4] = (d)>>8;            \
 | ||||
|         ((uint8_t*)(p))[3] = (d)>>16;           \
 | ||||
|         ((uint8_t*)(p))[2] = (d)>>24;           \
 | ||||
|         ((uint8_t*)(p))[1] = (d)>>32;           \
 | ||||
|         ((uint8_t*)(p))[0] = (d)>>40;           \
 | ||||
|     } while(0) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RL48 | ||||
| #   define AV_RL48(x)                                     \ | ||||
|     (((uint64_t)((const uint8_t*)(x))[5] << 40) |         \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[4] << 32) |         \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[3] << 24) |         \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[2] << 16) |         \
 | ||||
|      ((uint64_t)((const uint8_t*)(x))[1] <<  8) |         \
 | ||||
|       (uint64_t)((const uint8_t*)(x))[0]) | ||||
| #endif | ||||
| #ifndef AV_WL48 | ||||
| #   define AV_WL48(p, darg) do {                \ | ||||
|         uint64_t d = (darg);                    \
 | ||||
|         ((uint8_t*)(p))[0] = (d);               \
 | ||||
|         ((uint8_t*)(p))[1] = (d)>>8;            \
 | ||||
|         ((uint8_t*)(p))[2] = (d)>>16;           \
 | ||||
|         ((uint8_t*)(p))[3] = (d)>>24;           \
 | ||||
|         ((uint8_t*)(p))[4] = (d)>>32;           \
 | ||||
|         ((uint8_t*)(p))[5] = (d)>>40;           \
 | ||||
|     } while(0) | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * The AV_[RW]NA macros access naturally aligned data | ||||
|  * in a type-safe way. | ||||
|  */ | ||||
| 
 | ||||
| #define AV_RNA(s, p)    (((const av_alias##s*)(p))->u##s) | ||||
| #define AV_WNA(s, p, v) (((av_alias##s*)(p))->u##s = (v)) | ||||
| 
 | ||||
| #ifndef AV_RN16A | ||||
| #   define AV_RN16A(p) AV_RNA(16, p) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RN32A | ||||
| #   define AV_RN32A(p) AV_RNA(32, p) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_RN64A | ||||
| #   define AV_RN64A(p) AV_RNA(64, p) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_WN16A | ||||
| #   define AV_WN16A(p, v) AV_WNA(16, p, v) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_WN32A | ||||
| #   define AV_WN32A(p, v) AV_WNA(32, p, v) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_WN64A | ||||
| #   define AV_WN64A(p, v) AV_WNA(64, p, v) | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * The AV_COPYxxU macros are suitable for copying data to/from unaligned | ||||
|  * memory locations. | ||||
|  */ | ||||
| 
 | ||||
| #define AV_COPYU(n, d, s) AV_WN##n(d, AV_RN##n(s)); | ||||
| 
 | ||||
| #ifndef AV_COPY16U | ||||
| #   define AV_COPY16U(d, s) AV_COPYU(16, d, s) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_COPY32U | ||||
| #   define AV_COPY32U(d, s) AV_COPYU(32, d, s) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_COPY64U | ||||
| #   define AV_COPY64U(d, s) AV_COPYU(64, d, s) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_COPY128U | ||||
| #   define AV_COPY128U(d, s)                                    \ | ||||
|     do {                                                        \
 | ||||
|         AV_COPY64U(d, s);                                       \
 | ||||
|         AV_COPY64U((char *)(d) + 8, (const char *)(s) + 8);     \
 | ||||
|     } while(0) | ||||
| #endif | ||||
| 
 | ||||
| /* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be
 | ||||
|  * naturally aligned. They may be implemented using MMX, | ||||
|  * so emms_c() must be called before using any float code | ||||
|  * afterwards. | ||||
|  */ | ||||
| 
 | ||||
| #define AV_COPY(n, d, s) \ | ||||
|     (((av_alias##n*)(d))->u##n = ((const av_alias##n*)(s))->u##n) | ||||
| 
 | ||||
| #ifndef AV_COPY16 | ||||
| #   define AV_COPY16(d, s) AV_COPY(16, d, s) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_COPY32 | ||||
| #   define AV_COPY32(d, s) AV_COPY(32, d, s) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_COPY64 | ||||
| #   define AV_COPY64(d, s) AV_COPY(64, d, s) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_COPY128 | ||||
| #   define AV_COPY128(d, s)                    \ | ||||
|     do {                                       \
 | ||||
|         AV_COPY64(d, s);                       \
 | ||||
|         AV_COPY64((char*)(d)+8, (char*)(s)+8); \
 | ||||
|     } while(0) | ||||
| #endif | ||||
| 
 | ||||
| #define AV_SWAP(n, a, b) FFSWAP(av_alias##n, *(av_alias##n*)(a), *(av_alias##n*)(b)) | ||||
| 
 | ||||
| #ifndef AV_SWAP64 | ||||
| #   define AV_SWAP64(a, b) AV_SWAP(64, a, b) | ||||
| #endif | ||||
| 
 | ||||
| #define AV_ZERO(n, d) (((av_alias##n*)(d))->u##n = 0) | ||||
| 
 | ||||
| #ifndef AV_ZERO16 | ||||
| #   define AV_ZERO16(d) AV_ZERO(16, d) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_ZERO32 | ||||
| #   define AV_ZERO32(d) AV_ZERO(32, d) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_ZERO64 | ||||
| #   define AV_ZERO64(d) AV_ZERO(64, d) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef AV_ZERO128 | ||||
| #   define AV_ZERO128(d)         \ | ||||
|     do {                         \
 | ||||
|         AV_ZERO64(d);            \
 | ||||
|         AV_ZERO64((char*)(d)+8); \
 | ||||
|     } while(0) | ||||
| #endif | ||||
| 
 | ||||
| #endif /* AVUTIL_INTREADWRITE_H */ | ||||
| @ -0,0 +1,62 @@ | ||||
| /*
 | ||||
|  * Lagged Fibonacci PRNG | ||||
|  * Copyright (c) 2008 Michael Niedermayer | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * FFmpeg is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with FFmpeg; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVUTIL_LFG_H | ||||
| #define AVUTIL_LFG_H | ||||
| 
 | ||||
| typedef struct AVLFG { | ||||
|     unsigned int state[64]; | ||||
|     int index; | ||||
| } AVLFG; | ||||
| 
 | ||||
| void av_lfg_init(AVLFG *c, unsigned int seed); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the next random unsigned 32-bit number using an ALFG. | ||||
|  * | ||||
|  * Please also consider a simple LCG like state= state*1664525+1013904223, | ||||
|  * 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]; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the next random unsigned 32-bit number using a MLFG. | ||||
|  * | ||||
|  * Please also consider av_lfg_get() above, it is faster. | ||||
|  */ | ||||
| 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; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the next two numbers generated by a Box-Muller Gaussian | ||||
|  * generator using the random numbers issued by lfg. | ||||
|  * | ||||
|  * @param out array where the two generated numbers are placed | ||||
|  */ | ||||
| void av_bmg_get(AVLFG *lfg, double out[2]); | ||||
| 
 | ||||
| #endif /* AVUTIL_LFG_H */ | ||||
| @ -0,0 +1,471 @@ | ||||
| /*
 | ||||
|  * erf function: Copyright (c) 2006 John Maddock | ||||
|  * 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 | ||||
|  * Replacements for frequently missing libm functions | ||||
|  */ | ||||
| 
 | ||||
| #ifndef AVUTIL_LIBM_H | ||||
| #define AVUTIL_LIBM_H | ||||
| 
 | ||||
| #include <math.h> | ||||
| #include "config.h" | ||||
| #include "attributes.h" | ||||
| #include "intfloat.h" | ||||
| #include "mathematics.h" | ||||
| 
 | ||||
| #if HAVE_MIPSFPU && HAVE_INLINE_ASM | ||||
| #include "libavutil/mips/libm_mips.h" | ||||
| #endif /* HAVE_MIPSFPU && HAVE_INLINE_ASM*/ | ||||
| 
 | ||||
| #if !HAVE_ATANF | ||||
| #undef atanf | ||||
| #define atanf(x) ((float)atan(x)) | ||||
| #endif /* HAVE_ATANF */ | ||||
| 
 | ||||
| #if !HAVE_ATAN2F | ||||
| #undef atan2f | ||||
| #define atan2f(y, x) ((float)atan2(y, x)) | ||||
| #endif /* HAVE_ATAN2F */ | ||||
| 
 | ||||
| #if !HAVE_POWF | ||||
| #undef powf | ||||
| #define powf(x, y) ((float)pow(x, y)) | ||||
| #endif /* HAVE_POWF */ | ||||
| 
 | ||||
| #if !HAVE_CBRT | ||||
| static av_always_inline double cbrt(double x) | ||||
| { | ||||
|     return x < 0 ? -pow(-x, 1.0 / 3.0) : pow(x, 1.0 / 3.0); | ||||
| } | ||||
| #endif /* HAVE_CBRT */ | ||||
| 
 | ||||
| #if !HAVE_CBRTF | ||||
| static av_always_inline float cbrtf(float x) | ||||
| { | ||||
|     return x < 0 ? -powf(-x, 1.0 / 3.0) : powf(x, 1.0 / 3.0); | ||||
| } | ||||
| #endif /* HAVE_CBRTF */ | ||||
| 
 | ||||
| #if !HAVE_COPYSIGN | ||||
| static av_always_inline double copysign(double x, double y) | ||||
| { | ||||
|     uint64_t vx = av_double2int(x); | ||||
|     uint64_t vy = av_double2int(y); | ||||
|     return av_int2double((vx & UINT64_C(0x7fffffffffffffff)) | (vy & UINT64_C(0x8000000000000000))); | ||||
| } | ||||
| #endif /* HAVE_COPYSIGN */ | ||||
| 
 | ||||
| #if !HAVE_COSF | ||||
| #undef cosf | ||||
| #define cosf(x) ((float)cos(x)) | ||||
| #endif /* HAVE_COSF */ | ||||
| 
 | ||||
| #if !HAVE_ERF | ||||
| static inline double ff_eval_poly(const double *coeff, int size, double x) { | ||||
|     double sum = coeff[size-1]; | ||||
|     int i; | ||||
|     for (i = size-2; i >= 0; --i) { | ||||
|         sum *= x; | ||||
|         sum += coeff[i]; | ||||
|     } | ||||
|     return sum; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * erf function | ||||
|  * Algorithm taken from the Boost project, source: | ||||
|  * http://www.boost.org/doc/libs/1_46_1/boost/math/special_functions/erf.hpp
 | ||||
|  * Use, modification and distribution are subject to the | ||||
|  * Boost Software License, Version 1.0 (see notice below). | ||||
|  * Boost Software License - Version 1.0 - August 17th, 2003 | ||||
| Permission is hereby granted, free of charge, to any person or organization | ||||
| obtaining a copy of the software and accompanying documentation covered by | ||||
| this license (the "Software") to use, reproduce, display, distribute, | ||||
| execute, and transmit the Software, and to prepare derivative works of the | ||||
| Software, and to permit third-parties to whom the Software is furnished to | ||||
| do so, all subject to the following: | ||||
| 
 | ||||
| The copyright notices in the Software and this entire statement, including | ||||
| the above license grant, this restriction and the following disclaimer, | ||||
| must be included in all copies of the Software, in whole or in part, and | ||||
| all derivative works of the Software, unless such copies or derivative | ||||
| works are solely in the form of machine-executable object code generated by | ||||
| a source language processor. | ||||
| 
 | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT | ||||
| SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE | ||||
| FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, | ||||
| ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||||
| DEALINGS IN THE SOFTWARE. | ||||
|  */ | ||||
| static inline double erf(double z) | ||||
| { | ||||
| #ifndef FF_ARRAY_ELEMS | ||||
| #define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0])) | ||||
| #endif | ||||
|     double result; | ||||
| 
 | ||||
|     /* handle the symmetry: erf(-x) = -erf(x) */ | ||||
|     if (z < 0) | ||||
|         return -erf(-z); | ||||
| 
 | ||||
|     /* branch based on range of z, and pick appropriate approximation */ | ||||
|     if (z == 0) | ||||
|         return 0; | ||||
|     else if (z < 1e-10) | ||||
|         return z * 1.125 + z * 0.003379167095512573896158903121545171688; | ||||
|     else if (z < 0.5) { | ||||
|         // Maximum Deviation Found:                     1.561e-17
 | ||||
|         // Expected Error Term:                         1.561e-17
 | ||||
|         // Maximum Relative Change in Control Points:   1.155e-04
 | ||||
|         // Max Error found at double precision =        2.961182e-17
 | ||||
| 
 | ||||
|         static const double y = 1.044948577880859375; | ||||
|         static const double p[] = { | ||||
|             0.0834305892146531832907, | ||||
|             -0.338165134459360935041, | ||||
|             -0.0509990735146777432841, | ||||
|             -0.00772758345802133288487, | ||||
|             -0.000322780120964605683831, | ||||
|         }; | ||||
|         static const double q[] = { | ||||
|             1, | ||||
|             0.455004033050794024546, | ||||
|             0.0875222600142252549554, | ||||
|             0.00858571925074406212772, | ||||
|             0.000370900071787748000569, | ||||
|         }; | ||||
|         double zz = z * z; | ||||
|         return z * (y + ff_eval_poly(p, FF_ARRAY_ELEMS(p), zz) / ff_eval_poly(q, FF_ARRAY_ELEMS(q), zz)); | ||||
|     } | ||||
|     /* here onwards compute erfc */ | ||||
|     else if (z < 1.5) { | ||||
|         // Maximum Deviation Found:                     3.702e-17
 | ||||
|         // Expected Error Term:                         3.702e-17
 | ||||
|         // Maximum Relative Change in Control Points:   2.845e-04
 | ||||
|         // Max Error found at double precision =        4.841816e-17
 | ||||
|         static const double y = 0.405935764312744140625; | ||||
|         static const double p[] = { | ||||
|             -0.098090592216281240205, | ||||
|             0.178114665841120341155, | ||||
|             0.191003695796775433986, | ||||
|             0.0888900368967884466578, | ||||
|             0.0195049001251218801359, | ||||
|             0.00180424538297014223957, | ||||
|         }; | ||||
|         static const double q[] = { | ||||
|             1, | ||||
|             1.84759070983002217845, | ||||
|             1.42628004845511324508, | ||||
|             0.578052804889902404909, | ||||
|             0.12385097467900864233, | ||||
|             0.0113385233577001411017, | ||||
|             0.337511472483094676155e-5, | ||||
|         }; | ||||
|         result = y + ff_eval_poly(p, FF_ARRAY_ELEMS(p), z - 0.5) / ff_eval_poly(q, FF_ARRAY_ELEMS(q), z - 0.5); | ||||
|         result *= exp(-z * z) / z; | ||||
|         return 1 - result; | ||||
|     } | ||||
|     else if (z < 2.5) { | ||||
|         // Max Error found at double precision =        6.599585e-18
 | ||||
|         // Maximum Deviation Found:                     3.909e-18
 | ||||
|         // Expected Error Term:                         3.909e-18
 | ||||
|         // Maximum Relative Change in Control Points:   9.886e-05
 | ||||
|         static const double y = 0.50672817230224609375; | ||||
|         static const double p[] = { | ||||
|             -0.0243500476207698441272, | ||||
|             0.0386540375035707201728, | ||||
|             0.04394818964209516296, | ||||
|             0.0175679436311802092299, | ||||
|             0.00323962406290842133584, | ||||
|             0.000235839115596880717416, | ||||
|         }; | ||||
|         static const double q[] = { | ||||
|             1, | ||||
|             1.53991494948552447182, | ||||
|             0.982403709157920235114, | ||||
|             0.325732924782444448493, | ||||
|             0.0563921837420478160373, | ||||
|             0.00410369723978904575884, | ||||
|         }; | ||||
|         result = y + ff_eval_poly(p, FF_ARRAY_ELEMS(p), z - 1.5) / ff_eval_poly(q, FF_ARRAY_ELEMS(q), z - 1.5); | ||||
|         result *= exp(-z * z) / z; | ||||
|         return 1 - result; | ||||
|     } | ||||
|     else if (z < 4.5) { | ||||
|         // Maximum Deviation Found:                     1.512e-17
 | ||||
|         // Expected Error Term:                         1.512e-17
 | ||||
|         // Maximum Relative Change in Control Points:   2.222e-04
 | ||||
|         // Max Error found at double precision =        2.062515e-17
 | ||||
|         static const double y = 0.5405750274658203125; | ||||
|         static const double p[] = { | ||||
|             0.00295276716530971662634, | ||||
|             0.0137384425896355332126, | ||||
|             0.00840807615555585383007, | ||||
|             0.00212825620914618649141, | ||||
|             0.000250269961544794627958, | ||||
|             0.113212406648847561139e-4, | ||||
|         }; | ||||
|         static const double q[] = { | ||||
|             1, | ||||
|             1.04217814166938418171, | ||||
|             0.442597659481563127003, | ||||
|             0.0958492726301061423444, | ||||
|             0.0105982906484876531489, | ||||
|             0.000479411269521714493907, | ||||
|         }; | ||||
|         result = y + ff_eval_poly(p, FF_ARRAY_ELEMS(p), z - 3.5) / ff_eval_poly(q, FF_ARRAY_ELEMS(q), z - 3.5); | ||||
|         result *= exp(-z * z) / z; | ||||
|         return 1 - result; | ||||
|     } | ||||
|     /* differ from Boost here, the claim of underflow of erfc(x) past 5.8 is
 | ||||
|      * slightly incorrect, change to 5.92 | ||||
|      * (really somewhere between 5.9125 and 5.925 is when it saturates) */ | ||||
|     else if (z < 5.92) { | ||||
|         // Max Error found at double precision =        2.997958e-17
 | ||||
|         // Maximum Deviation Found:                     2.860e-17
 | ||||
|         // Expected Error Term:                         2.859e-17
 | ||||
|         // Maximum Relative Change in Control Points:   1.357e-05
 | ||||
|         static const double y = 0.5579090118408203125; | ||||
|         static const double p[] = { | ||||
|             0.00628057170626964891937, | ||||
|             0.0175389834052493308818, | ||||
|             -0.212652252872804219852, | ||||
|             -0.687717681153649930619, | ||||
|             -2.5518551727311523996, | ||||
|             -3.22729451764143718517, | ||||
|             -2.8175401114513378771, | ||||
|         }; | ||||
|         static const double q[] = { | ||||
|             1, | ||||
|             2.79257750980575282228, | ||||
|             11.0567237927800161565, | ||||
|             15.930646027911794143, | ||||
|             22.9367376522880577224, | ||||
|             13.5064170191802889145, | ||||
|             5.48409182238641741584, | ||||
|         }; | ||||
|         result = y + ff_eval_poly(p, FF_ARRAY_ELEMS(p), 1 / z) / ff_eval_poly(q, FF_ARRAY_ELEMS(q), 1 / z); | ||||
|         result *= exp(-z * z) / z; | ||||
|         return 1 - result; | ||||
|     } | ||||
|     /* handle the nan case, but don't use isnan for max portability */ | ||||
|     else if (z != z) | ||||
|         return z; | ||||
|     /* finally return saturated result */ | ||||
|     else | ||||
|         return 1; | ||||
| } | ||||
| #endif /* HAVE_ERF */ | ||||
| 
 | ||||
| #if !HAVE_EXPF | ||||
| #undef expf | ||||
| #define expf(x) ((float)exp(x)) | ||||
| #endif /* HAVE_EXPF */ | ||||
| 
 | ||||
| #if !HAVE_EXP2 | ||||
| #undef exp2 | ||||
| #define exp2(x) exp((x) * M_LN2) | ||||
| #endif /* HAVE_EXP2 */ | ||||
| 
 | ||||
| #if !HAVE_EXP2F | ||||
| #undef exp2f | ||||
| #define exp2f(x) ((float)exp2(x)) | ||||
| #endif /* HAVE_EXP2F */ | ||||
| 
 | ||||
| #if !HAVE_ISINF | ||||
| #undef isinf | ||||
| /* Note: these do not follow the BSD/Apple/GNU convention of returning -1 for
 | ||||
| -Inf, +1 for Inf, 0 otherwise, but merely follow the POSIX/ISO mandated spec of | ||||
| returning a non-zero value for +/-Inf, 0 otherwise. */ | ||||
| static av_always_inline av_const int avpriv_isinff(float x) | ||||
| { | ||||
|     uint32_t v = av_float2int(x); | ||||
|     if ((v & 0x7f800000) != 0x7f800000) | ||||
|         return 0; | ||||
|     return !(v & 0x007fffff); | ||||
| } | ||||
| 
 | ||||
| static av_always_inline av_const int avpriv_isinf(double x) | ||||
| { | ||||
|     uint64_t v = av_double2int(x); | ||||
|     if ((v & 0x7ff0000000000000) != 0x7ff0000000000000) | ||||
|         return 0; | ||||
|     return !(v & 0x000fffffffffffff); | ||||
| } | ||||
| 
 | ||||
| #define isinf(x)                  \ | ||||
|     (sizeof(x) == sizeof(float)   \
 | ||||
|         ? avpriv_isinff(x)        \
 | ||||
|         : avpriv_isinf(x)) | ||||
| #endif /* HAVE_ISINF */ | ||||
| 
 | ||||
| #if !HAVE_ISNAN | ||||
| static av_always_inline av_const int avpriv_isnanf(float x) | ||||
| { | ||||
|     uint32_t v = av_float2int(x); | ||||
|     if ((v & 0x7f800000) != 0x7f800000) | ||||
|         return 0; | ||||
|     return v & 0x007fffff; | ||||
| } | ||||
| 
 | ||||
| static av_always_inline av_const int avpriv_isnan(double x) | ||||
| { | ||||
|     uint64_t v = av_double2int(x); | ||||
|     if ((v & 0x7ff0000000000000) != 0x7ff0000000000000) | ||||
|         return 0; | ||||
|     return (v & 0x000fffffffffffff) && 1; | ||||
| } | ||||
| 
 | ||||
| #define isnan(x)                  \ | ||||
|     (sizeof(x) == sizeof(float)   \
 | ||||
|         ? avpriv_isnanf(x)        \
 | ||||
|         : avpriv_isnan(x)) | ||||
| #endif /* HAVE_ISNAN */ | ||||
| 
 | ||||
| #if !HAVE_ISFINITE | ||||
| static av_always_inline av_const int avpriv_isfinitef(float x) | ||||
| { | ||||
|     uint32_t v = av_float2int(x); | ||||
|     return (v & 0x7f800000) != 0x7f800000; | ||||
| } | ||||
| 
 | ||||
| static av_always_inline av_const int avpriv_isfinite(double x) | ||||
| { | ||||
|     uint64_t v = av_double2int(x); | ||||
|     return (v & 0x7ff0000000000000) != 0x7ff0000000000000; | ||||
| } | ||||
| 
 | ||||
| #define isfinite(x)                  \ | ||||
|     (sizeof(x) == sizeof(float)      \
 | ||||
|         ? avpriv_isfinitef(x)        \
 | ||||
|         : avpriv_isfinite(x)) | ||||
| #endif /* HAVE_ISFINITE */ | ||||
| 
 | ||||
| #if !HAVE_HYPOT | ||||
| static inline av_const double hypot(double x, double y) | ||||
| { | ||||
|     double ret, temp; | ||||
|     x = fabs(x); | ||||
|     y = fabs(y); | ||||
| 
 | ||||
|     if (isinf(x) || isinf(y)) | ||||
|         return av_int2double(0x7ff0000000000000); | ||||
|     if (x == 0 || y == 0) | ||||
|         return x + y; | ||||
|     if (x < y) { | ||||
|         temp = x; | ||||
|         x = y; | ||||
|         y = temp; | ||||
|     } | ||||
| 
 | ||||
|     y = y/x; | ||||
|     return x*sqrt(1 + y*y); | ||||
| } | ||||
| #endif /* HAVE_HYPOT */ | ||||
| 
 | ||||
| #if !HAVE_LDEXPF | ||||
| #undef ldexpf | ||||
| #define ldexpf(x, exp) ((float)ldexp(x, exp)) | ||||
| #endif /* HAVE_LDEXPF */ | ||||
| 
 | ||||
| #if !HAVE_LLRINT | ||||
| #undef llrint | ||||
| #define llrint(x) ((long long)rint(x)) | ||||
| #endif /* HAVE_LLRINT */ | ||||
| 
 | ||||
| #if !HAVE_LLRINTF | ||||
| #undef llrintf | ||||
| #define llrintf(x) ((long long)rint(x)) | ||||
| #endif /* HAVE_LLRINT */ | ||||
| 
 | ||||
| #if !HAVE_LOG2 | ||||
| #undef log2 | ||||
| #define log2(x) (log(x) * 1.44269504088896340736) | ||||
| #endif /* HAVE_LOG2 */ | ||||
| 
 | ||||
| #if !HAVE_LOG2F | ||||
| #undef log2f | ||||
| #define log2f(x) ((float)log2(x)) | ||||
| #endif /* HAVE_LOG2F */ | ||||
| 
 | ||||
| #if !HAVE_LOG10F | ||||
| #undef log10f | ||||
| #define log10f(x) ((float)log10(x)) | ||||
| #endif /* HAVE_LOG10F */ | ||||
| 
 | ||||
| #if !HAVE_SINF | ||||
| #undef sinf | ||||
| #define sinf(x) ((float)sin(x)) | ||||
| #endif /* HAVE_SINF */ | ||||
| 
 | ||||
| #if !HAVE_RINT | ||||
| static inline double rint(double x) | ||||
| { | ||||
|     return x >= 0 ? floor(x + 0.5) : ceil(x - 0.5); | ||||
| } | ||||
| #endif /* HAVE_RINT */ | ||||
| 
 | ||||
| #if !HAVE_LRINT | ||||
| static av_always_inline av_const long int lrint(double x) | ||||
| { | ||||
|     return rint(x); | ||||
| } | ||||
| #endif /* HAVE_LRINT */ | ||||
| 
 | ||||
| #if !HAVE_LRINTF | ||||
| static av_always_inline av_const long int lrintf(float x) | ||||
| { | ||||
|     return (int)(rint(x)); | ||||
| } | ||||
| #endif /* HAVE_LRINTF */ | ||||
| 
 | ||||
| #if !HAVE_ROUND | ||||
| static av_always_inline av_const double round(double x) | ||||
| { | ||||
|     return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5); | ||||
| } | ||||
| #endif /* HAVE_ROUND */ | ||||
| 
 | ||||
| #if !HAVE_ROUNDF | ||||
| static av_always_inline av_const float roundf(float x) | ||||
| { | ||||
|     return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5); | ||||
| } | ||||
| #endif /* HAVE_ROUNDF */ | ||||
| 
 | ||||
| #if !HAVE_TRUNC | ||||
| static av_always_inline av_const double trunc(double x) | ||||
| { | ||||
|     return (x > 0) ? floor(x) : ceil(x); | ||||
| } | ||||
| #endif /* HAVE_TRUNC */ | ||||
| 
 | ||||
| #if !HAVE_TRUNCF | ||||
| static av_always_inline av_const float truncf(float x) | ||||
| { | ||||
|     return (x > 0) ? floor(x) : ceil(x); | ||||
| } | ||||
| #endif /* HAVE_TRUNCF */ | ||||
| 
 | ||||
| #endif /* AVUTIL_LIBM_H */ | ||||
| @ -0,0 +1,359 @@ | ||||
| /*
 | ||||
|  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | ||||
|  * | ||||
|  * 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_LOG_H | ||||
| #define AVUTIL_LOG_H | ||||
| 
 | ||||
| #include <stdarg.h> | ||||
| #include "avutil.h" | ||||
| #include "attributes.h" | ||||
| #include "version.h" | ||||
| 
 | ||||
| typedef enum { | ||||
|     AV_CLASS_CATEGORY_NA = 0, | ||||
|     AV_CLASS_CATEGORY_INPUT, | ||||
|     AV_CLASS_CATEGORY_OUTPUT, | ||||
|     AV_CLASS_CATEGORY_MUXER, | ||||
|     AV_CLASS_CATEGORY_DEMUXER, | ||||
|     AV_CLASS_CATEGORY_ENCODER, | ||||
|     AV_CLASS_CATEGORY_DECODER, | ||||
|     AV_CLASS_CATEGORY_FILTER, | ||||
|     AV_CLASS_CATEGORY_BITSTREAM_FILTER, | ||||
|     AV_CLASS_CATEGORY_SWSCALER, | ||||
|     AV_CLASS_CATEGORY_SWRESAMPLER, | ||||
|     AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT = 40, | ||||
|     AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, | ||||
|     AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, | ||||
|     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
 | ||||
| }AVClassCategory; | ||||
| 
 | ||||
| #define AV_IS_INPUT_DEVICE(category) \ | ||||
|     (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT) || \
 | ||||
|      ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT) || \
 | ||||
|      ((category) == AV_CLASS_CATEGORY_DEVICE_INPUT)) | ||||
| 
 | ||||
| #define AV_IS_OUTPUT_DEVICE(category) \ | ||||
|     (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT) || \
 | ||||
|      ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT) || \
 | ||||
|      ((category) == AV_CLASS_CATEGORY_DEVICE_OUTPUT)) | ||||
| 
 | ||||
| struct AVOptionRanges; | ||||
| 
 | ||||
| /**
 | ||||
|  * Describe the class of an AVClass context structure. That is an | ||||
|  * arbitrary struct of which the first field is a pointer to an | ||||
|  * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.). | ||||
|  */ | ||||
| typedef struct AVClass { | ||||
|     /**
 | ||||
|      * The name of the class; usually it is the same name as the | ||||
|      * context structure type to which the AVClass is associated. | ||||
|      */ | ||||
|     const char* class_name; | ||||
| 
 | ||||
|     /**
 | ||||
|      * A pointer to a function which returns the name of a context | ||||
|      * instance ctx associated with the class. | ||||
|      */ | ||||
|     const char* (*item_name)(void* ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * a pointer to the first option specified in the class if any or NULL | ||||
|      * | ||||
|      * @see av_set_default_options() | ||||
|      */ | ||||
|     const struct AVOption *option; | ||||
| 
 | ||||
|     /**
 | ||||
|      * LIBAVUTIL_VERSION with which this structure was created. | ||||
|      * This is used to allow fields to be added without requiring major | ||||
|      * version bumps everywhere. | ||||
|      */ | ||||
| 
 | ||||
|     int version; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Offset in the structure where log_level_offset is stored. | ||||
|      * 0 means there is no such variable | ||||
|      */ | ||||
|     int log_level_offset_offset; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Offset in the structure where a pointer to the parent context for | ||||
|      * logging is stored. For example a decoder could pass its AVCodecContext | ||||
|      * to eval as such a parent context, which an av_log() implementation | ||||
|      * could then leverage to display the parent context. | ||||
|      * The offset can be NULL. | ||||
|      */ | ||||
|     int parent_log_context_offset; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Return next AVOptions-enabled child or NULL | ||||
|      */ | ||||
|     void* (*child_next)(void *obj, void *prev); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Return an AVClass corresponding to the next potential | ||||
|      * AVOptions-enabled child. | ||||
|      * | ||||
|      * The difference between child_next and this is that | ||||
|      * child_next iterates over _already existing_ objects, while | ||||
|      * child_class_next iterates over _all possible_ children. | ||||
|      */ | ||||
|     const struct AVClass* (*child_class_next)(const struct AVClass *prev); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Category used for visualization (like color) | ||||
|      * This is only set if the category is equal for all objects using this class. | ||||
|      * available since version (51 << 16 | 56 << 8 | 100) | ||||
|      */ | ||||
|     AVClassCategory category; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Callback to return the category. | ||||
|      * available since version (51 << 16 | 59 << 8 | 100) | ||||
|      */ | ||||
|     AVClassCategory (*get_category)(void* ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Callback to return the supported/allowed ranges. | ||||
|      * available since version (52.12) | ||||
|      */ | ||||
|     int (*query_ranges)(struct AVOptionRanges **, void *obj, const char *key, int flags); | ||||
| } AVClass; | ||||
| 
 | ||||
| /**
 | ||||
|  * @addtogroup lavu_log | ||||
|  * | ||||
|  * @{ | ||||
|  * | ||||
|  * @defgroup lavu_log_constants Logging Constants | ||||
|  * | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Print no output. | ||||
|  */ | ||||
| #define AV_LOG_QUIET    -8 | ||||
| 
 | ||||
| /**
 | ||||
|  * Something went really wrong and we will crash now. | ||||
|  */ | ||||
| #define AV_LOG_PANIC     0 | ||||
| 
 | ||||
| /**
 | ||||
|  * Something went wrong and recovery is not possible. | ||||
|  * For example, no header was found for a format which depends | ||||
|  * on headers or an illegal combination of parameters is used. | ||||
|  */ | ||||
| #define AV_LOG_FATAL     8 | ||||
| 
 | ||||
| /**
 | ||||
|  * Something went wrong and cannot losslessly be recovered. | ||||
|  * However, not all future data is affected. | ||||
|  */ | ||||
| #define AV_LOG_ERROR    16 | ||||
| 
 | ||||
| /**
 | ||||
|  * Something somehow does not look correct. This may or may not | ||||
|  * lead to problems. An example would be the use of '-vstrict -2'. | ||||
|  */ | ||||
| #define AV_LOG_WARNING  24 | ||||
| 
 | ||||
| /**
 | ||||
|  * Standard information. | ||||
|  */ | ||||
| #define AV_LOG_INFO     32 | ||||
| 
 | ||||
| /**
 | ||||
|  * Detailed information. | ||||
|  */ | ||||
| #define AV_LOG_VERBOSE  40 | ||||
| 
 | ||||
| /**
 | ||||
|  * Stuff which is only useful for libav* developers. | ||||
|  */ | ||||
| #define AV_LOG_DEBUG    48 | ||||
| 
 | ||||
| /**
 | ||||
|  * Extremely verbose debugging, useful for libav* development. | ||||
|  */ | ||||
| #define AV_LOG_TRACE    56 | ||||
| 
 | ||||
| #define AV_LOG_MAX_OFFSET (AV_LOG_TRACE - AV_LOG_QUIET) | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Sets additional colors for extended debugging sessions. | ||||
|  * @code | ||||
|    av_log(ctx, AV_LOG_DEBUG|AV_LOG_C(134), "Message in purple\n"); | ||||
|    @endcode | ||||
|  * Requires 256color terminal support. Uses outside debugging is not | ||||
|  * recommended. | ||||
|  */ | ||||
| #define AV_LOG_C(x) ((x) << 8) | ||||
| 
 | ||||
| /**
 | ||||
|  * Send the specified message to the log if the level is less than or equal | ||||
|  * to the current av_log_level. By default, all logging messages are sent to | ||||
|  * stderr. This behavior can be altered by setting a different logging callback | ||||
|  * function. | ||||
|  * @see av_log_set_callback | ||||
|  * | ||||
|  * @param avcl A pointer to an arbitrary struct of which the first field is a | ||||
|  *        pointer to an AVClass struct or NULL if general log. | ||||
|  * @param level The importance level of the message expressed using a @ref | ||||
|  *        lavu_log_constants "Logging Constant". | ||||
|  * @param fmt The format string (printf-compatible) that specifies how | ||||
|  *        subsequent arguments are converted to output. | ||||
|  */ | ||||
| void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4); | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * Send the specified message to the log if the level is less than or equal | ||||
|  * to the current av_log_level. By default, all logging messages are sent to | ||||
|  * stderr. This behavior can be altered by setting a different logging callback | ||||
|  * function. | ||||
|  * @see av_log_set_callback | ||||
|  * | ||||
|  * @param avcl A pointer to an arbitrary struct of which the first field is a | ||||
|  *        pointer to an AVClass struct. | ||||
|  * @param level The importance level of the message expressed using a @ref | ||||
|  *        lavu_log_constants "Logging Constant". | ||||
|  * @param fmt The format string (printf-compatible) that specifies how | ||||
|  *        subsequent arguments are converted to output. | ||||
|  * @param vl The arguments referenced by the format string. | ||||
|  */ | ||||
| void av_vlog(void *avcl, int level, const char *fmt, va_list vl); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the current log level | ||||
|  * | ||||
|  * @see lavu_log_constants | ||||
|  * | ||||
|  * @return Current log level | ||||
|  */ | ||||
| int av_log_get_level(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Set the log level | ||||
|  * | ||||
|  * @see lavu_log_constants | ||||
|  * | ||||
|  * @param level Logging level | ||||
|  */ | ||||
| void av_log_set_level(int level); | ||||
| 
 | ||||
| /**
 | ||||
|  * Set the logging callback | ||||
|  * | ||||
|  * @note The callback must be thread safe, even if the application does not use | ||||
|  *       threads itself as some codecs are multithreaded. | ||||
|  * | ||||
|  * @see av_log_default_callback | ||||
|  * | ||||
|  * @param callback A logging function with a compatible signature. | ||||
|  */ | ||||
| void av_log_set_callback(void (*callback)(void*, int, const char*, va_list)); | ||||
| 
 | ||||
| /**
 | ||||
|  * Default logging callback | ||||
|  * | ||||
|  * It prints the message to stderr, optionally colorizing it. | ||||
|  * | ||||
|  * @param avcl A pointer to an arbitrary struct of which the first field is a | ||||
|  *        pointer to an AVClass struct. | ||||
|  * @param level The importance level of the message expressed using a @ref | ||||
|  *        lavu_log_constants "Logging Constant". | ||||
|  * @param fmt The format string (printf-compatible) that specifies how | ||||
|  *        subsequent arguments are converted to output. | ||||
|  * @param vl The arguments referenced by the format string. | ||||
|  */ | ||||
| void av_log_default_callback(void *avcl, int level, const char *fmt, | ||||
|                              va_list vl); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the context name | ||||
|  * | ||||
|  * @param  ctx The AVClass context | ||||
|  * | ||||
|  * @return The AVClass class_name | ||||
|  */ | ||||
| const char* av_default_item_name(void* ctx); | ||||
| AVClassCategory av_default_get_category(void *ptr); | ||||
| 
 | ||||
| /**
 | ||||
|  * Format a line of log the same way as the default callback. | ||||
|  * @param line          buffer to receive the formatted line | ||||
|  * @param line_size     size of the buffer | ||||
|  * @param print_prefix  used to store whether the prefix must be printed; | ||||
|  *                      must point to a persistent integer initially set to 1 | ||||
|  */ | ||||
| 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. | ||||
|  */ | ||||
| 
 | ||||
| #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 */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Skip repeated messages, this requires the user app to use av_log() instead of | ||||
|  * (f)printf as the 2 would otherwise interfere and lead to | ||||
|  * "Last message repeated x times" messages below (f)printf messages with some | ||||
|  * bad luck. | ||||
|  * Also to receive the last, "last repeated" line if any, the user app must | ||||
|  * call av_log(NULL, AV_LOG_QUIET, "%s", ""); at the end | ||||
|  */ | ||||
| #define AV_LOG_SKIP_REPEATED 1 | ||||
| 
 | ||||
| /**
 | ||||
|  * Include the log severity in messages originating from codecs. | ||||
|  * | ||||
|  * Results in messages such as: | ||||
|  * [rawvideo @ 0xDEADBEEF] [error] encode did not produce valid pts | ||||
|  */ | ||||
| #define AV_LOG_PRINT_LEVEL 2 | ||||
| 
 | ||||
| void av_log_set_flags(int arg); | ||||
| int av_log_get_flags(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_LOG_H */ | ||||
| @ -0,0 +1,66 @@ | ||||
| /*
 | ||||
|  * LZO 1x decompression | ||||
|  * copyright (c) 2006 Reimar Doeffinger | ||||
|  * | ||||
|  * 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_LZO_H | ||||
| #define AVUTIL_LZO_H | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup lavu_lzo LZO | ||||
|  * @ingroup lavu_crypto | ||||
|  * | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| /** @name Error flags returned by av_lzo1x_decode
 | ||||
|  * @{ */ | ||||
| /// end of the input buffer reached before decoding finished
 | ||||
| #define AV_LZO_INPUT_DEPLETED  1 | ||||
| /// decoded data did not fit into output buffer
 | ||||
| #define AV_LZO_OUTPUT_FULL     2 | ||||
| /// a reference to previously decoded data was wrong
 | ||||
| #define AV_LZO_INVALID_BACKPTR 4 | ||||
| /// a non-specific error in the compressed bitstream
 | ||||
| #define AV_LZO_ERROR           8 | ||||
| /** @} */ | ||||
| 
 | ||||
| #define AV_LZO_INPUT_PADDING   8 | ||||
| #define AV_LZO_OUTPUT_PADDING 12 | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Decodes LZO 1x compressed data. | ||||
|  * @param out output buffer | ||||
|  * @param outlen size of output buffer, number of bytes left are returned here | ||||
|  * @param in input buffer | ||||
|  * @param inlen size of input buffer, number of bytes left are returned here | ||||
|  * @return 0 on success, otherwise a combination of the error flags above | ||||
|  * | ||||
|  * Make sure all buffers are appropriately padded, in must provide | ||||
|  * AV_LZO_INPUT_PADDING, out must provide AV_LZO_OUTPUT_PADDING additional bytes. | ||||
|  */ | ||||
| int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen); | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| #endif /* AVUTIL_LZO_H */ | ||||
Some files were not shown because too many files have changed in this diff Show More
					Loading…
					
					
				
		Reference in new issue