Giter Site home page Giter Site logo

avisynth / avisynthplus Goto Github PK

View Code? Open in Web Editor NEW

This project forked from jeeb/avisynth

919.0 48.0 74.0 36.66 MB

AviSynth with improvements

Home Page: http://avs-plus.net

CMake 0.53% Makefile 0.07% C++ 94.68% C 1.86% Inno Setup 2.71% PowerShell 0.01% Batchfile 0.06% Python 0.08%

avisynthplus's Introduction

AviSynth+

AviSynth+ is an improved version of the AviSynth frameserver, with improved features and developer friendliness.

Visit our forum thread for compilation instructions and support.

Building the documentation:

(Note: the bundled documentation lags behind the descriptions found in the wiki. You can always check the online documentation at http://avisynth.nl/index.php/Main_Page)

AviSynth+'s documentation can be generated into HTML by using Sphinx.

Set-up:

Make sure that Sphinx is installed. This requires that Python is already installed and the pip tool is available. Sphinx 1.3 is the recommended version.

pip install sphinx

For various Linux distributions, a Sphinx package should be available in the distro's repositories. Often under the name 'python-sphinx' (as it is in Ubuntu's repositories).

There is currently a fallback so that distros that only provide Sphinx 1.2 can still build the documentation. It will look different than when built with Sphinx 1.3, because the theme used with Sphinx 1.3 (bizstyle) had not yet been added to the main Sphinx package.

Building the documentation

Once Sphinx is installed, we can build the documentation.

cd distrib/docs/english
make html

Headers for applications which dynamically load AviSynth+:

The expected use-case of AviSynth+ is as a dynamically loaded library (using LoadLibrary on Windows or dlopen everywhere else).

Due to this, it's not actually necessary to build the AviSynth+ library itself in order for applications using it this way to find it.

To facilitate this, we support using CMake to do a limited, headers-only install. The GNUmakefile is deprecated and will eventually be removed.

Using CMake:

To install:

mkdir avisynth-build && cd avisynth-build
cmake ../ -DHEADERS_ONLY:bool=on
make VersionGen install

-DCMAKE_INSTALL_PREFIX can be used to override the install location if need be.

To uninstall:

make uninstall

Using GNUmakefile (legacy):

To install:

make install

To install to a non-standard location:

make install PREFIX=/path/to/location

To uninstall:

make uninstall PREFIX=/path/to/location

avisynthplus's People

Contributors

addewyd avatar aportale avatar asd-g avatar billyoneal avatar chainikdn avatar chikuzen avatar crendking avatar dtl2020 avatar enyium avatar ignus2 avatar innocenat avatar jopejoe1 avatar line0 avatar magiblot avatar mcmtroffaes avatar msg7086 avatar mysteryx93 avatar nekopanda avatar pinterf avatar pylorak avatar qyot27 avatar realfinder avatar reel-deal avatar sl1pkn07 avatar stax76 avatar suggonm avatar timothygu avatar tp7 avatar wangqr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

avisynthplus's Issues

ConvertToYV* functions: wrong chroma position?

  • take a full HD clip in YV12, YV16 or YUY2 encoding
  • compare the output of the following to scripts:

1:
Load(....)
UToY()

2:
Load(....)
ConvertToYV24()
LanczosResize(960,540)
UToY()

3:
Load(....)
YToUV(UToY8(), VToY8(), ConvertToY8().LanczosResize(960,540).ConvertToYV24())
UToY()

  • (works equally well with all resize functions and with VToY() in last script line)
  • zoom in like 400% and you see a shift of about 0.5 pixel to the left with the 2nd script relative to 1st and 3rd
  • I would guess avisynth 2.5/2.6 have the same issue, though I havn't tested it

Generate correct folder structure with cmake

One of the "selling points" of avs+ for developers is "leaner and more logical project structure", but right now the VS project generated with cmake doesn't have any project structure at all.

Feature request: customizable/variable text size in Info()

This thread on Doom9 features a 4K video that I was helping test for the user. The text output by Info() on that video is so small it can't really be read at all.

The fix for this would be to either allow the user to select the text size in Info, which might be easier, or to have the text size automatically selected based on the size of the video.

fft3dgpu doesn't work well on MT builds

Reported here.
Minimal script to reproduce the issue seems to be

colorbars(1280, 720, "YV12").addgrainc(1000, 1000, seed=1)
fft3dgpu(sigma=5)

Breaks every time I request some large frame number and then try to navigate to one of the first 5k frames. MT is not enabled.
Works fine with r1576.

Bounds checking for audio

