当前位置: 首页 > news >正文

一个做网页的网站陕西中洋建设有限公司网站

一个做网页的网站,陕西中洋建设有限公司网站,绘本借阅网站开发,网站建设的数据导入导出文章目录 播放器状态转换图播放器状态对应的消息#xff1a; 消息对象消息队列消息队列api插入消息获取消息初始化消息插入消息加锁初始化消息设置消息参数消息队列初始化清空消息销毁消息启动消息队列终止消息队列删除消息 消息队列#xff0c;用于发送#xff0c;设置播放… 文章目录 播放器状态转换图播放器状态对应的消息 消息对象消息队列消息队列api插入消息获取消息初始化消息插入消息加锁初始化消息设置消息参数消息队列初始化清空消息销毁消息启动消息队列终止消息队列删除消息 消息队列用于发送设置播放器的状态实现ui界面jikpalyer以及ffplay之间的通信 播放器状态转换图 实线箭头连接的状态变化通过 API 调⽤完成 虚线箭头连接的状态变化是通过 播放器内部执⾏完特定任务或者发⽣错误 ⽽⾃动发⽣的状态 变化 播放器状态对应的消息 idle: MP_STATE_IDLE 闲置状态刚完成构造的 FijkPlayeinitialized MP_STATE_INITIALIZED 初始化完成状态和 idle 状态相⽐仅是多了输⼊媒体 数据源的信息async_preparingMP_STATE_ASYNC_PREPARING 异步准备状态进行打开媒体⽂件打开解码器以及新建解码线程新建数据 read 线程打开⾳频输出设备新建视频输出线程等preparedMP_STATE_PREPARED完成指定任务后⾃动转化为此状态。此状态下已经缓冲并解码了⼀部分⾳视频数据可以随时进⾏播放startedMP_STATE_STARTED 媒体视频、⾳频正在播放中pausedMP_STATE_PAUSED 媒体视频、⾳频播放暂停completedMP_STATE_COMPLETED 媒体视频、⾳频播放完成。 可重新从头开始播 放。stop: MP_STATE_STOPPED 播放器各种线程占⽤资源都已经释放。 ⾳频设备关闭error MP_STATE_ERROR 播放器出现错误 消息对象 typedef struct AVMessage {int what; // 消息类型int arg1; // 参数1int arg2; // 参数2void *obj; // 如果arg1 arg2还不够存储消息则使⽤该参数void (*free_l)(void *obj); // 释放obj指向的函数struct AVMessage *next; // 下⼀个消息 } AVMessage;消息队列 typedef struct MessageQueue { // 消息队列AVMessage *first_msg, *last_msg; // 消息头消息尾部int nb_messages; // 有多少个消息int abort_request; // 请求终⽌消息队列SDL_mutex *mutex; // 互斥量SDL_cond *cond; // 条件变量AVMessage *recycle_msg; // 消息循环使⽤int recycle_count; // 循环的次数利⽤局部性原理int alloc_count; // 分配的次数 } MessageQueue;recycle_msg 用于回收消息消息使用链表进行存储当消息取出时通过recycle_msg链接该消息重新用做新消息使用 作用节省了对新消息申请空间以及对取出的消息释放内存操作 消息队列api 插入消息 // 消息队列内部重新去构建 AVMessage重新申请AVMessage或者来自于recycle_msg // 新的消息插入到尾部 int msg_queue_put_private(MessageQueue *q, AVMessage *msg) {AVMessage *msg1;if(q-abort_request)return -1;//1. 消息体使用回收的资源还是重新mallocmsg1 q-recycle_msg;if(msg1) {q-recycle_msg msg1-next;q-recycle_count;} else {q-alloc_count;msg1 (AVMessage *)av_malloc(sizeof(AVMessage));}*msg1 *msg;msg1-next NULL;if(!q-first_msg) {q-first_msg msg1;} else {q-last_msg-next msg1;}q-last_msg msg1;q-nb_messages;SDL_CondSignal(q-cond);return 0; }获取消息 int msg_queue_get(MessageQueue *q, AVMessage *msg, int block) {AVMessage *msg1;int ret;SDL_LockMutex(q-mutex);for(;;) {if(q-abort_request) {ret -1;break;}//获取消息msg1 q-first_msg;if(msg1) {q-first_msg msg1-next;if(!q-first_msg)q-last_msg NULL;q-nb_messages--;*msg *msg1;msg1-obj NULL;msg1-next q-recycle_msg;q-recycle_msg msg1;ret 1;break; // 记得这里有个break的} else if (!block) {ret 0;break;} else {SDL_CondWait(q-cond, q-mutex);}}SDL_UnlockMutex(q-mutex);return ret; }初始化消息 // 消息队列初始化 void msg_queue_init(MessageQueue *q) {memset(q, 0, sizeof(MessageQueue));q-mutex SDL_CreateMutex();q-cond SDL_CreateCond();q-abort_request 1; }插入消息加锁 int msg_queue_put(MessageQueue *q, AVMessage *msg) {int ret;SDL_LockMutex(q-mutex);ret msg_queue_put_private(q, msg);SDL_UnlockMutex(q-mutex);return ret; } 初始化消息 void msg_init_msg(AVMessage *msg) {memset(msg, 0, sizeof(AVMessage)); }设置消息参数 void msg_queue_put_simple1(MessageQueue *q, int what) {AVMessage msg;msg_init_msg(msg);msg.what what;msg_queue_put(q, msg); }// 释放msg的obj资源 void msg_obj_free_l(void *obj) {av_free(obj); } //插入消息带消息类型带2个参数带obj void msg_queue_put_simple4(MessageQueue *q, int what, int arg1, int arg2, void *obj, int obj_len) {AVMessage msg;msg_init_msg(msg);msg.what what;msg.arg1 arg1;msg.arg2 arg2;msg.obj av_malloc(obj_len);memcpy(msg.obj, obj, obj_len);msg.free_l msg_obj_free_l;msg_queue_put(q, msg); }消息队列初始化 void msg_queue_init(MessageQueue *q) {memset(q, 0, sizeof(MessageQueue));q-mutex SDL_CreateMutex();q-cond SDL_CreateCond();q-abort_request 1; }清空消息 // 消息队列flush清空所有的消息 void msg_queue_flush(MessageQueue *q) {AVMessage *msg, *msg1;SDL_LockMutex(q-mutex);for (msg q-first_msg; msg ! NULL; msg msg1) { // 这个时候的obj没有清空那会导致泄漏实际是把消息对象暂存到了recycle_msgmsg1 msg-next;msg-next q-recycle_msg;q-recycle_msg msg;}q-last_msg NULL;q-first_msg NULL;q-nb_messages 0;SDL_UnlockMutex(q-mutex);}销毁消息 void msg_queue_destroy(MessageQueue *q) {msg_queue_flush(q);SDL_LockMutex(q-mutex);while(q-recycle_msg) {AVMessage *msg q-recycle_msg;if (msg)q-recycle_msg msg-next;msg_free_res(msg);av_freep(msg);}SDL_UnlockMutex(q-mutex);SDL_DestroyMutex(q-mutex);SDL_DestroyCond(q-cond); }启动消息队列 void msg_queue_start(MessageQueue *q) {SDL_LockMutex(q-mutex);q-abort_request 0;// 插入一个消息AVMessage msg;msg_init_msg(msg);msg.what FFP_MSG_FLUSH;msg_queue_put_private(q, msg);SDL_UnlockMutex(q-mutex); }终止消息队列 void msg_queue_abort(MessageQueue *q) {SDL_LockMutex(q-mutex);q-abort_request 1;SDL_CondSignal(q-cond);SDL_UnlockMutex(q-mutex); }删除消息 // 消息删除 把队列里同一消息类型的消息全删除掉 void msg_queue_remove(MessageQueue *q, int what) {AVMessage **p_msg, *msg, *last_msg;SDL_LockMutex(q-mutex);last_msg q-first_msg;if (!q-abort_request q-first_msg) {p_msg q-first_msg;while (*p_msg) {msg *p_msg;if (msg-what what) { // 同类型的消息全部删除*p_msg msg-next;msg_free_res(msg);msg-next q-recycle_msg; // 消息体回收q-recycle_msg msg;q-nb_messages--;} else {last_msg msg;p_msg msg-next;}}if (q-first_msg) {q-last_msg last_msg;} else {q-last_msg NULL;}}SDL_UnlockMutex(q-mutex); }
http://www.dnsts.com.cn/news/164638.html

相关文章:

  • 琼海做球网站不动户激活 e路护航安全组件
  • 怎么用别人网站做模板wordpress怎么看html
  • 普宁建设局网站企业网站开发有哪些
  • 游戏网站设计风格有哪些烟台高端网站建设公司
  • 网站建设哪个公司好网站后台用什么语言合适
  • 郑州做网站的专业公司wordpress内页锚文本
  • 注册域名和建立网站的过程网页版传奇手游排行榜
  • 集团网站建设工作方案怎么架设网站
  • 教育公司网站建设文案seo顾问是干什么
  • 网站建设市场拓展岗位腾讯企业邮箱官网入口
  • 站酷网官方入口网页版南通五建宏业建设工程有限公司网站
  • 余姚厂家高端网站设计简述jsp网站架构
  • 网站为什么要seo如何做ps4游戏视频网站
  • 做物流网站费用网站底部的制作
  • 做网站需要了解什么软件企业网站开发询问薇
  • 关于小城镇建设的网站西安网站建设招聘
  • jsp购物网站开发 论文上海新闻综合频道
  • 网站样式有哪些风格在线美图
  • 做网站多长时间深圳建网站的公
  • 百度云盘做网站好看的网站模版
  • 找人做logo网站万江东莞网站建设
  • 网站制作比较好的制作公司通信部门网站备案证明
  • 网站建设师做网站主要显哪些内容
  • 网站建设定制网站建设公司wordpress安装无法链接数据库文件
  • 专门做各种产品测评的网站html怎么做音乐网站
  • 网站建设投放广告做园区门户网站的需求分析
  • 仙桃网站设计网站开发建设挣钱吗
  • 仿站 做网站做网站运营好还是SEO好
  • cida室内设计师资格证百度seo关键词优化公司
  • 七台河网站制作做企业网站建设公司哪家好