OpenFFmpeg
swscale_internal.h
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 #include "version.h"
26 
27 #include "libavutil/avassert.h"
28 #include "libavutil/avutil.h"
29 #include "libavutil/common.h"
30 #include "libavutil/intreadwrite.h"
31 #include "libavutil/log.h"
32 #include "libavutil/pixfmt.h"
33 #include "libavutil/pixdesc.h"
35 
36 #define STR(s) AV_TOSTRING(s) // AV_STRINGIFY is too long
37 
38 #define YUVRGB_TABLE_HEADROOM 512
39 #define YUVRGB_TABLE_LUMA_HEADROOM 512
40 
41 #define MAX_FILTER_SIZE SWS_MAX_FILTER_SIZE
42 
43 #define DITHER1XBPP
44 
45 #if HAVE_BIGENDIAN
46 #define ALT32_CORR (-1)
47 #else
48 #define ALT32_CORR 1
49 #endif
50 
51 #if ARCH_X86_64
52 # define APCK_PTR2 8
53 # define APCK_COEF 16
54 # define APCK_SIZE 24
55 #else
56 # define APCK_PTR2 4
57 # define APCK_COEF 8
58 # define APCK_SIZE 16
59 #endif
60 
61 #define RETCODE_USE_CASCADE -12345
62 
63 struct SwsContext;
64 
65 typedef enum SwsDither {
66  SWS_DITHER_NONE = 0,
67  SWS_DITHER_AUTO,
68  SWS_DITHER_BAYER,
69  SWS_DITHER_ED,
70  SWS_DITHER_A_DITHER,
71  SWS_DITHER_X_DITHER,
72  NB_SWS_DITHER,
73 } SwsDither;
74 
75 typedef enum SwsAlphaBlend {
76  SWS_ALPHA_BLEND_NONE = 0,
77  SWS_ALPHA_BLEND_UNIFORM,
78  SWS_ALPHA_BLEND_CHECKERBOARD,
79  SWS_ALPHA_BLEND_NB,
80 } SwsAlphaBlend;
81 
82 typedef int (*SwsFunc)(struct SwsContext *context, const uint8_t *src[],
83  int srcStride[], int srcSliceY, int srcSliceH,
84  uint8_t *dst[], int dstStride[]);
85 
98 typedef void (*yuv2planar1_fn)(const int16_t *src, uint8_t *dest, int dstW,
99  const uint8_t *dither, int offset);
100 
114 typedef void (*yuv2planarX_fn)(const int16_t *filter, int filterSize,
115  const int16_t **src, uint8_t *dest, int dstW,
116  const uint8_t *dither, int offset);
117 
133 typedef void (*yuv2interleavedX_fn)(struct SwsContext *c,
134  const int16_t *chrFilter,
135  int chrFilterSize,
136  const int16_t **chrUSrc,
137  const int16_t **chrVSrc,
138  uint8_t *dest, int dstW);
139 
169 typedef void (*yuv2packed1_fn)(struct SwsContext *c, const int16_t *lumSrc,
170  const int16_t *chrUSrc[2],
171  const int16_t *chrVSrc[2],
172  const int16_t *alpSrc, uint8_t *dest,
173  int dstW, int uvalpha, int y);
202 typedef void (*yuv2packed2_fn)(struct SwsContext *c, const int16_t *lumSrc[2],
203  const int16_t *chrUSrc[2],
204  const int16_t *chrVSrc[2],
205  const int16_t *alpSrc[2],
206  uint8_t *dest,
207  int dstW, int yalpha, int uvalpha, int y);
234 typedef void (*yuv2packedX_fn)(struct SwsContext *c, const int16_t *lumFilter,
235  const int16_t **lumSrc, int lumFilterSize,
236  const int16_t *chrFilter,
237  const int16_t **chrUSrc,
238  const int16_t **chrVSrc, int chrFilterSize,
239  const int16_t **alpSrc, uint8_t *dest,
240  int dstW, int y);
241 
268 typedef void (*yuv2anyX_fn)(struct SwsContext *c, const int16_t *lumFilter,
269  const int16_t **lumSrc, int lumFilterSize,
270  const int16_t *chrFilter,
271  const int16_t **chrUSrc,
272  const int16_t **chrVSrc, int chrFilterSize,
273  const int16_t **alpSrc, uint8_t **dest,
274  int dstW, int y);
275 
276 struct SwsSlice;
277 struct SwsFilterDescriptor;
278 
279 /* This struct should be aligned on at least a 32-byte boundary. */
280 typedef struct SwsContext {
285 
290  SwsFunc swscale;
291  int srcW;
292  int srcH;
293  int dstH;
294  int chrSrcW;
295  int chrSrcH;
296  int chrDstW;
297  int chrDstH;
298  int lumXInc, chrXInc;
299  int lumYInc, chrYInc;
304  int dstBpc, srcBpc;
309  int vChrDrop;
310  int sliceDir;
311  double param[2];
312 
313  /* The cascaded_* fields allow spliting a scaler task into multiple
314  * sequential steps, this is for example used to limit the maximum
315  * downscaling factor that needs to be supported in one scaler.
316  */
317  struct SwsContext *cascaded_context[3];
318  int cascaded_tmpStride[4];
319  uint8_t *cascaded_tmp[4];
320  int cascaded1_tmpStride[4];
321  uint8_t *cascaded1_tmp[4];
322  int cascaded_mainindex;
323 
324  double gamma_value;
325  int gamma_flag;
326  int is_internal_gamma;
327  uint16_t *gamma;
328  uint16_t *inv_gamma;
329 
330  int numDesc;
331  int descIndex[2];
332  int numSlice;
333  struct SwsSlice *slice;
334  struct SwsFilterDescriptor *desc;
335 
336  uint32_t pal_yuv[256];
337  uint32_t pal_rgb[256];
338 
339  float uint2float_lut[256];
340 
355 
356 
357  uint8_t *formatConvBuffer;
358  int needAlpha;
359 
374  int16_t *hLumFilter;
375  int16_t *hChrFilter;
376  int16_t *vLumFilter;
377  int16_t *vChrFilter;
378  int32_t *hLumFilterPos;
379  int32_t *hChrFilterPos;
380  int32_t *vLumFilterPos;
381  int32_t *vChrFilterPos;
386 
387 
392 
393  int canMMXEXTBeUsed;
394  int warned_unuseable_bilinear;
395 
396  int dstY;
397  int flags;
398  void *yuvTable; // pointer to the yuv->rgb table start so it can be freed()
399  // alignment ensures the offset can be added in a single
400  // instruction on e.g. ARM
401  DECLARE_ALIGNED(16, int, table_gV)[256 + 2*YUVRGB_TABLE_HEADROOM];
402  uint8_t *table_rV[256 + 2*YUVRGB_TABLE_HEADROOM];
403  uint8_t *table_gU[256 + 2*YUVRGB_TABLE_HEADROOM];
404  uint8_t *table_bU[256 + 2*YUVRGB_TABLE_HEADROOM];
405  DECLARE_ALIGNED(16, int32_t, input_rgb2yuv_table)[16+40*4]; // This table can contain both C and SIMD formatted values, the C vales are always at the XY_IDX points
406 #define RY_IDX 0
407 #define GY_IDX 1
408 #define BY_IDX 2
409 #define RU_IDX 3
410 #define GU_IDX 4
411 #define BU_IDX 5
412 #define RV_IDX 6
413 #define GV_IDX 7
414 #define BV_IDX 8
415 #define RGB2YUV_SHIFT 15
416 
417  int *dither_error[4];
418 
419  //Colorspace stuff
420  int contrast, brightness, saturation; // for sws_getColorspaceDetails
421  int srcColorspaceTable[4];
422  int dstColorspaceTable[4];
423  int srcRange;
424  int dstRange;
425  int src0Alpha;
426  int dst0Alpha;
427  int srcXYZ;
428  int dstXYZ;
429  int src_h_chr_pos;
430  int dst_h_chr_pos;
431  int src_v_chr_pos;
432  int dst_v_chr_pos;
433  int yuv2rgb_y_offset;
434  int yuv2rgb_y_coeff;
435  int yuv2rgb_v2r_coeff;
436  int yuv2rgb_v2g_coeff;
437  int yuv2rgb_u2g_coeff;
438  int yuv2rgb_u2b_coeff;
439 
440 #define RED_DITHER "0*8"
441 #define GREEN_DITHER "1*8"
442 #define BLUE_DITHER "2*8"
443 #define Y_COEFF "3*8"
444 #define VR_COEFF "4*8"
445 #define UB_COEFF "5*8"
446 #define VG_COEFF "6*8"
447 #define UG_COEFF "7*8"
448 #define Y_OFFSET "8*8"
449 #define U_OFFSET "9*8"
450 #define V_OFFSET "10*8"
451 #define LUM_MMX_FILTER_OFFSET "11*8"
452 #define CHR_MMX_FILTER_OFFSET "11*8+4*4*"AV_STRINGIFY(MAX_FILTER_SIZE)
453 #define DSTW_OFFSET "11*8+4*4*"AV_STRINGIFY(MAX_FILTER_SIZE)"*2"
454 #define ESP_OFFSET "11*8+4*4*"AV_STRINGIFY(MAX_FILTER_SIZE)"*2+8"
455 #define VROUNDER_OFFSET "11*8+4*4*"AV_STRINGIFY(MAX_FILTER_SIZE)"*2+16"
456 #define U_TEMP "11*8+4*4*"AV_STRINGIFY(MAX_FILTER_SIZE)"*2+24"
457 #define V_TEMP "11*8+4*4*"AV_STRINGIFY(MAX_FILTER_SIZE)"*2+32"
458 #define Y_TEMP "11*8+4*4*"AV_STRINGIFY(MAX_FILTER_SIZE)"*2+40"
459 #define ALP_MMX_FILTER_OFFSET "11*8+4*4*"AV_STRINGIFY(MAX_FILTER_SIZE)"*2+48"
460 #define UV_OFF_PX "11*8+4*4*"AV_STRINGIFY(MAX_FILTER_SIZE)"*3+48"
461 #define UV_OFF_BYTE "11*8+4*4*"AV_STRINGIFY(MAX_FILTER_SIZE)"*3+56"
462 #define DITHER16 "11*8+4*4*"AV_STRINGIFY(MAX_FILTER_SIZE)"*3+64"
463 #define DITHER32 "11*8+4*4*"AV_STRINGIFY(MAX_FILTER_SIZE)"*3+80"
464 #define DITHER32_INT (11*8+4*4*MAX_FILTER_SIZE*3+80) // value equal to above, used for checking that the struct hasn't been changed by mistake
465 
466  DECLARE_ALIGNED(8, uint64_t, redDither);
467  DECLARE_ALIGNED(8, uint64_t, greenDither);
468  DECLARE_ALIGNED(8, uint64_t, blueDither);
469 
470  DECLARE_ALIGNED(8, uint64_t, yCoeff);
471  DECLARE_ALIGNED(8, uint64_t, vrCoeff);
472  DECLARE_ALIGNED(8, uint64_t, ubCoeff);
473  DECLARE_ALIGNED(8, uint64_t, vgCoeff);
474  DECLARE_ALIGNED(8, uint64_t, ugCoeff);
475  DECLARE_ALIGNED(8, uint64_t, yOffset);
476  DECLARE_ALIGNED(8, uint64_t, uOffset);
477  DECLARE_ALIGNED(8, uint64_t, vOffset);
478  int32_t lumMmxFilter[4 * MAX_FILTER_SIZE];
479  int32_t chrMmxFilter[4 * MAX_FILTER_SIZE];
480  int dstW;
481  DECLARE_ALIGNED(8, uint64_t, esp);
482  DECLARE_ALIGNED(8, uint64_t, vRounder);
483  DECLARE_ALIGNED(8, uint64_t, u_temp);
484  DECLARE_ALIGNED(8, uint64_t, v_temp);
485  DECLARE_ALIGNED(8, uint64_t, y_temp);
486  int32_t alpMmxFilter[4 * MAX_FILTER_SIZE];
487  // alignment of these values is not necessary, but merely here
488  // to maintain the same offset across x8632 and x86-64. Once we
489  // use proper offset macros in the asm, they can be removed.
490  DECLARE_ALIGNED(8, ptrdiff_t, uv_off);
491  DECLARE_ALIGNED(8, ptrdiff_t, uv_offx2);
492  DECLARE_ALIGNED(8, uint16_t, dither16)[8];
493  DECLARE_ALIGNED(8, uint32_t, dither32)[8];
494 
495  const uint8_t *chrDither8, *lumDither8;
496 
497 #if HAVE_ALTIVEC
498  vector signed short CY;
499  vector signed short CRV;
500  vector signed short CBU;
501  vector signed short CGU;
502  vector signed short CGV;
503  vector signed short OY;
504  vector unsigned short CSHIFT;
505  vector signed short *vYCoeffsBank, *vCCoeffsBank;
506 #endif
507 
508  int use_mmx_vfilter;
509 
510 /* pre defined color-spaces gamma */
511 #define XYZ_GAMMA (2.6f)
512 #define RGB_GAMMA (2.2f)
513  int16_t *xyzgamma;
514  int16_t *rgbgamma;
515  int16_t *xyzgammainv;
516  int16_t *rgbgammainv;
517  int16_t xyz2rgb_matrix[3][4];
518  int16_t rgb2xyz_matrix[3][4];
519 
520  /* function pointers for swscale() */
521  yuv2planar1_fn yuv2plane1;
522  yuv2planarX_fn yuv2planeX;
523  yuv2interleavedX_fn yuv2nv12cX;
524  yuv2packed1_fn yuv2packed1;
525  yuv2packed2_fn yuv2packed2;
526  yuv2packedX_fn yuv2packedX;
527  yuv2anyX_fn yuv2anyX;
528 
530  void (*lumToYV12)(uint8_t *dst, const uint8_t *src, const uint8_t *src2, const uint8_t *src3,
531  int width, uint32_t *pal);
533  void (*alpToYV12)(uint8_t *dst, const uint8_t *src, const uint8_t *src2, const uint8_t *src3,
534  int width, uint32_t *pal);
536  void (*chrToYV12)(uint8_t *dstU, uint8_t *dstV,
537  const uint8_t *src1, const uint8_t *src2, const uint8_t *src3,
538  int width, uint32_t *pal);
539 
545  void (*readLumPlanar)(uint8_t *dst, const uint8_t *src[4], int width, int32_t *rgb2yuv);
546  void (*readChrPlanar)(uint8_t *dstU, uint8_t *dstV, const uint8_t *src[4],
547  int width, int32_t *rgb2yuv);
548  void (*readAlpPlanar)(uint8_t *dst, const uint8_t *src[4], int width, int32_t *rgb2yuv);
570  void (*hyscale_fast)(struct SwsContext *c,
571  int16_t *dst, int dstWidth,
572  const uint8_t *src, int srcW, int xInc);
573  void (*hcscale_fast)(struct SwsContext *c,
574  int16_t *dst1, int16_t *dst2, int dstWidth,
575  const uint8_t *src1, const uint8_t *src2,
576  int srcW, int xInc);
610  void (*hyScale)(struct SwsContext *c, int16_t *dst, int dstW,
611  const uint8_t *src, const int16_t *filter,
612  const int32_t *filterPos, int filterSize);
613  void (*hcScale)(struct SwsContext *c, int16_t *dst, int dstW,
614  const uint8_t *src, const int16_t *filter,
615  const int32_t *filterPos, int filterSize);
618  void (*lumConvertRange)(int16_t *dst, int width);
621  void (*chrConvertRange)(int16_t *dst1, int16_t *dst2, int width);
622 
624 
625  SwsDither dither;
626 
627  SwsAlphaBlend alphablend;
628 } SwsContext;
629 //FIXME check init (where 0)
630 
631 SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c);
632 int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4],
633  int fullRange, int brightness,
634  int contrast, int saturation);
635 void ff_yuv2rgb_init_tables_ppc(SwsContext *c, const int inv_table[4],
636  int brightness, int contrast, int saturation);
637 
638 void ff_updateMMXDitherTables(SwsContext *c, int dstY, int lumBufIndex, int chrBufIndex,
639  int lastInLumBuf, int lastInChrBuf);
640 
641 av_cold void ff_sws_init_range_convert(SwsContext *c);
642 
643 SwsFunc ff_yuv2rgb_init_x86(SwsContext *c);
644 SwsFunc ff_yuv2rgb_init_ppc(SwsContext *c);
645 
646 static av_always_inline int is16BPS(enum AVPixelFormat pix_fmt)
647 {
648  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
649  av_assert0(desc);
650  return desc->comp[0].depth == 16;
651 }
652 
653 static av_always_inline int isNBPS(enum AVPixelFormat pix_fmt)
654 {
655  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
656  av_assert0(desc);
657  return desc->comp[0].depth >= 9 && desc->comp[0].depth <= 14;
658 }
659 
660 static av_always_inline int isBE(enum AVPixelFormat pix_fmt)
661 {
662  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
663  av_assert0(desc);
664  return desc->flags & AV_PIX_FMT_FLAG_BE;
665 }
666 
667 static av_always_inline int isYUV(enum AVPixelFormat pix_fmt)
668 {
669  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
670  av_assert0(desc);
671  return !(desc->flags & AV_PIX_FMT_FLAG_RGB) && desc->nb_components >= 2;
672 }
673 
674 static av_always_inline int isPlanarYUV(enum AVPixelFormat pix_fmt)
675 {
676  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
677  av_assert0(desc);
678  return ((desc->flags & AV_PIX_FMT_FLAG_PLANAR) && isYUV(pix_fmt));
679 }
680 
681 /*
682  * Identity semi-planar YUV formats. Specifically, those are YUV formats
683  * where the second and third components (U & V) are on the same plane.
684  */
685 static av_always_inline int isSemiPlanarYUV(enum AVPixelFormat pix_fmt)
686 {
687  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
688  av_assert0(desc);
689  return (isPlanarYUV(pix_fmt) && desc->comp[1].plane == desc->comp[2].plane);
690 }
691 
692 static av_always_inline int isRGB(enum AVPixelFormat pix_fmt)
693 {
694  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
695  av_assert0(desc);
696  return (desc->flags & AV_PIX_FMT_FLAG_RGB);
697 }
698 
699 static av_always_inline int isGray(enum AVPixelFormat pix_fmt)
700 {
701  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
702  av_assert0(desc);
703  return !(desc->flags & AV_PIX_FMT_FLAG_PAL) &&
704  !(desc->flags & AV_PIX_FMT_FLAG_HWACCEL) &&
705  desc->nb_components <= 2 &&
706  pix_fmt != AV_PIX_FMT_MONOBLACK &&
707  pix_fmt != AV_PIX_FMT_MONOWHITE;
708 }
709 
710 static av_always_inline int isRGBinInt(enum AVPixelFormat pix_fmt)
711 {
712  return pix_fmt == AV_PIX_FMT_RGB48BE ||
713  pix_fmt == AV_PIX_FMT_RGB48LE ||
714  pix_fmt == AV_PIX_FMT_RGB32 ||
715  pix_fmt == AV_PIX_FMT_RGB32_1 ||
716  pix_fmt == AV_PIX_FMT_RGB24 ||
717  pix_fmt == AV_PIX_FMT_RGB565BE ||
718  pix_fmt == AV_PIX_FMT_RGB565LE ||
719  pix_fmt == AV_PIX_FMT_RGB555BE ||
720  pix_fmt == AV_PIX_FMT_RGB555LE ||
721  pix_fmt == AV_PIX_FMT_RGB444BE ||
722  pix_fmt == AV_PIX_FMT_RGB444LE ||
723  pix_fmt == AV_PIX_FMT_RGB8 ||
724  pix_fmt == AV_PIX_FMT_RGB4 ||
725  pix_fmt == AV_PIX_FMT_RGB4_BYTE ||
726  pix_fmt == AV_PIX_FMT_RGBA64BE ||
727  pix_fmt == AV_PIX_FMT_RGBA64LE ||
728  pix_fmt == AV_PIX_FMT_MONOBLACK ||
729  pix_fmt == AV_PIX_FMT_MONOWHITE;
730 }
731 
732 static av_always_inline int isBGRinInt(enum AVPixelFormat pix_fmt)
733 {
734  return pix_fmt == AV_PIX_FMT_BGR48BE ||
735  pix_fmt == AV_PIX_FMT_BGR48LE ||
736  pix_fmt == AV_PIX_FMT_BGR32 ||
737  pix_fmt == AV_PIX_FMT_BGR32_1 ||
738  pix_fmt == AV_PIX_FMT_BGR24 ||
739  pix_fmt == AV_PIX_FMT_BGR565BE ||
740  pix_fmt == AV_PIX_FMT_BGR565LE ||
741  pix_fmt == AV_PIX_FMT_BGR555BE ||
742  pix_fmt == AV_PIX_FMT_BGR555LE ||
743  pix_fmt == AV_PIX_FMT_BGR444BE ||
744  pix_fmt == AV_PIX_FMT_BGR444LE ||
745  pix_fmt == AV_PIX_FMT_BGR8 ||
746  pix_fmt == AV_PIX_FMT_BGR4 ||
747  pix_fmt == AV_PIX_FMT_BGR4_BYTE ||
748  pix_fmt == AV_PIX_FMT_BGRA64BE ||
749  pix_fmt == AV_PIX_FMT_BGRA64LE ||
750  pix_fmt == AV_PIX_FMT_MONOBLACK ||
751  pix_fmt == AV_PIX_FMT_MONOWHITE;
752 }
753 
754 static av_always_inline int isBayer(enum AVPixelFormat pix_fmt)
755 {
756  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
757  av_assert0(desc);
758  return !!(desc->flags & AV_PIX_FMT_FLAG_BAYER);
759 }
760 
761 static av_always_inline int isAnyRGB(enum AVPixelFormat pix_fmt)
762 {
763  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
764  av_assert0(desc);
765  return (desc->flags & AV_PIX_FMT_FLAG_RGB) ||
766  pix_fmt == AV_PIX_FMT_MONOBLACK || pix_fmt == AV_PIX_FMT_MONOWHITE;
767 }
768 
769 static av_always_inline int isFloat(enum AVPixelFormat pix_fmt)
770 {
771  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
772  av_assert0(desc);
773  return desc->flags & AV_PIX_FMT_FLAG_FLOAT;
774 }
775 
776 static av_always_inline int isALPHA(enum AVPixelFormat pix_fmt)
777 {
778  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
779  av_assert0(desc);
780  if (pix_fmt == AV_PIX_FMT_PAL8)
781  return 1;
782  return desc->flags & AV_PIX_FMT_FLAG_ALPHA;
783 }
784 
785 static av_always_inline int isPacked(enum AVPixelFormat pix_fmt)
786 {
787  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
788  av_assert0(desc);
789  return (desc->nb_components >= 2 && !(desc->flags & AV_PIX_FMT_FLAG_PLANAR)) ||
790  pix_fmt == AV_PIX_FMT_PAL8 ||
791  pix_fmt == AV_PIX_FMT_MONOBLACK || pix_fmt == AV_PIX_FMT_MONOWHITE;
792 }
793 
794 static av_always_inline int isPlanar(enum AVPixelFormat pix_fmt)
795 {
796  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
797  av_assert0(desc);
798  return (desc->nb_components >= 2 && (desc->flags & AV_PIX_FMT_FLAG_PLANAR));
799 }
800 
801 static av_always_inline int isPackedRGB(enum AVPixelFormat pix_fmt)
802 {
803  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
804  av_assert0(desc);
805  return ((desc->flags & (AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB)) == AV_PIX_FMT_FLAG_RGB);
806 }
807 
808 static av_always_inline int isPlanarRGB(enum AVPixelFormat pix_fmt)
809 {
810  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
811  av_assert0(desc);
812  return ((desc->flags & (AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB)) ==
813  (AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB));
814 }
815 
816 static av_always_inline int usePal(enum AVPixelFormat pix_fmt)
817 {
818  switch (pix_fmt) {
819  case AV_PIX_FMT_PAL8:
821  case AV_PIX_FMT_BGR8:
822  case AV_PIX_FMT_GRAY8:
824  case AV_PIX_FMT_RGB8:
825  return 1;
826  default:
827  return 0;
828  }
829 }
830 
831 extern const uint64_t ff_dither4[2];
832 extern const uint64_t ff_dither8[2];
833 
834 extern const uint8_t ff_dither_2x2_4[3][8];
835 extern const uint8_t ff_dither_2x2_8[3][8];
836 extern const uint8_t ff_dither_4x4_16[5][8];
837 extern const uint8_t ff_dither_8x8_32[9][8];
838 extern const uint8_t ff_dither_8x8_73[9][8];
839 extern const uint8_t ff_dither_8x8_128[9][8];
840 extern const uint8_t ff_dither_8x8_220[9][8];
841 
842 extern const int32_t ff_yuv2rgb_coeffs[11][4];
843 
844 extern const AVClass ff_sws_context_class;
845 
850 void ff_get_unscaled_swscale(SwsContext *c);
851 void ff_get_unscaled_swscale_ppc(SwsContext *c);
852 void ff_get_unscaled_swscale_arm(SwsContext *c);
853 void ff_get_unscaled_swscale_aarch64(SwsContext *c);
854 
859 SwsFunc ff_getSwsFunc(SwsContext *c);
860 
861 void ff_sws_init_input_funcs(SwsContext *c);
862 void ff_sws_init_output_funcs(SwsContext *c,
863  yuv2planar1_fn *yuv2plane1,
864  yuv2planarX_fn *yuv2planeX,
865  yuv2interleavedX_fn *yuv2nv12cX,
866  yuv2packed1_fn *yuv2packed1,
867  yuv2packed2_fn *yuv2packed2,
868  yuv2packedX_fn *yuv2packedX,
869  yuv2anyX_fn *yuv2anyX);
870 void ff_sws_init_swscale_ppc(SwsContext *c);
871 void ff_sws_init_swscale_vsx(SwsContext *c);
872 void ff_sws_init_swscale_x86(SwsContext *c);
873 void ff_sws_init_swscale_aarch64(SwsContext *c);
874 void ff_sws_init_swscale_arm(SwsContext *c);
875 
876 void ff_hyscale_fast_c(SwsContext *c, int16_t *dst, int dstWidth,
877  const uint8_t *src, int srcW, int xInc);
878 void ff_hcscale_fast_c(SwsContext *c, int16_t *dst1, int16_t *dst2,
879  int dstWidth, const uint8_t *src1,
880  const uint8_t *src2, int srcW, int xInc);
881 int ff_init_hscaler_mmxext(int dstW, int xInc, uint8_t *filterCode,
882  int16_t *filter, int32_t *filterPos,
883  int numSplits);
884 void ff_hyscale_fast_mmxext(SwsContext *c, int16_t *dst,
885  int dstWidth, const uint8_t *src,
886  int srcW, int xInc);
887 void ff_hcscale_fast_mmxext(SwsContext *c, int16_t *dst1, int16_t *dst2,
888  int dstWidth, const uint8_t *src1,
889  const uint8_t *src2, int srcW, int xInc);
890 
898 struct SwsContext *sws_alloc_set_opts(int srcW, int srcH, enum AVPixelFormat srcFormat,
899  int dstW, int dstH, enum AVPixelFormat dstFormat,
900  int flags, const double *param);
901 
902 int ff_sws_alphablendaway(SwsContext *c, const uint8_t *src[],
903  int srcStride[], int srcSliceY, int srcSliceH,
904  uint8_t *dst[], int dstStride[]);
905 
906 static inline void fillPlane16(uint8_t *plane, int stride, int width, int height, int y,
907  int alpha, int bits, const int big_endian)
908 {
909  int i, j;
910  uint8_t *ptr = plane + stride * y;
911  int v = alpha ? 0xFFFF>>(16-bits) : (1<<(bits-1));
912  for (i = 0; i < height; i++) {
913 #define FILL(wfunc) \
914  for (j = 0; j < width; j++) {\
915  wfunc(ptr+2*j, v);\
916  }
917  if (big_endian) {
918  FILL(AV_WB16);
919  } else {
920  FILL(AV_WL16);
921  }
922  ptr += stride;
923  }
924 }
925 
926 #define MAX_SLICE_PLANES 4
927 
929 typedef struct SwsPlane
930 {
932  int sliceY;
933  int sliceH;
934  uint8_t **line;
935  uint8_t **tmp;
936 } SwsPlane;
937 
943 typedef struct SwsSlice
944 {
945  int width;
948  int is_ring;
950  enum AVPixelFormat fmt;
951  SwsPlane plane[MAX_SLICE_PLANES];
952 } SwsSlice;
953 
958 typedef struct SwsFilterDescriptor
959 {
962 
963  int alpha;
964  void *instance;
965 
967  int (*process)(SwsContext *c, struct SwsFilterDescriptor *desc, int sliceY, int sliceH);
969 
970 // warp input lines in the form (src + width*i + j) to slice format (line[i][j])
971 // relative=true means first line src[x][0] otherwise first line is src[x][lum/crh Y]
972 int ff_init_slice_from_src(SwsSlice * s, uint8_t *src[4], int stride[4], int srcW, int lumY, int lumH, int chrY, int chrH, int relative);
973 
974 // Initialize scaler filter descriptor chain
975 int ff_init_filters(SwsContext *c);
976 
977 // Free all filter data
978 int ff_free_filters(SwsContext *c);
979 
980 /*
981  function for applying ring buffer logic into slice s
982  It checks if the slice can hold more @lum lines, if yes
983  do nothing otherwise remove @lum least used lines.
984  It applies the same procedure for @chr lines.
985 */
986 int ff_rotate_slice(SwsSlice *s, int lum, int chr);
987 
989 int ff_init_gamma_convert(SwsFilterDescriptor *desc, SwsSlice * src, uint16_t *table);
990 
992 int ff_init_desc_fmt_convert(SwsFilterDescriptor *desc, SwsSlice * src, SwsSlice *dst, uint32_t *pal);
993 
995 int ff_init_desc_hscale(SwsFilterDescriptor *desc, SwsSlice *src, SwsSlice *dst, uint16_t *filter, int * filter_pos, int filter_size, int xInc);
996 
998 int ff_init_desc_cfmt_convert(SwsFilterDescriptor *desc, SwsSlice * src, SwsSlice *dst, uint32_t *pal);
999 
1001 int ff_init_desc_chscale(SwsFilterDescriptor *desc, SwsSlice *src, SwsSlice *dst, uint16_t *filter, int * filter_pos, int filter_size, int xInc);
1002 
1003 int ff_init_desc_no_chr(SwsFilterDescriptor *desc, SwsSlice * src, SwsSlice *dst);
1004 
1006 int ff_init_vscale(SwsContext *c, SwsFilterDescriptor *desc, SwsSlice *src, SwsSlice *dst);
1007 
1009 void ff_init_vscale_pfn(SwsContext *c, yuv2planar1_fn yuv2plane1, yuv2planarX_fn yuv2planeX,
1010  yuv2interleavedX_fn yuv2nv12cX, yuv2packed1_fn yuv2packed1, yuv2packed2_fn yuv2packed2,
1011  yuv2packedX_fn yuv2packedX, yuv2anyX_fn yuv2anyX, int use_mmx);
1012 
1013 //number of extra lines to process
1014 #define MAX_LINES_AHEAD 4
1015 
1016 #endif /* SWSCALE_SWSCALE_INTERNAL_H */
int plane
Which of the 4 planes contains the component.
Definition: pixdesc.h:35
int chrBufIndex
Index in ring buffer of the last scaled horizontal chroma line from source.
Definition: swscale_internal.h:354
int chrSrcH
Height of source chroma planes.
Definition: swscale_internal.h:295
void(* chrConvertRange)(int16_t *dst1, int16_t *dst2, int width)
Color range conversion function for chroma planes if needed.
Definition: swscale_internal.h:621
uint8_t * chrMmxextFilterCode
Runtime-generated MMXEXT horizontal fast bilinear scaler code for chroma planes.
Definition: swscale_internal.h:391
packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is st...
Definition: pixfmt.h:208
uint8_t * lumMmxextFilterCode
Runtime-generated MMXEXT horizontal fast bilinear scaler code for luma/alpha planes.
Definition: swscale_internal.h:390
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:68
packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in ...
Definition: pixfmt.h:84
int vChrDrop
Binary logarithm of extra vertical subsampling factor in source image chroma planes specified by user...
Definition: swscale_internal.h:309
int h_chr_sub_sample
horizontal chroma subsampling factor
Definition: swscale_internal.h:946
Struct which holds all necessary data for processing a slice.
Definition: swscale_internal.h:958
packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is st...
Definition: pixfmt.h:207
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined ...
Definition: pixfmt.h:108
void(* chrToYV12)(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1, const uint8_t *src2, const uint8_t *src3, int width, uint32_t *pal)
Unscaled conversion of chroma planes to YV12 for horizontal scaler.
Definition: swscale_internal.h:536
int dstFormatBpp
Number of bits per pixel of the destination pixel format.
Definition: swscale_internal.h:302
void(* alpToYV12)(uint8_t *dst, const uint8_t *src, const uint8_t *src2, const uint8_t *src3, int width, uint32_t *pal)
Unscaled conversion of alpha plane to YV12 for horizontal scaler.
Definition: swscale_internal.h:533
Convenience header that includes libavutil&#39;s core.
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
Definition: pixfmt.h:111
packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined
Definition: pixfmt.h:140
void(* hyScale)(struct SwsContext *c, int16_t *dst, int dstW, const uint8_t *src, const int16_t *filter, const int32_t *filterPos, int filterSize)
Scale one horizontal line of input data using a filter over the input lines, to produce one (differen...
Definition: swscale_internal.h:610
int srcRange
0 = MPG YUV range, 1 = JPG YUV range (source image).
Definition: swscale_internal.h:423
swscale version macros
void(* hyscale_fast)(struct SwsContext *c, int16_t *dst, int dstWidth, const uint8_t *src, int srcW, int xInc)
Scale one horizontal line of input data using a bilinear filter to produce one line of output data...
Definition: swscale_internal.h:570
int dstY
Last destination vertical line output from last slice.
Definition: swscale_internal.h:396
packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in ...
Definition: pixfmt.h:87
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
Definition: pixfmt.h:106
int srcH
Height of source luma/alpha planes.
Definition: swscale_internal.h:292
packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
Definition: pixfmt.h:85
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
int chrDstVSubSample
Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in destination i...
Definition: swscale_internal.h:308
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:117
uint8_t ** line
line buffer
Definition: swscale_internal.h:934
8 bits with AV_PIX_FMT_RGB32 palette
Definition: pixfmt.h:77
int alpha
Flag for processing alpha channel.
Definition: swscale_internal.h:963
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as lit...
Definition: pixfmt.h:103
int vChrFilterSize
Vertical filter size for chroma pixels.
Definition: swscale_internal.h:385
int v_chr_sub_sample
vertical chroma subsampling factor
Definition: swscale_internal.h:947
packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is st...
Definition: pixfmt.h:205
packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined ...
Definition: pixfmt.h:139
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
Definition: pixfmt.h:105
SwsSlice * dst
Output slice.
Definition: swscale_internal.h:961
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
Definition: mem.h:120
int lastInLumBuf
Last scaled horizontal luma/alpha line from source in the ring buffer.
Definition: swscale_internal.h:351
enum AVPixelFormat dstFormat
Destination pixel format.
Definition: swscale_internal.h:300
int chrSrcHSubSample
Binary logarithm of horizontal subsampling factor between luma/alpha and chroma planes in source imag...
Definition: swscale_internal.h:305
int32_t * vChrFilterPos
Array of vertical filter starting positions for each dst[i] for chroma planes.
Definition: swscale_internal.h:381
int dstH
Height of destination luma/alpha planes.
Definition: swscale_internal.h:293
int32_t * hChrFilterPos
Array of horizontal filter starting positions for each dst[i] for chroma planes.
Definition: swscale_internal.h:379
int hLumFilterSize
Horizontal filter size for luma/alpha pixels.
Definition: swscale_internal.h:382
simple assert() macros that are a bit more flexible than ISO C assert().
Slice plane.
Definition: swscale_internal.h:929
int chrDstW
Width of destination chroma planes.
Definition: swscale_internal.h:296
packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as lit...
Definition: pixfmt.h:149
int32_t * hLumFilterPos
Array of horizontal filter starting positions for each dst[i] for luma/alpha planes.
Definition: swscale_internal.h:378
int hChrFilterSize
Horizontal filter size for chroma pixels.
Definition: swscale_internal.h:383
int sliceH
number of lines
Definition: swscale_internal.h:933
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
Definition: pixdesc.h:106
int dstRange
0 = MPG YUV range, 1 = JPG YUV range (destination image).
Definition: swscale_internal.h:424
uint8_t nb_components
The number of components each pixel has, (1-4)
Definition: pixdesc.h:83
packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
Definition: pixfmt.h:88
int available_lines
max number of lines that can be hold by this plane
Definition: swscale_internal.h:931
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition: pixfmt.h:69
void(* lumConvertRange)(int16_t *dst, int width)
Color range conversion function for luma plane if needed.
Definition: swscale_internal.h:619
int dstW
Width of destination luma/alpha planes.
Definition: swscale_internal.h:480
packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big...
Definition: pixfmt.h:148
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
Definition: pixfmt.h:110
int sliceDir
Direction that slices are fed to the scaler (1 = top-to-bottom, -1 = bottom-to-top).
Definition: swscale_internal.h:310
int needs_hcscale
Set if there are chroma planes to be converted.
Definition: swscale_internal.h:623
int32_t * vLumFilterPos
Array of vertical filter starting positions for each dst[i] for luma/alpha planes.
Definition: swscale_internal.h:380
int should_free_lines
flag to identify if there are dynamic allocated lines
Definition: swscale_internal.h:949
packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
Definition: pixfmt.h:83
int is_ring
flag to identify if this slice is a ring buffer
Definition: swscale_internal.h:948
int width
Slice line width.
Definition: swscale_internal.h:945
const AVClass * av_class
info on struct for av_log
Definition: swscale_internal.h:284
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:81
int chrDstH
Height of destination chroma planes.
Definition: swscale_internal.h:297
Struct which defines a slice of an image to be scaled or an output for a scaled slice.
Definition: swscale_internal.h:943
int lumMmxextFilterCodeSize
Runtime-generated MMXEXT horizontal fast bilinear scaler code size for luma/alpha planes...
Definition: swscale_internal.h:388
Describe the class of an AVClass context structure.
Definition: log.h:67
int vLumFilterSize
Vertical filter size for luma/alpha pixels.
Definition: swscale_internal.h:384
int chrMmxextFilterCodeSize
Runtime-generated MMXEXT horizontal fast bilinear scaler code size for chroma planes.
Definition: swscale_internal.h:389
packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined ...
Definition: pixfmt.h:113
int16_t * vChrFilter
Array of vertical filter coefficients for chroma planes.
Definition: swscale_internal.h:377
void * instance
Filter instance data.
Definition: swscale_internal.h:964
int16_t * hLumFilter
Array of horizontal filter coefficients for luma/alpha planes.
Definition: swscale_internal.h:374
Contains misc utility macros and inline functions.
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined
Definition: pixfmt.h:107
packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined
Definition: pixfmt.h:142
int lumBufIndex
Index in ring buffer of the last scaled horizontal luma/alpha line from source.
Definition: swscale_internal.h:353
Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb...
Definition: pixfmt.h:76
int lastInChrBuf
Last scaled horizontal chroma line from source in the ring buffer.
Definition: swscale_internal.h:352
Y , 8bpp.
Definition: pixfmt.h:74
double param[2]
Input parameters for scaling algorithms that need them.
Definition: swscale_internal.h:311
common internal and external API header
Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb...
Definition: pixfmt.h:75
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big...
Definition: pixfmt.h:102
enum AVPixelFormat srcFormat
Source pixel format.
Definition: swscale_internal.h:301
packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
Definition: pixfmt.h:86
void(* readLumPlanar)(uint8_t *dst, const uint8_t *src[4], int width, int32_t *rgb2yuv)
Functions to read planar input, such as planar RGB, and convert internally to Y/UV/A.
Definition: swscale_internal.h:545
SwsFunc swscale
Note that src, dst, srcStride, dstStride will be copied in the sws_scale() wrapper so they can be fre...
Definition: swscale_internal.h:290
uint8_t ** tmp
Tmp line buffer used by mmx code.
Definition: swscale_internal.h:935
pixel format definitions
int srcFormatBpp
Number of bits per pixel of the source pixel format.
Definition: swscale_internal.h:303
void(* lumToYV12)(uint8_t *dst, const uint8_t *src, const uint8_t *src2, const uint8_t *src3, int width, uint32_t *pal)
Unscaled conversion of luma plane to YV12 for horizontal scaler.
Definition: swscale_internal.h:530
packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined
Definition: pixfmt.h:112
int16_t * vLumFilter
Array of vertical filter coefficients for luma/alpha planes.
Definition: swscale_internal.h:376
SwsSlice * src
Source slice.
Definition: swscale_internal.h:960
int16_t * hChrFilter
Array of horizontal filter coefficients for chroma planes.
Definition: swscale_internal.h:375
packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined ...
Definition: pixfmt.h:141
int sliceY
index of first line
Definition: swscale_internal.h:932
int chrDstHSubSample
Binary logarithm of horizontal subsampling factor between luma/alpha and chroma planes in destination...
Definition: swscale_internal.h:307
int chrSrcW
Width of source chroma planes.
Definition: swscale_internal.h:294
Definition: swscale_internal.h:280
int depth
Number of bits in the component.
Definition: pixdesc.h:58
int srcW
Width of source luma/alpha planes.
Definition: swscale_internal.h:291
int chrSrcVSubSample
Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in source image...
Definition: swscale_internal.h:306
int flags
Flags passed by the user to select scaler algorithm, optimizations, subsampling, etc...
Definition: swscale_internal.h:397
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is st...
Definition: pixfmt.h:206