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)
{