|
|
@@ -2345,24 +2345,24 @@ static int hls_slice_data(HEVCContext *s) |
|
|
|
* @return AVERROR_INVALIDDATA if the packet is not a valid NAL unit, |
|
|
|
* 0 if the unit should be skipped, 1 otherwise |
|
|
|
*/ |
|
|
|
static int hls_nal_unit(HEVCContext *s) |
|
|
|
static int hls_nal_unit(HEVCNAL *nal, AVCodecContext *avctx) |
|
|
|
{ |
|
|
|
GetBitContext *gb = &s->HEVClc.gb; |
|
|
|
GetBitContext *gb = &nal->gb; |
|
|
|
int nuh_layer_id; |
|
|
|
|
|
|
|
if (get_bits1(gb) != 0) |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
s->nal_unit_type = get_bits(gb, 6); |
|
|
|
nal->type = get_bits(gb, 6); |
|
|
|
|
|
|
|
nuh_layer_id = get_bits(gb, 6); |
|
|
|
s->temporal_id = get_bits(gb, 3) - 1; |
|
|
|
if (s->temporal_id < 0) |
|
|
|
nal->temporal_id = get_bits(gb, 3) - 1; |
|
|
|
if (nal->temporal_id < 0) |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
av_log(s->avctx, AV_LOG_DEBUG, |
|
|
|
av_log(avctx, AV_LOG_DEBUG, |
|
|
|
"nal_unit_type: %d, nuh_layer_id: %dtemporal_id: %d\n", |
|
|
|
s->nal_unit_type, nuh_layer_id, s->temporal_id); |
|
|
|
nal->type, nuh_layer_id, nal->temporal_id); |
|
|
|
|
|
|
|
return nuh_layer_id == 0; |
|
|
|
} |
|
|
@@ -2499,11 +2499,9 @@ static int decode_nal_unit(HEVCContext *s, const HEVCNAL *nal) |
|
|
|
GetBitContext *gb = &lc->gb; |
|
|
|
int ctb_addr_ts, ret; |
|
|
|
|
|
|
|
ret = init_get_bits8(gb, nal->data, nal->size); |
|
|
|
if (ret < 0) |
|
|
|
return ret; |
|
|
|
|
|
|
|
hls_nal_unit(s); |
|
|
|
*gb = nal->gb; |
|
|
|
s->nal_unit_type = nal->type; |
|
|
|
s->temporal_id = nal->temporal_id; |
|
|
|
|
|
|
|
switch (s->nal_unit_type) { |
|
|
|
case NAL_VPS: |
|
|
@@ -2700,22 +2698,22 @@ static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length) |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
|
|
|
|
ret = init_get_bits8(&s->HEVClc.gb, nal->data, nal->size); |
|
|
|
ret = init_get_bits8(&nal->gb, nal->data, nal->size); |
|
|
|
if (ret < 0) |
|
|
|
goto fail; |
|
|
|
|
|
|
|
ret = hls_nal_unit(s); |
|
|
|
ret = hls_nal_unit(nal, s->avctx); |
|
|
|
if (ret <= 0) { |
|
|
|
if (ret < 0) { |
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "Invalid NAL unit %d, skipping.\n", |
|
|
|
s->nal_unit_type); |
|
|
|
nal->type); |
|
|
|
} |
|
|
|
s->nb_nals--; |
|
|
|
goto skip_nal; |
|
|
|
} |
|
|
|
|
|
|
|
if (s->nal_unit_type == NAL_EOB_NUT || |
|
|
|
s->nal_unit_type == NAL_EOS_NUT) |
|
|
|
if (nal->type == NAL_EOB_NUT || |
|
|
|
nal->type == NAL_EOS_NUT) |
|
|
|
s->eos = 1; |
|
|
|
|
|
|
|
skip_nal: |
|
|
|