/** * @brief Send the stream data to the MB86-LSI and recive the stream data from the MB86-LSI. * @since 2009/01/08 * @note None * @attention None * COPYRIGHT FUJITSU LIMITED 2009 */ /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include "FmbCmn.h" static void fmbStreamClose(enum FMBStremThreadEnum threadKind, struct StreamThread *p_StreamThread); static void fmbStreamEnd(enum FMBStremThreadEnum threadKind, struct StreamThread *p_StreamThread); inline BOOL fmbChkPacketSize(unsigned char* stream_buf , int buf_size , int packet_size , int* offset); static void *fmbRecvStreamThread(void *arg); static void *fmbSendStreamThread(void *arg); /** * @brief Start to the thread of stream. * @return TRUE * @return FALSE * @note None * @attention None */ BOOL FmbStreamBegin( enum FMBStremThreadEnum threadKind, HANDLE sceHandle ) { int rc; pthread_attr_t threadAtt; struct sched_param threadParam; pthread_t thread; int max_priority, min_priority, priority; struct StreamThread *p_StreamThread; struct FMBComProperty *p_ComProperty; struct FMBDeviceInfo *p_deviceInfo; FMB_FUNC(TRUE); p_deviceInfo = FmbGetDevInfo(SceGetDevNum(sceHandle)); p_StreamThread = &p_deviceInfo->t_StreamThread_A[threadKind]; p_ComProperty = FmbGetComProperty(SceGetDevNum(sceHandle)); if (p_StreamThread->fd < 0){ FMB_FUNC(FALSE); return FALSE; } if ( p_StreamThread->isThread == TRUE){ FMB_FUNC(FALSE); return FALSE; } p_StreamThread->fmbfd = open(p_ComProperty->devicePath , O_RDWR); ASSERT_SYS(p_StreamThread->fmbfd >= 0, "open()"); p_StreamThread->fBuf = malloc(p_StreamThread->fSize); if ( p_StreamThread->fBuf == NULL ){ fmbStreamClose(threadKind, p_StreamThread); FMB_FUNC(FALSE); return FALSE; } p_StreamThread->isThread = FALSE; p_StreamThread->isStop = FALSE; p_StreamThread->isForceStop = FALSE; p_StreamThread->streamSize = 0; p_StreamThread->isFrameUpdate = FALSE; p_StreamThread->isSeqEnd = FALSE; p_StreamThread->isSystemCmdAck = FALSE; rc = pthread_attr_init(&threadAtt); ASSERT_USR(rc == 0, "pthread_attr_init"); rc = pthread_attr_getschedparam (&threadAtt, &threadParam); ASSERT_USR(rc == 0, "pthread_attr_getschedparam"); max_priority = sched_get_priority_max(SCHED_OTHER); min_priority = sched_get_priority_min(SCHED_OTHER); priority = p_StreamThread->priority; if (priority < min_priority) { priority = min_priority; } else if (max_priority < priority) { priority = max_priority; } threadParam.__sched_priority = priority; rc = pthread_attr_setschedparam(&threadAtt, &threadParam); ASSERT_USR(rc == 0, "pthread_attr_setschedparam"); rc = pthread_attr_setdetachstate(&threadAtt , PTHREAD_CREATE_DETACHED); ASSERT_USR(rc == 0, "pthread_attr_setdetachstate"); if (threadKind == FMBEnmStreamRcv) { p_StreamThread->start_routine = fmbRecvStreamThread; } else { p_StreamThread->start_routine = fmbSendStreamThread; } rc = pthread_create( &thread, &threadAtt, p_StreamThread->start_routine, p_StreamThread); ASSERT_USR(rc == 0, "pthread_create"); pthread_attr_destroy(&threadAtt); FMB_FUNC(FALSE); return TRUE; } /** * @brief Thread that receives stream from the MB86 LSI. * @param[in] arg Ignored * @return NULL * @note None * @attention None */ static void *fmbRecvStreamThread(void *arg) { int r_len; int w_len; int totalLen; int ps_size=0; int stream_size=0; char* err_cause; BOOL stream_size_wait=TRUE; int pChk_offset=0; BOOL pChk; int pChkCnt=0; BOOL filewrite=TRUE; int pre_stream_size=0; int diff_stream_size=0; int diff_last_size=0; __off64_t truncate_length; enum FMBDeviceNumEnum deviceNum; struct StreamThread *p_StreamThread; struct FMBComProperty *p_ComProperty; p_StreamThread = (struct StreamThread *) arg; InitFuncTraceRecvStream(p_StreamThread->deviceNum); FMB_FUNC(TRUE); p_StreamThread->isThread = TRUE; deviceNum = p_StreamThread->deviceNum; p_ComProperty = FmbGetComProperty(deviceNum); LogFmb("fmbfd\t%d", p_StreamThread->fmbfd); ftruncate64(p_StreamThread->fd,0); lseek64(p_StreamThread->fd,0,SEEK_SET); if ( p_ComProperty->tsFormat[FMBEnmOutputTsPacket] == FMBEnmTsFormat188 ){ ps_size = 188; } else{ ps_size = 192; } totalLen = 0; while(TRUE){ if ( (p_StreamThread->isForceStop ==TRUE ) || (p_StreamThread->isStop ==TRUE && stream_size_wait == TRUE && p_StreamThread->streamSize <= stream_size) || (p_StreamThread->isStop ==TRUE && stream_size_wait == FALSE) ) { LogFmb("[fmbRecvStreamThread]Stream(from LSI) read end.........."); LogFmb("[fmbRecvStreamThread]Stream Size = %d",stream_size); if (stream_size_wait == FALSE ) { LogFmb("[fmbRecvStreamThread]Stream size no wait........."); break; } r_len = read(p_StreamThread->fmbfd, p_StreamThread->fBuf, 0); if (r_len < 0) { if (p_StreamThread->isForceStop ==TRUE) { LogFmb("[fmbRecvStreamThread]Stream read error skip (Force Stop)........."); break; } fprintOut(stdout, "\x1b[31mERROR: [dev-%d]Failed in receiving the stream.\x1b[m\n", deviceNum); LogFmb("ERROR: Failed in receiving the stream."); } //end.. break; } if (stream_size_wait == FALSE ) { usleep(300000); continue; } r_len = read(p_StreamThread->fmbfd, p_StreamThread->fBuf, p_StreamThread->fSize); if (r_len < 0) { if (p_StreamThread->isForceStop ==TRUE) { LogFmb("[fmbRecvStreamThread]Stream read error skip (Force Stop)........."); continue; } fprintOut(stdout, "\x1b[31mERROR: [dev-%d]Failed in receiving the stream.\x1b[m\n", deviceNum); LogFmb("ERROR: Failed in receiving the stream."); stream_size_wait = FALSE; continue; } pre_stream_size = stream_size; totalLen += r_len; stream_size += totalLen/ps_size; totalLen = totalLen%ps_size; if( filewrite ){ if( (p_StreamThread->streamSize !=0 ) && (p_StreamThread->streamSize < stream_size) ){ LogFmb("[fmbRecvStreamThread]pre_stream_size = %d",pre_stream_size); LogFmb("[fmbRecvStreamThread]r_len = %d",r_len); diff_stream_size = stream_size - pre_stream_size; diff_last_size = stream_size - p_StreamThread->streamSize ; r_len = (diff_stream_size - diff_last_size) * ps_size; LogFmb("[fmbRecvStreamThread]diff_stream_size = %d",diff_stream_size); LogFmb("[fmbRecvStreamThread]diff_last_size = %d",diff_last_size); LogFmb("[fmbRecvStreamThread]stream_size = %d",stream_size); LogFmb("[fmbRecvStreamThread]Stream Size = %d",p_StreamThread->streamSize); LogFmb("[fmbRecvStreamThread]r_len = %d",r_len); filewrite=FALSE; } if ( r_len > 0 ){ pChk = fmbChkPacketSize(p_StreamThread->fBuf, r_len,ps_size,&pChk_offset); if( pChk == FALSE ){ pChkCnt++; fprintOut(stdout, "\x1b[31mERROR(dev-%d): Output packet size unmatch occurred.(the %dth packet) Please check settings for packet size and output file.\x1b[m\n" , deviceNum, (stream_size + ( (r_len - pChk_offset)/ps_size )) ); LogFmb("ERROR: Output packet size unmatch occurred.(the %dth packet) Please check settings for packet size and output file." , (stream_size + ( (r_len - pChk_offset)/ps_size ))); if(g_dbg.isTS_PSIZE_Exit){ ASSERT_USR(FALSE, "Output packet size unmatch occurred."); } while (pChk_offset > ps_size){ pChk = fmbChkPacketSize(p_StreamThread->fBuf, r_len,ps_size,&pChk_offset); if( pChk == FALSE ){ pChkCnt++; fprintOut(stdout, "\x1b[31mERROR(dev-%d): Output packet size unmatch occurred.(the %dth packet) Please check settings for packet size and output file.\x1b[m\n" , deviceNum, (stream_size + ( (r_len - pChk_offset)/ps_size )) ); LogFmb("ERROR: Output packet size unmatch occurred.(the %dth packet) Please check settings for packet size and output file." , (stream_size + ( (r_len - pChk_offset)/ps_size ))); } } } ASSERT_USR(pChkCnt < FMB_STREAM_PACKET_CHK_TH, "Too many packet size unmatch occurred."); w_len = write(p_StreamThread->fd, p_StreamThread->fBuf, r_len); if (w_len < 0) { err_cause = strerror(errno); LogFmb("write error(%d):%s",errno, err_cause); ASSERT_USR(FALSE, "write"); break; } }else{ truncate_length = (__off64_t)p_StreamThread->streamSize * (__off64_t)ps_size; LogFmb("[fmbRecvStreamThread] truncate_length = %llu",truncate_length); w_len = ftruncate(p_StreamThread->fd, truncate_length); if (w_len < 0) { err_cause = strerror(errno); LogFmb("ftruncate error(%d):%s",errno, err_cause); ASSERT_USR(FALSE, "ftruncate"); break; } } } } fmbStreamEnd(FMBEnmStreamRcv, p_StreamThread); FMB_FUNC(FALSE); return NULL; } /** * @brief Thread that sends stream from the MB86 LSI. * @param[in] arg Ignored * @return NULL * @note None * @attention None */ static void *fmbSendStreamThread(void *arg) { int r_len; int w_len; int totalLen; int ps_size=0; int stream_size=0; char* err_cause; int pChk_offset=0; BOOL pChk; int pChkCnt=0; BOOL normal_write = TRUE; int endstreamLen; enum FMBDeviceNumEnum deviceNum; struct StreamThread *p_StreamThread; struct FMBComProperty *p_ComProperty; p_StreamThread = (struct StreamThread *) arg; InitFuncTraceSendStream(p_StreamThread->deviceNum); FMB_FUNC(TRUE); p_StreamThread->isThread = TRUE; deviceNum = p_StreamThread->deviceNum; p_ComProperty = FmbGetComProperty(deviceNum); LogFmb("fmbfd\t%d", p_StreamThread->fmbfd); if ( p_ComProperty->tsFormat[FMBEnmInputTsPacket] == FMBEnmTsFormat188 ){ ps_size = 188; } else{ ps_size = 192; } totalLen = 0; endstreamLen =0; //start_position if (p_StreamThread->fileStartPos!=0){ lseek64(p_StreamThread->fd, p_StreamThread->fileStartPos, SEEK_SET); } //end_position if (p_StreamThread->fileEndPos!=0){ endstreamLen = p_StreamThread->fileEndPos /ps_size; } while(TRUE){ if ( (p_StreamThread->isForceStop ==TRUE ) || (p_StreamThread->isStop ==TRUE ) ) { LogFmb("[fmbSendStreamThread]Stream(from LSI) write end.........."); LogFmb("[fmbSendStreamThread]Stream Size = %d",stream_size); if ( normal_write == FALSE ) { LogFmb("[fmbSendStreamThread] write ng end........."); break; } w_len = write(p_StreamThread->fmbfd, p_StreamThread->fBuf, 0); if (w_len < 0) { if( p_StreamThread->isForceStop ==TRUE ){ LogFmb("[fmbSendStreamThread]Stream write error skip (Force Stop)........."); break; } switch (p_ComProperty->currentRequest){ case FMBEnmReqStop : LogFmb("[fmbSendStreamThread]Stream write error skip (Stop)........."); break; default: ASSERT_USR(FALSE, "write0"); break; } break; } //end.. break; } if (normal_write == FALSE ) { usleep(300000); continue; } r_len = read(p_StreamThread->fd, p_StreamThread->fBuf, p_StreamThread->fSize); if (r_len < 0) { err_cause = strerror(errno); LogFmb("read error(%d):%s",errno, err_cause); ASSERT_USR(FALSE, "read"); break; } if (r_len == 0) { LogFmb("[fmbSendStreamThread]File read end.........."); FmbSetStreamStop(FMBEnmStreamSend, p_StreamThread); continue; } w_len = write(p_StreamThread->fmbfd, p_StreamThread->fBuf, r_len); if (w_len < 0) { if( p_StreamThread->isForceStop ==TRUE ){ LogFmb("[fmbSendStreamThread]Stream write error skip (Force Stop)........."); continue; } switch (p_ComProperty->currentRequest){ case FMBEnmReqStop : LogFmb("[fmbSendStreamThread]Stream write error skip (Stop)........."); continue; break; default: break; } fprintOut(stdout, "\x1b[31mERROR: Failed in sending the stream.\x1b[m\n"); LogFmb("ERROR: Failed in sending the stream."); normal_write = FALSE; continue; } pChk = fmbChkPacketSize(p_StreamThread->fBuf, w_len,ps_size,&pChk_offset); if( pChk == FALSE ){ pChkCnt++; fprintOut(stdout, "\x1b[31mERROR: Input packet size unmatch occurred.(the %dth packet) Please check settings for packet size and input file.\x1b[m\n" , (stream_size + ( (w_len - pChk_offset)/ps_size ))); LogFmb("ERROR: Input packet size unmatch occurred.(the %dth packet) Please check settings for packet size and input file." , (stream_size + ( (w_len - pChk_offset)/ps_size ))); if(g_dbg.isTS_PSIZE_Exit){ ASSERT_USR(FALSE, "Input packet size unmatch occurred."); } while (pChk_offset > ps_size){ pChk = fmbChkPacketSize(p_StreamThread->fBuf, w_len,ps_size,&pChk_offset); if( pChk == FALSE ){ pChkCnt++; fprintOut(stdout, "\x1b[31mERROR: Input packet size unmatch occurred.(the %dth packet) Please check settings for packet size and input file.\x1b[m\n" , (stream_size + ( (w_len - pChk_offset)/ps_size ))); LogFmb("ERROR: Input packet size unmatch occurred.(the %dth packet) Please check settings for packet size and input file." , (stream_size + ( (w_len - pChk_offset)/ps_size ))); } } } ASSERT_USR(pChkCnt < FMB_STREAM_PACKET_CHK_TH, "Too many packet size unmatch occurred."); totalLen += r_len; stream_size += totalLen/ps_size; switch (p_ComProperty->setMode){ case FMBEnmFuncModeDec : if ( (p_ComProperty->isInternalDecodeStatus != TRUE) && (p_StreamThread->isFrameUpdate == TRUE ) ) { LogFmb("[fmbSendStreamThread]Dec 1pic end.........."); FmbSetStreamStop(FMBEnmStreamSend, p_StreamThread); continue; } break; default: break; } totalLen = totalLen%ps_size; if ( (endstreamLen != 0) && (stream_size > endstreamLen) ) { LogFmb("[fmbSendStreamThread]Reached fileEndPos .........."); FmbSetStreamStop(FMBEnmStreamSend, p_StreamThread); continue; } } while(TRUE){ if (p_ComProperty->currentRequest == FMBEnmReqPause || p_ComProperty->currentRequest == FMBEnmReqStartDecFrameAdvance){ LogFmb("[fmbSendStreamThread] currentRequest=%d",p_ComProperty->currentRequest); usleep(300000); continue; } break; } fmbStreamEnd(FMBEnmStreamSend, p_StreamThread); FMB_FUNC(FALSE); pthread_exit(EXIT_SUCCESS); } /** * @brief ReSet the stream. * @param hScet Scenario handle * @return None * @note None * @attention None */ void FmbStreamRest( HANDLE hScet ) { struct FMBDeviceInfo *p_deviceInfo; FMB_FUNC(TRUE); p_deviceInfo = FmbGetDevInfo(SceGetDevNum(hScet)); if (p_deviceInfo->t_StreamThread_A[FMBEnmStreamRcv].isThread == TRUE ){ p_deviceInfo->t_StreamThread_A[FMBEnmStreamRcv].isForceStop = TRUE; DrvSetInternal(hScet, FMB_DATA_TYPE_RDMAFLAG , FMB_DATA_DMAFLAG_ON , 0); LogFmb("[FmbStreamRest] FMBEnmStreamRcv isForceStop is true."); } if (p_deviceInfo->t_StreamThread_A[FMBEnmStreamSend].isThread == TRUE ){ p_deviceInfo->t_StreamThread_A[FMBEnmStreamSend].isForceStop = TRUE; DrvSetInternal(hScet, FMB_DATA_TYPE_WDMAFLAG , FMB_DATA_DMAFLAG_ON , 0); LogFmb("[FmbStreamRest] FMBEnmStreamSend isForceStop is true."); } FMB_FUNC(FALSE); return; } /** * @brief Set the stop flag for recive stream. * @param None * @return None * @note None * @attention None */ void FmbSetStreamStop(enum FMBStremThreadEnum threadKind, struct StreamThread *p_StreamThread) { FMB_FUNC(TRUE); if ( threadKind >= FMBEnmStreamMAX ){ FMB_FUNC(FALSE); return; } if (p_StreamThread->isThread == TRUE ){ if ( p_StreamThread->isStop != TRUE){ p_StreamThread->isStop = TRUE; LogFmb("[FmbSetStreamStop] id=%d isStop is true.",threadKind); }else{ p_StreamThread->isForceStop = TRUE; LogFmb("[FmbSetStreamStop] id=%d isForceStop is true.",threadKind); } } FMB_FUNC(FALSE); return; } /** * @brief Set the stream size. * @param[in] strm_size stream size. * @return None * @note None * @attention None */ void FmbSetStreamSize(enum FMBStremThreadEnum threadKind,int strm_size, struct StreamThread *p_StreamThread) { FMB_FUNC(TRUE); if ( threadKind != FMBEnmStreamRcv ){ FMB_FUNC(FALSE); return; } if (p_StreamThread->isThread == TRUE ){ p_StreamThread->streamSize = strm_size; LogFmb("[FmbSetStreamSize] id=%d Stream Size =%d",threadKind,p_StreamThread->streamSize); if ( strm_size == 0 ){ p_StreamThread->isStop = TRUE; LogFmb("[FmbSetStreamSize] id=%d isStop is true.",threadKind); } } FMB_FUNC(FALSE); return; } /** * @brief Set the frame update flag. * @param[in] None * @return None * @note None * @attention None */ void FmbSetStreamFrameUpdate( enum FMBStremThreadEnum threadKind, struct StreamThread *p_StreamThread ) { FMB_FUNC(TRUE); if ( threadKind != FMBEnmStreamSend ){ FMB_FUNC(FALSE); return; } if (p_StreamThread->isThread == TRUE ){ p_StreamThread->isFrameUpdate = TRUE; LogFmb("[FmbSetStreamFrameUpdate] id=%d FrameUpdate is true.",threadKind); } FMB_FUNC(FALSE); return; } /** * @brief Set the sequence end flag. * @param[in] None * @return None * @note None * @attention None */ void FmbSetStreamSeqEnd( enum FMBStremThreadEnum threadKind, struct StreamThread *p_StreamThread ) { FMB_FUNC(TRUE); if ( threadKind != FMBEnmStreamSend ){ FMB_FUNC(FALSE); return; } if (p_StreamThread->isThread == TRUE ){ p_StreamThread->isSeqEnd = TRUE; LogFmb("[FmbSetStreamSeqEnd] id=%d Sequence End is true.",threadKind); } FMB_FUNC(FALSE); return; } /** * @brief Set the sequence end flag. * @param[in] None * @return None * @note None * @attention None */ void FmbSetSystemCmdAck( enum FMBStremThreadEnum threadKind, struct StreamThread *p_StreamThread ) { FMB_FUNC(TRUE); if ( threadKind != FMBEnmStreamSend ){ FMB_FUNC(FALSE); return; } if (p_StreamThread->isThread == TRUE ){ p_StreamThread->isSystemCmdAck = TRUE; LogFmb("[FmbSetSystemCmdAck] id=%d System Command Ack.",threadKind); } FMB_FUNC(FALSE); return; } /** * @brief Close the stream thread descriptor. * @param[in] None * @return None * @note None * @attention None */ static void fmbStreamClose( enum FMBStremThreadEnum threadKind, struct StreamThread *p_StreamThread) { FMB_FUNC(TRUE); if ( threadKind >= FMBEnmStreamMAX ){ return; } close(p_StreamThread->fmbfd ); close(p_StreamThread->fd ); p_StreamThread->fmbfd = -1; p_StreamThread->fd = -1; LogFmb("[fmbStreamClose] id=%d Close.",threadKind); FMB_FUNC(FALSE); return; } /** * @brief Finished the stream thread. * @param[in] threadKind * @param[in] deviceNum * @return None * @note None * @attention None */ static void fmbStreamEnd( enum FMBStremThreadEnum threadKind, struct StreamThread *p_StreamThread) { struct RecvEventArgType event; if ( threadKind >= FMBEnmStreamMAX ){ return; } FMB_FUNC(TRUE); fmbStreamClose(threadKind, p_StreamThread); free(p_StreamThread->fBuf); event.devNum = p_StreamThread->deviceNum; event.dev = FMBEnmCoreDeviceStream; event.evnt = FMBEnmCoreFromSteamEndMsg; event.WaitDetail.StreamMsg.id = threadKind; p_StreamThread->isThread = FALSE; LogFmb("[fmbStreamEnd] id=%d isThread is false.",threadKind); FmbRecvSendEvent(&event, *p_StreamThread->p_fdPipeWrite); LogFmb("[fmbStreamEnd]FmbRecvSendEvent dev=%d evnt=%d id=%d",event.dev,event.evnt,event.WaitDetail.StreamMsg.id); FMB_FUNC(FALSE); return; } /** * @brief Open the stream file. * @param[in] FmbFileTypeEnum file kind(input file : FmbEnmInFile / output file : FmbEnmOutFile) * @param[in] filepath file path name * @return FmbEnmFileNormal Normal end * @return FmbEnmFileAccesFail File access fail * @return FMBEnmFilePacketSizeFail File Packet size fail * @return FmbEnmFileOtherFail File Open fail * @note None * @attention None */ enum FMBFileResultEnum FmbFileOpen(enum FMBFileEnum fileenum , char* filepath , int* errPacketCnt) { unsigned char* fBuf; int r_len,chk_len=0,ps_size; BOOL chkPsize; FMB_FUNC(TRUE); if (gp_FmbDevInfo->t_StreamThread_A[fileenum].isThread == TRUE){ FMB_FUNC(FALSE); return FMBEnmFileExecutionFail; } switch (fileenum){ case FMBEnmInFile: //FMB_STREAM_THREAD_SEND if (gp_FmbDevInfo->t_StreamThread_A[fileenum].fd >= 0){ close(gp_FmbDevInfo->t_StreamThread_A[fileenum].fd ); gp_FmbDevInfo->t_StreamThread_A[fileenum].fd = -1; } gp_FmbDevInfo->t_StreamThread_A[fileenum].fd = open(filepath,O_RDONLY|O_LARGEFILE); break; case FMBEnmOutFile: //FMB_STREAM_THREAD_RCV if (gp_FmbDevInfo->t_StreamThread_A[fileenum].fd >= 0){ close(gp_FmbDevInfo->t_StreamThread_A[fileenum].fd ); gp_FmbDevInfo->t_StreamThread_A[fileenum].fd = -1; } if(FmbIsExistenceFile(filepath)){ gp_FmbDevInfo->t_StreamThread_A[fileenum].fd = open(filepath,O_WRONLY|O_APPEND|O_LARGEFILE,S_IRWXU ); }else{ gp_FmbDevInfo->t_StreamThread_A[fileenum].fd = open(filepath,O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE,S_IRWXU ); } break; default: ASSERT_USR(FALSE, "Invalid file kind."); FMB_FUNC(FALSE); return FMBEnmFileOtherFail; } if (gp_FmbDevInfo->t_StreamThread_A[fileenum].fd < 0){ gp_FmbDevInfo->t_StreamThread_A[fileenum].fd = -1; switch (errno) { case EACCES : FMB_FUNC(FALSE); return FMBEnmFileAccesFail; default: FMB_FUNC(FALSE); return FMBEnmFileOtherFail; } } switch (fileenum){ case FMBEnmInFile: fBuf = malloc(FMB_STREAM_THREAD_SEND_FSIZE); if ( fBuf == NULL ){ ASSERT_USR(FALSE, "malloc NG."); close(gp_FmbDevInfo->t_StreamThread_A[fileenum].fd ); gp_FmbDevInfo->t_StreamThread_A[fileenum].fd = -1; FMB_FUNC(FALSE); return FMBEnmFileOtherFail; } r_len = read(gp_FmbDevInfo->t_StreamThread_A[fileenum].fd, fBuf, FMB_STREAM_THREAD_SEND_FSIZE); if (r_len < 0) { free(fBuf); close(gp_FmbDevInfo->t_StreamThread_A[fileenum].fd ); gp_FmbDevInfo->t_StreamThread_A[fileenum].fd = -1; ASSERT_USR(FALSE, "read"); FMB_FUNC(FALSE); return FMBEnmFileOtherFail; } if ( gp_FmbComProperty->tsFormat[FMBEnmInputTsPacket] == FMBEnmTsFormat188 ){ ps_size = 188; } else{ ps_size = 192; } chkPsize = fmbChkPacketSize(fBuf,r_len,ps_size,&chk_len); if( chkPsize == FALSE ){ *errPacketCnt = (r_len - chk_len)/ps_size ; if (*errPacketCnt ==0 ){ *errPacketCnt = 1; } free(fBuf); close(gp_FmbDevInfo->t_StreamThread_A[fileenum].fd ); gp_FmbDevInfo->t_StreamThread_A[fileenum].fd = -1; FMB_FUNC(FALSE); return FMBEnmFilePacketSizeFail; } lseek(gp_FmbDevInfo->t_StreamThread_A[fileenum].fd,0,SEEK_SET); free(fBuf); break; default: break; } FMB_FUNC(FALSE); return FMBEnmFileNormal; } /** * @brief Get the stream file position. * @param[in] FMBFilePosEnum file position kind(start : FMBEnmStartPos / end : FMBEnmEndPos) * @return position * @note None * @attention None */ __off64_t FmbGetStrmFilePos(enum FMBFilePosEnum filPoseenum ) { __off64_t position=0; FMB_FUNC(TRUE); switch(filPoseenum){ case FMBEnmStartPos: position = gp_FmbDevInfo->t_StreamThread_A[FMBEnmInFile].fileStartPos; break; case FMBEnmEndPos: position = gp_FmbDevInfo->t_StreamThread_A[FMBEnmInFile].fileEndPos; break; default: break; } FMB_FUNC(FALSE); return (position); } /** * @brief Set the stream file position. * @param[in] FMBFilePosEnum file position kind(start : FMBEnmStartPos / end : FMBEnmEndPos) * @return position * @note None * @attention None */ void FmbSetStrmFilePos(enum FMBFilePosEnum filPoseenum , __off64_t position) { FMB_FUNC(TRUE); switch(filPoseenum){ case FMBEnmStartPos: gp_FmbDevInfo->t_StreamThread_A[FMBEnmInFile].fileStartPos = position ; break; case FMBEnmEndPos: gp_FmbDevInfo->t_StreamThread_A[FMBEnmInFile].fileEndPos = position; break; default: break; } FMB_FUNC(FALSE); return; } /** * @brief Checked the stream of packet size. * @param[in] stream buffer * @param[in] stream buffer size * @param[in] packet size * @param[in] packet size offset * @return 0- remain size * @note None * @attention None */ inline BOOL fmbChkPacketSize( unsigned char* stream_buf , int buf_size , int packet_size , int* offset) { BOOL hitF; int remain_size; remain_size = buf_size; if ( *offset == 0 ){ hitF = FALSE; } else if( *offset < packet_size ){ hitF = TRUE; stream_buf+=(packet_size-*offset); remain_size-=(packet_size-*offset); } else{ /* *offset >= packet_size */ hitF = FALSE; stream_buf+=(remain_size-*offset); remain_size=*offset; } while( remain_size >= packet_size ){ if(*stream_buf==0x47){ hitF = TRUE; stream_buf+=packet_size; remain_size-=packet_size; } else{ if (hitF == TRUE){ *offset=remain_size; return FALSE ; } stream_buf++; remain_size--; } } *offset=remain_size; return hitF ; }