SF_OMX_video_common.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2021 StarFive Technology Co., Ltd.
  4. */
  5. #include "SF_OMX_video_common.h"
  6. extern SF_OMX_COMPONENT *sf_omx_component_list[];
  7. static void sf_get_component_functions(SF_COMPONENT_FUNCTIONS *funcs, OMX_PTR *sohandle);
  8. OMX_ERRORTYPE GetStateCommon(OMX_IN OMX_HANDLETYPE hComponent, OMX_OUT OMX_STATETYPE *pState)
  9. {
  10. OMX_ERRORTYPE ret = OMX_ErrorNone;
  11. OMX_COMPONENTTYPE *pOMXComponent = NULL;
  12. SF_OMX_COMPONENT *pSfOMXComponent = NULL;
  13. ComponentState state;
  14. OMX_STATETYPE comState;
  15. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = NULL;
  16. FunctionIn();
  17. if (hComponent == NULL)
  18. {
  19. ret = OMX_ErrorBadParameter;
  20. goto EXIT;
  21. }
  22. pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
  23. pSfOMXComponent = pOMXComponent->pComponentPrivate;
  24. pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  25. comState = pSfOMXComponent->state;
  26. state = pSfVideoImplement->functions->ComponentGetState(pSfVideoImplement->hSFComponentExecoder);
  27. LOG(SF_LOG_INFO, "state = %d\r\n", state);
  28. switch (state)
  29. {
  30. case COMPONENT_STATE_CREATED:
  31. if (comState == OMX_StateLoaded)
  32. {
  33. *pState = OMX_StateLoaded;
  34. }else{
  35. *pState = OMX_StateIdle;
  36. }
  37. break;
  38. case COMPONENT_STATE_NONE:
  39. case COMPONENT_STATE_TERMINATED:
  40. *pState = OMX_StateLoaded;
  41. break;
  42. case COMPONENT_STATE_PREPARED:
  43. case COMPONENT_STATE_EXECUTED:
  44. if (comState == OMX_StateIdle || comState == OMX_StateExecuting || comState == OMX_StatePause)
  45. {
  46. *pState = comState;
  47. }
  48. break;
  49. default:
  50. LOG(SF_LOG_WARN, "unknown state:%d \r\n", state);
  51. ret = OMX_ErrorUndefined;
  52. break;
  53. }
  54. EXIT:
  55. FunctionOut();
  56. return ret;
  57. }
  58. OMX_ERRORTYPE ComponentClearCommon(SF_OMX_COMPONENT *pSfOMXComponent)
  59. {
  60. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  61. pSfVideoImplement->functions->ComponentRelease(pSfVideoImplement->hSFComponentFeeder);
  62. pSfVideoImplement->functions->ComponentRelease(pSfVideoImplement->hSFComponentExecoder);
  63. pSfVideoImplement->functions->ComponentRelease(pSfVideoImplement->hSFComponentRender);
  64. pSfVideoImplement->functions->ComponentDestroy(pSfVideoImplement->hSFComponentFeeder, NULL);
  65. pSfVideoImplement->functions->ComponentDestroy(pSfVideoImplement->hSFComponentExecoder, NULL);
  66. pSfVideoImplement->functions->ComponentDestroy(pSfVideoImplement->hSFComponentRender, NULL);
  67. pSfVideoImplement->functions->DeInitLog();
  68. dlclose(pSfOMXComponent->soHandle);
  69. free(pSfVideoImplement->functions);
  70. free(pSfVideoImplement->testConfig);
  71. free(pSfVideoImplement->config);
  72. free(pSfVideoImplement->lsnCtx);
  73. free(pSfOMXComponent->pOMXComponent);
  74. for (int i = 0; i < 2; i++)
  75. {
  76. OMX_PARAM_PORTDEFINITIONTYPE *pPortDefinition = &pSfOMXComponent->portDefinition[i];
  77. free(pPortDefinition->format.video.cMIMEType);
  78. }
  79. return OMX_ErrorNone;
  80. }
  81. BOOL CheckEncTestConfig(TestEncConfig *testConfig)
  82. {
  83. FunctionIn();
  84. if ((testConfig->compareType & (1 << MODE_SAVE_ENCODED)) && testConfig->bitstreamFileName[0] == 0)
  85. {
  86. testConfig->compareType &= ~(1 << MODE_SAVE_ENCODED);
  87. LOG(SF_LOG_ERR, "You want to Save bitstream data. Set the path\r\n");
  88. return FALSE;
  89. }
  90. if ((testConfig->compareType & (1 << MODE_COMP_ENCODED)) && testConfig->ref_stream_path[0] == 0)
  91. {
  92. testConfig->compareType &= ~(1 << MODE_COMP_ENCODED);
  93. LOG(SF_LOG_ERR, "You want to Compare bitstream data. Set the path\r\n");
  94. return FALSE;
  95. }
  96. FunctionOut();
  97. return TRUE;
  98. }
  99. BOOL CheckDecTestConfig(TestDecConfig *testConfig)
  100. {
  101. BOOL isValidParameters = TRUE;
  102. /* Check parameters */
  103. if (testConfig->skipMode < 0 || testConfig->skipMode == 3 || testConfig->skipMode > 4)
  104. {
  105. LOG(SF_LOG_WARN, "Invalid skip mode: %d\n", testConfig->skipMode);
  106. isValidParameters = FALSE;
  107. }
  108. if ((FORMAT_422 < testConfig->wtlFormat && testConfig->wtlFormat <= FORMAT_400) ||
  109. testConfig->wtlFormat < FORMAT_420 || testConfig->wtlFormat >= FORMAT_MAX)
  110. {
  111. LOG(SF_LOG_WARN, "Invalid WTL format(%d)\n", testConfig->wtlFormat);
  112. isValidParameters = FALSE;
  113. }
  114. if (isValidParameters == TRUE && (testConfig->scaleDownWidth > 0 || testConfig->scaleDownHeight > 0))
  115. {
  116. }
  117. if (testConfig->renderType < RENDER_DEVICE_NULL || testConfig->renderType >= RENDER_DEVICE_MAX)
  118. {
  119. LOG(SF_LOG_WARN, "unknown render device type(%d)\n", testConfig->renderType);
  120. isValidParameters = FALSE;
  121. }
  122. if (testConfig->thumbnailMode == TRUE && testConfig->skipMode != 0)
  123. {
  124. LOG(SF_LOG_WARN, "Turn off thumbnail mode or skip mode\n");
  125. isValidParameters = FALSE;
  126. }
  127. return isValidParameters;
  128. }
  129. OMX_ERRORTYPE InitComponentStructorCommon(SF_OMX_COMPONENT *pSfOMXComponent)
  130. {
  131. OMX_ERRORTYPE ret = OMX_ErrorNone;
  132. char *strDebugLevel = NULL;
  133. int debugLevel = 0;
  134. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = NULL;
  135. FunctionIn();
  136. if (pSfOMXComponent == NULL)
  137. {
  138. ret = OMX_ErrorBadParameter;
  139. goto EXIT;
  140. }
  141. pSfOMXComponent->pOMXComponent = malloc(sizeof(OMX_COMPONENTTYPE));
  142. if (pSfOMXComponent->pOMXComponent == NULL)
  143. {
  144. ret = OMX_ErrorInsufficientResources;
  145. LOG(SF_LOG_ERR, "malloc fail\r\n");
  146. goto ERROR;
  147. }
  148. memset(pSfOMXComponent->pOMXComponent, 0, sizeof(OMX_COMPONENTTYPE));
  149. pSfOMXComponent->soHandle = dlopen(pSfOMXComponent->libName, RTLD_NOW);
  150. if (pSfOMXComponent->soHandle == NULL)
  151. {
  152. ret = OMX_ErrorInsufficientResources;
  153. LOG(SF_LOG_ERR, "could not open %s\r\n", pSfOMXComponent->libName);
  154. goto ERROR;
  155. }
  156. pSfOMXComponent->componentImpl = malloc(sizeof(SF_WAVE5_IMPLEMEMT));
  157. if (pSfOMXComponent->componentImpl == NULL)
  158. {
  159. ret = OMX_ErrorInsufficientResources;
  160. LOG(SF_LOG_ERR, "malloc fail\r\n");
  161. goto ERROR;
  162. }
  163. pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  164. memset(pSfVideoImplement, 0, sizeof(SF_WAVE5_IMPLEMEMT));
  165. pSfVideoImplement->functions = malloc(sizeof(SF_COMPONENT_FUNCTIONS));
  166. if (pSfVideoImplement->functions == NULL)
  167. {
  168. ret = OMX_ErrorInsufficientResources;
  169. LOG(SF_LOG_ERR, "malloc fail\r\n");
  170. goto ERROR;
  171. }
  172. memset(pSfVideoImplement->functions, 0, sizeof(SF_COMPONENT_FUNCTIONS));
  173. sf_get_component_functions(pSfVideoImplement->functions, pSfOMXComponent->soHandle);
  174. // Init VPU log
  175. if (pSfVideoImplement->functions->InitLog && pSfVideoImplement->functions->SetMaxLogLevel)
  176. {
  177. pSfVideoImplement->functions->InitLog();
  178. strDebugLevel = getenv("VPU_DEBUG");
  179. if (strDebugLevel)
  180. {
  181. debugLevel = atoi(strDebugLevel);
  182. if (debugLevel >=0)
  183. {
  184. pSfVideoImplement->functions->SetMaxLogLevel(debugLevel);
  185. }
  186. }
  187. }
  188. if (strstr(pSfOMXComponent->componentName, "sf.video_encoder") != NULL)
  189. {
  190. pSfVideoImplement->testConfig = malloc(sizeof(TestEncConfig));
  191. if (pSfVideoImplement->testConfig == NULL)
  192. {
  193. ret = OMX_ErrorInsufficientResources;
  194. LOG(SF_LOG_ERR, "malloc fail\r\n");
  195. goto ERROR;
  196. }
  197. pSfVideoImplement->lsnCtx = malloc(sizeof(EncListenerContext));
  198. if (pSfVideoImplement->lsnCtx == NULL)
  199. {
  200. ret = OMX_ErrorInsufficientResources;
  201. LOG(SF_LOG_ERR, "malloc fail\r\n");
  202. goto ERROR;
  203. }
  204. memset(pSfVideoImplement->testConfig, 0, sizeof(TestEncConfig));
  205. memset(pSfVideoImplement->lsnCtx, 0, sizeof(EncListenerContext));
  206. pSfVideoImplement->functions->SetDefaultEncTestConfig(pSfVideoImplement->testConfig);
  207. }
  208. else if (strstr(pSfOMXComponent->componentName, "sf.video_decoder") != NULL)
  209. {
  210. pSfVideoImplement->testConfig = malloc(sizeof(TestDecConfig));
  211. if (pSfVideoImplement->testConfig == NULL)
  212. {
  213. ret = OMX_ErrorInsufficientResources;
  214. LOG(SF_LOG_ERR, "malloc fail\r\n");
  215. goto ERROR;
  216. }
  217. pSfVideoImplement->lsnCtx = malloc(sizeof(DecListenerContext));
  218. if (pSfVideoImplement->lsnCtx == NULL)
  219. {
  220. ret = OMX_ErrorInsufficientResources;
  221. LOG(SF_LOG_ERR, "malloc fail\r\n");
  222. goto ERROR;
  223. }
  224. memset(pSfVideoImplement->testConfig, 0, sizeof(TestDecConfig));
  225. memset(pSfVideoImplement->lsnCtx, 0, sizeof(DecListenerContext));
  226. pSfVideoImplement->functions->SetDefaultDecTestConfig(pSfVideoImplement->testConfig);
  227. }
  228. else
  229. {
  230. ret = OMX_ErrorBadParameter;
  231. LOG(SF_LOG_ERR, "unknown component!\r\n");
  232. goto ERROR;
  233. }
  234. if (strstr(pSfOMXComponent->componentName, "avc") != NULL)
  235. {
  236. pSfVideoImplement->bitFormat = STD_AVC;
  237. }
  238. else if (strstr(pSfOMXComponent->componentName, "hevc") != NULL)
  239. {
  240. pSfVideoImplement->bitFormat = STD_HEVC;
  241. }
  242. else
  243. {
  244. ret = OMX_ErrorBadParameter;
  245. LOG(SF_LOG_ERR, "unknown format!\r\n");
  246. goto ERROR;
  247. }
  248. pSfVideoImplement->config = malloc(sizeof(CNMComponentConfig));
  249. if (pSfVideoImplement->config == NULL)
  250. {
  251. ret = OMX_ErrorInsufficientResources;
  252. LOG(SF_LOG_ERR, "malloc fail\r\n");
  253. goto ERROR;
  254. }
  255. memset(pSfVideoImplement->config, 0, sizeof(CNMComponentConfig));
  256. pSfOMXComponent->pOMXComponent->pComponentPrivate = pSfOMXComponent;
  257. for (int i = 0; i < 2; i++)
  258. {
  259. OMX_PARAM_PORTDEFINITIONTYPE *pPortDefinition = &pSfOMXComponent->portDefinition[i];
  260. OMX_VIDEO_PARAM_AVCTYPE *pAVCComponent = &pSfVideoImplement->AVCComponent[i];
  261. OMX_VIDEO_PARAM_HEVCTYPE *pHEVCComponent = &pSfVideoImplement->HEVCComponent[i];
  262. INIT_SET_SIZE_VERSION(pPortDefinition, OMX_PARAM_PORTDEFINITIONTYPE);
  263. INIT_SET_SIZE_VERSION(pAVCComponent, OMX_VIDEO_PARAM_AVCTYPE);
  264. INIT_SET_SIZE_VERSION(pHEVCComponent, OMX_VIDEO_PARAM_HEVCTYPE);
  265. pPortDefinition->nPortIndex = i;
  266. pPortDefinition->nBufferCountActual = VPU_OUTPUT_BUF_NUMBER;
  267. pPortDefinition->nBufferCountMin = VPU_OUTPUT_BUF_NUMBER;
  268. pPortDefinition->nBufferSize = 0;
  269. pPortDefinition->eDomain = OMX_PortDomainVideo;
  270. pPortDefinition->format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
  271. pPortDefinition->format.video.nFrameHeight = DEFAULT_FRAME_HEIGHT;
  272. pPortDefinition->format.video.nStride = DEFAULT_FRAME_WIDTH;
  273. pPortDefinition->format.video.nSliceHeight = DEFAULT_FRAME_HEIGHT;
  274. pPortDefinition->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
  275. pPortDefinition->format.video.cMIMEType = malloc(OMX_MAX_STRINGNAME_SIZE);
  276. pPortDefinition->format.video.xFramerate = 30;
  277. if (pPortDefinition->format.video.cMIMEType == NULL)
  278. {
  279. ret = OMX_ErrorInsufficientResources;
  280. free(pPortDefinition->format.video.cMIMEType);
  281. pPortDefinition->format.video.cMIMEType = NULL;
  282. LOG(SF_LOG_ERR, "malloc fail\r\n");
  283. goto ERROR;
  284. }
  285. memset(pPortDefinition->format.video.cMIMEType, 0, OMX_MAX_STRINGNAME_SIZE);
  286. pPortDefinition->format.video.pNativeRender = 0;
  287. pPortDefinition->format.video.bFlagErrorConcealment = OMX_FALSE;
  288. pPortDefinition->format.video.eColorFormat = OMX_COLOR_FormatUnused;
  289. pPortDefinition->bEnabled = OMX_TRUE;
  290. pAVCComponent->nPortIndex = i;
  291. pAVCComponent->nPFrames = 30;
  292. pAVCComponent->eProfile = OMX_VIDEO_AVCProfileHigh;
  293. pHEVCComponent->nPortIndex = i;
  294. pHEVCComponent->nKeyFrameInterval = 30;
  295. pHEVCComponent->eProfile = OMX_VIDEO_HEVCProfileMain;
  296. pSfOMXComponent->assignedBufferNum[i] = 0;
  297. }
  298. pSfOMXComponent->portDefinition[0].eDir = OMX_DirInput;
  299. pSfOMXComponent->portDefinition[0].nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
  300. pSfOMXComponent->portDefinition[0].nBufferCountActual = VPU_INPUT_BUF_NUMBER;
  301. pSfOMXComponent->portDefinition[0].nBufferCountMin = VPU_INPUT_BUF_NUMBER;
  302. strcpy(pSfOMXComponent->portDefinition[1].format.video.cMIMEType, "raw/video");
  303. pSfOMXComponent->portDefinition[1].format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
  304. pSfOMXComponent->portDefinition[1].eDir = OMX_DirOutput;
  305. pSfOMXComponent->portDefinition[1].nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
  306. pSfOMXComponent->portDefinition[1].nBufferCountActual = VPU_OUTPUT_BUF_NUMBER;
  307. pSfOMXComponent->portDefinition[1].nBufferCountMin = VPU_OUTPUT_BUF_NUMBER;
  308. /* Set componentVersion */
  309. pSfOMXComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
  310. pSfOMXComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
  311. pSfOMXComponent->componentVersion.s.nRevision = REVISION_NUMBER;
  312. pSfOMXComponent->componentVersion.s.nStep = STEP_NUMBER;
  313. /* Set specVersion */
  314. pSfOMXComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
  315. pSfOMXComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
  316. pSfOMXComponent->specVersion.s.nRevision = REVISION_NUMBER;
  317. pSfOMXComponent->specVersion.s.nStep = STEP_NUMBER;
  318. /* Input port */
  319. memset(pSfOMXComponent->pBufferArray, 0, sizeof(pSfOMXComponent->pBufferArray));
  320. memset(pSfOMXComponent->markType, 0, sizeof(pSfOMXComponent->markType));
  321. pSfOMXComponent->propagateMarkType.hMarkTargetComponent = NULL;
  322. pSfOMXComponent->propagateMarkType.pMarkData = NULL;
  323. for (int i = 0; i < 2; i++)
  324. {
  325. ret = SF_SemaphoreCreate(&pSfOMXComponent->portSemaphore[i]);
  326. if (ret)
  327. goto ERROR;
  328. ret = SF_SemaphoreCreate(&pSfOMXComponent->portUnloadSemaphore[i]);
  329. if (ret)
  330. goto ERROR;
  331. }
  332. FunctionOut();
  333. EXIT:
  334. return ret;
  335. ERROR:
  336. for (int i = 0; i < 2; i++)
  337. {
  338. SF_SemaphoreTerminate(pSfOMXComponent->portSemaphore[i]);
  339. SF_SemaphoreTerminate(pSfOMXComponent->portUnloadSemaphore[i]);
  340. }
  341. if (pSfOMXComponent->pOMXComponent)
  342. {
  343. free(pSfOMXComponent->pOMXComponent);
  344. pSfOMXComponent->pOMXComponent = NULL;
  345. }
  346. if (pSfVideoImplement)
  347. {
  348. if (pSfVideoImplement->functions)
  349. {
  350. free(pSfVideoImplement->functions);
  351. pSfVideoImplement->functions = NULL;
  352. }
  353. if (pSfVideoImplement->testConfig)
  354. {
  355. free(pSfVideoImplement->testConfig);
  356. pSfVideoImplement->testConfig = NULL;
  357. }
  358. if (pSfVideoImplement->lsnCtx)
  359. {
  360. free(pSfVideoImplement->lsnCtx);
  361. pSfVideoImplement->lsnCtx = NULL;
  362. }
  363. if (pSfVideoImplement->config)
  364. {
  365. free(pSfVideoImplement->config);
  366. pSfVideoImplement->config = NULL;
  367. }
  368. free(pSfVideoImplement);
  369. pSfVideoImplement = NULL;
  370. }
  371. return ret;
  372. }
  373. OMX_ERRORTYPE FlushBuffer(SF_OMX_COMPONENT *pSfOMXComponent, OMX_U32 nPort)
  374. {
  375. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  376. FunctionIn();
  377. if (nPort == 0)
  378. {
  379. ComponentImpl *pFeederComponent = (ComponentImpl *)(pSfVideoImplement->hSFComponentFeeder);
  380. if (pFeederComponent)
  381. {
  382. OMX_U32 inputQueueCount = pSfVideoImplement->functions->Queue_Get_Cnt(pFeederComponent->srcPort.inputQ);
  383. LOG(SF_LOG_PERF, "Flush %d buffers on inputPort\r\n", inputQueueCount);
  384. if (inputQueueCount > 0)
  385. {
  386. PortContainerExternal *input = NULL;
  387. while ((input = (PortContainerExternal*)pSfVideoImplement->functions->ComponentPortGetData(&pFeederComponent->srcPort)) != NULL)
  388. {
  389. if (strstr(pSfOMXComponent->componentName, "sf.video_decoder") != NULL)
  390. {
  391. pSfVideoImplement->functions->ComponentNotifyListeners(pFeederComponent, COMPONENT_EVENT_DEC_EMPTY_BUFFER_DONE, (void *)input);
  392. }
  393. else if (strstr(pSfOMXComponent->componentName, "sf.video_encoder") != NULL)
  394. {
  395. pSfVideoImplement->functions->ComponentNotifyListeners(pFeederComponent, COMPONENT_EVENT_ENC_EMPTY_BUFFER_DONE, (void *)input);
  396. }
  397. }
  398. }
  399. }
  400. }
  401. else if (nPort == 1)
  402. {
  403. ComponentImpl *pRendererComponent = (ComponentImpl *)(pSfVideoImplement->hSFComponentRender);
  404. if (pRendererComponent)
  405. {
  406. OMX_U32 OutputQueueCount = pSfVideoImplement->functions->Queue_Get_Cnt(pRendererComponent->sinkPort.inputQ);
  407. LOG(SF_LOG_PERF, "Flush %d buffers on outputPort\r\n", OutputQueueCount);
  408. if (OutputQueueCount > 0)
  409. {
  410. PortContainerExternal *output = NULL;
  411. while ((output = (PortContainerExternal*)pSfVideoImplement->functions->ComponentPortGetData(&pRendererComponent->sinkPort)) != NULL)
  412. {
  413. output->nFlags = 0x1;
  414. output->nFilledLen = 0;
  415. if (strstr(pSfOMXComponent->componentName, "sf.video_decoder") != NULL)
  416. {
  417. pSfVideoImplement->functions->ComponentNotifyListeners(pRendererComponent, COMPONENT_EVENT_DEC_FILL_BUFFER_DONE, (void *)output);
  418. }
  419. else if (strstr(pSfOMXComponent->componentName, "sf.video_encoder") != NULL)
  420. {
  421. pSfVideoImplement->functions->ComponentNotifyListeners(pRendererComponent, COMPONENT_EVENT_ENC_FILL_BUFFER_DONE, (void *)output);
  422. }
  423. }
  424. }
  425. }
  426. }
  427. FunctionOut();
  428. return OMX_ErrorNone;
  429. }
  430. static void sf_get_component_functions(SF_COMPONENT_FUNCTIONS *funcs, OMX_PTR *sohandle)
  431. {
  432. FunctionIn();
  433. funcs->ComponentCreate = dlsym(sohandle, "ComponentCreate");
  434. funcs->ComponentExecute = dlsym(sohandle, "ComponentExecute");
  435. funcs->ComponentGetParameter = dlsym(sohandle, "ComponentGetParameter");
  436. funcs->ComponentGetState = dlsym(sohandle, "ComponentGetState");
  437. funcs->ComponentNotifyListeners = dlsym(sohandle, "ComponentNotifyListeners");
  438. funcs->ComponentPortCreate = dlsym(sohandle, "ComponentPortCreate");
  439. funcs->ComponentPortDestroy = dlsym(sohandle, "ComponentPortDestroy");
  440. funcs->ComponentPortFlush = dlsym(sohandle, "ComponentPortFlush");
  441. funcs->ComponentPortGetData = dlsym(sohandle, "ComponentPortGetData");
  442. funcs->ComponentPortPeekData = dlsym(sohandle, "ComponentPortPeekData");
  443. funcs->ComponentPortSetData = dlsym(sohandle, "ComponentPortSetData");
  444. funcs->ComponentPortWaitReadyStatus = dlsym(sohandle, "ComponentPortWaitReadyStatus");
  445. funcs->ComponentRelease = dlsym(sohandle, "ComponentRelease");
  446. funcs->ComponentSetParameter = dlsym(sohandle, "ComponentSetParameter");
  447. funcs->ComponentStop = dlsym(sohandle, "ComponentStop");
  448. funcs->ComponentSetupTunnel = dlsym(sohandle, "ComponentSetupTunnel");
  449. funcs->ComponentWait = dlsym(sohandle, "ComponentWait");
  450. funcs->WaitBeforeComponentPortGetData = dlsym(sohandle, "WaitBeforeComponentPortGetData");
  451. funcs->ComponentChangeState = dlsym(sohandle, "ComponentChangeState");
  452. funcs->ComponentDestroy = dlsym(sohandle, "ComponentDestroy");
  453. funcs->ComponentRegisterListener = dlsym(sohandle, "ComponentRegisterListener");
  454. funcs->ComponentPortHasInputData = dlsym(sohandle, "ComponentPortHasInputData");
  455. funcs->ComponentPortGetSize = dlsym(sohandle, "ComponentPortGetSize");
  456. funcs->ComponentParamReturnTest = dlsym(sohandle, "ComponentParamReturnTest");
  457. //Listener
  458. funcs->SetupDecListenerContext = dlsym(sohandle, "SetupDecListenerContext");
  459. funcs->SetupEncListenerContext = dlsym(sohandle, "SetupEncListenerContext");
  460. funcs->ClearDecListenerContext = dlsym(sohandle, "ClearDecListenerContext");
  461. funcs->HandleDecCompleteSeqEvent = dlsym(sohandle, "HandleDecCompleteSeqEvent");
  462. funcs->HandleDecRegisterFbEvent = dlsym(sohandle, "HandleDecRegisterFbEvent");
  463. funcs->HandleDecGetOutputEvent = dlsym(sohandle, "HandleDecGetOutputEvent");
  464. funcs->HandleDecCloseEvent = dlsym(sohandle, "HandleDecCloseEvent");
  465. funcs->ClearEncListenerContext = dlsym(sohandle, "ClearEncListenerContext");
  466. funcs->HandleEncFullEvent = dlsym(sohandle, "HandleEncFullEvent");
  467. funcs->HandleEncGetOutputEvent = dlsym(sohandle, "HandleEncGetOutputEvent");
  468. funcs->HandleEncCompleteSeqEvent = dlsym(sohandle, "HandleEncCompleteSeqEvent");
  469. funcs->HandleEncGetEncCloseEvent = dlsym(sohandle, "HandleEncGetEncCloseEvent");
  470. funcs->EncoderListener = dlsym(sohandle, "EncoderListener");
  471. funcs->DecoderListener = dlsym(sohandle, "DecoderListener");
  472. // Helper
  473. funcs->SetDefaultEncTestConfig = dlsym(sohandle, "SetDefaultEncTestConfig");
  474. funcs->SetDefaultDecTestConfig = dlsym(sohandle, "SetDefaultDecTestConfig");
  475. funcs->LoadFirmware = dlsym(sohandle, "LoadFirmware");
  476. funcs->SetupEncoderOpenParam = dlsym(sohandle, "SetupEncoderOpenParam");
  477. funcs->SetUpDecoderOpenParam = dlsym(sohandle, "SetUpDecoderOpenParam");
  478. // VPU
  479. funcs->VPU_GetProductId = dlsym(sohandle, "VPU_GetProductId");
  480. funcs->Queue_Enqueue = dlsym(sohandle, "Queue_Enqueue");
  481. funcs->Queue_Get_Cnt = dlsym(sohandle, "Queue_Get_Cnt");
  482. funcs->VPU_DecClrDispFlag = dlsym(sohandle, "VPU_DecClrDispFlag");
  483. funcs->VPU_DecGetFrameBuffer = dlsym(sohandle, "VPU_DecGetFrameBuffer");
  484. funcs->Render_DecClrDispFlag = dlsym(sohandle, "Render_DecClrDispFlag");
  485. // VPU Log
  486. funcs->InitLog = dlsym(sohandle, "InitLog");
  487. funcs->DeInitLog = dlsym(sohandle, "DeInitLog");
  488. funcs->SetMaxLogLevel = dlsym(sohandle, "SetMaxLogLevel");
  489. funcs->GetMaxLogLevel = dlsym(sohandle, "GetMaxLogLevel");
  490. //Renderer
  491. funcs->AllocateFrameBuffer2 = dlsym(sohandle, "AllocateFrameBuffer2");
  492. funcs->AttachDMABuffer = dlsym(sohandle, "AttachDMABuffer");
  493. funcs->SetRenderTotalBufferNumber = dlsym(sohandle, "SetRenderTotalBufferNumber");
  494. funcs->GetRenderTotalBufferNumber = dlsym(sohandle, "GetRenderTotalBufferNumber");
  495. funcs->SetFeederTotalBufferNumber = dlsym(sohandle, "SetFeederTotalBufferNumber");
  496. funcs->WaitForExecoderReady = dlsym(sohandle, "WaitForExecoderReady");
  497. funcs->RemapDMABuffer = dlsym(sohandle, "RemapDMABuffer");
  498. FunctionOut();
  499. }
  500. SF_OMX_COMPONENT *GetSFOMXComponrntByComponent(Component *pComponent)
  501. {
  502. SF_OMX_COMPONENT *pSfOMXComponent = NULL;
  503. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = NULL;
  504. int size = GetNumberOfComponent();
  505. FunctionIn();
  506. for (int i = 0; i < size; i++)
  507. {
  508. pSfOMXComponent = sf_omx_component_list[i];
  509. if (pSfOMXComponent == NULL)
  510. {
  511. continue;
  512. }
  513. pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  514. if (pSfVideoImplement == NULL)
  515. {
  516. continue;
  517. }
  518. if (pSfVideoImplement->hSFComponentExecoder == pComponent || pSfVideoImplement->hSFComponentFeeder == pComponent || pSfVideoImplement->hSFComponentRender == pComponent)
  519. {
  520. break;
  521. }
  522. }
  523. if (pSfOMXComponent == NULL)
  524. {
  525. LOG(SF_LOG_ERR, "Could not get SfOMXComponent buy %p\r\n", pComponent);
  526. }
  527. FunctionOut();
  528. return pSfOMXComponent;
  529. }