Hello.
I did simple app which shows h.264 file in loop. App is based on hello_video as i'm just started to learn OMX. The problem that after 10-20 (random) loops decoder stops give buffers for render. Here is debug:
498057.113: video_render:9:RIL:cb:freeing cb:1 b:3e5033f0 t:-1
498057.140: video_render:9:RIL:cb:sending 3e5033f0 to disp queue
498057.181: video_render:9:RIL:release_images:releasing 3e5033f0
498057.214: video_render:9:RIL:cb:use=[40]
498057.249: video_render:9:RIL:cb:freeing cb:2 b:3e503530 t:-1
498057.307: video_render:9:RIL:cb:sending 3e503530 to disp queue
498057.335: video_render:9:RIL:cb:use=[00]
498057.390: video_render:9:RIL:release_images:releasing 3e503530
498057.419: video_render:9:RIL:return omx buffers:free 0
498057.454: video_render:9:RIL:return omx buffers:free 0
498100.993: video_decode:8:RIL:cb:entered with buffer = 0x3e503430, frame_info = 0x3e512c44, status = 0, cb= 0x3e4fc780
498101.073: video_decode:8:RIL:cb:B time:0, cb:0x0, ar:0/0, crop:0x0 1920x1080, interval:33366666, interlace:0,0,0
498101.122: video_decode:8:RIL:cb:entered with buffer = 0x3e5033f0, frame_info = 0x3e51234c, status = 0, cb= 0x3e4fc780
498101.148: video_decode:8:RIL:output dec_frames_full:3e4fd33c out:0
498101.221: video_decode:8:RIL:cb:B time:0, cb:0x0, ar:0/0, crop:0x0 1920x1080, interval:33366666, interlace:0,0,0
498101.244: video_decode:8:RIL:unknown time to 100100
498101.275: video_decode:8:RIL:cb:entered with buffer = 0x3e503470, frame_info = 0x3e5123f0, status = 0, cb= 0x3e4fc780
498101.298: decode: display frame 3e503430 T=100100 sts=0
498101.369: video_decode:8:RIL:cb:P time:0, cb:0x0, ar:0/0, crop:0x0 1920x1080, interval:33366666, interlace:0,0,0
498101.384: clock:10:SetParameter(9000008)
498101.408: clockRIL:time request for 100100
498101.460: clockRIL:late request offset: 32000, actual -143015166 mediatime=100100 target=67100
498101.506: clockRIL:sending fulfillment, requested:100100 now:143115266 wall:143118404 wtamt:103238 offset:-143015166
498101.538: clock:10:cb:emit_output_buffer(3e43d560,48b,0f) RIL:1
498101.570: video_scheduler:11:EmptyThisBuffer(3e43d560,48,80->12)
498101.595: video_scheduler:11: queueBuffer (input : 48)
498101.615: video_scheduler:11:qb RIL:1
498101.657: video_scheduler:11:cb:consumed_input_buffer(3e43d560,0b,0f) RIL:1
498101.691: clock:10:FillThisBuffer(3e43d560,0,80->12)
498101.714: clock:10: queueBuffer (output : 0)
498101.727: clock:10:qb RIL:1
498101.760: clockRIL:waiting for 200000 (200 ms)
498101.804: video_schedulerRIL:requesting media time for 0:(3e503430,100100,F10)
498101.837: video_schedulerRIL: about to send 0:3e503430
498101.860: video_render:9:RIL:display_image 3e503430 state 4
498101.905: video_schedulerRIL:display image 0:(3e503430,100100,F10)
498101.993: video_render:9:RIL: update arrived, dst 0 x 0
498102.035: video_render:9:RIL: cb:0 tx:-1 cb=[img:3e5034f0 t:-1] inuse=[10]
498102.100: video_render:9:RIL: doing update on dn:0 img:3e503430,other fs:1 tx:0 1920x1080-(0x15)800x450
498102.273: video_render:9:RIL:return omx buffers:free 0
498102.310: video_decode:8:RIL: disp_cb passed 3e503430/100100/0x10
498102.340: video_decode:8:RIL:output dec_frames_full:3e4fd3b0 out:0
498102.363: video_decode:8:RIL:unknown time to 133467
498102.404: decode: display frame 3e5033f0 T=133467 sts=0
498102.432: clock:10:SetParameter(9000008)
498102.458: clockRIL:time request for 133467
498102.504: clockRIL:late request offset: 32000, actual -142982847 mediatime=133467 target=100467
498102.549: clockRIL:sending fulfillment, requested:133467 now:143116314 wall:143119452 wtamt:136605 offset:-142982847
498102.584: clock:10:cb:emit_output_buffer(3e43d560,48b,0f) RIL:1
498102.619: video_scheduler:11:EmptyThisBuffer(3e43d560,48,80->12)
498102.637: video_scheduler:11: queueBuffer (input : 48)
498102.655: video_scheduler:11:qb RIL:1
498102.690: video_scheduler:11:cb:consumed_input_buffer(3e43d560,0b,0f) RIL:1
498102.725: clock:10:FillThisBuffer(3e43d560,0,80->12)
498102.743: clock:10: queueBuffer (output : 0)
498102.756: clock:10:qb RIL:1
498102.786: clockRIL:waiting for 200000 (200 ms)
498102.825: video_schedulerRIL:requesting media time for 0:(3e5033f0,133467,F10)
498102.858: video_schedulerRIL: about to send 0:3e5033f0
498102.880: video_render:9:RIL:display_image 3e5033f0 state 4
498102.918: video_schedulerRIL:display image 0:(3e5033f0,133467,F10)
498102.997: video_render:9:RIL: update arrived, dst 0 x 0
498103.038: video_render:9:RIL: cb:1 tx:-1 cb=[img:3e503430 t:-1] inuse=[30]
498103.108: video_render:9:RIL: doing update on dn:0 img:3e5033f0,other fs:1 tx:0 1920x1080-(0x15)800x450
498103.267: video_render:9:RIL:return omx buffers:free 0
498103.317: video_decode:8:RIL: disp_cb passed 3e5033f0/133467/0x10
498103.346: video_decode:8:RIL:output dec_frames_full:3e4fd424 out:0
498103.371: video_decode:8:RIL:unknown time to 166833
498103.415: decode: display frame 3e503470 T=166833 sts=0
498103.445: clock:10:SetParameter(9000008)
498103.472: clockRIL:time request for 166833
498103.521: clockRIL:late request offset: 32000, actual -142950499 mediatime=166833 target=133833
498103.572: clockRIL:sending fulfillment, requested:166833 now:143117332 wall:143120470 wtamt:169971 offset:-142950499
498103.608: clock:10:cb:emit_output_buffer(3e43d560,48b,0f) RIL:1
498103.645: video_scheduler:11:EmptyThisBuffer(3e43d560,48,80->12)
498103.668: video_scheduler:11: queueBuffer (input : 48)
498103.683: video_scheduler:11:qb RIL:1
498103.723: video_scheduler:11:cb:consumed_input_buffer(3e43d560,0b,0f) RIL:1
498103.755: clock:10:FillThisBuffer(3e43d560,0,80->12)
498103.777: clock:10: queueBuffer (output : 0)
498103.795: clock:10:qb RIL:1
498103.828: clockRIL:waiting for 200000 (200 ms)
498103.865: video_schedulerRIL:requesting media time for 0:(3e503470,166833,F10)
498103.892: video_schedulerRIL: about to send 0:3e503470
498103.913: video_render:9:RIL:display_image 3e503470 state 4
498103.950: video_schedulerRIL:display image 0:(3e503470,166833,F10)
498104.033: video_render:9:RIL: update arrived, dst 0 x 0
498104.068: video_render:9:RIL: cb:2 tx:-1 cb=[img:3e5033f0 t:-1] inuse=[70]
498104.132: video_render:9:RIL: doing update on dn:0 img:3e503470,other fs:1 tx:0 1920x1080-(0x15)800x450
498104.284: video_render:9:RIL:return omx buffers:free 0
498104.322: video_decode:8:RIL: disp_cb passed 3e503470/166833/0x10
498107.403: video_render:9:RIL:cb:freeing cb:0 b:3e5034f0 t:-1
498107.422: video_render:9:RIL:cb:sending 3e5034f0 to disp queue
498107.456: video_render:9:RIL:release_images:releasing 3e5034f0
498107.477: video_render:9:RIL:return omx buffers:free 0
498107.550: video_render:9:RIL:cb:use=[60]
498107.582: video_render:9:RIL:cb:freeing cb:1 b:3e503430 t:-1
498107.605: video_render:9:RIL:cb:sending 3e503430 to disp queue
498107.635: video_render:9:RIL:cb:use=[40]
498107.661: video_render:9:RIL:cb:freeing cb:2 b:3e5033f0 t:-1
498107.695: video_render:9:RIL:cb:sending 3e5033f0 to disp queue
498107.718: video_render:9:RIL:cb:use=[00]
498107.756: video_render:9:RIL:release_images:releasing 3e503430
498107.790: video_render:9:RIL:release_images:releasing 3e5033f0
498107.818: video_render:9:RIL:return omx buffers:free 0
498107.853: video_render:9:RIL:return omx buffers:free 0
498303.865: clockRIL:waiting for 200000 (200 ms)
498503.912: clockRIL:waiting for 200000 (200 ms)
498703.960: clockRIL:waiting for 200000 (200 ms)
498904.003: clockRIL:waiting for 200000 (200 ms)
499104.116: clockRIL:waiting for 200000 (200 ms)
499304.166: clockRIL:waiting for 200000 (200 ms)
499504.242: clockRIL:waiting for 200000 (200 ms)
499704.299: clockRIL:waiting for 200000 (200 ms)
499904.345: clockRIL:waiting for 200000 (200 ms)
500104.390: clockRIL:waiting for 200000 (200 ms)
500304.431: clockRIL:waiting for 200000 (200 ms)
500504.473: clockRIL:waiting for 200000 (200 ms)
500704.521: clockRIL:waiting for 200000 (200 ms)
500904.569: clockRIL:waiting for 200000 (200 ms)
501104.626: clockRIL:waiting for 200000 (200 ms)
501304.680: clockRIL:waiting for 200000 (200 ms)
501504.754: clockRIL:waiting for 200000 (200 ms)
501704.796: clockRIL:waiting for 200000 (200 ms)
501904.841: clockRIL:waiting for 200000 (200 ms)
502104.887: clockRIL:waiting for 200000 (200 ms)
502304.930: clockRIL:waiting for 200000 (200 ms)
502504.975: clockRIL:waiting for 200000 (200 ms)
502705.022: clockRIL:waiting for 200000 (200 ms)
here is video processing function which is called in main loop
void CVideoRender::scheduleVideo()
{
OMX_BUFFERHEADERTYPE* buf = NULL;
uint32_t data_len = 0;
OMX_ERRORTYPE omx_err;
static uint32_t err_buf_count = 0;
isRunning = 1;
buf = ilclient_get_input_buffer(m_video_decode, 130, 0);
if( buf )
{
err_buf_count = 0;
// feed data and wait until we get port settings changed
unsigned char *dest = buf->pBuffer;
if( (m_nFileOffset + buf->nAllocLen) > m_nFileSize )
{
if( !reopenVideoFile() )
m_nLastError = -3;
else
printf( "%s: nOffset oversize...reopen file: %s\n", __FUNCTION__, m_strFile.c_str() );
return;
}
m_ifs.read( (char*)dest, buf->nAllocLen );
//check if read ok
if( m_ifs.fail() || m_ifs.eof() )
{
printf( "%s: File reading error...reopen file: %s\n", __FUNCTION__, m_strFile.c_str() );
if( !reopenVideoFile() )
m_nLastError = -3;
return;
}
m_nFileOffset += buf->nAllocLen;
if( !m_nPortSettingsChanged &&
( ( m_nFileOffset > 0 && ilclient_remove_event(m_video_decode, OMX_EventPortSettingsChanged, 131, 0, 0, 1) == 0) ||
( m_nFileOffset == 0 && ilclient_wait_for_event(m_video_decode, OMX_EventPortSettingsChanged, 131, 0, 0, 1, ILCLIENT_EVENT_ERROR | ILCLIENT_PARAMETER_CHANGED, 10000) == 0)) )
{
m_nPortSettingsChanged = 1;
printf("%s: first enter to port\n", __FUNCTION__);
if(ilclient_setup_tunnel(m_tunnel, 0, 0) != 0)
{
m_nLastError = -1;
return;
}
ilclient_change_component_state(m_video_scheduler, OMX_StateExecuting);
// now setup tunnel to video_render
if(ilclient_setup_tunnel(m_tunnel+1, 0, 1000) != 0)
{
fprintf(stderr, "%s: Failed to set up tunnel\n", __FUNCTION__);
m_nLastError = -2;
return;
}
ilclient_change_component_state(m_video_render, OMX_StateExecuting);
}
buf->nFilledLen = buf->nAllocLen;
buf->nOffset = 0;
if( m_nFirstPacked )
{
buf->nFlags = OMX_BUFFERFLAG_STARTTIME;
m_nFirstPacked = 0;
}
else
buf->nFlags = OMX_BUFFERFLAG_TIME_UNKNOWN;
omx_err = OMX_EmptyThisBuffer(ILC_GET_HANDLE(m_video_decode), buf);
if( OMX_ErrorNone != omx_err )
{
m_nLastError = omx_err;
return;
}
}
else {
err_buf_count++;
if( 0 == (err_buf_count & 0x0f) )
dbg1("Video buffer failure: %lu", err_buf_count);
}
}
Does anybody has same issue? Why decoder can block or stop working?
WBR,