2013-03-19 8 views
0

Le code est presque similaire au filtrage _video.c, un exemple de code dans ffmpeg doc.Pourquoi le pointeur AVFormatContext est initialisé dans un objet struct non global, alors que NULL dans un objet global?

Dans le fichier d'exemple d'origine, il existe de nombreuses variables statiques globales. Voici un extrait du 1er code de version (le même que l'échantillon d'origine):

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 

} 

Depuis servent toutes ces variables pour un fichier vidéo ouvert, je préfère les regrouper. Le but de mon code est donc de réorganiser ces variables, ce qui rend le fichier source plus structuré.

La première idée qui m'est venue à l'esprit est d'utiliser struct.

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

Maintenant, la 2ème version du code devient:

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 

} 

Résultat de la 2ème version: le code ne peut pas fonctionner au avformat_open_input. Aucune information d'erreur. Le programme se termine silencieusement. Par le débogage, je trouve que: inStruct.inFormatContext: 0xffffefbd22b60000

Dans la 3ème version du code, je définis inStruct comme une variable globale. Le code devient:

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 

} 

Résultat pour la 3ème version: le code fonctionne. Par le débogage, je trouve que: inStruct.inFormatContext: 0x0

Donc, je pense que la raison est la suivante: le AVFormatContext devrait être initialisé à zéro pour avformat_open_input pour fonctionner. Maintenant, la question est:

Pourquoi le pointeur AVFormatContext est initialisé dans un objet struct non global, alors que l'initialisation zéro dans un objet global?

Je ne connais aucune différence de définition d'un objet struct en tant que variable globale ou variable non globale.

Répondre

2

Facile. Selon le C++ standard dans 3.6.2 Initialisation des objets non locaux:

objets avec la durée de stockage statique (3.7.1) est égal à zéro-initialisé (8,5) avant toute autre initialisation a lieu.

NOTE: Votre question est en double. Veuillez rechercher StackOverflow plus attentivement avant de demander.

+0

Merci. J'ai cherché, et j'ai regardé dans le prime C++. Mais je pense que je n'ai pas trouvé de bons mots-clés pour rechercher les bonnes pages. – user1914692