Void CapBuf_blackFill(Buffer_Handle hBuf) { switch (BufferGfx_getColorSpace(hBuf)) { case ColorSpace_YUV422PSEMI: { Int8 *yPtr = Buffer_getUserPtr(hBuf); Int32 ySize = Buffer_getSize(hBuf) / 2; Int8 *cbcrPtr = yPtr + ySize; Int bpp = ColorSpace_getBpp(ColorSpace_YUV422PSEMI); Int y; BufferGfx_Dimensions dim; UInt32 offset; BufferGfx_getDimensions(hBuf, &dim); offset = dim.y * dim.lineLength + dim.x * bpp / 8; for (y = 0; y < dim.height; y++) { memset(yPtr + offset, 0x0, dim.width * bpp / 8); yPtr += dim.lineLength; } for (y = 0; y < dim.height; y++) { memset(cbcrPtr + offset, 0x80, dim.width * bpp / 8); cbcrPtr += dim.lineLength; } break; } case ColorSpace_YUV420PSEMI: { Int8 *yPtr = Buffer_getUserPtr(hBuf); Int32 ySize = Buffer_getSize(hBuf) * 2 / 3; Int8 *cbcrPtr = yPtr + ySize; Int bpp = ColorSpace_getBpp(ColorSpace_YUV420PSEMI); Int y; BufferGfx_Dimensions dim; BufferGfx_getDimensions(hBuf, &dim); yPtr += dim.y * dim.lineLength + dim.x * bpp / 8; for (y = 0; y < dim.height; y++) { memset(yPtr, 0x0, dim.width * bpp / 8); yPtr += dim.lineLength; } cbcrPtr += dim.y * dim.lineLength / 2 + dim.x * bpp / 8; for (y = 0; y < dim.height / 2; y++) { memset(cbcrPtr, 0x80, dim.width * bpp / 8); cbcrPtr += dim.lineLength; } break; } case ColorSpace_UYVY: { Int32 *bufPtr = (Int32*)Buffer_getUserPtr(hBuf); Int bpp = ColorSpace_getBpp(ColorSpace_UYVY); Int i, j; BufferGfx_Dimensions dim; BufferGfx_getDimensions(hBuf, &dim); bufPtr += (dim.y * dim.lineLength + dim.x * bpp / 8) / sizeof(Int32); /* Make sure display buffer is 4-byte aligned */ assert((((UInt32) bufPtr) & 0x3) == 0); for (i = 0; i < dim.height; i++) { for (j = 0; j < dim.width / 2; j++) { bufPtr[j] = UYVY_BLACK; } bufPtr += dim.lineLength / sizeof(Int32); } break; } case ColorSpace_RGB565: { memset(Buffer_getUserPtr(hBuf), 0, Buffer_getSize(hBuf)); break; } default: { ERR("Unsupported color space (%d) for _Dmai_blackFill\n", BufferGfx_getColorSpace(hBuf)); break; } } }
/****************************************************************************** * Idec1_process ******************************************************************************/ Int Idec1_process(Idec1_Handle hId, Buffer_Handle hInBuf, Buffer_Handle hOutBuf) { BufferGfx_Dimensions dim; IMGDEC1_DynamicParams dynParams; IMGDEC1_InArgs inArgs; IMGDEC1_OutArgs outArgs; IMGDEC1_Status decStatus; XDM1_BufDesc inBufDesc; XDM1_BufDesc outBufDesc; XDAS_Int32 status; XDAS_Int8 * inPtr; XDAS_Int8 * outPtr; UInt32 offset = 0; UInt32 i; assert(hId); assert(hInBuf); assert(hOutBuf); assert(Buffer_getSize(hInBuf)); assert(Buffer_getUserPtr(hInBuf)); assert(Buffer_getUserPtr(hOutBuf)); assert(Buffer_getNumBytesUsed(hInBuf)); assert(Buffer_getSize(hOutBuf)); assert(Buffer_getType(hOutBuf) == Buffer_Type_GRAPHICS); BufferGfx_getDimensions(hOutBuf, &dim); inPtr = Buffer_getUserPtr(hInBuf); outPtr = Buffer_getUserPtr(hOutBuf); inArgs.size = sizeof(IMGDEC1_InArgs); inArgs.numBytes = Buffer_getNumBytesUsed(hInBuf); outArgs.size = sizeof(IMGDEC1_OutArgs); inBufDesc.numBufs = 1; outBufDesc.numBufs = hId->minNumOutBufs; inBufDesc.descs[0].buf = inPtr; inBufDesc.descs[0].bufSize = Buffer_getSize(hInBuf); for(i = 0; i < hId->minNumOutBufs; i++) { outBufDesc.descs[i].buf = (XDAS_Int8 *)((unsigned int)outPtr + offset); offset += hId->minOutBufSize[i]; outBufDesc.descs[i].bufSize = hId->minOutBufSize[i]; } /* Decode image buffer */ status = IMGDEC1_process(hId->hDecode, &inBufDesc, &outBufDesc, &inArgs, &outArgs); Buffer_setNumBytesUsed(hInBuf, outArgs.bytesConsumed); if (status != IMGDEC1_EOK) { if (XDM_ISFATALERROR(outArgs.extendedError)) { Dmai_err2("IMGDEC1_process() failed with error (%d ext: 0x%x)\n", (Int)status, (Uns) outArgs.extendedError); return Dmai_EFAIL; } else { Dmai_dbg1("IMGDEC1_process() non-fatal error 0x%x\n", (Uns) outArgs.extendedError); return Dmai_EBITERROR; } } /* Get the dynamic codec status */ decStatus.data.buf = NULL; decStatus.size = sizeof(IMGDEC1_Status); dynParams.size = sizeof(IMGDEC1_DynamicParams); status = IMGDEC1_control(hId->hDecode, XDM_GETSTATUS, &dynParams, &decStatus); if (status != IMGDEC1_EOK) { Dmai_err1("XDM_GETSTATUS failed, status=%d\n", status); return Dmai_EFAIL; } /* Set output Color Format */ switch (decStatus.outputChromaFormat) { case XDM_YUV_422ILE: BufferGfx_setColorSpace (hOutBuf, ColorSpace_UYVY); break; case XDM_YUV_420P: BufferGfx_setColorSpace (hOutBuf, ColorSpace_YUV420P); break; case XDM_YUV_422P: BufferGfx_setColorSpace (hOutBuf, ColorSpace_YUV422P); break; case XDM_YUV_444P: BufferGfx_setColorSpace (hOutBuf, ColorSpace_YUV444P); break; case XDM_GRAY: BufferGfx_setColorSpace (hOutBuf, ColorSpace_GRAY); break; default: printf("Unsupported output color space.\n"); return Dmai_EFAIL; } dim.x = dim.y = 0; dim.width = decStatus.outputWidth; dim.height = decStatus.outputHeight; dim.lineLength = decStatus.outputWidth * ColorSpace_getBpp(BufferGfx_getColorSpace(hOutBuf)) / 8; if (BufferGfx_setDimensions(hOutBuf, &dim) < 0) { Dmai_err0("Frame does not fit in allocated buffer\n"); return Dmai_EFAIL; } return Dmai_EOK; }
/****************************************************************************** * _Dmai_blackFill ******************************************************************************/ Void _Dmai_blackFill(Buffer_Handle hBuf) { switch (BufferGfx_getColorSpace(hBuf)) { case ColorSpace_YUV422PSEMI: { Int8 *yPtr = Buffer_getUserPtr(hBuf); Int32 ySize = Buffer_getSize(hBuf) / 2; Int8 *cbcrPtr = yPtr + ySize; Int32 cbCrSize = Buffer_getSize(hBuf) - ySize; Int i; /* Fill the Y plane */ for (i = 0; i < ySize; i++) { yPtr[i] = 0x0; } for (i = 0; i < cbCrSize; i++) { cbcrPtr[i] = 0x80; } break; } case ColorSpace_YUV420PSEMI: { Int8 *bufPtr = Buffer_getUserPtr(hBuf); Int y; Int bpp = ColorSpace_getBpp(ColorSpace_YUV420PSEMI); BufferGfx_Dimensions dim; BufferGfx_getDimensions(hBuf, &dim); for (y = 0; y < dim.height; y++) { memset(bufPtr, 0x0, dim.width * bpp / 8); bufPtr += dim.lineLength; } for (y = 0; y < (dim.height / 2); y++) { memset(bufPtr, 0x80, dim.width * bpp / 8); bufPtr += dim.lineLength; } break; } case ColorSpace_UYVY: { Int32 *bufPtr = (Int32*)Buffer_getUserPtr(hBuf); Int32 bufSize = Buffer_getSize(hBuf) / sizeof(Int32); Int i; /* Make sure display buffer is 4-byte aligned */ assert((((UInt32) bufPtr) & 0x3) == 0); for (i = 0; i < bufSize; i++) { bufPtr[i] = UYVY_BLACK; } break; } case ColorSpace_RGB565: { memset(Buffer_getUserPtr(hBuf), 0, Buffer_getSize(hBuf)); break; } default: Dmai_err0("Unsupported color space for _Dmai_blackFill\n"); break; } }