From: Jaroslav Kysela Date: Tue, 29 Aug 2017 16:18:38 +0000 (+0200) Subject: transcode: audio - add track limiter X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=420406953337dc8d7a7c5aa5a5aa522bcbc4ca85;p=thirdparty%2Ftvheadend.git transcode: audio - add track limiter --- diff --git a/src/transcoding/codec/internals.h b/src/transcoding/codec/internals.h index 0f3faad31..dcee72468 100644 --- a/src/transcoding/codec/internals.h +++ b/src/transcoding/codec/internals.h @@ -224,6 +224,7 @@ extern const codec_profile_class_t codec_profile_audio_class; typedef struct tvh_codec_profile_audio_t { TVHCodecProfile; + int tracks; const char *language1; const char *language2; const char *language3; diff --git a/src/transcoding/codec/profile.c b/src/transcoding/codec/profile.c index 424f42228..1ffc5aafd 100644 --- a/src/transcoding/codec/profile.c +++ b/src/transcoding/codec/profile.c @@ -289,6 +289,7 @@ tvh_codec_profile_audio_init(TVHCodecProfile *_self, htsmsg_t *conf) { TVHAudioCodecProfile *self = (TVHAudioCodecProfile *)_self; self->sample_fmt = AV_SAMPLE_FMT_NONE; + self->tracks = 1; return 0; } diff --git a/src/transcoding/codec/profile_audio_class.c b/src/transcoding/codec/profile_audio_class.c index 01aa57367..6287949e4 100644 --- a/src/transcoding/codec/profile_audio_class.c +++ b/src/transcoding/codec/profile_audio_class.c @@ -254,6 +254,15 @@ const codec_profile_class_t codec_profile_audio_class = { .ic_class = "codec_profile_audio", .ic_caption = N_("audio"), .ic_properties = (const property_t[]) { + { + .type = PT_INT, + .id = "tracks", + .name = N_("Limit audio tracks"), + .desc = N_("Use only defined number of audio tracks at maximum."), + .group = 2, + .off = offsetof(TVHAudioCodecProfile, tracks), + .def.i = 1, + }, { .type = PT_STR, .id = "language1", diff --git a/src/transcoding/transcode/transcoder.c b/src/transcoding/transcode/transcoder.c index a739497da..134c7b870 100644 --- a/src/transcoding/transcode/transcoder.c +++ b/src/transcoding/transcode/transcoder.c @@ -144,16 +144,31 @@ tvh_transcoder_start(TVHTranscoder *self, tvh_ss_t *ss_src) indexes[count++] = video_index; } if (audio_index >= 0) { - indexes[count++] = audio_index; + for (i = j = 0; i < ARRAY_SIZE(audio_pindex); i++) { + if (audio_pindex[i] >= 0) { + indexes[count++] = audio_pindex[i]; + if ((ssc = &ss_src->ss_components[audio_pindex[i]]) == NULL) + continue; + media_type = ssc_get_media_type(ssc); + if (media_type != AVMEDIA_TYPE_AUDIO) + continue; + aprofile = (TVHAudioCodecProfile *)self->profiles[media_type]; + if (++j >= aprofile->tracks) + break; + } + } } else { /* nothing is preferred, use all audio tracks */ - for (i = 0; i < ss_src->ss_num_components; i++) { + for (i = j = 0; i < ss_src->ss_num_components; i++) { if ((ssc = &ss_src->ss_components[i]) == NULL) continue; media_type = ssc_get_media_type(ssc); if (media_type != AVMEDIA_TYPE_AUDIO) continue; indexes[count++] = i; + aprofile = (TVHAudioCodecProfile *)self->profiles[media_type]; + if (++j >= aprofile->tracks) + break; } } if (subtitle_index >= 0) {