summaryrefslogtreecommitdiffstats
path: root/src/plugins/directshow
Commit message (Collapse)AuthorAgeFilesLines
* Revert "DirectShow: Fix memory leak in CLSID_FilterGraph"v5.9.4Christian Strømme2018-01-152-27/+8
| | | | | | | | | | | | The reverted commit brakes rendering on video on Windows; only the first frame is delivered. This reverts commit 8ec92863f13061c3dd2d56376eddfe258915589f. Task-number: QTBUG-65736 Change-Id: I298da5803efe13d0f17868714393cc9b1760b4a7 Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
* DirectShow: Fix rendering of overlapping MDI subwindowsVal Doroshchuk2017-12-211-2/+2
| | | | | | | | | | | | | | | | | | Media type MEDIASUBTYPE_RGB32 is 32 bytes per pixel (like 0x00RRGGBB). When MDI subwindows are overlapping bottom window with QImage::Format_RGB32 requires 0xffRRGGBB. If "not used byte" is not 0xFF rendering will not be correct (0x00 produces empty image). Changed samples to ARGB32 to provide alpha channel, which is 0xFF in most cases. If alpha channel is not set to 0xFF, the bottom window will still be rendered incorrectly. Task-number: QTBUG-51405 Change-Id: I69f15d3835f901a04bf39b079394c6292b793610 Reviewed-by: Christian Stromme <christian.stromme@qt.io> (cherry picked from commit b69259b65707acc9fc3c0818f6affe53938cebc3)
* DirectShow: Fix memory leak in CLSID_FilterGraphVal Doroshchuk2017-12-142-8/+27
| | | | | | | | | | | Fixed memory leak when using Filter Graph Manager by moving creation of the manager to worker thread and changing threading model from shared to application thread. Task-number: QTBUG-52713 Change-Id: I7725697ced1992959d18588303c329b4dfd56b2e Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* Fix deadlock when a new url is set in loading stateVal Doroshchuk2017-11-101-3/+0
| | | | | | | | | | | | | | | Setting a new url while QMediaPlayer is in loading state can result in a deadlock between the GUI and worker thread. Because main thread is waiting when worker realeses m_graph but worker cleared all pending tasks and is waiting for new tasks from main thread. Task-number: QTBUG-53534 Change-Id: I296ecdf866c5d85efc7121d3e7936334d6b700fd Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io> Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io> Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* DirectShow: Copy the frame data when we get it before emittingAndy Shaw2017-08-166-16/+13
| | | | | | | | | | | Since the slot connected to the frameAvailable signal may be in another thread there is a bigger risk of it being invalid by the time the slot is invoked. Therefore we copy the data and emit with the copy to ensure that we don't lose the data. Task-number: QTBUG-61817 Change-Id: I2888661d8a7f97105a85f87b08cc9ec25f8ce8c7 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* DirectShowPlayerService::doSetVideoProbe(): Break out of loopFriedemann Kleint2017-06-201-1/+2
| | | | | | | | | | | | | | Fix g++ 7.1 warning: player\directshowplayerservice.cpp:724:9: warning: this 'if' clause does not guard... [-Wmisleading-indentation] if (SUCCEEDED(DirectShowUtils::connectFilters(m_graph, m_source, m_videoSampleGrabber->filter(), true))) player\directshowplayerservice.cpp:726:13: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' break; Amends 8e4d966f4e5546787257de046d2c3af8a19214b4. Change-Id: I491e14e0116140d2ebb870441c2f048a2d7ddc31 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* DirectShow: Silence g++ warnings about missing initializers for AM_MEDIA_TYPEFriedemann Kleint2017-06-201-0/+10
| | | | | Change-Id: I9f764077d257dadfe1641e9bd446b6939c381173 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* Fix goto bypassing variable initializationThiago Macieira2017-06-191-3/+1
| | | | | | | | Though it's a pointer. Task-number: QTBUG-60464 Change-Id: Ia3e896da908f42939148fffd14c660fd8da43aa2 Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
* DirectShow: Expose the camera control interfacev5.9.0-beta4Christian Stromme2017-05-032-0/+22
| | | | | | | The interface is needed to implement Qt's camera control classes. Change-Id: I468527dd1f5e9e7a0f8868f0b7addc3c069adf54 Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* DirectShow: Merge the helpers and common folderChristian Strømme2017-05-0322-25/+19
| | | | | Change-Id: Ie1c39c26ae6dec288daafb24b5aa0b6cc2bdd218 Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* DirectShow: Enable audio and video probes in DirectShowChristian Strømme2017-05-033-17/+381
| | | | | | | | | | | | This change enables the video and audio probe functionality, so it can be used with the media player. [ChangeLog][DirectShow] Added support for audio and video probes in the mediaplayer. Task-number: QTBUG-56415 Change-Id: If6f36a693b1d22372eab130df07d435c9df5a796 Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* Fix licensingJani Heikkinen2017-05-037-98/+140
| | | | | | | | | - Remove unused license files - Switch old LGPLv21 license headers with LGPL one Task-number: QTBUG-57147 Change-Id: If939b9a09e0cd5ccda7f12172363cbc8f78297e8 Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* DirectShow: Fix namespaced build with MinGWFriedemann Kleint2017-04-2632-26/+109
| | | | | | | | | | | | | | | | | | | | | | Remove QT_USE_NAMESPACE from headers and enclose headers/sources in QT_BEGIN/END_NAMESPACE. Fixes MinGW build error: qtbase/src/corelib/global/qtypeinfo.h:246:7: error: specialization of 'template<class T> class tn::QTypeInfo' in different namespace [-fpermissive] class QTypeInfo<TYPE > \ ^ qtbase/src/corelib/global/qtypeinfo.h:265:1: note: in expansion of macro 'Q_DECLARE_TYPEINFO_BODY' Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS) ^ helpers\directshowmediatype.h:92:1: note: in expansion of macro 'Q_DECLARE_TYPEINFO' Q_DECLARE_TYPEINFO(DirectShowMediaType, Q_MOVABLE_TYPE); ^ qtbase/src/corelib/global/qtypeinfo.h:57:7: error: from definition of 'template<class T> class tn::QTypeInfo' [-fpermissive] class QTypeInfo ^ Task-number: QTBUG-60118 Change-Id: Idfe7a49b50a0046a5cb17630a3ec99615ec6150a Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* DirectShow: Fix uninitialized memory read in DirectShowMediaTypeEnum::Next()Friedemann Kleint2017-04-253-1/+7
| | | | | | | | | | | | | Newly allocated memory was passed to DirectShowMediaType::copy(), which calls DirectShowMediaType::clear() on the target, which crashes when trying to release a COM pointer. Split out a DirectShowMediaType::copyToUninitialized() helper function which does not call clear() for this purpose. Task-number: QTBUG-59515 Change-Id: I2801f4ba2c8da618ff8a1c57c4cea215fff292b4 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
* Merge remote-tracking branch 'origin/5.8' into 5.9Liang Qi2017-04-181-0/+108
|\ | | | | | | Change-Id: I7cd203eec77f3b5689c14b81b0862c5b70bab1a6
| * DirectShow: support audio and video codec metadataYoann Lopes2017-03-201-0/+108
| | | | | | | | | | | | | | | | | | Retrieve the audio and video codec metadata from media files. As the GUID of these codecs are only defined in the WMF API, we have to hardcode them here. Change-Id: I9a057e62d9473f605cf5078d3386c5827784ae28 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* | Merge remote-tracking branch 'origin/5.8' into 5.9Liang Qi2017-03-109-53/+35
|\| | | | | | | | | | | | | Conflicts: src/plugins/gstreamer/camerabin/camerabincontainer.h Change-Id: I4942d41d69112335fe0c994002f1b32ef3aad051
| * Use QT_CONFIG macro to check for featuresLars Knoll2017-02-277-29/+11
| | | | | | | | | | | | | | And remove many custom defines. Change-Id: I658cc8430d1d99ed3c0aafe03a77adce76621a29 Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
| * DirectShow: Port to new configure system (evr, wmsdk)Friedemann Kleint2017-02-037-23/+23
| | | | | | | | | | | | | | | | Replace old legacy defines by QT_CONFIG. Fixes warnings when using MinGW: qtmultimedia/src/multimedia/qtmultimedia-config.h:4:0: warning: "QT_NO_WMSDK" redefined Change-Id: Ifbfc2cea3bf5bfd06d94fd70e6ea4afb6d6fbb4b Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| * Fix building the WMF pluginYoann Lopes2016-12-131-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | 9df63fd6 made it possible to build only the audio decoder service from the WMF plugin. When that change was merged to 5.8 it was not ported to the new configuration system. Added a new '-mediaplayer-backend' configure option to select the media player backend to use on Windows. '-wmf-backend' is kept for backward compatibility. Change-Id: I902b2e4147f9a05b92118152020afc2638bf41e1 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
* | DirectShow: Fix warnings of MinGW/gcc 5.3v5.9.0-alpha1Friedemann Kleint2017-02-063-9/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | helpers\directshowmediatype.h:70:58: note: in expansion of macro 'Q_DECL_NOTHROW' inline const AM_MEDIA_TYPE *const operator &() const Q_DECL_NOTHROW { return &mediaType; } qtbase/src/corelib/global/qcompilerdetection.h:1143:26: warning: type qualifiers ignored on function return type [-Wignored-qualifiers] # define Q_DECL_NOEXCEPT noexcept ^ qtbase/src/corelib/global/qcompilerdetection.h:1153:25: note: in expansion of macro 'Q_DECL_NOEXCEPT' # define Q_DECL_NOTHROW Q_DECL_NOEXCEPT ^ helpers\directshowmediatype.h:71:59: note: in expansion of macro 'Q_DECL_NOTHROW' inline const AM_MEDIA_TYPE *const operator ->() const Q_DECL_NOTHROW { return &mediaType; } ^ camera\dscamerasession.cpp:604:24: warning: unused variable 'cLSID_SampleGrabber' [-Wunused-variable] static const CLSID cLSID_SampleGrabber = { 0xC1F400A0, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } }; camera\dscamerasession.cpp:603:22: warning: unused variable 'iID_ISampleGrabber' [-Wunused-variable] static const IID iID_ISampleGrabber = { 0x6B652FFF, 0x11FE, 0x4fce, { 0x92, 0xAD, 0x02, 0x66, 0xB5, 0xD7, 0xC7, 0x8F } }; ^ helpers\directshowmediatype.cpp: In constructor 'DirectShowMediaType::DirectShowMediaType()': helpers\directshowmediatype.cpp:79:57: warning: missing initializer for member '_AMMediaType::formattype' [-Wmissing-field-initializers] : mediaType({ GUID_NULL, GUID_NULL, TRUE, FALSE, 1 }) helpers\directshowmediatype.cpp:79:57: warning: missing initializer for member '_AMMediaType::pUnk' [-Wmissing-field-initializers] helpers\directshowmediatype.cpp:79:57: warning: missing initializer for member '_AMMediaType::cbFormat' [-Wmissing-field-initializers] helpers\directshowmediatype.cpp:79:57: warning: missing initializer for member '_AMMediaType::pbFormat' [-Wmissing-field-initializers] camera\dscamerasession.cpp:805:111: warning: missing initializer for member '_AMMediaType::pUnk' [-Wmissing-field-initializers] static const AM_MEDIA_TYPE grabberFormat { MEDIATYPE_Video, MEDIASUBTYPE_RGB32, 0, 0, 0, FORMAT_VideoInfo }; camera\dscamerasession.cpp:805:111: warning: missing initializer for member '_AMMediaType::cbFormat' [-Wmissing-field-initializers] camera\dscamerasession.cpp:805:111: warning: missing initializer for member '_AMMediaType::pbFormat' [-Wmissing-field-initializers] camera\dscamerasession.cpp: In member function 'void DSCameraSession::presentFrame()': camera\dscamerasession.cpp:585:52: warning: 'captureId' may be used uninitialized in this function [-Wmaybe-uninitialized] emit imageCaptured(captureId, captureImage); Change-Id: I2870c1489bd375d3d43a31742551dab220015660 Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* | DirectShow: Add audio and video probes classesChristian Strømme2017-01-275-0/+246
| | | | | | | | | | | | | | | | This change only adds the audio and video probe controls, the actual implementation comes in a separate change. Change-Id: I0136cf1ef3cea3d83f7203d1955513ed44d93e5a Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* | DirectShow: Use the new sample grabber in DsCameraChristian Strømme2017-01-272-100/+22
| | | | | | | | | | | | | | | | There's no need to have a separate implementation in the camera code, so removing this one in favor of the new sample grabber. Change-Id: I5b68d804788745b6ed3d3fceba295d1d99bb5915 Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* | DirectShow: Sample grabberChristian Strømme2017-01-274-0/+293
| | | | | | | | | | | | | | | | Sample grabber filter to be used in the camera implementation, and a prerequisite for adding audio and video probes support in DirectShow. Change-Id: I94f6332ebf75788847bfe629e92132f8a03b40e7 Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* | DirectShow: Add utility classChristian Strømme2017-01-275-36/+407
| | | | | | | | | | | | | | Centralized place for helper functions etc. Change-Id: Ia4474d0681a37fc95a100a3766800141a8b1d900 Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* | DirectShow: Sanitize DirectShowMediaTypeChristian Strømme2017-01-2713-215/+227
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The DirectShowMediaType is now a thin data wrapper around AM_MEDIA_TYPE and will for the most look and work the same way, with the exception that it cleans up after itself. All utility functions are now static, except clear() which, for convenience, is also provided as a non-static member function. In addition to the changes mentioned above, duplicated methods were removed, conversion for ARGB32 was added, and an attempt to make the usage of AM_MEDIA_TYPE and DirectShowMediaType was made more consistent. Change-Id: Iad32fb8eeabd9d4183e9bd10426cac3963e5d99a Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* | Merge remote-tracking branch 'origin/5.8' into devLiang Qi2016-12-124-11/+9
|\| | | | | | | | | | | | | Conflicts: src/plugins/gstreamer/mediacapture/qgstreameraudioencode.cpp Change-Id: I7c30c2d13fdd07ee07e4449d5d3e256e988d3793
| * Merge remote-tracking branch 'origin/5.7' into 5.8Liang Qi2016-11-261-2/+0
| |\ | | | | | | | | | | | | | | | | | | | | | Conflicts: src/plugins/qnx/qnx.pro sync.profile Change-Id: I353a44578276264a9ffb80820d8c5a0babfa1638
| | * Merge remote-tracking branch 'origin/5.6' into 5.75.7Liang Qi2016-11-241-2/+0
| | |\ | | | | | | | | | | | | Change-Id: Ic43abb034fa0a65b86a6e3511d29b8231ced5ec2
| | | * DirectShow: Remove unused class and member in DSCameraServiceChristian Strømme2016-11-231-2/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The class DSVideoOutputControl doesn't exist anymore, and the member is not used anywhere. Change-Id: I9458822501b4669e5796b4dff0b187242134795c Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
| * | | Move qtmultimedia over to the new config systemLars Knoll2016-11-143-9/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Use the new configuration system to define external libraries, configure tests and features. Don't use pkg-config outside of the configuration step. And move all command line options over from qtbase, so that we can remove them from there in a second step. Change-Id: I1aa4b557a6aee17eeceb00602005a2d28b426a26 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io> Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
| * | | Merge remote-tracking branch 'origin/5.7' into 5.8Liang Qi2016-11-111-1/+1
| |\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: qtmultimedia.pro src/multimedia/playback/qmediaplayer.cpp src/plugins/directshow/directshow.pro tests/auto/integration/qmediaplayerbackend/BLACKLIST Change-Id: I6dacdcbb223c1d12dd72eb308a67170983c709b3
| | * | Merge remote-tracking branch 'origin/5.6' into 5.7Liang Qi2016-11-041-1/+1
| | |\| | | | | | | | | | | | | Change-Id: Ib038c5e3ebb48c0e46569a35d530fa5ceaf06a32
| | | * WMF: make it possible to build only the audio decode serviceYoann Lopes2016-11-021-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The WMF plugin can now be built without the media player service. That enables the audio decode service even when DirectShow is used as media player backend. The default configuration on Windows is now: Camera, MediaPlayer -> DirectShow AudioDecode -> WMF Change-Id: Ic6f3c85ed849e0c603719cfb03794e6abd2d52fa Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* | | | DirectShow: Use qFuzzyCompare when comparing floating points valuesChristian Strømme2016-11-161-2/+2
| | | | | | | | | | | | | | | | | | | | Change-Id: I8b3584a8d1f2039e138e4065de0d546a301b97bb Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* | | | DirectShow: Add generic logging category for the DirectShow pluginChristian Strømme2016-11-152-0/+10
| | | | | | | | | | | | | | | | | | | | Change-Id: I38cee48cc85baa5ad5e42e03f8cb05eab1287566 Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* | | | DirectShow: Remove manual filter and pin disconnection in DsCameraChristian Strømme2016-11-151-31/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In commit 3fb3231a9 we added code to disconnect all filters in the graph, that includes any filters we add our self, so there's no need to have special handling for those. Change-Id: Id601933b3ff749294cfa71a0cca99e7d25e94a39 Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* | | | DirectShow: Reduce the size of DirectShowPlayerServiceChristian Strømme2016-11-151-5/+5
|/ / / | | | | | | | | | | | | Change-Id: Icde2c43af0128642721d0f7eda79b44eeca1b844 Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* | | Merge remote-tracking branch 'origin/5.7' into 5.8Liang Qi2016-09-191-0/+2
|\| | | | | | | | | | | Change-Id: I022c07dab3ded6072f7c103e299822caaf40cf34
| * | Merge remote-tracking branch 'origin/5.6' into 5.7Liang Qi2016-09-171-0/+2
| |\| | | | | | | | | | Change-Id: I27d68b69f2ad15e930b6adab5b2ff583f4642fac
| | * DirectShow: support MJPEG camerasYoann Lopes2016-09-161-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | Map MEDIASUBTYPE_MJPG to QVideoFrame::Format_Jpeg, which makes sure that cameras that only support MJPEG are configured properly. Task-number: QTBUG-55359 Change-Id: I732c56afc51109aba0231c8537f795e8d276c194 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* | | Merge remote-tracking branch 'origin/5.7' into 5.8Yoann Lopes2016-09-012-11/+68
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/multimedia/audio/qaudiosystemplugin.cpp src/plugins/directshow/helpers/directshowobject.cpp src/plugins/directshow/player/directshowiosource.cpp src/plugins/directshow/player/directshowiosource.h Change-Id: I0e4632c7705128f81429ddbcb0d4abbc04858a8b
| * | Merge remote-tracking branch 'origin/5.6' into 5.7Liang Qi2016-08-273-11/+77
| |\| | | | | | | | | | Change-Id: I639d42e78a2b85e939c9f8e9dd5da70cdc058857
| | * DirectShow: Restore negotiation of sample type in the io filterChristian Stromme2016-08-233-11/+77
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This functionality was removed in d44a327da4a956f62cc0d51, but is still needed, as we need to negotiate the media type with the input pin; even if we limit the scope to streaming types. Task-number: QTBUG-55264 Change-Id: I7cc02c5ea17cca9912c29c40813314b04b91bd18 Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* | | Adjust to qtConfig() changes in qtbaseLars Knoll2016-08-191-1/+1
| | | | | | | | | | | | | | | | | | Change-Id: I26d80ece18abf882338de5ce0258469ed103a0eb Reviewed-by: Yoann Lopes <yoann.lopes@qt.io> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
* | | Merge remote-tracking branch 'origin/5.7' into devLiang Qi2016-08-171-8/+15
|\| | | | | | | | | | | Change-Id: Ib8d05d6e21c7beb19f618cd1edc52d248b1e43b8
| * | Merge remote-tracking branch 'origin/5.6' into 5.7Liang Qi2016-08-131-8/+15
| |\| | | | | | | | | | Change-Id: I3204cdf695f4b47730a88a7c41fc7a6de967b161
| | * DirectShow: fix possible deadlock when capturing camera imageYoann Lopes2016-08-121-8/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | Don't emit signals while mutexes are locked. Task-number: QTBUG-41573 Change-Id: I287b031a579cbec1cd178501df4426ceff9e9142 Reviewed-by: Christian Stromme <christian.stromme@qt.io> Reviewed-by: Ruslan Vorobei <zvorobei@gmail.com>
* | | Merge remote-tracking branch 'origin/5.7' into devLiang Qi2016-08-023-5/+27
|\| | | | | | | | | | | | | | | | | | | | | | | Conflicts: .qmake.conf tests/auto/integration/qsoundeffect/BLACKLIST Change-Id: Icd2edd4410a4ee914d489634d26b262c0c146bf4
| * | Merge remote-tracking branch 'origin/5.6' into 5.7Yoann Lopes2016-08-013-5/+27
| |\| | | | | | | | | | Change-Id: Ic29cb09048003f18ff86d4546cd547be715eaec8