diff mbox series

[FFmpeg-devel] avcodec/mpeg12dec: report error when picture type is unknown and err_detect is EXPLODE

Message ID 20210801015429.17814-1-cus@passwd.hu
State New
Headers show
Series [FFmpeg-devel] avcodec/mpeg12dec: report error when picture type is unknown and err_detect is EXPLODE | expand

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make success Make finished
andriy/PPC64_make_fate success Make fate finished

Commit Message

Marton Balint Aug. 1, 2021, 1:54 a.m. UTC
Signed-off-by: Marton Balint <cus@passwd.hu>
---
 libavcodec/mpeg12dec.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

Comments

Michael Niedermayer Aug. 1, 2021, 3:07 p.m. UTC | #1
On Sun, Aug 01, 2021 at 03:54:28AM +0200, Marton Balint wrote:
> Signed-off-by: Marton Balint <cus@passwd.hu>
> ---
>  libavcodec/mpeg12dec.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)

LGTM

thx

[...]
James Almer Aug. 1, 2021, 6:32 p.m. UTC | #2
On 7/31/2021 10:54 PM, Marton Balint wrote:
> Signed-off-by: Marton Balint <cus@passwd.hu>
> ---
>   libavcodec/mpeg12dec.c | 10 ++++++++--
>   1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c
> index 858dca660c..129dc1c2aa 100644
> --- a/libavcodec/mpeg12dec.c
> +++ b/libavcodec/mpeg12dec.c
> @@ -1529,7 +1529,7 @@ static void mpeg_decode_quant_matrix_extension(MpegEncContext *s)
>           load_matrix(s, s->chroma_inter_matrix, NULL, 0);
>   }
>   
> -static void mpeg_decode_picture_coding_extension(Mpeg1Context *s1)
> +static int mpeg_decode_picture_coding_extension(Mpeg1Context *s1)
>   {
>       MpegEncContext *s = &s1->mpeg_enc_ctx;
>   
> @@ -1541,6 +1541,8 @@ static void mpeg_decode_picture_coding_extension(Mpeg1Context *s1)
>       if (!s->pict_type && s1->mpeg_enc_ctx_allocated) {
>           av_log(s->avctx, AV_LOG_ERROR,
>                  "Missing picture start code, guessing missing values\n");

The guessing part will no longer be true when explode is set.

> +        if (s->avctx->err_recognition & AV_EF_EXPLODE)
> +            return AVERROR_INVALIDDATA;
>           if (s->mpeg_f_code[1][0] == 15 && s->mpeg_f_code[1][1] == 15) {
>               if (s->mpeg_f_code[0][0] == 15 && s->mpeg_f_code[0][1] == 15)
>                   s->pict_type = AV_PICTURE_TYPE_I;
> @@ -1586,6 +1588,8 @@ static void mpeg_decode_picture_coding_extension(Mpeg1Context *s1)
>       ff_dlog(s->avctx, "alternate_scan=%d\n", s->alternate_scan);
>       ff_dlog(s->avctx, "frame_pred_frame_dct=%d\n", s->frame_pred_frame_dct);
>       ff_dlog(s->avctx, "progressive_frame=%d\n", s->progressive_frame);
> +
> +    return 0;
>   }
>   
>   static int mpeg_field_start(MpegEncContext *s, const uint8_t *buf, int buf_size)
> @@ -2599,7 +2603,9 @@ static int decode_chunks(AVCodecContext *avctx, AVFrame *picture,
>                   break;
>               case 0x8:
>                   if (last_code == PICTURE_START_CODE) {
> -                    mpeg_decode_picture_coding_extension(s);
> +                    int ret = mpeg_decode_picture_coding_extension(s);
> +                    if (ret < 0)
> +                       return ret;
>                   } else {
>                       av_log(avctx, AV_LOG_ERROR,
>                              "ignoring pic cod ext after %X\n", last_code);
>
diff mbox series

Patch

diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c
index 858dca660c..129dc1c2aa 100644
--- a/libavcodec/mpeg12dec.c
+++ b/libavcodec/mpeg12dec.c
@@ -1529,7 +1529,7 @@  static void mpeg_decode_quant_matrix_extension(MpegEncContext *s)
         load_matrix(s, s->chroma_inter_matrix, NULL, 0);
 }
 
-static void mpeg_decode_picture_coding_extension(Mpeg1Context *s1)
+static int mpeg_decode_picture_coding_extension(Mpeg1Context *s1)
 {
     MpegEncContext *s = &s1->mpeg_enc_ctx;
 
@@ -1541,6 +1541,8 @@  static void mpeg_decode_picture_coding_extension(Mpeg1Context *s1)
     if (!s->pict_type && s1->mpeg_enc_ctx_allocated) {
         av_log(s->avctx, AV_LOG_ERROR,
                "Missing picture start code, guessing missing values\n");
+        if (s->avctx->err_recognition & AV_EF_EXPLODE)
+            return AVERROR_INVALIDDATA;
         if (s->mpeg_f_code[1][0] == 15 && s->mpeg_f_code[1][1] == 15) {
             if (s->mpeg_f_code[0][0] == 15 && s->mpeg_f_code[0][1] == 15)
                 s->pict_type = AV_PICTURE_TYPE_I;
@@ -1586,6 +1588,8 @@  static void mpeg_decode_picture_coding_extension(Mpeg1Context *s1)
     ff_dlog(s->avctx, "alternate_scan=%d\n", s->alternate_scan);
     ff_dlog(s->avctx, "frame_pred_frame_dct=%d\n", s->frame_pred_frame_dct);
     ff_dlog(s->avctx, "progressive_frame=%d\n", s->progressive_frame);
+
+    return 0;
 }
 
 static int mpeg_field_start(MpegEncContext *s, const uint8_t *buf, int buf_size)
@@ -2599,7 +2603,9 @@  static int decode_chunks(AVCodecContext *avctx, AVFrame *picture,
                 break;
             case 0x8:
                 if (last_code == PICTURE_START_CODE) {
-                    mpeg_decode_picture_coding_extension(s);
+                    int ret = mpeg_decode_picture_coding_extension(s);
+                    if (ret < 0)
+                       return ret;
                 } else {
                     av_log(avctx, AV_LOG_ERROR,
                            "ignoring pic cod ext after %X\n", last_code);