// ---------------------------------------------------------------------------- bool BackupBufPusher::push(const sp<BackupBuffer>& in) { if ((in == NULL) || (in->mGraphicBuffer == NULL)) { return false; } sp<BackupBuffer>& buffer = editHead(); // check property of GraphicBuffer, realloc if needed bool needCreate = false; if ((buffer == NULL) || (buffer->mGraphicBuffer == NULL)) { needCreate = true; } else { if ((buffer->mGraphicBuffer->width != in->mGraphicBuffer->width) || (buffer->mGraphicBuffer->height != in->mGraphicBuffer->height) || (buffer->mGraphicBuffer->format != in->mGraphicBuffer->format)) { needCreate = true; XLOGD("[%s] geometry changed, backup=(%d, %d, %d) => active=(%d, %d, %d)", __func__, buffer->mGraphicBuffer->width, buffer->mGraphicBuffer->height, buffer->mGraphicBuffer->format, in->mGraphicBuffer->width, in->mGraphicBuffer->height, in->mGraphicBuffer->format); } } if (needCreate) { sp<GraphicBuffer> newGraphicBuffer = new GraphicBuffer( in->mGraphicBuffer->width, in->mGraphicBuffer->height, in->mGraphicBuffer->format, in->mGraphicBuffer->usage); if (newGraphicBuffer == NULL) { XLOGE("[%s] alloc GraphicBuffer failed", __func__); return false; } if (buffer == NULL) { buffer = new BackupBuffer(); if (buffer == NULL) { XLOGE("[%s] alloc BackupBuffer failed", __func__); return false; } } buffer->mGraphicBuffer = newGraphicBuffer; } int width = in->mGraphicBuffer->width; int height = in->mGraphicBuffer->height; int format = in->mGraphicBuffer->format; int usage = in->mGraphicBuffer->usage; int stride = in->mGraphicBuffer->stride; uint32_t bits = getGraphicBufferUtil().getBitsPerPixel(format); status_t err; // backup void *src; void *dst; err = in->mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &src); if (err != NO_ERROR) { XLOGE("[%s] lock GraphicBuffer failed", __func__); return false; } err = buffer->mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN | GraphicBuffer::USAGE_SW_WRITE_OFTEN, &dst); if (err != NO_ERROR) { in->mGraphicBuffer->unlock(); XLOGE("[%s] lock backup buffer failed", __func__); return false; } memcpy(dst, src, (stride * height * bits) >> 3); buffer->mGraphicBuffer->unlock(); in->mGraphicBuffer->unlock(); // update timestamp buffer->mTimeStamp = in->mTimeStamp; buffer->mSourceHandle = in->mGraphicBuffer->handle; return true; }
bool BackupBufPusher::push(const sp<BackupBuffer>& in) { if ((in == NULL) || (in->mGraphicBuffer == NULL)) { XLOGW("[%s] input buffer is NULL", __func__); return false; } sp<BackupBuffer>& buffer = editHead(); // check property of GraphicBuffer, realloc if needed bool needCreate = false; if ((buffer == NULL) || (buffer->mGraphicBuffer == NULL)) { needCreate = true; XLOGD("[%s] buffer head is NULL, create it", __func__); } else { if ((buffer->mGraphicBuffer->width != in->mGraphicBuffer->width) || (buffer->mGraphicBuffer->height != in->mGraphicBuffer->height) || (buffer->mGraphicBuffer->format != in->mGraphicBuffer->format)) { needCreate = true; XLOGD("[%s] geometry changed, backup=(%d, %d, %d) ==> active=(%d, %d, %d)", __func__, buffer->mGraphicBuffer->width, buffer->mGraphicBuffer->height, buffer->mGraphicBuffer->format, in->mGraphicBuffer->width, in->mGraphicBuffer->height, in->mGraphicBuffer->format); } } if (needCreate) { sp<GraphicBuffer> newGraphicBuffer = new GraphicBuffer( in->mGraphicBuffer->width, in->mGraphicBuffer->height, in->mGraphicBuffer->format, in->mGraphicBuffer->usage); if (newGraphicBuffer == NULL) { XLOGE("[%s] alloc GraphicBuffer failed", __func__); return false; } if (buffer == NULL) { buffer = new BackupBuffer(); if (buffer == NULL) { XLOGE("[%s] alloc BackupBuffer failed", __func__); return false; } } buffer->mGraphicBuffer = newGraphicBuffer; } float bpp = 0.0f; int width = in->mGraphicBuffer->width; int height = in->mGraphicBuffer->height; int format = in->mGraphicBuffer->format; int usage = in->mGraphicBuffer->usage; int stride = in->mGraphicBuffer->stride; status_t err; switch (format) { case PIXEL_FORMAT_RGBA_8888: case PIXEL_FORMAT_BGRA_8888: case PIXEL_FORMAT_RGBX_8888: case 0x1ff: // tricky format for SGX_COLOR_FORMAT_BGRX_8888 in fact bpp = 4.0; break; case PIXEL_FORMAT_RGB_565: bpp = 2.0; break; case HAL_PIXEL_FORMAT_I420: bpp = 1.5; break; case HAL_PIXEL_FORMAT_YV12: bpp = 1.5; break; default: XLOGE("[%s] cannot dump format:%d", __func__, format); break; } // backup void *src; void *dst; err = in->mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &src); if (err != NO_ERROR) { XLOGE("[%s] lock GraphicBuffer failed", __func__); return false; } err = buffer->mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN | GraphicBuffer::USAGE_SW_WRITE_OFTEN, &dst); if (err != NO_ERROR) { in->mGraphicBuffer->unlock(); XLOGE("[%s] lock backup buffer failed", __func__); return false; } memcpy(dst, src, stride * height * bpp); buffer->mGraphicBuffer->unlock(); in->mGraphicBuffer->unlock(); // update timestamp buffer->mTimeStamp = in->mTimeStamp; return true; }