diff mbox

[FFmpeg-devel] set AVFrame decode_error_flags to FF_DECODE_ERROR_CONCEALMENT_ACTIVE in case of concealed errors

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

Commit Message

Amir Pauker June 14, 2019, 2:43 p.m. UTC
set AVFrame decode_error_flags to FF_DECODE_ERROR_CONCEALMENT_ACTIVE 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/h264dec.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Michael Niedermayer June 16, 2019, 7:53 a.m. UTC | #1
On Fri, Jun 14, 2019 at 07:43:46AM -0700, Amir Pauker wrote:
> set AVFrame decode_error_flags to FF_DECODE_ERROR_CONCEALMENT_ACTIVE 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/h264dec.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c
> index 837c3b7..98b7d79 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_CONCEALMENT_ACTIVE;
> +    }
> +

it would be more robust to set the flag around where the
"concealing %d DC, %d AC, %d MV errors in %c frame\" message is printed

That is when concealing actually happens

thanks

[...]
Amir Pauker June 18, 2019, 12:14 p.m. UTC | #2
Thanks Michael,

The reason I set the flag before the log line in ff_er_frame_end is because
the code might never get there even though the return value is set to zero.

Should we use two different values ?

Thanks
Amir

On Sun, Jun 16, 2019 at 10:53 AM Michael Niedermayer <michael@niedermayer.cc>
wrote:

> On Fri, Jun 14, 2019 at 07:43:46AM -0700, Amir Pauker wrote:
> > set AVFrame decode_error_flags to FF_DECODE_ERROR_CONCEALMENT_ACTIVE 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/h264dec.c | 5 +++++
> >  1 file changed, 5 insertions(+)
> >
> > diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c
> > index 837c3b7..98b7d79 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_CONCEALMENT_ACTIVE;
> > +    }
> > +
>
> it would be more robust to set the flag around where the
> "concealing %d DC, %d AC, %d MV errors in %c frame\" message is printed
>
> That is when concealing actually happens
>
> thanks
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Avoid a single point of failure, be that a person or equipment.
> _______________________________________________
> 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".
Michael Niedermayer June 19, 2019, 9:38 a.m. UTC | #3
On Tue, Jun 18, 2019 at 03:14:47PM +0300, Amir Z wrote:
> Thanks Michael,
> 
> The reason I set the flag before the log line in ff_er_frame_end is because
> the code might never get there even though the return value is set to zero.
> 
> Should we use two different values ?

if there are 2 semantically different cases, maybe yes

thx

[...]
Amir Pauker June 21, 2019, 2:22 p.m. UTC | #4
Thanks Michael,

I submitted two new patches.

I add a new value FF_DECODE_ERROR_DECODE_SLICES.

FF_DECODE_ERROR_DECODE_SLICES indicates that error(s) occurred during
slices decoding but the return code is set to zero (set where previously
FF_DECODE_ERROR_CONCEALMENT_ACTIVE was set).

FF_DECODE_ERROR_CONCEALMENT_ACTIVE indicates that an attempt to correct
those errors was made (set where you suggested)

Amir


On Wed, Jun 19, 2019 at 12:38 PM Michael Niedermayer <michael@niedermayer.cc>
wrote:

> On Tue, Jun 18, 2019 at 03:14:47PM +0300, Amir Z wrote:
> > Thanks Michael,
> >
> > The reason I set the flag before the log line in ff_er_frame_end is
> because
> > the code might never get there even though the return value is set to
> zero.
> >
> > Should we use two different values ?
>
> if there are 2 semantically different cases, maybe yes
>
> thx
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Opposition brings concord. Out of discord comes the fairest harmony.
> -- Heraclitus
> _______________________________________________
> 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".
diff mbox

Patch

diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c
index 837c3b7..98b7d79 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_CONCEALMENT_ACTIVE;
+    }
+
     ret = 0;
 end: