[gdal-dev] RE: progressive rendering

Adam Nowacki nowak at xpam.de
Tue Sep 2 15:40:24 EDT 2008


Tamas Szekeres wrote:
> Hi All,
> 
> Upon thinking about the issues I've been come up with previously, I
> consider the following approach could be implemented easily either at
> driver or at SWIG interface level. Requires a new class to be
> implemented by the async IO supported drivers and a new additional
> method should be added to the GDALDataset and GDALRasterBand.
> The user could implement the async IO by using the following pseudo sequence:
> 
> <Code>
> ...
> </Code>

I like it :)

typedef enum {
     ...,
     CE_Again = 5 // timeout, buffer not updated, call RasterIO() again
} CPLErr;

typedef enum { // Async raster io status
     GRS_Complete = 0, // raster io is complete, call to 
GDALRasterIOContext->RasterIO() will return CE_Failure
     GRS_InProgress = 1, // raster io in progress, call 
GDALRasterIOContext->RasterIO() to get more data
     GRS_Error = 2 // error, call to GDALRasterIOContext->RasterIO() 
will return CE_Failure
} GDALRasterIOStatus;

typedef enum { // Hints for GDALRasterIOContext->RasterIO(), driver 
implementations may ignore any or all
     GRH_SingleBlock = 0x1, // exit after single block update, even if 
there is more data immediately available
     GRH_Progressive = 0x2, // update with lower resolution data / fill 
with interlaced rows
     GRH_WaitForTimeout = 0x4 // wait for timeout even if already 
updated some data
} GDALRasterIOHint;

class GDALRasterIOContext {
public:
     GDALRasterIOContext() {
         eStatus = GRS_Continue;
         pszError = NULL;
     }

public:
// Continue raster io, update pData buffer with new data, nUpdate??? = 
bounding box of all updated blocks
// return CE_None if updated with new data
// return CE_Again on timeout
// return CE_Failure on error
     virtual CPLErr RasterIO(void *pData, int nTimeoutMilliseconds = -1, 
int nHint = 0);

public:
     GDALRasterIOStatus eStatus;
     char *pszError; // if eStatus == GRS_Error this should contain 
human readable error message, NULL otherwise
     int nUpdateXOff;
     int nUpdateYOff;
     int nUpdateXSize;
     int nUpdateYSize;
};

class GDALDataset {
...
public:
     virtual GDALRasterIOContext *StartRasterIO(
         GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize, int nYSize,
         int nBufXSize, int nBufYSize, GDALDataType eBufType,
         int nBandCount, int *panBandMap, int nPixelSpace, int 
nLineSpace, int nBandSpace
     );

     virtual void EndRasterIO(GDALAsyncRasterIOContext *poContext);
};



More information about the gdal-dev mailing list