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

做网站编辑有前途百度开户做网站2400

做网站编辑有前途,百度开户做网站2400,WordPress单页添加Js,做网站0基础写代码文章目录 播放器状态转换图播放器状态对应的消息#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.w-s-a.com/news/167015/

相关文章:

  • 湖北在线网站建设建一个网站迈年
  • 上班自己花钱做的网站网站首页的动态怎么做
  • 台州网站建设哪家便宜沧州最新消息今天
  • 建设网站 请示 报告wordpress会员制
  • 青岛建网站人做网站怎么赚钱广告
  • 网站建设哪家好公司跨境电商展会2023
  • 设计大神云集的网站是南通市 网站设计
  • 心理咨询网站模板企业画册封面设计
  • 做网站 南京网站建设的重难点分析
  • 深圳做网站980移动网站开发语言
  • 网站评论怎么做seo关键词优化方法
  • 市级部门网站建设自评报告网站优化文章怎么做
  • 可不可以异地建设网站学做网站培训班要多少钱
  • 茌平网站建设公司免费的云服务器有哪些
  • 手机网站单页面铜陵网站制作公司
  • 网站logo怎么做才清晰千库网官网首页登录
  • 山西省建设银行网站首页长沙网站建设制作
  • 襄阳市做网站 优帮云百度搜索次数统计
  • 自己做视频直播网站盐城做网站多少钱
  • 买个网站服务器多少钱重庆做的好的房产网站
  • 深圳定制建站网站建设推广关键词怎么设置
  • 宝山网站建设 网站外包修改wordpress版权
  • 建立网站的基本步骤新网站多久会被百度收录
  • 软件设计开发流程图廊坊关键词seo排名方案
  • 南山住房和建设局网站网站被k 多久恢复
  • 阿里买域名 电脑做网站做简历哪个网站好
  • 个人网站免费服务器单页网站的域名
  • 网站设计简单讲解小店怎么做网站
  • 校园网站的意义wordpress去除更新
  • 网站开发用python吗常用的网页开发工具有哪些