ad-vega / qarv Goto Github PK
View Code? Open in Web Editor NEWA Qt-based GUI and library interface for ethernet cameras using the Aravis library.
License: GNU General Public License v3.0
A Qt-based GUI and library interface for ethernet cameras using the Aravis library.
License: GNU General Public License v3.0
qarv did not start on GitHub and the first releases were made by the make_release
script, which made tarballs. GitHub allow releases to be made easily with git tags. CMake should be convinced to extract version from the latest tag as well; I like what the setuptools_scm
plugin does for Python packages. The git tags use semantic versioning, so the API and ABI versions are in there, too.
-- Looking for av_pix_fmt_desc_get
-- Looking for av_pix_fmt_desc_get - not found
It seems to belong to libavutils but devel files and libs are on the system.
Or so it seems.
Cheers
E
Hi,
I've tried to build qarv, but compilation failed:
PKG_CONFIG_PATH=/home/pacaud/Sources/INSTALL-aravis/lib/pkgconfig/ cmake .
-- The C compiler identification is GNU 6.2.1
-- The CXX compiler identification is GNU 6.2.1
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
Program version not specified, using git description.
QArv version: '1241f23'
-- Looking for Q_WS_X11
-- Looking for Q_WS_X11 - found
-- Looking for Q_WS_WIN
-- Looking for Q_WS_WIN - not found
-- Looking for Q_WS_QWS
-- Looking for Q_WS_QWS - not found
-- Looking for Q_WS_MAC
-- Looking for Q_WS_MAC - not found
-- Found Qt4: /usr/bin/qmake-qt4 (found version "4.8.7")
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29")
-- Checking for one of the modules 'aravis-0.4;aravis-0.2'
-- Checking for module 'gio-2.0'
-- Found gio-2.0, version 2.48.2
-- Checking for module 'libswscale'
-- Found libswscale, version 4.0.100
-- Checking for module 'libavcodec'
-- Found libavcodec, version 57.24.102
-- Checking for module 'libavutil'
-- Found libavutil, version 55.17.103
-- Looking for av_pix_fmt_desc_get
-- Looking for av_pix_fmt_desc_get - found
-- Found Doxygen: /usr/bin/doxygen (found version "1.8.11")
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pacaud/Sources/qarv
[pacaud@lappc-p620 qarv (master %)]$ LANG=C make
[ 1%] Generating qarv_sl.qm
Updating '/home/pacaud/Sources/qarv/qarv_sl.qm'...
Generated 189 translation(s) (189 finished and 0 unfinished)
[ 2%] Generating src/filters/moc_levels.cxx
[ 3%] Generating ui_levels.h
[ 4%] Generating src/recorders/moc_rawrecorders.cxx
[ 6%] Generating src/recorders/moc_gstrecorders.cxx
[ 7%] Generating src/recorders/moc_imagerecorder.cxx
[ 8%] Generating src/decoders/moc_mono12packed.cxx
[ 9%] Generating src/decoders/moc_monounpackeddecoders.cxx
[ 10%] Generating src/decoders/moc_bayer.cxx
[ 12%] Generating src/moc_glvideowidget.cxx
[ 13%] Generating src/moc_glhistogramwidget.cxx
[ 14%] Generating src/moc_qarvmainwindow.cxx
[ 15%] Generating src/moc_roicombobox.cxx
[ 17%] Generating src/moc_globals.cxx
[ 18%] Generating src/moc_workthread.cxx
[ 19%] Generating src/api/moc_qarvtype.cxx
[ 20%] Generating src/api/moc_qarvgui.cxx
[ 21%] Generating src/api/moc_qarvcamera.cxx
[ 23%] Generating src/api/moc_qarvcameradelegate.cxx
[ 24%] Generating src/filters/moc_filter.cxx
[ 25%] Generating ui_mainwindow.h
[ 26%] Generating qrc_icons.cxx
Scanning dependencies of target qarv-2
[ 28%] Building CXX object CMakeFiles/qarv-2.dir/src/filters/moc_levels.cxx.o
[ 29%] Building CXX object CMakeFiles/qarv-2.dir/src/filters/levels.cpp.o
[ 30%] Building CXX object CMakeFiles/qarv-2.dir/src/recorders/moc_rawrecorders.cxx.o
In file included from /home/pacaud/Sources/qarv/src/recorders/recorder.h:23:0,
from /home/pacaud/Sources/qarv/src/recorders/rawrecorders.h:23,
from /home/pacaud/Sources/qarv/src/recorders/moc_rawrecorders.cxx:9:
/home/pacaud/Sources/qarv/src/api/qarvdecoder.h:101:47: error: use of enum 'PixelFormat' without previous declaration
static QArvDecoder* makeSwScaleDecoder(enum PixelFormat fmt,
^~~~~~~~~~~
CMakeFiles/qarv-2.dir/build.make:219: recipe for target 'CMakeFiles/qarv-2.dir/src/recorders/moc_rawrecorders.cxx.o' failed
make[2]: *** [CMakeFiles/qarv-2.dir/src/recorders/moc_rawrecorders.cxx.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/qarv-2.dir/all' failed
make[1]: *** [CMakeFiles/qarv-2.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2
I'm trying out qarv with a Basler acA1920-155uc and experiencing the following issues when recording:
All of these issues have been noticed with a AOI of 1920x200.
First when rotating the image from the transform menu and recording, the result looks something like when the x y axis are incorrectly rotated, or the other axis is rotated twice, as a result the image looks scrambled.
Second, when recording with the AOI=1920x200, the recorded image starts rolling over on itself like this:
It seems to do this periodically at a set interval of a few hundred ms. By recording 10s @ 500fps (actual closer to <100fps (probably because of hardware limitations), the image rolls over about 20% of the height of the recorded AOI.
In both cases the picture in the preview in qarv looks like it should according to the settings.
As before, I am using a Basler acA1920-155uc camera, which by design is able to record 1920x1200 @ 155fps. By reducing the AOI, the camera can go up to thousands of fps. Currently it seems qarv can go to 999fps and qrv_player can play up to 99fps. I don't see a reason for these limitations, since most manufacturer SDK players don't have them either.
Aravis keeps adding GError
parameters to their functions. I keep inserting nullptr
😁 . We should instead print some diagnostics if these functions fail. Emmanuel was kind enough to provide instructions.
/usr/include/c++/10.2.0/type_traits:2624:3: error: template with C linkage
657 | template<typename>
| ^~~~~~~~
In file included from./qarv/src/qarvfeaturetree.cpp:20:
./qarv/src/qarvfeaturetree.h:23:1: note: ‘extern "C"’ linkage started here
23 | extern "C" {
| ^~~~~~~~~~
In file included from /usr/include/glib-2.0/glib/gatomic.h:31,
from /usr/include/glib-2.0/glib/gthread.h:32,
from /usr/include/glib-2.0/glib/gasyncqueue.h:32,
from /usr/include/glib-2.0/glib.h:32,
from /usr/include/glib-2.0/gobject/gbinding.h:28,
from /usr/include/glib-2.0/glib-object.h:22,
from /usr/include/aravis-0.8/arvenums.h:30,
from /usr/include/aravis-0.8/arvtypes.h:30,
from /usr/include/aravis-0.8/arv.h:28,
from ./qarv/src/qarvfeaturetree.h:24,
from ./qarv/src/qarvfeaturetree.cpp:20:
moving #include <arv.h> out of the extern "C" block resolves this issue, but it really should not be nesscary.
I have breafly examined arv.h and qarv code and cant seam to find why this would happen as arv.h is a pure c header and i dont see how type_traits ends up included here
Aravis has gained new pixel formats. We need to add decoders etc. Also check whether defined numbers have changed because it's important for .qarv files.
Hi,
when building QArv with the Aravis from master branch I get this error:
I am using Ubuntu 18.04
Has anyone gotten this to work on OSX 11? I get to the cmake .. step. Anybody have any idea?
(base) suneberg@Robobook build % cmake ..
Program version not specified, using git description.
QArv version: '4466049'
-- Checking for one of the modules 'aravis-0.8;aravis-0.6;aravis-0.4;aravis-0.2;aravis'
CMake Error at /usr/local/Cellar/cmake/3.20.3/share/cmake/Modules/FindPkgConfig.cmake:843 (message):
None of the required 'aravis-0.8;aravis-0.6;aravis-0.4;aravis-0.2;aravis'
found
Call Stack (most recent call first):
CMakeLists.txt:46 (pkg_search_module)
-- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
-- Configuring incomplete, errors occurred!
See also "/Users/suneberg/Git/qarv/build/CMakeFiles/CMakeOutput.log".
See also "/Users/suneberg/Git/qarv/build/CMakeFiles/CMakeError.log".
From CmakeError.log:
Compiling the C compiler identification source file "CMakeCCompilerId.c" failed.
Compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
Build flags:
Id flags:
The output was:
1
ld: library not found for -lSystem
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" failed.
Compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
Build flags:
Id flags:
The output was:
1
ld: library not found for -lc++
clang: error: linker command failed with exit code 1 (use -v to see invocation)
First of all, thank you for the great program! I already got it compiled and working nicely using Qt4 on Ubuntu 16.04.3.. However when building with Qt5 and making a Debian package with Checkinstall, I'm unable to launch qarv or qarv_videoplayer and instead just get the following:
qarv: error while loading shared libraries: libqarv-3.so.3: cannot open shared object file: No such file or directory
Here is the installation log where the libqarv-3.so.3 is installed:
k@X220:~/Basler/qarv/qarv-qt5/build$ sudo make install
[ 89%] Built target qarv-3
[ 98%] Built target qarv_videoplayer
[100%] Built target qarvexe
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/lib/libqarv-3.so.3
-- Set runtime path of "/usr/local/lib/libqarv-3.so.3" to ""
-- Installing: /usr/local/lib/libqarv-3.so
-- Installing: /usr/local/bin/qarv
-- Set runtime path of "/usr/local/bin/qarv" to ""
-- Installing: /usr/local/bin/qarv_videoplayer
-- Set runtime path of "/usr/local/bin/qarv_videoplayer" to ""
-- Installing: /usr/local/include/qarv-3/qarvcamera.h
-- Installing: /usr/local/include/qarv-3/qarvcameradelegate.h
-- Installing: /usr/local/include/qarv-3/qarvgui.h
-- Installing: /usr/local/include/qarv-3/qarvdecoder.h
-- Installing: /usr/local/include/qarv-3/qarvrecordedvideo.h
-- Installing: /usr/local/include/qarv-3/qarvtype.h
-- Installing: /usr/local/share/qarv/3/qarv_sl.qm
-- Installing: /usr/local/share/qarv/3/qarv_cs.qm
-- Installing: /usr/local/share/qarv/3/document-open.svgz
-- Installing: /usr/local/share/qarv/3/document-save.svgz
-- Installing: /usr/local/share/qarv/3/edit-clear.svgz
-- Installing: /usr/local/share/qarv/3/media-playback-start.svgz
-- Installing: /usr/local/share/qarv/3/media-record.svgz
-- Installing: /usr/local/share/qarv/3/video-display.svgz
-- Installing: /usr/local/share/qarv/3/view-refresh.svgz
-- Installing: /usr/local/share/qarv/3/zoom-original.svgz
-- Installing: /usr/local/share/qarv/3/office-chart-bar.svgz
-- Installing: /usr/local/share/qarv/3/view-object-histogram-linear.svgz
-- Installing: /usr/local/share/qarv/3/view-object-histogram-logarithmic.svgz
-- Installing: /usr/local/share/qarv/3/edit-clear-locationbar-rtl.svgz
-- Installing: /usr/local/share/qarv/3/edit-select.svgz
-- Installing: /usr/local/share/qarv/3/media-playback-stop.svgz
-- Installing: /usr/local/share/qarv/3/media-playback-pause.svgz
-- Installing: /usr/local/share/qarv/3/dialog-information.svgz
-- Installing: /usr/local/share/qarv/3/go-first.svgz
-- Installing: /usr/local/share/qarv/3/go-last.svgz
-- Installing: /usr/local/share/icons/application-x-qarv.svgz
-- Installing: /usr/local/share/applications/qarv.desktop
-- Installing: /usr/local/share/applications/qarv-player.desktop
-- Installing: /usr/local/share/mime/packages/qarv.xml
-- Installing: /usr/local/lib/pkgconfig/qarv-3.pc
Qarv also works when run manually from build -folder.
Any idea what I am potentially doing wrong?
When qarv was first written, gstreamer-0.10 was used in Qt. Because gstreamer does not support linking to multiple versions of the library, we could not make use of gstreamer-1.0 which had features that we wanted (although I can't remeber what they were after all this time). So we went our own way. Things are different now and we could probably make our lives easier by ditching the Q_SIGNAL based transport and custom widgets. Or not, it remains to be seen, but we should definitely check it out. In any case, it would be nice not to call into ffmpeg directly as it changes API rather often. It would also be nice if qarv could be used as a gstreamer source, or maybe a control panel for gstaravis.
Currently at least on Ubuntu it is not possible to open raw video files from file manager with "open with" and qarv_videoplayer being the target.
Does anyone know of better players for Linux that can play the raw files or TIFFs as video? I'm looking for a program that has similar functionality to any video editor program, where frames can easily be skipped with keyboard hotkeys.
These features would also be nice for qarv_player, along with the possibility of using a similar structure (or even code) as with VLC, where space bar works as play/pause etc..
For simplicity, QArv always used contiguous cv::Mat
. This reduces performance of swscale decoder. Consider lifting this limitation. Most of the code should not really depend on this IIRC, but this needs to be checked and tested.
compiling fails with the error " ‘endl’ is not a member of ‘Qt’ "
i can get over this by replacing all Qt::endl with "\n".
on Ubuntu 20.04.1 I had to manually add libilmbase12_2.2.0-11ubuntu2_amd64.deb and libopenexr22_2.2.0-10ubuntu2_amd64.deb to run the program.
Also after install the library libqarv-3.so.3 needs to be moved to a library-folder before starting the program.
Hello! First of all, thanks for your work on this!
I was trying to run qarv over X11 forwarding, however, the window shows up entirely black and this message keeps repeating on the console:
composeAndFlush: makeCurrent() failed
Do you have any idea what could be happening here? I do not find anything useful on the internet. I am using Solus with all the qt5 packages updated and aravis 0.6.
Thanks!
I started a Qt project from scratch so I could test the API. Right at the first build time, compiler said it couldn't find gio/gio.h. After researching a little, I found out this is related to glib headers, so I included its paths on the .pro file:
INCLUDEPATH += "/usr/include/glib-2.0/" INCLUDEPATH += "/usr/lib/x86_64-linux-gnu/glib-2.0/include"
Now the compiler is accusing the following errors in gdbusintrospection.h:
/usr/include/glib-2.0/gio/gdbusintrospection.h:155: error: expected unqualified-id before ‘public’
GDBusSignalInfo **signals;
^
/usr/include/glib-2.0/gio/gdbusintrospection.h:155: error: expected ‘;’ at end of member declaration
GDBusSignalInfo **signals;
^
/usr/include/glib-2.0/gio/gdbusintrospection.h:155: error: expected ‘:’ before ‘;’ token
GDBusSignalInfo **signals;
^
I'm using Qt 5.9.5 at Ubuntu 18.04.
When using a build of 'qarv' from the master branch and the libraries from the latest Aravis 0.5.12 release, within seconds after starting 'qarv' the application receives a segmentation fault with the following stack trace from gdb:
(qarv:22647): Aravis-CRITICAL **: 14:51:15.793: arv_get_fake_camera_genicam_xml: assertion 'genicam_file != NULL' failed
(qarv:22647): Aravis-CRITICAL **: 14:51:15.793: arv_get_fake_camera_genicam_xml: assertion 'genicam_file != NULL' failed
(qarv:22647): Aravis-CRITICAL **: 14:51:15.793: arv_dom_document_new_from_memory: assertion 'buffer != NULL' failed
(qarv:22647): Aravis-CRITICAL **: 14:51:15.793: arv_device_get_feature: assertion 'ARV_IS_GC (genicam)' failed
(qarv:22647): Aravis-CRITICAL **: 14:51:15.793: arv_device_get_feature: assertion 'ARV_IS_GC (genicam)' failed
(qarv:22647): Aravis-CRITICAL **: 14:51:15.793: arv_device_get_feature: assertion 'ARV_IS_GC (genicam)' failed
(qarv:22647): Aravis-CRITICAL **: 14:51:15.793: arv_device_get_feature: assertion 'ARV_IS_GC (genicam)' failed
(qarv:22647): Aravis-CRITICAL **: 14:51:15.793: arv_device_get_feature: assertion 'ARV_IS_GC (genicam)' failed
(qarv:22647): Aravis-CRITICAL **: 14:51:15.793: arv_device_get_feature: assertion 'ARV_IS_GC (genicam)' failed
(qarv:22647): Aravis-CRITICAL **: 14:51:15.794: arv_device_get_feature: assertion 'ARV_IS_GC (genicam)' failed
(qarv:22647): Aravis-CRITICAL **: 14:51:15.794: arv_device_get_feature: assertion 'ARV_IS_GC (genicam)' failed
Thread 1 "qarv" received signal SIGSEGV, Segmentation fault.
__strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:62
62 ../sysdeps/x86_64/multiarch/strlen-avx2.S: No such file or directory.
(gdb) where
#0 0x00007ffff5cd05a1 in __strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:62
#1 0x00007ffff5bdf9ae in __GI___strdup (s=0x0) at strdup.c:41
#2 0x00007ffff698c8e0 in QArvCameraId::QArvCameraId(char const*, char const*, char const*) () at /home/mike/Development/aravis/qarv/qarv/build/libqarv-2.so.2
#3 0x00007ffff69914ca in QArvCamera::listCameras() () at /home/mike/Development/aravis/qarv/qarv/build/libqarv-2.so.2
#4 0x00007ffff6965b7c in QArv::QArvMainWindow::on_refreshCamerasButton_clicked(bool) () at /home/mike/Development/aravis/qarv/qarv/build/libqarv-2.so.2
#5 0x00007ffff6999a5e in QArv::QArvMainWindow::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) ()
at /home/mike/Development/aravis/qarv/qarv/build/libqarv-2.so.2
#6 0x00007ffff6d8cf70 in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) () at /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#7 0x00007ffff6d977da in () at /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#8 0x00007ffff6d92be3 in QObject::event(QEvent*) () at /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#9 0x00007ffff72a503c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#10 0x00007ffff72abf76 in QApplication::notify(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#11 0x00007ffff6d788ad in QCoreApplication::notifyInternal(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#12 0x00007ffff6dab6e0 in () at /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#13 0x00007ffff6da8851 in () at /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#14 0x00007ffff51fb287 in g_main_context_dispatch () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#15 0x00007ffff51fb4c0 in () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#16 0x00007ffff51fb54c in g_main_context_iteration () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#17 0x00007ffff6da920e in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#18 0x00007ffff7352666 in () at /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#19 0x00007ffff6d7712f in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#20 0x00007ffff6d77495 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#21 0x00007ffff6d7d459 in QCoreApplication::exec() () at /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#22 0x00005555555569d8 in main ()
I haven't yet had time to figure out how to use cmake to create a debug build to investigate further, but I assume there is a problem with a string being passed into the QArvCameraId::QArvCameraId() object constructor.
If I figure out the issue, I'll post back a fix.
This checkbox doesn't currently work properly: even when unchecked, the file is created, but it doesn't contain all the data. The use case of making raw video files without the information file is questionable, so this checkbox should be removed. The info file should always be created when raw video is recorded.
On some cameras (e.g. Basler acA1300-30gc) the camera features widget becomes excruciatingly slow when certain categories of features are opened. While the camera isn't that slow to respond, the number of queries that Qt's Model/View system sends is very large.
It may be that the QArvCamera
implementation of QAbstractItemModel
is suboptimal; further research is required. In that case, it may be possible to implement it more efficiently. If not, some kind of caching will be necessary.
I have everything working exactly as I would like. But when I add a second Teledyne Dalsa Genie Nano C4030 to my network (each camera is plugged into its own 1 GigE NIC), it will successfully recognize that there are 3 cameras (1 Fake, 2 Nano's). But when it loops through to assign the model and vendor, it fills in "" for the model and vendor on the new camera. Although, the camid will show the entire name, including the serial number (which is the only difference between the cameras...same firmware, same vendor, same model...but different serial number). But it errors out when checking if it is a camera.
If I use either camera alone, it's fine. If I reverse which nics they are plugged into, but only add 1 of them at a time, it works fine. It just seems to have an issue with both of them connected at the same time. I am currently stepping through the program to see if I can figure out what's going on.
Any ideas?
It would be good to enable more compiler warnings and fix reported issues. Examples: override
keyword, deprecations, inconsistent class
/struct
declarations, switch statements, etc.
We've been putting off porting to Qt5 for far too long on the "it works" basis. Recently, Qt4 was masked in Gentoo and other distros are bound to go the same route sonner rather than later.
Once qarv builds and runs with Qt5, version 3 will be released.
I noticed that you did not mention windows but Aravis can be compile on windows,
this project is not compatible with windows?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.