[FFmpeg-cvslog] avformat/iamf_parse: use the public iamf helpers to allocate structs
James Almer
git at videolan.org
Wed Jan 24 01:57:41 EET 2024
ffmpeg | branch: master | James Almer <jamrial at gmail.com> | Tue Jan 23 20:54:13 2024 -0300| [0b8e51b584468388a4eee8e630a98ebdb53148aa] | committer: James Almer
avformat/iamf_parse: use the public iamf helpers to allocate structs
Should fix memory leaks from non-freed fields due to missing AVClass
in the allocated structs.
Signed-off-by: James Almer <jamrial at gmail.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=0b8e51b584468388a4eee8e630a98ebdb53148aa
---
libavformat/iamf_parse.c | 39 +++++++++++----------------------------
1 file changed, 11 insertions(+), 28 deletions(-)
diff --git a/libavformat/iamf_parse.c b/libavformat/iamf_parse.c
index 8c86c2dce6..32976e6788 100644
--- a/libavformat/iamf_parse.c
+++ b/libavformat/iamf_parse.c
@@ -763,7 +763,7 @@ static int mix_presentation_obu(void *s, IAMFContext *c, AVIOContext *pb, int le
FFIOContext b;
AVIOContext *pbc;
uint8_t *buf;
- unsigned mix_presentation_id;
+ unsigned nb_submixes, mix_presentation_id;
int ret;
buf = av_malloc(len);
@@ -834,35 +834,24 @@ static int mix_presentation_obu(void *s, IAMFContext *c, AVIOContext *pb, int le
goto fail;
}
- mix->nb_submixes = ffio_read_leb(pbc);
- mix->submixes = av_calloc(mix->nb_submixes, sizeof(*mix->submixes));
- if (!mix->submixes) {
- ret = AVERROR(ENOMEM);
- goto fail;
- }
-
- for (int i = 0; i < mix->nb_submixes; i++) {
+ nb_submixes = ffio_read_leb(pbc);
+ for (int i = 0; i < nb_submixes; i++) {
AVIAMFSubmix *sub_mix;
+ unsigned nb_elements, nb_layouts;
- sub_mix = mix->submixes[i] = av_mallocz(sizeof(*sub_mix));
+ sub_mix = av_iamf_mix_presentation_add_submix(mix);
if (!sub_mix) {
ret = AVERROR(ENOMEM);
goto fail;
}
- sub_mix->nb_elements = ffio_read_leb(pbc);
- sub_mix->elements = av_calloc(sub_mix->nb_elements, sizeof(*sub_mix->elements));
- if (!sub_mix->elements) {
- ret = AVERROR(ENOMEM);
- goto fail;
- }
-
- for (int j = 0; j < sub_mix->nb_elements; j++) {
+ nb_elements = ffio_read_leb(pbc);
+ for (int j = 0; j < nb_elements; j++) {
AVIAMFSubmixElement *submix_element;
IAMFAudioElement *audio_element = NULL;
unsigned int rendering_config_extension_size;
- submix_element = sub_mix->elements[j] = av_mallocz(sizeof(*submix_element));
+ submix_element = av_iamf_submix_add_element(sub_mix);
if (!submix_element) {
ret = AVERROR(ENOMEM);
goto fail;
@@ -912,19 +901,13 @@ static int mix_presentation_obu(void *s, IAMFContext *c, AVIOContext *pb, int le
goto fail;
sub_mix->default_mix_gain = av_make_q(sign_extend(avio_rb16(pbc), 16), 1 << 8);
- sub_mix->nb_layouts = ffio_read_leb(pbc);
- sub_mix->layouts = av_calloc(sub_mix->nb_layouts, sizeof(*sub_mix->layouts));
- if (!sub_mix->layouts) {
- ret = AVERROR(ENOMEM);
- goto fail;
- }
-
- for (int j = 0; j < sub_mix->nb_layouts; j++) {
+ nb_layouts = ffio_read_leb(pbc);
+ for (int j = 0; j < nb_layouts; j++) {
AVIAMFSubmixLayout *submix_layout;
int info_type;
int byte = avio_r8(pbc);
- submix_layout = sub_mix->layouts[j] = av_mallocz(sizeof(*submix_layout));
+ submix_layout = av_iamf_submix_add_layout(sub_mix);
if (!submix_layout) {
ret = AVERROR(ENOMEM);
goto fail;
More information about the ffmpeg-cvslog
mailing list