123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 |
- // SPDX-License-Identifier: LGPL-2.1 OR BSD-3-Clause
- /*
- * Copyright (c) 2019, Chips&Media
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #include <string.h>
- #include <stdarg.h>
- #include "main_helper.h"
- extern YuvFeederImpl loaderYuvFeederImpl;
- extern YuvFeederImpl cfbcYuvFeederImpl;
- BOOL loaderYuvFeeder_Create(
- YuvFeederImpl *impl,
- const char* path,
- Uint32 packed,
- Uint32 fbStride,
- Uint32 fbHeight
- );
- BOOL loaderYuvFeeder_Destory(
- YuvFeederImpl *impl
- );
- BOOL loaderYuvFeeder_Feed(
- YuvFeederImpl* impl,
- Int32 coreIdx,
- FrameBuffer* fb,
- size_t picWidth,
- size_t picHeight,
- Uint32 srcFbIndex,
- void* arg
- );
- BOOL loaderYuvFeeder_Configure(
- YuvFeederImpl* impl,
- Uint32 cmd,
- YuvInfo yuv
- );
- BOOL cfbcYuvFeeder_Create(
- YuvFeederImpl *impl,
- const char* path,
- Uint32 packed,
- Uint32 fbStride,
- Uint32 fbHeight
- );
- BOOL cfbcYuvFeeder_Destory(
- YuvFeederImpl *impl
- );
- BOOL cfbcYuvFeeder_Feed(
- YuvFeederImpl* impl,
- Int32 coreIdx,
- FrameBuffer* fb,
- size_t picWidth,
- size_t picHeight,
- Uint32 srcFbIndex,
- void* arg
- );
- BOOL cfbcYuvFeeder_Configure(
- YuvFeederImpl* impl,
- Uint32 cmd,
- YuvInfo yuv
- );
- static BOOL yuvYuvFeeder_Create(
- YuvFeederImpl *impl,
- const char* path,
- Uint32 packed,
- Uint32 fbStride,
- Uint32 fbHeight)
- {
- yuvContext* ctx;
- osal_file_t* fp;
- Uint8* pYuv;
- if ((fp=osal_fopen(path, "rb")) == NULL) {
- VLOG(ERR, "%s:%d failed to open yuv file: %s\n", __FUNCTION__, __LINE__, path);
- return FALSE;
- }
- if ( packed == 1 )
- pYuv = osal_malloc(fbStride*fbHeight*3*2*2);//packed, unsigned short
- else
- pYuv = osal_malloc(fbStride*fbHeight*3*2);//unsigned short
- if ((ctx=(yuvContext*)osal_malloc(sizeof(yuvContext))) == NULL) {
- osal_free(pYuv);
- osal_fclose(fp);
- return FALSE;
- }
- osal_memset(ctx, 0, sizeof(yuvContext));
- ctx->fp = fp;
- ctx->pYuv = pYuv;
- impl->context = ctx;
- return TRUE;
- }
- static BOOL yuvYuvFeeder_Destory(
- YuvFeederImpl *impl
- )
- {
- yuvContext* ctx = (yuvContext*)impl->context;
- osal_fclose(ctx->fp);
- osal_free(ctx->pYuv);
- osal_free(ctx);
- return TRUE;
- }
- static BOOL yuvYuvFeeder_Feed(
- YuvFeederImpl* impl,
- Int32 coreIdx,
- FrameBuffer* fb,
- size_t picWidth,
- size_t picHeight,
- Uint32 srcFbIndex,
- void* arg
- )
- {
- yuvContext* ctx = (yuvContext*)impl->context;
- Uint8* pYuv = ctx->pYuv;
- size_t frameSize;
- size_t frameSizeY;
- size_t frameSizeC;
- Int32 bitdepth=0;
- Int32 yuv3p4b=0;
- Int32 packedFormat=0;
- Uint32 outWidth=0;
- Uint32 outHeight=0;
- CalcYuvSize(fb->format, picWidth, picHeight, fb->cbcrInterleave, &frameSizeY, &frameSizeC, &frameSize, &bitdepth, &packedFormat, &yuv3p4b);
- // Load source one picture image to encode to SDRAM frame buffer.
- if (!osal_fread(pYuv, 1, frameSize, ctx->fp)) {
- if (osal_feof(ctx->fp) == 0)
- VLOG(ERR, "Yuv Data osal_fread failed file handle is 0x%x\n", ctx->fp);
- return FALSE;
- }
- if (fb->mapType == LINEAR_FRAME_MAP ) {
- outWidth = (yuv3p4b&&packedFormat==0) ? ((picWidth+31)/32)*32 : picWidth;
- outHeight = (yuv3p4b) ? ((picHeight+7)/8)*8 : picHeight;
- if ( yuv3p4b && packedFormat) {
- outWidth = ((picWidth*2)+2)/3*4;
- }
- else if(packedFormat) {
- outWidth *= 2; // 8bit packed mode(YUYV) only. (need to add 10bit cases later)
- if (bitdepth != 0) // 10bit packed
- outWidth *= 2;
- }
- LoadYuvImageByYCbCrLine(impl->handle, coreIdx, pYuv, outWidth, outHeight, fb, srcFbIndex);
- //LoadYuvImageBurstFormat(coreIdx, pYuv, outWidth, outHeight, fb, ctx->srcPlanar);
- }
- else {
- TiledMapConfig mapConfig;
- osal_memset((void*)&mapConfig, 0x00, sizeof(TiledMapConfig));
- if (arg != NULL) {
- osal_memcpy((void*)&mapConfig, arg, sizeof(TiledMapConfig));
- }
- LoadTiledImageYuvBurst(impl->handle, coreIdx, pYuv, picWidth, picHeight, fb, mapConfig);
- }
- return TRUE;
- }
- static BOOL yuvYuvFeeder_Configure(
- YuvFeederImpl* impl,
- Uint32 cmd,
- YuvInfo yuv
- )
- {
- yuvContext* ctx = (yuvContext*)impl->context;
- UNREFERENCED_PARAMETER(cmd);
- ctx->fbStride = yuv.srcStride;
- ctx->cbcrInterleave = yuv.cbcrInterleave;
- ctx->srcPlanar = yuv.srcPlanar;
- return TRUE;
- }
- YuvFeederImpl yuvYuvFeederImpl = {
- NULL,
- yuvYuvFeeder_Create,
- yuvYuvFeeder_Feed,
- yuvYuvFeeder_Destory,
- yuvYuvFeeder_Configure
- };
- /*lint -esym(438, ap) */
- YuvFeeder YuvFeeder_Create(
- Uint32 type,
- const char* srcFilePath,
- YuvInfo yuvInfo
- )
- {
- AbstractYuvFeeder *feeder;
- YuvFeederImpl *impl;
- BOOL success = FALSE;
- if (srcFilePath == NULL) {
- VLOG(ERR, "%s:%d src path is NULL\n", __FUNCTION__, __LINE__);
- return NULL;
- }
- // Create YuvFeeder for type.
- switch (type) {
- case SOURCE_YUV:
- impl = osal_malloc(sizeof(YuvFeederImpl));
- impl->Create = yuvYuvFeeder_Create;
- impl->Feed = yuvYuvFeeder_Feed;
- impl->Destroy = yuvYuvFeeder_Destory;
- impl->Configure = yuvYuvFeeder_Configure;
- if ((success=impl->Create(impl, srcFilePath, yuvInfo.packedFormat, yuvInfo.srcStride, yuvInfo.srcHeight)) == TRUE) {
- impl->Configure(impl, 0, yuvInfo);
- }
- break;
- case SOURCE_YUV_WITH_LOADER:
- impl = osal_malloc(sizeof(YuvFeederImpl));
- impl->Create = loaderYuvFeeder_Create;
- impl->Feed = loaderYuvFeeder_Feed;
- impl->Destroy = loaderYuvFeeder_Destory;
- impl->Configure = loaderYuvFeeder_Configure;
- if ((success=impl->Create(impl, srcFilePath, yuvInfo.packedFormat, yuvInfo.srcStride, yuvInfo.srcHeight)) == TRUE) {
- impl->Configure(impl, 0, yuvInfo);
- }
- break;
- default:
- VLOG(ERR, "%s:%d Unknown YuvFeeder Type\n", __FUNCTION__, __LINE__);
- return NULL;
- }
- if (success == FALSE)
- return NULL;
- feeder = (AbstractYuvFeeder*)osal_malloc(sizeof(AbstractYuvFeeder));
- if ( !feeder )
- return NULL;
- feeder->impl = impl;
- return feeder;
- }
- /*lint +esym(438, ap) */
- BOOL YuvFeeder_Destroy(
- YuvFeeder feeder
- )
- {
- YuvFeederImpl* impl = NULL;
- AbstractYuvFeeder* yuvfeeder = (AbstractYuvFeeder*)feeder;
- if (yuvfeeder == NULL) {
- VLOG(ERR, "%s:%d Invalid handle\n", __FUNCTION__, __LINE__);
- return FALSE;
- }
- impl = yuvfeeder->impl;
- impl->Destroy(impl);
- osal_free(impl);
- return TRUE;
- }
- BOOL YuvFeeder_Feed(
- YuvFeeder feeder,
- Uint32 coreIdx,
- FrameBuffer* fb,
- size_t picWidth,
- size_t picHeight,
- Uint32 srcFbIndex,
- void* arg
- )
- {
- YuvFeederImpl* impl = NULL;
- AbstractYuvFeeder* absFeeder = (AbstractYuvFeeder*)feeder;
- Int32 ret;
- if (absFeeder == NULL) {
- VLOG(ERR, "%s:%d Invalid handle\n", __FUNCTION__, __LINE__);
- return FALSE;
- }
- impl = absFeeder->impl;
- ret = impl->Feed(impl, coreIdx, fb, picWidth, picHeight, srcFbIndex, arg);
- return ret;
- }
|