ffmpeg中AVFrame解码linesize确定

2024-01-18 20:44

本文主要是介绍ffmpeg中AVFrame解码linesize确定,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一 测试环境

机型:Intel(R) Xeon(R) Gold 5218

ffmpeg版本4.3-dev

解码视频分辨率 720x1280 , 解码后 AVFrame linesize 768

解码视频分辨率 480x640, 解码后AVFrame linesize 512

二 linesize计算过程

avcodec_default_get_buffer2

-->update_frame_pool()

-->video_get_buffer()

video_get_buffer()-->

for (i = 0i < 4 && pool->pools[i]; i++) {

pic->linesize[i= pool->linesize[i];

由上面代码可见,AVFrame的linesize源自于 pool的linesize

 pool 的linesize计算过程

update_frame_pool()

case AVMEDIA_TYPE_VIDEO: {

int linesize[4];

int w = frame->width;

int h = frame->height;

int unaligned;

ptrdiff_t linesize1[4];

size_t size[4];

avcodec_align_dimensions2(avctx&w&hpool->stride_align);

do {

// NOTE: do not align linesizes individually, this breaks e.g. assumptions

// that linesize[0] == 2*linesize[1] in the MPEG-encoder for 4:2:2

ret = av_image_fill_linesizes(linesizeavctx->pix_fmtw);

if (ret < 0)

goto fail;

// increase alignment of w for next try (rhs gives the lowest bit set in w)

w += w & ~(w - 1);

unaligned = 0;

for (i = 0i < 4i++)

unaligned |= linesize[i% pool->stride_align[i];

        } while (unaligned);

for (i = 0i < 4i++)

linesize1[i= linesize[i];

ret = av_image_fill_plane_sizes(sizeavctx->pix_fmthlinesize1);

if (ret < 0)

goto fail;

for (i = 0i < 4i++) {

pool->linesize[i= linesize[i]; //这里赋值给pool的linesize

linesize列表 通过 av_image_fill_linesizes获取,基本就是等于 width。

循环中

w += w & ~(w - 1); //每次将最低有效二进制位+1,这样做的目的,比如当前是16的整数倍,调整为32的整数倍。然后64的整数倍。

直到最终对 stride_align[i]取余为0.

avcodec_align_dimensions2(avctx&w&hpool->stride_align);

函数获取 stride_align

for (i = 0i < 4i++)

linesize_align[i= STRIDE_ALIGN;

#if HAVE_SIMD_ALIGN_64

#   define STRIDE_ALIGN 64 /* AVX-512 */

#elif HAVE_SIMD_ALIGN_32

#   define STRIDE_ALIGN 32

#elif HAVE_SIMD_ALIGN_16

#   define STRIDE_ALIGN 16

#else

#   define STRIDE_ALIGN 8

#endif

机器支持avx512, STRIDE_ALIGN 64.

总结:ffmpeg的AVFrame linesize对齐方式和机器支持的simd有关,avx512就是64字节,avx256就是32字节

这篇关于ffmpeg中AVFrame解码linesize确定的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/620201

相关文章

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功

Java 中编码与解码的具体实现方法

《Java中编码与解码的具体实现方法》在Java中,字符编码与解码是处理数据的重要组成部分,正确的编码和解码可以确保字符数据在存储、传输、读取时不会出现乱码,本文将详细介绍Java中字符编码与解码的... 目录Java 中编码与解码的实现详解1. 什么是字符编码与解码?1.1 字符编码(Encoding)1

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

SpringBoot使用ffmpeg实现视频压缩

《SpringBoot使用ffmpeg实现视频压缩》FFmpeg是一个开源的跨平台多媒体处理工具集,用于录制,转换,编辑和流式传输音频和视频,本文将使用ffmpeg实现视频压缩功能,有需要的可以参考... 目录核心功能1.格式转换2.编解码3.音视频处理4.流媒体支持5.滤镜(Filter)安装配置linu

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优