FREERDP_API INT32 progressive_decompress(PROGRESSIVE_CONTEXT* progressive, const BYTE* pSrcData,
UINT32 SrcSize, BYTE* pDstData, UINT32 DstFormat,
UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst,
- REGION16* invalidRegion, UINT16 surfaceId);
+ REGION16* invalidRegion, UINT16 surfaceId,
+ UINT32 frameId);
FREERDP_API INT32 progressive_create_surface_context(PROGRESSIVE_CONTEXT* progressive,
UINT16 surfaceId, UINT32 width,
BOOL graphicsReset; /* deprecated, remove with FreeRDP v3 */
BOOL suppressOutput;
UINT16 outputSurfaceId;
+ UINT32 frameId;
RdpgfxClientContext* gfx;
VideoClientContext* video;
GeometryClientContext* geometry;
}
free(surface->tiles);
+ free(surface->updatedTileIndices);
free(surface);
}
surface->gridHeight = (height + (64 - height % 64)) / 64;
surface->gridSize = surface->gridWidth * surface->gridHeight;
surface->tiles = (RFX_PROGRESSIVE_TILE*)calloc(surface->gridSize, sizeof(RFX_PROGRESSIVE_TILE));
+ surface->updatedTileIndices = (UINT32*)calloc(surface->gridSize, sizeof(UINT32));
- if (!surface->tiles)
+ if (!surface->tiles || !surface->updatedTileIndices)
{
free(surface);
return NULL;
region->numTiles, region->usedTiles);
return FALSE;
}
+ if (surface->numUpdatedTiles >= surface->gridSize)
+ {
+ WLog_ERR(TAG, "Invalid total tile count, maximum %" PRIu32, surface->gridSize);
+ return FALSE;
+ }
region->tiles[region->usedTiles++] = t;
+ surface->updatedTileIndices[surface->numUpdatedTiles++] = (UINT32)zIdx;
return TRUE;
}
}
}
- return (int)end - start;
+ return (int)(end - start);
}
static INLINE INT32 progressive_wb_sync(PROGRESSIVE_CONTEXT* progressive, wStream* s,
INT32 progressive_decompress(PROGRESSIVE_CONTEXT* progressive, const BYTE* pSrcData, UINT32 SrcSize,
BYTE* pDstData, UINT32 DstFormat, UINT32 nDstStep, UINT32 nXDst,
- UINT32 nYDst, REGION16* invalidRegion, UINT16 surfaceId)
+ UINT32 nYDst, REGION16* invalidRegion, UINT16 surfaceId,
+ UINT32 frameId)
{
INT32 rc = 1;
- UINT16 i, j;
+ UINT32 i, j;
UINT16 blockType;
UINT32 blockLen;
UINT32 count = 0;
return -1001;
}
+ if (surface->frameId != frameId)
+ {
+ surface->frameId = frameId;
+ surface->numUpdatedTiles = 0;
+ }
+
Stream_StaticInit(&ss, sconv.bp, SrcSize);
s = &ss;
region16_union_rect(&clippingRects, &clippingRects, &clippingRect);
}
- for (i = 0; i < region->numTiles; i++)
+ for (i = 0; i < surface->numUpdatedTiles; i++)
{
UINT32 nbUpdateRects;
const RECTANGLE_16* updateRects;
RECTANGLE_16 updateRect;
- RFX_PROGRESSIVE_TILE* tile = region->tiles[i];
+ RFX_PROGRESSIVE_TILE* tile = &surface->tiles[surface->updatedTileIndices[i]];
updateRect.left = nXDst + tile->x;
updateRect.top = nYDst + tile->y;
UINT32 gridHeight;
UINT32 gridSize;
RFX_PROGRESSIVE_TILE* tiles;
+ UINT32 frameId;
+ UINT32 numUpdatedTiles;
+ UINT32* updatedTileIndices;
};
typedef struct _PROGRESSIVE_SURFACE_CONTEXT PROGRESSIVE_SURFACE_CONTEXT;
for (pass = 0; pass < count; pass++)
{
- status = progressive_decompress(progressive, files[pass].buffer, files[pass].size,
- g_DstData, PIXEL_FORMAT_XRGB32, g_DstStep, 0, 0, NULL, 0);
+ status =
+ progressive_decompress(progressive, files[pass].buffer, files[pass].size, g_DstData,
+ PIXEL_FORMAT_XRGB32, g_DstStep, 0, 0, NULL, 0, 0);
printf("ProgressiveDecompress: status: %d pass: %d\n", status, pass + 1);
region = &(progressive->region);
goto fail;
rc = progressive_decompress(progressiveDec, dstData, dstSize, resultData, ColorFormat,
- image->scanline, 0, 0, &invalidRegion, 0);
+ image->scanline, 0, 0, &invalidRegion, 0, 0);
if (rc < 0)
goto fail;
{
rdpGdi* gdi = (rdpGdi*)context->custom;
gdi->inGfxFrame = TRUE;
+ gdi->frameId = startFrame->frameId;
return CHANNEL_RC_OK;
}
region16_init(&invalidRegion);
rc = progressive_decompress(surface->codecs->progressive, cmd->data, cmd->length, surface->data,
surface->format, surface->scanline, cmd->left, cmd->top,
- &invalidRegion, cmd->surfaceId);
+ &invalidRegion, cmd->surfaceId, gdi->frameId);
if (rc < 0)
{