omx_running=false;
pictInfValid=false;
+ omx_imag_decode/*dec*/=NULL;
+ omx_egl_render/*dec*/=NULL;
+
+ buf_head_egl=NULL;
}
ImageOMX::~ImageOMX()
Log::getInstance()->log("Image", Log::DEBUG,
"Init OMX Image decoder failed %x", error);
video->UnlockClock();
- DeAllocateCodecsOMX();
return 0;
}
Log::getInstance()->log("Image", Log::DEBUG,
"Init OMX Image rend OMX_GetParameter failed %x", error);
video->UnlockClock();
- DeAllocateCodecsOMX();
return 0;
}
omx_image_input_port = p_param.nStartPortNumber;
omx_image_output_port = p_param.nStartPortNumber+1;
- error=OMX_GetHandle(&omx_egl_render,VPE_OMX_EGL_REND,NULL,&callbacks);
-
- if (error!=OMX_ErrorNone){
- Log::getInstance()->log("Image", Log::DEBUG, "Init OMX EGL renderer failed %x", error);
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
-
- error=OMX_GetParameter(omx_egl_render,OMX_IndexParamVideoInit,&p_param);
- if (error!=OMX_ErrorNone){
- Log::getInstance()->log("Image", Log::DEBUG, "Init OMX EGL renderer OMX_GetParameter failed %x", error);
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
- omx_egl_input_port=p_param.nStartPortNumber;
- omx_egl_output_port=p_param.nStartPortNumber+1;
-
- if (!video->DisablePort(omx_imag_decode,omx_image_input_port) || !video->DisablePort(omx_imag_decode,omx_image_output_port)) {
- Log::getInstance()->log("Image", Log::DEBUG, "Disable Ports OMX Image decoder failed");
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
-
-
- if (!video->DisablePort(omx_egl_render,omx_egl_input_port) || !video->DisablePort(omx_egl_render,omx_egl_output_port)) {
- Log::getInstance()->log("Image", Log::DEBUG, "Disable Ports OMX Image decoder failed");
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
-
- if (!video->ChangeComponentState(omx_imag_decode,OMX_StateIdle)) {
- Log::getInstance()->log("Image", Log::DEBUG, "image decode idle ChangeComponentState");
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
-
- if (!video->ChangeComponentState(omx_egl_render,OMX_StateIdle)) {
- Log::getInstance()->log("Image", Log::DEBUG, "egl render idle ChangeComponentState");
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
-
-
-
- //Setuo chain
-
- error=OMX_SetupTunnel(omx_imag_decode,omx_image_output_port,omx_egl_render,omx_egl_input_port);
- if (error!=OMX_ErrorNone){
- Log::getInstance()->log("Image", Log::DEBUG, "OMX_Setup tunnel decode to egl rend failed %x ");
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
-
- if (!video->EnablePort(omx_imag_decode,omx_image_output_port,false) || !video->EnablePort(omx_egl_render,omx_egl_input_port,false)
- ) {
- Log::getInstance()->log("Image", Log::DEBUG, "Enable Ports OMXdecoder rend failed");
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
-
-
OMX_IMAGE_PARAM_PORTFORMATTYPE ft_type;
memset(&ft_type,0,sizeof(ft_type));
ft_type.nSize=sizeof(ft_type);
if (error!=OMX_ErrorNone){
Log::getInstance()->log("Image", Log::DEBUG, "Init OMX_IndexParamVImagePortFormat failed %x", error);
video->UnlockClock();
- DeAllocateCodecsOMX();
return 0;
}
-
- if ( !video->CommandFinished(omx_egl_render,OMX_CommandPortEnable,omx_egl_input_port)) {
+ if (!video->DisablePort(omx_imag_decode,omx_image_input_port) || !video->DisablePort(omx_imag_decode,omx_image_output_port)) {
+ Log::getInstance()->log("Image", Log::DEBUG, "Disable Ports OMX Image decoder failed");
video->UnlockClock();
- Log::getInstance()->log("Image", Log::DEBUG, "commandfinishes end eip");
- DeAllocateCodecsOMX();
return 0;
}
- if ( !video->CommandFinished(omx_imag_decode,OMX_CommandPortEnable,omx_image_output_port)) {
+ if (!video->ChangeComponentState(omx_imag_decode,OMX_StateIdle)) {
+ Log::getInstance()->log("Image", Log::DEBUG, "image decode idle ChangeComponentState");
video->UnlockClock();
- Log::getInstance()->log("Image", Log::DEBUG, "commandfinishes end iop");
- DeAllocateCodecsOMX();
return 0;
}
-
-
-
if (!PrepareInputBufsOMX(true, buffer, length)) {
video->UnlockClock();
Log::getInstance()->log("Image", Log::DEBUG, "prepare input bufs failed");
- DeAllocateCodecsOMX();
return 0;
}
-/* error=OMX_SetupTunnel(omx_aud_dec,omx_codec_output_port,omx_aud_rend,omx_rend_input_port);
- if (error!=OMX_ErrorNone){
- Log::getInstance()->log("Image", Log::DEBUG, "OMX_Setup tunnel dec to render failed %x", error);
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }*/
-
-/* if (!video->EnablePort(omx_aud_dec,omx_codec_output_port,false) || !video->EnablePort(omx_aud_rend,omx_rend_input_port,false)
- ) {
- Log::getInstance()->log("Image", Log::DEBUG, "Enable Ports OMX codec rend failed");
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }*/
-/* if ( !video->CommandFinished(omx_aud_dec,OMX_CommandPortEnable,omx_codec_output_port)
- || !video->CommandFinished(omx_aud_rend,OMX_CommandPortEnable,omx_rend_input_port)) {
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }*/
if (!video->ChangeComponentState(omx_imag_decode,OMX_StateExecuting)) {
Log::getInstance()->log("Image", Log::DEBUG, "omx_image_decode ChangeComponentState Execute");
video->UnlockClock();
- DeAllocateCodecsOMX();
return 0;
}
) {
Log::getInstance()->log("Image", Log::DEBUG, "Enable Ports OMXdecoder inputfailed");
video->UnlockClock();
- DeAllocateCodecsOMX();
return 0;
}
}
+
+
+
+
bool ImageOMX::decodePicture(LoadIndex index, unsigned char * buffer, unsigned int length)
{
if (pictInfValid) return false; // does support only one image at a Time;
VideoOMX *video=(VideoOMX*)Video::getInstance();
-
if (!pictcreat) return false;
int oldcancelstate;
int oldcanceltype;
bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigned int length, EGLPictureCreator* pictcreat, VideoOMX *video)
{
-
+ static OMX_CALLBACKTYPE callbacks= {&VideoOMX::EventHandler_OMX,&EmptyBufferDone_OMX,&FillBufferDone_OMX};
// Use Buffer
OMX_BUFFERHEADERTYPE * bufhead;
video->LockClock();
Log::getInstance()->log("Image", Log::DEBUG,
- "decodePicture 3");
+ "decodePicture 3");
video->WaitForEvent(omx_imag_decode,OMX_EventPortSettingsChanged);
port_def_type.nVersion.nVersion=OMX_VERSION;
port_def_type.nPortIndex=omx_image_output_port;
Log::getInstance()->log("Image", Log::DEBUG,
- "decodePicture 3a");
+ "decodePicture 3a");
error=OMX_GetParameter(omx_imag_decode,OMX_IndexParamPortDefinition, &port_def_type);
if (error != OMX_ErrorNone) {
return false;
}
Log::getInstance()->log("Image", Log::DEBUG,
- "decodePicture 4");
+ "decodePicture 4");
- video->DisablePort(omx_egl_render,omx_egl_output_port,true);
- Log::getInstance()->log("Image", Log::DEBUG,
- "decodePicture 4 a");
+/*
video->DisablePort(omx_imag_decode,omx_image_output_port,false);
Log::getInstance()->log("Image", Log::DEBUG,
- "decodePicture 5");
- video->DisablePort(omx_egl_render,omx_egl_input_port,false);
- Log::getInstance()->log("Image", Log::DEBUG,
- "decodePicture 6");
-
-
-
-
+ "decodePicture 5");
if ( !video->CommandFinished(omx_imag_decode,OMX_CommandPortDisable,omx_image_output_port)) {
video->UnlockClock();
Log::getInstance()->log("Image", Log::DEBUG, "commandfinishes end iop");
return false;
- }
+ }*/
+
- if ( !video->CommandFinished(omx_egl_render,OMX_CommandPortDisable,omx_egl_input_port)) {
- video->UnlockClock();
- Log::getInstance()->log("Image", Log::DEBUG, "commandfinishes end eip");
- return false;
- }
port_def_type.format.image.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;
port_def_type.format.image.nSliceHeight = 16;
port_def_type.format.image.nStride = 0;
error = OMX_SetParameter(omx_imag_decode, OMX_IndexParamPortDefinition,
- &port_def_type);
+ &port_def_type);
if (error != OMX_ErrorNone) {
Log::getInstance()->log("Image", Log::DEBUG,
- "Set OMX_IndexParamPortDefinition1 failed %x", error);
+ "Set OMX_IndexParamPortDefinition1 failed %x", error);
video->UnlockClock();
return false;
}
Log::getInstance()->log("Image", Log::DEBUG,
- "decodePicture 5 6");
+ "decodePicture 5 6");
+ error=OMX_GetHandle(&omx_egl_render,VPE_OMX_EGL_REND,NULL,&callbacks);
+
+ if (error!=OMX_ErrorNone){
+ Log::getInstance()->log("Image", Log::DEBUG, "Init OMX EGL renderer failed %x", error);
+ video->UnlockClock();
+ return false;
+ }
+
+ OMX_PORT_PARAM_TYPE p_param;
+ memset(&p_param,0,sizeof(p_param));
+ p_param.nSize=sizeof(p_param);
+ p_param.nVersion.nVersion=OMX_VERSION;
+
+ error=OMX_GetParameter(omx_egl_render,OMX_IndexParamVideoInit,&p_param);
+ if (error!=OMX_ErrorNone){
+ Log::getInstance()->log("Image", Log::DEBUG, "Init OMX EGL renderer OMX_GetParameter failed %x", error);
+ video->UnlockClock();
+ return false;
+ }
+ omx_egl_input_port=p_param.nStartPortNumber;
+ omx_egl_output_port=p_param.nStartPortNumber+1;
+
+
+
+
+ if (!video->DisablePort(omx_egl_render,omx_egl_input_port) || !video->DisablePort(omx_egl_render,omx_egl_output_port)) {
+ Log::getInstance()->log("Image", Log::DEBUG, "Disable Ports OMX Image decoder failed");
+ video->UnlockClock();
+ return false;
+ }
+
+
+ if (!video->ChangeComponentState(omx_egl_render,OMX_StateIdle)) {
+ Log::getInstance()->log("Image", Log::DEBUG, "egl render idle ChangeComponentState");
+ video->UnlockClock();
+ return false;
+ }
+
+
+
+ //Setuo chain
+
+/* if ( !video->CommandFinished(omx_egl_render,OMX_CommandPortDisable,omx_egl_input_port)) {
+ video->UnlockClock();
+ Log::getInstance()->log("Image", Log::DEBUG, "commandfinishes end eip");
+ return false;
+ }*/
+
-/* port_def_type.nPortIndex=omx_egl_input_port;
+
+ /* port_def_type.nPortIndex=omx_egl_input_port;
error = OMX_SetParameter(omx_egl_render, OMX_IndexParamPortDefinition,
&port_def_type);
if (error != OMX_ErrorNone) {
return false;
}
Log::getInstance()->log("Image", Log::DEBUG,
- "getEGLPict %x",pictInf.reference);
+ "getEGLPict %x",pictInf.reference);
port_def_type.format.video.pNativeWindow = egl_display;
error = OMX_SetParameter(omx_egl_render, OMX_IndexParamPortDefinition,
- &port_def_type);
+ &port_def_type);
if (error != OMX_ErrorNone) {
Log::getInstance()->log("Image", Log::DEBUG,
"Set OMX_IndexParamPortDefinition3 failed %x", error);
+
+
+
+
+ error=OMX_SetupTunnel(omx_imag_decode,omx_image_output_port,omx_egl_render,omx_egl_input_port);
+ if (error!=OMX_ErrorNone){
+ Log::getInstance()->log("Image", Log::DEBUG, "OMX_Setup tunnel decode to egl rend failed %x ");
+ video->UnlockClock();
+ return 0;
+ }
+
+ if (!video->EnablePort(omx_imag_decode,omx_image_output_port,false) || !video->EnablePort(omx_egl_render,omx_egl_input_port,false)
+ ) {
+ Log::getInstance()->log("Image", Log::DEBUG, "Enable Ports OMXdecoder rend failed");
+ video->UnlockClock();
+ return 0;
+ }
+
+ if ( !video->CommandFinished(omx_imag_decode,OMX_CommandPortEnable,omx_image_output_port)) {
+ video->UnlockClock();
+ Log::getInstance()->log("Image", Log::DEBUG, "commandfinishes end iop");
+ return 0;
+ }
+
+ if ( !video->CommandFinished(omx_egl_render,OMX_CommandPortEnable,omx_egl_input_port)) {
+ video->UnlockClock();
+ Log::getInstance()->log("Image", Log::DEBUG, "commandfinishes end eip");
+ return 0;
+ }
+
Log::getInstance()->log("Image", Log::DEBUG,
- "decodePicture 7");
+ "decodePicture 7");
video->WaitForEvent(omx_egl_render,OMX_EventPortSettingsChanged);
Log::getInstance()->log("Image", Log::DEBUG,
- "decodePicture 8");
+ "decodePicture 8");
+
+
+
+
+
+
error=OMX_SendCommand(omx_egl_render/*dec*/,OMX_CommandPortEnable,omx_egl_output_port/*codec*/,0);
if (error!=OMX_ErrorNone){
return 0;
}
- OMX_BUFFERHEADERTYPE *buf_head_egl=NULL;
+
error=OMX_UseEGLImage(omx_egl_render/*dec*/,&buf_head_egl,omx_egl_output_port/*codec*/, this, pictInf.reference);
if (error!=OMX_ErrorNone){
Log::getInstance()->log("Image", Log::DEBUG, "Use OMX_UseEGLImage failed %x", error);
buf_head_egl->pAppPrivate=this;
Log::getInstance()->log("Image", Log::DEBUG,
- "decodePicture 8 a");
+ "decodePicture 8 a");
video->EnablePort(omx_imag_decode,omx_image_output_port,false);
Log::getInstance()->log("Image", Log::DEBUG,
- "decodePicture 8 end");
+ "decodePicture 8 end");
if (!video->ChangeComponentState(omx_egl_render,OMX_StateExecuting)) {
Log::getInstance()->log("Image", Log::DEBUG, "omx_egl_rendd ChangeComponentState Execute");
- video->UnlockClock();
+ video->UnlockClock();
return false;
}
Log::getInstance()->log("Image", Log::DEBUG,
- "decodePicture 9");
+ "decodePicture 9");
//video->EnablePort(omx_egl_render,omx_egl_output_port,false);
Log::getInstance()->log("Image", Log::DEBUG,
- "decodePicture 10");
+ "decodePicture 10");
omx_egl_filled = false;
error = OMX_FillThisBuffer(omx_egl_render, buf_head_egl);
while (!omx_egl_filled) {
count++;
- if (count>100) {
+ if (count>500) {
Log::getInstance()->log("Image", Log::DEBUG, "No one filled my buffer");
- return false;
+ return false;
}
- MILLISLEEP(10);
+ MILLISLEEP(1);
}
omx_egl_filled = false;
- video->LockClock();
-
- error=OMX_FreeBuffer(omx_egl_render/*dec*/, omx_egl_output_port/*codec*/,buf_head_egl);
- if (error!=OMX_ErrorNone){
- Log::getInstance()->log("Image", Log::DEBUG, "Use OMX_FreeBuffer 2 failed %x", error);
- return false;
- }
+ Log::getInstance()->log("Image", Log::DEBUG,
+ "decodePicture left");
- video->UnlockClock();
- Log::getInstance()->log("Image", Log::DEBUG,
- "decodePicture left");
- DeAllocateCodecsOMX();
pictInfValid=true;
return true;
Log::getInstance()->log("Image", Log::DEBUG, "omx_imag_decode ChangeComponentState");
}
- if (!video->ChangeComponentState(omx_egl_render,OMX_StateIdle)) {
- Log::getInstance()->log("Image", Log::DEBUG, "omx_egl_render ChangeComponentState");
+ if (omx_egl_render) {
+
+ if (!video->ChangeComponentState(omx_egl_render,OMX_StateIdle)) {
+ Log::getInstance()->log("Image", Log::DEBUG, "omx_egl_render ChangeComponentState");
+ }
+ /*if (!video->ChangeComponentState(omx_egl_render,OMX_StateLoaded,false)) {
+ Log::getInstance()->log("Image", Log::DEBUG, "omx_egl_render ChangeComponentState");
+ }*/
}
+ /* if (!video->ChangeComponentState(omx_imag_decode,OMX_StateLoaded,false)) {
+ Log::getInstance()->log("Image", Log::DEBUG, "omx_imag_decode ChangeComponentState");
+ }*/
+
+
+
// TODO proper deinit sequence
// first flush all buffers
- error=OMX_SendCommand(omx_imag_decode,OMX_CommandFlush, omx_image_input_port, NULL);
- if (error!=OMX_ErrorNone) {
- Log::getInstance()->log("Image", Log::DEBUG, "OMX_Flush rend in failed %x", error);
- }
+
+ Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 3");
error=OMX_SendCommand(omx_imag_decode,OMX_CommandFlush, omx_image_output_port, NULL);
if (error!=OMX_ErrorNone) {
}
- error=OMX_SendCommand(omx_egl_render,OMX_CommandFlush, omx_egl_input_port, NULL);
- if (error!=OMX_ErrorNone) {
- Log::getInstance()->log("Image", Log::DEBUG, "OMX_Flush rend in failed %x", error);
+ if (omx_egl_render) {
- }
+ if (!video->ChangeComponentState(omx_egl_render,OMX_StateIdle)) {
+ Log::getInstance()->log("Image", Log::DEBUG, "omx_egl_render ChangeComponentState");
+ }
+
+ Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 4");
+
+ error=OMX_SendCommand(omx_egl_render,OMX_CommandFlush, omx_egl_input_port, NULL);
+ if (error!=OMX_ErrorNone) {
+ Log::getInstance()->log("Image", Log::DEBUG, "OMX_Flush rend in failed %x", error);
+
+ }
+
+ Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 5");
+
+ error=OMX_SendCommand(omx_egl_render,OMX_CommandFlush, omx_egl_output_port, NULL);
+ if (error!=OMX_ErrorNone) {
+ Log::getInstance()->log("Image", Log::DEBUG, "OMX_Flush rend in failed %x", error);
+
+ }
- error=OMX_SendCommand(omx_egl_render,OMX_CommandFlush, omx_egl_output_port, NULL);
+ Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 6");
+
+ if (!video->CommandFinished(omx_egl_render,OMX_CommandFlush,omx_egl_input_port) ||
+ !video->CommandFinished(omx_egl_render,OMX_CommandFlush,omx_egl_output_port)) {
+ Log::getInstance()->log("Image", Log::DEBUG, "flush cmd clock shed failed");
+ }
+ Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 6 a");
+ }
+ error=OMX_SendCommand(omx_imag_decode,OMX_CommandFlush, omx_image_input_port, NULL);
if (error!=OMX_ErrorNone) {
Log::getInstance()->log("Image", Log::DEBUG, "OMX_Flush rend in failed %x", error);
}
+ if (buf_head_egl) {
+ error=OMX_FreeBuffer(omx_egl_render/*dec*/, omx_egl_output_port/*codec*/,buf_head_egl);
+ if (error!=OMX_ErrorNone){
+ Log::getInstance()->log("Image", Log::DEBUG, "Use OMX_FreeBuffer 2 failed %x", error);
+ }
+ }
+
+ buf_head_egl=NULL;
+
+
+
+
- Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 6");
+ Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 6 b");
+
+
if (!video->CommandFinished(omx_imag_decode,OMX_CommandFlush,omx_image_input_port) ||
- !video->CommandFinished(omx_egl_render,OMX_CommandFlush,omx_egl_input_port) ||
- !video->CommandFinished(omx_imag_decode,OMX_CommandFlush,omx_image_output_port) ||
- !video->CommandFinished(omx_egl_render,OMX_CommandFlush,omx_egl_output_port)) {
- Log::getInstance()->log("Image", Log::DEBUG, "flush cmd clock shed failed");
+ !video->CommandFinished(omx_imag_decode,OMX_CommandFlush,omx_image_output_port) ) {
+ Log::getInstance()->log("Image", Log::DEBUG, "flush cmd clock shed failed");
}
+ Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 6 c");
+
DestroyInputBufsOMX(); //We have to make sure that no buffers are in use
Log::getInstance()->log("Image", Log::DEBUG, "Disable Tunnel Port failed 1");
}
+ if (omx_egl_render) {
- if (!video->DisablePort(omx_egl_render,omx_egl_input_port,true)) {
- Log::getInstance()->log("Image", Log::DEBUG, "Disable Tunnel Port failed 4");
- }
-
-
+ if (!video->DisablePort(omx_egl_render,omx_egl_input_port,true)) {
+ Log::getInstance()->log("Image", Log::DEBUG, "Disable Tunnel Port failed 4");
+ }
- error=OMX_SetupTunnel(omx_imag_decode,omx_image_output_port,NULL,NULL);
- if (error!=OMX_ErrorNone) {
- Log::getInstance()->log("Image", Log::DEBUG, "OMX_Setup tunnel teardown failed %x", error);
+ error=OMX_SetupTunnel(omx_imag_decode,omx_image_output_port,NULL,NULL);
+ if (error!=OMX_ErrorNone) {
+ Log::getInstance()->log("Image", Log::DEBUG, "OMX_Setup tunnel teardown failed %x", error);
- }
+ }
- error=OMX_SetupTunnel(omx_egl_render,omx_egl_input_port,NULL,NULL);
- if (error!=OMX_ErrorNone) {
- Log::getInstance()->log("Image", Log::DEBUG, "OMX_Setup tunnel teardown failed %x", error);
+ error=OMX_SetupTunnel(omx_egl_render,omx_egl_input_port,NULL,NULL);
+ if (error!=OMX_ErrorNone) {
+ Log::getInstance()->log("Image", Log::DEBUG, "OMX_Setup tunnel teardown failed %x", error);
+ }
}
if (error!=OMX_ErrorNone) {
Log::getInstance()->log("Image", Log::DEBUG, "FreeHandle failed %d", error);
}
- error=OMX_FreeHandle(omx_egl_render);
- if (error!=OMX_ErrorNone) {
- Log::getInstance()->log("Image", Log::DEBUG, "FreeHandle failed %d", error);
+ if (omx_egl_render) {
+ error=OMX_FreeHandle(omx_egl_render);
+ if (error!=OMX_ErrorNone) {
+ Log::getInstance()->log("Image", Log::DEBUG, "FreeHandle failed %d", error);
+ }
}
video->UnlockClock();