]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
transcoding: fix memory leaks
authorJaroslav Kysela <perex@perex.cz>
Mon, 25 Sep 2017 15:26:09 +0000 (17:26 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 25 Sep 2017 15:26:09 +0000 (17:26 +0200)
19 files changed:
src/profile.c
src/transcoding/codec.h
src/transcoding/codec/codecs/aac.c
src/transcoding/codec/codecs/libs/libfdk_aac.c
src/transcoding/codec/codecs/libs/libopus.c
src/transcoding/codec/codecs/libs/libtheora.c
src/transcoding/codec/codecs/libs/libvorbis.c
src/transcoding/codec/codecs/libs/libvpx.c
src/transcoding/codec/codecs/libs/libx26x.c
src/transcoding/codec/codecs/libs/nvenc.c
src/transcoding/codec/codecs/libs/omx.c
src/transcoding/codec/codecs/libs/vaapi.c
src/transcoding/codec/codecs/mp2.c
src/transcoding/codec/codecs/mpeg2video.c
src/transcoding/codec/codecs/vorbis.c
src/transcoding/codec/internals.h
src/transcoding/codec/profile.c
src/transcoding/codec/profile_class.c
src/transcoding/transcode/transcoder.c

index 75c06c8ecccddd384b70446ee5be302cdabb6e82..ab654bcbc2412120314b75422914f1ddc8b39a49 100644 (file)
@@ -2459,8 +2459,11 @@ profile_transcode_free(profile_t *_pro)
 {
   profile_transcode_t *pro = (profile_transcode_t *)_pro;
   free(pro->pro_vcodec);
+  free(pro->pro_src_vcodec);
   free(pro->pro_acodec);
+  free(pro->pro_src_acodec);
   free(pro->pro_scodec);
+  free(pro->pro_src_scodec);
 }
 
 static profile_t *
index 06d581839afb3ea609e77968d6b14428e9953609..1568ce6f74f7e55203babe7ba077a4f7f6eb12c2 100644 (file)
@@ -67,6 +67,7 @@ struct tvh_codec {
     AVCodec *codec;
     const AVProfile *profiles;
     int (*profile_init)(TVHCodecProfile *, htsmsg_t *conf);
+    void (*profile_destroy)(TVHCodecProfile *);
     SLIST_ENTRY(tvh_codec) link;
 };
 
@@ -90,9 +91,9 @@ extern const codec_profile_class_t codec_profile_class;
 struct tvh_codec_profile {
     idnode_t idnode;
     TVHCodec *codec;
-    const char *name;
-    const char *description;
-    const char *codec_name;
+    char *name;
+    char *description;
+    char *codec_name;
     double bit_rate;
     double qscale;
     int profile;
@@ -131,6 +132,9 @@ tvh_codec_profile_open(TVHCodecProfile *self, AVDictionary **opts);
 int
 tvh_codec_profile_video_init(TVHCodecProfile *_self, htsmsg_t *conf);
 
+void
+tvh_codec_profile_video_destroy(TVHCodecProfile *_self);
+
 int
 tvh_codec_profile_video_get_hwaccel(TVHCodecProfile *self);
 
@@ -142,6 +146,9 @@ tvh_codec_profile_video_get_pix_fmts(TVHCodecProfile *self);
 int
 tvh_codec_profile_audio_init(TVHCodecProfile *_self, htsmsg_t *conf);
 
+void
+tvh_codec_profile_audio_destroy(TVHCodecProfile *_self);
+
 const enum AVSampleFormat *
 tvh_codec_profile_audio_get_sample_fmts(TVHCodecProfile *self);
 
index bd310ee3a173ef540e31ee042cf7e7cfe06f597d..4c51736e2c85d09295c95ea13807144bd23187f0 100644 (file)
@@ -45,7 +45,7 @@ static const uint64_t aac_channel_layouts[] = {
 
 typedef struct {
     TVHAudioCodecProfile;
-    const char *coder;
+    char *coder;
 } tvh_codec_profile_aac_t;
 
 
@@ -122,11 +122,21 @@ static const codec_profile_class_t codec_profile_aac_class = {
 };
 
 
+static void
+tvh_codec_profile_aac_destroy(TVHCodecProfile *_self)
+{
+    tvh_codec_profile_aac_t *self = (tvh_codec_profile_aac_t *)_self;
+    tvh_codec_profile_audio_destroy(_self);
+    free(self->coder);
+}
+
+
 TVHAudioCodec tvh_codec_aac = {
     .name            = "aac",
     .size            = sizeof(tvh_codec_profile_aac_t),
     .idclass         = &codec_profile_aac_class,
     .profiles        = aac_profiles,
     .profile_init    = tvh_codec_profile_audio_init,
+    .profile_destroy = tvh_codec_profile_aac_destroy,
     .channel_layouts = aac_channel_layouts,
 };
index 2a062af6628f8f4dfa63e947ea1a3a56f36033e3..6aeeb43d294dbe3c7d8632080fd1f1a509ed3e28 100644 (file)
@@ -137,5 +137,5 @@ TVHAudioCodec tvh_codec_libfdk_aac = {
     .size    = sizeof(tvh_codec_profile_libfdk_aac_t),
     .idclass = &codec_profile_libfdk_aac_class,
     .profile_init = tvh_codec_profile_audio_init,
-
+    .profile_destroy = tvh_codec_profile_audio_destroy,
 };
index 49b39402793d64292108773c381d20afed7a8e63..0efdca617d6bfd76c60595fe7d341c6fdb249fc7 100644 (file)
@@ -134,4 +134,5 @@ TVHAudioCodec tvh_codec_libopus = {
     .size    = sizeof(tvh_codec_profile_libopus_t),
     .idclass = &codec_profile_libopus_class,
     .profile_init = tvh_codec_profile_audio_init,
+    .profile_destroy = tvh_codec_profile_audio_destroy,
 };
index 49d316bc1d7439d2ae56ac9298e56b728edf73e2..cc64ed0af419a687205f5234cc92831e700a392b 100644 (file)
@@ -76,4 +76,5 @@ TVHVideoCodec tvh_codec_libtheora = {
     .size    = sizeof(TVHVideoCodecProfile),
     .idclass = &codec_profile_libtheora_class,
     .profile_init = tvh_codec_profile_video_init,
+    .profile_destroy = tvh_codec_profile_video_destroy,
 };
index 543bc35074d7b6a0ac884bb462ce728cb90c96bb..230f52009c9c4d08edc4809b1f8e8338cc332086 100644 (file)
@@ -96,4 +96,5 @@ TVHAudioCodec tvh_codec_libvorbis = {
     .idclass         = &codec_profile_libvorbis_class,
     .channel_layouts = libvorbis_channel_layouts,
     .profile_init    = tvh_codec_profile_audio_init,
+    .profile_destroy = tvh_codec_profile_audio_destroy,
 };
index 481825cd848a5d6aded23feaa983f1bcf2a79229..ee9445f3cce3461442f1d5b65fc190c403c5ab61 100644 (file)
@@ -149,6 +149,8 @@ TVHVideoCodec tvh_codec_libvpx_vp8 = {
     .name     = "libvpx",
     .size     = sizeof(tvh_codec_profile_libvpx_t),
     .idclass  = &codec_profile_libvpx_class,
+    .profile_init = tvh_codec_profile_video_init,
+    .profile_destroy = tvh_codec_profile_video_destroy,
 };
 
 
@@ -159,4 +161,5 @@ TVHVideoCodec tvh_codec_libvpx_vp9 = {
     .size    = sizeof(tvh_codec_profile_libvpx_t),
     .idclass = &codec_profile_libvpx_class,
     .profile_init = tvh_codec_profile_video_init,
+    .profile_destroy = tvh_codec_profile_video_destroy,
 };
index 4ae2fea3b6a48b48b9fdcf1b1adb310de81d0c13..8506e22267108e5adec98850d5c693db0ce88855 100644 (file)
@@ -48,9 +48,9 @@ strlist2htsmsg(const char * const *values)
 
 typedef struct {
     TVHVideoCodecProfile;
-    const char *preset;
-    const char *tune;
-    const char *params;
+    char *preset;
+    char *tune;
+    char *params;
 } tvh_codec_profile_libx26x_t;
 
 
@@ -294,11 +294,23 @@ static const codec_profile_class_t codec_profile_libx265_class = {
 };
 
 
+static void
+tvh_codec_profile_libx265_destroy(TVHCodecProfile *_self)
+{
+    tvh_codec_profile_libx26x_t *self = (tvh_codec_profile_libx26x_t *)_self;
+    tvh_codec_profile_video_destroy(_self);
+    free(self->preset);
+    free(self->tune);
+    free(self->params);
+}
+
+
 TVHVideoCodec tvh_codec_libx265 = {
     .name    = "libx265",
     .size    = sizeof(tvh_codec_profile_libx26x_t),
     .idclass = &codec_profile_libx265_class,
     .profile_init = tvh_codec_profile_video_init,
+    .profile_destroy = tvh_codec_profile_libx265_destroy,
 };
 
 #endif
index 4acbb28c661ffaaa1ab2f55f6182f7a228346552..fdbb593267a4aeae48d17c61a2e3f398e24daf30 100644 (file)
@@ -317,4 +317,5 @@ TVHVideoCodec tvh_codec_nvenc_hevc = {
     .idclass  = &codec_profile_nvenc_hevc_class,
     .profiles = nvenc_hevc_profiles,
     .profile_init = tvh_codec_profile_video_init,
+    .profile_destroy = tvh_codec_profile_video_destroy,
 };
index 862da09c94f6e17a24de9bbf0034e367f94c33b4..1180b647280653b26b7dba4a907ca65b067effdc 100644 (file)
@@ -33,7 +33,7 @@ typedef struct {
 
 static int
 tvh_codec_profile_omx_open(tvh_codec_profile_omx_t *self, AVDictionary **opts)
-{
+k{
     AV_DICT_SET_FLAGS_GLOBAL_HEADER(opts);
     // bit_rate
     if (self->bit_rate) {
@@ -106,9 +106,19 @@ static const codec_profile_class_t codec_profile_omx_class = {
 
 /* h264_omx ================================================================= */
 
+static void
+tvh_codec_profile_omx_destroy(TVHCodecProfile *_self)
+{
+    tvh_codec_profile_omx_t *self = (tvh_codec_profile_omx_t *)_self;
+    tvh_codec_profile_video_destroy(_self);
+    free(self->libname);
+    free(self->libprefix);
+}
+
 TVHVideoCodec tvh_codec_omx_h264 = {
     .name    = "h264_omx",
     .size    = sizeof(tvh_codec_profile_omx_t),
     .idclass = &codec_profile_omx_class,
     .profile_init = tvh_codec_profile_video_init,
+    .profile_destroy = tvh_codec_profile_omx_destroy,
 };
index 5858c49b644342e9818a9adcb7902bf0d85c2090..b5da9907cc74f73b175aa6dc8cc870f8fa4be71c 100644 (file)
@@ -261,6 +261,7 @@ TVHVideoCodec tvh_codec_vaapi_hevc = {
     .idclass  = &codec_profile_vaapi_hevc_class,
     .profiles = vaapi_hevc_profiles,
     .profile_init = tvh_codec_profile_video_init,
+    .profile_destroy = tvh_codec_profile_video_destroy,
 };
 
 
@@ -303,4 +304,5 @@ TVHVideoCodec tvh_codec_vaapi_vp8 = {
     .idclass  = &codec_profile_vaapi_vp8_class,
     .profiles = vaapi_vp8_profiles,
     .profile_init = tvh_codec_profile_video_init,
+    .profile_destroy = tvh_codec_profile_video_destroy,
 };
index 61795659ad68f9c771b389b6c7e1d555f7ed2679..e26ad3eb89f211c813dd7638bf36b2249e22a344 100644 (file)
@@ -73,5 +73,5 @@ TVHAudioCodec tvh_codec_mp2 = {
     .size    = sizeof(TVHAudioCodecProfile),
     .idclass = &codec_profile_mp2_class,
     .profile_init = tvh_codec_profile_audio_init,
-
+    .profile_destroy = tvh_codec_profile_audio_destroy,
 };
index 1b1c3099dcb5ae260e50e75223848ee9c68a196e..d50601f87b6622cefe3ce3744b4fabf7b00020ed 100644 (file)
@@ -76,4 +76,5 @@ TVHVideoCodec tvh_codec_mpeg2video = {
     .size    = sizeof(TVHVideoCodecProfile),
     .idclass = &codec_profile_mpeg2video_class,
     .profile_init = tvh_codec_profile_video_init,
+    .profile_destroy = tvh_codec_profile_video_destroy,
 };
index c1b88e66374bbe76455a2eea6349351b68f211bd..abd35d51eb2043ec7e96ec1d4e4fc4f711da529f 100644 (file)
@@ -67,5 +67,6 @@ TVHAudioCodec tvh_codec_vorbis = {
     .size            = sizeof(TVHAudioCodecProfile),
     .idclass         = &codec_profile_vorbis_class,
     .profile_init    = tvh_codec_profile_audio_init,
+    .profile_destroy = tvh_codec_profile_audio_destroy,
     .channel_layouts = vorbis_channel_layouts,
 };
index 63e83338b84eb5cb48178cc606a1f319393e248b..908f172a5f44d1acab287da8a3a11aba79f36bc3 100644 (file)
@@ -225,9 +225,9 @@ extern const codec_profile_class_t codec_profile_audio_class;
 typedef struct tvh_codec_profile_audio {
     TVHCodecProfile;
     int tracks;
-    const char *language1;
-    const char *language2;
-    const char *language3;
+    char *language1;
+    char *language2;
+    char *language3;
     int sample_fmt;
     int sample_rate;
     int64_t channel_layout;
index a6efe497ad23e7754d9eadd18d15cc9a04e2a7c4..3fd85571e3f0e8f47fec7eafd929ccdd38e799c6 100644 (file)
@@ -49,10 +49,18 @@ tvh_codec_profile_alloc(TVHCodec *codec, htsmsg_t *conf)
 static void
 tvh_codec_profile_free(TVHCodecProfile *self)
 {
+    TVHCodec *codec;
+
     if (self) {
-        self->codec = NULL;
+        codec = self->codec;
+        if (codec && codec->profile_destroy) {
+            codec->profile_destroy(self);
+        }
+        free(self->name);
+        free(self->description);
+        free(self->codec_name);
+        free(self->device);
         free(self);
-        self = NULL;
     }
 }
 
@@ -262,6 +270,11 @@ tvh_codec_profile_video_init(TVHCodecProfile *_self, htsmsg_t *conf)
     return 0;
 }
 
+void
+tvh_codec_profile_video_destroy(TVHCodecProfile *_self)
+{
+}
+
 int
 tvh_codec_profile_video_get_hwaccel(TVHCodecProfile *self)
 {
@@ -291,6 +304,15 @@ tvh_codec_profile_audio_init(TVHCodecProfile *_self, htsmsg_t *conf)
     return 0;
 }
 
+void
+tvh_codec_profile_audio_destroy(TVHCodecProfile *_self)
+{
+    TVHAudioCodecProfile *self = (TVHAudioCodecProfile *)_self;
+    free(self->language1);
+    free(self->language2);
+    free(self->language3);
+}
+
 const enum AVSampleFormat *
 tvh_codec_profile_audio_get_sample_fmts(TVHCodecProfile *self)
 {
index 8a2236c9080d75261f426035e1bcd1c88731c77f..24501b55dc3d87f4a89d44a6e38f02914020d612 100644 (file)
@@ -124,10 +124,7 @@ codec_profile_class_name_set(void *obj, const void *val)
                 tvherror(LS_CODEC, "profile '%s' already exists", name);
             }
             else {
-                if (self->name) {
-                    free((void *)self->name);
-                    self->name = NULL;
-                }
+                free(self->name);
                 self->name = strdup(name);
                 return 1;
             }
@@ -137,6 +134,19 @@ codec_profile_class_name_set(void *obj, const void *val)
 }
 
 
+/* codec_profile_class.name */
+
+static const void *
+codec_profile_class_name_get(void *obj)
+{
+    static const char *type;
+
+    TVHCodec *codec = tvh_codec_profile_get_codec(obj);
+    type = codec ? tvh_codec_get_title(codec) : "<unknown>";
+    return &type;
+}
+
+
 /* codec_profile_class.type */
 
 static const void *
@@ -226,8 +236,17 @@ const codec_profile_class_t codec_profile_class = {
             },
             {
                 .type     = PT_STR,
-                .id       = "codec_name",
+                .id       = "codec_title",
                 .name     = N_("Codec"),
+                .desc     = N_("Codec title."),
+                .group    = 1,
+                .opts     = PO_RDONLY | PO_NOSAVE,
+                .get      = codec_profile_class_name_get,
+            },
+            {
+                .type     = PT_STR,
+                .id       = "codec_name",
+                .name     = N_("Codec name"),
                 .desc     = N_("Codec name."),
                 .group    = 1,
                 .opts     = PO_RDONLY,
index b033b9b2876039cca7cc91658905814a2af58956..ad185c7887a71fdc13b97d559f23c7b7618fbff1 100644 (file)
@@ -22,7 +22,7 @@
 #include "../codec/internals.h"
 
 
-static TVHCodecProfile _codec_profile_copy = { .name = "copy" };
+static TVHCodecProfile _codec_profile_copy = { .name = (char *)"copy" };
 TVHCodecProfile *tvh_codec_profile_copy = &_codec_profile_copy;