Skip to content

Commit

Permalink
Move surface synchronization and check sync status
Browse files Browse the repository at this point in the history
Move surface synchronization into separate function and utilize that to make
sure deinterlacer references are ready to be used.

Also check status of surface synchronization and log errors in debug log.

This can help with issue #108
  • Loading branch information
pesintta committed Mar 17, 2018
1 parent 02a7b84 commit 677c8c8
Showing 1 changed file with 35 additions and 8 deletions.
43 changes: 35 additions & 8 deletions video.c
Original file line number Diff line number Diff line change
Expand Up @@ -1029,6 +1029,29 @@ static VAStatus VaapiCheckSurface(VADisplay va_display, VASurfaceID surface)
return VaapiCheckSurfaces(va_display, surfaces, ARRAY_ELEMS(surfaces));
}

///
/// Sync an array of surfaces
///
/// @param va_display VADisplay to use
/// @param surfaces array of surfaces to sync
/// @param num_surfaces number of surfaces
///
/// @returns status of the sync. VA_STATUS_SUCCESS if surfaces were synced
///
static VAStatus VaapiSyncSurfaces(VADisplay va_display, VASurfaceID * surfaces, unsigned int num_surfaces)
{
VAStatus va_status;

for (unsigned int i = 0; i < num_surfaces; ++i) {
va_status = vaSyncSurface(va_display, surfaces[i]);
if (va_status != VA_STATUS_SUCCESS) {
Debug8("video/vaapi: surface 0x%x failed to sync: %s", surfaces[i], vaErrorStr(va_status));
return va_status;
}
}
return VA_STATUS_SUCCESS;
}

///
/// Get a free surface.
///
Expand Down Expand Up @@ -1789,14 +1812,11 @@ static VASurfaceID *VaapiApplyFilters(VaapiDecoder * decoder, int top_field)
VaapiCheckPipelineCaps(decoder->vpp_ctx, filters_to_run, filter_count, &tmp_forwardRefCount,
&tmp_backwardRefCount);

/* Make sure rendering is finished in reference surfaces */
for (unsigned int i = 0; i < tmp_forwardRefCount; ++i)
vaSyncSurface(decoder->VaDisplay, decoder->ForwardRefSurfaces[i]);
for (unsigned int i = 0; i < tmp_backwardRefCount; ++i)
vaSyncSurface(decoder->VaDisplay, decoder->BackwardRefSurfaces[i]);
/* Make sure the src/dst surfaces are also ready */
vaSyncSurface(decoder->VaDisplay, decoder->PlaybackSurface);
vaSyncSurface(decoder->VaDisplay, *surface);
/* Make sure the src/dst surfaces are ready */
if (vaSyncSurface(decoder->VaDisplay, decoder->PlaybackSurface) != VA_STATUS_SUCCESS)
Debug8("video/vaapi: failure in synchronizing Playbacksurface");
if (vaSyncSurface(decoder->VaDisplay, *surface) != VA_STATUS_SUCCESS)
Debug8("video/vaapi: failure in synchronizing dst surface");

/* This block of code skips various filters in-flight if source/settings
disallow running the filter in question */
Expand All @@ -1815,9 +1835,16 @@ static VASurfaceID *VaapiApplyFilters(VaapiDecoder * decoder, int top_field)
/* Skip deinterlacing if forward/backward references are not ready */
if (caps_status != VA_STATUS_SUCCESS)
continue;
/* Make sure rendering is finished in reference surfaces */
if (VaapiSyncSurfaces(decoder->VaDisplay, decoder->ForwardRefSurfaces,
tmp_forwardRefCount) != VA_STATUS_SUCCESS)
continue;
if (VaapiCheckSurfaces(decoder->VaDisplay, decoder->ForwardRefSurfaces,
tmp_forwardRefCount) != VA_STATUS_SUCCESS)
continue;
if (VaapiSyncSurfaces(decoder->VaDisplay, decoder->BackwardRefSurfaces,
tmp_backwardRefCount) != VA_STATUS_SUCCESS)
continue;
if (VaapiCheckSurfaces(decoder->VaDisplay, decoder->BackwardRefSurfaces,
tmp_backwardRefCount) != VA_STATUS_SUCCESS)
continue;
Expand Down

0 comments on commit 677c8c8

Please sign in to comment.