You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
hevc: Allow parsing external extradata buffers
This commit is contained in:
@@ -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)
|
|||||||
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)
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user