intel / libyami-utils Goto Github PK
View Code? Open in Web Editor NEWLibyami Utilities
License: Apache License 2.0
Libyami Utilities
License: Apache License 2.0
Application (yamiencode) can call encode and force the request of a key frame. This way the component doesn't need to keep track of intraPeriod and the application can do it upon request.
using yamitranscode to encode vp8 tsvc, it quits with an assert error:
./yamitranscode -W 352 -H 288 -i akiyo_cif.yuv -t 2 -c VP8 -o test_temporal.ivf
libva info: VA-API version 1.1.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /home/imedia/SourceCode/intel-media/stack1/intel-vaapi-driver/src/.libs//i965_drv_video.so
libva info: Found init function vaDriverInit
libva info: va_openDriver() returns 0
yamitranscode: i965_encoder.c:1163: intel_encoder_check_vp8_parameter: Assertion `pic_param->ref_gf_frame != VA_INVALID_SURFACE' failed.
Aborted (core dumped)
my vaapi stack looks like this:
Celeron G3930 KabyLake
Ubuntu 18.04 64 Bit
and the latest masters from github:
intel-vaapi-driver (40b15a5c6c0103c23a5db810aef27cf75d0b6723)
libva (b3be72a5a110880f70626d7c3bed953cdde124b2)
libyami (49f32de0e537577927b98deb551e16a7fa89d892)
libyami-utils (ebcb87e)
I do think that this issue is actually related to intel-vaapi-driver and I wrote a pull request that is trying to resolve this issue and it also addresses a second issue which is caused by faulty reference buffer copies, when refresh_golden or refresh_alternate is set.
see pull request here: intel/intel-vaapi-driver#384
Likely copy and paste errors when creating libyami-utils from libyami.
The --enable-dmabuf
configure option enables the grid
example to be compiled. However, if also configured with --enable-avformat
, the grid example fails to compile.
In file included from ../tests/decodeinputavformat.cpp:20:0:
../tests/decodeinputavformat.h:22:34: fatal error: libavformat/avformat.h: No such file or directory
compilation terminated.
Makefile:710: recipe for target '../tests/grid-decodeinputavformat.o' failed
make[3]: *** [../tests/grid-decodeinputavformat.o] Error 1
make[3]: *** Waiting for unfinished jobs....
In file included from ../tests/decodeinput.cpp:28:0:
../tests/decodeinputavformat.h:22:34: fatal error: libavformat/avformat.h: No such file or directory
compilation terminated.
Makefile:696: recipe for target '../tests/grid-decodeinput.o' failed
make[3]: *** [../tests/grid-decodeinput.o] Error 1
The problem is that the makefile does not add LIBAVFORMAT
flags to the grid
compile target.
add transcoder latency information to yami-utils
When decoder output surface fourcc and resolution are same as encoder input surface, should disable scaling at run time. Right now it is disabled at compile time.
With --enable-avformat
, libyami-utils fails to compile using the Ubuntu Trusty provided libav*-dev packages. It compiles fine on Ubuntu Xenial (16.04) and Yakkety (16.10). Configure should detect the proper version of libav* required to compile.
../tests/decodeinputavformat.cpp:106:5: error: 'AV_CODEC_ID_H265' was not declared in this scope
AV_CODEC_ID_H265, YAMI_MIME_H265,
^
../tests/decodeinputavformat.cpp: In member function 'virtual bool DecodeInputAvFormat::getNextDecodeUnit(VideoDecodeBuffer&)':
../tests/decodeinputavformat.cpp:127:34: error: 'av_packet_unref' was not declared in this scope
av_packet_unref(&m_packet);
^
../tests/decodeinputavformat.cpp: In destructor 'virtual DecodeInputAvFormat::~DecodeInputAvFormat()':
../tests/decodeinputavformat.cpp:153:34: error: 'av_packet_unref' was not declared in this scope
av_packet_unref(&m_packet);
^
make[2]: *** [../tests/grid-decodeinputavformat.o] Error 1
make[2]: *** Waiting for unfinished jobs....
../tests/decodeinputavformat.cpp:106:5: error: 'AV_CODEC_ID_H265' was not declared in this scope
AV_CODEC_ID_H265, YAMI_MIME_H265,
^
../tests/decodeinputavformat.cpp: In member function 'virtual bool DecodeInputAvFormat::getNextDecodeUnit(VideoDecodeBuffer&)':
../tests/decodeinputavformat.cpp:127:34: error: 'av_packet_unref' was not declared in this scope
av_packet_unref(&m_packet);
^
../tests/decodeinputavformat.cpp: In destructor 'virtual DecodeInputAvFormat::~DecodeInputAvFormat()':
../tests/decodeinputavformat.cpp:153:34: error: 'av_packet_unref' was not declared in this scope
av_packet_unref(&m_packet);
^
make[2]: *** [../tests/decodeinputavformat.o] Error 1
Develop an example application that captures the VAAPI state and serializes it into an output file for later restore and playback. Develop an example application that can restore and playback the serialized VAAPI output.
This should be feasible by intercepting/wrapping calls into VAAPI where we can capture the surfaces, picture, buffers, config, context, etc. during a libyami decode session.
yamiencode -c HEVC -s P010 -W 3840 -H 2160 -i ./4K_3840x2160.P010 -o ./4K_3840_2160_rc0_ipb_gop30_fps30_qp50_lcu32.h265 --qp 50 --ipperiod 2 --intraperiod 30
libva info: VA-API version 0.40.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /opt/X11R7/lib/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_40
libva info: va_openDriver() returns 0
yamiencode: intel_bufmgr_gem.c:1405: drm_intel_gem_bo_unreference_locked_timed: Assertion `((&bo_gem->refcount)->atomic) > 0' failed.
./hevc_10bit_encoding_cqp.sh: line 101: 7850 Aborted (core dumped) yamiencode -c HEVC -s P010 -W $WIDTH -H $HEIGHT -i $media_streams_path/10bit/$filename -o ./$testname --qp $qp --ipperiod $ipb $gopsetting
main function on v4l2encoder and v4l2decoder require to return 0 when successful.
Hi guy,
I try to encode a surface created from prime fd(backed by drm_i915_gem_vgtbuffer).
But it seems to got an incorrect output by my code. It always display a green screen where i expect a
guest desktop snapshot.
Can you please give me some suggestions?
Here is part of my code:
external.pixel_format = VA_FOURCC_BGRX;
external.width = m_width;
external.height = m_height;
external.data_size = m_width * m_height * BPP / 8;
external.num_planes = 1;
external.pitches[0] = m_width; //can be obtained from vcreate FIXME
external.buffers = prime_fd; /* import from vgtbuffer*/
external.num_buffers = 1;
VASurfaceAttrib attribs[2];
attribs[0].flags = VA_SURFACE_ATTRIB_SETTABLE;
attribs[0].type = VASurfaceAttribMemoryType;
attribs[0].value.type = VAGenericValueTypeInteger;
attribs[0].value.value.i = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME;
attribs[1].flags = VA_SURFACE_ATTRIB_SETTABLE;
attribs[1].type = VASurfaceAttribExternalBufferDescriptor;
attribs[1].value.type = VAGenericValueTypePointer;
attribs[1].value.value.p = &external;
VAStatus vaStatus = vaCreateSurfaces(*(m_display.get()), VA_RT_FORMAT_RGB32, m_width, m_height, &surfaces, 1,attribs, sizeof(attribs)/sizeof(attribs[0]));
if (vaStatus != VA_STATUS_SUCCESS){
fprintf(stderr,"VA SURFACE CREATE FAILED!\n");
return -1;
}
return 0;
}
2. create a h264 encoder {
encoder = createVideoEncoder(YAMI_MIME_H264);
...
encoder->start()
}
3. doing encode {
VideoFrame frame;
frame.surface = surface; /* create by step 1 */
frame.fourcc = YAMI_FOURCC_RGBX;
encoder->encode(frame);
}
4. get the coded buffer {
output = EncodeOutput::create(outputfile,videoWidth,videoHeight,codec);
do{
status = encoder->getOutput(&outputBuffer,false);
if(status == ENCODE_SUCCESS
&& output->write(outputBuffer.data,outputBuffer.dataSize)){
printf("output data size:%d\n",outputBuffer.dataSize);
}
}while(status != ENCODE_BUFFER_NO_MORE);
}
vp9 encoder can use different schemes to use previous frames on the reference array. Schemes are defined by application that uses VA-API. It is up to the user to select which mode can be used.
Need basic coverage.
You changed the release names from version numbers back to libyami.
First - This is not Libyami
Second - You are breaking packagers who would like to include it.
Consistency is key
on Nov 3, 2017
libyami-1.3.0 …
configure.ac: bump to version 1.3.0
Signed-off-by: jkyu [email protected]
d9c62f6 zip tar.gz
Again - This is not LIBYAMI
Previous releases used just the version number.
Package builders were expecting version numbers for the tar balls.
Fix this please.
Sean
for basic build checks on pull requests
I do get pink artefacts when using vp8 temporal scaling (SVCT) with fast moving pictures in CBR and VBR mode.
Example "football (a)" from:
https://media.xiph.org/video/derf/
Command Line:
./yamitranscode -i ~/Videos/football_w720_h486_f360_fps30.yuv -W 720 -H 486 -o football_cbr700_svct3_upstream.ivf -c VP8 --btl0 700 --btl1 700 --intraperiod 32 --rcmode CBR -b 700 -t 3
I also tested this issue with scaled input video to match 16x16 or 64x64 raster (720x480 and 768x512) with the same result.
my explanation is something like this - intel-vaapi-driver is doing 1 pass encoding and the estimator for cbr/vbr bitrate usage runs out of useable bandwidth capacity.
This might be related to the fact that libyami VP8 SVCT implementation is using only last and golden references and not alternate frame references. This might influence the cbr/vbr calculation, but I can't confirm this information.
yamidecode produces segfault for any input stream since commit:
52fe395 - 2017-05-12 12:04:45 +0800 - wudping - vp8dec: enable svc-t decoding
Starting program: /opt/media/install/bin/yamidecode -i /opt/media/src/media_smoke/media_streams/decodebitstreams/JPEG_RefCompare/010309_0800_4680_nshs.jpg -m 0 -f I420
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff5c246ad in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
(gdb) bt full
#0 0x00007ffff5c246ad in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
No symbol table info available.
#1 0x00007ffff5c84529 in std::string::assign(std::string const&) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
No symbol table info available.
#2 0x00000000004056c9 in operator= (__str="./", this=0x7fffffffe070) at /usr/include/c++/4.8/bits/basic_string.h:547
No locals.
#3 processCmdLine (argc=7, argv=<optimized out>, parameters=parameters@entry=0x7fffffffe050) at decodehelp.cpp:144
option_index = 32767
long_opts = {{name = 0x414220 "help", has_arg = 0, flag = 0x0, val = 104}, {name = 0x414225 "capi", has_arg = 0, flag = 0x0, val = 0}, {name = 0x41422a "temporal-layer", has_arg = 1, flag = 0x0, val = 0}, {name = 0x0,
has_arg = 0, flag = 0x0, val = 0}}
opt = <optimized out>
isSetFourcc = true
outputFile = "./"
width = -8144
height = 32767
#4 0x0000000000404d41 in DecodeTest::init (this=this@entry=0x7fffffffe020, argc=<optimized out>, argv=<optimized out>) at decode.cpp:60
No locals.
#5 0x0000000000404180 in main (argc=<optimized out>, argv=<optimized out>) at decode.cpp:105
decode = {m_output = std::tr1::shared_ptr (empty) 0x0, m_nativeDisplay = std::tr1::shared_ptr (empty) 0x0, m_vppInput = std::tr1::shared_ptr (empty) 0x0, m_params = {
inputFile = 0x7fffffffe46d "/opt/media/src/media_smoke/media_streams/decodebitstreams/JPEG_RefCompare/010309_0800_4680_nshs.jpg", width = 0, height = 0, renderMode = 0, waitBeforeQuit = 1, renderFrames = 4294967295,
renderFourcc = 808596553, outputFile = <error reading variable: Cannot access memory at address 0xffffffffffffffe8>, useCAPI = false, temporalLayer = 0, spacialLayer = 0, qualityLayer = 0}}
I have only reproduced on Ubuntu Trusty.
Arbitrary initialized VideoDecodeBuffer in VppInputDecode::read can result in invalid AVC/HEVC decoding since libyami commit:
commit 83f9fa79c856cebf98ca9b0d6dfc0b0acba9f443
Author: XuGuangxin <[email protected]>
Date: Fri May 4 12:44:00 2018 +0800
h264, h265: add VIDEO_DECODE_BUFFER_FLAG_FRAME_END to inidicate frame end
unless we got AUD or SPS/PPS in stream, we can't know we have a frame.
but in up level, we may know we have entire frame. so we add a frame to
tell decoder about this
The arbitrary value can erroneously trigger VIDEO_DECODE_BUFFER_FLAG_FRAME_END in AVC/HEVC decoder, resulting in wrong decode output or decode errors.
When building libyami-utils with -Werror=deprecated-declarations, the build fails because AVStream::codec is considered deprecated in libav upstream.
Those problems are resolved by replacing the AVStream embedded codec
context with a newly added AVCodecParameters instance, which stores only
the stream parameters exported by the demuxers or read by the muxers.
https://listsMaking all in examples
make[2]: Entering directory '/home/seanvk/dev/github/libyami-utils/examples'
CXX simpleplayer.o
CXX ../tests/decodeinput.o
CXX ../tests/decodeinputavformat.o
../tests/decodeinputavformat.cpp: In member function ‘virtual bool DecodeInputAvFormat::initInput(const char*)’:
../tests/decodeinputavformat.cpp:44:55: error: ‘AVStream::codec’ is deprecated [-Werror=deprecated-declarations]
AVCodecContext* codec = m_format->streams[i]->codec;
^~~~~
In file included from ../tests/decodeinputavformat.h:22:0,
from ../tests/decodeinputavformat.cpp:20:
/opt/libva/master/include/libavformat/avformat.h:712:21: note: declared here
AVCodecContext *codec;
^~~~~
../tests/decodeinputavformat.cpp:44:55: error: ‘AVStream::codec’ is deprecated [-Werror=deprecated-declarations]
AVCodecContext* codec = m_format->streams[i]->codec;
^~~~~
In file included from ../tests/decodeinputavformat.h:22:0,
from ../tests/decodeinputavformat.cpp:20:
/opt/libva/master/include/libavformat/avformat.h:712:21: note: declared here
AVCodecContext *codec;
^~~~~
../tests/decodeinputavformat.cpp:44:55: error: ‘AVStream::codec’ is deprecated [-Werror=deprecated-declarations]
AVCodecContext* codec = m_format->streams[i]->codec;
^~~~~
In file included from ../tests/decodeinputavformat.h:22:0,
from ../tests/decodeinputavformat.cpp:20:
/opt/libva/master/include/libavformat/avformat.h:712:21: note: declared here
AVCodecContext *codec;
^~~~~
../tests/decodeinputavformat.cpp:62:55: error: ‘AVStream::codec’ is deprecated [-Werror=deprecated-declarations]
AVCodecContext* codec = m_format->streams[i]->codec;
^~~~~
In file included from ../tests/decodeinputavformat.h:22:0,
from ../tests/decodeinputavformat.cpp:20:
/opt/libva/master/include/libavformat/avformat.h:712:21: note: declared here
AVCodecContext *codec;
^~~~~
../tests/decodeinputavformat.cpp:62:55: error: ‘AVStream::codec’ is deprecated [-Werror=deprecated-declarations]
AVCodecContext* codec = m_format->streams[i]->codec;
^~~~~
In file included from ../tests/decodeinputavformat.h:22:0,
from ../tests/decodeinputavformat.cpp:20:
/opt/libva/master/include/libavformat/avformat.h:712:21: note: declared here
AVCodecContext *codec;
^~~~~
../tests/decodeinputavformat.cpp:62:55: error: ‘AVStream::codec’ is deprecated [-Werror=deprecated-declarations]
AVCodecContext* codec = m_format->streams[i]->codec;
^~~~~
In file included from ../tests/decodeinputavformat.h:22:0,
from ../tests/decodeinputavformat.cpp:20:
/opt/libva/master/include/libavformat/avformat.h:712:21: note: declared here
AVCodecContext *codec;
^~~~~
../tests/decodeinputavformat.cpp: At global scope:
../tests/decodeinputavformat.cpp:106:5: error: ‘AV_CODEC_ID_H265’ was not declared in this scope
AV_CODEC_ID_H265, YAMI_MIME_H265,
.libav.org/pipermail/libav-commits/2016-February/018031.html
libyami-utils fails to build with "--disable-x11". It does build with "--disable-x11 --disable-tests-gles". Tested on 1.1.0 release only (on Yocto if that matters).
Here's the failure:
| In file included from ../../libyami-utils-1.1.0/tests/egl/gles2_help.c:26:0:
| ../../libyami-utils-1.1.0/tests/egl/gles2_help.h:61:25: error: unknown type name 'Display'
| EGLContextType* eglInit(Display *x11Display, XID window, uint32_t fourcc, int isExternalTexture);
| ^~~~~~~
| ../../libyami-utils-1.1.0/tests/egl/gles2_help.h:61:46: error: unknown type name 'XID'
| EGLContextType* eglInit(Display *x11Display, XID window, uint32_t fourcc, int isExternalTexture);
| ^~~
| ../../libyami-utils-1.1.0/tests/egl/gles2_help.h:63:57: error: unknown type name 'XID'
| GLuint createTextureFromPixmap(EGLContextType *context, XID pixmap);
| ^~~
| ../../libyami-utils-1.1.0/tests/egl/gles2_help.c:92:50: error: unknown type name 'XID'
| createTextureFromPixmap(EGLContextType *context, XID pixmap)
| ^~~
| ../../libyami-utils-1.1.0/tests/egl/gles2_help.c:260:25: error: unknown type name 'Display'
| EGLContextType *eglInit(Display *x11Display, XID x11Window, uint32_t fourcc, int isExternalTexture)
| ^~~~~~~
| ../../libyami-utils-1.1.0/tests/egl/gles2_help.c:260:46: error: unknown type name 'XID'
| EGLContextType *eglInit(Display *x11Display, XID x11Window, uint32_t fourcc, int isExternalTexture)
| ^~~
| Makefile:719: recipe for target 'egl/gles2_help.o' failed
| make[2]: *** [egl/gles2_help.o] Error 1
| make[2]: *** Waiting for unfinished jobs....
| In file included from ../../libyami-utils-1.1.0/tests/decodeoutput.cpp:45:0:
| ../../libyami-utils-1.1.0/tests/./egl/gles2_help.h:61:25: error: 'Display' was not declared in this scope
| EGLContextType* eglInit(Display *x11Display, XID window, uint32_t fourcc, int isExternalTexture);
| ^~~~~~~
| ../../libyami-utils-1.1.0/tests/./egl/gles2_help.h:61:34: error: 'x11Display' was not declared in this scope
| EGLContextType* eglInit(Display *x11Display, XID window, uint32_t fourcc, int isExternalTexture);
| ^~~~~~~~~~
| ../../libyami-utils-1.1.0/tests/./egl/gles2_help.h:61:46: error: 'XID' was not declared in this scope
| EGLContextType* eglInit(Display *x11Display, XID window, uint32_t fourcc, int isExternalTexture);
| ^~~
| ../../libyami-utils-1.1.0/tests/./egl/gles2_help.h:61:67: error: expected primary-expression before 'fourcc'
| EGLContextType* eglInit(Display *x11Display, XID window, uint32_t fourcc, int isExternalTexture);
| ^~~~~~
| ../../libyami-utils-1.1.0/tests/./egl/gles2_help.h:61:75: error: expected primary-expression before 'int'
| EGLContextType* eglInit(Display *x11Display, XID window, uint32_t fourcc, int isExternalTexture);
| ^~~
| ../../libyami-utils-1.1.0/tests/./egl/gles2_help.h:61:96: error: expression list treated as compound expression in initializer [-fpermissive]
| EGLContextType* eglInit(Display *x11Display, XID window, uint32_t fourcc, int isExternalTexture);
| ^
| ../../libyami-utils-1.1.0/tests/./egl/gles2_help.h:63:57: error: 'XID' has not been declared
| GLuint createTextureFromPixmap(EGLContextType *context, XID pixmap);
| ^~~
| Makefile:743: recipe for target 'decodeoutput.o' failed
Compilation fails with FFMpeg master since commit FFmpeg/FFmpeg@0694d87
../tests/decodeinputavformat.cpp: In constructor ‘DecodeInputAvFormat::DecodeInputAvFormat()’:
../tests/decodeinputavformat.cpp:32:21: error: ‘void av_register_all()’ is deprecated [-Werror=deprecated-declarations]
av_register_all();
^
In file included from ../tests/decodeinputavformat.h:22:0,
from ../tests/decodeinputavformat.cpp:20:
/home/uaeoff/Work/workspace/media/install/include/libavformat/avformat.h:2024:6: note: declared here
void av_register_all(void);
^~~~~~~~~~~~~~~
../tests/decodeinputavformat.cpp: In constructor ‘DecodeInputAvFormat::DecodeInputAvFormat()’:
../tests/decodeinputavformat.cpp:32:21: error: ‘void av_register_all()’ is deprecated [-Werror=deprecated-declarations]
av_register_all();
^
In file included from ../tests/decodeinputavformat.h:22:0,
from ../tests/decodeinputavformat.cpp:20:
/home/uaeoff/Work/workspace/media/install/include/libavformat/avformat.h:2024:6: note: declared here
void av_register_all(void);
^~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors
make[2]: *** [Makefile:667: ../tests/grid-decodeinputavformat.o] Error 1
make[2]: *** Waiting for unfinished jobs....
cc1plus: all warnings being treated as errors
make[2]: *** [Makefile:615: ../tests/decodeinputavformat.o] Error 1
when configured libyami-utils with --enable-libavformat, the build is failing with dependent libraries: libavcodec and libavformat from ffmpeg. Can you please confirm configuring libavformat meaning yami uses ffmpeg version of it.
Consider running the following:
for i in `seq 1 20`; do
/usr/bin/time -f "%e;%U;%S;%P" -a --output="log.txt" \
yamitranscode \
-i input_1920x1080p.264 \
-o out.264 \
-W 1920 -H 1080 \
-c AVC \
-ipperiod 1 \
-intraperiod 30 \
--rcmode CQP \
-qp 25
done
On SKL NUC I observe:
$ cat log_.txt
17.53;1.62;1.26;16%
15.62;1.65;1.24;18%
17.35;1.62;1.24;16%
15.63;1.65;1.28;18%
17.33;1.65;1.25;16%
15.63;1.63;1.28;18%
17.36;1.63;1.24;16%
15.63;1.69;1.22;18%
17.35;1.66;1.23;16%
15.63;1.72;1.22;18%
17.35;1.69;1.19;16%
15.63;1.65;1.26;18%
17.35;1.66;1.21;16%
15.61;1.65;1.27;18%
17.34;1.67;1.22;16%
15.63;1.68;1.24;18%
17.35;1.65;1.22;16%
15.63;1.68;1.23;18%
17.34;1.63;1.23;16%
15.65;1.69;1.26;18%
17.35;1.65;1.24;16%
Looks like yamitranscode has 10-15% variations in performance from run to run.
Especially when using ivf as the output extension yamitranscode can not operate properly.
common/v4l2_wrapper.h
is provided by libyami as an installed public header. The one in libyami-utils does not match the one in libyami and should be removed.
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.