Unable to detect QR codes via QZXingFilter on Ubuntu Touch
patrickjane opened this issue · 5 comments
Hi,
I am currently porting my (now working) SFOS app to Ubuntu Touch, and thus I also had to include qzxing in my project. I did it via cmake, like so:
set(QZXING_MULTIMEDIA "true")
set(QZXING_USE_QML "true")
add_subdirectory(submodules/qzxing/src)
add_definitions(-DQZXING_QML) // for the main project to register meta types
include_directories(submodules/qzxing/src) // for the main project to register meta types
target_link_libraries(${PROJECT_NAME} [.....] qzxing)
In QML I'm doing this:
{
[...]
Camera {
id: camera
focus {
focusMode: Camera.FocusContinuous
focusPointMode: Camera.FocusPointCenter
}
}
Rectangle {
width: parent.width * 0.8
height: parent.width * 0.8
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
color: "transparent"
VideoOutput {
id: videoOutput
anchors.fill: parent
source: camera
filters: [ videoFilter ]
autoOrientation: true
}
}
QZXingFilter {
id: videoFilter
decoder {
imageSourceFilter: QZXing.SourceFilter_ImageNormal
enabledDecoders: QZXing.DecoderFormat_QR_CODE
tryHarder: true
tryHarderType: QZXing.TryHarderBehaviour_Rotate | QZXing.TryHarderBehaviour_ThoroughScanning
onTagFound: {
if (popped)
return;
popped = true
pageStack.pop()
handleScannedCode(tag)
}
}
}
[...]
}
However detecting QR codes does not work. Instead I get the logs flooded with the following, as soon as the camera is activated (no matter where it is pointed to):
QZXingFilterRunnable: Buffer is empty
virtual uchar* AalGLTextureBuffer::map(QAbstractVideoBuffer::MapMode, int*, int*)
QVideoFrame::unmap() was called more times then QVideoFrame::map()
QZXingFilterRunnable: Buffer is empty
virtual uchar* AalGLTextureBuffer::map(QAbstractVideoBuffer::MapMode, int*, int*)
QVideoFrame::unmap() was called more times then QVideoFrame::map()
QZXingFilterRunnable: Buffer is empty
virtual uchar* AalGLTextureBuffer::map(QAbstractVideoBuffer::MapMode, int*, int*)
QVideoFrame::unmap() was called more times then QVideoFrame::map()
QZXingFilterRunnable: Buffer is empty
virtual uchar* AalGLTextureBuffer::map(QAbstractVideoBuffer::MapMode, int*, int*)
QVideoFrame::unmap() was called more times then QVideoFrame::map()
How can I make this work? QT version should be 5.12.
Hello @patrickjane
I have just merged #201 so i would suggest you pull the latest code and also add the following definitions to your cmake:
set(QZXING_USE_DECODER_QR_CODE "true")
Moreover, seeing the message QZXingFilterRunnable: Buffer is empty
i understant that the video filter is not receiving valid video frames. Could it be that you need to request a permission for the camera in Ubuntu Touch?
@ftylitak I have analyzed the issue further, see here and here.
However I am unable to get it to work with my limited OpenGL/video/image processing experience. The solution mentioned by dobey works, instead of using a video filter, it is possible to work with snapshot timers and manual image recognition (as done here).
I don't think its a camera permission issue.
I decided to continue working on this issue on the middleware-side of Ubuntu Touch, @patrickjane was correct in the assumption that GL needed to be used. The current state is here: https://gitlab.com/ubports/development/core/qtubuntu-camera/-/commit/4a551326f56e0b0d3debd3a1fe73d9c703dde42d
Now, I verified the image being mapped correctly by modifying QZXing to write a QImage right after memcpy'ing the contents into its own frame.
The remaining problem is the following output, with one application at least:
qml: This luminance source does not support rotation.
virtual uchar* AalGLTextureBuffer::map(QAbstractVideoBuffer::MapMode, int*, int*)
virtual void AalGLTextureBuffer::unmap()
Decoding phase 1: started
Decoding phase 1: failed: No code detected
Decoding phase 2, thorought scan: failed
Decoding phase 2, rotate: failed
Decoding failed: "This luminance source does not support rotation."
I made the app in question use QZXing 3.3, so I wonder what might be missing here.