summaryrefslogtreecommitdiffstats
path: root/src/plugins
Commit message (Collapse)AuthorAgeFilesLines
...
| * WinRT: Add ref to prevent seg faultVal Doroshchuk2018-05-041-0/+1
| | | | | | | | | | | | | | | | | | | | If IMFMediaSink is returned from IMFStreamSink needs to add ref because caller will release it. Task-number: QTBUG-68054 Change-Id: I6d1732f7873e09f742c072380673a08ad86fe73a Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io> Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
| * WinRT: Keep camera as uninitialized when errorVal Doroshchuk2018-05-031-1/+1
| | | | | | | | | | | | | | | | | | | | | | If initialization of camera finished with an error no need to report that camera is initialized successfully. Using camera in this case might lead to some segfaults and other errors. Task-number: QTBUG-68054 Change-Id: I6a197989c2b44454a8594ff19b8c03fb08f57c7e Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
* | Merge remote-tracking branch 'origin/5.11' into devQt Forward Merge Bot2018-04-2819-276/+161
|\| | | | | | | Change-Id: Ia54c943ca0022bd8e1182fc4f156a717cffbef41
| * winrt: Fix rotation of camera imageOliver Wolff2018-04-252-24/+32
| | | | | | | | | | | | | | Task-number: QTBUG-63014 Change-Id: I6afacdb31f13a9e95784afaab90029a77f9fabfc Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io> Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
| * DirectShow: Add overrideFriedemann Kleint2018-04-256-30/+30
| | | | | | | | | | | | | | | | Silence the clang-cl build. Task-number: QTBUG-63512 Change-Id: I701998d63a54b556b32fa0100bf43ef3071e598b Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
| * Fix DirectShow COM class hierarchyFriedemann Kleint2018-04-2413-205/+79
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Remove the class DirectShowObject. Move the ref counting code to a macro COM_REF_MIXIN that is used for the classes that are actually instantiated. Fix warnings: common/directshowpin.h(56,5): warning: 'reinterpret_cast' from class 'DirectShowPin *' to its base at non-zero offset 'IUnknown *' behaves differently from 'static_cast' [-Wreinterpret-base-class] DIRECTSHOW_OBJECT ^~~~~~~~~~~~~~~~~ common/directshowobject.h(69,33): note: expanded from macro 'DIRECTSHOW_OBJECT' return GetInterface(reinterpret_cast<IUnknown*>(this), ppv); \ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ common/directshowpin.h(56,5): note: use 'static_cast' to adjust the pointer correctly while upcasting Task-number: QTBUG-63512 Task-number: QTBUG-64157 Change-Id: Ibef143d675cd169b78fe46ff5a0c83f6e3434487 Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io> Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
| * winrt: Do not use CoTaskMemFree as image cleanup functionOliver Wolff2018-04-241-1/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | CoTaskMemFree is declared __stdcall. This declaration causes a stack maintenance behavior (called function pops its own arguments from the stack) that breaks release builds and leads to crashes. By wrapping that function into our own function (which is by default __cdecl) we get the wanted stack maintenance behavior (calling function pops arguments from the stack) and thus avoid these crashes. Task-number: QTBUG-63016 Change-Id: Ibd36f4fc2680351bf41c2991e9b3f1723bb19eab Reviewed-by: Andre de la Rocha <andre.rocha@qt.io> Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io> Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| * WinRT: Fix white screen for camera outputVal Doroshchuk2018-04-241-7/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Starting with Direct3D 11.1 GetSharedHandle is not recommended to be used. Instead IDXGIResource1::CreateSharedHandle should be used to get a handle for sharing. It returns NT handle and needs to call CloseHandle. GetSharedHandle fails with E_INVALIDARG seems due to a handle is not shared. Task-number: QTBUG-67417 Change-Id: Ib28acb8edbf737e84f5eef91e7a3a88b2f022bcb Reviewed-by: Oliver Wolff <oliver.wolff@qt.io> Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
| * WinRT: Read data in callback to prevent deadlockVal Doroshchuk2018-04-232-9/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When playing mp3 with QMediaPlayer and seeking is performed (IMFMediaEngineEx::SetCurrentTime) and also IMFByteStream::BeginRead is already done (actual data has not been read yet) but IMFByteStream::EndRead is not called. There would be a possibility to get a deadlock when the playback gets stuck. Possible problem call flow: 1. BeginRead is called 2. Queue finishRead and postpone it 3. SetCurrentTime to new position (is called on event loop) 4. finishRead is called 5. EndRead is called As a result MF_MEDIA_ENGINE_EVENT_SEEKING is received but MF_MEDIA_ENGINE_EVENT_SEEKED is never received. Proposing to read data directly from BeginRead callback and avoid possibility to seek when data is not read yet. Task-number: QTBUG-67614 Change-Id: I809e5df1c05de8014ebd0a48fd008a291f39433c Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
* | Merge remote-tracking branch 'origin/5.11' into devQt Forward Merge Bot2018-04-213-11/+9
|\| | | | | | | Change-Id: I7f644741677dbd848d480dde7c76cdf7ad81e4b9
| * DirectShowPlayerService: Proper check of DirectShowUtils::connectFilters's ↵Oliver Wolff2018-04-171-2/+2
| | | | | | | | | | | | | | | | | | | | | | result The function returns a bool no HRESULT. Neither SUCCEEDED nor FAILED returns the proper result when fed with a bool. Change-Id: Ic46957f1f2c9098afac2e216fe5ef2dd1dee00a6 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| * DirectShowUtils::findUnconnectedPin: Try other pins if matchPin failsOliver Wolff2018-04-171-3/+0
| | | | | | | | | | | | | | | | | | | | If matchPin fails for one of the pins (for whatever reason), the loop can just continue and check whether another unconnected pin can be found. If this check fails for every pin, false will be returned in the end. Change-Id: I1a58a26633b43052f3963212932d789d4800c714 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| * DirectShowUtils::connectFilters: Return false if every pin failsOliver Wolff2018-04-171-3/+3
| | | | | | | | | | | | | | | | If every pin connection fails, the result of the function should be false. It does not matter if graph->EnumFilters(&f); failed or succeeded. Change-Id: I87ec6bcda5d5dbe60154b39e21c73af1dd06fe3d Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| * DirectShowUtils::matchPin: Return false on connection mismatchOliver Wolff2018-04-171-1/+1
| | | | | | | | | | | | | | | | | | If the pin's connection state does not match shouldBeConnected, the function has to return false instead of checking the result of the isPinConnected call. Change-Id: Id15f054d5847434a5bb06b91bbc1455c6fdd2ded Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| * Windows Audio: Fix Clang warnings about int/C-style castsFriedemann Kleint2018-04-161-2/+3
| | | | | | | | | | | | | | | | | | For 64bit: qwindowsaudioinput.cpp(420,15): warning: cast to 'HMIXEROBJ__ *' from smaller integer type 'UINT' (aka 'unsigned int') [-Wint-to-pointer-cast] mixerID = (HMIXEROBJ)mixerIntID; Change-Id: Icb13142b0d8868e995f47caa02784c260abfc10f Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
* | Merge remote-tracking branch 'origin/5.11' into devQt Forward Merge Bot2018-04-141-0/+3
|\| | | | | | | Change-Id: Ia47405600e536bb8e00f47d452aadcaadee93aea
| * PulseAudioOutput: Emit QAudio::StoppedState on QAudio::OpenErrorv5.11.0-beta4VaL Doroshchuk2018-04-121-0/+3
| | | | | | | | | | | | | | | | | | If a problem occurs in open() the stateChanged() signal should be explicitly emitted regardless that current state has not been changed since QAudio::StoppedState. Task-number: QTBUG-49569 Change-Id: I6f4e235fa4b6b3bbf0dc3946dfe1f983ac10f356 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* | Merge remote-tracking branch 'origin/5.11' into devQt Forward Merge Bot2018-03-247-26/+50
|\| | | | | | | Change-Id: I565a3c7ded4223b6f3b5dfa4fcbbf21aff73a696
| * DirectShow: Add warning when not supported playback rate appliedVal Doroshchuk2018-03-221-1/+4
| | | | | | | | | | | | | | | | | | | | | | | | IMediaSeeking::SetRate() may return an error when not supported rate is being applied. Added a warning to inform user about incorrect rate value also fixed a bug when the rate has been always fell back to 1.0 instead of previous value. Task-number: QTBUG-55354 Change-Id: I85fb5572cba6920b461a023aef1bc09a981ab033 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
| * Audiocapture: Fix setting QAudioEncoderSettings::bitRateVaL Doroshchuk2018-03-211-7/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The sample size is now correctly calculated using provided bit rate via QAudioEncoderSettings. The bit rate is calculated like bitrate = sample size * sample rate * channel count Fixed bug when sample size is 8 when bit rate and sample rate is 8000 which is not correct. The bit rate must be 8 * 8000. Task-number: QTBUG-65207 Change-Id: I660fadfaaf6cc63004480fb84165252360b7f75e Reviewed-by: Christian Stromme <christian.stromme@qt.io>
| * Gstreamer: Emit an error if QCamera::start() failsVaL Doroshchuk2018-03-211-3/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | If a camera is not started successfully error() signal has to be emitted. Added emitting an error from video source. Emitted only first error to prevent multiple subsequent errors. Added debug message. Task-number: QTBUG-51825 Change-Id: I6ac936d2728213a4a64f3e4eb25ae2e2f109acca Reviewed-by: Christian Stromme <christian.stromme@qt.io>
| * DirectShow: Emit an error if QCamera::start() failsVal Doroshchuk2018-03-213-13/+29
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If a camera is not started successfully, then an error() should be emitted. After an error the camera's state will be QCamera::UnloadedState and status will be QCamera::UnloadedStatus. The error signal is handled when the camera is unable to set following states: QCamera::UnloadedState, QCamera::LoadedState or QCamera::LoadingState. Thus additionally to QCamera::start() an error can be emitted even when QCamera::load(), QCamera::unload(), or QCamera::stop() is called. Task-number: QTBUG-51825 Change-Id: Ib5ea08ed7983ea49a7bf8c0321cc5266a68d9144 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
| * Remove unreachable codeJesus Fernandez2018-03-201-2/+0
| | | | | | | | | | | | | | | | | | | | | | Actions intended to be performed by the unreachable code will never occur. In CameraBinLocks::lockStatus(QCamera::LockType): Code block is unreachable because of the syntactic structure of the code (CWE-561) Coverity-Id: 188406 Change-Id: I55a7ef8e87673519ff4f1ad5677054b34bf66d17 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* | Merge remote-tracking branch 'origin/5.11' into devQt Forward Merge Bot2018-02-288-30/+50
|\| | | | | | | Change-Id: I3ca1ee161afb0d74b00e62d835c70cf00964230f
| * Replace deprecated qSort() by std::sort()Friedemann Kleint2018-02-285-10/+19
| | | | | | | | | | Change-Id: I74ffd5bafaef9ebbe7f12600ad831c8deb58ae64 Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
| * Merge remote-tracking branch 'origin/5.9' into 5.11v5.11.0-beta1Liang Qi2018-02-181-3/+10
| |\ | | | | | | | | | | | | | | | | | | Conflicts: .qmake.conf Change-Id: I2af17ff905c26466fa1ea8b612dff3b505a3d33a
| | * GStreamer: fix udpsrc timeout settingYoann Lopes2018-02-021-3/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The timeout's time unit has changed between 0.10 and 1.0, from microseconds to nanoseconds, but we were always passing the value in microseconds. This would cause an UDP stream to always timeout with GStreamer 1.0. Change-Id: I69786480d29854d3a030f9dbea15c69ee89f3dd5 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
| * | Merge remote-tracking branch 'origin/5.10.1' into 5.11v5.11.0-alpha1Liang Qi2018-02-141-5/+2
| |\ \ | | | | | | | | | | | | Change-Id: If65f60670bbfb011363a1b5230253805b3e63553
| | * | Revert "GStreamer: Prevent calling CameraBinSession::setStateHelper twice"v5.10.1VaL Doroshchuk2018-02-051-5/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This reverts commit 9caee039533168fbb546b563859770414e54fc94. Reverted due to GST_STATE_PLAYING is never set. Task-number: QTBUG-66196 Change-Id: I85cf47c747b1e153265f2eee6477124f4683a574 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
| * | | Add missing includesJake Petroules2018-02-121-0/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Messages are sent to NSView and UIView pointers in this file, which will generate unrecognized selector warnings (and eventually, errors). Change-Id: I4c4d65b555eb4cac8d73596ccb986b14d34ddf31 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@qt.io>
| * | | Remove obsolete code pathsJake Petroules2018-02-121-12/+11
| | | | | | | | | | | | | | | | | | | | Change-Id: I331f48cc6776b2fc6bb2efc2829555f8284eeff9 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@qt.io>
* | | | WindowsAudio: Pause playback before resetVal Doroshchuk2018-02-222-4/+13
|/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When some data has been written to play and waveOutReset is called some crackling could be heard at the end of playback. Proposed a fix to pause playback and wait for time of buffers pushed to play. Task-number: QTBUG-63492 Change-Id: Ieb72c0657eee3dd92a947999d70f366e2bd7f102 Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io> Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
* | | DirectShow: Add the zoom controlChristian Stromme2018-01-225-2/+309
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Makes is possible to to control the zoom value, if the camera supports it. [ChangeLog][DirectShow] Added camera zoom support. Change-Id: I7a24c7fefb947bdcfc3ff8f755aa761135cc6fde Reviewed-by: Andy Shaw <andy.shaw@qt.io>
* | | DirectShow: Add video probe support for the cameraChristian Stromme2018-01-224-0/+52
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This change makes it possible to use the QVideoProbe class with the camera. [ChangeLog][DirectShow] Added support for video probes in the camera. Change-Id: Ib353e80e68ea2dcc5b33fd81863f4b6613257e45 Reviewed-by: Andy Shaw <andy.shaw@qt.io>
* | | DirectShow: Add camera image capture controlsChristian Stromme2018-01-2210-11/+328
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Adds controls for setting the capture destination and buffer format. [ChangeLog][DirectShow] Added support for setting the capture destination and format. Change-Id: I7420ea5dce9bf1bef391b6ba3a1537bedfbcf52d Reviewed-by: Andy Shaw <andy.shaw@qt.io>
* | | DirectShow: Add exposure controlChristian Stromme2018-01-225-9/+530
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Makes it possible to manually control the shutter speed and/or the aperture on cameras that supports it. [ChangeLog][DirectShow] Added support for manual camera exposure control Change-Id: I340964f899fec365df870834b230c1d743ceb2e8 Reviewed-by: Andy Shaw <andy.shaw@qt.io>
* | | Merge remote-tracking branch 'origin/5.10' into devLiang Qi2018-01-205-40/+40
|\| | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm Change-Id: Ic43fb2a805ed9f0f2ea48993d47859716f1f11b4
| * | Merge remote-tracking branch 'origin/5.9' into 5.10Liang Qi2018-01-185-40/+41
| |\| | | | | | | | | | Change-Id: I7566f543ce11ff6cddc4d17e2c258a582f365b65
| | * Merge remote-tracking branch 'origin/5.9.4' into 5.9Liang Qi2018-01-182-27/+8
| | |\ | | | | | | | | | | | | Change-Id: I2524b124197050d16409d9d3675570594c02cd42
| | | * 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>
| | * | AVFoundation: use observer for tracking durationJochen Seemann2018-01-082-13/+31
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | For getting the duration of a video, Apple advises to use AVPlayerItem.duration and tracking its duration changes with an observer. Task-number: QTBUG-49558 Change-Id: Ia2adc0d23deacd185f8c338f7f44948db2444beb Reviewed-by: Christian Stromme <christian.stromme@qt.io>
| | * | avfoundation: resolve unused parameter warningsJochen Seemann2018-01-081-0/+2
| | |/ | | | | | | | | | | | | Change-Id: I49eb4e04dd6d63a17d31fd0981be18f3b88fcc39 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* | | QNX 7.0.0 audio management supportJames McDonnell2018-01-164-19/+141
| | | | | | | | | | | | | | | | | | | | | [ChangeLog][QNX] Added support for QNX 7.0.0 audio management. Change-Id: Ia9f1740577527126bf666627647084382e4d7ce9 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* | | Merge remote-tracking branch 'origin/5.10' into devLiang Qi2018-01-0614-111/+141
|\| | | | | | | | | | | | | | | | | | | | Conflicts: .qmake.conf Change-Id: I5acdc7e0bd3729b80522dfff0f388cf2507fb111
| * | Merge remote-tracking branch 'origin/5.9' into 5.10Liang Qi2018-01-067-95/+122
| |\| | | | | | | | | | | | | | | | | | | Conflicts: .qmake.conf Change-Id: I3d6e69f3f99b2f0a0e2c29ffdd02176e1f22304e
| | * 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)
| | * GStreamer: Prevent calling CameraBinSession::setStateHelper twiceVaL Doroshchuk2017-12-141-2/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since CameraBinSession::setStateHelper() is supposed to handle only pending states, added a fix to prevent calling it twice. Otherwise CameraBinSession::load() can be called few times which might lead an error from gstreamer. Possible call stack: CameraBinSession::setState() CameraBinSession::setStateHelper() CameraBinSession::load() CameraBinSession::setStatus() CameraBinSession::setStateHelper() CameraBinSession::load() << gst_element_set_state is called also twice Task-number: QTBUG-53204 Change-Id: I00c66f91cd3b885c70848245da725ff68943fad2 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
| | * 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>
| | * AVFoundation: Use 90 for the front facing camera's orientationAndy Shaw2017-12-121-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since the information is not available as to what the orientation is from the AVFoundation API then we need to rely on common sense. Since the back facing camera is 270, then it stands to reason that the front one would be 90. This has been tested on macOS and iOS and all three cameras behave correctly. Task-number: QTBUG-37955 Change-Id: I1ab079cb5d4337948541e58321df51efbadf3e39 Reviewed-by: Andy Nichols <andy.nichols@qt.io>
| | * Revert "Android: Set the correct scan line for the video surface format"Christian Stromme2017-12-011-1/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The change causes the video output to be shown upside down. This reverts commit 2ec485482d185f92e4de33f634bc3ef9dd6c9188. Task-number: QTBUG-64764 Change-Id: I9d3e63d2c0cce17d945b62ffead38ab5f58ace7f Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> (cherry picked from commit 3598915a360c596da48c9e7b00ba8469cba5249a)