diff options
author | Anton Khirnov <anton@khirnov.net> | 2015-07-09 18:11:44 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2015-07-12 18:15:39 +0200 |
commit | ae05b4865514fd71b5e9431e93aa0d03d7ba7751 (patch) | |
tree | 7f8f603e547d85f5f198172dc835041c563782b6 /libavcodec/hevc.c | |
parent | d7bebe4805193783f0b6f292f9127a75709fb7d9 (diff) | |
download | ffmpeg-ae05b4865514fd71b5e9431e93aa0d03d7ba7751.tar.gz |
hevc: eliminate the second call to hls_nal_unit()
Also, make hls_nal_unit() work only on the provided NAL unit, without
requiring a whole decoding context.
This will allow splitting this code for reuse by the parser.
Diffstat (limited to 'libavcodec/hevc.c')
-rw-r--r-- | libavcodec/hevc.c | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c index 7080d00eb8..c46d44c51a 100644 --- a/libavcodec/hevc.c +++ b/libavcodec/hevc.c @@ -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: |