const
  AV_NOPTS_VALUE: Int64    = Int64($8000000000000000);
  AV_TIME_BASE_I           = 1000000;
  AV_TIME_BASE: Int64      = AV_TIME_BASE_I;

type
  TSeekFlag = (
    sfBackward, // seek backward
    sfByte,     // seeking based on position in bytes
    sfAny,      // seek to any frame, even non key-frames
    sfFrame);   // seeking based on frame number
  TSeekFlags = set of TSeekFlag;

{$IFNDEF BCB}
  PAVFormatContext = libavformat.PAVFormatContext;
  PAVPicture = libavcodec.PAVPicture;
  TAVPixelFormat = libavutil_pixfmt.TAVPixelFormat;
{$ENDIF}
  TBeforeFindStreamInfoEvent = procedure(Sender: TObject; AFormatContext: PAVFormatContext) of object;

{$IFDEF ENABLE_PLAYER}
  // FFPlayer/FXPlayer
  TAudioVolume = 0..SDL_MIX_MAXVOLUME;
  Tav_sync_type = (stAudio, stVideo, stExternal);
  TRepeatType = (rtNone, rtStop, rtLoop, rtPause, rtRewind, rtEnd);
  TPlayState = (psPlay, psPause, psResume, psStep, psStop, psEnd);
  TErrorType = (errUnknow, errVideoFilters);
  TFileOpenEvent = procedure(Sender: TObject; const ADuration: Int64;
    AFrameWidth, AFrameHeight: Integer; var AScreenWidth, AScreenHeight: Integer) of object;
  TAudioHookEvent = procedure(Sender: TObject; const APTS: Int64; ASample: {$IFDEF BCB}Pointer{$ELSE}PByte{$ENDIF};
    ASize, ASampleRate, AChannels: Integer) of object;
  TVideoHookEvent = procedure(Sender: TObject; ABitmap: {$IFDEF BCB}TObject{$ELSE}TBitmap{$ENDIF};
    const APTS: Int64; var AUpdate: Boolean) of object;
  TFrameHookEvent = procedure(Sender: TObject; APicture: PAVPicture; APixFmt: TAVPixelFormat;
    AWidth, AHeight: Integer; const APTS: Int64) of object;
  TPositionEvent = procedure(Sender: TObject; const APTS: Int64) of object;
  TPosition2Event = procedure(Sender: TObject; const APTS, ABytes: Int64) of object;
  TPlayStateEvent = procedure(Sender: TObject; APlayState: TPlayState) of object;
  TErrorNotifyEvent = procedure(Sender: TObject; AError: TErrorType; AMessage: string) of object;

  TFFBaseComponent = class(TComponent)
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ShowAbout;
    class function FPUExceptionsDisabled: Boolean;
    class procedure DisableFPUExceptions;
    class procedure RestoreFPUExceptions;
    property ReadTimeout: Integer read FReadTimeout write SetReadTimeout;
    property WriteTimeout: Integer read FWriteTimeout write SetWriteTimeout;
    property Edition: string read FEdition;
  published
    property About: string read FAbout write FAbout;
    property Version: string read FVersion;
  end;

function MakeSeekFlags(ASeekFlags: TSeekFlags): Integer;
function IntToSeekFlags(ASeekFlags: Integer): TSeekFlags;

