diff --git a/DataType.h b/DataType.h index bd38028..504260e 100644 --- a/DataType.h +++ b/DataType.h @@ -41,6 +41,13 @@ public: using vec2i=vec2; using vec2d=vec2; +template struct Size2 +{ + T width,height; +}; + +using Size2u=Size2; + #define SAFE_CLEAR(obj) if(obj)delete obj; template class SafeObject diff --git a/FrameConvert.cpp b/FrameConvert.cpp index 6ffc34e..7c8e4be 100644 --- a/FrameConvert.cpp +++ b/FrameConvert.cpp @@ -4,17 +4,16 @@ extern "C" #include } -FrameConvert::FrameConvert(SwsContext *sc,enum AVPixelFormat dst,enum AVPixelFormat src,const uint32_t w,const uint32_t h) +FrameConvert::FrameConvert(SwsContext *sc,enum AVPixelFormat dst,enum AVPixelFormat src,const Size2u &src_size) { ctx=sc; dst_fmt=dst; src_fmt=src; - width=w; - height=h; + frame_size=src_size; - av_image_alloc(dst_data,dst_linesize,w,h,dst,1); + av_image_alloc(dst_data,dst_linesize,frame_size.width,frame_size.height,dst,1); } FrameConvert::~FrameConvert() @@ -27,18 +26,18 @@ void FrameConvert::Convert(const FrameData &src_data,const FrameLinesize &src_li { sws_scale( ctx, src_data,src_linesize, - 0,height, + 0,frame_size.height, dst_data,dst_linesize); } -FrameConvert *InitFrameConvert(enum AVPixelFormat dst,enum AVPixelFormat src,const uint32_t w,const uint32_t h) +FrameConvert *InitFrameConvert(enum AVPixelFormat dst,enum AVPixelFormat src,const Size2u &src_size) { - SwsContext *sc=sws_getContext( w,h,src, - w,h,dst, - SWS_FAST_BILINEAR, + SwsContext *sc=sws_getContext( src_size.width,src_size.height,src, + src_size.width,src_size.height,dst, + SWS_SPLINE, nullptr,nullptr,nullptr); if(!sc)return(nullptr); - return(new FrameConvert(sc,dst,src,w,h)); + return(new FrameConvert(sc,dst,src,src_size)); } \ No newline at end of file diff --git a/FrameConvert.h b/FrameConvert.h index 999edf7..68a0d1a 100644 --- a/FrameConvert.h +++ b/FrameConvert.h @@ -1,5 +1,7 @@ #pragma once +#include"DataType.h" + extern "C" { #include @@ -12,7 +14,7 @@ typedef int FrameLinesize[8]; class FrameConvert { AVPixelFormat src_fmt,dst_fmt; - uint32_t width,height; + Size2u frame_size; SwsContext *ctx; @@ -21,9 +23,9 @@ class FrameConvert private: - friend FrameConvert *InitFrameConvert(enum AVPixelFormat dst,enum AVPixelFormat src,const uint32_t w,const uint32_t h); + friend FrameConvert *InitFrameConvert(enum AVPixelFormat dst,enum AVPixelFormat src,const Size2u &); - FrameConvert(SwsContext *sc,enum AVPixelFormat dst,enum AVPixelFormat src,const uint32_t w,const uint32_t h); + FrameConvert(SwsContext *sc,enum AVPixelFormat dst,enum AVPixelFormat src,const Size2u &); public: @@ -38,4 +40,4 @@ public: const int GetLinesize(const int index)const{return dst_linesize[index];} };//class FrameConvert -FrameConvert *InitFrameConvert(enum AVPixelFormat dst,enum AVPixelFormat src,const uint32_t w,const uint32_t h); +FrameConvert *InitFrameConvert(enum AVPixelFormat dst,enum AVPixelFormat src,const Size2u &src_size); diff --git a/FrameRecviver.h b/FrameRecviver.h index 7ee7cc6..d381857 100644 --- a/FrameRecviver.h +++ b/FrameRecviver.h @@ -12,8 +12,7 @@ class FrameRecviver { protected: - uint width=0; - uint height=0; + Size2u frame_size; AVRational frame_rate; @@ -26,8 +25,8 @@ public: public: - const uint GetWidth()const{return width;} - const uint GetHeight()const{return height;} + const uint GetWidth()const{return frame_size.width;} + const uint GetHeight()const{return frame_size.height;} };// class RGBAFrameRecviver:public FrameRecviver diff --git a/RGBAFrameRecviver.cpp b/RGBAFrameRecviver.cpp index 2fe7089..3065cdb 100644 --- a/RGBAFrameRecviver.cpp +++ b/RGBAFrameRecviver.cpp @@ -10,16 +10,16 @@ bool RGBAFrameRecviver::OnFrame(const AVFrame *frame) { if(src_format==AV_PIX_FMT_NONE) { - width=frame->width; - height=frame->height; + frame_size.width=frame->width; + frame_size.height=frame->height; src_format=AVPixelFormat(frame->format); - std::cout<<"size: "<framerate =fr; codec_ctx->time_base.den=fr.num; codec_ctx->time_base.num=fr.den; - codec_ctx->gop_size =12; - codec_ctx->max_b_frames =2; + codec_ctx->gop_size =25; + codec_ctx->max_b_frames =3; codec_ctx->pix_fmt =AV_PIX_FMT_NV12; codec_ctx->codec_type =AVMEDIA_TYPE_VIDEO; @@ -147,7 +154,8 @@ public: { avcodec_parameters_to_context(codec_ctx,video_stream->codecpar); - av_opt_set(codec_ctx->priv_data,"preset","slow",0); + av_opt_set(codec_ctx->priv_data,"preset","veryslow",0); + av_opt_set(codec_ctx->priv_data,"crf","10",0); if(fmt_ctx->oformat->flags&AVFMT_GLOBALHEADER) codec_ctx->flags|=AV_CODEC_FLAG_GLOBAL_HEADER; @@ -274,8 +282,8 @@ VideoEncoder *CreateVideoEncoder(const char *filename,const uint bit_rate,const { constexpr AVCodecID codec_list[] { - AV_CODEC_ID_HEVC, AV_CODEC_ID_H264, + AV_CODEC_ID_HEVC, AV_CODEC_ID_VP9, AV_CODEC_ID_AV1 }; @@ -284,7 +292,7 @@ VideoEncoder *CreateVideoEncoder(const char *filename,const uint bit_rate,const for(AVCodecID id:codec_list) { - codec=GetAVEncodec(AV_CODEC_ID_H264,use_hardware); + codec=GetAVEncodec(id,use_hardware); if(codec)break; }