Denoise3d- ja unsharp-postpluginit xineliboutputin kanssa

Juttua VDR:n ja VDR pluginien patcheistä

Denoise3d- ja unsharp-postpluginit xineliboutputin kanssa

ViestiKirjoittaja phelin » 09.04.2007 16:44

Tein kokeellisen pätsin, jonka avulla xineliboutputin kanssa voi käyttää denoise3d ja unsharp suotimia. Molemmat, varsinkin denoise3d, ovat aika cpu-intensiivisiä, mutta kannattaa kyllä kokeilla.

denoise3d.c kirjoitti: "This filter aims to reduce image noise producing smooth images and "
"making still images really still (This should enhance compressibility.). "
"It can be given from 0 to 3 parameters. If you omit a parameter, "
"a reasonable value will be inferred."

"Parameters"
" Luma: Spatial luma strength (default = 4)"
" Chroma: Spatial chroma strength (default = 3)"
" Time: Temporal strength (default = 6)"

"* mplayer's denoise3d (C) 2003 Daniel Moreno"


unsharp.c kirjoitti: "Unsharp mask / gaussian blur"
"It is possible to set the width and height of the matrix, "
"odd sized in both directions (min = 3x3, max = 13x11 or 11x13, "
"usually something between 3x3 and 7x7) and the relative amount "
"of sharpness/blur to add to the image (a sane range should be "
"-1.5 - 1.5)."

"Parameters"

" Luma_matrix_width: Width of the matrix (must be odd)"
" Luma_matrix_height: Height of the matrix (must be odd)"
" Luma_amount: Relative amount of sharpness/blur (=0 disable, <0>0 sharpen)"
" Chroma_matrix_width: Width of the matrix (must be odd)"
" Chroma_matrix_height: Height of the matrix (must be odd)"
" Chroma_amount: Relative amount of sharpness/blur (=0 disable, <0>0 sharpen)"

"* mplayer's unsharp (C) 2002 Remi Guyomarch"


Koodi: Valitse kaikki
diff -Nru vdr-xineliboutput-cvs20070409_orig/config.c vdr-xineliboutput-cvs20070409/config.c
--- vdr-xineliboutput-cvs20070409_orig/config.c   2007-04-09 15:05:56.000000000 +0300
+++ vdr-xineliboutput-cvs20070409/config.c   2007-04-09 15:06:54.000000000 +0300
@@ -227,6 +227,34 @@
   return NULL;
 }
 
