Jump to content
SnoopyDog

Video frame rate switcher

Recommended Posts

CiNcH

I also like how MPC-HC realizes setting the display mode by using the Windows API.

 

Through the settings UI it is possible to set the mode (resolution + color depth + refresh rate) per video fps:

PPageFullscreen.png

It is also possible to set the display that is supposed to show video for which the "mode" has to be applied.

 

PPageFullscreen.cpp (CPPageFullscreen::ModesUpdate): reading valid modes (resolution + color depth + refresh rate) and providing them via the UI (see above screenshot)

 

MainFrm.cpp (CMainFrame::AutoChangeMonitorMode): setting mode according to UI selection for a given video fps (triggers SetDispMode)

 

mplayerc.cpp (SetDispMode): implementation of mode setting

Share this post


Link to post
nuts

ChangeDisplaySettings

bzw. das hier

ChangeDisplaySettingsEx

wird dafür verwendet. (ka ob das schon in den links steht c++ ist für mich schwer lesbar :wacko:)

Klappt bei mir super. :bye:

 

P.S. Sorry for my post in german o:)

Edited by nuts

Share this post


Link to post
CiNcH

This is what 'SetDispMode' within file mplayerc.cpp does (see reference in my above posting).

Share this post


Link to post
Tjod

Be careful full with GPL coed. Changing the Plugin license to GPL is not possible (because the DVBViewer is not GPL an it uses the Plugin interface from the DVBViewer).

(You can only use LGPL for plugins, if you like.)

 

But you can't use the LGPL if you use GPL coed. You have to use the GPL.

Share this post


Link to post
nuts

Its just a dll call (win api User32.dll) - I think snoopydog can manage this alone :)

Edited by nuts

Share this post


Link to post
CiNcH

As nuts already pointed out, this is just an example of how to use the Windows API, behind which the actual logic is hidden.

 

As a Linux kernel module/driver developer, I am dealing with licensing issues on a daily basis ;) .

 

COM "plugins" can be GPL as they are not binary linked to the DVBViewer but via an IPC/RPC interface.

Share this post


Link to post
sw4y

ChangeDisplaySettings

bzw. das hier

ChangeDisplaySettingsEx

wird dafür verwendet. (ka ob das schon in den links steht c++ ist für mich schwer lesbar :wacko:)

Klappt bei mir super. :bye:

 

P.S. Sorry for my post in german o:)

 

Does this mean you already change frequencies in exclusive mode?

 

I'm sorry, but I don't understand c++ neither I understand any other coding language :)

 

So would be great if this works!

Share this post


Link to post
CiNcH
Does this mean you already change frequencies in exclusive mode?

The plugin does not change the display mode via the Windows API. This was just an example of how MPC-HC handles it.

 

Ex has nothing to do with 'D3D Exclusive' in this context. Both functions do the same thing basically, with the exception that with the Ex function, you can also pass the display for which the mode should be applied.

 

Don't know whether this works better for 'D3D Exclusive' compared to other methods (like ATi profiles). But it may very well be.

 

 

Maybe you can also try the approach with external applications and use PowerStrip profiles/shortcuts.

Share this post


Link to post
sw4y

Thanks CiNcH for the explanation, maybe I'll give Powerstrip a try.

Share this post


Link to post
nuts

Someone is interested in testing the ChangeDisplaySettings function?

The refreshrate can be changed in D3D exclusive mode but its not very stable :wacko:

 

Maybe it depends on driver, gpu hardware?

Edited by nuts

Share this post


Link to post
CiNcH
The refreshrate can be changed in D3D exclusive mode but its not very stable

Anybody ever tried PowerStrip? It bypasses Windows and GPU driver and can set refresh rate independent from other mode settings directly on dedicated GPU registers. HD 5000 series is supported with this beta.

Share this post


Link to post
sw4y

Can Powerstrip somehow be combined with DVBViewer to automatically recognize the actual frame rate and change profiles automatically?

Share this post


