[Libav-user] AVPacket av_malloc av_packet_unref question

Charles linux2 at orion15.org
Mon Aug 22 04:49:51 EEST 2016


Is there good information somewhere outlining sync between stream and frame?
Like how to handle the 257 in frame that finishes before you make the 256 getFrame call
av_read_frame returns 0 not EAGAIN

Are the contex thread safe, i.e. one ctx one thread...running multiple decode/encode threads?

Thanks
cco


On 08/21/2016 08:45 PM, salsaman wrote:
> Yes. I have found you can also check if pkt->packet.size == 0 instead of pkt->buf == NULL.
>
>
> Regards,
> Gabriel.
>
>
>
>
> http://lives-video.com
> https://www.openhub.net/accounts/salsaman
>
> On Sun, Aug 21, 2016 at 9:36 PM, Charles <linux2 at orion15.org <mailto:linux2 at orion15.org>> wrote:
>
>     On 08/21/2016 07:23 PM, Brian Brice wrote:
>
>         You should probably use av_packet_alloc instead of av_malloc on the
>         AVPacket.  This will ensure that each field is initialized properly.
>
>         The demuxer could set the data pointer to its own internal storage
>         (when buf is NULL) which can be reused when you call av_read_frame
>         another time.  The call to av_packet_unref is mostly to decrement the
>         reference count on the buf pointer.  It does other things, like
>         releasing the side data and resetting the fields to some default.
>
>         On Fri, Aug 19, 2016 at 3:31 PM, Charles <linux2 at orion15.org <mailto:linux2 at orion15.org>> wrote:
>
>             I have a piece of code that appears to work, that is to say it does stream
>             packets..
>             It goes like this:
>             av_packet = (AVPacket *) av_malloc( sizeof( AVPacket ) );
>             while ( 1 ) /// reading in from file out to mpegts
>             {
>                av_read_frame( av_in_fmt_ctx, m_avpacket );
>             [...]
>                ret = av_interleaved_write_frame( av_out_fmt_ctx, av_packet );
>                av_packet_unref( av_packet );
>             }
>
>             In the include headers I find this type of verbage ::
>              * The side data is always allocated with av_malloc(), copied by
>              * av_packet_ref() and freed by av_packet_unref().
>
>             From reading the av_read_frame I know the packed is a reference to another
>             packet (at least the buf).
>
>             Question :
>             What is av_malloc doing if the packet is getting unref and passed back into
>             av_read_frame without another malloc?
>
>             Follow Up :
>             Is this thread safe?
>
>
>     This may be poor form but I just declared an AVPacket
>
>        /// \note setup stuff used in ReadFrame
>        av_init_packet( &av_pkt );
>        av_pkt.data = NULL;  /// demux will allocate
>        av_pkt.size = 0;
>     [...]
>
>        Comments from av_read_frame
>
>              * If pkt->buf is NULL, then the packet is valid until the next
>              * av_read_frame() or until avformat_close_input(). Otherwise the packet
>              * is valid indefinitely. In both cases the packet must be freed with
>              * av_packet_unref when it is no longer needed.
>
>     I am using the new ABI avcodec_send_packet / avcodec_receive_frame
>     Since it is a spinning thread, the packet stays in scope and I just never delete it...
>     Seems to work ok
>
>
>     Thanks
>     cco
>
>     _______________________________________________
>     Libav-user mailing list
>     Libav-user at ffmpeg.org <mailto:Libav-user at ffmpeg.org>
>     http://ffmpeg.org/mailman/listinfo/libav-user <http://ffmpeg.org/mailman/listinfo/libav-user>
>
>
>
>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user
>



More information about the Libav-user mailing list