static int get_last_needed_nal(H264Context *h)
{
int nals_needed = 0;
- int i;
- int ret;
+ int first_slice = 0;
+ int i, ret;
for (i = 0; i < h->pkt.nb_nals; i++) {
H2645NAL *nal = &h->pkt.nals[i];
case H264_NAL_DPA:
case H264_NAL_IDR_SLICE:
case H264_NAL_SLICE:
- ret = init_get_bits8(&gb, nal->data + 1, (nal->size - 1));
- if (ret < 0)
- return ret;
+ ret = init_get_bits8(&gb, nal->data + 1, nal->size - 1);
+ if (ret < 0) {
+ av_log(h->avctx, AV_LOG_ERROR, "Invalid zero-sized VCL NAL unit\n");
+ if (h->avctx->err_recognition & AV_EF_EXPLODE)
+ return ret;
+
+ break;
+ }
- if (!get_ue_golomb(&gb))
+ if (!get_ue_golomb_long(&gb) || // first_mb_in_slice
+ !first_slice ||
+ first_slice != nal->type)
nals_needed = i;
+ if (!first_slice)
+ first_slice = nal->type;
}
}