- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Bellow 是 libavcodec/h264.h 中定义的 ffmpeg 中的一个函数:
static av_always_inline void write_back_intra_pred_mode(const H264Context *h,
H264SliceContext *sl)
{
int8_t *i4x4 = sl->intra4x4_pred_mode + h->mb2br_xy[sl->mb_xy];
int8_t *i4x4_cache = sl->intra4x4_pred_mode_cache;
AV_COPY32(i4x4, i4x4_cache + 4 + 8 * 4);
i4x4[4] = i4x4_cache[7 + 8 * 3];
i4x4[5] = i4x4_cache[7 + 8 * 2];
i4x4[6] = i4x4_cache[7 + 8 * 1];
}
最佳答案
该函数更新帧内预测模式的帧宽缓存(以 4x4 block 分辨率),位于变量 sl->intra4x4_pred_mode
中。每片或 h->intra4x4_pred_mode
对于整个框架。此缓存稍后用于 h264_mvpred.h
,特别是函数fill_decode_caches()
绕线510-528 ,设置上下文(左/上邻居) block 信息,用于解码位于当前 4x4 block 集下方或右侧的后续 4x4 block 。
[编辑]
好的,更多关于变量设计的内容在这里。 sl->mb_xy 是 sl->mb_x + sl->mb_y * mb_stride。将 mb_stride 视为图像宽度(以 mbs 为单位)的填充版本。所以 mb_xy 是当前宏 block 的光栅有序索引。一些变量以 block (4x4) 而非宏 block (16x16) 分辨率进行索引,因此要在单位之间进行转换,请使用 mb2br_xy。这应该可以解释帧宽缓存的布局(intra4x4_pred_mode/i4x4)。
现在,本地每个宏 block 缓存,它包含当前宏 block 的 4x4 条目,加上左/上边缘条目,所以 5x5。然而,在一条 lea 指令中,乘以 5 需要 2 个寄存器,而 8 只需要一个,所以我们更喜欢 8(更一般地说,我们更喜欢 2 的幂)。所以分辨率变成8(width)x5(height),总共40个entry,其中每行左边3个是未使用的,第4个是左边,右边4个是当前宏 block 的实际entry。顶行在上面,下面的4行是当前宏 block 的实际条目。
因此,从缓存到帧宽缓存的备份使用 8 作为步幅,4/3/2/1 作为 y=3/2/1/0 的索引,4-7 作为 x=0-3 的索引。在 backcopy 中,您会注意到我们实际上并没有复制整个 4x4 block ,而只是复制了最后一行(AVCOPY32 复制了 4 个条目,offset=4[y=3]+8[stride]*4[x=0] ) 和其他每一行的最右侧条目 (7[x=3]+8[stride]*1-3[y=0-2])。这是因为只有右/下边缘作为 future 宏 block 解码的上/左上下文是有趣的,所以其余的都是不必要的。
如图所示,i4x4_pred_mode_cache 的布局为:
x x x TL T0 T1 T2 T3
x x x L0 00 01 02 03
x x x L1 10 11 12 13
x x x L2 20 21 22 23
x x x L3 30 31 32 33
TL T0-3 x x x
(其余行依此类推);原因是在帧范围和 block 本地缓存中,T0-3(和 00-03、10-13、20-23、30-33)是 4 字节对齐的 4 种模式集,这意味着在大多数机器上,在一条指令 (COPY32) 中复制 4 个条目要快得多。如果我们做了一个未对齐的副本,这会增加额外的开销并(稍微)减慢解码速度。
关于ffmpeg - libavcodec 中的 write_back_intra_pred_mode() 函数有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34738979/
我需要在H.264容器中快速搜索MP4编码的视频流。我使用libav解码帧,因此偶然发现avformat_seek_file()方法。 我的问题是,假设H.264流以关键帧开头,而当我寻求时间戳0(无
我正在尝试解码用 H264 编码的视频。我将 AVPacket 的数据及其大小发送到解码器代码。我正在尝试解码帧并将其显示在 GUI 上。问题是当我解码帧时,它返回的帧字节数与数据包的大小相同,这意味
我想使用 libavcodec对于一个项目,问题是我不明白我应该从哪里获得官方版本,这个库非常受欢迎,我不知道官方网站是什么。 例如有 2 个主要项目,如 libav和 ffmpeg正在使用它,但我找
这是我使用 ffmpeg 的 libav* 解码音频流的过程 [videofile]--> (read audio packets) --> [pkts queue] --> (decoder) --
我有一个用 .3gp h.264 编码的视频,我希望在 C 中获得它的帧率和持续时间。这是我在打开后使用的代码文件并找到合适的编解码器: AVRational rational = gVideoCod
我正在通过 v4l 从相机中抓取视频帧,我需要将它们转码为 mpeg4 格式,以便通过 RTP 连续流式传输它们。 一切实际上都“有效”,但在重新编码时有些东西我没有:输入流产生 15fps,而输出为
我正在学习使用 libavcodec 进行编程。但我卡住了。我使用的所有教程都是视频文件,我需要一个音频文件。我正在使用 Ubuntu。 我应该如何从音频流中读取 AVCodecContext? 顺便
我正在使用 9.7 版的 libavcodec 编写一个简单的演示,几乎与 official example 中的示例完全相同。 . 但是,我无法打开编码器。另外,av_opt_set(context
我按照 Dranger 的教程使用 libav 和 FFMPEG 显示视频。 http://dranger.com/ffmpeg/ avcodec_decode_video2 似乎是视频解码过程中最慢
我正在尝试使用 ffmpeg 库制作一个最简单的应用程序。 这是我的代码: 主.c: #include #include #include int main() { avformat_n
什么AvPixelFormat我应该使用 *.png(PNG-24 和 PNG-8)图像吗? 我正在尝试使用 sws_scale 从 png 转换为 PIX_FMT_YUV420P 编辑,代码: av
我正在尝试使用 FFMpeg 中的 libavcodec 库来解码然后重新编码 h264 视频。 我有解码部分工作(很好地渲染到一个 SDL 窗口)但是当我尝试重新编码帧时,我在重新编码的视频样本中得
我有一个与 ffmpeg 库链接的 C++ 计算机视觉应用程序,该库提供从视频流到分析例程的帧。这个想法可以提供一个中等通用的视频流标识符,并且视频源将被解压缩并逐帧传递给分析例程(运行用户的分析功能
我想改变 gop 动态以适应玩家。较小的 gop 有助于降低首屏成本; Big gop 有助于降低比特率以节省带宽。 我发现nvenc有一个可以解决上述问题的功能。 https://docs.nvid
我想制作一个从 h.264 到 h.265 的转码视频应用程序。 我对 有疑问libavcodec 图书馆。我的项目中有这个库,所有功能都在工作,但是当我尝试设置编解码器时:avcodec_find_
当尝试获取 AVFrame 的时间戳时,有一个名为 best_effort_timestamp 的字段它描述为: frame timestamp estimated using various heu
除了调用 av_register_all(),是否有选择使用单个解码器的示例? 我想我将不得不调用 avcodec_register()、av_register_codec_parser() 等...
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 7年前关闭。 Improve th
我下载了一个软件( info-beamer ),我想使用 GPU 加速来解码 H.264 视频。我知道我的平台能够使用 GPU 解码 H.264 视频。我使用以下命令对 gstreamer 进行了一些
我正在 try catch 相机输出并使用 libavcodec 制作视频。作为如何完成此操作的示例,我使用了 ffmpeg muxing example . 问题是 4 秒视频的大小约为 15mb,
我是一名优秀的程序员,十分优秀!