summaryrefslogtreecommitdiffstats
path: root/libavcodec/hevc_parse.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2017-04-02 00:01:20 -0300
committerJames Almer <jamrial@gmail.com>2017-04-09 13:46:33 -0300
commit159ab4625bd3641e79b564335be8069dca881978 (patch)
treeb6037d85f3fcbadeca92da850f47d3de3178f6fb /libavcodec/hevc_parse.c
parentaed84ee4d1b0c9e315a84b1ee0918fa49ee9cc09 (diff)
downloadffmpeg-streaming-159ab4625bd3641e79b564335be8069dca881978.zip
ffmpeg-streaming-159ab4625bd3641e79b564335be8069dca881978.tar.gz
avcodec/hevc_parse: check for parameter set decoding failure
Reviewed-by: nevcairiel Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavcodec/hevc_parse.c')
-rw-r--r--libavcodec/hevc_parse.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/libavcodec/hevc_parse.c b/libavcodec/hevc_parse.c
index 3fe6662..25c44fd 100644
--- a/libavcodec/hevc_parse.c
+++ b/libavcodec/hevc_parse.c
@@ -22,7 +22,8 @@
#include "hevc_parse.h"
static int hevc_decode_nal_units(const uint8_t *buf, int buf_size, HEVCParamSets *ps,
- int is_nalff, int nal_length_size, void *logctx)
+ int is_nalff, int nal_length_size, int err_recognition,
+ void *logctx)
{
int i;
int ret = 0;
@@ -38,9 +39,21 @@ static int hevc_decode_nal_units(const uint8_t *buf, int buf_size, HEVCParamSets
/* ignore everything except parameter sets and VCL NALUs */
switch (nal->type) {
- case HEVC_NAL_VPS: ff_hevc_decode_nal_vps(&nal->gb, logctx, ps); break;
- case HEVC_NAL_SPS: ff_hevc_decode_nal_sps(&nal->gb, logctx, ps, 1); break;
- case HEVC_NAL_PPS: ff_hevc_decode_nal_pps(&nal->gb, logctx, ps); break;
+ case HEVC_NAL_VPS:
+ ret = ff_hevc_decode_nal_vps(&nal->gb, logctx, ps);
+ if (ret < 0)
+ goto done;
+ break;
+ case HEVC_NAL_SPS:
+ ret = ff_hevc_decode_nal_sps(&nal->gb, logctx, ps, 1);
+ if (ret < 0)
+ goto done;
+ break;
+ case HEVC_NAL_PPS:
+ ret = ff_hevc_decode_nal_pps(&nal->gb, logctx, ps);
+ if (ret < 0)
+ goto done;
+ break;
default:
av_log(logctx, AV_LOG_VERBOSE, "Ignoring NAL type %d in extradata\n", nal->type);
break;
@@ -49,7 +62,10 @@ static int hevc_decode_nal_units(const uint8_t *buf, int buf_size, HEVCParamSets
done:
ff_h2645_packet_uninit(&pkt);
- return ret;
+ if (err_recognition & AV_EF_EXPLODE)
+ return ret;
+
+ return 0;
}
int ff_hevc_decode_extradata(const uint8_t *data, int size, HEVCParamSets *ps,
@@ -92,7 +108,8 @@ int ff_hevc_decode_extradata(const uint8_t *data, int size, HEVCParamSets *ps,
return AVERROR_INVALIDDATA;
}
- ret = hevc_decode_nal_units(gb.buffer, nalsize, ps, *is_nalff, *nal_length_size, logctx);
+ ret = hevc_decode_nal_units(gb.buffer, nalsize, ps, *is_nalff, *nal_length_size,
+ err_recognition, logctx);
if (ret < 0) {
av_log(logctx, AV_LOG_ERROR,
"Decoding nal unit %d %d from hvcC failed\n",
@@ -108,7 +125,8 @@ int ff_hevc_decode_extradata(const uint8_t *data, int size, HEVCParamSets *ps,
*nal_length_size = nal_len_size;
} else {
*is_nalff = 0;
- ret = hevc_decode_nal_units(data, size, ps, *is_nalff, *nal_length_size, logctx);
+ ret = hevc_decode_nal_units(data, size, ps, *is_nalff, *nal_length_size,
+ err_recognition, logctx);
if (ret < 0)
return ret;
}
OpenPOWER on IntegriCloud