Despite the recent lack of activity, I figured it would still be a good idea to make a note of what seems to have happened with the resampling issue in the MT branch.

As per FFMS2 #143, which describes the issue that had also been discussed in the Doom9 thread, the response seems to be that the audio caches in AviSynth also performed bounds checking, and removing the caches in the MT branch correspondingly removed the checking, leading to the errors.

ResampleAudio doesn't have any checking, apparently, relying on the audio cache to do that (and the checking in SSRC must interact with the ones in the core in some way, because it also throws the error, but at the end of reading a stream rather than immediately at the beginning).

Is bounds checking something that should be separate from the caches, or does it need to be a package deal to ensure things work correctly? Or is it more a decision that bounds checking should be plugin-side?

Exported funtion overloads hide each other

It is possible to register multiple functions with the same name. When a function is called, Avisynth will select the best overload based on many criteria, like argument names and types. However, functions exported in the "$InternalFunctions$", "$PluginFunctions$", and "$Plugin!...!Param$" variables are unable to reflect this function overloading. Especially "$Plugin!...!Param$" is exposed, where all the overloads of a function are hidden by the version that has been registered last. As a result, external utilities (like AvsPmod) are unable to correctly enumerate Avisynth(+)'s list of functions.

It is to be investigated how functions could be exported without hiding overloads. External utilities are to be considered, and if possible, compatibility with existing applications should be kept.

TCPServer and TCPSource?

Just wanted to know if Avisynth+ supports TCPServer and TCPSource. They give me a "missing function" error and since that's kind of a complicated filter (I suppose it's internally rather messy to do that), I assume Avisynth+ simply did not implement them. Is that correct?

If so I'd ask "please implement them", but again I'm aware that might be much more troublesome than a "normal" filter so it's understandable if the response is "not planning on doing that".

Cheers and cool project.

access violation bug in Avisynth+ 32bit

r2043-MT-test download From.

http://avs-plus.net/builds

Worked Fine with 64bit with avspmod.

But Crashed with 32bit AVSpmod or reading avs in megui etc.

[Wed Jul 13 23:02:33 2016]
Traceback (most recent call last):
File "run.py", line 49, in
File "avsp.pyo", line 18881, in main
File "wx_core.pyo", line 7981, in init
File "wx_core.pyo", line 7555, in _BootstrapApp
File "avsp.pyo", line 18868, in OnInit
File "avsp.pyo", line 5229, in init
File "avsp.pyo", line 6290, in defineFilterInfo
File "avsp.pyo", line 6617, in getFilterInfoFromAvisynth
File "avisynth.pyo", line 242, in invoke
WindowsError: exception: access violation reading 0x00000001

avisynth.h

virtual void _stdcall ApplyMessage(PVideoFrame* frame, const VideoInfo& vi, const char* message, int size, int textcolor, int halocolor, int bgcolor) = 0;

_sdtcall is not ANSI.
__sdtcall is ANSI.

Jinc r44 version also has a critical memory issue

test enviroment :

source : 24fps Progressive / 1080 Full HD / 16:9
avisynth : avisynth 2.6 MT ( But I didn't use MT command like "setMTmode")
Filter : Jincresize r44
Previewing : Virtualdub 1.10.4
Avisynth Script :
┌────────────────────────────────────────────────────────┐

[SOURCE]

LWLibavVideoSource("D:\Encoding[17]\KILL-la-KILL[Source]\LWI\ep05.lwi", cache=false)
└────────────────────────────────────────────────────────┘

Test -> 1) Resize x2 with Jincresize(36256) and turn right and turn left for AA in YV16 Color Space.
2) Resize x1 with Jincresize(36
256) and turn right and turn left for AA in YV16 Color Space.
3) Resize x2 with Jincresize(36256) and turn right and turn left for AA in YV12 Color Space.
4) Resize x1 with Jincresize(36
256) and turn right and turn left for AA in YV12 Color Space.

Result -> 1) msg : "evaluate : Unhandled C++ exception!" from // x2 : YV16 : Jinc256

           2) No Error message // x1 : YV16 : Jinc36&64&144&256

           3) msg : "access violation! at 0x0000964A in JincResize.dll"  or 
                          "evaluate : Unhandled C++ exception!" from // x2 : YV12 : Jinc256

           4) No Error message // x1 : YV12 : Jinc36&64&144&256

ImageWriter: upside down image when colorspace is Y8.

ImageWriter: upside down image when colorspace is Y8. FlipVertical() before ImageWriter fixes the problem.

Test script:

BlankClip(length=1, width=512, height=256, pixel_type="Y8", color_yuv=$808080)
Subtitle("Test", size=128, align=5)
ImageWriter(file="C:\", type="png")
  • Using the following types writes an upside down image: bmp, bw, dds, jpg, png. pbm, pgm, ppm, rgb, rgba, sgi, and tga.
  • I tried with ebmp and tif/tiff, even though it writes the file I cannot open them, maybe they don't support Y8?
  • file="pal" - ImageWriter: error 'illegal operation' in DevIL library - writting file "c:\000000.pal" - DevIL version 0.
  • file="pcx" - it just returns a black frame.
  • file="raw" - works correctly.
  • I viewed images in GIMP and Photoshop.

Merge problem with interleaved color formats

In YV12/YV16/YV24/Y8, all is good, but -

A=Colorbars ## (RGB32)
B=A.Invert
return Merge(A, B, weight=254.0/255.0) ## output = 100% 'A'
return Merge(A, B, weight=254.5/255.0) ## output = 100% 'B'

In RGB24 or YUY2, blending works, but the output has vertical stripe artifacts.

AVS 2.61 does not have this issue.

Create an installer

Title says it all. We need an installer so that users of Avisynth do not have to rely on an existing Avisynth installation. This is very important so that users can set up Avisynth+ easily without effort, without frustration, and without errors.

Avi not loading after Avisynth+ install

After installing avisynth+ my avi is loaded in black and white and stretched diagonal.

I reduced the code to:
AviSource("C:\Demo\demo1.avi")

Information of the source:
Frame width: 1540
Frame height: 1084
Data rate: 721126kbps
Frame rate: 17frames/second

afbeelding

Native support for arrays in the scripting language

Arrays are supported internally by Avisynth(+), but there is no easy way to use them in scripts. There is AVSLib to make it possible at all, but it only invents new functions and does not integrate into the language, hence it is cumbersome and too verbose to use comfortably. A more compact and integrated syntax like found in other scripting languages would be much preferable.

r2063 MT LNK4197 warning in 64bit build.

Visual studio 2015 update 3
Cmake 3.6.0

All happened in avisynth_c.obj,example

严重性 代码 说明 项目 文件 行 源 项目级别 禁止显示状态 警告 LNK4197 多次指定导出“avs_is_yv24”;使用第一个规范 AvsCore D:\Source code\AviSynthPlus\Build x64\avs_core\avisynth_c.obj 1 生成 3

Add exception clause back to avisynth.h

Since AviSynth 2.6 was finally finalized, the exception clause can now be added back to avisynth.h.

On a side note, I know AviSynth+ was trying to relicense to MIT. Does this help the situation any?

vc redist dll

hello
i use avisynth+ with ffmpeg as portable
i just need the dll files of vc redist in ver. AviSynthPlus-MT-r2636

thanks..

"ImageSource" extremely slow

Using "ImageSource" is extremely slow in AVS+ . I tried nearly every release (32bit) and it is all the same.
AVS+ = 2,230fps:
https://abload.de/img/avsp_r2440odzjv.jpg
AVS 2.60 = 149,200fps !!! (No MT used):
https://abload.de/img/avs_v2_60xjxw0.jpg

The script does nothing special. It loads a video-file and adds two images (audio spectrum) below.
I normally would use animate on the images to shift them with the frames, but for finding the bottleneck I did a simple crop to cM and cA. The images are pretty big: 60000x128px. But AVS 2.60 doesn't have a problem with them.

cin = FFVideoSource("Test.mp4")
endframe=int((Framerate(cin)*60)-1)

cM = ImageSource("Test_Mp2.png",fps=Framerate(cin),end=endframe)
cA = ImageSource("Test_Ac3.png",fps=Framerate(cin),end=endframe)

cin = Trim(cin,int(05 * 60 * Framerate(cin)),-(endframe+1)).Spline64Resize(1024,576).Crop(0,128,0,-128)
cM = Crop(cM,0,0,1024,0)
cA = Crop(cA,0,0,1024,0)
cA = StackVertical(cM,cA)
cin = StackVertical(cin,ConvertToYv12(cA))

return cin

My PC:
i7 870 @ 3,8GHz
Nvidia GTX 1070
12GB RAM DDR3
Win10 Home 64bit
Samsung Evo 850 SSD 500GB

Function lister script freezes

With both the r1576 and the r1718 build as x86 under a X64 windows 7, this function lister script (http://forum.doom9.org/showthread.php?p=1712503#post1712503) freezes after debug output 'ImageSeq_ImageWriter', even if call to all ImageSeq_ functions is avoided. Maybe the following function doesn't even like to be checked by RT_PluginFunctions().
With the given set of pre-captured (i.e. not called) functions (line #58 ff), the same script runs fine with Avisynth 2.6 ST and MT.

Original report URL: http://forum.doom9.org/showthread.php?p=1712504#post1712504

BitsPerPixel not reporting correct size for Alpha formats

For YUV444P16, it reports 48, like expected.
For YUVA444P16, it reports 48.

I noticed this while testing FFmpeg again. Any of the alpha formats would crash it with invalid buffer sizes if only BitsPerPixel was used, while specifically accounting for the alpha channel (by using BitsPerComponent * NumComponents, BitsPerPixel * BitsPerComponent / 8 * NumComponents, or the much more compact BitsPerPixel + BitsPerComponent since I knew it wasn't allotting the 4th channel only) allowed it to work and output an image.

some source files are not UTF-8 format.

.\plugins\TimeStretch\SoundTouch\PeakFinder.cpp
.\plugins\Shibatch\shibatch.cpp
.\plugins\Shibatch\ssrc.h
.\plugins\Shibatch\supereq.cpp
.\plugins\Shibatch\supereq.h

ANSI

.\plugins\Shibatch\ssrc.cpp

Shift-JIS

Make VFAPI filters work again

In Avisynth+, support for loading VFAPI filters has been refactored into its own plugin. The sources for VFAPI functionality are included in the repository, but compilation is disabled right now, because the "new_Splice" function (used by the VFAPI plugin) is an internal function to Avisynth and is not accessible for plugins.

To be done is to find a solution to the missing "new_Splice", adapt the source accordingly, reenable, and test the plugin with Avisynth+.

Superfluous record.txt created all the time

I wanted to try out avs+ to see how it compared to vanilla avisynth. So I installed avs+ r1576 and now whenever I open an avisynth script (in mpc-hc, haven't tried anything else yet) an empty file named record.txt is created in the script's directory.

I have no idea what this does. Maybe it's useful in other circumstances, but I don't know because the file is empty and there's no mention of it on the homepage or anything.

I would really prefer that additional files were not created, but I really hate having empty files lying around and cluttering up every directory that has an avisynth script.

Please make this file's purpose more evident or don't create it at all.

Access violation when using SelectEvery with negative offsets

Using SelectEvery(src,n,offset0,offset1,...) with negative offset values sometimes causes access violations.

This is the shortest script I found with which this behaviour can be consistently reproduced, which also causes access violations on Avisynth 2.5.8 and 2.6a4. (Reduced from a larger script which caused access violations only on Avisynth+ and not 2.5.8 or 2.6a4.)

BlankClip()
SelectEvery(1,0,0)
SelectEvery(1,-1)

VideoFrameBuffer objects doesn't freeing correctly

http://forum.doom9.org/showthread.php?p=1697682#post1697682

In ScriptEnvironment::~ScriptEnvironment() frame->vfb deleted only if frame->vfb->refcount==0 which is not always true.

Proposed change is to delete VideoFrame::vfb ONLY in VideoFrame::DESTRUCTOR() regardless of its refcount value.

It's working as expected as the only place where VideoFrameBuffer objects are created is in ScriptEnvironment::AllocateFrame(). In fact it'll be a good idea to move VideoFrameBuffer creating to VideoFrame constructor.

RST documentation

I'm currently in the process of moving the documentation to reStructuredText. The FilterSDK stuff is in pretty rough shape content-wise (really rough, more than a little of it has to do with inline asm), but I started with it because the rest of the documentation is mostly language-specific versions of the same basic docs and probably won't need nearly as much critiquing. I'm getting started on the English docs next.

This way, the docs are easier to maintain, and we can use rst2html/rst2pdf/rst2man to convert them into more traditional documentation later (and on-demand, but that'd require buildsystem integration with docutils, which is far more of interest on Linux/OSX than it is on Windows).

The HTML docs get moved to the htm/ subdirectory while the RST docs get proofed, and once everything's been worked out, the directory can be safely deleted. The .css and image elements remain because the RST docs can use them, either directly (images) or with the conversion software (.css).

The upside, of course, is that they're also now viewable directly on Github:
https://github.com/qyot27/avisynth/tree/rstification/distrib/FilterSDK

But how should I handle the pull request(s)? Should they be issued for each language as each directory is completed, or should I wait until all of them have been converted? I could issue one for FilterSDK right now, but I'd prefer if the irrelevant stuff is identified and removed/edited before I do.

avisynth_c.h: cstddef header on C

The cstddef header file is intended for C++, therefore avisynth_c.h is now unusable for C plugins (or whatever written in pure C interfacing with this header), raising syntax errors or file not found when compiling. An #if __cplusplus clause around that include on avs/types.h should be enough I guess. Too lazy to test and make a pull request :^).

Introduced in a616181.

There is no function named 'SetFilterMTMode'

Dear Sir,

I have a problem with AviSynthPlus-r1576. After install (i chose unistall avisynth normal) and reboot PC. But when I try to to use the script, the AvsP said: There is no function named 'SetFilterMTMode'

There's my script

SetFilterMTMode("LSMASHSource",3)
LoadPlugin("E:\Encoder\Tools\LSMASHSource.dll")
LWLibavVideoSource("E:\Download\test zone\test script.mkv")
SetFilterMTMode("",2)
AssumeFPS(24000, 1001)
Toon(0.15)
Deblock(quant=33, bOffset=14)
dfttest()
AAA(Chroma=true)
Spline64Resize(848,480)
aWarpSharp(depth=12,blurlevel=4,thresh=0.3,cm=1)
LimitedSharpenFaster(edgemode=1,strength=200)
deen("a2d",3,6,6)
Dehalo_alpha()
Prefetch(12)

Use FormatMessage to show error codes to user.

<~tp7> error=0x7f is pretty much always a missing runtime, right?
<__ar> tp7
<__ar> ERROR_MOD_NOT_FOUND
<__ar> 126 (0x7E)
<__ar> The specified module could not be found.
<__ar> ERROR_PROC_NOT_FOUND
<__ar> 127 (0x7F)
<__ar> The specified procedure could not be found.

<__ar> all that effort to find out
<__ar> it just
<__ar> passed the system error code

<__ar> http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382%28v=vs.85%29.aspx
<__ar> env->ThrowError("LoadPlugin: unable to load "%s", error=0x%x", filename, GetLastError()); <- plugins.cpp

<__ar> oh tp7, is it possible for avs+ to also use FormatMessage() in the loadplugin error output?
<__ar> since looking up system error codes
<__ar> is kinda a pain
<~tp7> ultim, ^
<__ar> and people might be able to work out whats wrong if they have some kind of string rather than an error code id!
<~tp7> I do agree this is reasonable

Make SetFilterMtMode work with full filter names

It should be possible to use long filter name in SetFilterMtMode and have that applied to all invocations of the specified filter, even when called using its short name.

Example:

SetFilterMtMode("RgTools_RemoveGrain", MT_NICE_FILTER)
SetFilterMtMode("RemoveGrainSSE3_RemoveGrain", MT_SERIALIZED)
...
RemoveGrain(4, -1) #depending on which plugin is installed, use appropriate mt mode

AviSynth+ fails to compile in VS2013: C3681: 'min' / 'max' identifier not found

First of all, I don't know the next thing about C++.
However, Avisynth+ seems to be missing a

 #include <algorithm> 

in win.h (or text-overlay.h and ImageSeq.h) and TimeStretch.cpp , which seems to be required to use std::min() and std::max()

The error occurs in text-overlay.cpp (Core) and TimeStretch.cpp, ImageWriter.cpp (Plugins).

Adding the includes makes everything compile. No idea why it works fine without in VS2012, though.

The existing 'last' clip isn't forwarded after an assignment at the end of a script/scope

The following script

blankclip(1000,720,480,"yv12",color_yuv=$808080)
anotherfilter = blankclip(1000,720,480,"yv12",color_yuv=$FF8080)
# commented_filter()

is erroneously treated as though it doesn't have any video at all because the assignment operator doesn't forward the previous 'last' clip variable to the host application, which is invoking the script (avspmod/virtualdub/encoder/etc).
Yet actually the 'last' clip still exists, if you add "last" to the line below the assignment, it will work.

AVS+ crashed when add MT mode to fft3dgpu filter

Hi Sir,

I can't use SetFilterMTMode with FFT3DGPU filter, the script crash everytime. And the AvsPmod showed error "access violation reading 0x00000000" and File ""avisynth.pyo", line xxx, in GetFrame". I tried without SetFilterMTMode and it was fine but it veryslow (1.27 fps, CPU: 11%).

I'm using VGA: Geforce 650Ti (MSI), AVS+ ver 2367. Can you help me fix this?

Here's my script:
`#Set MT mode
SetFilterMTMode("LWLibavVideoSource",3)
SetFilterMTMode("fft3dGPU",3)
SetFilterMTMode("gradfun2dbmod",2)

#Video Source
LWLibavVideoSource("E:\Download\test.mp4")

#Denoise
FFT3DGPU(sigma=4,bt=3).gradfun2dbmod()

#Enable MT mode
Prefetch(6)`

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.