FFMPEG学习【libavutil】:视频相关

一、显示变换矩阵函数

显示变换矩阵指定应适用于视频帧以进行正确预处理的仿射变换。

它与存储在ISO / IEC 14496-12容器格式中的矩阵兼容。

数据是一个3x3矩阵,表示为9元素数组:

 			       | a b u |
(a, b, u, c, d, v, x, y, w) -> | c d v |
                               | x y w |
所有数字以原始字节顺序存储,除了u,v和w之外的16.16个定点值,存储为2.30个定点值。

变换将源(预转换)帧中的点(p,q)映射到目标(后变换)帧中的点(p',q'),如下所示:

            | a b u |
(p, q, 1) . | c d v | = z * (p', q', 1)
            | x y w |
转换也可以更明确地写在组件中,如下所示:

p' = (a * p + c * q + x) / z;
q' = (b * p + d * q + y) / z;
z  =  u * p + v * q + w


一)、函数

double  av_display_rotation_get (const int32_t matrix[9])
提取转换矩阵的旋转分量。

参数:matrix:转换矩阵

返回:变形使逆时针旋转框架的角度(以度为单位)。 如果矩阵是单数,角度将在[-180.0,180.0]或NaN的范围内。

注意:浮点数本质上是不准确的,所以建议在使用前将返回值舍入到最接近的整数。


void  av_display_rotation_set (int32_t matrix[9], double angle)
初始化描述纯逆时针旋转指定角度(以度为单位)的变换矩阵。

参数:matrix:分配的变换矩阵(将被该函数完全覆盖)

   angle:旋转角度以度为单位。


void  av_display_matrix_flip (int32_t matrix[9], int hflip, int vflip)
水平和/或垂直地翻转输入矩阵。

参数:matrix:一个分配的变换矩阵

   hflip:矩阵是否应水平翻转

   vflip:矩阵是否应垂直翻转



二、球形视频映射

一个球面视频文件包含需要映射到球体上的曲面。

注意:结构必须分配av_spherical_alloc(),其大小不是公共ABI的一部分。

根据帧的转换方式,在映射和显示视频之前,需要应用不同的失真变换或表面重构功能。


一)、数据结构

此结构描述如何处理球形视频,概述有关投影,初始布局和任何其他视图修改器的信息。


struct   AVSphericalMapping{
enum AVSphericalProjection projection; //投影类型。
uint32_t padding; //从每个立方体面的边缘进行焊接的像素数。

初始方位
在视频帧映射到场后,场中描述了应用于球体的附加旋转。
球体围绕观察者转动,观察者保持静止。 变换的顺序总是偏航,其次是俯仰,最后是滚动。
坐标系与OpenGL中定义的坐标系匹配,其中向量向量(z)离开屏幕,并且等效于R = r_y(yaw)* r_x(pitch)* r_z(roll)的旋转矩阵。
正偏航将观看者前面的球体部分向右旋转。 正音调将观看者前方的球体部分向上旋转。 正面滚动将观看者前面的球体部分倾斜到观看者的右侧。
这些值被导出为16.16个固定点。
见这个等角投影为例:
              Yaw
    -180           0           180
  90 +-------------+-------------+  180
     |             |             |                  up
P    |             |             |                 y|    forward
i    |             ^             |                  |   /z
t  0 +-------------X-------------+    0 Roll        |  /
c    |             |             |                  | /
h    |             |             |                 0|/_____right
     |             |             |                        x
 -90 +-------------+-------------+ -180
X - the default camera center
^ - the default up vector

int32_t yaw; //  向上旋转[-180,180]。
int32_t pitch; //绕右矢量旋转[-90,90]。
int32_t roll; //绕前向矢量旋转[-180,180]。

边界矩形
这些字段指示当前图块的位置,以及相对于原始曲面映射的位置。 它们导出为0.32个固定点,并可以通过av_spherical_bounds()转换为经典像素值。
+----------------+----------+
|                |bound_top |
|            +--------+     |
| bound_left |tile    |     |
+<---------->|        |<--->+bound_right
|            +--------+     |
|                |          |
|    bound_bottom|          |
+----------------+----------+

如果需要,可以通过将当前流或帧大小添加到相关边界来导出原始视频表面尺寸,如以下示例所示:
original_width  = tile->width  + bound_left + bound_right;
original_height = tile->height + bound_top  + bound_bottom;
注意:这些值仅适用于平铺等角投影类型(AV_SPHERICAL_EQUIRECTANGULAR_TILE),并且在所有其他情况下都应该被忽略。

uint32_t bound_left; //  距离左边缘的距离。
uint32_t bound_top; // 距离上边缘的距离。
uint32_t bound_right; //距离右边缘的距离。
uint32_t bound_bottom; // 与底边距离。
}


