Есть кусок кода, взятый отсюда:
bool QVideoFrame::map(QAbstractVideoBuffer::MapMode mode)
{
if (d->buffer != 0 && d->data == 0) {
Q_ASSERT(d->bytesPerLine == 0);
Q_ASSERT(d->mappedBytes == 0);
// Вот здесь программа, запущенная на телефоне, перестает отвечать
d->data = d->buffer->map(mode, &d->mappedBytes, &d->bytesPerLine);
return d->data != 0;
}
return false;
}
bool QVideoFrame::map(QAbstractVideoBuffer::MapMode mode)
{
if (d->buffer != 0 && d->data == 0) {
Q_ASSERT(d->bytesPerLine == 0);
Q_ASSERT(d->mappedBytes == 0);
// Отладка показала, что в d->buffer хранится именно QImageVideoBuffer
QImageVideoBuffer *ivb = dynamic_cast<QImageVideoBuffer*>(d->buffer);
if (ivb) {
// а тут уже вызов проходит гладко
d->data = ivb->map(mode, &d->mappedBytes, &d->bytesPerLine);
}
qDebug() << d->buffer << &(*d->buffer); // 0x62aab0 0x62aab0
qDebug() << typeid(*d->buffer).name(); // приложение зависает
return d->data != 0;
}
return false;
}
Адрес в d->buffer не меняется, то есть тот же, что и здесь:
QVideoFrame::QVideoFrame(const QImage &image)
: d(new QVideoFramePrivate(
image.size(), pixelFormatFromImageFormat(image.format())))
{
if (d->pixelFormat != Format_Invalid) {
d->buffer = new QImageVideoBuffer(image);
qDebug() << d->buffer << typeid(*d->buffer).name(); // 0x62aab0 17QImageVideoBuffer
}
}
Кто может объяснить мне такое поведение?