[Libav-user] AVPacket av_malloc av_packet_unref question
salsaman at gmail.com
Mon Aug 22 04:45:35 EEST 2016
Yes. I have found you can also check if pkt->packet.size == 0 instead of
pkt->buf == NULL.
On Sun, Aug 21, 2016 at 9:36 PM, Charles <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> wrote:
>>> I have a piece of code that appears to work, that is to say it does
>>> 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
>>> packet (at least the buf).
>>> Question :
>>> What is av_malloc doing if the packet is getting unref and passed back
>>> 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
> * is valid indefinitely. In both cases the packet must be freed
> * 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
> Libav-user mailing list
> Libav-user at ffmpeg.org
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Libav-user