%%%%%%%%%%%%% flashmovie.sty
%%%%%%%%%%%%% Copyright 2010 Timo Hartmann (thartmann15 at googlemail.com)
%
% Version 0.4
%
% changelog:
%   0.4 : 2010-09-13 : better support for jw-player, minor bug fixes
%   0.3 : 2010-09-09 : better examples,minor bug fixes, issues with beamer explained
%   0.2 : 2010-04-21 : major overhaul: keyval 'engine', flv-player-engine,
%                                      efficient multiple embedding of files,...
%   0.1 : 2010-04-13 : a bunch of bugfixes
%   0.0 : 2009-12-06 : initial release
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
% http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This license applies to following files:
%   flashmovie.sty,test.tex,test-flv.tex,README
%
%
%
% The file "player_flv_maxi.swf" is NOT from me. This is the original flv-player 
% from http://flv-player.net whose developer is neolao. 
% This file is distributed under the MPL-license. See the directory 
% "flv-player-license" for more information. The file "license.txt" in that directory
% is from the original source-code of the flv-player. A copy of the MPL-license is also
% included there.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% special thanks to following people for providing support, tips and improvements:
%  - Elie Roux
%  - Marco Aurélio Graciotto Silva
%  - neolao
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% This package allows direct embedding of flash movies into PDF files. It is
% designed for use with pdflatex.
%
% Basically it uses the fact that the Adobe Reader 9 contains an embedded Adobe Flash 
% player which can be invoked with the "rich media annotation" feature which is described 
% in "Adobe Supplement to the ISO 32000 BaseVersion: 1.7 ExtensionLevel: 3".
%
% advantages:
%   - You can directly embed videos into the pdf (external window is optimal and not necessary).
%   - You can play back videos without worrying about platform dependencies.
%
% disadvantages:
%   - You can only play back embedded videos with Adobe Reader 9 and upwards.
%
% usage:
%   There are two fundamental different ways to embed videos via the
%   flash-component of the Adobe Reader:
%     - One can create a ".swf"-file and insert this directly
%       into the pdf. See example (1) below.
%     - One can create a ".mp4"-file and use that file as an input
%       to a flash-video-player which renders the videos.
%       Both files (the video and the flash-video-player) will be
%       embedded into the pdf. See example(2) below.
%       Different video formats (mp4/flv/whatever-the-flash-video-player-accepts/...)
%       can be used. Controls are available (depending on the player).
%       See example (2) below.
%   Using the keyword "engine" one can select the method of embedding.
%   If you omit it or if you specify "engine=pure-swf" then the file will be
%   directly embedded. This works only for swf-files.
%   For other possible values of "engine" see the chapter "flash-video-players".
%
% supported file formats:
%   - flash animations ( ".swf" files) via direct embedding
%   - mp4 movies (".mp4" files) via an embedded flash-video-player
%   - flv movies (".flv" files) via an embedded flash-video-player
%
%   attention:
%     - avi videos (".avi" files) don't work !
%
% flash-video-players:
%   There are several flash-video-players available which fit the needs
%   of flashmovie.sty. The different players can be selected with the key "engine",
%   for example: "\flashmovie[width=10cm,height=10cm,engine=flv-player]{saturn5.mp4}".
%
%   The use of "engine=flv-player" is recommended, because it is supported best and
%   the flv-player is included in this distribution. But there seems to be some
%   incompatibilities of flv-player and beamer. See troubleshooting below.
%
%   List of flash-video-players:
%
%    - "engine=flv-player". This is an open-source player from http://flv-player.net.
%      It is included with this distribution (the file player_flv_maxi.swf).
%      The developer is neolao. See the directory flv-player-license for the license of it.
%      This is the player which flashmovie.sty supports best.
%
%      supported parameters:
%        auto=0                   --> auto-play off (default)
%        auto=1                   --> auto-play on
%        image=someimage.jpeg     --> start-image (not necessary)
%
%    - "engine=jw-player". This is the JW player from http://www.longtailvideo.com/players/jw-flv-player.
%      You have to obtain player.swf from that site and put it in the working directory in order
%      to use this module. Its released under a creative common license which means its free
%      for non-commercial use.
%      It is NOT included in this distribution.
%
%      supported parameters:
%        auto=0                   --> auto-play off (default)
%        auto=1                   --> auto-play on
%        image=someimage.jpeg     --> start-image (not necessary)
%        controlbar=0             --> no control bar shown
%        controlbar=1             --> control bar shown (default)
%        loop=0                   --> do not loop the video (default)
%        loop=1                   --> loop the video
%
%    - "engine=acropro". This is an commercial player which is distributed with
%      Acrobat 9 Pro. You have to obtain VideoPlayer.swf and SkinOverPlaySeekStop.swf 
%      from Acrobat 9 Pro and put them into the working directory in order to use that module.
%      It is NOT included in this distribution.
%      For this player flashmovie.sty only provides rudimentary support.
%    - "engine=osplayer". This is an open-source player from http://www.osflv.com
%      You have to obtain OSplayer.swf from that site and put it in the working directory in order
%      to use this module.
%      It is NOT included in this distribution.
%      For this player flashmovie.sty only provides rudimentary support.
%
%   other options for the "engine"-keyword:
%    - "engine=pure-swf" : This directly embedds the file into the PDF without 
%      any flash-video-player. This is the default option when you omit the 
%      "engine"-keyword. This works only for swf-files.
%    - "engine=blank" : This simply produces an empty rectangle instead of an
%      flash animation. This is useful during the creation process of the 
%      PDF because flash animations inside a PDF can easily crash 
%      the Adobe reader with the reload (CTRL-R) feature after recompiling
%      the tex-file. 
%      The same effect can be produced if uses "blank=1" as an option 
%      regardless what the value of "engine" is.
%      example: \flashmovie[...,engine=flv-player,blank=1,...]{...}
%
%
% example (1)
%   - download a video file to use, for example
%        http://heasarc.gsfc.nasa.gov/Videos/historical/saturn5.avi
%   - transform this video into the flash format with ffmpeg:
%        ffmpeg -i saturn5.avi saturn5.swf
%     (or use any other program capable of this, for example mencoder)
%   - put following line into your tex-file:
%        \flashmovie[width=10cm,height=10cm]{saturn5.swf}
%     (both width and height are needed!)
%   - translate with pdflatex
%   - advantages:
%     - easy
%     - does not rely on external components
%   - disadvantages:
%     - ffmpeg is incapable of embedding h.264 into swf-files, so one can only 
%       use inferior video codecs (sorenson h.263 aka flv,...).
%     - no controls (play,pause,stop,seek,...) possible
%
% example (2)
%   - download a video file to use, for example
%        http://heasarc.gsfc.nasa.gov/Videos/historical/saturn5.avi
%   - transform this video into the mp4 format with ffmpeg:
%        ffmpeg -i saturn5.avi -vcodec libx264 -vpre hq -crf 22 -acodec libfaac -ab 128k -ac 2 saturn5.mp4
%     (or use any other program capable of this, for example mencoder)
%   - alternatively the flv-format with video-codec sorenson h.263 (aka flv) and audio-codec mp3 is also possible:
%       mencoder saturn5.avi -o saturn5.flv -of lavf -ovc lavc -lavcopts vcodec=flv:vbitrate=300:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 22050 -ofps 24 -vf harddup -oac mp3lame -lameopts abr:br=56 )
%     (or use ffmpeg to do the same thing...)
%   - put following line into your tex-file:
%        \flashmovie[width=10cm,height=10cm,engine=flv-player,auto=1]{saturn5.mp4}
%     (both width and height are needed! instead of saturn5.mp4 one can also use saturn5.flv but not saturn5.swf)
%   - translate with pdflatex
%   - advantages:
%     - controls (play,pause,stop,seek,...) possible
%     - superior video codec possible (h.264)
%     - one can directly embed mp4 and flv files without conversion
%
% how to produce swf-files:
%   - ffmpeg or mencoder : transform a video file into a flash animation (example: .mp4 --> .swf)
%   - png2swf : transform a sequence of png files into a flash animation (example: .png --> .swf)
%   - flex sdk : use action script to program your own flash applet
%   - mtasc and swfmill : use action script to program your own flash applet (outdated, should not be used)
%
% todo:
%   - make more options of rich-media annotations usable, for example activation by clicking, play-count,...
%
% tips:
%   - It is in principle possible to insert any flash animation into a PDF.
%     One is not restricted to videos.
%   - During development of the PDF one can switch of the flash animations which
%     is sometimes useful. See "engine=blank" or "blank=1" for more information.
%
% troubleshooting:
%   - If you encounter the error message "\pdfminorversion cannot be changed after data is written to the PDF file.",
%     then another package is also setting the variable "\pdfminorversion".
%     For example the package "beamer" does so.
%     There are two solutions: 
%      - Include the package with the highest "\pdfminorversion" first.
%        For example put "\RequirePackage{flashmovie}" on the very first line 
%        of your file instead of using "\usepackage{flashmovie}" later on.
%        Or rearrange the usepackage-commands in the right order.
%      - Comment the line "\ifnum\pdfminorversion<7 \pdfminorversion=7\fi" in
%        "flashmovie.sty". This will probably leave your PDF with the wrong 
%        version information, but the Adobe Reader will take it anyway.
%   - There seems to be some trouble with the latex package beamer. You can't use
%     the flv-player reliably with it. It is prone to crash the acrobat reader while
%     changing pages.
%     The only reliable way to use beamer seems to be directly embedding the videos as
%     flash animations or to use the JW player.
%
% warning:
%   - It is recommended to use always the latest available version of the Adobe Reader. 
%     This should be mandatory because in the past many attacks on computers were based
%     on 'evil' PDFs which exploited security holes in this software.
%   - Because the file names of the movies are directly embedded into the PDFs please use only
%     "normal" file names. More specific use only names compatible with internal PDF strings.
%     There is even a specification what conforming file names are (see the PDF reference).

\RequirePackage{keyval}
\RequirePackage{ifthen}

\ifnum\pdfminorversion<7 \pdfminorversion=7\fi

\def\flashmovieempty{}
\def\flashmoviezero{0}
\def\flashmovieembedded{}

\def\flashmovieparamsclear{
  \def\flashmoviewidth {4cm}
  \def\flashmovieheight{4cm}
  \def\flashmovieimage{}
  \def\flashmovieauto{0}
  \def\flashmovieengine{}
  \def\flashmoviekblank{0}
  \def\flashmoviecontrolbar{1}
  \def\flashmovieloop{0}
}

\define@key{flashmovieparams}{width}      {\def\flashmoviewidth  {#1}}
\define@key{flashmovieparams}{height}     {\def\flashmovieheight {#1}}
\define@key{flashmovieparams}{image}      {\def\flashmovieimage  {#1}}
\define@key{flashmovieparams}{auto}       {\def\flashmovieauto   {#1}}
\define@key{flashmovieparams}{engine}     {\def\flashmovieengine {#1}}
\define@key{flashmovieparams}{blank}      {\def\flashmoviekblank {#1}}
\define@key{flashmovieparams}{controlbar} {\def\flashmoviecontrolbar{#1}}
\define@key{flashmovieparams}{loop}       {\def\flashmovieloop{#1}}

\newlength{\flashmovie@width}
\newlength{\flashmovie@height}
\newsavebox{\flashmovie@content}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%% variable module %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \flashmovieset{a}{b}   is equivalent to \def\a{b}
% \flashmovieget{a}      is equivalent to \a if a is defined and otherwise it is empty
%
% example:
%   \flashmovieset{aaa}{bla} \flashmovieget{aaa}     ------> produces bla
%                            \flashmovieget{bbb}     ------> produces nothing if bbb is not defined

\def\flashmovieset#1#2{{\expandafter\xdef\csname flashmovie@f@#1\endcsname{#2}}}

% warning: command must be on one line so that there are no spaces generated !
\def\flashmovieget#1{\expandafter\ifx\csname flashmovie@f@#1\endcsname\relax\expandafter\flashmovieempty\else\csname flashmovie@f@#1\endcsname\fi}

%simpler:
%  \def\flashmovieset#1#2{{\expandafter\xdef\csname#1\endcsname{#2}}}
%  \def\flashmovieget#1{\expandafter\ifx\csname#1\endcsname\relax\expandafter\flashmovieempty\else\csname#1\endcsname\fi}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%% file embedding module %%%%%%%%%%%%%%%%%%%%%%%%
%
% usage:
%    \flashmovieembedfile{somefile}
%    \edef\flashmovie@e@somefile{\flashmovieembedded}

\def\flashmovieembedfileinternal#1{%
  \immediate%
  \pdfobj stream
     attr {  /Type/EmbeddedFile  }
     file {#1}%
  \immediate%
  \pdfobj{ <<
      /Type /Filespec
      /F  (#1)
      /UF (#1)
      /EF << /F \the\pdflastobj\space 0 R >>
    >>}%
}

\def\flashmovieembedfile#1{%
  \ifthenelse{\equal{\flashmovieget{\pdfmdfivesum file {#1}}}{\flashmovieempty}}{%
    \flashmovieembedfileinternal{#1}%
    \def\flashmovieembedded{\the\pdflastobj}%
    \flashmovieset{\pdfmdfivesum file {#1}}{\flashmovieembedded}%
  }{%
    \def\flashmovieembedded{\flashmovieget{\pdfmdfivesum file {#1}}}%
  }%
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def\flashmovie{\@ifnextchar[\@flashmovie{\@flashmovie[]}}

\def\@flashmovie[#1]#2{\flashmovieparamsclear \setkeys{flashmovieparams}{#1}{

  \ifthenelse{\equal{\flashmoviekblank}{\flashmoviezero}}
   {}{\def\flashmovieengine{blank}}

  \ifx\flashmovieengine\flashmovieempty
    \flashmovie@pureswf[#1]{#2}
  \else

    \ifthenelse{\equal{\flashmovieengine}{pure-swf}}
    {\flashmovie@pureswf[#1]{#2}}{}

    \ifthenelse{\equal{\flashmovieengine}{flv-player}}
    {\flashmovie@flvplayer[#1]{#2}}{}

    \ifthenelse{\equal{\flashmovieengine}{acropro}}
    {\flashmovie@acropro[#1]{#2}}{}

    \ifthenelse{\equal{\flashmovieengine}{jw-player}}
    {\flashmovie@jwplayer[#1]{#2}}{}

    \ifthenelse{\equal{\flashmovieengine}{osplayer}}
    {\flashmovie@osplayer[#1]{#2}}{}

    \ifthenelse{\equal{\flashmovieengine}{blank}}
    {\flashmovie@blank[#1]{#2}}{}

  \fi
}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% pure swf

\def\flashmovie@pureswf{\@ifnextchar[\@flashmovie@pureswf{\@flashmovie@pureswf[]}}

\def\@flashmovie@pureswf[#1]#2{\flashmovieparamsclear \setkeys{flashmovieparams}{#1}{
  \newcount\flashmovie@n@config
  \newcount\flashmovie@n@content
  \newcount\flashmovie@n@settings

  \flashmovieembedfile{#2}
  \edef\flashmovie@e@video{\flashmovieembedded}

  \immediate
  \pdfobj
    {<<
      /Instances
        [<<
          /Asset \flashmovie@e@video\space 0 R
          /Params << /Binding /Foreground >>
        >>]
      /Subtype /Flash
    >>}
  \flashmovie@n@config=\pdflastobj

  \immediate
  \pdfobj
    {<<
      /Assets << /Names [(#2) \flashmovie@e@video\space 0 R] >>
      /Configurations [\the\flashmovie@n@config\space 0 R]
    >>}
  \flashmovie@n@content=\pdflastobj

  \immediate
  \pdfobj
    {<<
      /Activation 
        << /Type /RichMediaActivation 
           /Condition /PV
           /Configuration \the\flashmovie@n@config\space 0 R 
           /Animation 
             << /Subtype /Linear 
                /Speed 1 
                /PlayCount 1
             >> 
           /Presentation
             << /PassContextClick false
                /Style /Embedded 
                /Toolbar false
                /NavigationPane false
                /Transparent true
                /Window 
                  << /Type /RichMediaWindow 
                     /Width  << /Default 100 /Min 100 /Max 100 >> 
                     /Height << /Default 100 /Min 100 /Max 100 >> 
                     /Position 
                       << /Type /RichMediaPosition 
                          /HAlign /Near 
                          /VAlign /Near 
                          /HOffset 0 
                          /VOffset 0 
                       >> 
                  >> 
              >> 
        >> 
      /Deactivation 
        << /Type /RichMediaDeactivation 
           /Condition /PI
        >> 
    >>}
  \flashmovie@n@settings=\pdflastobj

  \sbox{\flashmovie@content} {{\hbox to \flashmoviewidth {\vbox to \flashmovieheight { }}}}

  \settowidth {\flashmovie@width} {\usebox{\flashmovie@content}}
  \settoheight{\flashmovie@height}{\usebox{\flashmovie@content}}
  \usebox{\flashmovie@content}

  \pdfannot width \flashmovie@width height \flashmovie@height depth 0pt {
       /Subtype /RichMedia
       /RichMediaContent  \the\flashmovie@n@content\space 0 R 
       /RichMediaSettings \the\flashmovie@n@settings\space 0 R 
}}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% blank

\def\flashmovie@blank{\@ifnextchar[\@flashmovie@blank{\@flashmovie@blank[]}}

\def\@flashmovie@blank[#1]#2{\flashmovieparamsclear \setkeys{flashmovieparams}{#1}{
  \sbox{\flashmovie@content} {{\hbox to \flashmoviewidth {\vbox to \flashmovieheight { }}}}
  \settowidth {\flashmovie@width} {\usebox{\flashmovie@content}}
  \settoheight{\flashmovie@height}{\usebox{\flashmovie@content}}
  \usebox{\flashmovie@content}
}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% player from adobe acrobat pro

\def\flashmovie@acropro{\@ifnextchar[\@flashmovie@acropro{\@flashmovie@acropro[]}}

\def\@flashmovie@acropro[#1]#2{\flashmovieparamsclear \setkeys{flashmovieparams}{#1}{
  \newcount\flashmovie@n@config
  \newcount\flashmovie@n@content
  \newcount\flashmovie@n@settings

  \flashmovieembedfile{#2}
  \edef\flashmovie@e@video{\flashmovieembedded}

  \flashmovieembedfile{SkinOverPlaySeekStop.swf}
  \edef\flashmovie@e@skin{\flashmovieembedded}

  \flashmovieembedfile{VideoPlayer.swf}
  \edef\flashmovie@e@player{\flashmovieembedded}
  
  \immediate
  \pdfobj
    {<<
      /Instances
        [<<
          /Asset \flashmovie@e@player\space 0 R
          /Params 
            << 
               /Binding /Foreground
               /FlashVars (source=#2&skin=SkinOverPlaySeekStop.swf&skinAutoHide=true&skinBackgroundColor=0x00FF00&skinBackgroundAlpha=0.33&volume=1.00)
            >>
        >>]
      /Subtype /Flash
    >>}
  \flashmovie@n@config=\pdflastobj

  \immediate
  \pdfobj
    {<<
      /Assets << /Names [(#2) \flashmovie@e@video\space 0 R (skinover.swf) \flashmovie@e@skin\space 0 R (VideoPlayer.swf) \flashmovie@e@player\space 0 R] >>
      /Configurations [\the\flashmovie@n@config\space 0 R]
    >>}
  \flashmovie@n@content=\pdflastobj

  \immediate
  \pdfobj
    {<<
      /Activation 
        << /Type /RichMediaActivation 
           /Condition /PV
           /Configuration \the\flashmovie@n@config\space 0 R 
           /Animation 
             << /Subtype /Linear 
                /Speed 1 
                /PlayCount 1 
             >> 
           /Presentation
             << /PassContextClick false
                /Style /Embedded 
                /Toolbar false
                /NavigationPane false
                /Transparent true
                /Window 
                  << /Type /RichMediaWindow 
                     /Width  << /Default 100 /Min 100 /Max 100 >> 
                     /Height << /Default 100 /Min 100 /Max 100 >> 
                     /Position 
                       << /Type /RichMediaPosition 
                          /HAlign /Near 
                          /VAlign /Near 
                          /HOffset 0 
                          /VOffset 0 
                       >> 
                  >> 
              >> 
        >> 
      /Deactivation 
        << /Type /RichMediaDeactivation 
           /Condition /PI
        >> 
    >>}
  \flashmovie@n@settings=\pdflastobj

  \sbox{\flashmovie@content} {{\hbox to \flashmoviewidth {\vbox to \flashmovieheight { }}}}

  \settowidth {\flashmovie@width} {\usebox{\flashmovie@content}}
  \settoheight{\flashmovie@height}{\usebox{\flashmovie@content}}
  \usebox{\flashmovie@content}

  \pdfannot width \flashmovie@width height \flashmovie@height depth 0pt {
       /Subtype /RichMedia
       /RichMediaContent  \the\flashmovie@n@content\space 0 R 
       /RichMediaSettings \the\flashmovie@n@settings\space 0 R 
}}}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% flv-player from http://flv-player.net/players/maxi

\def\flashmovie@flvplayer{\@ifnextchar[\@flashmovie@flvplayer{\@flashmovie@flvplayer[]}}

\def\@flashmovie@flvplayer[#1]#2{\flashmovieparamsclear \setkeys{flashmovieparams}{#1}{
  \newcount\flashmovie@n@config
  \newcount\flashmovie@n@content
  \newcount\flashmovie@n@settings

  \flashmovieembedfile{#2}
  \edef\flashmovie@e@video{\flashmovieembedded}

  \flashmovieembedfile{player_flv_maxi.swf}
  \edef\flashmovie@e@player{\flashmovieembedded}

  % startimage is initialized here
  \ifx\flashmovieimage\flashmovieempty
    \def\flashmovieimagevari{}
    \def\flashmovieimagevarii{}
  \else
    \flashmovieembedfile{\flashmovieimage}
    \edef\flashmovie@e@image{\flashmovieembedded}
    \def\flashmovieimagevari{&startimage=\flashmovieimage}
    \def\flashmovieimagevarii{(\flashmovieimage) \flashmovie@e@image\space 0 R}
  \fi

  % autoplay is initialized here
  \ifx\flashmovieauto\flashmoviezero
    \def\flashmovieautovari{}
  \else
    \def\flashmovieautovari{&autoplay=1}
  \fi

  % looping is initialized here
  \ifx\flashmovieloop\flashmoviezero
    \def\flashmovieloopvari{&loop=0}
  \else
    \def\flashmovieloopvari{&loop=1}
  \fi

  \immediate
  \pdfobj
    {<<
      /Instances
        [<<
          /Asset \flashmovie@e@player\space 0 R
          /Params 
            << 
               /Binding /Foreground
               /FlashVars (flv=#2&margin=0&showvolume=1&showstop=1&showtime=1&videobgcolor=0xFFFFFF\flashmovieautovari\flashmovieimagevari\flashmovieloopvari)
            >>
        >>]
      /Subtype /Flash
    >>}
  \flashmovie@n@config=\pdflastobj

  \immediate
  \pdfobj
    {<<
      /Assets << /Names 
       [(#2) \flashmovie@e@video\space 0 R (player_flv_maxi.swf) \flashmovie@e@player\space 0 R \flashmovieimagevarii] >>
      /Configurations [\the\flashmovie@n@config\space 0 R]
    >>}
  \flashmovie@n@content=\pdflastobj

  \immediate
  \pdfobj
    {<<
      /Activation 
        << /Type /RichMediaActivation 
           /Condition /PV
           /Configuration \the\flashmovie@n@config\space 0 R 
           /Animation 
             << /Subtype /Linear 
                /Speed 1 
                /PlayCount 1 
             >> 
           /Presentation
             << /PassContextClick false
                /Style /Embedded 
                /Toolbar false
                /NavigationPane false
                /Transparent true
                /Window 
                  << /Type /RichMediaWindow 
                     /Width  << /Default 100 /Min 100 /Max 100 >> 
                     /Height << /Default 100 /Min 100 /Max 100 >> 
                     /Position 
                       << /Type /RichMediaPosition 
                          /HAlign /Near 
                          /VAlign /Near 
                          /HOffset 0 
                          /VOffset 0 
                       >> 
                  >> 
              >> 
        >> 
      /Deactivation 
        << /Type /RichMediaDeactivation 
           /Condition /PI
        >> 
    >>}
  \flashmovie@n@settings=\pdflastobj

  \sbox{\flashmovie@content} {{\hbox to \flashmoviewidth {\vbox to \flashmovieheight { }}}}

  \settowidth {\flashmovie@width} {\usebox{\flashmovie@content}}
  \settoheight{\flashmovie@height}{\usebox{\flashmovie@content}}
  \usebox{\flashmovie@content}

  \pdfannot width \flashmovie@width height \flashmovie@height depth 0pt {
       /Subtype /RichMedia
       /RichMediaContent  \the\flashmovie@n@content\space 0 R 
       /RichMediaSettings \the\flashmovie@n@settings\space 0 R }
}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% JW Player from http://www.longtailvideo.com/players/jw-flv-player/

\def\flashmovie@jwplayer{\@ifnextchar[\@flashmovie@jwplayer{\@flashmovie@jwplayer[]}}

\def\@flashmovie@jwplayer[#1]#2{\flashmovieparamsclear \setkeys{flashmovieparams}{#1}{
  \newcount\flashmovie@n@config
  \newcount\flashmovie@n@content
  \newcount\flashmovie@n@settings

  \flashmovieembedfile{#2}
  \edef\flashmovie@e@video{\flashmovieembedded}

  \flashmovieembedfile{player.swf}
  \edef\flashmovie@e@player{\flashmovieembedded}

  % startimage is initialized here
  \ifx\flashmovieimage\flashmovieempty
    \def\flashmovieimagevari{}
    \def\flashmovieimagevarii{}
  \else
    \flashmovieembedfile{\flashmovieimage}
    \edef\flashmovie@e@image{\flashmovieembedded}
    \def\flashmovieimagevari{&image=\flashmovieimage}
    \def\flashmovieimagevarii{(\flashmovieimage) \flashmovie@e@image\space 0 R}
  \fi

  % autoplay is initialized here
  \ifx\flashmovieauto\flashmoviezero
    \def\flashmovieautovari{}
  \else
    \def\flashmovieautovari{&autostart=true}
  \fi

  % controlbar is initialized here
  \ifx\flashmoviecontrolbar\flashmoviezero
    \def\flashmoviecontrolbarvari{&controlbar=none}
  \else
    \def\flashmoviecontrolbarvari{}
  \fi

  % looping is initialized here
  \ifx\flashmovieloop\flashmoviezero
    \def\flashmovieloopvari{}
  \else
    \def\flashmovieloopvari{&repeat=always}
  \fi

  \immediate
  \pdfobj
    {<<
      /Instances
        [<<
          /Asset \flashmovie@e@player\space 0 R
          /Params 
            << 
               /Binding /Foreground
               /FlashVars (file=#2\flashmovieimagevari\flashmovieautovari\flashmoviecontrolbarvari\flashmovieloopvari)
            >>
        >>]
      /Subtype /Flash
    >>}
  \flashmovie@n@config=\pdflastobj

  \immediate
  \pdfobj
    {<<
      /Assets << /Names 
       [(#2) \flashmovie@e@video\space 0 R (player.swf) \flashmovie@e@player\space 0 R \flashmovieimagevarii] >>
      /Configurations [\the\flashmovie@n@config\space 0 R]
    >>}
  \flashmovie@n@content=\pdflastobj

  \immediate
  \pdfobj
    {<<
      /Activation 
        << /Type /RichMediaActivation 
           /Condition /PV
           /Configuration \the\flashmovie@n@config\space 0 R 
           /Animation 
             << /Subtype /Linear 
                /Speed 1 
                /PlayCount 1 
             >> 
           /Presentation
             << /PassContextClick false
                /Style /Embedded 
                /Toolbar false
                /NavigationPane false
                /Transparent true
                /Window 
                  << /Type /RichMediaWindow 
                     /Width  << /Default 100 /Min 100 /Max 100 >> 
                     /Height << /Default 100 /Min 100 /Max 100 >> 
                     /Position 
                       << /Type /RichMediaPosition 
                          /HAlign /Near 
                          /VAlign /Near 
                          /HOffset 0 
                          /VOffset 0 
                       >> 
                  >> 
              >> 
        >> 
      /Deactivation 
        << /Type /RichMediaDeactivation 
           /Condition /PI
        >> 
    >>}
  \flashmovie@n@settings=\pdflastobj

  \sbox{\flashmovie@content} {{\hbox to \flashmoviewidth {\vbox to \flashmovieheight { }}}}

  \settowidth {\flashmovie@width} {\usebox{\flashmovie@content}}
  \settoheight{\flashmovie@height}{\usebox{\flashmovie@content}}
  \usebox{\flashmovie@content}

  \pdfannot width \flashmovie@width height \flashmovie@height depth 0pt {
       /Subtype /RichMedia
       /RichMediaContent  \the\flashmovie@n@content\space 0 R 
       /RichMediaSettings \the\flashmovie@n@settings\space 0 R }
}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% OSFlvPlayer from http://www.osflv.com

\def\flashmovie@osplayer{\@ifnextchar[\@flashmovie@osplayer{\@flashmovie@osplayer[]}}

\def\@flashmovie@osplayer[#1]#2{\flashmovieparamsclear \setkeys{flashmovieparams}{#1}{
  \newcount\flashmovie@n@config
  \newcount\flashmovie@n@content
  \newcount\flashmovie@n@settings

  \flashmovieembedfile{#2}
  \edef\flashmovie@e@video{\flashmovieembedded}

  \flashmovieembedfile{OSplayer.swf}
  \edef\flashmovie@e@player{\flashmovieembedded}

  \immediate
  \pdfobj
    {<<
      /Instances
        [<<
          /Asset \flashmovie@e@player\space 0 R
          /Params 
            << 
               /Binding /Foreground
               /FlashVars (movie=#2)
            >>
        >>]
      /Subtype /Flash
    >>}
  \flashmovie@n@config=\pdflastobj

  \immediate
  \pdfobj
    {<<
      /Assets << /Names 
       [(#2) \flashmovie@e@video\space 0 R (OSplayer.swf) \flashmovie@e@player\space 0 R] >>
      /Configurations [\the\flashmovie@n@config\space 0 R]
    >>}
  \flashmovie@n@content=\pdflastobj

  \immediate
  \pdfobj
    {<<
      /Activation 
        << /Type /RichMediaActivation 
           /Condition /PV
           /Configuration \the\flashmovie@n@config\space 0 R 
           /Animation 
             << /Subtype /Linear 
                /Speed 1 
                /PlayCount 1 
             >> 
           /Presentation
             << /PassContextClick false
                /Style /Embedded 
                /Toolbar false
                /NavigationPane false
                /Transparent true
                /Window 
                  << /Type /RichMediaWindow 
                     /Width  << /Default 100 /Min 100 /Max 100 >> 
                     /Height << /Default 100 /Min 100 /Max 100 >> 
                     /Position 
                       << /Type /RichMediaPosition 
                          /HAlign /Near 
                          /VAlign /Near 
                          /HOffset 0 
                          /VOffset 0 
                       >> 
                  >> 
              >> 
        >> 
      /Deactivation 
        << /Type /RichMediaDeactivation 
           /Condition /PI
        >> 
    >>}
  \flashmovie@n@settings=\pdflastobj

  \sbox{\flashmovie@content} {{\hbox to \flashmoviewidth {\vbox to \flashmovieheight { }}}}

  \settowidth {\flashmovie@width} {\usebox{\flashmovie@content}}
  \settoheight{\flashmovie@height}{\usebox{\flashmovie@content}}
  \usebox{\flashmovie@content}

  \pdfannot width \flashmovie@width height \flashmovie@height depth 0pt {
       /Subtype /RichMedia
       /RichMediaContent  \the\flashmovie@n@content\space 0 R 
       /RichMediaSettings \the\flashmovie@n@settings\space 0 R }
}}