+const char *config_t::UnsharpOptions(void)
+{
+  if(unsharp) {
+    static char buffer[128];
+    snprintf(buffer, sizeof(buffer),
+             "luma_matrix_width=%d,luma_matrix_height=%d,luma_amount=%d,"
+             "chroma_matrix_width=%d,chroma_matrix_height=%d,chroma_amount=%d",
+             unsharp_luma_matrix_width,unsharp_luma_matrix_height,(unsharp_luma_amount/10),
+             unsharp_chroma_matrix_width,unsharp_chroma_matrix_height,(unsharp_chroma_amount/10));
+    buffer[sizeof(buffer)-1] = 0;
+    return buffer;
+  }
+  return NULL;
+}
+
+const char *config_t::Denoise3dOptions(void)
+{
+  if(denoise3d) {
+    static char buffer[128];
+    snprintf(buffer, sizeof(buffer),
+             "luma=%d,chroma=%d,time=%d",
+             (denoise3d_luma/10),(denoise3d_chroma/10),(denoise3d_time/10));
+    buffer[sizeof(buffer)-1] = 0;
+    return buffer;
+  }
+  return NULL;
+}
+
 config_t::config_t() {
   memset(this, 0, sizeof(config_t));
 
@@ -533,6 +561,17 @@
   else if (!strcasecmp(Name, "Post.pp.Enable"))    ffmpeg_pp = atoi(Value);
   else if (!strcasecmp(Name, "Post.pp.Quality"))   ffmpeg_pp_quality = atoi(Value);
   else if (!strcasecmp(Name, "Post.pp.Mode"))      STRN0CPY(ffmpeg_pp_mode, Value);
+  else if (!strcasecmp(Name, "Post.unsharp.Enable"))               unsharp                      = atoi(Value);
+  else if (!strcasecmp(Name, "Post.unsharp.luma_matrix_width"))    unsharp_luma_matrix_width    = atoi(Value);
+  else if (!strcasecmp(Name, "Post.unsharp.luma_matrix_height"))   unsharp_luma_matrix_height   = atoi(Value);
+  else if (!strcasecmp(Name, "Post.unsharp.luma_amount"))          unsharp_luma_amount          = atoi(Value);
+  else if (!strcasecmp(Name, "Post.unsharp.chroma_matrix_width"))  unsharp_chroma_matrix_width  = atoi(Value);
+  else if (!strcasecmp(Name, "Post.unsharp.chroma_matrix_height")) unsharp_chroma_matrix_height = atoi(Value);
+  else if (!strcasecmp(Name, "Post.unsharp.chroma_amount"))        unsharp_chroma_amount        = atoi(Value);
+  else if (!strcasecmp(Name, "Post.denoise3d.Enable"))  denoise3d        = atoi(Value);
+  else if (!strcasecmp(Name, "Post.denoise3d.luma"))    denoise3d_luma   = atoi(Value);
+  else if (!strcasecmp(Name, "Post.denoise3d.chroma"))  denoise3d_chroma = atoi(Value);
+  else if (!strcasecmp(Name, "Post.denoise3d.time"))    denoise3d_time   = atoi(Value);
 #if 1 // 1.0.0pre6
   else if (!strcasecmp(Name, "BrowseFilesDir"))    STRN0CPY(browse_files_dir, Value);
   else if (!strcasecmp(Name, "BrowseMusicDir"))    STRN0CPY(browse_music_dir, Value);
diff -Nru vdr-xineliboutput-cvs20070409_orig/config.h vdr-xineliboutput-cvs20070409/config.h
--- vdr-xineliboutput-cvs20070409_orig/config.h   2007-04-09 15:05:56.000000000 +0300
+++ vdr-xineliboutput-cvs20070409/config.h   2007-04-09 15:06:54.000000000 +0300
@@ -195,6 +195,17 @@
     int  ffmpeg_pp; 
     int  ffmpeg_pp_quality;   // 0...6
     char ffmpeg_pp_mode[256];
+    int  unsharp;
+    int  unsharp_luma_matrix_width; // 3..11, should be an odd number
+    int  unsharp_luma_matrix_height; // 3..11, should be an odd number
+    int  unsharp_luma_amount; // Actually a double between -2.0 and 2.0, but handled as a int between -20 and 20
+    int  unsharp_chroma_matrix_width; // 3..11, should be an odd number
+    int  unsharp_chroma_matrix_height; // 3..11, should be an odd number
+    int  unsharp_chroma_amount; // Actually a double between -2.0 and 2.0, but handled as a int between -20 and 20
+    int  denoise3d;
+    int  denoise3d_luma; // Actually a double between 0.0 and 10.0, but handled as a int between 0 and 100
+    int  denoise3d_chroma; // Actually a double between 0.0 and 10.0, but handled as a int between 0 and 100
+    int  denoise3d_time; // Actually a double between 0.0 and 10.0, but handled as a int between 0 and 100
     int  display_aspect;
     
     int  hide_main_menu;
@@ -276,6 +287,8 @@
 
     const char *AutocropOptions(void);
     const char *FfmpegPpOptions(void);
+    const char *UnsharpOptions(void);
+    const char *Denoise3dOptions(void);
 
     template<typename> bool IsOptionHidden(T & option)
       { return hidden_options[(int)((long int)&option - (long int)this)];};
diff -Nru vdr-xineliboutput-cvs20070409_orig/frontend_local.c vdr-xineliboutput-cvs20070409/frontend_local.c
--- vdr-xineliboutput-cvs20070409_orig/frontend_local.c   2007-04-09 15:05:56.000000000 +0300
+++ vdr-xineliboutput-cvs20070409/frontend_local.c   2007-04-09 15:06:54.000000000 +0300
@@ -428,6 +428,11 @@
              xc.AutocropOptions());
     ConfigurePostprocessing("pp", xc.ffmpeg_pp ? true : false,
              xc.FfmpegPpOptions());
+    ConfigurePostprocessing("unsharp",xc.unsharp ? true : false,
+                            xc.UnsharpOptions());
+    ConfigurePostprocessing("denoise3d",xc.denoise3d ? true : false,
+                            xc.Denoise3dOptions());
+
 
 #ifdef ENABLE_TEST_POSTPLUGINS
     ConfigurePostprocessing("headphone", xc.headphone ? true : false, NULL);
diff -Nru vdr-xineliboutput-cvs20070409_orig/frontend_svr.c vdr-xineliboutput-cvs20070409/frontend_svr.c
--- vdr-xineliboutput-cvs20070409_orig/frontend_svr.c   2007-04-09 15:05:56.000000000 +0300
+++ vdr-xineliboutput-cvs20070409/frontend_svr.c   2007-04-09 15:06:54.000000000 +0300
@@ -1153,6 +1153,11 @@
            xc.AutocropOptions());
   ConfigurePostprocessing("pp", xc.ffmpeg_pp ? true : false,
            xc.FfmpegPpOptions());
+  ConfigurePostprocessing("unsharp",xc.unsharp ? true : false,
+                            xc.UnsharpOptions());
+  ConfigurePostprocessing("denoise3d",xc.denoise3d ? true : false,
+                          xc.Denoise3dOptions());
+
   fd_control[cli].write_cmd("CLEAR\r\n");
 
 #ifdef ENABLE_TEST_POSTPLUGINS
diff -Nru vdr-xineliboutput-cvs20070409_orig/menuitems.c vdr-xineliboutput-cvs20070409/menuitems.c
--- vdr-xineliboutput-cvs20070409_orig/menuitems.c   2007-04-09 15:05:55.000000000 +0300
+++ vdr-xineliboutput-cvs20070409/menuitems.c   2007-04-09 15:06:54.000000000 +0300
@@ -46,6 +46,57 @@
     SetValue(buf);
   }
 }
+// --- cMenuEditOddIntItem ------------------------------------------------------
+cMenuEditOddIntItem::cMenuEditOddIntItem(const char *Name, int *Value, int Min, int Max, const char *MinString, const char *MaxString)
+:cMenuEditIntItem(Name,Value,Min,Max,MinString,MaxString)
+{
+  value = Value;
+  min = Min;
+  max = Max;
+  minString = MinString;
+  maxString = MaxString;
+  if (*value <min> max)
+     *value = max;
+  Set();
+}
+
+eOSState cMenuEditOddIntItem::ProcessKey(eKeys Key)
+{
+  eOSState state = cMenuEditItem::ProcessKey(Key);
+
+  if (state == osUnknown) {
+     int newValue = *value;
+     bool IsRepeat = Key & k_Repeat;
+     Key = NORMALKEY(Key);
+     switch (Key) {
+       case kNone: break;
+       case kLeft:
+            newValue = *value - 2;
+            fresh = true;
+            if (!IsRepeat && newValue <min> max && min != INT_MIN)
+               newValue = min;
+            break;
+       default:
+            if (*value <min> max) { *value = max; Set(); }
+            return state;
+       }
+     if (newValue != *value && (!fresh || min <= newValue) && newValue <= max) {
+        *value = newValue;
+        Set();
+        }
+     state = osContinue;
+     }
+  return state;
+}
 
 // --- cMenuEditStraI18nItem -------------------------------------------------
 
