Giter VIP home page Giter VIP logo

freshplayerplugin's Introduction

About

PPAPI-host NPAPI-plugin adapter.

As you know, Adobe have suspended further development of Flash player plugin for GNU/Linux. Latest available as an NPAPI plugin version 11.2 will get security updates for five years (since its release on May 4th, 2012), but further development have been ceased. Fortunately or not, newer versions are still available for Linux as a part of Chrome browser, where Flash comes bundled in a form of PPAPI plugin. PPAPI or Pepper Plugin API is an interface promoted by Chromium/Chrome team for browser plugins. It's NPAPI-inspired yet significantly different API which have every conceivable function plugin may want. Two-dimensional graphics, OpenGL ES, font rendering, network access, audio, and so on. It's huge, there are 111 groups of functions, called interfaces which todays Chromium browser offers to plugins. Although specs are not final yet, and new interface versions are arising, with some older ones getting deleted; rate of change have significantly slowed down.

For various reasons Firefox developers are not interested now in implementing PPAPI in Firefox. However that does not mean it cannot be done.

The main goal of this project is to get PPAPI (Pepper) Flash player working in Firefox. This can be done in two ways. First one is to implement full PPAPI interface in Firefox itself. Other one is to implement a wrapper, some kind of adapter which will look like browser to PPAPI plugin and look like NPAPI plugin for browser.

First approach requires strong knowledge of Firefox internals, and moreover additional effort to get the code into mainstream. Maintaining a set of patches doesn't look like a good idea. Second approach allows to concentrate on two APIs only. Yes one of them is big, but still graspable. Second way will be used for the project. It will benefit other browsers too, not only Firefox.

Status

Mostly works. Looks like all essential APIs are implemented.

Known issues

described here.

Security note

All available Pepper Plugin API documentation usually accompanied with assertions of enhanced security due to active sandboxing usage. It's worth to note, that API itself doesn't make any sandboxing, it's only allows sandboxed implementations. This particular implementation doesn't implement any sandbox. That means if any malicious code breaks through plugin security, there is no additional barriers. This is the same level of security as NPAPI Flash have.

Install

Project is using cmake (>=2.8.8) build system.

  • Install prerequisites.
    Debian/Ubuntu:
    $ sudo apt-get install cmake gcc g++ pkg-config ragel libasound2-dev \
           libssl-dev libglib2.0-dev libpango1.0-dev libgl1-mesa-dev     \
           libevent-dev libgtk2.0-dev libxrandr-dev libxrender-dev       \
           libxcursor-dev libv4l-dev libgles2-mesa-dev libavcodec-dev    \
           libva-dev libvdpau-dev libdrm-dev libicu-dev
    Fedora:
    $ sudo dnf install cmake gcc gcc-c++ pkgconfig ragel alsa-lib-devel openssl-devel \
           glib2-devel pango-devel mesa-libGL-devel libevent-devel gtk2-devel         \
           libXrandr-devel libXrender-devel libXcursor-devel libv4l-devel             \
           mesa-libGLES-devel  ffmpeg-devel libva-devel libvdpau-devel libdrm-devel   \
           pulseaudio-libs-devel libicu-devel

  • (optional) To enable PulseAudio support, install libpulse-dev.

  • (optional) To enable JACK support, install libjack-jackd2-dev and libsoxr-dev

  • Create a build subdirectory in the root directory, from that folder, call

    $ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
    $ make
  • Put generated libfreshwrapper-flashplayer.so into browser plugins directory (~/.mozilla/plugins) or install system-wide by calling:
    # make install

By default make install will put plugin(s) to ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/mozilla/plugins. The path could be changed either by changing CMake parameter CMAKE_INSTALL_PREFIX, or by setting MOZPLUGIN_INSTALL_DIR.

When loaded by browser it will search for libpepflashplayer.so in a directories where it can be: in Chrome (stable/beta/unstable) directory, and in /usr/lib/pepperflashplugin-nonfree/ (pepperflashplugin-nonfree puts it there). It should be enough to get it running, but if it doesn't, specify full path in ~/.config/freshwrapper.conf. You may find sample configuration file in /data. It's better to have manifest.json alongside with libpepflashplayer.so, actual Flash version will be taken from that manifest.

Hardware-accelerated video decoding code requires relatively new version of libavcodec (January 2013, version 54.39.0). If you don't have it yet, code won't compile unless you disable hwdec by WITH_HWDEC=0. To do so, change configuration step command to:

    $ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DWITH_HWDEC=0 ..

Note, even if built, hardware-accelerated video decoding is still disabled by default. You need to explicitly enable it in configuration file.

Install / OpenGL|ES 2 support

Although it's better to use system implementation of OpenGL|ES 2, it's still possible to leverage ANGLE GLES2 emulation by adding WITH_GLES2=0 to cmake command line at configuration time (-DWITH_GLES2=0 to be exact). Note, that requires C++11-capable compiler.

License

The MIT License. See LICENSE file for full text.

Directory 3rdparty/ contains source code from 3rd parties which can be distributed under other license terms. See source code for details.

freshplayerplugin's People

Contributors

andykimpe avatar btbn avatar edwardbetts avatar evilpie avatar hello71 avatar hroo772 avatar i-rinat avatar jakibaki avatar laurenttreguier avatar sarnex avatar sergiomb2 avatar vdanjean 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

freshplayerplugin's Issues

Flash doesn't work on plug.dj

I don't know if you want website specific tickets, but for me flash works fine with youtube. But when it is embedded on plug.dj it doesn't work.

I am using chrome now, it is working here.

Conflict with some Java applications

Hi there,

I cannot launch some Java applications, such as smartgithg or Crashplan, when I have installed freshplayerplugin.

The produced error output:

[ERROR:flash/platform/pepper/common/pep_process.cpp(19)] CHECK(g_process_type == PROCESS_TYPE_UNKNOWN) failed
/usr/bin/smartgithg: line 99: 21690 Aborted                 (core dumped) $_JAVA_EXEC $_VM_PROPERTIES -Xmx${SMARTGITHG_MAX_HEAP_SIZE} -Xverify:none -Dsmartgit.vm-xmx=${SMARTGITHG_MAX_HEAP_SIZE} -jar "$SMARTGIT_HOME/lib/bootloader.jar" "$@"

Any ideas what could cause the conflict?

Thanks!

Some Flash ads can't be clicked with Fresh Player Plugin

I know this is a weird thing to report, but some Flash ads (tested with some Adsense ads) can't be clicked when using Fresh Player Plugin. This doesn't occur with all Adsense Flash ads, just with some of them.

Ads are important because they bring revenue to websites, keeping them alive so even though most users won't agree with this, the bug should be fixed...

Error CentOS 6 dependence unrecognized

[root@10807 src]# cmake --version
cmake version 2.8.8
[root@10807 src]# cmake ..
checking for modules 'alsa;glib-2.0;x11;xinerama;egl;glesv2;liburiparser;libconfig;libevent;libevent_pthreads;cairo;pango;pangocairo;pangoft2;freetype2;gtk+-2.0'
package 'liburiparser' not found
package 'libevent' not found
package 'libevent_pthreads' not found
CMake Error at /usr/share/cmake/Modules/FindPkgConfig.cmake:275 (message):
A required package was not found
Call Stack (most recent call first):
/usr/share/cmake/Modules/FindPkgConfig.cmake:329 (_pkg_check_modules_internal)
CMakeLists.txt:20 (pkg_check_modules)
Configuring incomplete, errors occurred!
[root@10807 src]# yum -y install uriparser-devel libevent-devel
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
base: mirror.nsc.liu.se
elrepo: mirrors.coreix.net
extras: centosn4.centos.org
updates: centosh2.centos.org
Setting up Install Process
Package uriparser-devel-0.7.1-1.el6.x86_64 already installed and latest version
Package libevent-devel-1.4.13-4.el6.x86_64 already installed and latest version
Nothing to do
[root@10807 src]# cmake ..
checking for modules 'alsa;glib-2.0;x11;xinerama;egl;glesv2;liburiparser;libconfig;libevent;libevent_pthreads;cairo;pango;pangocairo;pangoft2;freetype2;gtk+-2.0'
package 'liburiparser' not found
package 'libevent' not found
package 'libevent_pthreads' not found
CMake Error at /usr/share/cmake/Modules/FindPkgConfig.cmake:275 (message):
A required package was not found
Call Stack (most recent call first):
/usr/share/cmake/Modules/FindPkgConfig.cmake:329 (_pkg_check_modules_internal)
CMakeLists.txt:20 (pkg_check_modules)
Configuring incomplete, errors occurred!
[root@10807 src]#

Add a bit of documentation for developers

I would really want to start helping, but I have no idea where to start, most importantly, how do you debug this?
If you could add just a bit of documentation on how to get started that would be nice :)

Flash window needs a class and/or name

The Flash window needs a name and/or a class to be accessible from the window manager.

I have a multi monitor setup and the Flash window opens in Fullscreen always on the wrong monitor. I can fix that with my window manager when I set a specific viewport. But for that the window manager needs a name or a class, is it possible to add a name/class to the flash window?

update
I don't use xinerama, so the config file doesn't help me (I'm using Nvidia TwinView).

no longer works properly

Hi, upgraded to Ubuntu 14.04 and Firefox 31 and some websites that were working before have stopped working. I have found two
https://www.ted.com/
flash player tries to load forever without success, revert back to flash 11.2 and it works again
http://www.cp24.com/
Got a box asking me to download flash from Adobe

I have an old installation of Ubuntu 13.10 and Firefox 30 which I have not erased yet, both sites work properly.

I have also had an old version of flashplayerplugin which I compiled on Fedora 20 a while ago and have not get a chance to update yet, it still works with Firefox 31 for both sites.

On Ubuntu 14.04 flashplayerplugin was installed with webupd8's ppa.

Thanks

Transparency support

Current version doesn't handle transparency, alpha channel is ignored as well as previous contents of suppied drawable.

Find a way to support transparent plugin instances.

Cannot change video quality on some websites

Many thanks for bringing up-to-date pepper flash to NPAPI enabled browsers, it's much needed. Unfortunately I'm having a problem controlling the video quality of videos on Al
Jazeera English. With NPAPI flash 11.2 or pepper flash 13.1 in Chrome one can change the video quality, but while the video plays with freshplayerplugin, one cannot change the video quality and the default video quality is so high that it pushes my CPU to the limit. See for example:

http://www.aljazeera.com/programmes/lifelines/2014/04/ancient-enemy-2014429135148438678.html

Best Regards

Chat fails to load on twitch.tv

When watching any channel on twitch the chat window opens but the dialogue fails to load. It just keeps recycling with "Sorry, we were unable to connect to chat. Reconnecting in 2 seconds."

Add error-tolerant url parser

Real life URLs are often violates specifications, and that makes strict url parsers complain too much. More error tolerant parser is required.

Future Splash doesn't run on Firefox

Hi, first i want to thank everybody who is involved in this project and are working on it.
My issue is basically that I cannot play .spl (Future Splash) files on firefox (It uses the default download action). I checked the pepper flash plugin on chrome and it has future splash on it´s mimetypes, but when I checked it on firefox there is just the Shockwave Flash (swf) on the mime-type list.

NPP_DidComposite does crash webkit2gtk

NPP_DidComposite must not be set for freshplayerplugin to work with WebKit2 GTK.

Here's a test case. Build stock freshplayerplugin, then:

user@ubuntu:~$ /usr/lib/x86_64-linux-gnu/webkit2gtk-3.0/libexec/WebKitPluginProcess -scanPlugin ~/.mozilla/plugins/libfreshwrapper-pepperflash.so 
Bus error (core dumped)

Comment out the following line in np_entry.c and rebuild:

    //aNPPFuncs->didComposite = NPP_DidComposite;

Then:

user@ubuntu:~$ /usr/lib/x86_64-linux-gnu/webkit2gtk-3.0/libexec/WebKitPluginProcess -scanPlugin ~/.mozilla/plugins/libfreshwrapper-pepperflash.so 
Shockwave Flash
Shockwave Flash 13.1 r2
application/x-shockwave-flash:swf:Shockwave Flash

(Of course, libwebkit2gtk-3.0-25 must be installed)

Firefox freeze when play video and open more than one tab

Hi,

From latest commit play flash video fail when I've more than one tab open in Firefox. After some seconds, container plugin crash and I can continue using firefox but not flash player.

My system:
Firefox 31
Ubuntu 1404 64 bits.
Chrome with Adobe Flash Player 14.0.0.145

Causes SIGSEGV in RSSOwl when enabled.

After enabling fresh player RSSOwl crashes instantly when attempting to view feeds. Disabling fresh player prevents the problem.

The console shows:

A fatal error has been detected by the Java Runtime Environment:

#
#  SIGSEGV (0xb) at pc=0x00007f2938ff5bd6, pid=5751, tid=139817356359424
#
# JRE version: OpenJDK Runtime Environment (7.0_55-b14) (build 1.7.0_55-b14)
# Java VM: OpenJDK 64-Bit Server VM (24.51-b03 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  [libxul.so+0xb65bd6]  ffi_closure_unix64+0x3590
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/gcb/hs_err_pid5751.log
#
# If you would like to submit a bug report, please include
# instructions on how to reproduce the bug and visit:
#   http://icedtea.classpath.org/bugzilla
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.

I posted this on classpath bugzilla but as they pointed out, the error is with native code, i.e. RSSOwl.

I have a full log file - very long - if needed.

Don't play sound in Deezer or Spotify

I don't know from what commit exactly but from Aug 29 update (maybe prior, but I don't update previous since Aug 23) Deezer and Spotify doesn't play sound.

