From: Jaroslav Kysela Date: Tue, 29 Aug 2017 08:59:39 +0000 (+0200) Subject: transcode: add profile_init() callback for codecs to initialize correctly default... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3b016c0d69dbc347f18f87cbc51771c645d31b9f;p=thirdparty%2Ftvheadend.git transcode: add profile_init() callback for codecs to initialize correctly default audio format --- diff --git a/src/transcoding/codec.h b/src/transcoding/codec.h index b62c2da2b..8b5ee5877 100644 --- a/src/transcoding/codec.h +++ b/src/transcoding/codec.h @@ -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); diff --git a/src/transcoding/codec/codecs/aac.c b/src/transcoding/codec/codecs/aac.c index 380e2f2be..bd310ee3a 100644 --- a/src/transcoding/codec/codecs/aac.c +++ b/src/transcoding/codec/codecs/aac.c @@ -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, }; diff --git a/src/transcoding/codec/codecs/libs/libfdk_aac.c b/src/transcoding/codec/codecs/libs/libfdk_aac.c index 80b698073..27ef945d2 100644 --- a/src/transcoding/codec/codecs/libs/libfdk_aac.c +++ b/src/transcoding/codec/codecs/libs/libfdk_aac.c @@ -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, + }; diff --git a/src/transcoding/codec/codecs/libs/libopus.c b/src/transcoding/codec/codecs/libs/libopus.c index 5a5862caa..49b394027 100644 --- a/src/transcoding/codec/codecs/libs/libopus.c +++ b/src/transcoding/codec/codecs/libs/libopus.c @@ -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, }; diff --git a/src/transcoding/codec/codecs/libs/libtheora.c b/src/transcoding/codec/codecs/libs/libtheora.c index 8511cabf7..49d316bc1 100644 --- a/src/transcoding/codec/codecs/libs/libtheora.c +++ b/src/transcoding/codec/codecs/libs/libtheora.c @@ -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, }; diff --git a/src/transcoding/codec/codecs/libs/libvorbis.c b/src/transcoding/codec/codecs/libs/libvorbis.c index 41b9dc3a8..543bc3507 100644 --- a/src/transcoding/codec/codecs/libs/libvorbis.c +++ b/src/transcoding/codec/codecs/libs/libvorbis.c @@ -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, }; diff --git a/src/transcoding/codec/codecs/libs/libvpx.c b/src/transcoding/codec/codecs/libs/libvpx.c index cfc5ee367..e0e57e7d3 100644 --- a/src/transcoding/codec/codecs/libs/libvpx.c +++ b/src/transcoding/codec/codecs/libs/libvpx.c @@ -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, }; diff --git a/src/transcoding/codec/codecs/libs/libx26x.c b/src/transcoding/codec/codecs/libs/libx26x.c index 19f72316b..4ae2fea3b 100644 --- a/src/transcoding/codec/codecs/libs/libx26x.c +++ b/src/transcoding/codec/codecs/libs/libx26x.c @@ -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 diff --git a/src/transcoding/codec/codecs/libs/omx.c b/src/transcoding/codec/codecs/libs/omx.c index f836becdc..862da09c9 100644 --- a/src/transcoding/codec/codecs/libs/omx.c +++ b/src/transcoding/codec/codecs/libs/omx.c @@ -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, }; diff --git a/src/transcoding/codec/codecs/libs/vaapi.c b/src/transcoding/codec/codecs/libs/vaapi.c index c0104ee5c..037bde8d7 100644 --- a/src/transcoding/codec/codecs/libs/vaapi.c +++ b/src/transcoding/codec/codecs/libs/vaapi.c @@ -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, }; diff --git a/src/transcoding/codec/codecs/mp2.c b/src/transcoding/codec/codecs/mp2.c index 84952a525..61795659a 100644 --- a/src/transcoding/codec/codecs/mp2.c +++ b/src/transcoding/codec/codecs/mp2.c @@ -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, + }; diff --git a/src/transcoding/codec/codecs/mpeg2video.c b/src/transcoding/codec/codecs/mpeg2video.c index d78f8d426..1b1c3099d 100644 --- a/src/transcoding/codec/codecs/mpeg2video.c +++ b/src/transcoding/codec/codecs/mpeg2video.c @@ -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, }; diff --git a/src/transcoding/codec/codecs/vorbis.c b/src/transcoding/codec/codecs/vorbis.c index 89df6b2d5..c1b88e663 100644 --- a/src/transcoding/codec/codecs/vorbis.c +++ b/src/transcoding/codec/codecs/vorbis.c @@ -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, }; diff --git a/src/transcoding/codec/profile.c b/src/transcoding/codec/profile.c index da277c1f4..424f42228 100644 --- a/src/transcoding/codec/profile.c +++ b/src/transcoding/codec/profile.c @@ -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 : ""); } @@ -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) {