xbmc: update to xbmc-12.2-71eb528

Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
Stephan Raue 2013-09-06 03:47:42 +02:00
parent 679c2f278c
commit 20dfd9745e
16 changed files with 2 additions and 2464 deletions

View File

@ -19,7 +19,7 @@
################################################################################
PKG_NAME="xbmc-theme-Confluence"
PKG_VERSION="12.2-18397e1"
PKG_VERSION="12.2-71eb528"
if [ "$XBMC" = "master" ]; then
PKG_VERSION="13.alpha-2435cf3"
elif [ "$XBMC" = "xbmc-aml" ]; then

View File

@ -19,7 +19,7 @@
################################################################################
PKG_NAME="xbmc"
PKG_VERSION="12.2-18397e1"
PKG_VERSION="12.2-71eb528"
if [ "$XBMC" = "master" ]; then
PKG_VERSION="13.alpha-2435cf3"
elif [ "$XBMC" = "xbmc-aml" ]; then

View File

@ -1,746 +0,0 @@
From 1a93a46fe38c926ccd7658ce6f8c827d0491c117 Mon Sep 17 00:00:00 2001
From: stupid-boy <amushatov@gmail.com>
Date: Wed, 13 Feb 2013 23:47:07 +0200
Subject: [PATCH 1/2] [OMXPlayer] Both HDMI and Analog output
---
xbmc/cores/omxplayer/OMXAudio.cpp | 407 +++++++++++++++++++++++++-------
xbmc/cores/omxplayer/OMXAudio.h | 12 +-
xbmc/cores/omxplayer/OMXPlayerAudio.cpp | 9 +-
xbmc/settings/GUISettings.cpp | 2 +
xbmc/settings/GUISettings.h | 3 +
5 files changed, 341 insertions(+), 92 deletions(-)
diff --git a/xbmc/cores/omxplayer/OMXAudio.cpp b/xbmc/cores/omxplayer/OMXAudio.cpp
index 10c3329..1470685 100644
--- a/xbmc/cores/omxplayer/OMXAudio.cpp
+++ b/xbmc/cores/omxplayer/OMXAudio.cpp
@@ -111,8 +111,7 @@
m_eEncoding (OMX_AUDIO_CodingPCM),
m_extradata (NULL ),
m_extrasize (0 ),
- m_last_pts (DVD_NOPTS_VALUE),
- m_omx_render (NULL )
+ m_last_pts (DVD_NOPTS_VALUE)
{
m_vizBufferSize = m_vizRemapBufferSize = VIS_PACKET_SIZE * sizeof(float);
m_vizRemapBuffer = (uint8_t *)_aligned_malloc(m_vizRemapBufferSize,16);
@@ -161,7 +160,7 @@ CAEChannelInfo COMXAudio::GetChannelLayout(AEAudioFormat format)
return info;
}
-bool COMXAudio::Initialize(AEAudioFormat format, std::string& device, OMXClock *clock, CDVDStreamInfo &hints, bool bUsePassthrough, bool bUseHWDecode)
+bool COMXAudio::Initialize(AEAudioFormat format, OMXClock *clock, CDVDStreamInfo &hints, bool bUsePassthrough, bool bUseHWDecode)
{
Deinitialize();
@@ -320,32 +319,62 @@ bool COMXAudio::Initialize(AEAudioFormat format, std::string& device, OMXClock *
componentName = "OMX.broadcom.audio_render";
- if(!m_omx_render)
- m_omx_render = new COMXCoreComponent();
- if(!m_omx_render)
+ std::string device = "";
+
+ if((g_guiSettings.GetInt("audiooutput.mode") == AUDIO_HDMI) ||
+ (g_guiSettings.GetInt("audiooutput.mode") == AUDIO_BOTH))
{
- CLog::Log(LOGERROR, "COMXAudio::Initialize error allocate OMX.broadcom.audio_render\n");
- return false;
+ device = "hdmi";
+ if(!m_omx_render_HDMI.Initialize((const std::string)componentName, OMX_IndexParamAudioInit))
+ return false;
+
+ OMX_CONFIG_BRCMAUDIODESTINATIONTYPE audioDest;
+ OMX_INIT_STRUCTURE(audioDest);
+ strncpy((char *)audioDest.sName, device.c_str(), strlen(device.c_str()));
+
+ omx_err = m_omx_render_HDMI.SetConfig(OMX_IndexConfigBrcmAudioDestination, &audioDest);
+ if (omx_err != OMX_ErrorNone)
+ return false;
+
+ OMX_CONFIG_BOOLEANTYPE configBool;
+ OMX_INIT_STRUCTURE(configBool);
+ configBool.bEnabled = OMX_FALSE;
+
+ omx_err = m_omx_render_HDMI.SetConfig(OMX_IndexConfigBrcmClockReferenceSource, &configBool);
+ if (omx_err != OMX_ErrorNone)
+ return false;
}
- if(!m_omx_render->Initialize((const std::string)componentName, OMX_IndexParamAudioInit))
- return false;
+ if((g_guiSettings.GetInt("audiooutput.mode") == AUDIO_ANALOG) ||
+ (g_guiSettings.GetInt("audiooutput.mode") == AUDIO_BOTH))
+ {
+ device = "local";
+ if(!m_omx_render_analog.Initialize((const std::string)componentName, OMX_IndexParamAudioInit))
+ return false;
- OMX_CONFIG_BRCMAUDIODESTINATIONTYPE audioDest;
- OMX_INIT_STRUCTURE(audioDest);
- strncpy((char *)audioDest.sName, device.c_str(), strlen(device.c_str()));
+ OMX_CONFIG_BRCMAUDIODESTINATIONTYPE audioDest;
+ OMX_INIT_STRUCTURE(audioDest);
+ strncpy((char *)audioDest.sName, device.c_str(), strlen(device.c_str()));
- omx_err = m_omx_render->SetConfig(OMX_IndexConfigBrcmAudioDestination, &audioDest);
- if (omx_err != OMX_ErrorNone)
- return false;
+ omx_err = m_omx_render_analog.SetConfig(OMX_IndexConfigBrcmAudioDestination, &audioDest);
+ if (omx_err != OMX_ErrorNone)
+ return false;
- OMX_CONFIG_BOOLEANTYPE configBool;
- OMX_INIT_STRUCTURE(configBool);
- configBool.bEnabled = OMX_FALSE;
+ OMX_CONFIG_BOOLEANTYPE configBool;
+ OMX_INIT_STRUCTURE(configBool);
+ configBool.bEnabled = OMX_FALSE;
- omx_err = m_omx_render->SetConfig(OMX_IndexConfigBrcmClockReferenceSource, &configBool);
- if (omx_err != OMX_ErrorNone)
- return false;
+ omx_err = m_omx_render_analog.SetConfig(OMX_IndexConfigBrcmClockReferenceSource, &configBool);
+ if (omx_err != OMX_ErrorNone)
+ return false;
+ }
+
+ if(g_guiSettings.GetInt("audiooutput.mode") == AUDIO_BOTH)
+ {
+ componentName = "OMX.broadcom.audio_splitter";
+ if(!m_omx_splitter.Initialize((const std::string)componentName, OMX_IndexParamAudioInit))
+ return false;
+ }
componentName = "OMX.broadcom.audio_decode";
if(!m_omx_decoder.Initialize((const std::string)componentName, OMX_IndexParamAudioInit))
@@ -411,13 +440,30 @@ bool COMXAudio::Initialize(AEAudioFormat format, std::string& device, OMXClock *
}
}
- m_omx_tunnel_clock.Initialize(m_omx_clock, m_omx_clock->GetInputPort(), m_omx_render, m_omx_render->GetInputPort()+1);
+ if( m_omx_render_analog.IsInitialized())
+ {
+ m_omx_tunnel_clock_analog.Initialize(m_omx_clock, m_omx_clock->GetInputPort(),
+ &m_omx_render_analog, m_omx_render_analog.GetInputPort()+1);
- omx_err = m_omx_tunnel_clock.Establish(false);
- if(omx_err != OMX_ErrorNone)
+ omx_err = m_omx_tunnel_clock_analog.Establish(false, true);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::Initialize m_omx_tunnel_clock_analog.Establish\n");
+ return false;
+ }
+ }
+
+ if( m_omx_render_HDMI.IsInitialized())
{
- CLog::Log(LOGERROR, "COMXAudio::Initialize m_omx_tunnel_clock.Establish\n");
- return false;
+ m_omx_tunnel_clock_HDMI.Initialize(m_omx_clock, m_omx_clock->GetInputPort()+ ( m_omx_render_analog.IsInitialized() ? 2 : 0),
+ &m_omx_render_HDMI, m_omx_render_HDMI.GetInputPort()+1);
+
+ omx_err = m_omx_tunnel_clock_HDMI.Establish(false, true);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::Initialize m_omx_tunnel_clock_HDMI.Establish\n");
+ return false;
+ }
}
omx_err = m_omx_decoder.AllocInputBuffers();
@@ -443,12 +489,56 @@ bool COMXAudio::Initialize(AEAudioFormat format, std::string& device, OMXClock *
return false;
}
- m_omx_tunnel_mixer.Initialize(&m_omx_mixer, m_omx_mixer.GetOutputPort(), m_omx_render, m_omx_render->GetInputPort());
- omx_err = m_omx_tunnel_mixer.Establish(false);
- if(omx_err != OMX_ErrorNone)
+ if(g_guiSettings.GetInt("audiooutput.mode") == AUDIO_ANALOG)
{
- CLog::Log(LOGERROR, "COMXAudio::Initialize - Error m_omx_tunnel_decoder.Establish 0x%08x", omx_err);
- return false;
+ m_omx_tunnel_mixer.Initialize(&m_omx_mixer, m_omx_mixer.GetOutputPort(),
+ &m_omx_render_analog, m_omx_render_analog.GetInputPort());
+ omx_err = m_omx_tunnel_mixer.Establish(false);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::Initialize - Error m_omx_tunnel_decoder.Establish 0x%08x", omx_err);
+ return false;
+ }
+ }
+ else if (g_guiSettings.GetInt("audiooutput.mode") == AUDIO_HDMI)
+ {
+ m_omx_tunnel_mixer.Initialize(&m_omx_mixer, m_omx_mixer.GetOutputPort(),
+ &m_omx_render_HDMI, m_omx_render_HDMI.GetInputPort());
+ omx_err = m_omx_tunnel_mixer.Establish(false);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::Initialize - Error m_omx_tunnel_decoder.Establish 0x%08x", omx_err);
+ return false;
+ }
+ }
+ else // AUDIO_BOTH
+ {
+ m_omx_tunnel_mixer.Initialize(&m_omx_mixer, m_omx_mixer.GetOutputPort(),
+ &m_omx_splitter, m_omx_splitter.GetInputPort());
+ omx_err = m_omx_tunnel_mixer.Establish(false);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::Initialize - Error m_omx_tunnel_mixer.Establish 0x%08x", omx_err);
+ return false;
+ }
+
+ m_omx_tunnel_splitter_analog.Initialize(&m_omx_splitter, m_omx_splitter.GetOutputPort(),
+ &m_omx_render_analog, m_omx_render_analog.GetInputPort());
+ omx_err = m_omx_tunnel_splitter_analog.Establish(false);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::Initialize - Error m_omx_tunnel_splitter_analog.Establish 0x%08x", omx_err);
+ return false;
+ }
+
+ m_omx_tunnel_splitter_HDMI.Initialize(&m_omx_splitter, m_omx_splitter.GetOutputPort() + 1,
+ &m_omx_render_HDMI, m_omx_render_HDMI.GetInputPort());
+ omx_err = m_omx_tunnel_splitter_HDMI.Establish(false);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::Initialize - Error m_omx_tunnel_splitter_HDMI.Establish 0x%08x", omx_err);
+ return false;
+ }
}
omx_err = m_omx_mixer.SetStateForComponent(OMX_StateExecuting);
@@ -459,7 +549,9 @@ bool COMXAudio::Initialize(AEAudioFormat format, std::string& device, OMXClock *
}
else
{
- m_omx_tunnel_decoder.Initialize(&m_omx_decoder, m_omx_decoder.GetOutputPort(), m_omx_render, m_omx_render->GetInputPort());
+ // Passthrough work only for HDMI
+ m_omx_tunnel_decoder.Initialize(&m_omx_decoder, m_omx_decoder.GetOutputPort(),
+ &m_omx_render_HDMI, m_omx_render_HDMI.GetInputPort());
omx_err = m_omx_tunnel_decoder.Establish(false);
if(omx_err != OMX_ErrorNone)
{
@@ -474,11 +566,34 @@ bool COMXAudio::Initialize(AEAudioFormat format, std::string& device, OMXClock *
}
}
- omx_err = m_omx_render->SetStateForComponent(OMX_StateExecuting);
- if(omx_err != OMX_ErrorNone)
+ if ( m_omx_splitter.IsInitialized())
{
- CLog::Log(LOGERROR, "COMXAudio::Initialize - Error setting OMX_StateExecuting 0x%08x", omx_err);
- return false;
+ omx_err = m_omx_splitter.SetStateForComponent(OMX_StateExecuting);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::Initialize - Error setting OMX_StateExecuting 0x%08x for m_omx_splitter", omx_err);
+ return false;
+ }
+ }
+
+ if ( m_omx_render_analog.IsInitialized())
+ {
+ omx_err = m_omx_render_analog.SetStateForComponent(OMX_StateExecuting);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::Initialize - Error setting OMX_StateExecuting 0x%08x for m_omx_render_analog", omx_err);
+ return false;
+ }
+ }
+
+ if ( m_omx_render_HDMI.IsInitialized())
+ {
+ omx_err = m_omx_render_HDMI.SetStateForComponent(OMX_StateExecuting);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::Initialize - Error setting OMX_StateExecuting 0x%08x for m_omx_render_HDMI", omx_err);
+ return false;
+ }
}
m_omx_decoder.EnablePort(m_omx_decoder.GetInputPort(), true);
@@ -570,9 +685,12 @@ bool COMXAudio::Deinitialize()
m_omx_tunnel_decoder.Flush();
if(!m_Passthrough)
m_omx_tunnel_mixer.Flush();
- m_omx_tunnel_clock.Flush();
- m_omx_tunnel_clock.Deestablish();
+ m_omx_tunnel_clock_analog.Flush();
+ m_omx_tunnel_clock_HDMI.Flush();
+ m_omx_tunnel_clock_analog.Deestablish();
+ m_omx_tunnel_clock_HDMI.Deestablish();
+
if(!m_Passthrough)
{
// workaround for the strange BCM mixer component
@@ -587,8 +705,16 @@ bool COMXAudio::Deinitialize()
m_omx_decoder.FlushInput();
- if(m_omx_render)
- m_omx_render->Deinitialize(true);
+ m_omx_tunnel_splitter_analog.Flush();
+ m_omx_tunnel_splitter_analog.Deestablish(true);
+ m_omx_tunnel_splitter_HDMI.Flush();
+ m_omx_tunnel_splitter_HDMI.Deestablish(true);
+
+ m_omx_splitter.Deinitialize(true);
+
+ m_omx_render_analog.Deinitialize(true);
+ m_omx_render_HDMI.Deinitialize(true);
+
if(!m_Passthrough)
m_omx_mixer.Deinitialize(true);
m_omx_decoder.Deinitialize(true);
@@ -613,9 +739,6 @@ bool COMXAudio::Deinitialize()
m_first_frame = true;
m_last_pts = DVD_NOPTS_VALUE;
- delete m_omx_render;
- m_omx_render = NULL;
-
return true;
}
@@ -696,7 +819,7 @@ void COMXAudio::Mute(bool bMute)
//***********************************************************************************************
bool COMXAudio::SetCurrentVolume(float fVolume)
{
- CSingleLock lock (m_critSection);
+CSingleLock lock (m_critSection);
if(!m_Initialized || m_Passthrough)
return false;
@@ -754,22 +877,39 @@ bool COMXAudio::SetCurrentVolume(float fVolume)
{
OMX_AUDIO_CONFIG_VOLUMETYPE volume;
OMX_INIT_STRUCTURE(volume);
- volume.nPortIndex = m_omx_render->GetInputPort();
+ OMX_ERRORTYPE omx_err;
volume.bLinear = OMX_TRUE;
float hardwareVolume = fVolume * gain * 100.0f;
volume.sVolume.nValue = (int)(hardwareVolume + 0.5f);
- OMX_ERRORTYPE omx_err =
- m_omx_render->SetConfig(OMX_IndexConfigAudioVolume, &volume);
- if(omx_err != OMX_ErrorNone)
+ if(m_omx_render_analog.IsInitialized())
{
- CLog::Log(LOGERROR, "%s::%s - error setting OMX_IndexConfigAudioVolume, error 0x%08x\n",
+ volume.nPortIndex = m_omx_render_analog.GetInputPort();
+ omx_err = m_omx_render_analog.SetConfig(OMX_IndexConfigAudioVolume, &volume);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s - error setting OMX_IndexConfigAudioVolume, error 0x%08x for m_omx_render_analog\n",
CLASSNAME, __func__, omx_err);
- return false;
+ return false;
+ }
+ }
+ if(m_omx_render_HDMI.IsInitialized())
+ {
+ volume.nPortIndex = m_omx_render_HDMI.GetInputPort();
+ omx_err = m_omx_render_HDMI.SetConfig(OMX_IndexConfigAudioVolume, &volume);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s - error setting OMX_IndexConfigAudioVolume, error 0x%08x for m_omx_render_HDMI\n",
+ CLASSNAME, __func__, omx_err);
+ return false;
+ }
}
+
}
return true;
+
+ return true;
}
@@ -927,7 +1067,18 @@ unsigned int COMXAudio::AddPackets(const void* data, unsigned int len, double dt
m_first_frame = false;
//m_omx_render.WaitForEvent(OMX_EventPortSettingsChanged);
- m_omx_render->DisablePort(m_omx_render->GetInputPort(), false);
+ if(m_omx_render_analog.IsInitialized())
+ m_omx_render_analog.DisablePort(m_omx_render_analog.GetInputPort(), false);
+ if(m_omx_render_HDMI.IsInitialized())
+ m_omx_render_HDMI.DisablePort(m_omx_render_HDMI.GetInputPort(), false);
+
+ if(m_omx_splitter.IsInitialized())
+ {
+ m_omx_splitter.DisablePort(m_omx_splitter.GetOutputPort(), false);
+ m_omx_splitter.DisablePort(m_omx_splitter.GetOutputPort()+1, false);
+ m_omx_splitter.DisablePort(m_omx_splitter.GetInputPort(), false);
+ }
+
if(!m_Passthrough)
{
m_omx_mixer.DisablePort(m_omx_mixer.GetOutputPort(), false);
@@ -965,6 +1116,11 @@ unsigned int COMXAudio::AddPackets(const void* data, unsigned int len, double dt
}
m_pcm_output.nSamplingRate = m_format.m_sampleRate;
+ // "Currently this component only supports raw PCM on all audio ports."
+ if(m_omx_splitter.IsInitialized())
+ {
+ m_pcm_output.ePCMMode = OMX_AUDIO_PCMModeLinear;
+ }
/* setup mixer output */
m_pcm_output.nPortIndex = m_omx_mixer.GetOutputPort();
@@ -981,16 +1137,64 @@ unsigned int COMXAudio::AddPackets(const void* data, unsigned int len, double dt
m_pcm_output.nSamplingRate = m_format.m_sampleRate;
- m_pcm_output.nPortIndex = m_omx_render->GetInputPort();
- omx_err = m_omx_render->SetParameter(OMX_IndexParamAudioPcm, &m_pcm_output);
- if(omx_err != OMX_ErrorNone)
+ if(m_omx_splitter.IsInitialized())
{
- CLog::Log(LOGERROR, "COMXAudio::AddPackets error SetParameter 1 render omx_err(0x%08x)\n", omx_err);
+ m_pcm_output.nPortIndex = m_omx_splitter.GetInputPort();
+ omx_err = m_omx_splitter.SetParameter(OMX_IndexParamAudioPcm, &m_pcm_output);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::AddPackets error SetParameter 1 omx_err(0x%08x) for m_omx_splitter\n", omx_err);
+ }
+
+
+ // Splitter will copy input params to output when input port is enabled.
+ omx_err = m_omx_splitter.SetStateForComponent(OMX_StateIdle);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::AddPackets - Error setting OMX_StateIdle 0x%08x for m_omx_splitter", omx_err);
+ return false;
+ }
+
+ m_omx_splitter.EnablePort(m_omx_splitter.GetInputPort(), false);
+ m_omx_splitter.DisablePort(m_omx_splitter.GetInputPort(), false);
+
+ omx_err = m_omx_splitter.SetStateForComponent(OMX_StateExecuting);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::AddPackets - Error setting OMX_StateExecuting 0x%08x for m_omx_splitter", omx_err);
+ return false;
+ }
+
+ m_pcm_output.nPortIndex = m_omx_splitter.GetOutputPort();
+ omx_err = m_omx_splitter.GetParameter(OMX_IndexParamAudioPcm, &m_pcm_output);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::AddPackets error GetParameter 3 omx_err(0x%08x) for m_omx_splitter\n", omx_err);
+ }
+
+ m_pcm_output.nSamplingRate = m_format.m_sampleRate;
}
- omx_err = m_omx_render->GetParameter(OMX_IndexParamAudioPcm, &m_pcm_output);
- if(omx_err != OMX_ErrorNone)
+
+ if(m_omx_render_analog.IsInitialized())
+ {
+ m_pcm_output.nPortIndex = m_omx_render_analog.GetInputPort();
+ omx_err = m_omx_render_analog.SetParameter(OMX_IndexParamAudioPcm, &m_pcm_output);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::AddPackets error SetParameter 1 render omx_err(0x%08x) for m_omx_render_analog\n", omx_err);
+ }
+
+ }
+
+ if(m_omx_render_HDMI.IsInitialized())
{
- CLog::Log(LOGERROR, "COMXAudio::AddPackets error GetParameter 2 render omx_err(0x%08x)\n", omx_err);
+ m_pcm_output.nPortIndex = m_omx_render_HDMI.GetInputPort();
+ omx_err = m_omx_render_HDMI.SetParameter(OMX_IndexParamAudioPcm, &m_pcm_output);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXAudio::AddPackets error SetParameter 1 render omx_err(0x%08x) for m_omx_render_HDMI\n", omx_err);
+ }
+
}
PrintPCM(&m_pcm_input, std::string("input"));
@@ -1000,9 +1204,9 @@ unsigned int COMXAudio::AddPackets(const void* data, unsigned int len, double dt
{
OMX_AUDIO_PARAM_PORTFORMATTYPE formatType;
OMX_INIT_STRUCTURE(formatType);
- formatType.nPortIndex = m_omx_render->GetInputPort();
+ formatType.nPortIndex = m_omx_render_HDMI.GetInputPort();
- omx_err = m_omx_render->GetParameter(OMX_IndexParamAudioPortFormat, &formatType);
+ omx_err = m_omx_render_HDMI.GetParameter(OMX_IndexParamAudioPortFormat, &formatType);
if(omx_err != OMX_ErrorNone)
{
CLog::Log(LOGERROR, "COMXAudio::AddPackets error OMX_IndexParamAudioPortFormat omx_err(0x%08x)\n", omx_err);
@@ -1011,7 +1215,7 @@ unsigned int COMXAudio::AddPackets(const void* data, unsigned int len, double dt
formatType.eEncoding = m_eEncoding;
- omx_err = m_omx_render->SetParameter(OMX_IndexParamAudioPortFormat, &formatType);
+ omx_err = m_omx_render_HDMI.SetParameter(OMX_IndexParamAudioPortFormat, &formatType);
if(omx_err != OMX_ErrorNone)
{
CLog::Log(LOGERROR, "COMXAudio::AddPackets error OMX_IndexParamAudioPortFormat omx_err(0x%08x)\n", omx_err);
@@ -1023,7 +1227,7 @@ unsigned int COMXAudio::AddPackets(const void* data, unsigned int len, double dt
OMX_AUDIO_PARAM_DDPTYPE m_ddParam;
OMX_INIT_STRUCTURE(m_ddParam);
- m_ddParam.nPortIndex = m_omx_render->GetInputPort();
+ m_ddParam.nPortIndex = m_omx_render_HDMI.GetInputPort();
m_ddParam.nChannels = m_format.m_channelLayout.Count(); //(m_InputChannels == 6) ? 8 : m_InputChannels;
m_ddParam.nSampleRate = m_SampleRate;
@@ -1038,13 +1242,13 @@ unsigned int COMXAudio::AddPackets(const void* data, unsigned int len, double dt
m_ddParam.eChannelMapping[i] = OMXChannels[i];
}
- m_omx_render->SetParameter(OMX_IndexParamAudioDdp, &m_ddParam);
- m_omx_render->GetParameter(OMX_IndexParamAudioDdp, &m_ddParam);
+ m_omx_render_HDMI.SetParameter(OMX_IndexParamAudioDdp, &m_ddParam);
+ m_omx_render_HDMI.GetParameter(OMX_IndexParamAudioDdp, &m_ddParam);
PrintDDP(&m_ddParam);
}
else if(m_eEncoding == OMX_AUDIO_CodingDTS)
{
- m_dtsParam.nPortIndex = m_omx_render->GetInputPort();
+ m_dtsParam.nPortIndex = m_omx_render_HDMI.GetInputPort();
m_dtsParam.nChannels = m_format.m_channelLayout.Count(); //(m_InputChannels == 6) ? 8 : m_InputChannels;
m_dtsParam.nBitRate = 0;
@@ -1057,13 +1261,24 @@ unsigned int COMXAudio::AddPackets(const void* data, unsigned int len, double dt
m_dtsParam.eChannelMapping[i] = OMXChannels[i];
}
- m_omx_render->SetParameter(OMX_IndexParamAudioDts, &m_dtsParam);
- m_omx_render->GetParameter(OMX_IndexParamAudioDts, &m_dtsParam);
+ m_omx_render_HDMI.SetParameter(OMX_IndexParamAudioDts, &m_dtsParam);
+ m_omx_render_HDMI.GetParameter(OMX_IndexParamAudioDts, &m_dtsParam);
PrintDTS(&m_dtsParam);
}
}
- m_omx_render->EnablePort(m_omx_render->GetInputPort(), false);
+ if(m_omx_render_analog.IsInitialized())
+ m_omx_render_analog.EnablePort(m_omx_render_analog.GetInputPort(), false);
+ if(m_omx_render_HDMI.IsInitialized())
+ m_omx_render_HDMI.EnablePort(m_omx_render_HDMI.GetInputPort(), false);
+
+ if(m_omx_splitter.IsInitialized())
+ {
+ m_omx_splitter.EnablePort(m_omx_splitter.GetOutputPort(), false);
+ m_omx_splitter.EnablePort(m_omx_splitter.GetOutputPort()+1, false);
+ m_omx_splitter.EnablePort(m_omx_splitter.GetInputPort(), false);
+ }
+
if(!m_Passthrough)
{
m_omx_mixer.EnablePort(m_omx_mixer.GetOutputPort(), false);
@@ -1139,21 +1354,49 @@ unsigned int COMXAudio::GetAudioRenderingLatency()
if(!m_Initialized)
return 0;
- OMX_PARAM_U32TYPE param;
- OMX_INIT_STRUCTURE(param);
- param.nPortIndex = m_omx_render->GetInputPort();
+ unsigned int latAnalog = 0;
+ unsigned int latHDMI = 0;
- OMX_ERRORTYPE omx_err =
- m_omx_render->GetConfig(OMX_IndexConfigAudioRenderingLatency, &param);
+ // Prefer HDMI latency if both are used
+ if(m_omx_render_analog.IsInitialized() && !m_omx_render_HDMI.IsInitialized())
+ {
+ OMX_PARAM_U32TYPE param;
+ OMX_INIT_STRUCTURE(param);
+ param.nPortIndex = m_omx_render_analog.GetInputPort();
- if(omx_err != OMX_ErrorNone)
+ OMX_ERRORTYPE omx_err =
+ m_omx_render_analog.GetConfig(OMX_IndexConfigAudioRenderingLatency, &param);
+
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s - error getting OMX_IndexConfigAudioRenderingLatency error 0x%08x\n for m_omx_render_analog",
+ CLASSNAME, __func__, omx_err);
+ return 0;
+ }
+
+ latAnalog = param.nU32;
+ }
+
+ if(m_omx_render_HDMI.IsInitialized())
{
- CLog::Log(LOGERROR, "%s::%s - error getting OMX_IndexConfigAudioRenderingLatency error 0x%08x\n",
- CLASSNAME, __func__, omx_err);
- return 0;
+ OMX_PARAM_U32TYPE param;
+ OMX_INIT_STRUCTURE(param);
+ param.nPortIndex = m_omx_render_HDMI.GetInputPort();
+
+ OMX_ERRORTYPE omx_err =
+ m_omx_render_HDMI.GetConfig(OMX_IndexConfigAudioRenderingLatency, &param);
+
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s - error getting OMX_IndexConfigAudioRenderingLatency error 0x%08x\n for m_omx_render_HDMI",
+ CLASSNAME, __func__, omx_err);
+ return 0;
+ }
+
+ latHDMI = param.nU32;
}
- return param.nU32;
+ return std::max(latAnalog, latHDMI);
}
void COMXAudio::WaitCompletion()
@@ -1188,7 +1431,8 @@ void COMXAudio::WaitCompletion()
unsigned int nTimeOut = AUDIO_BUFFER_SECONDS * 1000;
while(nTimeOut)
{
- if(m_omx_render->IsEOS())
+ if((m_omx_render_analog.IsInitialized() ? m_omx_render_analog.IsEOS() : true) &&
+ (m_omx_render_HDMI.IsInitialized() ? m_omx_render_HDMI.IsEOS() : true))
{
CLog::Log(LOGDEBUG, "%s::%s - got eos\n", CLASSNAME, __func__);
break;
@@ -1218,7 +1462,8 @@ void COMXAudio::WaitCompletion()
nTimeOut -= 50;
}
- m_omx_render->ResetEos();
+ m_omx_render_analog.ResetEos();
+ m_omx_render_HDMI.ResetEos();
return;
}
diff --git a/xbmc/cores/omxplayer/OMXAudio.h b/xbmc/cores/omxplayer/OMXAudio.h
index d812e0a..81aeb7e 100644
--- a/xbmc/cores/omxplayer/OMXAudio.h
+++ b/xbmc/cores/omxplayer/OMXAudio.h
@@ -60,7 +60,7 @@ class COMXAudio
float GetCacheTime();
float GetCacheTotal();
COMXAudio();
- bool Initialize(AEAudioFormat format, std::string& device, OMXClock *clock, CDVDStreamInfo &hints, bool bUsePassthrough, bool bUseHWDecode);
+ bool Initialize(AEAudioFormat format, OMXClock *clock, CDVDStreamInfo &hints, bool bUsePassthrough, bool bUseHWDecode);
~COMXAudio();
unsigned int AddPackets(const void* data, unsigned int len);
@@ -132,12 +132,18 @@ class COMXAudio
WAVEFORMATEXTENSIBLE m_wave_header;
AEAudioFormat m_format;
protected:
- COMXCoreComponent *m_omx_render;
+ void DumpStates();
+ COMXCoreComponent m_omx_render_analog;
+ COMXCoreComponent m_omx_render_HDMI;
+ COMXCoreComponent m_omx_splitter;
COMXCoreComponent m_omx_mixer;
COMXCoreComponent m_omx_decoder;
- COMXCoreTunel m_omx_tunnel_clock;
+ COMXCoreTunel m_omx_tunnel_clock_analog;
+ COMXCoreTunel m_omx_tunnel_clock_HDMI;
COMXCoreTunel m_omx_tunnel_mixer;
COMXCoreTunel m_omx_tunnel_decoder;
+ COMXCoreTunel m_omx_tunnel_splitter_analog;
+ COMXCoreTunel m_omx_tunnel_splitter_HDMI;
DllAvUtil m_dllAvUtil;
OMX_AUDIO_CHANNELTYPE m_input_channels[OMX_AUDIO_MAXCHANNELS];
diff --git a/xbmc/cores/omxplayer/OMXPlayerAudio.cpp b/xbmc/cores/omxplayer/OMXPlayerAudio.cpp
index 58c3a4f..f3276d2 100644
--- a/xbmc/cores/omxplayer/OMXPlayerAudio.cpp
+++ b/xbmc/cores/omxplayer/OMXPlayerAudio.cpp
@@ -731,17 +731,10 @@ bool OMXPlayerAudio::OpenDecoder()
/* GetDataFormat is setting up evrything */
m_format.m_dataFormat = GetDataFormat(m_hints);
- std::string device = "";
-
- if(g_guiSettings.GetInt("audiooutput.mode") == AUDIO_HDMI)
- device = "hdmi";
- else
- device = "local";
-
m_av_clock->Lock();
m_av_clock->OMXStop(false);
- bool bAudioRenderOpen = m_omxAudio.Initialize(m_format, device, m_av_clock, m_hints, m_passthrough, m_hw_decode);
+ bool bAudioRenderOpen = m_omxAudio.Initialize(m_format, m_av_clock, m_hints, m_passthrough, m_hw_decode);
m_codec_name = "";
m_bad_state = !bAudioRenderOpen;
diff --git a/xbmc/settings/GUISettings.cpp b/xbmc/settings/GUISettings.cpp
index e92a82d..e798683 100644
--- a/xbmc/settings/GUISettings.cpp
+++ b/xbmc/settings/GUISettings.cpp
@@ -457,6 +457,8 @@ void CGUISettings::Initialize()
audiomode.insert(make_pair(338,AUDIO_ANALOG));
#if !defined(TARGET_RASPBERRY_PI)
audiomode.insert(make_pair(339,AUDIO_IEC958));
+#else
+ audiomode.insert(make_pair(593,AUDIO_BOTH));
#endif
audiomode.insert(make_pair(420,AUDIO_HDMI ));
#if defined(TARGET_RASPBERRY_PI)
diff --git a/xbmc/settings/GUISettings.h b/xbmc/settings/GUISettings.h
index b48ba35..500ec36 100644
--- a/xbmc/settings/GUISettings.h
+++ b/xbmc/settings/GUISettings.h
@@ -84,6 +84,9 @@
#define AUDIO_ANALOG 0
#define AUDIO_IEC958 1
#define AUDIO_HDMI 2
+#ifdef TARGET_RASPBERRY_PI
+#define AUDIO_BOTH 3
+#endif
#define AUDIO_IS_BITSTREAM(x) ((x) == AUDIO_IEC958 || (x) == AUDIO_HDMI)
#define VIDEO_NORMAL 0
--
1.8.1.6
From 85bb82a3f78a63385767e8e1a7490860077b1b32 Mon Sep 17 00:00:00 2001
From: stupid-boy <amushatov@gmail.com>
Date: Thu, 7 Mar 2013 20:46:21 +0200
Subject: [PATCH 2/2] Seek fixed
---
xbmc/cores/omxplayer/OMXAudio.cpp | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/xbmc/cores/omxplayer/OMXAudio.cpp b/xbmc/cores/omxplayer/OMXAudio.cpp
index 1470685..6b0e71a 100644
--- a/xbmc/cores/omxplayer/OMXAudio.cpp
+++ b/xbmc/cores/omxplayer/OMXAudio.cpp
@@ -749,8 +749,16 @@ void COMXAudio::Flush()
m_omx_decoder.FlushInput();
m_omx_tunnel_decoder.Flush();
- if(!m_Passthrough)
+ if ( m_omx_mixer.IsInitialized() )
+ m_omx_mixer.FlushAll();
+ if( m_omx_tunnel_mixer.IsInitialized() )
m_omx_tunnel_mixer.Flush();
+ if ( m_omx_splitter.IsInitialized() )
+ m_omx_splitter.FlushAll();
+ if ( m_omx_tunnel_splitter_analog.IsInitialized() )
+ m_omx_tunnel_splitter_analog.Flush();
+ if ( m_omx_tunnel_splitter_HDMI.IsInitialized() )
+ m_omx_tunnel_splitter_HDMI.Flush();
m_last_pts = DVD_NOPTS_VALUE;
m_LostSync = true;
--
1.8.1.6

