1. channel接口

  • 基本的IO操作(bind(),connect(),read()和write())依赖于底层网络传输所提供的原语。在基于
    Java的网络编程中,其基本的构造是class Socket。
    Netty Channel接口所提供的API,大大的降低了直接使用的复杂型

  • EventLoop定义了netty的核心抽象,用于处理连接的生命周期所发生的事件。我们将在第七章中结合netty的线程处理模型上下文对eventloop进行详细的讨论,

    1. 一个EnvetLoopGroup包含一个或者多个Evnet-Loop;
    2. 一个EventLoop在他的生命周期内只和一个Tread绑定
    3. 所有由EventLoop处理的I/O事件都将在他专有的Thread被处理
    4. 一个Channel在它的生命周期内只注册于一个EventLoop
    5. 一个EventLoop可能会被分配给一个或多个Channell
  • 在这种设计中,一个给定的Channle的I/O操作都由相同的
    Thread执行的,实际上消除了同步的需要

ChannelFuter接口

  • netty的所有操作都是异步的。因为一个操作可能不会立即返回,所以我们需要一种用于在之后的某个时间点确定其结果的办法。为此,netty提供了ChannelFuter接口,其addListenter()方法注册了一个ChannnelFutreListener,以便在某个操作完成时(无论是否成功)得到通知

ChannelHandler和ChannelPipLine

  • ChannelHandler接口
    从应用程序开发人员来看,netty的主要组件是ChannelHandler,它充当了所有入站和出战数据的
    应用程序逻辑的容器,这是可行的,因为ChannelHander的方法是由网络事件(其中术语“事件” 的使用非常广泛)触发的。事实上,ChannelHandler可专门用于几乎任何类型的动作,例如将数据从一种格式转换成另外一种格式,或者处理转换过程中所抛出的异常,
    ChannelInBoundHandler是一个你将会经常实现的子接口。这种类型的ChannelHandler接受入站时间和出战数据。当你要给连接的客户端发送响应时,也可以从
    ChannelInBoudHanlder冲刷数据,应用程序业务逻辑
    通常驻留在一个或者多个ChannelInboundHander中

ChannelPipLine接口

  • ChannellPipLine为ChannelHander链提供了容器,并定义了用于在该链路上传播入站和出战时间流的API,当Channel被创建时,他会被自动地分配到专属的ChannelPipLine.

  • ChannelHandler安装到ChannelPipLine的过程如下

    1. 一个ChannelInitliaLizer的实现被注册到了serverBoostrap中
    2. 当ChannellInitializer.initChannel()方法被调用时,ChannelInitializer将在ChannelpipLine中安装一组自定义ChannelHanderl
    3. ChannelInitlizer将它自己从ChannnelPipLine中移除
  • 在nety中。有两种发送消息的方式。可以直接写到Channel中,也可以写到Channel-Handler相关联的ChannelHandlerContext对象中。前一种方式会导致消息从Channel-PipLine的尾端开始流动,。后后者将导致消息从ChannnelPipLine中的下一个Channel-Handler开始流动

ChannelHander

  • 有许多不同类型的Channel-Hander,各自的功能取决于他们的超类,Netty以适配器的形式提供了大量默认的Channel实现,其旨在简化应用程序处理逻辑的开发过程。
    您已经看到了。ChannelPipLine中的每个ChannelHander将负责把事件转发到链中的下一个CahnnelHander。这些适配器器及他们的子类将自动执行这个操作

编码器和解码器

  • 当通过netty发送或者接受一个消息时,就将会发生一次数据转换。入站消息会被解码;也就是说,从字节转换成另一种格式,通常是一个java对象,如果是出战消息,则会发生相反方向的转换,从它当前的格式被编码为字节,对于特定的需要,netty为编码器和解码器提供了不同类型的抽象类。

  • 通常来说,这些基类的名称将类似于ByteToMessageDecoder或MessageToByteEncoder,对于特殊的类型,可能会发现类似于protobufEncode和ProbufDecoder这样的名称-预制的用来支持Goog的Protocol Buffers.

  • 对于入站数据来说,channelRead方法/事件已经被重写了。对于每个从入站Channel读取的消息。这些方法都会被调用。随后,它将调用有由预制的解码器所提供的decode()方法,并将已解码的字节转换成ChannelPipLine中的下一个ChannelInBoundHander

  • 抽象类SimpleChannelInBoundhaner,其中T是你要处理的消息java类型,在这个Channelhander中,
    最重要的办法是channelRead0(Channel-HanderlContext,T)。除了要求不阻塞当前的I/O线程之外,其他具体实现完全取决于业务

nginx 反向代理绝对路径例示配置

