FFmpeg源码:bytestream2_peek_be32函数分析

一、bytestream2_peek_be32函数的声明

FFmpeg源码中bytestream2_peek_be32函数的声明如下:

cpp 复制代码
DEF(unsigned int, be32, 4, AV_RB32, AV_WB32)

该宏定义有多层。把它简化,其函数声明可以等价于:

cpp 复制代码
static unsigned int bytestream2_peek_be32(GetByteContext *g);

GetByteContext 结构体的定义为:

cpp 复制代码
typedef struct GetByteContext {
    const uint8_t *buffer, *buffer_end, *buffer_start;
} GetByteContext;

该结构体的用法一般是:成员buffer_start永久指向某个缓冲区的开头,成员buffer_end永久指向该缓冲区的末尾,成员buffer指向该缓冲区正在被读取的位置。

bytestream2_peek_be32函数作用是:如果g->buffer_start指向的缓冲区距离被读取到末尾 小于4个字节(g->buffer_end - g->buffer < 4),返回0。否则返回"按照大端模式 读取到的g->buffer指向的地方往后的4个字节"。

二、bytestream2_peek_be32函数的实现原理

FFmpeg源码目录下的libavcodec/bytestream.h中存在宏定义:

cpp 复制代码
DEF(unsigned int, be32, 4, AV_RB32, AV_WB32)

#define DEF(type, name, bytes, read, write)

static av_always_inline type bytestream2_peek_ ## name ## u(GetByteContext *g) \
{                                                                              \
    return read(g->buffer);                                                    \
}                          
                                                    \
static av_always_inline type bytestream2_peek_ ## name(GetByteContext *g)      \
{                                                                              \
    if (g->buffer_end - g->buffer < bytes)                                     \
        return 0;                                                              \
    return bytestream2_peek_ ## name ## u(g);                                  \
}

所以FFmpeg源码中的DEF(unsigned int, be32, 4, AV_RB32, AV_WB32) 等价于定义了函数:

cpp 复制代码
static __attribute__((always_inline)) inline unsigned int bytestream2_peek_be32u(GetByteContext *g)
{                                                                              
    return AV_RB32(g->buffer);                                                    
}

static __attribute__((always_inline)) inline unsigned int bytestream2_peek_be32(GetByteContext *g)
{                                                                             
    if (g->buffer_end - g->buffer < 4)                                     
        return 0;                                                              
    return bytestream2_peek_be32u(g);                                  \
}

可以看到bytestream2_peek_be32函数 调用了 bytestream2_peek_be32u函数,而bytestream2_peek_be32u函数又调用了AV_RB32这个宏定义。而根据《FFmpeg源码:AV_RB32宏定义分析》可以知道,AV_RB32(g->buffer)的作用是按照大端模式 读取g->buffer指向的缓冲区的前四个字节,并返回。从而可以了解到bytestream2_peek_be32函数的作用。

相关推荐
无敌最俊朗@1 天前
音视频播放的核心处理流程
ffmpeg
mortimer2 天前
搞懂FFmpeg中2个桀骜不驯的参数:CRF 与 Preset
ffmpeg·音视频开发·视频编码
2401_841495643 天前
Windows 系统中ffmpeg安装问题的彻底解决
windows·python·ffmpeg·bug·语音识别·下载·安装步骤
八月的雨季 最後的冰吻3 天前
FFmpeg --15-视频解码: AVIO内存输入模式分析
ffmpeg·音视频
aqi003 天前
FFmpeg开发笔记(八十八)基于Compose的国产电视直播开源框架MyTV
android·ffmpeg·音视频·直播·流媒体
present12273 天前
一段音频/视频分离成人声与伴奏,Windows + Anaconda 快速跑通 Spleeter(离线可用)
windows·职场和发展·ffmpeg·音视频·娱乐·媒体
fxshy4 天前
python使用ffmpeg对视频进行转码
python·ffmpeg·音视频
zhangzhangkeji4 天前
FFMPEG - 6:合并、提取音视频;截取、连接音视频,
ffmpeg·音视频
mortimer4 天前
FFmpeg 拼接视频-记录我踩过的坑
ffmpeg·音视频开发
aqi004 天前
FFmpeg开发笔记(八十七)采用Kotlin的手机开源播放器VLC-Android
android·ffmpeg·音视频·流媒体