音视频编解码–PNG格式代码走读

PNG格式是一种流行的图像文件格式,编解码是音视频编解码中的重要一环。在本文中,我们引用了FFMPEG 5.0中的代码,深入探讨了PNG编解码的实现。

在具体的代码实现中,涉及到了一些重要的文件和属性,如pngenc.h,pngenc.c,zlib_wrapper.h,zlib_wrapper.c和lossless_videoencdsp.c等。

pngpng.c,png.h
png encoderlibavcodecpngenc.h,libavcodecpngenc.c
deflatelibavcodeczlib_wrapper.h,libavcodeczlib_wrapper.c
lossless_videoencdsplibavcodeclossless_videoencdsp.hlibavcodeclossless_videoencdsp.c

本文重点讲解PNG格式encode_frame相关逻辑,该接口主要作用将图像数据转换成PNG格式,使得图像能够在网络上传输和存储。代码实现涉及到之前文章中讲解到的逻辑和算法,有需要的可以翻看。

图片

encode_frame

其主要的接口如下图所示:

图片
图片

ff_png_pass_row_size

计算PNG图像编码时某个隔行扫描通道的行大小。该函数根据给定的隔行扫描通道号、每个像素的位数和图像宽度等参数,计算出该通道的一行所占用的字节数,用于编码时的计算。

图片

其中涉及到几个关键输入如下图所示,需要注意下:

图片

png_get_interlaced_row

该函数主要作用:获取PNG图像编码中某个隔行扫描通道中的一行像素数据。

图片

png_choose_filter

在预测模式的选择上,我们可以使用none,sub,up,avg,paeth等模式。

图片

png_filter_row

该函数用于对一行PNG图像数据进行预测滤波处理,相对比较容易理解,再次不做过多介绍。

图片

sub_left_prediction

实现了PNG图像编码中的左侧像素预测操作。主要过程是首先将源图像src的前bpp个字节直接复制到目标图像dst的对应位置,然后对源图像的剩余像素执行左侧预测操作,然后得到编码后的图像数据。

图片

sub_png_paeth_prediction

该函数实现了PNG图像编码中的Paeth像素预测操作。主要过程是对源图像的每个像素进行编码,根据已编码的左侧、上侧和左上侧的像素值,选择合适的预测值进行编码,最终得到编码后的图像数据。

图片

png_write_row

该函数主要作用将一行像素数据写入PNG图像中,输入三个参数:指向 AVCodecContext 结构体的指针、指向 uint8_t 类型的数据指针 data 和具体数据大小size,相关备注可以查看图片中注释:

图片

png_write_image_data

该函数主要作用:将图像数据以块的形式写入输出字节流中。输入三个参数为:AVCodecContext *avctx:指向AVCodecContext结构体的指针,其中包含编码上下文。const uint8_t *buf:指向包含图像数据的输入缓冲区的指针。int length:输入缓冲区的长度。相关备注可以查看图片中注释:

图片

png_write_chunk

该函数用于向输出字节流中写入PNG数据块,同时执行CRC检查以确保数据块的完整性。输入四个参数为:uint8_t **f: 指向指针的指针,指向当前数据块的位置。uint32_t tag: 4字节的标签,用于识别数据块类型。const uint8_t *buf: 指向包含要写入数据块的缓冲区的指针。int length: 缓冲区中要写入的字节数。相关备注可以查看图片中注释:

图片

特别备注

在查看代码过程中发现以下几个函数并没有找到具体实现,最后发现相关代码是在zlib库完成的。其实在引用的头文件中已经有相关引用了。这是一个很常见的情况。有些函数的实现可能是在其他的库文件中,而在头文件中只是声明了函数的存在。这样做的好处是可以减小代码的体积,同时提高代码的可复用性。在使用这些函数时,只需要把相应的库文件链接到程序中即可。当然,要注意库文件的版本和兼容性,以确保程序的正确性和稳定性。

inflateInit、inflateEnd、deflateInit、deflateEnd

图片

感兴趣的童鞋可以在github上查看。

https://github.com/madler/zlib

https://refspecs.linuxbase.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/zlib-deflateend-1.html

总之,本文为我们深入了解PNG编解码提供了一些参考,希望对大家有所帮助。

作者:MediaStack

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论