2018-05-24 8:05 GMT+08:00 Mark Thompson <s...@jkqxz.net>:
> On 23/05/18 11:29, Jun Zhao wrote:
>> dump more decoding error details when sync surface fail.
>>
>> Signed-off-by: Jun Zhao <mypopy...@gmail.com>
>> ---
>>  libavutil/hwcontext_vaapi.c | 17 +++++++++++++++++
>>  1 file changed, 17 insertions(+)
>>
>> diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c
>> index e55bb8d..5bdb02f 100644
>> --- a/libavutil/hwcontext_vaapi.c
>> +++ b/libavutil/hwcontext_vaapi.c
>> @@ -742,6 +742,23 @@ static int vaapi_map_frame(AVHWFramesContext *hwfc,
>>          av_log(hwfc, AV_LOG_ERROR, "Failed to sync surface "
>>                 "%#x: %d (%s).\n", surface_id, vas, vaErrorStr(vas));
>>          err = AVERROR(EIO);
>> +        /* query decode detail error */
>> +        if (vas == VA_STATUS_ERROR_DECODING_ERROR) {
>> +            VASurfaceDecodeMBErrors *dec_err = NULL;
>> +            int i;
>> +            vas = vaQuerySurfaceError(hwctx->display, surface_id, 
>> VA_STATUS_ERROR_DECODING_ERROR,
>> +                                      (void **)&dec_err);
>> +            if (VA_STATUS_SUCCESS == vas) {
>> +                if (NULL != dec_err) {
>
> Why this check?
maybe give a assert0?
>
>> +                    for (i = 0; dec_err[i].status != -1; i++) {
>
> How many items can be in this list?  We probably don't want to print more 
> than one in the error log if this can happen on every frame in a broken 
> stream.
Oh, from the API  define, "array is terminated if "status==-1" is
detected", so I don't know
the error entry number from VA-API level (but I checked the iHD source code,
I think iHD always return 2 error entries in this case). In current
FFmpeg VA-API
 HWaccel decoding logic, I believe if vaSyncSurface fail, FFmpeg will return the
error and exit, so we don't have a change to print the error message
every frame.

>> +                          av_log(hwfc, AV_LOG_ERROR, "Decoding deatils 
>> error, "
>
> "Decoding error details:" maybe?
Ok, will change it
>
>> +                                 "type: %d, start mb: %d, end md: %d, num 
>> mbs: %d.\n",
>> +                                 dec_err[i].decode_error_type, 
>> dec_err[i].start_mb,
>> +                                 dec_err[i].end_mb, dec_err[i].num_mb);
>> +                    }
>> +                }
>> +            }
>> +        }
>>          goto fail;
>>      }
>>
>>
>
> What is the lifetime of the returned pointer here?  This can certainly be 
> called on any thread asynchronously.
Yes, I have the same thought about this API, basically, I think
vaQuerySurfaceError()
need to return the pointer and ask the caller to free the error
entries like getaddressinfo()/freeaddrinfo(),
and I think need to submit a patch to VA-API/iHD driver for this part.
>
> It's a bit nasty to have this in the generic code rather than the decoder: 
> very few actual uses are going to call SyncSurface directly on a decoder 
> output - rather they will pass it to some other component (another VAAPI one, 
> or export).  Could we instead put this inside the decoder, enabled by some 
> debug option?  (Some sort of "catch decoder errors earlier at a cost of 
> (possibly greatly) decreased performance" flag.)
I can give a case, when I debug the ticket #7200, I try to dump the
YUV but fail,
so I want to get more decoding error from iHD driver.

use the command like this: ./ffmpeg_g -hwaccel vaapi -vaapi_device
/dev/dri/renderD128 -hwaccel_flags allow_profile_mismatch -i test.ts
-f null /dev/null

I think give a decoder option in this case is a good suggestion, I
will check this way. Thanks.
>
> - Mark
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to