diff options
author | Yoann Lopes <yoann.lopes@theqtcompany.com> | 2015-01-19 14:35:33 +0100 |
---|---|---|
committer | Yoann Lopes <yoann.lopes@theqtcompany.com> | 2015-01-19 14:45:09 +0100 |
commit | af2d5a181c3d48e04c2459d551f320cfd7186630 (patch) | |
tree | d7187e0c81d0c300cf4e645eedccd359e27124c3 | |
parent | 9a215d954b00b6d07568392a1894341027c1af5a (diff) | |
parent | 4ab105b89e13c746b08fb807e2104bfca05e88f1 (diff) | |
download | qtmultimedia-af2d5a181c3d48e04c2459d551f320cfd7186630.tar.gz |
Merge remote-tracking branch 'origin/5.4' into dev
Conflicts:
.qmake.conf
src/plugins/gstreamer/camerabin/camerabinsession.cpp
Change-Id: I66a6f3efc5391013934b6b321073c31f25e1de26
-rw-r--r-- | LICENSE.GPLv2 | 292 | ||||
-rw-r--r-- | src/multimedia/video/qvideoframe.cpp | 3 | ||||
-rw-r--r-- | src/plugins/alsa/qalsaaudioinput.cpp | 14 | ||||
-rw-r--r-- | src/plugins/alsa/qalsaaudioinput.h | 8 | ||||
-rw-r--r-- | src/plugins/alsa/qalsaaudiooutput.cpp | 10 | ||||
-rw-r--r-- | src/plugins/alsa/qalsaaudiooutput.h | 8 | ||||
-rw-r--r-- | src/plugins/gstreamer/camerabin/camerabinsession.cpp | 35 | ||||
-rw-r--r-- | src/plugins/gstreamer/camerabin/camerabinviewfindersettings.cpp | 28 | ||||
-rw-r--r-- | src/plugins/gstreamer/camerabin/camerabinviewfindersettings.h | 4 | ||||
-rw-r--r-- | src/plugins/pulseaudio/qaudioinput_pulse.cpp | 12 | ||||
-rw-r--r-- | src/plugins/pulseaudio/qaudioinput_pulse.h | 8 | ||||
-rw-r--r-- | src/plugins/pulseaudio/qaudiooutput_pulse.cpp | 8 | ||||
-rw-r--r-- | src/plugins/pulseaudio/qaudiooutput_pulse.h | 8 | ||||
-rw-r--r-- | src/plugins/videonode/imx6/qsgvivantevideonode.cpp | 1 | ||||
-rw-r--r-- | src/qtmultimediaquicktools/qdeclarativevideooutput.cpp | 13 | ||||
-rw-r--r-- | src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp | 25 |
16 files changed, 119 insertions, 358 deletions
diff --git a/LICENSE.GPLv2 b/LICENSE.GPLv2 deleted file mode 100644 index 194c39cb6..000000000 --- a/LICENSE.GPLv2 +++ /dev/null @@ -1,292 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - - The Qt Toolkit is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). - Contact: http://www.qt-project.org/legal - - You may use, distribute and copy the Qt GUI Toolkit under the terms of - GNU General Public License version 2, which is displayed below. - -------------------------------------------------------------------------- - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - -Preamble - - The licenses for most software are designed to take away your freedom -to share and change it. By contrast, the GNU General Public License is -intended to guarantee your freedom to share and change free software ---to make sure the software is free for all its users. This General -Public License applies to most of the Free Software Foundation's -software and to any other program whose authors commit to using it. -(Some other Free Software Foundation software is covered by the GNU -Lesser General Public License instead.) You can apply it to your -programs, too. - -When we speak of free software, we are referring to freedom, not price. -Our General Public Licenses are designed to make sure that you have the -freedom to distribute copies of free software (and charge for this -service if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs; and that you know you can do these things. - -To protect your rights, we need to make restrictions that forbid anyone -to deny you these rights or to ask you to surrender the rights. These -restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - -For example, if you distribute copies of such a program, whether gratis - or for a fee, you must give the recipients all the rights that you -have. You must make sure that they, too, receive or can get the source -code. And you must show them these terms so they know their rights. - -We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - -Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - -Finally, any free program is threatened constantly by software patents. -We wish to avoid the danger that redistributors of a free program will -individually obtain patent licenses, in effect making the program -proprietary. To prevent this, we have made it clear that any patent -must be licensed for everyone's free use or not licensed at all. - -The precise terms and conditions for copying, distribution and -modification follow. - -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -0. This License applies to any program or other work which contains a -notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of running -the Program is not restricted, and the output from the Program is -covered only if its contents constitute a work based on the Program -(independent of having been made by running the Program). Whether that -is true depends on what the Program does. - -1. You may copy and distribute verbatim copies of the Program's source -code as you receive it, in any medium, provided that you conspicuously -and appropriately publish on each copy an appropriate copyright notice -and disclaimer of warranty; keep intact all the notices that refer to -this License and to the absence of any warranty; and give any other -recipients of the Program a copy of this License along with the -Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - -2. You may modify your copy or copies of the Program or any portion of -it, thus forming a work based on the Program, and copy and distribute -such modifications or work under the terms of Section 1 above, provided -that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but does - not normally print such an announcement, your work based on the - Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of a -storage or distribution medium does not bring the other work under the -scope of this License. - -3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software - interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your cost - of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to control -compilation and installation of the executable. However, as a special -exception, the source code distributed need not include anything that -is normally distributed (in either source or binary form) with the -major components (compiler, kernel, and so on) of the operating system -on which the executable runs, unless that component itself accompanies -the executable. - -If distribution of executable or object code is made by offering access -to copy from a designated place, then offering equivalent access to -copy the source code from the same place counts as distribution of the -source code, even though third parties are not compelled to copy the -source along with the object code. - -4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt otherwise -to copy, modify, sublicense or distribute the Program is void, and will -automatically terminate your rights under this License. However, -parties who have received copies, or rights, from you under this License -will not have their licenses terminated so long as such parties remain -in full compliance. - -5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - -6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further restrictions -on the recipients' exercise of the rights granted herein. You are not -responsible for enforcing compliance by third parties to this License. - -7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent license -would not permit royalty-free redistribution of the Program by all -those who receive copies directly or indirectly through you, then the -only way you could satisfy both it and this License would be to refrain -entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - -8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License may -add an explicit geographical distribution limitation excluding those -countries, so that distribution is permitted only in or among countries -not thus excluded. In such case, this License incorporates the limitation -as if written in the body of this License. - -9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail -to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Program does not specify a version -number of this License, you may choose any version ever published by -the Free Software Foundation. - -10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the -author to ask for permission. For software which is copyrighted by -the Free Software Foundation, write to the Free Software Foundation; -we sometimes make exceptions for this. Our decision will be guided by -the two goals of preserving the free status of all derivatives of our -free software and of promoting the sharing and reuse of software -generally. - -NO WARRANTY - -11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, -EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE -ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH -YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL -NECESSARY SERVICING, REPAIR OR CORRECTION. - -12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY -MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE -TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - -END OF TERMS AND CONDITIONS diff --git a/src/multimedia/video/qvideoframe.cpp b/src/multimedia/video/qvideoframe.cpp index d8088621d..8dd23d2f5 100644 --- a/src/multimedia/video/qvideoframe.cpp +++ b/src/multimedia/video/qvideoframe.cpp @@ -902,10 +902,13 @@ QVideoFrame::PixelFormat QVideoFrame::pixelFormatFromImageFormat(QImage::Format { switch (format) { case QImage::Format_RGB32: + case QImage::Format_RGBX8888: return Format_RGB32; case QImage::Format_ARGB32: + case QImage::Format_RGBA8888: return Format_ARGB32; case QImage::Format_ARGB32_Premultiplied: + case QImage::Format_RGBA8888_Premultiplied: return Format_ARGB32_Premultiplied; case QImage::Format_RGB16: return Format_RGB565; diff --git a/src/plugins/alsa/qalsaaudioinput.cpp b/src/plugins/alsa/qalsaaudioinput.cpp index adaa41c6e..a0a7bf08f 100644 --- a/src/plugins/alsa/qalsaaudioinput.cpp +++ b/src/plugins/alsa/qalsaaudioinput.cpp @@ -244,7 +244,7 @@ QIODevice* QAlsaAudioInput::start() delete audioSource; pullMode = false; - audioSource = new InputPrivate(this); + audioSource = new AlsaInputPrivate(this); audioSource->open(QIODevice::ReadOnly | QIODevice::Unbuffered); deviceState = QAudio::IdleState; @@ -725,7 +725,7 @@ bool QAlsaAudioInput::deviceReady() read(0, buffer_size); } else { // emits readyRead() so user will call read() on QIODevice to get some audio data - InputPrivate* a = qobject_cast<InputPrivate*>(audioSource); + AlsaInputPrivate* a = qobject_cast<AlsaInputPrivate*>(audioSource); a->trigger(); } bytesAvailable = checkBytesReady(); @@ -777,28 +777,28 @@ void QAlsaAudioInput::drain() snd_pcm_drain(handle); } -InputPrivate::InputPrivate(QAlsaAudioInput* audio) +AlsaInputPrivate::AlsaInputPrivate(QAlsaAudioInput* audio) { audioDevice = qobject_cast<QAlsaAudioInput*>(audio); } -InputPrivate::~InputPrivate() +AlsaInputPrivate::~AlsaInputPrivate() { } -qint64 InputPrivate::readData( char* data, qint64 len) +qint64 AlsaInputPrivate::readData( char* data, qint64 len) { return audioDevice->read(data,len); } -qint64 InputPrivate::writeData(const char* data, qint64 len) +qint64 AlsaInputPrivate::writeData(const char* data, qint64 len) { Q_UNUSED(data) Q_UNUSED(len) return 0; } -void InputPrivate::trigger() +void AlsaInputPrivate::trigger() { emit readyRead(); } diff --git a/src/plugins/alsa/qalsaaudioinput.h b/src/plugins/alsa/qalsaaudioinput.h index 19af68950..1c09dc70f 100644 --- a/src/plugins/alsa/qalsaaudioinput.h +++ b/src/plugins/alsa/qalsaaudioinput.h @@ -63,7 +63,7 @@ QT_BEGIN_NAMESPACE -class InputPrivate; +class AlsaInputPrivate; class RingBuffer { @@ -158,12 +158,12 @@ private: qreal m_volume; }; -class InputPrivate : public QIODevice +class AlsaInputPrivate : public QIODevice { Q_OBJECT public: - InputPrivate(QAlsaAudioInput* audio); - ~InputPrivate(); + AlsaInputPrivate(QAlsaAudioInput* audio); + ~AlsaInputPrivate(); qint64 readData( char* data, qint64 len); qint64 writeData(const char* data, qint64 len); diff --git a/src/plugins/alsa/qalsaaudiooutput.cpp b/src/plugins/alsa/qalsaaudiooutput.cpp index fde2bc9bf..c9c024aed 100644 --- a/src/plugins/alsa/qalsaaudiooutput.cpp +++ b/src/plugins/alsa/qalsaaudiooutput.cpp @@ -247,7 +247,7 @@ QIODevice* QAlsaAudioOutput::start() close(); - audioSource = new OutputPrivate(this); + audioSource = new AlsaOutputPrivate(this); audioSource->open(QIODevice::WriteOnly|QIODevice::Unbuffered); pullMode = false; @@ -785,14 +785,14 @@ void QAlsaAudioOutput::reset() stop(); } -OutputPrivate::OutputPrivate(QAlsaAudioOutput* audio) +AlsaOutputPrivate::AlsaOutputPrivate(QAlsaAudioOutput* audio) { audioDevice = qobject_cast<QAlsaAudioOutput*>(audio); } -OutputPrivate::~OutputPrivate() {} +AlsaOutputPrivate::~AlsaOutputPrivate() {} -qint64 OutputPrivate::readData( char* data, qint64 len) +qint64 AlsaOutputPrivate::readData( char* data, qint64 len) { Q_UNUSED(data) Q_UNUSED(len) @@ -800,7 +800,7 @@ qint64 OutputPrivate::readData( char* data, qint64 len) return 0; } -qint64 OutputPrivate::writeData(const char* data, qint64 len) +qint64 AlsaOutputPrivate::writeData(const char* data, qint64 len) { int retry = 0; qint64 written = 0; diff --git a/src/plugins/alsa/qalsaaudiooutput.h b/src/plugins/alsa/qalsaaudiooutput.h index 243729f7e..be2adb840 100644 --- a/src/plugins/alsa/qalsaaudiooutput.h +++ b/src/plugins/alsa/qalsaaudiooutput.h @@ -63,7 +63,7 @@ QT_BEGIN_NAMESPACE class QAlsaAudioOutput : public QAbstractAudioOutput { - friend class OutputPrivate; + friend class AlsaOutputPrivate; Q_OBJECT public: QAlsaAudioOutput(const QByteArray &device); @@ -137,13 +137,13 @@ private: qreal m_volume; }; -class OutputPrivate : public QIODevice +class AlsaOutputPrivate : public QIODevice { friend class QAlsaAudioOutput; Q_OBJECT public: - OutputPrivate(QAlsaAudioOutput* audio); - ~OutputPrivate(); + AlsaOutputPrivate(QAlsaAudioOutput* audio); + ~AlsaOutputPrivate(); qint64 readData( char* data, qint64 len); qint64 writeData(const char* data, qint64 len); diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp index f916b58c7..4517145ed 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp @@ -315,6 +315,7 @@ void CameraBinSession::setupCaptureResolution() if (!viewfinderResolution.isEmpty()) resolution = viewfinderResolution; + { GstCaps *caps = resolutionToCaps(resolution); #if CAMERABIN_DEBUG @@ -323,6 +324,40 @@ void CameraBinSession::setupCaptureResolution() g_object_set(m_camerabin, VIEWFINDER_CAPS_PROPERTY, caps, NULL); if (caps) gst_caps_unref(caps); + + GstElement *mfw_v4lsrc = 0; + if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "video-source")) { + GstElement *videoSrc = 0; + g_object_get(G_OBJECT(m_videoSrc), "video-source", &videoSrc, NULL); + if (videoSrc) { + const char *name = gst_plugin_feature_get_name(GST_PLUGIN_FEATURE(gst_element_get_factory(videoSrc))); + if (!qstrcmp(name, "mfw_v4lsrc")) + mfw_v4lsrc = videoSrc; + } + } + + if (mfw_v4lsrc) { + int capMode = 0; + if (resolution == QSize(320, 240)) + capMode = 1; + else if (resolution == QSize(720, 480)) + capMode = 2; + else if (resolution == QSize(720, 576)) + capMode = 3; + else if (resolution == QSize(1280, 720)) + capMode = 4; + else if (resolution == QSize(1920, 1080)) + capMode = 5; + g_object_set(G_OBJECT(mfw_v4lsrc), "capture-mode", capMode, NULL); + + const qreal maxFps = m_viewfinderSettingsControl->maximumFrameRate(); + if (!qFuzzyIsNull(maxFps)) { + int n, d; + gst_util_double_to_fraction(maxFps, &n, &d); + g_object_set(G_OBJECT(mfw_v4lsrc), "fps-n", n, NULL); + g_object_set(G_OBJECT(mfw_v4lsrc), "fps-d", d, NULL); + } + } } if (m_videoEncoder) diff --git a/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.cpp b/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.cpp index 3f7d2f0cf..c5cdee40e 100644 --- a/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.cpp @@ -38,7 +38,9 @@ QT_BEGIN_NAMESPACE CameraBinViewfinderSettings::CameraBinViewfinderSettings(QObject *parent) - : QCameraViewfinderSettingsControl(parent) + : QCameraViewfinderSettingsControl(parent), + m_minimumFrameRate(0), + m_maximumFrameRate(0) { } @@ -50,10 +52,10 @@ bool CameraBinViewfinderSettings::isViewfinderParameterSupported(ViewfinderParam { switch (parameter) { case Resolution: - return true; - case PixelAspectRatio: case MinimumFrameRate: case MaximumFrameRate: + return true; + case PixelAspectRatio: case PixelFormat: case UserParameter: return false; @@ -66,9 +68,11 @@ QVariant CameraBinViewfinderSettings::viewfinderParameter(ViewfinderParameter pa switch (parameter) { case Resolution: return m_resolution; - case PixelAspectRatio: case MinimumFrameRate: + return m_minimumFrameRate; case MaximumFrameRate: + return m_maximumFrameRate; + case PixelAspectRatio: case PixelFormat: case UserParameter: return QVariant(); @@ -82,9 +86,13 @@ void CameraBinViewfinderSettings::setViewfinderParameter(ViewfinderParameter par case Resolution: m_resolution = value.toSize(); break; - case PixelAspectRatio: case MinimumFrameRate: + m_minimumFrameRate = value.toFloat(); + break; case MaximumFrameRate: + m_maximumFrameRate = value.toFloat(); + break; + case PixelAspectRatio: case PixelFormat: case UserParameter: break; @@ -96,4 +104,14 @@ QSize CameraBinViewfinderSettings::resolution() const return m_resolution; } +qreal CameraBinViewfinderSettings::minimumFrameRate() const +{ + return m_minimumFrameRate; +} + +qreal CameraBinViewfinderSettings::maximumFrameRate() const +{ + return m_maximumFrameRate; +} + QT_END_NAMESPACE diff --git a/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.h b/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.h index a6d425338..c5030ffb4 100644 --- a/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.h +++ b/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.h @@ -52,9 +52,13 @@ public: void setViewfinderParameter(ViewfinderParameter parameter, const QVariant &value); QSize resolution() const; + qreal minimumFrameRate() const; + qreal maximumFrameRate() const; private: QSize m_resolution; + qreal m_minimumFrameRate; + qreal m_maximumFrameRate; }; QT_END_NAMESPACE diff --git a/src/plugins/pulseaudio/qaudioinput_pulse.cpp b/src/plugins/pulseaudio/qaudioinput_pulse.cpp index ea053578f..fe20e061b 100644 --- a/src/plugins/pulseaudio/qaudioinput_pulse.cpp +++ b/src/plugins/pulseaudio/qaudioinput_pulse.cpp @@ -248,7 +248,7 @@ QIODevice *QPulseAudioInput::start() return Q_NULLPTR; m_pullMode = false; - m_audioSource = new InputPrivate(this); + m_audioSource = new PulseInputPrivate(this); m_audioSource->open(QIODevice::ReadOnly | QIODevice::Unbuffered); setState(QAudio::IdleState); @@ -661,7 +661,7 @@ bool QPulseAudioInput::deviceReady() } else { // emits readyRead() so user will call read() on QIODevice to get some audio data if (m_audioSource != 0) { - InputPrivate *a = qobject_cast<InputPrivate*>(m_audioSource); + PulseInputPrivate *a = qobject_cast<PulseInputPrivate*>(m_audioSource); a->trigger(); } } @@ -701,24 +701,24 @@ void QPulseAudioInput::onPulseContextFailed() setState(QAudio::StoppedState); } -InputPrivate::InputPrivate(QPulseAudioInput *audio) +PulseInputPrivate::PulseInputPrivate(QPulseAudioInput *audio) { m_audioDevice = qobject_cast<QPulseAudioInput*>(audio); } -qint64 InputPrivate::readData(char *data, qint64 len) +qint64 PulseInputPrivate::readData(char *data, qint64 len) { return m_audioDevice->read(data, len); } -qint64 InputPrivate::writeData(const char *data, qint64 len) +qint64 PulseInputPrivate::writeData(const char *data, qint64 len) { Q_UNUSED(data) Q_UNUSED(len) return 0; } -void InputPrivate::trigger() +void PulseInputPrivate::trigger() { emit readyRead(); } diff --git a/src/plugins/pulseaudio/qaudioinput_pulse.h b/src/plugins/pulseaudio/qaudioinput_pulse.h index 4e92447f6..8590aa281 100644 --- a/src/plugins/pulseaudio/qaudioinput_pulse.h +++ b/src/plugins/pulseaudio/qaudioinput_pulse.h @@ -60,7 +60,7 @@ QT_BEGIN_NAMESPACE -class InputPrivate; +class PulseInputPrivate; class QPulseAudioInput : public QAbstractAudioInput { @@ -139,12 +139,12 @@ private: pa_sample_spec m_spec; }; -class InputPrivate : public QIODevice +class PulseInputPrivate : public QIODevice { Q_OBJECT public: - InputPrivate(QPulseAudioInput *audio); - ~InputPrivate() {}; + PulseInputPrivate(QPulseAudioInput *audio); + ~PulseInputPrivate() {}; qint64 readData(char *data, qint64 len); qint64 writeData(const char *data, qint64 len); diff --git a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp index b979450b6..3ac6ffc33 100644 --- a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp +++ b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp @@ -237,7 +237,7 @@ QIODevice *QPulseAudioOutput::start() if (!open()) return Q_NULLPTR; - m_audioSource = new OutputPrivate(this); + m_audioSource = new PulseOutputPrivate(this); m_audioSource->open(QIODevice::WriteOnly|QIODevice::Unbuffered); m_pullMode = false; @@ -604,12 +604,12 @@ void QPulseAudioOutput::reset() stop(); } -OutputPrivate::OutputPrivate(QPulseAudioOutput *audio) +PulseOutputPrivate::PulseOutputPrivate(QPulseAudioOutput *audio) { m_audioDevice = qobject_cast<QPulseAudioOutput*>(audio); } -qint64 OutputPrivate::readData(char *data, qint64 len) +qint64 PulseOutputPrivate::readData(char *data, qint64 len) { Q_UNUSED(data) Q_UNUSED(len) @@ -617,7 +617,7 @@ qint64 OutputPrivate::readData(char *data, qint64 len) return 0; } -qint64 OutputPrivate::writeData(const char *data, qint64 len) +qint64 PulseOutputPrivate::writeData(const char *data, qint64 len) { int retry = 0; qint64 written = 0; diff --git a/src/plugins/pulseaudio/qaudiooutput_pulse.h b/src/plugins/pulseaudio/qaudiooutput_pulse.h index 2883ae5c3..15208b2f4 100644 --- a/src/plugins/pulseaudio/qaudiooutput_pulse.h +++ b/src/plugins/pulseaudio/qaudiooutput_pulse.h @@ -62,7 +62,7 @@ QT_BEGIN_NAMESPACE class QPulseAudioOutput : public QAbstractAudioOutput { - friend class OutputPrivate; + friend class PulseOutputPrivate; Q_OBJECT public: @@ -140,14 +140,14 @@ private: pa_sample_spec m_spec; }; -class OutputPrivate : public QIODevice +class PulseOutputPrivate : public QIODevice { friend class QPulseAudioOutput; Q_OBJECT public: - OutputPrivate(QPulseAudioOutput *audio); - virtual ~OutputPrivate() {} + PulseOutputPrivate(QPulseAudioOutput *audio); + virtual ~PulseOutputPrivate() {} protected: qint64 readData(char *data, qint64 len); diff --git a/src/plugins/videonode/imx6/qsgvivantevideonode.cpp b/src/plugins/videonode/imx6/qsgvivantevideonode.cpp index a42b577d5..1c1c1008b 100644 --- a/src/plugins/videonode/imx6/qsgvivantevideonode.cpp +++ b/src/plugins/videonode/imx6/qsgvivantevideonode.cpp @@ -61,6 +61,7 @@ void QSGVivanteVideoNode::setCurrentFrame(const QVideoFrame &frame) const QMap<QVideoFrame::PixelFormat, GLenum>& QSGVivanteVideoNode::getVideoFormat2GLFormatMap() { if (static_VideoFormat2GLFormatMap.isEmpty()) { + static_VideoFormat2GLFormatMap.insert(QVideoFrame::Format_YUV420P, GL_VIV_I420); static_VideoFormat2GLFormatMap.insert(QVideoFrame::Format_YV12, GL_VIV_YV12); static_VideoFormat2GLFormatMap.insert(QVideoFrame::Format_NV12, GL_VIV_NV12); static_VideoFormat2GLFormatMap.insert(QVideoFrame::Format_NV21, GL_VIV_NV21); diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp index d7aab6915..9a9256868 100644 --- a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp +++ b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp @@ -39,11 +39,12 @@ #include <QtMultimedia/qmediaobject.h> #include <QtMultimedia/qmediaservice.h> #include <private/qmediapluginloader_p.h> - -//#define DEBUG_VIDEOITEM +#include <QtCore/qloggingcategory.h> QT_BEGIN_NAMESPACE +Q_LOGGING_CATEGORY(qLcVideo, "qt.multimedia.video") + /*! \qmltype VideoOutput \instantiates QDeclarativeVideoOutput @@ -154,9 +155,7 @@ QDeclarativeVideoOutput::~QDeclarativeVideoOutput() void QDeclarativeVideoOutput::setSource(QObject *source) { -#ifdef DEBUG_VIDEOITEM - qDebug() << Q_FUNC_INFO << source; -#endif + qCDebug(qLcVideo) << "source is" << source; if (source == m_source.data()) return; @@ -273,9 +272,7 @@ void QDeclarativeVideoOutput::_q_updateMediaObject() if (m_source) mediaObject = qobject_cast<QMediaObject*>(m_source.data()->property("mediaObject").value<QObject*>()); -#ifdef DEBUG_VIDEOITEM - qDebug() << Q_FUNC_INFO << mediaObject; -#endif + qCDebug(qLcVideo) << "media object is" << mediaObject; if (m_mediaObject.data() == mediaObject) return; diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp index 608aae5d1..657ef1767 100644 --- a/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp +++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp @@ -36,6 +36,7 @@ #include "qdeclarativevideooutput_p.h" #include <QtMultimedia/qvideorenderercontrol.h> #include <QtMultimedia/qmediaservice.h> +#include <QtCore/qloggingcategory.h> #include <private/qmediapluginloader_p.h> #include <private/qsgvideonode_p.h> @@ -43,6 +44,8 @@ QT_BEGIN_NAMESPACE +Q_DECLARE_LOGGING_CATEGORY(qLcVideo) + Q_GLOBAL_STATIC_WITH_ARGS(QMediaPluginLoader, videoNodeFactoryLoader, (QSGVideoNodeFactoryInterface_iid, QLatin1String("video/videonode"), Qt::CaseInsensitive)) @@ -66,9 +69,7 @@ QDeclarativeVideoRendererBackend::QDeclarativeVideoRendererBackend(QDeclarativeV m_videoNodeFactories.prepend(plugin); else m_videoNodeFactories.append(plugin); -#ifdef DEBUG_VIDEOITEM - qDebug() << "found videonode plugin" << key << plugin; -#endif + qCDebug(qLcVideo) << "found videonode plugin" << key << plugin; } } @@ -217,17 +218,13 @@ QSGNode *QDeclarativeVideoRendererBackend::updatePaintNode(QSGNode *oldNode, if (m_frameChanged) { if (videoNode && videoNode->pixelFormat() != m_frame.pixelFormat()) { -#ifdef DEBUG_VIDEOITEM - qDebug() << "updatePaintNode: deleting old video node because frame format changed..."; -#endif + qCDebug(qLcVideo) << "updatePaintNode: deleting old video node because frame format changed"; delete videoNode; videoNode = 0; } if (!m_frame.isValid()) { -#ifdef DEBUG_VIDEOITEM - qDebug() << "updatePaintNode: no frames yet... aborting..."; -#endif + qCDebug(qLcVideo) << "updatePaintNode: no frames yet"; m_frameChanged = false; return 0; } @@ -236,9 +233,9 @@ QSGNode *QDeclarativeVideoRendererBackend::updatePaintNode(QSGNode *oldNode, foreach (QSGVideoNodeFactoryInterface* factory, m_videoNodeFactories) { videoNode = factory->createNode(m_surface->surfaceFormat()); if (videoNode) { -#ifdef DEBUG_VIDEOITEM - qDebug() << "using video node from factory" << factory; -#endif + qCDebug(qLcVideo) << "updatePaintNode: Video node created. Handle type:" << m_frame.handleType() + << " Supported formats for the handle by this node:" + << factory->supportedPixelFormats(m_frame.handleType()); break; } } @@ -327,9 +324,7 @@ QList<QVideoFrame::PixelFormat> QSGVideoItemSurface::supportedPixelFormats( bool QSGVideoItemSurface::start(const QVideoSurfaceFormat &format) { -#ifdef DEBUG_VIDEOITEM - qDebug() << Q_FUNC_INFO << format << supportedPixelFormats(format.handleType()); -#endif + qCDebug(qLcVideo) << "Video surface format:" << format << "all supported formats:" << supportedPixelFormats(format.handleType()); if (!supportedPixelFormats(format.handleType()).contains(format.pixelFormat())) return false; |