[Libav-user] draw_horiz_band and frame multi-thread question

wm4 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
> Arnaud
> 
> 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
situations.


More information about the Libav-user mailing list