From 35bec59536a282a1d689868cc8e06e1e4a0b0e73 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 15 Jun 2011 18:01:04 +0200 Subject: [PATCH] ffmpegcolorspace: remove plugin --- configure.ac | 7 - docs/plugins/Makefile.am | 3 +- gst/ffmpegcolorspace/Makefile.am | 37 - gst/ffmpegcolorspace/avcodec.h | 285 -- gst/ffmpegcolorspace/dsputil.c | 45 - gst/ffmpegcolorspace/dsputil.h | 39 - gst/ffmpegcolorspace/ffmpegcolorspace.vcproj | 181 -- gst/ffmpegcolorspace/gstffmpegcodecmap.c | 1019 ------- gst/ffmpegcolorspace/gstffmpegcodecmap.h | 58 - gst/ffmpegcolorspace/gstffmpegcolorspace.c | 482 --- gst/ffmpegcolorspace/gstffmpegcolorspace.h | 63 - gst/ffmpegcolorspace/imgconvert.c | 4126 -------------------------- gst/ffmpegcolorspace/imgconvert_template.h | 2188 -------------- gst/ffmpegcolorspace/mem.c | 125 - gst/ffmpegcolorspace/utils.c | 159 - gst/playback/gstplaysink.c | 8 +- 16 files changed, 5 insertions(+), 8820 deletions(-) delete mode 100644 gst/ffmpegcolorspace/Makefile.am delete mode 100644 gst/ffmpegcolorspace/avcodec.h delete mode 100644 gst/ffmpegcolorspace/dsputil.c delete mode 100644 gst/ffmpegcolorspace/dsputil.h delete mode 100644 gst/ffmpegcolorspace/ffmpegcolorspace.vcproj delete mode 100644 gst/ffmpegcolorspace/gstffmpegcodecmap.c delete mode 100644 gst/ffmpegcolorspace/gstffmpegcodecmap.h delete mode 100644 gst/ffmpegcolorspace/gstffmpegcolorspace.c delete mode 100644 gst/ffmpegcolorspace/gstffmpegcolorspace.h delete mode 100644 gst/ffmpegcolorspace/imgconvert.c delete mode 100644 gst/ffmpegcolorspace/imgconvert_template.h delete mode 100644 gst/ffmpegcolorspace/mem.c delete mode 100644 gst/ffmpegcolorspace/utils.c diff --git a/configure.ac b/configure.ac index 08b7a1b..cb47a66 100644 --- a/configure.ac +++ b/configure.ac @@ -171,10 +171,6 @@ dnl *** checks for header files *** dnl check if we have ANSI C header files AC_HEADER_STDC -dnl used in gst/ffmpegcolorspace/mem.c -dnl FIXME: could be fixed by redefining av_malloc and av_free to GLib's -AC_CHECK_HEADERS([malloc.h]) - ac_cppflags_save="$CPPFLAGS" CPPFLAGS="`$PKG_CONFIG --cflags libxml-2.0`" AC_COMPILE_IFELSE( @@ -213,7 +209,6 @@ LIBS="$save_libs" dnl used in gst-libs/gst/pbutils and associated unit test AC_CHECK_HEADERS([process.h sys/types.h sys/wait.h sys/stat.h]) -dnl ffmpegcolorspace includes _stdint.h dnl also, Windows does not have long long AX_CREATE_STDINT_H @@ -425,7 +420,6 @@ AG_GST_CHECK_PLUGIN(audioconvert) AG_GST_CHECK_PLUGIN(audiorate) AG_GST_CHECK_PLUGIN(audiotestsrc) AG_GST_CHECK_PLUGIN(encoding) -AG_GST_CHECK_PLUGIN(ffmpegcolorspace) AG_GST_CHECK_PLUGIN(videoconvert) AG_GST_CHECK_PLUGIN(gdp) AG_GST_CHECK_PLUGIN(playback) @@ -864,7 +858,6 @@ gst/audiorate/Makefile gst/audiotestsrc/Makefile gst/encoding/Makefile gst/videoconvert/Makefile -gst/ffmpegcolorspace/Makefile gst/gdp/Makefile gst/playback/Makefile gst/audioresample/Makefile diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am index 0310568..f304621 100644 --- a/docs/plugins/Makefile.am +++ b/docs/plugins/Makefile.am @@ -64,7 +64,7 @@ CFILE_GLOB=$(DOC_SOURCE_DIR)/*/*/*.c SCANOBJ_DEPS = # Header files to ignore when scanning. -IGNORE_HFILES = avcodec.h gstffmpegcodecmap.h dsputil.h arch.h speex_resampler.h speex_resampler_wrapper.h fixed_arm4.h fixed_arm5e.h fixed_bfin.h fixed_debug.h fixed_generic.h resample_sse.h +IGNORE_HFILES = avcodec.h dsputil.h arch.h speex_resampler.h speex_resampler_wrapper.h fixed_arm4.h fixed_arm5e.h fixed_bfin.h fixed_debug.h fixed_generic.h resample_sse.h IGNORE_CFILES = utils.c mem.c imgconvert.c # we add all .h files of elements that have signals/args we want @@ -102,7 +102,6 @@ EXTRA_HFILES = \ $(top_srcdir)/gst/audioconvert/gstaudioconvert.h \ $(top_srcdir)/gst/audiotestsrc/gstaudiotestsrc.h \ $(top_srcdir)/gst/encoding/gstencodebin.h \ - $(top_srcdir)/gst/ffmpegcolorspace/gstffmpegcolorspace.h \ $(top_srcdir)/gst/gdp/gstgdpdepay.h \ $(top_srcdir)/gst/gdp/gstgdppay.h \ $(top_srcdir)/gst/playback/gstplay-enum.h \ diff --git a/gst/ffmpegcolorspace/Makefile.am b/gst/ffmpegcolorspace/Makefile.am deleted file mode 100644 index 2ada4c9..0000000 --- a/gst/ffmpegcolorspace/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -plugin_LTLIBRARIES = libgstffmpegcolorspace.la - -libgstffmpegcolorspace_la_SOURCES = \ - gstffmpegcolorspace.c \ - gstffmpegcodecmap.c \ - dsputil.c \ - mem.c \ - utils.c \ - imgconvert.c - -libgstffmpegcolorspace_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) -libgstffmpegcolorspace_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -libgstffmpegcolorspace_la_LIBADD = \ - $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \ - $(GST_BASE_LIBS) $(GST_LIBS) -libgstffmpegcolorspace_la_LIBTOOLFLAGS = --tag=disable-static - -noinst_HEADERS = \ - gstffmpegcolorspace.h \ - gstffmpegcodecmap.h \ - imgconvert_template.h \ - dsputil.h \ - avcodec.h - -Android.mk: Makefile.am $(BUILT_SOURCES) - androgenizer \ - -:PROJECT libgstffmpegcolorspace -:SHARED libgstffmpegcolorspace \ - -:TAGS eng debug \ - -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ - -:SOURCES $(libgstffmpegcolorspace_la_SOURCES) \ - -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstffmpegcolorspace_la_CFLAGS) \ - -:LDFLAGS $(libgstffmpegcolorspace_la_LDFLAGS) \ - $(libgstffmpegcolorspace_la_LIBADD) \ - -ldl \ - -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ - LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ - > $@ diff --git a/gst/ffmpegcolorspace/avcodec.h b/gst/ffmpegcolorspace/avcodec.h deleted file mode 100644 index 57f551c..0000000 --- a/gst/ffmpegcolorspace/avcodec.h +++ /dev/null @@ -1,285 +0,0 @@ -#ifndef AVCODEC_H -#define AVCODEC_H - -/** - * @file avcodec.h - * external api header. - */ - - -#ifdef __cplusplus -extern "C" { -#endif - -#include "_stdint.h" - -#include /* size_t */ - -#define FFMPEG_VERSION_INT 0x000409 -#define FFMPEG_VERSION "0.4.9-pre1" -#define LIBAVCODEC_BUILD 4728 - -#define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT -#define LIBAVCODEC_VERSION FFMPEG_VERSION - -#define AV_STRINGIFY(s) AV_TOSTRING(s) -#define AV_TOSTRING(s) #s -#define LIBAVCODEC_IDENT "FFmpeg" LIBAVCODEC_VERSION "b" AV_STRINGIFY(LIBAVCODEC_BUILD) - -enum CodecType { - CODEC_TYPE_UNKNOWN = -1, - CODEC_TYPE_VIDEO, - CODEC_TYPE_AUDIO, - CODEC_TYPE_DATA, -}; - -/* - * Pixel format. Notes: - * - * PIX_FMT_RGBA32 is handled in an endian-specific manner. A 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] and, is 1024 bytes long (256 4-byte entries) and is - * formatted the same as in PIX_FMT_RGBA32 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. - */ -enum PixelFormat { - PIX_FMT_YUV420P, ///< Planar YUV 4:2:0 (1 Cr & Cb sample per 2x2 Y samples) (I420) - PIX_FMT_NV12, ///< Packed YUV 4:2:0 (separate Y plane, interleaved Cb & Cr planes) - PIX_FMT_NV21, ///< Packed YUV 4:2:0 (separate Y plane, interleaved Cb & Cr planes) - PIX_FMT_YVU420P, ///< Planar YUV 4:2:0 (1 Cb & Cr sample per 2x2 Y samples) (YV12) - PIX_FMT_YUV422, ///< Packed pixel, Y0 Cb Y1 Cr - PIX_FMT_RGB24, ///< Packed pixel, 3 bytes per pixel, RGBRGB... - PIX_FMT_BGR24, ///< Packed pixel, 3 bytes per pixel, BGRBGR... - PIX_FMT_YUV422P, ///< Planar YUV 4:2:2 (1 Cr & Cb sample per 2x1 Y samples) - PIX_FMT_YUV444P, ///< Planar YUV 4:4:4 (1 Cr & Cb sample per 1x1 Y samples) - PIX_FMT_RGBA32, ///< Packed pixel, 4 bytes per pixel, BGRABGRA..., stored in cpu endianness - PIX_FMT_BGRA32, ///< Packed pixel, 4 bytes per pixel, ARGBARGB... - PIX_FMT_ARGB32, ///< Packed pixel, 4 bytes per pixel, ABGRABGR..., stored in cpu endianness - PIX_FMT_ABGR32, ///< Packed pixel, 4 bytes per pixel, RGBARGBA... - PIX_FMT_RGB32, ///< Packed pixel, 4 bytes per pixel, BGRxBGRx..., stored in cpu endianness - PIX_FMT_xRGB32, ///< Packed pixel, 4 bytes per pixel, xBGRxBGR..., stored in cpu endianness - PIX_FMT_BGR32, ///< Packed pixel, 4 bytes per pixel, xRGBxRGB... - PIX_FMT_BGRx32, ///< Packed pixel, 4 bytes per pixel, RGBxRGBx... - PIX_FMT_YUV410P, ///< Planar YUV 4:1:0 (1 Cr & Cb sample per 4x4 Y samples) - PIX_FMT_YVU410P, ///< Planar YVU 4:1:0 (1 Cr & Cb sample per 4x4 Y samples) - PIX_FMT_YUV411P, ///< Planar YUV 4:1:1 (1 Cr & Cb sample per 4x1 Y samples) - PIX_FMT_Y800, ///< 8 bit Y plane (range [16-235]) - PIX_FMT_Y16, ///< 16 bit Y plane (little endian) - PIX_FMT_RGB565, ///< always stored in cpu endianness - PIX_FMT_RGB555, ///< always stored in cpu endianness, most significant bit to 1 - PIX_FMT_GRAY8, - PIX_FMT_GRAY16_L, - PIX_FMT_GRAY16_B, - PIX_FMT_MONOWHITE, ///< 0 is white - PIX_FMT_MONOBLACK, ///< 0 is black - PIX_FMT_PAL8, ///< 8 bit with RGBA palette - PIX_FMT_YUVJ420P, ///< Planar YUV 4:2:0 full scale (jpeg) - PIX_FMT_YUVJ422P, ///< Planar YUV 4:2:2 full scale (jpeg) - PIX_FMT_YUVJ444P, ///< Planar YUV 4:4:4 full scale (jpeg) - PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing(xvmc_render.h) - PIX_FMT_XVMC_MPEG2_IDCT, - PIX_FMT_UYVY422, ///< Packed pixel, Cb Y0 Cr Y1 - PIX_FMT_YVYU422, ///< Packed pixel, Y0 Cr Y1 Cb - PIX_FMT_UYVY411, ///< Packed pixel, Cb Y0 Y1 Cr Y2 Y3 - PIX_FMT_V308, ///< Packed pixel, Y0 Cb Cr - - PIX_FMT_AYUV4444, ///< Packed pixel, A0 Y0 Cb Cr - PIX_FMT_YUVA420P, ///< Planar YUV 4:4:2:0 (1 Cr & Cb sample per 2x2 Y & A samples) (A420) - PIX_FMT_NB -}; - -/* currently unused, may be used if 24/32 bits samples ever supported */ -enum SampleFormat { - SAMPLE_FMT_S16 = 0, ///< signed 16 bits -}; - -/* thomas: extracted from imgconvert.c since it's also used in - * gstffmpegcodecmap.c */ - -/* start of extract */ - -#define FF_COLOR_RGB 0 /* RGB color space */ -#define FF_COLOR_GRAY 1 /* gray color space */ -#define FF_COLOR_YUV 2 /* YUV color space. 16 <= Y <= 235, 16 <= U, V <= 240 */ -#define FF_COLOR_YUV_JPEG 3 /* YUV color space. 0 <= Y <= 255, 0 <= U, V <= 255 */ - -#define FF_PIXEL_PLANAR 0 /* each channel has one component in AVPicture */ -#define FF_PIXEL_PACKED 1 /* only one components containing all the channels */ -#define FF_PIXEL_PALETTE 2 /* one components containing indexes for a palette */ - -typedef struct PixFmtInfo -{ - enum PixelFormat format; - const char *name; - uint8_t nb_channels; /* number of channels (including alpha) */ - uint8_t color_type; /* color type (see FF_COLOR_xxx constants) */ - uint8_t pixel_type; /* pixel storage type (see FF_PIXEL_xxx constants) */ - uint8_t is_alpha:1; /* true if alpha can be specified */ - uint8_t x_chroma_shift; /* X chroma subsampling factor is 2 ^ shift */ - uint8_t y_chroma_shift; /* Y chroma subsampling factor is 2 ^ shift */ - uint8_t depth; /* bit depth of the color components */ -} PixFmtInfo; - -PixFmtInfo * get_pix_fmt_info (enum PixelFormat format); -/* end of extract */ - -/** - * main external api structure. - */ -typedef struct AVCodecContext { - /* video only */ - /** - * frames per sec multiplied by frame_rate_base. - * for variable fps this is the precission, so if the timestamps - * can be specified in msec precssion then this is 1000*frame_rate_base - * - encoding: MUST be set by user - * - decoding: set by lavc. 0 or the frame_rate if available - */ - int frame_rate; - - /** - * frame_rate_base. - * for variable fps this is 1 - * - encoding: set by user. - * - decoding: set by lavc. - */ - - int frame_rate_base; - /** - * picture width / height. - * - encoding: MUST be set by user. - * - decoding: set by lavc. - * Note, for compatibility its possible to set this instead of - * coded_width/height before decoding - */ - int width, height; - - /** - * pixel format, see PIX_FMT_xxx. - * - encoding: FIXME: used by ffmpeg to decide whether an pix_fmt - * conversion is in order. This only works for - * codecs with one supported pix_fmt, we should - * do something for a generic case as well. - * - decoding: set by lavc. - */ - enum PixelFormat pix_fmt; - - /* audio only */ - int sample_rate; ///< samples per sec - int channels; - int sample_fmt; ///< sample format, currenly unused - - /** - * Palette control structure - * - encoding: ??? (no palette-enabled encoder yet) - * - decoding: set by user. - */ - struct AVPaletteControl *palctrl; -} AVCodecContext; - -/** - * 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 - int interlaced; -} AVPicture; - -/** - * AVPaletteControl - * This structure defines a method for communicating palette changes - * between and demuxer and a decoder. - */ -#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 a IBM VGA native format, the component - * data is probably 6 bits in size and needs to be scaled */ - unsigned int palette[AVPALETTE_COUNT]; - -} AVPaletteControl; - -int avpicture_get_size(int pix_fmt, int width, int height); - -void avcodec_get_chroma_sub_sample(int pix_fmt, int *h_shift, int *v_shift); -const char *avcodec_get_pix_fmt_name(int pix_fmt); -void avcodec_set_dimensions(AVCodecContext *s, int width, int height); -enum PixelFormat avcodec_get_pix_fmt(const char* name); - -#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) */ - -int avcodec_get_pix_fmt_loss(int dst_pix_fmt, int src_pix_fmt, - int has_alpha); -int avcodec_find_best_pix_fmt(int pix_fmt_mask, int src_pix_fmt, - int has_alpha, int *loss_ptr); - -#define FF_ALPHA_TRANSP 0x0001 /* image has some totally transparent pixels */ -#define FF_ALPHA_SEMI_TRANSP 0x0002 /* image has some transparent pixels */ -int img_get_alpha_info(const AVPicture *src, - int pix_fmt, int width, int height); - -/* convert among pixel formats */ -int img_convert(AVPicture *dst, int dst_pix_fmt, - const AVPicture *src, int pix_fmt, - int width, int height); - -void avcodec_init(void); - -void avcodec_get_context_defaults(AVCodecContext *s); -AVCodecContext *avcodec_alloc_context(void); - -/* memory */ -void *av_malloc(unsigned int size); -void *av_mallocz(unsigned int size); -void *av_realloc(void *ptr, unsigned int size); -void av_free(void *ptr); -char *av_strdup(const char *s); -void av_freep(void *ptr); -void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size); -/* for static data only */ -/* call av_free_static to release all staticaly allocated tables */ -void av_free_static(void); -void *av_mallocz_static(unsigned int size); - -/* endian macros */ -#if !defined(BE_16) || !defined(BE_32) || !defined(LE_16) || !defined(LE_32) -#define BE_16(x) ((((uint8_t*)(x))[0] << 8) | ((uint8_t*)(x))[1]) -#define BE_32(x) ((((uint8_t*)(x))[0] << 24) | \ - (((uint8_t*)(x))[1] << 16) | \ - (((uint8_t*)(x))[2] << 8) | \ - ((uint8_t*)(x))[3]) -#define LE_16(x) ((((uint8_t*)(x))[1] << 8) | ((uint8_t*)(x))[0]) -#define LE_32(x) ((((uint8_t*)(x))[3] << 24) | \ - (((uint8_t*)(x))[2] << 16) | \ - (((uint8_t*)(x))[1] << 8) | \ - ((uint8_t*)(x))[0]) -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* AVCODEC_H */ diff --git a/gst/ffmpegcolorspace/dsputil.c b/gst/ffmpegcolorspace/dsputil.c deleted file mode 100644 index f5689c0..0000000 --- a/gst/ffmpegcolorspace/dsputil.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * DSP utils - * Copyright (c) 2000, 2001 Fabrice Bellard. - * Copyright (c) 2002-2004 Michael Niedermayer - * - * This library 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 of the License, or (at your option) any later version. - * - * This library 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 this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * gmc & q-pel & 32/64 bit based MC by Michael Niedermayer - */ - -/** - * @file dsputil.c - * DSP utils - */ - -#include "avcodec.h" -#include "dsputil.h" - -uint8_t cropTbl[256 + 2 * MAX_NEG_CROP] = { 0, }; - -/* init static data */ -void -dsputil_static_init (void) -{ - int i; - - for (i = 0; i < 256; i++) - cropTbl[i + MAX_NEG_CROP] = i; - for (i = 0; i < MAX_NEG_CROP; i++) { - cropTbl[i] = 0; - cropTbl[i + MAX_NEG_CROP + 256] = 255; - } -} diff --git a/gst/ffmpegcolorspace/dsputil.h b/gst/ffmpegcolorspace/dsputil.h deleted file mode 100644 index 69475a3..0000000 --- a/gst/ffmpegcolorspace/dsputil.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * DSP utils - * Copyright (c) 2000, 2001, 2002 Fabrice Bellard. - * Copyright (c) 2002-2004 Michael Niedermayer - * - * This library 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 of the License, or (at your option) any later version. - * - * This library 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 this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/** - * @file dsputil.h - * DSP utils. - * note, many functions in here may use MMX which trashes the FPU state, it is - * absolutely necessary to call emms_c() between dsp & float/double code - */ - -#ifndef DSPUTIL_H -#define DSPUTIL_H - -/* pixel operations */ -#define MAX_NEG_CROP 1024 - -/* temporary */ -extern uint8_t cropTbl[256 + 2 * MAX_NEG_CROP]; - -void dsputil_static_init(void); - -#endif diff --git a/gst/ffmpegcolorspace/ffmpegcolorspace.vcproj b/gst/ffmpegcolorspace/ffmpegcolorspace.vcproj deleted file mode 100644 index fc5e7c6..0000000 --- a/gst/ffmpegcolorspace/ffmpegcolorspace.vcproj +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/gst/ffmpegcolorspace/gstffmpegcodecmap.c b/gst/ffmpegcolorspace/gstffmpegcodecmap.c deleted file mode 100644 index 2e73027..0000000 --- a/gst/ffmpegcolorspace/gstffmpegcodecmap.c +++ /dev/null @@ -1,1019 +0,0 @@ -/* GStreamer - * Copyright (C) <1999> Erik Walthinsen - * This file: - * Copyright (c) 2002-2004 Ronald Bultje - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -#include - -#include "avcodec.h" -#include "gstffmpegcodecmap.h" - -GST_DEBUG_CATEGORY_EXTERN (ffmpegcolorspace_debug); -#define GST_CAT_DEFAULT ffmpegcolorspace_debug - -static GstCaps * -gst_ff_vid_caps_new (AVCodecContext * context, - const char *mimetype, const char *fieldname, ...) - G_GNUC_NULL_TERMINATED; - static GstCaps *gst_ff_aud_caps_new (AVCodecContext * context, - const char *mimetype, const char *fieldname, ...) G_GNUC_NULL_TERMINATED; - -/* - * Read a palette from a caps. - */ - static void - gst_ffmpeg_get_palette (const GstCaps * caps, AVCodecContext * context) -{ - GstStructure *str = gst_caps_get_structure (caps, 0); - const GValue *palette_v; - - /* do we have a palette? */ - if ((palette_v = gst_structure_get_value (str, "palette_data")) && context) { - GstBuffer *palette; - - palette = gst_value_get_buffer (palette_v); - if (palette && gst_buffer_get_size (palette) >= 256 * 4) { - if (context->palctrl) - av_free (context->palctrl); - context->palctrl = av_malloc (sizeof (AVPaletteControl)); - context->palctrl->palette_changed = 1; - gst_buffer_extract (palette, 0, context->palctrl->palette, - AVPALETTE_SIZE); - } - } -} - -static void -gst_ffmpeg_set_palette (GstCaps * caps, AVCodecContext * context) -{ - if (context->palctrl) { - GstBuffer *palette = gst_buffer_new_and_alloc (256 * 4); - guint8 *data; - gsize size; - - data = gst_buffer_map (palette, &size, NULL, GST_MAP_WRITE); - memcpy (data, context->palctrl->palette, AVPALETTE_SIZE); - gst_buffer_unmap (palette, data, size); - - gst_caps_set_simple (caps, "palette_data", GST_TYPE_BUFFER, palette, NULL); - gst_buffer_unref (palette); - } -} - -/* this function creates caps with fixed or unfixed width/height - * properties depending on whether we've got a context. - * - * See below for why we use this. - * - * We should actually do this stuff at the end, like in riff-media.c, - * but I'm too lazy today. Maybe later. - */ - -static GstCaps * -gst_ff_vid_caps_new (AVCodecContext * context, const char *mimetype, - const char *fieldname, ...) -{ - GstStructure *structure = NULL; - GstCaps *caps = NULL; - va_list var_args; - - if (context != NULL) { - caps = gst_caps_new_simple (mimetype, - "width", G_TYPE_INT, context->width, - "height", G_TYPE_INT, context->height, - "framerate", GST_TYPE_FRACTION, - (gint) context->frame_rate, (gint) context->frame_rate_base, NULL); - } else { - caps = gst_caps_new_simple (mimetype, - "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, - "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, - "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); - } - - structure = gst_caps_get_structure (caps, 0); - - if (structure) { - va_start (var_args, fieldname); - gst_structure_set_valist (structure, fieldname, var_args); - va_end (var_args); - } - - return caps; -} - -/* same for audio - now with channels/sample rate - */ - -static GstCaps * -gst_ff_aud_caps_new (AVCodecContext * context, const char *mimetype, - const char *fieldname, ...) -{ - GstCaps *caps = NULL; - GstStructure *structure = NULL; - va_list var_args; - - if (context != NULL) { - caps = gst_caps_new_simple (mimetype, - "rate", G_TYPE_INT, context->sample_rate, - "channels", G_TYPE_INT, context->channels, NULL); - } else { - caps = gst_caps_new_simple (mimetype, NULL); - } - - structure = gst_caps_get_structure (caps, 0); - - if (structure) { - va_start (var_args, fieldname); - gst_structure_set_valist (structure, fieldname, var_args); - va_end (var_args); - } - - return caps; -} - -/* Convert a FFMPEG Pixel Format and optional AVCodecContext - * to a GstCaps. If the context is ommitted, no fixed values - * for video/audio size will be included in the GstCaps - * - * See below for usefulness - */ - -static GstCaps * -gst_ffmpeg_pixfmt_to_caps (enum PixelFormat pix_fmt, AVCodecContext * context) -{ - GstCaps *caps = NULL; - - int bpp = 0, depth = 0, endianness = 0; - gulong g_mask = 0, r_mask = 0, b_mask = 0, a_mask = 0; - guint32 fmt = 0; - - switch (pix_fmt) { - case PIX_FMT_YUV420P: - fmt = GST_MAKE_FOURCC ('I', '4', '2', '0'); - break; - case PIX_FMT_YUVA420P: - fmt = GST_MAKE_FOURCC ('A', '4', '2', '0'); - break; - case PIX_FMT_NV12: - fmt = GST_MAKE_FOURCC ('N', 'V', '1', '2'); - break; - case PIX_FMT_NV21: - fmt = GST_MAKE_FOURCC ('N', 'V', '2', '1'); - break; - case PIX_FMT_YVU420P: - fmt = GST_MAKE_FOURCC ('Y', 'V', '1', '2'); - break; - case PIX_FMT_YUV422: - fmt = GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'); - break; - case PIX_FMT_UYVY422: - fmt = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'); - break; - case PIX_FMT_YVYU422: - fmt = GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'); - break; - case PIX_FMT_UYVY411: - fmt = GST_MAKE_FOURCC ('I', 'Y', 'U', '1'); - break; - case PIX_FMT_RGB24: - bpp = depth = 24; - endianness = G_BIG_ENDIAN; - r_mask = 0xff0000; - g_mask = 0x00ff00; - b_mask = 0x0000ff; - break; - case PIX_FMT_BGR24: - bpp = depth = 24; - endianness = G_BIG_ENDIAN; - r_mask = 0x0000ff; - g_mask = 0x00ff00; - b_mask = 0xff0000; - break; - case PIX_FMT_YUV422P: - fmt = GST_MAKE_FOURCC ('Y', '4', '2', 'B'); - break; - case PIX_FMT_YUV444P: - fmt = GST_MAKE_FOURCC ('Y', '4', '4', '4'); - break; - case PIX_FMT_RGB32: - bpp = 32; - depth = 24; - endianness = G_BIG_ENDIAN; -#if (G_BYTE_ORDER == G_BIG_ENDIAN) - r_mask = 0x00ff0000; - g_mask = 0x0000ff00; - b_mask = 0x000000ff; -#else - r_mask = 0x0000ff00; - g_mask = 0x00ff0000; - b_mask = 0xff000000; -#endif - break; - case PIX_FMT_BGR32: - bpp = 32; - depth = 24; - endianness = G_BIG_ENDIAN; -#if (G_BYTE_ORDER == G_BIG_ENDIAN) - r_mask = 0x0000ff00; - g_mask = 0x00ff0000; - b_mask = 0xff000000; -#else - r_mask = 0x00ff0000; - g_mask = 0x0000ff00; - b_mask = 0x000000ff; -#endif - break; - case PIX_FMT_xRGB32: - bpp = 32; - depth = 24; - endianness = G_BIG_ENDIAN; -#if (G_BYTE_ORDER == G_BIG_ENDIAN) - r_mask = 0xff000000; - g_mask = 0x00ff0000; - b_mask = 0x0000ff00; -#else - r_mask = 0x000000ff; - g_mask = 0x0000ff00; - b_mask = 0x00ff0000; -#endif - break; - case PIX_FMT_BGRx32: - bpp = 32; - depth = 24; - endianness = G_BIG_ENDIAN; -#if (G_BYTE_ORDER == G_BIG_ENDIAN) - r_mask = 0x000000ff; - g_mask = 0x0000ff00; - b_mask = 0x00ff0000; -#else - r_mask = 0xff000000; - g_mask = 0x00ff0000; - b_mask = 0x0000ff00; -#endif - break; - case PIX_FMT_RGBA32: - bpp = 32; - depth = 32; - endianness = G_BIG_ENDIAN; -#if (G_BYTE_ORDER == G_BIG_ENDIAN) - r_mask = 0x00ff0000; - g_mask = 0x0000ff00; - b_mask = 0x000000ff; - a_mask = 0xff000000; -#else - r_mask = 0x0000ff00; - g_mask = 0x00ff0000; - b_mask = 0xff000000; - a_mask = 0x000000ff; -#endif - break; - case PIX_FMT_BGRA32: - bpp = 32; - depth = 32; - endianness = G_BIG_ENDIAN; -#if (G_BYTE_ORDER == G_BIG_ENDIAN) - r_mask = 0x0000ff00; - g_mask = 0x00ff0000; - b_mask = 0xff000000; - a_mask = 0x000000ff; -#else - r_mask = 0x00ff0000; - g_mask = 0x0000ff00; - b_mask = 0x000000ff; - a_mask = 0xff000000; -#endif - break; - case PIX_FMT_ARGB32: - bpp = 32; - depth = 32; - endianness = G_BIG_ENDIAN; -#if (G_BYTE_ORDER == G_BIG_ENDIAN) - r_mask = 0xff000000; - g_mask = 0x00ff0000; - b_mask = 0x0000ff00; - a_mask = 0x000000ff; -#else - r_mask = 0x000000ff; - g_mask = 0x0000ff00; - b_mask = 0x00ff0000; - a_mask = 0xff000000; -#endif - break; - case PIX_FMT_ABGR32: - bpp = 32; - depth = 32; - endianness = G_BIG_ENDIAN; -#if (G_BYTE_ORDER == G_BIG_ENDIAN) - r_mask = 0x000000ff; - g_mask = 0x0000ff00; - b_mask = 0x00ff0000; - a_mask = 0xff000000; -#else - r_mask = 0xff000000; - g_mask = 0x00ff0000; - b_mask = 0x0000ff00; - a_mask = 0x000000ff; -#endif - break; - case PIX_FMT_YUV410P: - fmt = GST_MAKE_FOURCC ('Y', 'U', 'V', '9'); - break; - case PIX_FMT_YVU410P: - fmt = GST_MAKE_FOURCC ('Y', 'V', 'U', '9'); - break; - case PIX_FMT_YUV411P: - fmt = GST_MAKE_FOURCC ('Y', '4', '1', 'B'); - break; - case PIX_FMT_Y800:{ - GstCaps *tmp; - - caps = gst_ff_vid_caps_new (context, "video/x-raw-yuv", - "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('Y', '8', '0', '0'), - NULL); - tmp = - gst_ff_vid_caps_new (context, "video/x-raw-yuv", "format", - GST_TYPE_FOURCC, GST_MAKE_FOURCC ('Y', '8', ' ', ' '), NULL); - gst_caps_append (caps, tmp); - tmp = gst_ff_vid_caps_new (context, "video/x-raw-yuv", - "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('G', 'R', 'E', 'Y'), - NULL); - gst_caps_append (caps, tmp); - break; - } - case PIX_FMT_Y16: - fmt = GST_MAKE_FOURCC ('Y', '1', '6', ' '); - break; - case PIX_FMT_RGB565: - bpp = depth = 16; - endianness = G_BYTE_ORDER; - r_mask = 0xf800; - g_mask = 0x07e0; - b_mask = 0x001f; - break; - case PIX_FMT_RGB555: - bpp = 16; - depth = 15; - endianness = G_BYTE_ORDER; - r_mask = 0x7c00; - g_mask = 0x03e0; - b_mask = 0x001f; - break; - case PIX_FMT_PAL8: - bpp = depth = 8; - endianness = G_BYTE_ORDER; - break; - case PIX_FMT_V308: - fmt = GST_MAKE_FOURCC ('v', '3', '0', '8'); - break; - case PIX_FMT_AYUV4444: - fmt = GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'); - break; - case PIX_FMT_GRAY8: - bpp = depth = 8; - caps = gst_ff_vid_caps_new (context, "video/x-raw-gray", - "bpp", G_TYPE_INT, bpp, "depth", G_TYPE_INT, depth, NULL); - break; - case PIX_FMT_GRAY16_L: - bpp = depth = 16; - caps = gst_ff_vid_caps_new (context, "video/x-raw-gray", - "bpp", G_TYPE_INT, bpp, "depth", G_TYPE_INT, depth, - "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, NULL); - break; - case PIX_FMT_GRAY16_B: - bpp = depth = 16; - caps = gst_ff_vid_caps_new (context, "video/x-raw-gray", - "bpp", G_TYPE_INT, bpp, "depth", G_TYPE_INT, depth, - "endianness", G_TYPE_INT, G_BIG_ENDIAN, NULL); - break; - default: - /* give up ... */ - break; - } - - if (caps == NULL) { - if (bpp != 0) { - if (a_mask != 0) { - caps = gst_ff_vid_caps_new (context, "video/x-raw-rgb", - "bpp", G_TYPE_INT, bpp, - "depth", G_TYPE_INT, depth, - "red_mask", G_TYPE_INT, r_mask, - "green_mask", G_TYPE_INT, g_mask, - "blue_mask", G_TYPE_INT, b_mask, - "alpha_mask", G_TYPE_INT, a_mask, - "endianness", G_TYPE_INT, endianness, NULL); - } else if (r_mask != 0) { - caps = gst_ff_vid_caps_new (context, "video/x-raw-rgb", - "bpp", G_TYPE_INT, bpp, - "depth", G_TYPE_INT, depth, - "red_mask", G_TYPE_INT, r_mask, - "green_mask", G_TYPE_INT, g_mask, - "blue_mask", G_TYPE_INT, b_mask, - "endianness", G_TYPE_INT, endianness, NULL); - } else { - caps = gst_ff_vid_caps_new (context, "video/x-raw-rgb", - "bpp", G_TYPE_INT, bpp, - "depth", G_TYPE_INT, depth, - "endianness", G_TYPE_INT, endianness, NULL); - if (context && context->pix_fmt == PIX_FMT_PAL8) { - gst_ffmpeg_set_palette (caps, context); - } - } - } else if (fmt) { - caps = gst_ff_vid_caps_new (context, "video/x-raw-yuv", - "format", GST_TYPE_FOURCC, fmt, NULL); - } - } - - if (caps != NULL) { - GST_DEBUG ("caps for pix_fmt=%d: %" GST_PTR_FORMAT, pix_fmt, caps); - } else { - GST_LOG ("No caps found for pix_fmt=%d", pix_fmt); - } - - return caps; -} - -/* Convert a FFMPEG Sample Format and optional AVCodecContext - * to a GstCaps. If the context is ommitted, no fixed values - * for video/audio size will be included in the GstCaps - * - * See below for usefulness - */ - -static GstCaps * -gst_ffmpeg_smpfmt_to_caps (enum SampleFormat sample_fmt, - AVCodecContext * context) -{ - GstCaps *caps = NULL; - - int bpp = 0; - gboolean signedness = FALSE; - - switch (sample_fmt) { - case SAMPLE_FMT_S16: - signedness = TRUE; - bpp = 16; - break; - - default: - /* .. */ - break; - } - - if (bpp) { - caps = gst_ff_aud_caps_new (context, "audio/x-raw-int", - "signed", G_TYPE_BOOLEAN, signedness, - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "width", G_TYPE_INT, bpp, "depth", G_TYPE_INT, bpp, NULL); - } - - if (caps != NULL) { - GST_DEBUG ("caps for sample_fmt=%d: %" GST_PTR_FORMAT, sample_fmt, caps); - } else { - GST_LOG ("No caps found for sample_fmt=%d", sample_fmt); - } - - return caps; -} - -/* Convert a FFMPEG codec Type and optional AVCodecContext - * to a GstCaps. If the context is ommitted, no fixed values - * for video/audio size will be included in the GstCaps - * - * CodecType is primarily meant for uncompressed data GstCaps! - */ - -GstCaps * -gst_ffmpegcsp_codectype_to_caps (enum CodecType codec_type, - AVCodecContext * context) -{ - GstCaps *caps; - - switch (codec_type) { - case CODEC_TYPE_VIDEO: - if (context) { - caps = gst_ffmpeg_pixfmt_to_caps (context->pix_fmt, - context->width == -1 ? NULL : context); - } else { - GstCaps *temp; - enum PixelFormat i; - - caps = gst_caps_new_empty (); - for (i = 0; i < PIX_FMT_NB; i++) { - temp = gst_ffmpeg_pixfmt_to_caps (i, NULL); - if (temp != NULL) { - gst_caps_append (caps, temp); - } - } - } - break; - - case CODEC_TYPE_AUDIO: - if (context) { - caps = gst_ffmpeg_smpfmt_to_caps (context->sample_fmt, context); - } else { - GstCaps *temp; - enum SampleFormat i; - - caps = gst_caps_new_empty (); - for (i = 0; i <= SAMPLE_FMT_S16; i++) { - temp = gst_ffmpeg_smpfmt_to_caps (i, NULL); - if (temp != NULL) { - gst_caps_append (caps, temp); - } - } - } - break; - - default: - /* .. */ - caps = NULL; - break; - } - - return caps; -} - -/* Convert a GstCaps (audio/raw) to a FFMPEG SampleFmt - * and other audio properties in a AVCodecContext. - * - * For usefulness, see below - */ - -static void -gst_ffmpeg_caps_to_smpfmt (const GstCaps * caps, - AVCodecContext * context, gboolean raw) -{ - GstStructure *structure; - gint depth = 0, width = 0, endianness = 0; - gboolean signedness = FALSE; - - g_return_if_fail (gst_caps_get_size (caps) == 1); - structure = gst_caps_get_structure (caps, 0); - - gst_structure_get_int (structure, "channels", &context->channels); - gst_structure_get_int (structure, "rate", &context->sample_rate); - - if (!raw) - return; - - if (gst_structure_get_int (structure, "width", &width) && - gst_structure_get_int (structure, "depth", &depth) && - gst_structure_get_boolean (structure, "signed", &signedness) && - gst_structure_get_int (structure, "endianness", &endianness)) { - if (width == 16 && depth == 16 && - endianness == G_BYTE_ORDER && signedness == TRUE) { - context->sample_fmt = SAMPLE_FMT_S16; - } - } -} - - -/* Convert a GstCaps (video/raw) to a FFMPEG PixFmt - * and other video properties in a AVCodecContext. - * - * For usefulness, see below - */ - -static void -gst_ffmpeg_caps_to_pixfmt (const GstCaps * caps, - AVCodecContext * context, gboolean raw) -{ - GstStructure *structure; - const GValue *fps; - gboolean ret; - - g_return_if_fail (gst_caps_get_size (caps) == 1); - structure = gst_caps_get_structure (caps, 0); - - ret = gst_structure_get_int (structure, "width", &context->width); - ret &= gst_structure_get_int (structure, "height", &context->height); - g_return_if_fail (ret == TRUE); - - fps = gst_structure_get_value (structure, "framerate"); - g_return_if_fail (GST_VALUE_HOLDS_FRACTION (fps)); - - /* framerate does not really matter */ - context->frame_rate = gst_value_get_fraction_numerator (fps); - context->frame_rate_base = gst_value_get_fraction_denominator (fps); - - if (!raw) - return; - - if (gst_structure_has_name (structure, "video/x-raw-yuv")) { - guint32 fourcc; - - if (gst_structure_get_fourcc (structure, "format", &fourcc)) { - switch (fourcc) { - case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): - context->pix_fmt = PIX_FMT_YUV422; - break; - case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): - context->pix_fmt = PIX_FMT_UYVY422; - break; - case GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'): - context->pix_fmt = PIX_FMT_YVYU422; - break; - case GST_MAKE_FOURCC ('I', 'Y', 'U', '1'): - context->pix_fmt = PIX_FMT_UYVY411; - break; - case GST_MAKE_FOURCC ('I', '4', '2', '0'): - context->pix_fmt = PIX_FMT_YUV420P; - break; - case GST_MAKE_FOURCC ('A', '4', '2', '0'): - context->pix_fmt = PIX_FMT_YUVA420P; - break; - case GST_MAKE_FOURCC ('N', 'V', '1', '2'): - context->pix_fmt = PIX_FMT_NV12; - break; - case GST_MAKE_FOURCC ('N', 'V', '2', '1'): - context->pix_fmt = PIX_FMT_NV21; - break; - case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): - context->pix_fmt = PIX_FMT_YVU420P; - break; - case GST_MAKE_FOURCC ('Y', '4', '1', 'B'): - context->pix_fmt = PIX_FMT_YUV411P; - break; - case GST_MAKE_FOURCC ('Y', '4', '2', 'B'): - context->pix_fmt = PIX_FMT_YUV422P; - break; - case GST_MAKE_FOURCC ('Y', 'U', 'V', '9'): - context->pix_fmt = PIX_FMT_YUV410P; - break; - case GST_MAKE_FOURCC ('Y', 'V', 'U', '9'): - context->pix_fmt = PIX_FMT_YVU410P; - break; - case GST_MAKE_FOURCC ('v', '3', '0', '8'): - context->pix_fmt = PIX_FMT_V308; - break; - case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'): - context->pix_fmt = PIX_FMT_AYUV4444; - break; - case GST_MAKE_FOURCC ('Y', '4', '4', '4'): - context->pix_fmt = PIX_FMT_YUV444P; - break; - case GST_MAKE_FOURCC ('Y', '8', '0', '0'): - case GST_MAKE_FOURCC ('Y', '8', ' ', ' '): - case GST_MAKE_FOURCC ('G', 'R', 'E', 'Y'): - context->pix_fmt = PIX_FMT_Y800; - break; - case GST_MAKE_FOURCC ('Y', '1', '6', ' '): - context->pix_fmt = PIX_FMT_Y16; - break; - } - } - } else if (gst_structure_has_name (structure, "video/x-raw-rgb")) { - gint bpp = 0, rmask = 0, endianness = 0, amask = 0, depth = 0; - - if (gst_structure_get_int (structure, "bpp", &bpp) && - gst_structure_get_int (structure, "endianness", &endianness)) { - if (gst_structure_get_int (structure, "red_mask", &rmask)) { - switch (bpp) { - case 32: - if (gst_structure_get_int (structure, "alpha_mask", &amask)) { -#if (G_BYTE_ORDER == G_BIG_ENDIAN) - if (rmask == 0x0000ff00) - context->pix_fmt = PIX_FMT_BGRA32; - else if (rmask == 0x00ff0000) - context->pix_fmt = PIX_FMT_RGBA32; - else if (rmask == 0xff000000) - context->pix_fmt = PIX_FMT_ARGB32; - else // if (r_mask = 0x000000ff) - context->pix_fmt = PIX_FMT_ABGR32; -#else - if (rmask == 0x00ff0000) - context->pix_fmt = PIX_FMT_BGRA32; - else if (rmask == 0x0000ff00) - context->pix_fmt = PIX_FMT_RGBA32; - else if (rmask == 0x000000ff) - context->pix_fmt = PIX_FMT_ARGB32; - else // if (rmask == 0xff000000) - context->pix_fmt = PIX_FMT_ABGR32; -#endif - } else { -#if (G_BYTE_ORDER == G_BIG_ENDIAN) - if (rmask == 0x00ff0000) - context->pix_fmt = PIX_FMT_RGB32; - else if (rmask == 0x0000ff00) - context->pix_fmt = PIX_FMT_BGR32; - else if (rmask == 0xff000000) - context->pix_fmt = PIX_FMT_xRGB32; - else // if (rmask == 0x000000ff) - context->pix_fmt = PIX_FMT_BGRx32; -#else - if (rmask == 0x0000ff00) - context->pix_fmt = PIX_FMT_RGB32; - else if (rmask == 0x00ff0000) - context->pix_fmt = PIX_FMT_BGR32; - else if (rmask == 0x000000ff) - context->pix_fmt = PIX_FMT_xRGB32; - else // if (rmask == 0xff000000) - context->pix_fmt = PIX_FMT_BGRx32; -#endif - } - break; - case 24: - if (rmask == 0x0000FF) - context->pix_fmt = PIX_FMT_BGR24; - else - context->pix_fmt = PIX_FMT_RGB24; - break; - case 16: - if (endianness == G_BYTE_ORDER) { - context->pix_fmt = PIX_FMT_RGB565; - if (gst_structure_get_int (structure, "depth", &depth)) { - if (depth == 15) - context->pix_fmt = PIX_FMT_RGB555; - } - } - break; - case 15: - if (endianness == G_BYTE_ORDER) - context->pix_fmt = PIX_FMT_RGB555; - break; - default: - /* nothing */ - break; - } - } else { - if (bpp == 8) { - context->pix_fmt = PIX_FMT_PAL8; - gst_ffmpeg_get_palette (caps, context); - } - } - } - } else if (gst_structure_has_name (structure, "video/x-raw-gray")) { - gint bpp = 0; - - if (gst_structure_get_int (structure, "bpp", &bpp)) { - switch (bpp) { - case 8: - context->pix_fmt = PIX_FMT_GRAY8; - break; - case 16:{ - gint endianness = 0; - - if (gst_structure_get_int (structure, "endianness", &endianness)) { - if (endianness == G_LITTLE_ENDIAN) - context->pix_fmt = PIX_FMT_GRAY16_L; - else if (endianness == G_BIG_ENDIAN) - context->pix_fmt = PIX_FMT_GRAY16_B; - } - } - break; - } - } - } -} - -/* Convert a GstCaps and a FFMPEG codec Type to a - * AVCodecContext. If the context is ommitted, no fixed values - * for video/audio size will be included in the context - * - * CodecType is primarily meant for uncompressed data GstCaps! - */ - -void -gst_ffmpegcsp_caps_with_codectype (enum CodecType type, - const GstCaps * caps, AVCodecContext * context) -{ - if (context == NULL) - return; - - switch (type) { - case CODEC_TYPE_VIDEO: - gst_ffmpeg_caps_to_pixfmt (caps, context, TRUE); - break; - - case CODEC_TYPE_AUDIO: - gst_ffmpeg_caps_to_smpfmt (caps, context, TRUE); - break; - - default: - /* unknown */ - break; - } -} - -#define GEN_MASK(x) ((1<<(x))-1) -#define ROUND_UP_X(v,x) (((v) + GEN_MASK(x)) & ~GEN_MASK(x)) -#define DIV_ROUND_UP_X(v,x) (((v) + GEN_MASK(x)) >> (x)) - -/* - * Fill in pointers to memory in a AVPicture, where - * everything is aligned by 4 (as required by X). - * This is mostly a copy from imgconvert.c with some - * small changes. - */ -int -gst_ffmpegcsp_avpicture_fill (AVPicture * picture, - uint8_t * ptr, enum PixelFormat pix_fmt, int width, int height, - int interlaced) -{ - int size, w2, h2, size2; - int stride, stride2; - PixFmtInfo *pinfo; - - pinfo = get_pix_fmt_info (pix_fmt); - - picture->interlaced = interlaced; - - switch (pix_fmt) { - case PIX_FMT_YUV420P: - case PIX_FMT_YUV422P: - case PIX_FMT_YUV444P: - case PIX_FMT_YUV410P: - case PIX_FMT_YUV411P: - case PIX_FMT_YUVJ420P: - case PIX_FMT_YUVJ422P: - case PIX_FMT_YUVJ444P: - stride = GST_ROUND_UP_4 (width); - h2 = ROUND_UP_X (height, pinfo->y_chroma_shift); - size = stride * h2; - w2 = DIV_ROUND_UP_X (width, pinfo->x_chroma_shift); - stride2 = GST_ROUND_UP_4 (w2); - h2 = DIV_ROUND_UP_X (height, pinfo->y_chroma_shift); - size2 = stride2 * h2; - picture->data[0] = ptr; - picture->data[1] = picture->data[0] + size; - picture->data[2] = picture->data[1] + size2; - picture->linesize[0] = stride; - picture->linesize[1] = stride2; - picture->linesize[2] = stride2; - return size + 2 * size2; - /* PIX_FMT_YVU420P = YV12: same as PIX_FMT_YUV420P, but - * with U and V plane swapped. Strides as in videotestsrc */ - case PIX_FMT_YUVA420P: - stride = GST_ROUND_UP_4 (width); - h2 = ROUND_UP_X (height, pinfo->y_chroma_shift); - size = stride * h2; - w2 = DIV_ROUND_UP_X (width, pinfo->x_chroma_shift); - stride2 = GST_ROUND_UP_4 (w2); - h2 = DIV_ROUND_UP_X (height, pinfo->y_chroma_shift); - size2 = stride2 * h2; - picture->data[0] = ptr; - picture->data[1] = picture->data[0] + size; - picture->data[2] = picture->data[1] + size2; - picture->data[3] = picture->data[2] + size2; - picture->linesize[0] = stride; - picture->linesize[1] = stride2; - picture->linesize[2] = stride2; - picture->linesize[3] = stride; - return 2 * size + 2 * size2; - case PIX_FMT_YVU410P: - case PIX_FMT_YVU420P: - stride = GST_ROUND_UP_4 (width); - h2 = ROUND_UP_X (height, pinfo->y_chroma_shift); - size = stride * h2; - w2 = DIV_ROUND_UP_X (width, pinfo->x_chroma_shift); - stride2 = GST_ROUND_UP_4 (w2); - h2 = DIV_ROUND_UP_X (height, pinfo->y_chroma_shift); - size2 = stride2 * h2; - picture->data[0] = ptr; - picture->data[2] = picture->data[0] + size; - picture->data[1] = picture->data[2] + size2; - picture->linesize[0] = stride; - picture->linesize[1] = stride2; - picture->linesize[2] = stride2; - return size + 2 * size2; - case PIX_FMT_NV12: - case PIX_FMT_NV21: - stride = GST_ROUND_UP_4 (width); - h2 = ROUND_UP_X (height, pinfo->y_chroma_shift); - size = stride * h2; - w2 = 2 * DIV_ROUND_UP_X (width, pinfo->x_chroma_shift); - stride2 = GST_ROUND_UP_4 (w2); - h2 = DIV_ROUND_UP_X (height, pinfo->y_chroma_shift); - size2 = stride2 * h2; - picture->data[0] = ptr; - picture->data[1] = picture->data[0] + size; - picture->data[2] = NULL; - picture->linesize[0] = stride; - picture->linesize[1] = stride2; - picture->linesize[2] = 0; - return size + size2; - case PIX_FMT_RGB24: - case PIX_FMT_BGR24: - stride = GST_ROUND_UP_4 (width * 3); - size = stride * height; - picture->data[0] = ptr; - picture->data[1] = NULL; - picture->data[2] = NULL; - picture->linesize[0] = stride; - return size; - case PIX_FMT_AYUV4444: - case PIX_FMT_RGB32: - case PIX_FMT_RGBA32: - case PIX_FMT_ARGB32: - case PIX_FMT_BGR32: - case PIX_FMT_BGRA32: - case PIX_FMT_ABGR32: - case PIX_FMT_xRGB32: - case PIX_FMT_BGRx32: - stride = width * 4; - size = stride * height; - picture->data[0] = ptr; - picture->data[1] = NULL; - picture->data[2] = NULL; - picture->linesize[0] = stride; - return size; - case PIX_FMT_RGB555: - case PIX_FMT_RGB565: - case PIX_FMT_YUV422: - case PIX_FMT_UYVY422: - case PIX_FMT_YVYU422: - stride = GST_ROUND_UP_4 (width * 2); - size = stride * height; - picture->data[0] = ptr; - picture->data[1] = NULL; - picture->data[2] = NULL; - picture->linesize[0] = stride; - return size; - case PIX_FMT_V308: - stride = GST_ROUND_UP_4 (width * 3); - size = stride * height; - picture->data[0] = ptr; - picture->data[1] = NULL; - picture->data[2] = NULL; - picture->linesize[0] = stride; - return size; - case PIX_FMT_UYVY411: - stride = - GST_ROUND_UP_4 (GST_ROUND_UP_4 (width) + GST_ROUND_UP_4 (width) / 2); - size = stride * height; - picture->data[0] = ptr; - picture->data[1] = NULL; - picture->data[2] = NULL; - picture->linesize[0] = stride; - return size; - case PIX_FMT_Y800: - case PIX_FMT_GRAY8: - stride = GST_ROUND_UP_4 (width); - size = stride * height; - picture->data[0] = ptr; - picture->data[1] = NULL; - picture->data[2] = NULL; - picture->linesize[0] = stride; - return size; - case PIX_FMT_Y16: - case PIX_FMT_GRAY16_L: - case PIX_FMT_GRAY16_B: - stride = GST_ROUND_UP_4 (width * 2); - size = stride * height; - picture->data[0] = ptr; - picture->data[1] = NULL; - picture->data[2] = NULL; - picture->linesize[0] = stride; - return size; - case PIX_FMT_MONOWHITE: - case PIX_FMT_MONOBLACK: - stride = GST_ROUND_UP_4 ((width + 7) >> 3); - size = stride * height; - picture->data[0] = ptr; - picture->data[1] = NULL; - picture->data[2] = NULL; - picture->linesize[0] = stride; - return size; - case PIX_FMT_PAL8: - /* already forced to be with stride, so same result as other function */ - stride = GST_ROUND_UP_4 (width); - size = stride * height; - picture->data[0] = ptr; - picture->data[1] = ptr + size; /* palette is stored here as 256 32 bit words */ - picture->data[2] = NULL; - picture->linesize[0] = stride; - picture->linesize[1] = 4; - return size + 256 * 4; - default: - picture->data[0] = NULL; - picture->data[1] = NULL; - picture->data[2] = NULL; - picture->data[3] = NULL; - return -1; - } - - return 0; -} diff --git a/gst/ffmpegcolorspace/gstffmpegcodecmap.h b/gst/ffmpegcolorspace/gstffmpegcodecmap.h deleted file mode 100644 index 077fe3f..0000000 --- a/gst/ffmpegcolorspace/gstffmpegcodecmap.h +++ /dev/null @@ -1,58 +0,0 @@ -/* GStreamer - * Copyright (C) <1999> Erik Walthinsen - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GST_FFMPEG_CODECMAP_H__ -#define __GST_FFMPEG_CODECMAP_H__ - -#include "avcodec.h" -#include - -/* - * _codectype_to_caps () gets the GstCaps that belongs to - * a certain CodecType for a pad with uncompressed data. - */ - -GstCaps * -gst_ffmpegcsp_codectype_to_caps (enum CodecType codec_type, - AVCodecContext *context); - -/* - * caps_with_codectype () transforms a GstCaps that belongs to - * a pad for uncompressed data to a filled-in context. - */ - -void -gst_ffmpegcsp_caps_with_codectype (enum CodecType type, - const GstCaps *caps, - AVCodecContext *context); - -/* - * Fill in pointers in an AVPicture, aligned by 4 (required by X). - */ - -int -gst_ffmpegcsp_avpicture_fill (AVPicture * picture, - uint8_t * ptr, - enum PixelFormat pix_fmt, - int width, - int height, - int interlaced); - -#endif /* __GST_FFMPEG_CODECMAP_H__ */ - diff --git a/gst/ffmpegcolorspace/gstffmpegcolorspace.c b/gst/ffmpegcolorspace/gstffmpegcolorspace.c deleted file mode 100644 index 9c825b0..0000000 --- a/gst/ffmpegcolorspace/gstffmpegcolorspace.c +++ /dev/null @@ -1,482 +0,0 @@ -/* GStreamer - * Copyright (C) <1999> Erik Walthinsen - * This file: - * Copyright (C) 2003 Ronald Bultje - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/** - * SECTION:element-ffmpegcolorspace - * - * Convert video frames between a great variety of colorspace formats. - * - * - * Example launch line - * |[ - * gst-launch -v videotestsrc ! video/x-raw-yuv,format=\(fourcc\)YUY2 ! ffmpegcolorspace ! ximagesink - * ]| - * - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include "gstffmpegcolorspace.h" -#include "gstffmpegcodecmap.h" -#include - -GST_DEBUG_CATEGORY (ffmpegcolorspace_debug); -#define GST_CAT_DEFAULT ffmpegcolorspace_debug -GST_DEBUG_CATEGORY (ffmpegcolorspace_performance); - -#define FFMPEGCSP_VIDEO_CAPS \ - "video/x-raw-yuv, width = "GST_VIDEO_SIZE_RANGE" , " \ - "height="GST_VIDEO_SIZE_RANGE",framerate="GST_VIDEO_FPS_RANGE"," \ - "format= (fourcc) { I420 , NV12 , NV21 , YV12 , YUY2 , Y42B , Y444 , YUV9 , YVU9 , Y41B , Y800 , Y8 , GREY , Y16 , UYVY , YVYU , IYU1 , v308 , AYUV, A420} ;" \ - GST_VIDEO_CAPS_RGB";" \ - GST_VIDEO_CAPS_BGR";" \ - GST_VIDEO_CAPS_RGBx";" \ - GST_VIDEO_CAPS_xRGB";" \ - GST_VIDEO_CAPS_BGRx";" \ - GST_VIDEO_CAPS_xBGR";" \ - GST_VIDEO_CAPS_RGBA";" \ - GST_VIDEO_CAPS_ARGB";" \ - GST_VIDEO_CAPS_BGRA";" \ - GST_VIDEO_CAPS_ABGR";" \ - GST_VIDEO_CAPS_RGB_16";" \ - GST_VIDEO_CAPS_RGB_15";" \ - "video/x-raw-rgb, bpp = (int)8, depth = (int)8, " \ - "width = "GST_VIDEO_SIZE_RANGE" , " \ - "height = " GST_VIDEO_SIZE_RANGE ", " \ - "framerate = "GST_VIDEO_FPS_RANGE ";" \ - GST_VIDEO_CAPS_GRAY8";" \ - GST_VIDEO_CAPS_GRAY16("BIG_ENDIAN")";" \ - GST_VIDEO_CAPS_GRAY16("LITTLE_ENDIAN")";" - -static GstStaticPadTemplate gst_ffmpegcsp_src_template = -GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (FFMPEGCSP_VIDEO_CAPS) - ); - -static GstStaticPadTemplate gst_ffmpegcsp_sink_template = -GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (FFMPEGCSP_VIDEO_CAPS) - ); - -GType gst_ffmpegcsp_get_type (void); - -static gboolean gst_ffmpegcsp_set_caps (GstBaseTransform * btrans, - GstCaps * incaps, GstCaps * outcaps); -static gboolean gst_ffmpegcsp_get_unit_size (GstBaseTransform * btrans, - GstCaps * caps, gsize * size); -static GstFlowReturn gst_ffmpegcsp_transform (GstBaseTransform * btrans, - GstBuffer * inbuf, GstBuffer * outbuf); - -static GQuark _QRAWRGB; /* "video/x-raw-rgb" */ -static GQuark _QRAWYUV; /* "video/x-raw-yuv" */ -static GQuark _QALPHAMASK; /* "alpha_mask" */ - -/* copies the given caps */ -static GstCaps * -gst_ffmpegcsp_caps_remove_format_info (GstCaps * caps) -{ - GstStructure *yuvst, *rgbst, *grayst; - gint i, n; - GstCaps *res; - - res = gst_caps_new_empty (); - - n = gst_caps_get_size (caps); - for (i = 0; i < n; i++) { - yuvst = gst_caps_get_structure (caps, i); - - /* If this is already expressed by the existing caps - * skip this structure */ - if (i > 0 && gst_caps_is_subset_structure (res, yuvst)) - continue; - - yuvst = gst_structure_copy (yuvst); - gst_structure_set_name (yuvst, "video/x-raw-yuv"); - gst_structure_remove_fields (yuvst, "format", "endianness", "depth", - "bpp", "red_mask", "green_mask", "blue_mask", "alpha_mask", - "palette_data", NULL); - - rgbst = gst_structure_copy (yuvst); - gst_structure_set_name (rgbst, "video/x-raw-rgb"); - gst_structure_remove_fields (rgbst, "color-matrix", "chroma-site", NULL); - - grayst = gst_structure_copy (rgbst); - gst_structure_set_name (grayst, "video/x-raw-gray"); - - gst_caps_append_structure (res, yuvst); - gst_caps_append_structure (res, rgbst); - gst_caps_append_structure (res, grayst); - } - - return res; -} - -/* The caps can be transformed into any other caps with format info removed. - * However, we should prefer passthrough, so if passthrough is possible, - * put it first in the list. */ -static GstCaps * -gst_ffmpegcsp_transform_caps (GstBaseTransform * btrans, - GstPadDirection direction, GstCaps * caps, GstCaps * filter) -{ - GstCaps *tmp, *tmp2; - GstCaps *result; - - /* Get all possible caps that we can transform to */ - tmp = gst_ffmpegcsp_caps_remove_format_info (caps); - - if (filter) { - tmp2 = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST); - gst_caps_unref (tmp); - tmp = tmp2; - } - - result = tmp; - - GST_DEBUG_OBJECT (btrans, "transformed %" GST_PTR_FORMAT " into %" - GST_PTR_FORMAT, caps, result); - - return result; -} - -static gboolean -gst_ffmpegcsp_set_caps (GstBaseTransform * btrans, GstCaps * incaps, - GstCaps * outcaps) -{ - GstFFMpegCsp *space; - GstStructure *structure; - gint in_height, in_width; - gint out_height, out_width; - const GValue *in_framerate = NULL; - const GValue *out_framerate = NULL; - const GValue *in_par = NULL; - const GValue *out_par = NULL; - AVCodecContext *ctx; - gboolean res; - - space = GST_FFMPEGCSP (btrans); - - /* parse in and output values */ - structure = gst_caps_get_structure (incaps, 0); - - /* we have to have width and height */ - res = gst_structure_get_int (structure, "width", &in_width); - res &= gst_structure_get_int (structure, "height", &in_height); - if (!res) - goto no_width_height; - - /* and framerate */ - in_framerate = gst_structure_get_value (structure, "framerate"); - if (in_framerate == NULL || !GST_VALUE_HOLDS_FRACTION (in_framerate)) - goto no_framerate; - - /* this is optional */ - in_par = gst_structure_get_value (structure, "pixel-aspect-ratio"); - - structure = gst_caps_get_structure (outcaps, 0); - - /* we have to have width and height */ - res = gst_structure_get_int (structure, "width", &out_width); - res &= gst_structure_get_int (structure, "height", &out_height); - if (!res) - goto no_width_height; - - /* and framerate */ - out_framerate = gst_structure_get_value (structure, "framerate"); - if (out_framerate == NULL || !GST_VALUE_HOLDS_FRACTION (out_framerate)) - goto no_framerate; - - /* this is optional */ - out_par = gst_structure_get_value (structure, "pixel-aspect-ratio"); - - /* these must match */ - if (in_width != out_width || in_height != out_height || - gst_value_compare (in_framerate, out_framerate) != GST_VALUE_EQUAL) - goto format_mismatch; - - /* if present, these must match too */ - if (in_par && out_par - && gst_value_compare (in_par, out_par) != GST_VALUE_EQUAL) - goto format_mismatch; - - ctx = avcodec_alloc_context (); - - space->width = ctx->width = in_width; - space->height = ctx->height = in_height; - - space->interlaced = FALSE; - gst_structure_get_boolean (structure, "interlaced", &space->interlaced); - - /* get from format */ - ctx->pix_fmt = PIX_FMT_NB; - gst_ffmpegcsp_caps_with_codectype (CODEC_TYPE_VIDEO, incaps, ctx); - if (ctx->pix_fmt == PIX_FMT_NB) - goto invalid_in_caps; - space->from_pixfmt = ctx->pix_fmt; - - /* palette, only for from data */ - if (space->palette) - av_free (space->palette); - space->palette = ctx->palctrl; - ctx->palctrl = NULL; - - /* get to format */ - ctx->pix_fmt = PIX_FMT_NB; - gst_ffmpegcsp_caps_with_codectype (CODEC_TYPE_VIDEO, outcaps, ctx); - if (ctx->pix_fmt == PIX_FMT_NB) - goto invalid_out_caps; - space->to_pixfmt = ctx->pix_fmt; - - GST_DEBUG ("reconfigured %d %d", space->from_pixfmt, space->to_pixfmt); - - av_free (ctx); - - return TRUE; - - /* ERRORS */ -no_width_height: - { - GST_DEBUG_OBJECT (space, "did not specify width or height"); - space->from_pixfmt = PIX_FMT_NB; - space->to_pixfmt = PIX_FMT_NB; - return FALSE; - } -no_framerate: - { - GST_DEBUG_OBJECT (space, "did not specify framerate"); - space->from_pixfmt = PIX_FMT_NB; - space->to_pixfmt = PIX_FMT_NB; - return FALSE; - } -format_mismatch: - { - GST_DEBUG_OBJECT (space, "input and output formats do not match"); - space->from_pixfmt = PIX_FMT_NB; - space->to_pixfmt = PIX_FMT_NB; - return FALSE; - } -invalid_in_caps: - { - GST_DEBUG_OBJECT (space, "could not configure context for input format"); - av_free (ctx); - space->from_pixfmt = PIX_FMT_NB; - space->to_pixfmt = PIX_FMT_NB; - return FALSE; - } -invalid_out_caps: - { - GST_DEBUG_OBJECT (space, "could not configure context for output format"); - av_free (ctx); - space->from_pixfmt = PIX_FMT_NB; - space->to_pixfmt = PIX_FMT_NB; - return FALSE; - } -} - -#define gst_ffmpegcsp_parent_class parent_class -G_DEFINE_TYPE (GstFFMpegCsp, gst_ffmpegcsp, GST_TYPE_VIDEO_FILTER); - -static void -gst_ffmpegcsp_finalize (GObject * obj) -{ - GstFFMpegCsp *space = GST_FFMPEGCSP (obj); - - if (space->palette) - av_free (space->palette); - - G_OBJECT_CLASS (parent_class)->finalize (obj); -} - -static void -gst_ffmpegcsp_class_init (GstFFMpegCspClass * klass) -{ - GObjectClass *gobject_class = (GObjectClass *) klass; - GstElementClass *gstelement_class = (GstElementClass *) klass; - GstBaseTransformClass *gstbasetransform_class = - (GstBaseTransformClass *) klass; - - _QRAWRGB = g_quark_from_string ("video/x-raw-rgb"); - _QRAWYUV = g_quark_from_string ("video/x-raw-yuv"); - _QALPHAMASK = g_quark_from_string ("alpha_mask"); - - gobject_class->finalize = gst_ffmpegcsp_finalize; - - gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&gst_ffmpegcsp_src_template)); - gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&gst_ffmpegcsp_sink_template)); - - gst_element_class_set_details_simple (gstelement_class, - "FFMPEG Colorspace converter", "Filter/Converter/Video", - "Converts video from one colorspace to another", - "GStreamer maintainers "); - - gstbasetransform_class->transform_caps = - GST_DEBUG_FUNCPTR (gst_ffmpegcsp_transform_caps); - gstbasetransform_class->set_caps = GST_DEBUG_FUNCPTR (gst_ffmpegcsp_set_caps); - gstbasetransform_class->get_unit_size = - GST_DEBUG_FUNCPTR (gst_ffmpegcsp_get_unit_size); - gstbasetransform_class->transform = - GST_DEBUG_FUNCPTR (gst_ffmpegcsp_transform); - - gstbasetransform_class->passthrough_on_same_caps = TRUE; -} - -static void -gst_ffmpegcsp_init (GstFFMpegCsp * space) -{ - space->from_pixfmt = space->to_pixfmt = PIX_FMT_NB; - space->palette = NULL; -} - -static gboolean -gst_ffmpegcsp_get_unit_size (GstBaseTransform * btrans, GstCaps * caps, - gsize * size) -{ - GstStructure *structure = NULL; - AVCodecContext *ctx = NULL; - gboolean ret = TRUE; - gint width, height; - - g_assert (size); - - structure = gst_caps_get_structure (caps, 0); - gst_structure_get_int (structure, "width", &width); - gst_structure_get_int (structure, "height", &height); - - ctx = avcodec_alloc_context (); - - g_assert (ctx != NULL); - - ctx->pix_fmt = PIX_FMT_NB; - - gst_ffmpegcsp_caps_with_codectype (CODEC_TYPE_VIDEO, caps, ctx); - - if (G_UNLIKELY (ctx->pix_fmt == PIX_FMT_NB)) { - ret = FALSE; - goto beach; - } - - *size = avpicture_get_size (ctx->pix_fmt, width, height); - - /* ffmpeg frames have the palette after the frame data, whereas - * GStreamer currently puts it into the caps as 'palette_data' field, - * so for paletted data the frame size avpicture_get_size() returns is - * 1024 bytes larger than what GStreamer expects. */ - if (gst_structure_has_field (structure, "palette_data") && - ctx->pix_fmt == PIX_FMT_PAL8) { - *size -= 4 * 256; /* = AVPALETTE_SIZE */ - } - -beach: - - if (ctx->palctrl) - av_free (ctx->palctrl); - av_free (ctx); - - return ret; -} - -static GstFlowReturn -gst_ffmpegcsp_transform (GstBaseTransform * btrans, GstBuffer * inbuf, - GstBuffer * outbuf) -{ - GstFFMpegCsp *space; - gint result; - guint8 *indata, *outdata; - gsize insize, outsize; - - space = GST_FFMPEGCSP (btrans); - - GST_DEBUG ("from %d -> to %d", space->from_pixfmt, space->to_pixfmt); - - if (G_UNLIKELY (space->from_pixfmt == PIX_FMT_NB || - space->to_pixfmt == PIX_FMT_NB)) - goto unknown_format; - - /* fill from with source data */ - indata = gst_buffer_map (inbuf, &insize, NULL, GST_MAP_READ); - gst_ffmpegcsp_avpicture_fill (&space->from_frame, - indata, space->from_pixfmt, space->width, space->height, - space->interlaced); - - /* fill optional palette */ - if (space->palette) - space->from_frame.data[1] = (uint8_t *) space->palette->palette; - - /* fill target frame */ - outdata = gst_buffer_map (outbuf, &outsize, NULL, GST_MAP_WRITE); - gst_ffmpegcsp_avpicture_fill (&space->to_frame, - outdata, space->to_pixfmt, space->width, space->height, - space->interlaced); - - /* and convert */ - result = img_convert (&space->to_frame, space->to_pixfmt, - &space->from_frame, space->from_pixfmt, space->width, space->height); - gst_buffer_unmap (outbuf, outdata, outsize); - gst_buffer_unmap (inbuf, indata, insize); - - if (result == -1) - goto not_supported; - - /* baseclass copies timestamps */ - GST_DEBUG ("from %d -> to %d done", space->from_pixfmt, space->to_pixfmt); - - return GST_FLOW_OK; - - /* ERRORS */ -unknown_format: - { - GST_ELEMENT_ERROR (space, CORE, NOT_IMPLEMENTED, (NULL), - ("attempting to convert colorspaces between unknown formats")); - return GST_FLOW_NOT_NEGOTIATED; - } -not_supported: - { - GST_ELEMENT_ERROR (space, CORE, NOT_IMPLEMENTED, (NULL), - ("cannot convert between formats")); - return GST_FLOW_NOT_SUPPORTED; - } -} - -static gboolean -plugin_init (GstPlugin * plugin) -{ - GST_DEBUG_CATEGORY_INIT (ffmpegcolorspace_debug, "ffmpegcolorspace", 0, - "FFMPEG-based colorspace converter"); - GST_DEBUG_CATEGORY_GET (ffmpegcolorspace_performance, "GST_PERFORMANCE"); - - avcodec_init (); - - return gst_element_register (plugin, "ffmpegcolorspace", - GST_RANK_NONE, GST_TYPE_FFMPEGCSP); -} - -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "ffmpegcolorspace", - "colorspace conversion copied from FFMpeg " FFMPEG_VERSION, - plugin_init, VERSION, "LGPL", "FFMpeg", "http://ffmpeg.sourceforge.net/") diff --git a/gst/ffmpegcolorspace/gstffmpegcolorspace.h b/gst/ffmpegcolorspace/gstffmpegcolorspace.h deleted file mode 100644 index 198ab8a..0000000 --- a/gst/ffmpegcolorspace/gstffmpegcolorspace.h +++ /dev/null @@ -1,63 +0,0 @@ -/* GStreamer - * Copyright (C) <1999> Erik Walthinsen - * This file: - * Copyright (C) 2003 Ronald Bultje - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GST_FFMPEGCOLORSPACE_H__ -#define __GST_FFMPEGCOLORSPACE_H__ - -#include -#include -#include "avcodec.h" - -G_BEGIN_DECLS - -#define GST_TYPE_FFMPEGCSP (gst_ffmpegcsp_get_type()) -#define GST_FFMPEGCSP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FFMPEGCSP,GstFFMpegCsp)) -#define GST_FFMPEGCSP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FFMPEGCSP,GstFFMpegCspClass)) -#define GST_IS_FFMPEGCSP(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FFMPEGCSP)) -#define GST_IS_FFMPEGCSP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FFMPEGCSP)) - -typedef struct _GstFFMpegCsp GstFFMpegCsp; -typedef struct _GstFFMpegCspClass GstFFMpegCspClass; - -/** - * GstFFMpegCsp: - * - * Opaque object data structure. - */ -struct _GstFFMpegCsp { - GstVideoFilter element; - - gint width, height; - gboolean interlaced; - gfloat fps; - enum PixelFormat from_pixfmt, to_pixfmt; - AVPicture from_frame, to_frame; - AVPaletteControl *palette; -}; - -struct _GstFFMpegCspClass -{ - GstVideoFilterClass parent_class; -}; - -G_END_DECLS - -#endif /* __GST_FFMPEGCOLORSPACE_H__ */ diff --git a/gst/ffmpegcolorspace/imgconvert.c b/gst/ffmpegcolorspace/imgconvert.c deleted file mode 100644 index cb145bb..0000000 --- a/gst/ffmpegcolorspace/imgconvert.c +++ /dev/null @@ -1,4126 +0,0 @@ -/* - * Misc image convertion routines - * Copyright (c) 2001, 2002, 2003 Fabrice Bellard. - * - * This library 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 of the License, or (at your option) any later version. - * - * This library 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 this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/** - * @file imgconvert.c - * Misc image convertion routines. - */ - -/* TODO: - * - write 'ffimg' program to test all the image related stuff - * - move all api to slice based system - * - integrate deinterlacing, postprocessing and scaling in the conversion process - */ - -#include "avcodec.h" -#include "dsputil.h" -#include "gstffmpegcodecmap.h" - -#include -#include - -GST_DEBUG_CATEGORY_EXTERN (ffmpegcolorspace_performance); - -#define xglue(x, y) x ## y -#define glue(x, y) xglue(x, y) - -/* this table gives more information about formats */ -/* FIXME, this table is also in ffmpegcodecmap */ -static PixFmtInfo pix_fmt_info[PIX_FMT_NB] = { - /* YUV formats */ - /* [PIX_FMT_YUV420P] = */ { - /* .format = */ PIX_FMT_YUV420P, - /* .name = */ "yuv420p", - /* .nb_channels = */ 3, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 1, - /* .y_chroma_shift = */ 1, - /* .depth = */ 8, - }, - /* [PIX_FMT_YVU420P] = */ { - /* .format = */ PIX_FMT_YVU420P, - /* .name = */ "yvu420p", - /* .nb_channels = */ 3, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 1, - /* .y_chroma_shift = */ 1, - /* .depth = */ 8, - }, - /* [PIX_FMT_NV12] = */ { - /* .format = */ PIX_FMT_NV12, - /* .name = */ "nv12", - /* .nb_channels = */ 2, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 1, - /* .y_chroma_shift = */ 1, - /* .depth = */ 8, - }, - /* [PIX_FMT_NV21] = */ { - /* .format = */ PIX_FMT_NV21, - /* .name = */ "nv21", - /* .nb_channels = */ 2, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 1, - /* .y_chroma_shift = */ 1, - /* .depth = */ 8, - }, - /* [PIX_FMT_YUV422P] = */ { - /* .format = */ PIX_FMT_YUV422P, - /* .name = */ "yuv422p", - /* .nb_channels = */ 3, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 1, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_YUV444P] = */ { - /* .format = */ PIX_FMT_YUV444P, - /* .name = */ "yuv444p", - /* .nb_channels = */ 3, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_YUV422] = */ { - /* .format = */ PIX_FMT_YUV422, - /* .name = */ "yuv422", - /* .nb_channels = */ 1, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 1, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_UYVY422] = */ { - /* .format = */ PIX_FMT_UYVY422, - /* .name = */ "uyvy422", - /* .nb_channels = */ 1, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 1, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_YVYU422] = */ { - /* .format = */ PIX_FMT_YVYU422, - /* .name = */ "yvyu422", - /* .nb_channels = */ 1, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 1, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_V308] = */ { - /* .format = */ PIX_FMT_V308, - /* .name = */ "v308", - /* .nb_channels = */ 1, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_YUV410P] = */ { - /* .format = */ PIX_FMT_YUV410P, - /* .name = */ "yuv410p", - /* .nb_channels = */ 3, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 2, - /* .y_chroma_shift = */ 2, - /* .depth = */ 8, - }, - /* [PIX_FMT_YVU410P] = */ { - /* .format = */ PIX_FMT_YVU410P, - /* .name = */ "yvu410p", - /* .nb_channels = */ 3, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 2, - /* .y_chroma_shift = */ 2, - /* .depth = */ 8, - }, - /* [PIX_FMT_YUV411P] = */ { - /* .format = */ PIX_FMT_YUV411P, - /* .name = */ "yuv411p", - /* .nb_channels = */ 3, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 2, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_Y800] = */ { - /* .format = */ PIX_FMT_Y800, - /* .name = */ "y800", - /* .nb_channels = */ 1, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_Y16] = */ { - /* .format = */ PIX_FMT_Y16, - /* .name = */ "y16", - /* .nb_channels = */ 1, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 16, - }, - - /* JPEG YUV */ - /* [PIX_FMT_YUVJ420P] = */ { - /* .format = */ PIX_FMT_YUVJ420P, - /* .name = */ "yuvj420p", - /* .nb_channels = */ 3, - /* .color_type = */ FF_COLOR_YUV_JPEG, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 1, - /* .y_chroma_shift = */ 1, - /* .depth = */ 8, - }, - /* [PIX_FMT_YUVJ422P] = */ { - /* .format = */ PIX_FMT_YUVJ422P, - /* .name = */ "yuvj422p", - /* .nb_channels = */ 3, - /* .color_type = */ FF_COLOR_YUV_JPEG, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 1, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_YUVJ444P] = */ { - /* .format = */ PIX_FMT_YUVJ444P, - /* .name = */ "yuvj444p", - /* .nb_channels = */ 3, - /* .color_type = */ FF_COLOR_YUV_JPEG, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - - /* RGB formats */ - /* [PIX_FMT_RGB24] = */ { - /* .format = */ PIX_FMT_RGB24, - /* .name = */ "rgb24", - /* .nb_channels = */ 3, - /* .color_type = */ FF_COLOR_RGB, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_BGR24] = */ { - /* .format = */ PIX_FMT_BGR24, - /* .name = */ "bgr24", - /* .nb_channels = */ 3, - /* .color_type = */ FF_COLOR_RGB, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_RGB32] = */ { - /* .format = */ PIX_FMT_RGB32, - /* .name = */ "rgb32", - /* .nb_channels = */ 4, - /* .color_type = */ FF_COLOR_RGB, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_BGR32] = */ { - /* .format = */ PIX_FMT_BGR32, - /* .name = */ "bgr32", - /* .nb_channels = */ 4, - /* .color_type = */ FF_COLOR_RGB, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_RGB32] = */ { - /* .format = */ PIX_FMT_xRGB32, - /* .name = */ "xrgb32", - /* .nb_channels = */ 4, - /* .color_type = */ FF_COLOR_RGB, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_BGR32] = */ { - /* .format = */ PIX_FMT_BGRx32, - /* .name = */ "bgrx32", - /* .nb_channels = */ 4, - /* .color_type = */ FF_COLOR_RGB, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_RGBA32] = */ { - /* .format = */ PIX_FMT_RGBA32, - /* .name = */ "rgba32", - /* .nb_channels = */ 4, - /* .color_type = */ FF_COLOR_RGB, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 1, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_BGRA32] = */ { - /* .format = */ PIX_FMT_BGRA32, - /* .name = */ "bgra32", - /* .nb_channels = */ 4, - /* .color_type = */ FF_COLOR_RGB, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 1, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_ARGB32] = */ { - /* .format = */ PIX_FMT_ARGB32, - /* .name = */ "argb32", - /* .nb_channels = */ 4, - /* .color_type = */ FF_COLOR_RGB, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 1, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_ABGR32] = */ { - /* .format = */ PIX_FMT_ABGR32, - /* .name = */ "abgr32", - /* .nb_channels = */ 4, - /* .color_type = */ FF_COLOR_RGB, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 1, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_RGB565] = */ { - /* .format = */ PIX_FMT_RGB565, - /* .name = */ "rgb565", - /* .nb_channels = */ 3, - /* .color_type = */ FF_COLOR_RGB, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 5, - }, - /* [PIX_FMT_RGB555] = */ { - /* .format = */ PIX_FMT_RGB555, - /* .name = */ "rgb555", - /* .nb_channels = */ 4, - /* .color_type = */ FF_COLOR_RGB, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 1, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 5, - }, - - /* gray / mono formats */ - /* [PIX_FMT_GRAY8] = */ { - /* .format = */ PIX_FMT_GRAY8, - /* .name = */ "gray", - /* .nb_channels = */ 1, - /* .color_type = */ FF_COLOR_GRAY, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_GRAY16_L] = */ { - /* .format = */ PIX_FMT_GRAY16_L, - /* .name = */ "gray", - /* .nb_channels = */ 1, - /* .color_type = */ FF_COLOR_GRAY, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 16, - }, - /* [PIX_FMT_GRAY16_B] = */ { - /* .format = */ PIX_FMT_GRAY16_B, - /* .name = */ "gray", - /* .nb_channels = */ 1, - /* .color_type = */ FF_COLOR_GRAY, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 16, - }, - /* [PIX_FMT_MONOWHITE] = */ { - /* .format = */ PIX_FMT_MONOWHITE, - /* .name = */ "monow", - /* .nb_channels = */ 1, - /* .color_type = */ FF_COLOR_GRAY, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 1, - }, - /* [PIX_FMT_MONOBLACK] = */ { - /* .format = */ PIX_FMT_MONOBLACK, - /* .name = */ "monob", - /* .nb_channels = */ 1, - /* .color_type = */ FF_COLOR_GRAY, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 1, - }, - - /* paletted formats */ - /* [PIX_FMT_PAL8] = */ { - /* .format = */ PIX_FMT_PAL8, - /* .name = */ "pal8", - /* .nb_channels = */ 4, - /* .color_type = */ FF_COLOR_RGB, - /* .pixel_type = */ FF_PIXEL_PALETTE, - /* .is_alpha = */ 1, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_XVMC_MPEG2_MC] = */ { - /* .format = */ PIX_FMT_XVMC_MPEG2_MC, - /* .name = */ "xvmcmc", - }, - /* [PIX_FMT_XVMC_MPEG2_IDCT] = */ { - /* .format = */ PIX_FMT_XVMC_MPEG2_IDCT, - /* .name = */ "xvmcidct", - }, - /* [PIX_FMT_UYVY411] = */ { - /* .format = */ PIX_FMT_UYVY411, - /* .name = */ "uyvy411", - /* .nb_channels = */ 1, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 0, - /* .x_chroma_shift = */ 2, - /* .y_chroma_shift = */ 0, - /* .depth = */ 8, - }, - /* [PIX_FMT_AYUV4444] = */ { - /* .format = */ PIX_FMT_AYUV4444, - /* .name = */ "ayuv4444", - /* .nb_channels = */ 1, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PACKED, - /* .is_alpha = */ 1, - /* .x_chroma_shift = */ 0, - /* .y_chroma_shift = */ 0, - /*.depth = */ 8 - }, - /* [PIX_FMT_YUVA420P] = */ { - /* .format = */ PIX_FMT_YUVA420P, - /* .name = */ "yuva420p", - /* .nb_channels = */ 4, - /* .color_type = */ FF_COLOR_YUV, - /* .pixel_type = */ FF_PIXEL_PLANAR, - /* .is_alpha = */ 1, - /* .x_chroma_shift = */ 1, - /* .y_chroma_shift = */ 1, - /* .depth = */ 8, - } -}; - -/* returns NULL if not found */ -/* undid static since this is also used in gstffmpegcodecmap.c */ -PixFmtInfo * -get_pix_fmt_info (enum PixelFormat format) -{ - int i; - - for (i = 0; i < sizeof (pix_fmt_info) / sizeof (pix_fmt_info[0]); i++) { - if (pix_fmt_info[i].format == format) { - return pix_fmt_info + i; - } - } - - /* since this doesn't get checked *anywhere*, we might as well warn - here if we return NULL so you have *some* idea what's going on */ - g_warning - ("Could not find info for pixel format %d out of %d known pixel formats. One segfault coming up", - format, PIX_FMT_NB); - return NULL; -} - -void -avcodec_get_chroma_sub_sample (int pix_fmt, int *h_shift, int *v_shift) -{ - *h_shift = get_pix_fmt_info (pix_fmt)->x_chroma_shift; - *v_shift = get_pix_fmt_info (pix_fmt)->y_chroma_shift; -} - -const char * -avcodec_get_pix_fmt_name (int pix_fmt) -{ - if (pix_fmt < 0 || pix_fmt >= PIX_FMT_NB) - return "???"; - else - return get_pix_fmt_info (pix_fmt)->name; -} - -enum PixelFormat -avcodec_get_pix_fmt (const char *name) -{ - int i; - - for (i = 0; i < PIX_FMT_NB; i++) - if (!strcmp (pix_fmt_info[i].name, name)) - break; - return pix_fmt_info[i].format; -} - -#if 0 -static int -avpicture_layout (const AVPicture * src, int pix_fmt, int width, int height, - unsigned char *dest, int dest_size) -{ - PixFmtInfo *pf = get_pix_fmt_info (pix_fmt); - int i, j, w, h, data_planes; - const unsigned char *s; - int size = avpicture_get_size (pix_fmt, width, height); - - if (size > dest_size) - return -1; - - if (pf->pixel_type == FF_PIXEL_PACKED || pf->pixel_type == FF_PIXEL_PALETTE) { - if (pix_fmt == PIX_FMT_YUV422 || - pix_fmt == PIX_FMT_UYVY422 || - pix_fmt == PIX_FMT_RGB565 || pix_fmt == PIX_FMT_RGB555) - w = width * 2; - else if (pix_fmt == PIX_FMT_UYVY411) - w = width + width / 2; - else if (pix_fmt == PIX_FMT_PAL8) - w = width; - else - w = width * (pf->depth * pf->nb_channels / 8); - - data_planes = 1; - h = height; - } else { - data_planes = pf->nb_channels; - w = (width * pf->depth + 7) / 8; - h = height; - } - - for (i = 0; i < data_planes; i++) { - if (i == 1) { - w = width >> pf->x_chroma_shift; - h = height >> pf->y_chroma_shift; - } - s = src->data[i]; - for (j = 0; j < h; j++) { - memcpy (dest, s, w); - dest += w; - s += src->linesize[i]; - } - } - - if (pf->pixel_type == FF_PIXEL_PALETTE) - memcpy ((unsigned char *) (((size_t) dest + 3) & ~3), src->data[1], - 256 * 4); - - return size; -} -#endif - -int -avpicture_get_size (int pix_fmt, int width, int height) -{ - AVPicture dummy_pict; - - return gst_ffmpegcsp_avpicture_fill (&dummy_pict, NULL, pix_fmt, width, - height, FALSE); -} - -/** - * compute the loss when converting from a pixel format to another - */ -int -avcodec_get_pix_fmt_loss (int dst_pix_fmt, int src_pix_fmt, int has_alpha) -{ - const PixFmtInfo *pf, *ps; - int loss; - - ps = get_pix_fmt_info (src_pix_fmt); - pf = get_pix_fmt_info (dst_pix_fmt); - - /* compute loss */ - loss = 0; - if (pf->depth < ps->depth || - (dst_pix_fmt == PIX_FMT_RGB555 && src_pix_fmt == PIX_FMT_RGB565)) - loss |= FF_LOSS_DEPTH; - if (pf->x_chroma_shift > ps->x_chroma_shift || - pf->y_chroma_shift > ps->y_chroma_shift) - loss |= FF_LOSS_RESOLUTION; - switch (pf->color_type) { - case FF_COLOR_RGB: - if (ps->color_type != FF_COLOR_RGB && ps->color_type != FF_COLOR_GRAY) - loss |= FF_LOSS_COLORSPACE; - break; - case FF_COLOR_GRAY: - if (ps->color_type != FF_COLOR_GRAY) - loss |= FF_LOSS_COLORSPACE; - break; - case FF_COLOR_YUV: - if (ps->color_type != FF_COLOR_YUV) - loss |= FF_LOSS_COLORSPACE; - break; - case FF_COLOR_YUV_JPEG: - if (ps->color_type != FF_COLOR_YUV_JPEG && - ps->color_type != FF_COLOR_YUV && ps->color_type != FF_COLOR_GRAY) - loss |= FF_LOSS_COLORSPACE; - break; - default: - /* fail safe test */ - if (ps->color_type != pf->color_type) - loss |= FF_LOSS_COLORSPACE; - break; - } - if (pf->color_type == FF_COLOR_GRAY && ps->color_type != FF_COLOR_GRAY) - loss |= FF_LOSS_CHROMA; - if (!pf->is_alpha && (ps->is_alpha && has_alpha)) - loss |= FF_LOSS_ALPHA; - if (pf->pixel_type == FF_PIXEL_PALETTE && - (ps->pixel_type != FF_PIXEL_PALETTE && ps->color_type != FF_COLOR_GRAY)) - loss |= FF_LOSS_COLORQUANT; - return loss; -} - -static int -avg_bits_per_pixel (int pix_fmt) -{ - int bits; - const PixFmtInfo *pf; - - pf = get_pix_fmt_info (pix_fmt); - switch (pf->pixel_type) { - case FF_PIXEL_PACKED: - switch (pix_fmt) { - case PIX_FMT_YUV422: - case PIX_FMT_UYVY422: - case PIX_FMT_YVYU422: - case PIX_FMT_RGB565: - case PIX_FMT_RGB555: - bits = 16; - break; - case PIX_FMT_UYVY411: - bits = 12; - break; - default: - bits = pf->depth * pf->nb_channels; - break; - } - break; - case FF_PIXEL_PLANAR: - if (pf->x_chroma_shift == 0 && pf->y_chroma_shift == 0) { - bits = pf->depth * pf->nb_channels; - } else { - bits = pf->depth + ((2 * pf->depth) >> - (pf->x_chroma_shift + pf->y_chroma_shift)); - } - break; - case FF_PIXEL_PALETTE: - bits = 8; - break; - default: - bits = -1; - break; - } - return bits; -} - -static int -avcodec_find_best_pix_fmt1 (int pix_fmt_mask, - int src_pix_fmt, int has_alpha, int loss_mask) -{ - int dist, i, loss, min_dist, dst_pix_fmt; - - /* find exact color match with smallest size */ - dst_pix_fmt = -1; - min_dist = 0x7fffffff; - for (i = 0; i < PIX_FMT_NB; i++) { - if (pix_fmt_mask & (1 << i)) { - loss = avcodec_get_pix_fmt_loss (i, src_pix_fmt, has_alpha) & loss_mask; - if (loss == 0) { - dist = avg_bits_per_pixel (i); - if (dist < min_dist) { - min_dist = dist; - dst_pix_fmt = i; - } - } - } - } - return dst_pix_fmt; -} - -/** - * find best pixel format to convert to. Return -1 if none found - */ -int -avcodec_find_best_pix_fmt (int pix_fmt_mask, int src_pix_fmt, - int has_alpha, int *loss_ptr) -{ - int dst_pix_fmt, loss_mask, i; - static const int loss_mask_order[] = { - ~0, /* no loss first */ - ~FF_LOSS_ALPHA, - ~FF_LOSS_RESOLUTION, - ~(FF_LOSS_COLORSPACE | FF_LOSS_RESOLUTION), - ~FF_LOSS_COLORQUANT, - ~FF_LOSS_DEPTH, - 0, - }; - - /* try with successive loss */ - i = 0; - for (;;) { - loss_mask = loss_mask_order[i++]; - dst_pix_fmt = avcodec_find_best_pix_fmt1 (pix_fmt_mask, src_pix_fmt, - has_alpha, loss_mask); - if (dst_pix_fmt >= 0) - goto found; - if (loss_mask == 0) - break; - } - return -1; -found: - if (loss_ptr) - *loss_ptr = avcodec_get_pix_fmt_loss (dst_pix_fmt, src_pix_fmt, has_alpha); - return dst_pix_fmt; -} - -static void -img_copy_plane (uint8_t * dst, int dst_wrap, - const uint8_t * src, int src_wrap, int width, int height) -{ - for (; height > 0; height--) { - memcpy (dst, src, width); - dst += dst_wrap; - src += src_wrap; - } -} - -/** - * Copy image 'src' to 'dst'. - */ -static void -img_copy (AVPicture * dst, const AVPicture * src, - int pix_fmt, int width, int height) -{ - int bwidth, bits, i; - const PixFmtInfo *pf; - - pf = get_pix_fmt_info (pix_fmt); - switch (pf->pixel_type) { - case FF_PIXEL_PACKED: - switch (pix_fmt) { - case PIX_FMT_YUV422: - case PIX_FMT_UYVY422: - case PIX_FMT_YVYU422: - case PIX_FMT_RGB565: - case PIX_FMT_RGB555: - bits = 16; - break; - case PIX_FMT_UYVY411: - bits = 12; - break; - default: - bits = pf->depth * pf->nb_channels; - break; - } - bwidth = (width * bits + 7) >> 3; - img_copy_plane (dst->data[0], dst->linesize[0], - src->data[0], src->linesize[0], bwidth, height); - break; - case FF_PIXEL_PLANAR: - for (i = 0; i < pf->nb_channels; i++) { - int w, h; - - w = width; - h = height; - if (i == 1 || i == 2) { - w >>= pf->x_chroma_shift; - h >>= pf->y_chroma_shift; - } - bwidth = (w * pf->depth + 7) >> 3; - img_copy_plane (dst->data[i], dst->linesize[i], - src->data[i], src->linesize[i], bwidth, h); - } - break; - case FF_PIXEL_PALETTE: - img_copy_plane (dst->data[0], dst->linesize[0], - src->data[0], src->linesize[0], width, height); - /* copy the palette */ - img_copy_plane (dst->data[1], dst->linesize[1], - src->data[1], src->linesize[1], 4, 256); - break; - } -} - -/* XXX: totally non optimized */ - -static void -yuv422_to_yuv420p (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const uint8_t *p, *p1; - uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1; - int w; - - p1 = src->data[0]; - lum1 = dst->data[0]; - cb1 = dst->data[1]; - cr1 = dst->data[2]; - - for (; height >= 1; height -= 2) { - p = p1; - lum = lum1; - cb = cb1; - cr = cr1; - for (w = width; w >= 2; w -= 2) { - lum[0] = p[0]; - cb[0] = p[1]; - lum[1] = p[2]; - cr[0] = p[3]; - p += 4; - lum += 2; - cb++; - cr++; - } - if (w) { - lum[0] = p[0]; - cb[0] = p[1]; - cr[0] = p[3]; - } - p1 += src->linesize[0]; - lum1 += dst->linesize[0]; - if (height > 1) { - p = p1; - lum = lum1; - for (w = width; w >= 2; w -= 2) { - lum[0] = p[0]; - lum[1] = p[2]; - p += 4; - lum += 2; - } - if (w) { - lum[0] = p[0]; - } - p1 += src->linesize[0]; - lum1 += dst->linesize[0]; - } - cb1 += dst->linesize[1]; - cr1 += dst->linesize[2]; - } -} - -static void -uyvy422_to_gray (AVPicture * dst, const AVPicture * src, int width, int height) -{ - const uint8_t *p, *p1; - uint8_t *lum, *lum1; - int w; - - p1 = src->data[0]; - lum1 = dst->data[0]; - for (; height > 0; height--) { - p = p1; - lum = lum1; - - for (w = width; w >= 2; w -= 2) { - lum[0] = p[1]; - lum[1] = p[3]; - p += 4; - lum += 2; - } - - if (w) - lum[0] = p[1]; - - p1 += src->linesize[0]; - lum1 += dst->linesize[0]; - } -} - - -static void -uyvy422_to_yuv420p (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const uint8_t *p, *p1; - uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1; - int w; - - p1 = src->data[0]; - - lum1 = dst->data[0]; - cb1 = dst->data[1]; - cr1 = dst->data[2]; - - for (; height >= 1; height -= 2) { - p = p1; - lum = lum1; - cb = cb1; - cr = cr1; - for (w = width; w >= 2; w -= 2) { - lum[0] = p[1]; - cb[0] = p[0]; - lum[1] = p[3]; - cr[0] = p[2]; - p += 4; - lum += 2; - cb++; - cr++; - } - if (w) { - lum[0] = p[1]; - cb[0] = p[0]; - cr[0] = p[2]; - } - p1 += src->linesize[0]; - lum1 += dst->linesize[0]; - if (height > 1) { - p = p1; - lum = lum1; - for (w = width; w >= 2; w -= 2) { - lum[0] = p[1]; - lum[1] = p[3]; - p += 4; - lum += 2; - } - if (w) { - lum[0] = p[1]; - } - p1 += src->linesize[0]; - lum1 += dst->linesize[0]; - } - cb1 += dst->linesize[1]; - cr1 += dst->linesize[2]; - } -} - - -static void -uyvy422_to_yuv422p (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const uint8_t *p, *p1; - uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1; - int w; - - p1 = src->data[0]; - lum1 = dst->data[0]; - cb1 = dst->data[1]; - cr1 = dst->data[2]; - for (; height > 0; height--) { - p = p1; - lum = lum1; - cb = cb1; - cr = cr1; - for (w = width; w >= 2; w -= 2) { - lum[0] = p[1]; - cb[0] = p[0]; - lum[1] = p[3]; - cr[0] = p[2]; - p += 4; - lum += 2; - cb++; - cr++; - } - if (w) { - lum[0] = p[1]; - cb[0] = p[0]; - cr[0] = p[2]; - } - p1 += src->linesize[0]; - lum1 += dst->linesize[0]; - cb1 += dst->linesize[1]; - cr1 += dst->linesize[2]; - } -} - -static void -yvyu422_to_gray (AVPicture * dst, const AVPicture * src, int width, int height) -{ - const uint8_t *p, *p1; - uint8_t *lum, *lum1; - int w; - - p1 = src->data[0]; - lum1 = dst->data[0]; - for (; height > 0; height--) { - p = p1; - lum = lum1; - - for (w = width; w >= 2; w -= 2) { - lum[0] = p[0]; - lum[1] = p[2]; - p += 4; - lum += 2; - } - - if (w) - lum[0] = p[0]; - - p1 += src->linesize[0]; - lum1 += dst->linesize[0]; - } -} - -static void -yvyu422_to_yuv420p (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const uint8_t *p, *p1; - uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1; - int w; - - p1 = src->data[0]; - - lum1 = dst->data[0]; - cb1 = dst->data[1]; - cr1 = dst->data[2]; - - for (; height >= 1; height -= 2) { - p = p1; - lum = lum1; - cb = cb1; - cr = cr1; - for (w = width; w >= 2; w -= 2) { - lum[0] = p[0]; - cb[0] = p[3]; - lum[1] = p[2]; - cr[0] = p[1]; - p += 4; - lum += 2; - cb++; - cr++; - } - if (w) { - lum[0] = p[0]; - cb[0] = p[3]; - cr[0] = p[1]; - } - p1 += src->linesize[0]; - lum1 += dst->linesize[0]; - if (height > 1) { - p = p1; - lum = lum1; - for (w = width; w >= 2; w -= 2) { - lum[0] = p[0]; - lum[1] = p[2]; - p += 4; - lum += 2; - } - if (w) { - lum[0] = p[0]; - } - p1 += src->linesize[0]; - lum1 += dst->linesize[0]; - } - cb1 += dst->linesize[1]; - cr1 += dst->linesize[2]; - } -} - -static void -yvyu422_to_yuv422p (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const uint8_t *p, *p1; - uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1; - int w; - - p1 = src->data[0]; - lum1 = dst->data[0]; - cb1 = dst->data[1]; - cr1 = dst->data[2]; - for (; height > 0; height--) { - p = p1; - lum = lum1; - cb = cb1; - cr = cr1; - for (w = width; w >= 2; w -= 2) { - lum[0] = p[0]; - cb[0] = p[3]; - lum[1] = p[2]; - cr[0] = p[1]; - p += 4; - lum += 2; - cb++; - cr++; - } - if (w) { - lum[0] = p[0]; - cb[0] = p[3]; - cr[0] = p[1]; - } - p1 += src->linesize[0]; - lum1 += dst->linesize[0]; - cb1 += dst->linesize[1]; - cr1 += dst->linesize[2]; - } -} - -static void -yuv422_to_yuv422p (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const uint8_t *p, *p1; - uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1; - int w; - - p1 = src->data[0]; - lum1 = dst->data[0]; - cb1 = dst->data[1]; - cr1 = dst->data[2]; - for (; height > 0; height--) { - p = p1; - lum = lum1; - cb = cb1; - cr = cr1; - for (w = width; w >= 2; w -= 2) { - lum[0] = p[0]; - cb[0] = p[1]; - lum[1] = p[2]; - cr[0] = p[3]; - p += 4; - lum += 2; - cb++; - cr++; - } - if (w) { - lum[0] = p[0]; - cb[0] = p[1]; - cr[0] = p[3]; - } - p1 += src->linesize[0]; - lum1 += dst->linesize[0]; - cb1 += dst->linesize[1]; - cr1 += dst->linesize[2]; - } -} - -static void -yuv422p_to_yuv422 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - uint8_t *p, *p1; - const uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1; - int w; - - p1 = dst->data[0]; - lum1 = src->data[0]; - cb1 = src->data[1]; - cr1 = src->data[2]; - for (; height > 0; height--) { - p = p1; - lum = lum1; - cb = cb1; - cr = cr1; - for (w = width; w >= 2; w -= 2) { - p[0] = lum[0]; - p[1] = cb[0]; - p[2] = lum[1]; - p[3] = cr[0]; - p += 4; - lum += 2; - cb++; - cr++; - } - if (w) { - p[0] = lum[0]; - p[1] = cb[0]; - p[3] = cr[0]; - } - p1 += dst->linesize[0]; - lum1 += src->linesize[0]; - cb1 += src->linesize[1]; - cr1 += src->linesize[2]; - } -} - -static void -yuv422p_to_uyvy422 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - uint8_t *p, *p1; - const uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1; - int w; - - p1 = dst->data[0]; - lum1 = src->data[0]; - cb1 = src->data[1]; - cr1 = src->data[2]; - for (; height > 0; height--) { - p = p1; - lum = lum1; - cb = cb1; - cr = cr1; - for (w = width; w >= 2; w -= 2) { - p[1] = lum[0]; - p[0] = cb[0]; - p[3] = lum[1]; - p[2] = cr[0]; - p += 4; - lum += 2; - cb++; - cr++; - } - if (w) { - p[1] = lum[0]; - p[0] = cb[0]; - p[2] = cr[0]; - } - p1 += dst->linesize[0]; - lum1 += src->linesize[0]; - cb1 += src->linesize[1]; - cr1 += src->linesize[2]; - } -} - -static void -yuv422p_to_yvyu422 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - uint8_t *p, *p1; - const uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1; - int w; - - p1 = dst->data[0]; - lum1 = src->data[0]; - cb1 = src->data[1]; - cr1 = src->data[2]; - for (; height > 0; height--) { - p = p1; - lum = lum1; - cb = cb1; - cr = cr1; - for (w = width; w >= 2; w -= 2) { - p[0] = lum[0]; - p[3] = cb[0]; - p[2] = lum[1]; - p[1] = cr[0]; - p += 4; - lum += 2; - cb++; - cr++; - } - if (w) { - p[0] = lum[0]; - p[3] = cb[0]; - p[1] = cr[0]; - } - p1 += dst->linesize[0]; - lum1 += src->linesize[0]; - cb1 += src->linesize[1]; - cr1 += src->linesize[2]; - } -} - -static void -uyvy411_to_yuv411p (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const uint8_t *p, *p1; - uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1; - int w; - - p1 = src->data[0]; - lum1 = dst->data[0]; - cb1 = dst->data[1]; - cr1 = dst->data[2]; - for (; height > 0; height--) { - p = p1; - lum = lum1; - cb = cb1; - cr = cr1; - for (w = width; w >= 4; w -= 4) { - cb[0] = p[0]; - lum[0] = p[1]; - lum[1] = p[2]; - cr[0] = p[3]; - lum[2] = p[4]; - lum[3] = p[5]; - p += 6; - lum += 4; - cb++; - cr++; - } - p1 += src->linesize[0]; - lum1 += dst->linesize[0]; - cb1 += dst->linesize[1]; - cr1 += dst->linesize[2]; - } -} - -static void -yuv411p_to_uyvy411 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - uint8_t *p, *p1; - const uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1; - int w; - - p1 = dst->data[0]; - lum1 = src->data[0]; - cb1 = src->data[1]; - cr1 = src->data[2]; - for (; height > 0; height--) { - p = p1; - lum = lum1; - cb = cb1; - cr = cr1; - for (w = width; w >= 4; w -= 4) { - p[0] = cb[0]; - p[1] = lum[0]; - p[2] = lum[1]; - p[3] = cr[0]; - p[4] = lum[2]; - p[5] = lum[3]; - p += 6; - lum += 4; - cb++; - cr++; - } - p1 += dst->linesize[0]; - lum1 += src->linesize[0]; - cb1 += src->linesize[1]; - cr1 += src->linesize[2]; - } -} - -static void -yuv420p_to_yuv422 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - int w, h; - uint8_t *line1, *line2, *linesrc = dst->data[0]; - uint8_t *lum1, *lum2, *lumsrc = src->data[0]; - uint8_t *cb1, *cb2 = src->data[1]; - uint8_t *cr1, *cr2 = src->data[2]; - - for (h = height / 2; h--;) { - line1 = linesrc; - line2 = linesrc + dst->linesize[0]; - - lum1 = lumsrc; - lum2 = lumsrc + src->linesize[0]; - - cb1 = cb2; - cr1 = cr2; - - for (w = width / 2; w--;) { - *line1++ = *lum1++; - *line2++ = *lum2++; - *line1++ = *line2++ = *cb1++; - *line1++ = *lum1++; - *line2++ = *lum2++; - *line1++ = *line2++ = *cr1++; - } - /* odd width */ - if (width % 2 != 0) { - *line1++ = *lum1++; - *line2++ = *lum2++; - *line1++ = *line2++ = *cb1++; - } - - linesrc += dst->linesize[0] * 2; - lumsrc += src->linesize[0] * 2; - cb2 += src->linesize[1]; - cr2 += src->linesize[2]; - } - /* odd height */ - if (height % 2 != 0) { - line1 = linesrc; - lum1 = lumsrc; - cb1 = cb2; - cr1 = cr2; - - for (w = width / 2; w--;) { - *line1++ = *lum1++; - *line1++ = *cb1++; - *line1++ = *lum1++; - *line1++ = *cr1++; - } - /* odd width */ - if (width % 2 != 0) { - *line1++ = *lum1++; - *line1++ = *cb1++; - } - } -} - -static void -nv12_to_nv21 (AVPicture * dst, const AVPicture * src, int width, int height) -{ - const uint8_t *s_c_ptr; - uint8_t *d_c_ptr; - int w, c_wrap; - - memcpy (dst->data[0], src->data[0], src->linesize[0] * height); - - s_c_ptr = src->data[1]; - d_c_ptr = dst->data[1]; - c_wrap = src->linesize[1] - ((width + 1) & ~0x01); - - for (; height >= 2; height -= 2) { - for (w = width; w >= 2; w -= 2) { - d_c_ptr[0] = s_c_ptr[1]; - d_c_ptr[1] = s_c_ptr[0]; - s_c_ptr += 2; - d_c_ptr += 2; - } - - /* handle odd width */ - if (w) { - d_c_ptr[0] = s_c_ptr[1]; - d_c_ptr[1] = s_c_ptr[0]; - s_c_ptr += 2; - d_c_ptr += 2; - } - s_c_ptr += c_wrap; - d_c_ptr += c_wrap; - } - - /* handle odd height */ - if (height) { - for (w = width; w >= 2; w -= 2) { - d_c_ptr[0] = s_c_ptr[1]; - d_c_ptr[1] = s_c_ptr[0]; - s_c_ptr += 2; - d_c_ptr += 2; - } - - /* handle odd width */ - if (w) { - d_c_ptr[0] = s_c_ptr[1]; - d_c_ptr[1] = s_c_ptr[0]; - s_c_ptr += 2; - d_c_ptr += 2; - } - } -} - -static void -nv12_to_yuv444p (AVPicture * dst, const AVPicture * src, int width, int height) -{ - int w, h; - uint8_t *dst_lum1, *dst_lum2, *dst_line = dst->data[0]; - uint8_t *dst_cb1, *dst_cb2, *dst_cb_line = dst->data[1]; - uint8_t *dst_cr1, *dst_cr2, *dst_cr_line = dst->data[2]; - uint8_t *lum1, *lum2, *src_lum_line = src->data[0]; - uint8_t *src_c1, *src_c_line = src->data[1]; - uint8_t cb, cr; - - for (h = height / 2; h--;) { - dst_lum1 = dst_line; - dst_lum2 = dst_line + dst->linesize[0]; - - dst_cb1 = dst_cb_line; - dst_cb2 = dst_cb_line + dst->linesize[1]; - dst_cr1 = dst_cr_line; - dst_cr2 = dst_cr_line + dst->linesize[2]; - - lum1 = src_lum_line; - lum2 = src_lum_line + src->linesize[0]; - - src_c1 = src_c_line; - - for (w = width / 2; w--;) { - cb = *src_c1++; - cr = *src_c1++; - *dst_lum1++ = *lum1++; - *dst_lum2++ = *lum2++; - *dst_cb1++ = *dst_cb2++ = cb; - *dst_cr1++ = *dst_cr2++ = cr; - *dst_lum1++ = *lum1++; - *dst_lum2++ = *lum2++; - *dst_cb1++ = *dst_cb2++ = cb; - *dst_cr1++ = *dst_cr2++ = cr; - } - /* odd width */ - if (width % 2 != 0) { - cb = *src_c1++; - cr = *src_c1++; - *dst_lum1++ = *lum1++; - *dst_lum2++ = *lum2++; - *dst_cb1++ = *dst_cb2++ = *src_c1++; - *dst_cr1++ = *dst_cr2++ = *src_c1++; - } - - dst_line += dst->linesize[0] * 2; - dst_cb_line += dst->linesize[1] * 2; - dst_cr_line += dst->linesize[2] * 2; - src_lum_line += src->linesize[0] * 2; - src_c_line += src->linesize[1]; - } - - /* odd height */ - if (height % 2 != 0) { - dst_lum1 = dst_line; - lum1 = src_lum_line; - src_c1 = src_c_line; - dst_cb1 = dst_cb_line; - dst_cr1 = dst_cr_line; - - for (w = width / 2; w--;) { - cb = *src_c1++; - cr = *src_c1++; - *dst_lum1++ = *lum1++; - *dst_cb1++ = cb; - *dst_cr1++ = cr; - *dst_lum1++ = *lum1++; - *dst_cb1++ = cb; - *dst_cr1++ = cr; - } - /* odd width */ - if (width % 2 != 0) { - cb = *src_c1++; - cr = *src_c1++; - *dst_lum1++ = *lum1++; - *dst_cb1++ = cb; - *dst_cr1++ = cr; - } - } -} - -#define nv21_to_nv12 nv12_to_nv21 - -static void -nv21_to_yuv444p (AVPicture * dst, const AVPicture * src, int width, int height) -{ - int w, h; - uint8_t *dst_lum1, *dst_lum2, *dst_line = dst->data[0]; - uint8_t *dst_cb1, *dst_cb2, *dst_cb_line = dst->data[1]; - uint8_t *dst_cr1, *dst_cr2, *dst_cr_line = dst->data[2]; - uint8_t *lum1, *lum2, *src_lum_line = src->data[0]; - uint8_t *src_c1, *src_c_line = src->data[1]; - uint8_t cb, cr; - - for (h = height / 2; h--;) { - dst_lum1 = dst_line; - dst_lum2 = dst_line + dst->linesize[0]; - - dst_cb1 = dst_cb_line; - dst_cb2 = dst_cb_line + dst->linesize[1]; - dst_cr1 = dst_cr_line; - dst_cr2 = dst_cr_line + dst->linesize[2]; - - lum1 = src_lum_line; - lum2 = src_lum_line + src->linesize[0]; - - src_c1 = src_c_line; - - for (w = width / 2; w--;) { - cr = *src_c1++; - cb = *src_c1++; - *dst_lum1++ = *lum1++; - *dst_lum2++ = *lum2++; - *dst_cb1++ = *dst_cb2++ = cb; - *dst_cr1++ = *dst_cr2++ = cr; - *dst_lum1++ = *lum1++; - *dst_lum2++ = *lum2++; - *dst_cb1++ = *dst_cb2++ = cb; - *dst_cr1++ = *dst_cr2++ = cr; - } - /* odd width */ - if (width % 2 != 0) { - cr = *src_c1++; - cb = *src_c1++; - *dst_lum1++ = *lum1++; - *dst_lum2++ = *lum2++; - *dst_cb1++ = *dst_cb2++ = *src_c1++; - *dst_cr1++ = *dst_cr2++ = *src_c1++; - } - - dst_line += dst->linesize[0] * 2; - dst_cb_line += dst->linesize[1] * 2; - dst_cr_line += dst->linesize[2] * 2; - src_lum_line += src->linesize[0] * 2; - src_c_line += src->linesize[1]; - } - - /* odd height */ - if (height % 2 != 0) { - dst_lum1 = dst_line; - lum1 = src_lum_line; - src_c1 = src_c_line; - - dst_cb1 = dst_cb_line; - dst_cr1 = dst_cr_line; - - for (w = width / 2; w--;) { - cr = *src_c1++; - cb = *src_c1++; - *dst_lum1++ = *lum1++; - *dst_cb1++ = cb; - *dst_cr1++ = cr; - *dst_lum1++ = *lum1++; - *dst_cb1++ = cb; - *dst_cr1++ = cr; - } - /* odd width */ - if (width % 2 != 0) { - cr = *src_c1++; - cb = *src_c1++; - *dst_lum1++ = *lum1++; - *dst_cb1++ = cb; - *dst_cr1++ = cr; - } - } -} - -static void -yuva420p_to_yuv420p (AVPicture * dst, const AVPicture * src, int width, - int height) -{ - memcpy (dst->data[0], src->data[0], dst->linesize[0] * height); - memcpy (dst->data[1], src->data[1], dst->linesize[1] * ((height + 1) / 2)); - memcpy (dst->data[2], src->data[2], dst->linesize[2] * ((height + 1) / 2)); -} - -static void -yuva420p_to_yuv422 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - int w, h; - uint8_t *line1, *line2, *linesrc = dst->data[0]; - uint8_t *lum1, *lum2, *lumsrc = src->data[0]; - uint8_t *cb1, *cb2 = src->data[1]; - uint8_t *cr1, *cr2 = src->data[2]; - - for (h = height / 2; h--;) { - line1 = linesrc; - line2 = linesrc + dst->linesize[0]; - - lum1 = lumsrc; - lum2 = lumsrc + src->linesize[0]; - - cb1 = cb2; - cr1 = cr2; - - for (w = width / 2; w--;) { - *line1++ = *lum1++; - *line2++ = *lum2++; - *line1++ = *line2++ = *cb1++; - *line1++ = *lum1++; - *line2++ = *lum2++; - *line1++ = *line2++ = *cr1++; - } - /* odd width */ - if (width % 2 != 0) { - *line1++ = *lum1++; - *line2++ = *lum2++; - *line1++ = *line2++ = *cb1++; - } - - linesrc += dst->linesize[0] * 2; - lumsrc += src->linesize[0] * 2; - cb2 += src->linesize[1]; - cr2 += src->linesize[2]; - } - /* odd height */ - if (height % 2 != 0) { - line1 = linesrc; - lum1 = lumsrc; - cb1 = cb2; - cr1 = cr2; - - for (w = width / 2; w--;) { - *line1++ = *lum1++; - *line1++ = *cb1++; - *line1++ = *lum1++; - *line1++ = *cr1++; - } - /* odd width */ - if (width % 2 != 0) { - *line1++ = *lum1++; - *line1++ = *cb1++; - } - } -} - -#define SCALEBITS 10 -#define ONE_HALF (1 << (SCALEBITS - 1)) -#define FIX(x) ((int) ((x) * (1<> SCALEBITS];\ - g = cm[(y + g_add) >> SCALEBITS];\ - b = cm[(y + b_add) >> SCALEBITS];\ -} - -#define YUV_TO_RGB1(cb1, cr1)\ -{\ - cb = (cb1) - 128;\ - cr = (cr1) - 128;\ - r_add = FIX(1.40200) * cr + ONE_HALF;\ - g_add = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF;\ - b_add = FIX(1.77200) * cb + ONE_HALF;\ -} - -#define YUV_TO_RGB2(r, g, b, y1)\ -{\ - y = (y1) << SCALEBITS;\ - r = cm[(y + r_add) >> SCALEBITS];\ - g = cm[(y + g_add) >> SCALEBITS];\ - b = cm[(y + b_add) >> SCALEBITS];\ -} - -#define Y_CCIR_TO_JPEG(y)\ - cm[((y) * FIX(255.0/219.0) + (ONE_HALF - 16 * FIX(255.0/219.0))) >> SCALEBITS] - -#define Y_JPEG_TO_CCIR(y)\ - (((y) * FIX(219.0/255.0) + (ONE_HALF + (16 << SCALEBITS))) >> SCALEBITS) - -#define C_CCIR_TO_JPEG(y)\ - cm[(((y) - 128) * FIX(127.0/112.0) + (ONE_HALF + (128 << SCALEBITS))) >> SCALEBITS] - -/* NOTE: the clamp is really necessary! */ -static inline int -C_JPEG_TO_CCIR (int y) -{ - y = (((y - 128) * FIX (112.0 / 127.0) + (ONE_HALF + - (128 << SCALEBITS))) >> SCALEBITS); - if (y < 16) - y = 16; - return y; -} - - -#define RGB_TO_Y(r, g, b) \ -((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \ - FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS) - -#define RGB_TO_U(r1, g1, b1, shift)\ -(((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \ - FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128) - -#define RGB_TO_V(r1, g1, b1, shift)\ -(((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \ - FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128) - -#define RGB_TO_Y_CCIR(r, g, b) \ -((FIX(0.29900*219.0/255.0) * (r) + FIX(0.58700*219.0/255.0) * (g) + \ - FIX(0.11400*219.0/255.0) * (b) + (ONE_HALF + (16 << SCALEBITS))) >> SCALEBITS) - -#define RGB_TO_U_CCIR(r1, g1, b1, shift)\ -(((- FIX(0.16874*224.0/255.0) * r1 - FIX(0.33126*224.0/255.0) * g1 + \ - FIX(0.50000*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128) - -#define RGB_TO_V_CCIR(r1, g1, b1, shift)\ -(((FIX(0.50000*224.0/255.0) * r1 - FIX(0.41869*224.0/255.0) * g1 - \ - FIX(0.08131*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128) - -static uint8_t y_ccir_to_jpeg[256]; -static uint8_t y_jpeg_to_ccir[256]; -static uint8_t c_ccir_to_jpeg[256]; -static uint8_t c_jpeg_to_ccir[256]; - -/* init various conversion tables */ -static void -img_convert_init (void) -{ - int i; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - - for (i = 0; i < 256; i++) { - y_ccir_to_jpeg[i] = Y_CCIR_TO_JPEG (i); - y_jpeg_to_ccir[i] = Y_JPEG_TO_CCIR (i); - c_ccir_to_jpeg[i] = C_CCIR_TO_JPEG (i); - c_jpeg_to_ccir[i] = C_JPEG_TO_CCIR (i); - } -} - -/* apply to each pixel the given table */ -static void -img_apply_table (uint8_t * dst, int dst_wrap, - const uint8_t * src, int src_wrap, - int width, int height, const uint8_t * table1) -{ - int n; - const uint8_t *s; - uint8_t *d; - const uint8_t *table; - - table = table1; - for (; height > 0; height--) { - s = src; - d = dst; - n = width; - while (n >= 4) { - d[0] = table[s[0]]; - d[1] = table[s[1]]; - d[2] = table[s[2]]; - d[3] = table[s[3]]; - d += 4; - s += 4; - n -= 4; - } - while (n > 0) { - d[0] = table[s[0]]; - d++; - s++; - n--; - } - dst += dst_wrap; - src += src_wrap; - } -} - -/* XXX: use generic filter ? */ -/* XXX: in most cases, the sampling position is incorrect */ - -static void -img_copy_plane_resize (uint8_t * dst, int dst_wrap, int dst_width, - int dst_height, const uint8_t * src, int src_wrap, int src_width, - int src_height) -{ - img_copy_plane (dst, dst_wrap, src, src_wrap, dst_width, dst_height); -} - -/* 4x1 -> 1x1 */ -static void -shrink41 (uint8_t * dst, int dst_wrap, int dst_width, int dst_height, - const uint8_t * src, int src_wrap, int src_width, int src_height) -{ - int w, s_w; - const uint8_t *s; - uint8_t *d; - - for (; dst_height > 0; dst_height--) { - s = src; - d = dst; - for (s_w = src_width, w = dst_width; w > 0 && s_w > 3; w--, s_w -= 4) { - d[0] = (s[0] + s[1] + s[2] + s[3] + 2) >> 2; - s += 4; - d++; - } - - if (w) { - if (s_w == 3) - d[0] = (s[0] + s[1] + s[2]) / 3; - else if (s_w == 2) - d[0] = (s[0] + s[1]) / 2; - else /* s_w == 1 */ - d[0] = s[0]; - } - - src += src_wrap; - dst += dst_wrap; - } -} - -/* 2x1 -> 1x1 */ -static void -shrink21 (uint8_t * dst, int dst_wrap, int dst_width, int dst_height, - const uint8_t * src, int src_wrap, int src_width, int src_height) -{ - int w, s_w; - const uint8_t *s; - uint8_t *d; - - for (; dst_height > 0; dst_height--) { - s = src; - d = dst; - for (s_w = src_width, w = dst_width; w > 0 && s_w > 1; w--, s_w -= 2) { - d[0] = (s[0] + s[1]) >> 1; - s += 2; - d++; - } - - if (w) /* s_w == 1 */ - d[0] = s[0]; - - src += src_wrap; - dst += dst_wrap; - } -} - -/* 1x2 -> 1x1 */ -static void -shrink12 (uint8_t * dst, int dst_wrap, int dst_width, int dst_height, - const uint8_t * src, int src_wrap, int src_width, int src_height) -{ - int w; - uint8_t *d; - const uint8_t *s1, *s2; - - for (; dst_height > 0; dst_height--, src_height -= 2) { - s1 = src; - s2 = s1 + (src_height > 1 ? src_wrap : 0); - d = dst; - for (w = dst_width; w >= 4; w -= 4) { - d[0] = (s1[0] + s2[0]) >> 1; - d[1] = (s1[1] + s2[1]) >> 1; - d[2] = (s1[2] + s2[2]) >> 1; - d[3] = (s1[3] + s2[3]) >> 1; - s1 += 4; - s2 += 4; - d += 4; - } - for (; w > 0; w--) { - d[0] = (s1[0] + s2[0]) >> 1; - s1++; - s2++; - d++; - } - src += 2 * src_wrap; - dst += dst_wrap; - } -} - -/* 2x2 -> 1x1 */ -static void -shrink22 (uint8_t * dst, int dst_wrap, int dst_width, int dst_height, - const uint8_t * src, int src_wrap, int src_width, int src_height) -{ - int w, s_w; - const uint8_t *s1, *s2; - uint8_t *d; - - for (; dst_height > 0; dst_height--, src_height -= 2) { - s1 = src; - s2 = s1 + (src_height > 1 ? src_wrap : 0); - d = dst; - for (s_w = src_width, w = dst_width; w >= 4; w -= 4, s_w -= 8) { - d[0] = (s1[0] + s1[1] + s2[0] + s2[1] + 2) >> 2; - d[1] = (s1[2] + s1[3] + s2[2] + s2[3] + 2) >> 2; - d[2] = (s1[4] + s1[5] + s2[4] + s2[5] + 2) >> 2; - d[3] = (s1[6] + s1[7] + s2[6] + s2[7] + 2) >> 2; - s1 += 8; - s2 += 8; - d += 4; - } - for (; w > 0 && s_w > 1; w--, s_w -= 2) { - d[0] = (s1[0] + s1[1] + s2[0] + s2[1] + 2) >> 2; - s1 += 2; - s2 += 2; - d++; - } - - if (w) - d[0] = (s1[0] + s2[0] + 1) >> 1; - - src += 2 * src_wrap; - dst += dst_wrap; - } -} - -/* 4x4 -> 1x1 */ -static void -shrink44 (uint8_t * dst, int dst_wrap, int dst_width, int dst_height, - const uint8_t * src, int src_wrap, int src_width, int src_height) -{ - int s_w, w; - const uint8_t *s1, *s2, *s3, *s4; - uint8_t *d; - - for (; dst_height > 0; dst_height--, src_height -= 4) { - s1 = src; - s2 = s1 + (src_height > 1 ? src_wrap : 0); - s3 = s2 + (src_height > 2 ? src_wrap : 0); - s4 = s3 + (src_height > 3 ? src_wrap : 0); - d = dst; - for (s_w = src_width, w = dst_width; s_w > 3 && w > 0; w--, s_w -= 4) { - d[0] = (s1[0] + s1[1] + s1[2] + s1[3] + - s2[0] + s2[1] + s2[2] + s2[3] + - s3[0] + s3[1] + s3[2] + s3[3] + - s4[0] + s4[1] + s4[2] + s4[3] + 8) >> 4; - s1 += 4; - s2 += 4; - s3 += 4; - s4 += 4; - d++; - } - - if (w) { - if (s_w == 3) - d[0] = (s1[0] + s1[1] + s1[2] + - s2[0] + s2[1] + s2[2] + - s3[0] + s3[1] + s3[2] + s4[0] + s4[1] + s4[2]) / 12; - else if (s_w == 2) - d[0] = (s1[0] + s1[1] + - s2[0] + s2[1] + s3[0] + s3[1] + s4[0] + s4[1]) / 8; - else /* s_w == 1 */ - d[0] = (s1[0] + s2[0] + s3[0] + s4[0]) / 4; - } - - src += 4 * src_wrap; - dst += dst_wrap; - } -} - -static void -grow21_line (uint8_t * dst, const uint8_t * src, int width) -{ - int w; - const uint8_t *s1; - uint8_t *d; - - s1 = src; - d = dst; - for (w = width; w >= 4; w -= 4) { - d[1] = d[0] = s1[0]; - d[3] = d[2] = s1[1]; - s1 += 2; - d += 4; - } - for (; w >= 2; w -= 2) { - d[1] = d[0] = s1[0]; - s1++; - d += 2; - } - /* only needed if width is not a multiple of two */ - if (w) { - d[0] = s1[0]; - } -} - -static void -grow41_line (uint8_t * dst, const uint8_t * src, int width) -{ - int w, v; - const uint8_t *s1; - uint8_t *d; - - s1 = src; - d = dst; - for (w = width; w >= 4; w -= 4) { - v = s1[0]; - d[0] = v; - d[1] = v; - d[2] = v; - d[3] = v; - s1++; - d += 4; - } - for (; w > 0; w--) { - d[0] = s1[0]; - d++; - } -} - -/* 1x1 -> 2x1 */ -static void -grow21 (uint8_t * dst, int dst_wrap, int dst_width, int dst_height, - const uint8_t * src, int src_wrap, int src_width, int src_height) -{ - for (; dst_height > 0; dst_height--) { - grow21_line (dst, src, dst_width); - src += src_wrap; - dst += dst_wrap; - } -} - -/* 1x1 -> 2x2 */ -static void -grow22 (uint8_t * dst, int dst_wrap, int dst_width, int dst_height, - const uint8_t * src, int src_wrap, int src_width, int src_height) -{ - for (; dst_height > 0; dst_height--) { - grow21_line (dst, src, dst_width); - if (dst_height % 2) - src += src_wrap; - dst += dst_wrap; - } -} - -/* 1x1 -> 4x1 */ -static void -grow41 (uint8_t * dst, int dst_wrap, int dst_width, int dst_height, - const uint8_t * src, int src_wrap, int src_width, int src_height) -{ - for (; dst_height > 0; dst_height--) { - grow41_line (dst, src, dst_width); - src += src_wrap; - dst += dst_wrap; - } -} - -/* 1x1 -> 4x4 */ -static void -grow44 (uint8_t * dst, int dst_wrap, int dst_width, int dst_height, - const uint8_t * src, int src_wrap, int src_width, int src_height) -{ - for (; dst_height > 0; dst_height--) { - grow41_line (dst, src, dst_width); - if ((dst_height & 3) == 1) - src += src_wrap; - dst += dst_wrap; - } -} - -/* 1x2 -> 2x1 */ -static void -conv411 (uint8_t * dst, int dst_wrap, int dst_width, int dst_height, - const uint8_t * src, int src_wrap, int src_width, int src_height) -{ - int w, c; - const uint8_t *s1, *s2; - uint8_t *d; - - for (; dst_height > 0; dst_height--, src_height -= 2) { - s1 = src; - s2 = src + (src_height > 1 ? src_wrap : 0); - d = dst; - for (w = dst_width; w > 1; w -= 2) { - c = (s1[0] + s2[0]) >> 1; - d[0] = c; - d[1] = c; - s1++; - s2++; - d += 2; - } - - if (w) { - d[0] = (s1[0] + s2[0]) >> 1; - } - - src += src_wrap * 2; - dst += dst_wrap; - } -} - -/* XXX: add jpeg quantize code */ - -#define TRANSP_INDEX (6*6*6) - -/* this is maybe slow, but allows for extensions */ -static inline unsigned char -gif_clut_index (uint8_t r, uint8_t g, uint8_t b) -{ - return ((((r) / 47) % 6) * 6 * 6 + (((g) / 47) % 6) * 6 + (((b) / 47) % 6)); -} - -static void -build_rgb_palette (uint8_t * palette, int has_alpha) -{ - uint32_t *pal; - static const uint8_t pal_value[6] = { 0x00, 0x33, 0x66, 0x99, 0xcc, 0xff }; - int i, r, g, b; - - pal = (uint32_t *) palette; - i = 0; - for (r = 0; r < 6; r++) { - for (g = 0; g < 6; g++) { - for (b = 0; b < 6; b++) { - pal[i++] = (0xffU << 24) | (pal_value[r] << 16) | - (pal_value[g] << 8) | pal_value[b]; - } - } - } - if (has_alpha) - pal[i++] = 0; - while (i < 256) - pal[i++] = 0xff000000; -} - -/* copy bit n to bits 0 ... n - 1 */ -static inline unsigned int -bitcopy_n (unsigned int a, int n) -{ - int mask; - - mask = (1 << n) - 1; - return (a & (0xff & ~mask)) | ((-((a >> n) & 1)) & mask); -} - -/* rgb555 handling */ - -#define RGB_NAME rgb555 - -#define RGB_IN(r, g, b, s)\ -{\ - unsigned int v = ((const uint16_t *)(s))[0];\ - r = bitcopy_n(v >> (10 - 3), 3);\ - g = bitcopy_n(v >> (5 - 3), 3);\ - b = bitcopy_n(v << 3, 3);\ -} - -#define RGBA_IN(r, g, b, a, s)\ -{\ - unsigned int v = ((const uint16_t *)(s))[0];\ - r = bitcopy_n(v >> (10 - 3), 3);\ - g = bitcopy_n(v >> (5 - 3), 3);\ - b = bitcopy_n(v << 3, 3);\ - a = (-(v >> 15)) & 0xff;\ -} - -#define RGBA_OUT(d, r, g, b, a)\ -{\ - ((uint16_t *)(d))[0] = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3) | \ - ((a << 8) & 0x8000);\ -} - -#define BPP 2 - -#include "imgconvert_template.h" - -/* rgb565 handling */ - -#define RGB_NAME rgb565 - -#define RGB_IN(r, g, b, s)\ -{\ - unsigned int v = ((const uint16_t *)(s))[0];\ - r = bitcopy_n(v >> (11 - 3), 3);\ - g = bitcopy_n(v >> (5 - 2), 2);\ - b = bitcopy_n(v << 3, 3);\ -} - -#define RGB_OUT(d, r, g, b)\ -{\ - ((uint16_t *)(d))[0] = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);\ -} - -#define BPP 2 - -#include "imgconvert_template.h" - -/* bgr24 handling */ - -#define RGB_NAME bgr24 - -#define RGB_IN(r, g, b, s)\ -{\ - b = (s)[0];\ - g = (s)[1];\ - r = (s)[2];\ -} - -#define RGB_OUT(d, r, g, b)\ -{\ - (d)[0] = b;\ - (d)[1] = g;\ - (d)[2] = r;\ -} - -#define BPP 3 - -#include "imgconvert_template.h" - -#undef RGB_IN -#undef RGB_OUT -#undef BPP - -/* rgb24 handling */ - -#define RGB_NAME rgb24 -#define FMT_RGB24 - -#define RGB_IN(r, g, b, s)\ -{\ - r = (s)[0];\ - g = (s)[1];\ - b = (s)[2];\ -} - -#define RGB_OUT(d, r, g, b)\ -{\ - (d)[0] = r;\ - (d)[1] = g;\ - (d)[2] = b;\ -} - -#define BPP 3 - -#include "imgconvert_template.h" - -/* rgb32 handling */ - -#define RGB_NAME rgb32 -#define FMT_RGBA32 - -#define RGB_IN(r, g, b, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - r = (v >> 16) & 0xff;\ - g = (v >> 8) & 0xff;\ - b = v & 0xff;\ -} - -#define RGBA_IN(r, g, b, a, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - a = 0xff;\ - r = (v >> 16) & 0xff;\ - g = (v >> 8) & 0xff;\ - b = v & 0xff;\ -} - -#define RGBA_OUT(d, r, g, b, a)\ -{\ - ((uint32_t *)(d))[0] = (a << 24) | (r << 16) | (g << 8) | b;\ -} - -#define BPP 4 - -#include "imgconvert_template.h" - -/* bgr32 handling */ - -#define RGB_NAME bgr32 - -#define RGB_IN(r, g, b, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - r = (v >> 8) & 0xff;\ - g = (v >> 16) & 0xff;\ - b = (v >> 24) & 0xff;\ -} - -#define RGBA_IN(r, g, b, a, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - a = 0xff;\ - r = (v >> 8) & 0xff;\ - g = (v >> 16) & 0xff;\ - b = (v >> 24) & 0xff;\ -} - -#define RGBA_OUT(d, r, g, b, a)\ -{\ - ((uint32_t *)(d))[0] = a | (r << 8) | (g << 16) | (b << 24);\ -} - -#define BPP 4 - -#include "imgconvert_template.h" - -/* xrgb32 handling */ - -#define RGB_NAME xrgb32 -#define FMT_RGBA32 - -#define RGB_IN(r, g, b, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - r = (v >> 24) & 0xff;\ - g = (v >> 16) & 0xff;\ - b = (v >> 8) & 0xff;\ -} - -#define RGBA_IN(r, g, b, a, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - a = 0xff;\ - r = (v >> 24) & 0xff;\ - g = (v >> 16) & 0xff;\ - b = (v >> 8) & 0xff;\ -} - -#define RGBA_OUT(d, r, g, b, a)\ -{\ - ((uint32_t *)(d))[0] = (r << 24) | (g << 16) | (b << 8) | a;\ -} - -#define BPP 4 - -#include "imgconvert_template.h" - -/* bgrx32 handling */ - -#define RGB_NAME bgrx32 - -#define RGB_IN(r, g, b, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - r = (v) & 0xff;\ - g = (v >> 8) & 0xff;\ - b = (v >> 16) & 0xff;\ -} - -#define RGBA_IN(r, g, b, a, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - a = 0xff;\ - r = (v) & 0xff;\ - g = (v >> 8) & 0xff;\ - b = (v >> 16) & 0xff;\ -} - -#define RGBA_OUT(d, r, g, b, a)\ -{\ - ((uint32_t *)(d))[0] = r | (g << 8) | (b << 16) | (a << 24);\ -} - -#define BPP 4 - -#include "imgconvert_template.h" - -/* rgba32 handling */ - -#define RGB_NAME rgba32 -#define FMT_RGBA32 - -#define RGB_IN(r, g, b, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - r = (v >> 16) & 0xff;\ - g = (v >> 8) & 0xff;\ - b = v & 0xff;\ -} - -#define RGBA_IN(r, g, b, a, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - a = (v >> 24) & 0xff;\ - r = (v >> 16) & 0xff;\ - g = (v >> 8) & 0xff;\ - b = v & 0xff;\ -} - -#define RGBA_OUT(d, r, g, b, a)\ -{\ - ((uint32_t *)(d))[0] = (a << 24) | (r << 16) | (g << 8) | b;\ -} - -#define BPP 4 - -#include "imgconvert_template.h" - -/* bgra32 handling */ - -#define RGB_NAME bgra32 -#define FMT_BGRA32 - -#define RGB_IN(r, g, b, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - r = (v >> 8) & 0xff;\ - g = (v >> 16) & 0xff;\ - b = (v >> 24) & 0xff;\ -} - -#define RGBA_IN(r, g, b, a, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - a = v & 0xff;\ - r = (v >> 8) & 0xff;\ - g = (v >> 16) & 0xff;\ - b = (v >> 24) & 0xff;\ -} - -#define RGBA_OUT(d, r, g, b, a)\ -{\ - ((uint32_t *)(d))[0] = a | (r << 8) | (g << 16) | (b << 24 );\ -} - -#define BPP 4 - -#include "imgconvert_template.h" - -/* argb32 handling */ - -#define RGB_NAME argb32 -#define FMT_ARGB32 - -#define RGB_IN(r, g, b, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - r = (v >> 24) & 0xff;\ - g = (v >> 16) & 0xff;\ - b = (v >> 8) & 0xff;\ -} - -#define RGBA_IN(r, g, b, a, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - r = (v >> 24) & 0xff;\ - g = (v >> 16) & 0xff;\ - b = (v >> 8) & 0xff;\ - a = v & 0xff;\ -} - -#define RGBA_OUT(d, r, g, b, a)\ -{\ - ((uint32_t *)(d))[0] = (r << 24) | (g << 16) | (b << 8) | a;\ -} - -#define BPP 4 - -#include "imgconvert_template.h" - -/* abgr32 handling */ - -#define RGB_NAME abgr32 -#define FMT_ABGR32 - -#define RGB_IN(r, g, b, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - r = v & 0xff;\ - g = (v >> 8) & 0xff;\ - b = (v >> 16) & 0xff;\ -} - -#define RGBA_IN(r, g, b, a, s)\ -{\ - unsigned int v = ((const uint32_t *)(s))[0];\ - r = v & 0xff;\ - g = (v >> 8) & 0xff;\ - b = (v >> 16) & 0xff;\ - a = (v >> 24) & 0xff;\ -} - -#define RGBA_OUT(d, r, g, b, a)\ -{\ - ((uint32_t *)(d))[0] = r | (g << 8) | (b << 16) | (a << 24 );\ -} - -#define BPP 4 - -#include "imgconvert_template.h" - -static void -gray_to_gray16_l (AVPicture * dst, const AVPicture * src, int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - 2 * width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - GST_WRITE_UINT16_LE (q, (*p << 8)); - q += 2; - p++; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void -gray_to_gray16_b (AVPicture * dst, const AVPicture * src, int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - 2 * width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - GST_WRITE_UINT16_BE (q, (*p << 8)); - q += 2; - p++; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void -gray16_l_to_gray (AVPicture * dst, const AVPicture * src, int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - 2 * width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - q[0] = GST_READ_UINT16_LE (p) >> 8; - q++; - p += 2; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void -gray16_b_to_gray (AVPicture * dst, const AVPicture * src, int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - 2 * width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - q[0] = GST_READ_UINT16_BE (p) >> 8; - q++; - p += 2; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void -gray16_b_to_gray16_l (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - 2 * width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - 2 * width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - q[0] = p[1]; - q[1] = p[0]; - q += 2; - p += 2; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void -mono_to_gray (AVPicture * dst, const AVPicture * src, - int width, int height, int xor_mask) -{ - const unsigned char *p; - unsigned char *q; - int v, dst_wrap, src_wrap; - int y, w; - - p = src->data[0]; - src_wrap = src->linesize[0] - ((width + 7) >> 3); - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - width; - for (y = 0; y < height; y++) { - w = width; - while (w >= 8) { - v = *p++ ^ xor_mask; - q[0] = -(v >> 7); - q[1] = -((v >> 6) & 1); - q[2] = -((v >> 5) & 1); - q[3] = -((v >> 4) & 1); - q[4] = -((v >> 3) & 1); - q[5] = -((v >> 2) & 1); - q[6] = -((v >> 1) & 1); - q[7] = -((v >> 0) & 1); - w -= 8; - q += 8; - } - if (w > 0) { - v = *p++ ^ xor_mask; - do { - q[0] = -((v >> 7) & 1); - q++; - v <<= 1; - } while (--w); - } - p += src_wrap; - q += dst_wrap; - } -} - -static void -monowhite_to_gray (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - mono_to_gray (dst, src, width, height, 0xff); -} - -static void -monoblack_to_gray (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - mono_to_gray (dst, src, width, height, 0x00); -} - -static void -gray_to_mono (AVPicture * dst, const AVPicture * src, - int width, int height, int xor_mask) -{ - int n; - const uint8_t *s; - uint8_t *d; - int j, b, v, n1, src_wrap, dst_wrap, y; - - s = src->data[0]; - src_wrap = src->linesize[0] - width; - - d = dst->data[0]; - dst_wrap = dst->linesize[0] - ((width + 7) >> 3); - - for (y = 0; y < height; y++) { - n = width; - while (n >= 8) { - v = 0; - for (j = 0; j < 8; j++) { - b = s[0]; - s++; - v = (v << 1) | (b >> 7); - } - d[0] = v ^ xor_mask; - d++; - n -= 8; - } - if (n > 0) { - n1 = n; - v = 0; - while (n > 0) { - b = s[0]; - s++; - v = (v << 1) | (b >> 7); - n--; - } - d[0] = (v << (8 - (n1 & 7))) ^ xor_mask; - d++; - } - s += src_wrap; - d += dst_wrap; - } -} - -static void -gray_to_monowhite (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - gray_to_mono (dst, src, width, height, 0xff); -} - -static void -gray_to_monoblack (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - gray_to_mono (dst, src, width, height, 0x00); -} - -static void -y800_to_y16 (AVPicture * dst, const AVPicture * src, int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - 2 * width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - GST_WRITE_UINT16_LE (q, (*p << 8)); - q += 2; - p++; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void -y16_to_y800 (AVPicture * dst, const AVPicture * src, int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - 2 * width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - q[0] = GST_READ_UINT16_LE (p) >> 8; - q++; - p += 2; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void -yuva420p_to_ayuv4444 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const uint8_t *y1_ptr, *y2_ptr, *cb_ptr, *cr_ptr, *a1_ptr, *a2_ptr; - uint8_t *d, *d1, *d2; - int w, width2; - - d = dst->data[0]; - y1_ptr = src->data[0]; - cb_ptr = src->data[1]; - cr_ptr = src->data[2]; - a1_ptr = src->data[3]; - width2 = (width + 1) >> 1; - for (; height >= 2; height -= 2) { - d1 = d; - d2 = d + dst->linesize[0]; - y2_ptr = y1_ptr + src->linesize[0]; - a2_ptr = a1_ptr + src->linesize[3]; - for (w = width; w >= 2; w -= 2) { - d1[0] = a1_ptr[0]; - d1[1] = y1_ptr[0]; - d1[2] = cb_ptr[0]; - d1[3] = cr_ptr[0]; - - d1[4 + 0] = a1_ptr[1]; - d1[4 + 1] = y1_ptr[1]; - d1[4 + 2] = cb_ptr[0]; - d1[4 + 3] = cr_ptr[0]; - - d2[0] = a2_ptr[0]; - d2[1] = y2_ptr[0]; - d2[2] = cb_ptr[0]; - d2[3] = cr_ptr[0]; - - d2[4 + 0] = a2_ptr[1]; - d2[4 + 1] = y2_ptr[1]; - d2[4 + 2] = cb_ptr[0]; - d2[4 + 3] = cr_ptr[0]; - - d1 += 2 * 4; - d2 += 2 * 4; - - y1_ptr += 2; - y2_ptr += 2; - cb_ptr++; - cr_ptr++; - a1_ptr += 2; - a2_ptr += 2; - } - /* handle odd width */ - if (w) { - d1[0] = a1_ptr[0]; - d1[1] = y1_ptr[0]; - d1[2] = cb_ptr[0]; - d1[3] = cr_ptr[0]; - - d2[0] = a2_ptr[0]; - d2[1] = y2_ptr[0]; - d2[2] = cb_ptr[0]; - d2[3] = cr_ptr[0]; - - d1 += 4; - d2 += 4; - y1_ptr++; - y2_ptr++; - cb_ptr++; - cr_ptr++; - a1_ptr++; - a2_ptr++; - } - d += 2 * dst->linesize[0]; - y1_ptr += 2 * src->linesize[0] - width; - cb_ptr += src->linesize[1] - width2; - cr_ptr += src->linesize[2] - width2; - a1_ptr += 2 * src->linesize[3] - width; - } - /* handle odd height */ - if (height) { - d1 = d; - for (w = width; w >= 2; w -= 2) { - d1[0] = a1_ptr[0]; - d1[1] = y1_ptr[0]; - d1[2] = cb_ptr[0]; - d1[3] = cr_ptr[0]; - - d1[4 + 0] = a1_ptr[1]; - d1[4 + 1] = y1_ptr[1]; - d1[4 + 2] = cb_ptr[0]; - d1[4 + 3] = cr_ptr[0]; - - d1 += 2 * 4; - - y1_ptr += 2; - cb_ptr++; - cr_ptr++; - a1_ptr += 2; - } - /* handle width */ - if (w) { - d1[0] = a1_ptr[0]; - d1[1] = y1_ptr[0]; - d1[2] = cb_ptr[0]; - d1[3] = cr_ptr[0]; - d1 += 4; - - y1_ptr++; - cb_ptr++; - cr_ptr++; - a1_ptr++; - } - } -} - -static void -ayuv4444_to_yuva420p (AVPicture * dst, - const AVPicture * src, int width, int height) -{ - int wrap, wrap3, width2; - int u1, v1, w; - uint8_t *lum, *cb, *cr, *a; - const uint8_t *p; - - lum = dst->data[0]; - cb = dst->data[1]; - cr = dst->data[2]; - a = dst->data[3]; - - width2 = (width + 1) >> 1; - wrap = dst->linesize[0]; - wrap3 = src->linesize[0]; - p = src->data[0]; - for (; height >= 2; height -= 2) { - for (w = width; w >= 2; w -= 2) { - a[0] = p[0]; - lum[0] = p[1]; - u1 = p[2]; - v1 = p[3]; - - a[1] = p[4 + 0]; - lum[1] = p[4 + 1]; - u1 += p[4 + 2]; - v1 += p[4 + 3]; - p += wrap3; - lum += wrap; - a += wrap; - - a[0] = p[0]; - lum[0] = p[1]; - u1 += p[2]; - v1 += p[3]; - - a[1] = p[4 + 0]; - lum[1] = p[4 + 1]; - u1 += p[4 + 2]; - v1 += p[4 + 3]; - - cb[0] = u1 >> 2; - cr[0] = v1 >> 2; - - cb++; - cr++; - p += -wrap3 + 2 * 4; - lum += -wrap + 2; - a += -wrap + 2; - } - if (w) { - a[0] = p[0]; - lum[0] = p[1]; - u1 = p[2]; - v1 = p[3]; - p += wrap3; - lum += wrap; - a += wrap; - - a[0] = p[0]; - lum[0] = p[1]; - u1 += p[2]; - v1 += p[3]; - - cb[0] = u1 >> 1; - cr[0] = v1 >> 1; - cb++; - cr++; - p += -wrap3 + 4; - lum += -wrap + 1; - a += -wrap + 1; - } - p += wrap3 + (wrap3 - width * 4); - lum += wrap + (wrap - width); - a += wrap + (wrap - width); - cb += dst->linesize[1] - width2; - cr += dst->linesize[2] - width2; - } - /* handle odd height */ - if (height) { - for (w = width; w >= 2; w -= 2) { - a[0] = p[0]; - lum[0] = p[1]; - u1 = p[2]; - v1 = p[3]; - - a[1] = p[4 + 0]; - lum[1] = p[4 + 1]; - u1 += p[4 + 2]; - v1 += p[4 + 3]; - cb[0] = u1 >> 1; - cr[0] = v1 >> 1; - cb++; - cr++; - p += 2 * 4; - lum += 2; - a += 2; - } - if (w) { - a[0] = p[0]; - lum[0] = p[1]; - cb[0] = p[2]; - cr[0] = p[3]; - } - } -} - -typedef struct ConvertEntry -{ - enum PixelFormat src; - enum PixelFormat dest; - void (*convert) (AVPicture * dst, - const AVPicture * src, int width, int height); -} ConvertEntry; - -/* Add each new convertion function in this table. In order to be able - to convert from any format to any format, the following constraints - must be satisfied: - - - all FF_COLOR_RGB formats must convert to and from PIX_FMT_RGB24 - - - all FF_COLOR_GRAY formats must convert to and from PIX_FMT_GRAY8 - - - all FF_COLOR_RGB formats with alpha must convert to and from PIX_FMT_RGBA32 - - - PIX_FMT_YUV444P and PIX_FMT_YUVJ444P must convert to and from - PIX_FMT_RGB24. - - - PIX_FMT_422 must convert to and from PIX_FMT_422P. - - The other conversion functions are just optimisations for common cases. -*/ -static ConvertEntry convert_table[] = { - {PIX_FMT_YUV420P, PIX_FMT_YUV422, yuv420p_to_yuv422}, - {PIX_FMT_YUV420P, PIX_FMT_RGB555, yuv420p_to_rgb555}, - {PIX_FMT_YUV420P, PIX_FMT_RGB565, yuv420p_to_rgb565}, - {PIX_FMT_YUV420P, PIX_FMT_BGR24, yuv420p_to_bgr24}, - {PIX_FMT_YUV420P, PIX_FMT_RGB24, yuv420p_to_rgb24}, - {PIX_FMT_YUV420P, PIX_FMT_RGB32, yuv420p_to_rgb32}, - {PIX_FMT_YUV420P, PIX_FMT_BGR32, yuv420p_to_bgr32}, - {PIX_FMT_YUV420P, PIX_FMT_xRGB32, yuv420p_to_xrgb32}, - {PIX_FMT_YUV420P, PIX_FMT_BGRx32, yuv420p_to_bgrx32}, - {PIX_FMT_YUV420P, PIX_FMT_RGBA32, yuv420p_to_rgba32}, - {PIX_FMT_YUV420P, PIX_FMT_BGRA32, yuv420p_to_bgra32}, - {PIX_FMT_YUV420P, PIX_FMT_ARGB32, yuv420p_to_argb32}, - {PIX_FMT_YUV420P, PIX_FMT_ABGR32, yuv420p_to_abgr32}, - - {PIX_FMT_NV12, PIX_FMT_RGB555, nv12_to_rgb555}, - {PIX_FMT_NV12, PIX_FMT_RGB565, nv12_to_rgb565}, - {PIX_FMT_NV12, PIX_FMT_BGR24, nv12_to_bgr24}, - {PIX_FMT_NV12, PIX_FMT_RGB24, nv12_to_rgb24}, - {PIX_FMT_NV12, PIX_FMT_RGB32, nv12_to_rgb32}, - {PIX_FMT_NV12, PIX_FMT_BGR32, nv12_to_bgr32}, - {PIX_FMT_NV12, PIX_FMT_xRGB32, nv12_to_xrgb32}, - {PIX_FMT_NV12, PIX_FMT_BGRx32, nv12_to_bgrx32}, - {PIX_FMT_NV12, PIX_FMT_RGBA32, nv12_to_rgba32}, - {PIX_FMT_NV12, PIX_FMT_BGRA32, nv12_to_bgra32}, - {PIX_FMT_NV12, PIX_FMT_ARGB32, nv12_to_argb32}, - {PIX_FMT_NV12, PIX_FMT_ABGR32, nv12_to_abgr32}, - {PIX_FMT_NV12, PIX_FMT_NV21, nv12_to_nv21}, - {PIX_FMT_NV12, PIX_FMT_YUV444P, nv12_to_yuv444p}, - - {PIX_FMT_NV21, PIX_FMT_RGB555, nv21_to_rgb555}, - {PIX_FMT_NV21, PIX_FMT_RGB565, nv21_to_rgb565}, - {PIX_FMT_NV21, PIX_FMT_BGR24, nv21_to_bgr24}, - {PIX_FMT_NV21, PIX_FMT_RGB24, nv21_to_rgb24}, - {PIX_FMT_NV21, PIX_FMT_RGB32, nv21_to_rgb32}, - {PIX_FMT_NV21, PIX_FMT_BGR32, nv21_to_bgr32}, - {PIX_FMT_NV21, PIX_FMT_xRGB32, nv21_to_xrgb32}, - {PIX_FMT_NV21, PIX_FMT_BGRx32, nv21_to_bgrx32}, - {PIX_FMT_NV21, PIX_FMT_RGBA32, nv21_to_rgba32}, - {PIX_FMT_NV21, PIX_FMT_BGRA32, nv21_to_bgra32}, - {PIX_FMT_NV21, PIX_FMT_ARGB32, nv21_to_argb32}, - {PIX_FMT_NV21, PIX_FMT_ABGR32, nv21_to_abgr32}, - {PIX_FMT_NV21, PIX_FMT_YUV444P, nv21_to_yuv444p}, - {PIX_FMT_NV21, PIX_FMT_NV12, nv21_to_nv12}, - - {PIX_FMT_YUV422P, PIX_FMT_YUV422, yuv422p_to_yuv422}, - {PIX_FMT_YUV422P, PIX_FMT_UYVY422, yuv422p_to_uyvy422}, - {PIX_FMT_YUV422P, PIX_FMT_YVYU422, yuv422p_to_yvyu422}, - - {PIX_FMT_YUV444P, PIX_FMT_RGB24, yuv444p_to_rgb24}, - - {PIX_FMT_YUVJ420P, PIX_FMT_RGB555, yuvj420p_to_rgb555}, - {PIX_FMT_YUVJ420P, PIX_FMT_RGB565, yuvj420p_to_rgb565}, - {PIX_FMT_YUVJ420P, PIX_FMT_BGR24, yuvj420p_to_bgr24}, - {PIX_FMT_YUVJ420P, PIX_FMT_RGB24, yuvj420p_to_rgb24}, - {PIX_FMT_YUVJ420P, PIX_FMT_RGB32, yuvj420p_to_rgb32}, - {PIX_FMT_YUVJ420P, PIX_FMT_BGR32, yuvj420p_to_bgr32}, - {PIX_FMT_YUVJ420P, PIX_FMT_RGB32, yuvj420p_to_xrgb32}, - {PIX_FMT_YUVJ420P, PIX_FMT_BGR32, yuvj420p_to_bgrx32}, - {PIX_FMT_YUVJ420P, PIX_FMT_RGBA32, yuvj420p_to_rgba32}, - {PIX_FMT_YUVJ420P, PIX_FMT_BGRA32, yuvj420p_to_bgra32}, - {PIX_FMT_YUVJ420P, PIX_FMT_ARGB32, yuvj420p_to_argb32}, - {PIX_FMT_YUVJ420P, PIX_FMT_ABGR32, yuvj420p_to_abgr32}, - - {PIX_FMT_YUVJ444P, PIX_FMT_RGB24, yuvj444p_to_rgb24}, - - {PIX_FMT_YUV422, PIX_FMT_YUV420P, yuv422_to_yuv420p}, - {PIX_FMT_YUV422, PIX_FMT_YUV422P, yuv422_to_yuv422p}, - {PIX_FMT_YUV422, PIX_FMT_GRAY8, yvyu422_to_gray}, - {PIX_FMT_YUV422, PIX_FMT_RGB555, yuv422_to_rgb555}, - {PIX_FMT_YUV422, PIX_FMT_RGB565, yuv422_to_rgb565}, - {PIX_FMT_YUV422, PIX_FMT_BGR24, yuv422_to_bgr24}, - {PIX_FMT_YUV422, PIX_FMT_RGB24, yuv422_to_rgb24}, - {PIX_FMT_YUV422, PIX_FMT_BGR32, yuv422_to_bgr32}, - {PIX_FMT_YUV422, PIX_FMT_RGB32, yuv422_to_rgb32}, - {PIX_FMT_YUV422, PIX_FMT_xRGB32, yuv422_to_xrgb32}, - {PIX_FMT_YUV422, PIX_FMT_BGRx32, yuv422_to_bgrx32}, - {PIX_FMT_YUV422, PIX_FMT_BGRA32, yuv422_to_bgra32}, - {PIX_FMT_YUV422, PIX_FMT_RGBA32, yuv422_to_rgba32}, - {PIX_FMT_YUV422, PIX_FMT_ABGR32, yuv422_to_abgr32}, - {PIX_FMT_YUV422, PIX_FMT_ARGB32, yuv422_to_argb32}, - - {PIX_FMT_UYVY422, PIX_FMT_YUV420P, uyvy422_to_yuv420p}, - {PIX_FMT_UYVY422, PIX_FMT_YUV422P, uyvy422_to_yuv422p}, - {PIX_FMT_UYVY422, PIX_FMT_GRAY8, uyvy422_to_gray}, - {PIX_FMT_UYVY422, PIX_FMT_RGB555, uyvy422_to_rgb555}, - {PIX_FMT_UYVY422, PIX_FMT_RGB565, uyvy422_to_rgb565}, - {PIX_FMT_UYVY422, PIX_FMT_BGR24, uyvy422_to_bgr24}, - {PIX_FMT_UYVY422, PIX_FMT_RGB24, uyvy422_to_rgb24}, - {PIX_FMT_UYVY422, PIX_FMT_RGB32, uyvy422_to_rgb32}, - {PIX_FMT_UYVY422, PIX_FMT_BGR32, uyvy422_to_bgr32}, - {PIX_FMT_UYVY422, PIX_FMT_xRGB32, uyvy422_to_xrgb32}, - {PIX_FMT_UYVY422, PIX_FMT_BGRx32, uyvy422_to_bgrx32}, - {PIX_FMT_UYVY422, PIX_FMT_RGBA32, uyvy422_to_rgba32}, - {PIX_FMT_UYVY422, PIX_FMT_BGRA32, uyvy422_to_bgra32}, - {PIX_FMT_UYVY422, PIX_FMT_ARGB32, uyvy422_to_argb32}, - {PIX_FMT_UYVY422, PIX_FMT_ABGR32, uyvy422_to_abgr32}, - - {PIX_FMT_YVYU422, PIX_FMT_YUV420P, yvyu422_to_yuv420p}, - {PIX_FMT_YVYU422, PIX_FMT_YUV422P, yvyu422_to_yuv422p}, - {PIX_FMT_YVYU422, PIX_FMT_GRAY8, yvyu422_to_gray}, - {PIX_FMT_YVYU422, PIX_FMT_RGB555, yvyu422_to_rgb555}, - {PIX_FMT_YVYU422, PIX_FMT_RGB565, yvyu422_to_rgb565}, - {PIX_FMT_YVYU422, PIX_FMT_BGR24, yvyu422_to_bgr24}, - {PIX_FMT_YVYU422, PIX_FMT_RGB24, yvyu422_to_rgb24}, - {PIX_FMT_YVYU422, PIX_FMT_BGR32, yvyu422_to_bgr32}, - {PIX_FMT_YVYU422, PIX_FMT_RGB32, yvyu422_to_rgb32}, - {PIX_FMT_YVYU422, PIX_FMT_xRGB32, yvyu422_to_xrgb32}, - {PIX_FMT_YVYU422, PIX_FMT_BGRx32, yvyu422_to_bgrx32}, - {PIX_FMT_YVYU422, PIX_FMT_BGRA32, yvyu422_to_bgra32}, - {PIX_FMT_YVYU422, PIX_FMT_RGBA32, yvyu422_to_rgba32}, - {PIX_FMT_YVYU422, PIX_FMT_ABGR32, yvyu422_to_abgr32}, - {PIX_FMT_YVYU422, PIX_FMT_ARGB32, yvyu422_to_argb32}, - - {PIX_FMT_RGB24, PIX_FMT_YUV420P, rgb24_to_yuv420p}, - {PIX_FMT_RGB24, PIX_FMT_YUVA420P, rgb24_to_yuva420p}, - {PIX_FMT_RGB24, PIX_FMT_NV12, rgb24_to_nv12}, - {PIX_FMT_RGB24, PIX_FMT_NV21, rgb24_to_nv21}, - {PIX_FMT_RGB24, PIX_FMT_RGB565, rgb24_to_rgb565}, - {PIX_FMT_RGB24, PIX_FMT_RGB555, rgb24_to_rgb555}, - {PIX_FMT_RGB24, PIX_FMT_RGB32, rgb24_to_rgb32}, - {PIX_FMT_RGB24, PIX_FMT_BGR32, rgb24_to_bgr32}, - {PIX_FMT_RGB24, PIX_FMT_xRGB32, rgb24_to_xrgb32}, - {PIX_FMT_RGB24, PIX_FMT_BGRx32, rgb24_to_bgrx32}, - {PIX_FMT_RGB24, PIX_FMT_RGBA32, rgb24_to_rgba32}, - {PIX_FMT_RGB24, PIX_FMT_BGR24, rgb24_to_bgr24}, - {PIX_FMT_RGB24, PIX_FMT_BGRA32, rgb24_to_bgra32}, - {PIX_FMT_RGB24, PIX_FMT_ARGB32, rgb24_to_argb32}, - {PIX_FMT_RGB24, PIX_FMT_ABGR32, rgb24_to_abgr32}, - {PIX_FMT_RGB24, PIX_FMT_Y800, rgb24_to_y800}, - {PIX_FMT_RGB24, PIX_FMT_Y16, rgb24_to_y16}, - {PIX_FMT_RGB24, PIX_FMT_GRAY8, rgb24_to_gray}, - {PIX_FMT_RGB24, PIX_FMT_GRAY16_L, rgb24_to_gray16_l}, - {PIX_FMT_RGB24, PIX_FMT_GRAY16_B, rgb24_to_gray16_b}, - {PIX_FMT_RGB24, PIX_FMT_PAL8, rgb24_to_pal8}, - {PIX_FMT_RGB24, PIX_FMT_YUV444P, rgb24_to_yuv444p}, - {PIX_FMT_RGB24, PIX_FMT_YUVJ420P, rgb24_to_yuvj420p}, - {PIX_FMT_RGB24, PIX_FMT_YUVJ444P, rgb24_to_yuvj444p}, - {PIX_FMT_RGB24, PIX_FMT_AYUV4444, rgb24_to_ayuv4444}, - {PIX_FMT_RGB24, PIX_FMT_V308, rgb24_to_v308}, - - {PIX_FMT_RGB32, PIX_FMT_RGB24, rgb32_to_rgb24}, - {PIX_FMT_RGB32, PIX_FMT_RGB555, rgba32_to_rgb555}, - {PIX_FMT_RGB32, PIX_FMT_PAL8, rgb32_to_pal8}, - {PIX_FMT_RGB32, PIX_FMT_YUV420P, rgb32_to_yuv420p}, - {PIX_FMT_RGB32, PIX_FMT_YUVA420P, rgb32_to_yuva420p}, - {PIX_FMT_RGB32, PIX_FMT_NV12, rgb32_to_nv12}, - {PIX_FMT_RGB32, PIX_FMT_NV21, rgb32_to_nv21}, - {PIX_FMT_RGB32, PIX_FMT_Y800, rgb32_to_y800}, - {PIX_FMT_RGB32, PIX_FMT_Y16, rgb32_to_y16}, - {PIX_FMT_RGB32, PIX_FMT_GRAY8, rgb32_to_gray}, - {PIX_FMT_RGB32, PIX_FMT_GRAY16_L, rgb32_to_gray16_l}, - {PIX_FMT_RGB32, PIX_FMT_GRAY16_B, rgb32_to_gray16_b}, - - {PIX_FMT_xRGB32, PIX_FMT_RGB24, xrgb32_to_rgb24}, - {PIX_FMT_xRGB32, PIX_FMT_PAL8, xrgb32_to_pal8}, - {PIX_FMT_xRGB32, PIX_FMT_YUV420P, xrgb32_to_yuv420p}, - {PIX_FMT_xRGB32, PIX_FMT_YUVA420P, xrgb32_to_yuva420p}, - {PIX_FMT_xRGB32, PIX_FMT_NV12, xrgb32_to_nv12}, - {PIX_FMT_xRGB32, PIX_FMT_NV21, xrgb32_to_nv21}, - {PIX_FMT_xRGB32, PIX_FMT_Y800, xrgb32_to_y800}, - {PIX_FMT_xRGB32, PIX_FMT_Y16, xrgb32_to_y16}, - {PIX_FMT_xRGB32, PIX_FMT_GRAY8, xrgb32_to_gray}, - {PIX_FMT_xRGB32, PIX_FMT_GRAY16_L, xrgb32_to_gray16_l}, - {PIX_FMT_xRGB32, PIX_FMT_GRAY16_B, xrgb32_to_gray16_b}, - - {PIX_FMT_RGBA32, PIX_FMT_BGRA32, rgba32_to_bgra32}, - {PIX_FMT_RGBA32, PIX_FMT_ABGR32, rgba32_to_abgr32}, - {PIX_FMT_RGBA32, PIX_FMT_ARGB32, rgba32_to_argb32}, - {PIX_FMT_RGBA32, PIX_FMT_BGR32, rgba32_to_bgr32}, - {PIX_FMT_RGBA32, PIX_FMT_BGRx32, rgba32_to_bgrx32}, - {PIX_FMT_RGBA32, PIX_FMT_ABGR32, rgba32_to_abgr32}, - {PIX_FMT_RGBA32, PIX_FMT_RGB24, rgba32_to_rgb24}, - {PIX_FMT_RGBA32, PIX_FMT_RGB555, rgba32_to_rgb555}, - {PIX_FMT_RGBA32, PIX_FMT_PAL8, rgba32_to_pal8}, - {PIX_FMT_RGBA32, PIX_FMT_YUV420P, rgba32_to_yuv420p}, - {PIX_FMT_RGBA32, PIX_FMT_YUVA420P, rgba32_to_yuva420p}, - {PIX_FMT_RGBA32, PIX_FMT_NV12, rgba32_to_nv12}, - {PIX_FMT_RGBA32, PIX_FMT_NV21, rgba32_to_nv21}, - {PIX_FMT_RGBA32, PIX_FMT_Y800, rgba32_to_y800}, - {PIX_FMT_RGBA32, PIX_FMT_Y16, rgba32_to_y16}, - {PIX_FMT_RGBA32, PIX_FMT_GRAY8, rgba32_to_gray}, - {PIX_FMT_RGBA32, PIX_FMT_GRAY16_L, rgba32_to_gray16_l}, - {PIX_FMT_RGBA32, PIX_FMT_GRAY16_B, rgba32_to_gray16_b}, - {PIX_FMT_RGBA32, PIX_FMT_AYUV4444, rgba32_to_ayuv4444}, - - {PIX_FMT_BGR24, PIX_FMT_RGB24, bgr24_to_rgb24}, - {PIX_FMT_BGR24, PIX_FMT_YUV420P, bgr24_to_yuv420p}, - {PIX_FMT_BGR24, PIX_FMT_YUVA420P, bgr24_to_yuva420p}, - {PIX_FMT_BGR24, PIX_FMT_NV12, bgr24_to_nv12}, - {PIX_FMT_BGR24, PIX_FMT_NV21, bgr24_to_nv21}, - {PIX_FMT_BGR24, PIX_FMT_Y800, bgr24_to_y800}, - {PIX_FMT_BGR24, PIX_FMT_Y16, bgr24_to_y16}, - {PIX_FMT_BGR24, PIX_FMT_GRAY8, bgr24_to_gray}, - {PIX_FMT_BGR24, PIX_FMT_GRAY16_L, bgr24_to_gray16_l}, - {PIX_FMT_BGR24, PIX_FMT_GRAY16_B, bgr24_to_gray16_b}, - - {PIX_FMT_BGR32, PIX_FMT_RGB24, bgr32_to_rgb24}, - {PIX_FMT_BGR32, PIX_FMT_RGBA32, bgr32_to_rgba32}, - {PIX_FMT_BGR32, PIX_FMT_YUV420P, bgr32_to_yuv420p}, - {PIX_FMT_BGR32, PIX_FMT_YUVA420P, bgr32_to_yuva420p}, - {PIX_FMT_BGR32, PIX_FMT_NV12, bgr32_to_nv12}, - {PIX_FMT_BGR32, PIX_FMT_NV21, bgr32_to_nv21}, - {PIX_FMT_BGR32, PIX_FMT_Y800, bgr32_to_y800}, - {PIX_FMT_BGR32, PIX_FMT_Y16, bgr32_to_y16}, - {PIX_FMT_BGR32, PIX_FMT_GRAY8, bgr32_to_gray}, - {PIX_FMT_BGR32, PIX_FMT_GRAY16_L, bgr32_to_gray16_l}, - {PIX_FMT_BGR32, PIX_FMT_GRAY16_B, bgr32_to_gray16_b}, - - {PIX_FMT_BGRx32, PIX_FMT_RGB24, bgrx32_to_rgb24}, - {PIX_FMT_BGRx32, PIX_FMT_RGBA32, bgrx32_to_rgba32}, - {PIX_FMT_BGRx32, PIX_FMT_YUV420P, bgrx32_to_yuv420p}, - {PIX_FMT_BGRx32, PIX_FMT_YUVA420P, bgrx32_to_yuva420p}, - {PIX_FMT_BGRx32, PIX_FMT_NV12, bgrx32_to_nv12}, - {PIX_FMT_BGRx32, PIX_FMT_NV21, bgrx32_to_nv21}, - {PIX_FMT_BGRx32, PIX_FMT_Y800, bgrx32_to_y800}, - {PIX_FMT_BGRx32, PIX_FMT_Y16, bgrx32_to_y16}, - {PIX_FMT_BGRx32, PIX_FMT_GRAY8, bgrx32_to_gray}, - {PIX_FMT_BGRx32, PIX_FMT_GRAY16_L, bgrx32_to_gray16_l}, - {PIX_FMT_BGRx32, PIX_FMT_GRAY16_B, bgrx32_to_gray16_b}, - - {PIX_FMT_BGRA32, PIX_FMT_RGB24, bgra32_to_rgb24}, - {PIX_FMT_BGRA32, PIX_FMT_RGBA32, bgra32_to_rgba32}, - {PIX_FMT_BGRA32, PIX_FMT_YUV420P, bgra32_to_yuv420p}, - {PIX_FMT_BGRA32, PIX_FMT_YUVA420P, bgra32_to_yuva420p}, - {PIX_FMT_BGRA32, PIX_FMT_NV12, bgra32_to_nv12}, - {PIX_FMT_BGRA32, PIX_FMT_NV21, bgra32_to_nv21}, - {PIX_FMT_BGRA32, PIX_FMT_Y800, bgra32_to_y800}, - {PIX_FMT_BGRA32, PIX_FMT_Y16, bgra32_to_y16}, - {PIX_FMT_BGRA32, PIX_FMT_GRAY8, bgra32_to_gray}, - {PIX_FMT_BGRA32, PIX_FMT_GRAY16_L, bgra32_to_gray16_l}, - {PIX_FMT_BGRA32, PIX_FMT_GRAY16_B, bgra32_to_gray16_b}, - {PIX_FMT_BGRA32, PIX_FMT_AYUV4444, bgra32_to_ayuv4444}, - - {PIX_FMT_ABGR32, PIX_FMT_RGB24, abgr32_to_rgb24}, - {PIX_FMT_ABGR32, PIX_FMT_RGBA32, abgr32_to_rgba32}, - {PIX_FMT_ABGR32, PIX_FMT_YUV420P, abgr32_to_yuv420p}, - {PIX_FMT_ABGR32, PIX_FMT_YUVA420P, abgr32_to_yuva420p}, - {PIX_FMT_ABGR32, PIX_FMT_NV12, abgr32_to_nv12}, - {PIX_FMT_ABGR32, PIX_FMT_NV21, abgr32_to_nv21}, - {PIX_FMT_ABGR32, PIX_FMT_Y800, abgr32_to_y800}, - {PIX_FMT_ABGR32, PIX_FMT_Y16, abgr32_to_y16}, - {PIX_FMT_ABGR32, PIX_FMT_GRAY8, abgr32_to_gray}, - {PIX_FMT_ABGR32, PIX_FMT_GRAY16_L, abgr32_to_gray16_l}, - {PIX_FMT_ABGR32, PIX_FMT_GRAY16_B, abgr32_to_gray16_b}, - {PIX_FMT_ABGR32, PIX_FMT_AYUV4444, abgr32_to_ayuv4444}, - - {PIX_FMT_ARGB32, PIX_FMT_RGB24, argb32_to_rgb24}, - {PIX_FMT_ARGB32, PIX_FMT_RGBA32, argb32_to_rgba32}, - {PIX_FMT_ARGB32, PIX_FMT_YUV420P, argb32_to_yuv420p}, - {PIX_FMT_ARGB32, PIX_FMT_YUVA420P, argb32_to_yuva420p}, - {PIX_FMT_ARGB32, PIX_FMT_NV12, argb32_to_nv12}, - {PIX_FMT_ARGB32, PIX_FMT_NV21, argb32_to_nv21}, - {PIX_FMT_ARGB32, PIX_FMT_Y800, argb32_to_y800}, - {PIX_FMT_ARGB32, PIX_FMT_Y16, argb32_to_y16}, - {PIX_FMT_ARGB32, PIX_FMT_GRAY8, argb32_to_gray}, - {PIX_FMT_ARGB32, PIX_FMT_GRAY16_L, argb32_to_gray16_l}, - {PIX_FMT_ARGB32, PIX_FMT_GRAY16_B, argb32_to_gray16_b}, - {PIX_FMT_ARGB32, PIX_FMT_AYUV4444, argb32_to_ayuv4444}, - - {PIX_FMT_RGB555, PIX_FMT_RGB24, rgb555_to_rgb24}, - {PIX_FMT_RGB555, PIX_FMT_RGB32, rgb555_to_rgba32}, - {PIX_FMT_RGB555, PIX_FMT_RGBA32, rgb555_to_rgba32}, - {PIX_FMT_RGB555, PIX_FMT_YUV420P, rgb555_to_yuv420p}, - {PIX_FMT_RGB555, PIX_FMT_YUVA420P, rgb555_to_yuva420p}, - {PIX_FMT_RGB555, PIX_FMT_NV12, rgb555_to_nv12}, - {PIX_FMT_RGB555, PIX_FMT_NV21, rgb555_to_nv21}, - {PIX_FMT_RGB555, PIX_FMT_Y800, rgb555_to_y800}, - {PIX_FMT_RGB555, PIX_FMT_Y16, rgb555_to_y16}, - {PIX_FMT_RGB555, PIX_FMT_GRAY8, rgb555_to_gray}, - {PIX_FMT_RGB555, PIX_FMT_GRAY16_L, rgb555_to_gray16_l}, - {PIX_FMT_RGB555, PIX_FMT_GRAY16_B, rgb555_to_gray16_b}, - - {PIX_FMT_RGB565, PIX_FMT_RGB24, rgb565_to_rgb24}, - {PIX_FMT_RGB565, PIX_FMT_YUV420P, rgb565_to_yuv420p}, - {PIX_FMT_RGB565, PIX_FMT_YUVA420P, rgb565_to_yuva420p}, - {PIX_FMT_RGB565, PIX_FMT_NV12, rgb565_to_nv12}, - {PIX_FMT_RGB565, PIX_FMT_NV21, rgb565_to_nv21}, - {PIX_FMT_RGB565, PIX_FMT_Y800, rgb565_to_y800}, - {PIX_FMT_RGB565, PIX_FMT_Y16, rgb565_to_y16}, - {PIX_FMT_RGB565, PIX_FMT_GRAY8, rgb565_to_gray}, - {PIX_FMT_RGB565, PIX_FMT_GRAY16_L, rgb565_to_gray16_l}, - {PIX_FMT_RGB565, PIX_FMT_GRAY16_B, rgb565_to_gray16_b}, - - {PIX_FMT_Y800, PIX_FMT_RGB555, y800_to_rgb555}, - {PIX_FMT_Y800, PIX_FMT_RGB565, y800_to_rgb565}, - {PIX_FMT_Y800, PIX_FMT_BGR24, y800_to_bgr24}, - {PIX_FMT_Y800, PIX_FMT_RGB24, y800_to_rgb24}, - {PIX_FMT_Y800, PIX_FMT_RGB32, y800_to_rgb32}, - {PIX_FMT_Y800, PIX_FMT_BGR32, y800_to_bgr32}, - {PIX_FMT_Y800, PIX_FMT_RGB32, y800_to_xrgb32}, - {PIX_FMT_Y800, PIX_FMT_BGR32, y800_to_bgrx32}, - {PIX_FMT_Y800, PIX_FMT_RGBA32, y800_to_rgba32}, - {PIX_FMT_Y800, PIX_FMT_BGRA32, y800_to_bgra32}, - {PIX_FMT_Y800, PIX_FMT_ARGB32, y800_to_argb32}, - {PIX_FMT_Y800, PIX_FMT_ABGR32, y800_to_abgr32}, - {PIX_FMT_Y800, PIX_FMT_Y16, y800_to_y16}, - - {PIX_FMT_Y16, PIX_FMT_RGB555, y16_to_rgb555}, - {PIX_FMT_Y16, PIX_FMT_RGB565, y16_to_rgb565}, - {PIX_FMT_Y16, PIX_FMT_BGR24, y16_to_bgr24}, - {PIX_FMT_Y16, PIX_FMT_RGB24, y16_to_rgb24}, - {PIX_FMT_Y16, PIX_FMT_RGB32, y16_to_rgb32}, - {PIX_FMT_Y16, PIX_FMT_BGR32, y16_to_bgr32}, - {PIX_FMT_Y16, PIX_FMT_RGB32, y16_to_xrgb32}, - {PIX_FMT_Y16, PIX_FMT_BGR32, y16_to_bgrx32}, - {PIX_FMT_Y16, PIX_FMT_RGBA32, y16_to_rgba32}, - {PIX_FMT_Y16, PIX_FMT_BGRA32, y16_to_bgra32}, - {PIX_FMT_Y16, PIX_FMT_ARGB32, y16_to_argb32}, - {PIX_FMT_Y16, PIX_FMT_ABGR32, y16_to_abgr32}, - {PIX_FMT_Y16, PIX_FMT_Y800, y16_to_y800}, - - {PIX_FMT_GRAY8, PIX_FMT_RGB555, gray_to_rgb555}, - {PIX_FMT_GRAY8, PIX_FMT_RGB565, gray_to_rgb565}, - {PIX_FMT_GRAY8, PIX_FMT_RGB24, gray_to_rgb24}, - {PIX_FMT_GRAY8, PIX_FMT_BGR24, gray_to_bgr24}, - {PIX_FMT_GRAY8, PIX_FMT_RGB32, gray_to_rgb32}, - {PIX_FMT_GRAY8, PIX_FMT_BGR32, gray_to_bgr32}, - {PIX_FMT_GRAY8, PIX_FMT_xRGB32, gray_to_xrgb32}, - {PIX_FMT_GRAY8, PIX_FMT_BGRx32, gray_to_bgrx32}, - {PIX_FMT_GRAY8, PIX_FMT_RGBA32, gray_to_rgba32}, - {PIX_FMT_GRAY8, PIX_FMT_BGRA32, gray_to_bgra32}, - {PIX_FMT_GRAY8, PIX_FMT_ARGB32, gray_to_argb32}, - {PIX_FMT_GRAY8, PIX_FMT_ABGR32, gray_to_abgr32}, - {PIX_FMT_GRAY8, PIX_FMT_MONOWHITE, gray_to_monowhite}, - {PIX_FMT_GRAY8, PIX_FMT_MONOBLACK, gray_to_monoblack}, - {PIX_FMT_GRAY8, PIX_FMT_GRAY16_L, gray_to_gray16_l}, - {PIX_FMT_GRAY8, PIX_FMT_GRAY16_B, gray_to_gray16_b}, - - {PIX_FMT_MONOWHITE, PIX_FMT_GRAY8, monowhite_to_gray}, - - {PIX_FMT_MONOBLACK, PIX_FMT_GRAY8, monoblack_to_gray}, - - {PIX_FMT_GRAY16_L, PIX_FMT_GRAY8, gray16_l_to_gray}, - {PIX_FMT_GRAY16_L, PIX_FMT_RGB555, gray16_l_to_rgb555}, - {PIX_FMT_GRAY16_L, PIX_FMT_RGB565, gray16_l_to_rgb565}, - {PIX_FMT_GRAY16_L, PIX_FMT_BGR24, gray16_l_to_bgr24}, - {PIX_FMT_GRAY16_L, PIX_FMT_RGB24, gray16_l_to_rgb24}, - {PIX_FMT_GRAY16_L, PIX_FMT_BGR32, gray16_l_to_bgr32}, - {PIX_FMT_GRAY16_L, PIX_FMT_RGB32, gray16_l_to_rgb32}, - {PIX_FMT_GRAY16_L, PIX_FMT_xRGB32, gray16_l_to_xrgb32}, - {PIX_FMT_GRAY16_L, PIX_FMT_BGRx32, gray16_l_to_bgrx32}, - {PIX_FMT_GRAY16_L, PIX_FMT_ABGR32, gray16_l_to_abgr32}, - {PIX_FMT_GRAY16_L, PIX_FMT_ARGB32, gray16_l_to_argb32}, - {PIX_FMT_GRAY16_L, PIX_FMT_BGRA32, gray16_l_to_bgra32}, - {PIX_FMT_GRAY16_L, PIX_FMT_RGBA32, gray16_l_to_rgba32}, - {PIX_FMT_GRAY16_L, PIX_FMT_GRAY16_B, gray16_b_to_gray16_l}, - - {PIX_FMT_GRAY16_B, PIX_FMT_GRAY8, gray16_b_to_gray}, - {PIX_FMT_GRAY16_B, PIX_FMT_RGB555, gray16_b_to_rgb555}, - {PIX_FMT_GRAY16_B, PIX_FMT_RGB565, gray16_b_to_rgb565}, - {PIX_FMT_GRAY16_B, PIX_FMT_BGR24, gray16_b_to_bgr24}, - {PIX_FMT_GRAY16_B, PIX_FMT_RGB24, gray16_b_to_rgb24}, - {PIX_FMT_GRAY16_B, PIX_FMT_BGR32, gray16_b_to_bgr32}, - {PIX_FMT_GRAY16_B, PIX_FMT_RGB32, gray16_b_to_rgb32}, - {PIX_FMT_GRAY16_B, PIX_FMT_xRGB32, gray16_b_to_xrgb32}, - {PIX_FMT_GRAY16_B, PIX_FMT_BGRx32, gray16_b_to_bgrx32}, - {PIX_FMT_GRAY16_B, PIX_FMT_ABGR32, gray16_b_to_abgr32}, - {PIX_FMT_GRAY16_B, PIX_FMT_ARGB32, gray16_b_to_argb32}, - {PIX_FMT_GRAY16_B, PIX_FMT_BGRA32, gray16_b_to_bgra32}, - {PIX_FMT_GRAY16_B, PIX_FMT_RGBA32, gray16_b_to_rgba32}, - {PIX_FMT_GRAY16_B, PIX_FMT_GRAY16_L, gray16_b_to_gray16_l}, - - {PIX_FMT_PAL8, PIX_FMT_RGB555, pal8_to_rgb555}, - {PIX_FMT_PAL8, PIX_FMT_RGB565, pal8_to_rgb565}, - {PIX_FMT_PAL8, PIX_FMT_BGR24, pal8_to_bgr24}, - {PIX_FMT_PAL8, PIX_FMT_RGB24, pal8_to_rgb24}, - {PIX_FMT_PAL8, PIX_FMT_RGB32, pal8_to_rgb32}, - {PIX_FMT_PAL8, PIX_FMT_BGR32, pal8_to_bgr32}, - {PIX_FMT_PAL8, PIX_FMT_xRGB32, pal8_to_xrgb32}, - {PIX_FMT_PAL8, PIX_FMT_BGRx32, pal8_to_bgrx32}, - {PIX_FMT_PAL8, PIX_FMT_RGBA32, pal8_to_rgba32}, - {PIX_FMT_PAL8, PIX_FMT_BGRA32, pal8_to_bgra32}, - {PIX_FMT_PAL8, PIX_FMT_ARGB32, pal8_to_argb32}, - {PIX_FMT_PAL8, PIX_FMT_ABGR32, pal8_to_abgr32}, - - {PIX_FMT_UYVY411, PIX_FMT_YUV411P, uyvy411_to_yuv411p}, - {PIX_FMT_YUV411P, PIX_FMT_UYVY411, yuv411p_to_uyvy411}, - - {PIX_FMT_V308, PIX_FMT_RGB24, v308_to_rgb24}, - - {PIX_FMT_AYUV4444, PIX_FMT_RGBA32, ayuv4444_to_rgba32}, - {PIX_FMT_AYUV4444, PIX_FMT_ARGB32, ayuv4444_to_argb32}, - {PIX_FMT_AYUV4444, PIX_FMT_BGRA32, ayuv4444_to_bgra32}, - {PIX_FMT_AYUV4444, PIX_FMT_ABGR32, ayuv4444_to_abgr32}, - {PIX_FMT_AYUV4444, PIX_FMT_RGB24, ayuv4444_to_rgb24}, - {PIX_FMT_AYUV4444, PIX_FMT_YUVA420P, ayuv4444_to_yuva420p}, - - {PIX_FMT_YUVA420P, PIX_FMT_YUV420P, yuva420p_to_yuv420p}, - {PIX_FMT_YUVA420P, PIX_FMT_YUV422, yuva420p_to_yuv422}, - {PIX_FMT_YUVA420P, PIX_FMT_AYUV4444, yuva420p_to_ayuv4444}, - {PIX_FMT_YUVA420P, PIX_FMT_RGB555, yuva420p_to_rgb555}, - {PIX_FMT_YUVA420P, PIX_FMT_RGB565, yuva420p_to_rgb565}, - {PIX_FMT_YUVA420P, PIX_FMT_BGR24, yuva420p_to_bgr24}, - {PIX_FMT_YUVA420P, PIX_FMT_RGB24, yuva420p_to_rgb24}, - {PIX_FMT_YUVA420P, PIX_FMT_RGB32, yuva420p_to_rgb32}, - {PIX_FMT_YUVA420P, PIX_FMT_BGR32, yuva420p_to_bgr32}, - {PIX_FMT_YUVA420P, PIX_FMT_xRGB32, yuva420p_to_xrgb32}, - {PIX_FMT_YUVA420P, PIX_FMT_BGRx32, yuva420p_to_bgrx32}, - {PIX_FMT_YUVA420P, PIX_FMT_RGBA32, yuva420p_to_rgba32}, - {PIX_FMT_YUVA420P, PIX_FMT_BGRA32, yuva420p_to_bgra32}, - {PIX_FMT_YUVA420P, PIX_FMT_ARGB32, yuva420p_to_argb32}, - {PIX_FMT_YUVA420P, PIX_FMT_ABGR32, yuva420p_to_abgr32}, -}; - -static ConvertEntry * -get_convert_table_entry (int src_pix_fmt, int dst_pix_fmt) -{ - int i; - - for (i = 0; i < sizeof (convert_table) / sizeof (convert_table[0]); i++) { - if (convert_table[i].src == src_pix_fmt && - convert_table[i].dest == dst_pix_fmt) { - return convert_table + i; - } - } - - return NULL; -} - -static int -avpicture_alloc (AVPicture * picture, int pix_fmt, int width, int height, - int interlaced) -{ - unsigned int size; - void *ptr; - - size = avpicture_get_size (pix_fmt, width, height); - ptr = av_malloc (size); - if (!ptr) - goto fail; - gst_ffmpegcsp_avpicture_fill (picture, ptr, pix_fmt, width, height, - interlaced); - return 0; -fail: - memset (picture, 0, sizeof (AVPicture)); - return -1; -} - -static void -avpicture_free (AVPicture * picture) -{ - av_free (picture->data[0]); -} - -/* return true if yuv planar */ -static inline int -is_yuv_planar (PixFmtInfo * ps) -{ - return (ps->color_type == FF_COLOR_YUV || - ps->color_type == FF_COLOR_YUV_JPEG) && ps->pixel_type == FF_PIXEL_PLANAR; -} - -/* XXX: always use linesize. Return -1 if not supported */ -int -img_convert (AVPicture * dst, int dst_pix_fmt, - const AVPicture * src, int src_pix_fmt, int src_width, int src_height) -{ - static int inited; - int i, ret, dst_width, dst_height, int_pix_fmt; - PixFmtInfo *src_pix, *dst_pix; - ConvertEntry *ce; - AVPicture tmp1, *tmp = &tmp1; - - if (G_UNLIKELY (src_width <= 0 || src_height <= 0)) - return 0; - - if (G_UNLIKELY (!inited)) { - inited = 1; - img_convert_init (); - } - - dst_width = src_width; - dst_height = src_height; - - dst_pix = get_pix_fmt_info (dst_pix_fmt); - src_pix = get_pix_fmt_info (src_pix_fmt); - if (G_UNLIKELY (src_pix_fmt == dst_pix_fmt)) { - /* no conversion needed: just copy */ - img_copy (dst, src, dst_pix_fmt, dst_width, dst_height); - return 0; - } - - ce = get_convert_table_entry (src_pix_fmt, dst_pix_fmt); - if (ce && ce->convert) { - /* specific conversion routine */ - ce->convert (dst, src, dst_width, dst_height); - return 0; - } - - /* gray to YUV */ - if (is_yuv_planar (dst_pix) && dst_pix_fmt != PIX_FMT_Y16 - && src_pix_fmt == PIX_FMT_GRAY8) { - int w, h, y; - uint8_t *d; - - if (dst_pix->color_type == FF_COLOR_YUV_JPEG) { - img_copy_plane (dst->data[0], dst->linesize[0], - src->data[0], src->linesize[0], dst_width, dst_height); - } else { - img_apply_table (dst->data[0], dst->linesize[0], - src->data[0], src->linesize[0], - dst_width, dst_height, y_jpeg_to_ccir); - } - /* fill U and V with 128 */ - w = dst_width; - h = dst_height; - w >>= dst_pix->x_chroma_shift; - h >>= dst_pix->y_chroma_shift; - for (i = 1; i <= 2; i++) { - d = dst->data[i]; - if (!d) - continue; - for (y = 0; y < h; y++) { - memset (d, 128, w); - d += dst->linesize[i]; - } - } - return 0; - } - - /* YUV to gray */ - if (is_yuv_planar (src_pix) && src_pix_fmt != PIX_FMT_Y16 - && dst_pix_fmt == PIX_FMT_GRAY8) { - if (src_pix->color_type == FF_COLOR_YUV_JPEG) { - img_copy_plane (dst->data[0], dst->linesize[0], - src->data[0], src->linesize[0], dst_width, dst_height); - } else { - img_apply_table (dst->data[0], dst->linesize[0], - src->data[0], src->linesize[0], - dst_width, dst_height, y_ccir_to_jpeg); - } - return 0; - } - - /* YUV to YUV planar */ - if (is_yuv_planar (dst_pix) && is_yuv_planar (src_pix) && - dst_pix->depth == src_pix->depth) { - int x_shift, y_shift, xy_shift; - void (*resize_func) (uint8_t * dst, int dst_wrap, int dst_width, - int dst_height, const uint8_t * src, int src_wrap, int src_width, - int src_height); - - x_shift = (dst_pix->x_chroma_shift - src_pix->x_chroma_shift); - y_shift = (dst_pix->y_chroma_shift - src_pix->y_chroma_shift); - xy_shift = ((x_shift & 0xf) << 4) | (y_shift & 0xf); - - /* there must be filters for conversion at least from and to - YUV444 format */ - switch (xy_shift) { - case 0x00: - resize_func = img_copy_plane_resize; - break; - case 0x10: - resize_func = shrink21; - break; - case 0x20: - resize_func = shrink41; - break; - case 0x01: - resize_func = shrink12; - break; - case 0x11: - resize_func = shrink22; - break; - case 0x22: - resize_func = shrink44; - break; - case 0xf0: - resize_func = grow21; - break; - case 0xe0: - resize_func = grow41; - break; - case 0xff: - resize_func = grow22; - break; - case 0xee: - resize_func = grow44; - break; - case 0xf1: - resize_func = conv411; - break; - default: - /* currently not handled */ - goto no_chroma_filter; - } - - img_copy_plane (dst->data[0], dst->linesize[0], - src->data[0], src->linesize[0], dst_width, dst_height); - -#define GEN_MASK(x) ((1<<(x))-1) -#define DIV_ROUND_UP_X(v,x) (((v) + GEN_MASK(x)) >> (x)) - - for (i = 1; i <= 2; i++) { - gint w, h; - gint s_w, s_h; - - w = DIV_ROUND_UP_X (dst_width, dst_pix->x_chroma_shift); - h = DIV_ROUND_UP_X (dst_height, dst_pix->y_chroma_shift); - - s_w = DIV_ROUND_UP_X (src_width, src_pix->x_chroma_shift); - s_h = DIV_ROUND_UP_X (src_height, src_pix->y_chroma_shift); - - if (src->data[i] != NULL && dst->data[i] != NULL) { - resize_func (dst->data[i], dst->linesize[i], w, h, - src->data[i], src->linesize[i], s_w, s_h); - } else if (dst->data[i] != NULL) { - memset (dst->data[i], 128, dst->linesize[i] * h); - } - } - /* if yuv color space conversion is needed, we do it here on - the destination image */ - if (dst_pix->color_type != src_pix->color_type) { - const uint8_t *y_table, *c_table; - - if (dst_pix->color_type == FF_COLOR_YUV) { - y_table = y_jpeg_to_ccir; - c_table = c_jpeg_to_ccir; - } else { - y_table = y_ccir_to_jpeg; - c_table = c_ccir_to_jpeg; - } - img_apply_table (dst->data[0], dst->linesize[0], - dst->data[0], dst->linesize[0], dst_width, dst_height, y_table); - - for (i = 1; i <= 2; i++) - img_apply_table (dst->data[i], dst->linesize[i], - dst->data[i], dst->linesize[i], - dst_width >> dst_pix->x_chroma_shift, - dst_height >> dst_pix->y_chroma_shift, c_table); - } - return 0; - } -no_chroma_filter: - GST_CAT_INFO (ffmpegcolorspace_performance, - "no direct path to convert colorspace from %s -> %s", src_pix->name, - dst_pix->name); - - /* try to use an intermediate format */ - if (src_pix_fmt == PIX_FMT_YUV422 || dst_pix_fmt == PIX_FMT_YUV422) { - /* specific case: convert to YUV422P first */ - int_pix_fmt = PIX_FMT_YUV422P; - } else if (src_pix_fmt == PIX_FMT_UYVY422 || dst_pix_fmt == PIX_FMT_UYVY422 || - src_pix_fmt == PIX_FMT_YVYU422 || dst_pix_fmt == PIX_FMT_YVYU422) { - /* specific case: convert to YUV422P first */ - int_pix_fmt = PIX_FMT_YUV422P; - } else if (src_pix_fmt == PIX_FMT_UYVY411 || dst_pix_fmt == PIX_FMT_UYVY411) { - /* specific case: convert to YUV411P first */ - int_pix_fmt = PIX_FMT_YUV411P; - } else if ((src_pix->color_type == FF_COLOR_GRAY && - src_pix_fmt != PIX_FMT_GRAY8) || - (dst_pix->color_type == FF_COLOR_GRAY && dst_pix_fmt != PIX_FMT_GRAY8)) { - /* gray8 is the normalized format */ - int_pix_fmt = PIX_FMT_GRAY8; - } else if (src_pix_fmt == PIX_FMT_Y16 || dst_pix_fmt == PIX_FMT_Y16) { - /* y800 is the normalized format */ - int_pix_fmt = PIX_FMT_Y800; - } else if ((is_yuv_planar (src_pix) && - src_pix_fmt != PIX_FMT_YUV444P && src_pix_fmt != PIX_FMT_YUVJ444P)) { - /* yuv444 is the normalized format */ - if (src_pix->color_type == FF_COLOR_YUV_JPEG) - int_pix_fmt = PIX_FMT_YUVJ444P; - else - int_pix_fmt = PIX_FMT_YUV444P; - } else if ((is_yuv_planar (dst_pix) && - dst_pix_fmt != PIX_FMT_YUV444P && dst_pix_fmt != PIX_FMT_YUVJ444P)) { - /* yuv444 is the normalized format */ - if (dst_pix->color_type == FF_COLOR_YUV_JPEG) - int_pix_fmt = PIX_FMT_YUVJ444P; - else - int_pix_fmt = PIX_FMT_YUV444P; - } else { - /* the two formats are rgb or gray8 or yuv[j]444p */ - if (src_pix->is_alpha && dst_pix->is_alpha) - int_pix_fmt = PIX_FMT_RGBA32; - else - int_pix_fmt = PIX_FMT_RGB24; - } - if (avpicture_alloc (tmp, int_pix_fmt, dst_width, dst_height, - dst->interlaced) < 0) - return -1; - ret = -1; - if (img_convert (tmp, int_pix_fmt, - src, src_pix_fmt, src_width, src_height) < 0) - goto fail1; - - if (img_convert (dst, dst_pix_fmt, - tmp, int_pix_fmt, dst_width, dst_height) < 0) - goto fail1; - ret = 0; -fail1: - avpicture_free (tmp); - return ret; -} - -/* NOTE: we scan all the pixels to have an exact information */ -static int -get_alpha_info_pal8 (const AVPicture * src, int width, int height) -{ - const unsigned char *p; - int src_wrap, ret, x, y; - unsigned int a; - uint32_t *palette = (uint32_t *) src->data[1]; - - p = src->data[0]; - src_wrap = src->linesize[0] - width; - ret = 0; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - a = palette[p[0]] >> 24; - if (a == 0x00) { - ret |= FF_ALPHA_TRANSP; - } else if (a != 0xff) { - ret |= FF_ALPHA_SEMI_TRANSP; - } - p++; - } - p += src_wrap; - } - return ret; -} - -/** - * 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, int pix_fmt, int width, int height) -{ - const PixFmtInfo *pf; - int ret; - - pf = get_pix_fmt_info (pix_fmt); - /* no alpha can be represented in format */ - if (!pf->is_alpha) - return 0; - switch (pix_fmt) { - case PIX_FMT_RGB32: - ret = get_alpha_info_rgb32 (src, width, height); - break; - case PIX_FMT_BGR32: - ret = get_alpha_info_bgr32 (src, width, height); - break; - case PIX_FMT_xRGB32: - ret = get_alpha_info_xrgb32 (src, width, height); - break; - case PIX_FMT_BGRx32: - ret = get_alpha_info_bgrx32 (src, width, height); - break; - case PIX_FMT_RGBA32: - ret = get_alpha_info_rgba32 (src, width, height); - break; - case PIX_FMT_BGRA32: - ret = get_alpha_info_bgra32 (src, width, height); - break; - case PIX_FMT_ARGB32: - ret = get_alpha_info_argb32 (src, width, height); - break; - case PIX_FMT_ABGR32: - ret = get_alpha_info_abgr32 (src, width, height); - break; - case PIX_FMT_RGB555: - ret = get_alpha_info_rgb555 (src, width, height); - break; - case PIX_FMT_PAL8: - ret = get_alpha_info_pal8 (src, width, height); - break; - default: - /* we do not know, so everything is indicated */ - ret = FF_ALPHA_TRANSP | FF_ALPHA_SEMI_TRANSP; - break; - } - return ret; -} - -#ifdef HAVE_MMX -#define DEINT_INPLACE_LINE_LUM \ - movd_m2r(lum_m4[0],mm0);\ - movd_m2r(lum_m3[0],mm1);\ - movd_m2r(lum_m2[0],mm2);\ - movd_m2r(lum_m1[0],mm3);\ - movd_m2r(lum[0],mm4);\ - punpcklbw_r2r(mm7,mm0);\ - movd_r2m(mm2,lum_m4[0]);\ - punpcklbw_r2r(mm7,mm1);\ - punpcklbw_r2r(mm7,mm2);\ - punpcklbw_r2r(mm7,mm3);\ - punpcklbw_r2r(mm7,mm4);\ - paddw_r2r(mm3,mm1);\ - psllw_i2r(1,mm2);\ - paddw_r2r(mm4,mm0);\ - psllw_i2r(2,mm1);\ - paddw_r2r(mm6,mm2);\ - paddw_r2r(mm2,mm1);\ - psubusw_r2r(mm0,mm1);\ - psrlw_i2r(3,mm1);\ - packuswb_r2r(mm7,mm1);\ - movd_r2m(mm1,lum_m2[0]); - -#define DEINT_LINE_LUM \ - movd_m2r(lum_m4[0],mm0);\ - movd_m2r(lum_m3[0],mm1);\ - movd_m2r(lum_m2[0],mm2);\ - movd_m2r(lum_m1[0],mm3);\ - movd_m2r(lum[0],mm4);\ - punpcklbw_r2r(mm7,mm0);\ - punpcklbw_r2r(mm7,mm1);\ - punpcklbw_r2r(mm7,mm2);\ - punpcklbw_r2r(mm7,mm3);\ - punpcklbw_r2r(mm7,mm4);\ - paddw_r2r(mm3,mm1);\ - psllw_i2r(1,mm2);\ - paddw_r2r(mm4,mm0);\ - psllw_i2r(2,mm1);\ - paddw_r2r(mm6,mm2);\ - paddw_r2r(mm2,mm1);\ - psubusw_r2r(mm0,mm1);\ - psrlw_i2r(3,mm1);\ - packuswb_r2r(mm7,mm1);\ - movd_r2m(mm1,dst[0]); -#endif - -/* filter parameters: [-1 4 2 4 -1] // 8 */ -#if 0 -static void -deinterlace_line (uint8_t * dst, - const uint8_t * lum_m4, const uint8_t * lum_m3, - const uint8_t * lum_m2, const uint8_t * lum_m1, - const uint8_t * lum, int size) -{ -#ifndef HAVE_MMX - uint8_t *cm = cropTbl + MAX_NEG_CROP; - int sum; - - for (; size > 0; size--) { - sum = -lum_m4[0]; - sum += lum_m3[0] << 2; - sum += lum_m2[0] << 1; - sum += lum_m1[0] << 2; - sum += -lum[0]; - dst[0] = cm[(sum + 4) >> 3]; - lum_m4++; - lum_m3++; - lum_m2++; - lum_m1++; - lum++; - dst++; - } -#else - - { - mmx_t rounder; - - rounder.uw[0] = 4; - rounder.uw[1] = 4; - rounder.uw[2] = 4; - rounder.uw[3] = 4; - pxor_r2r (mm7, mm7); - movq_m2r (rounder, mm6); - } - for (; size > 3; size -= 4) { - DEINT_LINE_LUM lum_m4 += 4; - - lum_m3 += 4; - lum_m2 += 4; - lum_m1 += 4; - lum += 4; - dst += 4; - } -#endif -} - -static void -deinterlace_line_inplace (uint8_t * lum_m4, uint8_t * lum_m3, uint8_t * lum_m2, - uint8_t * lum_m1, uint8_t * lum, int size) -{ -#ifndef HAVE_MMX - uint8_t *cm = cropTbl + MAX_NEG_CROP; - int sum; - - for (; size > 0; size--) { - sum = -lum_m4[0]; - sum += lum_m3[0] << 2; - sum += lum_m2[0] << 1; - lum_m4[0] = lum_m2[0]; - sum += lum_m1[0] << 2; - sum += -lum[0]; - lum_m2[0] = cm[(sum + 4) >> 3]; - lum_m4++; - lum_m3++; - lum_m2++; - lum_m1++; - lum++; - } -#else - - { - mmx_t rounder; - - rounder.uw[0] = 4; - rounder.uw[1] = 4; - rounder.uw[2] = 4; - rounder.uw[3] = 4; - pxor_r2r (mm7, mm7); - movq_m2r (rounder, mm6); - } - for (; size > 3; size -= 4) { - DEINT_INPLACE_LINE_LUM lum_m4 += 4; - - lum_m3 += 4; - lum_m2 += 4; - lum_m1 += 4; - lum += 4; - } -#endif -} -#endif - -/* deinterlacing : 2 temporal taps, 3 spatial taps linear filter. The - top field is copied as is, but the bottom field is deinterlaced - against the top field. */ -#if 0 -static void -deinterlace_bottom_field (uint8_t * dst, int dst_wrap, - const uint8_t * src1, int src_wrap, int width, int height) -{ - const uint8_t *src_m2, *src_m1, *src_0, *src_p1, *src_p2; - int y; - - src_m2 = src1; - src_m1 = src1; - src_0 = &src_m1[src_wrap]; - src_p1 = &src_0[src_wrap]; - src_p2 = &src_p1[src_wrap]; - for (y = 0; y < (height - 2); y += 2) { - memcpy (dst, src_m1, width); - dst += dst_wrap; - deinterlace_line (dst, src_m2, src_m1, src_0, src_p1, src_p2, width); - src_m2 = src_0; - src_m1 = src_p1; - src_0 = src_p2; - src_p1 += 2 * src_wrap; - src_p2 += 2 * src_wrap; - dst += dst_wrap; - } - memcpy (dst, src_m1, width); - dst += dst_wrap; - /* do last line */ - deinterlace_line (dst, src_m2, src_m1, src_0, src_0, src_0, width); -} - -static void -deinterlace_bottom_field_inplace (uint8_t * src1, int src_wrap, - int width, int height) -{ - uint8_t *src_m1, *src_0, *src_p1, *src_p2; - int y; - uint8_t *buf; - - buf = (uint8_t *) av_malloc (width); - - src_m1 = src1; - memcpy (buf, src_m1, width); - src_0 = &src_m1[src_wrap]; - src_p1 = &src_0[src_wrap]; - src_p2 = &src_p1[src_wrap]; - for (y = 0; y < (height - 2); y += 2) { - deinterlace_line_inplace (buf, src_m1, src_0, src_p1, src_p2, width); - src_m1 = src_p1; - src_0 = src_p2; - src_p1 += 2 * src_wrap; - src_p2 += 2 * src_wrap; - } - /* do last line */ - deinterlace_line_inplace (buf, src_m1, src_0, src_0, src_0, width); - av_free (buf); -} -#endif - -/* deinterlace - if not supported return -1 */ -#if 0 -static int -avpicture_deinterlace (AVPicture * dst, const AVPicture * src, - int pix_fmt, int width, int height) -{ - int i; - - if (pix_fmt != PIX_FMT_YUV420P && - pix_fmt != PIX_FMT_YUV422P && - pix_fmt != PIX_FMT_YUV444P && pix_fmt != PIX_FMT_YUV411P) - return -1; - if ((width & 3) != 0 || (height & 3) != 0) - return -1; - - for (i = 0; i < 3; i++) { - if (i == 1) { - switch (pix_fmt) { - case PIX_FMT_YUV420P: - width >>= 1; - height >>= 1; - break; - case PIX_FMT_YUV422P: - width >>= 1; - break; - case PIX_FMT_YUV411P: - width >>= 2; - break; - default: - break; - } - } - if (src == dst) { - deinterlace_bottom_field_inplace (dst->data[i], dst->linesize[i], - width, height); - } else { - deinterlace_bottom_field (dst->data[i], dst->linesize[i], - src->data[i], src->linesize[i], width, height); - } - } -#ifdef HAVE_MMX - emms (); -#endif - return 0; -} -#endif - -#undef FIX diff --git a/gst/ffmpegcolorspace/imgconvert_template.h b/gst/ffmpegcolorspace/imgconvert_template.h deleted file mode 100644 index 3b287e7..0000000 --- a/gst/ffmpegcolorspace/imgconvert_template.h +++ /dev/null @@ -1,2188 +0,0 @@ -/* - * Templates for image convertion routines - * Copyright (c) 2001, 2002, 2003 Fabrice Bellard. - * - * This library 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 of the License, or (at your option) any later version. - * - * This library 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 this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef RGB_OUT -#define RGB_OUT(d, r, g, b) RGBA_OUT(d, r, g, b, 0xffU) -#endif - -static void glue (uyvy422_to_, RGB_NAME)(AVPicture *dst, const AVPicture *src, - int width, int height) -{ - uint8_t *s, *d, *d1, *s1; - int w, y, cb, cr, r_add, g_add, b_add; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b; - - d = dst->data[0]; - s = src->data[0]; - for(;height > 0; height --) { - d1 = d; - s1 = s; - for(w = width; w >= 2; w -= 2) { - YUV_TO_RGB1_CCIR(s1[0], s1[2]); - - YUV_TO_RGB2_CCIR(r, g, b, s1[1]); - RGB_OUT(d1, r, g, b); - d1 += BPP; - - YUV_TO_RGB2_CCIR(r, g, b, s1[3]); - RGB_OUT(d1, r, g, b); - d1 += BPP; - - s1 += 4; - } - - if (w) { - YUV_TO_RGB1_CCIR(s1[0], s1[2]); - - YUV_TO_RGB2_CCIR(r, g, b, s1[1]); - RGB_OUT(d1, r, g, b); - } - - d += dst->linesize[0]; - s += src->linesize[0]; - } -} - -static void glue (yuv422_to_, RGB_NAME)(AVPicture *dst, const AVPicture *src, - int width, int height) -{ - uint8_t *s, *d, *d1, *s1; - int w, y, cb, cr, r_add, g_add, b_add; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b; - - d = dst->data[0]; - s = src->data[0]; - for(;height > 0; height --) { - d1 = d; - s1 = s; - for(w = width; w >= 2; w -= 2) { - YUV_TO_RGB1_CCIR(s1[1], s1[3]); - - YUV_TO_RGB2_CCIR(r, g, b, s1[0]); - RGB_OUT(d1, r, g, b); - d1 += BPP; - - YUV_TO_RGB2_CCIR(r, g, b, s1[2]); - RGB_OUT(d1, r, g, b); - d1 += BPP; - - s1 += 4; - } - - if (w) { - YUV_TO_RGB1_CCIR(s1[1], s1[3]); - - YUV_TO_RGB2_CCIR(r, g, b, s1[0]); - RGB_OUT(d1, r, g, b); - } - - d += dst->linesize[0]; - s += src->linesize[0]; - } -} - -static void glue (yvyu422_to_, RGB_NAME)(AVPicture *dst, const AVPicture *src, - int width, int height) -{ - uint8_t *s, *d, *d1, *s1; - int w, y, cb, cr, r_add, g_add, b_add; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b; - - d = dst->data[0]; - s = src->data[0]; - for(;height > 0; height --) { - d1 = d; - s1 = s; - for(w = width; w >= 2; w -= 2) { - YUV_TO_RGB1_CCIR(s1[3], s1[1]); - - YUV_TO_RGB2_CCIR(r, g, b, s1[0]); - RGB_OUT(d1, r, g, b); - d1 += BPP; - - YUV_TO_RGB2_CCIR(r, g, b, s1[2]); - RGB_OUT(d1, r, g, b); - d1 += BPP; - - s1 += 4; - } - - if (w) { - YUV_TO_RGB1_CCIR(s1[3], s1[1]); - - YUV_TO_RGB2_CCIR(r, g, b, s1[0]); - RGB_OUT(d1, r, g, b); - } - - d += dst->linesize[0]; - s += src->linesize[0]; - } -} - -static void glue (yuv420p_to_, RGB_NAME)(AVPicture *dst, const AVPicture *src, - int width, int height) -{ - const uint8_t *y1_ptr, *y2_ptr, *cb_ptr, *cr_ptr; - uint8_t *d, *d1, *d2; - int w, y, cb, cr, r_add, g_add, b_add, width2; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b; - - d = dst->data[0]; - y1_ptr = src->data[0]; - cb_ptr = src->data[1]; - cr_ptr = src->data[2]; - width2 = (width + 1) >> 1; - for (; height >= 2; height -= 2) { - d1 = d; - d2 = d + dst->linesize[0]; - y2_ptr = y1_ptr + src->linesize[0]; - for (w = width; w >= 2; w -= 2) { - YUV_TO_RGB1_CCIR (cb_ptr[0], cr_ptr[0]); - /* output 4 pixels */ - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[1]); - RGB_OUT (d1 + BPP, r, g, b); - - YUV_TO_RGB2_CCIR (r, g, b, y2_ptr[0]); - RGB_OUT (d2, r, g, b); - - YUV_TO_RGB2_CCIR (r, g, b, y2_ptr[1]); - RGB_OUT (d2 + BPP, r, g, b); - - d1 += 2 * BPP; - d2 += 2 * BPP; - - y1_ptr += 2; - y2_ptr += 2; - cb_ptr++; - cr_ptr++; - } - /* handle odd width */ - if (w) { - YUV_TO_RGB1_CCIR (cb_ptr[0], cr_ptr[0]); - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - - YUV_TO_RGB2_CCIR (r, g, b, y2_ptr[0]); - RGB_OUT (d2, r, g, b); - d1 += BPP; - d2 += BPP; - y1_ptr++; - y2_ptr++; - cb_ptr++; - cr_ptr++; - } - d += 2 * dst->linesize[0]; - y1_ptr += 2 * src->linesize[0] - width; - cb_ptr += src->linesize[1] - width2; - cr_ptr += src->linesize[2] - width2; - } - /* handle odd height */ - if (height) { - d1 = d; - for (w = width; w >= 2; w -= 2) { - YUV_TO_RGB1_CCIR (cb_ptr[0], cr_ptr[0]); - /* output 2 pixels */ - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[1]); - RGB_OUT (d1 + BPP, r, g, b); - - d1 += 2 * BPP; - - y1_ptr += 2; - cb_ptr++; - cr_ptr++; - } - /* handle width */ - if (w) { - YUV_TO_RGB1_CCIR (cb_ptr[0], cr_ptr[0]); - /* output 2 pixel */ - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - d1 += BPP; - - y1_ptr++; - cb_ptr++; - cr_ptr++; - } - } -} - -#ifndef RGBA_OUT -#define RGBA_OUT_(d, r, g, b, a) RGB_OUT(d, r, g, b) -#define YUVA_TO_A(d, a) -#else -#define RGBA_OUT_(d, r, g, b, a) RGBA_OUT(d, r, g, b, a) -#define YUVA_TO_A(d, a) do { d = a; } while (0); -#endif - -static void glue (yuva420p_to_, RGB_NAME)(AVPicture *dst, const AVPicture *src, - int width, int height) -{ - const uint8_t *y1_ptr, *y2_ptr, *cb_ptr, *cr_ptr, *a1_ptr, *a2_ptr; - uint8_t *d, *d1, *d2; - int w, y, cb, cr, r_add, g_add, b_add, width2; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b; -#ifdef RGBA_OUT - unsigned int a = 0; -#endif - - d = dst->data[0]; - y1_ptr = src->data[0]; - cb_ptr = src->data[1]; - cr_ptr = src->data[2]; - a1_ptr = src->data[3]; - width2 = (width + 1) >> 1; - for (; height >= 2; height -= 2) { - d1 = d; - d2 = d + dst->linesize[0]; - y2_ptr = y1_ptr + src->linesize[0]; - a2_ptr = a1_ptr + src->linesize[3]; - for (w = width; w >= 2; w -= 2) { - YUVA_TO_A (a, a1_ptr[0]); - YUV_TO_RGB1_CCIR (cb_ptr[0], cr_ptr[0]); - /* output 4 pixels */ - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGBA_OUT_ (d1, r, g, b, a); - - YUVA_TO_A (a, a1_ptr[1]); - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[1]); - RGBA_OUT_ (d1 + BPP, r, g, b, a); - - YUVA_TO_A (a, a2_ptr[0]); - YUV_TO_RGB2_CCIR (r, g, b, y2_ptr[0]); - RGBA_OUT_ (d2, r, g, b, a); - - YUVA_TO_A (a, a2_ptr[1]); - YUV_TO_RGB2_CCIR (r, g, b, y2_ptr[1]); - RGBA_OUT_ (d2 + BPP, r, g, b, a); - - d1 += 2 * BPP; - d2 += 2 * BPP; - - y1_ptr += 2; - y2_ptr += 2; - cb_ptr++; - cr_ptr++; - a1_ptr += 2; - a2_ptr += 2; - } - /* handle odd width */ - if (w) { - YUVA_TO_A (a, a1_ptr[0]); - YUV_TO_RGB1_CCIR (cb_ptr[0], cr_ptr[0]); - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGBA_OUT_ (d1, r, g, b, a); - - YUVA_TO_A (a, a2_ptr[0]); - YUV_TO_RGB2_CCIR (r, g, b, y2_ptr[0]); - RGBA_OUT_ (d2, r, g, b, a); - d1 += BPP; - d2 += BPP; - y1_ptr++; - y2_ptr++; - cb_ptr++; - cr_ptr++; - a1_ptr++; - a2_ptr++; - } - d += 2 * dst->linesize[0]; - y1_ptr += 2 * src->linesize[0] - width; - cb_ptr += src->linesize[1] - width2; - cr_ptr += src->linesize[2] - width2; - a1_ptr += 2 * src->linesize[3] - width; - } - /* handle odd height */ - if (height) { - d1 = d; - for (w = width; w >= 2; w -= 2) { - YUVA_TO_A (a, a1_ptr[0]); - YUV_TO_RGB1_CCIR (cb_ptr[0], cr_ptr[0]); - /* output 2 pixels */ - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGBA_OUT_ (d1, r, g, b, a); - - YUVA_TO_A (a, a1_ptr[1]); - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[1]); - RGBA_OUT_ (d1 + BPP, r, g, b, a); - - d1 += 2 * BPP; - - y1_ptr += 2; - cb_ptr++; - cr_ptr++; - a1_ptr += 2; - } - /* handle width */ - if (w) { - YUVA_TO_A (a, a1_ptr[0]); - YUV_TO_RGB1_CCIR (cb_ptr[0], cr_ptr[0]); - /* output 2 pixel */ - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGBA_OUT_ (d1, r, g, b, a); - d1 += BPP; - - y1_ptr++; - cb_ptr++; - cr_ptr++; - a1_ptr++; - } - } -} - -static void glue (nv12_to_, RGB_NAME) (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const uint8_t *y1_ptr, *y2_ptr, *c_ptr; - uint8_t *d, *d1, *d2; - int w, y, cb, cr, r_add, g_add, b_add; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b; - int c_wrap = src->linesize[1] - ((width + 1) & ~0x01); - - d = dst->data[0]; - y1_ptr = src->data[0]; - c_ptr = src->data[1]; - for (; height >= 2; height -= 2) { - d1 = d; - d2 = d + dst->linesize[0]; - y2_ptr = y1_ptr + src->linesize[0]; - for (w = width; w >= 2; w -= 2) { - YUV_TO_RGB1_CCIR (c_ptr[0], c_ptr[1]); - /* output 4 pixels */ - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[1]); - RGB_OUT (d1 + BPP, r, g, b); - - YUV_TO_RGB2_CCIR (r, g, b, y2_ptr[0]); - RGB_OUT (d2, r, g, b); - - YUV_TO_RGB2_CCIR (r, g, b, y2_ptr[1]); - RGB_OUT (d2 + BPP, r, g, b); - - d1 += 2 * BPP; - d2 += 2 * BPP; - - y1_ptr += 2; - y2_ptr += 2; - c_ptr += 2; - } - /* handle odd width */ - if (w) { - YUV_TO_RGB1_CCIR (c_ptr[0], c_ptr[1]); - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - - YUV_TO_RGB2_CCIR (r, g, b, y2_ptr[0]); - RGB_OUT (d2, r, g, b); - d1 += BPP; - d2 += BPP; - y1_ptr++; - y2_ptr++; - c_ptr += 2; - } - d += 2 * dst->linesize[0]; - y1_ptr += 2 * src->linesize[0] - width; - c_ptr += c_wrap; - } - /* handle odd height */ - if (height) { - d1 = d; - for (w = width; w >= 2; w -= 2) { - YUV_TO_RGB1_CCIR (c_ptr[0], c_ptr[1]); - /* output 2 pixels */ - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[1]); - RGB_OUT (d1 + BPP, r, g, b); - - d1 += 2 * BPP; - - y1_ptr += 2; - c_ptr += 2; - } - /* handle odd width */ - if (w) { - YUV_TO_RGB1_CCIR (c_ptr[0], c_ptr[1]); - /* output 1 pixel */ - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - d1 += BPP; - - y1_ptr++; - c_ptr += 2; - } - } -} - -static void glue (nv21_to_, RGB_NAME) (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const uint8_t *y1_ptr, *y2_ptr, *c_ptr; - uint8_t *d, *d1, *d2; - int w, y, cb, cr, r_add, g_add, b_add; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b; - int c_wrap = src->linesize[1] - ((width + 1) & ~0x01); - - d = dst->data[0]; - y1_ptr = src->data[0]; - c_ptr = src->data[1]; - for (; height >= 2; height -= 2) { - d1 = d; - d2 = d + dst->linesize[0]; - y2_ptr = y1_ptr + src->linesize[0]; - for (w = width; w >= 2; w -= 2) { - YUV_TO_RGB1_CCIR (c_ptr[1], c_ptr[0]); - /* output 4 pixels */ - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[1]); - RGB_OUT (d1 + BPP, r, g, b); - - YUV_TO_RGB2_CCIR (r, g, b, y2_ptr[0]); - RGB_OUT (d2, r, g, b); - - YUV_TO_RGB2_CCIR (r, g, b, y2_ptr[1]); - RGB_OUT (d2 + BPP, r, g, b); - - d1 += 2 * BPP; - d2 += 2 * BPP; - - y1_ptr += 2; - y2_ptr += 2; - c_ptr += 2; - } - /* handle odd width */ - if (w) { - YUV_TO_RGB1_CCIR (c_ptr[1], c_ptr[0]); - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - - YUV_TO_RGB2_CCIR (r, g, b, y2_ptr[0]); - RGB_OUT (d2, r, g, b); - d1 += BPP; - d2 += BPP; - y1_ptr++; - y2_ptr++; - c_ptr += 2; - } - d += 2 * dst->linesize[0]; - y1_ptr += 2 * src->linesize[0] - width; - c_ptr += c_wrap; - } - /* handle odd height */ - if (height) { - d1 = d; - for (w = width; w >= 2; w -= 2) { - YUV_TO_RGB1_CCIR (c_ptr[1], c_ptr[0]); - /* output 2 pixels */ - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[1]); - RGB_OUT (d1 + BPP, r, g, b); - - d1 += 2 * BPP; - - y1_ptr += 2; - c_ptr += 2; - } - /* handle odd width */ - if (w) { - YUV_TO_RGB1_CCIR (c_ptr[1], c_ptr[0]); - /* output 1 pixel */ - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - d1 += BPP; - - y1_ptr++; - c_ptr += 2; - } - } -} - -static void glue (yuvj420p_to_, RGB_NAME) (AVPicture * dst, - const AVPicture * src, int width, int height) -{ - const uint8_t *y1_ptr, *y2_ptr, *cb_ptr, *cr_ptr; - uint8_t *d, *d1, *d2; - int w, y, cb, cr, r_add, g_add, b_add, width2; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b; - - d = dst->data[0]; - y1_ptr = src->data[0]; - cb_ptr = src->data[1]; - cr_ptr = src->data[2]; - width2 = (width + 1) >> 1; - for (; height >= 2; height -= 2) { - d1 = d; - d2 = d + dst->linesize[0]; - y2_ptr = y1_ptr + src->linesize[0]; - for (w = width; w >= 2; w -= 2) { - YUV_TO_RGB1 (cb_ptr[0], cr_ptr[0]); - /* output 4 pixels */ - YUV_TO_RGB2 (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - - YUV_TO_RGB2 (r, g, b, y1_ptr[1]); - RGB_OUT (d1 + BPP, r, g, b); - - YUV_TO_RGB2 (r, g, b, y2_ptr[0]); - RGB_OUT (d2, r, g, b); - - YUV_TO_RGB2 (r, g, b, y2_ptr[1]); - RGB_OUT (d2 + BPP, r, g, b); - - d1 += 2 * BPP; - d2 += 2 * BPP; - - y1_ptr += 2; - y2_ptr += 2; - cb_ptr++; - cr_ptr++; - } - /* handle odd width */ - if (w) { - YUV_TO_RGB1 (cb_ptr[0], cr_ptr[0]); - YUV_TO_RGB2 (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - - YUV_TO_RGB2 (r, g, b, y2_ptr[0]); - RGB_OUT (d2, r, g, b); - d1 += BPP; - d2 += BPP; - y1_ptr++; - y2_ptr++; - cb_ptr++; - cr_ptr++; - } - d += 2 * dst->linesize[0]; - y1_ptr += 2 * src->linesize[0] - width; - cb_ptr += src->linesize[1] - width2; - cr_ptr += src->linesize[2] - width2; - } - /* handle odd height */ - if (height) { - d1 = d; - for (w = width; w >= 2; w -= 2) { - YUV_TO_RGB1 (cb_ptr[0], cr_ptr[0]); - /* output 2 pixels */ - YUV_TO_RGB2 (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - - YUV_TO_RGB2 (r, g, b, y1_ptr[1]); - RGB_OUT (d1 + BPP, r, g, b); - - d1 += 2 * BPP; - - y1_ptr += 2; - cb_ptr++; - cr_ptr++; - } - /* handle width */ - if (w) { - YUV_TO_RGB1 (cb_ptr[0], cr_ptr[0]); - /* output 2 pixels */ - YUV_TO_RGB2 (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - d1 += BPP; - - y1_ptr++; - cb_ptr++; - cr_ptr++; - } - } -} - -static void glue (y800_to_, RGB_NAME) (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const unsigned char *p; - unsigned char *q; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - int r, dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - BPP * width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - r = Y_CCIR_TO_JPEG (p[0]); - RGB_OUT (q, r, r, r); - q += BPP; - p++; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void glue (y16_to_, RGB_NAME) (AVPicture * dst, - const AVPicture * src, int width, int height) -{ - const unsigned char *p; - unsigned char *q; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - int r, dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - 2 * width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - BPP * width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - r = Y_CCIR_TO_JPEG (GST_READ_UINT16_LE (p) >> 8); - RGB_OUT (q, r, r, r); - q += BPP; - p += 2; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void glue (RGB_NAME, _to_yuv420p) (AVPicture * dst, - const AVPicture * src, int width, int height) -{ - int wrap, wrap3, width2; - int r, g, b, r1, g1, b1, w; - uint8_t *lum, *cb, *cr; - const uint8_t *p; - - lum = dst->data[0]; - cb = dst->data[1]; - cr = dst->data[2]; - - width2 = (width + 1) >> 1; - wrap = dst->linesize[0]; - wrap3 = src->linesize[0]; - p = src->data[0]; - for (; height >= 2; height -= 2) { - for (w = width; w >= 2; w -= 2) { - RGB_IN (r, g, b, p); - r1 = r; - g1 = g; - b1 = b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - - RGB_IN (r, g, b, p + BPP); - r1 += r; - g1 += g; - b1 += b; - lum[1] = RGB_TO_Y_CCIR (r, g, b); - p += wrap3; - lum += wrap; - - RGB_IN (r, g, b, p); - r1 += r; - g1 += g; - b1 += b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - - RGB_IN (r, g, b, p + BPP); - r1 += r; - g1 += g; - b1 += b; - lum[1] = RGB_TO_Y_CCIR (r, g, b); - - cb[0] = RGB_TO_U_CCIR (r1, g1, b1, 2); - cr[0] = RGB_TO_V_CCIR (r1, g1, b1, 2); - - - cb++; - cr++; - p += -wrap3 + 2 * BPP; - lum += -wrap + 2; - } - if (w) { - RGB_IN (r, g, b, p); - r1 = r; - g1 = g; - b1 = b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - p += wrap3; - lum += wrap; - RGB_IN (r, g, b, p); - r1 += r; - g1 += g; - b1 += b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - cb[0] = RGB_TO_U_CCIR (r1, g1, b1, 1); - cr[0] = RGB_TO_V_CCIR (r1, g1, b1, 1); - cb++; - cr++; - p += -wrap3 + BPP; - lum += -wrap + 1; - } - p += wrap3 + (wrap3 - width * BPP); - lum += wrap + (wrap - width); - cb += dst->linesize[1] - width2; - cr += dst->linesize[2] - width2; - } - /* handle odd height */ - if (height) { - for (w = width; w >= 2; w -= 2) { - RGB_IN (r, g, b, p); - r1 = r; - g1 = g; - b1 = b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - - RGB_IN (r, g, b, p + BPP); - r1 += r; - g1 += g; - b1 += b; - lum[1] = RGB_TO_Y_CCIR (r, g, b); - cb[0] = RGB_TO_U_CCIR (r1, g1, b1, 1); - cr[0] = RGB_TO_V_CCIR (r1, g1, b1, 1); - cb++; - cr++; - p += 2 * BPP; - lum += 2; - } - if (w) { - RGB_IN (r, g, b, p); - lum[0] = RGB_TO_Y_CCIR (r, g, b); - cb[0] = RGB_TO_U_CCIR (r, g, b, 0); - cr[0] = RGB_TO_V_CCIR (r, g, b, 0); - } - } -} - -#ifndef RGBA_IN -#define RGBA_IN_(r, g, b, a, p) RGB_IN(r, g, b, p) -#else -#define RGBA_IN_(r, g, b, a, p) RGBA_IN(r, g, b, a, p) -#endif - -static void glue (RGB_NAME, _to_yuva420p) (AVPicture * dst, - const AVPicture * src, int width, int height) -{ - int wrap, wrap3, width2; - int r, g, b, r1, g1, b1, w, ra = 255; - uint8_t *lum, *cb, *cr, *a; - const uint8_t *p; - - lum = dst->data[0]; - cb = dst->data[1]; - cr = dst->data[2]; - a = dst->data[3]; - - width2 = (width + 1) >> 1; - wrap = dst->linesize[0]; - wrap3 = src->linesize[0]; - p = src->data[0]; - for (; height >= 2; height -= 2) { - for (w = width; w >= 2; w -= 2) { - RGBA_IN_ (r, g, b, ra, p); - r1 = r; - g1 = g; - b1 = b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - a[0] = ra; - - RGBA_IN_ (r, g, b, ra, p + BPP); - r1 += r; - g1 += g; - b1 += b; - lum[1] = RGB_TO_Y_CCIR (r, g, b); - a[1] = ra; - p += wrap3; - lum += wrap; - a += wrap; - - RGBA_IN_ (r, g, b, ra, p); - r1 += r; - g1 += g; - b1 += b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - a[0] = ra; - - RGBA_IN_ (r, g, b, ra, p + BPP); - r1 += r; - g1 += g; - b1 += b; - lum[1] = RGB_TO_Y_CCIR (r, g, b); - a[1] = ra; - - cb[0] = RGB_TO_U_CCIR (r1, g1, b1, 2); - cr[0] = RGB_TO_V_CCIR (r1, g1, b1, 2); - - cb++; - cr++; - p += -wrap3 + 2 * BPP; - lum += -wrap + 2; - a += -wrap + 2; - } - if (w) { - RGBA_IN_ (r, g, b, ra, p); - r1 = r; - g1 = g; - b1 = b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - a[0] = ra; - p += wrap3; - lum += wrap; - a += wrap; - RGBA_IN_ (r, g, b, ra, p); - r1 += r; - g1 += g; - b1 += b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - a[0] = ra; - cb[0] = RGB_TO_U_CCIR (r1, g1, b1, 1); - cr[0] = RGB_TO_V_CCIR (r1, g1, b1, 1); - cb++; - cr++; - p += -wrap3 + BPP; - lum += -wrap + 1; - a += -wrap + 1; - } - p += wrap3 + (wrap3 - width * BPP); - lum += wrap + (wrap - width); - a += wrap + (wrap - width); - cb += dst->linesize[1] - width2; - cr += dst->linesize[2] - width2; - } - /* handle odd height */ - if (height) { - for (w = width; w >= 2; w -= 2) { - RGBA_IN_ (r, g, b, ra, p); - r1 = r; - g1 = g; - b1 = b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - a[0] = ra; - - RGBA_IN_ (r, g, b, ra, p + BPP); - r1 += r; - g1 += g; - b1 += b; - lum[1] = RGB_TO_Y_CCIR (r, g, b); - a[1] = ra; - cb[0] = RGB_TO_U_CCIR (r1, g1, b1, 1); - cr[0] = RGB_TO_V_CCIR (r1, g1, b1, 1); - cb++; - cr++; - p += 2 * BPP; - lum += 2; - a += 2; - } - if (w) { - RGBA_IN_ (r, g, b, ra, p); - lum[0] = RGB_TO_Y_CCIR (r, g, b); - a[0] = ra; - cb[0] = RGB_TO_U_CCIR (r, g, b, 0); - cr[0] = RGB_TO_V_CCIR (r, g, b, 0); - } - } -} - -static void glue (RGB_NAME, _to_nv12) (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - int wrap, wrap3; - int r, g, b, r1, g1, b1, w; - uint8_t *lum, *c; - const uint8_t *p; - - lum = dst->data[0]; - c = dst->data[1]; - - wrap = dst->linesize[0]; - wrap3 = src->linesize[0]; - p = src->data[0]; - for (; height >= 2; height -= 2) { - for (w = width; w >= 2; w -= 2) { - RGB_IN (r, g, b, p); - r1 = r; - g1 = g; - b1 = b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - - RGB_IN (r, g, b, p + BPP); - r1 += r; - g1 += g; - b1 += b; - lum[1] = RGB_TO_Y_CCIR (r, g, b); - p += wrap3; - lum += wrap; - - RGB_IN (r, g, b, p); - r1 += r; - g1 += g; - b1 += b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - - RGB_IN (r, g, b, p + BPP); - r1 += r; - g1 += g; - b1 += b; - lum[1] = RGB_TO_Y_CCIR (r, g, b); - - c[0] = RGB_TO_U_CCIR (r1, g1, b1, 2); - c[1] = RGB_TO_V_CCIR (r1, g1, b1, 2); - - - c += 2; - p += -wrap3 + 2 * BPP; - lum += -wrap + 2; - } - /* handle odd width */ - if (w) { - RGB_IN (r, g, b, p); - r1 = r; - g1 = g; - b1 = b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - p += wrap3; - lum += wrap; - RGB_IN (r, g, b, p); - r1 += r; - g1 += g; - b1 += b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - c[0] = RGB_TO_U_CCIR (r1, g1, b1, 1); - c[1] = RGB_TO_V_CCIR (r1, g1, b1, 1); - p += -wrap3 + BPP; - lum += -wrap + 1; - } - p += wrap3 + (wrap3 - width * BPP); - lum += wrap + (wrap - width); - c += dst->linesize[1] - (width & ~1); - } - /* handle odd height */ - if (height) { - for (w = width; w >= 2; w -= 2) { - RGB_IN (r, g, b, p); - r1 = r; - g1 = g; - b1 = b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - - RGB_IN (r, g, b, p + BPP); - r1 += r; - g1 += g; - b1 += b; - lum[1] = RGB_TO_Y_CCIR (r, g, b); - c[0] = RGB_TO_U_CCIR (r1, g1, b1, 1); - c[1] = RGB_TO_V_CCIR (r1, g1, b1, 1); - c += 2; - p += 2 * BPP; - lum += 2; - } - /* handle odd width */ - if (w) { - RGB_IN (r, g, b, p); - lum[0] = RGB_TO_Y_CCIR (r, g, b); - c[0] = RGB_TO_U_CCIR (r, g, b, 0); - c[1] = RGB_TO_V_CCIR (r, g, b, 0); - } - } -} - -static void glue (RGB_NAME, _to_nv21) (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - int wrap, wrap3; - int r, g, b, r1, g1, b1, w; - uint8_t *lum, *c; - const uint8_t *p; - - lum = dst->data[0]; - c = dst->data[1]; - - wrap = dst->linesize[0]; - wrap3 = src->linesize[0]; - p = src->data[0]; - for (; height >= 2; height -= 2) { - for (w = width; w >= 2; w -= 2) { - RGB_IN (r, g, b, p); - r1 = r; - g1 = g; - b1 = b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - - RGB_IN (r, g, b, p + BPP); - r1 += r; - g1 += g; - b1 += b; - lum[1] = RGB_TO_Y_CCIR (r, g, b); - p += wrap3; - lum += wrap; - - RGB_IN (r, g, b, p); - r1 += r; - g1 += g; - b1 += b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - - RGB_IN (r, g, b, p + BPP); - r1 += r; - g1 += g; - b1 += b; - lum[1] = RGB_TO_Y_CCIR (r, g, b); - - c[1] = RGB_TO_U_CCIR (r1, g1, b1, 2); - c[0] = RGB_TO_V_CCIR (r1, g1, b1, 2); - - - c += 2; - p += -wrap3 + 2 * BPP; - lum += -wrap + 2; - } - /* handle odd width */ - if (w) { - RGB_IN (r, g, b, p); - r1 = r; - g1 = g; - b1 = b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - p += wrap3; - lum += wrap; - RGB_IN (r, g, b, p); - r1 += r; - g1 += g; - b1 += b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - c[1] = RGB_TO_U_CCIR (r1, g1, b1, 1); - c[0] = RGB_TO_V_CCIR (r1, g1, b1, 1); - p += -wrap3 + BPP; - lum += -wrap + 1; - } - p += wrap3 + (wrap3 - width * BPP); - lum += wrap + (wrap - width); - c += dst->linesize[1] - (width & ~1); - } - /* handle odd height */ - if (height) { - for (w = width; w >= 2; w -= 2) { - RGB_IN (r, g, b, p); - r1 = r; - g1 = g; - b1 = b; - lum[0] = RGB_TO_Y_CCIR (r, g, b); - - RGB_IN (r, g, b, p + BPP); - r1 += r; - g1 += g; - b1 += b; - lum[1] = RGB_TO_Y_CCIR (r, g, b); - c[1] = RGB_TO_U_CCIR (r1, g1, b1, 1); - c[0] = RGB_TO_V_CCIR (r1, g1, b1, 1); - c += 2; - p += 2 * BPP; - lum += 2; - } - /* handle odd width */ - if (w) { - RGB_IN (r, g, b, p); - lum[0] = RGB_TO_Y_CCIR (r, g, b); - c[1] = RGB_TO_U_CCIR (r, g, b, 0); - c[0] = RGB_TO_V_CCIR (r, g, b, 0); - } - } -} - -static void glue (RGB_NAME, _to_gray) (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int r, g, b, dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - BPP * width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - RGB_IN (r, g, b, p); - q[0] = RGB_TO_Y (r, g, b); - q++; - p += BPP; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void glue (RGB_NAME, _to_y800) (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int r, g, b, dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - BPP * width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - RGB_IN (r, g, b, p); - q[0] = RGB_TO_Y_CCIR (r, g, b); - q++; - p += BPP; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void glue (RGB_NAME, _to_y16) (AVPicture * dst, - const AVPicture * src, int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int r, g, b, dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - BPP * width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - 2 * width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - RGB_IN (r, g, b, p); - GST_WRITE_UINT16_LE (q, RGB_TO_Y_CCIR (r, g, b) << 8); - q += 2; - p += BPP; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void glue (gray_to_, RGB_NAME) (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int r, dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - BPP * width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - r = p[0]; - RGB_OUT (q, r, r, r); - q += BPP; - p++; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void glue (RGB_NAME, _to_gray16_l) (AVPicture * dst, - const AVPicture * src, int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int r, g, b, dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - BPP * width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - 2 * width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - RGB_IN (r, g, b, p); - GST_WRITE_UINT16_LE (q, RGB_TO_Y (r, g, b) << 8); - q += 2; - p += BPP; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void glue (gray16_l_to_, RGB_NAME) (AVPicture * dst, - const AVPicture * src, int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int r, dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - 2 * width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - BPP * width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - r = GST_READ_UINT16_LE (p) >> 8; - RGB_OUT (q, r, r, r); - q += BPP; - p += 2; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void glue (RGB_NAME, _to_gray16_b) (AVPicture * dst, - const AVPicture * src, int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int r, g, b, dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - BPP * width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - 2 * width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - RGB_IN (r, g, b, p); - GST_WRITE_UINT16_BE (q, RGB_TO_Y (r, g, b) << 8); - q += 2; - p += BPP; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void glue (gray16_b_to_, RGB_NAME) (AVPicture * dst, - const AVPicture * src, int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int r, dst_wrap, src_wrap; - int x, y; - - p = src->data[0]; - src_wrap = src->linesize[0] - 2 * width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - BPP * width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - r = GST_READ_UINT16_BE (p) >> 8; - RGB_OUT (q, r, r, r); - q += BPP; - p += 2; - } - p += src_wrap; - q += dst_wrap; - } -} - -static void glue (pal8_to_, RGB_NAME) (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int r, g, b, dst_wrap, src_wrap; - int x, y; - uint32_t v; - const uint32_t *palette; - - p = src->data[0]; - src_wrap = src->linesize[0] - width; - palette = (uint32_t *) src->data[1]; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - BPP * width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - v = palette[p[0]]; - r = (v >> 16) & 0xff; - g = (v >> 8) & 0xff; - b = (v) & 0xff; -#ifdef RGBA_OUT - { - int a; - a = (v >> 24) & 0xff; - RGBA_OUT (q, r, g, b, a); - } -#else - RGB_OUT (q, r, g, b); -#endif - q += BPP; - p++; - } - p += src_wrap; - q += dst_wrap; - } -} - -#if !defined(FMT_RGBA32) && defined(RGBA_OUT) -/* alpha support */ - -static void glue (rgba32_to_, RGB_NAME) (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const uint8_t *s; - uint8_t *d; - int src_wrap, dst_wrap, j, y; - unsigned int v, r, g, b, a; - - s = src->data[0]; - src_wrap = src->linesize[0] - width * 4; - - d = dst->data[0]; - dst_wrap = dst->linesize[0] - width * BPP; - - for (y = 0; y < height; y++) { - for (j = 0; j < width; j++) { - v = ((const uint32_t *) (s))[0]; - a = (v >> 24) & 0xff; - r = (v >> 16) & 0xff; - g = (v >> 8) & 0xff; - b = v & 0xff; - RGBA_OUT (d, r, g, b, a); - s += 4; - d += BPP; - } - s += src_wrap; - d += dst_wrap; - } -} - -static void glue (RGB_NAME, _to_rgba32) (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const uint8_t *s; - uint8_t *d; - int src_wrap, dst_wrap, j, y; - unsigned int r, g, b, a; - - s = src->data[0]; - src_wrap = src->linesize[0] - width * BPP; - - d = dst->data[0]; - dst_wrap = dst->linesize[0] - width * 4; - - for (y = 0; y < height; y++) { - for (j = 0; j < width; j++) { - RGBA_IN (r, g, b, a, s); - ((uint32_t *) (d))[0] = (a << 24) | (r << 16) | (g << 8) | b; - d += 4; - s += BPP; - } - s += src_wrap; - d += dst_wrap; - } -} -#endif /* !defined(FMT_RGBA32) && defined(RGBA_OUT) */ - -#if defined(FMT_RGBA32) - -#if !defined(rgba32_fcts_done) -#define rgba32_fcts_done - -static void -ayuv4444_to_rgba32 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - uint8_t *s, *d, *d1, *s1; - int w, y, cb, cr, r_add, g_add, b_add; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b, a; - - d = dst->data[0]; - s = src->data[0]; - for (; height > 0; height--) { - d1 = d; - s1 = s; - for (w = width; w > 0; w--) { - a = s1[0]; - YUV_TO_RGB1_CCIR (s1[2], s1[3]); - - YUV_TO_RGB2_CCIR (r, g, b, s1[1]); - RGBA_OUT (d1, r, g, b, a); - d1 += BPP; - s1 += 4; - } - d += dst->linesize[0]; - s += src->linesize[0]; - } -} - -static void -rgba32_to_ayuv4444 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - int src_wrap, dst_wrap, x, y; - int r, g, b, a; - uint8_t *d; - const uint8_t *p; - - src_wrap = src->linesize[0] - width * BPP; - dst_wrap = dst->linesize[0] - width * 4; - d = dst->data[0]; - p = src->data[0]; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - RGBA_IN (r, g, b, a, p); - d[0] = a; - d[1] = RGB_TO_Y_CCIR (r, g, b); - d[2] = RGB_TO_U_CCIR (r, g, b, 0); - d[3] = RGB_TO_V_CCIR (r, g, b, 0); - p += BPP; - d += 4; - } - p += src_wrap; - d += dst_wrap; - } -} - -#endif /* !defined(rgba32_fcts_done) */ - -#endif /* defined(FMT_RGBA32) */ - -#if defined(FMT_BGRA32) -#if !defined(bgra32_fcts_done) -#define bgra32_fcts_done - -static void -bgra32_to_ayuv4444 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - int src_wrap, dst_wrap, x, y; - int r, g, b, a; - uint8_t *d; - const uint8_t *p; - - src_wrap = src->linesize[0] - width * BPP; - dst_wrap = dst->linesize[0] - width * 4; - d = dst->data[0]; - p = src->data[0]; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - RGBA_IN (r, g, b, a, p); - d[0] = a; - d[1] = RGB_TO_Y_CCIR (r, g, b); - d[2] = RGB_TO_U_CCIR (r, g, b, 0); - d[3] = RGB_TO_V_CCIR (r, g, b, 0); - p += BPP; - d += 4; - } - p += src_wrap; - d += dst_wrap; - } -} - -static void -ayuv4444_to_bgra32 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - uint8_t *s, *d, *d1, *s1; - int w, y, cb, cr, r_add, g_add, b_add; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b, a; - - d = dst->data[0]; - s = src->data[0]; - for (; height > 0; height--) { - d1 = d; - s1 = s; - for (w = width; w > 0; w--) { - a = s1[0]; - YUV_TO_RGB1_CCIR (s1[2], s1[3]); - - YUV_TO_RGB2_CCIR (r, g, b, s1[1]); - RGBA_OUT (d1, r, g, b, a); - d1 += BPP; - s1 += 4; - } - d += dst->linesize[0]; - s += src->linesize[0]; - } -} - -#endif /* !defined(bgra32_fcts_done) */ - -#endif /* defined(FMT_BGRA32) */ - -#if defined(FMT_ARGB32) - -#if !defined(argb32_fcts_done) -#define argb32_fcts_done - -static void -ayuv4444_to_argb32 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - uint8_t *s, *d, *d1, *s1; - int w, y, cb, cr, r_add, g_add, b_add; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b, a; - - d = dst->data[0]; - s = src->data[0]; - for (; height > 0; height--) { - d1 = d; - s1 = s; - for (w = width; w > 0; w--) { - a = s1[0]; - YUV_TO_RGB1_CCIR (s1[2], s1[3]); - - YUV_TO_RGB2_CCIR (r, g, b, s1[1]); - RGBA_OUT (d1, r, g, b, a); - d1 += BPP; - s1 += 4; - } - d += dst->linesize[0]; - s += src->linesize[0]; - } -} - -static void -argb32_to_ayuv4444 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - int src_wrap, dst_wrap, x, y; - int r, g, b, a; - uint8_t *d; - const uint8_t *p; - - src_wrap = src->linesize[0] - width * BPP; - dst_wrap = dst->linesize[0] - width * 4; - d = dst->data[0]; - p = src->data[0]; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - RGBA_IN (r, g, b, a, p); - d[0] = a; - d[1] = RGB_TO_Y_CCIR (r, g, b); - d[2] = RGB_TO_U_CCIR (r, g, b, 0); - d[3] = RGB_TO_V_CCIR (r, g, b, 0); - p += BPP; - d += 4; - } - p += src_wrap; - d += dst_wrap; - } -} - -#endif /* !defined(argb32_fcts_done) */ - -#endif /* defined(FMT_ARGB32) */ - -#if defined(FMT_ABGR32) -#if !defined(abgr32_fcts_done) -#define abgr32_fcts_done - -static void -abgr32_to_ayuv4444 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - int src_wrap, dst_wrap, x, y; - int r, g, b, a; - uint8_t *d; - const uint8_t *p; - - src_wrap = src->linesize[0] - width * BPP; - dst_wrap = dst->linesize[0] - width * 4; - d = dst->data[0]; - p = src->data[0]; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - RGBA_IN (r, g, b, a, p); - d[0] = a; - d[1] = RGB_TO_Y_CCIR (r, g, b); - d[2] = RGB_TO_U_CCIR (r, g, b, 0); - d[3] = RGB_TO_V_CCIR (r, g, b, 0); - p += BPP; - d += 4; - } - p += src_wrap; - d += dst_wrap; - } -} - -static void -ayuv4444_to_abgr32 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - uint8_t *s, *d, *d1, *s1; - int w, y, cb, cr, r_add, g_add, b_add; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b, a; - - d = dst->data[0]; - s = src->data[0]; - for (; height > 0; height--) { - d1 = d; - s1 = s; - for (w = width; w > 0; w--) { - a = s1[0]; - YUV_TO_RGB1_CCIR (s1[2], s1[3]); - - YUV_TO_RGB2_CCIR (r, g, b, s1[1]); - RGBA_OUT (d1, r, g, b, a); - d1 += BPP; - s1 += 4; - } - d += dst->linesize[0]; - s += src->linesize[0]; - } -} - -#endif /* !defined(abgr32_fcts_done) */ - -#endif /* defined(FMT_ABGR32) */ - -#ifndef FMT_RGB24 - -static void glue (rgb24_to_, RGB_NAME) (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const uint8_t *s; - uint8_t *d; - int src_wrap, dst_wrap, j, y; - unsigned int r, g, b; - - s = src->data[0]; - src_wrap = src->linesize[0] - width * 3; - - d = dst->data[0]; - dst_wrap = dst->linesize[0] - width * BPP; - - for (y = 0; y < height; y++) { - for (j = 0; j < width; j++) { - r = s[0]; - g = s[1]; - b = s[2]; - RGB_OUT (d, r, g, b); - s += 3; - d += BPP; - } - s += src_wrap; - d += dst_wrap; - } -} - -static void glue (RGB_NAME, _to_rgb24) (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const uint8_t *s; - uint8_t *d; - int src_wrap, dst_wrap, j, y; - unsigned int r, g, b; - - s = src->data[0]; - src_wrap = src->linesize[0] - width * BPP; - - d = dst->data[0]; - dst_wrap = dst->linesize[0] - width * 3; - - for (y = 0; y < height; y++) { - for (j = 0; j < width; j++) { - RGB_IN (r, g, b, s) - d[0] = r; - d[1] = g; - d[2] = b; - d += 3; - s += BPP; - } - s += src_wrap; - d += dst_wrap; - } -} - -#endif /* !FMT_RGB24 */ - -#ifdef FMT_RGB24 - -static void -yuv444p_to_rgb24 (AVPicture * dst, const AVPicture * src, int width, int height) -{ - const uint8_t *y1_ptr, *cb_ptr, *cr_ptr; - uint8_t *d, *d1; - int w, y, cb, cr, r_add, g_add, b_add; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b; - - d = dst->data[0]; - y1_ptr = src->data[0]; - cb_ptr = src->data[1]; - cr_ptr = src->data[2]; - for (; height > 0; height--) { - d1 = d; - for (w = width; w > 0; w--) { - YUV_TO_RGB1_CCIR (cb_ptr[0], cr_ptr[0]); - - YUV_TO_RGB2_CCIR (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - d1 += BPP; - - y1_ptr++; - cb_ptr++; - cr_ptr++; - } - d += dst->linesize[0]; - y1_ptr += src->linesize[0] - width; - cb_ptr += src->linesize[1] - width; - cr_ptr += src->linesize[2] - width; - } -} - -static void -yuvj444p_to_rgb24 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const uint8_t *y1_ptr, *cb_ptr, *cr_ptr; - uint8_t *d, *d1; - int w, y, cb, cr, r_add, g_add, b_add; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b; - - d = dst->data[0]; - y1_ptr = src->data[0]; - cb_ptr = src->data[1]; - cr_ptr = src->data[2]; - for (; height > 0; height--) { - d1 = d; - for (w = width; w > 0; w--) { - YUV_TO_RGB1 (cb_ptr[0], cr_ptr[0]); - - YUV_TO_RGB2 (r, g, b, y1_ptr[0]); - RGB_OUT (d1, r, g, b); - d1 += BPP; - - y1_ptr++; - cb_ptr++; - cr_ptr++; - } - d += dst->linesize[0]; - y1_ptr += src->linesize[0] - width; - cb_ptr += src->linesize[1] - width; - cr_ptr += src->linesize[2] - width; - } -} - -static void -rgb24_to_yuv444p (AVPicture * dst, const AVPicture * src, int width, int height) -{ - int src_wrap, x, y; - int r, g, b; - uint8_t *lum, *cb, *cr; - const uint8_t *p; - - lum = dst->data[0]; - cb = dst->data[1]; - cr = dst->data[2]; - - src_wrap = src->linesize[0] - width * BPP; - p = src->data[0]; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - RGB_IN (r, g, b, p); - lum[0] = RGB_TO_Y_CCIR (r, g, b); - cb[0] = RGB_TO_U_CCIR (r, g, b, 0); - cr[0] = RGB_TO_V_CCIR (r, g, b, 0); - p += BPP; - cb++; - cr++; - lum++; - } - p += src_wrap; - lum += dst->linesize[0] - width; - cb += dst->linesize[1] - width; - cr += dst->linesize[2] - width; - } -} - -static void -rgb24_to_yuvj420p (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - int wrap, wrap3, width2; - int r, g, b, r1, g1, b1, w; - uint8_t *lum, *cb, *cr; - const uint8_t *p; - - lum = dst->data[0]; - cb = dst->data[1]; - cr = dst->data[2]; - - width2 = (width + 1) >> 1; - wrap = dst->linesize[0]; - wrap3 = src->linesize[0]; - p = src->data[0]; - for (; height >= 2; height -= 2) { - for (w = width; w >= 2; w -= 2) { - RGB_IN (r, g, b, p); - r1 = r; - g1 = g; - b1 = b; - lum[0] = RGB_TO_Y (r, g, b); - - RGB_IN (r, g, b, p + BPP); - r1 += r; - g1 += g; - b1 += b; - lum[1] = RGB_TO_Y (r, g, b); - p += wrap3; - lum += wrap; - - RGB_IN (r, g, b, p); - r1 += r; - g1 += g; - b1 += b; - lum[0] = RGB_TO_Y (r, g, b); - - RGB_IN (r, g, b, p + BPP); - r1 += r; - g1 += g; - b1 += b; - lum[1] = RGB_TO_Y (r, g, b); - - cb[0] = RGB_TO_U (r1, g1, b1, 2); - cr[0] = RGB_TO_V (r1, g1, b1, 2); - - cb++; - cr++; - p += -wrap3 + 2 * BPP; - lum += -wrap + 2; - } - if (w) { - RGB_IN (r, g, b, p); - r1 = r; - g1 = g; - b1 = b; - lum[0] = RGB_TO_Y (r, g, b); - p += wrap3; - lum += wrap; - RGB_IN (r, g, b, p); - r1 += r; - g1 += g; - b1 += b; - lum[0] = RGB_TO_Y (r, g, b); - cb[0] = RGB_TO_U (r1, g1, b1, 1); - cr[0] = RGB_TO_V (r1, g1, b1, 1); - cb++; - cr++; - p += -wrap3 + BPP; - lum += -wrap + 1; - } - p += wrap3 + (wrap3 - width * BPP); - lum += wrap + (wrap - width); - cb += dst->linesize[1] - width2; - cr += dst->linesize[2] - width2; - } - /* handle odd height */ - if (height) { - for (w = width; w >= 2; w -= 2) { - RGB_IN (r, g, b, p); - r1 = r; - g1 = g; - b1 = b; - lum[0] = RGB_TO_Y (r, g, b); - - RGB_IN (r, g, b, p + BPP); - r1 += r; - g1 += g; - b1 += b; - lum[1] = RGB_TO_Y (r, g, b); - cb[0] = RGB_TO_U (r1, g1, b1, 1); - cr[0] = RGB_TO_V (r1, g1, b1, 1); - cb++; - cr++; - p += 2 * BPP; - lum += 2; - } - if (w) { - RGB_IN (r, g, b, p); - lum[0] = RGB_TO_Y (r, g, b); - cb[0] = RGB_TO_U (r, g, b, 0); - cr[0] = RGB_TO_V (r, g, b, 0); - } - } -} - -static void -rgb24_to_yuvj444p (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - int src_wrap, x, y; - int r, g, b; - uint8_t *lum, *cb, *cr; - const uint8_t *p; - - lum = dst->data[0]; - cb = dst->data[1]; - cr = dst->data[2]; - - src_wrap = src->linesize[0] - width * BPP; - p = src->data[0]; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - RGB_IN (r, g, b, p); - lum[0] = RGB_TO_Y (r, g, b); - cb[0] = RGB_TO_U (r, g, b, 0); - cr[0] = RGB_TO_V (r, g, b, 0); - p += BPP; - cb++; - cr++; - lum++; - } - p += src_wrap; - lum += dst->linesize[0] - width; - cb += dst->linesize[1] - width; - cr += dst->linesize[2] - width; - } -} - -static void -ayuv4444_to_rgb24 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - uint8_t *s, *d, *d1, *s1; - int w, y, cb, cr, r_add, g_add, b_add; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b; - - d = dst->data[0]; - s = src->data[0]; - for (; height > 0; height--) { - d1 = d; - s1 = s; - for (w = width; w > 0; w--) { - YUV_TO_RGB1_CCIR (s1[2], s1[3]); - - YUV_TO_RGB2_CCIR (r, g, b, s1[1]); - RGB_OUT (d1, r, g, b); - d1 += BPP; - s1 += 4; - } - d += dst->linesize[0]; - s += src->linesize[0]; - } -} - -static void -rgb24_to_ayuv4444 (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - int src_wrap, dst_wrap, x, y; - int r, g, b; - uint8_t *d; - const uint8_t *p; - - src_wrap = src->linesize[0] - width * BPP; - dst_wrap = dst->linesize[0] - width * 4; - d = dst->data[0]; - p = src->data[0]; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - RGB_IN (r, g, b, p); - d[0] = 0xff; - d[1] = RGB_TO_Y_CCIR (r, g, b); - d[2] = RGB_TO_U_CCIR (r, g, b, 0); - d[3] = RGB_TO_V_CCIR (r, g, b, 0); - p += BPP; - d += 4; - } - p += src_wrap; - d += dst_wrap; - } -} - -static void -v308_to_rgb24 (AVPicture * dst, const AVPicture * src, int width, int height) -{ - uint8_t *s, *d, *d1, *s1; - int w, y, cb, cr, r_add, g_add, b_add; - uint8_t *cm = cropTbl + MAX_NEG_CROP; - unsigned int r, g, b; - - d = dst->data[0]; - s = src->data[0]; - for (; height > 0; height--) { - d1 = d; - s1 = s; - for (w = width; w > 0; w--) { - YUV_TO_RGB1_CCIR (s1[1], s1[2]); - - YUV_TO_RGB2_CCIR (r, g, b, s1[0]); - RGB_OUT (d1, r, g, b); - d1 += BPP; - s1 += 3; - } - d += dst->linesize[0]; - s += src->linesize[0]; - } -} - -static void -rgb24_to_v308 (AVPicture * dst, const AVPicture * src, int width, int height) -{ - int src_wrap, dst_wrap, x, y; - int r, g, b; - uint8_t *d; - const uint8_t *p; - - src_wrap = src->linesize[0] - width * BPP; - dst_wrap = dst->linesize[0] - width * 3; - d = dst->data[0]; - p = src->data[0]; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - RGB_IN (r, g, b, p); - d[0] = RGB_TO_Y_CCIR (r, g, b); - d[1] = RGB_TO_U_CCIR (r, g, b, 0); - d[2] = RGB_TO_V_CCIR (r, g, b, 0); - p += BPP; - d += 3; - } - p += src_wrap; - d += dst_wrap; - } -} -#endif /* FMT_RGB24 */ - -#if defined(FMT_RGB24) || defined(FMT_RGBA32) - -static void glue (RGB_NAME, _to_pal8) (AVPicture * dst, const AVPicture * src, - int width, int height) -{ - const unsigned char *p; - unsigned char *q; - int dst_wrap, src_wrap; - int x, y, has_alpha; - unsigned int r, g, b; - - p = src->data[0]; - src_wrap = src->linesize[0] - BPP * width; - - q = dst->data[0]; - dst_wrap = dst->linesize[0] - width; - has_alpha = 0; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { -#ifdef RGBA_IN - { - unsigned int a; - RGBA_IN (r, g, b, a, p); - /* crude approximation for alpha ! */ - if (a < 0x80) { - has_alpha = 1; - q[0] = TRANSP_INDEX; - } else { - q[0] = gif_clut_index (r, g, b); - } - } -#else - RGB_IN (r, g, b, p); - q[0] = gif_clut_index (r, g, b); -#endif - q++; - p += BPP; - } - p += src_wrap; - q += dst_wrap; - } - - build_rgb_palette (dst->data[1], has_alpha); -} - -#endif /* defined(FMT_RGB24) || defined(FMT_RGBA32) */ - -#ifdef RGBA_IN - -static int glue (get_alpha_info_, RGB_NAME) (const AVPicture * src, - int width, int height) -{ - const unsigned char *p; - int src_wrap, ret, x, y; - unsigned int G_GNUC_UNUSED r, G_GNUC_UNUSED g, G_GNUC_UNUSED b, a; - - p = src->data[0]; - src_wrap = src->linesize[0] - BPP * width; - ret = 0; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - RGBA_IN (r, g, b, a, p); - if (a == 0x00) { - ret |= FF_ALPHA_TRANSP; - } else if (a != 0xff) { - ret |= FF_ALPHA_SEMI_TRANSP; - } - p += BPP; - } - p += src_wrap; - } - return ret; -} - -#endif /* RGBA_IN */ - -#undef RGB_IN -#undef RGBA_IN -#undef RGB_OUT -#undef RGBA_OUT -#undef BPP -#undef RGB_NAME -#undef FMT_RGB24 -#undef FMT_RGBA32 -#undef YUVA_TO_A -#undef RGBA_OUT_ -#undef RGBA_IN_ diff --git a/gst/ffmpegcolorspace/mem.c b/gst/ffmpegcolorspace/mem.c deleted file mode 100644 index 5c3a8a3..0000000 --- a/gst/ffmpegcolorspace/mem.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * default memory allocator for libavcodec - * Copyright (c) 2002 Fabrice Bellard. - * - * This library 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 of the License, or (at your option) any later version. - * - * This library 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 this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/** - * @file mem.c - * default memory allocator for libavcodec. - */ - -#include "avcodec.h" - -/* here we can use OS dependant allocation functions */ -#undef malloc -#undef free -#undef realloc - -#include - -#ifdef HAVE_MALLOC_H -#include -#endif - -/* you can redefine av_malloc and av_free in your project to use your - memory allocator. You do not need to suppress this file because the - linker will do it automatically */ - -/** - * Memory allocation of size byte with alignment suitable for all - * memory accesses (including vectors if available on the - * CPU). av_malloc(0) must return a non NULL pointer. - */ -void * -av_malloc (unsigned int size) -{ - void *ptr; - -#ifdef MEMALIGN_HACK - int diff; - - ptr = malloc (size + 16 + 1); - diff = ((-(int) ptr - 1) & 15) + 1; - ptr += diff; - ((char *) ptr)[-1] = diff; -#elif defined (HAVE_MEMALIGN) - ptr = memalign (16, size); - /* Why 64? - Indeed, we should align it: - on 4 for 386 - on 16 for 486 - on 32 for 586, PPro - k6-III - on 64 for K7 (maybe for P3 too). - Because L1 and L2 caches are aligned on those values. - But I don't want to code such logic here! - */ - /* Why 16? - because some cpus need alignment, for example SSE2 on P4, & most RISC cpus - it will just trigger an exception and the unaligned load will be done in the - exception handler or it will just segfault (SSE2 on P4) - Why not larger? because i didnt see a difference in benchmarks ... - */ - /* benchmarks with p3 - memalign(64)+1 3071,3051,3032 - memalign(64)+2 3051,3032,3041 - memalign(64)+4 2911,2896,2915 - memalign(64)+8 2545,2554,2550 - memalign(64)+16 2543,2572,2563 - memalign(64)+32 2546,2545,2571 - memalign(64)+64 2570,2533,2558 - - btw, malloc seems to do 8 byte alignment by default here - */ -#else - ptr = malloc (size); -#endif - return ptr; -} - -/** - * av_realloc semantics (same as glibc): if ptr is NULL and size > 0, - * identical to malloc(size). If size is zero, it is identical to - * free(ptr) and NULL is returned. - */ -void * -av_realloc (void *ptr, unsigned int size) -{ -#ifdef MEMALIGN_HACK - //FIXME this isnt aligned correctly though it probably isnt needed - int diff; - - if (!ptr) - return av_malloc (size); - diff = ((char *) ptr)[-1]; - return realloc (ptr - diff, size + diff) + diff; -#else - return realloc (ptr, size); -#endif -} - -/* NOTE: ptr = NULL is explicetly allowed */ -void -av_free (void *ptr) -{ - /* XXX: this test should not be needed on most libcs */ - if (ptr) -#ifdef MEMALIGN_HACK - free (ptr - ((char *) ptr)[-1]); -#else - free (ptr); -#endif -} diff --git a/gst/ffmpegcolorspace/utils.c b/gst/ffmpegcolorspace/utils.c deleted file mode 100644 index 49d86e7..0000000 --- a/gst/ffmpegcolorspace/utils.c +++ /dev/null @@ -1,159 +0,0 @@ -/* - * utils for libavcodec - * Copyright (c) 2001 Fabrice Bellard. - * Copyright (c) 2003 Michel Bardiaux for the av_log API - * Copyright (c) 2002-2004 Michael Niedermayer - * - * This library 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 of the License, or (at your option) any later version. - * - * This library 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 this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/** - * @file utils.c - * utils. - */ - -#include "avcodec.h" -#include "dsputil.h" -#include -#include -#include -#include - -void * -av_mallocz (unsigned int size) -{ - void *ptr; - - ptr = av_malloc (size); - if (!ptr) - return NULL; - memset (ptr, 0, size); - return ptr; -} - -char * -av_strdup (const char *s) -{ - char *ptr; - int len; - - len = strlen (s) + 1; - ptr = av_malloc (len); - if (!ptr) - return NULL; - memcpy (ptr, s, len); - return ptr; -} - -/** - * realloc which does nothing if the block is large enough - */ -void * -av_fast_realloc (void *ptr, unsigned int *size, unsigned int min_size) -{ - if (min_size < *size) - return ptr; - - *size = 17 * min_size / 16 + 32; - - return av_realloc (ptr, *size); -} - - -static unsigned int last_static = 0; -static unsigned int allocated_static = 0; -static void **array_static = NULL; - -/** - * allocation of static arrays - do not use for normal allocation. - */ -void * -av_mallocz_static (unsigned int size) -{ - void *ptr = av_mallocz (size); - - if (ptr) { - array_static = - av_fast_realloc (array_static, &allocated_static, - sizeof (void *) * (last_static + 1)); - array_static[last_static++] = ptr; - } - - return ptr; -} - -/** - * free all static arrays and reset pointers to 0. - */ -void -av_free_static (void) -{ - while (last_static) { - av_freep (&array_static[--last_static]); - } - av_freep (&array_static); -} - -/** - * Frees memory and sets the pointer to NULL. - * @param arg pointer to the pointer which should be freed - */ -void -av_freep (void *arg) -{ - void **ptr = (void **) arg; - - av_free (*ptr); - *ptr = NULL; -} - -void -avcodec_get_context_defaults (AVCodecContext * s) -{ - memset (s, 0, sizeof (AVCodecContext)); - - s->frame_rate_base = 1; - s->frame_rate = 25; -} - -/** - * allocates a AVCodecContext and set it to defaults. - * this can be deallocated by simply calling free() - */ -AVCodecContext * -avcodec_alloc_context (void) -{ - AVCodecContext *avctx = av_malloc (sizeof (AVCodecContext)); - - if (avctx == NULL) - return NULL; - - avcodec_get_context_defaults (avctx); - - return avctx; -} - -/* must be called before any other functions */ -void -avcodec_init (void) -{ - static int inited = 0; - - if (inited != 0) - return; - inited = 1; - - dsputil_static_init (); -} diff --git a/gst/playback/gstplaysink.c b/gst/playback/gstplaysink.c index 8708699..5d31635 100644 --- a/gst/playback/gstplaysink.c +++ b/gst/playback/gstplaysink.c @@ -1116,13 +1116,13 @@ gen_video_deinterlace_chain (GstPlaySink * playsink) bin = GST_BIN_CAST (chain->chain.bin); gst_object_ref_sink (bin); - GST_DEBUG_OBJECT (playsink, "creating ffmpegcolorspace"); - chain->conv = gst_element_factory_make ("ffmpegcolorspace", "vdconv"); + GST_DEBUG_OBJECT (playsink, "creating videoconvert"); + chain->conv = gst_element_factory_make ("videoconvert", "vdconv"); if (chain->conv == NULL) { - post_missing_element_message (playsink, "ffmpegcolorspace"); + post_missing_element_message (playsink, "videoconvert"); GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN, (_("Missing element '%s' - check your GStreamer installation."), - "ffmpegcolorspace"), ("video rendering might fail")); + "videoconvert"), ("video rendering might fail")); } else { gst_bin_add (bin, chain->conv); head = chain->conv; -- 2.7.4