home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 7 / AU_CD7.iso / _movies / _armovie / documents / codecif < prev    next >
Text File  |  1996-07-17  |  33KB  |  688 lines

  1.             The video codec interfaces for Acorn Replay
  2.             ===========================================
  3.  
  4. Introduction
  5. ------------
  6.  
  7. The Replay "ARMovie" format allows for different sound and video compression
  8. formats. Interfaces inside the ARMovie Player program ("!ARMovie.Player") allow
  9. introduction of new video decompression code, an appropriate compression
  10. program and allow other programs to use the ARMovie video decompressors. Sound
  11. format 2 provides similar independence for sound compression methods: the
  12. format directly names the sound decompression code which will be used -
  13. provided this is located in <ARMovie$SoundDir> (see ToUseSound for more
  14. details).
  15.  
  16. There are two ways to introduce new video compression formats: total
  17. replacement of the Player program (provide a !ARMovie.Decomp<N>.!RunImage for a
  18. new compression type <N> which implements the entire ProgIf command interface)
  19. or provide a decompressor which uses the Player interface (provide a
  20. !ARMovie.Decomp<N>.Decompress file). A batch compression interface is defined
  21. for compression programs which are named !ARMovie.Decomp<N>.BatchComp and will
  22. be called automatically by !AREncode (and, presumably, other utilities). Named
  23. video decompressors are stored under !ARMovie.Decomp15.<name> - see AE7Doc.
  24.  
  25. Total replacement decompression interface
  26. =========================================
  27.  
  28. When a Replay ARMovie file is to be played, the resource !ARMovie.Player gets
  29. called with a command string by the operating system. Player would normally use
  30. the software decompression interface and paint the movie on the screen itself,
  31. but it can also relinquish the entire task (e.g. for a format which is
  32. decompressed by hardware and video overlayed onto the screen) if that is
  33. required. After a minimal check that the ARMovie file is valid, !ARMovie.Player
  34. reads the video format number and checks the appropriate Decomp directory for
  35. the existence of a '!RunImage' file. If this exists, Player will run it with
  36. the ARMovie file and other arguments (many of them are in ARMovie$ExtraArgs)
  37. which were passed to Player.
  38.  
  39. The replacement routine should obey as much of the command set of Player as
  40. possible (though -shape may be asking too much in the above example!). The
  41. replacement program is free to get its data from anywhere, but it is
  42. recommended that ARMovie files are present with standard headers in order that
  43. general multimedia programs will see something they understand.
  44.  
  45. Video decompression interface
  46. =============================
  47.  
  48. The total replacement of !ARMovie.Player is a very large task; it is much
  49. easier to provide a new video decompressor only and rely on the !ARMovie.Player
  50. program doing the rest of the work. Acorn currently provide 10 video
  51. decompressors using this interface and many of them are provided with source.
  52.  
  53. Using this interface means keeping most of the architecture of the Player
  54. system:
  55.  
  56. - EITHER decompressor called from IRQ mode; should run with interrupts (mostly)
  57.   enabled OR decompressor called in SWI mode with interrupts enabled (allows
  58.   r14/C to be used)
  59. - flags between disc loader and decompressor
  60. - flags between decompressor and screen painter
  61. - decompressor provides the colour looked up output
  62.  
  63. File IO needs to be performed either using the AE7 format or calling a Fetcher.
  64. Details of using the sound system are in 'ToUseSound': either the current Acorn
  65. Replay sound code can be used or new sound formats added by sound code
  66. implementing the current interface (described from the point of view of the
  67. client in ToUseSound) can be added using format 2 to name the sound code. No
  68. changes to Player programs is required.
  69.  
  70. In order to start some of the decompressors (MovingLines, for example) at any
  71. position, the use of key frames is possible. The compressor stores the state of
  72. the stream at the start of each chunk, uncompressed, in the key frame data
  73. structure. The Player program will load the uncompressed file from the data
  74. structure in order to start decompression at an arbitrary point, providing the
  75. 'previous frame' state (see below). Decompressors which can start at the
  76. beginning of any chunk use an ARMovie file without the key frame data structure
  77. (by giving a -1 offset to the keys in the header).
  78.  
  79. The decompressor is called from IRQ mode or SWI mode with interrupts enabled in
  80. order to decompress the next frame: see below for the two variants of this.
  81. Code in the Player handles semaphores between decompression and painting frames
  82. and between loading the video chunks and decompressing frames. Other code in
  83. the Player takes data from the decompressed frames buffer and paints it onto
  84. the screen (with interrupts enabled also) and code waits for compressed data
  85. buffers to be empty and refills them from the filing system (in User mode as
  86. the foreground task). To allow these other tasks to run, the decompress code
  87. must leave interrupts enabled for as much time as possible (the MovingLines
  88. decompressor leaves interrupts enabled for all of its work). In any case IRQ
  89. must not be disabled for longer than 1 full sound buffer: about 2mS.
  90.  
  91. Decompressors can either handle mapping colours to the screen or can rely on
  92. the screen painting algorithms to do it. The former case is particularly useful
  93. if the decompressor can avoid mapping the colours of all pixels on each frame
  94. (e.g. by copying pixels from the previous frames which are already colour
  95. mapped or using already colour mapped data). The latter case is most useful
  96. when all pixels in each frame would be colour mapped or when the packed
  97. representation of the pixels is smaller than the colour mapped form (e.g.
  98. decompress to 16 bit values which the paint colour mapping code expands to 32
  99. bit ones). Its also easier to write a non-colour mapping decompressor in C and
  100. rely on Player to do the colour mapping at paint time.
  101.  
  102. The disc loader works in a double buffered manner: two buffers each containing
  103. either one or two chunks of data (2 or 4 seconds per buffer conventionally).
  104. The addresses of the two buffers and one or two chunks per buffer are all
  105. chosen dynamically and the Player program knows from the ARMovie header how
  106. many times to call the decompression code. The two buffers will always start on
  107. word addresses.
  108.  
  109. Using the interface play with existing Decompress code
  110. ------------------------------------------------------
  111.  
  112. As well as being able to provide new compression formats by using the Player/
  113. Decompress interface, other programs can also use the Decompress code, in
  114. effect pretending to be the Player program as far as the Decompress code is
  115. concerned. This greatly extends the capability of the Replay system: programs
  116. could be written to play ARMovie files (or other formats via Fetchers) in the
  117. desktop while multitasking (obviously non-real time). Or sections of an ARMovie
  118. file could be decompressed to memory and edited. Or... The ability to patch the
  119. Decompress code allows player programs to load two copies of a Decompress code:
  120. patch one to generate data for one format and patch the other to generate data
  121. for a different format (e.g. non-dithered for the screen).
  122.  
  123. Such a playing program has to do all the tasks normally done by the
  124. !ARMovie.Player program:
  125.  
  126. - read the file header to discover the data
  127. - establish the colour lookup table for the screen if needed
  128.   (usually by calling Player with -claimtable!)
  129. - load the right decompress code, patch and initialise it
  130. - load the key frame if required
  131. - load the chunks from the file (or use Fetchers)
  132. - call the decompress entry point for each frame in the block
  133.  
  134. but it need do no more than this. It can structure its data structures as it
  135. wishes.
  136.  
  137. The Acorn provided BatchComp programs use ARMovie files as input and use the
  138. Decompress code in order to convert the data into a form they understand
  139. (indeed, they will use Decompress code even if the !RunImage total takeover
  140. exists) and thus get total isolation from the video compression method of the
  141. input ARMovie file.
  142.  
  143. Decompress "Info" file
  144. ----------------------
  145.  
  146. In order that Decompress code providers can incorporate their own names for
  147. formats, provide format origination text, provide compress and edit routines
  148. with hints on various formats, an Info file called Decomp<N>.Info can be
  149. provided (the !ARMovie.Player does not need this file unless the C calling
  150. process is to be used). It contains the following information:
  151.  
  152. Name of format
  153. Originator
  154. number of bits per pixel (or empty if this is variable), calling sequence
  155. desired x multiple; minimum x size; maximum x size
  156. desired y multiple; minimum y size; maximum y size
  157. temporal (or empty if temporal information is not required)
  158. list of colour spaces which can be held in the format
  159.  
  160. For example:
  161.  
  162. Moving Lines
  163. © Acorn Computers 1993
  164.  
  165. 1;1;1280
  166. 1;1;1024
  167. Temporal
  168. YUV 5,5,5; RGB 5,5,5
  169.  
  170. The colour space information allows programs like !AREncode to present the
  171. user with valid options.
  172.  
  173. There are two possible calling sequences that can be used to call a
  174. decompressor: a high speed one run entirely in IRQ mode, and a more C friendly
  175. one which runs in SWI mode - allowing R14 to be used. This latter calling
  176. sequence will only be used if the number of bits per pixel line ends with C.
  177.  
  178. It is usual to provide particular sets of decompression routines depending on
  179. the source bits per pixel. It is helpful to always provide a Decompress file,
  180. even if it isn't the most efficient way of doing something, since that provides
  181. a uniform access method to all files.
  182.  
  183. For movies sourced at 8 bits per pixel (or less), Dec8 should be provided.
  184. Player will exclusively use Dec8 (if it is provided) since it is advantageous
  185. to have decompressed pixels being bytes and the cost of colour mapping is quite
  186. low since the entire colour map table can live in the CPUs cache.
  187.  
  188. For movies sourced at 16 bits per pixel, there are two basic choices. If the
  189. format handles colour mapping efficiently, then provide DecompresB, DecompresH
  190. and Decompress (there's only a small advantage to DecompresB). If the format
  191. doesn't handle colour mapping efficiently, then provide Dec16 only (and
  192. Decompress, though Player can survive without it). It may be be worth providing
  193. Dec24 and Dec21 routines if there are colour accuracy problems in 24bpp modes
  194. or if there is a way to colour convert to these formats quickly. If you expect
  195. a lot of work in 8bpp -small, then also provide DecompresB.
  196.  
  197. For movies sourced at more than 16 bits per pixel, provide Decompress,
  198. DecompresH, Dec24 and Dec21 routines.
  199.  
  200. Formal interface: "Decompress" file (any file type can be used)
  201. ---------------------------------------------------------------
  202.  
  203. The Player program loads the decompress code at a quad word aligned address in
  204. memory. It then processes the patch table and then calls the init point. Later
  205. on the player calls the decompressor in USR mode to decompress the first
  206. chunk's worth of frames (or to do -explode). For a full play, the player will
  207. call the decompressor from IRQ mode, either quickly and directly, or by first
  208. swapping to SWI mode (for the C call sequence). In both cases interrupts will
  209. be enabled.
  210.  
  211. First word: patch table offset
  212. (32 bit word at byte offset 0)
  213.  
  214.  Purpose: to allow the player to insert pixel colour lookup in the
  215.           decompressor. May in future allow other values to patched.
  216.           Note that an unpatched decompressor should still work!!
  217.  
  218.  The offset table consists of words. Each word has the bottom 16 bits as the
  219.  byte offset of a word (usually an instruction) from the start of the
  220.  decompressor. The top 4 bits are an opcode number. The remaining 12
  221.  bits may have a meaning for that opcode. The list is terminated by a
  222.  word of -1.
  223.  
  224.  Opcode 0: patch in colour lookup
  225.   bits 27..24: destination register
  226.   bits 23..20: source register
  227.   bits 19..17: pixel lookup table register
  228.  The Player alters the word to lookup the pixel colour. The value of
  229.  the source register and the size of the result in the destination
  230.  register may change for different decompressors. For MovingLines the
  231.  source register value is either RGB or YUV 15 bits and the destination
  232.  value is always a word value. An unpatched MovingLines decompressor
  233.  produces RGB or YUV output. Other colour spaces may be in use - see the
  234.  ColourIF file.
  235.  
  236. Second word: init entry point
  237. (byte offset 4)
  238.  
  239.  Purpose: to allow the decompressor to initialise any tables or other
  240.           values that are needed. These will be inside the Decompress
  241.           code space or allocated by the init routine.
  242.              To aid the Decompress code in allocating memory, some
  243.           parameters from the file can be passed to it.
  244.  
  245.  On entry:
  246.    r0 - source x size of movie
  247.    r1 - source y size of movie
  248.    r2 - "PARM" (note - if r2 is not "PARM" then (a) there is no
  249.         parameter list and (b) the finalisation call will not happen)
  250.    r3 - points to parameter list in memory:
  251.         zeroth word: number of parameters
  252.         subsequent words: word type: 0 for integer, 1 for string
  253.                           aligned word for an integer entry
  254.                           or a zero terminated string
  255.         e.g. 0: 2
  256.              4: 0
  257.              8: 42
  258.             12: 1
  259.             16: 'Hell'
  260.             20: 'o' 0,0,0
  261.    r4..r12 - undefined: scratch
  262.    r13 - stack
  263.    r14 - return address
  264.    processor mode: USR
  265.  On exit
  266.    r0-r12 may be corrupted
  267.    r13 - same as on entry
  268.    flags - V set signals error: r0 points to an error block
  269.  
  270.  Purpose: tidy close down. The playing program will call this routine
  271.           after playing is over.
  272.  
  273.  On entry:
  274.    r0 - source x size of movie
  275.    r1 - source y size of movie
  276.    r2 - "SHUT"
  277.    r4..r12 - undefined: scratch
  278.    r13 - stack
  279.    r14 - return address
  280.    processor mode: USR
  281.  On exit
  282.    r0-r12 may be corrupted
  283.    r13 - same as on entry
  284.    flags - V set signals error: r0 points to an error block
  285.  
  286. Third word: decompress entry point
  287.  
  288.  Purpose: decompress precisely one frame
  289.  
  290.  On entry:
  291.    r0 to r4 are set up by Player as follows:
  292.    r0 - source byte pointer
  293.    r1 - output pointer - save output pixels here (word aligned)
  294.    r2 - previous output pointer (allows copying from previous frame)
  295.    r3 - pixel dither lookup table
  296.    r4 - return address (default call sequence)
  297.    r5..r12 - scratch
  298.    r13 - small stack (RISC OS irq stack)
  299.    r14 - return address (for C calling sequence only)
  300.    processor mode: IRQ, interrupts ENABLED (usually) (default call sequence)
  301.    processor mode: SWI, interrupts ENABLED (usually) (for C calling sequence)
  302.    flags - irrelevant
  303.  OR  processor mode: USR in which case an error may be raised
  304.  On exit
  305.    r0 - next value of source byte pointer
  306.    r1..r12 - irrelevant
  307.    r13 - must be same value as on entry
  308.    r14 - irrelevant
  309.    processor mode: IRQ, interrupts ENABLED
  310.    flags - irrelevant
  311.  
  312.  Decompressed pixels are stored as Words!!! For the MovingLines decompressor
  313.  to work, the source pointer (r0) must be half word aligned.
  314.  
  315. Note that when using the C calling sequence, all calls map onto C function
  316. calls with 3 or 4 arguments passed in registers.
  317.  
  318. The 'DecompresH' file
  319. ---------------------
  320.  
  321. This has exactly the same interface as the Decompress file, but stores output
  322. pixels as half words. This allows the Player program to use less store (and run
  323. slightly faster) in some screen modes (in particular, mode 15).
  324.  
  325. Programs which use the decompression programs must not assume the existence of
  326. 'DecompresH' forms of decompressors and must be capable of using the
  327. 'Decompress' file instead. For some compression formats, the gain in the Player
  328. of using the half word output may be completely lost by inefficiency in the
  329. decompressor.
  330.  
  331. Note that a DecompresH writer cannot trust the values returned from the pixel
  332. dither lookup table to have the top 16 bits cleared.
  333.  
  334. The 'DecompresB' file
  335. ---------------------
  336.  
  337. This has exactly the same interface as the Decompress file, but stores output
  338. pixels as bytes. It uses less store (and runs faster) in any screen modes mode
  339. where the number of bits to describe a pixel is 8 or less (e.g. an 8bpp mode
  340. with magx=1, magy=1).
  341.  
  342. Programs which use the decompression programs must not assume the existence of
  343. 'DecompresB' forms of decompressors and must be capable of using the
  344. 'Decompress' file instead.
  345.  
  346. The 'Dec16' file
  347. ----------------
  348.  
  349. This has exactly the same interface as the Decompress file, but stores output
  350. pixels as half words *with no colour transformation done on them*. Naturally
  351. this is only possible for situations where the source bits per pixels is <=16.
  352. This allows the Player program to use less store (and run slightly faster) in
  353. most screen modes (in particular, interpolating ones). The patch table should
  354. just contain a -1.
  355.  
  356. Programs which use the decompression programs must not assume the existence of
  357. 'Dec16' forms of decompressors and must be capable of using the 'Decompress'
  358. file instead.
  359.  
  360. The 'Dec8' file
  361. ---------------
  362.  
  363. This has exactly the same interface as the Decompress file, but stores output
  364. pixels as bytes *with no colour transformation done on them*. Naturally this is
  365. only possible for situations where the source bits per pixels is <=8. This
  366. allows the Player program to use less store (and run slightly faster) in all
  367. screen modes. The patch table should just contain a -1.
  368.  
  369. Programs which use the decompression programs must not assume the existence of
  370. 'Dec8' forms of decompressors and must be capable of using the 'Decompress'
  371. file instead.
  372.  
  373. The 'Dec24' file
  374. ----------------
  375.  
  376. The 16 bit per pixel format allows fast colour lookup, but may not allow an
  377. accurate representation of a colour. The 'Dec24' file has an identical
  378. structure to the 'Decompress' file, but writes output colours as 24bpp values
  379. (in words) in the original colour space (i.e. the colour space conversion by
  380. table does not exist). Note that it is perfectly possible to have a file with
  381. 24bpp values used in the video stream where the original ARMovie file header
  382. still claims 16bpp, provided a 'Decompress' file is also present (for example,
  383. see Decomp8). The values are written:
  384.  
  385.                  00000000 BBBBBBBB GGGGGGGG RRRRRRRR
  386.                           76543210 76543210 76543210
  387.  
  388. where R, G and B are the names of each of the colour components (and only
  389. equate to displayed RGB in the case where the colour space is RGB).
  390.  
  391. The 'Dec21' file
  392. ----------------
  393.  
  394. The 'Dec21' file has an identical structure to the 'Dec24' file, but writes
  395. output colours as 21bpp values (in words) in the original colour space (i.e.
  396. the colour space conversion by table does not exist) such that interpolation
  397. can be quickly performed. Note that it is perfectly possible to have a file
  398. with 21bpp values used in the video stream where the original ARMovie file
  399. header still claims 16bpp, provided a 'Decompress' file is also present (for
  400. example, see Decomp8). The values are written:
  401.  
  402.                  00000000 BBBBBBB0 GGGGGGG0 RRRRRRR0
  403.                           7654321  7654321  7654321 
  404.  
  405. where R, G and B are the names of each of the colour components (and only
  406. equate to displayed RGB in the case where the colour space is RGB).
  407.  
  408. The 'Dec24xxxxx' and 'Dec21xxxxx' files
  409. ---------------------------------------
  410.  
  411. These files have the same interfaces as 'Dec24' and 'Dec21', but write their
  412. output in the 24bpp RGB colour space. An up to five character suffix represents
  413. which colour space the source comes from - e.g. 'Dec24YUV' or 'Dec24YIQ' - and
  414. this suffix should also be present in the ARMovie header at the end of the bits
  415. per pixel line. Note that no suffix is possible, defaulting back to 'Dec24'
  416. which provides no colour space translation (and so had better imply an RGB
  417. colour space source!).
  418.  
  419. NOTE: Dec24xxx writers - the target colour space is 8 bit R G B with each value
  420. in the range 0..255 (off..on), assumed gamma corrected (i.e. they will be
  421. presented directly to DACs and then to the CRT with no extra
  422. correction/changes). Player will use Dec24 or Dec21 when output is to be in
  423. 24bpp modes, and use Decompress or DecompresH otherwise.
  424.  
  425. The Batch Compression interface
  426. ===============================
  427.  
  428. A program 'BatchComp' can be provided in the Decomp<N> directory. The program
  429. should obey the compression parameters given below and take an ARMovie file as
  430. source (for example, by using the Decompress interface) and compress it to
  431. produce some of the basic building blocks of an ARMovie file which will later
  432. be turned into a final ARMovie file using 'Join' [aside: the mechanics of
  433. produce a multitrack ARMovie file are sufficiently complex that it is best to
  434. have all the capability in one program]. BatchComp should read a provided
  435. ARMovie Header file in order to work out what to do: it can use the header file
  436. to determine the number of frames per second, the number of frames per chunk
  437. and the volume of the sound data per chunk. It is then able to calculate (based
  438. on the supplied latency and bandwidth of the target decompression device) how
  439. many bytes it can allocate to each frame of video data. Larger numbers of
  440. frames per chunk mean more tolerance of device latency, but larger chunks mean
  441. the movie takes more memory to decompress and takes longer to start playing
  442. (since it has to read the first chunk). Headers should be set up for 2 second
  443. chunks by default.
  444.  
  445. CAUTION: BatchComp programs may only manage simple resampling to generate
  446. movies at different frame rates from the source. For example,
  447. MovingLine.BatchComp can make a 12.5 fps movie from a 25 fps source (or a 30
  448. fps one from a 60 fps) but not make 12.5 from 30 (or 60) [and obviously not
  449. make 25 from 12.5...]
  450.  
  451. BatchComp writes video chunks and optionally key frames (key frames permit the
  452. video data to be started from any point in the file, but they take up space,
  453. being uncompressed 16bit per pixel data, so if the file only needs to play from
  454. the start, or the video decompressor does not need key frames they can be
  455. omitted). BatchComp writes all data in the specified destination directory
  456. (which is where the the ARMovie header file is, called "Header") and the video
  457. chunks will be filed separately using the following name for each chunk:
  458.  
  459.  "Images"+STR$(chunk%DIV77)+"."+RIGHT$("0"+STR$(chunk%MOD77),2)
  460.  
  461. If writing key frames they are filed as:
  462.  
  463.  "Keys"+STR$(chunk%DIV77)+"."+RIGHT$("0"+STR$(chunk%MOD77),2)
  464.  
  465. These data files form part of the input data for the 'Join' program which is
  466. used to make an ARMovie file after the compressor has run.
  467.  
  468. BatchComp may write a log of all the work it has done, this is stored as Log in
  469. the destination, and may write similar information to the screen (the Acorn
  470. compressors do). If the BatchComp process is slow (it is for the Acorn software
  471. compressors), then BatchComp should periodically (e.g. 20 minute intervals)
  472. save enough data so that it can continue in case the computer stops
  473. unexpectedly: (Acorn compressors save this is in three files "StoppedD",
  474. "StoppedC" and "StoppedF" in the destination directory - for the correct
  475. working of !AREncode it is recommended that the files begin with "Stopped").
  476.  
  477. Similarly, it is recommended that BatchComp be suspendable such that it can be
  478. restarted. Pressing the space bar should be used as the trigger for this so
  479. that your BatchComp behaves that same as other BatchComps. It is expected that
  480. a similar set of Stopped files be used for restarting BatchComp some time
  481. later.
  482.  
  483. It can be convenient for several collections of header/images/keys to be stored
  484. in the same directory: the compressor parameter -index N allows any number of
  485. collections to be stored with names Header/Images/Keys/Log (default)
  486. 1Header/1Images/1Keys/1Log etc. Stopped files are also prefixed by the index.
  487.  
  488. If a compression program has a BASIC shell (or is written entirely in BASIC)
  489. then there is a common front end library (<ARMovie$Dir>.Tools.CompLib) which
  490. provides much of the mechanics for writing a BatchComp. The Moving Lines and
  491. Moving Blocks compressors use this.
  492.  
  493. The parameters are:
  494.  
  495. -arm2      limit the size of a frame to something that can be decompressed
  496.            by an 8MHz ARM2 machine, if this has any meaning for that
  497.            decompressor.
  498.  
  499. -batch     set batch mode: BatchComp should not attempt to detect the space
  500.            bar being pressed to suspend it. This is to stop command files
  501.            being sucked in a byte at a time each time a detect for space bar
  502.            being pressed was made.
  503.  
  504. -dest b.   set directory for destination (compressed) data: the Header, Images,
  505.            Keys are here. If a full pathname is used for this and the source,
  506.            then the BatchComp program should be able to continue processing
  507.            whatever else is happening (it may be multitasking in a task
  508.            window for example). [aside: if the destination doesn't end in a
  509.            directory separator, then add one!]
  510.  
  511. -dirty     specifies a 'quick and dirty' approach to compression if
  512.            possible. For example, in the MovingLines compressor it tells the
  513.            compressor to use a faster but less accurate method of varying
  514.            the quality to attain the target frame size. Parameter is ignored
  515.            by compressors which can attach no meaning to this hint.
  516.  
  517. -display N causes BatchComp to switch to screen mode N and display the
  518.            images being compressed. Typically the original image would be
  519.            displayed on the bottom right of the screen and the compressed
  520.            image on the bottom left. If the compressed image can't be fitted
  521.            then only the uncompressed image would be displayed. N may be a
  522.            RISC OS 3.5 mode description string. Using this option when
  523.            invoking BatchComp from a TaskWindow is not recommended!
  524.  
  525. -double    assume the decompressor will be using double buffered data
  526.            (default: single) when it plays the movie back: this makes the
  527.            number of bytes available for a frame larger for devices with
  528.            high latency (such as CDROM) and thus improves the quality of the
  529.            movie. The only result of asserting this is to change the text
  530.            printed by the compressor when it calculates the amount of
  531.            memory needed to decompress the movie (which is, of course,
  532.            specific to a codec).
  533.  
  534. -filter    invoke filter or list of filters separated by ';' characters.
  535.            Filters are stored in directory <ARMovie$Dir>.Tools.Filters.
  536.            Filters are applied in the specified order:
  537.  
  538.               -filter TClamp;Median
  539.  
  540.            applies the temporal clamp first, then the spatial median. See
  541.            below for filter machine code interface.
  542.  
  543. -index N   select different Header, Images, Keys, Log combination (default
  544.            is no prefix). Different header files can be used to make
  545.            different movies from the same source - for example with
  546.            different sound tracks or with different frame per second rates.
  547.  
  548. -nokeys    prevents the key frames being written: this results in a smaller
  549.            movie file which can only be started at the beginning (or at
  550.            other "natural" cut points - for example where the movie changes
  551.            from all white to all black). If the key frame data structure was
  552.            written, a movie without keys can still be made if required.
  553.            If keys are not important to the video compression algorithm, then
  554.            this parameter is ignored.
  555.  
  556. -notext    suppresses all textual output
  557.  
  558. -quality N set quality mode and the quality: in the normal mode, BatchComp
  559.            programs adjust the quality to maintain the average frame size at
  560.            the required value. However, this may take time and can produce a
  561.            movie with frames of poor quality. Using -quality will produce a
  562.            movie with a particular quality for all frames, but the frame
  563.            size varies. Quality numbers are higher for poor quality frames,
  564.            lower for frames which are very accurately matched to the source
  565.            frames. Users should make a small test run to find a suitable
  566.            quality value for a particular movie and compression program -
  567.            values for different Decomp<N>.BatchComp for a similar visual
  568.            quality may well be very different (and produce different amounts
  569.            of output). Quality 0 is taken to mean IDENTICAL with the source,
  570.            there is no specified upper limit (users should be referred to
  571.            information on the values for a particular BatchComp).
  572.  
  573. -restart   continue processing using the "Stopped" files. Only -dest,
  574.            -index and -source need be given. It is recommended that the
  575.            StoppedD file be used to store all the other parameters.
  576.            New values for -batch and -display are required.
  577.  
  578. -size N    set frame size to N (may come from a data/latency computation).
  579.            Values in the range 5000 to 10000 are reasonable for playback
  580.            from hard discs.
  581.  
  582. -source f  set name of source file
  583.  
  584. -startat N set initial start point from the source file in centiseconds
  585.            (default zero). (just like -startat when playing a movie).
  586.  
  587. Any not understood parameters should be ignored. Parameter strings may have got
  588. too long for the RISC OS 256 character limit on command strings, so some of the
  589. parameters may be in 'ARMovie$ExtraArgs': if this exists and has a non-zero
  590. length, then it should also be read for input parameters, then set to a null
  591. string. Programmers are encouraged to read the MovingLine.BatchComp source...
  592.  
  593. Note that it is possible to make 'BatchComp' a directory and embed more
  594. resources within it, the entry BatchComp.!Run being used automatically by the
  595. operating system.
  596.  
  597. The calculations to go from bandwidth/latency to frame size are:
  598.  
  599.   size=((chunktime*double-latency)/double*datarate-soundbytes ANDNOT1023)/fpf
  600.  
  601. where the variables are:
  602.  
  603. chunktime: time for a chunk           (e.g. 2 seconds)
  604. double:    1 for single buffer
  605.            2 for double buffer
  606. latency:   latency time               (e.g. 0.4 seconds)
  607. datarate:  data rate for time base    (e.g. 150*1024 bytes per second)
  608. soundbytes:number of bytes of sound data in a chunk
  609. fpf:       frames per chunk
  610.  
  611. The soundbytes value is calculated from reading all the sound track information
  612. in the header. Chunktime and fpf values are also from the header.
  613.  
  614. The program should claim as much application workspace (only) as it requires.
  615.  
  616. ARMovie$CompressionStatus is an OS variable that the compressor writes to as it
  617. exits (for whatever reason). It can take the following values:
  618.  
  619.  - does not exist: no error, job successful
  620.  
  621.  - exists and contains SUSPEND: job suspended, new stopped files written
  622.    for continuation later.
  623.  
  624.  - else: contains textual error (reason why BatchComp stopped). The compression
  625.    job has been aborted 'due to unforeseen circumstances'. If stopped files
  626.    are present it can be continued (the files may be historical!)
  627.  
  628. The value must be read and remembered by the calling program on the exit from
  629. BatchComp - it may be reset by any other compression tasks which are floating
  630. around the machine when the next task swap occurs.
  631.  
  632. Filters
  633. -------
  634.  
  635. Image processing filters can make a big difference to the quality of compressed
  636. scenes. If dithering has been used, however, the filters may dramatically
  637. reduce the colour range. It is also possible to use the filter code in other
  638. programs. The interface is as follows:
  639.  
  640. Callers load the filter code at a quad word aligned address in memory. The init
  641. routine is called. Then the filter routine is called as necessary.
  642.  
  643. First word: init entry point
  644. (byte offset 0)
  645.  
  646.  Purpose: allows filter to initialise any values it needs (these are stored
  647.           inside the filter's code space or allocated by the init routine).
  648.  
  649.  On entry:
  650.    r0 - source x size of movie
  651.    r1 - source y size of movie
  652.    r2 - colour space of movie: 0: RGB 5,5,5
  653.                                1: YUV 5,5,5
  654.                                2: Y 8
  655.                                3: RGB 8,8,8
  656.                                4: YUV 8,8,8
  657.    r3..r12 - undefined: scratch
  658.    r13 - stack
  659.    r14 - return address
  660.    processor mode: USR
  661.  On exit
  662.    r0-r12 - may be corrupted
  663.    r13 - same as on entry
  664.    flags - V set signals error: r0 points to an error block
  665.  
  666. Second word: filter one frame
  667.  
  668.  Purpose: apply the filter and produce one filtered frame
  669.  
  670.  On entry:
  671.    r0 - buffer to be filtered (word aligned)
  672.    r1 - previous output pointer (allows temporal filtering from previous frame)
  673.         (0 if no previous frame available)
  674.    r2 - result pointer - save output pixels here (word aligned)
  675.    r3..r12 - scratch
  676.    r13 - stack
  677.    r14 - return address
  678.    processor mode: USR *or* SWI, interrupts ENABLED (usually)
  679.    flags - irrelevant
  680.  On exit
  681.    r0..r12 - irrelevant
  682.    r13 - must be same value as on entry
  683.    r14 - irrelevant
  684.    processor mode: same as called mode
  685.    flags - irrelevant
  686.  
  687.  Pixels are stored as Words!!! (well, the bottom 15 bits of one, anyway)
  688.