void* BufferThread( DirectThread *self, void *arg ) { IDirectFBVideoProvider_Xine_data *data = arg; IDirectFBDataBuffer *buffer = data->buffer; int fd; fd = open( data->pipe, O_WRONLY ); if (fd < 0) { D_PERROR( "IDirectFBVideoProvider_Xine: " "failed to open fifo '%s'\n", data->pipe ); return (void*)1; } while (!direct_thread_is_canceled( self )) { DFBResult ret; char buf[4096]; unsigned int len = 0; buffer->WaitForDataWithTimeout( buffer, sizeof(buf), 0, 1 ); ret = buffer->GetData( buffer, sizeof(buf), buf, &len ); if (ret == DFB_OK && len) write( fd, buf, len ); if (ret == DFB_EOF) break; } close( fd ); return (void*)0; }
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; }