You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
2.5 KiB
C

9 months ago
extern "C"
{
#include "libavutil/avstring.h"
#include "libavutil/mathematics.h"
#include "libavutil/pixdesc.h"
#include "libavutil/imgutils.h"
#include "libavutil/dict.h"
#include "libavutil/parseutils.h"
#include "libavutil/samplefmt.h"
#include "libavutil/avassert.h"
#include "libavutil/time.h"
#include "libavformat/avformat.h"
#include "libavdevice/avdevice.h"
#include "libswscale/swscale.h"
#include "libavutil/opt.h"
#include "libavcodec/avfft.h"
#include "libswresample/swresample.h"
#include "libavfilter/avfiltergraph.h"
#include "libavfilter/buffersink.h"
#include "libavfilter/buffersrc.h"
#include "libavutil/avutil.h"
}
#include "SDL/SDL.h"
#include "SDL/SDL_thread.h"
#pragma comment(lib, "SDL2.lib")
#pragma comment(lib, "SDL2main.lib")
#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "avformat.lib")
#pragma comment(lib, "avutil.lib")
#pragma comment(lib, "avfilter.lib")
#pragma comment(lib, "avdevice.lib")
#pragma comment(lib, "postproc.lib")
#pragma comment(lib, "swresample.lib")
#pragma comment(lib, "swscale.lib")
#include "ffmpeg_dxva2_d.h"
#include "D3DVidRender.h"
typedef void (*CallbackFun)(unsigned char* data,int width,int height);
class Decoder_Hardware_D
{
public:
Decoder_Hardware_D()
{
mSrcWth = 0;
mSrcHth = 0;
mDstWth = 0;
mDstHth = 0;
mPixFmt = 0;
mOutBuf = NULL;
mBufYUV = NULL;
codec = NULL;
codecctx = NULL;
//pkt;
img_convert_ctx = NULL ;
scxt = NULL ;
mFrameYUV = NULL;
mSrcFrame = NULL;
mDstFrame = NULL;
s = NULL;
bAccel = true;
ipix_fmt = AV_PIX_FMT_YUV420P;
opix_fmt = AV_PIX_FMT_YUV420P;
decodingCallback = NULL;
frameCount = 0;
sTime = 0;
eTime = 0;
}
~Decoder_Hardware_D(){}
bool decoder_hw_init(int srcWth,int srcHth,int dstWth,int dstHth,int oPixFmt,HWND hwnd);
void decoder_hw_decoding(unsigned char* in_buf,int in_len);
void decoder_hw_release();
void set_decoding_callback(CallbackFun fun){decodingCallback = fun;}
protected:
bool ffmpeg_ref_release();
void pic_ref_mem_release();
void decoder_sws_scale_callback();
private:
CD3DVidRender m_D3DVidRender;
int mSrcWth;
int mSrcHth;
int mDstWth;
int mDstHth;
int mPixFmt;
uint8_t *mOutBuf;
uint8_t *mBufYUV;
AVCodec *codec;
AVCodecContext *codecctx;
AVPacket pkt;
struct SwsContext *img_convert_ctx;
struct SwsContext *scxt;
AVFrame *mFrameYUV;
AVFrame *mSrcFrame;
AVFrame *mDstFrame;
AVCodecParserContext *s;
bool bAccel;
AVPixelFormat ipix_fmt;
AVPixelFormat opix_fmt;
CallbackFun decodingCallback;
DWORD frameCount;
DWORD sTime,eTime;
};