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

做网站是买服务器还是买主机书籍封面设计网站

做网站是买服务器还是买主机,书籍封面设计网站,罗湖在线,企业vi设计公司案例文章目录 播放器状态转换图播放器状态对应的消息#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.hkea.cn/news/14576493/

相关文章:

  • 城阳建网站阿里巴巴官网下载
  • 中山网站建设思福州网站建设seo
  • 个人公司网站搭建怎么免费做公司网页
  • 深圳网站制作07551教育机构线上推广方案
  • 企业网站建设费用怎么做账网站域名的根目录在哪里
  • 高端网站建设企业网站建站重庆工程建设招标网官方网站
  • 用ps做网站是用像素还是毫米东莞网站建设需要多少钱
  • 霞浦建站公司太平洋手机网
  • 花卉市场网站建设基本步骤网站建设灯
  • 企业请别人做网站wordpress作者增加页面权限
  • 韩雪冬网站建设服装网站的亮点
  • 网站跳出率一般是多少网站空间去哪里买的
  • 一个网站放两个vps手机wap网站导航模板
  • 七牛云如何做网站缓存网站怎么弄实名制认证
  • 手机靓号网站建设qq对话制作器app
  • 雄安投资建设集团有限公司网站云盘做网站文件
  • Wordpress 充值 卡密优化网站排名方法
  • 延安做网站的公司wordpress Honey 主题
  • 如何编程做网站如何形容网站开发公司技术经验
  • 休闲食品网站建设策划书微商城网站建设流程方案
  • 网站建设和维护工作内容杭州网站建设icp备
  • 怎么做卖橘子的网站烟台学校网站建设
  • 网站微信建设运维经验分享图深圳企业网站建设服务好
  • 站长怎么添加网站内容wordpress 删除标签页
  • 越秀网站建设设计网络推广文案策划
  • 网站开发 h5 h4广西百色建设局网站
  • 凡科做 淘宝客网站找推网
  • 网站建设套用模板类的要多少钱深圳社保个人网页
  • 电商网站建设制作wordpress主题开发网站
  • 怎么做一元购物网站深圳建筑工程公司招聘