avcodec/hevc_parser: Treat extradata parsing differently, as it should not contain an AU

Fixes ticket4718

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
Michael Niedermayer 2015-07-19 02:50:06 +02:00
parent bd48764532
commit 54882156dd
1 changed files with 16 additions and 2 deletions

View File

@ -115,7 +115,13 @@ static int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf,
case NAL_RADL_N: case NAL_RADL_N:
case NAL_RADL_R: case NAL_RADL_R:
case NAL_RASL_N: case NAL_RASL_N:
case NAL_RASL_R: hevc_parse_slice_header(s, nal, avctx); break; case NAL_RASL_R:
if (buf == avctx->extradata) {
av_log(avctx, AV_LOG_ERROR, "Invalid NAL unit: %d\n", nal->type);
return AVERROR_INVALIDDATA;
}
hevc_parse_slice_header(s, nal, avctx);
break;
} }
} }
@ -187,6 +193,7 @@ static inline int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf,
const uint8_t *buf_end = buf + buf_size; const uint8_t *buf_end = buf + buf_size;
int state = -1, i; int state = -1, i;
HEVCNAL *nal; HEVCNAL *nal;
int is_global = buf == avctx->extradata;
if (!h->HEVClc) if (!h->HEVClc)
h->HEVClc = av_mallocz(sizeof(HEVCLocalContext)); h->HEVClc = av_mallocz(sizeof(HEVCLocalContext));
@ -266,6 +273,12 @@ static inline int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf,
case NAL_IDR_W_RADL: case NAL_IDR_W_RADL:
case NAL_IDR_N_LP: case NAL_IDR_N_LP:
case NAL_CRA_NUT: case NAL_CRA_NUT:
if (is_global) {
av_log(avctx, AV_LOG_ERROR, "Invalid NAL unit: %d\n", h->nal_unit_type);
return AVERROR_INVALIDDATA;
}
sh->first_slice_in_pic_flag = get_bits1(gb); sh->first_slice_in_pic_flag = get_bits1(gb);
s->picture_structure = h->picture_struct; s->picture_structure = h->picture_struct;
s->field_order = h->picture_struct; s->field_order = h->picture_struct;
@ -354,7 +367,8 @@ static inline int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf,
buf += consumed; buf += consumed;
} }
/* didn't find a picture! */ /* didn't find a picture! */
av_log(h->avctx, AV_LOG_ERROR, "missing picture in access unit\n"); if (!is_global)
av_log(h->avctx, AV_LOG_ERROR, "missing picture in access unit\n");
return -1; return -1;
} }
#endif #endif