二)、枚举

enum   AVSphericalProjection { AV_SPHERICAL_EQUIRECTANGULARAV_SPHERICAL_CUBEMAPAV_SPHERICAL_EQUIRECTANGULAR_TILE }


三)、函数

AVSphericalMapping *  av_spherical_alloc (size_t *size)
分配AVSphericalVideo结构,并将其字段初始化为默认值。

返回:新分配的结构或NULL失败


void  av_spherical_tile_bounds (const AVSphericalMapping *map, size_t width, size_t height, size_t *left, size_t *top, size_t *right, size_t *bottom)
将AVSphericalVideo的边界字段从0.32固定点转换为像素。

参数:map:从AVSphericalVideo映射读取绑定值。

   width:当前帧或流的宽度。

   height:当前帧或流的高度。

   left:从左边缘的像素。

   top:上边缘的像素。

   right:像素从右边缘。

   bottom:像素从底边。


const char *  av_spherical_projection_name (enum AVSphericalProjection projection)
提供给定的AVSphericalProjection的可读名称。

参数:projection:输入AVSphericalProjection。

返回:AVSphericalProjection的名称,或“未知”。


int  av_spherical_from_name (const char *name)
获取AVSphericalProjection形式的人类可读的名称。

参数:name:输入字符串。

返回:AVSphericalProjection值,如果没有找到则为-1。



三、Stereo3D类型和功能

立体视频文件由嵌入在单个帧中的多个视图组成,通常描述场景的两个视图。


一)、数据结构

立体声3D类型:此结构描述了如何在单个视频表面中打包两个视频,并根据需要提供其他信息。


struct   AVStereo3D{
enum AVStereo3DType type; //视频中的视图如何打包。
int flags; //有关框架包装的附加信息。
}

二)、宏

#define  AV_STEREO3D_FLAG_INVERT   (1 << 0)
倒置视图,右/底表示左视图。


三)、枚举

enum   AVStereo3DType { 
  AV_STEREO3D_2DAV_STEREO3D_SIDEBYSIDEAV_STEREO3D_TOPBOTTOMAV_STEREO3D_FRAMESEQUENCE
  AV_STEREO3D_CHECKERBOARDAV_STEREO3D_SIDEBYSIDE_QUINCUNXAV_STEREO3D_LINESAV_STEREO3D_COLUMNS 
}


四)、函数

AVStereo3D *  av_stereo3d_alloc (void)
分配AVStereo3D结构并将其字段设置为默认值。

结果可以使用av_freep()来释放。

返回:AVStereo3D填充默认值或失败时为NULL。


AVStereo3D *  av_stereo3d_create_side_data (AVFrame *frame)
分配完整的AVFrameSideData并将其添加到框架中。

参数:frame:添加哪一侧数据的帧。

返回:AVStereo3D结构由调用者填充。


const char *  av_stereo3d_type_name (unsigned int type)
提供一个给定的stereo3d类型的人类可读的名称。

参数:type:输入stereo3d类型值。

返回:stereo3d值的名称,或“未知”。


int  av_stereo3d_from_name (const char *name)
获取AVStereo3DType形式可读的名称。

参数:name:输入字符

返回:AVStereo3DType值,如果没有找到则为-1。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值