http://raph.levien.com/pulldown.html
There are a number of free software codebases for decoding, encoding, and transforming MPEG-2 streams. With these, it's possible to transcode from DVD to SVCD, and other fun tricks.
However, all these codebases I've seen share a common problem: they all ignore or corrupt the RFF and TFF bits set in MPEG-2 picture extension headers, which are used to implement the 3:2 pulldown used to display 24 fps source material at 29.97 fps NTSC frame rates. Typical symptoms include loss of A/V sync, jerky motion, and excess flickering at scene changes and in high-motion sequences.
The fundamental problem is simple. Most movies are shot at 24 fps, while NTSC displays frames at 29.97 fps. Thus, a process called "telecine" is used to adapt the frame rate.
It would be possible for telecine to repeat one frame every four (source) frames, but the results wouldn't be very pleasing. So, instead, telecine makes use of the fact that a single NTSC frame is interlaced into two fields, so each source frame is rendered as either 2 or 3 fields. Commonly, these are interleaved so that even-numbered fields are 3 fields, and odd-numbered are 2, hence the name "3:2 pulldown".
Compressing such a sequence presents definite problems. If you compressed individual fields, then your compression wouldn't be as good in low-motion sequences. Conversely, if you compressed frames at the 29.97 fps NTSC frame rate, you'd find that a quarter of your frames would consist of two fields from different source frames. These compress poorly and don't look that great when displayed. (Even so, it's not uncommon to see these frames occasionally on less than lovingly mastered DVD's).
Consequently, the designers of MPEG-2 provided flags so that video sequences can be encoded at 24 fps, and the 3:2 pulldown done in the player at playback time. These flags are called RFF (repeat first field) and TFF (top field first). Each frame with RFF set is displayed for 3 fields, otherwise 2. The TFF bit is actually redundant - it is equal to the previous TFF xor'ed with the previous RFF, and is initially 1.
For pure 24000/1001 fps source material, existing free software transcoders do a decent job. They ignore the pulldown flags, then add their own with an on:off:on:off pattern of RFF.
See my diary entry on the subject.
This page unmaintained since 2003-03-27.