1
2
3
4
5
6
7
   server {
listen 80;
server_name doctor.com;
location /a {
proxy_pass http://localhost:2220/;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//  tcp_file_client.js
var net = require("net")
var fs = require("fs");
const { EventEmitter } = require('events');
var fileName;
EventEmitter.setMaxListeners(0)
net.createServer(function (socket) {
// new connection
fileName = parseInt(Math.random() * 10000000000000);
fileName = fileName.toString(16).toUpperCase()+ ".png";
socket.write('Some string');
socket.on('data',function (data) {
fs.writeFile(fileName ,data, { flag: "a+" },( error) => {
console.log("write file error", error)
}, cb => {
console.log("write file success", cb);
}
);
socket.on('end', function (data) {
// connection closed
console.log("file transfer end once")
});
})
}).listen(4001);

cMakeList

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
cmake_minimum_required(VERSION 3.12)
project(OpenGL)

set(CMAKE_CXX_STANDARD 14)

set(GLEW_H /opt/homebrew/Cellar/glew/2.2.0_1/include/GL)
set(GLFW_H /opt/homebrew/Cellar/glfw/3.3.7/include/GLFW)
set(GLAD_H /usr/local/include/glad/include)
set(KH_H /usr/local/include/KHR)
include_directories(${GLEW_H} ${GLFW_H} ${GLAD_H} ${KH_H})

# 添加目标链接
set(GLEW_LINK /opt/homebrew/Cellar/glew/2.2.0_1/lib/libGLEW.2.2.dylib)
set(GLFW_LINK /opt/homebrew/Cellar/glfw/3.3.7/lib/libglfw.3.dylib)
link_libraries(${OPENGL} ${GLEW_LINK} ${GLFW_LINK})

# 执行编译命令
# 这个glad.c在第2步中说过要拉到项目中,注意路径
set(SOURCE_FILES "/usr/local/include/glad/src/glad.c" "main.cpp")
add_executable(OpenGL ${SOURCE_FILES})

# mac下这步很重要
if (APPLE)
target_link_libraries(OpenGL "-framework OpenGL")
target_link_libraries(OpenGL "-framework GLUT")
endif()

test openGl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <glew.h>
#include <glfw3.h>
#include <iostream>
using namespace std;

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{
//如果按下ESC,把windowShouldClose设置为True,外面的循环会关闭应用
if(key==GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
std::cout<<"ESC"<<mode;
}

int main(void)
{
//初始化GLFW库
if(!glfwInit())
return -1;
//创建窗口以及上下文
GLFWwindow* window = glfwCreateWindow(640, 480, "hello world", NULL, NULL);
if(!window)
{
//创建失败会返回NULL
glfwTerminate();
}
//建立当前窗口的上下文
glfwMakeContextCurrent(window);

glfwSetKeyCallback(window, key_callback); //注册回调函数
//循环,直到用户关闭窗口
while(!glfwWindowShouldClose(window))
{
/*******轮询事件*******/
glfwPollEvents();

/*******渲染*******/
//选择清空的颜色RGBA
glClearColor(0.2, 0.3, 0.3, 1);
glClear(GL_COLOR_BUFFER_BIT);

//开始画一个三角形
glBegin(GL_TRIANGLES);
glColor3f(1, 0, 0); //Red
glVertex3f(0, 1, 1);

glColor3f(0, 1, 0); //Green
glVertex3f(-1, -1, 0);

glColor3f(0, 0, 1); //Blue
glVertex3f(1, -1, 0);
//结束一个画图步骤
glEnd();

glBegin(GL_POLYGON);
//再画个梯形,需要注意笔顺
glColor3f(0.5, 0.5, 0.5); //Grey
glVertex2d(0.5, 0.5);
glVertex2d(1, 1);
glVertex2d(1, 0);
glVertex2d(0.5, 0);
glEnd();


/******交换缓冲区,更新window上的内容******/
glfwSwapBuffers(window);
}
glfwTerminate();
return 0;
}

  1. chmod 600 key.pem
  2. ssh-add -k key.pem
  3. ssh root@IP

1. 常量

​ 常量是单个值的标识符(名称)。在脚本中无法改变该值。有效的常量名以字符 或下划线开头(常量名称前面没有 $ 符号)

如需设置常量,请使用 define() 函数 - 它使用三个参数:

1.首个参数定义常量的名称;

2.第二个参数定义常量的值;

3.可选的第三个参数规定常量名是否对大小写敏感。默认是 false。

2. 变量

1.变量以 $ 符号开头,其后是变量的名称;

3. 变量的作用域

​ 局部变量:即在函数内部定义的变量,其作用域是所在函数。

​ 全局变量:即被定义在所有函数以外的变量,其作用域是整个PHP文件,但是在用户自定义函数内部是不可用的。想在用户自定义函数内部使用全局变量,要使用global关键字声明。

 静态变量:能够在函数调用结束后仍保留变量值,当再次回到其作用域时,又可以继续使用原来的值。而一般变量是在函数调用结束后,其存储的数据值将被清除,所占的内存空间被释放。使用静态变量时,先要用static来声明变量。需要把关键字static 放在要定义的变量之前

​ 可变变量:可变变量是一种独特的变量,它允许动态改变一个变量名称。工作原理是该变量的名称由另外一个变量的值来确定。实现过程是在变量的前面再多加一个”$“。

4. 基本数据类型

PHP 支持8种基本的数据类型:

​ 四种标量类型:boolean(布尔型)、integer(整型)、float (浮点型, 也称作 double)、string (字符串);
两种复合类型:array (数组)、object(对象);
最后是两种特殊类型:resource(资源)、NULL(NULL)。

整数:整数是没有小数的数字。

浮点数:浮点数是有小数点或指数形式的数字。

布尔型:布尔型是最简单的变量,布尔变量:true和false值。

​ 当转换为布尔型时,以下值被认为是false:
​ (1)布尔值false;
​ (2)整型值0(零);
​ (3)浮点型值0.0(零);
​ (4)空白字符串和字符串”0”;
​ (5)没有成员变量的数组;
​ (6)没有单元的对象(仅适用php4);
​ (7)特殊类型NULL;

​ 而所有其他值都被认为是TRUE包括任何资源。

字符串

​ 单引号方式:可以使用一对单引号来声明一个字符串,如果需要在字符串中包含单引号,可以使用 转义符**:

​ 双引号方式:也可以使用一对双引号来声明一个字符串。类似的,如果要在其中包含双引号, 使用转义符**:

​ HereDoc方式:通常在PHP代码中,你会需要将变量和预定的模板拼接起来,构成返回前端的HTML字符串。 Perl风格的HereDoc方式最适合这种应用场景。

  • 开始标识符总是以<<<开始,然后加上一个自定义的TOKEN,比如,我们使用EOT*, 你也可以使用SCREWYOU, HAHAHA… 总之只要不在内容中出现就行。

  • 结束标识符必须独占一行,顶格写上之前我们自定义的TOKEN,并且总是以*;*结尾。

    HereDoc方式支持在内容中使用变量,嗯,自带模板插值功能:

    转义字符:当我们想输出“$”、“””、“’”等字符时,这些特殊的字符都要通过转义符“\ ”来显示。常用的转义字符如下表:

    resource: 

    ​ 资源又叫做“句柄”,是由编程人员来分配的,处理外部事务的函数。

      资源是由专门的函数来建立和使用。它是一种特殊的数据类型,并由程序员分配。在使用资源时,要及时地释放不需要的资源。如果程序员忘记释放资源,系统自动启用垃圾回收机制,避免内存消耗殆尽。

      在PHP中,资源类型保存了到外部资源的一个引用,实质其实就是为外部资源建立的特殊句柄,比如数据库连接、打开文件、图形画布区域等。资源类型其实仅仅是一个整数,而内核可以根据这个整数值去一个类似资源池的地方寻找最终需要的数据。

    NULL 值:

      特殊的 NULL 值表示变量无值。NULL 是数据类型 NULL 唯一可能的值。NULL 值标示变量是否为空。也用于区分空字符串与空值数据库。可以通过把值设置为 NULL,将变量清空:

    5. 字符串运算符

      字符串运算符只有一个,即英文的句号“.”。它将两个字符串连接起来。

      当使用”+“时,PHP会认为这是一次运算。如果”+“号的两边有字符类型,则自动转换为整型,如果是字母,则输出为0,如果是以数字开头的字符串,则会截取字符串头部的数字,再进行运算。

    @错误屏蔽:错误屏蔽运算符可以对程序中出现错误的表达式进行操作,进而对错误信息进行屏蔽,其使用的方法就是在错误的表达式前加上“@”即可。它只是对错误信息进行屏蔽,并没有解决错误。

    6. 表达式

     在PHP的代码中,使用分号(;)来区分表达式,表达式也可以包含在括号内。可以这样理解,一个表达式再加上一个分号,就是一条PHP语句。

    7. 定义和调用函数

    ​ 函数值传递:在调用函数时,需要向函数传递参数,被传入的参数称为实参数,而函数定义的参数称为形参。参数传递的方式有按值传递与按引用传递。我们先介绍按值传递。

      值传递就是将实参的值复制到对应的形参中,在函数内部的操作针对形参进行,操作的结果不会影响到实参,即函数返回后,实参的值不会改变。

    ​ 引用传递:实参的内存地址传递到形参中,在函数内部的所有操作都会影响到实参的值,即返回后,实参的值会发生变化。传值时只需要在函数声明时的参数前加“&”即可。

    8. 字符串函数

    1. strlen 获取字符串的长度

    2. strtoupper与ucwords *strtoupper()将指定的字符全部转换为大写;strtolower()将北定的字符都转换成小写;ucwords()将指定字符串中每个单词的首字母都转成大写;ucfirst()*函数将指定字符串的首字母转换为大写。其语法结构都是一样的,在括号中填入指定的字符串即可。

    3. substr 函数从指定的字符串中按照指定的位置截取一定长度的字符。语法格式为:

      注:字符串的索引是从0开始的。

    4. strstr() 和 strrchr()

      *strstr()*函数获取指定字符串(A)在另一个字符串(B)中首次出现的位置到后者末尾的子字符串,区分字母大小写。语法格式如下:

      strrchr()函数获取字符串(A)在另一个字符串(B)中最后一次出现的位置,区分字母大小写。语法格式与strstr相同。

      1. str_ireplace()

      函数将指定字符串替换为另外一个指定的字符串

    9. 数组

    ​ PHP提供了两种索引下标,分别为数值索引和关联索引。数值索引由数字组成,下标从0开始,数值索引一般表示数组元素在数组中的位置。与数值索引不同,关联索引一般表示索引与该索引对应的数组元素的关系。

    PHP中声明数组的方式主要有两种,第一种是应用array()函数声明数组,第二种是通过直接为数组元素赋值的方式声明数组。array()函数的声明格式如下:

    应用array()函数声明数组时,数组下标既可以是数值索引也可以是关联索引。下标与数组元素值之间用”=>“进行连接,不同数组元素之间用逗号进行分隔。当然我们也可以用简单的定义方式:

    数组直接赋值

    1. print_r()
      对PHP中的数组元素进行输出可以通过输出语句来实现,如echo,print语句等,但这种输出方式只能对某数组中的某一元素进行输出。而通过print_r()函数可以将数组结构进行输出。
    2. foreach 主要用于处理数组,是遍历数组的一种简单方法,语法格式为:
    3. array_key_exists 用于判断某键值是否为该函数所指定的数组的键值,如果是则返回True,否则返回False。其语法格式为:
    4. count()用于返回指定数组中元素的个数。语法格式为:
    5. sort()与rsort() sort()用于对指定的数组进行升序排序;rsort用于对指定数组进行降序排序。

10. 面向对象

面向对象的编程方式具有继承、封装和多态性等特点。
1. 继承 通过继承可以创建子类和父类之间的层次关系,子类可以从其父类中继承属性和方法,通过这种关系模型可以简化类的操作,假如已经定义了A类,接下来准备定B类,而B类中有很多属性和方法与A类相同,那么就可以通过关键字extends实现B类继承A类,这样就无需再在B类中定义A类已具有的属性和方法,从而可以在很大程度数上提高程序的开发效率。
2. 封装 类是属性和方法的集合,为了实现某项功能而定义类后,开发人员并不需要了解类体内每句代码的具体含义,只需通过对象来调用类内某个属性或方法即可实现某项功能,这就是类的封装性
3. 多态 类的多态性指不同的类进行同一操作可以有不同的行为。

11.类

1. 类的结构及声明方式 创建一个PHP类时,必须使用关键字class进行声明,该关键字后紧跟类的名称,之后用大括号将类体进行封装,类的基本声明格式如下;创建完成类的基本结构后就可以编写类体。类体中主要包括属性和方法的声明及定义,当然也可能在类体中只定义属性或只定义方法,甚至类体内可以不定义任何属性。
    属性:类的属性实质为在类体内定义的变量,用于保存或设置参数。
    方法: 类的方法实质为在类体内定义的函数,用于实现某项功能,其定义方法与普通函数定义方法相同,同时可以应用访问权限关键字对方法访问权限进行限制。
    2. 构造函数 对类体进行初始化主要有两种方法。第一种方法是在类体中定义一个专门的用于对类体进行初始化的方法。第二种方法是应用构造函数实现类体的初始化。 通过构造函数来初始化。PHP中构造函数统一的命名为__construct(),作用就是对类体进行初始化,并可在实例化对象时为构造函数指定参数。
    3. 析构函数 与构造函数对应的是析构函数。析构函数在销毁类之前执行,并统一命名__destruct(),其作用是在类被销毁前自动完成某项功能。
    4. 类的实例化 一般情况下,创建一个类后并不能直接的对属性和方法进行引用,必须对类进行实例化,即创建一个对象。PHP中用new 关键字创建对象。
    5. 访问权限 访问修饰符主要包括public、private和protect这3种,当然如果不加任何修饰符对类体中的属性或方法进行修饰,则默认为public。

12. 继承

 PHP中用关键字extends指明继承关系。例如,已经定义了类A,如果让类B继承A,可以用下面的方式定义类B。
 这样B类就可以继承类A的公有和受保护的成员。但类的继承是单向的,子类可以从父类中继承特征,但父类却不能从子类中继承,也就是说,类A不能继承类B的成员。
 PHP自身并不支持多继承,也就是说一个子类只能有一个父类,一个父类可以有多个子类。

13. 重载

如果在父类中已经定义了某属性或方法,然后在子类中定义与父类同名的属性和方法也是合法的,这就是类的重载。利用重载可以重写父类中指定方法所实现的功能。(final。并不是任何时候都可以实现继承的重载的,利用final关键字修饰的方法不能被重载,同样使用该关键字修饰的类也不能被继承。)

14. 接口

接口可以看作是多继承的解决方案,其主要思想是指定一个实现了该接口的类,而在该类中必须实现接口中所有的方法。
PHP中接口是用关键字interface进行声明

15 .域运算符

在PHP中“::”这个叫范围解析操作符,又名域运算符。“::”符号可以认为是与C语言中的“.”相似的,而它更像C++中(Perl)的::类范围操作符。
在没有声明任何实例的情况下访问类中的函数或者基类中的函数和变量很有用处。而:: 运算符即用于此情况。

16. 对象克隆

对类进行实例化后,就可以通过实例化后的对象调用类中的成员,如果要求两个对象具有相同的特征,可以再对类进行实例化来生成一个新对象,PHP 提供了关键字 clone,应用该关键字即可实现对象的克隆,

17. this

this关键字为指向当前对象的指针,可以用该关键字调用当前类体中的属性和方法。

18. parent

 parent关键字是指向父类的指针,主要用于调用父类的构造函数。如下代码,首先定义test类作为父类,并在该类中定义构造函数_construct(),然后定义test2并继承test,同时在test2类体中定义该子类的构造函数,并在该构造函数中用parent来实现父类的初始化。

19. self

self关键字是指向类的本身,也就是说该关键字并不指向任何已实例化的对。由于类只能直接引用类体中的静态成员,而关键字又指向类本身,所以self关键字经常用于在类体中调用类的静态成员,调用方法为self关键字加域运算符再加静态成员名。静态变量一般用static 修饰。

20. include()

使用include()语句包含外部文件时,只有代码执行到include()函数时才将外部文件包含进来,当所包含的外部文件发生错误时,系统只会给出一个警告,而整个PHP文件则继续向下执行。

21.r eqiure()

require()语句与include()语句类似,都是实现对外部文件的调用。当使用require()语句时载入文件时,它会作为PHP文件的一部分被载入。如果通过require()语句载入一个HTML文件,如"hello.html",文件内的任何PHP命令都会被处理。
require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 (E_COMPILE_ERROR) 级别的错误。

22.include_once()

include_once()函数是include()函数的延伸,它的作用和include()函数几乎是相同的,唯一的区别在include_once()函数会在导入文件前先检测该文件是否在该页面的其它部分被导入过,如果有的话就不会重复导入该文件。

23. require_once()

require_once()语句是require()语句的延伸,它的功能与require类似,不同的是require_once()语句会先检查要导入的文件是不是已经在该程序中的其它地方被调用过,如果有的话就不会再次重复调用该文件。语法与require()相同。

24. date

通过date函数可以获取按照指定格式输出的日期和时间信息,如果省略参数,会自动获取本地的当前时间。
参数format为显示格式,参数timestamp为时间戳,是可选择的,默认为time(),即如果没有给出时间戳则使用本地当前时间。format格式参数在这里简单介绍几个:"Y"四位数字完整表示年份,"y"两位数字表示年份,"M"三个字母表示月份,"m"数字表示月份,"D"星期中的第几天,"d"月份中的第几天,"H"24小时格式,"h"12小时格式,"I"判断是否为夏令时,"i"分钟数,"s"秒数。

25. getdate

通过getdate()函数可以获取日期信息,而该函数返回值为一个数组,其中包括指定的日期和时间信息。如果没有给出时间戳,则输出的是本地当前的日期和时间。

26. checkdate

在需要设计填写日期和时间的模块中,有时会因为录入失误,而产生错误。为了避免些类问题的出现,在设计时就要对日期进行检验,就是利用checkdate函数。声明如下:

27. checkdate

如果检验有效,返回true,否则返回false。month的有效值在1-12,day在给定的月之内,包括闰年,year的值在1-32767之间。.

28. time

获取当前时间戳通过time()函数来实现。

修改node_modules > react-native > Libraries > Images > RCTUIImageViewAnimated.m search for if (_currentFrame)

1
2
3
4
5
6
if (_currentFrame) {
layer.contentsScale = self.animatedImageScale;
layer.contents = (__bridge id)_currentFrame.CGImage;
} else {
[super displayLayer:layer];
}

part1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
#! /usr/bin/env bash

# shell/config.sh
#会在上面的build脚本中被引入

#--------------------
# Standard options:
export COMMON_FF_CFG_FLAGS=
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --prefix=PREFIX"

# Licensing options:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-gpl"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-version3"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-nonfree"

# Configuration options:
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-static"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-shared"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-small"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-runtime-cpudetect"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-gray"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-swscale-alpha"

# Program options:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-programs"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffmpeg"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffplay"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffprobe"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffserver"

# Documentation options:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-doc"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-htmlpages"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-manpages"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-podpages"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-txtpages"

# Component options:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avdevice"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avcodec"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avformat"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avutil"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-swresample"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-swscale"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-postproc"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avfilter"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avresample"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-pthreads"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-w32threads"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-os2threads"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-network"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dct"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dwt"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-lsp"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-lzo"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mdct"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-rdft"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-fft"

# Hardware accelerators:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-d3d11va"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dxva2"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vaapi"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vda"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vdpau"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-videotoolbox"

# Individual component options:
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-everything"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-encoders"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-encoder=png"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-encoder=mjpeg"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-encoder=jpeg2000"

# ./configure --list-decoders
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-decoders"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=aac"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=aac_latm"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=flv"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=h264"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mp3*"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=vp6f"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=flac"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=hevc"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=vp8"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=vp9"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=h263"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=h263i"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=h263p"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mpeg4"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mjpeg"

export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-hwaccels"

# ./configure --list-muxers
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-muxers"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-muxer=mp4"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-muxer=mjpeg"

# ./configure --list-demuxers
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-demuxers"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=aac"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=concat"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=data"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=flv"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=hls"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=live_flv"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mov"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mp3"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegps"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegts"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegvideo"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=flac"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=hevc"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=webm_dash_manifest"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpeg4"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtsp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mjpeg"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=avi"

# ./configure --list-parsers
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-parsers"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=aac"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=aac_latm"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=h264"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=flac"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=hevc"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=mpeg4"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=mpeg4video"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=mpegvideo"

# ./configure --list-bsf
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-bsfs"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=chomp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=dca_core"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=dump_extradata"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=hevc_mp4toannexb"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=imx_dump_header"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mjpeg2jpeg"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mjpega_dump_header"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mov2textsub"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mp3_header_decompress"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mpeg4_unpack_bframes"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=noise"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=remove_extradata"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=text2movsub"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=vp9_superframe"

# ./configure --list-protocols
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocols"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=async"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=bluray"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=concat"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=crypto"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=ffrtmpcrypt"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=ffrtmphttp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=gopher"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=icecast"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=librtmp*"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=libssh"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=md5"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=mmsh"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=mmst"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=rtmp*"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtmp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtmpt"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=sctp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=srtp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=subfile"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=unix"

#
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-devices"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-filters"

# External library support:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-iconv"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-audiotoolbox"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-videotoolbox"

# ...

# Advanced options (experts only):
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cross-prefix=${FF_CROSS_PREFIX}-"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-cross-compile"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --sysroot=PATH"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --sysinclude=PATH"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --target-os=TAGET_OS"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --target-exec=CMD"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --target-path=DIR"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --toolchain=NAME"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --nm=NM"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --ar=AR"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --as=AS"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --yasmexe=EXE"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cc=CC"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cxx=CXX"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --dep-cc=DEPCC"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --ld=LD"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-cc=HOSTCC"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-cflags=HCFLAGS"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-cppflags=HCPPFLAGS"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-ld=HOSTLD"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-ldflags=HLDFLAGS"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-libs=HLIBS"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-os=OS"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-cflags=ECFLAGS"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-cxxflags=ECFLAGS"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-ldflags=ELDFLAGS"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-libs=ELIBS"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-version=STRING"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --optflags=OPTFLAGS"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --build-suffix=SUFFIX"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --malloc-prefix=PREFIX"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --progs-suffix=SUFFIX"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --arch=ARCH"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cpu=CPU"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-pic"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-sram"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-thumb"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-symver"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-hardcoded-tables"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-safe-bitstream-reader"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-memalign-hack"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-lto"

# Optimization options (experts only):
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-asm"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-altivec"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-amd3dnow"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-amd3dnowext"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mmx"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mmxext"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse2"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse3"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ssse3"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse4"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse42"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avx"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-fma4"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-armv5te"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-armv6"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-armv6t2"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vfp"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-neon"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vis"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-inline-asm"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-yasm"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mips32r2"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mipsdspr1"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mipsdspr2"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mipsfpu"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-fast-unaligned"

# Developer options (useful when working on FFmpeg itself):
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-coverage"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-debug"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-debug=LEVEL"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-optimizations"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-extra-warnings"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-stripping"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --assert-level=level"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-memory-poisoning"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --valgrind=VALGRIND"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-ftrapv"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --samples=PATH"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-xmm-clobber-test"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-random"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-random"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-random=LIST"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-random=LIST"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --random-seed=VALUE"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-linux-perf"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bzlib"

part2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/bin/bash
NDK=/Users/ggchzzz/Library/Android/sdk/ndk/21.4.7075529
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
API=21

function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
--prefix=$PREFIX \
--libdir=$LIB_DIR \
--enable-shared \
--disable-static \
--enable-jni \
--disable-doc \
--disable-symver \
--disable-programs \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
--disable-asm \
$COMMON_FF_CFG_FLAGS
make clean
make -j8
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}

# # armv8-a
source "config-env.sh"
OUTPUT_FOLDER="arm64-v8a"
ARCH=arm64
CPU="armv8-a"
TOOL_CPU_NAME=aarch64
TOOL_PREFIX="$TOOLCHAIN/bin/$TOOL_CPU_NAME-linux-android"

CC="$TOOL_PREFIX$API-clang"
CXX="$TOOL_PREFIX$API-clang++"
SYSROOT="$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot"
PREFIX="${PWD}/android/$OUTPUT_FOLDER"
LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
OPTIMIZE_CFLAGS="-march=$CPU"
build_android

# # armv7-a
source "config-env.sh"
OUTPUT_FOLDER="armeabi-v7a"
ARCH="arm"
CPU="armv7-a"
TOOL_CPU_NAME=armv7a
TOOL_PREFIX="$TOOLCHAIN/bin/arm-linux-androideabi"

CC="$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang"
CXX="$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++"
SYSROOT="$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot"
PREFIX="${PWD}/android/$OUTPUT_FOLDER"
LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
OPTIMIZE_CFLAGS="-march=$CPU"
build_android

# x86
source "config-env.sh"
OUTPUT_FOLDER="x86"
ARCH="x86"
CPU="x86"
TOOL_CPU_NAME="i686"
TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"

CC="$TOOL_PREFIX$API-clang"
CXX="$TOOL_PREFIX$API-clang++"
SYSROOT="$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot"
PREFIX="${PWD}/android/$OUTPUT_FOLDER"
LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
build_android

# x86_64
# source "config-env.sh"
# OUTPUT_FOLDER="x86_64"
# ARCH="x86_64"
# CPU="x86-64"
# TOOL_CPU_NAME="x86_64"
# TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"

# CC="$TOOL_PREFIX$API-clang"
# CXX="$TOOL_PREFIX$API-clang++"
# SYSROOT="$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot"
# PREFIX="${PWD}/android/$OUTPUT_FOLDER"
# LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
# OPTIMIZE_CFLAGS="-march=$CPU"
# build_android



# 仅确定支持ndkr20+ffmpeg4.2.2
# 在原作者基础上有修改
# 1. 修改make 参数 -j8, 开启线程编译优化以加快速度, 根据自己的, 一般cpu核心数*2
# 2. 根据自己的系统修改TOOLCHAIN, 我是mac, 所以修改为darwin, 不确定的话就到NDK目录下查看
# 3. API等级是21
# 4. 4.2.2版本并不需要手动修改ffmpeg的configure文件,因为打出来的so文件是没有版本号的

# 编译选项可以使用 ./configure -h 查看, 可以根据自己的需求开启或关闭编解码支持, 会显著降低so大小
# 本选项编译出的文件文件尺寸如下:
# -rwxr-xr-x 1 caijinglong staff 11M 1 5 21:17 libavcodec.so
# -rwxr-xr-x 1 caijinglong staff 2.4M 1 5 21:17 libavfilter.so
# -rwxr-xr-x 1 caijinglong staff 2.0M 1 5 21:17 libavformat.so
# -rwxr-xr-x 1 caijinglong staff 390K 1 5 21:17 libavutil.so
# -rwxr-xr-x 1 caijinglong staff 78K 1 5 21:17 libswresample.so
# -rwxr-xr-x 1 caijinglong staff 442K 1 5 21:17 libswscale.so

# 如果想要将所有so合并为一个libffmpeg.so库,可以看下面的说明
# 说是合并,实际上so是不支持合并的, 需要编译出.a静态库而不是so动态库, 然后将多个静态库合并为一个so, 然后用TOOLCHAIN中的gcc命令进行合并
# gcc -shared -o -Wl --whole-archive avcodec.a avfilter.a other.a -Wl,--no-whole-archive

基本功

  1. java 9种基本类型 boolean char byte short int long float double void

  2. java泛型 java的泛型是伪泛型,java在编译期间,所有的泛型信息都会被擦掉,这就是通常所说的类型擦除。泛型一般有三种使用方式:泛型类,泛型接口,泛型方法

  3. ==和equasl的区别

    == : 它的作用是判断两个对象的地址是不是相等,即判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型比较的是内存地址)因为java只有值传递,所以,对于==来说,不管是比较基本类型数据,还是引用类型数据类型变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址

    equas():它的作用也是判断两个对象是否相等,它不能用于比较基本数据类型的变量,equals()方法存在于object类中,而Object类是所有类的直接或间接父类

    equals()方法存在两种使用情况:

    情况1:类没有覆盖equals()方法,比较该类的两个对象时,等价于通过”==”比较这两个对象,使用的默认是Object类equals()方法
    情况2:类覆盖了equals()方法,一般,我们覆盖equals()方法来比较两个对象的内容相等;若他们内容相等,则返回true(即,认为这两个对象相等)

    说明:

    String中的equals方法是被重写过的,因为object的equals方法是比较的对象的内存地址,而string的equals方法是比较对象的值

    当创建string类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建值相等的对象。如果有就把它赋值给当前引用,如果没有就在常量池中重新创建一个String对象

    String类equals()方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public boolean equals(Object anObject) {
    if (this == anObject) {
    return true;
    }
    if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = value.length;
    if (n == anotherString.value.length) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = 0;
    while (n-- != 0) {
    if (v1[i] != v2[i])
    return false;
    i++;
    }
    return true;
    }
    }
    return false;
    }

  4. hashCode()和equals()

    1. hashcode()的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数,这个哈希码的作用是确定该对象在哈希表中的索引位置,hashcode() 定义在jdk的object类中,这就意味着java中的任何类都含有hashCode()函数。另外需要注意的是:Object的hashcode方法是本地方法,也就是用c语言或者c++实现的,该方法通常用来将对象的内存地址转化为整数之后返回。
    1
    public native int hashCode();

    ​ 散列表存储的(key-value),它的特点是:能根据“键”快速检索出对应的值,这其中就列用到 了散列码

    1. 为什么要重写equals时必须重写hashcode方法

      如果两个对象相等,则hashcode一定意识相同的。两个对象相等,对两个对象分别调用equeas方法都返回true,但是,两个对象有相同的hashcode值。它们也不一定相等的,因此,equasl方法被覆盖过,则hashCode方法也必须被覆盖

      hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

    2. 为什么两个对象有相同的hashcode的值,它们也不一定是相等的?

      因为hashCode()所使用的杂凑算法也许刚好会让多个对象传回相同的杂凑值,越糟糕的杂凑算法越容易碰撞,但这也与数值域分布的特性有关,(所谓碰撞也就是不同的对象得到相同的hashCode)

      如果hashSet在对比的时候,同样的hashCode有多个对象,它会使用equals()来判断是否真的相同,也就是瘦hashcode只是用来缩小成本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 DBCC FREEPROCCACHE  -- 清空执行计划缓存
DECLARE @couName int, @tableName NVARCHAR(50),@sql NVARCHAR(150),@sql1 NVARCHAR(200) --声明变量,需要读取的数据
DECLARE cur CURSOR static --声明静态游标

FOR
select Name From SysObjects Where xtype='U';
OPEN cur --打开游标
FETCH NEXT FROM cur INTO @tableName --取数据
WHILE ( @@fetch_status = 0 ) --判断是否还有数据
BEGIN
set @sql ='select @couName = COUNT(*) from dbo.sysobjects where xtype=''PK'' and parent_obj=(select id from dbo.sysobjects where name=@tableName )';
EXEC sp_executesql @sql,N'@couName int output, @tableName NVARCHAR(50)' ,@couName output, @tableName;
select @tableName as "表名"
if(@couName > 0)
BEGIN
select @tableName as 表名,@couName as 主键
END
else
BEGIN
if(@tableName != 'wmanage' and @tableName != 'strategy' and @tableName !='strain_para')
begin
print('ALTER TABLE "'+ @tableName+ '" ADD pk_id int NOT NULL IDENTITY (1,1), CONSTRAINT PK_'+@tableName+' PRIMARY KEY CLUSTERED (pk_id)')
exec('ALTER TABLE "'+ @tableName+ '" ADD pk_id int NOT NULL IDENTITY (1,1), CONSTRAINT "PK_'+@tableName+'" PRIMARY KEY CLUSTERED (pk_id)')
-- print('ALTER TABLE '+ @tableName+ ' ADD pk_id int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY')
-- exec('ALTER TABLE "'+ @tableName+ ' " ADD pk_id int NOT NULL INT NOT NULL PRIMARY KEY AUTO_INCREMENT "0"')
-- set @sql1 = 'ALTER TABLE @tableName ADD id int identity(1,1) PRIMARY KEY'
-- EXEC sp_executesql @sql1,N'@tableName NVARCHAR(50)',@tableName
end
END
FETCH NEXT FROM cur INTO @tableName --这里一定要写取下一条数据
END
CLOSE cur --关闭游标
DEALLOCATE cur
0%