Thursday, July 8, 2010

Compiling Matlab mpgwrite with VS2010 for 64 bit Windows

I was having trouble producing Matlab movies of reasonable quality on my 64 bit Windows 7 laptop until I was able to compile and run mpgwrite (source available from Matlab Central http://www.mathworks.com/matlabcentral/fileexchange/309-mpgwrite).

It wasn't obvious how to get this to compile and run so in case someone else would like to do this I've documented what I did:

1. Ensure Visual Studio 2010 installation includes the "X64 Compilers and Tools" (and option under the Visual C++ feature in the Visual Studio 2010 installer).

2. Configure the mex script for VS2010.
Matlab R2009b and earlier doesn't directly support Visual Studio 2010 but you can still use it by running
mex -setup
from Matlab.
a. Answer n to the first question (Would you like mex to locate installed compilers [y]/n? )
b. Select "Microsoft Visual C++ 2008 SP1 " (option 5)
c. The script will output:
The default location for Microsoft Visual C++ 2008 SP1 compilers is
C:\Program Files (x86)\Microsoft Visual Studio 9.0,
but that directory does not exist on this machine.
Use C:\Program Files (x86)\Microsoft Visual Studio 9.0 anyway [y]/n?

Answer n
d. Locate your Visual Studio 2010 installation folder and enter this in response to the next question. Visual Studio 2010 was probably installed to C:\Program Files (x86)\Microsoft Visual Studio 10.0
e. Finally, you will be asked to confirm the settings and Matlab will create a file mexopts.bat with the configuration information.

3. From Microsoft Visual Studio 2010\Visual Studio Tools open "Visual Studio x64 Win64 Command prompt (2010)".

4. Change to the src folder of the downloaded the mpgwrite source code.

5. Edit the file makefile and replace $(MCC) $(MCFLAGS) after the call to mex with
-v -DWIN32
That is, your makefile should contain:

mpgread:
mex -v -DWIN32 mpgwrite.c mfwddct.c \
postdct.c huff.c bitio.c mheaders.c iframe.c \
pframe.c bframe.c psearch.c bsearch.c block.c \
mpeg.c subsampl.c jrevdct.c frame.c fsize.c

5. Run
nmake -f makefile

6. This should generate the file
mpgwrite.mexw64
Copy this file to a folder on the matlab path.

You should now be able to generate mpeg movies from matlab.


% Mpeg generation example
clear F;
fig=figure;
t = (0:1000)./10;
h = line( ...
'color','b', ...
'LineStyle','-', ...
'erase','xor', ...
'LineWidth',0.5, ...
'xdata',t,'ydata',[]);
for k=1:100
set(h,'ydata', sin(t-k).*t )
drawnow
F(k) = getframe(gca);
end
mpgwrite(F,F(1).colormap,'sine.mpg')


4 comments:

  1. Hey,
    Awesome work !
    Could you by in chance post the compiled dll for all the folks in need ?
    Thanks,

    Claire

    ReplyDelete
    Replies
    1. Forgot about your request but it's available now (1 year late!)
      Sorry about the massive delay

      Delete
  2. Thanks for the instructions. Unfortunately I'm unable to install VS 2010 on my work PC, so I can't compile the code for 64-bit Matlab. As Claire requested, is there any way you could host the mpgwrite.mexw64 file, or send direct via email?

    ReplyDelete
  3. You can get the file from https://dl.dropbox.com/u/13234656/mpgwrite.mexw64

    ReplyDelete