Commit 46fae40d authored by Vittorio Giovara's avatar Vittorio Giovara

hevc: Allow parsing external extradata buffers

parent 059a786c
...@@ -2973,17 +2973,15 @@ static int verify_md5(HEVCContext *s, AVFrame *frame) ...@@ -2973,17 +2973,15 @@ static int verify_md5(HEVCContext *s, AVFrame *frame)
return 0; return 0;
} }
static int hevc_decode_extradata(HEVCContext *s) static int hevc_decode_extradata(HEVCContext *s, uint8_t *buf, int length)
{ {
AVCodecContext *avctx = s->avctx; AVCodecContext *avctx = s->avctx;
GetByteContext gb; GetByteContext gb;
int ret, i; int ret, i;
bytestream2_init(&gb, avctx->extradata, avctx->extradata_size); bytestream2_init(&gb, buf, length);
if (avctx->extradata_size > 3 && if (length > 3 && (buf[0] || buf[1] || buf[2] > 1)) {
(avctx->extradata[0] || avctx->extradata[1] ||
avctx->extradata[2] > 1)) {
/* It seems the extradata is encoded as hvcC format. /* It seems the extradata is encoded as hvcC format.
* Temporarily, we support configurationVersion==0 until 14496-15 3rd * Temporarily, we support configurationVersion==0 until 14496-15 3rd
* is finalized. When finalized, configurationVersion will be 1 and we * is finalized. When finalized, configurationVersion will be 1 and we
...@@ -3030,7 +3028,7 @@ static int hevc_decode_extradata(HEVCContext *s) ...@@ -3030,7 +3028,7 @@ static int hevc_decode_extradata(HEVCContext *s)
s->nal_length_size = nal_len_size; s->nal_length_size = nal_len_size;
} else { } else {
s->is_nalff = 0; s->is_nalff = 0;
ret = decode_nal_units(s, avctx->extradata, avctx->extradata_size); ret = decode_nal_units(s, buf, length);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
...@@ -3338,7 +3336,7 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx) ...@@ -3338,7 +3336,7 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx)
s->threads_number = 1; s->threads_number = 1;
if (avctx->extradata_size > 0 && avctx->extradata) { if (avctx->extradata_size > 0 && avctx->extradata) {
ret = hevc_decode_extradata(s); ret = hevc_decode_extradata(s, avctx->extradata, avctx->extradata_size);
if (ret < 0) { if (ret < 0) {
hevc_decode_free(avctx); hevc_decode_free(avctx);
return ret; return ret;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment