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

  Program:   Visualization Toolkit
  Module:    vtkMP4Writer.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   vtkMP4Writer
 * @brief   Writes Windows MP4 files on Windows platforms.
 *
 * vtkMP4Writer writes H.264-encoded MP4 files. Note that this class in only available
 * on the Microsoft Windows platform.
 *
 * Implementation inspired from the following tutorial:
 * https://docs.microsoft.com/en-us/windows/win32/medfound/tutorial--using-the-sink-writer-to-encode-video?redirectedfrom=MSDN
 * @sa
 * vtkGenericMovieWriter vtkAVIWriter
 */

#ifndef vtkMP4Writer_h
#define vtkMP4Writer_h

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

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

  ///@{
  /**
   * These methods start writing an MP4 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 average bit rate of the video.
   * Higher produces better quality, but a larger file size.
   */
  vtkSetMacro(BitRate, int);
  vtkGetMacro(BitRate, int);
  ///@}

protected:
  vtkMP4Writer();
  ~vtkMP4Writer() override;

  class vtkMP4WriterInternals;
  vtkMP4WriterInternals* Internals;

  bool Writing = false;
  int Rate;
  int BitRate;

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

#endif
