同步机制
原理介绍
LXHPL提供以下几种同步机制:
Event的同步等待:调用lynSynchronizeEvent接口,阻塞当前线程执行,直至等待的Event被触发,该接口一般配合lynRecordEvent接口使用,调用顺序为: lynRecordEvent记录事件 → lynSynchronizeEvent同步等待该事件被触发
Stream间的同步:Stream间的同步需要在源Stream中调用lynRecordEvent记录Event,并在目标Stream中调用lynStreamWaitEvent等待源Stream中的Event唤醒目标Stream,这样目标Stream中的后续异步任务才会继续下发。调用lynStreamWaitEvent不会阻塞当前线程执行,只是在目标Stream中插入一个待唤醒的Event。
Stream内的同步:调用lynSynchronizeStream接口,阻塞当前线程执行,直到当前Stream中的所有任务都完成。
Stream与Callback回调函数同步:在异步接口后调用lynStreamAddAsyncCallback添加异步回调函数,Stream中的异步指令执行完成后会自动执行自定义回调函数。
Event同步等待
用户可以从LynSDK提供的示例代码中查看完整样例,在示例代码中,调用各接口后都添加了异常判断和处理,以下是关键步骤代码示例,仅供参考,不可以直接拷贝编译。
//创建Event
lynEvent_t event;
lynCreateEvent(&event);
//创建Stream
lynStream_t stream;
lynCreateStream(&stream);
//在当前Stream中下发异步任务
//......
//stream末尾插入event
lynRecordEvent(stream, event);
//阻塞当前线程,等待event被唤醒,也就是stream执行完成
lynSynchronizeEvent(event);
//销毁资源
lynDestroyEvent(event);
lynDestroyStream(stream);
Stream间同步
用户可以从LynSDK提供的示例代码中查看完整样例,在示例代码中,调用各接口后都添加了异常判断和处理,以下是关键步骤代码示例,仅供参考,不可以直接拷贝编译。
lynCreateContext(&context, 0);
//创建解码器发送Stream、接收Stream以及图像预处理Stream
lynCreateStream(&vdec_send_stream);
lynCreateStream(&vdec_recv_stream);
lynCreateStream(&ipe_stream);
//创建Event
lynCreateEvent(&vdec_event);
//在发送Stream发送待解码包,在接收Stream中接收解码后的图像
lynVdecSendPacketAsync(vdec_send_stream, vdec, dmx_packet);
lynVdecRecvFrameAsync(vdec_recv_stream, vdec, &vdec_frame);
//在解码器接收Stream中插入Event
lynRecordEvent(vdec_recv_stream, vdec_event);
//在IPE Stream中等待该Event被唤醒,然后在IPE Stream中下发异步任务
//此处lynStreamWaitEvent并不阻塞当前线程执行
lynStreamWaitEvent(ipe_stream, vdec_event);
lynIpeProcessAsync(ipe_stream, ipe_input, ipe_output, ipe_config);
//同步等待,线程阻塞,直至所有Stream中的任务完成
lynSynchronizeStream(vdec_send_stream);
lynSynchronizeStream(vdec_recv_stream);
lynSynchronizeStream(ipe_stream);
//销毁资源
lynDestroyEvent(vdec_event);
lynDestroyStream(vdec_send_stream);
lynDestroyStream(vdec_recv_stream);
lynDestroyStream(ipe_stream);
lynDestroyContext(context);