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