Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH 1/3] avcodec/avcodec: prevent ch_layout from being uninitialized in ff_codec_close()
@ 2024-05-01 19:01 James Almer
  2024-05-01 19:01 ` [FFmpeg-devel] [PATCH 2/3] avcodec/avcodec: don't free coded_side_data in ff_codec_close() when decoding James Almer
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: James Almer @ 2024-05-01 19:01 UTC (permalink / raw)
  To: ffmpeg-devel

It's a user-set parameter shared with AVCodecParameters, so it should only
be freed by avcodec_free_context().

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavcodec/avcodec.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index 888dd76228..fc8a40e4db 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -414,6 +414,7 @@ void avsubtitle_free(AVSubtitle *sub)
 
 av_cold void ff_codec_close(AVCodecContext *avctx)
 {
+    AVChannelLayout ch_layout;
     int i;
 
     if (!avctx)
@@ -468,7 +469,13 @@ av_cold void ff_codec_close(AVCodecContext *avctx)
 
     if (avctx->priv_data && avctx->codec && avctx->codec->priv_class)
         av_opt_free(avctx->priv_data);
+
+    // Work around av_opt_free() unsetting ch_layout
+    ch_layout = avctx->ch_layout;
+    memset(&avctx->ch_layout, 0, sizeof(avctx->ch_layout));
     av_opt_free(avctx);
+    avctx->ch_layout = ch_layout;
+
     av_freep(&avctx->priv_data);
     if (av_codec_is_encoder(avctx->codec)) {
         av_freep(&avctx->extradata);
-- 
2.44.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [FFmpeg-devel] [PATCH 2/3] avcodec/avcodec: don't free coded_side_data in ff_codec_close() when decoding
  2024-05-01 19:01 [FFmpeg-devel] [PATCH 1/3] avcodec/avcodec: prevent ch_layout from being uninitialized in ff_codec_close() James Almer
@ 2024-05-01 19:01 ` James Almer
  2024-05-01 20:40   ` Andreas Rheinhardt
  2024-05-01 19:01 ` [FFmpeg-devel] [PATCH 3/3] avcodec/avcodec: free decoded_side_data " James Almer
  2024-05-01 20:26 ` [FFmpeg-devel] [PATCH 1/3] avcodec/avcodec: prevent ch_layout from being uninitialized in ff_codec_close() Andreas Rheinhardt
  2 siblings, 1 reply; 10+ messages in thread
From: James Almer @ 2024-05-01 19:01 UTC (permalink / raw)
  To: ffmpeg-devel

It's a user-set parameter shared with AVCodecParameters, so it should only
be freed by avcodec_free_context().

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavcodec/avcodec.c | 11 ++++++-----
 libavcodec/options.c |  4 ++++
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index fc8a40e4db..e560efff6a 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -458,11 +458,12 @@ av_cold void ff_codec_close(AVCodecContext *avctx)
 
         av_freep(&avctx->internal);
     }
-
-    for (i = 0; i < avctx->nb_coded_side_data; i++)
-        av_freep(&avctx->coded_side_data[i].data);
-    av_freep(&avctx->coded_side_data);
-    avctx->nb_coded_side_data = 0;
+    if (av_codec_is_encoder(avctx->codec)) {
+        for (i = 0; i < avctx->nb_coded_side_data; i++)
+            av_freep(&avctx->coded_side_data[i].data);
+        av_freep(&avctx->coded_side_data);
+        avctx->nb_coded_side_data = 0;
+    }
 
     av_buffer_unref(&avctx->hw_frames_ctx);
     av_buffer_unref(&avctx->hw_device_ctx);
diff --git a/libavcodec/options.c b/libavcodec/options.c
index 0c3b40a186..7c32a71275 100644
--- a/libavcodec/options.c
+++ b/libavcodec/options.c
@@ -177,6 +177,10 @@ void avcodec_free_context(AVCodecContext **pavctx)
     av_freep(&avctx->inter_matrix);
     av_freep(&avctx->rc_override);
     av_channel_layout_uninit(&avctx->ch_layout);
+    for (int i = 0; i < avctx->nb_coded_side_data; i++)
+        av_freep(&avctx->coded_side_data[i].data);
+    av_freep(&avctx->coded_side_data);
+    avctx->nb_coded_side_data = 0;
     av_frame_side_data_free(
         &avctx->decoded_side_data, &avctx->nb_decoded_side_data);
 
-- 
2.44.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [FFmpeg-devel] [PATCH 3/3] avcodec/avcodec: free decoded_side_data in ff_codec_close() when decoding
  2024-05-01 19:01 [FFmpeg-devel] [PATCH 1/3] avcodec/avcodec: prevent ch_layout from being uninitialized in ff_codec_close() James Almer
  2024-05-01 19:01 ` [FFmpeg-devel] [PATCH 2/3] avcodec/avcodec: don't free coded_side_data in ff_codec_close() when decoding James Almer
@ 2024-05-01 19:01 ` James Almer
  2024-05-01 20:43   ` Andreas Rheinhardt
  2024-05-01 20:26 ` [FFmpeg-devel] [PATCH 1/3] avcodec/avcodec: prevent ch_layout from being uninitialized in ff_codec_close() Andreas Rheinhardt
  2 siblings, 1 reply; 10+ messages in thread
From: James Almer @ 2024-05-01 19:01 UTC (permalink / raw)
  To: ffmpeg-devel

It's set by the library, so it should be freed when closing the context.

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavcodec/avcodec.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index e560efff6a..189a0a2193 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -463,7 +463,9 @@ av_cold void ff_codec_close(AVCodecContext *avctx)
             av_freep(&avctx->coded_side_data[i].data);
         av_freep(&avctx->coded_side_data);
         avctx->nb_coded_side_data = 0;
-    }
+    } else if (av_codec_is_decoder(avctx->codec))
+        av_frame_side_data_free(&avctx->decoded_side_data,
+                                &avctx->nb_decoded_side_data);
 
     av_buffer_unref(&avctx->hw_frames_ctx);
     av_buffer_unref(&avctx->hw_device_ctx);
-- 
2.44.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [FFmpeg-devel] [PATCH 1/3] avcodec/avcodec: prevent ch_layout from being uninitialized in ff_codec_close()
  2024-05-01 19:01 [FFmpeg-devel] [PATCH 1/3] avcodec/avcodec: prevent ch_layout from being uninitialized in ff_codec_close() James Almer
  2024-05-01 19:01 ` [FFmpeg-devel] [PATCH 2/3] avcodec/avcodec: don't free coded_side_data in ff_codec_close() when decoding James Almer
  2024-05-01 19:01 ` [FFmpeg-devel] [PATCH 3/3] avcodec/avcodec: free decoded_side_data " James Almer
@ 2024-05-01 20:26 ` Andreas Rheinhardt
  2024-05-01 20:53   ` James Almer
  2 siblings, 1 reply; 10+ messages in thread
From: Andreas Rheinhardt @ 2024-05-01 20:26 UTC (permalink / raw)
  To: ffmpeg-devel

James Almer:
> It's a user-set parameter shared with AVCodecParameters, so it should only
> be freed by avcodec_free_context().
> 
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
>  libavcodec/avcodec.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
> index 888dd76228..fc8a40e4db 100644
> --- a/libavcodec/avcodec.c
> +++ b/libavcodec/avcodec.c
> @@ -414,6 +414,7 @@ void avsubtitle_free(AVSubtitle *sub)
>  
>  av_cold void ff_codec_close(AVCodecContext *avctx)
>  {
> +    AVChannelLayout ch_layout;
>      int i;
>  
>      if (!avctx)
> @@ -468,7 +469,13 @@ av_cold void ff_codec_close(AVCodecContext *avctx)
>  
>      if (avctx->priv_data && avctx->codec && avctx->codec->priv_class)
>          av_opt_free(avctx->priv_data);
> +
> +    // Work around av_opt_free() unsetting ch_layout
> +    ch_layout = avctx->ch_layout;
> +    memset(&avctx->ch_layout, 0, sizeof(avctx->ch_layout));
>      av_opt_free(avctx);
> +    avctx->ch_layout = ch_layout;
> +
>      av_freep(&avctx->priv_data);
>      if (av_codec_is_encoder(avctx->codec)) {
>          av_freep(&avctx->extradata);

This and the other patches will cause memleaks for users that use
allocated channel layouts and avcodec_close()+av_free() (this is
deprecated, not forbidden).

Furthermore, where does the rule "user-set parameters shared with
AVCodecParameters should only be freed by avcodec_free_context()" come
from? It is news to me.

- Andreas

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [FFmpeg-devel] [PATCH 2/3] avcodec/avcodec: don't free coded_side_data in ff_codec_close() when decoding
  2024-05-01 19:01 ` [FFmpeg-devel] [PATCH 2/3] avcodec/avcodec: don't free coded_side_data in ff_codec_close() when decoding James Almer
@ 2024-05-01 20:40   ` Andreas Rheinhardt
  2024-05-01 20:51     ` James Almer
  0 siblings, 1 reply; 10+ messages in thread
From: Andreas Rheinhardt @ 2024-05-01 20:40 UTC (permalink / raw)
  To: ffmpeg-devel

James Almer:
> It's a user-set parameter shared with AVCodecParameters, so it should only
> be freed by avcodec_free_context().
> 
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
>  libavcodec/avcodec.c | 11 ++++++-----
>  libavcodec/options.c |  4 ++++
>  2 files changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
> index fc8a40e4db..e560efff6a 100644
> --- a/libavcodec/avcodec.c
> +++ b/libavcodec/avcodec.c
> @@ -458,11 +458,12 @@ av_cold void ff_codec_close(AVCodecContext *avctx)
>  
>          av_freep(&avctx->internal);
>      }
> -
> -    for (i = 0; i < avctx->nb_coded_side_data; i++)
> -        av_freep(&avctx->coded_side_data[i].data);
> -    av_freep(&avctx->coded_side_data);
> -    avctx->nb_coded_side_data = 0;
> +    if (av_codec_is_encoder(avctx->codec)) {
> +        for (i = 0; i < avctx->nb_coded_side_data; i++)
> +            av_freep(&avctx->coded_side_data[i].data);
> +        av_freep(&avctx->coded_side_data);
> +        avctx->nb_coded_side_data = 0;
> +    }
>  
>      av_buffer_unref(&avctx->hw_frames_ctx);
>      av_buffer_unref(&avctx->hw_device_ctx);
> diff --git a/libavcodec/options.c b/libavcodec/options.c
> index 0c3b40a186..7c32a71275 100644
> --- a/libavcodec/options.c
> +++ b/libavcodec/options.c
> @@ -177,6 +177,10 @@ void avcodec_free_context(AVCodecContext **pavctx)
>      av_freep(&avctx->inter_matrix);
>      av_freep(&avctx->rc_override);
>      av_channel_layout_uninit(&avctx->ch_layout);
> +    for (int i = 0; i < avctx->nb_coded_side_data; i++)
> +        av_freep(&avctx->coded_side_data[i].data);
> +    av_freep(&avctx->coded_side_data);
> +    avctx->nb_coded_side_data = 0;
>      av_frame_side_data_free(
>          &avctx->decoded_side_data, &avctx->nb_decoded_side_data);
>  

1. ff_codec_close() already has an "if is_encoder" branch, it does not
need another one.
2. The code in ff_codec_close() will be redundant as soon as
FF_API_AVCODEC_CLOSE is no more, so it should be inside
FF_API_AVCODEC_CLOSE.
3. The documentation of this field does not mention ownership, but given
that this field existed for a long time lavc's previous behaviour
established the implicit contract that lavc will free this in
avcodec_close(). You are breaking this implicit contract for no good
reason apart from this new principle that user-set stuff shared with
AVCodecParameters should not be freed in avcodec_close(). Which is crazy
given that the relevant AVCodecParameters field has only been added
recently.

- Andreas

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [FFmpeg-devel] [PATCH 3/3] avcodec/avcodec: free decoded_side_data in ff_codec_close() when decoding
  2024-05-01 19:01 ` [FFmpeg-devel] [PATCH 3/3] avcodec/avcodec: free decoded_side_data " James Almer
@ 2024-05-01 20:43   ` Andreas Rheinhardt
  2024-05-01 20:45     ` James Almer
  0 siblings, 1 reply; 10+ messages in thread
From: Andreas Rheinhardt @ 2024-05-01 20:43 UTC (permalink / raw)
  To: ffmpeg-devel

James Almer:
> It's set by the library, so it should be freed when closing the context.
> 
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
>  libavcodec/avcodec.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
> index e560efff6a..189a0a2193 100644
> --- a/libavcodec/avcodec.c
> +++ b/libavcodec/avcodec.c
> @@ -463,7 +463,9 @@ av_cold void ff_codec_close(AVCodecContext *avctx)
>              av_freep(&avctx->coded_side_data[i].data);
>          av_freep(&avctx->coded_side_data);
>          avctx->nb_coded_side_data = 0;
> -    }
> +    } else if (av_codec_is_decoder(avctx->codec))
> +        av_frame_side_data_free(&avctx->decoded_side_data,
> +                                &avctx->nb_decoded_side_data);
>  
>      av_buffer_unref(&avctx->hw_frames_ctx);
>      av_buffer_unref(&avctx->hw_device_ctx);

The documentation actually states that it is "owned and freed by the
encoder" for encoding, so your restriction to decoders is wrong. And
without it, the corresponding code in avcodec_free_context() is redundant.

- Andreas

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [FFmpeg-devel] [PATCH 3/3] avcodec/avcodec: free decoded_side_data in ff_codec_close() when decoding
  2024-05-01 20:43   ` Andreas Rheinhardt
@ 2024-05-01 20:45     ` James Almer
  2024-05-01 20:55       ` Andreas Rheinhardt
  0 siblings, 1 reply; 10+ messages in thread
From: James Almer @ 2024-05-01 20:45 UTC (permalink / raw)
  To: ffmpeg-devel

On 5/1/2024 5:43 PM, Andreas Rheinhardt wrote:
> James Almer:
>> It's set by the library, so it should be freed when closing the context.
>>
>> Signed-off-by: James Almer <jamrial@gmail.com>
>> ---
>>   libavcodec/avcodec.c | 4 +++-
>>   1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
>> index e560efff6a..189a0a2193 100644
>> --- a/libavcodec/avcodec.c
>> +++ b/libavcodec/avcodec.c
>> @@ -463,7 +463,9 @@ av_cold void ff_codec_close(AVCodecContext *avctx)
>>               av_freep(&avctx->coded_side_data[i].data);
>>           av_freep(&avctx->coded_side_data);
>>           avctx->nb_coded_side_data = 0;
>> -    }
>> +    } else if (av_codec_is_decoder(avctx->codec))
>> +        av_frame_side_data_free(&avctx->decoded_side_data,
>> +                                &avctx->nb_decoded_side_data);
>>   
>>       av_buffer_unref(&avctx->hw_frames_ctx);
>>       av_buffer_unref(&avctx->hw_device_ctx);
> 
> The documentation actually states that it is "owned and freed by the
> encoder" for encoding, so your restriction to decoders is wrong. And
> without it, the corresponding code in avcodec_free_context() is redundant.
> 
> - Andreas

Do you suggest freeing it in ff_codec_close() for both scenarios then?
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [FFmpeg-devel] [PATCH 2/3] avcodec/avcodec: don't free coded_side_data in ff_codec_close() when decoding
  2024-05-01 20:40   ` Andreas Rheinhardt
@ 2024-05-01 20:51     ` James Almer
  0 siblings, 0 replies; 10+ messages in thread
From: James Almer @ 2024-05-01 20:51 UTC (permalink / raw)
  To: ffmpeg-devel

On 5/1/2024 5:40 PM, Andreas Rheinhardt wrote:
> James Almer:
>> It's a user-set parameter shared with AVCodecParameters, so it should only
>> be freed by avcodec_free_context().
>>
>> Signed-off-by: James Almer <jamrial@gmail.com>
>> ---
>>   libavcodec/avcodec.c | 11 ++++++-----
>>   libavcodec/options.c |  4 ++++
>>   2 files changed, 10 insertions(+), 5 deletions(-)
>>
>> diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
>> index fc8a40e4db..e560efff6a 100644
>> --- a/libavcodec/avcodec.c
>> +++ b/libavcodec/avcodec.c
>> @@ -458,11 +458,12 @@ av_cold void ff_codec_close(AVCodecContext *avctx)
>>   
>>           av_freep(&avctx->internal);
>>       }
>> -
>> -    for (i = 0; i < avctx->nb_coded_side_data; i++)
>> -        av_freep(&avctx->coded_side_data[i].data);
>> -    av_freep(&avctx->coded_side_data);
>> -    avctx->nb_coded_side_data = 0;
>> +    if (av_codec_is_encoder(avctx->codec)) {
>> +        for (i = 0; i < avctx->nb_coded_side_data; i++)
>> +            av_freep(&avctx->coded_side_data[i].data);
>> +        av_freep(&avctx->coded_side_data);
>> +        avctx->nb_coded_side_data = 0;
>> +    }
>>   
>>       av_buffer_unref(&avctx->hw_frames_ctx);
>>       av_buffer_unref(&avctx->hw_device_ctx);
>> diff --git a/libavcodec/options.c b/libavcodec/options.c
>> index 0c3b40a186..7c32a71275 100644
>> --- a/libavcodec/options.c
>> +++ b/libavcodec/options.c
>> @@ -177,6 +177,10 @@ void avcodec_free_context(AVCodecContext **pavctx)
>>       av_freep(&avctx->inter_matrix);
>>       av_freep(&avctx->rc_override);
>>       av_channel_layout_uninit(&avctx->ch_layout);
>> +    for (int i = 0; i < avctx->nb_coded_side_data; i++)
>> +        av_freep(&avctx->coded_side_data[i].data);
>> +    av_freep(&avctx->coded_side_data);
>> +    avctx->nb_coded_side_data = 0;
>>       av_frame_side_data_free(
>>           &avctx->decoded_side_data, &avctx->nb_decoded_side_data);
>>   
> 
> 1. ff_codec_close() already has an "if is_encoder" branch, it does not
> need another one.
> 2. The code in ff_codec_close() will be redundant as soon as
> FF_API_AVCODEC_CLOSE is no more, so it should be inside
> FF_API_AVCODEC_CLOSE.
> 3. The documentation of this field does not mention ownership, but given
> that this field existed for a long time lavc's previous behaviour
> established the implicit contract that lavc will free this in
> avcodec_close(). You are breaking this implicit contract for no good

Yes, I wrote this set forgetting avcodec_close() was still a thing.

> reason apart from this new principle that user-set stuff shared with
> AVCodecParameters should not be freed in avcodec_close(). Which is crazy
> given that the relevant AVCodecParameters field has only been added
> recently.


_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [FFmpeg-devel] [PATCH 1/3] avcodec/avcodec: prevent ch_layout from being uninitialized in ff_codec_close()
  2024-05-01 20:26 ` [FFmpeg-devel] [PATCH 1/3] avcodec/avcodec: prevent ch_layout from being uninitialized in ff_codec_close() Andreas Rheinhardt
@ 2024-05-01 20:53   ` James Almer
  0 siblings, 0 replies; 10+ messages in thread
From: James Almer @ 2024-05-01 20:53 UTC (permalink / raw)
  To: ffmpeg-devel

On 5/1/2024 5:26 PM, Andreas Rheinhardt wrote:
> James Almer:
>> It's a user-set parameter shared with AVCodecParameters, so it should only
>> be freed by avcodec_free_context().
>>
>> Signed-off-by: James Almer <jamrial@gmail.com>
>> ---
>>   libavcodec/avcodec.c | 7 +++++++
>>   1 file changed, 7 insertions(+)
>>
>> diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
>> index 888dd76228..fc8a40e4db 100644
>> --- a/libavcodec/avcodec.c
>> +++ b/libavcodec/avcodec.c
>> @@ -414,6 +414,7 @@ void avsubtitle_free(AVSubtitle *sub)
>>   
>>   av_cold void ff_codec_close(AVCodecContext *avctx)
>>   {
>> +    AVChannelLayout ch_layout;
>>       int i;
>>   
>>       if (!avctx)
>> @@ -468,7 +469,13 @@ av_cold void ff_codec_close(AVCodecContext *avctx)
>>   
>>       if (avctx->priv_data && avctx->codec && avctx->codec->priv_class)
>>           av_opt_free(avctx->priv_data);
>> +
>> +    // Work around av_opt_free() unsetting ch_layout
>> +    ch_layout = avctx->ch_layout;
>> +    memset(&avctx->ch_layout, 0, sizeof(avctx->ch_layout));
>>       av_opt_free(avctx);
>> +    avctx->ch_layout = ch_layout;
>> +
>>       av_freep(&avctx->priv_data);
>>       if (av_codec_is_encoder(avctx->codec)) {
>>           av_freep(&avctx->extradata);
> 
> This and the other patches will cause memleaks for users that use
> allocated channel layouts and avcodec_close()+av_free() (this is
> deprecated, not forbidden).

That's awful, but guess it needs to be supported until avcodec_close() 
is gone, so I'm withdrawing this patch.

> 
> Furthermore, where does the rule "user-set parameters shared with
> AVCodecParameters should only be freed by avcodec_free_context()" come
> from? It is news to me.

It's not a rule, it's the ideal/expected behavior seeing the crash 
Michael found, where the only shared field cleared during 
avcodec_close() was ch_layout because it may contain allocated data and 
can be set through an AVOption.
If you're copying params between codecpar and avctx, the latter should 
not have only one of the relevant fields nuked on an internal failure.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [FFmpeg-devel] [PATCH 3/3] avcodec/avcodec: free decoded_side_data in ff_codec_close() when decoding
  2024-05-01 20:45     ` James Almer
@ 2024-05-01 20:55       ` Andreas Rheinhardt
  0 siblings, 0 replies; 10+ messages in thread
From: Andreas Rheinhardt @ 2024-05-01 20:55 UTC (permalink / raw)
  To: ffmpeg-devel

James Almer:
> On 5/1/2024 5:43 PM, Andreas Rheinhardt wrote:
>> James Almer:
>>> It's set by the library, so it should be freed when closing the context.
>>>
>>> Signed-off-by: James Almer <jamrial@gmail.com>
>>> ---
>>>   libavcodec/avcodec.c | 4 +++-
>>>   1 file changed, 3 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
>>> index e560efff6a..189a0a2193 100644
>>> --- a/libavcodec/avcodec.c
>>> +++ b/libavcodec/avcodec.c
>>> @@ -463,7 +463,9 @@ av_cold void ff_codec_close(AVCodecContext *avctx)
>>>               av_freep(&avctx->coded_side_data[i].data);
>>>           av_freep(&avctx->coded_side_data);
>>>           avctx->nb_coded_side_data = 0;
>>> -    }
>>> +    } else if (av_codec_is_decoder(avctx->codec))
>>> +        av_frame_side_data_free(&avctx->decoded_side_data,
>>> +                                &avctx->nb_decoded_side_data);
>>>         av_buffer_unref(&avctx->hw_frames_ctx);
>>>       av_buffer_unref(&avctx->hw_device_ctx);
>>
>> The documentation actually states that it is "owned and freed by the
>> encoder" for encoding, so your restriction to decoders is wrong. And
>> without it, the corresponding code in avcodec_free_context() is
>> redundant.
>>
>> - Andreas
> 
> Do you suggest freeing it in ff_codec_close() for both scenarios then?

Yes.

- Andreas

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2024-05-01 20:56 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-05-01 19:01 [FFmpeg-devel] [PATCH 1/3] avcodec/avcodec: prevent ch_layout from being uninitialized in ff_codec_close() James Almer
2024-05-01 19:01 ` [FFmpeg-devel] [PATCH 2/3] avcodec/avcodec: don't free coded_side_data in ff_codec_close() when decoding James Almer
2024-05-01 20:40   ` Andreas Rheinhardt
2024-05-01 20:51     ` James Almer
2024-05-01 19:01 ` [FFmpeg-devel] [PATCH 3/3] avcodec/avcodec: free decoded_side_data " James Almer
2024-05-01 20:43   ` Andreas Rheinhardt
2024-05-01 20:45     ` James Almer
2024-05-01 20:55       ` Andreas Rheinhardt
2024-05-01 20:26 ` [FFmpeg-devel] [PATCH 1/3] avcodec/avcodec: prevent ch_layout from being uninitialized in ff_codec_close() Andreas Rheinhardt
2024-05-01 20:53   ` James Almer

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git