[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