| | |
| | | pkt.id = id++; |
| | | } |
| | | pkt.data = data; |
| | | if(data != nullptr) { |
| | | cacheAVPacket(data->getAVPacket()); |
| | | } |
| | | |
| | | run_worker(in.get(), pkt); |
| | | if(!data){ |
| | |
| | | auto p = list_pic_.front(); |
| | | *data = p.data; *w = p.w; *h = p.h; |
| | | list_pic_.pop_front(); |
| | | } |
| | | |
| | | void Wrapper::GetPacket(unsigned char **pktData, int *size, int *key){ |
| | | std::lock_guard<std::mutex> l(mutex_avpkt_); |
| | | if(list_avpkt_.empty()){ |
| | | return; |
| | | } |
| | | auto pkt = list_avpkt_.front(); |
| | | *key = pkt.flags & AV_PKT_FLAG_KEY; |
| | | *size = pkt.size; |
| | | *pktData = (unsigned char *)malloc(*size); |
| | | memcpy(*pktData, pkt.data, pkt.size); |
| | | |
| | | list_avpkt_.pop_front(); |
| | | } |
| | | void Wrapper::cacheAVPacket(const AVPacket &pkt){ |
| | | std::lock_guard<std::mutex> l(mutex_pic_); |
| | | while(list_avpkt_.size() > 10){ |
| | | // printf("cacheAVPacket drop packets!!!!!!!!!!\n"); |
| | | for(int i = 0; i < 5; i++){ |
| | | list_avpkt_.pop_front(); |
| | | } |
| | | } |
| | | list_avpkt_.emplace_back(pkt); |
| | | } |
| | | |
| | | void Wrapper::run_worker(ffwrapper::FormatIn *in, avpacket &pkt){ |
| | |
| | | } |
| | | *size = pkt.size + extradata_size; |
| | | *out = (unsigned char *)malloc(*size); |
| | | |
| | | |
| | | memcpy(*out, extra, extradata_size); |
| | | memcpy(*out + extradata_size, pkt.data, pkt.size); |
| | | |