1/* 2 * Copyright (C) 2001-2003 Michael Niedermayer <michaelni@gmx.at> 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21#ifndef SWSCALE_SWSCALE_INTERNAL_H 22#define SWSCALE_SWSCALE_INTERNAL_H 23 24#include "config.h" 25 26#if HAVE_ALTIVEC_H 27#include <altivec.h> 28#endif 29 30#include "libavutil/avutil.h" 31 32#define STR(s) AV_TOSTRING(s) //AV_STRINGIFY is too long 33 34#define MAX_FILTER_SIZE 256 35 36#define VOFW 2048 37#define VOF (VOFW*2) 38 39#ifdef WORDS_BIGENDIAN 40#define ALT32_CORR (-1) 41#else 42#define ALT32_CORR 1 43#endif 44 45#if ARCH_X86_64 46# define APCK_PTR2 8 47# define APCK_COEF 16 48# define APCK_SIZE 24 49#else 50# define APCK_PTR2 4 51# define APCK_COEF 8 52# define APCK_SIZE 16 53#endif 54 55struct SwsContext; 56 57typedef int (*SwsFunc)(struct SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY, 58 int srcSliceH, uint8_t* dst[], int dstStride[]); 59 60/* This struct should be aligned on at least a 32-byte boundary. */ 61typedef struct SwsContext{ 62 /** 63 * info on struct for av_log 64 */ 65 const AVClass *av_class; 66 67 /** 68 * Note that src, dst, srcStride, dstStride will be copied in the 69 * sws_scale() wrapper so they can be freely modified here. 70 */ 71 SwsFunc swScale; 72 int srcW, srcH, dstH; 73 int chrSrcW, chrSrcH, chrDstW, chrDstH; 74 int lumXInc, chrXInc; 75 int lumYInc, chrYInc; 76 enum PixelFormat dstFormat, srcFormat; ///< format 4:2:0 type is always YV12 77 int origDstFormat, origSrcFormat; ///< format 78 int chrSrcHSubSample, chrSrcVSubSample; 79 int chrIntHSubSample, chrIntVSubSample; 80 int chrDstHSubSample, chrDstVSubSample; 81 int vChrDrop; 82 int sliceDir; 83 double param[2]; 84 85 uint32_t pal_yuv[256]; 86 uint32_t pal_rgb[256]; 87 88 int16_t **lumPixBuf; 89 int16_t **chrPixBuf; 90 int16_t *hLumFilter; 91 int16_t *hLumFilterPos; 92 int16_t *hChrFilter; 93 int16_t *hChrFilterPos; 94 int16_t *vLumFilter; 95 int16_t *vLumFilterPos; 96 int16_t *vChrFilter; 97 int16_t *vChrFilterPos; 98 99 uint8_t formatConvBuffer[VOF]; //FIXME dynamic allocation, but we have to change a lot of code for this to be useful 100 101 int hLumFilterSize; 102 int hChrFilterSize; 103 int vLumFilterSize; 104 int vChrFilterSize; 105 int vLumBufSize; 106 int vChrBufSize; 107 108 uint8_t *funnyYCode; 109 uint8_t *funnyUVCode; 110 int32_t *lumMmx2FilterPos; 111 int32_t *chrMmx2FilterPos; 112 int16_t *lumMmx2Filter; 113 int16_t *chrMmx2Filter; 114 115 int canMMX2BeUsed; 116 117 int lastInLumBuf; 118 int lastInChrBuf; 119 int lumBufIndex; 120 int chrBufIndex; 121 int dstY; 122 int flags; 123 void * yuvTable; // pointer to the yuv->rgb table start so it can be freed() 124 uint8_t * table_rV[256]; 125 uint8_t * table_gU[256]; 126 int table_gV[256]; 127 uint8_t * table_bU[256]; 128 129 //Colorspace stuff 130 int contrast, brightness, saturation; // for sws_getColorspaceDetails 131 int srcColorspaceTable[4]; 132 int dstColorspaceTable[4]; 133 int srcRange, dstRange; 134 int yuv2rgb_y_offset; 135 int yuv2rgb_y_coeff; 136 int yuv2rgb_v2r_coeff; 137 int yuv2rgb_v2g_coeff; 138 int yuv2rgb_u2g_coeff; 139 int yuv2rgb_u2b_coeff; 140 141#define RED_DITHER "0*8" 142#define GREEN_DITHER "1*8" 143#define BLUE_DITHER "2*8" 144#define Y_COEFF "3*8" 145#define VR_COEFF "4*8" 146#define UB_COEFF "5*8" 147#define VG_COEFF "6*8" 148#define UG_COEFF "7*8" 149#define Y_OFFSET "8*8" 150#define U_OFFSET "9*8" 151#define V_OFFSET "10*8" 152#define LUM_MMX_FILTER_OFFSET "11*8" 153#define CHR_MMX_FILTER_OFFSET "11*8+4*4*256" 154#define DSTW_OFFSET "11*8+4*4*256*2" //do not change, it is hardcoded in the ASM 155#define ESP_OFFSET "11*8+4*4*256*2+8" 156#define VROUNDER_OFFSET "11*8+4*4*256*2+16" 157#define U_TEMP "11*8+4*4*256*2+24" 158#define V_TEMP "11*8+4*4*256*2+32" 159 160 uint64_t redDither __attribute__((aligned(8))); 161 uint64_t greenDither __attribute__((aligned(8))); 162 uint64_t blueDither __attribute__((aligned(8))); 163 164 uint64_t yCoeff __attribute__((aligned(8))); 165 uint64_t vrCoeff __attribute__((aligned(8))); 166 uint64_t ubCoeff __attribute__((aligned(8))); 167 uint64_t vgCoeff __attribute__((aligned(8))); 168 uint64_t ugCoeff __attribute__((aligned(8))); 169 uint64_t yOffset __attribute__((aligned(8))); 170 uint64_t uOffset __attribute__((aligned(8))); 171 uint64_t vOffset __attribute__((aligned(8))); 172 int32_t lumMmxFilter[4*MAX_FILTER_SIZE]; 173 int32_t chrMmxFilter[4*MAX_FILTER_SIZE]; 174 int dstW; 175 uint64_t esp __attribute__((aligned(8))); 176 uint64_t vRounder __attribute__((aligned(8))); 177 uint64_t u_temp __attribute__((aligned(8))); 178 uint64_t v_temp __attribute__((aligned(8))); 179 180#if HAVE_ALTIVEC 181 182 vector signed short CY; 183 vector signed short CRV; 184 vector signed short CBU; 185 vector signed short CGU; 186 vector signed short CGV; 187 vector signed short OY; 188 vector unsigned short CSHIFT; 189 vector signed short *vYCoeffsBank, *vCCoeffsBank; 190 191#endif 192 193 194#if ARCH_BFIN 195 uint32_t oy __attribute__((aligned(4))); 196 uint32_t oc __attribute__((aligned(4))); 197 uint32_t zero __attribute__((aligned(4))); 198 uint32_t cy __attribute__((aligned(4))); 199 uint32_t crv __attribute__((aligned(4))); 200 uint32_t rmask __attribute__((aligned(4))); 201 uint32_t cbu __attribute__((aligned(4))); 202 uint32_t bmask __attribute__((aligned(4))); 203 uint32_t cgu __attribute__((aligned(4))); 204 uint32_t cgv __attribute__((aligned(4))); 205 uint32_t gmask __attribute__((aligned(4))); 206#endif 207 208#if HAVE_VIS 209 uint64_t sparc_coeffs[10] __attribute__((aligned(8))); 210#endif 211 212} SwsContext; 213//FIXME check init (where 0) 214 215SwsFunc sws_yuv2rgb_get_func_ptr (SwsContext *c); 216int sws_yuv2rgb_c_init_tables (SwsContext *c, const int inv_table[4], int fullRange, int brightness, int contrast, int saturation); 217 218void sws_yuv2rgb_altivec_init_tables (SwsContext *c, const int inv_table[4],int brightness,int contrast, int saturation); 219SwsFunc sws_yuv2rgb_init_altivec (SwsContext *c); 220void altivec_yuv2packedX (SwsContext *c, 221 int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, 222 int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, 223 uint8_t *dest, int dstW, int dstY); 224 225const char *sws_format_name(int format); 226 227//FIXME replace this with something faster 228#define isPlanarYUV(x) ( \ 229 (x)==PIX_FMT_YUV410P \ 230 || (x)==PIX_FMT_YUV420P \ 231 || (x)==PIX_FMT_YUV411P \ 232 || (x)==PIX_FMT_YUV422P \ 233 || (x)==PIX_FMT_YUV444P \ 234 || (x)==PIX_FMT_YUV440P \ 235 || (x)==PIX_FMT_NV12 \ 236 || (x)==PIX_FMT_NV21 \ 237 ) 238#define isYUV(x) ( \ 239 (x)==PIX_FMT_UYVY422 \ 240 || (x)==PIX_FMT_YUYV422 \ 241 || isPlanarYUV(x) \ 242 ) 243#define isGray(x) ( \ 244 (x)==PIX_FMT_GRAY8 \ 245 || (x)==PIX_FMT_GRAY16BE \ 246 || (x)==PIX_FMT_GRAY16LE \ 247 ) 248#define isGray16(x) ( \ 249 (x)==PIX_FMT_GRAY16BE \ 250 || (x)==PIX_FMT_GRAY16LE \ 251 ) 252#define isRGB(x) ( \ 253 (x)==PIX_FMT_RGB32 \ 254 || (x)==PIX_FMT_RGB32_1 \ 255 || (x)==PIX_FMT_RGB24 \ 256 || (x)==PIX_FMT_RGB565 \ 257 || (x)==PIX_FMT_RGB555 \ 258 || (x)==PIX_FMT_RGB8 \ 259 || (x)==PIX_FMT_RGB4 \ 260 || (x)==PIX_FMT_RGB4_BYTE \ 261 || (x)==PIX_FMT_MONOBLACK \ 262 || (x)==PIX_FMT_MONOWHITE \ 263 ) 264#define isBGR(x) ( \ 265 (x)==PIX_FMT_BGR32 \ 266 || (x)==PIX_FMT_BGR32_1 \ 267 || (x)==PIX_FMT_BGR24 \ 268 || (x)==PIX_FMT_BGR565 \ 269 || (x)==PIX_FMT_BGR555 \ 270 || (x)==PIX_FMT_BGR8 \ 271 || (x)==PIX_FMT_BGR4 \ 272 || (x)==PIX_FMT_BGR4_BYTE \ 273 || (x)==PIX_FMT_MONOBLACK \ 274 || (x)==PIX_FMT_MONOWHITE \ 275 ) 276#define isALPHA(x) ( \ 277 (x)==PIX_FMT_BGR32 \ 278 || (x)==PIX_FMT_BGR32_1 \ 279 || (x)==PIX_FMT_RGB32 \ 280 || (x)==PIX_FMT_RGB32_1 \ 281 || (x)==PIX_FMT_YUVA420P \ 282 ) 283 284static inline int fmt_depth(int fmt) 285{ 286 switch(fmt) { 287 case PIX_FMT_BGRA: 288 case PIX_FMT_ABGR: 289 case PIX_FMT_RGBA: 290 case PIX_FMT_ARGB: 291 return 32; 292 case PIX_FMT_BGR24: 293 case PIX_FMT_RGB24: 294 return 24; 295 case PIX_FMT_BGR565: 296 case PIX_FMT_RGB565: 297 case PIX_FMT_GRAY16BE: 298 case PIX_FMT_GRAY16LE: 299 return 16; 300 case PIX_FMT_BGR555: 301 case PIX_FMT_RGB555: 302 return 15; 303 case PIX_FMT_BGR8: 304 case PIX_FMT_RGB8: 305 return 8; 306 case PIX_FMT_BGR4: 307 case PIX_FMT_RGB4: 308 case PIX_FMT_BGR4_BYTE: 309 case PIX_FMT_RGB4_BYTE: 310 return 4; 311 case PIX_FMT_MONOBLACK: 312 case PIX_FMT_MONOWHITE: 313 return 1; 314 default: 315 return 0; 316 } 317} 318 319extern const uint64_t ff_dither4[2]; 320extern const uint64_t ff_dither8[2]; 321 322extern const AVClass sws_context_class; 323 324#endif /* SWSCALE_SWSCALE_INTERNAL_H */ 325