| | |
| | | #include "../configure/conf.hpp" |
| | | |
| | | #include "../property/VideoProp.hpp" |
| | | #include "../data/CodedData.hpp" |
| | | #include "../data/FrameData.hpp" |
| | | |
| | | #include "../../common/gpu/info.h" |
| | | |
| | |
| | | vs_idx_ = i; |
| | | |
| | | auto in = ctx_->streams[i]; |
| | | if(in->r_frame_rate.num >=1 && in->r_frame_rate.den >= 1){ |
| | | fps_ = av_q2d(in->r_frame_rate); |
| | | }else if(in->avg_frame_rate.num >=1 && in->avg_frame_rate.den >= 1){ |
| | | if(in->avg_frame_rate.num >=1 && in->avg_frame_rate.den >= 1){ |
| | | fps_ = av_q2d(in->avg_frame_rate); |
| | | }else if(in->r_frame_rate.num >=1 && in->r_frame_rate.den >= 1){ |
| | | fps_ = av_q2d(in->r_frame_rate); |
| | | } |
| | | logIt("video stream time base %d : %d", in->time_base.num, in->time_base.den); |
| | | logIt("in stream fps %f, time_base: %d : %d", fps_, in->time_base.num, in->time_base.den); |
| | | } |
| | | if (type == AVMEDIA_TYPE_AUDIO){ |
| | | as_idx_ = i; |
| | | logIt("audio stream time base %d : %d", ctx_->streams[i]->time_base.num, ctx_->streams[i]->time_base.den); |
| | | } |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | bool FormatIn::openCodec(const int type, AVDictionary **options){ |
| | | int stream_index = -1; |
| | | switch(type){ |
| | | case AVMEDIA_TYPE_VIDEO: |
| | | stream_index = vs_idx_; |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | if(stream_index < 0){ |
| | | logIt("open input %s codec need correct stream",ctx_->filename); |
| | | bool FormatIn::openCodec(AVDictionary **options){ |
| | | if (vs_idx_ == -1) return false; |
| | | |
| | | return false; |
| | | } |
| | | |
| | | AVStream *s = ctx_->streams[stream_index]; |
| | | AVStream *s = ctx_->streams[vs_idx_]; |
| | | |
| | | AVCodecParameters *codecpar = s->codecpar; |
| | | AVCodec *dec = NULL; |
| | |
| | | return ctx_->streams[vs_idx_]; |
| | | } |
| | | |
| | | if (type == ctx_->streams[vs_idx_]->codecpar->codec_type) |
| | | if (vs_idx_ > -1 && type == ctx_->streams[vs_idx_]->codecpar->codec_type) |
| | | return ctx_->streams[vs_idx_]; |
| | | if (type == ctx_->streams[as_idx_]->codecpar->codec_type) |
| | | if (as_idx_ > -1 && type == ctx_->streams[as_idx_]->codecpar->codec_type) |
| | | return ctx_->streams[as_idx_]; |
| | | |
| | | return NULL; |
| | |
| | | return dec_ctx_; |
| | | } |
| | | |
| | | bool FormatIn::isVideoPkt(AVPacket &pkt){ |
| | | if (pkt.stream_index == vs_idx_){ |
| | | bool FormatIn::isVideoPkt(AVPacket *pkt){ |
| | | if (pkt->stream_index == vs_idx_){ |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | bool FormatIn::isAudioPkt(AVPacket &pkt){ |
| | | if (pkt.stream_index == as_idx_){ |
| | | bool FormatIn::isAudioPkt(AVPacket *pkt){ |
| | | if (pkt->stream_index == as_idx_){ |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | bool FormatIn::readPacket(AVPacket &pkt_out){ |
| | | int FormatIn::readPacket(AVPacket *pkt_out){ |
| | | |
| | | const int ret = av_read_frame(ctx_, &pkt_out); |
| | | if(ret < 0){ |
| | | return false; |
| | | } |
| | | |
| | | return true; |
| | | |
| | | return av_read_frame(ctx_, pkt_out); |
| | | } |
| | | |
| | | bool FormatIn::readPacket(std::shared_ptr<CodedData> &data){ |
| | | |
| | | AVPacket &pkt(data->getAVPacket()); |
| | | return readPacket(pkt); |
| | | } |
| | | |
| | | int FormatIn::decode(AVFrame* &frame, AVPacket &pkt){ |
| | | int FormatIn::decode(AVFrame* frame, AVPacket *pkt){ |
| | | |
| | | AVStream *in = getStream(); |
| | | |
| | | av_packet_rescale_ts(&pkt, in->time_base, in->codec->time_base); |
| | | int ret = avcodec_send_packet(dec_ctx_, &pkt); |
| | | av_packet_rescale_ts(pkt, in->time_base, in->codec->time_base); |
| | | int ret = avcodec_send_packet(dec_ctx_, pkt); |
| | | if(ret < 0){ |
| | | logIt("avcodec_send_packet error : %s", getAVErrorDesc(ret).c_str()); |
| | | return -1; |
| | |
| | | logIt("decode frame failed : %s", getAVErrorDesc(ret).c_str()); |
| | | return -1; |
| | | }else{ |
| | | return 1; |
| | | return 0; |
| | | } |
| | | } |
| | | return 0; |
| | | return -2; |
| | | } |
| | | |
| | | int FormatIn::decode(std::shared_ptr<FrameData> &frame_data, |
| | | std::shared_ptr<CodedData> &data){ |
| | | |
| | | AVFrame *frame = frame_data->getAVFrame(); |
| | | AVPacket &pkt(data->getAVPacket()); |
| | | |
| | | return decode(frame, pkt); |
| | | } |
| | | |
| | | int FormatIn::readFrame(AVFrame* &frame){ |
| | | |
| | | auto data(std::make_shared<CodedData>()); |
| | | if(!readPacket(data)){ |
| | | return -1; |
| | | } |
| | | |
| | | AVPacket &pkt(data->getAVPacket()); |
| | | |
| | | return decode(frame, pkt); |
| | | } |
| | | |
| | | int FormatIn::readFrame(std::shared_ptr<FrameData> &frame_data){ |
| | | |
| | | AVFrame *frame(frame_data->getAVFrame()); |
| | | |
| | | return readFrame(frame); |
| | | } |
| | | |
| | | |
| | | } |