[Libav-user] av_parser_parse2 crash

Brendan Jones brendan55555 at hotmail.com
Fri Mar 27 04:26:58 CET 2015

I am trying to decode my network dvr h264 socket stream directly using av_parser_parse2 but I get a crash when I try to parse the last portion of the buffer I'm passing to the parser. 
For example, if I read 80000 bytes from socket I can parse and then decode most of the data but the last piece passed to av_parser_parse2 causes a crash. 
I have tried different ways to make sure I not trying to pass more than there is in the buffer to the parser.
I'm not very knowledgeable regarding h264 but I suspect it might be because the parser can't parse the last portion of data  due to it wanting more from the socket.
Is there something I can do to avoid this crash ?
Here is my loop just in case it is something I am doing wrong..
int retval;

    uint8_t *inbuf = new uint8_t [20000000];

    int inbuf_start = 0;

    int inbuf_len = 0; 

    inbuf_start = 0;

    inbuf_len = 0;

    while (socket->waitForReadyRead()) 


        if(socket->bytesAvailable() > BUFFER_SIZE*2 ) 


        QByteArray   ba = socket->readAll();

        memcpy(inbuf + inbuf_len, ba.data(), ba.size() );

        inbuf_len += ba.size(); 

        qDebug() << "read bytes in buffer "<<ba.size();

        if (ba.size() == 0) 


            cerr << "read 0 bytes data." << endl;



        while (inbuf_len) 


            qDebug() << "before parse total to parse = "<<ba.size();

            qDebug()  << "parsed already "<< inbuf_start;

            qDebug() << "left to parse "<<inbuf_len;


            packet2.data = 0;

            packet2.size = 0;

            uint8_t *pout;

            int pout_len;

                len = av_parser_parse2(parser, c, &pout, &pout_len, 

                        inbuf + inbuf_start, inbuf_len,

                        AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0); 

            inbuf_start += len;

            inbuf_len -= len;

            packet2.data = pout;

            packet2.size = pout_len;

            if (len) 


                retval = avcodec_decode_video2(c, picture, &got_picture, &packet2);

                if (got_picture && retval > 0) 


                   display_frame(c->pix_fmt, picture, screen_pixz,  screen_contextz,  wind,  stride); 








Thank you.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20150327/75c2220d/attachment.html>

More information about the Libav-user mailing list