]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
profile video resize improvements
authoralingherghescu <alin_gherghescu@yahoo.com>
Tue, 10 Jan 2023 20:47:10 +0000 (12:47 -0800)
committerFlole998 <Flole998@users.noreply.github.com>
Sat, 14 Jan 2023 02:04:22 +0000 (03:04 +0100)
- 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)

src/transcoding/codec/internals.h
src/transcoding/codec/profile_video_class.c

index 908f172a5f44d1acab287da8a3a11aba79f36bc3..5e79c3fc1b3cab9430cc7f14e2f21f8785f4bd0b 100644 (file)
@@ -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;
index 6537745b816ce3b4c54c752aff4b92b3444f49ca..c5ac19f05a64e2f4cf94151716d1d762371055f6 100644 (file)
 
 #include <libavutil/pixdesc.h>
 
+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",