diff -Nru vdr-xineliboutput-cvs20070409_orig/menuitems.h vdr-xineliboutput-cvs20070409/menuitems.h
--- vdr-xineliboutput-cvs20070409_orig/menuitems.h   2007-04-09 15:05:55.000000000 +0300
+++ vdr-xineliboutput-cvs20070409/menuitems.h   2007-04-09 15:06:54.000000000 +0300
@@ -30,6 +30,16 @@
     ~cMenuEditTypedIntItem();
 };
 
+// --- cMenuEditOddIntItem -------------------------------------------------
+
+class cMenuEditOddIntItem : public cMenuEditIntItem
+{
+  public:
+    cMenuEditOddIntItem(const char *Name, int *Value, int Min = 1, int Max = INT_MAX, const char *MinString = NULL, const char *MaxString = NULL);
+    eOSState ProcessKey(eKeys Key);
+};
+
+
 // --- cMenuEditStraI18nItem -------------------------------------------------
 
 class cMenuEditStraI18nItem : public cMenuEditIntItem
diff -Nru vdr-xineliboutput-cvs20070409_orig/setup_menu.c vdr-xineliboutput-cvs20070409/setup_menu.c
--- vdr-xineliboutput-cvs20070409_orig/setup_menu.c   2007-04-09 15:05:56.000000000 +0300
+++ vdr-xineliboutput-cvs20070409/setup_menu.c   2007-04-09 15:06:54.000000000 +0300
@@ -491,6 +491,8 @@
     cOsdItem *ctrl_pp;
     cOsdItem *ctrl_deinterlace;
     cOsdItem *ctrl_deinterlace_opts;
+    cOsdItem *ctrl_unsharp;
+    cOsdItem *ctrl_denoise3d;
 
     int deinterlace;
     struct tvtime_s tvtime;
@@ -532,6 +534,10 @@
   cXinelibDevice::Instance().ConfigurePostprocessing(
        "pp", xc.ffmpeg_pp ? true : false, xc.FfmpegPpOptions());
   cXinelibDevice::Instance().ConfigurePostprocessing(
+       "unsharp", xc.unsharp ? true : false, xc.UnsharpOptions());
+  cXinelibDevice::Instance().ConfigurePostprocessing(
+       "denoise3d", xc.denoise3d ? true : false, xc.Denoise3dOptions());
+  cXinelibDevice::Instance().ConfigurePostprocessing(
         xc.deinterlace_method, xc.audio_delay, xc.audio_compression,
         xc.audio_equalizer, xc.audio_surround, xc.speaker_type);
 }
@@ -598,6 +604,35 @@
                &tvtime.chroma_filter));
   }
 
+  Add(ctrl_unsharp = new cMenuEditBoolItem(tr("Unsharp mask"),
+                                      &newconfig.unsharp));
+  if(newconfig.unsharp) {
+    Add(new cMenuEditOddIntItem( tr("  Width of the luma matrix"),
+                              &newconfig.unsharp_luma_matrix_width, 3, 11));
+    Add(new cMenuEditOddIntItem( tr("  Height of the luma matrix"),
+                              &newconfig.unsharp_luma_matrix_height, 3, 11));
+    Add(new cMenuEditIntItem( tr("  Amount of luma sharpness/blur"),
+                              &newconfig.unsharp_luma_amount, -20, 20));
+    Add(new cMenuEditOddIntItem( tr("  Width of the chroma matrix"),
+                              &newconfig.unsharp_chroma_matrix_width, 3, 11));
+    Add(new cMenuEditOddIntItem( tr("  Height of the chroma matrix"),
+                              &newconfig.unsharp_chroma_matrix_height, 3, 11));
+    Add(new cMenuEditIntItem( tr("  Amount of chroma sharpness/blur"),
+                              &newconfig.unsharp_chroma_amount, -20, 20));
+  }
+
+  Add(ctrl_denoise3d = new cMenuEditBoolItem(tr("3D Denoiser"),
+                                      &newconfig.denoise3d));
+  if(newconfig.denoise3d) {
+    Add(new cMenuEditIntItem( tr("  Spatial luma strength"),
+                              &newconfig.denoise3d_luma, 0, 100));
+    Add(new cMenuEditIntItem( tr("  Spatial chroma strength"),
+                              &newconfig.denoise3d_chroma, 0, 100));
+    Add(new cMenuEditIntItem( tr("  Temporal strength"),
+                              &newconfig.denoise3d_time, 0, 100));
+  }
+
+
 #ifdef INTEGER_CONFIG_VIDEO_CONTROLS
   Add(new cMenuEditIntItem(tr("HUE"), &newconfig.hue, -1, 0xffff));
   Add(new cMenuEditIntItem(tr("Saturation"), &newconfig.saturation,-1,0xffff));
@@ -662,7 +697,20 @@
     "pp", newconfig.ffmpeg_pp ? true : false,
     newconfig.FfmpegPpOptions());
     Set();
-  } else if(item == ctrl_deinterlace) {
+  }
+  else if(item == ctrl_unsharp) {
+    cXinelibDevice::Instance().ConfigurePostprocessing(
+         "unsharp", newconfig.unsharp ? true : false,
+         newconfig.UnsharpOptions());
+    Set();
+  }
+  else if(item == ctrl_denoise3d) {
+    cXinelibDevice::Instance().ConfigurePostprocessing(
+         "denoise3d", newconfig.denoise3d ? true : false,
+         newconfig.Denoise3dOptions());
+    Set();
+  }
+  else if(item == ctrl_deinterlace) {
     if(deinterlace == DEINTERLACE_TVTIME && !ctrl_deinterlace_opts) {
       Set();
     } else if(deinterlace != DEINTERLACE_TVTIME && ctrl_deinterlace_opts) {
@@ -703,6 +751,17 @@
   SetupStore("Post.pp.Enable",   xc.ffmpeg_pp);
   SetupStore("Post.pp.Quality",  xc.ffmpeg_pp_quality);
   SetupStore("Post.pp.Mode",     xc.ffmpeg_pp_mode);
+  SetupStore("Post.unsharp.Enable",               xc.unsharp);
+  SetupStore("Post.unsharp.luma_matrix_width",    xc.unsharp_luma_matrix_width);
+  SetupStore("Post.unsharp.luma_matrix_height",   xc.unsharp_luma_matrix_height);
+  SetupStore("Post.unsharp.luma_amount",          xc.unsharp_luma_amount);
+  SetupStore("Post.unsharp.chroma_matrix_width",  xc.unsharp_chroma_matrix_width);
+  SetupStore("Post.unsharp.chroma_matrix_height", xc.unsharp_chroma_matrix_height);
+  SetupStore("Post.unsharp.chroma_amount",        xc.unsharp_chroma_amount);
+  SetupStore("Post.denoise3d.Enable",   xc.denoise3d);
+  SetupStore("Post.denoise3d.luma",     xc.denoise3d_luma);
+  SetupStore("Post.denoise3d.chroma",   xc.denoise3d_chroma);
+  SetupStore("Post.denoise3d.time",     xc.denoise3d_time);
 }

 
Avatar
phelin
Yli-ihminen
 
Viestit: 1256
Liittynyt: 09.02.2005 3:00
Paikkakunta: Helsinki

ViestiKirjoittaja Jack_73 » 17.05.2007 18:27

Kukaan testannut näitä?
Kiinnostais kaikenlainen kuvanparannus mitä tuon xineliboutputin kanssa voisi käyttää.
Avatar
Jack_73
Säätäjä
 
Viestit: 238
Liittynyt: 21.07.2004 3:00
Paikkakunta: Jyväskylä

ViestiKirjoittaja phi » 17.05.2007 22:02

Jack_73 kirjoitti:Kukaan testannut näitä?
Kiinnostais kaikenlainen kuvanparannus mitä tuon xineliboutputin kanssa voisi käyttää.


Ainakin unsharp:sta on positiivisia kokemuksia. Eron todella huomaa ylipakatuiden kotimaisten kanavien kohdalla, etenkin jos kuvaa vielä skaalataan suuremmalle näyttöresoluutiolle.
Tuo kyllä vaatii melkoisesti tehoa laitteistolta, arviolta samaa luokkaa kun raskaimmat lomituksenpoistoalgoritmit (2.4GHz Core2 E6600:n kanssa paras lomituksenpoisto + unsharp käyttää lähes 80% toisesta ytimestä, asetuksina 5x5 matriisit ja -0.5 blur). Eli HDTV:n kanssa turha edes kokeilla...
phi
Vanhempi asiantuntija
 
Viestit: 179
Liittynyt: 12.09.2006 17:11

ViestiKirjoittaja phelin » 17.05.2007 22:09

phi kirjoitti:Tuo kyllä vaatii melkoisesti tehoa laitteistolta, arviolta samaa luokkaa kun raskaimmat lomituksenpoistoalgoritmit (2.4GHz Core2 E6600:n kanssa paras lomituksenpoisto + unsharp käyttää lähes 80% toisesta ytimestä, asetuksina 5x5 matriisit ja -0.5 blur). Eli HDTV:n kanssa turha edes kokeilla...


... eikä pitäisi oikeasstaan olla tarvettakaan, sillä parhaiten terävöitys auttaa skaalauksen seurauksena pehmenneeseen kuvaan. Denoise3d:n hyödyllisyydestä puolestaan on vaikea sanoa mitään, se kun ei pyöri E6300:llani sitten millään.
Avatar
phelin
Yli-ihminen
 
Viestit: 1256
Liittynyt: 09.02.2005 3:00
Paikkakunta: Helsinki

ViestiKirjoittaja Jack_73 » 18.05.2007 10:32

Vaatiikos tämä muuta kuin tuon patchin, että saa nuo käyttöön?
Suoraa patchaamalla en saanut noita uppoamaan, mutta käsin tein muutokset ja käännökset ainakin meni läpi.
Avatar
Jack_73
Säätäjä
 
Viestit: 238
Liittynyt: 21.07.2004 3:00
Paikkakunta: Jyväskylä

ViestiKirjoittaja phelin » 18.05.2007 10:56

Jack_73 kirjoitti:Vaatiikos tämä muuta kuin tuon patchin, että saa nuo käyttöön?
Suoraa patchaamalla en saanut noita uppoamaan, mutta käsin tein muutokset ja käännökset ainakin meni läpi.


Voit myös ottaa tuoreen cvs-version, sillä (parannettu) pätsi on jo cvs:ssä.
Avatar
phelin
Yli-ihminen
 
Viestit: 1256
Liittynyt: 09.02.2005 3:00
Paikkakunta: Helsinki

ViestiKirjoittaja Lake-end » 29.05.2007 14:19

Hei, joko patsisi löytyy tuosta 1.0.0rc2 versiosta, se näyttäisi olevan julkaistu samoihin aikoihin postauksesi kanssa?
Lake-end
Vanhempi harrastaja
 
Viestit: 62
Liittynyt: 29.10.2006 22:01

ViestiKirjoittaja Kurmu » 29.05.2007 16:44

Lake-end kirjoitti:Hei, joko patsisi löytyy tuosta 1.0.0rc2 versiosta, se näyttäisi olevan julkaistu samoihin aikoihin postauksesi kanssa?

Löytyy. Gentoon portagesta löytyy myöskin em. versio, jos sitä satut käyttämään.
Milläköhän asetuksilla tuota kannattaisi lähteä kokeilemaan. Omissa testauksissa tuloksena on aina vain diashow. Prossuna on amd64 3500+.
Kurmu
Havittelija
 
Viestit: 34
Liittynyt: 04.11.2006 22:35
Paikkakunta: Järvenpää


Paluu Patchit

Paikallaolijat

Käyttäjiä lukemassa tätä aluetta: Ei rekisteröityneitä käyttäjiä ja 1 vierailijaa