BOOL fgReadIdeFile(void* pvAddr, UINT32 u4Size, char *strFileName, UINT32 u4OffSet, UINT32 *pu4RealReadSize, UINT32 *pu4FileLength)
{
    if ((NULL == pvAddr) || (0 == u4Size) || (NULL == strFileName) || (NULL == pu4RealReadSize))
        return FALSE;

    *pu4RealReadSize = 0;

    _DmxIdeSendName(strFileName);
    
#if !CONFIG_DRV_LINUX
    if(!_DmxIdeGetFile((UINT32)pvAddr, 0, pu4RealReadSize))
    {
        vVDecOutputDebugString("\n read fail: %s", strFileName);
        return FALSE;
    }
#else
    if(!_DmxIdeGetFile( PHYSICAL((UINT32)pvAddr), 0, pu4RealReadSize, u4Size))
    {
        vVDecOutputDebugString("\n read fail: %s", strFileName);
        return FALSE;
    }
#endif

    *pu4FileLength = *pu4RealReadSize;

    return TRUE;
}
// *********************************************************************
// Function    : BOOL fgReadPCFile(void* pvAddr, UINT32 u4Size, char *strFileName, UINT32 u4OffSet, UINT32 *pu4RealReadSize)
// Description : read bitstream from pc to memory
// Parameter   : None
// Return      : TRUE/FALSE
// *********************************************************************
BOOL fgReadPCFile(void* pvAddr, UINT32 u4Size, char *strFileName, UINT32 u4OffSet, UINT32 *pu4RealReadSize, UINT32 *pu4FileLength)
{
    FILE* pFile = NULL;
    UINT32 u4FileSize = 0;
    UINT32 u4ReadSize = u4Size;
    if ((NULL == pvAddr) || (0 == u4Size) || (NULL == strFileName) || (NULL == pu4RealReadSize))
    return FALSE;

    *pu4RealReadSize = 0;

    if((pFile = linux_fopen(strFileName, "rb")) == NULL)
        return FALSE;
    
    u4FileSize = u4fsize(pFile);
    *pu4FileLength = u4FileSize;

    if (u4OffSet >= u4FileSize)
    {
        linux_fclose(pFile);
        vVDecOutputDebugString("\n read offset(%d) > filesize(%d)", u4OffSet, u4FileSize);
        return FALSE;
    }

    if(linux_fseek (pFile, u4OffSet, SEEK_SET))
    {
        linux_fclose(pFile);
        vVDecOutputDebugString("\n seek fail: %s", strFileName);
        return FALSE;
    }

    if (u4Size > (u4FileSize - u4OffSet))
        u4ReadSize = u4FileSize - u4OffSet;

    *pu4RealReadSize = linux_fread((void *)pvAddr, 1, u4ReadSize, pFile);
    linux_fclose(pFile);

    if (u4ReadSize != *pu4RealReadSize)
    {
        vVDecOutputDebugString("\n read fail: %s", strFileName);
        return FALSE;
    }

    return TRUE;
}
BOOL fgOpenPCFile(UINT32 u4InstID, char *strFileName , char *strMode, VDEC_INFO_VERIFY_FILE_INFO_T *ptFileInfo)
{
    FILE *pFile = NULL;
    UINT32 u4Offset;

    #ifdef RING_VFIFO_SUPPORT
    u4Offset = ptFileInfo->u4FileOffset;
    #else
     u4Offset = 0;
    #endif

    if(ptFileInfo->fgGetFileInfo)
    {
        strcpy(ptFileInfo->bFileName,strFileName);   
        if(fgReadPCFile(ptFileInfo->pucTargetAddr, ptFileInfo->u4TargetSz, strFileName, u4Offset, &(ptFileInfo->u4RealGetBytes), &(ptFileInfo->u4FileLength)))
        {
            //vVDecOutputDebugString("The file's size is 0x%.8x bytes\n", ptFileInfo->u4FileLength);
            if(ptFileInfo->u4FileLength > ptFileInfo->u4RealGetBytes)
            {
                vVDecOutputDebugString("\n Over scan\n");
            }
            return TRUE;
        }
        else
        {
            vVDecOutputDebugString("\n NULL \n");
            return FALSE;
        }
    }
    else
    {
        if((pFile = linux_fopen(strFileName, "rb")) == NULL)
        {
            return FALSE;
        }
        else
        {
            linux_fclose(pFile);
            return TRUE;
        }
    }

}
// *********************************************************************
// Function    : BOOL fgWrMsg2PC(void* pvAddr, UINT32 u4Size, UINT32 u4Mode, VDEC_INFO_VERIFY_FILE_INFO_T *pFILE_INFO)
// Description : Write the decoded data to PC for compare
// Parameter   : None
// Return      : None
// *********************************************************************
BOOL fgWrMsg2PC(void* pvAddr, UINT32 u4Size, UINT32 u4Mode, VDEC_INFO_VERIFY_FILE_INFO_T *pFILE_INFO)
{
#ifdef IDE_WRITE_SUPPORT
  #if (!CONFIG_DRV_LINUX)
    printk("%s\n",pvAddr);
  #endif
  return TRUE;
#else

    BOOL fgResult = FALSE;

    #ifdef PCFILE_WRITE
    FILE* pFile = NULL;

    if ((NULL == pvAddr) || (0 == u4Size))
        return FALSE;

    if(pFILE_INFO->pFile == NULL)
    {
        if(pFILE_INFO->bFileName == NULL)
            return FALSE;
        else
            pFILE_INFO->pFile = linux_fopen(pFILE_INFO->bFileName, "wb");
    }
    pFile = pFILE_INFO->pFile;
    
    if(pFile == NULL)
        return FALSE;

    fgResult = (linux_fwrite ((char* )pvAddr, 1, u4Size, pFile) == u4Size);
    if (FALSE == fgResult)
    {
        vVDecOutputDebugString("\n write fail: %s", pFILE_INFO->bFileName);
        linux_fclose(pFILE_INFO->pFile);
    }
    //fclose(pFile);

    #else
      #if (!CONFIG_DRV_LINUX)
         printk("%s", (char* )pvAddr);
      #endif
         printk("%s", (char* )pvAddr);
    fgResult = TRUE;
    
    #endif

    return fgResult;
#endif
}
BOOL fgVDecVerify_PrepareInfo_RM(UINT32 u4InstID)
{
  BOOL fgOpen;
  char strMessage[512];
  char strEmuFileName[512];

  //Read RM Frame Info from PC  
  _tInFileInfo[u4InstID].fgGetFileInfo = TRUE;
  _tInFileInfo[u4InstID].pucTargetAddr = _pucRMFrmInfoBuf[u4InstID];
  _tInFileInfo[u4InstID].u4TargetSz = RM_FRMINFO_SZ;    
  _tInFileInfo[u4InstID].u4FileLength = 0;    
  _tInFileInfo[u4InstID].u4FileOffset = 0;

  sprintf(strMessage, "%s: ", _bFileStr1[u4InstID][RM_FRMINFO_INDEX]);
  vVDecOutputDebugString(strMessage);

  fgOpen = fgOpenFile(u4InstID, _bFileStr1[u4InstID][RM_FRMINFO_INDEX],"r+b", &_tInFileInfo[u4InstID]);
  if(fgOpen == FALSE)
  {
    vVDecOutputDebugString("Open bit-stream fail\n");
    strcpy(_tFileListRecInfo[u4InstID].bFileName,_FileList_Rec[u4InstID]);
    sprintf(strMessage, "%s", "Open bit-stream fail\n");
    fgWrMsg2PC(strMessage,strlen(strMessage),8,&_tFileListRecInfo[u4InstID]);
    return FALSE;
  }

  if (_u4StartCompPicNum[u4InstID] > 0)
  {
    _u4FileCnt[u4InstID] = u4RM_FindIPic(u4InstID, _u4StartCompPicNum[u4InstID]);
	_u4StartCompPicNum[u4InstID] = _u4FileCnt[u4InstID];
  }

  #ifdef RM_CRCCHECK_ENABLE
  sprintf(strEmuFileName, "%s/%s%07d%s", _bFileStr1[u4InstID][RM_GOLDENPATH_INDEX], 
                                                             strRMGoldenFileName,
                                                            _u4FileCnt[u4InstID],
                                                            strGoldenFileNameExt_FileList);
  #else //RM_CRCCHECK_ENABLE
    {   
      UINT32 u4PicCnt = _u4FileCnt[u4InstID];
      if (u4PicCnt/5000 > 0)
      {
          sprintf(strEmuFileName, "%s%05d/%s%07d%s", _bFileStr1[u4InstID][RM_GOLDENPATH_INDEX], 
                                                     u4PicCnt/5000 * 5000,
                                                     strRMGoldenFileName,
                                                     _u4FileCnt[u4InstID],
                                                     strGoldenFileNameExt_FileList);          
      }
      else
      {   
          //sprintf(strEmuFileName, "%s/%s%07d%s", _bFileStr1[u4InstID][RM_GOLDENPATH_INDEX], 
          sprintf(strEmuFileName, "%s%s%07d%s", _bFileStr1[u4InstID][RM_GOLDENPATH_INDEX], 
                                                                     strRMGoldenFileName,
                                                                    _u4FileCnt[u4InstID],
                                                                    strGoldenFileNameExt_FileList);
      }
    }
  #endif //RM_CRCCHECK_ENABLE

    //Update File Name
  #ifdef SATA_HDD_FS_SUPPORT
    { 
        UINT32 u4PicCnt = _u4FileCnt[u4InstID];
        if (u4PicCnt/5000 > 0)
        {
              sprintf(_bFileStr1[u4InstID][1], "%s%05d/%s%07d%s", _bFileStr1[u4InstID][RM_SOURCEPATH_INDEX], 
                                                            u4PicCnt/5000 * 5000,
                                                            strRMSrcFileName,
                                                            _u4FileCnt[u4InstID],
                                                            strSrcFileNameExt_FileList);
        }
        else
        {
          //sprintf(strEmuFileName, "%s/%s%07d%s", _bFileStr1[u4InstID][RM_SOURCEPATH_INDEX], 
          sprintf(_bFileStr1[u4InstID][1], "%s%s%07d%s", _bFileStr1[u4InstID][RM_SOURCEPATH_INDEX], 
                                                            strRMSrcFileName,
                                                            _u4FileCnt[u4InstID],
                                                            strSrcFileNameExt_FileList);
        }
    }
  #else //SATA_HDD_FS_SUPPORT
  sprintf(_bFileStr1[u4InstID][1], "%s\\%s%07d%s", _bFileStr1[u4InstID][RM_SOURCEPATH_INDEX], 
                                                            strRMSrcFileName,
                                                            _u4FileCnt[u4InstID],
                                                            strSrcFileNameExt_FileList);
  #endif //SATA_HDD_FS_SUPPORT
  
  #ifdef RM_ATSPEED_TEST_ENABLE
  //AU Info 
  _tInFileInfo[u4InstID].fgGetFileInfo = TRUE;
  _tInFileInfo[u4InstID].pucTargetAddr = _pucRMAULikeBuf[u4InstID];
  _tInFileInfo[u4InstID].u4TargetSz = RM_AULIKEBUF_SZ;    
  _tInFileInfo[u4InstID].u4FileLength = 0;    
  _tInFileInfo[u4InstID].u4FileOffset = 0;

  sprintf(strMessage, "%s: ", _bFileStr1[u4InstID][RM_AUFIFO_INDEX]);
  vVDecOutputDebugString(strMessage);

  fgOpen = fgOpenFile(u4InstID, _bFileStr1[u4InstID][RM_AUFIFO_INDEX],"r+b", &_tInFileInfo[u4InstID]);
  if(fgOpen == FALSE)
  {
    vVDecOutputDebugString("Open bit-stream fail\n");
    strcpy(_tFileListRecInfo[u4InstID].bFileName,_FileList_Rec[u4InstID]);
    sprintf(strMessage, "%s", "Open bit-stream fail\n");
    fgWrMsg2PC(strMessage,strlen(strMessage),8,&_tFileListRecInfo[u4InstID]);
    return FALSE;
  }

  //Checksum Info
  #if 1
  _tInFileInfo[u4InstID].fgGetFileInfo = TRUE;
  _tInFileInfo[u4InstID].pucTargetAddr = _pucRMChecksumBuf[u4InstID];
  _tInFileInfo[u4InstID].u4TargetSz = RM_CHECKSUM_BUFFER_SZ;    
  _tInFileInfo[u4InstID].u4FileLength = 0;    
  _tInFileInfo[u4InstID].u4FileOffset = 0;

  sprintf(strMessage, "%s: ", _bFileStr1[u4InstID][RM_SUMINFO_INDEX]);
  vVDecOutputDebugString(strMessage);

  fgOpen = fgOpenFile(u4InstID, _bFileStr1[u4InstID][RM_SUMINFO_INDEX],"r+b", &_tInFileInfo[u4InstID]);
  if(fgOpen == FALSE)
  {
    vVDecOutputDebugString("Open bit-stream fail\n");
    strcpy(_tFileListRecInfo[u4InstID].bFileName,_FileList_Rec[u4InstID]);
    sprintf(strMessage, "%s", "Open bit-stream fail\n");
    fgWrMsg2PC(strMessage,strlen(strMessage),8,&_tFileListRecInfo[u4InstID]);
    return FALSE;
  }
  #endif //0
  #endif //RM_ATSPEED_TEST_ENABLE

#ifndef RM_CRCCHECKFLOW_SUPPORT
#ifndef RM_ATSPEED_TEST_ENABLE
  //Read RM Goldem from PC
  _tInFileInfo[u4InstID].fgGetFileInfo = TRUE;
  _tInFileInfo[u4InstID].pucTargetAddr = _pucRMGoldenDataBuf[u4InstID];
  _tInFileInfo[u4InstID].u4TargetSz = RM_GOLDENDATA_SZ;    
  _tInFileInfo[u4InstID].u4FileLength = 0;    
  _tInFileInfo[u4InstID].u4FileOffset = 0;

  sprintf(strMessage, "%s: ", _bFileStr1[u4InstID][5]);
  vVDecOutputDebugString(strMessage);

  //fgOpen = fgOpenFile(u4InstID, _bFileStr1[u4InstID][5],"r+b", &_tInFileInfo[u4InstID]);
  fgOpen = fgOpenFile(u4InstID, strEmuFileName,"r+b", &_tInFileInfo[u4InstID]);
  if(fgOpen == FALSE)
  {
    vVDecOutputDebugString("Open bit-stream fail\n");
    strcpy(_tFileListRecInfo[u4InstID].bFileName,_FileList_Rec[u4InstID]);
    sprintf(strMessage, "%s", "Open bit-stream fail\n");
    fgWrMsg2PC(strMessage,strlen(strMessage),8,&_tFileListRecInfo[u4InstID]);
    return FALSE;
  }
#endif //#ifndef RM_ATSPEED_TEST_ENABLE        
#endif //RM_CRCCHECKFLOW_SUPPORT

  #ifdef RM_CRCCHECKFLOW_SUPPORT
  #ifdef RM_CRCCHECK_ENABLE
  //Only for CRC Check
  if (fgRMCheckCRCResult)
  {
    _tInFileInfo[u4InstID].fgGetFileInfo = TRUE;
    _tInFileInfo[u4InstID].pucTargetAddr = _pucRMCRCResultBuf[u4InstID];
    _tInFileInfo[u4InstID].u4TargetSz = RM_CRCRESULT_SZ;    
    _tInFileInfo[u4InstID].u4FileLength = 0;    
    _tInFileInfo[u4InstID].u4FileOffset = 0;

    sprintf(strMessage, "%s: ", _bFileStr1[u4InstID][RM_CRCINFO_INDEX]);
    vVDecOutputDebugString(strMessage);

    fgOpen = fgOpenFile(u4InstID, _bFileStr1[u4InstID][RM_CRCINFO_INDEX],"r+b", &_tInFileInfo[u4InstID]);
    if(fgOpen == FALSE)
    {
      vVDecOutputDebugString("Open bit-stream fail\n");
      strcpy(_tFileListRecInfo[u4InstID].bFileName,_FileList_Rec[u4InstID]);
      sprintf(strMessage, "%s", "Open bit-stream fail\n");
      fgWrMsg2PC(strMessage,strlen(strMessage),8,&_tFileListRecInfo[u4InstID]);
      return FALSE;
    }
  }
  #endif //RM_CRCCHECK_ENABLE
  #endif //RM_CRCCHECKFLOW_SUPPORT

  return TRUE;
}
void vVDecVerifyThread(void* vpdata)
{
  VDEC_PARAM_T* pparam = vpdata;
  UINT32 u4InstID;
    UINT32 u4WmvMode;
  BOOL fgOpen,fgExistVerifyLoop;
  BOOL fgMVCType;
  BOOL fgInit;
  char strMessage[512];
  CHAR strVP6SizeFile[ 512];
  u4InstID =  pparam->u4InstanceId;
  _fgMVCType = pparam->fgMVCType;
//  u4WmvMode  =  pparam->u4Mode;   
  u4WmvMode  =  1;//(UINT32) ppv_param[1]; /* 1: VP6 adobe mode; 0: Open source or multi-stream. */  
 
  #if VDEC_CACHE_PROC
  UINT32 u4FifoDataSize = 0;
  UINT32 u4MappedVFifoSa = 0;
  //struct device rDev; 
  #endif
  g_fgAllocate[0] = FALSE;
  g_fgAllocate[1] = FALSE;
  g_u4AllocSize = 0;
  printk("u4InstID = %d,u4WmvMode = %d mvc = %d\n",u4InstID,u4WmvMode,_fgMVCType);
  fgExistVerifyLoop = FALSE;
  
    if (u4WmvMode > 0)
    {
        _u4WmvMode[u4InstID] = 1;
        _u4AdobeMode[u4InstID] = 1;
    }
    else
    {
        _u4WmvMode[u4InstID] = 0;
        _u4AdobeMode[u4InstID] = 0;
    }

    if(_fgMVCType)
    {
      _fgMVCBaseGo = FALSE;
      if(u4InstID == 1)
      {
        _fgMVCResReady[0] = FALSE;
        _fgMVCResReady[1] = FALSE;
      }
      while((u4InstID == 0) && (!_fgMVCBaseGo))
      {
        msleep(5);
      }
    }
    
    
    vVDecGconEnable();
#if (CONFIG_DRV_FPGA_BOARD)
#else
  vVDecClockSelect();
#endif

  vMemoryAllocate(u4InstID);

#if VDEC_DRAM_BUSY_TEST
   vDrmaBusySet (u4InstID);
#endif

#ifdef SATA_HDD_READ_SUPPORT
   #ifndef  SATA_HDD_FS_SUPPORT
  fgInitHDDFileAccess(u4InstID);
   #else
      //FS mount
    fgHDDFsMount(0);
   #endif
#endif

#if OUTPUT_USB_FILE
if(-1 == gfpH264log){
  gfpH264log = vdecopenFile((char*)H264LOGFILENAME,O_CREAT|O_WRONLY,0); 
  if (gfpH264log == -1)
  {
      printk("Fs open file fail %d\n", gfpH264log);
  }
  else{
      gH264logbufferOffset = 0;
      printk("Create H264Log file --> %d \n", gfpH264log);
  }
}

#endif


#ifdef IDE_READ_SUPPORT
  _DmxIdeReset();
#endif
#ifdef BARREL2_THREAD_SUPPORT
  if(!_fgSemaCreated[u4InstID])
  {
    VERIFY (x_sema_create(&_ahVDecEndSema[u4InstID], X_SEMA_TYPE_BINARY, X_SEMA_STATE_UNLOCK) == OSR_OK);
    _fgSemaCreated[u4InstID] = TRUE;
  }
#endif
  _u4StartCompPicNum[u4InstID] = 0;
  _u4EndCompPicNum[u4InstID] = 0xffffffff;
  _u4DumpRegPicNum[u4InstID] = 0xffffffff;
  _u4MaxReDecBistreamCnt[u4InstID] = 0;
#ifdef REDEC 
  //_u4ReDecNum[u4InstID] = 0;
  //_u4ReDecPicNum[u4InstID] = 0;
  _u4ReDecCnt[u4InstID] = 0;
#endif
  _u4RedecBistreamCnt[u4InstID] = 0xffffffff;
  _u4FileCnt[u4InstID] = 0;
  _u4FileListIdx[u4InstID] = 0;
  _u4FilePos[u4InstID] = 0;
  #ifdef WMV_CRC_COMPOSITE_CHECK_ENABLE
  _u4CRCCnt[u4InstID] = 0;
  #endif
#ifdef VERIFICATION_DOWN_SCALE
  _fgVDSCLEnableRandomTest[u4InstID] = TRUE;
   _fgVDSCLEnableLumaKeyTest[u4InstID] = FALSE;
#endif
#ifdef BARREL2_SUPPORT
  _u4BSID[u4InstID] = 1;
#else
  _u4BSID[u4InstID] = 0;
#endif


#if VDEC_DDR3_SUPPORT    
    _u2AddressSwapMode[u4InstID] = ADDRSWAP_DDR3;
#else
    _u2AddressSwapMode[u4InstID] = ADDRSWAP_OFF;
#endif

  fgInit = TRUE;
  _u4PowerTestInit[u4InstID] = 0;

  _tFileListInfo[u4InstID].i4FileId = 0xFFFFFFFF;
  while(fgVdecReadFileName(u4InstID, &_tFileListInfo[u4InstID], &_tFileListRecInfo[u4InstID], &_u4StartCompPicNum[u4InstID], &_u4EndCompPicNum[u4InstID], &_u4DumpRegPicNum[u4InstID]))
  {
     _u4SkipFrameCnt[u4InstID] = 0;
     _u4PicCnt[u4InstID] = 0;
     _u4FileCnt[u4InstID] = 0;
     if(fgExistVerifyLoop)
     {
       break;
     }

    if (fgInit == TRUE)
    {
        _u4StartCompPicNum[u4InstID] = 0;
        fgInit = FALSE;
    }

    #if VDEC_TEST_ADDSWAP
        _u2AddressSwapMode[u4InstID] = (UINT16) (((UINT32) rand())%8);
        while(_u2AddressSwapMode[u4InstID] == 3 || _u2AddressSwapMode[u4InstID] == 7)
        {
            _u2AddressSwapMode[u4InstID] = (UINT16) (((UINT32) rand())%8);
        }

        printk("[VDEC] Address Swap Mode = %d\n", _u2AddressSwapMode[u4InstID]);
    #endif

        #if VDEC_FIELD_COMPACT
        _u2AddressSwapMode[u4InstID] = 8;
        printk("[VDEC] Address Swap Mode = %d, Field Compact Enable\n", _u2AddressSwapMode[u4InstID]);
        #endif

     if (!fgVDecAllocWorkBuffer(u4InstID))
     {
         printk("[VDEC]Memory alloc failed\n");
         break;
     }

     #if ((CONFIG_CHIP_VER_CURR >= CONFIG_CHIP_VER_MT8560) && (!CONFIG_DRV_FPGA_BOARD))
 	vVDecSetVldMcClk(u4InstID,_u4CodecVer[u4InstID]);
     #endif

     #ifdef VDEC_VIDEOCODEC_RM
     fgOpen = fgVDecVerify_PrepareInfo_RM(u4InstID);

     if(fgOpen == FALSE)
     {
       continue;
     }
     #endif //VDEC_VIDEOCODEC_RM
   
#ifdef LETTERBOX_SUPPORT
     if(_u4CodecVer[u4InstID] == VDEC_H264)
     {
     VDEC_INFO_VERIFY_FILE_INFO_T tInFileInfo;
     
     tInFileInfo.fgGetFileInfo = TRUE;
     tInFileInfo.pucTargetAddr = (UCHAR*) _pucSettingFileSa[u4InstID];
     tInFileInfo.u4TargetSz = (UINT32) FILE_LIST_SZ;    
     tInFileInfo.u4FileLength = 0;    
     tInFileInfo.u4FileOffset = 0;
      sprintf(strMessage, "%s: ", _bFileStr1[u4InstID][12]);
      vVDecOutputDebugString(strMessage);
      printk("=====> Setting File Name = %s < ===== \n", strMessage);
      fgOpen = fgOpenFile(u4InstID, _bFileStr1[u4InstID][12],"r+b", &tInFileInfo);
      if(fgOpen == FALSE)
      {
       vVDecOutputDebugString("Open setting file fail\n");
       strcpy(_tFileListRecInfo[u4InstID].bFileName,_FileList_Rec[u4InstID]);
       sprintf(strMessage, "%s", "Open setting file fail\n");
       fgWrMsg2PC(strMessage,strlen(strMessage),8,&_tFileListRecInfo[u4InstID]);
       vVDecFreeWorkBuffer(u4InstID);
       continue;
      }
      _pcLBDSettingFile[u4InstID] = (char *)_pucSettingFileSa[u4InstID];

     tInFileInfo.fgGetFileInfo = TRUE;
     tInFileInfo.pucTargetAddr = (UCHAR*) _pucGoldenFileSa[u4InstID];
     tInFileInfo.u4TargetSz = (UINT32) FILE_LIST_SZ;    
     tInFileInfo.u4FileLength = 0;    
     tInFileInfo.u4FileOffset = 0;
      sprintf(strMessage, "%s: ", _bFileStr1[u4InstID][13]);
      vVDecOutputDebugString(strMessage);
      printk("=====> Golden File Name = %s < ===== \n", strMessage);
      fgOpen = fgOpenFile(u4InstID, _bFileStr1[u4InstID][13],"r+b", &tInFileInfo);
      if(fgOpen == FALSE)
      {
       vVDecOutputDebugString("Open golden file fail\n");
       strcpy(_tFileListRecInfo[u4InstID].bFileName,_FileList_Rec[u4InstID]);
       sprintf(strMessage, "%s", "Open golden file fail\n");
       fgWrMsg2PC(strMessage,strlen(strMessage),8,&_tFileListRecInfo[u4InstID]);
       vVDecFreeWorkBuffer(u4InstID);
       continue;
      }
      _pcLBDGoldenFile[u4InstID] = (char *)_pucGoldenFileSa[u4InstID];
      }
#endif
     
   
   #ifdef  RING_VFIFO_SUPPORT
      _u4LoadBitstreamCnt[u4InstID] = 0;
    #endif
     _tInFileInfo[u4InstID].fgGetFileInfo = TRUE;
     #ifdef RM_RINGVIFO_FLOW
     _tInFileInfo[u4InstID].pucTargetAddr = (UCHAR*) _pucRMRingWorkBuf[u4InstID];
     _tInFileInfo[u4InstID].u4TargetSz = (UINT32) RM_RINGFLOW_TEMPFIFO_SZ;    
     #else //RM_RINGVIFO_FLOW
     _tInFileInfo[u4InstID].pucTargetAddr = _pucVFifo[u4InstID];
     _tInFileInfo[u4InstID].u4TargetSz = V_FIFO_SZ;    
     #endif //RM_RINGVIFO_FLOW
     _tInFileInfo[u4InstID].u4FileLength = 0;    
     _tInFileInfo[u4InstID].u4FileOffset = 0;


      sprintf(strMessage, "%s: ", _bFileStr1[u4InstID][1]);
      vVDecOutputDebugString(strMessage);
      
      printk("=====> Test File Name = %s < ===== \n", strMessage);
      
      fgOpen = fgOpenFile(u4InstID, _bFileStr1[u4InstID][1],"r+b", &_tInFileInfo[u4InstID]);//Load bitstream
      //6589NEW (4) error concealment test only
      #ifdef MPEG4_6589_ERROR_CONCEAL
      _u4TotalBitstreamLen[u4InstID] = _tInFileInfo[u4InstID].u4FileLength;
      #endif
      if(_tInFileInfo[u4InstID].u4FileLength > V_FIFO_SZ)
       {
         printk("=====>The Vfifo size is not enough!. \n");
         printk("=====>The file's size is 0x%.8x bytes\n", _tInFileInfo[u4InstID].u4FileLength);
         //continue;
       }
     
   #ifdef  RING_VFIFO_SUPPORT
      _u4LoadBitstreamCnt[u4InstID]++;
    #endif

     if(fgOpen == FALSE)
     {
       vVDecOutputDebugString("Open bit-stream fail\n");
       strcpy(_tFileListRecInfo[u4InstID].bFileName,_FileList_Rec[u4InstID]);
       sprintf(strMessage, "%s", "Open bit-stream fail\n");
       fgWrMsg2PC(strMessage,strlen(strMessage),8,&_tFileListRecInfo[u4InstID]);
       //vVDecFreeWorkBuffer(u4InstID);
       continue;
     }
     else
     	{
     	  if((u4InstID == 1) && _ucMVCType[1]) 
     	  {    
     	    _fgMVCReady[0] = TRUE;    
     	    _fgMVCReady[1] = FALSE;	  
     	  }

     	}

        //Copy for Temp Buf to VFIFO
        #ifdef RM_RINGVIFO_FLOW
        {
          UINT32 u4VFifoWPtr = (UINT32) _pucVFifo[u4InstID];
          UINT32 u4VFIFOSa = (UINT32) _pucVFifo[u4InstID];
          UINT32 u4VFIFOSz = (UINT32) V_FIFO_SZ;
          UINT32 u4TempVFIFOSa = (UINT32) _pucRMRingWorkBuf[u4InstID];
          UINT32 u4CopySize = _tInFileInfo[u4InstID].u4FileLength;
          UINT32 u4RemSz = 0;

          #ifdef RM_ATSPEED_TEST_ENABLE
          _tVerMpvDecPrm[u4InstID].SpecDecPrm.rVDecRMDecPrm.u4RMFIFORPtr = (UINT32) _pucRMAULikeBuf[u4InstID];
          #else //RM_ATSPEED_TEST_ENABLE
          _tVerMpvDecPrm[u4InstID].SpecDecPrm.rVDecRMDecPrm.u4RMFIFORPtr = (UINT32) _pucVFifo[u4InstID];
          #endif //RM_ATSPEED_TEST_ENABLE

          if ((u4VFifoWPtr+_tInFileInfo[u4InstID].u4FileLength) < (UINT32) (u4VFIFOSa+u4VFIFOSz))
          {
            memcpy((void*)(u4VFifoWPtr), (void*)u4TempVFIFOSa, u4CopySize);
            _tVerMpvDecPrm[u4InstID].SpecDecPrm.rVDecRMDecPrm.u4RMVFIFOWPtr = u4VFIFOSa + u4CopySize;
          }
          else
          {
            u4CopySize = u4VFIFOSa+u4VFIFOSz - u4VFifoWPtr;
            u4RemSz = _tInFileInfo[u4InstID].u4FileLength - u4CopySize;
            memcpy((void*)(u4VFifoWPtr), (void*)u4TempVFIFOSa, u4CopySize);

            memcpy((void*)(u4VFIFOSa), (void*)(u4TempVFIFOSa+u4CopySize), u4RemSz);

            _tVerMpvDecPrm[u4InstID].SpecDecPrm.rVDecRMDecPrm.u4RMVFIFOWPtr = u4VFIFOSa + u4RemSz;
          }
        }
        #endif //RM_RINGVIFO_FLOW

      
     if((_u4CodecVer[u4InstID] == VDEC_H264) ||(_u4CodecVer[u4InstID] == VDEC_MPEG4))
     {
       vAddStartCode2Dram(_pucVFifo[u4InstID]+_tInFileInfo[u4InstID].u4FileLength);
     }
     
      #if VDEC_CACHE_PROC // update physical memory
      {      
      if(_u4CodecVer[u4InstID] == VDEC_H264)
      {
        u4FifoDataSize = _tInFileInfo[u4InstID].u4FileLength + 4;
      }
      else
      {
        u4FifoDataSize = _tInFileInfo[u4InstID].u4FileLength;
      }    

      printk("vVDecVerifyThread, update cache to physical mem, addr:0x%x, size:0x%x\n", 
        _pucVFifo[u4InstID], u4FifoDataSize);

      // tmp:
      //u4FifoDataSize = V_FIFO_SZ;

      u4MappedVFifoSa = dma_map_single(NULL, (UINT32)(_pucVFifo[u4InstID]), u4FifoDataSize, DMA_TO_DEVICE);  
      }
      #endif

     strcpy(_tFileListRecInfo[u4InstID].bFileName,_FileList_Rec[u4InstID]);
     sprintf(strMessage,"The bitstream file length / real returns is %d/%d (0x%.8x/0x%.8x)\n",
      _tInFileInfo[u4InstID].u4FileLength, _tInFileInfo[u4InstID].u4RealGetBytes,_tInFileInfo[u4InstID].u4FileLength, _tInFileInfo[u4InstID].u4RealGetBytes);
     fgWrMsg2PC(strMessage,strlen(strMessage),8,&_tFileListRecInfo[u4InstID]);

     u4BitStreamLengthH264 = _tInFileInfo[u4InstID].u4RealGetBytes;
        
     if (_u4CodecVer[u4InstID] == VDEC_VP6)
     {
         _rSizeFileInfo.fgGetFileInfo = TRUE;  
         _rSizeFileInfo.pucTargetAddr = _pucSizeFileBuf[u4InstID];
         _rSizeFileInfo.u4TargetSz = 1024*400;;  
         _rSizeFileInfo.u4FileLength = 0;
         sprintf(strVP6SizeFile, "%s.size", _bFileStr1[u4InstID][1]);
         fgOpenFile(u4InstID, strVP6SizeFile,"r+b", &_rSizeFileInfo);

         if(fgOpen == FALSE)
         {
             sprintf(strMessage, "%s", "Open VP6 size fail\n");
             fgWrMsg2PC(strMessage,strlen(strMessage),8,&_tFileListRecInfo[u4InstID]);
             continue;
        }

        if (0 == _u1AlphaBitstream[u4InstID])
        {
            //_fgVP6CRCExist[u4InstID] = fgVP6CRCPatternExist(u4InstID);
            _fgVP6CRCExist[u4InstID] = 0;
        }
        else
        {
            _fgVP6CRCExist[u4InstID] = 0;
            _u4AdobeMode[u4InstID] = 0;
        }
        _fgVP6SmallFlolder[u4InstID] = fgVP6SmallFolder(u4InstID);

        printk("<vdec> _fgVP6CRCExist[%u]=%d, _fgVP6SmallFlolder[%u]=%d\n", u4InstID, _fgVP6CRCExist[u4InstID], u4InstID, _fgVP6SmallFlolder[u4InstID]);
     }        

     // main decoding loop
#if VDEC_VP8_WEBP_SUPPORT_ME2_INTEGRATION
     break;
#else
     vMpvPlay(u4InstID);
#endif
     
    #if VDEC_CACHE_PROC
    printk("vVDecVerifyThread, unmap physical mem, addr:0x%x, size:0x%x\n", 
     _pucVFifo[u4InstID], u4FifoDataSize);

    dma_unmap_single(NULL, u4MappedVFifoSa, u4FifoDataSize, DMA_TO_DEVICE); 
    #endif

    _u4StartCompPicNum[u4InstID] = 0;

     //vVDecFreeWorkBuffer(u4InstID);
  }

#if VDEC_VP8_WEBP_SUPPORT_ME2_INTEGRATION
#else
  #ifdef PCFILE_WRITE  
  if(_tInFileInfo[u4InstID].pFile)
  {
    fclose(_tInFileInfo[u4InstID].pFile);
  }
  #endif
  vVerifyVDecIsrStop(u4InstID);

  vMemoryFree(u4InstID);

if(-1 != gfpH264log){
 if(gH264logbufferOffset > 0 ){ 
    vdecwriteFile(gfpH264log, gpfH264LogFileBuffer, gH264logbufferOffset);
 }
 vdeccloseFile(gfpH264log);
 printk("close H264 log file\n");
}


#ifdef SATA_HDD_READ_SUPPORT
   #ifdef  SATA_HDD_FS_SUPPORT
      if (_tFileListInfo[u4InstID].i4FileId != 0xFFFFFFFF)
      {
         // fgHDDFsCloseFile(u4InstID); // temp avoid system crash
         _tFileListInfo[u4InstID].i4FileId = 0xFFFFFFFF;
      }
      //FS mount
    fgHDDFsUnMount(0);
   #endif
#endif

#endif
}
BOOL fgReadHDDFile(UINT32 u4InstID, BOOL fgReadInfo,  void* pvAddr, UINT32 u4Size, char *strFileName, UINT32 u4OffSet, UINT32 *pu4RealReadSize, UINT32 *pu4FileLength, INT32* pi4FileId)
{
#ifdef  SATA_HDD_READ_SUPPORT
#ifndef  SATA_HDD_FS_SUPPORT

    FILE* pFile = NULL;
    UINT32 u4FILE = 0;
    UINT32 u4FileSize = 0;

    if ((NULL == pvAddr) || (0 == u4Size) || (NULL == strFileName) || (NULL == pu4RealReadSize))
        return FALSE;

    *pu4RealReadSize = 0;

    if(0)// '\0' != _bFileStr1[_u4VDecID][9][0])
    {
        //u4FILE = u4fOpenFile(_bFileStr1[_u4VDecID][9], 1/*"rb"*/, &u4FileSize);
    }
    else
    {
        //u4FILE = u4fOpenFile(strFileName, 1/*"rb"*/, &u4FileSize);
    }

     
   if (fgReadInfo)
   {
    u4FILE = i4ReadFileFormHDD(
        u4InstID,
        strFileName,
        pvAddr,
        u4OffSet,
        u4Size,
        pu4RealReadSize,
        pu4FileLength
    );
    }
    else
    {
        if((pFile = linux_fopen(strFileName, "rb")) == NULL)
        {
            return FALSE;
        }
        else
        {
            linux_fclose(pFile);
            return TRUE;
        }
    }

    if (0 != u4FILE)
        return FALSE;

    if (!((u4Size == *pu4RealReadSize) || ((*pu4FileLength - u4OffSet) == *pu4RealReadSize)))
    {
        vVDecOutputDebugString("\n read fail: %s", strFileName);
        return FALSE;
    }
#else  
    BOOL fgRet;

    if ((NULL == pvAddr) || (0 == u4Size) || (NULL == strFileName) || (NULL == pu4RealReadSize))
        return FALSE;

    *pu4RealReadSize = 0;

    if (fgReadInfo)
    {

      fgRet = fgHDDFsReadFile(
           u4InstID,
           strFileName,
           pvAddr,
           u4OffSet,
           u4Size,
           pu4RealReadSize,
           pu4FileLength,
           pi4FileId
       );

       if (!fgRet)
         return FALSE;

        if (!((u4Size == *pu4RealReadSize) || ((*pu4FileLength - u4OffSet) == *pu4RealReadSize)))
        {
           vVDecOutputDebugString("\n read fail: %s", strFileName);
           return FALSE;
        }

    }
    else
    {
       fgRet = fgHDDFsOpenFile(
           u4InstID,
           strFileName,
           pi4FileId
       );

       if (fgRet)
       {
          if (pu4FileLength)
          {
              *pu4FileLength = u4HDDFsGetFileSize(pi4FileId);
          }
          fgHDDFsCloseFile(*pi4FileId);
       }
       else
       {
         return FALSE;
       }
        
    }
    
    return TRUE;
#endif

#else
   return FALSE;
#endif   
}