Link to post
nuts

For testing the ChangeDisplaySettings function you can try this Skript (source & exe).

 

Its just for tests and you can only set the refreshrate (23, 24, 50, 60 hz).

The easiest way to run the script is to use menu edit.

set display.rar

Share this post


Link to post
sw4y

Tested your script and implemented it with menu editor.

 

It does change the refresh rate in exclusive mode, but all I get is a black screen after switching the rate. Sound does go on.

 

I'm using a HD4550 with current drivers, DVBViewer 4.5 and Win 7 32bit.

 

Maybe that helps.

 

Thanks anyway for your work!

Share this post


Link to post
CiNcH
Can Powerstrip somehow be combined with DVBViewer to automatically recognize the actual frame rate and change profiles automatically?

PowerStrip is meant to be used together with SnoopyDog's 'Frequency control'. Here is how it works:

 

 

Create modelines for different display modes within PowerStrip (read FAQ),

e.g. 1080p @ 50Hz and 24Hz:

 

1920,528,44,148,1080,4,5,36,148500,528
1920,638,44,148,1080,4,5,36,74250,528

 

 

Configure 'Frequency control' the following way:

 

Profile switching

Activation method: Start external application

External application name: C:\Program Files\PowerStrip\PStrip.exe /T:%s

 

Frequency to profile mapping

24 Hertz: Profile 2

25 Hertz: Profile 1

48 Hertz: Profile 2

50 Hertz: Profile 1

 

Profile contents

Profile 1: 1920,528,44,148,1080,4,5,36,148500,528

Profile 2: 1920,638,44,148,1080,4,5,36,74250,528

 

 

I did not try it with D3D Exclusive yet.

Share this post


Link to post
sw4y

Thanks CiNcH, I'll give that a try!

Share this post


Link to post
CiNcH

I tried it with D3D Exclusive. The plugin (PowerStrip) and system (AMD driver?) always switch back and forth between 24 Hz and 50 Hz. Guess you can't run D3D Exclusive @ 24 Hz.

Share this post


Link to post
sw4y

Does not work for me either... Damn, I really would like to have D3Dexclusive together with automatic refresh rate changes...

Thanks anyway for testing the whole thing, maybe someone makes it work in future versions ;-)

Share this post


Link to post
SnoopyDog

Hi @all! Made some small changes, but no update yet. Introduced a profile for "23 Hertz", cause i can configure a 23 Hertz mode with nVidia cards. Moved the switching trigger from "DVBViewer.OnPlaybackStart" to "DVBViewer.OnPlaystateChange" cause it works more reliable there. Will implement the Windows API function as another alternative.

 

Tried to mess with D3D exclusive in Custom Renderer mode a lot, but still no success. Even if i do manually

  • Switch DVBViewer from fullscreen to window (should exit from D3D exclusive)
  • Switch graphics card to the matching frequency.
  • Rebuild the graph
  • Switch DVBViewer back to full screen (should start D3D excl again)

i got lots of problems. But i'm still trying... ;)

Share this post


Link to post
SnoopyDog

Uploaded an update with the features mentioned before :)

Share this post


Link to post
udo83

hallo,

 

Das Plugin funktioniert ansich sehr gut.

Wenn ich TV schaue (25fps = 50 Hz) und dann aber auf ne MKV mit 23,97fps also 24Hz wechsele, scheint es ein problem zu geben.

Er wechselt den Modus zuverlässig auf 24HZ doch funktioniert dann das Hardware Encoding über den Power DVD Codec nicht mehr.

Wenn ich den Encoder wechsele und wieder zurückstelle läuft es.

Den Graph neustarten geht auch.

Bei der Umstellung der Frequenz scheint er irgendwie das Hardware Encoding zu deaktiveren.

Gibt es da ne Lösung?

 

Verwende XP Overlay.

 

Wenn ich in der Ini in

C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\MR-Soft\

Rebiuld Graph = 1 einstellen geht das Plugin nicht mehr auf.

aber Rebiuldgraph sollte das problem doch lösen?

Edited by udo83

Share this post


Link to post
popy

Hallo Udo.

 

Hatte das Problem auch, ich habe es so gelöst:

 

* Video frame rate Switcher führt eine AutoIT EXE mit parameter aus (z.B.: 50Hz = 1, 24 Hz = 2 usw.).

* Das Script sendet einen Tastenbefehl (STRG+ALT+Profil damit CCC das Profil umschaltet).

* Weiters führt die EXE Eventghost mit dem Parameter -e "ProfileChanged" aus damit ein Event ausgelöst wird

* Dieses Event triggert ein RebuildGraph in DVBViewer

 

Hab es anders auch nicht hinbekommen.

 

@SnoppyDog: Hast du ne idee warum dass mit dem Plugin nicht geht?

 

Danke

pOpY

Edited by popy

Share this post


Link to post
udo83

Danke!

immerhin ein lösungsansatz...

Das werd ich (falls snoopy hier nix mehr sagt) auch mal ausprobieren.

Am einfachsten wär natürlich wenn der Parameter rebuildgraph=1 auch das tun würde was man erwartet.

Edited by udo83

Share this post


Link to post
udo83

Hallo,

 

habs nun probiert... so ähnlich wie du nur etwas weniger komplziert... funktion dürfte die gleiche sein..

Ansich funktionierts relativ zuverlässig. Allerdings alles andere als Stabil. Beim Profilswitch gibt es des öfteren DVBViewer abstürze usw..

Ich denke ich werde warten müssen bis snoopydog dem Ini Eintrag "rebuildgraph" der richtigen funktion zugeordnet hat?

Anbei der Code meiner Bat falls interessant..

 

@echo off

"C:\Programme\ATI Technologies\ATI.ACE\Core-Static\cli.exe" "Start Load profilename=%1"
wait 10000
start C:\Programme\DVBViewer\DVBViewer.exe -x53
exit

Share this post


Link to post
popy

Das Problem hatte ich auch.

 

Mach noch ein Wait 3000ms (kannst auch testen wie weit du runter gehen kannst) zwischen "Echo off" und dem profil umschalten mit cli.exe.

Bei mir funktioniert es sehr zuverlässig.

 

cu

pOpY

Share this post


Link to post
udo83

das versuch ich mal!

danke!

melde mich wenn ichs probiert hab.

Share this post


Link to post
udo83

crashed trotzdem noch auch bei:

 

wait 10000
"C:\Programme\ATI Technologies\ATI.ACE\Core-Static\cli.exe" Start Load profilename=%1
wait 10000
start C:\Programme\DVBViewer\DvbViewer0.exe -x53
exit

 

ich will nachher mal testen wie es ist wenn ich den graph erst komplett schliesse dann das ATI Profil ändere und dann den Graph neustarte..

Share this post


Link to post
popy

Hallo Udo,

 

Im Anhang das AutoIt Script mit dem ich das mache. Dieses Script wird vom Frame Rate Switcher mit einer Zahl als Parameter aufgerufen.

 

lg

pOpy

 

AtiProfileSwitcher.zip

Share this post


Link to post
udo83

dank dir!

dasd check ich nachher auch ma!

hoffe das funktioniert!

bekomme das zwar auch alles mit recloch hin aber es fühl sich irgendwie nicht richtig an =)

 

kann ich den code dazu auch mal sehen?

 

weiß ja nicht genau was da abläuft und vor allem welche zahl welchem profil unterliegt etc.

 

oder ist das die au3 datei?

=)

Edited by udo83

Share this post


Link to post
popy

Ja das ist die au3 datei.

Du kannst nach AutoIT google, runterladen, installieren, und damit die au3 compilieren in eine exe ;-)

 

Cu popy

Share this post


Link to post
udo83

Hallo Poppy,

okay.

Ich muss zugeben dass ich mit diesen autoit und Windows Scripting zeug nicht so klar komm.

