<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.multimedia.cx/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rogerdpack</id>
	<title>MultimediaWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.multimedia.cx/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rogerdpack"/>
	<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php/Special:Contributions/Rogerdpack"/>
	<updated>2026-05-01T08:23:36Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://wiki.multimedia.cx/index.php?title=FFmpeg_codec_HOWTO&amp;diff=15483</id>
		<title>FFmpeg codec HOWTO</title>
		<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php?title=FFmpeg_codec_HOWTO&amp;diff=15483"/>
		<updated>2020-04-25T04:45:45Z</updated>

		<summary type="html">&lt;p&gt;Rogerdpack: up to date!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is meant as an introduction to the internal codec API in [[FFmpeg]].&lt;br /&gt;
It will also show how the codecs are connected with the demuxers. This is by&lt;br /&gt;
no means a complete guide but enough to understand how to add a codec to FFmpeg.&lt;br /&gt;
[[RealAudio cook|Cook]] is used as an example throughout.&lt;br /&gt;
&lt;br /&gt;
== registering the codec ==&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/avcodec.h ===&lt;br /&gt;
The first thing to look at is the AVCodec struct.&lt;br /&gt;
&lt;br /&gt;
 typedef struct AVCodec {&lt;br /&gt;
     const char *name;&lt;br /&gt;
     enum CodecType type;&lt;br /&gt;
     enum CodecID id;&lt;br /&gt;
     int priv_data_size;&lt;br /&gt;
     int (*init)(AVCodecContext *);&lt;br /&gt;
     int (*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);&lt;br /&gt;
     int (*close)(AVCodecContext *);&lt;br /&gt;
     int (*decode)(AVCodecContext *, void *outdata, int *outdata_size,&lt;br /&gt;
                   uint8_t *buf, int buf_size);&lt;br /&gt;
     int capabilities;&lt;br /&gt;
     struct AVCodec *next;&lt;br /&gt;
     void (*flush)(AVCodecContext *);&lt;br /&gt;
     const AVRational *supported_framerates; ///array of supported framerates, or NULL if any, array is terminated by {0,0}&lt;br /&gt;
     const enum PixelFormat *pix_fmts;       ///array of supported pixel formats, or NULL if unknown, array is terminanted by -1&lt;br /&gt;
 } AVCodec;&lt;br /&gt;
&lt;br /&gt;
Here we can see that we have some elements to name the codec, what type it is (audio/video), the supported pixel formats and some function&lt;br /&gt;
pointers for init/encode/decode and close. Now lets see how it is used.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c ===&lt;br /&gt;
If we look in this file at the bottom we can see this code:&lt;br /&gt;
&lt;br /&gt;
 AVCodec cook_decoder =&lt;br /&gt;
 {&lt;br /&gt;
     .name           = &amp;quot;cook&amp;quot;,&lt;br /&gt;
     .type           = CODEC_TYPE_AUDIO,&lt;br /&gt;
     .id             = CODEC_ID_COOK,&lt;br /&gt;
     .priv_data_size = sizeof(COOKContext),&lt;br /&gt;
     .init           = cook_decode_init,&lt;br /&gt;
     .close          = cook_decode_close,&lt;br /&gt;
     .decode         = cook_decode_frame,&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
First we get an AVCodec struct named cook_decoder. And then we set the variables of cook_decoder. Note that we only set the variables that are needed. Currently there is no encoder so we don't set any. If we now look at the id variable we can see that CODEC_ID_COOK isn't defined in libavcodec/cook.c. It is declared in avcodec.h.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/avcodec.h ===&lt;br /&gt;
&lt;br /&gt;
Here we will find the CodecID enumeration.&lt;br /&gt;
&lt;br /&gt;
 enum CodecID {&lt;br /&gt;
 ...&lt;br /&gt;
 CODEC_ID_GSM,&lt;br /&gt;
 CODEC_ID_QDM2,&lt;br /&gt;
 CODEC_ID_COOK,&lt;br /&gt;
 CODEC_ID_TRUESPEECH,&lt;br /&gt;
 CODEC_ID_TTA,&lt;br /&gt;
 ...&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
CODEC_ID_COOK is there in the list. This is the list of all supported codecs in FFmpeg, the list is fixed and used internally to id every codec. Changing the order would break binary compatibility.&lt;br /&gt;
&lt;br /&gt;
This is all enough to declare a codec. Now we must register them for internal use also. This is done at runtime.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/allcodecs.c ===&lt;br /&gt;
In this file we have the avcodec_register_all() function, it has entries like this for all codecs.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
    extern AVCodec cook_decoder; // must end with _decoder&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
This is expanded at configure time into a REGISTER_CODEC(...)&lt;br /&gt;
&lt;br /&gt;
configure accomplishes this by running something like:&lt;br /&gt;
&lt;br /&gt;
 sed -n 's/^[^#]*DEC.*, *\(.*\)).*/\1_decoder/p' libavcodec/allcodecs.c&lt;br /&gt;
&lt;br /&gt;
So adding an entry in allcodecs.c and reconfigure is enough to add the needed define. Now we have everything to hookup a codec.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/Makefile ===&lt;br /&gt;
In this file we define the objects on which a codec depends. For example, cook uses fft and mdct code so it depends on the mdct.o and fft.o object files as well as the cook.o object file.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 OBJS-$(CONFIG_COOK_DECODER)            += cook.o mdct.o fft.o&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== FFmpeg demuxer connection ==&lt;br /&gt;
&lt;br /&gt;
: ''[[FFmpeg demuxer howto]]''&lt;br /&gt;
&lt;br /&gt;
=== libavformat/rm.c ===&lt;br /&gt;
&lt;br /&gt;
If we think of an imaginary rm file that ffmpeg is about to process, the first thing that happens is that it is identified&lt;br /&gt;
as a rm file. It is passed on to the rm demuxer ([http://svn.mplayerhq.hu/ffmpeg/trunk/libavformat/rmdec.c?view=markup rmdec.c]). The rm demuxer looks through the file and finds out that it is a&lt;br /&gt;
cook file.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 } else if (!strcmp(buf, &amp;quot;cook&amp;quot;)) {&lt;br /&gt;
 st-&amp;gt;codec-&amp;gt;codec_id = CODEC_ID_COOK;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Now ffmpeg knows what codec to init and where to send the payload from the container. So back to cook.c and the initialization process.&lt;br /&gt;
&lt;br /&gt;
== codec code ==&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c Init ===&lt;br /&gt;
After ffmpeg knows what codec to use, it calls the declared initialization function pointer declared in the codecs AVCodec struct. In&lt;br /&gt;
cook.c it is called cook_decode_init. Here we setup as much as we can before we start decoding. The following things should be handled in the init, vlc table initialization, table generation, memory allocation and extradata parsing.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c Close ===&lt;br /&gt;
The cook_decode_close function is the codec clean-up call. All memory, vlc tables, etc. should be freed here.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c Decode ===&lt;br /&gt;
In cook.c the name of the decode call is cook_decode_frame.&lt;br /&gt;
&lt;br /&gt;
 static int cook_decode_frame(AVCodecContext *avctx,&lt;br /&gt;
             void *data, int *data_size,&lt;br /&gt;
             uint8_t *buf, int buf_size) {&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
The function has 5 arguments:&lt;br /&gt;
* avctx is a pointer to an AVCodecContext&lt;br /&gt;
* data is the pointer to the output buffer&lt;br /&gt;
* data_size is a variable that should be set to the output buffer size in bytes (this is usually the number of samples decoded * the number of channels * the byte size of a sample)&lt;br /&gt;
* buf is the pointer to the input buffer&lt;br /&gt;
* buf_size is the byte size of the input buffer&lt;br /&gt;
&lt;br /&gt;
The decode function shall return the number of bytes consumed from the input buffer or -1 in case of an error. If there is no error during decoding, the return value is usually buf_size as buf should only contain one 'frame' of data. Bitstream parsers to split the bitstream into 'frames' used to be part of the codec so a call to the decode function could have consumed less than buf_size bytes from buf. It is now encouraged that bitstream parsers be separate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That's how it works without too much detail.&lt;br /&gt;
&lt;br /&gt;
=== The Glue codec template ===&lt;br /&gt;
The imaginary Glue audio codec will serve as a base to exhibit bitstream reading, vlc decoding and other things.&lt;br /&gt;
The code is purely fictional and is sometimes written purely for the sake of example. No attempt is made to prevent invalid&lt;br /&gt;
data manipulation.&lt;br /&gt;
&lt;br /&gt;
The Glue codec follows.&lt;br /&gt;
&lt;br /&gt;
[http://wiki.multimedia.cx/index.php?title=FFmpeg_codec_howto&amp;amp;oldid=7347 non-colored version]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* The following includes have the bitstream reader, various dsp functions and the various defaults */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#define ALT_BITSTREAM_READER&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;avcodec.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;bitstream.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;dsputil.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* This includes the tables needed for the Glue codec template */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;gluedata.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Here we declare the struct used for the codec private data */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;typedef&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;struct&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GetBitContext       gb;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    FFTContext          fft_ctx;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    VLC                 vlc_table;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    MDCTContext         mdct_ctx;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;*              sample_buffer;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;} GLUEContext;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* The init function */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; glue_decode_init(AVCodecContext *avctx)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GLUEContext *q = avctx-&amp;amp;gt;priv_data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* This imaginary codec uses one fft, one mdct and one vlc table. */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_mdct_init(&amp;amp;amp;q-&amp;amp;gt;mdct_ctx, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;10&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// 2^10 == size of mdct, 1 == inverse mdct&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_fft_init(&amp;amp;amp;q-&amp;amp;gt;fft_ctx, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);       &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// 2^9 == size of fft, 0 == inverse fft&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    init_vlc (&amp;amp;amp;q-&amp;amp;gt;vlc_table, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;24&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           vlctable_huffbits, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           vlctable_huffcodes, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// look in bitstream.h for the meaning of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* We also need to allocate a sample buffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    q-&amp;amp;gt;sample_buffer = av_mallocz(&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;sizeof&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;)*&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1024&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// here we used av_mallocz instead of av_malloc&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;                                                        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// av_mallocz memsets the whole buffer to 0&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Check if the allocation was successful */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(q-&amp;amp;gt;sample_buffer == NULL)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; -&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* return 0 for a successful init, -1 for failure */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* This is the main decode function */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; glue_decode_frame(AVCodecContext *avctx,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; *data, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; *data_size,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           uint8_t *buf, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; buf_size)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GLUEContext *q = avctx-&amp;amp;gt;priv_data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    int16_t *outbuffer = data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* We know what the arguments for this function are from above&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       now we just have to decode this imaginary codec, the made up&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       bitstream format is as follows:&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       12 bits representing the amount of samples&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       1 bit fft or mdct coded coeffs, 0 for fft/1 for mdct&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;         read 13 bits representing the amount of vlc coded fft data coeffs&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;         read 10 bits representing the amount of vlc coded mdct data coeffs&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       (...bits representing the coeffs...)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       5 bits of dummy data that should be ignored&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       32 bits the hex value 0x12345678, used for integrity check&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;    */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Declare the needed variables */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; samples, coeffs, i, fft;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; mdct_tmp[&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1024&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;];&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we init the bitstream reader, we start at the beginning of the inbuffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    init_get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, buf, buf_size*&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;8&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//the buf_size is in bytes but we need bits&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we take 12 bits to get the amount of samples the current frame has */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    samples = get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;12&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we check if we have fft or mdct coeffs */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    fft = get_bits1(&amp;amp;amp;q-&amp;amp;gt;gb);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (fft) {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//fft coeffs, get how many&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        coeffs = get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;13&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    } &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//mdct coeffs, get how many&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        coeffs = get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;10&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    }&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now decode the vlc coded coeffs to the sample_buffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;for&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (i=&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; ; i&amp;amp;lt;coeffs ; i++)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        q-&amp;amp;gt;sample_buffer[i] = get_vlc2(&amp;amp;amp;q-&amp;amp;gt;gb, q-&amp;amp;gt;vlc_table.table, vlc_table.bits, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//read about the arguments in bitstream.h&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we need to transform the coeffs to samples */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (fft) {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//The fft is done inplace&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        ff_fft_permute(&amp;amp;amp;q-&amp;amp;gt;fft_ctx, (FFTComplex *) q-&amp;amp;gt;sample_buffer);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        ff_fft_calc(&amp;amp;amp;q-&amp;amp;gt;fft_ctx, (FFTComplex *) q-&amp;amp;gt;sample_buffer);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    } &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//And we pretend that the mdct is also inplace&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        ff_imdct_calc(&amp;amp;amp;q-&amp;amp;gt;mdct_ctx, q-&amp;amp;gt;sample_buffer, q-&amp;amp;gt;sample_buffer, mdct_tmp);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    }&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* To make it easy the stream can only be 16 bits mono, so let's convert it to that */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;for&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (i=&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; ; i&amp;amp;lt;samples ; i++)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        outbuffer[i] = (int16_t)q-&amp;amp;gt;sample_buffer[i];&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Report how many samples we got */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    *data_size = samples;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Skip the dummy data bits */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    skip_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Check if the buffer was consumed ok */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (get_bits(&amp;amp;amp;q-&amp;amp;gt;gb,&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;32&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;) != &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008080;&amp;quot;&amp;gt;0x12345678&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;) {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        av_log(avctx,AV_LOG_ERROR,&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #dd0000;&amp;quot;&amp;gt;&amp;quot;Stream error, integrity check failed!&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #ff00ff;&amp;quot;&amp;gt;\n&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #dd0000;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; -&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    }&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;&lt;br /&gt;
     /* The decision between erroring out or not in case of unexpected data&lt;br /&gt;
        should be made so that the output quality is maximized.&lt;br /&gt;
        This means that if undamaged data is assumed then unused/resereved values&lt;br /&gt;
        should lead to warnings but not failure. (assumption of slightly non compliant&lt;br /&gt;
        file)&lt;br /&gt;
        OTOH if possibly damaged data is assumed and it is assumed that the original&lt;br /&gt;
        did contain specific values in reserved/unused fields then finding unexpected&lt;br /&gt;
        values should trigger error concealment code and the decoder/demuxer should&lt;br /&gt;
        attempt to resync.&lt;br /&gt;
        The decision between these 2 should be made by using &lt;br /&gt;
        AVCodecContext.error_recognition unless its a clear case where only one of&lt;br /&gt;
        the 2 makes sense.&lt;br /&gt;
     */&lt;br /&gt;
 &amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Return the amount of bytes consumed if everything was ok */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; *data_size*&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;sizeof&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(int16_t);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* the uninit function, here we just do the inverse of the init */&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; glue_decode_close(AVCodecContext *avctx)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GLUEContext *q = avctx-&amp;amp;gt;priv_data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free allocated memory buffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    av_free(q-&amp;amp;gt;sample_buffer);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free the fft transform */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_fft_end(&amp;amp;amp;q-&amp;amp;gt;fft_ctx);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free the mdct transform */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_mdct_end(&amp;amp;amp;q-&amp;amp;gt;mdct_ctx);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free the vlc table */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    free_vlc(&amp;amp;amp;q-&amp;amp;gt;vlc_table);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Return 0 if everything is ok, -1 if not */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;AVCodec glue_decoder =&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .name           = &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #dd0000;&amp;quot;&amp;gt;&amp;quot;glue&amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .type           = CODEC_TYPE_AUDIO,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .id             = CODEC_ID_GLUE,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .priv_data_size = &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;sizeof&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(GLUEContext),&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .init           = glue_decode_init,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .close          = glue_decode_close,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .decode         = glue_decode_frame,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;};&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== trouble shooting ===&lt;br /&gt;
Invalid pixel format '(null)'&lt;br /&gt;
Output pad &amp;quot;default&amp;quot; with type video of the filter instance &amp;quot;Parsed_null_0&amp;quot; of null not connected to any destination&lt;br /&gt;
Error opening filters!&lt;br /&gt;
&lt;br /&gt;
meant encoder's description  &lt;br /&gt;
.pix_fmts   needs to end with AV_PIX_FMT_NONE&lt;br /&gt;
&lt;br /&gt;
Assertion *(const AVClass **)avctx-&amp;gt;priv_data == codec-&amp;gt;priv_class failed at libavcodec/utils.c:1554&lt;br /&gt;
&lt;br /&gt;
meant &amp;quot;your first member of your Context struct needs to be an AVClass *&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if it works but just says &amp;quot;&amp;quot;0 packets muxed&amp;quot;&amp;quot; you need to set the *got_packet return value to &amp;quot;1&amp;quot; or the muxer won't mux what you're giving it&lt;br /&gt;
&lt;br /&gt;
== see also ==&lt;br /&gt;
&lt;br /&gt;
* [[FFmpeg demuxer howto]]&lt;br /&gt;
* [[FFmpeg programming conventions]]&lt;br /&gt;
* [[FFmpeg_filter_HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[Category:FFmpeg Tutorials]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Rogerdpack</name></author>
	</entry>
	<entry>
		<id>https://wiki.multimedia.cx/index.php?title=FFmpeg_codec_HOWTO&amp;diff=15166</id>
		<title>FFmpeg codec HOWTO</title>
		<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php?title=FFmpeg_codec_HOWTO&amp;diff=15166"/>
		<updated>2015-10-13T23:50:10Z</updated>

		<summary type="html">&lt;p&gt;Rogerdpack: /* trouble shooting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is meant as an introduction to the internal codec API in [[FFmpeg]].&lt;br /&gt;
It will also show how the codecs are connected with the demuxers. This is by&lt;br /&gt;
no means a complete guide but enough to understand how to add a codec to FFmpeg.&lt;br /&gt;
[[RealAudio cook|Cook]] is used as an example throughout.&lt;br /&gt;
&lt;br /&gt;
== registering the codec ==&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/avcodec.h ===&lt;br /&gt;
The first thing to look at is the AVCodec struct.&lt;br /&gt;
&lt;br /&gt;
 typedef struct AVCodec {&lt;br /&gt;
     const char *name;&lt;br /&gt;
     enum CodecType type;&lt;br /&gt;
     enum CodecID id;&lt;br /&gt;
     int priv_data_size;&lt;br /&gt;
     int (*init)(AVCodecContext *);&lt;br /&gt;
     int (*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);&lt;br /&gt;
     int (*close)(AVCodecContext *);&lt;br /&gt;
     int (*decode)(AVCodecContext *, void *outdata, int *outdata_size,&lt;br /&gt;
                   uint8_t *buf, int buf_size);&lt;br /&gt;
     int capabilities;&lt;br /&gt;
     struct AVCodec *next;&lt;br /&gt;
     void (*flush)(AVCodecContext *);&lt;br /&gt;
     const AVRational *supported_framerates; ///array of supported framerates, or NULL if any, array is terminated by {0,0}&lt;br /&gt;
     const enum PixelFormat *pix_fmts;       ///array of supported pixel formats, or NULL if unknown, array is terminanted by -1&lt;br /&gt;
 } AVCodec;&lt;br /&gt;
&lt;br /&gt;
Here we can see that we have some elements to name the codec, what type it is (audio/video), the supported pixel formats and some function&lt;br /&gt;
pointers for init/encode/decode and close. Now lets see how it is used.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c ===&lt;br /&gt;
If we look in this file at the bottom we can see this code:&lt;br /&gt;
&lt;br /&gt;
 AVCodec cook_decoder =&lt;br /&gt;
 {&lt;br /&gt;
     .name           = &amp;quot;cook&amp;quot;,&lt;br /&gt;
     .type           = CODEC_TYPE_AUDIO,&lt;br /&gt;
     .id             = CODEC_ID_COOK,&lt;br /&gt;
     .priv_data_size = sizeof(COOKContext),&lt;br /&gt;
     .init           = cook_decode_init,&lt;br /&gt;
     .close          = cook_decode_close,&lt;br /&gt;
     .decode         = cook_decode_frame,&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
First we get an AVCodec struct named cook_decoder. And then we set the variables of cook_decoder. Note that we only set the variables that are needed. Currently there is no encoder so we don't set any. If we now look at the id variable we can see that CODEC_ID_COOK isn't defined in libavcodec/cook.c. It is declared in avcodec.h.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/avcodec.h ===&lt;br /&gt;
&lt;br /&gt;
Here we will find the CodecID enumeration.&lt;br /&gt;
&lt;br /&gt;
 enum CodecID {&lt;br /&gt;
 ...&lt;br /&gt;
 CODEC_ID_GSM,&lt;br /&gt;
 CODEC_ID_QDM2,&lt;br /&gt;
 CODEC_ID_COOK,&lt;br /&gt;
 CODEC_ID_TRUESPEECH,&lt;br /&gt;
 CODEC_ID_TTA,&lt;br /&gt;
 ...&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
CODEC_ID_COOK is there in the list. This is the list of all supported codecs in FFmpeg, the list is fixed and used internally to id every codec. Changing the order would break binary compatibility.&lt;br /&gt;
&lt;br /&gt;
This is all enough to declare a codec. Now we must register them for internal use also. This is done at runtime.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/allcodecs.c ===&lt;br /&gt;
In this file we have the avcodec_register_all() function, it has entries like this for all codecs.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
     REGISTER_DECODER(COOK, cook);&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
This macro expands to a register_avcodec() call which registers a codec for internal use.&lt;br /&gt;
Note that register_avcodec() will only be called when CONFIG_COOK_DECODER is defined.&lt;br /&gt;
This allows to not compile the decoder code for a specific codec.&lt;br /&gt;
But where is it defined? This is extracted by configure with this command line:&lt;br /&gt;
&lt;br /&gt;
 sed -n 's/^[^#]*DEC.*, *\(.*\)).*/\1_decoder/p' libavcodec/allcodecs.c&lt;br /&gt;
&lt;br /&gt;
So adding a REGISTER_DECODER(NEW, new) entry in allcodecs.c and reconfigure is enough to add the needed define. Now we have everything to hookup a codec.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/Makefile ===&lt;br /&gt;
In this file we define the objects on which a codec depends. For example, cook uses fft and mdct code so it depends on the mdct.o and fft.o object files as well as the cook.o object file.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 OBJS-$(CONFIG_COOK_DECODER)            += cook.o mdct.o fft.o&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== FFmpeg demuxer connection ==&lt;br /&gt;
&lt;br /&gt;
: ''[[FFmpeg demuxer howto]]''&lt;br /&gt;
&lt;br /&gt;
=== libavformat/rm.c ===&lt;br /&gt;
&lt;br /&gt;
If we think of an imaginary rm file that ffmpeg is about to process, the first thing that happens is that it is identified&lt;br /&gt;
as a rm file. It is passed on to the rm demuxer ([http://svn.mplayerhq.hu/ffmpeg/trunk/libavformat/rmdec.c?view=markup rmdec.c]). The rm demuxer looks through the file and finds out that it is a&lt;br /&gt;
cook file.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 } else if (!strcmp(buf, &amp;quot;cook&amp;quot;)) {&lt;br /&gt;
 st-&amp;gt;codec-&amp;gt;codec_id = CODEC_ID_COOK;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Now ffmpeg knows what codec to init and where to send the payload from the container. So back to cook.c and the initialization process.&lt;br /&gt;
&lt;br /&gt;
== codec code ==&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c Init ===&lt;br /&gt;
After ffmpeg knows what codec to use, it calls the declared initialization function pointer declared in the codecs AVCodec struct. In&lt;br /&gt;
cook.c it is called cook_decode_init. Here we setup as much as we can before we start decoding. The following things should be handled in the init, vlc table initialization, table generation, memory allocation and extradata parsing.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c Close ===&lt;br /&gt;
The cook_decode_close function is the codec clean-up call. All memory, vlc tables, etc. should be freed here.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c Decode ===&lt;br /&gt;
In cook.c the name of the decode call is cook_decode_frame.&lt;br /&gt;
&lt;br /&gt;
 static int cook_decode_frame(AVCodecContext *avctx,&lt;br /&gt;
             void *data, int *data_size,&lt;br /&gt;
             uint8_t *buf, int buf_size) {&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
The function has 5 arguments:&lt;br /&gt;
* avctx is a pointer to an AVCodecContext&lt;br /&gt;
* data is the pointer to the output buffer&lt;br /&gt;
* data_size is a variable that should be set to the output buffer size in bytes (this is usually the number of samples decoded * the number of channels * the byte size of a sample)&lt;br /&gt;
* buf is the pointer to the input buffer&lt;br /&gt;
* buf_size is the byte size of the input buffer&lt;br /&gt;
&lt;br /&gt;
The decode function shall return the number of bytes consumed from the input buffer or -1 in case of an error. If there is no error during decoding, the return value is usually buf_size as buf should only contain one 'frame' of data. Bitstream parsers to split the bitstream into 'frames' used to be part of the codec so a call to the decode function could have consumed less than buf_size bytes from buf. It is now encouraged that bitstream parsers be separate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That's how it works without too much detail.&lt;br /&gt;
&lt;br /&gt;
=== The Glue codec template ===&lt;br /&gt;
The imaginary Glue audio codec will serve as a base to exhibit bitstream reading, vlc decoding and other things.&lt;br /&gt;
The code is purely fictional and is sometimes written purely for the sake of example. No attempt is made to prevent invalid&lt;br /&gt;
data manipulation.&lt;br /&gt;
&lt;br /&gt;
The Glue codec follows.&lt;br /&gt;
&lt;br /&gt;
[http://wiki.multimedia.cx/index.php?title=FFmpeg_codec_howto&amp;amp;oldid=7347 non-colored version]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* The following includes have the bitstream reader, various dsp functions and the various defaults */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#define ALT_BITSTREAM_READER&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;avcodec.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;bitstream.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;dsputil.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* This includes the tables needed for the Glue codec template */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;gluedata.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Here we declare the struct used for the codec private data */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;typedef&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;struct&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GetBitContext       gb;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    FFTContext          fft_ctx;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    VLC                 vlc_table;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    MDCTContext         mdct_ctx;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;*              sample_buffer;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;} GLUEContext;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* The init function */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; glue_decode_init(AVCodecContext *avctx)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GLUEContext *q = avctx-&amp;amp;gt;priv_data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* This imaginary codec uses one fft, one mdct and one vlc table. */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_mdct_init(&amp;amp;amp;q-&amp;amp;gt;mdct_ctx, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;10&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// 2^10 == size of mdct, 1 == inverse mdct&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_fft_init(&amp;amp;amp;q-&amp;amp;gt;fft_ctx, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);       &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// 2^9 == size of fft, 0 == inverse fft&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    init_vlc (&amp;amp;amp;q-&amp;amp;gt;vlc_table, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;24&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           vlctable_huffbits, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           vlctable_huffcodes, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// look in bitstream.h for the meaning of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* We also need to allocate a sample buffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    q-&amp;amp;gt;sample_buffer = av_mallocz(&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;sizeof&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;)*&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1024&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// here we used av_mallocz instead of av_malloc&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;                                                        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// av_mallocz memsets the whole buffer to 0&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Check if the allocation was successful */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(q-&amp;amp;gt;sample_buffer == NULL)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; -&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* return 0 for a successful init, -1 for failure */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* This is the main decode function */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; glue_decode_frame(AVCodecContext *avctx,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; *data, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; *data_size,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           uint8_t *buf, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; buf_size)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GLUEContext *q = avctx-&amp;amp;gt;priv_data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    int16_t *outbuffer = data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* We know what the arguments for this function are from above&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       now we just have to decode this imaginary codec, the made up&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       bitstream format is as follows:&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       12 bits representing the amount of samples&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       1 bit fft or mdct coded coeffs, 0 for fft/1 for mdct&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;         read 13 bits representing the amount of vlc coded fft data coeffs&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;         read 10 bits representing the amount of vlc coded mdct data coeffs&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       (...bits representing the coeffs...)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       5 bits of dummy data that should be ignored&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       32 bits the hex value 0x12345678, used for integrity check&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;    */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Declare the needed variables */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; samples, coeffs, i, fft;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; mdct_tmp[&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1024&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;];&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we init the bitstream reader, we start at the beginning of the inbuffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    init_get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, buf, buf_size*&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;8&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//the buf_size is in bytes but we need bits&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we take 12 bits to get the amount of samples the current frame has */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    samples = get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;12&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we check if we have fft or mdct coeffs */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    fft = get_bits1(&amp;amp;amp;q-&amp;amp;gt;gb);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (fft) {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//fft coeffs, get how many&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        coeffs = get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;13&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    } &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//mdct coeffs, get how many&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        coeffs = get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;10&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    }&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now decode the vlc coded coeffs to the sample_buffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;for&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (i=&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; ; i&amp;amp;lt;coeffs ; i++)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        q-&amp;amp;gt;sample_buffer[i] = get_vlc2(&amp;amp;amp;q-&amp;amp;gt;gb, q-&amp;amp;gt;vlc_table.table, vlc_table.bits, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//read about the arguments in bitstream.h&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we need to transform the coeffs to samples */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (fft) {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//The fft is done inplace&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        ff_fft_permute(&amp;amp;amp;q-&amp;amp;gt;fft_ctx, (FFTComplex *) q-&amp;amp;gt;sample_buffer);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        ff_fft_calc(&amp;amp;amp;q-&amp;amp;gt;fft_ctx, (FFTComplex *) q-&amp;amp;gt;sample_buffer);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    } &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//And we pretend that the mdct is also inplace&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        ff_imdct_calc(&amp;amp;amp;q-&amp;amp;gt;mdct_ctx, q-&amp;amp;gt;sample_buffer, q-&amp;amp;gt;sample_buffer, mdct_tmp);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    }&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* To make it easy the stream can only be 16 bits mono, so let's convert it to that */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;for&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (i=&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; ; i&amp;amp;lt;samples ; i++)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        outbuffer[i] = (int16_t)q-&amp;amp;gt;sample_buffer[i];&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Report how many samples we got */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    *data_size = samples;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Skip the dummy data bits */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    skip_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Check if the buffer was consumed ok */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (get_bits(&amp;amp;amp;q-&amp;amp;gt;gb,&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;32&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;) != &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008080;&amp;quot;&amp;gt;0x12345678&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;) {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        av_log(avctx,AV_LOG_ERROR,&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #dd0000;&amp;quot;&amp;gt;&amp;quot;Stream error, integrity check failed!&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #ff00ff;&amp;quot;&amp;gt;\n&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #dd0000;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; -&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    }&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;&lt;br /&gt;
     /* The decision between erroring out or not in case of unexpected data&lt;br /&gt;
        should be made so that the output quality is maximized.&lt;br /&gt;
        This means that if undamaged data is assumed then unused/resereved values&lt;br /&gt;
        should lead to warnings but not failure. (assumption of slightly non compliant&lt;br /&gt;
        file)&lt;br /&gt;
        OTOH if possibly damaged data is assumed and it is assumed that the original&lt;br /&gt;
        did contain specific values in reserved/unused fields then finding unexpected&lt;br /&gt;
        values should trigger error concealment code and the decoder/demuxer should&lt;br /&gt;
        attempt to resync.&lt;br /&gt;
        The decision between these 2 should be made by using &lt;br /&gt;
        AVCodecContext.error_recognition unless its a clear case where only one of&lt;br /&gt;
        the 2 makes sense.&lt;br /&gt;
     */&lt;br /&gt;
 &amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Return the amount of bytes consumed if everything was ok */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; *data_size*&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;sizeof&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(int16_t);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* the uninit function, here we just do the inverse of the init */&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; glue_decode_close(AVCodecContext *avctx)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GLUEContext *q = avctx-&amp;amp;gt;priv_data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free allocated memory buffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    av_free(q-&amp;amp;gt;sample_buffer);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free the fft transform */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_fft_end(&amp;amp;amp;q-&amp;amp;gt;fft_ctx);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free the mdct transform */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_mdct_end(&amp;amp;amp;q-&amp;amp;gt;mdct_ctx);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free the vlc table */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    free_vlc(&amp;amp;amp;q-&amp;amp;gt;vlc_table);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Return 0 if everything is ok, -1 if not */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;AVCodec glue_decoder =&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .name           = &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #dd0000;&amp;quot;&amp;gt;&amp;quot;glue&amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .type           = CODEC_TYPE_AUDIO,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .id             = CODEC_ID_GLUE,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .priv_data_size = &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;sizeof&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(GLUEContext),&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .init           = glue_decode_init,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .close          = glue_decode_close,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .decode         = glue_decode_frame,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;};&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== trouble shooting ===&lt;br /&gt;
Invalid pixel format '(null)'&lt;br /&gt;
Output pad &amp;quot;default&amp;quot; with type video of the filter instance &amp;quot;Parsed_null_0&amp;quot; of null not connected to any destination&lt;br /&gt;
Error opening filters!&lt;br /&gt;
&lt;br /&gt;
meant encoder's description  &lt;br /&gt;
.pix_fmts   needs to end with AV_PIX_FMT_NONE&lt;br /&gt;
&lt;br /&gt;
Assertion *(const AVClass **)avctx-&amp;gt;priv_data == codec-&amp;gt;priv_class failed at libavcodec/utils.c:1554&lt;br /&gt;
&lt;br /&gt;
meant &amp;quot;your first member of your Context struct needs to be an AVClass *&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if it works but just says &amp;quot;&amp;quot;0 packets muxed&amp;quot;&amp;quot; you need to set the *got_packet return value to &amp;quot;1&amp;quot; or the muxer won't mux what you're giving it&lt;br /&gt;
&lt;br /&gt;
== see also ==&lt;br /&gt;
&lt;br /&gt;
* [[FFmpeg demuxer howto]]&lt;br /&gt;
* [[FFmpeg programming conventions]]&lt;br /&gt;
* [[FFmpeg_filter_HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[Category:FFmpeg Tutorials]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Rogerdpack</name></author>
	</entry>
	<entry>
		<id>https://wiki.multimedia.cx/index.php?title=FFmpeg_codec_HOWTO&amp;diff=15165</id>
		<title>FFmpeg codec HOWTO</title>
		<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php?title=FFmpeg_codec_HOWTO&amp;diff=15165"/>
		<updated>2015-10-13T21:15:53Z</updated>

		<summary type="html">&lt;p&gt;Rogerdpack: add link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is meant as an introduction to the internal codec API in [[FFmpeg]].&lt;br /&gt;
It will also show how the codecs are connected with the demuxers. This is by&lt;br /&gt;
no means a complete guide but enough to understand how to add a codec to FFmpeg.&lt;br /&gt;
[[RealAudio cook|Cook]] is used as an example throughout.&lt;br /&gt;
&lt;br /&gt;
== registering the codec ==&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/avcodec.h ===&lt;br /&gt;
The first thing to look at is the AVCodec struct.&lt;br /&gt;
&lt;br /&gt;
 typedef struct AVCodec {&lt;br /&gt;
     const char *name;&lt;br /&gt;
     enum CodecType type;&lt;br /&gt;
     enum CodecID id;&lt;br /&gt;
     int priv_data_size;&lt;br /&gt;
     int (*init)(AVCodecContext *);&lt;br /&gt;
     int (*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);&lt;br /&gt;
     int (*close)(AVCodecContext *);&lt;br /&gt;
     int (*decode)(AVCodecContext *, void *outdata, int *outdata_size,&lt;br /&gt;
                   uint8_t *buf, int buf_size);&lt;br /&gt;
     int capabilities;&lt;br /&gt;
     struct AVCodec *next;&lt;br /&gt;
     void (*flush)(AVCodecContext *);&lt;br /&gt;
     const AVRational *supported_framerates; ///array of supported framerates, or NULL if any, array is terminated by {0,0}&lt;br /&gt;
     const enum PixelFormat *pix_fmts;       ///array of supported pixel formats, or NULL if unknown, array is terminanted by -1&lt;br /&gt;
 } AVCodec;&lt;br /&gt;
&lt;br /&gt;
Here we can see that we have some elements to name the codec, what type it is (audio/video), the supported pixel formats and some function&lt;br /&gt;
pointers for init/encode/decode and close. Now lets see how it is used.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c ===&lt;br /&gt;
If we look in this file at the bottom we can see this code:&lt;br /&gt;
&lt;br /&gt;
 AVCodec cook_decoder =&lt;br /&gt;
 {&lt;br /&gt;
     .name           = &amp;quot;cook&amp;quot;,&lt;br /&gt;
     .type           = CODEC_TYPE_AUDIO,&lt;br /&gt;
     .id             = CODEC_ID_COOK,&lt;br /&gt;
     .priv_data_size = sizeof(COOKContext),&lt;br /&gt;
     .init           = cook_decode_init,&lt;br /&gt;
     .close          = cook_decode_close,&lt;br /&gt;
     .decode         = cook_decode_frame,&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
First we get an AVCodec struct named cook_decoder. And then we set the variables of cook_decoder. Note that we only set the variables that are needed. Currently there is no encoder so we don't set any. If we now look at the id variable we can see that CODEC_ID_COOK isn't defined in libavcodec/cook.c. It is declared in avcodec.h.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/avcodec.h ===&lt;br /&gt;
&lt;br /&gt;
Here we will find the CodecID enumeration.&lt;br /&gt;
&lt;br /&gt;
 enum CodecID {&lt;br /&gt;
 ...&lt;br /&gt;
 CODEC_ID_GSM,&lt;br /&gt;
 CODEC_ID_QDM2,&lt;br /&gt;
 CODEC_ID_COOK,&lt;br /&gt;
 CODEC_ID_TRUESPEECH,&lt;br /&gt;
 CODEC_ID_TTA,&lt;br /&gt;
 ...&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
CODEC_ID_COOK is there in the list. This is the list of all supported codecs in FFmpeg, the list is fixed and used internally to id every codec. Changing the order would break binary compatibility.&lt;br /&gt;
&lt;br /&gt;
This is all enough to declare a codec. Now we must register them for internal use also. This is done at runtime.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/allcodecs.c ===&lt;br /&gt;
In this file we have the avcodec_register_all() function, it has entries like this for all codecs.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
     REGISTER_DECODER(COOK, cook);&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
This macro expands to a register_avcodec() call which registers a codec for internal use.&lt;br /&gt;
Note that register_avcodec() will only be called when CONFIG_COOK_DECODER is defined.&lt;br /&gt;
This allows to not compile the decoder code for a specific codec.&lt;br /&gt;
But where is it defined? This is extracted by configure with this command line:&lt;br /&gt;
&lt;br /&gt;
 sed -n 's/^[^#]*DEC.*, *\(.*\)).*/\1_decoder/p' libavcodec/allcodecs.c&lt;br /&gt;
&lt;br /&gt;
So adding a REGISTER_DECODER(NEW, new) entry in allcodecs.c and reconfigure is enough to add the needed define. Now we have everything to hookup a codec.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/Makefile ===&lt;br /&gt;
In this file we define the objects on which a codec depends. For example, cook uses fft and mdct code so it depends on the mdct.o and fft.o object files as well as the cook.o object file.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 OBJS-$(CONFIG_COOK_DECODER)            += cook.o mdct.o fft.o&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== FFmpeg demuxer connection ==&lt;br /&gt;
&lt;br /&gt;
: ''[[FFmpeg demuxer howto]]''&lt;br /&gt;
&lt;br /&gt;
=== libavformat/rm.c ===&lt;br /&gt;
&lt;br /&gt;
If we think of an imaginary rm file that ffmpeg is about to process, the first thing that happens is that it is identified&lt;br /&gt;
as a rm file. It is passed on to the rm demuxer ([http://svn.mplayerhq.hu/ffmpeg/trunk/libavformat/rmdec.c?view=markup rmdec.c]). The rm demuxer looks through the file and finds out that it is a&lt;br /&gt;
cook file.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 } else if (!strcmp(buf, &amp;quot;cook&amp;quot;)) {&lt;br /&gt;
 st-&amp;gt;codec-&amp;gt;codec_id = CODEC_ID_COOK;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Now ffmpeg knows what codec to init and where to send the payload from the container. So back to cook.c and the initialization process.&lt;br /&gt;
&lt;br /&gt;
== codec code ==&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c Init ===&lt;br /&gt;
After ffmpeg knows what codec to use, it calls the declared initialization function pointer declared in the codecs AVCodec struct. In&lt;br /&gt;
cook.c it is called cook_decode_init. Here we setup as much as we can before we start decoding. The following things should be handled in the init, vlc table initialization, table generation, memory allocation and extradata parsing.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c Close ===&lt;br /&gt;
The cook_decode_close function is the codec clean-up call. All memory, vlc tables, etc. should be freed here.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c Decode ===&lt;br /&gt;
In cook.c the name of the decode call is cook_decode_frame.&lt;br /&gt;
&lt;br /&gt;
 static int cook_decode_frame(AVCodecContext *avctx,&lt;br /&gt;
             void *data, int *data_size,&lt;br /&gt;
             uint8_t *buf, int buf_size) {&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
The function has 5 arguments:&lt;br /&gt;
* avctx is a pointer to an AVCodecContext&lt;br /&gt;
* data is the pointer to the output buffer&lt;br /&gt;
* data_size is a variable that should be set to the output buffer size in bytes (this is usually the number of samples decoded * the number of channels * the byte size of a sample)&lt;br /&gt;
* buf is the pointer to the input buffer&lt;br /&gt;
* buf_size is the byte size of the input buffer&lt;br /&gt;
&lt;br /&gt;
The decode function shall return the number of bytes consumed from the input buffer or -1 in case of an error. If there is no error during decoding, the return value is usually buf_size as buf should only contain one 'frame' of data. Bitstream parsers to split the bitstream into 'frames' used to be part of the codec so a call to the decode function could have consumed less than buf_size bytes from buf. It is now encouraged that bitstream parsers be separate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That's how it works without too much detail.&lt;br /&gt;
&lt;br /&gt;
=== The Glue codec template ===&lt;br /&gt;
The imaginary Glue audio codec will serve as a base to exhibit bitstream reading, vlc decoding and other things.&lt;br /&gt;
The code is purely fictional and is sometimes written purely for the sake of example. No attempt is made to prevent invalid&lt;br /&gt;
data manipulation.&lt;br /&gt;
&lt;br /&gt;
The Glue codec follows.&lt;br /&gt;
&lt;br /&gt;
[http://wiki.multimedia.cx/index.php?title=FFmpeg_codec_howto&amp;amp;oldid=7347 non-colored version]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* The following includes have the bitstream reader, various dsp functions and the various defaults */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#define ALT_BITSTREAM_READER&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;avcodec.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;bitstream.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;dsputil.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* This includes the tables needed for the Glue codec template */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;gluedata.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Here we declare the struct used for the codec private data */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;typedef&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;struct&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GetBitContext       gb;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    FFTContext          fft_ctx;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    VLC                 vlc_table;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    MDCTContext         mdct_ctx;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;*              sample_buffer;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;} GLUEContext;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* The init function */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; glue_decode_init(AVCodecContext *avctx)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GLUEContext *q = avctx-&amp;amp;gt;priv_data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* This imaginary codec uses one fft, one mdct and one vlc table. */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_mdct_init(&amp;amp;amp;q-&amp;amp;gt;mdct_ctx, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;10&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// 2^10 == size of mdct, 1 == inverse mdct&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_fft_init(&amp;amp;amp;q-&amp;amp;gt;fft_ctx, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);       &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// 2^9 == size of fft, 0 == inverse fft&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    init_vlc (&amp;amp;amp;q-&amp;amp;gt;vlc_table, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;24&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           vlctable_huffbits, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           vlctable_huffcodes, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// look in bitstream.h for the meaning of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* We also need to allocate a sample buffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    q-&amp;amp;gt;sample_buffer = av_mallocz(&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;sizeof&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;)*&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1024&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// here we used av_mallocz instead of av_malloc&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;                                                        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// av_mallocz memsets the whole buffer to 0&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Check if the allocation was successful */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(q-&amp;amp;gt;sample_buffer == NULL)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; -&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* return 0 for a successful init, -1 for failure */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* This is the main decode function */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; glue_decode_frame(AVCodecContext *avctx,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; *data, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; *data_size,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           uint8_t *buf, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; buf_size)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GLUEContext *q = avctx-&amp;amp;gt;priv_data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    int16_t *outbuffer = data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* We know what the arguments for this function are from above&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       now we just have to decode this imaginary codec, the made up&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       bitstream format is as follows:&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       12 bits representing the amount of samples&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       1 bit fft or mdct coded coeffs, 0 for fft/1 for mdct&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;         read 13 bits representing the amount of vlc coded fft data coeffs&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;         read 10 bits representing the amount of vlc coded mdct data coeffs&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       (...bits representing the coeffs...)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       5 bits of dummy data that should be ignored&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       32 bits the hex value 0x12345678, used for integrity check&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;    */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Declare the needed variables */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; samples, coeffs, i, fft;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; mdct_tmp[&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1024&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;];&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we init the bitstream reader, we start at the beginning of the inbuffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    init_get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, buf, buf_size*&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;8&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//the buf_size is in bytes but we need bits&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we take 12 bits to get the amount of samples the current frame has */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    samples = get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;12&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we check if we have fft or mdct coeffs */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    fft = get_bits1(&amp;amp;amp;q-&amp;amp;gt;gb);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (fft) {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//fft coeffs, get how many&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        coeffs = get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;13&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    } &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//mdct coeffs, get how many&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        coeffs = get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;10&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    }&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now decode the vlc coded coeffs to the sample_buffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;for&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (i=&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; ; i&amp;amp;lt;coeffs ; i++)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        q-&amp;amp;gt;sample_buffer[i] = get_vlc2(&amp;amp;amp;q-&amp;amp;gt;gb, q-&amp;amp;gt;vlc_table.table, vlc_table.bits, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//read about the arguments in bitstream.h&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we need to transform the coeffs to samples */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (fft) {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//The fft is done inplace&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        ff_fft_permute(&amp;amp;amp;q-&amp;amp;gt;fft_ctx, (FFTComplex *) q-&amp;amp;gt;sample_buffer);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        ff_fft_calc(&amp;amp;amp;q-&amp;amp;gt;fft_ctx, (FFTComplex *) q-&amp;amp;gt;sample_buffer);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    } &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//And we pretend that the mdct is also inplace&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        ff_imdct_calc(&amp;amp;amp;q-&amp;amp;gt;mdct_ctx, q-&amp;amp;gt;sample_buffer, q-&amp;amp;gt;sample_buffer, mdct_tmp);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    }&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* To make it easy the stream can only be 16 bits mono, so let's convert it to that */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;for&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (i=&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; ; i&amp;amp;lt;samples ; i++)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        outbuffer[i] = (int16_t)q-&amp;amp;gt;sample_buffer[i];&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Report how many samples we got */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    *data_size = samples;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Skip the dummy data bits */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    skip_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Check if the buffer was consumed ok */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (get_bits(&amp;amp;amp;q-&amp;amp;gt;gb,&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;32&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;) != &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008080;&amp;quot;&amp;gt;0x12345678&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;) {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        av_log(avctx,AV_LOG_ERROR,&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #dd0000;&amp;quot;&amp;gt;&amp;quot;Stream error, integrity check failed!&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #ff00ff;&amp;quot;&amp;gt;\n&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #dd0000;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; -&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    }&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;&lt;br /&gt;
     /* The decision between erroring out or not in case of unexpected data&lt;br /&gt;
        should be made so that the output quality is maximized.&lt;br /&gt;
        This means that if undamaged data is assumed then unused/resereved values&lt;br /&gt;
        should lead to warnings but not failure. (assumption of slightly non compliant&lt;br /&gt;
        file)&lt;br /&gt;
        OTOH if possibly damaged data is assumed and it is assumed that the original&lt;br /&gt;
        did contain specific values in reserved/unused fields then finding unexpected&lt;br /&gt;
        values should trigger error concealment code and the decoder/demuxer should&lt;br /&gt;
        attempt to resync.&lt;br /&gt;
        The decision between these 2 should be made by using &lt;br /&gt;
        AVCodecContext.error_recognition unless its a clear case where only one of&lt;br /&gt;
        the 2 makes sense.&lt;br /&gt;
     */&lt;br /&gt;
 &amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Return the amount of bytes consumed if everything was ok */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; *data_size*&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;sizeof&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(int16_t);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* the uninit function, here we just do the inverse of the init */&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; glue_decode_close(AVCodecContext *avctx)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GLUEContext *q = avctx-&amp;amp;gt;priv_data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free allocated memory buffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    av_free(q-&amp;amp;gt;sample_buffer);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free the fft transform */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_fft_end(&amp;amp;amp;q-&amp;amp;gt;fft_ctx);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free the mdct transform */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_mdct_end(&amp;amp;amp;q-&amp;amp;gt;mdct_ctx);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free the vlc table */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    free_vlc(&amp;amp;amp;q-&amp;amp;gt;vlc_table);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Return 0 if everything is ok, -1 if not */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;AVCodec glue_decoder =&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .name           = &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #dd0000;&amp;quot;&amp;gt;&amp;quot;glue&amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .type           = CODEC_TYPE_AUDIO,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .id             = CODEC_ID_GLUE,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .priv_data_size = &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;sizeof&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(GLUEContext),&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .init           = glue_decode_init,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .close          = glue_decode_close,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .decode         = glue_decode_frame,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;};&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== trouble shooting ===&lt;br /&gt;
Invalid pixel format '(null)'&lt;br /&gt;
Output pad &amp;quot;default&amp;quot; with type video of the filter instance &amp;quot;Parsed_null_0&amp;quot; of null not connected to any destination&lt;br /&gt;
Error opening filters!&lt;br /&gt;
&lt;br /&gt;
meant encoder's description  &lt;br /&gt;
.pix_fmts   needs to end with AV_PIX_FMT_NONE&lt;br /&gt;
&lt;br /&gt;
Assertion *(const AVClass **)avctx-&amp;gt;priv_data == codec-&amp;gt;priv_class failed at libavcodec/utils.c:1554&lt;br /&gt;
&lt;br /&gt;
meant &amp;quot;your first member of your Context struct needs to be an AVClass *&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== see also ==&lt;br /&gt;
&lt;br /&gt;
* [[FFmpeg demuxer howto]]&lt;br /&gt;
* [[FFmpeg programming conventions]]&lt;br /&gt;
* [[FFmpeg_filter_HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[Category:FFmpeg Tutorials]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Rogerdpack</name></author>
	</entry>
	<entry>
		<id>https://wiki.multimedia.cx/index.php?title=FFmpeg_codec_HOWTO&amp;diff=15164</id>
		<title>FFmpeg codec HOWTO</title>
		<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php?title=FFmpeg_codec_HOWTO&amp;diff=15164"/>
		<updated>2015-10-13T21:06:10Z</updated>

		<summary type="html">&lt;p&gt;Rogerdpack: /* trouble shooting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is meant as an introduction to the internal codec API in [[FFmpeg]].&lt;br /&gt;
It will also show how the codecs are connected with the demuxers. This is by&lt;br /&gt;
no means a complete guide but enough to understand how to add a codec to FFmpeg.&lt;br /&gt;
[[RealAudio cook|Cook]] is used as an example throughout.&lt;br /&gt;
&lt;br /&gt;
== registering the codec ==&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/avcodec.h ===&lt;br /&gt;
The first thing to look at is the AVCodec struct.&lt;br /&gt;
&lt;br /&gt;
 typedef struct AVCodec {&lt;br /&gt;
     const char *name;&lt;br /&gt;
     enum CodecType type;&lt;br /&gt;
     enum CodecID id;&lt;br /&gt;
     int priv_data_size;&lt;br /&gt;
     int (*init)(AVCodecContext *);&lt;br /&gt;
     int (*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);&lt;br /&gt;
     int (*close)(AVCodecContext *);&lt;br /&gt;
     int (*decode)(AVCodecContext *, void *outdata, int *outdata_size,&lt;br /&gt;
                   uint8_t *buf, int buf_size);&lt;br /&gt;
     int capabilities;&lt;br /&gt;
     struct AVCodec *next;&lt;br /&gt;
     void (*flush)(AVCodecContext *);&lt;br /&gt;
     const AVRational *supported_framerates; ///array of supported framerates, or NULL if any, array is terminated by {0,0}&lt;br /&gt;
     const enum PixelFormat *pix_fmts;       ///array of supported pixel formats, or NULL if unknown, array is terminanted by -1&lt;br /&gt;
 } AVCodec;&lt;br /&gt;
&lt;br /&gt;
Here we can see that we have some elements to name the codec, what type it is (audio/video), the supported pixel formats and some function&lt;br /&gt;
pointers for init/encode/decode and close. Now lets see how it is used.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c ===&lt;br /&gt;
If we look in this file at the bottom we can see this code:&lt;br /&gt;
&lt;br /&gt;
 AVCodec cook_decoder =&lt;br /&gt;
 {&lt;br /&gt;
     .name           = &amp;quot;cook&amp;quot;,&lt;br /&gt;
     .type           = CODEC_TYPE_AUDIO,&lt;br /&gt;
     .id             = CODEC_ID_COOK,&lt;br /&gt;
     .priv_data_size = sizeof(COOKContext),&lt;br /&gt;
     .init           = cook_decode_init,&lt;br /&gt;
     .close          = cook_decode_close,&lt;br /&gt;
     .decode         = cook_decode_frame,&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
First we get an AVCodec struct named cook_decoder. And then we set the variables of cook_decoder. Note that we only set the variables that are needed. Currently there is no encoder so we don't set any. If we now look at the id variable we can see that CODEC_ID_COOK isn't defined in libavcodec/cook.c. It is declared in avcodec.h.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/avcodec.h ===&lt;br /&gt;
&lt;br /&gt;
Here we will find the CodecID enumeration.&lt;br /&gt;
&lt;br /&gt;
 enum CodecID {&lt;br /&gt;
 ...&lt;br /&gt;
 CODEC_ID_GSM,&lt;br /&gt;
 CODEC_ID_QDM2,&lt;br /&gt;
 CODEC_ID_COOK,&lt;br /&gt;
 CODEC_ID_TRUESPEECH,&lt;br /&gt;
 CODEC_ID_TTA,&lt;br /&gt;
 ...&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
CODEC_ID_COOK is there in the list. This is the list of all supported codecs in FFmpeg, the list is fixed and used internally to id every codec. Changing the order would break binary compatibility.&lt;br /&gt;
&lt;br /&gt;
This is all enough to declare a codec. Now we must register them for internal use also. This is done at runtime.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/allcodecs.c ===&lt;br /&gt;
In this file we have the avcodec_register_all() function, it has entries like this for all codecs.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
     REGISTER_DECODER(COOK, cook);&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
This macro expands to a register_avcodec() call which registers a codec for internal use.&lt;br /&gt;
Note that register_avcodec() will only be called when CONFIG_COOK_DECODER is defined.&lt;br /&gt;
This allows to not compile the decoder code for a specific codec.&lt;br /&gt;
But where is it defined? This is extracted by configure with this command line:&lt;br /&gt;
&lt;br /&gt;
 sed -n 's/^[^#]*DEC.*, *\(.*\)).*/\1_decoder/p' libavcodec/allcodecs.c&lt;br /&gt;
&lt;br /&gt;
So adding a REGISTER_DECODER(NEW, new) entry in allcodecs.c and reconfigure is enough to add the needed define. Now we have everything to hookup a codec.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/Makefile ===&lt;br /&gt;
In this file we define the objects on which a codec depends. For example, cook uses fft and mdct code so it depends on the mdct.o and fft.o object files as well as the cook.o object file.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 OBJS-$(CONFIG_COOK_DECODER)            += cook.o mdct.o fft.o&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== FFmpeg demuxer connection ==&lt;br /&gt;
&lt;br /&gt;
: ''[[FFmpeg demuxer howto]]''&lt;br /&gt;
&lt;br /&gt;
=== libavformat/rm.c ===&lt;br /&gt;
&lt;br /&gt;
If we think of an imaginary rm file that ffmpeg is about to process, the first thing that happens is that it is identified&lt;br /&gt;
as a rm file. It is passed on to the rm demuxer ([http://svn.mplayerhq.hu/ffmpeg/trunk/libavformat/rmdec.c?view=markup rmdec.c]). The rm demuxer looks through the file and finds out that it is a&lt;br /&gt;
cook file.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 } else if (!strcmp(buf, &amp;quot;cook&amp;quot;)) {&lt;br /&gt;
 st-&amp;gt;codec-&amp;gt;codec_id = CODEC_ID_COOK;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Now ffmpeg knows what codec to init and where to send the payload from the container. So back to cook.c and the initialization process.&lt;br /&gt;
&lt;br /&gt;
== codec code ==&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c Init ===&lt;br /&gt;
After ffmpeg knows what codec to use, it calls the declared initialization function pointer declared in the codecs AVCodec struct. In&lt;br /&gt;
cook.c it is called cook_decode_init. Here we setup as much as we can before we start decoding. The following things should be handled in the init, vlc table initialization, table generation, memory allocation and extradata parsing.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c Close ===&lt;br /&gt;
The cook_decode_close function is the codec clean-up call. All memory, vlc tables, etc. should be freed here.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c Decode ===&lt;br /&gt;
In cook.c the name of the decode call is cook_decode_frame.&lt;br /&gt;
&lt;br /&gt;
 static int cook_decode_frame(AVCodecContext *avctx,&lt;br /&gt;
             void *data, int *data_size,&lt;br /&gt;
             uint8_t *buf, int buf_size) {&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
The function has 5 arguments:&lt;br /&gt;
* avctx is a pointer to an AVCodecContext&lt;br /&gt;
* data is the pointer to the output buffer&lt;br /&gt;
* data_size is a variable that should be set to the output buffer size in bytes (this is usually the number of samples decoded * the number of channels * the byte size of a sample)&lt;br /&gt;
* buf is the pointer to the input buffer&lt;br /&gt;
* buf_size is the byte size of the input buffer&lt;br /&gt;
&lt;br /&gt;
The decode function shall return the number of bytes consumed from the input buffer or -1 in case of an error. If there is no error during decoding, the return value is usually buf_size as buf should only contain one 'frame' of data. Bitstream parsers to split the bitstream into 'frames' used to be part of the codec so a call to the decode function could have consumed less than buf_size bytes from buf. It is now encouraged that bitstream parsers be separate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That's how it works without too much detail.&lt;br /&gt;
&lt;br /&gt;
=== The Glue codec template ===&lt;br /&gt;
The imaginary Glue audio codec will serve as a base to exhibit bitstream reading, vlc decoding and other things.&lt;br /&gt;
The code is purely fictional and is sometimes written purely for the sake of example. No attempt is made to prevent invalid&lt;br /&gt;
data manipulation.&lt;br /&gt;
&lt;br /&gt;
The Glue codec follows.&lt;br /&gt;
&lt;br /&gt;
[http://wiki.multimedia.cx/index.php?title=FFmpeg_codec_howto&amp;amp;oldid=7347 non-colored version]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* The following includes have the bitstream reader, various dsp functions and the various defaults */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#define ALT_BITSTREAM_READER&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;avcodec.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;bitstream.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;dsputil.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* This includes the tables needed for the Glue codec template */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;gluedata.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Here we declare the struct used for the codec private data */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;typedef&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;struct&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GetBitContext       gb;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    FFTContext          fft_ctx;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    VLC                 vlc_table;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    MDCTContext         mdct_ctx;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;*              sample_buffer;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;} GLUEContext;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* The init function */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; glue_decode_init(AVCodecContext *avctx)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GLUEContext *q = avctx-&amp;amp;gt;priv_data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* This imaginary codec uses one fft, one mdct and one vlc table. */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_mdct_init(&amp;amp;amp;q-&amp;amp;gt;mdct_ctx, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;10&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// 2^10 == size of mdct, 1 == inverse mdct&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_fft_init(&amp;amp;amp;q-&amp;amp;gt;fft_ctx, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);       &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// 2^9 == size of fft, 0 == inverse fft&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    init_vlc (&amp;amp;amp;q-&amp;amp;gt;vlc_table, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;24&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           vlctable_huffbits, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           vlctable_huffcodes, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// look in bitstream.h for the meaning of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* We also need to allocate a sample buffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    q-&amp;amp;gt;sample_buffer = av_mallocz(&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;sizeof&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;)*&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1024&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// here we used av_mallocz instead of av_malloc&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;                                                        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// av_mallocz memsets the whole buffer to 0&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Check if the allocation was successful */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(q-&amp;amp;gt;sample_buffer == NULL)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; -&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* return 0 for a successful init, -1 for failure */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* This is the main decode function */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; glue_decode_frame(AVCodecContext *avctx,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; *data, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; *data_size,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           uint8_t *buf, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; buf_size)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GLUEContext *q = avctx-&amp;amp;gt;priv_data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    int16_t *outbuffer = data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* We know what the arguments for this function are from above&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       now we just have to decode this imaginary codec, the made up&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       bitstream format is as follows:&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       12 bits representing the amount of samples&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       1 bit fft or mdct coded coeffs, 0 for fft/1 for mdct&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;         read 13 bits representing the amount of vlc coded fft data coeffs&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;         read 10 bits representing the amount of vlc coded mdct data coeffs&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       (...bits representing the coeffs...)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       5 bits of dummy data that should be ignored&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       32 bits the hex value 0x12345678, used for integrity check&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;    */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Declare the needed variables */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; samples, coeffs, i, fft;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; mdct_tmp[&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1024&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;];&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we init the bitstream reader, we start at the beginning of the inbuffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    init_get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, buf, buf_size*&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;8&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//the buf_size is in bytes but we need bits&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we take 12 bits to get the amount of samples the current frame has */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    samples = get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;12&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we check if we have fft or mdct coeffs */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    fft = get_bits1(&amp;amp;amp;q-&amp;amp;gt;gb);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (fft) {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//fft coeffs, get how many&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        coeffs = get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;13&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    } &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//mdct coeffs, get how many&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        coeffs = get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;10&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    }&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now decode the vlc coded coeffs to the sample_buffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;for&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (i=&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; ; i&amp;amp;lt;coeffs ; i++)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        q-&amp;amp;gt;sample_buffer[i] = get_vlc2(&amp;amp;amp;q-&amp;amp;gt;gb, q-&amp;amp;gt;vlc_table.table, vlc_table.bits, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//read about the arguments in bitstream.h&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we need to transform the coeffs to samples */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (fft) {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//The fft is done inplace&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        ff_fft_permute(&amp;amp;amp;q-&amp;amp;gt;fft_ctx, (FFTComplex *) q-&amp;amp;gt;sample_buffer);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        ff_fft_calc(&amp;amp;amp;q-&amp;amp;gt;fft_ctx, (FFTComplex *) q-&amp;amp;gt;sample_buffer);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    } &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//And we pretend that the mdct is also inplace&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        ff_imdct_calc(&amp;amp;amp;q-&amp;amp;gt;mdct_ctx, q-&amp;amp;gt;sample_buffer, q-&amp;amp;gt;sample_buffer, mdct_tmp);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    }&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* To make it easy the stream can only be 16 bits mono, so let's convert it to that */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;for&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (i=&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; ; i&amp;amp;lt;samples ; i++)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        outbuffer[i] = (int16_t)q-&amp;amp;gt;sample_buffer[i];&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Report how many samples we got */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    *data_size = samples;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Skip the dummy data bits */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    skip_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Check if the buffer was consumed ok */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (get_bits(&amp;amp;amp;q-&amp;amp;gt;gb,&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;32&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;) != &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008080;&amp;quot;&amp;gt;0x12345678&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;) {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        av_log(avctx,AV_LOG_ERROR,&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #dd0000;&amp;quot;&amp;gt;&amp;quot;Stream error, integrity check failed!&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #ff00ff;&amp;quot;&amp;gt;\n&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #dd0000;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; -&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    }&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;&lt;br /&gt;
     /* The decision between erroring out or not in case of unexpected data&lt;br /&gt;
        should be made so that the output quality is maximized.&lt;br /&gt;
        This means that if undamaged data is assumed then unused/resereved values&lt;br /&gt;
        should lead to warnings but not failure. (assumption of slightly non compliant&lt;br /&gt;
        file)&lt;br /&gt;
        OTOH if possibly damaged data is assumed and it is assumed that the original&lt;br /&gt;
        did contain specific values in reserved/unused fields then finding unexpected&lt;br /&gt;
        values should trigger error concealment code and the decoder/demuxer should&lt;br /&gt;
        attempt to resync.&lt;br /&gt;
        The decision between these 2 should be made by using &lt;br /&gt;
        AVCodecContext.error_recognition unless its a clear case where only one of&lt;br /&gt;
        the 2 makes sense.&lt;br /&gt;
     */&lt;br /&gt;
 &amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Return the amount of bytes consumed if everything was ok */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; *data_size*&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;sizeof&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(int16_t);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* the uninit function, here we just do the inverse of the init */&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; glue_decode_close(AVCodecContext *avctx)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GLUEContext *q = avctx-&amp;amp;gt;priv_data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free allocated memory buffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    av_free(q-&amp;amp;gt;sample_buffer);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free the fft transform */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_fft_end(&amp;amp;amp;q-&amp;amp;gt;fft_ctx);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free the mdct transform */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_mdct_end(&amp;amp;amp;q-&amp;amp;gt;mdct_ctx);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free the vlc table */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    free_vlc(&amp;amp;amp;q-&amp;amp;gt;vlc_table);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Return 0 if everything is ok, -1 if not */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;AVCodec glue_decoder =&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .name           = &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #dd0000;&amp;quot;&amp;gt;&amp;quot;glue&amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .type           = CODEC_TYPE_AUDIO,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .id             = CODEC_ID_GLUE,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .priv_data_size = &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;sizeof&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(GLUEContext),&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .init           = glue_decode_init,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .close          = glue_decode_close,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .decode         = glue_decode_frame,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;};&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== trouble shooting ===&lt;br /&gt;
Invalid pixel format '(null)'&lt;br /&gt;
Output pad &amp;quot;default&amp;quot; with type video of the filter instance &amp;quot;Parsed_null_0&amp;quot; of null not connected to any destination&lt;br /&gt;
Error opening filters!&lt;br /&gt;
&lt;br /&gt;
meant encoder's description  &lt;br /&gt;
.pix_fmts   needs to end with AV_PIX_FMT_NONE&lt;br /&gt;
&lt;br /&gt;
Assertion *(const AVClass **)avctx-&amp;gt;priv_data == codec-&amp;gt;priv_class failed at libavcodec/utils.c:1554&lt;br /&gt;
&lt;br /&gt;
meant &amp;quot;your first member of your Context struct needs to be an AVClass *&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== see also ==&lt;br /&gt;
&lt;br /&gt;
* [[FFmpeg demuxer howto]]&lt;br /&gt;
* [[FFmpeg programming conventions]]&lt;br /&gt;
&lt;br /&gt;
[[Category:FFmpeg Tutorials]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Rogerdpack</name></author>
	</entry>
	<entry>
		<id>https://wiki.multimedia.cx/index.php?title=FFmpeg_codec_HOWTO&amp;diff=15163</id>
		<title>FFmpeg codec HOWTO</title>
		<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php?title=FFmpeg_codec_HOWTO&amp;diff=15163"/>
		<updated>2015-10-13T19:12:29Z</updated>

		<summary type="html">&lt;p&gt;Rogerdpack: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is meant as an introduction to the internal codec API in [[FFmpeg]].&lt;br /&gt;
It will also show how the codecs are connected with the demuxers. This is by&lt;br /&gt;
no means a complete guide but enough to understand how to add a codec to FFmpeg.&lt;br /&gt;
[[RealAudio cook|Cook]] is used as an example throughout.&lt;br /&gt;
&lt;br /&gt;
== registering the codec ==&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/avcodec.h ===&lt;br /&gt;
The first thing to look at is the AVCodec struct.&lt;br /&gt;
&lt;br /&gt;
 typedef struct AVCodec {&lt;br /&gt;
     const char *name;&lt;br /&gt;
     enum CodecType type;&lt;br /&gt;
     enum CodecID id;&lt;br /&gt;
     int priv_data_size;&lt;br /&gt;
     int (*init)(AVCodecContext *);&lt;br /&gt;
     int (*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);&lt;br /&gt;
     int (*close)(AVCodecContext *);&lt;br /&gt;
     int (*decode)(AVCodecContext *, void *outdata, int *outdata_size,&lt;br /&gt;
                   uint8_t *buf, int buf_size);&lt;br /&gt;
     int capabilities;&lt;br /&gt;
     struct AVCodec *next;&lt;br /&gt;
     void (*flush)(AVCodecContext *);&lt;br /&gt;
     const AVRational *supported_framerates; ///array of supported framerates, or NULL if any, array is terminated by {0,0}&lt;br /&gt;
     const enum PixelFormat *pix_fmts;       ///array of supported pixel formats, or NULL if unknown, array is terminanted by -1&lt;br /&gt;
 } AVCodec;&lt;br /&gt;
&lt;br /&gt;
Here we can see that we have some elements to name the codec, what type it is (audio/video), the supported pixel formats and some function&lt;br /&gt;
pointers for init/encode/decode and close. Now lets see how it is used.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c ===&lt;br /&gt;
If we look in this file at the bottom we can see this code:&lt;br /&gt;
&lt;br /&gt;
 AVCodec cook_decoder =&lt;br /&gt;
 {&lt;br /&gt;
     .name           = &amp;quot;cook&amp;quot;,&lt;br /&gt;
     .type           = CODEC_TYPE_AUDIO,&lt;br /&gt;
     .id             = CODEC_ID_COOK,&lt;br /&gt;
     .priv_data_size = sizeof(COOKContext),&lt;br /&gt;
     .init           = cook_decode_init,&lt;br /&gt;
     .close          = cook_decode_close,&lt;br /&gt;
     .decode         = cook_decode_frame,&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
First we get an AVCodec struct named cook_decoder. And then we set the variables of cook_decoder. Note that we only set the variables that are needed. Currently there is no encoder so we don't set any. If we now look at the id variable we can see that CODEC_ID_COOK isn't defined in libavcodec/cook.c. It is declared in avcodec.h.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/avcodec.h ===&lt;br /&gt;
&lt;br /&gt;
Here we will find the CodecID enumeration.&lt;br /&gt;
&lt;br /&gt;
 enum CodecID {&lt;br /&gt;
 ...&lt;br /&gt;
 CODEC_ID_GSM,&lt;br /&gt;
 CODEC_ID_QDM2,&lt;br /&gt;
 CODEC_ID_COOK,&lt;br /&gt;
 CODEC_ID_TRUESPEECH,&lt;br /&gt;
 CODEC_ID_TTA,&lt;br /&gt;
 ...&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
CODEC_ID_COOK is there in the list. This is the list of all supported codecs in FFmpeg, the list is fixed and used internally to id every codec. Changing the order would break binary compatibility.&lt;br /&gt;
&lt;br /&gt;
This is all enough to declare a codec. Now we must register them for internal use also. This is done at runtime.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/allcodecs.c ===&lt;br /&gt;
In this file we have the avcodec_register_all() function, it has entries like this for all codecs.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
     REGISTER_DECODER(COOK, cook);&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
This macro expands to a register_avcodec() call which registers a codec for internal use.&lt;br /&gt;
Note that register_avcodec() will only be called when CONFIG_COOK_DECODER is defined.&lt;br /&gt;
This allows to not compile the decoder code for a specific codec.&lt;br /&gt;
But where is it defined? This is extracted by configure with this command line:&lt;br /&gt;
&lt;br /&gt;
 sed -n 's/^[^#]*DEC.*, *\(.*\)).*/\1_decoder/p' libavcodec/allcodecs.c&lt;br /&gt;
&lt;br /&gt;
So adding a REGISTER_DECODER(NEW, new) entry in allcodecs.c and reconfigure is enough to add the needed define. Now we have everything to hookup a codec.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/Makefile ===&lt;br /&gt;
In this file we define the objects on which a codec depends. For example, cook uses fft and mdct code so it depends on the mdct.o and fft.o object files as well as the cook.o object file.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 OBJS-$(CONFIG_COOK_DECODER)            += cook.o mdct.o fft.o&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== FFmpeg demuxer connection ==&lt;br /&gt;
&lt;br /&gt;
: ''[[FFmpeg demuxer howto]]''&lt;br /&gt;
&lt;br /&gt;
=== libavformat/rm.c ===&lt;br /&gt;
&lt;br /&gt;
If we think of an imaginary rm file that ffmpeg is about to process, the first thing that happens is that it is identified&lt;br /&gt;
as a rm file. It is passed on to the rm demuxer ([http://svn.mplayerhq.hu/ffmpeg/trunk/libavformat/rmdec.c?view=markup rmdec.c]). The rm demuxer looks through the file and finds out that it is a&lt;br /&gt;
cook file.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 } else if (!strcmp(buf, &amp;quot;cook&amp;quot;)) {&lt;br /&gt;
 st-&amp;gt;codec-&amp;gt;codec_id = CODEC_ID_COOK;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Now ffmpeg knows what codec to init and where to send the payload from the container. So back to cook.c and the initialization process.&lt;br /&gt;
&lt;br /&gt;
== codec code ==&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c Init ===&lt;br /&gt;
After ffmpeg knows what codec to use, it calls the declared initialization function pointer declared in the codecs AVCodec struct. In&lt;br /&gt;
cook.c it is called cook_decode_init. Here we setup as much as we can before we start decoding. The following things should be handled in the init, vlc table initialization, table generation, memory allocation and extradata parsing.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c Close ===&lt;br /&gt;
The cook_decode_close function is the codec clean-up call. All memory, vlc tables, etc. should be freed here.&lt;br /&gt;
&lt;br /&gt;
=== libavcodec/cook.c Decode ===&lt;br /&gt;
In cook.c the name of the decode call is cook_decode_frame.&lt;br /&gt;
&lt;br /&gt;
 static int cook_decode_frame(AVCodecContext *avctx,&lt;br /&gt;
             void *data, int *data_size,&lt;br /&gt;
             uint8_t *buf, int buf_size) {&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
The function has 5 arguments:&lt;br /&gt;
* avctx is a pointer to an AVCodecContext&lt;br /&gt;
* data is the pointer to the output buffer&lt;br /&gt;
* data_size is a variable that should be set to the output buffer size in bytes (this is usually the number of samples decoded * the number of channels * the byte size of a sample)&lt;br /&gt;
* buf is the pointer to the input buffer&lt;br /&gt;
* buf_size is the byte size of the input buffer&lt;br /&gt;
&lt;br /&gt;
The decode function shall return the number of bytes consumed from the input buffer or -1 in case of an error. If there is no error during decoding, the return value is usually buf_size as buf should only contain one 'frame' of data. Bitstream parsers to split the bitstream into 'frames' used to be part of the codec so a call to the decode function could have consumed less than buf_size bytes from buf. It is now encouraged that bitstream parsers be separate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That's how it works without too much detail.&lt;br /&gt;
&lt;br /&gt;
=== The Glue codec template ===&lt;br /&gt;
The imaginary Glue audio codec will serve as a base to exhibit bitstream reading, vlc decoding and other things.&lt;br /&gt;
The code is purely fictional and is sometimes written purely for the sake of example. No attempt is made to prevent invalid&lt;br /&gt;
data manipulation.&lt;br /&gt;
&lt;br /&gt;
The Glue codec follows.&lt;br /&gt;
&lt;br /&gt;
[http://wiki.multimedia.cx/index.php?title=FFmpeg_codec_howto&amp;amp;oldid=7347 non-colored version]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* The following includes have the bitstream reader, various dsp functions and the various defaults */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#define ALT_BITSTREAM_READER&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;avcodec.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;bitstream.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;dsputil.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* This includes the tables needed for the Glue codec template */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008000;&amp;quot;&amp;gt;#include &amp;quot;gluedata.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Here we declare the struct used for the codec private data */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;typedef&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;struct&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GetBitContext       gb;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    FFTContext          fft_ctx;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    VLC                 vlc_table;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    MDCTContext         mdct_ctx;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;*              sample_buffer;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;} GLUEContext;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* The init function */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; glue_decode_init(AVCodecContext *avctx)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GLUEContext *q = avctx-&amp;amp;gt;priv_data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* This imaginary codec uses one fft, one mdct and one vlc table. */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_mdct_init(&amp;amp;amp;q-&amp;amp;gt;mdct_ctx, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;10&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// 2^10 == size of mdct, 1 == inverse mdct&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_fft_init(&amp;amp;amp;q-&amp;amp;gt;fft_ctx, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);       &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// 2^9 == size of fft, 0 == inverse fft&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    init_vlc (&amp;amp;amp;q-&amp;amp;gt;vlc_table, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;24&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           vlctable_huffbits, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           vlctable_huffcodes, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// look in bitstream.h for the meaning of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* We also need to allocate a sample buffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    q-&amp;amp;gt;sample_buffer = av_mallocz(&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;sizeof&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;)*&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1024&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// here we used av_mallocz instead of av_malloc&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;                                                        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;// av_mallocz memsets the whole buffer to 0&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Check if the allocation was successful */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(q-&amp;amp;gt;sample_buffer == NULL)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; -&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* return 0 for a successful init, -1 for failure */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* This is the main decode function */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; glue_decode_frame(AVCodecContext *avctx,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; *data, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; *data_size,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;           uint8_t *buf, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; buf_size)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GLUEContext *q = avctx-&amp;amp;gt;priv_data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    int16_t *outbuffer = data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* We know what the arguments for this function are from above&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       now we just have to decode this imaginary codec, the made up&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       bitstream format is as follows:&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       12 bits representing the amount of samples&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       1 bit fft or mdct coded coeffs, 0 for fft/1 for mdct&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;         read 13 bits representing the amount of vlc coded fft data coeffs&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;         read 10 bits representing the amount of vlc coded mdct data coeffs&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       (...bits representing the coeffs...)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       5 bits of dummy data that should be ignored&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;       32 bits the hex value 0x12345678, used for integrity check&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;    */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Declare the needed variables */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; samples, coeffs, i, fft;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; mdct_tmp[&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1024&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;];&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we init the bitstream reader, we start at the beginning of the inbuffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    init_get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, buf, buf_size*&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;8&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//the buf_size is in bytes but we need bits&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we take 12 bits to get the amount of samples the current frame has */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    samples = get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;12&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we check if we have fft or mdct coeffs */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    fft = get_bits1(&amp;amp;amp;q-&amp;amp;gt;gb);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (fft) {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//fft coeffs, get how many&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        coeffs = get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;13&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    } &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//mdct coeffs, get how many&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        coeffs = get_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;10&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    }&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now decode the vlc coded coeffs to the sample_buffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;for&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (i=&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; ; i&amp;amp;lt;coeffs ; i++)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        q-&amp;amp;gt;sample_buffer[i] = get_vlc2(&amp;amp;amp;q-&amp;amp;gt;gb, q-&amp;amp;gt;vlc_table.table, vlc_table.bits, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);  &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//read about the arguments in bitstream.h&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Now we need to transform the coeffs to samples */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (fft) {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//The fft is done inplace&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        ff_fft_permute(&amp;amp;amp;q-&amp;amp;gt;fft_ctx, (FFTComplex *) q-&amp;amp;gt;sample_buffer);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        ff_fft_calc(&amp;amp;amp;q-&amp;amp;gt;fft_ctx, (FFTComplex *) q-&amp;amp;gt;sample_buffer);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    } &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;//And we pretend that the mdct is also inplace&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        ff_imdct_calc(&amp;amp;amp;q-&amp;amp;gt;mdct_ctx, q-&amp;amp;gt;sample_buffer, q-&amp;amp;gt;sample_buffer, mdct_tmp);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    }&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* To make it easy the stream can only be 16 bits mono, so let's convert it to that */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;for&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (i=&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; ; i&amp;amp;lt;samples ; i++)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        outbuffer[i] = (int16_t)q-&amp;amp;gt;sample_buffer[i];&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Report how many samples we got */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    *data_size = samples;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Skip the dummy data bits */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    skip_bits(&amp;amp;amp;q-&amp;amp;gt;gb, &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Check if the buffer was consumed ok */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; (get_bits(&amp;amp;amp;q-&amp;amp;gt;gb,&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;32&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;) != &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008080;&amp;quot;&amp;gt;0x12345678&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;) {&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        av_log(avctx,AV_LOG_ERROR,&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #dd0000;&amp;quot;&amp;gt;&amp;quot;Stream error, integrity check failed!&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #ff00ff;&amp;quot;&amp;gt;\n&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #dd0000;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;        &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; -&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    }&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;&lt;br /&gt;
     /* The decision between erroring out or not in case of unexpected data&lt;br /&gt;
        should be made so that the output quality is maximized.&lt;br /&gt;
        This means that if undamaged data is assumed then unused/resereved values&lt;br /&gt;
        should lead to warnings but not failure. (assumption of slightly non compliant&lt;br /&gt;
        file)&lt;br /&gt;
        OTOH if possibly damaged data is assumed and it is assumed that the original&lt;br /&gt;
        did contain specific values in reserved/unused fields then finding unexpected&lt;br /&gt;
        values should trigger error concealment code and the decoder/demuxer should&lt;br /&gt;
        attempt to resync.&lt;br /&gt;
        The decision between these 2 should be made by using &lt;br /&gt;
        AVCodecContext.error_recognition unless its a clear case where only one of&lt;br /&gt;
        the 2 makes sense.&lt;br /&gt;
     */&lt;br /&gt;
 &amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Return the amount of bytes consumed if everything was ok */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; *data_size*&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;sizeof&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(int16_t);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* the uninit function, here we just do the inverse of the init */&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #800000;&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; glue_decode_close(AVCodecContext *avctx)&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    GLUEContext *q = avctx-&amp;amp;gt;priv_data;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free allocated memory buffer */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    av_free(q-&amp;amp;gt;sample_buffer);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free the fft transform */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_fft_end(&amp;amp;amp;q-&amp;amp;gt;fft_ctx);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free the mdct transform */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    ff_mdct_end(&amp;amp;amp;q-&amp;amp;gt;mdct_ctx);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Free the vlc table */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    free_vlc(&amp;amp;amp;q-&amp;amp;gt;vlc_table);&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic;color: #808080;&amp;quot;&amp;gt;/* Return 0 if everything is ok, -1 if not */&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0000ff;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;AVCodec glue_decoder =&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .name           = &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #dd0000;&amp;quot;&amp;gt;&amp;quot;glue&amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .type           = CODEC_TYPE_AUDIO,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .id             = CODEC_ID_GLUE,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .priv_data_size = &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;font-weight: bold;color: #000000;&amp;quot;&amp;gt;sizeof&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;(GLUEContext),&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .init           = glue_decode_init,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .close          = glue_decode_close,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;    .decode         = glue_decode_frame,&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #000000;&amp;quot;&amp;gt;};&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== trouble shooting ===&lt;br /&gt;
Invalid pixel format '(null)'&lt;br /&gt;
Output pad &amp;quot;default&amp;quot; with type video of the filter instance &amp;quot;Parsed_null_0&amp;quot; of null not connected to any destination&lt;br /&gt;
Error opening filters!&lt;br /&gt;
&lt;br /&gt;
meant encoder's description  &lt;br /&gt;
.pix_fmts   needs to end with AV_PIX_FMT_NONE&lt;br /&gt;
&lt;br /&gt;
== see also ==&lt;br /&gt;
&lt;br /&gt;
* [[FFmpeg demuxer howto]]&lt;br /&gt;
* [[FFmpeg programming conventions]]&lt;br /&gt;
&lt;br /&gt;
[[Category:FFmpeg Tutorials]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Rogerdpack</name></author>
	</entry>
	<entry>
		<id>https://wiki.multimedia.cx/index.php?title=HuffYUV&amp;diff=15148</id>
		<title>HuffYUV</title>
		<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php?title=HuffYUV&amp;diff=15148"/>
		<updated>2015-01-29T19:14:01Z</updated>

		<summary type="html">&lt;p&gt;Rogerdpack: add some &amp;quot;noted lacking&amp;quot; details LOL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''This page is based on the document 'Description of the HuffYUV (HFYU) Codec' by Roberto Togni found at [http://multimedia.cx/huffyuv.txt http://multimedia.cx/huffyuv.txt].''&lt;br /&gt;
&lt;br /&gt;
* FourCC: HFYU&lt;br /&gt;
* Website: [http://neuron2.net/www.math.berkeley.edu/benrg/huffyuv.html http://neuron2.net/www.math.berkeley.edu/benrg/huffyuv.html]&lt;br /&gt;
* Samples: [http://samples.mplayerhq.hu/V-codecs/HuffYUV/ http://samples.mplayerhq.hu/V-codecs/HuffYUV/]&lt;br /&gt;
&lt;br /&gt;
HuffYUV is a lossless video compressor for [[Microsoft Audio/Video Interleaved|AVI]] files written by Ben Rudiak-Gould. Source code is available and distributed (mostly) under the GNU General Public License. This codec was created to temporarily store video data coming from a capture card for later editing, so its main features are:&lt;br /&gt;
* speed: uses simple predictors and original version is heavily optimized.&lt;br /&gt;
* quality: lossless, so image is not degraded if read/written many times.&lt;br /&gt;
* editable: every frame is intracoded (a.k.a., a keyframe) so there are no interframe dependencies and each frame can be seeked to independently and decoded on its own.&lt;br /&gt;
&lt;br /&gt;
== Tech Notes From Author's Page (referring to v 2.1.1) ==&lt;br /&gt;
&lt;br /&gt;
HuffYUV's algorithm is roughly the same as lossless JPEG: it predicts each sample and Huffman-encodes the error. The predictor functions are:&lt;br /&gt;
* &amp;quot;left&amp;quot; (predicts the previous sample from the same channel)&lt;br /&gt;
* &amp;quot;gradient&amp;quot; (predicts Left+Above-AboveLeft)&lt;br /&gt;
* &amp;quot;median&amp;quot; (predicts the median of Left, Above, and the gradient predictor). Channels are compressed separately, but in RGB mode the channels used are actually R-G, G, and B-G. This yields much better compression than R, G, B.&lt;br /&gt;
&lt;br /&gt;
The error signal in each channel is encoded with its own Huffman table. On compression HuffYUV picks appropriate tables from its built-in collection. These tables are then stored in the output file and used when decompressing. This way future versions of HuffYUV can decompress old files without my having to explicitly support old tables. A Huffyuv-savvy application can also specify the Huffman tables to be used for compression instead of accepting the defaults.&lt;br /&gt;
&lt;br /&gt;
== File Header ==&lt;br /&gt;
&lt;br /&gt;
All information about the image format and predictor are stored into the [[BITMAPINFOHEADER]] structure of the AVI file header.&lt;br /&gt;
&lt;br /&gt;
=== BITMAPINFOHEADER Layout ===&lt;br /&gt;
&lt;br /&gt;
Only the interesting fields are shown here:&lt;br /&gt;
&lt;br /&gt;
 HUFFYUV_BITMAPINFOHEADER {&lt;br /&gt;
  int biSize&lt;br /&gt;
  [...]&lt;br /&gt;
  short biBitCount&lt;br /&gt;
  int biCompression&lt;br /&gt;
  [...]&lt;br /&gt;
  Extradata {&lt;br /&gt;
   BYTE method&lt;br /&gt;
   BYTE bpp_override&lt;br /&gt;
   BYTE unused[2]  &lt;br /&gt;
  }&lt;br /&gt;
  BYTE Compressed_Huffmantables[]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Extradata and Compressed_Huffmantables fields are not always there.&lt;br /&gt;
&lt;br /&gt;
biCompression contains &amp;quot;HFYU&amp;quot; FOURCC.&lt;br /&gt;
&lt;br /&gt;
biSize is the size of the whole structure and it is used to find out if extra fields are there, since size of standard BITMAPINFOHEADER is known.&lt;br /&gt;
&lt;br /&gt;
To find out image format you need to get true bit count: it is stored in bpp_override if biSize &amp;gt; sizeof(BITMAPINFOHEADER), else (or if bpp_override is 0) it is stored in biBitCount. Then you can retrieve the image format with this table&lt;br /&gt;
&lt;br /&gt;
 +-----+-------+&lt;br /&gt;
 | bit | image |&lt;br /&gt;
 +-----+-------+&lt;br /&gt;
 | 16  | YUY2  |&lt;br /&gt;
 | 24  | RGB   |&lt;br /&gt;
 | 32  | RGBA  |&lt;br /&gt;
 +-----+-------+&lt;br /&gt;
&lt;br /&gt;
In the rest of this description YUV will indicate image of type [[YUY2]], and RGB will be used for both RGB and RGBA.&lt;br /&gt;
&lt;br /&gt;
To find out the prediction method you have to mask the 3 least significant bits of biBitCount (biBitCount &amp;amp; 0x07) and use them to index into this table:&lt;br /&gt;
&lt;br /&gt;
 +-----+-------------+&lt;br /&gt;
 | bit |   method    |&lt;br /&gt;
 +-----+-------------+&lt;br /&gt;
 | 000 | see below   |&lt;br /&gt;
 | 001 | left        |&lt;br /&gt;
 | 010 | left decorr |&lt;br /&gt;
 | 011 | gradient *  |&lt;br /&gt;
 | 100 | median      |&lt;br /&gt;
 +-----+-------------+&lt;br /&gt;
&lt;br /&gt;
If the gradient method is selected (011) and the colorspace is RGB, the method is actually gradient with decorrelation.&lt;br /&gt;
&lt;br /&gt;
If (biBitCount &amp;amp; 0x07) is 0, method is stored in extradata if biSize &amp;gt; sizeof(BITMAPINFOHEADER), else method is predict_old (the method used in version 1.x, it's the same as predict left). To find out method from extradata method byte use this table&lt;br /&gt;
&lt;br /&gt;
 +------+-----------------+&lt;br /&gt;
 | byte |   method        |&lt;br /&gt;
 +------+-----------------+&lt;br /&gt;
 |  -2  | old             |&lt;br /&gt;
 |   0  | left            |&lt;br /&gt;
 |   1  | gradient        |&lt;br /&gt;
 |   2  | median          |&lt;br /&gt;
 |  64  | left decorr     |&lt;br /&gt;
 |  65  | gradient decorr |&lt;br /&gt;
 +------+-----------------+&lt;br /&gt;
&lt;br /&gt;
Huffman tables may be stored in the file (v2.x) or not (v1.x). If biSize = sizeof(BITMAPINFOHEADER) tables are not stored into file, and to decode data the decoder must know classic tables, choosing &lt;br /&gt;
RGB or YUV as appropriate. Otherwise, tables are stored in file: if (biBitCount &amp;amp; 0x07) = 0 tables start at the end of BITMAPINFOHEADER, else they start after Extradata.&lt;br /&gt;
&lt;br /&gt;
== Huffman Tables ==&lt;br /&gt;
&lt;br /&gt;
Huffman tables are stored in file compressed with a run-length algorithm. This is what Ben Rudiak-Gould says about it in source code (tables.cpp)&lt;br /&gt;
&lt;br /&gt;
 // The Huffman tables are run-length encoded.  (I could have Huffman-&lt;br /&gt;
 // encoded them, but the madness has to end somewhere.)  The&lt;br /&gt;
 // decompression algorithm is as follows: Read a byte.  The lower five&lt;br /&gt;
 // bits are the value to repeat.  If the upper three bits are zero, the&lt;br /&gt;
 // repeat count is in the next byte; otherwise, the upper three bits are&lt;br /&gt;
 // the repeat count.  The tables are zero-terminated so that I can use&lt;br /&gt;
 // string functions on them (a zero byte can never appear in the RLE&lt;br /&gt;
 // data).&lt;br /&gt;
 &lt;br /&gt;
 // Each array actually contains three Huffman tables, one for each sample&lt;br /&gt;
 // type (e.g. Y,U,V, or R-G,G,B-G).  Each table expands to 256 bytes, and&lt;br /&gt;
 // each byte is a code length.  The codes themselves are determined at&lt;br /&gt;
 // run time and are not stored here--except for the &amp;quot;classic&amp;quot; tables,&lt;br /&gt;
 // which don't fit the code-choosing algorithm.&lt;br /&gt;
&lt;br /&gt;
When the 3 tables are available (either extracted and decompressed, or known because the file was compressed with v1.x of the codec) the decoder can extract data from the encoded byte stream.&lt;br /&gt;
&lt;br /&gt;
Tables are stored in file in this order:&lt;br /&gt;
* YUV: Y_table, U_table, V_table&lt;br /&gt;
* RGB: B_table, G_table, R_table&lt;br /&gt;
* RGB with decorrelation: B-G_table, G_table, R-G_table&lt;br /&gt;
&lt;br /&gt;
== Frame decompression ==&lt;br /&gt;
&lt;br /&gt;
=== General info ===&lt;br /&gt;
&lt;br /&gt;
One frame is stored per AVI chunk. All frames in file are marked as keyframes. You only need data from current chunk and file header to decompress a frame (no knowledge of previous frames or frame position in file is needed).&lt;br /&gt;
&lt;br /&gt;
=== Operating Algorithm ===&lt;br /&gt;
&lt;br /&gt;
The HuffYUV codec compresses an image by predicting the value of a pixel from its neighbors, and computes an error value (delta) by subtracting it from the effective pixel value. The result of this operation is then compressed with a Huffman algorithm, using a different table for each channel. To decompress a frame the decoder needs to reverse this process: extract the error value from the compressed Huffman stream, then reconstruct the pixel value by computing the predictor value and adding it to the error value. To make this process possible you need a start value (the first pixel in a frame) and a predictor that uses only values from past pixels (already decompressed). Obviously, all predictors used in HuffYUV satisfy this requirement.&lt;br /&gt;
&lt;br /&gt;
All pixel component values must be treated as unsigned bytes. In all computations overflow or underflow causes a wrap-around (i.e., no saturation).&lt;br /&gt;
&lt;br /&gt;
If decorrelation is used (RGB only), then instead of compressing R, G, B components the codec compresses R-G, G, B-G usually resulting in better compression. To reconstruct B and R values you have to add them the value of G taken from the same pixel.&lt;br /&gt;
&lt;br /&gt;
=== Bitstream ===&lt;br /&gt;
&lt;br /&gt;
The components of the image are compressed with different Huffman tables and then the bitstreams are interleaved.&lt;br /&gt;
&lt;br /&gt;
As an example suppose there are 3 components (the values represent the difference between the pixel value and the predictor output). The byte sequence [ABC][DEF][GHI][LMN] is compressed in this way:&lt;br /&gt;
* Compress each byte of the first triplet [ABC] using the Huffan table associated with its component. The decoder will output 3 variable length codes. Suppose you get aaaa by compression of A, bbbbbbb from B and ccc from C. The output bitstream will be aaaabbbbbbccc.&lt;br /&gt;
* Repeat the process for every triplet, adding the new bits at the end of the stream. If compression of [DEF] will give dddd eee fffff, the output stream after second pixel will be aaaabbbbbbcccddddeeefffff.&lt;br /&gt;
&lt;br /&gt;
To decompress this sequence, keep extracting bits from the stream until you get a valid code (the table contains all valid codes), and then you decode it using the table associated with that component. In the example above you will get the 4 bit aaaa and decode them to A. After decoding the current component you need to remove decoded bits from the stream (the bitstream now contains bbbbbbcccddddeeefffff), and start decoding the next component. When the first triplet [ABC] is decoded the stream will be ddddeeefffff, and the decoder is ready to start again with the first component of the next pixel.&lt;br /&gt;
&lt;br /&gt;
=== Data order ===&lt;br /&gt;
&lt;br /&gt;
This is how data is stored in then encoded stream. The meaning of the stream format line is: &lt;br /&gt;
* a capital letter is used to indicate an uncompressed value 1 byte long&lt;br /&gt;
* small letters represent Huffman-coded values &lt;br /&gt;
The length in bits of Huffman-coded values depend on the size of the code word (after decompression all delta values are 1byte long).&lt;br /&gt;
&lt;br /&gt;
==== YUV Data ====&lt;br /&gt;
Image data is encoded and decoded left to right, top to bottom. Each pixel pair is represented by 4 bytes using YUY2 format. Frame width is always even.&lt;br /&gt;
 Stream format: Y U Y V y u y v y u y v ....&lt;br /&gt;
where YUYV are the first two pixels, and y, u, v are the error values. y is decompressed with Y_table, u with U_table and v with V_table.&lt;br /&gt;
&lt;br /&gt;
==== RGB Data ====&lt;br /&gt;
Image is stored left to right, bottom to top. Each pixel is represented by 3 bytes, using BGR24 format. &lt;br /&gt;
 Stream format: X B G R b g r b g r ....&lt;br /&gt;
where X is unused, BGR is the first pixel, and b, g, r are the error values. b is decompressed with B_table, g with G_table and r with R_table.&lt;br /&gt;
&lt;br /&gt;
==== RGB Data With Decorrelation ====&lt;br /&gt;
Image is stored left to right, bottom to top. Each pixel is represented by 3 bytes, using BGR24 format.&lt;br /&gt;
 Stream format: X B G R g bg rg g bg rg ....&lt;br /&gt;
where X is unused, BGR is the first pixel, and g, bg, rg are the error values. g is decompressed with G_table, bg with B-G_table and rg with R-G_table.&lt;br /&gt;
&lt;br /&gt;
==== RGBA Data ====&lt;br /&gt;
Image is stored left to right, bottom to top. Each pixel is represented by 4 bytes, using BGR24 format plus alpha channel.&lt;br /&gt;
 Stream format: B G R A b g r a b g r a ....&lt;br /&gt;
where BGRA is the first pixel, and b, g, r, a are the error values. b is decompressed with B_table, g with G_table, r with R_table and a with R_table.&lt;br /&gt;
&lt;br /&gt;
==== RGBA Data With Decorrelation ====&lt;br /&gt;
Image is stored left to right, bottom to top. Each pixel is represented by 4 bytes, using BGR24 format plus alpha channel.&lt;br /&gt;
 Stream format: B G R A g bg rg a g bg rg a ....&lt;br /&gt;
where BGRA is the first pixel, and g, bg, rg, a are the error values. g is decompressed with G_table, bg with B-G_table, br with R-G_table and a with R-G_table.&lt;br /&gt;
&lt;br /&gt;
== Predictors ==&lt;br /&gt;
&lt;br /&gt;
Predictors are used to guess the value of the next pixel so that the codec needs to store only the error between the real pixel value and the prediction. If the prediction model is good the error will be small, and will compress better than full pixel values.&lt;br /&gt;
&lt;br /&gt;
Valid predictors are:&lt;br /&gt;
* YUV: old, left, gradient, median.&lt;br /&gt;
* RGB: old, left, left with decorrelation, gradient with decorrelation.&lt;br /&gt;
&lt;br /&gt;
Other combinations (e.g. RGB gradient without decorrelation), while technically feasible, are not used.&lt;br /&gt;
&lt;br /&gt;
While describing predictors, the following symbols are used:&lt;br /&gt;
* [A B C]: components of a pixel&lt;br /&gt;
* Ayz: component A of pixel at row y and column z&lt;br /&gt;
* a, b, c: indices used for columns&lt;br /&gt;
* n, m: indices used for rows&lt;br /&gt;
* x: index used to indicate the last column of a frame&lt;br /&gt;
&lt;br /&gt;
=== Predict Left, Predict Left With Decorrelation, And Predict Old ===&lt;br /&gt;
&lt;br /&gt;
Predict old is the same as predict left (without decorrelation for RGB case).&lt;br /&gt;
&lt;br /&gt;
The predictor for a pixel component is the same component from previous pixel (previous pair for U, V in YUV case).&lt;br /&gt;
&lt;br /&gt;
Some examples:&lt;br /&gt;
* random pixel inside a row, RGB&lt;br /&gt;
  ...... [Ban Gan Ran] [Bam Gam Ram] ......&lt;br /&gt;
The predictor for Gam is Gan&lt;br /&gt;
&lt;br /&gt;
* random pixel inside a row, YUV&lt;br /&gt;
  .......[Y1an Uan Y2an Van] [Y1am Uam Y2am Vam] .......&lt;br /&gt;
The predictor for Uam is Uan, for Y1am is Y2an, for Y2am is Y1am&lt;br /&gt;
&lt;br /&gt;
*first pixel in a row (not for first row), RGB&lt;br /&gt;
 [Ba1 Ga1 Ra1] ........ [Bax Gax Rax]&lt;br /&gt;
 [Bb1 Gb1 Rb1] ......&lt;br /&gt;
The predictor for Rb1 is Rax&lt;br /&gt;
&lt;br /&gt;
*first pixel in a row (not for first row), YUV&lt;br /&gt;
 [Y1a1 Ua1 Y2a1 Va1] ........ [Y1ax Uax Y2ax Vax]&lt;br /&gt;
 [Y1b1 Ub1 Y2b1 Vb1] ......&lt;br /&gt;
The predictor for Ub1 is Uax, for Y2b1 is Y1b1, for Y1b1 is Y2ax&lt;br /&gt;
&lt;br /&gt;
The first pixel of the picture is stored uncompressed, the rest of the frame is compressed with the predict left algorithm.&lt;br /&gt;
&lt;br /&gt;
=== Predict gradient and predict gradient with decorrelation ===&lt;br /&gt;
&lt;br /&gt;
The predictor for a pixel is given by the sum of the previous pixel (like predict left) and the above pixel (the pixel from the row above at the same column), minus the above left pixel (the pixel from the row above at the previous column).&lt;br /&gt;
&lt;br /&gt;
Some examples:&lt;br /&gt;
* random pixel inside a row, RGB&lt;br /&gt;
  ...... [Ban Gan Ran] [Bam Gam Ram] ......&lt;br /&gt;
  .......[Bbn Gbn Rbn] [Bbm Gbm Rbm]&lt;br /&gt;
The predictor for Gbm is (Gbn + Gam - Gan)&lt;br /&gt;
&lt;br /&gt;
* random pixel inside a row, YUV&lt;br /&gt;
  .......[Y1an Uan Y2an Van] [Y1am Uam Y2am Vam] .......&lt;br /&gt;
  .......[Y1bn Ubn Y2bn Vbn] [Y1bm Ubm Y2bm Vbm] .......&lt;br /&gt;
** The predictor for Ubm is (Ubn + Uam - Uan)&lt;br /&gt;
** The predictor for Y1bm is (Y2bn + Y1am - Y2an)&lt;br /&gt;
** The predictor for Y2bm is (Y1bm + Y2am - Y1am)&lt;br /&gt;
&lt;br /&gt;
* first pixel in a row (not for first row), RGB&lt;br /&gt;
 [Ba1 Ga1 R11] ........ [Bax Gax Rax]&lt;br /&gt;
 [Bb1 Gb1 Rb1] ........ [Bbx Gbx Rbx]&lt;br /&gt;
 [Bc1 Gc1 Rc1] ......&lt;br /&gt;
** The predictor for Rc1 is (Rbx + Rb1 - Rax)&lt;br /&gt;
&lt;br /&gt;
* first pixel in a row (not for first row), YUV&lt;br /&gt;
 [Y1a1 Ua1 Y2a1 Va1] ........ [Y1ax Uax Y2ax Vax]&lt;br /&gt;
 [Y1b1 Ub1 Y2b1 Vb1] ........ [Y1bx Ubx Y2bx Vbx]&lt;br /&gt;
 [Y1c1 Uc1 Y2c1 Vc1] ......&lt;br /&gt;
** The predictor for Uc1 is (Ubx + Ub1 - Uax)&lt;br /&gt;
** The predictor for Y2c1 is (Y1c1 + Y2b1 - Y1b1)&lt;br /&gt;
** The predictor for Y1c1 is (Y2bx + Y1b1 - Y2ax)&lt;br /&gt;
&lt;br /&gt;
The first pixel of the picture is stored uncompressed, and the remainder of the first row is compressed with the predict left algorithm. Other rows are compressed with predict gradient. The above left value for the first pixel of the second row is 0.&lt;br /&gt;
&lt;br /&gt;
Maybe other pixels of the second row should ignore above left values, but I'm not sure about it.&lt;br /&gt;
&lt;br /&gt;
=== Predict Median (YUV only) ===&lt;br /&gt;
&lt;br /&gt;
The predictor for a pixel is given by the median value among the left pixel, the pixel above and the gradient predictor (sum of the previous pixel and the above pixel, minus the above left pixel). The median is obtained by sorting the three values and taking the one in the middle, and have nothing to do &lt;br /&gt;
with the mean value of the three numbers. For example, if the left pixel is 0x12, the above pixel is 0x4e and the gradient predictor is 0xaf, the median is 0x4e.&lt;br /&gt;
&lt;br /&gt;
As Ben Rudiak-Gould says on his page, there is no technical reason for this method to be YUV only, he simply didn't implement it for RGB case.&lt;br /&gt;
&lt;br /&gt;
Some examples:&lt;br /&gt;
* random pixel inside a row, YUV&lt;br /&gt;
  .......[Y1an Uan Y2an Van] [Y1am Uam Y2am Vam] .......&lt;br /&gt;
  .......[Y1bn Ubn Y2bn Vbn] [Y1bm Ubm Y2bm Vbm] .......&lt;br /&gt;
** The predictor for Ubm is the median value of Ubn, Uam and (Ubn + Uam - Uan)&lt;br /&gt;
** The predictor for Y1bm is the median value of Y2bn, Y1am and (Y2bn + Y1am - Y2an)&lt;br /&gt;
** The predictor for Y2bm is the median value of Y1bm, Y2am and (Y1bm + Y2am - Y1am)&lt;br /&gt;
&lt;br /&gt;
* first pixel in a row (not for first row), YUV&lt;br /&gt;
 [Y1a1 Ua1 Y2a1 Va1] ........ [Y1ax Uax Y2ax Vax]&lt;br /&gt;
 [Y1b1 Ub1 Y2b1 Vb1] ........ [Y1bx Ubx Y2bx Vbx]&lt;br /&gt;
 [Y1c1 Uc1 Y2c1 Vc1] ......&lt;br /&gt;
** The predictor for Uc1 is the median value of Ubx, Ub1 and (Ubx + Ub1 - Uax)&lt;br /&gt;
** The predictor for Y2c1 is the median value of Y1c1, Y2b1 and (Y1c1 + Y2b1 - Y1b1)&lt;br /&gt;
** The predictor for Y1c1 is the median value of Y2bx, Y1b1 and (Y2bx + Y1b1 - Y2ax)&lt;br /&gt;
&lt;br /&gt;
The first pixel of the picture is stored uncompressed. The remaining of the first row, and the first 4 pixel (2 pairs, 8 bytes) of the second row are compressed with the predict left algorithm. The rest of the second row and other rows are compressed with predict median.&lt;br /&gt;
&lt;br /&gt;
Technically the second pixel of the second row could be compressed using median predictor; it's compressed with left predictor because original code uses MMX instructions and can handle 8 bytes a time.&lt;br /&gt;
&lt;br /&gt;
== Interlaced images ==&lt;br /&gt;
&lt;br /&gt;
If image height is greater than 288 pixel, the image is treated as interlaced. The decoder must build an image with double width and half height, obtained by placing the two fields side by side, with the odd field on the left. The frame size reported in the file header is unchanged, the only way to find out interlacing is by comparing the image height with 288.&lt;br /&gt;
&lt;br /&gt;
As an example, suppose your original frame is&lt;br /&gt;
&lt;br /&gt;
 1111111111111111&lt;br /&gt;
 2222222222222222&lt;br /&gt;
 3333333333333333&lt;br /&gt;
 4444444444444444&lt;br /&gt;
 5555555555555555&lt;br /&gt;
 6666666666666666&lt;br /&gt;
 7777777777777777&lt;br /&gt;
 8888888888888888&lt;br /&gt;
&lt;br /&gt;
then the frame to be compressed will be&lt;br /&gt;
&lt;br /&gt;
 11111111111111112222222222222222&lt;br /&gt;
 33333333333333334444444444444444&lt;br /&gt;
 55555555555555556666666666666666&lt;br /&gt;
 77777777777777778888888888888888&lt;br /&gt;
&lt;br /&gt;
In this way every line on a field gets the values for the predictors from the previous line of the same field, instead of using the previous line of the frame.&lt;br /&gt;
&lt;br /&gt;
Please note that it makes a difference only for prediction methods that use values from the previous line (median and gradient algorithms): if a method refers only to the value of the previous pixel (left algorithms) interlacing can be ignored.&lt;br /&gt;
&lt;br /&gt;
== Final notes ==&lt;br /&gt;
&lt;br /&gt;
The frame width must be divisible by 4 (at least for the original codec).&lt;br /&gt;
&lt;br /&gt;
It is likely that the header parsing logic can be simplified a lot since not every combination of options is valid. This is what I was able to create using dll v2.1.1 and 1.2.3/1.3.1 and VirtualDub under Windows:&lt;br /&gt;
* Old format (v1.x only) is only used with classical tables (not stored in file)&lt;br /&gt;
* Other methods (v2.1.1) always store tables in file, and uses extradata to store method.&lt;br /&gt;
&lt;br /&gt;
The first two(?) pixels (or 4 bytes) of the second row in predict gradient could be stored in a different way, using only left and above pixel as predictor. None of my samples require this.&lt;br /&gt;
&lt;br /&gt;
Also found on the web &amp;quot; the exact nature of the VLC bitstream: 32-bit words in little endian format, codewords placed starting from the MSB, Huffman codes allocated longest codeword first, and with a maximum codeword length of 31 bits.&amp;quot; http://www.virtualdub.org/blog/pivot/entry.php?id=203&lt;br /&gt;
&lt;br /&gt;
[[Category:Video Codecs]]&lt;br /&gt;
[[Category:Lossless Video Codecs]]&lt;/div&gt;</summary>
		<author><name>Rogerdpack</name></author>
	</entry>
	<entry>
		<id>https://wiki.multimedia.cx/index.php?title=FFmpeg_Summer_of_Code_2013&amp;diff=14539</id>
		<title>FFmpeg Summer of Code 2013</title>
		<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php?title=FFmpeg_Summer_of_Code_2013&amp;diff=14539"/>
		<updated>2013-03-31T00:42:18Z</updated>

		<summary type="html">&lt;p&gt;Rogerdpack: fix typo, cleanup semicolons&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Ffmpeg-logo-gsoc.jpg]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
FFmpeg is the universal multimedia toolkit: a complete, cross-platform solution to record, convert, filter and stream audio and video. It includes libavcodec - the leading audio/video codec library.&lt;br /&gt;
&lt;br /&gt;
[https://developers.google.com/open-source/soc/ Google Summer of Code (GSoC)] is a program that offers students stipends to write code for open source projects. Through the guidance of mentors, students gain valuable experience interacting with and coding for open source projects like FFmpeg. Additionally, the project and its users benefit from code created from students who often continue contributing as developers. FFmpeg participated to several past editions ([[FFmpeg Summer Of Code 2006|2006]], [[FFmpeg Summer Of Code 2007|2007]], [[FFmpeg Summer Of Code 2008|2008]], [[FFmpeg Summer Of Code 2009|2009]], [[FFmpeg Summer Of Code 2010|2010]], and [[FFmpeg / Libav Summer Of Code 2011|2011]]), and we are looking forward to being involved this year. &lt;br /&gt;
&lt;br /&gt;
This is our ideas page for [http://www.google-melange.com/gsoc/homepage/google/gsoc2013 Google Summer of Code 2013].&lt;br /&gt;
&lt;br /&gt;
== Information for Students ==&lt;br /&gt;
&lt;br /&gt;
=== Getting Started ===&lt;br /&gt;
&lt;br /&gt;
0. '''Get to know FFmpeg.''' If you are a student and interested in contributing to an FFmpeg GSoC project it is recommended to start by subscribing to the [http://ffmpeg.org/mailman/listinfo/ffmpeg-devel ffmpeg-devel] mailing-list, visiting our IRC channels (''#ffmpeg-devel'' and ''#ffmpeg''), and exploring the codebase and the development workflow. Feel free to [[#Contacting_FFmpeg|contact us]] if you have any questions.&lt;br /&gt;
&lt;br /&gt;
1. '''Find a project.''' Listed on this page are mentored and unmentored projects. Mentored projects are well-defined and mentors have already volunteered. Unmentored projects are additional ideas that you may consider, but you will have to contact us to find a mentor. You may also propose your own project that may be a better match for your interest and skill level.&lt;br /&gt;
&lt;br /&gt;
2. '''Contact us.''' If you find a project that you are interested in then get in touch with the community and let us know. In case you want to work on a qualification task, you should ask the appointed mentors so that the task can be claimed.&lt;br /&gt;
&lt;br /&gt;
3. '''Apply.''' Student proposal period begins April 22, 2013 at 19:00 UTC and ends May 3rd at 19:00 UTC. See the [http://www.google-melange.com/gsoc/document/show/gsoc_program/google/gsoc2013/help_page#2._What_is_the_program_timeline GSoC timeline] for additional information.&lt;br /&gt;
&lt;br /&gt;
=== Qualification Tasks ===&lt;br /&gt;
&lt;br /&gt;
In order to get accepted you will be requested to complete a small task in the area you want to contribute. FFmpeg GSoC projects can be challenging, and a qualification task will show us that you are motivated and have the potential to finish a project.&lt;br /&gt;
&lt;br /&gt;
The qualification task is usually shown in the project description. Contact the appointed mentors for assistance on getting a related qualification task or if you want to propose your own. See a list of [[Small FFmpeg Tasks]] or browse the [https://ffmpeg.org/trac/ffmpeg FFmpeg Bug Tracker] for qualification task ideas.&lt;br /&gt;
&lt;br /&gt;
=== Contacting FFmpeg ===&lt;br /&gt;
&lt;br /&gt;
If you have questions or comments feel free to contact us via our mailing list, IRC channel, or e-mail one of the FFmpeg GSoC admins:&lt;br /&gt;
&lt;br /&gt;
* '''Mailing-list:''' [http://ffmpeg.org/mailman/listinfo/ffmpeg-devel ffmpeg-devel]&lt;br /&gt;
* '''IRC:''' ''#ffmpeg-devel'' on Freenode&lt;br /&gt;
* '''FFmpeg GSoC Admins:''' [[User:Stefanosa|Stefano Sabatini]] and [[User:Llogan|Lou Logan]]&lt;br /&gt;
&lt;br /&gt;
You can also contact a mentor directly if you have questions specifically related to one of the projects listed on this page.&lt;br /&gt;
&lt;br /&gt;
= Mentored Projects =&lt;br /&gt;
&lt;br /&gt;
This section lists well-defined projects that have one or more available mentors. If you are new to FFmpeg, and have relatively little experience with multimedia, you should favor a mentored project rather than propose your own. Contact the appointed mentor(s) to get more information about the project and the requested qualification task.&lt;br /&gt;
&lt;br /&gt;
== H.264 Multiview Video Coding (MVC) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;[[Image:Mmspg-epfl-ch-double-camera.jpg]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Description:''' MVC samples exist and the codec is used on Blu-ray media, but FFmpeg is missing a decoder. Since this project also consists of some changes in the current architecture, it is especially important that this project is discussed on the [http://ffmpeg.org/mailman/listinfo/ffmpeg-devel ffmpeg-devel mailing list].&lt;br /&gt;
&lt;br /&gt;
'''Expected results:''' Create MVC decoder and add a test for the FFmpeg Automated Testing Environment (FATE).&lt;br /&gt;
&lt;br /&gt;
'''Prerequisites:''' C coding skills, familiarity with git/source code control systems.&lt;br /&gt;
&lt;br /&gt;
'''Qualification Task:''' Perform work that demonstrates understanding of MVC and that is a subpart of the whole MVC implementation.&lt;br /&gt;
&lt;br /&gt;
'''Mentor:''' [[User:Michael|Michael Niedermayer]] (''michaelni'' on IRC)&lt;br /&gt;
&lt;br /&gt;
'''Backup mentor:''' Kieran Kunhya (kierank on IRC)&lt;br /&gt;
&lt;br /&gt;
== Animated Portable Network Graphics (APNG) ==&lt;br /&gt;
&lt;br /&gt;
'''Description:''' FFmpeg currently does not support Animated PNGs.&lt;br /&gt;
&lt;br /&gt;
'''Specification:''' https://wiki.mozilla.org/APNG_Specification&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;[[Image:Animated PNG example bouncing beach ball.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Expected results:'''&lt;br /&gt;
* APNG demuxer&lt;br /&gt;
** implement robust probing:&lt;br /&gt;
*** PNG images are not misdetected as APNG animations&lt;br /&gt;
*** APNG animations are not misdetected as PNG images&lt;br /&gt;
** splits stream into sensible packets (so they can be easily reused in APNG muxer)&lt;br /&gt;
** survives fuzzing (zzuf)&lt;br /&gt;
** add FATE coverage, coverage should be at least 70%&lt;br /&gt;
** test code under valgrind so no invalid reads/writes happen&lt;br /&gt;
&lt;br /&gt;
* APNG decoder&lt;br /&gt;
** use existing PNG decoder code (write decoder in same file)&lt;br /&gt;
** implement parsing of all APNG chunks (acTL, fcTL, fdAT)&lt;br /&gt;
** error handling&lt;br /&gt;
** survives fuzzing (zzuf) &lt;br /&gt;
** add test for FATE, coverage should be at least 75%&lt;br /&gt;
** CRC checksum validation&lt;br /&gt;
** test code under valgrind so no invalid reads/writes happen&lt;br /&gt;
&lt;br /&gt;
* APNG muxer &amp;amp;&amp;amp; APNG encoder&lt;br /&gt;
** use existing PNG encoder code (write encoder in same file)&lt;br /&gt;
** write compliant files, make sure they play correctly in major web browsers that support APNG&lt;br /&gt;
** add test for FATE&lt;br /&gt;
&lt;br /&gt;
'''Prerequisites:''' C coding skills, familiarity with git/source code control systems.&lt;br /&gt;
&lt;br /&gt;
'''Qualification Task:''' Implement format autodetection for imagepipe &amp;amp; image demuxer&lt;br /&gt;
&lt;br /&gt;
'''Mentor:''' [[User:Pbm|Paul B Mahol]] (''durandal_1707'' on IRC)&lt;br /&gt;
&lt;br /&gt;
'''Backup mentor:''' [[User:Suxen_drol|Peter Ross]] (''pross-au'' on IRC)&lt;br /&gt;
&lt;br /&gt;
== Misc Libavfilter extension ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;[[Image:Lavfi-gsoc-filter-vintage-illustration.jpg]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Description:''' Libavfilter is the FFmpeg filtering library. It currently supports audio and video filtering and generation support. This work may focus on porting, fixing, extending, or writing new audio and video filters from scratch. &lt;br /&gt;
&lt;br /&gt;
Candidate filters for porting may be the remaining MPlayer filters currently supported through the mp wrapper, libaf MPlayer filters, and filters from other frameworks (e.g. mjpegtools, transcode, avisynth, virtualdub, etc.). In case of mp ports, the student should verify that the new filter produces the same output and is not slower.&lt;br /&gt;
&lt;br /&gt;
Some ideas for more filters:&lt;br /&gt;
* a frequency filtering domain filter relying on the FFT utils in libavcodec&lt;br /&gt;
* a controller filter which allows to send commands to other filters (e.g. to adjust volume, contrast, etc.), e.g. like the sendcmd filter but through an interactive GUI&lt;br /&gt;
* a lua scripting filter, which allows to implement filtering custom logic in lua&lt;br /&gt;
&lt;br /&gt;
For more ideas check:&lt;br /&gt;
[https://ffmpeg.org/trac/ffmpeg/query?status=new&amp;amp;status=open&amp;amp;status=reopened&amp;amp;component=avfilter&amp;amp;col=id&amp;amp;col=summary&amp;amp;col=status&amp;amp;col=type&amp;amp;col=priority&amp;amp;col=component&amp;amp;col=version&amp;amp;order=priority trac libavfilter tickets].&lt;br /&gt;
&lt;br /&gt;
'''Expected results:''' Write or port audio and video filters and possibly fix/extend libavfilter API and design when required.&lt;br /&gt;
&lt;br /&gt;
'''Prerequisites:''' C coding skills, familiarity with git/source code control systems. Some background on DSP and image/sound processing techniques would be a bonus but is not strictly required.&lt;br /&gt;
&lt;br /&gt;
'''Qualification Task:''' write or port one or more filters&lt;br /&gt;
&lt;br /&gt;
'''Mentor:''' [[User:Stefanosa|Stefano Sabatini]] (''saste'' in IRC)&lt;br /&gt;
&lt;br /&gt;
'''Backup mentor:''' [[User:Ubitux|Clément Bœsch]] (''ubitux'' on IRC)&lt;br /&gt;
&lt;br /&gt;
== Subtitles ==&lt;br /&gt;
&lt;br /&gt;
'''Description:''' FFmpeg has been working on improving its subtitles support recently, notably by adding the support for various text subtitles and various hardsubbing (burning the subtitles onto the video) facilities. While the theme may sound relatively simple compared to audio/video signal processing, the project carries an historical burden not easy to deal with, and introduces various issues very specific to its sparse form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Image:Subtitles-sensei.jpg]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Expected results:'''&lt;br /&gt;
* Add support for new subtitles formats. Example: a demuxer for .SUP files, just like VobSub but for Blu-Ray, or a VobSub muxer.&lt;br /&gt;
* Improve text subtitles decoders. Typically, this can be supporting advanced markup features in SAMI or WebVTT.&lt;br /&gt;
* Update the API to get rid of the clumsy internal text representation of styles&lt;br /&gt;
* Proper integration of subtitles into libavfilter. This is the ultimate goal, as it will notably allow a complete subtitles rendering for applications such as ffplay.&lt;br /&gt;
* BONUS: if everything goes well, the student will be allowed to add basic support for teletext&lt;br /&gt;
&lt;br /&gt;
'''Prerequisites:''' C coding skills, familiarity with git/source code control systems. Some background in fansubbing area (notably ASS experience) would be a bonus but is not strictly required.&lt;br /&gt;
&lt;br /&gt;
'''Qualification Task:''' write one subtitles demuxer and decoder (for example support for Spruce subtitles format). This is in order to make sure the subtitles chain is understood.&lt;br /&gt;
&lt;br /&gt;
'''Mentor:''' [[User:Ubitux|Clément Bœsch]] (''ubitux'' on IRC)&lt;br /&gt;
&lt;br /&gt;
'''Backup Mentor:''' Nicolas George (''Cigaes'' on IRC)&lt;br /&gt;
&lt;br /&gt;
== Postproc optimizations ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;[[Image:PostProc.jpg]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Description:''' FFmpeg contains libpostproc, which is used to postprocess 8x8 DCT-MC based video and images (jpeg, mpeg-1/2/4, H.263 among others). The code though has been written a long time ago and its SIMD optimizations need to be updated to what modern CPUs support (AVX2 and SSE2+).&lt;br /&gt;
&lt;br /&gt;
'''Expected results:'''&lt;br /&gt;
* Convert all gcc inline asm in libpostproc to YASM.&lt;br /&gt;
* Restructure the code so that it works with block sizes compatible with modern SIMD.&lt;br /&gt;
* Add Integer SSE2 and AVX2 optimizations for each existing MMX/MMX2/3dnow optimization in libpostproc.&lt;br /&gt;
&lt;br /&gt;
'''Prerequisites:''' C coding skills, good x86 assembly coding skills, familiarity with git/source code control systems.&lt;br /&gt;
&lt;br /&gt;
'''Qualification Task:''' convert 1 or 2 MMX2 functions to SSE2 and AVX2.&lt;br /&gt;
&lt;br /&gt;
'''Mentor:''' [[User:Michael|Michael Niedermayer]] (''michaelni'' on IRC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bayer RGB colorspaces ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;[[Image:350px-Bayer_pattern_on_sensor.svg.png ]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Description:''' Several image and video format store pixels using Bayer-pattern colorspaces. Supporting these format would broaden FFmpeg's applicability to RAW still and video photography processing.&lt;br /&gt;
&lt;br /&gt;
'''Expected Results:'''&lt;br /&gt;
* Rebase existing patches&lt;br /&gt;
* Implement high quality bayer transformations in libswscale (plain C)&lt;br /&gt;
* Add bayer formats to the libavutil pixfmt enumeration routines&lt;br /&gt;
* SIMD optimizations of the libswscale transformations&lt;br /&gt;
* Complete PhotoCINE demuxer to support Bayer format; (or another format of your choosing)&lt;br /&gt;
&lt;br /&gt;
Optional goodies:&lt;br /&gt;
* Extend TIFF decoder to support DNG-Bayer format&lt;br /&gt;
* Support a popular proprietary camera format (many to choose from; see dcraw project)&lt;br /&gt;
&lt;br /&gt;
'''Prerequisites''': C coding skills, familiarity with git/source code control systems.&lt;br /&gt;
&lt;br /&gt;
'''Qualification Task''': Implement a simple and working Bayer-&amp;gt;RGB transform in libswscale&lt;br /&gt;
&lt;br /&gt;
'''Mentor''': [[User:Suxen_drol|Peter Ross]] (''pross-au'' on IRC)&lt;br /&gt;
&lt;br /&gt;
'''Backup Mentor''': [[User:Michael|Michael Niedermayer]] (''michaelni'' on IRC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MPEG-4 ALS encoder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;http://upload.wikimedia.org/wikipedia/commons/e/e9/ATunes.png&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;[http://commons.wikimedia.org/wiki/File%3AATunes.png]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Description:''' &lt;br /&gt;
A MPEG-4 ALS decoder was implemented several years ago but an encoder is still missing in the official codebase. A rudimentary encoder has already been written and is available on [https://github.com/justinruggles/FFmpeg-alsenc.git github]. For this project, that encoder is first to be updated to fit into the current codebase of FFmpeg and to be tested for conformance using the [http://www.nue.tu-berlin.de/menue/forschung/projekte/beendete_projekte/mpeg-4_audio_lossless_coding_als/parameter/en/#230252 reference codec and specifications]. Second, the encoder is to be brought through the usual reviewing process to hit the codebase at the end of the project.&lt;br /&gt;
&lt;br /&gt;
'''Expected results:''' &lt;br /&gt;
&lt;br /&gt;
* Update the existing encoder to fit into the current codebase.&lt;br /&gt;
* Ensure conformance of the encoder by verifying using the reference codec and generate a test case for FATE.&lt;br /&gt;
* Ensure the FFmpeg decoder processes all generated files without warnings.&lt;br /&gt;
* Enhance the rudimentary feature set of the encoder.&lt;br /&gt;
&lt;br /&gt;
'''Prerequisites:''' C coding skills, familiarity with git/source code control systems. A certain interest in audio coding and/or knowledge about the FFmpeg codebase could be beneficial.&lt;br /&gt;
&lt;br /&gt;
'''Qualification Task:''' Add floating point support to MPEG-4 ALS decoder&lt;br /&gt;
&lt;br /&gt;
'''Mentor:''' [[User:Pbm|Paul B Mahol]] (''durandal_1707'' on IRC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware Acceleration (hwaccel) API v2 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;[[Image:Hardware.jpg]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Description:''' FFmpeg supports hardware accelerated decoding through the internal hwacel API. Currently supported system hardware acceleration APIs are VA-API (Linux), DXVA2 (Windows) and VDA (MacOS X). However, the current approach requires client applications to allocate the underlying resources (e.g. hardware surfaces and context) themselves, and handing them over to FFmpeg. This incurs a few limitations: this is not scalable to new codecs, i.e. this requires new tokens for each newly supported codec; this incurs extra work in the client application, which tends to be duplicated over several client applications; and this prevents efficient fallback to software decoding mode if the hardware cannot handle a particular codec specification.&lt;br /&gt;
&lt;br /&gt;
The goal of this project is to revamp the FFmpeg Hardware Acceleration API so that hardware resources are allocated and managed in the library, thus requiring the client application to only provide a single hardware context/device handle; provide a way to fallback early to software decoding mode if the underlying hardware won't be able to handle the bitstream; and make it possible to select a hardware accelerator by ID and not polluting the PixelFormats namespace.&lt;br /&gt;
&lt;br /&gt;
'''Expected results:'''&lt;br /&gt;
* FFmpeg core library (libavcodec):&lt;br /&gt;
** Core API extensions and improvements&lt;br /&gt;
*** Add open/close hooks in a way that is backwards compatible with hwaccel v1 enabled applications&lt;br /&gt;
*** Add new tokens describing hardware accelerators&lt;br /&gt;
*** Add new flags exposing HW capabilities like download/upload&lt;br /&gt;
*** Investigate the benefits or impacts to provide a global map/unmap capability to FFmpeg video buffers&lt;br /&gt;
** Port hwaccels to v2 infrastructure&lt;br /&gt;
*** Port VA-API decoders to v2 infrastructure&lt;br /&gt;
*** Validate that VA-API decoders still work with existing applications supporting hwaccel v1&lt;br /&gt;
*** Provide download capability through ''vaGetImage()''&lt;br /&gt;
*** Validate that ffplay can support this feature with minor changes, and definitely no change to the existing SDL renderer&lt;br /&gt;
*** Port VDPAU decoders to hwaccel v2 (optional), and investigate ways to preserve compatibility with older applications&lt;br /&gt;
&lt;br /&gt;
* FFmpeg applications:&lt;br /&gt;
** Integrate hardware acceleration into ffplay&lt;br /&gt;
*** Create a video-output (VO) infrastructure to ffplay&lt;br /&gt;
*** Port the SDL renderer to the new VO infrastructure&lt;br /&gt;
*** Add support for VA-API: VA renderer through ''vaPutSurface()'', add -hwaccel option to select &amp;quot;vaapi&amp;quot; renderer&lt;br /&gt;
*** Add support for VDPAU (optional): VDPAU renderer through ''VdpPresentationQueueDisplay()''&lt;br /&gt;
** Integrate hardware acceleration into ffmpeg&lt;br /&gt;
*** Add support for VA-API: use the VA/DRM API for headless (no-X display) decoding, use libudev to determine the device to use&lt;br /&gt;
&lt;br /&gt;
'''Prerequisites:''' C coding skills, familiarity with git/source code control systems, hardware supporting VA-API.&lt;br /&gt;
&lt;br /&gt;
'''Qualification Task:''' Anything related to the Hardware Acceleration (hwaccel) API, or to its related users. e.g. port VDPAU acceleration to use hwaccel, add JPEG decoding support with VA-API, etc.&lt;br /&gt;
&lt;br /&gt;
'''Mentor:''' [[User:Gwenole_Beauchesne|Gwenole Beauchesne]] (''__gb__'' on IRC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware Accelerated Video Encoding with VA-API ==&lt;br /&gt;
&lt;br /&gt;
'''Description:''' FFmpeg already supports hardware accelerated decoding for multiple codecs but still lacks support for hardware accelerated encoding. The aim of the project is to add support for encoding with VA-API specifically, while keeping a generic enough approach in mind so that other hardware accelerators (TI-DSP, CUDA?) could be supported as well. This means that new ''hwaccel'' hooks are needed and two operational modes are possible: either ''(i)'' driver or hardware pack headers themselves, or ''(ii)'' lattitude is left to perform this task at the FFmpeg library level.&lt;br /&gt;
&lt;br /&gt;
'''Expected results:''' Allow MPEG-2 and H.264 encoding with VA-API, while supporting variable bitrate (VBR) by default, and allowing alternate methods like constant bitrate (CBR) or constant QP (CQP) where appropriate or requested.&lt;br /&gt;
* MPEG-2 encoding:&lt;br /&gt;
** Add basic encoding with I/P frames (handle the ''-g'' option)&lt;br /&gt;
** Add support for B frames (handle the ''-bf'' option)&lt;br /&gt;
** Add support for constant bitrate (CBR, i.e. ''maxrate == bitrate'' and ''bufsize'' set)&lt;br /&gt;
** (Optionally) add support for interlaced contents&lt;br /&gt;
* H.264 encoding:&lt;br /&gt;
** Add basic encoding with I/P frames (handle the ''-g'' option)&lt;br /&gt;
** Add support for B frames (handle the ''-bf'' option)&lt;br /&gt;
** Add support for constant bitrate (CBR, i.e. ''maxrate == bitrate'' and ''bufsize'' set)&lt;br /&gt;
** Add support for constant QP (CQP, i.e. handle the ''-cqp'' option)&lt;br /&gt;
** Add support for more than one reference frame, while providing/using API to query the hardware capabilities&lt;br /&gt;
** Work on HRD conformance. May require to write an independent tool to assess that&lt;br /&gt;
** (Optionally) add configurability of the motion estimatation method to use. Define new types for HW accelerated encoding with at least two levels/hints for the accelerator.&lt;br /&gt;
* FFmpeg applications:&lt;br /&gt;
** Define common hwaccel interface for encoding&lt;br /&gt;
** Add initial support for hardware accelerated encoding to the ''ffmpeg'' application&lt;br /&gt;
&lt;br /&gt;
'''Prerequisites:''' C coding skills, familiarity with git/source code control systems, hardware supporting VA-API for encoding.&lt;br /&gt;
&lt;br /&gt;
'''Qualification Task:''' Anything related to the Hardware Acceleration (hwaccel) API, or to its related users. e.g. port VDPAU acceleration to use hwaccel, add JPEG decoding support with VA-API, etc.&lt;br /&gt;
&lt;br /&gt;
'''Mentor:''' [[User:Gwenole_Beauchesne|Gwenole Beauchesne]] (''__gb__'' on IRC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Unmentored Projects =&lt;br /&gt;
&lt;br /&gt;
This is a list of projects that students are encouraged to consider if a mentored project is unavailable or not within the students skill or interests. The student will have to find a mentor for the project. A student can also [[#Your_Own_Idea|propose their own project]].&lt;br /&gt;
&lt;br /&gt;
== glplay ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;floatleft&amp;quot;&amp;gt;[[Image:Opengl_logo.jpg]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Description:''' The SDL library that is used by FFplay has some deficiencies, adding OpenGL output to FFplay should allow for better performance (and less bugs at least for some hardware / driver combinations). This could be a new application (glplay), but it is probably simpler to extend ffplay to use OpenGL. You can use code from MPlayer's OpenGL vo module which may be relicensed under the LGPL.&lt;br /&gt;
&lt;br /&gt;
'''Mentor:''' TBD Backup: Reimar Döffinger&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== AAC ==&lt;br /&gt;
&lt;br /&gt;
'''Description:''' FFmpeg contains an AAC encoder and decoder, both of them can be improved in various ways. This is enough work for more than one GSoC project, so one part of your submission would be to define on which task exactly you want to work.&lt;br /&gt;
* AAC LD decoder&lt;br /&gt;
* AAC BSAC decoder: This has already been started, but the existing decoder still fails on many samples&lt;br /&gt;
* AAC SSR decoder&lt;br /&gt;
* AAC 960/120 MDCT window&lt;br /&gt;
* AAC multi-channel encoding&lt;br /&gt;
See also the FFmpeg bug tracker for AAC issues, fixing one of them or rebasing the existing incomplete BSAC decoder for current git head fixing one or more existing bugs are possible qualification tasks.&lt;br /&gt;
&lt;br /&gt;
== DTS / DCA ==&lt;br /&gt;
&lt;br /&gt;
'''Description:''' FFmpeg contains a DTS decoder.&lt;br /&gt;
* DTS-HD decoder improvements: A possible qualification task is to implement ticket [https://ffmpeg.org/trac/ffmpeg/ticket/1920 #1920]&lt;br /&gt;
** Add support for X96 extension (96khz)&lt;br /&gt;
** Add support for XLL extension (lossless)&lt;br /&gt;
** Add support for pure DTS-HD streams that do not contain a DTS core&lt;br /&gt;
** Add support for multiple assets&lt;br /&gt;
** Add support for LBR extension&lt;br /&gt;
&lt;br /&gt;
== TrueHD encoder ==&lt;br /&gt;
&lt;br /&gt;
'''Description:''' FFmpeg currently does not support encoding to one of the lossless audio formats used on Bluray discs. This task consists of implementing a TrueHD encoder that allows to losslessly encode audio to play it on hardware devices capable of TrueHD decoding.&lt;br /&gt;
&lt;br /&gt;
== Opus decoder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;[[Image:Opus.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Description:''' Opus decoding is currently supported through the external libopus library&lt;br /&gt;
* Write a native decoder, continue working on the existing unfinished implementation&lt;br /&gt;
A possible qualification task is to port the existing incomplete decoder to current git head and improve it to show that you are capable of working on this task.&lt;br /&gt;
&lt;br /&gt;
== VC-1 interlaced ==&lt;br /&gt;
&lt;br /&gt;
'''Description:''' The FFmpeg VC-1 decoder has improved over the years, but many samples are still not decoded bit-exact and real-world interlaced streams typically show artefacts.&lt;br /&gt;
* Implement missing interlace features&lt;br /&gt;
* Make more reference samples bit-exact&lt;br /&gt;
As a qualification task, you should try to find a bug in the current decoder implementation and fix it.&lt;br /&gt;
&lt;br /&gt;
== JPEG 2000 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;floatleft&amp;quot;&amp;gt;[[Image:Jpeg2000.jpg]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Description:''' FFmpeg contains an experimental native JPEG 2000 encoder and decoder. Both are missing many features, see also the FFmpeg bug tracker for some unsupported samples.&lt;br /&gt;
Work on an issue (for example from the bug tracker) as a qualification task to show that you are capable of improving the codec implementation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VP7 ==&lt;br /&gt;
&lt;br /&gt;
'''Description:''' Not many [http://samples.mplayerhq.hu/V-codecs/VP7/ VP7 samples] are in the wild, but no open-source decoder exists although a [http://multimedia.cx/mirror/VP7_Data_Format_and_Decoder_Overview.pdf specification] exists. Write a decoder that reuses as much as possible of existing FFmpeg code: it is likely that functions of the existing decoders for On2-based formats will be useful.&lt;br /&gt;
&lt;br /&gt;
== VP8L ==&lt;br /&gt;
&lt;br /&gt;
'''Description:''' [[VP8L]] is a lossless format used in WebP. There is no support for this in FFmpeg.&lt;br /&gt;
&lt;br /&gt;
== Your own idea ==&lt;br /&gt;
&lt;br /&gt;
A student can propose a project. Ideas can also be found by browsing bugs and feature requests on our [https://ffmpeg.org/trac/ffmpeg/ bug tracker]. The work should last the majority of the GSoC duration, the task must be approved by the developers, and a mentor must be assigned.&lt;br /&gt;
&lt;br /&gt;
Students can discuss an idea in the [http://ffmpeg.org/mailman/listinfo/ffmpeg-devel ffmpeg-devel mailing-list], the #ffmpeg-devel IRC channel, or contact the FFmpeg GSoC admins [[User:Stefanosa|Stefano Sabatini]] or [[User:Llogan|Lou Logan]] for more information.&lt;br /&gt;
&lt;br /&gt;
[[Category:FFmpeg]]&lt;/div&gt;</summary>
		<author><name>Rogerdpack</name></author>
	</entry>
	<entry>
		<id>https://wiki.multimedia.cx/index.php?title=Libavfilter&amp;diff=14122</id>
		<title>Libavfilter</title>
		<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php?title=Libavfilter&amp;diff=14122"/>
		<updated>2012-07-16T00:13:14Z</updated>

		<summary type="html">&lt;p&gt;Rogerdpack: /* See also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Reasons why a filter API is needed in FFmpeg==&lt;br /&gt;
FFmpeg's already well-known [[libavcodec]] module has become the de facto standard library for video decoding and encoding in free software projects. Unfortunately, no similar standard library has surfaced for audio/video filtering and otherwise working with audio/video stream once it has been decoded. Various multimedia projects (such as MPlayer, Xine, GStreamer, VirtualDub, etc.) have implemented their own filter systems to various degrees of success. What is needed is a high quality audio and video filter API - efficient, flexible enough to meet all the requirements which have led various projects to invent their own filter system, and yet easy to use or develop new filters with. This proposal is to implement a high quality video API and filter library for FFmpeg, where it can be easily used by other multimedia-related software projects.&lt;br /&gt;
&lt;br /&gt;
== Possible known issues ==&lt;br /&gt;
* no frame rate estimation is supported (see post in -soc [http://lists.mplayerhq.hu/pipermail/ffmpeg-soc/2007-December/002283.html])&lt;br /&gt;
* make ffmpeg.c honor the aspect ratio outputted by the filter chain (thanks vdmsss for the bug report) -- '''Updated:''' probably fixed, but maybe not printing the right PAR in the terminal&lt;br /&gt;
&lt;br /&gt;
== Feature wish list ==&lt;br /&gt;
'''Warning:''' This is not an official wish list. Before implementing any one of these items, ask first in the ffmpeg-devel mailing-list.&lt;br /&gt;
&lt;br /&gt;
* See the [http://svn.mplayerhq.hu/soc/libavfilter/TODO?view=co TODO file] in SoC SVN tree&lt;br /&gt;
*Create a SDK (Software Development Kit) with templates for the A/V filter APIs&lt;br /&gt;
*Add support for audio filters&lt;br /&gt;
** See [[FFmpeg audio API]]&lt;br /&gt;
*Add support for subtitle filters&lt;br /&gt;
** Add a subtitle drawing support to simplify ffplay.c&lt;br /&gt;
* Create (or port) additional pre-process and post-process video filters to FFmpeg:&lt;br /&gt;
** General post-proc sources are [http://svn.mplayerhq.hu/mplayer/trunk/DOCS/tech/libmpcodecs.txt?revision=15625&amp;amp;view=markup MPlayer (libmpcodecs vf_*.c filters)], [http://xinehq.de/index.php/hackersguide#AEN864 Xine], [[ffdshow|FFdshow]], [[VLC media player|VLC]], [http://www.virtualdub.org/filtersdk VirtualDub], [http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/index.html GStreamer], [http://www.foobar2000.org foobar], and [http://www.xmms.org/ XMMS], vhook&lt;br /&gt;
**More [http://en.wikipedia.org/wiki/Image_scaling image scaling] methods:&lt;br /&gt;
***[http://en.wikipedia.org/wiki/Linear_interpolation linear interpolation]&lt;br /&gt;
***[http://en.wikipedia.org/wiki/Bilinear_interpolation bilinear interpolation]&lt;br /&gt;
***[http://en.wikipedia.org/wiki/Cubic_interpolation cubic interpolation]&lt;br /&gt;
***[http://en.wikipedia.org/wiki/Bicubic_interpolation bicubic interpolation]&lt;br /&gt;
***[http://en.wikipedia.org/wiki/Trilinear_interpolation trilinear interpolation]&lt;br /&gt;
** SSP (Statistical Post-Processing)&lt;br /&gt;
** DeBlocking&lt;br /&gt;
** DeRinging&lt;br /&gt;
** IVTC&lt;br /&gt;
** Sharpen / UnSharpen (Soften)&lt;br /&gt;
** ReQuantization&lt;br /&gt;
** Auto-Luminance&lt;br /&gt;
** Blurring / DeNoising / Spatial Blur / Temporal Blur&lt;br /&gt;
**  Deinterlace (weave AND bob) filters&lt;br /&gt;
*** Possible sources: [http://sourceforge.net/projects/deinterlace DScaler] or [http://www.mir.com/DMG/Software/y4mscaler.html y4mscale]?&lt;br /&gt;
** 2:3 pull-down / ivtc (inverse telecine) for 24 progressive-frames on 30 FPS TV's&lt;br /&gt;
*** Possible sources: [http://sourceforge.net/projects/deinterlace DScaler] or [http://www.mir.com/DMG/Software/y4mscaler.html y4mscale]?&lt;br /&gt;
** NTSC =&amp;gt; PAL, and PAL =&amp;gt; NTSC frame-rate (FPS) adjust and reclock filter for NTSC &amp;lt;=&amp;gt; PAL conversion&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[FFmpeg filter howto]]&lt;br /&gt;
* [[FFmpeg audio API]]&lt;br /&gt;
* [http://ffmpeg.org/trac/ffmpeg/wiki/FilteringGuide FFmpeg filtering Guide]&lt;br /&gt;
&lt;br /&gt;
[[Category:FFmpeg]]&lt;/div&gt;</summary>
		<author><name>Rogerdpack</name></author>
	</entry>
	<entry>
		<id>https://wiki.multimedia.cx/index.php?title=Small_FFmpeg_Tasks&amp;diff=13664</id>
		<title>Small FFmpeg Tasks</title>
		<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php?title=Small_FFmpeg_Tasks&amp;diff=13664"/>
		<updated>2011-10-28T19:29:10Z</updated>

		<summary type="html">&lt;p&gt;Rogerdpack: /* port Ut Video decoder/encoder */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains ideas for small, relatively simple tasks for the [[FFmpeg]] project. People who might be interested in trying one of these tasks:&lt;br /&gt;
* Someone who wants to contribute to FFmpeg and needs to find a well-defined task to start with&lt;br /&gt;
* Someone who wishes to qualify for one of FFmpeg's coveted [[FFmpeg Summer Of Code|Summer of Code]] project slots&lt;br /&gt;
* An existing FFmpeg developer who has been away from the project for a while and needs a smaller task as motivation for re-learning the codebase&lt;br /&gt;
&lt;br /&gt;
For other tasks of varying difficulty, see the [[Interesting Patches]] page.&lt;br /&gt;
&lt;br /&gt;
'''If you would like to work on one of these tasks''', please take these steps:&lt;br /&gt;
* Subscribe to the [https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel FFmpeg development mailing list] and indicate your interest&lt;br /&gt;
* Ask [[User:Multimedia Mike|Multimedia Mike]] for a Wiki account so you can claim your task on this Wiki&lt;br /&gt;
&lt;br /&gt;
'''If you would like to add to this list''', please be prepared to explain some useful details about the task. Excessively vague tasks with no supporting details will be ruthlessly deleted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Finish up a previous incomplete SoC project ===&lt;br /&gt;
&lt;br /&gt;
Several SoC projects from previous years have not yet made it into FFmpeg. Taking any of them and finishing them up to the point that they can be included should make for a good qualification task. Check out the [[FFmpeg Summer Of Code]] overview page and look for the unfinished projects, like the TS muxer.&lt;br /&gt;
&lt;br /&gt;
=== Generic Colorspace system ===&lt;br /&gt;
This task involves adding support more than 8 bits per component (Y on 10 bits, U on 10 bits, V on 10 bits for example)&lt;br /&gt;
and generic simple conversion to other colorspaces.&lt;br /&gt;
&lt;br /&gt;
''Does this have to do with revising FFmpeg's infrastructure? If so, then it doesn't feel like a qualification task. If it's something simpler, then the vague description does not convey that simplicity. Please expound.'' --[[User:Multimedia Mike|Multimedia Mike]] 12:56, 25 February 2008 (EST)&lt;br /&gt;
&lt;br /&gt;
''I don't think so, extending PixFmt to extended structure with finegrained description like depth, range values, colorspace, sample period, and write generic simple conversion from all formats to all others, like suggested by Michael on the mailing list. Conversion routine can be a good qualification task for video encoders/decoders. What do you think ?&lt;br /&gt;
--[[User:Bcoudurier|Baptiste Coudurier]] 00:30, 29 February 2008 (EST)&lt;br /&gt;
&lt;br /&gt;
''* Adding the [[YCoCg]] colorspace (with different sized planes) for RGB sourced pictures would be nice too. [[User:Elte|Elte]] 07:15, 16 March 2009 (EDT)&lt;br /&gt;
&lt;br /&gt;
=== Extend GIF Encoder and Decoder to support Animated GIFs ===&lt;br /&gt;
&lt;br /&gt;
=== reverse engineer realplayer's ivr format and create a demuxer for it ===&lt;br /&gt;
samples on [[IVR]] page.&lt;br /&gt;
&lt;br /&gt;
=== Implement a Vivo demuxer ===&lt;br /&gt;
Implement a demuxer for the [[Vivo]] file format. The best reference for understanding the format would be MPlayer's [http://svn.mplayerhq.hu/mplayer/trunk/libmpdemux/demux_viv.c?view=markup existing .viv demuxer].&lt;br /&gt;
&lt;br /&gt;
This task corresponds to ticket 132: https://avcodec.org/trac/ffmpeg/ticket/132&lt;br /&gt;
&lt;br /&gt;
''I am ready to help out with understanding MPlayer's demuxer, esp. MPlayer API stuff if necessary.&lt;br /&gt;
--[[User:Reimar|Reimar]] 15:46, 1 March 2008 (EST)&lt;br /&gt;
&lt;br /&gt;
=== Port missing demuxers from MPlayer ===&lt;br /&gt;
MPlayer supports a few container formats in libmpdemux that are not yet present in libavformat. Porting them over and gettting them relicensed as LGPL or reimplementing them from scratch should make reasonable small tasks.&lt;br /&gt;
&lt;br /&gt;
# TiVo --&lt;br /&gt;
# VIVO -- ''Daniel Verkamp has a patch for this''&lt;br /&gt;
# SL support for MPEG-TS (anyone got samples?)&lt;br /&gt;
# MNG&lt;br /&gt;
&lt;br /&gt;
=== Optimal Huffman tables for (M)JPEG ===&lt;br /&gt;
This task is outlined at http://guru.multimedia.cx/small-tasks-for-ffmpeg/ and is tracked in the issue tracker: http://roundup.libav.org/issue267&lt;br /&gt;
&lt;br /&gt;
=== M95 Playback System ===&lt;br /&gt;
This task is to implement a playback subsystem for [[M95]] files. This will entail writing a new file demuxer and video decoder (the audio is already uncompressed), both of which should be fairly easy by FFmpeg standards. [[M95|The M95 page]] contains the specs necessary to complete this task and points to downloadable samples.&lt;br /&gt;
&lt;br /&gt;
=== BRP Playback System ===&lt;br /&gt;
This task is to implement a playback subsystem for [[BRP]] files. This will entail writing a new file demuxer as well as a video decoder that can handle at least 2 variations of format data. Further, write an audio decoder for the custom DPCM format in the file. All of these tasks are considered fairly easy by FFmpeg standards. [[BRP|The BRP page]] contains the specs necessary to complete this task and points to downloadable samples for both known variations.&lt;br /&gt;
&lt;br /&gt;
=== 16-bit VQA Video Decoder ===&lt;br /&gt;
Westwood [[VQA]] files are already supported. However, there are three variations of its custom video codec, only the first two of which are supported. This task involves implementing support for the third variation. Visit the VQA samples repository: http://samples.multimedia.cx/game-formats/vqa/ -- The files in the directories Tiberian Sun VQAs/, bladerunner/, and dune2000/ use the 3rd variation of this codec. The [[VQA|VQA page]] should link to all the details you need to support this format.&lt;br /&gt;
&lt;br /&gt;
Discussion/patch:&lt;br /&gt;
http://thread.gmane.org/gmane.comp.video.ffmpeg.devel/89902/focus=90433&lt;br /&gt;
&lt;br /&gt;
=== HNM4 Playback System ===&lt;br /&gt;
This task is to implement a playback subsystem for [[HNM4]] variant of the [[HNM]] format. This will entail writing a new file demuxer and video decoder, both of which are considered fairly easy by FFmpeg standards. [[HNM4|The HNM4 page]] contains the specs necessary to complete this task and links to downloadable samples.&lt;br /&gt;
&lt;br /&gt;
=== Apple RPZA encoder ===&lt;br /&gt;
A patch was once sent to the ffmpeg-devel mailing list to include an encoder for the [[Apple RPZA]] video codec. That code can be found on the &amp;quot;[[Interesting Patches]]&amp;quot; page. This qualification task involves applying that patch so that it can compile with current HEAD and then cleaning it up per the standards of the project. Engage the mailing list to learn more about what to do.&lt;br /&gt;
&lt;br /&gt;
=== QuickTime Edit List Support ===&lt;br /&gt;
Implement edit list support in the QuickTime demuxer (libavformat/mov.c). This involves parsing the 'elst' atom in a QuickTime file. For a demonstration of how this is a problem, download the file menace00.mov from http://samples.mplayerhq.hu/mov/editlist/ and play it with ffplay or transcode it with ffmpeg. Notice that the audio and video are ever so slightly out of sync. Proper edit list support will solve that. Other samples in that directory also presumably exhibit edit list-related bugs. The [http://xine.cvs.sourceforge.net/xine/xine-lib/src/demuxers/demux_qt.c?view=markup Xine demuxer] has support for this, it might be useful for hints.&lt;br /&gt;
&lt;br /&gt;
(patch was submitted to ffmpeg-devel , around 14 March 2009) &lt;br /&gt;
&lt;br /&gt;
=== Add wma fixed point decoder back into libavcodec ===&lt;br /&gt;
http://svn.rockbox.org/viewvc.cgi/trunk/apps/codecs/libwma/&lt;br /&gt;
Rockbox's fixed-point WMA decoder was adapted from the decoder in libavcodec.&lt;br /&gt;
&lt;br /&gt;
=== VC1 timestamps in m2ts ===&lt;br /&gt;
&lt;br /&gt;
Codec copy of VC1 from m2ts currently doesn't work. Either extend the VC1 parser to output/fix timestamps, or fix the timestamps from m2ts demuxing.&lt;br /&gt;
&lt;br /&gt;
=== FLIC work ===&lt;br /&gt;
&lt;br /&gt;
Revise the [[Flic Video]] decoder at libavcodec/flicvideo.c to support video transported in AVI or MOV files while making sure that data coming from the usual FLI files still works. 'AFLC' and 'flic' FourCC samples are linked from the [[Flic Video]] page.&lt;br /&gt;
&lt;br /&gt;
=== flip flag for upside-down codecs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;about the flip, a patch that decodes images fliped when&lt;br /&gt;
codec_tag == ff_get_fourcc(&amp;quot;GEOX&amp;quot;) is welcome.&lt;br /&gt;
its a metter of 2lines manipulating data/linesize of imgages after&lt;br /&gt;
get_buffer() or something similar&lt;br /&gt;
[...]&lt;br /&gt;
-- &lt;br /&gt;
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
more info:&lt;br /&gt;
http://roundup.ffmpeg.org/roundup/ffmpeg/issue741&lt;br /&gt;
&lt;br /&gt;
=== lavf-based concatenation tool ===&lt;br /&gt;
&lt;br /&gt;
It would be nice to have some libavformat-based tool that would extract frames from multiple files (possible different containers as well) and put them into single one.&lt;br /&gt;
&lt;br /&gt;
=== cljr and vcr1 encoders ===&lt;br /&gt;
According to this: http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/2009-February/063555.html both of the encoders are disabled, and won't compile if enabled.  Michael would prefer to keep them around, and have someone grow them into full encoders.&lt;br /&gt;
&lt;br /&gt;
=== implement some colorspace fourcc/codecs ===&lt;br /&gt;
some colorspace formats were uploaded to http://samples.mplayerhq.hu/V-codecs/&lt;br /&gt;
including:&lt;br /&gt;
 CYUV.AVI is 8 Bit Interleaved 4:2:2&lt;br /&gt;
 a12v.avi is 4:2:2:4 10 Bit Interleaved&lt;br /&gt;
 auv2.avi is 4:2:2:4 8 Bit Interleaved&lt;br /&gt;
 and V-codecs/yuv8/MAILTEST.AVI .&lt;br /&gt;
&lt;br /&gt;
it might decode with current pixfmts, a sample commit is 9853bbb21a19d540850de60d3e9cf7c6ef9da7dc&lt;br /&gt;
&lt;br /&gt;
a sample commit for adding new input formats to swscale is 4884b9e50d416f84e64bfaf546a03e490cb83a2f&lt;br /&gt;
 the hunks 3 and 5 you do not need, they are optional special converters&lt;br /&gt;
 also the change to isSupportedOut() you do not need&lt;br /&gt;
 above will add a new input format&lt;br /&gt;
&lt;br /&gt;
another example for adding an input format is a43fb6b37efa5b01f2c9bdc414570691229bcfab&lt;br /&gt;
&lt;br /&gt;
=== port libquicktime de/encoders ===&lt;br /&gt;
&lt;br /&gt;
http://libquicktime.sourceforge.net/&lt;br /&gt;
some of these may be copies of already implemented codecs:&lt;br /&gt;
 8 bit planar YUV 4:4:4 (v308)&lt;br /&gt;
 8 bit Planar YUVA 4:4:4:4 (v408)&lt;br /&gt;
 10 bit Packed YUV 4:4:4 (v410)&lt;br /&gt;
 YUV 4:2:0 (yuv4)&lt;br /&gt;
&lt;br /&gt;
See [http://ffmpeg.org/trac/ffmpeg/ticket/470 Ticket 470]&lt;br /&gt;
&lt;br /&gt;
=== Implement Phantom Cine demuxer and Bayer format support for swscale ===&lt;br /&gt;
The format is described here:&lt;br /&gt;
http://wiki.multimedia.cx/index.php?title=Phantom_Cine&lt;br /&gt;
It will need support for Bayer -&amp;gt; RGB conversion in swscale to make the demuxer useful though.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== support for [[YCoCg]]/RGB colorspace in FFV1 ===&lt;br /&gt;
Add support for [[YCoCg]] and [[RGB]] encoded sources for the [[FFV1]] codec&lt;br /&gt;
&lt;br /&gt;
This would add a free lossless intra-frame RGB codec for all supported platforms (most important OS X + Windows) which is often asked for video editing in video forums (e.g. slashcam.de)&lt;br /&gt;
&lt;br /&gt;
=== Metal Gear Solid Video format demuxer ===&lt;br /&gt;
Write a demuxer to play video files harvested from the game Metal Gear Solid: The Twin Snakes. The format is described on the wiki page [[Metal Gear Solid VP3]] (which also contains links to samples). This page is based on observations and conjecture, so remember to engage the mailing list or IRC with questions.&lt;br /&gt;
&lt;br /&gt;
=== [[IFF#ANIM|IFF ANIM]] decoder ===&lt;br /&gt;
Modify libavformat/iff.c to handle this chunk and write a decoder for the format. The wiki page at [[IFF#ANIM|IFF ANIM]] has links to more information and source code. Samples can be found at http://www-user.tu-chemnitz.de/~womar/projects/iffanim/iffanim_samplepack.zip .&lt;br /&gt;
&lt;br /&gt;
=== [[CDXL]] decoder ===&lt;br /&gt;
http://roundup.libav.org/issue1012&lt;br /&gt;
&lt;br /&gt;
Write a decoder for this format using the information in the [[CDXL]] wiki page&lt;br /&gt;
Discussed for the 2009 SoC &lt;br /&gt;
&lt;br /&gt;
=== port missing decoders/demuxers from other open source projects. ===&lt;br /&gt;
&lt;br /&gt;
http://www.mega-nerd.com/libsndfile/#Features&lt;br /&gt;
 Paris Audio File PAF&lt;br /&gt;
 IRCAM SF&lt;br /&gt;
 GNU Octave 2.0 MAT4&lt;br /&gt;
 GNU Octave 2.1 MAT5&lt;br /&gt;
 Portable Voice Format PVFSound&lt;br /&gt;
 Designer II SD2&lt;br /&gt;
samples are here: http://www.mega-nerd.com/tmp/SoundFileCollection-20050711-0902.tgz&lt;br /&gt;
&lt;br /&gt;
http://www.hawksoft.com/hawkvoice/&lt;br /&gt;
 HVDI_VOICE_DATA- packet&lt;br /&gt;
 [[GSM]]&lt;br /&gt;
 LPC&lt;br /&gt;
 CELP&lt;br /&gt;
 LPC10&lt;br /&gt;
&lt;br /&gt;
http://sourceforge.net/projects/vgmstream&lt;br /&gt;
 150+ formats: http://vgmstream.svn.sourceforge.net/viewvc/vgmstream/readme.txt&lt;br /&gt;
&lt;br /&gt;
http://www.imagemagick.org&lt;br /&gt;
http://www.graphicsmagick.org/formats.html&lt;br /&gt;
 many image formats not supported yet.&lt;br /&gt;
&lt;br /&gt;
http://gpac.sourceforge.net/&lt;br /&gt;
 [[MPEG-4 BIFS]]&lt;br /&gt;
 3GPP DIMS&lt;br /&gt;
 [[LASeR]]&lt;br /&gt;
 SAF&lt;br /&gt;
 SVG&lt;br /&gt;
 [[Synchronized Multimedia Integration Language|SMIL]]&lt;br /&gt;
 VRML&lt;br /&gt;
 X3D&lt;br /&gt;
 XMT&lt;br /&gt;
&lt;br /&gt;
http://adplug.sourceforge.net/&lt;br /&gt;
http://adplug.sourceforge.net/library/&lt;br /&gt;
 many OPL2/OPL3 audio formats not supported yet.&lt;br /&gt;
&lt;br /&gt;
http://mikmod.raphnet.net/&lt;br /&gt;
http://mikmod.raphnet.net/#features&lt;br /&gt;
 many music pattern formats not supported yet.&lt;br /&gt;
&lt;br /&gt;
http://www.fly.net/~ant/libs/audio.html#Game_Music_Emu&lt;br /&gt;
 AY&lt;br /&gt;
 GBS&lt;br /&gt;
 GYM&lt;br /&gt;
 HES&lt;br /&gt;
 KSS&lt;br /&gt;
 NSF, NSFE&lt;br /&gt;
 SAP&lt;br /&gt;
 [[SNES-SPC700 Sound Format]]&lt;br /&gt;
 VGM, VGZ&lt;br /&gt;
&lt;br /&gt;
=== port [[Ut Video]] decoder/encoder ===&lt;br /&gt;
gpl v2 decoder/encoder at wiki page some work has started http://www.ffmpeg.org/trac/ffmpeg/ticket/534&lt;br /&gt;
&lt;br /&gt;
=== libswscale PAL8 output ===&lt;br /&gt;
&lt;br /&gt;
See the thread: &amp;quot;[RFC] libswscale palette output implementation&amp;quot;:&lt;br /&gt;
http://thread.gmane.org/gmane.comp.video.ffmpeg.devel/101397&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== vloopback output support ===&lt;br /&gt;
&lt;br /&gt;
vloopback is a linux kernel device which allows to create a virtual video device where&lt;br /&gt;
programs can write, and can be accessed as a normal video device:&lt;br /&gt;
http://www.lavrsen.dk/twiki/bin/view/Motion/VideoFourLinuxLoopbackDevice&lt;br /&gt;
&lt;br /&gt;
This would allow to write the ffmpeg output to a vloopdevice and be displayed by some a&lt;br /&gt;
program reading from such device (e.g. skype, a voip client etc.).&lt;br /&gt;
&lt;br /&gt;
An example of a program which uses vloopback:&lt;br /&gt;
http://www.ws4gl.org/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Port video filters from MPlayer/VLC/Mjpegtools/Effectv/etc etc to libavfilter ===&lt;br /&gt;
&lt;br /&gt;
There are plenty programs providing their own filters, many of them may be easily ported to the &lt;br /&gt;
superior ;-) framework of libavfilter. Also may be possible to create wrappers around other libraries&lt;br /&gt;
(e.g. opencv, libgimp, libshowphoto, libaa).&lt;br /&gt;
&lt;br /&gt;
=== rar/zip/gz/bz2 etc demuxer ===&lt;br /&gt;
there are still compressed files out there (zipped raw wav, multi-rar'ed videos etc). create a decompression demuxer for them.&lt;br /&gt;
&lt;br /&gt;
=== Less common AAC decoder features ===&lt;br /&gt;
&lt;br /&gt;
Add support to the AAC decoder for object type ER AAC LC or AAC LC 960.&lt;br /&gt;
&lt;br /&gt;
=== emblaze demuxer/decoder from java code ===&lt;br /&gt;
samples and java decoder: http://samples.mplayerhq.hu/internets/emblaze/&lt;br /&gt;
&lt;br /&gt;
[[Category:FFmpeg]]&lt;br /&gt;
[[Category:Libav]]&lt;/div&gt;</summary>
		<author><name>Rogerdpack</name></author>
	</entry>
	<entry>
		<id>https://wiki.multimedia.cx/index.php?title=FFmpeg_Wishlist&amp;diff=13634</id>
		<title>FFmpeg Wishlist</title>
		<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php?title=FFmpeg_Wishlist&amp;diff=13634"/>
		<updated>2011-09-20T16:59:09Z</updated>

		<summary type="html">&lt;p&gt;Rogerdpack: done, I think&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The various desired features for FFmpeg can be found in the following pages:&lt;br /&gt;
* [https://roundup.mplayerhq.hu/roundup/ffmpeg/issue?%40&amp;amp;%40columns=title&amp;amp;%40columns=topic&amp;amp;id=&amp;amp;%40columns=id&amp;amp;%40columns=activity&amp;amp;%40sort=activity&amp;amp;%40columns=priority&amp;amp;%40group=priority&amp;amp;type=2&amp;amp;status=2&amp;amp;%40columns=substatus&amp;amp;%40pagesize=50&amp;amp;%40startwith=0&amp;amp;%40action=search Open feature requests in the issue tracker]&lt;br /&gt;
* [http://svn.mplayerhq.hu/ffmpeg/trunk/doc/TODO?view=co TODO file in the SVN tree]&lt;br /&gt;
* [[FFmpeg Summer Of Code]] pages&lt;br /&gt;
* Finish and commit any code not yet commited at the [http://svn.mplayerhq.hu/soc/ SoC FFmpeg tree]&lt;br /&gt;
&lt;br /&gt;
Also, other features requests can be found in:&lt;br /&gt;
* [https://roundup.mplayerhq.hu/roundup/ffmpeg/issue?%40&amp;amp;%40columns=title&amp;amp;%40columns=topic&amp;amp;id=&amp;amp;%40columns=id&amp;amp;%40columns=activity&amp;amp;%40sort=activity&amp;amp;%40columns=priority&amp;amp;%40group=priority&amp;amp;type=2&amp;amp;status=1&amp;amp;%40columns=substatus&amp;amp;%40pagesize=50&amp;amp;%40startwith=0&amp;amp;%40action=search Feature requests marked as &amp;quot;new&amp;quot;]&lt;br /&gt;
* Below in this page (mostly deprecated items)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See also the discussion about [[Ffmpeg audio api|Audio API]] TODOs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Old list =&lt;br /&gt;
&lt;br /&gt;
The following is deprecated, please '''do not''' add new items to this list, use instead the issue tracker. Also, send a message to the mailing list before implementing one of those items. They could be work-in-progress or not wanted anymore.&lt;br /&gt;
&lt;br /&gt;
Moving any of these items to a '''proper''' feature request in the issue tracker is welcome.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Decoders ==&lt;br /&gt;
* integrate [[Speex]] (glue code or native) &lt;br /&gt;
* Fix &amp;quot;[rv20 @ 009C8BF0]unknown bit3 set&amp;quot; in [[RV20]] decoder&lt;br /&gt;
* [[xeb|XEB]] - the [[RatDVD]] video codec (stored in [[xvo|XVO]] container format)&lt;br /&gt;
* VNC decoder, files created by vncrec. Re-use code from [[VMware Video]] decoder http://www.sodan.org/~penny/vncrec/&lt;br /&gt;
* Additional game formats support:&lt;br /&gt;
** [[VQA]] v3 support, see http://www.gamers.org/pub/idgames2/planetquake/planetcnc/cncdz/&lt;br /&gt;
** [[Gremlin Digital Video]]&lt;br /&gt;
** [[M95]]&lt;br /&gt;
&lt;br /&gt;
== Demuxers ==&lt;br /&gt;
* [[FluxDVD]] / [[RatDVD]] demuxer for [[xvo|XVO]] files (Note! [[RatDVD]] is the predecesor of [[FluxDVD]])&lt;br /&gt;
&lt;br /&gt;
== Muxers ==&lt;br /&gt;
* DVB (MPEG-TS) muxer inside DVB containers&lt;br /&gt;
** MPEG-1/2 video-streams inside DVB containers&lt;br /&gt;
** MPEG-4 ASP video-streams inside DVB containers&lt;br /&gt;
** MPEG-4 AVC (H.264) video-streams inside DVB containers&lt;br /&gt;
** AC3 audio-streams inside DVB containers&lt;br /&gt;
*** Mutiple AC3 audio-streams inside DVB containers&lt;br /&gt;
** MP3 audio-streams inside DVB containers&lt;br /&gt;
*** Mutiple MP3 audio-streams inside DVB containers&lt;br /&gt;
* NSV muxer&lt;br /&gt;
* NSA muxer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* Improved existing documentation and add additional means to document&lt;br /&gt;
**Web&lt;br /&gt;
**WIKI&lt;br /&gt;
**manpage&lt;br /&gt;
&lt;br /&gt;
== Misc ==&lt;br /&gt;
* Clean up the h263 rtp [[Interesting Patches#H.263 rtp patch|patch]].&lt;br /&gt;
&lt;br /&gt;
== Streaming Media Network Protocols ==&lt;br /&gt;
Streaming Media Network Protocols (client and server-side) improvements/enhancements and related ideas for new features/functions.&lt;br /&gt;
*  Create a common 'stream demuxer/parser library' for the client-side to receive input streams (and/or API for adding support for additional streaming formats?) - a LGPL'ed sub-library in FFmpeg with all stream demuxers/parsers gathered (similar to the libpostproc and libavutil). Call it &amp;quot;libstream&amp;quot; (or &amp;quot;stream&amp;quot; or whatever). Move FFmpeg's existing stream code there like HTTP and RTSP/RTP. This will help reduce future code replication by sharing common code, thus making it easier to add support for additional streaming formats. All togther making it super easy for audio/video players using FFmpeg to add all-in-one streaming support to their player.&lt;br /&gt;
**Maybe use either [http://www.mplayerhq.hu MPlayer]'s &amp;quot;''stream''&amp;quot; library structure, [http://www.live555.com LIVE555], [http://curl.haxx.se cURL], or probebly the better [http://streaming.polito.it/client/library libnms] (from [http://streaming.polito.it/client NeMeSi]) as a base for such a common library?&lt;br /&gt;
*Add support for additional streaming protocols (on the client side) and improve/enhance support for existing protocols:&lt;br /&gt;
** HTTP (Hypertext Transfer Protocol) client&lt;br /&gt;
*** plus a SSL (Secure Sockets Layer) client support for HTTPS&lt;br /&gt;
** UDP (User Datagram Protocol) client&lt;br /&gt;
** RTSP - Real-Time Streaming Protocol (RFC2326) client&lt;br /&gt;
** RTP/RTCP - Real-Time Transport Protocol/RTP Control Protocol (RFC3550) client&lt;br /&gt;
** RTP Profile for Audio and Video Conferences with Minimal Control (RFC3551) client&lt;br /&gt;
** RealMedia RTSP/RDT (Real Time Streaming Protocol /  Real Data Transport)  client&lt;br /&gt;
** SDP (Service Discovery Protocol) / SSDP (Simple Service Discovery Protocol)  client&lt;br /&gt;
** MMS (Microsoft Media Services) client&lt;br /&gt;
*** including the subprotocol mmsh (MMS over HTTP) and mmst (MMS over TCP)&lt;br /&gt;
*FFServer (streaming server) updating and improving:&lt;br /&gt;
**FFServer code hasn't been update for quite a while&lt;br /&gt;
**Support for RTSP interleaved RTP media &lt;br /&gt;
**RTSP over HTTP tunneling&lt;br /&gt;
**SLL (Secure Sockets Layer) support&lt;br /&gt;
**TLS (Transport Layer Security) support&lt;br /&gt;
**SCTP (Stream Control Transmission Protocol) support&lt;br /&gt;
***including tunnel SCTP over UDP&lt;br /&gt;
**Per-asset accounting options &lt;br /&gt;
**Profiling and performance improvements of the RTSP, HTTP and RTP server code &lt;br /&gt;
**Streaming to clients like WMP 9, 10 and 11 is broken&lt;br /&gt;
**MMS server streaming support in FFServer, (especially for Linux).&lt;br /&gt;
*** including the subprotocol mmsh (MMS over HTTP) and mmst (MMS over TCP)&lt;br /&gt;
*** Note that al3x has gotten something working with ffserver, you might want to ask him what needs to be done as well :) --[[User:Compn|Compn]] 14:22, 19 March 2007 (EDT)&lt;br /&gt;
***You should also take a look at the [http://streaming.polito.it/server FENG (RTSP Streaming Server)] code, [http://streaming.polito.it/embedded NetEmbryo (Embedded Open Media Streaming Library)], and also [http://curl.haxx.se cURL]  --[[User:Gamester17|Gamester17]] 11:20, 29 March 2007 (GMT+1)&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
*[[FFmpeg Summer Of Code]] for more suggestions/requests (ideas for developers).&lt;br /&gt;
*[http://bugzilla.mplayerhq.hu/buglist.cgi?query_format=specific&amp;amp;order=relevance+desc&amp;amp;bug_status=__open__&amp;amp;product=FFmpeg&amp;amp;content= FFmpeg bugs] for bugs in FFmpegs (codecs) that you can help fix or add addition information/samples to.&lt;br /&gt;
*[[:Category:Formats missing in FFmpeg]] for formats not implemented in ffmpeg yet&lt;br /&gt;
&lt;br /&gt;
[[Category:FFmpeg]]&lt;/div&gt;</summary>
		<author><name>Rogerdpack</name></author>
	</entry>
	<entry>
		<id>https://wiki.multimedia.cx/index.php?title=Talk:FFmpeg_audio_API&amp;diff=13600</id>
		<title>Talk:FFmpeg audio API</title>
		<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php?title=Talk:FFmpeg_audio_API&amp;diff=13600"/>
		<updated>2011-09-08T17:36:55Z</updated>

		<summary type="html">&lt;p&gt;Rogerdpack: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;why does it need to be SIMD optimized? It might be that audio processing only accounts for a small amount of cpu used so won't be all too helpful...&lt;/div&gt;</summary>
		<author><name>Rogerdpack</name></author>
	</entry>
</feed>