From: alingherghescu Date: Tue, 10 Jan 2023 20:47:10 +0000 (-0800) Subject: profile video resize improvements X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1eeb608033804c3b5b35c842389f276cde299600;p=thirdparty%2Ftvheadend.git profile video resize improvements - provide the ability to specify if scaling should be performed Up and Down, Up (only) or Down (only) profile video resize improvements - provide the ability to specify if scaling should be performed Up and Down, Up (only) or Down (only) --- diff --git a/src/transcoding/codec/internals.h b/src/transcoding/codec/internals.h index 908f172a5..5e79c3fc1 100644 --- a/src/transcoding/codec/internals.h +++ b/src/transcoding/codec/internals.h @@ -211,6 +211,7 @@ typedef struct tvh_codec_profile_video { TVHCodecProfile; int deinterlace; int height; + int scaling_mode; // 0 --> up&down; 1 --> up; 2 --> down int hwaccel; int pix_fmt; int crf; diff --git a/src/transcoding/codec/profile_video_class.c b/src/transcoding/codec/profile_video_class.c index 6537745b8..c5ac19f05 100644 --- a/src/transcoding/codec/profile_video_class.c +++ b/src/transcoding/codec/profile_video_class.c @@ -22,6 +22,16 @@ #include +static htsmsg_t * +scaling_mode_get_list( void *o, const char *lang ) +{ + static const struct strtab tab[] = { + { N_("Up & Down"), 0 }, + { N_("Up (only)"), 1 }, + { N_("Down (only)"), 2 }, + }; + return strtab2htsmsg(tab, 1, lang); +} /* TVHCodec ================================================================= */ @@ -63,11 +73,34 @@ tvh_codec_profile_video_setup(TVHVideoCodecProfile *self, tvh_ssc_t *ssc) { self->size.den = ssc->es_height; self->size.num = ssc->es_width; - if (self->height) { - self->size.den = self->height; - self->size.den += self->size.den & 1; - self->size.num = self->size.den * ((double)ssc->es_width / ssc->es_height); - self->size.num += self->size.num & 1; + switch (self->scaling_mode) { + case 0: + // scaling up and down + if (self->height) { + self->size.den = self->height; + self->size.den += self->size.den & 1; + self->size.num = (int)((double)self->size.den * ((double)ssc->es_width / (double)ssc->es_height)); + self->size.num += self->size.num & 1; + } + break; + case 1: + // scaling up (only) + if ((self->height > 0) && (self->size.den < self->height)) { + self->size.den = self->height; + self->size.den += self->size.den & 1; + self->size.num = (int)((double)self->size.den * ((double)ssc->es_width / (double)ssc->es_height)); + self->size.num += self->size.num & 1; + } + break; + case 2: + // scaling down (only) + if ((self->height > 0) && (self->size.den > self->height)) { + self->size.den = self->height; + self->size.den += self->size.den & 1; + self->size.num = (int)((double)self->size.den * ((double)ssc->es_width / (double)ssc->es_height)); + self->size.num += self->size.num & 1; + } + break; } return 0; } @@ -165,6 +198,16 @@ const codec_profile_class_t codec_profile_video_class = { .off = offsetof(TVHVideoCodecProfile, height), .def.i = 0, }, + { + .type = PT_INT, + .id = "scaling_mode", + .name = N_("Scaling mode"), + .desc = N_("Allow control for scaling Up&Down, Up or Down"), + .group = 2, + .off = offsetof(TVHVideoCodecProfile, scaling_mode), + .list = scaling_mode_get_list, + .def.i = 0, + }, { .type = PT_BOOL, .id = "hwaccel",