[Ffmpeg-devel] swscale patch
Michael Niedermayer
michaelni
Fri Jun 30 21:05:33 CEST 2006
Hi
On Fri, Jun 30, 2006 at 08:15:53PM +0200, Luca Abeni wrote:
> Hi all,
>
> I think we are finally ready to apply swscale.diff (the swscale patch
> needed to compile it in ffmpeg). I attach an updated version of the
> patch (swscale-newer.diff) and a second patch (mplayer-sws-part2.diff)
> needed to compile mplayer after modifying swscale.
>
> swscale-newer.diff is basically identical to the version of swscale.diff
> that has been reviewed some time ago.
>
>
> Luca
>
> Index: swscaler_glue.c
> ===================================================================
> --- swscaler_glue.c (revision 0)
> +++ swscaler_glue.c (revision 0)
> @@ -0,0 +1,53 @@
> +#include "config.h"
> +#include "swsutil.h"
> +#include "swscale.h"
> +#include "img_format.h"
> +
> +void *(*sws_malloc)(unsigned int size);
> +void (*sws_free)(void *ptr);
> +void (*sws_log)(void*, int level, const char *fmt, ...);
> +
> +void sws_global_init(void *(*alloc)(unsigned int size),
> + void (*free)(void *ptr), void (*log)(void*, int level, const char *fmt, ...))
> +{
> + sws_malloc = alloc;
> + sws_free = free;
> + sws_log = log;
> +}
hmm, this is called just from one spot, in sws_init() is there any sense in
this double layer init?
> +
> +/* Used for ffmpeg --> MPlayer format name conversion */
> +static int fmt_name[PIX_FMT_NB] = {
static -> static const
> + [PIX_FMT_YUV420P] = IMGFMT_I420, ///< Planar YUV 4:2:0 (1 Cr & Cb sample per 2x2 Y samples)
> + [PIX_FMT_YUV422] = IMGFMT_Y422,
> + [PIX_FMT_RGB24] = IMGFMT_RGB24, ///< Packed pixel, 3 bytes per pixel, RGBRGB...
> + [PIX_FMT_BGR24] = IMGFMT_BGR24, ///< Packed pixel, 3 bytes per pixel, BGRBGR...
> + [PIX_FMT_YUV422P] = IMGFMT_422P, ///< Planar YUV 4:2:2 (1 Cr & Cb sample per 2x1 Y samples)
> + [PIX_FMT_YUV444P] = IMGFMT_444P, ///< Planar YUV 4:4:4 (1 Cr & Cb sample per 1x1 Y samples)
> + [PIX_FMT_RGBA32] = IMGFMT_RGB32, ///< Packed pixel, 4 bytes per pixel, BGRABGRA..., stored in cpu endianness
> + [PIX_FMT_YUV410P] = IMGFMT_YVU9, ///< Planar YUV 4:1:0 (1 Cr & Cb sample per 4x4 Y samples)
> + [PIX_FMT_YUV411P] = IMGFMT_411P, ///< Planar YUV 4:1:1 (1 Cr & Cb sample per 4x1 Y samples)
> + [PIX_FMT_RGB565] = IMGFMT_RGB16, ///< always stored in cpu endianness
> + [PIX_FMT_RGB555] = IMGFMT_RGB15, ///< always stored in cpu endianness, most significant bit to 1
> + [PIX_FMT_UYVY422] = IMGFMT_UYVY, ///< Packed pixel, Cb Y0 Cr Y1
> +};
> +
> +int sws_pixel_format(enum PixelFormat fmt)
hmm not so good name, what about sws_ff2mp_pixfmt() or a longer one
[...]
> +char *sws_format_name(int format)
> +{
> + static char fmt_name[64];
> + char *res;
> + static int buffer;
> +
> + res = fmt_name + buffer * 32;
> + buffer = 1 - buffer;
> + snprintf(res, 32, "0x%x (%c%c%c%c)", format,
> + format >> 24, (format >> 16) & 0xFF,
> + (format >> 8) & 0xFF,
> + format & 0xFF);
> +
this isnt thread safe
[...]
> - if(c->yuvTable) free(c->yuvTable);
> + if(c->yuvTable) sws_free(c->yuvTable);
IMO sws_free(NULL) should be supported so that these checks arent needed
[...]
> ===================================================================
> --- swscale.h (revision 18866)
> +++ swscale.h (working copy)
> @@ -18,7 +18,7 @@
>
> #ifndef SWSCALE_H
> #define SWSCALE_H
> -
> +#include <stdint.h>
why?
[...]
> Index: mangle.h
> ===================================================================
> --- mangle.h (revision 0)
> +++ mangle.h (revision 0)
> @@ -0,0 +1,19 @@
> +/* mangle.h - This file has some CPP macros to deal with different symbol
> + * mangling across binary formats.
> + * (c)2002 by Felix Buenemann <atmosfear at users.sourceforge.net>
> + * File licensed under the GPL, see http://www.fsf.org/ for more info.
^^^
this isnt used without --enable-gpl ?
[...]
> Index: img_format.h
> ===================================================================
> --- img_format.h (revision 0)
> +++ img_format.h (revision 0)
> @@ -0,0 +1,109 @@
> +#ifndef __IMG_FORMAT_H
> +#define __IMG_FORMAT_H
> +
> +/* RGB/BGR Formats */
> +
> +#define IMGFMT_RGB_MASK 0xFFFFFF00
> +#define IMGFMT_RGB (('R'<<24)|('G'<<16)|('B'<<8))
> +#define IMGFMT_RGB1 (IMGFMT_RGB|1)
> +#define IMGFMT_RGB4 (IMGFMT_RGB|4)
> +#define IMGFMT_RGB4_CHAR (IMGFMT_RGB|4|128) // RGB4 with 1 pixel per byte
> +#define IMGFMT_RGB8 (IMGFMT_RGB|8)
> +#define IMGFMT_RGB15 (IMGFMT_RGB|15)
> +#define IMGFMT_RGB16 (IMGFMT_RGB|16)
> +#define IMGFMT_RGB24 (IMGFMT_RGB|24)
> +#define IMGFMT_RGB32 (IMGFMT_RGB|32)
> +
> +#define IMGFMT_BGR_MASK 0xFFFFFF00
> +#define IMGFMT_BGR (('B'<<24)|('G'<<16)|('R'<<8))
> +#define IMGFMT_BGR1 (IMGFMT_BGR|1)
> +#define IMGFMT_BGR4 (IMGFMT_BGR|4)
> +#define IMGFMT_BGR4_CHAR (IMGFMT_BGR|4|128) // BGR4 with 1 pixel per byte
> +#define IMGFMT_BGR8 (IMGFMT_BGR|8)
> +#define IMGFMT_BGR15 (IMGFMT_BGR|15)
> +#define IMGFMT_BGR16 (IMGFMT_BGR|16)
> +#define IMGFMT_BGR24 (IMGFMT_BGR|24)
> +#define IMGFMT_BGR32 (IMGFMT_BGR|32)
> +
> +#ifdef WORDS_BIGENDIAN
> +#define IMGFMT_ABGR IMGFMT_RGB32
> +#define IMGFMT_BGRA (IMGFMT_RGB32|64)
> +#define IMGFMT_ARGB IMGFMT_BGR32
> +#define IMGFMT_RGBA (IMGFMT_BGR32|64)
> +#else
> +#define IMGFMT_ABGR (IMGFMT_BGR32|64)
> +#define IMGFMT_BGRA IMGFMT_BGR32
> +#define IMGFMT_ARGB (IMGFMT_RGB32|64)
> +#define IMGFMT_RGBA IMGFMT_RGB32
> +#endif
> +
> +/* old names for compatibility */
> +#define IMGFMT_RG4B IMGFMT_RGB4_CHAR
> +#define IMGFMT_BG4B IMGFMT_BGR4_CHAR
> +
> +#define IMGFMT_IS_RGB(fmt) (((fmt)&IMGFMT_RGB_MASK)==IMGFMT_RGB)
> +#define IMGFMT_IS_BGR(fmt) (((fmt)&IMGFMT_BGR_MASK)==IMGFMT_BGR)
> +
> +#define IMGFMT_RGB_DEPTH(fmt) ((fmt)&0x3F)
> +#define IMGFMT_BGR_DEPTH(fmt) ((fmt)&0x3F)
> +
> +
> +/* Planar YUV Formats */
> +
> +#define IMGFMT_YVU9 0x39555659
> +#define IMGFMT_IF09 0x39304649
> +#define IMGFMT_YV12 0x32315659
> +#define IMGFMT_I420 0x30323449
> +#define IMGFMT_IYUV 0x56555949
> +#define IMGFMT_CLPL 0x4C504C43
> +#define IMGFMT_Y800 0x30303859
> +#define IMGFMT_Y8 0x20203859
> +#define IMGFMT_NV12 0x3231564E
> +#define IMGFMT_NV21 0x3132564E
> +
> +/* unofficial Planar Formats, FIXME if official 4CC exists */
> +#define IMGFMT_444P 0x50343434
> +#define IMGFMT_422P 0x50323234
> +#define IMGFMT_411P 0x50313134
> +#define IMGFMT_HM12 0x32314D48
> +
> +/* Packed YUV Formats */
> +
> +#define IMGFMT_IUYV 0x56595549
> +#define IMGFMT_IY41 0x31435949
> +#define IMGFMT_IYU1 0x31555949
> +#define IMGFMT_IYU2 0x32555949
> +#define IMGFMT_UYVY 0x59565955
> +#define IMGFMT_UYNV 0x564E5955
> +#define IMGFMT_cyuv 0x76757963
> +#define IMGFMT_Y422 0x32323459
> +#define IMGFMT_YUY2 0x32595559
> +#define IMGFMT_YUNV 0x564E5559
> +#define IMGFMT_YVYU 0x55595659
> +#define IMGFMT_Y41P 0x50313459
> +#define IMGFMT_Y211 0x31313259
> +#define IMGFMT_Y41T 0x54313459
> +#define IMGFMT_Y42T 0x54323459
> +#define IMGFMT_V422 0x32323456
> +#define IMGFMT_V655 0x35353656
> +#define IMGFMT_CLJR 0x524A4C43
> +#define IMGFMT_YUVP 0x50565559
> +#define IMGFMT_UYVP 0x50565955
> +
> +/* Compressed Formats */
> +#define IMGFMT_MPEGPES (('M'<<24)|('P'<<16)|('E'<<8)|('S'))
> +/* Formats that are understood by zoran chips, we include
> + * non-interlaced, interlaced top-first, interlaced bottom-first */
> +#define IMGFMT_ZRMJPEGNI (('Z'<<24)|('R'<<16)|('N'<<8)|('I'))
> +#define IMGFMT_ZRMJPEGIT (('Z'<<24)|('R'<<16)|('I'<<8)|('T'))
> +#define IMGFMT_ZRMJPEGIB (('Z'<<24)|('R'<<16)|('I'<<8)|('B'))
> +
> +// I think that this code could not be used by any other codec/format
> +#define IMGFMT_XVMC 0x1DC70000
> +#define IMGFMT_XVMC_MASK 0xFFFF0000
> +#define IMGFMT_IS_XVMC(fmt) (((fmt)&IMGFMT_XVMC_MASK)==IMGFMT_XVMC)
> +//these are chroma420
> +#define IMGFMT_XVMC_MOCO_MPEG2 (IMGFMT_XVMC|0x02)
> +#define IMGFMT_XVMC_IDCT_MPEG2 (IMGFMT_XVMC|0x82)
> +
> +#endif
just to make sure ... this is a temporary solution and not intended to stay?
furthermore, can this file be checked out as external instead of being
duplicated?
[...]
> Index: rgb2rgb.h
> ===================================================================
> --- rgb2rgb.h (revision 18866)
> +++ rgb2rgb.h (working copy)
> @@ -125,20 +125,6 @@
> long srcStride3, long dstStride);
>
>
> -#define MODE_RGB 0x1
> -#define MODE_BGR 0x2
> -
> -static void yuv2rgb(uint8_t * image, uint8_t * py,
> - uint8_t * pu, uint8_t * pv,
> - unsigned h_size, unsigned v_size,
> - int rgb_stride, int y_stride, int uv_stride){
> -printf("broken, this should use the swscaler\n");
> -}
> -
> -static void yuv2rgb_init (unsigned bpp, int mode){
> -printf("broken, this should use the swscaler\n");
> -}
> -
> void sws_rgb2rgb_init(int flags);
>
> #endif
does this depend on the rest? if no apply it!
[...]
> Index: cpu.h
> ===================================================================
> --- cpu.h (revision 0)
> +++ cpu.h (revision 0)
> @@ -0,0 +1,34 @@
> +#ifndef __SWS_CPU_H__
> +#define __SWS_CPU_H__
> +
> +#ifdef ARCH_X86_64
> +# define REG_a "rax"
> +# define REG_b "rbx"
> +# define REG_c "rcx"
> +# define REG_d "rdx"
> +# define REG_D "rdi"
> +# define REG_S "rsi"
> +# define PTR_SIZE "8"
> +# define REGa rax
> +# define REGb rbx
> +# define REGSP rsp
> +# define REG_SP "rsp"
> +# define REG_BP "rbp"
> +# define REGBP rbp
> +#else
> +# define REG_a "eax"
> +# define REG_b "ebx"
> +# define REG_c "ecx"
> +# define REG_d "edx"
> +# define REG_D "edi"
> +# define REG_S "esi"
> +# define PTR_SIZE "4"
> +# define REGa eax
> +# define REGb ebx
> +# define REGSP esp
> +# define REG_SP "esp"
> +# define REG_BP "ebp"
> +# define REGBP ebp
> +#endif
> +
> +#endif /* __SWS_CPU_H__ */
>
one day this needs to be cleaned up and put in a single place per project ...
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
In the past you could go to a library and read, borrow or copy any book
Today you'd get arrested for mere telling someone where the library is
More information about the ffmpeg-devel
mailing list