FFmpeg
1.2.4
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libswscale
swscale_internal.h
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2001-2011 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/avassert.h"
31
#include "libavutil/avutil.h"
32
#include "libavutil/common.h"
33
#include "libavutil/intreadwrite.h"
34
#include "libavutil/log.h"
35
#include "libavutil/pixfmt.h"
36
#include "libavutil/pixdesc.h"
37
38
#define STR(s) AV_TOSTRING(s) // AV_STRINGIFY is too long
39
40
#define YUVRGB_TABLE_HEADROOM 128
41
42
#define FAST_BGR2YV12 // use 7-bit instead of 15-bit coefficients
43
44
#define MAX_FILTER_SIZE 256
45
46
#define DITHER1XBPP
47
48
#if HAVE_BIGENDIAN
49
#define ALT32_CORR (-1)
50
#else
51
#define ALT32_CORR 1
52
#endif
53
54
#if ARCH_X86_64
55
# define APCK_PTR2 8
56
# define APCK_COEF 16
57
# define APCK_SIZE 24
58
#else
59
# define APCK_PTR2 4
60
# define APCK_COEF 8
61
# define APCK_SIZE 16
62
#endif
63
64
struct
SwsContext
;
65
66
typedef
int (*
SwsFunc
)(
struct
SwsContext
*context,
const
uint8_t
*src[],
67
int
srcStride[],
int
srcSliceY,
int
srcSliceH,
68
uint8_t
*
dst
[],
int
dstStride[]);
69
82
typedef
void
(*
yuv2planar1_fn
)(
const
int16_t *src,
uint8_t
*dest,
int
dstW
,
83
const
uint8_t
*
dither
,
int
offset
);
84
98
typedef
void
(*
yuv2planarX_fn
)(
const
int16_t *
filter
,
int
filterSize,
99
const
int16_t **src,
uint8_t
*dest,
int
dstW
,
100
const
uint8_t
*
dither
,
int
offset
);
101
117
typedef
void
(*
yuv2interleavedX_fn
)(
struct
SwsContext
*
c
,
118
const
int16_t *chrFilter,
119
int
chrFilterSize,
120
const
int16_t **chrUSrc,
121
const
int16_t **chrVSrc,
122
uint8_t
*dest,
int
dstW
);
123
153
typedef
void
(*
yuv2packed1_fn
)(
struct
SwsContext
*
c
,
const
int16_t *lumSrc,
154
const
int16_t *chrUSrc[2],
155
const
int16_t *chrVSrc[2],
156
const
int16_t *alpSrc,
uint8_t
*dest,
157
int
dstW
,
int
uvalpha,
int
y
);
186
typedef
void
(*
yuv2packed2_fn
)(
struct
SwsContext
*
c
,
const
int16_t *lumSrc[2],
187
const
int16_t *chrUSrc[2],
188
const
int16_t *chrVSrc[2],
189
const
int16_t *alpSrc[2],
190
uint8_t
*dest,
191
int
dstW
,
int
yalpha,
int
uvalpha,
int
y
);
218
typedef
void
(*
yuv2packedX_fn
)(
struct
SwsContext
*
c
,
const
int16_t *lumFilter,
219
const
int16_t **lumSrc,
int
lumFilterSize,
220
const
int16_t *chrFilter,
221
const
int16_t **chrUSrc,
222
const
int16_t **chrVSrc,
int
chrFilterSize,
223
const
int16_t **alpSrc,
uint8_t
*dest,
224
int
dstW
,
int
y
);
225
252
typedef
void
(*
yuv2anyX_fn
)(
struct
SwsContext
*
c
,
const
int16_t *lumFilter,
253
const
int16_t **lumSrc,
int
lumFilterSize,
254
const
int16_t *chrFilter,
255
const
int16_t **chrUSrc,
256
const
int16_t **chrVSrc,
int
chrFilterSize,
257
const
int16_t **alpSrc,
uint8_t
**dest,
258
int
dstW
,
int
y
);
259
260
/* This struct should be aligned on at least a 32-byte boundary. */
261
typedef
struct
SwsContext
{
265
const
AVClass
*
av_class
;
266
271
SwsFunc
swScale
;
272
int
srcW
;
273
int
srcH
;
274
int
dstH
;
275
int
chrSrcW
;
276
int
chrSrcH
;
277
int
chrDstW
;
278
int
chrDstH
;
279
int
lumXInc
,
chrXInc
;
280
int
lumYInc
,
chrYInc
;
281
enum
AVPixelFormat
dstFormat
;
282
enum
AVPixelFormat
srcFormat
;
283
int
dstFormatBpp
;
284
int
srcFormatBpp
;
285
int
dstBpc
,
srcBpc
;
286
int
chrSrcHSubSample
;
287
int
chrSrcVSubSample
;
288
int
chrDstHSubSample
;
289
int
chrDstVSubSample
;
290
int
vChrDrop
;
291
int
sliceDir
;
292
double
param
[2];
293
294
uint32_t
pal_yuv
[256];
295
uint32_t
pal_rgb
[256];
296
307
int16_t **
lumPixBuf
;
308
int16_t **
chrUPixBuf
;
309
int16_t **
chrVPixBuf
;
310
int16_t **
alpPixBuf
;
311
int
vLumBufSize
;
312
int
vChrBufSize
;
313
int
lastInLumBuf
;
314
int
lastInChrBuf
;
315
int
lumBufIndex
;
316
int
chrBufIndex
;
317
318
319
uint8_t
*
formatConvBuffer
;
320
335
int16_t *
hLumFilter
;
336
int16_t *
hChrFilter
;
337
int16_t *
vLumFilter
;
338
int16_t *
vChrFilter
;
339
int32_t
*
hLumFilterPos
;
340
int32_t
*
hChrFilterPos
;
341
int32_t
*
vLumFilterPos
;
342
int32_t
*
vChrFilterPos
;
343
int
hLumFilterSize
;
344
int
hChrFilterSize
;
345
int
vLumFilterSize
;
346
int
vChrFilterSize
;
347
348
349
int
lumMmxextFilterCodeSize
;
350
int
chrMmxextFilterCodeSize
;
351
uint8_t
*
lumMmxextFilterCode
;
352
uint8_t
*
chrMmxextFilterCode
;
353
354
int
canMMXEXTBeUsed
;
355
356
int
dstY
;
357
int
flags
;
358
void
*
yuvTable
;
// pointer to the yuv->rgb table start so it can be freed()
359
uint8_t
*
table_rV
[256 + 2*
YUVRGB_TABLE_HEADROOM
];
360
uint8_t
*
table_gU
[256 + 2*
YUVRGB_TABLE_HEADROOM
];
361
int
table_gV
[256 + 2*
YUVRGB_TABLE_HEADROOM
];
362
uint8_t
*
table_bU
[256 + 2*
YUVRGB_TABLE_HEADROOM
];
363
364
int
*
dither_error
[4];
365
366
//Colorspace stuff
367
int
contrast
,
brightness
,
saturation
;
// for sws_getColorspaceDetails
368
int
srcColorspaceTable
[4];
369
int
dstColorspaceTable
[4];
370
int
srcRange
;
371
int
dstRange
;
372
int
src0Alpha
;
373
int
dst0Alpha
;
374
int
yuv2rgb_y_offset
;
375
int
yuv2rgb_y_coeff
;
376
int
yuv2rgb_v2r_coeff
;
377
int
yuv2rgb_v2g_coeff
;
378
int
yuv2rgb_u2g_coeff
;
379
int
yuv2rgb_u2b_coeff
;
380
381
#define RED_DITHER "0*8"
382
#define GREEN_DITHER "1*8"
383
#define BLUE_DITHER "2*8"
384
#define Y_COEFF "3*8"
385
#define VR_COEFF "4*8"
386
#define UB_COEFF "5*8"
387
#define VG_COEFF "6*8"
388
#define UG_COEFF "7*8"
389
#define Y_OFFSET "8*8"
390
#define U_OFFSET "9*8"
391
#define V_OFFSET "10*8"
392
#define LUM_MMX_FILTER_OFFSET "11*8"
393
#define CHR_MMX_FILTER_OFFSET "11*8+4*4*256"
394
#define DSTW_OFFSET "11*8+4*4*256*2" //do not change, it is hardcoded in the ASM
395
#define ESP_OFFSET "11*8+4*4*256*2+8"
396
#define VROUNDER_OFFSET "11*8+4*4*256*2+16"
397
#define U_TEMP "11*8+4*4*256*2+24"
398
#define V_TEMP "11*8+4*4*256*2+32"
399
#define Y_TEMP "11*8+4*4*256*2+40"
400
#define ALP_MMX_FILTER_OFFSET "11*8+4*4*256*2+48"
401
#define UV_OFF_PX "11*8+4*4*256*3+48"
402
#define UV_OFF_BYTE "11*8+4*4*256*3+56"
403
#define DITHER16 "11*8+4*4*256*3+64"
404
#define DITHER32 "11*8+4*4*256*3+80"
405
406
DECLARE_ALIGNED
(8, uint64_t,
redDither
);
407
DECLARE_ALIGNED
(8, uint64_t,
greenDither
);
408
DECLARE_ALIGNED
(8, uint64_t,
blueDither
);
409
410
DECLARE_ALIGNED
(8, uint64_t,
yCoeff
);
411
DECLARE_ALIGNED
(8, uint64_t,
vrCoeff
);
412
DECLARE_ALIGNED
(8, uint64_t,
ubCoeff
);
413
DECLARE_ALIGNED
(8, uint64_t,
vgCoeff
);
414
DECLARE_ALIGNED
(8, uint64_t,
ugCoeff
);
415
DECLARE_ALIGNED
(8, uint64_t,
yOffset
);
416
DECLARE_ALIGNED
(8, uint64_t,
uOffset
);
417
DECLARE_ALIGNED
(8, uint64_t,
vOffset
);
418
int32_t
lumMmxFilter
[4 *
MAX_FILTER_SIZE
];
419
int32_t
chrMmxFilter
[4 *
MAX_FILTER_SIZE
];
420
int
dstW
;
421
DECLARE_ALIGNED
(8, uint64_t,
esp
);
422
DECLARE_ALIGNED
(8, uint64_t,
vRounder
);
423
DECLARE_ALIGNED
(8, uint64_t,
u_temp
);
424
DECLARE_ALIGNED
(8, uint64_t,
v_temp
);
425
DECLARE_ALIGNED
(8, uint64_t,
y_temp
);
426
int32_t
alpMmxFilter
[4 *
MAX_FILTER_SIZE
];
427
// alignment of these values is not necessary, but merely here
428
// to maintain the same offset across x8632 and x86-64. Once we
429
// use proper offset macros in the asm, they can be removed.
430
DECLARE_ALIGNED
(8, ptrdiff_t,
uv_off
);
431
DECLARE_ALIGNED
(8, ptrdiff_t,
uv_offx2
);
432
DECLARE_ALIGNED
(8, uint16_t,
dither16
)[8];
433
DECLARE_ALIGNED
(8, uint32_t,
dither32
)[8];
434
435
const
uint8_t
*
chrDither8
, *
lumDither8
;
436
437
#if HAVE_ALTIVEC
438
vector
signed
short
CY;
439
vector
signed
short
CRV;
440
vector
signed
short
CBU;
441
vector
signed
short
CGU;
442
vector
signed
short
CGV;
443
vector
signed
short
OY;
444
vector
unsigned
short
CSHIFT
;
445
vector
signed
short
*vYCoeffsBank, *vCCoeffsBank;
446
#endif
447
448
#if ARCH_BFIN
449
DECLARE_ALIGNED
(4, uint32_t, oy);
450
DECLARE_ALIGNED
(4, uint32_t, oc);
451
DECLARE_ALIGNED
(4, uint32_t,
zero
);
452
DECLARE_ALIGNED
(4, uint32_t, cy);
453
DECLARE_ALIGNED
(4, uint32_t, crv);
454
DECLARE_ALIGNED
(4, uint32_t, rmask);
455
DECLARE_ALIGNED
(4, uint32_t, cbu);
456
DECLARE_ALIGNED
(4, uint32_t, bmask);
457
DECLARE_ALIGNED
(4, uint32_t, cgu);
458
DECLARE_ALIGNED
(4, uint32_t, cgv);
459
DECLARE_ALIGNED
(4, uint32_t, gmask);
460
#endif
461
462
#if HAVE_VIS
463
DECLARE_ALIGNED
(8, uint64_t, sparc_coeffs)[10];
464
#endif
465
int
use_mmx_vfilter
;
466
467
/* function pointers for swScale() */
468
yuv2planar1_fn
yuv2plane1
;
469
yuv2planarX_fn
yuv2planeX
;
470
yuv2interleavedX_fn
yuv2nv12cX
;
471
yuv2packed1_fn
yuv2packed1
;
472
yuv2packed2_fn
yuv2packed2
;
473
yuv2packedX_fn
yuv2packedX
;
474
yuv2anyX_fn
yuv2anyX
;
475
477
void
(*
lumToYV12
)(
uint8_t
*
dst
,
const
uint8_t
*src,
const
uint8_t
*src2,
const
uint8_t
*src3,
478
int
width
, uint32_t *pal);
480
void
(*
alpToYV12
)(
uint8_t
*
dst
,
const
uint8_t
*src,
const
uint8_t
*src2,
const
uint8_t
*src3,
481
int
width
, uint32_t *pal);
483
void
(*
chrToYV12
)(
uint8_t
*dstU,
uint8_t
*dstV,
484
const
uint8_t
*src1,
const
uint8_t
*src2,
const
uint8_t
*src3,
485
int
width
, uint32_t *pal);
486
492
void
(*
readLumPlanar
)(
uint8_t
*
dst
,
const
uint8_t
*src[4],
int
width
);
493
void
(*
readChrPlanar
)(
uint8_t
*dstU,
uint8_t
*dstV,
const
uint8_t
*src[4],
494
int
width
);
516
void
(*
hyscale_fast
)(
struct
SwsContext
*
c
,
517
int16_t *
dst
,
int
dstWidth,
518
const
uint8_t
*src,
int
srcW
,
int
xInc);
519
void
(*
hcscale_fast
)(
struct
SwsContext
*
c
,
520
int16_t *dst1, int16_t *dst2,
int
dstWidth,
521
const
uint8_t
*src1,
const
uint8_t
*src2,
522
int
srcW
,
int
xInc);
556
void
(*
hyScale
)(
struct
SwsContext
*
c
, int16_t *
dst
,
int
dstW
,
557
const
uint8_t
*src,
const
int16_t *
filter
,
558
const
int32_t
*filterPos,
int
filterSize);
559
void
(*
hcScale
)(
struct
SwsContext
*
c
, int16_t *
dst
,
int
dstW
,
560
const
uint8_t
*src,
const
int16_t *
filter
,
561
const
int32_t
*filterPos,
int
filterSize);
564
565
void
(*
lumConvertRange
)(int16_t *
dst
,
int
width
);
567
void
(*
chrConvertRange
)(int16_t *dst1, int16_t *dst2,
int
width
);
568
569
int
needs_hcscale
;
570
}
SwsContext
;
571
//FIXME check init (where 0)
572
573
SwsFunc
ff_yuv2rgb_get_func_ptr
(
SwsContext
*c);
574
int
ff_yuv2rgb_c_init_tables
(
SwsContext
*c,
const
int
inv_table[4],
575
int
fullRange,
int
brightness
,
576
int
contrast
,
int
saturation
);
577
578
void
ff_yuv2rgb_init_tables_altivec
(
SwsContext
*c,
const
int
inv_table[4],
579
int
brightness
,
int
contrast
,
int
saturation
);
580
void
updateMMXDitherTables
(
SwsContext
*c,
int
dstY
,
int
lumBufIndex
,
int
chrBufIndex
,
581
int
lastInLumBuf
,
int
lastInChrBuf
);
582
583
SwsFunc
ff_yuv2rgb_init_mmx
(
SwsContext
*c);
584
SwsFunc
ff_yuv2rgb_init_vis
(
SwsContext
*c);
585
SwsFunc
ff_yuv2rgb_init_altivec
(
SwsContext
*c);
586
SwsFunc
ff_yuv2rgb_get_func_ptr_bfin
(
SwsContext
*c);
587
void
ff_bfin_get_unscaled_swscale
(
SwsContext
*c);
588
589
#if FF_API_SWS_FORMAT_NAME
590
593
attribute_deprecated
594
const
char
*
sws_format_name
(
enum
AVPixelFormat
format);
595
#endif
596
597
static
av_always_inline
int
is16BPS
(
enum
AVPixelFormat
pix_fmt
)
598
{
599
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
600
av_assert0
(desc);
601
return
desc->
comp
[0].
depth_minus1
== 15;
602
}
603
604
static
av_always_inline
int
is9_OR_10BPS
(
enum
AVPixelFormat
pix_fmt
)
605
{
606
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
607
av_assert0
(desc);
608
return
desc->
comp
[0].
depth_minus1
>= 8 && desc->
comp
[0].
depth_minus1
<= 13;
609
}
610
611
#define isNBPS(x) is9_OR_10BPS(x)
612
613
static
av_always_inline
int
isBE
(
enum
AVPixelFormat
pix_fmt
)
614
{
615
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
616
av_assert0
(desc);
617
return
desc->
flags
&
PIX_FMT_BE
;
618
}
619
620
static
av_always_inline
int
isYUV
(
enum
AVPixelFormat
pix_fmt
)
621
{
622
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
623
av_assert0
(desc);
624
return
!(desc->
flags
&
PIX_FMT_RGB
) && desc->
nb_components
>= 2;
625
}
626
627
static
av_always_inline
int
isPlanarYUV
(
enum
AVPixelFormat
pix_fmt
)
628
{
629
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
630
av_assert0
(desc);
631
return
((desc->
flags
&
PIX_FMT_PLANAR
) &&
isYUV
(pix_fmt));
632
}
633
634
static
av_always_inline
int
isRGB
(
enum
AVPixelFormat
pix_fmt
)
635
{
636
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
637
av_assert0
(desc);
638
return
(desc->
flags
&
PIX_FMT_RGB
);
639
}
640
641
#if 0 // FIXME
642
#define isGray(x) \
643
(!(av_pix_fmt_desc_get(x)->flags & PIX_FMT_PAL) && \
644
av_pix_fmt_desc_get(x)->nb_components <= 2)
645
#else
646
#define isGray(x) \
647
((x) == AV_PIX_FMT_GRAY8 || \
648
(x) == AV_PIX_FMT_Y400A || \
649
(x) == AV_PIX_FMT_GRAY16BE || \
650
(x) == AV_PIX_FMT_GRAY16LE)
651
#endif
652
653
#define isRGBinInt(x) \
654
( \
655
(x) == AV_PIX_FMT_RGB48BE || \
656
(x) == AV_PIX_FMT_RGB48LE || \
657
(x) == AV_PIX_FMT_RGBA64BE || \
658
(x) == AV_PIX_FMT_RGBA64LE || \
659
(x) == AV_PIX_FMT_RGB32 || \
660
(x) == AV_PIX_FMT_RGB32_1 || \
661
(x) == AV_PIX_FMT_RGB24 || \
662
(x) == AV_PIX_FMT_RGB565BE || \
663
(x) == AV_PIX_FMT_RGB565LE || \
664
(x) == AV_PIX_FMT_RGB555BE || \
665
(x) == AV_PIX_FMT_RGB555LE || \
666
(x) == AV_PIX_FMT_RGB444BE || \
667
(x) == AV_PIX_FMT_RGB444LE || \
668
(x) == AV_PIX_FMT_RGB8 || \
669
(x) == AV_PIX_FMT_RGB4 || \
670
(x) == AV_PIX_FMT_RGB4_BYTE || \
671
(x) == AV_PIX_FMT_MONOBLACK || \
672
(x) == AV_PIX_FMT_MONOWHITE \
673
)
674
#define isBGRinInt(x) \
675
( \
676
(x) == AV_PIX_FMT_BGR48BE || \
677
(x) == AV_PIX_FMT_BGR48LE || \
678
(x) == AV_PIX_FMT_BGRA64BE || \
679
(x) == AV_PIX_FMT_BGRA64LE || \
680
(x) == AV_PIX_FMT_BGR32 || \
681
(x) == AV_PIX_FMT_BGR32_1 || \
682
(x) == AV_PIX_FMT_BGR24 || \
683
(x) == AV_PIX_FMT_BGR565BE || \
684
(x) == AV_PIX_FMT_BGR565LE || \
685
(x) == AV_PIX_FMT_BGR555BE || \
686
(x) == AV_PIX_FMT_BGR555LE || \
687
(x) == AV_PIX_FMT_BGR444BE || \
688
(x) == AV_PIX_FMT_BGR444LE || \
689
(x) == AV_PIX_FMT_BGR8 || \
690
(x) == AV_PIX_FMT_BGR4 || \
691
(x) == AV_PIX_FMT_BGR4_BYTE || \
692
(x) == AV_PIX_FMT_MONOBLACK || \
693
(x) == AV_PIX_FMT_MONOWHITE \
694
)
695
696
#define isRGBinBytes(x) ( \
697
(x) == AV_PIX_FMT_RGB48BE \
698
|| (x) == AV_PIX_FMT_RGB48LE \
699
|| (x) == AV_PIX_FMT_RGBA64BE \
700
|| (x) == AV_PIX_FMT_RGBA64LE \
701
|| (x) == AV_PIX_FMT_RGBA \
702
|| (x) == AV_PIX_FMT_ARGB \
703
|| (x) == AV_PIX_FMT_RGB24 \
704
)
705
#define isBGRinBytes(x) ( \
706
(x) == AV_PIX_FMT_BGR48BE \
707
|| (x) == AV_PIX_FMT_BGR48LE \
708
|| (x) == AV_PIX_FMT_BGRA64BE \
709
|| (x) == AV_PIX_FMT_BGRA64LE \
710
|| (x) == AV_PIX_FMT_BGRA \
711
|| (x) == AV_PIX_FMT_ABGR \
712
|| (x) == AV_PIX_FMT_BGR24 \
713
)
714
715
#define isAnyRGB(x) \
716
( \
717
isRGBinInt(x) || \
718
isBGRinInt(x) || \
719
isRGB(x) || \
720
(x)==AV_PIX_FMT_GBRP9LE || \
721
(x)==AV_PIX_FMT_GBRP9BE || \
722
(x)==AV_PIX_FMT_GBRP10LE || \
723
(x)==AV_PIX_FMT_GBRP10BE || \
724
(x)==AV_PIX_FMT_GBRP12LE || \
725
(x)==AV_PIX_FMT_GBRP12BE || \
726
(x)==AV_PIX_FMT_GBRP14LE || \
727
(x)==AV_PIX_FMT_GBRP14BE || \
728
(x)==AV_PIX_FMT_GBR24P \
729
)
730
731
static
av_always_inline
int
isALPHA
(
enum
AVPixelFormat
pix_fmt
)
732
{
733
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
734
av_assert0
(desc);
735
return
desc->
flags
&
PIX_FMT_ALPHA
;
736
}
737
738
#if 1
739
#define isPacked(x) ( \
740
(x)==AV_PIX_FMT_PAL8 \
741
|| (x)==AV_PIX_FMT_YUYV422 \
742
|| (x)==AV_PIX_FMT_UYVY422 \
743
|| (x)==AV_PIX_FMT_Y400A \
744
|| isRGBinInt(x) \
745
|| isBGRinInt(x) \
746
)
747
#else
748
static
av_always_inline
int
isPacked
(
enum
AVPixelFormat
pix_fmt
)
749
{
750
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
751
av_assert0
(desc);
752
return
((desc->
nb_components
>= 2 && !(desc->
flags
&
PIX_FMT_PLANAR
)) ||
753
pix_fmt ==
AV_PIX_FMT_PAL8
);
754
}
755
756
#endif
757
static
av_always_inline
int
isPlanar
(
enum
AVPixelFormat
pix_fmt
)
758
{
759
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
760
av_assert0
(desc);
761
return
(desc->
nb_components
>= 2 && (desc->
flags
&
PIX_FMT_PLANAR
));
762
}
763
764
static
av_always_inline
int
isPackedRGB
(
enum
AVPixelFormat
pix_fmt
)
765
{
766
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
767
av_assert0
(desc);
768
return
((desc->
flags
& (
PIX_FMT_PLANAR
|
PIX_FMT_RGB
)) ==
PIX_FMT_RGB
);
769
}
770
771
static
av_always_inline
int
isPlanarRGB
(
enum
AVPixelFormat
pix_fmt
)
772
{
773
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
774
av_assert0
(desc);
775
return
((desc->
flags
& (
PIX_FMT_PLANAR
|
PIX_FMT_RGB
)) ==
776
(
PIX_FMT_PLANAR
|
PIX_FMT_RGB
));
777
}
778
779
static
av_always_inline
int
usePal
(
enum
AVPixelFormat
pix_fmt
)
780
{
781
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
782
av_assert0
(desc);
783
return
(desc->
flags
&
PIX_FMT_PAL
) || (desc->
flags
&
PIX_FMT_PSEUDOPAL
);
784
}
785
786
extern
const
uint64_t
ff_dither4
[2];
787
extern
const
uint64_t
ff_dither8
[2];
788
extern
const
uint8_t
dithers
[8][8][8];
789
extern
const
uint16_t
dither_scale
[15][16];
790
791
792
extern
const
AVClass
sws_context_class
;
793
798
void
ff_get_unscaled_swscale
(
SwsContext
*c);
799
800
void
ff_swscale_get_unscaled_altivec
(
SwsContext
*c);
801
806
SwsFunc
ff_getSwsFunc
(
SwsContext
*c);
807
808
void
ff_sws_init_input_funcs
(
SwsContext
*c);
809
void
ff_sws_init_output_funcs
(
SwsContext
*c,
810
yuv2planar1_fn
*
yuv2plane1
,
811
yuv2planarX_fn
*
yuv2planeX
,
812
yuv2interleavedX_fn
*
yuv2nv12cX
,
813
yuv2packed1_fn
*
yuv2packed1
,
814
yuv2packed2_fn
*
yuv2packed2
,
815
yuv2packedX_fn
*
yuv2packedX
,
816
yuv2anyX_fn
*
yuv2anyX
);
817
void
ff_sws_init_swScale_altivec
(
SwsContext
*c);
818
void
ff_sws_init_swScale_mmx
(
SwsContext
*c);
819
820
static
inline
void
fillPlane16
(
uint8_t
*plane,
int
stride
,
int
width
,
int
height
,
int
y
,
821
int
alpha
,
int
bits
,
const
int
big_endian)
822
{
823
int
i, j;
824
uint8_t
*ptr = plane + stride *
y
;
825
int
v
= alpha ? 0xFFFF>>(15-
bits
) : (1<<bits);
826
for
(i = 0; i <
height
; i++) {
827
#define FILL(wfunc) \
828
for (j = 0; j < width; j++) {\
829
wfunc(ptr+2*j, v);\
830
}
831
if
(big_endian) {
832
FILL
(
AV_WB16
);
833
}
else
{
834
FILL
(
AV_WL16
);
835
}
836
ptr +=
stride
;
837
}
838
}
839
840
#endif
/* SWSCALE_SWSCALE_INTERNAL_H */
Generated on Fri Nov 29 2013 19:15:22 for FFmpeg by
1.8.1.2