Outreach Program for Women (OPW)

Libav provides the multimedia engine that powers such diverse applications as VLC media player and YouTube. Are you interested in getting to know the FOSS community and/or interested in spending some time working on a FOSS project fulltime? Libav participates in the Outreach Program for Women (OPW), so read on, you may have come to the right place.

The types of projects we offer cover low-level C and assembly programming, doing refactoring in a large and partially crufty codebase, but also documentation, dealing with bug reports, and improving our outside communication, like our website.


To take part in OPW for Libav, you need to register with the OPW system and file an application for a project with Libav. Read through the OPW guidelines found on their website. Everything written there applies to Libav as well.

However, note that this application is only a small part of the process and the main criteria we use to accept candidates into our program are contributions and community involvement. You should first familiarize yourself with our code base and workflow, then join our communication channels to introduce yourself there and get to know the community a bit, and finally make a small contribution to Libav.


We are a community distributed over the whole world, thus our main communication media are online even though we do get together in real life at conferences, sprints, or other events a few times a year. Look at our contact page to see how to find our developer mailing list and IRC channel. Join to start lurking and feel free to say hello and introduce yourself.


IRC will be the main communication channel with your mentor and the place to ask quick questions. If you have any sort of issue, you should find a person to help you out over a synchronous communication channel here. If you aren't used to this medium please follow this tutorial.

Mailing List

This is the place for more official, asynchronous and archived communication. All contributions to Libav are submitted over and reviewed on the libav-devel mailing list.

Getting to know Libav

You should read the documentation that our project provides, especially the developer section. The info contained therein will be your bread and butter during the OPW program. If you stumble across omissions or errors (which, admittedly, you likely will) ask for help in our communication channels (see above). Fixing such issues can become one of your first contributions to Libav (see below).

Clone our Git repository, compile the project, learn how to run our test suite. All of these steps will be an essential part of almost all projects you might work on.

Small Contribution

We expect all participants in OPW to make at least one small contribution before we accept them into our program. The idea is to get a token of commitment to the project from you and get an idea of your skillset so that we can match you with a suitable project to work on.

Suitable small contributions are (in roughly ascending order of difficulty) reformatting an existing file to get to know our coding style, adding descriptions of some undocumented program options, fixing some memory management errors, refactoring return value handling, or creating a simple component for one of our libraries. Specific examples can be found on our SimpleTasks page.

OPW Projects

During the OPW project you will be working fulltime on a big task or a series of small tasks for Libav. There will be one to three mentors to guide and help you out during your project, but you should always feel free to just ask on IRC or our mailing list to receive help from the community at large.

Below you can see a list of example projects to apply for. If you have an idea for a project that interests you, but is not part of this list, feel free to tell us about it and apply for your own project idea. We welcome personal initiative.

Jack of all Trades

Instead of working on a single large project you can work on a series of small bits and pieces of moderate difficulty. This will give you the opportunity to learn multiple parts of the code base, fix bugs, do some refactoring, improve documentation, add tests, implement small bits and pieces all over the map...

mentor: Diego Biurrun

Doxygen documentation

Large parts of the Libav API remain poorly documented. If you are interested in reading, understanding, and documenting C code, this is a good project for you.

This project requires a firm command of the English language.

mentor: Diego Biurrun, Anton Khirnov, Luca Barbato

CLI tools documentation

Libav contains some command line interface (CLI) tools for transcoding, probing, and streaming. Their manual pages and online documentation are incomplete. As part of this project you would learn how to use these tools and fill in missing bits and pieces of documentation.

This project requires a firm command of the English language.

mentor: Diego Biurrun

Restructuring the MPEG video family of codecs

Many encoders and decoders currently use the MpegEncContext structure and its associated API. This structure is a huge monolithic blob which combines the features of all those encoders and decoders, thus making it very fragile and hard to understand.

The goal of this project is splitting out parts of the structure / API into self-contained structures that are easier to grasp, while still allowing code reuse where appropriate.

mentor: Anton Khirnov, Diego Biurrun, Vittorio Giovara

Spin off build system into a separate project

Our build system is neat enough to make into a more general solution to be reused by other projects.

The goal of this project is to achieve exactly that. Intermediate steps will be reading, understanding and documenting the current build system, refactoring parts that can be generalized further and finally creating a prototype conversion of some project to this new build system.

You will require skills in POSIX shell, GNU Make and a firm command of English.

mentor: Diego Biurrun, Luca Barbato

The Grand Refactoring (working title)

Many parts of the libav codebase are still unnecessarily monolithic. This makes custom builds that only support a subset of the multitude of formats we have larger than they need to be and slows down the compiling time on multicore systems.

The goal of this project will be to locate parts that can be separated and refactor the code so that each subpart can be compiled standalone so as to not increase the size of a custom configuration without the part.

A suitable qualification task for this project is picking a simple encoder/decoder pair and splitting it cleanly.

mentor: Diego Biurrun, Luca Barbato

Rewrite the ASF muxer and demuxer

Our current ASF muxer and demuxer were written using reverse engineering when the specification was not yet available. Because of that, they are hard to understand, contain many bugs and do not support the format fully. The goal of this project would be to rewrite those old parts of the ASF muxer and demuxer so that the new code:

mentor: Kostya Shishkov, Martin Storsjö, Vladimir Pantelic

Support for concatenation in avconv

One of the most important features still missing from our multimedia transcoder avconv is proper support for concatenating (joining) media streams. The goals of this project would be to:

A qualification task would be adding support for looping of arbitrary input files, to familiarize yourself with avconv.

mentor: Anton Khirnov

Rewrite the RealMedia demuxer

The current RealMedia support is workable but it started from early attempts to support the yet to be documented format. Some features (like multirate files) are not supported properly either. The project aims to be a full blown rewrite to make a feature-complete demuxer.

mentor: Kostya Shishkov

Extend the libavfilter filter collection

Libavfilter, our library for audio and video filtering, is slowly reaching the level of mature and usable code, but the number of filters in it is still very small. The goal of this project would be to find the most useful filters (under appropriate licences) in projects like Avisynth, SoX, ImageMagick, etc. and port them to libavfilter. Depending on the participant's experience level, filters could also be written from scratch.

A qualification task would be writing a very simple filter, to familiarize yourself with libavfilter.

mentor: Anton Khirnov, Justin Ruggles, Vittorio Giovara

Streaming Protocol Improvements

Implement support for producing data for Adobe HTTP Dynamic Streaming and MPEG DASH and implement support for receiving the same.

Alternatively you can also implement support for another new streaming protocol we currently don't support, or improve the ones we currently support.

mentor: Martin Storsjö, Luca Barbato


HWAccel is the abstraction layer for accessing hardware decoding routines for Libav. Using hardware accelerated decoding, leverages off the CPU most of the computing powers and saves power on mobile architectures.

The current implementation is very well tuned and already in place but it suffers from the fact that callers need to know which architecture they are going to target. It would be nice that with a simple and arch-independent API users may get to the hardware decoding facilities simply and easily.

See https://wiki.libav.org/Blueprint/HWAccel2 for more information.

Mentor: Luca Barbato

Rewrite avplay with SDL2

avplay is the Libav test video player, it allows to play audio and video, display stats, and even seek. It is built around the SDL toolkit (the same that powers several of your videogames) but it is starting to show its age.

Modern display technologies and new features are added to SDL2 on a daily basis. The candidate should demonstrate ability with multimedia concepts and rendering pipelines.

Mentor: Vittorio Giovara

Further OPW Project Candidates

These are project ideas that we will try to find a mentor for if you are interested.

AMV demuxer

There is currently no demuxer for AMV. AMV is a comparatively simple multimedia container format, so this is an accessible task for somebody interested in creating a standalone library component.

mentor: (Kostya Shishkov)

Vivo demuxer

There is currently no demuxer for Vivo, but there is one in MPlayer, so libavformat needs a native Vivo demuxer. Vivo is a comparatively simple multimedia container format, so this is an accessible task for somebody interested in creating a standalone library component.

mentor: (Kostya Shishkov)

Adobe DNG Decoder (Basic Support)

Adobe Digital Negative (DNG) is an attempt at a universal file format for raw camera images. Most camera manufacturers have their own proprietary raw image format. Adobe provides tools for converting these to DNG with minimal or no loss of information for more reliable long-term support in a format with an open specification.

The project goal would be to add features required for basic support of DNG files. Some of these include:

mentor: (Justin Ruggles)

Core Audio Format (CAF) muxer

Libav lacks a muxer for the Core Audio Format (CAF) container format, which is popular in the Apple computing ecosystem. CAF is a comparatively simple multimedia container format, so this is an accessible task for somebody interested in creating a standalone library component.

Converting x86 inline assembly to standalone assembly

Libav contains a lot of legacy GCC inline assembly that should be converted to standalone NASM/YASM syntax for better performance, portability, and other reasons. This tasks allows you to get to know the lowest levels of multimedia programming where you get to wrangle bits directly.

Native DVD support

Most of the open source support for DVDs is available through libdvdread and libdvdnav. Currently there is some effort to unify them in a single library (libdvd5). An additional step would be factoring the non-interactive part of into the libav codebase to leverage even more code and leave as stand alone library the parts that require some kind of interaction.

mentor: (Diego Pettenò)

Language bindings

Provide bindings for non-C languages. The languages can be any among Perl, Python, Ruby, Go and such.


The bindings should be using only the public API.

mentor: (Luca Barbato)

Assembly Unit Testing Framework

Libav has a lot of assembly and not enough tests for it. Your job is to write a unit testing framework for assembly. The framework should work across all supported architectures and operating systems. The framework should measure exactly how fast an individual function is (e.g. using START/STOP_TIMER). The framework should be able to test functions in isolation. x264's checkasm can be used as a reference.

The qualification task will be to implement at least one unit test and have an idea of how to do the rest.

mentor: (Daniel Kang)

MPEG-4 ALS Roundup

This task is to update and enhance the existing ALS decoder as well as integrate and enhance the rudimentary encoder found at: https://github.com/justinruggles/FFmpeg-alsenc

Possible features are:

Mentor: (Justin Ruggles)

Rewrite avserver

Libav needs a better system to serve streams, the current codebase has a number of design defects showing its age. A new avserver should be written from scratch, leveraging the piled-up knowledge.

The implementation will be incrementally complex and possibly modular.

Ideally the first implementation can be made using a poll/event loop and then moved to use threads.

Mentor: (Luca Barbato)

DTS-LBR decoder

This is the DTS equivalent to E-AC3 but not technically related to DTS/DTS-HD. The task is to find a way of making the official decoder decode just the LBR stream (and not mix it into the main audio) and use that to verify decoder compliance of the decoder you wrote. The spec may be incomplete or require parts to be reverse engineered from the binary.