// use address of FrameInputAdapter instance as input filename
// -f frameinput: enable FrameInputAdapter
// -input_type <frame input type>: one of canvas/bmp/dc/yuv, default yuv
// -pix_fmt <pixel format>: pal8/rgb555le/bgr24/bgra for canvas/bmp/dc,
//                          default yuv420p for yuv input
// -framerate <frame rate>: e.g. 30000/1001 (-> 29.97)
// -video_size <frame size>: such as 640x480 or hd720

type
  PInputFrameInfo = ^TInputFrameInfo;
  TInputFrameInfo = record
    TimeStamp: Int64;
    LastTimeStamp: Int64;
    FrameNumber: Integer;
    Width: Integer;
    Height: Integer;
    BitsPerPixel: Integer;        // for RGB only
    BytesPerLine: Integer;        // for RGB only
    BytesPerFrame: Integer;
    PixelFormat: TAVPixelFormat;
    Palette: PByte;               // for PAL8 only, 1024 bytes(AVPALETTE_SIZE), BGRA...
  end;

  TReadFrameCanvasEvent = function(Sender: TObject; ACanvas: TCanvas;
    AFrameInfo: PInputFrameInfo): Integer of object;
  TReadFrameDataEvent = function(Sender: TObject; AData: Pointer;
    AFrameInfo: PInputFrameInfo): Integer of object;
{$IFDEF MSWINDOWS}
  TReadFrameDCEvent = function(Sender: TObject; ADC: HDC;
    AFrameInfo: PInputFrameInfo): Integer of object;
{$ENDIF}

  TFrameInputAdapter = class(TFFBaseComponent)
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property FrameInfo: PInputFrameInfo read FFrameInfo;
    property UserData: Pointer read FData write FData;
  published
    property TriggerEventInMainThread: Boolean read FTriggerEventInMainThread write FTriggerEventInMainThread default True;
    property OnReadHeader: TNotifyEvent read FOnReadHeader write FOnReadHeader;
    property OnReadClose: TNotifyEvent read FOnReadClose write FOnReadClose;
    property OnReadFrameCanvas: TReadFrameCanvasEvent read FOnReadFrameCanvas write FOnReadFrameCanvas;
    property OnReadFrameBMP: TReadFrameDataEvent read FOnReadFrameBMP write FOnReadFrameBMP;
{$IFDEF MSWINDOWS}
    property OnReadFrameDC: TReadFrameDCEvent read FOnReadFrameDC write FOnReadFrameDC;
{$ENDIF}
    property OnReadFrameYUV: TReadFrameDataEvent read FOnReadFrameYUV write FOnReadFrameYUV;
  end;

procedure register_frameinput;
