Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
7b3894be
Commit
7b3894be
authored
Dec 18, 2011
by
Nathan Adil Maxson
Committed by
Ronald S. Bultje
Dec 18, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
swscale: fix formatting and indentation of unscaled conversion routines.
Signed-off-by:
Ronald S. Bultje
<
rsbultje@gmail.com
>
parent
87eebb34
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
383 additions
and
327 deletions
+383
-327
swscale_unscaled.c
libswscale/swscale_unscaled.c
+383
-327
No files found.
libswscale/swscale_unscaled.c
View file @
7b3894be
...
...
@@ -77,21 +77,22 @@ DECLARE_ALIGNED(8, const uint8_t, dither_8x8_256)[8][8] = {
};
#define RGB2YUV_SHIFT 15
#define BY ( (int)(0.114*219/255*(1<<RGB2YUV_SHIFT)+0.5))
#define BV (-(int)(0.081*224/255*(1<<RGB2YUV_SHIFT)+0.5))
#define BU ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5))
#define GY ( (int)(0.587*219/255*(1<<RGB2YUV_SHIFT)+0.5))
#define GV (-(int)(0.419*224/255*(1<<RGB2YUV_SHIFT)+0.5))
#define GU (-(int)(0.331*224/255*(1<<RGB2YUV_SHIFT)+0.5))
#define RY ( (int)(0.299*219/255*(1<<RGB2YUV_SHIFT)+0.5))
#define RV ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5))
#define RU (-(int)(0.169*224/255*(1<<RGB2YUV_SHIFT)+0.5))
static
void
fillPlane
(
uint8_t
*
plane
,
int
stride
,
int
width
,
int
height
,
int
y
,
uint8_t
val
)
#define BY ( (int) (0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define BV (-(int) (0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define BU ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define GY ( (int) (0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define GV (-(int) (0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define GU (-(int) (0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define RY ( (int) (0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define RV ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define RU (-(int) (0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
static
void
fillPlane
(
uint8_t
*
plane
,
int
stride
,
int
width
,
int
height
,
int
y
,
uint8_t
val
)
{
int
i
;
uint8_t
*
ptr
=
plane
+
stride
*
y
;
for
(
i
=
0
;
i
<
height
;
i
++
)
{
uint8_t
*
ptr
=
plane
+
stride
*
y
;
for
(
i
=
0
;
i
<
height
;
i
++
)
{
memset
(
ptr
,
val
,
width
);
ptr
+=
stride
;
}
...
...
@@ -106,7 +107,7 @@ static void copyPlane(const uint8_t *src, int srcStride,
memcpy
(
dst
,
src
,
srcSliceH
*
dstStride
);
}
else
{
int
i
;
for
(
i
=
0
;
i
<
srcSliceH
;
i
++
)
{
for
(
i
=
0
;
i
<
srcSliceH
;
i
++
)
{
memcpy
(
dst
,
src
,
width
);
src
+=
srcStride
;
dst
+=
dstStride
;
...
...
@@ -114,70 +115,84 @@ static void copyPlane(const uint8_t *src, int srcStride,
}
}
static
int
planarToNv12Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
static
int
planarToNv12Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
{
uint8_t
*
dst
=
dstParam
[
1
]
+
dstStride
[
1
]
*
srcSliceY
/
2
;
uint8_t
*
dst
=
dstParam
[
1
]
+
dstStride
[
1
]
*
srcSliceY
/
2
;
copyPlane
(
src
[
0
],
srcStride
[
0
],
srcSliceY
,
srcSliceH
,
c
->
srcW
,
dstParam
[
0
],
dstStride
[
0
]);
if
(
c
->
dstFormat
==
PIX_FMT_NV12
)
interleaveBytes
(
src
[
1
],
src
[
2
],
dst
,
c
->
srcW
/
2
,
srcSliceH
/
2
,
srcStride
[
1
],
srcStride
[
2
],
dstStride
[
0
]);
interleaveBytes
(
src
[
1
],
src
[
2
],
dst
,
c
->
srcW
/
2
,
srcSliceH
/
2
,
srcStride
[
1
],
srcStride
[
2
],
dstStride
[
0
]);
else
interleaveBytes
(
src
[
2
],
src
[
1
],
dst
,
c
->
srcW
/
2
,
srcSliceH
/
2
,
srcStride
[
2
],
srcStride
[
1
],
dstStride
[
0
]);
interleaveBytes
(
src
[
2
],
src
[
1
],
dst
,
c
->
srcW
/
2
,
srcSliceH
/
2
,
srcStride
[
2
],
srcStride
[
1
],
dstStride
[
0
]);
return
srcSliceH
;
}
static
int
planarToYuy2Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
static
int
planarToYuy2Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
{
uint8_t
*
dst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
dst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
yv12toyuy2
(
src
[
0
],
src
[
1
],
src
[
2
],
dst
,
c
->
srcW
,
srcSliceH
,
srcStride
[
0
],
srcStride
[
1
],
dstStride
[
0
]);
yv12toyuy2
(
src
[
0
],
src
[
1
],
src
[
2
],
dst
,
c
->
srcW
,
srcSliceH
,
srcStride
[
0
],
srcStride
[
1
],
dstStride
[
0
]);
return
srcSliceH
;
}
static
int
planarToUyvyWrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
static
int
planarToUyvyWrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
{
uint8_t
*
dst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
dst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
yv12touyvy
(
src
[
0
],
src
[
1
],
src
[
2
],
dst
,
c
->
srcW
,
srcSliceH
,
srcStride
[
0
],
srcStride
[
1
],
dstStride
[
0
]);
yv12touyvy
(
src
[
0
],
src
[
1
],
src
[
2
],
dst
,
c
->
srcW
,
srcSliceH
,
srcStride
[
0
],
srcStride
[
1
],
dstStride
[
0
]);
return
srcSliceH
;
}
static
int
yuv422pToYuy2Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
static
int
yuv422pToYuy2Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
{
uint8_t
*
dst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
dst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
yuv422ptoyuy2
(
src
[
0
],
src
[
1
],
src
[
2
],
dst
,
c
->
srcW
,
srcSliceH
,
srcStride
[
0
],
srcStride
[
1
],
dstStride
[
0
]);
yuv422ptoyuy2
(
src
[
0
],
src
[
1
],
src
[
2
],
dst
,
c
->
srcW
,
srcSliceH
,
srcStride
[
0
],
srcStride
[
1
],
dstStride
[
0
]);
return
srcSliceH
;
}
static
int
yuv422pToUyvyWrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
static
int
yuv422pToUyvyWrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
{
uint8_t
*
dst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
dst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
yuv422ptouyvy
(
src
[
0
],
src
[
1
],
src
[
2
],
dst
,
c
->
srcW
,
srcSliceH
,
srcStride
[
0
],
srcStride
[
1
],
dstStride
[
0
]);
yuv422ptouyvy
(
src
[
0
],
src
[
1
],
src
[
2
],
dst
,
c
->
srcW
,
srcSliceH
,
srcStride
[
0
],
srcStride
[
1
],
dstStride
[
0
]);
return
srcSliceH
;
}
static
int
yuyvToYuv420Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
static
int
yuyvToYuv420Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
{
uint8_t
*
ydst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
udst
=
dstParam
[
1
]
+
dstStride
[
1
]
*
srcSliceY
/
2
;
uint8_t
*
vdst
=
dstParam
[
2
]
+
dstStride
[
2
]
*
srcSliceY
/
2
;
uint8_t
*
ydst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
udst
=
dstParam
[
1
]
+
dstStride
[
1
]
*
srcSliceY
/
2
;
uint8_t
*
vdst
=
dstParam
[
2
]
+
dstStride
[
2
]
*
srcSliceY
/
2
;
yuyvtoyuv420
(
ydst
,
udst
,
vdst
,
src
[
0
],
c
->
srcW
,
srcSliceH
,
dstStride
[
0
],
dstStride
[
1
],
srcStride
[
0
]);
yuyvtoyuv420
(
ydst
,
udst
,
vdst
,
src
[
0
],
c
->
srcW
,
srcSliceH
,
dstStride
[
0
],
dstStride
[
1
],
srcStride
[
0
]);
if
(
dstParam
[
3
])
fillPlane
(
dstParam
[
3
],
dstStride
[
3
],
c
->
srcW
,
srcSliceH
,
srcSliceY
,
255
);
...
...
@@ -185,26 +200,30 @@ static int yuyvToYuv420Wrapper(SwsContext *c, const uint8_t* src[], int srcStrid
return
srcSliceH
;
}
static
int
yuyvToYuv422Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
static
int
yuyvToYuv422Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
{
uint8_t
*
ydst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
udst
=
dstParam
[
1
]
+
dstStride
[
1
]
*
srcSliceY
;
uint8_t
*
vdst
=
dstParam
[
2
]
+
dstStride
[
2
]
*
srcSliceY
;
uint8_t
*
ydst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
udst
=
dstParam
[
1
]
+
dstStride
[
1
]
*
srcSliceY
;
uint8_t
*
vdst
=
dstParam
[
2
]
+
dstStride
[
2
]
*
srcSliceY
;
yuyvtoyuv422
(
ydst
,
udst
,
vdst
,
src
[
0
],
c
->
srcW
,
srcSliceH
,
dstStride
[
0
],
dstStride
[
1
],
srcStride
[
0
]);
yuyvtoyuv422
(
ydst
,
udst
,
vdst
,
src
[
0
],
c
->
srcW
,
srcSliceH
,
dstStride
[
0
],
dstStride
[
1
],
srcStride
[
0
]);
return
srcSliceH
;
}
static
int
uyvyToYuv420Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
static
int
uyvyToYuv420Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
{
uint8_t
*
ydst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
udst
=
dstParam
[
1
]
+
dstStride
[
1
]
*
srcSliceY
/
2
;
uint8_t
*
vdst
=
dstParam
[
2
]
+
dstStride
[
2
]
*
srcSliceY
/
2
;
uint8_t
*
ydst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
udst
=
dstParam
[
1
]
+
dstStride
[
1
]
*
srcSliceY
/
2
;
uint8_t
*
vdst
=
dstParam
[
2
]
+
dstStride
[
2
]
*
srcSliceY
/
2
;
uyvytoyuv420
(
ydst
,
udst
,
vdst
,
src
[
0
],
c
->
srcW
,
srcSliceH
,
dstStride
[
0
],
dstStride
[
1
],
srcStride
[
0
]);
uyvytoyuv420
(
ydst
,
udst
,
vdst
,
src
[
0
],
c
->
srcW
,
srcSliceH
,
dstStride
[
0
],
dstStride
[
1
],
srcStride
[
0
]);
if
(
dstParam
[
3
])
fillPlane
(
dstParam
[
3
],
dstStride
[
3
],
c
->
srcW
,
srcSliceH
,
srcSliceY
,
255
);
...
...
@@ -212,55 +231,60 @@ static int uyvyToYuv420Wrapper(SwsContext *c, const uint8_t* src[], int srcStrid
return
srcSliceH
;
}
static
int
uyvyToYuv422Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
static
int
uyvyToYuv422Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride
[])
{
uint8_t
*
ydst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
udst
=
dstParam
[
1
]
+
dstStride
[
1
]
*
srcSliceY
;
uint8_t
*
vdst
=
dstParam
[
2
]
+
dstStride
[
2
]
*
srcSliceY
;
uint8_t
*
ydst
=
dstParam
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
udst
=
dstParam
[
1
]
+
dstStride
[
1
]
*
srcSliceY
;
uint8_t
*
vdst
=
dstParam
[
2
]
+
dstStride
[
2
]
*
srcSliceY
;
uyvytoyuv422
(
ydst
,
udst
,
vdst
,
src
[
0
],
c
->
srcW
,
srcSliceH
,
dstStride
[
0
],
dstStride
[
1
],
srcStride
[
0
]);
uyvytoyuv422
(
ydst
,
udst
,
vdst
,
src
[
0
],
c
->
srcW
,
srcSliceH
,
dstStride
[
0
],
dstStride
[
1
],
srcStride
[
0
]);
return
srcSliceH
;
}
static
void
gray8aToPacked32
(
const
uint8_t
*
src
,
uint8_t
*
dst
,
int
num_pixels
,
const
uint8_t
*
palette
)
static
void
gray8aToPacked32
(
const
uint8_t
*
src
,
uint8_t
*
dst
,
int
num_pixels
,
const
uint8_t
*
palette
)
{
int
i
;
for
(
i
=
0
;
i
<
num_pixels
;
i
++
)
((
uint32_t
*
)
dst
)[
i
]
=
((
const
uint32_t
*
)
palette
)[
src
[
i
<<
1
]]
|
(
src
[(
i
<<
1
)
+
1
]
<<
24
);
for
(
i
=
0
;
i
<
num_pixels
;
i
++
)
((
uint32_t
*
)
dst
)[
i
]
=
((
const
uint32_t
*
)
palette
)[
src
[
i
<<
1
]]
|
(
src
[(
i
<<
1
)
+
1
]
<<
24
);
}
static
void
gray8aToPacked32_1
(
const
uint8_t
*
src
,
uint8_t
*
dst
,
int
num_pixels
,
const
uint8_t
*
palette
)
static
void
gray8aToPacked32_1
(
const
uint8_t
*
src
,
uint8_t
*
dst
,
int
num_pixels
,
const
uint8_t
*
palette
)
{
int
i
;
for
(
i
=
0
;
i
<
num_pixels
;
i
++
)
((
uint32_t
*
)
dst
)[
i
]
=
((
const
uint32_t
*
)
palette
)[
src
[
i
<<
1
]]
|
src
[(
i
<<
1
)
+
1
];
for
(
i
=
0
;
i
<
num_pixels
;
i
++
)
((
uint32_t
*
)
dst
)[
i
]
=
((
const
uint32_t
*
)
palette
)[
src
[
i
<<
1
]]
|
src
[(
i
<<
1
)
+
1
];
}
static
void
gray8aToPacked24
(
const
uint8_t
*
src
,
uint8_t
*
dst
,
int
num_pixels
,
const
uint8_t
*
palette
)
static
void
gray8aToPacked24
(
const
uint8_t
*
src
,
uint8_t
*
dst
,
int
num_pixels
,
const
uint8_t
*
palette
)
{
int
i
;
for
(
i
=
0
;
i
<
num_pixels
;
i
++
)
{
for
(
i
=
0
;
i
<
num_pixels
;
i
++
)
{
//FIXME slow?
dst
[
0
]
=
palette
[
src
[
i
<<
1
]
*
4
+
0
];
dst
[
1
]
=
palette
[
src
[
i
<<
1
]
*
4
+
1
];
dst
[
2
]
=
palette
[
src
[
i
<<
1
]
*
4
+
2
];
dst
+=
3
;
dst
[
0
]
=
palette
[
src
[
i
<<
1
]
*
4
+
0
];
dst
[
1
]
=
palette
[
src
[
i
<<
1
]
*
4
+
1
];
dst
[
2
]
=
palette
[
src
[
i
<<
1
]
*
4
+
2
];
dst
+=
3
;
}
}
static
int
packed_16bpc_bswap
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
static
int
packed_16bpc_bswap
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
uint8_t
*
dst
[],
int
dstStride
[])
{
int
i
,
j
;
int
srcstr
=
srcStride
[
0
]
>>
1
;
int
dststr
=
dstStride
[
0
]
>>
1
;
uint16_t
*
dstPtr
=
(
uint16_t
*
)
dst
[
0
];
const
uint16_t
*
srcPtr
=
(
const
uint16_t
*
)
src
[
0
];
uint16_t
*
dstPtr
=
(
uint16_t
*
)
dst
[
0
];
const
uint16_t
*
srcPtr
=
(
const
uint16_t
*
)
src
[
0
];
for
(
i
=
0
;
i
<
srcSliceH
;
i
++
)
{
for
(
j
=
0
;
j
<
srcstr
;
j
++
)
{
...
...
@@ -273,16 +297,17 @@ static int packed_16bpc_bswap(SwsContext *c, const uint8_t* src[],
return
srcSliceH
;
}
static
int
palToRgbWrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
static
int
palToRgbWrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
{
const
enum
PixelFormat
srcFormat
=
c
->
srcFormat
;
const
enum
PixelFormat
dstFormat
=
c
->
dstFormat
;
const
enum
PixelFormat
srcFormat
=
c
->
srcFormat
;
const
enum
PixelFormat
dstFormat
=
c
->
dstFormat
;
void
(
*
conv
)(
const
uint8_t
*
src
,
uint8_t
*
dst
,
int
num_pixels
,
const
uint8_t
*
palette
)
=
NULL
;
const
uint8_t
*
palette
)
=
NULL
;
int
i
;
uint8_t
*
dstPtr
=
dst
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
const
uint8_t
*
srcPtr
=
src
[
0
];
uint8_t
*
dstPtr
=
dst
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
const
uint8_t
*
srcPtr
=
src
[
0
];
if
(
srcFormat
==
PIX_FMT_Y400A
)
{
switch
(
dstFormat
)
{
...
...
@@ -308,10 +333,10 @@ static int palToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[],
av_log
(
c
,
AV_LOG_ERROR
,
"internal error %s -> %s converter
\n
"
,
sws_format_name
(
srcFormat
),
sws_format_name
(
dstFormat
));
else
{
for
(
i
=
0
;
i
<
srcSliceH
;
i
++
)
{
for
(
i
=
0
;
i
<
srcSliceH
;
i
++
)
{
conv
(
srcPtr
,
dstPtr
,
c
->
srcW
,
(
uint8_t
*
)
c
->
pal_rgb
);
srcPtr
+=
srcStride
[
0
];
dstPtr
+=
dstStride
[
0
];
srcPtr
+=
srcStride
[
0
];
dstPtr
+=
dstStride
[
0
];
}
}
...
...
@@ -326,16 +351,17 @@ static int palToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[],
)
/* {RGB,BGR}{15,16,24,32,32_1} -> {RGB,BGR}{15,16,24,32} */
static
int
rgbToRgbWrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
static
int
rgbToRgbWrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
{
const
enum
PixelFormat
srcFormat
=
c
->
srcFormat
;
const
enum
PixelFormat
dstFormat
=
c
->
dstFormat
;
const
int
srcBpp
=
(
c
->
srcFormatBpp
+
7
)
>>
3
;
const
int
dstBpp
=
(
c
->
dstFormatBpp
+
7
)
>>
3
;
const
int
srcId
=
c
->
srcFormatBpp
>>
2
;
/* 1:0, 4:1, 8:2, 15:3, 16:4, 24:6, 32:8 */
const
int
dstId
=
c
->
dstFormatBpp
>>
2
;
void
(
*
conv
)(
const
uint8_t
*
src
,
uint8_t
*
dst
,
int
src_size
)
=
NULL
;
const
enum
PixelFormat
srcFormat
=
c
->
srcFormat
;
const
enum
PixelFormat
dstFormat
=
c
->
dstFormat
;
const
int
srcBpp
=
(
c
->
srcFormatBpp
+
7
)
>>
3
;
const
int
dstBpp
=
(
c
->
dstFormatBpp
+
7
)
>>
3
;
const
int
srcId
=
c
->
srcFormatBpp
>>
2
;
/* 1:0, 4:1, 8:2, 15:3, 16:4, 24:6, 32:8 */
const
int
dstId
=
c
->
dstFormatBpp
>>
2
;
void
(
*
conv
)(
const
uint8_t
*
src
,
uint8_t
*
dst
,
int
src_size
)
=
NULL
;
#define CONV_IS(src, dst) (srcFormat == PIX_FMT_##src && dstFormat == PIX_FMT_##dst)
...
...
@@ -354,40 +380,40 @@ static int rgbToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[],
||
CONV_IS
(
RGBA
,
ARGB
))
conv
=
shuffle_bytes_3012
;
}
else
/* BGR -> BGR */
if
(
(
isBGRinInt
(
srcFormat
)
&&
isBGRinInt
(
dstFormat
))
||
(
isRGBinInt
(
srcFormat
)
&&
isRGBinInt
(
dstFormat
)))
{
switch
(
srcId
|
(
dstId
<<
4
))
{
case
0x34
:
conv
=
rgb16to15
;
break
;
case
0x36
:
conv
=
rgb24to15
;
break
;
case
0x38
:
conv
=
rgb32to15
;
break
;
case
0x43
:
conv
=
rgb15to16
;
break
;
case
0x46
:
conv
=
rgb24to16
;
break
;
case
0x48
:
conv
=
rgb32to16
;
break
;
case
0x63
:
conv
=
rgb15to24
;
break
;
case
0x64
:
conv
=
rgb16to24
;
break
;
case
0x68
:
conv
=
rgb32to24
;
break
;
case
0x83
:
conv
=
rgb15to32
;
break
;
case
0x84
:
conv
=
rgb16to32
;
break
;
case
0x86
:
conv
=
rgb24to32
;
break
;
}
}
else
if
(
(
isBGRinInt
(
srcFormat
)
&&
isRGBinInt
(
dstFormat
))
||
(
isRGBinInt
(
srcFormat
)
&&
isBGRinInt
(
dstFormat
)))
{
switch
(
srcId
|
(
dstId
<<
4
))
{
case
0x33
:
conv
=
rgb15tobgr15
;
break
;
case
0x34
:
conv
=
rgb16tobgr15
;
break
;
case
0x36
:
conv
=
rgb24tobgr15
;
break
;
case
0x38
:
conv
=
rgb32tobgr15
;
break
;
case
0x43
:
conv
=
rgb15tobgr16
;
break
;
case
0x44
:
conv
=
rgb16tobgr16
;
break
;
case
0x46
:
conv
=
rgb24tobgr16
;
break
;
case
0x48
:
conv
=
rgb32tobgr16
;
break
;
case
0x63
:
conv
=
rgb15tobgr24
;
break
;
case
0x64
:
conv
=
rgb16tobgr24
;
break
;
case
0x66
:
conv
=
rgb24tobgr24
;
break
;
case
0x68
:
conv
=
rgb32tobgr24
;
break
;
case
0x83
:
conv
=
rgb15tobgr32
;
break
;
case
0x84
:
conv
=
rgb16tobgr32
;
break
;
case
0x86
:
conv
=
rgb24tobgr32
;
break
;
if
(
(
isBGRinInt
(
srcFormat
)
&&
isBGRinInt
(
dstFormat
))
||
(
isRGBinInt
(
srcFormat
)
&&
isRGBinInt
(
dstFormat
)))
{
switch
(
srcId
|
(
dstId
<<
4
))
{
case
0x34
:
conv
=
rgb16to15
;
break
;
case
0x36
:
conv
=
rgb24to15
;
break
;
case
0x38
:
conv
=
rgb32to15
;
break
;
case
0x43
:
conv
=
rgb15to16
;
break
;
case
0x46
:
conv
=
rgb24to16
;
break
;
case
0x48
:
conv
=
rgb32to16
;
break
;
case
0x63
:
conv
=
rgb15to24
;
break
;
case
0x64
:
conv
=
rgb16to24
;
break
;
case
0x68
:
conv
=
rgb32to24
;
break
;
case
0x83
:
conv
=
rgb15to32
;
break
;
case
0x84
:
conv
=
rgb16to32
;
break
;
case
0x86
:
conv
=
rgb24to32
;
break
;
}
}
else
if
(
(
isBGRinInt
(
srcFormat
)
&&
isRGBinInt
(
dstFormat
))
||
(
isRGBinInt
(
srcFormat
)
&&
isBGRinInt
(
dstFormat
)))
{
switch
(
srcId
|
(
dstId
<<
4
))
{
case
0x33
:
conv
=
rgb15tobgr15
;
break
;
case
0x34
:
conv
=
rgb16tobgr15
;
break
;
case
0x36
:
conv
=
rgb24tobgr15
;
break
;
case
0x38
:
conv
=
rgb32tobgr15
;
break
;
case
0x43
:
conv
=
rgb15tobgr16
;
break
;
case
0x44
:
conv
=
rgb16tobgr16
;
break
;
case
0x46
:
conv
=
rgb24tobgr16
;
break
;
case
0x48
:
conv
=
rgb32tobgr16
;
break
;
case
0x63
:
conv
=
rgb15tobgr24
;
break
;
case
0x64
:
conv
=
rgb16tobgr24
;
break
;
case
0x66
:
conv
=
rgb24tobgr24
;
break
;
case
0x68
:
conv
=
rgb32tobgr24
;
break
;
case
0x83
:
conv
=
rgb15tobgr32
;
break
;
case
0x84
:
conv
=
rgb16tobgr32
;
break
;
case
0x86
:
conv
=
rgb24tobgr32
;
break
;
}
}
...
...
@@ -395,38 +421,43 @@ static int rgbToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[],
av_log
(
c
,
AV_LOG_ERROR
,
"internal error %s -> %s converter
\n
"
,
sws_format_name
(
srcFormat
),
sws_format_name
(
dstFormat
));
}
else
{
const
uint8_t
*
srcPtr
=
src
[
0
];
uint8_t
*
dstPtr
=
dst
[
0
];
if
((
srcFormat
==
PIX_FMT_RGB32_1
||
srcFormat
==
PIX_FMT_BGR32_1
)
&&
!
isRGBA32
(
dstFormat
))
const
uint8_t
*
srcPtr
=
src
[
0
];
uint8_t
*
dstPtr
=
dst
[
0
];
if
((
srcFormat
==
PIX_FMT_RGB32_1
||
srcFormat
==
PIX_FMT_BGR32_1
)
&&
!
isRGBA32
(
dstFormat
))
srcPtr
+=
ALT32_CORR
;
if
((
dstFormat
==
PIX_FMT_RGB32_1
||
dstFormat
==
PIX_FMT_BGR32_1
)
&&
!
isRGBA32
(
srcFormat
))
if
((
dstFormat
==
PIX_FMT_RGB32_1
||
dstFormat
==
PIX_FMT_BGR32_1
)
&&
!
isRGBA32
(
srcFormat
))
dstPtr
+=
ALT32_CORR
;
if
(
dstStride
[
0
]
*
srcBpp
==
srcStride
[
0
]
*
dstBpp
&&
srcStride
[
0
]
>
0
&&
!
(
srcStride
[
0
]
%
srcBpp
))
conv
(
srcPtr
,
dstPtr
+
dstStride
[
0
]
*
srcSliceY
,
srcSliceH
*
srcStride
[
0
]);
if
(
dstStride
[
0
]
*
srcBpp
==
srcStride
[
0
]
*
dstBpp
&&
srcStride
[
0
]
>
0
&&
!
(
srcStride
[
0
]
%
srcBpp
))
conv
(
srcPtr
,
dstPtr
+
dstStride
[
0
]
*
srcSliceY
,
srcSliceH
*
srcStride
[
0
]);
else
{
int
i
;
dstPtr
+=
dstStride
[
0
]
*
srcSliceY
;
dstPtr
+=
dstStride
[
0
]
*
srcSliceY
;
for
(
i
=
0
;
i
<
srcSliceH
;
i
++
)
{
conv
(
srcPtr
,
dstPtr
,
c
->
srcW
*
srcBpp
);
srcPtr
+=
srcStride
[
0
];
dstPtr
+=
dstStride
[
0
];
for
(
i
=
0
;
i
<
srcSliceH
;
i
++
)
{
conv
(
srcPtr
,
dstPtr
,
c
->
srcW
*
srcBpp
);
srcPtr
+=
srcStride
[
0
];
dstPtr
+=
dstStride
[
0
];
}
}
}
return
srcSliceH
;
}
static
int
bgr24ToYv12Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
static
int
bgr24ToYv12Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
{
rgb24toyv12
(
src
[
0
],
dst
[
0
]
+
srcSliceY
*
dstStride
[
0
],
dst
[
1
]
+
(
srcSliceY
>>
1
)
*
dstStride
[
1
],
dst
[
2
]
+
(
srcSliceY
>>
1
)
*
dstStride
[
2
],
dst
[
0
]
+
srcSliceY
*
dstStride
[
0
],
dst
[
1
]
+
(
srcSliceY
>>
1
)
*
dstStride
[
1
],
dst
[
2
]
+
(
srcSliceY
>>
1
)
*
dstStride
[
2
],
c
->
srcW
,
srcSliceH
,
dstStride
[
0
],
dstStride
[
1
],
srcStride
[
0
]);
if
(
dst
[
3
])
...
...
@@ -434,15 +465,16 @@ static int bgr24ToYv12Wrapper(SwsContext *c, const uint8_t* src[], int srcStride
return
srcSliceH
;
}
static
int
yvu9ToYv12Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
static
int
yvu9ToYv12Wrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
{
copyPlane
(
src
[
0
],
srcStride
[
0
],
srcSliceY
,
srcSliceH
,
c
->
srcW
,
dst
[
0
],
dstStride
[
0
]);
planar2x
(
src
[
1
],
dst
[
1
]
+
dstStride
[
1
]
*
(
srcSliceY
>>
1
),
c
->
chrSrcW
,
planar2x
(
src
[
1
],
dst
[
1
]
+
dstStride
[
1
]
*
(
srcSliceY
>>
1
),
c
->
chrSrcW
,
srcSliceH
>>
2
,
srcStride
[
1
],
dstStride
[
1
]);
planar2x
(
src
[
2
],
dst
[
2
]
+
dstStride
[
2
]
*
(
srcSliceY
>>
1
),
c
->
chrSrcW
,
planar2x
(
src
[
2
],
dst
[
2
]
+
dstStride
[
2
]
*
(
srcSliceY
>>
1
),
c
->
chrSrcW
,
srcSliceH
>>
2
,
srcStride
[
2
],
dstStride
[
2
]);
if
(
dst
[
3
])
fillPlane
(
dst
[
3
],
dstStride
[
3
],
c
->
srcW
,
srcSliceH
,
srcSliceY
,
255
);
...
...
@@ -450,26 +482,28 @@ static int yvu9ToYv12Wrapper(SwsContext *c, const uint8_t* src[], int srcStride[
}
/* unscaled copy like stuff (assumes nearly identical formats) */
static
int
packedCopyWrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
static
int
packedCopyWrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
{
if
(
dstStride
[
0
]
==
srcStride
[
0
]
&&
srcStride
[
0
]
>
0
)
memcpy
(
dst
[
0
]
+
dstStride
[
0
]
*
srcSliceY
,
src
[
0
],
srcSliceH
*
dstStride
[
0
]);
if
(
dstStride
[
0
]
==
srcStride
[
0
]
&&
srcStride
[
0
]
>
0
)
memcpy
(
dst
[
0
]
+
dstStride
[
0
]
*
srcSliceY
,
src
[
0
],
srcSliceH
*
dstStride
[
0
]);
else
{
int
i
;
const
uint8_t
*
srcPtr
=
src
[
0
];
uint8_t
*
dstPtr
=
dst
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
int
length
=
0
;
const
uint8_t
*
srcPtr
=
src
[
0
];
uint8_t
*
dstPtr
=
dst
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
int
length
=
0
;
/* universal length finder */
while
(
length
+
c
->
srcW
<=
FFABS
(
dstStride
[
0
])
&&
length
+
c
->
srcW
<=
FFABS
(
srcStride
[
0
]))
length
+=
c
->
srcW
;
assert
(
length
!=
0
);
while
(
length
+
c
->
srcW
<=
FFABS
(
dstStride
[
0
])
&&
length
+
c
->
srcW
<=
FFABS
(
srcStride
[
0
]))
length
+=
c
->
srcW
;
assert
(
length
!=
0
);
for
(
i
=
0
;
i
<
srcSliceH
;
i
++
)
{
for
(
i
=
0
;
i
<
srcSliceH
;
i
++
)
{
memcpy
(
dstPtr
,
srcPtr
,
length
);
srcPtr
+=
srcStride
[
0
];
dstPtr
+=
dstStride
[
0
];
srcPtr
+=
srcStride
[
0
];
dstPtr
+=
dstStride
[
0
];
}
}
return
srcSliceH
;
...
...
@@ -496,40 +530,43 @@ static int packedCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[
src += srcStride; \
}
static
int
planarCopyWrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
static
int
planarCopyWrapper
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
{
int
plane
,
i
,
j
;
for
(
plane
=
0
;
plane
<
4
;
plane
++
)
{
int
length
=
(
plane
==
0
||
plane
==
3
)
?
c
->
srcW
:
-
((
-
c
->
srcW
)
>>
c
->
chrDstHSubSample
);
int
y
=
(
plane
==
0
||
plane
==
3
)
?
srcSliceY
:
-
((
-
srcSliceY
)
>>
c
->
chrDstVSubSample
);
int
height
=
(
plane
==
0
||
plane
==
3
)
?
srcSliceH
:
-
((
-
srcSliceH
)
>>
c
->
chrDstVSubSample
);
const
uint8_t
*
srcPtr
=
src
[
plane
];
uint8_t
*
dstPtr
=
dst
[
plane
]
+
dstStride
[
plane
]
*
y
;
if
(
!
dst
[
plane
])
continue
;
for
(
plane
=
0
;
plane
<
4
;
plane
++
)
{
int
length
=
(
plane
==
0
||
plane
==
3
)
?
c
->
srcW
:
-
((
-
c
->
srcW
)
>>
c
->
chrDstHSubSample
);
int
y
=
(
plane
==
0
||
plane
==
3
)
?
srcSliceY
:
-
((
-
srcSliceY
)
>>
c
->
chrDstVSubSample
);
int
height
=
(
plane
==
0
||
plane
==
3
)
?
srcSliceH
:
-
((
-
srcSliceH
)
>>
c
->
chrDstVSubSample
);
const
uint8_t
*
srcPtr
=
src
[
plane
];
uint8_t
*
dstPtr
=
dst
[
plane
]
+
dstStride
[
plane
]
*
y
;
if
(
!
dst
[
plane
])
continue
;
// ignore palette for GRAY8
if
(
plane
==
1
&&
!
dst
[
2
])
continue
;
if
(
!
src
[
plane
]
||
(
plane
==
1
&&
!
src
[
2
]))
{
if
(
is16BPS
(
c
->
dstFormat
))
length
*=
2
;
fillPlane
(
dst
[
plane
],
dstStride
[
plane
],
length
,
height
,
y
,
(
plane
==
3
)
?
255
:
128
);
if
(
is16BPS
(
c
->
dstFormat
))
length
*=
2
;
fillPlane
(
dst
[
plane
],
dstStride
[
plane
],
length
,
height
,
y
,
(
plane
==
3
)
?
255
:
128
);
}
else
{
if
(
is9_OR_10BPS
(
c
->
srcFormat
))
{
const
int
src_depth
=
av_pix_fmt_descriptors
[
c
->
srcFormat
].
comp
[
plane
].
depth_minus1
+
1
;
const
int
dst_depth
=
av_pix_fmt_descriptors
[
c
->
dstFormat
].
comp
[
plane
].
depth_minus1
+
1
;
const
uint16_t
*
srcPtr2
=
(
const
uint16_t
*
)
srcPtr
;
if
(
is9_OR_10BPS
(
c
->
srcFormat
))
{
const
int
src_depth
=
av_pix_fmt_descriptors
[
c
->
srcFormat
].
comp
[
plane
].
depth_minus1
+
1
;
const
int
dst_depth
=
av_pix_fmt_descriptors
[
c
->
dstFormat
].
comp
[
plane
].
depth_minus1
+
1
;
const
uint16_t
*
srcPtr2
=
(
const
uint16_t
*
)
srcPtr
;
if
(
is16BPS
(
c
->
dstFormat
))
{
uint16_t
*
dstPtr2
=
(
uint16_t
*
)
dstPtr
;
uint16_t
*
dstPtr2
=
(
uint16_t
*
)
dstPtr
;
#define COPY9_OR_10TO16(rfunc, wfunc) \
for (i = 0; i < height; i++) { \
for (j = 0; j < length; j++) { \
int srcpx = rfunc(&srcPtr2[j]); \
wfunc(&dstPtr2[j], (srcpx
<<(16-src_depth)) | (srcpx>>(2*src_depth-
16))); \
wfunc(&dstPtr2[j], (srcpx
<< (16 - src_depth)) | (srcpx >> (2 * src_depth -
16))); \
} \
dstPtr2 += dstStride[plane]
/
2; \
srcPtr2 += srcStride[plane]
/
2; \
dstPtr2 += dstStride[plane]
/
2; \
srcPtr2 += srcStride[plane]
/
2; \
}
if
(
isBE
(
c
->
dstFormat
))
{
if
(
isBE
(
c
->
srcFormat
))
{
...
...
@@ -545,22 +582,22 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[
}
}
}
else
if
(
is9_OR_10BPS
(
c
->
dstFormat
))
{
uint16_t
*
dstPtr2
=
(
uint16_t
*
)
dstPtr
;
uint16_t
*
dstPtr2
=
(
uint16_t
*
)
dstPtr
;
#define COPY9_OR_10TO9_OR_10(loop) \
for (i = 0; i < height; i++) { \
for (j = 0; j < length; j++) { \
loop; \
} \
dstPtr2 += dstStride[plane]
/
2; \
srcPtr2 += srcStride[plane]
/
2; \
dstPtr2 += dstStride[plane]
/
2; \
srcPtr2 += srcStride[plane]
/
2; \
}
#define COPY9_OR_10TO9_OR_10_2(rfunc, wfunc) \
if (dst_depth > src_depth) { \
COPY9_OR_10TO9_OR_10(int srcpx = rfunc(&srcPtr2[j]); \
wfunc(&dstPtr2[j], (srcpx << 1) | (srcpx >> 9))); \
} else if (dst_depth < src_depth) { \
DITHER_COPY(dstPtr2, dstStride[plane]
/
2, wfunc, \
srcPtr2, srcStride[plane]
/
2, rfunc, \
DITHER_COPY(dstPtr2, dstStride[plane]
/
2, wfunc, \
srcPtr2, srcStride[plane]
/
2, rfunc, \
dither_8x8_1, 1, clip9); \
} else { \
COPY9_OR_10TO9_OR_10(wfunc(&dstPtr2[j], rfunc(&srcPtr2[j]))); \
...
...
@@ -583,11 +620,11 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[
#define COPY9_OR_10TO8(rfunc) \
if (src_depth == 9) { \
DITHER_COPY(dstPtr, dstStride[plane], W8, \
srcPtr2, srcStride[plane]
/
2, rfunc, \
srcPtr2, srcStride[plane]
/
2, rfunc, \
dither_8x8_1, 1, av_clip_uint8); \
} else { \
DITHER_COPY(dstPtr, dstStride[plane], W8, \
srcPtr2, srcStride[plane]
/
2, rfunc, \
srcPtr2, srcStride[plane]
/
2, rfunc, \
dither_8x8_3, 2, av_clip_uint8); \
}
if
(
isBE
(
c
->
srcFormat
))
{
...
...
@@ -596,20 +633,20 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[
COPY9_OR_10TO8
(
AV_RL16
);
}
}
}
else
if
(
is9_OR_10BPS
(
c
->
dstFormat
))
{
const
int
dst_depth
=
av_pix_fmt_descriptors
[
c
->
dstFormat
].
comp
[
plane
].
depth_minus1
+
1
;
uint16_t
*
dstPtr2
=
(
uint16_t
*
)
dstPtr
;
}
else
if
(
is9_OR_10BPS
(
c
->
dstFormat
))
{
const
int
dst_depth
=
av_pix_fmt_descriptors
[
c
->
dstFormat
].
comp
[
plane
].
depth_minus1
+
1
;
uint16_t
*
dstPtr2
=
(
uint16_t
*
)
dstPtr
;
if
(
is16BPS
(
c
->
srcFormat
))
{
const
uint16_t
*
srcPtr2
=
(
const
uint16_t
*
)
srcPtr
;
const
uint16_t
*
srcPtr2
=
(
const
uint16_t
*
)
srcPtr
;
#define COPY16TO9_OR_10(rfunc, wfunc) \
if (dst_depth == 9) { \
DITHER_COPY(dstPtr2, dstStride[plane]
/
2, wfunc, \
srcPtr2, srcStride[plane]
/
2, rfunc, \
DITHER_COPY(dstPtr2, dstStride[plane]
/
2, wfunc, \
srcPtr2, srcStride[plane]
/
2, rfunc, \
dither_8x8_128, 7, clip9); \
} else { \
DITHER_COPY(dstPtr2, dstStride[plane]
/
2, wfunc, \
srcPtr2, srcStride[plane]
/
2, rfunc, \
DITHER_COPY(dstPtr2, dstStride[plane]
/
2, wfunc, \
srcPtr2, srcStride[plane]
/
2, rfunc, \
dither_8x8_64, 6, clip10); \
}
if
(
isBE
(
c
->
dstFormat
))
{
...
...
@@ -630,9 +667,9 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[
for (i = 0; i < height; i++) { \
for (j = 0; j < length; j++) { \
const int srcpx = srcPtr[j]; \
wfunc(&dstPtr2[j], (srcpx
<<(dst_depth-8)) | (srcpx >> (16-
dst_depth))); \
wfunc(&dstPtr2[j], (srcpx
<< (dst_depth - 8)) | (srcpx >> (16 -
dst_depth))); \
} \
dstPtr2 += dstStride[plane]
/
2; \
dstPtr2 += dstStride[plane]
/
2; \
srcPtr += srcStride[plane]; \
}
if
(
isBE
(
c
->
dstFormat
))
{
...
...
@@ -641,46 +678,46 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[
COPY8TO9_OR_10
(
AV_WL16
);
}
}
}
else
if
(
is16BPS
(
c
->
srcFormat
)
&&
!
is16BPS
(
c
->
dstFormat
))
{
const
uint16_t
*
srcPtr2
=
(
const
uint16_t
*
)
srcPtr
;
}
else
if
(
is16BPS
(
c
->
srcFormat
)
&&
!
is16BPS
(
c
->
dstFormat
))
{
const
uint16_t
*
srcPtr2
=
(
const
uint16_t
*
)
srcPtr
;
#define COPY16TO8(rfunc) \
DITHER_COPY(dstPtr, dstStride[plane], W8, \
srcPtr2, srcStride[plane]
/
2, rfunc, \
srcPtr2, srcStride[plane]
/
2, rfunc, \
dither_8x8_256, 8, av_clip_uint8);
if
(
isBE
(
c
->
srcFormat
))
{
COPY16TO8
(
AV_RB16
);
}
else
{
COPY16TO8
(
AV_RL16
);
}
}
else
if
(
!
is16BPS
(
c
->
srcFormat
)
&&
is16BPS
(
c
->
dstFormat
))
{
for
(
i
=
0
;
i
<
height
;
i
++
)
{
for
(
j
=
0
;
j
<
length
;
j
++
)
{
dstPtr
[
j
<<
1
]
=
srcPtr
[
j
];
dstPtr
[(
j
<<
1
)
+
1
]
=
srcPtr
[
j
];
}
else
if
(
!
is16BPS
(
c
->
srcFormat
)
&&
is16BPS
(
c
->
dstFormat
))
{
for
(
i
=
0
;
i
<
height
;
i
++
)
{
for
(
j
=
0
;
j
<
length
;
j
++
)
{
dstPtr
[
j
<<
1
]
=
srcPtr
[
j
];
dstPtr
[(
j
<<
1
)
+
1
]
=
srcPtr
[
j
];
}
srcPtr
+=
srcStride
[
plane
];
dstPtr
+=
dstStride
[
plane
];
srcPtr
+=
srcStride
[
plane
];
dstPtr
+=
dstStride
[
plane
];
}
}
else
if
(
is16BPS
(
c
->
srcFormat
)
&&
is16BPS
(
c
->
dstFormat
)
&&
isBE
(
c
->
srcFormat
)
!=
isBE
(
c
->
dstFormat
))
{
}
else
if
(
is16BPS
(
c
->
srcFormat
)
&&
is16BPS
(
c
->
dstFormat
)
&&
isBE
(
c
->
srcFormat
)
!=
isBE
(
c
->
dstFormat
))
{
for
(
i
=
0
;
i
<
height
;
i
++
)
{
for
(
j
=
0
;
j
<
length
;
j
++
)
((
uint16_t
*
)
dstPtr
)[
j
]
=
av_bswap16
(((
const
uint16_t
*
)
srcPtr
)[
j
]);
srcPtr
+=
srcStride
[
plane
];
dstPtr
+=
dstStride
[
plane
];
for
(
i
=
0
;
i
<
height
;
i
++
)
{
for
(
j
=
0
;
j
<
length
;
j
++
)
((
uint16_t
*
)
dstPtr
)[
j
]
=
av_bswap16
(((
const
uint16_t
*
)
srcPtr
)[
j
]);
srcPtr
+=
srcStride
[
plane
];
dstPtr
+=
dstStride
[
plane
];
}
}
else
if
(
dstStride
[
plane
]
==
srcStride
[
plane
]
&&
srcStride
[
plane
]
>
0
&&
srcStride
[
plane
]
==
length
)
{
memcpy
(
dst
[
plane
]
+
dstStride
[
plane
]
*
y
,
src
[
plane
],
height
*
dstStride
[
plane
]);
memcpy
(
dst
[
plane
]
+
dstStride
[
plane
]
*
y
,
src
[
plane
],
height
*
dstStride
[
plane
]);
}
else
{
if
(
is16BPS
(
c
->
srcFormat
)
&&
is16BPS
(
c
->
dstFormat
))
length
*=
2
;
for
(
i
=
0
;
i
<
height
;
i
++
)
{
if
(
is16BPS
(
c
->
srcFormat
)
&&
is16BPS
(
c
->
dstFormat
))
length
*=
2
;
for
(
i
=
0
;
i
<
height
;
i
++
)
{
memcpy
(
dstPtr
,
srcPtr
,
length
);
srcPtr
+=
srcStride
[
plane
];
dstPtr
+=
dstStride
[
plane
];
srcPtr
+=
srcStride
[
plane
];
dstPtr
+=
dstStride
[
plane
];
}
}
}
...
...
@@ -702,27 +739,33 @@ void ff_get_unscaled_swscale(SwsContext *c)
const
int
dstH
=
c
->
dstH
;
int
needsDither
;
needsDither
=
isAnyRGB
(
dstFormat
)
&&
c
->
dstFormatBpp
<
24
&&
(
c
->
dstFormatBpp
<
c
->
srcFormatBpp
||
(
!
isAnyRGB
(
srcFormat
)));
needsDither
=
isAnyRGB
(
dstFormat
)
&&
c
->
dstFormatBpp
<
24
&&
(
c
->
dstFormatBpp
<
c
->
srcFormatBpp
||
(
!
isAnyRGB
(
srcFormat
)));
/* yv12_to_nv12 */
if
((
srcFormat
==
PIX_FMT_YUV420P
||
srcFormat
==
PIX_FMT_YUVA420P
)
&&
(
dstFormat
==
PIX_FMT_NV12
||
dstFormat
==
PIX_FMT_NV21
))
{
c
->
swScale
=
planarToNv12Wrapper
;
if
((
srcFormat
==
PIX_FMT_YUV420P
||
srcFormat
==
PIX_FMT_YUVA420P
)
&&
(
dstFormat
==
PIX_FMT_NV12
||
dstFormat
==
PIX_FMT_NV21
))
{
c
->
swScale
=
planarToNv12Wrapper
;
}
/* yuv2bgr */
if
((
srcFormat
==
PIX_FMT_YUV420P
||
srcFormat
==
PIX_FMT_YUV422P
||
srcFormat
==
PIX_FMT_YUVA420P
)
&&
isAnyRGB
(
dstFormat
)
&&
!
(
flags
&
SWS_ACCURATE_RND
)
&&
!
(
dstH
&
1
))
{
c
->
swScale
=
ff_yuv2rgb_get_func_ptr
(
c
);
if
((
srcFormat
==
PIX_FMT_YUV420P
||
srcFormat
==
PIX_FMT_YUV422P
||
srcFormat
==
PIX_FMT_YUVA420P
)
&&
isAnyRGB
(
dstFormat
)
&&
!
(
flags
&
SWS_ACCURATE_RND
)
&&
!
(
dstH
&
1
))
{
c
->
swScale
=
ff_yuv2rgb_get_func_ptr
(
c
);
}
if
(
srcFormat
==
PIX_FMT_YUV410P
&&
(
dstFormat
==
PIX_FMT_YUV420P
||
dstFormat
==
PIX_FMT_YUVA420P
)
&&
!
(
flags
&
SWS_BITEXACT
))
{
c
->
swScale
=
yvu9ToYv12Wrapper
;
if
(
srcFormat
==
PIX_FMT_YUV410P
&&
(
dstFormat
==
PIX_FMT_YUV420P
||
dstFormat
==
PIX_FMT_YUVA420P
)
&&
!
(
flags
&
SWS_BITEXACT
))
{
c
->
swScale
=
yvu9ToYv12Wrapper
;
}
/* bgr24toYV12 */
if
(
srcFormat
==
PIX_FMT_BGR24
&&
(
dstFormat
==
PIX_FMT_YUV420P
||
dstFormat
==
PIX_FMT_YUVA420P
)
&&
!
(
flags
&
SWS_ACCURATE_RND
))
c
->
swScale
=
bgr24ToYv12Wrapper
;
if
(
srcFormat
==
PIX_FMT_BGR24
&&
(
dstFormat
==
PIX_FMT_YUV420P
||
dstFormat
==
PIX_FMT_YUVA420P
)
&&
!
(
flags
&
SWS_ACCURATE_RND
))
c
->
swScale
=
bgr24ToYv12Wrapper
;
/* RGB/BGR -> RGB/BGR (no dither needed forms) */
if
(
isAnyRGB
(
srcFormat
)
...
...
@@ -761,13 +804,13 @@ void ff_get_unscaled_swscale(SwsContext *c)
dstFormat
==
PIX_FMT_BGR32
||
dstFormat
==
PIX_FMT_BGR32_1
||
dstFormat
==
PIX_FMT_BGR24
)))
c
->
swScale
=
palToRgbWrapper
;
c
->
swScale
=
palToRgbWrapper
;
if
(
srcFormat
==
PIX_FMT_YUV422P
)
{
if
(
dstFormat
==
PIX_FMT_YUYV422
)
c
->
swScale
=
yuv422pToYuy2Wrapper
;
c
->
swScale
=
yuv422pToYuy2Wrapper
;
else
if
(
dstFormat
==
PIX_FMT_UYVY422
)
c
->
swScale
=
yuv422pToUyvyWrapper
;
c
->
swScale
=
yuv422pToUyvyWrapper
;
}
/* LQ converters if -sws 0 or -sws 4*/
...
...
@@ -775,37 +818,39 @@ void ff_get_unscaled_swscale(SwsContext *c)
/* yv12_to_yuy2 */
if
(
srcFormat
==
PIX_FMT_YUV420P
||
srcFormat
==
PIX_FMT_YUVA420P
)
{
if
(
dstFormat
==
PIX_FMT_YUYV422
)
c
->
swScale
=
planarToYuy2Wrapper
;
c
->
swScale
=
planarToYuy2Wrapper
;
else
if
(
dstFormat
==
PIX_FMT_UYVY422
)
c
->
swScale
=
planarToUyvyWrapper
;
c
->
swScale
=
planarToUyvyWrapper
;
}
}
if
(
srcFormat
==
PIX_FMT_YUYV422
&&
(
dstFormat
==
PIX_FMT_YUV420P
||
dstFormat
==
PIX_FMT_YUVA420P
))
c
->
swScale
=
yuyvToYuv420Wrapper
;
if
(
srcFormat
==
PIX_FMT_UYVY422
&&
(
dstFormat
==
PIX_FMT_YUV420P
||
dstFormat
==
PIX_FMT_YUVA420P
))
c
->
swScale
=
uyvyToYuv420Wrapper
;
if
(
srcFormat
==
PIX_FMT_YUYV422
&&
dstFormat
==
PIX_FMT_YUV422P
)
c
->
swScale
=
yuyvToYuv422Wrapper
;
if
(
srcFormat
==
PIX_FMT_UYVY422
&&
dstFormat
==
PIX_FMT_YUV422P
)
c
->
swScale
=
uyvyToYuv422Wrapper
;
if
(
srcFormat
==
PIX_FMT_YUYV422
&&
(
dstFormat
==
PIX_FMT_YUV420P
||
dstFormat
==
PIX_FMT_YUVA420P
))
c
->
swScale
=
yuyvToYuv420Wrapper
;
if
(
srcFormat
==
PIX_FMT_UYVY422
&&
(
dstFormat
==
PIX_FMT_YUV420P
||
dstFormat
==
PIX_FMT_YUVA420P
))
c
->
swScale
=
uyvyToYuv420Wrapper
;
if
(
srcFormat
==
PIX_FMT_YUYV422
&&
dstFormat
==
PIX_FMT_YUV422P
)
c
->
swScale
=
yuyvToYuv422Wrapper
;
if
(
srcFormat
==
PIX_FMT_UYVY422
&&
dstFormat
==
PIX_FMT_YUV422P
)
c
->
swScale
=
uyvyToYuv422Wrapper
;
/* simple copy */
if
(
srcFormat
==
dstFormat
||
(
srcFormat
==
PIX_FMT_YUVA420P
&&
dstFormat
==
PIX_FMT_YUV420P
)
||
(
srcFormat
==
PIX_FMT_YUV420P
&&
dstFormat
==
PIX_FMT_YUVA420P
)
||
(
isPlanarYUV
(
srcFormat
)
&&
isGray
(
dstFormat
))
||
(
isPlanarYUV
(
dstFormat
)
&&
isGray
(
srcFormat
))
||
(
isGray
(
dstFormat
)
&&
isGray
(
srcFormat
))
||
(
isPlanarYUV
(
srcFormat
)
&&
isPlanarYUV
(
dstFormat
)
&&
c
->
chrDstHSubSample
==
c
->
chrSrcHSubSample
&&
c
->
chrDstVSubSample
==
c
->
chrSrcVSubSample
&&
dstFormat
!=
PIX_FMT_NV12
&&
dstFormat
!=
PIX_FMT_NV21
&&
srcFormat
!=
PIX_FMT_NV12
&&
srcFormat
!=
PIX_FMT_NV21
))
if
(
srcFormat
==
dstFormat
||
(
srcFormat
==
PIX_FMT_YUVA420P
&&
dstFormat
==
PIX_FMT_YUV420P
)
||
(
srcFormat
==
PIX_FMT_YUV420P
&&
dstFormat
==
PIX_FMT_YUVA420P
)
||
(
isPlanarYUV
(
srcFormat
)
&&
isGray
(
dstFormat
))
||
(
isPlanarYUV
(
dstFormat
)
&&
isGray
(
srcFormat
))
||
(
isGray
(
dstFormat
)
&&
isGray
(
srcFormat
))
||
(
isPlanarYUV
(
srcFormat
)
&&
isPlanarYUV
(
dstFormat
)
&&
c
->
chrDstHSubSample
==
c
->
chrSrcHSubSample
&&
c
->
chrDstVSubSample
==
c
->
chrSrcVSubSample
&&
dstFormat
!=
PIX_FMT_NV12
&&
dstFormat
!=
PIX_FMT_NV21
&&
srcFormat
!=
PIX_FMT_NV12
&&
srcFormat
!=
PIX_FMT_NV21
))
{
if
(
isPacked
(
c
->
srcFormat
))
c
->
swScale
=
packedCopyWrapper
;
c
->
swScale
=
packedCopyWrapper
;
else
/* Planar YUV or gray */
c
->
swScale
=
planarCopyWrapper
;
c
->
swScale
=
planarCopyWrapper
;
}
if
(
ARCH_BFIN
)
...
...
@@ -814,15 +859,15 @@ void ff_get_unscaled_swscale(SwsContext *c)
ff_swscale_get_unscaled_altivec
(
c
);
}
static
void
reset_ptr
(
const
uint8_t
*
src
[],
int
format
)
static
void
reset_ptr
(
const
uint8_t
*
src
[],
int
format
)
{
if
(
!
isALPHA
(
format
))
src
[
3
]
=
NULL
;
if
(
!
isALPHA
(
format
))
src
[
3
]
=
NULL
;
if
(
!
isPlanar
(
format
))
{
src
[
3
]
=
src
[
2
]
=
NULL
;
src
[
3
]
=
src
[
2
]
=
NULL
;
if
(
!
usePal
(
format
))
src
[
1
]
=
NULL
;
src
[
1
]
=
NULL
;
}
}
...
...
@@ -845,13 +890,15 @@ static int check_image_pointers(uint8_t *data[4], enum PixelFormat pix_fmt,
* swscale wrapper, so we don't need to export the SwsContext.
* Assumes planar YUV to be in YUV order instead of YVU.
*/
int
attribute_align_arg
sws_scale
(
struct
SwsContext
*
c
,
const
uint8_t
*
const
srcSlice
[],
const
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
const
dst
[],
const
int
dstStride
[])
int
attribute_align_arg
sws_scale
(
struct
SwsContext
*
c
,
const
uint8_t
*
const
srcSlice
[],
const
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
const
dst
[],
const
int
dstStride
[])
{
int
i
;
const
uint8_t
*
src2
[
4
]
=
{
srcSlice
[
0
],
srcSlice
[
1
],
srcSlice
[
2
],
srcSlice
[
3
]
};
uint8_t
*
dst2
[
4
]
=
{
dst
[
0
],
dst
[
1
],
dst
[
2
],
dst
[
3
]
};
const
uint8_t
*
src2
[
4
]
=
{
srcSlice
[
0
],
srcSlice
[
1
],
srcSlice
[
2
],
srcSlice
[
3
]
};
uint8_t
*
dst2
[
4
]
=
{
dst
[
0
],
dst
[
1
],
dst
[
2
],
dst
[
3
]
};
// do not mess up sliceDir if we have a "trailing" 0-size slice
if
(
srcSliceH
==
0
)
...
...
@@ -875,63 +922,64 @@ int attribute_align_arg sws_scale(struct SwsContext *c, const uint8_t* const src
}
if
(
usePal
(
c
->
srcFormat
))
{
for
(
i
=
0
;
i
<
256
;
i
++
)
{
int
p
,
r
,
g
,
b
,
y
,
u
,
v
;
if
(
c
->
srcFormat
==
PIX_FMT_PAL8
)
{
p
=
((
const
uint32_t
*
)(
srcSlice
[
1
]))[
i
];
r
=
(
p
>>
16
)
&
0xFF
;
g
=
(
p
>>
8
)
&
0xFF
;
b
=
p
&
0xFF
;
}
else
if
(
c
->
srcFormat
==
PIX_FMT_RGB8
)
{
r
=
(
i
>>
5
)
*
36
;
g
=
((
i
>>
2
)
&
7
)
*
36
;
b
=
(
i
&
3
)
*
85
;
}
else
if
(
c
->
srcFormat
==
PIX_FMT_BGR8
)
{
b
=
(
i
>>
6
)
*
85
;
g
=
((
i
>>
3
)
&
7
)
*
36
;
r
=
(
i
&
7
)
*
36
;
}
else
if
(
c
->
srcFormat
==
PIX_FMT_RGB4_BYTE
)
{
r
=
(
i
>>
3
)
*
255
;
g
=
((
i
>>
1
)
&
3
)
*
85
;
b
=
(
i
&
1
)
*
255
;
}
else
if
(
c
->
srcFormat
==
PIX_FMT_GRAY8
||
c
->
srcFormat
==
PIX_FMT_Y400A
)
{
for
(
i
=
0
;
i
<
256
;
i
++
)
{
int
p
,
r
,
g
,
b
,
y
,
u
,
v
;
if
(
c
->
srcFormat
==
PIX_FMT_PAL8
)
{
p
=
((
const
uint32_t
*
)(
srcSlice
[
1
]))[
i
];
r
=
(
p
>>
16
)
&
0xFF
;
g
=
(
p
>>
8
)
&
0xFF
;
b
=
p
&
0xFF
;
}
else
if
(
c
->
srcFormat
==
PIX_FMT_RGB8
)
{
r
=
(
i
>>
5
)
*
36
;
g
=
((
i
>>
2
)
&
7
)
*
36
;
b
=
(
i
&
3
)
*
85
;
}
else
if
(
c
->
srcFormat
==
PIX_FMT_BGR8
)
{
b
=
(
i
>>
6
)
*
85
;
g
=
((
i
>>
3
)
&
7
)
*
36
;
r
=
(
i
&
7
)
*
36
;
}
else
if
(
c
->
srcFormat
==
PIX_FMT_RGB4_BYTE
)
{
r
=
(
i
>>
3
)
*
255
;
g
=
((
i
>>
1
)
&
3
)
*
85
;
b
=
(
i
&
1
)
*
255
;
}
else
if
(
c
->
srcFormat
==
PIX_FMT_GRAY8
||
c
->
srcFormat
==
PIX_FMT_Y400A
)
{
r
=
g
=
b
=
i
;
}
else
{
assert
(
c
->
srcFormat
==
PIX_FMT_BGR4_BYTE
);
b
=
(
i
>>
3
)
*
255
;
g
=
((
i
>>
1
)
&
3
)
*
85
;
r
=
(
i
&
1
)
*
255
;
b
=
(
i
>>
3
)
*
255
;
g
=
((
i
>>
1
)
&
3
)
*
85
;
r
=
(
i
&
1
)
*
255
;
}
y
=
av_clip_uint8
((
RY
*
r
+
GY
*
g
+
BY
*
b
+
(
33
<<
(
RGB2YUV_SHIFT
-
1
)))
>>
RGB2YUV_SHIFT
);
u
=
av_clip_uint8
((
RU
*
r
+
GU
*
g
+
BU
*
b
+
(
257
<<
(
RGB2YUV_SHIFT
-
1
)))
>>
RGB2YUV_SHIFT
);
v
=
av_clip_uint8
((
RV
*
r
+
GV
*
g
+
BV
*
b
+
(
257
<<
(
RGB2YUV_SHIFT
-
1
)))
>>
RGB2YUV_SHIFT
);
c
->
pal_yuv
[
i
]
=
y
+
(
u
<<
8
)
+
(
v
<<
16
);
y
=
av_clip_uint8
((
RY
*
r
+
GY
*
g
+
BY
*
b
+
(
33
<<
(
RGB2YUV_SHIFT
-
1
)))
>>
RGB2YUV_SHIFT
);
u
=
av_clip_uint8
((
RU
*
r
+
GU
*
g
+
BU
*
b
+
(
257
<<
(
RGB2YUV_SHIFT
-
1
)))
>>
RGB2YUV_SHIFT
);
v
=
av_clip_uint8
((
RV
*
r
+
GV
*
g
+
BV
*
b
+
(
257
<<
(
RGB2YUV_SHIFT
-
1
)))
>>
RGB2YUV_SHIFT
);
c
->
pal_yuv
[
i
]
=
y
+
(
u
<<
8
)
+
(
v
<<
16
);
switch
(
c
->
dstFormat
)
{
switch
(
c
->
dstFormat
)
{
case
PIX_FMT_BGR32
:
#if !HAVE_BIGENDIAN
case
PIX_FMT_RGB24
:
#endif
c
->
pal_rgb
[
i
]
=
r
+
(
g
<<
8
)
+
(
b
<<
16
);
c
->
pal_rgb
[
i
]
=
r
+
(
g
<<
8
)
+
(
b
<<
16
);
break
;
case
PIX_FMT_BGR32_1
:
#if HAVE_BIGENDIAN
case
PIX_FMT_BGR24
:
#endif
c
->
pal_rgb
[
i
]
=
(
r
+
(
g
<<
8
)
+
(
b
<<
16
))
<<
8
;
c
->
pal_rgb
[
i
]
=
(
r
+
(
g
<<
8
)
+
(
b
<<
16
))
<<
8
;
break
;
case
PIX_FMT_RGB32_1
:
#if HAVE_BIGENDIAN
case
PIX_FMT_RGB24
:
#endif
c
->
pal_rgb
[
i
]
=
(
b
+
(
g
<<
8
)
+
(
r
<<
16
))
<<
8
;
c
->
pal_rgb
[
i
]
=
(
b
+
(
g
<<
8
)
+
(
r
<<
16
))
<<
8
;
break
;
case
PIX_FMT_RGB32
:
#if !HAVE_BIGENDIAN
case
PIX_FMT_BGR24
:
#endif
default:
c
->
pal_rgb
[
i
]
=
b
+
(
g
<<
8
)
+
(
r
<<
16
);
c
->
pal_rgb
[
i
]
=
b
+
(
g
<<
8
)
+
(
r
<<
16
);
}
}
}
...
...
@@ -939,62 +987,70 @@ int attribute_align_arg sws_scale(struct SwsContext *c, const uint8_t* const src
// copy strides, so they can safely be modified
if
(
c
->
sliceDir
==
1
)
{
// slices go from top to bottom
int
srcStride2
[
4
]
=
{
srcStride
[
0
],
srcStride
[
1
],
srcStride
[
2
],
srcStride
[
3
]};
int
dstStride2
[
4
]
=
{
dstStride
[
0
],
dstStride
[
1
],
dstStride
[
2
],
dstStride
[
3
]};
int
srcStride2
[
4
]
=
{
srcStride
[
0
],
srcStride
[
1
],
srcStride
[
2
],
srcStride
[
3
]
};
int
dstStride2
[
4
]
=
{
dstStride
[
0
],
dstStride
[
1
],
dstStride
[
2
],
dstStride
[
3
]
};
reset_ptr
(
src2
,
c
->
srcFormat
);
reset_ptr
((
const
uint8_t
**
)
dst2
,
c
->
dstFormat
);
reset_ptr
((
const
uint8_t
**
)
dst2
,
c
->
dstFormat
);
/* reset slice direction at end of frame */
if
(
srcSliceY
+
srcSliceH
==
c
->
srcH
)
c
->
sliceDir
=
0
;
return
c
->
swScale
(
c
,
src2
,
srcStride2
,
srcSliceY
,
srcSliceH
,
dst2
,
dstStride2
);
return
c
->
swScale
(
c
,
src2
,
srcStride2
,
srcSliceY
,
srcSliceH
,
dst2
,
dstStride2
);
}
else
{
// slices go from bottom to top => we flip the image internally
int
srcStride2
[
4
]
=
{
-
srcStride
[
0
],
-
srcStride
[
1
],
-
srcStride
[
2
],
-
srcStride
[
3
]};
int
dstStride2
[
4
]
=
{
-
dstStride
[
0
],
-
dstStride
[
1
],
-
dstStride
[
2
],
-
dstStride
[
3
]};
int
srcStride2
[
4
]
=
{
-
srcStride
[
0
],
-
srcStride
[
1
],
-
srcStride
[
2
],
-
srcStride
[
3
]
};
int
dstStride2
[
4
]
=
{
-
dstStride
[
0
],
-
dstStride
[
1
],
-
dstStride
[
2
],
-
dstStride
[
3
]
};
src2
[
0
]
+=
(
srcSliceH
-
1
)
*
srcStride
[
0
];
src2
[
0
]
+=
(
srcSliceH
-
1
)
*
srcStride
[
0
];
if
(
!
usePal
(
c
->
srcFormat
))
src2
[
1
]
+=
((
srcSliceH
>>
c
->
chrSrcVSubSample
)
-
1
)
*
srcStride
[
1
];
src2
[
2
]
+=
((
srcSliceH
>>
c
->
chrSrcVSubSample
)
-
1
)
*
srcStride
[
2
];
src2
[
3
]
+=
(
srcSliceH
-
1
)
*
srcStride
[
3
];
dst2
[
0
]
+=
(
c
->
dstH
-
1
)
*
dstStride
[
0
];
dst2
[
1
]
+=
((
c
->
dstH
>>
c
->
chrDstVSubSample
)
-
1
)
*
dstStride
[
1
];
dst2
[
2
]
+=
((
c
->
dstH
>>
c
->
chrDstVSubSample
)
-
1
)
*
dstStride
[
2
];
dst2
[
3
]
+=
(
c
->
dstH
-
1
)
*
dstStride
[
3
];
src2
[
1
]
+=
((
srcSliceH
>>
c
->
chrSrcVSubSample
)
-
1
)
*
srcStride
[
1
];
src2
[
2
]
+=
((
srcSliceH
>>
c
->
chrSrcVSubSample
)
-
1
)
*
srcStride
[
2
];
src2
[
3
]
+=
(
srcSliceH
-
1
)
*
srcStride
[
3
];
dst2
[
0
]
+=
(
c
->
dstH
-
1
)
*
dstStride
[
0
];
dst2
[
1
]
+=
((
c
->
dstH
>>
c
->
chrDstVSubSample
)
-
1
)
*
dstStride
[
1
];
dst2
[
2
]
+=
((
c
->
dstH
>>
c
->
chrDstVSubSample
)
-
1
)
*
dstStride
[
2
];
dst2
[
3
]
+=
(
c
->
dstH
-
1
)
*
dstStride
[
3
];
reset_ptr
(
src2
,
c
->
srcFormat
);
reset_ptr
((
const
uint8_t
**
)
dst2
,
c
->
dstFormat
);
reset_ptr
((
const
uint8_t
**
)
dst2
,
c
->
dstFormat
);
/* reset slice direction at end of frame */
if
(
!
srcSliceY
)
c
->
sliceDir
=
0
;
return
c
->
swScale
(
c
,
src2
,
srcStride2
,
c
->
srcH
-
srcSliceY
-
srcSliceH
,
srcSliceH
,
dst2
,
dstStride2
);
return
c
->
swScale
(
c
,
src2
,
srcStride2
,
c
->
srcH
-
srcSliceY
-
srcSliceH
,
srcSliceH
,
dst2
,
dstStride2
);
}
}
/* Convert the palette to the same packed 32-bit format as the palette */
void
sws_convertPalette8ToPacked32
(
const
uint8_t
*
src
,
uint8_t
*
dst
,
int
num_pixels
,
const
uint8_t
*
palette
)
void
sws_convertPalette8ToPacked32
(
const
uint8_t
*
src
,
uint8_t
*
dst
,
int
num_pixels
,
const
uint8_t
*
palette
)
{
int
i
;
for
(
i
=
0
;
i
<
num_pixels
;
i
++
)
for
(
i
=
0
;
i
<
num_pixels
;
i
++
)
((
uint32_t
*
)
dst
)[
i
]
=
((
const
uint32_t
*
)
palette
)[
src
[
i
]];
}
/* Palette format: ABCD -> dst format: ABC */
void
sws_convertPalette8ToPacked24
(
const
uint8_t
*
src
,
uint8_t
*
dst
,
int
num_pixels
,
const
uint8_t
*
palette
)
void
sws_convertPalette8ToPacked24
(
const
uint8_t
*
src
,
uint8_t
*
dst
,
int
num_pixels
,
const
uint8_t
*
palette
)
{
int
i
;
for
(
i
=
0
;
i
<
num_pixels
;
i
++
)
{
for
(
i
=
0
;
i
<
num_pixels
;
i
++
)
{
//FIXME slow?
dst
[
0
]
=
palette
[
src
[
i
]
*
4
+
0
];
dst
[
1
]
=
palette
[
src
[
i
]
*
4
+
1
];
dst
[
2
]
=
palette
[
src
[
i
]
*
4
+
2
];
dst
+=
3
;
dst
[
0
]
=
palette
[
src
[
i
]
*
4
+
0
];
dst
[
1
]
=
palette
[
src
[
i
]
*
4
+
1
];
dst
[
2
]
=
palette
[
src
[
i
]
*
4
+
2
];
dst
+=
3
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment