mirror of
git://slackware.nl/current.git
synced 2025-01-18 22:27:20 +01:00
Sun Nov 10 20:38:31 UTC 2024
l/imagemagick-7.1.1_40-x86_64-1.txz: Upgraded. l/python-hatchling-1.26.1-x86_64-1.txz: Upgraded. l/python-zipp-3.21.0-x86_64-1.txz: Upgraded. l/qt6-6.8.0_20241001_0c20a491-x86_64-1.txz: Upgraded. n/c-ares-1.34.3-x86_64-1.txz: Upgraded. n/netatalk-4.0.5-x86_64-1.txz: Upgraded. x/xtrans-1.5.2-noarch-1.txz: Upgraded. y/bsd-games-2.17-x86_64-6.txz: Rebuilt. /etc/profile.d/bsd-games-login-fortune.{csh,sh}: suppress fortune output if $HOME/.hushlogin exists. Thanks to GazL.
This commit is contained in:
parent
0665074a8c
commit
3ecfa9b836
14 changed files with 3581 additions and 4362 deletions
|
@ -11,9 +11,29 @@
|
|||
<description>Tracking Slackware development in git.</description>
|
||||
<language>en-us</language>
|
||||
<id xmlns="http://www.w3.org/2005/Atom">urn:uuid:c964f45e-6732-11e8-bbe5-107b4450212f</id>
|
||||
<pubDate>Sat, 9 Nov 2024 20:28:56 GMT</pubDate>
|
||||
<lastBuildDate>Sat, 9 Nov 2024 20:59:53 GMT</lastBuildDate>
|
||||
<pubDate>Sun, 10 Nov 2024 20:38:31 GMT</pubDate>
|
||||
<lastBuildDate>Sun, 10 Nov 2024 21:34:15 GMT</lastBuildDate>
|
||||
<generator>maintain_current_git.sh v 1.17</generator>
|
||||
<item>
|
||||
<title>Sun, 10 Nov 2024 20:38:31 GMT</title>
|
||||
<pubDate>Sun, 10 Nov 2024 20:38:31 GMT</pubDate>
|
||||
<link>https://git.slackware.nl/current/tag/?h=20241110203831</link>
|
||||
<guid isPermaLink="false">20241110203831</guid>
|
||||
<description>
|
||||
<![CDATA[<pre>
|
||||
l/imagemagick-7.1.1_40-x86_64-1.txz: Upgraded.
|
||||
l/python-hatchling-1.26.1-x86_64-1.txz: Upgraded.
|
||||
l/python-zipp-3.21.0-x86_64-1.txz: Upgraded.
|
||||
l/qt6-6.8.0_20241001_0c20a491-x86_64-1.txz: Upgraded.
|
||||
n/c-ares-1.34.3-x86_64-1.txz: Upgraded.
|
||||
n/netatalk-4.0.5-x86_64-1.txz: Upgraded.
|
||||
x/xtrans-1.5.2-noarch-1.txz: Upgraded.
|
||||
y/bsd-games-2.17-x86_64-6.txz: Rebuilt.
|
||||
/etc/profile.d/bsd-games-login-fortune.{csh,sh}: suppress fortune output if
|
||||
$HOME/.hushlogin exists. Thanks to GazL.
|
||||
</pre>]]>
|
||||
</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Sat, 9 Nov 2024 20:28:56 GMT</title>
|
||||
<pubDate>Sat, 9 Nov 2024 20:28:56 GMT</pubDate>
|
||||
|
|
|
@ -1,3 +1,15 @@
|
|||
Sun Nov 10 20:38:31 UTC 2024
|
||||
l/imagemagick-7.1.1_40-x86_64-1.txz: Upgraded.
|
||||
l/python-hatchling-1.26.1-x86_64-1.txz: Upgraded.
|
||||
l/python-zipp-3.21.0-x86_64-1.txz: Upgraded.
|
||||
l/qt6-6.8.0_20241001_0c20a491-x86_64-1.txz: Upgraded.
|
||||
n/c-ares-1.34.3-x86_64-1.txz: Upgraded.
|
||||
n/netatalk-4.0.5-x86_64-1.txz: Upgraded.
|
||||
x/xtrans-1.5.2-noarch-1.txz: Upgraded.
|
||||
y/bsd-games-2.17-x86_64-6.txz: Rebuilt.
|
||||
/etc/profile.d/bsd-games-login-fortune.{csh,sh}: suppress fortune output if
|
||||
$HOME/.hushlogin exists. Thanks to GazL.
|
||||
+--------------------------+
|
||||
Sat Nov 9 20:28:56 UTC 2024
|
||||
ap/mariadb-11.4.4-x86_64-3.txz: Rebuilt.
|
||||
Moved default options (--skip-networking --disable-ssl) into
|
||||
|
|
6777
FILELIST.TXT
6777
FILELIST.TXT
File diff suppressed because it is too large
Load diff
|
@ -29,7 +29,7 @@ BUILD=${BUILD:-1}
|
|||
# Automatically determine the architecture we're building on:
|
||||
if [ -z "$ARCH" ]; then
|
||||
case "$( uname -m )" in
|
||||
i?86) export ARCH=i586 ;;
|
||||
i?86) export ARCH=i686 ;;
|
||||
arm*) export ARCH=arm ;;
|
||||
# Unless $ARCH is already set, use uname -m for all other archs:
|
||||
*) export ARCH=$( uname -m ) ;;
|
||||
|
@ -44,18 +44,15 @@ if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
|
|||
exit 0
|
||||
fi
|
||||
|
||||
if [ "${ARCH}" = "i586" ]; then
|
||||
SLKCFLAGS="-O2 -march=i586 -mtune=i686"
|
||||
LIBDIRSUFFIX=""
|
||||
elif [ "$ARCH" = "i686" ]; then
|
||||
SLKCFLAGS="-O2 -march=i686 -mtune=i686"
|
||||
LIBDIRSUFFIX=""
|
||||
elif [ "$ARCH" = "s390" ]; then
|
||||
SLKCFLAGS="-O2"
|
||||
if [ "${ARCH}" = "i686" ]; then
|
||||
SLKCFLAGS="-O2 -march=pentium4 -mtune=generic"
|
||||
LIBDIRSUFFIX=""
|
||||
elif [ "$ARCH" = "x86_64" ]; then
|
||||
SLKCFLAGS="-O2 -fPIC"
|
||||
SLKCFLAGS="-O2 -march=x86-64 -mtune=generic -fPIC"
|
||||
LIBDIRSUFFIX="64"
|
||||
else
|
||||
SLKCFLAGS="-O2"
|
||||
LIBDIRSUFFIX=""
|
||||
fi
|
||||
|
||||
TMP=${TMP:-/tmp}
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
BRANCH="6.7.3"
|
||||
BRANCH="6.8.0"
|
||||
|
||||
rm -f qt-everywhere-src-*.tar*
|
||||
|
||||
|
|
|
@ -1,225 +0,0 @@
|
|||
From 0a1d8fb26d1e89c82a0d35dd728d7e928a94d197 Mon Sep 17 00:00:00 2001
|
||||
From: Mitch Curtis <mitch.curtis@qt.io>
|
||||
Date: Tue, 24 Sep 2024 14:44:25 +0800
|
||||
Subject: [PATCH 1/1] ListView: fix countChanged not being emitted in certain
|
||||
cases
|
||||
|
||||
This broke after 477c15def834bd49553c00b90f3a2006456ea931.
|
||||
countChanged would have normally been emitted in the call to
|
||||
applyModelChanges that we skipped after adding the q->size().isNull()
|
||||
check.
|
||||
|
||||
We can check hasPendingChanges() to know if a count change
|
||||
is pending (which is also the first thing applyModelChanges checks
|
||||
before doing its work), and if so, emit countChanged so that
|
||||
any bindings that are relying on it can function as expected.
|
||||
|
||||
Fixes: QTBUG-129165
|
||||
Pick-to: 6.5 6.7 6.8 dev
|
||||
Change-Id: Ic045f1870b39d192f6880e23daab03fd73a16d58
|
||||
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|
||||
---
|
||||
src/quick/items/qquickitemview.cpp | 31 +++++++++++++++++-----
|
||||
src/quick/items/qquickitemview_p_p.h | 2 ++
|
||||
.../data/visibleBoundToCountGreaterThanZero.qml | 31 ++++++++++++++++++++++
|
||||
.../quick/qquicklistview2/tst_qquicklistview2.cpp | 20 ++++++++++++++
|
||||
4 files changed, 78 insertions(+), 6 deletions(-)
|
||||
create mode 100644 tests/auto/quick/qquicklistview2/data/visibleBoundToCountGreaterThanZero.qml
|
||||
|
||||
diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp
|
||||
index 0a6a3e949bd..19e5b7f4029 100644
|
||||
--- a/src/quick/items/qquickitemview.cpp
|
||||
+++ b/src/quick/items/qquickitemview.cpp
|
||||
@@ -10,6 +10,7 @@
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
Q_LOGGING_CATEGORY(lcItemViewDelegateLifecycle, "qt.quick.itemview.lifecycle")
|
||||
+Q_LOGGING_CATEGORY(lcCount, "qt.quick.itemview.count")
|
||||
|
||||
// Default cacheBuffer for all views.
|
||||
#ifndef QML_VIEW_DEFAULTCACHEBUFFER
|
||||
@@ -223,7 +224,7 @@ void QQuickItemView::setModel(const QVariant &m)
|
||||
this, SLOT(modelUpdated(QQmlChangeSet,bool)));
|
||||
if (QQmlDelegateModel *dataModel = qobject_cast<QQmlDelegateModel*>(d->model))
|
||||
QObjectPrivate::connect(dataModel, &QQmlDelegateModel::delegateChanged, d, &QQuickItemViewPrivate::applyDelegateChange);
|
||||
- emit countChanged();
|
||||
+ d->emitCountChanged();
|
||||
}
|
||||
emit modelChanged();
|
||||
d->moveReason = QQuickItemViewPrivate::Other;
|
||||
@@ -255,7 +256,7 @@ void QQuickItemView::setDelegate(QQmlComponent *delegate)
|
||||
int oldCount = dataModel->count();
|
||||
dataModel->setDelegate(delegate);
|
||||
if (oldCount != dataModel->count())
|
||||
- emit countChanged();
|
||||
+ d->emitCountChanged();
|
||||
}
|
||||
emit delegateChanged();
|
||||
d->delegateValidated = false;
|
||||
@@ -1125,6 +1126,14 @@ void QQuickItemViewPrivate::showVisibleItems() const
|
||||
}
|
||||
}
|
||||
|
||||
+// Simplifies debugging of count.
|
||||
+void QQuickItemViewPrivate::emitCountChanged()
|
||||
+{
|
||||
+ Q_Q(QQuickItemView);
|
||||
+ qCDebug(lcCount).nospace() << "about to emit countChanged for " << q << "; count changed to " << q->count();
|
||||
+ emit q->countChanged();
|
||||
+}
|
||||
+
|
||||
void QQuickItemViewPrivate::itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change,
|
||||
const QRectF &oldGeometry)
|
||||
{
|
||||
@@ -1224,7 +1233,7 @@ void QQuickItemView::modelUpdated(const QQmlChangeSet &changeSet, bool reset)
|
||||
d->updateTrackedItem();
|
||||
}
|
||||
d->moveReason = QQuickItemViewPrivate::Other;
|
||||
- emit countChanged();
|
||||
+ d->emitCountChanged();
|
||||
#if QT_CONFIG(quick_viewtransitions)
|
||||
if (d->transitioner && d->transitioner->populateTransition)
|
||||
d->forceLayoutPolish();
|
||||
@@ -1487,7 +1496,7 @@ void QQuickItemView::componentComplete()
|
||||
d->fixupPosition();
|
||||
}
|
||||
if (d->model && d->model->count())
|
||||
- emit countChanged();
|
||||
+ d->emitCountChanged();
|
||||
}
|
||||
|
||||
|
||||
@@ -1813,7 +1822,7 @@ void QQuickItemViewPrivate::refill(qreal from, qreal to)
|
||||
}
|
||||
|
||||
if (prevCount != itemCount)
|
||||
- emit q->countChanged();
|
||||
+ emitCountChanged();
|
||||
} while (currentChanges.hasPendingChanges() || bufferedChanges.hasPendingChanges());
|
||||
storeFirstVisibleItemPosition();
|
||||
}
|
||||
@@ -1864,6 +1873,16 @@ void QQuickItemViewPrivate::layout()
|
||||
// if either dimension is negative, but apparently we support negative-sized
|
||||
// views (see tst_QQuickListView::resizeView).
|
||||
if ((!isValid() && !visibleItems.size()) || q->size().isNull()) {
|
||||
+ if (q->size().isNull() && hasPendingChanges()) {
|
||||
+ // count() refers to the number of items in the model, not in the view
|
||||
+ // (which is why we don't emit for the !visibleItems.size() case).
|
||||
+ // If there are pending model changes, emit countChanged in order to
|
||||
+ // support the use case of QTBUG-129165, where visible is bound to count > 0
|
||||
+ // and the ListView is in a layout with Layout.preferredHeight bound to
|
||||
+ // contentHeight. This ensures that a hidden ListView will become visible.
|
||||
+ emitCountChanged();
|
||||
+ }
|
||||
+
|
||||
clear();
|
||||
setPosition(contentStartOffset());
|
||||
updateViewport();
|
||||
@@ -2138,7 +2157,7 @@ bool QQuickItemViewPrivate::applyModelChanges(ChangeResult *totalInsertionResult
|
||||
|
||||
updateSections();
|
||||
if (prevItemCount != itemCount)
|
||||
- emit q->countChanged();
|
||||
+ emitCountChanged();
|
||||
if (!visibleAffected && viewportChanged)
|
||||
updateViewport();
|
||||
|
||||
diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h
|
||||
index 9cb6ea8fd5c..b5d70c6d6f4 100644
|
||||
--- a/src/quick/items/qquickitemview_p_p.h
|
||||
+++ b/src/quick/items/qquickitemview_p_p.h
|
||||
@@ -229,6 +229,8 @@ public:
|
||||
releaseItem(item, reusableFlag);
|
||||
}
|
||||
|
||||
+ void emitCountChanged();
|
||||
+
|
||||
virtual QQuickItemViewAttached *getAttachedObject(const QObject *) const { return nullptr; }
|
||||
|
||||
QPointer<QQmlInstanceModel> model;
|
||||
diff --git a/tests/auto/quick/qquicklistview2/data/visibleBoundToCountGreaterThanZero.qml b/tests/auto/quick/qquicklistview2/data/visibleBoundToCountGreaterThanZero.qml
|
||||
new file mode 100644
|
||||
index 00000000000..e75c779584e
|
||||
--- /dev/null
|
||||
+++ b/tests/auto/quick/qquicklistview2/data/visibleBoundToCountGreaterThanZero.qml
|
||||
@@ -0,0 +1,31 @@
|
||||
+import QtQuick
|
||||
+import QtQuick.Layouts
|
||||
+
|
||||
+ColumnLayout {
|
||||
+ property alias listView: listView
|
||||
+
|
||||
+ ListView {
|
||||
+ id: listView
|
||||
+
|
||||
+ visible: count > 0 // actual defect. countChanged never fires so this never turns true
|
||||
+
|
||||
+ Layout.fillWidth: true
|
||||
+ Layout.preferredHeight: contentHeight // grow with content, initially 0
|
||||
+
|
||||
+ model: ListModel {
|
||||
+ id: idModel
|
||||
+ }
|
||||
+
|
||||
+ delegate: Text {
|
||||
+ required property string name
|
||||
+ text: name
|
||||
+ }
|
||||
+
|
||||
+ Timer {
|
||||
+ running: true
|
||||
+ interval: 10
|
||||
+ repeat: true
|
||||
+ onTriggered: idModel.append({name:"Hello"})
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
diff --git a/tests/auto/quick/qquicklistview2/tst_qquicklistview2.cpp b/tests/auto/quick/qquicklistview2/tst_qquicklistview2.cpp
|
||||
index 96dd27e7d28..c07a30d4011 100644
|
||||
--- a/tests/auto/quick/qquicklistview2/tst_qquicklistview2.cpp
|
||||
+++ b/tests/auto/quick/qquicklistview2/tst_qquicklistview2.cpp
|
||||
@@ -18,6 +18,8 @@ Q_LOGGING_CATEGORY(lcTests, "qt.quick.tests")
|
||||
using namespace QQuickViewTestUtils;
|
||||
using namespace QQuickVisualTestUtils;
|
||||
|
||||
+static const int oneSecondInMs = 1000;
|
||||
+
|
||||
class tst_QQuickListView2 : public QQmlDataTest
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -68,6 +70,7 @@ private slots:
|
||||
void bindingDirectlyOnPositionInHeaderAndFooterDelegates();
|
||||
|
||||
void clearObjectListModel();
|
||||
+ void visibleBoundToCountGreaterThanZero();
|
||||
|
||||
private:
|
||||
void flickWithTouch(QQuickWindow *window, const QPoint &from, const QPoint &to);
|
||||
@@ -1312,6 +1315,23 @@ void tst_QQuickListView2::clearObjectListModel()
|
||||
QVERIFY(!list.itemAtIndex(0));
|
||||
}
|
||||
|
||||
+void tst_QQuickListView2::visibleBoundToCountGreaterThanZero()
|
||||
+{
|
||||
+ QQuickView window;
|
||||
+ QVERIFY(QQuickTest::showView(window, testFileUrl("visibleBoundToCountGreaterThanZero.qml")));
|
||||
+
|
||||
+ auto *listView = window.rootObject()->property("listView").value<QQuickListView *>();
|
||||
+ QVERIFY(listView);
|
||||
+
|
||||
+ QSignalSpy countChangedSpy(listView, SIGNAL(countChanged()));
|
||||
+ QVERIFY(countChangedSpy.isValid());
|
||||
+
|
||||
+ QTRY_COMPARE_GT_WITH_TIMEOUT(listView->count(), 1, oneSecondInMs);
|
||||
+ // Using the TRY variant here as well is necessary.
|
||||
+ QTRY_COMPARE_GT_WITH_TIMEOUT(countChangedSpy.count(), 1, oneSecondInMs);
|
||||
+ QVERIFY(listView->isVisible());
|
||||
+}
|
||||
+
|
||||
QTEST_MAIN(tst_QQuickListView2)
|
||||
|
||||
#include "tst_qquicklistview2.moc"
|
||||
--
|
||||
2.16.3
|
||||
|
||||
|
|
@ -1,93 +0,0 @@
|
|||
From 4a368a06afa5929d8674d2e94c2d7cbd6ad85d4e Mon Sep 17 00:00:00 2001
|
||||
From: Paul Wicking <paul.wicking@qt.io>
|
||||
Date: Fri, 13 Sep 2024 14:37:38 +0200
|
||||
Subject: [PATCH] QDoc: Adapt to breaking changes in LLVM 19
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Due to upstream changes in LLVM 19, QDoc fails to compile when linked
|
||||
against Clang libraries from this version of LLVM. Three issues arise;
|
||||
|
||||
- Two cases of passing an argument of wrong type to a function.
|
||||
- One case of accessing a non-existing member of an enumeration.
|
||||
|
||||
One upstream change (see [0]) is responsible for two of the issues:
|
||||
|
||||
- `get_expression_as_string()` is modified such that it correctly
|
||||
obtains the parameter type when calling
|
||||
`get_fully_qualified_type_name()`, by appending
|
||||
`.getArgument().getAsType()` to the call to `getDefaultArgument()`.
|
||||
- `get_default_value_initializer_as_string()` is modified such that it
|
||||
correctly passes the source expression to
|
||||
`get_expression_as_string()`, by appending `.getSourceExpression()`
|
||||
to the call to `getDefaultArgument()`.
|
||||
|
||||
Both of these changes are is incompatible with QDoc built against
|
||||
Clang libraries from earlier versions of LLVM, and are therefore
|
||||
wrapped in #if-ery.
|
||||
|
||||
Finally, LLVM 19 drops a value used in QDoc from the enumeration
|
||||
`clang::TemplateName::Qualified`, see [1]. The enum value `Fully` is
|
||||
removed without replacement. The enum is left with two values,
|
||||
`AsWritten` and `None`. QDoc is modified such that it relies on the
|
||||
former of the two. This change doesn't cause any change in output from
|
||||
QDoc when built against Clang libraries from LLVM 17 and 18, and the
|
||||
change is therefore not wrapped in #if-ery.
|
||||
|
||||
[0] - https://github.com/llvm/llvm-project/commit/e42b799bb28815431f2c5a95f7e13fde3f1b36a1
|
||||
[1] - https://github.com/llvm/llvm-project/commit/9c4a716c12920
|
||||
|
||||
Done-with: Khem Raj <raj.khem@gmail.com>
|
||||
Fixes: QTBUG-128644
|
||||
Pick-to: 6.8
|
||||
Change-Id: I34fbb46cf28b5676b4adda5e563d6d59fc40f602
|
||||
Reviewed-by: Luca Di Sera <luca.disera@qt.io>
|
||||
Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
|
||||
---
|
||||
src/qdoc/qdoc/src/qdoc/clangcodeparser.cpp | 13 ++++++++++++-
|
||||
1 file changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/qdoc/qdoc/src/qdoc/clangcodeparser.cpp b/src/qdoc/qdoc/src/qdoc/clangcodeparser.cpp
|
||||
index eb3a781bc..385d651ec 100644
|
||||
--- a/src/qdoc/qdoc/src/qdoc/clangcodeparser.cpp
|
||||
+++ b/src/qdoc/qdoc/src/qdoc/clangcodeparser.cpp
|
||||
@@ -207,9 +207,15 @@ static std::string get_expression_as_string(const clang::Expr* expression, const
|
||||
* If the parameter has no default value the empty string will be returned.
|
||||
*/
|
||||
static std::string get_default_value_initializer_as_string(const clang::TemplateTypeParmDecl* parameter) {
|
||||
+#if LIBCLANG_VERSION_MAJOR >= 19
|
||||
+ return (parameter && parameter->hasDefaultArgument()) ?
|
||||
+ get_fully_qualified_type_name(parameter->getDefaultArgument().getArgument().getAsType(), parameter->getASTContext()) :
|
||||
+ "";
|
||||
+#else
|
||||
return (parameter && parameter->hasDefaultArgument()) ?
|
||||
get_fully_qualified_type_name(parameter->getDefaultArgument(), parameter->getASTContext()) :
|
||||
"";
|
||||
+#endif
|
||||
|
||||
}
|
||||
|
||||
@@ -223,8 +229,13 @@ static std::string get_default_value_initializer_as_string(const clang::Template
|
||||
* If the parameter as no default value the empty string will be returned.
|
||||
*/
|
||||
static std::string get_default_value_initializer_as_string(const clang::NonTypeTemplateParmDecl* parameter) {
|
||||
+#if LIBCLANG_VERSION_MAJOR >= 19
|
||||
+ return (parameter && parameter->hasDefaultArgument()) ?
|
||||
+ get_expression_as_string(parameter->getDefaultArgument().getSourceExpression(), parameter->getASTContext()) : "";
|
||||
+#else
|
||||
return (parameter && parameter->hasDefaultArgument()) ?
|
||||
get_expression_as_string(parameter->getDefaultArgument(), parameter->getASTContext()) : "";
|
||||
+#endif
|
||||
|
||||
}
|
||||
|
||||
@@ -244,7 +255,7 @@ static std::string get_default_value_initializer_as_string(const clang::Template
|
||||
const clang::TemplateName template_name = parameter->getDefaultArgument().getArgument().getAsTemplate();
|
||||
|
||||
llvm::raw_string_ostream ss{default_value};
|
||||
- template_name.print(ss, parameter->getASTContext().getPrintingPolicy(), clang::TemplateName::Qualified::Fully);
|
||||
+ template_name.print(ss, parameter->getASTContext().getPrintingPolicy(), clang::TemplateName::Qualified::AsWritten);
|
||||
}
|
||||
|
||||
return default_value;
|
|
@ -1,30 +0,0 @@
|
|||
From 687fc1601863ae7a67897bc3590b33bd3bdcc3bc Mon Sep 17 00:00:00 2001
|
||||
From: Joerg Bornemann <joerg.bornemann@qt.io>
|
||||
Date: Mon, 15 Jul 2024 15:17:04 +0200
|
||||
Subject: [PATCH] lupdate/clang: Fix deprecation warning with llvm 18
|
||||
|
||||
Change-Id: Ib22dda34bfdf7a1cd0e9932eec0f6f13a912a688
|
||||
Reviewed-by: Lucie Gerard <lucie.gerard@qt.io>
|
||||
---
|
||||
src/linguist/lupdate/clangtoolastreader.cpp | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/src/linguist/lupdate/clangtoolastreader.cpp b/src/linguist/lupdate/clangtoolastreader.cpp
|
||||
index 6b85c6ccb3..3db9e0d64a 100644
|
||||
--- a/src/linguist/lupdate/clangtoolastreader.cpp
|
||||
+++ b/src/linguist/lupdate/clangtoolastreader.cpp
|
||||
@@ -782,8 +782,14 @@ bool LupdateVisitor::VisitNamedDecl(clang::NamedDecl *namedDeclaration)
|
||||
if (!fullLocation.isValid() || !fullLocation.getFileEntry())
|
||||
return true;
|
||||
|
||||
+#if (LUPDATE_CLANG_VERSION >= LUPDATE_CLANG_VERSION_CHECK(18,0,0))
|
||||
+ auto fileEntry = fullLocation.getFileEntryRef();
|
||||
+ if (fileEntry && !LupdatePrivate::isFileSignificant(fileEntry->getName().str()))
|
||||
+ return true;
|
||||
+#else
|
||||
if (!LupdatePrivate::isFileSignificant(fullLocation.getFileEntry()->getName().str()))
|
||||
return true;
|
||||
+#endif
|
||||
|
||||
qCDebug(lcClang) << "NamedDecl Name: " << QString::fromStdString(namedDeclaration->getQualifiedNameAsString());
|
||||
qCDebug(lcClang) << "NamedDecl source: " << QString::fromStdString(namedDeclaration->getSourceRange().printToString(
|
|
@ -0,0 +1,130 @@
|
|||
From 861a7921ed7833a90f77b5fca436c789a4f9517c Mon Sep 17 00:00:00 2001
|
||||
From: Mitch Curtis <mitch.curtis@qt.io>
|
||||
Date: Tue, 22 Oct 2024 13:26:08 +0800
|
||||
Subject: [PATCH] QQuickItemView: fix crash with zero-size SwipeView that uses
|
||||
Repeater
|
||||
|
||||
When running the minimal example from the bug report, the order of
|
||||
events is:
|
||||
|
||||
1. deletables are iterated in QQuickRepeater::clear(), and deleteLater
|
||||
is called on the delegate item.
|
||||
2. deletables are unparented. This causes Container (SwipeView) to be
|
||||
notified of the parent change and it removes the item. Part of this
|
||||
involves changing the currentIndex, since the removed item was current.
|
||||
3. SwipeView's contentItem (ListView) has its currentIndex bound to the
|
||||
container's, so QQuickItemView::setCurrentIndex is called.
|
||||
4. setCurrentIndex calls updateCurrent, which detects that the
|
||||
currentIndex (which is -1, because there was only one item) is out of
|
||||
range and so releases the item. This causes it to be added to
|
||||
unrequestedItems, even though it has been scheduled for deletion.
|
||||
|
||||
This patch makes QQuickItemView detect that the item is going to be
|
||||
deleted and not add it to the list of deletables.
|
||||
|
||||
Fixes: QTBUG-129622
|
||||
Pick-to: 6.5
|
||||
Change-Id: I999aedbdfafc61ff6d33eb6579331f470e9c1454
|
||||
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
|
||||
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|
||||
(cherry picked from commit 18a6a658aaf25fa8c380daef8a72dee4c1661164)
|
||||
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
|
||||
---
|
||||
src/quick/items/qquickitemview.cpp | 4 +-
|
||||
.../quickcontrols/controls/data/tst_swipeview.qml | 59 ++++++++++++++++++++++
|
||||
2 files changed, 62 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp
|
||||
index 19e5b7f4029..dabd5630dbc 100644
|
||||
--- a/src/quick/items/qquickitemview.cpp
|
||||
+++ b/src/quick/items/qquickitemview.cpp
|
||||
@@ -2499,7 +2499,9 @@ bool QQuickItemViewPrivate::releaseItem(FxViewItem *item, QQmlInstanceModel::Reu
|
||||
// One case where this can happen is moving an item out of one ObjectModel and into another.
|
||||
QQuickItemPrivate::get(item->item)->setCulled(true);
|
||||
}
|
||||
- if (!isClearing)
|
||||
+ // If deleteLater was called, the item isn't long for this world and so we shouldn't store references to it.
|
||||
+ // This can happen when a Repeater is used to populate items in SwipeView's ListView contentItem.
|
||||
+ if (!isClearing && !QObjectPrivate::get(item->item)->deleteLaterCalled)
|
||||
unrequestedItems.insert(item->item, model->indexOf(item->item, q));
|
||||
} else if (flags & QQmlInstanceModel::Destroyed) {
|
||||
item->item->setParentItem(nullptr);
|
||||
diff --git a/tests/auto/quickcontrols/controls/data/tst_swipeview.qml b/tests/auto/quickcontrols/controls/data/tst_swipeview.qml
|
||||
index 3a7558c0e4d..a3dd16c3044 100644
|
||||
--- a/tests/auto/quickcontrols/controls/data/tst_swipeview.qml
|
||||
+++ b/tests/auto/quickcontrols/controls/data/tst_swipeview.qml
|
||||
@@ -4,6 +4,7 @@
|
||||
import QtQuick
|
||||
import QtTest
|
||||
import QtQuick.Controls
|
||||
+import QtQuick.Layouts
|
||||
|
||||
TestCase {
|
||||
id: testCase
|
||||
@@ -760,4 +761,62 @@ TestCase {
|
||||
tryCompare(swipeListView, "contentX", swipeListView.width, 1000)
|
||||
compare(item2.x, swipeListView.width)
|
||||
}
|
||||
+
|
||||
+ Component {
|
||||
+ id: zeroSizeSwipeViewWithRepeatersComponent
|
||||
+
|
||||
+ Item {
|
||||
+ objectName: "rootItem"
|
||||
+ anchors.fill: parent
|
||||
+
|
||||
+ property alias swipeView: swipeView
|
||||
+ property int d
|
||||
+
|
||||
+ Timer {
|
||||
+ interval: 2
|
||||
+ running: true
|
||||
+ repeat: false
|
||||
+ onTriggered: d = 2
|
||||
+ }
|
||||
+
|
||||
+ SwipeView {
|
||||
+ id: swipeView
|
||||
+ contentItem.objectName: "swipeViewListView"
|
||||
+
|
||||
+ Repeater {
|
||||
+ objectName: "swipeViewContentItemRepeater"
|
||||
+ model: [
|
||||
+ {
|
||||
+ title: d
|
||||
+ }
|
||||
+ ]
|
||||
+
|
||||
+ delegate: GridLayout {
|
||||
+ objectName: "gridLayoutDelegate"
|
||||
+
|
||||
+ Repeater {
|
||||
+ id: repeater
|
||||
+ objectName: "delegateRepeater"
|
||||
+ model: d
|
||||
+ delegate: Item {
|
||||
+ objectName: "delegate" + index
|
||||
+
|
||||
+ required property int index
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ // QTBUG-129622
|
||||
+ function test_zeroSizeSwipeViewWithRepeaters() {
|
||||
+ let root = createTemporaryObject(zeroSizeSwipeViewWithRepeatersComponent, testCase)
|
||||
+ verify(root)
|
||||
+
|
||||
+ let swipeView = root.swipeView
|
||||
+ tryCompare(root, "d", 2)
|
||||
+ // Shouldn't crash when the model is changed.
|
||||
+ }
|
||||
}
|
||||
--
|
||||
2.16.3
|
||||
|
||||
|
|
@ -1,585 +0,0 @@
|
|||
From 6e554a30893150793c2638e3689cf208ffc8e375 Mon Sep 17 00:00:00 2001
|
||||
From: Dale Curtis <dalecurtis@chromium.org>
|
||||
Date: Sat, 2 Apr 2022 05:13:53 +0000
|
||||
Subject: [PATCH] Roll src/third_party/ffmpeg/ 574c39cce..32b2d1d526 (1125
|
||||
commits)
|
||||
|
||||
https://chromium.googlesource.com/chromium/third_party/ffmpeg.git/+log/574c39cce323..32b2d1d526
|
||||
|
||||
Created with:
|
||||
roll-dep src/third_party/ffmpeg
|
||||
|
||||
Fixed: 1293918
|
||||
Cq-Include-Trybots: luci.chromium.try:mac_chromium_asan_rel_ng,linux_chromium_asan_rel_ng,linux_chromium_chromeos_asan_rel_ng
|
||||
Change-Id: I41945d0f963e3d1f65940067bac22f63b68e37d2
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3565647
|
||||
Auto-Submit: Dale Curtis <dalecurtis@chromium.org>
|
||||
Reviewed-by: Dan Sanders <sandersd@chromium.org>
|
||||
Commit-Queue: Dale Curtis <dalecurtis@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/main@{#988253}
|
||||
---
|
||||
.../clear_key_cdm/ffmpeg_cdm_audio_decoder.cc | 29 ++++++++++---------
|
||||
media/ffmpeg/ffmpeg_common.cc | 11 +++----
|
||||
media/filters/audio_file_reader.cc | 9 +++---
|
||||
media/filters/audio_file_reader_unittest.cc | 6 ++--
|
||||
.../filters/audio_video_metadata_extractor.cc | 11 +++++--
|
||||
.../filters/ffmpeg_aac_bitstream_converter.cc | 7 +++--
|
||||
...ffmpeg_aac_bitstream_converter_unittest.cc | 2 +-
|
||||
media/filters/ffmpeg_audio_decoder.cc | 13 +++++----
|
||||
8 files changed, 51 insertions(+), 37 deletions(-)
|
||||
|
||||
diff --git a/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc b/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc
|
||||
index e4fc3f460e2..9b1ad9f7675 100644
|
||||
--- a/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc
|
||||
+++ b/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc
|
||||
@@ -74,7 +74,7 @@ void CdmAudioDecoderConfigToAVCodecContext(
|
||||
codec_context->sample_fmt = AV_SAMPLE_FMT_NONE;
|
||||
}
|
||||
|
||||
- codec_context->channels = config.channel_count;
|
||||
+ codec_context->ch_layout.nb_channels = config.channel_count;
|
||||
codec_context->sample_rate = config.samples_per_second;
|
||||
|
||||
if (config.extra_data) {
|
||||
@@ -124,8 +124,8 @@ void CopySamples(cdm::AudioFormat cdm_format,
|
||||
case cdm::kAudioFormatPlanarS16:
|
||||
case cdm::kAudioFormatPlanarF32: {
|
||||
const int decoded_size_per_channel =
|
||||
- decoded_audio_size / av_frame.channels;
|
||||
- for (int i = 0; i < av_frame.channels; ++i) {
|
||||
+ decoded_audio_size / av_frame.ch_layout.nb_channels;
|
||||
+ for (int i = 0; i < av_frame.ch_layout.nb_channels; ++i) {
|
||||
memcpy(output_buffer, av_frame.extended_data[i],
|
||||
decoded_size_per_channel);
|
||||
output_buffer += decoded_size_per_channel;
|
||||
@@ -185,13 +185,14 @@ bool FFmpegCdmAudioDecoder::Initialize(
|
||||
// Success!
|
||||
decoding_loop_ = std::make_unique<FFmpegDecodingLoop>(codec_context_.get());
|
||||
samples_per_second_ = config.samples_per_second;
|
||||
- bytes_per_frame_ = codec_context_->channels * config.bits_per_channel / 8;
|
||||
+ bytes_per_frame_ =
|
||||
+ codec_context_->ch_layout.nb_channels * config.bits_per_channel / 8;
|
||||
output_timestamp_helper_ =
|
||||
std::make_unique<AudioTimestampHelper>(config.samples_per_second);
|
||||
is_initialized_ = true;
|
||||
|
||||
// Store initial values to guard against midstream configuration changes.
|
||||
- channels_ = codec_context_->channels;
|
||||
+ channels_ = codec_context_->ch_layout.nb_channels;
|
||||
av_sample_format_ = codec_context_->sample_fmt;
|
||||
|
||||
return true;
|
||||
@@ -291,18 +292,19 @@ cdm::Status FFmpegCdmAudioDecoder::DecodeBuffer(
|
||||
for (auto& frame : audio_frames) {
|
||||
int decoded_audio_size = 0;
|
||||
if (frame->sample_rate != samples_per_second_ ||
|
||||
- frame->channels != channels_ || frame->format != av_sample_format_) {
|
||||
+ frame->ch_layout.nb_channels != channels_ ||
|
||||
+ frame->format != av_sample_format_) {
|
||||
DLOG(ERROR) << "Unsupported midstream configuration change!"
|
||||
<< " Sample Rate: " << frame->sample_rate << " vs "
|
||||
<< samples_per_second_
|
||||
<< ", Channels: " << frame->ch_layout.nb_channels << " vs "
|
||||
<< channels_ << ", Sample Format: " << frame->format << " vs "
|
||||
<< av_sample_format_;
|
||||
return cdm::kDecodeError;
|
||||
}
|
||||
|
||||
decoded_audio_size = av_samples_get_buffer_size(
|
||||
- nullptr, codec_context_->channels, frame->nb_samples,
|
||||
+ nullptr, codec_context_->ch_layout.nb_channels, frame->nb_samples,
|
||||
codec_context_->sample_fmt, 1);
|
||||
if (!decoded_audio_size)
|
||||
continue;
|
||||
@@ -320,9 +323,9 @@ bool FFmpegCdmAudioDecoder::OnNewFrame(
|
||||
size_t* total_size,
|
||||
std::vector<std::unique_ptr<AVFrame, ScopedPtrAVFreeFrame>>* audio_frames,
|
||||
AVFrame* frame) {
|
||||
- *total_size += av_samples_get_buffer_size(
|
||||
- nullptr, codec_context_->channels, frame->nb_samples,
|
||||
- codec_context_->sample_fmt, 1);
|
||||
+ *total_size += av_samples_get_buffer_size(
|
||||
+ nullptr, codec_context_->ch_layout.nb_channels, frame->nb_samples,
|
||||
+ codec_context_->sample_fmt, 1);
|
||||
audio_frames->emplace_back(av_frame_clone(frame));
|
||||
return true;
|
||||
}
|
||||
diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc
|
||||
index 87ca8969626..76f03d6608e 100644
|
||||
--- a/media/ffmpeg/ffmpeg_common.cc
|
||||
+++ b/media/ffmpeg/ffmpeg_common.cc
|
||||
@@ -345,10 +345,11 @@ bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context,
|
||||
codec_context->sample_fmt, codec_context->codec_id);
|
||||
|
||||
ChannelLayout channel_layout =
|
||||
- codec_context->channels > 8
|
||||
+ codec_context->ch_layout.nb_channels > 8
|
||||
? CHANNEL_LAYOUT_DISCRETE
|
||||
- : ChannelLayoutToChromeChannelLayout(codec_context->channel_layout,
|
||||
- codec_context->channels);
|
||||
+ : ChannelLayoutToChromeChannelLayout(
|
||||
+ codec_context->ch_layout.u.mask,
|
||||
+ codec_context->ch_layout.nb_channels);
|
||||
|
||||
int sample_rate = codec_context->sample_rate;
|
||||
switch (codec) {
|
||||
@@ -401,7 +402,7 @@ bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context,
|
||||
extra_data, encryption_scheme, seek_preroll,
|
||||
codec_context->delay);
|
||||
if (channel_layout == CHANNEL_LAYOUT_DISCRETE)
|
||||
- config->SetChannelsForDiscrete(codec_context->channels);
|
||||
+ config->SetChannelsForDiscrete(codec_context->ch_layout.nb_channels);
|
||||
|
||||
#if BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO)
|
||||
// These are bitstream formats unknown to ffmpeg, so they don't have
|
||||
@@ -470,7 +471,7 @@ void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config,
|
||||
|
||||
// TODO(scherkus): should we set |channel_layout|? I'm not sure if FFmpeg uses
|
||||
// said information to decode.
|
||||
- codec_context->channels = config.channels();
|
||||
+ codec_context->ch_layout.nb_channels = config.channels();
|
||||
codec_context->sample_rate = config.samples_per_second();
|
||||
|
||||
if (config.extra_data().empty()) {
|
||||
diff --git a/media/filters/audio_file_reader.cc b/media/filters/audio_file_reader.cc
|
||||
index 5f257bdfaa6..e1be5aa9a5b 100644
|
||||
--- a/media/filters/audio_file_reader.cc
|
||||
+++ b/media/filters/audio_file_reader.cc
|
||||
@@ -113,14 +113,15 @@ bool AudioFileReader::OpenDecoder() {
|
||||
|
||||
// Verify the channel layout is supported by Chrome. Acts as a sanity check
|
||||
// against invalid files. See http://crbug.com/171962
|
||||
- if (ChannelLayoutToChromeChannelLayout(codec_context_->channel_layout,
|
||||
- codec_context_->channels) ==
|
||||
+ if (ChannelLayoutToChromeChannelLayout(
|
||||
+ codec_context_->ch_layout.u.mask,
|
||||
+ codec_context_->ch_layout.nb_channels) ==
|
||||
CHANNEL_LAYOUT_UNSUPPORTED) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Store initial values to guard against midstream configuration changes.
|
||||
- channels_ = codec_context_->channels;
|
||||
+ channels_ = codec_context_->ch_layout.nb_channels;
|
||||
audio_codec_ = CodecIDToAudioCodec(codec_context_->codec_id);
|
||||
sample_rate_ = codec_context_->sample_rate;
|
||||
av_sample_format_ = codec_context_->sample_fmt;
|
||||
@@ -223,7 +224,7 @@ bool AudioFileReader::OnNewFrame(
|
||||
if (frames_read < 0)
|
||||
return false;
|
||||
|
||||
- const int channels = frame->channels;
|
||||
+ const int channels = frame->ch_layout.nb_channels;
|
||||
if (frame->sample_rate != sample_rate_ || channels != channels_ ||
|
||||
frame->format != av_sample_format_) {
|
||||
DLOG(ERROR) << "Unsupported midstream configuration change!"
|
||||
diff --git a/media/filters/ffmpeg_aac_bitstream_converter.cc b/media/filters/ffmpeg_aac_bitstream_converter.cc
|
||||
index 6f231c85729..ca5e5fb927d 100644
|
||||
--- a/media/filters/ffmpeg_aac_bitstream_converter.cc
|
||||
+++ b/media/filters/ffmpeg_aac_bitstream_converter.cc
|
||||
@@ -195,14 +195,15 @@ bool FFmpegAACBitstreamConverter::ConvertPacket(AVPacket* packet) {
|
||||
if (!header_generated_ || codec_ != stream_codec_parameters_->codec_id ||
|
||||
audio_profile_ != stream_codec_parameters_->profile ||
|
||||
sample_rate_index_ != sample_rate_index ||
|
||||
- channel_configuration_ != stream_codec_parameters_->channels ||
|
||||
+ channel_configuration_ !=
|
||||
+ stream_codec_parameters_->ch_layout.nb_channels ||
|
||||
frame_length_ != header_plus_packet_size) {
|
||||
header_generated_ =
|
||||
GenerateAdtsHeader(stream_codec_parameters_->codec_id,
|
||||
0, // layer
|
||||
stream_codec_parameters_->profile, sample_rate_index,
|
||||
0, // private stream
|
||||
- stream_codec_parameters_->channels,
|
||||
+ stream_codec_parameters_->ch_layout.nb_channels,
|
||||
0, // originality
|
||||
0, // home
|
||||
0, // copyrighted_stream
|
||||
@@ -214,7 +215,7 @@ bool FFmpegAACBitstreamConverter::ConvertPacket(AVPacket* packet) {
|
||||
codec_ = stream_codec_parameters_->codec_id;
|
||||
audio_profile_ = stream_codec_parameters_->profile;
|
||||
sample_rate_index_ = sample_rate_index;
|
||||
- channel_configuration_ = stream_codec_parameters_->channels;
|
||||
+ channel_configuration_ = stream_codec_parameters_->ch_layout.nb_channels;
|
||||
frame_length_ = header_plus_packet_size;
|
||||
}
|
||||
|
||||
diff --git a/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc b/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc
|
||||
index 1fd4c5ccd7d..f59bcd8fdaf 100644
|
||||
--- a/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc
|
||||
+++ b/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc
|
||||
@@ -34,7 +34,7 @@ class FFmpegAACBitstreamConverterTest : public testing::Test {
|
||||
memset(&test_parameters_, 0, sizeof(AVCodecParameters));
|
||||
test_parameters_.codec_id = AV_CODEC_ID_AAC;
|
||||
test_parameters_.profile = FF_PROFILE_AAC_MAIN;
|
||||
- test_parameters_.channels = 2;
|
||||
+ test_parameters_.ch_layout.nb_channels = 2;
|
||||
test_parameters_.extradata = extradata_header_;
|
||||
test_parameters_.extradata_size = sizeof(extradata_header_);
|
||||
}
|
||||
diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc
|
||||
index 6a56c675f7d..4615fdeb3fb 100644
|
||||
--- a/media/filters/ffmpeg_audio_decoder.cc
|
||||
+++ b/media/filters/ffmpeg_audio_decoder.cc
|
||||
@@ -28,7 +28,7 @@ namespace media {
|
||||
|
||||
// Return the number of channels from the data in |frame|.
|
||||
static inline int DetermineChannels(AVFrame* frame) {
|
||||
- return frame->channels;
|
||||
+ return frame->ch_layout.nb_channels;
|
||||
}
|
||||
|
||||
// Called by FFmpeg's allocation routine to allocate a buffer. Uses
|
||||
@@ -231,7 +231,7 @@ bool FFmpegAudioDecoder::OnNewFrame(const DecoderBuffer& buffer,
|
||||
// Translate unsupported into discrete layouts for discrete configurations;
|
||||
// ffmpeg does not have a labeled discrete configuration internally.
|
||||
ChannelLayout channel_layout = ChannelLayoutToChromeChannelLayout(
|
||||
- codec_context_->channel_layout, codec_context_->channels);
|
||||
+ codec_context_->ch_layout.u.mask, codec_context_->ch_layout.nb_channels);
|
||||
if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED &&
|
||||
config_.channel_layout() == CHANNEL_LAYOUT_DISCRETE) {
|
||||
channel_layout = CHANNEL_LAYOUT_DISCRETE;
|
||||
@@ -348,11 +348,11 @@ bool FFmpegAudioDecoder::ConfigureDecoder(const AudioDecoderConfig& config) {
|
||||
// Success!
|
||||
av_sample_format_ = codec_context_->sample_fmt;
|
||||
|
||||
- if (codec_context_->channels != config.channels()) {
|
||||
+ if (codec_context_->ch_layout.nb_channels != config.channels()) {
|
||||
MEDIA_LOG(ERROR, media_log_)
|
||||
<< "Audio configuration specified " << config.channels()
|
||||
<< " channels, but FFmpeg thinks the file contains "
|
||||
- << codec_context_->channels << " channels";
|
||||
+ << codec_context_->ch_layout.nb_channels << " channels";
|
||||
ReleaseFFmpegResources();
|
||||
state_ = DecoderState::kUninitialized;
|
||||
return false;
|
||||
@@ -403,7 +403,7 @@ int FFmpegAudioDecoder::GetAudioBuffer(struct AVCodecContext* s,
|
||||
if (frame->nb_samples <= 0)
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
- if (s->channels != channels) {
|
||||
+ if (s->ch_layout.nb_channels != channels) {
|
||||
DLOG(ERROR) << "AVCodecContext and AVFrame disagree on channel count.";
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
@@ -436,7 +436,8 @@ int FFmpegAudioDecoder::GetAudioBuffer(struct AVCodecContext* s,
|
||||
ChannelLayout channel_layout =
|
||||
config_.channel_layout() == CHANNEL_LAYOUT_DISCRETE
|
||||
? CHANNEL_LAYOUT_DISCRETE
|
||||
- : ChannelLayoutToChromeChannelLayout(s->channel_layout, s->channels);
|
||||
+ : ChannelLayoutToChromeChannelLayout(s->ch_layout.u.mask,
|
||||
+ s->ch_layout.nb_channels);
|
||||
|
||||
if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED) {
|
||||
DLOG(ERROR) << "Unsupported channel layout.";
|
||||
commit 62274859104bd828373ae406aa9309e610449ac5
|
||||
Author: Ted Meyer <tmathmeyer@chromium.org>
|
||||
Date: Fri Mar 22 19:56:55 2024 +0000
|
||||
|
||||
Replace deprecated use of AVCodecContext::reordered_opaque
|
||||
|
||||
We can use the AV_CODEC_FLAG_COPY_OPAQUE flag on the codec context
|
||||
now to trigger timestamp propagation.
|
||||
|
||||
Bug: 330573128
|
||||
Change-Id: I6bc57241a35ab5283742aad8d42acb4dc5e85858
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5384308
|
||||
Commit-Queue: Ted (Chromium) Meyer <tmathmeyer@chromium.org>
|
||||
Reviewed-by: Dan Sanders <sandersd@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/main@{#1277051}
|
||||
|
||||
diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc
|
||||
index bd75477feeabb..8a658a58caac5 100644
|
||||
--- a/media/filters/ffmpeg_video_decoder.cc
|
||||
+++ b/media/filters/ffmpeg_video_decoder.cc
|
||||
@@ -134,7 +134,7 @@ bool FFmpegVideoDecoder::IsCodecSupported(VideoCodec codec) {
|
||||
}
|
||||
|
||||
FFmpegVideoDecoder::FFmpegVideoDecoder(MediaLog* media_log)
|
||||
- : media_log_(media_log) {
|
||||
+ : media_log_(media_log), timestamp_map_(128) {
|
||||
DVLOG(1) << __func__;
|
||||
DETACH_FROM_SEQUENCE(sequence_checker_);
|
||||
}
|
||||
@@ -363,8 +363,10 @@ bool FFmpegVideoDecoder::FFmpegDecode(const DecoderBuffer& buffer) {
|
||||
DCHECK(packet->data);
|
||||
DCHECK_GT(packet->size, 0);
|
||||
|
||||
- // Let FFmpeg handle presentation timestamp reordering.
|
||||
- codec_context_->reordered_opaque = buffer.timestamp().InMicroseconds();
|
||||
+ const int64_t timestamp = buffer.timestamp().InMicroseconds();
|
||||
+ const TimestampId timestamp_id = timestamp_id_generator_.GenerateNextId();
|
||||
+ timestamp_map_.Put(std::make_pair(timestamp_id, timestamp));
|
||||
+ packet->opaque = reinterpret_cast<void*>(timestamp_id.GetUnsafeValue());
|
||||
}
|
||||
FFmpegDecodingLoop::DecodeStatus decode_status = decoding_loop_->DecodePacket(
|
||||
packet, base::BindRepeating(&FFmpegVideoDecoder::OnNewFrame,
|
||||
@@ -423,7 +425,12 @@ bool FFmpegVideoDecoder::OnNewFrame(AVFrame* frame) {
|
||||
}
|
||||
gfx::Size natural_size = aspect_ratio.GetNaturalSize(visible_rect);
|
||||
|
||||
- const auto pts = base::Microseconds(frame->reordered_opaque);
|
||||
+ const auto ts_id = TimestampId(reinterpret_cast<size_t>(frame->opaque));
|
||||
+ const auto ts_lookup = timestamp_map_.Get(ts_id);
|
||||
+ if (ts_lookup == timestamp_map_.end()) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ const auto pts = base::Microseconds(std::get<1>(*ts_lookup));
|
||||
auto video_frame = VideoFrame::WrapExternalDataWithLayout(
|
||||
opaque->layout, visible_rect, natural_size, opaque->data, opaque->size,
|
||||
pts);
|
||||
@@ -498,8 +505,10 @@ bool FFmpegVideoDecoder::ConfigureDecoder(const VideoDecoderConfig& config,
|
||||
codec_context_->thread_count = GetFFmpegVideoDecoderThreadCount(config);
|
||||
codec_context_->thread_type =
|
||||
FF_THREAD_SLICE | (low_delay ? 0 : FF_THREAD_FRAME);
|
||||
+
|
||||
codec_context_->opaque = this;
|
||||
codec_context_->get_buffer2 = GetVideoBufferImpl;
|
||||
+ codec_context_->flags |= AV_CODEC_FLAG_COPY_OPAQUE;
|
||||
|
||||
if (base::FeatureList::IsEnabled(kFFmpegAllowLists)) {
|
||||
// Note: FFmpeg will try to free this string, so we must duplicate it.
|
||||
diff --git a/media/filters/ffmpeg_video_decoder.h b/media/filters/ffmpeg_video_decoder.h
|
||||
index d02cb89c3ddf7..0a2de1c623fff 100644
|
||||
--- a/media/filters/ffmpeg_video_decoder.h
|
||||
+++ b/media/filters/ffmpeg_video_decoder.h
|
||||
@@ -7,10 +7,12 @@
|
||||
|
||||
#include <memory>
|
||||
|
||||
+#include "base/containers/lru_cache.h"
|
||||
#include "base/functional/callback.h"
|
||||
#include "base/memory/raw_ptr.h"
|
||||
#include "base/memory/scoped_refptr.h"
|
||||
#include "base/sequence_checker.h"
|
||||
+#include "base/types/id_type.h"
|
||||
#include "media/base/supported_video_decoder_config.h"
|
||||
#include "media/base/video_decoder.h"
|
||||
#include "media/base/video_decoder_config.h"
|
||||
@@ -87,6 +89,20 @@ class MEDIA_EXPORT FFmpegVideoDecoder : public VideoDecoder {
|
||||
// FFmpeg structures owned by this object.
|
||||
std::unique_ptr<AVCodecContext, ScopedPtrAVFreeContext> codec_context_;
|
||||
|
||||
+ // The gist here is that timestamps need to be 64 bits to store microsecond
|
||||
+ // precision. A 32 bit integer would overflow at ~35 minutes at this level of
|
||||
+ // precision. We can't cast the timestamp to the void ptr object used by the
|
||||
+ // opaque field in ffmpeg then, because it would lose data on a 32 bit build.
|
||||
+ // However, we don't actually have 2^31 timestamped frames in a single
|
||||
+ // playback, so it's fine to use the 32 bit value as a key in a map which
|
||||
+ // contains the actual timestamps. Additionally, we've in the past set 128
|
||||
+ // outstanding frames for re-ordering as a limit for cross-thread decoding
|
||||
+ // tasks, so we'll do that here too with the LRU cache.
|
||||
+ using TimestampId = base::IdType<int64_t, size_t, 0>;
|
||||
+
|
||||
+ TimestampId::Generator timestamp_id_generator_;
|
||||
+ base::LRUCache<TimestampId, int64_t> timestamp_map_;
|
||||
+
|
||||
VideoDecoderConfig config_;
|
||||
|
||||
scoped_refptr<FrameBufferPool> frame_pool_;
|
||||
diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc
|
||||
index 3331581a6fee6..69539fd6594ec 100644
|
||||
--- a/media/ffmpeg/ffmpeg_common.cc
|
||||
+++ b/media/ffmpeg/ffmpeg_common.cc
|
||||
@@ -404,7 +404,9 @@ bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context,
|
||||
|
||||
// TODO(dalecurtis): Just use the profile from the codec context if ffmpeg
|
||||
// ever starts supporting xHE-AAC.
|
||||
- if (codec_context->profile == FF_PROFILE_UNKNOWN) {
|
||||
+ constexpr uint8_t kXHEAAc = 41;
|
||||
+ if (codec_context->profile == FF_PROFILE_UNKNOWN ||
|
||||
+ codec_context->profile == kXHEAAc) {
|
||||
// Errors aren't fatal here, so just drop any MediaLog messages.
|
||||
NullMediaLog media_log;
|
||||
mp4::AAC aac_parser;
|
||||
diff --git a/media/ffmpeg/ffmpeg_regression_tests.cc b/media/ffmpeg/ffmpeg_regression_tests.cc
|
||||
index 05dcb1cd62c75..866f446698947 100644
|
||||
--- a/media/ffmpeg/ffmpeg_regression_tests.cc
|
||||
+++ b/media/ffmpeg/ffmpeg_regression_tests.cc
|
||||
@@ -90,16 +90,16 @@ FFMPEG_TEST_CASE(Cr62127,
|
||||
PIPELINE_ERROR_DECODE,
|
||||
PIPELINE_ERROR_DECODE);
|
||||
FFMPEG_TEST_CASE(Cr93620, "security/93620.ogg", PIPELINE_OK, PIPELINE_OK);
|
||||
-FFMPEG_TEST_CASE(Cr100492,
|
||||
- "security/100492.webm",
|
||||
- DECODER_ERROR_NOT_SUPPORTED,
|
||||
- DECODER_ERROR_NOT_SUPPORTED);
|
||||
+FFMPEG_TEST_CASE(Cr100492, "security/100492.webm", PIPELINE_OK, PIPELINE_OK);
|
||||
FFMPEG_TEST_CASE(Cr100543, "security/100543.webm", PIPELINE_OK, PIPELINE_OK);
|
||||
FFMPEG_TEST_CASE(Cr101458,
|
||||
"security/101458.webm",
|
||||
PIPELINE_ERROR_DECODE,
|
||||
PIPELINE_ERROR_DECODE);
|
||||
-FFMPEG_TEST_CASE(Cr108416, "security/108416.webm", PIPELINE_OK, PIPELINE_OK);
|
||||
+FFMPEG_TEST_CASE(Cr108416,
|
||||
+ "security/108416.webm",
|
||||
+ PIPELINE_ERROR_DECODE,
|
||||
+ PIPELINE_ERROR_DECODE);
|
||||
FFMPEG_TEST_CASE(Cr110849,
|
||||
"security/110849.mkv",
|
||||
DEMUXER_ERROR_COULD_NOT_OPEN,
|
||||
@@ -154,7 +154,10 @@ FFMPEG_TEST_CASE(Cr234630b,
|
||||
"security/234630b.mov",
|
||||
DEMUXER_ERROR_NO_SUPPORTED_STREAMS,
|
||||
DEMUXER_ERROR_NO_SUPPORTED_STREAMS);
|
||||
-FFMPEG_TEST_CASE(Cr242786, "security/242786.webm", PIPELINE_OK, PIPELINE_OK);
|
||||
+FFMPEG_TEST_CASE(Cr242786,
|
||||
+ "security/242786.webm",
|
||||
+ PIPELINE_OK,
|
||||
+ PIPELINE_ERROR_DECODE);
|
||||
// Test for out-of-bounds access with slightly corrupt file (detection logic
|
||||
// thinks it's a MONO file, but actually contains STEREO audio).
|
||||
FFMPEG_TEST_CASE(Cr275590,
|
||||
@@ -372,8 +375,8 @@ FFMPEG_TEST_CASE(WEBM_2,
|
||||
DEMUXER_ERROR_NO_SUPPORTED_STREAMS);
|
||||
FFMPEG_TEST_CASE(WEBM_4,
|
||||
"security/out.webm.68798.1929",
|
||||
- DECODER_ERROR_NOT_SUPPORTED,
|
||||
- DECODER_ERROR_NOT_SUPPORTED);
|
||||
+ PIPELINE_OK,
|
||||
+ PIPELINE_OK);
|
||||
FFMPEG_TEST_CASE(WEBM_5, "frame_size_change.webm", PIPELINE_OK, PIPELINE_OK);
|
||||
|
||||
// General MKV test cases.
|
||||
diff --git a/media/filters/audio_decoder_unittest.cc b/media/filters/audio_decoder_unittest.cc
|
||||
index a31823cfe3b58..e43f408b79e5c 100644
|
||||
--- a/media/filters/audio_decoder_unittest.cc
|
||||
+++ b/media/filters/audio_decoder_unittest.cc
|
||||
@@ -484,7 +484,7 @@ constexpr TestParams kXheAacTestParams[] = {
|
||||
}},
|
||||
0,
|
||||
29400,
|
||||
- CHANNEL_LAYOUT_MONO,
|
||||
+ CHANNEL_LAYOUT_UNSUPPORTED,
|
||||
AudioCodecProfile::kXHE_AAC},
|
||||
#endif
|
||||
{AudioCodec::kAAC,
|
||||
diff --git a/media/filters/audio_file_reader_unittest.cc b/media/filters/audio_file_reader_unittest.cc
|
||||
index c0cc568d63019..edf9470f2f8b3 100644
|
||||
--- a/media/filters/audio_file_reader_unittest.cc
|
||||
+++ b/media/filters/audio_file_reader_unittest.cc
|
||||
@@ -62,15 +62,14 @@ class AudioFileReaderTest : public testing::Test {
|
||||
// Verify packets are consistent across demuxer runs. Reads the first few
|
||||
// packets and then seeks back to the start timestamp and verifies that the
|
||||
// hashes match on the packets just read.
|
||||
- void VerifyPackets() {
|
||||
- const int kReads = 3;
|
||||
+ void VerifyPackets(int packet_reads) {
|
||||
const int kTestPasses = 2;
|
||||
|
||||
AVPacket packet;
|
||||
base::TimeDelta start_timestamp;
|
||||
std::vector<std::string> packet_md5_hashes_;
|
||||
for (int i = 0; i < kTestPasses; ++i) {
|
||||
- for (int j = 0; j < kReads; ++j) {
|
||||
+ for (int j = 0; j < packet_reads; ++j) {
|
||||
ASSERT_TRUE(reader_->ReadPacketForTesting(&packet));
|
||||
|
||||
// On the first pass save the MD5 hash of each packet, on subsequent
|
||||
@@ -99,7 +98,8 @@ class AudioFileReaderTest : public testing::Test {
|
||||
int sample_rate,
|
||||
base::TimeDelta duration,
|
||||
int frames,
|
||||
- int expected_frames) {
|
||||
+ int expected_frames,
|
||||
+ int packet_reads = 3) {
|
||||
Initialize(fn);
|
||||
ASSERT_TRUE(reader_->Open());
|
||||
EXPECT_EQ(channels, reader_->channels());
|
||||
@@ -113,7 +113,7 @@ class AudioFileReaderTest : public testing::Test {
|
||||
EXPECT_EQ(reader_->HasKnownDuration(), false);
|
||||
}
|
||||
if (!packet_verification_disabled_)
|
||||
- ASSERT_NO_FATAL_FAILURE(VerifyPackets());
|
||||
+ ASSERT_NO_FATAL_FAILURE(VerifyPackets(packet_reads));
|
||||
ReadAndVerify(hash, expected_frames);
|
||||
}
|
||||
|
||||
@@ -220,7 +220,7 @@ TEST_F(AudioFileReaderTest, AAC_ADTS) {
|
||||
}
|
||||
|
||||
TEST_F(AudioFileReaderTest, MidStreamConfigChangesFail) {
|
||||
- RunTestFailingDecode("midstream_config_change.mp3", 42624);
|
||||
+ RunTestFailingDecode("midstream_config_change.mp3", 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -230,7 +230,7 @@ TEST_F(AudioFileReaderTest, VorbisInvalidChannelLayout) {
|
||||
|
||||
TEST_F(AudioFileReaderTest, WaveValidFourChannelLayout) {
|
||||
RunTest("4ch.wav", "131.71,38.02,130.31,44.89,135.98,42.52,", 4, 44100,
|
||||
- base::Microseconds(100001), 4411, 4410);
|
||||
+ base::Microseconds(100001), 4411, 4410, /*packet_reads=*/2);
|
||||
}
|
||||
|
||||
TEST_F(AudioFileReaderTest, ReadPartialMP3) {
|
||||
diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc
|
||||
index 8a658a58caac5..9d6ed8aeb5c48 100644
|
||||
--- a/media/filters/ffmpeg_video_decoder.cc
|
||||
+++ b/media/filters/ffmpeg_video_decoder.cc
|
||||
@@ -213,10 +213,6 @@ int FFmpegVideoDecoder::GetVideoBuffer(struct AVCodecContext* codec_context,
|
||||
frame->linesize[plane] = layout->planes()[plane].stride;
|
||||
}
|
||||
|
||||
- // This seems unsafe, given threaded decoding. However, `reordered_opaque` is
|
||||
- // also going away upstream, so we need a whole new mechanism either way.
|
||||
- frame->reordered_opaque = codec_context->reordered_opaque;
|
||||
-
|
||||
// This will be freed by `ReleaseVideoBufferImpl`.
|
||||
auto* opaque = new OpaqueData(fb_priv, frame_pool_, data, allocation_size,
|
||||
std::move(*layout));
|
||||
diff --git a/media/filters/audio_file_reader.cc b/media/filters/audio_file_reader.cc
|
||||
index e1be5aa9a5b13..951c003956fb5 100644
|
||||
--- a/media/filters/audio_file_reader.cc
|
||||
+++ b/media/filters/audio_file_reader.cc
|
||||
@@ -243,18 +243,10 @@ bool AudioFileReader::OnNewFrame(
|
||||
// silence from being output. In the case where we are also discarding some
|
||||
// portion of the packet (as indicated by a negative pts), we further want to
|
||||
// adjust the duration downward by however much exists before zero.
|
||||
-#if BUILDFLAG(USE_SYSTEM_FFMPEG)
|
||||
- if (audio_codec_ == AudioCodec::kAAC && frame->pkt_duration) {
|
||||
-#else
|
||||
if (audio_codec_ == AudioCodec::kAAC && frame->duration) {
|
||||
-#endif // BUILDFLAG(USE_SYSTEM_FFMPEG)
|
||||
const base::TimeDelta pkt_duration = ConvertFromTimeBase(
|
||||
glue_->format_context()->streams[stream_index_]->time_base,
|
||||
-#if BUILDFLAG(USE_SYSTEM_FFMPEG)
|
||||
- frame->pkt_duration + std::min(static_cast<int64_t>(0), frame->pts));
|
||||
-#else
|
||||
frame->duration + std::min(static_cast<int64_t>(0), frame->pts));
|
||||
-#endif // BUILDFLAG(USE_SYSTEM_FFMPEG)
|
||||
const base::TimeDelta frame_duration =
|
||||
base::Seconds(frames_read / static_cast<double>(sample_rate_));
|
||||
|
||||
diff --git a/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc b/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc
|
||||
index c6446c2..805b95b 100644
|
||||
--- a/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc
|
||||
+++ b/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc
|
||||
@@ -233,7 +233,6 @@
|
||||
int total_size = y_size + 2 * uv_size;
|
||||
|
||||
av_frame->format = context->pix_fmt;
|
||||
- av_frame->reordered_opaque = context->reordered_opaque;
|
||||
|
||||
// Create a VideoFrame object, to keep a reference to the buffer.
|
||||
// TODO(nisse): The VideoFrame's timestamp and rotation info is not used.
|
||||
@@ -381,8 +380,6 @@
|
||||
return WEBRTC_VIDEO_CODEC_ERROR;
|
||||
}
|
||||
packet->size = static_cast<int>(input_image.size());
|
||||
- int64_t frame_timestamp_us = input_image.ntp_time_ms_ * 1000; // ms -> μs
|
||||
- av_context_->reordered_opaque = frame_timestamp_us;
|
||||
|
||||
int result = avcodec_send_packet(av_context_.get(), packet.get());
|
||||
|
||||
@@ -399,10 +396,6 @@
|
||||
return WEBRTC_VIDEO_CODEC_ERROR;
|
||||
}
|
||||
|
||||
- // We don't expect reordering. Decoded frame timestamp should match
|
||||
- // the input one.
|
||||
- RTC_DCHECK_EQ(av_frame_->reordered_opaque, frame_timestamp_us);
|
||||
-
|
||||
// TODO(sakal): Maybe it is possible to get QP directly from FFmpeg.
|
||||
h264_bitstream_parser_.ParseBitstream(input_image);
|
||||
absl::optional<int> qp = h264_bitstream_parser_.GetLastSliceQp();
|
|
@ -32,7 +32,7 @@ cd $(dirname $0) ; CWD=$(pwd)
|
|||
|
||||
PKGNAM=qt6
|
||||
VERSION=$(ls qt-*.tar.?z | rev | cut -f 3- -d . | cut -f 1 -d - | rev)
|
||||
BUILD=${BUILD:-4}
|
||||
BUILD=${BUILD:-1}
|
||||
PKGSRC=$(echo $VERSION | cut -d - -f 1)
|
||||
PKGVER=$(echo $VERSION | tr - _)
|
||||
|
||||
|
@ -153,20 +153,9 @@ pushd qtwebengine
|
|||
cat $CWD/patches/qtwebengine-6.7.0-displaykey-header.patch | patch -p1 --verbose || exit 1
|
||||
popd
|
||||
|
||||
# Fix build with ffmpeg-7:
|
||||
pushd qtwebengine/src/3rdparty/chromium
|
||||
cat $CWD/patches/qtwebengine-ffmpeg-7.patch | patch -p1 --verbose || exit 1
|
||||
popd
|
||||
|
||||
# Fix build with llvm19:
|
||||
pushd qttools
|
||||
cat $CWD/patches/4a368a06afa5929d8674d2e94c2d7cbd6ad85d4e.patch | patch -p1 --verbose || exit 1
|
||||
cat $CWD/patches/687fc1601863ae7a67897bc3590b33bd3bdcc3bc.patch | patch -p1 --verbose || exit 1
|
||||
popd
|
||||
|
||||
# [PATCH] ListView: fix countChanged not being emitted in certain cases.
|
||||
# [PATCH] QQuickItemView: fix crash with zero-size SwipeView that uses Repeater
|
||||
pushd qtdeclarative
|
||||
cat $CWD/patches/0a1d8fb26d1e89c82a0d35dd728d7e928a94d197.patch | patch -p1 --verbose || exit 1
|
||||
cat $CWD/patches/861a7921ed7833a90f77b5fca436c789a4f9517c.patch | patch -p1 --verbose || exit 1
|
||||
popd
|
||||
|
||||
# Previously we didn't have a protobuf package in Slackware.
|
||||
|
@ -224,6 +213,8 @@ cmake -S $(pwd) -B build-${PKGNAM} \
|
|||
-DFEATURE_webengine_system_ffmpeg="${SYSTEM_FFMPEG}" \
|
||||
-DFEATURE_webengine_system_pulseaudio="${USE_PULSEAUDIO}" \
|
||||
-DFEATURE_webengine_webrtc_pipewire=ON \
|
||||
-DFEATURE_quick3dxr_openxr:BOOL=OFF \
|
||||
-DFEATURE_system_openxr:BOOL=OFF \
|
||||
$PROTOBUF \
|
||||
-DQT_BUILD_EXAMPLES=OFF || exit 1
|
||||
#cmake --build build-${PKGNAM} --parallel $NINJAJOBS || cmake --build build-${PKGNAM} || exit 1
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#!/bin/csh
|
||||
# Print a fortune cookie for login shells:
|
||||
|
||||
if ( { tty --silent } ) then >& /dev/null
|
||||
# Only output a fortune if $HOME/.hushlogin does not exist,
|
||||
# and this is an interactive shell:
|
||||
if ( ( ! -e $HOME/.hushlogin ) && { tty --silent } ) then >& /dev/null
|
||||
echo "" ; fortune fortunes fortunes2 linuxcookie ; echo ""
|
||||
endif
|
||||
|
|
|
@ -1,11 +1,14 @@
|
|||
#!/bin/sh
|
||||
# Print a fortune cookie for interactive shells:
|
||||
|
||||
case $- in
|
||||
*i* ) # We're interactive
|
||||
echo
|
||||
fortune fortunes fortunes2 linuxcookie
|
||||
echo
|
||||
;;
|
||||
esac
|
||||
# Print a fortune cookie for login shells:
|
||||
|
||||
# Only output a fortune if $HOME/.hushlogin does not exist:
|
||||
if [ ! -e $HOME/.hushlogin ]; then
|
||||
# Only output a fortune on interactive shells:
|
||||
case $- in
|
||||
*i* ) # We're interactive
|
||||
echo
|
||||
fortune fortunes fortunes2 linuxcookie
|
||||
echo
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
|
|
@ -24,12 +24,12 @@ cd $(dirname $0) ; CWD=$(pwd)
|
|||
|
||||
PKGNAM=bsd-games
|
||||
VERSION=${VERSION:-2.17}
|
||||
BUILD=${BUILD:-5}
|
||||
BUILD=${BUILD:-6}
|
||||
|
||||
# Automatically determine the architecture we're building on:
|
||||
if [ -z "$ARCH" ]; then
|
||||
case "$( uname -m )" in
|
||||
i?86) export ARCH=i586 ;;
|
||||
i?86) export ARCH=i686 ;;
|
||||
arm*) export ARCH=arm ;;
|
||||
# Unless $ARCH is already set, use uname -m for all other archs:
|
||||
*) export ARCH=$( uname -m ) ;;
|
||||
|
|
Loading…
Reference in a new issue