/*=========================================================================

  Program:   Visualization Toolkit
  Module:    vtkAVIWriter.h

  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
  All rights reserved.
  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notice for more information.

=========================================================================*/
/**
 * @class   vtkAVIWriter
 * @brief   Writes Windows AVI files.
 *
 * vtkAVIWriter writes AVI files. Note that this class in only available
 * on the Microsoft Windows platform. The data type of the file is
 * unsigned char regardless of the input type.
 * @sa
 * vtkGenericMovieWriter
 */

#ifndef vtkAVIWriter_h
#define vtkAVIWriter_h

#include "vtkGenericMovieWriter.h"
#include "vtkIOMovieModule.h" // For export macro

class vtkAVIWriterInternal;

class VTKIOMOVIE_EXPORT vtkAVIWriter : public vtkGenericMovieWriter
{
public:
  static vtkAVIWriter* New();
  vtkTypeMacro(vtkAVIWriter, vtkGenericMovieWriter);
  void PrintSelf(ostream& os, vtkIndent indent) override;

  //@{
  /**
   * These methods start writing an AVI file, write a frame to the file
   * and then end the writing process.
   */
  void Start() override;
  void Write() override;
  void End() override;
  //@}

  //@{
  /**
   * Set/Get the frame rate, in frame/s.
   */
  vtkSetClampMacro(Rate, int, 1, 5000);
  vtkGetMacro(Rate, int);
  //@}

  //@{
  /**
   * Set/Get the compression quality.
   * 0 means worst quality and smallest file size
   * 2 means best quality and largest file size
   */
  vtkSetClampMacro(Quality, int, 0, 2);
  vtkGetMacro(Quality, int);
  //@}

  //@{
  /**
   * Set/Get if the user should be prompted for compression options, i.e.
   * pick a compressor, set the compression rate (override Rate), etc.).
   * Default is OFF (legacy).
   */
  vtkSetMacro(PromptCompressionOptions, int);
  vtkGetMacro(PromptCompressionOptions, int);
  vtkBooleanMacro(PromptCompressionOptions, int);
  //@}

  //@{
  /**
   * Set/Get the compressor FourCC.
   * A FourCC (literally, four-character code) is a sequence of four bytes
   * used to uniquely identify data formats. [...] One of the most well-known
   * uses of FourCCs is to identify the video codec used in AVI files.
   * Common identifiers include DIVX, XVID, and H264.
   * http://en.wikipedia.org/wiki/FourCC.
   * Default value is:
   * - MSVC
   * Other examples include:
   * - DIB: Full Frames (Uncompressed)
   * - LAGS: Lagarith Lossless Codec
   * - MJPG: M-JPG, aka Motion JPEG (say, Pegasus Imaging PicVideo M-JPEG)
   * Links:
   * - http://www.fourcc.org/
   * - http://www.microsoft.com/whdc/archive/fourcc.mspx
   * - http://abcavi.kibi.ru/fourcc.php
   */
  vtkSetStringMacro(CompressorFourCC);
  vtkGetStringMacro(CompressorFourCC);
  //@}

protected:
  vtkAVIWriter();
  ~vtkAVIWriter() override;

  vtkAVIWriterInternal* Internals;

  int Rate;
  int Time;
  int Quality;
  int PromptCompressionOptions;
  char* CompressorFourCC;

private:
  vtkAVIWriter(const vtkAVIWriter&) = delete;
  void operator=(const vtkAVIWriter&) = delete;
};

#endif
