static DFBResult
readBufferStream( IDirectFBImageProvider_ANDROID_data  *data,
                  char                                **bufferData,
                  int                                  *bufferSize )
{
     IDirectFBDataBuffer *buffer     = data->base.buffer;
     int                  total_size = 0;
     const int            bufsize    = 0x10000;
     char                *buf        = NULL;
     DFBResult            ret;
     int                  len;
     char                *rbuf; 

     while (1) {
          rbuf = realloc( buf, total_size + bufsize );
          if (!rbuf) {
               free( buf );
               return DFB_NOSYSTEMMEMORY;
          }

          buf = rbuf;

          while (buffer->HasData( buffer ) == DFB_OK) {
               D_DEBUG_AT( imageProviderANDROID, "Retrieving data (up to %d )...\n", bufsize );

               ret = buffer->GetData( buffer, bufsize, &buf[total_size], &len );
               if (ret)
                    return ret;

               D_DEBUG_AT( imageProviderANDROID, "  -> got %d bytes\n", len );

               total_size += len;
          }

          D_DEBUG_AT( imageProviderANDROID, "Waiting for data...\n" );

          if (buffer->WaitForData( buffer, 1 ) == DFB_EOF) {
               *bufferData = buf;
               *bufferSize = total_size;
               return DFB_OK;
          }
     }

     free( buf );

     return DFB_INCOMPLETE;
}
static DFBResult
WebP_decode_image( IDirectFBImageProvider_WebP_data *data,
                   CoreSurfaceBufferLock  *lock )
{
     VP8StatusCode status = VP8_STATUS_NOT_ENOUGH_DATA;
     DFBResult ret;

     uint32_t read_size;
     u8 image[data->image_size];

     WebPIDecoder* WebP_dec;
     IDirectFBDataBuffer *buffer = data->base.buffer;

     WebP_dec = WebPINewDecoder( &data->config.output );

     data->config.output.colorspace = (data->pixelformat == DSPF_ARGB) ? MODE_bgrA : MODE_BGR;

     data->config.output.u.RGBA.rgba = (uint8_t*)lock->addr;
     data->config.output.u.RGBA.stride = lock->pitch;
     data->config.output.u.RGBA.size = lock->pitch * data->height;

     data->config.output.is_external_memory = 1;

     ret = DFB_OK;
     while (ret != DFB_EOF && buffer->HasData( buffer ) == DFB_OK) {
          ret = buffer->GetData( buffer, data->image_size, image, &read_size );

          status = WebPIAppend( WebP_dec, image, read_size );
          if (!(status == VP8_STATUS_OK || status == VP8_STATUS_SUSPENDED))
               break;
     }

     WebPIDelete( WebP_dec );

     return  (status == VP8_STATUS_OK) ? DFB_OK : DFB_FAILURE;
}