Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Can't play video on windows xp



  • Hi.
    I compiled qt 5.6.3 on windows 7 with help of MSVC2013: (Target -> windows xp)

    configure -debug-and-release -opensource -confirm-license -opengl dynamic -no-warnings-are-errors -nomake examples -nomake tests -skip qtwebengine -skip qtandroidextras -skip qtmacextras -skip qtx11extras -target xp -prefix E:\myqt\build\single\5.6.3
    

    And i used qt-multimedia to show a video to user.

    When i deploy application into windows xp, video doesn't play and i get an empty screen.(BTW, it's widget based application)

    When i run my app on windows 7 via qt-creator, i got following message:
    defaultServiceProvider::requestService(): no service found for - "org.qt-project.qt.mediaplayer" :45.753 INFO WFS_OPEN_COMPLETE

    I know that on windows xp, qt uses directShow:
    https://doc.qt.io/qt-5/qtmultimedia-windows.html

    But i don't know why it won't work!

    And i also installed bunch of codec-pack softwares on xp, like:

    1. K-Lite CodecPack
    2. ffdshow
    3. MediaPlayer CodecPack.

    But none of them help me to watch the video.



  • An interesting thing that i found is that if i use windeployqt to deploy .dlls to build directory and then run the application, i will get this message and video won't show:

    defaultServiceProvider::requestService(): no service found for - "org.qt-project.qt.mediaplayer" :45.753 INFO WFS_OPEN_COMPLETE

    But if i clean the build directory, and compile the project through qt-creator and run it again, video shows!

    Seems qt-creator do a magic behind the scene!



  • What do you have in your mediaservice plugin folder of the deployed directory?



  • @Bonnie 3 files:

    1. dsengine.dll
    2. qtmedia_audioengine.dll
    3. wmfengine.dll

    Also i tried to compile multimedia module as described here:
    https://forum.qt.io/topic/28620/solved-qtmultimedia-defaultserviceprovider-requestservice-no-service-found-for-org-qt-project-qt-mediaplayer/10#

    And replace this new mediaservice directory with previous one. But nothing changed



  • @LinArcX
    Hey, since you said when you start from qt-creator, it works, so let's first start with the original dlls from the unmodified .pro file.
    Have you tried using environment variable QT_DEBUG_PLUGINS=1 to check from the output about these plugins (dsengine.dll and wmfengine.dll) loaded or not?
    Another thing that confuses me, when you start it from qt-creator, is that also on xp? (I remember that xp cannot install msvc2013)
    Usually qt-creator's magic is just finding the installed Qt path and using the plugins there.



  • @Bonnie

    This is the log of application when running through qt-creator with QT_DEBUG_PLUGINS=1

    when you start it from qt-creator, is that also on xp?

    No, i installed qt-creator, msvc2013 on windows7. On XP just installed Visual C++ 2013 Redistributable, since it's a runtime dependency of my app.



  • @LinArcX
    Running through qt-creator works, didn't you say that?
    So we don't need the output for that, we need the output when mediaplayer cannot work, that means running the application from your deployed directory .
    But there're two different situations:

    1. Running the application without qt-creator on the same machine you have your qt-creator. Does that work?. Even not, I'm sure this will eventually work, as long as it can loaded the right plugins just as running from qt-creator.
    2. Running the application on your xp machine. This would be different with running on windows 7 since the default mediaplayer plugin of msvc builds on vista+ is WMF, but WMF may be not available on xp. So it would also be helpful to see what plugins does it load.


  • @Bonnie

    So we don't need the output for that, we need the output when mediaplayer cannot work...

    My mistake. sorry.

    1. Running the application without qt-creator on the same machine you have your qt-creator. Does that work?

    Surprisingly yes, I didn't know why this time it worked!

    (Also i'v noticed that setting QT_DEBUG_PLUGINS=1 and then run my .exe file doesn't show any debug output info. i don't know why)

    1. Running the application on your xp machine...

    I opened cmd.exe in deployed directory and:

    SET PATH=QT_DEBUG_PLUGINS=1;%PATH%

    And run my application:

    MyQtWidgetsTest.exe > output.txt 2>&1

    But it didn't generate output.txt file.



  • @LinArcX
    It uses OutputDebugString on windows instead of stdout/stderr, so the output can't be redirected.
    One solution is to use DebugView.
    (BTW, your above command to set environment variable is not right.)
    Open DebugView, then in cmd.exe:

    SET QT_DEBUG_PLUGINS=1
    MyQtWidgetsTest.exe
    

    The output will be shown in DebugView.





  • @LinArcX
    I think the key point is

    QLibraryPrivate::loadPlugin failed on "Z:/workspace/c++/qt/build-AtmQtWidgetsTest-Desktop_Qt_5_6_3_MSVC2013_32_bit-Release/release/mediaservice/dsengine.dll" : "Cannot load library Z:\\workspace\\c++\\qt\\build-AtmQtWidgetsTest-Desktop_Qt_5_6_3_MSVC2013_32_bit-Release\\release\\mediaservice\\dsengine.dll: The specified module could not be found.
    

    That usually means there're some dependency dlls missing so the plugin dll cannot be loaded.
    Try using DependencyWalker to open dsengine.dll to check the dependencies.
    Maybe xp needs to install directx? I'm not sure...



  • @Bonnie

    Hmmm.. Interesing. This is the output of dependency walker on dsengine.dll:

    • c:\windows\system32\GDI32.DLL
    • c:\windows\system32\MF.DLL
    • c:\windows\system32\MFPLAT.DLL
    • c:\windows\system32\D3D9.DLL
    • c:\windows\system32\DXVA2.DLL
    • c:\windows\system32\WINMM.DLL
    • c:\windows\system32\EVR.DLL
    • c:\windows\system32\OLE32.DLL
    • c:\windows\system32\OLEAUT32.DLL
    • c:\tools\neovim\neovim\bin\QT5WIDGETS.DLL
    • c:\tools\neovim\neovim\bin\QT5GUI.DLL
    • c:\tools\neovim\neovim\bin\QT5CORE.DLL
    • c:\windows\system32\USER32.DLL
    • c:\windows\system32\MSVCP120.DLL
    • c:\windows\system32\MSVCR120.DLL
    • c:\windows\system32\KERNEL32.DLL

    So, yes. Seems it depends on D3D9.dll that is parts of DirectX. But I installed DirectX 9 on windows xp and checked that d3d9.dll exists in c:\windows\system32.

    Edit: I've noticed that except mf.dll and mfplat.dll other dlls exists in c:\windows\system32.



  • @LinArcX
    Well, this is not how we usually use dependency walker.
    In the middle list area, check the yellow icons for missing dlls and red icons for dlls that missing functions.
    Some can be ignored referring to https://www.dependencywalker.com/faq.html

    Edit: If it depends on mf.dll and mfplat.dll, that can be the problem. Maybe your compiling links newer DX libs that not supporting xp.
    Edit2: I've searched on google and others say that if mf.dll and mfplat.dll are lazy loaded, then that can also be ignored.



  • @Bonnie
    Lazy loaded? What that means?

    I download them from the internet and copy in system directory.

    But nothing changed.



  • @Bonnie said in Can't play video on windows xp:

    In the middle list area, check the yellow icons for missing dlls and red icons for dlls that missing functions.

    depwalker.png



  • @LinArcX
    Lazy loaded dlls would have a hourglass mark with the icon, like MPR.DLL / IESHIMS.DLL in your picture.
    Your MF.DLL and MFPLAT.DLL seems to be direct linked, also your D3D9.dll is red so it may miss functions.
    I would guess it is due to the DX lib when you compile Qt, as I said.
    I don't have any 5.6.3 dlls on my machine but I have a deployed application of 5.5.1. Checking by dependency walker, the official prebuilt msvc2013 dsengine.dll of 5.5.1 doesn't depend on mf.dll and mfplat.dll directly.



  • @Bonnie

    Maybe your compiling links newer DX libs that not supporting xp. I would guess it is due to the DX lib when you compile Qt, as I said.

    You mean i should install Directx9 on my windows7, remove all other DirectX versions and compile qt5.6.3 again?



  • @LinArcX
    You may be able to compile only the dsengine plugin.
    But I don't know how to make sure you link the xp supported DX lib, since I don't target xp for at least 5 years...





  • Hi, one other thing I saw in the dependency walker's output, it wants the Qt files from another Qt directory on your XP machine:
    c:\tools\neovim\neovim\bin

    Make sure that this other version exists and is also Qt 5.6.3 Release for MSVC 2013.



  • @hskoglund
    Hello. I have some questions:

    1. Why application loads these .dlls from that weird directory instead of current directory of my application? (I used windeployqt)
    2. Lets say, i fixed it. Do it fix main issue?(Showing video)

  • Lifetime Qt Champion

    @LinArcX
    Hi
    1: Ask Windows :) It is its run time loader that controls this.
    2: It could fix it. However, the normal effect of mixing Qt version is crashes so
    dont get to much hope up.



  • @mrjj I mean why it didn't look in current directory first, if it looked why doesn't load it? Since those dlls exists beside main exe file.

    I noticed that on windows xp that doesn't have this directory(c:\tools\neovim\neovim\bin\), DependencyWalker complains that it can't find dlls:
    depXP.PNG
    `


  • Lifetime Qt Champion

    @LinArcX
    Well back in the Xp days they didn't load better i guess.
    In the newer version of windows, you can add a manifest file to tweaking it and at some point they also allowed
    side by side loading of Dlls with same name etc.
    https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order

    well (c:\tools\neovim\neovim\bin) seems just to be
    https://github.com/neovim/neovim
    but it does uses Qt for GUI .

    Hmm so the DSENGINE cannot find its support DLLS ?
    those missing files are in your app folder ?

    Is there a reason you cant use a virtual machine with Xp (or real pc ) to install Qt5.6
    and what ever compiler you wish and simply compile and xp version for xp.
    And compile a win 7+ on win 7 ?
    Im not 100% sure you can have a one .exe that works on both as the backend changed alot.



  • @mrjj

    you can add a manifest file to tweaking it and at some point they also allowed side by side loading of Dlls with same name etc.

    It works on xp?

    side by side loading of Dlls with same name etc.> those missing files are in your app folder ?

    Exactly.

    Is there a reason you cant use a virtual machine with Xp (or real pc ) to install Qt5.6 and what ever compiler you wish and simply compile and xp version for xp.

    I tried to compile qt 5.5.0 on windos xp.(It's a virtualbox machine). It complains about some functions that only exists on x64 architecture.

    Im not 100% sure you can have a one .exe that works on both as the backend changed alot.

    So, you mean i should compile whole application in each os separately?


  • Lifetime Qt Champion

    @LinArcX said in Can't play video on windows xp:

    @mrjj

    you can add a manifest file to tweaking it and at some point they also allowed side by side loading of Dlls with same name etc.

    • It works on xp?
      I think so but not sure if it can help you load the right dlls.
      https://docs.microsoft.com/en-us/windows/win32/sbscs/manifests

    • I tried to compile qt 5.5.0 on windos xp.(It's a virtualbox machine). It complains about some functions that only exists on x64 architecture.
      But Qt5.6 still supports Xp so why compile your self? You add something ?

    • So, you mean i should compile whole application in each os separately?
      Well that is how a few people I know still do - to have xp version. Its only SP3 Xp's that works but I guess
      all remaining xp's are patched.
      It might be less work than to make sure it links to older directX in newer windows. (if thats even possible)



  • @mrjj said in Can't play video on windows xp:

    But Qt5.6 still supports Xp so why compile your self? You add something ?

    Which version of 5.6? 5.6.3?


  • Lifetime Qt Champion

    @LinArcX
    Yes. I saw someone write he used that version in 32 bit and it worked for
    Xp. I didnt personally tried it, though.



  • I have same issue with playing video with QtWebEngien and QtQuick. Both of them can't play video on windows xp.



  • This is the output of running QtWebEngine application on real hardware(Windows xp):

    00000001	0.00000000	[2736] QFactoryLoader::QFactoryLoader() checking directory path "D:/release_webengine/platforms" ...	
    00000002	0.00167815	[2736] QFactoryLoader::QFactoryLoader() looking at "D:/release_webengine/platforms/qwindows.dll"	
    00000003	0.01299774	[2736] Found metadata in lib D:/release_webengine/platforms/qwindows.dll, metadata=	
    00000004	0.01299774	[2736] {	
    00000005	0.01299774	[2736]     "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",	
    00000006	0.01299774	[2736]     "MetaData": {	
    00000007	0.01299774	[2736]         "Keys": [	
    00000008	0.01299774	[2736]             "windows"	
    00000009	0.01299774	[2736]         ]	
    00000010	0.01299774	[2736]     },	
    00000011	0.01299774	[2736]     "className": "QWindowsIntegrationPlugin",	
    00000012	0.01299774	[2736]     "debug": false,	
    00000013	0.01299774	[2736]     "version": 328961	
    00000014	0.01299774	[2736] }	
    00000015	0.01299774	[2736] 	
    00000016	0.01299774	[2736] 	
    00000017	0.02331553	[2736] Got keys from plugin meta data ("windows")	
    00000018	0.05049497	[2736] loaded library "D:/release_webengine/platforms/qwindows.dll"	
    00000019	0.05494274	[2736] QFactoryLoader::QFactoryLoader() checking directory path "D:/release_webengine/platformthemes" ...	
    00000020	0.05584676	[2736] QFactoryLoader::QFactoryLoader() checking directory path "D:/release_webengine/platforminputcontexts" ...	
    00000021	4.12752199	[2736] class QWindowsEGLStaticContext *__cdecl QWindowsEGLStaticContext::create(class QFlags<enum QWindowsOpenGLTester::Renderer>): Could not initialize EGL display: error 0x3001	
    00000022	4.12752199	[2736] 	
    00000023	4.12766695	[2736] class QWindowsEGLStaticContext *__cdecl QWindowsEGLStaticContext::create(class QFlags<enum QWindowsOpenGLTester::Renderer>): When using ANGLE, check if d3dcompiler_4x.dll is available	
    00000024	4.64033127	[2736] QFactoryLoader::QFactoryLoader() checking directory path "D:/release_webengine/styles" ...	
    00000025	4.95253468	[2736] QFactoryLoader::QFactoryLoader() checking directory path "D:/release_webengine/accessiblebridge" ...

Log in to reply