Can you test and fix?

Can not listen music on grooveshark.com

When I use google chrome and go to grooveshark.com.
I can listen music
When I change flash player to Adobe Flash 11.2.202.400.
and it's ok.
When I use freshplayerplugin (20140831)
I can not play music on grooveshark.com.

Arch Linux.
Firefox 31.0

Plugin fails under Debian Stable (Wheezy)

I just found about this and started testing across all of my Debian boxes.

So far, I have two with Debian Jessie/testing (which ships with Mesa 10.2 - one is some recent Sandy Bridge box and other is a really REALLY ancient Pentium 4 laptop with some ancient-as-time-itself Radeon IGP340M). While I've yet to check on the SB box, on the ancient laptop, libfreshwrapper-pepperflash.so seems to work as expected (surprisingly for such OLD hardware!).

Now I'm trying on a kinda old box (a Core 2 Duo laptop with a Mobility Radeon X1400 GPU), but this one is running Debian Stable (AKA Wheezy). Unfortunately, Wheezy ships with the now-unsupported Mesa 8.0.5, and it seems that freshplayerplugin doesn't like that, judging for the following message logged at my console:
not implemented: PPB_OpenGLES2DrawBuffers(Dev);1.0

...followed by the Flash plugin crashing and Firefox notifying me about the fact.

If a newer Mesa version was expected, I would like to see that documented somewhere. Unfortunately updating this box to Jessie is not a possibility for me (yet). Is this fixable in the plugin anyway? Or it's just another reason for NOT using Debian Stable?

Build error on armv7 fedora 20

If i try to build i get:

~/git/freshplayerplugin/build% make
[ 1%] Building C object CMakeFiles/freshwrapper-obj.dir/src/np_functions.c.o
/home/odroid/git/freshplayerplugin/src/np_functions.c: in function ' »handle_key_press_release_event«:
/home/odroid/git/freshplayerplugin/src/np_functions.c:785:5: error: unknown type name: »XComposeStatus«
XComposeStatus compose_status;
^
/home/odroid/git/freshplayerplugin/src/np_functions.c:790:5: error: implicit declaration of function »XLookupString« [-Werror=implicit-function-declaration]
charcount = XLookupString(ev, buffer, sizeof(buffer), &keysym, &compose_status);
^
cc1: some warnings are treated as errors
make[2]: *** [CMakeFiles/freshwrapper-obj.dir/src/np_functions.c.o] errors 1
make[1]: *** [CMakeFiles/freshwrapper-obj.dir/all] errors 2
make: *** [all] errors 2

full screen button doesn't work

Hi,
There are some sites for which the full screen button doesn't work.
For example,http://www.cp24.com/
click maximize the video just freezes/
This happens in Ubuntu 13.10 (install flashplayerplugin with webupd8 ppa) and fedora 20 (compile flashplayerplugin from source)

Thanks for the great work!

plugin not showing in about:plugins page

