From: jmarshallnz Date: Sun, 2 Mar 2014 21:34:09 +0000 (+1300) Subject: Merge pull request #4299 from Voyager1/zip-rootisdir X-Git-Tag: Gotham-beta1~4 X-Git-Url: http://code.vuplus.com/gitweb/?a=commitdiff_plain;h=8a408a4e8e56d2a662bfc4cb6f05ca456ae4d030;hp=bfdefb2e9823dfc238d5f1c0f98d170f1fafe5cf;p=vuplus_xbmc Merge pull request #4299 from Voyager1/zip-rootisdir Allow ZIP root to be viewed as directory to enable playback of files contained --- diff --git a/language/English (New Zealand)/langinfo.xml b/language/English (New Zealand)/langinfo.xml new file mode 100644 index 0000000..39abbfc --- /dev/null +++ b/language/English (New Zealand)/langinfo.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CP1252 + CP1252 + + + + en + + en + + + + + DD/MM/YYYY + DDDD, D MMMM YYYY + + C + kmh + UTC+12 + + + DD/MM/YYYY + DDDD, D MMMM YYYY + + C + kmh + UTC+12 + + + + + The + + diff --git a/language/Maori/langinfo.xml b/language/Maori/langinfo.xml new file mode 100644 index 0000000..6454be9 --- /dev/null +++ b/language/Maori/langinfo.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CP1252 + CP1252 + + + + en + + en + + + + + DD/MM/YYYY + DDDD, D MMMM YYYY + + C + kmh + UTC+12 + + + DD/MM/YYYY + DDDD, D MMMM YYYY + + C + kmh + UTC+12 + + + + + The + + diff --git a/language/Telugu/langinfo.xml b/language/Telugu/langinfo.xml new file mode 100644 index 0000000..c200699 --- /dev/null +++ b/language/Telugu/langinfo.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CP65001 + CP65001 + + + + te + + te + + + + + + DD/MM/YYYY + DDDD, D MMMM YYYY + + C + kmh + UTC+5:30 + + + + diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDARWINIOS.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkDARWINIOS.cpp index 0043934..eed93fa 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkDARWINIOS.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkDARWINIOS.cpp @@ -528,6 +528,8 @@ OSStatus CAAudioUnitSink::renderCallback(void *inRefCon, AudioUnitRenderActionFl sink->m_buffer->Read((unsigned char*)ioData->mBuffers[i].mData, bytes); if (bytes != wanted) CLog::Log(LOGERROR, "%s: %sFLOW (%i vs %i) bytes", __FUNCTION__, bytes > wanted ? "OVER" : "UNDER", bytes, wanted); + if (bytes == 0) + *ioActionFlags |= kAudioUnitRenderAction_OutputIsSilence; } // tell the sink we're good for more data condVar.notifyAll(); diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp index 98183a2..b4d2d38 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -62,9 +62,7 @@ CDecoder::Desc decoder_profiles[] = { {"VC1_SIMPLE", VDP_DECODER_PROFILE_VC1_SIMPLE}, {"VC1_MAIN", VDP_DECODER_PROFILE_VC1_MAIN}, {"VC1_ADVANCED", VDP_DECODER_PROFILE_VC1_ADVANCED}, -#ifdef VDP_DECODER_PROFILE_MPEG4_PART2_ASP {"MPEG4_PART2_ASP", VDP_DECODER_PROFILE_MPEG4_PART2_ASP}, -#endif }; const size_t decoder_profile_count = sizeof(decoder_profiles)/sizeof(CDecoder::Desc); @@ -511,14 +509,14 @@ bool CDecoder::Open(AVCodecContext* avctx, const enum PixelFormat fmt, unsigned #endif if (!g_Windowing.IsExtSupported("GL_NV_vdpau_interop")) { - CLog::Log(LOGNOTICE, "VDPAU: required extension GL_NV_vdpau_interop not found"); + CLog::Log(LOGNOTICE, "VDPAU::Open: required extension GL_NV_vdpau_interop not found"); return false; } if(avctx->coded_width == 0 || avctx->coded_height == 0) { - CLog::Log(LOGWARNING,"(VDPAU) no width/height available, can't init"); + CLog::Log(LOGWARNING,"VDPAU::Open: no width/height available, can't init"); return false; } m_vdpauConfig.numRenderBuffers = surfaces; @@ -537,45 +535,63 @@ bool CDecoder::Open(AVCodecContext* avctx, const enum PixelFormat fmt, unsigned { VdpDecoderProfile profile = 0; - if(avctx->codec_id == AV_CODEC_ID_H264) - profile = VDP_DECODER_PROFILE_H264_HIGH; -#ifdef VDP_DECODER_PROFILE_MPEG4_PART2_ASP - else if(avctx->codec_id == AV_CODEC_ID_MPEG4) - profile = VDP_DECODER_PROFILE_MPEG4_PART2_ASP; -#endif + + // convert FFMPEG codec ID to VDPAU profile. + ReadFormatOf(avctx->codec_id, profile, m_vdpauConfig.vdpChromaType); if(profile) { + VdpStatus vdp_st; + VdpBool is_supported = false; + uint32_t max_level, max_macroblocks, max_width, max_height; + + // query device capabilities to ensure that VDPAU can handle the requested codec + vdp_st = m_vdpauConfig.context->GetProcs().vdp_decoder_query_caps(m_vdpauConfig.context->GetDevice(), + profile, &is_supported, &max_level, &max_macroblocks, &max_width, &max_height); + + // test to make sure there is a possibility the codec will work + if (CheckStatus(vdp_st, __LINE__)) + { + CLog::Log(LOGERROR, "VDPAU::Open: error %s(%d) checking for decoder support", m_vdpauConfig.context->GetProcs().vdp_get_error_string(vdp_st), vdp_st); + return false; + } + + if (max_width < avctx->coded_width || max_height < avctx->coded_height) + { + CLog::Log(LOGWARNING,"VDPAU::Open: requested picture dimensions (%i, %i) exceed hardware capabilities ( %i, %i).", + avctx->coded_width, avctx->coded_height, max_width, max_height); + return false; + } + if (!CDVDCodecUtils::IsVP3CompatibleWidth(avctx->coded_width)) - CLog::Log(LOGWARNING,"(VDPAU) width %i might not be supported because of hardware bug", avctx->width); + CLog::Log(LOGWARNING,"VDPAU::Open width %i might not be supported because of hardware bug", avctx->width); - /* attempt to create a decoder with this width/height, some sizes are not supported by hw */ - VdpStatus vdp_st; + // attempt to create a decoder with this width/height, some sizes are not supported by hw vdp_st = m_vdpauConfig.context->GetProcs().vdp_decoder_create(m_vdpauConfig.context->GetDevice(), profile, avctx->coded_width, avctx->coded_height, 5, &m_vdpauConfig.vdpDecoder); - if(vdp_st != VDP_STATUS_OK) + if (CheckStatus(vdp_st, __LINE__)) { - CLog::Log(LOGERROR, " (VDPAU) Error: %s(%d) checking for decoder support\n", m_vdpauConfig.context->GetProcs().vdp_get_error_string(vdp_st), vdp_st); + CLog::Log(LOGERROR, "VDPAU::Open: error: %s(%d) checking for decoder support", m_vdpauConfig.context->GetProcs().vdp_get_error_string(vdp_st), vdp_st); return false; } m_vdpauConfig.context->GetProcs().vdp_decoder_destroy(m_vdpauConfig.vdpDecoder); CheckStatus(vdp_st, __LINE__); - } - - /* finally setup ffmpeg */ - memset(&m_hwContext, 0, sizeof(AVVDPAUContext)); - m_hwContext.render = CDecoder::Render; - m_hwContext.bitstream_buffers_allocated = 0; - avctx->get_buffer = CDecoder::FFGetBuffer; - avctx->reget_buffer = CDecoder::FFGetBuffer; - avctx->release_buffer = CDecoder::FFReleaseBuffer; - 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; + // finally setup ffmpeg + memset(&m_hwContext, 0, sizeof(AVVDPAUContext)); + m_hwContext.render = CDecoder::Render; + m_hwContext.bitstream_buffers_allocated = 0; + avctx->get_buffer = CDecoder::FFGetBuffer; + avctx->reget_buffer = CDecoder::FFGetBuffer; + avctx->release_buffer = CDecoder::FFReleaseBuffer; + 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; + } } return false; } @@ -3057,7 +3073,7 @@ CVdpauRenderPicture* COutput::ProcessMixerPicture() m_config.useInteropYuv = false; m_bufferPool.numOutputSurfaces = NUM_RENDER_PICS; EnsureBufferPool(); - GLMapSurfaces(); + GLMapSurface(false, procPic.outputSurface); retPic->sourceIdx = procPic.outputSurface; retPic->texture[0] = m_bufferPool.glOutputSurfaceMap[procPic.outputSurface].texture[0]; retPic->texWidth = m_config.outWidth; @@ -3070,7 +3086,7 @@ CVdpauRenderPicture* COutput::ProcessMixerPicture() else { m_config.useInteropYuv = true; - GLMapSurfaces(); + GLMapSurface(true, procPic.videoSurface); retPic->sourceIdx = procPic.videoSurface; for (unsigned int i=0; i<4; ++i) retPic->texture[i] = m_bufferPool.glVideoSurfaceMap[procPic.videoSurface].texture[i]; @@ -3185,6 +3201,9 @@ void COutput::ProcessReturnPicture(CVdpauRenderPicture *pic) CLog::Log(LOGDEBUG, "COutput::ProcessReturnPicture - gl surface not found"); return; } +#ifdef GL_NV_vdpau_interop + glVDPAUUnmapSurfacesNV(1, &(it->second.glVdpauSurface)); +#endif VdpVideoSurface surf = it->second.sourceVuv; m_config.videoSurfaces->ClearRender(surf); } @@ -3197,6 +3216,9 @@ void COutput::ProcessReturnPicture(CVdpauRenderPicture *pic) CLog::Log(LOGDEBUG, "COutput::ProcessReturnPicture - gl surface not found"); return; } +#ifdef GL_NV_vdpau_interop + glVDPAUUnmapSurfacesNV(1, &(it->second.glVdpauSurface)); +#endif VdpOutputSurface outSurf = it->second.sourceRgb; m_mixer.m_dataPort.SendOutMessage(CMixerDataProtocol::BUFFER, &outSurf, sizeof(outSurf)); } @@ -3406,95 +3428,103 @@ bool COutput::GLInit() return true; } -void COutput::GLMapSurfaces() +void COutput::GLMapSurface(bool yuv, uint32_t source) { #ifdef GL_NV_vdpau_interop - if (m_config.useInteropYuv) + if (yuv) { - VdpauBufferPool::GLVideoSurface glSurface; - VdpVideoSurface surf; - if (m_config.videoSurfaces->Size() != m_bufferPool.glVideoSurfaceMap.size()) + std::map::iterator it; + it = m_bufferPool.glVideoSurfaceMap.find(source); + if (it == m_bufferPool.glVideoSurfaceMap.end()) { - for (unsigned int i = 0; i < m_config.videoSurfaces->Size(); i++) - { - surf = m_config.videoSurfaces->GetAtIndex(i); + VdpauBufferPool::GLVideoSurface glSurface; + VdpVideoSurface surf = source; - if (surf == VDP_INVALID_HANDLE) - continue; + if (surf == VDP_INVALID_HANDLE) + return; - if (m_bufferPool.glVideoSurfaceMap.find(surf) == m_bufferPool.glVideoSurfaceMap.end()) - { - glSurface.sourceVuv = surf; - while (glGetError() != GL_NO_ERROR) ; - glGenTextures(4, glSurface.texture); - if (glGetError() != GL_NO_ERROR) - { - CLog::Log(LOGERROR, "VDPAU::COutput error creating texture"); - m_vdpError = true; - } - glSurface.glVdpauSurface = glVDPAURegisterVideoSurfaceNV(reinterpret_cast(surf), + glSurface.sourceVuv = surf; + while (glGetError() != GL_NO_ERROR) ; + glGenTextures(4, glSurface.texture); + if (glGetError() != GL_NO_ERROR) + { + CLog::Log(LOGERROR, "VDPAU::COutput error creating texture"); + m_vdpError = true; + } + glSurface.glVdpauSurface = glVDPAURegisterVideoSurfaceNV(reinterpret_cast(surf), GL_TEXTURE_2D, 4, glSurface.texture); - if (glGetError() != GL_NO_ERROR) - { - CLog::Log(LOGERROR, "VDPAU::COutput error register video surface"); - m_vdpError = true; - } - glVDPAUSurfaceAccessNV(glSurface.glVdpauSurface, GL_READ_ONLY); - if (glGetError() != GL_NO_ERROR) - { - CLog::Log(LOGERROR, "VDPAU::COutput error setting access"); - m_vdpError = true; - } - glVDPAUMapSurfacesNV(1, &glSurface.glVdpauSurface); - if (glGetError() != GL_NO_ERROR) - { - CLog::Log(LOGERROR, "VDPAU::COutput error mapping surface"); - m_vdpError = true; - } - m_bufferPool.glVideoSurfaceMap[surf] = glSurface; - if (m_vdpError) - return; - CLog::Log(LOGNOTICE, "VDPAU::COutput registered surface"); - } + if (glGetError() != GL_NO_ERROR) + { + CLog::Log(LOGERROR, "VDPAU::COutput error register video surface"); + m_vdpError = true; } + glVDPAUSurfaceAccessNV(glSurface.glVdpauSurface, GL_READ_ONLY); + if (glGetError() != GL_NO_ERROR) + { + CLog::Log(LOGERROR, "VDPAU::COutput error setting access"); + m_vdpError = true; + } + m_bufferPool.glVideoSurfaceMap[surf] = glSurface; + + CLog::Log(LOGNOTICE, "VDPAU::COutput registered surface"); } + + while (glGetError() != GL_NO_ERROR) ; + glVDPAUMapSurfacesNV(1, &m_bufferPool.glVideoSurfaceMap[source].glVdpauSurface); + if (glGetError() != GL_NO_ERROR) + { + CLog::Log(LOGERROR, "VDPAU::COutput error mapping surface"); + m_vdpError = true; + } + + if (m_vdpError) + return; } else { - if (m_bufferPool.glOutputSurfaceMap.size() != m_bufferPool.numOutputSurfaces) + std::map::iterator it; + it = m_bufferPool.glOutputSurfaceMap.find(source); + if (it == m_bufferPool.glOutputSurfaceMap.end()) { - VdpauBufferPool::GLVideoSurface glSurface; - for (unsigned int i = m_bufferPool.glOutputSurfaceMap.size(); i(m_bufferPool.outputSurfaces[i]), + if (m_bufferPool.outputSurfaces[idx] == source) + break; + } + + VdpauBufferPool::GLVideoSurface glSurface; + glSurface.sourceRgb = m_bufferPool.outputSurfaces[idx]; + glGenTextures(1, glSurface.texture); + glSurface.glVdpauSurface = glVDPAURegisterOutputSurfaceNV(reinterpret_cast(m_bufferPool.outputSurfaces[idx]), GL_TEXTURE_2D, 1, glSurface.texture); - if (glGetError() != GL_NO_ERROR) - { - CLog::Log(LOGERROR, "VDPAU::COutput error register output surface"); - m_vdpError = true; - } - glVDPAUSurfaceAccessNV(glSurface.glVdpauSurface, GL_READ_ONLY); - if (glGetError() != GL_NO_ERROR) - { - CLog::Log(LOGERROR, "VDPAU::COutput error setting access"); - m_vdpError = true; - } - glVDPAUMapSurfacesNV(1, &glSurface.glVdpauSurface); - if (glGetError() != GL_NO_ERROR) - { - CLog::Log(LOGERROR, "VDPAU::COutput error mapping surface"); - m_vdpError = true; - } - m_bufferPool.glOutputSurfaceMap[m_bufferPool.outputSurfaces[i]] = glSurface; - if (m_vdpError) - return; + if (glGetError() != GL_NO_ERROR) + { + CLog::Log(LOGERROR, "VDPAU::COutput error register output surface"); + m_vdpError = true; } + glVDPAUSurfaceAccessNV(glSurface.glVdpauSurface, GL_READ_ONLY); + if (glGetError() != GL_NO_ERROR) + { + CLog::Log(LOGERROR, "VDPAU::COutput error setting access"); + m_vdpError = true; + } + m_bufferPool.glOutputSurfaceMap[source] = glSurface; CLog::Log(LOGNOTICE, "VDPAU::COutput registered output surfaces"); } + + while (glGetError() != GL_NO_ERROR) ; + glVDPAUMapSurfacesNV(1, &m_bufferPool.glOutputSurfaceMap[source].glVdpauSurface); + if (glGetError() != GL_NO_ERROR) + { + CLog::Log(LOGERROR, "VDPAU::COutput error mapping surface"); + m_vdpError = true; + } + + if (m_vdpError) + return; } #endif } diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h index 2dd3c28..9f58e76 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h @@ -443,7 +443,7 @@ protected: void PreCleanup(); void InitMixer(); bool GLInit(); - void GLMapSurfaces(); + void GLMapSurface(bool yuv, uint32_t source); void GLUnmapSurfaces(); bool CheckStatus(VdpStatus vdp_st, int line); CEvent m_outMsgEvent;