一、显示变换矩阵函数
显示变换矩阵指定应适用于视频帧以进行正确预处理的仿射变换。
它与存储在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个固定点。 见这个等角投影为例:
int32_t yaw; // 向上旋转[-180,180]。 int32_t pitch; //绕右矢量旋转[-90,90]。 int32_t roll; //绕前向矢量旋转[-180,180]。 边界矩形 这些字段指示当前图块的位置,以及相对于原始曲面映射的位置。 它们导出为0.32个固定点,并可以通过av_spherical_bounds()转换为经典像素值。
如果需要,可以通过将当前流或帧大小添加到相关边界来导出原始视频表面尺寸,如以下示例所示: 注意:这些值仅适用于平铺等角投影类型(AV_SPHERICAL_EQUIRECTANGULAR_TILE),并且在所有其他情况下都应该被忽略。uint32_t bound_left; // 距离左边缘的距离。 uint32_t bound_top; // 距离上边缘的距离。 uint32_t bound_right; //距离右边缘的距离。 uint32_t bound_bottom; // 与底边距离。 } |
二)、枚举
enum | AVSphericalProjection { AV_SPHERICAL_EQUIRECTANGULAR, AV_SPHERICAL_CUBEMAP, AV_SPHERICAL_EQUIRECTANGULAR_TILE } |
三)、函数
AVSphericalMapping * | av_spherical_alloc (size_t *size) |
返回:新分配的结构或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) |
参数:map:从AVSphericalVideo映射读取绑定值。
width:当前帧或流的宽度。
height:当前帧或流的高度。
left:从左边缘的像素。
top:上边缘的像素。
right:像素从右边缘。
bottom:像素从底边。
const char * | av_spherical_projection_name (enum AVSphericalProjection projection) |
参数:projection:输入AVSphericalProjection。
返回:AVSphericalProjection的名称,或“未知”。
int | av_spherical_from_name (const char *name) |
参数:name:输入字符串。
返回:AVSphericalProjection值,如果没有找到则为-1。
三、Stereo3D类型和功能
立体视频文件由嵌入在单个帧中的多个视图组成,通常描述场景的两个视图。
一)、数据结构
立体声3D类型:此结构描述了如何在单个视频表面中打包两个视频,并根据需要提供其他信息。
struct | AVStereo3D{ enum AVStereo3DType type; //视频中的视图如何打包。 int flags; //有关框架包装的附加信息。 } |
二)、宏
#define | AV_STEREO3D_FLAG_INVERT (1 << 0) |
三)、枚举
四)、函数
AVStereo3D * | av_stereo3d_alloc (void) |
结果可以使用av_freep()来释放。
返回:AVStereo3D填充默认值或失败时为NULL。
AVStereo3D * | av_stereo3d_create_side_data (AVFrame *frame) |
参数:frame:添加哪一侧数据的帧。
返回:AVStereo3D结构由调用者填充。
const char * | av_stereo3d_type_name (unsigned int type) |
参数:type:输入stereo3d类型值。
返回:stereo3d值的名称,或“未知”。
int | av_stereo3d_from_name (const char *name) |
参数:name:输入字符
返回:AVStereo3DType值,如果没有找到则为-1。