| | |
| | | io_ctx_ = NULL; |
| | | } |
| | | if(ctx_){ |
| | | avformat_close_input(&ctx_); |
| | | avformat_free_context(ctx_); |
| | | if (!ctx_->oformat){ |
| | | avformat_free_context(ctx_); |
| | | }else{ |
| | | avformat_close_input(&ctx_); |
| | | } |
| | | ctx_ = NULL; |
| | | if(dec_ctx_){ |
| | | avcodec_close(dec_ctx_); |
| | |
| | | auto err = av_probe_input_buffer(ctx_->pb, &ctx_->iformat, NULL, NULL, 0, read_io_buff_size_); |
| | | if(err != 0){ |
| | | logIt("open with custom io prob input buffer error:%d\n", err); |
| | | logIt("failed:%s", getAVErrorDesc(err).c_str()); |
| | | logIt("custom io failed:%s", getAVErrorDesc(err).c_str()); |
| | | return -1; |
| | | } |
| | | |
| | |
| | | int ret = openWithCustomIO(handle_gb28181, handle_gb28181->readData, options); |
| | | if(ret < 0){ |
| | | logIt("do openWithCustomIO failed:%d",ret); |
| | | } |
| | | }else{ |
| | | ret = avformat_open_input(&ctx_, "", NULL, options); |
| | | } |
| | | |
| | | ret = avformat_open_input(&ctx_, "", NULL, options); |
| | | // if(ret < 0){ |
| | | // logIt("open %s failed:%s",filename, |
| | | // getAVErrorDesc(ret).c_str()); |
| | |
| | | return false; |
| | | } |
| | | |
| | | logIt("there are %d stream", ctx_->nb_streams); |
| | | // logIt("there are %d stream", ctx_->nb_streams); |
| | | |
| | | for (int i = 0; i < ctx_->nb_streams; ++i) |
| | | { |
| | | auto type = ctx_->streams[i]->codecpar->codec_type; |
| | | logIt("there are %d stream, stream %d, type %d", ctx_->nb_streams, i, type); |
| | | |
| | | if (type == AVMEDIA_TYPE_VIDEO){ |
| | | vs_idx_ = i; |
| | | |
| | |
| | | }else if(in->r_frame_rate.num >=1 && in->r_frame_rate.den >= 1){ |
| | | fps_ = av_q2d(in->r_frame_rate); |
| | | } |
| | | logIt("in stream fps %f, time_base: %d : %d", fps_, in->time_base.num, in->time_base.den); |
| | | logIt("in stream video fps %f, time_base: %d : %d", fps_, in->time_base.num, in->time_base.den); |
| | | } |
| | | if (type == AVMEDIA_TYPE_AUDIO){ |
| | | as_idx_ = i; |
| | | auto in = ctx_->streams[i]; |
| | | logIt("in stream audio %d time_base: %d : %d", in->codecpar->codec_id, in->time_base.num, in->time_base.den); |
| | | if (in->codecpar->codec_id == AV_CODEC_ID_AAC) |
| | | as_idx_ = i; |
| | | else |
| | | logIt("record not support audio codec: %d", in->codecpar->codec_id); |
| | | } |
| | | } |
| | | |
| | |
| | | continue; |
| | | }else{ |
| | | av_dict_set(&avdic, "gpu", std::to_string(idle_gpu).c_str(), 0); |
| | | // av_dict_set(&avdic, "gpu", std::to_string(2).c_str(), 0); |
| | | } |
| | | }else{ |
| | | dec = avcodec_find_decoder(codecpar->codec_id); |
| | |
| | | return NULL; |
| | | } |
| | | |
| | | std::vector<AVStream*> FormatIn::allStreams(){ |
| | | std::vector<AVStream*> vec; |
| | | auto v = getStream(AVMEDIA_TYPE_VIDEO); |
| | | if (v){ |
| | | vec.push_back(v); |
| | | } |
| | | auto a = getStream(AVMEDIA_TYPE_AUDIO); |
| | | if (a){ |
| | | vec.push_back(a); |
| | | } |
| | | return vec; |
| | | } |
| | | |
| | | AVCodecContext *FormatIn::getCodecContext(int type){ |
| | | return dec_ctx_; |
| | | } |
| | |
| | | return false; |
| | | } |
| | | |
| | | bool FormatIn::notVideoAudio(AVPacket *pkt){ |
| | | return !isVideoPkt(pkt) && !isAudioPkt(pkt); |
| | | } |
| | | |
| | | int FormatIn::readPacket(AVPacket *pkt_out){ |
| | | |
| | | return av_read_frame(ctx_, pkt_out); |