hevc: eliminate the second call to hls_nal_unit()
authorAnton Khirnov <anton@khirnov.net>
Thu, 9 Jul 2015 16:11:44 +0000 (18:11 +0200)
committerAnton Khirnov <anton@khirnov.net>
Sun, 12 Jul 2015 16:15:39 +0000 (18:15 +0200)
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.

libavcodec/hevc.c
libavcodec/hevc.h

index 7080d00..c46d44c 100644 (file)
@@ -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
  */
  * @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;
 
     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);
 
     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;
 
         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",
            "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;
 }
 
     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;
 
     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:
 
     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;
         }
 
             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;
 
         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",
         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;
         }
 
             }
             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:
             s->eos = 1;
 
 skip_nal:
index 32c9dc3..41b88db 100644 (file)
@@ -711,6 +711,11 @@ typedef struct HEVCNAL {
 
     int raw_size;
     const uint8_t *raw_data;
 
     int raw_size;
     const uint8_t *raw_data;
+
+    GetBitContext gb;
+
+    enum NALUnitType type;
+    int temporal_id;
 } HEVCNAL;
 
 struct HEVCContext;
 } HEVCNAL;
 
 struct HEVCContext;