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
		
	
		
		
			
		
	
	
			115 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
| 
											1 year 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; | ||
|  | }; |