FM2 Movie file format

FM2 is the movie capture format of FCEUX

FM2 file format description

FCEUX uses a new movie file format - .fm2

This differs from the previous FCE Ultra movie format (.fcm) in the following ways:

  • It is completely text based; allowing easy movie editing/splicing
  • An imbedded GUID so FCEUX can tell if a savestate belongs to a particular movie file
  • Movies recorded from Start (Power-on) no longer have a redundant savestate
  • Contains mouse input for recording the Zapper and Arkanoid Paddle input
  • Format

    FM2 is ASCII plain text. It consists of several key-value pairs followed by an inputlog section.

    The inputlog section can be identified by its starting with a | (pipe). The inputlog section terminates at eof. Newlines may be \r\n or \n

    Key-value pairs consist of a key identifier, followed by a space separator, followed by the value text. Value text is always terminated by a newline, which the value text will not include. The value text is parsed differently depending on the type of the key. The key-value pairs may be in any order, except that the first key must be version.

    Integer keys (also used for Booleans, with a 1 or 0) will have a value that is a simple integer not to exceed 32bits

  • version (required) - the version of the movie file format; for now it is always 3
  • emuVersion (required) - the version of the emulator used to produce the movie
  • rerecordCount (optional) - the rerecord count
  • palFlag (bool) (optional) - true if the movie uses pal timing
  • fourscore (bool) (*note C) - true if a fourscore was used
  • port0, port1 (*note C) - indicates the types of input devices. Supported values are:
      SI_GAMEPAD = 1
      SI_ZAPPER = 2
  • port2 (required) - indicates the type of the FCExp port device which was attached. Supported values are:
      SIFC_NONE = 0
  • Header

    String keys have values that consist of the remainder of the key-value pair line. As a consequence, string values cannot contain newlines.

  • romFilename (required) - the name of the file used to record the movie
  • comment (optional) - simply a memo.
  • by convention, the first token in the comment value is the subject of the comment.
  • by convention, subsequent comments with the same subject will have their ordering preserved and may be used to approximate multiline comments.
  • by convention, the author of the movie should be stored in comment(s) with a subject of: author
  • subtitle (optional) - a message that will be displayed on screen when movie is played back (unless Subtitles are turned off, see Movie options).
  • by convention, subtitles will begin with the word subtitle
  • by convention, an integer value will proceed which will indicate the frame that the subtitle will be displayed
  • by convention, a string of text will follow which will be the string displayed
  • example:
  • subtitle 1000 Level Two
  • At frame 1000 the words "Level Two" will be displayed on the screen
  • Hex string keys (used for binary blobs) will have a value that is like 0x0123456789ABCDEF...

  • romChecksum (required) - the MD5 hash of the ROM which was used to record the movie
  • savestate (optional) - a fcs savestate blob, in case a movie was recorded from savestate
  • GUID keys have a value which is in the standard GUID format: 452DE2C3-EF43-2FA9-77AC-0677FC51543B

  • GUID (required) a unique identifier for a movie, generated when the movie is created, which is used when loading a savestate to make sure it belongs to the current movie.
  • Inputlog

    The inputlog section consists of lines beginning and ending with a | (pipe). The fields are as follows, except as noted in note C.

    c port0 port1 port2

    Field c is a variable length decimal integer which is a bitfield corresponding to miscellaneous input states which are valid at the start of the frame. Current values for this are

  • MOVIECMD_RESET = 1
  • The format of port0, port1, port2 depends on which types of devices were attached.

    SI_GAMEPAD

  • the field consists of eight characters which constitute a bitfield.
  • any character other than ' ' or '.' means that the button was pressed. By convention, the following mnemonics will be used in a column to remind us of which button corresponds to which column:
  • RLDUTSBA (Right,Left,Down,Up,sTart,Select,B,A)
  • SI_ZAPPER

  • XXX YYY B Q Z
  • XXX: %03d, the x position of the mouse
  • YYY: %03d, the y position of the mouse
  • B: %1d, 1 if the mouse button is pressed; 0 if not
  • Q: %1d, an internal value used by the emulator's zapper code (this is most unfortunate..)
  • Z: %d, a variable-length decimal integer; an internal value used by the emulator's zapper code (this is even more unfortunate..)
  • SIFC_NONE

  • this field must always be empty
  • Notes

    There is no key-value pair that indicates the length of the movie. This must be read by scanning the inputlog and counting the number of lines.

    All movies start from power-on, unless a savestate key-value is present

    If a fourscore is used, then port0 and port1 are irrelevant and ignored

    If fourscore, the input types must all be gamepads

    {player1 player2 player3 player4}
    c ABSTUDLR ABSTUDLR ABSTUDLR ABSTUDLR port2

    If fourscore is not used, then port0 and port1 are required

    Emulator framerate constants

    FCEUX uses these framerate constants:

  • NTSC: 1008307711 /256/65536 = 60.099822938442230224609375
  • PAL : 838977920 /256/65536 = 50.00698089599609375