diff mbox

[FFmpeg-devel] set AVFrame decode_error_flags in case of decoding error by h264dec

Message ID 1561126517-23188-1-git-send-email-amir@livelyvideo.tv
State New
Headers show

Commit Message

Amir Pauker June 21, 2019, 2:15 p.m. UTC
set AVFrame decode_error_flags in case h->slice_ctx->er.error_occurred is set
after the call to ff_h264_execute_decode_slices. This allows the user to detect
concealed decoding errors in the call to avcodec_receive_frame

Signed-off-by: Amir Pauker <amir@livelyvideo.tv>
---
 libavcodec/error_resilience.c | 2 ++
 libavcodec/h264dec.c          | 5 +++++
 2 files changed, 7 insertions(+)

Comments

Amir Pauker July 6, 2019, 7:19 p.m. UTC | #1
Michael hey,

Could you please apply this patch as well.

Thanks

On Fri, Jun 21, 2019 at 9:15 AM Amir Pauker <amir@livelyvideo.tv> wrote:

> set AVFrame decode_error_flags in case h->slice_ctx->er.error_occurred is
> set
> after the call to ff_h264_execute_decode_slices. This allows the user to
> detect
> concealed decoding errors in the call to avcodec_receive_frame
>
> Signed-off-by: Amir Pauker <amir@livelyvideo.tv>
> ---
>  libavcodec/error_resilience.c | 2 ++
>  libavcodec/h264dec.c          | 5 +++++
>  2 files changed, 7 insertions(+)
>
> diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c
> index 35d0c60..ca22871 100644
> --- a/libavcodec/error_resilience.c
> +++ b/libavcodec/error_resilience.c
> @@ -1121,6 +1121,8 @@ void ff_er_frame_end(ERContext *s)
>      av_log(s->avctx, AV_LOG_INFO, "concealing %d DC, %d AC, %d MV errors
> in %c frame\n",
>             dc_error, ac_error, mv_error,
> av_get_picture_type_char(s->cur_pic.f->pict_type));
>
> +    s->cur_pic.f->decode_error_flags |=
> FF_DECODE_ERROR_CONCEALMENT_ACTIVE;
> +
>      is_intra_likely = is_intra_more_likely(s);
>
>      /* set unknown mb-type to most likely */
> diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c
> index 837c3b7..8d1bd16 100644
> --- a/libavcodec/h264dec.c
> +++ b/libavcodec/h264dec.c
> @@ -761,6 +761,11 @@ static int decode_nal_units(H264Context *h, const
> uint8_t *buf, int buf_size)
>      if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
>          goto end;
>
> +    // set decode_error_flags to allow users to detect concealed decoding
> errors
> +    if ((ret < 0 || h->slice_ctx->er.error_occurred) && h->cur_pic_ptr) {
> +        h->cur_pic_ptr->f->decode_error_flags |=
> FF_DECODE_ERROR_DECODE_SLICES;
> +    }
> +
>      ret = 0;
>  end:
>
> --
> 2.1.4
>
>
Michael Niedermayer July 7, 2019, 8:15 p.m. UTC | #2
On Fri, Jun 21, 2019 at 07:15:17AM -0700, Amir Pauker wrote:
> set AVFrame decode_error_flags in case h->slice_ctx->er.error_occurred is set
> after the call to ff_h264_execute_decode_slices. This allows the user to detect
> concealed decoding errors in the call to avcodec_receive_frame
> 
> Signed-off-by: Amir Pauker <amir@livelyvideo.tv>
> ---
>  libavcodec/error_resilience.c | 2 ++
>  libavcodec/h264dec.c          | 5 +++++
>  2 files changed, 7 insertions(+)
> 
> diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c
> index 35d0c60..ca22871 100644
> --- a/libavcodec/error_resilience.c
> +++ b/libavcodec/error_resilience.c
> @@ -1121,6 +1121,8 @@ void ff_er_frame_end(ERContext *s)
>      av_log(s->avctx, AV_LOG_INFO, "concealing %d DC, %d AC, %d MV errors in %c frame\n",
>             dc_error, ac_error, mv_error, av_get_picture_type_char(s->cur_pic.f->pict_type));
>  
> +    s->cur_pic.f->decode_error_flags |= FF_DECODE_ERROR_CONCEALMENT_ACTIVE;
> +
>      is_intra_likely = is_intra_more_likely(s);
>  
>      /* set unknown mb-type to most likely */
> diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c
> index 837c3b7..8d1bd16 100644
> --- a/libavcodec/h264dec.c
> +++ b/libavcodec/h264dec.c
> @@ -761,6 +761,11 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size)
>      if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
>          goto end;
>  
> +    // set decode_error_flags to allow users to detect concealed decoding errors
> +    if ((ret < 0 || h->slice_ctx->er.error_occurred) && h->cur_pic_ptr) {
> +        h->cur_pic_ptr->f->decode_error_flags |= FF_DECODE_ERROR_DECODE_SLICES;
> +    }
> +
>      ret = 0;
>  end:

will split and apply

thx

[...]
Amir Pauker July 8, 2019, 5:20 p.m. UTC | #3
Thanks

On Sun, Jul 7, 2019 at 3:38 PM Michael Niedermayer <michael@niedermayer.cc>
wrote:

> On Fri, Jun 21, 2019 at 07:15:17AM -0700, Amir Pauker wrote:
> > set AVFrame decode_error_flags in case h->slice_ctx->er.error_occurred
> is set
> > after the call to ff_h264_execute_decode_slices. This allows the user to
> detect
> > concealed decoding errors in the call to avcodec_receive_frame
> >
> > Signed-off-by: Amir Pauker <amir@livelyvideo.tv>
> > ---
> >  libavcodec/error_resilience.c | 2 ++
> >  libavcodec/h264dec.c          | 5 +++++
> >  2 files changed, 7 insertions(+)
> >
> > diff --git a/libavcodec/error_resilience.c
> b/libavcodec/error_resilience.c
> > index 35d0c60..ca22871 100644
> > --- a/libavcodec/error_resilience.c
> > +++ b/libavcodec/error_resilience.c
> > @@ -1121,6 +1121,8 @@ void ff_er_frame_end(ERContext *s)
> >      av_log(s->avctx, AV_LOG_INFO, "concealing %d DC, %d AC, %d MV
> errors in %c frame\n",
> >             dc_error, ac_error, mv_error,
> av_get_picture_type_char(s->cur_pic.f->pict_type));
> >
> > +    s->cur_pic.f->decode_error_flags |=
> FF_DECODE_ERROR_CONCEALMENT_ACTIVE;
> > +
> >      is_intra_likely = is_intra_more_likely(s);
> >
> >      /* set unknown mb-type to most likely */
> > diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c
> > index 837c3b7..8d1bd16 100644
> > --- a/libavcodec/h264dec.c
> > +++ b/libavcodec/h264dec.c
> > @@ -761,6 +761,11 @@ static int decode_nal_units(H264Context *h, const
> uint8_t *buf, int buf_size)
> >      if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
> >          goto end;
> >
> > +    // set decode_error_flags to allow users to detect concealed
> decoding errors
> > +    if ((ret < 0 || h->slice_ctx->er.error_occurred) && h->cur_pic_ptr)
> {
> > +        h->cur_pic_ptr->f->decode_error_flags |=
> FF_DECODE_ERROR_DECODE_SLICES;
> > +    }
> > +
> >      ret = 0;
> >  end:
>
> will split and apply
>
> thx
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Whats the most studid thing your enemy could do ? Blow himself up
> Whats the most studid thing you could do ? Give up your rights and
> freedom because your enemy blew himself up.
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
James Almer May 24, 2021, 5:20 p.m. UTC | #4
On 7/7/2019 5:15 PM, Michael Niedermayer wrote:
> On Fri, Jun 21, 2019 at 07:15:17AM -0700, Amir Pauker wrote:
>> set AVFrame decode_error_flags in case h->slice_ctx->er.error_occurred is set
>> after the call to ff_h264_execute_decode_slices. This allows the user to detect
>> concealed decoding errors in the call to avcodec_receive_frame
>>
>> Signed-off-by: Amir Pauker <amir@livelyvideo.tv>
>> ---
>>   libavcodec/error_resilience.c | 2 ++
>>   libavcodec/h264dec.c          | 5 +++++
>>   2 files changed, 7 insertions(+)
>>
>> diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c
>> index 35d0c60..ca22871 100644
>> --- a/libavcodec/error_resilience.c
>> +++ b/libavcodec/error_resilience.c
>> @@ -1121,6 +1121,8 @@ void ff_er_frame_end(ERContext *s)
>>       av_log(s->avctx, AV_LOG_INFO, "concealing %d DC, %d AC, %d MV errors in %c frame\n",
>>              dc_error, ac_error, mv_error, av_get_picture_type_char(s->cur_pic.f->pict_type));
>>   
>> +    s->cur_pic.f->decode_error_flags |= FF_DECODE_ERROR_CONCEALMENT_ACTIVE;
>> +
>>       is_intra_likely = is_intra_more_likely(s);
>>   
>>       /* set unknown mb-type to most likely */
>> diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c
>> index 837c3b7..8d1bd16 100644
>> --- a/libavcodec/h264dec.c
>> +++ b/libavcodec/h264dec.c
>> @@ -761,6 +761,11 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size)
>>       if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
>>           goto end;
>>   
>> +    // set decode_error_flags to allow users to detect concealed decoding errors
>> +    if ((ret < 0 || h->slice_ctx->er.error_occurred) && h->cur_pic_ptr) {
>> +        h->cur_pic_ptr->f->decode_error_flags |= FF_DECODE_ERROR_DECODE_SLICES;
>> +    }
>> +
>>       ret = 0;
>>   end:
> 
> will split and apply
> 
> thx

