小叶子-数字摄影技术文摘
星期四, 十二月 23, 2004
 
How to Compile XviD with Microsoft Visual C++ 6.0


Written by David Carroll

Last updated: November 23, 2003


OK, you've got your copy of Microsoft Visual C++ 6.0. You should be able to
just download the source code,
click on the project file, and a few second later, you'll have the Xvid Binary.
Right? Well, unfortunately, it's not that easy. However, it's not that
hard either.


I. Downloading Necessary Files


Xvid depends on a number of libraries and programs that do not come standard
with Microsoft Visual C++ 6.0.


You need:


1) Service Pack 5 for Visual Studio 6 - http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp5/default.asp

The service pack contains all the latest bug fixes for Visual C++ 6.0 as
well as updates to essential libraries. You can download the service pack or
order it on CD from the Microsoft Developers Network
(MSDN) by clicking the link above.


2) Visual C++ 6.0 Processor Pack - http://msdn.microsoft.com/vstudio/downloads/tools/ppack/default.aspx

The processors pack adds support for Intel's SSE, SEE2 and AMD's 3DNow! instructions.


3) NASM - the famous Netwide Assembler - http://sourceforge.net/projects/nasm/

Xvid uses NASM to "compile" the code written in assembly language (the
*.asm files). Download the Win32 binary.


4) DirectX 9.0 SDK - http://msdn.microsoft.com/library/default.asp?url=/downloads/list/directx.asp

To build the DirectShow filter, you need the DirectX SDK (Software Development
Kit). Unfortunately for dial-up users, the ~200MB DirectX SDK is no longer
available on CD.


5) (optional) Pthreads for Win32 - http://sources.redhat.com/pthreads-win32/

You will need the pthreads library if you want to build the SMP version of the
xvid.dll. This is not needed for most users since most users don't have dual
processing systems.


II. Configuring the Compiler


1) Installing Service Pack 5


The Service Pack is easy to install since it comes with an installer. The installer's
filename is "setupsp5.exe". Just find the file and double-click it.


2) Installing Visual C++ Processor Pack


Double-click "vcpp5.exe" to install.

3) Installing and Configuring NASM


a) Unzip the file to an easy to remember directory of your choosing (i.e.,
"C:\DEVELOP\NASM")

b) Xvid expects the filename to be "nasm.exe" (probably because all
other versions except the Win32 version has that name). For some reason, the
Win32 version NASM has a filename of "nasmw.exe." I recommend making
a copy of "nasmw.exe" and renaming it "nasm.exe."

c) Load up Microsoft Visual C++.


i) Click on the "Tools" menu and select "Options."

ii) Click on the "Directories" tab.

iii) Select "Executable Files" from the "Show Directories For"
dropdown box.

iv) Add the path to NASM (e.g., "C:\DEVELOP\NASM")



4) Installing and Configuring the DirectX SDK


The DirectX SDK comes with an installer. Just double-click on the "setup.exe"
file and follow the prompts.


To configure the DirectX SDK:


a) Load up Microsoft Visual C++.

b) Click on the "Tools" menu and select "Options."

c) Click on the "Directories" tab.

d) Select "Include Files" from the "Show Directories For"
dropdown box.

e) Add the following entry: "<path to DirectX SDK>\SAMPLES\C++\DIRECTSHOW\BASECLASSES"
where you replace <path to DirectX SDK> with the actual path to the DirectX
SDK (i.e., "C:\DEVELOP\DXSDK").

f) Use the little up arrow icon to move the entries to the top of the list.



III. Compiling XVID


Now you can download the source
code
, click on the workspace file, and a few second later, you'll have the
Xvid Binary. Just make sure you build the xvidcore first.


IV. Installing XVID


For Windows users, there are really only three files you have to be concerned
with:


1) xvid.dll and xvid.inf - both of these files are in the "<path
to Xvid source code>\vfw\bin\" directory. The "xvid.dll" file
is the Xvid Video for Windows codec. This file is necessary if you wish to encode
any videos using a Video for Windows compliant program (i.e., almost every video
editor out there). In theory, you should be able to play back Xvid files in the
Windows Media Player using this file as well although this functionality appears
to be broken at this point. Therefore, if you wish to play back files in a media
player, install the "xvid.ax" file (see below). The "xvid.inf"
file is the setup information file. Basically, this file tells Windows how to
install "xvid.dll".


To install the Xvid Video for Windows codec (aka xvid.dll)


a) Simply right-click the "xvid.inf" and select "Install" from the
context menu.


That's it, you're done. To verify that the file has been installed correctly,
go to the Control Panel and select "Multimedia", then click on the
"Devices" tab and finally see if "XVID" is listed under the
"Video Compression Codecs" section. If you wish to uninstall the Xvid
codec, select "XVID MPEG-4 CODEC" from the "Add/Remove Program"
list in the Control Panel.


2) xvid.ax -This file is in the "<path to Xvid source code>\dshow\bin\"
directory. The "xvid.ax" file is the Xvid DirectShow filter. Microsoft
has decreed that DirectShow shall replace Video for Windows, so in theory you
won't need "xvid.dll". However, this isn't true. Instead, the DirectShow
filter is used mostly for playback by newer media players. Most video programs
still depend on the Video for Windows codec for encoding.


To install the Xvid DirectShow filter (aka xvid.ax)


a) First copy the "xvid.ax" file to a safe place (i.e., "C:\Program
Files\xvid"). The Video for Windows codec is automatically copied to the
Windows system directory when you install it. The DirectShow filter is not.
Therefore, if you delete the source code directory, you lose your DirectShow
filter.

b) Once you have copied the "xvid.ax" file to a safe place, go to
the Start Menu and select "Run." Type "<path to Windows>\system\regsvr32
<path to xvid.ax>\xvid.ax" (i.e, C:\windows\system\regsvr32 C:\Program
Files\xvid.ax).



That's it, you're done. There really is no easy way to verify that the DirectShow
filter was properly installed other than to play a Xvid encoded video. To uninstall
the DirectShow filter, go to the Start Menu and select "Run." Type
"<path to Windows>\system\regsvr32 /u <path to xvid.ax>\xvid.ax"


V. Troubleshooting FAQ


Q. Why do I get the following error message:



Assembling ..\..\src\utils\x86_asm\mem_transfer_mmx.asm

Bad command or file name



A. You did not correctly install NASM.


Q. What causes this error: "CXvidDecoder.obj : error LNK2001:
unresolved external symbol _MEDIASUBTYPE_IYUV"?


A. This is caused by an outdated strmbase.lib. You need to build a new
one. The path to the project file is <path to DirectX SDK>\Samples\C++\DirectShow\BaseClasses\baseclasses.dsw.
After you build the library, I recommend you copy the strmbase.lib file to <path
to DirectX SDK>\lib.


Q. I have ffdshow,
do I need to install the XviD DirectShow filter?


A. No, not really.


Q. When trying to open a workspace file (.dsw), I get an "empty"
workspace (i.e., there are no source files listed) and/or


When trying to open a project file (.dsp), I
get a"This makefile was not generated by Developer Studio" error.


A. Often, this can be caused by having UNIX line breaks (LF) in the
.dsw and .dsp files, as opposed to Windows line breaks (CR\LF). It is interesting
to note that .dsw and .dsp files are just text files; you can open them up in
any text editor. If you open the .dsw and .dsp files in a text editor that can't
handle UNIX line breaks (namely Notepad) you will probably see big, black squares
at the end of lines. You can "fix" this error by following this procedure.



a) Do NOT let Microsoft Visual C++ attempt to fix the problem! Press "No"
when prompted.

b) Open the .dsw and .dsp files in a text editor that understands UNIX line
breaks. WordPad is one and it is available with most copies of Windows.

c) Once open, simply re-save the file (In WordPad, make sure you set the save
as type to "Text Document"). All UNIX line breaks should be converted
to Windows line breaks.



Also, I have noticed that some "archive" utilities like Winzip
will perform the UNIX -> Windows line break conversion automatically so I
recommend you use those utilities. At the time of writing, archive utilities
that don't perform this conversion include PowerArchiver and WinRAR.


Q. I get lots of error messages similar to the following:



..\..\src\quant\x86_asm\quantize_mmx.asm:429: parser: instruction expected

..\..\src\quant\x86_asm\quantize_mmx.asm:430: symbol `movdqa' redefined



A. You are using an old version of NASM, download a newer version from
http://sourceforge.net/projects/nasm/


Q. I get a few "fatal: unable to open include file `colorspace_mmx.inc'"
errors.


A. This is apparently caused by versions of NASM newer than 0.98.37.
For whatever reason, NASM seems to have trouble dealing with relative paths.
To fix the problem:


a) Open up the project settings by pressing ALT-F7 or selecting "Settings"
from the "Project" menu.

b) Find the following three files under "xvidcore\image\image_asm":

1) colorspace_rgb_mmx.asm

2) colorspace_yuy_mmx.asm

3) colorspace_yuyv_mmx.asm



For each of the files, click on the "Custom Build" tab and change
the line in the "Commands" box to read:



"nasm -f win32 -DPREFIX -I"$(InputDir)"\ -o $(IntDir)\$(InputName).obj
$(InputPath)"


Instead of:


"nasm -f win32 -DPREFIX -I"$(InputDir)" -o $(IntDir)\$(InputName).obj
$(InputPath)"



Notice the extra "\" between the "(InputDir)" and "-o".



Alternately, you could just downgrade back to NASM 0.98.36.


Q. What does "error C2520: conversion from unsigned __int64
to double not implemented, use signed __int64" mean?


A. It means you need to install the Visual C++ Processor Pack.


Q. I have Visual C++ 6.0 Standard. Microsoft says I need the Professional
or Enterprise edition in order to install the Processor Pack. Does this mean
I am out of luck?


A. No. But it does mean you can't use the installer. Instead, you have
to manually install the Processor Pack. Bascially, you have to:



a) Extract the files to a temporary directory using your favorite archive
utilitly (i.e., Winzip).

b) Find the "vcpp.inf" file in the temporary directory and open it.
Inside that file is all the information you need to install the processor pack
manually.



Hint: An entry like:



[CopyToMsdev98Bin]

EnableSIMD.reg,Enabl__1.reg,32



means you should rename "Enable__1.reg" to "EnableSIMD.reg"
and copy it to the <path to Visual C++>\MsDev98\bin directory.


c) Using the information in "vcpp.inf", copy the files from the
temporary directory to the proper directories, renaming if necessary.



Q. What causes this error: "C:\xvid\src\image\qpel.c(84) : fatal
error C1083: Cannot open include file: 'C:\\xvid\\src\\image\\qpel.c': No such
file or directory."


A. Not exactly sure why that happens - it should work. A quick fix is
to open "qpel.c" and replace every instance of



#include __FILE__


with


#include "qpel.c"




I am using windows xp + msvc 6 with sp6 (has latest Proc Pack).

When i follow:

http://ed.gomez.free.fr/vrac/xvid-docs/ch02s02.html


I receive ALOT of errors on the first build (xvidcore.dll):

c:\progs\xvidcore-1.0.2\src\plugins\plugin_2pass2.c(444) : error C2520: conversion from unsigned __int64 to double not
implemented, use signed __int64

if i go to src\portab.h and change:

# define uint64_t unsigned __int64

to

# define uint64_t __int64


it will build this part ok.


Next i go for the vfw part.

There i receive the same error as before:

C:\Progs\xvidcore-1.0.2\vfw\src\status.c(246) : error C2520:
conversion from unsigned __int64 to double not implemented, use signed __int64

this is fixed by changing the define in vfw\src\status.h(9)


Then i have another error:

status.c

Linking...

LINK : warning LNK4075: ignoring /EDITANDCONTINUE due to /INCREMENTAL:NO specification

Creating library Debug/xvidvfw.lib and object Debug/xvidvfw.exp

The syntax of the command is incorrect.

Error executing c:\windows\system32\cmd.exe.

xvidvfw.dll - 1 error(s), 1 warning(s)

But the lib is actually created, and if i press f7 it will report no errors.

Installing the lib with vfw\bin\xvid.inf will report that no xvidcore.dll can be found. I
have to make a copy of build\win32\libxvidcore.dll to xvidcore.dll and point the installer
to that file.

In reality i have no need to build xvid, i am just going to make some JNI-xvid stuff but
tought it was fun to build and report my problems back.


Comments: 发表评论

<< Home

Powered by Blogger