View File

@ -1,169 +0,0 @@
diff -Naur xbmc-frodo-0ff0d2e/configure.in xbmc-frodo-0ff0d2e.patch/configure.in
--- xbmc-frodo-0ff0d2e/configure.in 2012-10-11 15:45:44.000000000 +0200
+++ xbmc-frodo-0ff0d2e.patch/configure.in 2012-10-11 16:49:08.872850880 +0200
@@ -452,6 +452,12 @@
[use_texturepacker=$enableval],
[use_texturepacker=auto])
+AC_ARG_WITH([texturepacker-root],
+ [AS_HELP_STRING([--with-texturepacker-root],
+ [root dir to search for librarys and includes if building native TexturePacker (default is \$prefix)])],
+ [use_texturepacker_root=$withval],
+ [use_texturepacker_root=$prefix])
+
AC_ARG_WITH([lirc-device],
[AS_HELP_STRING([--with-lirc-device=file],
[specify the default LIRC device (default is /dev/lircd)])],
@@ -2000,13 +2006,13 @@
USE_TEXTUREPACKER_NATIVE=0
if test "x$use_texturepacker" != "xno"; then
- final_message="$final_message\n TexturePacker:Yes"
USE_TEXTUREPACKER=1
- if test "x$use_texturepacker_native" = "xyes"; then
+ if test "x$cross_compiling" = "xyes"; then
USE_TEXTUREPACKER_NATIVE=1
- if [[ ! -d "$USE_TEXTUREPACKER_NATIVE_ROOT" ]]; then
- USE_TEXTUREPACKER_NATIVE_ROOT=
- fi
+ USE_TEXTUREPACKER_NATIVE_ROOT="$use_texturepacker_root"
+ final_message="$final_message\n TexturePacker:Native ($USE_TEXTUREPACKER_NATIVE_ROOT)"
+ else
+ final_message="$final_message\n TexturePacker:Yes"
fi
else
final_message="$final_message\n TexturePacker:No"
diff -Naur xbmc-frodo-0ff0d2e/lib/libsquish/Makefile.in xbmc-frodo-0ff0d2e.patch/lib/libsquish/Makefile.in
--- xbmc-frodo-0ff0d2e/lib/libsquish/Makefile.in 2012-10-11 15:47:26.000000000 +0200
+++ xbmc-frodo-0ff0d2e.patch/lib/libsquish/Makefile.in 2012-10-11 16:49:08.873850900 +0200
@@ -11,26 +11,25 @@
singlecolourfit.cpp \
squish.cpp
-CXXFLAGS+=-I.
-
-LIB=libsquish.a
-
-ifeq (@USE_TEXTUREPACKER_NATIVE@,1)
-NATIVE_LIB=libsquish-native.so
-CLEAN_FILES+=$(NATIVE_LIB)
+LIB = libsquish.a
+NATIVE_LIB = libsquish-native.so
+CLEAN_FILES += $(NATIVE_LIB)
+
+HOST_CXX ?= g++
+CXXFLAGS += -I.
+HOST_CXXFLAGS += -I.
ifeq ($(findstring Darwin,$(shell uname -s)),Darwin)
-NATIVE_ARCH=@DARWIN_NATIVE_ARCH@
+ HOST_CXXFLAGS += @DARWIN_NATIVE_ARCH@
endif
-all: $(LIB) $(NATIVE_LIB)
+$(LIB): $(SRCS)
# TexturePacker links to libsquish and needs to run on build system, so make a native flavor.
$(NATIVE_LIB): $(SRCS)
ifeq ($(findstring Darwin,$(shell uname -s)),Darwin)
- g++ $(NATIVE_ARCH) -I. $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@
+ $(HOST_CXX) $(HOST_CXXFLAGS) $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@
else
- g++ -I. $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@
-endif
+ $(HOST_CXX) $(HOST_CXXFLAGS) $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@
endif
include ../../Makefile.include
diff -Naur xbmc-frodo-0ff0d2e/tools/TexturePacker/Makefile.in xbmc-frodo-0ff0d2e.patch/tools/TexturePacker/Makefile.in
--- xbmc-frodo-0ff0d2e/tools/TexturePacker/Makefile.in 2012-10-11 15:47:05.000000000 +0200
+++ xbmc-frodo-0ff0d2e.patch/tools/TexturePacker/Makefile.in 2012-10-11 16:49:08.874850920 +0200
@@ -1,56 +1,54 @@
-DEFINES += -D_LINUX -DUSE_LZO_PACKING
+DEFINES += -D_LINUX -DUSE_LZO_PACKING
ifneq ($(or $(findstring powerpc,@ARCH@),$(findstring ppc, @ARCH@)),)
-DEFINES += -DHOST_BIGENDIAN
+DEFINES += -DHOST_BIGENDIAN
endif
-CXXFLAGS+= \
+SRCS = \
+ md5.cpp \
+ SDL_anigif.cpp \
+ XBTFWriter.cpp \
+ XBMCTex.cpp \
+ @abs_top_srcdir@/xbmc/guilib/XBTF.cpp
+
+TARGET = TexturePacker
+CLEAN_FILES = $(TARGET)
+
+all: $(TARGET)
+
+HOST_CXX ?= g++
+HOST_ROOT_PATH = @USE_TEXTUREPACKER_NATIVE_ROOT@
+
+LIBS += -lSDL_image -lSDL -llzo2
+LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish
+HOST_LIBS += -L$(HOST_ROOT_PATH)/lib -lSDL_image -lSDL -llzo2
+HOST_LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish-native
+
+CXXFLAGS += \
-I. \
-I@abs_top_srcdir@/lib \
-I@abs_top_srcdir@/xbmc \
-I@abs_top_srcdir@/xbmc/linux
-RPATH=-Wl,-rpath=$(NATIVE_ROOT_PATH)/lib
+HOST_CXXFLAGS += \
+ -I. \
+ -I@abs_top_srcdir@/lib \
+ -I@abs_top_srcdir@/xbmc \
+ -I@abs_top_srcdir@/xbmc/linux \
+ -I$(HOST_ROOT_PATH)/include
+
+RPATH=-Wl,-rpath=$(HOST_ROOT_PATH)/lib
-ifeq (@USE_TEXTUREPACKER_NATIVE@,1)
-NATIVE_ROOT_PATH=@USE_TEXTUREPACKER_NATIVE_ROOT@
-ifdef NATIVE_ROOT_PATH
ifeq ($(findstring Darwin,$(shell uname -s)),Darwin)
DEFINES += -DTARGET_DARWIN
NATIVE_ARCH=@DARWIN_NATIVE_ARCH@
RPATH=
endif
-NATIVE_CXXFLAGS+= -I. \
- -I$(NATIVE_ROOT_PATH)/include \
- -I@abs_top_srcdir@/lib \
- -I@abs_top_srcdir@/xbmc \
- -I@abs_top_srcdir@/xbmc/linux
-NATIVE_LIBS += -L$(NATIVE_ROOT_PATH)/lib
-endif
-NATIVE_LIBS += -lSDL_image -lSDL -llzo2
-NATIVE_LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish-native
-else
-LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish
-endif
-
-LIBS += -lSDL_image -lSDL -llzo2
-
-SRCS = \
- md5.cpp \
- SDL_anigif.cpp \
- XBTFWriter.cpp \
- XBMCTex.cpp \
- @abs_top_srcdir@/xbmc/guilib/XBTF.cpp
-
-
-TARGET = TexturePacker
-CLEAN_FILES=$(TARGET)
-
-all: $(TARGET)
ifeq (@USE_TEXTUREPACKER_NATIVE@,1)
# TexturePacker run native on build system, build it with native tools
$(TARGET): $(SRCS) @abs_top_srcdir@/xbmc/guilib/XBTF.h
- g++ $(DEFINES) $(NATIVE_ARCH) $(NATIVE_CXXFLAGS) $(SRCS) $(NATIVE_LIBS) $(RPATH) -o $(TARGET)
+ make -C @abs_top_srcdir@/lib/libsquish libsquish-native.so
+ $(HOST_CXX) $(DEFINES) $(NATIVE_ARCH) $(HOST_CXXFLAGS) $(SRCS) $(HOST_LIBS) $(RPATH) -o $(TARGET)
clean:
rm -f $(TARGET)
else

View File

@ -1,34 +0,0 @@
commit 7205cbc5abda0a8571170a132bd30fc54a4aa6b6
Author: fritsch <peter.fruehberger@gmail.com>
Date: Tue Jun 18 18:59:05 2013 +0200
VPP: SkipDeint was not only meant for interlaced content (fixes Audio out of sync after pause, ffwd)
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp
index fbe3fd5..0f138aa 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp
@@ -771,8 +771,8 @@ void CVPPThread::Process()
if(currentFrame.valid)
{
bool isInterlaced = currentFrame.DVDPic.iFlags & DVP_FLAG_INTERLACED;
- if(currentFrame.DVDPic.iFlags & DVP_FLAG_DROPDEINT)
- isInterlaced = false;
+ //if(currentFrame.DVDPic.iFlags & DVP_FLAG_DROPDEINT)
+ // isInterlaced = false;
EDEINTERLACEMODE mode = g_settings.m_currentVideoSettings.m_DeinterlaceMode;
EINTERLACEMETHOD method = g_settings.m_currentVideoSettings.m_InterlaceMethod;
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h
index 6ccef59..b7b82c9 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h
@@ -181,7 +181,7 @@ public:
virtual void Close();
virtual const std::string Name() { return "vaapi"; }
virtual CCriticalSection* Section() { if(m_display) return m_display.get(); else return NULL; }
- virtual bool CanSkipDeint() { return true; }
+ virtual bool CanSkipDeint() { return false; }
int GetBuffer(AVCodecContext *avctx, AVFrame *pic);
void RelBuffer(AVCodecContext *avctx, AVFrame *pic);

View File

@ -1,95 +0,0 @@
commit 6f1d11cf3e44a37b5d90689bda9fc7df11ae8a52
Author: fritsch <peter.fruehberger@gmail.com>
Date: Wed Jun 19 20:30:44 2013 +0200
VPP: Implement proper deinterlace skipping
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp
index 0f138aa..fcc9ec9 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp
@@ -569,10 +569,15 @@ int CDecoder::Check(AVCodecContext* avctx)
return 0;
}
+bool CDecoder::CanSkipDeint()
+{
+ return m_vppth->CanSkipDeint();
+}
CVPPThread::CVPPThread(CDisplayPtr& display, int width, int height)
:CThread("VAAPI VPP Thread")
,m_stop(false)
+ ,m_skipDeinterlace(false)
{
m_vpp = new CVPP(display, width, height);
}
@@ -720,6 +725,11 @@ int CVPPThread::GetOutputQueueSize()
return m_output_queue.size();
}
+bool CVPPThread::CanSkipDeint()
+{
+ return m_skipDeinterlace;
+}
+
void CVPPThread::Flush()
{
CSingleLock lock(m_work_lock);
@@ -771,22 +781,22 @@ void CVPPThread::Process()
if(currentFrame.valid)
{
bool isInterlaced = currentFrame.DVDPic.iFlags & DVP_FLAG_INTERLACED;
- //if(currentFrame.DVDPic.iFlags & DVP_FLAG_DROPDEINT)
- // isInterlaced = false;
EDEINTERLACEMODE mode = g_settings.m_currentVideoSettings.m_DeinterlaceMode;
EINTERLACEMETHOD method = g_settings.m_currentVideoSettings.m_InterlaceMethod;
- if (m_vpp->DeintBobReady() && (method == VS_INTERLACEMETHOD_VAAPI_AUTO || method == VS_INTERLACEMETHOD_AUTO)
- && (mode == VS_DEINTERLACEMODE_FORCE || (mode == VS_DEINTERLACEMODE_AUTO && isInterlaced)))
+ if (m_vpp->DeintBobReady() && !(currentFrame.DVDPic.iFlags & DVP_FLAG_DROPDEINT)
+ && (method == VS_INTERLACEMETHOD_VAAPI_AUTO || method == VS_INTERLACEMETHOD_AUTO)
+ && (mode == VS_DEINTERLACEMODE_FORCE || (mode == VS_DEINTERLACEMODE_AUTO && isInterlaced)))
{
bool topField = currentFrame.DVDPic.iFlags & DVP_FLAG_TOP_FIELD_FIRST;
-
+ m_skipDeinterlace = true;
DoDeinterlacing(currentFrame, topField);
DoDeinterlacing(currentFrame, !topField);
}
else
{
+ m_skipDeinterlace = false;
CVPPRenderPicture res;
res.valid = true;
res.DVDPic = currentFrame.DVDPic;
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h
index b7b82c9..8361ff0 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h
@@ -134,6 +134,7 @@ public:
void InsertNewFrame(CVPPDecodedPicture &new_frame);
void WaitForOutput(unsigned long msec = 0);
+ virtual bool CanSkipDeint();
CVPPRenderPicture GetOutputPicture();
int GetInputQueueSize();
@@ -153,6 +154,7 @@ protected:
CVPP *m_vpp;
bool m_stop;
+ bool m_skipDeinterlace;
CCriticalSection m_work_lock;
@@ -181,7 +183,7 @@ public:
virtual void Close();
virtual const std::string Name() { return "vaapi"; }
virtual CCriticalSection* Section() { if(m_display) return m_display.get(); else return NULL; }
- virtual bool CanSkipDeint() { return false; }
+ virtual bool CanSkipDeint();
int GetBuffer(AVCodecContext *avctx, AVFrame *pic);
void RelBuffer(AVCodecContext *avctx, AVFrame *pic);

View File

@ -1,13 +0,0 @@
diff -Naur xbmc-12.2-83bda98/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.cpp xbmc-12.2-83bda98.patch/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.cpp
--- xbmc-12.2-83bda98/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.cpp 2013-08-25 21:45:30.000000000 +0200
+++ xbmc-12.2-83bda98.patch/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.cpp 2013-08-26 01:26:41.950633846 +0200
@@ -277,7 +277,9 @@
case 0: g_guiSettings.SetInt("audiooutput.mode", AUDIO_ANALOG ); break;
case 1: g_guiSettings.SetInt("audiooutput.mode", AUDIO_IEC958 ); bitstream = true; break;
case 2: g_guiSettings.SetInt("audiooutput.mode", AUDIO_HDMI ); bitstream = true; break;
+#ifdef TARGET_RASPBERRY_PI
case 3: g_guiSettings.SetInt("audiooutput.mode", AUDIO_BOTH ); break;
+#endif
}
EnableSettings(AUDIO_SETTINGS_OUTPUT_TO_ALL_SPEAKERS, bitstream);