/*
 * DV input/output over IEEE 1394 on OHCI chips
 *   Copyright (C)2001 Daniel Maas <dmaas@dcine.com>
 *     receive, proc_fs by Dan Dennedy <dan@dennedy.org>
 *
 * based on:
 *   video1394.h - driver for OHCI 1394 boards
 *   Copyright (C)1999,2000 Sebastien Rougeaux <sebastien.rougeaux@anu.edu.au>
 *                          Peter Schlaile <udbz@rz.uni-karlsruhe.de>
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef AVDEVICE_DV1394_H
#define AVDEVICE_DV1394_H

#define DV1394_DEFAULT_CHANNEL 63
#define DV1394_DEFAULT_CARD    0
#define DV1394_RING_FRAMES     20

#define DV1394_WIDTH  720
#define DV1394_NTSC_HEIGHT 480
#define DV1394_PAL_HEIGHT 576

/* This is the public user-space interface. Try not to break it. */

#define DV1394_API_VERSION 0x20011127

/* ********************
   **                **
   **   DV1394 API   **
   **                **
   ********************

   There are two methods of operating the DV1394 DV output device.

   1)

   The simplest is an interface based on write(): simply write
   full DV frames of data to the device, and they will be transmitted
   as quickly as possible. The FD may be set for non-blocking I/O,
   in which case you can use select() or poll() to wait for output
   buffer space.

   To set the DV output parameters (e.g. whether you want NTSC or PAL
   video), use the DV1394_INIT ioctl, passing in the parameters you
   want in a struct dv1394_init.

   Example 1:
         To play a raw .DV file:   cat foo.DV > /dev/dv1394
         (cat will use write() internally)

   Example 2:
           static struct dv1394_init init = {
              0x63,        (broadcast channel)
              4,           (four-frame ringbuffer)
              DV1394_NTSC, (send NTSC video)
              0, 0         (default empty packet rate)
           }

           ioctl(fd, DV1394_INIT, &init);

           while(1) {
                  read( <a raw DV file>, buf, DV1394_NTSC_FRAME_SIZE );
                  write( <the dv1394 FD>, buf, DV1394_NTSC_FRAME_SIZE );
           }

   2)

   For more control over buffering, and to avoid unnecessary copies
   of the DV data, you can use the more sophisticated the mmap() interface.
   First, call the DV1394_INIT ioctl to specify your parameters,
   including the number of frames in the ringbuffer. Then, calling mmap()
   on the dv1394 device will give you direct access to the ringbuffer
   from which the DV card reads your frame data.

   The ringbuffer is simply one large, contiguous region of memory
   containing two or more frames of packed DV data. Each frame of DV data
   is 120000 bytes (NTSC) or 144000 bytes (PAL).

   Fill one or more frames in the ringbuffer, then use the DV1394_SUBMIT_FRAMES
   ioctl to begin I/O. You can use either the DV1394_WAIT_FRAMES ioctl
   or select()/poll() to wait until the frames are transmitted. Next, you'll
   need to call the DV1394_GET_STATUS ioctl to determine which ringbuffer
   frames are clear (ready to be filled with new DV data). Finally, use
   DV1394_SUBMIT_FRAMES again to send the new data to the DV output.


   Example: here is what a four-frame ringbuffer might look like
            during DV transmission:


         frame 0   frame 1   frame 2   frame 3

        *--------------------------------------*
        | CLEAR   | DV data | DV data | CLEAR  |
        *--------------------------------------*
                   <ACTIVE>

        transmission goes in this direction --->>>


   The DV hardware is currently transmitting the data in frame 1.
   Once frame 1 is finished, it will automatically transmit frame 2.
   (if frame 2 finishes before frame 3 is submitted, the device
   will continue to transmit frame 2, and will increase the dropped_frames
   counter each time it repeats the transmission).


   If you called DV1394_GET_STATUS at this instant, you would
   receive the following values:

                  n_frames          = 4
                  active_frame      = 1
                  first_clear_frame = 3
                  n_clear_frames    = 2

   At this point, you should write new DV data into frame 3 and optionally
   frame 0. Then call DV1394_SUBMIT_FRAMES to inform the device that
   it may transmit the new frames.

   ERROR HANDLING

   An error (buffer underflow/overflow or a break in the DV stream due
   to a 1394 bus reset) can be detected by checking the dropped_frames
   field of struct dv1394_status (obtained through the
   DV1394_GET_STATUS ioctl).

   The best way to recover from such an error is to re-initialize
   dv1394, either by using the DV1394_INIT ioctl call, or closing the
   file descriptor and opening it again. (note that you must unmap all
   ringbuffer mappings when closing the file descriptor, or else
   dv1394 will still be considered 'in use').

   MAIN LOOP

   For maximum efficiency and robustness against bus errors, you are
   advised to model the main loop of your application after the
   following pseudo-code example:

   (checks of system call return values omitted for brevity; always
   check return values in your code!)

   while( frames left ) {

    struct pollfd *pfd = ...;

    pfd->fd = dv1394_fd;
    pfd->revents = 0;
    pfd->events = POLLOUT | POLLIN; (OUT for transmit, IN for receive)

    (add other sources of I/O here)

    poll(pfd, 1, -1); (or select(); add a timeout if you want)

    if(pfd->revents) {
         struct dv1394_status status;

         ioctl(dv1394_fd, DV1394_GET_STATUS, &status);

         if(status.dropped_frames > 0) {
              reset_dv1394();
         } else {
              int i;
              for(i = 0; i < status.n_clear_frames; i++) {
                  copy_DV_frame();
              }
         }
    }
   }

   where copy_DV_frame() reads or writes on the dv1394 file descriptor
   (read/write mode) or copies data to/from the mmap ringbuffer and
   then calls ioctl(DV1394_SUBMIT_FRAMES) to notify dv1394 that new
   frames are availble (mmap mode).

   reset_dv1394() is called in the event of a buffer
   underflow/overflow or a halt in the DV stream (e.g. due to a 1394
   bus reset). To guarantee recovery from the error, this function
   should close the dv1394 file descriptor (and munmap() all
   ringbuffer mappings, if you are using them), then re-open the
   dv1394 device (and re-map the ringbuffer).

*/


/* maximum number of frames in the ringbuffer */
#define DV1394_MAX_FRAMES 32

/* number of *full* isochronous packets per DV frame */
#define DV1394_NTSC_PACKETS_PER_FRAME 250
#define DV1394_PAL_PACKETS_PER_FRAME  300

/* size of one frame's worth of DV data, in bytes */
#define DV1394_NTSC_FRAME_SIZE (480 * DV1394_NTSC_PACKETS_PER_FRAME)
#define DV1394_PAL_FRAME_SIZE  (480 * DV1394_PAL_PACKETS_PER_FRAME)


/* ioctl() commands */

enum {
        /* I don't like using 0 as a valid ioctl() */
        DV1394_INVALID = 0,


        /* get the driver ready to transmit video.
           pass a struct dv1394_init* as the parameter (see below),
           or NULL to get default parameters */
        DV1394_INIT,


        /* stop transmitting video and free the ringbuffer */
        DV1394_SHUTDOWN,


        /* submit N new frames to be transmitted, where
           the index of the first new frame is first_clear_buffer,
           and the index of the last new frame is
           (first_clear_buffer + N) % n_frames */
        DV1394_SUBMIT_FRAMES,


        /* block until N buffers are clear (pass N as the parameter)
           Because we re-transmit the last frame on underrun, there
           will at most be n_frames - 1 clear frames at any time */
        DV1394_WAIT_FRAMES,

        /* capture new frames that have been received, where
           the index of the first new frame is first_clear_buffer,
           and the index of the last new frame is
           (first_clear_buffer + N) % n_frames */
        DV1394_RECEIVE_FRAMES,


        DV1394_START_RECEIVE,


        /* pass a struct dv1394_status* as the parameter (see below) */
        DV1394_GET_STATUS,
};



enum pal_or_ntsc {
        DV1394_NTSC = 0,
        DV1394_PAL
};




/* this is the argument to DV1394_INIT */
struct dv1394_init {
        /* DV1394_API_VERSION */
        unsigned int api_version;

        /* isochronous transmission channel to use */
        unsigned int channel;

        /* number of frames in the ringbuffer. Must be at least 2
           and at most DV1394_MAX_FRAMES. */
        unsigned int n_frames;

        /* send/receive PAL or NTSC video format */
        enum pal_or_ntsc format;

        /* the following are used only for transmission */

        /* set these to zero unless you want a
           non-default empty packet rate (see below) */
        unsigned long cip_n;
        unsigned long cip_d;

        /* set this to zero unless you want a
           non-default SYT cycle offset (default = 3 cycles) */
        unsigned int syt_offset;
};

/* NOTE: you may only allocate the DV frame ringbuffer once each time
   you open the dv1394 device. DV1394_INIT will fail if you call it a
   second time with different 'n_frames' or 'format' arguments (which
   would imply a different size for the ringbuffer). If you need a
   different buffer size, simply close and re-open the device, then
   initialize it with your new settings. */

/* Q: What are cip_n and cip_d? */

/*
  A: DV video streams do not utilize 100% of the potential bandwidth offered
  by IEEE 1394 (FireWire). To achieve the correct rate of data transmission,
  DV devices must periodically insert empty packets into the 1394 data stream.
  Typically there is one empty packet per 14-16 data-carrying packets.

  Some DV devices will accept a wide range of empty packet rates, while others
  require a precise rate. If the dv1394 driver produces empty packets at
  a rate that your device does not accept, you may see ugly patterns on the
  DV output, or even no output at all.

  The default empty packet insertion rate seems to work for many people; if
  your DV output is stable, you can simply ignore this discussion. However,
  we have exposed the empty packet rate as a parameter to support devices that
  do not work with the default rate.

  The decision to insert an empty packet is made with a numerator/denominator
  algorithm. Empty packets are produced at an average rate of CIP_N / CIP_D.
  You can alter the empty packet rate by passing non-zero values for cip_n
  and cip_d to the INIT ioctl.

 */



struct dv1394_status {
        /* this embedded init struct returns the current dv1394
           parameters in use */
        struct dv1394_init init;

        /* the ringbuffer frame that is currently being
           displayed. (-1 if the device is not transmitting anything) */
        int active_frame;

        /* index of the first buffer (ahead of active_frame) that
           is ready to be filled with data */
        unsigned int first_clear_frame;

        /* how many buffers, including first_clear_buffer, are
           ready to be filled with data */
        unsigned int n_clear_frames;

        /* how many times the DV stream has underflowed, overflowed,
           or otherwise encountered an error, since the previous call
           to DV1394_GET_STATUS */
        unsigned int dropped_frames;

        /* N.B. The dropped_frames counter is only a lower bound on the actual
           number of dropped frames, with the special case that if dropped_frames
           is zero, then it is guaranteed that NO frames have been dropped
           since the last call to DV1394_GET_STATUS.
        */
};


#endif /* AVDEVICE_DV1394_H */
