为什么AVFormatContext指针在非全局结构对象中初始化,而在全局对象中为NULL?

时间:2013-03-19 22:21:15

标签: c++ struct ffmpeg global

代码几乎类似于过滤_video.c,ffmpeg doc中的一个示例代码。

在原始示例文件中,有许多全局静态变量。这是第一版代码的一个片段(与原始样本相同):

static AVFormatContext *fmt_ctx;
static AVCodecContext *dec_ctx;

int main(int argc, char **argv) {

// ....  other code
    if ((ret = avformat_open_input(&fmt_ctx, filename, NULL, NULL)) < 0) {
        av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
        return ret;
    }

// .... other code

}

由于所有这些变量都用于打开视频文件,我更喜欢将它们分组。所以我的代码的目的是重新排列这些变量,使源文件更加结构化。

我想到的第一个想法是使用struct。

struct structForInVFile {
    AVFormatContext *inFormatContext;
    AVCodecContext *inCodecContext;
    AVCodec* inCodec;
    AVPacket inPacket;
    AVFrame *inFrame;
    int video_stream_index;
    int inFrameRate;
    int in_got_frame;
};

现在第二版代码变为:

int main(int argc, char **argv) {

// .... other code
structForInVFile inStruct;

    if ((ret = avformat_open_input(&inStruct.inFormatContext, filename, NULL, NULL)) < 0) {
        av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
        return ret;
    }

// .... other code

}

第二版的结果:代码无法在avformat_open_input中运行。没有错误信息。程序默默地退出。 通过调试,我发现:inStruct.inFormatContext:0xffffefbd22b60000

在第3版代码中,我将inStruct设置为全局变量。 代码变为:

structForInVFile inStruct;

int main(int argc, char **argv) {

// .... other code
    if ((ret = avformat_open_input(&inStruct.inFormatContext, filename, NULL, NULL)) < 0) {
        av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
        return ret;
    }

// .... other code

}

第3版的结果:代码有效。 通过调试,我发现:inStruct.inFormatContext:0x0

所以我认为原因是:AVFormatContext应该零初始化,以便avformat_open_input工作。 现在,问题是:

为什么AVFormatContext指针在非全局结构对象中初始化,而在全局对象中进行零初始化?

我不知道struct对象的定义是全局变量还是非全局变量。

1 个答案:

答案 0 :(得分:2)

易。根据 3.6.2初始化非本地对象中的 C ++标准

具有静态存储持续时间(3.7.1)的对象应在进行任何其他初始化之前进行零初始化(8.5)。

注意:您的问题是重复的。请在询问之前仔细搜索StackOverflow。