From 617659e9a6b886e20617a55ceb90fb44c5662bad Mon Sep 17 00:00:00 2001
From: k-m_schindler <k-m_schindler@b956fd51-792f-4845-bead-9b4dfca2ff2c>
Date: Mon, 29 Jul 2013 14:06:48 +0000
Subject: avio and swscale translated. still untested.

git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@3006 b956fd51-792f-4845-bead-9b4dfca2ff2c
---
 src/lib/ffmpeg-1.2/avio.pas    | 599 +++++++++++++++++++++++++++++++++++++++++
 src/lib/ffmpeg-1.2/swscale.pas | 479 ++++++++++++++++++++++++++++++++
 src/lib/ffmpeg-2.0/avio.pas    | 598 ++++++++++++++++++++++++++++++++++++++++
 src/lib/ffmpeg-2.0/swscale.pas | 486 +++++++++++++++++++++++++++++++++
 4 files changed, 2162 insertions(+)
 create mode 100644 src/lib/ffmpeg-1.2/avio.pas
 create mode 100644 src/lib/ffmpeg-1.2/swscale.pas
 create mode 100644 src/lib/ffmpeg-2.0/avio.pas
 create mode 100644 src/lib/ffmpeg-2.0/swscale.pas

diff --git a/src/lib/ffmpeg-1.2/avio.pas b/src/lib/ffmpeg-1.2/avio.pas
new file mode 100644
index 00000000..139b00e3
--- /dev/null
+++ b/src/lib/ffmpeg-1.2/avio.pas
@@ -0,0 +1,599 @@
+(*
+ * copyright (c) 2001 Fabrice Bellard
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * This is a part of Pascal porting of ffmpeg.
+ * - Originally by Victor Zinetz for Delphi and Free Pascal on Windows.
+ * - For Mac OS X, some modifications were made by The Creative CAT, denoted as CAT
+ *   in the source codes.
+ * - Changes and updates by the UltraStar Deluxe Team
+ *
+ * Conversion of libavformat/avio.h
+ * unbuffered I/O operations
+ * @warning This file has to be considered an internal but installed
+ * header, so it should not be directly included in your projects.
+ *
+ * update to
+ * avformat version: 54.63.104
+ *)
+
+unit avio;
+
+{$IFDEF FPC}
+  {$MODE DELPHI }
+  {$PACKENUM 4}    (* use 4-byte enums *)
+  {$PACKRECORDS C} (* C/C++-compatible record packing *)
+{$ELSE}
+  {$MINENUMSIZE 4} (* use 4-byte enums *)
+{$ENDIF}
+
+{$I switches.inc}
+
+interface
+
+uses
+  ctypes,
+  {$IFDEF UNIX}
+  BaseUnix,   // for SEEK_CUR
+  {$ENDIF}
+  avcodec,
+  avutil,
+  SysUtils,
+  UConfig;
+
+(**
+ * Those FF_API_* defines are not part of public API.
+ * They may change, break or disappear at any time.
+ *)
+const
+  FF_API_URL_CLASS            = (LIBAVFORMAT_VERSION_MAJOR >= 53);
+
+const
+  AVIO_SEEKABLE_NORMAL = 0001; (**< Seeking works like for a local file *)
+
+type
+  TReadWriteFunc = function(opaque: Pointer; buf: PByteArray; buf_size: cint): cint; cdecl;
+  TSeekFunc = function(opaque: Pointer; offset: cint64; whence: cint): cint64; cdecl;
+  Tcallback = function(p: pointer): cint; cdecl;
+
+type
+(**
+ * Callback for checking whether to abort blocking functions.
+ * AVERROR_EXIT is returned in this case by the interrupted
+ * function. During blocking operations, callback is called with
+ * opaque as parameter. If the callback returns 1, the
+ * blocking operation will be aborted.
+ *
+ * No members can be added to this struct without a major bump, if
+ * new elements have been added after this struct in AVFormatContext
+ * or AVIOContext.
+ *)
+  PAVIOInterruptCB = ^TAVIOInterruptCB;
+  TAVIOInterruptCB = record
+    callback: Tcallback;
+    opaque: pointer;
+  end; (*TAVIOInterruptCB*)
+
+(**
+ * Bytestream IO Context.
+ * New fields can be added to the end with minor version bumps.
+ * Removal, reordering and changes to existing fields require a major
+ * version bump.
+ * sizeof(AVIOContext) must not be used outside libav*.
+ *
+ * @note None of the function pointers in AVIOContext should be called
+ *       directly, they should only be set by the client application
+ *       when implementing custom I/O. Normally these are set to the
+ *       function pointers specified in avio_alloc_context()
+ *)
+  PPAVIOContext = ^PAVIOContext;
+  PAVIOContext = ^TAVIOContext;
+  TAVIOContext = record
+    (**
+     * A class for private options.
+     *
+     * If this AVIOContext is created by avio_open2(), av_class is set and
+     * passes the options down to protocols.
+     *
+     * If this AVIOContext is manually allocated, then av_class may be set by
+     * the caller.
+     *
+     * warning -- this field can be NULL, be sure to not pass this AVIOContext
+     * to any av_opt_* functions in that case.
+     *)
+    av_class: {const} PAVClass;
+    buffer: PByteArray;  (**< Start of the buffer. *)
+    buffer_size: cint;   (**< Maximum buffer size *)
+    buf_ptr: PByteArray; (**< Current position in the buffer *)
+    buf_end: PByteArray; (**< End of the data, may be less than
+                              buffer+buffer_size if the read function returned
+                              less data than requested, e.g. for streams where
+                              no more data has been received yet. *)
+    opaque: pointer;     (**< A private pointer, passed to the read/write/seek/...
+                              functions. *)
+    read_packet: TReadWriteFunc;
+    write_packet: TReadWriteFunc;
+    seek: TSeekFunc;
+    pos: cint64;         (**< position in the file of the current buffer *)
+    must_flush: cint;    (**< true if the next seek should flush *)
+    eof_reached: cint;   (**< true if eof reached *)
+    write_flag: cint;    (**< true if open for writing *)
+    max_packet_size: cint;
+    checksum: culong;
+    checksum_ptr: PByteArray;
+    update_checksum: function (checksum: culong; buf: {const} PAnsiChar; size: cuint): culong; cdecl;
+    error: cint;         (**< contains the error code or 0 if no error happened *)
+    (**
+     * Pause or resume playback for network streaming protocols - e.g. MMS.
+     *)
+    read_pause: function(opaque: Pointer; pause: cint): cint; cdecl;
+    (**
+     * Seek to a given timestamp in stream with the specified stream_index.
+     * Needed for some network streaming protocols which don't support seeking
+     * to byte position.
+     *)
+    read_seek: function(opaque: Pointer; stream_index: cint;
+                        timestamp: cint64; flags: cint): cint64; cdecl;
+    (**
+     * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
+     *)
+    seekable: cint;
+
+    (**
+     * max filesize, used to limit allocations
+     * This field is internal to libavformat and access from outside is not allowed.
+     *)
+    maxsize: cint64;
+
+     (**
+      * avio_read and avio_write should if possible be satisfied directly
+      * instead of going through a buffer, and avio_seek will always
+      * call the underlying seek function directly.
+      *)
+     direct: cint;
+
+    (**
+     * Bytes read statistic
+     * This field is internal to libavformat and access from outside is not allowed.
+     *)
+    bytes_read: cint64;
+
+    (**
+     * seek statistic
+     * This field is internal to libavformat and access from outside is not allowed.
+     *)
+    seek_count: cint;
+  end;
+
+(* unbuffered I/O *)
+
+(**
+ * Return AVIO_* access flags corresponding to the access permissions
+ * of the resource in url, or a negative value corresponding to an
+ * AVERROR code in case of failure. The returned access flags are
+ * masked by the value in flags.
+ *
+ * @note This function is intrinsically unsafe, in the sense that the
+ * checked resource may change its existence or permission status from
+ * one call to another. Thus you should not trust the returned value,
+ * unless you are sure that no other processes are accessing the
+ * checked resource.
+ *)
+function avio_check(url: {const} PAnsiChar; flags: cint): cint;
+  cdecl; external av__format;
+
+(**
+ * Allocate and initialize an AVIOContext for buffered I/O. It must be later
+ * freed with av_free().
+ *
+ * @param buffer Memory block for input/output operations via AVIOContext.
+ *        The buffer must be allocated with av_malloc() and friends.
+ * @param buffer_size The buffer size is very important for performance.
+ *        For protocols with fixed blocksize it should be set to this blocksize.
+ *        For others a typical size is a cache page, e.g. 4kb.
+ * @param write_flag Set to 1 if the buffer should be writable, 0 otherwise.
+ * @param opaque An opaque pointer to user-specific data.
+ * @param read_packet  A function for refilling the buffer, may be NULL.
+ * @param write_packet A function for writing the buffer contents, may be NULL.
+ *        The function may not change the input buffers content.
+ * @param seek A function for seeking to specified byte position, may be NULL.
+ *
+ * @return Allocated AVIOContext or NULL on failure.
+ *)
+function avio_alloc_context(
+                  buffer: PAnsiChar;
+                  buffer_size: cint;
+                  write_flag: cint;
+                  opaque: Pointer;
+                  read_packet: TReadWriteFunc;
+                  write_packet: TReadWriteFunc;
+                  seek: TSeekFunc): PAVIOContext;
+  cdecl; external av__format;
+		  
+procedure avio_w8(s: PAVIOContext; b: cint);
+  cdecl; external av__format;
+procedure avio_write(s: PAVIOContext; buf: {const} PAnsiChar; size: cint);
+  cdecl; external av__format;
+procedure avio_wl64(s: PAVIOContext; val: cuint64);
+  cdecl; external av__format;
+procedure avio_wb64(s: PAVIOContext; val: cuint64);
+  cdecl; external av__format;
+procedure avio_wl32(s: PAVIOContext; val: cuint);
+  cdecl; external av__format;
+procedure avio_wb32(s: PAVIOContext; val: cuint);
+  cdecl; external av__format;
+procedure avio_wl24(s: PAVIOContext; val: cuint);
+  cdecl; external av__format;
+procedure avio_wb24(s: PAVIOContext; val: cuint);
+  cdecl; external av__format;
+procedure avio_wl16(s: PAVIOContext; val: cuint);
+  cdecl; external av__format;
+procedure avio_wb16(s: PAVIOContext; val: cuint);
+  cdecl; external av__format;
+
+(**
+ * Write a NULL-terminated string.
+ * @return number of bytes written.
+ *)
+function avio_put_str(s: PAVIOContext; str: {const} PAnsiChar): cint;
+  cdecl; external av__format;
+
+(**
+ * Convert an UTF-8 string to UTF-16LE and write it.
+ * @return number of bytes written.
+ *)
+function avio_put_str16le(s: PAVIOContext; str: {const} PAnsiChar): cint;
+  cdecl; external av__format;
+
+const
+ (**
+  * Passing this as the "whence" parameter to a seek function causes it to
+  * return the filesize without seeking anywhere. Supporting this is optional.
+  * If it is not supported then the seek function will return <0.
+  *)
+  AVSEEK_SIZE = $10000;
+
+ (**
+  * Oring this flag as into the "whence" parameter to a seek function causes it to
+  * seek by any means (like reopening and linear reading) or other normally unreasonble
+  * means that can be extreemly slow.
+  * This may be ignored by the seek code.
+  *)
+  AVSEEK_FORCE = $20000;
+
+(**
+ * fseek() equivalent for AVIOContext.
+ * @return new position or AVERROR.
+ *)
+function avio_seek(s: PAVIOContext; offset: cint64; whence: cint): cint64;
+  cdecl; external av__format;
+
+(**
+ * Skip given number of bytes forward
+ * @return new position or AVERROR.
+ *)
+function avio_skip(s: PAVIOContext; offset: cint64): cint64;
+  cdecl; external av__format;
+
+{$IFDEF UNIX}
+(**
+ * ftell() equivalent for AVIOContext.
+ * @return position or AVERROR.
+ *)
+function avio_tell(s: PAVIOContext): cint64; {$IFDEF HasInline}inline;{$ENDIF}
+{$ELSE}
+{$ENDIF}
+
+(**
+ * Get the filesize.
+ * @return filesize or AVERROR
+ *)
+function avio_size(s: PAVIOContext): cint64;
+  cdecl; external av__format;
+
+(**
+ * feof() equivalent for AVIOContext.
+ * @return non zero if and only if end of file
+ *)
+function url_feof(s: PAVIOContext): cint;
+  cdecl; external av__format;
+  
+(** @warning currently size is limited *)
+function avio_printf(s: PAVIOContext; fmt: {const} PAnsiChar; args: array of const): cint;
+  cdecl; external av__format;
+
+(**
+ * Force flushing of buffered data to the output s.
+ *
+ * Force the buffered data to be immediately written to the output,
+ * without to wait to fill the internal buffer.
+ *)
+procedure avio_flush(s: PAVIOContext);
+  cdecl; external av__format;
+
+(**
+ * Read size bytes from AVIOContext into buf.
+ * @return number of bytes read or AVERROR
+ *)
+function avio_read(s: PAVIOContext; buf: Pbyte; size: cint): cint;
+  cdecl; external av__format;
+
+(**
+ * @name Functions for reading from AVIOContext
+ * @
+ *
+ * @note return 0 if EOF, so you cannot use it if EOF handling is
+ *       necessary
+ *)
+function avio_r8(s: PAVIOContext): cint;
+  cdecl; external av__format;
+
+function avio_rl16(s: PAVIOContext): cuint;
+  cdecl; external av__format;
+
+function avio_rl24(s: PAVIOContext): cuint;
+  cdecl; external av__format;
+
+function avio_rl32(s: PAVIOContext): cuint;
+  cdecl; external av__format;
+
+function avio_rl64(s: PAVIOContext): cuint64;
+  cdecl; external av__format;
+
+function avio_rb16(s: PAVIOContext): cuint;
+  cdecl; external av__format;
+
+function avio_rb24(s: PAVIOContext): cuint;
+  cdecl; external av__format;
+
+function avio_rb32(s: PAVIOContext): cuint;
+  cdecl; external av__format;
+
+function avio_rb64(s: PAVIOContext): cuint64;
+  cdecl; external av__format;
+
+(**
+ * @
+ *)
+(**
+ * Read a string from pb into buf. The reading will terminate when either
+ * a NULL character was encountered, maxlen bytes have been read, or nothing
+ * more can be read from pb. The result is guaranteed to be NULL-terminated, it
+ * will be truncated if buf is too small.
+ * Note that the string is not interpreted or validated in any way, it
+ * might get truncated in the middle of a sequence for multi-byte encodings.
+ *
+ * @return number of bytes read (is always <= maxlen).
+ * If reading ends on EOF or error, the return value will be one more than
+ * bytes actually read.
+ *)
+function avio_get_str(pb: PAVIOContext; maxlen: cint; buf: PAnsiChar; buflen: cint): cint;
+  cdecl; external av__format;
+
+(**
+ * Read a UTF-16 string from pb and convert it to UTF-8.
+ * The reading will terminate when either a null or invalid character was
+ * encountered or maxlen bytes have been read.
+ * @return number of bytes read (is always <= maxlen)
+ *)
+function avio_get_str16le(pb: PAVIOContext; maxlen: cint; buf: PAnsiChar; buflen: cint): cint;
+  cdecl; external av__format;
+
+function avio_get_str16be(pb: PAVIOContext; maxlen: cint; buf: PAnsiChar; buflen: cint): cint;
+  cdecl; external av__format;
+
+(**
+ * @name URL open modes
+ * The flags argument to avio_open must be one of the following
+ * constants, optionally ORed with other flags.
+ * @{
+ *)
+const
+  AVIO_FLAG_READ  = 1;                                      (**< read-only *)
+  AVIO_FLAG_WRITE = 2;                                      (**< write-only *)
+  AVIO_FLAG_READ_WRITE = {(AVIO_FLAG_READ|AVIO_FLAG_WRITE)} 3;  (**< read-write pseudo flag *)
+(**
+ * @
+ *)
+
+const
+(**
+ * Use non-blocking mode.
+ * If this flag is set, operations on the context will return
+ * AVERROR(EAGAIN) if they can not be performed immediately.
+ * If this flag is not set, operations on the context will never return
+ * AVERROR(EAGAIN).
+ * Note that this flag does not affect the opening/connecting of the
+ * context. Connecting a protocol will always block if necessary (e.g. on
+ * network protocols) but never hang (e.g. on busy devices).
+ * Warning:  non-blocking protocols is work-in-progress; this flag may be
+ * silently ignored.
+ *)
+  AVIO_FLAG_NONBLOCK = 8;    
+
+(**
+ * Use direct mode.
+ * avio_read and avio_write should if possible be satisfied directly
+ * instead of going through a buffer, and avio_seek will always
+ * call the underlying seek function directly.
+ *)
+  AVIO_FLAG_DIRECT = $8000;
+
+(**
+ * Create and initialize a AVIOContext for accessing the
+ * resource indicated by url.
+ * @note When the resource indicated by url has been opened in
+ * read+write mode, the AVIOContext can be used only for writing.
+ *
+ * @param s Used to return the pointer to the created AVIOContext.
+ * In case of failure the pointed to value is set to NULL.
+ * @param flags flags which control how the resource indicated by url
+ * is to be opened
+ * @return 0 in case of success, a negative value corresponding to an
+ * AVERROR code in case of failure
+ *)
+function avio_open(var s: PAVIOContext; url: {const} PAnsiChar; flags: cint): cint;
+  cdecl; external av__format;
+
+(**
+ * Create and initialize a AVIOContext for accessing the
+ * resource indicated by url.
+ * @note When the resource indicated by url has been opened in
+ * read+write mode, the AVIOContext can be used only for writing.
+ *
+ * @param s Used to return the pointer to the created AVIOContext.
+ * In case of failure the pointed to value is set to NULL.
+ * @param flags flags which control how the resource indicated by url
+ * is to be opened
+ * @param int_cb an interrupt callback to be used at the protocols level
+ * @param options  A dictionary filled with protocol-private options. On return
+ * this parameter will be destroyed and replaced with a dict containing options
+ * that were not found. May be NULL.
+ * @return 0 in case of success, a negative value corresponding to an
+ * AVERROR code in case of failure
+ *)
+function avio_open2(s: {PPAVIOContext} pointer; {const} url: PAnsiChar; flags: cint;
+	{const} int_cb: PAVIOInterruptCB; options: {PPAVDictionary} pointer): cint;
+  cdecl; external av__format;
+
+(**
+ * Close the resource accessed by the AVIOContext s and free it.
+ * This function can only be used if s was opened by avio_open().
+ *
+ * The internal buffer is automatically flushed before closing the
+ * resource.
+ *
+ * @return 0 on success, an AVERROR < 0 on error.
+ * @see avio_close
+ *)
+function avio_close(s: PAVIOContext): cint;
+  cdecl; external av__format;
+
+(**
+ * Close the resource accessed by the AVIOContext *s, free it
+ * and set the pointer pointing to it to NULL.
+ * This function can only be used if s was opened by avio_open().
+ *
+ * The internal buffer is automatically flushed before closing the
+ * resource.
+ *
+ * @return 0 on success, an AVERROR < 0 on error.
+ * @see avio_close
+ *)
+function avio_closep(s: PPAVIOContext): cint;
+  cdecl; external av__format;
+
+(**
+ * Open a write only memory stream.
+ *
+ * @param s new IO context
+ * @return zero if no error.
+ *)
+function avio_open_dyn_buf(var s: PAVIOContext): cint;
+  cdecl; external av__format;
+
+(**
+ * Return the written size and a pointer to the buffer. The buffer
+ * must be freed with av_free().
+ * Padding of FF_INPUT_BUFFER_PADDING_SIZE is added to the buffer.
+ *
+ * @param s IO context
+ * @param pbuffer pointer to a byte buffer
+ * @return the length of the byte buffer
+ *)
+function avio_close_dyn_buf(s: PAVIOContext; var pbuffer: Pcuint8): cint;
+  cdecl; external av__format;
+
+(**
+ * Iterate through names of available protocols.
+ *
+ * @param opaque A private pointer representing current protocol.
+ *        It must be a pointer to NULL on first iteration and will
+ *        be updated by successive calls to avio_enum_protocols.
+ * @param output If set to 1, iterate over output protocols,
+ *               otherwise over input protocols.
+ *
+ * @return A static string containing the name of current protocol or NULL
+ *)
+function avio_enum_protocols(var opaque: Pointer; output: cint): {const} PAnsiChar;
+  cdecl; external av__format;
+
+(**
+ * Pause and resume playing - only meaningful if using a network streaming
+ * protocol (e.g. MMS).
+ * @param pause 1 for pause, 0 for resume
+ *)
+function avio_pause(h: PAVIOContext; pause: cint): cint;
+  cdecl; external av__format;
+
+(**
+ * Seek to a given timestamp relative to some component stream.
+ * Only meaningful if using a network streaming protocol (e.g. MMS.).
+ * @param stream_index The stream index that the timestamp is relative to.
+ *        If stream_index is (-1) the timestamp should be in AV_TIME_BASE
+ *        units from the beginning of the presentation.
+ *        If a stream_index >= 0 is used and the protocol does not support
+ *        seeking based on component streams, the call will fail with ENOTSUP.
+ * @param timestamp timestamp in AVStream.time_base units
+ *        or if there is no stream specified then in AV_TIME_BASE units.
+ * @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE
+ *        and AVSEEK_FLAG_ANY. The protocol may silently ignore
+ *        AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will
+ *        fail with ENOTSUP if used and not supported.
+ * @return >= 0 on success
+ * @see AVInputFormat: : read_seek
+ *)
+function avio_seek_time(h: PAVIOContext; stream_index: cint;
+                        timestamp: cint64; flags: cint): cint64;
+  cdecl; external av__format;
+
+implementation
+
+{$IF (LIBAVFORMAT_VERSION_MAJOR < 54)}
+function url_is_streamed(s: PAVIOContext): cint;
+begin
+  Result := s^.is_streamed;
+end;
+{$IFEND}
+
+(**
+ * For SEEK_CUR on Windows
+ * values taken from stdio.h of C
+ *)
+{$IFNDEF SEEK_SET}
+const
+  SEEK_SET = 0;
+{$ENDIF}
+
+{$IFNDEF SEEK_CUR}
+const
+  SEEK_CUR = 1;
+{$ENDIF}
+
+{$IFNDEF SEEK_END}
+const
+  SEEK_END = 2;
+{$ENDIF}
+
+function avio_tell(s: PAVIOContext): cint64; {$IFDEF HasInline}inline;{$ENDIF}
+begin
+  Result := avio_seek(s, 0, SEEK_CUR);
+end;
+
+
+end.
diff --git a/src/lib/ffmpeg-1.2/swscale.pas b/src/lib/ffmpeg-1.2/swscale.pas
new file mode 100644
index 00000000..636d5bf5
--- /dev/null
+++ b/src/lib/ffmpeg-1.2/swscale.pas
@@ -0,0 +1,479 @@
+(*
+ * Copyright (C) 2001-2011 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * FFmpeg Pascal port
+ * - Ported by the UltraStar Deluxe Team
+ *
+ * Conversion of libswscale/swscale.h
+ * version: 2.2.100
+ *)
+ 
+unit swscale;
+
+{$IFDEF FPC}
+  {$MODE DELPHI }
+  {$PACKENUM 4}    (* use 4-byte enums *)
+  {$PACKRECORDS C} (* C/C++-compatible record packing *)
+{$ELSE}
+  {$MINENUMSIZE 4} (* use 4-byte enums *)
+{$ENDIF}
+
+{$IFDEF DARWIN}
+  {$linklib libswscale}
+{$ENDIF}
+
+interface
+
+uses
+  ctypes,
+  avutil,
+  avcodec,
+  UConfig;
+
+const
+(*
+ * IMPORTANT: The official FFmpeg C headers change very quickly. Often some
+ * of the data structures are changed so that they become incompatible with
+ * older header files. The Pascal headers have to be adjusted to those changes,
+ * otherwise the application might crash randomly or strange bugs (not
+ * necessarily related to video or audio due to buffer overflows etc.) might
+ * occur.
+ *
+ * In the past users reported problems with USDX that took hours to fix and
+ * the problem was an unsupported version of FFmpeg. So we decided to disable
+ * support for future versions of FFmpeg until the headers are revised by us
+ * for that version as they otherwise most probably will break USDX.
+ *
+ * If the headers do not yet support your FFmpeg version you may want to
+ * adjust the max. version numbers manually but please note: it may work but
+ * in many cases it does not. The USDX team does NOT PROVIDE ANY SUPPORT
+ * for the game if the MAX. VERSION WAS CHANGED.
+ *
+ * The only safe way to support new versions of FFmpeg is to add the changes
+ * of the FFmpeg git repository C headers to the Pascal headers.
+ * You can accelerate this process by posting a patch with the git changes
+ * translated to Pascal to our bug tracker (please join our IRC chat before
+ * you start working on it). Simply adjusting the max. versions is NOT a valid
+ * fix. 
+ *)
+
+  (* Max. supported version by this header *)
+  LIBSWSCALE_MAX_VERSION_MAJOR   =  2;
+  LIBSWSCALE_MAX_VERSION_MINOR   =  2;
+  LIBSWSCALE_MAX_VERSION_RELEASE =  100;
+  LIBSWSCALE_MAX_VERSION = (LIBSWSCALE_MAX_VERSION_MAJOR * VERSION_MAJOR) +
+                           (LIBSWSCALE_MAX_VERSION_MINOR * VERSION_MINOR) +
+                           (LIBSWSCALE_MAX_VERSION_RELEASE * VERSION_RELEASE);
+
+(* Check if linked versions are supported *)
+{$IF (LIBSWSCALE_VERSION > LIBSWSCALE_MAX_VERSION)}
+  {$MESSAGE Error 'Linked version of libswscale is not yet supported!'}
+{$IFEND}
+
+type
+  TQuadCintArray = array[0..3] of cint;
+  PQuadCintArray = ^TQuadCintArray;
+  TCintArray = array[0..0] of cint;
+  PCintArray = ^TCintArray;
+  TPCuint8Array = array[0..0] of PCuint8;
+  PPCuint8Array = ^TPCuint8Array;
+
+(* libswscale/version.h start *)
+
+const
+(**
+ * FF_API_* defines may be placed below to indicate public API that will be
+ * dropped at a future version bump. The defines themselves are not part of
+ * the public API and may change, break or disappear at any time.
+ *)
+{$ifndef FF_API_SWS_GETCONTEXT}
+  FF_API_SWS_GETCONTEXT = LIBSWSCALE_VERSION_MAJOR < 3;    
+{$endif}
+{$ifndef FF_API_SWS_CPU_CAPS}
+  FF_API_SWS_CPU_CAPS = LIBSWSCALE_VERSION_MAJOR < 3;    
+{$endif}
+{$ifndef FF_API_SWS_FORMAT_NAME}
+  FF_API_SWS_FORMAT_NAME = LIBSWSCALE_VERSION_MAJOR < 3;    
+{$endif}
+
+(* libswscale/version.h end *)
+
+(**
+ * Return the LIBSWSCALE_VERSION_INT constant.
+ *)
+function swscale_version(): cuint;
+  cdecl; external sw__scale;
+
+(**
+ * Return the libswscale build-time configuration.
+ *)
+function swscale_configuration(): PAnsiChar;
+  cdecl; external sw__scale;
+
+(**
+ * Return the libswscale license.
+ *)
+function swscale_license(): PAnsiChar;
+  cdecl; external sw__scale;
+
+const
+  (* values for the flags, the stuff on the command line is different *)
+  SWS_FAST_BILINEAR =    1;
+  SWS_BILINEAR      =    2;
+  SWS_BICUBIC       =    4;
+  SWS_X             =    8;
+  SWS_POINT         =  $10;
+  SWS_AREA          =  $20;
+  SWS_BICUBLIN      =  $40;
+  SWS_GAUSS         =  $80;
+  SWS_SINC          = $100;
+  SWS_LANCZOS       = $200;
+  SWS_SPLINE        = $400;
+
+  SWS_SRC_V_CHR_DROP_MASK  = $30000;
+  SWS_SRC_V_CHR_DROP_SHIFT = 16;
+
+  SWS_PARAM_DEFAULT        = 123456;
+
+  SWS_PRINT_INFO           = $1000;
+
+  // the following 3 flags are not completely implemented
+  // internal chrominace subsampling info
+  SWS_FULL_CHR_H_INT    = $2000;
+  // input subsampling info
+  SWS_FULL_CHR_H_INP    = $4000;
+  SWS_DIRECT_BGR        = $8000;
+  SWS_ACCURATE_RND      = $40000;
+  SWS_BITEXACT          = $80000;
+  SWS_ERROR_DIFFUSION   = $800000;
+
+{$IF FF_API_SWS_CPU_CAPS}
+(**
+ * CPU caps are autodetected now, those flags
+ * are only provided for API compatibility.
+ *)
+  SWS_CPU_CAPS_MMX      = $80000000;
+  SWS_CPU_CAPS_MMXEXT   = $20000000;
+  SWS_CPU_CAPS_MMX2     = $20000000;
+  SWS_CPU_CAPS_3DNOW    = $40000000;
+  SWS_CPU_CAPS_ALTIVEC  = $10000000;
+  SWS_CPU_CAPS_BFIN     = $01000000;
+  SWS_CPU_CAPS_SSE2     = $02000000;
+{$IFEND}
+
+  SWS_MAX_REDUCE_CUTOFF = 0.002;
+
+  SWS_CS_ITU709         = 1;
+  SWS_CS_FCC            = 4;
+  SWS_CS_ITU601         = 5;
+  SWS_CS_ITU624         = 5;
+  SWS_CS_SMPTE170M      = 5;
+  SWS_CS_SMPTE240M      = 7;
+  SWS_CS_DEFAULT        = 5;
+
+(**
+ * Return a pointer to yuv<->rgb coefficients for the given colorspace
+ * suitable for sws_setColorspaceDetails().
+ *
+ * @param colorspace One of the SWS_CS_* macros. If invalid,
+ * SWS_CS_DEFAULT is used.
+ *)
+function sws_getCoefficients(colorspace: cint): Pcint;
+  cdecl; external sw__scale;
+  
+type
+
+  // when used for filters they must have an odd number of elements
+  // coeffs cannot be shared between vectors
+  PSwsVector = ^TSwsVector;
+  TSwsVector = record
+    coeff: PCdouble;    // pointer to the list of coefficients
+    length: cint;       // number of coefficients in the vector
+  end;
+
+  // vectors can be shared
+  PSwsFilter = ^TSwsFilter;
+  TSwsFilter = record
+    lumH: PSwsVector;
+    lumV: PSwsVector;
+    chrH: PSwsVector;
+    chrV: PSwsVector;
+  end;
+
+  PSwsContext = ^TSwsContext;
+  TSwsContext = record
+    {internal structure}
+  end;
+
+(**
+ * Return a positive value if pix_fmt is a supported input format, 0
+ * otherwise.
+ *)
+function sws_isSupportedInput(pix_fmt: TAVPixelFormat): cint;
+  cdecl; external sw__scale;
+
+(**
+ * Return a positive value if pix_fmt is a supported output format, 0
+ * otherwise.
+ *)
+function sws_isSupportedOutput(pix_fmt: TAVPixelFormat): cint;
+  cdecl; external sw__scale;
+
+(**
+ * Allocate an empty SwsContext. This must be filled and passed to
+ * sws_init_context(). For filling see AVOptions, options.c and
+ * sws_setColorspaceDetails().
+ *)
+function sws_alloc_context(): PSwsContext;
+  cdecl; external sw__scale;
+
+(**
+ * Initialize the swscaler context sws_context.
+ *
+ * @return zero or positive value on success, a negative value on
+ * error
+ *)
+function sws_init_context(sws_context: PSwsContext; srcFilter: PSwsFilter; dstFilter: PSwsFilter): cint;
+  cdecl; external sw__scale;
+
+(**
+ * Free the swscaler context swsContext.
+ * If swsContext is NULL, then does nothing.
+ *)
+procedure sws_freeContext(swsContext: PSwsContext);
+  cdecl; external sw__scale;
+
+{$IF FF_API_SWS_GETCONTEXT}
+(**
+ * Allocate and return a SwsContext. You need it to perform
+ * scaling/conversion operations using sws_scale().
+ *
+ * @param srcW the width of the source image
+ * @param srcH the height of the source image
+ * @param srcFormat the source image format
+ * @param dstW the width of the destination image
+ * @param dstH the height of the destination image
+ * @param dstFormat the destination image format
+ * @param flags specify which algorithm and options to use for rescaling
+ * @return a pointer to an allocated context, or NULL in case of error
+ * @note this function is to be removed after a saner alternative is
+ *       written
+ * @deprecated Use sws_getCachedContext() instead.
+ *)
+function sws_getContext(srcW: cint; srcH: cint; srcFormat: TAVPixelFormat;
+                        dstW: cint; dstH: cint; dstFormat: TAVPixelFormat;
+                        flags: cint; srcFilter: PSwsFilter;
+                        dstFilter: PSwsFilter; param: PCdouble): PSwsContext;
+  cdecl; external sw__scale;
+{$IFEND}
+
+(**
+ * Scale the image slice in srcSlice and put the resulting scaled
+ * slice in the image in dst. A slice is a sequence of consecutive
+ * rows in an image.
+ *
+ * Slices have to be provided in sequential order, either in
+ * top-bottom or bottom-top order. If slices are provided in
+ * non-sequential order the behavior of the function is undefined.
+ *
+ * @param c         the scaling context previously created with
+ *                  sws_getContext()
+ * @param srcSlice  the array containing the pointers to the planes of
+ *                  the source slice
+ * @param srcStride the array containing the strides for each plane of
+ *                  the source image
+ * @param srcSliceY the position in the source image of the slice to
+ *                  process, that is the number (counted starting from
+ *                  zero) in the image of the first row of the slice
+ * @param srcSliceH the height of the source slice, that is the number
+ *                  of rows in the slice
+ * @param dst       the array containing the pointers to the planes of
+ *                  the destination image
+ * @param dstStride the array containing the strides for each plane of
+ *                  the destination image
+ * @return          the height of the output slice
+ *)
+function sws_scale(c: PSwsContext; {const} srcSlice: PPCuint8Array;
+              {const} srcStride: PCintArray; srcSliceY: cint; srcSliceH: cint; 
+              {const} dst: PPCuint8Array; {const} dstStride: PCintArray): cint;
+  cdecl; external sw__scale;
+
+(**
+ * @param dstRange flag indicating the while-black range of the output (1=jpeg / 0=mpeg)
+ * @param srcRange flag indicating the while-black range of the input (1=jpeg / 0=mpeg)
+ * @param table the yuv2rgb coefficients describing the output yuv space, normally ff_yuv2rgb_coeffs[x]
+ * @param inv_table the yuv2rgb coefficients describing the input yuv space, normally ff_yuv2rgb_coeffs[x]
+ * @param brightness 16.16 fixed point brightness correction
+ * @param contrast 16.16 fixed point contrast correction
+ * @param saturation 16.16 fixed point saturation correction
+ * @return -1 if not supported
+ *)
+function sws_setColorspaceDetails(c: PSwsContext; inv_table: PQuadCintArray; 
+              srcRange: cint; table: PQuadCintArray; dstRange: cint;
+              brightness: cint; contrast: cint; saturation: cint): cint;
+  cdecl; external sw__scale;
+
+(**
+ * @return -1 if not supported
+ *)
+function sws_getColorspaceDetails(c: PSwsContext; var inv_table: PQuadCintArray;
+              var srcRange: cint; var table: PQuadCintArray; var dstRange: cint;
+              var brightness: cint; var contrast: cint; var saturation: cint): cint;
+  cdecl; external sw__scale;
+
+(**
+ * Allocate and return an uninitialized vector with length coefficients.
+ *)
+function sws_allocVec(length: cint): PSwsVector;
+  cdecl; external sw__scale;
+
+(**
+ * Return a normalized Gaussian curve used to filter stuff
+ * quality = 3 is high quality, lower is lower quality.
+ *)
+function sws_getGaussianVec(variance: cdouble; quality: cdouble): PSwsVector;
+  cdecl; external sw__scale;
+
+(**
+ * Allocate and return a vector with length coefficients, all
+ * with the same value c.
+ *)
+function sws_getConstVec(c: cdouble; length: cint): PSwsVector;
+  cdecl; external sw__scale;
+  
+(**
+ * Allocate and return a vector with just one coefficient, with
+ * value 1.0.
+ *)
+function sws_getIdentityVec: PSwsVector;
+  cdecl; external sw__scale;
+
+(**
+ * Scale all the coefficients of a by the scalar value.
+ *)
+procedure sws_scaleVec(a: PSwsVector; scalar: cdouble);
+  cdecl; external sw__scale;
+
+(**
+ * Scale all the coefficients of a so that their sum equals height.
+ *)
+procedure sws_normalizeVec(a: PSwsVector; height: cdouble);
+  cdecl; external sw__scale;
+
+procedure sws_convVec(a: PSwsVector; b: PSwsVector);
+  cdecl; external sw__scale;
+
+procedure sws_addVec(a: PSwsVector; b: PSwsVector);
+  cdecl; external sw__scale;
+
+procedure sws_subVec(a: PSwsVector; b: PSwsVector);
+  cdecl; external sw__scale;
+
+procedure sws_shiftVec(a: PSwsVector; shift: cint);
+  cdecl; external sw__scale;
+
+(**
+ * Allocate and return a clone of the vector a, that is a vector
+ * with the same coefficients as a.
+ *)
+function sws_cloneVec(a: PSwsVector): PSwsVector;
+  cdecl; external sw__scale;
+
+(**
+ * Print with av_log() a textual representation of the vector a
+ * if log_level <= av_log_level.
+ *)
+procedure sws_printVec2(a:         PSwsVector;
+                        log_ctx:   PAVClass; // PAVClass is declared in avcodec.pas
+                        log_level: cint);
+  cdecl; external sw__scale;
+
+procedure sws_freeVec(a: PSwsVector);
+  cdecl; external sw__scale;
+
+function sws_getDefaultFilter(lumaGBlur: cfloat; chromaGBlur: cfloat; 
+                              lumaSharpen: cfloat; chromaSharpen: cfloat;
+                              chromaHShift: cfloat; chromaVShift: cfloat;
+                              verbose: cint): PSwsFilter;
+  cdecl; external sw__scale;
+
+procedure sws_freeFilter(filter: PSwsFilter);
+  cdecl; external sw__scale;
+
+(**
+ * Check if context can be reused, otherwise reallocates a new one.
+ * 
+ * If context is NULL, just calls sws_getContext() to get a new
+ * context. Otherwise, checks if the parameters are the ones already
+ * saved in context. If that is the case, returns the current
+ * context. Otherwise, frees context and gets a new context with
+ * the new parameters.
+ * 
+ * Be warned that srcFilter and dstFilter are not checked, they
+ * are assumed to remain the same.
+ *)
+function sws_getCachedContext(context: PSwsContext;
+              srcW: cint; srcH: cint; srcFormat: TAVPixelFormat;
+              dstW: cint; dstH: cint; dstFormat: TAVPixelFormat;
+              flags: cint; srcFilter: PSwsFilter; 
+              dstFilter: PSwsFilter; param: PCdouble): PSwsContext;
+  cdecl; external sw__scale;
+
+(**
+ * Convert an 8bit paletted frame into a frame with a color depth of 32-bits.
+ *
+ * The output frame will have the same packed format as the palette.
+ *
+ * @param src        source frame buffer
+ * @param dst        destination frame buffer
+ * @param num_pixels number of pixels to convert
+ * @param palette    array with [256] entries, which must match color arrangement (RGB or BGR) of src
+ *)
+procedure sws_convertPalette8ToPacked32({const} src:     PPCuint8Array;
+                                        dst:             PPCuint8Array;
+                                        num_pixels:      cint;
+                                        {const} palette: PPCuint8Array);
+  cdecl; external sw__scale;
+
+(**
+ * Convert an 8bit paletted frame into a frame with a color depth of 24 bits.
+ *
+ * With the palette format "ABCD", the destination frame ends up with the format "ABC".
+ *
+ * @param src        source frame buffer
+ * @param dst        destination frame buffer
+ * @param num_pixels number of pixels to convert
+ * @param palette    array with [256] entries, which must match color arrangement (RGB or BGR) of src
+ *)
+procedure sws_convertPalette8ToPacked24({const} src:     PPCuint8Array;
+                                        dst:             PPCuint8Array;
+                                        num_pixels:      cint;
+                                        {const} palette: PPCuint8Array);
+  cdecl; external sw__scale;
+
+(**
+ * Get the AVClass for swsContext. It can be used in combination with
+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
+ *
+ * @see av_opt_find().
+ *)
+function sws_get_class(): {const} PAVClass;
+  cdecl; external sw__scale;
+
+implementation
+
+end.
diff --git a/src/lib/ffmpeg-2.0/avio.pas b/src/lib/ffmpeg-2.0/avio.pas
new file mode 100644
index 00000000..32ca278f
--- /dev/null
+++ b/src/lib/ffmpeg-2.0/avio.pas
@@ -0,0 +1,598 @@
+(*
+ * copyright (c) 2001 Fabrice Bellard
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * This is a part of Pascal porting of ffmpeg.
+ * - Originally by Victor Zinetz for Delphi and Free Pascal on Windows.
+ * - For Mac OS X, some modifications were made by The Creative CAT, denoted as CAT
+ *   in the source codes.
+ * - Changes and updates by the UltraStar Deluxe Team
+ *
+ * Conversion of libavformat/avio.h
+ * unbuffered I/O operations
+ * @warning This file has to be considered an internal but installed
+ * header, so it should not be directly included in your projects.
+ *
+ * update to
+ * avformat version: 55.12.100
+ *)
+
+unit avio;
+
+{$IFDEF FPC}
+  {$MODE DELPHI }
+  {$PACKENUM 4}    (* use 4-byte enums *)
+  {$PACKRECORDS C} (* C/C++-compatible record packing *)
+{$ELSE}
+  {$MINENUMSIZE 4} (* use 4-byte enums *)
+{$ENDIF}
+
+{$I switches.inc}
+
+interface
+
+uses
+  ctypes,
+  {$IFDEF UNIX}
+  BaseUnix,   // for SEEK_CUR
+  {$ENDIF}
+  avcodec,
+  avutil,
+  SysUtils,
+  UConfig;
+
+(**
+ * Those FF_API_* defines are not part of public API.
+ * They may change, break or disappear at any time.
+ *)
+const
+  FF_API_URL_CLASS            = (LIBAVFORMAT_VERSION_MAJOR >= 53);
+
+const
+  AVIO_SEEKABLE_NORMAL = 0001; (**< Seeking works like for a local file *)
+
+type
+  TReadWriteFunc = function(opaque: Pointer; buf: PByteArray; buf_size: cint): cint; cdecl;
+  TSeekFunc = function(opaque: Pointer; offset: cint64; whence: cint): cint64; cdecl;
+  Tcallback = function(p: pointer): cint; cdecl;
+
+type
+(**
+ * Callback for checking whether to abort blocking functions.
+ * AVERROR_EXIT is returned in this case by the interrupted
+ * function. During blocking operations, callback is called with
+ * opaque as parameter. If the callback returns 1, the
+ * blocking operation will be aborted.
+ *
+ * No members can be added to this struct without a major bump, if
+ * new elements have been added after this struct in AVFormatContext
+ * or AVIOContext.
+ *)
+  PAVIOInterruptCB = ^TAVIOInterruptCB;
+  TAVIOInterruptCB = record
+    callback: Tcallback;
+    opaque: pointer;
+  end; (*TAVIOInterruptCB*)
+
+(**
+ * Bytestream IO Context.
+ * New fields can be added to the end with minor version bumps.
+ * Removal, reordering and changes to existing fields require a major
+ * version bump.
+ * sizeof(AVIOContext) must not be used outside libav*.
+ *
+ * @note None of the function pointers in AVIOContext should be called
+ *       directly, they should only be set by the client application
+ *       when implementing custom I/O. Normally these are set to the
+ *       function pointers specified in avio_alloc_context()
+ *)
+  PPAVIOContext = ^PAVIOContext;
+  PAVIOContext = ^TAVIOContext;
+  TAVIOContext = record
+    (**
+     * A class for private options.
+     *
+     * If this AVIOContext is created by avio_open2(), av_class is set and
+     * passes the options down to protocols.
+     *
+     * If this AVIOContext is manually allocated, then av_class may be set by
+     * the caller.
+     *
+     * warning -- this field can be NULL, be sure to not pass this AVIOContext
+     * to any av_opt_* functions in that case.
+     *)
+    av_class: {const} PAVClass;
+    buffer: PByteArray;  (**< Start of the buffer. *)
+    buffer_size: cint;   (**< Maximum buffer size *)
+    buf_ptr: PByteArray; (**< Current position in the buffer *)
+    buf_end: PByteArray; (**< End of the data, may be less than
+                              buffer+buffer_size if the read function returned
+                              less data than requested, e.g. for streams where
+                              no more data has been received yet. *)
+    opaque: pointer;     (**< A private pointer, passed to the read/write/seek/...
+                              functions. *)
+    read_packet: TReadWriteFunc;
+    write_packet: TReadWriteFunc;
+    seek: TSeekFunc;
+    pos: cint64;         (**< position in the file of the current buffer *)
+    must_flush: cint;    (**< true if the next seek should flush *)
+    eof_reached: cint;   (**< true if eof reached *)
+    write_flag: cint;    (**< true if open for writing *)
+    max_packet_size: cint;
+    checksum: culong;
+    checksum_ptr: PByteArray;
+    update_checksum: function (checksum: culong; buf: {const} PAnsiChar; size: cuint): culong; cdecl;
+    error: cint;         (**< contains the error code or 0 if no error happened *)
+    (**
+     * Pause or resume playback for network streaming protocols - e.g. MMS.
+     *)
+    read_pause: function(opaque: Pointer; pause: cint): cint; cdecl;
+    (**
+     * Seek to a given timestamp in stream with the specified stream_index.
+     * Needed for some network streaming protocols which don't support seeking
+     * to byte position.
+     *)
+    read_seek: function(opaque: Pointer; stream_index: cint;
+                        timestamp: cint64; flags: cint): cint64; cdecl;
+    (**
+     * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
+     *)
+    seekable: cint;
+
+    (**
+     * max filesize, used to limit allocations
+     * This field is internal to libavformat and access from outside is not allowed.
+     *)
+    maxsize: cint64;
+
+    (**
+     * avio_read and avio_write should if possible be satisfied directly
+     * instead of going through a buffer, and avio_seek will always
+     * call the underlying seek function directly.
+     *)
+    direct: cint;
+
+    (**
+     * Bytes read statistic
+     * This field is internal to libavformat and access from outside is not allowed.
+     *)
+    bytes_read: cint64;
+
+    (**
+     * seek statistic
+     * This field is internal to libavformat and access from outside is not allowed.
+     *)
+    seek_count: cint;
+
+    (**
+     * writeout statistic
+     * This field is internal to libavformat and access from outside is not allowed.
+     *)
+    writeout_count: cint;
+  end;
+
+(* unbuffered I/O *)
+
+(**
+ * Return AVIO_* access flags corresponding to the access permissions
+ * of the resource in url, or a negative value corresponding to an
+ * AVERROR code in case of failure. The returned access flags are
+ * masked by the value in flags.
+ *
+ * @note This function is intrinsically unsafe, in the sense that the
+ * checked resource may change its existence or permission status from
+ * one call to another. Thus you should not trust the returned value,
+ * unless you are sure that no other processes are accessing the
+ * checked resource.
+ *)
+function avio_check(url: {const} PAnsiChar; flags: cint): cint;
+  cdecl; external av__format;
+
+(**
+ * Allocate and initialize an AVIOContext for buffered I/O. It must be later
+ * freed with av_free().
+ *
+ * @param buffer Memory block for input/output operations via AVIOContext.
+ *        The buffer must be allocated with av_malloc() and friends.
+ * @param buffer_size The buffer size is very important for performance.
+ *        For protocols with fixed blocksize it should be set to this blocksize.
+ *        For others a typical size is a cache page, e.g. 4kb.
+ * @param write_flag Set to 1 if the buffer should be writable, 0 otherwise.
+ * @param opaque An opaque pointer to user-specific data.
+ * @param read_packet  A function for refilling the buffer, may be NULL.
+ * @param write_packet A function for writing the buffer contents, may be NULL.
+ *        The function may not change the input buffers content.
+ * @param seek A function for seeking to specified byte position, may be NULL.
+ *
+ * @return Allocated AVIOContext or NULL on failure.
+ *)
+function avio_alloc_context(
+                  buffer: PAnsiChar;
+                  buffer_size: cint;
+                  write_flag: cint;
+                  opaque: Pointer;
+                  read_packet: TReadWriteFunc;
+                  write_packet: TReadWriteFunc;
+                  seek: TSeekFunc): PAVIOContext;
+  cdecl; external av__format;
+		  
+procedure avio_w8(s: PAVIOContext; b: cint);
+  cdecl; external av__format;
+procedure avio_write(s: PAVIOContext; buf: {const} PAnsiChar; size: cint);
+  cdecl; external av__format;
+procedure avio_wl64(s: PAVIOContext; val: cuint64);
+  cdecl; external av__format;
+procedure avio_wb64(s: PAVIOContext; val: cuint64);
+  cdecl; external av__format;
+procedure avio_wl32(s: PAVIOContext; val: cuint);
+  cdecl; external av__format;
+procedure avio_wb32(s: PAVIOContext; val: cuint);
+  cdecl; external av__format;
+procedure avio_wl24(s: PAVIOContext; val: cuint);
+  cdecl; external av__format;
+procedure avio_wb24(s: PAVIOContext; val: cuint);
+  cdecl; external av__format;
+procedure avio_wl16(s: PAVIOContext; val: cuint);
+  cdecl; external av__format;
+procedure avio_wb16(s: PAVIOContext; val: cuint);
+  cdecl; external av__format;
+
+(**
+ * Write a NULL-terminated string.
+ * @return number of bytes written.
+ *)
+function avio_put_str(s: PAVIOContext; str: {const} PAnsiChar): cint;
+  cdecl; external av__format;
+
+(**
+ * Convert an UTF-8 string to UTF-16LE and write it.
+ * @return number of bytes written.
+ *)
+function avio_put_str16le(s: PAVIOContext; str: {const} PAnsiChar): cint;
+  cdecl; external av__format;
+
+const
+(**
+ * Passing this as the "whence" parameter to a seek function causes it to
+ * return the filesize without seeking anywhere. Supporting this is optional.
+ * If it is not supported then the seek function will return <0.
+ *)
+  AVSEEK_SIZE = $10000;
+
+(**
+ * Oring this flag as into the "whence" parameter to a seek function causes it to
+ * seek by any means (like reopening and linear reading) or other normally unreasonable
+ * means that can be extremely slow.
+ * This may be ignored by the seek code.
+ *)
+  AVSEEK_FORCE = $20000;
+
+(**
+ * fseek() equivalent for AVIOContext.
+ * @return new position or AVERROR.
+ *)
+function avio_seek(s: PAVIOContext; offset: cint64; whence: cint): cint64;
+  cdecl; external av__format;
+
+(**
+ * Skip given number of bytes forward
+ * @return new position or AVERROR.
+ *)
+function avio_skip(s: PAVIOContext; offset: cint64): cint64;
+  cdecl; external av__format;
+
+{$IFDEF UNIX}
+(**
+ * ftell() equivalent for AVIOContext.
+ * @return position or AVERROR.
+ *)
+function avio_tell(s: PAVIOContext): cint64; {$IFDEF HasInline}inline;{$ENDIF}
+{$ELSE}
+{$ENDIF}
+
+(**
+ * Get the filesize.
+ * @return filesize or AVERROR
+ *)
+function avio_size(s: PAVIOContext): cint64;
+  cdecl; external av__format;
+
+(**
+ * feof() equivalent for AVIOContext.
+ * @return non zero if and only if end of file
+ *)
+function url_feof(s: PAVIOContext): cint;
+  cdecl; external av__format;
+  
+(** @warning currently size is limited *)
+function avio_printf(s: PAVIOContext; fmt: {const} PAnsiChar; args: array of const): cint;
+  cdecl; external av__format;
+
+(**
+ * Force flushing of buffered data to the output s.
+ *
+ * Force the buffered data to be immediately written to the output,
+ * without to wait to fill the internal buffer.
+ *)
+procedure avio_flush(s: PAVIOContext);
+  cdecl; external av__format;
+
+(**
+ * Read size bytes from AVIOContext into buf.
+ * @return number of bytes read or AVERROR
+ *)
+function avio_read(s: PAVIOContext; buf: Pbyte; size: cint): cint;
+  cdecl; external av__format;
+
+(**
+ * @name Functions for reading from AVIOContext
+ * @
+ *
+ * @note return 0 if EOF, so you cannot use it if EOF handling is
+ *       necessary
+ *)
+function avio_r8(s: PAVIOContext): cint;
+  cdecl; external av__format;
+
+function avio_rl16(s: PAVIOContext): cuint;
+  cdecl; external av__format;
+
+function avio_rl24(s: PAVIOContext): cuint;
+  cdecl; external av__format;
+
+function avio_rl32(s: PAVIOContext): cuint;
+  cdecl; external av__format;
+
+function avio_rl64(s: PAVIOContext): cuint64;
+  cdecl; external av__format;
+
+function avio_rb16(s: PAVIOContext): cuint;
+  cdecl; external av__format;
+
+function avio_rb24(s: PAVIOContext): cuint;
+  cdecl; external av__format;
+
+function avio_rb32(s: PAVIOContext): cuint;
+  cdecl; external av__format;
+
+function avio_rb64(s: PAVIOContext): cuint64;
+  cdecl; external av__format;
+
+(**
+ * @
+ *)
+(**
+ * Read a string from pb into buf. The reading will terminate when either
+ * a NULL character was encountered, maxlen bytes have been read, or nothing
+ * more can be read from pb. The result is guaranteed to be NULL-terminated, it
+ * will be truncated if buf is too small.
+ * Note that the string is not interpreted or validated in any way, it
+ * might get truncated in the middle of a sequence for multi-byte encodings.
+ *
+ * @return number of bytes read (is always <= maxlen).
+ * If reading ends on EOF or error, the return value will be one more than
+ * bytes actually read.
+ *)
+function avio_get_str(pb: PAVIOContext; maxlen: cint; buf: PAnsiChar; buflen: cint): cint;
+  cdecl; external av__format;
+
+(**
+ * Read a UTF-16 string from pb and convert it to UTF-8.
+ * The reading will terminate when either a null or invalid character was
+ * encountered or maxlen bytes have been read.
+ * @return number of bytes read (is always <= maxlen)
+ *)
+function avio_get_str16le(pb: PAVIOContext; maxlen: cint; buf: PAnsiChar; buflen: cint): cint;
+  cdecl; external av__format;
+
+function avio_get_str16be(pb: PAVIOContext; maxlen: cint; buf: PAnsiChar; buflen: cint): cint;
+  cdecl; external av__format;
+
+(**
+ * @name URL open modes
+ * The flags argument to avio_open must be one of the following
+ * constants, optionally ORed with other flags.
+ * @{
+ *)
+const
+  AVIO_FLAG_READ  = 1;                                      (**< read-only *)
+  AVIO_FLAG_WRITE = 2;                                      (**< write-only *)
+  AVIO_FLAG_READ_WRITE = {(AVIO_FLAG_READ|AVIO_FLAG_WRITE)} 3;  (**< read-write pseudo flag *)
+(**
+ * @
+ *)
+
+const
+(**
+ * Use non-blocking mode.
+ * If this flag is set, operations on the context will return
+ * AVERROR(EAGAIN) if they can not be performed immediately.
+ * If this flag is not set, operations on the context will never return
+ * AVERROR(EAGAIN).
+ * Note that this flag does not affect the opening/connecting of the
+ * context. Connecting a protocol will always block if necessary (e.g. on
+ * network protocols) but never hang (e.g. on busy devices).
+ * Warning:  non-blocking protocols is work-in-progress; this flag may be
+ * silently ignored.
+ *)
+  AVIO_FLAG_NONBLOCK = 8;    
+
+(**
+ * Use direct mode.
+ * avio_read and avio_write should if possible be satisfied directly
+ * instead of going through a buffer, and avio_seek will always
+ * call the underlying seek function directly.
+ *)
+  AVIO_FLAG_DIRECT = $8000;
+
+(**
+ * Create and initialize a AVIOContext for accessing the
+ * resource indicated by url.
+ * @note When the resource indicated by url has been opened in
+ * read+write mode, the AVIOContext can be used only for writing.
+ *
+ * @param s Used to return the pointer to the created AVIOContext.
+ * In case of failure the pointed to value is set to NULL.
+ * @param flags flags which control how the resource indicated by url
+ * is to be opened
+ * @return 0 in case of success, a negative value corresponding to an
+ * AVERROR code in case of failure
+ *)
+function avio_open(s: PPAVIOContext; url: {const} PAnsiChar; flags: cint): cint;
+  cdecl; external av__format;
+
+(**
+ * Create and initialize a AVIOContext for accessing the
+ * resource indicated by url.
+ * @note When the resource indicated by url has been opened in
+ * read+write mode, the AVIOContext can be used only for writing.
+ *
+ * @param s Used to return the pointer to the created AVIOContext.
+ * In case of failure the pointed to value is set to NULL.
+ * @param flags flags which control how the resource indicated by url
+ * is to be opened
+ * @param int_cb an interrupt callback to be used at the protocols level
+ * @param options  A dictionary filled with protocol-private options. On return
+ * this parameter will be destroyed and replaced with a dict containing options
+ * that were not found. May be NULL.
+ * @return 0 in case of success, a negative value corresponding to an
+ * AVERROR code in case of failure
+ *)
+function avio_open2(s: PPAVIOContext; {const} url: PAnsiChar; flags: cint;
+	{const} int_cb: PAVIOInterruptCB; options: PPAVDictionary): cint;
+  cdecl; external av__format;
+
+(**
+ * Close the resource accessed by the AVIOContext s and free it.
+ * This function can only be used if s was opened by avio_open().
+ *
+ * The internal buffer is automatically flushed before closing the
+ * resource.
+ *
+ * @return 0 on success, an AVERROR < 0 on error.
+ * @see avio_close
+ *)
+function avio_close(s: PAVIOContext): cint;
+  cdecl; external av__format;
+
+(**
+ * Close the resource accessed by the AVIOContext *s, free it
+ * and set the pointer pointing to it to NULL.
+ * This function can only be used if s was opened by avio_open().
+ *
+ * The internal buffer is automatically flushed before closing the
+ * resource.
+ *
+ * @return 0 on success, an AVERROR < 0 on error.
+ * @see avio_close
+ *)
+function avio_closep(s: PPAVIOContext): cint;
+  cdecl; external av__format;
+
+(**
+ * Open a write only memory stream.
+ *
+ * @param s new IO context
+ * @return zero if no error.
+ *)
+function avio_open_dyn_buf(s: PPAVIOContext): cint;
+  cdecl; external av__format;
+
+(**
+ * Return the written size and a pointer to the buffer. The buffer
+ * must be freed with av_free().
+ * Padding of FF_INPUT_BUFFER_PADDING_SIZE is added to the buffer.
+ *
+ * @param s IO context
+ * @param pbuffer pointer to a byte buffer
+ * @return the length of the byte buffer
+ *)
+function avio_close_dyn_buf(s: PAVIOContext; var pbuffer: Pcuint8): cint;
+  cdecl; external av__format;
+
+(**
+ * Iterate through names of available protocols.
+ *
+ * @param opaque A private pointer representing current protocol.
+ *        It must be a pointer to NULL on first iteration and will
+ *        be updated by successive calls to avio_enum_protocols.
+ * @param output If set to 1, iterate over output protocols,
+ *               otherwise over input protocols.
+ *
+ * @return A static string containing the name of current protocol or NULL
+ *)
+function avio_enum_protocols(var opaque: Pointer; output: cint): {const} PAnsiChar;
+  cdecl; external av__format;
+
+(**
+ * Pause and resume playing - only meaningful if using a network streaming
+ * protocol (e.g. MMS).
+ * @param pause 1 for pause, 0 for resume
+ *)
+function avio_pause(h: PAVIOContext; pause: cint): cint;
+  cdecl; external av__format;
+
+(**
+ * Seek to a given timestamp relative to some component stream.
+ * Only meaningful if using a network streaming protocol (e.g. MMS.).
+ * @param stream_index The stream index that the timestamp is relative to.
+ *        If stream_index is (-1) the timestamp should be in AV_TIME_BASE
+ *        units from the beginning of the presentation.
+ *        If a stream_index >= 0 is used and the protocol does not support
+ *        seeking based on component streams, the call will fail with ENOTSUP.
+ * @param timestamp timestamp in AVStream.time_base units
+ *        or if there is no stream specified then in AV_TIME_BASE units.
+ * @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE
+ *        and AVSEEK_FLAG_ANY. The protocol may silently ignore
+ *        AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will
+ *        fail with ENOTSUP if used and not supported.
+ * @return >= 0 on success
+ * @see AVInputFormat: : read_seek
+ *)
+function avio_seek_time(h: PAVIOContext; stream_index: cint;
+                        timestamp: cint64; flags: cint): cint64;
+  cdecl; external av__format;
+
+implementation
+
+(**
+ * For SEEK_CUR on Windows
+ * values taken from stdio.h of C
+ *)
+{$IFNDEF SEEK_SET}
+const
+  SEEK_SET = 0;
+{$ENDIF}
+
+{$IFNDEF SEEK_CUR}
+const
+  SEEK_CUR = 1;
+{$ENDIF}
+
+{$IFNDEF SEEK_END}
+const
+  SEEK_END = 2;
+{$ENDIF}
+
+function avio_tell(s: PAVIOContext): cint64; {$IFDEF HasInline}inline;{$ENDIF}
+begin
+  Result := avio_seek(s, 0, SEEK_CUR);
+end;
+
+
+end.
diff --git a/src/lib/ffmpeg-2.0/swscale.pas b/src/lib/ffmpeg-2.0/swscale.pas
new file mode 100644
index 00000000..6bcd3638
--- /dev/null
+++ b/src/lib/ffmpeg-2.0/swscale.pas
@@ -0,0 +1,486 @@
+(*
+ * Copyright (C) 2001-2011 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * FFmpeg Pascal port
+ * - Ported by the UltraStar Deluxe Team
+ *
+ * Conversion of libswscale/swscale.h
+ * version: 2.3.100
+ *)
+ 
+unit swscale;
+
+{$IFDEF FPC}
+  {$MODE DELPHI }
+  {$PACKENUM 4}    (* use 4-byte enums *)
+  {$PACKRECORDS C} (* C/C++-compatible record packing *)
+{$ELSE}
+  {$MINENUMSIZE 4} (* use 4-byte enums *)
+{$ENDIF}
+
+{$IFDEF DARWIN}
+  {$linklib libswscale}
+{$ENDIF}
+
+interface
+
+uses
+  ctypes,
+  avutil,
+  avcodec,
+  UConfig;
+
+const
+(*
+ * IMPORTANT: The official FFmpeg C headers change very quickly. Often some
+ * of the data structures are changed so that they become incompatible with
+ * older header files. The Pascal headers have to be adjusted to those changes,
+ * otherwise the application might crash randomly or strange bugs (not
+ * necessarily related to video or audio due to buffer overflows etc.) might
+ * occur.
+ *
+ * In the past users reported problems with USDX that took hours to fix and
+ * the problem was an unsupported version of FFmpeg. So we decided to disable
+ * support for future versions of FFmpeg until the headers are revised by us
+ * for that version as they otherwise most probably will break USDX.
+ *
+ * If the headers do not yet support your FFmpeg version you may want to
+ * adjust the max. version numbers manually but please note: it may work but
+ * in many cases it does not. The USDX team does NOT PROVIDE ANY SUPPORT
+ * for the game if the MAX. VERSION WAS CHANGED.
+ *
+ * The only safe way to support new versions of FFmpeg is to add the changes
+ * of the FFmpeg git repository C headers to the Pascal headers.
+ * You can accelerate this process by posting a patch with the git changes
+ * translated to Pascal to our bug tracker (please join our IRC chat before
+ * you start working on it). Simply adjusting the max. versions is NOT a valid
+ * fix. 
+ *)
+
+  (* Max. supported version by this header *)
+  LIBSWSCALE_MAX_VERSION_MAJOR   =  2;
+  LIBSWSCALE_MAX_VERSION_MINOR   =  3;
+  LIBSWSCALE_MAX_VERSION_RELEASE =  100;
+  LIBSWSCALE_MAX_VERSION = (LIBSWSCALE_MAX_VERSION_MAJOR * VERSION_MAJOR) +
+                           (LIBSWSCALE_MAX_VERSION_MINOR * VERSION_MINOR) +
+                           (LIBSWSCALE_MAX_VERSION_RELEASE * VERSION_RELEASE);
+
+(* Check if linked versions are supported *)
+{$IF (LIBSWSCALE_VERSION > LIBSWSCALE_MAX_VERSION)}
+  {$MESSAGE Error 'Linked version of libswscale is not yet supported!'}
+{$IFEND}
+
+type
+  TQuadCintArray = array[0..3] of cint;
+  PQuadCintArray = ^TQuadCintArray;
+  TCintArray = array[0..0] of cint;
+  PCintArray = ^TCintArray;
+  TPCuint8Array = array[0..0] of PCuint8;
+  PPCuint8Array = ^TPCuint8Array;
+
+(* libswscale/version.h start *)
+
+const
+(**
+ * FF_API_* defines may be placed below to indicate public API that will be
+ * dropped at a future version bump. The defines themselves are not part of
+ * the public API and may change, break or disappear at any time.
+ *)
+{$ifndef FF_API_SWS_GETCONTEXT}
+  FF_API_SWS_GETCONTEXT = LIBSWSCALE_VERSION_MAJOR < 3;    
+{$endif}
+{$ifndef FF_API_SWS_CPU_CAPS}
+  FF_API_SWS_CPU_CAPS = LIBSWSCALE_VERSION_MAJOR < 3;    
+{$endif}
+{$ifndef FF_API_SWS_FORMAT_NAME}
+  FF_API_SWS_FORMAT_NAME = LIBSWSCALE_VERSION_MAJOR < 3;    
+{$endif}
+
+(* libswscale/version.h end *)
+
+(**
+ * Return the LIBSWSCALE_VERSION_INT constant.
+ *)
+function swscale_version(): cuint;
+  cdecl; external sw__scale;
+
+(**
+ * Return the libswscale build-time configuration.
+ *)
+function swscale_configuration(): PAnsiChar;
+  cdecl; external sw__scale;
+
+(**
+ * Return the libswscale license.
+ *)
+function swscale_license(): PAnsiChar;
+  cdecl; external sw__scale;
+
+const
+  (* values for the flags, the stuff on the command line is different *)
+  SWS_FAST_BILINEAR =    1;
+  SWS_BILINEAR      =    2;
+  SWS_BICUBIC       =    4;
+  SWS_X             =    8;
+  SWS_POINT         =  $10;
+  SWS_AREA          =  $20;
+  SWS_BICUBLIN      =  $40;
+  SWS_GAUSS         =  $80;
+  SWS_SINC          = $100;
+  SWS_LANCZOS       = $200;
+  SWS_SPLINE        = $400;
+
+  SWS_SRC_V_CHR_DROP_MASK  = $30000;
+  SWS_SRC_V_CHR_DROP_SHIFT = 16;
+
+  SWS_PARAM_DEFAULT        = 123456;
+
+  SWS_PRINT_INFO           = $1000;
+
+  // the following 3 flags are not completely implemented
+  // internal chrominace subsampling info
+  SWS_FULL_CHR_H_INT    = $2000;
+  // input subsampling info
+  SWS_FULL_CHR_H_INP    = $4000;
+  SWS_DIRECT_BGR        = $8000;
+  SWS_ACCURATE_RND      = $40000;
+  SWS_BITEXACT          = $80000;
+
+{$IF FF_API_SWS_CPU_CAPS}
+(**
+ * CPU caps are autodetected now, those flags
+ * are only provided for API compatibility.
+ *)
+  SWS_CPU_CAPS_MMX      = $80000000;
+  SWS_CPU_CAPS_MMXEXT   = $20000000;
+  SWS_CPU_CAPS_MMX2     = $20000000;
+  SWS_CPU_CAPS_3DNOW    = $40000000;
+  SWS_CPU_CAPS_ALTIVEC  = $10000000;
+  SWS_CPU_CAPS_BFIN     = $01000000;
+  SWS_CPU_CAPS_SSE2     = $02000000;
+{$IFEND}
+
+  SWS_MAX_REDUCE_CUTOFF = 0.002;
+
+  SWS_CS_ITU709         = 1;
+  SWS_CS_FCC            = 4;
+  SWS_CS_ITU601         = 5;
+  SWS_CS_ITU624         = 5;
+  SWS_CS_SMPTE170M      = 5;
+  SWS_CS_SMPTE240M      = 7;
+  SWS_CS_DEFAULT        = 5;
+
+(**
+ * Return a pointer to yuv<->rgb coefficients for the given colorspace
+ * suitable for sws_setColorspaceDetails().
+ *
+ * @param colorspace One of the SWS_CS_* macros. If invalid,
+ * SWS_CS_DEFAULT is used.
+ *)
+function sws_getCoefficients(colorspace: cint): Pcint;
+  cdecl; external sw__scale;
+  
+type
+
+  // when used for filters they must have an odd number of elements
+  // coeffs cannot be shared between vectors
+  PSwsVector = ^TSwsVector;
+  TSwsVector = record
+    coeff: PCdouble;    // pointer to the list of coefficients
+    length: cint;       // number of coefficients in the vector
+  end;
+
+  // vectors can be shared
+  PSwsFilter = ^TSwsFilter;
+  TSwsFilter = record
+    lumH: PSwsVector;
+    lumV: PSwsVector;
+    chrH: PSwsVector;
+    chrV: PSwsVector;
+  end;
+
+  PSwsContext = ^TSwsContext;
+  TSwsContext = record
+    {internal structure}
+  end;
+
+(**
+ * Return a positive value if pix_fmt is a supported input format, 0
+ * otherwise.
+ *)
+function sws_isSupportedInput(pix_fmt: TAVPixelFormat): cint;
+  cdecl; external sw__scale;
+
+(**
+ * Return a positive value if pix_fmt is a supported output format, 0
+ * otherwise.
+ *)
+function sws_isSupportedOutput(pix_fmt: TAVPixelFormat): cint;
+  cdecl; external sw__scale;
+
+(**
+ * @param[in]  pix_fmt the pixel format
+ * @return a positive value if an endianness conversion for pix_fmt is
+ * supported, 0 otherwise.
+ *)
+function sws_isSupportedEndiannessConversion(pix_fmt: TAVPixelFormat): cint;
+  cdecl; external sw__scale;
+
+(**
+ * Allocate an empty SwsContext. This must be filled and passed to
+ * sws_init_context(). For filling see AVOptions, options.c and
+ * sws_setColorspaceDetails().
+ *)
+function sws_alloc_context(): PSwsContext;
+  cdecl; external sw__scale;
+
+(**
+ * Initialize the swscaler context sws_context.
+ *
+ * @return zero or positive value on success, a negative value on
+ * error
+ *)
+function sws_init_context(sws_context: PSwsContext; srcFilter: PSwsFilter; dstFilter: PSwsFilter): cint;
+  cdecl; external sw__scale;
+
+(**
+ * Free the swscaler context swsContext.
+ * If swsContext is NULL, then does nothing.
+ *)
+procedure sws_freeContext(swsContext: PSwsContext);
+  cdecl; external sw__scale;
+
+{$IF FF_API_SWS_GETCONTEXT}
+(**
+ * Allocate and return a SwsContext. You need it to perform
+ * scaling/conversion operations using sws_scale().
+ *
+ * @param srcW the width of the source image
+ * @param srcH the height of the source image
+ * @param srcFormat the source image format
+ * @param dstW the width of the destination image
+ * @param dstH the height of the destination image
+ * @param dstFormat the destination image format
+ * @param flags specify which algorithm and options to use for rescaling
+ * @return a pointer to an allocated context, or NULL in case of error
+ * @note this function is to be removed after a saner alternative is
+ *       written
+ * @deprecated Use sws_getCachedContext() instead.
+ *)
+function sws_getContext(srcW: cint; srcH: cint; srcFormat: TAVPixelFormat;
+                        dstW: cint; dstH: cint; dstFormat: TAVPixelFormat;
+                        flags: cint; srcFilter: PSwsFilter;
+                        dstFilter: PSwsFilter; param: PCdouble): PSwsContext;
+  cdecl; external sw__scale;
+{$IFEND}
+
+(**
+ * Scale the image slice in srcSlice and put the resulting scaled
+ * slice in the image in dst. A slice is a sequence of consecutive
+ * rows in an image.
+ *
+ * Slices have to be provided in sequential order, either in
+ * top-bottom or bottom-top order. If slices are provided in
+ * non-sequential order the behavior of the function is undefined.
+ *
+ * @param c         the scaling context previously created with
+ *                  sws_getContext()
+ * @param srcSlice  the array containing the pointers to the planes of
+ *                  the source slice
+ * @param srcStride the array containing the strides for each plane of
+ *                  the source image
+ * @param srcSliceY the position in the source image of the slice to
+ *                  process, that is the number (counted starting from
+ *                  zero) in the image of the first row of the slice
+ * @param srcSliceH the height of the source slice, that is the number
+ *                  of rows in the slice
+ * @param dst       the array containing the pointers to the planes of
+ *                  the destination image
+ * @param dstStride the array containing the strides for each plane of
+ *                  the destination image
+ * @return          the height of the output slice
+ *)
+function sws_scale(c: PSwsContext; {const} srcSlice: PPCuint8Array;
+              {const} srcStride: PCintArray; srcSliceY: cint; srcSliceH: cint; 
+              {const} dst: PPCuint8Array; {const} dstStride: PCintArray): cint;
+  cdecl; external sw__scale;
+
+(**
+ * @param dstRange flag indicating the while-black range of the output (1=jpeg / 0=mpeg)
+ * @param srcRange flag indicating the while-black range of the input (1=jpeg / 0=mpeg)
+ * @param table the yuv2rgb coefficients describing the output yuv space, normally ff_yuv2rgb_coeffs[x]
+ * @param inv_table the yuv2rgb coefficients describing the input yuv space, normally ff_yuv2rgb_coeffs[x]
+ * @param brightness 16.16 fixed point brightness correction
+ * @param contrast 16.16 fixed point contrast correction
+ * @param saturation 16.16 fixed point saturation correction
+ * @return -1 if not supported
+ *)
+function sws_setColorspaceDetails(c: PSwsContext; inv_table: PQuadCintArray; 
+              srcRange: cint; table: PQuadCintArray; dstRange: cint;
+              brightness: cint; contrast: cint; saturation: cint): cint;
+  cdecl; external sw__scale;
+
+(**
+ * @return -1 if not supported
+ *)
+function sws_getColorspaceDetails(c: PSwsContext; var inv_table: PQuadCintArray;
+              var srcRange: cint; var table: PQuadCintArray; var dstRange: cint;
+              var brightness: cint; var contrast: cint; var saturation: cint): cint;
+  cdecl; external sw__scale;
+
+(**
+ * Allocate and return an uninitialized vector with length coefficients.
+ *)
+function sws_allocVec(length: cint): PSwsVector;
+  cdecl; external sw__scale;
+
+(**
+ * Return a normalized Gaussian curve used to filter stuff
+ * quality = 3 is high quality, lower is lower quality.
+ *)
+function sws_getGaussianVec(variance: cdouble; quality: cdouble): PSwsVector;
+  cdecl; external sw__scale;
+
+(**
+ * Allocate and return a vector with length coefficients, all
+ * with the same value c.
+ *)
+function sws_getConstVec(c: cdouble; length: cint): PSwsVector;
+  cdecl; external sw__scale;
+  
+(**
+ * Allocate and return a vector with just one coefficient, with
+ * value 1.0.
+ *)
+function sws_getIdentityVec: PSwsVector;
+  cdecl; external sw__scale;
+
+(**
+ * Scale all the coefficients of a by the scalar value.
+ *)
+procedure sws_scaleVec(a: PSwsVector; scalar: cdouble);
+  cdecl; external sw__scale;
+
+(**
+ * Scale all the coefficients of a so that their sum equals height.
+ *)
+procedure sws_normalizeVec(a: PSwsVector; height: cdouble);
+  cdecl; external sw__scale;
+
+procedure sws_convVec(a: PSwsVector; b: PSwsVector);
+  cdecl; external sw__scale;
+
+procedure sws_addVec(a: PSwsVector; b: PSwsVector);
+  cdecl; external sw__scale;
+
+procedure sws_subVec(a: PSwsVector; b: PSwsVector);
+  cdecl; external sw__scale;
+
+procedure sws_shiftVec(a: PSwsVector; shift: cint);
+  cdecl; external sw__scale;
+
+(**
+ * Allocate and return a clone of the vector a, that is a vector
+ * with the same coefficients as a.
+ *)
+function sws_cloneVec(a: PSwsVector): PSwsVector;
+  cdecl; external sw__scale;
+
+(**
+ * Print with av_log() a textual representation of the vector a
+ * if log_level <= av_log_level.
+ *)
+procedure sws_printVec2(a:         PSwsVector;
+                        log_ctx:   PAVClass; // PAVClass is declared in avcodec.pas
+                        log_level: cint);
+  cdecl; external sw__scale;
+
+procedure sws_freeVec(a: PSwsVector);
+  cdecl; external sw__scale;
+
+function sws_getDefaultFilter(lumaGBlur: cfloat; chromaGBlur: cfloat; 
+                              lumaSharpen: cfloat; chromaSharpen: cfloat;
+                              chromaHShift: cfloat; chromaVShift: cfloat;
+                              verbose: cint): PSwsFilter;
+  cdecl; external sw__scale;
+
+procedure sws_freeFilter(filter: PSwsFilter);
+  cdecl; external sw__scale;
+
+(**
+ * Check if context can be reused, otherwise reallocates a new one.
+ * 
+ * If context is NULL, just calls sws_getContext() to get a new
+ * context. Otherwise, checks if the parameters are the ones already
+ * saved in context. If that is the case, returns the current
+ * context. Otherwise, frees context and gets a new context with
+ * the new parameters.
+ * 
+ * Be warned that srcFilter and dstFilter are not checked, they
+ * are assumed to remain the same.
+ *)
+function sws_getCachedContext(context: PSwsContext;
+              srcW: cint; srcH: cint; srcFormat: TAVPixelFormat;
+              dstW: cint; dstH: cint; dstFormat: TAVPixelFormat;
+              flags: cint; srcFilter: PSwsFilter; 
+              dstFilter: PSwsFilter; param: PCdouble): PSwsContext;
+  cdecl; external sw__scale;
+
+(**
+ * Convert an 8bit paletted frame into a frame with a color depth of 32-bits.
+ *
+ * The output frame will have the same packed format as the palette.
+ *
+ * @param src        source frame buffer
+ * @param dst        destination frame buffer
+ * @param num_pixels number of pixels to convert
+ * @param palette    array with [256] entries, which must match color arrangement (RGB or BGR) of src
+ *)
+procedure sws_convertPalette8ToPacked32({const} src:     PPCuint8Array;
+                                        dst:             PPCuint8Array;
+                                        num_pixels:      cint;
+                                        {const} palette: PPCuint8Array);
+  cdecl; external sw__scale;
+
+(**
+ * Convert an 8bit paletted frame into a frame with a color depth of 24 bits.
+ *
+ * With the palette format "ABCD", the destination frame ends up with the format "ABC".
+ *
+ * @param src        source frame buffer
+ * @param dst        destination frame buffer
+ * @param num_pixels number of pixels to convert
+ * @param palette    array with [256] entries, which must match color arrangement (RGB or BGR) of src
+ *)
+procedure sws_convertPalette8ToPacked24({const} src:     PPCuint8Array;
+                                        dst:             PPCuint8Array;
+                                        num_pixels:      cint;
+                                        {const} palette: PPCuint8Array);
+  cdecl; external sw__scale;
+
+(**
+ * Get the AVClass for swsContext. It can be used in combination with
+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
+ *
+ * @see av_opt_find().
+ *)
+function sws_get_class(): {const} PAVClass;
+  cdecl; external sw__scale;
+
+implementation
+
+end.
-- 
cgit v1.2.3