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
a4f6be86
Commit
a4f6be86
authored
Jul 10, 2011
by
Jason Garrett-Glaser
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
H.264: optimize intra/inter loopfilter decision
parent
8923cfa3
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
117 additions
and
116 deletions
+117
-116
h264_loopfilter.c
libavcodec/h264_loopfilter.c
+117
-116
No files found.
libavcodec/h264_loopfilter.c
View file @
a4f6be86
...
...
@@ -100,14 +100,15 @@ static const uint8_t tc0_table[52*3][4] = {
{
-
1
,
13
,
17
,
25
},
{
-
1
,
13
,
17
,
25
},
{
-
1
,
13
,
17
,
25
},
{
-
1
,
13
,
17
,
25
},
};
static
void
av_always_inline
filter_mb_edgev
(
uint8_t
*
pix
,
int
stride
,
const
int16_t
bS
[
4
],
unsigned
int
qp
,
H264Context
*
h
)
{
/* intra: 0 if this loopfilter call is guaranteed to be inter (bS < 4), 1 if it might be intra (bS == 4) */
static
void
av_always_inline
filter_mb_edgev
(
uint8_t
*
pix
,
int
stride
,
const
int16_t
bS
[
4
],
unsigned
int
qp
,
H264Context
*
h
,
int
intra
)
{
const
int
qp_bd_offset
=
6
*
(
h
->
sps
.
bit_depth_luma
-
8
);
const
unsigned
int
index_a
=
qp
-
qp_bd_offset
+
h
->
slice_alpha_c0_offset
;
const
int
alpha
=
alpha_table
[
index_a
];
const
int
beta
=
beta_table
[
qp
-
qp_bd_offset
+
h
->
slice_beta_offset
];
if
(
alpha
==
0
||
beta
==
0
)
return
;
if
(
bS
[
0
]
<
4
)
{
if
(
bS
[
0
]
<
4
||
!
intra
)
{
int8_t
tc
[
4
];
tc
[
0
]
=
tc0_table
[
index_a
][
bS
[
0
]];
tc
[
1
]
=
tc0_table
[
index_a
][
bS
[
1
]];
...
...
@@ -118,14 +119,14 @@ static void av_always_inline filter_mb_edgev( uint8_t *pix, int stride, const in
h
->
h264dsp
.
h264_h_loop_filter_luma_intra
(
pix
,
stride
,
alpha
,
beta
);
}
}
static
void
av_always_inline
filter_mb_edgecv
(
uint8_t
*
pix
,
int
stride
,
const
int16_t
bS
[
4
],
unsigned
int
qp
,
H264Context
*
h
)
{
static
void
av_always_inline
filter_mb_edgecv
(
uint8_t
*
pix
,
int
stride
,
const
int16_t
bS
[
4
],
unsigned
int
qp
,
H264Context
*
h
,
int
intra
)
{
const
int
qp_bd_offset
=
6
*
(
h
->
sps
.
bit_depth_luma
-
8
);
const
unsigned
int
index_a
=
qp
-
qp_bd_offset
+
h
->
slice_alpha_c0_offset
;
const
int
alpha
=
alpha_table
[
index_a
];
const
int
beta
=
beta_table
[
qp
-
qp_bd_offset
+
h
->
slice_beta_offset
];
if
(
alpha
==
0
||
beta
==
0
)
return
;
if
(
bS
[
0
]
<
4
)
{
if
(
bS
[
0
]
<
4
||
!
intra
)
{
int8_t
tc
[
4
];
tc
[
0
]
=
tc0_table
[
index_a
][
bS
[
0
]]
+
1
;
tc
[
1
]
=
tc0_table
[
index_a
][
bS
[
1
]]
+
1
;
...
...
@@ -137,14 +138,14 @@ static void av_always_inline filter_mb_edgecv( uint8_t *pix, int stride, const i
}
}
static
void
filter_mb_mbaff_edgev
(
H264Context
*
h
,
uint8_t
*
pix
,
int
stride
,
const
int16_t
bS
[
7
],
int
bsi
,
int
qp
)
{
static
void
av_always_inline
filter_mb_mbaff_edgev
(
H264Context
*
h
,
uint8_t
*
pix
,
int
stride
,
const
int16_t
bS
[
7
],
int
bsi
,
int
qp
,
int
intra
)
{
const
int
qp_bd_offset
=
6
*
(
h
->
sps
.
bit_depth_luma
-
8
);
int
index_a
=
qp
-
qp_bd_offset
+
h
->
slice_alpha_c0_offset
;
int
alpha
=
alpha_table
[
index_a
];
int
beta
=
beta_table
[
qp
-
qp_bd_offset
+
h
->
slice_beta_offset
];
if
(
alpha
==
0
||
beta
==
0
)
return
;
if
(
bS
[
0
]
<
4
)
{
if
(
bS
[
0
]
<
4
||
!
intra
)
{
int8_t
tc
[
4
];
tc
[
0
]
=
tc0_table
[
index_a
][
bS
[
0
*
bsi
]];
tc
[
1
]
=
tc0_table
[
index_a
][
bS
[
1
*
bsi
]];
...
...
@@ -155,14 +156,14 @@ static void filter_mb_mbaff_edgev( H264Context *h, uint8_t *pix, int stride, con
h
->
h264dsp
.
h264_h_loop_filter_luma_mbaff_intra
(
pix
,
stride
,
alpha
,
beta
);
}
}
static
void
filter_mb_mbaff_edgecv
(
H264Context
*
h
,
uint8_t
*
pix
,
int
stride
,
const
int16_t
bS
[
7
],
int
bsi
,
int
qp
)
{
static
void
av_always_inline
filter_mb_mbaff_edgecv
(
H264Context
*
h
,
uint8_t
*
pix
,
int
stride
,
const
int16_t
bS
[
7
],
int
bsi
,
int
qp
,
int
intra
)
{
const
int
qp_bd_offset
=
6
*
(
h
->
sps
.
bit_depth_luma
-
8
);
int
index_a
=
qp
-
qp_bd_offset
+
h
->
slice_alpha_c0_offset
;
int
alpha
=
alpha_table
[
index_a
];
int
beta
=
beta_table
[
qp
-
qp_bd_offset
+
h
->
slice_beta_offset
];
if
(
alpha
==
0
||
beta
==
0
)
return
;
if
(
bS
[
0
]
<
4
)
{
if
(
bS
[
0
]
<
4
||
!
intra
)
{
int8_t
tc
[
4
];
tc
[
0
]
=
tc0_table
[
index_a
][
bS
[
0
*
bsi
]]
+
1
;
tc
[
1
]
=
tc0_table
[
index_a
][
bS
[
1
*
bsi
]]
+
1
;
...
...
@@ -174,14 +175,14 @@ static void filter_mb_mbaff_edgecv( H264Context *h, uint8_t *pix, int stride, co
}
}
static
void
av_always_inline
filter_mb_edgeh
(
uint8_t
*
pix
,
int
stride
,
const
int16_t
bS
[
4
],
unsigned
int
qp
,
H264Context
*
h
)
{
static
void
av_always_inline
filter_mb_edgeh
(
uint8_t
*
pix
,
int
stride
,
const
int16_t
bS
[
4
],
unsigned
int
qp
,
H264Context
*
h
,
int
intra
)
{
const
int
qp_bd_offset
=
6
*
(
h
->
sps
.
bit_depth_luma
-
8
);
const
unsigned
int
index_a
=
qp
-
qp_bd_offset
+
h
->
slice_alpha_c0_offset
;
const
int
alpha
=
alpha_table
[
index_a
];
const
int
beta
=
beta_table
[
qp
-
qp_bd_offset
+
h
->
slice_beta_offset
];
if
(
alpha
==
0
||
beta
==
0
)
return
;
if
(
bS
[
0
]
<
4
)
{
if
(
bS
[
0
]
<
4
||
!
intra
)
{
int8_t
tc
[
4
];
tc
[
0
]
=
tc0_table
[
index_a
][
bS
[
0
]];
tc
[
1
]
=
tc0_table
[
index_a
][
bS
[
1
]];
...
...
@@ -193,14 +194,14 @@ static void av_always_inline filter_mb_edgeh( uint8_t *pix, int stride, const in
}
}
static
void
av_always_inline
filter_mb_edgech
(
uint8_t
*
pix
,
int
stride
,
const
int16_t
bS
[
4
],
unsigned
int
qp
,
H264Context
*
h
)
{
static
void
av_always_inline
filter_mb_edgech
(
uint8_t
*
pix
,
int
stride
,
const
int16_t
bS
[
4
],
unsigned
int
qp
,
H264Context
*
h
,
int
intra
)
{
const
int
qp_bd_offset
=
6
*
(
h
->
sps
.
bit_depth_luma
-
8
);
const
unsigned
int
index_a
=
qp
-
qp_bd_offset
+
h
->
slice_alpha_c0_offset
;
const
int
alpha
=
alpha_table
[
index_a
];
const
int
beta
=
beta_table
[
qp
-
qp_bd_offset
+
h
->
slice_beta_offset
];
if
(
alpha
==
0
||
beta
==
0
)
return
;
if
(
bS
[
0
]
<
4
)
{
if
(
bS
[
0
]
<
4
||
!
intra
)
{
int8_t
tc
[
4
];
tc
[
0
]
=
tc0_table
[
index_a
][
bS
[
0
]]
+
1
;
tc
[
1
]
=
tc0_table
[
index_a
][
bS
[
1
]]
+
1
;
...
...
@@ -247,70 +248,70 @@ void ff_h264_filter_mb_fast( H264Context *h, int mb_x, int mb_y, uint8_t *img_y,
static
const
int16_t
bS3
[
4
]
=
{
3
,
3
,
3
,
3
};
const
int16_t
*
bSH
=
FIELD_PICTURE
?
bS3
:
bS4
;
if
(
left_type
)
filter_mb_edgev
(
&
img_y
[
4
*
0
],
linesize
,
bS4
,
qp0
,
h
);
filter_mb_edgev
(
&
img_y
[
4
*
0
],
linesize
,
bS4
,
qp0
,
h
,
1
);
if
(
IS_8x8DCT
(
mb_type
)
)
{
filter_mb_edgev
(
&
img_y
[
4
*
2
],
linesize
,
bS3
,
qp
,
h
);
filter_mb_edgev
(
&
img_y
[
4
*
2
],
linesize
,
bS3
,
qp
,
h
,
0
);
if
(
top_type
){
filter_mb_edgeh
(
&
img_y
[
4
*
0
*
linesize
],
linesize
,
bSH
,
qp1
,
h
);
filter_mb_edgeh
(
&
img_y
[
4
*
0
*
linesize
],
linesize
,
bSH
,
qp1
,
h
,
1
);
}
filter_mb_edgeh
(
&
img_y
[
4
*
2
*
linesize
],
linesize
,
bS3
,
qp
,
h
);
filter_mb_edgeh
(
&
img_y
[
4
*
2
*
linesize
],
linesize
,
bS3
,
qp
,
h
,
0
);
}
else
{
filter_mb_edgev
(
&
img_y
[
4
*
1
],
linesize
,
bS3
,
qp
,
h
);
filter_mb_edgev
(
&
img_y
[
4
*
2
],
linesize
,
bS3
,
qp
,
h
);
filter_mb_edgev
(
&
img_y
[
4
*
3
],
linesize
,
bS3
,
qp
,
h
);
filter_mb_edgev
(
&
img_y
[
4
*
1
],
linesize
,
bS3
,
qp
,
h
,
0
);
filter_mb_edgev
(
&
img_y
[
4
*
2
],
linesize
,
bS3
,
qp
,
h
,
0
);
filter_mb_edgev
(
&
img_y
[
4
*
3
],
linesize
,
bS3
,
qp
,
h
,
0
);
if
(
top_type
){
filter_mb_edgeh
(
&
img_y
[
4
*
0
*
linesize
],
linesize
,
bSH
,
qp1
,
h
);
filter_mb_edgeh
(
&
img_y
[
4
*
0
*
linesize
],
linesize
,
bSH
,
qp1
,
h
,
1
);
}
filter_mb_edgeh
(
&
img_y
[
4
*
1
*
linesize
],
linesize
,
bS3
,
qp
,
h
);
filter_mb_edgeh
(
&
img_y
[
4
*
2
*
linesize
],
linesize
,
bS3
,
qp
,
h
);
filter_mb_edgeh
(
&
img_y
[
4
*
3
*
linesize
],
linesize
,
bS3
,
qp
,
h
);
filter_mb_edgeh
(
&
img_y
[
4
*
1
*
linesize
],
linesize
,
bS3
,
qp
,
h
,
0
);
filter_mb_edgeh
(
&
img_y
[
4
*
2
*
linesize
],
linesize
,
bS3
,
qp
,
h
,
0
);
filter_mb_edgeh
(
&
img_y
[
4
*
3
*
linesize
],
linesize
,
bS3
,
qp
,
h
,
0
);
}
if
(
chroma
){
if
(
chroma444
){
if
(
left_type
){
filter_mb_edgev
(
&
img_cb
[
4
*
0
],
linesize
,
bS4
,
qpc0
,
h
);
filter_mb_edgev
(
&
img_cr
[
4
*
0
],
linesize
,
bS4
,
qpc0
,
h
);
filter_mb_edgev
(
&
img_cb
[
4
*
0
],
linesize
,
bS4
,
qpc0
,
h
,
1
);
filter_mb_edgev
(
&
img_cr
[
4
*
0
],
linesize
,
bS4
,
qpc0
,
h
,
1
);
}
if
(
IS_8x8DCT
(
mb_type
)
)
{
filter_mb_edgev
(
&
img_cb
[
4
*
2
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgev
(
&
img_cr
[
4
*
2
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgev
(
&
img_cb
[
4
*
2
],
linesize
,
bS3
,
qpc
,
h
,
0
);
filter_mb_edgev
(
&
img_cr
[
4
*
2
],
linesize
,
bS3
,
qpc
,
h
,
0
);
if
(
top_type
){
filter_mb_edgeh
(
&
img_cb
[
4
*
0
*
linesize
],
linesize
,
bSH
,
qpc1
,
h
);
filter_mb_edgeh
(
&
img_cr
[
4
*
0
*
linesize
],
linesize
,
bSH
,
qpc1
,
h
);
filter_mb_edgeh
(
&
img_cb
[
4
*
0
*
linesize
],
linesize
,
bSH
,
qpc1
,
h
,
1
);
filter_mb_edgeh
(
&
img_cr
[
4
*
0
*
linesize
],
linesize
,
bSH
,
qpc1
,
h
,
1
);
}
filter_mb_edgeh
(
&
img_cb
[
4
*
2
*
linesize
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgeh
(
&
img_cr
[
4
*
2
*
linesize
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgeh
(
&
img_cb
[
4
*
2
*
linesize
],
linesize
,
bS3
,
qpc
,
h
,
0
);
filter_mb_edgeh
(
&
img_cr
[
4
*
2
*
linesize
],
linesize
,
bS3
,
qpc
,
h
,
0
);
}
else
{
filter_mb_edgev
(
&
img_cb
[
4
*
1
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgev
(
&
img_cr
[
4
*
1
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgev
(
&
img_cb
[
4
*
2
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgev
(
&
img_cr
[
4
*
2
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgev
(
&
img_cb
[
4
*
3
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgev
(
&
img_cr
[
4
*
3
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgev
(
&
img_cb
[
4
*
1
],
linesize
,
bS3
,
qpc
,
h
,
0
);
filter_mb_edgev
(
&
img_cr
[
4
*
1
],
linesize
,
bS3
,
qpc
,
h
,
0
);
filter_mb_edgev
(
&
img_cb
[
4
*
2
],
linesize
,
bS3
,
qpc
,
h
,
0
);
filter_mb_edgev
(
&
img_cr
[
4
*
2
],
linesize
,
bS3
,
qpc
,
h
,
0
);
filter_mb_edgev
(
&
img_cb
[
4
*
3
],
linesize
,
bS3
,
qpc
,
h
,
0
);
filter_mb_edgev
(
&
img_cr
[
4
*
3
],
linesize
,
bS3
,
qpc
,
h
,
0
);
if
(
top_type
){
filter_mb_edgeh
(
&
img_cb
[
4
*
0
*
linesize
],
linesize
,
bSH
,
qpc1
,
h
);
filter_mb_edgeh
(
&
img_cr
[
4
*
0
*
linesize
],
linesize
,
bSH
,
qpc1
,
h
);
filter_mb_edgeh
(
&
img_cb
[
4
*
0
*
linesize
],
linesize
,
bSH
,
qpc1
,
h
,
1
);
filter_mb_edgeh
(
&
img_cr
[
4
*
0
*
linesize
],
linesize
,
bSH
,
qpc1
,
h
,
1
);
}
filter_mb_edgeh
(
&
img_cb
[
4
*
1
*
linesize
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgeh
(
&
img_cr
[
4
*
1
*
linesize
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgeh
(
&
img_cb
[
4
*
2
*
linesize
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgeh
(
&
img_cr
[
4
*
2
*
linesize
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgeh
(
&
img_cb
[
4
*
3
*
linesize
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgeh
(
&
img_cr
[
4
*
3
*
linesize
],
linesize
,
bS3
,
qpc
,
h
);
filter_mb_edgeh
(
&
img_cb
[
4
*
1
*
linesize
],
linesize
,
bS3
,
qpc
,
h
,
0
);
filter_mb_edgeh
(
&
img_cr
[
4
*
1
*
linesize
],
linesize
,
bS3
,
qpc
,
h
,
0
);
filter_mb_edgeh
(
&
img_cb
[
4
*
2
*
linesize
],
linesize
,
bS3
,
qpc
,
h
,
0
);
filter_mb_edgeh
(
&
img_cr
[
4
*
2
*
linesize
],
linesize
,
bS3
,
qpc
,
h
,
0
);
filter_mb_edgeh
(
&
img_cb
[
4
*
3
*
linesize
],
linesize
,
bS3
,
qpc
,
h
,
0
);
filter_mb_edgeh
(
&
img_cr
[
4
*
3
*
linesize
],
linesize
,
bS3
,
qpc
,
h
,
0
);
}
}
else
{
if
(
left_type
){
filter_mb_edgecv
(
&
img_cb
[
2
*
0
],
uvlinesize
,
bS4
,
qpc0
,
h
);
filter_mb_edgecv
(
&
img_cr
[
2
*
0
],
uvlinesize
,
bS4
,
qpc0
,
h
);
filter_mb_edgecv
(
&
img_cb
[
2
*
0
],
uvlinesize
,
bS4
,
qpc0
,
h
,
1
);
filter_mb_edgecv
(
&
img_cr
[
2
*
0
],
uvlinesize
,
bS4
,
qpc0
,
h
,
1
);
}
filter_mb_edgecv
(
&
img_cb
[
2
*
2
],
uvlinesize
,
bS3
,
qpc
,
h
);
filter_mb_edgecv
(
&
img_cr
[
2
*
2
],
uvlinesize
,
bS3
,
qpc
,
h
);
filter_mb_edgecv
(
&
img_cb
[
2
*
2
],
uvlinesize
,
bS3
,
qpc
,
h
,
0
);
filter_mb_edgecv
(
&
img_cr
[
2
*
2
],
uvlinesize
,
bS3
,
qpc
,
h
,
0
);
if
(
top_type
){
filter_mb_edgech
(
&
img_cb
[
2
*
0
*
uvlinesize
],
uvlinesize
,
bSH
,
qpc1
,
h
);
filter_mb_edgech
(
&
img_cr
[
2
*
0
*
uvlinesize
],
uvlinesize
,
bSH
,
qpc1
,
h
);
filter_mb_edgech
(
&
img_cb
[
2
*
0
*
uvlinesize
],
uvlinesize
,
bSH
,
qpc1
,
h
,
1
);
filter_mb_edgech
(
&
img_cr
[
2
*
0
*
uvlinesize
],
uvlinesize
,
bSH
,
qpc1
,
h
,
1
);
}
filter_mb_edgech
(
&
img_cb
[
2
*
2
*
uvlinesize
],
uvlinesize
,
bS3
,
qpc
,
h
);
filter_mb_edgech
(
&
img_cr
[
2
*
2
*
uvlinesize
],
uvlinesize
,
bS3
,
qpc
,
h
);
filter_mb_edgech
(
&
img_cb
[
2
*
2
*
uvlinesize
],
uvlinesize
,
bS3
,
qpc
,
h
,
0
);
filter_mb_edgech
(
&
img_cr
[
2
*
2
*
uvlinesize
],
uvlinesize
,
bS3
,
qpc
,
h
,
0
);
}
}
return
;
...
...
@@ -336,38 +337,38 @@ void ff_h264_filter_mb_fast( H264Context *h, int mb_x, int mb_y, uint8_t *img_y,
if
(
IS_INTRA
(
top_type
)
)
AV_WN64A
(
bS
[
1
][
0
],
FIELD_PICTURE
?
0x0003000300030003ULL
:
0x0004000400040004ULL
);
#define FILTER(hv,dir,edge)\
#define FILTER(hv,dir,edge
,intra
)\
if(AV_RN64A(bS[dir][edge])) { \
filter_mb_edge##hv( &img_y[4*edge*(dir?linesize:1)], linesize, bS[dir][edge], edge ? qp : qp##dir, h );\
filter_mb_edge##hv( &img_y[4*edge*(dir?linesize:1)], linesize, bS[dir][edge], edge ? qp : qp##dir, h
, intra
);\
if(chroma){\
if(chroma444){\
filter_mb_edge##hv( &img_cb[4*edge*(dir?linesize:1)], linesize, bS[dir][edge], edge ? qpc : qpc##dir, h );\
filter_mb_edge##hv( &img_cr[4*edge*(dir?linesize:1)], linesize, bS[dir][edge], edge ? qpc : qpc##dir, h );\
filter_mb_edge##hv( &img_cb[4*edge*(dir?linesize:1)], linesize, bS[dir][edge], edge ? qpc : qpc##dir, h
, intra
);\
filter_mb_edge##hv( &img_cr[4*edge*(dir?linesize:1)], linesize, bS[dir][edge], edge ? qpc : qpc##dir, h
, intra
);\
} else if(!(edge&1)) {\
filter_mb_edgec##hv( &img_cb[2*edge*(dir?uvlinesize:1)], uvlinesize, bS[dir][edge], edge ? qpc : qpc##dir, h );\
filter_mb_edgec##hv( &img_cr[2*edge*(dir?uvlinesize:1)], uvlinesize, bS[dir][edge], edge ? qpc : qpc##dir, h );\
filter_mb_edgec##hv( &img_cb[2*edge*(dir?uvlinesize:1)], uvlinesize, bS[dir][edge], edge ? qpc : qpc##dir, h
, intra
);\
filter_mb_edgec##hv( &img_cr[2*edge*(dir?uvlinesize:1)], uvlinesize, bS[dir][edge], edge ? qpc : qpc##dir, h
, intra
);\
}\
}\
}
if
(
left_type
)
FILTER
(
v
,
0
,
0
);
FILTER
(
v
,
0
,
0
,
1
);
if
(
edges
==
1
)
{
if
(
top_type
)
FILTER
(
h
,
1
,
0
);
FILTER
(
h
,
1
,
0
,
1
);
}
else
if
(
IS_8x8DCT
(
mb_type
)
)
{
FILTER
(
v
,
0
,
2
);
FILTER
(
v
,
0
,
2
,
0
);
if
(
top_type
)
FILTER
(
h
,
1
,
0
);
FILTER
(
h
,
1
,
2
);
FILTER
(
h
,
1
,
0
,
1
);
FILTER
(
h
,
1
,
2
,
0
);
}
else
{
FILTER
(
v
,
0
,
1
);
FILTER
(
v
,
0
,
2
);
FILTER
(
v
,
0
,
3
);
FILTER
(
v
,
0
,
1
,
0
);
FILTER
(
v
,
0
,
2
,
0
);
FILTER
(
v
,
0
,
3
,
0
);
if
(
top_type
)
FILTER
(
h
,
1
,
0
);
FILTER
(
h
,
1
,
1
);
FILTER
(
h
,
1
,
2
);
FILTER
(
h
,
1
,
3
);
FILTER
(
h
,
1
,
0
,
1
);
FILTER
(
h
,
1
,
1
,
0
);
FILTER
(
h
,
1
,
2
,
0
);
FILTER
(
h
,
1
,
3
,
0
);
}
#undef FILTER
}
...
...
@@ -456,16 +457,16 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u
qp
=
(
s
->
current_picture
.
f
.
qscale_table
[
mb_xy
]
+
s
->
current_picture
.
f
.
qscale_table
[
mbn_xy
]
+
1
)
>>
1
;
tprintf
(
s
->
avctx
,
"filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d"
,
mb_x
,
mb_y
,
dir
,
edge
,
qp
,
tmp_linesize
,
tmp_uvlinesize
);
{
int
i
;
for
(
i
=
0
;
i
<
4
;
i
++
)
tprintf
(
s
->
avctx
,
" bS[%d]:%d"
,
i
,
bS
[
i
]);
tprintf
(
s
->
avctx
,
"
\n
"
);
}
filter_mb_edgeh
(
&
img_y
[
j
*
linesize
],
tmp_linesize
,
bS
,
qp
,
h
);
filter_mb_edgeh
(
&
img_y
[
j
*
linesize
],
tmp_linesize
,
bS
,
qp
,
h
,
0
);
chroma_qp_avg
[
0
]
=
(
h
->
chroma_qp
[
0
]
+
get_chroma_qp
(
h
,
0
,
s
->
current_picture
.
f
.
qscale_table
[
mbn_xy
])
+
1
)
>>
1
;
chroma_qp_avg
[
1
]
=
(
h
->
chroma_qp
[
1
]
+
get_chroma_qp
(
h
,
1
,
s
->
current_picture
.
f
.
qscale_table
[
mbn_xy
])
+
1
)
>>
1
;
if
(
chroma
)
{
if
(
chroma444
)
{
filter_mb_edgeh
(
&
img_cb
[
j
*
uvlinesize
],
tmp_uvlinesize
,
bS
,
chroma_qp_avg
[
0
],
h
);
filter_mb_edgeh
(
&
img_cr
[
j
*
uvlinesize
],
tmp_uvlinesize
,
bS
,
chroma_qp_avg
[
1
],
h
);
filter_mb_edgeh
(
&
img_cb
[
j
*
uvlinesize
],
tmp_uvlinesize
,
bS
,
chroma_qp_avg
[
0
],
h
,
0
);
filter_mb_edgeh
(
&
img_cr
[
j
*
uvlinesize
],
tmp_uvlinesize
,
bS
,
chroma_qp_avg
[
1
],
h
,
0
);
}
else
{
filter_mb_edgech
(
&
img_cb
[
j
*
uvlinesize
],
tmp_uvlinesize
,
bS
,
chroma_qp_avg
[
0
],
h
);
filter_mb_edgech
(
&
img_cr
[
j
*
uvlinesize
],
tmp_uvlinesize
,
bS
,
chroma_qp_avg
[
1
],
h
);
filter_mb_edgech
(
&
img_cb
[
j
*
uvlinesize
],
tmp_uvlinesize
,
bS
,
chroma_qp_avg
[
0
],
h
,
0
);
filter_mb_edgech
(
&
img_cr
[
j
*
uvlinesize
],
tmp_uvlinesize
,
bS
,
chroma_qp_avg
[
1
],
h
,
0
);
}
}
}
...
...
@@ -525,25 +526,25 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u
chroma_qp_avg
[
0
]
=
(
h
->
chroma_qp
[
0
]
+
get_chroma_qp
(
h
,
0
,
s
->
current_picture
.
f
.
qscale_table
[
mbm_xy
])
+
1
)
>>
1
;
chroma_qp_avg
[
1
]
=
(
h
->
chroma_qp
[
1
]
+
get_chroma_qp
(
h
,
1
,
s
->
current_picture
.
f
.
qscale_table
[
mbm_xy
])
+
1
)
>>
1
;
if
(
dir
==
0
)
{
filter_mb_edgev
(
&
img_y
[
0
],
linesize
,
bS
,
qp
,
h
);
filter_mb_edgev
(
&
img_y
[
0
],
linesize
,
bS
,
qp
,
h
,
1
);
if
(
chroma
)
{
if
(
chroma444
)
{
filter_mb_edgev
(
&
img_cb
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
0
],
h
);
filter_mb_edgev
(
&
img_cr
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
1
],
h
);
filter_mb_edgev
(
&
img_cb
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
0
],
h
,
1
);
filter_mb_edgev
(
&
img_cr
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
1
],
h
,
1
);
}
else
{
filter_mb_edgecv
(
&
img_cb
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
0
],
h
);
filter_mb_edgecv
(
&
img_cr
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
1
],
h
);
filter_mb_edgecv
(
&
img_cb
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
0
],
h
,
1
);
filter_mb_edgecv
(
&
img_cr
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
1
],
h
,
1
);
}
}
}
else
{
filter_mb_edgeh
(
&
img_y
[
0
],
linesize
,
bS
,
qp
,
h
);
filter_mb_edgeh
(
&
img_y
[
0
],
linesize
,
bS
,
qp
,
h
,
1
);
if
(
chroma
)
{
if
(
chroma444
)
{
filter_mb_edgeh
(
&
img_cb
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
0
],
h
);
filter_mb_edgeh
(
&
img_cr
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
1
],
h
);
filter_mb_edgeh
(
&
img_cb
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
0
],
h
,
1
);
filter_mb_edgeh
(
&
img_cr
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
1
],
h
,
1
);
}
else
{
filter_mb_edgech
(
&
img_cb
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
0
],
h
);
filter_mb_edgech
(
&
img_cr
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
1
],
h
);
filter_mb_edgech
(
&
img_cb
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
0
],
h
,
1
);
filter_mb_edgech
(
&
img_cr
[
0
],
uvlinesize
,
bS
,
chroma_qp_avg
[
1
],
h
,
1
);
}
}
}
...
...
@@ -607,25 +608,25 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u
tprintf
(
s
->
avctx
,
"filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d"
,
mb_x
,
mb_y
,
dir
,
edge
,
qp
,
linesize
,
uvlinesize
);
//{ int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); }
if
(
dir
==
0
)
{
filter_mb_edgev
(
&
img_y
[
4
*
edge
<<
h
->
pixel_shift
],
linesize
,
bS
,
qp
,
h
);
filter_mb_edgev
(
&
img_y
[
4
*
edge
<<
h
->
pixel_shift
],
linesize
,
bS
,
qp
,
h
,
0
);
if
(
chroma
)
{
if
(
chroma444
)
{
filter_mb_edgev
(
&
img_cb
[
4
*
edge
<<
h
->
pixel_shift
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
0
],
h
);
filter_mb_edgev
(
&
img_cr
[
4
*
edge
<<
h
->
pixel_shift
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
1
],
h
);
filter_mb_edgev
(
&
img_cb
[
4
*
edge
<<
h
->
pixel_shift
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
0
],
h
,
0
);
filter_mb_edgev
(
&
img_cr
[
4
*
edge
<<
h
->
pixel_shift
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
1
],
h
,
0
);
}
else
if
(
(
edge
&
1
)
==
0
)
{
filter_mb_edgecv
(
&
img_cb
[
2
*
edge
<<
h
->
pixel_shift
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
0
],
h
);
filter_mb_edgecv
(
&
img_cr
[
2
*
edge
<<
h
->
pixel_shift
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
1
],
h
);
filter_mb_edgecv
(
&
img_cb
[
2
*
edge
<<
h
->
pixel_shift
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
0
],
h
,
0
);
filter_mb_edgecv
(
&
img_cr
[
2
*
edge
<<
h
->
pixel_shift
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
1
],
h
,
0
);
}
}
}
else
{
filter_mb_edgeh
(
&
img_y
[
4
*
edge
*
linesize
],
linesize
,
bS
,
qp
,
h
);
filter_mb_edgeh
(
&
img_y
[
4
*
edge
*
linesize
],
linesize
,
bS
,
qp
,
h
,
0
);
if
(
chroma
)
{
if
(
chroma444
)
{
filter_mb_edgeh
(
&
img_cb
[
4
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
0
],
h
);
filter_mb_edgeh
(
&
img_cr
[
4
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
1
],
h
);
filter_mb_edgeh
(
&
img_cb
[
4
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
0
],
h
,
0
);
filter_mb_edgeh
(
&
img_cr
[
4
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
1
],
h
,
0
);
}
else
if
(
(
edge
&
1
)
==
0
)
{
filter_mb_edgech
(
&
img_cb
[
2
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
0
],
h
);
filter_mb_edgech
(
&
img_cr
[
2
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
1
],
h
);
filter_mb_edgech
(
&
img_cb
[
2
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
0
],
h
,
0
);
filter_mb_edgech
(
&
img_cr
[
2
*
edge
*
uvlinesize
],
uvlinesize
,
bS
,
h
->
chroma_qp
[
1
],
h
,
0
);
}
}
}
...
...
@@ -706,35 +707,35 @@ void ff_h264_filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint
tprintf
(
s
->
avctx
,
"filter mb:%d/%d MBAFF, QPy:%d/%d, QPb:%d/%d QPr:%d/%d ls:%d uvls:%d"
,
mb_x
,
mb_y
,
qp
[
0
],
qp
[
1
],
bqp
[
0
],
bqp
[
1
],
rqp
[
0
],
rqp
[
1
],
linesize
,
uvlinesize
);
{
int
i
;
for
(
i
=
0
;
i
<
8
;
i
++
)
tprintf
(
s
->
avctx
,
" bS[%d]:%d"
,
i
,
bS
[
i
]);
tprintf
(
s
->
avctx
,
"
\n
"
);
}
if
(
MB_FIELD
){
filter_mb_mbaff_edgev
(
h
,
img_y
,
linesize
,
bS
,
1
,
qp
[
0
]
);
filter_mb_mbaff_edgev
(
h
,
img_y
+
8
*
linesize
,
linesize
,
bS
+
4
,
1
,
qp
[
1
]
);
filter_mb_mbaff_edgev
(
h
,
img_y
,
linesize
,
bS
,
1
,
qp
[
0
]
,
1
);
filter_mb_mbaff_edgev
(
h
,
img_y
+
8
*
linesize
,
linesize
,
bS
+
4
,
1
,
qp
[
1
]
,
1
);
if
(
chroma
){
if
(
CHROMA444
)
{
filter_mb_mbaff_edgev
(
h
,
img_cb
,
uvlinesize
,
bS
,
1
,
bqp
[
0
]
);
filter_mb_mbaff_edgev
(
h
,
img_cb
+
8
*
uvlinesize
,
uvlinesize
,
bS
+
4
,
1
,
bqp
[
1
]
);
filter_mb_mbaff_edgev
(
h
,
img_cr
,
uvlinesize
,
bS
,
1
,
rqp
[
0
]
);
filter_mb_mbaff_edgev
(
h
,
img_cr
+
8
*
uvlinesize
,
uvlinesize
,
bS
+
4
,
1
,
rqp
[
1
]
);
filter_mb_mbaff_edgev
(
h
,
img_cb
,
uvlinesize
,
bS
,
1
,
bqp
[
0
]
,
1
);
filter_mb_mbaff_edgev
(
h
,
img_cb
+
8
*
uvlinesize
,
uvlinesize
,
bS
+
4
,
1
,
bqp
[
1
]
,
1
);
filter_mb_mbaff_edgev
(
h
,
img_cr
,
uvlinesize
,
bS
,
1
,
rqp
[
0
]
,
1
);
filter_mb_mbaff_edgev
(
h
,
img_cr
+
8
*
uvlinesize
,
uvlinesize
,
bS
+
4
,
1
,
rqp
[
1
]
,
1
);
}
else
{
filter_mb_mbaff_edgecv
(
h
,
img_cb
,
uvlinesize
,
bS
,
1
,
bqp
[
0
]
);
filter_mb_mbaff_edgecv
(
h
,
img_cb
+
4
*
uvlinesize
,
uvlinesize
,
bS
+
4
,
1
,
bqp
[
1
]
);
filter_mb_mbaff_edgecv
(
h
,
img_cr
,
uvlinesize
,
bS
,
1
,
rqp
[
0
]
);
filter_mb_mbaff_edgecv
(
h
,
img_cr
+
4
*
uvlinesize
,
uvlinesize
,
bS
+
4
,
1
,
rqp
[
1
]
);
filter_mb_mbaff_edgecv
(
h
,
img_cb
,
uvlinesize
,
bS
,
1
,
bqp
[
0
]
,
1
);
filter_mb_mbaff_edgecv
(
h
,
img_cb
+
4
*
uvlinesize
,
uvlinesize
,
bS
+
4
,
1
,
bqp
[
1
]
,
1
);
filter_mb_mbaff_edgecv
(
h
,
img_cr
,
uvlinesize
,
bS
,
1
,
rqp
[
0
]
,
1
);
filter_mb_mbaff_edgecv
(
h
,
img_cr
+
4
*
uvlinesize
,
uvlinesize
,
bS
+
4
,
1
,
rqp
[
1
]
,
1
);
}
}
}
else
{
filter_mb_mbaff_edgev
(
h
,
img_y
,
2
*
linesize
,
bS
,
2
,
qp
[
0
]
);
filter_mb_mbaff_edgev
(
h
,
img_y
+
linesize
,
2
*
linesize
,
bS
+
1
,
2
,
qp
[
1
]
);
filter_mb_mbaff_edgev
(
h
,
img_y
,
2
*
linesize
,
bS
,
2
,
qp
[
0
]
,
1
);
filter_mb_mbaff_edgev
(
h
,
img_y
+
linesize
,
2
*
linesize
,
bS
+
1
,
2
,
qp
[
1
]
,
1
);
if
(
chroma
){
if
(
CHROMA444
)
{
filter_mb_mbaff_edgev
(
h
,
img_cb
,
2
*
uvlinesize
,
bS
,
2
,
bqp
[
0
]
);
filter_mb_mbaff_edgev
(
h
,
img_cb
+
uvlinesize
,
2
*
uvlinesize
,
bS
+
1
,
2
,
bqp
[
1
]
);
filter_mb_mbaff_edgev
(
h
,
img_cr
,
2
*
uvlinesize
,
bS
,
2
,
rqp
[
0
]
);
filter_mb_mbaff_edgev
(
h
,
img_cr
+
uvlinesize
,
2
*
uvlinesize
,
bS
+
1
,
2
,
rqp
[
1
]
);
filter_mb_mbaff_edgev
(
h
,
img_cb
,
2
*
uvlinesize
,
bS
,
2
,
bqp
[
0
]
,
1
);
filter_mb_mbaff_edgev
(
h
,
img_cb
+
uvlinesize
,
2
*
uvlinesize
,
bS
+
1
,
2
,
bqp
[
1
]
,
1
);
filter_mb_mbaff_edgev
(
h
,
img_cr
,
2
*
uvlinesize
,
bS
,
2
,
rqp
[
0
]
,
1
);
filter_mb_mbaff_edgev
(
h
,
img_cr
+
uvlinesize
,
2
*
uvlinesize
,
bS
+
1
,
2
,
rqp
[
1
]
,
1
);
}
else
{
filter_mb_mbaff_edgecv
(
h
,
img_cb
,
2
*
uvlinesize
,
bS
,
2
,
bqp
[
0
]
);
filter_mb_mbaff_edgecv
(
h
,
img_cb
+
uvlinesize
,
2
*
uvlinesize
,
bS
+
1
,
2
,
bqp
[
1
]
);
filter_mb_mbaff_edgecv
(
h
,
img_cr
,
2
*
uvlinesize
,
bS
,
2
,
rqp
[
0
]
);
filter_mb_mbaff_edgecv
(
h
,
img_cr
+
uvlinesize
,
2
*
uvlinesize
,
bS
+
1
,
2
,
rqp
[
1
]
);
filter_mb_mbaff_edgecv
(
h
,
img_cb
,
2
*
uvlinesize
,
bS
,
2
,
bqp
[
0
]
,
1
);
filter_mb_mbaff_edgecv
(
h
,
img_cb
+
uvlinesize
,
2
*
uvlinesize
,
bS
+
1
,
2
,
bqp
[
1
]
,
1
);
filter_mb_mbaff_edgecv
(
h
,
img_cr
,
2
*
uvlinesize
,
bS
,
2
,
rqp
[
0
]
,
1
);
filter_mb_mbaff_edgecv
(
h
,
img_cr
+
uvlinesize
,
2
*
uvlinesize
,
bS
+
1
,
2
,
rqp
[
1
]
,
1
);
}
}
}
...
...
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