2013-03-19 71 views
0

該代碼與過濾_video.c(ffmpeg doc中的一個示例代碼)幾乎相似。爲什麼AVFormatContext指針在非全局結構對象中初始化,而在全局對象中是NULL?

在原始示例文件中,有許多全局靜態變量。這裏是第一個版本的代碼的一個片段(原來一樣的樣品):

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 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 

} 

結果爲第2版:代碼不能在avformat_open_input工作。沒有錯誤信息。該程序默默退出。 通過調試,我發現:inStruct.inFormatContext:0xffffefbd22b60000

在第三版的代碼中,我將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指針在非全局結構對象中初始化,而在全局對象中初始化爲零?

我不知道作爲全局變量或非全局變量的結構對象的定義有什麼區別。

回答

2

簡單。根據C++標準3.6.2初始化非本地對象的:

具有靜態存儲的持續時間(3.7.1)的對象應是零初始化(8.5)的任何其它初始化發生之前。

備註:您的問題重複。請在查詢之前仔細搜索StackOverflow。

+0

謝謝。我搜索了一下,並查看了C++素數。但我認爲我沒有找到好的關鍵字來搜索正確的頁面。 – user1914692 2013-03-20 00:14:52