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
8d0cc8ca
Commit
8d0cc8ca
authored
Mar 21, 2016
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
h264_parser: switch to h2645_parse for NAL unescaping
Remove now unused ff_h264_decode_nal().
parent
f3ed4849
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
28 additions
and
128 deletions
+28
-128
Makefile
libavcodec/Makefile
+1
-1
h264.c
libavcodec/h264.c
+0
-106
h264.h
libavcodec/h264.h
+0
-11
h264_parser.c
libavcodec/h264_parser.c
+27
-10
No files found.
libavcodec/Makefile
View file @
8d0cc8ca
...
@@ -728,7 +728,7 @@ OBJS-$(CONFIG_FLAC_PARSER) += flac_parser.o flacdata.o flac.o
...
@@ -728,7 +728,7 @@ OBJS-$(CONFIG_FLAC_PARSER) += flac_parser.o flacdata.o flac.o
OBJS-$(CONFIG_GSM_PARSER)
+=
gsm_parser.o
OBJS-$(CONFIG_GSM_PARSER)
+=
gsm_parser.o
OBJS-$(CONFIG_H261_PARSER)
+=
h261_parser.o
OBJS-$(CONFIG_H261_PARSER)
+=
h261_parser.o
OBJS-$(CONFIG_H263_PARSER)
+=
h263_parser.o
OBJS-$(CONFIG_H263_PARSER)
+=
h263_parser.o
OBJS-$(CONFIG_H264_PARSER)
+=
h264_parser.o
h264_parse.o
OBJS-$(CONFIG_H264_PARSER)
+=
h264_parser.o
h264_parse.o
h2645_parse.o
OBJS-$(CONFIG_HEVC_PARSER)
+=
hevc_parser.o
h2645_parse.o
hevc_ps.o
hevc_data.o
OBJS-$(CONFIG_HEVC_PARSER)
+=
hevc_parser.o
h2645_parse.o
hevc_ps.o
hevc_data.o
OBJS-$(CONFIG_MJPEG_PARSER)
+=
mjpeg_parser.o
OBJS-$(CONFIG_MJPEG_PARSER)
+=
mjpeg_parser.o
OBJS-$(CONFIG_MLP_PARSER)
+=
mlp_parser.o
mlp.o
OBJS-$(CONFIG_MLP_PARSER)
+=
mlp_parser.o
mlp.o
...
...
libavcodec/h264.c
View file @
8d0cc8ca
...
@@ -116,112 +116,6 @@ void ff_h264_draw_horiz_band(const H264Context *h, H264SliceContext *sl,
...
@@ -116,112 +116,6 @@ void ff_h264_draw_horiz_band(const H264Context *h, H264SliceContext *sl,
}
}
}
}
const
uint8_t
*
ff_h264_decode_nal
(
H264Context
*
h
,
H264SliceContext
*
sl
,
const
uint8_t
*
src
,
int
*
dst_length
,
int
*
consumed
,
int
length
)
{
int
i
,
si
,
di
;
uint8_t
*
dst
;
// src[0]&0x80; // forbidden bit
h
->
nal_ref_idc
=
src
[
0
]
>>
5
;
h
->
nal_unit_type
=
src
[
0
]
&
0x1F
;
src
++
;
length
--
;
#define STARTCODE_TEST \
if (i + 2 < length && src[i + 1] == 0 && src[i + 2] <= 3) { \
if (src[i + 2] != 3) { \
/* startcode, so we must be past the end */
\
length = i; \
} \
break; \
}
#if HAVE_FAST_UNALIGNED
#define FIND_FIRST_ZERO \
if (i > 0 && !src[i]) \
i--; \
while (src[i]) \
i++
#if HAVE_FAST_64BIT
for
(
i
=
0
;
i
+
1
<
length
;
i
+=
9
)
{
if
(
!
((
~
AV_RN64A
(
src
+
i
)
&
(
AV_RN64A
(
src
+
i
)
-
0x0100010001000101ULL
))
&
0x8000800080008080ULL
))
continue
;
FIND_FIRST_ZERO
;
STARTCODE_TEST
;
i
-=
7
;
}
#else
for
(
i
=
0
;
i
+
1
<
length
;
i
+=
5
)
{
if
(
!
((
~
AV_RN32A
(
src
+
i
)
&
(
AV_RN32A
(
src
+
i
)
-
0x01000101U
))
&
0x80008080U
))
continue
;
FIND_FIRST_ZERO
;
STARTCODE_TEST
;
i
-=
3
;
}
#endif
#else
for
(
i
=
0
;
i
+
1
<
length
;
i
+=
2
)
{
if
(
src
[
i
])
continue
;
if
(
i
>
0
&&
src
[
i
-
1
]
==
0
)
i
--
;
STARTCODE_TEST
;
}
#endif
if
(
i
>=
length
-
1
)
{
// no escaped 0
*
dst_length
=
length
;
*
consumed
=
length
+
1
;
// +1 for the header
return
src
;
}
av_fast_malloc
(
&
sl
->
rbsp_buffer
,
&
sl
->
rbsp_buffer_size
,
length
+
AV_INPUT_BUFFER_PADDING_SIZE
);
dst
=
sl
->
rbsp_buffer
;
if
(
!
dst
)
return
NULL
;
memcpy
(
dst
,
src
,
i
);
si
=
di
=
i
;
while
(
si
+
2
<
length
)
{
// remove escapes (very rare 1:2^22)
if
(
src
[
si
+
2
]
>
3
)
{
dst
[
di
++
]
=
src
[
si
++
];
dst
[
di
++
]
=
src
[
si
++
];
}
else
if
(
src
[
si
]
==
0
&&
src
[
si
+
1
]
==
0
)
{
if
(
src
[
si
+
2
]
==
3
)
{
// escape
dst
[
di
++
]
=
0
;
dst
[
di
++
]
=
0
;
si
+=
3
;
continue
;
}
else
// next start code
goto
nsc
;
}
dst
[
di
++
]
=
src
[
si
++
];
}
while
(
si
<
length
)
dst
[
di
++
]
=
src
[
si
++
];
nsc:
memset
(
dst
+
di
,
0
,
AV_INPUT_BUFFER_PADDING_SIZE
);
*
dst_length
=
di
;
*
consumed
=
si
+
1
;
// +1 for the header
/* FIXME store exact number of bits in the getbitcontext
* (it is needed for decoding) */
return
dst
;
}
void
ff_h264_free_tables
(
H264Context
*
h
)
void
ff_h264_free_tables
(
H264Context
*
h
)
{
{
int
i
;
int
i
;
...
...
libavcodec/h264.h
View file @
8d0cc8ca
...
@@ -768,17 +768,6 @@ int ff_h264_get_profile(SPS *sps);
...
@@ -768,17 +768,6 @@ int ff_h264_get_profile(SPS *sps);
*/
*/
int
ff_h264_decode_picture_parameter_set
(
H264Context
*
h
,
int
bit_length
);
int
ff_h264_decode_picture_parameter_set
(
H264Context
*
h
,
int
bit_length
);
/**
* Decode a network abstraction layer unit.
* @param consumed is the number of bytes used as input
* @param length is the length of the array
* @param dst_length is the number of decoded bytes FIXME here
* or a decode rbsp tailing?
* @return decoded bytes, might be src+1 if no escapes
*/
const
uint8_t
*
ff_h264_decode_nal
(
H264Context
*
h
,
H264SliceContext
*
sl
,
const
uint8_t
*
src
,
int
*
dst_length
,
int
*
consumed
,
int
length
);
/**
/**
* Free any data that may have been allocated in the H264 context
* Free any data that may have been allocated in the H264 context
* like SPS, PPS etc.
* like SPS, PPS etc.
...
...
libavcodec/h264_parser.c
View file @
8d0cc8ca
...
@@ -195,11 +195,14 @@ static inline int parse_nal_units(AVCodecParserContext *s,
...
@@ -195,11 +195,14 @@ static inline int parse_nal_units(AVCodecParserContext *s,
H264Context
*
h
=
&
p
->
h
;
H264Context
*
h
=
&
p
->
h
;
H264SliceContext
*
sl
=
&
h
->
slice_ctx
[
0
];
H264SliceContext
*
sl
=
&
h
->
slice_ctx
[
0
];
const
uint8_t
*
buf_end
=
buf
+
buf_size
;
const
uint8_t
*
buf_end
=
buf
+
buf_size
;
H2645NAL
nal
=
{
NULL
};
unsigned
int
pps_id
;
unsigned
int
pps_id
;
unsigned
int
slice_type
;
unsigned
int
slice_type
;
int
state
=
-
1
,
got_reset
=
0
;
int
state
=
-
1
,
got_reset
=
0
;
const
uint8_t
*
ptr
;
int
field_poc
[
2
];
int
field_poc
[
2
];
int
ret
;
/* set some sane default values */
/* set some sane default values */
s
->
pict_type
=
AV_PICTURE_TYPE_I
;
s
->
pict_type
=
AV_PICTURE_TYPE_I
;
...
@@ -213,7 +216,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
...
@@ -213,7 +216,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
return
0
;
return
0
;
for
(;;)
{
for
(;;)
{
int
src_length
,
dst_length
,
consumed
;
int
src_length
,
consumed
;
buf
=
avpriv_find_start_code
(
buf
,
buf_end
,
&
state
);
buf
=
avpriv_find_start_code
(
buf
,
buf_end
,
&
state
);
if
(
buf
>=
buf_end
)
if
(
buf
>=
buf_end
)
break
;
break
;
...
@@ -235,11 +238,22 @@ static inline int parse_nal_units(AVCodecParserContext *s,
...
@@ -235,11 +238,22 @@ static inline int parse_nal_units(AVCodecParserContext *s,
}
}
break
;
break
;
}
}
ptr
=
ff_h264_decode_nal
(
h
,
sl
,
buf
,
&
dst_length
,
&
consumed
,
src_length
);
if
(
!
ptr
||
dst_length
<
0
)
consumed
=
ff_h2645_extract_rbsp
(
buf
,
src_length
,
&
nal
);
if
(
consumed
<
0
)
break
;
break
;
init_get_bits
(
&
h
->
gb
,
ptr
,
8
*
dst_length
);
ret
=
init_get_bits
(
&
nal
.
gb
,
nal
.
data
,
nal
.
size
*
8
);
if
(
ret
<
0
)
goto
fail
;
get_bits1
(
&
nal
.
gb
);
nal
.
ref_idc
=
get_bits
(
&
nal
.
gb
,
2
);
nal
.
type
=
get_bits
(
&
nal
.
gb
,
5
);
h
->
gb
=
nal
.
gb
;
h
->
nal_ref_idc
=
nal
.
ref_idc
;
h
->
nal_unit_type
=
nal
.
type
;
switch
(
h
->
nal_unit_type
)
{
switch
(
h
->
nal_unit_type
)
{
case
NAL_SPS
:
case
NAL_SPS
:
ff_h264_decode_seq_parameter_set
(
h
);
ff_h264_decode_seq_parameter_set
(
h
);
...
@@ -259,7 +273,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
...
@@ -259,7 +273,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
h
->
prev_poc_lsb
=
0
;
h
->
prev_poc_lsb
=
0
;
/* fall through */
/* fall through */
case
NAL_SLICE
:
case
NAL_SLICE
:
init_get_bits
(
&
sl
->
gb
,
ptr
,
8
*
dst_length
)
;
sl
->
gb
=
nal
.
gb
;
get_ue_golomb
(
&
sl
->
gb
);
// skip first_mb_in_slice
get_ue_golomb
(
&
sl
->
gb
);
// skip first_mb_in_slice
slice_type
=
get_ue_golomb_31
(
&
sl
->
gb
);
slice_type
=
get_ue_golomb_31
(
&
sl
->
gb
);
s
->
pict_type
=
ff_h264_golomb_to_pict_type
[
slice_type
%
5
];
s
->
pict_type
=
ff_h264_golomb_to_pict_type
[
slice_type
%
5
];
...
@@ -271,18 +285,18 @@ static inline int parse_nal_units(AVCodecParserContext *s,
...
@@ -271,18 +285,18 @@ static inline int parse_nal_units(AVCodecParserContext *s,
if
(
pps_id
>=
MAX_PPS_COUNT
)
{
if
(
pps_id
>=
MAX_PPS_COUNT
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"pps_id %u out of range
\n
"
,
pps_id
);
"pps_id %u out of range
\n
"
,
pps_id
);
return
-
1
;
goto
fail
;
}
}
if
(
!
h
->
pps_buffers
[
pps_id
])
{
if
(
!
h
->
pps_buffers
[
pps_id
])
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"non-existing PPS %u referenced
\n
"
,
pps_id
);
"non-existing PPS %u referenced
\n
"
,
pps_id
);
return
-
1
;
goto
fail
;
}
}
h
->
pps
=
*
h
->
pps_buffers
[
pps_id
];
h
->
pps
=
*
h
->
pps_buffers
[
pps_id
];
if
(
!
h
->
sps_buffers
[
h
->
pps
.
sps_id
])
{
if
(
!
h
->
sps_buffers
[
h
->
pps
.
sps_id
])
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"non-existing SPS %u referenced
\n
"
,
h
->
pps
.
sps_id
);
"non-existing SPS %u referenced
\n
"
,
h
->
pps
.
sps_id
);
return
-
1
;
goto
fail
;
}
}
h
->
sps
=
*
h
->
sps_buffers
[
h
->
pps
.
sps_id
];
h
->
sps
=
*
h
->
sps_buffers
[
h
->
pps
.
sps_id
];
h
->
frame_num
=
get_bits
(
&
sl
->
gb
,
h
->
sps
.
log2_max_frame_num
);
h
->
frame_num
=
get_bits
(
&
sl
->
gb
,
h
->
sps
.
log2_max_frame_num
);
...
@@ -360,7 +374,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
...
@@ -360,7 +374,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
if
(
h
->
nal_ref_idc
&&
h
->
nal_unit_type
!=
NAL_IDR_SLICE
)
{
if
(
h
->
nal_ref_idc
&&
h
->
nal_unit_type
!=
NAL_IDR_SLICE
)
{
got_reset
=
scan_mmco_reset
(
s
);
got_reset
=
scan_mmco_reset
(
s
);
if
(
got_reset
<
0
)
if
(
got_reset
<
0
)
return
got_reset
;
goto
fail
;
}
}
/* Set up the prev_ values for decoding POC of the next picture. */
/* Set up the prev_ values for decoding POC of the next picture. */
...
@@ -438,12 +452,15 @@ static inline int parse_nal_units(AVCodecParserContext *s,
...
@@ -438,12 +452,15 @@ static inline int parse_nal_units(AVCodecParserContext *s,
s
->
field_order
=
AV_FIELD_UNKNOWN
;
s
->
field_order
=
AV_FIELD_UNKNOWN
;
}
}
av_freep
(
&
nal
.
rbsp_buffer
);
return
0
;
/* no need to evaluate the rest */
return
0
;
/* no need to evaluate the rest */
}
}
buf
+=
consumed
;
buf
+=
consumed
;
}
}
/* didn't find a picture! */
/* didn't find a picture! */
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"missing picture in access unit
\n
"
);
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"missing picture in access unit
\n
"
);
fail:
av_freep
(
&
nal
.
rbsp_buffer
);
return
-
1
;
return
-
1
;
}
}
...
...
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