| | |
| | | #include "../ffmpeg/format/FormatIn.hpp" |
| | | #include "../ffmpeg/data/CodedData.hpp" |
| | | #include "../ffmpeg/log/log.hpp" |
| | | #include "../common.hpp" |
| | | |
| | | extern "C"{ |
| | | #include <libavformat/avformat.h> |
| | |
| | | { |
| | | decoder::decoder(ffwrapper::FormatIn *dec) |
| | | :decRef_(dec) |
| | | ,conv_(NULL) |
| | | {} |
| | | |
| | | decoder::~decoder(){ |
| | | |
| | | if (conv_){ |
| | | delete conv_; |
| | | conv_ = NULL; |
| | | } |
| | | std::lock_guard<std::mutex> l(mutex_frm_); |
| | | for(auto i : list_frm_){ |
| | | free(i.data); |
| | |
| | | return 0; |
| | | } |
| | | |
| | | int decoder::saveFrame(AVFrame *frame, int64_t &id){ |
| | | int decoder::saveFrame(AVFrame *frame, const int64_t &id){ |
| | | AVFrame *cFrame = NULL; |
| | | bool conv = false; |
| | | if (frame->format != AV_PIX_FMT_NV12){ |
| | | if (!conv_){ |
| | | conv_ = new cvbridge( |
| | | frame->width, frame->height, frame->format, |
| | | frame->width, frame->height, AV_PIX_FMT_NV12); |
| | | } |
| | | if (conv_){ |
| | | cFrame = conv_->convert2Frame(frame); |
| | | if (!cFrame) return -1; |
| | | conv = true; |
| | | } |
| | | } |
| | | AVFrame * rFrame = frame; |
| | | if (conv && cFrame) rFrame = cFrame; |
| | | |
| | | FRM frm; |
| | | frm.width = frame->width; |
| | | frm.height = frame->height; |
| | | frm.format = frame->format; |
| | | frm.width = rFrame->width; |
| | | frm.height = rFrame->height; |
| | | frm.format = rFrame->format; |
| | | frm.id = id; |
| | | frm.data = cvbridge::extractFrame(frame, &frm.length); |
| | | |
| | | frm.data = cvbridge::extractFrame(rFrame, &frm.length); |
| | | |
| | | if (conv && cFrame) av_frame_free(&cFrame); |
| | | |
| | | std::lock_guard<std::mutex> l(mutex_frm_); |
| | | while(list_frm_.size() > 50){ |
| | | for(int i = 0; i < 12; i++){ |
| | |
| | | return list_frm_.size(); |
| | | } |
| | | |
| | | int decoder::SetFrame(std::shared_ptr<ffwrapper::CodedData> data, int64_t &id){ |
| | | int decoder::SetFrame(const CPacket &pkt){ |
| | | auto data = pkt.data; |
| | | |
| | | if (!data) return -10; |
| | | if (!decRef_->isVideoPkt(&data->getAVPacket())) return -20; |
| | |
| | | av_packet_unref(&np); |
| | | |
| | | if (ret == 0){ |
| | | saveFrame(frame, id); |
| | | saveFrame(frame, pkt.v_id); |
| | | } |
| | | av_frame_free(&frame); |
| | | return ret; |