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
c2597c5a
Commit
c2597c5a
authored
Mar 07, 2013
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
h264_refs: cosmetics, reformat
parent
f08fefc4
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
213 additions
and
187 deletions
+213
-187
h264_refs.c
libavcodec/h264_refs.c
+213
-187
No files found.
libavcodec/h264_refs.c
View file @
c2597c5a
...
...
@@ -46,19 +46,19 @@ static void pic_as_field(Picture *pic, const int parity){
for
(
i
=
0
;
i
<
4
;
++
i
)
{
if
(
parity
==
PICT_BOTTOM_FIELD
)
pic
->
f
.
data
[
i
]
+=
pic
->
f
.
linesize
[
i
];
pic
->
reference
=
parity
;
pic
->
reference
=
parity
;
pic
->
f
.
linesize
[
i
]
*=
2
;
}
pic
->
poc
=
pic
->
field_poc
[
parity
==
PICT_BOTTOM_FIELD
];
}
static
int
split_field_copy
(
Picture
*
dest
,
Picture
*
src
,
int
parity
,
int
id_add
)
{
static
int
split_field_copy
(
Picture
*
dest
,
Picture
*
src
,
int
parity
,
int
id_add
)
{
int
match
=
!!
(
src
->
reference
&
parity
);
if
(
match
)
{
COPY_PICTURE
(
dest
,
src
);
if
(
parity
!=
PICT_FRAME
)
{
if
(
parity
!=
PICT_FRAME
)
{
pic_as_field
(
dest
,
parity
);
dest
->
pic_id
*=
2
;
dest
->
pic_id
+=
id_add
;
...
...
@@ -68,76 +68,79 @@ static int split_field_copy(Picture *dest, Picture *src,
return
match
;
}
static
int
build_def_list
(
Picture
*
def
,
Picture
**
in
,
int
len
,
int
is_long
,
int
sel
){
int
i
[
2
]
=
{
0
};
int
index
=
0
;
static
int
build_def_list
(
Picture
*
def
,
Picture
**
in
,
int
len
,
int
is_long
,
int
sel
)
{
int
i
[
2
]
=
{
0
};
int
index
=
0
;
while
(
i
[
0
]
<
len
||
i
[
1
]
<
len
)
{
while
(
i
[
0
]
<
len
&&
!
(
in
[
i
[
0
]
]
&&
(
in
[
i
[
0
]
]
->
reference
&
sel
)))
while
(
i
[
0
]
<
len
||
i
[
1
]
<
len
)
{
while
(
i
[
0
]
<
len
&&
!
(
in
[
i
[
0
]]
&&
(
in
[
i
[
0
]
]
->
reference
&
sel
)))
i
[
0
]
++
;
while
(
i
[
1
]
<
len
&&
!
(
in
[
i
[
1
]
]
&&
(
in
[
i
[
1
]
]
->
reference
&
(
sel
^
3
))))
while
(
i
[
1
]
<
len
&&
!
(
in
[
i
[
1
]]
&&
(
in
[
i
[
1
]]
->
reference
&
(
sel
^
3
))))
i
[
1
]
++
;
if
(
i
[
0
]
<
len
)
{
in
[
i
[
0
]
]
->
pic_id
=
is_long
?
i
[
0
]
:
in
[
i
[
0
]
]
->
frame_num
;
split_field_copy
(
&
def
[
index
++
],
in
[
i
[
0
]
++
],
sel
,
1
);
if
(
i
[
0
]
<
len
)
{
in
[
i
[
0
]]
->
pic_id
=
is_long
?
i
[
0
]
:
in
[
i
[
0
]
]
->
frame_num
;
split_field_copy
(
&
def
[
index
++
],
in
[
i
[
0
]
++
],
sel
,
1
);
}
if
(
i
[
1
]
<
len
)
{
in
[
i
[
1
]
]
->
pic_id
=
is_long
?
i
[
1
]
:
in
[
i
[
1
]
]
->
frame_num
;
split_field_copy
(
&
def
[
index
++
],
in
[
i
[
1
]
++
],
sel
^
3
,
0
);
if
(
i
[
1
]
<
len
)
{
in
[
i
[
1
]]
->
pic_id
=
is_long
?
i
[
1
]
:
in
[
i
[
1
]
]
->
frame_num
;
split_field_copy
(
&
def
[
index
++
],
in
[
i
[
1
]
++
],
sel
^
3
,
0
);
}
}
return
index
;
}
static
int
add_sorted
(
Picture
**
sorted
,
Picture
**
src
,
int
len
,
int
limit
,
int
dir
){
static
int
add_sorted
(
Picture
**
sorted
,
Picture
**
src
,
int
len
,
int
limit
,
int
dir
)
{
int
i
,
best_poc
;
int
out_i
=
0
;
int
out_i
=
0
;
for
(;;)
{
best_poc
=
dir
?
INT_MIN
:
INT_MAX
;
for
(;;)
{
best_poc
=
dir
?
INT_MIN
:
INT_MAX
;
for
(
i
=
0
;
i
<
len
;
i
++
)
{
const
int
poc
=
src
[
i
]
->
poc
;
if
(((
poc
>
limit
)
^
dir
)
&&
((
poc
<
best_poc
)
^
dir
))
{
best_poc
=
poc
;
sorted
[
out_i
]
=
src
[
i
];
for
(
i
=
0
;
i
<
len
;
i
++
)
{
const
int
poc
=
src
[
i
]
->
poc
;
if
(((
poc
>
limit
)
^
dir
)
&&
((
poc
<
best_poc
)
^
dir
))
{
best_poc
=
poc
;
sorted
[
out_i
]
=
src
[
i
];
}
}
if
(
best_poc
==
(
dir
?
INT_MIN
:
INT_MAX
))
if
(
best_poc
==
(
dir
?
INT_MIN
:
INT_MAX
))
break
;
limit
=
sorted
[
out_i
++
]
->
poc
-
dir
;
limit
=
sorted
[
out_i
++
]
->
poc
-
dir
;
}
return
out_i
;
}
int
ff_h264_fill_default_ref_list
(
H264Context
*
h
){
int
ff_h264_fill_default_ref_list
(
H264Context
*
h
)
{
int
i
,
len
;
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
Picture
*
sorted
[
32
];
int
cur_poc
,
list
;
int
lens
[
2
];
if
(
FIELD_PICTURE
)
cur_poc
=
h
->
cur_pic_ptr
->
field_poc
[
h
->
picture_structure
==
PICT_BOTTOM_FIELD
];
if
(
FIELD_PICTURE
)
cur_poc
=
h
->
cur_pic_ptr
->
field_poc
[
h
->
picture_structure
==
PICT_BOTTOM_FIELD
];
else
cur_poc
=
h
->
cur_pic_ptr
->
poc
;
for
(
list
=
0
;
list
<
2
;
list
++
)
{
len
=
add_sorted
(
sorted
,
h
->
short_ref
,
h
->
short_ref_count
,
cur_poc
,
1
^
list
);
len
+=
add_sorted
(
sorted
+
len
,
h
->
short_ref
,
h
->
short_ref_count
,
cur_poc
,
0
^
list
);
assert
(
len
<=
32
);
len
=
build_def_list
(
h
->
default_ref_list
[
list
]
,
sorted
,
len
,
0
,
h
->
picture_structure
);
len
+=
build_def_list
(
h
->
default_ref_list
[
list
]
+
len
,
h
->
long_ref
,
16
,
1
,
h
->
picture_structure
);
assert
(
len
<=
32
);
if
(
len
<
h
->
ref_count
[
list
])
memset
(
&
h
->
default_ref_list
[
list
][
len
],
0
,
sizeof
(
Picture
)
*
(
h
->
ref_count
[
list
]
-
len
));
lens
[
list
]
=
len
;
cur_poc
=
h
->
cur_pic_ptr
->
poc
;
for
(
list
=
0
;
list
<
2
;
list
++
)
{
len
=
add_sorted
(
sorted
,
h
->
short_ref
,
h
->
short_ref_count
,
cur_poc
,
1
^
list
);
len
+=
add_sorted
(
sorted
+
len
,
h
->
short_ref
,
h
->
short_ref_count
,
cur_poc
,
0
^
list
);
assert
(
len
<=
32
);
len
=
build_def_list
(
h
->
default_ref_list
[
list
],
sorted
,
len
,
0
,
h
->
picture_structure
);
len
+=
build_def_list
(
h
->
default_ref_list
[
list
]
+
len
,
h
->
long_ref
,
16
,
1
,
h
->
picture_structure
);
assert
(
len
<=
32
);
if
(
len
<
h
->
ref_count
[
list
])
memset
(
&
h
->
default_ref_list
[
list
][
len
],
0
,
sizeof
(
Picture
)
*
(
h
->
ref_count
[
list
]
-
len
));
lens
[
list
]
=
len
;
}
if
(
lens
[
0
]
==
lens
[
1
]
&&
lens
[
1
]
>
1
)
{
if
(
lens
[
0
]
==
lens
[
1
]
&&
lens
[
1
]
>
1
)
{
for
(
i
=
0
;
h
->
default_ref_list
[
0
][
i
].
f
.
data
[
0
]
==
h
->
default_ref_list
[
1
][
i
].
f
.
data
[
0
]
&&
i
<
lens
[
0
];
i
++
);
if
(
i
==
lens
[
0
])
{
Picture
tmp
;
...
...
@@ -146,20 +149,26 @@ int ff_h264_fill_default_ref_list(H264Context *h){
COPY_PICTURE
(
&
h
->
default_ref_list
[
1
][
1
],
&
tmp
);
}
}
}
else
{
len
=
build_def_list
(
h
->
default_ref_list
[
0
]
,
h
->
short_ref
,
h
->
short_ref_count
,
0
,
h
->
picture_structure
);
len
+=
build_def_list
(
h
->
default_ref_list
[
0
]
+
len
,
h
->
long_ref
,
16
,
1
,
h
->
picture_structure
);
}
else
{
len
=
build_def_list
(
h
->
default_ref_list
[
0
],
h
->
short_ref
,
h
->
short_ref_count
,
0
,
h
->
picture_structure
);
len
+=
build_def_list
(
h
->
default_ref_list
[
0
]
+
len
,
h
->
long_ref
,
16
,
1
,
h
->
picture_structure
);
assert
(
len
<=
32
);
if
(
len
<
h
->
ref_count
[
0
])
memset
(
&
h
->
default_ref_list
[
0
][
len
],
0
,
sizeof
(
Picture
)
*
(
h
->
ref_count
[
0
]
-
len
));
if
(
len
<
h
->
ref_count
[
0
])
memset
(
&
h
->
default_ref_list
[
0
][
len
],
0
,
sizeof
(
Picture
)
*
(
h
->
ref_count
[
0
]
-
len
));
}
#ifdef TRACE
for
(
i
=
0
;
i
<
h
->
ref_count
[
0
];
i
++
)
{
tprintf
(
h
->
avctx
,
"List0: %s fn:%d 0x%p
\n
"
,
(
h
->
default_ref_list
[
0
][
i
].
long_ref
?
"LT"
:
"ST"
),
h
->
default_ref_list
[
0
][
i
].
pic_id
,
h
->
default_ref_list
[
0
][
i
].
f
.
data
[
0
]);
for
(
i
=
0
;
i
<
h
->
ref_count
[
0
];
i
++
)
{
tprintf
(
h
->
avctx
,
"List0: %s fn:%d 0x%p
\n
"
,
(
h
->
default_ref_list
[
0
][
i
].
long_ref
?
"LT"
:
"ST"
),
h
->
default_ref_list
[
0
][
i
].
pic_id
,
h
->
default_ref_list
[
0
][
i
].
f
.
data
[
0
]);
}
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
){
for
(
i
=
0
;
i
<
h
->
ref_count
[
1
];
i
++
)
{
tprintf
(
h
->
avctx
,
"List1: %s fn:%d 0x%p
\n
"
,
(
h
->
default_ref_list
[
1
][
i
].
long_ref
?
"LT"
:
"ST"
),
h
->
default_ref_list
[
1
][
i
].
pic_id
,
h
->
default_ref_list
[
1
][
i
].
f
.
data
[
0
]);
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
for
(
i
=
0
;
i
<
h
->
ref_count
[
1
];
i
++
)
{
tprintf
(
h
->
avctx
,
"List1: %s fn:%d 0x%p
\n
"
,
(
h
->
default_ref_list
[
1
][
i
].
long_ref
?
"LT"
:
"ST"
),
h
->
default_ref_list
[
1
][
i
].
pic_id
,
h
->
default_ref_list
[
1
][
i
].
f
.
data
[
0
]);
}
}
#endif
...
...
@@ -179,9 +188,10 @@ static void print_long_term(H264Context *h);
* @return frame number (short term) or long term index of picture
* described by pic_num
*/
static
int
pic_num_extract
(
H264Context
*
h
,
int
pic_num
,
int
*
structure
){
static
int
pic_num_extract
(
H264Context
*
h
,
int
pic_num
,
int
*
structure
)
{
*
structure
=
h
->
picture_structure
;
if
(
FIELD_PICTURE
)
{
if
(
FIELD_PICTURE
)
{
if
(
!
(
pic_num
&
1
))
/* opposite field */
*
structure
^=
PICT_FRAME
;
...
...
@@ -191,79 +201,80 @@ static int pic_num_extract(H264Context *h, int pic_num, int *structure){
return
pic_num
;
}
int
ff_h264_decode_ref_pic_list_reordering
(
H264Context
*
h
){
int
ff_h264_decode_ref_pic_list_reordering
(
H264Context
*
h
)
{
int
list
,
index
,
pic_structure
,
i
;
print_short_term
(
h
);
print_long_term
(
h
);
for
(
list
=
0
;
list
<
h
->
list_count
;
list
++
)
{
for
(
list
=
0
;
list
<
h
->
list_count
;
list
++
)
{
for
(
i
=
0
;
i
<
h
->
ref_count
[
list
];
i
++
)
COPY_PICTURE
(
&
h
->
ref_list
[
list
][
i
],
&
h
->
default_ref_list
[
list
][
i
]);
if
(
get_bits1
(
&
h
->
gb
))
{
int
pred
=
h
->
curr_pic_num
;
if
(
get_bits1
(
&
h
->
gb
))
{
int
pred
=
h
->
curr_pic_num
;
for
(
index
=
0
;
;
index
++
)
{
unsigned
int
reordering_of_pic_nums_idc
=
get_ue_golomb_31
(
&
h
->
gb
);
for
(
index
=
0
;
;
index
++
)
{
unsigned
int
reordering_of_pic_nums_idc
=
get_ue_golomb_31
(
&
h
->
gb
);
unsigned
int
pic_id
;
int
i
;
Picture
*
ref
=
NULL
;
if
(
reordering_of_pic_nums_idc
==
3
)
if
(
reordering_of_pic_nums_idc
==
3
)
break
;
if
(
index
>=
h
->
ref_count
[
list
])
{
if
(
index
>=
h
->
ref_count
[
list
])
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"reference count overflow
\n
"
);
return
-
1
;
}
if
(
reordering_of_pic_nums_idc
<
3
)
{
if
(
reordering_of_pic_nums_idc
<
2
)
{
const
unsigned
int
abs_diff_pic_num
=
get_ue_golomb
(
&
h
->
gb
)
+
1
;
if
(
reordering_of_pic_nums_idc
<
3
)
{
if
(
reordering_of_pic_nums_idc
<
2
)
{
const
unsigned
int
abs_diff_pic_num
=
get_ue_golomb
(
&
h
->
gb
)
+
1
;
int
frame_num
;
if
(
abs_diff_pic_num
>
h
->
max_pic_num
)
{
if
(
abs_diff_pic_num
>
h
->
max_pic_num
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"abs_diff_pic_num overflow
\n
"
);
return
-
1
;
}
if
(
reordering_of_pic_nums_idc
==
0
)
pred
-=
abs_diff_pic_num
;
else
pred
+=
abs_diff_pic_num
;
if
(
reordering_of_pic_nums_idc
==
0
)
pred
-=
abs_diff_pic_num
;
else
pred
+=
abs_diff_pic_num
;
pred
&=
h
->
max_pic_num
-
1
;
frame_num
=
pic_num_extract
(
h
,
pred
,
&
pic_structure
);
for
(
i
=
h
->
short_ref_count
-
1
;
i
>=
0
;
i
--
)
{
for
(
i
=
h
->
short_ref_count
-
1
;
i
>=
0
;
i
--
)
{
ref
=
h
->
short_ref
[
i
];
assert
(
ref
->
reference
);
assert
(
!
ref
->
long_ref
);
if
(
ref
->
frame_num
==
frame_num
&&
(
ref
->
reference
&
pic_structure
)
)
if
(
ref
->
frame_num
==
frame_num
&&
(
ref
->
reference
&
pic_structure
))
break
;
}
if
(
i
>=
0
)
ref
->
pic_id
=
pred
;
}
else
{
if
(
i
>=
0
)
ref
->
pic_id
=
pred
;
}
else
{
int
long_idx
;
pic_id
=
get_ue_golomb
(
&
h
->
gb
);
//long_term_pic_idx
pic_id
=
get_ue_golomb
(
&
h
->
gb
);
//long_term_pic_idx
long_idx
=
pic_num_extract
(
h
,
pic_id
,
&
pic_structure
);
long_idx
=
pic_num_extract
(
h
,
pic_id
,
&
pic_structure
);
if
(
long_idx
>
31
)
{
if
(
long_idx
>
31
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"long_term_pic_idx overflow
\n
"
);
return
-
1
;
}
ref
=
h
->
long_ref
[
long_idx
];
assert
(
!
(
ref
&&
!
ref
->
reference
));
if
(
ref
&&
(
ref
->
reference
&
pic_structure
))
{
ref
->
pic_id
=
pic_id
;
ref
->
pic_id
=
pic_id
;
assert
(
ref
->
long_ref
);
i
=
0
;
}
else
{
i
=
-
1
;
i
=
0
;
}
else
{
i
=
-
1
;
}
}
...
...
@@ -271,27 +282,28 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"reference picture missing during reorder
\n
"
);
memset
(
&
h
->
ref_list
[
list
][
index
],
0
,
sizeof
(
Picture
));
//FIXME
}
else
{
for
(
i
=
index
;
i
+
1
<
h
->
ref_count
[
list
];
i
++
){
if
(
ref
->
long_ref
==
h
->
ref_list
[
list
][
i
].
long_ref
&&
ref
->
pic_id
==
h
->
ref_list
[
list
][
i
].
pic_id
)
for
(
i
=
index
;
i
+
1
<
h
->
ref_count
[
list
];
i
++
)
{
if
(
ref
->
long_ref
==
h
->
ref_list
[
list
][
i
].
long_ref
&&
ref
->
pic_id
==
h
->
ref_list
[
list
][
i
].
pic_id
)
break
;
}
for
(;
i
>
index
;
i
--
)
{
for
(;
i
>
index
;
i
--
)
{
COPY_PICTURE
(
&
h
->
ref_list
[
list
][
i
],
&
h
->
ref_list
[
list
][
i
-
1
]);
}
COPY_PICTURE
(
&
h
->
ref_list
[
list
][
index
],
ref
);
if
(
FIELD_PICTURE
){
if
(
FIELD_PICTURE
)
{
pic_as_field
(
&
h
->
ref_list
[
list
][
index
],
pic_structure
);
}
}
}
else
{
}
else
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"illegal reordering_of_pic_nums_idc
\n
"
);
return
-
1
;
}
}
}
}
for
(
list
=
0
;
list
<
h
->
list_count
;
list
++
)
{
for
(
index
=
0
;
index
<
h
->
ref_count
[
list
];
index
++
)
{
for
(
list
=
0
;
list
<
h
->
list_count
;
list
++
)
{
for
(
index
=
0
;
index
<
h
->
ref_count
[
list
];
index
++
)
{
if
(
!
h
->
ref_list
[
list
][
index
].
f
.
data
[
0
])
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"Missing reference picture
\n
"
);
if
(
h
->
default_ref_list
[
list
][
0
].
f
.
data
[
0
])
...
...
@@ -305,28 +317,29 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){
return
0
;
}
void
ff_h264_fill_mbaff_ref_list
(
H264Context
*
h
){
void
ff_h264_fill_mbaff_ref_list
(
H264Context
*
h
)
{
int
list
,
i
,
j
;
for
(
list
=
0
;
list
<
2
;
list
++
)
{
//FIXME try list_count
for
(
i
=
0
;
i
<
h
->
ref_count
[
list
];
i
++
)
{
for
(
list
=
0
;
list
<
2
;
list
++
)
{
//FIXME try list_count
for
(
i
=
0
;
i
<
h
->
ref_count
[
list
];
i
++
)
{
Picture
*
frame
=
&
h
->
ref_list
[
list
][
i
];
Picture
*
field
=
&
h
->
ref_list
[
list
][
16
+
2
*
i
];
Picture
*
field
=
&
h
->
ref_list
[
list
][
16
+
2
*
i
];
COPY_PICTURE
(
field
,
frame
);
for
(
j
=
0
;
j
<
3
;
j
++
)
for
(
j
=
0
;
j
<
3
;
j
++
)
field
[
0
].
f
.
linesize
[
j
]
<<=
1
;
field
[
0
].
reference
=
PICT_TOP_FIELD
;
field
[
0
].
poc
=
field
[
0
].
field_poc
[
0
];
field
[
0
].
poc
=
field
[
0
].
field_poc
[
0
];
COPY_PICTURE
(
field
+
1
,
field
);
for
(
j
=
0
;
j
<
3
;
j
++
)
for
(
j
=
0
;
j
<
3
;
j
++
)
field
[
1
].
f
.
data
[
j
]
+=
frame
->
f
.
linesize
[
j
];
field
[
1
].
reference
=
PICT_BOTTOM_FIELD
;
field
[
1
].
poc
=
field
[
1
].
field_poc
[
1
];
field
[
1
].
poc
=
field
[
1
].
field_poc
[
1
];
h
->
luma_weight
[
16
+
2
*
i
][
list
][
0
]
=
h
->
luma_weight
[
16
+
2
*
i
+
1
][
list
][
0
]
=
h
->
luma_weight
[
i
][
list
][
0
];
h
->
luma_weight
[
16
+
2
*
i
][
list
][
1
]
=
h
->
luma_weight
[
16
+
2
*
i
+
1
][
list
][
1
]
=
h
->
luma_weight
[
i
][
list
][
1
];
for
(
j
=
0
;
j
<
2
;
j
++
)
{
h
->
chroma_weight
[
16
+
2
*
i
][
list
][
j
][
0
]
=
h
->
chroma_weight
[
16
+
2
*
i
+
1
][
list
][
j
][
0
]
=
h
->
chroma_weight
[
i
][
list
][
j
][
0
];
h
->
chroma_weight
[
16
+
2
*
i
][
list
][
j
][
1
]
=
h
->
chroma_weight
[
16
+
2
*
i
+
1
][
list
][
j
][
1
]
=
h
->
chroma_weight
[
i
][
list
][
j
][
1
];
h
->
luma_weight
[
16
+
2
*
i
][
list
][
0
]
=
h
->
luma_weight
[
16
+
2
*
i
+
1
][
list
][
0
]
=
h
->
luma_weight
[
i
][
list
][
0
];
h
->
luma_weight
[
16
+
2
*
i
][
list
][
1
]
=
h
->
luma_weight
[
16
+
2
*
i
+
1
][
list
][
1
]
=
h
->
luma_weight
[
i
][
list
][
1
];
for
(
j
=
0
;
j
<
2
;
j
++
)
{
h
->
chroma_weight
[
16
+
2
*
i
][
list
][
j
][
0
]
=
h
->
chroma_weight
[
16
+
2
*
i
+
1
][
list
][
j
][
0
]
=
h
->
chroma_weight
[
i
][
list
][
j
][
0
];
h
->
chroma_weight
[
16
+
2
*
i
][
list
][
j
][
1
]
=
h
->
chroma_weight
[
16
+
2
*
i
+
1
][
list
][
j
][
1
]
=
h
->
chroma_weight
[
i
][
list
][
j
][
1
];
}
}
}
...
...
@@ -343,7 +356,8 @@ void ff_h264_fill_mbaff_ref_list(H264Context *h){
* for display purposes) zero if one of the fields remains in
* reference
*/
static
inline
int
unreference_pic
(
H264Context
*
h
,
Picture
*
pic
,
int
refmask
){
static
inline
int
unreference_pic
(
H264Context
*
h
,
Picture
*
pic
,
int
refmask
)
{
int
i
;
if
(
pic
->
reference
&=
refmask
)
{
return
0
;
...
...
@@ -365,14 +379,15 @@ static inline int unreference_pic(H264Context *h, Picture *pic, int refmask){
* @return pointer to the found picture, or NULL if no pic with the provided
* frame number is found
*/
static
Picture
*
find_short
(
H264Context
*
h
,
int
frame_num
,
int
*
idx
){
static
Picture
*
find_short
(
H264Context
*
h
,
int
frame_num
,
int
*
idx
)
{
int
i
;
for
(
i
=
0
;
i
<
h
->
short_ref_count
;
i
++
)
{
Picture
*
pic
=
h
->
short_ref
[
i
];
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
for
(
i
=
0
;
i
<
h
->
short_ref_count
;
i
++
)
{
Picture
*
pic
=
h
->
short_ref
[
i
];
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"%d %d %p
\n
"
,
i
,
pic
->
frame_num
,
pic
);
if
(
pic
->
frame_num
==
frame_num
)
{
if
(
pic
->
frame_num
==
frame_num
)
{
*
idx
=
i
;
return
pic
;
}
...
...
@@ -386,28 +401,31 @@ static Picture * find_short(H264Context *h, int frame_num, int *idx){
* to be valid. Other list entries are shifted down.
* @param i index into h->short_ref of picture to remove.
*/
static
void
remove_short_at_index
(
H264Context
*
h
,
int
i
){
static
void
remove_short_at_index
(
H264Context
*
h
,
int
i
)
{
assert
(
i
>=
0
&&
i
<
h
->
short_ref_count
);
h
->
short_ref
[
i
]
=
NULL
;
h
->
short_ref
[
i
]
=
NULL
;
if
(
--
h
->
short_ref_count
)
memmove
(
&
h
->
short_ref
[
i
],
&
h
->
short_ref
[
i
+
1
],
(
h
->
short_ref_count
-
i
)
*
sizeof
(
Picture
*
));
memmove
(
&
h
->
short_ref
[
i
],
&
h
->
short_ref
[
i
+
1
],
(
h
->
short_ref_count
-
i
)
*
sizeof
(
Picture
*
));
}
/**
*
* @return the removed picture or NULL if an error occurs
*/
static
Picture
*
remove_short
(
H264Context
*
h
,
int
frame_num
,
int
ref_mask
){
static
Picture
*
remove_short
(
H264Context
*
h
,
int
frame_num
,
int
ref_mask
)
{
Picture
*
pic
;
int
i
;
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"remove short %d count %d
\n
"
,
frame_num
,
h
->
short_ref_count
);
pic
=
find_short
(
h
,
frame_num
,
&
i
);
if
(
pic
){
if
(
unreference_pic
(
h
,
pic
,
ref_mask
))
remove_short_at_index
(
h
,
i
);
if
(
pic
)
{
if
(
unreference_pic
(
h
,
pic
,
ref_mask
))
remove_short_at_index
(
h
,
i
);
}
return
pic
;
...
...
@@ -418,15 +436,16 @@ static Picture * remove_short(H264Context *h, int frame_num, int ref_mask){
* that list.
* @return the removed picture or NULL if an error occurs
*/
static
Picture
*
remove_long
(
H264Context
*
h
,
int
i
,
int
ref_mask
){
static
Picture
*
remove_long
(
H264Context
*
h
,
int
i
,
int
ref_mask
)
{
Picture
*
pic
;
pic
=
h
->
long_ref
[
i
];
if
(
pic
){
if
(
unreference_pic
(
h
,
pic
,
ref_mask
))
{
pic
=
h
->
long_ref
[
i
];
if
(
pic
)
{
if
(
unreference_pic
(
h
,
pic
,
ref_mask
))
{
assert
(
h
->
long_ref
[
i
]
->
long_ref
==
1
);
h
->
long_ref
[
i
]
->
long_ref
=
0
;
h
->
long_ref
[
i
]
=
NULL
;
h
->
long_ref
[
i
]
->
long_ref
=
0
;
h
->
long_ref
[
i
]
=
NULL
;
h
->
long_ref_count
--
;
}
}
...
...
@@ -434,30 +453,32 @@ static Picture * remove_long(H264Context *h, int i, int ref_mask){
return
pic
;
}
void
ff_h264_remove_all_refs
(
H264Context
*
h
){
void
ff_h264_remove_all_refs
(
H264Context
*
h
)
{
int
i
;
for
(
i
=
0
;
i
<
16
;
i
++
)
{
for
(
i
=
0
;
i
<
16
;
i
++
)
{
remove_long
(
h
,
i
,
0
);
}
assert
(
h
->
long_ref_count
==
0
);
assert
(
h
->
long_ref_count
==
0
);
for
(
i
=
0
;
i
<
h
->
short_ref_count
;
i
++
)
{
for
(
i
=
0
;
i
<
h
->
short_ref_count
;
i
++
)
{
unreference_pic
(
h
,
h
->
short_ref
[
i
],
0
);
h
->
short_ref
[
i
]
=
NULL
;
h
->
short_ref
[
i
]
=
NULL
;
}
h
->
short_ref_count
=
0
;
h
->
short_ref_count
=
0
;
}
/**
* print short term list
*/
static
void
print_short_term
(
H264Context
*
h
)
{
static
void
print_short_term
(
H264Context
*
h
)
{
uint32_t
i
;
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
{
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
{
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"short term list:
\n
"
);
for
(
i
=
0
;
i
<
h
->
short_ref_count
;
i
++
)
{
Picture
*
pic
=
h
->
short_ref
[
i
];
for
(
i
=
0
;
i
<
h
->
short_ref_count
;
i
++
)
{
Picture
*
pic
=
h
->
short_ref
[
i
];
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"%d fn:%d poc:%d %p
\n
"
,
i
,
pic
->
frame_num
,
pic
->
poc
,
pic
->
f
.
data
[
0
]);
}
...
...
@@ -467,12 +488,13 @@ static void print_short_term(H264Context *h) {
/**
* print long term list
*/
static
void
print_long_term
(
H264Context
*
h
)
{
static
void
print_long_term
(
H264Context
*
h
)
{
uint32_t
i
;
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
{
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
{
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"long term list:
\n
"
);
for
(
i
=
0
;
i
<
16
;
i
++
)
{
Picture
*
pic
=
h
->
long_ref
[
i
];
for
(
i
=
0
;
i
<
16
;
i
++
)
{
Picture
*
pic
=
h
->
long_ref
[
i
];
if
(
pic
)
{
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"%d fn:%d poc:%d %p
\n
"
,
i
,
pic
->
frame_num
,
pic
->
poc
,
pic
->
f
.
data
[
0
]);
...
...
@@ -503,14 +525,14 @@ int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice)
if
(
h
->
short_ref_count
&&
h
->
long_ref_count
+
h
->
short_ref_count
==
h
->
sps
.
ref_frame_count
&&
!
(
FIELD_PICTURE
&&
!
h
->
first_field
&&
h
->
cur_pic_ptr
->
reference
))
{
mmco
[
0
].
opcode
=
MMCO_SHORT2UNUSED
;
mmco
[
0
].
opcode
=
MMCO_SHORT2UNUSED
;
mmco
[
0
].
short_pic_num
=
h
->
short_ref
[
h
->
short_ref_count
-
1
]
->
frame_num
;
mmco_index
=
1
;
mmco_index
=
1
;
if
(
FIELD_PICTURE
)
{
mmco
[
0
].
short_pic_num
*=
2
;
mmco
[
1
].
opcode
=
MMCO_SHORT2UNUSED
;
mmco
[
1
].
short_pic_num
=
mmco
[
0
].
short_pic_num
+
1
;
mmco_index
=
2
;
mmco
[
1
].
opcode
=
MMCO_SHORT2UNUSED
;
mmco
[
1
].
short_pic_num
=
mmco
[
0
].
short_pic_num
+
1
;
mmco_index
=
2
;
}
}
...
...
@@ -527,26 +549,29 @@ int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice)
return
0
;
}
int
ff_h264_execute_ref_pic_marking
(
H264Context
*
h
,
MMCO
*
mmco
,
int
mmco_count
){
int
ff_h264_execute_ref_pic_marking
(
H264Context
*
h
,
MMCO
*
mmco
,
int
mmco_count
)
{
int
i
,
av_uninit
(
j
);
int
current_ref_assigned
=
0
,
err
=
0
;
int
current_ref_assigned
=
0
,
err
=
0
;
Picture
*
av_uninit
(
pic
);
if
((
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
&&
mmco_count
==
0
)
if
((
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
&&
mmco_count
==
0
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"no mmco here
\n
"
);
for
(
i
=
0
;
i
<
mmco_count
;
i
++
)
{
for
(
i
=
0
;
i
<
mmco_count
;
i
++
)
{
int
av_uninit
(
structure
),
av_uninit
(
frame_num
);
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"mmco:%d %d %d
\n
"
,
h
->
mmco
[
i
].
opcode
,
h
->
mmco
[
i
].
short_pic_num
,
h
->
mmco
[
i
].
long_arg
);
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"mmco:%d %d %d
\n
"
,
h
->
mmco
[
i
].
opcode
,
h
->
mmco
[
i
].
short_pic_num
,
h
->
mmco
[
i
].
long_arg
);
if
(
mmco
[
i
].
opcode
==
MMCO_SHORT2UNUSED
||
mmco
[
i
].
opcode
==
MMCO_SHORT2LONG
)
{
if
(
mmco
[
i
].
opcode
==
MMCO_SHORT2UNUSED
||
mmco
[
i
].
opcode
==
MMCO_SHORT2LONG
)
{
frame_num
=
pic_num_extract
(
h
,
mmco
[
i
].
short_pic_num
,
&
structure
);
pic
=
find_short
(
h
,
frame_num
,
&
j
);
if
(
!
pic
){
if
(
mmco
[
i
].
opcode
!=
MMCO_SHORT2LONG
||
!
h
->
long_ref
[
mmco
[
i
].
long_arg
]
||
h
->
long_ref
[
mmco
[
i
].
long_arg
]
->
frame_num
!=
frame_num
)
{
pic
=
find_short
(
h
,
frame_num
,
&
j
);
if
(
!
pic
)
{
if
(
mmco
[
i
].
opcode
!=
MMCO_SHORT2LONG
||
!
h
->
long_ref
[
mmco
[
i
].
long_arg
]
||
h
->
long_ref
[
mmco
[
i
].
long_arg
]
->
frame_num
!=
frame_num
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"mmco: unref short failure
\n
"
);
err
=
AVERROR_INVALIDDATA
;
}
...
...
@@ -554,10 +579,11 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
}
}
switch
(
mmco
[
i
].
opcode
)
{
switch
(
mmco
[
i
].
opcode
)
{
case
MMCO_SHORT2UNUSED
:
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"mmco: unref short %d count %d
\n
"
,
h
->
mmco
[
i
].
short_pic_num
,
h
->
short_ref_count
);
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"mmco: unref short %d count %d
\n
"
,
h
->
mmco
[
i
].
short_pic_num
,
h
->
short_ref_count
);
remove_short
(
h
,
frame_num
,
structure
^
PICT_FRAME
);
break
;
case
MMCO_SHORT2LONG
:
...
...
@@ -565,18 +591,18 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
remove_long
(
h
,
mmco
[
i
].
long_arg
,
0
);
remove_short_at_index
(
h
,
j
);
h
->
long_ref
[
mmco
[
i
].
long_arg
]
=
pic
;
if
(
h
->
long_ref
[
mmco
[
i
].
long_arg
])
{
h
->
long_ref
[
mmco
[
i
].
long_arg
]
->
long_ref
=
1
;
h
->
long_ref
[
mmco
[
i
].
long_arg
]
=
pic
;
if
(
h
->
long_ref
[
mmco
[
i
].
long_arg
])
{
h
->
long_ref
[
mmco
[
i
].
long_arg
]
->
long_ref
=
1
;
h
->
long_ref_count
++
;
}
break
;
case
MMCO_LONG2UNUSED
:
j
=
pic_num_extract
(
h
,
mmco
[
i
].
long_arg
,
&
structure
);
j
=
pic_num_extract
(
h
,
mmco
[
i
].
long_arg
,
&
structure
);
pic
=
h
->
long_ref
[
j
];
if
(
pic
)
{
remove_long
(
h
,
j
,
structure
^
PICT_FRAME
);
}
else
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
}
else
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"mmco: unref long failure
\n
"
);
break
;
case
MMCO_LONG
:
...
...
@@ -591,32 +617,31 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
if
(
h
->
long_ref
[
mmco
[
i
].
long_arg
]
!=
h
->
cur_pic_ptr
)
{
remove_long
(
h
,
mmco
[
i
].
long_arg
,
0
);
h
->
long_ref
[
mmco
[
i
].
long_arg
]
=
h
->
cur_pic_ptr
;
h
->
long_ref
[
mmco
[
i
].
long_arg
]
->
long_ref
=
1
;
h
->
long_ref
[
mmco
[
i
].
long_arg
]
=
h
->
cur_pic_ptr
;
h
->
long_ref
[
mmco
[
i
].
long_arg
]
->
long_ref
=
1
;
h
->
long_ref_count
++
;
}
h
->
cur_pic_ptr
->
reference
|=
h
->
picture_structure
;
current_ref_assigned
=
1
;
current_ref_assigned
=
1
;
break
;
case
MMCO_SET_MAX_LONG
:
assert
(
mmco
[
i
].
long_arg
<=
16
);
// just remove the long term which index is greater than new max
for
(
j
=
mmco
[
i
].
long_arg
;
j
<
16
;
j
++
)
{
for
(
j
=
mmco
[
i
].
long_arg
;
j
<
16
;
j
++
)
{
remove_long
(
h
,
j
,
0
);
}
break
;
case
MMCO_RESET
:
while
(
h
->
short_ref_count
)
{
while
(
h
->
short_ref_count
)
{
remove_short
(
h
,
h
->
short_ref
[
0
]
->
frame_num
,
0
);
}
for
(
j
=
0
;
j
<
16
;
j
++
)
{
for
(
j
=
0
;
j
<
16
;
j
++
)
{
remove_long
(
h
,
j
,
0
);
}
h
->
frame_num
=
h
->
cur_pic_ptr
->
frame_num
=
0
;
h
->
frame_num
=
h
->
cur_pic_ptr
->
frame_num
=
0
;
h
->
mmco_reset
=
1
;
h
->
cur_pic_ptr
->
mmco_reset
=
1
;
h
->
cur_pic_ptr
->
mmco_reset
=
1
;
break
;
default:
assert
(
0
);
}
...
...
@@ -639,23 +664,24 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
"(first field is long term)
\n
"
);
err
=
AVERROR_INVALIDDATA
;
}
else
{
pic
=
remove_short
(
h
,
h
->
cur_pic_ptr
->
frame_num
,
0
);
if
(
pic
)
{
pic
=
remove_short
(
h
,
h
->
cur_pic_ptr
->
frame_num
,
0
);
if
(
pic
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"illegal short term buffer state detected
\n
"
);
err
=
AVERROR_INVALIDDATA
;
}
if
(
h
->
short_ref_count
)
memmove
(
&
h
->
short_ref
[
1
],
&
h
->
short_ref
[
0
],
h
->
short_ref_count
*
sizeof
(
Picture
*
));
if
(
h
->
short_ref_count
)
memmove
(
&
h
->
short_ref
[
1
],
&
h
->
short_ref
[
0
],
h
->
short_ref_count
*
sizeof
(
Picture
*
));
h
->
short_ref
[
0
]
=
h
->
cur_pic_ptr
;
h
->
short_ref
[
0
]
=
h
->
cur_pic_ptr
;
h
->
short_ref_count
++
;
h
->
cur_pic_ptr
->
reference
|=
h
->
picture_structure
;
}
}
if
(
h
->
long_ref_count
+
h
->
short_ref_count
-
(
h
->
short_ref
[
0
]
==
h
->
cur_pic_ptr
)
>
h
->
sps
.
ref_frame_count
)
{
(
h
->
short_ref
[
0
]
==
h
->
cur_pic_ptr
)
>
h
->
sps
.
ref_frame_count
)
{
/* We have too many reference frames, probably due to corrupted
* stream. Need to discard one frame. Prevents overrun of the
...
...
@@ -692,12 +718,12 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
MMCO
mmco_temp
[
MAX_MMCO_COUNT
],
*
mmco
=
first_slice
?
h
->
mmco
:
mmco_temp
;
int
mmco_index
=
0
;
if
(
h
->
nal_unit_type
==
NAL_IDR_SLICE
){
// FIXME fields
if
(
h
->
nal_unit_type
==
NAL_IDR_SLICE
)
{
// FIXME fields
skip_bits1
(
gb
);
// broken_link
if
(
get_bits1
(
gb
)){
mmco
[
0
].
opcode
=
MMCO_LONG
;
if
(
get_bits1
(
gb
))
{
mmco
[
0
].
opcode
=
MMCO_LONG
;
mmco
[
0
].
long_arg
=
0
;
mmco_index
=
1
;
mmco_index
=
1
;
}
}
else
{
if
(
get_bits1
(
gb
))
{
// adaptive_ref_pic_marking_mode_flag
...
...
@@ -705,7 +731,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
MMCOOpcode
opcode
=
get_ue_golomb_31
(
gb
);
mmco
[
i
].
opcode
=
opcode
;
if
(
opcode
==
MMCO_SHORT2UNUSED
||
opcode
==
MMCO_SHORT2LONG
){
if
(
opcode
==
MMCO_SHORT2UNUSED
||
opcode
==
MMCO_SHORT2LONG
)
{
mmco
[
i
].
short_pic_num
=
(
h
->
curr_pic_num
-
get_ue_golomb
(
gb
)
-
1
)
&
(
h
->
max_pic_num
-
1
);
...
...
@@ -725,7 +751,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
if
(
long_arg
>=
32
||
(
long_arg
>=
16
&&
!
(
opcode
==
MMCO_SET_MAX_LONG
&&
long_arg
==
16
)
&&
!
(
opcode
==
MMCO_LONG2UNUSED
&&
FIELD_PICTURE
))){
!
(
opcode
==
MMCO_LONG2UNUSED
&&
FIELD_PICTURE
)))
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"illegal long ref in memory management control "
"operation %d
\n
"
,
opcode
);
...
...
@@ -734,7 +760,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
mmco
[
i
].
long_arg
=
long_arg
;
}
if
(
opcode
>
(
unsigned
)
MMCO_LONG
){
if
(
opcode
>
(
unsigned
)
MMCO_LONG
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"illegal memory management control operation %d
\n
"
,
opcode
);
...
...
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