📄 dvb_osd.c
字号:
if (pb8EnableLinemapPicture == NULL)
{
return FALSE;
}
CT_OSD_LinemapFillCommandData(u32LinemapAddr+4*u16LinemapDramIndex,(u32*)pu32LineMap, (u16LineMapIdx%MAX_LINE_MAP_PAGE_NUMBER));
pb8EnableLinemapPicture[u8LinemapIdx]=TRUE;
DVB_MemoryFree((u8*)pu32LineMap);
pu32LineMap=NULL;
return TRUE;
}
/*******************************************************************************************/
bool8 DVB_OSDLinemap_Load_Abs(u8 u8LinemapIdx, u32* pu32LinemapAddr)
{
u32 u32Addr = 0;
u16 u16len = 0;
if (u8LinemapIdx>=DVB_OSDLinemap_GetTotalNumber())
{
return FALSE;
}
if (CT_OSD_LinemapGetMpegBufferAddr((u16)u8LinemapIdx,&u32Addr)!=TRUE)
{
return FALSE;
}
if (pb8EnableLinemapPicture == NULL)
{
return FALSE;
}
if (pu32LinemapAddr == NULL)
{
return FALSE;
}
u16len=(u16)((*pu32LinemapAddr)>>20)+1;
u16len&=0x3FF;
CT_OSD_LinemapFillCommandData(u32Addr,(u32*)pu32LinemapAddr, u16len);
pb8EnableLinemapPicture[u8LinemapIdx]=TRUE;
return TRUE;
}
/*******************************************************************************************/
bool8 DVB_OSDLinemap_Show (u16 u16PosX, u16 u16PosY, u8 u8LinemapIdx, u8 u8ColorIdx)
{
u32 u32Addr = 0;
u32 u32Temp = 0;
CT_OSD_LinemapParam stLinemap;
bool8 b8Status = FALSE;
if (enCurrentOSDMode == EN_OSD_MODE_DISABLE)
{
return FALSE;
}
if ( u8LinemapIdx>=DVB_OSDLinemap_GetTotalNumber() )
{
return FALSE;
}
if (pb8EnableLinemapPicture == NULL)
{
return FALSE;
}
if ( pb8EnableLinemapPicture[u8LinemapIdx]==FALSE )
{
return FALSE;
}
if (CT_OSD_LinemapGetMpegBufferAddr((u16)u8LinemapIdx,&u32Addr)!=TRUE)
{
return FALSE;
}
if (CT_OSD_LinemapGetCommandData(u32Addr, (u32*)&u32Temp, 1)!=TRUE)
{
return FALSE;
}
stLinemap.u32MpegBufferAddr = u32Addr;
stLinemap.enRegion = enOsdOperationCtRegion;
stLinemap.u16LineNum = (u16)(u32Temp>>16);
stLinemap.u16PosX = u16PosX;
stLinemap.u16PosY = u16PosY;
stLinemap.u16ColorBase = (u16)u8ColorIdx;
stLinemap.b8AbsoluteColorMode = FALSE;
stLinemap.pu32CmdData = NULL;
b8Status = CT_OSD_Linmap(u16OSDFrameHandleID, &stLinemap);
return b8Status;
}
/*******************************************************************************************/
bool8 DVB_OSDLinemap_Show_Abs_Color (u16 u16PosX, u16 u16PosY, u8 u8LinemapIdx)
{
u32 u32Addr = 0;
u32 u32Temp = 0;
bool8 b8Status = FALSE;
CT_OSD_LinemapParam stLinemap;
if (enCurrentOSDMode == EN_OSD_MODE_DISABLE)
{
return FALSE;
}
if ( u8LinemapIdx>=DVB_OSDLinemap_GetTotalNumber() )
{
return FALSE;
}
if (pb8EnableLinemapPicture == NULL)
{
return FALSE;
}
if ( pb8EnableLinemapPicture[u8LinemapIdx]==FALSE )
{
return FALSE;
}
if (CT_OSD_LinemapGetMpegBufferAddr((u16)u8LinemapIdx,&u32Addr)!=TRUE)
{
return FALSE;
}
if (CT_OSD_LinemapGetCommandData(u32Addr, (u32*)&u32Temp, 1)!=TRUE)
{
return FALSE;
}
stLinemap.u32MpegBufferAddr = u32Addr;
stLinemap.enRegion = enOsdOperationCtRegion;
stLinemap.u16LineNum = (u16)(u32Temp>>20);
stLinemap.u16PosX = u16PosX;
stLinemap.u16PosY = u16PosY;
stLinemap.u16ColorBase = 0;
stLinemap.b8AbsoluteColorMode = TRUE;
stLinemap.pu32CmdData = NULL;
b8Status = CT_OSD_Linmap(u16OSDFrameHandleID, &stLinemap);
return b8Status;
}
/*******************************************************************************************/
void DVB_OSDSetTextColor (u8 u8ColorIdx)
{
CT_OS_WaitOnSemaphore(&stDvbOsdSemaphore, CTOS_WAIT);
u16OSDDrawStringFgColor = (u16)u8ColorIdx;
CT_OS_FreeSemaphore(&stDvbOsdSemaphore);
}
/*******************************************************************************************/
void DVB_OSDSaveCurrentColor(void)
{
CT_OS_WaitOnSemaphore(&stDvbOsdSemaphore, CTOS_WAIT);
u16OSDDrawStringFgColorSave=u16OSDDrawStringFgColor ;
u16OSDDrawStringBgColorSave=u16OSDDrawStringBgColor;
CT_OS_FreeSemaphore(&stDvbOsdSemaphore);
}
/*******************************************************************************************/
void DVB_OSDGetSaveColor(void)
{
CT_OS_WaitOnSemaphore(&stDvbOsdSemaphore, CTOS_WAIT);
u16OSDDrawStringFgColor =u16OSDDrawStringFgColorSave ;
u16OSDDrawStringBgColor =u16OSDDrawStringBgColorSave ;
CT_OS_FreeSemaphore(&stDvbOsdSemaphore);
}
void DVB_OSDSetBackgroundColor (u8 u8ColorIdx)
{
CT_OS_WaitOnSemaphore(&stDvbOsdSemaphore, CTOS_WAIT);
u16OSDDrawStringBgColor = (u16)u8ColorIdx;
CT_OS_FreeSemaphore(&stDvbOsdSemaphore);
}
/*******************************************************************************************/
EN_OSD_ERROR DVB_OSDBmpPalette_Load (u32 *pu32Palette, u16 u16Length)
{
if (CT_OSD_PaletteLoad(OSD_BMP_COLOR_START_INDEX, pu32Palette) != TRUE)
{
return EN_OSD_ERROR_DATA_FORMAT;
}
return EN_OSD_NO_ERROR;
}
/*******************************************************************************************/
EN_OSD_ERROR DVB_OSDBmpPalette_LoadAll (u32 *pu32PaletteData_YUV, u8 *pu8PaletteMixEn)
{
if (CT_OSD_PaletteLoadAllWithTransEn(pu32PaletteData_YUV, pu8PaletteMixEn) != TRUE)
{
return EN_OSD_ERROR_DATA_FORMAT;
}
return EN_OSD_NO_ERROR;
}
/*******************************************************************************************/
EN_OSD_ERROR DVB_OSDSystemIconPalette_Load (u32 *pu32Palette, u16 u16Length)
{
if (CT_OSD_PaletteLoad(OSD_SYSTEMICON_COLOR_START_INDEX, pu32Palette) != TRUE)
{
return EN_OSD_ERROR_DATA_FORMAT;
}
return EN_OSD_NO_ERROR;
}
/*******************************************************************************************/
EN_OSD_ERROR DVB_OSDUpdateBmpParameter(u8 u8BmpIndex,u16 u16PosX,u16 u16PosY,u16 u16Width,u16 u16Height)
{
u16 u16Top,u16Left,u16Right,u16Bottom;
u16 u16Temp1;
OSD_DEBUG(("MMMMMMMMMM load %hx\n", u8BmpIndex));
// Check if the Index is Null
if(u8BmpIndex == 0)
{
return EN_OSD_ERROR_BMP_INDEX;
}
// Check if have Null Space
if(u16ToatalLoadBmp >= MAX_BMP_IN_SDRAM_NUMBER)
{
return EN_OSD_ERROR_BMP_INDEX;
}
// Check if the Bmp index already in DataBase
for(u16Temp1 = 0;u16Temp1 < u16ToatalLoadBmp; u16Temp1++)
{
if(u8BmpIndex == BmpParameter[u16Temp1].u8BmpIndex)
{
return EN_OSD_ERROR_BMP_INDEX;
}
}
OSD_DEBUG(("target: x1=%d, y1=%d, x2=%d, y2=%d\n", u16PosX, u16PosY, u16PosX + u16Width, u16PosY + u16Height));
// check image position
for(u16Temp1 = 0;u16Temp1 < u16ToatalLoadBmp; u16Temp1++)
{
u16Left = BmpParameter[u16Temp1].u16PosX;
u16Right = BmpParameter[u16Temp1].u16PosX+BmpParameter[u16Temp1].u16Width;
u16Top = BmpParameter[u16Temp1].u16PosY;
u16Bottom = BmpParameter[u16Temp1].u16PosY+BmpParameter[u16Temp1].u16Height;
OSD_DEBUG(("check: x1=%d, y1=%d, x2=%d, y2=%d\n", u16Left, u16Top, u16Right, u16Bottom));
if(u16Width <= BmpParameter[u16Temp1].u16Width)
{
if(((u16PosX > u16Left)&&(u16PosX < u16Right))||
(((u16PosX + u16Width) > u16Left)&&((u16PosX + u16Width) < u16Right)))
{
if((u16PosY > u16Top)&&
(u16PosY < u16Bottom))
{
OSD_DEBUG(("error : top point overlap\n"));
return EN_OSD_ERROR_BMP_SIZE;
}
if(((u16PosY + u16Height) > u16Top)&&
((u16PosY + u16Height) < u16Bottom))
{
OSD_DEBUG(("error : bottom point overlap\n"));
return EN_OSD_ERROR_BMP_SIZE;
}
}
}
else
{
if(((u16Left > u16PosX)&&(u16Left <( u16PosX + u16Width)))||
((u16Right > u16PosX)&&(u16Right <( u16PosX + u16Width))))
{
if((u16Top > u16PosY)&&
(u16Top < (u16PosY + u16Height)))
{
OSD_DEBUG(("error : top point overlap\n"));
return EN_OSD_ERROR_BMP_SIZE;
}
if((u16Bottom > u16PosY)&&
(u16Bottom < (u16PosY + u16Height)))
{
OSD_DEBUG(("error : bottom point overlap\n"));
return EN_OSD_ERROR_BMP_SIZE;
}
}
}
}
return EN_OSD_NO_ERROR;
}
/*******************************************************************************************/
void HuffmanDecode_Init( u8 *pu8Data, u16 u16BmpW )
{
// reset all variable
u16BmpWidth = u16BmpW;
u8NodeNumber = pu8Data[0];
stDecodeNode = (ST_DECODE_NODE*) &pu8Data[1]; // base address of huffman tree
pu8Code = &pu8Data[1+u8NodeNumber*sizeof(ST_DECODE_NODE)]; // bitstream start address
u8BitPosition = 8;
u8CodeSize = 0;
}
/*******************************************************************************************/
bool8 HuffmanDecode_GetLine( u8 *pu8Line)
{
u8 u8NextNode, u8Decode=0, u8RunLengthBitCounter;
bool8 b8Match;
u16 u16RunLength, u16idx, u16FilledLength;
u8 u8CacheHuffman=0, u8CacheCode=0;
#if 0
u8 u8PeekHuffman=0;
#endif
for(u16FilledLength=0; u16FilledLength<u16BmpWidth; u16FilledLength+=u16RunLength)
{
// decode huffman code
b8Match = FALSE;
u8NextNode = u8NodeNumber-1; // root node
#if 0
// decode by last cache
if(u8CodeSize<=8 && u8CodeSize>0)
{
if(u8BitPosition>=u8CodeSize)
{
u8PeekHuffman = pu8Code[0]>>(u8BitPosition-u8CodeSize);
u8PeekHuffman = u8PeekHuffman&( (0x01<<u8CodeSize)-1 );
}
else
{
u8PeekHuffman = pu8Code[0]&( (0x01<<u8BitPosition)-1 );
u8PeekHuffman = u8PeekHuffman<<(u8CodeSize-u8BitPosition);
u8PeekHuffman += pu8Code[1]>>(8-u8CodeSize+u8BitPosition);
}
if(u8CacheHuffman==u8PeekHuffman)
{
u8Decode = u8CacheCode;
b8Match = TRUE;
if(u8BitPosition>u8CodeSize)
{
u8BitPosition -= u8CodeSize;
}
else
{
pu8Code += 1;
u8BitPosition = u8BitPosition+8-u8CodeSize;
}
}
}
#endif
// decode by trace tree
if(!b8Match)
{
u8CacheHuffman = 0;
u8CodeSize = 0;
}
while(!b8Match)
{
u8BitPosition--;
if( ( pu8Code[0]&(0x01<<u8BitPosition) )==0 )
{
u8CacheHuffman = (u8CacheHuffman<<1)+0x00;
u8NextNode = stDecodeNode[u8NextNode].u8LeftIdx;
}
else
{
u8CacheHuffman = (u8CacheHuffman<<1)+0x01;
u8NextNode = stDecodeNode[u8NextNode].u8RightIdx;
}
if(u8BitPosition==0)
{
u8BitPosition = 8;
pu8Code+=1;
}
if( stDecodeNode[u8NextNode].u8LeftIdx==u8NodeNumber-1 )
{
// child is root, this is leaf
u8Decode = stDecodeNode[u8NextNode].u8Patten;
u8CacheCode = u8Decode;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -