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
e10fd08a
Commit
e10fd08a
authored
Apr 05, 2014
by
Luca Barbato
Committed by
Janne Grunau
Apr 06, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
h264: Refactor decode_nal_units
parent
c389a804
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
122 additions
and
59 deletions
+122
-59
h264.c
libavcodec/h264.c
+122
-59
No files found.
libavcodec/h264.c
View file @
e10fd08a
...
@@ -1281,6 +1281,116 @@ int ff_set_ref_count(H264Context *h)
...
@@ -1281,6 +1281,116 @@ int ff_set_ref_count(H264Context *h)
return
0
;
return
0
;
}
}
static
int
find_start_code
(
const
uint8_t
*
buf
,
int
buf_size
,
int
buf_index
,
int
next_avc
)
{
// start code prefix search
for
(;
buf_index
+
3
<
next_avc
;
buf_index
++
)
// This should always succeed in the first iteration.
if
(
buf
[
buf_index
]
==
0
&&
buf
[
buf_index
+
1
]
==
0
&&
buf
[
buf_index
+
2
]
==
1
)
break
;
if
(
buf_index
+
3
>=
buf_size
)
return
buf_size
;
return
buf_index
+
3
;
}
static
int
get_avc_nalsize
(
H264Context
*
h
,
const
uint8_t
*
buf
,
int
buf_size
,
int
*
buf_index
)
{
int
i
,
nalsize
=
0
;
if
(
*
buf_index
>=
buf_size
-
h
->
nal_length_size
)
return
-
1
;
for
(
i
=
0
;
i
<
h
->
nal_length_size
;
i
++
)
nalsize
=
(
nalsize
<<
8
)
|
buf
[(
*
buf_index
)
++
];
if
(
nalsize
<=
0
||
nalsize
>
buf_size
-
*
buf_index
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"AVC: nal size %d
\n
"
,
nalsize
);
return
-
1
;
}
return
nalsize
;
}
static
int
get_bit_length
(
H264Context
*
h
,
const
uint8_t
*
buf
,
const
uint8_t
*
ptr
,
int
dst_length
,
int
i
,
int
next_avc
)
{
if
((
h
->
workaround_bugs
&
FF_BUG_AUTODETECT
)
&&
i
+
3
<
next_avc
&&
buf
[
i
]
==
0x00
&&
buf
[
i
+
1
]
==
0x00
&&
buf
[
i
+
2
]
==
0x01
&&
buf
[
i
+
3
]
==
0xE0
)
h
->
workaround_bugs
|=
FF_BUG_TRUNCATED
;
if
(
!
(
h
->
workaround_bugs
&
FF_BUG_TRUNCATED
))
while
(
dst_length
>
0
&&
ptr
[
dst_length
-
1
]
==
0
)
dst_length
--
;
if
(
!
dst_length
)
return
0
;
return
8
*
dst_length
-
decode_rbsp_trailing
(
h
,
ptr
+
dst_length
-
1
);
}
static
int
get_last_needed_nal
(
H264Context
*
h
,
const
uint8_t
*
buf
,
int
buf_size
)
{
int
next_avc
=
h
->
is_avc
?
0
:
buf_size
;
int
nal_index
=
0
;
int
buf_index
=
0
;
int
nals_needed
=
0
;
while
(
1
)
{
int
nalsize
=
0
;
int
dst_length
,
bit_length
,
consumed
;
const
uint8_t
*
ptr
;
if
(
buf_index
>=
next_avc
)
{
nalsize
=
get_avc_nalsize
(
h
,
buf
,
buf_size
,
&
buf_index
);
if
(
nalsize
<
0
)
break
;
next_avc
=
buf_index
+
nalsize
;
}
else
{
buf_index
=
find_start_code
(
buf
,
buf_size
,
buf_index
,
next_avc
);
if
(
buf_index
>=
buf_size
)
break
;
}
ptr
=
ff_h264_decode_nal
(
h
,
buf
+
buf_index
,
&
dst_length
,
&
consumed
,
next_avc
-
buf_index
);
if
(
ptr
==
NULL
||
dst_length
<
0
)
return
AVERROR_INVALIDDATA
;
buf_index
+=
consumed
;
bit_length
=
get_bit_length
(
h
,
buf
,
ptr
,
dst_length
,
buf_index
,
next_avc
);
nal_index
++
;
/* packets can sometimes contain multiple PPS/SPS,
* e.g. two PAFF field pictures in one packet, or a demuxer
* which splits NALs strangely if so, when frame threading we
* can't start the next thread until we've read all of them */
switch
(
h
->
nal_unit_type
)
{
case
NAL_SPS
:
case
NAL_PPS
:
nals_needed
=
nal_index
;
break
;
case
NAL_DPA
:
case
NAL_IDR_SLICE
:
case
NAL_SLICE
:
init_get_bits
(
&
h
->
gb
,
ptr
,
bit_length
);
if
(
!
get_ue_golomb
(
&
h
->
gb
))
nals_needed
=
nal_index
;
}
}
return
nals_needed
;
}
static
int
decode_nal_units
(
H264Context
*
h
,
const
uint8_t
*
buf
,
int
buf_size
,
static
int
decode_nal_units
(
H264Context
*
h
,
const
uint8_t
*
buf
,
int
buf_size
,
int
parse_extradata
)
int
parse_extradata
)
{
{
...
@@ -1289,7 +1399,6 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size,
...
@@ -1289,7 +1399,6 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size,
int
buf_index
;
int
buf_index
;
unsigned
context_count
;
unsigned
context_count
;
int
next_avc
;
int
next_avc
;
int
pass
=
!
(
avctx
->
active_thread_type
&
FF_THREAD_FRAME
);
int
nals_needed
=
0
;
///< number of NALs that need decoding before the next frame thread starts
int
nals_needed
=
0
;
///< number of NALs that need decoding before the next frame thread starts
int
nal_index
;
int
nal_index
;
int
ret
=
0
;
int
ret
=
0
;
...
@@ -1302,7 +1411,10 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size,
...
@@ -1302,7 +1411,10 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size,
ff_h264_reset_sei
(
h
);
ff_h264_reset_sei
(
h
);
}
}
for
(;
pass
<=
1
;
pass
++
)
{
if
(
avctx
->
active_thread_type
&
FF_THREAD_FRAME
)
nals_needed
=
get_last_needed_nal
(
h
,
buf
,
buf_size
);
{
buf_index
=
0
;
buf_index
=
0
;
context_count
=
0
;
context_count
=
0
;
next_avc
=
h
->
is_avc
?
0
:
buf_size
;
next_avc
=
h
->
is_avc
?
0
:
buf_size
;
...
@@ -1312,38 +1424,18 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size,
...
@@ -1312,38 +1424,18 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size,
int
dst_length
;
int
dst_length
;
int
bit_length
;
int
bit_length
;
const
uint8_t
*
ptr
;
const
uint8_t
*
ptr
;
int
i
,
nalsize
=
0
;
int
nalsize
=
0
;
int
err
;
int
err
;
if
(
buf_index
>=
next_avc
)
{
if
(
buf_index
>=
next_avc
)
{
if
(
buf_index
>=
buf_size
-
h
->
nal_length_size
)
nalsize
=
get_avc_nalsize
(
h
,
buf
,
buf_size
,
&
buf_index
);
break
;
if
(
nalsize
<
0
)
nalsize
=
0
;
for
(
i
=
0
;
i
<
h
->
nal_length_size
;
i
++
)
nalsize
=
(
nalsize
<<
8
)
|
buf
[
buf_index
++
];
if
(
nalsize
<=
0
||
nalsize
>
buf_size
-
buf_index
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"AVC: nal size %d
\n
"
,
nalsize
);
break
;
break
;
}
next_avc
=
buf_index
+
nalsize
;
next_avc
=
buf_index
+
nalsize
;
}
else
{
}
else
{
// start code prefix search
buf_index
=
find_start_code
(
buf
,
buf_size
,
buf_index
,
next_avc
);
for
(;
buf_index
+
3
<
next_avc
;
buf_index
++
)
if
(
buf_index
>=
buf_size
)
// This should always succeed in the first iteration.
if
(
buf
[
buf_index
]
==
0
&&
buf
[
buf_index
+
1
]
==
0
&&
buf
[
buf_index
+
2
]
==
1
)
break
;
if
(
buf_index
+
3
>=
buf_size
)
{
buf_index
=
buf_size
;
break
;
break
;
}
buf_index
+=
3
;
if
(
buf_index
>=
next_avc
)
continue
;
}
}
hx
=
h
->
thread_context
[
context_count
];
hx
=
h
->
thread_context
[
context_count
];
...
@@ -1354,18 +1446,9 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size,
...
@@ -1354,18 +1446,9 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size,
ret
=
-
1
;
ret
=
-
1
;
goto
end
;
goto
end
;
}
}
i
=
buf_index
+
consumed
;
if
((
h
->
workaround_bugs
&
FF_BUG_AUTODETECT
)
&&
i
+
3
<
next_avc
&&
bit_length
=
get_bit_length
(
h
,
buf
,
ptr
,
dst_length
,
buf
[
i
]
==
0x00
&&
buf
[
i
+
1
]
==
0x00
&&
buf_index
+
consumed
,
next_avc
);
buf
[
i
+
2
]
==
0x01
&&
buf
[
i
+
3
]
==
0xE0
)
h
->
workaround_bugs
|=
FF_BUG_TRUNCATED
;
if
(
!
(
h
->
workaround_bugs
&
FF_BUG_TRUNCATED
))
while
(
dst_length
>
0
&&
ptr
[
dst_length
-
1
]
==
0
)
dst_length
--
;
bit_length
=
!
dst_length
?
0
:
(
8
*
dst_length
-
decode_rbsp_trailing
(
h
,
ptr
+
dst_length
-
1
));
if
(
h
->
avctx
->
debug
&
FF_DEBUG_STARTCODE
)
if
(
h
->
avctx
->
debug
&
FF_DEBUG_STARTCODE
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
...
@@ -1380,26 +1463,6 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size,
...
@@ -1380,26 +1463,6 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size,
buf_index
+=
consumed
;
buf_index
+=
consumed
;
nal_index
++
;
nal_index
++
;
if
(
pass
==
0
)
{
/* packets can sometimes contain multiple PPS/SPS,
* e.g. two PAFF field pictures in one packet, or a demuxer
* which splits NALs strangely if so, when frame threading we
* can't start the next thread until we've read all of them */
switch
(
hx
->
nal_unit_type
)
{
case
NAL_SPS
:
case
NAL_PPS
:
nals_needed
=
nal_index
;
break
;
case
NAL_DPA
:
case
NAL_IDR_SLICE
:
case
NAL_SLICE
:
init_get_bits
(
&
hx
->
gb
,
ptr
,
bit_length
);
if
(
!
get_ue_golomb
(
&
hx
->
gb
))
nals_needed
=
nal_index
;
}
continue
;
}
if
(
avctx
->
skip_frame
>=
AVDISCARD_NONREF
&&
if
(
avctx
->
skip_frame
>=
AVDISCARD_NONREF
&&
h
->
nal_ref_idc
==
0
&&
h
->
nal_ref_idc
==
0
&&
h
->
nal_unit_type
!=
NAL_SEI
)
h
->
nal_unit_type
!=
NAL_SEI
)
...
...
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