| | |
| | | #include "stream.hpp" |
| | | |
| | | #include "../ffmpeg/data/CodedData.hpp" |
| | | extern "C"{ |
| | | #include <libavcodec/avcodec.h> |
| | | } |
| | | |
| | | #include "../ffmpeg/format/FormatIn.hpp" |
| | | #include "../ffmpeg/data/CodedData.hpp" |
| | | |
| | | namespace cffmpeg_wrap{ |
| | | stream::stream(ffwrapper::FormatIn *in, const int maxSize) |
| | |
| | | |
| | | stream::~stream(){ |
| | | std::lock_guard<std::mutex> locker(mutex_avpkt_); |
| | | list_avpkt_.clear(); |
| | | list_pkt_.clear(); |
| | | } |
| | | |
| | | int stream::SetPacket(std::shared_ptr<ffwrapper::CodedData> data){ |
| | | int stream::SetPacket(std::shared_ptr<ffwrapper::CodedData> data, int64_t &id){ |
| | | if (data){ |
| | | |
| | | auto audio = streamRef_->isAudioPkt(data->getAVPacket()); |
| | | // 如果包是音频包,但是不使用音频,直接返回 |
| | | if (!audio_ && audio){ |
| | | if (!audio_ && streamRef_->isAudioPkt(&data->getAVPacket())){ |
| | | return 0; |
| | | } |
| | | |
| | | std::lock_guard<std::mutex> locker(mutex_avpkt_); |
| | | list_avpkt_.push_back(data); |
| | | list_pkt_.push_back({data, id}); |
| | | |
| | | while(list_avpkt_.size() > max_size_){ |
| | | list_avpkt_.pop_front(); |
| | | while(!list_avpkt_.empty()){ |
| | | auto &cache = list_avpkt_.front(); |
| | | AVPacket &avpkt = cache->getAVPacket(); |
| | | if (!(avpkt.flags & AV_PKT_FLAG_KEY)){ |
| | | list_avpkt_.pop_front(); |
| | | }else{ |
| | | break; |
| | | } |
| | | } |
| | | while(list_pkt_.size() > max_size_/2*3){ |
| | | list_pkt_.pop_front(); |
| | | } |
| | | return list_avpkt_.size(); |
| | | |
| | | return list_pkt_.size(); |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | void stream::GetPacket(unsigned char **pktData, int *size, int *key){ |
| | | std::lock_guard<std::mutex> l(mutex_avpkt_); |
| | | if(list_avpkt_.empty()){ |
| | | if(list_pkt_.empty()){ |
| | | return; |
| | | } |
| | | auto data = list_avpkt_.front(); |
| | | auto pkt = data->getAVPacket(); |
| | | |
| | | auto data = list_pkt_.front(); |
| | | list_pkt_.pop_front(); |
| | | |
| | | auto pkt = data.data->getAVPacket(); |
| | | *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(); |
| | | } |
| | | } |