This change seems to have produced FATE failures when run under tsan.
http://fate.ffmpeg.org/report.cgi?time=20210524021410&slot=x86_64-archlinux-gcc-tsan

That being said, TSAN runs show a lot of issues that have remained 
unresolved for a long while. No idea if they are false positives, or if 
they are benign and rarely (if at all) have any effect on real world 
usage (Like this one, apparently), but what i can say is that they are 
masking new and potentially bad threading bugs that nobody will notice 
in a timely manner.
Anton Khirnov May 31, 2021, 7:16 a.m. UTC | #5
Quoting James Almer (2021-05-24 19:20:19)
> On 7/7/2019 5:15 PM, Michael Niedermayer wrote:
> > On Fri, Jun 21, 2019 at 07:15:17AM -0700, Amir Pauker wrote:
> >> set AVFrame decode_error_flags in case h->slice_ctx->er.error_occurred is set
> >> after the call to ff_h264_execute_decode_slices. This allows the user to detect
> >> concealed decoding errors in the call to avcodec_receive_frame
> >>
> >> Signed-off-by: Amir Pauker <amir@livelyvideo.tv>
> >> ---
> >>   libavcodec/error_resilience.c | 2 ++
> >>   libavcodec/h264dec.c          | 5 +++++
> >>   2 files changed, 7 insertions(+)
> >>
> >> diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c
> >> index 35d0c60..ca22871 100644
> >> --- a/libavcodec/error_resilience.c
> >> +++ b/libavcodec/error_resilience.c
> >> @@ -1121,6 +1121,8 @@ void ff_er_frame_end(ERContext *s)
> >>       av_log(s->avctx, AV_LOG_INFO, "concealing %d DC, %d AC, %d MV errors in %c frame\n",
> >>              dc_error, ac_error, mv_error, av_get_picture_type_char(s->cur_pic.f->pict_type));
> >>   
> >> +    s->cur_pic.f->decode_error_flags |= FF_DECODE_ERROR_CONCEALMENT_ACTIVE;
> >> +
> >>       is_intra_likely = is_intra_more_likely(s);
> >>   
> >>       /* set unknown mb-type to most likely */
> >> diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c
> >> index 837c3b7..8d1bd16 100644
> >> --- a/libavcodec/h264dec.c
> >> +++ b/libavcodec/h264dec.c
> >> @@ -761,6 +761,11 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size)
> >>       if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
> >>           goto end;
> >>   
> >> +    // set decode_error_flags to allow users to detect concealed decoding errors
> >> +    if ((ret < 0 || h->slice_ctx->er.error_occurred) && h->cur_pic_ptr) {
> >> +        h->cur_pic_ptr->f->decode_error_flags |= FF_DECODE_ERROR_DECODE_SLICES;
> >> +    }
> >> +
> >>       ret = 0;
> >>   end:
> > 
> > will split and apply
> > 
> > thx
> 
> This change seems to have produced FATE failures when run under tsan.
> http://fate.ffmpeg.org/report.cgi?time=20210524021410&slot=x86_64-archlinux-gcc-tsan
> 
> That being said, TSAN runs show a lot of issues that have remained 
> unresolved for a long while. No idea if they are false positives, or if 
> they are benign and rarely (if at all) have any effect on real world 
> usage (Like this one, apparently), but what i can say is that they are 
> masking new and potentially bad threading bugs that nobody will notice 
> in a timely manner.

Modifying frames in the DPB is a race, this flag should be applied on
the output frame rather than the DPB frame.
diff mbox

Patch

diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c
index 35d0c60..ca22871 100644
--- a/libavcodec/error_resilience.c
+++ b/libavcodec/error_resilience.c
@@ -1121,6 +1121,8 @@  void ff_er_frame_end(ERContext *s)
     av_log(s->avctx, AV_LOG_INFO, "concealing %d DC, %d AC, %d MV errors in %c frame\n",
            dc_error, ac_error, mv_error, av_get_picture_type_char(s->cur_pic.f->pict_type));
 
+    s->cur_pic.f->decode_error_flags |= FF_DECODE_ERROR_CONCEALMENT_ACTIVE;
+
     is_intra_likely = is_intra_more_likely(s);
 
     /* set unknown mb-type to most likely */
diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c
index 837c3b7..8d1bd16 100644
--- a/libavcodec/h264dec.c
+++ b/libavcodec/h264dec.c
@@ -761,6 +761,11 @@  static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size)
     if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
         goto end;
 
+    // set decode_error_flags to allow users to detect concealed decoding errors
+    if ((ret < 0 || h->slice_ctx->er.error_occurred) && h->cur_pic_ptr) {
+        h->cur_pic_ptr->f->decode_error_flags |= FF_DECODE_ERROR_DECODE_SLICES;
+    }
+
     ret = 0;
 end: