2014-06-12 3 views
0

la méthode avcodec_decode_video2 se bloque lorsque j'essaie d'affecter le fichier avpkt.size. Quand je le mets à 0 ça marche, mais ça ne décode rien (la valeur de retour est 0). Suis-je quelque chose manquant, ou quelle valeur doit être assignée à avpklt.size? Je veux décoder une image codée dans le paramètre istream.avcodec_decode_video2 se bloque, lorsque avpkt.size est affecté

Merci

int DecodeVideoFFMPEG::dec_main(void *istream, void *outstream, int width, int height) 
{ 

    avcodec_register_all(); 
    int got_picture; 

    int BYTEPIC = width * height * 3; 
    AVCodecContext *d; 
    AVCodec *decodec = avcodec_find_encoder(CODEC_ID_WMV1); 


    d = avcodec_alloc_context3(decodec); 
    d->codec_id = CODEC_ID_WMV1; 
    d->pix_fmt = PIX_FMT_YUV420P; 
    d->width = width; 
    d->height = height; 
    d->time_base.num = 1; 
    d->time_base.den = 25; 

    int status = avcodec_open2(d, decodec, NULL); 

    AVFrame *picture2 = alloc_picture420P(width, height); 
    AVFrame *pictureBGR = alloc_pictureBGR24(width, height); 

    AVPacket avpkt; 
    av_init_packet(&avpkt); 

    unsigned char *image = new unsigned char[BYTEPIC]; 
    memcpy(image, istream, BYTEPIC); 

    avpkt.data = image; 
    avpkt.size = BYTEPIC; // ???? 

    //prepare for changing color space 
    struct SwsContext *img_convert_ctx2 = 
    sws_getContext(width, height, PIX_FMT_YUV420P, 
    width, height, PIX_FMT_BGR24, 
    SWS_BICUBIC, NULL, NULL, NULL); 

    int len = avcodec_decode_video2(d, picture2, &got_picture, &avpkt); 

    sws_scale(img_convert_ctx2, picture2->data, picture2->linesize, 0, height, pictureBGR->data, pictureBGR->linesize); 

    outstream = pictureBGR->data; 

    return len; 
} 
+0

Ok j'ai trouvé l'erreur .. J'ai besoin d'utiliser avcodec_find_decoder (CODEC_ID_WMV1) évidemment;) + severel autres erreurs noob, comme l'allocation en amont – vacetahanna

Répondre

0

Vous passez un tampon à avcodec_decode_video2() qui ne contient pas de vidéo codées. C'est une opération complètement invalide.

+0

Mais avec les deux lignes unsigned char * image = new unsigned char [BYTEPIC] ; memcpy (image, istream, BYTEPIC); Je passe le tampon rempli des paramètres (istream), et l'encodage avant me donne une taille de paquets, donc je suis sûr qu'il y a du contenu dans ce tampon – vacetahanna

+0

Où est BYTEPIC = width * height * 3; provenir de? Vous faites une (mauvaise) hypothèse sur la taille de la trame codée. Vous ne vérifiez pas non plus le résultat de got_picture. – szatmary

+0

Oui, vous avez raison, je l'ai réalisé une heure après l'avoir posté, et j'ai ajouté un paramètre où la taille exacte du paquet encodé est passée, puis utilisée comme avpkt.size, mais elle se bloque toujours. et je ne peux pas vérifier got_picture, car il se bloque avant – vacetahanna

Questions connexes