使用Size2u代替width,height
This commit is contained in:
parent
5248f60e55
commit
f4706aa941
@ -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
|
||||
|
@ -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));
|
||||
}
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user