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
80621249
Commit
80621249
authored
Jul 13, 2011
by
Diego Biurrun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
h264: move fill_decode_neighbors()/fill_decode_caches() to h264_mvpred.h
This fixes a bunch of unused function warnings.
parent
ac4a85f4
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
418 additions
and
418 deletions
+418
-418
h264.h
libavcodec/h264.h
+0
-418
h264_mvpred.h
libavcodec/h264_mvpred.h
+418
-0
No files found.
libavcodec/h264.h
View file @
80621249
...
...
@@ -770,424 +770,6 @@ static av_always_inline int get_chroma_qp(H264Context *h, int t, int qscale){
return
h
->
pps
.
chroma_qp_table
[
t
][
qscale
];
}
static
void
fill_decode_neighbors
(
H264Context
*
h
,
int
mb_type
){
MpegEncContext
*
const
s
=
&
h
->
s
;
const
int
mb_xy
=
h
->
mb_xy
;
int
topleft_xy
,
top_xy
,
topright_xy
,
left_xy
[
LEFT_MBS
];
static
const
uint8_t
left_block_options
[
4
][
32
]
=
{
{
0
,
1
,
2
,
3
,
7
,
10
,
8
,
11
,
3
+
0
*
4
,
3
+
1
*
4
,
3
+
2
*
4
,
3
+
3
*
4
,
1
+
4
*
4
,
1
+
8
*
4
,
1
+
5
*
4
,
1
+
9
*
4
},
{
2
,
2
,
3
,
3
,
8
,
11
,
8
,
11
,
3
+
2
*
4
,
3
+
2
*
4
,
3
+
3
*
4
,
3
+
3
*
4
,
1
+
5
*
4
,
1
+
9
*
4
,
1
+
5
*
4
,
1
+
9
*
4
},
{
0
,
0
,
1
,
1
,
7
,
10
,
7
,
10
,
3
+
0
*
4
,
3
+
0
*
4
,
3
+
1
*
4
,
3
+
1
*
4
,
1
+
4
*
4
,
1
+
8
*
4
,
1
+
4
*
4
,
1
+
8
*
4
},
{
0
,
2
,
0
,
2
,
7
,
10
,
7
,
10
,
3
+
0
*
4
,
3
+
2
*
4
,
3
+
0
*
4
,
3
+
2
*
4
,
1
+
4
*
4
,
1
+
8
*
4
,
1
+
4
*
4
,
1
+
8
*
4
}
};
h
->
topleft_partition
=
-
1
;
top_xy
=
mb_xy
-
(
s
->
mb_stride
<<
MB_FIELD
);
/* Wow, what a mess, why didn't they simplify the interlacing & intra
* stuff, I can't imagine that these complex rules are worth it. */
topleft_xy
=
top_xy
-
1
;
topright_xy
=
top_xy
+
1
;
left_xy
[
LBOT
]
=
left_xy
[
LTOP
]
=
mb_xy
-
1
;
h
->
left_block
=
left_block_options
[
0
];
if
(
FRAME_MBAFF
){
const
int
left_mb_field_flag
=
IS_INTERLACED
(
s
->
current_picture
.
f
.
mb_type
[
mb_xy
-
1
]);
const
int
curr_mb_field_flag
=
IS_INTERLACED
(
mb_type
);
if
(
s
->
mb_y
&
1
){
if
(
left_mb_field_flag
!=
curr_mb_field_flag
)
{
left_xy
[
LBOT
]
=
left_xy
[
LTOP
]
=
mb_xy
-
s
->
mb_stride
-
1
;
if
(
curr_mb_field_flag
)
{
left_xy
[
LBOT
]
+=
s
->
mb_stride
;
h
->
left_block
=
left_block_options
[
3
];
}
else
{
topleft_xy
+=
s
->
mb_stride
;
// take top left mv from the middle of the mb, as opposed to all other modes which use the bottom right partition
h
->
topleft_partition
=
0
;
h
->
left_block
=
left_block_options
[
1
];
}
}
}
else
{
if
(
curr_mb_field_flag
){
topleft_xy
+=
s
->
mb_stride
&
(((
s
->
current_picture
.
f
.
mb_type
[
top_xy
-
1
]
>>
7
)
&
1
)
-
1
);
topright_xy
+=
s
->
mb_stride
&
(((
s
->
current_picture
.
f
.
mb_type
[
top_xy
+
1
]
>>
7
)
&
1
)
-
1
);
top_xy
+=
s
->
mb_stride
&
(((
s
->
current_picture
.
f
.
mb_type
[
top_xy
]
>>
7
)
&
1
)
-
1
);
}
if
(
left_mb_field_flag
!=
curr_mb_field_flag
)
{
if
(
curr_mb_field_flag
)
{
left_xy
[
LBOT
]
+=
s
->
mb_stride
;
h
->
left_block
=
left_block_options
[
3
];
}
else
{
h
->
left_block
=
left_block_options
[
2
];
}
}
}
}
h
->
topleft_mb_xy
=
topleft_xy
;
h
->
top_mb_xy
=
top_xy
;
h
->
topright_mb_xy
=
topright_xy
;
h
->
left_mb_xy
[
LTOP
]
=
left_xy
[
LTOP
];
h
->
left_mb_xy
[
LBOT
]
=
left_xy
[
LBOT
];
//FIXME do we need all in the context?
h
->
topleft_type
=
s
->
current_picture
.
f
.
mb_type
[
topleft_xy
];
h
->
top_type
=
s
->
current_picture
.
f
.
mb_type
[
top_xy
];
h
->
topright_type
=
s
->
current_picture
.
f
.
mb_type
[
topright_xy
];
h
->
left_type
[
LTOP
]
=
s
->
current_picture
.
f
.
mb_type
[
left_xy
[
LTOP
]];
h
->
left_type
[
LBOT
]
=
s
->
current_picture
.
f
.
mb_type
[
left_xy
[
LBOT
]];
if
(
FMO
){
if
(
h
->
slice_table
[
topleft_xy
]
!=
h
->
slice_num
)
h
->
topleft_type
=
0
;
if
(
h
->
slice_table
[
top_xy
]
!=
h
->
slice_num
)
h
->
top_type
=
0
;
if
(
h
->
slice_table
[
left_xy
[
LTOP
]
]
!=
h
->
slice_num
)
h
->
left_type
[
LTOP
]
=
h
->
left_type
[
LBOT
]
=
0
;
}
else
{
if
(
h
->
slice_table
[
topleft_xy
]
!=
h
->
slice_num
){
h
->
topleft_type
=
0
;
if
(
h
->
slice_table
[
top_xy
]
!=
h
->
slice_num
)
h
->
top_type
=
0
;
if
(
h
->
slice_table
[
left_xy
[
LTOP
]
]
!=
h
->
slice_num
)
h
->
left_type
[
LTOP
]
=
h
->
left_type
[
LBOT
]
=
0
;
}
}
if
(
h
->
slice_table
[
topright_xy
]
!=
h
->
slice_num
)
h
->
topright_type
=
0
;
}
static
void
fill_decode_caches
(
H264Context
*
h
,
int
mb_type
){
MpegEncContext
*
const
s
=
&
h
->
s
;
int
topleft_xy
,
top_xy
,
topright_xy
,
left_xy
[
LEFT_MBS
];
int
topleft_type
,
top_type
,
topright_type
,
left_type
[
LEFT_MBS
];
const
uint8_t
*
left_block
=
h
->
left_block
;
int
i
;
uint8_t
*
nnz
;
uint8_t
*
nnz_cache
;
topleft_xy
=
h
->
topleft_mb_xy
;
top_xy
=
h
->
top_mb_xy
;
topright_xy
=
h
->
topright_mb_xy
;
left_xy
[
LTOP
]
=
h
->
left_mb_xy
[
LTOP
];
left_xy
[
LBOT
]
=
h
->
left_mb_xy
[
LBOT
];
topleft_type
=
h
->
topleft_type
;
top_type
=
h
->
top_type
;
topright_type
=
h
->
topright_type
;
left_type
[
LTOP
]
=
h
->
left_type
[
LTOP
];
left_type
[
LBOT
]
=
h
->
left_type
[
LBOT
];
if
(
!
IS_SKIP
(
mb_type
)){
if
(
IS_INTRA
(
mb_type
)){
int
type_mask
=
h
->
pps
.
constrained_intra_pred
?
IS_INTRA
(
-
1
)
:
-
1
;
h
->
topleft_samples_available
=
h
->
top_samples_available
=
h
->
left_samples_available
=
0xFFFF
;
h
->
topright_samples_available
=
0xEEEA
;
if
(
!
(
top_type
&
type_mask
)){
h
->
topleft_samples_available
=
0xB3FF
;
h
->
top_samples_available
=
0x33FF
;
h
->
topright_samples_available
=
0x26EA
;
}
if
(
IS_INTERLACED
(
mb_type
)
!=
IS_INTERLACED
(
left_type
[
LTOP
])){
if
(
IS_INTERLACED
(
mb_type
)){
if
(
!
(
left_type
[
LTOP
]
&
type_mask
)){
h
->
topleft_samples_available
&=
0xDFFF
;
h
->
left_samples_available
&=
0x5FFF
;
}
if
(
!
(
left_type
[
LBOT
]
&
type_mask
)){
h
->
topleft_samples_available
&=
0xFF5F
;
h
->
left_samples_available
&=
0xFF5F
;
}
}
else
{
int
left_typei
=
s
->
current_picture
.
f
.
mb_type
[
left_xy
[
LTOP
]
+
s
->
mb_stride
];
assert
(
left_xy
[
LTOP
]
==
left_xy
[
LBOT
]);
if
(
!
((
left_typei
&
type_mask
)
&&
(
left_type
[
LTOP
]
&
type_mask
))){
h
->
topleft_samples_available
&=
0xDF5F
;
h
->
left_samples_available
&=
0x5F5F
;
}
}
}
else
{
if
(
!
(
left_type
[
LTOP
]
&
type_mask
)){
h
->
topleft_samples_available
&=
0xDF5F
;
h
->
left_samples_available
&=
0x5F5F
;
}
}
if
(
!
(
topleft_type
&
type_mask
))
h
->
topleft_samples_available
&=
0x7FFF
;
if
(
!
(
topright_type
&
type_mask
))
h
->
topright_samples_available
&=
0xFBFF
;
if
(
IS_INTRA4x4
(
mb_type
)){
if
(
IS_INTRA4x4
(
top_type
)){
AV_COPY32
(
h
->
intra4x4_pred_mode_cache
+
4
+
8
*
0
,
h
->
intra4x4_pred_mode
+
h
->
mb2br_xy
[
top_xy
]);
}
else
{
h
->
intra4x4_pred_mode_cache
[
4
+
8
*
0
]
=
h
->
intra4x4_pred_mode_cache
[
5
+
8
*
0
]
=
h
->
intra4x4_pred_mode_cache
[
6
+
8
*
0
]
=
h
->
intra4x4_pred_mode_cache
[
7
+
8
*
0
]
=
2
-
3
*!
(
top_type
&
type_mask
);
}
for
(
i
=
0
;
i
<
2
;
i
++
){
if
(
IS_INTRA4x4
(
left_type
[
LEFT
(
i
)])){
int8_t
*
mode
=
h
->
intra4x4_pred_mode
+
h
->
mb2br_xy
[
left_xy
[
LEFT
(
i
)]];
h
->
intra4x4_pred_mode_cache
[
3
+
8
*
1
+
2
*
8
*
i
]
=
mode
[
6
-
left_block
[
0
+
2
*
i
]];
h
->
intra4x4_pred_mode_cache
[
3
+
8
*
2
+
2
*
8
*
i
]
=
mode
[
6
-
left_block
[
1
+
2
*
i
]];
}
else
{
h
->
intra4x4_pred_mode_cache
[
3
+
8
*
1
+
2
*
8
*
i
]
=
h
->
intra4x4_pred_mode_cache
[
3
+
8
*
2
+
2
*
8
*
i
]
=
2
-
3
*!
(
left_type
[
LEFT
(
i
)]
&
type_mask
);
}
}
}
}
/*
0 . T T. T T T T
1 L . .L . . . .
2 L . .L . . . .
3 . T TL . . . .
4 L . .L . . . .
5 L . .. . . . .
*/
//FIXME constraint_intra_pred & partitioning & nnz (let us hope this is just a typo in the spec)
nnz_cache
=
h
->
non_zero_count_cache
;
if
(
top_type
){
nnz
=
h
->
non_zero_count
[
top_xy
];
AV_COPY32
(
&
nnz_cache
[
4
+
8
*
0
],
&
nnz
[
4
*
3
]);
if
(
CHROMA444
){
AV_COPY32
(
&
nnz_cache
[
4
+
8
*
5
],
&
nnz
[
4
*
7
]);
AV_COPY32
(
&
nnz_cache
[
4
+
8
*
10
],
&
nnz
[
4
*
11
]);
}
else
{
AV_COPY32
(
&
nnz_cache
[
4
+
8
*
5
],
&
nnz
[
4
*
5
]);
AV_COPY32
(
&
nnz_cache
[
4
+
8
*
10
],
&
nnz
[
4
*
9
]);
}
}
else
{
uint32_t
top_empty
=
CABAC
&&
!
IS_INTRA
(
mb_type
)
?
0
:
0x40404040
;
AV_WN32A
(
&
nnz_cache
[
4
+
8
*
0
],
top_empty
);
AV_WN32A
(
&
nnz_cache
[
4
+
8
*
5
],
top_empty
);
AV_WN32A
(
&
nnz_cache
[
4
+
8
*
10
],
top_empty
);
}
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
left_type
[
LEFT
(
i
)]){
nnz
=
h
->
non_zero_count
[
left_xy
[
LEFT
(
i
)]];
nnz_cache
[
3
+
8
*
1
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
0
+
2
*
i
]];
nnz_cache
[
3
+
8
*
2
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
1
+
2
*
i
]];
if
(
CHROMA444
){
nnz_cache
[
3
+
8
*
6
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
0
+
2
*
i
]
+
4
*
4
];
nnz_cache
[
3
+
8
*
7
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
1
+
2
*
i
]
+
4
*
4
];
nnz_cache
[
3
+
8
*
11
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
0
+
2
*
i
]
+
8
*
4
];
nnz_cache
[
3
+
8
*
12
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
1
+
2
*
i
]
+
8
*
4
];
}
else
{
nnz_cache
[
3
+
8
*
6
+
8
*
i
]
=
nnz
[
left_block
[
8
+
4
+
2
*
i
]];
nnz_cache
[
3
+
8
*
11
+
8
*
i
]
=
nnz
[
left_block
[
8
+
5
+
2
*
i
]];
}
}
else
{
nnz_cache
[
3
+
8
*
1
+
2
*
8
*
i
]
=
nnz_cache
[
3
+
8
*
2
+
2
*
8
*
i
]
=
nnz_cache
[
3
+
8
*
6
+
2
*
8
*
i
]
=
nnz_cache
[
3
+
8
*
7
+
2
*
8
*
i
]
=
nnz_cache
[
3
+
8
*
11
+
2
*
8
*
i
]
=
nnz_cache
[
3
+
8
*
12
+
2
*
8
*
i
]
=
CABAC
&&
!
IS_INTRA
(
mb_type
)
?
0
:
64
;
}
}
if
(
CABAC
)
{
// top_cbp
if
(
top_type
)
{
h
->
top_cbp
=
h
->
cbp_table
[
top_xy
];
}
else
{
h
->
top_cbp
=
IS_INTRA
(
mb_type
)
?
0x7CF
:
0x00F
;
}
// left_cbp
if
(
left_type
[
LTOP
])
{
h
->
left_cbp
=
(
h
->
cbp_table
[
left_xy
[
LTOP
]]
&
0x7F0
)
|
((
h
->
cbp_table
[
left_xy
[
LTOP
]]
>>
(
left_block
[
0
]
&
(
~
1
)))
&
2
)
|
(((
h
->
cbp_table
[
left_xy
[
LBOT
]]
>>
(
left_block
[
2
]
&
(
~
1
)))
&
2
)
<<
2
);
}
else
{
h
->
left_cbp
=
IS_INTRA
(
mb_type
)
?
0x7CF
:
0x00F
;
}
}
}
if
(
IS_INTER
(
mb_type
)
||
(
IS_DIRECT
(
mb_type
)
&&
h
->
direct_spatial_mv_pred
)){
int
list
;
int
b_stride
=
h
->
b_stride
;
for
(
list
=
0
;
list
<
h
->
list_count
;
list
++
){
int8_t
*
ref_cache
=
&
h
->
ref_cache
[
list
][
scan8
[
0
]];
int8_t
*
ref
=
s
->
current_picture
.
f
.
ref_index
[
list
];
int16_t
(
*
mv_cache
)[
2
]
=
&
h
->
mv_cache
[
list
][
scan8
[
0
]];
int16_t
(
*
mv
)[
2
]
=
s
->
current_picture
.
f
.
motion_val
[
list
];
if
(
!
USES_LIST
(
mb_type
,
list
)){
continue
;
}
assert
(
!
(
IS_DIRECT
(
mb_type
)
&&
!
h
->
direct_spatial_mv_pred
));
if
(
USES_LIST
(
top_type
,
list
)){
const
int
b_xy
=
h
->
mb2b_xy
[
top_xy
]
+
3
*
b_stride
;
AV_COPY128
(
mv_cache
[
0
-
1
*
8
],
mv
[
b_xy
+
0
]);
ref_cache
[
0
-
1
*
8
]
=
ref_cache
[
1
-
1
*
8
]
=
ref
[
4
*
top_xy
+
2
];
ref_cache
[
2
-
1
*
8
]
=
ref_cache
[
3
-
1
*
8
]
=
ref
[
4
*
top_xy
+
3
];
}
else
{
AV_ZERO128
(
mv_cache
[
0
-
1
*
8
]);
AV_WN32A
(
&
ref_cache
[
0
-
1
*
8
],
((
top_type
?
LIST_NOT_USED
:
PART_NOT_AVAILABLE
)
&
0xFF
)
*
0x01010101
);
}
if
(
mb_type
&
(
MB_TYPE_16x8
|
MB_TYPE_8x8
)){
for
(
i
=
0
;
i
<
2
;
i
++
){
int
cache_idx
=
-
1
+
i
*
2
*
8
;
if
(
USES_LIST
(
left_type
[
LEFT
(
i
)],
list
)){
const
int
b_xy
=
h
->
mb2b_xy
[
left_xy
[
LEFT
(
i
)]]
+
3
;
const
int
b8_xy
=
4
*
left_xy
[
LEFT
(
i
)]
+
1
;
AV_COPY32
(
mv_cache
[
cache_idx
],
mv
[
b_xy
+
b_stride
*
left_block
[
0
+
i
*
2
]]);
AV_COPY32
(
mv_cache
[
cache_idx
+
8
],
mv
[
b_xy
+
b_stride
*
left_block
[
1
+
i
*
2
]]);
ref_cache
[
cache_idx
]
=
ref
[
b8_xy
+
(
left_block
[
0
+
i
*
2
]
&~
1
)];
ref_cache
[
cache_idx
+
8
]
=
ref
[
b8_xy
+
(
left_block
[
1
+
i
*
2
]
&~
1
)];
}
else
{
AV_ZERO32
(
mv_cache
[
cache_idx
]);
AV_ZERO32
(
mv_cache
[
cache_idx
+
8
]);
ref_cache
[
cache_idx
]
=
ref_cache
[
cache_idx
+
8
]
=
(
left_type
[
LEFT
(
i
)])
?
LIST_NOT_USED
:
PART_NOT_AVAILABLE
;
}
}
}
else
{
if
(
USES_LIST
(
left_type
[
LTOP
],
list
)){
const
int
b_xy
=
h
->
mb2b_xy
[
left_xy
[
LTOP
]]
+
3
;
const
int
b8_xy
=
4
*
left_xy
[
LTOP
]
+
1
;
AV_COPY32
(
mv_cache
[
-
1
],
mv
[
b_xy
+
b_stride
*
left_block
[
0
]]);
ref_cache
[
-
1
]
=
ref
[
b8_xy
+
(
left_block
[
0
]
&~
1
)];
}
else
{
AV_ZERO32
(
mv_cache
[
-
1
]);
ref_cache
[
-
1
]
=
left_type
[
LTOP
]
?
LIST_NOT_USED
:
PART_NOT_AVAILABLE
;
}
}
if
(
USES_LIST
(
topright_type
,
list
)){
const
int
b_xy
=
h
->
mb2b_xy
[
topright_xy
]
+
3
*
b_stride
;
AV_COPY32
(
mv_cache
[
4
-
1
*
8
],
mv
[
b_xy
]);
ref_cache
[
4
-
1
*
8
]
=
ref
[
4
*
topright_xy
+
2
];
}
else
{
AV_ZERO32
(
mv_cache
[
4
-
1
*
8
]);
ref_cache
[
4
-
1
*
8
]
=
topright_type
?
LIST_NOT_USED
:
PART_NOT_AVAILABLE
;
}
if
(
ref_cache
[
4
-
1
*
8
]
<
0
){
if
(
USES_LIST
(
topleft_type
,
list
)){
const
int
b_xy
=
h
->
mb2b_xy
[
topleft_xy
]
+
3
+
b_stride
+
(
h
->
topleft_partition
&
2
*
b_stride
);
const
int
b8_xy
=
4
*
topleft_xy
+
1
+
(
h
->
topleft_partition
&
2
);
AV_COPY32
(
mv_cache
[
-
1
-
1
*
8
],
mv
[
b_xy
]);
ref_cache
[
-
1
-
1
*
8
]
=
ref
[
b8_xy
];
}
else
{
AV_ZERO32
(
mv_cache
[
-
1
-
1
*
8
]);
ref_cache
[
-
1
-
1
*
8
]
=
topleft_type
?
LIST_NOT_USED
:
PART_NOT_AVAILABLE
;
}
}
if
((
mb_type
&
(
MB_TYPE_SKIP
|
MB_TYPE_DIRECT2
))
&&
!
FRAME_MBAFF
)
continue
;
if
(
!
(
mb_type
&
(
MB_TYPE_SKIP
|
MB_TYPE_DIRECT2
))){
uint8_t
(
*
mvd_cache
)[
2
]
=
&
h
->
mvd_cache
[
list
][
scan8
[
0
]];
uint8_t
(
*
mvd
)[
2
]
=
h
->
mvd_table
[
list
];
ref_cache
[
2
+
8
*
0
]
=
ref_cache
[
2
+
8
*
2
]
=
PART_NOT_AVAILABLE
;
AV_ZERO32
(
mv_cache
[
2
+
8
*
0
]);
AV_ZERO32
(
mv_cache
[
2
+
8
*
2
]);
if
(
CABAC
)
{
if
(
USES_LIST
(
top_type
,
list
)){
const
int
b_xy
=
h
->
mb2br_xy
[
top_xy
];
AV_COPY64
(
mvd_cache
[
0
-
1
*
8
],
mvd
[
b_xy
+
0
]);
}
else
{
AV_ZERO64
(
mvd_cache
[
0
-
1
*
8
]);
}
if
(
USES_LIST
(
left_type
[
LTOP
],
list
)){
const
int
b_xy
=
h
->
mb2br_xy
[
left_xy
[
LTOP
]]
+
6
;
AV_COPY16
(
mvd_cache
[
-
1
+
0
*
8
],
mvd
[
b_xy
-
left_block
[
0
]]);
AV_COPY16
(
mvd_cache
[
-
1
+
1
*
8
],
mvd
[
b_xy
-
left_block
[
1
]]);
}
else
{
AV_ZERO16
(
mvd_cache
[
-
1
+
0
*
8
]);
AV_ZERO16
(
mvd_cache
[
-
1
+
1
*
8
]);
}
if
(
USES_LIST
(
left_type
[
LBOT
],
list
)){
const
int
b_xy
=
h
->
mb2br_xy
[
left_xy
[
LBOT
]]
+
6
;
AV_COPY16
(
mvd_cache
[
-
1
+
2
*
8
],
mvd
[
b_xy
-
left_block
[
2
]]);
AV_COPY16
(
mvd_cache
[
-
1
+
3
*
8
],
mvd
[
b_xy
-
left_block
[
3
]]);
}
else
{
AV_ZERO16
(
mvd_cache
[
-
1
+
2
*
8
]);
AV_ZERO16
(
mvd_cache
[
-
1
+
3
*
8
]);
}
AV_ZERO16
(
mvd_cache
[
2
+
8
*
0
]);
AV_ZERO16
(
mvd_cache
[
2
+
8
*
2
]);
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
){
uint8_t
*
direct_cache
=
&
h
->
direct_cache
[
scan8
[
0
]];
uint8_t
*
direct_table
=
h
->
direct_table
;
fill_rectangle
(
direct_cache
,
4
,
4
,
8
,
MB_TYPE_16x16
>>
1
,
1
);
if
(
IS_DIRECT
(
top_type
)){
AV_WN32A
(
&
direct_cache
[
-
1
*
8
],
0x01010101u
*
(
MB_TYPE_DIRECT2
>>
1
));
}
else
if
(
IS_8X8
(
top_type
)){
int
b8_xy
=
4
*
top_xy
;
direct_cache
[
0
-
1
*
8
]
=
direct_table
[
b8_xy
+
2
];
direct_cache
[
2
-
1
*
8
]
=
direct_table
[
b8_xy
+
3
];
}
else
{
AV_WN32A
(
&
direct_cache
[
-
1
*
8
],
0x01010101
*
(
MB_TYPE_16x16
>>
1
));
}
if
(
IS_DIRECT
(
left_type
[
LTOP
]))
direct_cache
[
-
1
+
0
*
8
]
=
MB_TYPE_DIRECT2
>>
1
;
else
if
(
IS_8X8
(
left_type
[
LTOP
]))
direct_cache
[
-
1
+
0
*
8
]
=
direct_table
[
4
*
left_xy
[
LTOP
]
+
1
+
(
left_block
[
0
]
&~
1
)];
else
direct_cache
[
-
1
+
0
*
8
]
=
MB_TYPE_16x16
>>
1
;
if
(
IS_DIRECT
(
left_type
[
LBOT
]))
direct_cache
[
-
1
+
2
*
8
]
=
MB_TYPE_DIRECT2
>>
1
;
else
if
(
IS_8X8
(
left_type
[
LBOT
]))
direct_cache
[
-
1
+
2
*
8
]
=
direct_table
[
4
*
left_xy
[
LBOT
]
+
1
+
(
left_block
[
2
]
&~
1
)];
else
direct_cache
[
-
1
+
2
*
8
]
=
MB_TYPE_16x16
>>
1
;
}
}
}
if
(
FRAME_MBAFF
){
#define MAP_MVS\
MAP_F2F(scan8[0] - 1 - 1*8, topleft_type)\
MAP_F2F(scan8[0] + 0 - 1*8, top_type)\
MAP_F2F(scan8[0] + 1 - 1*8, top_type)\
MAP_F2F(scan8[0] + 2 - 1*8, top_type)\
MAP_F2F(scan8[0] + 3 - 1*8, top_type)\
MAP_F2F(scan8[0] + 4 - 1*8, topright_type)\
MAP_F2F(scan8[0] - 1 + 0*8, left_type[LTOP])\
MAP_F2F(scan8[0] - 1 + 1*8, left_type[LTOP])\
MAP_F2F(scan8[0] - 1 + 2*8, left_type[LBOT])\
MAP_F2F(scan8[0] - 1 + 3*8, left_type[LBOT])
if
(
MB_FIELD
){
#define MAP_F2F(idx, mb_type)\
if(!IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\
h->ref_cache[list][idx] <<= 1;\
h->mv_cache[list][idx][1] /= 2;\
h->mvd_cache[list][idx][1] >>=1;\
}
MAP_MVS
#undef MAP_F2F
}
else
{
#define MAP_F2F(idx, mb_type)\
if(IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\
h->ref_cache[list][idx] >>= 1;\
h->mv_cache[list][idx][1] <<= 1;\
h->mvd_cache[list][idx][1] <<= 1;\
}
MAP_MVS
#undef MAP_F2F
}
}
}
}
h
->
neighbor_transform_size
=
!!
IS_8x8DCT
(
top_type
)
+
!!
IS_8x8DCT
(
left_type
[
LTOP
]);
}
/**
* gets the predicted intra4x4 prediction mode.
*/
...
...
libavcodec/h264_mvpred.h
View file @
80621249
...
...
@@ -327,6 +327,424 @@ zeromv:
return
;
}
static
void
fill_decode_neighbors
(
H264Context
*
h
,
int
mb_type
){
MpegEncContext
*
const
s
=
&
h
->
s
;
const
int
mb_xy
=
h
->
mb_xy
;
int
topleft_xy
,
top_xy
,
topright_xy
,
left_xy
[
LEFT_MBS
];
static
const
uint8_t
left_block_options
[
4
][
32
]
=
{
{
0
,
1
,
2
,
3
,
7
,
10
,
8
,
11
,
3
+
0
*
4
,
3
+
1
*
4
,
3
+
2
*
4
,
3
+
3
*
4
,
1
+
4
*
4
,
1
+
8
*
4
,
1
+
5
*
4
,
1
+
9
*
4
},
{
2
,
2
,
3
,
3
,
8
,
11
,
8
,
11
,
3
+
2
*
4
,
3
+
2
*
4
,
3
+
3
*
4
,
3
+
3
*
4
,
1
+
5
*
4
,
1
+
9
*
4
,
1
+
5
*
4
,
1
+
9
*
4
},
{
0
,
0
,
1
,
1
,
7
,
10
,
7
,
10
,
3
+
0
*
4
,
3
+
0
*
4
,
3
+
1
*
4
,
3
+
1
*
4
,
1
+
4
*
4
,
1
+
8
*
4
,
1
+
4
*
4
,
1
+
8
*
4
},
{
0
,
2
,
0
,
2
,
7
,
10
,
7
,
10
,
3
+
0
*
4
,
3
+
2
*
4
,
3
+
0
*
4
,
3
+
2
*
4
,
1
+
4
*
4
,
1
+
8
*
4
,
1
+
4
*
4
,
1
+
8
*
4
}
};
h
->
topleft_partition
=
-
1
;
top_xy
=
mb_xy
-
(
s
->
mb_stride
<<
MB_FIELD
);
/* Wow, what a mess, why didn't they simplify the interlacing & intra
* stuff, I can't imagine that these complex rules are worth it. */
topleft_xy
=
top_xy
-
1
;
topright_xy
=
top_xy
+
1
;
left_xy
[
LBOT
]
=
left_xy
[
LTOP
]
=
mb_xy
-
1
;
h
->
left_block
=
left_block_options
[
0
];
if
(
FRAME_MBAFF
){
const
int
left_mb_field_flag
=
IS_INTERLACED
(
s
->
current_picture
.
f
.
mb_type
[
mb_xy
-
1
]);
const
int
curr_mb_field_flag
=
IS_INTERLACED
(
mb_type
);
if
(
s
->
mb_y
&
1
){
if
(
left_mb_field_flag
!=
curr_mb_field_flag
)
{
left_xy
[
LBOT
]
=
left_xy
[
LTOP
]
=
mb_xy
-
s
->
mb_stride
-
1
;
if
(
curr_mb_field_flag
)
{
left_xy
[
LBOT
]
+=
s
->
mb_stride
;
h
->
left_block
=
left_block_options
[
3
];
}
else
{
topleft_xy
+=
s
->
mb_stride
;
// take top left mv from the middle of the mb, as opposed to all other modes which use the bottom right partition
h
->
topleft_partition
=
0
;
h
->
left_block
=
left_block_options
[
1
];
}
}
}
else
{
if
(
curr_mb_field_flag
){
topleft_xy
+=
s
->
mb_stride
&
(((
s
->
current_picture
.
f
.
mb_type
[
top_xy
-
1
]
>>
7
)
&
1
)
-
1
);
topright_xy
+=
s
->
mb_stride
&
(((
s
->
current_picture
.
f
.
mb_type
[
top_xy
+
1
]
>>
7
)
&
1
)
-
1
);
top_xy
+=
s
->
mb_stride
&
(((
s
->
current_picture
.
f
.
mb_type
[
top_xy
]
>>
7
)
&
1
)
-
1
);
}
if
(
left_mb_field_flag
!=
curr_mb_field_flag
)
{
if
(
curr_mb_field_flag
)
{
left_xy
[
LBOT
]
+=
s
->
mb_stride
;
h
->
left_block
=
left_block_options
[
3
];
}
else
{
h
->
left_block
=
left_block_options
[
2
];
}
}
}
}
h
->
topleft_mb_xy
=
topleft_xy
;
h
->
top_mb_xy
=
top_xy
;
h
->
topright_mb_xy
=
topright_xy
;
h
->
left_mb_xy
[
LTOP
]
=
left_xy
[
LTOP
];
h
->
left_mb_xy
[
LBOT
]
=
left_xy
[
LBOT
];
//FIXME do we need all in the context?
h
->
topleft_type
=
s
->
current_picture
.
f
.
mb_type
[
topleft_xy
];
h
->
top_type
=
s
->
current_picture
.
f
.
mb_type
[
top_xy
];
h
->
topright_type
=
s
->
current_picture
.
f
.
mb_type
[
topright_xy
];
h
->
left_type
[
LTOP
]
=
s
->
current_picture
.
f
.
mb_type
[
left_xy
[
LTOP
]];
h
->
left_type
[
LBOT
]
=
s
->
current_picture
.
f
.
mb_type
[
left_xy
[
LBOT
]];
if
(
FMO
){
if
(
h
->
slice_table
[
topleft_xy
]
!=
h
->
slice_num
)
h
->
topleft_type
=
0
;
if
(
h
->
slice_table
[
top_xy
]
!=
h
->
slice_num
)
h
->
top_type
=
0
;
if
(
h
->
slice_table
[
left_xy
[
LTOP
]
]
!=
h
->
slice_num
)
h
->
left_type
[
LTOP
]
=
h
->
left_type
[
LBOT
]
=
0
;
}
else
{
if
(
h
->
slice_table
[
topleft_xy
]
!=
h
->
slice_num
){
h
->
topleft_type
=
0
;
if
(
h
->
slice_table
[
top_xy
]
!=
h
->
slice_num
)
h
->
top_type
=
0
;
if
(
h
->
slice_table
[
left_xy
[
LTOP
]
]
!=
h
->
slice_num
)
h
->
left_type
[
LTOP
]
=
h
->
left_type
[
LBOT
]
=
0
;
}
}
if
(
h
->
slice_table
[
topright_xy
]
!=
h
->
slice_num
)
h
->
topright_type
=
0
;
}
static
void
fill_decode_caches
(
H264Context
*
h
,
int
mb_type
){
MpegEncContext
*
const
s
=
&
h
->
s
;
int
topleft_xy
,
top_xy
,
topright_xy
,
left_xy
[
LEFT_MBS
];
int
topleft_type
,
top_type
,
topright_type
,
left_type
[
LEFT_MBS
];
const
uint8_t
*
left_block
=
h
->
left_block
;
int
i
;
uint8_t
*
nnz
;
uint8_t
*
nnz_cache
;
topleft_xy
=
h
->
topleft_mb_xy
;
top_xy
=
h
->
top_mb_xy
;
topright_xy
=
h
->
topright_mb_xy
;
left_xy
[
LTOP
]
=
h
->
left_mb_xy
[
LTOP
];
left_xy
[
LBOT
]
=
h
->
left_mb_xy
[
LBOT
];
topleft_type
=
h
->
topleft_type
;
top_type
=
h
->
top_type
;
topright_type
=
h
->
topright_type
;
left_type
[
LTOP
]
=
h
->
left_type
[
LTOP
];
left_type
[
LBOT
]
=
h
->
left_type
[
LBOT
];
if
(
!
IS_SKIP
(
mb_type
)){
if
(
IS_INTRA
(
mb_type
)){
int
type_mask
=
h
->
pps
.
constrained_intra_pred
?
IS_INTRA
(
-
1
)
:
-
1
;
h
->
topleft_samples_available
=
h
->
top_samples_available
=
h
->
left_samples_available
=
0xFFFF
;
h
->
topright_samples_available
=
0xEEEA
;
if
(
!
(
top_type
&
type_mask
)){
h
->
topleft_samples_available
=
0xB3FF
;
h
->
top_samples_available
=
0x33FF
;
h
->
topright_samples_available
=
0x26EA
;
}
if
(
IS_INTERLACED
(
mb_type
)
!=
IS_INTERLACED
(
left_type
[
LTOP
])){
if
(
IS_INTERLACED
(
mb_type
)){
if
(
!
(
left_type
[
LTOP
]
&
type_mask
)){
h
->
topleft_samples_available
&=
0xDFFF
;
h
->
left_samples_available
&=
0x5FFF
;
}
if
(
!
(
left_type
[
LBOT
]
&
type_mask
)){
h
->
topleft_samples_available
&=
0xFF5F
;
h
->
left_samples_available
&=
0xFF5F
;
}
}
else
{
int
left_typei
=
s
->
current_picture
.
f
.
mb_type
[
left_xy
[
LTOP
]
+
s
->
mb_stride
];
assert
(
left_xy
[
LTOP
]
==
left_xy
[
LBOT
]);
if
(
!
((
left_typei
&
type_mask
)
&&
(
left_type
[
LTOP
]
&
type_mask
))){
h
->
topleft_samples_available
&=
0xDF5F
;
h
->
left_samples_available
&=
0x5F5F
;
}
}
}
else
{
if
(
!
(
left_type
[
LTOP
]
&
type_mask
)){
h
->
topleft_samples_available
&=
0xDF5F
;
h
->
left_samples_available
&=
0x5F5F
;
}
}
if
(
!
(
topleft_type
&
type_mask
))
h
->
topleft_samples_available
&=
0x7FFF
;
if
(
!
(
topright_type
&
type_mask
))
h
->
topright_samples_available
&=
0xFBFF
;
if
(
IS_INTRA4x4
(
mb_type
)){
if
(
IS_INTRA4x4
(
top_type
)){
AV_COPY32
(
h
->
intra4x4_pred_mode_cache
+
4
+
8
*
0
,
h
->
intra4x4_pred_mode
+
h
->
mb2br_xy
[
top_xy
]);
}
else
{
h
->
intra4x4_pred_mode_cache
[
4
+
8
*
0
]
=
h
->
intra4x4_pred_mode_cache
[
5
+
8
*
0
]
=
h
->
intra4x4_pred_mode_cache
[
6
+
8
*
0
]
=
h
->
intra4x4_pred_mode_cache
[
7
+
8
*
0
]
=
2
-
3
*!
(
top_type
&
type_mask
);
}
for
(
i
=
0
;
i
<
2
;
i
++
){
if
(
IS_INTRA4x4
(
left_type
[
LEFT
(
i
)])){
int8_t
*
mode
=
h
->
intra4x4_pred_mode
+
h
->
mb2br_xy
[
left_xy
[
LEFT
(
i
)]];
h
->
intra4x4_pred_mode_cache
[
3
+
8
*
1
+
2
*
8
*
i
]
=
mode
[
6
-
left_block
[
0
+
2
*
i
]];
h
->
intra4x4_pred_mode_cache
[
3
+
8
*
2
+
2
*
8
*
i
]
=
mode
[
6
-
left_block
[
1
+
2
*
i
]];
}
else
{
h
->
intra4x4_pred_mode_cache
[
3
+
8
*
1
+
2
*
8
*
i
]
=
h
->
intra4x4_pred_mode_cache
[
3
+
8
*
2
+
2
*
8
*
i
]
=
2
-
3
*!
(
left_type
[
LEFT
(
i
)]
&
type_mask
);
}
}
}
}
/*
0 . T T. T T T T
1 L . .L . . . .
2 L . .L . . . .
3 . T TL . . . .
4 L . .L . . . .
5 L . .. . . . .
*/
//FIXME constraint_intra_pred & partitioning & nnz (let us hope this is just a typo in the spec)
nnz_cache
=
h
->
non_zero_count_cache
;
if
(
top_type
){
nnz
=
h
->
non_zero_count
[
top_xy
];
AV_COPY32
(
&
nnz_cache
[
4
+
8
*
0
],
&
nnz
[
4
*
3
]);
if
(
CHROMA444
){
AV_COPY32
(
&
nnz_cache
[
4
+
8
*
5
],
&
nnz
[
4
*
7
]);
AV_COPY32
(
&
nnz_cache
[
4
+
8
*
10
],
&
nnz
[
4
*
11
]);
}
else
{
AV_COPY32
(
&
nnz_cache
[
4
+
8
*
5
],
&
nnz
[
4
*
5
]);
AV_COPY32
(
&
nnz_cache
[
4
+
8
*
10
],
&
nnz
[
4
*
9
]);
}
}
else
{
uint32_t
top_empty
=
CABAC
&&
!
IS_INTRA
(
mb_type
)
?
0
:
0x40404040
;
AV_WN32A
(
&
nnz_cache
[
4
+
8
*
0
],
top_empty
);
AV_WN32A
(
&
nnz_cache
[
4
+
8
*
5
],
top_empty
);
AV_WN32A
(
&
nnz_cache
[
4
+
8
*
10
],
top_empty
);
}
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
left_type
[
LEFT
(
i
)]){
nnz
=
h
->
non_zero_count
[
left_xy
[
LEFT
(
i
)]];
nnz_cache
[
3
+
8
*
1
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
0
+
2
*
i
]];
nnz_cache
[
3
+
8
*
2
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
1
+
2
*
i
]];
if
(
CHROMA444
){
nnz_cache
[
3
+
8
*
6
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
0
+
2
*
i
]
+
4
*
4
];
nnz_cache
[
3
+
8
*
7
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
1
+
2
*
i
]
+
4
*
4
];
nnz_cache
[
3
+
8
*
11
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
0
+
2
*
i
]
+
8
*
4
];
nnz_cache
[
3
+
8
*
12
+
2
*
8
*
i
]
=
nnz
[
left_block
[
8
+
1
+
2
*
i
]
+
8
*
4
];
}
else
{
nnz_cache
[
3
+
8
*
6
+
8
*
i
]
=
nnz
[
left_block
[
8
+
4
+
2
*
i
]];
nnz_cache
[
3
+
8
*
11
+
8
*
i
]
=
nnz
[
left_block
[
8
+
5
+
2
*
i
]];
}
}
else
{
nnz_cache
[
3
+
8
*
1
+
2
*
8
*
i
]
=
nnz_cache
[
3
+
8
*
2
+
2
*
8
*
i
]
=
nnz_cache
[
3
+
8
*
6
+
2
*
8
*
i
]
=
nnz_cache
[
3
+
8
*
7
+
2
*
8
*
i
]
=
nnz_cache
[
3
+
8
*
11
+
2
*
8
*
i
]
=
nnz_cache
[
3
+
8
*
12
+
2
*
8
*
i
]
=
CABAC
&&
!
IS_INTRA
(
mb_type
)
?
0
:
64
;
}
}
if
(
CABAC
)
{
// top_cbp
if
(
top_type
)
{
h
->
top_cbp
=
h
->
cbp_table
[
top_xy
];
}
else
{
h
->
top_cbp
=
IS_INTRA
(
mb_type
)
?
0x7CF
:
0x00F
;
}
// left_cbp
if
(
left_type
[
LTOP
])
{
h
->
left_cbp
=
(
h
->
cbp_table
[
left_xy
[
LTOP
]]
&
0x7F0
)
|
((
h
->
cbp_table
[
left_xy
[
LTOP
]]
>>
(
left_block
[
0
]
&
(
~
1
)))
&
2
)
|
(((
h
->
cbp_table
[
left_xy
[
LBOT
]]
>>
(
left_block
[
2
]
&
(
~
1
)))
&
2
)
<<
2
);
}
else
{
h
->
left_cbp
=
IS_INTRA
(
mb_type
)
?
0x7CF
:
0x00F
;
}
}
}
if
(
IS_INTER
(
mb_type
)
||
(
IS_DIRECT
(
mb_type
)
&&
h
->
direct_spatial_mv_pred
)){
int
list
;
int
b_stride
=
h
->
b_stride
;
for
(
list
=
0
;
list
<
h
->
list_count
;
list
++
){
int8_t
*
ref_cache
=
&
h
->
ref_cache
[
list
][
scan8
[
0
]];
int8_t
*
ref
=
s
->
current_picture
.
f
.
ref_index
[
list
];
int16_t
(
*
mv_cache
)[
2
]
=
&
h
->
mv_cache
[
list
][
scan8
[
0
]];
int16_t
(
*
mv
)[
2
]
=
s
->
current_picture
.
f
.
motion_val
[
list
];
if
(
!
USES_LIST
(
mb_type
,
list
)){
continue
;
}
assert
(
!
(
IS_DIRECT
(
mb_type
)
&&
!
h
->
direct_spatial_mv_pred
));
if
(
USES_LIST
(
top_type
,
list
)){
const
int
b_xy
=
h
->
mb2b_xy
[
top_xy
]
+
3
*
b_stride
;
AV_COPY128
(
mv_cache
[
0
-
1
*
8
],
mv
[
b_xy
+
0
]);
ref_cache
[
0
-
1
*
8
]
=
ref_cache
[
1
-
1
*
8
]
=
ref
[
4
*
top_xy
+
2
];
ref_cache
[
2
-
1
*
8
]
=
ref_cache
[
3
-
1
*
8
]
=
ref
[
4
*
top_xy
+
3
];
}
else
{
AV_ZERO128
(
mv_cache
[
0
-
1
*
8
]);
AV_WN32A
(
&
ref_cache
[
0
-
1
*
8
],
((
top_type
?
LIST_NOT_USED
:
PART_NOT_AVAILABLE
)
&
0xFF
)
*
0x01010101
);
}
if
(
mb_type
&
(
MB_TYPE_16x8
|
MB_TYPE_8x8
)){
for
(
i
=
0
;
i
<
2
;
i
++
){
int
cache_idx
=
-
1
+
i
*
2
*
8
;
if
(
USES_LIST
(
left_type
[
LEFT
(
i
)],
list
)){
const
int
b_xy
=
h
->
mb2b_xy
[
left_xy
[
LEFT
(
i
)]]
+
3
;
const
int
b8_xy
=
4
*
left_xy
[
LEFT
(
i
)]
+
1
;
AV_COPY32
(
mv_cache
[
cache_idx
],
mv
[
b_xy
+
b_stride
*
left_block
[
0
+
i
*
2
]]);
AV_COPY32
(
mv_cache
[
cache_idx
+
8
],
mv
[
b_xy
+
b_stride
*
left_block
[
1
+
i
*
2
]]);
ref_cache
[
cache_idx
]
=
ref
[
b8_xy
+
(
left_block
[
0
+
i
*
2
]
&~
1
)];
ref_cache
[
cache_idx
+
8
]
=
ref
[
b8_xy
+
(
left_block
[
1
+
i
*
2
]
&~
1
)];
}
else
{
AV_ZERO32
(
mv_cache
[
cache_idx
]);
AV_ZERO32
(
mv_cache
[
cache_idx
+
8
]);
ref_cache
[
cache_idx
]
=
ref_cache
[
cache_idx
+
8
]
=
(
left_type
[
LEFT
(
i
)])
?
LIST_NOT_USED
:
PART_NOT_AVAILABLE
;
}
}
}
else
{
if
(
USES_LIST
(
left_type
[
LTOP
],
list
)){
const
int
b_xy
=
h
->
mb2b_xy
[
left_xy
[
LTOP
]]
+
3
;
const
int
b8_xy
=
4
*
left_xy
[
LTOP
]
+
1
;
AV_COPY32
(
mv_cache
[
-
1
],
mv
[
b_xy
+
b_stride
*
left_block
[
0
]]);
ref_cache
[
-
1
]
=
ref
[
b8_xy
+
(
left_block
[
0
]
&~
1
)];
}
else
{
AV_ZERO32
(
mv_cache
[
-
1
]);
ref_cache
[
-
1
]
=
left_type
[
LTOP
]
?
LIST_NOT_USED
:
PART_NOT_AVAILABLE
;
}
}
if
(
USES_LIST
(
topright_type
,
list
)){
const
int
b_xy
=
h
->
mb2b_xy
[
topright_xy
]
+
3
*
b_stride
;
AV_COPY32
(
mv_cache
[
4
-
1
*
8
],
mv
[
b_xy
]);
ref_cache
[
4
-
1
*
8
]
=
ref
[
4
*
topright_xy
+
2
];
}
else
{
AV_ZERO32
(
mv_cache
[
4
-
1
*
8
]);
ref_cache
[
4
-
1
*
8
]
=
topright_type
?
LIST_NOT_USED
:
PART_NOT_AVAILABLE
;
}
if
(
ref_cache
[
4
-
1
*
8
]
<
0
){
if
(
USES_LIST
(
topleft_type
,
list
)){
const
int
b_xy
=
h
->
mb2b_xy
[
topleft_xy
]
+
3
+
b_stride
+
(
h
->
topleft_partition
&
2
*
b_stride
);
const
int
b8_xy
=
4
*
topleft_xy
+
1
+
(
h
->
topleft_partition
&
2
);
AV_COPY32
(
mv_cache
[
-
1
-
1
*
8
],
mv
[
b_xy
]);
ref_cache
[
-
1
-
1
*
8
]
=
ref
[
b8_xy
];
}
else
{
AV_ZERO32
(
mv_cache
[
-
1
-
1
*
8
]);
ref_cache
[
-
1
-
1
*
8
]
=
topleft_type
?
LIST_NOT_USED
:
PART_NOT_AVAILABLE
;
}
}
if
((
mb_type
&
(
MB_TYPE_SKIP
|
MB_TYPE_DIRECT2
))
&&
!
FRAME_MBAFF
)
continue
;
if
(
!
(
mb_type
&
(
MB_TYPE_SKIP
|
MB_TYPE_DIRECT2
))){
uint8_t
(
*
mvd_cache
)[
2
]
=
&
h
->
mvd_cache
[
list
][
scan8
[
0
]];
uint8_t
(
*
mvd
)[
2
]
=
h
->
mvd_table
[
list
];
ref_cache
[
2
+
8
*
0
]
=
ref_cache
[
2
+
8
*
2
]
=
PART_NOT_AVAILABLE
;
AV_ZERO32
(
mv_cache
[
2
+
8
*
0
]);
AV_ZERO32
(
mv_cache
[
2
+
8
*
2
]);
if
(
CABAC
)
{
if
(
USES_LIST
(
top_type
,
list
)){
const
int
b_xy
=
h
->
mb2br_xy
[
top_xy
];
AV_COPY64
(
mvd_cache
[
0
-
1
*
8
],
mvd
[
b_xy
+
0
]);
}
else
{
AV_ZERO64
(
mvd_cache
[
0
-
1
*
8
]);
}
if
(
USES_LIST
(
left_type
[
LTOP
],
list
)){
const
int
b_xy
=
h
->
mb2br_xy
[
left_xy
[
LTOP
]]
+
6
;
AV_COPY16
(
mvd_cache
[
-
1
+
0
*
8
],
mvd
[
b_xy
-
left_block
[
0
]]);
AV_COPY16
(
mvd_cache
[
-
1
+
1
*
8
],
mvd
[
b_xy
-
left_block
[
1
]]);
}
else
{
AV_ZERO16
(
mvd_cache
[
-
1
+
0
*
8
]);
AV_ZERO16
(
mvd_cache
[
-
1
+
1
*
8
]);
}
if
(
USES_LIST
(
left_type
[
LBOT
],
list
)){
const
int
b_xy
=
h
->
mb2br_xy
[
left_xy
[
LBOT
]]
+
6
;
AV_COPY16
(
mvd_cache
[
-
1
+
2
*
8
],
mvd
[
b_xy
-
left_block
[
2
]]);
AV_COPY16
(
mvd_cache
[
-
1
+
3
*
8
],
mvd
[
b_xy
-
left_block
[
3
]]);
}
else
{
AV_ZERO16
(
mvd_cache
[
-
1
+
2
*
8
]);
AV_ZERO16
(
mvd_cache
[
-
1
+
3
*
8
]);
}
AV_ZERO16
(
mvd_cache
[
2
+
8
*
0
]);
AV_ZERO16
(
mvd_cache
[
2
+
8
*
2
]);
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
){
uint8_t
*
direct_cache
=
&
h
->
direct_cache
[
scan8
[
0
]];
uint8_t
*
direct_table
=
h
->
direct_table
;
fill_rectangle
(
direct_cache
,
4
,
4
,
8
,
MB_TYPE_16x16
>>
1
,
1
);
if
(
IS_DIRECT
(
top_type
)){
AV_WN32A
(
&
direct_cache
[
-
1
*
8
],
0x01010101u
*
(
MB_TYPE_DIRECT2
>>
1
));
}
else
if
(
IS_8X8
(
top_type
)){
int
b8_xy
=
4
*
top_xy
;
direct_cache
[
0
-
1
*
8
]
=
direct_table
[
b8_xy
+
2
];
direct_cache
[
2
-
1
*
8
]
=
direct_table
[
b8_xy
+
3
];
}
else
{
AV_WN32A
(
&
direct_cache
[
-
1
*
8
],
0x01010101
*
(
MB_TYPE_16x16
>>
1
));
}
if
(
IS_DIRECT
(
left_type
[
LTOP
]))
direct_cache
[
-
1
+
0
*
8
]
=
MB_TYPE_DIRECT2
>>
1
;
else
if
(
IS_8X8
(
left_type
[
LTOP
]))
direct_cache
[
-
1
+
0
*
8
]
=
direct_table
[
4
*
left_xy
[
LTOP
]
+
1
+
(
left_block
[
0
]
&~
1
)];
else
direct_cache
[
-
1
+
0
*
8
]
=
MB_TYPE_16x16
>>
1
;
if
(
IS_DIRECT
(
left_type
[
LBOT
]))
direct_cache
[
-
1
+
2
*
8
]
=
MB_TYPE_DIRECT2
>>
1
;
else
if
(
IS_8X8
(
left_type
[
LBOT
]))
direct_cache
[
-
1
+
2
*
8
]
=
direct_table
[
4
*
left_xy
[
LBOT
]
+
1
+
(
left_block
[
2
]
&~
1
)];
else
direct_cache
[
-
1
+
2
*
8
]
=
MB_TYPE_16x16
>>
1
;
}
}
}
if
(
FRAME_MBAFF
){
#define MAP_MVS\
MAP_F2F(scan8[0] - 1 - 1*8, topleft_type)\
MAP_F2F(scan8[0] + 0 - 1*8, top_type)\
MAP_F2F(scan8[0] + 1 - 1*8, top_type)\
MAP_F2F(scan8[0] + 2 - 1*8, top_type)\
MAP_F2F(scan8[0] + 3 - 1*8, top_type)\
MAP_F2F(scan8[0] + 4 - 1*8, topright_type)\
MAP_F2F(scan8[0] - 1 + 0*8, left_type[LTOP])\
MAP_F2F(scan8[0] - 1 + 1*8, left_type[LTOP])\
MAP_F2F(scan8[0] - 1 + 2*8, left_type[LBOT])\
MAP_F2F(scan8[0] - 1 + 3*8, left_type[LBOT])
if
(
MB_FIELD
){
#define MAP_F2F(idx, mb_type)\
if(!IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\
h->ref_cache[list][idx] <<= 1;\
h->mv_cache[list][idx][1] /= 2;\
h->mvd_cache[list][idx][1] >>=1;\
}
MAP_MVS
#undef MAP_F2F
}
else
{
#define MAP_F2F(idx, mb_type)\
if(IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\
h->ref_cache[list][idx] >>= 1;\
h->mv_cache[list][idx][1] <<= 1;\
h->mvd_cache[list][idx][1] <<= 1;\
}
MAP_MVS
#undef MAP_F2F
}
}
}
}
h
->
neighbor_transform_size
=
!!
IS_8x8DCT
(
top_type
)
+
!!
IS_8x8DCT
(
left_type
[
LTOP
]);
}
/**
* decodes a P_SKIP or B_SKIP macroblock
*/
...
...
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