Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Yushin Cho
aom-rav1e
Commits
69c6671e
Commit
69c6671e
authored
Apr 10, 2014
by
Dmitry Kovalev
Browse files
Cleaning up vp9_dthread.{c, h}.
Change-Id: If33087462293605f79d9281af133091fff33a876
parent
3dff8aa3
Changes
3
Hide whitespace changes
Inline
Side-by-side
vp9/decoder/vp9_decoder.c
View file @
69c6671e
...
...
@@ -361,7 +361,7 @@ int vp9_receive_compressed_data(VP9Decoder *pbi,
// If multiple threads are used to decode tiles, then we use those threads
// to do parallel loopfiltering.
if
(
pbi
->
num_tile_workers
)
{
vp9_loop_filter_frame_mt
(
pbi
,
cm
,
&
pbi
->
mb
,
cm
->
lf
.
filter_level
,
0
,
0
);
vp9_loop_filter_frame_mt
(
pbi
,
cm
,
cm
->
lf
.
filter_level
,
0
,
0
);
}
else
{
vp9_loop_filter_frame
(
cm
,
&
pbi
->
mb
,
cm
->
lf
.
filter_level
,
0
,
0
);
}
...
...
vp9/decoder/vp9_dthread.c
View file @
69c6671e
...
...
@@ -40,13 +40,13 @@ static INLINE void sync_read(VP9LfSync *const lf_sync, int r, int c) {
const
int
nsync
=
lf_sync
->
sync_range
;
if
(
r
&&
!
(
c
&
(
nsync
-
1
)))
{
mutex_lock
(
&
lf_sync
->
mutex_
[
r
-
1
]);
pthread_mutex_t
*
const
mutex
=
&
lf_sync
->
mutex_
[
r
-
1
];
mutex_lock
(
mutex
);
while
(
c
>
lf_sync
->
cur_sb_col
[
r
-
1
]
-
nsync
)
{
pthread_cond_wait
(
&
lf_sync
->
cond_
[
r
-
1
],
&
lf_sync
->
mutex_
[
r
-
1
]);
pthread_cond_wait
(
&
lf_sync
->
cond_
[
r
-
1
],
mutex
);
}
pthread_mutex_unlock
(
&
lf_sync
->
mutex_
[
r
-
1
]
);
pthread_mutex_unlock
(
mutex
);
}
#else
(
void
)
lf_sync
;
...
...
@@ -94,21 +94,21 @@ static void loop_filter_rows_mt(const YV12_BUFFER_CONFIG *const frame_buffer,
VP9LfSync
*
const
lf_sync
,
int
num_lf_workers
)
{
const
int
num_planes
=
y_only
?
1
:
MAX_MB_PLANE
;
int
r
,
c
;
// SB row and col
LOOP_FILTER_MASK
lfm
;
const
int
sb_cols
=
mi_cols_aligned_to_sb
(
cm
->
mi_cols
)
>>
MI_BLOCK_SIZE_LOG2
;
for
(
r
=
start
;
r
<
stop
;
r
+=
num_lf_workers
)
{
const
int
mi_row
=
r
<<
MI_BLOCK_SIZE_LOG2
;
MODE_INFO
**
mi_8x8
=
cm
->
mi_grid_visible
+
mi_row
*
cm
->
mi_stride
;
MODE_INFO
**
const
mi
=
cm
->
mi_grid_visible
+
mi_row
*
cm
->
mi_stride
;
for
(
c
=
0
;
c
<
sb_cols
;
++
c
)
{
const
int
mi_col
=
c
<<
MI_BLOCK_SIZE_LOG2
;
LOOP_FILTER_MASK
lfm
;
int
plane
;
sync_read
(
lf_sync
,
r
,
c
);
vp9_setup_dst_planes
(
xd
,
frame_buffer
,
mi_row
,
mi_col
);
vp9_setup_mask
(
cm
,
mi_row
,
mi_col
,
mi
_8x8
+
mi_col
,
cm
->
mi_stride
,
&
lfm
);
vp9_setup_mask
(
cm
,
mi_row
,
mi_col
,
mi
+
mi_col
,
cm
->
mi_stride
,
&
lfm
);
for
(
plane
=
0
;
plane
<
num_planes
;
++
plane
)
{
vp9_filter_block_plane
(
cm
,
&
xd
->
plane
[
plane
],
mi_row
,
&
lfm
);
...
...
@@ -134,9 +134,9 @@ static int loop_filter_row_worker(void *arg1, void *arg2) {
// threads.
void
vp9_loop_filter_frame_mt
(
VP9Decoder
*
pbi
,
VP9_COMMON
*
cm
,
MACROBLOCKD
*
xd
,
int
frame_filter_level
,
int
y_only
,
int
partial_frame
)
{
VP9LfSync
*
const
lf_sync
=
&
pbi
->
lf_row_sync
;
// Number of superblock rows and cols
const
int
sb_rows
=
mi_cols_aligned_to_sb
(
cm
->
mi_rows
)
>>
MI_BLOCK_SIZE_LOG2
;
const
int
tile_cols
=
1
<<
cm
->
log2_tile_cols
;
...
...
@@ -146,8 +146,6 @@ void vp9_loop_filter_frame_mt(VP9Decoder *pbi,
// Allocate memory used in thread synchronization.
// This always needs to be done even if frame_filter_level is 0.
if
(
!
cm
->
current_video_frame
||
cm
->
last_height
!=
cm
->
height
)
{
VP9LfSync
*
const
lf_sync
=
&
pbi
->
lf_row_sync
;
if
(
cm
->
last_height
!=
cm
->
height
)
{
const
int
aligned_last_height
=
ALIGN_POWER_OF_TWO
(
cm
->
last_height
,
MI_SIZE_LOG2
);
...
...
@@ -166,8 +164,7 @@ void vp9_loop_filter_frame_mt(VP9Decoder *pbi,
vp9_loop_filter_frame_init
(
cm
,
frame_filter_level
);
// Initialize cur_sb_col to -1 for all SB rows.
vpx_memset
(
pbi
->
lf_row_sync
.
cur_sb_col
,
-
1
,
sizeof
(
*
pbi
->
lf_row_sync
.
cur_sb_col
)
*
sb_rows
);
vpx_memset
(
lf_sync
->
cur_sb_col
,
-
1
,
sizeof
(
*
lf_sync
->
cur_sb_col
)
*
sb_rows
);
// Set up loopfilter thread data.
// The decoder is using num_workers instead of pbi->num_tile_workers
...
...
@@ -194,7 +191,7 @@ void vp9_loop_filter_frame_mt(VP9Decoder *pbi,
lf_data
->
stop
=
sb_rows
;
lf_data
->
y_only
=
y_only
;
// always do all planes in decoder
lf_data
->
lf_sync
=
&
pbi
->
lf_row
_sync
;
lf_data
->
lf_sync
=
lf
_sync
;
lf_data
->
num_lf_workers
=
num_workers
;
// Start loopfiltering
...
...
@@ -253,8 +250,12 @@ void vp9_loop_filter_alloc(VP9_COMMON *cm, VP9LfSync *lf_sync, int rows,
// Deallocate lf synchronization related mutex and data
void
vp9_loop_filter_dealloc
(
VP9LfSync
*
lf_sync
,
int
rows
)
{
#if CONFIG_MULTITHREAD
#if !CONFIG_MULTITHREAD
(
void
)
rows
;
#endif // !CONFIG_MULTITHREAD
if
(
lf_sync
!=
NULL
)
{
#if CONFIG_MULTITHREAD
int
i
;
if
(
lf_sync
->
mutex_
!=
NULL
)
{
...
...
@@ -269,17 +270,10 @@ void vp9_loop_filter_dealloc(VP9LfSync *lf_sync, int rows) {
}
vpx_free
(
lf_sync
->
cond_
);
}
#endif // CONFIG_MULTITHREAD
vpx_free
(
lf_sync
->
cur_sb_col
);
// clear the structure as the source of this call may be a resize in which
// case this call will be followed by an _alloc() which may fail.
vp
x_memset
(
lf_sync
,
0
,
sizeof
(
*
lf_sync
)
)
;
vp
9_zero
(
*
lf_sync
);
}
#else
(
void
)
rows
;
if
(
lf_sync
!=
NULL
)
{
vpx_free
(
lf_sync
->
cur_sb_col
);
vpx_memset
(
lf_sync
,
0
,
sizeof
(
*
lf_sync
));
}
#endif // CONFIG_MULTITHREAD
}
vp9/decoder/vp9_dthread.h
View file @
69c6671e
...
...
@@ -12,11 +12,9 @@
#define VP9_DECODER_VP9_DTHREAD_H_
#include "./vpx_config.h"
#include "vp9/common/vp9_loopfilter.h"
#include "vp9/decoder/vp9_reader.h"
#include "vp9/decoder/vp9_thread.h"
struct
macroblockd
;
struct
VP9Common
;
struct
VP9Decoder
;
...
...
@@ -43,16 +41,15 @@ typedef struct VP9LfSyncData {
}
VP9LfSync
;
// Allocate memory for loopfilter row synchronization.
void
vp9_loop_filter_alloc
(
struct
VP9Common
*
cm
,
struct
VP9LfSync
Data
*
lf_sync
,
void
vp9_loop_filter_alloc
(
struct
VP9Common
*
cm
,
VP9LfSync
*
lf_sync
,
int
rows
,
int
width
);
// Deallocate loopfilter synchronization related mutex and data.
void
vp9_loop_filter_dealloc
(
struct
VP9LfSync
Data
*
lf_sync
,
int
rows
);
void
vp9_loop_filter_dealloc
(
VP9LfSync
*
lf_sync
,
int
rows
);
// Multi-threaded loopfilter that uses the tile threads.
void
vp9_loop_filter_frame_mt
(
struct
VP9Decoder
*
pbi
,
struct
VP9Common
*
cm
,
struct
macroblockd
*
xd
,
int
frame_filter_level
,
int
y_only
,
int
partial_frame
);
...
...
Write
Preview
Supports
Markdown
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