Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
148bc235
Commit
148bc235
authored
Jan 18, 2012
by
Diego Biurrun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
swscale: K&R formatting cosmetics for Blackfin code
Also prettyprint some comments in Assembly code.
parent
3f57bde1
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
78 additions
and
73 deletions
+78
-73
internal_bfin.S
libswscale/bfin/internal_bfin.S
+6
-6
swscale_bfin.c
libswscale/bfin/swscale_bfin.c
+26
-22
yuv2rgb_bfin.c
libswscale/bfin/yuv2rgb_bfin.c
+46
-45
No files found.
libswscale/bfin/internal_bfin.S
View file @
148bc235
...
...
@@ -30,11 +30,11 @@ and converts it to RGB565. R:5 bits, G:6 bits, B:5 bits.. packed into shorts.
The following calculation is used for the conversion:
r = clipz((y
-oy)*cy + crv*(v-
128))
g = clipz((y
-oy)*cy + cgv*(v-128) + cgu*(u-
128))
b = clipz((y
-oy)*cy + cbu*(u-
128))
r = clipz((y
- oy) * cy + crv * (v -
128))
g = clipz((y
- oy) * cy + cgv * (v - 128) + cgu * (u -
128))
b = clipz((y
- oy) * cy + cbu * (u -
128))
y,
u,
v are prescaled by a factor of 4 i.e. left-shifted to gain precision.
y,
u,
v are prescaled by a factor of 4 i.e. left-shifted to gain precision.
New factorization to eliminate the truncation error which was
...
...
@@ -47,7 +47,7 @@ occurring due to the byteop3p.
2) Scale operands up by a factor of 4 not 8 because Blackfin
multiplies include a shift.
3) Compute into the accumulators cy
*yx0, cy*
yx1.
3) Compute into the accumulators cy
* yx0, cy *
yx1.
4) Compute each of the linear equations:
r = clipz((y - oy) * cy + crv * (v - 128))
...
...
@@ -73,7 +73,7 @@ occurring due to the byteop3p.
Where coeffs have the following layout in memory.
uint32_t oy,
oc,zero,cy,crv,rmask,cbu,bmask,cgu,
cgv;
uint32_t oy,
oc, zero, cy, crv, rmask, cbu, bmask, cgu,
cgv;
coeffs is a pointer to oy.
...
...
libswscale/bfin/swscale_bfin.c
View file @
148bc235
...
...
@@ -27,32 +27,34 @@
#include <assert.h>
#include "config.h"
#include <unistd.h>
#include "libswscale/rgb2rgb.h"
#include "libswscale/swscale.h"
#include "libswscale/swscale_internal.h"
#if defined (__FDPIC__) && CONFIG_SRAM
#define L1CODE __attribute__
((l1_text))
#define L1CODE __attribute__((l1_text))
#else
#define L1CODE
#endif
int
ff_bfin_uyvytoyv12
(
const
uint8_t
*
src
,
uint8_t
*
ydst
,
uint8_t
*
udst
,
uint8_t
*
vdst
,
int
width
,
int
height
,
int
ff_bfin_uyvytoyv12
(
const
uint8_t
*
src
,
uint8_t
*
ydst
,
uint8_t
*
udst
,
uint8_t
*
vdst
,
int
width
,
int
height
,
int
lumStride
,
int
chromStride
,
int
srcStride
)
L1CODE
;
int
ff_bfin_yuyvtoyv12
(
const
uint8_t
*
src
,
uint8_t
*
ydst
,
uint8_t
*
udst
,
uint8_t
*
vdst
,
int
width
,
int
height
,
int
ff_bfin_yuyvtoyv12
(
const
uint8_t
*
src
,
uint8_t
*
ydst
,
uint8_t
*
udst
,
uint8_t
*
vdst
,
int
width
,
int
height
,
int
lumStride
,
int
chromStride
,
int
srcStride
)
L1CODE
;
static
int
uyvytoyv12_unscaled
(
SwsContext
*
c
,
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
static
int
uyvytoyv12_unscaled
(
SwsContext
*
c
,
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
{
uint8_t
*
dsty
=
dst
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
dstu
=
dst
[
1
]
+
dstStride
[
1
]
*
srcSliceY
/
2
;
uint8_t
*
dstv
=
dst
[
2
]
+
dstStride
[
2
]
*
srcSliceY
/
2
;
uint8_t
*
ip
=
src
[
0
]
+
srcStride
[
0
]
*
srcSliceY
;
int
w
=
dstStride
[
0
];
uint8_t
*
dsty
=
dst
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
dstu
=
dst
[
1
]
+
dstStride
[
1
]
*
srcSliceY
/
2
;
uint8_t
*
dstv
=
dst
[
2
]
+
dstStride
[
2
]
*
srcSliceY
/
2
;
uint8_t
*
ip
=
src
[
0
]
+
srcStride
[
0
]
*
srcSliceY
;
int
w
=
dstStride
[
0
];
ff_bfin_uyvytoyv12
(
ip
,
dsty
,
dstu
,
dstv
,
w
,
srcSliceH
,
dstStride
[
0
],
dstStride
[
1
],
srcStride
[
0
]);
...
...
@@ -60,14 +62,15 @@ static int uyvytoyv12_unscaled(SwsContext *c, uint8_t* src[], int srcStride[], i
return
srcSliceH
;
}
static
int
yuyvtoyv12_unscaled
(
SwsContext
*
c
,
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
static
int
yuyvtoyv12_unscaled
(
SwsContext
*
c
,
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dst
[],
int
dstStride
[])
{
uint8_t
*
dsty
=
dst
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
dstu
=
dst
[
1
]
+
dstStride
[
1
]
*
srcSliceY
/
2
;
uint8_t
*
dstv
=
dst
[
2
]
+
dstStride
[
2
]
*
srcSliceY
/
2
;
uint8_t
*
ip
=
src
[
0
]
+
srcStride
[
0
]
*
srcSliceY
;
int
w
=
dstStride
[
0
];
uint8_t
*
dsty
=
dst
[
0
]
+
dstStride
[
0
]
*
srcSliceY
;
uint8_t
*
dstu
=
dst
[
1
]
+
dstStride
[
1
]
*
srcSliceY
/
2
;
uint8_t
*
dstv
=
dst
[
2
]
+
dstStride
[
2
]
*
srcSliceY
/
2
;
uint8_t
*
ip
=
src
[
0
]
+
srcStride
[
0
]
*
srcSliceY
;
int
w
=
dstStride
[
0
];
ff_bfin_yuyvtoyv12
(
ip
,
dsty
,
dstu
,
dstv
,
w
,
srcSliceH
,
dstStride
[
0
],
dstStride
[
1
],
srcStride
[
0
]);
...
...
@@ -75,15 +78,16 @@ static int yuyvtoyv12_unscaled(SwsContext *c, uint8_t* src[], int srcStride[], i
return
srcSliceH
;
}
void
ff_bfin_get_unscaled_swscale
(
SwsContext
*
c
)
{
if
(
c
->
dstFormat
==
PIX_FMT_YUV420P
&&
c
->
srcFormat
==
PIX_FMT_UYVY422
)
{
av_log
(
NULL
,
AV_LOG_VERBOSE
,
"selecting Blackfin optimized uyvytoyv12_unscaled
\n
"
);
av_log
(
NULL
,
AV_LOG_VERBOSE
,
"selecting Blackfin optimized uyvytoyv12_unscaled
\n
"
);
c
->
swScale
=
uyvytoyv12_unscaled
;
}
if
(
c
->
dstFormat
==
PIX_FMT_YUV420P
&&
c
->
srcFormat
==
PIX_FMT_YUYV422
)
{
av_log
(
NULL
,
AV_LOG_VERBOSE
,
"selecting Blackfin optimized yuyvtoyv12_unscaled
\n
"
);
av_log
(
NULL
,
AV_LOG_VERBOSE
,
"selecting Blackfin optimized yuyvtoyv12_unscaled
\n
"
);
c
->
swScale
=
yuyvtoyv12_unscaled
;
}
}
libswscale/bfin/yuv2rgb_bfin.c
View file @
148bc235
...
...
@@ -26,14 +26,15 @@
#include <string.h>
#include <inttypes.h>
#include <assert.h>
#include "config.h"
#include <unistd.h>
#include "config.h"
#include "libswscale/rgb2rgb.h"
#include "libswscale/swscale.h"
#include "libswscale/swscale_internal.h"
#if defined(__FDPIC__) && CONFIG_SRAM
#define L1CODE __attribute__
((l1_text))
#define L1CODE __attribute__((l1_text))
#else
#define L1CODE
#endif
...
...
@@ -47,21 +48,20 @@ void ff_bfin_yuv2rgb565_line(uint8_t *Y, uint8_t *U, uint8_t *V, uint8_t *out,
void
ff_bfin_yuv2rgb24_line
(
uint8_t
*
Y
,
uint8_t
*
U
,
uint8_t
*
V
,
uint8_t
*
out
,
int
w
,
uint32_t
*
coeffs
)
L1CODE
;
typedef
void
(
*
ltransform
)(
uint8_t
*
Y
,
uint8_t
*
U
,
uint8_t
*
V
,
uint8_t
*
out
,
int
w
,
uint32_t
*
coeffs
);
typedef
void
(
*
ltransform
)(
uint8_t
*
Y
,
uint8_t
*
U
,
uint8_t
*
V
,
uint8_t
*
out
,
int
w
,
uint32_t
*
coeffs
);
static
void
bfin_prepare_coefficients
(
SwsContext
*
c
,
int
rgb
,
int
masks
)
{
int
oy
;
oy
=
c
->
yOffset
&
0xffff
;
oy
=
oy
>>
3
;
// keep everything U8.0 for offset calculation
oy
=
c
->
yOffset
&
0xffff
;
oy
=
oy
>>
3
;
// keep everything U8.0 for offset calculation
c
->
oc
=
128
*
0x01010101U
;
c
->
oy
=
oy
*
0x01010101U
;
c
->
oc
=
128
*
0x01010101U
;
c
->
oy
=
oy
*
0x01010101U
;
/* copy 64bit vector coeffs down to 32bit vector coeffs */
c
->
cy
=
c
->
yCoeff
;
c
->
cy
=
c
->
yCoeff
;
c
->
zero
=
0
;
if
(
rgb
)
{
...
...
@@ -76,7 +76,6 @@ static void bfin_prepare_coefficients(SwsContext *c, int rgb, int masks)
c
->
cgv
=
c
->
ugCoeff
;
}
if
(
masks
==
555
)
{
c
->
rmask
=
0x001f
*
0x00010001U
;
c
->
gmask
=
0x03e0
*
0x00010001U
;
...
...
@@ -88,27 +87,25 @@ static void bfin_prepare_coefficients(SwsContext *c, int rgb, int masks)
}
}
static
int
core_yuv420_rgb
(
SwsContext
*
c
,
uint8_t
**
in
,
int
*
instrides
,
int
srcSliceY
,
int
srcSliceH
,
uint8_t
**
oplanes
,
int
*
outstrides
,
ltransform
lcscf
,
int
rgb
,
int
masks
)
static
int
core_yuv420_rgb
(
SwsContext
*
c
,
uint8_t
**
in
,
int
*
instrides
,
int
srcSliceY
,
int
srcSliceH
,
uint8_t
**
oplanes
,
int
*
outstrides
,
ltransform
lcscf
,
int
rgb
,
int
masks
)
{
uint8_t
*
py
,
*
pu
,
*
pv
,
*
op
;
uint8_t
*
py
,
*
pu
,
*
pv
,
*
op
;
int
w
=
instrides
[
0
];
int
h2
=
srcSliceH
>>
1
;
int
h2
=
srcSliceH
>>
1
;
int
i
;
bfin_prepare_coefficients
(
c
,
rgb
,
masks
);
py
=
in
[
0
];
pu
=
in
[
1
+
(
1
^
rgb
)];
pv
=
in
[
1
+
(
0
^
rgb
)];
op
=
oplanes
[
0
]
+
srcSliceY
*
outstrides
[
0
];
pu
=
in
[
1
+
(
1
^
rgb
)];
pv
=
in
[
1
+
(
0
^
rgb
)];
for
(
i
=
0
;
i
<
h2
;
i
++
)
{
op
=
oplanes
[
0
]
+
srcSliceY
*
outstrides
[
0
];
for
(
i
=
0
;
i
<
h2
;
i
++
)
{
lcscf
(
py
,
pu
,
pv
,
op
,
w
,
&
c
->
oy
);
py
+=
instrides
[
0
];
...
...
@@ -125,9 +122,7 @@ static int core_yuv420_rgb(SwsContext *c,
return
srcSliceH
;
}
static
int
bfin_yuv420_rgb555
(
SwsContext
*
c
,
uint8_t
**
in
,
int
*
instrides
,
static
int
bfin_yuv420_rgb555
(
SwsContext
*
c
,
uint8_t
**
in
,
int
*
instrides
,
int
srcSliceY
,
int
srcSliceH
,
uint8_t
**
oplanes
,
int
*
outstrides
)
{
...
...
@@ -135,8 +130,7 @@ static int bfin_yuv420_rgb555(SwsContext *c,
outstrides
,
ff_bfin_yuv2rgb555_line
,
1
,
555
);
}
static
int
bfin_yuv420_bgr555
(
SwsContext
*
c
,
uint8_t
**
in
,
int
*
instrides
,
static
int
bfin_yuv420_bgr555
(
SwsContext
*
c
,
uint8_t
**
in
,
int
*
instrides
,
int
srcSliceY
,
int
srcSliceH
,
uint8_t
**
oplanes
,
int
*
outstrides
)
{
...
...
@@ -144,8 +138,7 @@ static int bfin_yuv420_bgr555(SwsContext *c,
outstrides
,
ff_bfin_yuv2rgb555_line
,
0
,
555
);
}
static
int
bfin_yuv420_rgb24
(
SwsContext
*
c
,
uint8_t
**
in
,
int
*
instrides
,
static
int
bfin_yuv420_rgb24
(
SwsContext
*
c
,
uint8_t
**
in
,
int
*
instrides
,
int
srcSliceY
,
int
srcSliceH
,
uint8_t
**
oplanes
,
int
*
outstrides
)
{
...
...
@@ -153,8 +146,7 @@ static int bfin_yuv420_rgb24(SwsContext *c,
outstrides
,
ff_bfin_yuv2rgb24_line
,
1
,
888
);
}
static
int
bfin_yuv420_bgr24
(
SwsContext
*
c
,
uint8_t
**
in
,
int
*
instrides
,
static
int
bfin_yuv420_bgr24
(
SwsContext
*
c
,
uint8_t
**
in
,
int
*
instrides
,
int
srcSliceY
,
int
srcSliceH
,
uint8_t
**
oplanes
,
int
*
outstrides
)
{
...
...
@@ -162,8 +154,7 @@ static int bfin_yuv420_bgr24(SwsContext *c,
outstrides
,
ff_bfin_yuv2rgb24_line
,
0
,
888
);
}
static
int
bfin_yuv420_rgb565
(
SwsContext
*
c
,
uint8_t
**
in
,
int
*
instrides
,
static
int
bfin_yuv420_rgb565
(
SwsContext
*
c
,
uint8_t
**
in
,
int
*
instrides
,
int
srcSliceY
,
int
srcSliceH
,
uint8_t
**
oplanes
,
int
*
outstrides
)
{
...
...
@@ -171,8 +162,7 @@ static int bfin_yuv420_rgb565(SwsContext *c,
outstrides
,
ff_bfin_yuv2rgb565_line
,
1
,
565
);
}
static
int
bfin_yuv420_bgr565
(
SwsContext
*
c
,
uint8_t
**
in
,
int
*
instrides
,
static
int
bfin_yuv420_bgr565
(
SwsContext
*
c
,
uint8_t
**
in
,
int
*
instrides
,
int
srcSliceY
,
int
srcSliceH
,
uint8_t
**
oplanes
,
int
*
outstrides
)
{
...
...
@@ -180,24 +170,35 @@ static int bfin_yuv420_bgr565(SwsContext *c,
outstrides
,
ff_bfin_yuv2rgb565_line
,
0
,
565
);
}
SwsFunc
ff_yuv2rgb_get_func_ptr_bfin
(
SwsContext
*
c
)
{
SwsFunc
f
;
switch
(
c
->
dstFormat
)
{
case
PIX_FMT_RGB555
:
f
=
bfin_yuv420_rgb555
;
break
;
case
PIX_FMT_BGR555
:
f
=
bfin_yuv420_bgr555
;
break
;
case
PIX_FMT_RGB565
:
f
=
bfin_yuv420_rgb565
;
break
;
case
PIX_FMT_BGR565
:
f
=
bfin_yuv420_bgr565
;
break
;
case
PIX_FMT_RGB24
:
f
=
bfin_yuv420_rgb24
;
break
;
case
PIX_FMT_BGR24
:
f
=
bfin_yuv420_bgr24
;
break
;
switch
(
c
->
dstFormat
)
{
case
PIX_FMT_RGB555
:
f
=
bfin_yuv420_rgb555
;
break
;
case
PIX_FMT_BGR555
:
f
=
bfin_yuv420_bgr555
;
break
;
case
PIX_FMT_RGB565
:
f
=
bfin_yuv420_rgb565
;
break
;
case
PIX_FMT_BGR565
:
f
=
bfin_yuv420_bgr565
;
break
;
case
PIX_FMT_RGB24
:
f
=
bfin_yuv420_rgb24
;
break
;
case
PIX_FMT_BGR24
:
f
=
bfin_yuv420_bgr24
;
break
;
default:
return
0
;
}
av_log
(
c
,
AV_LOG_INFO
,
"BlackFin accelerated color space converter %s
\n
"
,
sws_format_name
(
c
->
dstFormat
));
sws_format_name
(
c
->
dstFormat
));
return
f
;
}
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