[Libav-user] HW Accelerator in Windows: DXVA2 with new API

Hector Alonso hector.alonso.aparicio at gmail.com
Thu Aug 28 13:20:17 CEST 2014


Is there a limitation into the number of slices the DXVA2 decoder can
manage? Is there any way to reconfigure it?
I've changed the "MAX_SLICES" definition and rebuilt ffmpeg (as suggested
for the mpeg2 decoder) but nothing has changed. If i set the source of the
video (1280*720) to make slices smaller than 2000B (8000bps) it makes the
mountrous artifacts.
Any suggestions?


2014-08-26 16:45 GMT+02:00 Hector Alonso <hector.alonso.aparicio at gmail.com>:

> 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 <hector.alonso.aparicio at gmail.com
> >:
>
> 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 <nfxjfg at googlemail.com>:
>>
>> On Mon, 25 Aug 2014 15:23:20 +0200
>>> Hector Alonso <hector.alonso.aparicio at gmail.com> 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
>>> Libav-user at ffmpeg.org
>>> http://ffmpeg.org/mailman/listinfo/libav-user
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20140828/929e706b/attachment.html>


More information about the Libav-user mailing list