[Libav-user] draw_horiz_band and frame multi-thread question
nfxjfg at googlemail.com
Tue Dec 1 15:28:04 CET 2015
On Fri, 6 Nov 2015 11:39:13 +0100
Arnaud Carré <arnaud.carre at gmail.com> wrote:
> Hi Everyone,
> I'm writing a h264 video player supporting very high res ( about
> 16000*8000 pixels), running with DirectX11 / windows.
> To minimize memory copy between AVFrame & GPU texture, I want to use the
> draw_horiz_band callback. It's not well documented. My first version is
> working when I force the H264 decoder to 1 thread (
> m_pVideoCodecCtx->thread_count = 1; before avcodec_open2() )
> My problem is when I activate multi-thread h264 decoding.
> draw_horiz_band is called from several threads in no special order.
> that's perfectly fine to me. My problem is that draw_horiz_band still to
> be called "after" the end of "avcodec_decode_video2(m_pVideoCodecCtx,
> m_pVideoFrame, &iFrameFinished, pPacket);"
> Currently I'm doing this pseudo code:
> (1) lock directx texture
> (2) avcodec_decode_video2() -> start to call draw_horiz_band in //
> (3) unlock directx texture
> (4) render texture to screen
> Between (3) and (4) I still have some draw_horiz_band callback, which is
> bad because I already "unlock" the texture in (3).
> I'm looking to kind of thread "fence" to be sure the frame is complete.
> a kind of "wait all threads have done the frame".
> Anyone could help?
> thanks in advance
> NOTE: avcodec_decode_video2() is in a loop till "frame_finished", so
> when I go to (3) I know a complete frame is supposed to be ready
> NOTE2: again, everything is perfectly working if I force decoding on one
> thread. But obviously I need multi-thread decoding speed
Don't use draw_horiz_band. Use get_buffer2 instead. It's made for these
More information about the Libav-user