Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
GSoC
GSoC2018
macOS
vlc
Commits
143ae28f
Commit
143ae28f
authored
Mar 29, 2017
by
François Cartegnie
🤞
Browse files
packetizer: hevc: use helper to get pps/sps/vps
parent
a7db3f04
Changes
3
Hide whitespace changes
Inline
Side-by-side
modules/packetizer/hevc.c
View file @
143ae28f
...
...
@@ -402,6 +402,19 @@ static bool XPSReady(decoder_sys_t *p_sys)
return
false
;
}
static
void
GetXPSSet
(
uint8_t
i_pps_id
,
void
*
priv
,
hevc_picture_parameter_set_t
**
pp_pps
,
hevc_sequence_parameter_set_t
**
pp_sps
,
hevc_video_parameter_set_t
**
pp_vps
)
{
decoder_sys_t
*
p_sys
=
priv
;
*
pp_sps
=
NULL
;
*
pp_vps
=
NULL
;
if
((
*
pp_pps
=
p_sys
->
rgi_p_decpps
[
i_pps_id
]))
if
((
*
pp_sps
=
p_sys
->
rgi_p_decsps
[
hevc_get_pps_sps_id
(
*
pp_pps
)]))
*
pp_vps
=
p_sys
->
rgi_p_decvps
[
hevc_get_sps_vps_id
(
*
pp_sps
)];
}
static
block_t
*
ParseVCL
(
decoder_t
*
p_dec
,
uint8_t
i_nal_type
,
block_t
*
p_frag
)
{
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
...
...
@@ -440,7 +453,7 @@ static block_t *ParseVCL(decoder_t *p_dec, uint8_t i_nal_type, block_t *p_frag)
default:
{
hevc_slice_segment_header_t
*
p_sli
=
hevc_decode_slice_header
(
p_buffer
,
i_buffer
,
true
,
p_sys
->
rgi_p_decsps
,
p_sys
->
rgi_p_decpp
s
);
GetXPSSet
,
p_sy
s
);
if
(
p_sli
)
{
enum
hevc_slice_type_e
type
;
...
...
modules/packetizer/hevc_nal.c
View file @
143ae28f
...
...
@@ -1008,6 +1008,11 @@ uint8_t hevc_get_pps_sps_id( const hevc_picture_parameter_set_t *p_pps )
return
p_pps
->
pps_seq_parameter_set_id
;
}
uint8_t
hevc_get_slice_pps_id
(
const
hevc_slice_segment_header_t
*
p_slice
)
{
return
p_slice
->
slice_pic_parameter_set_id
;
}
bool
hevc_get_sps_profile_tier_level
(
const
hevc_sequence_parameter_set_t
*
p_sps
,
uint8_t
*
pi_profile
,
uint8_t
*
pi_level
)
{
...
...
@@ -1093,10 +1098,14 @@ bool hevc_get_colorimetry( const hevc_sequence_parameter_set_t *p_sps,
static
bool
hevc_parse_slice_segment_header_rbsp
(
bs_t
*
p_bs
,
uint8_t
i_nal_type
,
hevc_sequence_parameter_set_t
**
pp_s
ps
,
hevc_picture_parameter_set_t
**
pp_pps
,
pf_get_matchedxps
get_matchedx
ps
,
void
*
priv
,
hevc_slice_segment_header_t
*
p_sl
)
{
hevc_sequence_parameter_set_t
*
p_sps
;
hevc_picture_parameter_set_t
*
p_pps
;
hevc_video_parameter_set_t
*
p_vps
;
if
(
bs_remain
(
p_bs
)
<
3
)
return
false
;
...
...
@@ -1107,8 +1116,8 @@ static bool hevc_parse_slice_segment_header_rbsp( bs_t *p_bs,
if
(
p_sl
->
slice_pic_parameter_set_id
>
HEVC_PPS_ID_MAX
||
bs_remain
(
p_bs
)
<
1
)
return
false
;
const
hevc_picture_parameter_set_t
*
p_pps
=
pp_pps
[
p_sl
->
slice_pic_parameter_set_id
]
;
if
(
!
p_pps
)
get_matchedxps
(
p_sl
->
slice_pic_parameter_set_id
,
priv
,
&
p_pps
,
&
p_sps
,
&
p_vps
)
;
if
(
!
p_sps
||
!
p_pps
)
return
false
;
if
(
!
p_sl
->
first_slice_segment_in_pic_flag
)
...
...
@@ -1116,7 +1125,6 @@ static bool hevc_parse_slice_segment_header_rbsp( bs_t *p_bs,
if
(
p_pps
->
dependent_slice_segments_enabled_flag
)
p_sl
->
dependent_slice_segment_flag
=
bs_read1
(
p_bs
);
const
hevc_sequence_parameter_set_t
*
p_sps
=
pp_sps
[
p_pps
->
pps_seq_parameter_set_id
];
if
(
!
p_sps
)
return
false
;
...
...
@@ -1165,12 +1173,8 @@ void hevc_rbsp_release_slice_header( hevc_slice_segment_header_t *p_sh )
}
hevc_slice_segment_header_t
*
hevc_decode_slice_header
(
const
uint8_t
*
p_buf
,
size_t
i_buf
,
bool
b_escaped
,
hevc_sequence_parameter_set_t
**
pp_sps
,
hevc_picture_parameter_set_t
**
pp_pps
)
pf_get_matchedxps
get_matchedxps
,
void
*
priv
)
{
if
(
!
pp_sps
||
!
pp_pps
)
return
NULL
;
hevc_slice_segment_header_t
*
p_sh
=
calloc
(
1
,
sizeof
(
hevc_slice_segment_header_t
));
if
(
likely
(
p_sh
))
{
...
...
@@ -1188,7 +1192,7 @@ hevc_slice_segment_header_t * hevc_decode_slice_header( const uint8_t *p_buf, si
uint8_t
i_nuh_layer_id
=
bs_read
(
&
bs
,
6
);
bs_skip
(
&
bs
,
3
);
/* !nal_unit_header */
if
(
i_nuh_layer_id
>
62
||
!
hevc_parse_slice_segment_header_rbsp
(
&
bs
,
i_nal_type
,
pp_sps
,
pp_pps
,
p_sh
)
)
!
hevc_parse_slice_segment_header_rbsp
(
&
bs
,
i_nal_type
,
get_matchedxps
,
priv
,
p_sh
)
)
{
hevc_rbsp_release_slice_header
(
p_sh
);
p_sh
=
NULL
;
...
...
modules/packetizer/hevc_nal.h
View file @
143ae28f
...
...
@@ -157,9 +157,13 @@ typedef struct hevc_slice_segment_header_t hevc_slice_segment_header_t;
hevc_video_parameter_set_t
*
hevc_decode_vps
(
const
uint8_t
*
,
size_t
,
bool
);
hevc_sequence_parameter_set_t
*
hevc_decode_sps
(
const
uint8_t
*
,
size_t
,
bool
);
hevc_picture_parameter_set_t
*
hevc_decode_pps
(
const
uint8_t
*
,
size_t
,
bool
);
typedef
void
(
*
pf_get_matchedxps
)(
uint8_t
i_pps_id
,
void
*
priv
,
hevc_picture_parameter_set_t
**
,
hevc_sequence_parameter_set_t
**
,
hevc_video_parameter_set_t
**
);
hevc_slice_segment_header_t
*
hevc_decode_slice_header
(
const
uint8_t
*
,
size_t
,
bool
,
hevc_sequence_parameter_set_t
**
pp_sps
/* HEVC_MAX_SPS */
,
hevc_picture_parameter_set_t
**
pp_pps
/* HEVC_MAX_PPS */
);
pf_get_matchedxps
,
void
*
priv
);
void
hevc_rbsp_release_vps
(
hevc_video_parameter_set_t
*
);
void
hevc_rbsp_release_sps
(
hevc_sequence_parameter_set_t
*
);
...
...
@@ -169,6 +173,7 @@ void hevc_rbsp_release_slice_header( hevc_slice_segment_header_t * );
/* set specific */
uint8_t
hevc_get_sps_vps_id
(
const
hevc_sequence_parameter_set_t
*
);
uint8_t
hevc_get_pps_sps_id
(
const
hevc_picture_parameter_set_t
*
);
uint8_t
hevc_get_slice_pps_id
(
const
hevc_slice_segment_header_t
*
);
/* Converts HEVCDecoderConfigurationRecord to Annex B format */
uint8_t
*
hevc_hvcC_to_AnnexB_NAL
(
const
uint8_t
*
p_buf
,
size_t
i_buf
,
...
...
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