Re: [FFmpeg-devel] [PATCH] avcodec/bsf: make sure the AVBSFInternal stored packet is reference counted

2018-03-23 Thread Paul B Mahol
On 3/23/18, James Almer  wrote:
> Some bitstream filters may buffer said packet in their own contexts
> for latter use.
> The documentation for av_bsf_send_packet() doesn't forbid feeding
> it non-reference counted packets, which depending on the way said
> packets were internally buffered by the bsf it may result in the
> data described in them to become invalid or unavailable at any time.
>
> This was the case with vp9_superframe after commit e1bc3f4396, which
> was then promptly fixed in 37f4a093f7 and 7a02b364b6. It is still the
> case even today with vp9_reorder_raw.
>
> With this change the bitstream filters will not have to worry how to
> store or consume the packets fed to them.
>
> Signed-off-by: James Almer 
> ---
> Regarding vp9_raw_reorder, see "[PATCH] avcodec/vp9_raw_reorder: cache
> input packets using new references" for a local fix similar to what
> vp9_superframe got with 37f4a093f7 and 7a02b364b6.
>
> A simple reproducer if you're curious is:
>
> ffmpeg -i INPUT -c:v copy -bsf:v vp9_raw_reorder -f null -
>
> Which segfauls with current git master.
>
> "[PATCH 2/2] ffmpeg: pass reference counted packets on codec copy
> when possible" also works around this in most cases by doing what its
> subject describes, but only affects the ffmpeg CLI only and not the
> API itself, of course.
>
>  libavcodec/bsf.c | 10 +-
>  1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/bsf.c b/libavcodec/bsf.c
> index 38b423101c..25f7a20ad6 100644
> --- a/libavcodec/bsf.c
> +++ b/libavcodec/bsf.c
> @@ -188,7 +188,15 @@ int av_bsf_send_packet(AVBSFContext *ctx, AVPacket
> *pkt)
>  ctx->internal->buffer_pkt->side_data_elems)
>  return AVERROR(EAGAIN);
>
> -av_packet_move_ref(ctx->internal->buffer_pkt, pkt);
> +if (pkt->buf)

Use { } here and below.

> +av_packet_move_ref(ctx->internal->buffer_pkt, pkt);
> +else {
> +int ret = av_packet_ref(ctx->internal->buffer_pkt, pkt);
> +
> +if (ret < 0)
> +return ret;
> +av_packet_unref(pkt);
> +}
>
>  return 0;
>  }
> --
> 2.16.2
>
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH] avcodec/bsf: make sure the AVBSFInternal stored packet is reference counted

2018-03-23 Thread wm4
On Fri, 23 Mar 2018 18:38:22 -0300
James Almer  wrote:

> Some bitstream filters may buffer said packet in their own contexts
> for latter use.
> The documentation for av_bsf_send_packet() doesn't forbid feeding
> it non-reference counted packets, which depending on the way said
> packets were internally buffered by the bsf it may result in the
> data described in them to become invalid or unavailable at any time.
> 
> This was the case with vp9_superframe after commit e1bc3f4396, which
> was then promptly fixed in 37f4a093f7 and 7a02b364b6. It is still the
> case even today with vp9_reorder_raw.
> 
> With this change the bitstream filters will not have to worry how to
> store or consume the packets fed to them.
> 
> Signed-off-by: James Almer 
> ---
> Regarding vp9_raw_reorder, see "[PATCH] avcodec/vp9_raw_reorder: cache
> input packets using new references" for a local fix similar to what
> vp9_superframe got with 37f4a093f7 and 7a02b364b6.
> 
> A simple reproducer if you're curious is:
> 
> ffmpeg -i INPUT -c:v copy -bsf:v vp9_raw_reorder -f null -
> 
> Which segfauls with current git master.
> 
> "[PATCH 2/2] ffmpeg: pass reference counted packets on codec copy
> when possible" also works around this in most cases by doing what its
> subject describes, but only affects the ffmpeg CLI only and not the
> API itself, of course.
> 
>  libavcodec/bsf.c | 10 +-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/libavcodec/bsf.c b/libavcodec/bsf.c
> index 38b423101c..25f7a20ad6 100644
> --- a/libavcodec/bsf.c
> +++ b/libavcodec/bsf.c
> @@ -188,7 +188,15 @@ int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt)
>  ctx->internal->buffer_pkt->side_data_elems)
>  return AVERROR(EAGAIN);
>  
> -av_packet_move_ref(ctx->internal->buffer_pkt, pkt);
> +if (pkt->buf)
> +av_packet_move_ref(ctx->internal->buffer_pkt, pkt);
> +else {
> +int ret = av_packet_ref(ctx->internal->buffer_pkt, pkt);
> +
> +if (ret < 0)
> +return ret;
> +av_packet_unref(pkt);
> +}
>  
>  return 0;
>  }

Fine, but we should probably really provide an API function that
ensures that a packet is refcounted (and made refcounting if it isn't).
av_dup_packet() does this, but it's deprecated and has a bad name.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH] avcodec/bsf: make sure the AVBSFInternal stored packet is reference counted

2018-03-23 Thread James Almer
On 3/23/2018 7:46 PM, wm4 wrote:
> On Fri, 23 Mar 2018 18:38:22 -0300
> James Almer  wrote:
> 
>> Some bitstream filters may buffer said packet in their own contexts
>> for latter use.
>> The documentation for av_bsf_send_packet() doesn't forbid feeding
>> it non-reference counted packets, which depending on the way said
>> packets were internally buffered by the bsf it may result in the
>> data described in them to become invalid or unavailable at any time.
>>
>> This was the case with vp9_superframe after commit e1bc3f4396, which
>> was then promptly fixed in 37f4a093f7 and 7a02b364b6. It is still the
>> case even today with vp9_reorder_raw.
>>
>> With this change the bitstream filters will not have to worry how to
>> store or consume the packets fed to them.
>>
>> Signed-off-by: James Almer 
>> ---
>> Regarding vp9_raw_reorder, see "[PATCH] avcodec/vp9_raw_reorder: cache
>> input packets using new references" for a local fix similar to what
>> vp9_superframe got with 37f4a093f7 and 7a02b364b6.
>>
>> A simple reproducer if you're curious is:
>>
>> ffmpeg -i INPUT -c:v copy -bsf:v vp9_raw_reorder -f null -
>>
>> Which segfauls with current git master.
>>
>> "[PATCH 2/2] ffmpeg: pass reference counted packets on codec copy
>> when possible" also works around this in most cases by doing what its
>> subject describes, but only affects the ffmpeg CLI only and not the
>> API itself, of course.
>>
>>  libavcodec/bsf.c | 10 +-
>>  1 file changed, 9 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavcodec/bsf.c b/libavcodec/bsf.c
>> index 38b423101c..25f7a20ad6 100644
>> --- a/libavcodec/bsf.c
>> +++ b/libavcodec/bsf.c
>> @@ -188,7 +188,15 @@ int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt)
>>  ctx->internal->buffer_pkt->side_data_elems)
>>  return AVERROR(EAGAIN);
>>  
>> -av_packet_move_ref(ctx->internal->buffer_pkt, pkt);
>> +if (pkt->buf)
>> +av_packet_move_ref(ctx->internal->buffer_pkt, pkt);
>> +else {
>> +int ret = av_packet_ref(ctx->internal->buffer_pkt, pkt);
>> +
>> +if (ret < 0)
>> +return ret;
>> +av_packet_unref(pkt);
>> +}
>>  
>>  return 0;
>>  }
> 
> Fine, but we should probably really provide an API function that
> ensures that a packet is refcounted (and made refcounting if it isn't).
> av_dup_packet() does this, but it's deprecated and has a bad name.

av_packet_ref() ensures that, and so does av_packet_make_writable(), but
as a side effect of their main intended use. The documentation even
states to use av_packet_ref() for that purpose.

If you want one exactly like av_dup_packet() but in a less hacky way
that exclusively does "Make this packet's data ref counted if it's not,
do nothing else", we could add an av_packet_make_refcounted() function
or whatever. It should be trivial, so just tell me a name you'd like for
it and I'll write it.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH] avcodec/bsf: make sure the AVBSFInternal stored packet is reference counted

2018-03-23 Thread James Almer
On 3/23/2018 8:15 PM, James Almer wrote:
> On 3/23/2018 7:46 PM, wm4 wrote:
>> On Fri, 23 Mar 2018 18:38:22 -0300
>> James Almer  wrote:
>>
>>> Some bitstream filters may buffer said packet in their own contexts
>>> for latter use.
>>> The documentation for av_bsf_send_packet() doesn't forbid feeding
>>> it non-reference counted packets, which depending on the way said
>>> packets were internally buffered by the bsf it may result in the
>>> data described in them to become invalid or unavailable at any time.
>>>
>>> This was the case with vp9_superframe after commit e1bc3f4396, which
>>> was then promptly fixed in 37f4a093f7 and 7a02b364b6. It is still the
>>> case even today with vp9_reorder_raw.
>>>
>>> With this change the bitstream filters will not have to worry how to
>>> store or consume the packets fed to them.
>>>
>>> Signed-off-by: James Almer 
>>> ---
>>> Regarding vp9_raw_reorder, see "[PATCH] avcodec/vp9_raw_reorder: cache
>>> input packets using new references" for a local fix similar to what
>>> vp9_superframe got with 37f4a093f7 and 7a02b364b6.
>>>
>>> A simple reproducer if you're curious is:
>>>
>>> ffmpeg -i INPUT -c:v copy -bsf:v vp9_raw_reorder -f null -
>>>
>>> Which segfauls with current git master.
>>>
>>> "[PATCH 2/2] ffmpeg: pass reference counted packets on codec copy
>>> when possible" also works around this in most cases by doing what its
>>> subject describes, but only affects the ffmpeg CLI only and not the
>>> API itself, of course.
>>>
>>>  libavcodec/bsf.c | 10 +-
>>>  1 file changed, 9 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/libavcodec/bsf.c b/libavcodec/bsf.c
>>> index 38b423101c..25f7a20ad6 100644
>>> --- a/libavcodec/bsf.c
>>> +++ b/libavcodec/bsf.c
>>> @@ -188,7 +188,15 @@ int av_bsf_send_packet(AVBSFContext *ctx, AVPacket 
>>> *pkt)
>>>  ctx->internal->buffer_pkt->side_data_elems)
>>>  return AVERROR(EAGAIN);
>>>  
>>> -av_packet_move_ref(ctx->internal->buffer_pkt, pkt);
>>> +if (pkt->buf)
>>> +av_packet_move_ref(ctx->internal->buffer_pkt, pkt);
>>> +else {
>>> +int ret = av_packet_ref(ctx->internal->buffer_pkt, pkt);
>>> +
>>> +if (ret < 0)
>>> +return ret;
>>> +av_packet_unref(pkt);
>>> +}
>>>  
>>>  return 0;
>>>  }
>>
>> Fine, but we should probably really provide an API function that
>> ensures that a packet is refcounted (and made refcounting if it isn't).
>> av_dup_packet() does this, but it's deprecated and has a bad name.
> 
> av_packet_ref() ensures that, and so does av_packet_make_writable(), but
> as a side effect of their main intended use. The documentation even
> states to use av_packet_ref() for that purpose.
> 
> If you want one exactly like av_dup_packet() but in a less hacky way
> that exclusively does "Make this packet's data ref counted if it's not,
> do nothing else", we could add an av_packet_make_refcounted() function
> or whatever. It should be trivial, so just tell me a name you'd like for
> it and I'll write it.

Patch pushed in the meantime.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel