comparison DOCS/tech/codec-devel.txt @ 3862:74622f23bce5

initial commit of "Guide To Codec Hacking"
author melanson
date Fri, 28 Dec 2001 22:48:25 +0000
parents
children 02b275e198c3
comparison
equal deleted inserted replaced
3861:f832811cf89a 3862:74622f23bce5
1 A Guide To Developing MPlayer Codecs
2 by Mike Melanson (melanson at pcisys dot net)
3
4 Introduction
5 ------------
6 I've developed a number of open source decoders for the MPlayer project,
7 for both audio and video data. As such, I feel I'm qualified to document a
8 few notes about developing new codecs for the codebase.
9
10 As always, the best way to learn how to incorporate a new codec is to
11 study a bunch of existing code. This document is supplementary material to
12 the code, meant to give some tips, pointers, and a general roadmap.
13
14 A note about terminology: "Codec" stands for coder/decoder (or
15 compressor/decompressor, if you prefer). The term refers to a module that
16 can both encode and decode data. However, this document focuses primarily
17 on incorporating decoders. Still, the terms "decoder" and "codec" are
18 often used interchangeably.
19
20 Necessary Materials
21 -------------------
22 So you've decided that you want to implement a new decoder for
23 MPlayer. There are a few things you will need:
24
25 - Knowledge of the codec to be implemented: You will need to know the data
26 format of the chunks that MPlayer will pass to you. You will need to know
27 how to take apart the data structures inside. You will need to know the
28 algorithmic operations that need to be performed on the data in order to
29 reconstruct the original media.
30
31 - Sample media: Preferably, lots of it. You will need media encoded in
32 your data format and stored in a media file format that MPlayer knows how
33 to parse (these include AVI, ASF, MOV, RM, VIVO, among others). If the
34 encoded data is stored in a media file format that MPlayer doesn't
35 understand, then you will either need to somehow convert the format to a
36 media file format that the program does understand, or write your own
37 MPlayer file demuxer that can handle the data. Writing a file demuxer
38 is beyond the scope of this document.
39 Try to obtain media that stresses all possible modes of a
40 decoder. If an audio codec is known to work with both mono and stereo
41 data, search for sample media of both types. If a video codec is known to
42 work at 7 different bit depths, then, as painful as it may be, do what you
43 can to obtain sample media encoded for each of the 7 bit depths.
44
45 - Latest CVS snapshot: It's always useful to develop code for the very
46 latest development version of MPlayer. Be sure to update your local CVS
47 copy often.
48
49 - General programming knowledge, working Linux development environment: I
50 would hope that these items would go without saying, but you never know.
51
52 Typical Development Cycle
53 -------------------------
54 1) Set up basic infrastructure
55 First things first, there's a big song and dance to go through in order to
56 let the MPlayer program know that you have a new codec to incorporate.
57
58 MPlayer does not feature what some would term a "clean" codec plugin
59 architecture. Some log this as a complaint. Personally, I think it's
60 necessary to allow MPlayer the type of flexibility to incorporate so many
61 open- and closed-source codecs.
62
63 First, modify your local copy of codecs.conf. It may be system-shared or
64 in your home directory. Add a new entry for your codec. If it's an open
65 source codec, it would be a good idea to place the new entry with the rest
66 of the open source codecs. When you're confident that you have the entry
67 right, be sure to add it to etc/codecs.conf in your workspace. See the
68 file codecs.conf.txt for a detailed description of the format of this
69 file. Create a new audiocodec or videocodec block with the proper info,
70 FOURCCs/format numbers, output formats, and a unique driver name. Remember
71 the driver name.
72
73 Next, edit the file codec-cfg.h. You will find a list of #define's that
74 map names like AFM_MSADPCM and VFM_MSVIDC to numbers. The definitions that
75 begin with AFM_ are audio drivers. The definitions that begin with VFM_
76 are video drivers. If you want to implement a new audio driver, go to the
77 end of the AFM_ list and create a new AFM_ definition for your decoder
78 using the next available number in the list. If you want to make a new
79 video decoder, do the same thing to the VFM_ list.
80
81 Next, edit the file codec-cfg.c. You will find an array of audio driver
82 names and video driver names. If you are implementing a new audio codec,
83 add your new driver name (the one you entered into the codecs.conf
84 file) between the last non-NULL entry and the NULL at the end of the
85 audio driver array. If you are implementing a new video codec, do the
86 same in the video driver array.
87
88 Next, create a new source file which contains the main decoding function
89 that MPlayer will call to decode data. Eventually, you may have multiple
90 files which comprise your decoder, but let's start simple here. Create the
91 skeleton function for your decoder. Since you will also have to write the
92 code to invoke the function, you can make the decoding function look
93 however you want, with whatever parameters you feel will be
94 necessary. Here's an example video decoder:
95
96 void some_video_decoder(
97 char *encoded, // buffer of encoded data
98 int encoded_size, // length of encoded buffer
99 char *decoded, // buffer where decoded data is written
100 int width, // width of decoded frame in pixels
101 int height, // height of decoded frame in pixels
102 int bytes_per_pixel) // bytes/pixel in output image
103
104 Here's an example audio decoder:
105
106 int some_audio_decoder(
107 unsigned short *output, // buffer where decoded 16-bit PCM samples go
108 unsigned char *input, // encoded data
109 int channels) // mono = 1, stereo = 2
110
111 Next, modify the Makefile so that it will compile your new source
112 file.
113
114 Next, modify either dec_audio.c or dec_video.c, depending on whether
115 you're writing an audio or video decoder. You'll probably put the new
116 decoder function header at the top of the file unless you've created a
117 header file to handle it, in which case, you'll include the new header
118 file. The dec_*.c functions are in charge of initializing codecs and then
119 passing encoded data to the proper decoder function. The init and decode
120 functions are big switch statements that key off of the codec definition
121 numbers from codec-cfg.h. Your best bet in here is to examine some simple
122 other simple decoders and clone relevant portions of the case blocks.
123
124 Next, compile the project and see if you have everything correct so far.
125
126 Next, you want to make sure that the encoded data is making it to your
127 decoding function in the first place. This may sound like a trivial
128 exercise, but there are a lot of things that can go wrong (and I've
129 watched most of them go wrong in my experience). At the beginning of your
130 skeleton decoder function, enter the following code:
131 int i;
132 for (i = 0; i < 16; i++)
133 printf ("%02X ", input[i]);
134 printf ("\n");
135 When you compile and run MPlayer, your decoder function will print the
136 first 16 bytes of each data chunk that it receives. Open the sample media
137 in a hex editor and reconcile what you see on the screen with what
138 you find in the file. If the decoder is printing the first 16 bytes of
139 each block, that's a good sign that you're ready to move on to step
140 2. Otherwise, you need to figure out why the data isn't getting to your
141 decoder. Is your decoder even being invoked? If not, why not?
142
143 2) Develop the decoder
144 Go for it. Remember to make it work, first, then make it work fast.
145
146 3) Debug and test the decoder
147 If you're extremely lucky, the decoder will work the first time. If you're
148 very lucky, it will work after you've reviewed your code a few times and
149 corrected a few obvious programming mistakes. Realistically, you will
150 write the decoder, review it many times and fix many obvious and subtle
151 programming errors, and still have to go through an elaborate debug
152 process in order to get the decoder to a minimally functional state.
153
154 Big hint: Ask for all warnings. You know, the -Wall option in
155 gcc? It's very useful to develop your codec while running in debug
156 mode. In order to compile MPlayer with debug support (which includes -Wall
157 for all gcc operations), use the --enable-debug option when configuring
158 the project. Pay attention to all warnings and make it a goal to get
159 rid of every single one. I'll never forget when the compiler warned me
160 that there was no point in clamping a signed 16-bit variable within a
161 signed 16-bit range (the calculation to be clamped was supposed to be
162 stored in a signed 32-bit variable and then stored in the signed 16-bit
163 variable). I sat stunned for a moment, feeling like I had just dodged a
164 bullet as I knew that would have taken me hours to debug that kind of
165 mistake.
166
167 4) Contribute decoder to codebase
168 Create a patch with the "diff -u" format and email it to the MPlayer
169 development team for approval. You will likely need to diff the following
170 files:
171 - Makefile
172 - etc/codecs.conf
173 - codec-cfg.c
174 - codec-cfg.h
175 - dec_audio.c -OR- dec_video.c
176 Of course, you will need to include your newly-created file(s). If you
177 contribute enough decoders, the development team may even grant you write
178 privileges to the CVS repository.
179
180 5) Wait for bug reports to start rolling in
181 You may think you're finished when you release the codec and if you're
182 extremely lucky, you will be right. However, it's more likely that people
183 will start throwing all kinds of oddball media at your decoder that it
184 never counted on. Cheer up; take comfort in knowing that people are
185 testing your code and attempting to use it as a real world
186 application. Download the problem media that people upload to the MPlayer
187 FTP site and get back to work, implementing fixed code that addresses the
188 issues. Contribute more patches and encourage people to hammer on your
189 decoder even more. This is how you make your decoder rock-solid.
190
191 EOF