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
3f07f12f
Commit
3f07f12f
authored
Dec 09, 2015
by
Kieran Kunhya
Committed by
Rostislav Pehlivanov
Dec 10, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
diracdec: Template DSP functions adding 10-bit versions
parent
95536898
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
726 additions
and
549 deletions
+726
-549
dirac_dwt.c
libavcodec/dirac_dwt.c
+23
-507
dirac_dwt.h
libavcodec/dirac_dwt.h
+10
-10
dirac_dwt_template.c
libavcodec/dirac_dwt_template.c
+615
-0
diracdec.c
libavcodec/diracdec.c
+4
-4
diracdsp.c
libavcodec/diracdsp.c
+22
-3
diracdsp.h
libavcodec/diracdsp.h
+2
-2
dirac_dwt.c
libavcodec/x86/dirac_dwt.c
+46
-19
diracdsp_mmx.c
libavcodec/x86/diracdsp_mmx.c
+2
-2
diracdsp_yasm.asm
libavcodec/x86/diracdsp_yasm.asm
+2
-2
No files found.
libavcodec/dirac_dwt.c
View file @
3f07f12f
...
...
@@ -25,523 +25,40 @@
#include "dirac_dwt.h"
#include "libavcodec/x86/dirac_dwt.h"
#define TEMPLATE_8bit
#include "dirac_dwt_template.c"
#undef TEMPLATE_8bit
static
void
vertical_compose53iL0
(
IDWTELEM
*
b0
,
IDWTELEM
*
b1
,
IDWTELEM
*
b2
,
int
width
)
{
int
i
;
for
(
i
=
0
;
i
<
width
;
i
++
)
b1
[
i
]
-=
(
b0
[
i
]
+
b2
[
i
]
+
2
)
>>
2
;
}
static
av_always_inline
void
interleave
(
IDWTELEM
*
dst
,
IDWTELEM
*
src0
,
IDWTELEM
*
src1
,
int
w2
,
int
add
,
int
shift
)
{
int
i
;
for
(
i
=
0
;
i
<
w2
;
i
++
)
{
dst
[
2
*
i
]
=
(
src0
[
i
]
+
add
)
>>
shift
;
dst
[
2
*
i
+
1
]
=
(
src1
[
i
]
+
add
)
>>
shift
;
}
}
static
void
horizontal_compose_dirac53i
(
IDWTELEM
*
b
,
IDWTELEM
*
temp
,
int
w
)
{
const
int
w2
=
w
>>
1
;
int
x
;
temp
[
0
]
=
COMPOSE_53iL0
(
b
[
w2
],
b
[
0
],
b
[
w2
]);
for
(
x
=
1
;
x
<
w2
;
x
++
)
{
temp
[
x
]
=
COMPOSE_53iL0
(
b
[
x
+
w2
-
1
],
b
[
x
],
b
[
x
+
w2
]);
temp
[
x
+
w2
-
1
]
=
COMPOSE_DIRAC53iH0
(
temp
[
x
-
1
],
b
[
x
+
w2
-
1
],
temp
[
x
]);
}
temp
[
w
-
1
]
=
COMPOSE_DIRAC53iH0
(
temp
[
w2
-
1
],
b
[
w
-
1
],
temp
[
w2
-
1
]);
interleave
(
b
,
temp
,
temp
+
w2
,
w2
,
1
,
1
);
}
static
void
horizontal_compose_dd97i
(
IDWTELEM
*
b
,
IDWTELEM
*
tmp
,
int
w
)
{
const
int
w2
=
w
>>
1
;
int
x
;
tmp
[
0
]
=
COMPOSE_53iL0
(
b
[
w2
],
b
[
0
],
b
[
w2
]);
for
(
x
=
1
;
x
<
w2
;
x
++
)
tmp
[
x
]
=
COMPOSE_53iL0
(
b
[
x
+
w2
-
1
],
b
[
x
],
b
[
x
+
w2
]);
// extend the edges
tmp
[
-
1
]
=
tmp
[
0
];
tmp
[
w2
+
1
]
=
tmp
[
w2
]
=
tmp
[
w2
-
1
];
for
(
x
=
0
;
x
<
w2
;
x
++
)
{
b
[
2
*
x
]
=
(
tmp
[
x
]
+
1
)
>>
1
;
b
[
2
*
x
+
1
]
=
(
COMPOSE_DD97iH0
(
tmp
[
x
-
1
],
tmp
[
x
],
b
[
x
+
w2
],
tmp
[
x
+
1
],
tmp
[
x
+
2
])
+
1
)
>>
1
;
}
}
static
void
horizontal_compose_dd137i
(
IDWTELEM
*
b
,
IDWTELEM
*
tmp
,
int
w
)
{
const
int
w2
=
w
>>
1
;
int
x
;
tmp
[
0
]
=
COMPOSE_DD137iL0
(
b
[
w2
],
b
[
w2
],
b
[
0
],
b
[
w2
],
b
[
w2
+
1
]);
tmp
[
1
]
=
COMPOSE_DD137iL0
(
b
[
w2
],
b
[
w2
],
b
[
1
],
b
[
w2
+
1
],
b
[
w2
+
2
]);
for
(
x
=
2
;
x
<
w2
-
1
;
x
++
)
tmp
[
x
]
=
COMPOSE_DD137iL0
(
b
[
x
+
w2
-
2
],
b
[
x
+
w2
-
1
],
b
[
x
],
b
[
x
+
w2
],
b
[
x
+
w2
+
1
]);
tmp
[
w2
-
1
]
=
COMPOSE_DD137iL0
(
b
[
w
-
3
],
b
[
w
-
2
],
b
[
w2
-
1
],
b
[
w
-
1
],
b
[
w
-
1
]);
// extend the edges
tmp
[
-
1
]
=
tmp
[
0
];
tmp
[
w2
+
1
]
=
tmp
[
w2
]
=
tmp
[
w2
-
1
];
for
(
x
=
0
;
x
<
w2
;
x
++
)
{
b
[
2
*
x
]
=
(
tmp
[
x
]
+
1
)
>>
1
;
b
[
2
*
x
+
1
]
=
(
COMPOSE_DD97iH0
(
tmp
[
x
-
1
],
tmp
[
x
],
b
[
x
+
w2
],
tmp
[
x
+
1
],
tmp
[
x
+
2
])
+
1
)
>>
1
;
}
}
static
av_always_inline
void
horizontal_compose_haari
(
IDWTELEM
*
b
,
IDWTELEM
*
temp
,
int
w
,
int
shift
)
{
const
int
w2
=
w
>>
1
;
int
x
;
for
(
x
=
0
;
x
<
w2
;
x
++
)
{
temp
[
x
]
=
COMPOSE_HAARiL0
(
b
[
x
],
b
[
x
+
w2
]);
temp
[
x
+
w2
]
=
COMPOSE_HAARiH0
(
b
[
x
+
w2
],
temp
[
x
]);
}
interleave
(
b
,
temp
,
temp
+
w2
,
w2
,
shift
,
shift
);
}
static
void
horizontal_compose_haar0i
(
IDWTELEM
*
b
,
IDWTELEM
*
temp
,
int
w
)
{
horizontal_compose_haari
(
b
,
temp
,
w
,
0
);
}
static
void
horizontal_compose_haar1i
(
IDWTELEM
*
b
,
IDWTELEM
*
temp
,
int
w
)
{
horizontal_compose_haari
(
b
,
temp
,
w
,
1
);
}
static
void
horizontal_compose_fidelityi
(
IDWTELEM
*
b
,
IDWTELEM
*
tmp
,
int
w
)
{
const
int
w2
=
w
>>
1
;
int
i
,
x
;
IDWTELEM
v
[
8
];
for
(
x
=
0
;
x
<
w2
;
x
++
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
v
[
i
]
=
b
[
av_clip
(
x
-
3
+
i
,
0
,
w2
-
1
)];
tmp
[
x
]
=
COMPOSE_FIDELITYiH0
(
v
[
0
],
v
[
1
],
v
[
2
],
v
[
3
],
b
[
x
+
w2
],
v
[
4
],
v
[
5
],
v
[
6
],
v
[
7
]);
}
for
(
x
=
0
;
x
<
w2
;
x
++
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
v
[
i
]
=
tmp
[
av_clip
(
x
-
4
+
i
,
0
,
w2
-
1
)];
tmp
[
x
+
w2
]
=
COMPOSE_FIDELITYiL0
(
v
[
0
],
v
[
1
],
v
[
2
],
v
[
3
],
b
[
x
],
v
[
4
],
v
[
5
],
v
[
6
],
v
[
7
]);
}
interleave
(
b
,
tmp
+
w2
,
tmp
,
w2
,
0
,
0
);
}
static
void
horizontal_compose_daub97i
(
IDWTELEM
*
b
,
IDWTELEM
*
temp
,
int
w
)
{
const
int
w2
=
w
>>
1
;
int
x
,
b0
,
b1
,
b2
;
temp
[
0
]
=
COMPOSE_DAUB97iL1
(
b
[
w2
],
b
[
0
],
b
[
w2
]);
for
(
x
=
1
;
x
<
w2
;
x
++
)
{
temp
[
x
]
=
COMPOSE_DAUB97iL1
(
b
[
x
+
w2
-
1
],
b
[
x
],
b
[
x
+
w2
]);
temp
[
x
+
w2
-
1
]
=
COMPOSE_DAUB97iH1
(
temp
[
x
-
1
],
b
[
x
+
w2
-
1
],
temp
[
x
]);
}
temp
[
w
-
1
]
=
COMPOSE_DAUB97iH1
(
temp
[
w2
-
1
],
b
[
w
-
1
],
temp
[
w2
-
1
]);
// second stage combined with interleave and shift
b0
=
b2
=
COMPOSE_DAUB97iL0
(
temp
[
w2
],
temp
[
0
],
temp
[
w2
]);
b
[
0
]
=
(
b0
+
1
)
>>
1
;
for
(
x
=
1
;
x
<
w2
;
x
++
)
{
b2
=
COMPOSE_DAUB97iL0
(
temp
[
x
+
w2
-
1
],
temp
[
x
],
temp
[
x
+
w2
]);
b1
=
COMPOSE_DAUB97iH0
(
b0
,
temp
[
x
+
w2
-
1
],
b2
);
b
[
2
*
x
-
1
]
=
(
b1
+
1
)
>>
1
;
b
[
2
*
x
]
=
(
b2
+
1
)
>>
1
;
b0
=
b2
;
}
b
[
w
-
1
]
=
(
COMPOSE_DAUB97iH0
(
b2
,
temp
[
w
-
1
],
b2
)
+
1
)
>>
1
;
}
static
void
vertical_compose_dirac53iH0
(
IDWTELEM
*
b0
,
IDWTELEM
*
b1
,
IDWTELEM
*
b2
,
int
width
)
{
int
i
;
for
(
i
=
0
;
i
<
width
;
i
++
){
b1
[
i
]
=
COMPOSE_DIRAC53iH0
(
b0
[
i
],
b1
[
i
],
b2
[
i
]);
}
}
static
void
vertical_compose_dd97iH0
(
IDWTELEM
*
b0
,
IDWTELEM
*
b1
,
IDWTELEM
*
b2
,
IDWTELEM
*
b3
,
IDWTELEM
*
b4
,
int
width
)
{
int
i
;
for
(
i
=
0
;
i
<
width
;
i
++
){
b2
[
i
]
=
COMPOSE_DD97iH0
(
b0
[
i
],
b1
[
i
],
b2
[
i
],
b3
[
i
],
b4
[
i
]);
}
}
static
void
vertical_compose_dd137iL0
(
IDWTELEM
*
b0
,
IDWTELEM
*
b1
,
IDWTELEM
*
b2
,
IDWTELEM
*
b3
,
IDWTELEM
*
b4
,
int
width
)
{
int
i
;
for
(
i
=
0
;
i
<
width
;
i
++
){
b2
[
i
]
=
COMPOSE_DD137iL0
(
b0
[
i
],
b1
[
i
],
b2
[
i
],
b3
[
i
],
b4
[
i
]);
}
}
static
void
vertical_compose_haar
(
IDWTELEM
*
b0
,
IDWTELEM
*
b1
,
int
width
)
{
int
i
;
for
(
i
=
0
;
i
<
width
;
i
++
)
{
b0
[
i
]
=
COMPOSE_HAARiL0
(
b0
[
i
],
b1
[
i
]);
b1
[
i
]
=
COMPOSE_HAARiH0
(
b1
[
i
],
b0
[
i
]);
}
}
static
void
vertical_compose_fidelityiH0
(
IDWTELEM
*
dst
,
IDWTELEM
*
b
[
8
],
int
width
)
{
int
i
;
for
(
i
=
0
;
i
<
width
;
i
++
){
dst
[
i
]
=
COMPOSE_FIDELITYiH0
(
b
[
0
][
i
],
b
[
1
][
i
],
b
[
2
][
i
],
b
[
3
][
i
],
dst
[
i
],
b
[
4
][
i
],
b
[
5
][
i
],
b
[
6
][
i
],
b
[
7
][
i
]);
}
}
static
void
vertical_compose_fidelityiL0
(
IDWTELEM
*
dst
,
IDWTELEM
*
b
[
8
],
int
width
)
{
int
i
;
for
(
i
=
0
;
i
<
width
;
i
++
){
dst
[
i
]
=
COMPOSE_FIDELITYiL0
(
b
[
0
][
i
],
b
[
1
][
i
],
b
[
2
][
i
],
b
[
3
][
i
],
dst
[
i
],
b
[
4
][
i
],
b
[
5
][
i
],
b
[
6
][
i
],
b
[
7
][
i
]);
}
}
static
void
vertical_compose_daub97iH0
(
IDWTELEM
*
b0
,
IDWTELEM
*
b1
,
IDWTELEM
*
b2
,
int
width
)
{
int
i
;
for
(
i
=
0
;
i
<
width
;
i
++
){
b1
[
i
]
=
COMPOSE_DAUB97iH0
(
b0
[
i
],
b1
[
i
],
b2
[
i
]);
}
}
static
void
vertical_compose_daub97iH1
(
IDWTELEM
*
b0
,
IDWTELEM
*
b1
,
IDWTELEM
*
b2
,
int
width
)
{
int
i
;
for
(
i
=
0
;
i
<
width
;
i
++
){
b1
[
i
]
=
COMPOSE_DAUB97iH1
(
b0
[
i
],
b1
[
i
],
b2
[
i
]);
}
}
static
void
vertical_compose_daub97iL0
(
IDWTELEM
*
b0
,
IDWTELEM
*
b1
,
IDWTELEM
*
b2
,
int
width
)
{
int
i
;
for
(
i
=
0
;
i
<
width
;
i
++
){
b1
[
i
]
=
COMPOSE_DAUB97iL0
(
b0
[
i
],
b1
[
i
],
b2
[
i
]);
}
}
static
void
vertical_compose_daub97iL1
(
IDWTELEM
*
b0
,
IDWTELEM
*
b1
,
IDWTELEM
*
b2
,
int
width
)
{
int
i
;
for
(
i
=
0
;
i
<
width
;
i
++
){
b1
[
i
]
=
COMPOSE_DAUB97iL1
(
b0
[
i
],
b1
[
i
],
b2
[
i
]);
}
}
static
void
spatial_compose_dd97i_dy
(
DWTContext
*
d
,
int
level
,
int
width
,
int
height
,
int
stride
)
{
vertical_compose_3tap
vertical_compose_l0
=
(
void
*
)
d
->
vertical_compose_l0
;
vertical_compose_5tap
vertical_compose_h0
=
(
void
*
)
d
->
vertical_compose_h0
;
DWTCompose
*
cs
=
d
->
cs
+
level
;
int
i
,
y
=
cs
->
y
;
IDWTELEM
*
b
[
8
];
for
(
i
=
0
;
i
<
6
;
i
++
)
b
[
i
]
=
cs
->
b
[
i
];
b
[
6
]
=
d
->
buffer
+
av_clip
(
y
+
5
,
0
,
height
-
2
)
*
stride
;
b
[
7
]
=
d
->
buffer
+
av_clip
(
y
+
6
,
1
,
height
-
1
)
*
stride
;
if
(
y
+
5
<
(
unsigned
)
height
)
vertical_compose_l0
(
b
[
5
],
b
[
6
],
b
[
7
],
width
);
if
(
y
+
1
<
(
unsigned
)
height
)
vertical_compose_h0
(
b
[
0
],
b
[
2
],
b
[
3
],
b
[
4
],
b
[
6
],
width
);
if
(
y
-
1
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
0
],
d
->
temp
,
width
);
if
(
y
+
0
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
1
],
d
->
temp
,
width
);
for
(
i
=
0
;
i
<
6
;
i
++
)
cs
->
b
[
i
]
=
b
[
i
+
2
];
cs
->
y
+=
2
;
}
static
void
spatial_compose_dirac53i_dy
(
DWTContext
*
d
,
int
level
,
int
width
,
int
height
,
int
stride
)
{
vertical_compose_3tap
vertical_compose_l0
=
(
void
*
)
d
->
vertical_compose_l0
;
vertical_compose_3tap
vertical_compose_h0
=
(
void
*
)
d
->
vertical_compose_h0
;
DWTCompose
*
cs
=
d
->
cs
+
level
;
int
y
=
cs
->
y
;
IDWTELEM
*
b
[
4
]
=
{
cs
->
b
[
0
],
cs
->
b
[
1
]
};
b
[
2
]
=
d
->
buffer
+
avpriv_mirror
(
y
+
1
,
height
-
1
)
*
stride
;
b
[
3
]
=
d
->
buffer
+
avpriv_mirror
(
y
+
2
,
height
-
1
)
*
stride
;
if
(
y
+
1
<
(
unsigned
)
height
)
vertical_compose_l0
(
b
[
1
],
b
[
2
],
b
[
3
],
width
);
if
(
y
+
0
<
(
unsigned
)
height
)
vertical_compose_h0
(
b
[
0
],
b
[
1
],
b
[
2
],
width
);
if
(
y
-
1
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
0
],
d
->
temp
,
width
);
if
(
y
+
0
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
1
],
d
->
temp
,
width
);
cs
->
b
[
0
]
=
b
[
2
];
cs
->
b
[
1
]
=
b
[
3
];
cs
->
y
+=
2
;
}
static
void
spatial_compose_dd137i_dy
(
DWTContext
*
d
,
int
level
,
int
width
,
int
height
,
int
stride
)
{
vertical_compose_5tap
vertical_compose_l0
=
(
void
*
)
d
->
vertical_compose_l0
;
vertical_compose_5tap
vertical_compose_h0
=
(
void
*
)
d
->
vertical_compose_h0
;
DWTCompose
*
cs
=
d
->
cs
+
level
;
int
i
,
y
=
cs
->
y
;
IDWTELEM
*
b
[
10
];
for
(
i
=
0
;
i
<
8
;
i
++
)
b
[
i
]
=
cs
->
b
[
i
];
b
[
8
]
=
d
->
buffer
+
av_clip
(
y
+
7
,
0
,
height
-
2
)
*
stride
;
b
[
9
]
=
d
->
buffer
+
av_clip
(
y
+
8
,
1
,
height
-
1
)
*
stride
;
if
(
y
+
5
<
(
unsigned
)
height
)
vertical_compose_l0
(
b
[
3
],
b
[
5
],
b
[
6
],
b
[
7
],
b
[
9
],
width
);
if
(
y
+
1
<
(
unsigned
)
height
)
vertical_compose_h0
(
b
[
0
],
b
[
2
],
b
[
3
],
b
[
4
],
b
[
6
],
width
);
#define TEMPLATE_10bit
#include "dirac_dwt_template.c"
#undef TEMPLATE_10bit
if
(
y
-
1
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
0
],
d
->
temp
,
width
);
if
(
y
+
0
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
1
],
d
->
temp
,
width
);
#define TEMPLATE_12bit
#include "dirac_dwt_template.c"
#undef TEMPLATE_12bit
for
(
i
=
0
;
i
<
8
;
i
++
)
cs
->
b
[
i
]
=
b
[
i
+
2
];
cs
->
y
+=
2
;
}
// haar makes the assumption that height is even (always true for dirac)
static
void
spatial_compose_haari_dy
(
DWTContext
*
d
,
int
level
,
int
width
,
int
height
,
int
stride
)
{
vertical_compose_2tap
vertical_compose
=
(
void
*
)
d
->
vertical_compose
;
int
y
=
d
->
cs
[
level
].
y
;
IDWTELEM
*
b0
=
d
->
buffer
+
(
y
-
1
)
*
stride
;
IDWTELEM
*
b1
=
d
->
buffer
+
(
y
)
*
stride
;
vertical_compose
(
b0
,
b1
,
width
);
d
->
horizontal_compose
(
b0
,
d
->
temp
,
width
);
d
->
horizontal_compose
(
b1
,
d
->
temp
,
width
);
d
->
cs
[
level
].
y
+=
2
;
}
// Don't do sliced idwt for fidelity; the 9 tap filter makes it a bit annoying
// Fortunately, this filter isn't used in practice.
static
void
spatial_compose_fidelity
(
DWTContext
*
d
,
int
level
,
int
width
,
int
height
,
int
stride
)
{
vertical_compose_9tap
vertical_compose_l0
=
(
void
*
)
d
->
vertical_compose_l0
;
vertical_compose_9tap
vertical_compose_h0
=
(
void
*
)
d
->
vertical_compose_h0
;
int
i
,
y
;
IDWTELEM
*
b
[
8
];
for
(
y
=
1
;
y
<
height
;
y
+=
2
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
b
[
i
]
=
d
->
buffer
+
av_clip
((
y
-
7
+
2
*
i
),
0
,
height
-
2
)
*
stride
;
vertical_compose_h0
(
d
->
buffer
+
y
*
stride
,
b
,
width
);
}
for
(
y
=
0
;
y
<
height
;
y
+=
2
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
b
[
i
]
=
d
->
buffer
+
av_clip
((
y
-
7
+
2
*
i
),
1
,
height
-
1
)
*
stride
;
vertical_compose_l0
(
d
->
buffer
+
y
*
stride
,
b
,
width
);
}
for
(
y
=
0
;
y
<
height
;
y
++
)
d
->
horizontal_compose
(
d
->
buffer
+
y
*
stride
,
d
->
temp
,
width
);
d
->
cs
[
level
].
y
=
height
+
1
;
}
static
void
spatial_compose_daub97i_dy
(
DWTContext
*
d
,
int
level
,
int
width
,
int
height
,
int
stride
)
{
vertical_compose_3tap
vertical_compose_l0
=
(
void
*
)
d
->
vertical_compose_l0
;
vertical_compose_3tap
vertical_compose_h0
=
(
void
*
)
d
->
vertical_compose_h0
;
vertical_compose_3tap
vertical_compose_l1
=
(
void
*
)
d
->
vertical_compose_l1
;
vertical_compose_3tap
vertical_compose_h1
=
(
void
*
)
d
->
vertical_compose_h1
;
DWTCompose
*
cs
=
d
->
cs
+
level
;
int
i
,
y
=
cs
->
y
;
IDWTELEM
*
b
[
6
];
for
(
i
=
0
;
i
<
4
;
i
++
)
b
[
i
]
=
cs
->
b
[
i
];
b
[
4
]
=
d
->
buffer
+
avpriv_mirror
(
y
+
3
,
height
-
1
)
*
stride
;
b
[
5
]
=
d
->
buffer
+
avpriv_mirror
(
y
+
4
,
height
-
1
)
*
stride
;
if
(
y
+
3
<
(
unsigned
)
height
)
vertical_compose_l1
(
b
[
3
],
b
[
4
],
b
[
5
],
width
);
if
(
y
+
2
<
(
unsigned
)
height
)
vertical_compose_h1
(
b
[
2
],
b
[
3
],
b
[
4
],
width
);
if
(
y
+
1
<
(
unsigned
)
height
)
vertical_compose_l0
(
b
[
1
],
b
[
2
],
b
[
3
],
width
);
if
(
y
+
0
<
(
unsigned
)
height
)
vertical_compose_h0
(
b
[
0
],
b
[
1
],
b
[
2
],
width
);
if
(
y
-
1
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
0
],
d
->
temp
,
width
);
if
(
y
+
0
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
1
],
d
->
temp
,
width
);
for
(
i
=
0
;
i
<
4
;
i
++
)
cs
->
b
[
i
]
=
b
[
i
+
2
];
cs
->
y
+=
2
;
}
static
void
spatial_compose97i_init2
(
DWTCompose
*
cs
,
IDWTELEM
*
buffer
,
int
height
,
int
stride
)
{
cs
->
b
[
0
]
=
buffer
+
avpriv_mirror
(
-
3
-
1
,
height
-
1
)
*
stride
;
cs
->
b
[
1
]
=
buffer
+
avpriv_mirror
(
-
3
,
height
-
1
)
*
stride
;
cs
->
b
[
2
]
=
buffer
+
avpriv_mirror
(
-
3
+
1
,
height
-
1
)
*
stride
;
cs
->
b
[
3
]
=
buffer
+
avpriv_mirror
(
-
3
+
2
,
height
-
1
)
*
stride
;
cs
->
y
=
-
3
;
}
static
void
spatial_compose53i_init2
(
DWTCompose
*
cs
,
IDWTELEM
*
buffer
,
int
height
,
int
stride
)
{
cs
->
b
[
0
]
=
buffer
+
avpriv_mirror
(
-
1
-
1
,
height
-
1
)
*
stride
;
cs
->
b
[
1
]
=
buffer
+
avpriv_mirror
(
-
1
,
height
-
1
)
*
stride
;
cs
->
y
=
-
1
;
}
static
void
spatial_compose_dd97i_init
(
DWTCompose
*
cs
,
IDWTELEM
*
buffer
,
int
height
,
int
stride
)
{
cs
->
b
[
0
]
=
buffer
+
av_clip
(
-
5
-
1
,
0
,
height
-
2
)
*
stride
;
cs
->
b
[
1
]
=
buffer
+
av_clip
(
-
5
,
1
,
height
-
1
)
*
stride
;
cs
->
b
[
2
]
=
buffer
+
av_clip
(
-
5
+
1
,
0
,
height
-
2
)
*
stride
;
cs
->
b
[
3
]
=
buffer
+
av_clip
(
-
5
+
2
,
1
,
height
-
1
)
*
stride
;
cs
->
b
[
4
]
=
buffer
+
av_clip
(
-
5
+
3
,
0
,
height
-
2
)
*
stride
;
cs
->
b
[
5
]
=
buffer
+
av_clip
(
-
5
+
4
,
1
,
height
-
1
)
*
stride
;
cs
->
y
=
-
5
;
}
static
void
spatial_compose_dd137i_init
(
DWTCompose
*
cs
,
IDWTELEM
*
buffer
,
int
height
,
int
stride
)
{
cs
->
b
[
0
]
=
buffer
+
av_clip
(
-
5
-
1
,
0
,
height
-
2
)
*
stride
;
cs
->
b
[
1
]
=
buffer
+
av_clip
(
-
5
,
1
,
height
-
1
)
*
stride
;
cs
->
b
[
2
]
=
buffer
+
av_clip
(
-
5
+
1
,
0
,
height
-
2
)
*
stride
;
cs
->
b
[
3
]
=
buffer
+
av_clip
(
-
5
+
2
,
1
,
height
-
1
)
*
stride
;
cs
->
b
[
4
]
=
buffer
+
av_clip
(
-
5
+
3
,
0
,
height
-
2
)
*
stride
;
cs
->
b
[
5
]
=
buffer
+
av_clip
(
-
5
+
4
,
1
,
height
-
1
)
*
stride
;
cs
->
b
[
6
]
=
buffer
+
av_clip
(
-
5
+
5
,
0
,
height
-
2
)
*
stride
;
cs
->
b
[
7
]
=
buffer
+
av_clip
(
-
5
+
6
,
1
,
height
-
1
)
*
stride
;
cs
->
y
=
-
5
;
}
int
ff_spatial_idwt_init2
(
DWTContext
*
d
,
IDWTELEM
*
buffer
,
int
width
,
int
height
,
int
ff_spatial_idwt_init2
(
DWTContext
*
d
,
uint8_t
*
buffer
,
int
width
,
int
height
,
int
stride
,
enum
dwt_type
type
,
int
decomposition_count
,
IDWTELEM
*
temp
)
uint8_t
*
temp
,
int
bit_depth
)
{
int
level
;
int
ret
=
0
;
d
->
buffer
=
buffer
;
d
->
width
=
width
;
d
->
height
=
height
;
d
->
stride
=
stride
;
d
->
decomposition_count
=
decomposition_count
;
d
->
temp
=
temp
+
8
;
if
(
bit_depth
==
8
)
ret
=
ff_spatial_idwt_init2_8bit
(
d
,
buffer
,
width
,
height
,
stride
,
type
,
decomposition_count
,
temp
);
else
if
(
bit_depth
==
10
)
ret
=
ff_spatial_idwt_init2_10bit
(
d
,
buffer
,
width
,
height
,
stride
,
type
,
decomposition_count
,
temp
);
else
if
(
bit_depth
==
12
)
ret
=
ff_spatial_idwt_init2_12bit
(
d
,
buffer
,
width
,
height
,
stride
,
type
,
decomposition_count
,
temp
);
else
av_log
(
NULL
,
AV_LOG_WARNING
,
"Unsupported bit depth = %i
\n
"
,
bit_depth
);
for
(
level
=
decomposition_count
-
1
;
level
>=
0
;
level
--
){
int
hl
=
height
>>
level
;
int
stride_l
=
stride
<<
level
;
switch
(
type
){
case
DWT_DIRAC_DD9_7
:
spatial_compose_dd97i_init
(
d
->
cs
+
level
,
buffer
,
hl
,
stride_l
);
break
;
case
DWT_DIRAC_LEGALL5_3
:
spatial_compose53i_init2
(
d
->
cs
+
level
,
buffer
,
hl
,
stride_l
);
break
;
case
DWT_DIRAC_DD13_7
:
spatial_compose_dd137i_init
(
d
->
cs
+
level
,
buffer
,
hl
,
stride_l
);
break
;
case
DWT_DIRAC_HAAR0
:
case
DWT_DIRAC_HAAR1
:
d
->
cs
[
level
].
y
=
1
;
break
;
case
DWT_DIRAC_DAUB9_7
:
spatial_compose97i_init2
(
d
->
cs
+
level
,
buffer
,
hl
,
stride_l
);
break
;
default:
d
->
cs
[
level
].
y
=
0
;
break
;
}
}
switch
(
type
)
{
case
DWT_DIRAC_DD9_7
:
d
->
spatial_compose
=
spatial_compose_dd97i_dy
;
d
->
vertical_compose_l0
=
(
void
*
)
vertical_compose53iL0
;
d
->
vertical_compose_h0
=
(
void
*
)
vertical_compose_dd97iH0
;
d
->
horizontal_compose
=
horizontal_compose_dd97i
;
d
->
support
=
7
;
break
;
case
DWT_DIRAC_LEGALL5_3
:
d
->
spatial_compose
=
spatial_compose_dirac53i_dy
;
d
->
vertical_compose_l0
=
(
void
*
)
vertical_compose53iL0
;
d
->
vertical_compose_h0
=
(
void
*
)
vertical_compose_dirac53iH0
;
d
->
horizontal_compose
=
horizontal_compose_dirac53i
;
d
->
support
=
3
;
break
;
case
DWT_DIRAC_DD13_7
:
d
->
spatial_compose
=
spatial_compose_dd137i_dy
;
d
->
vertical_compose_l0
=
(
void
*
)
vertical_compose_dd137iL0
;
d
->
vertical_compose_h0
=
(
void
*
)
vertical_compose_dd97iH0
;
d
->
horizontal_compose
=
horizontal_compose_dd137i
;
d
->
support
=
7
;
break
;
case
DWT_DIRAC_HAAR0
:
case
DWT_DIRAC_HAAR1
:
d
->
spatial_compose
=
spatial_compose_haari_dy
;
d
->
vertical_compose
=
(
void
*
)
vertical_compose_haar
;
if
(
type
==
DWT_DIRAC_HAAR0
)
d
->
horizontal_compose
=
horizontal_compose_haar0i
;
else
d
->
horizontal_compose
=
horizontal_compose_haar1i
;
d
->
support
=
1
;
break
;
case
DWT_DIRAC_FIDELITY
:
d
->
spatial_compose
=
spatial_compose_fidelity
;
d
->
vertical_compose_l0
=
(
void
*
)
vertical_compose_fidelityiL0
;
d
->
vertical_compose_h0
=
(
void
*
)
vertical_compose_fidelityiH0
;
d
->
horizontal_compose
=
horizontal_compose_fidelityi
;
d
->
support
=
0
;
// not really used
break
;
case
DWT_DIRAC_DAUB9_7
:
d
->
spatial_compose
=
spatial_compose_daub97i_dy
;
d
->
vertical_compose_l0
=
(
void
*
)
vertical_compose_daub97iL0
;
d
->
vertical_compose_h0
=
(
void
*
)
vertical_compose_daub97iH0
;
d
->
vertical_compose_l1
=
(
void
*
)
vertical_compose_daub97iL1
;
d
->
vertical_compose_h1
=
(
void
*
)
vertical_compose_daub97iH1
;
d
->
horizontal_compose
=
horizontal_compose_daub97i
;
d
->
support
=
5
;
break
;
default:
if
(
ret
)
{
av_log
(
NULL
,
AV_LOG_ERROR
,
"Unknown wavelet type %d
\n
"
,
type
);
return
AVERROR_INVALIDDATA
;
}
if
(
HAVE_MMX
)
ff_spatial_idwt_init_mmx
(
d
,
type
);
if
(
bit_depth
==
8
&&
HAVE_MMX
)
ff_spatial_idwt_init_mmx
(
d
,
type
);
return
0
;
}
...
...
@@ -558,4 +75,3 @@ void ff_spatial_idwt_slice2(DWTContext *d, int y)
d
->
spatial_compose
(
d
,
level
,
wl
,
hl
,
stride_l
);
}
}
libavcodec/dirac_dwt.h
View file @
3f07f12f
...
...
@@ -30,21 +30,21 @@ typedef short IDWTELEM;
#define MAX_DECOMPOSITIONS 8
typedef
struct
DWTCompose
{
IDWTELEM
*
b
[
MAX_DWT_SUPPORT
];
uint8_t
*
b
[
MAX_DWT_SUPPORT
];
int
y
;
}
DWTCompose
;
struct
DWTContext
;
// Possible prototypes for vertical_compose functions
typedef
void
(
*
vertical_compose_2tap
)(
IDWTELEM
*
b0
,
IDWTELEM
*
b1
,
int
width
);
typedef
void
(
*
vertical_compose_3tap
)(
IDWTELEM
*
b0
,
IDWTELEM
*
b1
,
IDWTELEM
*
b2
,
int
width
);
typedef
void
(
*
vertical_compose_5tap
)(
IDWTELEM
*
b0
,
IDWTELEM
*
b1
,
IDWTELEM
*
b2
,
IDWTELEM
*
b3
,
IDWTELEM
*
b4
,
int
width
);
typedef
void
(
*
vertical_compose_9tap
)(
IDWTELEM
*
dst
,
IDWTELEM
*
b
[
8
],
int
width
);
typedef
void
(
*
vertical_compose_2tap
)(
uint8_t
*
b0
,
uint8_t
*
b1
,
int
width
);
typedef
void
(
*
vertical_compose_3tap
)(
uint8_t
*
b0
,
uint8_t
*
b1
,
uint8_t
*
b2
,
int
width
);
typedef
void
(
*
vertical_compose_5tap
)(
uint8_t
*
b0
,
uint8_t
*
b1
,
uint8_t
*
b2
,
uint8_t
*
b3
,
uint8_t
*
b4
,
int
width
);
typedef
void
(
*
vertical_compose_9tap
)(
uint8_t
*
dst
,
uint8_t
*
b
[
8
],
int
width
);
typedef
struct
DWTContext
{
IDWTELEM
*
buffer
;
IDWTELEM
*
temp
;
uint8_t
*
buffer
;
uint8_t
*
temp
;
int
width
;
int
height
;
int
stride
;
...
...
@@ -57,7 +57,7 @@ typedef struct DWTContext {
void
(
*
vertical_compose_l1
)(
void
);
void
(
*
vertical_compose_h1
)(
void
);
void
(
*
vertical_compose
)(
void
);
///< one set of lowpass and highpass combined
void
(
*
horizontal_compose
)(
IDWTELEM
*
b
,
IDWTELEM
*
tmp
,
int
width
);
void
(
*
horizontal_compose
)(
uint8_t
*
b
,
uint8_t
*
tmp
,
int
width
);
DWTCompose
cs
[
MAX_DECOMPOSITIONS
];
}
DWTContext
;
...
...
@@ -76,9 +76,9 @@ enum dwt_type {
};
// -1 if an error occurred, e.g. the dwt_type isn't recognized
int
ff_spatial_idwt_init2
(
DWTContext
*
d
,
IDWTELEM
*
buffer
,
int
width
,
int
height
,
int
ff_spatial_idwt_init2
(
DWTContext
*
d
,
uint8_t
*
buffer
,
int
width
,
int
height
,
int
stride
,
enum
dwt_type
type
,
int
decomposition_count
,
IDWTELEM
*
temp
);
uint8_t
*
temp
,
int
bit_depth
);
void
ff_spatial_idwt_slice2
(
DWTContext
*
d
,
int
y
);
...
...
libavcodec/dirac_dwt_template.c
0 → 100644
View file @
3f07f12f
/*
* Copyright (C) 2004-2010 Michael Niedermayer <michaelni@gmx.at>
* Copyright (C) 2008 David Conrad
* Copyright (C) 2015 Open Broadcast Systems Ltd.
* Author (C) 2015 Rostislav Pehlivanov <atomnuker@gmail.com>
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#if defined(TEMPLATE_8bit)
# define RENAME(N) N ## _8bit
# define TYPE int16_t
# undef TEMPLATE_8bit
#elif defined(TEMPLATE_10bit)
# define RENAME(N) N ## _10bit
# define TYPE int32_t
# undef TEMPLATE_10bit
#elif defined(TEMPLATE_12bit)
# define RENAME(N) N ## _12bit
# define TYPE int32_t
# undef TEMPLATE_12bit
#endif
static
void
RENAME
(
vertical_compose53iL0
)(
uint8_t
*
_b0
,
uint8_t
*
_b1
,
uint8_t
*
_b2
,
int
width
)
{
int
i
;
TYPE
*
b0
=
(
TYPE
*
)
_b0
;
TYPE
*
b1
=
(
TYPE
*
)
_b1
;
TYPE
*
b2
=
(
TYPE
*
)
_b2
;
for
(
i
=
0
;
i
<
width
;
i
++
)
b1
[
i
]
-=
(
b0
[
i
]
+
b2
[
i
]
+
2
)
>>
2
;
}
static
av_always_inline
void
RENAME
(
interleave
)(
TYPE
*
dst
,
TYPE
*
src0
,
TYPE
*
src1
,
int
w2
,
int
add
,
int
shift
)
{
int
i
;
for
(
i
=
0
;
i
<
w2
;
i
++
)
{
dst
[
2
*
i
]
=
(
src0
[
i
]
+
add
)
>>
shift
;
dst
[
2
*
i
+
1
]
=
(
src1
[
i
]
+
add
)
>>
shift
;
}
}
static
void
RENAME
(
horizontal_compose_dirac53i
)(
uint8_t
*
_b
,
uint8_t
*
_temp
,
int
w
)
{
int
x
;
const
int
w2
=
w
>>
1
;
TYPE
*
b
=
(
TYPE
*
)
_b
;
TYPE
*
temp
=
(
TYPE
*
)
_temp
;
temp
[
0
]
=
COMPOSE_53iL0
(
b
[
w2
],
b
[
0
],
b
[
w2
]);
for
(
x
=
1
;
x
<
w2
;
x
++
)
{
temp
[
x
]
=
COMPOSE_53iL0
(
b
[
x
+
w2
-
1
],
b
[
x
],
b
[
x
+
w2
]);
temp
[
x
+
w2
-
1
]
=
COMPOSE_DIRAC53iH0
(
temp
[
x
-
1
],
b
[
x
+
w2
-
1
],
temp
[
x
]);
}
temp
[
w
-
1
]
=
COMPOSE_DIRAC53iH0
(
temp
[
w2
-
1
],
b
[
w
-
1
],
temp
[
w2
-
1
]);
RENAME
(
interleave
)(
b
,
temp
,
temp
+
w2
,
w2
,
1
,
1
);
}
static
void
RENAME
(
horizontal_compose_dd97i
)(
uint8_t
*
_b
,
uint8_t
*
_tmp
,
int
w
)
{
int
x
;
const
int
w2
=
w
>>
1
;
TYPE
*
b
=
(
TYPE
*
)
_b
;
TYPE
*
tmp
=
(
TYPE
*
)
_tmp
;
tmp
[
0
]
=
COMPOSE_53iL0
(
b
[
w2
],
b
[
0
],
b
[
w2
]);
for
(
x
=
1
;
x
<
w2
;
x
++
)
tmp
[
x
]
=
COMPOSE_53iL0
(
b
[
x
+
w2
-
1
],
b
[
x
],
b
[
x
+
w2
]);
// extend the edges
tmp
[
-
1
]
=
tmp
[
0
];
tmp
[
w2
+
1
]
=
tmp
[
w2
]
=
tmp
[
w2
-
1
];
for
(
x
=
0
;
x
<
w2
;
x
++
)
{
b
[
2
*
x
]
=
(
tmp
[
x
]
+
1
)
>>
1
;
b
[
2
*
x
+
1
]
=
(
COMPOSE_DD97iH0
(
tmp
[
x
-
1
],
tmp
[
x
],
b
[
x
+
w2
],
tmp
[
x
+
1
],
tmp
[
x
+
2
])
+
1
)
>>
1
;
}
}
static
void
RENAME
(
horizontal_compose_dd137i
)(
uint8_t
*
_b
,
uint8_t
*
_tmp
,
int
w
)
{
const
int
w2
=
w
>>
1
;
int
x
;
TYPE
*
b
=
(
TYPE
*
)
_b
;
TYPE
*
tmp
=
(
TYPE
*
)
_tmp
;
tmp
[
0
]
=
COMPOSE_DD137iL0
(
b
[
w2
],
b
[
w2
],
b
[
0
],
b
[
w2
],
b
[
w2
+
1
]);
tmp
[
1
]
=
COMPOSE_DD137iL0
(
b
[
w2
],
b
[
w2
],
b
[
1
],
b
[
w2
+
1
],
b
[
w2
+
2
]);
for
(
x
=
2
;
x
<
w2
-
1
;
x
++
)
tmp
[
x
]
=
COMPOSE_DD137iL0
(
b
[
x
+
w2
-
2
],
b
[
x
+
w2
-
1
],
b
[
x
],
b
[
x
+
w2
],
b
[
x
+
w2
+
1
]);
tmp
[
w2
-
1
]
=
COMPOSE_DD137iL0
(
b
[
w
-
3
],
b
[
w
-
2
],
b
[
w2
-
1
],
b
[
w
-
1
],
b
[
w
-
1
]);
// extend the edges
tmp
[
-
1
]
=
tmp
[
0
];
tmp
[
w2
+
1
]
=
tmp
[
w2
]
=
tmp
[
w2
-
1
];
for
(
x
=
0
;
x
<
w2
;
x
++
)
{
b
[
2
*
x
]
=
(
tmp
[
x
]
+
1
)
>>
1
;
b
[
2
*
x
+
1
]
=
(
COMPOSE_DD97iH0
(
tmp
[
x
-
1
],
tmp
[
x
],
b
[
x
+
w2
],
tmp
[
x
+
1
],
tmp
[
x
+
2
])
+
1
)
>>
1
;
}
}
static
av_always_inline
void
RENAME
(
horizontal_compose_haari
)(
TYPE
*
b
,
TYPE
*
temp
,
int
w
,
int
shift
)
{
const
int
w2
=
w
>>
1
;
int
x
;
for
(
x
=
0
;
x
<
w2
;
x
++
)
{
temp
[
x
]
=
COMPOSE_HAARiL0
(
b
[
x
],
b
[
x
+
w2
]);
temp
[
x
+
w2
]
=
COMPOSE_HAARiH0
(
b
[
x
+
w2
],
temp
[
x
]);
}
RENAME
(
interleave
)(
b
,
temp
,
temp
+
w2
,
w2
,
shift
,
shift
);
}
static
void
RENAME
(
horizontal_compose_haar0i
)(
uint8_t
*
_b
,
uint8_t
*
_temp
,
int
w
)
{
TYPE
*
b
=
(
TYPE
*
)
_b
;
TYPE
*
temp
=
(
TYPE
*
)
_temp
;
RENAME
(
horizontal_compose_haari
)(
b
,
temp
,
w
,
0
);
}
static
void
RENAME
(
horizontal_compose_haar1i
)(
uint8_t
*
_b
,
uint8_t
*
_temp
,
int
w
)
{
TYPE
*
b
=
(
TYPE
*
)
_b
;
TYPE
*
temp
=
(
TYPE
*
)
_temp
;
RENAME
(
horizontal_compose_haari
)(
b
,
temp
,
w
,
1
);
}
static
void
RENAME
(
horizontal_compose_fidelityi
)(
uint8_t
*
_b
,
uint8_t
*
_tmp
,
int
w
)
{
const
int
w2
=
w
>>
1
;
int
i
,
x
;
TYPE
v
[
8
];
TYPE
*
b
=
(
TYPE
*
)
_b
;
TYPE
*
tmp
=
(
TYPE
*
)
_tmp
;
for
(
x
=
0
;
x
<
w2
;
x
++
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
v
[
i
]
=
b
[
av_clip
(
x
-
3
+
i
,
0
,
w2
-
1
)];
tmp
[
x
]
=
COMPOSE_FIDELITYiH0
(
v
[
0
],
v
[
1
],
v
[
2
],
v
[
3
],
b
[
x
+
w2
],
v
[
4
],
v
[
5
],
v
[
6
],
v
[
7
]);
}
for
(
x
=
0
;
x
<
w2
;
x
++
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
v
[
i
]
=
tmp
[
av_clip
(
x
-
4
+
i
,
0
,
w2
-
1
)];
tmp
[
x
+
w2
]
=
COMPOSE_FIDELITYiL0
(
v
[
0
],
v
[
1
],
v
[
2
],
v
[
3
],
b
[
x
],
v
[
4
],
v
[
5
],
v
[
6
],
v
[
7
]);
}
RENAME
(
interleave
)(
b
,
tmp
+
w2
,
tmp
,
w2
,
0
,
0
);
}
static
void
RENAME
(
horizontal_compose_daub97i
)(
uint8_t
*
_b
,
uint8_t
*
_temp
,
int
w
)
{
const
int
w2
=
w
>>
1
;
int
x
,
b0
,
b1
,
b2
;
TYPE
*
b
=
(
TYPE
*
)
_b
;
TYPE
*
temp
=
(
TYPE
*
)
_temp
;
temp
[
0
]
=
COMPOSE_DAUB97iL1
(
b
[
w2
],
b
[
0
],
b
[
w2
]);
for
(
x
=
1
;
x
<
w2
;
x
++
)
{
temp
[
x
]
=
COMPOSE_DAUB97iL1
(
b
[
x
+
w2
-
1
],
b
[
x
],
b
[
x
+
w2
]);
temp
[
x
+
w2
-
1
]
=
COMPOSE_DAUB97iH1
(
temp
[
x
-
1
],
b
[
x
+
w2
-
1
],
temp
[
x
]);
}
temp
[
w
-
1
]
=
COMPOSE_DAUB97iH1
(
temp
[
w2
-
1
],
b
[
w
-
1
],
temp
[
w2
-
1
]);
// second stage combined with interleave and shift
b0
=
b2
=
COMPOSE_DAUB97iL0
(
temp
[
w2
],
temp
[
0
],
temp
[
w2
]);
b
[
0
]
=
(
b0
+
1
)
>>
1
;
for
(
x
=
1
;
x
<
w2
;
x
++
)
{
b2
=
COMPOSE_DAUB97iL0
(
temp
[
x
+
w2
-
1
],
temp
[
x
],
temp
[
x
+
w2
]);
b1
=
COMPOSE_DAUB97iH0
(
b0
,
temp
[
x
+
w2
-
1
],
b2
);
b
[
2
*
x
-
1
]
=
(
b1
+
1
)
>>
1
;
b
[
2
*
x
]
=
(
b2
+
1
)
>>
1
;
b0
=
b2
;
}
b
[
w
-
1
]
=
(
COMPOSE_DAUB97iH0
(
b2
,
temp
[
w
-
1
],
b2
)
+
1
)
>>
1
;
}
static
void
RENAME
(
vertical_compose_dirac53iH0
)(
uint8_t
*
_b0
,
uint8_t
*
_b1
,
uint8_t
*
_b2
,
int
width
)
{
int
i
;
TYPE
*
b0
=
(
TYPE
*
)
_b0
;
TYPE
*
b1
=
(
TYPE
*
)
_b1
;
TYPE
*
b2
=
(
TYPE
*
)
_b2
;
for
(
i
=
0
;
i
<
width
;
i
++
){
b1
[
i
]
=
COMPOSE_DIRAC53iH0
(
b0
[
i
],
b1
[
i
],
b2
[
i
]);
}
}
static
void
RENAME
(
vertical_compose_dd97iH0
)(
uint8_t
*
_b0
,
uint8_t
*
_b1
,
uint8_t
*
_b2
,
uint8_t
*
_b3
,
uint8_t
*
_b4
,
int
width
)
{
int
i
;
TYPE
*
b0
=
(
TYPE
*
)
_b0
;
TYPE
*
b1
=
(
TYPE
*
)
_b1
;
TYPE
*
b2
=
(
TYPE
*
)
_b2
;
TYPE
*
b3
=
(
TYPE
*
)
_b3
;
TYPE
*
b4
=
(
TYPE
*
)
_b4
;
for
(
i
=
0
;
i
<
width
;
i
++
){
b2
[
i
]
=
COMPOSE_DD97iH0
(
b0
[
i
],
b1
[
i
],
b2
[
i
],
b3
[
i
],
b4
[
i
]);
}
}
static
void
RENAME
(
vertical_compose_dd137iL0
)(
uint8_t
*
_b0
,
uint8_t
*
_b1
,
uint8_t
*
_b2
,
uint8_t
*
_b3
,
uint8_t
*
_b4
,
int
width
)
{
int
i
;
TYPE
*
b0
=
(
TYPE
*
)
_b0
;
TYPE
*
b1
=
(
TYPE
*
)
_b1
;
TYPE
*
b2
=
(
TYPE
*
)
_b2
;
TYPE
*
b3
=
(
TYPE
*
)
_b3
;
TYPE
*
b4
=
(
TYPE
*
)
_b4
;
for
(
i
=
0
;
i
<
width
;
i
++
){
b2
[
i
]
=
COMPOSE_DD137iL0
(
b0
[
i
],
b1
[
i
],
b2
[
i
],
b3
[
i
],
b4
[
i
]);
}
}
static
void
RENAME
(
vertical_compose_haar
)(
uint8_t
*
_b0
,
uint8_t
*
_b1
,
int
width
)
{
int
i
;
TYPE
*
b0
=
(
TYPE
*
)
_b0
;
TYPE
*
b1
=
(
TYPE
*
)
_b1
;
for
(
i
=
0
;
i
<
width
;
i
++
)
{
b0
[
i
]
=
COMPOSE_HAARiL0
(
b0
[
i
],
b1
[
i
]);
b1
[
i
]
=
COMPOSE_HAARiH0
(
b1
[
i
],
b0
[
i
]);
}
}
static
void
RENAME
(
vertical_compose_fidelityiH0
)(
uint8_t
*
_dst
,
uint8_t
*
_b
[
8
],
int
width
)
{
int
i
;
TYPE
*
dst
=
(
TYPE
*
)
_dst
;
TYPE
*
b0
=
(
TYPE
*
)
_b
[
0
];
TYPE
*
b1
=
(
TYPE
*
)
_b
[
1
];
TYPE
*
b2
=
(
TYPE
*
)
_b
[
2
];
TYPE
*
b3
=
(
TYPE
*
)
_b
[
3
];
TYPE
*
b4
=
(
TYPE
*
)
_b
[
4
];
TYPE
*
b5
=
(
TYPE
*
)
_b
[
5
];
TYPE
*
b6
=
(
TYPE
*
)
_b
[
6
];
TYPE
*
b7
=
(
TYPE
*
)
_b
[
7
];
for
(
i
=
0
;
i
<
width
;
i
++
){
dst
[
i
]
=
COMPOSE_FIDELITYiH0
(
b0
[
i
],
b1
[
i
],
b2
[
i
],
b3
[
i
],
dst
[
i
],
b4
[
i
],
b5
[
i
],
b6
[
i
],
b7
[
i
]);
}
}
static
void
RENAME
(
vertical_compose_fidelityiL0
)(
uint8_t
*
_dst
,
uint8_t
*
_b
[
8
],
int
width
)
{
int
i
;
TYPE
*
dst
=
(
TYPE
*
)
_dst
;
TYPE
*
b0
=
(
TYPE
*
)
_b
[
0
];
TYPE
*
b1
=
(
TYPE
*
)
_b
[
1
];
TYPE
*
b2
=
(
TYPE
*
)
_b
[
2
];
TYPE
*
b3
=
(
TYPE
*
)
_b
[
3
];
TYPE
*
b4
=
(
TYPE
*
)
_b
[
4
];
TYPE
*
b5
=
(
TYPE
*
)
_b
[
5
];
TYPE
*
b6
=
(
TYPE
*
)
_b
[
6
];
TYPE
*
b7
=
(
TYPE
*
)
_b
[
7
];
for
(
i
=
0
;
i
<
width
;
i
++
){
dst
[
i
]
=
COMPOSE_FIDELITYiL0
(
b0
[
i
],
b1
[
i
],
b2
[
i
],
b3
[
i
],
dst
[
i
],
b4
[
i
],
b5
[
i
],
b6
[
i
],
b7
[
i
]);
}
}
static
void
RENAME
(
vertical_compose_daub97iH0
)(
uint8_t
*
_b0
,
uint8_t
*
_b1
,
uint8_t
*
_b2
,
int
width
)
{
int
i
;
TYPE
*
b0
=
(
TYPE
*
)
_b0
;
TYPE
*
b1
=
(
TYPE
*
)
_b1
;
TYPE
*
b2
=
(
TYPE
*
)
_b2
;
for
(
i
=
0
;
i
<
width
;
i
++
){
b1
[
i
]
=
COMPOSE_DAUB97iH0
(
b0
[
i
],
b1
[
i
],
b2
[
i
]);
}
}
static
void
RENAME
(
vertical_compose_daub97iH1
)(
uint8_t
*
_b0
,
uint8_t
*
_b1
,
uint8_t
*
_b2
,
int
width
)
{
int
i
;
TYPE
*
b0
=
(
TYPE
*
)
_b0
;
TYPE
*
b1
=
(
TYPE
*
)
_b1
;
TYPE
*
b2
=
(
TYPE
*
)
_b2
;
for
(
i
=
0
;
i
<
width
;
i
++
){
b1
[
i
]
=
COMPOSE_DAUB97iH1
(
b0
[
i
],
b1
[
i
],
b2
[
i
]);
}
}
static
void
RENAME
(
vertical_compose_daub97iL0
)(
uint8_t
*
_b0
,
uint8_t
*
_b1
,
uint8_t
*
_b2
,
int
width
)
{
int
i
;
TYPE
*
b0
=
(
TYPE
*
)
_b0
;
TYPE
*
b1
=
(
TYPE
*
)
_b1
;
TYPE
*
b2
=
(
TYPE
*
)
_b2
;
for
(
i
=
0
;
i
<
width
;
i
++
){
b1
[
i
]
=
COMPOSE_DAUB97iL0
(
b0
[
i
],
b1
[
i
],
b2
[
i
]);
}
}
static
void
RENAME
(
vertical_compose_daub97iL1
)(
uint8_t
*
_b0
,
uint8_t
*
_b1
,
uint8_t
*
_b2
,
int
width
)
{
int
i
;
TYPE
*
b0
=
(
TYPE
*
)
_b0
;
TYPE
*
b1
=
(
TYPE
*
)
_b1
;
TYPE
*
b2
=
(
TYPE
*
)
_b2
;
for
(
i
=
0
;
i
<
width
;
i
++
){
b1
[
i
]
=
COMPOSE_DAUB97iL1
(
b0
[
i
],
b1
[
i
],
b2
[
i
]);
}
}
static
void
RENAME
(
spatial_compose_dd97i_dy
)(
DWTContext
*
d
,
int
level
,
int
width
,
int
height
,
int
stride
)
{
vertical_compose_3tap
vertical_compose_l0
=
(
void
*
)
d
->
vertical_compose_l0
;
vertical_compose_5tap
vertical_compose_h0
=
(
void
*
)
d
->
vertical_compose_h0
;
DWTCompose
*
cs
=
d
->
cs
+
level
;
int
i
,
y
=
cs
->
y
;
uint8_t
*
b
[
8
];
for
(
i
=
0
;
i
<
6
;
i
++
)
b
[
i
]
=
cs
->
b
[
i
];
b
[
6
]
=
d
->
buffer
+
av_clip
(
y
+
5
,
0
,
height
-
2
)
*
stride
;
b
[
7
]
=
d
->
buffer
+
av_clip
(
y
+
6
,
1
,
height
-
1
)
*
stride
;
if
(
y
+
5
<
(
unsigned
)
height
)
vertical_compose_l0
(
b
[
5
],
b
[
6
],
b
[
7
],
width
);
if
(
y
+
1
<
(
unsigned
)
height
)
vertical_compose_h0
(
b
[
0
],
b
[
2
],
b
[
3
],
b
[
4
],
b
[
6
],
width
);
if
(
y
-
1
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
0
],
d
->
temp
,
width
);
if
(
y
+
0
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
1
],
d
->
temp
,
width
);
for
(
i
=
0
;
i
<
6
;
i
++
)
cs
->
b
[
i
]
=
b
[
i
+
2
];
cs
->
y
+=
2
;
}
static
void
RENAME
(
spatial_compose_dirac53i_dy
)(
DWTContext
*
d
,
int
level
,
int
width
,
int
height
,
int
stride
)
{
vertical_compose_3tap
vertical_compose_l0
=
(
void
*
)
d
->
vertical_compose_l0
;
vertical_compose_3tap
vertical_compose_h0
=
(
void
*
)
d
->
vertical_compose_h0
;
DWTCompose
*
cs
=
d
->
cs
+
level
;
int
y
=
cs
->
y
;
uint8_t
*
b
[
4
]
=
{
cs
->
b
[
0
],
cs
->
b
[
1
]
};
b
[
2
]
=
d
->
buffer
+
avpriv_mirror
(
y
+
1
,
height
-
1
)
*
stride
;
b
[
3
]
=
d
->
buffer
+
avpriv_mirror
(
y
+
2
,
height
-
1
)
*
stride
;
if
(
y
+
1
<
(
unsigned
)
height
)
vertical_compose_l0
(
b
[
1
],
b
[
2
],
b
[
3
],
width
);
if
(
y
+
0
<
(
unsigned
)
height
)
vertical_compose_h0
(
b
[
0
],
b
[
1
],
b
[
2
],
width
);
if
(
y
-
1
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
0
],
d
->
temp
,
width
);
if
(
y
+
0
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
1
],
d
->
temp
,
width
);
cs
->
b
[
0
]
=
b
[
2
];
cs
->
b
[
1
]
=
b
[
3
];
cs
->
y
+=
2
;
}
static
void
RENAME
(
spatial_compose_dd137i_dy
)(
DWTContext
*
d
,
int
level
,
int
width
,
int
height
,
int
stride
)
{
vertical_compose_5tap
vertical_compose_l0
=
(
void
*
)
d
->
vertical_compose_l0
;
vertical_compose_5tap
vertical_compose_h0
=
(
void
*
)
d
->
vertical_compose_h0
;
DWTCompose
*
cs
=
d
->
cs
+
level
;
int
i
,
y
=
cs
->
y
;
uint8_t
*
b
[
10
];
for
(
i
=
0
;
i
<
8
;
i
++
)
b
[
i
]
=
cs
->
b
[
i
];
b
[
8
]
=
d
->
buffer
+
av_clip
(
y
+
7
,
0
,
height
-
2
)
*
stride
;
b
[
9
]
=
d
->
buffer
+
av_clip
(
y
+
8
,
1
,
height
-
1
)
*
stride
;
if
(
y
+
5
<
(
unsigned
)
height
)
vertical_compose_l0
(
b
[
3
],
b
[
5
],
b
[
6
],
b
[
7
],
b
[
9
],
width
);
if
(
y
+
1
<
(
unsigned
)
height
)
vertical_compose_h0
(
b
[
0
],
b
[
2
],
b
[
3
],
b
[
4
],
b
[
6
],
width
);
if
(
y
-
1
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
0
],
d
->
temp
,
width
);
if
(
y
+
0
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
1
],
d
->
temp
,
width
);
for
(
i
=
0
;
i
<
8
;
i
++
)
cs
->
b
[
i
]
=
b
[
i
+
2
];
cs
->
y
+=
2
;
}
// haar makes the assumption that height is even (always true for dirac)
static
void
RENAME
(
spatial_compose_haari_dy
)(
DWTContext
*
d
,
int
level
,
int
width
,
int
height
,
int
stride
)
{
vertical_compose_2tap
vertical_compose
=
(
void
*
)
d
->
vertical_compose
;
int
y
=
d
->
cs
[
level
].
y
;
uint8_t
*
b0
=
d
->
buffer
+
(
y
-
1
)
*
stride
;
uint8_t
*
b1
=
d
->
buffer
+
(
y
)
*
stride
;
vertical_compose
(
b0
,
b1
,
width
);
d
->
horizontal_compose
(
b0
,
d
->
temp
,
width
);
d
->
horizontal_compose
(
b1
,
d
->
temp
,
width
);
d
->
cs
[
level
].
y
+=
2
;
}
// Don't do sliced idwt for fidelity; the 9 tap filter makes it a bit annoying
// Fortunately, this filter isn't used in practice.
static
void
RENAME
(
spatial_compose_fidelity
)(
DWTContext
*
d
,
int
level
,
int
width
,
int
height
,
int
stride
)
{
vertical_compose_9tap
vertical_compose_l0
=
(
void
*
)
d
->
vertical_compose_l0
;
vertical_compose_9tap
vertical_compose_h0
=
(
void
*
)
d
->
vertical_compose_h0
;
int
i
,
y
;
uint8_t
*
b
[
8
];
for
(
y
=
1
;
y
<
height
;
y
+=
2
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
b
[
i
]
=
d
->
buffer
+
av_clip
((
y
-
7
+
2
*
i
),
0
,
height
-
2
)
*
stride
;
vertical_compose_h0
(
d
->
buffer
+
y
*
stride
,
b
,
width
);
}
for
(
y
=
0
;
y
<
height
;
y
+=
2
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
b
[
i
]
=
d
->
buffer
+
av_clip
((
y
-
7
+
2
*
i
),
1
,
height
-
1
)
*
stride
;
vertical_compose_l0
(
d
->
buffer
+
y
*
stride
,
b
,
width
);
}
for
(
y
=
0
;
y
<
height
;
y
++
)
d
->
horizontal_compose
(
d
->
buffer
+
y
*
stride
,
d
->
temp
,
width
);
d
->
cs
[
level
].
y
=
height
+
1
;
}
static
void
RENAME
(
spatial_compose_daub97i_dy
)(
DWTContext
*
d
,
int
level
,
int
width
,
int
height
,
int
stride
)
{
vertical_compose_3tap
vertical_compose_l0
=
(
void
*
)
d
->
vertical_compose_l0
;
vertical_compose_3tap
vertical_compose_h0
=
(
void
*
)
d
->
vertical_compose_h0
;
vertical_compose_3tap
vertical_compose_l1
=
(
void
*
)
d
->
vertical_compose_l1
;
vertical_compose_3tap
vertical_compose_h1
=
(
void
*
)
d
->
vertical_compose_h1
;
DWTCompose
*
cs
=
d
->
cs
+
level
;
int
i
,
y
=
cs
->
y
;
uint8_t
*
b
[
6
];
for
(
i
=
0
;
i
<
4
;
i
++
)
b
[
i
]
=
cs
->
b
[
i
];
b
[
4
]
=
d
->
buffer
+
avpriv_mirror
(
y
+
3
,
height
-
1
)
*
stride
;
b
[
5
]
=
d
->
buffer
+
avpriv_mirror
(
y
+
4
,
height
-
1
)
*
stride
;
if
(
y
+
3
<
(
unsigned
)
height
)
vertical_compose_l1
(
b
[
3
],
b
[
4
],
b
[
5
],
width
);
if
(
y
+
2
<
(
unsigned
)
height
)
vertical_compose_h1
(
b
[
2
],
b
[
3
],
b
[
4
],
width
);
if
(
y
+
1
<
(
unsigned
)
height
)
vertical_compose_l0
(
b
[
1
],
b
[
2
],
b
[
3
],
width
);
if
(
y
+
0
<
(
unsigned
)
height
)
vertical_compose_h0
(
b
[
0
],
b
[
1
],
b
[
2
],
width
);
if
(
y
-
1
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
0
],
d
->
temp
,
width
);
if
(
y
+
0
<
(
unsigned
)
height
)
d
->
horizontal_compose
(
b
[
1
],
d
->
temp
,
width
);
for
(
i
=
0
;
i
<
4
;
i
++
)
cs
->
b
[
i
]
=
b
[
i
+
2
];
cs
->
y
+=
2
;
}
static
void
RENAME
(
spatial_compose97i_init2
)(
DWTCompose
*
cs
,
uint8_t
*
buffer
,
int
height
,
int
stride
)
{
cs
->
b
[
0
]
=
buffer
+
avpriv_mirror
(
-
3
-
1
,
height
-
1
)
*
stride
;
cs
->
b
[
1
]
=
buffer
+
avpriv_mirror
(
-
3
,
height
-
1
)
*
stride
;
cs
->
b
[
2
]
=
buffer
+
avpriv_mirror
(
-
3
+
1
,
height
-
1
)
*
stride
;
cs
->
b
[
3
]
=
buffer
+
avpriv_mirror
(
-
3
+
2
,
height
-
1
)
*
stride
;
cs
->
y
=
-
3
;
}
static
void
RENAME
(
spatial_compose53i_init2
)(
DWTCompose
*
cs
,
uint8_t
*
buffer
,
int
height
,
int
stride
)
{
cs
->
b
[
0
]
=
buffer
+
avpriv_mirror
(
-
1
-
1
,
height
-
1
)
*
stride
;
cs
->
b
[
1
]
=
buffer
+
avpriv_mirror
(
-
1
,
height
-
1
)
*
stride
;
cs
->
y
=
-
1
;
}
static
void
RENAME
(
spatial_compose_dd97i_init
)(
DWTCompose
*
cs
,
uint8_t
*
buffer
,
int
height
,
int
stride
)
{
cs
->
b
[
0
]
=
buffer
+
av_clip
(
-
5
-
1
,
0
,
height
-
2
)
*
stride
;
cs
->
b
[
1
]
=
buffer
+
av_clip
(
-
5
,
1
,
height
-
1
)
*
stride
;
cs
->
b
[
2
]
=
buffer
+
av_clip
(
-
5
+
1
,
0
,
height
-
2
)
*
stride
;
cs
->
b
[
3
]
=
buffer
+
av_clip
(
-
5
+
2
,
1
,
height
-
1
)
*
stride
;
cs
->
b
[
4
]
=
buffer
+
av_clip
(
-
5
+
3
,
0
,
height
-
2
)
*
stride
;
cs
->
b
[
5
]
=
buffer
+
av_clip
(
-
5
+
4
,
1
,
height
-
1
)
*
stride
;
cs
->
y
=
-
5
;
}
static
void
RENAME
(
spatial_compose_dd137i_init
)(
DWTCompose
*
cs
,
uint8_t
*
buffer
,
int
height
,
int
stride
)
{
cs
->
b
[
0
]
=
buffer
+
av_clip
(
-
5
-
1
,
0
,
height
-
2
)
*
stride
;
cs
->
b
[
1
]
=
buffer
+
av_clip
(
-
5
,
1
,
height
-
1
)
*
stride
;
cs
->
b
[
2
]
=
buffer
+
av_clip
(
-
5
+
1
,
0
,
height
-
2
)
*
stride
;
cs
->
b
[
3
]
=
buffer
+
av_clip
(
-
5
+
2
,
1
,
height
-
1
)
*
stride
;
cs
->
b
[
4
]
=
buffer
+
av_clip
(
-
5
+
3
,
0
,
height
-
2
)
*
stride
;
cs
->
b
[
5
]
=
buffer
+
av_clip
(
-
5
+
4
,
1
,
height
-
1
)
*
stride
;
cs
->
b
[
6
]
=
buffer
+
av_clip
(
-
5
+
5
,
0
,
height
-
2
)
*
stride
;
cs
->
b
[
7
]
=
buffer
+
av_clip
(
-
5
+
6
,
1
,
height
-
1
)
*
stride
;
cs
->
y
=
-
5
;
}
static
int
RENAME
(
ff_spatial_idwt_init2
)(
DWTContext
*
d
,
uint8_t
*
buffer
,
int
width
,
int
height
,
int
stride
,
enum
dwt_type
type
,
int
decomposition_count
,
uint8_t
*
temp
)
{
int
level
;
d
->
buffer
=
buffer
;
d
->
width
=
width
;
d
->
height
=
height
;
d
->
stride
=
stride
;
d
->
decomposition_count
=
decomposition_count
;
d
->
temp
=
(
uint8_t
*
)(((
TYPE
*
)
temp
)
+
8
);
for
(
level
=
decomposition_count
-
1
;
level
>=
0
;
level
--
){
int
hl
=
height
>>
level
;
int
stride_l
=
stride
<<
level
;
switch
(
type
){
case
DWT_DIRAC_DD9_7
:
RENAME
(
spatial_compose_dd97i_init
)(
d
->
cs
+
level
,
buffer
,
hl
,
stride_l
);
break
;
case
DWT_DIRAC_LEGALL5_3
:
RENAME
(
spatial_compose53i_init2
)(
d
->
cs
+
level
,
buffer
,
hl
,
stride_l
);
break
;
case
DWT_DIRAC_DD13_7
:
RENAME
(
spatial_compose_dd137i_init
)(
d
->
cs
+
level
,
buffer
,
hl
,
stride_l
);
break
;
case
DWT_DIRAC_HAAR0
:
case
DWT_DIRAC_HAAR1
:
d
->
cs
[
level
].
y
=
1
;
break
;
case
DWT_DIRAC_DAUB9_7
:
RENAME
(
spatial_compose97i_init2
)(
d
->
cs
+
level
,
buffer
,
hl
,
stride_l
);
break
;
default:
d
->
cs
[
level
].
y
=
0
;
break
;
}
}
switch
(
type
)
{
case
DWT_DIRAC_DD9_7
:
d
->
spatial_compose
=
RENAME
(
spatial_compose_dd97i_dy
);
d
->
vertical_compose_l0
=
(
void
*
)
RENAME
(
vertical_compose53iL0
);
d
->
vertical_compose_h0
=
(
void
*
)
RENAME
(
vertical_compose_dd97iH0
);
d
->
horizontal_compose
=
RENAME
(
horizontal_compose_dd97i
);
d
->
support
=
7
;
break
;
case
DWT_DIRAC_LEGALL5_3
:
d
->
spatial_compose
=
RENAME
(
spatial_compose_dirac53i_dy
);
d
->
vertical_compose_l0
=
(
void
*
)
RENAME
(
vertical_compose53iL0
);
d
->
vertical_compose_h0
=
(
void
*
)
RENAME
(
vertical_compose_dirac53iH0
);
d
->
horizontal_compose
=
RENAME
(
horizontal_compose_dirac53i
);
d
->
support
=
3
;
break
;
case
DWT_DIRAC_DD13_7
:
d
->
spatial_compose
=
RENAME
(
spatial_compose_dd137i_dy
);
d
->
vertical_compose_l0
=
(
void
*
)
RENAME
(
vertical_compose_dd137iL0
);
d
->
vertical_compose_h0
=
(
void
*
)
RENAME
(
vertical_compose_dd97iH0
);
d
->
horizontal_compose
=
RENAME
(
horizontal_compose_dd137i
);
d
->
support
=
7
;
break
;
case
DWT_DIRAC_HAAR0
:
case
DWT_DIRAC_HAAR1
:
d
->
spatial_compose
=
RENAME
(
spatial_compose_haari_dy
);
d
->
vertical_compose
=
(
void
*
)
RENAME
(
vertical_compose_haar
);
if
(
type
==
DWT_DIRAC_HAAR0
)
d
->
horizontal_compose
=
RENAME
(
horizontal_compose_haar0i
);
else
d
->
horizontal_compose
=
RENAME
(
horizontal_compose_haar1i
);
d
->
support
=
1
;
break
;
case
DWT_DIRAC_FIDELITY
:
d
->
spatial_compose
=
RENAME
(
spatial_compose_fidelity
);
d
->
vertical_compose_l0
=
(
void
*
)
RENAME
(
vertical_compose_fidelityiL0
);
d
->
vertical_compose_h0
=
(
void
*
)
RENAME
(
vertical_compose_fidelityiH0
);
d
->
horizontal_compose
=
RENAME
(
horizontal_compose_fidelityi
);
d
->
support
=
0
;
// not really used
break
;
case
DWT_DIRAC_DAUB9_7
:
d
->
spatial_compose
=
RENAME
(
spatial_compose_daub97i_dy
);
d
->
vertical_compose_l0
=
(
void
*
)
RENAME
(
vertical_compose_daub97iL0
);
d
->
vertical_compose_h0
=
(
void
*
)
RENAME
(
vertical_compose_daub97iH0
);
d
->
vertical_compose_l1
=
(
void
*
)
RENAME
(
vertical_compose_daub97iL1
);
d
->
vertical_compose_h1
=
(
void
*
)
RENAME
(
vertical_compose_daub97iH1
);
d
->
horizontal_compose
=
RENAME
(
horizontal_compose_daub97i
);
d
->
support
=
5
;
break
;
default:
return
AVERROR_INVALIDDATA
;
}
return
0
;
}
#undef RENAME
#undef TYPE
libavcodec/diracdec.c
View file @
3f07f12f
...
...
@@ -1687,16 +1687,16 @@ static int dirac_decode_frame_internal(DiracContext *s)
memset
(
p
->
idwt_buf
,
0
,
p
->
idwt_stride
*
p
->
idwt_height
);
decode_component
(
s
,
comp
);
/* [DIRAC_STD] 13.4.1 core_transform_data() */
}
ret
=
ff_spatial_idwt_init2
(
&
d
,
(
int16_t
*
)
p
->
idwt_buf
,
p
->
idwt_width
,
p
->
idwt_height
,
p
->
idwt_stride
>>
1
,
s
->
wavelet_idx
+
2
,
s
->
wavelet_depth
,
(
int16_t
*
)
p
->
idwt_tmp
);
ret
=
ff_spatial_idwt_init2
(
&
d
,
p
->
idwt_buf
,
p
->
idwt_width
,
p
->
idwt_height
,
p
->
idwt_stride
,
s
->
wavelet_idx
+
2
,
s
->
wavelet_depth
,
p
->
idwt_tmp
,
s
->
bit_depth
);
if
(
ret
<
0
)
return
ret
;
if
(
!
s
->
num_refs
)
{
/* intra */
for
(
y
=
0
;
y
<
p
->
height
;
y
+=
16
)
{
ff_spatial_idwt_slice2
(
&
d
,
y
+
16
);
/* decode */
s
->
diracdsp
.
put_signed_rect_clamped
(
frame
+
y
*
p
->
stride
,
p
->
stride
,
(
int16_t
*
)(
p
->
idwt_buf
)
+
y
*
(
p
->
idwt_stride
>>
1
),
(
p
->
idwt_stride
>>
1
)
,
p
->
width
,
16
);
s
->
diracdsp
.
put_signed_rect_clamped
[
s
->
pshift
]
(
frame
+
y
*
p
->
stride
,
p
->
stride
,
p
->
idwt_buf
+
y
*
p
->
idwt_stride
,
p
->
idwt_stride
,
p
->
width
,
16
);
}
}
else
{
/* inter */
int
rowheight
=
p
->
ybsep
*
p
->
stride
;
...
...
libavcodec/diracdsp.c
View file @
3f07f12f
...
...
@@ -135,9 +135,10 @@ ADD_OBMC(8)
ADD_OBMC
(
16
)
ADD_OBMC
(
32
)
static
void
put_signed_rect_clamped_
c
(
uint8_t
*
dst
,
int
dst_stride
,
const
int16_t
*
src
,
int
src_stride
,
int
width
,
int
height
)
static
void
put_signed_rect_clamped_
8bit_c
(
uint8_t
*
dst
,
int
dst_stride
,
const
uint8_t
*
_
src
,
int
src_stride
,
int
width
,
int
height
)
{
int
x
,
y
;
int16_t
*
src
=
(
int16_t
*
)
_src
;
for
(
y
=
0
;
y
<
height
;
y
++
)
{
for
(
x
=
0
;
x
<
width
;
x
+=
4
)
{
dst
[
x
]
=
av_clip_uint8
(
src
[
x
]
+
128
);
...
...
@@ -146,7 +147,24 @@ static void put_signed_rect_clamped_c(uint8_t *dst, int dst_stride, const int16_
dst
[
x
+
3
]
=
av_clip_uint8
(
src
[
x
+
3
]
+
128
);
}
dst
+=
dst_stride
;
src
+=
src_stride
;
src
+=
src_stride
>>
1
;
}
}
static
void
put_signed_rect_clamped_10bit_c
(
uint8_t
*
_dst
,
int
dst_stride
,
const
uint8_t
*
_src
,
int
src_stride
,
int
width
,
int
height
)
{
int
x
,
y
;
uint16_t
*
dst
=
(
uint16_t
*
)
_dst
;
int32_t
*
src
=
(
int32_t
*
)
_src
;
for
(
y
=
0
;
y
<
height
;
y
++
)
{
for
(
x
=
0
;
x
<
width
;
x
+=
4
)
{
dst
[
x
]
=
av_clip
(
src
[
x
]
+
512
,
0
,
(
1
<<
10
)
-
1
);
dst
[
x
+
1
]
=
av_clip
(
src
[
x
+
1
]
+
512
,
0
,
(
1
<<
10
)
-
1
);
dst
[
x
+
2
]
=
av_clip
(
src
[
x
+
2
]
+
512
,
0
,
(
1
<<
10
)
-
1
);
dst
[
x
+
3
]
=
av_clip
(
src
[
x
+
3
]
+
512
,
0
,
(
1
<<
10
)
-
1
);
}
dst
+=
dst_stride
>>
1
;
src
+=
src_stride
>>
2
;
}
}
...
...
@@ -177,7 +195,8 @@ av_cold void ff_diracdsp_init(DiracDSPContext *c)
{
c
->
dirac_hpel_filter
=
dirac_hpel_filter
;
c
->
add_rect_clamped
=
add_rect_clamped_c
;
c
->
put_signed_rect_clamped
=
put_signed_rect_clamped_c
;
c
->
put_signed_rect_clamped
[
0
]
=
put_signed_rect_clamped_8bit_c
;
c
->
put_signed_rect_clamped
[
1
]
=
put_signed_rect_clamped_10bit_c
;
c
->
add_dirac_obmc
[
0
]
=
add_obmc8_c
;
c
->
add_dirac_obmc
[
1
]
=
add_obmc16_c
;
...
...
libavcodec/diracdsp.h
View file @
3f07f12f
...
...
@@ -41,8 +41,8 @@ typedef struct {
void
(
*
put_dirac_pixels_tab
[
3
][
4
])(
uint8_t
*
dst
,
const
uint8_t
*
src
[
5
],
int
stride
,
int
h
);
void
(
*
avg_dirac_pixels_tab
[
3
][
4
])(
uint8_t
*
dst
,
const
uint8_t
*
src
[
5
],
int
stride
,
int
h
);
void
(
*
put_signed_rect_clamped
)(
uint8_t
*
dst
/*align 16*/
,
int
dst_stride
,
const
int16
_t
*
src
/*align 16*/
,
int
src_stride
,
int
width
,
int
height
/*mod 2*/
);
void
(
*
put_rect_clamped
)(
uint8_t
*
dst
/*align 16*/
,
int
dst_stride
,
const
int16
_t
*
src
/*align 16*/
,
int
src_stride
,
int
width
,
int
height
/*mod 2*/
);
void
(
*
put_signed_rect_clamped
[
3
])(
uint8_t
*
dst
/*align 16*/
,
int
dst_stride
,
const
uint8
_t
*
src
/*align 16*/
,
int
src_stride
,
int
width
,
int
height
/*mod 2*/
);
void
(
*
put_rect_clamped
)(
uint8_t
*
dst
/*align 16*/
,
int
dst_stride
,
const
uint8
_t
*
src
/*align 16*/
,
int
src_stride
,
int
width
,
int
height
/*mod 2*/
);
void
(
*
add_rect_clamped
)(
uint8_t
*
dst
/*align 16*/
,
const
uint16_t
*
src
/*align 16*/
,
int
stride
,
const
int16_t
*
idwt
/*align 16*/
,
int
idwt_stride
,
int
width
,
int
height
/*mod 2*/
);
void
(
*
add_dirac_obmc
[
3
])(
uint16_t
*
dst
,
const
uint8_t
*
src
,
int
stride
,
const
uint8_t
*
obmc_weight
,
int
yblen
);
...
...
libavcodec/x86/dirac_dwt.c
View file @
3f07f12f
...
...
@@ -25,17 +25,20 @@
#include "dirac_dwt.h"
#define COMPOSE_VERTICAL(ext, align) \
void ff_vertical_compose53iL0##ext(
IDWTELEM *b0, IDWTELEM *b1, IDWTELEM
*b2, int width); \
void ff_vertical_compose_dirac53iH0##ext(
IDWTELEM *b0, IDWTELEM *b1, IDWTELEM
*b2, int width); \
void ff_vertical_compose_dd137iL0##ext(
IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, IDWTELEM *b3, IDWTELEM
*b4, int width); \
void ff_vertical_compose_dd97iH0##ext(
IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, IDWTELEM *b3, IDWTELEM
*b4, int width); \
void ff_vertical_compose_haar##ext(
IDWTELEM *b0, IDWTELEM
*b1, int width); \
void ff_horizontal_compose_haar0i##ext(
IDWTELEM *b, IDWTELEM
*tmp, int w);\
void ff_horizontal_compose_haar1i##ext(
IDWTELEM *b, IDWTELEM
*tmp, int w);\
\
static void vertical_compose53iL0##ext(
IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *
b2, int width) \
void ff_vertical_compose53iL0##ext(
int16_t *b0, int16_t *b1, int16_t
*b2, int width); \
void ff_vertical_compose_dirac53iH0##ext(
int16_t *b0, int16_t *b1, int16_t
*b2, int width); \
void ff_vertical_compose_dd137iL0##ext(
int16_t *b0, int16_t *b1, int16_t *b2, int16_t *b3, int16_t
*b4, int width); \
void ff_vertical_compose_dd97iH0##ext(
int16_t *b0, int16_t *b1, int16_t *b2, int16_t *b3, int16_t
*b4, int width); \
void ff_vertical_compose_haar##ext(
int16_t *b0, int16_t
*b1, int width); \
void ff_horizontal_compose_haar0i##ext(
int16_t *b, int16_t
*tmp, int w);\
void ff_horizontal_compose_haar1i##ext(
int16_t *b, int16_t
*tmp, int w);\
\
static void vertical_compose53iL0##ext(
uint8_t *_b0, uint8_t *_b1, uint8_t *_
b2, int width) \
{ \
int i, width_align = width&~(align-1); \
int16_t *b0 = (int16_t *)_b0; \
int16_t *b1 = (int16_t *)_b1; \
int16_t *b2 = (int16_t *)_b2; \
\
for(i=width_align; i<width; i++) \
b1[i] = COMPOSE_53iL0(b0[i], b1[i], b2[i]); \
...
...
@@ -43,9 +46,12 @@ static void vertical_compose53iL0##ext(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2,
ff_vertical_compose53iL0##ext(b0, b1, b2, width_align); \
} \
\
static void vertical_compose_dirac53iH0##ext(
IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *
b2, int width) \
static void vertical_compose_dirac53iH0##ext(
uint8_t *_b0, uint8_t *_b1, uint8_t *_
b2, int width) \
{ \
int i, width_align = width&~(align-1); \
int16_t *b0 = (int16_t *)_b0; \
int16_t *b1 = (int16_t *)_b1; \
int16_t *b2 = (int16_t *)_b2; \
\
for(i=width_align; i<width; i++) \
b1[i] = COMPOSE_DIRAC53iH0(b0[i], b1[i], b2[i]); \
...
...
@@ -53,10 +59,15 @@ static void vertical_compose_dirac53iH0##ext(IDWTELEM *b0, IDWTELEM *b1, IDWTELE
ff_vertical_compose_dirac53iH0##ext(b0, b1, b2, width_align); \
} \
\
static void vertical_compose_dd137iL0##ext(
IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *
b2, \
IDWTELEM *b3, IDWTELEM *
b4, int width) \
static void vertical_compose_dd137iL0##ext(
uint8_t *_b0, uint8_t *_b1, uint8_t *_
b2, \
uint8_t *_b3, uint8_t *_
b4, int width) \
{ \
int i, width_align = width&~(align-1); \
int16_t *b0 = (int16_t *)_b0; \
int16_t *b1 = (int16_t *)_b1; \
int16_t *b2 = (int16_t *)_b2; \
int16_t *b3 = (int16_t *)_b3; \
int16_t *b4 = (int16_t *)_b4; \
\
for(i=width_align; i<width; i++) \
b2[i] = COMPOSE_DD137iL0(b0[i], b1[i], b2[i], b3[i], b4[i]); \
...
...
@@ -64,19 +75,26 @@ static void vertical_compose_dd137iL0##ext(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM
ff_vertical_compose_dd137iL0##ext(b0, b1, b2, b3, b4, width_align); \
} \
\
static void vertical_compose_dd97iH0##ext(
IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *
b2, \
IDWTELEM *b3, IDWTELEM *
b4, int width) \
static void vertical_compose_dd97iH0##ext(
uint8_t *_b0, uint8_t *_b1, uint8_t *_
b2, \
uint8_t *_b3, uint8_t *_
b4, int width) \
{ \
int i, width_align = width&~(align-1); \
int16_t *b0 = (int16_t *)_b0; \
int16_t *b1 = (int16_t *)_b1; \
int16_t *b2 = (int16_t *)_b2; \
int16_t *b3 = (int16_t *)_b3; \
int16_t *b4 = (int16_t *)_b4; \
\
for(i=width_align; i<width; i++) \
b2[i] = COMPOSE_DD97iH0(b0[i], b1[i], b2[i], b3[i], b4[i]); \
\
ff_vertical_compose_dd97iH0##ext(b0, b1, b2, b3, b4, width_align); \
} \
static void vertical_compose_haar##ext(
IDWTELEM *b0, IDWTELEM *
b1, int width) \
static void vertical_compose_haar##ext(
uint8_t *_b0, uint8_t *_
b1, int width) \
{ \
int i, width_align = width&~(align-1); \
int16_t *b0 = (int16_t *)_b0; \
int16_t *b1 = (int16_t *)_b1; \
\
for(i=width_align; i<width; i++) { \
b0[i] = COMPOSE_HAARiL0(b0[i], b1[i]); \
...
...
@@ -85,10 +103,13 @@ static void vertical_compose_haar##ext(IDWTELEM *b0, IDWTELEM *b1, int width) \
\
ff_vertical_compose_haar##ext(b0, b1, width_align); \
} \
static void horizontal_compose_haar0i##ext(
IDWTELEM *b, IDWTELEM *
tmp, int w)\
static void horizontal_compose_haar0i##ext(
uint8_t *_b, uint8_t *_
tmp, int w)\
{\
int w2= w>>1;\
int x= w2 - (w2&(align-1));\
int16_t *b = (int16_t *)_b; \
int16_t *tmp = (int16_t *)_tmp; \
\
ff_horizontal_compose_haar0i##ext(b, tmp, w);\
\
for (; x < w2; x++) {\
...
...
@@ -96,10 +117,13 @@ static void horizontal_compose_haar0i##ext(IDWTELEM *b, IDWTELEM *tmp, int w)\
b[2*x+1] = COMPOSE_HAARiH0(b[x+w2], tmp[x]);\
}\
}\
static void horizontal_compose_haar1i##ext(
IDWTELEM *b, IDWTELEM *
tmp, int w)\
static void horizontal_compose_haar1i##ext(
uint8_t *_b, uint8_t *_
tmp, int w)\
{\
int w2= w>>1;\
int x= w2 - (w2&(align-1));\
int16_t *b = (int16_t *)_b; \
int16_t *tmp = (int16_t *)_tmp; \
\
ff_horizontal_compose_haar1i##ext(b, tmp, w);\
\
for (; x < w2; x++) {\
...
...
@@ -116,12 +140,15 @@ COMPOSE_VERTICAL(_mmx, 4)
COMPOSE_VERTICAL
(
_sse2
,
8
)
void
ff_horizontal_compose_dd97i_ssse3
(
IDWTELEM
*
b
,
IDWTELEM
*
tmp
,
int
w
);
void
ff_horizontal_compose_dd97i_ssse3
(
int16_t
*
_b
,
int16_t
*
_
tmp
,
int
w
);
static
void
horizontal_compose_dd97i_ssse3
(
IDWTELEM
*
b
,
IDWTELEM
*
tmp
,
int
w
)
static
void
horizontal_compose_dd97i_ssse3
(
uint8_t
*
_b
,
uint8_t
*
_
tmp
,
int
w
)
{
int
w2
=
w
>>
1
;
int
x
=
w2
-
(
w2
&
7
);
int16_t
*
b
=
(
int16_t
*
)
_b
;
int16_t
*
tmp
=
(
int16_t
*
)
_tmp
;
ff_horizontal_compose_dd97i_ssse3
(
b
,
tmp
,
w
);
for
(;
x
<
w2
;
x
++
)
{
...
...
libavcodec/x86/diracdsp_mmx.c
View file @
3f07f12f
...
...
@@ -130,7 +130,7 @@ void ff_diracdsp_init_mmx(DiracDSPContext* c)
c
->
add_dirac_obmc
[
2
]
=
ff_add_dirac_obmc32_mmx
;
c
->
dirac_hpel_filter
=
dirac_hpel_filter_mmx
;
c
->
add_rect_clamped
=
ff_add_rect_clamped_mmx
;
c
->
put_signed_rect_clamped
=
ff_put_signed_rect_clamped_mmx
;
c
->
put_signed_rect_clamped
[
0
]
=
(
void
*
)
ff_put_signed_rect_clamped_mmx
;
#endif
PIXFUNC
(
put
,
0
,
mmx
);
PIXFUNC
(
avg
,
0
,
mmx
);
...
...
@@ -143,7 +143,7 @@ void ff_diracdsp_init_mmx(DiracDSPContext* c)
if
(
EXTERNAL_SSE2
(
mm_flags
))
{
c
->
dirac_hpel_filter
=
dirac_hpel_filter_sse2
;
c
->
add_rect_clamped
=
ff_add_rect_clamped_sse2
;
c
->
put_signed_rect_clamped
=
ff_put_signed_rect_clamped_sse2
;
c
->
put_signed_rect_clamped
[
0
]
=
(
void
*
)
ff_put_signed_rect_clamped_sse2
;
c
->
add_dirac_obmc
[
1
]
=
ff_add_dirac_obmc16_sse2
;
c
->
add_dirac_obmc
[
2
]
=
ff_add_dirac_obmc32_sse2
;
...
...
libavcodec/x86/diracdsp_yasm.asm
View file @
3f07f12f
...
...
@@ -150,7 +150,7 @@ cglobal put_signed_rect_clamped_%1, 5,9,3, dst, dst_stride, src, src_stride, w,
%endif
.
loopy
:
lea
src2q
,
[
srcq
+
src_strideq
*
2
]
lea
src2q
,
[
srcq
+
src_strideq
]
lea
dst2q
,
[
dstq
+
dst_strideq
]
.
loopx
:
sub
wd
,
mmsize
...
...
@@ -164,7 +164,7 @@ cglobal put_signed_rect_clamped_%1, 5,9,3, dst, dst_stride, src, src_stride, w,
mova
[
dst2q
+
wq
]
,
m2
jg
.
loopx
lea
srcq
,
[
srcq
+
src_strideq
*
4
]
lea
srcq
,
[
srcq
+
src_strideq
*
2
]
lea
dstq
,
[
dstq
+
dst_strideq
*
2
]
sub
hd
,
2
mov
wd
,
wspill
...
...
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