Compiled the file with suse build services, and created a package for Fedora 20/x64
[https://build.opensuse.org/package/show/home:The-IceMan-Blog/freshplayerplugin], the package install the file to /usr/lib64/mozilla/plugins but i don't see it in the about:plugins page.

# ls -l /usr/lib64/mozilla/plugins                                                                                                                                                   
total 756
  4 drwxr-xr-x. 2 root root   4096 Jun  1 20:26 .
  4 drwxr-xr-x. 4 root root   4096 Aug  3  2013 ..
348 -rwxr-xr-x  1 root root 353096 Jun  1 19:58 libfreshwrapper.so
 20 -rwxr-xr-x  1 root root  20016 May 24 18:09 libgnome-shell-browser-plugin.so
108 -rwxr-xr-x  1 root root 106592 Oct  3  2013 libtotem-cone-plugin.so
112 -rwxr-xr-x  1 root root 111344 Oct  3  2013 libtotem-gmp-plugin.so
 72 -rwxr-xr-x  1 root root  73472 Oct  3  2013 libtotem-mully-plugin.so
 88 -rwxr-xr-x  1 root root  86288 Oct  3  2013 libtotem-narrowspace-plugin.so

trunk does not build on Ubuntu 14.04

trunk does not build on Ubuntu 14.04
with message
-- checking for modules 'alsa;glib-2.0;x11;xinerama;egl;glesv2;liburiparser;libconfig;libevent;libevent_pthreads;cairo;pango;pangocairo;pangoft2;freetype2;gtk+-2.0'
-- package 'egl' not found
-- package 'glesv2' not found
-- package 'libevent' not found
-- package 'libevent_pthreads' not found

you have to add this to README

sudo apt-get install libegl1-mesa-dev libgles2-mesa-dev libevent-dev libevent-pthreads-2.0-5

Freshplayer often crashes or doesn't work

When I open the about page:
http://www.adobe.com/software/flash/about/
Sometimes the version code on the right bottom crashes, Firefox reports that the plugin breaks down.Sometimes it shows "You have the version 14,0,0,145 installed" correctly.
But no film on the top is played.It plays in chromium.When I tried right-click on it, it says no film loaded.
Arch linux with kernel 3.15.5-2, Intel HD4600, pepper flash plugin 14.0.0.145 from google chrome stable, freshplayerplugin built from your git yesterday (07/29/2014).

Add more paths (for Slackware)

Chromium for Slackware uses the paths:

/usr/lib/PepperFlash and /usr/lib64/PepperFlash

for the Pepperflash plugin. It would be nice if they could be recognized automatically.

Playback pause after 7 seconds

same thing happens to me on youtube and with store.steampowered.com.
but i can still seek in the video and resume the playback, which will pause again after 7 seconds.

using Fedora 20/x64 with the latest commit - cbe7057

No sound or squeaky voice in youtube

First of all congrats on your innovative work. I am on Ubuntu 13.10 32 bit platform. I tried it in firefox, it works ok but sometimes I get no sound while watching videos. I wanted to let you know.
Regards

No hardware acceleration

The hardware acceleration does not work. Is it yet not implemented or maybe is there any way to enable it? Thank you.

No longer working although successfully installed

Hi there,

For some reasons Flash is no longer working in Firefox for me although it is successfully enabled according to about:plugins:

More system information:

Arch Linux 64bit
freshplayerplugin-git 20140712-1
chromium-pepper-flash 14.0.0.145-1
firefox 30.0-1

I tested the following site whether Flash is working:

http://www.adobe.com/shockwave/welcome/

Let me know if I can provide you with more information to fix the issue.

Thanks ahead!

xinerama_screen setting ignored with Intel HD Graphics

I have set xinerama_screen = 1, however full-screen videos continue to play on my main display, 0. This happens regardless of which display the window containing the Flash video is on prior to pressing the full screen button. Ironically, this is the behaviour of the NPAPI Flash plugin, whereas Pepper Flash actually does the right thing when running from Chrome.
(I'm running the 20140829 nightly build from the Webupd8 PPA.)

Dual-monitor setup: full-screen video looks stretched

In dual monitor setups, full-screen videos looks stretched, as if it's displayed on both monitors but it's actually only displayed on one monitor, here's a screenshot: http://i.imgur.com/kKPbNkB.png

The video should only be displayed on one monitor and not stretched, obviously.

Also, the font looks pretty bad with just one monitor and full-screen video: http://i.imgur.com/Ygk3Rjh.png

Tested with YouTube, Ubuntu 14.04 64bit and the latest freshplayerplugin from Git.

Make ppb_graphics3d use GLES2 (and maybe EGL)

GLES2 emulation doesn't work reliable. Rework ppb_graphics3d to make use of existing GLES2 api of Mesa/prorietary drivers. Consider using EGL to acquire context.

Hints: EXT_create_context_es2_profile

Language is always Russian

When right clicking in flash, a menu is presented. All default items such as "About Flash Player" are written in Russian, regardless of the actual language the system is set to.

Youtube freezes while watching videos

I was on this website: https://www.youtube.com/watch?v=I1HpEzxYHxE on Linux Mint 16 using firefox with the fresh pepper wrapper for pepper flash version 13.0.0.214... after a few minutes nothing would respond from the video. I would have to refresh the page.

Good work so far. I'm glad someone decided to make this project. I never liked Google chrome so having an updated version on flash on Firefox is awesome. Keep up the good work.

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.