Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-2-2
Commits
1efed28e
Commit
1efed28e
authored
Nov 15, 2012
by
Jean-Baptiste Kempf
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Yadif for higher bits depth
Close #6200
parent
9f2442c9
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
64 additions
and
55 deletions
+64
-55
modules/video_filter/deinterlace/algo_yadif.c
modules/video_filter/deinterlace/algo_yadif.c
+3
-0
modules/video_filter/deinterlace/deinterlace.c
modules/video_filter/deinterlace/deinterlace.c
+2
-2
modules/video_filter/deinterlace/yadif.h
modules/video_filter/deinterlace/yadif.h
+59
-53
No files found.
modules/video_filter/deinterlace/algo_yadif.c
View file @
1efed28e
...
...
@@ -125,6 +125,9 @@ int RenderYadif( filter_t *p_filter, picture_t *p_dst, picture_t *p_src,
#endif
filter
=
yadif_filter_line_c
;
if
(
p_sys
->
chroma
->
pixel_size
==
2
)
filter
=
yadif_filter_line_c_16bit
;
for
(
int
n
=
0
;
n
<
p_dst
->
i_planes
;
n
++
)
{
const
plane_t
*
prevp
=
&
p_prev
->
p
[
n
];
...
...
modules/video_filter/deinterlace/deinterlace.c
View file @
1efed28e
...
...
@@ -171,14 +171,14 @@ void SetFilterMethod( filter_t *p_filter, const char *psz_method )
p_sys
->
b_half_height
=
false
;
p_sys
->
b_use_frame_history
=
false
;
}
else
if
(
!
strcmp
(
psz_method
,
"yadif"
)
&&
p_sys
->
chroma
->
pixel_size
==
1
)
else
if
(
!
strcmp
(
psz_method
,
"yadif"
)
)
{
p_sys
->
i_mode
=
DEINTERLACE_YADIF
;
p_sys
->
b_double_rate
=
false
;
p_sys
->
b_half_height
=
false
;
p_sys
->
b_use_frame_history
=
true
;
}
else
if
(
!
strcmp
(
psz_method
,
"yadif2x"
)
&&
p_sys
->
chroma
->
pixel_size
==
1
)
else
if
(
!
strcmp
(
psz_method
,
"yadif2x"
)
)
{
p_sys
->
i_mode
=
DEINTERLACE_YADIF2X
;
p_sys
->
b_double_rate
=
true
;
...
...
modules/video_filter/deinterlace/yadif.h
View file @
1efed28e
...
...
@@ -80,62 +80,68 @@ DECLARE_ASM_CONST(16, const xmm_reg, pw_1) = {0x0001000100010001ULL, 0x000100010
#endif
#endif
static
void
yadif_filter_line_c
(
uint8_t
*
dst
,
uint8_t
*
prev
,
uint8_t
*
cur
,
uint8_t
*
next
,
int
w
,
int
prefs
,
int
mrefs
,
int
parity
,
int
mode
)
{
int
x
;
uint8_t
*
prev2
=
parity
?
prev
:
cur
;
uint8_t
*
next2
=
parity
?
cur
:
next
;
for
(
x
=
0
;
x
<
w
;
x
++
){
int
c
=
cur
[
mrefs
];
int
d
=
(
prev2
[
0
]
+
next2
[
0
])
>>
1
;
int
e
=
cur
[
prefs
];
int
temporal_diff0
=
abs
(
prev2
[
0
]
-
next2
[
0
]);
int
temporal_diff1
=
(
abs
(
prev
[
mrefs
]
-
c
)
+
abs
(
prev
[
prefs
]
-
e
)
)
>>
1
;
int
temporal_diff2
=
(
abs
(
next
[
mrefs
]
-
c
)
+
abs
(
next
[
prefs
]
-
e
)
)
>>
1
;
int
diff
=
FFMAX3
(
temporal_diff0
>>
1
,
temporal_diff1
,
temporal_diff2
);
int
spatial_pred
=
(
c
+
e
)
>>
1
;
int
spatial_score
=
abs
(
cur
[
mrefs
-
1
]
-
cur
[
prefs
-
1
])
+
abs
(
c
-
e
)
+
abs
(
cur
[
mrefs
+
1
]
-
cur
[
prefs
+
1
])
-
1
;
#define FFABS abs
#define CHECK(j)\
{ int score
= abs(cur[mrefs-1+j] - cur[prefs-1-j
])\
+ abs(cur[mrefs +j] - cur[prefs -j
])\
+ abs(cur[mrefs+1+j] - cur[prefs+1-j
]);\
if
(score < spatial_score)
{\
{ int score
= FFABS(cur[mrefs-1+(j)] - cur[prefs-1-(j)
])\
+ FFABS(cur[mrefs +(j)] - cur[prefs -(j)
])\
+ FFABS(cur[mrefs+1+(j)] - cur[prefs+1-(j)
]);\
if
(score < spatial_score)
{\
spatial_score= score;\
spatial_pred= (cur[mrefs +j] + cur[prefs -j])>>1;\
CHECK
(
-
1
)
CHECK
(
-
2
)
}}
}}
CHECK
(
1
)
CHECK
(
2
)
}}
}}
if
(
mode
<
2
){
int
b
=
(
prev2
[
2
*
mrefs
]
+
next2
[
2
*
mrefs
])
>>
1
;
int
f
=
(
prev2
[
2
*
prefs
]
+
next2
[
2
*
prefs
])
>>
1
;
#if 0
int a= cur[3*mrefs];
int g= cur[3*prefs];
int max= FFMAX3(d-e, d-c, FFMIN3(FFMAX(b-c,f-e),FFMAX(b-c,b-a),FFMAX(f-g,f-e)) );
int min= FFMIN3(d-e, d-c, FFMAX3(FFMIN(b-c,f-e),FFMIN(b-c,b-a),FFMIN(f-g,f-e)) );
#else
int
max
=
FFMAX3
(
d
-
e
,
d
-
c
,
FFMIN
(
b
-
c
,
f
-
e
));
int
min
=
FFMIN3
(
d
-
e
,
d
-
c
,
FFMAX
(
b
-
c
,
f
-
e
));
#endif
diff
=
FFMAX3
(
diff
,
min
,
-
max
);
}
if
(
spatial_pred
>
d
+
diff
)
spatial_pred
=
d
+
diff
;
else
if
(
spatial_pred
<
d
-
diff
)
spatial_pred
=
d
-
diff
;
dst
[
0
]
=
spatial_pred
;
dst
++
;
cur
++
;
prev
++
;
next
++
;
prev2
++
;
next2
++
;
spatial_pred= (cur[mrefs +(j)] + cur[prefs -(j)])>>1;\
#define FILTER \
for (x = 0; x < w; x++) { \
int c = cur[mrefs]; \
int d = (prev2[0] + next2[0])>>1; \
int e = cur[prefs]; \
int temporal_diff0 = FFABS(prev2[0] - next2[0]); \
int temporal_diff1 =(FFABS(prev[mrefs] - c) + FFABS(prev[prefs] - e) )>>1; \
int temporal_diff2 =(FFABS(next[mrefs] - c) + FFABS(next[prefs] - e) )>>1; \
int diff = FFMAX3(temporal_diff0>>1, temporal_diff1, temporal_diff2); \
int spatial_pred = (c+e)>>1; \
int spatial_score = FFABS(cur[mrefs-1] - cur[prefs-1]) + FFABS(c-e) \
+ FFABS(cur[mrefs+1] - cur[prefs+1]) - 1; \
\
CHECK(-1) CHECK(-2) }} }} \
CHECK( 1) CHECK( 2) }} }} \
\
if (mode < 2) { \
int b = (prev2[2*mrefs] + next2[2*mrefs])>>1; \
int f = (prev2[2*prefs] + next2[2*prefs])>>1; \
int max = FFMAX3(d-e, d-c, FFMIN(b-c, f-e)); \
int min = FFMIN3(d-e, d-c, FFMAX(b-c, f-e)); \
\
diff = FFMAX3(diff, min, -max); \
} \
\
if (spatial_pred > d + diff) \
spatial_pred = d + diff; \
else if (spatial_pred < d - diff) \
spatial_pred = d - diff; \
\
dst[0] = spatial_pred; \
\
dst++; \
cur++; \
prev++; \
next++; \
prev2++; \
next2++; \
}
static
void
yadif_filter_line_c
(
uint8_t
*
dst
,
uint8_t
*
prev
,
uint8_t
*
cur
,
uint8_t
*
next
,
int
w
,
int
prefs
,
int
mrefs
,
int
parity
,
int
mode
)
{
int
x
;
uint8_t
*
prev2
=
parity
?
prev
:
cur
;
uint8_t
*
next2
=
parity
?
cur
:
next
;
FILTER
}
static
void
yadif_filter_line_c_16bit
(
uint16_t
*
dst
,
uint16_t
*
prev
,
uint16_t
*
cur
,
uint16_t
*
next
,
int
w
,
int
prefs
,
int
mrefs
,
int
parity
,
int
mode
)
{
int
x
;
uint16_t
*
prev2
=
parity
?
prev
:
cur
;
uint16_t
*
next2
=
parity
?
cur
:
next
;
mrefs
/=
2
;
prefs
/=
2
;
FILTER
}
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