I've changed the size and number of the slices from the source and it shows perfectly the video. What is the relation between the slices and the DXVA2 ?
2014-08-26 10:58 GMT+02:00 Hector Alonso <[email protected]>: > Hi, > > I've modified my initialization code: supressed flags, and enabled > thread_safe_callbacks, but the result is the same, lots of "Missing > reference picture, default is __" error messages and avcodec_decode_video2 > returns -1094995529 "Invalid data found when processing input" half the > time. > The video is showing very very poorly with tons of compression artifacts. > I've read the extradata comment in ffmpeg code and it seems that is not > really used with H264 codec. I've run my ffmpeg-not-HWaccel decoder and the > extradata is not used at all indeed. > > This is the new initialization: > > #ifdef DXVA2_DECODER_ENABLED > > // Create and populate Input Stream structure: > InputStream* ist = new InputStream(); > ist->hwaccel_id = HWACCEL_AUTO; > ist->hwaccel_device = "dxva2"; > ist->dec = _pCodec; > ist->dec_ctx = _pCodecCtx; > > // Set Known width and height > _pCodecCtx->coded_width = 1280; > _pCodecCtx->coded_height = 720; > > // Set Input Stream structure as ancillary data into codec > _pCodecCtx->opaque = ist; > // Initialize DXV2 context > dxva2_init(_pCodecCtx); > > // Set DXVA2 callbacks to codec context > _pCodecCtx->get_buffer2 = ist->hwaccel_get_buffer; > _pCodecCtx->get_format = get_format; > _pCodecCtx->thread_safe_callbacks = 1; > > #endif > > Remember: dxva2_init is a call to the analogue method from ffmpeg_dxva.c > file modified by me into a .h and a .cpp attached in a previous mail (I > don't know if that's a common practice in this mail list or you do it in > another way). > > Regarding the next step (using the DX surface directly as an OpenGL > texture), it can be done > using: WGLEW_NV_DX_interop, wglDXOpenDeviceNV, wglDXSetResourceShareHandleNV, > wglDXRegisterObjectNV, > make current, lock, etc. > > Look at WiDiSample code -> RenderOpenGL.cpp bind texture (Intel Media SDK > video decoder example), and this page: > http://halogenica.net/sharing-resources-between-directx-and-opengl/ > > ...but for now I'm more worried about getting the DXVA2 to work properly > with FFMPEG. > > What am I missing? > > > > > 2014-08-25 17:53 GMT+02:00 wm4 <[email protected]>: > > On Mon, 25 Aug 2014 15:23:20 +0200 >> Hector Alonso <[email protected]> wrote: >> >> > Hi, >> > I've rebuilt ffmpeg using these instructions >> > https://trac.ffmpeg.org/wiki/CompilationGuide/MSVC from the Visual >> Studio >> > Console, installing MinGW directly from the link with the flags >> --enable-dxva2 >> > and --enable-hwaccel=h264_dxva2 and is almost working but I get a lot >> > of errors: >> > -1094995529 "Invalid data found when processing input" >> > from avcodec_decode_video2 a lot of artifacts and a very poor and >> > inconsistent image quality. >> > This is my dxva initialization code: >> > >> > _pCodecCtx->flags|= CODEC_CAP_DR1; >> > _pCodecCtx->flags|= CODEC_CAP_HWACCEL; >> > >> > InputStream *ist = new InputStream (); >> > ist->hwaccel_id = HWACCEL_AUTO; >> > ist->hwaccel_device = "dxva2"; >> > ist->dec = _pCodec; >> > ist->dec_ctx = _pCodecCtx; >> > _pCodecCtx->coded_width = 1280; >> > _pCodecCtx->coded_height = 720; >> > _pCodecCtx->opaque = ist; >> > dxva2_init(_pCodecCtx); >> > _pCodecCtx->opaque = ist; >> > _pCodecCtx->get_buffer2 = ist->hwaccel_get_buffer; >> > _pCodecCtx->get_format = get_format; >> > _pCodecCtx->thread_safe_callbacks = 0; >> > >> > before calling >> > >> > if (avcodec_open2(_pCodecCtx , _pCodec, 0) < 0) ... >> > >> > Where get_format is: >> > >> > static enum AVPixelFormat get_format(AVCodecContext *s, const enum >> > AVPixelFormat *pix_fmts) >> > { >> > InputStream* ist = (InputStream*)s->opaque; >> > ist->active_hwaccel_id = HWACCEL_DXVA2; >> > ist->hwaccel_pix_fmt = AV_PIX_FMT_DXVA2_VLD; >> > return ist->hwaccel_pix_fmt; >> > } >> > >> > Find attached my modified ffmpeg_dxva2.cpp and ffmpeg_dxva2.h files from >> > the original ffmpeg_dxva2.c and the InputStream declaration from >> ffmpeg.h >> > >> > For getting the decoded frame I call: dxva2_retrieve_data_call, and >> then I >> > convert it to YUV420p (I make the final conversion via pixel shader with >> > OpenGL texture). >> > >> > Also, with my old CPU decoder I had 3-6% CPU usage and 5-10% GPU usage >> (as >> > I said, I'm converting and painting with OpenGL) and now with the "GPU >> > Accelerated" one I have 5-13% CPU and 6-12% GPU. >> >> PS: nevcairiel mentioned: >> http://developer.download.nvidia.com/opengl/specs/WGL_NV_DX_interop.txt >> >> Unfortunately, it's marked as experimental, and other drivers probably >> don't provide it. >> >> > Any thoughts? >> > >> > Thank you! >> > >> _______________________________________________ >> Libav-user mailing list >> [email protected] >> http://ffmpeg.org/mailman/listinfo/libav-user >> > >
_______________________________________________ Libav-user mailing list [email protected] http://ffmpeg.org/mailman/listinfo/libav-user
