Make the checker functions available for all codecs. Signed-off-by: Marton Balint <c...@passwd.hu> --- libavcodec/encode.c | 19 +++++++++++++++++++ libavcodec/encode.h | 9 +++++++++ libavcodec/mpegvideo_enc.c | 8 ++++++++ 3 files changed, 36 insertions(+)
diff --git a/libavcodec/encode.c b/libavcodec/encode.c index 3baf5b8103..cd10dcf3cd 100644 --- a/libavcodec/encode.c +++ b/libavcodec/encode.c @@ -936,3 +936,22 @@ AVCPBProperties *ff_encode_add_cpb_side_data(AVCodecContext *avctx) return props; } + +int ff_check_codec_matrices(AVCodecContext *avctx, unsigned types, uint16_t min, uint16_t max) +{ + uint16_t *matrices[] = {avctx->intra_matrix, avctx->inter_matrix, avctx->chroma_intra_matrix}; + const char *names[] = {"Intra", "Inter", "Chroma Intra"}; + static_assert(FF_ARRAY_ELEMS(matrices) == FF_ARRAY_ELEMS(names), "matrix count mismatch"); + for (int m = 0; m < FF_ARRAY_ELEMS(matrices); m++) { + uint16_t *matrix = matrices[m]; + if (matrix && (types & (1U << m))) { + for (int i = 0; i < 64; i++) { + if (matrix[i] < min || matrix[i] > max) { + av_log(avctx, AV_LOG_ERROR, "%s matrix[%d] is %d which is out of the allowed range [%"PRIu16"-%"PRIu16"].\n", names[m], i, matrix[i], min, max); + return AVERROR(EINVAL); + } + } + } + } + return 0; +} diff --git a/libavcodec/encode.h b/libavcodec/encode.h index 85331e04b7..656da135d2 100644 --- a/libavcodec/encode.h +++ b/libavcodec/encode.h @@ -96,4 +96,13 @@ static av_always_inline int64_t ff_samples_to_time_base(const AVCodecContext *av avctx->time_base); } +/** + * Check if the elements of codec context matrices (intra_matrix, inter_matrix or + * chroma_intra_matrix) are within the specified range. + */ +#define FF_MATRIX_TYPE_INTRA (1U << 0) +#define FF_MATRIX_TYPE_INTER (1U << 1) +#define FF_MATRIX_TYPE_CHROMA_INTRA (1U << 2) +int ff_check_codec_matrices(AVCodecContext *avctx, unsigned types, uint16_t min, uint16_t max); + #endif /* AVCODEC_ENCODE_H */ diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index c5f20c2d85..36e7307d23 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -987,6 +987,10 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx) /* precompute matrix */ /* for mjpeg, we do include qscale in the matrix */ if (s->out_format != FMT_MJPEG) { + ret = ff_check_codec_matrices(avctx, FF_MATRIX_TYPE_INTRA | FF_MATRIX_TYPE_INTER, 1, 255); + if (ret < 0) + return ret; + ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16, s->intra_matrix, s->intra_quant_bias, avctx->qmin, 31, 1); @@ -3754,6 +3758,10 @@ static int encode_picture(MpegEncContext *s, const AVPacket *pkt) const uint16_t * luma_matrix = ff_mpeg1_default_intra_matrix; const uint16_t *chroma_matrix = ff_mpeg1_default_intra_matrix; + ret = ff_check_codec_matrices(s->avctx, FF_MATRIX_TYPE_INTRA | FF_MATRIX_TYPE_CHROMA_INTRA, (7 + s->qscale) / s->qscale, 65535); + if (ret < 0) + return ret; + if (s->avctx->intra_matrix) { chroma_matrix = luma_matrix = s->avctx->intra_matrix; -- 2.43.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".