[Libav-user] AVPacket av_malloc av_packet_unref question

Charles linux2 at orion15.org
Mon Aug 22 03:36:27 EEST 2016


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



More information about the Libav-user mailing list