Die Au3 Datei erscheint mir zwar nicht komplett chinesisch erkken aber nicht an welcher stelle er das CCC Profil switch etc.

Ich hätte ein paar Fragen vllt findest du Zeit diese zu beantworten?

 

1. Muss ich Eventghost nur installieren oder brauch ich irgendwelche addins oder settings? (kam bisher immer ohne aus)

 

2. Ich erstelle einfach 3 CCC Profile mit den Namen 1 (24Hz) 2 (50Hz) und 3 (60Hz) und woher weiß das script welchem Profil wieviel Hertz zugeordnet sind?

oder muss Profil 1 z.B unbedingt 50hz haben?

 

3. Warum überhaupt Eventghost?

 

4. Ich stelle mir vor das dein Script genau das gleiche macht wie meine Bat.. oder?

Im Prinzip läuft es so ab.

Ich starte eine MKV Datei -> Film läuft -> kurze Wartezeit -> CCC Profilswitch -> kurze Wartezeit -> Grapch neustarten..

oder hält dein script den Graph an oder macht sonst iwas anderes?

 

Danke im Vorraus

Edited by udo83

Share this post


Link to post
popy

Hallo Udo.

 

Das umschalten des Profils erfolgt genau hier:

 

Send("^!" & $CmdLine[1])

 

Es wird einfach eine Tastatur Kombination von

 

! = STRG

^ = ALT

+ Zahl (die an die EXE übergeben wurde)

 

ins System gesendet.

Im ATI CCC hab ich die Profile mit Hotkeys verknüpft, eben genau STRG-ALT+(Zahl).

 

Hier die Antworten:

 

1. Einfach installieren, du musst halt dann nur unter Plugins (Autostart im Baum auf der linken Seite) den DVBViewer Plugin hinzufügen und mit einem Doppelklick konfigurieren. Siehe hier: http://de.DVBViewer.tv/wiki/EventGhost

 

2. Der Name des Profils ist egal. Am besten du nennst es z.B.: "FullHD 50Hz" oder irgendwie halt damit du dich auskennst :biggrin: Wichtig ist eben nur die Zuweisung von Hotkeys damit das Profil Richtig gewechselt wird wenn die AutoIT EXE die Tastenkombination sendet. (Kannst du natürlich auch im Script ändern und die EXE von CCC zum umschalten verwenden - so wie in deiner BAT)

 

3. Wenn du dich daran gewöhnt hast willst du nicht mehr anders :biggrin: Ich steuere alles über meine Harmony damit und brauche überhaupt keine Maus, Tastatur! z.B.: wenn eine DVD/BluRay eingelegt wird wird PowerDVD gestartet und Eventghost "merkt" das und schaltet die gleichen Tasten was vorher DVBViewer steuerten jetzt richtig für PowerDVD um usw... die Möglichkeiten sind sehr vielfältig mit Eventghost.

 

4. Die Umstellung eines CCC Profils geschieht bei mir wie folgt:

 

  • Video frame rate switcher erkennt andere Bildwiederholfrequenz und startet mein AutoIT Script mit einem Zahlen Parameter (= Hotkey Zahl z.B.: 1 für 50Hz, 2 für 24Hz usw....). Das musst du im Konfigurationsfenster vom Video Frame Rate Switcher einstellen
  • Das Script sendet STRG-ALT-Zahl als Tastenkombination ins System
  • CCC erkennt diese Kombination und schaltet das Profil um
  • Mein Script wartet (die in der INI eingestellte Zeit für Rebuild Graph)
  • und löst das Eventghost Event zum Rebuilden des Graphs aus

 

So funktioniert es bei mir eigentlich immer.

 

Viel Glück

pOpY

Share this post


Link to post
udo83

hallo PoPY,

 

vielen dank für deine ausführliche Antwort.

Dank deiner Tipps konnte ich das sehr gut probieren!

Leider funktioniert es noch immer nicht.

Ich mutmaße das der Unterschied unsere System im wesentlichen darin liegt das du Win Vista/ 7 benutzt

Ich nutze jedoch XP.

Hier scheint das umschalten der Frequnez im CCC bei laufendem Graph einen Crash im DVBViewer zu verursachen.

Da man den Graph einer Mkv Datei zwar beenden aber nciht wieder starten kann (grau... geht also nicht?!?!)

funktioniert die option mit dem Graph stoppen in diesem Fall auch nicht.

Ich dachte daran den DVBViewer bei FPS wechseln zu beenden... dann den CCC mit dem Frequenzwechsel zu beauftragen um dann via "Lastfile" den Dvbvieewer wieder zu starten.

Das funktioniert bei Dateien dann auch gut... beim wechsel auf Tv aber nicht, da er via Lastfile wirklich die letzte Datei wiedergeben möchte... TV zählt hier nicht.

Hast du noch ne Idee!?!

Letzteres wäre nämlich dann wieder doof wenn grad ne aufnahmen läuft etc... würde die sache sehr kompliziert machen.

Edited by udo83

Share this post


Link to post
popy

Ich hatte bis vor kurzem auch noch XP und da hatte das wechseln der Wiederholfrequenz und anschließendes Rebuild auch funktioniert!!

Das mit dem schließen des Viewers find ich jetzt nicht so prokelnd - wie du siehst kommen andere Probleme auf Dich zu.

 

Ich hatte folgendes installiert:

 

XP SP3

Ati ccc 11.2

DVBViewer 4.6 (neueste)

 

Was hast du für einen ATI Treiber? Vll. liegt da das Problem?

 

cu

pOpY

Share this post


Link to post
udo83

es kann tatsächlich an der version liegen... hatte da mal den neuesten treiber (11.3) probiert und hatte prompt die pure katastrophe.

Bei wiedergabe von TV gab es ruckler und bei mkv wiedergabe gab es klötzchenbildung.

ISt die 11.2 da besser?

kommt man da noch dran?

Share this post


Link to post
udo83

du bist einfach das allwissende Orakel =)

Ich werd das mal abchecken und mich daraufhin, wie immer, melden.

Arbeite IMMER mit BACKUPS bei Windows XP sind die ja in null komma nix wiederhergestellt.

Share this post


Link to post
popy

Das Orakel sieht gute zeiten auf uns zukommen :biggrin: :biggrin: :biggrin: *fg*

 

Viel Glück

Share this post


Link to post
udo83

das orakel hat sich getäuscht =)

ne also ich hab sowohl mit 11.2 als auch 10.3 diesen absturz.

Desweiteren merkt er sich bei diesen treibern die einstellung für den Stretch über den kompletten bildschirm nicht (im CCC)

und ich hab klötzchenbildung bei mkv wiedergabe.

scheint wohl so, als hätte ich in dieser sache etwas pech.. ich mein es geht ja mit reclock.. macht erst dann probleme wenn ich 30fps Filme sehe.. was ja doch eher selten ist.

ick fummel da nochn bisschen rum vllt bekomm ich noch was hin.

Wenn nicht jut.. abwarten anjesacht :D

Share this post


Link to post
popy

hmmm, mir ist schon bei meinen ATI "Problemen" aufgefallen dass sich die unterschiedlichen Graka Modelle auch Abhängig von der Treiberversion unterschiedlich verhalten.

Vll. solltest du noch andere Versionen testen...

 

Mein letztes ATI Problem war das die 5770 immer ein Ruckeln bei Bluray Wiedergabe mit PowerDVD hatte (in XP und 7). Nach langem hin und her suchen (Software/Konfigurationsseitig) hab ich meine alte 4650er wieder eingebaut, und siehe da alles läuft perfekt.

Ich vermute das war eine Inkompatibilität zwischen Mainboard & Graka oder das Netzteil war zu schwach für die 5770er - vll. solltest du auch eine andere Graka testen?

 

cu

pOpY

Edited by popy

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...