MPEG2AVI - MPEG1/MPEG2/VOB video -> AVI video
I got bored this past summer so I played around with the MPEG Software Simulation Group's MPEG2V12 codec. MPEG2AVI is a freeware MPEG-1/MPEG-2/VOB video -> AVI video converter, based on MSSG's original source-code. The program is a Win32-console application, meaning it runs from the command-line.
Read the readme.txt file for latest changes. The ZIP files contain the executable and source-code (for Visual C++.)
IDCT package notes
IDCTpk12 now includes the "ap922float" iDCT. AP922float is derived from Intel's Application Note AP-922, and is the name I chose to this derivative work. The "ap922float" iDCT is extremely accurate; the standard C-code (X87) version can be configured to duplicate IEEE-1180/1990 64bit-float reference-iDCT. The 3DNow and IntelSSE versions use 32bit floating point math, but approach the precision of the reference-iDCT. All versions properly clip the iDCT output elements to the numerical range {-256,+255}.
To compile the enclosed software "as is", you will need Visual C++ 6.0 Pro with the Microsoft Processor Pack Beta. The Processor Pack Beta is downloadable from Microsoft's MSDN site, under Visual C++ 6.0 section (you have to hunt for it.) This add-on is only necessary to compile the IntelSSE assembly source code. The rest of idctpk12 should compile without the Processor Pack Beta. The actual compiled program does not check for 3DNow/MMX/SSE-support, so running the executable on a non-supported CPU will crash the system.
(And, no, idctpk12 does not include an MMX AP922 iDCT. You can already get this from the provided links.)
FDCT package notes
This package includes different forward dct (fDCT) implementations, including various AAN implementations (x87d floating point, 3d-Now floating point, 32-bit integer) and a precise MMX implementation. I derived the 3D-Now AAN code from BBMPEG's double-precision AAN, and the precise MMX implementation from Intel's AP-922 document.
Complete C-code listings for the AP922 implementation are now included. The C-code executes much slower but produces identical output. I included it to aid others in the understanding of AP-922.
AAN 3DNow fdct notes
The 3D-Now AAN implementation is a direct conversion of the BBMPEG x87d AAN, so it is NOT the fastest DCT possible with 3D-Now. (Sorry, don't know how that typo slipped in.) I think the source code is quite readable, so other programmers could optimize it further. To compile the enclosed software "as is", you will need Visual C++ 6.0 (although 5.0's compiler should accept the 'amd3dx.h' macro-file, the package was tested with Visual C++ 6.0 pro.) The actual compiled program does not check for host 3DNow-support, so running the executable on a non-3DNow CPU will crash the system.
The output is almost as accurate as BBMPEG's x87d AAN DCT, and much more accurate than MPEG Software Simulation Group's integer-32 AAN DCT. On a K6/2-500, the 3Dnow AAN DCT runs >2X faster than a C-code integer AAN DCT. On the same CPU, the 3Dnow AAN DCT runs roughly 10-15X faster than the BBMPEG x87d AAN DCT. Originally I claimed "20X", but retesting with Visual C++'s profiler yielded inconsistent numbers. It seems the profiler can't accurately measure very small execution times (the tested fdct functions consume <1% total CPU execution time.)
3D-Now instructions use 32-bit single precision floating point calculations. On the AMD K6-x, 3Dnow can execute up to 8.0X as many float instructions as the x87-FPU (for most code the # is more like 2-4X.) On the K7 CPUs, the vastly improved x87-FPU narrows the performance gap to a more conservative 2.0X.
I am working on an Intel-SSE version of the AAN DCT, but it will take time. SSE is not as straightforward to hand-code (whereas 3D-Now is just like MMX), and simply replacing the 3D-Now opcode with SSE opcodes would produce a very inefficient (and slower) result.
(DOWNLOAD NOTE : TRIPOD requires a JAVA-capable browser to download member-page files! If you are using a text-based browser such as LYNX, you will not be able to download these files!)
09/07/2000 liaor@iname.com