Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
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){
...
@@ -46,19 +46,19 @@ static void pic_as_field(Picture *pic, const int parity){
for
(
i
=
0
;
i
<
4
;
++
i
)
{
for
(
i
=
0
;
i
<
4
;
++
i
)
{
if
(
parity
==
PICT_BOTTOM_FIELD
)
if
(
parity
==
PICT_BOTTOM_FIELD
)
pic
->
f
.
data
[
i
]
+=
pic
->
f
.
linesize
[
i
];
pic
->
f
.
data
[
i
]
+=
pic
->
f
.
linesize
[
i
];
pic
->
reference
=
parity
;
pic
->
reference
=
parity
;
pic
->
f
.
linesize
[
i
]
*=
2
;
pic
->
f
.
linesize
[
i
]
*=
2
;
}
}
pic
->
poc
=
pic
->
field_poc
[
parity
==
PICT_BOTTOM_FIELD
];
pic
->
poc
=
pic
->
field_poc
[
parity
==
PICT_BOTTOM_FIELD
];
}
}
static
int
split_field_copy
(
Picture
*
dest
,
Picture
*
src
,
static
int
split_field_copy
(
Picture
*
dest
,
Picture
*
src
,
int
parity
,
int
id_add
)
int
parity
,
int
id_add
)
{
{
int
match
=
!!
(
src
->
reference
&
parity
);
int
match
=
!!
(
src
->
reference
&
parity
);
if
(
match
)
{
if
(
match
)
{
COPY_PICTURE
(
dest
,
src
);
COPY_PICTURE
(
dest
,
src
);
if
(
parity
!=
PICT_FRAME
)
{
if
(
parity
!=
PICT_FRAME
)
{
pic_as_field
(
dest
,
parity
);
pic_as_field
(
dest
,
parity
);
dest
->
pic_id
*=
2
;
dest
->
pic_id
*=
2
;
dest
->
pic_id
+=
id_add
;
dest
->
pic_id
+=
id_add
;
...
@@ -68,76 +68,79 @@ static int split_field_copy(Picture *dest, Picture *src,
...
@@ -68,76 +68,79 @@ static int split_field_copy(Picture *dest, Picture *src,
return
match
;
return
match
;
}
}
static
int
build_def_list
(
Picture
*
def
,
Picture
**
in
,
int
len
,
int
is_long
,
int
sel
){
static
int
build_def_list
(
Picture
*
def
,
Picture
**
in
,
int
len
,
int
is_long
,
int
sel
)
int
i
[
2
]
=
{
0
};
{
int
index
=
0
;
int
i
[
2
]
=
{
0
};
int
index
=
0
;
while
(
i
[
0
]
<
len
||
i
[
1
]
<
len
)
{
while
(
i
[
0
]
<
len
||
i
[
1
]
<
len
)
{
while
(
i
[
0
]
<
len
&&
!
(
in
[
i
[
0
]
]
&&
(
in
[
i
[
0
]
]
->
reference
&
sel
)))
while
(
i
[
0
]
<
len
&&
!
(
in
[
i
[
0
]]
&&
(
in
[
i
[
0
]
]
->
reference
&
sel
)))
i
[
0
]
++
;
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
]
++
;
i
[
1
]
++
;
if
(
i
[
0
]
<
len
)
{
if
(
i
[
0
]
<
len
)
{
in
[
i
[
0
]
]
->
pic_id
=
is_long
?
i
[
0
]
:
in
[
i
[
0
]
]
->
frame_num
;
in
[
i
[
0
]]
->
pic_id
=
is_long
?
i
[
0
]
:
in
[
i
[
0
]
]
->
frame_num
;
split_field_copy
(
&
def
[
index
++
],
in
[
i
[
0
]
++
],
sel
,
1
);
split_field_copy
(
&
def
[
index
++
],
in
[
i
[
0
]
++
],
sel
,
1
);
}
}
if
(
i
[
1
]
<
len
)
{
if
(
i
[
1
]
<
len
)
{
in
[
i
[
1
]
]
->
pic_id
=
is_long
?
i
[
1
]
:
in
[
i
[
1
]
]
->
frame_num
;
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
);
split_field_copy
(
&
def
[
index
++
],
in
[
i
[
1
]
++
],
sel
^
3
,
0
);
}
}
}
}
return
index
;
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
i
,
best_poc
;
int
out_i
=
0
;
int
out_i
=
0
;
for
(;;)
{
for
(;;)
{
best_poc
=
dir
?
INT_MIN
:
INT_MAX
;
best_poc
=
dir
?
INT_MIN
:
INT_MAX
;
for
(
i
=
0
;
i
<
len
;
i
++
)
{
for
(
i
=
0
;
i
<
len
;
i
++
)
{
const
int
poc
=
src
[
i
]
->
poc
;
const
int
poc
=
src
[
i
]
->
poc
;
if
(((
poc
>
limit
)
^
dir
)
&&
((
poc
<
best_poc
)
^
dir
))
{
if
(((
poc
>
limit
)
^
dir
)
&&
((
poc
<
best_poc
)
^
dir
))
{
best_poc
=
poc
;
best_poc
=
poc
;
sorted
[
out_i
]
=
src
[
i
];
sorted
[
out_i
]
=
src
[
i
];
}
}
}
}
if
(
best_poc
==
(
dir
?
INT_MIN
:
INT_MAX
))
if
(
best_poc
==
(
dir
?
INT_MIN
:
INT_MAX
))
break
;
break
;
limit
=
sorted
[
out_i
++
]
->
poc
-
dir
;
limit
=
sorted
[
out_i
++
]
->
poc
-
dir
;
}
}
return
out_i
;
return
out_i
;
}
}
int
ff_h264_fill_default_ref_list
(
H264Context
*
h
){
int
ff_h264_fill_default_ref_list
(
H264Context
*
h
)
{
int
i
,
len
;
int
i
,
len
;
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
Picture
*
sorted
[
32
];
Picture
*
sorted
[
32
];
int
cur_poc
,
list
;
int
cur_poc
,
list
;
int
lens
[
2
];
int
lens
[
2
];
if
(
FIELD_PICTURE
)
if
(
FIELD_PICTURE
)
cur_poc
=
h
->
cur_pic_ptr
->
field_poc
[
h
->
picture_structure
==
PICT_BOTTOM_FIELD
];
cur_poc
=
h
->
cur_pic_ptr
->
field_poc
[
h
->
picture_structure
==
PICT_BOTTOM_FIELD
];
else
else
cur_poc
=
h
->
cur_pic_ptr
->
poc
;
cur_poc
=
h
->
cur_pic_ptr
->
poc
;
for
(
list
=
0
;
list
<
2
;
list
++
)
{
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
,
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
);
len
+=
add_sorted
(
sorted
+
len
,
h
->
short_ref
,
h
->
short_ref_count
,
cur_poc
,
0
^
list
);
assert
(
len
<=
32
);
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
],
sorted
,
len
,
0
,
h
->
picture_structure
);
len
+=
build_def_list
(
h
->
default_ref_list
[
list
]
+
len
,
h
->
long_ref
,
16
,
1
,
h
->
picture_structure
);
len
+=
build_def_list
(
h
->
default_ref_list
[
list
]
+
len
,
h
->
long_ref
,
16
,
1
,
h
->
picture_structure
);
assert
(
len
<=
32
);
assert
(
len
<=
32
);
if
(
len
<
h
->
ref_count
[
list
])
if
(
len
<
h
->
ref_count
[
list
])
memset
(
&
h
->
default_ref_list
[
list
][
len
],
0
,
sizeof
(
Picture
)
*
(
h
->
ref_count
[
list
]
-
len
));
memset
(
&
h
->
default_ref_list
[
list
][
len
],
0
,
sizeof
(
Picture
)
*
(
h
->
ref_count
[
list
]
-
len
));
lens
[
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
++
);
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
])
{
if
(
i
==
lens
[
0
])
{
Picture
tmp
;
Picture
tmp
;
...
@@ -146,20 +149,26 @@ int ff_h264_fill_default_ref_list(H264Context *h){
...
@@ -146,20 +149,26 @@ int ff_h264_fill_default_ref_list(H264Context *h){
COPY_PICTURE
(
&
h
->
default_ref_list
[
1
][
1
],
&
tmp
);
COPY_PICTURE
(
&
h
->
default_ref_list
[
1
][
1
],
&
tmp
);
}
}
}
}
}
else
{
}
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
],
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
);
len
+=
build_def_list
(
h
->
default_ref_list
[
0
]
+
len
,
h
->
long_ref
,
16
,
1
,
h
->
picture_structure
);
assert
(
len
<=
32
);
assert
(
len
<=
32
);
if
(
len
<
h
->
ref_count
[
0
])
if
(
len
<
h
->
ref_count
[
0
])
memset
(
&
h
->
default_ref_list
[
0
][
len
],
0
,
sizeof
(
Picture
)
*
(
h
->
ref_count
[
0
]
-
len
));
memset
(
&
h
->
default_ref_list
[
0
][
len
],
0
,
sizeof
(
Picture
)
*
(
h
->
ref_count
[
0
]
-
len
));
}
}
#ifdef TRACE
#ifdef TRACE
for
(
i
=
0
;
i
<
h
->
ref_count
[
0
];
i
++
)
{
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
]);
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
){
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
for
(
i
=
0
;
i
<
h
->
ref_count
[
1
];
i
++
)
{
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
]);
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
#endif
...
@@ -179,9 +188,10 @@ static void print_long_term(H264Context *h);
...
@@ -179,9 +188,10 @@ static void print_long_term(H264Context *h);
* @return frame number (short term) or long term index of picture
* @return frame number (short term) or long term index of picture
* described by pic_num
* 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
;
*
structure
=
h
->
picture_structure
;
if
(
FIELD_PICTURE
)
{
if
(
FIELD_PICTURE
)
{
if
(
!
(
pic_num
&
1
))
if
(
!
(
pic_num
&
1
))
/* opposite field */
/* opposite field */
*
structure
^=
PICT_FRAME
;
*
structure
^=
PICT_FRAME
;
...
@@ -191,79 +201,80 @@ static int pic_num_extract(H264Context *h, int pic_num, int *structure){
...
@@ -191,79 +201,80 @@ static int pic_num_extract(H264Context *h, int pic_num, int *structure){
return
pic_num
;
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
;
int
list
,
index
,
pic_structure
,
i
;
print_short_term
(
h
);
print_short_term
(
h
);
print_long_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
++
)
for
(
i
=
0
;
i
<
h
->
ref_count
[
list
];
i
++
)
COPY_PICTURE
(
&
h
->
ref_list
[
list
][
i
],
&
h
->
default_ref_list
[
list
][
i
]);
COPY_PICTURE
(
&
h
->
ref_list
[
list
][
i
],
&
h
->
default_ref_list
[
list
][
i
]);
if
(
get_bits1
(
&
h
->
gb
))
{
if
(
get_bits1
(
&
h
->
gb
))
{
int
pred
=
h
->
curr_pic_num
;
int
pred
=
h
->
curr_pic_num
;
for
(
index
=
0
;
;
index
++
)
{
for
(
index
=
0
;
;
index
++
)
{
unsigned
int
reordering_of_pic_nums_idc
=
get_ue_golomb_31
(
&
h
->
gb
);
unsigned
int
reordering_of_pic_nums_idc
=
get_ue_golomb_31
(
&
h
->
gb
);
unsigned
int
pic_id
;
unsigned
int
pic_id
;
int
i
;
int
i
;
Picture
*
ref
=
NULL
;
Picture
*
ref
=
NULL
;
if
(
reordering_of_pic_nums_idc
==
3
)
if
(
reordering_of_pic_nums_idc
==
3
)
break
;
break
;
if
(
index
>=
h
->
ref_count
[
list
])
{
if
(
index
>=
h
->
ref_count
[
list
])
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"reference count overflow
\n
"
);
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"reference count overflow
\n
"
);
return
-
1
;
return
-
1
;
}
}
if
(
reordering_of_pic_nums_idc
<
3
)
{
if
(
reordering_of_pic_nums_idc
<
3
)
{
if
(
reordering_of_pic_nums_idc
<
2
)
{
if
(
reordering_of_pic_nums_idc
<
2
)
{
const
unsigned
int
abs_diff_pic_num
=
get_ue_golomb
(
&
h
->
gb
)
+
1
;
const
unsigned
int
abs_diff_pic_num
=
get_ue_golomb
(
&
h
->
gb
)
+
1
;
int
frame_num
;
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
"
);
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"abs_diff_pic_num overflow
\n
"
);
return
-
1
;
return
-
1
;
}
}
if
(
reordering_of_pic_nums_idc
==
0
)
pred
-=
abs_diff_pic_num
;
if
(
reordering_of_pic_nums_idc
==
0
)
else
pred
+=
abs_diff_pic_num
;
pred
-=
abs_diff_pic_num
;
else
pred
+=
abs_diff_pic_num
;
pred
&=
h
->
max_pic_num
-
1
;
pred
&=
h
->
max_pic_num
-
1
;
frame_num
=
pic_num_extract
(
h
,
pred
,
&
pic_structure
);
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
];
ref
=
h
->
short_ref
[
i
];
assert
(
ref
->
reference
);
assert
(
ref
->
reference
);
assert
(
!
ref
->
long_ref
);
assert
(
!
ref
->
long_ref
);
if
(
if
(
ref
->
frame_num
==
frame_num
&&
ref
->
frame_num
==
frame_num
&&
(
ref
->
reference
&
pic_structure
))
(
ref
->
reference
&
pic_structure
)
)
break
;
break
;
}
}
if
(
i
>=
0
)
if
(
i
>=
0
)
ref
->
pic_id
=
pred
;
ref
->
pic_id
=
pred
;
}
else
{
}
else
{
int
long_idx
;
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
"
);
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"long_term_pic_idx overflow
\n
"
);
return
-
1
;
return
-
1
;
}
}
ref
=
h
->
long_ref
[
long_idx
];
ref
=
h
->
long_ref
[
long_idx
];
assert
(
!
(
ref
&&
!
ref
->
reference
));
assert
(
!
(
ref
&&
!
ref
->
reference
));
if
(
ref
&&
(
ref
->
reference
&
pic_structure
))
{
if
(
ref
&&
(
ref
->
reference
&
pic_structure
))
{
ref
->
pic_id
=
pic_id
;
ref
->
pic_id
=
pic_id
;
assert
(
ref
->
long_ref
);
assert
(
ref
->
long_ref
);
i
=
0
;
i
=
0
;
}
else
{
}
else
{
i
=
-
1
;
i
=
-
1
;
}
}
}
}
...
@@ -271,27 +282,28 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){
...
@@ -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
"
);
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"reference picture missing during reorder
\n
"
);
memset
(
&
h
->
ref_list
[
list
][
index
],
0
,
sizeof
(
Picture
));
//FIXME
memset
(
&
h
->
ref_list
[
list
][
index
],
0
,
sizeof
(
Picture
));
//FIXME
}
else
{
}
else
{
for
(
i
=
index
;
i
+
1
<
h
->
ref_count
[
list
];
i
++
){
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
)
if
(
ref
->
long_ref
==
h
->
ref_list
[
list
][
i
].
long_ref
&&
ref
->
pic_id
==
h
->
ref_list
[
list
][
i
].
pic_id
)
break
;
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
][
i
],
&
h
->
ref_list
[
list
][
i
-
1
]);
}
}
COPY_PICTURE
(
&
h
->
ref_list
[
list
][
index
],
ref
);
COPY_PICTURE
(
&
h
->
ref_list
[
list
][
index
],
ref
);
if
(
FIELD_PICTURE
){
if
(
FIELD_PICTURE
)
{
pic_as_field
(
&
h
->
ref_list
[
list
][
index
],
pic_structure
);
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
"
);
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"illegal reordering_of_pic_nums_idc
\n
"
);
return
-
1
;
return
-
1
;
}
}
}
}
}
}
}
}
for
(
list
=
0
;
list
<
h
->
list_count
;
list
++
)
{
for
(
list
=
0
;
list
<
h
->
list_count
;
list
++
)
{
for
(
index
=
0
;
index
<
h
->
ref_count
[
list
];
index
++
)
{
for
(
index
=
0
;
index
<
h
->
ref_count
[
list
];
index
++
)
{
if
(
!
h
->
ref_list
[
list
][
index
].
f
.
data
[
0
])
{
if
(
!
h
->
ref_list
[
list
][
index
].
f
.
data
[
0
])
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"Missing reference picture
\n
"
);
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"Missing reference picture
\n
"
);
if
(
h
->
default_ref_list
[
list
][
0
].
f
.
data
[
0
])
if
(
h
->
default_ref_list
[
list
][
0
].
f
.
data
[
0
])
...
@@ -305,28 +317,29 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){
...
@@ -305,28 +317,29 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){
return
0
;
return
0
;
}
}
void
ff_h264_fill_mbaff_ref_list
(
H264Context
*
h
){
void
ff_h264_fill_mbaff_ref_list
(
H264Context
*
h
)
{
int
list
,
i
,
j
;
int
list
,
i
,
j
;
for
(
list
=
0
;
list
<
2
;
list
++
)
{
//FIXME try list_count
for
(
list
=
0
;
list
<
2
;
list
++
)
{
//FIXME try list_count
for
(
i
=
0
;
i
<
h
->
ref_count
[
list
];
i
++
)
{
for
(
i
=
0
;
i
<
h
->
ref_count
[
list
];
i
++
)
{
Picture
*
frame
=
&
h
->
ref_list
[
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
);
COPY_PICTURE
(
field
,
frame
);
for
(
j
=
0
;
j
<
3
;
j
++
)
for
(
j
=
0
;
j
<
3
;
j
++
)
field
[
0
].
f
.
linesize
[
j
]
<<=
1
;
field
[
0
].
f
.
linesize
[
j
]
<<=
1
;
field
[
0
].
reference
=
PICT_TOP_FIELD
;
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
);
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
].
f
.
data
[
j
]
+=
frame
->
f
.
linesize
[
j
];
field
[
1
].
reference
=
PICT_BOTTOM_FIELD
;
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
][
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
];
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
++
)
{
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
][
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
->
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){
...
@@ -343,7 +356,8 @@ void ff_h264_fill_mbaff_ref_list(H264Context *h){
* for display purposes) zero if one of the fields remains in
* for display purposes) zero if one of the fields remains in
* reference
* 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
;
int
i
;
if
(
pic
->
reference
&=
refmask
)
{
if
(
pic
->
reference
&=
refmask
)
{
return
0
;
return
0
;
...
@@ -365,14 +379,15 @@ static inline int unreference_pic(H264Context *h, Picture *pic, int refmask){
...
@@ -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
* @return pointer to the found picture, or NULL if no pic with the provided
* frame number is found
* 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
;
int
i
;
for
(
i
=
0
;
i
<
h
->
short_ref_count
;
i
++
)
{
for
(
i
=
0
;
i
<
h
->
short_ref_count
;
i
++
)
{
Picture
*
pic
=
h
->
short_ref
[
i
];
Picture
*
pic
=
h
->
short_ref
[
i
];
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"%d %d %p
\n
"
,
i
,
pic
->
frame_num
,
pic
);
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
;
*
idx
=
i
;
return
pic
;
return
pic
;
}
}
...
@@ -386,28 +401,31 @@ static Picture * find_short(H264Context *h, int frame_num, int *idx){
...
@@ -386,28 +401,31 @@ static Picture * find_short(H264Context *h, int frame_num, int *idx){
* to be valid. Other list entries are shifted down.
* to be valid. Other list entries are shifted down.
* @param i index into h->short_ref of picture to remove.
* @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
);
assert
(
i
>=
0
&&
i
<
h
->
short_ref_count
);
h
->
short_ref
[
i
]
=
NULL
;
h
->
short_ref
[
i
]
=
NULL
;
if
(
--
h
->
short_ref_count
)
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
* @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
;
Picture
*
pic
;
int
i
;
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
);
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
);
pic
=
find_short
(
h
,
frame_num
,
&
i
);
if
(
pic
){
if
(
pic
)
{
if
(
unreference_pic
(
h
,
pic
,
ref_mask
))
if
(
unreference_pic
(
h
,
pic
,
ref_mask
))
remove_short_at_index
(
h
,
i
);
remove_short_at_index
(
h
,
i
);
}
}
return
pic
;
return
pic
;
...
@@ -418,15 +436,16 @@ static Picture * remove_short(H264Context *h, int frame_num, int ref_mask){
...
@@ -418,15 +436,16 @@ static Picture * remove_short(H264Context *h, int frame_num, int ref_mask){
* that list.
* that list.
* @return the removed picture or NULL if an error occurs
* @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
;
Picture
*
pic
;
pic
=
h
->
long_ref
[
i
];
pic
=
h
->
long_ref
[
i
];
if
(
pic
){
if
(
pic
)
{
if
(
unreference_pic
(
h
,
pic
,
ref_mask
))
{
if
(
unreference_pic
(
h
,
pic
,
ref_mask
))
{
assert
(
h
->
long_ref
[
i
]
->
long_ref
==
1
);
assert
(
h
->
long_ref
[
i
]
->
long_ref
==
1
);
h
->
long_ref
[
i
]
->
long_ref
=
0
;
h
->
long_ref
[
i
]
->
long_ref
=
0
;
h
->
long_ref
[
i
]
=
NULL
;
h
->
long_ref
[
i
]
=
NULL
;
h
->
long_ref_count
--
;
h
->
long_ref_count
--
;
}
}
}
}
...
@@ -434,30 +453,32 @@ static Picture * remove_long(H264Context *h, int i, int ref_mask){
...
@@ -434,30 +453,32 @@ static Picture * remove_long(H264Context *h, int i, int ref_mask){
return
pic
;
return
pic
;
}
}
void
ff_h264_remove_all_refs
(
H264Context
*
h
){
void
ff_h264_remove_all_refs
(
H264Context
*
h
)
{
int
i
;
int
i
;
for
(
i
=
0
;
i
<
16
;
i
++
)
{
for
(
i
=
0
;
i
<
16
;
i
++
)
{
remove_long
(
h
,
i
,
0
);
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
);
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
* print short term list
*/
*/
static
void
print_short_term
(
H264Context
*
h
)
{
static
void
print_short_term
(
H264Context
*
h
)
{
uint32_t
i
;
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
"
);
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"short term list:
\n
"
);
for
(
i
=
0
;
i
<
h
->
short_ref_count
;
i
++
)
{
for
(
i
=
0
;
i
<
h
->
short_ref_count
;
i
++
)
{
Picture
*
pic
=
h
->
short_ref
[
i
];
Picture
*
pic
=
h
->
short_ref
[
i
];
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"%d fn:%d poc:%d %p
\n
"
,
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"%d fn:%d poc:%d %p
\n
"
,
i
,
pic
->
frame_num
,
pic
->
poc
,
pic
->
f
.
data
[
0
]);
i
,
pic
->
frame_num
,
pic
->
poc
,
pic
->
f
.
data
[
0
]);
}
}
...
@@ -467,12 +488,13 @@ static void print_short_term(H264Context *h) {
...
@@ -467,12 +488,13 @@ static void print_short_term(H264Context *h) {
/**
/**
* print long term list
* print long term list
*/
*/
static
void
print_long_term
(
H264Context
*
h
)
{
static
void
print_long_term
(
H264Context
*
h
)
{
uint32_t
i
;
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
"
);
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"long term list:
\n
"
);
for
(
i
=
0
;
i
<
16
;
i
++
)
{
for
(
i
=
0
;
i
<
16
;
i
++
)
{
Picture
*
pic
=
h
->
long_ref
[
i
];
Picture
*
pic
=
h
->
long_ref
[
i
];
if
(
pic
)
{
if
(
pic
)
{
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"%d fn:%d poc:%d %p
\n
"
,
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"%d fn:%d poc:%d %p
\n
"
,
i
,
pic
->
frame_num
,
pic
->
poc
,
pic
->
f
.
data
[
0
]);
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)
...
@@ -503,14 +525,14 @@ int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice)
if
(
h
->
short_ref_count
&&
if
(
h
->
short_ref_count
&&
h
->
long_ref_count
+
h
->
short_ref_count
==
h
->
sps
.
ref_frame_count
&&
h
->
long_ref_count
+
h
->
short_ref_count
==
h
->
sps
.
ref_frame_count
&&
!
(
FIELD_PICTURE
&&
!
h
->
first_field
&&
h
->
cur_pic_ptr
->
reference
))
{
!
(
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
[
0
].
short_pic_num
=
h
->
short_ref
[
h
->
short_ref_count
-
1
]
->
frame_num
;
mmco_index
=
1
;
mmco_index
=
1
;
if
(
FIELD_PICTURE
)
{
if
(
FIELD_PICTURE
)
{
mmco
[
0
].
short_pic_num
*=
2
;
mmco
[
0
].
short_pic_num
*=
2
;
mmco
[
1
].
opcode
=
MMCO_SHORT2UNUSED
;
mmco
[
1
].
opcode
=
MMCO_SHORT2UNUSED
;
mmco
[
1
].
short_pic_num
=
mmco
[
0
].
short_pic_num
+
1
;
mmco
[
1
].
short_pic_num
=
mmco
[
0
].
short_pic_num
+
1
;
mmco_index
=
2
;
mmco_index
=
2
;
}
}
}
}
...
@@ -527,26 +549,29 @@ int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice)
...
@@ -527,26 +549,29 @@ int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice)
return
0
;
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
i
,
av_uninit
(
j
);
int
current_ref_assigned
=
0
,
err
=
0
;
int
current_ref_assigned
=
0
,
err
=
0
;
Picture
*
av_uninit
(
pic
);
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
"
);
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
);
int
av_uninit
(
structure
),
av_uninit
(
frame_num
);
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
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
);
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
if
(
mmco
[
i
].
opcode
==
MMCO_SHORT2UNUSED
||
||
mmco
[
i
].
opcode
==
MMCO_SHORT2LONG
)
{
mmco
[
i
].
opcode
==
MMCO_SHORT2LONG
)
{
frame_num
=
pic_num_extract
(
h
,
mmco
[
i
].
short_pic_num
,
&
structure
);
frame_num
=
pic_num_extract
(
h
,
mmco
[
i
].
short_pic_num
,
&
structure
);
pic
=
find_short
(
h
,
frame_num
,
&
j
);
pic
=
find_short
(
h
,
frame_num
,
&
j
);
if
(
!
pic
){
if
(
!
pic
)
{
if
(
mmco
[
i
].
opcode
!=
MMCO_SHORT2LONG
||
!
h
->
long_ref
[
mmco
[
i
].
long_arg
]
if
(
mmco
[
i
].
opcode
!=
MMCO_SHORT2LONG
||
||
h
->
long_ref
[
mmco
[
i
].
long_arg
]
->
frame_num
!=
frame_num
)
{
!
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
"
);
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"mmco: unref short failure
\n
"
);
err
=
AVERROR_INVALIDDATA
;
err
=
AVERROR_INVALIDDATA
;
}
}
...
@@ -554,10 +579,11 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
...
@@ -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
:
case
MMCO_SHORT2UNUSED
:
if
(
h
->
avctx
->
debug
&
FF_DEBUG_MMCO
)
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
);
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
);
remove_short
(
h
,
frame_num
,
structure
^
PICT_FRAME
);
break
;
break
;
case
MMCO_SHORT2LONG
:
case
MMCO_SHORT2LONG
:
...
@@ -565,18 +591,18 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
...
@@ -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_long
(
h
,
mmco
[
i
].
long_arg
,
0
);
remove_short_at_index
(
h
,
j
);
remove_short_at_index
(
h
,
j
);
h
->
long_ref
[
mmco
[
i
].
long_arg
]
=
pic
;
h
->
long_ref
[
mmco
[
i
].
long_arg
]
=
pic
;
if
(
h
->
long_ref
[
mmco
[
i
].
long_arg
])
{
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
]
->
long_ref
=
1
;
h
->
long_ref_count
++
;
h
->
long_ref_count
++
;
}
}
break
;
break
;
case
MMCO_LONG2UNUSED
:
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
];
pic
=
h
->
long_ref
[
j
];
if
(
pic
)
{
if
(
pic
)
{
remove_long
(
h
,
j
,
structure
^
PICT_FRAME
);
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
"
);
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"mmco: unref long failure
\n
"
);
break
;
break
;
case
MMCO_LONG
:
case
MMCO_LONG
:
...
@@ -591,32 +617,31 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
...
@@ -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
)
{
if
(
h
->
long_ref
[
mmco
[
i
].
long_arg
]
!=
h
->
cur_pic_ptr
)
{
remove_long
(
h
,
mmco
[
i
].
long_arg
,
0
);
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
]
=
h
->
cur_pic_ptr
;
h
->
long_ref
[
mmco
[
i
].
long_arg
]
->
long_ref
=
1
;
h
->
long_ref
[
mmco
[
i
].
long_arg
]
->
long_ref
=
1
;
h
->
long_ref_count
++
;
h
->
long_ref_count
++
;
}
}
h
->
cur_pic_ptr
->
reference
|=
h
->
picture_structure
;
h
->
cur_pic_ptr
->
reference
|=
h
->
picture_structure
;
current_ref_assigned
=
1
;
current_ref_assigned
=
1
;
break
;
break
;
case
MMCO_SET_MAX_LONG
:
case
MMCO_SET_MAX_LONG
:
assert
(
mmco
[
i
].
long_arg
<=
16
);
assert
(
mmco
[
i
].
long_arg
<=
16
);
// just remove the long term which index is greater than new max
// 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
);
remove_long
(
h
,
j
,
0
);
}
}
break
;
break
;
case
MMCO_RESET
:
case
MMCO_RESET
:
while
(
h
->
short_ref_count
)
{
while
(
h
->
short_ref_count
)
{
remove_short
(
h
,
h
->
short_ref
[
0
]
->
frame_num
,
0
);
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
);
remove_long
(
h
,
j
,
0
);
}
}
h
->
frame_num
=
h
->
frame_num
=
h
->
cur_pic_ptr
->
frame_num
=
0
;
h
->
cur_pic_ptr
->
frame_num
=
0
;
h
->
mmco_reset
=
1
;
h
->
mmco_reset
=
1
;
h
->
cur_pic_ptr
->
mmco_reset
=
1
;
h
->
cur_pic_ptr
->
mmco_reset
=
1
;
break
;
break
;
default:
assert
(
0
);
default:
assert
(
0
);
}
}
...
@@ -639,23 +664,24 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
...
@@ -639,23 +664,24 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
"(first field is long term)
\n
"
);
"(first field is long term)
\n
"
);
err
=
AVERROR_INVALIDDATA
;
err
=
AVERROR_INVALIDDATA
;
}
else
{
}
else
{
pic
=
remove_short
(
h
,
h
->
cur_pic_ptr
->
frame_num
,
0
);
pic
=
remove_short
(
h
,
h
->
cur_pic_ptr
->
frame_num
,
0
);
if
(
pic
)
{
if
(
pic
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"illegal short term buffer state detected
\n
"
);
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"illegal short term buffer state detected
\n
"
);
err
=
AVERROR_INVALIDDATA
;
err
=
AVERROR_INVALIDDATA
;
}
}
if
(
h
->
short_ref_count
)
if
(
h
->
short_ref_count
)
memmove
(
&
h
->
short_ref
[
1
],
&
h
->
short_ref
[
0
],
h
->
short_ref_count
*
sizeof
(
Picture
*
));
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
->
short_ref_count
++
;
h
->
cur_pic_ptr
->
reference
|=
h
->
picture_structure
;
h
->
cur_pic_ptr
->
reference
|=
h
->
picture_structure
;
}
}
}
}
if
(
h
->
long_ref_count
+
h
->
short_ref_count
-
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
/* We have too many reference frames, probably due to corrupted
* stream. Need to discard one frame. Prevents overrun of the
* 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,
...
@@ -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
;
MMCO
mmco_temp
[
MAX_MMCO_COUNT
],
*
mmco
=
first_slice
?
h
->
mmco
:
mmco_temp
;
int
mmco_index
=
0
;
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
skip_bits1
(
gb
);
// broken_link
if
(
get_bits1
(
gb
)){
if
(
get_bits1
(
gb
))
{
mmco
[
0
].
opcode
=
MMCO_LONG
;
mmco
[
0
].
opcode
=
MMCO_LONG
;
mmco
[
0
].
long_arg
=
0
;
mmco
[
0
].
long_arg
=
0
;
mmco_index
=
1
;
mmco_index
=
1
;
}
}
}
else
{
}
else
{
if
(
get_bits1
(
gb
))
{
// adaptive_ref_pic_marking_mode_flag
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,
...
@@ -705,7 +731,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
MMCOOpcode
opcode
=
get_ue_golomb_31
(
gb
);
MMCOOpcode
opcode
=
get_ue_golomb_31
(
gb
);
mmco
[
i
].
opcode
=
opcode
;
mmco
[
i
].
opcode
=
opcode
;
if
(
opcode
==
MMCO_SHORT2UNUSED
||
opcode
==
MMCO_SHORT2LONG
){
if
(
opcode
==
MMCO_SHORT2UNUSED
||
opcode
==
MMCO_SHORT2LONG
)
{
mmco
[
i
].
short_pic_num
=
mmco
[
i
].
short_pic_num
=
(
h
->
curr_pic_num
-
get_ue_golomb
(
gb
)
-
1
)
&
(
h
->
curr_pic_num
-
get_ue_golomb
(
gb
)
-
1
)
&
(
h
->
max_pic_num
-
1
);
(
h
->
max_pic_num
-
1
);
...
@@ -725,7 +751,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
...
@@ -725,7 +751,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
if
(
long_arg
>=
32
||
if
(
long_arg
>=
32
||
(
long_arg
>=
16
&&
!
(
opcode
==
MMCO_SET_MAX_LONG
&&
(
long_arg
>=
16
&&
!
(
opcode
==
MMCO_SET_MAX_LONG
&&
long_arg
==
16
)
&&
long_arg
==
16
)
&&
!
(
opcode
==
MMCO_LONG2UNUSED
&&
FIELD_PICTURE
))){
!
(
opcode
==
MMCO_LONG2UNUSED
&&
FIELD_PICTURE
)))
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"illegal long ref in memory management control "
"illegal long ref in memory management control "
"operation %d
\n
"
,
opcode
);
"operation %d
\n
"
,
opcode
);
...
@@ -734,7 +760,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
...
@@ -734,7 +760,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
mmco
[
i
].
long_arg
=
long_arg
;
mmco
[
i
].
long_arg
=
long_arg
;
}
}
if
(
opcode
>
(
unsigned
)
MMCO_LONG
){
if
(
opcode
>
(
unsigned
)
MMCO_LONG
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"illegal memory management control operation %d
\n
"
,
"illegal memory management control operation %d
\n
"
,
opcode
);
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