From 6d24f7e18105ec3afbc05b7053b562150e61fc0b Mon Sep 17 00:00:00 2001 From: APTX Date: Sat, 9 Apr 2011 14:50:42 +0200 Subject: [PATCH] Add all windows build dependencies. --- windeps/include/GL/glut.h | 716 +++ windeps/include/libavcodec/avcodec.h | 4196 +++++++++++++++++ windeps/include/libavcodec/avfft.h | 99 + windeps/include/libavcodec/dxva2.h | 68 + windeps/include/libavcodec/opt.h | 55 + windeps/include/libavcodec/vaapi.h | 167 + windeps/include/libavcodec/vdpau.h | 88 + windeps/include/libavcodec/xvmc.h | 172 + windeps/include/libavcore/audioconvert.h | 95 + windeps/include/libavcore/avcore.h | 70 + windeps/include/libavcore/imgutils.h | 147 + windeps/include/libavcore/parseutils.h | 75 + windeps/include/libavcore/samplefmt.h | 72 + windeps/include/libavdevice/avdevice.h | 58 + windeps/include/libavfilter/avfilter.h | 860 ++++ windeps/include/libavfilter/avfiltergraph.h | 122 + windeps/include/libavformat/avformat.h | 1619 +++++++ windeps/include/libavformat/avio.h | 576 +++ windeps/include/libavutil/adler32.h | 42 + windeps/include/libavutil/attributes.h | 121 + windeps/include/libavutil/avassert.h | 66 + windeps/include/libavutil/avconfig.h | 6 + windeps/include/libavutil/avstring.h | 133 + windeps/include/libavutil/avutil.h | 104 + windeps/include/libavutil/base64.h | 54 + windeps/include/libavutil/bswap.h | 124 + windeps/include/libavutil/common.h | 370 ++ windeps/include/libavutil/cpu.h | 52 + windeps/include/libavutil/crc.h | 44 + windeps/include/libavutil/error.h | 83 + windeps/include/libavutil/eval.h | 146 + windeps/include/libavutil/fifo.h | 116 + windeps/include/libavutil/file.h | 51 + .../include/libavutil/intfloat_readwrite.h | 40 + windeps/include/libavutil/intreadwrite.h | 522 ++ windeps/include/libavutil/lfg.h | 62 + windeps/include/libavutil/log.h | 149 + windeps/include/libavutil/lzo.h | 66 + windeps/include/libavutil/mathematics.h | 112 + windeps/include/libavutil/md5.h | 36 + windeps/include/libavutil/mem.h | 134 + windeps/include/libavutil/opt.h | 226 + windeps/include/libavutil/pixdesc.h | 166 + windeps/include/libavutil/pixfmt.h | 163 + windeps/include/libavutil/random_seed.h | 31 + windeps/include/libavutil/rational.h | 135 + windeps/include/libavutil/sha1.h | 57 + windeps/include/libswscale/swscale.h | 359 ++ windeps/lib/avcodec.lib | Bin 0 -> 1373002 bytes windeps/lib/avcore.lib | Bin 0 -> 7896 bytes windeps/lib/avformat.lib | Bin 0 -> 210330 bytes windeps/lib/avutil.lib | Bin 0 -> 27578 bytes windeps/lib/glut32.lib | Bin 0 -> 28728 bytes 53 files changed, 13025 insertions(+) create mode 100644 windeps/include/GL/glut.h create mode 100644 windeps/include/libavcodec/avcodec.h create mode 100644 windeps/include/libavcodec/avfft.h create mode 100644 windeps/include/libavcodec/dxva2.h create mode 100644 windeps/include/libavcodec/opt.h create mode 100644 windeps/include/libavcodec/vaapi.h create mode 100644 windeps/include/libavcodec/vdpau.h create mode 100644 windeps/include/libavcodec/xvmc.h create mode 100644 windeps/include/libavcore/audioconvert.h create mode 100644 windeps/include/libavcore/avcore.h create mode 100644 windeps/include/libavcore/imgutils.h create mode 100644 windeps/include/libavcore/parseutils.h create mode 100644 windeps/include/libavcore/samplefmt.h create mode 100644 windeps/include/libavdevice/avdevice.h create mode 100644 windeps/include/libavfilter/avfilter.h create mode 100644 windeps/include/libavfilter/avfiltergraph.h create mode 100644 windeps/include/libavformat/avformat.h create mode 100644 windeps/include/libavformat/avio.h create mode 100644 windeps/include/libavutil/adler32.h create mode 100644 windeps/include/libavutil/attributes.h create mode 100644 windeps/include/libavutil/avassert.h create mode 100644 windeps/include/libavutil/avconfig.h create mode 100644 windeps/include/libavutil/avstring.h create mode 100644 windeps/include/libavutil/avutil.h create mode 100644 windeps/include/libavutil/base64.h create mode 100644 windeps/include/libavutil/bswap.h create mode 100644 windeps/include/libavutil/common.h create mode 100644 windeps/include/libavutil/cpu.h create mode 100644 windeps/include/libavutil/crc.h create mode 100644 windeps/include/libavutil/error.h create mode 100644 windeps/include/libavutil/eval.h create mode 100644 windeps/include/libavutil/fifo.h create mode 100644 windeps/include/libavutil/file.h create mode 100644 windeps/include/libavutil/intfloat_readwrite.h create mode 100644 windeps/include/libavutil/intreadwrite.h create mode 100644 windeps/include/libavutil/lfg.h create mode 100644 windeps/include/libavutil/log.h create mode 100644 windeps/include/libavutil/lzo.h create mode 100644 windeps/include/libavutil/mathematics.h create mode 100644 windeps/include/libavutil/md5.h create mode 100644 windeps/include/libavutil/mem.h create mode 100644 windeps/include/libavutil/opt.h create mode 100644 windeps/include/libavutil/pixdesc.h create mode 100644 windeps/include/libavutil/pixfmt.h create mode 100644 windeps/include/libavutil/random_seed.h create mode 100644 windeps/include/libavutil/rational.h create mode 100644 windeps/include/libavutil/sha1.h create mode 100644 windeps/include/libswscale/swscale.h create mode 100644 windeps/lib/avcodec.lib create mode 100644 windeps/lib/avcore.lib create mode 100644 windeps/lib/avformat.lib create mode 100644 windeps/lib/avutil.lib create mode 100644 windeps/lib/glut32.lib diff --git a/windeps/include/GL/glut.h b/windeps/include/GL/glut.h new file mode 100644 index 0000000..0e6ddfb --- /dev/null +++ b/windeps/include/GL/glut.h @@ -0,0 +1,716 @@ +#ifndef __glut_h__ +#define __glut_h__ + +/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996, 1998. */ + +/* This program is freely distributable without licensing fees and is + provided without guarantee or warrantee expressed or implied. This + program is -not- in the public domain. */ + +#if defined(_WIN32) + +/* GLUT 3.7 now tries to avoid including + to avoid name space pollution, but Win32's + needs APIENTRY and WINGDIAPI defined properly. */ +# if 0 + /* This would put tons of macros and crap in our clean name space. */ +# define WIN32_LEAN_AND_MEAN +# include +# else + /* XXX This is from Win32's */ +# ifndef APIENTRY +# define GLUT_APIENTRY_DEFINED +# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) || defined(__LCC__) +# define APIENTRY __stdcall +# else +# define APIENTRY +# endif +# endif + /* XXX This is from Win32's */ +# ifndef CALLBACK +# if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) || defined(__LCC__) +# define CALLBACK __stdcall +# else +# define CALLBACK +# endif +# endif + /* XXX Hack for lcc compiler. It doesn't support __declspec(dllimport), just __stdcall. */ +# if defined( __LCC__ ) +# undef WINGDIAPI +# define WINGDIAPI __stdcall +# else + /* XXX This is from Win32's and */ +# ifndef WINGDIAPI +# define GLUT_WINGDIAPI_DEFINED +# define WINGDIAPI __declspec(dllimport) +# endif +# endif + /* XXX This is from Win32's */ +# ifndef _WCHAR_T_DEFINED +typedef unsigned short wchar_t; +# define _WCHAR_T_DEFINED +# endif +# endif + +/* To disable automatic library usage for GLUT, define GLUT_NO_LIB_PRAGMA + in your compile preprocessor options. */ +# if !defined(GLUT_BUILDING_LIB) && !defined(GLUT_NO_LIB_PRAGMA) +# pragma comment (lib, "winmm.lib") /* link with Windows MultiMedia lib */ +/* To enable automatic SGI OpenGL for Windows library usage for GLUT, + define GLUT_USE_SGI_OPENGL in your compile preprocessor options. */ +# ifdef GLUT_USE_SGI_OPENGL +# pragma comment (lib, "opengl.lib") /* link with SGI OpenGL for Windows lib */ +# pragma comment (lib, "glu.lib") /* link with SGI OpenGL Utility lib */ +# pragma comment (lib, "glut.lib") /* link with Win32 GLUT for SGI OpenGL lib */ +# else +# pragma comment (lib, "opengl32.lib") /* link with Microsoft OpenGL lib */ +# pragma comment (lib, "glu32.lib") /* link with Microsoft OpenGL Utility lib */ +# pragma comment (lib, "glut32.lib") /* link with Win32 GLUT lib */ +# endif +# endif + +/* To disable supression of annoying warnings about floats being promoted + to doubles, define GLUT_NO_WARNING_DISABLE in your compile preprocessor + options. */ +# ifndef GLUT_NO_WARNING_DISABLE +# pragma warning (disable:4244) /* Disable bogus VC++ 4.2 conversion warnings. */ +# pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */ +# endif + +/* Win32 has an annoying issue where there are multiple C run-time + libraries (CRTs). If the executable is linked with a different CRT + from the GLUT DLL, the GLUT DLL will not share the same CRT static + data seen by the executable. In particular, atexit callbacks registered + in the executable will not be called if GLUT calls its (different) + exit routine). GLUT is typically built with the + "/MD" option (the CRT with multithreading DLL support), but the Visual + C++ linker default is "/ML" (the single threaded CRT). + + One workaround to this issue is requiring users to always link with + the same CRT as GLUT is compiled with. That requires users supply a + non-standard option. GLUT 3.7 has its own built-in workaround where + the executable's "exit" function pointer is covertly passed to GLUT. + GLUT then calls the executable's exit function pointer to ensure that + any "atexit" calls registered by the application are called if GLUT + needs to exit. + + Note that the __glut*WithExit routines should NEVER be called directly. + To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */ + +/* XXX This is from Win32's */ +# if !defined(_MSC_VER) && !defined(__cdecl) + /* Define __cdecl for non-Microsoft compilers. */ +# define __cdecl +# define GLUT_DEFINED___CDECL +# endif +# ifndef _CRTIMP +# ifdef _NTSDK + /* Definition compatible with NT SDK */ +# define _CRTIMP +# else + /* Current definition */ +# ifdef _DLL +# define _CRTIMP __declspec(dllimport) +# else +# define _CRTIMP +# endif +# endif +# define GLUT_DEFINED__CRTIMP +# endif + +/* GLUT API entry point declarations for Win32. */ +# ifdef GLUT_BUILDING_LIB +# define GLUTAPI __declspec(dllexport) +# else +# ifdef _DLL +# define GLUTAPI __declspec(dllimport) +# else +# define GLUTAPI extern +# endif +# endif + +/* GLUT callback calling convention for Win32. */ +# define GLUTCALLBACK __cdecl + +#endif /* _WIN32 */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32) +# ifndef GLUT_BUILDING_LIB +extern _CRTIMP void __cdecl exit(int); +# endif +#else +/* non-Win32 case. */ +/* Define APIENTRY and CALLBACK to nothing if we aren't on Win32. */ +# define APIENTRY +# define GLUT_APIENTRY_DEFINED +# define CALLBACK +/* Define GLUTAPI and GLUTCALLBACK as below if we aren't on Win32. */ +# define GLUTAPI extern +# define GLUTCALLBACK +/* Prototype exit for the non-Win32 case (see above). */ +extern void exit(int); +#endif + +/** + GLUT API revision history: + + GLUT_API_VERSION is updated to reflect incompatible GLUT + API changes (interface changes, semantic changes, deletions, + or additions). + + GLUT_API_VERSION=1 First public release of GLUT. 11/29/94 + + GLUT_API_VERSION=2 Added support for OpenGL/GLX multisampling, + extension. Supports new input devices like tablet, dial and button + box, and Spaceball. Easy to query OpenGL extensions. + + GLUT_API_VERSION=3 glutMenuStatus added. + + GLUT_API_VERSION=4 glutInitDisplayString, glutWarpPointer, + glutBitmapLength, glutStrokeLength, glutWindowStatusFunc, dynamic + video resize subAPI, glutPostWindowRedisplay, glutKeyboardUpFunc, + glutSpecialUpFunc, glutIgnoreKeyRepeat, glutSetKeyRepeat, + glutJoystickFunc, glutForceJoystickFunc (NOT FINALIZED!). +**/ +#ifndef GLUT_API_VERSION /* allow this to be overriden */ +#define GLUT_API_VERSION 3 +#endif + +/** + GLUT implementation revision history: + + GLUT_XLIB_IMPLEMENTATION is updated to reflect both GLUT + API revisions and implementation revisions (ie, bug fixes). + + GLUT_XLIB_IMPLEMENTATION=1 mjk's first public release of + GLUT Xlib-based implementation. 11/29/94 + + GLUT_XLIB_IMPLEMENTATION=2 mjk's second public release of + GLUT Xlib-based implementation providing GLUT version 2 + interfaces. + + GLUT_XLIB_IMPLEMENTATION=3 mjk's GLUT 2.2 images. 4/17/95 + + GLUT_XLIB_IMPLEMENTATION=4 mjk's GLUT 2.3 images. 6/?/95 + + GLUT_XLIB_IMPLEMENTATION=5 mjk's GLUT 3.0 images. 10/?/95 + + GLUT_XLIB_IMPLEMENTATION=7 mjk's GLUT 3.1+ with glutWarpPoitner. 7/24/96 + + GLUT_XLIB_IMPLEMENTATION=8 mjk's GLUT 3.1+ with glutWarpPoitner + and video resize. 1/3/97 + + GLUT_XLIB_IMPLEMENTATION=9 mjk's GLUT 3.4 release with early GLUT 4 routines. + + GLUT_XLIB_IMPLEMENTATION=11 Mesa 2.5's GLUT 3.6 release. + + GLUT_XLIB_IMPLEMENTATION=12 mjk's GLUT 3.6 release with early GLUT 4 routines + signal handling. + + GLUT_XLIB_IMPLEMENTATION=13 mjk's GLUT 3.7 beta with GameGLUT support. + + GLUT_XLIB_IMPLEMENTATION=14 mjk's GLUT 3.7 beta with f90gl friend interface. + + GLUT_XLIB_IMPLEMENTATION=15 mjk's GLUT 3.7 beta sync'ed with Mesa +**/ +#ifndef GLUT_XLIB_IMPLEMENTATION /* Allow this to be overriden. */ +#define GLUT_XLIB_IMPLEMENTATION 15 +#endif + +/* Display mode bit masks. */ +#define GLUT_RGB 0 +#define GLUT_RGBA GLUT_RGB +#define GLUT_INDEX 1 +#define GLUT_SINGLE 0 +#define GLUT_DOUBLE 2 +#define GLUT_ACCUM 4 +#define GLUT_ALPHA 8 +#define GLUT_DEPTH 16 +#define GLUT_STENCIL 32 +#if (GLUT_API_VERSION >= 2) +#define GLUT_MULTISAMPLE 128 +#define GLUT_STEREO 256 +#endif +#if (GLUT_API_VERSION >= 3) +#define GLUT_LUMINANCE 512 +#endif + +/* Mouse buttons. */ +#define GLUT_LEFT_BUTTON 0 +#define GLUT_MIDDLE_BUTTON 1 +#define GLUT_RIGHT_BUTTON 2 + +/* Mouse button state. */ +#define GLUT_DOWN 0 +#define GLUT_UP 1 + +#if (GLUT_API_VERSION >= 2) +/* function keys */ +#define GLUT_KEY_F1 1 +#define GLUT_KEY_F2 2 +#define GLUT_KEY_F3 3 +#define GLUT_KEY_F4 4 +#define GLUT_KEY_F5 5 +#define GLUT_KEY_F6 6 +#define GLUT_KEY_F7 7 +#define GLUT_KEY_F8 8 +#define GLUT_KEY_F9 9 +#define GLUT_KEY_F10 10 +#define GLUT_KEY_F11 11 +#define GLUT_KEY_F12 12 +/* directional keys */ +#define GLUT_KEY_LEFT 100 +#define GLUT_KEY_UP 101 +#define GLUT_KEY_RIGHT 102 +#define GLUT_KEY_DOWN 103 +#define GLUT_KEY_PAGE_UP 104 +#define GLUT_KEY_PAGE_DOWN 105 +#define GLUT_KEY_HOME 106 +#define GLUT_KEY_END 107 +#define GLUT_KEY_INSERT 108 +#endif + +/* Entry/exit state. */ +#define GLUT_LEFT 0 +#define GLUT_ENTERED 1 + +/* Menu usage state. */ +#define GLUT_MENU_NOT_IN_USE 0 +#define GLUT_MENU_IN_USE 1 + +/* Visibility state. */ +#define GLUT_NOT_VISIBLE 0 +#define GLUT_VISIBLE 1 + +/* Window status state. */ +#define GLUT_HIDDEN 0 +#define GLUT_FULLY_RETAINED 1 +#define GLUT_PARTIALLY_RETAINED 2 +#define GLUT_FULLY_COVERED 3 + +/* Color index component selection values. */ +#define GLUT_RED 0 +#define GLUT_GREEN 1 +#define GLUT_BLUE 2 + +#if defined(_WIN32) +/* Stroke font constants (use these in GLUT program). */ +#define GLUT_STROKE_ROMAN ((void*)0) +#define GLUT_STROKE_MONO_ROMAN ((void*)1) + +/* Bitmap font constants (use these in GLUT program). */ +#define GLUT_BITMAP_9_BY_15 ((void*)2) +#define GLUT_BITMAP_8_BY_13 ((void*)3) +#define GLUT_BITMAP_TIMES_ROMAN_10 ((void*)4) +#define GLUT_BITMAP_TIMES_ROMAN_24 ((void*)5) +#if (GLUT_API_VERSION >= 3) +#define GLUT_BITMAP_HELVETICA_10 ((void*)6) +#define GLUT_BITMAP_HELVETICA_12 ((void*)7) +#define GLUT_BITMAP_HELVETICA_18 ((void*)8) +#endif +#else +/* Stroke font opaque addresses (use constants instead in source code). */ +GLUTAPI void *glutStrokeRoman; +GLUTAPI void *glutStrokeMonoRoman; + +/* Stroke font constants (use these in GLUT program). */ +#define GLUT_STROKE_ROMAN (&glutStrokeRoman) +#define GLUT_STROKE_MONO_ROMAN (&glutStrokeMonoRoman) + +/* Bitmap font opaque addresses (use constants instead in source code). */ +GLUTAPI void *glutBitmap9By15; +GLUTAPI void *glutBitmap8By13; +GLUTAPI void *glutBitmapTimesRoman10; +GLUTAPI void *glutBitmapTimesRoman24; +GLUTAPI void *glutBitmapHelvetica10; +GLUTAPI void *glutBitmapHelvetica12; +GLUTAPI void *glutBitmapHelvetica18; + +/* Bitmap font constants (use these in GLUT program). */ +#define GLUT_BITMAP_9_BY_15 (&glutBitmap9By15) +#define GLUT_BITMAP_8_BY_13 (&glutBitmap8By13) +#define GLUT_BITMAP_TIMES_ROMAN_10 (&glutBitmapTimesRoman10) +#define GLUT_BITMAP_TIMES_ROMAN_24 (&glutBitmapTimesRoman24) +#if (GLUT_API_VERSION >= 3) +#define GLUT_BITMAP_HELVETICA_10 (&glutBitmapHelvetica10) +#define GLUT_BITMAP_HELVETICA_12 (&glutBitmapHelvetica12) +#define GLUT_BITMAP_HELVETICA_18 (&glutBitmapHelvetica18) +#endif +#endif + +/* glutGet parameters. */ +#define GLUT_WINDOW_X ((GLenum) 100) +#define GLUT_WINDOW_Y ((GLenum) 101) +#define GLUT_WINDOW_WIDTH ((GLenum) 102) +#define GLUT_WINDOW_HEIGHT ((GLenum) 103) +#define GLUT_WINDOW_BUFFER_SIZE ((GLenum) 104) +#define GLUT_WINDOW_STENCIL_SIZE ((GLenum) 105) +#define GLUT_WINDOW_DEPTH_SIZE ((GLenum) 106) +#define GLUT_WINDOW_RED_SIZE ((GLenum) 107) +#define GLUT_WINDOW_GREEN_SIZE ((GLenum) 108) +#define GLUT_WINDOW_BLUE_SIZE ((GLenum) 109) +#define GLUT_WINDOW_ALPHA_SIZE ((GLenum) 110) +#define GLUT_WINDOW_ACCUM_RED_SIZE ((GLenum) 111) +#define GLUT_WINDOW_ACCUM_GREEN_SIZE ((GLenum) 112) +#define GLUT_WINDOW_ACCUM_BLUE_SIZE ((GLenum) 113) +#define GLUT_WINDOW_ACCUM_ALPHA_SIZE ((GLenum) 114) +#define GLUT_WINDOW_DOUBLEBUFFER ((GLenum) 115) +#define GLUT_WINDOW_RGBA ((GLenum) 116) +#define GLUT_WINDOW_PARENT ((GLenum) 117) +#define GLUT_WINDOW_NUM_CHILDREN ((GLenum) 118) +#define GLUT_WINDOW_COLORMAP_SIZE ((GLenum) 119) +#if (GLUT_API_VERSION >= 2) +#define GLUT_WINDOW_NUM_SAMPLES ((GLenum) 120) +#define GLUT_WINDOW_STEREO ((GLenum) 121) +#endif +#if (GLUT_API_VERSION >= 3) +#define GLUT_WINDOW_CURSOR ((GLenum) 122) +#endif +#define GLUT_SCREEN_WIDTH ((GLenum) 200) +#define GLUT_SCREEN_HEIGHT ((GLenum) 201) +#define GLUT_SCREEN_WIDTH_MM ((GLenum) 202) +#define GLUT_SCREEN_HEIGHT_MM ((GLenum) 203) +#define GLUT_MENU_NUM_ITEMS ((GLenum) 300) +#define GLUT_DISPLAY_MODE_POSSIBLE ((GLenum) 400) +#define GLUT_INIT_WINDOW_X ((GLenum) 500) +#define GLUT_INIT_WINDOW_Y ((GLenum) 501) +#define GLUT_INIT_WINDOW_WIDTH ((GLenum) 502) +#define GLUT_INIT_WINDOW_HEIGHT ((GLenum) 503) +#define GLUT_INIT_DISPLAY_MODE ((GLenum) 504) +#if (GLUT_API_VERSION >= 2) +#define GLUT_ELAPSED_TIME ((GLenum) 700) +#endif +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) +#define GLUT_WINDOW_FORMAT_ID ((GLenum) 123) +#endif + +#if (GLUT_API_VERSION >= 2) +/* glutDeviceGet parameters. */ +#define GLUT_HAS_KEYBOARD ((GLenum) 600) +#define GLUT_HAS_MOUSE ((GLenum) 601) +#define GLUT_HAS_SPACEBALL ((GLenum) 602) +#define GLUT_HAS_DIAL_AND_BUTTON_BOX ((GLenum) 603) +#define GLUT_HAS_TABLET ((GLenum) 604) +#define GLUT_NUM_MOUSE_BUTTONS ((GLenum) 605) +#define GLUT_NUM_SPACEBALL_BUTTONS ((GLenum) 606) +#define GLUT_NUM_BUTTON_BOX_BUTTONS ((GLenum) 607) +#define GLUT_NUM_DIALS ((GLenum) 608) +#define GLUT_NUM_TABLET_BUTTONS ((GLenum) 609) +#endif +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) +#define GLUT_DEVICE_IGNORE_KEY_REPEAT ((GLenum) 610) +#define GLUT_DEVICE_KEY_REPEAT ((GLenum) 611) +#define GLUT_HAS_JOYSTICK ((GLenum) 612) +#define GLUT_OWNS_JOYSTICK ((GLenum) 613) +#define GLUT_JOYSTICK_BUTTONS ((GLenum) 614) +#define GLUT_JOYSTICK_AXES ((GLenum) 615) +#define GLUT_JOYSTICK_POLL_RATE ((GLenum) 616) +#endif + +#if (GLUT_API_VERSION >= 3) +/* glutLayerGet parameters. */ +#define GLUT_OVERLAY_POSSIBLE ((GLenum) 800) +#define GLUT_LAYER_IN_USE ((GLenum) 801) +#define GLUT_HAS_OVERLAY ((GLenum) 802) +#define GLUT_TRANSPARENT_INDEX ((GLenum) 803) +#define GLUT_NORMAL_DAMAGED ((GLenum) 804) +#define GLUT_OVERLAY_DAMAGED ((GLenum) 805) + +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) +/* glutVideoResizeGet parameters. */ +#define GLUT_VIDEO_RESIZE_POSSIBLE ((GLenum) 900) +#define GLUT_VIDEO_RESIZE_IN_USE ((GLenum) 901) +#define GLUT_VIDEO_RESIZE_X_DELTA ((GLenum) 902) +#define GLUT_VIDEO_RESIZE_Y_DELTA ((GLenum) 903) +#define GLUT_VIDEO_RESIZE_WIDTH_DELTA ((GLenum) 904) +#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA ((GLenum) 905) +#define GLUT_VIDEO_RESIZE_X ((GLenum) 906) +#define GLUT_VIDEO_RESIZE_Y ((GLenum) 907) +#define GLUT_VIDEO_RESIZE_WIDTH ((GLenum) 908) +#define GLUT_VIDEO_RESIZE_HEIGHT ((GLenum) 909) +#endif + +/* glutUseLayer parameters. */ +#define GLUT_NORMAL ((GLenum) 0) +#define GLUT_OVERLAY ((GLenum) 1) + +/* glutGetModifiers return mask. */ +#define GLUT_ACTIVE_SHIFT 1 +#define GLUT_ACTIVE_CTRL 2 +#define GLUT_ACTIVE_ALT 4 + +/* glutSetCursor parameters. */ +/* Basic arrows. */ +#define GLUT_CURSOR_RIGHT_ARROW 0 +#define GLUT_CURSOR_LEFT_ARROW 1 +/* Symbolic cursor shapes. */ +#define GLUT_CURSOR_INFO 2 +#define GLUT_CURSOR_DESTROY 3 +#define GLUT_CURSOR_HELP 4 +#define GLUT_CURSOR_CYCLE 5 +#define GLUT_CURSOR_SPRAY 6 +#define GLUT_CURSOR_WAIT 7 +#define GLUT_CURSOR_TEXT 8 +#define GLUT_CURSOR_CROSSHAIR 9 +/* Directional cursors. */ +#define GLUT_CURSOR_UP_DOWN 10 +#define GLUT_CURSOR_LEFT_RIGHT 11 +/* Sizing cursors. */ +#define GLUT_CURSOR_TOP_SIDE 12 +#define GLUT_CURSOR_BOTTOM_SIDE 13 +#define GLUT_CURSOR_LEFT_SIDE 14 +#define GLUT_CURSOR_RIGHT_SIDE 15 +#define GLUT_CURSOR_TOP_LEFT_CORNER 16 +#define GLUT_CURSOR_TOP_RIGHT_CORNER 17 +#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 18 +#define GLUT_CURSOR_BOTTOM_LEFT_CORNER 19 +/* Inherit from parent window. */ +#define GLUT_CURSOR_INHERIT 100 +/* Blank cursor. */ +#define GLUT_CURSOR_NONE 101 +/* Fullscreen crosshair (if available). */ +#define GLUT_CURSOR_FULL_CROSSHAIR 102 +#endif + +/* GLUT initialization sub-API. */ +GLUTAPI void APIENTRY glutInit(int *argcp, char **argv); +#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) +GLUTAPI void APIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int)); +#ifndef GLUT_BUILDING_LIB +static void APIENTRY glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); } +#define glutInit glutInit_ATEXIT_HACK +#endif +#endif +GLUTAPI void APIENTRY glutInitDisplayMode(unsigned int mode); +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) +GLUTAPI void APIENTRY glutInitDisplayString(const char *string); +#endif +GLUTAPI void APIENTRY glutInitWindowPosition(int x, int y); +GLUTAPI void APIENTRY glutInitWindowSize(int width, int height); +GLUTAPI void APIENTRY glutMainLoop(void); + +/* GLUT window sub-API. */ +GLUTAPI int APIENTRY glutCreateWindow(const char *title); +#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) +GLUTAPI int APIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int)); +#ifndef GLUT_BUILDING_LIB +static int APIENTRY glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); } +#define glutCreateWindow glutCreateWindow_ATEXIT_HACK +#endif +#endif +GLUTAPI int APIENTRY glutCreateSubWindow(int win, int x, int y, int width, int height); +GLUTAPI void APIENTRY glutDestroyWindow(int win); +GLUTAPI void APIENTRY glutPostRedisplay(void); +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11) +GLUTAPI void APIENTRY glutPostWindowRedisplay(int win); +#endif +GLUTAPI void APIENTRY glutSwapBuffers(void); +GLUTAPI int APIENTRY glutGetWindow(void); +GLUTAPI void APIENTRY glutSetWindow(int win); +GLUTAPI void APIENTRY glutSetWindowTitle(const char *title); +GLUTAPI void APIENTRY glutSetIconTitle(const char *title); +GLUTAPI void APIENTRY glutPositionWindow(int x, int y); +GLUTAPI void APIENTRY glutReshapeWindow(int width, int height); +GLUTAPI void APIENTRY glutPopWindow(void); +GLUTAPI void APIENTRY glutPushWindow(void); +GLUTAPI void APIENTRY glutIconifyWindow(void); +GLUTAPI void APIENTRY glutShowWindow(void); +GLUTAPI void APIENTRY glutHideWindow(void); +#if (GLUT_API_VERSION >= 3) +GLUTAPI void APIENTRY glutFullScreen(void); +GLUTAPI void APIENTRY glutSetCursor(int cursor); +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) +GLUTAPI void APIENTRY glutWarpPointer(int x, int y); +#endif + +/* GLUT overlay sub-API. */ +GLUTAPI void APIENTRY glutEstablishOverlay(void); +GLUTAPI void APIENTRY glutRemoveOverlay(void); +GLUTAPI void APIENTRY glutUseLayer(GLenum layer); +GLUTAPI void APIENTRY glutPostOverlayRedisplay(void); +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11) +GLUTAPI void APIENTRY glutPostWindowOverlayRedisplay(int win); +#endif +GLUTAPI void APIENTRY glutShowOverlay(void); +GLUTAPI void APIENTRY glutHideOverlay(void); +#endif + +/* GLUT menu sub-API. */ +GLUTAPI int APIENTRY glutCreateMenu(void (GLUTCALLBACK *func)(int)); +#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) +GLUTAPI int APIENTRY __glutCreateMenuWithExit(void (GLUTCALLBACK *func)(int), void (__cdecl *exitfunc)(int)); +#ifndef GLUT_BUILDING_LIB +static int APIENTRY glutCreateMenu_ATEXIT_HACK(void (GLUTCALLBACK *func)(int)) { return __glutCreateMenuWithExit(func, exit); } +#define glutCreateMenu glutCreateMenu_ATEXIT_HACK +#endif +#endif +GLUTAPI void APIENTRY glutDestroyMenu(int menu); +GLUTAPI int APIENTRY glutGetMenu(void); +GLUTAPI void APIENTRY glutSetMenu(int menu); +GLUTAPI void APIENTRY glutAddMenuEntry(const char *label, int value); +GLUTAPI void APIENTRY glutAddSubMenu(const char *label, int submenu); +GLUTAPI void APIENTRY glutChangeToMenuEntry(int item, const char *label, int value); +GLUTAPI void APIENTRY glutChangeToSubMenu(int item, const char *label, int submenu); +GLUTAPI void APIENTRY glutRemoveMenuItem(int item); +GLUTAPI void APIENTRY glutAttachMenu(int button); +GLUTAPI void APIENTRY glutDetachMenu(int button); + +/* GLUT window callback sub-API. */ +GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void)); +GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK *func)(int width, int height)); +GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y)); +GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y)); +GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK *func)(int x, int y)); +GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK *func)(int x, int y)); +GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK *func)(int state)); +GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK *func)(int state)); +GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK *func)(void)); +GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK *func)(int value), int value); +GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK *func)(int state)); +#if (GLUT_API_VERSION >= 2) +GLUTAPI void APIENTRY glutSpecialFunc(void (GLUTCALLBACK *func)(int key, int x, int y)); +GLUTAPI void APIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK *func)(int x, int y, int z)); +GLUTAPI void APIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK *func)(int x, int y, int z)); +GLUTAPI void APIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK *func)(int button, int state)); +GLUTAPI void APIENTRY glutButtonBoxFunc(void (GLUTCALLBACK *func)(int button, int state)); +GLUTAPI void APIENTRY glutDialsFunc(void (GLUTCALLBACK *func)(int dial, int value)); +GLUTAPI void APIENTRY glutTabletMotionFunc(void (GLUTCALLBACK *func)(int x, int y)); +GLUTAPI void APIENTRY glutTabletButtonFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y)); +#if (GLUT_API_VERSION >= 3) +GLUTAPI void APIENTRY glutMenuStatusFunc(void (GLUTCALLBACK *func)(int status, int x, int y)); +GLUTAPI void APIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK *func)(void)); +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) +GLUTAPI void APIENTRY glutWindowStatusFunc(void (GLUTCALLBACK *func)(int state)); +#endif +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) +GLUTAPI void APIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y)); +GLUTAPI void APIENTRY glutSpecialUpFunc(void (GLUTCALLBACK *func)(int key, int x, int y)); +GLUTAPI void APIENTRY glutJoystickFunc(void (GLUTCALLBACK *func)(unsigned int buttonMask, int x, int y, int z), int pollInterval); +#endif +#endif +#endif + +/* GLUT color index sub-API. */ +GLUTAPI void APIENTRY glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue); +GLUTAPI GLfloat APIENTRY glutGetColor(int ndx, int component); +GLUTAPI void APIENTRY glutCopyColormap(int win); + +/* GLUT state retrieval sub-API. */ +GLUTAPI int APIENTRY glutGet(GLenum type); +GLUTAPI int APIENTRY glutDeviceGet(GLenum type); +#if (GLUT_API_VERSION >= 2) +/* GLUT extension support sub-API */ +GLUTAPI int APIENTRY glutExtensionSupported(const char *name); +#endif +#if (GLUT_API_VERSION >= 3) +GLUTAPI int APIENTRY glutGetModifiers(void); +GLUTAPI int APIENTRY glutLayerGet(GLenum type); +#endif + +/* GLUT font sub-API */ +GLUTAPI void APIENTRY glutBitmapCharacter(void *font, int character); +GLUTAPI int APIENTRY glutBitmapWidth(void *font, int character); +GLUTAPI void APIENTRY glutStrokeCharacter(void *font, int character); +GLUTAPI int APIENTRY glutStrokeWidth(void *font, int character); +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) +GLUTAPI int APIENTRY glutBitmapLength(void *font, const unsigned char *string); +GLUTAPI int APIENTRY glutStrokeLength(void *font, const unsigned char *string); +#endif + +/* GLUT pre-built models sub-API */ +GLUTAPI void APIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks); +GLUTAPI void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); +GLUTAPI void APIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks); +GLUTAPI void APIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks); +GLUTAPI void APIENTRY glutWireCube(GLdouble size); +GLUTAPI void APIENTRY glutSolidCube(GLdouble size); +GLUTAPI void APIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings); +GLUTAPI void APIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings); +GLUTAPI void APIENTRY glutWireDodecahedron(void); +GLUTAPI void APIENTRY glutSolidDodecahedron(void); +GLUTAPI void APIENTRY glutWireTeapot(GLdouble size); +GLUTAPI void APIENTRY glutSolidTeapot(GLdouble size); +GLUTAPI void APIENTRY glutWireOctahedron(void); +GLUTAPI void APIENTRY glutSolidOctahedron(void); +GLUTAPI void APIENTRY glutWireTetrahedron(void); +GLUTAPI void APIENTRY glutSolidTetrahedron(void); +GLUTAPI void APIENTRY glutWireIcosahedron(void); +GLUTAPI void APIENTRY glutSolidIcosahedron(void); + +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) +/* GLUT video resize sub-API. */ +GLUTAPI int APIENTRY glutVideoResizeGet(GLenum param); +GLUTAPI void APIENTRY glutSetupVideoResizing(void); +GLUTAPI void APIENTRY glutStopVideoResizing(void); +GLUTAPI void APIENTRY glutVideoResize(int x, int y, int width, int height); +GLUTAPI void APIENTRY glutVideoPan(int x, int y, int width, int height); + +/* GLUT debugging sub-API. */ +GLUTAPI void APIENTRY glutReportErrors(void); +#endif + +#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) +/* GLUT device control sub-API. */ +/* glutSetKeyRepeat modes. */ +#define GLUT_KEY_REPEAT_OFF 0 +#define GLUT_KEY_REPEAT_ON 1 +#define GLUT_KEY_REPEAT_DEFAULT 2 + +/* Joystick button masks. */ +#define GLUT_JOYSTICK_BUTTON_A 1 +#define GLUT_JOYSTICK_BUTTON_B 2 +#define GLUT_JOYSTICK_BUTTON_C 4 +#define GLUT_JOYSTICK_BUTTON_D 8 + +GLUTAPI void APIENTRY glutIgnoreKeyRepeat(int ignore); +GLUTAPI void APIENTRY glutSetKeyRepeat(int repeatMode); +GLUTAPI void APIENTRY glutForceJoystickFunc(void); + +/* GLUT game mode sub-API. */ +/* glutGameModeGet. */ +#define GLUT_GAME_MODE_ACTIVE ((GLenum) 0) +#define GLUT_GAME_MODE_POSSIBLE ((GLenum) 1) +#define GLUT_GAME_MODE_WIDTH ((GLenum) 2) +#define GLUT_GAME_MODE_HEIGHT ((GLenum) 3) +#define GLUT_GAME_MODE_PIXEL_DEPTH ((GLenum) 4) +#define GLUT_GAME_MODE_REFRESH_RATE ((GLenum) 5) +#define GLUT_GAME_MODE_DISPLAY_CHANGED ((GLenum) 6) + +GLUTAPI void APIENTRY glutGameModeString(const char *string); +GLUTAPI int APIENTRY glutEnterGameMode(void); +GLUTAPI void APIENTRY glutLeaveGameMode(void); +GLUTAPI int APIENTRY glutGameModeGet(GLenum mode); +#endif + +#ifdef __cplusplus +} + +#endif + +#ifdef GLUT_APIENTRY_DEFINED +# undef GLUT_APIENTRY_DEFINED +# undef APIENTRY +#endif + +#ifdef GLUT_WINGDIAPI_DEFINED +# undef GLUT_WINGDIAPI_DEFINED +# undef WINGDIAPI +#endif + +#ifdef GLUT_DEFINED___CDECL +# undef GLUT_DEFINED___CDECL +# undef __cdecl +#endif + +#ifdef GLUT_DEFINED__CRTIMP +# undef GLUT_DEFINED__CRTIMP +# undef _CRTIMP +#endif + +#endif /* __glut_h__ */ diff --git a/windeps/include/libavcodec/avcodec.h b/windeps/include/libavcodec/avcodec.h new file mode 100644 index 0000000..601f8ed --- /dev/null +++ b/windeps/include/libavcodec/avcodec.h @@ -0,0 +1,4196 @@ +/* + * 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 + */ + +#ifndef AVCODEC_AVCODEC_H +#define AVCODEC_AVCODEC_H + +/** + * @file + * external API header + */ + +#include +#include "libavcore/samplefmt.h" +#include "libavutil/avutil.h" +#include "libavutil/cpu.h" + +#define LIBAVCODEC_VERSION_MAJOR 52 +#define LIBAVCODEC_VERSION_MINOR 108 +#define LIBAVCODEC_VERSION_MICRO 0 + +#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ + LIBAVCODEC_VERSION_MINOR, \ + LIBAVCODEC_VERSION_MICRO) +#define LIBAVCODEC_VERSION AV_VERSION(LIBAVCODEC_VERSION_MAJOR, \ + LIBAVCODEC_VERSION_MINOR, \ + LIBAVCODEC_VERSION_MICRO) +#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT + +#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION) + +/** + * Those FF_API_* defines are not part of public API. + * They may change, break or disappear at any time. + */ +#ifndef FF_API_PALETTE_CONTROL +#define FF_API_PALETTE_CONTROL (LIBAVCODEC_VERSION_MAJOR < 54) +#endif +#ifndef FF_API_MM_FLAGS +#define FF_API_MM_FLAGS (LIBAVCODEC_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_OPT_SHOW +#define FF_API_OPT_SHOW (LIBAVCODEC_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_AUDIO_OLD +#define FF_API_AUDIO_OLD (LIBAVCODEC_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_VIDEO_OLD +#define FF_API_VIDEO_OLD (LIBAVCODEC_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_SUBTITLE_OLD +#define FF_API_SUBTITLE_OLD (LIBAVCODEC_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_USE_LPC +#define FF_API_USE_LPC (LIBAVCODEC_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_SET_STRING_OLD +#define FF_API_SET_STRING_OLD (LIBAVCODEC_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_INOFFICIAL +#define FF_API_INOFFICIAL (LIBAVCODEC_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_OLD_SAMPLE_FMT +#define FF_API_OLD_SAMPLE_FMT (LIBAVCODEC_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_OLD_AUDIOCONVERT +#define FF_API_OLD_AUDIOCONVERT (LIBAVCODEC_VERSION_MAJOR < 53) +#endif + +#if LIBAVCODEC_VERSION_MAJOR < 53 +# define FF_INTERNALC_MEM_TYPE unsigned int +#else +# define FF_INTERNALC_MEM_TYPE size_t +#endif + +/** + * Identify the syntax and semantics of the bitstream. + * The principle is roughly: + * Two decoders with the same ID can decode the same streams. + * Two encoders with the same ID can encode compatible streams. + * There may be slight deviations from the principle due to implementation + * details. + * + * If you add a codec ID to this list, add it so that + * 1. no value of a existing codec ID changes (that would break ABI), + * 2. it is as close as possible to similar codecs. + */ +enum CodecID { + CODEC_ID_NONE, + + /* video codecs */ + CODEC_ID_MPEG1VIDEO, + CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding + CODEC_ID_MPEG2VIDEO_XVMC, + CODEC_ID_H261, + CODEC_ID_H263, + CODEC_ID_RV10, + CODEC_ID_RV20, + CODEC_ID_MJPEG, + CODEC_ID_MJPEGB, + CODEC_ID_LJPEG, + CODEC_ID_SP5X, + CODEC_ID_JPEGLS, + CODEC_ID_MPEG4, + CODEC_ID_RAWVIDEO, + CODEC_ID_MSMPEG4V1, + CODEC_ID_MSMPEG4V2, + CODEC_ID_MSMPEG4V3, + CODEC_ID_WMV1, + CODEC_ID_WMV2, + CODEC_ID_H263P, + CODEC_ID_H263I, + CODEC_ID_FLV1, + CODEC_ID_SVQ1, + CODEC_ID_SVQ3, + CODEC_ID_DVVIDEO, + CODEC_ID_HUFFYUV, + CODEC_ID_CYUV, + CODEC_ID_H264, + CODEC_ID_INDEO3, + CODEC_ID_VP3, + CODEC_ID_THEORA, + CODEC_ID_ASV1, + CODEC_ID_ASV2, + CODEC_ID_FFV1, + CODEC_ID_4XM, + CODEC_ID_VCR1, + CODEC_ID_CLJR, + CODEC_ID_MDEC, + CODEC_ID_ROQ, + CODEC_ID_INTERPLAY_VIDEO, + CODEC_ID_XAN_WC3, + CODEC_ID_XAN_WC4, + CODEC_ID_RPZA, + CODEC_ID_CINEPAK, + CODEC_ID_WS_VQA, + CODEC_ID_MSRLE, + CODEC_ID_MSVIDEO1, + CODEC_ID_IDCIN, + CODEC_ID_8BPS, + CODEC_ID_SMC, + CODEC_ID_FLIC, + CODEC_ID_TRUEMOTION1, + CODEC_ID_VMDVIDEO, + CODEC_ID_MSZH, + CODEC_ID_ZLIB, + CODEC_ID_QTRLE, + CODEC_ID_SNOW, + CODEC_ID_TSCC, + CODEC_ID_ULTI, + CODEC_ID_QDRAW, + CODEC_ID_VIXL, + CODEC_ID_QPEG, +#if LIBAVCODEC_VERSION_MAJOR < 53 + CODEC_ID_XVID, +#endif + CODEC_ID_PNG, + CODEC_ID_PPM, + CODEC_ID_PBM, + CODEC_ID_PGM, + CODEC_ID_PGMYUV, + CODEC_ID_PAM, + CODEC_ID_FFVHUFF, + CODEC_ID_RV30, + CODEC_ID_RV40, + CODEC_ID_VC1, + CODEC_ID_WMV3, + CODEC_ID_LOCO, + CODEC_ID_WNV1, + CODEC_ID_AASC, + CODEC_ID_INDEO2, + CODEC_ID_FRAPS, + CODEC_ID_TRUEMOTION2, + CODEC_ID_BMP, + CODEC_ID_CSCD, + CODEC_ID_MMVIDEO, + CODEC_ID_ZMBV, + CODEC_ID_AVS, + CODEC_ID_SMACKVIDEO, + CODEC_ID_NUV, + CODEC_ID_KMVC, + CODEC_ID_FLASHSV, + CODEC_ID_CAVS, + CODEC_ID_JPEG2000, + CODEC_ID_VMNC, + CODEC_ID_VP5, + CODEC_ID_VP6, + CODEC_ID_VP6F, + CODEC_ID_TARGA, + CODEC_ID_DSICINVIDEO, + CODEC_ID_TIERTEXSEQVIDEO, + CODEC_ID_TIFF, + CODEC_ID_GIF, + CODEC_ID_FFH264, + CODEC_ID_DXA, + CODEC_ID_DNXHD, + CODEC_ID_THP, + CODEC_ID_SGI, + CODEC_ID_C93, + CODEC_ID_BETHSOFTVID, + CODEC_ID_PTX, + CODEC_ID_TXD, + CODEC_ID_VP6A, + CODEC_ID_AMV, + CODEC_ID_VB, + CODEC_ID_PCX, + CODEC_ID_SUNRAST, + CODEC_ID_INDEO4, + CODEC_ID_INDEO5, + CODEC_ID_MIMIC, + CODEC_ID_RL2, + CODEC_ID_8SVX_EXP, + CODEC_ID_8SVX_FIB, + CODEC_ID_ESCAPE124, + CODEC_ID_DIRAC, + CODEC_ID_BFI, + CODEC_ID_CMV, + CODEC_ID_MOTIONPIXELS, + CODEC_ID_TGV, + CODEC_ID_TGQ, + CODEC_ID_TQI, + CODEC_ID_AURA, + CODEC_ID_AURA2, + CODEC_ID_V210X, + CODEC_ID_TMV, + CODEC_ID_V210, + CODEC_ID_DPX, + CODEC_ID_MAD, + CODEC_ID_FRWU, + CODEC_ID_FLASHSV2, + CODEC_ID_CDGRAPHICS, + CODEC_ID_R210, + CODEC_ID_ANM, + CODEC_ID_BINKVIDEO, + CODEC_ID_IFF_ILBM, + CODEC_ID_IFF_BYTERUN1, + CODEC_ID_KGV1, + CODEC_ID_YOP, + CODEC_ID_VP8, + CODEC_ID_PICTOR, + CODEC_ID_ANSI, + CODEC_ID_A64_MULTI, + CODEC_ID_A64_MULTI5, + CODEC_ID_R10K, + CODEC_ID_MXPEG, + CODEC_ID_LAGARITH, + + /* various PCM "codecs" */ + CODEC_ID_PCM_S16LE= 0x10000, + CODEC_ID_PCM_S16BE, + CODEC_ID_PCM_U16LE, + CODEC_ID_PCM_U16BE, + CODEC_ID_PCM_S8, + CODEC_ID_PCM_U8, + CODEC_ID_PCM_MULAW, + CODEC_ID_PCM_ALAW, + CODEC_ID_PCM_S32LE, + CODEC_ID_PCM_S32BE, + CODEC_ID_PCM_U32LE, + CODEC_ID_PCM_U32BE, + CODEC_ID_PCM_S24LE, + CODEC_ID_PCM_S24BE, + CODEC_ID_PCM_U24LE, + CODEC_ID_PCM_U24BE, + CODEC_ID_PCM_S24DAUD, + CODEC_ID_PCM_ZORK, + CODEC_ID_PCM_S16LE_PLANAR, + CODEC_ID_PCM_DVD, + CODEC_ID_PCM_F32BE, + CODEC_ID_PCM_F32LE, + CODEC_ID_PCM_F64BE, + CODEC_ID_PCM_F64LE, + CODEC_ID_PCM_BLURAY, + CODEC_ID_PCM_LXF, + + /* various ADPCM codecs */ + CODEC_ID_ADPCM_IMA_QT= 0x11000, + CODEC_ID_ADPCM_IMA_WAV, + CODEC_ID_ADPCM_IMA_DK3, + CODEC_ID_ADPCM_IMA_DK4, + CODEC_ID_ADPCM_IMA_WS, + CODEC_ID_ADPCM_IMA_SMJPEG, + CODEC_ID_ADPCM_MS, + CODEC_ID_ADPCM_4XM, + CODEC_ID_ADPCM_XA, + CODEC_ID_ADPCM_ADX, + CODEC_ID_ADPCM_EA, + CODEC_ID_ADPCM_G726, + CODEC_ID_ADPCM_CT, + CODEC_ID_ADPCM_SWF, + CODEC_ID_ADPCM_YAMAHA, + CODEC_ID_ADPCM_SBPRO_4, + CODEC_ID_ADPCM_SBPRO_3, + CODEC_ID_ADPCM_SBPRO_2, + CODEC_ID_ADPCM_THP, + CODEC_ID_ADPCM_IMA_AMV, + CODEC_ID_ADPCM_EA_R1, + CODEC_ID_ADPCM_EA_R3, + CODEC_ID_ADPCM_EA_R2, + CODEC_ID_ADPCM_IMA_EA_SEAD, + CODEC_ID_ADPCM_IMA_EA_EACS, + CODEC_ID_ADPCM_EA_XAS, + CODEC_ID_ADPCM_EA_MAXIS_XA, + CODEC_ID_ADPCM_IMA_ISS, + CODEC_ID_ADPCM_G722, + + /* AMR */ + CODEC_ID_AMR_NB= 0x12000, + CODEC_ID_AMR_WB, + + /* RealAudio codecs*/ + CODEC_ID_RA_144= 0x13000, + CODEC_ID_RA_288, + + /* various DPCM codecs */ + CODEC_ID_ROQ_DPCM= 0x14000, + CODEC_ID_INTERPLAY_DPCM, + CODEC_ID_XAN_DPCM, + CODEC_ID_SOL_DPCM, + + /* audio codecs */ + CODEC_ID_MP2= 0x15000, + CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3 + CODEC_ID_AAC, + CODEC_ID_AC3, + CODEC_ID_DTS, + CODEC_ID_VORBIS, + CODEC_ID_DVAUDIO, + CODEC_ID_WMAV1, + CODEC_ID_WMAV2, + CODEC_ID_MACE3, + CODEC_ID_MACE6, + CODEC_ID_VMDAUDIO, + CODEC_ID_SONIC, + CODEC_ID_SONIC_LS, + CODEC_ID_FLAC, + CODEC_ID_MP3ADU, + CODEC_ID_MP3ON4, + CODEC_ID_SHORTEN, + CODEC_ID_ALAC, + CODEC_ID_WESTWOOD_SND1, + CODEC_ID_GSM, ///< as in Berlin toast format + CODEC_ID_QDM2, + CODEC_ID_COOK, + CODEC_ID_TRUESPEECH, + CODEC_ID_TTA, + CODEC_ID_SMACKAUDIO, + CODEC_ID_QCELP, + CODEC_ID_WAVPACK, + CODEC_ID_DSICINAUDIO, + CODEC_ID_IMC, + CODEC_ID_MUSEPACK7, + CODEC_ID_MLP, + CODEC_ID_GSM_MS, /* as found in WAV */ + CODEC_ID_ATRAC3, + CODEC_ID_VOXWARE, + CODEC_ID_APE, + CODEC_ID_NELLYMOSER, + CODEC_ID_MUSEPACK8, + CODEC_ID_SPEEX, + CODEC_ID_WMAVOICE, + CODEC_ID_WMAPRO, + CODEC_ID_WMALOSSLESS, + CODEC_ID_ATRAC3P, + CODEC_ID_EAC3, + CODEC_ID_SIPR, + CODEC_ID_MP1, + CODEC_ID_TWINVQ, + CODEC_ID_TRUEHD, + CODEC_ID_MP4ALS, + CODEC_ID_ATRAC1, + CODEC_ID_BINKAUDIO_RDFT, + CODEC_ID_BINKAUDIO_DCT, + CODEC_ID_AAC_LATM, + + /* subtitle codecs */ + CODEC_ID_DVD_SUBTITLE= 0x17000, + CODEC_ID_DVB_SUBTITLE, + CODEC_ID_TEXT, ///< raw UTF-8 text + CODEC_ID_XSUB, + CODEC_ID_SSA, + CODEC_ID_MOV_TEXT, + CODEC_ID_HDMV_PGS_SUBTITLE, + CODEC_ID_DVB_TELETEXT, + CODEC_ID_SRT, + + /* other specific kind of codecs (generally used for attachments) */ + CODEC_ID_TTF= 0x18000, + + CODEC_ID_PROBE= 0x19000, ///< codec_id is not known (like CODEC_ID_NONE) but lavf should attempt to identify it + + CODEC_ID_MPEG2TS= 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS + * stream (only used by libavformat) */ + CODEC_ID_FFMETADATA=0x21000, ///< Dummy codec for streams containing only metadata information. +}; + +#if LIBAVCODEC_VERSION_MAJOR < 53 +#define CodecType AVMediaType + +#define CODEC_TYPE_UNKNOWN AVMEDIA_TYPE_UNKNOWN +#define CODEC_TYPE_VIDEO AVMEDIA_TYPE_VIDEO +#define CODEC_TYPE_AUDIO AVMEDIA_TYPE_AUDIO +#define CODEC_TYPE_DATA AVMEDIA_TYPE_DATA +#define CODEC_TYPE_SUBTITLE AVMEDIA_TYPE_SUBTITLE +#define CODEC_TYPE_ATTACHMENT AVMEDIA_TYPE_ATTACHMENT +#define CODEC_TYPE_NB AVMEDIA_TYPE_NB +#endif + +#if FF_API_OLD_SAMPLE_FMT +#define SampleFormat AVSampleFormat + +#define SAMPLE_FMT_NONE AV_SAMPLE_FMT_NONE +#define SAMPLE_FMT_U8 AV_SAMPLE_FMT_U8 +#define SAMPLE_FMT_S16 AV_SAMPLE_FMT_S16 +#define SAMPLE_FMT_S32 AV_SAMPLE_FMT_S32 +#define SAMPLE_FMT_FLT AV_SAMPLE_FMT_FLT +#define SAMPLE_FMT_DBL AV_SAMPLE_FMT_DBL +#define SAMPLE_FMT_NB AV_SAMPLE_FMT_NB +#endif + +#if FF_API_OLD_AUDIOCONVERT +#include "libavcore/audioconvert.h" + +/* Audio channel masks */ +#define CH_FRONT_LEFT AV_CH_FRONT_LEFT +#define CH_FRONT_RIGHT AV_CH_FRONT_RIGHT +#define CH_FRONT_CENTER AV_CH_FRONT_CENTER +#define CH_LOW_FREQUENCY AV_CH_LOW_FREQUENCY +#define CH_BACK_LEFT AV_CH_BACK_LEFT +#define CH_BACK_RIGHT AV_CH_BACK_RIGHT +#define CH_FRONT_LEFT_OF_CENTER AV_CH_FRONT_LEFT_OF_CENTER +#define CH_FRONT_RIGHT_OF_CENTER AV_CH_FRONT_RIGHT_OF_CENTER +#define CH_BACK_CENTER AV_CH_BACK_CENTER +#define CH_SIDE_LEFT AV_CH_SIDE_LEFT +#define CH_SIDE_RIGHT AV_CH_SIDE_RIGHT +#define CH_TOP_CENTER AV_CH_TOP_CENTER +#define CH_TOP_FRONT_LEFT AV_CH_TOP_FRONT_LEFT +#define CH_TOP_FRONT_CENTER AV_CH_TOP_FRONT_CENTER +#define CH_TOP_FRONT_RIGHT AV_CH_TOP_FRONT_RIGHT +#define CH_TOP_BACK_LEFT AV_CH_TOP_BACK_LEFT +#define CH_TOP_BACK_CENTER AV_CH_TOP_BACK_CENTER +#define CH_TOP_BACK_RIGHT AV_CH_TOP_BACK_RIGHT +#define CH_STEREO_LEFT AV_CH_STEREO_LEFT +#define CH_STEREO_RIGHT AV_CH_STEREO_RIGHT + +/** Channel mask value used for AVCodecContext.request_channel_layout + to indicate that the user requests the channel order of the decoder output + to be the native codec channel order. */ +#define CH_LAYOUT_NATIVE AV_CH_LAYOUT_NATIVE + +/* Audio channel convenience macros */ +#define CH_LAYOUT_MONO AV_CH_LAYOUT_MONO +#define CH_LAYOUT_STEREO AV_CH_LAYOUT_STEREO +#define CH_LAYOUT_2_1 AV_CH_LAYOUT_2_1 +#define CH_LAYOUT_SURROUND AV_CH_LAYOUT_SURROUND +#define CH_LAYOUT_4POINT0 AV_CH_LAYOUT_4POINT0 +#define CH_LAYOUT_2_2 AV_CH_LAYOUT_2_2 +#define CH_LAYOUT_QUAD AV_CH_LAYOUT_QUAD +#define CH_LAYOUT_5POINT0 AV_CH_LAYOUT_5POINT0 +#define CH_LAYOUT_5POINT1 AV_CH_LAYOUT_5POINT1 +#define CH_LAYOUT_5POINT0_BACK AV_CH_LAYOUT_5POINT0_BACK +#define CH_LAYOUT_5POINT1_BACK AV_CH_LAYOUT_5POINT1_BACK +#define CH_LAYOUT_7POINT0 AV_CH_LAYOUT_7POINT0 +#define CH_LAYOUT_7POINT1 AV_CH_LAYOUT_7POINT1 +#define CH_LAYOUT_7POINT1_WIDE AV_CH_LAYOUT_7POINT1_WIDE +#define CH_LAYOUT_STEREO_DOWNMIX AV_CH_LAYOUT_STEREO_DOWNMIX +#endif + +/* in bytes */ +#define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio + +/** + * Required number of additionally allocated bytes at the end of the input bitstream for decoding. + * This is mainly needed because some optimized bitstream readers read + * 32 or 64 bit at once and could read over the end.
+ * Note: If the first 23 bits of the additional bytes are not 0, then damaged + * MPEG bitstreams could cause overread and segfault. + */ +#define FF_INPUT_BUFFER_PADDING_SIZE 8 + +/** + * minimum encoding buffer size + * Used to avoid some checks during header writing. + */ +#define FF_MIN_BUFFER_SIZE 16384 + + +/** + * motion estimation type. + */ +enum Motion_Est_ID { + ME_ZERO = 1, ///< no search, that is use 0,0 vector whenever one is needed + ME_FULL, + ME_LOG, + ME_PHODS, + ME_EPZS, ///< enhanced predictive zonal search + ME_X1, ///< reserved for experiments + ME_HEX, ///< hexagon based search + ME_UMH, ///< uneven multi-hexagon search + ME_ITER, ///< iterative search + ME_TESA, ///< transformed exhaustive search algorithm +}; + +enum AVDiscard{ + /* We leave some space between them for extensions (drop some + * keyframes for intra-only or drop just some bidir frames). */ + AVDISCARD_NONE =-16, ///< discard nothing + AVDISCARD_DEFAULT= 0, ///< discard useless packets like 0 size packets in avi + AVDISCARD_NONREF = 8, ///< discard all non reference + AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames + AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes + AVDISCARD_ALL = 48, ///< discard all +}; + +enum AVColorPrimaries{ + AVCOL_PRI_BT709 =1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B + AVCOL_PRI_UNSPECIFIED=2, + AVCOL_PRI_BT470M =4, + AVCOL_PRI_BT470BG =5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM + AVCOL_PRI_SMPTE170M =6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC + AVCOL_PRI_SMPTE240M =7, ///< functionally identical to above + AVCOL_PRI_FILM =8, + AVCOL_PRI_NB , ///< Not part of ABI +}; + +enum AVColorTransferCharacteristic{ + AVCOL_TRC_BT709 =1, ///< also ITU-R BT1361 + AVCOL_TRC_UNSPECIFIED=2, + AVCOL_TRC_GAMMA22 =4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM + AVCOL_TRC_GAMMA28 =5, ///< also ITU-R BT470BG + AVCOL_TRC_NB , ///< Not part of ABI +}; + +enum AVColorSpace{ + AVCOL_SPC_RGB =0, + AVCOL_SPC_BT709 =1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B + AVCOL_SPC_UNSPECIFIED=2, + AVCOL_SPC_FCC =4, + AVCOL_SPC_BT470BG =5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601 + AVCOL_SPC_SMPTE170M =6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above + AVCOL_SPC_SMPTE240M =7, + AVCOL_SPC_NB , ///< Not part of ABI +}; + +enum AVColorRange{ + AVCOL_RANGE_UNSPECIFIED=0, + AVCOL_RANGE_MPEG =1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges + AVCOL_RANGE_JPEG =2, ///< the normal 2^n-1 "JPEG" YUV ranges + AVCOL_RANGE_NB , ///< Not part of ABI +}; + +/** + * X X 3 4 X X are luma samples, + * 1 2 1-6 are possible chroma positions + * X X 5 6 X 0 is undefined/unknown position + */ +enum AVChromaLocation{ + AVCHROMA_LOC_UNSPECIFIED=0, + AVCHROMA_LOC_LEFT =1, ///< mpeg2/4, h264 default + AVCHROMA_LOC_CENTER =2, ///< mpeg1, jpeg, h263 + AVCHROMA_LOC_TOPLEFT =3, ///< DV + AVCHROMA_LOC_TOP =4, + AVCHROMA_LOC_BOTTOMLEFT =5, + AVCHROMA_LOC_BOTTOM =6, + AVCHROMA_LOC_NB , ///< Not part of ABI +}; + +/** + * LPC analysis type + */ +enum AVLPCType { + AV_LPC_TYPE_DEFAULT = -1, ///< use the codec default LPC type + AV_LPC_TYPE_NONE = 0, ///< do not use LPC prediction or use all zero coefficients + AV_LPC_TYPE_FIXED = 1, ///< fixed LPC coefficients + AV_LPC_TYPE_LEVINSON = 2, ///< Levinson-Durbin recursion + AV_LPC_TYPE_CHOLESKY = 3, ///< Cholesky factorization + AV_LPC_TYPE_NB , ///< Not part of ABI +}; + +typedef struct RcOverride{ + int start_frame; + int end_frame; + int qscale; // If this is 0 then quality_factor will be used instead. + float quality_factor; +} RcOverride; + +#define FF_MAX_B_FRAMES 16 + +/* encoding support + These flags can be passed in AVCodecContext.flags before initialization. + Note: Not everything is supported yet. +*/ + +#define CODEC_FLAG_QSCALE 0x0002 ///< Use fixed qscale. +#define CODEC_FLAG_4MV 0x0004 ///< 4 MV per MB allowed / advanced prediction for H.263. +#define CODEC_FLAG_QPEL 0x0010 ///< Use qpel MC. +#define CODEC_FLAG_GMC 0x0020 ///< Use GMC. +#define CODEC_FLAG_MV0 0x0040 ///< Always try a MB with MV=<0,0>. +#define CODEC_FLAG_PART 0x0080 ///< Use data partitioning. +/** + * The parent program guarantees that the input for B-frames containing + * streams is not written to for at least s->max_b_frames+1 frames, if + * this is not set the input will be copied. + */ +#define CODEC_FLAG_INPUT_PRESERVED 0x0100 +#define CODEC_FLAG_PASS1 0x0200 ///< Use internal 2pass ratecontrol in first pass mode. +#define CODEC_FLAG_PASS2 0x0400 ///< Use internal 2pass ratecontrol in second pass mode. +#define CODEC_FLAG_EXTERN_HUFF 0x1000 ///< Use external Huffman table (for MJPEG). +#define CODEC_FLAG_GRAY 0x2000 ///< Only decode/encode grayscale. +#define CODEC_FLAG_EMU_EDGE 0x4000 ///< Don't draw edges. +#define CODEC_FLAG_PSNR 0x8000 ///< error[?] variables will be set during encoding. +#define CODEC_FLAG_TRUNCATED 0x00010000 /** Input bitstream might be truncated at a random + location instead of only at frame boundaries. */ +#define CODEC_FLAG_NORMALIZE_AQP 0x00020000 ///< Normalize adaptive quantization. +#define CODEC_FLAG_INTERLACED_DCT 0x00040000 ///< Use interlaced DCT. +#define CODEC_FLAG_LOW_DELAY 0x00080000 ///< Force low delay. +#define CODEC_FLAG_ALT_SCAN 0x00100000 ///< Use alternate scan. +#define CODEC_FLAG_GLOBAL_HEADER 0x00400000 ///< Place global headers in extradata instead of every keyframe. +#define CODEC_FLAG_BITEXACT 0x00800000 ///< Use only bitexact stuff (except (I)DCT). +/* Fx : Flag for h263+ extra options */ +#define CODEC_FLAG_AC_PRED 0x01000000 ///< H.263 advanced intra coding / MPEG-4 AC prediction +#define CODEC_FLAG_H263P_UMV 0x02000000 ///< unlimited motion vector +#define CODEC_FLAG_CBP_RD 0x04000000 ///< Use rate distortion optimization for cbp. +#define CODEC_FLAG_QP_RD 0x08000000 ///< Use rate distortion optimization for qp selectioon. +#define CODEC_FLAG_H263P_AIV 0x00000008 ///< H.263 alternative inter VLC +#define CODEC_FLAG_OBMC 0x00000001 ///< OBMC +#define CODEC_FLAG_LOOP_FILTER 0x00000800 ///< loop filter +#define CODEC_FLAG_H263P_SLICE_STRUCT 0x10000000 +#define CODEC_FLAG_INTERLACED_ME 0x20000000 ///< interlaced motion estimation +#define CODEC_FLAG_SVCD_SCAN_OFFSET 0x40000000 ///< Will reserve space for SVCD scan offset user data. +#define CODEC_FLAG_CLOSED_GOP 0x80000000 +#define CODEC_FLAG2_FAST 0x00000001 ///< Allow non spec compliant speedup tricks. +#define CODEC_FLAG2_STRICT_GOP 0x00000002 ///< Strictly enforce GOP size. +#define CODEC_FLAG2_NO_OUTPUT 0x00000004 ///< Skip bitstream encoding. +#define CODEC_FLAG2_LOCAL_HEADER 0x00000008 ///< Place global headers at every keyframe instead of in extradata. +#define CODEC_FLAG2_BPYRAMID 0x00000010 ///< H.264 allow B-frames to be used as references. +#define CODEC_FLAG2_WPRED 0x00000020 ///< H.264 weighted biprediction for B-frames +#define CODEC_FLAG2_MIXED_REFS 0x00000040 ///< H.264 one reference per partition, as opposed to one reference per macroblock +#define CODEC_FLAG2_8X8DCT 0x00000080 ///< H.264 high profile 8x8 transform +#define CODEC_FLAG2_FASTPSKIP 0x00000100 ///< H.264 fast pskip +#define CODEC_FLAG2_AUD 0x00000200 ///< H.264 access unit delimiters +#define CODEC_FLAG2_BRDO 0x00000400 ///< B-frame rate-distortion optimization +#define CODEC_FLAG2_INTRA_VLC 0x00000800 ///< Use MPEG-2 intra VLC table. +#define CODEC_FLAG2_MEMC_ONLY 0x00001000 ///< Only do ME/MC (I frames -> ref, P frame -> ME+MC). +#define CODEC_FLAG2_DROP_FRAME_TIMECODE 0x00002000 ///< timecode is in drop frame format. +#define CODEC_FLAG2_SKIP_RD 0x00004000 ///< RD optimal MB level residual skipping +#define CODEC_FLAG2_CHUNKS 0x00008000 ///< Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries. +#define CODEC_FLAG2_NON_LINEAR_QUANT 0x00010000 ///< Use MPEG-2 nonlinear quantizer. +#define CODEC_FLAG2_BIT_RESERVOIR 0x00020000 ///< Use a bit reservoir when encoding if possible +#define CODEC_FLAG2_MBTREE 0x00040000 ///< Use macroblock tree ratecontrol (x264 only) +#define CODEC_FLAG2_PSY 0x00080000 ///< Use psycho visual optimizations. +#define CODEC_FLAG2_SSIM 0x00100000 ///< Compute SSIM during encoding, error[] values are undefined. +#define CODEC_FLAG2_INTRA_REFRESH 0x00200000 ///< Use periodic insertion of intra blocks instead of keyframes. + +/* Unsupported options : + * Syntax Arithmetic coding (SAC) + * Reference Picture Selection + * Independent Segment Decoding */ +/* /Fx */ +/* codec capabilities */ + +#define CODEC_CAP_DRAW_HORIZ_BAND 0x0001 ///< Decoder can use draw_horiz_band callback. +/** + * Codec uses get_buffer() for allocating buffers and supports custom allocators. + * If not set, it might not use get_buffer() at all or use operations that + * assume the buffer was allocated by avcodec_default_get_buffer. + */ +#define CODEC_CAP_DR1 0x0002 +/* If 'parse_only' field is true, then avcodec_parse_frame() can be used. */ +#define CODEC_CAP_PARSE_ONLY 0x0004 +#define CODEC_CAP_TRUNCATED 0x0008 +/* Codec can export data for HW decoding (XvMC). */ +#define CODEC_CAP_HWACCEL 0x0010 +/** + * Codec has a nonzero delay and needs to be fed with NULL at the end to get the delayed data. + * If this is not set, the codec is guaranteed to never be fed with NULL data. + */ +#define CODEC_CAP_DELAY 0x0020 +/** + * Codec can be fed a final frame with a smaller size. + * This can be used to prevent truncation of the last audio samples. + */ +#define CODEC_CAP_SMALL_LAST_FRAME 0x0040 +/** + * Codec can export data for HW decoding (VDPAU). + */ +#define CODEC_CAP_HWACCEL_VDPAU 0x0080 +/** + * Codec can output multiple frames per AVPacket + * Normally demuxers return one frame at a time, demuxers which do not do + * are connected to a parser to split what they return into proper frames. + * This flag is reserved to the very rare category of codecs which have a + * bitstream that cannot be split into frames without timeconsuming + * operations like full decoding. Demuxers carring such bitstreams thus + * may return multiple frames in a packet. This has many disadvantages like + * prohibiting stream copy in many cases thus it should only be considered + * as a last resort. + */ +#define CODEC_CAP_SUBFRAMES 0x0100 +/** + * Codec is experimental and is thus avoided in favor of non experimental + * encoders + */ +#define CODEC_CAP_EXPERIMENTAL 0x0200 +/** + * Codec should fill in channel configuration and samplerate instead of container + */ +#define CODEC_CAP_CHANNEL_CONF 0x0400 +/** + * Codec is able to deal with negative linesizes + */ +#define CODEC_CAP_NEG_LINESIZES 0x0800 + +//The following defines may change, don't expect compatibility if you use them. +#define MB_TYPE_INTRA4x4 0x0001 +#define MB_TYPE_INTRA16x16 0x0002 //FIXME H.264-specific +#define MB_TYPE_INTRA_PCM 0x0004 //FIXME H.264-specific +#define MB_TYPE_16x16 0x0008 +#define MB_TYPE_16x8 0x0010 +#define MB_TYPE_8x16 0x0020 +#define MB_TYPE_8x8 0x0040 +#define MB_TYPE_INTERLACED 0x0080 +#define MB_TYPE_DIRECT2 0x0100 //FIXME +#define MB_TYPE_ACPRED 0x0200 +#define MB_TYPE_GMC 0x0400 +#define MB_TYPE_SKIP 0x0800 +#define MB_TYPE_P0L0 0x1000 +#define MB_TYPE_P1L0 0x2000 +#define MB_TYPE_P0L1 0x4000 +#define MB_TYPE_P1L1 0x8000 +#define MB_TYPE_L0 (MB_TYPE_P0L0 | MB_TYPE_P1L0) +#define MB_TYPE_L1 (MB_TYPE_P0L1 | MB_TYPE_P1L1) +#define MB_TYPE_L0L1 (MB_TYPE_L0 | MB_TYPE_L1) +#define MB_TYPE_QUANT 0x00010000 +#define MB_TYPE_CBP 0x00020000 +//Note bits 24-31 are reserved for codec specific use (h264 ref0, mpeg1 0mv, ...) + +/** + * Pan Scan area. + * This specifies the area which should be displayed. + * Note there may be multiple such areas for one frame. + */ +typedef struct AVPanScan{ + /** + * id + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int id; + + /** + * width and height in 1/16 pel + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int width; + int height; + + /** + * position of the top left corner in 1/16 pel for up to 3 fields/frames + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int16_t position[3][2]; +}AVPanScan; + +#define FF_COMMON_FRAME \ + /**\ + * pointer to the picture planes.\ + * This might be different from the first allocated byte\ + * - encoding: \ + * - decoding: \ + */\ + uint8_t *data[4];\ + int linesize[4];\ + /**\ + * pointer to the first allocated byte of the picture. Can be used in get_buffer/release_buffer.\ + * This isn't used by libavcodec unless the default get/release_buffer() is used.\ + * - encoding: \ + * - decoding: \ + */\ + uint8_t *base[4];\ + /**\ + * 1 -> keyframe, 0-> not\ + * - encoding: Set by libavcodec.\ + * - decoding: Set by libavcodec.\ + */\ + int key_frame;\ +\ + /**\ + * Picture type of the frame, see ?_TYPE below.\ + * - encoding: Set by libavcodec. for coded_picture (and set by user for input).\ + * - decoding: Set by libavcodec.\ + */\ + int pict_type;\ +\ + /**\ + * presentation timestamp in time_base units (time when frame should be shown to user)\ + * If AV_NOPTS_VALUE then frame_rate = 1/time_base will be assumed.\ + * - encoding: MUST be set by user.\ + * - decoding: Set by libavcodec.\ + */\ + int64_t pts;\ +\ + /**\ + * picture number in bitstream order\ + * - encoding: set by\ + * - decoding: Set by libavcodec.\ + */\ + int coded_picture_number;\ + /**\ + * picture number in display order\ + * - encoding: set by\ + * - decoding: Set by libavcodec.\ + */\ + int display_picture_number;\ +\ + /**\ + * quality (between 1 (good) and FF_LAMBDA_MAX (bad)) \ + * - encoding: Set by libavcodec. for coded_picture (and set by user for input).\ + * - decoding: Set by libavcodec.\ + */\ + int quality; \ +\ + /**\ + * buffer age (1->was last buffer and dint change, 2->..., ...).\ + * Set to INT_MAX if the buffer has not been used yet.\ + * - encoding: unused\ + * - decoding: MUST be set by get_buffer().\ + */\ + int age;\ +\ + /**\ + * is this picture used as reference\ + * The values for this are the same as the MpegEncContext.picture_structure\ + * variable, that is 1->top field, 2->bottom field, 3->frame/both fields.\ + * Set to 4 for delayed, non-reference frames.\ + * - encoding: unused\ + * - decoding: Set by libavcodec. (before get_buffer() call)).\ + */\ + int reference;\ +\ + /**\ + * QP table\ + * - encoding: unused\ + * - decoding: Set by libavcodec.\ + */\ + int8_t *qscale_table;\ + /**\ + * QP store stride\ + * - encoding: unused\ + * - decoding: Set by libavcodec.\ + */\ + int qstride;\ +\ + /**\ + * mbskip_table[mb]>=1 if MB didn't change\ + * stride= mb_width = (width+15)>>4\ + * - encoding: unused\ + * - decoding: Set by libavcodec.\ + */\ + uint8_t *mbskip_table;\ +\ + /**\ + * motion vector table\ + * @code\ + * example:\ + * int mv_sample_log2= 4 - motion_subsample_log2;\ + * int mb_width= (width+15)>>4;\ + * int mv_stride= (mb_width << mv_sample_log2) + 1;\ + * motion_val[direction][x + y*mv_stride][0->mv_x, 1->mv_y];\ + * @endcode\ + * - encoding: Set by user.\ + * - decoding: Set by libavcodec.\ + */\ + int16_t (*motion_val[2])[2];\ +\ + /**\ + * macroblock type table\ + * mb_type_base + mb_width + 2\ + * - encoding: Set by user.\ + * - decoding: Set by libavcodec.\ + */\ + uint32_t *mb_type;\ +\ + /**\ + * log2 of the size of the block which a single vector in motion_val represents: \ + * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2)\ + * - encoding: unused\ + * - decoding: Set by libavcodec.\ + */\ + uint8_t motion_subsample_log2;\ +\ + /**\ + * for some private data of the user\ + * - encoding: unused\ + * - decoding: Set by user.\ + */\ + void *opaque;\ +\ + /**\ + * error\ + * - encoding: Set by libavcodec. if flags&CODEC_FLAG_PSNR.\ + * - decoding: unused\ + */\ + uint64_t error[4];\ +\ + /**\ + * type of the buffer (to keep track of who has to deallocate data[*])\ + * - encoding: Set by the one who allocates it.\ + * - decoding: Set by the one who allocates it.\ + * Note: User allocated (direct rendering) & internal buffers cannot coexist currently.\ + */\ + int type;\ + \ + /**\ + * When decoding, this signals how much the picture must be delayed.\ + * extra_delay = repeat_pict / (2*fps)\ + * - encoding: unused\ + * - decoding: Set by libavcodec.\ + */\ + int repeat_pict;\ + \ + /**\ + * \ + */\ + int qscale_type;\ + \ + /**\ + * The content of the picture is interlaced.\ + * - encoding: Set by user.\ + * - decoding: Set by libavcodec. (default 0)\ + */\ + int interlaced_frame;\ + \ + /**\ + * If the content is interlaced, is top field displayed first.\ + * - encoding: Set by user.\ + * - decoding: Set by libavcodec.\ + */\ + int top_field_first;\ + \ + /**\ + * Pan scan.\ + * - encoding: Set by user.\ + * - decoding: Set by libavcodec.\ + */\ + AVPanScan *pan_scan;\ + \ + /**\ + * Tell user application that palette has changed from previous frame.\ + * - encoding: ??? (no palette-enabled encoder yet)\ + * - decoding: Set by libavcodec. (default 0).\ + */\ + int palette_has_changed;\ + \ + /**\ + * codec suggestion on buffer type if != 0\ + * - encoding: unused\ + * - decoding: Set by libavcodec. (before get_buffer() call)).\ + */\ + int buffer_hints;\ +\ + /**\ + * DCT coefficients\ + * - encoding: unused\ + * - decoding: Set by libavcodec.\ + */\ + short *dct_coeff;\ +\ + /**\ + * motion reference frame index\ + * the order in which these are stored can depend on the codec.\ + * - encoding: Set by user.\ + * - decoding: Set by libavcodec.\ + */\ + int8_t *ref_index[2];\ +\ + /**\ + * reordered opaque 64bit (generally an integer or a double precision float\ + * PTS but can be anything). \ + * The user sets AVCodecContext.reordered_opaque to represent the input at\ + * that time,\ + * the decoder reorders values as needed and sets AVFrame.reordered_opaque\ + * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque \ + * @deprecated in favor of pkt_pts\ + * - encoding: unused\ + * - decoding: Read by user.\ + */\ + int64_t reordered_opaque;\ +\ + /**\ + * hardware accelerator private data (FFmpeg allocated)\ + * - encoding: unused\ + * - decoding: Set by libavcodec\ + */\ + void *hwaccel_picture_private;\ +\ + /**\ + * reordered pts from the last AVPacket that has been input into the decoder\ + * - encoding: unused\ + * - decoding: Read by user.\ + */\ + int64_t pkt_pts;\ +\ + /**\ + * dts from the last AVPacket that has been input into the decoder\ + * - encoding: unused\ + * - decoding: Read by user.\ + */\ + int64_t pkt_dts;\ + + +#define FF_QSCALE_TYPE_MPEG1 0 +#define FF_QSCALE_TYPE_MPEG2 1 +#define FF_QSCALE_TYPE_H264 2 +#define FF_QSCALE_TYPE_VP56 3 + +#define FF_BUFFER_TYPE_INTERNAL 1 +#define FF_BUFFER_TYPE_USER 2 ///< direct rendering buffers (image is (de)allocated by user) +#define FF_BUFFER_TYPE_SHARED 4 ///< Buffer from somewhere else; don't deallocate image (data/base), all other tables are not shared. +#define FF_BUFFER_TYPE_COPY 8 ///< Just a (modified) copy of some other buffer, don't deallocate anything. + + +#define FF_I_TYPE 1 ///< Intra +#define FF_P_TYPE 2 ///< Predicted +#define FF_B_TYPE 3 ///< Bi-dir predicted +#define FF_S_TYPE 4 ///< S(GMC)-VOP MPEG4 +#define FF_SI_TYPE 5 ///< Switching Intra +#define FF_SP_TYPE 6 ///< Switching Predicted +#define FF_BI_TYPE 7 + +#define FF_BUFFER_HINTS_VALID 0x01 // Buffer hints value is meaningful (if 0 ignore). +#define FF_BUFFER_HINTS_READABLE 0x02 // Codec will read from buffer. +#define FF_BUFFER_HINTS_PRESERVE 0x04 // User must not alter buffer content. +#define FF_BUFFER_HINTS_REUSABLE 0x08 // Codec will reuse the buffer (update). + +typedef struct AVPacket { + /** + * Presentation timestamp in AVStream->time_base units; the time at which + * the decompressed packet will be presented to the user. + * Can be AV_NOPTS_VALUE if it is not stored in the file. + * pts MUST be larger or equal to dts as presentation cannot happen before + * decompression, unless one wants to view hex dumps. Some formats misuse + * the terms dts and pts/cts to mean something different. Such timestamps + * must be converted to true pts/dts before they are stored in AVPacket. + */ + int64_t pts; + /** + * Decompression timestamp in AVStream->time_base units; the time at which + * the packet is decompressed. + * Can be AV_NOPTS_VALUE if it is not stored in the file. + */ + int64_t dts; + uint8_t *data; + int size; + int stream_index; + int flags; + /** + * Duration of this packet in AVStream->time_base units, 0 if unknown. + * Equals next_pts - this_pts in presentation order. + */ + int duration; + void (*destruct)(struct AVPacket *); + void *priv; + int64_t pos; ///< byte position in stream, -1 if unknown + + /** + * Time difference in AVStream->time_base units from the pts of this + * packet to the point at which the output from the decoder has converged + * independent from the availability of previous frames. That is, the + * frames are virtually identical no matter if decoding started from + * the very first frame or from this keyframe. + * Is AV_NOPTS_VALUE if unknown. + * This field is not the display duration of the current packet. + * This field has no meaning if the packet does not have AV_PKT_FLAG_KEY + * set. + * + * The purpose of this field is to allow seeking in streams that have no + * keyframes in the conventional sense. It corresponds to the + * recovery point SEI in H.264 and match_time_delta in NUT. It is also + * essential for some types of subtitle streams to ensure that all + * subtitles are correctly displayed after seeking. + */ + int64_t convergence_duration; +} AVPacket; +#define AV_PKT_FLAG_KEY 0x0001 +#if LIBAVCODEC_VERSION_MAJOR < 53 +#define PKT_FLAG_KEY AV_PKT_FLAG_KEY +#endif + +/** + * Audio Video Frame. + * New fields can be added to the end of FF_COMMON_FRAME with minor version + * bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. No fields should be added into AVFrame before or after + * FF_COMMON_FRAME! + * sizeof(AVFrame) must not be used outside libav*. + */ +typedef struct AVFrame { + FF_COMMON_FRAME +} AVFrame; + +/** + * main external API structure. + * 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(AVCodecContext) must not be used outside libav*. + */ +typedef struct AVCodecContext { + /** + * information on struct for av_log + * - set by avcodec_alloc_context + */ + const AVClass *av_class; + /** + * the average bitrate + * - encoding: Set by user; unused for constant quantizer encoding. + * - decoding: Set by libavcodec. 0 or some bitrate if this info is available in the stream. + */ + int bit_rate; + + /** + * number of bits the bitstream is allowed to diverge from the reference. + * the reference can be CBR (for CBR pass1) or VBR (for pass2) + * - encoding: Set by user; unused for constant quantizer encoding. + * - decoding: unused + */ + int bit_rate_tolerance; + + /** + * CODEC_FLAG_*. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int flags; + + /** + * Some codecs need additional format info. It is stored here. + * If any muxer uses this then ALL demuxers/parsers AND encoders for the + * specific codec MUST set it correctly otherwise stream copy breaks. + * In general use of this field by muxers is not recommanded. + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. (FIXME: Is this OK?) + */ + int sub_id; + + /** + * Motion estimation algorithm used for video coding. + * 1 (zero), 2 (full), 3 (log), 4 (phods), 5 (epzs), 6 (x1), 7 (hex), + * 8 (umh), 9 (iter), 10 (tesa) [7, 8, 10 are x264 specific, 9 is snow specific] + * - encoding: MUST be set by user. + * - decoding: unused + */ + int me_method; + + /** + * some codecs need / can use extradata like Huffman tables. + * mjpeg: Huffman tables + * rv10: additional flags + * mpeg4: global headers (they can be in the bitstream or here) + * The allocated memory should be FF_INPUT_BUFFER_PADDING_SIZE bytes larger + * than extradata_size to avoid prolems if it is read with the bitstream reader. + * The bytewise contents of extradata must not depend on the architecture or CPU endianness. + * - encoding: Set/allocated/freed by libavcodec. + * - decoding: Set/allocated/freed by user. + */ + uint8_t *extradata; + int extradata_size; + + /** + * This is the fundamental unit of time (in seconds) in terms + * of which frame timestamps are represented. For fixed-fps content, + * timebase should be 1/framerate and timestamp increments should be + * identically 1. + * - encoding: MUST be set by user. + * - decoding: Set by libavcodec. + */ + AVRational time_base; + + /* video only */ + /** + * picture width / height. + * - encoding: MUST be set by user. + * - decoding: Set by libavcodec. + * Note: For compatibility it is possible to set this instead of + * coded_width/height before decoding. + */ + int width, height; + +#define FF_ASPECT_EXTENDED 15 + + /** + * the number of pictures in a group of pictures, or 0 for intra_only + * - encoding: Set by user. + * - decoding: unused + */ + int gop_size; + + /** + * Pixel format, see PIX_FMT_xxx. + * May be set by the demuxer if known from headers. + * May be overriden by the decoder if it knows better. + * - encoding: Set by user. + * - decoding: Set by user if known, overridden by libavcodec if known + */ + enum PixelFormat pix_fmt; + + /** + * Frame rate emulation. If not zero, the lower layer (i.e. format handler) + * has to read frames at native frame rate. + * - encoding: Set by user. + * - decoding: unused + */ + int rate_emu; + + /** + * If non NULL, 'draw_horiz_band' is called by the libavcodec + * decoder to draw a horizontal band. It improves cache usage. Not + * all codecs can do that. You must check the codec capabilities + * beforehand. + * The function is also used by hardware acceleration APIs. + * It is called at least once during frame decoding to pass + * the data needed for hardware render. + * In that mode instead of pixel data, AVFrame points to + * a structure specific to the acceleration API. The application + * reads the structure and can change some fields to indicate progress + * or mark state. + * - encoding: unused + * - decoding: Set by user. + * @param height the height of the slice + * @param y the y position of the slice + * @param type 1->top field, 2->bottom field, 3->frame + * @param offset offset into the AVFrame.data from which the slice should be read + */ + void (*draw_horiz_band)(struct AVCodecContext *s, + const AVFrame *src, int offset[4], + int y, int type, int height); + + /* audio only */ + int sample_rate; ///< samples per second + int channels; ///< number of audio channels + + /** + * audio sample format + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + enum AVSampleFormat sample_fmt; ///< sample format + + /* The following data should not be initialized. */ + /** + * Samples per packet, initialized when calling 'init'. + */ + int frame_size; + int frame_number; ///< audio or video frame number +#if LIBAVCODEC_VERSION_MAJOR < 53 + int real_pict_num; ///< Returns the real picture number of previous encoded frame. +#endif + + /** + * Number of frames the decoded output will be delayed relative to + * the encoded input. + * - encoding: Set by libavcodec. + * - decoding: unused + */ + int delay; + + /* - encoding parameters */ + float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0) + float qblur; ///< amount of qscale smoothing over time (0.0-1.0) + + /** + * minimum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmin; + + /** + * maximum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmax; + + /** + * maximum quantizer difference between frames + * - encoding: Set by user. + * - decoding: unused + */ + int max_qdiff; + + /** + * maximum number of B-frames between non-B-frames + * Note: The output will be delayed by max_b_frames+1 relative to the input. + * - encoding: Set by user. + * - decoding: unused + */ + int max_b_frames; + + /** + * qscale factor between IP and B-frames + * If > 0 then the last P-frame quantizer will be used (q= lastp_q*factor+offset). + * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). + * - encoding: Set by user. + * - decoding: unused + */ + float b_quant_factor; + + /** obsolete FIXME remove */ + int rc_strategy; +#define FF_RC_STRATEGY_XVID 1 + + int b_frame_strategy; + + /** + * hurry up amount + * - encoding: unused + * - decoding: Set by user. 1-> Skip B-frames, 2-> Skip IDCT/dequant too, 5-> Skip everything except header + * @deprecated Deprecated in favor of skip_idct and skip_frame. + */ + int hurry_up; + + struct AVCodec *codec; + + void *priv_data; + + int rtp_payload_size; /* The size of the RTP payload: the coder will */ + /* do its best to deliver a chunk with size */ + /* below rtp_payload_size, the chunk will start */ + /* with a start code on some codecs like H.263. */ + /* This doesn't take account of any particular */ + /* headers inside the transmitted RTP payload. */ + + + /* The RTP callback: This function is called */ + /* every time the encoder has a packet to send. */ + /* It depends on the encoder if the data starts */ + /* with a Start Code (it should). H.263 does. */ + /* mb_nb contains the number of macroblocks */ + /* encoded in the RTP payload. */ + void (*rtp_callback)(struct AVCodecContext *avctx, void *data, int size, int mb_nb); + + /* statistics, used for 2-pass encoding */ + int mv_bits; + int header_bits; + int i_tex_bits; + int p_tex_bits; + int i_count; + int p_count; + int skip_count; + int misc_bits; + + /** + * number of bits used for the previously encoded frame + * - encoding: Set by libavcodec. + * - decoding: unused + */ + int frame_bits; + + /** + * Private data of the user, can be used to carry app specific stuff. + * - encoding: Set by user. + * - decoding: Set by user. + */ + void *opaque; + + char codec_name[32]; + enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */ + enum CodecID codec_id; /* see CODEC_ID_xxx */ + + /** + * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A'). + * This is used to work around some encoder bugs. + * A demuxer should set this to what is stored in the field used to identify the codec. + * If there are multiple such fields in a container then the demuxer should choose the one + * which maximizes the information about the used codec. + * If the codec tag field in a container is larger then 32 bits then the demuxer should + * remap the longer ID to 32 bits with a table or other structure. Alternatively a new + * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated + * first. + * - encoding: Set by user, if not then the default based on codec_id will be used. + * - decoding: Set by user, will be converted to uppercase by libavcodec during init. + */ + unsigned int codec_tag; + + /** + * Work around bugs in encoders which sometimes cannot be detected automatically. + * - encoding: Set by user + * - decoding: Set by user + */ + int workaround_bugs; +#define FF_BUG_AUTODETECT 1 ///< autodetection +#define FF_BUG_OLD_MSMPEG4 2 +#define FF_BUG_XVID_ILACE 4 +#define FF_BUG_UMP4 8 +#define FF_BUG_NO_PADDING 16 +#define FF_BUG_AMV 32 +#define FF_BUG_AC_VLC 0 ///< Will be removed, libavcodec can now handle these non-compliant files by default. +#define FF_BUG_QPEL_CHROMA 64 +#define FF_BUG_STD_QPEL 128 +#define FF_BUG_QPEL_CHROMA2 256 +#define FF_BUG_DIRECT_BLOCKSIZE 512 +#define FF_BUG_EDGE 1024 +#define FF_BUG_HPEL_CHROMA 2048 +#define FF_BUG_DC_CLIP 4096 +#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders. +#define FF_BUG_TRUNCATED 16384 +//#define FF_BUG_FAKE_SCALABILITY 16 //Autodetection should work 100%. + + /** + * luma single coefficient elimination threshold + * - encoding: Set by user. + * - decoding: unused + */ + int luma_elim_threshold; + + /** + * chroma single coeff elimination threshold + * - encoding: Set by user. + * - decoding: unused + */ + int chroma_elim_threshold; + + /** + * strictly follow the standard (MPEG4, ...). + * - encoding: Set by user. + * - decoding: Set by user. + * Setting this to STRICT or higher means the encoder and decoder will + * generally do stupid things, whereas setting it to unofficial or lower + * will mean the encoder might produce output that is not supported by all + * spec-compliant decoders. Decoders don't differentiate between normal, + * unofficial and experimental (that is, they always try to decode things + * when they can) unless they are explicitly asked to behave stupidly + * (=strictly conform to the specs) + */ + int strict_std_compliance; +#define FF_COMPLIANCE_VERY_STRICT 2 ///< Strictly conform to an older more strict version of the spec or reference software. +#define FF_COMPLIANCE_STRICT 1 ///< Strictly conform to all the things in the spec no matter what consequences. +#define FF_COMPLIANCE_NORMAL 0 +#if FF_API_INOFFICIAL +#define FF_COMPLIANCE_INOFFICIAL -1 ///< Allow inofficial extensions (deprecated - use FF_COMPLIANCE_UNOFFICIAL instead). +#endif +#define FF_COMPLIANCE_UNOFFICIAL -1 ///< Allow unofficial extensions +#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things. + + /** + * qscale offset between IP and B-frames + * - encoding: Set by user. + * - decoding: unused + */ + float b_quant_offset; + + /** + * Error recognization; higher values will detect more errors but may + * misdetect some more or less valid parts as errors. + * - encoding: unused + * - decoding: Set by user. + */ + int error_recognition; +#define FF_ER_CAREFUL 1 +#define FF_ER_COMPLIANT 2 +#define FF_ER_AGGRESSIVE 3 +#define FF_ER_VERY_AGGRESSIVE 4 + + /** + * Called at the beginning of each frame to get a buffer for it. + * If pic.reference is set then the frame will be read later by libavcodec. + * avcodec_align_dimensions2() should be used to find the required width and + * height, as they normally need to be rounded up to the next multiple of 16. + * if CODEC_CAP_DR1 is not set then get_buffer() must call + * avcodec_default_get_buffer() instead of providing buffers allocated by + * some other means. + * - encoding: unused + * - decoding: Set by libavcodec, user can override. + */ + int (*get_buffer)(struct AVCodecContext *c, AVFrame *pic); + + /** + * Called to release buffers which were allocated with get_buffer. + * A released buffer can be reused in get_buffer(). + * pic.data[*] must be set to NULL. + * - encoding: unused + * - decoding: Set by libavcodec, user can override. + */ + void (*release_buffer)(struct AVCodecContext *c, AVFrame *pic); + + /** + * Size of the frame reordering buffer in the decoder. + * For MPEG-2 it is 1 IPB or 0 low delay IP. + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int has_b_frames; + + /** + * number of bytes per packet if constant and known or 0 + * Used by some WAV based audio codecs. + */ + int block_align; + + int parse_only; /* - decoding only: If true, only parsing is done + (function avcodec_parse_frame()). The frame + data is returned. Only MPEG codecs support this now. */ + + /** + * 0-> h263 quant 1-> mpeg quant + * - encoding: Set by user. + * - decoding: unused + */ + int mpeg_quant; + + /** + * pass1 encoding statistics output buffer + * - encoding: Set by libavcodec. + * - decoding: unused + */ + char *stats_out; + + /** + * pass2 encoding statistics input buffer + * Concatenated stuff from stats_out of pass1 should be placed here. + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + char *stats_in; + + /** + * ratecontrol qmin qmax limiting method + * 0-> clipping, 1-> use a nice continous function to limit qscale wthin qmin/qmax. + * - encoding: Set by user. + * - decoding: unused + */ + float rc_qsquish; + + float rc_qmod_amp; + int rc_qmod_freq; + + /** + * ratecontrol override, see RcOverride + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + RcOverride *rc_override; + int rc_override_count; + + /** + * rate control equation + * - encoding: Set by user + * - decoding: unused + */ + const char *rc_eq; + + /** + * maximum bitrate + * - encoding: Set by user. + * - decoding: unused + */ + int rc_max_rate; + + /** + * minimum bitrate + * - encoding: Set by user. + * - decoding: unused + */ + int rc_min_rate; + + /** + * decoder bitstream buffer size + * - encoding: Set by user. + * - decoding: unused + */ + int rc_buffer_size; + float rc_buffer_aggressivity; + + /** + * qscale factor between P and I-frames + * If > 0 then the last p frame quantizer will be used (q= lastp_q*factor+offset). + * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). + * - encoding: Set by user. + * - decoding: unused + */ + float i_quant_factor; + + /** + * qscale offset between P and I-frames + * - encoding: Set by user. + * - decoding: unused + */ + float i_quant_offset; + + /** + * initial complexity for pass1 ratecontrol + * - encoding: Set by user. + * - decoding: unused + */ + float rc_initial_cplx; + + /** + * DCT algorithm, see FF_DCT_* below + * - encoding: Set by user. + * - decoding: unused + */ + int dct_algo; +#define FF_DCT_AUTO 0 +#define FF_DCT_FASTINT 1 +#define FF_DCT_INT 2 +#define FF_DCT_MMX 3 +#define FF_DCT_MLIB 4 +#define FF_DCT_ALTIVEC 5 +#define FF_DCT_FAAN 6 + + /** + * luminance masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float lumi_masking; + + /** + * temporary complexity masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float temporal_cplx_masking; + + /** + * spatial complexity masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float spatial_cplx_masking; + + /** + * p block masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float p_masking; + + /** + * darkness masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float dark_masking; + + /** + * IDCT algorithm, see FF_IDCT_* below. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int idct_algo; +#define FF_IDCT_AUTO 0 +#define FF_IDCT_INT 1 +#define FF_IDCT_SIMPLE 2 +#define FF_IDCT_SIMPLEMMX 3 +#define FF_IDCT_LIBMPEG2MMX 4 +#define FF_IDCT_PS2 5 +#define FF_IDCT_MLIB 6 +#define FF_IDCT_ARM 7 +#define FF_IDCT_ALTIVEC 8 +#define FF_IDCT_SH4 9 +#define FF_IDCT_SIMPLEARM 10 +#define FF_IDCT_H264 11 +#define FF_IDCT_VP3 12 +#define FF_IDCT_IPP 13 +#define FF_IDCT_XVIDMMX 14 +#define FF_IDCT_CAVS 15 +#define FF_IDCT_SIMPLEARMV5TE 16 +#define FF_IDCT_SIMPLEARMV6 17 +#define FF_IDCT_SIMPLEVIS 18 +#define FF_IDCT_WMV2 19 +#define FF_IDCT_FAAN 20 +#define FF_IDCT_EA 21 +#define FF_IDCT_SIMPLENEON 22 +#define FF_IDCT_SIMPLEALPHA 23 +#define FF_IDCT_BINK 24 + + /** + * slice count + * - encoding: Set by libavcodec. + * - decoding: Set by user (or 0). + */ + int slice_count; + /** + * slice offsets in the frame in bytes + * - encoding: Set/allocated by libavcodec. + * - decoding: Set/allocated by user (or NULL). + */ + int *slice_offset; + + /** + * error concealment flags + * - encoding: unused + * - decoding: Set by user. + */ + int error_concealment; +#define FF_EC_GUESS_MVS 1 +#define FF_EC_DEBLOCK 2 + + /** + * dsp_mask could be add used to disable unwanted CPU features + * CPU features (i.e. MMX, SSE. ...) + * + * With the FORCE flag you may instead enable given CPU features. + * (Dangerous: Usable in case of misdetection, improper usage however will + * result into program crash.) + */ + unsigned dsp_mask; + +#if FF_API_MM_FLAGS +#define FF_MM_FORCE AV_CPU_FLAG_FORCE +#define FF_MM_MMX AV_CPU_FLAG_MMX +#define FF_MM_3DNOW AV_CPU_FLAG_3DNOW +#define FF_MM_MMXEXT AV_CPU_FLAG_MMX2 +#define FF_MM_MMX2 AV_CPU_FLAG_MMX2 +#define FF_MM_SSE AV_CPU_FLAG_SSE +#define FF_MM_SSE2 AV_CPU_FLAG_SSE2 +#define FF_MM_SSE2SLOW AV_CPU_FLAG_SSE2SLOW +#define FF_MM_3DNOWEXT AV_CPU_FLAG_3DNOWEXT +#define FF_MM_SSE3 AV_CPU_FLAG_SSE3 +#define FF_MM_SSE3SLOW AV_CPU_FLAG_SSE3SLOW +#define FF_MM_SSSE3 AV_CPU_FLAG_SSSE3 +#define FF_MM_SSE4 AV_CPU_FLAG_SSE4 +#define FF_MM_SSE42 AV_CPU_FLAG_SSE42 +#define FF_MM_IWMMXT AV_CPU_FLAG_IWMMXT +#define FF_MM_ALTIVEC AV_CPU_FLAG_ALTIVEC +#endif + + /** + * bits per sample/pixel from the demuxer (needed for huffyuv). + * - encoding: Set by libavcodec. + * - decoding: Set by user. + */ + int bits_per_coded_sample; + + /** + * prediction method (needed for huffyuv) + * - encoding: Set by user. + * - decoding: unused + */ + int prediction_method; +#define FF_PRED_LEFT 0 +#define FF_PRED_PLANE 1 +#define FF_PRED_MEDIAN 2 + + /** + * sample aspect ratio (0 if unknown) + * That is the width of a pixel divided by the height of the pixel. + * Numerator and denominator must be relatively prime and smaller than 256 for some video standards. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + AVRational sample_aspect_ratio; + + /** + * the picture in the bitstream + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + AVFrame *coded_frame; + + /** + * debug + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug; +#define FF_DEBUG_PICT_INFO 1 +#define FF_DEBUG_RC 2 +#define FF_DEBUG_BITSTREAM 4 +#define FF_DEBUG_MB_TYPE 8 +#define FF_DEBUG_QP 16 +#define FF_DEBUG_MV 32 +#define FF_DEBUG_DCT_COEFF 0x00000040 +#define FF_DEBUG_SKIP 0x00000080 +#define FF_DEBUG_STARTCODE 0x00000100 +#define FF_DEBUG_PTS 0x00000200 +#define FF_DEBUG_ER 0x00000400 +#define FF_DEBUG_MMCO 0x00000800 +#define FF_DEBUG_BUGS 0x00001000 +#define FF_DEBUG_VIS_QP 0x00002000 +#define FF_DEBUG_VIS_MB_TYPE 0x00004000 +#define FF_DEBUG_BUFFERS 0x00008000 + + /** + * debug + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug_mv; +#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 //visualize forward predicted MVs of P frames +#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 //visualize forward predicted MVs of B frames +#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames + + /** + * error + * - encoding: Set by libavcodec if flags&CODEC_FLAG_PSNR. + * - decoding: unused + */ + uint64_t error[4]; + + /** + * minimum MB quantizer + * - encoding: unused + * - decoding: unused + */ + int mb_qmin; + + /** + * maximum MB quantizer + * - encoding: unused + * - decoding: unused + */ + int mb_qmax; + + /** + * motion estimation comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_cmp; + /** + * subpixel motion estimation comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_sub_cmp; + /** + * macroblock comparison function (not supported yet) + * - encoding: Set by user. + * - decoding: unused + */ + int mb_cmp; + /** + * interlaced DCT comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int ildct_cmp; +#define FF_CMP_SAD 0 +#define FF_CMP_SSE 1 +#define FF_CMP_SATD 2 +#define FF_CMP_DCT 3 +#define FF_CMP_PSNR 4 +#define FF_CMP_BIT 5 +#define FF_CMP_RD 6 +#define FF_CMP_ZERO 7 +#define FF_CMP_VSAD 8 +#define FF_CMP_VSSE 9 +#define FF_CMP_NSSE 10 +#define FF_CMP_W53 11 +#define FF_CMP_W97 12 +#define FF_CMP_DCTMAX 13 +#define FF_CMP_DCT264 14 +#define FF_CMP_CHROMA 256 + + /** + * ME diamond size & shape + * - encoding: Set by user. + * - decoding: unused + */ + int dia_size; + + /** + * amount of previous MV predictors (2a+1 x 2a+1 square) + * - encoding: Set by user. + * - decoding: unused + */ + int last_predictor_count; + + /** + * prepass for motion estimation + * - encoding: Set by user. + * - decoding: unused + */ + int pre_me; + + /** + * motion estimation prepass comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_pre_cmp; + + /** + * ME prepass diamond size & shape + * - encoding: Set by user. + * - decoding: unused + */ + int pre_dia_size; + + /** + * subpel ME quality + * - encoding: Set by user. + * - decoding: unused + */ + int me_subpel_quality; + + /** + * callback to negotiate the pixelFormat + * @param fmt is the list of formats which are supported by the codec, + * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality. + * The first is always the native one. + * @return the chosen format + * - encoding: unused + * - decoding: Set by user, if not set the native format will be chosen. + */ + enum PixelFormat (*get_format)(struct AVCodecContext *s, const enum PixelFormat * fmt); + + /** + * DTG active format information (additional aspect ratio + * information only used in DVB MPEG-2 transport streams) + * 0 if not set. + * + * - encoding: unused + * - decoding: Set by decoder. + */ + int dtg_active_format; +#define FF_DTG_AFD_SAME 8 +#define FF_DTG_AFD_4_3 9 +#define FF_DTG_AFD_16_9 10 +#define FF_DTG_AFD_14_9 11 +#define FF_DTG_AFD_4_3_SP_14_9 13 +#define FF_DTG_AFD_16_9_SP_14_9 14 +#define FF_DTG_AFD_SP_4_3 15 + + /** + * maximum motion estimation search range in subpel units + * If 0 then no limit. + * + * - encoding: Set by user. + * - decoding: unused + */ + int me_range; + + /** + * intra quantizer bias + * - encoding: Set by user. + * - decoding: unused + */ + int intra_quant_bias; +#define FF_DEFAULT_QUANT_BIAS 999999 + + /** + * inter quantizer bias + * - encoding: Set by user. + * - decoding: unused + */ + int inter_quant_bias; + + /** + * color table ID + * - encoding: unused + * - decoding: Which clrtable should be used for 8bit RGB images. + * Tables have to be stored somewhere. FIXME + */ + int color_table_id; + + /** + * internal_buffer count + * Don't touch, used by libavcodec default_get_buffer(). + */ + int internal_buffer_count; + + /** + * internal_buffers + * Don't touch, used by libavcodec default_get_buffer(). + */ + void *internal_buffer; + + /** + * Global quality for codecs which cannot change it per frame. + * This should be proportional to MPEG-1/2/4 qscale. + * - encoding: Set by user. + * - decoding: unused + */ + int global_quality; + +#define FF_CODER_TYPE_VLC 0 +#define FF_CODER_TYPE_AC 1 +#define FF_CODER_TYPE_RAW 2 +#define FF_CODER_TYPE_RLE 3 +#define FF_CODER_TYPE_DEFLATE 4 + /** + * coder type + * - encoding: Set by user. + * - decoding: unused + */ + int coder_type; + + /** + * context model + * - encoding: Set by user. + * - decoding: unused + */ + int context_model; +#if 0 + /** + * + * - encoding: unused + * - decoding: Set by user. + */ + uint8_t * (*realloc)(struct AVCodecContext *s, uint8_t *buf, int buf_size); +#endif + + /** + * slice flags + * - encoding: unused + * - decoding: Set by user. + */ + int slice_flags; +#define SLICE_FLAG_CODED_ORDER 0x0001 ///< draw_horiz_band() is called in coded order instead of display +#define SLICE_FLAG_ALLOW_FIELD 0x0002 ///< allow draw_horiz_band() with field slices (MPEG2 field pics) +#define SLICE_FLAG_ALLOW_PLANE 0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1) + + /** + * XVideo Motion Acceleration + * - encoding: forbidden + * - decoding: set by decoder + */ + int xvmc_acceleration; + + /** + * macroblock decision mode + * - encoding: Set by user. + * - decoding: unused + */ + int mb_decision; +#define FF_MB_DECISION_SIMPLE 0 ///< uses mb_cmp +#define FF_MB_DECISION_BITS 1 ///< chooses the one which needs the fewest bits +#define FF_MB_DECISION_RD 2 ///< rate distortion + + /** + * custom intra quantization matrix + * - encoding: Set by user, can be NULL. + * - decoding: Set by libavcodec. + */ + uint16_t *intra_matrix; + + /** + * custom inter quantization matrix + * - encoding: Set by user, can be NULL. + * - decoding: Set by libavcodec. + */ + uint16_t *inter_matrix; + + /** + * fourcc from the AVI stream header (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A'). + * This is used to work around some encoder bugs. + * - encoding: unused + * - decoding: Set by user, will be converted to uppercase by libavcodec during init. + */ + unsigned int stream_codec_tag; + + /** + * scene change detection threshold + * 0 is default, larger means fewer detected scene changes. + * - encoding: Set by user. + * - decoding: unused + */ + int scenechange_threshold; + + /** + * minimum Lagrange multipler + * - encoding: Set by user. + * - decoding: unused + */ + int lmin; + + /** + * maximum Lagrange multipler + * - encoding: Set by user. + * - decoding: unused + */ + int lmax; + +#if FF_API_PALETTE_CONTROL + /** + * palette control structure + * - encoding: ??? (no palette-enabled encoder yet) + * - decoding: Set by user. + */ + struct AVPaletteControl *palctrl; +#endif + + /** + * noise reduction strength + * - encoding: Set by user. + * - decoding: unused + */ + int noise_reduction; + + /** + * Called at the beginning of a frame to get cr buffer for it. + * Buffer type (size, hints) must be the same. libavcodec won't check it. + * libavcodec will pass previous buffer in pic, function should return + * same buffer or new buffer with old frame "painted" into it. + * If pic.data[0] == NULL must behave like get_buffer(). + * if CODEC_CAP_DR1 is not set then reget_buffer() must call + * avcodec_default_reget_buffer() instead of providing buffers allocated by + * some other means. + * - encoding: unused + * - decoding: Set by libavcodec, user can override. + */ + int (*reget_buffer)(struct AVCodecContext *c, AVFrame *pic); + + /** + * Number of bits which should be loaded into the rc buffer before decoding starts. + * - encoding: Set by user. + * - decoding: unused + */ + int rc_initial_buffer_occupancy; + + /** + * + * - encoding: Set by user. + * - decoding: unused + */ + int inter_threshold; + + /** + * CODEC_FLAG2_* + * - encoding: Set by user. + * - decoding: Set by user. + */ + int flags2; + + /** + * Simulates errors in the bitstream to test error concealment. + * - encoding: Set by user. + * - decoding: unused + */ + int error_rate; + + /** + * MP3 antialias algorithm, see FF_AA_* below. + * - encoding: unused + * - decoding: Set by user. + */ + int antialias_algo; +#define FF_AA_AUTO 0 +#define FF_AA_FASTINT 1 //not implemented yet +#define FF_AA_INT 2 +#define FF_AA_FLOAT 3 + /** + * quantizer noise shaping + * - encoding: Set by user. + * - decoding: unused + */ + int quantizer_noise_shaping; + + /** + * thread count + * is used to decide how many independent tasks should be passed to execute() + * - encoding: Set by user. + * - decoding: Set by user. + */ + int thread_count; + + /** + * The codec may call this to execute several independent things. + * It will return only after finishing all tasks. + * The user may replace this with some multithreaded implementation, + * the default implementation will execute the parts serially. + * @param count the number of things to execute + * - encoding: Set by libavcodec, user can override. + * - decoding: Set by libavcodec, user can override. + */ + int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size); + + /** + * thread opaque + * Can be used by execute() to store some per AVCodecContext stuff. + * - encoding: set by execute() + * - decoding: set by execute() + */ + void *thread_opaque; + + /** + * Motion estimation threshold below which no motion estimation is + * performed, but instead the user specified motion vectors are used. + * + * - encoding: Set by user. + * - decoding: unused + */ + int me_threshold; + + /** + * Macroblock threshold below which the user specified macroblock types will be used. + * - encoding: Set by user. + * - decoding: unused + */ + int mb_threshold; + + /** + * precision of the intra DC coefficient - 8 + * - encoding: Set by user. + * - decoding: unused + */ + int intra_dc_precision; + + /** + * noise vs. sse weight for the nsse comparsion function + * - encoding: Set by user. + * - decoding: unused + */ + int nsse_weight; + + /** + * Number of macroblock rows at the top which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_top; + + /** + * Number of macroblock rows at the bottom which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_bottom; + + /** + * profile + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int profile; +#define FF_PROFILE_UNKNOWN -99 + +#define FF_PROFILE_AAC_MAIN 0 +#define FF_PROFILE_AAC_LOW 1 +#define FF_PROFILE_AAC_SSR 2 +#define FF_PROFILE_AAC_LTP 3 + +#define FF_PROFILE_DTS 20 +#define FF_PROFILE_DTS_ES 30 +#define FF_PROFILE_DTS_96_24 40 +#define FF_PROFILE_DTS_HD_HRA 50 +#define FF_PROFILE_DTS_HD_MA 60 + +#define FF_PROFILE_H264_BASELINE 66 +#define FF_PROFILE_H264_MAIN 77 +#define FF_PROFILE_H264_EXTENDED 88 +#define FF_PROFILE_H264_HIGH 100 +#define FF_PROFILE_H264_HIGH_10 110 +#define FF_PROFILE_H264_HIGH_422 122 +#define FF_PROFILE_H264_HIGH_444 244 +#define FF_PROFILE_H264_CAVLC_444 44 + + /** + * level + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int level; +#define FF_LEVEL_UNKNOWN -99 + + /** + * low resolution decoding, 1-> 1/2 size, 2->1/4 size + * - encoding: unused + * - decoding: Set by user. + */ + int lowres; + + /** + * Bitstream width / height, may be different from width/height if lowres + * or other things are used. + * - encoding: unused + * - decoding: Set by user before init if known. Codec should override / dynamically change if needed. + */ + int coded_width, coded_height; + + /** + * frame skip threshold + * - encoding: Set by user. + * - decoding: unused + */ + int frame_skip_threshold; + + /** + * frame skip factor + * - encoding: Set by user. + * - decoding: unused + */ + int frame_skip_factor; + + /** + * frame skip exponent + * - encoding: Set by user. + * - decoding: unused + */ + int frame_skip_exp; + + /** + * frame skip comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int frame_skip_cmp; + + /** + * Border processing masking, raises the quantizer for mbs on the borders + * of the picture. + * - encoding: Set by user. + * - decoding: unused + */ + float border_masking; + + /** + * minimum MB lagrange multipler + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmin; + + /** + * maximum MB lagrange multipler + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmax; + + /** + * + * - encoding: Set by user. + * - decoding: unused + */ + int me_penalty_compensation; + + /** + * + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_loop_filter; + + /** + * + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_idct; + + /** + * + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_frame; + + /** + * + * - encoding: Set by user. + * - decoding: unused + */ + int bidir_refine; + + /** + * + * - encoding: Set by user. + * - decoding: unused + */ + int brd_scale; + + /** + * constant rate factor - quality-based VBR - values ~correspond to qps + * - encoding: Set by user. + * - decoding: unused + */ + float crf; + + /** + * constant quantization parameter rate control method + * - encoding: Set by user. + * - decoding: unused + */ + int cqp; + + /** + * minimum GOP size + * - encoding: Set by user. + * - decoding: unused + */ + int keyint_min; + + /** + * number of reference frames + * - encoding: Set by user. + * - decoding: Set by lavc. + */ + int refs; + + /** + * chroma qp offset from luma + * - encoding: Set by user. + * - decoding: unused + */ + int chromaoffset; + + /** + * Influences how often B-frames are used. + * - encoding: Set by user. + * - decoding: unused + */ + int bframebias; + + /** + * trellis RD quantization + * - encoding: Set by user. + * - decoding: unused + */ + int trellis; + + /** + * Reduce fluctuations in qp (before curve compression). + * - encoding: Set by user. + * - decoding: unused + */ + float complexityblur; + + /** + * in-loop deblocking filter alphac0 parameter + * alpha is in the range -6...6 + * - encoding: Set by user. + * - decoding: unused + */ + int deblockalpha; + + /** + * in-loop deblocking filter beta parameter + * beta is in the range -6...6 + * - encoding: Set by user. + * - decoding: unused + */ + int deblockbeta; + + /** + * macroblock subpartition sizes to consider - p8x8, p4x4, b8x8, i8x8, i4x4 + * - encoding: Set by user. + * - decoding: unused + */ + int partitions; +#define X264_PART_I4X4 0x001 /* Analyze i4x4 */ +#define X264_PART_I8X8 0x002 /* Analyze i8x8 (requires 8x8 transform) */ +#define X264_PART_P8X8 0x010 /* Analyze p16x8, p8x16 and p8x8 */ +#define X264_PART_P4X4 0x020 /* Analyze p8x4, p4x8, p4x4 */ +#define X264_PART_B8X8 0x100 /* Analyze b16x8, b8x16 and b8x8 */ + + /** + * direct MV prediction mode - 0 (none), 1 (spatial), 2 (temporal), 3 (auto) + * - encoding: Set by user. + * - decoding: unused + */ + int directpred; + + /** + * Audio cutoff bandwidth (0 means "automatic") + * - encoding: Set by user. + * - decoding: unused + */ + int cutoff; + + /** + * Multiplied by qscale for each frame and added to scene_change_score. + * - encoding: Set by user. + * - decoding: unused + */ + int scenechange_factor; + + /** + * + * Note: Value depends upon the compare function used for fullpel ME. + * - encoding: Set by user. + * - decoding: unused + */ + int mv0_threshold; + + /** + * Adjusts sensitivity of b_frame_strategy 1. + * - encoding: Set by user. + * - decoding: unused + */ + int b_sensitivity; + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int compression_level; +#define FF_COMPRESSION_DEFAULT -1 + +#if FF_API_USE_LPC + /** + * Sets whether to use LPC mode - used by FLAC encoder. + * - encoding: Set by user. + * - decoding: unused + * @deprecated Deprecated in favor of lpc_type and lpc_passes. + */ + int use_lpc; +#endif + + /** + * LPC coefficient precision - used by FLAC encoder + * - encoding: Set by user. + * - decoding: unused + */ + int lpc_coeff_precision; + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int min_prediction_order; + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int max_prediction_order; + + /** + * search method for selecting prediction order + * - encoding: Set by user. + * - decoding: unused + */ + int prediction_order_method; + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int min_partition_order; + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int max_partition_order; + + /** + * GOP timecode frame start number, in non drop frame format + * - encoding: Set by user. + * - decoding: unused + */ + int64_t timecode_frame_start; + +#if LIBAVCODEC_VERSION_MAJOR < 53 + /** + * Decoder should decode to this many channels if it can (0 for default) + * - encoding: unused + * - decoding: Set by user. + * @deprecated Deprecated in favor of request_channel_layout. + */ + int request_channels; +#endif + + /** + * Percentage of dynamic range compression to be applied by the decoder. + * The default value is 1.0, corresponding to full compression. + * - encoding: unused + * - decoding: Set by user. + */ + float drc_scale; + + /** + * opaque 64bit number (generally a PTS) that will be reordered and + * output in AVFrame.reordered_opaque + * @deprecated in favor of pkt_pts + * - encoding: unused + * - decoding: Set by user. + */ + int64_t reordered_opaque; + + /** + * Bits per sample/pixel of internal libavcodec pixel/sample format. + * This field is applicable only when sample_fmt is AV_SAMPLE_FMT_S32. + * - encoding: set by user. + * - decoding: set by libavcodec. + */ + int bits_per_raw_sample; + + /** + * Audio channel layout. + * - encoding: set by user. + * - decoding: set by libavcodec. + */ + int64_t channel_layout; + + /** + * Request decoder to use this channel layout if it can (0 for default) + * - encoding: unused + * - decoding: Set by user. + */ + int64_t request_channel_layout; + + /** + * Ratecontrol attempt to use, at maximum, of what can be used without an underflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_max_available_vbv_use; + + /** + * Ratecontrol attempt to use, at least, times the amount needed to prevent a vbv overflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_min_vbv_overflow_use; + + /** + * Hardware accelerator in use + * - encoding: unused. + * - decoding: Set by libavcodec + */ + struct AVHWAccel *hwaccel; + + /** + * For some codecs, the time base is closer to the field rate than the frame rate. + * Most notably, H.264 and MPEG-2 specify time_base as half of frame duration + * if no telecine is used ... + * + * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2. + */ + int ticks_per_frame; + + /** + * Hardware accelerator context. + * For some hardware accelerators, a global context needs to be + * provided by the user. In that case, this holds display-dependent + * data FFmpeg cannot instantiate itself. Please refer to the + * FFmpeg HW accelerator documentation to know how to fill this + * is. e.g. for VA API, this is a struct vaapi_context. + * - encoding: unused + * - decoding: Set by user + */ + void *hwaccel_context; + + /** + * Chromaticity coordinates of the source primaries. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorPrimaries color_primaries; + + /** + * Color Transfer Characteristic. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorTransferCharacteristic color_trc; + + /** + * YUV colorspace type. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorSpace colorspace; + + /** + * MPEG vs JPEG YUV range. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorRange color_range; + + /** + * This defines the location of chroma samples. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVChromaLocation chroma_sample_location; + + /** + * The codec may call this to execute several independent things. + * It will return only after finishing all tasks. + * The user may replace this with some multithreaded implementation, + * the default implementation will execute the parts serially. + * Also see avcodec_thread_init and e.g. the --enable-pthread configure option. + * @param c context passed also to func + * @param count the number of things to execute + * @param arg2 argument passed unchanged to func + * @param ret return values of executed functions, must have space for "count" values. May be NULL. + * @param func function that will be called count times, with jobnr from 0 to count-1. + * threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no + * two instances of func executing at the same time will have the same threadnr. + * @return always 0 currently, but code should handle a future improvement where when any call to func + * returns < 0 no further calls to func may be done and < 0 is returned. + * - encoding: Set by libavcodec, user can override. + * - decoding: Set by libavcodec, user can override. + */ + int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count); + + /** + * explicit P-frame weighted prediction analysis method + * 0: off + * 1: fast blind weighting (one reference duplicate with -1 offset) + * 2: smart weighting (full fade detection analysis) + * - encoding: Set by user. + * - decoding: unused + */ + int weighted_p_pred; + + /** + * AQ mode + * 0: Disabled + * 1: Variance AQ (complexity mask) + * 2: Auto-variance AQ (experimental) + * - encoding: Set by user + * - decoding: unused + */ + int aq_mode; + + /** + * AQ strength + * Reduces blocking and blurring in flat and textured areas. + * - encoding: Set by user + * - decoding: unused + */ + float aq_strength; + + /** + * PSY RD + * Strength of psychovisual optimization + * - encoding: Set by user + * - decoding: unused + */ + float psy_rd; + + /** + * PSY trellis + * Strength of psychovisual optimization + * - encoding: Set by user + * - decoding: unused + */ + float psy_trellis; + + /** + * RC lookahead + * Number of frames for frametype and ratecontrol lookahead + * - encoding: Set by user + * - decoding: unused + */ + int rc_lookahead; + + /** + * Constant rate factor maximum + * With CRF encoding mode and VBV restrictions enabled, prevents quality from being worse + * than crf_max, even if doing so would violate VBV restrictions. + * - encoding: Set by user. + * - decoding: unused + */ + float crf_max; + + int log_level_offset; + + /** + * Determines which LPC analysis algorithm to use. + * - encoding: Set by user + * - decoding: unused + */ + enum AVLPCType lpc_type; + + /** + * Number of passes to use for Cholesky factorization during LPC analysis + * - encoding: Set by user + * - decoding: unused + */ + int lpc_passes; + + /** + * Number of slices. + * Indicates number of picture subdivisions. Used for parallelized + * decoding. + * - encoding: Set by user + * - decoding: unused + */ + int slices; + + /** + * Header containing style information for text subtitles. + * For SUBTITLE_ASS subtitle type, it should contain the whole ASS + * [Script Info] and [V4+ Styles] section, plus the [Events] line and + * the Format line following. It shouldn't include any Dialogue line. + * - encoding: Set/allocated/freed by user (before avcodec_open()) + * - decoding: Set/allocated/freed by libavcodec (by avcodec_open()) + */ + uint8_t *subtitle_header; + int subtitle_header_size; + + /** + * Current packet as passed into the decoder, to avoid having + * to pass the packet into every function. Currently only valid + * inside lavc and get/release_buffer callbacks. + * - decoding: set by avcodec_decode_*, read by get_buffer() for setting pkt_pts + * - encoding: unused + */ + AVPacket *pkt; +} AVCodecContext; + +/** + * AVProfile. + */ +typedef struct AVProfile { + int profile; + const char *name; ///< short name for the profile +} AVProfile; + +/** + * AVCodec. + */ +typedef struct AVCodec { + /** + * Name of the codec implementation. + * The name is globally unique among encoders and among decoders (but an + * encoder and a decoder can share the same name). + * This is the primary way to find a codec from the user perspective. + */ + const char *name; + enum AVMediaType type; + enum CodecID id; + int priv_data_size; + int (*init)(AVCodecContext *); + int (*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data); + int (*close)(AVCodecContext *); + int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt); + /** + * Codec capabilities. + * see CODEC_CAP_* + */ + int capabilities; + struct AVCodec *next; + /** + * Flush buffers. + * Will be called when seeking + */ + void (*flush)(AVCodecContext *); + const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0} + const enum PixelFormat *pix_fmts; ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1 + /** + * Descriptive name for the codec, meant to be more human readable than name. + * You should use the NULL_IF_CONFIG_SMALL() macro to define it. + */ + const char *long_name; + const int *supported_samplerates; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0 + const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1 + const int64_t *channel_layouts; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0 + uint8_t max_lowres; ///< maximum value for lowres supported by the decoder + AVClass *priv_class; ///< AVClass for the private context + const AVProfile *profiles; ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN} +} AVCodec; + +/** + * AVHWAccel. + */ +typedef struct AVHWAccel { + /** + * Name of the hardware accelerated codec. + * The name is globally unique among encoders and among decoders (but an + * encoder and a decoder can share the same name). + */ + const char *name; + + /** + * Type of codec implemented by the hardware accelerator. + * + * See AVMEDIA_TYPE_xxx + */ + enum AVMediaType type; + + /** + * Codec implemented by the hardware accelerator. + * + * See CODEC_ID_xxx + */ + enum CodecID id; + + /** + * Supported pixel format. + * + * Only hardware accelerated formats are supported here. + */ + enum PixelFormat pix_fmt; + + /** + * Hardware accelerated codec capabilities. + * see FF_HWACCEL_CODEC_CAP_* + */ + int capabilities; + + struct AVHWAccel *next; + + /** + * Called at the beginning of each frame or field picture. + * + * Meaningful frame information (codec specific) is guaranteed to + * be parsed at this point. This function is mandatory. + * + * Note that buf can be NULL along with buf_size set to 0. + * Otherwise, this means the whole frame is available at this point. + * + * @param avctx the codec context + * @param buf the frame data buffer base + * @param buf_size the size of the frame in bytes + * @return zero if successful, a negative value otherwise + */ + int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + + /** + * Callback for each slice. + * + * Meaningful slice information (codec specific) is guaranteed to + * be parsed at this point. This function is mandatory. + * + * @param avctx the codec context + * @param buf the slice data buffer base + * @param buf_size the size of the slice in bytes + * @return zero if successful, a negative value otherwise + */ + int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + + /** + * Called at the end of each frame or field picture. + * + * The whole picture is parsed at this point and can now be sent + * to the hardware accelerator. This function is mandatory. + * + * @param avctx the codec context + * @return zero if successful, a negative value otherwise + */ + int (*end_frame)(AVCodecContext *avctx); + + /** + * Size of HW accelerator private data. + * + * Private data is allocated with av_mallocz() before + * AVCodecContext.get_buffer() and deallocated after + * AVCodecContext.release_buffer(). + */ + int priv_data_size; +} AVHWAccel; + +/** + * four components are given, that's all. + * the last component is alpha + */ +typedef struct AVPicture { + uint8_t *data[4]; + int linesize[4]; ///< number of bytes per line +} AVPicture; + +#if FF_API_PALETTE_CONTROL +/** + * AVPaletteControl + * This structure defines a method for communicating palette changes + * between and demuxer and a decoder. + * + * @deprecated Use AVPacket to send palette changes instead. + * This is totally broken. + */ +#define AVPALETTE_SIZE 1024 +#define AVPALETTE_COUNT 256 +typedef struct AVPaletteControl { + + /* Demuxer sets this to 1 to indicate the palette has changed; + * decoder resets to 0. */ + int palette_changed; + + /* 4-byte ARGB palette entries, stored in native byte order; note that + * the individual palette components should be on a 8-bit scale; if + * the palette data comes from an IBM VGA native format, the component + * data is probably 6 bits in size and needs to be scaled. */ + unsigned int palette[AVPALETTE_COUNT]; + +} AVPaletteControl attribute_deprecated; +#endif + +enum AVSubtitleType { + SUBTITLE_NONE, + + SUBTITLE_BITMAP, ///< A bitmap, pict will be set + + /** + * Plain text, the text field must be set by the decoder and is + * authoritative. ass and pict fields may contain approximations. + */ + SUBTITLE_TEXT, + + /** + * Formatted text, the ass field must be set by the decoder and is + * authoritative. pict and text fields may contain approximations. + */ + SUBTITLE_ASS, +}; + +typedef struct AVSubtitleRect { + int x; ///< top left corner of pict, undefined when pict is not set + int y; ///< top left corner of pict, undefined when pict is not set + int w; ///< width of pict, undefined when pict is not set + int h; ///< height of pict, undefined when pict is not set + int nb_colors; ///< number of colors in pict, undefined when pict is not set + + /** + * data+linesize for the bitmap of this subtitle. + * can be set for text/ass as well once they where rendered + */ + AVPicture pict; + enum AVSubtitleType type; + + char *text; ///< 0 terminated plain UTF-8 text + + /** + * 0 terminated ASS/SSA compatible event line. + * The pressentation of this is unaffected by the other values in this + * struct. + */ + char *ass; +} AVSubtitleRect; + +typedef struct AVSubtitle { + uint16_t format; /* 0 = graphics */ + uint32_t start_display_time; /* relative to packet pts, in ms */ + uint32_t end_display_time; /* relative to packet pts, in ms */ + unsigned num_rects; + AVSubtitleRect **rects; + int64_t pts; ///< Same as packet pts, in AV_TIME_BASE +} AVSubtitle; + +/* packet functions */ + +/** + * @deprecated use NULL instead + */ +attribute_deprecated void av_destruct_packet_nofree(AVPacket *pkt); + +/** + * Default packet destructor. + */ +void av_destruct_packet(AVPacket *pkt); + +/** + * Initialize optional fields of a packet with default values. + * + * @param pkt packet + */ +void av_init_packet(AVPacket *pkt); + +/** + * Allocate the payload of a packet and initialize its fields with + * default values. + * + * @param pkt packet + * @param size wanted payload size + * @return 0 if OK, AVERROR_xxx otherwise + */ +int av_new_packet(AVPacket *pkt, int size); + +/** + * Reduce packet size, correctly zeroing padding + * + * @param pkt packet + * @param size new size + */ +void av_shrink_packet(AVPacket *pkt, int size); + +/** + * Increase packet size, correctly zeroing padding + * + * @param pkt packet + * @param grow_by number of bytes by which to increase the size of the packet + */ +int av_grow_packet(AVPacket *pkt, int grow_by); + +/** + * @warning This is a hack - the packet memory allocation stuff is broken. The + * packet is allocated if it was not really allocated. + */ +int av_dup_packet(AVPacket *pkt); + +/** + * Free a packet. + * + * @param pkt packet to free + */ +void av_free_packet(AVPacket *pkt); + +/* resample.c */ + +struct ReSampleContext; +struct AVResampleContext; + +typedef struct ReSampleContext ReSampleContext; + +#if FF_API_AUDIO_OLD +/** + * @deprecated Use av_audio_resample_init() instead. + */ +attribute_deprecated ReSampleContext *audio_resample_init(int output_channels, int input_channels, + int output_rate, int input_rate); +#endif +/** + * Initialize audio resampling context + * + * @param output_channels number of output channels + * @param input_channels number of input channels + * @param output_rate output sample rate + * @param input_rate input sample rate + * @param sample_fmt_out requested output sample format + * @param sample_fmt_in input sample format + * @param filter_length length of each FIR filter in the filterbank relative to the cutoff freq + * @param log2_phase_count log2 of the number of entries in the polyphase filterbank + * @param linear If 1 then the used FIR filter will be linearly interpolated + between the 2 closest, if 0 the closest will be used + * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate + * @return allocated ReSampleContext, NULL if error occured + */ +ReSampleContext *av_audio_resample_init(int output_channels, int input_channels, + int output_rate, int input_rate, + enum AVSampleFormat sample_fmt_out, + enum AVSampleFormat sample_fmt_in, + int filter_length, int log2_phase_count, + int linear, double cutoff); + +int audio_resample(ReSampleContext *s, short *output, short *input, int nb_samples); +void audio_resample_close(ReSampleContext *s); + + +/** + * Initialize an audio resampler. + * Note, if either rate is not an integer then simply scale both rates up so they are. + * @param filter_length length of each FIR filter in the filterbank relative to the cutoff freq + * @param log2_phase_count log2 of the number of entries in the polyphase filterbank + * @param linear If 1 then the used FIR filter will be linearly interpolated + between the 2 closest, if 0 the closest will be used + * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate + */ +struct AVResampleContext *av_resample_init(int out_rate, int in_rate, int filter_length, int log2_phase_count, int linear, double cutoff); + +/** + * Resample an array of samples using a previously configured context. + * @param src an array of unconsumed samples + * @param consumed the number of samples of src which have been consumed are returned here + * @param src_size the number of unconsumed samples available + * @param dst_size the amount of space in samples available in dst + * @param update_ctx If this is 0 then the context will not be modified, that way several channels can be resampled with the same context. + * @return the number of samples written in dst or -1 if an error occurred + */ +int av_resample(struct AVResampleContext *c, short *dst, short *src, int *consumed, int src_size, int dst_size, int update_ctx); + + +/** + * Compensate samplerate/timestamp drift. The compensation is done by changing + * the resampler parameters, so no audible clicks or similar distortions occur + * @param compensation_distance distance in output samples over which the compensation should be performed + * @param sample_delta number of output samples which should be output less + * + * example: av_resample_compensate(c, 10, 500) + * here instead of 510 samples only 500 samples would be output + * + * note, due to rounding the actual compensation might be slightly different, + * especially if the compensation_distance is large and the in_rate used during init is small + */ +void av_resample_compensate(struct AVResampleContext *c, int sample_delta, int compensation_distance); +void av_resample_close(struct AVResampleContext *c); + +/** + * Allocate memory for a picture. Call avpicture_free to free it. + * + * @param picture the picture to be filled in + * @param pix_fmt the format of the picture + * @param width the width of the picture + * @param height the height of the picture + * @return zero if successful, a negative value if not + */ +int avpicture_alloc(AVPicture *picture, enum PixelFormat pix_fmt, int width, int height); + +/** + * Free a picture previously allocated by avpicture_alloc(). + * + * @param picture the AVPicture to be freed + */ +void avpicture_free(AVPicture *picture); + +/** + * Fill in the AVPicture fields. + * The fields of the given AVPicture are filled in by using the 'ptr' address + * which points to the image data buffer. Depending on the specified picture + * format, one or multiple image data pointers and line sizes will be set. + * If a planar format is specified, several pointers will be set pointing to + * the different picture planes and the line sizes of the different planes + * will be stored in the lines_sizes array. + * Call with ptr == NULL to get the required size for the ptr buffer. + * + * @param picture AVPicture whose fields are to be filled in + * @param ptr Buffer which will contain or contains the actual image data + * @param pix_fmt The format in which the picture data is stored. + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @return size of the image data in bytes + */ +int avpicture_fill(AVPicture *picture, uint8_t *ptr, + enum PixelFormat pix_fmt, int width, int height); +int avpicture_layout(const AVPicture* src, enum PixelFormat pix_fmt, int width, int height, + unsigned char *dest, int dest_size); + +/** + * Calculate the size in bytes that a picture of the given width and height + * would occupy if stored in the given picture format. + * Note that this returns the size of a compact representation as generated + * by avpicture_layout, which can be smaller than the size required for e.g. + * avpicture_fill. + * + * @param pix_fmt the given picture format + * @param width the width of the image + * @param height the height of the image + * @return Image data size in bytes or -1 on error (e.g. too large dimensions). + */ +int avpicture_get_size(enum PixelFormat pix_fmt, int width, int height); +void avcodec_get_chroma_sub_sample(enum PixelFormat pix_fmt, int *h_shift, int *v_shift); +const char *avcodec_get_pix_fmt_name(enum PixelFormat pix_fmt); +void avcodec_set_dimensions(AVCodecContext *s, int width, int height); + +#if LIBAVCODEC_VERSION_MAJOR < 53 +/** + * Return the pixel format corresponding to the name name. + * + * If there is no pixel format with name name, then look for a + * pixel format with the name corresponding to the native endian + * format of name. + * For example in a little-endian system, first look for "gray16", + * then for "gray16le". + * + * Finally if no pixel format has been found, return PIX_FMT_NONE. + * + * @deprecated Deprecated in favor of av_get_pix_fmt(). + */ +attribute_deprecated enum PixelFormat avcodec_get_pix_fmt(const char* name); +#endif + +/** + * Return a value representing the fourCC code associated to the + * pixel format pix_fmt, or 0 if no associated fourCC code can be + * found. + */ +unsigned int avcodec_pix_fmt_to_codec_tag(enum PixelFormat pix_fmt); + +/** + * Put a string representing the codec tag codec_tag in buf. + * + * @param buf_size size in bytes of buf + * @return the length of the string that would have been generated if + * enough space had been available, excluding the trailing null + */ +size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag); + +#define FF_LOSS_RESOLUTION 0x0001 /**< loss due to resolution change */ +#define FF_LOSS_DEPTH 0x0002 /**< loss due to color depth change */ +#define FF_LOSS_COLORSPACE 0x0004 /**< loss due to color space conversion */ +#define FF_LOSS_ALPHA 0x0008 /**< loss of alpha bits */ +#define FF_LOSS_COLORQUANT 0x0010 /**< loss due to color quantization */ +#define FF_LOSS_CHROMA 0x0020 /**< loss of chroma (e.g. RGB to gray conversion) */ + +/** + * Compute what kind of losses will occur when converting from one specific + * pixel format to another. + * When converting from one pixel format to another, information loss may occur. + * For example, when converting from RGB24 to GRAY, the color information will + * be lost. Similarly, other losses occur when converting from some formats to + * other formats. These losses can involve loss of chroma, but also loss of + * resolution, loss of color depth, loss due to the color space conversion, loss + * of the alpha bits or loss due to color quantization. + * avcodec_get_fix_fmt_loss() informs you about the various types of losses + * which will occur when converting from one pixel format to another. + * + * @param[in] dst_pix_fmt destination pixel format + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @return Combination of flags informing you what kind of losses will occur. + */ +int avcodec_get_pix_fmt_loss(enum PixelFormat dst_pix_fmt, enum PixelFormat src_pix_fmt, + int has_alpha); + +/** + * Find the best pixel format to convert to given a certain source pixel + * format. When converting from one pixel format to another, information loss + * may occur. For example, when converting from RGB24 to GRAY, the color + * information will be lost. Similarly, other losses occur when converting from + * some formats to other formats. avcodec_find_best_pix_fmt() searches which of + * the given pixel formats should be used to suffer the least amount of loss. + * The pixel formats from which it chooses one, are determined by the + * pix_fmt_mask parameter. + * + * @code + * src_pix_fmt = PIX_FMT_YUV420P; + * pix_fmt_mask = (1 << PIX_FMT_YUV422P) || (1 << PIX_FMT_RGB24); + * dst_pix_fmt = avcodec_find_best_pix_fmt(pix_fmt_mask, src_pix_fmt, alpha, &loss); + * @endcode + * + * @param[in] pix_fmt_mask bitmask determining which pixel format to choose from + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur. + * @return The best pixel format to convert to or -1 if none was found. + */ +enum PixelFormat avcodec_find_best_pix_fmt(int64_t pix_fmt_mask, enum PixelFormat src_pix_fmt, + int has_alpha, int *loss_ptr); + +#if LIBAVCODEC_VERSION_MAJOR < 53 +/** + * @deprecated Use av_get_pix_fmt_string() instead. + */ +attribute_deprecated +void avcodec_pix_fmt_string (char *buf, int buf_size, enum PixelFormat pix_fmt); +#endif + +#define FF_ALPHA_TRANSP 0x0001 /* image has some totally transparent pixels */ +#define FF_ALPHA_SEMI_TRANSP 0x0002 /* image has some transparent pixels */ + +/** + * Tell if an image really has transparent alpha values. + * @return ored mask of FF_ALPHA_xxx constants + */ +int img_get_alpha_info(const AVPicture *src, + enum PixelFormat pix_fmt, int width, int height); + +/* deinterlace a picture */ +/* deinterlace - if not supported return -1 */ +int avpicture_deinterlace(AVPicture *dst, const AVPicture *src, + enum PixelFormat pix_fmt, int width, int height); + +/* external high level API */ + +/** + * If c is NULL, returns the first registered codec, + * if c is non-NULL, returns the next registered codec after c, + * or NULL if c is the last one. + */ +AVCodec *av_codec_next(AVCodec *c); + +/** + * Return the LIBAVCODEC_VERSION_INT constant. + */ +unsigned avcodec_version(void); + +/** + * Return the libavcodec build-time configuration. + */ +const char *avcodec_configuration(void); + +/** + * Return the libavcodec license. + */ +const char *avcodec_license(void); + +/** + * Initialize libavcodec. + * + * @warning This function must be called before any other libavcodec + * function. + */ +void avcodec_init(void); + +#if LIBAVCODEC_VERSION_MAJOR < 53 +/** + * @deprecated Deprecated in favor of avcodec_register(). + */ +attribute_deprecated void register_avcodec(AVCodec *codec); +#endif + +/** + * Register the codec codec and initialize libavcodec. + * + * @see avcodec_init() + */ +void avcodec_register(AVCodec *codec); + +/** + * Find a registered encoder with a matching codec ID. + * + * @param id CodecID of the requested encoder + * @return An encoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_encoder(enum CodecID id); + +/** + * Find a registered encoder with the specified name. + * + * @param name name of the requested encoder + * @return An encoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_encoder_by_name(const char *name); + +/** + * Find a registered decoder with a matching codec ID. + * + * @param id CodecID of the requested decoder + * @return A decoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_decoder(enum CodecID id); + +/** + * Find a registered decoder with the specified name. + * + * @param name name of the requested decoder + * @return A decoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_decoder_by_name(const char *name); +void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode); + +/** + * Return a name for the specified profile, if available. + * + * @param codec the codec that is searched for the given profile + * @param profile the profile value for which a name is requested + * @return A name for the profile if found, NULL otherwise. + */ +const char *av_get_profile_name(const AVCodec *codec, int profile); + +/** + * Set the fields of the given AVCodecContext to default values. + * + * @param s The AVCodecContext of which the fields should be set to default values. + */ +void avcodec_get_context_defaults(AVCodecContext *s); + +/** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! + * we WILL change its arguments and name a few times! */ +void avcodec_get_context_defaults2(AVCodecContext *s, enum AVMediaType); + +/** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! + * we WILL change its arguments and name a few times! */ +int avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec); + +/** + * Allocate an AVCodecContext and set its fields to default values. The + * resulting struct can be deallocated by simply calling av_free(). + * + * @return An AVCodecContext filled with default values or NULL on failure. + * @see avcodec_get_context_defaults + */ +AVCodecContext *avcodec_alloc_context(void); + +/** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! + * we WILL change its arguments and name a few times! */ +AVCodecContext *avcodec_alloc_context2(enum AVMediaType); + +/** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! + * we WILL change its arguments and name a few times! */ +AVCodecContext *avcodec_alloc_context3(AVCodec *codec); + +/** + * Copy the settings of the source AVCodecContext into the destination + * AVCodecContext. The resulting destination codec context will be + * unopened, i.e. you are required to call avcodec_open() before you + * can use this AVCodecContext to decode/encode video/audio data. + * + * @param dest target codec context, should be initialized with + * avcodec_alloc_context(), but otherwise uninitialized + * @param src source codec context + * @return AVERROR() on error (e.g. memory allocation error), 0 on success + */ +int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src); + +/** + * Set the fields of the given AVFrame to default values. + * + * @param pic The AVFrame of which the fields should be set to default values. + */ +void avcodec_get_frame_defaults(AVFrame *pic); + +/** + * Allocate an AVFrame and set its fields to default values. The resulting + * struct can be deallocated by simply calling av_free(). + * + * @return An AVFrame filled with default values or NULL on failure. + * @see avcodec_get_frame_defaults + */ +AVFrame *avcodec_alloc_frame(void); + +int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic); +void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic); +int avcodec_default_reget_buffer(AVCodecContext *s, AVFrame *pic); + +/** + * Return the amount of padding in pixels which the get_buffer callback must + * provide around the edge of the image for codecs which do not have the + * CODEC_FLAG_EMU_EDGE flag. + * + * @return Required padding in pixels. + */ +unsigned avcodec_get_edge_width(void); +/** + * Modify width and height values so that they will result in a memory + * buffer that is acceptable for the codec if you do not use any horizontal + * padding. + * + * May only be used if a codec with CODEC_CAP_DR1 has been opened. + * If CODEC_FLAG_EMU_EDGE is not set, the dimensions must have been increased + * according to avcodec_get_edge_width() before. + */ +void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height); +/** + * Modify width and height values so that they will result in a memory + * buffer that is acceptable for the codec if you also ensure that all + * line sizes are a multiple of the respective linesize_align[i]. + * + * May only be used if a codec with CODEC_CAP_DR1 has been opened. + * If CODEC_FLAG_EMU_EDGE is not set, the dimensions must have been increased + * according to avcodec_get_edge_width() before. + */ +void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, + int linesize_align[4]); + +#if LIBAVCODEC_VERSION_MAJOR < 53 +/** + * @deprecated Deprecated in favor of av_check_image_size(). + */ +attribute_deprecated +int avcodec_check_dimensions(void *av_log_ctx, unsigned int w, unsigned int h); +#endif + +enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat * fmt); + +int avcodec_thread_init(AVCodecContext *s, int thread_count); +void avcodec_thread_free(AVCodecContext *s); +int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size); +int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count); +//FIXME func typedef + +/** + * Initialize the AVCodecContext to use the given AVCodec. Prior to using this + * function the context has to be allocated. + * + * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(), + * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for + * retrieving a codec. + * + * @warning This function is not thread safe! + * + * @code + * avcodec_register_all(); + * codec = avcodec_find_decoder(CODEC_ID_H264); + * if (!codec) + * exit(1); + * + * context = avcodec_alloc_context(); + * + * if (avcodec_open(context, codec) < 0) + * exit(1); + * @endcode + * + * @param avctx The context which will be set up to use the given codec. + * @param codec The codec to use within the context. + * @return zero on success, a negative value on error + * @see avcodec_alloc_context, avcodec_find_decoder, avcodec_find_encoder + */ +int avcodec_open(AVCodecContext *avctx, AVCodec *codec); + +#if FF_API_AUDIO_OLD +/** + * Decode an audio frame from buf into samples. + * Wrapper function which calls avcodec_decode_audio3. + * + * @deprecated Use avcodec_decode_audio3 instead. + * @param avctx the codec context + * @param[out] samples the output buffer + * @param[in,out] frame_size_ptr the output buffer size in bytes + * @param[in] buf the input buffer + * @param[in] buf_size the input buffer size in bytes + * @return On error a negative value is returned, otherwise the number of bytes + * used or zero if no frame could be decompressed. + */ +attribute_deprecated int avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples, + int *frame_size_ptr, + const uint8_t *buf, int buf_size); +#endif + +/** + * Decode the audio frame of size avpkt->size from avpkt->data into samples. + * Some decoders may support multiple frames in a single AVPacket, such + * decoders would then just decode the first frame. In this case, + * avcodec_decode_audio3 has to be called again with an AVPacket that contains + * the remaining data in order to decode the second frame etc. + * If no frame + * could be outputted, frame_size_ptr is zero. Otherwise, it is the + * decompressed frame size in bytes. + * + * @warning You must set frame_size_ptr to the allocated size of the + * output buffer before calling avcodec_decode_audio3(). + * + * @warning The input buffer must be FF_INPUT_BUFFER_PADDING_SIZE larger than + * the actual read bytes because some optimized bitstream readers read 32 or 64 + * bits at once and could read over the end. + * + * @warning The end of the input buffer avpkt->data should be set to 0 to ensure that + * no overreading happens for damaged MPEG streams. + * + * @note You might have to align the input buffer avpkt->data and output buffer + * samples. The alignment requirements depend on the CPU: On some CPUs it isn't + * necessary at all, on others it won't work at all if not aligned and on others + * it will work but it will have an impact on performance. + * + * In practice, avpkt->data should have 4 byte alignment at minimum and + * samples should be 16 byte aligned unless the CPU doesn't need it + * (AltiVec and SSE do). + * + * @param avctx the codec context + * @param[out] samples the output buffer, sample type in avctx->sample_fmt + * @param[in,out] frame_size_ptr the output buffer size in bytes + * @param[in] avpkt The input AVPacket containing the input buffer. + * You can create such packet with av_init_packet() and by then setting + * data and size, some decoders might in addition need other fields. + * All decoders are designed to use the least fields possible though. + * @return On error a negative value is returned, otherwise the number of bytes + * used or zero if no frame data was decompressed (used) from the input AVPacket. + */ +int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, + int *frame_size_ptr, + AVPacket *avpkt); + +#if FF_API_VIDEO_OLD +/** + * Decode a video frame from buf into picture. + * Wrapper function which calls avcodec_decode_video2. + * + * @deprecated Use avcodec_decode_video2 instead. + * @param avctx the codec context + * @param[out] picture The AVFrame in which the decoded video frame will be stored. + * @param[in] buf the input buffer + * @param[in] buf_size the size of the input buffer in bytes + * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero. + * @return On error a negative value is returned, otherwise the number of bytes + * used or zero if no frame could be decompressed. + */ +attribute_deprecated int avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture, + int *got_picture_ptr, + const uint8_t *buf, int buf_size); +#endif + +/** + * Decode the video frame of size avpkt->size from avpkt->data into picture. + * Some decoders may support multiple frames in a single AVPacket, such + * decoders would then just decode the first frame. + * + * @warning The input buffer must be FF_INPUT_BUFFER_PADDING_SIZE larger than + * the actual read bytes because some optimized bitstream readers read 32 or 64 + * bits at once and could read over the end. + * + * @warning The end of the input buffer buf should be set to 0 to ensure that + * no overreading happens for damaged MPEG streams. + * + * @note You might have to align the input buffer avpkt->data. + * The alignment requirements depend on the CPU: on some CPUs it isn't + * necessary at all, on others it won't work at all if not aligned and on others + * it will work but it will have an impact on performance. + * + * In practice, avpkt->data should have 4 byte alignment at minimum. + * + * @note Some codecs have a delay between input and output, these need to be + * fed with avpkt->data=NULL, avpkt->size=0 at the end to return the remaining frames. + * + * @param avctx the codec context + * @param[out] picture The AVFrame in which the decoded video frame will be stored. + * Use avcodec_alloc_frame to get an AVFrame, the codec will + * allocate memory for the actual bitmap. + * with default get/release_buffer(), the decoder frees/reuses the bitmap as it sees fit. + * with overridden get/release_buffer() (needs CODEC_CAP_DR1) the user decides into what buffer the decoder + * decodes and the decoder tells the user once it does not need the data anymore, + * the user app can at this point free/reuse/keep the memory as it sees fit. + * + * @param[in] avpkt The input AVpacket containing the input buffer. + * You can create such packet with av_init_packet() and by then setting + * data and size, some decoders might in addition need other fields like + * flags&AV_PKT_FLAG_KEY. All decoders are designed to use the least + * fields possible. + * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero. + * @return On error a negative value is returned, otherwise the number of bytes + * used or zero if no frame could be decompressed. + */ +int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, + int *got_picture_ptr, + AVPacket *avpkt); + +#if FF_API_SUBTITLE_OLD +/* Decode a subtitle message. Return -1 if error, otherwise return the + * number of bytes used. If no subtitle could be decompressed, + * got_sub_ptr is zero. Otherwise, the subtitle is stored in *sub. */ +attribute_deprecated int avcodec_decode_subtitle(AVCodecContext *avctx, AVSubtitle *sub, + int *got_sub_ptr, + const uint8_t *buf, int buf_size); +#endif + +/** + * Decode a subtitle message. + * Return a negative value on error, otherwise return the number of bytes used. + * If no subtitle could be decompressed, got_sub_ptr is zero. + * Otherwise, the subtitle is stored in *sub. + * Note that CODEC_CAP_DR1 is not available for subtitle codecs. This is for + * simplicity, because the performance difference is expect to be negligible + * and reusing a get_buffer written for video codecs would probably perform badly + * due to a potentially very different allocation pattern. + * + * @param avctx the codec context + * @param[out] sub The AVSubtitle in which the decoded subtitle will be stored, must be + freed with avsubtitle_free if *got_sub_ptr is set. + * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero. + * @param[in] avpkt The input AVPacket containing the input buffer. + */ +int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, + int *got_sub_ptr, + AVPacket *avpkt); + +/** + * Frees all allocated data in the given subtitle struct. + * + * @param sub AVSubtitle to free. + */ +void avsubtitle_free(AVSubtitle *sub); + +int avcodec_parse_frame(AVCodecContext *avctx, uint8_t **pdata, + int *data_size_ptr, + uint8_t *buf, int buf_size); + +/** + * Encode an audio frame from samples into buf. + * + * @note The output buffer should be at least FF_MIN_BUFFER_SIZE bytes large. + * However, for PCM audio the user will know how much space is needed + * because it depends on the value passed in buf_size as described + * below. In that case a lower value can be used. + * + * @param avctx the codec context + * @param[out] buf the output buffer + * @param[in] buf_size the output buffer size + * @param[in] samples the input buffer containing the samples + * The number of samples read from this buffer is frame_size*channels, + * both of which are defined in avctx. + * For PCM audio the number of samples read from samples is equal to + * buf_size * input_sample_size / output_sample_size. + * @return On error a negative value is returned, on success zero or the number + * of bytes used to encode the data read from the input buffer. + */ +int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, + const short *samples); + +/** + * Encode a video frame from pict into buf. + * The input picture should be + * stored using a specific format, namely avctx.pix_fmt. + * + * @param avctx the codec context + * @param[out] buf the output buffer for the bitstream of encoded frame + * @param[in] buf_size the size of the output buffer in bytes + * @param[in] pict the input picture to encode + * @return On error a negative value is returned, on success zero or the number + * of bytes used from the output buffer. + */ +int avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size, + const AVFrame *pict); +int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, + const AVSubtitle *sub); + +int avcodec_close(AVCodecContext *avctx); + +/** + * Register all the codecs, parsers and bitstream filters which were enabled at + * configuration time. If you do not call this function you can select exactly + * which formats you want to support, by using the individual registration + * functions. + * + * @see avcodec_register + * @see av_register_codec_parser + * @see av_register_bitstream_filter + */ +void avcodec_register_all(void); + +/** + * Flush buffers, should be called when seeking or when switching to a different stream. + */ +void avcodec_flush_buffers(AVCodecContext *avctx); + +void avcodec_default_free_buffers(AVCodecContext *s); + +/* misc useful functions */ + +/** + * Return a single letter to describe the given picture type pict_type. + * + * @param[in] pict_type the picture type + * @return A single character representing the picture type. + */ +char av_get_pict_type_char(int pict_type); + +/** + * Return codec bits per sample. + * + * @param[in] codec_id the codec + * @return Number of bits per sample or zero if unknown for the given codec. + */ +int av_get_bits_per_sample(enum CodecID codec_id); + +#if FF_API_OLD_SAMPLE_FMT +/** + * @deprecated Use av_get_bits_per_sample_fmt() instead. + */ +attribute_deprecated +int av_get_bits_per_sample_format(enum AVSampleFormat sample_fmt); +#endif + +/* frame parsing */ +typedef struct AVCodecParserContext { + void *priv_data; + struct AVCodecParser *parser; + int64_t frame_offset; /* offset of the current frame */ + int64_t cur_offset; /* current offset + (incremented by each av_parser_parse()) */ + int64_t next_frame_offset; /* offset of the next frame */ + /* video info */ + int pict_type; /* XXX: Put it back in AVCodecContext. */ + /** + * This field is used for proper frame duration computation in lavf. + * It signals, how much longer the frame duration of the current frame + * is compared to normal frame duration. + * + * frame_duration = (1 + repeat_pict) * time_base + * + * It is used by codecs like H.264 to display telecined material. + */ + int repeat_pict; /* XXX: Put it back in AVCodecContext. */ + int64_t pts; /* pts of the current frame */ + int64_t dts; /* dts of the current frame */ + + /* private data */ + int64_t last_pts; + int64_t last_dts; + int fetch_timestamp; + +#define AV_PARSER_PTS_NB 4 + int cur_frame_start_index; + int64_t cur_frame_offset[AV_PARSER_PTS_NB]; + int64_t cur_frame_pts[AV_PARSER_PTS_NB]; + int64_t cur_frame_dts[AV_PARSER_PTS_NB]; + + int flags; +#define PARSER_FLAG_COMPLETE_FRAMES 0x0001 +#define PARSER_FLAG_ONCE 0x0002 +/// Set if the parser has a valid file offset +#define PARSER_FLAG_FETCHED_OFFSET 0x0004 + + int64_t offset; ///< byte offset from starting packet start + int64_t cur_frame_end[AV_PARSER_PTS_NB]; + + /*! + * Set by parser to 1 for key frames and 0 for non-key frames. + * It is initialized to -1, so if the parser doesn't set this flag, + * old-style fallback using FF_I_TYPE picture type as key frames + * will be used. + */ + int key_frame; + + /** + * Time difference in stream time base units from the pts of this + * packet to the point at which the output from the decoder has converged + * independent from the availability of previous frames. That is, the + * frames are virtually identical no matter if decoding started from + * the very first frame or from this keyframe. + * Is AV_NOPTS_VALUE if unknown. + * This field is not the display duration of the current frame. + * This field has no meaning if the packet does not have AV_PKT_FLAG_KEY + * set. + * + * The purpose of this field is to allow seeking in streams that have no + * keyframes in the conventional sense. It corresponds to the + * recovery point SEI in H.264 and match_time_delta in NUT. It is also + * essential for some types of subtitle streams to ensure that all + * subtitles are correctly displayed after seeking. + */ + int64_t convergence_duration; + + // Timestamp generation support: + /** + * Synchronization point for start of timestamp generation. + * + * Set to >0 for sync point, 0 for no sync point and <0 for undefined + * (default). + * + * For example, this corresponds to presence of H.264 buffering period + * SEI message. + */ + int dts_sync_point; + + /** + * Offset of the current timestamp against last timestamp sync point in + * units of AVCodecContext.time_base. + * + * Set to INT_MIN when dts_sync_point unused. Otherwise, it must + * contain a valid timestamp offset. + * + * Note that the timestamp of sync point has usually a nonzero + * dts_ref_dts_delta, which refers to the previous sync point. Offset of + * the next frame after timestamp sync point will be usually 1. + * + * For example, this corresponds to H.264 cpb_removal_delay. + */ + int dts_ref_dts_delta; + + /** + * Presentation delay of current frame in units of AVCodecContext.time_base. + * + * Set to INT_MIN when dts_sync_point unused. Otherwise, it must + * contain valid non-negative timestamp delta (presentation time of a frame + * must not lie in the past). + * + * This delay represents the difference between decoding and presentation + * time of the frame. + * + * For example, this corresponds to H.264 dpb_output_delay. + */ + int pts_dts_delta; + + /** + * Position of the packet in file. + * + * Analogous to cur_frame_pts/dts + */ + int64_t cur_frame_pos[AV_PARSER_PTS_NB]; + + /** + * Byte position of currently parsed frame in stream. + */ + int64_t pos; + + /** + * Previous frame byte position. + */ + int64_t last_pos; +} AVCodecParserContext; + +typedef struct AVCodecParser { + int codec_ids[5]; /* several codec IDs are permitted */ + int priv_data_size; + int (*parser_init)(AVCodecParserContext *s); + int (*parser_parse)(AVCodecParserContext *s, + AVCodecContext *avctx, + const uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size); + void (*parser_close)(AVCodecParserContext *s); + int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size); + struct AVCodecParser *next; +} AVCodecParser; + +AVCodecParser *av_parser_next(AVCodecParser *c); + +void av_register_codec_parser(AVCodecParser *parser); +AVCodecParserContext *av_parser_init(int codec_id); + +#if LIBAVCODEC_VERSION_MAJOR < 53 +attribute_deprecated +int av_parser_parse(AVCodecParserContext *s, + AVCodecContext *avctx, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, + int64_t pts, int64_t dts); +#endif + +/** + * Parse a packet. + * + * @param s parser context. + * @param avctx codec context. + * @param poutbuf set to pointer to parsed buffer or NULL if not yet finished. + * @param poutbuf_size set to size of parsed buffer or zero if not yet finished. + * @param buf input buffer. + * @param buf_size input length, to signal EOF, this should be 0 (so that the last frame can be output). + * @param pts input presentation timestamp. + * @param dts input decoding timestamp. + * @param pos input byte position in stream. + * @return the number of bytes of the input bitstream used. + * + * Example: + * @code + * while(in_len){ + * len = av_parser_parse2(myparser, AVCodecContext, &data, &size, + * in_data, in_len, + * pts, dts, pos); + * in_data += len; + * in_len -= len; + * + * if(size) + * decode_frame(data, size); + * } + * @endcode + */ +int av_parser_parse2(AVCodecParserContext *s, + AVCodecContext *avctx, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, + int64_t pts, int64_t dts, + int64_t pos); + +int av_parser_change(AVCodecParserContext *s, + AVCodecContext *avctx, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, int keyframe); +void av_parser_close(AVCodecParserContext *s); + + +typedef struct AVBitStreamFilterContext { + void *priv_data; + struct AVBitStreamFilter *filter; + AVCodecParserContext *parser; + struct AVBitStreamFilterContext *next; +} AVBitStreamFilterContext; + + +typedef struct AVBitStreamFilter { + const char *name; + int priv_data_size; + int (*filter)(AVBitStreamFilterContext *bsfc, + AVCodecContext *avctx, const char *args, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, int keyframe); + void (*close)(AVBitStreamFilterContext *bsfc); + struct AVBitStreamFilter *next; +} AVBitStreamFilter; + +void av_register_bitstream_filter(AVBitStreamFilter *bsf); +AVBitStreamFilterContext *av_bitstream_filter_init(const char *name); +int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, + AVCodecContext *avctx, const char *args, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, int keyframe); +void av_bitstream_filter_close(AVBitStreamFilterContext *bsf); + +AVBitStreamFilter *av_bitstream_filter_next(AVBitStreamFilter *f); + +/* memory */ + +/** + * Reallocate the given block if it is not large enough, otherwise do nothing. + * + * @see av_realloc + */ +void *av_fast_realloc(void *ptr, unsigned int *size, FF_INTERNALC_MEM_TYPE min_size); + +/** + * Allocate a buffer, reusing the given one if large enough. + * + * Contrary to av_fast_realloc the current buffer contents might not be + * preserved and on error the old buffer is freed, thus no special + * handling to avoid memleaks is necessary. + * + * @param ptr pointer to pointer to already allocated buffer, overwritten with pointer to new buffer + * @param size size of the buffer *ptr points to + * @param min_size minimum size of *ptr buffer after returning, *ptr will be NULL and + * *size 0 if an error occurred. + */ +void av_fast_malloc(void *ptr, unsigned int *size, FF_INTERNALC_MEM_TYPE min_size); + +#if LIBAVCODEC_VERSION_MAJOR < 53 +/** + * @deprecated Deprecated in favor of av_image_copy(). + */ +attribute_deprecated +void av_picture_data_copy(uint8_t *dst_data[4], int dst_linesize[4], + uint8_t *src_data[4], int src_linesize[4], + enum PixelFormat pix_fmt, int width, int height); +#endif + +/** + * Copy image src to dst. Wraps av_picture_data_copy() above. + */ +void av_picture_copy(AVPicture *dst, const AVPicture *src, + enum PixelFormat pix_fmt, int width, int height); + +/** + * Crop image top and left side. + */ +int av_picture_crop(AVPicture *dst, const AVPicture *src, + enum PixelFormat pix_fmt, int top_band, int left_band); + +/** + * Pad image. + */ +int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, enum PixelFormat pix_fmt, + int padtop, int padbottom, int padleft, int padright, int *color); + +/** + * Encode extradata length to a buffer. Used by xiph codecs. + * + * @param s buffer to write to; must be at least (v/255+1) bytes long + * @param v size of extradata in bytes + * @return number of bytes written to the buffer. + */ +unsigned int av_xiphlacing(unsigned char *s, unsigned int v); + +#if LIBAVCODEC_VERSION_MAJOR < 53 +/** + * Parse str and put in width_ptr and height_ptr the detected values. + * + * @deprecated Deprecated in favor of av_parse_video_size(). + */ +attribute_deprecated int av_parse_video_frame_size(int *width_ptr, int *height_ptr, const char *str); + +/** + * Parse str and store the detected values in *frame_rate. + * + * @deprecated Deprecated in favor of av_parse_video_rate(). + */ +attribute_deprecated int av_parse_video_frame_rate(AVRational *frame_rate, const char *str); +#endif + +/** + * Logs a generic warning message about a missing feature. This function is + * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.) + * only, and would normally not be used by applications. + * @param[in] avc a pointer to an arbitrary struct of which the first field is + * a pointer to an AVClass struct + * @param[in] feature string containing the name of the missing feature + * @param[in] want_sample indicates if samples are wanted which exhibit this feature. + * If want_sample is non-zero, additional verbage will be added to the log + * message which tells the user how to report samples to the development + * mailing list. + */ +void av_log_missing_feature(void *avc, const char *feature, int want_sample); + +/** + * Log a generic warning message asking for a sample. This function is + * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.) + * only, and would normally not be used by applications. + * @param[in] avc a pointer to an arbitrary struct of which the first field is + * a pointer to an AVClass struct + * @param[in] msg string containing an optional message, or NULL if no message + */ +void av_log_ask_for_sample(void *avc, const char *msg); + +/** + * Register the hardware accelerator hwaccel. + */ +void av_register_hwaccel(AVHWAccel *hwaccel); + +/** + * If hwaccel is NULL, returns the first registered hardware accelerator, + * if hwaccel is non-NULL, returns the next registered hardware accelerator + * after hwaccel, or NULL if hwaccel is the last one. + */ +AVHWAccel *av_hwaccel_next(AVHWAccel *hwaccel); + + +/** + * Lock operation used by lockmgr + */ +enum AVLockOp { + AV_LOCK_CREATE, ///< Create a mutex + AV_LOCK_OBTAIN, ///< Lock the mutex + AV_LOCK_RELEASE, ///< Unlock the mutex + AV_LOCK_DESTROY, ///< Free mutex resources +}; + +/** + * Register a user provided lock manager supporting the operations + * specified by AVLockOp. mutex points to a (void *) where the + * lockmgr should store/get a pointer to a user allocated mutex. It's + * NULL upon AV_LOCK_CREATE and != NULL for all other ops. + * + * @param cb User defined callback. Note: FFmpeg may invoke calls to this + * callback during the call to av_lockmgr_register(). + * Thus, the application must be prepared to handle that. + * If cb is set to NULL the lockmgr will be unregistered. + * Also note that during unregistration the previously registered + * lockmgr callback may also be invoked. + */ +int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)); + +#endif /* AVCODEC_AVCODEC_H */ diff --git a/windeps/include/libavcodec/avfft.h b/windeps/include/libavcodec/avfft.h new file mode 100644 index 0000000..be2d9c7 --- /dev/null +++ b/windeps/include/libavcodec/avfft.h @@ -0,0 +1,99 @@ +/* + * 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 + */ + +#ifndef AVCODEC_AVFFT_H +#define AVCODEC_AVFFT_H + +typedef float FFTSample; + +typedef struct FFTComplex { + FFTSample re, im; +} FFTComplex; + +typedef struct FFTContext FFTContext; + +/** + * Set up a complex FFT. + * @param nbits log2 of the length of the input array + * @param inverse if 0 perform the forward transform, if 1 perform the inverse + */ +FFTContext *av_fft_init(int nbits, int inverse); + +/** + * Do the permutation needed BEFORE calling ff_fft_calc(). + */ +void av_fft_permute(FFTContext *s, FFTComplex *z); + +/** + * Do a complex FFT with the parameters defined in av_fft_init(). The + * input data must be permuted before. No 1.0/sqrt(n) normalization is done. + */ +void av_fft_calc(FFTContext *s, FFTComplex *z); + +void av_fft_end(FFTContext *s); + +FFTContext *av_mdct_init(int nbits, int inverse, double scale); +void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_mdct_end(FFTContext *s); + +/* Real Discrete Fourier Transform */ + +enum RDFTransformType { + DFT_R2C, + IDFT_C2R, + IDFT_R2C, + DFT_C2R, +}; + +typedef struct RDFTContext RDFTContext; + +/** + * Set up a real FFT. + * @param nbits log2 of the length of the input array + * @param trans the type of transform + */ +RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans); +void av_rdft_calc(RDFTContext *s, FFTSample *data); +void av_rdft_end(RDFTContext *s); + +/* Discrete Cosine Transform */ + +typedef struct DCTContext DCTContext; + +enum DCTTransformType { + DCT_II = 0, + DCT_III, + DCT_I, + DST_I, +}; + +/** + * Set up DCT. + * @param nbits size of the input array: + * (1 << nbits) for DCT-II, DCT-III and DST-I + * (1 << nbits) + 1 for DCT-I + * + * @note the first element of the input of DST-I is ignored + */ +DCTContext *av_dct_init(int nbits, enum DCTTransformType type); +void av_dct_calc(DCTContext *s, FFTSample *data); +void av_dct_end (DCTContext *s); + +#endif /* AVCODEC_AVFFT_H */ diff --git a/windeps/include/libavcodec/dxva2.h b/windeps/include/libavcodec/dxva2.h new file mode 100644 index 0000000..5c5fe21 --- /dev/null +++ b/windeps/include/libavcodec/dxva2.h @@ -0,0 +1,68 @@ +/* + * DXVA2 HW acceleration + * + * copyright (c) 2009 Laurent Aimar + * + * 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 + */ + +#ifndef AVCODEC_DXVA_H +#define AVCODEC_DXVA_H + +#include + +#include + +/** + * This structure is used to provides the necessary configurations and data + * to the DXVA2 FFmpeg HWAccel implementation. + * + * The application must make it available as AVCodecContext.hwaccel_context. + */ +struct dxva_context { + /** + * DXVA2 decoder object + */ + IDirectXVideoDecoder *decoder; + + /** + * DXVA2 configuration used to create the decoder + */ + const DXVA2_ConfigPictureDecode *cfg; + + /** + * The number of surface in the surface array + */ + unsigned surface_count; + + /** + * The array of Direct3D surfaces used to create the decoder + */ + LPDIRECT3DSURFACE9 *surface; + + /** + * A bit field configuring the workarounds needed for using the decoder + */ + uint64_t workaround; + + /** + * Private to the FFmpeg AVHWAccel implementation + */ + unsigned report_id; +}; + +#endif /* AVCODEC_DXVA_H */ diff --git a/windeps/include/libavcodec/opt.h b/windeps/include/libavcodec/opt.h new file mode 100644 index 0000000..9514759 --- /dev/null +++ b/windeps/include/libavcodec/opt.h @@ -0,0 +1,55 @@ +/* + * AVOptions + * copyright (c) 2005 Michael Niedermayer + * + * 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 + */ + +#ifndef AVCODEC_OPT_H +#define AVCODEC_OPT_H + +/** + * @file + * AVOptions + */ + +#include "libavutil/rational.h" +#include "avcodec.h" +#include "libavutil/opt.h" + +#if FF_API_SET_STRING_OLD +/** + * @see av_set_string2() + */ +attribute_deprecated const AVOption *av_set_string(void *obj, const char *name, const char *val); + +/** + * @return a pointer to the AVOption corresponding to the field set or + * NULL if no matching AVOption exists, or if the value val is not + * valid + * @see av_set_string3() + */ +attribute_deprecated const AVOption *av_set_string2(void *obj, const char *name, const char *val, int alloc); +#endif +#if FF_API_OPT_SHOW +/** + * @deprecated Use av_opt_show2() instead. + */ +attribute_deprecated int av_opt_show(void *obj, void *av_log_obj); +#endif + +#endif /* AVCODEC_OPT_H */ diff --git a/windeps/include/libavcodec/vaapi.h b/windeps/include/libavcodec/vaapi.h new file mode 100644 index 0000000..07568a4 --- /dev/null +++ b/windeps/include/libavcodec/vaapi.h @@ -0,0 +1,167 @@ +/* + * Video Acceleration API (shared data between FFmpeg and the video player) + * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1 + * + * Copyright (C) 2008-2009 Splitted-Desktop Systems + * + * 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 + */ + +#ifndef AVCODEC_VAAPI_H +#define AVCODEC_VAAPI_H + +#include + +/** + * \defgroup VAAPI_Decoding VA API Decoding + * \ingroup Decoder + * @{ + */ + +/** + * This structure is used to share data between the FFmpeg library and + * the client video application. + * This shall be zero-allocated and available as + * AVCodecContext.hwaccel_context. All user members can be set once + * during initialization or through each AVCodecContext.get_buffer() + * function call. In any case, they must be valid prior to calling + * decoding functions. + */ +struct vaapi_context { + /** + * Window system dependent data + * + * - encoding: unused + * - decoding: Set by user + */ + void *display; + + /** + * Configuration ID + * + * - encoding: unused + * - decoding: Set by user + */ + uint32_t config_id; + + /** + * Context ID (video decode pipeline) + * + * - encoding: unused + * - decoding: Set by user + */ + uint32_t context_id; + + /** + * VAPictureParameterBuffer ID + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + uint32_t pic_param_buf_id; + + /** + * VAIQMatrixBuffer ID + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + uint32_t iq_matrix_buf_id; + + /** + * VABitPlaneBuffer ID (for VC-1 decoding) + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + uint32_t bitplane_buf_id; + + /** + * Slice parameter/data buffer IDs + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + uint32_t *slice_buf_ids; + + /** + * Number of effective slice buffer IDs to send to the HW + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + unsigned int n_slice_buf_ids; + + /** + * Size of pre-allocated slice_buf_ids + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + unsigned int slice_buf_ids_alloc; + + /** + * Pointer to VASliceParameterBuffers + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + void *slice_params; + + /** + * Size of a VASliceParameterBuffer element + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + unsigned int slice_param_size; + + /** + * Size of pre-allocated slice_params + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + unsigned int slice_params_alloc; + + /** + * Number of slices currently filled in + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + unsigned int slice_count; + + /** + * Pointer to slice data buffer base + * - encoding: unused + * - decoding: Set by libavcodec + */ + const uint8_t *slice_data; + + /** + * Current size of slice data + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + uint32_t slice_data_size; +}; + +/* @} */ + +#endif /* AVCODEC_VAAPI_H */ diff --git a/windeps/include/libavcodec/vdpau.h b/windeps/include/libavcodec/vdpau.h new file mode 100644 index 0000000..ab5f682 --- /dev/null +++ b/windeps/include/libavcodec/vdpau.h @@ -0,0 +1,88 @@ +/* + * The Video Decode and Presentation API for UNIX (VDPAU) is used for + * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1. + * + * Copyright (C) 2008 NVIDIA + * + * 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 + */ + +#ifndef AVCODEC_VDPAU_H +#define AVCODEC_VDPAU_H + +/** + * \defgroup Decoder VDPAU Decoder and Renderer + * + * VDPAU hardware acceleration has two modules + * - VDPAU decoding + * - VDPAU presentation + * + * The VDPAU decoding module parses all headers using FFmpeg + * parsing mechanisms and uses VDPAU for the actual decoding. + * + * As per the current implementation, the actual decoding + * and rendering (API calls) are done as part of the VDPAU + * presentation (vo_vdpau.c) module. + * + * \defgroup VDPAU_Decoding VDPAU Decoding + * \ingroup Decoder + * @{ + */ + +#include +#include + +/** \brief The videoSurface is used for rendering. */ +#define FF_VDPAU_STATE_USED_FOR_RENDER 1 + +/** + * \brief The videoSurface is needed for reference/prediction. + * The codec manipulates this. + */ +#define FF_VDPAU_STATE_USED_FOR_REFERENCE 2 + +/** + * \brief This structure is used as a callback between the FFmpeg + * decoder (vd_) and presentation (vo_) module. + * This is used for defining a video frame containing surface, + * picture parameter, bitstream information etc which are passed + * between the FFmpeg decoder and its clients. + */ +struct vdpau_render_state { + VdpVideoSurface surface; ///< Used as rendered surface, never changed. + + int state; ///< Holds FF_VDPAU_STATE_* values. + + /** picture parameter information for all supported codecs */ + union VdpPictureInfo { + VdpPictureInfoH264 h264; + VdpPictureInfoMPEG1Or2 mpeg; + VdpPictureInfoVC1 vc1; + VdpPictureInfoMPEG4Part2 mpeg4; + } info; + + /** Describe size/location of the compressed video data. + Set to 0 when freeing bitstream_buffers. */ + int bitstream_buffers_allocated; + int bitstream_buffers_used; + /** The user is responsible for freeing this buffer using av_freep(). */ + VdpBitstreamBuffer *bitstream_buffers; +}; + +/* @}*/ + +#endif /* AVCODEC_VDPAU_H */ diff --git a/windeps/include/libavcodec/xvmc.h b/windeps/include/libavcodec/xvmc.h new file mode 100644 index 0000000..29c010b --- /dev/null +++ b/windeps/include/libavcodec/xvmc.h @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2003 Ivan Kalvachev + * + * 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 + */ + +#ifndef AVCODEC_XVMC_H +#define AVCODEC_XVMC_H + +#include + +#include "avcodec.h" + +#if LIBAVCODEC_VERSION_MAJOR < 53 +#define AV_XVMC_STATE_DISPLAY_PENDING 1 /** the surface should be shown, the video driver manipulates this */ +#define AV_XVMC_STATE_PREDICTION 2 /** the surface is needed for prediction, the codec manipulates this */ +#define AV_XVMC_STATE_OSD_SOURCE 4 /** the surface is needed for subpicture rendering */ +#endif +#define AV_XVMC_ID 0x1DC711C0 /**< special value to ensure that regular pixel routines haven't corrupted the struct + the number is 1337 speak for the letters IDCT MCo (motion compensation) */ + +struct xvmc_pix_fmt { + /** The field contains the special constant value AV_XVMC_ID. + It is used as a test that the application correctly uses the API, + and that there is no corruption caused by pixel routines. + - application - set during initialization + - libavcodec - unchanged + */ + int xvmc_id; + + /** Pointer to the block array allocated by XvMCCreateBlocks(). + The array has to be freed by XvMCDestroyBlocks(). + Each group of 64 values represents one data block of differential + pixel information (in MoCo mode) or coefficients for IDCT. + - application - set the pointer during initialization + - libavcodec - fills coefficients/pixel data into the array + */ + short* data_blocks; + + /** Pointer to the macroblock description array allocated by + XvMCCreateMacroBlocks() and freed by XvMCDestroyMacroBlocks(). + - application - set the pointer during initialization + - libavcodec - fills description data into the array + */ + XvMCMacroBlock* mv_blocks; + + /** Number of macroblock descriptions that can be stored in the mv_blocks + array. + - application - set during initialization + - libavcodec - unchanged + */ + int allocated_mv_blocks; + + /** Number of blocks that can be stored at once in the data_blocks array. + - application - set during initialization + - libavcodec - unchanged + */ + int allocated_data_blocks; + + /** Indicate that the hardware would interpret data_blocks as IDCT + coefficients and perform IDCT on them. + - application - set during initialization + - libavcodec - unchanged + */ + int idct; + + /** In MoCo mode it indicates that intra macroblocks are assumed to be in + unsigned format; same as the XVMC_INTRA_UNSIGNED flag. + - application - set during initialization + - libavcodec - unchanged + */ + int unsigned_intra; + + /** Pointer to the surface allocated by XvMCCreateSurface(). + It has to be freed by XvMCDestroySurface() on application exit. + It identifies the frame and its state on the video hardware. + - application - set during initialization + - libavcodec - unchanged + */ + XvMCSurface* p_surface; + +/** Set by the decoder before calling ff_draw_horiz_band(), + needed by the XvMCRenderSurface function. */ +//@{ + /** Pointer to the surface used as past reference + - application - unchanged + - libavcodec - set + */ + XvMCSurface* p_past_surface; + + /** Pointer to the surface used as future reference + - application - unchanged + - libavcodec - set + */ + XvMCSurface* p_future_surface; + + /** top/bottom field or frame + - application - unchanged + - libavcodec - set + */ + unsigned int picture_structure; + + /** XVMC_SECOND_FIELD - 1st or 2nd field in the sequence + - application - unchanged + - libavcodec - set + */ + unsigned int flags; +//}@ + + /** Number of macroblock descriptions in the mv_blocks array + that have already been passed to the hardware. + - application - zeroes it on get_buffer(). + A successful ff_draw_horiz_band() may increment it + with filled_mb_block_num or zero both. + - libavcodec - unchanged + */ + int start_mv_blocks_num; + + /** Number of new macroblock descriptions in the mv_blocks array (after + start_mv_blocks_num) that are filled by libavcodec and have to be + passed to the hardware. + - application - zeroes it on get_buffer() or after successful + ff_draw_horiz_band(). + - libavcodec - increment with one of each stored MB + */ + int filled_mv_blocks_num; + + /** Number of the the next free data block; one data block consists of + 64 short values in the data_blocks array. + All blocks before this one have already been claimed by placing their + position into the corresponding block description structure field, + that are part of the mv_blocks array. + - application - zeroes it on get_buffer(). + A successful ff_draw_horiz_band() may zero it together + with start_mb_blocks_num. + - libavcodec - each decoded macroblock increases it by the number + of coded blocks it contains. + */ + int next_free_data_block_num; + +/** extensions may be placed here */ +#if LIBAVCODEC_VERSION_MAJOR < 53 +//@{ + /** State flags used to work around limitations in the MPlayer video system. + 0 - Surface is not used. + 1 - Surface is still held in application to be displayed or is + still visible. + 2 - Surface is still held in libavcodec buffer for prediction. + */ + int state; + + /** pointer to the surface where the subpicture is rendered */ + void* p_osd_target_surface_render; +//}@ +#endif +}; + +#endif /* AVCODEC_XVMC_H */ diff --git a/windeps/include/libavcore/audioconvert.h b/windeps/include/libavcore/audioconvert.h new file mode 100644 index 0000000..89e9c55 --- /dev/null +++ b/windeps/include/libavcore/audioconvert.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2006 Michael Niedermayer + * Copyright (c) 2008 Peter Ross + * + * 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 + */ + +#ifndef AVCORE_AUDIOCONVERT_H +#define AVCORE_AUDIOCONVERT_H + +/** + * @file + * audio conversion routines + */ + +#include "avcore.h" + +/* Audio channel masks */ +#define AV_CH_FRONT_LEFT 0x00000001 +#define AV_CH_FRONT_RIGHT 0x00000002 +#define AV_CH_FRONT_CENTER 0x00000004 +#define AV_CH_LOW_FREQUENCY 0x00000008 +#define AV_CH_BACK_LEFT 0x00000010 +#define AV_CH_BACK_RIGHT 0x00000020 +#define AV_CH_FRONT_LEFT_OF_CENTER 0x00000040 +#define AV_CH_FRONT_RIGHT_OF_CENTER 0x00000080 +#define AV_CH_BACK_CENTER 0x00000100 +#define AV_CH_SIDE_LEFT 0x00000200 +#define AV_CH_SIDE_RIGHT 0x00000400 +#define AV_CH_TOP_CENTER 0x00000800 +#define AV_CH_TOP_FRONT_LEFT 0x00001000 +#define AV_CH_TOP_FRONT_CENTER 0x00002000 +#define AV_CH_TOP_FRONT_RIGHT 0x00004000 +#define AV_CH_TOP_BACK_LEFT 0x00008000 +#define AV_CH_TOP_BACK_CENTER 0x00010000 +#define AV_CH_TOP_BACK_RIGHT 0x00020000 +#define AV_CH_STEREO_LEFT 0x20000000 ///< Stereo downmix. +#define AV_CH_STEREO_RIGHT 0x40000000 ///< See AV_CH_STEREO_LEFT. + +/** Channel mask value used for AVCodecContext.request_channel_layout + to indicate that the user requests the channel order of the decoder output + to be the native codec channel order. */ +#define AV_CH_LAYOUT_NATIVE 0x8000000000000000LL + +/* Audio channel convenience macros */ +#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT) +#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_2_2 (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_QUAD (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_5POINT0_BACK (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT1_BACK (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_7POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT1_WIDE (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT) + +/** + * Return a channel layout id that matches name, 0 if no match. + */ +int64_t av_get_channel_layout(const char *name); + +/** + * Return a description of a channel layout. + * If nb_channels is <= 0, it is guessed from the channel_layout. + * + * @param buf put here the string containing the channel layout + * @param buf_size size in bytes of the buffer + */ +void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, int64_t channel_layout); + +/** + * Return the number of channels in the channel layout. + */ +int av_get_channel_layout_nb_channels(int64_t channel_layout); + +#endif /* AVCORE_AUDIOCONVERT_H */ diff --git a/windeps/include/libavcore/avcore.h b/windeps/include/libavcore/avcore.h new file mode 100644 index 0000000..9b02c3b --- /dev/null +++ b/windeps/include/libavcore/avcore.h @@ -0,0 +1,70 @@ +/* + * 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 + */ + +#ifndef AVCORE_AVCORE_H +#define AVCORE_AVCORE_H + +/** + * @file + * shared media utilities for the libav* libraries + */ + +#include "libavutil/avutil.h" + +#define LIBAVCORE_VERSION_MAJOR 0 +#define LIBAVCORE_VERSION_MINOR 16 +#define LIBAVCORE_VERSION_MICRO 1 + +#define LIBAVCORE_VERSION_INT AV_VERSION_INT(LIBAVCORE_VERSION_MAJOR, \ + LIBAVCORE_VERSION_MINOR, \ + LIBAVCORE_VERSION_MICRO) +#define LIBAVCORE_VERSION AV_VERSION(LIBAVCORE_VERSION_MAJOR, \ + LIBAVCORE_VERSION_MINOR, \ + LIBAVCORE_VERSION_MICRO) +#define LIBAVCORE_BUILD LIBAVCORE_VERSION_INT + +#define LIBAVCORE_IDENT "Lavcore" AV_STRINGIFY(LIBAVCORE_VERSION) + +/** + * Return the LIBAVCORE_VERSION_INT constant. + */ +unsigned avcore_version(void); + +/** + * Return the libavcore build-time configuration. + */ +const char *avcore_configuration(void); + +/** + * Return the libavcore license. + */ +const char *avcore_license(void); + +#define AV_NOPTS_VALUE INT64_C(0x8000000000000000) +#define AV_TIME_BASE 1000000 +#define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE} + +/** + * Those FF_API_* defines are not part of public API. + * They may change, break or disappear at any time. + */ +#ifndef FF_API_OLD_IMAGE_NAMES +#define FF_API_OLD_IMAGE_NAMES (LIBAVCORE_VERSION_MAJOR < 1) +#endif + +#endif /* AVCORE_AVCORE_H */ diff --git a/windeps/include/libavcore/imgutils.h b/windeps/include/libavcore/imgutils.h new file mode 100644 index 0000000..6c39d53 --- /dev/null +++ b/windeps/include/libavcore/imgutils.h @@ -0,0 +1,147 @@ +/* + * 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 + */ + +#ifndef AVCORE_IMGUTILS_H +#define AVCORE_IMGUTILS_H + +/** + * @file + * misc image utilities + */ + +#include "libavutil/pixdesc.h" +#include "avcore.h" + +/** + * Compute the max pixel step for each plane of an image with a + * format described by pixdesc. + * + * The pixel step is the distance in bytes between the first byte of + * the group of bytes which describe a pixel component and the first + * byte of the successive group in the same plane for the same + * component. + * + * @param max_pixsteps an array which is filled with the max pixel step + * for each plane. Since a plane may contain different pixel + * components, the computed max_pixsteps[plane] is relative to the + * component in the plane with the max pixel step. + * @param max_pixstep_comps an array which is filled with the component + * for each plane which has the max pixel step. May be NULL. + */ +void av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4], + const AVPixFmtDescriptor *pixdesc); + +/** + * Compute the size of an image line with format pix_fmt and width + * width for the plane plane. + * + * @return the computed size in bytes + */ +int av_image_get_linesize(enum PixelFormat pix_fmt, int width, int plane); + +/** + * Fill plane linesizes for an image with pixel format pix_fmt and + * width width. + * + * @param linesizes array to be filled with the linesize for each plane + * @return >= 0 in case of success, a negative error code otherwise + */ +int av_image_fill_linesizes(int linesizes[4], enum PixelFormat pix_fmt, int width); + +/** + * Fill plane data pointers for an image with pixel format pix_fmt and + * height height. + * + * @param data pointers array to be filled with the pointer for each image plane + * @param ptr the pointer to a buffer which will contain the image + * @param linesizes[4] the array containing the linesize for each + * plane, should be filled by av_image_fill_linesizes() + * @return the size in bytes required for the image buffer, a negative + * error code in case of failure + */ +int av_image_fill_pointers(uint8_t *data[4], enum PixelFormat pix_fmt, int height, + uint8_t *ptr, const int linesizes[4]); + +/** + * Allocate an image with size w and h and pixel format pix_fmt, and + * fill pointers and linesizes accordingly. + * The allocated image buffer has to be freed by using + * av_freep(&pointers[0]). + * + * @param align the value to use for buffer size alignment + * @return the size in bytes required for the image buffer, a negative + * error code in case of failure + */ +int av_image_alloc(uint8_t *pointers[4], int linesizes[4], + int w, int h, enum PixelFormat pix_fmt, int align); + +/** + * Copy image plane from src to dst. + * That is, copy "height" number of lines of "bytewidth" bytes each. + * The first byte of each successive line is separated by *_linesize + * bytes. + * + * @param dst_linesize linesize for the image plane in dst + * @param src_linesize linesize for the image plane in src + */ +void av_image_copy_plane(uint8_t *dst, int dst_linesize, + const uint8_t *src, int src_linesize, + int bytewidth, int height); + +/** + * Copy image in src_data to dst_data. + * + * @param dst_linesize linesizes for the image in dst_data + * @param src_linesize linesizes for the image in src_data + */ +void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4], + const uint8_t *src_data[4], const int src_linesizes[4], + enum PixelFormat pix_fmt, int width, int height); + +/** + * Check if the given dimension of an image is valid, meaning that all + * bytes of the image can be addressed with a signed int. + * + * @param w the width of the picture + * @param h the height of the picture + * @param log_offset the offset to sum to the log level for logging with log_ctx + * @param log_ctx the parent logging context, it may be NULL + * @return >= 0 if valid, a negative error code otherwise + */ +int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx); + +#if FF_API_OLD_IMAGE_NAMES +attribute_deprecated +void av_fill_image_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4], + const AVPixFmtDescriptor *pixdesc); + +attribute_deprecated +int av_get_image_linesize(enum PixelFormat pix_fmt, int width, int plane); + +attribute_deprecated +int av_fill_image_linesizes(int linesizes[4], enum PixelFormat pix_fmt, int width); + +attribute_deprecated +int av_fill_image_pointers(uint8_t *data[4], enum PixelFormat pix_fmt, int height, + uint8_t *ptr, const int linesizes[4]); + +attribute_deprecated +int av_check_image_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx); +#endif + +#endif /* AVCORE_IMGUTILS_H */ diff --git a/windeps/include/libavcore/parseutils.h b/windeps/include/libavcore/parseutils.h new file mode 100644 index 0000000..052427b --- /dev/null +++ b/windeps/include/libavcore/parseutils.h @@ -0,0 +1,75 @@ +/* + * 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 + */ + +#ifndef AVCORE_PARSEUTILS_H +#define AVCORE_PARSEUTILS_H + +#include "libavutil/rational.h" + +/** + * @file + * misc parsing utilities for libavcore + */ + +/** + * Parse str and put in width_ptr and height_ptr the detected values. + * + * @param[in,out] width_ptr pointer to the variable which will contain the detected + * width value + * @param[in,out] height_ptr pointer to the variable which will contain the detected + * height value + * @param[in] str the string to parse: it has to be a string in the format + * width x height or a valid video size abbreviation. + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str); + +/** + * Parse str and store the detected values in *rate. + * + * @param[in,out] rate pointer to the AVRational which will contain the detected + * frame rate + * @param[in] str the string to parse: it has to be a string in the format + * rate_num / rate_den, a float number or a valid video rate abbreviation + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_video_rate(AVRational *rate, const char *str); + +/** + * Put the RGBA values that correspond to color_string in rgba_color. + * + * @param color_string a string specifying a color. It can be the name of + * a color (case insensitive match) or a [0x|#]RRGGBB[AA] sequence, + * possibly followed by "@" and a string representing the alpha + * component. + * The alpha component may be a string composed by "0x" followed by an + * hexadecimal number or a decimal number between 0.0 and 1.0, which + * represents the opacity value (0x00/0.0 means completely transparent, + * 0xff/1.0 completely opaque). + * If the alpha component is not specified then 0xff is assumed. + * The string "random" will result in a random color. + * @param slen length of the initial part of color_string containing the + * color. It can be set to -1 if color_string is a null terminated string + * containing nothing else than the color. + * @return >= 0 in case of success, a negative value in case of + * failure (for example if color_string cannot be parsed). + */ +int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, + void *log_ctx); + +#endif /* AVCORE_PARSEUTILS_H */ diff --git a/windeps/include/libavcore/samplefmt.h b/windeps/include/libavcore/samplefmt.h new file mode 100644 index 0000000..9701efe --- /dev/null +++ b/windeps/include/libavcore/samplefmt.h @@ -0,0 +1,72 @@ +/* + * 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 + */ + +#ifndef AVCORE_SAMPLEFMT_H +#define AVCORE_SAMPLEFMT_H + +#include "avcore.h" + +/** + * all in native-endian format + */ +enum AVSampleFormat { + AV_SAMPLE_FMT_NONE = -1, + AV_SAMPLE_FMT_U8, ///< unsigned 8 bits + AV_SAMPLE_FMT_S16, ///< signed 16 bits + AV_SAMPLE_FMT_S32, ///< signed 32 bits + AV_SAMPLE_FMT_FLT, ///< float + AV_SAMPLE_FMT_DBL, ///< double + AV_SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if dynamically linking to libavcore +}; + +/** + * Return the name of sample_fmt, or NULL if sample_fmt is not + * recognized. + */ +const char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt); + +/** + * Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE + * on error. + */ +enum AVSampleFormat av_get_sample_fmt(const char *name); + +/** + * Generate a string corresponding to the sample format with + * sample_fmt, or a header if sample_fmt is negative. + * + * @param buf the buffer where to write the string + * @param buf_size the size of buf + * @param sample_fmt the number of the sample format to print the + * corresponding info string, or a negative value to print the + * corresponding header. + * @return the pointer to the filled buffer or NULL if sample_fmt is + * unknown or in case of other errors + */ +char *av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt); + +/** + * Return sample format bits per sample. + * + * @param sample_fmt the sample format + * @return number of bits per sample or zero if unknown for the given + * sample format + */ +int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt); + +#endif /* AVCORE_SAMPLEFMT_H */ diff --git a/windeps/include/libavdevice/avdevice.h b/windeps/include/libavdevice/avdevice.h new file mode 100644 index 0000000..5c3739f --- /dev/null +++ b/windeps/include/libavdevice/avdevice.h @@ -0,0 +1,58 @@ +/* + * 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 + */ + +#ifndef AVDEVICE_AVDEVICE_H +#define AVDEVICE_AVDEVICE_H + +#include "libavutil/avutil.h" + +#define LIBAVDEVICE_VERSION_MAJOR 52 +#define LIBAVDEVICE_VERSION_MINOR 2 +#define LIBAVDEVICE_VERSION_MICRO 3 + +#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ + LIBAVDEVICE_VERSION_MINOR, \ + LIBAVDEVICE_VERSION_MICRO) +#define LIBAVDEVICE_VERSION AV_VERSION(LIBAVDEVICE_VERSION_MAJOR, \ + LIBAVDEVICE_VERSION_MINOR, \ + LIBAVDEVICE_VERSION_MICRO) +#define LIBAVDEVICE_BUILD LIBAVDEVICE_VERSION_INT + +/** + * Return the LIBAVDEVICE_VERSION_INT constant. + */ +unsigned avdevice_version(void); + +/** + * Return the libavdevice build-time configuration. + */ +const char *avdevice_configuration(void); + +/** + * Return the libavdevice license. + */ +const char *avdevice_license(void); + +/** + * Initialize libavdevice and register all the input and output devices. + * @warning This function is not thread safe. + */ +void avdevice_register_all(void); + +#endif /* AVDEVICE_AVDEVICE_H */ + diff --git a/windeps/include/libavfilter/avfilter.h b/windeps/include/libavfilter/avfilter.h new file mode 100644 index 0000000..22b8b1c --- /dev/null +++ b/windeps/include/libavfilter/avfilter.h @@ -0,0 +1,860 @@ +/* + * filter layer + * Copyright (c) 2007 Bobby Bingham + * + * 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 + */ + +#ifndef AVFILTER_AVFILTER_H +#define AVFILTER_AVFILTER_H + +#include "libavutil/avutil.h" +#include "libavcore/avcore.h" +#include "libavcore/samplefmt.h" + +#define LIBAVFILTER_VERSION_MAJOR 1 +#define LIBAVFILTER_VERSION_MINOR 74 +#define LIBAVFILTER_VERSION_MICRO 0 + +#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ + LIBAVFILTER_VERSION_MINOR, \ + LIBAVFILTER_VERSION_MICRO) +#define LIBAVFILTER_VERSION AV_VERSION(LIBAVFILTER_VERSION_MAJOR, \ + LIBAVFILTER_VERSION_MINOR, \ + LIBAVFILTER_VERSION_MICRO) +#define LIBAVFILTER_BUILD LIBAVFILTER_VERSION_INT + +#include + +/** + * Return the LIBAVFILTER_VERSION_INT constant. + */ +unsigned avfilter_version(void); + +/** + * Return the libavfilter build-time configuration. + */ +const char *avfilter_configuration(void); + +/** + * Return the libavfilter license. + */ +const char *avfilter_license(void); + + +typedef struct AVFilterContext AVFilterContext; +typedef struct AVFilterLink AVFilterLink; +typedef struct AVFilterPad AVFilterPad; + +/** + * A reference-counted buffer data type used by the filter system. Filters + * should not store pointers to this structure directly, but instead use the + * AVFilterBufferRef structure below. + */ +typedef struct AVFilterBuffer { + uint8_t *data[8]; ///< buffer data for each plane/channel + int linesize[8]; ///< number of bytes per line + + unsigned refcount; ///< number of references to this buffer + + /** private data to be used by a custom free function */ + void *priv; + /** + * A pointer to the function to deallocate this buffer if the default + * function is not sufficient. This could, for example, add the memory + * back into a memory pool to be reused later without the overhead of + * reallocating it from scratch. + */ + void (*free)(struct AVFilterBuffer *buf); + + int format; ///< media format + int w, h; ///< width and height of the allocated buffer +} AVFilterBuffer; + +#define AV_PERM_READ 0x01 ///< can read from the buffer +#define AV_PERM_WRITE 0x02 ///< can write to the buffer +#define AV_PERM_PRESERVE 0x04 ///< nobody else can overwrite the buffer +#define AV_PERM_REUSE 0x08 ///< can output the buffer multiple times, with the same contents each time +#define AV_PERM_REUSE2 0x10 ///< can output the buffer multiple times, modified each time +#define AV_PERM_NEG_LINESIZES 0x20 ///< the buffer requested can have negative linesizes + +/** + * Audio specific properties in a reference to an AVFilterBuffer. Since + * AVFilterBufferRef is common to different media formats, audio specific + * per reference properties must be separated out. + */ +typedef struct AVFilterBufferRefAudioProps { + int64_t channel_layout; ///< channel layout of audio buffer + int nb_samples; ///< number of audio samples + int size; ///< audio buffer size + uint32_t sample_rate; ///< audio buffer sample rate + int planar; ///< audio buffer - planar or packed +} AVFilterBufferRefAudioProps; + +/** + * Video specific properties in a reference to an AVFilterBuffer. Since + * AVFilterBufferRef is common to different media formats, video specific + * per reference properties must be separated out. + */ +typedef struct AVFilterBufferRefVideoProps { + int w; ///< image width + int h; ///< image height + AVRational pixel_aspect; ///< pixel aspect ratio + int interlaced; ///< is frame interlaced + int top_field_first; ///< field order +} AVFilterBufferRefVideoProps; + +/** + * A reference to an AVFilterBuffer. Since filters can manipulate the origin of + * a buffer to, for example, crop image without any memcpy, the buffer origin + * and dimensions are per-reference properties. Linesize is also useful for + * image flipping, frame to field filters, etc, and so is also per-reference. + * + * TODO: add anything necessary for frame reordering + */ +typedef struct AVFilterBufferRef { + AVFilterBuffer *buf; ///< the buffer that this is a reference to + uint8_t *data[8]; ///< picture/audio data for each plane + int linesize[8]; ///< number of bytes per line + int format; ///< media format + + /** + * presentation timestamp. The time unit may change during + * filtering, as it is specified in the link and the filter code + * may need to rescale the PTS accordingly. + */ + int64_t pts; + int64_t pos; ///< byte position in stream, -1 if unknown + + int perms; ///< permissions, see the AV_PERM_* flags + + enum AVMediaType type; ///< media type of buffer data + AVFilterBufferRefVideoProps *video; ///< video buffer specific properties + AVFilterBufferRefAudioProps *audio; ///< audio buffer specific properties +} AVFilterBufferRef; + +/** + * Copy properties of src to dst, without copying the actual data + */ +static inline void avfilter_copy_buffer_ref_props(AVFilterBufferRef *dst, AVFilterBufferRef *src) +{ + // copy common properties + dst->pts = src->pts; + dst->pos = src->pos; + + switch (src->type) { + case AVMEDIA_TYPE_VIDEO: *dst->video = *src->video; break; + case AVMEDIA_TYPE_AUDIO: *dst->audio = *src->audio; break; + } +} + +/** + * Add a new reference to a buffer. + * + * @param ref an existing reference to the buffer + * @param pmask a bitmask containing the allowable permissions in the new + * reference + * @return a new reference to the buffer with the same properties as the + * old, excluding any permissions denied by pmask + */ +AVFilterBufferRef *avfilter_ref_buffer(AVFilterBufferRef *ref, int pmask); + +/** + * Remove a reference to a buffer. If this is the last reference to the + * buffer, the buffer itself is also automatically freed. + * + * @param ref reference to the buffer, may be NULL + */ +void avfilter_unref_buffer(AVFilterBufferRef *ref); + +/** + * A list of supported formats for one end of a filter link. This is used + * during the format negotiation process to try to pick the best format to + * use to minimize the number of necessary conversions. Each filter gives a + * list of the formats supported by each input and output pad. The list + * given for each pad need not be distinct - they may be references to the + * same list of formats, as is often the case when a filter supports multiple + * formats, but will always output the same format as it is given in input. + * + * In this way, a list of possible input formats and a list of possible + * output formats are associated with each link. When a set of formats is + * negotiated over a link, the input and output lists are merged to form a + * new list containing only the common elements of each list. In the case + * that there were no common elements, a format conversion is necessary. + * Otherwise, the lists are merged, and all other links which reference + * either of the format lists involved in the merge are also affected. + * + * For example, consider the filter chain: + * filter (a) --> (b) filter (b) --> (c) filter + * + * where the letters in parenthesis indicate a list of formats supported on + * the input or output of the link. Suppose the lists are as follows: + * (a) = {A, B} + * (b) = {A, B, C} + * (c) = {B, C} + * + * First, the first link's lists are merged, yielding: + * filter (a) --> (a) filter (a) --> (c) filter + * + * Notice that format list (b) now refers to the same list as filter list (a). + * Next, the lists for the second link are merged, yielding: + * filter (a) --> (a) filter (a) --> (a) filter + * + * where (a) = {B}. + * + * Unfortunately, when the format lists at the two ends of a link are merged, + * we must ensure that all links which reference either pre-merge format list + * get updated as well. Therefore, we have the format list structure store a + * pointer to each of the pointers to itself. + */ +typedef struct AVFilterFormats { + unsigned format_count; ///< number of formats + int *formats; ///< list of media formats + + unsigned refcount; ///< number of references to this list + struct AVFilterFormats ***refs; ///< references to this list +} AVFilterFormats;; + +/** + * Create a list of supported formats. This is intended for use in + * AVFilter->query_formats(). + * + * @param fmts list of media formats, terminated by -1 + * @return the format list, with no existing references + */ +AVFilterFormats *avfilter_make_format_list(const int *fmts); + +/** + * Add fmt to the list of media formats contained in *avff. + * If *avff is NULL the function allocates the filter formats struct + * and puts its pointer in *avff. + * + * @return a non negative value in case of success, or a negative + * value corresponding to an AVERROR code in case of error + */ +int avfilter_add_format(AVFilterFormats **avff, int fmt); + +/** + * Return a list of all formats supported by FFmpeg for the given media type. + */ +AVFilterFormats *avfilter_all_formats(enum AVMediaType type); + +/** + * Return a format list which contains the intersection of the formats of + * a and b. Also, all the references of a, all the references of b, and + * a and b themselves will be deallocated. + * + * If a and b do not share any common formats, neither is modified, and NULL + * is returned. + */ +AVFilterFormats *avfilter_merge_formats(AVFilterFormats *a, AVFilterFormats *b); + +/** + * Add *ref as a new reference to formats. + * That is the pointers will point like in the ascii art below: + * ________ + * |formats |<--------. + * | ____ | ____|___________________ + * | |refs| | | __|_ + * | |* * | | | | | | AVFilterLink + * | |* *--------->|*ref| + * | |____| | | |____| + * |________| |________________________ + */ +void avfilter_formats_ref(AVFilterFormats *formats, AVFilterFormats **ref); + +/** + * If *ref is non-NULL, remove *ref as a reference to the format list + * it currently points to, deallocates that list if this was the last + * reference, and sets *ref to NULL. + * + * Before After + * ________ ________ NULL + * |formats |<--------. |formats | ^ + * | ____ | ____|________________ | ____ | ____|________________ + * | |refs| | | __|_ | |refs| | | __|_ + * | |* * | | | | | | AVFilterLink | |* * | | | | | | AVFilterLink + * | |* *--------->|*ref| | |* | | | |*ref| + * | |____| | | |____| | |____| | | |____| + * |________| |_____________________ |________| |_____________________ + */ +void avfilter_formats_unref(AVFilterFormats **ref); + +/** + * + * Before After + * ________ ________ + * |formats |<---------. |formats |<---------. + * | ____ | ___|___ | ____ | ___|___ + * | |refs| | | | | | |refs| | | | | NULL + * | |* *--------->|*oldref| | |* *--------->|*newref| ^ + * | |* * | | |_______| | |* * | | |_______| ___|___ + * | |____| | | |____| | | | | + * |________| |________| |*oldref| + * |_______| + */ +void avfilter_formats_changeref(AVFilterFormats **oldref, + AVFilterFormats **newref); + +/** + * A filter pad used for either input or output. + */ +struct AVFilterPad { + /** + * Pad name. The name is unique among inputs and among outputs, but an + * input may have the same name as an output. This may be NULL if this + * pad has no need to ever be referenced by name. + */ + const char *name; + + /** + * AVFilterPad type. Only video supported now, hopefully someone will + * add audio in the future. + */ + enum AVMediaType type; + + /** + * Minimum required permissions on incoming buffers. Any buffer with + * insufficient permissions will be automatically copied by the filter + * system to a new buffer which provides the needed access permissions. + * + * Input pads only. + */ + int min_perms; + + /** + * Permissions which are not accepted on incoming buffers. Any buffer + * which has any of these permissions set will be automatically copied + * by the filter system to a new buffer which does not have those + * permissions. This can be used to easily disallow buffers with + * AV_PERM_REUSE. + * + * Input pads only. + */ + int rej_perms; + + /** + * Callback called before passing the first slice of a new frame. If + * NULL, the filter layer will default to storing a reference to the + * picture inside the link structure. + * + * Input video pads only. + */ + void (*start_frame)(AVFilterLink *link, AVFilterBufferRef *picref); + + /** + * Callback function to get a video buffer. If NULL, the filter system will + * use avfilter_default_get_video_buffer(). + * + * Input video pads only. + */ + AVFilterBufferRef *(*get_video_buffer)(AVFilterLink *link, int perms, int w, int h); + + /** + * Callback function to get an audio buffer. If NULL, the filter system will + * use avfilter_default_get_audio_buffer(). + * + * Input audio pads only. + */ + AVFilterBufferRef *(*get_audio_buffer)(AVFilterLink *link, int perms, + enum AVSampleFormat sample_fmt, int size, + int64_t channel_layout, int planar); + + /** + * Callback called after the slices of a frame are completely sent. If + * NULL, the filter layer will default to releasing the reference stored + * in the link structure during start_frame(). + * + * Input video pads only. + */ + void (*end_frame)(AVFilterLink *link); + + /** + * Slice drawing callback. This is where a filter receives video data + * and should do its processing. + * + * Input video pads only. + */ + void (*draw_slice)(AVFilterLink *link, int y, int height, int slice_dir); + + /** + * Samples filtering callback. This is where a filter receives audio data + * and should do its processing. + * + * Input audio pads only. + */ + void (*filter_samples)(AVFilterLink *link, AVFilterBufferRef *samplesref); + + /** + * Frame poll callback. This returns the number of immediately available + * samples. It should return a positive value if the next request_frame() + * is guaranteed to return one frame (with no delay). + * + * Defaults to just calling the source poll_frame() method. + * + * Output video pads only. + */ + int (*poll_frame)(AVFilterLink *link); + + /** + * Frame request callback. A call to this should result in at least one + * frame being output over the given link. This should return zero on + * success, and another value on error. + * + * Output video pads only. + */ + int (*request_frame)(AVFilterLink *link); + + /** + * Link configuration callback. + * + * For output pads, this should set the link properties such as + * width/height. This should NOT set the format property - that is + * negotiated between filters by the filter system using the + * query_formats() callback before this function is called. + * + * For input pads, this should check the properties of the link, and update + * the filter's internal state as necessary. + * + * For both input and output filters, this should return zero on success, + * and another value on error. + */ + int (*config_props)(AVFilterLink *link); +}; + +/** default handler for start_frame() for video inputs */ +void avfilter_default_start_frame(AVFilterLink *link, AVFilterBufferRef *picref); + +/** default handler for draw_slice() for video inputs */ +void avfilter_default_draw_slice(AVFilterLink *link, int y, int h, int slice_dir); + +/** default handler for end_frame() for video inputs */ +void avfilter_default_end_frame(AVFilterLink *link); + +/** default handler for filter_samples() for audio inputs */ +void avfilter_default_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref); + +/** default handler for config_props() for audio/video outputs */ +int avfilter_default_config_output_link(AVFilterLink *link); + +/** default handler for config_props() for audio/video inputs */ +int avfilter_default_config_input_link (AVFilterLink *link); + +/** default handler for get_video_buffer() for video inputs */ +AVFilterBufferRef *avfilter_default_get_video_buffer(AVFilterLink *link, + int perms, int w, int h); + +/** default handler for get_audio_buffer() for audio inputs */ +AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int perms, + enum AVSampleFormat sample_fmt, int size, + int64_t channel_layout, int planar); + +/** + * A helper for query_formats() which sets all links to the same list of + * formats. If there are no links hooked to this filter, the list of formats is + * freed. + */ +void avfilter_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats); + +/** Default handler for query_formats() */ +int avfilter_default_query_formats(AVFilterContext *ctx); + +/** start_frame() handler for filters which simply pass video along */ +void avfilter_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref); + +/** draw_slice() handler for filters which simply pass video along */ +void avfilter_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir); + +/** end_frame() handler for filters which simply pass video along */ +void avfilter_null_end_frame(AVFilterLink *link); + +/** filter_samples() handler for filters which simply pass audio along */ +void avfilter_null_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref); + +/** get_video_buffer() handler for filters which simply pass video along */ +AVFilterBufferRef *avfilter_null_get_video_buffer(AVFilterLink *link, + int perms, int w, int h); + +/** get_audio_buffer() handler for filters which simply pass audio along */ +AVFilterBufferRef *avfilter_null_get_audio_buffer(AVFilterLink *link, int perms, + enum AVSampleFormat sample_fmt, int size, + int64_t channel_layout, int planar); + +/** + * Filter definition. This defines the pads a filter contains, and all the + * callback functions used to interact with the filter. + */ +typedef struct AVFilter { + const char *name; ///< filter name + + int priv_size; ///< size of private data to allocate for the filter + + /** + * Filter initialization function. Args contains the user-supplied + * parameters. FIXME: maybe an AVOption-based system would be better? + * opaque is data provided by the code requesting creation of the filter, + * and is used to pass data to the filter. + */ + int (*init)(AVFilterContext *ctx, const char *args, void *opaque); + + /** + * Filter uninitialization function. Should deallocate any memory held + * by the filter, release any buffer references, etc. This does not need + * to deallocate the AVFilterContext->priv memory itself. + */ + void (*uninit)(AVFilterContext *ctx); + + /** + * Queries formats supported by the filter and its pads, and sets the + * in_formats for links connected to its output pads, and out_formats + * for links connected to its input pads. + * + * @return zero on success, a negative value corresponding to an + * AVERROR code otherwise + */ + int (*query_formats)(AVFilterContext *); + + const AVFilterPad *inputs; ///< NULL terminated list of inputs. NULL if none + const AVFilterPad *outputs; ///< NULL terminated list of outputs. NULL if none + + /** + * A description for the filter. You should use the + * NULL_IF_CONFIG_SMALL() macro to define it. + */ + const char *description; +} AVFilter; + +/** An instance of a filter */ +struct AVFilterContext { + const AVClass *av_class; ///< needed for av_log() + + AVFilter *filter; ///< the AVFilter of which this is an instance + + char *name; ///< name of this filter instance + + unsigned input_count; ///< number of input pads + AVFilterPad *input_pads; ///< array of input pads + AVFilterLink **inputs; ///< array of pointers to input links + + unsigned output_count; ///< number of output pads + AVFilterPad *output_pads; ///< array of output pads + AVFilterLink **outputs; ///< array of pointers to output links + + void *priv; ///< private data for use by the filter +}; + +/** + * A link between two filters. This contains pointers to the source and + * destination filters between which this link exists, and the indexes of + * the pads involved. In addition, this link also contains the parameters + * which have been negotiated and agreed upon between the filter, such as + * image dimensions, format, etc. + */ +struct AVFilterLink { + AVFilterContext *src; ///< source filter + AVFilterPad *srcpad; ///< output pad on the source filter + + AVFilterContext *dst; ///< dest filter + AVFilterPad *dstpad; ///< input pad on the dest filter + + /** stage of the initialization of the link properties (dimensions, etc) */ + enum { + AVLINK_UNINIT = 0, ///< not started + AVLINK_STARTINIT, ///< started, but incomplete + AVLINK_INIT ///< complete + } init_state; + + enum AVMediaType type; ///< filter media type + + /* These two parameters apply only to video */ + int w; ///< agreed upon image width + int h; ///< agreed upon image height + /* These two parameters apply only to audio */ + int64_t channel_layout; ///< channel layout of current buffer (see libavcore/audioconvert.h) + int64_t sample_rate; ///< samples per second + + int format; ///< agreed upon media format + + /** + * Lists of formats supported by the input and output filters respectively. + * These lists are used for negotiating the format to actually be used, + * which will be loaded into the format member, above, when chosen. + */ + AVFilterFormats *in_formats; + AVFilterFormats *out_formats; + + /** + * The buffer reference currently being sent across the link by the source + * filter. This is used internally by the filter system to allow + * automatic copying of buffers which do not have sufficient permissions + * for the destination. This should not be accessed directly by the + * filters. + */ + AVFilterBufferRef *src_buf; + + AVFilterBufferRef *cur_buf; + AVFilterBufferRef *out_buf; + + /** + * Define the time base used by the PTS of the frames/samples + * which will pass through this link. + * During the configuration stage, each filter is supposed to + * change only the output timebase, while the timebase of the + * input link is assumed to be an unchangeable property. + */ + AVRational time_base; +}; + +/** + * Link two filters together. + * + * @param src the source filter + * @param srcpad index of the output pad on the source filter + * @param dst the destination filter + * @param dstpad index of the input pad on the destination filter + * @return zero on success + */ +int avfilter_link(AVFilterContext *src, unsigned srcpad, + AVFilterContext *dst, unsigned dstpad); + +/** + * Negotiate the media format, dimensions, etc of all inputs to a filter. + * + * @param filter the filter to negotiate the properties for its inputs + * @return zero on successful negotiation + */ +int avfilter_config_links(AVFilterContext *filter); + +/** + * Request a picture buffer with a specific set of permissions. + * + * @param link the output link to the filter from which the buffer will + * be requested + * @param perms the required access permissions + * @param w the minimum width of the buffer to allocate + * @param h the minimum height of the buffer to allocate + * @return A reference to the buffer. This must be unreferenced with + * avfilter_unref_buffer when you are finished with it. + */ +AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, + int w, int h); + +/** + * Create a buffer reference wrapped around an already allocated image + * buffer. + * + * @param data pointers to the planes of the image to reference + * @param linesize linesizes for the planes of the image to reference + * @param perms the required access permissions + * @param w the width of the image specified by the data and linesize arrays + * @param h the height of the image specified by the data and linesize arrays + * @param format the pixel format of the image specified by the data and linesize arrays + */ +AVFilterBufferRef * +avfilter_get_video_buffer_ref_from_arrays(uint8_t *data[4], int linesize[4], int perms, + int w, int h, enum PixelFormat format); + +/** + * Request an audio samples buffer with a specific set of permissions. + * + * @param link the output link to the filter from which the buffer will + * be requested + * @param perms the required access permissions + * @param sample_fmt the format of each sample in the buffer to allocate + * @param size the buffer size in bytes + * @param channel_layout the number and type of channels per sample in the buffer to allocate + * @param planar audio data layout - planar or packed + * @return A reference to the samples. This must be unreferenced with + * avfilter_unref_buffer when you are finished with it. + */ +AVFilterBufferRef *avfilter_get_audio_buffer(AVFilterLink *link, int perms, + enum AVSampleFormat sample_fmt, int size, + int64_t channel_layout, int planar); + +/** + * Request an input frame from the filter at the other end of the link. + * + * @param link the input link + * @return zero on success + */ +int avfilter_request_frame(AVFilterLink *link); + +/** + * Poll a frame from the filter chain. + * + * @param link the input link + * @return the number of immediately available frames, a negative + * number in case of error + */ +int avfilter_poll_frame(AVFilterLink *link); + +/** + * Notifie the next filter of the start of a frame. + * + * @param link the output link the frame will be sent over + * @param picref A reference to the frame about to be sent. The data for this + * frame need only be valid once draw_slice() is called for that + * portion. The receiving filter will free this reference when + * it no longer needs it. + */ +void avfilter_start_frame(AVFilterLink *link, AVFilterBufferRef *picref); + +/** + * Notifie the next filter that the current frame has finished. + * + * @param link the output link the frame was sent over + */ +void avfilter_end_frame(AVFilterLink *link); + +/** + * Send a slice to the next filter. + * + * 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 link the output link over which the frame is being sent + * @param y offset in pixels from the top of the image for this slice + * @param h height of this slice in pixels + * @param slice_dir the assumed direction for sending slices, + * from the top slice to the bottom slice if the value is 1, + * from the bottom slice to the top slice if the value is -1, + * for other values the behavior of the function is undefined. + */ +void avfilter_draw_slice(AVFilterLink *link, int y, int h, int slice_dir); + +/** + * Send a buffer of audio samples to the next filter. + * + * @param link the output link over which the audio samples are being sent + * @param samplesref a reference to the buffer of audio samples being sent. The + * receiving filter will free this reference when it no longer + * needs it or pass it on to the next filter. + */ +void avfilter_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref); + +/** Initialize the filter system. Register all builtin filters. */ +void avfilter_register_all(void); + +/** Uninitialize the filter system. Unregister all filters. */ +void avfilter_uninit(void); + +/** + * Register a filter. This is only needed if you plan to use + * avfilter_get_by_name later to lookup the AVFilter structure by name. A + * filter can still by instantiated with avfilter_open even if it is not + * registered. + * + * @param filter the filter to register + * @return 0 if the registration was succesfull, a negative value + * otherwise + */ +int avfilter_register(AVFilter *filter); + +/** + * Get a filter definition matching the given name. + * + * @param name the filter name to find + * @return the filter definition, if any matching one is registered. + * NULL if none found. + */ +AVFilter *avfilter_get_by_name(const char *name); + +/** + * If filter is NULL, returns a pointer to the first registered filter pointer, + * if filter is non-NULL, returns the next pointer after filter. + * If the returned pointer points to NULL, the last registered filter + * was already reached. + */ +AVFilter **av_filter_next(AVFilter **filter); + +/** + * Create a filter instance. + * + * @param filter_ctx put here a pointer to the created filter context + * on success, NULL on failure + * @param filter the filter to create an instance of + * @param inst_name Name to give to the new instance. Can be NULL for none. + * @return >= 0 in case of success, a negative error code otherwise + */ +int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name); + +/** + * Initialize a filter. + * + * @param filter the filter to initialize + * @param args A string of parameters to use when initializing the filter. + * The format and meaning of this string varies by filter. + * @param opaque Any extra non-string data needed by the filter. The meaning + * of this parameter varies by filter. + * @return zero on success + */ +int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque); + +/** + * Free a filter context. + * + * @param filter the filter to free + */ +void avfilter_free(AVFilterContext *filter); + +/** + * Insert a filter in the middle of an existing link. + * + * @param link the link into which the filter should be inserted + * @param filt the filter to be inserted + * @param filt_srcpad_idx the input pad on the filter to connect + * @param filt_dstpad_idx the output pad on the filter to connect + * @return zero on success + */ +int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt, + unsigned filt_srcpad_idx, unsigned filt_dstpad_idx); + +/** + * Insert a new pad. + * + * @param idx Insertion point. Pad is inserted at the end if this point + * is beyond the end of the list of pads. + * @param count Pointer to the number of pads in the list + * @param padidx_off Offset within an AVFilterLink structure to the element + * to increment when inserting a new pad causes link + * numbering to change + * @param pads Pointer to the pointer to the beginning of the list of pads + * @param links Pointer to the pointer to the beginning of the list of links + * @param newpad The new pad to add. A copy is made when adding. + */ +void avfilter_insert_pad(unsigned idx, unsigned *count, size_t padidx_off, + AVFilterPad **pads, AVFilterLink ***links, + AVFilterPad *newpad); + +/** Insert a new input pad for the filter. */ +static inline void avfilter_insert_inpad(AVFilterContext *f, unsigned index, + AVFilterPad *p) +{ + avfilter_insert_pad(index, &f->input_count, offsetof(AVFilterLink, dstpad), + &f->input_pads, &f->inputs, p); +} + +/** Insert a new output pad for the filter. */ +static inline void avfilter_insert_outpad(AVFilterContext *f, unsigned index, + AVFilterPad *p) +{ + avfilter_insert_pad(index, &f->output_count, offsetof(AVFilterLink, srcpad), + &f->output_pads, &f->outputs, p); +} + +#endif /* AVFILTER_AVFILTER_H */ diff --git a/windeps/include/libavfilter/avfiltergraph.h b/windeps/include/libavfilter/avfiltergraph.h new file mode 100644 index 0000000..1b0d242 --- /dev/null +++ b/windeps/include/libavfilter/avfiltergraph.h @@ -0,0 +1,122 @@ +/* + * Filter graphs + * copyright (c) 2007 Bobby Bingham + * + * 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 + */ + +#ifndef AVFILTER_AVFILTERGRAPH_H +#define AVFILTER_AVFILTERGRAPH_H + +#include "avfilter.h" + +typedef struct AVFilterGraph { + unsigned filter_count; + AVFilterContext **filters; + + char *scale_sws_opts; ///< sws options to use for the auto-inserted scale filters +} AVFilterGraph; + +/** + * Allocate a filter graph. + */ +AVFilterGraph *avfilter_graph_alloc(void); + +/** + * Get a filter instance with name name from graph. + * + * @return the pointer to the found filter instance or NULL if it + * cannot be found. + */ +AVFilterContext *avfilter_graph_get_filter(AVFilterGraph *graph, char *name); + +/** + * Add an existing filter instance to a filter graph. + * + * @param graphctx the filter graph + * @param filter the filter to be added + */ +int avfilter_graph_add_filter(AVFilterGraph *graphctx, AVFilterContext *filter); + +/** + * Create and add a filter instance into an existing graph. + * The filter instance is created from the filter filt and inited + * with the parameters args and opaque. + * + * In case of success put in *filt_ctx the pointer to the created + * filter instance, otherwise set *filt_ctx to NULL. + * + * @param name the instance name to give to the created filter instance + * @param graph_ctx the filter graph + * @return a negative AVERROR error code in case of failure, a non + * negative value otherwise + */ +int avfilter_graph_create_filter(AVFilterContext **filt_ctx, AVFilter *filt, + const char *name, const char *args, void *opaque, + AVFilterGraph *graph_ctx); + +/** + * Check validity and configure all the links and formats in the graph. + * + * @param graphctx the filter graph + * @param log_ctx context used for logging + * @return 0 in case of success, a negative AVERROR code otherwise + */ +int avfilter_graph_config(AVFilterGraph *graphctx, AVClass *log_ctx); + +/** + * Free a graph and destroy its links, graph may be NULL. + */ +void avfilter_graph_free(AVFilterGraph *graph); + +/** + * A linked-list of the inputs/outputs of the filter chain. + * + * This is mainly useful for avfilter_graph_parse(), since this + * function may accept a description of a graph with not connected + * input/output pads. This struct specifies, per each not connected + * pad contained in the graph, the filter context and the pad index + * required for establishing a link. + */ +typedef struct AVFilterInOut { + /** unique name for this input/output in the list */ + char *name; + + /** filter context associated to this input/output */ + AVFilterContext *filter_ctx; + + /** index of the filt_ctx pad to use for linking */ + int pad_idx; + + /** next input/input in the list, NULL if this is the last */ + struct AVFilterInOut *next; +} AVFilterInOut; + +/** + * Add a graph described by a string to a graph. + * + * @param graph the filter graph where to link the parsed graph context + * @param filters string to be parsed + * @param inputs linked list to the inputs of the graph + * @param outputs linked list to the outputs of the graph + * @return zero on success, a negative AVERROR code on error + */ +int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, + AVFilterInOut *inputs, AVFilterInOut *outputs, + AVClass *log_ctx); + +#endif /* AVFILTER_AVFILTERGRAPH_H */ diff --git a/windeps/include/libavformat/avformat.h b/windeps/include/libavformat/avformat.h new file mode 100644 index 0000000..919933f --- /dev/null +++ b/windeps/include/libavformat/avformat.h @@ -0,0 +1,1619 @@ +/* + * 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 + */ + +#ifndef AVFORMAT_AVFORMAT_H +#define AVFORMAT_AVFORMAT_H + +#define LIBAVFORMAT_VERSION_MAJOR 52 +#define LIBAVFORMAT_VERSION_MINOR 93 +#define LIBAVFORMAT_VERSION_MICRO 0 + +#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ + LIBAVFORMAT_VERSION_MINOR, \ + LIBAVFORMAT_VERSION_MICRO) +#define LIBAVFORMAT_VERSION AV_VERSION(LIBAVFORMAT_VERSION_MAJOR, \ + LIBAVFORMAT_VERSION_MINOR, \ + LIBAVFORMAT_VERSION_MICRO) +#define LIBAVFORMAT_BUILD LIBAVFORMAT_VERSION_INT + +#define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) + +/** + * Those FF_API_* defines are not part of public API. + * They may change, break or disappear at any time. + */ +#ifndef FF_API_MAX_STREAMS +#define FF_API_MAX_STREAMS (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_OLD_METADATA +#define FF_API_OLD_METADATA (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_URL_CLASS +#define FF_API_URL_CLASS (LIBAVFORMAT_VERSION_MAJOR >= 53) +#endif +#ifndef FF_API_URL_RESETBUF +#define FF_API_URL_RESETBUF (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_REGISTER_PROTOCOL +#define FF_API_REGISTER_PROTOCOL (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_GUESS_FORMAT +#define FF_API_GUESS_FORMAT (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_UDP_GET_FILE +#define FF_API_UDP_GET_FILE (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_URL_SPLIT +#define FF_API_URL_SPLIT (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_ALLOC_FORMAT_CONTEXT +#define FF_API_ALLOC_FORMAT_CONTEXT (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_PARSE_FRAME_PARAM +#define FF_API_PARSE_FRAME_PARAM (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_READ_SEEK +#define FF_API_READ_SEEK (LIBAVFORMAT_VERSION_MAJOR < 54) +#endif +#ifndef FF_API_LAVF_UNUSED +#define FF_API_LAVF_UNUSED (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_PARAMETERS_CODEC_ID +#define FF_API_PARAMETERS_CODEC_ID (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_FIRST_FORMAT +#define FF_API_FIRST_FORMAT (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_SYMVER +#define FF_API_SYMVER (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif + +/** + * I return the LIBAVFORMAT_VERSION_INT constant. You got + * a fucking problem with that, douchebag? + */ +unsigned avformat_version(void); + +/** + * Return the libavformat build-time configuration. + */ +const char *avformat_configuration(void); + +/** + * Return the libavformat license. + */ +const char *avformat_license(void); + +#include +#include /* FILE */ +#include "libavcodec/avcodec.h" + +#include "avio.h" + +struct AVFormatContext; + + +/* + * Public Metadata API. + * The metadata API allows libavformat to export metadata tags to a client + * application using a sequence of key/value pairs. Like all strings in FFmpeg, + * metadata must be stored as UTF-8 encoded Unicode. Note that metadata + * exported by demuxers isn't checked to be valid UTF-8 in most cases. + * Important concepts to keep in mind: + * 1. Keys are unique; there can never be 2 tags with the same key. This is + * also meant semantically, i.e., a demuxer should not knowingly produce + * several keys that are literally different but semantically identical. + * E.g., key=Author5, key=Author6. In this example, all authors must be + * placed in the same tag. + * 2. Metadata is flat, not hierarchical; there are no subtags. If you + * want to store, e.g., the email address of the child of producer Alice + * and actor Bob, that could have key=alice_and_bobs_childs_email_address. + * 3. Several modifiers can be applied to the tag name. This is done by + * appending a dash character ('-') and the modifier name in the order + * they appear in the list below -- e.g. foo-eng-sort, not foo-sort-eng. + * a) language -- a tag whose value is localized for a particular language + * is appended with the ISO 639-2/B 3-letter language code. + * For example: Author-ger=Michael, Author-eng=Mike + * The original/default language is in the unqualified "Author" tag. + * A demuxer should set a default if it sets any translated tag. + * b) sorting -- a modified version of a tag that should be used for + * sorting will have '-sort' appended. E.g. artist="The Beatles", + * artist-sort="Beatles, The". + * + * 4. Demuxers attempt to export metadata in a generic format, however tags + * with no generic equivalents are left as they are stored in the container. + * Follows a list of generic tag names: + * + * album -- name of the set this work belongs to + * album_artist -- main creator of the set/album, if different from artist. + * e.g. "Various Artists" for compilation albums. + * artist -- main creator of the work + * comment -- any additional description of the file. + * composer -- who composed the work, if different from artist. + * copyright -- name of copyright holder. + * creation_time-- date when the file was created, preferably in ISO 8601. + * date -- date when the work was created, preferably in ISO 8601. + * disc -- number of a subset, e.g. disc in a multi-disc collection. + * encoder -- name/settings of the software/hardware that produced the file. + * encoded_by -- person/group who created the file. + * filename -- original name of the file. + * genre -- . + * language -- main language in which the work is performed, preferably + * in ISO 639-2 format. + * performer -- artist who performed the work, if different from artist. + * E.g for "Also sprach Zarathustra", artist would be "Richard + * Strauss" and performer "London Philharmonic Orchestra". + * publisher -- name of the label/publisher. + * title -- name of the work. + * track -- number of this work in the set, can be in form current/total. + */ + +#define AV_METADATA_MATCH_CASE 1 +#define AV_METADATA_IGNORE_SUFFIX 2 +#define AV_METADATA_DONT_STRDUP_KEY 4 +#define AV_METADATA_DONT_STRDUP_VAL 8 +#define AV_METADATA_DONT_OVERWRITE 16 ///< Don't overwrite existing tags. + +typedef struct { + char *key; + char *value; +}AVMetadataTag; + +typedef struct AVMetadata AVMetadata; +#if FF_API_OLD_METADATA +typedef struct AVMetadataConv AVMetadataConv; +#endif + +/** + * Get a metadata element with matching key. + * + * @param prev Set to the previous matching element to find the next. + * If set to NULL the first matching element is returned. + * @param flags Allows case as well as suffix-insensitive comparisons. + * @return Found tag or NULL, changing key or value leads to undefined behavior. + */ +AVMetadataTag * +av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags); + +#if FF_API_OLD_METADATA +/** + * Set the given tag in *pm, overwriting an existing tag. + * + * @param pm pointer to a pointer to a metadata struct. If *pm is NULL + * a metadata struct is allocated and put in *pm. + * @param key tag key to add to *pm (will be av_strduped) + * @param value tag value to add to *pm (will be av_strduped) + * @return >= 0 on success otherwise an error code <0 + * @deprecated Use av_metadata_set2() instead. + */ +attribute_deprecated int av_metadata_set(AVMetadata **pm, const char *key, const char *value); +#endif + +/** + * Set the given tag in *pm, overwriting an existing tag. + * + * @param pm pointer to a pointer to a metadata struct. If *pm is NULL + * a metadata struct is allocated and put in *pm. + * @param key tag key to add to *pm (will be av_strduped depending on flags) + * @param value tag value to add to *pm (will be av_strduped depending on flags). + * Passing a NULL value will cause an existing tag to be deleted. + * @return >= 0 on success otherwise an error code <0 + */ +int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags); + +#if FF_API_OLD_METADATA +/** + * This function is provided for compatibility reason and currently does nothing. + */ +attribute_deprecated void av_metadata_conv(struct AVFormatContext *ctx, const AVMetadataConv *d_conv, + const AVMetadataConv *s_conv); +#endif + +/** + * Copy metadata from one AVMetadata struct into another. + * @param dst pointer to a pointer to a AVMetadata struct. If *dst is NULL, + * this function will allocate a struct for you and put it in *dst + * @param src pointer to source AVMetadata struct + * @param flags flags to use when setting metadata in *dst + * @note metadata is read using the AV_METADATA_IGNORE_SUFFIX flag + */ +void av_metadata_copy(AVMetadata **dst, AVMetadata *src, int flags); + +/** + * Free all the memory allocated for an AVMetadata struct. + */ +void av_metadata_free(AVMetadata **m); + + +/* packet functions */ + + +/** + * Allocate and read the payload of a packet and initialize its + * fields with default values. + * + * @param pkt packet + * @param size desired payload size + * @return >0 (read size) if OK, AVERROR_xxx otherwise + */ +int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size); + + +/** + * Read data and append it to the current content of the AVPacket. + * If pkt->size is 0 this is identical to av_get_packet. + * Note that this uses av_grow_packet and thus involves a realloc + * which is inefficient. Thus this function should only be used + * when there is no reasonable way to know (an upper bound of) + * the final size. + * + * @param pkt packet + * @param size amount of data to read + * @return >0 (read size) if OK, AVERROR_xxx otherwise, previous data + * will not be lost even if an error occurs. + */ +int av_append_packet(ByteIOContext *s, AVPacket *pkt, int size); + +/*************************************************/ +/* fractional numbers for exact pts handling */ + +/** + * The exact value of the fractional number is: 'val + num / den'. + * num is assumed to be 0 <= num < den. + */ +typedef struct AVFrac { + int64_t val, num, den; +} AVFrac; + +/*************************************************/ +/* input/output formats */ + +struct AVCodecTag; + +/** + * This structure contains the data a format has to probe a file. + */ +typedef struct AVProbeData { + const char *filename; + unsigned char *buf; /**< Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */ + int buf_size; /**< Size of buf except extra allocated bytes */ +} AVProbeData; + +#define AVPROBE_SCORE_MAX 100 ///< maximum score, half of that is used for file-extension-based detection +#define AVPROBE_PADDING_SIZE 32 ///< extra allocated bytes at the end of the probe buffer + +typedef struct AVFormatParameters { + AVRational time_base; + int sample_rate; + int channels; + int width; + int height; + enum PixelFormat pix_fmt; + int channel; /**< Used to select DV channel. */ + const char *standard; /**< TV standard, NTSC, PAL, SECAM */ + unsigned int mpeg2ts_raw:1; /**< Force raw MPEG-2 transport stream output, if possible. */ + unsigned int mpeg2ts_compute_pcr:1; /**< Compute exact PCR for each transport + stream packet (only meaningful if + mpeg2ts_raw is TRUE). */ + unsigned int initial_pause:1; /**< Do not begin to play the stream + immediately (RTSP only). */ + unsigned int prealloced_context:1; +#if FF_API_PARAMETERS_CODEC_ID + attribute_deprecated enum CodecID video_codec_id; + attribute_deprecated enum CodecID audio_codec_id; +#endif +} AVFormatParameters; + +//! Demuxer will use url_fopen, no opened file should be provided by the caller. +#define AVFMT_NOFILE 0x0001 +#define AVFMT_NEEDNUMBER 0x0002 /**< Needs '%d' in filename. */ +#define AVFMT_SHOW_IDS 0x0008 /**< Show format stream IDs numbers. */ +#define AVFMT_RAWPICTURE 0x0020 /**< Format wants AVPicture structure for + raw picture data. */ +#define AVFMT_GLOBALHEADER 0x0040 /**< Format wants global header. */ +#define AVFMT_NOTIMESTAMPS 0x0080 /**< Format does not need / have any timestamps. */ +#define AVFMT_GENERIC_INDEX 0x0100 /**< Use generic index building code. */ +#define AVFMT_TS_DISCONT 0x0200 /**< Format allows timestamp discontinuities. Note, muxers always require valid (monotone) timestamps */ +#define AVFMT_VARIABLE_FPS 0x0400 /**< Format allows variable fps. */ +#define AVFMT_NODIMENSIONS 0x0800 /**< Format does not need width/height */ +#define AVFMT_NOSTREAMS 0x1000 /**< Format does not require any streams */ + +typedef struct AVOutputFormat { + const char *name; + /** + * Descriptive name for the format, meant to be more human-readable + * than name. You should use the NULL_IF_CONFIG_SMALL() macro + * to define it. + */ + const char *long_name; + const char *mime_type; + const char *extensions; /**< comma-separated filename extensions */ + /** + * size of private data so that it can be allocated in the wrapper + */ + int priv_data_size; + /* output support */ + enum CodecID audio_codec; /**< default audio codec */ + enum CodecID video_codec; /**< default video codec */ + int (*write_header)(struct AVFormatContext *); + int (*write_packet)(struct AVFormatContext *, AVPacket *pkt); + int (*write_trailer)(struct AVFormatContext *); + /** + * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_GLOBALHEADER + */ + int flags; + /** + * Currently only used to set pixel format if not YUV420P. + */ + int (*set_parameters)(struct AVFormatContext *, AVFormatParameters *); + int (*interleave_packet)(struct AVFormatContext *, AVPacket *out, + AVPacket *in, int flush); + + /** + * List of supported codec_id-codec_tag pairs, ordered by "better + * choice first". The arrays are all terminated by CODEC_ID_NONE. + */ + const struct AVCodecTag * const *codec_tag; + + enum CodecID subtitle_codec; /**< default subtitle codec */ + +#if FF_API_OLD_METADATA + const AVMetadataConv *metadata_conv; +#endif + + const AVClass *priv_class; ///< AVClass for the private context + + /* private fields */ + struct AVOutputFormat *next; +} AVOutputFormat; + +typedef struct AVInputFormat { + /** + * A comma separated list of short names for the format. New names + * may be appended with a minor bump. + */ + const char *name; + + /** + * Descriptive name for the format, meant to be more human-readable + * than name. You should use the NULL_IF_CONFIG_SMALL() macro + * to define it. + */ + const char *long_name; + + /** + * Size of private data so that it can be allocated in the wrapper. + */ + int priv_data_size; + + /** + * Tell if a given file has a chance of being parsed as this format. + * The buffer provided is guaranteed to be AVPROBE_PADDING_SIZE bytes + * big so you do not have to check for that unless you need more. + */ + int (*read_probe)(AVProbeData *); + + /** + * Read the format header and initialize the AVFormatContext + * structure. Return 0 if OK. 'ap' if non-NULL contains + * additional parameters. Only used in raw format right + * now. 'av_new_stream' should be called to create new streams. + */ + int (*read_header)(struct AVFormatContext *, + AVFormatParameters *ap); + + /** + * Read one packet and put it in 'pkt'. pts and flags are also + * set. 'av_new_stream' can be called only if the flag + * AVFMTCTX_NOHEADER is used and only in the calling thread (not in a + * background thread). + * @return 0 on success, < 0 on error. + * When returning an error, pkt must not have been allocated + * or must be freed before returning + */ + int (*read_packet)(struct AVFormatContext *, AVPacket *pkt); + + /** + * Close the stream. The AVFormatContext and AVStreams are not + * freed by this function + */ + int (*read_close)(struct AVFormatContext *); + +#if FF_API_READ_SEEK + /** + * Seek to a given timestamp relative to the frames in + * stream component stream_index. + * @param stream_index Must not be -1. + * @param flags Selects which direction should be preferred if no exact + * match is available. + * @return >= 0 on success (but not necessarily the new offset) + */ + attribute_deprecated int (*read_seek)(struct AVFormatContext *, + int stream_index, int64_t timestamp, int flags); +#endif + /** + * Gets the next timestamp in stream[stream_index].time_base units. + * @return the timestamp or AV_NOPTS_VALUE if an error occurred + */ + int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index, + int64_t *pos, int64_t pos_limit); + + /** + * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER. + */ + int flags; + + /** + * If extensions are defined, then no probe is done. You should + * usually not use extension format guessing because it is not + * reliable enough + */ + const char *extensions; + + /** + * General purpose read-only value that the format can use. + */ + int value; + + /** + * Start/resume playing - only meaningful if using a network-based format + * (RTSP). + */ + int (*read_play)(struct AVFormatContext *); + + /** + * Pause playing - only meaningful if using a network-based format + * (RTSP). + */ + int (*read_pause)(struct AVFormatContext *); + + const struct AVCodecTag * const *codec_tag; + + /** + * Seek to timestamp ts. + * Seeking will be done so that the point from which all active streams + * can be presented successfully will be closest to ts and within min/max_ts. + * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL. + */ + int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); + +#if FF_API_OLD_METADATA + const AVMetadataConv *metadata_conv; +#endif + + /* private fields */ + struct AVInputFormat *next; +} AVInputFormat; + +enum AVStreamParseType { + AVSTREAM_PARSE_NONE, + AVSTREAM_PARSE_FULL, /**< full parsing and repack */ + AVSTREAM_PARSE_HEADERS, /**< Only parse headers, do not repack. */ + AVSTREAM_PARSE_TIMESTAMPS, /**< full parsing and interpolation of timestamps for frames not starting on a packet boundary */ + AVSTREAM_PARSE_FULL_ONCE, /**< full parsing and repack of the first frame only, only implemented for H.264 currently */ +}; + +typedef struct AVIndexEntry { + int64_t pos; + int64_t timestamp; +#define AVINDEX_KEYFRAME 0x0001 + int flags:2; + int size:30; //Yeah, trying to keep the size of this small to reduce memory requirements (it is 24 vs. 32 bytes due to possible 8-byte alignment). + int min_distance; /**< Minimum distance between this and the previous keyframe, used to avoid unneeded searching. */ +} AVIndexEntry; + +#define AV_DISPOSITION_DEFAULT 0x0001 +#define AV_DISPOSITION_DUB 0x0002 +#define AV_DISPOSITION_ORIGINAL 0x0004 +#define AV_DISPOSITION_COMMENT 0x0008 +#define AV_DISPOSITION_LYRICS 0x0010 +#define AV_DISPOSITION_KARAOKE 0x0020 + +/** + * Track should be used during playback by default. + * Useful for subtitle track that should be displayed + * even when user did not explicitly ask for subtitles. + */ +#define AV_DISPOSITION_FORCED 0x0040 + +/** + * Stream structure. + * 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(AVStream) must not be used outside libav*. + */ +typedef struct AVStream { + int index; /**< stream index in AVFormatContext */ + int id; /**< format-specific stream ID */ + AVCodecContext *codec; /**< codec context */ + /** + * Real base framerate of the stream. + * This is the lowest framerate with which all timestamps can be + * represented accurately (it is the least common multiple of all + * framerates in the stream). Note, this value is just a guess! + * For example, if the time base is 1/90000 and all frames have either + * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1. + */ + AVRational r_frame_rate; + void *priv_data; + + /* internal data used in av_find_stream_info() */ + int64_t first_dts; + + /** + * encoding: pts generation when outputting stream + */ + struct AVFrac pts; + + /** + * This is the fundamental unit of time (in seconds) in terms + * of which frame timestamps are represented. For fixed-fps content, + * time base should be 1/framerate and timestamp increments should be 1. + */ + AVRational time_base; + int pts_wrap_bits; /**< number of bits in pts (used for wrapping control) */ + /* ffmpeg.c private use */ + int stream_copy; /**< If set, just copy stream. */ + enum AVDiscard discard; ///< Selects which packets can be discarded at will and do not need to be demuxed. + + //FIXME move stuff to a flags field? + /** + * Quality, as it has been removed from AVCodecContext and put in AVVideoFrame. + * MN: dunno if that is the right place for it + */ + float quality; + + /** + * Decoding: pts of the first frame of the stream, in stream time base. + * Only set this if you are absolutely 100% sure that the value you set + * it to really is the pts of the first frame. + * This may be undefined (AV_NOPTS_VALUE). + * @note The ASF header does NOT contain a correct start_time the ASF + * demuxer must NOT set this. + */ + int64_t start_time; + + /** + * Decoding: duration of the stream, in stream time base. + * If a source file does not specify a duration, but does specify + * a bitrate, this value will be estimated from bitrate and file size. + */ + int64_t duration; + +#if FF_API_OLD_METADATA + attribute_deprecated char language[4]; /**< ISO 639-2/B 3-letter language code (empty string if undefined) */ +#endif + + /* av_read_frame() support */ + enum AVStreamParseType need_parsing; + struct AVCodecParserContext *parser; + + int64_t cur_dts; + int last_IP_duration; + int64_t last_IP_pts; + /* av_seek_frame() support */ + AVIndexEntry *index_entries; /**< Only used if the format does not + support seeking natively. */ + int nb_index_entries; + unsigned int index_entries_allocated_size; + + int64_t nb_frames; ///< number of frames in this stream if known or 0 + +#if FF_API_LAVF_UNUSED + attribute_deprecated int64_t unused[4+1]; +#endif + +#if FF_API_OLD_METADATA + attribute_deprecated char *filename; /**< source filename of the stream */ +#endif + + int disposition; /**< AV_DISPOSITION_* bit field */ + + AVProbeData probe_data; +#define MAX_REORDER_DELAY 16 + int64_t pts_buffer[MAX_REORDER_DELAY+1]; + + /** + * sample aspect ratio (0 if unknown) + * - encoding: Set by user. + * - decoding: Set by libavformat. + */ + AVRational sample_aspect_ratio; + + AVMetadata *metadata; + + /* Intended mostly for av_read_frame() support. Not supposed to be used by */ + /* external applications; try to use something else if at all possible. */ + const uint8_t *cur_ptr; + int cur_len; + AVPacket cur_pkt; + + // Timestamp generation support: + /** + * Timestamp corresponding to the last dts sync point. + * + * Initialized when AVCodecParserContext.dts_sync_point >= 0 and + * a DTS is received from the underlying container. Otherwise set to + * AV_NOPTS_VALUE by default. + */ + int64_t reference_dts; + + /** + * Number of packets to buffer for codec probing + * NOT PART OF PUBLIC API + */ +#define MAX_PROBE_PACKETS 2500 + int probe_packets; + + /** + * last packet in packet_buffer for this stream when muxing. + * used internally, NOT PART OF PUBLIC API, dont read or write from outside of libav* + */ + struct AVPacketList *last_in_packet_buffer; + + /** + * Average framerate + */ + AVRational avg_frame_rate; + + /** + * Number of frames that have been demuxed during av_find_stream_info() + */ + int codec_info_nb_frames; + + /** + * Stream informations used internally by av_find_stream_info() + */ +#define MAX_STD_TIMEBASES (60*12+5) + struct { + int64_t last_dts; + int64_t duration_gcd; + int duration_count; + double duration_error[MAX_STD_TIMEBASES]; + int64_t codec_info_duration; + } *info; +} AVStream; + +#define AV_PROGRAM_RUNNING 1 + +/** + * 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(AVProgram) must not be used outside libav*. + */ +typedef struct AVProgram { + int id; +#if FF_API_OLD_METADATA + attribute_deprecated char *provider_name; ///< network name for DVB streams + attribute_deprecated char *name; ///< service name for DVB streams +#endif + int flags; + enum AVDiscard discard; ///< selects which program to discard and which to feed to the caller + unsigned int *stream_index; + unsigned int nb_stream_indexes; + AVMetadata *metadata; +} AVProgram; + +#define AVFMTCTX_NOHEADER 0x0001 /**< signal that no header is present + (streams are added dynamically) */ + +typedef struct AVChapter { + int id; ///< unique ID to identify the chapter + AVRational time_base; ///< time base in which the start/end timestamps are specified + int64_t start, end; ///< chapter start/end time in time_base units +#if FF_API_OLD_METADATA + attribute_deprecated char *title; ///< chapter title +#endif + AVMetadata *metadata; +} AVChapter; + +#if FF_API_MAX_STREAMS +#define MAX_STREAMS 20 +#endif + +/** + * Format I/O 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(AVFormatContext) must not be used outside libav*. + */ +typedef struct AVFormatContext { + const AVClass *av_class; /**< Set by avformat_alloc_context. */ + /* Can only be iformat or oformat, not both at the same time. */ + struct AVInputFormat *iformat; + struct AVOutputFormat *oformat; + void *priv_data; + ByteIOContext *pb; + unsigned int nb_streams; +#if FF_API_MAX_STREAMS + AVStream *streams[MAX_STREAMS]; +#else + AVStream **streams; +#endif + char filename[1024]; /**< input or output filename */ + /* stream info */ + int64_t timestamp; +#if FF_API_OLD_METADATA + attribute_deprecated char title[512]; + attribute_deprecated char author[512]; + attribute_deprecated char copyright[512]; + attribute_deprecated char comment[512]; + attribute_deprecated char album[512]; + attribute_deprecated int year; /**< ID3 year, 0 if none */ + attribute_deprecated int track; /**< track number, 0 if none */ + attribute_deprecated char genre[32]; /**< ID3 genre */ +#endif + + int ctx_flags; /**< Format-specific flags, see AVFMTCTX_xx */ + /* private data for pts handling (do not modify directly). */ + /** + * This buffer is only needed when packets were already buffered but + * not decoded, for example to get the codec parameters in MPEG + * streams. + */ + struct AVPacketList *packet_buffer; + + /** + * Decoding: position of the first frame of the component, in + * AV_TIME_BASE fractional seconds. NEVER set this value directly: + * It is deduced from the AVStream values. + */ + int64_t start_time; + + /** + * Decoding: duration of the stream, in AV_TIME_BASE fractional + * seconds. Only set this value if you know none of the individual stream + * durations and also dont set any of them. This is deduced from the + * AVStream values if not set. + */ + int64_t duration; + + /** + * decoding: total file size, 0 if unknown + */ + int64_t file_size; + + /** + * Decoding: total stream bitrate in bit/s, 0 if not + * available. Never set it directly if the file_size and the + * duration are known as FFmpeg can compute it automatically. + */ + int bit_rate; + + /* av_read_frame() support */ + AVStream *cur_st; +#if FF_API_LAVF_UNUSED + const uint8_t *cur_ptr_deprecated; + int cur_len_deprecated; + AVPacket cur_pkt_deprecated; +#endif + + /* av_seek_frame() support */ + int64_t data_offset; /**< offset of the first packet */ + int index_built; + + int mux_rate; + unsigned int packet_size; + int preload; + int max_delay; + +#define AVFMT_NOOUTPUTLOOP -1 +#define AVFMT_INFINITEOUTPUTLOOP 0 + /** + * number of times to loop output in formats that support it + */ + int loop_output; + + int flags; +#define AVFMT_FLAG_GENPTS 0x0001 ///< Generate missing pts even if it requires parsing future frames. +#define AVFMT_FLAG_IGNIDX 0x0002 ///< Ignore index. +#define AVFMT_FLAG_NONBLOCK 0x0004 ///< Do not block when reading packets from input. +#define AVFMT_FLAG_IGNDTS 0x0008 ///< Ignore DTS on frames that contain both DTS & PTS +#define AVFMT_FLAG_NOFILLIN 0x0010 ///< Do not infer any values from other values, just return what is stored in the container +#define AVFMT_FLAG_NOPARSE 0x0020 ///< Do not use AVParsers, you also must set AVFMT_FLAG_NOFILLIN as the fillin code works on frames and no parsing -> no frames. Also seeking to frames can not work if parsing to find frame boundaries has been disabled +#define AVFMT_FLAG_RTP_HINT 0x0040 ///< Add RTP hinting to the output file + + int loop_input; + + /** + * decoding: size of data to probe; encoding: unused. + */ + unsigned int probesize; + + /** + * Maximum time (in AV_TIME_BASE units) during which the input should + * be analyzed in av_find_stream_info(). + */ + int max_analyze_duration; + + const uint8_t *key; + int keylen; + + unsigned int nb_programs; + AVProgram **programs; + + /** + * Forced video codec_id. + * Demuxing: Set by user. + */ + enum CodecID video_codec_id; + + /** + * Forced audio codec_id. + * Demuxing: Set by user. + */ + enum CodecID audio_codec_id; + + /** + * Forced subtitle codec_id. + * Demuxing: Set by user. + */ + enum CodecID subtitle_codec_id; + + /** + * Maximum amount of memory in bytes to use for the index of each stream. + * If the index exceeds this size, entries will be discarded as + * needed to maintain a smaller size. This can lead to slower or less + * accurate seeking (depends on demuxer). + * Demuxers for which a full in-memory index is mandatory will ignore + * this. + * muxing : unused + * demuxing: set by user + */ + unsigned int max_index_size; + + /** + * Maximum amount of memory in bytes to use for buffering frames + * obtained from realtime capture devices. + */ + unsigned int max_picture_buffer; + + unsigned int nb_chapters; + AVChapter **chapters; + + /** + * Flags to enable debugging. + */ + int debug; +#define FF_FDEBUG_TS 0x0001 + + /** + * Raw packets from the demuxer, prior to parsing and decoding. + * This buffer is used for buffering packets until the codec can + * be identified, as parsing cannot be done without knowing the + * codec. + */ + struct AVPacketList *raw_packet_buffer; + struct AVPacketList *raw_packet_buffer_end; + + struct AVPacketList *packet_buffer_end; + + AVMetadata *metadata; + + /** + * Remaining size available for raw_packet_buffer, in bytes. + * NOT PART OF PUBLIC API + */ +#define RAW_PACKET_BUFFER_SIZE 2500000 + int raw_packet_buffer_remaining_size; + + /** + * Start time of the stream in real world time, in microseconds + * since the unix epoch (00:00 1st January 1970). That is, pts=0 + * in the stream was captured at this real world time. + * - encoding: Set by user. + * - decoding: Unused. + */ + int64_t start_time_realtime; +} AVFormatContext; + +typedef struct AVPacketList { + AVPacket pkt; + struct AVPacketList *next; +} AVPacketList; + +#if FF_API_FIRST_FORMAT +attribute_deprecated extern AVInputFormat *first_iformat; +attribute_deprecated extern AVOutputFormat *first_oformat; +#endif + +/** + * If f is NULL, returns the first registered input format, + * if f is non-NULL, returns the next registered input format after f + * or NULL if f is the last one. + */ +AVInputFormat *av_iformat_next(AVInputFormat *f); + +/** + * If f is NULL, returns the first registered output format, + * if f is non-NULL, returns the next registered output format after f + * or NULL if f is the last one. + */ +AVOutputFormat *av_oformat_next(AVOutputFormat *f); + +enum CodecID av_guess_image2_codec(const char *filename); + +/* XXX: Use automatic init with either ELF sections or C file parser */ +/* modules. */ + +/* utils.c */ +void av_register_input_format(AVInputFormat *format); +void av_register_output_format(AVOutputFormat *format); +#if FF_API_GUESS_FORMAT +attribute_deprecated AVOutputFormat *guess_stream_format(const char *short_name, + const char *filename, + const char *mime_type); + +/** + * @deprecated Use av_guess_format() instead. + */ +attribute_deprecated AVOutputFormat *guess_format(const char *short_name, + const char *filename, + const char *mime_type); +#endif + +/** + * Return the output format in the list of registered output formats + * which best matches the provided parameters, or return NULL if + * there is no match. + * + * @param short_name if non-NULL checks if short_name matches with the + * names of the registered formats + * @param filename if non-NULL checks if filename terminates with the + * extensions of the registered formats + * @param mime_type if non-NULL checks if mime_type matches with the + * MIME type of the registered formats + */ +AVOutputFormat *av_guess_format(const char *short_name, + const char *filename, + const char *mime_type); + +/** + * Guess the codec ID based upon muxer and filename. + */ +enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name, + const char *filename, const char *mime_type, + enum AVMediaType type); + +/** + * Send a nice hexadecimal dump of a buffer to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. + * @param buf buffer + * @param size buffer size + * + * @see av_hex_dump_log, av_pkt_dump, av_pkt_dump_log + */ +void av_hex_dump(FILE *f, uint8_t *buf, int size); + +/** + * Send a nice hexadecimal dump of a buffer to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param buf buffer + * @param size buffer size + * + * @see av_hex_dump, av_pkt_dump, av_pkt_dump_log + */ +void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size); + +/** + * Send a nice dump of a packet to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. + * @param pkt packet to dump + * @param dump_payload True if the payload must be displayed, too. + */ +void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload); + +/** + * Send a nice dump of a packet to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param pkt packet to dump + * @param dump_payload True if the payload must be displayed, too. + */ +void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload); + +/** + * Initialize libavformat and register all the muxers, demuxers and + * protocols. If you do not call this function, then you can select + * exactly which formats you want to support. + * + * @see av_register_input_format() + * @see av_register_output_format() + * @see av_register_protocol() + */ +void av_register_all(void); + +/** + * Get the CodecID for the given codec tag tag. + * If no codec id is found returns CODEC_ID_NONE. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + */ +enum CodecID av_codec_get_id(const struct AVCodecTag * const *tags, unsigned int tag); + +/** + * Get the codec tag for the given codec id id. + * If no codec tag is found returns 0. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + */ +unsigned int av_codec_get_tag(const struct AVCodecTag * const *tags, enum CodecID id); + +/* media file input */ + +/** + * Find AVInputFormat based on the short name of the input format. + */ +AVInputFormat *av_find_input_format(const char *short_name); + +/** + * Guess the file format. + * + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + */ +AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened); + +/** + * Guess the file format. + * + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + * @param score_max A probe score larger that this is required to accept a + * detection, the variable is set to the actual detection + * score afterwards. + * If the score is <= AVPROBE_SCORE_MAX / 4 it is recommended + * to retry with a larger probe buffer. + */ +AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max); + +/** + * Allocate all the structures needed to read an input stream. + * This does not open the needed codecs for decoding the stream[s]. + */ +int av_open_input_stream(AVFormatContext **ic_ptr, + ByteIOContext *pb, const char *filename, + AVInputFormat *fmt, AVFormatParameters *ap); + +/** + * Open a media file as input. The codecs are not opened. Only the file + * header (if present) is read. + * + * @param ic_ptr The opened media file handle is put here. + * @param filename filename to open + * @param fmt If non-NULL, force the file format to use. + * @param buf_size optional buffer size (zero if default is OK) + * @param ap Additional parameters needed when opening the file + * (NULL if default). + * @return 0 if OK, AVERROR_xxx otherwise + */ +int av_open_input_file(AVFormatContext **ic_ptr, const char *filename, + AVInputFormat *fmt, + int buf_size, + AVFormatParameters *ap); + +#if FF_API_ALLOC_FORMAT_CONTEXT +/** + * @deprecated Use avformat_alloc_context() instead. + */ +attribute_deprecated AVFormatContext *av_alloc_format_context(void); +#endif + +/** + * Allocate an AVFormatContext. + * Can be freed with av_free() but do not forget to free everything you + * explicitly allocated as well! + */ +AVFormatContext *avformat_alloc_context(void); + +/** + * Read packets of a media file to get stream information. This + * is useful for file formats with no headers such as MPEG. This + * function also computes the real framerate in case of MPEG-2 repeat + * frame mode. + * The logical file position is not changed by this function; + * examined packets may be buffered for later processing. + * + * @param ic media file handle + * @return >=0 if OK, AVERROR_xxx on error + * @todo Let the user decide somehow what information is needed so that + * we do not waste time getting stuff the user does not need. + */ +int av_find_stream_info(AVFormatContext *ic); + +/** + * Find the "best" stream in the file. + * The best stream is determined according to various heuristics as the most + * likely to be what the user expects. + * If the decoder parameter is non-NULL, av_find_best_stream will find the + * default decoder for the stream's codec; streams for which no decoder can + * be found are ignored. + * + * @param ic media file handle + * @param type stream type: video, audio, subtitles, etc. + * @param wanted_stream_nb user-requested stream number, + * or -1 for automatic selection + * @param related_stream try to find a stream related (eg. in the same + * program) to this one, or -1 if none + * @param decoder_ret if non-NULL, returns the decoder for the + * selected stream + * @param flags flags; none are currently defined + * @return the non-negative stream number in case of success, + * AVERROR_STREAM_NOT_FOUND if no stream with the requested type + * could be found, + * AVERROR_DECODER_NOT_FOUND if streams were found but no decoder + * @note If av_find_best_stream returns successfully and decoder_ret is not + * NULL, then *decoder_ret is guaranteed to be set to a valid AVCodec. + */ +int av_find_best_stream(AVFormatContext *ic, + enum AVMediaType type, + int wanted_stream_nb, + int related_stream, + AVCodec **decoder_ret, + int flags); + +/** + * Read a transport packet from a media file. + * + * This function is obsolete and should never be used. + * Use av_read_frame() instead. + * + * @param s media file handle + * @param pkt is filled + * @return 0 if OK, AVERROR_xxx on error + */ +int av_read_packet(AVFormatContext *s, AVPacket *pkt); + +/** + * Return the next frame of a stream. + * This function returns what is stored in the file, and does not validate + * that what is there are valid frames for the decoder. It will split what is + * stored in the file into frames and return one for each call. It will not + * omit invalid data between valid frames so as to give the decoder the maximum + * information possible for decoding. + * + * The returned packet is valid + * until the next av_read_frame() or until av_close_input_file() and + * must be freed with av_free_packet. For video, the packet contains + * exactly one frame. For audio, it contains an integer number of + * frames if each frame has a known fixed size (e.g. PCM or ADPCM + * data). If the audio frames have a variable size (e.g. MPEG audio), + * then it contains one frame. + * + * pkt->pts, pkt->dts and pkt->duration are always set to correct + * values in AVStream.time_base units (and guessed if the format cannot + * provide them). pkt->pts can be AV_NOPTS_VALUE if the video format + * has B-frames, so it is better to rely on pkt->dts if you do not + * decompress the payload. + * + * @return 0 if OK, < 0 on error or end of file + */ +int av_read_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Seek to the keyframe at timestamp. + * 'timestamp' in 'stream_index'. + * @param stream_index If stream_index is (-1), a default + * stream is selected, and timestamp is automatically converted + * from AV_TIME_BASE units to the stream specific time_base. + * @param timestamp Timestamp in AVStream.time_base units + * or, if no stream is specified, in AV_TIME_BASE units. + * @param flags flags which select direction and seeking mode + * @return >= 0 on success + */ +int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, + int flags); + +/** + * Seek to timestamp ts. + * Seeking will be done so that the point from which all active streams + * can be presented successfully will be closest to ts and within min/max_ts. + * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL. + * + * If flags contain AVSEEK_FLAG_BYTE, then all timestamps are in bytes and + * are the file position (this may not be supported by all demuxers). + * If flags contain AVSEEK_FLAG_FRAME, then all timestamps are in frames + * in the stream with stream_index (this may not be supported by all demuxers). + * Otherwise all timestamps are in units of the stream selected by stream_index + * or if stream_index is -1, in AV_TIME_BASE units. + * If flags contain AVSEEK_FLAG_ANY, then non-keyframes are treated as + * keyframes (this may not be supported by all demuxers). + * + * @param stream_index index of the stream which is used as time base reference + * @param min_ts smallest acceptable timestamp + * @param ts target timestamp + * @param max_ts largest acceptable timestamp + * @param flags flags + * @return >=0 on success, error code otherwise + * + * @note This is part of the new seek API which is still under construction. + * Thus do not use this yet. It may change at any time, do not expect + * ABI compatibility yet! + */ +int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); + +/** + * Start playing a network-based stream (e.g. RTSP stream) at the + * current position. + */ +int av_read_play(AVFormatContext *s); + +/** + * Pause a network-based stream (e.g. RTSP stream). + * + * Use av_read_play() to resume it. + */ +int av_read_pause(AVFormatContext *s); + +/** + * Free a AVFormatContext allocated by av_open_input_stream. + * @param s context to free + */ +void av_close_input_stream(AVFormatContext *s); + +/** + * Close a media file (but not its codecs). + * + * @param s media file handle + */ +void av_close_input_file(AVFormatContext *s); + +/** + * Add a new stream to a media file. + * + * Can only be called in the read_header() function. If the flag + * AVFMTCTX_NOHEADER is in the format context, then new streams + * can be added in read_packet too. + * + * @param s media file handle + * @param id file-format-dependent stream ID + */ +AVStream *av_new_stream(AVFormatContext *s, int id); +AVProgram *av_new_program(AVFormatContext *s, int id); + +/** + * Add a new chapter. + * This function is NOT part of the public API + * and should ONLY be used by demuxers. + * + * @param s media file handle + * @param id unique ID for this chapter + * @param start chapter start time in time_base units + * @param end chapter end time in time_base units + * @param title chapter title + * + * @return AVChapter or NULL on error + */ +AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, + int64_t start, int64_t end, const char *title); + +/** + * Set the pts for a given stream. + * + * @param s stream + * @param pts_wrap_bits number of bits effectively used by the pts + * (used for wrap control, 33 is the value for MPEG) + * @param pts_num numerator to convert to seconds (MPEG: 1) + * @param pts_den denominator to convert to seconds (MPEG: 90000) + */ +void av_set_pts_info(AVStream *s, int pts_wrap_bits, + unsigned int pts_num, unsigned int pts_den); + +#define AVSEEK_FLAG_BACKWARD 1 ///< seek backward +#define AVSEEK_FLAG_BYTE 2 ///< seeking based on position in bytes +#define AVSEEK_FLAG_ANY 4 ///< seek to any frame, even non-keyframes +#define AVSEEK_FLAG_FRAME 8 ///< seeking based on frame number + +int av_find_default_stream_index(AVFormatContext *s); + +/** + * Get the index for a specific timestamp. + * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond + * to the timestamp which is <= the requested one, if backward + * is 0, then it will be >= + * if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise + * @return < 0 if no such timestamp could be found + */ +int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags); + +/** + * Ensure the index uses less memory than the maximum specified in + * AVFormatContext.max_index_size by discarding entries if it grows + * too large. + * This function is not part of the public API and should only be called + * by demuxers. + */ +void ff_reduce_index(AVFormatContext *s, int stream_index); + +/** + * Add an index entry into a sorted list. Update the entry if the list + * already contains it. + * + * @param timestamp timestamp in the time base of the given stream + */ +int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, + int size, int distance, int flags); + +/** + * Perform a binary search using av_index_search_timestamp() and + * AVInputFormat.read_timestamp(). + * This is not supposed to be called directly by a user application, + * but by demuxers. + * @param target_ts target timestamp in the time base of the given stream + * @param stream_index stream number + */ +int av_seek_frame_binary(AVFormatContext *s, int stream_index, + int64_t target_ts, int flags); + +/** + * Update cur_dts of all streams based on the given timestamp and AVStream. + * + * Stream ref_st unchanged, others set cur_dts in their native time base. + * Only needed for timestamp wrapping or if (dts not set and pts!=dts). + * @param timestamp new dts expressed in time_base of param ref_st + * @param ref_st reference stream giving time_base of param timestamp + */ +void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp); + +/** + * Perform a binary search using read_timestamp(). + * This is not supposed to be called directly by a user application, + * but by demuxers. + * @param target_ts target timestamp in the time base of the given stream + * @param stream_index stream number + */ +int64_t av_gen_search(AVFormatContext *s, int stream_index, + int64_t target_ts, int64_t pos_min, + int64_t pos_max, int64_t pos_limit, + int64_t ts_min, int64_t ts_max, + int flags, int64_t *ts_ret, + int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t )); + +/** + * media file output + */ +int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap); + +/** + * Split a URL string into components. + * + * The pointers to buffers for storing individual components may be null, + * in order to ignore that component. Buffers for components not found are + * set to empty strings. If the port is not found, it is set to a negative + * value. + * + * @param proto the buffer for the protocol + * @param proto_size the size of the proto buffer + * @param authorization the buffer for the authorization + * @param authorization_size the size of the authorization buffer + * @param hostname the buffer for the host name + * @param hostname_size the size of the hostname buffer + * @param port_ptr a pointer to store the port number in + * @param path the buffer for the path + * @param path_size the size of the path buffer + * @param url the URL to split + */ +void av_url_split(char *proto, int proto_size, + char *authorization, int authorization_size, + char *hostname, int hostname_size, + int *port_ptr, + char *path, int path_size, + const char *url); + +/** + * Allocate the stream private data and write the stream header to an + * output media file. + * + * @param s media file handle + * @return 0 if OK, AVERROR_xxx on error + */ +int av_write_header(AVFormatContext *s); + +/** + * Write a packet to an output media file. + * + * The packet shall contain one audio or video frame. + * The packet must be correctly interleaved according to the container + * specification, if not then av_interleaved_write_frame must be used. + * + * @param s media file handle + * @param pkt The packet, which contains the stream_index, buf/buf_size, + dts/pts, ... + * @return < 0 on error, = 0 if OK, 1 if end of stream wanted + */ +int av_write_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Write a packet to an output media file ensuring correct interleaving. + * + * The packet must contain one audio or video frame. + * If the packets are already correctly interleaved, the application should + * call av_write_frame() instead as it is slightly faster. It is also important + * to keep in mind that completely non-interleaved input will need huge amounts + * of memory to interleave with this, so it is preferable to interleave at the + * demuxer level. + * + * @param s media file handle + * @param pkt The packet, which contains the stream_index, buf/buf_size, + dts/pts, ... + * @return < 0 on error, = 0 if OK, 1 if end of stream wanted + */ +int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Interleave a packet per dts in an output media file. + * + * Packets with pkt->destruct == av_destruct_packet will be freed inside this + * function, so they cannot be used after it. Note that calling av_free_packet() + * on them is still safe. + * + * @param s media file handle + * @param out the interleaved packet will be output here + * @param pkt the input packet + * @param flush 1 if no further packets are available as input and all + * remaining packets should be output + * @return 1 if a packet was output, 0 if no packet could be output, + * < 0 if an error occurred + */ +int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, + AVPacket *pkt, int flush); + +/** + * Write the stream trailer to an output media file and free the + * file private data. + * + * May only be called after a successful call to av_write_header. + * + * @param s media file handle + * @return 0 if OK, AVERROR_xxx on error + */ +int av_write_trailer(AVFormatContext *s); + +void dump_format(AVFormatContext *ic, + int index, + const char *url, + int is_output); + +#if FF_API_PARSE_FRAME_PARAM +/** + * Parse width and height out of string str. + * @deprecated Use av_parse_video_frame_size instead. + */ +attribute_deprecated int parse_image_size(int *width_ptr, int *height_ptr, + const char *str); + +/** + * Convert framerate from a string to a fraction. + * @deprecated Use av_parse_video_frame_rate instead. + */ +attribute_deprecated int parse_frame_rate(int *frame_rate, int *frame_rate_base, + const char *arg); +#endif + +/** + * Parse datestr and return a corresponding number of microseconds. + * @param datestr String representing a date or a duration. + * - If a date the syntax is: + * @code + * now|{[{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH[:MM[:SS[.m...]]]}|{HH[MM[SS[.m...]]]}}[Z|z]} + * @endcode + * If the value is "now" it takes the current time. + * Time is local time unless Z is appended, in which case it is + * interpreted as UTC. + * If the year-month-day part is not specified it takes the current + * year-month-day. + * @return the number of microseconds since 1st of January, 1970 up to + * the time of the parsed date or INT64_MIN if datestr cannot be + * successfully parsed. + * - If a duration the syntax is: + * @code + * [-]HH[:MM[:SS[.m...]]] + * [-]S+[.m...] + * @endcode + * @return the number of microseconds contained in a time interval + * with the specified duration or INT64_MIN if datestr cannot be + * successfully parsed. + * @param duration Flag which tells how to interpret datestr, if + * not zero datestr is interpreted as a duration, otherwise as a + * date. + */ +int64_t parse_date(const char *datestr, int duration); + +/** + * Get the current time in microseconds. + */ +int64_t av_gettime(void); + +/* ffm-specific for ffserver */ +#define FFM_PACKET_SIZE 4096 +int64_t ffm_read_write_index(int fd); +int ffm_write_write_index(int fd, int64_t pos); +void ffm_set_write_index(AVFormatContext *s, int64_t pos, int64_t file_size); + +/** + * Attempt to find a specific tag in a URL. + * + * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. + * Return 1 if found. + */ +int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info); + +/** + * Return in 'buf' the path with '%d' replaced by a number. + * + * Also handles the '%0nd' format where 'n' is the total number + * of digits and '%%'. + * + * @param buf destination buffer + * @param buf_size destination buffer size + * @param path numbered sequence string + * @param number frame number + * @return 0 if OK, -1 on format error + */ +int av_get_frame_filename(char *buf, int buf_size, + const char *path, int number); + +/** + * Check whether filename actually is a numbered sequence generator. + * + * @param filename possible numbered sequence string + * @return 1 if a valid numbered sequence string, 0 otherwise + */ +int av_filename_number_test(const char *filename); + +/** + * Generate an SDP for an RTP session. + * + * @param ac array of AVFormatContexts describing the RTP streams. If the + * array is composed by only one context, such context can contain + * multiple AVStreams (one AVStream per RTP stream). Otherwise, + * all the contexts in the array (an AVCodecContext per RTP stream) + * must contain only one AVStream. + * @param n_files number of AVCodecContexts contained in ac + * @param buff buffer where the SDP will be stored (must be allocated by + * the caller) + * @param size the size of the buffer + * @return 0 if OK, AVERROR_xxx on error + */ +int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size); + +/** + * Return a positive value if the given filename has one of the given + * extensions, 0 otherwise. + * + * @param extensions a comma-separated list of filename extensions + */ +int av_match_ext(const char *filename, const char *extensions); + +#endif /* AVFORMAT_AVFORMAT_H */ diff --git a/windeps/include/libavformat/avio.h b/windeps/include/libavformat/avio.h new file mode 100644 index 0000000..e65f712 --- /dev/null +++ b/windeps/include/libavformat/avio.h @@ -0,0 +1,576 @@ +/* + * 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 + */ +#ifndef AVFORMAT_AVIO_H +#define AVFORMAT_AVIO_H + +/** + * @file + * 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. + */ + +#include + +#include "libavutil/common.h" +#include "libavutil/log.h" + +/* unbuffered I/O */ + +/** + * URL 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(URLContext) must not be used outside libav*. + */ +typedef struct URLContext { +#if FF_API_URL_CLASS + const AVClass *av_class; ///< information for av_log(). Set by url_open(). +#endif + struct URLProtocol *prot; + int flags; + int is_streamed; /**< true if streamed (no seek possible), default = false */ + int max_packet_size; /**< if non zero, the stream is packetized with this max packet size */ + void *priv_data; + char *filename; /**< specified URL */ + int is_connected; +} URLContext; + +typedef struct URLPollEntry { + URLContext *handle; + int events; + int revents; +} URLPollEntry; + +#define URL_RDONLY 0 +#define URL_WRONLY 1 +#define URL_RDWR 2 + +typedef int URLInterruptCB(void); + +/** + * Create a URLContext for accessing to the resource indicated by + * url, and open it using the URLProtocol up. + * + * @param puc pointer to the location where, in case of success, the + * function puts the pointer to the created URLContext + * @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 + */ +int url_open_protocol (URLContext **puc, struct URLProtocol *up, + const char *url, int flags); + +/** + * Create a URLContext for accessing to the resource indicated by + * url, but do not initiate the connection yet. + * + * @param puc pointer to the location where, in case of success, the + * function puts the pointer to the created URLContext + * @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 + */ +int url_alloc(URLContext **h, const char *url, int flags); + +/** + * Connect an URLContext that has been allocated by url_alloc + */ +int url_connect(URLContext *h); + +/** + * Create an URLContext for accessing to the resource indicated by + * url, and open it. + * + * @param puc pointer to the location where, in case of success, the + * function puts the pointer to the created URLContext + * @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 + */ +int url_open(URLContext **h, const char *url, int flags); + +/** + * Read up to size bytes from the resource accessed by h, and store + * the read bytes in buf. + * + * @return The number of bytes actually read, or a negative value + * corresponding to an AVERROR code in case of error. A value of zero + * indicates that it is not possible to read more from the accessed + * resource (except if the value of the size argument is also zero). + */ +int url_read(URLContext *h, unsigned char *buf, int size); + +/** + * Read as many bytes as possible (up to size), calling the + * read function multiple times if necessary. + * Will also retry if the read function returns AVERROR(EAGAIN). + * This makes special short-read handling in applications + * unnecessary, if the return value is < size then it is + * certain there was either an error or the end of file was reached. + */ +int url_read_complete(URLContext *h, unsigned char *buf, int size); + +/** + * Write size bytes from buf to the resource accessed by h. + * + * @return the number of bytes actually written, or a negative value + * corresponding to an AVERROR code in case of failure + */ +int url_write(URLContext *h, const unsigned char *buf, int size); + +/** + * 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. + */ +#define AVSEEK_SIZE 0x10000 + +/** + * Change the position that will be used by the next read/write + * operation on the resource accessed by h. + * + * @param pos specifies the new position to set + * @param whence specifies how pos should be interpreted, it must be + * one of SEEK_SET (seek from the beginning), SEEK_CUR (seek from the + * current position), SEEK_END (seek from the end), or AVSEEK_SIZE + * (return the filesize of the requested resource, pos is ignored). + * @return a negative value corresponding to an AVERROR code in case + * of failure, or the resulting file position, measured in bytes from + * the beginning of the file. You can use this feature together with + * SEEK_CUR to read the current file position. + */ +int64_t url_seek(URLContext *h, int64_t pos, int whence); + +/** + * Close the resource accessed by the URLContext h, and free the + * memory used by it. + * + * @return a negative value if an error condition occurred, 0 + * otherwise + */ +int url_close(URLContext *h); + +/** + * Return a non-zero value if the resource indicated by url + * exists, 0 otherwise. + */ +int url_exist(const char *url); + +/** + * Return the filesize of the resource accessed by h, AVERROR(ENOSYS) + * if the operation is not supported by h, or another negative value + * corresponding to an AVERROR error code in case of failure. + */ +int64_t url_filesize(URLContext *h); + +/** + * Return the file descriptor associated with this URL. For RTP, this + * will return only the RTP file descriptor, not the RTCP file descriptor. + * + * @return the file descriptor associated with this URL, or <0 on error. + */ +int url_get_file_handle(URLContext *h); + +/** + * Return the maximum packet size associated to packetized file + * handle. If the file is not packetized (stream like HTTP or file on + * disk), then 0 is returned. + * + * @param h file handle + * @return maximum packet size in bytes + */ +int url_get_max_packet_size(URLContext *h); + +/** + * Copy the filename of the resource accessed by h to buf. + * + * @param buf_size size in bytes of buf + */ +void url_get_filename(URLContext *h, char *buf, int buf_size); + +/** + * The callback is called in blocking functions to test regulary if + * asynchronous interruption is needed. AVERROR(EINTR) is returned + * in this case by the interrupted function. 'NULL' means no interrupt + * callback is given. + */ +void url_set_interrupt_cb(URLInterruptCB *interrupt_cb); + +/* not implemented */ +int url_poll(URLPollEntry *poll_table, int n, int timeout); + +/** + * Pause and resume playing - only meaningful if using a network streaming + * protocol (e.g. MMS). + * @param pause 1 for pause, 0 for resume + */ +int av_url_read_pause(URLContext *h, int pause); + +/** + * 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 + */ +int64_t av_url_read_seek(URLContext *h, int stream_index, + int64_t timestamp, int flags); + +/** + * 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. + */ +#define AVSEEK_FORCE 0x20000 + +typedef struct URLProtocol { + const char *name; + int (*url_open)(URLContext *h, const char *url, int flags); + int (*url_read)(URLContext *h, unsigned char *buf, int size); + int (*url_write)(URLContext *h, const unsigned char *buf, int size); + int64_t (*url_seek)(URLContext *h, int64_t pos, int whence); + int (*url_close)(URLContext *h); + struct URLProtocol *next; + int (*url_read_pause)(URLContext *h, int pause); + int64_t (*url_read_seek)(URLContext *h, int stream_index, + int64_t timestamp, int flags); + int (*url_get_file_handle)(URLContext *h); + int priv_data_size; + const AVClass *priv_data_class; +} URLProtocol; + +#if FF_API_REGISTER_PROTOCOL +extern URLProtocol *first_protocol; +#endif + +extern URLInterruptCB *url_interrupt_cb; + +/** + * If protocol is NULL, returns the first registered protocol, + * if protocol is non-NULL, returns the next registered protocol after protocol, + * or NULL if protocol is the last one. + */ +URLProtocol *av_protocol_next(URLProtocol *p); + +#if FF_API_REGISTER_PROTOCOL +/** + * @deprecated Use av_register_protocol() instead. + */ +attribute_deprecated int register_protocol(URLProtocol *protocol); + +/** + * @deprecated Use av_register_protocol2() instead. + */ +attribute_deprecated int av_register_protocol(URLProtocol *protocol); +#endif + +/** + * Register the URLProtocol protocol. + * + * @param size the size of the URLProtocol struct referenced + */ +int av_register_protocol2(URLProtocol *protocol, int size); + +/** + * 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(ByteIOContext) must not be used outside libav*. + */ +typedef struct { + unsigned char *buffer; + int buffer_size; + unsigned char *buf_ptr, *buf_end; + void *opaque; + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size); + int (*write_packet)(void *opaque, uint8_t *buf, int buf_size); + int64_t (*seek)(void *opaque, int64_t offset, int whence); + int64_t pos; /**< position in the file of the current buffer */ + int must_flush; /**< true if the next seek should flush */ + int eof_reached; /**< true if eof reached */ + int write_flag; /**< true if open for writing */ + int is_streamed; + int max_packet_size; + unsigned long checksum; + unsigned char *checksum_ptr; + unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size); + int error; ///< contains the error code or 0 if no error happened + int (*read_pause)(void *opaque, int pause); + int64_t (*read_seek)(void *opaque, int stream_index, + int64_t timestamp, int flags); +} ByteIOContext; + +int init_put_byte(ByteIOContext *s, + unsigned char *buffer, + int buffer_size, + int write_flag, + void *opaque, + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), + int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), + int64_t (*seek)(void *opaque, int64_t offset, int whence)); +ByteIOContext *av_alloc_put_byte( + unsigned char *buffer, + int buffer_size, + int write_flag, + void *opaque, + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), + int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), + int64_t (*seek)(void *opaque, int64_t offset, int whence)); + +void put_byte(ByteIOContext *s, int b); +void put_nbyte(ByteIOContext *s, int b, int count); +void put_buffer(ByteIOContext *s, const unsigned char *buf, int size); +void put_le64(ByteIOContext *s, uint64_t val); +void put_be64(ByteIOContext *s, uint64_t val); +void put_le32(ByteIOContext *s, unsigned int val); +void put_be32(ByteIOContext *s, unsigned int val); +void put_le24(ByteIOContext *s, unsigned int val); +void put_be24(ByteIOContext *s, unsigned int val); +void put_le16(ByteIOContext *s, unsigned int val); +void put_be16(ByteIOContext *s, unsigned int val); +void put_tag(ByteIOContext *s, const char *tag); + +void put_strz(ByteIOContext *s, const char *buf); + +/** + * fseek() equivalent for ByteIOContext. + * @return new position or AVERROR. + */ +int64_t url_fseek(ByteIOContext *s, int64_t offset, int whence); + +/** + * Skip given number of bytes forward. + * @param offset number of bytes + * @return 0 on success, <0 on error + */ +int url_fskip(ByteIOContext *s, int64_t offset); + +/** + * ftell() equivalent for ByteIOContext. + * @return position or AVERROR. + */ +int64_t url_ftell(ByteIOContext *s); + +/** + * Get the filesize. + * @return filesize or AVERROR + */ +int64_t url_fsize(ByteIOContext *s); + +/** + * feof() equivalent for ByteIOContext. + * @return non zero if and only if end of file + */ +int url_feof(ByteIOContext *s); + +int url_ferror(ByteIOContext *s); + +int av_url_read_fpause(ByteIOContext *h, int pause); +int64_t av_url_read_fseek(ByteIOContext *h, int stream_index, + int64_t timestamp, int flags); + +#define URL_EOF (-1) +/** @note return URL_EOF (-1) if EOF */ +int url_fgetc(ByteIOContext *s); + +/** @warning currently size is limited */ +#ifdef __GNUC__ +int url_fprintf(ByteIOContext *s, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3))); +#else +int url_fprintf(ByteIOContext *s, const char *fmt, ...); +#endif + +/** @note unlike fgets, the EOL character is not returned and a whole + line is parsed. return NULL if first char read was EOF */ +char *url_fgets(ByteIOContext *s, char *buf, int buf_size); + +void put_flush_packet(ByteIOContext *s); + + +/** + * Read size bytes from ByteIOContext into buf. + * @return number of bytes read or AVERROR + */ +int get_buffer(ByteIOContext *s, unsigned char *buf, int size); + +/** + * Read size bytes from ByteIOContext into buf. + * This reads at most 1 packet. If that is not enough fewer bytes will be + * returned. + * @return number of bytes read or AVERROR + */ +int get_partial_buffer(ByteIOContext *s, unsigned char *buf, int size); + +/** @note return 0 if EOF, so you cannot use it if EOF handling is + necessary */ +int get_byte(ByteIOContext *s); +unsigned int get_le24(ByteIOContext *s); +unsigned int get_le32(ByteIOContext *s); +uint64_t get_le64(ByteIOContext *s); +unsigned int get_le16(ByteIOContext *s); + +char *get_strz(ByteIOContext *s, char *buf, int maxlen); +unsigned int get_be16(ByteIOContext *s); +unsigned int get_be24(ByteIOContext *s); +unsigned int get_be32(ByteIOContext *s); +uint64_t get_be64(ByteIOContext *s); + +uint64_t ff_get_v(ByteIOContext *bc); + +static inline int url_is_streamed(ByteIOContext *s) +{ + return s->is_streamed; +} + +/** + * Create and initialize a ByteIOContext for accessing the + * resource referenced by the URLContext h. + * @note When the URLContext h has been opened in read+write mode, the + * ByteIOContext can be used only for writing. + * + * @param s Used to return the pointer to the created ByteIOContext. + * In case of failure the pointed to value is set to NULL. + * @return 0 in case of success, a negative value corresponding to an + * AVERROR code in case of failure + */ +int url_fdopen(ByteIOContext **s, URLContext *h); + +/** @warning must be called before any I/O */ +int url_setbufsize(ByteIOContext *s, int buf_size); +#if FF_API_URL_RESETBUF +/** Reset the buffer for reading or writing. + * @note Will drop any data currently in the buffer without transmitting it. + * @param flags URL_RDONLY to set up the buffer for reading, or URL_WRONLY + * to set up the buffer for writing. */ +int url_resetbuf(ByteIOContext *s, int flags); +#endif + +/** + * Rewind the ByteIOContext using the specified buffer containing the first buf_size bytes of the file. + * Used after probing to avoid seeking. + * Joins buf and s->buffer, taking any overlap into consideration. + * @note s->buffer must overlap with buf or they can't be joined and the function fails + * @note This function is NOT part of the public API + * + * @param s The read-only ByteIOContext to rewind + * @param buf The probe buffer containing the first buf_size bytes of the file + * @param buf_size The size of buf + * @return 0 in case of success, a negative value corresponding to an + * AVERROR code in case of failure + */ +int ff_rewind_with_probe_data(ByteIOContext *s, unsigned char *buf, int buf_size); + +/** + * Create and initialize a ByteIOContext for accessing the + * resource indicated by url. + * @note When the resource indicated by url has been opened in + * read+write mode, the ByteIOContext can be used only for writing. + * + * @param s Used to return the pointer to the created ByteIOContext. + * 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 + */ +int url_fopen(ByteIOContext **s, const char *url, int flags); + +int url_fclose(ByteIOContext *s); +URLContext *url_fileno(ByteIOContext *s); + +/** + * Return the maximum packet size associated to packetized buffered file + * handle. If the file is not packetized (stream like http or file on + * disk), then 0 is returned. + * + * @param s buffered file handle + * @return maximum packet size in bytes + */ +int url_fget_max_packet_size(ByteIOContext *s); + +int url_open_buf(ByteIOContext **s, uint8_t *buf, int buf_size, int flags); + +/** return the written or read size */ +int url_close_buf(ByteIOContext *s); + +/** + * Open a write only memory stream. + * + * @param s new IO context + * @return zero if no error. + */ +int url_open_dyn_buf(ByteIOContext **s); + +/** + * Open a write only packetized memory stream with a maximum packet + * size of 'max_packet_size'. The stream is stored in a memory buffer + * with a big endian 4 byte header giving the packet size in bytes. + * + * @param s new IO context + * @param max_packet_size maximum packet size (must be > 0) + * @return zero if no error. + */ +int url_open_dyn_packet_buf(ByteIOContext **s, int max_packet_size); + +/** + * Return the written size and a pointer to the buffer. The buffer + * must be freed with av_free(). If the buffer is opened with + * url_open_dyn_buf, then padding of FF_INPUT_BUFFER_PADDING_SIZE is + * added; if opened with url_open_dyn_packet_buf, no padding is added. + * + * @param s IO context + * @param pbuffer pointer to a byte buffer + * @return the length of the byte buffer + */ +int url_close_dyn_buf(ByteIOContext *s, uint8_t **pbuffer); + +unsigned long ff_crc04C11DB7_update(unsigned long checksum, const uint8_t *buf, + unsigned int len); +unsigned long get_checksum(ByteIOContext *s); +void init_checksum(ByteIOContext *s, + unsigned long (*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len), + unsigned long checksum); + +/* udp.c */ +int udp_set_remote_url(URLContext *h, const char *uri); +int udp_get_local_port(URLContext *h); +#if FF_API_UDP_GET_FILE +int udp_get_file_handle(URLContext *h); +#endif + +#endif /* AVFORMAT_AVIO_H */ diff --git a/windeps/include/libavutil/adler32.h b/windeps/include/libavutil/adler32.h new file mode 100644 index 0000000..0b890bc --- /dev/null +++ b/windeps/include/libavutil/adler32.h @@ -0,0 +1,42 @@ +/* + * copyright (c) 2006 Mans Rullgard + * + * 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 + */ + +#ifndef AVUTIL_ADLER32_H +#define AVUTIL_ADLER32_H + +#include +#include "attributes.h" + +/** + * Calculate the Adler32 checksum of a buffer. + * + * Passing the return value to a subsequent av_adler32_update() call + * allows the checksum of multiple buffers to be calculated as though + * they were concatenated. + * + * @param adler initial checksum value + * @param buf pointer to input buffer + * @param len size of input buffer + * @return updated checksum + */ +unsigned long av_adler32_update(unsigned long adler, const uint8_t *buf, + unsigned int len) av_pure; + +#endif /* AVUTIL_ADLER32_H */ diff --git a/windeps/include/libavutil/attributes.h b/windeps/include/libavutil/attributes.h new file mode 100644 index 0000000..d93f460 --- /dev/null +++ b/windeps/include/libavutil/attributes.h @@ -0,0 +1,121 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +/** + * @file + * Macro definitions for various function/variable attributes + */ + +#ifndef AVUTIL_ATTRIBUTES_H +#define AVUTIL_ATTRIBUTES_H + +#ifdef __GNUC__ +# define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > x || __GNUC__ == x && __GNUC_MINOR__ >= y) +#else +# define AV_GCC_VERSION_AT_LEAST(x,y) 0 +#endif + +#ifndef av_always_inline +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_always_inline __attribute__((always_inline)) inline +#else +# define av_always_inline inline +#endif +#endif + +#ifndef av_noinline +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_noinline __attribute__((noinline)) +#else +# define av_noinline +#endif +#endif + +#ifndef av_pure +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_pure __attribute__((pure)) +#else +# define av_pure +#endif +#endif + +#ifndef av_const +#if AV_GCC_VERSION_AT_LEAST(2,6) +# define av_const __attribute__((const)) +#else +# define av_const +#endif +#endif + +#ifndef av_cold +#if (!defined(__ICC) || __ICC > 1110) && AV_GCC_VERSION_AT_LEAST(4,3) +# define av_cold __attribute__((cold)) +#else +# define av_cold +#endif +#endif + +#ifndef av_flatten +#if (!defined(__ICC) || __ICC > 1110) && AV_GCC_VERSION_AT_LEAST(4,1) +# define av_flatten __attribute__((flatten)) +#else +# define av_flatten +#endif +#endif + +#ifndef attribute_deprecated +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define attribute_deprecated __attribute__((deprecated)) +#else +# define attribute_deprecated +#endif +#endif + +#ifndef av_unused +#if defined(__GNUC__) +# define av_unused __attribute__((unused)) +#else +# define av_unused +#endif +#endif + +#ifndef av_alias +#if (!defined(__ICC) || __ICC > 1200) && AV_GCC_VERSION_AT_LEAST(3,3) +# define av_alias __attribute__((may_alias)) +#else +# define av_alias +#endif +#endif + +#ifndef av_uninit +#if defined(__GNUC__) && !defined(__ICC) +# define av_uninit(x) x=x +#else +# define av_uninit(x) x +#endif +#endif + +#ifdef __GNUC__ +# define av_builtin_constant_p __builtin_constant_p +#else +# define av_builtin_constant_p(x) 0 +#endif + +#endif /* AVUTIL_ATTRIBUTES_H */ diff --git a/windeps/include/libavutil/avassert.h b/windeps/include/libavutil/avassert.h new file mode 100644 index 0000000..8dd4878 --- /dev/null +++ b/windeps/include/libavutil/avassert.h @@ -0,0 +1,66 @@ +/* + * copyright (c) 2010 Michael Niedermayer + * + * 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 + */ + +/** + * @file + * simple assert() macros that are a bit more flexible than ISO C assert(). + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_AVASSERT_H +#define AVUTIL_AVASSERT_H + +#include +#include "avutil.h" +#include "log.h" + +/** + * assert() equivalent, that is always enabled. + */ +#define av_assert0(cond) do { \ + if (!(cond)) { \ + av_log(NULL, AV_LOG_FATAL, "Assertion %s failed at %s:%d\n", \ + AV_STRINGIFY(cond), __FILE__, __LINE__); \ + abort(); \ + } \ +} while (0) + + +/** + * assert() equivalent, that does not lie in speed critical code. + * These asserts() thus can be enabled without fearing speedloss. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 0 +#define av_assert1(cond) av_assert0(cond) +#else +#define av_assert1(cond) ((void)0) +#endif + + +/** + * assert() equivalent, that does lie in speed critical code. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1 +#define av_assert2(cond) av_assert0(cond) +#else +#define av_assert2(cond) ((void)0) +#endif + +#endif diff --git a/windeps/include/libavutil/avconfig.h b/windeps/include/libavutil/avconfig.h new file mode 100644 index 0000000..f10aa61 --- /dev/null +++ b/windeps/include/libavutil/avconfig.h @@ -0,0 +1,6 @@ +/* Generated by ffconf */ +#ifndef AVUTIL_AVCONFIG_H +#define AVUTIL_AVCONFIG_H +#define AV_HAVE_BIGENDIAN 0 +#define AV_HAVE_FAST_UNALIGNED 1 +#endif /* AVUTIL_AVCONFIG_H */ diff --git a/windeps/include/libavutil/avstring.h b/windeps/include/libavutil/avstring.h new file mode 100644 index 0000000..04d1197 --- /dev/null +++ b/windeps/include/libavutil/avstring.h @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2007 Mans Rullgard + * + * 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 + */ + +#ifndef AVUTIL_AVSTRING_H +#define AVUTIL_AVSTRING_H + +#include + +/** + * Return non-zero if pfx is a prefix of str. If it is, *ptr is set to + * the address of the first character in str after the prefix. + * + * @param str input string + * @param pfx prefix to test + * @param ptr updated if the prefix is matched inside str + * @return non-zero if the prefix matches, zero otherwise + */ +int av_strstart(const char *str, const char *pfx, const char **ptr); + +/** + * Return non-zero if pfx is a prefix of str independent of case. If + * it is, *ptr is set to the address of the first character in str + * after the prefix. + * + * @param str input string + * @param pfx prefix to test + * @param ptr updated if the prefix is matched inside str + * @return non-zero if the prefix matches, zero otherwise + */ +int av_stristart(const char *str, const char *pfx, const char **ptr); + +/** + * Locate the first case-independent occurrence in the string haystack + * of the string needle. A zero-length string needle is considered to + * match at the start of haystack. + * + * This function is a case-insensitive version of the standard strstr(). + * + * @param haystack string to search in + * @param needle string to search for + * @return pointer to the located match within haystack + * or a null pointer if no match + */ +char *av_stristr(const char *haystack, const char *needle); + +/** + * Copy the string src to dst, but no more than size - 1 bytes, and + * null-terminate dst. + * + * This function is the same as BSD strlcpy(). + * + * @param dst destination buffer + * @param src source string + * @param size size of destination buffer + * @return the length of src + * + * WARNING: since the return value is the length of src, src absolutely + * _must_ be a properly 0-terminated string, otherwise this will read beyond + * the end of the buffer and possibly crash. + */ +size_t av_strlcpy(char *dst, const char *src, size_t size); + +/** + * Append the string src to the string dst, but to a total length of + * no more than size - 1 bytes, and null-terminate dst. + * + * This function is similar to BSD strlcat(), but differs when + * size <= strlen(dst). + * + * @param dst destination buffer + * @param src source string + * @param size size of destination buffer + * @return the total length of src and dst + * + * WARNING: since the return value use the length of src and dst, these absolutely + * _must_ be a properly 0-terminated strings, otherwise this will read beyond + * the end of the buffer and possibly crash. + */ +size_t av_strlcat(char *dst, const char *src, size_t size); + +/** + * Append output to a string, according to a format. Never write out of + * the destination buffer, and always put a terminating 0 within + * the buffer. + * @param dst destination buffer (string to which the output is + * appended) + * @param size total size of the destination buffer + * @param fmt printf-compatible format string, specifying how the + * following parameters are used + * @return the length of the string that would have been generated + * if enough space had been available + */ +size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...); + +/** + * Convert a number to a av_malloced string. + */ +char *av_d2str(double d); + +/** + * Unescape the given string until a non escaped terminating char, + * and return the token corresponding to the unescaped string. + * + * The normal \ and ' escaping is supported. Leading and trailing + * whitespaces are removed, unless they are escaped with '\' or are + * enclosed between ''. + * + * @param buf the buffer to parse, buf will be updated to point to the + * terminating char + * @param term a 0-terminated list of terminating chars + * @return the malloced unescaped string, which must be av_freed by + * the user, NULL in case of allocation failure + */ +char *av_get_token(const char **buf, const char *term); + +#endif /* AVUTIL_AVSTRING_H */ diff --git a/windeps/include/libavutil/avutil.h b/windeps/include/libavutil/avutil.h new file mode 100644 index 0000000..74c2b5e --- /dev/null +++ b/windeps/include/libavutil/avutil.h @@ -0,0 +1,104 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_AVUTIL_H +#define AVUTIL_AVUTIL_H + +/** + * @file + * external API header + */ + + +#define AV_STRINGIFY(s) AV_TOSTRING(s) +#define AV_TOSTRING(s) #s + +#define AV_GLUE(a, b) a ## b +#define AV_JOIN(a, b) AV_GLUE(a, b) + +#define AV_PRAGMA(s) _Pragma(#s) + +#define AV_VERSION_INT(a, b, c) (a<<16 | b<<8 | c) +#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c +#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) + +#define LIBAVUTIL_VERSION_MAJOR 50 +#define LIBAVUTIL_VERSION_MINOR 36 +#define LIBAVUTIL_VERSION_MICRO 0 + +#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ + LIBAVUTIL_VERSION_MINOR, \ + LIBAVUTIL_VERSION_MICRO) +#define LIBAVUTIL_VERSION AV_VERSION(LIBAVUTIL_VERSION_MAJOR, \ + LIBAVUTIL_VERSION_MINOR, \ + LIBAVUTIL_VERSION_MICRO) +#define LIBAVUTIL_BUILD LIBAVUTIL_VERSION_INT + +#define LIBAVUTIL_IDENT "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION) + +/** + * Those FF_API_* defines are not part of public API. + * They may change, break or disappear at any time. + */ +#ifndef FF_API_OLD_EVAL_NAMES +#define FF_API_OLD_EVAL_NAMES (LIBAVUTIL_VERSION_MAJOR < 51) +#endif + +/** + * Return the LIBAVUTIL_VERSION_INT constant. + */ +unsigned avutil_version(void); + +/** + * Return the libavutil build-time configuration. + */ +const char *avutil_configuration(void); + +/** + * Return the libavutil license. + */ +const char *avutil_license(void); + +enum AVMediaType { + AVMEDIA_TYPE_UNKNOWN = -1, + AVMEDIA_TYPE_VIDEO, + AVMEDIA_TYPE_AUDIO, + AVMEDIA_TYPE_DATA, + AVMEDIA_TYPE_SUBTITLE, + AVMEDIA_TYPE_ATTACHMENT, + AVMEDIA_TYPE_NB +}; + +#define FF_LAMBDA_SHIFT 7 +#define FF_LAMBDA_SCALE (1< + +/** + * Decode a base64-encoded string. + * + * @param out buffer for decoded data + * @param in null-terminated input string + * @param out_size size in bytes of the out buffer, must be at + * least 3/4 of the length of in + * @return number of bytes written, or a negative value in case of + * invalid input + */ +int av_base64_decode(uint8_t *out, const char *in, int out_size); + +/** + * Encode data to base64 and null-terminate. + * + * @param out buffer for encoded data + * @param out_size size in bytes of the output buffer, must be at + * least AV_BASE64_SIZE(in_size) + * @param in_size size in bytes of the 'in' buffer + * @return 'out' or NULL in case of error + */ +char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size); + +/** + * Calculate the output size needed to base64-encode x bytes. + */ +#define AV_BASE64_SIZE(x) (((x)+2) / 3 * 4 + 1) + +#endif /* AVUTIL_BASE64_H */ diff --git a/windeps/include/libavutil/bswap.h b/windeps/include/libavutil/bswap.h new file mode 100644 index 0000000..303bcf3 --- /dev/null +++ b/windeps/include/libavutil/bswap.h @@ -0,0 +1,124 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +/** + * @file + * byte swapping routines + */ + +#ifndef AVUTIL_BSWAP_H +#define AVUTIL_BSWAP_H + +#include +#include "libavutil/avconfig.h" +#include "attributes.h" + +#ifdef HAVE_AV_CONFIG_H + +#include "config.h" + +#if ARCH_ARM +# include "arm/bswap.h" +#elif ARCH_AVR32 +# include "avr32/bswap.h" +#elif ARCH_BFIN +# include "bfin/bswap.h" +#elif ARCH_SH4 +# include "sh4/bswap.h" +#elif ARCH_X86 +# include "x86/bswap.h" +#endif + +#endif /* HAVE_AV_CONFIG_H */ + +#define AV_BSWAP16C(x) (((x) << 8 & 0xff00) | ((x) >> 8 & 0x00ff)) +#define AV_BSWAP32C(x) (AV_BSWAP16C(x) << 16 | AV_BSWAP16C((x) >> 16)) +#define AV_BSWAP64C(x) (AV_BSWAP32C(x) << 32 | AV_BSWAP32C((x) >> 32)) + +#define AV_BSWAPC(s, x) AV_BSWAP##s##C(x) + +#ifndef av_bswap16 +static av_always_inline av_const uint16_t av_bswap16(uint16_t x) +{ + x= (x>>8) | (x<<8); + return x; +} +#endif + +#ifndef av_bswap32 +static av_always_inline av_const uint32_t av_bswap32(uint32_t x) +{ + x= ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF); + x= (x>>16) | (x<<16); + return x; +} +#endif + +#ifndef av_bswap64 +static inline uint64_t av_const av_bswap64(uint64_t x) +{ +#if 0 + x= ((x<< 8)&0xFF00FF00FF00FF00ULL) | ((x>> 8)&0x00FF00FF00FF00FFULL); + x= ((x<<16)&0xFFFF0000FFFF0000ULL) | ((x>>16)&0x0000FFFF0000FFFFULL); + return (x>>32) | (x<<32); +#else + union { + uint64_t ll; + uint32_t l[2]; + } w, r; + w.ll = x; + r.l[0] = av_bswap32 (w.l[1]); + r.l[1] = av_bswap32 (w.l[0]); + return r.ll; +#endif +} +#endif + +// be2ne ... big-endian to native-endian +// le2ne ... little-endian to native-endian + +#if AV_HAVE_BIGENDIAN +#define av_be2ne16(x) (x) +#define av_be2ne32(x) (x) +#define av_be2ne64(x) (x) +#define av_le2ne16(x) av_bswap16(x) +#define av_le2ne32(x) av_bswap32(x) +#define av_le2ne64(x) av_bswap64(x) +#define AV_BE2NEC(s, x) (x) +#define AV_LE2NEC(s, x) AV_BSWAPC(s, x) +#else +#define av_be2ne16(x) av_bswap16(x) +#define av_be2ne32(x) av_bswap32(x) +#define av_be2ne64(x) av_bswap64(x) +#define av_le2ne16(x) (x) +#define av_le2ne32(x) (x) +#define av_le2ne64(x) (x) +#define AV_BE2NEC(s, x) AV_BSWAPC(s, x) +#define AV_LE2NEC(s, x) (x) +#endif + +#define AV_BE2NE16C(x) AV_BE2NEC(16, x) +#define AV_BE2NE32C(x) AV_BE2NEC(32, x) +#define AV_BE2NE64C(x) AV_BE2NEC(64, x) +#define AV_LE2NE16C(x) AV_LE2NEC(16, x) +#define AV_LE2NE32C(x) AV_LE2NEC(32, x) +#define AV_LE2NE64C(x) AV_LE2NEC(64, x) + +#endif /* AVUTIL_BSWAP_H */ diff --git a/windeps/include/libavutil/common.h b/windeps/include/libavutil/common.h new file mode 100644 index 0000000..6404076 --- /dev/null +++ b/windeps/include/libavutil/common.h @@ -0,0 +1,370 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +/** + * @file + * common internal and external API header + */ + +#ifndef AVUTIL_COMMON_H +#define AVUTIL_COMMON_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "attributes.h" +#include "libavutil/avconfig.h" + +#if AV_HAVE_BIGENDIAN +# define AV_NE(be, le) (be) +#else +# define AV_NE(be, le) (le) +#endif + +//rounded division & shift +#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b)) +/* assume b>0 */ +#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) +#define FFABS(a) ((a) >= 0 ? (a) : (-(a))) +#define FFSIGN(a) ((a) > 0 ? 1 : -1) + +#define FFMAX(a,b) ((a) > (b) ? (a) : (b)) +#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c) +#define FFMIN(a,b) ((a) > (b) ? (b) : (a)) +#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c) + +#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0) +#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0])) +#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1)) + +/* misc math functions */ +extern const uint8_t ff_log2_tab[256]; + +extern const uint8_t av_reverse[256]; + +static inline av_const int av_log2_c(unsigned int v) +{ + int n = 0; + if (v & 0xffff0000) { + v >>= 16; + n += 16; + } + if (v & 0xff00) { + v >>= 8; + n += 8; + } + n += ff_log2_tab[v]; + + return n; +} + +static inline av_const int av_log2_16bit_c(unsigned int v) +{ + int n = 0; + if (v & 0xff00) { + v >>= 8; + n += 8; + } + n += ff_log2_tab[v]; + + return n; +} + +#ifdef HAVE_AV_CONFIG_H +# include "config.h" +# include "intmath.h" +#endif + +/* Pull in unguarded fallback defines at the end of this file. */ +#include "common.h" + +/** + * Clip a signed integer value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static inline av_const int av_clip_c(int a, int amin, int amax) +{ + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a signed integer value into the 0-255 range. + * @param a value to clip + * @return clipped value + */ +static inline av_const uint8_t av_clip_uint8_c(int a) +{ + if (a&(~0xFF)) return (-a)>>31; + else return a; +} + +/** + * Clip a signed integer value into the -128,127 range. + * @param a value to clip + * @return clipped value + */ +static inline av_const int8_t av_clip_int8_c(int a) +{ + if ((a+0x80) & ~0xFF) return (a>>31) ^ 0x7F; + else return a; +} + +/** + * Clip a signed integer value into the 0-65535 range. + * @param a value to clip + * @return clipped value + */ +static inline av_const uint16_t av_clip_uint16_c(int a) +{ + if (a&(~0xFFFF)) return (-a)>>31; + else return a; +} + +/** + * Clip a signed integer value into the -32768,32767 range. + * @param a value to clip + * @return clipped value + */ +static inline av_const int16_t av_clip_int16_c(int a) +{ + if ((a+0x8000) & ~0xFFFF) return (a>>31) ^ 0x7FFF; + else return a; +} + +/** + * Clip a signed 64-bit integer value into the -2147483648,2147483647 range. + * @param a value to clip + * @return clipped value + */ +static inline av_const int32_t av_clipl_int32_c(int64_t a) +{ + if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (a>>63) ^ 0x7FFFFFFF; + else return a; +} + +/** + * Clip a float value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static inline av_const float av_clipf_c(float a, float amin, float amax) +{ + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** Compute ceil(log2(x)). + * @param x value used to compute ceil(log2(x)) + * @return computed ceiling of log2(x) + */ +static inline av_const int av_ceil_log2_c(int x) +{ + return av_log2((x - 1) << 1); +} + +/** + * Count number of bits set to one in x + * @param x value to count bits of + * @return the number of bits set to one in x + */ +static inline av_const int av_popcount_c(uint32_t x) +{ + x -= (x >> 1) & 0x55555555; + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x + (x >> 4)) & 0x0F0F0F0F; + x += x >> 8; + return (x + (x >> 16)) & 0x3F; +} + +#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((d) << 24)) +#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((a) << 24)) + +/** + * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form. + * + * @param val Output value, must be an lvalue of type uint32_t. + * @param GET_BYTE Expression reading one byte from the input. + * Evaluated up to 7 times (4 for the currently + * assigned Unicode range). With a memory buffer + * input, this could be *ptr++. + * @param ERROR Expression to be evaluated on invalid input, + * typically a goto statement. + */ +#define GET_UTF8(val, GET_BYTE, ERROR)\ + val= GET_BYTE;\ + {\ + int ones= 7 - av_log2(val ^ 255);\ + if(ones==1)\ + ERROR\ + val&= 127>>ones;\ + while(--ones > 0){\ + int tmp= GET_BYTE - 128;\ + if(tmp>>6)\ + ERROR\ + val= (val<<6) + tmp;\ + }\ + } + +/** + * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form. + * + * @param val Output value, must be an lvalue of type uint32_t. + * @param GET_16BIT Expression returning two bytes of UTF-16 data converted + * to native byte order. Evaluated one or two times. + * @param ERROR Expression to be evaluated on invalid input, + * typically a goto statement. + */ +#define GET_UTF16(val, GET_16BIT, ERROR)\ + val = GET_16BIT;\ + {\ + unsigned int hi = val - 0xD800;\ + if (hi < 0x800) {\ + val = GET_16BIT - 0xDC00;\ + if (val > 0x3FFU || hi > 0x3FFU)\ + ERROR\ + val += (hi<<10) + 0x10000;\ + }\ + }\ + +/*! + * \def PUT_UTF8(val, tmp, PUT_BYTE) + * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long). + * \param val is an input-only argument and should be of type uint32_t. It holds + * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If + * val is given as a function it is executed only once. + * \param tmp is a temporary variable and should be of type uint8_t. It + * represents an intermediate value during conversion that is to be + * output by PUT_BYTE. + * \param PUT_BYTE writes the converted UTF-8 bytes to any proper destination. + * It could be a function or a statement, and uses tmp as the input byte. + * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be + * executed up to 4 times for values in the valid UTF-8 range and up to + * 7 times in the general case, depending on the length of the converted + * Unicode character. + */ +#define PUT_UTF8(val, tmp, PUT_BYTE)\ + {\ + int bytes, shift;\ + uint32_t in = val;\ + if (in < 0x80) {\ + tmp = in;\ + PUT_BYTE\ + } else {\ + bytes = (av_log2(in) + 4) / 5;\ + shift = (bytes - 1) * 6;\ + tmp = (256 - (256 >> bytes)) | (in >> shift);\ + PUT_BYTE\ + while (shift >= 6) {\ + shift -= 6;\ + tmp = 0x80 | ((in >> shift) & 0x3f);\ + PUT_BYTE\ + }\ + }\ + } + +/*! + * \def PUT_UTF16(val, tmp, PUT_16BIT) + * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes). + * \param val is an input-only argument and should be of type uint32_t. It holds + * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If + * val is given as a function it is executed only once. + * \param tmp is a temporary variable and should be of type uint16_t. It + * represents an intermediate value during conversion that is to be + * output by PUT_16BIT. + * \param PUT_16BIT writes the converted UTF-16 data to any proper destination + * in desired endianness. It could be a function or a statement, and uses tmp + * as the input byte. For example, PUT_BYTE could be "*output++ = tmp;" + * PUT_BYTE will be executed 1 or 2 times depending on input character. + */ +#define PUT_UTF16(val, tmp, PUT_16BIT)\ + {\ + uint32_t in = val;\ + if (in < 0x10000) {\ + tmp = in;\ + PUT_16BIT\ + } else {\ + tmp = 0xD800 | ((in - 0x10000) >> 10);\ + PUT_16BIT\ + tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\ + PUT_16BIT\ + }\ + }\ + + + +#include "mem.h" + +#ifdef HAVE_AV_CONFIG_H +# include "internal.h" +#endif /* HAVE_AV_CONFIG_H */ + +#endif /* AVUTIL_COMMON_H */ + +/* + * The following definitions are outside the multiple inclusion guard + * to ensure they are immediately available in intmath.h. + */ + +#ifndef av_log2 +# define av_log2 av_log2_c +#endif +#ifndef av_log2_16bit +# define av_log2_16bit av_log2_16bit_c +#endif +#ifndef av_ceil_log2 +# define av_ceil_log2 av_ceil_log2_c +#endif +#ifndef av_clip +# define av_clip av_clip_c +#endif +#ifndef av_clip_uint8 +# define av_clip_uint8 av_clip_uint8_c +#endif +#ifndef av_clip_int8 +# define av_clip_int8 av_clip_int8_c +#endif +#ifndef av_clip_uint16 +# define av_clip_uint16 av_clip_uint16_c +#endif +#ifndef av_clip_int16 +# define av_clip_int16 av_clip_int16_c +#endif +#ifndef av_clipl_int32 +# define av_clipl_int32 av_clipl_int32_c +#endif +#ifndef av_clipf +# define av_clipf av_clipf_c +#endif +#ifndef av_popcount +# define av_popcount av_popcount_c +#endif diff --git a/windeps/include/libavutil/cpu.h b/windeps/include/libavutil/cpu.h new file mode 100644 index 0000000..71cc265 --- /dev/null +++ b/windeps/include/libavutil/cpu.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2000, 2001, 2002 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 + */ + +#ifndef AVUTIL_CPU_H +#define AVUTIL_CPU_H + +#define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */ + + /* lower 16 bits - CPU features */ +#define AV_CPU_FLAG_MMX 0x0001 ///< standard MMX +#define AV_CPU_FLAG_MMX2 0x0002 ///< SSE integer functions or AMD MMX ext +#define AV_CPU_FLAG_3DNOW 0x0004 ///< AMD 3DNOW +#define AV_CPU_FLAG_SSE 0x0008 ///< SSE functions +#define AV_CPU_FLAG_SSE2 0x0010 ///< PIV SSE2 functions +#define AV_CPU_FLAG_SSE2SLOW 0x40000000 ///< SSE2 supported, but usually not faster +#define AV_CPU_FLAG_3DNOWEXT 0x0020 ///< AMD 3DNowExt +#define AV_CPU_FLAG_SSE3 0x0040 ///< Prescott SSE3 functions +#define AV_CPU_FLAG_SSE3SLOW 0x20000000 ///< SSE3 supported, but usually not faster +#define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions +#define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions +#define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions +#define AV_CPU_FLAG_IWMMXT 0x0100 ///< XScale IWMMXT +#define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard + +/** + * Return the flags which specify extensions supported by the CPU. + */ +int av_get_cpu_flags(void); + +/* The following CPU-specific functions shall not be called directly. */ +int ff_get_cpu_flags_arm(void); +int ff_get_cpu_flags_ppc(void); +int ff_get_cpu_flags_x86(void); + +#endif /* AVUTIL_CPU_H */ diff --git a/windeps/include/libavutil/crc.h b/windeps/include/libavutil/crc.h new file mode 100644 index 0000000..6c0baab --- /dev/null +++ b/windeps/include/libavutil/crc.h @@ -0,0 +1,44 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_CRC_H +#define AVUTIL_CRC_H + +#include +#include +#include "attributes.h" + +typedef uint32_t AVCRC; + +typedef enum { + AV_CRC_8_ATM, + AV_CRC_16_ANSI, + AV_CRC_16_CCITT, + AV_CRC_32_IEEE, + AV_CRC_32_IEEE_LE, /*< reversed bitorder version of AV_CRC_32_IEEE */ + AV_CRC_MAX, /*< Not part of public API! Do not use outside libavutil. */ +}AVCRCId; + +int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size); +const AVCRC *av_crc_get_table(AVCRCId crc_id); +uint32_t av_crc(const AVCRC *ctx, uint32_t start_crc, const uint8_t *buffer, size_t length) av_pure; + +#endif /* AVUTIL_CRC_H */ + diff --git a/windeps/include/libavutil/error.h b/windeps/include/libavutil/error.h new file mode 100644 index 0000000..290487f --- /dev/null +++ b/windeps/include/libavutil/error.h @@ -0,0 +1,83 @@ +/* + * 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 + */ + +/** + * @file + * error code definitions + */ + +#ifndef AVUTIL_ERROR_H +#define AVUTIL_ERROR_H + +#include +#include "avutil.h" + +/* error handling */ +#if EDOM > 0 +#define AVERROR(e) (-(e)) ///< Returns a negative error code from a POSIX error code, to return from library functions. +#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value. +#else +/* Some platforms have E* and errno already negated. */ +#define AVERROR(e) (e) +#define AVUNERROR(e) (e) +#endif + +#if LIBAVUTIL_VERSION_MAJOR < 51 +#define AVERROR_INVALIDDATA AVERROR(EINVAL) ///< Invalid data found when processing input +#define AVERROR_IO AVERROR(EIO) ///< I/O error +#define AVERROR_NOENT AVERROR(ENOENT) ///< No such file or directory +#define AVERROR_NOFMT AVERROR(EILSEQ) ///< Unknown format +#define AVERROR_NOMEM AVERROR(ENOMEM) ///< Not enough memory +#define AVERROR_NOTSUPP AVERROR(ENOSYS) ///< Operation not supported +#define AVERROR_NUMEXPECTED AVERROR(EDOM) ///< Number syntax expected in filename +#define AVERROR_UNKNOWN AVERROR(EINVAL) ///< Unknown error +#endif + +#define AVERROR_EOF AVERROR(EPIPE) ///< End of file + +#define AVERROR_PATCHWELCOME (-MKTAG('P','A','W','E')) ///< Not yet implemented in FFmpeg, patches welcome + +#if LIBAVUTIL_VERSION_MAJOR > 50 +#define AVERROR_INVALIDDATA (-MKTAG('I','N','D','A')) ///< Invalid data found when processing input +#define AVERROR_NUMEXPECTED (-MKTAG('N','U','E','X')) ///< Number syntax expected in filename +#endif + +#define AVERROR_DEMUXER_NOT_FOUND (-MKTAG(0xF8,'D','E','M')) ///< Demuxer not found +#define AVERROR_MUXER_NOT_FOUND (-MKTAG(0xF8,'M','U','X')) ///< Muxer not found +#define AVERROR_DECODER_NOT_FOUND (-MKTAG(0xF8,'D','E','C')) ///< Decoder not found +#define AVERROR_ENCODER_NOT_FOUND (-MKTAG(0xF8,'E','N','C')) ///< Encoder not found +#define AVERROR_PROTOCOL_NOT_FOUND (-MKTAG(0xF8,'P','R','O')) ///< Protocol not found +#define AVERROR_FILTER_NOT_FOUND (-MKTAG(0xF8,'F','I','L')) ///< Filter not found +#define AVERROR_BSF_NOT_FOUND (-MKTAG(0xF8,'B','S','F')) ///< Bitstream filter not found +#define AVERROR_STREAM_NOT_FOUND (-MKTAG(0xF8,'S','T','R')) ///< Stream not found + +/** + * Put a description of the AVERROR code errnum in errbuf. + * In case of failure the global variable errno is set to indicate the + * error. Even in case of failure av_strerror() will print a generic + * error message indicating the errnum provided to errbuf. + * + * @param errnum error code to describe + * @param errbuf buffer to which description is written + * @param errbuf_size the size in bytes of errbuf + * @return 0 on success, a negative value if a description for errnum + * cannot be found + */ +int av_strerror(int errnum, char *errbuf, size_t errbuf_size); + +#endif /* AVUTIL_ERROR_H */ diff --git a/windeps/include/libavutil/eval.h b/windeps/include/libavutil/eval.h new file mode 100644 index 0000000..ee378a2 --- /dev/null +++ b/windeps/include/libavutil/eval.h @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2002 Michael Niedermayer + * + * 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 + */ + +/** + * @file + * simple arithmetic expression evaluator + */ + +#ifndef AVUTIL_EVAL_H +#define AVUTIL_EVAL_H + +#include "avutil.h" + +typedef struct AVExpr AVExpr; + +/** + * Parse and evaluate an expression. + * Note, this is significantly slower than av_expr_eval(). + * + * @param res a pointer to a double where is put the result value of + * the expression, or NAN in case of error + * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" + * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} + * @param const_values a zero terminated array of values for the identifiers from const_names + * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers + * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument + * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers + * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments + * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 + * @param log_ctx parent logging context + * @return 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_expr_parse_and_eval(double *res, const char *s, + const char * const *const_names, const double *const_values, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + void *opaque, int log_offset, void *log_ctx); + +/** + * Parse an expression. + * + * @param expr a pointer where is put an AVExpr containing the parsed + * value in case of successfull parsing, or NULL otherwise. + * The pointed to AVExpr must be freed with av_expr_free() by the user + * when it is not needed anymore. + * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" + * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} + * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers + * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument + * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers + * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments + * @param log_ctx parent logging context + * @return 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_expr_parse(AVExpr **expr, const char *s, + const char * const *const_names, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + int log_offset, void *log_ctx); + +/** + * Evaluate a previously parsed expression. + * + * @param const_values a zero terminated array of values for the identifiers from av_expr_parse() const_names + * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 + * @return the value of the expression + */ +double av_expr_eval(AVExpr *e, const double *const_values, void *opaque); + +/** + * Free a parsed expression previously created with av_expr_parse(). + */ +void av_expr_free(AVExpr *e); + +#if FF_API_OLD_EVAL_NAMES +/** + * @deprecated Deprecated in favor of av_expr_parse_and_eval(). + */ +attribute_deprecated +int av_parse_and_eval_expr(double *res, const char *s, + const char * const *const_names, const double *const_values, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + void *opaque, int log_offset, void *log_ctx); + +/** + * @deprecated Deprecated in favor of av_expr_parse(). + */ +attribute_deprecated +int av_parse_expr(AVExpr **expr, const char *s, + const char * const *const_names, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + int log_offset, void *log_ctx); +/** + * @deprecated Deprecated in favor of av_expr_eval(). + */ +attribute_deprecated +double av_eval_expr(AVExpr *e, const double *const_values, void *opaque); + +/** + * @deprecated Deprecated in favor of av_expr_free(). + */ +attribute_deprecated +void av_free_expr(AVExpr *e); +#endif /* FF_API_OLD_EVAL_NAMES */ + +/** + * Parse the string in numstr and return its value as a double. If + * the string is empty, contains only whitespaces, or does not contain + * an initial substring that has the expected syntax for a + * floating-point number, no conversion is performed. In this case, + * returns a value of zero and the value returned in tail is the value + * of numstr. + * + * @param numstr a string representing a number, may contain one of + * the International System number postfixes, for example 'K', 'M', + * 'G'. If 'i' is appended after the postfix, powers of 2 are used + * instead of powers of 10. The 'B' postfix multiplies the value for + * 8, and can be appended after another postfix or used alone. This + * allows using for example 'KB', 'MiB', 'G' and 'B' as postfix. + * @param tail if non-NULL puts here the pointer to the char next + * after the last parsed character + */ +double av_strtod(const char *numstr, char **tail); + +#endif /* AVUTIL_EVAL_H */ diff --git a/windeps/include/libavutil/fifo.h b/windeps/include/libavutil/fifo.h new file mode 100644 index 0000000..999d0bf --- /dev/null +++ b/windeps/include/libavutil/fifo.h @@ -0,0 +1,116 @@ +/* + * 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 + */ + +/** + * @file + * a very simple circular buffer FIFO implementation + */ + +#ifndef AVUTIL_FIFO_H +#define AVUTIL_FIFO_H + +#include + +typedef struct AVFifoBuffer { + uint8_t *buffer; + uint8_t *rptr, *wptr, *end; + uint32_t rndx, wndx; +} AVFifoBuffer; + +/** + * Initialize an AVFifoBuffer. + * @param size of FIFO + * @return AVFifoBuffer or NULL in case of memory allocation failure + */ +AVFifoBuffer *av_fifo_alloc(unsigned int size); + +/** + * Free an AVFifoBuffer. + * @param *f AVFifoBuffer to free + */ +void av_fifo_free(AVFifoBuffer *f); + +/** + * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied. + * @param *f AVFifoBuffer to reset + */ +void av_fifo_reset(AVFifoBuffer *f); + +/** + * Return the amount of data in bytes in the AVFifoBuffer, that is the + * amount of data you can read from it. + * @param *f AVFifoBuffer to read from + * @return size + */ +int av_fifo_size(AVFifoBuffer *f); + +/** + * Return the amount of space in bytes in the AVFifoBuffer, that is the + * amount of data you can write into it. + * @param *f AVFifoBuffer to write into + * @return size + */ +int av_fifo_space(AVFifoBuffer *f); + +/** + * Feed data from an AVFifoBuffer to a user-supplied callback. + * @param *f AVFifoBuffer to read from + * @param buf_size number of bytes to read + * @param *func generic read function + * @param *dest data destination + */ +int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from a user-supplied callback to an AVFifoBuffer. + * @param *f AVFifoBuffer to write to + * @param *src data source; non-const since it may be used as a + * modifiable context by the function defined in func + * @param size number of bytes to write + * @param *func generic write function; the first parameter is src, + * the second is dest_buf, the third is dest_buf_size. + * func must return the number of bytes written to dest_buf, or <= 0 to + * indicate no more data available to write. + * If func is NULL, src is interpreted as a simple byte array for source data. + * @return the number of bytes written to the FIFO + */ +int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)); + +/** + * Resize an AVFifoBuffer. + * @param *f AVFifoBuffer to resize + * @param size new AVFifoBuffer size in bytes + * @return <0 for failure, >=0 otherwise + */ +int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size); + +/** + * Read and discard the specified amount of data from an AVFifoBuffer. + * @param *f AVFifoBuffer to read from + * @param size amount of data to read in bytes + */ +void av_fifo_drain(AVFifoBuffer *f, int size); + +static inline uint8_t av_fifo_peek(AVFifoBuffer *f, int offs) +{ + uint8_t *ptr = f->rptr + offs; + if (ptr >= f->end) + ptr -= f->end - f->buffer; + return *ptr; +} +#endif /* AVUTIL_FIFO_H */ diff --git a/windeps/include/libavutil/file.h b/windeps/include/libavutil/file.h new file mode 100644 index 0000000..f94d780 --- /dev/null +++ b/windeps/include/libavutil/file.h @@ -0,0 +1,51 @@ +/* + * 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 + */ + +#ifndef AVUTIL_FILE_H +#define AVUTIL_FILE_H + +#include "avutil.h" + +/** + * @file misc file utilities + */ + +/** + * Read the file with name filename, and put its content in a newly + * allocated buffer or map it with mmap() when available. + * In case of success set *bufptr to the read or mmapped buffer, and + * *size to the size in bytes of the buffer in *bufptr. + * The returned buffer must be released with av_file_unmap(). + * + * @param log_offset loglevel offset used for logging + * @param log_ctx context used for logging + * @return a non negative number in case of success, a negative value + * corresponding to an AVERROR error code in case of failure + */ +int av_file_map(const char *filename, uint8_t **bufptr, size_t *size, + int log_offset, void *log_ctx); + +/** + * Unmap or free the buffer bufptr created by av_file_map(). + * + * @param size size in bytes of bufptr, must be the same as returned + * by av_file_map() + */ +void av_file_unmap(uint8_t *bufptr, size_t size); + +#endif /* AVUTIL_FILE_H */ diff --git a/windeps/include/libavutil/intfloat_readwrite.h b/windeps/include/libavutil/intfloat_readwrite.h new file mode 100644 index 0000000..1b80fc6 --- /dev/null +++ b/windeps/include/libavutil/intfloat_readwrite.h @@ -0,0 +1,40 @@ +/* + * copyright (c) 2005 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_INTFLOAT_READWRITE_H +#define AVUTIL_INTFLOAT_READWRITE_H + +#include +#include "attributes.h" + +/* IEEE 80 bits extended float */ +typedef struct AVExtFloat { + uint8_t exponent[2]; + uint8_t mantissa[8]; +} AVExtFloat; + +double av_int2dbl(int64_t v) av_const; +float av_int2flt(int32_t v) av_const; +double av_ext2dbl(const AVExtFloat ext) av_const; +int64_t av_dbl2int(double d) av_const; +int32_t av_flt2int(float d) av_const; +AVExtFloat av_dbl2ext(double d) av_const; + +#endif /* AVUTIL_INTFLOAT_READWRITE_H */ diff --git a/windeps/include/libavutil/intreadwrite.h b/windeps/include/libavutil/intreadwrite.h new file mode 100644 index 0000000..1849a64 --- /dev/null +++ b/windeps/include/libavutil/intreadwrite.h @@ -0,0 +1,522 @@ +/* + * 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 + */ + +#ifndef AVUTIL_INTREADWRITE_H +#define AVUTIL_INTREADWRITE_H + +#include +#include "libavutil/avconfig.h" +#include "attributes.h" +#include "bswap.h" + +typedef union { + uint64_t u64; + uint32_t u32[2]; + uint16_t u16[4]; + uint8_t u8 [8]; + double f64; + float f32[2]; +} av_alias av_alias64; + +typedef union { + uint32_t u32; + uint16_t u16[2]; + uint8_t u8 [4]; + float f32; +} av_alias av_alias32; + +typedef union { + uint16_t u16; + uint8_t u8 [2]; +} av_alias av_alias16; + +/* + * Arch-specific headers can provide any combination of + * AV_[RW][BLN](16|24|32|64) and AV_(COPY|SWAP|ZERO)(64|128) macros. + * Preprocessor symbols must be defined, even if these are implemented + * as inline functions. + */ + +#ifdef HAVE_AV_CONFIG_H + +#include "config.h" + +#if ARCH_ARM +# include "arm/intreadwrite.h" +#elif ARCH_AVR32 +# include "avr32/intreadwrite.h" +#elif ARCH_MIPS +# include "mips/intreadwrite.h" +#elif ARCH_PPC +# include "ppc/intreadwrite.h" +#elif ARCH_TOMI +# include "tomi/intreadwrite.h" +#elif ARCH_X86 +# include "x86/intreadwrite.h" +#endif + +#endif /* HAVE_AV_CONFIG_H */ + +/* + * Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers. + */ + +#if AV_HAVE_BIGENDIAN + +# if defined(AV_RN16) && !defined(AV_RB16) +# define AV_RB16(p) AV_RN16(p) +# elif !defined(AV_RN16) && defined(AV_RB16) +# define AV_RN16(p) AV_RB16(p) +# endif + +# if defined(AV_WN16) && !defined(AV_WB16) +# define AV_WB16(p, v) AV_WN16(p, v) +# elif !defined(AV_WN16) && defined(AV_WB16) +# define AV_WN16(p, v) AV_WB16(p, v) +# endif + +# if defined(AV_RN24) && !defined(AV_RB24) +# define AV_RB24(p) AV_RN24(p) +# elif !defined(AV_RN24) && defined(AV_RB24) +# define AV_RN24(p) AV_RB24(p) +# endif + +# if defined(AV_WN24) && !defined(AV_WB24) +# define AV_WB24(p, v) AV_WN24(p, v) +# elif !defined(AV_WN24) && defined(AV_WB24) +# define AV_WN24(p, v) AV_WB24(p, v) +# endif + +# if defined(AV_RN32) && !defined(AV_RB32) +# define AV_RB32(p) AV_RN32(p) +# elif !defined(AV_RN32) && defined(AV_RB32) +# define AV_RN32(p) AV_RB32(p) +# endif + +# if defined(AV_WN32) && !defined(AV_WB32) +# define AV_WB32(p, v) AV_WN32(p, v) +# elif !defined(AV_WN32) && defined(AV_WB32) +# define AV_WN32(p, v) AV_WB32(p, v) +# endif + +# if defined(AV_RN64) && !defined(AV_RB64) +# define AV_RB64(p) AV_RN64(p) +# elif !defined(AV_RN64) && defined(AV_RB64) +# define AV_RN64(p) AV_RB64(p) +# endif + +# if defined(AV_WN64) && !defined(AV_WB64) +# define AV_WB64(p, v) AV_WN64(p, v) +# elif !defined(AV_WN64) && defined(AV_WB64) +# define AV_WN64(p, v) AV_WB64(p, v) +# endif + +#else /* AV_HAVE_BIGENDIAN */ + +# if defined(AV_RN16) && !defined(AV_RL16) +# define AV_RL16(p) AV_RN16(p) +# elif !defined(AV_RN16) && defined(AV_RL16) +# define AV_RN16(p) AV_RL16(p) +# endif + +# if defined(AV_WN16) && !defined(AV_WL16) +# define AV_WL16(p, v) AV_WN16(p, v) +# elif !defined(AV_WN16) && defined(AV_WL16) +# define AV_WN16(p, v) AV_WL16(p, v) +# endif + +# if defined(AV_RN24) && !defined(AV_RL24) +# define AV_RL24(p) AV_RN24(p) +# elif !defined(AV_RN24) && defined(AV_RL24) +# define AV_RN24(p) AV_RL24(p) +# endif + +# if defined(AV_WN24) && !defined(AV_WL24) +# define AV_WL24(p, v) AV_WN24(p, v) +# elif !defined(AV_WN24) && defined(AV_WL24) +# define AV_WN24(p, v) AV_WL24(p, v) +# endif + +# if defined(AV_RN32) && !defined(AV_RL32) +# define AV_RL32(p) AV_RN32(p) +# elif !defined(AV_RN32) && defined(AV_RL32) +# define AV_RN32(p) AV_RL32(p) +# endif + +# if defined(AV_WN32) && !defined(AV_WL32) +# define AV_WL32(p, v) AV_WN32(p, v) +# elif !defined(AV_WN32) && defined(AV_WL32) +# define AV_WN32(p, v) AV_WL32(p, v) +# endif + +# if defined(AV_RN64) && !defined(AV_RL64) +# define AV_RL64(p) AV_RN64(p) +# elif !defined(AV_RN64) && defined(AV_RL64) +# define AV_RN64(p) AV_RL64(p) +# endif + +# if defined(AV_WN64) && !defined(AV_WL64) +# define AV_WL64(p, v) AV_WN64(p, v) +# elif !defined(AV_WN64) && defined(AV_WL64) +# define AV_WN64(p, v) AV_WL64(p, v) +# endif + +#endif /* !AV_HAVE_BIGENDIAN */ + +/* + * Define AV_[RW]N helper macros to simplify definitions not provided + * by per-arch headers. + */ + +#if defined(__GNUC__) && !defined(__TI_COMPILER_VERSION__) + +union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias; +union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias; +union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; + +# define AV_RN(s, p) (((const union unaligned_##s *) (p))->l) +# define AV_WN(s, p, v) ((((union unaligned_##s *) (p))->l) = (v)) + +#elif defined(__DECC) + +# define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) +# define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v)) + +#elif AV_HAVE_FAST_UNALIGNED + +# define AV_RN(s, p) (((const av_alias##s*)(p))->u##s) +# define AV_WN(s, p, v) (((av_alias##s*)(p))->u##s = (v)) + +#else + +#ifndef AV_RB16 +# define AV_RB16(x) \ + ((((const uint8_t*)(x))[0] << 8) | \ + ((const uint8_t*)(x))[1]) +#endif +#ifndef AV_WB16 +# define AV_WB16(p, d) do { \ + ((uint8_t*)(p))[1] = (d); \ + ((uint8_t*)(p))[0] = (d)>>8; \ + } while(0) +#endif + +#ifndef AV_RL16 +# define AV_RL16(x) \ + ((((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL16 +# define AV_WL16(p, d) do { \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + } while(0) +#endif + +#ifndef AV_RB32 +# define AV_RB32(x) \ + ((((const uint8_t*)(x))[0] << 24) | \ + (((const uint8_t*)(x))[1] << 16) | \ + (((const uint8_t*)(x))[2] << 8) | \ + ((const uint8_t*)(x))[3]) +#endif +#ifndef AV_WB32 +# define AV_WB32(p, d) do { \ + ((uint8_t*)(p))[3] = (d); \ + ((uint8_t*)(p))[2] = (d)>>8; \ + ((uint8_t*)(p))[1] = (d)>>16; \ + ((uint8_t*)(p))[0] = (d)>>24; \ + } while(0) +#endif + +#ifndef AV_RL32 +# define AV_RL32(x) \ + ((((const uint8_t*)(x))[3] << 24) | \ + (((const uint8_t*)(x))[2] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL32 +# define AV_WL32(p, d) do { \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + } while(0) +#endif + +#ifndef AV_RB64 +# define AV_RB64(x) \ + (((uint64_t)((const uint8_t*)(x))[0] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[5] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 8) | \ + (uint64_t)((const uint8_t*)(x))[7]) +#endif +#ifndef AV_WB64 +# define AV_WB64(p, d) do { \ + ((uint8_t*)(p))[7] = (d); \ + ((uint8_t*)(p))[6] = (d)>>8; \ + ((uint8_t*)(p))[5] = (d)>>16; \ + ((uint8_t*)(p))[4] = (d)>>24; \ + ((uint8_t*)(p))[3] = (d)>>32; \ + ((uint8_t*)(p))[2] = (d)>>40; \ + ((uint8_t*)(p))[1] = (d)>>48; \ + ((uint8_t*)(p))[0] = (d)>>56; \ + } while(0) +#endif + +#ifndef AV_RL64 +# define AV_RL64(x) \ + (((uint64_t)((const uint8_t*)(x))[7] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[5] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ + (uint64_t)((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL64 +# define AV_WL64(p, d) do { \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + ((uint8_t*)(p))[4] = (d)>>32; \ + ((uint8_t*)(p))[5] = (d)>>40; \ + ((uint8_t*)(p))[6] = (d)>>48; \ + ((uint8_t*)(p))[7] = (d)>>56; \ + } while(0) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RN(s, p) AV_RB##s(p) +# define AV_WN(s, p, v) AV_WB##s(p, v) +#else +# define AV_RN(s, p) AV_RL##s(p) +# define AV_WN(s, p, v) AV_WL##s(p, v) +#endif + +#endif /* HAVE_FAST_UNALIGNED */ + +#ifndef AV_RN16 +# define AV_RN16(p) AV_RN(16, p) +#endif + +#ifndef AV_RN32 +# define AV_RN32(p) AV_RN(32, p) +#endif + +#ifndef AV_RN64 +# define AV_RN64(p) AV_RN(64, p) +#endif + +#ifndef AV_WN16 +# define AV_WN16(p, v) AV_WN(16, p, v) +#endif + +#ifndef AV_WN32 +# define AV_WN32(p, v) AV_WN(32, p, v) +#endif + +#ifndef AV_WN64 +# define AV_WN64(p, v) AV_WN(64, p, v) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RB(s, p) AV_RN##s(p) +# define AV_WB(s, p, v) AV_WN##s(p, v) +# define AV_RL(s, p) av_bswap##s(AV_RN##s(p)) +# define AV_WL(s, p, v) AV_WN##s(p, av_bswap##s(v)) +#else +# define AV_RB(s, p) av_bswap##s(AV_RN##s(p)) +# define AV_WB(s, p, v) AV_WN##s(p, av_bswap##s(v)) +# define AV_RL(s, p) AV_RN##s(p) +# define AV_WL(s, p, v) AV_WN##s(p, v) +#endif + +#define AV_RB8(x) (((const uint8_t*)(x))[0]) +#define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0) + +#define AV_RL8(x) AV_RB8(x) +#define AV_WL8(p, d) AV_WB8(p, d) + +#ifndef AV_RB16 +# define AV_RB16(p) AV_RB(16, p) +#endif +#ifndef AV_WB16 +# define AV_WB16(p, v) AV_WB(16, p, v) +#endif + +#ifndef AV_RL16 +# define AV_RL16(p) AV_RL(16, p) +#endif +#ifndef AV_WL16 +# define AV_WL16(p, v) AV_WL(16, p, v) +#endif + +#ifndef AV_RB32 +# define AV_RB32(p) AV_RB(32, p) +#endif +#ifndef AV_WB32 +# define AV_WB32(p, v) AV_WB(32, p, v) +#endif + +#ifndef AV_RL32 +# define AV_RL32(p) AV_RL(32, p) +#endif +#ifndef AV_WL32 +# define AV_WL32(p, v) AV_WL(32, p, v) +#endif + +#ifndef AV_RB64 +# define AV_RB64(p) AV_RB(64, p) +#endif +#ifndef AV_WB64 +# define AV_WB64(p, v) AV_WB(64, p, v) +#endif + +#ifndef AV_RL64 +# define AV_RL64(p) AV_RL(64, p) +#endif +#ifndef AV_WL64 +# define AV_WL64(p, v) AV_WL(64, p, v) +#endif + +#ifndef AV_RB24 +# define AV_RB24(x) \ + ((((const uint8_t*)(x))[0] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[2]) +#endif +#ifndef AV_WB24 +# define AV_WB24(p, d) do { \ + ((uint8_t*)(p))[2] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[0] = (d)>>16; \ + } while(0) +#endif + +#ifndef AV_RL24 +# define AV_RL24(x) \ + ((((const uint8_t*)(x))[2] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL24 +# define AV_WL24(p, d) do { \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + } while(0) +#endif + +/* + * The AV_[RW]NA macros access naturally aligned data + * in a type-safe way. + */ + +#define AV_RNA(s, p) (((const av_alias##s*)(p))->u##s) +#define AV_WNA(s, p, v) (((av_alias##s*)(p))->u##s = (v)) + +#ifndef AV_RN16A +# define AV_RN16A(p) AV_RNA(16, p) +#endif + +#ifndef AV_RN32A +# define AV_RN32A(p) AV_RNA(32, p) +#endif + +#ifndef AV_RN64A +# define AV_RN64A(p) AV_RNA(64, p) +#endif + +#ifndef AV_WN16A +# define AV_WN16A(p, v) AV_WNA(16, p, v) +#endif + +#ifndef AV_WN32A +# define AV_WN32A(p, v) AV_WNA(32, p, v) +#endif + +#ifndef AV_WN64A +# define AV_WN64A(p, v) AV_WNA(64, p, v) +#endif + +/* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be + * naturally aligned. They may be implemented using MMX, + * so emms_c() must be called before using any float code + * afterwards. + */ + +#define AV_COPY(n, d, s) \ + (((av_alias##n*)(d))->u##n = ((const av_alias##n*)(s))->u##n) + +#ifndef AV_COPY16 +# define AV_COPY16(d, s) AV_COPY(16, d, s) +#endif + +#ifndef AV_COPY32 +# define AV_COPY32(d, s) AV_COPY(32, d, s) +#endif + +#ifndef AV_COPY64 +# define AV_COPY64(d, s) AV_COPY(64, d, s) +#endif + +#ifndef AV_COPY128 +# define AV_COPY128(d, s) \ + do { \ + AV_COPY64(d, s); \ + AV_COPY64((char*)(d)+8, (char*)(s)+8); \ + } while(0) +#endif + +#define AV_SWAP(n, a, b) FFSWAP(av_alias##n, *(av_alias##n*)(a), *(av_alias##n*)(b)) + +#ifndef AV_SWAP64 +# define AV_SWAP64(a, b) AV_SWAP(64, a, b) +#endif + +#define AV_ZERO(n, d) (((av_alias##n*)(d))->u##n = 0) + +#ifndef AV_ZERO16 +# define AV_ZERO16(d) AV_ZERO(16, d) +#endif + +#ifndef AV_ZERO32 +# define AV_ZERO32(d) AV_ZERO(32, d) +#endif + +#ifndef AV_ZERO64 +# define AV_ZERO64(d) AV_ZERO(64, d) +#endif + +#ifndef AV_ZERO128 +# define AV_ZERO128(d) \ + do { \ + AV_ZERO64(d); \ + AV_ZERO64((char*)(d)+8); \ + } while(0) +#endif + +#endif /* AVUTIL_INTREADWRITE_H */ diff --git a/windeps/include/libavutil/lfg.h b/windeps/include/libavutil/lfg.h new file mode 100644 index 0000000..0e89ea3 --- /dev/null +++ b/windeps/include/libavutil/lfg.h @@ -0,0 +1,62 @@ +/* + * Lagged Fibonacci PRNG + * Copyright (c) 2008 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_LFG_H +#define AVUTIL_LFG_H + +typedef struct { + unsigned int state[64]; + int index; +} AVLFG; + +void av_lfg_init(AVLFG *c, unsigned int seed); + +/** + * Get the next random unsigned 32-bit number using an ALFG. + * + * Please also consider a simple LCG like state= state*1664525+1013904223, + * it may be good enough and faster for your specific use case. + */ +static inline unsigned int av_lfg_get(AVLFG *c){ + c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; + return c->state[c->index++ & 63]; +} + +/** + * Get the next random unsigned 32-bit number using a MLFG. + * + * Please also consider av_lfg_get() above, it is faster. + */ +static inline unsigned int av_mlfg_get(AVLFG *c){ + unsigned int a= c->state[(c->index-55) & 63]; + unsigned int b= c->state[(c->index-24) & 63]; + return c->state[c->index++ & 63] = 2*a*b+a+b; +} + +/** + * Get the next two numbers generated by a Box-Muller Gaussian + * generator using the random numbers issued by lfg. + * + * @param out[2] array where the two generated numbers are placed + */ +void av_bmg_get(AVLFG *lfg, double out[2]); + +#endif /* AVUTIL_LFG_H */ diff --git a/windeps/include/libavutil/log.h b/windeps/include/libavutil/log.h new file mode 100644 index 0000000..3b364be --- /dev/null +++ b/windeps/include/libavutil/log.h @@ -0,0 +1,149 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_LOG_H +#define AVUTIL_LOG_H + +#include +#include "avutil.h" + +/** + * Describe the class of an AVClass context structure. That is an + * arbitrary struct of which the first field is a pointer to an + * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.). + */ +typedef struct { + /** + * The name of the class; usually it is the same name as the + * context structure type to which the AVClass is associated. + */ + const char* class_name; + + /** + * A pointer to a function which returns the name of a context + * instance ctx associated with the class. + */ + const char* (*item_name)(void* ctx); + + /** + * a pointer to the first option specified in the class if any or NULL + * + * @see av_set_default_options() + */ + const struct AVOption *option; + + /** + * LIBAVUTIL_VERSION with which this structure was created. + * This is used to allow fields to be added without requiring major + * version bumps everywhere. + */ + + int version; + + /** + * Offset in the structure where log_level_offset is stored. + * 0 means there is no such variable + */ + int log_level_offset_offset; + + /** + * Offset in the structure where a pointer to the parent context for loging is stored. + * for example a decoder that uses eval.c could pass its AVCodecContext to eval as such + * parent context. And a av_log() implementation could then display the parent context + * can be NULL of course + */ + int parent_log_context_offset; +} AVClass; + +/* av_log API */ + +#define AV_LOG_QUIET -8 + +/** + * Something went really wrong and we will crash now. + */ +#define AV_LOG_PANIC 0 + +/** + * Something went wrong and recovery is not possible. + * For example, no header was found for a format which depends + * on headers or an illegal combination of parameters is used. + */ +#define AV_LOG_FATAL 8 + +/** + * Something went wrong and cannot losslessly be recovered. + * However, not all future data is affected. + */ +#define AV_LOG_ERROR 16 + +/** + * Something somehow does not look correct. This may or may not + * lead to problems. An example would be the use of '-vstrict -2'. + */ +#define AV_LOG_WARNING 24 + +#define AV_LOG_INFO 32 +#define AV_LOG_VERBOSE 40 + +/** + * Stuff which is only useful for libav* developers. + */ +#define AV_LOG_DEBUG 48 + +/** + * Send the specified message to the log if the level is less than or equal + * to the current av_log_level. By default, all logging messages are sent to + * stderr. This behavior can be altered by setting a different av_vlog callback + * function. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + * @see av_vlog + */ +#ifdef __GNUC__ +void av_log(void *avcl, int level, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 3, 4))); +#else +void av_log(void *avcl, int level, const char *fmt, ...); +#endif + +void av_vlog(void *avcl, int level, const char *fmt, va_list); +int av_log_get_level(void); +void av_log_set_level(int); +void av_log_set_callback(void (*)(void*, int, const char*, va_list)); +void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl); +const char* av_default_item_name(void* ctx); + +/** + * Skip repeated messages, this requires the user app to use av_log() instead of + * (f)printf as the 2 would otherwise interfere and lead to + * "Last message repeated x times" messages below (f)printf messages with some + * bad luck. + * Also to receive the last, "last repeated" line if any, the user app must + * call av_log(NULL, AV_LOG_QUIET, ""); at the end + */ +#define AV_LOG_SKIP_REPEATED 1 +void av_log_set_flags(int arg); + +#endif /* AVUTIL_LOG_H */ diff --git a/windeps/include/libavutil/lzo.h b/windeps/include/libavutil/lzo.h new file mode 100644 index 0000000..6788054 --- /dev/null +++ b/windeps/include/libavutil/lzo.h @@ -0,0 +1,66 @@ +/* + * LZO 1x decompression + * copyright (c) 2006 Reimar Doeffinger + * + * 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 + */ + +#ifndef AVUTIL_LZO_H +#define AVUTIL_LZO_H + +#include + +/** \defgroup errflags Error flags returned by av_lzo1x_decode + * \{ */ +//! end of the input buffer reached before decoding finished +#define AV_LZO_INPUT_DEPLETED 1 +//! decoded data did not fit into output buffer +#define AV_LZO_OUTPUT_FULL 2 +//! a reference to previously decoded data was wrong +#define AV_LZO_INVALID_BACKPTR 4 +//! a non-specific error in the compressed bitstream +#define AV_LZO_ERROR 8 +/** \} */ + +#define AV_LZO_INPUT_PADDING 8 +#define AV_LZO_OUTPUT_PADDING 12 + +/** + * \brief Decodes LZO 1x compressed data. + * \param out output buffer + * \param outlen size of output buffer, number of bytes left are returned here + * \param in input buffer + * \param inlen size of input buffer, number of bytes left are returned here + * \return 0 on success, otherwise a combination of the error flags above + * + * Make sure all buffers are appropriately padded, in must provide + * AV_LZO_INPUT_PADDING, out must provide AV_LZO_OUTPUT_PADDING additional bytes. + */ +int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen); + +/** + * \brief deliberately overlapping memcpy implementation + * \param dst destination buffer; must be padded with 12 additional bytes + * \param back how many bytes back we start (the initial size of the overlapping window) + * \param cnt number of bytes to copy, must be >= 0 + * + * cnt > back is valid, this will copy the bytes we just copied, + * thus creating a repeating pattern with a period length of back. + */ +void av_memcpy_backptr(uint8_t *dst, int back, int cnt); + +#endif /* AVUTIL_LZO_H */ diff --git a/windeps/include/libavutil/mathematics.h b/windeps/include/libavutil/mathematics.h new file mode 100644 index 0000000..882a516 --- /dev/null +++ b/windeps/include/libavutil/mathematics.h @@ -0,0 +1,112 @@ +/* + * copyright (c) 2005 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_MATHEMATICS_H +#define AVUTIL_MATHEMATICS_H + +#include +#include +#include "attributes.h" +#include "rational.h" + +#ifndef M_E +#define M_E 2.7182818284590452354 /* e */ +#endif +#ifndef M_LN2 +#define M_LN2 0.69314718055994530942 /* log_e 2 */ +#endif +#ifndef M_LN10 +#define M_LN10 2.30258509299404568402 /* log_e 10 */ +#endif +#ifndef M_LOG2_10 +#define M_LOG2_10 3.32192809488736234787 /* log_2 10 */ +#endif +#ifndef M_PHI +#define M_PHI 1.61803398874989484820 /* phi / golden ratio */ +#endif +#ifndef M_PI +#define M_PI 3.14159265358979323846 /* pi */ +#endif +#ifndef M_SQRT1_2 +#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ +#endif +#ifndef M_SQRT2 +#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ +#endif +#ifndef NAN +#define NAN (0.0/0.0) +#endif +#ifndef INFINITY +#define INFINITY (1.0/0.0) +#endif + +enum AVRounding { + AV_ROUND_ZERO = 0, ///< Round toward zero. + AV_ROUND_INF = 1, ///< Round away from zero. + AV_ROUND_DOWN = 2, ///< Round toward -infinity. + AV_ROUND_UP = 3, ///< Round toward +infinity. + AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero. +}; + +/** + * Return the greatest common divisor of a and b. + * If both a and b are 0 or either or both are <0 then behavior is + * undefined. + */ +int64_t av_const av_gcd(int64_t a, int64_t b); + +/** + * Rescale a 64-bit integer with rounding to nearest. + * A simple a*b/c isn't possible as it can overflow. + */ +int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const; + +/** + * Rescale a 64-bit integer with specified rounding. + * A simple a*b/c isn't possible as it can overflow. + */ +int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding) av_const; + +/** + * Rescale a 64-bit integer by 2 rational numbers. + */ +int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const; + +/** + * Compare 2 timestamps each in its own timebases. + * The result of the function is undefined if one of the timestamps + * is outside the int64_t range when represented in the others timebase. + * @return -1 if ts_a is before ts_b, 1 if ts_a is after ts_b or 0 if they represent the same position + */ +int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b); + +/** + * Compare 2 integers modulo mod. + * That is we compare integers a and b for which only the least + * significant log2(mod) bits are known. + * + * @param mod must be a power of 2 + * @return a negative value if a is smaller than b + * a positive value if a is greater than b + * 0 if a equals b + */ +int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod); + +#endif /* AVUTIL_MATHEMATICS_H */ diff --git a/windeps/include/libavutil/md5.h b/windeps/include/libavutil/md5.h new file mode 100644 index 0000000..969202a --- /dev/null +++ b/windeps/include/libavutil/md5.h @@ -0,0 +1,36 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_MD5_H +#define AVUTIL_MD5_H + +#include + +extern const int av_md5_size; + +struct AVMD5; + +void av_md5_init(struct AVMD5 *ctx); +void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, const int len); +void av_md5_final(struct AVMD5 *ctx, uint8_t *dst); +void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len); + +#endif /* AVUTIL_MD5_H */ + diff --git a/windeps/include/libavutil/mem.h b/windeps/include/libavutil/mem.h new file mode 100644 index 0000000..ab73a32 --- /dev/null +++ b/windeps/include/libavutil/mem.h @@ -0,0 +1,134 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +/** + * @file + * memory handling functions + */ + +#ifndef AVUTIL_MEM_H +#define AVUTIL_MEM_H + +#include "attributes.h" +#include "avutil.h" + +#if defined(__ICC) && _ICC < 1200 || defined(__SUNPRO_C) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_CONST(n,t,v) const t __attribute__ ((aligned (n))) v +#elif defined(__TI_COMPILER_VERSION__) + #define DECLARE_ALIGNED(n,t,v) \ + AV_PRAGMA(DATA_ALIGN(v,n)) \ + t __attribute__((aligned(n))) v + #define DECLARE_ASM_CONST(n,t,v) \ + AV_PRAGMA(DATA_ALIGN(v,n)) \ + static const t __attribute__((aligned(n))) v +#elif defined(__GNUC__) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_CONST(n,t,v) static const t attribute_used __attribute__ ((aligned (n))) v +#elif defined(_MSC_VER) + #define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v + #define DECLARE_ASM_CONST(n,t,v) __declspec(align(n)) static const t v +#else + #define DECLARE_ALIGNED(n,t,v) t v + #define DECLARE_ASM_CONST(n,t,v) static const t v +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) + #define av_malloc_attrib __attribute__((__malloc__)) +#else + #define av_malloc_attrib +#endif + +#if (!defined(__ICC) || __ICC > 1200) && AV_GCC_VERSION_AT_LEAST(4,3) + #define av_alloc_size(n) __attribute__((alloc_size(n))) +#else + #define av_alloc_size(n) +#endif + +#if LIBAVUTIL_VERSION_MAJOR < 51 +# define FF_INTERNAL_MEM_TYPE unsigned int +# define FF_INTERNAL_MEM_TYPE_MAX_VALUE UINT_MAX +#else +# define FF_INTERNAL_MEM_TYPE size_t +# define FF_INTERNAL_MEM_TYPE_MAX_VALUE SIZE_MAX +#endif + +/** + * Allocate a block of size bytes with alignment suitable for all + * memory accesses (including vectors if available on the CPU). + * @param size Size in bytes for the memory block to be allocated. + * @return Pointer to the allocated block, NULL if the block cannot + * be allocated. + * @see av_mallocz() + */ +void *av_malloc(FF_INTERNAL_MEM_TYPE size) av_malloc_attrib av_alloc_size(1); + +/** + * Allocate or reallocate a block of memory. + * If ptr is NULL and size > 0, allocate a new block. If + * size is zero, free the memory block pointed to by ptr. + * @param size Size in bytes for the memory block to be allocated or + * reallocated. + * @param ptr Pointer to a memory block already allocated with + * av_malloc(z)() or av_realloc() or NULL. + * @return Pointer to a newly reallocated block or NULL if the block + * cannot be reallocated or the function is used to free the memory block. + * @see av_fast_realloc() + */ +void *av_realloc(void *ptr, FF_INTERNAL_MEM_TYPE size) av_alloc_size(2); + +/** + * Free a memory block which has been allocated with av_malloc(z)() or + * av_realloc(). + * @param ptr Pointer to the memory block which should be freed. + * @note ptr = NULL is explicitly allowed. + * @note It is recommended that you use av_freep() instead. + * @see av_freep() + */ +void av_free(void *ptr); + +/** + * Allocate a block of size bytes with alignment suitable for all + * memory accesses (including vectors if available on the CPU) and + * zero all the bytes of the block. + * @param size Size in bytes for the memory block to be allocated. + * @return Pointer to the allocated block, NULL if it cannot be allocated. + * @see av_malloc() + */ +void *av_mallocz(FF_INTERNAL_MEM_TYPE size) av_malloc_attrib av_alloc_size(1); + +/** + * Duplicate the string s. + * @param s string to be duplicated + * @return Pointer to a newly allocated string containing a + * copy of s or NULL if the string cannot be allocated. + */ +char *av_strdup(const char *s) av_malloc_attrib; + +/** + * Free a memory block which has been allocated with av_malloc(z)() or + * av_realloc() and set the pointer pointing to it to NULL. + * @param ptr Pointer to the pointer to the memory block which should + * be freed. + * @see av_free() + */ +void av_freep(void *ptr); + +#endif /* AVUTIL_MEM_H */ diff --git a/windeps/include/libavutil/opt.h b/windeps/include/libavutil/opt.h new file mode 100644 index 0000000..67c2dd7 --- /dev/null +++ b/windeps/include/libavutil/opt.h @@ -0,0 +1,226 @@ +/* + * AVOptions + * copyright (c) 2005 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_OPT_H +#define AVUTIL_OPT_H + +/** + * @file + * AVOptions + */ + +#include "rational.h" +#include "avutil.h" + +enum AVOptionType{ + FF_OPT_TYPE_FLAGS, + FF_OPT_TYPE_INT, + FF_OPT_TYPE_INT64, + FF_OPT_TYPE_DOUBLE, + FF_OPT_TYPE_FLOAT, + FF_OPT_TYPE_STRING, + FF_OPT_TYPE_RATIONAL, + FF_OPT_TYPE_BINARY, ///< offset must point to a pointer immediately followed by an int for the length + FF_OPT_TYPE_CONST=128, +}; + +/** + * AVOption + */ +typedef struct AVOption { + const char *name; + + /** + * short English help text + * @todo What about other languages? + */ + const char *help; + + /** + * The offset relative to the context structure where the option + * value is stored. It should be 0 for named constants. + */ + int offset; + enum AVOptionType type; + + /** + * the default value for scalar options + */ + double default_val; + double min; ///< minimum valid value for the option + double max; ///< maximum valid value for the option + + int flags; +#define AV_OPT_FLAG_ENCODING_PARAM 1 ///< a generic parameter which can be set by the user for muxing or encoding +#define AV_OPT_FLAG_DECODING_PARAM 2 ///< a generic parameter which can be set by the user for demuxing or decoding +#define AV_OPT_FLAG_METADATA 4 ///< some data extracted or inserted into the file like title, comment, ... +#define AV_OPT_FLAG_AUDIO_PARAM 8 +#define AV_OPT_FLAG_VIDEO_PARAM 16 +#define AV_OPT_FLAG_SUBTITLE_PARAM 32 +//FIXME think about enc-audio, ... style flags + + /** + * The logical unit to which the option belongs. Non-constant + * options and corresponding named constants share the same + * unit. May be NULL. + */ + const char *unit; +} AVOption; + +/** + * AVOption2. + * THIS IS NOT PART OF THE API/ABI YET! + * This is identical to AVOption except that default_val was replaced by + * an union, it should be compatible with AVOption on normal platforms. + */ +typedef struct AVOption2 { + const char *name; + + /** + * short English help text + * @todo What about other languages? + */ + const char *help; + + /** + * The offset relative to the context structure where the option + * value is stored. It should be 0 for named constants. + */ + int offset; + enum AVOptionType type; + + /** + * the default value for scalar options + */ + union { + double dbl; + const char *str; + } default_val; + + double min; ///< minimum valid value for the option + double max; ///< maximum valid value for the option + + int flags; +/* +#define AV_OPT_FLAG_ENCODING_PARAM 1 ///< a generic parameter which can be set by the user for muxing or encoding +#define AV_OPT_FLAG_DECODING_PARAM 2 ///< a generic parameter which can be set by the user for demuxing or decoding +#define AV_OPT_FLAG_METADATA 4 ///< some data extracted or inserted into the file like title, comment, ... +#define AV_OPT_FLAG_AUDIO_PARAM 8 +#define AV_OPT_FLAG_VIDEO_PARAM 16 +#define AV_OPT_FLAG_SUBTITLE_PARAM 32 +*/ +//FIXME think about enc-audio, ... style flags + + /** + * The logical unit to which the option belongs. Non-constant + * options and corresponding named constants share the same + * unit. May be NULL. + */ + const char *unit; +} AVOption2; + + +/** + * Look for an option in obj. Look only for the options which + * have the flags set as specified in mask and flags (that is, + * for which it is the case that opt->flags & mask == flags). + * + * @param[in] obj a pointer to a struct whose first element is a + * pointer to an AVClass + * @param[in] name the name of the option to look for + * @param[in] unit the unit of the option to look for, or any if NULL + * @return a pointer to the option found, or NULL if no option + * has been found + */ +const AVOption *av_find_opt(void *obj, const char *name, const char *unit, int mask, int flags); + +/** + * Set the field of obj with the given name to value. + * + * @param[in] obj A struct whose first element is a pointer to an + * AVClass. + * @param[in] name the name of the field to set + * @param[in] val The value to set. If the field is not of a string + * type, then the given string is parsed. + * SI postfixes and some named scalars are supported. + * If the field is of a numeric type, it has to be a numeric or named + * scalar. Behavior with more than one scalar and +- infix operators + * is undefined. + * If the field is of a flags type, it has to be a sequence of numeric + * scalars or named flags separated by '+' or '-'. Prefixing a flag + * with '+' causes it to be set without affecting the other flags; + * similarly, '-' unsets a flag. + * @param[out] o_out if non-NULL put here a pointer to the AVOption + * found + * @param alloc when 1 then the old value will be av_freed() and the + * new av_strduped() + * when 0 then no av_free() nor av_strdup() will be used + * @return 0 if the value has been set, or an AVERROR code in case of + * error: + * AVERROR(ENOENT) if no matching option exists + * AVERROR(ERANGE) if the value is out of range + * AVERROR(EINVAL) if the value is not valid + */ +int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out); + +const AVOption *av_set_double(void *obj, const char *name, double n); +const AVOption *av_set_q(void *obj, const char *name, AVRational n); +const AVOption *av_set_int(void *obj, const char *name, int64_t n); +double av_get_double(void *obj, const char *name, const AVOption **o_out); +AVRational av_get_q(void *obj, const char *name, const AVOption **o_out); +int64_t av_get_int(void *obj, const char *name, const AVOption **o_out); +const char *av_get_string(void *obj, const char *name, const AVOption **o_out, char *buf, int buf_len); +const AVOption *av_next_option(void *obj, const AVOption *last); + +/** + * Show the obj options. + * + * @param req_flags requested flags for the options to show. Show only the + * options for which it is opt->flags & req_flags. + * @param rej_flags rejected flags for the options to show. Show only the + * options for which it is !(opt->flags & req_flags). + * @param av_log_obj log context to use for showing the options + */ +int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags); + +void av_opt_set_defaults(void *s); +void av_opt_set_defaults2(void *s, int mask, int flags); + +/** + * Parse the key/value pairs list in opts. For each key/value pair + * found, stores the value in the field in ctx that is named like the + * key. ctx must be an AVClass context, storing is done using + * AVOptions. + * + * @param key_val_sep a 0-terminated list of characters used to + * separate key from value + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other + * @return the number of successfully set key/value pairs, or a negative + * value corresponding to an AVERROR code in case of error: + * AVERROR(EINVAL) if opts cannot be parsed, + * the error code issued by av_set_string3() if a key/value pair + * cannot be set + */ +int av_set_options_string(void *ctx, const char *opts, + const char *key_val_sep, const char *pairs_sep); + +#endif /* AVUTIL_OPT_H */ diff --git a/windeps/include/libavutil/pixdesc.h b/windeps/include/libavutil/pixdesc.h new file mode 100644 index 0000000..727e47f --- /dev/null +++ b/windeps/include/libavutil/pixdesc.h @@ -0,0 +1,166 @@ +/* + * pixel format descriptor + * Copyright (c) 2009 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_PIXDESC_H +#define AVUTIL_PIXDESC_H + +#include + +typedef struct AVComponentDescriptor{ + uint16_t plane :2; ///< which of the 4 planes contains the component + + /** + * Number of elements between 2 horizontally consecutive pixels minus 1. + * Elements are bits for bitstream formats, bytes otherwise. + */ + uint16_t step_minus1 :3; + + /** + * Number of elements before the component of the first pixel plus 1. + * Elements are bits for bitstream formats, bytes otherwise. + */ + uint16_t offset_plus1 :3; + uint16_t shift :3; ///< number of least significant bits that must be shifted away to get the value + uint16_t depth_minus1 :4; ///< number of bits in the component minus 1 +}AVComponentDescriptor; + +/** + * Descriptor that unambiguously describes how the bits of a pixel are + * stored in the up to 4 data planes of an image. It also stores the + * subsampling factors and number of components. + * + * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV + * and all the YUV variants) AVPixFmtDescriptor just stores how values + * are stored not what these values represent. + */ +typedef struct AVPixFmtDescriptor{ + const char *name; + uint8_t nb_components; ///< The number of components each pixel has, (1-4) + + /** + * Amount to shift the luma width right to find the chroma width. + * For YV12 this is 1 for example. + * chroma_width = -((-luma_width) >> log2_chroma_w) + * The note above is needed to ensure rounding up. + * This value only refers to the chroma components. + */ + uint8_t log2_chroma_w; ///< chroma_width = -((-luma_width )>>log2_chroma_w) + + /** + * Amount to shift the luma height right to find the chroma height. + * For YV12 this is 1 for example. + * chroma_height= -((-luma_height) >> log2_chroma_h) + * The note above is needed to ensure rounding up. + * This value only refers to the chroma components. + */ + uint8_t log2_chroma_h; + uint8_t flags; + + /** + * Parameters that describe how pixels are packed. If the format + * has chroma components, they must be stored in comp[1] and + * comp[2]. + */ + AVComponentDescriptor comp[4]; +}AVPixFmtDescriptor; + +#define PIX_FMT_BE 1 ///< Pixel format is big-endian. +#define PIX_FMT_PAL 2 ///< Pixel format has a palette in data[1], values are indexes in this palette. +#define PIX_FMT_BITSTREAM 4 ///< All values of a component are bit-wise packed end to end. +#define PIX_FMT_HWACCEL 8 ///< Pixel format is an HW accelerated format. + +/** + * The array of all the pixel format descriptors. + */ +extern const AVPixFmtDescriptor av_pix_fmt_descriptors[]; + +/** + * Read a line from an image, and write the values of the + * pixel format component c to dst. + * + * @param data the array containing the pointers to the planes of the image + * @param linesize the array containing the linesizes of the image + * @param desc the pixel format descriptor for the image + * @param x the horizontal coordinate of the first pixel to read + * @param y the vertical coordinate of the first pixel to read + * @param w the width of the line to read, that is the number of + * values to write to dst + * @param read_pal_component if not zero and the format is a paletted + * format writes the values corresponding to the palette + * component c in data[1] to dst, rather than the palette indexes in + * data[0]. The behavior is undefined if the format is not paletted. + */ +void av_read_image_line(uint16_t *dst, const uint8_t *data[4], const int linesize[4], + const AVPixFmtDescriptor *desc, int x, int y, int c, int w, int read_pal_component); + +/** + * Write the values from src to the pixel format component c of an + * image line. + * + * @param src array containing the values to write + * @param data the array containing the pointers to the planes of the + * image to write into. It is supposed to be zeroed. + * @param linesize the array containing the linesizes of the image + * @param desc the pixel format descriptor for the image + * @param x the horizontal coordinate of the first pixel to write + * @param y the vertical coordinate of the first pixel to write + * @param w the width of the line to write, that is the number of + * values to write to the image line + */ +void av_write_image_line(const uint16_t *src, uint8_t *data[4], const int linesize[4], + const AVPixFmtDescriptor *desc, int x, int y, int c, int w); + +/** + * Return the pixel format corresponding to name. + * + * If there is no pixel format with name name, then looks for a + * pixel format with the name corresponding to the native endian + * format of name. + * For example in a little-endian system, first looks for "gray16", + * then for "gray16le". + * + * Finally if no pixel format has been found, returns PIX_FMT_NONE. + */ +enum PixelFormat av_get_pix_fmt(const char *name); + +/** + * Print in buf the string corresponding to the pixel format with + * number pix_fmt, or an header if pix_fmt is negative. + * + * @param buf the buffer where to write the string + * @param buf_size the size of buf + * @param pix_fmt the number of the pixel format to print the + * corresponding info string, or a negative value to print the + * corresponding header. + */ +char *av_get_pix_fmt_string (char *buf, int buf_size, enum PixelFormat pix_fmt); + +/** + * Return the number of bits per pixel used by the pixel format + * described by pixdesc. + * + * The returned number of bits refers to the number of bits actually + * used for storing the pixel information, that is padding bits are + * not counted. + */ +int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc); + +#endif /* AVUTIL_PIXDESC_H */ diff --git a/windeps/include/libavutil/pixfmt.h b/windeps/include/libavutil/pixfmt.h new file mode 100644 index 0000000..8ec91c8 --- /dev/null +++ b/windeps/include/libavutil/pixfmt.h @@ -0,0 +1,163 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_PIXFMT_H +#define AVUTIL_PIXFMT_H + +/** + * @file + * pixel format definitions + * + * @warning This file has to be considered an internal but installed + * header, so it should not be directly included in your projects. + */ + +#include "libavutil/avconfig.h" + +/** + * Pixel format. Notes: + * + * PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA + * color is put together as: + * (A << 24) | (R << 16) | (G << 8) | B + * This is stored as BGRA on little-endian CPU architectures and ARGB on + * big-endian CPUs. + * + * When the pixel format is palettized RGB (PIX_FMT_PAL8), the palettized + * image data is stored in AVFrame.data[0]. The palette is transported in + * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is + * formatted the same as in PIX_FMT_RGB32 described above (i.e., it is + * also endian-specific). Note also that the individual RGB palette + * components stored in AVFrame.data[1] should be in the range 0..255. + * This is important as many custom PAL8 video codecs that were designed + * to run on the IBM VGA graphics adapter use 6-bit palette components. + * + * For all the 8bit per pixel formats, an RGB32 palette is in data[1] like + * for pal8. This palette is filled in automatically by the function + * allocating the picture. + * + * Note, make sure that all newly added big endian formats have pix_fmt&1==1 + * and that all newly added little endian formats have pix_fmt&1==0 + * this allows simpler detection of big vs little endian. + */ +enum PixelFormat { + PIX_FMT_NONE= -1, + PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples) + PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr + PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB... + PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR... + PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) + PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples) + PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples) + PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) + PIX_FMT_GRAY8, ///< Y , 8bpp + PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb + PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb + PIX_FMT_PAL8, ///< 8 bit with PIX_FMT_RGB32 palette + PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV420P and setting color_range + PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV422P and setting color_range + PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV444P and setting color_range + PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing + PIX_FMT_XVMC_MPEG2_IDCT, + PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 + PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3 + PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb) + PIX_FMT_BGR4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits + PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb) + PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb) + PIX_FMT_RGB4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits + PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb) + PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V) + PIX_FMT_NV21, ///< as above, but U and V bytes are swapped + + PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB... + PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA... + PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR... + PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA... + + PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian + PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian + PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples) + PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of PIX_FMT_YUV440P and setting color_range + PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples) + PIX_FMT_VDPAU_H264,///< H.264 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + PIX_FMT_VDPAU_MPEG1,///< MPEG-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + PIX_FMT_VDPAU_MPEG2,///< MPEG-2 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + PIX_FMT_VDPAU_WMV3,///< WMV3 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + PIX_FMT_VDPAU_VC1, ///< VC-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian + PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian + + PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian + PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian + PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), big-endian, most significant bit to 0 + PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), little-endian, most significant bit to 0 + + PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian + PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian + PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), big-endian, most significant bit to 1 + PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), little-endian, most significant bit to 1 + + PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers + PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers + PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a vaapi_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + + PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + PIX_FMT_VDPAU_MPEG4, ///< MPEG4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer + + PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0 + PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0 + PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), big-endian, most significant bits to 1 + PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), little-endian, most significant bits to 1 + PIX_FMT_Y400A, ///< 8bit gray, 8bit alpha + PIX_FMT_NB, ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions +}; + +#if AV_HAVE_BIGENDIAN +# define PIX_FMT_NE(be, le) PIX_FMT_##be +#else +# define PIX_FMT_NE(be, le) PIX_FMT_##le +#endif + +#define PIX_FMT_RGB32 PIX_FMT_NE(ARGB, BGRA) +#define PIX_FMT_RGB32_1 PIX_FMT_NE(RGBA, ABGR) +#define PIX_FMT_BGR32 PIX_FMT_NE(ABGR, RGBA) +#define PIX_FMT_BGR32_1 PIX_FMT_NE(BGRA, ARGB) + +#define PIX_FMT_GRAY16 PIX_FMT_NE(GRAY16BE, GRAY16LE) +#define PIX_FMT_RGB48 PIX_FMT_NE(RGB48BE, RGB48LE) +#define PIX_FMT_RGB565 PIX_FMT_NE(RGB565BE, RGB565LE) +#define PIX_FMT_RGB555 PIX_FMT_NE(RGB555BE, RGB555LE) +#define PIX_FMT_RGB444 PIX_FMT_NE(RGB444BE, RGB444LE) +#define PIX_FMT_BGR565 PIX_FMT_NE(BGR565BE, BGR565LE) +#define PIX_FMT_BGR555 PIX_FMT_NE(BGR555BE, BGR555LE) +#define PIX_FMT_BGR444 PIX_FMT_NE(BGR444BE, BGR444LE) + +#define PIX_FMT_YUV420P16 PIX_FMT_NE(YUV420P16BE, YUV420P16LE) +#define PIX_FMT_YUV422P16 PIX_FMT_NE(YUV422P16BE, YUV422P16LE) +#define PIX_FMT_YUV444P16 PIX_FMT_NE(YUV444P16BE, YUV444P16LE) + +#endif /* AVUTIL_PIXFMT_H */ diff --git a/windeps/include/libavutil/random_seed.h b/windeps/include/libavutil/random_seed.h new file mode 100644 index 0000000..7f75063 --- /dev/null +++ b/windeps/include/libavutil/random_seed.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2009 Baptiste Coudurier + * + * 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 + */ + +#ifndef AVUTIL_RANDOM_SEED_H +#define AVUTIL_RANDOM_SEED_H + +#include + +/** + * Get a seed to use in conjunction with random functions. + */ +uint32_t av_get_random_seed(void); + +#endif /* AVUTIL_RANDOM_SEED_H */ diff --git a/windeps/include/libavutil/rational.h b/windeps/include/libavutil/rational.h new file mode 100644 index 0000000..789e4ac --- /dev/null +++ b/windeps/include/libavutil/rational.h @@ -0,0 +1,135 @@ +/* + * rational numbers + * Copyright (c) 2003 Michael Niedermayer + * + * 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 + */ + +/** + * @file + * rational numbers + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_RATIONAL_H +#define AVUTIL_RATIONAL_H + +#include +#include +#include "attributes.h" + +/** + * rational number numerator/denominator + */ +typedef struct AVRational{ + int num; ///< numerator + int den; ///< denominator +} AVRational; + +/** + * Compare two rationals. + * @param a first rational + * @param b second rational + * @return 0 if a==b, 1 if a>b, -1 if a>63)|1; + else if(b.den && a.den) return 0; + else if(a.num && b.num) return (a.num>>31) - (b.num>>31); + else return INT_MIN; +} + +/** + * Convert rational to double. + * @param a rational to convert + * @return (double) a + */ +static inline double av_q2d(AVRational a){ + return a.num / (double) a.den; +} + +/** + * Reduce a fraction. + * This is useful for framerate calculations. + * @param dst_num destination numerator + * @param dst_den destination denominator + * @param num source numerator + * @param den source denominator + * @param max the maximum allowed for dst_num & dst_den + * @return 1 if exact, 0 otherwise + */ +int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max); + +/** + * Multiply two rationals. + * @param b first rational + * @param c second rational + * @return b*c + */ +AVRational av_mul_q(AVRational b, AVRational c) av_const; + +/** + * Divide one rational by another. + * @param b first rational + * @param c second rational + * @return b/c + */ +AVRational av_div_q(AVRational b, AVRational c) av_const; + +/** + * Add two rationals. + * @param b first rational + * @param c second rational + * @return b+c + */ +AVRational av_add_q(AVRational b, AVRational c) av_const; + +/** + * Subtract one rational from another. + * @param b first rational + * @param c second rational + * @return b-c + */ +AVRational av_sub_q(AVRational b, AVRational c) av_const; + +/** + * Convert a double precision floating point number to a rational. + * inf is expressed as {1,0} or {-1,0} depending on the sign. + * + * @param d double to convert + * @param max the maximum allowed numerator and denominator + * @return (AVRational) d + */ +AVRational av_d2q(double d, int max) av_const; + +/** + * @return 1 if q1 is nearer to q than q2, -1 if q2 is nearer + * than q1, 0 if they have the same distance. + */ +int av_nearer_q(AVRational q, AVRational q1, AVRational q2); + +/** + * Find the nearest value in q_list to q. + * @param q_list an array of rationals terminated by {0, 0} + * @return the index of the nearest value found in the array + */ +int av_find_nearest_q_idx(AVRational q, const AVRational* q_list); + +#endif /* AVUTIL_RATIONAL_H */ diff --git a/windeps/include/libavutil/sha1.h b/windeps/include/libavutil/sha1.h new file mode 100644 index 0000000..3ff5804 --- /dev/null +++ b/windeps/include/libavutil/sha1.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_SHA1_H +#define AVUTIL_SHA1_H + +#include + +extern const int av_sha1_size; + +struct AVSHA1; + +/** + * Initialize SHA-1 hashing. + * + * @param context pointer to the function context (of size av_sha_size) + * @deprecated use av_sha_init() instead + */ +void av_sha1_init(struct AVSHA1* context); + +/** + * Update hash value. + * + * @param context hash function context + * @param data input data to update hash with + * @param len input data length + * @deprecated use av_sha_update() instead + */ +void av_sha1_update(struct AVSHA1* context, const uint8_t* data, unsigned int len); + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + * @deprecated use av_sha_final() instead + */ +void av_sha1_final(struct AVSHA1* context, uint8_t digest[20]); + +#endif /* AVUTIL_SHA1_H */ diff --git a/windeps/include/libswscale/swscale.h b/windeps/include/libswscale/swscale.h new file mode 100644 index 0000000..3cc3202 --- /dev/null +++ b/windeps/include/libswscale/swscale.h @@ -0,0 +1,359 @@ +/* + * Copyright (C) 2001-2003 Michael Niedermayer + * + * 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 + */ + +#ifndef SWSCALE_SWSCALE_H +#define SWSCALE_SWSCALE_H + +/** + * @file + * @brief + * external api for the swscale stuff + */ + +#include "libavutil/avutil.h" + +#define LIBSWSCALE_VERSION_MAJOR 0 +#define LIBSWSCALE_VERSION_MINOR 12 +#define LIBSWSCALE_VERSION_MICRO 0 + +#define LIBSWSCALE_VERSION_INT AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \ + LIBSWSCALE_VERSION_MINOR, \ + LIBSWSCALE_VERSION_MICRO) +#define LIBSWSCALE_VERSION AV_VERSION(LIBSWSCALE_VERSION_MAJOR, \ + LIBSWSCALE_VERSION_MINOR, \ + LIBSWSCALE_VERSION_MICRO) +#define LIBSWSCALE_BUILD LIBSWSCALE_VERSION_INT + +#define LIBSWSCALE_IDENT "SwS" AV_STRINGIFY(LIBSWSCALE_VERSION) + +/** + * Those FF_API_* defines are not part of public API. + * They may change, break or disappear at any time. + */ +#ifndef FF_API_SWS_GETCONTEXT +#define FF_API_SWS_GETCONTEXT (LIBSWSCALE_VERSION_MAJOR < 1) +#endif + +/** + * Returns the LIBSWSCALE_VERSION_INT constant. + */ +unsigned swscale_version(void); + +/** + * Returns the libswscale build-time configuration. + */ +const char *swscale_configuration(void); + +/** + * Returns the libswscale license. + */ +const char *swscale_license(void); + +/* values for the flags, the stuff on the command line is different */ +#define SWS_FAST_BILINEAR 1 +#define SWS_BILINEAR 2 +#define SWS_BICUBIC 4 +#define SWS_X 8 +#define SWS_POINT 0x10 +#define SWS_AREA 0x20 +#define SWS_BICUBLIN 0x40 +#define SWS_GAUSS 0x80 +#define SWS_SINC 0x100 +#define SWS_LANCZOS 0x200 +#define SWS_SPLINE 0x400 + +#define SWS_SRC_V_CHR_DROP_MASK 0x30000 +#define SWS_SRC_V_CHR_DROP_SHIFT 16 + +#define SWS_PARAM_DEFAULT 123456 + +#define SWS_PRINT_INFO 0x1000 + +//the following 3 flags are not completely implemented +//internal chrominace subsampling info +#define SWS_FULL_CHR_H_INT 0x2000 +//input subsampling info +#define SWS_FULL_CHR_H_INP 0x4000 +#define SWS_DIRECT_BGR 0x8000 +#define SWS_ACCURATE_RND 0x40000 +#define SWS_BITEXACT 0x80000 + +#define SWS_CPU_CAPS_MMX 0x80000000 +#define SWS_CPU_CAPS_MMX2 0x20000000 +#define SWS_CPU_CAPS_3DNOW 0x40000000 +#define SWS_CPU_CAPS_ALTIVEC 0x10000000 +#define SWS_CPU_CAPS_BFIN 0x01000000 +#define SWS_CPU_CAPS_SSE2 0x02000000 + +#define SWS_MAX_REDUCE_CUTOFF 0.002 + +#define SWS_CS_ITU709 1 +#define SWS_CS_FCC 4 +#define SWS_CS_ITU601 5 +#define SWS_CS_ITU624 5 +#define SWS_CS_SMPTE170M 5 +#define SWS_CS_SMPTE240M 7 +#define SWS_CS_DEFAULT 5 + +/** + * Returns 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. + */ +const int *sws_getCoefficients(int colorspace); + + +// when used for filters they must have an odd number of elements +// coeffs cannot be shared between vectors +typedef struct { + double *coeff; ///< pointer to the list of coefficients + int length; ///< number of coefficients in the vector +} SwsVector; + +// vectors can be shared +typedef struct { + SwsVector *lumH; + SwsVector *lumV; + SwsVector *chrH; + SwsVector *chrV; +} SwsFilter; + +struct SwsContext; + +/** + * Returns a positive value if pix_fmt is a supported input format, 0 + * otherwise. + */ +int sws_isSupportedInput(enum PixelFormat pix_fmt); + +/** + * Returns a positive value if pix_fmt is a supported output format, 0 + * otherwise. + */ +int sws_isSupportedOutput(enum PixelFormat pix_fmt); + +/** + * Allocates an empty SwsContext. This must be filled and passed to + * sws_init_context(). For filling see AVOptions, options.c and + * sws_setColorspaceDetails(). + */ +struct SwsContext *sws_alloc_context(void); + +/** + * Initializes the swscaler context sws_context. + * + * @return zero or positive value on success, a negative value on + * error + */ +int sws_init_context(struct SwsContext *sws_context, SwsFilter *srcFilter, SwsFilter *dstFilter); + +/** + * Frees the swscaler context swsContext. + * If swsContext is NULL, then does nothing. + */ +void sws_freeContext(struct SwsContext *swsContext); + +#if FF_API_SWS_GETCONTEXT +/** + * Allocates and returns 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 + * @deprecated use sws_alloc_context() and sws_init_context() + */ +attribute_deprecated +struct SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat, + int dstW, int dstH, enum PixelFormat dstFormat, + int flags, SwsFilter *srcFilter, + SwsFilter *dstFilter, const double *param); +#endif + +/** + * Scales the image slice in srcSlice and puts 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 context 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 + */ +int sws_scale(struct SwsContext *context, const uint8_t* const srcSlice[], const int srcStride[], + int srcSliceY, int srcSliceH, uint8_t* const dst[], const int dstStride[]); + +#if LIBSWSCALE_VERSION_MAJOR < 1 +/** + * @deprecated Use sws_scale() instead. + */ +int sws_scale_ordered(struct SwsContext *context, const uint8_t* const src[], + int srcStride[], int srcSliceY, int srcSliceH, + uint8_t* dst[], int dstStride[]) attribute_deprecated; +#endif + +/** + * @param inv_table the yuv2rgb coefficients, normally ff_yuv2rgb_coeffs[x] + * @param fullRange if 1 then the luma range is 0..255 if 0 it is 16..235 + * @return -1 if not supported + */ +int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], + int srcRange, const int table[4], int dstRange, + int brightness, int contrast, int saturation); + +/** + * @return -1 if not supported + */ +int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table, + int *srcRange, int **table, int *dstRange, + int *brightness, int *contrast, int *saturation); + +/** + * Allocates and returns an uninitialized vector with length coefficients. + */ +SwsVector *sws_allocVec(int length); + +/** + * Returns a normalized Gaussian curve used to filter stuff + * quality=3 is high quality, lower is lower quality. + */ +SwsVector *sws_getGaussianVec(double variance, double quality); + +/** + * Allocates and returns a vector with length coefficients, all + * with the same value c. + */ +SwsVector *sws_getConstVec(double c, int length); + +/** + * Allocates and returns a vector with just one coefficient, with + * value 1.0. + */ +SwsVector *sws_getIdentityVec(void); + +/** + * Scales all the coefficients of a by the scalar value. + */ +void sws_scaleVec(SwsVector *a, double scalar); + +/** + * Scales all the coefficients of a so that their sum equals height. + */ +void sws_normalizeVec(SwsVector *a, double height); +void sws_convVec(SwsVector *a, SwsVector *b); +void sws_addVec(SwsVector *a, SwsVector *b); +void sws_subVec(SwsVector *a, SwsVector *b); +void sws_shiftVec(SwsVector *a, int shift); + +/** + * Allocates and returns a clone of the vector a, that is a vector + * with the same coefficients as a. + */ +SwsVector *sws_cloneVec(SwsVector *a); + +#if LIBSWSCALE_VERSION_MAJOR < 1 +/** + * @deprecated Use sws_printVec2() instead. + */ +attribute_deprecated void sws_printVec(SwsVector *a); +#endif + +/** + * Prints with av_log() a textual representation of the vector a + * if log_level <= av_log_level. + */ +void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level); + +void sws_freeVec(SwsVector *a); + +SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur, + float lumaSharpen, float chromaSharpen, + float chromaHShift, float chromaVShift, + int verbose); +void sws_freeFilter(SwsFilter *filter); + +/** + * Checks 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. + */ +struct SwsContext *sws_getCachedContext(struct SwsContext *context, + int srcW, int srcH, enum PixelFormat srcFormat, + int dstW, int dstH, enum PixelFormat dstFormat, + int flags, SwsFilter *srcFilter, + SwsFilter *dstFilter, const double *param); + +/** + * Converts 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 + */ +void sws_convertPalette8ToPacked32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette); + +/** + * Converts 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 + */ +void sws_convertPalette8ToPacked24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette); + + +#endif /* SWSCALE_SWSCALE_H */ diff --git a/windeps/lib/avcodec.lib b/windeps/lib/avcodec.lib new file mode 100644 index 0000000000000000000000000000000000000000..591de8f20f63f60abf5046a28ef53d96ea208485 GIT binary patch literal 1373002 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 +ybOfil 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%0ASH1h~TE{5i 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

dy_gHkcGK-GLi|&oir|Y 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∨%m6 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

2{6@+>RWYxtsNr)m;Q(P=-5s^xef z25)HzzfL?_sOmynzgl~!HCm2YhmKc^{E8T+Y!jMFXz9mWLQTC`ePLr)xa`cGfZ5SZ z%{rHLx*JT(RBl=E+^eo?^I(b-o0?y51YWrsRqL^`!CP7n!j+)v)%~WJHKD2to%+ej z>H0#b^f~;Y50%w$?LL|hs}=5xOKMm|VL7NY;?Bgn32$gUK#0*>On9NSy6QF9%O4_& zZ2-IM)%<9hybO8gIc_S+apOevdLPli5YfVZqNm6d{Ubz=K<_}&0irjcJEPD8-5w)) z2|9m}=mqHXA);rXfx|>i&>PU*BSf!2rK3b!powEd&q2e-iJpMof|db159}W5rBCQn z>Ze^aK)Y#>_RwD1N1xH>G(`Jpm`3OTjnWt$q(gL=j?hs$M#pJY}uq*;L{BeW&` zVDPo|+YhXkWxU9p#7N7&ouHSP=}LzgmZCnyQsj9}wF!66U0o!_i5r_HQO z9Uk&bSC@6RlRL$xd%IQCF+kSZE-l5W&&COfdzXqbk0x5%hU=nH!Rt<&3R}+#>I9JJ z*eTwuXqjb!78@C}Eaav`qA4TaCcK_hEul)MuIwmtW|9XbpJcoYH+!6UyHFJqD^bLm z??X4b+4*zwZg+36)YC`5PZY0y)`N_N?86CYVkKC|oCsI^ zrhjr;RUs+T-=Ke`pbzB&O>RlOIVnaa!v{R2$LskqD?xWjVR^qDkNAs2$C1r2#xZDrw zp3=@Pn?9#rP|{uY3J7AI-Sd{S%Zh5M*c*A5>7TaCW|f@v{!xr9cXoc;nNvPZ@0>3d zT;I}B=p`{*&MFpFsI(Bj1{$v5zP<1GM>pR^TbdVn>i)L`1e%h^MFoOt5EtdEO2pV{R7-i(c> zfXHW{)=_#pvZAvYxSUP#j1uFD)fD&CE=QS@0r*_WqZDY`Rl%NKl9}{JO AW&i*H literal 0 HcmV?d00001 diff --git a/windeps/lib/avformat.lib b/windeps/lib/avformat.lib new file mode 100644 index 0000000000000000000000000000000000000000..d50024467d2f8f77deaa8ac520d8884a9c5c634d GIT binary patch literal 210330 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 aQ@(70_FJ{ta$aHXXZdbfjGh;mE&l_+^;^^c literal 0 HcmV?d00001 -- 2.52.0