[Libav-user] AVPacket av_malloc av_packet_unref question

salsaman 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.


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> 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
>>> 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
> http://ffmpeg.org/mailman/listinfo/libav-user
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20160821/6113e23b/attachment.html>


More information about the Libav-user mailing list