📄 dvb_osd.c
字号:
u8 *pu8BitmapBuffer)
{
EN_CT_OSD_FRAME_REGION enCtRegion = EN_CT_OSD_FRAME_REGION_BITMAP;
if (enCurrentOSDMode == EN_OSD_MODE_DISABLE)
{
return EN_OSD_ERROR_DATA_FORMAT;
}
enCtRegion = OSD_GetCtRegionByDvbRegion(u16RegionId);
if (enCtRegion>=EN_CT_OSD_FRAME_REGION_NUMBER)
{
return EN_OSD_ERROR_DATA_FORMAT;
}
GrFrame_CopyRegionDataToBitmap(
enCtRegion,
u16X,
u16Y,
u16Width,
u16Height,
pu8BitmapBuffer ) ;
return EN_OSD_NO_ERROR;
}
#endif // end #ifdef NO_BMP_REGION
EN_OSD_ERROR DVB_OSD_CopyBitmapDataToRegion(
u16 u16RegionId,
u16 u16X,
u16 u16Y,
u16 u16Width,
u16 u16Height,
u8 *pu8BitmapBuffer)
{
EN_CT_OSD_FRAME_REGION enCtRegion = EN_CT_OSD_FRAME_REGION_WORKING;
if (enCurrentOSDMode == EN_OSD_MODE_DISABLE)
{
return EN_OSD_ERROR_DATA_FORMAT;
}
enCtRegion = OSD_GetCtRegionByDvbRegion(u16RegionId);
if (enCtRegion>=EN_CT_OSD_FRAME_REGION_NUMBER)
{
return EN_OSD_ERROR_DATA_FORMAT;
}
GrFrame_CopyBitmapDataToRegion(
enCtRegion,
u16X ,
u16Y,
u16Width,
u16Height,
pu8BitmapBuffer,
u16AreaCopyColorKeyIndex ) ; // color key always enable in this function
return EN_OSD_NO_ERROR;
}
/*******************************************************************************************/
EN_OSD_ERROR DVB_OSDBitmap_Show (u16 u16PosX, u16 u16PosY, u8 u8BmpIndex)
{
CT_OSD_AreaCopyParam stAreaCopy;
u16 u16Temp1 = 0;
bool8 b8CtStatus = FALSE;
if (enCurrentOSDMode == EN_OSD_MODE_DISABLE)
return EN_OSD_ERROR_DATA_FORMAT;
for(u16Temp1 = 0;u16Temp1 < u16ToatalLoadBmp; u16Temp1++)
{
if(u8BmpIndex == BmpParameter[u16Temp1].u8BmpIndex)
{
break;
}
}
if(u16Temp1 == u16ToatalLoadBmp)
{
return EN_OSD_ERROR_BMP_INDEX;
}
stAreaCopy.enSrcRegion = EN_CT_OSD_FRAME_REGION_WORKING;
stAreaCopy.u16SrcPosX = BmpParameter[u16Temp1].u16PosX;
stAreaCopy.u16SrcPosY = BmpParameter[u16Temp1].u16PosY;
stAreaCopy.u16Width = BmpParameter[u16Temp1].u16Width;
stAreaCopy.u16Height = BmpParameter[u16Temp1].u16Height;
stAreaCopy.enDstRegion = EN_CT_OSD_FRAME_REGION_DISPLAY;
stAreaCopy.u16DstPosX = u16PosX;
stAreaCopy.u16DstPosY = u16PosY;
stAreaCopy.u16ColorKeyIdx = u16AreaCopyColorKeyIndex;
stAreaCopy.b8ColorKey = b8AreaCopyColorKeyEnable;
#ifdef OSD_DIRECT_ACCESS_MODE
b8CtStatus = GrFrame_RegionCopy(stAreaCopy.enDstRegion,
stAreaCopy.u16DstPosX ,
stAreaCopy.u16DstPosY,
stAreaCopy.enSrcRegion,
stAreaCopy.u16SrcPosX,
stAreaCopy.u16SrcPosY,
stAreaCopy.u16Width,
stAreaCopy.u16Height,
stAreaCopy.u16ColorKeyIdx,
stAreaCopy.b8ColorKey);
#else
b8CtStatus = CT_OSD_AreaCopy(u16OSDFrameHandleID, &stAreaCopy);
#endif
if (b8CtStatus!=TRUE)
{
}
return EN_OSD_NO_ERROR;
}
#ifndef NO_BMP_REGION
/*******************************************************************************************/
EN_OSD_ERROR DVB_OSDSystemIcon_Show (u16 u16PosX, u16 u16PosY, u16 u16SrcX, u16 u16SrcY, u16 u16SrcW, u16 u16SrcH)
{
CT_OSD_AreaCopyParam stAreaCopy;
bool8 b8CtStatus = FALSE;
if (enCurrentOSDMode == EN_OSD_MODE_DISABLE)
return EN_OSD_ERROR_DATA_FORMAT;
stAreaCopy.enSrcRegion = EN_CT_OSD_FRAME_REGION_BITMAP;
stAreaCopy.u16SrcPosX = u16SrcX;
stAreaCopy.u16SrcPosY = u16SrcY;
stAreaCopy.u16Width = u16SrcW;
stAreaCopy.u16Height = u16SrcH;
stAreaCopy.enDstRegion = EN_CT_OSD_FRAME_REGION_DISPLAY;
stAreaCopy.u16DstPosX = u16PosX;
stAreaCopy.u16DstPosY = u16PosY;
stAreaCopy.u16ColorKeyIdx = u16AreaCopyColorKeyIndex;
stAreaCopy.b8ColorKey = b8AreaCopyColorKeyEnable;
#ifdef OSD_DIRECT_ACCESS_MODE
b8CtStatus = GrFrame_RegionCopy(stAreaCopy.enDstRegion,
stAreaCopy.u16DstPosX ,
stAreaCopy.u16DstPosY,
stAreaCopy.enSrcRegion,
stAreaCopy.u16SrcPosX,
stAreaCopy.u16SrcPosY,
stAreaCopy.u16Width,
stAreaCopy.u16Height,
stAreaCopy.u16ColorKeyIdx,
stAreaCopy.b8ColorKey);
#else
b8CtStatus = CT_OSD_AreaCopy(u16OSDFrameHandleID, &stAreaCopy);
#endif
if (b8CtStatus!=TRUE)
{
return EN_OSD_ERROR_BMP_SIZE;
}
return EN_OSD_NO_ERROR;
}
#endif // end #ifndef NO_BMP_REGION
/*******************************************************************************************/
void DVB_OSDBitmap_UnLoad ( u8 u8BmpIndex )
{
u16 u16Temp1 = 0;
u16 u16Temp2 = 0;
CT_OSD_FillRectParam stFillRect;
if (enCurrentOSDMode == EN_OSD_MODE_DISABLE)
return;
OSD_DEBUG(("MMMMMMMMMM unload %hx\n", u8BmpIndex));
for(u16Temp1 = 0;u16Temp1 < u16ToatalLoadBmp; u16Temp1++)
{
if(u8BmpIndex == BmpParameter[u16Temp1].u8BmpIndex)
{
break;
}
}
if(u16Temp1 == u16ToatalLoadBmp)
{
//return EN_OSD_ERROR_BMP_INDEX;
}
else
{
stFillRect.enRegion = EN_CT_OSD_FRAME_REGION_WORKING;
stFillRect.u16PosX = BmpParameter[u16Temp1].u16PosX;
stFillRect.u16PosY = BmpParameter[u16Temp1].u16PosY;
stFillRect.u16Width = BmpParameter[u16Temp1].u16Width;
stFillRect.u16Height = BmpParameter[u16Temp1].u16Height;
stFillRect.u16ColorIdx = u16TransponderColorIdx;
#ifdef OSD_DIRECT_ACCESS_MODE
GrFrame_FillRectangle( stFillRect.enRegion,
stFillRect.u16PosX,
stFillRect.u16PosY,
stFillRect.u16Width,
stFillRect.u16Height,
(u8)stFillRect.u16ColorIdx);
#else
CT_OSD_FillRectangle(u16OSDFrameHandleID, &stFillRect);
#endif
if (CT_OS_WaitOnSemaphore(&stDvbOsdSemaphore, CTOS_WAIT)!= EN_CTOS_SUCCESS)
{
return;
}
// reflash database
for(u16Temp2 = u16Temp1;u16Temp2 < (u16ToatalLoadBmp-1); u16Temp2++)
{
BmpParameter[u16Temp2].u8BmpIndex = BmpParameter[u16Temp2+1].u8BmpIndex;
BmpParameter[u16Temp2].u16PosX = BmpParameter[u16Temp2+1].u16PosX;
BmpParameter[u16Temp2].u16PosY = BmpParameter[u16Temp2+1].u16PosY;
BmpParameter[u16Temp2].u16Width = BmpParameter[u16Temp2+1].u16Width;
BmpParameter[u16Temp2].u16Height = BmpParameter[u16Temp2+1].u16Height;
}
BmpParameter[u16ToatalLoadBmp-1].u8BmpIndex = 0;
BmpParameter[u16ToatalLoadBmp-1].u16PosX = 0;
BmpParameter[u16ToatalLoadBmp-1].u16PosY = 0;
BmpParameter[u16ToatalLoadBmp-1].u16Width = 0;
BmpParameter[u16ToatalLoadBmp-1].u16Height = 0;
u16ToatalLoadBmp--;
// Free Semaphore
CT_OS_FreeSemaphore(&stDvbOsdSemaphore);
}
}
/*******************************************************************************************/
EN_OSD_ERROR DVB_OSDPalette_Setup (u16 u16Index, u32 u32RGBColor, bool8 b8MixEnable)
{
u32 u32YUV = 0;
// u8 u8Y = 0;
// u8 u8U = 0;
// u8 u8V = 0;
if ((u32RGBColor&OSD_PALETTE_YUV_MASK)!=OSD_PALETTE_YUV_MASK)
{
u32YUV = COMUTL_RGB2YUV(u32RGBColor);
// u8Y = (u8)(u32YUV>>16);
// u8U = (u8)(u32YUV>>8);
// u8V = (u8)(u32YUV);
// u32YUV = MAKE_YUV(u8Y, u8U, u8V);
}
else
{
u32YUV = u32RGBColor;
}
CT_OSD_PaletteSetup(u16Index, u32YUV , b8MixEnable);
return EN_OSD_NO_ERROR;
}
/*******************************************************************************************/
#if defined (CT216S) || defined (CT216T) || defined (CT216H)
EN_OSD_ERROR DVB_OSDPaletteAlpha_Setup (u16 u16Index, u8 u8AlphaValue, bool8 b8MixEnable)
{
CT_OSD_PaletteAlphaSetup(u16Index, u8AlphaValue, b8MixEnable);
return EN_OSD_NO_ERROR;
}
#endif
/*******************************************************************************************/
void DVB_OSDCleanScreen (void)
{
if (enCurrentOSDMode == EN_OSD_MODE_DISABLE)
return;
OSD_ClearRegion(enOsdOperationCtRegion);
}
/*******************************************************************************************/
bool8 DVB_OSD_Initial(DVB_OSD_InitParameters* pstParam)
{
CT_OSD_ColorPatelleInitParams stColorPaletteParams;
CT_OSD_LinemapInitParams stLinemapParams;
CT_OSD_FrameInitParams stFrameParams;
if (pstParam==NULL)
{
OSD_DEBUG(("\n>> DVB_OSD_Initial() : Parameter Fail\n"));
return FALSE;
}
if (b8DvbOsdInit==TRUE)
{
return TRUE;
}
if (CT_OS_CreateSemaphore(&stDvbOsdSemaphore, "OSDSEM", 1, EN_CTOS_SUSPEND_FIFO)!= EN_CTOS_SUCCESS)
{
return FALSE;
}
u16OSDFrameHandleID = CT_OSD_FRAME_ERROR_HANDLE_ID;
enOsdOperationCtRegion = EN_CT_OSD_FRAME_REGION_DISPLAY;
enCurrentOSDMode = EN_OSD_MODE_DISABLE;
u16ToatalLoadBmp = 0;
memset(BmpParameter,0,sizeof(DVB_OSD_BmpParameter)*MAX_BMP_IN_SDRAM_NUMBER);
stColorPaletteParams.u32Addr = pstParam->stColorPaletteParams.u32Addr;
stColorPaletteParams.u32Len = pstParam->stColorPaletteParams.u32Len;
stLinemapParams.u32MaxCmdNum = pstParam->stLinemapParams.u32MaxCmdNum;
stLinemapParams.u32MaxLineNum = pstParam->stLinemapParams.u32MaxLineNum;
#ifdef DVB_MallocLineMap
gen_point = 322;
if(pstParam->stLinemapParams.u32Len == 0)
{
stLinemapParams.u32Addr = 0;
}
else
{
stLinemapParams.u32Addr = (u32)DVB_MemoryAllocate(4*(pstParam->stLinemapParams.u32MaxCmdNum)*(pstParam->stLinemapParams.u32MaxLineNum+1));
}
#else
stLinemapParams.u32Addr = pstParam->stLinemapParams.u32Addr;
#endif
stLinemapParams.u32Len = pstParam->stLinemapParams.u32Len;
stFrameParams.u32FrameBufferAddr = pstParam->stFrameParams.u32FrameBufferAddr;
stFrameParams.u16RegionWidth = pstParam->stFrameParams.u16RegionWidth;
stFrameParams.u16DisplayRegionHeight = pstParam->stFrameParams.u16DisplayRegionHeight;
stFrameParams.u16WorkingRegionHeight = pstParam->stFrameParams.u16WorkingRegionHeight;
stFrameParams.u16BitmapRegionHeight = pstParam->stFrameParams.u16BitmapRegionHeight;
stFrameParams.u16PAL_VisibleHeight = pstParam->stFrameParams.u16PAL_VisibleHeight;
stFrameParams.u16NTSC_VisibleHeight = pstParam->stFrameParams.u16NTSC_VisibleHeight;
stFrameParams.u16PAL_LeftTopPoint_X = pstParam->stFrameParams.u16PAL_LeftTopPoint_X;
stFrameParams.u16PAL_LeftTopPoint_Y = pstParam->stFrameParams.u16PAL_LeftTopPoint_Y;
stFrameParams.u16NTSC_LeftTopPoint_X = pstParam->stFrameParams.u16NTSC_LeftTopPoint_X;
stFrameParams.u16NTSC_LeftTopPoint_Y = pstParam->stFrameParams.u16NTSC_LeftTopPoint_Y;
if (pstParam->stFrameParams.u16ColorDepth == 1) // 4 Bit OSD
{
stFrameParams.enColorDepth = EN_CT_OSD_COLOR_DEPTH_4_BITS;
}
else
{
stFrameParams.enColorDepth = EN_CT_OSD_COLOR_DEPTH_8_BITS;
}
stFrameParams.b8LinkNextFrame = pstParam->stFrameParams.b8LinkNextFrame;
if (pstParam->stFrameParams.u16kNextFrameHandleID==OSD_FRAME_HANLDE_ERROR_ID)
{
stFrameParams.u16kNextFrameHandleID = CT_OSD_FRAME_ERROR_HANDLE_ID;
}
else
{
stFrameParams.u16kNextFrameHandleID = pstParam->stFrameParams.u16kNextFrameHandleID;
}
stFrameParams.b8DefaultPALSystem = pstParam->stFrameParams.b8DefaultPALSystem;
stFrameParams.u16DefaultMixRatio = pstParam->stFrameParams.u16DefaultMixRatio;
gen_point = 321;
pb8EnableLinemapPicture = (bool8*)DVB_MemoryAllocate(stLinemapParams.u32MaxCmdNum);
if (pb8EnableLinemapPicture==NULL)
{
OSD_DEBUG(("\n>> DVB_OSD_Initial() : DVB_MemoryAllocate Fail\n"));
return FALSE;
}
memset(pb8EnableLinemapPicture, 0, stLinemapParams.u32MaxCmdNum);
u16TransponderColorIdx = pstParam->u16TransponderColorIdx;
u16AreaCopyColorKeyIndex = pstParam->u16AreaCopyColorKeyIndex;
b8OSDDrawStringFGColorKey = pstParam->b8OSDDrawStringFGColorKey;
b8OSDDrawStringBGColorKey = pstParam->b8OSDDrawStringBGColorKey;
b8AreaCopyColorKeyEnable = pstParam->b8AreaCopyColorKeyEnable;
#if defined(CT216S)||defined(CT216T) || defined (CT216H)
if(CT_OSD_SetFormat(EN_CT_OSD_8BIT_BITMAP) == TRUE)
{
}
else
{
OSD_DEBUG(("\n>> DVB_OSD_Initial() : CT_OSD_SetFormat Fail\n
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -