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-2003 Michael Niedermayer <michaelni@gmx.at>
3
*
4
* This file is part of Libav.
5
*
6
* Libav 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
* Libav 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 Libav; 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/log.h
"
34
#include "
libavutil/pixfmt.h
"
35
#include "
libavutil/pixdesc.h
"
36
37
#define STR(s) AV_TOSTRING(s) // AV_STRINGIFY is too long
38
39
#define FAST_BGR2YV12 // use 7-bit instead of 15-bit coefficients
40
41
#define MAX_FILTER_SIZE 256
42
43
#if HAVE_BIGENDIAN
44
#define ALT32_CORR (-1)
45
#else
46
#define ALT32_CORR 1
47
#endif
48
49
#if ARCH_X86_64
50
# define APCK_PTR2 8
51
# define APCK_COEF 16
52
# define APCK_SIZE 24
53
#else
54
# define APCK_PTR2 4
55
# define APCK_COEF 8
56
# define APCK_SIZE 16
57
#endif
58
59
struct
SwsContext
;
60
61
typedef
int (*
SwsFunc
)(
struct
SwsContext
*context,
const
uint8_t
*src[],
62
int
srcStride[],
int
srcSliceY,
int
srcSliceH,
63
uint8_t
*dst[],
int
dstStride[]);
64
77
typedef
void
(*
yuv2planar1_fn
)(
const
int16_t *src,
uint8_t
*dest,
int
dstW
,
78
const
uint8_t
*
dither
,
int
offset);
79
93
typedef
void
(*
yuv2planarX_fn
)(
const
int16_t *
filter
,
int
filterSize,
94
const
int16_t **src,
uint8_t
*dest,
int
dstW
,
95
const
uint8_t
*
dither
,
int
offset);
96
112
typedef
void
(*
yuv2interleavedX_fn
)(
struct
SwsContext
*c,
113
const
int16_t *chrFilter,
114
int
chrFilterSize,
115
const
int16_t **chrUSrc,
116
const
int16_t **chrVSrc,
117
uint8_t
*dest,
int
dstW
);
118
148
typedef
void
(*
yuv2packed1_fn
)(
struct
SwsContext
*c,
const
int16_t *lumSrc,
149
const
int16_t *chrUSrc[2],
150
const
int16_t *chrVSrc[2],
151
const
int16_t *alpSrc,
uint8_t
*dest,
152
int
dstW
,
int
uvalpha,
int
y);
181
typedef
void
(*
yuv2packed2_fn
)(
struct
SwsContext
*c,
const
int16_t *lumSrc[2],
182
const
int16_t *chrUSrc[2],
183
const
int16_t *chrVSrc[2],
184
const
int16_t *alpSrc[2],
185
uint8_t
*dest,
186
int
dstW
,
int
yalpha,
int
uvalpha,
int
y);
213
typedef
void
(*
yuv2packedX_fn
)(
struct
SwsContext
*c,
const
int16_t *lumFilter,
214
const
int16_t **lumSrc,
int
lumFilterSize,
215
const
int16_t *chrFilter,
216
const
int16_t **chrUSrc,
217
const
int16_t **chrVSrc,
int
chrFilterSize,
218
const
int16_t **alpSrc,
uint8_t
*dest,
219
int
dstW
,
int
y);
220
221
/* This struct should be aligned on at least a 32-byte boundary. */
222
typedef
struct
SwsContext
{
226
const
AVClass
*
av_class
;
227
232
SwsFunc
swScale
;
233
int
srcW
;
234
int
srcH
;
235
int
dstH
;
236
int
chrSrcW
;
237
int
chrSrcH
;
238
int
chrDstW
;
239
int
chrDstH
;
240
int
lumXInc
,
chrXInc
;
241
int
lumYInc
,
chrYInc
;
242
enum
AVPixelFormat
dstFormat
;
243
enum
AVPixelFormat
srcFormat
;
244
int
dstFormatBpp
;
245
int
srcFormatBpp
;
246
int
dstBpc
,
srcBpc
;
247
int
chrSrcHSubSample
;
248
int
chrSrcVSubSample
;
249
int
chrDstHSubSample
;
250
int
chrDstVSubSample
;
251
int
vChrDrop
;
252
int
sliceDir
;
253
double
param
[2];
254
255
uint32_t
pal_yuv
[256];
256
uint32_t
pal_rgb
[256];
257
268
int16_t **
lumPixBuf
;
269
int16_t **
chrUPixBuf
;
270
int16_t **
chrVPixBuf
;
271
int16_t **
alpPixBuf
;
272
int
vLumBufSize
;
273
int
vChrBufSize
;
274
int
lastInLumBuf
;
275
int
lastInChrBuf
;
276
int
lumBufIndex
;
277
int
chrBufIndex
;
278
279
280
uint8_t
*
formatConvBuffer
;
281
296
int16_t *
hLumFilter
;
297
int16_t *
hChrFilter
;
298
int16_t *
vLumFilter
;
299
int16_t *
vChrFilter
;
300
int32_t
*
hLumFilterPos
;
301
int32_t
*
hChrFilterPos
;
302
int32_t
*
vLumFilterPos
;
303
int32_t
*
vChrFilterPos
;
304
int
hLumFilterSize
;
305
int
hChrFilterSize
;
306
int
vLumFilterSize
;
307
int
vChrFilterSize
;
308
309
310
int
lumMmxextFilterCodeSize
;
311
int
chrMmxextFilterCodeSize
;
312
uint8_t
*
lumMmxextFilterCode
;
313
uint8_t
*
chrMmxextFilterCode
;
314
315
int
canMMXEXTBeUsed
;
316
317
int
dstY
;
318
int
flags
;
319
void
*
yuvTable
;
// pointer to the yuv->rgb table start so it can be freed()
320
uint8_t
*
table_rV
[256];
321
uint8_t
*
table_gU
[256];
322
int
table_gV
[256];
323
uint8_t
*
table_bU
[256];
324
325
//Colorspace stuff
326
int
contrast
,
brightness
,
saturation
;
// for sws_getColorspaceDetails
327
int
srcColorspaceTable
[4];
328
int
dstColorspaceTable
[4];
329
int
srcRange
;
330
int
dstRange
;
331
int
yuv2rgb_y_offset
;
332
int
yuv2rgb_y_coeff
;
333
int
yuv2rgb_v2r_coeff
;
334
int
yuv2rgb_v2g_coeff
;
335
int
yuv2rgb_u2g_coeff
;
336
int
yuv2rgb_u2b_coeff
;
337
338
#define RED_DITHER "0*8"
339
#define GREEN_DITHER "1*8"
340
#define BLUE_DITHER "2*8"
341
#define Y_COEFF "3*8"
342
#define VR_COEFF "4*8"
343
#define UB_COEFF "5*8"
344
#define VG_COEFF "6*8"
345
#define UG_COEFF "7*8"
346
#define Y_OFFSET "8*8"
347
#define U_OFFSET "9*8"
348
#define V_OFFSET "10*8"
349
#define LUM_MMX_FILTER_OFFSET "11*8"
350
#define CHR_MMX_FILTER_OFFSET "11*8+4*4*256"
351
#define DSTW_OFFSET "11*8+4*4*256*2" //do not change, it is hardcoded in the ASM
352
#define ESP_OFFSET "11*8+4*4*256*2+8"
353
#define VROUNDER_OFFSET "11*8+4*4*256*2+16"
354
#define U_TEMP "11*8+4*4*256*2+24"
355
#define V_TEMP "11*8+4*4*256*2+32"
356
#define Y_TEMP "11*8+4*4*256*2+40"
357
#define ALP_MMX_FILTER_OFFSET "11*8+4*4*256*2+48"
358
#define UV_OFF_PX "11*8+4*4*256*3+48"
359
#define UV_OFF_BYTE "11*8+4*4*256*3+56"
360
#define DITHER16 "11*8+4*4*256*3+64"
361
#define DITHER32 "11*8+4*4*256*3+80"
362
363
DECLARE_ALIGNED
(8, uint64_t,
redDither
);
364
DECLARE_ALIGNED
(8, uint64_t,
greenDither
);
365
DECLARE_ALIGNED
(8, uint64_t,
blueDither
);
366
367
DECLARE_ALIGNED
(8, uint64_t,
yCoeff
);
368
DECLARE_ALIGNED
(8, uint64_t,
vrCoeff
);
369
DECLARE_ALIGNED
(8, uint64_t,
ubCoeff
);
370
DECLARE_ALIGNED
(8, uint64_t,
vgCoeff
);
371
DECLARE_ALIGNED
(8, uint64_t,
ugCoeff
);
372
DECLARE_ALIGNED
(8, uint64_t,
yOffset
);
373
DECLARE_ALIGNED
(8, uint64_t,
uOffset
);
374
DECLARE_ALIGNED
(8, uint64_t,
vOffset
);
375
int32_t
lumMmxFilter
[4 *
MAX_FILTER_SIZE
];
376
int32_t
chrMmxFilter
[4 *
MAX_FILTER_SIZE
];
377
int
dstW
;
378
DECLARE_ALIGNED
(8, uint64_t,
esp
);
379
DECLARE_ALIGNED
(8, uint64_t,
vRounder
);
380
DECLARE_ALIGNED
(8, uint64_t,
u_temp
);
381
DECLARE_ALIGNED
(8, uint64_t,
v_temp
);
382
DECLARE_ALIGNED
(8, uint64_t,
y_temp
);
383
int32_t
alpMmxFilter
[4 *
MAX_FILTER_SIZE
];
384
// alignment of these values is not necessary, but merely here
385
// to maintain the same offset across x8632 and x86-64. Once we
386
// use proper offset macros in the asm, they can be removed.
387
DECLARE_ALIGNED
(8, ptrdiff_t,
uv_off_px
);
388
DECLARE_ALIGNED
(8, ptrdiff_t,
uv_off_byte
);
389
DECLARE_ALIGNED
(8, uint16_t,
dither16
)[8];
390
DECLARE_ALIGNED
(8, uint32_t,
dither32
)[8];
391
392
const
uint8_t
*
chrDither8
, *
lumDither8
;
393
394
#if HAVE_ALTIVEC
395
vector
signed
short
CY;
396
vector
signed
short
CRV;
397
vector
signed
short
CBU;
398
vector
signed
short
CGU;
399
vector
signed
short
CGV;
400
vector
signed
short
OY;
401
vector
unsigned
short
CSHIFT
;
402
vector
signed
short
*vYCoeffsBank, *vCCoeffsBank;
403
#endif
404
405
#if ARCH_BFIN
406
DECLARE_ALIGNED
(4, uint32_t, oy);
407
DECLARE_ALIGNED
(4, uint32_t, oc);
408
DECLARE_ALIGNED
(4, uint32_t,
zero
);
409
DECLARE_ALIGNED
(4, uint32_t, cy);
410
DECLARE_ALIGNED
(4, uint32_t, crv);
411
DECLARE_ALIGNED
(4, uint32_t, rmask);
412
DECLARE_ALIGNED
(4, uint32_t, cbu);
413
DECLARE_ALIGNED
(4, uint32_t, bmask);
414
DECLARE_ALIGNED
(4, uint32_t, cgu);
415
DECLARE_ALIGNED
(4, uint32_t, cgv);
416
DECLARE_ALIGNED
(4, uint32_t, gmask);
417
#endif
418
419
#if HAVE_VIS
420
DECLARE_ALIGNED
(8, uint64_t, sparc_coeffs)[10];
421
#endif
422
423
/* function pointers for swScale() */
424
yuv2planar1_fn
yuv2plane1
;
425
yuv2planarX_fn
yuv2planeX
;
426
yuv2interleavedX_fn
yuv2nv12cX
;
427
yuv2packed1_fn
yuv2packed1
;
428
yuv2packed2_fn
yuv2packed2
;
429
yuv2packedX_fn
yuv2packedX
;
430
432
void
(*
lumToYV12
)(
uint8_t
*dst,
const
uint8_t
*src,
433
int
width
, uint32_t *pal);
435
void
(*
alpToYV12
)(
uint8_t
*dst,
const
uint8_t
*src,
436
int
width
, uint32_t *pal);
438
void
(*
chrToYV12
)(
uint8_t
*dstU,
uint8_t
*dstV,
439
const
uint8_t
*src1,
const
uint8_t
*src2,
440
int
width
, uint32_t *pal);
441
447
void
(*
readLumPlanar
)(
uint8_t
*dst,
const
uint8_t
*src[4],
int
width
);
448
void
(*
readChrPlanar
)(
uint8_t
*dstU,
uint8_t
*dstV,
const
uint8_t
*src[4],
449
int
width
);
471
void
(*
hyscale_fast
)(
struct
SwsContext
*c,
472
int16_t *dst,
int
dstWidth,
473
const
uint8_t
*src,
int
srcW
,
int
xInc);
474
void
(*
hcscale_fast
)(
struct
SwsContext
*c,
475
int16_t *dst1, int16_t *dst2,
int
dstWidth,
476
const
uint8_t
*src1,
const
uint8_t
*src2,
477
int
srcW
,
int
xInc);
511
void
(*
hyScale
)(
struct
SwsContext
*c, int16_t *dst,
int
dstW
,
512
const
uint8_t
*src,
const
int16_t *
filter
,
513
const
int32_t
*filterPos,
int
filterSize);
514
void
(*
hcScale
)(
struct
SwsContext
*c, int16_t *dst,
int
dstW
,
515
const
uint8_t
*src,
const
int16_t *
filter
,
516
const
int32_t
*filterPos,
int
filterSize);
519
520
void
(*
lumConvertRange
)(int16_t *dst,
int
width
);
522
void
(*
chrConvertRange
)(int16_t *dst1, int16_t *dst2,
int
width
);
523
524
int
needs_hcscale
;
525
}
SwsContext
;
526
//FIXME check init (where 0)
527
528
SwsFunc
ff_yuv2rgb_get_func_ptr
(
SwsContext
*c);
529
int
ff_yuv2rgb_c_init_tables
(
SwsContext
*c,
const
int
inv_table[4],
530
int
fullRange,
int
brightness
,
531
int
contrast
,
int
saturation
);
532
533
void
ff_yuv2rgb_init_tables_altivec
(
SwsContext
*c,
const
int
inv_table[4],
534
int
brightness
,
int
contrast
,
int
saturation
);
535
void
updateMMXDitherTables
(
SwsContext
*c,
int
dstY
,
int
lumBufIndex
,
int
chrBufIndex
,
536
int
lastInLumBuf
,
int
lastInChrBuf
);
537
538
SwsFunc
ff_yuv2rgb_init_mmx
(
SwsContext
*c);
539
SwsFunc
ff_yuv2rgb_init_vis
(
SwsContext
*c);
540
SwsFunc
ff_yuv2rgb_init_altivec
(
SwsContext
*c);
541
SwsFunc
ff_yuv2rgb_get_func_ptr_bfin
(
SwsContext
*c);
542
void
ff_bfin_get_unscaled_swscale
(
SwsContext
*c);
543
544
const
char
*
sws_format_name
(
enum
AVPixelFormat
format);
545
546
static
av_always_inline
int
is16BPS
(
enum
AVPixelFormat
pix_fmt
)
547
{
548
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
549
av_assert0
(desc);
550
return
desc->
comp
[0].
depth_minus1
== 15;
551
}
552
553
static
av_always_inline
int
is9_OR_10BPS
(
enum
AVPixelFormat
pix_fmt
)
554
{
555
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
556
av_assert0
(desc);
557
return
desc->
comp
[0].
depth_minus1
== 8 || desc->
comp
[0].
depth_minus1
== 9;
558
}
559
560
static
av_always_inline
int
isBE
(
enum
AVPixelFormat
pix_fmt
)
561
{
562
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
563
av_assert0
(desc);
564
return
desc->
flags
&
PIX_FMT_BE
;
565
}
566
567
static
av_always_inline
int
isYUV
(
enum
AVPixelFormat
pix_fmt
)
568
{
569
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
570
av_assert0
(desc);
571
return
!(desc->
flags
&
PIX_FMT_RGB
) && desc->
nb_components
>= 2;
572
}
573
574
static
av_always_inline
int
isPlanarYUV
(
enum
AVPixelFormat
pix_fmt
)
575
{
576
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
577
av_assert0
(desc);
578
return
((desc->
flags
&
PIX_FMT_PLANAR
) &&
isYUV
(pix_fmt));
579
}
580
581
static
av_always_inline
int
isRGB
(
enum
AVPixelFormat
pix_fmt
)
582
{
583
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
584
av_assert0
(desc);
585
return
(desc->
flags
&
PIX_FMT_RGB
);
586
}
587
588
#if 0 // FIXME
589
#define isGray(x) \
590
(!(av_pix_fmt_descriptors[x].flags & PIX_FMT_PAL) && \
591
av_pix_fmt_descriptors[x].nb_components <= 2)
592
#else
593
#define isGray(x) \
594
((x) == AV_PIX_FMT_GRAY8 || \
595
(x) == AV_PIX_FMT_Y400A || \
596
(x) == AV_PIX_FMT_GRAY16BE || \
597
(x) == AV_PIX_FMT_GRAY16LE)
598
#endif
599
600
#define isRGBinInt(x) \
601
((x) == AV_PIX_FMT_RGB48BE || \
602
(x) == AV_PIX_FMT_RGB48LE || \
603
(x) == AV_PIX_FMT_RGB32 || \
604
(x) == AV_PIX_FMT_RGB32_1 || \
605
(x) == AV_PIX_FMT_RGB24 || \
606
(x) == AV_PIX_FMT_RGB565BE || \
607
(x) == AV_PIX_FMT_RGB565LE || \
608
(x) == AV_PIX_FMT_RGB555BE || \
609
(x) == AV_PIX_FMT_RGB555LE || \
610
(x) == AV_PIX_FMT_RGB444BE || \
611
(x) == AV_PIX_FMT_RGB444LE || \
612
(x) == AV_PIX_FMT_RGB8 || \
613
(x) == AV_PIX_FMT_RGB4 || \
614
(x) == AV_PIX_FMT_RGB4_BYTE || \
615
(x) == AV_PIX_FMT_MONOBLACK || \
616
(x) == AV_PIX_FMT_MONOWHITE)
617
618
#define isBGRinInt(x) \
619
((x) == AV_PIX_FMT_BGR48BE || \
620
(x) == AV_PIX_FMT_BGR48LE || \
621
(x) == AV_PIX_FMT_BGR32 || \
622
(x) == AV_PIX_FMT_BGR32_1 || \
623
(x) == AV_PIX_FMT_BGR24 || \
624
(x) == AV_PIX_FMT_BGR565BE || \
625
(x) == AV_PIX_FMT_BGR565LE || \
626
(x) == AV_PIX_FMT_BGR555BE || \
627
(x) == AV_PIX_FMT_BGR555LE || \
628
(x) == AV_PIX_FMT_BGR444BE || \
629
(x) == AV_PIX_FMT_BGR444LE || \
630
(x) == AV_PIX_FMT_BGR8 || \
631
(x) == AV_PIX_FMT_BGR4 || \
632
(x) == AV_PIX_FMT_BGR4_BYTE || \
633
(x) == AV_PIX_FMT_MONOBLACK || \
634
(x) == AV_PIX_FMT_MONOWHITE)
635
636
#define isAnyRGB(x) \
637
(isRGBinInt(x) || \
638
isBGRinInt(x))
639
640
static
av_always_inline
int
isALPHA
(
enum
AVPixelFormat
pix_fmt
)
641
{
642
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
643
av_assert0
(desc);
644
return
desc->
nb_components
== 2 || desc->
nb_components
== 4;
645
}
646
647
static
av_always_inline
int
isPacked
(
enum
AVPixelFormat
pix_fmt
)
648
{
649
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
650
av_assert0
(desc);
651
return
((desc->
nb_components
>= 2 && !(desc->
flags
&
PIX_FMT_PLANAR
)) ||
652
pix_fmt ==
AV_PIX_FMT_PAL8
);
653
}
654
655
static
av_always_inline
int
isPlanar
(
enum
AVPixelFormat
pix_fmt
)
656
{
657
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
658
av_assert0
(desc);
659
return
(desc->
nb_components
>= 2 && (desc->
flags
&
PIX_FMT_PLANAR
));
660
}
661
662
static
av_always_inline
int
isPackedRGB
(
enum
AVPixelFormat
pix_fmt
)
663
{
664
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
665
av_assert0
(desc);
666
return
((desc->
flags
& (
PIX_FMT_PLANAR
|
PIX_FMT_RGB
)) ==
PIX_FMT_RGB
);
667
}
668
669
static
av_always_inline
int
isPlanarRGB
(
enum
AVPixelFormat
pix_fmt
)
670
{
671
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
672
av_assert0
(desc);
673
return
((desc->
flags
& (
PIX_FMT_PLANAR
|
PIX_FMT_RGB
)) ==
674
(
PIX_FMT_PLANAR
|
PIX_FMT_RGB
));
675
}
676
677
static
av_always_inline
int
usePal
(
enum
AVPixelFormat
pix_fmt
)
678
{
679
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
680
av_assert0
(desc);
681
return
((desc->
flags
&
PIX_FMT_PAL
) || (desc->
flags
&
PIX_FMT_PSEUDOPAL
) ||
682
pix_fmt ==
AV_PIX_FMT_Y400A
);
683
}
684
685
extern
const
uint64_t
ff_dither4
[2];
686
extern
const
uint64_t
ff_dither8
[2];
687
688
extern
const
AVClass
sws_context_class
;
689
694
void
ff_get_unscaled_swscale
(
SwsContext
*c);
695
696
void
ff_swscale_get_unscaled_altivec
(
SwsContext
*c);
697
702
SwsFunc
ff_getSwsFunc
(
SwsContext
*c);
703
704
void
ff_sws_init_input_funcs
(
SwsContext
*c);
705
void
ff_sws_init_output_funcs
(
SwsContext
*c,
706
yuv2planar1_fn
*
yuv2plane1
,
707
yuv2planarX_fn
*
yuv2planeX
,
708
yuv2interleavedX_fn
*
yuv2nv12cX
,
709
yuv2packed1_fn
*
yuv2packed1
,
710
yuv2packed2_fn
*
yuv2packed2
,
711
yuv2packedX_fn
*
yuv2packedX
);
712
void
ff_sws_init_swScale_altivec
(
SwsContext
*c);
713
void
ff_sws_init_swScale_mmx
(
SwsContext
*c);
714
715
#endif
/* SWSCALE_SWSCALE_INTERNAL_H */