Commit a5f5b8b9 authored by wm4's avatar wm4

lavc: factor apply_param_change() AV_EF_EXPLODE handling

Remove the duplicated code for handling failure of apply_param_change().
parent f099cb2f
...@@ -2032,7 +2032,8 @@ static int apply_param_change(AVCodecContext *avctx, AVPacket *avpkt) ...@@ -2032,7 +2032,8 @@ static int apply_param_change(AVCodecContext *avctx, AVPacket *avpkt)
if (!(avctx->codec->capabilities & AV_CODEC_CAP_PARAM_CHANGE)) { if (!(avctx->codec->capabilities & AV_CODEC_CAP_PARAM_CHANGE)) {
av_log(avctx, AV_LOG_ERROR, "This decoder does not support parameter " av_log(avctx, AV_LOG_ERROR, "This decoder does not support parameter "
"changes, but PARAM_CHANGE side data was sent to it.\n"); "changes, but PARAM_CHANGE side data was sent to it.\n");
return AVERROR(EINVAL); ret = AVERROR(EINVAL);
goto fail2;
} }
if (size < 4) if (size < 4)
...@@ -2047,7 +2048,8 @@ static int apply_param_change(AVCodecContext *avctx, AVPacket *avpkt) ...@@ -2047,7 +2048,8 @@ static int apply_param_change(AVCodecContext *avctx, AVPacket *avpkt)
val = bytestream_get_le32(&data); val = bytestream_get_le32(&data);
if (val <= 0 || val > INT_MAX) { if (val <= 0 || val > INT_MAX) {
av_log(avctx, AV_LOG_ERROR, "Invalid channel count"); av_log(avctx, AV_LOG_ERROR, "Invalid channel count");
return AVERROR_INVALIDDATA; ret = AVERROR_INVALIDDATA;
goto fail2;
} }
avctx->channels = val; avctx->channels = val;
size -= 4; size -= 4;
...@@ -2064,7 +2066,8 @@ static int apply_param_change(AVCodecContext *avctx, AVPacket *avpkt) ...@@ -2064,7 +2066,8 @@ static int apply_param_change(AVCodecContext *avctx, AVPacket *avpkt)
val = bytestream_get_le32(&data); val = bytestream_get_le32(&data);
if (val <= 0 || val > INT_MAX) { if (val <= 0 || val > INT_MAX) {
av_log(avctx, AV_LOG_ERROR, "Invalid sample rate"); av_log(avctx, AV_LOG_ERROR, "Invalid sample rate");
return AVERROR_INVALIDDATA; ret = AVERROR_INVALIDDATA;
goto fail2;
} }
avctx->sample_rate = val; avctx->sample_rate = val;
size -= 4; size -= 4;
...@@ -2077,13 +2080,20 @@ static int apply_param_change(AVCodecContext *avctx, AVPacket *avpkt) ...@@ -2077,13 +2080,20 @@ static int apply_param_change(AVCodecContext *avctx, AVPacket *avpkt)
size -= 8; size -= 8;
ret = ff_set_dimensions(avctx, avctx->width, avctx->height); ret = ff_set_dimensions(avctx, avctx->width, avctx->height);
if (ret < 0) if (ret < 0)
return ret; goto fail2;
} }
return 0; return 0;
fail: fail:
av_log(avctx, AV_LOG_ERROR, "PARAM_CHANGE side data too small.\n"); av_log(avctx, AV_LOG_ERROR, "PARAM_CHANGE side data too small.\n");
return AVERROR_INVALIDDATA; ret = AVERROR_INVALIDDATA;
fail2:
if (ret < 0) {
av_log(avctx, AV_LOG_ERROR, "Error applying parameter changes.\n");
if (avctx->err_recognition & AV_EF_EXPLODE)
return ret;
}
return 0;
} }
static int unrefcount_frame(AVCodecInternal *avci, AVFrame *frame) static int unrefcount_frame(AVCodecInternal *avci, AVFrame *frame)
...@@ -2158,11 +2168,8 @@ int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi ...@@ -2158,11 +2168,8 @@ int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi
(avctx->active_thread_type & FF_THREAD_FRAME)) { (avctx->active_thread_type & FF_THREAD_FRAME)) {
int did_split = av_packet_split_side_data(&tmp); int did_split = av_packet_split_side_data(&tmp);
ret = apply_param_change(avctx, &tmp); ret = apply_param_change(avctx, &tmp);
if (ret < 0) { if (ret < 0)
av_log(avctx, AV_LOG_ERROR, "Error applying parameter changes.\n");
if (avctx->err_recognition & AV_EF_EXPLODE)
goto fail; goto fail;
}
avctx->internal->pkt = &tmp; avctx->internal->pkt = &tmp;
if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME) if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME)
...@@ -2259,11 +2266,8 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx, ...@@ -2259,11 +2266,8 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
AVPacket tmp = *avpkt; AVPacket tmp = *avpkt;
int did_split = av_packet_split_side_data(&tmp); int did_split = av_packet_split_side_data(&tmp);
ret = apply_param_change(avctx, &tmp); ret = apply_param_change(avctx, &tmp);
if (ret < 0) { if (ret < 0)
av_log(avctx, AV_LOG_ERROR, "Error applying parameter changes.\n");
if (avctx->err_recognition & AV_EF_EXPLODE)
goto fail; goto fail;
}
avctx->internal->pkt = &tmp; avctx->internal->pkt = &tmp;
if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME) if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME)
......
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