I tried the old way Xvba/Va in the past and it just didn't work well enough.
I built the new XbmcXvba and I'm quite pleased with how it's performing. I had a crash when I was toggling between fullscreen and window mode so I looked at the xbmc error log, and then the source code. I made a tweek to FFGetBuffer and the errors disappeared.
These are the signs of the problem:
23:24:48 T:139815462737664 DEBUG: XVBA::FFReleaseBuffer - ignoring invalid buffer
This seems to fix it.
Code:
--- ./xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp.orig 2011-12-14 23:05:22.935781205 -0700 +++ ./xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp 2011-12-15 00:16:50.562906967 -0700 @@ -900,6 +900,16 @@ int CDecoder::FFGetBuffer(AVCodecContext CDecoder* xvba = (CDecoder*)ctx->GetHardware(); struct pictureAge* pA = &xvba->picAge; + pic->data[0] = + pic->data[1] = + pic->data[2] = + pic->data[3] = 0; + + pic->linesize[0] = + pic->linesize[1] = + pic->linesize[2] = + pic->linesize[3] = 0; + CSharedLock lock(xvba->m_decoderSection); { CSharedLock dLock(xvba->m_displaySection); @@ -961,14 +971,6 @@ int CDecoder::FFGetBuffer(AVCodecContext return -1; pic->data[0] = (uint8_t*)render; - pic->data[1] = - pic->data[2] = - pic->data[3] = 0; - - pic->linesize[0] = - pic->linesize[1] = - pic->linesize[2] = - pic->linesize[3] = 0; if(pic->reference) {
Leave a comment: