type
  TCustomJoiner = class(TFFBaseComponent)
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    function Add(const AFileName: TPathFileName; const AOptions: string = ''): Integer;

    procedure Reset;
    procedure Exchange(AIndex1, AIndex2: Integer);
    procedure Remove(AIndex: Integer);
    function IndexOf(AFFDecoder: TFFDecoder): Integer;

    property Files[Index: Integer]: TFFDecoder read GetFiles;
    property FileCount: Integer read GetFileCount;
    property Handles[Index: Integer]: PAVFormatContext read GetHandles;
    property Duration: Int64 read GetDuration;
    property DisableAudio: Boolean read FDisableAudio write SetDisableAudio;
    property DisableVideo: Boolean read FDisableVideo write SetDisableVideo;
    property DesireVideoWidth: Integer read FDesireVideoWidth write SetDesireVideoWidth;
    property DesireVideoHeight: Integer read FDesireVideoHeight write SetDesireVideoHeight;
    property DesireVideoFormat: TAVPixelFormat read FDesireVideoFormat write SetDesireVideoFormat;
    property DesireAudioChannels: Integer read FDesireAudioChannels write SetDesireAudioChannels;
    property DesireAudioSampleRate: Integer read FDesireAudioSampleRate write SetDesireAudioSampleRate;
    property DesireAudioSampleFormat: TAVSampleFormat read FDesireAudioSampleFormat write SetDesireAudioSampleFormat;
    property KeepAspect: Boolean read FKeepAspect write FKeepAspect;
    property PadColor: string read FPadColor write SetPadColor;
    property LastErrMsg: string read FLastErrMsg;
  end;

  TFFJoiner = class(TCustomJoiner)
  published
    property DesireAudioChannels default 0;
    property DesireAudioSampleRate default 0;
    property DesireVideoWidth default 0;
    property DesireVideoHeight default 0;
    property DisableAudio default False;
    property DisableVideo default False;
    property KeepAspect default True;
    property PadColor;
  end;

procedure register_ffjoin;

