SF_OMX_Vdec_decoder.c 85 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2021 StarFive Technology Co., Ltd.
  4. */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <sys/types.h>
  9. #include <unistd.h>
  10. #include <unistd.h>
  11. #include <fcntl.h>
  12. #include "SF_OMX_video_common.h"
  13. #include "SF_OMX_Core.h"
  14. #define DEC_StopThread OMX_CommandMax
  15. extern OMX_TICKS gInitTimeStamp;
  16. typedef struct DEC_CMD
  17. {
  18. OMX_COMMANDTYPE Cmd;
  19. OMX_U32 nParam;
  20. OMX_PTR pCmdData;
  21. }DEC_CMD;
  22. static char* Event2Str(unsigned long event)
  23. {
  24. char *event_str = NULL;
  25. switch (event)
  26. {
  27. case COMPONENT_EVENT_DEC_OPEN:
  28. event_str = "COMPONENT_EVENT_DEC_OPEN";
  29. break;
  30. case COMPONENT_EVENT_DEC_ISSUE_SEQ:
  31. event_str = "COMPONENT_EVENT_DEC_ISSUE_SEQ";
  32. break;
  33. case COMPONENT_EVENT_DEC_COMPLETE_SEQ:
  34. event_str = "COMPONENT_EVENT_DEC_COMPLETE_SEQ";
  35. break;
  36. case COMPONENT_EVENT_DEC_REGISTER_FB:
  37. event_str = "COMPONENT_EVENT_DEC_REGISTER_FB";
  38. break;
  39. case COMPONENT_EVENT_DEC_READY_ONE_FRAME:
  40. event_str = "COMPONENT_EVENT_DEC_READY_ONE_FRAME";
  41. break;
  42. case COMPONENT_EVENT_DEC_START_ONE_FRAME:
  43. event_str = "COMPONENT_EVENT_DEC_START_ONE_FRAME";
  44. break;
  45. case COMPONENT_EVENT_DEC_INTERRUPT:
  46. event_str = "COMPONENT_EVENT_DEC_INTERRUPT";
  47. break;
  48. case COMPONENT_EVENT_DEC_GET_OUTPUT_INFO:
  49. event_str = "COMPONENT_EVENT_DEC_GET_OUTPUT_INFO";
  50. break;
  51. case COMPONENT_EVENT_DEC_DECODED_ALL:
  52. event_str = "COMPONENT_EVENT_DEC_DECODED_ALL";
  53. break;
  54. case COMPONENT_EVENT_DEC_CLOSE:
  55. event_str = "COMPONENT_EVENT_DEC_CLOSE";
  56. break;
  57. case COMPONENT_EVENT_DEC_RESET_DONE:
  58. event_str = "COMPONENT_EVENT_DEC_RESET_DONE";
  59. break;
  60. case COMPONENT_EVENT_DEC_EMPTY_BUFFER_DONE:
  61. event_str = "COMPONENT_EVENT_DEC_EMPTY_BUFFER_DONE";
  62. break;
  63. case COMPONENT_EVENT_DEC_FILL_BUFFER_DONE:
  64. event_str = "COMPONENT_EVENT_DEC_FILL_BUFFER_DONE";
  65. break;
  66. case COMPONENT_EVENT_DEC_ALL:
  67. event_str = "COMPONENT_EVENT_DEC_ALL";
  68. break;
  69. }
  70. return event_str;
  71. }
  72. static void OnEventArrived(Component com, unsigned long event, void *data, void *context)
  73. {
  74. PortContainerExternal *pPortContainerExternal = (PortContainerExternal *)data;
  75. OMX_BUFFERHEADERTYPE *pOMXBuffer;
  76. OMX_BUFFERHEADERTYPE **ppBuffer;
  77. OMX_BUFFERHEADERTYPE *pBuffer;
  78. SF_OMX_BUF_INFO *pBufInfo;
  79. static OMX_U32 dec_cnt = 0;
  80. static struct timeval tv_old = {0};
  81. OMX_U32 fps = 0;
  82. OMX_U64 diff_time = 0; // ms
  83. FunctionIn();
  84. SF_OMX_COMPONENT *pSfOMXComponent = (SF_OMX_COMPONENT*)context;
  85. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  86. char *event_str = Event2Str(event);
  87. LOG(SF_LOG_INFO, "event=%lX %s\r\n", event, event_str);
  88. switch (event)
  89. {
  90. case COMPONENT_EVENT_DEC_EMPTY_BUFFER_DONE:
  91. if (pSfOMXComponent->bPortFlushing[0])
  92. {
  93. LOG(SF_LOG_INFO, "flushing,break\r\n");
  94. break;
  95. }
  96. pOMXBuffer = (OMX_BUFFERHEADERTYPE *)pPortContainerExternal->pAppPrivate;
  97. if (pOMXBuffer == NULL)
  98. {
  99. LOG(SF_LOG_WARN, "Could not find omx buffer by address\r\n");
  100. return;
  101. }
  102. ppBuffer = SF_Queue_Peek(pSfVideoImplement->inPortQ);
  103. if (ppBuffer)
  104. pBuffer = *ppBuffer;
  105. if (pBuffer == pOMXBuffer)
  106. {
  107. LOG(SF_LOG_INFO, "get buffer %p\r\n", pOMXBuffer);
  108. SF_Queue_Dequeue(pSfVideoImplement->inPortQ);
  109. }
  110. else
  111. {
  112. LOG(SF_LOG_INFO, "buffer %p gone, break.\r\n", pOMXBuffer);
  113. break;
  114. }
  115. LOG(SF_LOG_INFO, "Empty done h %p b %p\r\n", pOMXBuffer, pOMXBuffer->pBuffer);
  116. if (pSfOMXComponent->markType[0].hMarkTargetComponent != NULL)
  117. {
  118. LOG(SF_LOG_INFO, "set Component mark %p\r\n", pSfOMXComponent->markType[0].hMarkTargetComponent);
  119. pOMXBuffer->hMarkTargetComponent = pSfOMXComponent->markType[0].hMarkTargetComponent;
  120. pOMXBuffer->pMarkData = pSfOMXComponent->markType[0].pMarkData;
  121. pSfOMXComponent->markType[0].hMarkTargetComponent = NULL;
  122. pSfOMXComponent->markType[0].pMarkData = NULL;
  123. }
  124. if (pOMXBuffer->hMarkTargetComponent != NULL)
  125. {
  126. if (pOMXBuffer->hMarkTargetComponent == pSfOMXComponent->pOMXComponent)
  127. {
  128. LOG(SF_LOG_INFO, "Component mark hit\r\n");
  129. pSfOMXComponent->callbacks->EventHandler(pSfOMXComponent->pOMXComponent,
  130. pSfOMXComponent->pAppData,
  131. OMX_EventMark,
  132. 0, 0, pOMXBuffer->pMarkData);
  133. } else {
  134. LOG(SF_LOG_INFO, "Component propagate mark from input port\r\n");
  135. pSfOMXComponent->propagateMarkType.hMarkTargetComponent = pOMXBuffer->hMarkTargetComponent;
  136. pSfOMXComponent->propagateMarkType.pMarkData = pOMXBuffer->pMarkData;
  137. }
  138. }
  139. if (pSfOMXComponent->state == OMX_StatePause)
  140. {
  141. LOG(SF_LOG_INFO, "tmp store buf when pause\r\n");
  142. SF_Queue_Enqueue(pSfVideoImplement->inPauseQ, &pOMXBuffer);
  143. }
  144. else{
  145. pSfOMXComponent->callbacks->EmptyBufferDone(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData, pOMXBuffer);
  146. }
  147. break;
  148. case COMPONENT_EVENT_DEC_FILL_BUFFER_DONE:
  149. {
  150. struct timeval tv;
  151. if (pSfOMXComponent->bPortFlushing[1] && !pSfOMXComponent->memory_optimization)
  152. {
  153. LOG(SF_LOG_INFO, "flushing,break\r\n");
  154. break;
  155. }
  156. pOMXBuffer = (OMX_BUFFERHEADERTYPE *)pPortContainerExternal->pAppPrivate;
  157. if (pOMXBuffer == NULL)
  158. {
  159. LOG(SF_LOG_WARN, "Could not find omx buffer by address\r\n");
  160. return;
  161. }
  162. if (!pSfOMXComponent->memory_optimization){
  163. ppBuffer = SF_Queue_Peek(pSfVideoImplement->outPortQ);
  164. if (ppBuffer)
  165. pBuffer = *ppBuffer;
  166. if (pBuffer == pOMXBuffer)
  167. {
  168. LOG(SF_LOG_INFO, "get buffer %p\r\n", pOMXBuffer);
  169. SF_Queue_Dequeue(pSfVideoImplement->outPortQ);
  170. }
  171. else
  172. {
  173. LOG(SF_LOG_INFO, "buffer %p gone, break.\r\n", pOMXBuffer);
  174. break;
  175. }
  176. }
  177. gettimeofday(&tv, NULL);
  178. if (gInitTimeStamp == 0)
  179. {
  180. gInitTimeStamp = tv.tv_sec * 1000000 + tv.tv_usec;
  181. }
  182. pOMXBuffer->nFilledLen = pPortContainerExternal->nFilledLen;
  183. pOMXBuffer->nTimeStamp = tv.tv_sec * 1000000 + tv.tv_usec - gInitTimeStamp;
  184. pBufInfo = pOMXBuffer->pOutputPortPrivate;
  185. // Following is to print the decoding fps
  186. if (dec_cnt == 0) {
  187. tv_old = tv;
  188. }
  189. if (dec_cnt++ >= 50) {
  190. diff_time = (tv.tv_sec - tv_old.tv_sec) * 1000 + (tv.tv_usec - tv_old.tv_usec) / 1000;
  191. fps = 1000 * (dec_cnt - 1) / diff_time;
  192. dec_cnt = 0;
  193. LOG(SF_LOG_WARN, "Decoding fps: %d \r\n", fps);
  194. }
  195. if (pPortContainerExternal->nFlags & 0x1)
  196. pOMXBuffer->nFlags |= OMX_BUFFERFLAG_EOS;
  197. LOG(SF_LOG_PERF, "OMX finish one buffer, address = %p, size = %d, nTimeStamp = %d, nFlags = %X\r\n",
  198. pOMXBuffer->pBuffer, pOMXBuffer->nFilledLen, pOMXBuffer->nTimeStamp, pOMXBuffer->nFlags);
  199. LOG(SF_LOG_INFO, "indexFrameDisplay = %d, OMXBuferFlag = %d, OMXBufferAddr = %p\r\n",
  200. pPortContainerExternal->index, pBufInfo->index, pOMXBuffer->pBuffer);
  201. ComponentImpl *pRendererComponent = (ComponentImpl *)pSfVideoImplement->hSFComponentRender;
  202. LOG(SF_LOG_PERF, "output queue count=%d/%d\r\n", pSfVideoImplement->functions->Queue_Get_Cnt(pRendererComponent->sinkPort.inputQ),
  203. pSfOMXComponent->portDefinition[1].nBufferCountActual);
  204. if (pSfOMXComponent->propagateMarkType.hMarkTargetComponent != NULL) {
  205. LOG(SF_LOG_INFO, "Component propagate mark to output port\r\n");
  206. pOMXBuffer->hMarkTargetComponent = pSfOMXComponent->propagateMarkType.hMarkTargetComponent;
  207. pOMXBuffer->pMarkData = pSfOMXComponent->propagateMarkType.pMarkData;
  208. pSfOMXComponent->propagateMarkType.hMarkTargetComponent = NULL;
  209. pSfOMXComponent->propagateMarkType.pMarkData = NULL;
  210. }
  211. if (pSfOMXComponent->state == OMX_StatePause)
  212. {
  213. LOG(SF_LOG_INFO, "tmp store buf when pause\r\n");
  214. SF_Queue_Enqueue(pSfVideoImplement->outPauseQ, &pOMXBuffer);
  215. }
  216. else{
  217. #if 0
  218. SF_OMX_BUF_INFO *pBufInfo = pOMXBuffer->pOutputPortPrivate;
  219. FILE *fb = fopen("./out.yuv", "ab+");
  220. LOG(SF_LOG_INFO, "%p %d %p\r\n", pOMXBuffer->pBuffer, pOMXBuffer->nFilledLen, pBufInfo->remap_vaddr);
  221. fwrite(pOMXBuffer->pBuffer, 1, pOMXBuffer->nFilledLen, fb);
  222. fclose(fb);
  223. }
  224. #endif
  225. if (pOMXBuffer->nFlags & OMX_BUFFERFLAG_EOS)
  226. {
  227. pSfOMXComponent->callbacks->EventHandler(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData, OMX_EventBufferFlag,
  228. 1, pOMXBuffer->nFlags, NULL);
  229. }
  230. pSfOMXComponent->callbacks->FillBufferDone(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData, pOMXBuffer);
  231. }
  232. }
  233. break;
  234. case COMPONENT_EVENT_DEC_REGISTER_FB:
  235. {
  236. /*The width and height vpu return will align to 16, eg: 1080 will be 1088. so check scale value at first.*/
  237. TestDecConfig *testConfig = (TestDecConfig *)pSfVideoImplement->testConfig;
  238. OMX_U32 nWidth = testConfig->scaleDownWidth;
  239. OMX_U32 nHeight = testConfig->scaleDownHeight;
  240. if (nWidth <= 0 || nHeight <= 0)
  241. {
  242. /*If scale value not set, then get value from vpu*/
  243. FrameBuffer *frameBuffer = (FrameBuffer *)data;
  244. nWidth = frameBuffer->width;
  245. nHeight = frameBuffer->height;
  246. }
  247. LOG(SF_LOG_INFO, "Get Output width = %d, height = %d\r\n", nWidth, nHeight);
  248. pSfOMXComponent->portDefinition[1].format.video.nFrameWidth = nWidth;
  249. pSfOMXComponent->portDefinition[1].format.video.nFrameHeight = nHeight;
  250. pSfOMXComponent->portDefinition[1].format.video.nStride = nWidth;
  251. pSfOMXComponent->portDefinition[1].format.video.nSliceHeight = nHeight;
  252. ComponentImpl *pRendererComponent = (ComponentImpl *)pSfVideoImplement->hSFComponentRender;
  253. pSfOMXComponent->portDefinition[1].nBufferCountActual = pSfVideoImplement->functions->GetRenderTotalBufferNumber(pRendererComponent);
  254. pSfOMXComponent->portDefinition[1].nBufferCountMin = pSfOMXComponent->portDefinition[1].nBufferCountActual;
  255. /*Caculate buffer size by eColorFormat*/
  256. switch (pSfOMXComponent->portDefinition[1].format.video.eColorFormat)
  257. {
  258. case OMX_COLOR_FormatYUV420Planar:
  259. case OMX_COLOR_FormatYUV420SemiPlanar:
  260. case OMX_COLOR_FormatYVU420SemiPlanar:
  261. if (nWidth && nHeight) {
  262. pSfOMXComponent->portDefinition[1].nBufferSize = (nWidth * nHeight * 3) / 2;
  263. }
  264. break;
  265. default:
  266. if (nWidth && nHeight) {
  267. pSfOMXComponent->portDefinition[1].nBufferSize = nWidth * nHeight * 2;
  268. }
  269. break;
  270. }
  271. pSfOMXComponent->callbacks->EventHandler(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData, OMX_EventPortSettingsChanged,
  272. 1, OMX_IndexParamPortDefinition, NULL);
  273. }
  274. break;
  275. case COMPONENT_EVENT_DEC_INSUFFIC_RESOURCE:
  276. {
  277. LOG(SF_LOG_ERR, "Lack of memory for decoder buffer, process stop!\r\n");
  278. pSfOMXComponent->callbacks->EventHandler(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData, OMX_EventError,
  279. OMX_ErrorInsufficientResources, 0, NULL);
  280. ComponentImpl *pSFComponentDecoder = (ComponentImpl *)pSfVideoImplement->hSFComponentExecoder;
  281. ComponentImpl *pSFComponentFeeder = (ComponentImpl *)pSfVideoImplement->hSFComponentFeeder;
  282. ComponentImpl *pSFComponentRender = (ComponentImpl *)pSfVideoImplement->hSFComponentRender;
  283. void *ThreadRet = NULL;
  284. DEC_CMD cmd;
  285. cmd.Cmd = DEC_StopThread;
  286. SF_Queue_Enqueue(pSfVideoImplement->CmdQueue, &cmd);
  287. pthread_cancel(pSfVideoImplement->pCmdThread->pthread);
  288. pthread_join(pSfVideoImplement->pCmdThread->pthread, &ThreadRet);
  289. LOG(SF_LOG_INFO, "Cmd thread end %ld\r\n", (Uint64)ThreadRet);
  290. if (!pSfOMXComponent->memory_optimization)
  291. {
  292. LOG(SF_LOG_INFO,"feeder src q cnt %d\r\n",
  293. pSfVideoImplement->functions->Queue_Get_Cnt(((ComponentImpl *)(pSfVideoImplement->hSFComponentFeeder))->srcPort.inputQ));
  294. pSfVideoImplement->functions->ComponentStop(pSFComponentRender);
  295. pSfVideoImplement->functions->ComponentStop(pSFComponentDecoder);
  296. pSfVideoImplement->functions->ComponentStop(pSFComponentFeeder);
  297. FlushBuffer(pSfOMXComponent, 0);
  298. FlushBuffer(pSfOMXComponent, 1);
  299. pSfVideoImplement->functions->ComponentWait(pSFComponentRender);
  300. pSfVideoImplement->functions->ComponentWait(pSFComponentDecoder);
  301. pSfVideoImplement->functions->ComponentWait(pSFComponentFeeder);
  302. pSFComponentRender->terminate = OMX_TRUE;
  303. pSFComponentDecoder->terminate = OMX_TRUE;
  304. pSFComponentFeeder->terminate = OMX_TRUE;
  305. }
  306. else
  307. {
  308. pSFComponentDecoder->pause = OMX_TRUE;
  309. pSFComponentFeeder->pause = OMX_TRUE;
  310. pSFComponentRender->pause = OMX_TRUE;
  311. FlushBuffer(pSfOMXComponent, 0);
  312. FlushBuffer(pSfOMXComponent, 1);
  313. }
  314. pSfOMXComponent->state = OMX_StateInvalid;
  315. LOG(SF_LOG_ERR, "Component into invalid state!\r\n");
  316. pSfOMXComponent->callbacks->EventHandler(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData, OMX_EventError,
  317. OMX_ErrorInvalidState, 0, NULL);
  318. }
  319. break;
  320. case COMPONENT_EVENT_TERMINATED:
  321. break;
  322. case COMPONENT_EVENT_DEC_DECODED_ALL:
  323. LOG(SF_LOG_DEBUG,"renderer meet end\r\n");
  324. default:
  325. break;
  326. }
  327. FunctionOut();
  328. }
  329. static OMX_ERRORTYPE SF_OMX_EmptyThisBuffer(
  330. OMX_IN OMX_HANDLETYPE hComponent,
  331. OMX_IN OMX_BUFFERHEADERTYPE *pBuffer)
  332. {
  333. OMX_ERRORTYPE ret = OMX_ErrorNone;
  334. FunctionIn();
  335. if (hComponent == NULL || pBuffer == NULL)
  336. {
  337. ret = OMX_ErrorBadParameter;
  338. goto EXIT;
  339. }
  340. OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
  341. SF_OMX_COMPONENT *pSfOMXComponent = pOMXComponent->pComponentPrivate;
  342. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  343. ComponentImpl *pFeederComponent = (ComponentImpl *)pSfVideoImplement->hSFComponentFeeder;
  344. LOG(SF_LOG_DEBUG, "bufheader %p nFilledLen = %d, nFlags = %d, pBuffer = %p\r\n", pBuffer, pBuffer->nFilledLen, pBuffer->nFlags, pBuffer->pBuffer);
  345. if (!pSfOMXComponent->portDefinition[0].bEnabled)
  346. {
  347. LOG(SF_LOG_INFO, "feed buffer when input port stop\r\n");
  348. return OMX_ErrorIncorrectStateOperation;
  349. }
  350. if (pBuffer->nInputPortIndex != 0)
  351. {
  352. LOG(SF_LOG_INFO, "Incorrect nInputPortIndex %d\r\n", pBuffer->nInputPortIndex);
  353. return OMX_ErrorBadPortIndex;
  354. }
  355. PortContainerExternal *pPortContainerExternal = malloc(sizeof(PortContainerExternal));
  356. if (pPortContainerExternal == NULL)
  357. {
  358. LOG(SF_LOG_ERR, "malloc fail\r\n");
  359. return OMX_ErrorInsufficientResources;
  360. }
  361. memset(pPortContainerExternal, 0, sizeof(PortContainerExternal));
  362. pPortContainerExternal->pBuffer = pBuffer->pBuffer;
  363. pPortContainerExternal->nFilledLen = pBuffer->nFilledLen;
  364. pPortContainerExternal->nFlags = pBuffer->nFlags;
  365. pPortContainerExternal->pAppPrivate = (void*)pBuffer;
  366. SF_Queue_Enqueue(pSfVideoImplement->inPortQ, &pBuffer);
  367. if (pSfVideoImplement->functions->Queue_Enqueue(pFeederComponent->srcPort.inputQ, (void *)pPortContainerExternal) != OMX_TRUE)
  368. {
  369. LOG(SF_LOG_ERR, "%p:%p FAIL\r\n", pFeederComponent->srcPort.inputQ, pPortContainerExternal);
  370. free(pPortContainerExternal);
  371. return OMX_ErrorInsufficientResources;
  372. }
  373. LOG(SF_LOG_PERF, "input queue count=%d/%d\r\n", pSfVideoImplement->functions->Queue_Get_Cnt(pFeederComponent->srcPort.inputQ),
  374. pSfOMXComponent->portDefinition[0].nBufferCountActual);
  375. //LOG(SF_LOG_INFO, "input buffer address = %p, size = %d, flag = %x\r\n", pBuffer->pBuffer, pBuffer->nFilledLen, pBuffer->nFlags);
  376. if (pBuffer->nFlags & OMX_BUFFERFLAG_EOS)
  377. {
  378. pSfVideoImplement->rev_eos = OMX_TRUE;
  379. }
  380. free(pPortContainerExternal);
  381. pFeederComponent->pause = OMX_FALSE;
  382. EXIT:
  383. FunctionOut();
  384. return ret;
  385. }
  386. static OMX_ERRORTYPE SF_OMX_FillThisBuffer(
  387. OMX_IN OMX_HANDLETYPE hComponent,
  388. OMX_IN OMX_BUFFERHEADERTYPE *pBuffer)
  389. {
  390. OMX_ERRORTYPE ret = OMX_ErrorNone;
  391. FunctionIn();
  392. if (hComponent == NULL || pBuffer == NULL)
  393. {
  394. ret = OMX_ErrorBadParameter;
  395. goto EXIT;
  396. }
  397. OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
  398. SF_OMX_COMPONENT *pSfOMXComponent = (SF_OMX_COMPONENT *)pOMXComponent->pComponentPrivate;
  399. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  400. SF_OMX_BUF_INFO *pBufInfo = (SF_OMX_BUF_INFO *)pBuffer->pOutputPortPrivate;
  401. ComponentImpl *pRendererComponent = (ComponentImpl *)pSfVideoImplement->hSFComponentRender;
  402. LOG(SF_LOG_DEBUG, "bufheader %p nFilledLen = %d, nFlags = %d, pBuffer = %p\r\n", pBuffer, pBuffer->nFilledLen, pBuffer->nFlags, pBuffer->pBuffer);
  403. if (!pSfOMXComponent->portDefinition[1].bEnabled)
  404. {
  405. LOG(SF_LOG_INFO, "feed buffer when output port stop\r\n");
  406. return OMX_ErrorIncorrectStateOperation;
  407. }
  408. if (pBuffer->nOutputPortIndex != 1)
  409. {
  410. LOG(SF_LOG_INFO, "Incorrect nOutputPortIndex %d\r\n", pBuffer->nOutputPortIndex);
  411. return OMX_ErrorBadPortIndex;
  412. }
  413. PortContainerExternal *pPortContainerExternal = malloc(sizeof(PortContainerExternal));
  414. if (pPortContainerExternal == NULL)
  415. {
  416. LOG(SF_LOG_ERR, "malloc fail\r\n");
  417. return OMX_ErrorInsufficientResources;
  418. }
  419. memset(pPortContainerExternal, 0, sizeof(PortContainerExternal));
  420. pPortContainerExternal->pBuffer = pBuffer->pBuffer;
  421. pPortContainerExternal->nFilledLen = pBuffer->nAllocLen;
  422. pPortContainerExternal->pAppPrivate = (void*)pBuffer;
  423. if (gInitTimeStamp != 0 && pSfOMXComponent->memory_optimization)
  424. {
  425. int clear = pSfVideoImplement->frame_array[pSfVideoImplement->frame_array_index];
  426. pSfVideoImplement->functions->Render_DecClrDispFlag(pRendererComponent->context, clear);
  427. pSfVideoImplement->frame_array[pSfVideoImplement->frame_array_index] = pBufInfo->index;
  428. LOG(SF_LOG_INFO, "store display flag: %d, clear display flag: %d\r\n",
  429. pSfVideoImplement->frame_array[pSfVideoImplement->frame_array_index], clear);
  430. pSfVideoImplement->frame_array_index ++;
  431. }
  432. if (pSfVideoImplement->frame_array_index == MAX_INDEX) pSfVideoImplement->frame_array_index = 0;
  433. if (!pSfOMXComponent->memory_optimization)
  434. SF_Queue_Enqueue(pSfVideoImplement->outPortQ, &pBuffer);
  435. if (pSfVideoImplement->functions->Queue_Enqueue(pRendererComponent->sinkPort.inputQ, (void *)pPortContainerExternal) == FALSE)
  436. {
  437. LOG(SF_LOG_ERR, "%p:%p FAIL\r\n", pRendererComponent->sinkPort.inputQ, pPortContainerExternal);
  438. free(pPortContainerExternal);
  439. return OMX_ErrorInsufficientResources;
  440. }
  441. LOG(SF_LOG_PERF, "output queue count=%d/%d\r\n", pSfVideoImplement->functions->Queue_Get_Cnt(pRendererComponent->sinkPort.inputQ),
  442. pSfOMXComponent->portDefinition[1].nBufferCountActual);
  443. free(pPortContainerExternal);
  444. pRendererComponent->pause = OMX_FALSE;
  445. EXIT:
  446. FunctionOut();
  447. return ret;
  448. }
  449. static OMX_ERRORTYPE SF_OMX_UseBuffer(
  450. OMX_IN OMX_HANDLETYPE hComponent,
  451. OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr,
  452. OMX_IN OMX_U32 nPortIndex,
  453. OMX_IN OMX_PTR pAppPrivate,
  454. OMX_IN OMX_U32 nSizeBytes,
  455. OMX_IN OMX_U8 *pBuffer)
  456. {
  457. OMX_ERRORTYPE ret = OMX_ErrorNone;
  458. OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
  459. SF_OMX_COMPONENT *pSfOMXComponent = pOMXComponent->pComponentPrivate;
  460. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  461. ComponentImpl *pComponentRender = (ComponentImpl *)pSfVideoImplement->hSFComponentRender;
  462. OMX_U32 i;
  463. FunctionIn();
  464. if (hComponent == NULL)
  465. {
  466. ret = OMX_ErrorBadParameter;
  467. goto EXIT;
  468. }
  469. OMX_BUFFERHEADERTYPE *temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)malloc(sizeof(OMX_BUFFERHEADERTYPE));
  470. if (temp_bufferHeader == NULL)
  471. {
  472. LOG(SF_LOG_ERR, "malloc fail\r\n");
  473. return OMX_ErrorInsufficientResources;
  474. }
  475. memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
  476. SF_OMX_BUF_INFO *pBufInfo = (SF_OMX_BUF_INFO *)malloc(sizeof(SF_OMX_BUF_INFO));
  477. if (pBufInfo == NULL)
  478. {
  479. LOG(SF_LOG_ERR, "malloc fail\r\n");
  480. free(temp_bufferHeader);
  481. return OMX_ErrorInsufficientResources;
  482. }
  483. temp_bufferHeader->nAllocLen = nSizeBytes;
  484. temp_bufferHeader->pAppPrivate = pAppPrivate;
  485. temp_bufferHeader->pBuffer = pBuffer;
  486. temp_bufferHeader->nSize = sizeof(OMX_BUFFERHEADERTYPE);
  487. memcpy(&(temp_bufferHeader->nVersion), &(pSfOMXComponent->componentVersion), sizeof(OMX_VERSIONTYPE));
  488. *ppBufferHdr = temp_bufferHeader;
  489. if (nPortIndex == 1)
  490. {
  491. for (i = 0; i < MAX_BUFF_NUM; i++)
  492. {
  493. if (!pSfOMXComponent->pBufferArray[1][i])
  494. {
  495. if ((!pComponentRender) || (!pSfOMXComponent->memory_optimization)
  496. || (pSfVideoImplement->functions->AttachDMABuffer(pComponentRender, (Uint64)pBuffer, nSizeBytes) == FALSE))
  497. {
  498. LOG(SF_LOG_INFO, "Failed to attach dma buffer, no memory optimization\r\n");
  499. pSfOMXComponent->memory_optimization = OMX_FALSE;
  500. }
  501. pBufInfo->type = SF_BUFFER_DMA_EXTERNAL;
  502. pBufInfo->index = i;
  503. temp_bufferHeader->pOutputPortPrivate = (OMX_PTR)pBufInfo;
  504. temp_bufferHeader->nOutputPortIndex = 1;
  505. pSfOMXComponent->pBufferArray[1][i] = temp_bufferHeader;
  506. pSfOMXComponent->assignedBufferNum[1] ++;
  507. if (pSfOMXComponent->assignedBufferNum[1] == pSfOMXComponent->portDefinition[1].nBufferCountActual)
  508. {
  509. pSfOMXComponent->portDefinition[1].bPopulated = OMX_TRUE;
  510. SF_SemaphorePost(pSfOMXComponent->portSemaphore[1]);
  511. }
  512. break;
  513. }
  514. }
  515. if (i == MAX_BUFF_NUM){
  516. LOG(SF_LOG_ERR, "buffer array full\r\n");
  517. free(temp_bufferHeader);
  518. free(pBufInfo);
  519. ret = OMX_ErrorInsufficientResources;
  520. }
  521. }
  522. else if (nPortIndex == 0)
  523. {
  524. for (i = 0; i < MAX_BUFF_NUM; i++)
  525. {
  526. if (!pSfOMXComponent->pBufferArray[0][i])
  527. {
  528. pBufInfo->type = SF_BUFFER_DMA_EXTERNAL;
  529. pBufInfo->index = i;
  530. temp_bufferHeader->pInputPortPrivate = (OMX_PTR)pBufInfo;
  531. temp_bufferHeader->nInputPortIndex = 0;
  532. pSfOMXComponent->pBufferArray[0][i] = temp_bufferHeader;
  533. pSfOMXComponent->assignedBufferNum[0] ++;
  534. if (pSfOMXComponent->assignedBufferNum[0] == pSfOMXComponent->portDefinition[0].nBufferCountActual)
  535. {
  536. pSfOMXComponent->portDefinition[0].bPopulated = OMX_TRUE;
  537. SF_SemaphorePost(pSfOMXComponent->portSemaphore[0]);
  538. }
  539. break;
  540. }
  541. }
  542. if (i == MAX_BUFF_NUM){
  543. LOG(SF_LOG_ERR, "buffer array full\r\n");
  544. free(temp_bufferHeader);
  545. free(pBufInfo);
  546. ret = OMX_ErrorInsufficientResources;
  547. }
  548. }
  549. LOG(SF_LOG_INFO, "header %p pBuffer address = %p on port %d\r\n", temp_bufferHeader, temp_bufferHeader->pBuffer, nPortIndex);
  550. EXIT:
  551. FunctionOut();
  552. return ret;
  553. }
  554. static OMX_ERRORTYPE SF_OMX_AllocateBuffer(
  555. OMX_IN OMX_HANDLETYPE hComponent,
  556. OMX_INOUT OMX_BUFFERHEADERTYPE **ppBuffer,
  557. OMX_IN OMX_U32 nPortIndex,
  558. OMX_IN OMX_PTR pAppPrivate,
  559. OMX_IN OMX_U32 nSizeBytes)
  560. {
  561. OMX_ERRORTYPE ret = OMX_ErrorNone;
  562. OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
  563. SF_OMX_COMPONENT *pSfOMXComponent = pOMXComponent->pComponentPrivate;
  564. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  565. ComponentImpl *pComponentRender = (ComponentImpl *)pSfVideoImplement->hSFComponentRender;
  566. OMX_U32 i;
  567. FunctionIn();
  568. if (nSizeBytes == 0)
  569. {
  570. LOG(SF_LOG_WARN, "nSizeBytes = %d, use default buffer size\r\n", nSizeBytes);
  571. nSizeBytes = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
  572. }
  573. OMX_BUFFERHEADERTYPE *temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)malloc(sizeof(OMX_BUFFERHEADERTYPE));
  574. if (temp_bufferHeader == NULL)
  575. {
  576. LOG(SF_LOG_ERR, "malloc fail\r\n");
  577. return OMX_ErrorInsufficientResources;
  578. }
  579. memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
  580. SF_OMX_BUF_INFO *pBufInfo = (SF_OMX_BUF_INFO *)malloc(sizeof(SF_OMX_BUF_INFO));
  581. if (pBufInfo == NULL)
  582. {
  583. LOG(SF_LOG_ERR, "malloc fail\r\n");
  584. free(temp_bufferHeader);
  585. return OMX_ErrorInsufficientResources;
  586. }
  587. temp_bufferHeader->nAllocLen = nSizeBytes;
  588. temp_bufferHeader->pAppPrivate = pAppPrivate;
  589. temp_bufferHeader->nSize = sizeof(OMX_BUFFERHEADERTYPE);
  590. memcpy(&(temp_bufferHeader->nVersion), &(pSfOMXComponent->componentVersion), sizeof(OMX_VERSIONTYPE));
  591. if (nPortIndex == 1)
  592. {
  593. for (i = 0; i < MAX_BUFF_NUM; i++)
  594. {
  595. if (!pSfOMXComponent->pBufferArray[1][i])
  596. {
  597. // Alloc DMA memory first
  598. if (pSfOMXComponent->memory_optimization)
  599. {
  600. OMX_U32 nLinearBufferSize, nFrameWidth, nFrameHeight;
  601. nFrameWidth = OMX_ALIGN32(pSfOMXComponent->portDefinition[1].format.video.nFrameWidth);
  602. nFrameHeight = pSfOMXComponent->portDefinition[1].format.video.nFrameHeight;
  603. nLinearBufferSize = nFrameWidth * nFrameHeight * 3 / 2;
  604. nLinearBufferSize = (nLinearBufferSize > nSizeBytes)? nLinearBufferSize : nSizeBytes;
  605. temp_bufferHeader->pBuffer = pSfVideoImplement->functions->AllocateFrameBuffer2(pComponentRender, nLinearBufferSize);
  606. }
  607. // DMA Memory alloc fail, goto normal alloc
  608. if (temp_bufferHeader->pBuffer == NULL)
  609. {
  610. pSfOMXComponent->memory_optimization = OMX_FALSE;
  611. temp_bufferHeader->pBuffer = malloc(nSizeBytes);
  612. memset(temp_bufferHeader->pBuffer, 0, nSizeBytes);
  613. pBufInfo->type = SF_BUFFER_NOMAL;
  614. LOG(SF_LOG_PERF, "Use normal buffer\r\n");
  615. }
  616. else
  617. {
  618. pBufInfo->type = SF_BUFFER_DMA;
  619. LOG(SF_LOG_PERF, "Use DMA buffer\r\n");
  620. }
  621. pBufInfo->index = i;
  622. temp_bufferHeader->pOutputPortPrivate = (OMX_PTR)pBufInfo;
  623. temp_bufferHeader->nOutputPortIndex = 1;
  624. pSfOMXComponent->pBufferArray[1][i] = temp_bufferHeader;
  625. pSfOMXComponent->assignedBufferNum[1] ++;
  626. if (pSfOMXComponent->assignedBufferNum[1] == pSfOMXComponent->portDefinition[1].nBufferCountActual)
  627. {
  628. pSfOMXComponent->portDefinition[1].bPopulated = OMX_TRUE;
  629. SF_SemaphorePost(pSfOMXComponent->portSemaphore[1]);
  630. }
  631. break;
  632. }
  633. }
  634. if (i == MAX_BUFF_NUM){
  635. LOG(SF_LOG_ERR, "buffer array full\r\n");
  636. temp_bufferHeader->pBuffer = NULL;
  637. }
  638. }
  639. else if (nPortIndex == 0)
  640. {
  641. for (i = 0; i < MAX_BUFF_NUM; i++)
  642. {
  643. if (!pSfOMXComponent->pBufferArray[0][i])
  644. {
  645. temp_bufferHeader->pBuffer = malloc(nSizeBytes);
  646. memset(temp_bufferHeader->pBuffer, 0, nSizeBytes);
  647. pBufInfo->type = SF_BUFFER_NOMAL;
  648. pBufInfo->index = i;
  649. temp_bufferHeader->pInputPortPrivate = (OMX_PTR)pBufInfo;
  650. temp_bufferHeader->nInputPortIndex = 0;
  651. pSfOMXComponent->pBufferArray[0][i] = temp_bufferHeader;
  652. pSfOMXComponent->assignedBufferNum[0] ++;
  653. if (pSfOMXComponent->assignedBufferNum[0] == pSfOMXComponent->portDefinition[0].nBufferCountActual)
  654. {
  655. pSfOMXComponent->portDefinition[0].bPopulated = OMX_TRUE;
  656. SF_SemaphorePost(pSfOMXComponent->portSemaphore[0]);
  657. }
  658. break;
  659. }
  660. }
  661. if (i == MAX_BUFF_NUM){
  662. LOG(SF_LOG_ERR, "buffer array full\r\n");
  663. temp_bufferHeader->pBuffer = NULL;
  664. }
  665. }
  666. if (temp_bufferHeader->pBuffer == NULL)
  667. {
  668. free(temp_bufferHeader);
  669. free(pBufInfo);
  670. LOG(SF_LOG_ERR, "malloc fail\r\n");
  671. return OMX_ErrorInsufficientResources;
  672. }
  673. *ppBuffer = temp_bufferHeader;
  674. LOG(SF_LOG_INFO, "header %p pBuffer address = %p on port %d\r\n", temp_bufferHeader, temp_bufferHeader->pBuffer, nPortIndex);
  675. FunctionOut();
  676. return ret;
  677. }
  678. static OMX_ERRORTYPE SF_OMX_GetParameter(
  679. OMX_IN OMX_HANDLETYPE hComponent,
  680. OMX_IN OMX_INDEXTYPE nParamIndex,
  681. OMX_INOUT OMX_PTR ComponentParameterStructure)
  682. {
  683. OMX_ERRORTYPE ret = OMX_ErrorNone;
  684. OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
  685. SF_OMX_COMPONENT *pSfOMXComponent = pOMXComponent->pComponentPrivate;
  686. FunctionIn();
  687. LOG(SF_LOG_INFO, "Get parameter on index %X\r\n", nParamIndex);
  688. if (hComponent == NULL || ComponentParameterStructure == NULL)
  689. {
  690. ret = OMX_ErrorBadParameter;
  691. goto EXIT;
  692. }
  693. switch ((OMX_U32)nParamIndex)
  694. {
  695. case OMX_IndexParamVideoInit:
  696. {
  697. OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure;
  698. portParam->nPorts = 2;
  699. portParam->nStartPortNumber = 0;
  700. }
  701. break;
  702. case OMX_IndexParamAudioInit:
  703. case OMX_IndexParamImageInit:
  704. case OMX_IndexParamOtherInit:
  705. {
  706. OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure;
  707. portParam->nPorts = 0;
  708. portParam->nStartPortNumber = 0;
  709. }
  710. break;
  711. case OMX_IndexParamVideoPortFormat:
  712. {
  713. OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
  714. OMX_U32 index = portFormat->nIndex;
  715. if (portFormat->nPortIndex == 0)
  716. {
  717. if (index > 0)
  718. {
  719. ret = OMX_ErrorNoMore;
  720. break;
  721. }
  722. portFormat->eCompressionFormat = pSfOMXComponent->portDefinition[0].format.video.eCompressionFormat;
  723. portFormat->eColorFormat = pSfOMXComponent->portDefinition[0].format.video.eColorFormat;
  724. portFormat->xFramerate = pSfOMXComponent->portDefinition[0].format.video.xFramerate;
  725. }
  726. else if (portFormat->nPortIndex == 1)
  727. {
  728. switch (index)
  729. {
  730. case 0:
  731. portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
  732. portFormat->eColorFormat = OMX_COLOR_FormatYUV420Planar;
  733. portFormat->xFramerate = pSfOMXComponent->portDefinition[1].format.video.xFramerate;
  734. break;
  735. case 1:
  736. portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
  737. portFormat->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
  738. portFormat->xFramerate = pSfOMXComponent->portDefinition[1].format.video.xFramerate;
  739. break;
  740. case 2:
  741. portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
  742. portFormat->eColorFormat = OMX_COLOR_FormatYVU420SemiPlanar;
  743. portFormat->xFramerate = pSfOMXComponent->portDefinition[1].format.video.xFramerate;
  744. break;
  745. default:
  746. if (index > 0)
  747. {
  748. ret = OMX_ErrorNoMore;
  749. }
  750. break;
  751. }
  752. }
  753. else
  754. {
  755. ret = OMX_ErrorBadPortIndex;
  756. }
  757. }
  758. break;
  759. case OMX_IndexParamVideoBitrate:
  760. break;
  761. case OMX_IndexParamVideoQuantization:
  762. break;
  763. case OMX_IndexParamPortDefinition:{
  764. OMX_PARAM_PORTDEFINITIONTYPE *pPortDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
  765. OMX_U32 portIndex = pPortDefinition->nPortIndex;
  766. OMX_PARAM_PORTDEFINITIONTYPE *pSrcDefinition;
  767. if (portIndex < 2)
  768. {
  769. pSrcDefinition = &pSfOMXComponent->portDefinition[portIndex];
  770. LOG(SF_LOG_INFO, "Get parameter width = %d, height = %d from port %X\r\n",
  771. pSrcDefinition->format.video.nFrameWidth, pSrcDefinition->format.video.nFrameHeight, portIndex);
  772. memcpy(pPortDefinition, pSrcDefinition, pPortDefinition->nSize);
  773. }
  774. else
  775. {
  776. LOG(SF_LOG_INFO,"Bad port index %d\r\n",portIndex);
  777. ret = OMX_ErrorBadPortIndex;
  778. }
  779. }
  780. break;
  781. case OMX_IndexParamVideoIntraRefresh:
  782. break;
  783. case OMX_IndexParamStandardComponentRole:
  784. {
  785. OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)ComponentParameterStructure;
  786. strcpy((OMX_STRING)(pComponentRole->cRole), pSfOMXComponent->componentRule);
  787. }
  788. break;
  789. case OMX_IndexParamVideoAvc:
  790. {
  791. OMX_VIDEO_PARAM_AVCTYPE *sFormatAvc = (OMX_VIDEO_PARAM_AVCTYPE *)ComponentParameterStructure;
  792. sFormatAvc->eProfile = OMX_VIDEO_AVCProfileBaseline;
  793. sFormatAvc->eLevel = OMX_VIDEO_AVCLevel1;
  794. }
  795. break;
  796. case OMX_IndexParamVideoHevc:
  797. break;
  798. case OMX_IndexParamVideoProfileLevelQuerySupported:
  799. ret = OMX_ErrorNoMore;
  800. break;
  801. case OMX_IndexParamCompBufferSupplier:
  802. {
  803. OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplier = (OMX_PARAM_BUFFERSUPPLIERTYPE *)ComponentParameterStructure;
  804. OMX_U32 portIndex = bufferSupplier->nPortIndex;
  805. if (portIndex >= 2)
  806. ret = OMX_ErrorBadPortIndex;
  807. }
  808. break;
  809. default:
  810. ret = OMX_ErrorUnsupportedIndex;
  811. break;
  812. }
  813. EXIT:
  814. FunctionOut();
  815. return ret;
  816. }
  817. static OMX_ERRORTYPE SF_OMX_SetParameter(
  818. OMX_IN OMX_HANDLETYPE hComponent,
  819. OMX_IN OMX_INDEXTYPE nIndex,
  820. OMX_IN OMX_PTR ComponentParameterStructure)
  821. {
  822. OMX_ERRORTYPE ret = OMX_ErrorNone;
  823. FunctionIn();
  824. if (hComponent == NULL || ComponentParameterStructure == NULL)
  825. {
  826. ret = OMX_ErrorBadParameter;
  827. goto EXIT;
  828. }
  829. OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
  830. SF_OMX_COMPONENT *pSfOMXComponent = pOMXComponent->pComponentPrivate;
  831. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  832. if (pSfOMXComponent == NULL)
  833. {
  834. ret = OMX_ErrorBadParameter;
  835. goto EXIT;
  836. }
  837. TestDecConfig *testConfig = pSfVideoImplement->testConfig;
  838. LOG(SF_LOG_INFO, "Set parameter on index %X\r\n", nIndex);
  839. switch ((OMX_U32)nIndex)
  840. {
  841. case OMX_IndexParamVideoPortFormat:
  842. {
  843. OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
  844. OMX_U32 nPortIndex = portFormat->nPortIndex;
  845. TestDecConfig *pTestDecConfig = (TestDecConfig *)pSfVideoImplement->testConfig;
  846. OMX_PARAM_PORTDEFINITIONTYPE *pPort = &pSfOMXComponent->portDefinition[nPortIndex];
  847. LOG(SF_LOG_DEBUG, "Set video format to port %d color %d\r\n", portFormat->nPortIndex, portFormat->eColorFormat);
  848. if (nPortIndex == 0)
  849. {
  850. if (portFormat->eColorFormat != pPort->format.video.eColorFormat ||
  851. portFormat->eCompressionFormat != pPort->format.video.eCompressionFormat)
  852. {
  853. return OMX_ErrorBadParameter;
  854. }
  855. }
  856. else if (nPortIndex == 1)
  857. {
  858. if (portFormat->eCompressionFormat != pPort->format.video.eCompressionFormat)
  859. {
  860. return OMX_ErrorBadParameter;
  861. }
  862. switch (portFormat->eColorFormat)
  863. {
  864. case OMX_COLOR_FormatYUV420Planar: //I420
  865. pTestDecConfig->cbcrInterleave = FALSE;
  866. pTestDecConfig->nv21 = FALSE;
  867. pPort->format.video.eColorFormat = portFormat->eColorFormat;
  868. break;
  869. case OMX_COLOR_FormatYUV420SemiPlanar: //NV12
  870. pTestDecConfig->cbcrInterleave = TRUE;
  871. pTestDecConfig->nv21 = FALSE;
  872. pPort->format.video.eColorFormat = portFormat->eColorFormat;
  873. break;
  874. case OMX_COLOR_FormatYVU420SemiPlanar: //NV21
  875. pTestDecConfig->cbcrInterleave = TRUE;
  876. pTestDecConfig->nv21 = TRUE;
  877. pPort->format.video.eColorFormat = portFormat->eColorFormat;
  878. break;
  879. default:
  880. LOG(SF_LOG_ERR, "Error to set parameter: %d, only nv12 nv21 i420 supported\r\n", portFormat->eColorFormat);
  881. return OMX_ErrorBadParameter;
  882. break;
  883. }
  884. }
  885. else
  886. {
  887. return OMX_ErrorBadPortIndex;
  888. }
  889. break;
  890. }
  891. case OMX_IndexParamVideoBitrate:
  892. break;
  893. case OMX_IndexParamVideoQuantization:
  894. break;
  895. break;
  896. case OMX_IndexParamPortDefinition:
  897. {
  898. OMX_PARAM_PORTDEFINITIONTYPE *pPortDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
  899. OMX_PARAM_PORTDEFINITIONTYPE *pInputPort = &pSfOMXComponent->portDefinition[0];
  900. OMX_PARAM_PORTDEFINITIONTYPE *pOutputPort = &pSfOMXComponent->portDefinition[1];
  901. TestDecConfig *pTestDecConfig = (TestDecConfig *)pSfVideoImplement->testConfig;
  902. OMX_U32 portIndex = pPortDefinition->nPortIndex;
  903. OMX_U32 width = pPortDefinition->format.video.nFrameWidth;
  904. OMX_U32 height = pPortDefinition->format.video.nFrameHeight;
  905. LOG(SF_LOG_INFO, "Set width = %d, height = %d on port %d\r\n", width, height, pPortDefinition->nPortIndex);
  906. if (portIndex == 0)
  907. {
  908. if (pPortDefinition->nBufferCountActual != pInputPort->nBufferCountActual)
  909. {
  910. LOG(SF_LOG_INFO, "Set input buffer count = %d\r\n", pPortDefinition->nBufferCountActual);
  911. ComponentImpl *pFeederComponent = (ComponentImpl *)pSfVideoImplement->hSFComponentFeeder;
  912. if (pFeederComponent)
  913. {
  914. pSfVideoImplement->functions->ComponentPortDestroy(&pFeederComponent->srcPort);
  915. pSfVideoImplement->functions->ComponentPortCreate(&pFeederComponent->srcPort, pSfVideoImplement->hSFComponentFeeder,
  916. pPortDefinition->nBufferCountActual, sizeof(PortContainerExternal));
  917. }
  918. }
  919. memcpy(&pSfOMXComponent->portDefinition[portIndex], pPortDefinition, pPortDefinition->nSize);
  920. pInputPort->format.video.nStride = width;
  921. pInputPort->format.video.nSliceHeight = height;
  922. pInputPort->nBufferSize = width * height * 2;
  923. }
  924. else if (portIndex == 1)
  925. {
  926. if (pPortDefinition->nBufferCountActual != pOutputPort->nBufferCountActual)
  927. {
  928. LOG(SF_LOG_INFO, "Set output buffer count = %d\r\n", pPortDefinition->nBufferCountActual);
  929. ComponentImpl *pRenderComponent = (ComponentImpl *)pSfVideoImplement->hSFComponentRender;
  930. if (pRenderComponent)
  931. {
  932. pSfVideoImplement->functions->SetRenderTotalBufferNumber(pRenderComponent, pPortDefinition->nBufferCountActual);
  933. pSfVideoImplement->functions->ComponentPortDestroy(&pRenderComponent->sinkPort);
  934. pSfVideoImplement->functions->ComponentPortCreate(&pRenderComponent->sinkPort, pSfVideoImplement->hSFComponentRender,
  935. pPortDefinition->nBufferCountActual, sizeof(PortContainerExternal));
  936. }
  937. }
  938. memcpy(&pSfOMXComponent->portDefinition[portIndex], pPortDefinition, pPortDefinition->nSize);
  939. /*
  940. Some client may set '0' or '1' to output port, in this case use input port parameters
  941. */
  942. if (width <= 1)
  943. {
  944. width = pInputPort->format.video.nFrameWidth;
  945. }
  946. if (height <= 1)
  947. {
  948. height = pInputPort->format.video.nFrameHeight;
  949. }
  950. if (width > 0 && height > 0)
  951. {
  952. int scalew = pInputPort->format.video.nFrameWidth / width;
  953. int scaleh = pInputPort->format.video.nFrameHeight / height;
  954. if (scalew > 8 || scaleh > 8 || scalew < 1 || scaleh < 1)
  955. {
  956. int nInputWidth = pInputPort->format.video.nFrameWidth;
  957. int nInputHeight = pInputPort->format.video.nFrameHeight;
  958. LOG(SF_LOG_WARN, "Scaling should be 1 to 1/8 (down-scaling only)! Use input parameter. "
  959. "OutPut[%d, %d]. Input[%d, %d]\r\n", width, height, nInputWidth, nInputHeight);
  960. width = nInputWidth;
  961. height = nInputHeight;
  962. }
  963. }
  964. pOutputPort->format.video.nFrameWidth = width;
  965. pOutputPort->format.video.nFrameHeight = height;
  966. pOutputPort->format.video.nStride = width;
  967. pOutputPort->format.video.nSliceHeight = height;
  968. pTestDecConfig->scaleDownWidth = VPU_CEIL(width, 2);
  969. pTestDecConfig->scaleDownHeight = VPU_CEIL(height, 2);
  970. LOG(SF_LOG_INFO, "Set scale = %d, %d\r\n", pTestDecConfig->scaleDownWidth , pTestDecConfig->scaleDownHeight);
  971. /*
  972. if cbcrInterleave is FALSE and nv21 is FALSE, the default dec format is I420
  973. if cbcrInterleave is TRUE and nv21 is FALSE, then the dec format is NV12
  974. if cbcrInterleave is TRUE and nv21 is TRUE, then the dec format is NV21
  975. */
  976. LOG(SF_LOG_INFO, "Set format = %d\r\n", pOutputPort->format.video.eColorFormat);
  977. switch (pOutputPort->format.video.eColorFormat)
  978. {
  979. case OMX_COLOR_FormatYUV420Planar: //I420
  980. pTestDecConfig->cbcrInterleave = FALSE;
  981. pTestDecConfig->nv21 = FALSE;
  982. if (width && height)
  983. pOutputPort->nBufferSize = (width * height * 3) / 2;
  984. break;
  985. case OMX_COLOR_FormatYUV420SemiPlanar: //NV12
  986. pTestDecConfig->cbcrInterleave = TRUE;
  987. pTestDecConfig->nv21 = FALSE;
  988. if (width && height)
  989. pOutputPort->nBufferSize = (width * height * 3) / 2;
  990. break;
  991. case OMX_COLOR_FormatYVU420SemiPlanar: //NV21
  992. pTestDecConfig->cbcrInterleave = TRUE;
  993. pTestDecConfig->nv21 = TRUE;
  994. if (width && height)
  995. pOutputPort->nBufferSize = (width * height * 3) / 2;
  996. break;
  997. default:
  998. LOG(SF_LOG_ERR, "Error to set parameter: %d, only nv12 nv21 i420 supported\r\n",
  999. pOutputPort->format.video.eColorFormat);
  1000. return OMX_ErrorBadParameter;
  1001. break;
  1002. }
  1003. }
  1004. else
  1005. {
  1006. LOG(SF_LOG_INFO,"Bad port index %d\r\n",portIndex);
  1007. ret = OMX_ErrorBadPortIndex;
  1008. }
  1009. }
  1010. break;
  1011. case OMX_IndexParamVideoIntraRefresh:
  1012. break;
  1013. case OMX_IndexParamStandardComponentRole:
  1014. {
  1015. if ((pSfOMXComponent->state != OMX_StateLoaded) &&
  1016. (pSfOMXComponent->state != OMX_StateWaitForResources)) {
  1017. ret = OMX_ErrorIncorrectStateOperation;
  1018. }
  1019. }
  1020. break;
  1021. case OMX_IndexParamVideoAvc:
  1022. testConfig->bitFormat = 0;
  1023. break;
  1024. case OMX_IndexParamVideoHevc:
  1025. testConfig->bitFormat = 12;
  1026. break;
  1027. case OMX_IndexParamCompBufferSupplier:
  1028. {
  1029. OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplier = (OMX_PARAM_BUFFERSUPPLIERTYPE *)ComponentParameterStructure;
  1030. OMX_U32 portIndex = bufferSupplier->nPortIndex;
  1031. if (portIndex >= 2)
  1032. ret = OMX_ErrorBadPortIndex;
  1033. }
  1034. break;
  1035. default:
  1036. ret = OMX_ErrorUnsupportedIndex;
  1037. break;
  1038. }
  1039. EXIT:
  1040. FunctionOut();
  1041. return ret;
  1042. }
  1043. static OMX_ERRORTYPE SF_OMX_GetConfig(
  1044. OMX_HANDLETYPE hComponent,
  1045. OMX_INDEXTYPE nIndex,
  1046. OMX_PTR pComponentConfigStructure)
  1047. {
  1048. OMX_ERRORTYPE ret = OMX_ErrorNone;
  1049. FunctionIn();
  1050. if (hComponent == NULL)
  1051. {
  1052. ret = OMX_ErrorBadParameter;
  1053. goto EXIT;
  1054. }
  1055. switch (nIndex)
  1056. {
  1057. case OMX_IndexConfigVideoAVCIntraPeriod:
  1058. break;
  1059. case OMX_IndexConfigVideoBitrate:
  1060. break;
  1061. case OMX_IndexConfigVideoFramerate:
  1062. break;
  1063. default:
  1064. break;
  1065. }
  1066. EXIT:
  1067. FunctionOut();
  1068. return ret;
  1069. }
  1070. static OMX_ERRORTYPE SF_OMX_SetConfig(
  1071. OMX_HANDLETYPE hComponent,
  1072. OMX_INDEXTYPE nIndex,
  1073. OMX_PTR pComponentConfigStructure)
  1074. {
  1075. OMX_ERRORTYPE ret = OMX_ErrorNone;
  1076. FunctionIn();
  1077. if (hComponent == NULL)
  1078. {
  1079. ret = OMX_ErrorBadParameter;
  1080. goto EXIT;
  1081. }
  1082. switch ((OMX_U32)nIndex)
  1083. {
  1084. case OMX_IndexConfigVideoAVCIntraPeriod:
  1085. break;
  1086. case OMX_IndexConfigVideoBitrate:
  1087. break;
  1088. case OMX_IndexConfigVideoFramerate:
  1089. break;
  1090. case OMX_IndexConfigVideoIntraVOPRefresh:
  1091. break;
  1092. default:
  1093. break;
  1094. }
  1095. EXIT:
  1096. FunctionOut();
  1097. return ret;
  1098. }
  1099. static OMX_ERRORTYPE SF_OMX_ComponentTunnelRequest(
  1100. OMX_IN OMX_HANDLETYPE hComp,
  1101. OMX_IN OMX_U32 nPort,
  1102. OMX_IN OMX_HANDLETYPE hTunneledComp,
  1103. OMX_IN OMX_U32 nTunneledPort,
  1104. OMX_INOUT OMX_TUNNELSETUPTYPE *pTunnelSetup)
  1105. {
  1106. OMX_ERRORTYPE ret = OMX_ErrorNone;
  1107. (void) hComp;
  1108. (void) nPort;
  1109. (void) hTunneledComp;
  1110. (void) nTunneledPort;
  1111. (void) pTunnelSetup;
  1112. ret = OMX_ErrorTunnelingUnsupported;
  1113. goto EXIT;
  1114. EXIT:
  1115. return ret;
  1116. }
  1117. static OMX_ERRORTYPE InitDecoder(SF_OMX_COMPONENT *pSfOMXComponent)
  1118. {
  1119. TestDecConfig *testConfig = NULL;
  1120. CNMComponentConfig *config = NULL;
  1121. Uint32 sizeInWord;
  1122. char *fwPath = NULL;
  1123. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  1124. OMX_PARAM_PORTDEFINITIONTYPE *pInputPort = &pSfOMXComponent->portDefinition[0];
  1125. OMX_PARAM_PORTDEFINITIONTYPE *pOutputPort = &pSfOMXComponent->portDefinition[1];
  1126. if (pSfVideoImplement->hSFComponentExecoder != NULL)
  1127. {
  1128. return OMX_ErrorNone;
  1129. }
  1130. FunctionIn();
  1131. testConfig = (TestDecConfig *)pSfVideoImplement->testConfig;
  1132. testConfig->productId = (ProductId)pSfVideoImplement->functions->VPU_GetProductId(testConfig->coreIdx);
  1133. if (CheckDecTestConfig(testConfig) == FALSE)
  1134. {
  1135. LOG(SF_LOG_ERR, "fail to CheckTestConfig()\n");
  1136. return OMX_ErrorBadParameter;
  1137. }
  1138. switch (testConfig->productId)
  1139. {
  1140. case PRODUCT_ID_521:
  1141. fwPath = pSfOMXComponent->fwPath;
  1142. break;
  1143. case PRODUCT_ID_511:
  1144. fwPath = pSfOMXComponent->fwPath;
  1145. break;
  1146. case PRODUCT_ID_517:
  1147. fwPath = CORE_7_BIT_CODE_FILE_PATH;
  1148. break;
  1149. default:
  1150. LOG(SF_LOG_ERR, "Unknown product id: %d, whether kernel module loaded?\n", testConfig->productId);
  1151. return OMX_ErrorBadParameter;
  1152. }
  1153. LOG(SF_LOG_INFO, "FW PATH = %s\n", fwPath);
  1154. if (pSfVideoImplement->functions->LoadFirmware(testConfig->productId, (Uint8 **)&(pSfVideoImplement->pusBitCode), &sizeInWord, fwPath) < 0)
  1155. {
  1156. LOG(SF_LOG_ERR, "Failed to load firmware: %s\n", fwPath);
  1157. return OMX_ErrorInsufficientResources;
  1158. }
  1159. testConfig->scaleDownWidth = VPU_CEIL(pOutputPort->format.video.nFrameWidth, 2);
  1160. testConfig->scaleDownHeight = VPU_CEIL(pOutputPort->format.video.nFrameHeight, 2);
  1161. config = pSfVideoImplement->config;
  1162. memcpy(&(config->testDecConfig), testConfig, sizeof(TestDecConfig));
  1163. config->bitcode = (Uint8 *)pSfVideoImplement->pusBitCode;
  1164. config->sizeOfBitcode = sizeInWord;
  1165. if (pInputPort->format.video.nFrameWidth && pInputPort->format.video.nFrameHeight)
  1166. config->testDecConfig.bsSize = (pInputPort->format.video.nFrameWidth * pInputPort->format.video.nFrameHeight / 2);
  1167. if (pSfOMXComponent->memory_optimization)
  1168. {
  1169. config->MemoryOptimization = TRUE;
  1170. }
  1171. if (pSfVideoImplement->functions->SetUpDecoderOpenParam(&config->decOpenParam, &config->testDecConfig) != RETCODE_SUCCESS)
  1172. {
  1173. LOG(SF_LOG_ERR, "SetupDecoderOpenParam error\n");
  1174. return OMX_ErrorBadParameter;
  1175. }
  1176. LOG(SF_LOG_DEBUG, "cbcrInterleave = %d, nv21 = %d\r\n", testConfig->cbcrInterleave, testConfig->nv21);
  1177. pSfVideoImplement->hSFComponentExecoder = pSfVideoImplement->functions->ComponentCreate("wave_decoder", config);
  1178. pSfVideoImplement->hSFComponentFeeder = pSfVideoImplement->functions->ComponentCreate("feeder", config);
  1179. pSfVideoImplement->hSFComponentRender = pSfVideoImplement->functions->ComponentCreate("renderer", config);
  1180. ComponentImpl *pFeederComponent = (ComponentImpl *)pSfVideoImplement->hSFComponentFeeder;
  1181. pSfVideoImplement->functions->ComponentPortCreate(&pFeederComponent->srcPort, pSfVideoImplement->hSFComponentFeeder,
  1182. pSfOMXComponent->portDefinition[0].nBufferCountActual, sizeof(PortContainerExternal));
  1183. ComponentImpl *pRenderComponent = (ComponentImpl *)pSfVideoImplement->hSFComponentRender;
  1184. pSfVideoImplement->functions->ComponentPortDestroy(&pRenderComponent->sinkPort);
  1185. pSfVideoImplement->functions->ComponentPortCreate(&pRenderComponent->sinkPort, pSfVideoImplement->hSFComponentRender,
  1186. MAX_GDI_IDX, sizeof(PortContainerExternal));
  1187. if (pSfVideoImplement->functions->SetupDecListenerContext(pSfVideoImplement->lsnCtx, config, NULL) == TRUE)
  1188. {
  1189. pSfVideoImplement->functions->ComponentRegisterListener(pSfVideoImplement->hSFComponentExecoder,
  1190. COMPONENT_EVENT_DEC_ALL, pSfVideoImplement->functions->DecoderListener, (void *)pSfVideoImplement->lsnCtx);
  1191. pSfVideoImplement->functions->ComponentRegisterListener(pSfVideoImplement->hSFComponentExecoder,
  1192. COMPONENT_EVENT_DEC_INSUFFIC_RESOURCE, OnEventArrived, (void *)pSfOMXComponent);
  1193. pSfVideoImplement->functions->ComponentRegisterListener(pSfVideoImplement->hSFComponentRender,
  1194. COMPONENT_EVENT_DEC_DECODED_ALL, OnEventArrived, (void *)pSfOMXComponent);
  1195. pSfVideoImplement->functions->ComponentRegisterListener(pSfVideoImplement->hSFComponentFeeder,
  1196. COMPONENT_EVENT_DEC_ALL, OnEventArrived, (void *)pSfOMXComponent);
  1197. pSfVideoImplement->functions->ComponentRegisterListener(pSfVideoImplement->hSFComponentRender,
  1198. COMPONENT_EVENT_DEC_ALL, OnEventArrived, (void *)pSfOMXComponent);
  1199. }
  1200. else
  1201. {
  1202. LOG(SF_LOG_ERR, "ComponentRegisterListener fail\r\n");
  1203. return OMX_ErrorBadParameter;
  1204. }
  1205. pSfVideoImplement->functions->ComponentSetupTunnel(pSfVideoImplement->hSFComponentFeeder, pSfVideoImplement->hSFComponentExecoder);
  1206. pSfVideoImplement->functions->ComponentSetupTunnel(pSfVideoImplement->hSFComponentExecoder, pSfVideoImplement->hSFComponentRender);
  1207. FunctionOut();
  1208. return OMX_ErrorNone;
  1209. }
  1210. static OMX_ERRORTYPE SF_OMX_SendCommand(
  1211. OMX_IN OMX_HANDLETYPE hComponent,
  1212. OMX_IN OMX_COMMANDTYPE Cmd,
  1213. OMX_IN OMX_U32 nParam,
  1214. OMX_IN OMX_PTR pCmdData)
  1215. {
  1216. OMX_ERRORTYPE ret = OMX_ErrorNone;
  1217. OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
  1218. SF_OMX_COMPONENT *pSfOMXComponent = pOMXComponent->pComponentPrivate;
  1219. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  1220. OMX_STATETYPE comCurrentState;
  1221. DEC_CMD cmd;
  1222. //BOOL done = 0;
  1223. FunctionIn();
  1224. if (hComponent == NULL || pSfOMXComponent == NULL)
  1225. {
  1226. ret = OMX_ErrorBadParameter;
  1227. goto EXIT;
  1228. }
  1229. LOG(SF_LOG_INFO, "cmd = %X, nParam = %X\r\n", Cmd, nParam);
  1230. comCurrentState = pSfOMXComponent->state;
  1231. if (comCurrentState == OMX_StateInvalid) {
  1232. return OMX_ErrorInvalidState;
  1233. }
  1234. switch (Cmd)
  1235. {
  1236. case OMX_CommandStateSet:
  1237. {
  1238. if ((nParam == OMX_StateLoaded) &&
  1239. (pSfOMXComponent->state == OMX_StateIdle))
  1240. {
  1241. pSfOMXComponent->traningState = OMX_TransStateIdleToLoaded;
  1242. }
  1243. else if ((nParam == OMX_StateIdle) &&
  1244. (pSfOMXComponent->state == OMX_StateLoaded))
  1245. {
  1246. pSfOMXComponent->traningState = OMX_TransStateLoadedToIdle;
  1247. }
  1248. }
  1249. break;
  1250. case OMX_CommandFlush:
  1251. {
  1252. if (nParam >= 2 && nParam != OMX_ALL)
  1253. return OMX_ErrorBadPortIndex;
  1254. }
  1255. break;
  1256. case OMX_CommandMarkBuffer:
  1257. {
  1258. if (nParam >= 2)
  1259. return OMX_ErrorBadPortIndex;
  1260. if ((pSfOMXComponent->state != OMX_StateExecuting) &&
  1261. (pSfOMXComponent->state != OMX_StatePause))
  1262. return OMX_ErrorIncorrectStateOperation;
  1263. }
  1264. break;
  1265. case OMX_CommandPortDisable:
  1266. {
  1267. if (nParam >= 2 && nParam != OMX_ALL)
  1268. return OMX_ErrorBadPortIndex;
  1269. if (nParam == OMX_ALL)
  1270. {
  1271. for (int i = 0; i < 2; i++)
  1272. {
  1273. if(pSfOMXComponent->portDefinition[i].bEnabled == OMX_FALSE)
  1274. return OMX_ErrorIncorrectStateOperation;
  1275. }
  1276. for (int i = 0; i < 2; i++)
  1277. {
  1278. pSfOMXComponent->portDefinition[i].bEnabled = OMX_FALSE;
  1279. }
  1280. }
  1281. else
  1282. {
  1283. if (pSfOMXComponent->portDefinition[nParam].bEnabled == OMX_FALSE)
  1284. return OMX_ErrorIncorrectStateOperation;
  1285. pSfOMXComponent->portDefinition[nParam].bEnabled = OMX_FALSE;
  1286. }
  1287. }
  1288. break;
  1289. case OMX_CommandPortEnable:
  1290. {
  1291. if (nParam >= 2 && nParam != OMX_ALL)
  1292. return OMX_ErrorBadPortIndex;
  1293. if (nParam == OMX_ALL)
  1294. {
  1295. for (int i = 0; i < 2; i++)
  1296. {
  1297. if(pSfOMXComponent->portDefinition[i].bEnabled == OMX_TRUE)
  1298. return OMX_ErrorIncorrectStateOperation;
  1299. }
  1300. for (int i = 0; i < 2; i++)
  1301. {
  1302. pSfOMXComponent->portDefinition[i].bEnabled = OMX_TRUE;
  1303. }
  1304. }
  1305. else
  1306. {
  1307. if (pSfOMXComponent->portDefinition[nParam].bEnabled == OMX_TRUE)
  1308. return OMX_ErrorIncorrectStateOperation;
  1309. pSfOMXComponent->portDefinition[nParam].bEnabled = OMX_TRUE;
  1310. }
  1311. }
  1312. break;
  1313. default:
  1314. break;
  1315. }
  1316. cmd.Cmd = Cmd;
  1317. cmd.nParam = nParam;
  1318. cmd.pCmdData = pCmdData;
  1319. ret = SF_Queue_Enqueue(pSfVideoImplement->CmdQueue, &cmd);
  1320. EXIT:
  1321. FunctionOut();
  1322. return ret;
  1323. }
  1324. static OMX_ERRORTYPE SF_OMX_GetState(
  1325. OMX_IN OMX_HANDLETYPE hComponent,
  1326. OMX_OUT OMX_STATETYPE *pState)
  1327. {
  1328. OMX_ERRORTYPE ret = OMX_ErrorNone;
  1329. OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
  1330. SF_OMX_COMPONENT *pSfOMXComponent = pOMXComponent->pComponentPrivate;
  1331. FunctionIn();
  1332. *pState = pSfOMXComponent->state;
  1333. FunctionOut();
  1334. return ret;
  1335. }
  1336. static OMX_ERRORTYPE SF_OMX_FreeBuffer(
  1337. OMX_IN OMX_HANDLETYPE hComponent,
  1338. OMX_IN OMX_U32 nPortIndex,
  1339. OMX_IN OMX_BUFFERHEADERTYPE *pBufferHdr)
  1340. {
  1341. OMX_ERRORTYPE ret = OMX_ErrorNone;
  1342. OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
  1343. SF_OMX_COMPONENT *pSfOMXComponent = pOMXComponent->pComponentPrivate;
  1344. SF_OMX_BUF_INFO *pBufInfo;
  1345. FunctionIn();
  1346. if(pBufferHdr == NULL)
  1347. return OMX_ErrorBadParameter;
  1348. if(nPortIndex == 0)
  1349. pBufInfo = pBufferHdr->pInputPortPrivate;
  1350. else if(nPortIndex == 1)
  1351. pBufInfo = pBufferHdr->pOutputPortPrivate;
  1352. LOG(SF_LOG_INFO, "free header %p pBuffer address = %p on port %d\r\n",
  1353. pBufferHdr, pBufferHdr->pBuffer, nPortIndex);
  1354. if ((pSfOMXComponent->traningState != OMX_TransStateIdleToLoaded) &&
  1355. (pSfOMXComponent->portDefinition[nPortIndex].bEnabled))
  1356. {
  1357. LOG(SF_LOG_INFO, "port Unpopulated\r\n");
  1358. pSfOMXComponent->callbacks->EventHandler(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData,
  1359. OMX_EventError, OMX_ErrorPortUnpopulated, nPortIndex, NULL);
  1360. }
  1361. if(pBufInfo->type == SF_BUFFER_NOMAL)
  1362. {
  1363. if(pBufferHdr->pBuffer)
  1364. free(pBufferHdr->pBuffer);
  1365. }
  1366. pSfOMXComponent->pBufferArray[nPortIndex][pBufInfo->index] = NULL;
  1367. pSfOMXComponent->assignedBufferNum[nPortIndex]--;
  1368. LOG(SF_LOG_INFO, "remain %d buff port %d assgin\r\n",pSfOMXComponent->assignedBufferNum[nPortIndex], nPortIndex);
  1369. free(pBufferHdr);
  1370. free(pBufInfo);
  1371. if (ret == OMX_ErrorNone) {
  1372. if (pSfOMXComponent->assignedBufferNum[nPortIndex] == 0) {
  1373. LOG(SF_LOG_INFO, "unloadedResource signal set\r\n");
  1374. SF_SemaphorePost(pSfOMXComponent->portUnloadSemaphore[nPortIndex]);
  1375. pSfOMXComponent->portDefinition[nPortIndex].bPopulated = OMX_FALSE;
  1376. }
  1377. }
  1378. FunctionOut();
  1379. return ret;
  1380. }
  1381. static void FlushInputQ(SF_OMX_COMPONENT *pSfOMXComponent, SF_Queue *pQueue)
  1382. {
  1383. OMX_BUFFERHEADERTYPE *pOMXBuffer = NULL;
  1384. OMX_BUFFERHEADERTYPE **ppBuffer = NULL;
  1385. ppBuffer = SF_Queue_Dequeue(pQueue);
  1386. while (ppBuffer)
  1387. {
  1388. pOMXBuffer = *ppBuffer;
  1389. LOG(SF_LOG_PERF, "OMX empty one buffer, address = %p, size = %d, nTimeStamp = %d, nFlags = %X\r\n",
  1390. pOMXBuffer->pBuffer, pOMXBuffer->nFilledLen, pOMXBuffer->nTimeStamp, pOMXBuffer->nFlags);
  1391. pSfOMXComponent->callbacks->EmptyBufferDone(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData, pOMXBuffer);
  1392. ppBuffer = SF_Queue_Dequeue(pQueue);
  1393. }
  1394. }
  1395. static void FlushOutputQ(SF_OMX_COMPONENT *pSfOMXComponent, SF_Queue *pQueue)
  1396. {
  1397. OMX_BUFFERHEADERTYPE *pOMXBuffer = NULL;
  1398. OMX_BUFFERHEADERTYPE **ppBuffer = NULL;
  1399. ppBuffer = SF_Queue_Dequeue(pQueue);
  1400. while (ppBuffer)
  1401. {
  1402. pOMXBuffer = *ppBuffer;
  1403. LOG(SF_LOG_PERF, "OMX finish one buffer, address = %p, size = %d, nTimeStamp = %d, nFlags = %X\r\n",
  1404. pOMXBuffer->pBuffer, pOMXBuffer->nFilledLen, pOMXBuffer->nTimeStamp, pOMXBuffer->nFlags);
  1405. pSfOMXComponent->callbacks->FillBufferDone(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData, pOMXBuffer);
  1406. ppBuffer = SF_Queue_Dequeue(pQueue);
  1407. }
  1408. }
  1409. static void CmdThread(void *args)
  1410. {
  1411. OMX_ERRORTYPE ret = OMX_ErrorNone;
  1412. SF_OMX_COMPONENT *pSfOMXComponent = (SF_OMX_COMPONENT *)args;
  1413. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  1414. OMX_STATETYPE comCurrentState;
  1415. ComponentImpl *pSFComponentDecoder = NULL;
  1416. ComponentImpl *pSFComponentFeeder = NULL;
  1417. ComponentImpl *pSFComponentRender = NULL;
  1418. ComponentState componentState;
  1419. DEC_CMD *pCmd;
  1420. OMX_U32 i = 0, cnt = 0;
  1421. while(1){
  1422. pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
  1423. pCmd = (DEC_CMD*)SF_Queue_Dequeue_Block(pSfVideoImplement->CmdQueue);
  1424. pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
  1425. pthread_testcancel();
  1426. pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
  1427. if(!pCmd)
  1428. continue;
  1429. if(pCmd->Cmd == DEC_StopThread)
  1430. break;
  1431. switch (pCmd->Cmd)
  1432. {
  1433. case OMX_CommandStateSet:
  1434. LOG(SF_LOG_INFO, "OMX dest state = %X\r\n", pCmd->nParam);
  1435. //GetStateCommon(hComponent, &comCurrentState);
  1436. comCurrentState = pSfOMXComponent->state;
  1437. if (comCurrentState == pCmd->nParam)
  1438. {
  1439. LOG(SF_LOG_DEBUG, "same state %d\r\n", pCmd->nParam);
  1440. pSfOMXComponent->callbacks->EventHandler(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData,
  1441. OMX_EventError, OMX_ErrorSameState, pCmd->nParam, NULL);
  1442. break;
  1443. }
  1444. ret = OMX_ErrorNone;
  1445. switch (pCmd->nParam)
  1446. {
  1447. case OMX_StateInvalid:
  1448. switch (comCurrentState)
  1449. {
  1450. case OMX_StateExecuting:
  1451. pSfVideoImplement->functions->ComponentStop(pSfVideoImplement->hSFComponentFeeder);
  1452. pSfVideoImplement->functions->ComponentStop(pSfVideoImplement->hSFComponentExecoder);
  1453. pSfVideoImplement->functions->ComponentStop(pSfVideoImplement->hSFComponentRender);
  1454. case OMX_StateIdle:
  1455. case OMX_StatePause:
  1456. case OMX_StateLoaded:
  1457. case OMX_StateWaitForResources:
  1458. default:
  1459. pSfOMXComponent->state = OMX_StateInvalid;
  1460. break;
  1461. }
  1462. ret = OMX_ErrorInvalidState;
  1463. break;
  1464. case OMX_StateLoaded:
  1465. switch (comCurrentState)
  1466. {
  1467. case OMX_StateWaitForResources:
  1468. break;
  1469. case OMX_StateIdle:
  1470. for (i = 0; i < 2; i++)
  1471. {
  1472. if (pSfOMXComponent->portDefinition[i].bEnabled){
  1473. LOG(SF_LOG_INFO,"unload SemaphoreWait \r\n");
  1474. SF_SemaphoreWait(pSfOMXComponent->portUnloadSemaphore[i]);
  1475. LOG(SF_LOG_INFO,"unload SemaphoreWait out\r\n");
  1476. }
  1477. }
  1478. break;
  1479. default:
  1480. ret = OMX_ErrorIncorrectStateTransition;
  1481. break;
  1482. }
  1483. break;
  1484. case OMX_StateIdle:
  1485. if (comCurrentState == OMX_StatePause)
  1486. {
  1487. comCurrentState = pSfOMXComponent->stateBeforePause;
  1488. }
  1489. switch (comCurrentState)
  1490. {
  1491. case OMX_StateLoaded:
  1492. ret = InitDecoder(pSfOMXComponent);
  1493. if (ret != OMX_ErrorNone)
  1494. {
  1495. break;
  1496. }
  1497. pSFComponentDecoder = (ComponentImpl *)pSfVideoImplement->hSFComponentExecoder;
  1498. pSFComponentFeeder = (ComponentImpl *)pSfVideoImplement->hSFComponentFeeder;
  1499. pSFComponentRender = (ComponentImpl *)pSfVideoImplement->hSFComponentRender;
  1500. pSFComponentFeeder->pause = OMX_FALSE;
  1501. pSFComponentDecoder->pause = OMX_FALSE;
  1502. pSFComponentRender->pause = OMX_FALSE;
  1503. for (i = 0; i < 2; i++)
  1504. {
  1505. if (pSfOMXComponent->portDefinition[i].bEnabled){
  1506. LOG(SF_LOG_INFO,"SemaphoreWait \r\n");
  1507. SF_SemaphoreWait(pSfOMXComponent->portSemaphore[i]);
  1508. LOG(SF_LOG_INFO,"SemaphoreWait out\r\n");
  1509. }
  1510. }
  1511. pSfVideoImplement->rev_eos =OMX_FALSE;
  1512. break;
  1513. case OMX_StateExecuting:
  1514. pSFComponentDecoder = (ComponentImpl *)pSfVideoImplement->hSFComponentExecoder;
  1515. pSFComponentFeeder = (ComponentImpl *)pSfVideoImplement->hSFComponentFeeder;
  1516. pSFComponentRender = (ComponentImpl *)pSfVideoImplement->hSFComponentRender;
  1517. if (!pSfOMXComponent->memory_optimization)
  1518. {
  1519. LOG(SF_LOG_INFO,"feeder src q cnt %d\r\n",
  1520. pSfVideoImplement->functions->Queue_Get_Cnt(((ComponentImpl *)(pSfVideoImplement->hSFComponentFeeder))->srcPort.inputQ));
  1521. pSfVideoImplement->functions->ComponentStop(pSFComponentRender);
  1522. pSfVideoImplement->functions->ComponentStop(pSFComponentDecoder);
  1523. pSfVideoImplement->functions->ComponentStop(pSFComponentFeeder);
  1524. FlushBuffer(pSfOMXComponent, 0);
  1525. FlushInputQ(pSfOMXComponent, pSfVideoImplement->inPortQ);
  1526. FlushBuffer(pSfOMXComponent, 1);
  1527. FlushOutputQ(pSfOMXComponent, pSfVideoImplement->outPortQ);
  1528. pSfVideoImplement->functions->ComponentWait(pSFComponentRender);
  1529. pSfVideoImplement->functions->ComponentWait(pSFComponentDecoder);
  1530. pSfVideoImplement->functions->ComponentWait(pSFComponentFeeder);
  1531. pSFComponentRender->terminate = OMX_TRUE;
  1532. pSFComponentDecoder->terminate = OMX_TRUE;
  1533. pSFComponentFeeder->terminate = OMX_TRUE;
  1534. pSfVideoImplement->functions->ComponentRelease(pSFComponentFeeder);
  1535. pSfVideoImplement->functions->ComponentRelease(pSFComponentDecoder);
  1536. pSfVideoImplement->functions->ComponentRelease(pSFComponentRender);
  1537. pSfVideoImplement->functions->ComponentDestroy(pSFComponentFeeder, NULL);
  1538. pSfVideoImplement->functions->ComponentDestroy(pSFComponentDecoder, NULL);
  1539. pSfVideoImplement->functions->ComponentDestroy(pSFComponentRender, NULL);
  1540. pSfVideoImplement->hSFComponentExecoder = NULL;
  1541. pSfVideoImplement->hSFComponentFeeder = NULL;
  1542. pSfVideoImplement->hSFComponentRender = NULL;
  1543. }
  1544. else
  1545. {
  1546. pSFComponentDecoder->pause = OMX_TRUE;
  1547. pSFComponentFeeder->pause = OMX_TRUE;
  1548. pSFComponentRender->pause = OMX_TRUE;
  1549. FlushBuffer(pSfOMXComponent, 0);
  1550. FlushBuffer(pSfOMXComponent, 1);
  1551. }
  1552. pSfVideoImplement->rev_eos =OMX_FALSE;
  1553. break;
  1554. case OMX_StateIdle:
  1555. pSFComponentFeeder->pause = OMX_FALSE;
  1556. pSFComponentDecoder->pause = OMX_FALSE;
  1557. pSFComponentRender->pause = OMX_FALSE;
  1558. break;
  1559. default:
  1560. ret = OMX_ErrorIncorrectStateTransition;
  1561. break;
  1562. }
  1563. break;
  1564. case OMX_StateWaitForResources:
  1565. switch (comCurrentState)
  1566. {
  1567. case OMX_StateLoaded:
  1568. break;
  1569. default:
  1570. ret = OMX_ErrorIncorrectStateTransition;
  1571. break;
  1572. }
  1573. break;
  1574. case OMX_StateExecuting:
  1575. if (comCurrentState == OMX_StatePause)
  1576. {
  1577. comCurrentState = pSfOMXComponent->stateBeforePause;
  1578. }
  1579. switch (comCurrentState)
  1580. {
  1581. case OMX_StateIdle:
  1582. ret = InitDecoder(pSfOMXComponent);
  1583. if (ret != OMX_ErrorNone)
  1584. {
  1585. break;
  1586. }
  1587. pSFComponentDecoder = (ComponentImpl *)pSfVideoImplement->hSFComponentExecoder;
  1588. pSFComponentFeeder = (ComponentImpl *)pSfVideoImplement->hSFComponentFeeder;
  1589. pSFComponentRender = (ComponentImpl *)pSfVideoImplement->hSFComponentRender;
  1590. if (pSFComponentDecoder->thread == NULL)
  1591. {
  1592. LOG(SF_LOG_INFO, "execute component %s\r\n", pSFComponentDecoder->name);
  1593. componentState = pSfVideoImplement->functions->ComponentExecute(pSFComponentDecoder);
  1594. LOG(SF_LOG_INFO, "ret = %d\r\n", componentState);
  1595. }
  1596. if (pSFComponentFeeder->thread == NULL)
  1597. {
  1598. LOG(SF_LOG_INFO, "execute component %s\r\n", pSFComponentFeeder->name);
  1599. componentState = pSfVideoImplement->functions->ComponentExecute(pSFComponentFeeder);
  1600. LOG(SF_LOG_INFO, "ret = %d\r\n", componentState);
  1601. }
  1602. if (pSFComponentRender->thread == NULL)
  1603. {
  1604. LOG(SF_LOG_INFO, "execute component %s\r\n", pSFComponentRender->name);
  1605. componentState = pSfVideoImplement->functions->ComponentExecute(pSFComponentRender);
  1606. LOG(SF_LOG_INFO, "ret = %d\r\n", componentState);
  1607. }
  1608. pSFComponentFeeder->pause = OMX_FALSE;
  1609. pSFComponentDecoder->pause = OMX_FALSE;
  1610. pSFComponentRender->pause = OMX_FALSE;
  1611. break;
  1612. case OMX_StateExecuting:
  1613. pSFComponentFeeder->pause = OMX_FALSE;
  1614. pSFComponentDecoder->pause = OMX_FALSE;
  1615. pSFComponentRender->pause = OMX_FALSE;
  1616. break;
  1617. default:
  1618. ret = OMX_ErrorIncorrectStateTransition;
  1619. break;
  1620. }
  1621. break;
  1622. case OMX_StatePause:
  1623. switch (comCurrentState)
  1624. {
  1625. case OMX_StateIdle:
  1626. case OMX_StateExecuting:
  1627. pSFComponentFeeder->pause = OMX_TRUE;
  1628. pSFComponentDecoder->pause = OMX_TRUE;
  1629. pSFComponentRender->pause = OMX_TRUE;
  1630. pSfOMXComponent->stateBeforePause = comCurrentState;
  1631. break;
  1632. default:
  1633. ret = OMX_ErrorIncorrectStateTransition;
  1634. break;
  1635. }
  1636. break;
  1637. default:
  1638. ret = OMX_ErrorIncorrectStateTransition;
  1639. break;
  1640. }
  1641. if (ret == OMX_ErrorNone)
  1642. {
  1643. pSfOMXComponent->state = pCmd->nParam;
  1644. pSfOMXComponent->traningState = OMX_TransStateInvalid;
  1645. pSfOMXComponent->callbacks->EventHandler(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData,
  1646. OMX_EventCmdComplete, OMX_CommandStateSet, pCmd->nParam, NULL);
  1647. LOG(SF_LOG_DEBUG, "complete cmd StateSet %d\r\n", pCmd->nParam);
  1648. if (pSfOMXComponent->state == OMX_StateExecuting)
  1649. {
  1650. FlushOutputQ(pSfOMXComponent, pSfVideoImplement->outPauseQ);
  1651. FlushInputQ(pSfOMXComponent, pSfVideoImplement->inPauseQ);
  1652. }
  1653. }
  1654. else
  1655. {
  1656. pSfOMXComponent->callbacks->EventHandler(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData,
  1657. OMX_EventError, ret, 0, NULL);
  1658. LOG(SF_LOG_DEBUG, "Can't go to state %d from %d, ret %X \r\n",pSfOMXComponent->state, pCmd->nParam, ret);
  1659. }
  1660. break;
  1661. case OMX_CommandFlush:
  1662. {
  1663. LOG(SF_LOG_INFO, "flush port %d\r\n", pCmd->nParam);
  1664. OMX_U32 nPort = pCmd->nParam;
  1665. cnt = (pCmd->nParam == OMX_ALL) ? 2 : 1;
  1666. for (i = 0; i < cnt; i++) {
  1667. if (pCmd->nParam == OMX_ALL)
  1668. nPort = i;
  1669. else
  1670. nPort = pCmd->nParam;
  1671. if (nPort == 0)
  1672. {
  1673. pSfOMXComponent->bPortFlushing[0] = OMX_TRUE;
  1674. FlushBuffer(pSfOMXComponent, nPort);
  1675. if (pSfOMXComponent->state == OMX_StatePause)
  1676. {
  1677. FlushInputQ(pSfOMXComponent, pSfVideoImplement->inPauseQ);
  1678. }
  1679. FlushInputQ(pSfOMXComponent, pSfVideoImplement->inPortQ);
  1680. pSfOMXComponent->callbacks->EventHandler(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData,
  1681. OMX_EventCmdComplete, OMX_CommandFlush, nPort, NULL);
  1682. pSfOMXComponent->bPortFlushing[0] = OMX_FALSE;
  1683. }
  1684. else
  1685. {
  1686. pSfOMXComponent->bPortFlushing[1] = OMX_TRUE;
  1687. FlushBuffer(pSfOMXComponent, nPort);
  1688. if (pSfOMXComponent->state == OMX_StatePause)
  1689. {
  1690. FlushOutputQ(pSfOMXComponent, pSfVideoImplement->outPauseQ);
  1691. }
  1692. if (!pSfOMXComponent->memory_optimization){
  1693. FlushOutputQ(pSfOMXComponent, pSfVideoImplement->outPortQ);
  1694. }
  1695. pSfOMXComponent->callbacks->EventHandler(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData,
  1696. OMX_EventCmdComplete, OMX_CommandFlush, nPort, NULL);
  1697. pSfOMXComponent->bPortFlushing[1] = OMX_FALSE;
  1698. }
  1699. }
  1700. }
  1701. break;
  1702. case OMX_CommandPortDisable:
  1703. {
  1704. LOG(SF_LOG_INFO, "disable port %d\r\n", pCmd->nParam);
  1705. OMX_U32 nPort;
  1706. cnt = (pCmd->nParam == OMX_ALL) ? 2 : 1;
  1707. for (i = 0; i < cnt; i++) {
  1708. if (pCmd->nParam == OMX_ALL)
  1709. nPort = i;
  1710. else
  1711. nPort = pCmd->nParam;
  1712. FlushBuffer(pSfOMXComponent, nPort);
  1713. if (nPort == 0)
  1714. FlushInputQ(pSfOMXComponent, pSfVideoImplement->inPortQ);
  1715. else if (nPort == 1)
  1716. FlushOutputQ(pSfOMXComponent, pSfVideoImplement->outPortQ);
  1717. }
  1718. for (i = 0; i < cnt; i++) {
  1719. if (pCmd->nParam == OMX_ALL)
  1720. nPort = i;
  1721. else
  1722. nPort = pCmd->nParam;
  1723. if (pSfOMXComponent->state != OMX_StateLoaded)
  1724. SF_SemaphoreWait(pSfOMXComponent->portUnloadSemaphore[nPort]);
  1725. pSfOMXComponent->callbacks->EventHandler(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData,
  1726. OMX_EventCmdComplete, OMX_CommandPortDisable, nPort, NULL);
  1727. }
  1728. }
  1729. break;
  1730. case OMX_CommandPortEnable:
  1731. {
  1732. LOG(SF_LOG_INFO, "enable port %d\r\n", pCmd->nParam);
  1733. OMX_U32 nPort;
  1734. cnt = (pCmd->nParam == OMX_ALL) ? 2 : 1;
  1735. for (i = 0; i < cnt; i++) {
  1736. if (pCmd->nParam == OMX_ALL)
  1737. nPort = i;
  1738. else
  1739. nPort = pCmd->nParam;
  1740. if ((pSfOMXComponent->state != OMX_StateLoaded) &&
  1741. (pSfOMXComponent->state != OMX_StateWaitForResources))
  1742. SF_SemaphoreWait(pSfOMXComponent->portSemaphore[nPort]);
  1743. pSfOMXComponent->callbacks->EventHandler(pSfOMXComponent->pOMXComponent, pSfOMXComponent->pAppData,
  1744. OMX_EventCmdComplete, OMX_CommandPortEnable, nPort, NULL);
  1745. }
  1746. }
  1747. break;
  1748. case OMX_CommandMarkBuffer:
  1749. {
  1750. LOG(SF_LOG_INFO, "set mark %d\r\n", pCmd->nParam);
  1751. OMX_U32 nPort;
  1752. nPort = pCmd->nParam;
  1753. pSfOMXComponent->markType[nPort].hMarkTargetComponent =
  1754. ((OMX_MARKTYPE *)pCmd->pCmdData)->hMarkTargetComponent;
  1755. pSfOMXComponent->markType[nPort].pMarkData =
  1756. ((OMX_MARKTYPE *)pCmd->pCmdData)->pMarkData;
  1757. }
  1758. break;
  1759. default:
  1760. break;
  1761. }
  1762. }
  1763. pthread_exit(NULL);
  1764. }
  1765. static OMX_ERRORTYPE SF_OMX_GetComponentVersion(
  1766. OMX_IN OMX_HANDLETYPE hComponent,
  1767. OMX_OUT OMX_STRING pComponentName,
  1768. OMX_OUT OMX_VERSIONTYPE *pComponentVersion,
  1769. OMX_OUT OMX_VERSIONTYPE *pSpecVersion,
  1770. OMX_OUT OMX_UUIDTYPE *pComponentUUID)
  1771. {
  1772. OMX_ERRORTYPE ret = OMX_ErrorNone;
  1773. OMX_COMPONENTTYPE *pOMXComponent = NULL;
  1774. SF_OMX_COMPONENT *pSfOMXComponent = NULL;
  1775. OMX_U32 compUUID[4];
  1776. FunctionIn();
  1777. /* check parameters */
  1778. if (hComponent == NULL ||
  1779. pComponentName == NULL || pComponentVersion == NULL ||
  1780. pSpecVersion == NULL || pComponentUUID == NULL) {
  1781. ret = OMX_ErrorBadParameter;
  1782. goto EXIT;
  1783. }
  1784. pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
  1785. if (pOMXComponent->pComponentPrivate == NULL) {
  1786. ret = OMX_ErrorBadParameter;
  1787. goto EXIT;
  1788. }
  1789. pSfOMXComponent = (SF_OMX_COMPONENT *)pOMXComponent->pComponentPrivate;
  1790. if (pSfOMXComponent->state == OMX_StateInvalid) {
  1791. ret = OMX_ErrorInvalidState;
  1792. goto EXIT;
  1793. }
  1794. strcpy(pComponentName, pSfOMXComponent->componentName);
  1795. memcpy(pComponentVersion, &(pSfOMXComponent->componentVersion), sizeof(OMX_VERSIONTYPE));
  1796. memcpy(pSpecVersion, &(pSfOMXComponent->specVersion), sizeof(OMX_VERSIONTYPE));
  1797. /* Fill UUID with handle address, PID and UID.
  1798. * This should guarantee uiniqness */
  1799. compUUID[0] = (OMX_U32)getpid();
  1800. compUUID[1] = (OMX_U32)getpid();
  1801. compUUID[2] = (OMX_U32)getpid();
  1802. compUUID[3] = (OMX_U32)getpid();
  1803. //compUUID[1] = getpid();
  1804. //compUUID[2] = getuid();
  1805. memcpy(*pComponentUUID, compUUID, 4 * sizeof(*compUUID));
  1806. ret = OMX_ErrorNone;
  1807. EXIT:
  1808. FunctionOut();
  1809. return ret;
  1810. }
  1811. static OMX_ERRORTYPE SF_OMX_UseEGLImage(
  1812. OMX_IN OMX_HANDLETYPE hComponent,
  1813. OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
  1814. OMX_IN OMX_U32 nPortIndex,
  1815. OMX_IN OMX_PTR pAppPrivate,
  1816. OMX_IN void* eglImage)
  1817. {
  1818. return OMX_ErrorNotImplemented;
  1819. }
  1820. static OMX_U32 nInstance = 0;
  1821. static OMX_ERRORTYPE SF_OMX_ComponentConstructor(SF_OMX_COMPONENT *pSfOMXComponent)
  1822. {
  1823. OMX_ERRORTYPE ret = OMX_ErrorNone;
  1824. FunctionIn();
  1825. if (nInstance >= 1)
  1826. {
  1827. ret = OMX_ErrorInsufficientResources;
  1828. goto EXIT;
  1829. }
  1830. nInstance++;
  1831. ret = InitComponentStructorCommon(pSfOMXComponent);
  1832. if (ret != OMX_ErrorNone)
  1833. {
  1834. nInstance--;
  1835. goto EXIT;
  1836. }
  1837. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  1838. TestDecConfig *pTestDecConfig = (TestDecConfig *)pSfVideoImplement->testConfig;
  1839. pTestDecConfig->feedingMode = FEEDING_METHOD_BUFFER;
  1840. pTestDecConfig->bitstreamMode = BS_MODE_PIC_END;
  1841. pTestDecConfig->bitFormat = pSfVideoImplement->bitFormat;
  1842. /*
  1843. if cbcrInterleave is FALSE and nv21 is FALSE, the default dec format is I420
  1844. if cbcrInterleave is TRUE and nv21 is FALSE, then the dec format is NV12
  1845. if cbcrInterleave is TRUE and nv21 is TRUE, then the dec format is NV21
  1846. */
  1847. pTestDecConfig->cbcrInterleave = TRUE;
  1848. pTestDecConfig->nv21 = FALSE;
  1849. pSfOMXComponent->pOMXComponent->UseBuffer = &SF_OMX_UseBuffer;
  1850. pSfOMXComponent->pOMXComponent->AllocateBuffer = &SF_OMX_AllocateBuffer;
  1851. pSfOMXComponent->pOMXComponent->EmptyThisBuffer = &SF_OMX_EmptyThisBuffer;
  1852. pSfOMXComponent->pOMXComponent->FillThisBuffer = &SF_OMX_FillThisBuffer;
  1853. pSfOMXComponent->pOMXComponent->FreeBuffer = &SF_OMX_FreeBuffer;
  1854. pSfOMXComponent->pOMXComponent->ComponentTunnelRequest = &SF_OMX_ComponentTunnelRequest;
  1855. pSfOMXComponent->pOMXComponent->GetParameter = &SF_OMX_GetParameter;
  1856. pSfOMXComponent->pOMXComponent->SetParameter = &SF_OMX_SetParameter;
  1857. pSfOMXComponent->pOMXComponent->GetConfig = &SF_OMX_GetConfig;
  1858. pSfOMXComponent->pOMXComponent->SetConfig = &SF_OMX_SetConfig;
  1859. pSfOMXComponent->pOMXComponent->SendCommand = &SF_OMX_SendCommand;
  1860. pSfOMXComponent->pOMXComponent->GetState = &SF_OMX_GetState;
  1861. pSfOMXComponent->pOMXComponent->GetComponentVersion = &SF_OMX_GetComponentVersion;
  1862. pSfOMXComponent->pOMXComponent->UseEGLImage = &SF_OMX_UseEGLImage;
  1863. // pSfOMXComponent->pOMXComponent->GetExtensionIndex = &SF_OMX_GetExtensionIndex;
  1864. // pSfOMXComponent->pOMXComponent->ComponentRoleEnum = &SF_OMX_ComponentRoleEnum;
  1865. // pSfOMXComponent->pOMXComponent->ComponentDeInit = &SF_OMX_ComponentDeInit;
  1866. for (int i = 0; i < MAX_INDEX; i++)
  1867. {
  1868. pSfVideoImplement->frame_array[i] = -1;
  1869. }
  1870. pSfVideoImplement->frame_array_index = 0;
  1871. pSfVideoImplement->CmdQueue = SF_Queue_Create(20, sizeof(DEC_CMD));
  1872. if (NULL == pSfVideoImplement->CmdQueue)
  1873. {
  1874. LOG(SF_LOG_ERR, "create CmdQueue error");
  1875. nInstance--;
  1876. return OMX_ErrorInsufficientResources;
  1877. }
  1878. pSfVideoImplement->inPauseQ = SF_Queue_Create(20, sizeof(OMX_BUFFERHEADERTYPE*));
  1879. if (NULL == pSfVideoImplement->inPauseQ)
  1880. {
  1881. LOG(SF_LOG_ERR, "create inPauseQ error");
  1882. nInstance--;
  1883. return OMX_ErrorInsufficientResources;
  1884. }
  1885. pSfVideoImplement->outPauseQ = SF_Queue_Create(20, sizeof(OMX_BUFFERHEADERTYPE*));
  1886. if (NULL == pSfVideoImplement->outPauseQ)
  1887. {
  1888. LOG(SF_LOG_ERR, "create outPauseQ error");
  1889. nInstance--;
  1890. return OMX_ErrorInsufficientResources;
  1891. }
  1892. pSfVideoImplement->inPortQ = SF_Queue_Create(20, sizeof(OMX_BUFFERHEADERTYPE*));
  1893. if (NULL == pSfVideoImplement->inPortQ)
  1894. {
  1895. LOG(SF_LOG_ERR, "create inPortQ error");
  1896. nInstance--;
  1897. return OMX_ErrorInsufficientResources;
  1898. }
  1899. pSfVideoImplement->outPortQ = SF_Queue_Create(20, sizeof(OMX_BUFFERHEADERTYPE*));
  1900. if (NULL == pSfVideoImplement->outPortQ)
  1901. {
  1902. LOG(SF_LOG_ERR, "create outPortQ error");
  1903. nInstance--;
  1904. return OMX_ErrorInsufficientResources;
  1905. }
  1906. CreateThread(&pSfVideoImplement->pCmdThread, CmdThread, (void *)pSfOMXComponent);
  1907. pSfVideoImplement->bCmdRunning = OMX_TRUE;
  1908. EXIT:
  1909. FunctionOut();
  1910. return ret;
  1911. }
  1912. static OMX_ERRORTYPE SF_OMX_ComponentClear(SF_OMX_COMPONENT *pSfOMXComponent)
  1913. {
  1914. OMX_ERRORTYPE ret = OMX_ErrorNone;
  1915. DEC_CMD cmd;
  1916. void *ThreadRet = NULL;
  1917. SF_WAVE5_IMPLEMEMT *pSfVideoImplement = (SF_WAVE5_IMPLEMEMT *)pSfOMXComponent->componentImpl;
  1918. ComponentImpl *pSFComponentDecoder = (ComponentImpl *)pSfVideoImplement->hSFComponentExecoder;
  1919. ComponentImpl *pSFComponentFeeder = (ComponentImpl *)pSfVideoImplement->hSFComponentFeeder;
  1920. ComponentImpl *pSFComponentRender = (ComponentImpl *)pSfVideoImplement->hSFComponentRender;
  1921. FunctionIn();
  1922. if (pSFComponentFeeder)
  1923. {
  1924. pSFComponentFeeder->terminate = OMX_TRUE;
  1925. pSfVideoImplement->functions->ComponentWait(pSfVideoImplement->hSFComponentFeeder);
  1926. }
  1927. if (pSFComponentDecoder)
  1928. {
  1929. pSFComponentDecoder->terminate = OMX_TRUE;
  1930. pSfVideoImplement->functions->ComponentWait(pSfVideoImplement->hSFComponentExecoder);
  1931. }
  1932. if (pSFComponentRender)
  1933. {
  1934. pSFComponentRender->terminate = OMX_TRUE;
  1935. pSfVideoImplement->functions->ComponentWait(pSfVideoImplement->hSFComponentRender);
  1936. }
  1937. pSfVideoImplement->bCmdRunning = 0;
  1938. /* enqueue DEC_StopThread mean cmd thread cycle end */
  1939. cmd.Cmd = DEC_StopThread;
  1940. SF_Queue_Enqueue(pSfVideoImplement->CmdQueue, &cmd);
  1941. pthread_join(pSfVideoImplement->pCmdThread->pthread, &ThreadRet);
  1942. LOG(SF_LOG_INFO, "Cmd thread end %ld\r\n", (Uint64)ThreadRet);
  1943. SF_Queue_Destroy(pSfVideoImplement->CmdQueue);
  1944. SF_Queue_Destroy(pSfVideoImplement->outPauseQ);
  1945. SF_Queue_Destroy(pSfVideoImplement->inPauseQ);
  1946. SF_Queue_Destroy(pSfVideoImplement->inPortQ);
  1947. SF_Queue_Destroy(pSfVideoImplement->outPortQ);
  1948. free(pSfVideoImplement->pusBitCode);
  1949. pSfVideoImplement->functions->ClearDecListenerContext(pSfVideoImplement->lsnCtx);
  1950. ComponentClearCommon(pSfOMXComponent);
  1951. nInstance--;
  1952. FunctionOut();
  1953. return ret;
  1954. }
  1955. SF_OMX_COMPONENT sf_dec_decoder_h265 = {
  1956. .componentName = "OMX.sf.video_decoder.hevc",
  1957. .libName = "libsfdec.so",
  1958. .pOMXComponent = NULL,
  1959. .SF_OMX_ComponentConstructor = SF_OMX_ComponentConstructor,
  1960. .SF_OMX_ComponentClear = SF_OMX_ComponentClear,
  1961. // .functions = NULL,
  1962. // .bitFormat = STD_HEVC,
  1963. .componentImpl = NULL,
  1964. .fwPath = "/lib/firmware/chagall.bin",
  1965. .componentRule = "video_decoder.hevc"};
  1966. SF_OMX_COMPONENT sf_dec_decoder_h264 = {
  1967. .componentName = "OMX.sf.video_decoder.avc",
  1968. .libName = "libsfdec.so",
  1969. .pOMXComponent = NULL,
  1970. .SF_OMX_ComponentConstructor = SF_OMX_ComponentConstructor,
  1971. .SF_OMX_ComponentClear = SF_OMX_ComponentClear,
  1972. // .functions = NULL,
  1973. // .bitFormat = STD_AVC,
  1974. .componentImpl = NULL,
  1975. .fwPath = "/lib/firmware/chagall.bin",
  1976. .componentRule = "video_decoder.avc"};