]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
transcode: add profile_init() callback for codecs to initialize correctly default...
authorJaroslav Kysela <perex@perex.cz>
Tue, 29 Aug 2017 08:59:39 +0000 (10:59 +0200)
committerJaroslav Kysela <perex@perex.cz>
Tue, 29 Aug 2017 08:59:39 +0000 (10:59 +0200)
14 files changed:
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/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/profile.c

index b62c2da2bbf7c0253872292046082f6ce561efdf..8b5ee587705e49bbdae63a54873281365262b736 100644 (file)
@@ -63,6 +63,7 @@ typedef struct tvh_codec_t {
     const codec_profile_class_t *idclass;
     AVCodec *codec;
     const AVProfile *profiles;
+    int (*profile_init)(TVHCodecProfile *, htsmsg_t *conf);
     SLIST_ENTRY(tvh_codec_t) link;
 } TVHCodec;
 
@@ -123,6 +124,9 @@ tvh_codec_profile_open(TVHCodecProfile *self, AVDictionary **opts);
 
 
 /* video */
+int
+tvh_codec_profile_video_init(TVHCodecProfile *_self, htsmsg_t *conf);
+
 int
 tvh_codec_profile_video_get_hwaccel(TVHCodecProfile *self);
 
@@ -131,6 +135,9 @@ tvh_codec_profile_video_get_pix_fmts(TVHCodecProfile *self);
 
 
 /* audio */
+int
+tvh_codec_profile_audio_init(TVHCodecProfile *_self, htsmsg_t *conf);
+
 const enum AVSampleFormat *
 tvh_codec_profile_audio_get_sample_fmts(TVHCodecProfile *self);
 
index 380e2f2bef1d7a12561bb7af5c4caa47d6cb75f1..bd310ee3a173ef540e31ee042cf7e7cfe06f597d 100644 (file)
@@ -127,5 +127,6 @@ TVHAudioCodec tvh_codec_aac = {
     .size            = sizeof(tvh_codec_profile_aac_t),
     .idclass         = &codec_profile_aac_class,
     .profiles        = aac_profiles,
+    .profile_init    = tvh_codec_profile_audio_init,
     .channel_layouts = aac_channel_layouts,
 };
index 80b698073ecdee75181b4c07202e29b2ed103b3c..27ef945d27ffb3141333e5fc69343a9469818d62 100644 (file)
@@ -136,4 +136,6 @@ TVHAudioCodec tvh_codec_libfdk_aac = {
     .name    = "libfdk_aac",
     .size    = sizeof(tvh_codec_profile_libfdk_aac_t),
     .idclass = &codec_profile_libfdk_aac_class,
+    .profile_init = tvh_codec_profile_audio_init,
+
 };
index 5a5862caa050e47370e6746bbc37a30c46f3fd5d..49b39402793d64292108773c381d20afed7a8e63 100644 (file)
@@ -133,4 +133,5 @@ TVHAudioCodec tvh_codec_libopus = {
     .name    = "libopus",
     .size    = sizeof(tvh_codec_profile_libopus_t),
     .idclass = &codec_profile_libopus_class,
+    .profile_init = tvh_codec_profile_audio_init,
 };
index 8511cabf7332fc64d3823917dca2cf463e56fcc1..49d316bc1d7439d2ae56ac9298e56b728edf73e2 100644 (file)
@@ -75,4 +75,5 @@ TVHVideoCodec tvh_codec_libtheora = {
     .name    = "libtheora",
     .size    = sizeof(TVHVideoCodecProfile),
     .idclass = &codec_profile_libtheora_class,
+    .profile_init = tvh_codec_profile_video_init,
 };
index 41b9dc3a835a82804c98f774f2b430ab1263b822..543bc35074d7b6a0ac884bb462ce728cb90c96bb 100644 (file)
@@ -95,4 +95,5 @@ TVHAudioCodec tvh_codec_libvorbis = {
     .size            = sizeof(TVHAudioCodecProfile),
     .idclass         = &codec_profile_libvorbis_class,
     .channel_layouts = libvorbis_channel_layouts,
+    .profile_init    = tvh_codec_profile_audio_init,
 };
index cfc5ee3670d980a7d11ac342f995dd0445311ec3..e0e57e7d3db77fce18b4295d023b4289321a6778 100644 (file)
@@ -158,4 +158,5 @@ TVHVideoCodec tvh_codec_libvpx_vp9 = {
     .name    = "libvpx-vp9",
     .size    = sizeof(tvh_codec_profile_libvpx_t),
     .idclass = &codec_profile_libvpx_class,
+    .profile_init = tvh_codec_profile_video_init,
 };
index 19f72316b775b78beb4ba4458d98758224d1c6c9..4ae2fea3b6a48b48b9fdcf1b1adb310de81d0c13 100644 (file)
@@ -298,6 +298,7 @@ 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,
 };
 
 #endif
index f836becdc89b95ff6415d92f4ea888d1248faa8f..862da09c94f6e17a24de9bbf0034e367f94c33b4 100644 (file)
@@ -110,4 +110,5 @@ 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,
 };
index c0104ee5ce08970c45d3609053991699d6bb94cb..037bde8d7cfb2f652739037c7c511ec00124abd9 100644 (file)
@@ -178,4 +178,5 @@ TVHVideoCodec tvh_codec_vaapi_hevc = {
     .size     = sizeof(tvh_codec_profile_vaapi_t),
     .idclass  = &codec_profile_vaapi_hevc_class,
     .profiles = vaapi_hevc_profiles,
+    .profile_init = tvh_codec_profile_video_init,
 };
index 84952a5256e3bad16e87166f7fb846ad3194054d..61795659ad68f9c771b389b6c7e1d555f7ed2679 100644 (file)
@@ -72,4 +72,6 @@ TVHAudioCodec tvh_codec_mp2 = {
     .name    = "mp2",
     .size    = sizeof(TVHAudioCodecProfile),
     .idclass = &codec_profile_mp2_class,
+    .profile_init = tvh_codec_profile_audio_init,
+
 };
index d78f8d42618017aa0334466f51866fa8f7a50941..1b1c3099dcb5ae260e50e75223848ee9c68a196e 100644 (file)
@@ -75,4 +75,5 @@ TVHVideoCodec tvh_codec_mpeg2video = {
     .name    = "mpeg2video",
     .size    = sizeof(TVHVideoCodecProfile),
     .idclass = &codec_profile_mpeg2video_class,
+    .profile_init = tvh_codec_profile_video_init,
 };
index 89df6b2d53749dc62c3c9e81721e1585fed8c8d6..c1b88e66374bbe76455a2eea6349351b68f211bd 100644 (file)
@@ -66,5 +66,6 @@ TVHAudioCodec tvh_codec_vorbis = {
     .name            = "vorbis",
     .size            = sizeof(TVHAudioCodecProfile),
     .idclass         = &codec_profile_vorbis_class,
+    .profile_init    = tvh_codec_profile_audio_init,
     .channel_layouts = vorbis_channel_layouts,
 };
index da277c1f4c978be78ffcb15da8112447ea41cdf7..424f422286e4744fb215482bbcaee395188b7d25 100644 (file)
@@ -29,12 +29,18 @@ struct TVHCodecProfiles tvh_codec_profiles;
 /* TVHCodecProfile ========================================================== */
 
 static TVHCodecProfile *
-tvh_codec_profile_alloc(TVHCodec *codec)
+tvh_codec_profile_alloc(TVHCodec *codec, htsmsg_t *conf)
 {
     TVHCodecProfile *self = NULL;
 
     if ((self = calloc(1, codec->size))) {
         self->codec = codec;
+        if (codec->profile_init) {
+            if (codec->profile_init(self, conf)) {
+                free(self);
+                return NULL;
+            }
+        }
     }
     return self;
 }
@@ -77,7 +83,7 @@ tvh_codec_profile_create2(htsmsg_field_t *config)
             return;
         if (tvh_codec_profile_find(name))
             return;
-        if (tvh_codec_profile_create(conf, NULL, 0))
+        if (tvh_codec_profile_create(conf, NULL, 1))
           tvherror(LS_CODEC, "unable to create codec profile from config tree: '%s'",
                    (name = htsmsg_get_str(conf, "name")) ? name : "<unknown>");
     }
@@ -130,7 +136,7 @@ tvh_codec_profile_create(htsmsg_t *conf, const char *uuid, int save)
         tvherror(LS_CODEC, "codec '%s' not found", codec_name);
         return ENOENT;
     }
-    if (!(profile = tvh_codec_profile_alloc(codec))) {
+    if (!(profile = tvh_codec_profile_alloc(codec, conf))) {
         tvherror(LS_CODEC, "failed to allocate TVHCodecProfile");
         return ENOMEM;
     }
@@ -250,6 +256,14 @@ tvh_codec_profile_open(TVHCodecProfile *self, AVDictionary **opts)
 
 
 /* video */
+int
+tvh_codec_profile_video_init(TVHCodecProfile *_self, htsmsg_t *conf)
+{
+    TVHVideoCodecProfile *self = (TVHVideoCodecProfile *)_self;
+    self->pix_fmt = AV_PIX_FMT_NONE;
+    return 0;
+}
+
 int
 tvh_codec_profile_video_get_hwaccel(TVHCodecProfile *self)
 {
@@ -270,6 +284,14 @@ tvh_codec_profile_video_get_pix_fmts(TVHCodecProfile *self)
 
 
 /* audio */
+int
+tvh_codec_profile_audio_init(TVHCodecProfile *_self, htsmsg_t *conf)
+{
+    TVHAudioCodecProfile *self = (TVHAudioCodecProfile *)_self;
+    self->sample_fmt = AV_SAMPLE_FMT_NONE;
+    return 0;
+}
+
 const enum AVSampleFormat *
 tvh_codec_profile_audio_get_sample_fmts(TVHCodecProfile *self)
 {