[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