annotate DOCS/tech/codec-devel.txt @ 6110:7bea806b9c5f

Improvment for spu subtitles. Removed the integreted spudec in vobsub. Various cleanup/bugfix in vobsub (no more auto palette when a true one is here) HW spu rendering moved in spudec because we first need to reassable the packet before sending them to the hw. Spudec is now created only if nedded.
author albeu
date Fri, 17 May 2002 23:47:27 +0000
parents 02b275e198c3
children c5fd28225fab
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3862
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
1 A Guide To Developing MPlayer Codecs
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
2 by Mike Melanson (melanson at pcisys dot net)
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
3
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
4 Introduction
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
5 ------------
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
6 I've developed a number of open source decoders for the MPlayer project,
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
7 for both audio and video data. As such, I feel I'm qualified to document a
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
8 few notes about developing new codecs for the codebase.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
9
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
10 As always, the best way to learn how to incorporate a new codec is to
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
11 study a bunch of existing code. This document is supplementary material to
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
12 the code, meant to give some tips, pointers, and a general roadmap.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
13
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
14 A note about terminology: "Codec" stands for coder/decoder (or
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
15 compressor/decompressor, if you prefer). The term refers to a module that
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
16 can both encode and decode data. However, this document focuses primarily
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
17 on incorporating decoders. Still, the terms "decoder" and "codec" are
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
18 often used interchangeably.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
19
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
20 Necessary Materials
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
21 -------------------
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
22 So you've decided that you want to implement a new decoder for
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
23 MPlayer. There are a few things you will need:
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
24
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
25 - Knowledge of the codec to be implemented: You will need to know the data
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
26 format of the chunks that MPlayer will pass to you. You will need to know
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
27 how to take apart the data structures inside. You will need to know the
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
28 algorithmic operations that need to be performed on the data in order to
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
29 reconstruct the original media.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
30
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
31 - Sample media: Preferably, lots of it. You will need media encoded in
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
32 your data format and stored in a media file format that MPlayer knows how
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
33 to parse (these include AVI, ASF, MOV, RM, VIVO, among others). If the
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
34 encoded data is stored in a media file format that MPlayer doesn't
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
35 understand, then you will either need to somehow convert the format to a
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
36 media file format that the program does understand, or write your own
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
37 MPlayer file demuxer that can handle the data. Writing a file demuxer
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
38 is beyond the scope of this document.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
39 Try to obtain media that stresses all possible modes of a
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
40 decoder. If an audio codec is known to work with both mono and stereo
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
41 data, search for sample media of both types. If a video codec is known to
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
42 work at 7 different bit depths, then, as painful as it may be, do what you
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
43 can to obtain sample media encoded for each of the 7 bit depths.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
44
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
45 - Latest CVS snapshot: It's always useful to develop code for the very
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
46 latest development version of MPlayer. Be sure to update your local CVS
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
47 copy often.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
48
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
49 - General programming knowledge, working Linux development environment: I
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
50 would hope that these items would go without saying, but you never know.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
51
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
52 Typical Development Cycle
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
53 -------------------------
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
54 1) Set up basic infrastructure
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
55 First things first, there's a big song and dance to go through in order to
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
56 let the MPlayer program know that you have a new codec to incorporate.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
57
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
58 MPlayer does not feature what some would term a "clean" codec plugin
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
59 architecture. Some log this as a complaint. Personally, I think it's
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
60 necessary to allow MPlayer the type of flexibility to incorporate so many
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
61 open- and closed-source codecs.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
62
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
63 First, modify your local copy of codecs.conf. It may be system-shared or
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
64 in your home directory. Add a new entry for your codec. If it's an open
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
65 source codec, it would be a good idea to place the new entry with the rest
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
66 of the open source codecs. When you're confident that you have the entry
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
67 right, be sure to add it to etc/codecs.conf in your workspace. See the
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
68 file codecs.conf.txt for a detailed description of the format of this
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
69 file. Create a new audiocodec or videocodec block with the proper info,
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
70 FOURCCs/format numbers, output formats, and a unique driver name. Remember
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
71 the driver name.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
72
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
73 Next, edit the file codec-cfg.h. You will find a list of #define's that
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
74 map names like AFM_MSADPCM and VFM_MSVIDC to numbers. The definitions that
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
75 begin with AFM_ are audio drivers. The definitions that begin with VFM_
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
76 are video drivers. If you want to implement a new audio driver, go to the
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
77 end of the AFM_ list and create a new AFM_ definition for your decoder
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
78 using the next available number in the list. If you want to make a new
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
79 video decoder, do the same thing to the VFM_ list.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
80
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
81 Next, edit the file codec-cfg.c. You will find an array of audio driver
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
82 names and video driver names. If you are implementing a new audio codec,
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
83 add your new driver name (the one you entered into the codecs.conf
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
84 file) between the last non-NULL entry and the NULL at the end of the
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
85 audio driver array. If you are implementing a new video codec, do the
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
86 same in the video driver array.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
87
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
88 Next, create a new source file which contains the main decoding function
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
89 that MPlayer will call to decode data. Eventually, you may have multiple
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
90 files which comprise your decoder, but let's start simple here. Create the
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
91 skeleton function for your decoder. Since you will also have to write the
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
92 code to invoke the function, you can make the decoding function look
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
93 however you want, with whatever parameters you feel will be
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
94 necessary. Here's an example video decoder:
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
95
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
96 void some_video_decoder(
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
97 char *encoded, // buffer of encoded data
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
98 int encoded_size, // length of encoded buffer
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
99 char *decoded, // buffer where decoded data is written
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
100 int width, // width of decoded frame in pixels
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
101 int height, // height of decoded frame in pixels
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
102 int bytes_per_pixel) // bytes/pixel in output image
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
103
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
104 Here's an example audio decoder:
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
105
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
106 int some_audio_decoder(
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
107 unsigned short *output, // buffer where decoded 16-bit PCM samples go
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
108 unsigned char *input, // encoded data
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
109 int channels) // mono = 1, stereo = 2
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
110
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
111 Next, modify the Makefile so that it will compile your new source
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
112 file.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
113
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
114 Next, modify either dec_audio.c or dec_video.c, depending on whether
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
115 you're writing an audio or video decoder. You'll probably put the new
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
116 decoder function header at the top of the file unless you've created a
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
117 header file to handle it, in which case, you'll include the new header
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
118 file. The dec_*.c functions are in charge of initializing codecs and then
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
119 passing encoded data to the proper decoder function. The init and decode
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
120 functions are big switch statements that key off of the codec definition
4630
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
121 numbers from codec-cfg.h. Your best bet in here is to examine some other
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
122 simple decoders and clone relevant portions of the case blocks.
3862
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
123
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
124 Next, compile the project and see if you have everything correct so far.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
125
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
126 Next, you want to make sure that the encoded data is making it to your
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
127 decoding function in the first place. This may sound like a trivial
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
128 exercise, but there are a lot of things that can go wrong (and I've
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
129 watched most of them go wrong in my experience). At the beginning of your
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
130 skeleton decoder function, enter the following code:
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
131 int i;
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
132 for (i = 0; i < 16; i++)
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
133 printf ("%02X ", input[i]);
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
134 printf ("\n");
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
135 When you compile and run MPlayer, your decoder function will print the
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
136 first 16 bytes of each data chunk that it receives. Open the sample media
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
137 in a hex editor and reconcile what you see on the screen with what
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
138 you find in the file. If the decoder is printing the first 16 bytes of
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
139 each block, that's a good sign that you're ready to move on to step
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
140 2. Otherwise, you need to figure out why the data isn't getting to your
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
141 decoder. Is your decoder even being invoked? If not, why not?
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
142
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
143 2) Develop the decoder
4630
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
144 Go for it. Remember to make it work, first, then make it work fast. Some
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
145 specific tips:
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
146
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
147 What output formats should you support in your decoder? Whatever makes
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
148 sense. YUV output is always preferable over RGB output. Generally, if a
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
149 codec uses a YUV data as its source data, you will be able to decode a
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
150 frame of YUV data. If a codec takes RGB data as its input, as many older
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
151 video codecs do, then there's no point in supporting YUV output; just
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
152 output as many RGB formats as possible.
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
153
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
154 The most preferred output format for video data is YV12. This is because
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
155 MPlayer supports a multitude of hardware devices that can display, scale,
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
156 and filter this type of data directly. MPlayer also has a bunch of
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
157 optimized conversion functions that can convert YV12 data to any other
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
158 type of output data.
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
159
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
160 If you do take the RGB output route, you should be aware that MPlayer
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
161 actually orders packed RGB data as BGR. If you're decoding into a BGR24
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
162 buffer, the output will look like:
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
163 B G R B G R B G R B ...
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
164 If you're decoding into a BGR32 buffer, there will need to be an
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
165 additional (unused) byte after each BGR triplet:
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
166 B G R - B G R - B G ...
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
167
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
168 Make liberal use of sanity checks. Start by including the file mp_msg.h at
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
169 the start of your decoder. Then you can use the mp_msg() function as you
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
170 would a normal printf() statement. Whenever your decoder notices a strange
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
171 bit of data or an odd condition, print a message such as:
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
172 mp_msg(MSGT_DECVIDEO, MSGL_WARN, "Odd data encountered: %d\n", data);
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
173 Obviously, you should make the message a little more
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
174 descriptive, for your benefit. MSGL_WARN is a good message level for this
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
175 type of information. Look in mp_msg.h for all of the error levels. You can
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
176 even make MPlayer bail out completely by using MSGL_FATAL, but that should
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
177 never be necessary at the data decoder level.
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
178
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
179 What conditions should trigger a warning? Anything, and I mean *anything*
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
180 out of the ordinary. Many chunks of compressed video data contain headers
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
181 with data such as width, height, and chunk size. Reconcile these fields
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
182 with the parameters passed into the decoding function (if you set it up to
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
183 take those parameters). Such data should match up. If it doesn't, issue a
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
184 warning and make an executive decision in the code about which data to
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
185 believe (personally, I always lend more weight to the data that was passed
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
186 into the decoder function, the data that comes from the container file's
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
187 header). If there's supposed to be a magic number embedded in, or computed
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
188 from, the chunk's header, issue a warning if it isn't correct.
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
189
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
190 Whenever you're about the index into a memory array with an index that
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
191 could theoretically be out of range, then test that the index is in range,
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
192 no matter how tedious it seems. Accessing outside of your memory range is,
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
193 after all, the number 1 cause of segmentation faults. Never trust that all
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
194 the data passed to you will be correct. If an array index suddenly winds
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
195 up out of range, it's probably best to issue a warning about it and bail
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
196 out of the decoder (but not the whole application).
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
197
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
198 Writing all of these warning statements may seem insipid, but consider
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
199 that if you don't do it when you start writing your decoder, you'll
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
200 probably end up doing it later on when your decoder isn't working properly
02b275e198c3 added more tips on codec development
melanson
parents: 3862
diff changeset
201 and you need to figure out why (believe me, I know).
3862
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
202
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
203 3) Debug and test the decoder
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
204 If you're extremely lucky, the decoder will work the first time. If you're
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
205 very lucky, it will work after you've reviewed your code a few times and
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
206 corrected a few obvious programming mistakes. Realistically, you will
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
207 write the decoder, review it many times and fix many obvious and subtle
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
208 programming errors, and still have to go through an elaborate debug
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
209 process in order to get the decoder to a minimally functional state.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
210
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
211 Big hint: Ask for all warnings. You know, the -Wall option in
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
212 gcc? It's very useful to develop your codec while running in debug
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
213 mode. In order to compile MPlayer with debug support (which includes -Wall
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
214 for all gcc operations), use the --enable-debug option when configuring
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
215 the project. Pay attention to all warnings and make it a goal to get
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
216 rid of every single one. I'll never forget when the compiler warned me
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
217 that there was no point in clamping a signed 16-bit variable within a
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
218 signed 16-bit range (the calculation to be clamped was supposed to be
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
219 stored in a signed 32-bit variable and then stored in the signed 16-bit
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
220 variable). I sat stunned for a moment, feeling like I had just dodged a
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
221 bullet as I knew that would have taken me hours to debug that kind of
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
222 mistake.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
223
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
224 4) Contribute decoder to codebase
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
225 Create a patch with the "diff -u" format and email it to the MPlayer
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
226 development team for approval. You will likely need to diff the following
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
227 files:
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
228 - Makefile
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
229 - etc/codecs.conf
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
230 - codec-cfg.c
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
231 - codec-cfg.h
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
232 - dec_audio.c -OR- dec_video.c
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
233 Of course, you will need to include your newly-created file(s). If you
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
234 contribute enough decoders, the development team may even grant you write
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
235 privileges to the CVS repository.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
236
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
237 5) Wait for bug reports to start rolling in
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
238 You may think you're finished when you release the codec and if you're
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
239 extremely lucky, you will be right. However, it's more likely that people
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
240 will start throwing all kinds of oddball media at your decoder that it
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
241 never counted on. Cheer up; take comfort in knowing that people are
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
242 testing your code and attempting to use it as a real world
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
243 application. Download the problem media that people upload to the MPlayer
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
244 FTP site and get back to work, implementing fixed code that addresses the
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
245 issues. Contribute more patches and encourage people to hammer on your
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
246 decoder even more. This is how you make your decoder rock-solid.
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
247
74622f23bce5 initial commit of "Guide To Codec Hacking"
melanson
parents:
diff changeset
248 EOF