网站定制开发收费标准是多少,wordpress资源下载插件,中山seo代理商,深圳注册公司网址背景
我在开发一个播放器的缓存队列时#xff0c;遇到一个bug,导致包和帧无法被下一个模块读取
找了半天#xff0c;原来是队列中的包和帧数据要进行内容的刷新暂存
包数据和帧数据不能直接放入队列
//入队#xff0c;包进队列
int AVPacketQueue::Push(AVPacket *val,i…背景
我在开发一个播放器的缓存队列时遇到一个bug,导致包和帧无法被下一个模块读取
找了半天原来是队列中的包和帧数据要进行内容的刷新暂存
包数据和帧数据不能直接放入队列
//入队包进队列
int AVPacketQueue::Push(AVPacket *val,int timeout)
{//加作用域互斥锁资源同一时间只能有一个线程访问作用域结束自动释放锁//std::lock_guardstd::mutex lock(mutex_);std::unique_lockstd::mutex lock(mutex_);//这里必须要加手动作用域互斥锁因为wait_for需要作用域//因为是包队列-双链表//如果队满了等待timeout时间if(duration_curduration_MAX) {// 等待pop或者超时唤醒cond_.wait_for(lock, std::chrono::milliseconds(timeout), [this] {return duration_curduration_MAX;});}//如果依然队满就直接返回-1if(duration_curduration_MAX){return -1;}//入队:出现问题的代码这里是直接把包指针存放到队列中了但是在ffmpeg中不能直接存放必须要先搞一个新包然后刷新暂存数据queue_.push(val);//增加队列缓存时间,强转成mslong ms static_castlong(av_rescale(val-duration, 1000, AV_TIME_BASE));this-duration_curms;cond_.notify_one();//条件变量通知其他线程可以继续执行return 0;
}解决方案
//入队包进队列
int AVPacketQueue::Push(AVPacket *val,int timeout)
{//加作用域互斥锁资源同一时间只能有一个线程访问作用域结束自动释放锁//std::lock_guardstd::mutex lock(mutex_);std::unique_lockstd::mutex lock(mutex_);//这里必须要加手动作用域互斥锁因为wait_for需要作用域//因为是包队列-双链表//如果队满了等待timeout时间if(duration_curduration_MAX) {// 等待pop或者超时唤醒cond_.wait_for(lock, std::chrono::milliseconds(timeout), [this] {return duration_curduration_MAX;});}//如果依然队满就直接返回-1if(duration_curduration_MAX){return -1;}//入队:一定注意必须要重新申请空间不然会指向同一段地址,而且后面要释放对应的数据包av_packet_freeAVPacket *tmp_packet av_packet_alloc();av_packet_move_ref(tmp_packet, val);queue_.push(tmp_packet);//增加队列缓存时间,强转成mslong ms static_castlong(av_rescale(val-duration, 1000, AV_TIME_BASE));this-duration_curms;cond_.notify_one();//条件变量通知其他线程可以继续执行return 0;
}