使用Size2u代替width,height

This commit is contained in:
hyzboy 2025-03-29 15:35:01 +08:00
parent 5248f60e55
commit f4706aa941
6 changed files with 68 additions and 53 deletions

View File

@ -41,6 +41,13 @@ public:
using vec2i=vec2<int>;
using vec2d=vec2<double>;
template<typename T> struct Size2
{
T width,height;
};
using Size2u=Size2<uint>;
#define SAFE_CLEAR(obj) if(obj)delete obj;
template<typename T> class SafeObject

View File

@ -4,17 +4,16 @@ extern "C"
#include<libavutil/imgutils.h>
}
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));
}

View File

@ -1,5 +1,7 @@
#pragma once
#include"DataType.h"
extern "C"
{
#include<libavutil/pixfmt.h>
@ -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);

View File

@ -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

View File

@ -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: "<<width<<"x"<<height<<std::endl
std::cout<<"size: "<<frame_size.width<<"x"<<frame_size.height<<std::endl
<<"format: "<<av_get_pix_fmt_name(src_format)<<std::endl;
if(src_format!=AV_PIX_FMT_RGBA)
convert=InitFrameConvert(AV_PIX_FMT_RGBA,src_format,width,height);
convert=InitFrameConvert(AV_PIX_FMT_RGBA,src_format,frame_size);
}
if(src_format==AV_PIX_FMT_RGBA)

View File

@ -20,22 +20,25 @@ namespace
constexpr EncodecName_by_ID encodec_name_by_id[]=
{
{AV_CODEC_ID_H264 ,"h264_nvenc"},
{AV_CODEC_ID_H264 ,"nvenc"},
{AV_CODEC_ID_H264 ,"nvenc_h264"},
//{AV_CODEC_ID_H264 ,"h264_nvenc"},
//{AV_CODEC_ID_H264 ,"nvenc"},
//{AV_CODEC_ID_H264 ,"nvenc_h264"},
//
{AV_CODEC_ID_HEVC ,"hevc_nvenc"},
{AV_CODEC_ID_HEVC ,"nvenc_hevc"},
//{AV_CODEC_ID_HEVC ,"hevc_nvenc"},
//{AV_CODEC_ID_HEVC ,"nvenc_hevc"},
{AV_CODEC_ID_H264 ,"h264_amf"},
{AV_CODEC_ID_HEVC ,"hevc_amf"},
//{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_VP9 ,"vp9_qsv"},
//{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_VP9 ,"vp9_qsv"},
{AV_CODEC_ID_HEVC ,"libx265"},
{AV_CODEC_ID_H264 ,"libx264"},
{AV_CODEC_ID_NONE ,""}
};
@ -44,21 +47,25 @@ namespace
{
//if(hardware)
//{
// const AVCodec *codec=nullptr;
const AVCodec *codec=nullptr;
// for(auto &c:encodec_name_by_id)
// {
// if(c.id==id)
// {
// codec=avcodec_find_encoder_by_name(c.name);
for(auto &c:encodec_name_by_id)
{
if(c.id==id)
{
codec=avcodec_find_encoder_by_name(c.name);
// if(codec)
// {
// std::cout<<"use encoder: "<<c.name<<std::endl;
// return codec;
// }
// }
// }
if(codec)
{
std::cout<<"use encoder: "<<c.name<<std::endl;
return codec;
}
else
{
std::cerr<<"don't support encoder: "<<c.name<<std::endl;
}
}
}
//}
return avcodec_find_encoder(id);
@ -126,8 +133,8 @@ public:
codec_ctx->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;
}