extern "C" { #include #include } #include #include"VideoDecoder.h" #include"FrameRecviver.h" namespace { struct EncodecName_by_ID { AVCodecID id; char name[32]; }; constexpr EncodecName_by_ID encodec_name_by_id[]= { {AV_CODEC_ID_MJPEG ,"mjpeg_cuvid"}, {AV_CODEC_ID_MPEG1VIDEO ,"mpeg1_cuvid"}, {AV_CODEC_ID_MPEG2VIDEO ,"mpeg2_cuvid"}, {AV_CODEC_ID_MPEG4 ,"mpeg4_cuvid"}, {AV_CODEC_ID_H264 ,"h264_cuvid"}, {AV_CODEC_ID_HEVC ,"hevc_cuvid"}, {AV_CODEC_ID_VC1 ,"vc1_cuvid"}, {AV_CODEC_ID_VP8 ,"vp8_cuvid"}, {AV_CODEC_ID_VP9 ,"vp9_cuvid"}, {AV_CODEC_ID_AV1 ,"av1_cuvid"}, {AV_CODEC_ID_H264 ,"h264_amf"}, {AV_CODEC_ID_HEVC ,"hevc_amf"}, {AV_CODEC_ID_MJPEG ,"mjpeg_qsv"}, {AV_CODEC_ID_MPEG2VIDEO ,"mpeg2_qsv"}, {AV_CODEC_ID_H264 ,"h264_qsv"}, {AV_CODEC_ID_HEVC ,"hevc_qsv"}, {AV_CODEC_ID_VC1 ,"vc1_qsv"}, {AV_CODEC_ID_VP8 ,"vp8_qsv"}, {AV_CODEC_ID_VP9 ,"vp9_qsv"}, {AV_CODEC_ID_AV1 ,"av1_qsv"}, {AV_CODEC_ID_NONE ,""} }; const AVCodec *GetAVDecodec(AVCodecID id,bool hardware) { if(hardware) { const AVCodec *codec=nullptr; for(auto &c:encodec_name_by_id) { if(c.id==id) { codec=avcodec_find_decoder_by_name(c.name); if(codec) { std::cout<<"use decoder: "<nb_streams;i++) { if(ctx->streams[i]->codecpar->codec_type==AVMEDIA_TYPE_VIDEO) { video_stream=ctx->streams[i]; video_stream_index=i; video_cp=video_stream->codecpar; } //if (ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) //{ // audio_stream_index = i; //} } if(!video_cp) return(false); video_codec=GetAVDecodec(video_cp->codec_id,use_hardware); if(!video_codec) { printf("Can't find decoder:%d\n",video_cp->codec_id); return(false); } video_ctx=avcodec_alloc_context3(video_codec); avcodec_parameters_to_context(video_ctx,video_cp); if(avcodec_open2(video_ctx,video_codec,nullptr)<0) { printf("Couldn't open video stream"); return(false); } width=video_cp->width; height=video_cp->height; frame=av_frame_alloc(); frame_recviver->OnFrameRate(video_stream->avg_frame_rate); return(true); } void Start() { if(!video_ctx)return; if(!video_stream)return; av_seek_frame(ctx,video_stream_index,0,AVSEEK_FLAG_FRAME); } bool NextFrame() { int ret; while((ret=av_read_frame(ctx,&packet))>=0) { if(packet.stream_index==video_stream_index) { ret=avcodec_send_packet(video_ctx,&packet); if(ret<0) { std::cerr<<"avcodec_send_packet return "<OnFrame(frame); av_packet_unref(&packet); return(true); } //else if (packet.stream_index == audio_stream_index) //{ // if (audio_decoder) // { // audio_decoder->DecodePackete(&packet); // } //} av_packet_unref(&packet); } std::cerr<<"av_read_frame return "<Init(filename,use_hardware)==false) { delete dec; return(nullptr); } return(dec); }