![](/img/trans.png)
[英]Do avcodec_receive_frame and avcodec_send_packet block / how to design ffmpeg decoding loop?
[英]How to force avcodec to use unaligned frame data planes?
我一直在搜索高低,以强制avcodec为其AVFrame数据使用未对齐的内存。
根据像素格式,AVFrame->数据的水平平面可以用额外数据填充,以便与存储器对齐以提高性能。
例如:每像素4字节的1920 * 1080视频每个平面将具有1920 * 4 = 7680字节。
使用avcodec如果要解码此视频,它将为每个平面创建7808个字节。
这增加了7808 - 7680 = 128字节的额外填充。
为了我的目的,我想强制avcodec使用未对齐的数据,这样我就可以复制整个连续的帧数据块,而不是一次一个地复制和格式化较小的块到一个连续的块。
标题中包含以下标志:
/* encoding support
These flags can be passed in AVCodecContext.flags before initialization.
Note: Not everything is supported yet.
*/
/**
* Allow decoders to produce frames with data planes that are not aligned
* to CPU requirements (e.g. due to cropping).
*/
#define CODEC_FLAG_UNALIGNED 0x0001
将此AVCodecContext.flags设置为CODEC_FLAG_UNALIGNED,假设AVFrame->数据现在是未对齐的,情况并非如此。
我不确定我是否正确地看着正确的地方或使用这个标志。
问候,
好奇的乔治
解码后,您可以使用swrescale将像素格式化为您提供的内存缓冲区。 只需将输入和输出分辨率设置为相同,分配一块内存,并将行间距设置为等于帧宽。
ffmpeg
一个重要事情是始终检查任何实际上关心已定义选项的内容。 看起来好像很多编解码器实际上都使用这个标志:
~/sources/ffmpeg-2.1.1> find libavcodec/ -name \*.c | xargs grep CODEC_FLAG_UNALIGNED
libavcodec/hevc_ps.c: !(s->avctx->flags & CODEC_FLAG_UNALIGNED)) {
libavcodec/h264_ps.c: !(h->avctx->flags & CODEC_FLAG_UNALIGNED)) {
~/sources/ffmpeg-2.1.1>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.