X-Git-Url: http://code.vuplus.com/gitweb/?a=blobdiff_plain;f=xbmc%2Fcores%2Fdvdplayer%2FDVDCodecs%2FVideo%2FVDPAU.cpp;h=73c4fa4a83a43f86450b00107f772803f4ee461d;hb=7ee2013ebe5ab3ca46bd7eacf1b21d384c0390e3;hp=b4d2d38fde01226ded78df282afbd8ebf46e7f03;hpb=c1978437caa1d6c44e5e3d83f97acddeab439e31;p=vuplus_xbmc diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp index b4d2d38..73c4fa4 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -39,6 +39,7 @@ using namespace VDPAU; #define NUM_RENDER_PICS 7 +#define NUM_CROP_PIX 3 #define ARSIZE(x) (sizeof(x) / sizeof((x)[0])) @@ -134,6 +135,7 @@ bool CVDPAUContext::EnsureContext(CVDPAUContext **ctx) { delete m_context; m_context = 0; + *ctx = NULL; return false; } } @@ -587,7 +589,6 @@ bool CDecoder::Open(AVCodecContext* avctx, const enum PixelFormat fmt, unsigned avctx->draw_horiz_band = CDecoder::FFDrawSlice; avctx->slice_flags=SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD; avctx->hwaccel_context = &m_hwContext; - avctx->thread_count = 1; g_Windowing.Register(this); return true; @@ -948,6 +949,7 @@ bool CDecoder::ConfigVDPAU(AVCodecContext* avctx, int ref_frames) m_inMsgEvent.Reset(); m_vdpauConfigured = true; + m_ErrorCount = 0; return true; } @@ -1078,7 +1080,11 @@ void CDecoder::FFDrawSlice(struct AVCodecContext *s, (VdpPictureInfo const *)&(vdp->m_hwContext.info), vdp->m_hwContext.bitstream_buffers_used, vdp->m_hwContext.bitstream_buffers); - vdp->CheckStatus(vdp_st, __LINE__); + if (vdp->CheckStatus(vdp_st, __LINE__)) + vdp->m_DecoderError = true; + else + vdp->m_DecoderError = false; + uint64_t diff = CurrentHostCounter() - startTime; if (diff*1000/CurrentHostFrequency() > 30) CLog::Log(LOGDEBUG, "CVDPAU::DrawSlice - VdpDecoderRender long decoding: %d ms, dec: %d, proc: %d, rend: %d", (int)((diff*1000)/CurrentHostFrequency()), decoded, processed, rend); @@ -1093,6 +1099,9 @@ int CDecoder::Decode(AVCodecContext *avctx, AVFrame *pFrame) CSingleLock lock(m_DecoderSection); + if (m_DecoderError && pFrame) + return VC_ERROR; + if (!m_vdpauConfigured) return VC_ERROR; @@ -1264,6 +1273,8 @@ bool CDecoder::CheckStatus(VdpStatus vdp_st, int line) { CLog::Log(LOGERROR, " (VDPAU) Error: %s(%d) at %s:%d\n", m_vdpauConfig.context->GetProcs().vdp_get_error_string(vdp_st), vdp_st, __FILE__, line); + m_ErrorCount++; + if(m_DisplayState == VDPAU_OPEN) { if (vdp_st == VDP_STATUS_DISPLAY_PREEMPTED) @@ -1271,12 +1282,13 @@ bool CDecoder::CheckStatus(VdpStatus vdp_st, int line) m_DisplayEvent.Reset(); m_DisplayState = VDPAU_LOST; } - else + else if (m_ErrorCount > 2) m_DisplayState = VDPAU_ERROR; } return true; } + m_ErrorCount = 0; return false; } @@ -2401,6 +2413,7 @@ void CMixer::InitCycle() } m_mixerstep = 0; + m_processPicture.crop = false; if (m_mixerInput[1].DVDPic.format == RENDER_FMT_VDPAU) { m_processPicture.outputSurface = m_outputSurfaces.front(); @@ -2409,8 +2422,8 @@ void CMixer::InitCycle() if (m_SeenInterlaceFlag) { double ratio = (double)m_mixerInput[1].DVDPic.iDisplayHeight / m_mixerInput[1].DVDPic.iHeight; - m_mixerInput[1].DVDPic.iHeight -= 6; - m_mixerInput[1].DVDPic.iDisplayHeight = lrint(ratio*m_mixerInput[1].DVDPic.iHeight); + m_mixerInput[1].DVDPic.iDisplayHeight = lrint(ratio*(m_mixerInput[1].DVDPic.iHeight-NUM_CROP_PIX*2)); + m_processPicture.crop = true; } } else @@ -2954,6 +2967,11 @@ bool COutput::Init() bool COutput::Uninit() { m_mixer.Dispose(); + glFlush(); + while(ProcessSyncPicture()) + { + Sleep(10); + } GLUnmapSurfaces(); ReleaseBufferPool(); DestroyGlxContext(); @@ -3079,7 +3097,7 @@ CVdpauRenderPicture* COutput::ProcessMixerPicture() retPic->texWidth = m_config.outWidth; retPic->texHeight = m_config.outHeight; retPic->crop.x1 = 0; - retPic->crop.y1 = (m_config.outHeight - retPic->DVDPic.iHeight) / 2; + retPic->crop.y1 = procPic.crop ? NUM_CROP_PIX : 0; retPic->crop.x2 = m_config.outWidth; retPic->crop.y2 = m_config.outHeight - retPic->crop.y1; }